diff --git a/static/tlfb-v3-bundle.js b/static/tlfb-v3-bundle.js index cc32f83..30cfa42 100644 --- a/static/tlfb-v3-bundle.js +++ b/static/tlfb-v3-bundle.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e={748:(e,t,n)=>{n.r(t),n.d(t,{Children:()=>G,Component:()=>a.Component,Fragment:()=>a.Fragment,PureComponent:()=>L,StrictMode:()=>Re,Suspense:()=>X,SuspenseList:()=>K,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:()=>ye,cloneElement:()=>Se,createContext:()=>a.createContext,createElement:()=>a.createElement,createFactory:()=>be,createPortal:()=>re,createRef:()=>a.createRef,default:()=>Ie,findDOMNode:()=>De,flushSync:()=>we,forwardRef:()=>V,hydrate:()=>ce,isValidElement:()=>_e,lazy:()=>J,memo:()=>U,render:()=>le,startTransition:()=>Te,unmountComponentAtNode:()=>Ae,unstable_batchedUpdates:()=>Ce,useCallback:()=>D,useContext:()=>C,useDebugValue:()=>w,useDeferredValue:()=>Me,useEffect:()=>E,useErrorBoundary:()=>R,useId:()=>T,useImperativeHandle:()=>S,useInsertionEffect:()=>xe,useLayoutEffect:()=>b,useMemo:()=>A,useReducer:()=>y,useRef:()=>_,useState:()=>v,useSyncExternalStore:()=>ke,useTransition:()=>Oe,version:()=>Ee});var r,i,o,s,a=n(400),l=0,c=[],d=[],u=a.options.__b,h=a.options.__r,f=a.options.diffed,p=a.options.__c,g=a.options.unmount;function m(e,t){a.options.__h&&a.options.__h(i,e,l||t),l=0;var n=i.__H||(i.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({__V:d}),n.__[e]}function v(e){return l=1,y(P,e)}function y(e,t,n){var o=m(r++,2);if(o.t=e,!o.__c&&(o.__=[n?n(t):P(void 0,t),function(e){var t=o.__N?o.__N[0]:o.__[0],n=o.t(t,e);t!==n&&(o.__N=[n,o.__[1]],o.__c.setState({}))}],o.__c=i,!i.u)){i.u=!0;var s=i.shouldComponentUpdate;i.shouldComponentUpdate=function(e,t,n){if(!o.__c.__H)return!0;var r=o.__c.__H.__.filter((function(e){return e.__c}));if(r.every((function(e){return!e.__N})))return!s||s.call(this,e,t,n);var i=!1;return r.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(i=!0)}})),!(!i&&o.__c.props===e)&&(!s||s.call(this,e,t,n))}}return o.__N||o.__}function E(e,t){var n=m(r++,3);!a.options.__s&&N(n.__H,t)&&(n.__=e,n.i=t,i.__H.__h.push(n))}function b(e,t){var n=m(r++,4);!a.options.__s&&N(n.__H,t)&&(n.__=e,n.i=t,i.__h.push(n))}function _(e){return l=5,A((function(){return{current:e}}),[])}function S(e,t,n){l=6,b((function(){return"function"==typeof e?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0}),null==n?n:n.concat(e))}function A(e,t){var n=m(r++,7);return N(n.__H,t)?(n.__V=e(),n.i=t,n.__h=e,n.__V):n.__}function D(e,t){return l=8,A((function(){return e}),t)}function C(e){var t=i.context[e.__c],n=m(r++,9);return n.c=e,t?(null==n.__&&(n.__=!0,t.sub(i)),t.props.value):e.__}function w(e,t){a.options.useDebugValue&&a.options.useDebugValue(t?t(e):e)}function R(e){var t=m(r++,10),n=v();return t.__=e,i.componentDidCatch||(i.componentDidCatch=function(e,r){t.__&&t.__(e,r),n[1](e)}),[n[0],function(){n[1](void 0)}]}function T(){var e=m(r++,11);if(!e.__){for(var t=i.__v;null!==t&&!t.__m&&null!==t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function M(){for(var e;e=c.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(k),e.__H.__h.forEach(I),e.__H.__h=[]}catch(t){e.__H.__h=[],a.options.__e(t,e.__v)}}a.options.__b=function(e){i=null,u&&u(e)},a.options.__r=function(e){h&&h(e),r=0;var t=(i=e.__c).__H;t&&(o===i?(t.__h=[],i.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=d,e.__N=e.i=void 0}))):(t.__h.forEach(k),t.__h.forEach(I),t.__h=[])),o=i},a.options.diffed=function(e){f&&f(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==c.push(t)&&s===a.options.requestAnimationFrame||((s=a.options.requestAnimationFrame)||x)(M)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==d&&(e.__=e.__V),e.i=void 0,e.__V=d}))),o=i=null},a.options.__c=function(e,t){t.some((function(e){try{e.__h.forEach(k),e.__h=e.__h.filter((function(e){return!e.__||I(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],a.options.__e(n,e.__v)}})),p&&p(e,t)},a.options.unmount=function(e){g&&g(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{k(e)}catch(e){t=e}})),n.__H=void 0,t&&a.options.__e(t,n.__v))};var O="function"==typeof requestAnimationFrame;function x(e){var t,n=function(){clearTimeout(r),O&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);O&&(t=requestAnimationFrame(n))}function k(e){var t=i,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),i=t}function I(e){var t=i;e.__c=e.__(),i=t}function N(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function P(e,t){return"function"==typeof t?t(e):t}function H(e,t){for(var n in t)e[n]=t[n];return e}function B(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function j(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}function L(e){this.props=e}function U(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:B(this.props,e)}function r(t){return this.shouldComponentUpdate=n,(0,a.createElement)(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(L.prototype=new a.Component).isPureReactComponent=!0,L.prototype.shouldComponentUpdate=function(e,t){return B(this.props,e)||B(this.state,t)};var F=a.options.__b;a.options.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),F&&F(e)};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function V(e){function t(t){var n=H({},t);return delete n.ref,e(n,t.ref||null)}return t.$$typeof=z,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t}var W=function(e,t){return null==e?null:(0,a.toChildArray)((0,a.toChildArray)(e).map(t))},G={map:W,forEach:W,count:function(e){return e?(0,a.toChildArray)(e).length:0},only:function(e){var t=(0,a.toChildArray)(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:a.toChildArray},q=a.options.__e;a.options.__e=function(e,t,n,r){if(e.then)for(var i,o=t;o=o.__;)if((i=o.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);q(e,t,n,r)};var Y=a.options.unmount;function Q(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),e.__c.__H=null),null!=(e=H({},e)).__c&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(e){return Q(e,t,n)}))),e}function Z(e,t,n){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(e){return Z(e,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=n)),e}function X(){this.__u=0,this.t=null,this.__b=null}function $(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function J(e){var t,n,r;function i(i){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return(0,a.createElement)(n,i)}return i.displayName="Lazy",i.__f=!0,i}function K(){this.u=null,this.o=null}a.options.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Y&&Y(e)},(X.prototype=new a.Component).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=$(r.__v),o=!1,s=function(){o||(o=!0,n.__R=null,i?i(a):a())};n.__R=s;var a=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=Z(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(s,s)},X.prototype.componentWillUnmount=function(){this.t=[]},X.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=Q(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&(0,a.createElement)(a.Fragment,null,e.fallback);return i&&(i.__h=null),[(0,a.createElement)(a.Fragment,null,t.__a?null:e.children),i]};var ee=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),(0,a.render)((0,a.createElement)(te,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function re(e,t){var n=(0,a.createElement)(ne,{__v:e,i:t});return n.containerInfo=t,n}(K.prototype=new a.Component).__a=function(e){var t=this,n=$(t.__v),r=t.o.get(e);return r[0]++,function(i){var o=function(){t.props.revealOrder?(r.push(i),ee(t,e,r)):i()};n?n(o):o()}},K.prototype.render=function(e){this.u=null,this.o=new Map;var t=(0,a.toChildArray)(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},K.prototype.componentDidUpdate=K.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){ee(e,n,t)}))};var ie="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,oe=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,se="undefined"!=typeof document,ae=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};function le(e,t,n){return null==t.__k&&(t.textContent=""),(0,a.render)(e,t),"function"==typeof n&&n(),e?e.__c:null}function ce(e,t,n){return(0,a.hydrate)(e,t),"function"==typeof n&&n(),e?e.__c:null}a.Component.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(a.Component.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var de=a.options.event;function ue(){}function he(){return this.cancelBubble}function fe(){return this.defaultPrevented}a.options.event=function(e){return de&&(e=de(e)),e.persist=ue,e.isPropagationStopped=he,e.isDefaultPrevented=fe,e.nativeEvent=e};var pe,ge={configurable:!0,get:function(){return this.class}},me=a.options.vnode;a.options.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var o in r={},n){var s=n[o];se&&"children"===o&&"noscript"===t||"value"===o&&"defaultValue"in n&&null==s||("defaultValue"===o&&"value"in n&&null==n.value?o="value":"download"===o&&!0===s?s="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+t)&&!ae(n.type)?o="oninput":/^onfocus$/i.test(o)?o="onfocusin":/^onblur$/i.test(o)?o="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(o)?o=o.toLowerCase():i&&oe.test(o)?o=o.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===s&&(s=void 0),/^oninput$/i.test(o)&&(o=o.toLowerCase(),r[o]&&(o="oninputCapture")),r[o]=s)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=(0,a.toChildArray)(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=(0,a.toChildArray)(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(ge.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",ge))}e.$$typeof=ie,me&&me(e)};var ve=a.options.__r;a.options.__r=function(e){ve&&ve(e),pe=e.__c};var ye={ReactCurrentDispatcher:{current:{readContext:function(e){return pe.__n[e.__c].props.value}}}},Ee="17.0.2";function be(e){return a.createElement.bind(null,e)}function _e(e){return!!e&&e.$$typeof===ie}function Se(e){return _e(e)?a.cloneElement.apply(null,arguments):e}function Ae(e){return!!e.__k&&((0,a.render)(null,e),!0)}function De(e){return e&&(e.base||1===e.nodeType&&e)||null}var Ce=function(e,t){return e(t)},we=function(e,t){return e(t)},Re=a.Fragment;function Te(e){e()}function Me(e){return e}function Oe(){return[!1,Te]}var xe=b;function ke(e,t){var n=t(),r=v({h:{__:n,v:t}}),i=r[0].h,o=r[1];return b((function(){i.__=n,i.v=t,j(i.__,t())||o({h:i})}),[e,n,t]),E((function(){return j(i.__,i.v())||o({h:i}),e((function(){j(i.__,i.v())||o({h:i})}))}),[e]),n}var Ie={useState:v,useId:T,useReducer:y,useEffect:E,useLayoutEffect:b,useInsertionEffect:xe,useTransition:Oe,useDeferredValue:Me,useSyncExternalStore:ke,startTransition:Te,useRef:_,useImperativeHandle:S,useMemo:A,useCallback:D,useContext:C,useDebugValue:w,version:"17.0.2",Children:G,render:le,hydrate:ce,unmountComponentAtNode:Ae,createPortal:re,createElement:a.createElement,createContext:a.createContext,createFactory:be,cloneElement:Se,createRef:a.createRef,Fragment:a.Fragment,isValidElement:_e,findDOMNode:De,Component:a.Component,PureComponent:L,memo:U,forwardRef:V,flushSync:we,unstable_batchedUpdates:Ce,StrictMode:Re,Suspense:X,SuspenseList:K,lazy:J,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ye}},400:(e,t,n)=>{n.r(t),n.d(t,{Component:()=>C,Fragment:()=>b,cloneElement:()=>W,createContext:()=>G,createElement:()=>v,createRef:()=>E,h:()=>v,hydrate:()=>V,isValidElement:()=>s,options:()=>i,render:()=>z,toChildArray:()=>I});var r,i,o,s,a,l,c,d,u,h={},f=[],p=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function g(e,t){for(var n in t)e[n]=t[n];return e}function m(e){var t=e.parentNode;t&&t.removeChild(e)}function v(e,t,n){var i,o,s,a={};for(s in t)"key"==s?i=t[s]:"ref"==s?o=t[s]:a[s]=t[s];if(arguments.length>2&&(a.children=arguments.length>3?r.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(s in e.defaultProps)void 0===a[s]&&(a[s]=e.defaultProps[s]);return y(e,a,i,o,null)}function y(e,t,n,r,s){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==s?++o:s};return null==s&&null!=i.vnode&&i.vnode(a),a}function E(){return{current:null}}function b(e){return e.children}function _(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||p.test(t)?n:n+"px"}function S(e,t,n,r,i){var o;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||_(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||_(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])o=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+o]=n,n?r||e.addEventListener(t,o?D:A,o):e.removeEventListener(t,o?D:A,o);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function A(e){a=!0;try{return this.l[e.type+!1](i.event?i.event(e):e)}finally{a=!1}}function D(e){a=!0;try{return this.l[e.type+!0](i.event?i.event(e):e)}finally{a=!1}}function C(e,t){this.props=e,this.context=t}function w(e,t){if(null==t)return e.__?w(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&l.sort((function(e,t){return e.__v.__b-t.__v.__b})));O.__r=0}function x(e,t,n,r,i,o,s,a,l,c){var d,u,p,g,m,v,E,_=r&&r.__k||f,S=_.length;for(n.__k=[],d=0;d0?y(g.type,g.props,g.key,g.ref?g.ref:null,g.__v):g)){if(g.__=n,g.__b=n.__b+1,null===(p=_[d])||p&&g.key==p.key&&g.type===p.type)_[d]=void 0;else for(u=0;u=0;t--)if((n=e.__k[t])&&(r=P(n)))return r;return null}function H(e,t,n,r,o,s,a,l,c){var d,u,h,f,p,m,v,y,E,_,S,A,D,w,R,T=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(c=n.__h,l=t.__e=n.__e,t.__h=null,s=[l]),(d=i.__b)&&d(t);try{e:if("function"==typeof T){if(y=t.props,E=(d=T.contextType)&&r[d.__c],_=d?E?E.props.value:d.__:r,n.__c?v=(u=t.__c=n.__c).__=u.__E:("prototype"in T&&T.prototype.render?t.__c=u=new T(y,_):(t.__c=u=new C(y,_),u.constructor=T,u.render=F),E&&E.sub(u),u.props=y,u.state||(u.state={}),u.context=_,u.__n=r,h=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=T.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=g({},u.__s)),g(u.__s,T.getDerivedStateFromProps(y,u.__s))),f=u.props,p=u.state,u.__v=t,h)null==T.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==T.getDerivedStateFromProps&&y!==f&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(y,_),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(y,u.__s,_)||t.__v===n.__v){for(t.__v!==n.__v&&(u.props=y,u.state=u.__s,u.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),S=0;S2&&(a.children=arguments.length>3?r.call(arguments,2):n),y(e.type,a,i||e.key,o||e.ref,null)}function G(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some((function(e){e.__e=!0,M(e)}))},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}r=f.slice,i={__e:function(e,t,n,r){for(var i,o,s;t=t.__;)if((i=t.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(e)),s=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),s=i.__d),s)return i.__E=i}catch(t){e=t}throw e}},o=0,s=function(e){return null!=e&&void 0===e.constructor},a=!1,C.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=g({},this.state),"function"==typeof e&&(e=e(g({},n),this.props)),e&&g(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),M(this))},C.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),M(this))},C.prototype.render=b,l=[],d="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,O.__r=0,u=0},601:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RGX_DATE=t.RGX_WORD=t.RGX_INTEGER=t.COLOR_BROWN=t.COLOR_GREEN=t.COLOR_YELLOW=t.COLOR_ORANGE=t.COLOR_PURPLE=t.COLOR_TEXT=t.COLOR_WHITE=t.CAL_HEIGHT_DIFF=t.CVT_MS_DAY=t.CVT_HR_DAY=t.CVT_MIN_HR=t.CVT_S_MIN=t.CVT_MS_S=void 0,t.CVT_MS_S=1e3,t.CVT_S_MIN=60,t.CVT_MIN_HR=60,t.CVT_HR_DAY=24,t.CVT_MS_DAY=t.CVT_MS_S*t.CVT_S_MIN*t.CVT_MIN_HR*t.CVT_HR_DAY,t.CAL_HEIGHT_DIFF=205,t.COLOR_WHITE="#FFFFFF",t.COLOR_TEXT="#15141A",t.COLOR_PURPLE="#485FC7",t.COLOR_ORANGE="#E67975",t.COLOR_YELLOW="#F7DBA7",t.COLOR_GREEN="#041F1E",t.COLOR_BROWN="#5A352A",t.RGX_INTEGER=/^\d+$/,t.RGX_WORD=/^\w+$/,t.RGX_DATE=/^\d{4}-\d{2}-\d{2}$/},384:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Editor=void 0;var r=n(799),i=n(367),o=function(){function e(e){var t=this;this._copy_buffer=null,this._mode=null,this._calendar=e,this._notification=document.getElementById("mode-notification"),document.querySelectorAll(".tlfb-edit-mode").forEach((function(e){return e.addEventListener("click",(function(e){return t.mode(e)}))})),this._calendar.on("dateClick",(function(e){return t.click_date(e)})),this._calendar.on("eventClick",(function(e){return t.click_event(e)})),this._calendar.on("select",(function(e){return t.select_range(e)})),this._modal_key_event=new r.Modal("modal-key-event"),this._modal_sub_event=new r.Modal("modal-substance-event"),this._modal_confirm=new r.Modal("modal-confirm"),this._event_list=new i.CalendarEventList("2023-04-05","2021-07-16",this._calendar)}return e.prototype.clear=function(){this._mode=null,this._copy_buffer=null,this._notification.innerText="Click the edit menu to begin adding events."},e.prototype.mode=function(e){var t=e.target.id;switch(this.clear(),t){case"edit-mode-key-event":this._mode="add-key",this._notification.innerHTML="Click a date on the calendar to add a key date.";break;case"edit-mode-substance-event":this._mode="add-su",this._notification.innerHTML="Click a date on the calendar to add a substance use event.";break;case"edit-mode-copy":this._mode="copy",this._notification.innerHTML="Click an event on the calendar to copy.";break;case"edit-mode-delete":this._mode="delete",this._notification.innerHTML="Click an event on the calendar to delete.";break;default:throw Error("Edit.mode(): Invalid target received.")}console.log("Edit.mode(): ".concat(this._mode))},e.prototype.click_date=function(e){var t=this;switch(console.log("Edit.click_date(): ".concat(e.dateStr)),this._mode){case"add-key":this._modal_key_event.populateText({".subtitle":e.date.toDateString()}).open((function(n){t._event_list.add(new i.KeyEvent(e.dateStr,n.get("key-text")))}));break;case"add-su":this._modal_sub_event.populateText({".subtitle":e.date.toDateString()}).open((function(n){t._calendar.addEvent({title:n.get("key-text"),start:e.dateStr})}));break;case"copy":if(this._copy_buffer){var n=this._copy_buffer.clone();n.set_date(e.dateStr).set_gid(this._copy_buffer.gid),this._event_list.add(n,!1)}}},e.prototype.select_range=function(e){var t=this;console.log("Edit.select_range(): ".concat(e.startStr," to ").concat(e.endStr));var n=new Date;n.setDate(e.end.getDate()-1);var r=n.toISOString().substring(0,10);"add-key"===this._mode&&this._modal_key_event.populateText({".subtitle":"".concat(e.start.toDateString()," to ").concat(n.toDateString())}).open((function(n){var o=new i.KeyEvent(e.startStr,n.get("key-text"));t._event_list.import_events(o.make_recurrence([1,2,3,4,5,6,7],r))}))},e.prototype.click_event=function(e){switch(console.log("Edit.click_event(): ".concat(e.event.title," (event ").concat(e.event.id," / group ").concat(e.event.groupId,")")),this._mode){case"copy":this._copy_buffer=this._event_list.get_event(Number(e.event.id)),this._notification.innerHTML="Click any date to paste the event called ".concat(this._copy_buffer.title,".");break;case"delete":this.delete_event(Number(e.event.id))}},e.prototype.delete_event=function(e){var t=this,n=this._event_list.get_event(e),r=this._event_list.get_event_siblings(e).length;r>0?this._modal_confirm.populateText({".modal-card-title":"Confirm Deletion of Multiple Events",".content":"

The event on ".concat(n.date," titled ").concat(n.title," is related to ").concat(r," other events.

")+"

Confirm whether you want to delete just this event, or all of the events in the group.

"}).setElementClass({"#delete-all-button":["is-hidden",!1]}).open((function(r){console.log(r),r.forEach((function(e,t){return console.log("".concat(e," ").concat(t))})),"single"==r.get("action")?t._event_list.delete_event(e):t._event_list.delete_group(n.gid)})):this._modal_confirm.populateText({".modal-card-title":"Confirm Event Deletion",".content":"

Confirm that you want to delete the event on ".concat(n.date," titled ").concat(n.title,".

")}).setElementClass({"#delete-all-button":["is-hidden",!0]}).open((function(){t._event_list.delete_event(e)}))},e}();t.Editor=o},519:function(e,t,n){var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var a=n(553),l=s(n(610)),c=s(n(790)),d=n(384),u=o(n(882)),h=n(601);function f(e,t){Object.assign(e,t);var n=(new Date(e.end).valueOf()-new Date(e.start).valueOf())/h.CVT_MS_DAY;u.set_inner("calendar-file-title","".concat(e.subject," / ").concat(e.record," at ").concat(e.timepoint)),u.set_inner("calendar-file-subtitle","".concat(e.start," to ").concat(e.end," (").concat(n," Days)"))}document.addEventListener("DOMContentLoaded",(function(){var e={subject:"",record:"",timepoint:"",project:"",start:"",end:""};f(e,{subject:"MX347",record:"10",project:"3456",timepoint:"redcap_arm_1_visit_1",start:"2023-06-18",end:"2023-07-15"}),f(e,function(){for(var e=new URLSearchParams(window.location.search),t={},n=0,r=[{name:"record",to:"record",validator:h.RGX_INTEGER},{name:"pid",to:"project",validator:h.RGX_INTEGER},{name:"event",to:"timepoint",validator:h.RGX_WORD},{name:"subject",to:"subject",validator:h.RGX_WORD},{name:"start",to:"start",validator:h.RGX_DATE},{name:"end",to:"end",validator:h.RGX_DATE}];n{Object.defineProperty(t,"__esModule",{value:!0}),t.Modal=void 0;var n=function(){function e(e){var t,n=this;this._onsubmit=null;var r=document.getElementById(e);if(null==r)throw Error("Modal(): Could not locate DOM element '#".concat(e,"'."));if(!r.classList.contains("modal"))throw Error("Modal(): '#".concat(e,"' is not of class 'modal'."));this._element=r,this._form=this._element.querySelector("form"),this._element.querySelectorAll(".modal-close, .cancel-operation").forEach((function(e){return e.addEventListener("click",(function(){return n.close()}))})),null===(t=this._form)||void 0===t||t.addEventListener("submit",(function(e){e.preventDefault(),n.submit(e)}))}return e.prototype.reset=function(){var e;console.log("Modal.reset(): ".concat(this._element.id)),null===(e=this._form)||void 0===e||e.reset()},e.prototype.submit=function(e){if(console.log("Modal.submit(): ".concat(this._element.id)),!this._form)throw Error("Modal.submit(): Cannot submit modal with no descendant form ".concat(this._element.id,"."));if(!this._onsubmit)throw Error("Modal.submit(): Form submitted but no handler specified.");var t=this.getFormData(),n=e.submitter.value;return n&&t.append("action",n),this._onsubmit(t),this.close()},e.prototype.populateForm=function(e){if(console.log("Modal.populateForm(): ".concat(this._element.id)),!this._form)throw Error("Modal.populateForm(): Cannot populate modal with no descendant form ".concat(this._element.id,"."));for(var t in e){if(!this._form.elements.namedItem(t))throw Error("Modal.populateForm(): Named element '".concat(t,"' not found in form."));this._form.elements.namedItem(t).value=e[t]}return this},e.prototype.populateText=function(e){for(var t in console.log("Modal.populateText(): ".concat(this._element.id)),e){var n=this._element.querySelector(t);if(!n)throw Error("Modal.populateText(): Element not found for '".concat(t,"'."));n.innerHTML=e[t]}return this},e.prototype.setElementClass=function(e){for(var t in console.log("Modal.addElementClass(): ".concat(this._element.id)),e){var n=this._element.querySelector(t);if(!n)throw Error("Modal.addElementClass(): Element not found for '".concat(t,"'."));e[t][1]?n.classList.add(e[t][0]):n.classList.remove(e[t][0])}return this},e.prototype.getFormData=function(){if(console.log("Modal.getFormData(): ".concat(this._element.id)),!this._form)throw Error("Modal.getFormData(): Cannot get form data for modal with no descendant form ".concat(this._element.id,"."));return new FormData(this._form)},e.prototype.open=function(e){return void 0===e&&(e=null),console.log("Modal.open(): ".concat(this._element.id)),this._onsubmit=e,this._element.classList.add("is-active"),this},e.prototype.close=function(){return console.log("Modal.close(): ".concat(this._element.id)),this._element.classList.remove("is-active"),this.reset(),this},e}();t.Modal=n},367:function(e,t,n){var r,i=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0}),t.CalendarEventList=t.UseEvent=t.KeyEvent=t.CalendarEvent=void 0;var o=n(601),s=function(){function e(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error("CalendarDate expects a date in 'YYYY-MM-DD' format.");if(this._date=new Date(e),isNaN(this._date.valueOf()))throw new Error("CalanderDate received an invalid date.")}return Object.defineProperty(e.prototype,"Date",{get:function(){return this._date},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"weekday",{get:function(){return this._date.getUTCDay()+1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"day",{get:function(){return this._date.getUTCDate()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"month",{get:function(){return this._date.getUTCMonth()+1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"year",{get:function(){return this._date.getUTCFullYear()},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this._date.toISOString().substring(0,10)},e.prototype.set_day=function(e){return this._date.setUTCDate(e),this},e.prototype.isSameDay=function(e){return this.year==e.year&&this.month==e.month&&this.day==e.day},e.prototype.isAfter=function(e){return this.year==e.year&&this.month==e.month&&this.day>e.day||this.year==e.year&&this.month>e.month||this.year>e.year},e.prototype.isBefore=function(e){return this.year==e.year&&this.month==e.month&&this.day{Object.defineProperty(t,"__esModule",{value:!0}),t.find_parent_modal=t.set_inner=void 0,t.set_inner=function(e,t){var n=document.getElementById(e);if(null==n)throw new Error("Failed to select element #".concat(e,"."));t instanceof NodeList?t.forEach((function(e){return n.appendChild(e)})):n.innerText=t},t.find_parent_modal=function(e){var t=e.closest(".modal");if(null==t)throw Error("find_parent_modal: No modal found in ancestry of ".concat(e,"."));return t}},553:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(873),i=n(400);n(748);const o=[],s={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},a=Object.assign(Object.assign({},s),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":`This ${e}`},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function l(e){let t=e.length>0?e[0].code:"en",n=o.concat(e),r={en:a};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function c(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||a;return d(e,n,r)}(e,t):d(e.code,[e.code],e)}function d(e,t,n){let i=r.mergeProps([s,n],["buttonText"]);delete i.code;let{week:o}=i;return delete i.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:i}}function u(e){return{id:r.guid(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}class h extends r.Theme{}function f(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],o=r[e],s=e=>i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null,a=s("component"),l=s("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=f(l,t,n,r)}return!a&&c&&(a=c.component),a?{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),o?o.rawOptions:{})}:null}(e,t,n,r);return i&&(t[e]=i),i}function p(e){return r.mapHash(e,g)}function g(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;return t.content?n=m(t):!n||n.prototype instanceof r.BaseComponent||(n=m(Object.assign(Object.assign({},t),{content:n}))),{superType:t.type,component:n,rawOptions:t}}function m(e){return t=>i.createElement(r.ViewContextType.Consumer,null,(n=>i.createElement(r.ContentContainer,{elTag:"div",elClasses:r.buildViewClassNames(n.viewSpec),renderProps:Object.assign(Object.assign({},t),{nextDayThreshold:n.options.nextDayThreshold}),generatorName:void 0,customGenerator:e.content,classNameGenerator:e.classNames,didMount:e.didMount,willUnmount:e.willUnmount})))}function v(e,t,n,i){let o=p(e),s=p(t.views),a=function(e,t){let n,r={};for(n in e)f(n,r,e,t);for(n in t)f(n,r,e,t);return r}(o,s);return r.mapHash(a,(e=>function(e,t,n,i,o){let s=e.overrides.duration||e.defaults.duration||i.duration||n.duration,a=null,l="",c="",d={};if(s&&(a=function(e){let t=JSON.stringify(e),n=y[t];return void 0===n&&(n=r.createDuration(e),y[t]=n),n}(s),a)){let e=r.greatestDurationDenominator(a);l=e.unit,1===e.value&&(c=l,d=t[l]?t[l].rawOptions:{})}let u=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null},h=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null};return{type:e.type,component:e.component,duration:a,durationUnit:l,singleUnit:c,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},d),e.overrides),buttonTextOverride:u(i)||u(n)||e.overrides.buttonText,buttonTextDefault:u(o)||e.defaults.buttonText||u(r.BASE_OPTION_DEFAULTS)||e.type,buttonTitleOverride:h(i)||h(n)||e.overrides.buttonHint,buttonTitleDefault:h(o)||e.defaults.buttonHint||h(r.BASE_OPTION_DEFAULTS)}}(e,s,t,n,i)))}h.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},h.prototype.baseIconClass="fc-icon",h.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},h.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},h.prototype.iconOverrideOption="buttonIcons",h.prototype.iconOverrideCustomButtonOption="icon",h.prototype.iconOverridePrefix="fc-icon-";let y={};function E(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function b(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=_(i,n,r)),Object.assign(Object.assign({},e),i)}function _(e,t,n){return S(e,r.filterHash(e,(e=>function(e,t,n){return C(e,n)?!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.starte.fetchRange.end:!e.latestFetchId}(e,t,n))),t,!1,n)}function S(e,t,n,r,i){let o={};for(let s in e){let a=e[s];t[s]?o[s]=A(a,n,r,i):o[s]=a}return o}function A(e,t,n,i){let{options:o,calendarApi:s}=i,a=i.pluginHooks.eventSourceDefs[e.sourceDefId],l=r.guid();return a.fetch({eventSource:e,range:t,isRefetch:n,context:i},(n=>{let{rawEvents:r}=n;o.eventSourceSuccess&&(r=o.eventSourceSuccess.call(s,r,n.response)||r),e.success&&(r=e.success.call(s,r,n.response)||r),i.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(n=>{let r=!1;o.eventSourceFailure&&(o.eventSourceFailure.call(s,n),r=!0),e.failure&&(e.failure(n),r=!0),r||console.warn(n.message,n),i.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:l})}function D(e,t){return r.filterHash(e,(e=>C(e,t)))}function C(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function w(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function R(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function T(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function M(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function O(e,t,n,r,i){return{header:e.headerToolbar?x(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?x(e.footerToolbar,e,t,n,r,i):null}}function x(e,t,n,r,i,o){let s={},a=[],l=!1;for(let c in e){let d=k(e[c],t,n,r,i,o);s[c]=d.widgets,a.push(...d.viewsWithButtons),l=l||d.hasTitle}return{sectionWidgets:s,viewsWithButtons:a,hasTitle:l}}function k(e,t,n,i,o,s){let a="rtl"===t.direction,l=t.customButtons||{},c=n.buttonText||{},d=t.buttonText||{},u=n.buttonHints||{},h=t.buttonHints||{},f=e?e.split(" "):[],p=[],g=!1;return{widgets:f.map((e=>e.split(",").map((e=>{if("title"===e)return g=!0,{buttonName:e};let n,f,m,v,y,E;if(n=l[e])m=e=>{n.click&&n.click.call(e.target,e,e.target)},(v=i.getCustomButtonIconClass(n))||(v=i.getIconClass(e,a))||(y=n.text),E=n.hint||n.text;else if(f=o[e]){p.push(e),m=()=>{s.changeView(e)},(y=f.buttonTextOverride)||(v=i.getIconClass(e,a))||(y=f.buttonTextDefault);let n=f.buttonTextOverride||f.buttonTextDefault;E=r.formatWithOrdinals(f.buttonTitleOverride||f.buttonTitleDefault||t.viewHint,[n,e],n)}else if(s[e])if(m=()=>{s[e]()},(y=c[e])||(v=i.getIconClass(e,a))||(y=d[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";E=r.formatWithOrdinals(u[t]||h[t],[d.year||"year","year"],d[e])}else E=t=>r.formatWithOrdinals(u[e]||h[e],[d[t]||t,t],d[e]);return{buttonName:e,buttonClick:m,buttonIcon:v,buttonText:y,buttonHint:E}})))),viewsWithButtons:p,hasTitle:g}}class I{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function N(e,t){let n=r.hashValuesToArray(t.getCurrentData().eventSources);if(1===n.length&&1===e.length&&Array.isArray(n[0]._raw)&&Array.isArray(e[0]))return void t.dispatch({type:"RESET_RAW_EVENTS",sourceId:n[0].sourceId,rawEvents:e[0]});let i=[];for(let t of e){let e=!1;for(let r=0;rArray.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),u({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:i}=e.context,o=e.eventSource.meta;r.unpromisify(o.bind(null,r.buildRangeApiWithTimeZone(e.range,i)),(e=>t({rawEvents:e})),n)}}]}),u({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:r.identity,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:i}=e.eventSource,o=function(e,t,n){let r,i,o,s,{dateEnv:a,options:l}=n,c={};return r=e.startParam,null==r&&(r=l.startParam),i=e.endParam,null==i&&(i=l.endParam),o=e.timeZoneParam,null==o&&(o=l.timeZoneParam),s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{},Object.assign(c,s),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[o]=a.timeZone),c}(i,e.range,e.context);r.requestJson(i.method,i.url,o).then((([e,n])=>{t({rawEvents:e,response:n})}),n)}}]}),u({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let n,i={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(n=e.duration),!n&&e.startTime&&e.endTime&&(n=r.subtractDurations(e.endTime,e.startTime)),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:n,typeData:i}}return null},expand(e,t,n){let i=r.intersectRanges(t,{start:e.startRecur,end:e.endRecur});return i?function(e,t,n,i){let o=e?r.arrayToHash(e):null,s=r.startOfDay(n.start),a=n.end,l=[];for(;sE(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},r.buildRangeApiWithTimeZone(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",r.buildEventApis(e,t))}}})];class H{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new r.DelayedRunner(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function B(e,t,n){let i;return i=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(i.start,i.end,r.createFormatter(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=r.diffWholeDays(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class j{constructor(e){this.computeCurrentViewData=r.memoize(this._computeCurrentViewData),this.organizeRawLocales=r.memoize(l),this.buildLocale=r.memoize(c),this.buildPluginHooks=function(){let e,t=[],n=[];return(i,o)=>(e&&r.isArraysEqual(i,t)&&r.isArraysEqual(o,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let l of e){const e=l.name,c=n[e];void 0===c?(n[e]=l.id,i(l.deps),a=l,r={premiumReleaseDate:(t=(s=r).premiumReleaseDate,o=a.premiumReleaseDate,void 0===t?o:void 0===o?t:new Date(Math.max(t.valueOf(),o.valueOf()))),reducers:s.reducers.concat(a.reducers),isLoadingFuncs:s.isLoadingFuncs.concat(a.isLoadingFuncs),contextInit:s.contextInit.concat(a.contextInit),eventRefiners:Object.assign(Object.assign({},s.eventRefiners),a.eventRefiners),eventDefMemberAdders:s.eventDefMemberAdders.concat(a.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},s.eventSourceRefiners),a.eventSourceRefiners),isDraggableTransformers:s.isDraggableTransformers.concat(a.isDraggableTransformers),eventDragMutationMassagers:s.eventDragMutationMassagers.concat(a.eventDragMutationMassagers),eventDefMutationAppliers:s.eventDefMutationAppliers.concat(a.eventDefMutationAppliers),dateSelectionTransformers:s.dateSelectionTransformers.concat(a.dateSelectionTransformers),datePointTransforms:s.datePointTransforms.concat(a.datePointTransforms),dateSpanTransforms:s.dateSpanTransforms.concat(a.dateSpanTransforms),views:Object.assign(Object.assign({},s.views),a.views),viewPropsTransformers:s.viewPropsTransformers.concat(a.viewPropsTransformers),isPropsValid:a.isPropsValid||s.isPropsValid,externalDefTransforms:s.externalDefTransforms.concat(a.externalDefTransforms),viewContainerAppends:s.viewContainerAppends.concat(a.viewContainerAppends),eventDropTransformers:s.eventDropTransformers.concat(a.eventDropTransformers),calendarInteractions:s.calendarInteractions.concat(a.calendarInteractions),componentInteractions:s.componentInteractions.concat(a.componentInteractions),themeClasses:Object.assign(Object.assign({},s.themeClasses),a.themeClasses),eventSourceDefs:s.eventSourceDefs.concat(a.eventSourceDefs),cmdFormatter:a.cmdFormatter||s.cmdFormatter,recurringTypes:s.recurringTypes.concat(a.recurringTypes),namedTimeZonedImpl:a.namedTimeZonedImpl||s.namedTimeZonedImpl,initialView:s.initialView||a.initialView,elementDraggingImpl:s.elementDraggingImpl||a.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},s.optionChangeHandlers),a.optionChangeHandlers),scrollGridImpl:a.scrollGridImpl||s.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},s.listenerRefiners),a.listenerRefiners),optionRefiners:Object.assign(Object.assign({},s.optionRefiners),a.optionRefiners),propSetHandlers:Object.assign(Object.assign({},s.propSetHandlers),a.propSetHandlers)}):c!==l.id&&console.warn(`Duplicate plugin '${e}'`)}var t,o,s,a}return e&&i(e),i(t),r}(i,o)),t=i,n=o,e)}(),this.buildDateEnv=r.memoize(L),this.buildTheme=r.memoize(U),this.parseToolbars=r.memoize(O),this.buildViewSpecs=r.memoize(v),this.buildDateProfileGenerator=r.memoizeObjArg(F),this.buildViewApi=r.memoize(z),this.buildViewUiProps=r.memoizeObjArg(G),this.buildEventUiBySource=r.memoize(V,r.isPropsEqual),this.buildEventUiBases=r.memoize(W),this.parseContextBusinessHours=r.memoizeObjArg(Y),this.buildTitle=r.memoize(B),this.emitter=new r.Emitter,this.actionRunner=new H(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.optionsForRefining=[],this.optionsForHandling=[],this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),i=n.calendarOptions.initialView||n.pluginHooks.initialView,o=this.computeCurrentViewData(i,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(o.options);let s=r.getInitialDate(n.calendarOptions,n.dateEnv),a=o.dateProfileGenerator.build(s);r.rangeContainsMarker(a.activeRange,s)||(s=a.currentRange.start);let d={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(d);let u=function(e,t,n){let i=t?t.activeRange:null;return b({},function(e,t){let n=r.buildEventSourceRefiners(t),i=[].concat(e.eventSources||[]),o=[];e.initialEvents&&i.unshift(e.initialEvents),e.events&&i.unshift(e.events);for(let e of i){let i=r.parseEventSource(e,t,n);i&&o.push(i)}return o}(e,n),i,n)}(n.calendarOptions,a,d),h={dynamicOptionOverrides:t,currentViewType:i,currentDate:s,dateProfile:a,businessHours:this.parseContextBusinessHours(d),eventSources:u,eventUiBases:{},eventStore:r.createEmptyEventStore(),renderableEventStore:r.createEmptyEventStore(),dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(d).selectionConfig},f=Object.assign(Object.assign({},d),h);for(let e of n.pluginHooks.reducers)Object.assign(h,e(null,null,f));q(h,d)&&this.emitter.trigger("loading",!0),this.state=h,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;void 0===t?n.optionOverrides=e:(n.optionOverrides=Object.assign(Object.assign({},n.optionOverrides||{}),e),this.optionsForRefining.push(...t)),(void 0===t||t.length)&&this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:i}=this,o=function(e,t){return"SET_OPTION"===t.type?Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue}):e}(n.dynamicOptionOverrides,e),s=this.computeOptionsData(t.optionOverrides,o,t.calendarApi),a=function(e,t){return"CHANGE_VIEW_TYPE"===t.type&&(e=t.viewType),e}(n.currentViewType,e),l=this.computeCurrentViewData(a,s,t.optionOverrides,o);t.calendarApi.currentDataManager=this,i.setThisContext(t.calendarApi),i.setOptions(l.options);let c={dateEnv:s.dateEnv,options:s.calendarOptions,pluginHooks:s.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:i,getCurrentData:this.getCurrentData},{currentDate:d,dateProfile:u}=n;this.data&&this.data.dateProfileGenerator!==l.dateProfileGenerator&&(u=l.dateProfileGenerator.build(d)),d=r.reduceCurrentDate(d,e),u=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(u,e,d,l.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&r.rangeContainsMarker(u.currentRange,d)||(d=u.currentRange.start);let h=function(e,t,n,i){let o=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return b(e,t.sources,o,i);case"REMOVE_EVENT_SOURCE":return s=e,a=t.sourceId,r.filterHash(s,(e=>e.sourceId!==a));case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?_(e,o,i):e;case"FETCH_EVENT_SOURCES":return S(e,t.sourceIds?r.arrayToHash(t.sourceIds):D(e,i),o,t.isRefetch||!1,i);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];return i&&n===i.latestFetchId?Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})}):e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var s,a}(n.eventSources,e,u,c),f=r.reduceEventStore(n.eventStore,e,h,u,c),p=E(h)&&!l.options.progressiveEventRendering&&n.renderableEventStore||f,{eventUiSingleBase:g,selectionConfig:m}=this.buildViewUiProps(c),v=this.buildEventUiBySource(h),y={dynamicOptionOverrides:o,currentViewType:a,currentDate:d,dateProfile:u,eventSources:h,eventStore:f,renderableEventStore:p,selectionConfig:m,eventUiBases:this.buildEventUiBases(p.defs,g,v),businessHours:this.parseContextBusinessHours(c),dateSelection:w(n.dateSelection,e),eventSelection:R(n.eventSelection,e),eventDrag:T(n.eventDrag,e),eventResize:M(n.eventResize,e)},A=Object.assign(Object.assign({},c),y);for(let t of s.pluginHooks.reducers)Object.assign(y,t(n,e,A));let C=q(n,c),O=q(y,c);!C&&O?i.trigger("loading",!0):C&&!O&&i.trigger("loading",!1),this.state=y,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,i=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),o=this.computeCurrentViewData(t.currentViewType,i,e.optionOverrides,t.dynamicOptionOverrides),s=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,o.options,i.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},i),o),t),a=i.pluginHooks.optionChangeHandlers,l=n&&n.calendarOptions,c=i.calendarOptions;if(l&&l!==c){l.timeZone!==c.timeZone&&(t.eventSources=s.eventSources=function(e,t,n){let r=t?t.activeRange:null;return S(e,D(e,n),r,!0,n)}(s.eventSources,t.dateProfile,s),t.eventStore=s.eventStore=r.rezoneEventStoreDates(s.eventStore,n.dateEnv,s.dateEnv),t.renderableEventStore=s.renderableEventStore=r.rezoneEventStoreDates(s.renderableEventStore,n.dateEnv,s.dateEnv));for(let e in a)-1===this.optionsForHandling.indexOf(e)&&l[e]===c[e]||a[e](c[e],s)}this.optionsForHandling=[],e.onData&&e.onData(s)}computeOptionsData(e,t,n){if(!this.optionsForRefining.length&&e===this.stableOptionOverrides&&t===this.stableDynamicOptionOverrides)return this.stableCalendarOptionsData;let{refinedOptions:r,pluginHooks:i,localeDefaults:o,availableLocaleData:s,extra:a}=this.processRawCalendarOptions(e,t);Q(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,s,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,this.stableOptionOverrides,this.stableDynamicOptionOverrides,o),d=this.buildTheme(r,i),u=this.parseToolbars(r,this.stableOptionOverrides,d,c,n);return this.stableCalendarOptionsData={calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:d,toolbarConfig:u,localeDefaults:o,availableRawLocales:s.map}}processRawCalendarOptions(e,t){let{locales:n,locale:i}=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,e,t]),o=this.organizeRawLocales(n),s=o.map,a=this.buildLocale(i||o.defaultCode,s).options,l=this.buildPluginHooks(e.plugins||[],P),c=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.BASE_OPTION_REFINERS),r.CALENDAR_LISTENER_REFINERS),r.CALENDAR_OPTION_REFINERS),l.listenerRefiners),l.optionRefiners),d={},u=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,a,e,t]),h={},f=this.currentCalendarOptionsInput,p=this.currentCalendarOptionsRefined,g=!1;for(let e in u)-1===this.optionsForRefining.indexOf(e)&&(u[e]===f[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&e in f&&r.COMPLEX_OPTION_COMPARATORS[e](f[e],u[e]))?h[e]=p[e]:c[e]?(h[e]=c[e](u[e]),g=!0):d[e]=f[e];return g&&(this.currentCalendarOptionsInput=u,this.currentCalendarOptionsRefined=h,this.stableOptionOverrides=e,this.stableDynamicOptionOverrides=t),this.optionsForHandling.push(...this.optionsForRefining),this.optionsForRefining=[],{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:l,availableLocaleData:o,localeDefaults:a,extra:d}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:o,extra:s}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return Q(s),{viewSpec:i,options:o,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:o.slotMinTime,slotMaxTime:o.slotMaxTime,showNonCurrentDates:o.showNonCurrentDates,dayCount:o.dayCount,dateAlignment:o.dateAlignment,dateIncrement:o.dateIncrement,hiddenDays:o.hiddenDays,weekends:o.weekends,nowInput:o.now,validRangeInput:o.validRange,visibleRangeInput:o.visibleRange,fixedWeekCount:o.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,i,o){let s=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,e.optionDefaults,n,i,e.optionOverrides,o]),a=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.BASE_OPTION_REFINERS),r.CALENDAR_LISTENER_REFINERS),r.CALENDAR_OPTION_REFINERS),r.VIEW_OPTION_REFINERS),t.listenerRefiners),t.optionRefiners),l={},c=this.currentViewOptionsInput,d=this.currentViewOptionsRefined,u=!1,h={};for(let e in s)s[e]===c[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&r.COMPLEX_OPTION_COMPARATORS[e](s[e],c[e])?l[e]=d[e]:(s[e]===this.currentCalendarOptionsInput[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&r.COMPLEX_OPTION_COMPARATORS[e](s[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(l[e]=this.currentCalendarOptionsRefined[e]):a[e]?l[e]=a[e](s[e]):h[e]=s[e],u=!0);return u&&(this.currentViewOptionsInput=s,this.currentViewOptionsRefined=l),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:h}}}function L(e,t,n,i,o,s,a,l){let d=c(t||a.defaultCode,a.map);return new r.DateEnv({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:s.namedTimeZonedImpl,locale:d,weekNumberCalculation:n,firstDay:i,weekText:o,cmdFormatter:s.cmdFormatter,defaultSeparator:l})}function U(e,t){return new(t.themeClasses[e.themeSystem]||h)(e)}function F(e){return new(e.dateProfileGeneratorClass||r.DateProfileGenerator)(e)}function z(e,t,n){return new I(e,t,n)}function V(e){return r.mapHash(e,(e=>e.ui))}function W(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function G(e){let{options:t}=e;return{eventUiSingleBase:r.createEventUi({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:r.createEventUi({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function q(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function Y(e){return r.parseBusinessHours(e.options.businessHours,e)}function Q(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class Z extends r.BaseComponent{render(){let e=this.props.widgetGroups.map((e=>this.renderWidgetGroup(e)));return i.createElement("div",{className:"fc-toolbar-chunk"},...e)}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],o=!0;for(let s of e){let{buttonName:e,buttonClick:a,buttonText:l,buttonIcon:c,buttonHint:d}=s;if("title"===e)o=!1,r.push(i.createElement("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let o=e===t.activeButton,s=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,u=[`fc-${e}-button`,n.getClass("button")];o&&u.push(n.getClass("buttonActive")),r.push(i.createElement("button",{type:"button",title:"function"==typeof d?d(t.navUnit):d,disabled:s,"aria-pressed":o,className:u.join(" "),onClick:a},l||(c?i.createElement("span",{className:c}):"")))}}if(r.length>1){let e=o&&n.getClass("buttonGroup")||"";return i.createElement("div",{className:e},...r)}return r[0]}}class X extends r.BaseComponent{render(){let e,t,{model:n,extraClassName:r}=this.props,o=!1,s=n.sectionWidgets,a=s.center;s.left?(o=!0,e=s.left):e=s.start,s.right?(o=!0,t=s.right):t=s.end;let l=[r||"","fc-toolbar",o?"fc-toolbar-ltr":""];return i.createElement("div",{className:l.join(" ")},this.renderSection("start",e||[]),this.renderSection("center",a||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return i.createElement(Z,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})}}class $ extends r.BaseComponent{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,r.setRef(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],o="",s="";return n?null!==t.availableWidth?o=t.availableWidth/n:s=1/n*100+"%":o=e.height||"",i.createElement("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:o,paddingBottom:s}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class J extends r.Interaction{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:i}=n,o=r.getElSeg(t);if(o&&n.isValidSegDownEl(e.target)){let s=r.elementClosest(e.target,".fc-event-forced-url"),a=s?s.querySelector("a[href]").href:"";i.emitter.trigger("eventClick",{el:t,event:new r.EventImpl(n.context,o.eventRange.def,o.eventRange.instance),jsEvent:e,view:i.viewApi}),a&&!e.defaultPrevented&&(window.location.href=a)}},this.destroy=r.listenBySelector(e.el,"click",".fc-event",this.handleSegClick)}}class K extends r.Interaction{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{r.getElSeg(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=r.listenToHoverBySelector(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:i}=this,{context:o}=i,s=r.getElSeg(n);t&&!i.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new r.EventImpl(o,s.eventRange.def,s.eventRange.instance),jsEvent:t,view:o.viewApi})}}class ee extends r.PureComponent{constructor(){super(...arguments),this.buildViewContext=r.memoize(r.buildViewContext),this.buildViewPropTransformers=r.memoize(ne),this.buildToolbarProps=r.memoize(te),this.headerRef=i.createRef(),this.footerRef=i.createRef(),this.interactionsStore={},this.state={viewLabelId:r.getUniqueDomId()},this.registerInteractiveComponent=(e,t)=>{let n=r.parseInteractionSettings(e,t),i=[J,K].concat(this.props.pluginHooks.componentInteractions).map((e=>new e(n)));this.interactionsStore[e.uid]=i,r.interactionSettingsStore[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete r.interactionSettingsStore[e.uid]},this.resizeRunner=new r.DelayedRunner((()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})})),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:o}=t,s=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,r.getNow(t.options.now,t.dateEnv),t.viewTitle),a=!1,l="";t.isHeightAuto||t.forPrint?l="":null!=o.height?a=!0:null!=o.contentHeight?l=o.contentHeight:e=Math.max(o.aspectRatio,.5);let c=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),d=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return i.createElement(r.ViewContextType.Provider,{value:c},n.header&&i.createElement(X,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:d},s)),i.createElement($,{liquid:a,height:l,aspectRatio:e,labeledById:d},this.renderView(t),this.buildAppendContent()),n.footer&&i.createElement(X,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},s)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map((t=>new t(e))),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this,t=e.pluginHooks.viewContainerAppends.map((t=>t(e)));return i.createElement(i.Fragment,{},...t)}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},o=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of o)Object.assign(r,t.transform(r,e));let s=n.component;return i.createElement(s,Object.assign({},r))}}function te(e,t,n,i,o,s){let a=n.build(o,void 0,!1),l=n.buildPrev(t,i,!1),c=n.buildNext(t,i,!1);return{title:s,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:a.isValid&&!r.rangeContainsMarker(t.currentRange,o),isPrevEnabled:l.isValid,isNextEnabled:c.isValid}}function ne(e){return e.map((e=>new e))}class re extends r.CalendarImpl{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;r.flushSync((()=>{i.render(i.createElement(r.CalendarRoot,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},((t,n,o,s)=>(this.setClassNames(t),this.setHeight(n),i.createElement(r.RenderId.Provider,{value:this.customContentRenderId},i.createElement(ee,Object.assign({isHeightAuto:o,forPrint:s},e)))))),this.el)}))}else this.isRendered&&(this.isRendered=!1,i.render(null,this.el),this.setClassNames([]),this.setHeight(""))},r.ensureElHasStyles(e),this.el=e,this.renderRunner=new r.DelayedRunner(this.handleRenderRequest),new j({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){r.flushSync((()=>{super.updateSize()}))}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!r.isArraysEqual(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){r.applyStyleProp(this.el,"height",e)}}function ie(e){let t=c(e.locale||"en",l([]).map);return new r.DateEnv(Object.assign(Object.assign({timeZone:r.BASE_OPTION_DEFAULTS.timeZone,calendarSystem:"gregory"},e),{locale:t}))}t.JsonRequestError=r.JsonRequestError,t.Calendar=re,t.createPlugin=u,t.formatDate=function(e,t={}){let n=ie(t),i=r.createFormatter(t),o=n.createMarkerMeta(e);return o?n.format(o.marker,i,{forcedTzo:o.forcedTzo}):""},t.formatRange=function(e,t,n){let i=ie("object"==typeof n&&n?n:{}),o=r.createFormatter(n),s=i.createMarkerMeta(e),a=i.createMarkerMeta(t);return s&&a?i.formatRange(s.marker,a.marker,o,{forcedStartTzo:s.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:r.BASE_OPTION_DEFAULTS.defaultRangeSeparator}):""},t.globalLocales=o,t.globalPlugins=P,t.sliceEvents=function(e,t){return r.sliceEventStore(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},t.version="6.1.8"},873:(e,t,n)=>{var r=n(400),i=n(748);function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var s=o(r);const a=[],l=new Map;function c(e){a.push(e),l.forEach((t=>{u(t,e)}))}function d(e){let t=l.get(e);if(!t||!t.isConnected){if(t=e.querySelector("style[data-fullcalendar]"),!t){t=document.createElement("style"),t.setAttribute("data-fullcalendar","");const n=(void 0===h&&(h=function(){const e=document.querySelector('meta[name="csp-nonce"]');if(e&&e.hasAttribute("content"))return e.getAttribute("content");const t=document.querySelector("script[nonce]");return t&&t.nonce||""}()),h);n&&(t.nonce=n);const r=e===document?document.head:e,i=e===document?r.querySelector("script,link[rel=stylesheet],link[as=style],style"):r.firstChild;r.insertBefore(t,i)}l.set(e,t),function(e){for(const t of a)u(e,t)}(t)}}function u(e,t){const{sheet:n}=e,r=n.cssRules.length;t.split("}").forEach(((e,t)=>{(e=e.trim())&&n.insertRule(e+"}",r+t)}))}let h;function f(e){e.parentNode&&e.parentNode.removeChild(e)}function p(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(g(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function g(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function m(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const v=/(top|left|right|bottom|width|height)$/i;function y(e,t){for(let n in t)E(e,n,t[n])}function E(e,t,n){null==n?e.style[t]="":"number"==typeof n&&v.test(t)?e.style[t]=`${n}px`:e.style[t]=n}function b(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}let _=0;function S(){return _+=1,"fc-dom-"+_}function A(e){e.preventDefault()}function D(e,t,n,r){let i=function(e,t){return n=>{let r=p(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}const C=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function w(e){return Object.assign({onClick:e},R(e))}function R(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let T=0;function M(){return T+=1,String(T)}function O(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;te.replace("$"+n,t||"")),e):n}function H(e){return e%1==0}function B(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const j=["years","months","days","milliseconds"],L=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function U(e,t){return"string"==typeof e?function(e){let t=L.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?F(e):"number"==typeof e?F({[t||"milliseconds"]:e}):null}function F(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function z(e){return V(e)/864e5}function V(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function W(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}const{hasOwnProperty:G}=Object.prototype;function q(e,t){let n={};if(t)for(let r in t)if(t[r]===Fe){let t=[];for(let i=e.length-1;i>=0;i-=1){let o=e[i][r];if("object"==typeof o&&o)t.unshift(o);else if(void 0!==o){n[r]=o;break}}t.length&&(n[r]=q(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function Y(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Q(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function Z(e){let t=[];for(let n in e)t.push(e[n]);return t}function X(e,t){if(e===t)return!0;for(let n in e)if(G.call(e,n)&&!(n in t))return!1;for(let n in t)if(G.call(t,n)&&e[n]!==t[n])return!1;return!0}const $=/^on[A-Z]/;function J(e,t){let n=[];for(let r in e)G.call(e,r)&&(r in t||n.push(r));for(let r in t)G.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function K(e,t,n={}){if(e===t)return!0;for(let s in t)if(!(s in e&&(r=e[s],i=t[s],o=n[s],r===i||!0===o||o&&o(r,i))))return!1;var r,i,o;for(let n in e)if(!(n in t))return!1;return!0}function ee(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let o=t;o10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",be(t,!0)))),r}function Ee(e){return e.toISOString().replace(/T.*$/,"")}function be(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?`${n+N(i,2)}:${N(o,2)}`:`GMT${n}${i}${o?`:${N(o,2)}`:""}`}function _e(e,t,n){let r,i;return function(...o){if(r){if(!te(r,o)){n&&n(i);let r=e.apply(this,o);t&&t(r,i)||(i=r)}}else i=e.apply(this,o);return r=o,i}}function Se(e,t,n){let r,i;return o=>{if(r){if(!X(r,o)){n&&n(i);let r=e.call(this,o);t&&t(r,i)||(i=r)}}else i=e.call(this,o);return r=o,i}}const Ae={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},De={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Ce=/\s*([ap])\.?m\.?/i,we=/,/g,Re=/\s+/g,Te=/\u200e/g,Me=/UTC|GMT/;class Oe{constructor(e){let t={},n={},r=0;for(let i in e)i in Ae?(n[i]=e[i],r=Math.max(Ae[i],r)):(t[i]=e[i],i in De&&(r=Math.max(De[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=_e(xe)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:o}=this,s=(a=e.marker,l=t.marker,(c=n.calendarSystem).getMarkerYear(a)!==c.getMarkerYear(l)?5:c.getMarkerMonth(a)!==c.getMarkerMonth(l)?4:c.getMarkerDay(a)!==c.getMarkerDay(l)?2:ve(a)!==ve(l)?1:0);var a,l,c;if(!s)return this.format(e,n);let d=s;!(d>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(d=1);let u=this.format(e,n),h=this.format(t,n);if(u===h)return u;let f=xe(function(e,t){let n={};for(let r in e)(!(r in De)||De[r]<=t)&&(n[r]=e[r]);return n}(i,d),o,n),p=f(e),g=f(t),m=function(e,t,n,r){let i=0;for(;ibe(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let o=[];return"long"===i?o.push(n):"short"!==i&&"narrow"!==i||o.push(t),"long"!==i&&"short"!==i||o.push(" "),o.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&o.reverse(),o.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit")),"long"===e.timeZoneName&&(e.timeZoneName="short"),t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return o=>{let s,{marker:a}=o;return s=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){return e=e.replace(Te,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;return e=e.replace(Me,(()=>(n=!0,t))),n||(e+=` ${t}`),e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":be(t.timeZoneOffset))),r.omitCommas&&(e=e.replace(we,"").trim()),r.omitZeroMinute&&(e=e.replace(":00","")),!1===r.meridiem?e=e.replace(Ce,"").trim():"narrow"===r.meridiem?e=e.replace(Ce,((e,t)=>t.toLocaleLowerCase())):"short"===r.meridiem?e=e.replace(Ce,((e,t)=>`${t.toLocaleLowerCase()}m`)):"lowercase"===r.meridiem&&(e=e.replace(Ce,(e=>e.toLocaleLowerCase()))),e=(e=e.replace(Re," ")).trim()}(s.format(a),o,e,t,n)}}(e,t,n)}function ke(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function Ie(e,t,n,r){let i=ke(e,n.calendarSystem);return{date:i,start:i,end:t?ke(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class Ne{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,Ie(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,Ie(e,t,n,r))}}class Pe{constructor(e){this.func=e}format(e,t,n){return this.func(Ie(e,null,t,n))}formatRange(e,t,n,r){return this.func(Ie(e,t,n,r))}}function He(e){return"object"==typeof e&&e?new Oe(e):"string"==typeof e?new Ne(e):"function"==typeof e?new Pe(e):null}const Be={navLinkDayClick:Ge,navLinkWeekClick:Ge,duration:U,bootstrapFontAwesome:Ge,buttonIcons:Ge,customButtons:Ge,defaultAllDayEventDuration:U,defaultTimedEventDuration:U,nextDayThreshold:U,scrollTime:U,scrollTimeReset:Boolean,slotMinTime:U,slotMaxTime:U,dayPopoverFormat:He,slotDuration:U,snapDuration:U,headerToolbar:Ge,footerToolbar:Ge,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:He,dayHeaderClassNames:Ge,dayHeaderContent:Ge,dayHeaderDidMount:Ge,dayHeaderWillUnmount:Ge,dayCellClassNames:Ge,dayCellContent:Ge,dayCellDidMount:Ge,dayCellWillUnmount:Ge,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:Ge,weekNumbers:Boolean,weekNumberClassNames:Ge,weekNumberContent:Ge,weekNumberDidMount:Ge,weekNumberWillUnmount:Ge,editable:Boolean,viewClassNames:Ge,viewDidMount:Ge,viewWillUnmount:Ge,nowIndicator:Boolean,nowIndicatorClassNames:Ge,nowIndicatorContent:Ge,nowIndicatorDidMount:Ge,nowIndicatorWillUnmount:Ge,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:Ge,locale:Ge,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:Ge,eventOrder:O,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:Ge,contentHeight:Ge,direction:String,weekNumberFormat:He,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:Ge,initialDate:Ge,now:Ge,eventDataTransform:Ge,stickyHeaderDates:Ge,stickyFooterScrollbar:Ge,viewHeight:Ge,defaultAllDay:Boolean,eventSourceFailure:Ge,eventSourceSuccess:Ge,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:Ge,eventConstraint:Ge,eventAllow:Ge,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:Ge,eventContent:Ge,eventDidMount:Ge,eventWillUnmount:Ge,selectConstraint:Ge,selectOverlap:Ge,selectAllow:Ge,droppable:Boolean,unselectCancel:String,slotLabelFormat:Ge,slotLaneClassNames:Ge,slotLaneContent:Ge,slotLaneDidMount:Ge,slotLaneWillUnmount:Ge,slotLabelClassNames:Ge,slotLabelContent:Ge,slotLabelDidMount:Ge,slotLabelWillUnmount:Ge,dayMaxEvents:Ge,dayMaxEventRows:Ge,dayMinWidth:Number,slotLabelInterval:U,allDayText:String,allDayClassNames:Ge,allDayContent:Ge,allDayDidMount:Ge,allDayWillUnmount:Ge,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:He,rerenderDelay:Number,moreLinkText:Ge,moreLinkHint:Ge,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:Ge,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:U,hiddenDays:Ge,fixedWeekCount:Boolean,validRange:Ge,visibleRange:Ge,titleFormat:Ge,eventInteractive:Boolean,noEventsText:String,viewHint:Ge,navLinkHint:Ge,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:Ge,moreLinkClassNames:Ge,moreLinkContent:Ge,moreLinkDidMount:Ge,moreLinkWillUnmount:Ge,monthStartFormat:He,handleCustomRendering:Ge,customRenderingMetaMap:Ge,customRenderingReplacesEl:Boolean},je={datesSet:Ge,eventsSet:Ge,eventAdd:Ge,eventChange:Ge,eventRemove:Ge,windowResize:Ge,eventClick:Ge,eventMouseEnter:Ge,eventMouseLeave:Ge,select:Ge,unselect:Ge,loading:Ge,_unmount:Ge,_beforeprint:Ge,_afterprint:Ge,_noEventDrop:Ge,_noEventResize:Ge,_resize:Ge,_scrollRequest:Ge},Le={buttonText:Ge,buttonHints:Ge,views:Ge,plugins:Ge,initialEvents:Ge,events:Ge,eventSources:Ge},Ue={headerToolbar:Fe,footerToolbar:Fe,buttonText:Fe,buttonHints:Fe,buttonIcons:Fe,dateIncrement:Fe,plugins:ze,events:ze,eventSources:ze,resources:ze};function Fe(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?X(e,t):e===t}function ze(e,t){return Array.isArray(e)&&Array.isArray(t)?te(e,t):e===t}const Ve={type:String,component:Ge,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:Ge,usesMinMaxTime:Boolean,classNames:Ge,content:Ge,didMount:Ge,willUnmount:Ge};function We(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function Ge(e){return e}function qe(e,t,n,r){return{instanceId:M(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function Ye(e,t,n){let{dateEnv:r,pluginHooks:i,options:o}=n,{defs:s,instances:a}=e;a=Y(a,(e=>!s[e.defId].recurringDef));for(let e in s){let n=s[e];if(n.recurringDef){let{duration:s}=n.recurringDef;s||(s=n.allDay?o.defaultAllDayEventDuration:o.defaultTimedEventDuration);let l=Qe(n,s,t,r,i.recurringTypes);for(let t of l){let n=qe(e,{start:t,end:r.add(t,s)});a[n.instanceId]=n}}}return{defs:s,instances:a}}function Qe(e,t,n,r,i){let o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map(ce)),o}function Ze(e,t,n,r,i,o){let s={defs:{},instances:{}},a=ut(n);for(let l of e){let e=ct(l,t,n,r,a,i,o);e&&Xe(e,s)}return s}function Xe(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function $e(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=Ke(e,(e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r}));return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function Je(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function Ke(e,t){let n=Y(e.defs,t),r=Y(e.instances,(e=>n[e.defId]));return{defs:n,instances:r}}function et(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const tt={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:Ge,overlap:Ge,allow:Ge,className:et,classNames:et,color:String,backgroundColor:String,borderColor:String,textColor:String},nt={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function rt(e,t){let n=function(e,t){return Array.isArray(e)?Ze(e,null,t,!0):"object"==typeof e&&e?Ze([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function it(e){return e.reduce(ot,nt)}function ot(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const st={id:String,groupId:String,title:String,url:String,interactive:Boolean},at={start:Ge,end:Ge,date:Ge,allDay:Boolean},lt=Object.assign(Object.assign(Object.assign({},st),at),{extendedProps:Ge});function ct(e,t,n,r,i=ut(n),o,s){let{refined:a,extra:l}=dt(e,n,i),c=function(e,t){let n=null;return e&&(n=e.defaultAllDay),null==n&&(n=t.options.defaultAllDay),n}(t,n),d=function(e,t,n,r){for(let i=0;i=V(t)&&(r=re(r,1))}return e.start&&(n=ce(e.start),r&&r<=n&&(r=re(n,1))),{start:n,end:r}}function mt(e,t,n,r){return"year"===r?U(n.diffWholeYears(e,t),"year"):"month"===r?U(n.diffWholeMonths(e,t),"month"):se(e,t)}function vt(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),yt}const bt={defs:{},instances:{}};function _t(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":it(r)};return n&&Object.assign(i,n),i}function St(e,t){let n,r,i=[],{start:o}=t;for(e.sort(At),n=0;no&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return ot.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Tt(e,t){return(null===e.start||t>=e.start)&&(null===e.end||tn:!!t&&e>=t.end)}}function Ot(e,t){let n=["fc-day",`fc-day-${ne[e.dow]}`];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}const xt=He({year:"numeric",month:"long",day:"numeric"}),kt=He({week:"long"});function It(e,t,n="day",r=!0){const{dateEnv:i,options:o,calendarApi:s}=e;let a=i.format(t,"week"===n?kt:xt);if(o.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?o.navLinkDayClick:"week"===n?o.navLinkWeekClick:null;"function"==typeof r?r.call(s,i.toDate(t),e):("string"==typeof r&&(n=r),s.zoomTo(t,n))};return Object.assign({title:P(o.navLinkHint,[a,e],a),"data-navlink":""},r?w(l):{onClick:l})}return{"aria-label":a}}let Nt,Pt=null;function Ht(){return null===Pt&&(Pt=function(){let e=document.createElement("div");y(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return f(e),t}()),Pt}function Bt(){return Nt||(Nt=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=jt(e);return document.body.removeChild(e),t}()),Nt}function jt(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Lt(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,s=parseInt(n.borderBottomWidth,10)||0,a=jt(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:o,borderBottom:s,scrollbarBottom:a.x-o-s,scrollbarLeft:0,scrollbarRight:0};return Ht()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function Ut(e){let t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function Ft(e){let t=[];for(;e instanceof HTMLElement;){let n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}class zt{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((e=>e!==n))):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}function Vt(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;r0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()0}canScrollRight(){return this.getScrollLeft(){this.props.value!==t.value&&e.forEach((e=>{e.context=t.value,e.forceUpdate()}))},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class Qt{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Zt=Yt({});class Xt extends r.Component{shouldComponentUpdate(e,t){return this.debug&&console.log(J(e,this.props),J(t,this.state)),!K(this.props,e,this.propEquality)||!K(this.state,t,this.stateEquality)}safeSetState(e){K(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}Xt.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},Xt.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},Xt.contextType=Zt,Xt.prototype.propEquality={},Xt.prototype.stateEquality={};class $t extends Xt{}function Jt(e,t){"function"==typeof e?e(t):e&&(e.current=t)}$t.contextType=Zt;class Kt extends $t{constructor(){super(...arguments),this.uid=M()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!p(e,".fc-event-mirror")}isValidDateDownEl(e){return!(p(e,".fc-event:not(.fc-bg-event)")||p(e,".fc-more-link")||p(e,"a[data-navlink]")||p(e,".fc-popover"))}}function en(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}function tn(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},nn(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function nn(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},Dn(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function rn(e,t,n){let{dateEnv:r,options:i}=n,o=t;return e?(o=ce(o),o=r.add(o,i.defaultAllDayEventDuration)):o=r.add(o,i.defaultTimedEventDuration),o}function on(e,t,n,r){let i=pn(e.defs,t),o={defs:{},instances:{}};for(let t in e.defs){let s=e.defs[t];o.defs[t]=sn(s,i[t],n,r)}for(let t in e.instances){let s=e.instances[t],a=o.defs[s.defId];o.instances[t]=an(s,a,i[s.defId],n,r)}return o}function sn(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let o=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(o.extendedProps=Object.assign(Object.assign({},o.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(o,n,r);return!o.hasEnd&&r.options.forceEventDuration&&(o.hasEnd=!0),o}function an(e,t,n,r,i){let{dateEnv:o}=i,s=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return s&&(l.range=pt(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:o.add(l.range.start,r.datesDelta),end:o.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:o.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:o.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:rn(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:ce(l.range.start),end:ce(l.range.end)}),l.range.endgn(e,t)))}function gn(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),it(n)}function mn(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,o=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:o,duration:o-i,allDay:Number(n.allDay),_seg:e})}function vn(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:o}=e.eventRange,s=o.startEditable;for(let e of r)s=e(s,i,o,t);return s}function yn(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function En(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function bn(e,t,n,r,i,o,s){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:d}=l,u=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==d&&(d=!1!==i);let f=h.range.start,p=h.range.end,g=o||e.start||e.eventRange.range.start,m=s||e.end||e.eventRange.range.end,v=ce(f).valueOf()===ce(g).valueOf(),y=ce(ie(p,-1)).valueOf()===ce(ie(m,-1)).valueOf();return c&&!u.allDay&&(v||y)?(g=v?f:g,m=y?p:m,d&&u.hasEnd?a.formatRange(g,m,t,{forcedStartTzo:o?null:h.forcedStartTzo,forcedEndTzo:s?null:h.forcedEndTzo}):a.format(g,t,{forcedTzo:o?null:h.forcedStartTzo})):""}function _n(e){let t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function Sn(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:o,options:s}=t,{eventInteractive:a}=s;return null==a&&(a=n.interactive,null==a&&(a=Boolean(o.hasHandlers("eventClick")))),a?R((e=>{o.trigger("eventClick",{el:e.target,event:new cn(t,n,r),jsEvent:e,view:t.viewApi})})):{}}const An={start:Ge,end:Ge,allDay:Boolean};function Dn(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}let Cn={};var wn;wn=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return ge(e)}markerToArray(e){return pe(e)}},Cn.gregory=wn;const Rn=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Tn(e){let t=Rn.exec(e);if(t){let e=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number(`0.${t[12]}`):0));if(me(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}function Mn(e){return e.span.end}function On(e){return e.index+":"+e.span.start}function xn(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return nn(e[i-1]))return[i,0];for(;rs))return[o,1];r=o+1}}return[r,0]}const Nn={startTime:U,duration:U,create:Boolean,sourceId:String};function Pn(e,t){return He(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const Hn="fc-col-header-cell";function Bn(e){return e.text}class jn extends $t{constructor(){super(...arguments),this.id=M(),this.queuedDomNodes=[],this.currentDomNodes=[],this.handleEl=e=>{this.props.elRef&&Jt(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{customGenerator:i,defaultGenerator:o,renderProps:s}=e,a=Un(e);let l,c,d=!1,u=[];if(null!=i){const e="function"==typeof i?i(s,r.createElement):i;if(!0===e)d=!0;else{const t=e&&"object"==typeof e;t&&"html"in e?a.dangerouslySetInnerHTML={__html:e.html}:t&&"domNodes"in e?u=Array.prototype.slice.call(e.domNodes):t||"function"==typeof e?c=e:l=e}}else d=!Ln(e.generatorName,n);return d&&o&&(l=o(s)),this.queuedDomNodes=u,this.currentGeneratorMeta=c,r.createElement(e.elTag,a,l)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){var t;const{props:n,context:r}=this,{handleCustomRendering:i,customRenderingMetaMap:o}=r.options;if(i){const r=null!==(t=this.currentGeneratorMeta)&&void 0!==t?t:null==o?void 0:o[n.generatorName];r&&i(Object.assign(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:r},n),{elClasses:(n.elClasses||[]).filter(Fn)}))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!te(e,t)){t.forEach(f);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Ln(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Un(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}function Fn(e){return Boolean(e)}jn.addPropsEquality({elClasses:te,elStyle:X,elAttrs:function(e,t){const n=J(e,t);for(let e of n)if(!$.test(e))return!1;return!0},renderProps:X});const zn=Yt(0);class Vn extends r.Component{constructor(){super(...arguments),this.InnerContent=Wn.bind(void 0,this),this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Jt(this.props.elRef,e)}}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Un(e,t),i=e.children(this.InnerContent,e.renderProps,n);return e.elTag?r.createElement(e.elTag,n,i):i}return r.createElement(jn,Object.assign(Object.assign({},e),{elRef:this.handleRootEl,elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}}function Wn(e,t){const n=e.props;return r.createElement(jn,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,customGenerator:n.customGenerator,defaultGenerator:n.defaultGenerator,renderId:e.context},t))}Vn.contextType=zn;class Gn extends $t{render(){let{dateEnv:e,options:t,theme:n,viewApi:i}=this.context,{props:o}=this,{date:s,dateProfile:a}=o,l=Mt(s,o.todayRange,null,a),c=[Hn].concat(Ot(l,n)),d=e.format(s,o.dayHeaderFormat),u=!l.isDisabled&&o.colCnt>1?It(this.context,s):{},h=Object.assign(Object.assign(Object.assign({date:e.toDate(s),view:i},o.extraRenderProps),{text:d}),l);return r.createElement(Vn,{elTag:"th",elClasses:c,elAttrs:Object.assign({role:"columnheader",colSpan:o.colSpan,"data-date":l.isDisabled?void 0:Ee(s)},o.extraDataAttrs),renderProps:h,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:Bn,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},(e=>r.createElement("div",{className:"fc-scrollgrid-sync-inner"},!l.isDisabled&&r.createElement(e,{elTag:"a",elAttrs:u,elClasses:["fc-col-header-cell-cushion",o.isSticky&&"fc-sticky"]}))))}}const qn=He({weekday:"long"});class Yn extends $t{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:i,options:o}=this.context,s=re(new Date(2592e5),e.dow),a={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},l=t.format(s,e.dayHeaderFormat),c=Object.assign(Object.assign(Object.assign(Object.assign({date:s},a),{view:i}),e.extraRenderProps),{text:l});return r.createElement(Vn,{elTag:"th",elClasses:[Hn,...Ot(a,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:c,generatorName:"dayHeaderContent",customGenerator:o.dayHeaderContent,defaultGenerator:Bn,classNameGenerator:o.dayHeaderClassNames,didMount:o.dayHeaderDidMount,willUnmount:o.dayHeaderWillUnmount},(n=>r.createElement("div",{className:"fc-scrollgrid-sync-inner"},r.createElement(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(s,qn)}}))))}}class Qn extends r.Component{constructor(e,t){super(e,t),this.initialNowDate=en(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=ie(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,U(1,e.unit)),o=i.valueOf()-n.valueOf();return o=Math.min(864e5,o),{currentState:{nowDate:r,todayRange:Zn(r)},nextState:{nowDate:i,todayRange:Zn(i)},waitMs:o}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout((()=>{this.setState(e,(()=>{this.setTimeout()}))}),t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function Zn(e){let t=ce(e);return{start:t,end:re(t,1)}}function Xn(e,t,n){return e||Pn(t,n)}function $n(e,t){let n=e.activeRange;return t?n:{start:ie(n.start,e.slotMinTime.milliseconds),end:ie(n.end,e.slotMaxTime.milliseconds-864e5)}}function Jn(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;return i&&(e=Kn(e,i)),r&&(e=Kn(e,r)),e}function Kn(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function er(e,t){return Ke(e,(e=>e.sourceId!==t))}function tr(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||nr)(r,t)}function nr(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),o=e.eventDrag,s=o.mutatedEvents,a=s.defs,l=s.instances,c=pn(a,o.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=Q(c,r));let d=(p=e.eventStore,g=o.affectedEvents.instances,{defs:p.defs,instances:Y(p.instances,(e=>!g[e.instanceId]))}),u=d.defs,h=d.instances,f=pn(u,e.eventUiBases);var p,g;for(let r in l){let s=l[r],p=s.range,g=c[s.defId],m=a[s.defId];if(!rr(g.constraints,p,d,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,y="function"==typeof v?v:null;for(let e in h){let n=h[e];if(wt(p,n.range)){if(!1===f[n.defId].overlap&&o.isEvent)return!1;if(!1===g.overlap)return!1;if(y&&!y(new cn(t,u[n.defId],n),new cn(t,m,s)))return!1}}let E=i.eventStore;for(let e of g.allows){let i,o=Object.assign(Object.assign({},n),{range:s.range,allDay:m.allDay}),a=E.defs[m.defId],l=E.instances[r];if(i=a?new cn(t,a,l):new cn(t,m),!e(nn(o,t),i))return!1}}return!0}(e,t,n,r)||e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,o=i.defs,s=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();if(r&&(c=r(c)),!rr(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:d}=t.options,u="function"==typeof d?d:null;for(let e in s){let n=s[e];if(wt(l,n.range)){if(!1===c.overlap)return!1;if(u&&!u(new cn(t,o[n.defId],n),null))return!1}}for(let e of c.allows)if(!e(nn(Object.assign(Object.assign({},n),a),t),null))return!1;return!0}(e,t,n,r))}function rr(e,t,n,r,i){for(let o of e)if(!sr(ir(o,t,n,r,i),t))return!1;return!0}function ir(e,t,n,r,i){return"businessHours"===e?or(Ye(r,t,i)):"string"==typeof e?or(Ke(n,(t=>t.groupId===e))):"object"==typeof e&&e?or(Ye(e,t,i)):[]}function or(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function sr(e,t){for(let n of e)if(Rt(n,t))return!0;return!1}Qn.contextType=Zt;class ar extends Error{constructor(e,t){super(e),this.response=t}}const lr=/^(visible|hidden)$/;class cr extends $t{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,Jt(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,i=t&&n,o=["fc-scroller"];return t&&(n?o.push("fc-scroller-liquid-absolute"):o.push("fc-scroller-liquid")),r.createElement("div",{ref:this.handleEl,className:o.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:i&&-(e.overcomeLeft||0)||"",right:i&&-(e.overcomeRight||0)||"",bottom:i&&-(e.overcomeBottom||0)||"",marginLeft:!i&&-(e.overcomeLeft||0)||"",marginRight:!i&&-(e.overcomeRight||0)||"",marginBottom:!i&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(lr.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0;return!1}needsYScrolling(){if(lr.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0;return!1}getXScrollbarWidth(){return lr.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return lr.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class dr{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,o=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,o=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),o&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return ee(this.currentMap,e,t,n)}getAll(){return Z(this.currentMap)}}function ur(e){let t=m(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,B(e));return Math.ceil(n)}function hr(e,t){return e.liquid&&t.liquid}function fr(e,t){return null!=t.maxHeight||hr(e,t)}function pr(e,t,n,i){let{expandRows:o}=n;return"function"==typeof t.content?t.content(n):r.createElement("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:o?n.clientHeight:""}},n.tableColGroupNode,r.createElement(i?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function gr(e,t){return te(e,t,X)}function mr(e,t){let n=[];for(let i of e){let e=i.span||1;for(let o=0;oe),gr),this.renderMicroColGroup=_e(mr),this.scrollerRefs=new dr,this.scrollerElRefs=new dr(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,i=e.sections||[],o=this.processCols(e.cols),s=this.renderMicroColGroup(o,t.shrinkWidth),a=Er(e.liquid,n);e.collapsibleWidth&&a.push("fc-scrollgrid-collapsible");let l,c=i.length,d=0,u=[],h=[],f=[];for(;d{}},i);return r.createElement(i?"th":"td",{ref:n.elRef,role:"presentation"},r.createElement("div",{className:"fc-scroller-harness"+(d?" fc-scroller-harness-liquid":"")},r.createElement(cr,{ref:this.scrollerRefs.createRef(h),elRef:this.scrollerElRefs.createRef(h),overflowY:u,overflowX:o.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:d,liquidIsAbsolute:!0},f)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&Jt(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return yr(this.props.cols)?ur(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=Bt(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},o={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let s=t.key,a=n.currentMap[s];if(a){let t=a.parentNode;i[s]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),o[s]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:o}}}_r.addStateEquality({scrollerClientWidths:X,scrollerClientHeights:X});class Sr extends $t{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&fn(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{eventRange:o}=i,{ui:s}=o,a={event:new cn(t,o.def,o.instance),view:t.viewApi,timeText:e.timeText,textColor:s.textColor,backgroundColor:s.backgroundColor,borderColor:s.borderColor,isDraggable:!e.disableDragging&&vn(i,t),isStartResizable:!e.disableResizing&&yn(i,t),isEndResizable:!e.disableResizing&&En(i),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(i.isStart),isEnd:Boolean(i.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return r.createElement(Vn,Object.assign({},e,{elRef:this.handleEl,elClasses:[..._n(a),...i.eventRange.ui.classNames,...e.elClasses||[]],renderProps:a,generatorName:"eventContent",customGenerator:n.eventContent,defaultGenerator:e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&fn(this.el,this.props.seg)}}function Ar(e){return r.createElement("div",{className:"fc-event-main-frame"},e.timeText&&r.createElement("div",{className:"fc-event-time"},e.timeText),r.createElement("div",{className:"fc-event-title-container"},r.createElement("div",{className:"fc-event-title fc-sticky"},e.event.title||r.createElement(r.Fragment,null," "))))}const Dr=He({day:"numeric"});class Cr extends $t{constructor(){super(...arguments),this.refineRenderProps=Se(Rr)}render(){let{props:e,context:t}=this,{options:n}=t,i=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,isMonthStart:e.isMonthStart||!1,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv,monthStartFormat:n.monthStartFormat});return r.createElement(Vn,Object.assign({},e,{elClasses:[...Ot(i,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),i.isDisabled?{}:{"data-date":Ee(e.date)}),renderProps:i,generatorName:"dayCellContent",customGenerator:n.dayCellContent,defaultGenerator:e.defaultGenerator,classNameGenerator:i.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function wr(e){return Boolean(e.dayCellContent||Ln("dayCellContent",e))}function Rr(e){let{date:t,dateEnv:n,dateProfile:r,isMonthStart:i}=e,o=Mt(t,e.todayRange,null,r),s=e.showDayNumber?n.format(t,i?e.monthStartFormat:Dr):"";return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},o),{isMonthStart:i,dayNumberText:s}),e.extraRenderProps)}function Tr(e){let{title:t}=e.event;return t&&r.createElement("div",{className:"fc-event-title"},e.event.title)}function Mr(e){return e.text}class Or extends $t{constructor(){super(...arguments),this.state={titleId:S()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&Jt(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=b(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:o}=this,s=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return i.createPortal(r.createElement("div",Object.assign({},n.extraAttrs,{id:n.id,className:s.join(" "),"aria-labelledby":o.titleId,ref:this.handleRootEl}),r.createElement("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},r.createElement("span",{className:"fc-popover-title",id:o.titleId},n.title),r.createElement("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),r.createElement("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=Ft(e),n=e.getBoundingClientRect();for(let e of t){let t=vt(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(i){let o=r.getBoundingClientRect(),s=n?p(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-o.width:i.left;s=Math.max(s,10),a=Math.min(a,document.documentElement.clientWidth-10-o.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();y(r,{top:s-l.top,left:a-l.left})}}}class xr extends Kt{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:i,todayRange:o,dateProfile:s}=n,a=t.format(i,e.dayPopoverFormat);return r.createElement(Cr,{elRef:this.handleRootEl,date:i,dateProfile:s,todayRange:o},((t,i,o)=>r.createElement(Or,{elRef:o.ref,id:n.id,title:a,extraClassNames:["fc-more-popover"].concat(o.className||[]),extraAttrs:o,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},wr(e)&&r.createElement(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children)))}queryHit(e,t,n,r){let{rootEl:i,props:o}=this;return e>=0&&e=0&&tt.eventRange.range.end?e:t}function Br(e){return[`fc-${e.type}-view`,"fc-view"]}const jr={id:String,defaultAllDay:Boolean,url:String,format:String,events:Ge,eventDataTransform:Ge,success:Ge,failure:Ge};function Lr(e,t,n=Ur(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:o}=We(r,n),s=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:M(),sourceDefId:s.sourceDefId,meta:s.meta,ui:rt(i,t),extendedProps:o}}return null}function Ur(e){return Object.assign(Object.assign(Object.assign({},tt),jr),e.pluginHooks.eventSourceRefiners)}class Fr{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}t.BASE_OPTION_DEFAULTS={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30,monthStartFormat:{month:"long",day:"numeric"}},t.BASE_OPTION_REFINERS=Be,t.BaseComponent=$t,t.BgEvent=class extends $t{render(){let{props:e}=this,{seg:t}=e;return r.createElement(Sr,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:Tr,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}},t.CALENDAR_LISTENER_REFINERS=je,t.CALENDAR_OPTION_REFINERS=Le,t.COMPLEX_OPTION_COMPARATORS=Ue,t.CalendarImpl=class{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering((()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})}))}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),o=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)o.push(e);for(t=0;t{this.dispatch({type:"REMOVE_EVENTS",eventStore:dn(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let o=n[i];if(o.publicId===e){if(o.recurringDef)return new cn(t,o,null);for(let e in r){let n=r[e];if(n.defId===o.defId)return new cn(t,o,n)}}}return null}getEvents(){let e=this.getCurrentData();return un(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new ln(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new ln(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof ln)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=Lr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new ln(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=U(e);t&&this.trigger("_scrollRequest",{time:t})}},t.CalendarRoot=class extends $t{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,o=["fc",n?"fc-media-print":"fc-media-screen",`fc-direction-${t.direction}`,e.theme.getClass("root")];return Et()||o.push("fc-liquid-hack"),e.children(o,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}},t.ContentContainer=Vn,t.CustomRenderingStore=class extends Fr{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}},t.DateComponent=Kt,t.DateEnv=class{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Cn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):ge(he(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=ge(e)),null!==t&&me(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Tn(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}getDay(e){return this.calendarSystem.getMarkerDay(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return ve(e)===ve(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return ve(e)===ve(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=ae(e,t),null!==n?{unit:"week",value:n}:(n=le(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),H(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),H(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),H(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(z(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/(z(n)/30):n.days&&(r=le(e,t),null!==r)?r/z(n):(t.valueOf()-e.valueOf())/V(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?ce(e):"hour"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=de(e,r,t,n);if(i<1)return de(e,r-1,t,n);let o=de(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=ie(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),ye(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?ge(he(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ge(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-fe(pe(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(pe(e)):null}toDate(e,t){return"local"===this.timeZone?fe(pe(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(pe(e))*60):new Date(e.valueOf()-(t||0))}},t.DateProfileGenerator=class{constructor(e){this.props=e,this.nowDate=en(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,o,s,a,l,{props:c}=this;var d,u;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(u=r).start&&d=u.end?new Date(u.end.valueOf()-1):d),i=this.buildCurrentRangeInfo(e,t),o=/^(year|month|week|day)$/.test(i.unit),s=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,o),s=this.trimHiddenDays(s),a=s,c.showNonCurrentDates||(a=Dt(a,i.range)),a=this.adjustActiveRange(a),a=Dt(a,r),l=wt(i.range,r),Tt(s,e)||(e=s.start),{currentDate:e,validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:o,activeRange:a,renderRange:s,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,o=null,s=null;return r.duration?(i=r.duration,o=r.durationUnit,s=this.buildRangeFromDuration(e,t,i,o)):(n=this.props.dayCount)?(o="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?o=r.dateEnv.greatestWholeUnit(s.start,s.end).unit:(i=this.getFallbackDuration(),o=W(i).unit,s=this.buildRangeFromDuration(e,t,i,o)),{duration:i,unit:o,range:s}}getFallbackDuration(){return U({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:o,end:s}=e;return n&&(z(r)<0&&(o=ce(o),o=t.add(o,r)),z(i)>1&&(s=ce(s),s=re(s,-1),s=t.add(s,i))),{start:o,end:s}}buildRangeFromDuration(e,t,n,r){let i,o,s,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&V(e)r.createElement("tr",{role:"row"},o&&o("day"),t.map((e=>i?r.createElement(Gn,{key:e.toISOString(),date:e,dateProfile:n,todayRange:a,colCnt:t.length,dayHeaderFormat:s}):r.createElement(Yn,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:s}))))))}},t.DaySeriesModel=class{constructor(e,t){let n=e.start,{end:r}=e,i=[],o=[],s=-1;for(;n=t.length?t[t.length-1]+1:t[n]}},t.DayTableModel=class{constructor(e,t){let n,r,i,{dates:o}=e;if(t){for(r=o[0].getUTCDay(),n=1;n{this.linkEl=e,this.props.elRef&&Jt(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=Ir(t).start;function o(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new cn(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(o),hiddenSegs:t.hiddenSegs.map(o),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return r.createElement(Zt.Consumer,null,(n=>{let{viewApi:i,options:o,calendarApi:s}=n,{moreLinkText:a}=o,{moreCnt:l}=e,c=Ir(e),d="function"==typeof a?a.call(s,l):`+${l} ${a}`,u=P(o.moreLinkHint,[l],d),h={num:l,shortText:`+${l}`,text:d,view:i};return r.createElement(r.Fragment,null,Boolean(e.moreCnt)&&r.createElement(Vn,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),w(this.handleClick)),{title:u,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:h,generatorName:"moreLinkContent",customGenerator:o.moreLinkContent,defaultGenerator:e.defaultGenerator||kr,classNameGenerator:o.moreLinkClassNames,didMount:o.moreLinkDidMount,willUnmount:o.moreLinkWillUnmount},e.children),t.isPopoverOpen&&r.createElement(xr,{id:t.popoverId,startDate:c.start,endDate:c.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,forceTimed:e.forceTimed,onClose:this.handlePopoverClose},e.popoverContent()))}))}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=p(this.linkEl,".fc-view-harness"))}},t.NamedTimeZoneImpl=class{constructor(e){this.timeZoneName=e}},t.NowIndicatorContainer=e=>r.createElement(Zt.Consumer,null,(t=>{let{options:n}=t,i={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return r.createElement(Vn,Object.assign({},e,{elTag:e.elTag||"div",renderProps:i,generatorName:"nowIndicatorContent",customGenerator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))})),t.NowTimer=Qn,t.PositionCache=class{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t=n[t]&&e=n[t]&&es.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:s.end,end:o.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:xn(s,o)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(kn(r,t.level,t.levelCoord),kn(n,t.level,[e])):kn(n[t.level],t.lateral,e),this.stackCnts[On(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,o=t.length,s=0,a=-1,l=-1,c=null,d=0;for(let u=0;u=s+e.thickness)break;let h,f=n[u],p=In(f,e.span.start,Mn),g=p[0]+p[1];for(;(h=f[g])&&h.span.starts&&(s=e,c=h,a=u,l=g),e===s&&(d=Math.max(d,i[On(h)]+1)),g+=1}}let u=0;if(c)for(u=a+1;uthis.eventUiBuilders[t]||_e(_t)));for(let n in t){let c=t[n],d=o[n]||bt,u=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:d,eventUiBases:u(e.eventUiBases[""],c.ui,i[n]),eventSelection:d.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return Q(e.defs,(e=>this.getKeysForEventDef(e)))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=r=>{t[r]||(t[r]={affectedEvents:n[r]||bt,mutatedEvents:i[r]||bt,isEvent:e.isEvent})};for(let e in n)o(e);for(let e in i)o(e)}return t}},t.StandardEvent=class extends $t{render(){let{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{ui:o}=i.eventRange,s=bn(i,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return r.createElement(Sr,Object.assign({},e,{elTag:"a",elStyle:{borderColor:o.borderColor,backgroundColor:o.backgroundColor},elAttrs:Sn(i,t),defaultGenerator:Ar,timeText:s}),((e,t)=>r.createElement(r.Fragment,null,r.createElement(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&r.createElement("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&r.createElement("div",{className:"fc-event-resizer fc-event-resizer-end"}))))}},t.TableDateCell=Gn,t.TableDowCell=Yn,t.Theme=Gt,t.VIEW_OPTION_REFINERS=Ve,t.ViewContainer=class extends $t{render(){let{props:e,context:t}=this,{options:n}=t,i={view:t.viewApi};return r.createElement(Vn,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...Br(e.viewSpec),...e.elClasses||[]],renderProps:i,classNameGenerator:n.viewClassNames,generatorName:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),(()=>e.children))}},t.ViewContextType=Zt,t.WeekNumberContainer=e=>r.createElement(Zt.Consumer,null,(t=>{let{dateEnv:n,options:i}=t,{date:o}=e,s=i.weekNumberFormat||e.defaultFormat,a={num:n.computeWeekNumber(o),text:n.format(o,s),date:o};return r.createElement(Vn,Object.assign({},e,{renderProps:a,generatorName:"weekNumberContent",customGenerator:i.weekNumberContent,defaultGenerator:Mr,classNameGenerator:i.weekNumberClassNames,didMount:i.weekNumberDidMount,willUnmount:i.weekNumberWillUnmount}))})),t.WindowScrollController=class extends Wt{getScrollTop(){return window.pageYOffset}getScrollLeft(){return window.pageXOffset}setScrollTop(e){window.scroll(window.pageXOffset,e)}setScrollLeft(e){window.scroll(e,window.pageYOffset)}getScrollWidth(){return document.documentElement.scrollWidth}getScrollHeight(){return document.documentElement.scrollHeight}getClientHeight(){return document.documentElement.clientHeight}getClientWidth(){return document.documentElement.clientWidth}},t.addDays=re,t.addDurations=function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},t.addMs=ie,t.addWeeks=function(e,t){let n=pe(e);return n[2]+=7*t,ge(n)},t.allowContextMenu=function(e){e.removeEventListener("contextmenu",A)},t.allowSelection=function(e){e.style.userSelect="",e.removeEventListener("selectstart",A)},t.applyMutationToEventStore=on,t.applyStyle=y,t.applyStyleProp=E,t.arrayToHash=function(e){let t={};for(let n of e)t[n]=!0;return t},t.asCleanDays=function(e){return e.years||e.months||e.milliseconds?0:e.days},t.asRoughMinutes=function(e){return V(e)/6e4},t.asRoughMs=V,t.asRoughSeconds=function(e){return V(e)/1e3},t.binarySearch=In,t.buildElAttrs=Un,t.buildEntryKey=On,t.buildEventApis=un,t.buildEventRangeKey=function(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`},t.buildEventSourceRefiners=Ur,t.buildIsoString=ye,t.buildNavLinkAttrs=It,t.buildRangeApiWithTimeZone=function(e,t,n){return Object.assign(Object.assign({},Dn(e,t,n)),{timeZone:t.timeZone})},t.buildSegTimeText=bn,t.buildViewClassNames=Br,t.buildViewContext=function(e,t,n,r,i,o,s,a,l,c,d,u,h){return{dateEnv:i,options:n,pluginHooks:s,emitter:c,dispatch:a,getCurrentData:l,calendarApi:d,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:o,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new Qt(e,c,U(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:u,unregisterInteractiveComponent:h}},t.collectFromHash=ee,t.combineEventUis=it,t.compareByFieldSpecs=x,t.compareNumbers=function(e,t){return e-t},t.compareObjs=K,t.computeEarliestSegStart=Nr,t.computeEdges=Lt,t.computeFallbackHeaderFormat=Pn,t.computeInnerRect=function(e,t=!1,n){let r=n?e.getBoundingClientRect():Ut(e),i=Lt(e,t),o={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(o.left+=i.paddingLeft,o.right-=i.paddingRight,o.top+=i.paddingTop,o.bottom-=i.paddingBottom),o},t.computeRect=Ut,t.computeShrinkWidth=ur,t.computeVisibleDayRange=gt,t.config={},t.constrainPoint=function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},t.createContext=Yt,t.createDuration=U,t.createEmptyEventStore=function(){return{defs:{},instances:{}}},t.createEventInstance=qe,t.createEventUi=rt,t.createFormatter=He,t.diffDates=mt,t.diffDayAndTime=se,t.diffDays=oe,t.diffPoints=function(e,t){return{left:e.left-t.left,top:e.top-t.top}},t.diffWeeks=function(e,t){return oe(e,t)/7},t.diffWholeDays=le,t.diffWholeWeeks=ae,t.disableCursor=function(){document.body.classList.add("fc-not-allowed")},t.elementClosest=p,t.elementMatches=g,t.enableCursor=function(){document.body.classList.remove("fc-not-allowed")},t.ensureElHasStyles=function(e){e.isConnected&&d(e.getRootNode())},t.eventTupleToStore=Xe,t.filterHash=Y,t.findDirectChildren=function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e=(n||t.end),isToday:t&&Tt(t,r.start)}},t.getSlotClassNames=function(e,t){let n=["fc-slot",`fc-slot-${ne[e.dow]}`];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},t.getStickyFooterScrollbar=function(e){let{stickyFooterScrollbar:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},t.getStickyHeaderDates=function(e){let{stickyHeaderDates:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},t.getUniqueDomId=S,t.greatestDurationDenominator=W,t.groupIntersectingEntries=function(e){let t=[];for(let i of e){let e=[],o={span:i.span,entries:[i]};for(let i of t)xn(i.span,o.span)?o={entries:i.entries.concat(o.entries),span:(n=i.span,r=o.span,{start:Math.min(n.start,r.start),end:Math.max(n.end,r.end)})}:e.push(i);e.push(o),t=e}var n,r;return t},t.guid=M,t.hasBgRendering=function(e){return"background"===e.ui.display||"inverse-background"===e.ui.display},t.hasCustomDayCellContent=wr,t.hasShrinkWidth=yr,t.hashValuesToArray=Z,t.identity=Ge,t.injectStyles=c,t.interactionSettingsStore={},t.interactionSettingsToStore=function(e){return{[e.component.uid]:e}},t.intersectRanges=Dt,t.intersectRects=vt,t.intersectSpans=xn,t.isArraysEqual=te,t.isColPropsEqual=gr,t.isDateSelectionValid=function(e,t,n){return!!Rt(t.validRange,e.range)&&tr({dateSelection:e},n)},t.isDateSpansEqual=function(e,t){return Ct(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)},t.isInt=H,t.isInteractionValid=function(e,t,n){let{instances:r}=e.mutatedEvents;for(let e in r)if(!Rt(t.validRange,r[e].range))return!1;return tr({eventDrag:e},n)},t.isMultiDayRange=function(e){let t=gt(e);return oe(t.start,t.end)>1},t.isPropsEqual=X,t.isPropsValid=nr,t.isValidDate=me,t.listenBySelector=D,t.listenToHoverBySelector=function(e,t,n,r){let i;return D(e,"mouseover",t,((e,t)=>{if(t!==i){i=t,n(e,t);let o=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",o)};t.addEventListener("mouseleave",o)}}))},t.mapHash=Q,t.memoize=_e,t.memoizeArraylike=function(e,t,n){let r=[],i=[];return o=>{let s=r.length,a=o.length,l=0;for(;l{let s={};for(let a in o)if(i[a])if(te(r[a],o[a]))s[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,o[a]);s[a]=t&&t(r,i[a])?i[a]:r}else s[a]=e.apply(this,o[a]);return r=o,i=s,s}},t.memoizeObjArg=Se,t.mergeEventStores=Je,t.mergeProps=q,t.mergeRawOptions=function(e){return q(e,Ue)},t.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},t.padStart=N,t.parse=Tn,t.parseBusinessHours=function(e,t){return Ze(function(e){let t;return t=!0===e?[{}]:Array.isArray(e)?e.filter((e=>e.daysOfWeek)):"object"==typeof e&&e?[e]:[],t=t.map((e=>Object.assign(Object.assign({},ft),e))),t}(e),null,t)},t.parseClassNames=et,t.parseDragMeta=function(e){let{refined:t,extra:n}=We(e,Nn);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}},t.parseEventDef=ht,t.parseEventSource=Lr,t.parseFieldSpecs=O,t.parseInteractionSettings=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}},t.pointInsideRect=function(e,t){return e.left>=t.left&&e.left=t.top&&e.top!e.sourceId));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}},t.refineEventDef=dt,t.refineProps=We,t.removeElement=f,t.removeExact=function(e,t){let n=0,r=0;for(;r{if(e.ok)return e.json().then((t=>[t,e]),(()=>{throw new ar("Failure parsing JSON",e)}));throw new ar("Request failed",e)}))},t.rezoneEventStoreDates=function(e,t,n){let{defs:r}=e,i=Q(e.instances,(e=>r[e.defId].allDay?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})));return{defs:r,instances:i}},t.sanitizeShrinkWidth=vr,t.setRef=Jt,t.sliceEventStore=hn,t.sortEventSegs=function(e,t){let n=e.map(mn);return n.sort(((e,n)=>x(e,n,t))),n.map((e=>e._seg))},t.startOfDay=ce,t.subtractDurations=function(e,t){return{years:e.years-t.years,months:e.months-t.months,days:e.days-t.days,milliseconds:e.milliseconds-t.milliseconds}},t.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},t.triggerDateSelect=tn,t.unpromisify=function(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},o=function(e){r||(r=!0,n(e))},s=e(i,o);s&&"function"==typeof s.then&&s.then(i,o)},t.whenTransitionDone=function(e,t){let n=r=>{t(r),C.forEach((t=>{e.removeEventListener(t,n)}))};C.forEach((t=>{e.addEventListener(t,n)}))},t.wholeDivideDurations=function(e,t){let n=null;for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});var r=n(873);n(400),n(748),t.BASE_OPTION_DEFAULTS=r.BASE_OPTION_DEFAULTS,t.BaseComponent=r.BaseComponent,t.BgEvent=r.BgEvent,t.CalendarImpl=r.CalendarImpl,t.CalendarRoot=r.CalendarRoot,t.ContentContainer=r.ContentContainer,t.CustomRenderingStore=r.CustomRenderingStore,t.DateComponent=r.DateComponent,t.DateEnv=r.DateEnv,t.DateProfileGenerator=r.DateProfileGenerator,t.DayCellContainer=r.DayCellContainer,t.DayHeader=r.DayHeader,t.DaySeriesModel=r.DaySeriesModel,t.DayTableModel=r.DayTableModel,t.DelayedRunner=r.DelayedRunner,t.ElementDragging=r.ElementDragging,t.ElementScrollController=r.ElementScrollController,t.Emitter=r.Emitter,t.EventContainer=r.EventContainer,t.EventImpl=r.EventImpl,t.Interaction=r.Interaction,t.MoreLinkContainer=r.MoreLinkContainer,t.NamedTimeZoneImpl=r.NamedTimeZoneImpl,t.NowIndicatorContainer=r.NowIndicatorContainer,t.NowTimer=r.NowTimer,t.PositionCache=r.PositionCache,t.RefMap=r.RefMap,t.ScrollController=r.ScrollController,t.ScrollResponder=r.ScrollResponder,t.Scroller=r.Scroller,t.SegHierarchy=r.SegHierarchy,t.SimpleScrollGrid=r.SimpleScrollGrid,t.Slicer=r.Slicer,t.Splitter=r.Splitter,t.StandardEvent=r.StandardEvent,t.TableDateCell=r.TableDateCell,t.TableDowCell=r.TableDowCell,t.Theme=r.Theme,t.ViewContainer=r.ViewContainer,t.ViewContextType=r.ViewContextType,t.WeekNumberContainer=r.WeekNumberContainer,t.WindowScrollController=r.WindowScrollController,t.addDays=r.addDays,t.addDurations=r.addDurations,t.addMs=r.addMs,t.addWeeks=r.addWeeks,t.allowContextMenu=r.allowContextMenu,t.allowSelection=r.allowSelection,t.applyMutationToEventStore=r.applyMutationToEventStore,t.applyStyle=r.applyStyle,t.asCleanDays=r.asCleanDays,t.asRoughMinutes=r.asRoughMinutes,t.asRoughMs=r.asRoughMs,t.asRoughSeconds=r.asRoughSeconds,t.binarySearch=r.binarySearch,t.buildElAttrs=r.buildElAttrs,t.buildEntryKey=r.buildEntryKey,t.buildEventApis=r.buildEventApis,t.buildEventRangeKey=r.buildEventRangeKey,t.buildIsoString=r.buildIsoString,t.buildNavLinkAttrs=r.buildNavLinkAttrs,t.buildSegTimeText=r.buildSegTimeText,t.collectFromHash=r.collectFromHash,t.combineEventUis=r.combineEventUis,t.compareByFieldSpecs=r.compareByFieldSpecs,t.compareNumbers=r.compareNumbers,t.compareObjs=r.compareObjs,t.computeEarliestSegStart=r.computeEarliestSegStart,t.computeEdges=r.computeEdges,t.computeFallbackHeaderFormat=r.computeFallbackHeaderFormat,t.computeInnerRect=r.computeInnerRect,t.computeRect=r.computeRect,t.computeShrinkWidth=r.computeShrinkWidth,t.computeVisibleDayRange=r.computeVisibleDayRange,t.config=r.config,t.constrainPoint=r.constrainPoint,t.createDuration=r.createDuration,t.createEmptyEventStore=r.createEmptyEventStore,t.createEventInstance=r.createEventInstance,t.createEventUi=r.createEventUi,t.createFormatter=r.createFormatter,t.diffDates=r.diffDates,t.diffDayAndTime=r.diffDayAndTime,t.diffDays=r.diffDays,t.diffPoints=r.diffPoints,t.diffWeeks=r.diffWeeks,t.diffWholeDays=r.diffWholeDays,t.diffWholeWeeks=r.diffWholeWeeks,t.disableCursor=r.disableCursor,t.elementClosest=r.elementClosest,t.elementMatches=r.elementMatches,t.enableCursor=r.enableCursor,t.eventTupleToStore=r.eventTupleToStore,t.filterHash=r.filterHash,t.findDirectChildren=r.findDirectChildren,t.findElements=r.findElements,t.flexibleCompare=r.flexibleCompare,t.formatDayString=r.formatDayString,t.formatIsoMonthStr=r.formatIsoMonthStr,t.formatIsoTimeString=r.formatIsoTimeString,t.getAllowYScrolling=r.getAllowYScrolling,t.getCanVGrowWithinCell=r.getCanVGrowWithinCell,t.getClippingParents=r.getClippingParents,t.getDateMeta=r.getDateMeta,t.getDayClassNames=r.getDayClassNames,t.getDefaultEventEnd=r.getDefaultEventEnd,t.getElSeg=r.getElSeg,t.getEntrySpanEnd=r.getEntrySpanEnd,t.getEventTargetViaRoot=r.getEventTargetViaRoot,t.getIsRtlScrollbarOnLeft=r.getIsRtlScrollbarOnLeft,t.getRectCenter=r.getRectCenter,t.getRelevantEvents=r.getRelevantEvents,t.getScrollGridClassNames=r.getScrollGridClassNames,t.getScrollbarWidths=r.getScrollbarWidths,t.getSectionClassNames=r.getSectionClassNames,t.getSectionHasLiquidHeight=r.getSectionHasLiquidHeight,t.getSegAnchorAttrs=r.getSegAnchorAttrs,t.getSegMeta=r.getSegMeta,t.getSlotClassNames=r.getSlotClassNames,t.getStickyFooterScrollbar=r.getStickyFooterScrollbar,t.getStickyHeaderDates=r.getStickyHeaderDates,t.getUniqueDomId=r.getUniqueDomId,t.greatestDurationDenominator=r.greatestDurationDenominator,t.groupIntersectingEntries=r.groupIntersectingEntries,t.guid=r.guid,t.hasBgRendering=r.hasBgRendering,t.hasCustomDayCellContent=r.hasCustomDayCellContent,t.hasShrinkWidth=r.hasShrinkWidth,t.identity=r.identity,t.injectStyles=r.injectStyles,t.interactionSettingsStore=r.interactionSettingsStore,t.interactionSettingsToStore=r.interactionSettingsToStore,t.intersectRanges=r.intersectRanges,t.intersectRects=r.intersectRects,t.intersectSpans=r.intersectSpans,t.isArraysEqual=r.isArraysEqual,t.isColPropsEqual=r.isColPropsEqual,t.isDateSelectionValid=r.isDateSelectionValid,t.isDateSpansEqual=r.isDateSpansEqual,t.isInt=r.isInt,t.isInteractionValid=r.isInteractionValid,t.isMultiDayRange=r.isMultiDayRange,t.isPropsEqual=r.isPropsEqual,t.isPropsValid=r.isPropsValid,t.isValidDate=r.isValidDate,t.mapHash=r.mapHash,t.memoize=r.memoize,t.memoizeArraylike=r.memoizeArraylike,t.memoizeHashlike=r.memoizeHashlike,t.memoizeObjArg=r.memoizeObjArg,t.mergeEventStores=r.mergeEventStores,t.multiplyDuration=r.multiplyDuration,t.padStart=r.padStart,t.parseBusinessHours=r.parseBusinessHours,t.parseClassNames=r.parseClassNames,t.parseDragMeta=r.parseDragMeta,t.parseEventDef=r.parseEventDef,t.parseFieldSpecs=r.parseFieldSpecs,t.parseMarker=r.parse,t.pointInsideRect=r.pointInsideRect,t.preventContextMenu=r.preventContextMenu,t.preventDefault=r.preventDefault,t.preventSelection=r.preventSelection,t.rangeContainsMarker=r.rangeContainsMarker,t.rangeContainsRange=r.rangeContainsRange,t.rangesEqual=r.rangesEqual,t.rangesIntersect=r.rangesIntersect,t.refineEventDef=r.refineEventDef,t.refineProps=r.refineProps,t.removeElement=r.removeElement,t.removeExact=r.removeExact,t.renderChunkContent=r.renderChunkContent,t.renderFill=r.renderFill,t.renderMicroColGroup=r.renderMicroColGroup,t.renderScrollShim=r.renderScrollShim,t.requestJson=r.requestJson,t.sanitizeShrinkWidth=r.sanitizeShrinkWidth,t.setRef=r.setRef,t.sliceEventStore=r.sliceEventStore,t.sortEventSegs=r.sortEventSegs,t.startOfDay=r.startOfDay,t.translateRect=r.translateRect,t.triggerDateSelect=r.triggerDateSelect,t.unpromisify=r.unpromisify,t.whenTransitionDone=r.whenTransitionDone,t.wholeDivideDurations=r.wholeDivideDurations},170:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(400),i=n(748),o=n(873);Object.defineProperty(t,"createPortal",{enumerable:!0,get:function(){return i.createPortal}}),t.createContext=o.createContext,t.flushSync=o.flushSync,Object.keys(r).forEach((function(e){"default"===e||t.hasOwnProperty(e)||Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}})}))},610:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(553),i=n(957);n(368),n(170);var o=r.createPlugin({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:i.DayGridView,dateProfileGeneratorClass:i.TableDateProfileGenerator},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},fixedWeekCount:!0},dayGridYear:{type:"dayGrid",duration:{years:1}}}});t.default=o},957:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(368),i=n(170);function o(e,t){let n=[];for(let e=0;e{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return i.createElement(i.Fragment,null,t.map((t=>{let o=t.eventRange.instance.instanceId;return i.createElement("div",{className:"fc-daygrid-event-harness",key:o,style:{visibility:n[o]?"hidden":""}},c(t)?i.createElement(u,Object.assign({seg:t,isDragging:!1,isSelected:o===e.eventSelection,defaultDisplayEventEnd:!1},r.getSegMeta(t,e.todayRange))):i.createElement(d,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:o===e.eventSelection,defaultDisplayEventEnd:!1},r.getSegMeta(t,e.todayRange))))})))}})}}function p(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const g=r.createFormatter({week:"narrow"});class m extends r.DateComponent{constructor(){super(...arguments),this.rootElRef=i.createRef(),this.state={dayNumberId:r.getUniqueDomId()},this.handleRootEl=e=>{r.setRef(this.rootElRef,e),r.setRef(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:o}=this,{options:s,dateEnv:a}=e,{date:l,dateProfile:c}=t;const d=t.showDayNumber&&function(e,t,n){const{start:i,end:o}=t,s=r.addMs(o,-1),a=n.getYear(i),l=n.getMonth(i),c=n.getYear(s),d=n.getMonth(s);return!(a===c&&l===d)&&Boolean(e.valueOf()===i.valueOf()||1===n.getDay(e)&&e.valueOf()i.createElement("div",{ref:t.innerElRef,className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",style:{minHeight:t.minHeight}},t.showWeekNumber&&i.createElement(r.WeekNumberContainer,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:r.buildNavLinkAttrs(e,l,"week"),date:l,defaultFormat:g}),!c.isDisabled&&(t.showDayNumber||r.hasCustomDayCellContent(s)||t.forceDayTop)?i.createElement("div",{className:"fc-daygrid-day-top"},i.createElement(a,{elTag:"a",elClasses:["fc-daygrid-day-number",d&&"fc-daygrid-month-start"],elAttrs:Object.assign(Object.assign({},r.buildNavLinkAttrs(e,l)),{id:n.dayNumberId})})):t.showDayNumber?i.createElement("div",{className:"fc-daygrid-day-top",style:{visibility:"hidden"}},i.createElement("a",{className:"fc-daygrid-day-number"}," ")):void 0,i.createElement("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,i.createElement("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},i.createElement(f,{allDayDate:l,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:o,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),i.createElement("div",{className:"fc-daygrid-day-bg"},t.bgContent))))}}function v(e){return e.dayNumberText||i.createElement(i.Fragment,null," ")}function y(e,t,n,i){if(e.firstCol===t&&e.lastCol===n-1)return e;let o=e.eventRange,s=o.range,a=r.intersectRanges(s,{start:i[t].date,end:r.addDays(i[n-1].date,1)});return Object.assign(Object.assign({},e),{firstCol:t,lastCol:n-1,eventRange:{def:o.def,ui:Object.assign(Object.assign({},o.ui),{durationEditable:!1}),instance:o.instance,range:a},isStart:e.isStart&&a.start.valueOf()===s.start.valueOf(),isEnd:e.isEnd&&a.end.valueOf()===s.end.valueOf()})}class E extends r.SegHierarchy{constructor(){super(...arguments),this.hiddenConsumes=!1,this.forceHidden={}}addSegs(e){const t=super.addSegs(e),{entriesByLevel:n}=this,i=e=>!this.forceHidden[r.buildEntryKey(e)];for(let e=0;e{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:o}=n,a=e.cells.length,l=s(e.businessHourSegs,a),c=s(e.bgEventSegs,a),d=s(this.getHighlightSegs(),a),u=s(this.getMirrorSegs(),a),{singleColPlacements:h,multiColPlacements:f,moreCnts:p,moreMarginTops:g}=function(e,t,n,r,i,o,s){let a=new E;a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=o,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let t=0;t1,s=r.span.start===e;d+=r.levelCoord-c,c=r.levelCoord+r.thickness,o?(d+=r.thickness,s&&u.push({seg:y(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):s&&(u.push({seg:y(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:d}),d=0)}i.push(l),o.push(u),s.push(d)}return{singleColPlacements:i,multiColPlacements:o,leftoverMargins:s}}(u,e,s),g=[],m=[];for(let e of c){f[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)h[t].push({seg:y(e,t,t+1,s),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e{let r=this.renderFgSegs(n,e.forPrint?h[n]:f[n],e.todayRange,v),o=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map((e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0})))}(u[n],f),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return i.createElement(m,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:p[n],moreMarginTop:g[n],singlePlacements:h[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:i.createElement(i.Fragment,null,i.createElement(i.Fragment,null,r),i.createElement(i.Fragment,null,o)),bgContent:i.createElement(i.Fragment,null,this.renderFillSegs(d[n],"highlight"),this.renderFillSegs(l[n],"non-business"),this.renderFillSegs(c[n],"bg-event")),minHeight:e.cellMinHeight})})))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!r.isPropsEqual(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,o,s,a,l){let{context:h}=this,{eventSelection:f}=this.props,{framePositions:p}=this.state,g=1===this.props.cells.length,m=s||a||l,v=[];if(p)for(let y of t){let{seg:t}=y,{instanceId:E}=t.eventRange.instance,b=E+":"+e,_=y.isVisible&&!o[E],S=y.isAbsolute,A="",D="";S&&(h.isRtl?(D=0,A=p.lefts[t.lastCol]-p.lefts[t.firstCol]):(A=0,D=p.rights[t.firstCol]-p.rights[t.lastCol])),v.push(i.createElement("div",{className:"fc-daygrid-event-harness"+(S?" fc-daygrid-event-harness-abs":""),key:b,ref:m?null:this.segHarnessRefs.createRef(b),style:{visibility:_?"":"hidden",marginTop:S?"":y.marginTop,top:S?y.absoluteTop:"",left:A,right:D}},c(t)?i.createElement(u,Object.assign({seg:t,isDragging:s,isSelected:E===f,defaultDisplayEventEnd:g},r.getSegMeta(t,n))):i.createElement(d,Object.assign({seg:t,isDragging:s,isResizing:a,isDateSelecting:l,isSelected:E===f,defaultDisplayEventEnd:g},r.getSegMeta(t,n)))))}return v}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:o}=this.props,{framePositions:s}=this.state,a=[];if(s)for(let l of e){let e=n?{right:0,left:s.lefts[l.lastCol]-s.lefts[l.firstCol]}:{left:0,right:s.rights[l.firstCol]-s.rights[l.lastCol]};a.push(i.createElement("div",{key:r.buildEventRangeKey(l.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?i.createElement(r.BgEvent,Object.assign({seg:l},r.getSegMeta(l,o))):r.renderFill(t)))}return i.createElement(i.Fragment,{},...a)}updateSizing(e){let{props:t,state:n,frameElRefs:i}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map((e=>i.currentMap[e.key]));if(e.length){let t=this.rootElRef.current,i=new r.PositionCache(t,e,!0,!1);n.framePositions&&n.framePositions.similarTo(i)||this.setState({framePositions:new r.PositionCache(t,e,!0,!1)})}}const o=this.state.eventInstanceHeights,s=this.queryEventInstanceHeights(),a=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},o),s),maxContentHeight:a?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map((t=>e[t.key]))}}b.addStateEquality({eventInstanceHeights:r.isPropsEqual});class _ extends r.DateComponent{constructor(){super(...arguments),this.splitBusinessHourSegs=r.memoize(o),this.splitBgEventSegs=r.memoize(o),this.splitFgEventSegs=r.memoize(o),this.splitDateSelectionSegs=r.memoize(o),this.splitEventDrag=r.memoize(a),this.splitEventResize=r.memoize(a),this.rowRefs=new r.RefMap}render(){let{props:e,context:t}=this,n=e.cells.length,o=this.splitBusinessHourSegs(e.businessHourSegs,n),s=this.splitBgEventSegs(e.bgEventSegs,n),a=this.splitFgEventSegs(e.fgEventSegs,n),l=this.splitDateSelectionSegs(e.dateSelectionSegs,n),c=this.splitEventDrag(e.eventDrag,n),d=this.splitEventResize(e.eventResize,n),u=n>=7&&e.clientWidth?e.clientWidth/t.options.aspectRatio/6:null;return i.createElement(r.NowTimer,{unit:"day"},((t,r)=>i.createElement(i.Fragment,null,e.cells.map(((t,h)=>i.createElement(b,{ref:this.rowRefs.createRef(h),key:t.length?t[0].date.toISOString():h,showDayNumbers:n>1,showWeekNumbers:e.showWeekNumbers,todayRange:r,dateProfile:e.dateProfile,cells:t,renderIntro:e.renderRowIntro,businessHourSegs:o[h],eventSelection:e.eventSelection,bgEventSegs:s[h].filter(S),fgEventSegs:a[h],dateSelectionSegs:l[h],eventDrag:c[h],eventResize:d[h],dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,clientWidth:e.clientWidth,clientHeight:e.clientHeight,cellMinHeight:u,forPrint:e.forPrint}))))))}componentDidMount(){const e=this.rowRefs.currentMap[0].getCellEls()[0];this.rootEl=e?e.closest(".fc-daygrid-body"):null,this.rootEl&&this.context.registerInteractiveComponent(this,{el:this.rootEl,isHitComboAllowed:this.props.isHitComboAllowed})}componentWillUnmount(){this.rootEl&&(this.context.unregisterInteractiveComponent(this),this.rootEl=null)}prepareHits(){this.rowPositions=new r.PositionCache(this.rootEl,this.rowRefs.collect().map((e=>e.getCellEls()[0])),!1,!0),this.colPositions=new r.PositionCache(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),o=r.topToIndex(t);if(null!=o&&null!=i){let e=this.props.cells[o][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(o,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(o,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[o],bottom:r.bottoms[o]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:r.addDays(n,1)}}}function S(e){return e.eventRange.def.allDay}class A extends r.DateComponent{constructor(){super(...arguments),this.elRef=i.createRef(),this.needsScrollReset=!1}render(){let{props:e}=this,{dayMaxEventRows:t,dayMaxEvents:n,expandRows:r}=e,o=!0===n||!0===t;o&&!r&&(o=!1,t=null,n=null);let s=["fc-daygrid-body",o?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",r?"":"fc-daygrid-body-natural"];return i.createElement("div",{ref:this.elRef,className:s.join(" "),style:{width:e.clientWidth,minWidth:e.tableMinWidth}},i.createElement("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:r?e.clientHeight:""}},e.colGroupNode,i.createElement("tbody",{role:"presentation"},i.createElement(_,{dateProfile:e.dateProfile,cells:e.cells,renderRowIntro:e.renderRowIntro,showWeekNumbers:e.showWeekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,dayMaxEvents:n,dayMaxEventRows:t,forPrint:e.forPrint,isHitComboAllowed:e.isHitComboAllowed}))))}componentDidMount(){this.requestScrollReset()}componentDidUpdate(e){e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&this.props.clientWidth){const e=function(e,t){let n;return t.currentRangeUnit.match(/year|month/)&&(n=e.querySelector(`[data-date="${r.formatIsoMonthStr(t.currentDate)}-01"]`)),n||(n=e.querySelector(`[data-date="${r.formatDayString(t.currentDate)}"]`)),n}(this.elRef.current,this.props.dateProfile);if(e){const t=e.closest(".fc-daygrid-body"),n=t.closest(".fc-scroller"),r=e.getBoundingClientRect().top-t.getBoundingClientRect().top;n.scrollTop=r?r+1:0}this.needsScrollReset=!1}}}class D extends r.Slicer{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class C extends r.DateComponent{constructor(){super(...arguments),this.slicer=new D,this.tableRef=i.createRef()}render(){let{props:e,context:t}=this;return i.createElement(A,Object.assign({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))}}class w extends r.DateProfileGenerator{buildRenderRange(e,t,n){let r=super.buildRenderRange(e,t,n),{props:i}=this;return R({currentRange:r,snapToWeek:/^(year|month)$/.test(t),fixedWeekCount:i.fixedWeekCount,dateEnv:i.dateEnv})}}function R(e){let t,{dateEnv:n,currentRange:i}=e,{start:o,end:s}=i;if(e.snapToWeek&&(o=n.startOfWeek(o),t=n.startOfWeek(s),t.valueOf()!==s.valueOf()&&(s=r.addWeeks(t,1))),e.fixedWeekCount){let e=n.startOfWeek(n.startOfMonth(r.addDays(i.end,-1))),t=Math.ceil(r.diffWeeks(e,s));s=r.addWeeks(s,6-t)}return{start:o,end:s}}class T extends r.DateComponent{constructor(){super(...arguments),this.headerElRef=i.createRef()}renderSimpleLayout(e,t){let{props:n,context:o}=this,s=[],a=r.getStickyHeaderDates(o.options);return e&&s.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),s.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),i.createElement(r.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:o.viewSpec},i.createElement(r.SimpleScrollGrid,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:s}))}renderHScrollLayout(e,t,n,o){let s=this.context.pluginHooks.scrollGridImpl;if(!s)throw new Error("No ScrollGrid implementation");let{props:a,context:l}=this,c=!a.forPrint&&r.getStickyHeaderDates(l.options),d=!a.forPrint&&r.getStickyFooterScrollbar(l.options),u=[];return e&&u.push({type:"header",key:"header",isSticky:c,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),u.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),d&&u.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:r.renderScrollShim}]}),i.createElement(r.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:l.viewSpec},i.createElement(s,{liquid:!a.isHeightAuto&&!a.forPrint,forPrint:a.forPrint,collapsibleWidth:a.forPrint,colGroups:[{cols:[{span:n,minWidth:o}]}],sections:u}))}}function M(e,t){let n=new r.DaySeriesModel(e.renderRange,t);return new r.DayTableModel(n,/year|month|week/.test(e.currentRangeUnit))}t.DayGridView=class extends T{constructor(){super(...arguments),this.buildDayTableModel=r.memoize(M),this.headerRef=i.createRef(),this.tableRef=i.createRef()}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,o=this.buildDayTableModel(n.dateProfile,t),s=e.dayHeaders&&i.createElement(r.DayHeader,{ref:this.headerRef,dateProfile:n.dateProfile,dates:o.headerDates,datesRepDistinctDays:1===o.rowCnt}),a=t=>i.createElement(C,{ref:this.tableRef,dateProfile:n.dateProfile,dayTableModel:o,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(s,a,o.colCnt,e.dayMinWidth):this.renderSimpleLayout(s,a)}},t.DayTable=C,t.DayTableSlicer=D,t.Table=A,t.TableDateProfileGenerator=w,t.TableRows=_,t.TableView=T,t.buildDayTableModel=M,t.buildDayTableRenderRange=R},790:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(553),i=n(368);i.config.touchMouseIgnoreWait=500;let o=0,s=0,a=!1;class l{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,o+=1,setTimeout((()=>{o-=1}),i.config.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new i.Emitter,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),s+=1,1===s&&window.addEventListener("touchmove",c,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),s-=1,s||window.removeEventListener("touchmove",c,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!i.elementClosest(n,this.handleSelector)||(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,0))}cleanup(){a=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?i.elementClosest(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return o||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(a=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,o=0,s=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(o=n-this.origPageX,s=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:o,deltaY:s}}}function c(e){a&&e.preventDefault()}class d{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",i.applyStyle(n,{left:r.left,top:r.top}),i.whenTransitionDone(n,(()=>{n.style.transition="",e()}))}cleanup(){this.mirrorEl&&(i.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&i.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.style.userSelect="none",t.classList.add("fc-event-dragging"),i.applyStyle(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class u extends i.ScrollController{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class h extends u{constructor(e,t){super(new i.ElementScrollController(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return i.computeInnerRect(this.scrollController.el)}}class f extends u{constructor(e){super(new i.WindowScrollController,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const p="function"==typeof performance?performance.now:Date.now;class g{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=p();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,o=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,o=i*i/(r*r)*this.maxVelocity*t,s=1;switch(e.name){case"left":s=-1;case"right":n.setScrollLeft(n.getScrollLeft()+o*s);break;case"top":s=-1;case"bottom":n.setScrollTop(n.getScrollTop()+o*s)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let o of i){let i=o.clientRect,s=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;s>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&o.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:o,name:"top",distance:l}),c<=n&&this.everMovedDown&&o.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:o,name:"bottom",distance:c}),s<=n&&this.everMovedLeft&&o.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:o,name:"left",distance:s}),a<=n&&this.everMovedRight&&o.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:o,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map((e=>e===window?new f(!1):new h(e,!1)))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(e.getRootNode().querySelectorAll(n)));return t}}class m extends i.ElementDragging{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,i.preventSelection(document.body),i.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,i.allowSelection(document.body),i.allowContextMenu(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new l(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new d,this.autoScroller=new g}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout((()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class v{constructor(e){this.origRect=i.computeRect(e),this.scrollCaches=i.getClippingParents(e).map((e=>new h(e,!0)))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let e of this.scrollCaches)if(!y(e.getEventTarget())&&!i.pointInsideRect(n,e.clientRect))return!1;return!0}}function y(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class E{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new i.Emitter}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,o=e.subjectEl;o instanceof HTMLElement&&(t=i.computeRect(o),r=i.constrainPoint(r,t));let s=this.initialHit=this.queryHitForOffset(r.left,r.top);if(s){if(this.useSubjectCenter&&t){let e=i.intersectRects(t,s.rect);e&&(r=i.getRectCenter(e))}this.coordAdjust=i.diffPoints(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&b(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=i.mapHash(this.droppableStore,(e=>(e.component.prepareHits(),new v(e.el))))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,o=null;for(let s in n){let a=n[s].component,l=r[s];if(l&&l.isWithinClipping(e,t)){let n=l.computeLeft(),r=l.computeTop(),c=e-n,d=t-r,{origRect:u}=l,h=u.right-u.left,f=u.bottom-u.top;if(c>=0&&c=0&&do.layer)&&(e.componentId=s,e.context=a.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,o=e)}}}return o}}function b(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&i.isDateSpansEqual(e.dateSpan,t.dateSpan)}function _(e,t){let n={};for(let r of t.pluginHooks.datePointTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class S extends i.Interaction{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&b(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},_(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new m(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new E(this.dragging,i.interactionSettingsToStore(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}}class A extends i.Interaction{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;return null==n&&(n=t.longPressDelay),n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,o=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,o=t.dateSpan,s=[r.range.start,r.range.end,o.range.start,o.range.end];s.sort(i.compareNumbers);let a={};for(let r of n){let n=r(e,t);if(!1===n)return null;n&&Object.assign(a,n)}return a.range={start:s[0],end:s[3]},a.allDay=r.allDay,a}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&i.isDateSelectionValid(r,e.dateProfile,n)||(o=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),o?i.disableCursor():i.enableCursor(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&(i.triggerDateSelect(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new m(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let o=this.hitDragging=new E(this.dragging,i.interactionSettingsToStore(e));o.emitter.on("pointerdown",this.handlePointerDown),o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}}class D extends i.Interaction{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:o}=r,{options:s}=n.context,a=n.context;this.subjectEl=e.subjectEl;let l=this.subjectSeg=i.getElSeg(e.subjectEl),c=(this.eventRange=l.eventRange).instance.instanceId;this.relevantEvents=i.getRelevantEvents(a.getCurrentData().eventStore,c),r.minDistance=e.isTouch?0:s.eventDragMinDistance,r.delay=e.isTouch&&c!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;return null==n&&(n=t.longPressDelay),n}(n):null,s.fixedMirrorParent?o.parentNode=s.fixedMirrorParent:o.parentNode=i.elementClosest(t,".fc"),o.revertDuration=s.dragRevertDuration;let d=n.isValidSegDownEl(t)&&!i.elementClosest(t,".fc-event-resizer");r.setIgnoreMove(!d),this.isDragging=d&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new i.EventImpl(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,o=this.component.context,s=null,a=null,l=null,c=!1,d={affectedEvents:n,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(e){s=e.context;let t=s.options;o===s||t.editable&&t.droppable?(a=function(e,t,n){let r=e.dateSpan,o=t.dateSpan,s=r.range.start,a=o.range.start,l={};r.allDay!==o.allDay&&(l.allDay=o.allDay,l.hasEnd=t.context.options.allDayMaintainDuration,o.allDay&&(s=i.startOfDay(s)));let c=i.diffDates(s,a,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);c.milliseconds&&(l.allDay=!1);let d={datesDelta:c,standardProps:l};for(let r of n)r(d,e,t);return d}(r,e,s.getCurrentData().pluginHooks.eventDragMutationMassagers),a&&(l=i.applyMutationToEventStore(n,s.getCurrentData().eventUiBases,a,s),d.mutatedEvents=l,i.isInteractionValid(d,e.dateProfile,s)||(c=!0,a=null,l=null,d.mutatedEvents=i.createEmptyEventStore()))):s=null}this.displayDrag(s,d),c?i.disableCursor():i.enableCursor(),t||(o===s&&b(r,e)&&(a=null),this.dragging.setMirrorNeedsRevert(!a),this.dragging.setMirrorIsVisible(!e||!this.subjectEl.getRootNode().querySelector(".fc-event-mirror")),this.receivingContext=s,this.validMutation=a,this.mutatedRelevantEvents=l)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:o}=this,s=this.eventRange.def,a=this.eventRange.instance,l=new i.EventImpl(t,s,a),c=this.relevantEvents,d=this.mutatedRelevantEvents,{finalHit:u}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:l,jsEvent:e.origEvent,view:n}),o){if(r===t){let r=new i.EventImpl(t,d.defs[s.defId],a?d.instances[a.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:d});let u={oldEvent:l,event:r,relatedEvents:i.buildEventApis(d,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}},h={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(h,e(o,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},u),h),{el:e.subjectEl,delta:o.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",u)}else if(r){let o={event:l,relatedEvents:i.buildEventApis(c,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},o),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:c}),t.emitter.trigger("eventRemove",o);let h=d.defs[s.defId],f=d.instances[a.instanceId],p=new i.EventImpl(r,h,f);r.dispatch({type:"MERGE_EVENTS",eventStore:d});let g={event:p,relatedEvents:i.buildEventApis(d,r,f),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:d})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},_(u.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:u.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:u.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new m(e.el);r.pointer.selector=D.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let o=this.hitDragging=new E(this.dragging,i.interactionSettingsStore);o.useSubjectCenter=e.useEventCenter,o.emitter.on("pointerdown",this.handlePointerDown),o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("pointerup",this.handlePointerUp),o.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:i.createEmptyEventStore(),isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}D.SELECTOR=".fc-event-draggable, .fc-event-resizable";class C extends i.Interaction{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=this.querySegEl(e),r=i.getElSeg(n),o=this.eventRange=r.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==o.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=i.getRelevantEvents(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=i.getElSeg(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new i.EventImpl(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,o=this.relevantEvents,s=this.hitDragging.initialHit,a=this.eventRange.instance,l=null,c=null,d=!1,u={affectedEvents:o,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};e&&(e.componentId===s.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(s,e)||(l=function(e,t,n,r){let o=e.context.dateEnv,s=e.dateSpan.range.start,a=t.dateSpan.range.start,l=i.diffDates(s,a,o,e.largeUnit);if(n){if(o.add(r.start,l)r.start)return{endDelta:l};return null}(s,e,n.subjectEl.classList.contains("fc-event-resizer-start"),a.range))),l&&(c=i.applyMutationToEventStore(o,r.getCurrentData().eventUiBases,l,r),u.mutatedEvents=c,i.isInteractionValid(u,e.dateProfile,r)||(d=!0,l=null,c=null,u.mutatedEvents=null)),c?r.dispatch({type:"SET_EVENT_RESIZE",state:u}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),d?i.disableCursor():i.enableCursor(),t||(l&&b(s,e)&&(l=null),this.validMutation=l,this.mutatedRelevantEvents=c)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,o=new i.EventImpl(t,n,r),s=this.relevantEvents,a=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:o,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let l=new i.EventImpl(t,a.defs[n.defId],r?a.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:a});let c={oldEvent:o,event:l,relatedEvents:i.buildEventApis(a,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},c),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||i.createDuration(0),endDelta:this.validMutation.endDelta||i.createDuration(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new m(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new E(this.dragging,i.interactionSettingsToStore(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return i.elementClosest(e.subjectEl,".fc-event")}}const w={fixedMirrorParent:i.identity},R={dateClick:i.identity,eventDragStart:i.identity,eventDragStop:i.identity,eventDrop:i.identity,eventResizeStart:i.identity,eventResizeStop:i.identity,eventResize:i.identity,drop:i.identity,eventReceive:i.identity,eventLeave:i.identity};class T{constructor(e,t){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=e=>{this.dragMeta=this.buildDragMeta(e.subjectEl)},this.handleHitUpdate=(e,t,n)=>{let{dragging:r}=this.hitDragging,o=null,s=null,a=!1,l={affectedEvents:i.createEmptyEventStore(),mutatedEvents:i.createEmptyEventStore(),isEvent:this.dragMeta.create};e&&(o=e.context,this.canDropElOnCalendar(n.subjectEl,o)&&(s=function(e,t,n){let r=Object.assign({},t.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(r,i(e,t));let{refined:o,extra:s}=i.refineEventDef(r,n),a=i.parseEventDef(o,s,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),l=e.range.start;e.allDay&&t.startTime&&(l=n.dateEnv.add(l,t.startTime));let c=t.duration?n.dateEnv.add(l,t.duration):i.getDefaultEventEnd(e.allDay,l,n);return{def:a,instance:i.createEventInstance(a.defId,{start:l,end:c})}}(e.dateSpan,this.dragMeta,o),l.mutatedEvents=i.eventTupleToStore(s),a=!i.isInteractionValid(l,e.dateProfile,o),a&&(l.mutatedEvents=i.createEmptyEventStore(),s=null))),this.displayDrag(o,l),r.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),a?i.disableCursor():i.enableCursor(),t||(r.setMirrorNeedsRevert(!s),this.receivingContext=o,this.droppableEvent=s)},this.handleDragEnd=e=>{let{receivingContext:t,droppableEvent:n}=this;if(this.clearDrag(),t&&n){let r=this.hitDragging.finalHit,o=r.context.viewApi,s=this.dragMeta;if(t.emitter.trigger("drop",Object.assign(Object.assign({},_(r.dateSpan,t)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:o})),s.create){let r=i.eventTupleToStore(n);t.dispatch({type:"MERGE_EVENTS",eventStore:r}),e.isTouch&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),t.emitter.trigger("eventReceive",{event:new i.EventImpl(t,n.def,n.instance),relatedEvents:[],revert(){t.dispatch({type:"REMOVE_EVENTS",eventStore:r})},draggedEl:e.subjectEl,view:o})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new E(e,i.interactionSettingsStore);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}buildDragMeta(e){return"object"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta(e)):function(e){let t=function(e,t){let n=i.config.dataAttrPrefix,r=(n?n+"-":"")+"event";return e.getAttribute("data-"+r)||""}(e),n=t?JSON.parse(t):{create:!1};return i.parseDragMeta(n)}(e)}displayDrag(e,t){let n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(e,t){let n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(i.elementMatches(e,n))}}i.config.dataAttrPrefix="";class M extends i.ElementDragging{constructor(e){super(e),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=e=>{this.emitter.trigger("pointerdown",e),this.shouldIgnoreMove||this.emitter.trigger("dragstart",e)},this.handlePointerMove=e=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",e)},this.handlePointerUp=e=>{this.emitter.trigger("pointerup",e),this.shouldIgnoreMove||this.emitter.trigger("dragend",e)};let t=this.pointer=new l(e);t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("pointermove",this.handlePointerMove),t.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(e){this.shouldIgnoreMove=e}setMirrorIsVisible(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let e=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;e&&(this.currentMirrorEl=e,e.style.visibility="hidden")}}}var O=r.createPlugin({name:"@fullcalendar/interaction",componentInteractions:[S,A,D,C],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=i.getEventTargetViaRoot(e.origEvent);this.matchesCancel=!!i.elementClosest(n,t),this.matchesEvent=!!i.elementClosest(n,D.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new l(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:m,optionRefiners:w,listenerRefiners:R});t.Draggable=class{constructor(e,t={}){this.handlePointerDown=e=>{let{dragging:t}=this,{minDistance:n,longPressDelay:r}=this.settings;t.minDistance=null!=n?n:e.isTouch?0:i.BASE_OPTION_DEFAULTS.eventDragMinDistance,t.delay=e.isTouch?null!=r?r:i.BASE_OPTION_DEFAULTS.longPressDelay:0},this.handleDragStart=e=>{e.isTouch&&this.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;let n=this.dragging=new m(e);n.touchScrollAllowed=!1,null!=t.itemSelector&&(n.pointer.selector=t.itemSelector),null!=t.appendTo&&(n.mirror.parentNode=t.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new T(n,t.eventData)}destroy(){this.dragging.destroy()}},t.ThirdPartyDraggable=class{constructor(e,t){let n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};let r=this.dragging=new M(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new T(r,t.eventData)}destroy(){this.dragging.destroy()}},t.default=O}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var o=t[r]={exports:{}};return e[r].call(o.exports,o,o.exports,n),o.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n(519)})(); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFLbzVGLEVBQVc3eUYsSUFFMUUsRUNORHd5RixFQUFvQjNnRyxFQUFJLENBQUMyeUMsRUFBS3N1RCxJQUFVMTRGLE9BQU85RCxVQUFVZ3ZDLGVBQWU1eEMsS0FBSzh3QyxFQUFLc3VELEdDQ2xGTixFQUFvQjlnRyxFQUFLd2UsSUFDSCxvQkFBWHJaLFFBQTBCQSxPQUFPazhGLGFBQzFDMzRGLE9BQU9DLGVBQWU2VixFQUFTclosT0FBT2s4RixZQUFhLENBQUVwK0YsTUFBTyxXQUU3RHlGLE9BQU9DLGVBQWU2VixFQUFTLGFBQWMsQ0FBRXZiLE9BQU8sR0FBTyxFQ0ZwQzY5RixFQUFvQixJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9wcmVhY3QvaG9va3MvZGlzdC9ob29rcy5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9wcmVhY3QvY29tcGF0L2Rpc3QvY29tcGF0Lm1vZHVsZS5qcyIsIndlYnBhY2s6Ly90bGZiLy4vbm9kZV9tb2R1bGVzL3ByZWFjdC9kaXN0L3ByZWFjdC5tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9lZGl0b3IudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9tYWluLnRzIiwid2VicGFjazovL3RsZmIvLi9zcmMvbW9kYWwudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9zdGF0ZS50cyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL3V0aWwudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2NvcmUvaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9jb3JlL2ludGVybmFsLWNvbW1vbi5janMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2NvcmUvaW50ZXJuYWwuY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9jb3JlL3ByZWFjdC5janMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2RheWdyaWQvaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9kYXlncmlkL2ludGVybmFsLmNqcyIsIndlYnBhY2s6Ly90bGZiLy4vbm9kZV9tb2R1bGVzL0BmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb24vaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vdGxmYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vdGxmYi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RsZmIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90bGZiL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnR7b3B0aW9ucyBhcyBufWZyb21cInByZWFjdFwiO3ZhciB0LHIsdSxpLG89MCxmPVtdLGM9W10sZT1uLl9fYixhPW4uX19yLHY9bi5kaWZmZWQsbD1uLl9fYyxtPW4udW5tb3VudDtmdW5jdGlvbiBkKHQsdSl7bi5fX2gmJm4uX19oKHIsdCxvfHx1KSxvPTA7dmFyIGk9ci5fX0h8fChyLl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIHQ+PWkuX18ubGVuZ3RoJiZpLl9fLnB1c2goe19fVjpjfSksaS5fX1t0XX1mdW5jdGlvbiBwKG4pe3JldHVybiBvPTEseShCLG4pfWZ1bmN0aW9uIHkobix1LGkpe3ZhciBvPWQodCsrLDIpO2lmKG8udD1uLCFvLl9fYyYmKG8uX189W2k/aSh1KTpCKHZvaWQgMCx1KSxmdW5jdGlvbihuKXt2YXIgdD1vLl9fTj9vLl9fTlswXTpvLl9fWzBdLHI9by50KHQsbik7dCE9PXImJihvLl9fTj1bcixvLl9fWzFdXSxvLl9fYy5zZXRTdGF0ZSh7fSkpfV0sby5fX2M9ciwhci51KSl7ci51PSEwO3ZhciBmPXIuc2hvdWxkQ29tcG9uZW50VXBkYXRlO3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKG4sdCxyKXtpZighby5fX2MuX19IKXJldHVybiEwO3ZhciB1PW8uX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4uX19jfSk7aWYodS5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4hbi5fX059KSlyZXR1cm4hZnx8Zi5jYWxsKHRoaXMsbix0LHIpO3ZhciBpPSExO3JldHVybiB1LmZvckVhY2goZnVuY3Rpb24obil7aWYobi5fX04pe3ZhciB0PW4uX19bMF07bi5fXz1uLl9fTixuLl9fTj12b2lkIDAsdCE9PW4uX19bMF0mJihpPSEwKX19KSwhKCFpJiZvLl9fYy5wcm9wcz09PW4pJiYoIWZ8fGYuY2FsbCh0aGlzLG4sdCxyKSl9fXJldHVybiBvLl9fTnx8by5fX31mdW5jdGlvbiBoKHUsaSl7dmFyIG89ZCh0KyssMyk7IW4uX19zJiZ6KG8uX19ILGkpJiYoby5fXz11LG8uaT1pLHIuX19ILl9faC5wdXNoKG8pKX1mdW5jdGlvbiBzKHUsaSl7dmFyIG89ZCh0KyssNCk7IW4uX19zJiZ6KG8uX19ILGkpJiYoby5fXz11LG8uaT1pLHIuX19oLnB1c2gobykpfWZ1bmN0aW9uIF8obil7cmV0dXJuIG89NSxGKGZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bn19LFtdKX1mdW5jdGlvbiBBKG4sdCxyKXtvPTYscyhmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4/KG4odCgpKSxmdW5jdGlvbigpe3JldHVybiBuKG51bGwpfSk6bj8obi5jdXJyZW50PXQoKSxmdW5jdGlvbigpe3JldHVybiBuLmN1cnJlbnQ9bnVsbH0pOnZvaWQgMH0sbnVsbD09cj9yOnIuY29uY2F0KG4pKX1mdW5jdGlvbiBGKG4scil7dmFyIHU9ZCh0KyssNyk7cmV0dXJuIHoodS5fX0gscik/KHUuX19WPW4oKSx1Lmk9cix1Ll9faD1uLHUuX19WKTp1Ll9ffWZ1bmN0aW9uIFQobix0KXtyZXR1cm4gbz04LEYoZnVuY3Rpb24oKXtyZXR1cm4gbn0sdCl9ZnVuY3Rpb24gcShuKXt2YXIgdT1yLmNvbnRleHRbbi5fX2NdLGk9ZCh0KyssOSk7cmV0dXJuIGkuYz1uLHU/KG51bGw9PWkuX18mJihpLl9fPSEwLHUuc3ViKHIpKSx1LnByb3BzLnZhbHVlKTpuLl9ffWZ1bmN0aW9uIHgodCxyKXtuLnVzZURlYnVnVmFsdWUmJm4udXNlRGVidWdWYWx1ZShyP3IodCk6dCl9ZnVuY3Rpb24gUChuKXt2YXIgdT1kKHQrKywxMCksaT1wKCk7cmV0dXJuIHUuX189bixyLmNvbXBvbmVudERpZENhdGNofHwoci5jb21wb25lbnREaWRDYXRjaD1mdW5jdGlvbihuLHQpe3UuX18mJnUuX18obix0KSxpWzFdKG4pfSksW2lbMF0sZnVuY3Rpb24oKXtpWzFdKHZvaWQgMCl9XX1mdW5jdGlvbiBWKCl7dmFyIG49ZCh0KyssMTEpO2lmKCFuLl9fKXtmb3IodmFyIHU9ci5fX3Y7bnVsbCE9PXUmJiF1Ll9fbSYmbnVsbCE9PXUuX187KXU9dS5fXzt2YXIgaT11Ll9fbXx8KHUuX19tPVswLDBdKTtuLl9fPVwiUFwiK2lbMF0rXCItXCIraVsxXSsrfXJldHVybiBuLl9ffWZ1bmN0aW9uIGIoKXtmb3IodmFyIHQ7dD1mLnNoaWZ0KCk7KWlmKHQuX19QJiZ0Ll9fSCl0cnl7dC5fX0guX19oLmZvckVhY2goayksdC5fX0guX19oLmZvckVhY2godyksdC5fX0guX19oPVtdfWNhdGNoKHIpe3QuX19ILl9faD1bXSxuLl9fZShyLHQuX192KX19bi5fX2I9ZnVuY3Rpb24obil7cj1udWxsLGUmJmUobil9LG4uX19yPWZ1bmN0aW9uKG4pe2EmJmEobiksdD0wO3ZhciBpPShyPW4uX19jKS5fX0g7aSYmKHU9PT1yPyhpLl9faD1bXSxyLl9faD1bXSxpLl9fLmZvckVhY2goZnVuY3Rpb24obil7bi5fX04mJihuLl9fPW4uX19OKSxuLl9fVj1jLG4uX19OPW4uaT12b2lkIDB9KSk6KGkuX19oLmZvckVhY2goayksaS5fX2guZm9yRWFjaCh3KSxpLl9faD1bXSkpLHU9cn0sbi5kaWZmZWQ9ZnVuY3Rpb24odCl7diYmdih0KTt2YXIgbz10Ll9fYztvJiZvLl9fSCYmKG8uX19ILl9faC5sZW5ndGgmJigxIT09Zi5wdXNoKG8pJiZpPT09bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCgoaT1uLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGopKGIpKSxvLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaSYmKG4uX19IPW4uaSksbi5fX1YhPT1jJiYobi5fXz1uLl9fViksbi5pPXZvaWQgMCxuLl9fVj1jfSkpLHU9cj1udWxsfSxuLl9fYz1mdW5jdGlvbih0LHIpe3Iuc29tZShmdW5jdGlvbih0KXt0cnl7dC5fX2guZm9yRWFjaChrKSx0Ll9faD10Ll9faC5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIW4uX198fHcobil9KX1jYXRjaCh1KXtyLnNvbWUoZnVuY3Rpb24obil7bi5fX2gmJihuLl9faD1bXSl9KSxyPVtdLG4uX19lKHUsdC5fX3YpfX0pLGwmJmwodCxyKX0sbi51bm1vdW50PWZ1bmN0aW9uKHQpe20mJm0odCk7dmFyIHIsdT10Ll9fYzt1JiZ1Ll9fSCYmKHUuX19ILl9fLmZvckVhY2goZnVuY3Rpb24obil7dHJ5e2sobil9Y2F0Y2gobil7cj1ufX0pLHUuX19IPXZvaWQgMCxyJiZuLl9fZShyLHUuX192KSl9O3ZhciBnPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZTtmdW5jdGlvbiBqKG4pe3ZhciB0LHI9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodSksZyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodCksc2V0VGltZW91dChuKX0sdT1zZXRUaW1lb3V0KHIsMTAwKTtnJiYodD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocikpfWZ1bmN0aW9uIGsobil7dmFyIHQ9cix1PW4uX19jO1wiZnVuY3Rpb25cIj09dHlwZW9mIHUmJihuLl9fYz12b2lkIDAsdSgpKSxyPXR9ZnVuY3Rpb24gdyhuKXt2YXIgdD1yO24uX19jPW4uX18oKSxyPXR9ZnVuY3Rpb24geihuLHQpe3JldHVybiFufHxuLmxlbmd0aCE9PXQubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24odCxyKXtyZXR1cm4gdCE9PW5bcl19KX1mdW5jdGlvbiBCKG4sdCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD90KG4pOnR9ZXhwb3J0e1QgYXMgdXNlQ2FsbGJhY2sscSBhcyB1c2VDb250ZXh0LHggYXMgdXNlRGVidWdWYWx1ZSxoIGFzIHVzZUVmZmVjdCxQIGFzIHVzZUVycm9yQm91bmRhcnksViBhcyB1c2VJZCxBIGFzIHVzZUltcGVyYXRpdmVIYW5kbGUscyBhcyB1c2VMYXlvdXRFZmZlY3QsRiBhcyB1c2VNZW1vLHkgYXMgdXNlUmVkdWNlcixfIGFzIHVzZVJlZixwIGFzIHVzZVN0YXRlfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhvb2tzLm1vZHVsZS5qcy5tYXBcbiIsImltcG9ydHtDb21wb25lbnQgYXMgbixjcmVhdGVFbGVtZW50IGFzIHQsb3B0aW9ucyBhcyBlLHRvQ2hpbGRBcnJheSBhcyByLEZyYWdtZW50IGFzIHUscmVuZGVyIGFzIG8saHlkcmF0ZSBhcyBpLGNyZWF0ZUNvbnRleHQgYXMgbCxjcmVhdGVSZWYgYXMgYyxjbG9uZUVsZW1lbnQgYXMgZn1mcm9tXCJwcmVhY3RcIjtleHBvcnR7Q29tcG9uZW50LEZyYWdtZW50LGNyZWF0ZUNvbnRleHQsY3JlYXRlRWxlbWVudCxjcmVhdGVSZWZ9ZnJvbVwicHJlYWN0XCI7aW1wb3J0e3VzZVN0YXRlIGFzIGEsdXNlSWQgYXMgcyx1c2VSZWR1Y2VyIGFzIGgsdXNlRWZmZWN0IGFzIHYsdXNlTGF5b3V0RWZmZWN0IGFzIGQsdXNlUmVmIGFzIHAsdXNlSW1wZXJhdGl2ZUhhbmRsZSBhcyBtLHVzZU1lbW8gYXMgeSx1c2VDYWxsYmFjayBhcyBfLHVzZUNvbnRleHQgYXMgYix1c2VEZWJ1Z1ZhbHVlIGFzIFN9ZnJvbVwicHJlYWN0L2hvb2tzXCI7ZXhwb3J0KmZyb21cInByZWFjdC9ob29rc1wiO2Z1bmN0aW9uIGcobix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV07cmV0dXJuIG59ZnVuY3Rpb24gQyhuLHQpe2Zvcih2YXIgZSBpbiBuKWlmKFwiX19zb3VyY2VcIiE9PWUmJiEoZSBpbiB0KSlyZXR1cm4hMDtmb3IodmFyIHIgaW4gdClpZihcIl9fc291cmNlXCIhPT1yJiZuW3JdIT09dFtyXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBFKG4sdCl7cmV0dXJuIG49PT10JiYoMCE9PW58fDEvbj09MS90KXx8biE9biYmdCE9dH1mdW5jdGlvbiB3KG4pe3RoaXMucHJvcHM9bn1mdW5jdGlvbiBSKG4sZSl7ZnVuY3Rpb24gcihuKXt2YXIgdD10aGlzLnByb3BzLnJlZixyPXQ9PW4ucmVmO3JldHVybiFyJiZ0JiYodC5jYWxsP3QobnVsbCk6dC5jdXJyZW50PW51bGwpLGU/IWUodGhpcy5wcm9wcyxuKXx8IXI6Qyh0aGlzLnByb3BzLG4pfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXIsdChuLGUpfXJldHVybiB1LmRpc3BsYXlOYW1lPVwiTWVtbyhcIisobi5kaXNwbGF5TmFtZXx8bi5uYW1lKStcIilcIix1LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLHUuX19mPSEwLHV9KHcucHJvdG90eXBlPW5ldyBuKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCx3LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gQyh0aGlzLnByb3BzLG4pfHxDKHRoaXMuc3RhdGUsdCl9O3ZhciB4PWUuX19iO2UuX19iPWZ1bmN0aW9uKG4pe24udHlwZSYmbi50eXBlLl9fZiYmbi5yZWYmJihuLnByb3BzLnJlZj1uLnJlZixuLnJlZj1udWxsKSx4JiZ4KG4pfTt2YXIgTj1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIil8fDM5MTE7ZnVuY3Rpb24gayhuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPWcoe30sdCk7cmV0dXJuIGRlbGV0ZSBlLnJlZixuKGUsdC5yZWZ8fG51bGwpfXJldHVybiB0LiQkdHlwZW9mPU4sdC5yZW5kZXI9dCx0LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXQuX19mPSEwLHQuZGlzcGxheU5hbWU9XCJGb3J3YXJkUmVmKFwiKyhuLmRpc3BsYXlOYW1lfHxuLm5hbWUpK1wiKVwiLHR9dmFyIEE9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09bj9udWxsOnIocihuKS5tYXAodCkpfSxPPXttYXA6QSxmb3JFYWNoOkEsY291bnQ6ZnVuY3Rpb24obil7cmV0dXJuIG4/cihuKS5sZW5ndGg6MH0sb25seTpmdW5jdGlvbihuKXt2YXIgdD1yKG4pO2lmKDEhPT10Lmxlbmd0aCl0aHJvd1wiQ2hpbGRyZW4ub25seVwiO3JldHVybiB0WzBdfSx0b0FycmF5OnJ9LFQ9ZS5fX2U7ZS5fX2U9ZnVuY3Rpb24obix0LGUscil7aWYobi50aGVuKWZvcih2YXIgdSxvPXQ7bz1vLl9fOylpZigodT1vLl9fYykmJnUuX19jKXJldHVybiBudWxsPT10Ll9fZSYmKHQuX19lPWUuX19lLHQuX19rPWUuX19rKSx1Ll9fYyhuLHQpO1Qobix0LGUscil9O3ZhciBJPWUudW5tb3VudDtmdW5jdGlvbiBMKG4sdCxlKXtyZXR1cm4gbiYmKG4uX19jJiZuLl9fYy5fX0gmJihuLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBuLl9fYyYmbi5fX2MoKX0pLG4uX19jLl9fSD1udWxsKSxudWxsIT0obj1nKHt9LG4pKS5fX2MmJihuLl9fYy5fX1A9PT1lJiYobi5fX2MuX19QPXQpLG4uX19jPW51bGwpLG4uX19rPW4uX19rJiZuLl9fay5tYXAoZnVuY3Rpb24obil7cmV0dXJuIEwobix0LGUpfSkpLG59ZnVuY3Rpb24gVShuLHQsZSl7cmV0dXJuIG4mJihuLl9fdj1udWxsLG4uX19rPW4uX19rJiZuLl9fay5tYXAoZnVuY3Rpb24obil7cmV0dXJuIFUobix0LGUpfSksbi5fX2MmJm4uX19jLl9fUD09PXQmJihuLl9fZSYmZS5pbnNlcnRCZWZvcmUobi5fX2Usbi5fX2QpLG4uX19jLl9fZT0hMCxuLl9fYy5fX1A9ZSkpLG59ZnVuY3Rpb24gRCgpe3RoaXMuX191PTAsdGhpcy50PW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBGKG4pe3ZhciB0PW4uX18uX19jO3JldHVybiB0JiZ0Ll9fYSYmdC5fX2Eobil9ZnVuY3Rpb24gTShuKXt2YXIgZSxyLHU7ZnVuY3Rpb24gbyhvKXtpZihlfHwoZT1uKCkpLnRoZW4oZnVuY3Rpb24obil7cj1uLmRlZmF1bHR8fG59LGZ1bmN0aW9uKG4pe3U9bn0pLHUpdGhyb3cgdTtpZighcil0aHJvdyBlO3JldHVybiB0KHIsbyl9cmV0dXJuIG8uZGlzcGxheU5hbWU9XCJMYXp5XCIsby5fX2Y9ITAsb31mdW5jdGlvbiBWKCl7dGhpcy51PW51bGwsdGhpcy5vPW51bGx9ZS51bm1vdW50PWZ1bmN0aW9uKG4pe3ZhciB0PW4uX19jO3QmJnQuX19SJiZ0Ll9fUigpLHQmJiEwPT09bi5fX2gmJihuLnR5cGU9bnVsbCksSSYmSShuKX0sKEQucHJvdG90eXBlPW5ldyBuKS5fX2M9ZnVuY3Rpb24obix0KXt2YXIgZT10Ll9fYyxyPXRoaXM7bnVsbD09ci50JiYoci50PVtdKSxyLnQucHVzaChlKTt2YXIgdT1GKHIuX192KSxvPSExLGk9ZnVuY3Rpb24oKXtvfHwobz0hMCxlLl9fUj1udWxsLHU/dShsKTpsKCkpfTtlLl9fUj1pO3ZhciBsPWZ1bmN0aW9uKCl7aWYoIS0tci5fX3Upe2lmKHIuc3RhdGUuX19hKXt2YXIgbj1yLnN0YXRlLl9fYTtyLl9fdi5fX2tbMF09VShuLG4uX19jLl9fUCxuLl9fYy5fX08pfXZhciB0O2ZvcihyLnNldFN0YXRlKHtfX2E6ci5fX2I9bnVsbH0pO3Q9ci50LnBvcCgpOyl0LmZvcmNlVXBkYXRlKCl9fSxjPSEwPT09dC5fX2g7ci5fX3UrK3x8Y3x8ci5zZXRTdGF0ZSh7X19hOnIuX19iPXIuX192Ll9fa1swXX0pLG4udGhlbihpLGkpfSxELnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMudD1bXX0sRC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKG4sZSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxvPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUwodGhpcy5fX2IscixvLl9fTz1vLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgaT1lLl9fYSYmdCh1LG51bGwsbi5mYWxsYmFjayk7cmV0dXJuIGkmJihpLl9faD1udWxsKSxbdCh1LG51bGwsZS5fX2E/bnVsbDpuLmNoaWxkcmVuKSxpXX07dmFyIFc9ZnVuY3Rpb24obix0LGUpe2lmKCsrZVsxXT09PWVbMF0mJm4uby5kZWxldGUodCksbi5wcm9wcy5yZXZlYWxPcmRlciYmKFwidFwiIT09bi5wcm9wcy5yZXZlYWxPcmRlclswXXx8IW4uby5zaXplKSlmb3IoZT1uLnU7ZTspe2Zvcig7ZS5sZW5ndGg+MzspZS5wb3AoKSgpO2lmKGVbMV08ZVswXSlicmVhaztuLnU9ZT1lWzJdfX07ZnVuY3Rpb24gUChuKXtyZXR1cm4gdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb250ZXh0fSxuLmNoaWxkcmVufWZ1bmN0aW9uICQobil7dmFyIGU9dGhpcyxyPW4uaTtlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7byhudWxsLGUubCksZS5sPW51bGwsZS5pPW51bGx9LGUuaSYmZS5pIT09ciYmZS5jb21wb25lbnRXaWxsVW5tb3VudCgpLG4uX192PyhlLmx8fChlLmk9cixlLmw9e25vZGVUeXBlOjEscGFyZW50Tm9kZTpyLGNoaWxkTm9kZXM6W10sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24obil7dGhpcy5jaGlsZE5vZGVzLnB1c2gobiksZS5pLmFwcGVuZENoaWxkKG4pfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24obix0KXt0aGlzLmNoaWxkTm9kZXMucHVzaChuKSxlLmkuYXBwZW5kQ2hpbGQobil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKG4pe3RoaXMuY2hpbGROb2Rlcy5zcGxpY2UodGhpcy5jaGlsZE5vZGVzLmluZGV4T2Yobik+Pj4xLDEpLGUuaS5yZW1vdmVDaGlsZChuKX19KSxvKHQoUCx7Y29udGV4dDplLmNvbnRleHR9LG4uX192KSxlLmwpKTplLmwmJmUuY29tcG9uZW50V2lsbFVubW91bnQoKX1mdW5jdGlvbiBqKG4sZSl7dmFyIHI9dCgkLHtfX3Y6bixpOmV9KTtyZXR1cm4gci5jb250YWluZXJJbmZvPWUscn0oVi5wcm90b3R5cGU9bmV3IG4pLl9fYT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLGU9Rih0Ll9fdikscj10Lm8uZ2V0KG4pO3JldHVybiByWzBdKyssZnVuY3Rpb24odSl7dmFyIG89ZnVuY3Rpb24oKXt0LnByb3BzLnJldmVhbE9yZGVyPyhyLnB1c2godSksVyh0LG4scikpOnUoKX07ZT9lKG8pOm8oKX19LFYucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihuKXt0aGlzLnU9bnVsbCx0aGlzLm89bmV3IE1hcDt2YXIgdD1yKG4uY2hpbGRyZW4pO24ucmV2ZWFsT3JkZXImJlwiYlwiPT09bi5yZXZlYWxPcmRlclswXSYmdC5yZXZlcnNlKCk7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLTspdGhpcy5vLnNldCh0W2VdLHRoaXMudT1bMSwwLHRoaXMudV0pO3JldHVybiBuLmNoaWxkcmVufSxWLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9Vi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuby5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7VyhuLGUsdCl9KX07dmFyIHo9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIil8fDYwMTAzLEI9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sSD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQsWj1mdW5jdGlvbihuKXtyZXR1cm4oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbCgpPy9maWx8Y2hlfHJhZC9pOi9maWx8Y2hlfHJhL2kpLnRlc3Qobil9O2Z1bmN0aW9uIFkobix0LGUpe3JldHVybiBudWxsPT10Ll9fayYmKHQudGV4dENvbnRlbnQ9XCJcIiksbyhuLHQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJmUoKSxuP24uX19jOm51bGx9ZnVuY3Rpb24gcShuLHQsZSl7cmV0dXJuIGkobix0KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlKCksbj9uLl9fYzpudWxsfW4ucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e30sW1wiY29tcG9uZW50V2lsbE1vdW50XCIsXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXCJjb21wb25lbnRXaWxsVXBkYXRlXCJdLmZvckVhY2goZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tcIlVOU0FGRV9cIit0XX0sc2V0OmZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9fSl9KTt2YXIgRz1lLmV2ZW50O2Z1bmN0aW9uIEooKXt9ZnVuY3Rpb24gSygpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX1mdW5jdGlvbiBRKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH1lLmV2ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBHJiYobj1HKG4pKSxuLnBlcnNpc3Q9SixuLmlzUHJvcGFnYXRpb25TdG9wcGVkPUssbi5pc0RlZmF1bHRQcmV2ZW50ZWQ9USxuLm5hdGl2ZUV2ZW50PW59O3ZhciBYLG5uPXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSx0bj1lLnZub2RlO2Uudm5vZGU9ZnVuY3Rpb24obil7dmFyIHQ9bi50eXBlLGU9bi5wcm9wcyx1PWU7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBvPS0xPT09dC5pbmRleE9mKFwiLVwiKTtmb3IodmFyIGkgaW4gdT17fSxlKXt2YXIgbD1lW2ldO0gmJlwiY2hpbGRyZW5cIj09PWkmJlwibm9zY3JpcHRcIj09PXR8fFwidmFsdWVcIj09PWkmJlwiZGVmYXVsdFZhbHVlXCJpbiBlJiZudWxsPT1sfHwoXCJkZWZhdWx0VmFsdWVcIj09PWkmJlwidmFsdWVcImluIGUmJm51bGw9PWUudmFsdWU/aT1cInZhbHVlXCI6XCJkb3dubG9hZFwiPT09aSYmITA9PT1sP2w9XCJcIjovb25kb3VibGVjbGljay9pLnRlc3QoaSk/aT1cIm9uZGJsY2xpY2tcIjovXm9uY2hhbmdlKHRleHRhcmVhfGlucHV0KS9pLnRlc3QoaSt0KSYmIVooZS50eXBlKT9pPVwib25pbnB1dFwiOi9eb25mb2N1cyQvaS50ZXN0KGkpP2k9XCJvbmZvY3VzaW5cIjovXm9uYmx1ciQvaS50ZXN0KGkpP2k9XCJvbmZvY3Vzb3V0XCI6L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLy50ZXN0KGkpP2k9aS50b0xvd2VyQ2FzZSgpOm8mJkIudGVzdChpKT9pPWkucmVwbGFjZSgvW0EtWjAtOV0vZyxcIi0kJlwiKS50b0xvd2VyQ2FzZSgpOm51bGw9PT1sJiYobD12b2lkIDApLC9eb25pbnB1dCQvaS50ZXN0KGkpJiYoaT1pLnRvTG93ZXJDYXNlKCksdVtpXSYmKGk9XCJvbmlucHV0Q2FwdHVyZVwiKSksdVtpXT1sKX1cInNlbGVjdFwiPT10JiZ1Lm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHUudmFsdWUpJiYodS52YWx1ZT1yKGUuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24obil7bi5wcm9wcy5zZWxlY3RlZD0tMSE9dS52YWx1ZS5pbmRleE9mKG4ucHJvcHMudmFsdWUpfSkpLFwic2VsZWN0XCI9PXQmJm51bGwhPXUuZGVmYXVsdFZhbHVlJiYodS52YWx1ZT1yKGUuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24obil7bi5wcm9wcy5zZWxlY3RlZD11Lm11bHRpcGxlPy0xIT11LmRlZmF1bHRWYWx1ZS5pbmRleE9mKG4ucHJvcHMudmFsdWUpOnUuZGVmYXVsdFZhbHVlPT1uLnByb3BzLnZhbHVlfSkpLG4ucHJvcHM9dSxlLmNsYXNzIT1lLmNsYXNzTmFtZSYmKG5uLmVudW1lcmFibGU9XCJjbGFzc05hbWVcImluIGUsbnVsbCE9ZS5jbGFzc05hbWUmJih1LmNsYXNzPWUuY2xhc3NOYW1lKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodSxcImNsYXNzTmFtZVwiLG5uKSl9bi4kJHR5cGVvZj16LHRuJiZ0bihuKX07dmFyIGVuPWUuX19yO2UuX19yPWZ1bmN0aW9uKG4pe2VuJiZlbihuKSxYPW4uX19jfTt2YXIgcm49e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6e2N1cnJlbnQ6e3JlYWRDb250ZXh0OmZ1bmN0aW9uKG4pe3JldHVybiBYLl9fbltuLl9fY10ucHJvcHMudmFsdWV9fX19LHVuPVwiMTcuMC4yXCI7ZnVuY3Rpb24gb24obil7cmV0dXJuIHQuYmluZChudWxsLG4pfWZ1bmN0aW9uIGxuKG4pe3JldHVybiEhbiYmbi4kJHR5cGVvZj09PXp9ZnVuY3Rpb24gY24obil7cmV0dXJuIGxuKG4pP2YuYXBwbHkobnVsbCxhcmd1bWVudHMpOm59ZnVuY3Rpb24gZm4obil7cmV0dXJuISFuLl9fayYmKG8obnVsbCxuKSwhMCl9ZnVuY3Rpb24gYW4obil7cmV0dXJuIG4mJihuLmJhc2V8fDE9PT1uLm5vZGVUeXBlJiZuKXx8bnVsbH12YXIgc249ZnVuY3Rpb24obix0KXtyZXR1cm4gbih0KX0saG49ZnVuY3Rpb24obix0KXtyZXR1cm4gbih0KX0sdm49dTtmdW5jdGlvbiBkbihuKXtuKCl9ZnVuY3Rpb24gcG4obil7cmV0dXJuIG59ZnVuY3Rpb24gbW4oKXtyZXR1cm5bITEsZG5dfXZhciB5bj1kO2Z1bmN0aW9uIF9uKG4sdCl7dmFyIGU9dCgpLHI9YSh7aDp7X186ZSx2OnR9fSksdT1yWzBdLmgsbz1yWzFdO3JldHVybiBkKGZ1bmN0aW9uKCl7dS5fXz1lLHUudj10LEUodS5fXyx0KCkpfHxvKHtoOnV9KX0sW24sZSx0XSksdihmdW5jdGlvbigpe3JldHVybiBFKHUuX18sdS52KCkpfHxvKHtoOnV9KSxuKGZ1bmN0aW9uKCl7RSh1Ll9fLHUudigpKXx8byh7aDp1fSl9KX0sW25dKSxlfXZhciBibj17dXNlU3RhdGU6YSx1c2VJZDpzLHVzZVJlZHVjZXI6aCx1c2VFZmZlY3Q6dix1c2VMYXlvdXRFZmZlY3Q6ZCx1c2VJbnNlcnRpb25FZmZlY3Q6eW4sdXNlVHJhbnNpdGlvbjptbix1c2VEZWZlcnJlZFZhbHVlOnBuLHVzZVN5bmNFeHRlcm5hbFN0b3JlOl9uLHN0YXJ0VHJhbnNpdGlvbjpkbix1c2VSZWY6cCx1c2VJbXBlcmF0aXZlSGFuZGxlOm0sdXNlTWVtbzp5LHVzZUNhbGxiYWNrOl8sdXNlQ29udGV4dDpiLHVzZURlYnVnVmFsdWU6Uyx2ZXJzaW9uOlwiMTcuMC4yXCIsQ2hpbGRyZW46TyxyZW5kZXI6WSxoeWRyYXRlOnEsdW5tb3VudENvbXBvbmVudEF0Tm9kZTpmbixjcmVhdGVQb3J0YWw6aixjcmVhdGVFbGVtZW50OnQsY3JlYXRlQ29udGV4dDpsLGNyZWF0ZUZhY3Rvcnk6b24sY2xvbmVFbGVtZW50OmNuLGNyZWF0ZVJlZjpjLEZyYWdtZW50OnUsaXNWYWxpZEVsZW1lbnQ6bG4sZmluZERPTU5vZGU6YW4sQ29tcG9uZW50Om4sUHVyZUNvbXBvbmVudDp3LG1lbW86Uixmb3J3YXJkUmVmOmssZmx1c2hTeW5jOmhuLHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzOnNuLFN0cmljdE1vZGU6dm4sU3VzcGVuc2U6RCxTdXNwZW5zZUxpc3Q6VixsYXp5Ok0sX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6cm59O2V4cG9ydHtPIGFzIENoaWxkcmVuLHcgYXMgUHVyZUNvbXBvbmVudCx2biBhcyBTdHJpY3RNb2RlLEQgYXMgU3VzcGVuc2UsViBhcyBTdXNwZW5zZUxpc3Qscm4gYXMgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsY24gYXMgY2xvbmVFbGVtZW50LG9uIGFzIGNyZWF0ZUZhY3RvcnksaiBhcyBjcmVhdGVQb3J0YWwsYm4gYXMgZGVmYXVsdCxhbiBhcyBmaW5kRE9NTm9kZSxobiBhcyBmbHVzaFN5bmMsayBhcyBmb3J3YXJkUmVmLHEgYXMgaHlkcmF0ZSxsbiBhcyBpc1ZhbGlkRWxlbWVudCxNIGFzIGxhenksUiBhcyBtZW1vLFkgYXMgcmVuZGVyLGRuIGFzIHN0YXJ0VHJhbnNpdGlvbixmbiBhcyB1bm1vdW50Q29tcG9uZW50QXROb2RlLHNuIGFzIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLHBuIGFzIHVzZURlZmVycmVkVmFsdWUseW4gYXMgdXNlSW5zZXJ0aW9uRWZmZWN0LF9uIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLG1uIGFzIHVzZVRyYW5zaXRpb24sdW4gYXMgdmVyc2lvbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wYXQubW9kdWxlLmpzLm1hcFxuIiwidmFyIG4sbCx1LGksdCxyLG8sZixlLGM9e30scz1bXSxhPS9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7ZnVuY3Rpb24gaChuLGwpe2Zvcih2YXIgdSBpbiBsKW5bdV09bFt1XTtyZXR1cm4gbn1mdW5jdGlvbiB2KG4pe3ZhciBsPW4ucGFyZW50Tm9kZTtsJiZsLnJlbW92ZUNoaWxkKG4pfWZ1bmN0aW9uIHkobCx1LGkpe3ZhciB0LHIsbyxmPXt9O2ZvcihvIGluIHUpXCJrZXlcIj09bz90PXVbb106XCJyZWZcIj09bz9yPXVbb106ZltvXT11W29dO2lmKGFyZ3VtZW50cy5sZW5ndGg+MiYmKGYuY2hpbGRyZW49YXJndW1lbnRzLmxlbmd0aD4zP24uY2FsbChhcmd1bWVudHMsMik6aSksXCJmdW5jdGlvblwiPT10eXBlb2YgbCYmbnVsbCE9bC5kZWZhdWx0UHJvcHMpZm9yKG8gaW4gbC5kZWZhdWx0UHJvcHMpdm9pZCAwPT09ZltvXSYmKGZbb109bC5kZWZhdWx0UHJvcHNbb10pO3JldHVybiBwKGwsZix0LHIsbnVsbCl9ZnVuY3Rpb24gcChuLGksdCxyLG8pe3ZhciBmPXt0eXBlOm4scHJvcHM6aSxrZXk6dCxyZWY6cixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fZDp2b2lkIDAsX19jOm51bGwsX19oOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjpudWxsPT1vPysrdTpvfTtyZXR1cm4gbnVsbD09byYmbnVsbCE9bC52bm9kZSYmbC52bm9kZShmKSxmfWZ1bmN0aW9uIGQoKXtyZXR1cm57Y3VycmVudDpudWxsfX1mdW5jdGlvbiBfKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIGsobixsLHUsaSx0KXt2YXIgcjtmb3IociBpbiB1KVwiY2hpbGRyZW5cIj09PXJ8fFwia2V5XCI9PT1yfHxyIGluIGx8fGcobixyLG51bGwsdVtyXSxpKTtmb3IociBpbiBsKXQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGxbcl18fFwiY2hpbGRyZW5cIj09PXJ8fFwia2V5XCI9PT1yfHxcInZhbHVlXCI9PT1yfHxcImNoZWNrZWRcIj09PXJ8fHVbcl09PT1sW3JdfHxnKG4scixsW3JdLHVbcl0saSl9ZnVuY3Rpb24gYihuLGwsdSl7XCItXCI9PT1sWzBdP24uc2V0UHJvcGVydHkobCxudWxsPT11P1wiXCI6dSk6bltsXT1udWxsPT11P1wiXCI6XCJudW1iZXJcIiE9dHlwZW9mIHV8fGEudGVzdChsKT91OnUrXCJweFwifWZ1bmN0aW9uIGcobixsLHUsaSx0KXt2YXIgcjtuOmlmKFwic3R5bGVcIj09PWwpaWYoXCJzdHJpbmdcIj09dHlwZW9mIHUpbi5zdHlsZS5jc3NUZXh0PXU7ZWxzZXtpZihcInN0cmluZ1wiPT10eXBlb2YgaSYmKG4uc3R5bGUuY3NzVGV4dD1pPVwiXCIpLGkpZm9yKGwgaW4gaSl1JiZsIGluIHV8fGIobi5zdHlsZSxsLFwiXCIpO2lmKHUpZm9yKGwgaW4gdSlpJiZ1W2xdPT09aVtsXXx8YihuLnN0eWxlLGwsdVtsXSl9ZWxzZSBpZihcIm9cIj09PWxbMF0mJlwiblwiPT09bFsxXSlyPWwhPT0obD1sLnJlcGxhY2UoL0NhcHR1cmUkLyxcIlwiKSksbD1sLnRvTG93ZXJDYXNlKClpbiBuP2wudG9Mb3dlckNhc2UoKS5zbGljZSgyKTpsLnNsaWNlKDIpLG4ubHx8KG4ubD17fSksbi5sW2wrcl09dSx1P2l8fG4uYWRkRXZlbnRMaXN0ZW5lcihsLHI/dzptLHIpOm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihsLHI/dzptLHIpO2Vsc2UgaWYoXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09bCl7aWYodClsPWwucmVwbGFjZSgveGxpbmsoSHw6aCkvLFwiaFwiKS5yZXBsYWNlKC9zTmFtZSQvLFwic1wiKTtlbHNlIGlmKFwid2lkdGhcIiE9PWwmJlwiaGVpZ2h0XCIhPT1sJiZcImhyZWZcIiE9PWwmJlwibGlzdFwiIT09bCYmXCJmb3JtXCIhPT1sJiZcInRhYkluZGV4XCIhPT1sJiZcImRvd25sb2FkXCIhPT1sJiZsIGluIG4pdHJ5e25bbF09bnVsbD09dT9cIlwiOnU7YnJlYWsgbn1jYXRjaChuKXt9XCJmdW5jdGlvblwiPT10eXBlb2YgdXx8KG51bGw9PXV8fCExPT09dSYmLTE9PWwuaW5kZXhPZihcIi1cIik/bi5yZW1vdmVBdHRyaWJ1dGUobCk6bi5zZXRBdHRyaWJ1dGUobCx1KSl9fWZ1bmN0aW9uIG0obil7dD0hMDt0cnl7cmV0dXJuIHRoaXMubFtuLnR5cGUrITFdKGwuZXZlbnQ/bC5ldmVudChuKTpuKX1maW5hbGx5e3Q9ITF9fWZ1bmN0aW9uIHcobil7dD0hMDt0cnl7cmV0dXJuIHRoaXMubFtuLnR5cGUrITBdKGwuZXZlbnQ/bC5ldmVudChuKTpuKX1maW5hbGx5e3Q9ITF9fWZ1bmN0aW9uIHgobixsKXt0aGlzLnByb3BzPW4sdGhpcy5jb250ZXh0PWx9ZnVuY3Rpb24gQShuLGwpe2lmKG51bGw9PWwpcmV0dXJuIG4uX18/QShuLl9fLG4uX18uX19rLmluZGV4T2YobikrMSk6bnVsbDtmb3IodmFyIHU7bDxuLl9fay5sZW5ndGg7bCsrKWlmKG51bGwhPSh1PW4uX19rW2xdKSYmbnVsbCE9dS5fX2UpcmV0dXJuIHUuX19lO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4udHlwZT9BKG4pOm51bGx9ZnVuY3Rpb24gUChuKXt2YXIgbCx1O2lmKG51bGwhPShuPW4uX18pJiZudWxsIT1uLl9fYyl7Zm9yKG4uX19lPW4uX19jLmJhc2U9bnVsbCxsPTA7bDxuLl9fay5sZW5ndGg7bCsrKWlmKG51bGwhPSh1PW4uX19rW2xdKSYmbnVsbCE9dS5fX2Upe24uX19lPW4uX19jLmJhc2U9dS5fX2U7YnJlYWt9cmV0dXJuIFAobil9fWZ1bmN0aW9uIEMobil7dD9zZXRUaW1lb3V0KG4pOmYobil9ZnVuY3Rpb24gVChuKXsoIW4uX19kJiYobi5fX2Q9ITApJiZyLnB1c2gobikmJiEkLl9fcisrfHxvIT09bC5kZWJvdW5jZVJlbmRlcmluZykmJigobz1sLmRlYm91bmNlUmVuZGVyaW5nKXx8QykoJCl9ZnVuY3Rpb24gJCgpe3ZhciBuLGwsdSxpLHQsbyxmLGU7Zm9yKHIuc29ydChmdW5jdGlvbihuLGwpe3JldHVybiBuLl9fdi5fX2ItbC5fX3YuX19ifSk7bj1yLnNoaWZ0KCk7KW4uX19kJiYobD1yLmxlbmd0aCxpPXZvaWQgMCx0PXZvaWQgMCxmPShvPSh1PW4pLl9fdikuX19lLChlPXUuX19QKSYmKGk9W10sKHQ9aCh7fSxvKSkuX192PW8uX192KzEsTShlLG8sdCx1Ll9fbix2b2lkIDAhPT1lLm93bmVyU1ZHRWxlbWVudCxudWxsIT1vLl9faD9bZl06bnVsbCxpLG51bGw9PWY/QShvKTpmLG8uX19oKSxOKGksbyksby5fX2UhPWYmJlAobykpLHIubGVuZ3RoPmwmJnIuc29ydChmdW5jdGlvbihuLGwpe3JldHVybiBuLl9fdi5fX2ItbC5fX3YuX19ifSkpOyQuX19yPTB9ZnVuY3Rpb24gSChuLGwsdSxpLHQscixvLGYsZSxhKXt2YXIgaCx2LHksZCxrLGIsZyxtPWkmJmkuX19rfHxzLHc9bS5sZW5ndGg7Zm9yKHUuX19rPVtdLGg9MDtoPGwubGVuZ3RoO2grKylpZihudWxsIT0oZD11Ll9fa1toXT1udWxsPT0oZD1sW2hdKXx8XCJib29sZWFuXCI9PXR5cGVvZiBkP251bGw6XCJzdHJpbmdcIj09dHlwZW9mIGR8fFwibnVtYmVyXCI9PXR5cGVvZiBkfHxcImJpZ2ludFwiPT10eXBlb2YgZD9wKG51bGwsZCxudWxsLG51bGwsZCk6QXJyYXkuaXNBcnJheShkKT9wKF8se2NoaWxkcmVuOmR9LG51bGwsbnVsbCxudWxsKTpkLl9fYj4wP3AoZC50eXBlLGQucHJvcHMsZC5rZXksZC5yZWY/ZC5yZWY6bnVsbCxkLl9fdik6ZCkpe2lmKGQuX189dSxkLl9fYj11Ll9fYisxLG51bGw9PT0oeT1tW2hdKXx8eSYmZC5rZXk9PXkua2V5JiZkLnR5cGU9PT15LnR5cGUpbVtoXT12b2lkIDA7ZWxzZSBmb3Iodj0wO3Y8dzt2Kyspe2lmKCh5PW1bdl0pJiZkLmtleT09eS5rZXkmJmQudHlwZT09PXkudHlwZSl7bVt2XT12b2lkIDA7YnJlYWt9eT1udWxsfU0obixkLHk9eXx8Yyx0LHIsbyxmLGUsYSksaz1kLl9fZSwodj1kLnJlZikmJnkucmVmIT12JiYoZ3x8KGc9W10pLHkucmVmJiZnLnB1c2goeS5yZWYsbnVsbCxkKSxnLnB1c2godixkLl9fY3x8ayxkKSksbnVsbCE9az8obnVsbD09YiYmKGI9ayksXCJmdW5jdGlvblwiPT10eXBlb2YgZC50eXBlJiZkLl9faz09PXkuX19rP2QuX19kPWU9SShkLGUsbik6ZT16KG4sZCx5LG0sayxlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB1LnR5cGUmJih1Ll9fZD1lKSk6ZSYmeS5fX2U9PWUmJmUucGFyZW50Tm9kZSE9biYmKGU9QSh5KSl9Zm9yKHUuX19lPWIsaD13O2gtLTspbnVsbCE9bVtoXSYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHUudHlwZSYmbnVsbCE9bVtoXS5fX2UmJm1baF0uX19lPT11Ll9fZCYmKHUuX19kPUwoaSkubmV4dFNpYmxpbmcpLHEobVtoXSxtW2hdKSk7aWYoZylmb3IoaD0wO2g8Zy5sZW5ndGg7aCsrKVMoZ1toXSxnWysraF0sZ1srK2hdKX1mdW5jdGlvbiBJKG4sbCx1KXtmb3IodmFyIGksdD1uLl9fayxyPTA7dCYmcjx0Lmxlbmd0aDtyKyspKGk9dFtyXSkmJihpLl9fPW4sbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBpLnR5cGU/SShpLGwsdSk6eih1LGksaSx0LGkuX19lLGwpKTtyZXR1cm4gbH1mdW5jdGlvbiBqKG4sbCl7cmV0dXJuIGw9bHx8W10sbnVsbD09bnx8XCJib29sZWFuXCI9PXR5cGVvZiBufHwoQXJyYXkuaXNBcnJheShuKT9uLnNvbWUoZnVuY3Rpb24obil7aihuLGwpfSk6bC5wdXNoKG4pKSxsfWZ1bmN0aW9uIHoobixsLHUsaSx0LHIpe3ZhciBvLGYsZTtpZih2b2lkIDAhPT1sLl9fZClvPWwuX19kLGwuX19kPXZvaWQgMDtlbHNlIGlmKG51bGw9PXV8fHQhPXJ8fG51bGw9PXQucGFyZW50Tm9kZSluOmlmKG51bGw9PXJ8fHIucGFyZW50Tm9kZSE9PW4pbi5hcHBlbmRDaGlsZCh0KSxvPW51bGw7ZWxzZXtmb3IoZj1yLGU9MDsoZj1mLm5leHRTaWJsaW5nKSYmZTxpLmxlbmd0aDtlKz0xKWlmKGY9PXQpYnJlYWsgbjtuLmluc2VydEJlZm9yZSh0LHIpLG89cn1yZXR1cm4gdm9pZCAwIT09bz9vOnQubmV4dFNpYmxpbmd9ZnVuY3Rpb24gTChuKXt2YXIgbCx1LGk7aWYobnVsbD09bi50eXBlfHxcInN0cmluZ1wiPT10eXBlb2Ygbi50eXBlKXJldHVybiBuLl9fZTtpZihuLl9faylmb3IobD1uLl9fay5sZW5ndGgtMTtsPj0wO2wtLSlpZigodT1uLl9fa1tsXSkmJihpPUwodSkpKXJldHVybiBpO3JldHVybiBudWxsfWZ1bmN0aW9uIE0obix1LGksdCxyLG8sZixlLGMpe3ZhciBzLGEsdix5LHAsZCxrLGIsZyxtLHcsQSxQLEMsVCwkPXUudHlwZTtpZih2b2lkIDAhPT11LmNvbnN0cnVjdG9yKXJldHVybiBudWxsO251bGwhPWkuX19oJiYoYz1pLl9faCxlPXUuX19lPWkuX19lLHUuX19oPW51bGwsbz1bZV0pLChzPWwuX19iKSYmcyh1KTt0cnl7bjppZihcImZ1bmN0aW9uXCI9PXR5cGVvZiAkKXtpZihiPXUucHJvcHMsZz0ocz0kLmNvbnRleHRUeXBlKSYmdFtzLl9fY10sbT1zP2c/Zy5wcm9wcy52YWx1ZTpzLl9fOnQsaS5fX2M/az0oYT11Ll9fYz1pLl9fYykuX189YS5fX0U6KFwicHJvdG90eXBlXCJpbiAkJiYkLnByb3RvdHlwZS5yZW5kZXI/dS5fX2M9YT1uZXcgJChiLG0pOih1Ll9fYz1hPW5ldyB4KGIsbSksYS5jb25zdHJ1Y3Rvcj0kLGEucmVuZGVyPUIpLGcmJmcuc3ViKGEpLGEucHJvcHM9YixhLnN0YXRlfHwoYS5zdGF0ZT17fSksYS5jb250ZXh0PW0sYS5fX249dCx2PWEuX19kPSEwLGEuX19oPVtdLGEuX3NiPVtdKSxudWxsPT1hLl9fcyYmKGEuX19zPWEuc3RhdGUpLG51bGwhPSQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJiYoYS5fX3M9PWEuc3RhdGUmJihhLl9fcz1oKHt9LGEuX19zKSksaChhLl9fcywkLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhiLGEuX19zKSkpLHk9YS5wcm9wcyxwPWEuc3RhdGUsYS5fX3Y9dSx2KW51bGw9PSQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJiZudWxsIT1hLmNvbXBvbmVudFdpbGxNb3VudCYmYS5jb21wb25lbnRXaWxsTW91bnQoKSxudWxsIT1hLmNvbXBvbmVudERpZE1vdW50JiZhLl9faC5wdXNoKGEuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYobnVsbD09JC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMmJmIhPT15JiZudWxsIT1hLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmEuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhiLG0pLCFhLl9fZSYmbnVsbCE9YS5zaG91bGRDb21wb25lbnRVcGRhdGUmJiExPT09YS5zaG91bGRDb21wb25lbnRVcGRhdGUoYixhLl9fcyxtKXx8dS5fX3Y9PT1pLl9fdil7Zm9yKHUuX192IT09aS5fX3YmJihhLnByb3BzPWIsYS5zdGF0ZT1hLl9fcyxhLl9fZD0hMSksdS5fX2U9aS5fX2UsdS5fX2s9aS5fX2ssdS5fX2suZm9yRWFjaChmdW5jdGlvbihuKXtuJiYobi5fXz11KX0pLHc9MDt3PGEuX3NiLmxlbmd0aDt3KyspYS5fX2gucHVzaChhLl9zYlt3XSk7YS5fc2I9W10sYS5fX2gubGVuZ3RoJiZmLnB1c2goYSk7YnJlYWsgbn1udWxsIT1hLmNvbXBvbmVudFdpbGxVcGRhdGUmJmEuY29tcG9uZW50V2lsbFVwZGF0ZShiLGEuX19zLG0pLG51bGwhPWEuY29tcG9uZW50RGlkVXBkYXRlJiZhLl9faC5wdXNoKGZ1bmN0aW9uKCl7YS5jb21wb25lbnREaWRVcGRhdGUoeSxwLGQpfSl9aWYoYS5jb250ZXh0PW0sYS5wcm9wcz1iLGEuX19QPW4sQT1sLl9fcixQPTAsXCJwcm90b3R5cGVcImluICQmJiQucHJvdG90eXBlLnJlbmRlcil7Zm9yKGEuc3RhdGU9YS5fX3MsYS5fX2Q9ITEsQSYmQSh1KSxzPWEucmVuZGVyKGEucHJvcHMsYS5zdGF0ZSxhLmNvbnRleHQpLEM9MDtDPGEuX3NiLmxlbmd0aDtDKyspYS5fX2gucHVzaChhLl9zYltDXSk7YS5fc2I9W119ZWxzZSBkb3thLl9fZD0hMSxBJiZBKHUpLHM9YS5yZW5kZXIoYS5wcm9wcyxhLnN0YXRlLGEuY29udGV4dCksYS5zdGF0ZT1hLl9fc313aGlsZShhLl9fZCYmKytQPDI1KTthLnN0YXRlPWEuX19zLG51bGwhPWEuZ2V0Q2hpbGRDb250ZXh0JiYodD1oKGgoe30sdCksYS5nZXRDaGlsZENvbnRleHQoKSkpLHZ8fG51bGw9PWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fChkPWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoeSxwKSksVD1udWxsIT1zJiZzLnR5cGU9PT1fJiZudWxsPT1zLmtleT9zLnByb3BzLmNoaWxkcmVuOnMsSChuLEFycmF5LmlzQXJyYXkoVCk/VDpbVF0sdSxpLHQscixvLGYsZSxjKSxhLmJhc2U9dS5fX2UsdS5fX2g9bnVsbCxhLl9faC5sZW5ndGgmJmYucHVzaChhKSxrJiYoYS5fX0U9YS5fXz1udWxsKSxhLl9fZT0hMX1lbHNlIG51bGw9PW8mJnUuX192PT09aS5fX3Y/KHUuX19rPWkuX19rLHUuX19lPWkuX19lKTp1Ll9fZT1PKGkuX19lLHUsaSx0LHIsbyxmLGMpOyhzPWwuZGlmZmVkKSYmcyh1KX1jYXRjaChuKXt1Ll9fdj1udWxsLChjfHxudWxsIT1vKSYmKHUuX19lPWUsdS5fX2g9ISFjLG9bby5pbmRleE9mKGUpXT1udWxsKSxsLl9fZShuLHUsaSl9fWZ1bmN0aW9uIE4obix1KXtsLl9fYyYmbC5fX2ModSxuKSxuLnNvbWUoZnVuY3Rpb24odSl7dHJ5e249dS5fX2gsdS5fX2g9W10sbi5zb21lKGZ1bmN0aW9uKG4pe24uY2FsbCh1KX0pfWNhdGNoKG4pe2wuX19lKG4sdS5fX3YpfX0pfWZ1bmN0aW9uIE8obCx1LGksdCxyLG8sZixlKXt2YXIgcyxhLGgseT1pLnByb3BzLHA9dS5wcm9wcyxkPXUudHlwZSxfPTA7aWYoXCJzdmdcIj09PWQmJihyPSEwKSxudWxsIT1vKWZvcig7XzxvLmxlbmd0aDtfKyspaWYoKHM9b1tfXSkmJlwic2V0QXR0cmlidXRlXCJpbiBzPT0hIWQmJihkP3MubG9jYWxOYW1lPT09ZDozPT09cy5ub2RlVHlwZSkpe2w9cyxvW19dPW51bGw7YnJlYWt9aWYobnVsbD09bCl7aWYobnVsbD09PWQpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHApO2w9cj9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLGQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZCxwLmlzJiZwKSxvPW51bGwsZT0hMX1pZihudWxsPT09ZCl5PT09cHx8ZSYmbC5kYXRhPT09cHx8KGwuZGF0YT1wKTtlbHNle2lmKG89byYmbi5jYWxsKGwuY2hpbGROb2RlcyksYT0oeT1pLnByb3BzfHxjKS5kYW5nZXJvdXNseVNldElubmVySFRNTCxoPXAuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwsIWUpe2lmKG51bGwhPW8pZm9yKHk9e30sXz0wO188bC5hdHRyaWJ1dGVzLmxlbmd0aDtfKyspeVtsLmF0dHJpYnV0ZXNbX10ubmFtZV09bC5hdHRyaWJ1dGVzW19dLnZhbHVlOyhofHxhKSYmKGgmJihhJiZoLl9faHRtbD09YS5fX2h0bWx8fGguX19odG1sPT09bC5pbm5lckhUTUwpfHwobC5pbm5lckhUTUw9aCYmaC5fX2h0bWx8fFwiXCIpKX1pZihrKGwscCx5LHIsZSksaCl1Ll9faz1bXTtlbHNlIGlmKF89dS5wcm9wcy5jaGlsZHJlbixIKGwsQXJyYXkuaXNBcnJheShfKT9fOltfXSx1LGksdCxyJiZcImZvcmVpZ25PYmplY3RcIiE9PWQsbyxmLG8/b1swXTppLl9fayYmQShpLDApLGUpLG51bGwhPW8pZm9yKF89by5sZW5ndGg7Xy0tOyludWxsIT1vW19dJiZ2KG9bX10pO2V8fChcInZhbHVlXCJpbiBwJiZ2b2lkIDAhPT0oXz1wLnZhbHVlKSYmKF8hPT1sLnZhbHVlfHxcInByb2dyZXNzXCI9PT1kJiYhX3x8XCJvcHRpb25cIj09PWQmJl8hPT15LnZhbHVlKSYmZyhsLFwidmFsdWVcIixfLHkudmFsdWUsITEpLFwiY2hlY2tlZFwiaW4gcCYmdm9pZCAwIT09KF89cC5jaGVja2VkKSYmXyE9PWwuY2hlY2tlZCYmZyhsLFwiY2hlY2tlZFwiLF8seS5jaGVja2VkLCExKSl9cmV0dXJuIGx9ZnVuY3Rpb24gUyhuLHUsaSl7dHJ5e1wiZnVuY3Rpb25cIj09dHlwZW9mIG4/bih1KTpuLmN1cnJlbnQ9dX1jYXRjaChuKXtsLl9fZShuLGkpfX1mdW5jdGlvbiBxKG4sdSxpKXt2YXIgdCxyO2lmKGwudW5tb3VudCYmbC51bm1vdW50KG4pLCh0PW4ucmVmKSYmKHQuY3VycmVudCYmdC5jdXJyZW50IT09bi5fX2V8fFModCxudWxsLHUpKSxudWxsIT0odD1uLl9fYykpe2lmKHQuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e3QuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChuKXtsLl9fZShuLHUpfXQuYmFzZT10Ll9fUD1udWxsLG4uX19jPXZvaWQgMH1pZih0PW4uX19rKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXSYmcSh0W3JdLHUsaXx8XCJmdW5jdGlvblwiIT10eXBlb2Ygbi50eXBlKTtpfHxudWxsPT1uLl9fZXx8dihuLl9fZSksbi5fXz1uLl9fZT1uLl9fZD12b2lkIDB9ZnVuY3Rpb24gQihuLGwsdSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3Iobix1KX1mdW5jdGlvbiBEKHUsaSx0KXt2YXIgcixvLGY7bC5fXyYmbC5fXyh1LGkpLG89KHI9XCJmdW5jdGlvblwiPT10eXBlb2YgdCk/bnVsbDp0JiZ0Ll9fa3x8aS5fX2ssZj1bXSxNKGksdT0oIXImJnR8fGkpLl9faz15KF8sbnVsbCxbdV0pLG98fGMsYyx2b2lkIDAhPT1pLm93bmVyU1ZHRWxlbWVudCwhciYmdD9bdF06bz9udWxsOmkuZmlyc3RDaGlsZD9uLmNhbGwoaS5jaGlsZE5vZGVzKTpudWxsLGYsIXImJnQ/dDpvP28uX19lOmkuZmlyc3RDaGlsZCxyKSxOKGYsdSl9ZnVuY3Rpb24gRShuLGwpe0QobixsLEUpfWZ1bmN0aW9uIEYobCx1LGkpe3ZhciB0LHIsbyxmPWgoe30sbC5wcm9wcyk7Zm9yKG8gaW4gdSlcImtleVwiPT1vP3Q9dVtvXTpcInJlZlwiPT1vP3I9dVtvXTpmW29dPXVbb107cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MiYmKGYuY2hpbGRyZW49YXJndW1lbnRzLmxlbmd0aD4zP24uY2FsbChhcmd1bWVudHMsMik6aSkscChsLnR5cGUsZix0fHxsLmtleSxyfHxsLnJlZixudWxsKX1mdW5jdGlvbiBHKG4sbCl7dmFyIHU9e19fYzpsPVwiX19jQ1wiK2UrKyxfXzpuLENvbnN1bWVyOmZ1bmN0aW9uKG4sbCl7cmV0dXJuIG4uY2hpbGRyZW4obCl9LFByb3ZpZGVyOmZ1bmN0aW9uKG4pe3ZhciB1LGk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwodT1bXSwoaT17fSlbbF09dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBpfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihuKXt0aGlzLnByb3BzLnZhbHVlIT09bi52YWx1ZSYmdS5zb21lKGZ1bmN0aW9uKG4pe24uX19lPSEwLFQobil9KX0sdGhpcy5zdWI9ZnVuY3Rpb24obil7dS5wdXNoKG4pO3ZhciBsPW4uY29tcG9uZW50V2lsbFVubW91bnQ7bi5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3Uuc3BsaWNlKHUuaW5kZXhPZihuKSwxKSxsJiZsLmNhbGwobil9fSksbi5jaGlsZHJlbn19O3JldHVybiB1LlByb3ZpZGVyLl9fPXUuQ29uc3VtZXIuY29udGV4dFR5cGU9dX1uPXMuc2xpY2UsbD17X19lOmZ1bmN0aW9uKG4sbCx1LGkpe2Zvcih2YXIgdCxyLG87bD1sLl9fOylpZigodD1sLl9fYykmJiF0Ll9fKXRyeXtpZigocj10LmNvbnN0cnVjdG9yKSYmbnVsbCE9ci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3ImJih0LnNldFN0YXRlKHIuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKG4pKSxvPXQuX19kKSxudWxsIT10LmNvbXBvbmVudERpZENhdGNoJiYodC5jb21wb25lbnREaWRDYXRjaChuLGl8fHt9KSxvPXQuX19kKSxvKXJldHVybiB0Ll9fRT10fWNhdGNoKGwpe249bH10aHJvdyBufX0sdT0wLGk9ZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJnZvaWQgMD09PW4uY29uc3RydWN0b3J9LHQ9ITEseC5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24obixsKXt2YXIgdTt1PW51bGwhPXRoaXMuX19zJiZ0aGlzLl9fcyE9PXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9aCh7fSx0aGlzLnN0YXRlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiYobj1uKGgoe30sdSksdGhpcy5wcm9wcykpLG4mJmgodSxuKSxudWxsIT1uJiZ0aGlzLl9fdiYmKGwmJnRoaXMuX3NiLnB1c2gobCksVCh0aGlzKSl9LHgucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKG4pe3RoaXMuX192JiYodGhpcy5fX2U9ITAsbiYmdGhpcy5fX2gucHVzaChuKSxUKHRoaXMpKX0seC5wcm90b3R5cGUucmVuZGVyPV8scj1bXSxmPVwiZnVuY3Rpb25cIj09dHlwZW9mIFByb21pc2U/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LCQuX19yPTAsZT0wO2V4cG9ydHt4IGFzIENvbXBvbmVudCxfIGFzIEZyYWdtZW50LEYgYXMgY2xvbmVFbGVtZW50LEcgYXMgY3JlYXRlQ29udGV4dCx5IGFzIGNyZWF0ZUVsZW1lbnQsZCBhcyBjcmVhdGVSZWYseSBhcyBoLEUgYXMgaHlkcmF0ZSxpIGFzIGlzVmFsaWRFbGVtZW50LGwgYXMgb3B0aW9ucyxEIGFzIHJlbmRlcixqIGFzIHRvQ2hpbGRBcnJheX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmVhY3QubW9kdWxlLmpzLm1hcFxuIiwiLyogY29uc3RhbnRzLnRzXG4gKiBcbiAqIERlZmluZXMgdmFyaW91cyBjb25zdGFudHMgdXNlZCBlbHNld2hlcmUuXG4gKiBcbiAqIENvcHlyaWdodCAoYykgMjAyMywgTWljaGFlbCBQYXNjYWxlIDxtcHBhc2NhbGVAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyMy0wNy0yNlxuICovXG5cbi8vIFRpbWUgY29udmVyc2lvbiBmYWN0b3JzLlxuZXhwb3J0IGNvbnN0IENWVF9NU19TID0gMTAwMDtcbmV4cG9ydCBjb25zdCBDVlRfU19NSU4gID0gNjA7XG5leHBvcnQgY29uc3QgQ1ZUX01JTl9IUiA9IDYwO1xuZXhwb3J0IGNvbnN0IENWVF9IUl9EQVkgPSAyNDtcbmV4cG9ydCBjb25zdCBDVlRfTVNfREFZID0gQ1ZUX01TX1MgKiBDVlRfU19NSU4gKiBDVlRfTUlOX0hSICogQ1ZUX0hSX0RBWTtcblxuLy8gVGhlIGNhbGVuZGFyIGhlaWdodCB3aWxsIGJlIHNldCB0byB3aW5kb3cuaW5uZXJIZWlnaHQgLSBDQUxfSEVJR0hUX0RJRkYuXG5leHBvcnQgY29uc3QgQ0FMX0hFSUdIVF9ESUZGID0gMjA1O1xuXG5cbmV4cG9ydCBjb25zdCBDT0xPUl9XSElURSAgPSAnI0ZGRkZGRidcbmV4cG9ydCBjb25zdCBDT0xPUl9URVhUICAgPSAnIzE1MTQxQSdcblxuZXhwb3J0IGNvbnN0IENPTE9SX1BVUlBMRSA9ICcjNDg1RkM3J1xuZXhwb3J0IGNvbnN0IENPTE9SX09SQU5HRSA9ICcjRTY3OTc1J1xuZXhwb3J0IGNvbnN0IENPTE9SX1lFTExPVyA9ICcjRjdEQkE3J1xuZXhwb3J0IGNvbnN0IENPTE9SX0dSRUVOICA9ICcjMDQxRjFFJ1xuZXhwb3J0IGNvbnN0IENPTE9SX0JST1dOICA9ICcjNUEzNTJBJ1xuXG4vLyBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBpbnB1dCB2YWxpZGF0aW9uLlxuZXhwb3J0IGNvbnN0IFJHWF9JTlRFR0VSID0gL15cXGQrJC87XG5leHBvcnQgY29uc3QgUkdYX1dPUkQgICAgPSAvXlxcdyskLztcbmV4cG9ydCBjb25zdCBSR1hfREFURSAgICA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLzsgLy8gWVlZWS1NTS1ERFxuIiwiLyogZWRpdG9yLnRzXG4gKlxuICogVGhlIEVkaXRvciBjbGFzcyBkZWZpbmVzIGEgdHlwZSBvZiBvYmplY3QgdGhhdCBtYW5hZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgdXNlclxuICogaW50ZXJmYWNlLCByZXNwb25kcyB0byBjbGlja3MsIG9wZW5zIGRpYWxvZ3VlcywgYW5kIGdlbmVyYWxseSBoYW5kbGVzXG4gKiBcImVkaXRpbmdcIiBhY3Rpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMywgTWljaGFlbCBQYXNjYWxlIDxtcHBhc2NhbGVAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyMy0wNy0yN1xuICovXG5cbmltcG9ydCB7IENhbGVuZGFyLCBEYXRlU2VsZWN0QXJnLCBFdmVudENsaWNrQXJnIH0gZnJvbSBcIkBmdWxsY2FsZW5kYXIvY29yZVwiO1xuaW1wb3J0IHsgRGF0ZUNsaWNrQXJnIH0gZnJvbSBcIkBmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb25cIjtcblxuaW1wb3J0IHsgTW9kYWwgfSBmcm9tICcuL21vZGFsJ1xuaW1wb3J0IHsgQ2FsZW5kYXJFdmVudExpc3QsIEtleUV2ZW50LCBVc2VFdmVudCwgQ2FsZW5kYXJFdmVudCB9IGZyb20gXCIuL3N0YXRlXCI7XG5cbi8vIEtlZXAgdHJhY2sgb2YgdGhlIGVkaXQgbW9kZS5cbmV4cG9ydCBjbGFzcyBFZGl0b3Ige1xuICAgIHByaXZhdGUgX21vZGU6ICdhZGQta2V5JyB8ICdhZGQtc3UnIHwgJ2NvcHknIHwgJ2RlbGV0ZScgfCBudWxsO1xuICAgIHByaXZhdGUgX25vdGlmaWNhdGlvbjogSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBUaGUgY29weSBidWZmZXIgc3RvcmVzIGFuIGV2ZW50IGlkIHRvIGJlIGNvcGllZC5cbiAgICBwcml2YXRlIF9jb3B5X2J1ZmZlcjogQ2FsZW5kYXJFdmVudCB8IG51bGwgPSBudWxsXG5cbiAgICBwcml2YXRlIF9jYWxlbmRhcjogQ2FsZW5kYXI7XG5cbiAgICBwcml2YXRlIF9tb2RhbF9rZXlfZXZlbnQ6IE1vZGFsO1xuICAgIHByaXZhdGUgX21vZGFsX3N1Yl9ldmVudDogTW9kYWw7XG4gICAgcHJpdmF0ZSBfbW9kYWxfY29uZmlybTogTW9kYWw7XG5cbiAgICBwcml2YXRlIF9ldmVudF9saXN0OiBDYWxlbmRhckV2ZW50TGlzdFxuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGNhbGVuZGFyOiBDYWxlbmRhcikge1xuICAgICAgICB0aGlzLl9tb2RlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIgPSBjYWxlbmRhcjtcblxuICAgICAgICB0aGlzLl9ub3RpZmljYXRpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kZS1ub3RpZmljYXRpb24nKSBhcyBIVE1MRWxlbWVudFxuXG4gICAgICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRsZmItZWRpdC1tb2RlJykuZm9yRWFjaCh4ID0+IHguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHRoaXMubW9kZShldikpKVxuXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLm9uKCdkYXRlQ2xpY2snLCAoZXYpID0+IHRoaXMuY2xpY2tfZGF0ZShldikpXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLm9uKCdldmVudENsaWNrJywgKGV2KSA9PiB0aGlzLmNsaWNrX2V2ZW50KGV2KSlcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIub24oJ3NlbGVjdCcsIChldikgPT4gdGhpcy5zZWxlY3RfcmFuZ2UoZXYpKVxuXG4gICAgICAgIHRoaXMuX21vZGFsX2tleV9ldmVudCA9IG5ldyBNb2RhbCgnbW9kYWwta2V5LWV2ZW50JylcbiAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50ID0gbmV3IE1vZGFsKCdtb2RhbC1zdWJzdGFuY2UtZXZlbnQnKVxuICAgICAgICB0aGlzLl9tb2RhbF9jb25maXJtID0gbmV3IE1vZGFsKCdtb2RhbC1jb25maXJtJylcblxuICAgICAgICB0aGlzLl9ldmVudF9saXN0ID0gbmV3IENhbGVuZGFyRXZlbnRMaXN0KCcyMDIzLTA0LTA1JywgJzIwMjEtMDctMTYnLCB0aGlzLl9jYWxlbmRhcilcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21vZGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9jb3B5X2J1ZmZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lclRleHQgPSAnQ2xpY2sgdGhlIGVkaXQgbWVudSB0byBiZWdpbiBhZGRpbmcgZXZlbnRzLidcbiAgICB9XG5cbiAgICBwdWJsaWMgbW9kZShkZXZ0OiBFdmVudCkge1xuXG4gICAgICAgIGNvbnN0IGNsaWNrZWQgPSAoZGV2dC50YXJnZXQgYXMgRWxlbWVudCkuaWQ7XG5cbiAgICAgICAgdGhpcy5jbGVhcigpXG5cbiAgICAgICAgc3dpdGNoIChjbGlja2VkKXtcbiAgICAgICAgICAgIGNhc2UgJ2VkaXQtbW9kZS1rZXktZXZlbnQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSAnYWRkLWtleSdcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb24uaW5uZXJIVE1MID0gJ0NsaWNrIGEgZGF0ZSBvbiB0aGUgY2FsZW5kYXIgdG8gYWRkIGEgPGI+a2V5IGRhdGU8L2I+LidcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VkaXQtbW9kZS1zdWJzdGFuY2UtZXZlbnQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSAnYWRkLXN1J1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYSBkYXRlIG9uIHRoZSBjYWxlbmRhciB0byBhZGQgYSA8Yj5zdWJzdGFuY2UgdXNlIGV2ZW50PC9iPi4nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlZGl0LW1vZGUtY29weSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9ICdjb3B5J1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYW4gZXZlbnQgb24gdGhlIGNhbGVuZGFyIHRvIDxiPmNvcHk8L2I+LidcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VkaXQtbW9kZS1kZWxldGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSAnZGVsZXRlJ1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYW4gZXZlbnQgb24gdGhlIGNhbGVuZGFyIHRvIDxiPmRlbGV0ZTwvYj4uJ1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRWRpdC5tb2RlKCk6IEludmFsaWQgdGFyZ2V0IHJlY2VpdmVkLicpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgRWRpdC5tb2RlKCk6ICR7dGhpcy5fbW9kZX1gKVxuICAgIH1cblxuICAgIC8vIEhBTkRMRSBDTElDSyBEQVRFXG4gICAgcHVibGljIGNsaWNrX2RhdGUoZXY6IERhdGVDbGlja0FyZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgRWRpdC5jbGlja19kYXRlKCk6ICR7ZXYuZGF0ZVN0cn1gKVxuICAgICAgICBcbiAgICAgICAgc3dpdGNoICh0aGlzLl9tb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdhZGQta2V5JzpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RhbF9rZXlfZXZlbnQucG9wdWxhdGVUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgJy5zdWJ0aXRsZSc6IGV2LmRhdGUudG9EYXRlU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KS5vcGVuKChkYXRhOiBGb3JtRGF0YSk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5hZGQobmV3IEtleUV2ZW50KGV2LmRhdGVTdHIsIGRhdGEuZ2V0KCdrZXktdGV4dCcpIGFzIHN0cmluZykpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FkZC1zdSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50LnBvcHVsYXRlVGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICcuc3VidGl0bGUnOiBldi5kYXRlLnRvRGF0ZVN0cmluZygpXG4gICAgICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyLmFkZEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLmdldCgna2V5LXRleHQnKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZXYuZGF0ZVN0clxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29weV9idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29weSA9IHRoaXMuX2NvcHlfYnVmZmVyLmNsb25lKClcbiAgICAgICAgICAgICAgICAgICAgY29weS5zZXRfZGF0ZShldi5kYXRlU3RyKS5zZXRfZ2lkKHRoaXMuX2NvcHlfYnVmZmVyLmdpZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5hZGQoY29weSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSEFORExFIFNFTEVDVCBEQVRFIFJBTkdFXG4gICAgcHVibGljIHNlbGVjdF9yYW5nZShldjogRGF0ZVNlbGVjdEFyZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgRWRpdC5zZWxlY3RfcmFuZ2UoKTogJHtldi5zdGFydFN0cn0gdG8gJHtldi5lbmRTdHJ9YClcblxuICAgICAgICBjb25zdCB1bnRpbCA9IG5ldyBEYXRlKClcbiAgICAgICAgdW50aWwuc2V0RGF0ZShldi5lbmQuZ2V0RGF0ZSgpIC0gMSlcbiAgICAgICAgY29uc3QgdW50aWxTdHIgPSB1bnRpbC50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLDEwKVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5fbW9kZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkLWtleSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kYWxfa2V5X2V2ZW50LnBvcHVsYXRlVGV4dCh7XG4gICAgICAgICAgICAgICAgICAgICcuc3VidGl0bGUnOiBgJHtldi5zdGFydC50b0RhdGVTdHJpbmcoKX0gdG8gJHt1bnRpbC50b0RhdGVTdHJpbmcoKX1gXG4gICAgICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gbmV3IEtleUV2ZW50KGV2LnN0YXJ0U3RyLCBkYXRhLmdldCgna2V5LXRleHQnKSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudF9saXN0LmltcG9ydF9ldmVudHMoa2V5Lm1ha2VfcmVjdXJyZW5jZShbMSwyLDMsNCw1LDYsN10sIHVudGlsU3RyKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSEFORExFIENMSUNLIE9OIEVWRU5UXG4gICAgcHVibGljIGNsaWNrX2V2ZW50KGV2OiBFdmVudENsaWNrQXJnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBFZGl0LmNsaWNrX2V2ZW50KCk6ICR7ZXYuZXZlbnQudGl0bGV9IChldmVudCAke2V2LmV2ZW50LmlkfSAvIGdyb3VwICR7ZXYuZXZlbnQuZ3JvdXBJZH0pYClcblxuICAgICAgICBzd2l0Y2ggKHRoaXMuX21vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2NvcHknOlxuICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBpZiBub3RoaW5nIGluIGJ1ZmZlciwgcHV0IGluIGJ1ZmZlci5cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgaWYgc29tZXRoaW5nIGluIGJ1ZmZlciwgZHVwbGljYXRlLlxuICAgICAgICAgICAgICAgIHRoaXMuX2NvcHlfYnVmZmVyID0gdGhpcy5fZXZlbnRfbGlzdC5nZXRfZXZlbnQoTnVtYmVyKGV2LmV2ZW50LmlkKSlcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb24uaW5uZXJIVE1MID0gYENsaWNrIGFueSBkYXRlIHRvIHBhc3RlIHRoZSBldmVudCBjYWxsZWQgPGI+JHt0aGlzLl9jb3B5X2J1ZmZlci50aXRsZX08L2I+LmBcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZV9ldmVudChOdW1iZXIoZXYuZXZlbnQuaWQpKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG5cbiAgICB9XG5cblxuICAgIHByaXZhdGUgZGVsZXRlX2V2ZW50KGlkOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9ldmVudF9saXN0LmdldF9ldmVudChpZClcbiAgICAgICAgY29uc3Qgbl9zaWJsaW5ncyA9IHRoaXMuX2V2ZW50X2xpc3QuZ2V0X2V2ZW50X3NpYmxpbmdzKGlkKS5sZW5ndGhcbiAgICAgICAgaWYgKG5fc2libGluZ3MgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbF9jb25maXJtLnBvcHVsYXRlVGV4dCh7XG4gICAgICAgICAgICAgICAgJy5tb2RhbC1jYXJkLXRpdGxlJzogJ0NvbmZpcm0gRGVsZXRpb24gb2YgTXVsdGlwbGUgRXZlbnRzJyxcbiAgICAgICAgICAgICAgICAnLmNvbnRlbnQnOiBgPHA+VGhlIGV2ZW50IG9uIDxiPiR7ZXZlbnQuZGF0ZX08L2I+IHRpdGxlZCA8aT4ke2V2ZW50LnRpdGxlfTwvaT4gaXMgcmVsYXRlZCB0byA8Yj4ke25fc2libGluZ3N9PC9iPiBvdGhlciBldmVudHMuPC9wPmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA8cD5Db25maXJtIHdoZXRoZXIgeW91IHdhbnQgdG8gZGVsZXRlIDx1Pmp1c3QgdGhpcyBldmVudDwvdT4sIG9yIDx1PmFsbDwvdT4gb2YgdGhlIGV2ZW50cyBpbiB0aGUgZ3JvdXAuPC9wPmBcbiAgICAgICAgICAgIH0pLnNldEVsZW1lbnRDbGFzcyh7XG4gICAgICAgICAgICAgICAgJyNkZWxldGUtYWxsLWJ1dHRvbic6IFsnaXMtaGlkZGVuJywgZmFsc2VdXG4gICAgICAgICAgICB9KS5vcGVuKChkYXRhOiBGb3JtRGF0YSk9PntcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgodiwgayk9PmNvbnNvbGUubG9nKGAke3Z9ICR7a31gKSlcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5nZXQoJ2FjdGlvbicpID09ICdzaW5nbGUnKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudF9saXN0LmRlbGV0ZV9ldmVudChpZClcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50X2xpc3QuZGVsZXRlX2dyb3VwKGV2ZW50LmdpZClcbiAgICAgICAgICAgIH0pIC8vIEZJWE1FOiBTZWNvbmQgaGFuZGxlciBmb3IgZGVsZXRlIGdyb3VwLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbF9jb25maXJtLnBvcHVsYXRlVGV4dCh7XG4gICAgICAgICAgICAgICAgJy5tb2RhbC1jYXJkLXRpdGxlJzogJ0NvbmZpcm0gRXZlbnQgRGVsZXRpb24nLFxuICAgICAgICAgICAgICAgICcuY29udGVudCc6IGA8cD5Db25maXJtIHRoYXQgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBldmVudCBvbiA8Yj4ke2V2ZW50LmRhdGV9PC9iPiB0aXRsZWQgPGk+JHtldmVudC50aXRsZX08L2k+LjwvcD5gXG4gICAgICAgICAgICB9KS5zZXRFbGVtZW50Q2xhc3Moe1xuICAgICAgICAgICAgICAgICcjZGVsZXRlLWFsbC1idXR0b24nOiBbJ2lzLWhpZGRlbicsIHRydWVdXG4gICAgICAgICAgICB9KS5vcGVuKCgpPT57XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5kZWxldGVfZXZlbnQoaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyogbWFpbi50c1xuICpcbiAqIEVudHJ5IHBvaW50IHRvIHRoZSB0aW1lbGluZSBmb2xsb3diYWNrIGFwcGxpY2F0aW9uLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMywgTWljaGFlbCBQYXNjYWxlIDxtcHBhc2NhbGVAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyMy0wNy0yN1xuICovXG5cbi8vP3N1YmplY3Q9UU8xMEEmc3RhcnQ9MjAyMi0wNy0xNSZlbmQ9MjAyMi0wOC0wOSZrZXlmaWVsZD1yZWNvcmRfaWRcbi8vJnJlY29yZD02NiZldmVudD1waWxvdF92Nl8yMHdrX2FybV8yJnBpZD0yODk1NVxuXG4vLyA/c3ViamVjdD1bcGlsb3RfdjBfc2NyZWVuaW5nX2FybV8yXVtyZWNvcmRfY2FtX2lkXVxuLy8gJnN0YXJ0PVt0bGZiX3N0YXJ0X2RhdGVdXG4vLyAmZW5kPVt0bGZiX2VuZF9kYXRlXVxuLy8gJmtleWZpZWxkPXJlY29yZF9pZFxuXG5cbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSAnQGZ1bGxjYWxlbmRhci9jb3JlJztcbmltcG9ydCBkYXlHcmlkUGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvZGF5Z3JpZCc7XG5pbXBvcnQgaW50ZXJhY3Rpb25QbHVnaW4gZnJvbSAnQGZ1bGxjYWxlbmRhci9pbnRlcmFjdGlvbic7XG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vZWRpdG9yJ1xuaW1wb3J0ICogYXMgc3RhdGUgZnJvbSAnLi9zdGF0ZSdcblxuaW1wb3J0ICogYXMgdXRpbCAgICAgIGZyb20gJy4vdXRpbCdcbmltcG9ydCB7IENWVF9NU19EQVksIENBTF9IRUlHSFRfRElGRiwgUkdYX0lOVEVHRVIsIFJHWF9XT1JELCBSR1hfREFURSB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG50eXBlIFRMRkJQcm9wZXJ0aWVzID0ge1xuICAgIHN1YmplY3Q6ICAgc3RyaW5nLFxuICAgIHJlY29yZDogICAgc3RyaW5nLFxuICAgIHByb2plY3Q6ICAgc3RyaW5nLFxuICAgIHRpbWVwb2ludDogc3RyaW5nLFxuICAgIHN0YXJ0OiAgICAgc3RyaW5nLFxuICAgIGVuZDogICAgICAgc3RyaW5nXG59O1xuXG5mdW5jdGlvbiBnZXRfdXJsX3Byb3BlcnRpZXMoKSB7XG4gICAgLy8gRmlsbCBpbiB0aG9zZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgY29uc3QgcHJvcHM6IHtba2V5OiBzdHJpbmddOiBhbnl9PSB7fTtcbiAgICBcbiAgICAvLyBSRURDYXAgYm9va21hcmsgbGlua3Mgd2lsbCBhZGQgdGhlIHJlY29yZCwgZXZlbnQsIGFuZCBwcm9qZWN0LlxuXG4gICAgY29uc3QgcG9zc2libGUgPSBbXG4gICAgICAgIC8vIFJFRENhcCBib29rbWFyayBsaW5rcyB3aWxsIGFkZCB0aGUgcmVjb3JkLCBldmVudCwgYW5kIHByb2plY3QuXG4gICAgICAgIHtuYW1lOiAncmVjb3JkJywgIHRvOiAncmVjb3JkJywgICAgdmFsaWRhdG9yOiBSR1hfSU5URUdFUn0sXG4gICAgICAgIHtuYW1lOiAncGlkJywgICAgIHRvOiAncHJvamVjdCcsICAgdmFsaWRhdG9yOiBSR1hfSU5URUdFUn0sXG4gICAgICAgIHtuYW1lOiAnZXZlbnQnLCAgIHRvOiAndGltZXBvaW50JywgdmFsaWRhdG9yOiBSR1hfV09SRH0sXG5cbiAgICAgICAge25hbWU6ICdzdWJqZWN0JywgdG86ICdzdWJqZWN0JywgICB2YWxpZGF0b3I6IFJHWF9XT1JEfSxcbiAgICAgICAge25hbWU6ICdzdGFydCcsICAgdG86ICdzdGFydCcsICAgICB2YWxpZGF0b3I6IFJHWF9EQVRFfSxcbiAgICAgICAge25hbWU6ICdlbmQnLCAgICAgdG86ICdlbmQnLCAgICAgICB2YWxpZGF0b3I6IFJHWF9EQVRFfSxcbiAgICBdXG4gICAgXG4gICAgZm9yIChjb25zdCBwYXJhbSBvZiBwb3NzaWJsZSkge1xuICAgICAgICBpZiAocXVlcnkuaGFzKHBhcmFtLm5hbWUpKSB7XG4gICAgICAgICAgICBpZiAoIXBhcmFtLnZhbGlkYXRvci50ZXN0KHF1ZXJ5LmdldChwYXJhbS5uYW1lKSEpKVxuICAgICAgICAgICAgICAgIGFsZXJ0KGAke3BhcmFtLm5hbWV9IG1pc3NwZWNpZmllZCBpbiB0aGUgVVJMIHF1ZXJ5LmApXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcHJvcHNbcGFyYW0udG9dID0gcXVlcnkuZ2V0KHBhcmFtLm5hbWUpIVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBxdWVyeS5kZWxldGUocGFyYW0ubmFtZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICgocHJvcHMucmVjb3JkIHx8IHByb3BzLnByb2plY3QgfHwgcHJvcHMudGltZXBvaW50KSAmJlxuICAgICAgICAhKHByb3BzLnJlY29yZCAmJiBwcm9wcy5wcm9qZWN0ICYmIHByb3BzLnRpbWVwb2ludCkpXG4gICAgICAgIGFsZXJ0KCdTb21lIGJ1dCBub3QgYWxsIFJFRENhcCBwYXJhbWV0ZXJzIHJlY2VpdmVkLiBSRURDYXAgbWF5IGJlIG1pc2NvbmZpZ3VyZWQuJylcblxuICAgIHF1ZXJ5LmZvckVhY2goKF8sIGtleSk9PmFsZXJ0KGBVbmtub3duIHBhcmFtZXRlciBzcGVjaWZpZWQgaW4gVVJMIHF1ZXJ5OiAke2tleX1gKSlcblxuICAgIGNvbnNvbGUubG9nKCdwcm9wcyEnLCBwcm9wcylcbiAgICByZXR1cm4gcHJvcHNcbn1cblxuZnVuY3Rpb24gdXBkYXRlX3Byb3BlcnRpZXMocHJvcGVydGllczogVExGQlByb3BlcnRpZXMsIHVwZGF0ZWQ6IChvYmplY3QgfCBUTEZCUHJvcGVydGllcykpIHtcbiAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIHVwZGF0ZWQpXG5cbiAgICBcbiAgICBjb25zdCBkYXlzX2FwYXJ0ID0gKChuZXcgRGF0ZShwcm9wZXJ0aWVzLmVuZCkpLnZhbHVlT2YoKSAtIChuZXcgRGF0ZShwcm9wZXJ0aWVzLnN0YXJ0KSkudmFsdWVPZigpKSAvIENWVF9NU19EQVlcbiAgICBcblxuICAgIHV0aWwuc2V0X2lubmVyKFxuICAgICAgICAnY2FsZW5kYXItZmlsZS10aXRsZScsXG4gICAgICAgIGAke3Byb3BlcnRpZXMuc3ViamVjdH0gLyAke3Byb3BlcnRpZXMucmVjb3JkfSBhdCAke3Byb3BlcnRpZXMudGltZXBvaW50fWBcbiAgICApXG5cbiAgICB1dGlsLnNldF9pbm5lcihcbiAgICAgICAgJ2NhbGVuZGFyLWZpbGUtc3VidGl0bGUnLFxuICAgICAgICBgJHtwcm9wZXJ0aWVzLnN0YXJ0fSB0byAke3Byb3BlcnRpZXMuZW5kfSAoJHtkYXlzX2FwYXJ0fSBEYXlzKWBcbiAgICApXG59XG5cblxuICAgIFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuXG4gICAgLy8gYWRkRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHJldHVybiAoZXZlbnQucmV0dXJuVmFsdWUgPSAnJyk7IH0pO1xuXG4gICAgY29uc3QgdGxmYl9wcm9wZXJ0aWVzOiBUTEZCUHJvcGVydGllcyA9IHtcbiAgICAgICAgc3ViamVjdDogJycsXG4gICAgICAgIHJlY29yZDogJycsXG4gICAgICAgIHRpbWVwb2ludDogJycsXG4gICAgICAgIHByb2plY3Q6ICcnLFxuICAgICAgICBzdGFydDogJycsXG4gICAgICAgIGVuZDogJydcbiAgICB9XG5cbiAgICB1cGRhdGVfcHJvcGVydGllcyh0bGZiX3Byb3BlcnRpZXMsIHtzdWJqZWN0OiAnTVgzNDcnLCByZWNvcmQ6ICcxMCcsIHByb2plY3Q6ICczNDU2JywgdGltZXBvaW50OiAncmVkY2FwX2FybV8xX3Zpc2l0XzEnLCBzdGFydDogJzIwMjMtMDYtMTgnLCBlbmQ6ICcyMDIzLTA3LTE1J30pXG4gICAgdXBkYXRlX3Byb3BlcnRpZXModGxmYl9wcm9wZXJ0aWVzLCBnZXRfdXJsX3Byb3BlcnRpZXMoKSk7XG5cbiAgICBjb25zb2xlLmxvZyh0bGZiX3Byb3BlcnRpZXMpXG5cbiAgICBjb25zdCBjYWxlbmRhckVsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhcicpITtcblxuICAgIGNvbnN0IGNhbGVuZGFyID0gbmV3IENhbGVuZGFyKGNhbGVuZGFyRWwsIHtcbiAgICAgICAgcGx1Z2luczogWyBpbnRlcmFjdGlvblBsdWdpbiwgZGF5R3JpZFBsdWdpbiBdLFxuICAgICAgICBpbml0aWFsVmlldzogXCJkYXlHcmlkTW9udGhcIixcbiAgICAgICAgdmFsaWRSYW5nZToge1xuICAgICAgICAgICAgc3RhcnQ6IHRsZmJfcHJvcGVydGllcy5zdGFydCxcbiAgICAgICAgICAgIGVuZDogdGxmYl9wcm9wZXJ0aWVzLmVuZFxuICAgICAgICB9LFxuXG4gICAgICAgIGhlYWRlclRvb2xiYXI6IHtcbiAgICAgICAgICAgIGxlZnQ6ICd0aXRsZScsXG4gICAgICAgICAgICByaWdodDogJ3ByZXYsbmV4dCdcbiAgICAgICAgfSxcblxuICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IGZhbHNlLFxuICAgICAgICBmaXhlZFdlZWtDb3VudDogdHJ1ZSxcblxuICAgICAgICAvLyBhc3BlY3RSYXRpbzogMixcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBDQUxfSEVJR0hUX0RJRkYsXG5cbiAgICAgICAgLy8gZGF0ZUNsaWNrOiBmYy5jbGlja19kYXRlLFxuICAgICAgICAvLyBldmVudENsaWNrOiBmYy5jbGlja19ldmVudCxcbiAgICAgICAgLy8gc2VsZWN0OiBmYy5zZWxlY3RfZGF0ZXJhbmdlXG5cbiAgICB9KTtcblxuICAgIGNhbGVuZGFyLnJlbmRlcigpO1xuXG4gICAgY29uc3QgZWRpdG9yID0gbmV3IEVkaXRvcihjYWxlbmRhcik7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vcmVzaXplIGp1c3QgaGFwcGVuZWQsIHBpeGVscyBjaGFuZ2VkXG4gICAgICAgIGNhbGVuZGFyLnNldE9wdGlvbignaGVpZ2h0Jywgd2luZG93LmlubmVySGVpZ2h0IC0gQ0FMX0hFSUdIVF9ESUZGKTtcbiAgICB9KTtcbiAgICBcbn0pO1xuIiwiLyogbW9kYWwudHNcbiAqXG4gKiBUaGUgTW9kYWwgY2xhc3MgaGFuZGxlcyBhbGwgb2YgdGhlIG1vZGFsIGZvcm1zIHVzZWQgdGhyb3VnaG91dCB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLCBNaWNoYWVsIFBhc2NhbGUgPG1wcGFzY2FsZUBtZ2guaGFydmFyZC5lZHU+XG4gKiBMYXN0IG1vZGlmaWVkOiAyMDIzLTA3LTI3XG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vZGFsIHtcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIF9mb3JtOiBIVE1MRm9ybUVsZW1lbnQgfCBudWxsO1xuICAgIHByaXZhdGUgX29uc3VibWl0OiAoKGRhdGE6IEZvcm1EYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcblxuICAgICAgICBpZiAoZWwgPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbCgpOiBDb3VsZCBub3QgbG9jYXRlIERPTSBlbGVtZW50ICcjJHtpZH0nLmApXG4gICAgICAgIFxuICAgICAgICBpZiAoIWVsLmNsYXNzTGlzdC5jb250YWlucygnbW9kYWwnKSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbCgpOiAnIyR7aWR9JyBpcyBub3Qgb2YgY2xhc3MgJ21vZGFsJy5gKVxuICAgICAgICBcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGVsO1xuICAgICAgICB0aGlzLl9mb3JtID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdmb3JtJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1vZGFsLWNsb3NlLCAuY2FuY2VsLW9wZXJhdGlvbicpLmZvckVhY2goeCA9PiB4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5jbG9zZSgpKSk7XG4gICAgICAgIHRoaXMuX2Zvcm0/LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChkZXZ0KSA9PiB7ZGV2dC5wcmV2ZW50RGVmYXVsdCgpOyB0aGlzLnN1Ym1pdChkZXZ0KTt9KTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNldCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLnJlc2V0KCk6ICR7dGhpcy5fZWxlbWVudC5pZH1gKVxuICAgICAgICB0aGlzLl9mb3JtPy5yZXNldCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdWJtaXQoZGV2dDogU3VibWl0RXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLnN1Ym1pdCgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YClcblxuICAgICAgICBpZiAoIXRoaXMuX2Zvcm0pXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwuc3VibWl0KCk6IENhbm5vdCBzdWJtaXQgbW9kYWwgd2l0aCBubyBkZXNjZW5kYW50IGZvcm0gJHt0aGlzLl9lbGVtZW50LmlkfS5gKVxuXG4gICAgICAgIGlmICghdGhpcy5fb25zdWJtaXQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwuc3VibWl0KCk6IEZvcm0gc3VibWl0dGVkIGJ1dCBubyBoYW5kbGVyIHNwZWNpZmllZC5gKVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEZvcm1EYXRhKClcbiAgICAgICAgY29uc3Qgc3VibWl0X2J1dHRvbl92YWx1ZSA9IChkZXZ0LnN1Ym1pdHRlciBhcyBIVE1MRm9ybUVsZW1lbnQpLnZhbHVlXG5cbiAgICAgICAgaWYgKHN1Ym1pdF9idXR0b25fdmFsdWUpXG4gICAgICAgICAgICBkYXRhLmFwcGVuZCgnYWN0aW9uJywgc3VibWl0X2J1dHRvbl92YWx1ZSlcblxuICAgICAgICB0aGlzLl9vbnN1Ym1pdChkYXRhKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHBvcHVsYXRlRm9ybShkYXRhOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ30pIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLnBvcHVsYXRlRm9ybSgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YClcblxuICAgICAgICBpZiAoIXRoaXMuX2Zvcm0pXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwucG9wdWxhdGVGb3JtKCk6IENhbm5vdCBwb3B1bGF0ZSBtb2RhbCB3aXRoIG5vIGRlc2NlbmRhbnQgZm9ybSAke3RoaXMuX2VsZW1lbnQuaWR9LmApXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb3JtLmVsZW1lbnRzLm5hbWVkSXRlbShrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbC5wb3B1bGF0ZUZvcm0oKTogTmFtZWQgZWxlbWVudCAnJHtrZXl9JyBub3QgZm91bmQgaW4gZm9ybS5gKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICh0aGlzLl9mb3JtLmVsZW1lbnRzLm5hbWVkSXRlbShrZXkpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHBvcHVsYXRlVGV4dChkYXRhOiB7IFtzZWxlY3Rvcjogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLnBvcHVsYXRlVGV4dCgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbC5wb3B1bGF0ZVRleHQoKTogRWxlbWVudCBub3QgZm91bmQgZm9yICcke3NlbGVjdG9yfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGRhdGFbc2VsZWN0b3JdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEVsZW1lbnRDbGFzcyhkYXRhOiB7IFtzZWxlY3Rvcjogc3RyaW5nXTogW3N0cmluZywgYm9vbGVhbl0gfSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgTW9kYWwuYWRkRWxlbWVudENsYXNzKCk6ICR7dGhpcy5fZWxlbWVudC5pZH1gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIGluIGRhdGEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsLmFkZEVsZW1lbnRDbGFzcygpOiBFbGVtZW50IG5vdCBmb3VuZCBmb3IgJyR7c2VsZWN0b3J9Jy5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGRhdGFbc2VsZWN0b3JdWzFdKVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChkYXRhW3NlbGVjdG9yXVswXSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRhdGFbc2VsZWN0b3JdWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtRGF0YSgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLmdldEZvcm1EYXRhKCk6ICR7dGhpcy5fZWxlbWVudC5pZH1gKVxuXG4gICAgICAgIGlmICghdGhpcy5fZm9ybSlcbiAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbC5nZXRGb3JtRGF0YSgpOiBDYW5ub3QgZ2V0IGZvcm0gZGF0YSBmb3IgbW9kYWwgd2l0aCBubyBkZXNjZW5kYW50IGZvcm0gJHt0aGlzLl9lbGVtZW50LmlkfS5gKVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEodGhpcy5fZm9ybSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW4ob25zdWJtaXQ6ICgoZGF0YTogRm9ybURhdGEpID0+IHZvaWQpIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLm9wZW4oKTogJHt0aGlzLl9lbGVtZW50LmlkfWApXG4gICAgICAgIHRoaXMuX29uc3VibWl0ID0gb25zdWJtaXQ7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLmNsb3NlKCk6ICR7dGhpcy5fZWxlbWVudC5pZH1gKVxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpO1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbiIsIi8qIHN0YXRlLnRzXG4gKlxuICogTWFuYWdlIGNhbGVuZGFyIGV2ZW50cyBzZXBhcmF0ZWx5IGZyb20gdGhlIGNhbGVuZGFyIFVJLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAyMywgTWljaGFlbCBQYXNjYWxlIDxtcHBhc2NhbGVAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyMy0wNy0yN1xuICovXG5cbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSBcIkBmdWxsY2FsZW5kYXIvY29yZVwiO1xuaW1wb3J0IHsgQ09MT1JfV0hJVEUsIENPTE9SX1RFWFQsIENPTE9SX1BVUlBMRSwgQ09MT1JfWUVMTE9XIH0gZnJvbSAnLi9jb25zdGFudHMnOyBcblxudHlwZSBVc2VFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICBzdWJzdGFuY2U6IHN0cmluZztcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICB0aW1lczogbnVtYmVyO1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIHVuaXRzOiBzdHJpbmc7XG4gICAgdW5pdHNPdGhlcjogc3RyaW5nO1xufVxuXG5jbGFzcyBDYWxlbmRhckRhdGUge1xuICAgIHByaXZhdGUgX2RhdGU6IERhdGU7XG5cbiAgICAvLyBDYWxlbmRhckRhdGUgZXhwZWN0cyBJU08gODYwMSAnWVlZWS1NTS1ERCcgZGF0ZSBhbmQgaW50ZXJwcmV0cyBpdCBpbiBVVEMuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGU6IHN0cmluZykge1xuXG4gICAgICAgIGlmICghKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLykudGVzdChkYXRlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsZW5kYXJEYXRlIGV4cGVjdHMgYSBkYXRlIGluIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LicpO1xuXG4gICAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcblxuICAgICAgICBpZiAoaXNOYU4odGhpcy5fZGF0ZS52YWx1ZU9mKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxhbmRlckRhdGUgcmVjZWl2ZWQgYW4gaW52YWxpZCBkYXRlLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgRGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGU7XG4gICAgfVxuXG4gICAgLy8gV2Vla2RheSB3aGVyZSBTdW5kYXkgPT0gMS5cbiAgICBwdWJsaWMgZ2V0IHdlZWtkYXkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0VVRDRGF5KCkgKyAxO1xuICAgIH1cblxuICAgIC8vIERheSBvZiB0aGUgbW9udGguXG4gICAgcHVibGljIGdldCBkYXkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIE1vbnRoIHdoZXJlIEphbnVhcnkgPT0gMS5cbiAgICBwdWJsaWMgZ2V0IG1vbnRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIH1cblxuICAgIC8vIEZvdXIgZGlnaXQgeWVhci5cbiAgICBwdWJsaWMgZ2V0IHllYXIoKTogbnVtYmVyICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsMTApXG4gICAgfVxuXG4gICAgcHVibGljIHNldF9kYXkoZGF5OiBudW1iZXIpOiBDYWxlbmRhckRhdGUge1xuICAgICAgICB0aGlzLl9kYXRlLnNldFVUQ0RhdGUoZGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2FtZURheShkYXRlOiBDYWxlbmRhckRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA9PSBkYXRlLm1vbnRoICYmIHRoaXMuZGF5ID09IGRhdGUuZGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FmdGVyKGRhdGU6IENhbGVuZGFyRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA9PSBkYXRlLm1vbnRoICYmIHRoaXMuZGF5ID4gZGF0ZS5kYXkpIHx8XG4gICAgICAgICAgICAodGhpcy55ZWFyID09IGRhdGUueWVhciAmJiB0aGlzLm1vbnRoID4gZGF0ZS5tb250aCkgfHxcbiAgICAgICAgICAgICh0aGlzLnllYXIgPiBkYXRlLnllYXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0JlZm9yZShkYXRlOiBDYWxlbmRhckRhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnllYXIgPT0gZGF0ZS55ZWFyICYmIHRoaXMubW9udGggPT0gZGF0ZS5tb250aCAmJiB0aGlzLmRheSA8IGRhdGUuZGF5KSB8fFxuICAgICAgICAgICAgKHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA8IGRhdGUubW9udGgpIHx8XG4gICAgICAgICAgICAodGhpcy55ZWFyIDwgZGF0ZS55ZWFyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5leHRfZGF5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyRGF0ZSh0aGlzLnRvU3RyaW5nKCkpLnNldF9kYXkodGhpcy5kYXkgKyAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzX2RheSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckRhdGUodGhpcy50b1N0cmluZygpKS5zZXRfZGF5KHRoaXMuZGF5IC0gMSk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FsZW5kYXJFdmVudCB7XG5cbiAgICBwcml2YXRlIF9laWQgPSAwO1xuICAgIHByaXZhdGUgX2dpZCA9IDA7XG4gICAgcHJpdmF0ZSBfZGF0ZTogQ2FsZW5kYXJEYXRlO1xuICAgIHByb3RlY3RlZCBfdGl0bGUgPSAnVW5pbml0aWFsaXplZCBDYWxlbmRhckV2ZW50JztcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdHlwZTogJ2tleScgfCAndXNlJztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRlOiBzdHJpbmcsIHR5cGU6ICdrZXknIHwgJ3VzZScpIHtcbiAgICAgICAgdGhpcy5fZGF0ZSA9IG5ldyBDYWxlbmRhckRhdGUoZGF0ZSk7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCBjbG9uZSgpOiBDYWxlbmRhckV2ZW50O1xuXG4gICAgcHVibGljIGFic3RyYWN0IGdldCBjb2xvcnMoKTogW3N0cmluZywgc3RyaW5nXTtcblxuICAgIHB1YmxpYyBnZXQgZWlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZWlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGUudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldF9laWQoZWlkOiBudW1iZXIpOiBDYWxlbmRhckV2ZW50IHtcbiAgICAgICAgdGhpcy5fZWlkID0gZWlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0X2dpZChnaWQ6IG51bWJlcik6IENhbGVuZGFyRXZlbnQge1xuICAgICAgICB0aGlzLl9naWQgPSBnaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRfZGF0ZShkYXRlOiBzdHJpbmcgfCBDYWxlbmRhckRhdGUpOiBDYWxlbmRhckV2ZW50IHtcbiAgICAgICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBDYWxlbmRhckRhdGUpXG4gICAgICAgICAgICB0aGlzLl9kYXRlID0gZGF0ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fZGF0ZSA9IG5ldyBDYWxlbmRhckRhdGUoZGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFJlY3VycmluZyBldmVudHMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IG9mIGV2ZW50cyB3aXRoIHRoZSBzYW1lIGdpZC5cbiAgICAvLyBUaGUgdW50aWwgZGF0ZSBmb3IgYSByZWN1cnJpbmcgZXZlbnQgaXMgKmluY2x1c2l2ZSouXG4gICAgcHVibGljIG1ha2VfcmVjdXJyZW5jZSh3ZWVrZGF5czogQXJyYXk8bnVtYmVyPiwgdW50aWw6IHN0cmluZyk6IEFycmF5PENhbGVuZGFyRXZlbnQ+IHtcblxuICAgICAgICBjb25zdCBldmVudHM6IEFycmF5PENhbGVuZGFyRXZlbnQ+ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgZHQgPSB0aGlzLl9kYXRlOyAhZHQuaXNBZnRlcihuZXcgQ2FsZW5kYXJEYXRlKHVudGlsKSk7IGR0ID0gZHQubmV4dF9kYXkpIHtcblxuICAgICAgICAgICAgaWYgKHdlZWtkYXlzLmluY2x1ZGVzKGR0LndlZWtkYXkpKSB7XG4gICAgICAgICAgICAgICAgZXZlbnRzLnB1c2godGhpcy5jbG9uZSgpLnNldF9naWQodGhpcy5naWQpLnNldF9laWQodGhpcy5laWQpLnNldF9kYXRlKGR0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXZlbnRzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEtleUV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0ZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGRhdGUsICdrZXknKTtcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvbmUoKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHJldHVybiBuZXcgS2V5RXZlbnQodGhpcy5kYXRlLCB0aGlzLl90aXRsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjb2xvcnMoKTogW3N0cmluZywgc3RyaW5nXSB7XG4gICAgICAgIHJldHVybiBbQ09MT1JfWUVMTE9XLCBDT0xPUl9URVhUXVxuICAgIH0gXG59XG5cbmV4cG9ydCBjbGFzcyBVc2VFdmVudCBleHRlbmRzIENhbGVuZGFyRXZlbnQge1xuICAgIHByaXZhdGUgX2NhdGVnb3J5ID0gJyc7XG4gICAgcHJpdmF0ZSBfc3Vic3RhbmNlID0gJyc7XG4gICAgcHJpdmF0ZSBfbWV0aG9kID0gJyc7XG4gICAgcHJpdmF0ZSBfdGltZXMgPSAwO1xuICAgIHByaXZhdGUgX2Ftb3VudCA9IDA7XG4gICAgcHJpdmF0ZSBfdW5pdHMgPSAnJztcbiAgICBwcml2YXRlIF91bml0c090aGVyID0gJyc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0ZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBVc2VFdmVudFByb3BlcnRpZXMgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKGRhdGUsICd1c2UnKTtcblxuICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZXRfcHJvcGVydGllcyhwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvbmUoKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHJldHVybiBuZXcgVXNlRXZlbnQodGhpcy5kYXRlLCB0aGlzLnByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sb3JzKCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgICAgICByZXR1cm4gW0NPTE9SX1BVUlBMRSwgQ09MT1JfV0hJVEVdXG4gICAgfSBcblxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBVc2VFdmVudFByb3BlcnRpZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICAgdGhpcy5fY2F0ZWdvcnksXG4gICAgICAgICAgICBzdWJzdGFuY2U6ICB0aGlzLl9zdWJzdGFuY2UsXG4gICAgICAgICAgICBtZXRob2Q6ICAgICB0aGlzLl9tZXRob2QsXG4gICAgICAgICAgICB0aW1lczogICAgICB0aGlzLl90aW1lcyxcbiAgICAgICAgICAgIGFtb3VudDogICAgIHRoaXMuX2Ftb3VudCxcbiAgICAgICAgICAgIHVuaXRzOiAgICAgIHRoaXMuX3VuaXRzLFxuICAgICAgICAgICAgdW5pdHNPdGhlcjogdGhpcy5fdW5pdHNPdGhlclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRfcHJvcGVydGllcyhwcm9wZXJ0aWVzOiBVc2VFdmVudFByb3BlcnRpZXMpOiBDYWxlbmRhckV2ZW50IHtcbiAgICAgICAgdGhpcy5fY2F0ZWdvcnkgICA9IHByb3BlcnRpZXMuY2F0ZWdvcnk7XG4gICAgICAgIHRoaXMuX3N1YnN0YW5jZSAgPSBwcm9wZXJ0aWVzLnN1YnN0YW5jZTtcbiAgICAgICAgdGhpcy5fbWV0aG9kICAgICA9IHByb3BlcnRpZXMubWV0aG9kO1xuICAgICAgICB0aGlzLl90aW1lcyAgICAgID0gcHJvcGVydGllcy50aW1lcztcbiAgICAgICAgdGhpcy5fYW1vdW50ICAgICA9IHByb3BlcnRpZXMuYW1vdW50O1xuICAgICAgICB0aGlzLl91bml0cyAgICAgID0gcHJvcGVydGllcy51bml0cztcbiAgICAgICAgdGhpcy5fdW5pdHNPdGhlciA9IHByb3BlcnRpZXMudW5pdHNPdGhlcjtcbiAgICAgICAgdGhpcy51cGRhdGVfdGl0bGUoKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIHRpdGxlIGZvciB0aGUgZXZlbnQgZ2l2ZW4gdGhlIGV2ZW50IHByb3BlcnRpZXMuXG4gICAgcHJpdmF0ZSB1cGRhdGVfdGl0bGUoKSB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gdGhpcy5fY2F0ZWdvcnkgKyAnICgnICsgdGhpcy5fc3Vic3RhbmNlICsgJykgJyArIHRoaXMuX21ldGhvZCArICcgJyArIHRoaXMuX2Ftb3VudCArIHRoaXMuX3VuaXRzICsgJyBvdmVyICcgKyB0aGlzLl90aW1lcyArICcgb2NjYXNpb25zJztcbiAgICB9XG59XG5cbi8vIEEgQ2FsZW5kYXJFdmVudHMgb2JqZWN0IHN0b3JlcyBhbiBhcnJheSBvZiBjYWxlbmRhciBldmVudHMgYW5kIHByb3ZpZGVzXG4vLyBhIHNhZmUgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggdGhleSBjYW4gYmUgYWNjZXNzZWQgYW5kIHVwZGF0ZWQuXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJFdmVudExpc3Qge1xuICAgIHByaXZhdGUgX25leHRfZWlkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfbmV4dF9naWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9ldmVudHM6IEFycmF5PENhbGVuZGFyRXZlbnQ+O1xuICAgIHByaXZhdGUgX2Z1bGxjYWxlbmRhcjogQ2FsZW5kYXI7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhcnRfZGF0ZTogQ2FsZW5kYXJEYXRlO1xuICAgIHB1YmxpYyByZWFkb25seSBlbmRfZGF0ZTogQ2FsZW5kYXJEYXRlO1xuXG4gICAgLy8gU3RhcnQgYW5kIGVuZCBkYXRlcyBhcmUgKmluY2x1c2l2ZSAqLiBcbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc3RhcnQ6IHN0cmluZywgZW5kOiBzdHJpbmcsIGZ1bGxjYWxlbmRhcjogQ2FsZW5kYXIsICBldmVudHM6IEFycmF5PENhbGVuZGFyRXZlbnQ+IHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmV4dF9laWQgPSAxO1xuICAgICAgICB0aGlzLl9uZXh0X2dpZCA9IDE7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9mdWxsY2FsZW5kYXIgPSBmdWxsY2FsZW5kYXI7XG4gICAgICAgIHRoaXMuc3RhcnRfZGF0ZSA9IG5ldyBDYWxlbmRhckRhdGUoc3RhcnQpO1xuICAgICAgICB0aGlzLmVuZF9kYXRlID0gbmV3IENhbGVuZGFyRGF0ZShlbmQpO1xuXG4gICAgICAgIGlmIChldmVudHMgIT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuaW1wb3J0X2V2ZW50cyhldmVudHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldF9uZXh0X2VpZCgpIHtcbiAgICAgICAgY29uc3QgbmV4dF9laWQgPSB0aGlzLl9uZXh0X2VpZDtcbiAgICAgICAgdGhpcy5fbmV4dF9laWQrKztcbiAgICAgICAgcmV0dXJuIG5leHRfZWlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldF9uZXh0X2dpZCgpIHtcbiAgICAgICAgY29uc3QgbmV4dF9naWQgPSB0aGlzLl9uZXh0X2dpZDtcbiAgICAgICAgdGhpcy5fbmV4dF9naWQrKztcbiAgICAgICAgcmV0dXJuIG5leHRfZ2lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfZXZlbnQoZWlkOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9ldmVudHMuZmluZCgoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmVpZCA9PSBlaWQpO1xuICAgICAgICBpZiAoZXZlbnQgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENhbGVuZGFyRXZlbnRMaXN0LmdldF9ldmVudCgpOiBDb3VsZCBub3QgZmluZCBldmVudCAke2VpZH0uYClcbiAgICAgICAgcmV0dXJuIGV2ZW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudF9ncm91cChnaWQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuZ2lkID09IGdpZCk7XG4gICAgICAgIGlmIChldmVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDYWxlbmRhckV2ZW50TGlzdC5nZXRfZXZlbnRfZ3JvdXAoKTogQ291bGQgbm90IGZpbmQgZXZlbnRzIGluIGdyb3VwICR7Z2lkfS5gKVxuICAgICAgICByZXR1cm4gZXZlbnRzXG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudF9zaWJsaW5ncyhlaWQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZ2V0X2V2ZW50KGVpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldF9ldmVudF9ncm91cChldmVudC5naWQpLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmVpZCAhPSBlaWQpXG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudHMoKTogQXJyYXk8Q2FsZW5kYXJFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoZXZlbnQ6IENhbGVuZGFyRXZlbnQsIHJlYXNzaWduPXRydWUpOiBDYWxlbmRhckV2ZW50TGlzdCB7XG4gICAgICAgIHRoaXMuaW1wb3J0X2V2ZW50cyhbZXZlbnRdLCByZWFzc2lnbik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVfZXZlbnQoZWlkOiBudW1iZXIpOiBDYWxlbmRhckV2ZW50TGlzdCB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBldmVudC5laWQgIT0gZWlkKTtcbiAgICAgICAgdGhpcy5fZnVsbGNhbGVuZGFyLmdldEV2ZW50QnlJZChlaWQudG9TdHJpbmcoKSk/LnJlbW92ZSgpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVfZ3JvdXAoZ2lkOiBudW1iZXIpOiBDYWxlbmRhckV2ZW50TGlzdCB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBldmVudC5naWQgIT0gZ2lkKTtcblxuICAgICAgICB0aGlzLl9mdWxsY2FsZW5kYXIuZ2V0RXZlbnRzKCkuZm9yRWFjaChcbiAgICAgICAgICAgIChldmVudCkgPT4ge2lmIChldmVudC5ncm91cElkID09IGdpZC50b1N0cmluZygpKSBldmVudC5yZW1vdmUoKX1cbiAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEltcG9ydCBldmVudHMgZnJvbSBhbiBhcnJheS5cbiAgICBwdWJsaWMgaW1wb3J0X2V2ZW50cyhldmVudHM6IEFycmF5PENhbGVuZGFyRXZlbnQ+LCByZWFzc2lnbj10cnVlKTogQ2FsZW5kYXJFdmVudExpc3Qge1xuICAgICAgICBcbiAgICAgICAgLy8gR3JvdXAgcmVsYXRpb25zaGlwcyBtdXN0IGJlIHByZXNlcnZlZC5cbiAgICAgICAgY29uc3QgZ2lkX21hcHBpbmcgPSBcbiAgICAgICAgICAgIGV2ZW50cy5yZWR1Y2UoKGFjYzogTWFwPG51bWJlciwgbnVtYmVyPiwgY3VyOiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1ci5naWQgPT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXZlbnQgaXMgbWlzc2luZyBhIEdJRCBhbmQgY2Fubm90IGJlIGltcG9ydGVkLicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFhY2MuaGFzKGN1ci5naWQpKVxuICAgICAgICAgICAgICAgICAgICBhY2Muc2V0KGN1ci5naWQsIHRoaXMuX2dldF9uZXh0X2dpZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIG5ldyBNYXAoKSk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRzID0gXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMuY29uY2F0KGV2ZW50cy5tYXAoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWlkID0gdGhpcy5fZ2V0X25leHRfZWlkKClcbiAgICAgICAgICAgICAgICBjb25zdCBnaWQgPSBnaWRfbWFwcGluZy5nZXQoZXZlbnQuZ2lkKVxuXG4gICAgICAgICAgICAgICAgLy8gRXZlbnRzIGNhbiBiZSBhc3NpZ25lZCBhIGNvbXBsZXRlbHkgbmV3IGVpZC5cbiAgICAgICAgICAgICAgICBldmVudC5zZXRfZWlkKGVpZCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlYXNzaWduKVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIE1hcC5wcm90b3R5cGUuZ2V0KCkgY2FuIHJldHVybiB1bmRlZmluZWQuIFRoYXQgc2hvdWxkbid0IGhhcHBlbiBoZXJlLlxuICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRfZ2lkKGdpZCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsY2FsZW5kYXIuYWRkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogZXZlbnQuZWlkLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ6IGV2ZW50LmdpZC50b1N0cmluZygpLFxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBldmVudC5kYXRlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZXZlbnQudGl0bGUsXG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiBldmVudC5jb2xvcnNbMV0sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZXZlbnQuY29sb3JzWzBdLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogZXZlbnQuY29sb3JzWzBdXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVfZXZlbnRzKGFzOiAnY3N2JyB8ICdqc29uJykge1xuICAgICAgICBzd2l0Y2ggKGFzKSB7XG4gICAgICAgICAgICBjYXNlICdjc3YnOlxuICAgICAgICAgICAgICAgIGFsZXJ0KCdDYWxlbmRhckV2ZW50cy5zZXJpYWxpemVfZXZlbnRzKFxcJ2NzdlxcJyk6IE5vdCBpbXBsZW1lbnRlZC4nKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdqc29uJzpcbiAgICAgICAgICAgICAgICBhbGVydCgnQ2FsZW5kYXJFdmVudHMuc2VyaWFsaXplX2V2ZW50cyhcXCdqc29uXFwnKTogTm90IGltcGxlbWVudGVkLicpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogdXRpbC50c1xuICpcbiAqIE1pc2NlbGxhbm91cyBoZWxwZXIgZnVuY3Rpb25zXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLCBNaWNoYWVsIFBhc2NhbGUgPG1wcGFzY2FsZUBtZ2guaGFydmFyZC5lZHU+XG4gKiBMYXN0IG1vZGlmaWVkOiAyMDIzLTA3LTI3XG4gKi9cblxuLy8gU2V0IHRoZSBJbm5lclRleHQgb2YgYW4gZWxlbWVudC5cbmV4cG9ydCBmdW5jdGlvbiBzZXRfaW5uZXIoaWQ6IHN0cmluZywgdGV4dDogc3RyaW5nIHwgTm9kZUxpc3QpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIFxuICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbGVjdCBlbGVtZW50ICMke2lkfS5gKVxuXG4gICAgaWYgKHRleHQgaW5zdGFuY2VvZiBOb2RlTGlzdClcbiAgICAgICAgdGV4dC5mb3JFYWNoKHggPT4gZWxlbWVudC5hcHBlbmRDaGlsZCh4KSk7XG4gICAgZWxzZVxuICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9IHRleHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kX3BhcmVudF9tb2RhbChlbDogRWxlbWVudCkge1xuICAgIGNvbnN0IG1vZGFsID0gZWwuY2xvc2VzdCgnLm1vZGFsJyk7XG5cbiAgICBpZiAobW9kYWwgPT0gbnVsbClcbiAgICAgICAgdGhyb3cgRXJyb3IoYGZpbmRfcGFyZW50X21vZGFsOiBObyBtb2RhbCBmb3VuZCBpbiBhbmNlc3RyeSBvZiAke2VsfS5gKTtcblxuICAgIHJldHVybiBtb2RhbDtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIGludGVybmFsQ29tbW9uID0gcmVxdWlyZSgnLi9pbnRlcm5hbC1jb21tb24uY2pzJyk7XG52YXIgcHJlYWN0ID0gcmVxdWlyZSgncHJlYWN0Jyk7XG5yZXF1aXJlKCdwcmVhY3QvY29tcGF0Jyk7XG5cbmNvbnN0IGdsb2JhbExvY2FsZXMgPSBbXTtcblxuY29uc3QgTUlOSU1BTF9SQVdfRU5fTE9DQUxFID0ge1xuICAgIGNvZGU6ICdlbicsXG4gICAgd2Vlazoge1xuICAgICAgICBkb3c6IDAsXG4gICAgICAgIGRveTogNCwgLy8gNCBkYXlzIG5lZWQgdG8gYmUgd2l0aGluIHRoZSB5ZWFyIHRvIGJlIGNvbnNpZGVyZWQgdGhlIGZpcnN0IHdlZWtcbiAgICB9LFxuICAgIGRpcmVjdGlvbjogJ2x0cicsXG4gICAgYnV0dG9uVGV4dDoge1xuICAgICAgICBwcmV2OiAncHJldicsXG4gICAgICAgIG5leHQ6ICduZXh0JyxcbiAgICAgICAgcHJldlllYXI6ICdwcmV2IHllYXInLFxuICAgICAgICBuZXh0WWVhcjogJ25leHQgeWVhcicsXG4gICAgICAgIHllYXI6ICd5ZWFyJyxcbiAgICAgICAgdG9kYXk6ICd0b2RheScsXG4gICAgICAgIG1vbnRoOiAnbW9udGgnLFxuICAgICAgICB3ZWVrOiAnd2VlaycsXG4gICAgICAgIGRheTogJ2RheScsXG4gICAgICAgIGxpc3Q6ICdsaXN0JyxcbiAgICB9LFxuICAgIHdlZWtUZXh0OiAnVycsXG4gICAgd2Vla1RleHRMb25nOiAnV2VlaycsXG4gICAgY2xvc2VIaW50OiAnQ2xvc2UnLFxuICAgIHRpbWVIaW50OiAnVGltZScsXG4gICAgZXZlbnRIaW50OiAnRXZlbnQnLFxuICAgIGFsbERheVRleHQ6ICdhbGwtZGF5JyxcbiAgICBtb3JlTGlua1RleHQ6ICdtb3JlJyxcbiAgICBub0V2ZW50c1RleHQ6ICdObyBldmVudHMgdG8gZGlzcGxheScsXG59O1xuY29uc3QgUkFXX0VOX0xPQ0FMRSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgTUlOSU1BTF9SQVdfRU5fTE9DQUxFKSwgeyBcbiAgICAvLyBJbmNsdWRlcyB0aGluZ3Mgd2UgZG9uJ3Qgd2FudCBvdGhlciBsb2NhbGVzIHRvIGluaGVyaXQsXG4gICAgLy8gdGhpbmdzIHRoYXQgZGVyaXZlIGZyb20gb3RoZXIgdHJhbnNsYXRhYmxlIHN0cmluZ3MuXG4gICAgYnV0dG9uSGludHM6IHtcbiAgICAgICAgcHJldjogJ1ByZXZpb3VzICQwJyxcbiAgICAgICAgbmV4dDogJ05leHQgJDAnLFxuICAgICAgICB0b2RheShidXR0b25UZXh0LCB1bml0KSB7XG4gICAgICAgICAgICByZXR1cm4gKHVuaXQgPT09ICdkYXknKVxuICAgICAgICAgICAgICAgID8gJ1RvZGF5J1xuICAgICAgICAgICAgICAgIDogYFRoaXMgJHtidXR0b25UZXh0fWA7XG4gICAgICAgIH0sXG4gICAgfSwgdmlld0hpbnQ6ICckMCB2aWV3JywgbmF2TGlua0hpbnQ6ICdHbyB0byAkMCcsIG1vcmVMaW5rSGludChldmVudENudCkge1xuICAgICAgICByZXR1cm4gYFNob3cgJHtldmVudENudH0gbW9yZSBldmVudCR7ZXZlbnRDbnQgPT09IDEgPyAnJyA6ICdzJ31gO1xuICAgIH0gfSk7XG5mdW5jdGlvbiBvcmdhbml6ZVJhd0xvY2FsZXMoZXhwbGljaXRSYXdMb2NhbGVzKSB7XG4gICAgbGV0IGRlZmF1bHRDb2RlID0gZXhwbGljaXRSYXdMb2NhbGVzLmxlbmd0aCA+IDAgPyBleHBsaWNpdFJhd0xvY2FsZXNbMF0uY29kZSA6ICdlbic7XG4gICAgbGV0IGFsbFJhd0xvY2FsZXMgPSBnbG9iYWxMb2NhbGVzLmNvbmNhdChleHBsaWNpdFJhd0xvY2FsZXMpO1xuICAgIGxldCByYXdMb2NhbGVNYXAgPSB7XG4gICAgICAgIGVuOiBSQVdfRU5fTE9DQUxFLFxuICAgIH07XG4gICAgZm9yIChsZXQgcmF3TG9jYWxlIG9mIGFsbFJhd0xvY2FsZXMpIHtcbiAgICAgICAgcmF3TG9jYWxlTWFwW3Jhd0xvY2FsZS5jb2RlXSA9IHJhd0xvY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbWFwOiByYXdMb2NhbGVNYXAsXG4gICAgICAgIGRlZmF1bHRDb2RlLFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZExvY2FsZShpbnB1dFNpbmd1bGFyLCBhdmFpbGFibGUpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0U2luZ3VsYXIgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGlucHV0U2luZ3VsYXIpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUxvY2FsZShpbnB1dFNpbmd1bGFyLmNvZGUsIFtpbnB1dFNpbmd1bGFyLmNvZGVdLCBpbnB1dFNpbmd1bGFyKTtcbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5TG9jYWxlKGlucHV0U2luZ3VsYXIsIGF2YWlsYWJsZSk7XG59XG5mdW5jdGlvbiBxdWVyeUxvY2FsZShjb2RlQXJnLCBhdmFpbGFibGUpIHtcbiAgICBsZXQgY29kZXMgPSBbXS5jb25jYXQoY29kZUFyZyB8fCBbXSk7IC8vIHdpbGwgY29udmVydCB0byBhcnJheVxuICAgIGxldCByYXcgPSBxdWVyeVJhd0xvY2FsZShjb2RlcywgYXZhaWxhYmxlKSB8fCBSQVdfRU5fTE9DQUxFO1xuICAgIHJldHVybiBwYXJzZUxvY2FsZShjb2RlQXJnLCBjb2RlcywgcmF3KTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5UmF3TG9jYWxlKGNvZGVzLCBhdmFpbGFibGUpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCBwYXJ0cyA9IGNvZGVzW2ldLnRvTG9jYWxlTG93ZXJDYXNlKCkuc3BsaXQoJy0nKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IHBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkge1xuICAgICAgICAgICAgbGV0IHNpbXBsZUlkID0gcGFydHMuc2xpY2UoMCwgaikuam9pbignLScpO1xuICAgICAgICAgICAgaWYgKGF2YWlsYWJsZVtzaW1wbGVJZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlW3NpbXBsZUlkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlTG9jYWxlKGNvZGVBcmcsIGNvZGVzLCByYXcpIHtcbiAgICBsZXQgbWVyZ2VkID0gaW50ZXJuYWxDb21tb24ubWVyZ2VQcm9wcyhbTUlOSU1BTF9SQVdfRU5fTE9DQUxFLCByYXddLCBbJ2J1dHRvblRleHQnXSk7XG4gICAgZGVsZXRlIG1lcmdlZC5jb2RlOyAvLyBkb24ndCB3YW50IHRoaXMgcGFydCBvZiB0aGUgb3B0aW9uc1xuICAgIGxldCB7IHdlZWsgfSA9IG1lcmdlZDtcbiAgICBkZWxldGUgbWVyZ2VkLndlZWs7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29kZUFyZyxcbiAgICAgICAgY29kZXMsXG4gICAgICAgIHdlZWssXG4gICAgICAgIHNpbXBsZU51bWJlckZvcm1hdDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGNvZGVBcmcpLFxuICAgICAgICBvcHRpb25zOiBtZXJnZWQsXG4gICAgfTtcbn1cblxuLy8gVE9ETzogZWFzaWVyIHdheSB0byBhZGQgbmV3IGhvb2tzPyBuZWVkIHRvIHVwZGF0ZSBhIG1pbGxpb24gdGhpbmdzXG5mdW5jdGlvbiBjcmVhdGVQbHVnaW4oaW5wdXQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogaW50ZXJuYWxDb21tb24uZ3VpZCgpLFxuICAgICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgICBwcmVtaXVtUmVsZWFzZURhdGU6IGlucHV0LnByZW1pdW1SZWxlYXNlRGF0ZSA/IG5ldyBEYXRlKGlucHV0LnByZW1pdW1SZWxlYXNlRGF0ZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlcHM6IGlucHV0LmRlcHMgfHwgW10sXG4gICAgICAgIHJlZHVjZXJzOiBpbnB1dC5yZWR1Y2VycyB8fCBbXSxcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IGlucHV0LmlzTG9hZGluZ0Z1bmNzIHx8IFtdLFxuICAgICAgICBjb250ZXh0SW5pdDogW10uY29uY2F0KGlucHV0LmNvbnRleHRJbml0IHx8IFtdKSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczogaW5wdXQuZXZlbnRSZWZpbmVycyB8fCB7fSxcbiAgICAgICAgZXZlbnREZWZNZW1iZXJBZGRlcnM6IGlucHV0LmV2ZW50RGVmTWVtYmVyQWRkZXJzIHx8IFtdLFxuICAgICAgICBldmVudFNvdXJjZVJlZmluZXJzOiBpbnB1dC5ldmVudFNvdXJjZVJlZmluZXJzIHx8IHt9LFxuICAgICAgICBpc0RyYWdnYWJsZVRyYW5zZm9ybWVyczogaW5wdXQuaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzOiBpbnB1dC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyB8fCBbXSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBpbnB1dC5ldmVudERlZk11dGF0aW9uQXBwbGllcnMgfHwgW10sXG4gICAgICAgIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnM6IGlucHV0LmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGRhdGVQb2ludFRyYW5zZm9ybXM6IGlucHV0LmRhdGVQb2ludFRyYW5zZm9ybXMgfHwgW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogaW5wdXQuZGF0ZVNwYW5UcmFuc2Zvcm1zIHx8IFtdLFxuICAgICAgICB2aWV3czogaW5wdXQudmlld3MgfHwge30sXG4gICAgICAgIHZpZXdQcm9wc1RyYW5zZm9ybWVyczogaW5wdXQudmlld1Byb3BzVHJhbnNmb3JtZXJzIHx8IFtdLFxuICAgICAgICBpc1Byb3BzVmFsaWQ6IGlucHV0LmlzUHJvcHNWYWxpZCB8fCBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IGlucHV0LmV4dGVybmFsRGVmVHJhbnNmb3JtcyB8fCBbXSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IGlucHV0LnZpZXdDb250YWluZXJBcHBlbmRzIHx8IFtdLFxuICAgICAgICBldmVudERyb3BUcmFuc2Zvcm1lcnM6IGlucHV0LmV2ZW50RHJvcFRyYW5zZm9ybWVycyB8fCBbXSxcbiAgICAgICAgY29tcG9uZW50SW50ZXJhY3Rpb25zOiBpbnB1dC5jb21wb25lbnRJbnRlcmFjdGlvbnMgfHwgW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBpbnB1dC5jYWxlbmRhckludGVyYWN0aW9ucyB8fCBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiBpbnB1dC50aGVtZUNsYXNzZXMgfHwge30sXG4gICAgICAgIGV2ZW50U291cmNlRGVmczogaW5wdXQuZXZlbnRTb3VyY2VEZWZzIHx8IFtdLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGlucHV0LmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGlucHV0LnJlY3VycmluZ1R5cGVzIHx8IFtdLFxuICAgICAgICBuYW1lZFRpbWVab25lZEltcGw6IGlucHV0Lm5hbWVkVGltZVpvbmVkSW1wbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6IGlucHV0LmluaXRpYWxWaWV3IHx8ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBpbnB1dC5lbGVtZW50RHJhZ2dpbmdJbXBsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczogaW5wdXQub3B0aW9uQ2hhbmdlSGFuZGxlcnMgfHwge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBpbnB1dC5zY3JvbGxHcmlkSW1wbCB8fCBudWxsLFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiBpbnB1dC5saXN0ZW5lclJlZmluZXJzIHx8IHt9LFxuICAgICAgICBvcHRpb25SZWZpbmVyczogaW5wdXQub3B0aW9uUmVmaW5lcnMgfHwge30sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczogaW5wdXQucHJvcFNldEhhbmRsZXJzIHx8IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZFBsdWdpbkhvb2tzKHBsdWdpbkRlZnMsIGdsb2JhbERlZnMpIHtcbiAgICBsZXQgY3VycmVudFBsdWdpbklkcyA9IHt9O1xuICAgIGxldCBob29rcyA9IHtcbiAgICAgICAgcHJlbWl1bVJlbGVhc2VEYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIHJlZHVjZXJzOiBbXSxcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IFtdLFxuICAgICAgICBjb250ZXh0SW5pdDogW10sXG4gICAgICAgIGV2ZW50UmVmaW5lcnM6IHt9LFxuICAgICAgICBldmVudERlZk1lbWJlckFkZGVyczogW10sXG4gICAgICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IHt9LFxuICAgICAgICBpc0RyYWdnYWJsZVRyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzOiBbXSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBbXSxcbiAgICAgICAgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGRhdGVQb2ludFRyYW5zZm9ybXM6IFtdLFxuICAgICAgICBkYXRlU3BhblRyYW5zZm9ybXM6IFtdLFxuICAgICAgICB2aWV3czoge30sXG4gICAgICAgIHZpZXdQcm9wc1RyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGlzUHJvcHNWYWxpZDogbnVsbCxcbiAgICAgICAgZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zOiBbXSxcbiAgICAgICAgdmlld0NvbnRhaW5lckFwcGVuZHM6IFtdLFxuICAgICAgICBldmVudERyb3BUcmFuc2Zvcm1lcnM6IFtdLFxuICAgICAgICBjb21wb25lbnRJbnRlcmFjdGlvbnM6IFtdLFxuICAgICAgICBjYWxlbmRhckludGVyYWN0aW9uczogW10sXG4gICAgICAgIHRoZW1lQ2xhc3Nlczoge30sXG4gICAgICAgIGV2ZW50U291cmNlRGVmczogW10sXG4gICAgICAgIGNtZEZvcm1hdHRlcjogbnVsbCxcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IFtdLFxuICAgICAgICBuYW1lZFRpbWVab25lZEltcGw6IG51bGwsXG4gICAgICAgIGluaXRpYWxWaWV3OiAnJyxcbiAgICAgICAgZWxlbWVudERyYWdnaW5nSW1wbDogbnVsbCxcbiAgICAgICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IHt9LFxuICAgICAgICBzY3JvbGxHcmlkSW1wbDogbnVsbCxcbiAgICAgICAgbGlzdGVuZXJSZWZpbmVyczoge30sXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiB7fSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiB7fSxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGFkZERlZnMoZGVmcykge1xuICAgICAgICBmb3IgKGxldCBkZWYgb2YgZGVmcykge1xuICAgICAgICAgICAgY29uc3QgcGx1Z2luTmFtZSA9IGRlZi5uYW1lO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudElkID0gY3VycmVudFBsdWdpbklkc1twbHVnaW5OYW1lXTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQbHVnaW5JZHNbcGx1Z2luTmFtZV0gPSBkZWYuaWQ7XG4gICAgICAgICAgICAgICAgYWRkRGVmcyhkZWYuZGVwcyk7XG4gICAgICAgICAgICAgICAgaG9va3MgPSBjb21iaW5lSG9va3MoaG9va3MsIGRlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50SWQgIT09IGRlZi5pZCkge1xuICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBJRCB0aGFuIHRoZSBvbmUgYWxyZWFkeSBhZGRlZFxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRHVwbGljYXRlIHBsdWdpbiAnJHtwbHVnaW5OYW1lfSdgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGx1Z2luRGVmcykge1xuICAgICAgICBhZGREZWZzKHBsdWdpbkRlZnMpO1xuICAgIH1cbiAgICBhZGREZWZzKGdsb2JhbERlZnMpO1xuICAgIHJldHVybiBob29rcztcbn1cbmZ1bmN0aW9uIGJ1aWxkQnVpbGRQbHVnaW5Ib29rcygpIHtcbiAgICBsZXQgY3VycmVudE92ZXJyaWRlRGVmcyA9IFtdO1xuICAgIGxldCBjdXJyZW50R2xvYmFsRGVmcyA9IFtdO1xuICAgIGxldCBjdXJyZW50SG9va3M7XG4gICAgcmV0dXJuIChvdmVycmlkZURlZnMsIGdsb2JhbERlZnMpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50SG9va3MgfHwgIWludGVybmFsQ29tbW9uLmlzQXJyYXlzRXF1YWwob3ZlcnJpZGVEZWZzLCBjdXJyZW50T3ZlcnJpZGVEZWZzKSB8fCAhaW50ZXJuYWxDb21tb24uaXNBcnJheXNFcXVhbChnbG9iYWxEZWZzLCBjdXJyZW50R2xvYmFsRGVmcykpIHtcbiAgICAgICAgICAgIGN1cnJlbnRIb29rcyA9IGJ1aWxkUGx1Z2luSG9va3Mob3ZlcnJpZGVEZWZzLCBnbG9iYWxEZWZzKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50T3ZlcnJpZGVEZWZzID0gb3ZlcnJpZGVEZWZzO1xuICAgICAgICBjdXJyZW50R2xvYmFsRGVmcyA9IGdsb2JhbERlZnM7XG4gICAgICAgIHJldHVybiBjdXJyZW50SG9va3M7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVIb29rcyhob29rczAsIGhvb2tzMSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHByZW1pdW1SZWxlYXNlRGF0ZTogY29tcGFyZU9wdGlvbmFsRGF0ZXMoaG9va3MwLnByZW1pdW1SZWxlYXNlRGF0ZSwgaG9va3MxLnByZW1pdW1SZWxlYXNlRGF0ZSksXG4gICAgICAgIHJlZHVjZXJzOiBob29rczAucmVkdWNlcnMuY29uY2F0KGhvb2tzMS5yZWR1Y2VycyksXG4gICAgICAgIGlzTG9hZGluZ0Z1bmNzOiBob29rczAuaXNMb2FkaW5nRnVuY3MuY29uY2F0KGhvb2tzMS5pc0xvYWRpbmdGdW5jcyksXG4gICAgICAgIGNvbnRleHRJbml0OiBob29rczAuY29udGV4dEluaXQuY29uY2F0KGhvb2tzMS5jb250ZXh0SW5pdCksXG4gICAgICAgIGV2ZW50UmVmaW5lcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLmV2ZW50UmVmaW5lcnMpLCBob29rczEuZXZlbnRSZWZpbmVycyksXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBob29rczAuZXZlbnREZWZNZW1iZXJBZGRlcnMuY29uY2F0KGhvb2tzMS5ldmVudERlZk1lbWJlckFkZGVycyksXG4gICAgICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLmV2ZW50U291cmNlUmVmaW5lcnMpLCBob29rczEuZXZlbnRTb3VyY2VSZWZpbmVycyksXG4gICAgICAgIGlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzOiBob29rczAuaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycyksXG4gICAgICAgIGV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzOiBob29rczAuZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnMuY29uY2F0KGhvb2tzMS5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2VycyksXG4gICAgICAgIGV2ZW50RGVmTXV0YXRpb25BcHBsaWVyczogaG9va3MwLmV2ZW50RGVmTXV0YXRpb25BcHBsaWVycy5jb25jYXQoaG9va3MxLmV2ZW50RGVmTXV0YXRpb25BcHBsaWVycyksXG4gICAgICAgIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnM6IGhvb2tzMC5kYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzLmNvbmNhdChob29rczEuZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycyksXG4gICAgICAgIGRhdGVQb2ludFRyYW5zZm9ybXM6IGhvb2tzMC5kYXRlUG9pbnRUcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZGF0ZVBvaW50VHJhbnNmb3JtcyksXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogaG9va3MwLmRhdGVTcGFuVHJhbnNmb3Jtcy5jb25jYXQoaG9va3MxLmRhdGVTcGFuVHJhbnNmb3JtcyksXG4gICAgICAgIHZpZXdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGhvb2tzMC52aWV3cyksIGhvb2tzMS52aWV3cyksXG4gICAgICAgIHZpZXdQcm9wc1RyYW5zZm9ybWVyczogaG9va3MwLnZpZXdQcm9wc1RyYW5zZm9ybWVycy5jb25jYXQoaG9va3MxLnZpZXdQcm9wc1RyYW5zZm9ybWVycyksXG4gICAgICAgIGlzUHJvcHNWYWxpZDogaG9va3MxLmlzUHJvcHNWYWxpZCB8fCBob29rczAuaXNQcm9wc1ZhbGlkLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IGhvb2tzMC5leHRlcm5hbERlZlRyYW5zZm9ybXMuY29uY2F0KGhvb2tzMS5leHRlcm5hbERlZlRyYW5zZm9ybXMpLFxuICAgICAgICB2aWV3Q29udGFpbmVyQXBwZW5kczogaG9va3MwLnZpZXdDb250YWluZXJBcHBlbmRzLmNvbmNhdChob29rczEudmlld0NvbnRhaW5lckFwcGVuZHMpLFxuICAgICAgICBldmVudERyb3BUcmFuc2Zvcm1lcnM6IGhvb2tzMC5ldmVudERyb3BUcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS5ldmVudERyb3BUcmFuc2Zvcm1lcnMpLFxuICAgICAgICBjYWxlbmRhckludGVyYWN0aW9uczogaG9va3MwLmNhbGVuZGFySW50ZXJhY3Rpb25zLmNvbmNhdChob29rczEuY2FsZW5kYXJJbnRlcmFjdGlvbnMpLFxuICAgICAgICBjb21wb25lbnRJbnRlcmFjdGlvbnM6IGhvb2tzMC5jb21wb25lbnRJbnRlcmFjdGlvbnMuY29uY2F0KGhvb2tzMS5jb21wb25lbnRJbnRlcmFjdGlvbnMpLFxuICAgICAgICB0aGVtZUNsYXNzZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLnRoZW1lQ2xhc3NlcyksIGhvb2tzMS50aGVtZUNsYXNzZXMpLFxuICAgICAgICBldmVudFNvdXJjZURlZnM6IGhvb2tzMC5ldmVudFNvdXJjZURlZnMuY29uY2F0KGhvb2tzMS5ldmVudFNvdXJjZURlZnMpLFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IGhvb2tzMS5jbWRGb3JtYXR0ZXIgfHwgaG9va3MwLmNtZEZvcm1hdHRlcixcbiAgICAgICAgcmVjdXJyaW5nVHlwZXM6IGhvb2tzMC5yZWN1cnJpbmdUeXBlcy5jb25jYXQoaG9va3MxLnJlY3VycmluZ1R5cGVzKSxcbiAgICAgICAgbmFtZWRUaW1lWm9uZWRJbXBsOiBob29rczEubmFtZWRUaW1lWm9uZWRJbXBsIHx8IGhvb2tzMC5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGluaXRpYWxWaWV3OiBob29rczAuaW5pdGlhbFZpZXcgfHwgaG9va3MxLmluaXRpYWxWaWV3LFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBob29rczAuZWxlbWVudERyYWdnaW5nSW1wbCB8fCBob29rczEuZWxlbWVudERyYWdnaW5nSW1wbCxcbiAgICAgICAgb3B0aW9uQ2hhbmdlSGFuZGxlcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLm9wdGlvbkNoYW5nZUhhbmRsZXJzKSwgaG9va3MxLm9wdGlvbkNoYW5nZUhhbmRsZXJzKSxcbiAgICAgICAgc2Nyb2xsR3JpZEltcGw6IGhvb2tzMS5zY3JvbGxHcmlkSW1wbCB8fCBob29rczAuc2Nyb2xsR3JpZEltcGwsXG4gICAgICAgIGxpc3RlbmVyUmVmaW5lcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLmxpc3RlbmVyUmVmaW5lcnMpLCBob29rczEubGlzdGVuZXJSZWZpbmVycyksXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGhvb2tzMC5vcHRpb25SZWZpbmVycyksIGhvb2tzMS5vcHRpb25SZWZpbmVycyksXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAucHJvcFNldEhhbmRsZXJzKSwgaG9va3MxLnByb3BTZXRIYW5kbGVycyksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVPcHRpb25hbERhdGVzKGRhdGUwLCBkYXRlMSkge1xuICAgIGlmIChkYXRlMCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBkYXRlMTtcbiAgICB9XG4gICAgaWYgKGRhdGUxID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGUwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoTWF0aC5tYXgoZGF0ZTAudmFsdWVPZigpLCBkYXRlMS52YWx1ZU9mKCkpKTtcbn1cblxuY2xhc3MgU3RhbmRhcmRUaGVtZSBleHRlbmRzIGludGVybmFsQ29tbW9uLlRoZW1lIHtcbn1cblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmNsYXNzZXMgPSB7XG4gICAgcm9vdDogJ2ZjLXRoZW1lLXN0YW5kYXJkJyxcbiAgICB0YWJsZUNlbGxTaGFkZWQ6ICdmYy1jZWxsLXNoYWRlZCcsXG4gICAgYnV0dG9uR3JvdXA6ICdmYy1idXR0b24tZ3JvdXAnLFxuICAgIGJ1dHRvbjogJ2ZjLWJ1dHRvbiBmYy1idXR0b24tcHJpbWFyeScsXG4gICAgYnV0dG9uQWN0aXZlOiAnZmMtYnV0dG9uLWFjdGl2ZScsXG59O1xuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuYmFzZUljb25DbGFzcyA9ICdmYy1pY29uJztcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLmljb25DbGFzc2VzID0ge1xuICAgIGNsb3NlOiAnZmMtaWNvbi14JyxcbiAgICBwcmV2OiAnZmMtaWNvbi1jaGV2cm9uLWxlZnQnLFxuICAgIG5leHQ6ICdmYy1pY29uLWNoZXZyb24tcmlnaHQnLFxuICAgIHByZXZZZWFyOiAnZmMtaWNvbi1jaGV2cm9ucy1sZWZ0JyxcbiAgICBuZXh0WWVhcjogJ2ZjLWljb24tY2hldnJvbnMtcmlnaHQnLFxufTtcblN0YW5kYXJkVGhlbWUucHJvdG90eXBlLnJ0bEljb25DbGFzc2VzID0ge1xuICAgIHByZXY6ICdmYy1pY29uLWNoZXZyb24tcmlnaHQnLFxuICAgIG5leHQ6ICdmYy1pY29uLWNoZXZyb24tbGVmdCcsXG4gICAgcHJldlllYXI6ICdmYy1pY29uLWNoZXZyb25zLXJpZ2h0JyxcbiAgICBuZXh0WWVhcjogJ2ZjLWljb24tY2hldnJvbnMtbGVmdCcsXG59O1xuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlT3B0aW9uID0gJ2J1dHRvbkljb25zJzsgLy8gVE9ETzogbWFrZSBUUy1mcmllbmRseVxuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlQ3VzdG9tQnV0dG9uT3B0aW9uID0gJ2ljb24nO1xuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlUHJlZml4ID0gJ2ZjLWljb24tJztcblxuZnVuY3Rpb24gY29tcGlsZVZpZXdEZWZzKGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpIHtcbiAgICBsZXQgaGFzaCA9IHt9O1xuICAgIGxldCB2aWV3VHlwZTtcbiAgICBmb3IgKHZpZXdUeXBlIGluIGRlZmF1bHRDb25maWdzKSB7XG4gICAgICAgIGVuc3VyZVZpZXdEZWYodmlld1R5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIH1cbiAgICBmb3IgKHZpZXdUeXBlIGluIG92ZXJyaWRlQ29uZmlncykge1xuICAgICAgICBlbnN1cmVWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc2g7XG59XG5mdW5jdGlvbiBlbnN1cmVWaWV3RGVmKHZpZXdUeXBlLCBoYXNoLCBkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgaWYgKGhhc2hbdmlld1R5cGVdKSB7XG4gICAgICAgIHJldHVybiBoYXNoW3ZpZXdUeXBlXTtcbiAgICB9XG4gICAgbGV0IHZpZXdEZWYgPSBidWlsZFZpZXdEZWYodmlld1R5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIGlmICh2aWV3RGVmKSB7XG4gICAgICAgIGhhc2hbdmlld1R5cGVdID0gdmlld0RlZjtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdEZWY7XG59XG5mdW5jdGlvbiBidWlsZFZpZXdEZWYodmlld1R5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpIHtcbiAgICBsZXQgZGVmYXVsdENvbmZpZyA9IGRlZmF1bHRDb25maWdzW3ZpZXdUeXBlXTtcbiAgICBsZXQgb3ZlcnJpZGVDb25maWcgPSBvdmVycmlkZUNvbmZpZ3Nbdmlld1R5cGVdO1xuICAgIGxldCBxdWVyeVByb3AgPSAobmFtZSkgPT4gKChkZWZhdWx0Q29uZmlnICYmIGRlZmF1bHRDb25maWdbbmFtZV0gIT09IG51bGwpID8gZGVmYXVsdENvbmZpZ1tuYW1lXSA6XG4gICAgICAgICgob3ZlcnJpZGVDb25maWcgJiYgb3ZlcnJpZGVDb25maWdbbmFtZV0gIT09IG51bGwpID8gb3ZlcnJpZGVDb25maWdbbmFtZV0gOiBudWxsKSk7XG4gICAgbGV0IHRoZUNvbXBvbmVudCA9IHF1ZXJ5UHJvcCgnY29tcG9uZW50Jyk7XG4gICAgbGV0IHN1cGVyVHlwZSA9IHF1ZXJ5UHJvcCgnc3VwZXJUeXBlJyk7XG4gICAgbGV0IHN1cGVyRGVmID0gbnVsbDtcbiAgICBpZiAoc3VwZXJUeXBlKSB7XG4gICAgICAgIGlmIChzdXBlclR5cGUgPT09IHZpZXdUeXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgaGF2ZSBhIGN1c3RvbSB2aWV3IHR5cGUgdGhhdCByZWZlcmVuY2VzIGl0c2VsZicpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyRGVmID0gZW5zdXJlVmlld0RlZihzdXBlclR5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIH1cbiAgICBpZiAoIXRoZUNvbXBvbmVudCAmJiBzdXBlckRlZikge1xuICAgICAgICB0aGVDb21wb25lbnQgPSBzdXBlckRlZi5jb21wb25lbnQ7XG4gICAgfVxuICAgIGlmICghdGhlQ29tcG9uZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB0aHJvdyBhIHdhcm5pbmcsIG1pZ2h0IGJlIHNldHRpbmdzIGZvciBhIHNpbmdsZS11bml0IHZpZXdcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdmlld1R5cGUsXG4gICAgICAgIGNvbXBvbmVudDogdGhlQ29tcG9uZW50LFxuICAgICAgICBkZWZhdWx0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoc3VwZXJEZWYgPyBzdXBlckRlZi5kZWZhdWx0cyA6IHt9KSksIChkZWZhdWx0Q29uZmlnID8gZGVmYXVsdENvbmZpZy5yYXdPcHRpb25zIDoge30pKSxcbiAgICAgICAgb3ZlcnJpZGVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChzdXBlckRlZiA/IHN1cGVyRGVmLm92ZXJyaWRlcyA6IHt9KSksIChvdmVycmlkZUNvbmZpZyA/IG92ZXJyaWRlQ29uZmlnLnJhd09wdGlvbnMgOiB7fSkpLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmlld0NvbmZpZ3MoaW5wdXRzKSB7XG4gICAgcmV0dXJuIGludGVybmFsQ29tbW9uLm1hcEhhc2goaW5wdXRzLCBwYXJzZVZpZXdDb25maWcpO1xufVxuZnVuY3Rpb24gcGFyc2VWaWV3Q29uZmlnKGlucHV0KSB7XG4gICAgbGV0IHJhd09wdGlvbnMgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICB7IGNvbXBvbmVudDogaW5wdXQgfSA6XG4gICAgICAgIGlucHV0O1xuICAgIGxldCB7IGNvbXBvbmVudCB9ID0gcmF3T3B0aW9ucztcbiAgICBpZiAocmF3T3B0aW9ucy5jb250ZW50KSB7XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSBjb250ZW50L2NsYXNzTmFtZXMvZGlkTW91bnQvZXRjIGZyb20gb3B0aW9ucz9cbiAgICAgICAgY29tcG9uZW50ID0gY3JlYXRlVmlld0hvb2tDb21wb25lbnQocmF3T3B0aW9ucyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNvbXBvbmVudCAmJiAhKGNvbXBvbmVudC5wcm90b3R5cGUgaW5zdGFuY2VvZiBpbnRlcm5hbENvbW1vbi5CYXNlQ29tcG9uZW50KSkge1xuICAgICAgICAvLyBXSFk/OiBwZW9wbGUgd2VyZSB1c2luZyBgY29tcG9uZW50YCBwcm9wZXJ0eSBmb3IgYGNvbnRlbnRgXG4gICAgICAgIC8vIFRPRE86IGNvbnZlcmdlIG9uIG9uZSBzZXR0aW5nIG5hbWVcbiAgICAgICAgY29tcG9uZW50ID0gY3JlYXRlVmlld0hvb2tDb21wb25lbnQoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByYXdPcHRpb25zKSwgeyBjb250ZW50OiBjb21wb25lbnQgfSkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdXBlclR5cGU6IHJhd09wdGlvbnMudHlwZSxcbiAgICAgICAgY29tcG9uZW50OiBjb21wb25lbnQsXG4gICAgICAgIHJhd09wdGlvbnMsIC8vIGluY2x1ZGVzIHR5cGUgYW5kIGNvbXBvbmVudCB0b28gOihcbiAgICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlVmlld0hvb2tDb21wb25lbnQob3B0aW9ucykge1xuICAgIHJldHVybiAodmlld1Byb3BzKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxDb21tb24uVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCAoY29udGV4dCkgPT4gKHByZWFjdC5jcmVhdGVFbGVtZW50KGludGVybmFsQ29tbW9uLkNvbnRlbnRDb250YWluZXIsIHsgZWxUYWc6IFwiZGl2XCIsIGVsQ2xhc3NlczogaW50ZXJuYWxDb21tb24uYnVpbGRWaWV3Q2xhc3NOYW1lcyhjb250ZXh0LnZpZXdTcGVjKSwgcmVuZGVyUHJvcHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdmlld1Byb3BzKSwgeyBuZXh0RGF5VGhyZXNob2xkOiBjb250ZXh0Lm9wdGlvbnMubmV4dERheVRocmVzaG9sZCB9KSwgZ2VuZXJhdG9yTmFtZTogdW5kZWZpbmVkLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMuY29udGVudCwgY2xhc3NOYW1lR2VuZXJhdG9yOiBvcHRpb25zLmNsYXNzTmFtZXMsIGRpZE1vdW50OiBvcHRpb25zLmRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy53aWxsVW5tb3VudCB9KSkpKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWaWV3U3BlY3MoZGVmYXVsdElucHV0cywgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBsb2NhbGVEZWZhdWx0cykge1xuICAgIGxldCBkZWZhdWx0Q29uZmlncyA9IHBhcnNlVmlld0NvbmZpZ3MoZGVmYXVsdElucHV0cyk7XG4gICAgbGV0IG92ZXJyaWRlQ29uZmlncyA9IHBhcnNlVmlld0NvbmZpZ3Mob3B0aW9uT3ZlcnJpZGVzLnZpZXdzKTtcbiAgICBsZXQgdmlld0RlZnMgPSBjb21waWxlVmlld0RlZnMoZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgcmV0dXJuIGludGVybmFsQ29tbW9uLm1hcEhhc2godmlld0RlZnMsICh2aWV3RGVmKSA9PiBidWlsZFZpZXdTcGVjKHZpZXdEZWYsIG92ZXJyaWRlQ29uZmlncywgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBsb2NhbGVEZWZhdWx0cykpO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3U3BlYyh2aWV3RGVmLCBvdmVycmlkZUNvbmZpZ3MsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgbG9jYWxlRGVmYXVsdHMpIHtcbiAgICBsZXQgZHVyYXRpb25JbnB1dCA9IHZpZXdEZWYub3ZlcnJpZGVzLmR1cmF0aW9uIHx8XG4gICAgICAgIHZpZXdEZWYuZGVmYXVsdHMuZHVyYXRpb24gfHxcbiAgICAgICAgZHluYW1pY09wdGlvbk92ZXJyaWRlcy5kdXJhdGlvbiB8fFxuICAgICAgICBvcHRpb25PdmVycmlkZXMuZHVyYXRpb247XG4gICAgbGV0IGR1cmF0aW9uID0gbnVsbDtcbiAgICBsZXQgZHVyYXRpb25Vbml0ID0gJyc7XG4gICAgbGV0IHNpbmdsZVVuaXQgPSAnJztcbiAgICBsZXQgc2luZ2xlVW5pdE92ZXJyaWRlcyA9IHt9O1xuICAgIGlmIChkdXJhdGlvbklucHV0KSB7XG4gICAgICAgIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb25DYWNoZWQoZHVyYXRpb25JbnB1dCk7XG4gICAgICAgIGlmIChkdXJhdGlvbikgeyAvLyB2YWxpZD9cbiAgICAgICAgICAgIGxldCBkZW5vbSA9IGludGVybmFsQ29tbW9uLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkdXJhdGlvbik7XG4gICAgICAgICAgICBkdXJhdGlvblVuaXQgPSBkZW5vbS51bml0O1xuICAgICAgICAgICAgaWYgKGRlbm9tLnZhbHVlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgc2luZ2xlVW5pdCA9IGR1cmF0aW9uVW5pdDtcbiAgICAgICAgICAgICAgICBzaW5nbGVVbml0T3ZlcnJpZGVzID0gb3ZlcnJpZGVDb25maWdzW2R1cmF0aW9uVW5pdF0gPyBvdmVycmlkZUNvbmZpZ3NbZHVyYXRpb25Vbml0XS5yYXdPcHRpb25zIDoge307XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IHF1ZXJ5QnV0dG9uVGV4dCA9IChvcHRpb25zU3Vic2V0KSA9PiB7XG4gICAgICAgIGxldCBidXR0b25UZXh0TWFwID0gb3B0aW9uc1N1YnNldC5idXR0b25UZXh0IHx8IHt9O1xuICAgICAgICBsZXQgYnV0dG9uVGV4dEtleSA9IHZpZXdEZWYuZGVmYXVsdHMuYnV0dG9uVGV4dEtleTtcbiAgICAgICAgaWYgKGJ1dHRvblRleHRLZXkgIT0gbnVsbCAmJiBidXR0b25UZXh0TWFwW2J1dHRvblRleHRLZXldICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25UZXh0TWFwW2J1dHRvblRleHRLZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25UZXh0TWFwW3ZpZXdEZWYudHlwZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvblRleHRNYXBbdmlld0RlZi50eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9uVGV4dE1hcFtzaW5nbGVVbml0XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uVGV4dE1hcFtzaW5nbGVVbml0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGxldCBxdWVyeUJ1dHRvblRpdGxlID0gKG9wdGlvbnNTdWJzZXQpID0+IHtcbiAgICAgICAgbGV0IGJ1dHRvbkhpbnRzID0gb3B0aW9uc1N1YnNldC5idXR0b25IaW50cyB8fCB7fTtcbiAgICAgICAgbGV0IGJ1dHRvbktleSA9IHZpZXdEZWYuZGVmYXVsdHMuYnV0dG9uVGV4dEtleTsgLy8gdXNlIHNhbWUga2V5IGFzIHRleHRcbiAgICAgICAgaWYgKGJ1dHRvbktleSAhPSBudWxsICYmIGJ1dHRvbkhpbnRzW2J1dHRvbktleV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbkhpbnRzW2J1dHRvbktleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbkhpbnRzW3ZpZXdEZWYudHlwZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbkhpbnRzW3ZpZXdEZWYudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbkhpbnRzW3NpbmdsZVVuaXRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25IaW50c1tzaW5nbGVVbml0XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHZpZXdEZWYudHlwZSxcbiAgICAgICAgY29tcG9uZW50OiB2aWV3RGVmLmNvbXBvbmVudCxcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uVW5pdCxcbiAgICAgICAgc2luZ2xlVW5pdCxcbiAgICAgICAgb3B0aW9uRGVmYXVsdHM6IHZpZXdEZWYuZGVmYXVsdHMsXG4gICAgICAgIG9wdGlvbk92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzaW5nbGVVbml0T3ZlcnJpZGVzKSwgdmlld0RlZi5vdmVycmlkZXMpLFxuICAgICAgICBidXR0b25UZXh0T3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGV4dChkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KG9wdGlvbk92ZXJyaWRlcykgfHwgLy8gY29uc3RydWN0b3Itc3BlY2lmaWVkIGJ1dHRvblRleHQgbG9va3VwIGhhc2ggdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uVGV4dCxcbiAgICAgICAgYnV0dG9uVGV4dERlZmF1bHQ6IHF1ZXJ5QnV0dG9uVGV4dChsb2NhbGVEZWZhdWx0cykgfHxcbiAgICAgICAgICAgIHZpZXdEZWYuZGVmYXVsdHMuYnV0dG9uVGV4dCB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UZXh0KGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTKSB8fFxuICAgICAgICAgICAgdmlld0RlZi50eXBlLFxuICAgICAgICAvLyBub3QgRFJZXG4gICAgICAgIGJ1dHRvblRpdGxlT3ZlcnJpZGU6IHF1ZXJ5QnV0dG9uVGl0bGUoZHluYW1pY09wdGlvbk92ZXJyaWRlcykgfHxcbiAgICAgICAgICAgIHF1ZXJ5QnV0dG9uVGl0bGUob3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5vdmVycmlkZXMuYnV0dG9uSGludCxcbiAgICAgICAgYnV0dG9uVGl0bGVEZWZhdWx0OiBxdWVyeUJ1dHRvblRpdGxlKGxvY2FsZURlZmF1bHRzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5kZWZhdWx0cy5idXR0b25IaW50IHx8XG4gICAgICAgICAgICBxdWVyeUJ1dHRvblRpdGxlKGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTKSxcbiAgICAgICAgLy8gd2lsbCBldmVudHVhbGx5IGZhbGwgYmFjayB0byBidXR0b25UZXh0XG4gICAgfTtcbn1cbi8vIGhhY2sgdG8gZ2V0IG1lbW9pemF0aW9uIHdvcmtpbmdcbmxldCBkdXJhdGlvbklucHV0TWFwID0ge307XG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbkNhY2hlZChkdXJhdGlvbklucHV0KSB7XG4gICAgbGV0IGpzb24gPSBKU09OLnN0cmluZ2lmeShkdXJhdGlvbklucHV0KTtcbiAgICBsZXQgcmVzID0gZHVyYXRpb25JbnB1dE1hcFtqc29uXTtcbiAgICBpZiAocmVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzID0gaW50ZXJuYWxDb21tb24uY3JlYXRlRHVyYXRpb24oZHVyYXRpb25JbnB1dCk7XG4gICAgICAgIGR1cmF0aW9uSW5wdXRNYXBbanNvbl0gPSByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZVZpZXdUeXBlKHZpZXdUeXBlLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9WSUVXX1RZUEUnOlxuICAgICAgICAgICAgdmlld1R5cGUgPSBhY3Rpb24udmlld1R5cGU7XG4gICAgfVxuICAgIHJldHVybiB2aWV3VHlwZTtcbn1cblxuZnVuY3Rpb24gcmVkdWNlRHluYW1pY09wdGlvbk92ZXJyaWRlcyhkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1NFVF9PUFRJT04nOlxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZHluYW1pY09wdGlvbk92ZXJyaWRlcyksIHsgW2FjdGlvbi5vcHRpb25OYW1lXTogYWN0aW9uLnJhd09wdGlvblZhbHVlIH0pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNPcHRpb25PdmVycmlkZXM7XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VEYXRlUHJvZmlsZShjdXJyZW50RGF0ZVByb2ZpbGUsIGFjdGlvbiwgY3VycmVudERhdGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yKSB7XG4gICAgbGV0IGRwO1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGQoYWN0aW9uLmRhdGVNYXJrZXIgfHwgY3VycmVudERhdGUpO1xuICAgICAgICBjYXNlICdDSEFOR0VfREFURSc6XG4gICAgICAgICAgICByZXR1cm4gZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGQoYWN0aW9uLmRhdGVNYXJrZXIpO1xuICAgICAgICBjYXNlICdQUkVWJzpcbiAgICAgICAgICAgIGRwID0gZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGRQcmV2KGN1cnJlbnREYXRlUHJvZmlsZSwgY3VycmVudERhdGUpO1xuICAgICAgICAgICAgaWYgKGRwLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnTkVYVCc6XG4gICAgICAgICAgICBkcCA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkTmV4dChjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlKTtcbiAgICAgICAgICAgIGlmIChkcC5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50RGF0ZVByb2ZpbGU7XG59XG5cbmZ1bmN0aW9uIGluaXRFdmVudFNvdXJjZXMoY2FsZW5kYXJPcHRpb25zLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGxldCBhY3RpdmVSYW5nZSA9IGRhdGVQcm9maWxlID8gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UgOiBudWxsO1xuICAgIHJldHVybiBhZGRTb3VyY2VzKHt9LCBwYXJzZUluaXRpYWxTb3VyY2VzKGNhbGVuZGFyT3B0aW9ucywgY29udGV4dCksIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50U291cmNlcyhldmVudFNvdXJjZXMsIGFjdGlvbiwgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICBsZXQgYWN0aXZlUmFuZ2UgPSBkYXRlUHJvZmlsZSA/IGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlIDogbnVsbDsgLy8gbmVlZCB0aGlzIGNoZWNrP1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQUREX0VWRU5UX1NPVVJDRVMnOiAvLyBhbHJlYWR5IHBhcnNlZFxuICAgICAgICAgICAgcmV0dXJuIGFkZFNvdXJjZXMoZXZlbnRTb3VyY2VzLCBhY3Rpb24uc291cmNlcywgYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRU1PVkVfRVZFTlRfU09VUkNFJzpcbiAgICAgICAgICAgIHJldHVybiByZW1vdmVTb3VyY2UoZXZlbnRTb3VyY2VzLCBhY3Rpb24uc291cmNlSWQpO1xuICAgICAgICBjYXNlICdQUkVWJzogLy8gVE9ETzogaG93IGRvIHdlIHRyYWNrIGFsbCBhY3Rpb25zIHRoYXQgYWZmZWN0IGRhdGVQcm9maWxlIDooXG4gICAgICAgIGNhc2UgJ05FWFQnOlxuICAgICAgICBjYXNlICdDSEFOR0VfREFURSc6XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9WSUVXX1RZUEUnOlxuICAgICAgICAgICAgaWYgKGRhdGVQcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoRGlydHlTb3VyY2VzKGV2ZW50U291cmNlcywgYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U291cmNlcztcbiAgICAgICAgY2FzZSAnRkVUQ0hfRVZFTlRfU09VUkNFUyc6XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hTb3VyY2VzQnlJZHMoZXZlbnRTb3VyY2VzLCBhY3Rpb24uc291cmNlSWRzID8gLy8gd2h5IG5vIHR5cGU/XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uYXJyYXlUb0hhc2goYWN0aW9uLnNvdXJjZUlkcykgOlxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVTdGF0aWNTb3VyY2VzKGV2ZW50U291cmNlcywgY29udGV4dCksIGFjdGl2ZVJhbmdlLCBhY3Rpb24uaXNSZWZldGNoIHx8IGZhbHNlLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnUkVDRUlWRV9FVkVOVFMnOlxuICAgICAgICBjYXNlICdSRUNFSVZFX0VWRU5UX0VSUk9SJzpcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlUmVzcG9uc2UoZXZlbnRTb3VyY2VzLCBhY3Rpb24uc291cmNlSWQsIGFjdGlvbi5mZXRjaElkLCBhY3Rpb24uZmV0Y2hSYW5nZSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9BTExfRVZFTlRfU09VUkNFUyc6XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRTb3VyY2VzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50U291cmNlc05ld1RpbWVab25lKGV2ZW50U291cmNlcywgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICBsZXQgYWN0aXZlUmFuZ2UgPSBkYXRlUHJvZmlsZSA/IGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlIDogbnVsbDsgLy8gbmVlZCB0aGlzIGNoZWNrP1xuICAgIHJldHVybiBmZXRjaFNvdXJjZXNCeUlkcyhldmVudFNvdXJjZXMsIGV4Y2x1ZGVTdGF0aWNTb3VyY2VzKGV2ZW50U291cmNlcywgY29udGV4dCksIGFjdGl2ZVJhbmdlLCB0cnVlLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVFdmVudFNvdXJjZXNMb2FkaW5nKGV2ZW50U291cmNlcykge1xuICAgIGZvciAobGV0IHNvdXJjZUlkIGluIGV2ZW50U291cmNlcykge1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2VzW3NvdXJjZUlkXS5pc0ZldGNoaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBhZGRTb3VyY2VzKGV2ZW50U291cmNlSGFzaCwgc291cmNlcywgZmV0Y2hSYW5nZSwgY29udGV4dCkge1xuICAgIGxldCBoYXNoID0ge307XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgaGFzaFtzb3VyY2Uuc291cmNlSWRdID0gc291cmNlO1xuICAgIH1cbiAgICBpZiAoZmV0Y2hSYW5nZSkge1xuICAgICAgICBoYXNoID0gZmV0Y2hEaXJ0eVNvdXJjZXMoaGFzaCwgZmV0Y2hSYW5nZSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50U291cmNlSGFzaCksIGhhc2gpO1xufVxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKGV2ZW50U291cmNlSGFzaCwgc291cmNlSWQpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24uZmlsdGVySGFzaChldmVudFNvdXJjZUhhc2gsIChldmVudFNvdXJjZSkgPT4gZXZlbnRTb3VyY2Uuc291cmNlSWQgIT09IHNvdXJjZUlkKTtcbn1cbmZ1bmN0aW9uIGZldGNoRGlydHlTb3VyY2VzKHNvdXJjZUhhc2gsIGZldGNoUmFuZ2UsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZmV0Y2hTb3VyY2VzQnlJZHMoc291cmNlSGFzaCwgaW50ZXJuYWxDb21tb24uZmlsdGVySGFzaChzb3VyY2VIYXNoLCAoZXZlbnRTb3VyY2UpID0+IGlzU291cmNlRGlydHkoZXZlbnRTb3VyY2UsIGZldGNoUmFuZ2UsIGNvbnRleHQpKSwgZmV0Y2hSYW5nZSwgZmFsc2UsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNTb3VyY2VEaXJ0eShldmVudFNvdXJjZSwgZmV0Y2hSYW5nZSwgY29udGV4dCkge1xuICAgIGlmICghZG9lc1NvdXJjZU5lZWRSYW5nZShldmVudFNvdXJjZSwgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuICFldmVudFNvdXJjZS5sYXRlc3RGZXRjaElkO1xuICAgIH1cbiAgICByZXR1cm4gIWNvbnRleHQub3B0aW9ucy5sYXp5RmV0Y2hpbmcgfHxcbiAgICAgICAgIWV2ZW50U291cmNlLmZldGNoUmFuZ2UgfHxcbiAgICAgICAgZXZlbnRTb3VyY2UuaXNGZXRjaGluZyB8fCAvLyBhbHdheXMgY2FuY2VsIG91dGRhdGVkIGluLXByb2dyZXNzIGZldGNoZXNcbiAgICAgICAgZmV0Y2hSYW5nZS5zdGFydCA8IGV2ZW50U291cmNlLmZldGNoUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgZmV0Y2hSYW5nZS5lbmQgPiBldmVudFNvdXJjZS5mZXRjaFJhbmdlLmVuZDtcbn1cbmZ1bmN0aW9uIGZldGNoU291cmNlc0J5SWRzKHByZXZTb3VyY2VzLCBzb3VyY2VJZEhhc2gsIGZldGNoUmFuZ2UsIGlzUmVmZXRjaCwgY29udGV4dCkge1xuICAgIGxldCBuZXh0U291cmNlcyA9IHt9O1xuICAgIGZvciAobGV0IHNvdXJjZUlkIGluIHByZXZTb3VyY2VzKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBwcmV2U291cmNlc1tzb3VyY2VJZF07XG4gICAgICAgIGlmIChzb3VyY2VJZEhhc2hbc291cmNlSWRdKSB7XG4gICAgICAgICAgICBuZXh0U291cmNlc1tzb3VyY2VJZF0gPSBmZXRjaFNvdXJjZShzb3VyY2UsIGZldGNoUmFuZ2UsIGlzUmVmZXRjaCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXh0U291cmNlc1tzb3VyY2VJZF0gPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRTb3VyY2VzO1xufVxuZnVuY3Rpb24gZmV0Y2hTb3VyY2UoZXZlbnRTb3VyY2UsIGZldGNoUmFuZ2UsIGlzUmVmZXRjaCwgY29udGV4dCkge1xuICAgIGxldCB7IG9wdGlvbnMsIGNhbGVuZGFyQXBpIH0gPSBjb250ZXh0O1xuICAgIGxldCBzb3VyY2VEZWYgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlRGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF07XG4gICAgbGV0IGZldGNoSWQgPSBpbnRlcm5hbENvbW1vbi5ndWlkKCk7XG4gICAgc291cmNlRGVmLmZldGNoKHtcbiAgICAgICAgZXZlbnRTb3VyY2UsXG4gICAgICAgIHJhbmdlOiBmZXRjaFJhbmdlLFxuICAgICAgICBpc1JlZmV0Y2gsXG4gICAgICAgIGNvbnRleHQsXG4gICAgfSwgKHJlcykgPT4ge1xuICAgICAgICBsZXQgeyByYXdFdmVudHMgfSA9IHJlcztcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VTdWNjZXNzKSB7XG4gICAgICAgICAgICByYXdFdmVudHMgPSBvcHRpb25zLmV2ZW50U291cmNlU3VjY2Vzcy5jYWxsKGNhbGVuZGFyQXBpLCByYXdFdmVudHMsIHJlcy5yZXNwb25zZSkgfHwgcmF3RXZlbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICByYXdFdmVudHMgPSBldmVudFNvdXJjZS5zdWNjZXNzLmNhbGwoY2FsZW5kYXJBcGksIHJhd0V2ZW50cywgcmVzLnJlc3BvbnNlKSB8fCByYXdFdmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVDRUlWRV9FVkVOVFMnLFxuICAgICAgICAgICAgc291cmNlSWQ6IGV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICAgICAgZmV0Y2hJZCxcbiAgICAgICAgICAgIGZldGNoUmFuZ2UsXG4gICAgICAgICAgICByYXdFdmVudHMsXG4gICAgICAgIH0pO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICBsZXQgZXJyb3JIYW5kbGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvcHRpb25zLmV2ZW50U291cmNlRmFpbHVyZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5ldmVudFNvdXJjZUZhaWx1cmUuY2FsbChjYWxlbmRhckFwaSwgZXJyb3IpO1xuICAgICAgICAgICAgZXJyb3JIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRTb3VyY2UuZmFpbHVyZSkge1xuICAgICAgICAgICAgZXZlbnRTb3VyY2UuZmFpbHVyZShlcnJvcik7XG4gICAgICAgICAgICBlcnJvckhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXJyb3JIYW5kbGVkKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFQ0VJVkVfRVZFTlRfRVJST1InLFxuICAgICAgICAgICAgc291cmNlSWQ6IGV2ZW50U291cmNlLnNvdXJjZUlkLFxuICAgICAgICAgICAgZmV0Y2hJZCxcbiAgICAgICAgICAgIGZldGNoUmFuZ2UsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRTb3VyY2UpLCB7IGlzRmV0Y2hpbmc6IHRydWUsIGxhdGVzdEZldGNoSWQ6IGZldGNoSWQgfSk7XG59XG5mdW5jdGlvbiByZWNlaXZlUmVzcG9uc2Uoc291cmNlSGFzaCwgc291cmNlSWQsIGZldGNoSWQsIGZldGNoUmFuZ2UpIHtcbiAgICBsZXQgZXZlbnRTb3VyY2UgPSBzb3VyY2VIYXNoW3NvdXJjZUlkXTtcbiAgICBpZiAoZXZlbnRTb3VyY2UgJiYgLy8gbm90IGFscmVhZHkgcmVtb3ZlZFxuICAgICAgICBmZXRjaElkID09PSBldmVudFNvdXJjZS5sYXRlc3RGZXRjaElkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZUhhc2gpLCB7IFtzb3VyY2VJZF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRTb3VyY2UpLCB7IGlzRmV0Y2hpbmc6IGZhbHNlLCBmZXRjaFJhbmdlIH0pIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlSGFzaDtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVTdGF0aWNTb3VyY2VzKGV2ZW50U291cmNlcywgY29udGV4dCkge1xuICAgIHJldHVybiBpbnRlcm5hbENvbW1vbi5maWx0ZXJIYXNoKGV2ZW50U291cmNlcywgKGV2ZW50U291cmNlKSA9PiBkb2VzU291cmNlTmVlZFJhbmdlKGV2ZW50U291cmNlLCBjb250ZXh0KSk7XG59XG5mdW5jdGlvbiBwYXJzZUluaXRpYWxTb3VyY2VzKHJhd09wdGlvbnMsIGNvbnRleHQpIHtcbiAgICBsZXQgcmVmaW5lcnMgPSBpbnRlcm5hbENvbW1vbi5idWlsZEV2ZW50U291cmNlUmVmaW5lcnMoY29udGV4dCk7XG4gICAgbGV0IHJhd1NvdXJjZXMgPSBbXS5jb25jYXQocmF3T3B0aW9ucy5ldmVudFNvdXJjZXMgfHwgW10pO1xuICAgIGxldCBzb3VyY2VzID0gW107IC8vIHBhcnNlZFxuICAgIGlmIChyYXdPcHRpb25zLmluaXRpYWxFdmVudHMpIHtcbiAgICAgICAgcmF3U291cmNlcy51bnNoaWZ0KHJhd09wdGlvbnMuaW5pdGlhbEV2ZW50cyk7XG4gICAgfVxuICAgIGlmIChyYXdPcHRpb25zLmV2ZW50cykge1xuICAgICAgICByYXdTb3VyY2VzLnVuc2hpZnQocmF3T3B0aW9ucy5ldmVudHMpO1xuICAgIH1cbiAgICBmb3IgKGxldCByYXdTb3VyY2Ugb2YgcmF3U291cmNlcykge1xuICAgICAgICBsZXQgc291cmNlID0gaW50ZXJuYWxDb21tb24ucGFyc2VFdmVudFNvdXJjZShyYXdTb3VyY2UsIGNvbnRleHQsIHJlZmluZXJzKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZXM7XG59XG5mdW5jdGlvbiBkb2VzU291cmNlTmVlZFJhbmdlKGV2ZW50U291cmNlLCBjb250ZXh0KSB7XG4gICAgbGV0IGRlZnMgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlRGVmcztcbiAgICByZXR1cm4gIWRlZnNbZXZlbnRTb3VyY2Uuc291cmNlRGVmSWRdLmlnbm9yZVJhbmdlO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEYXRlU2VsZWN0aW9uKGN1cnJlbnRTZWxlY3Rpb24sIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnVU5TRUxFQ1RfREFURVMnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9EQVRFUyc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLnNlbGVjdGlvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0aW9uO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlU2VsZWN0ZWRFdmVudChjdXJyZW50SW5zdGFuY2VJZCwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGNhc2UgJ1NFTEVDVF9FVkVOVCc6XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uLmV2ZW50SW5zdGFuY2VJZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5zdGFuY2VJZDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50RHJhZyhjdXJyZW50RHJhZywgYWN0aW9uKSB7XG4gICAgbGV0IG5ld0RyYWc7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9EUkFHJzpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICBuZXdEcmFnID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3RHJhZy5hZmZlY3RlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBuZXdEcmFnLm11dGF0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogbmV3RHJhZy5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RHJhZztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50UmVzaXplKGN1cnJlbnRSZXNpemUsIGFjdGlvbikge1xuICAgIGxldCBuZXdSZXNpemU7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFVF9FVkVOVF9SRVNJWkUnOlxuICAgICAgICAgICAgbmV3UmVzaXplID0gYWN0aW9uLnN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogbmV3UmVzaXplLmFmZmVjdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IG5ld1Jlc2l6ZS5tdXRhdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIGlzRXZlbnQ6IG5ld1Jlc2l6ZS5pc0V2ZW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzaXplO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VUb29sYmFycyhjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSkge1xuICAgIGxldCBoZWFkZXIgPSBjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciA/IHBhcnNlVG9vbGJhcihjYWxlbmRhck9wdGlvbnMuaGVhZGVyVG9vbGJhciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIDogbnVsbDtcbiAgICBsZXQgZm9vdGVyID0gY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIgPyBwYXJzZVRvb2xiYXIoY2FsZW5kYXJPcHRpb25zLmZvb3RlclRvb2xiYXIsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSA6IG51bGw7XG4gICAgcmV0dXJuIHsgaGVhZGVyLCBmb290ZXIgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlVG9vbGJhcihzZWN0aW9uU3RySGFzaCwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIHtcbiAgICBsZXQgc2VjdGlvbldpZGdldHMgPSB7fTtcbiAgICBsZXQgdmlld3NXaXRoQnV0dG9ucyA9IFtdO1xuICAgIGxldCBoYXNUaXRsZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IHNlY3Rpb25OYW1lIGluIHNlY3Rpb25TdHJIYXNoKSB7XG4gICAgICAgIGxldCBzZWN0aW9uU3RyID0gc2VjdGlvblN0ckhhc2hbc2VjdGlvbk5hbWVdO1xuICAgICAgICBsZXQgc2VjdGlvblJlcyA9IHBhcnNlU2VjdGlvbihzZWN0aW9uU3RyLCBjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSk7XG4gICAgICAgIHNlY3Rpb25XaWRnZXRzW3NlY3Rpb25OYW1lXSA9IHNlY3Rpb25SZXMud2lkZ2V0cztcbiAgICAgICAgdmlld3NXaXRoQnV0dG9ucy5wdXNoKC4uLnNlY3Rpb25SZXMudmlld3NXaXRoQnV0dG9ucyk7XG4gICAgICAgIGhhc1RpdGxlID0gaGFzVGl0bGUgfHwgc2VjdGlvblJlcy5oYXNUaXRsZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VjdGlvbldpZGdldHMsIHZpZXdzV2l0aEJ1dHRvbnMsIGhhc1RpdGxlIH07XG59XG4vKlxuQkFEOiBxdWVyeWluZyBpY29ucyBhbmQgdGV4dCBoZXJlLiBzaG91bGQgYmUgZG9uZSBhdCByZW5kZXIgdGltZVxuKi9cbmZ1bmN0aW9uIHBhcnNlU2VjdGlvbihzZWN0aW9uU3RyLCBjYWxlbmRhck9wdGlvbnMsIC8vIGRlZmF1bHRzK292ZXJyaWRlcywgdGhlbiByZWZpbmVkXG5jYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgLy8gb3ZlcnJpZGVzIG9ubHkhLCB1bnJlZmluZWQgOihcbnRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgbGV0IGlzUnRsID0gY2FsZW5kYXJPcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3J0bCc7XG4gICAgbGV0IGNhbGVuZGFyQ3VzdG9tQnV0dG9ucyA9IGNhbGVuZGFyT3B0aW9ucy5jdXN0b21CdXR0b25zIHx8IHt9O1xuICAgIGxldCBjYWxlbmRhckJ1dHRvblRleHRPdmVycmlkZXMgPSBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcy5idXR0b25UZXh0IHx8IHt9O1xuICAgIGxldCBjYWxlbmRhckJ1dHRvblRleHQgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uVGV4dCB8fCB7fTtcbiAgICBsZXQgY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzID0gY2FsZW5kYXJPcHRpb25PdmVycmlkZXMuYnV0dG9uSGludHMgfHwge307XG4gICAgbGV0IGNhbGVuZGFyQnV0dG9uSGludHMgPSBjYWxlbmRhck9wdGlvbnMuYnV0dG9uSGludHMgfHwge307XG4gICAgbGV0IHNlY3Rpb25TdWJzdHJzID0gc2VjdGlvblN0ciA/IHNlY3Rpb25TdHIuc3BsaXQoJyAnKSA6IFtdO1xuICAgIGxldCB2aWV3c1dpdGhCdXR0b25zID0gW107XG4gICAgbGV0IGhhc1RpdGxlID0gZmFsc2U7XG4gICAgbGV0IHdpZGdldHMgPSBzZWN0aW9uU3Vic3Rycy5tYXAoKGJ1dHRvbkdyb3VwU3RyKSA9PiAoYnV0dG9uR3JvdXBTdHIuc3BsaXQoJywnKS5tYXAoKGJ1dHRvbk5hbWUpID0+IHtcbiAgICAgICAgaWYgKGJ1dHRvbk5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgIGhhc1RpdGxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiB7IGJ1dHRvbk5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3VzdG9tQnV0dG9uUHJvcHM7XG4gICAgICAgIGxldCB2aWV3U3BlYztcbiAgICAgICAgbGV0IGJ1dHRvbkNsaWNrO1xuICAgICAgICBsZXQgYnV0dG9uSWNvbjsgLy8gb25seSBvbmUgb2YgdGhlc2Ugd2lsbCBiZSBzZXRcbiAgICAgICAgbGV0IGJ1dHRvblRleHQ7IC8vIFwiXG4gICAgICAgIGxldCBidXR0b25IaW50O1xuICAgICAgICAvLyBeIGZvciB0aGUgdGl0bGU9XCJcIiBhdHRyaWJ1dGUsIGZvciBhY2Nlc3NpYmlsaXR5XG4gICAgICAgIGlmICgoY3VzdG9tQnV0dG9uUHJvcHMgPSBjYWxlbmRhckN1c3RvbUJ1dHRvbnNbYnV0dG9uTmFtZV0pKSB7XG4gICAgICAgICAgICBidXR0b25DbGljayA9IChldikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXN0b21CdXR0b25Qcm9wcy5jbGljaykge1xuICAgICAgICAgICAgICAgICAgICBjdXN0b21CdXR0b25Qcm9wcy5jbGljay5jYWxsKGV2LnRhcmdldCwgZXYsIGV2LnRhcmdldCk7IC8vIFRPRE86IHVzZSBDYWxlbmRhciB0aGlzIGNvbnRleHQ/XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0Q3VzdG9tQnV0dG9uSWNvbkNsYXNzKGN1c3RvbUJ1dHRvblByb3BzKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSBjdXN0b21CdXR0b25Qcm9wcy50ZXh0KTtcbiAgICAgICAgICAgIGJ1dHRvbkhpbnQgPSBjdXN0b21CdXR0b25Qcm9wcy5oaW50IHx8IGN1c3RvbUJ1dHRvblByb3BzLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHZpZXdTcGVjID0gdmlld1NwZWNzW2J1dHRvbk5hbWVdKSkge1xuICAgICAgICAgICAgdmlld3NXaXRoQnV0dG9ucy5wdXNoKGJ1dHRvbk5hbWUpO1xuICAgICAgICAgICAgYnV0dG9uQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuY2hhbmdlVmlldyhidXR0b25OYW1lKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAoYnV0dG9uVGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHRPdmVycmlkZSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uSWNvbiA9IHRoZW1lLmdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvblRleHQgPSB2aWV3U3BlYy5idXR0b25UZXh0RGVmYXVsdCk7XG4gICAgICAgICAgICBsZXQgdGV4dEZhbGxiYWNrID0gdmlld1NwZWMuYnV0dG9uVGV4dE92ZXJyaWRlIHx8XG4gICAgICAgICAgICAgICAgdmlld1NwZWMuYnV0dG9uVGV4dERlZmF1bHQ7XG4gICAgICAgICAgICBidXR0b25IaW50ID0gaW50ZXJuYWxDb21tb24uZm9ybWF0V2l0aE9yZGluYWxzKHZpZXdTcGVjLmJ1dHRvblRpdGxlT3ZlcnJpZGUgfHxcbiAgICAgICAgICAgICAgICB2aWV3U3BlYy5idXR0b25UaXRsZURlZmF1bHQgfHxcbiAgICAgICAgICAgICAgICBjYWxlbmRhck9wdGlvbnMudmlld0hpbnQsIFt0ZXh0RmFsbGJhY2ssIGJ1dHRvbk5hbWVdLCAvLyB2aWV3LW5hbWUgPSBidXR0b25OYW1lXG4gICAgICAgICAgICB0ZXh0RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhbGVuZGFyQXBpW2J1dHRvbk5hbWVdKSB7IC8vIGEgY2FsZW5kYXJBcGkgbWV0aG9kXG4gICAgICAgICAgICBidXR0b25DbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhckFwaVtidXR0b25OYW1lXSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25UZXh0ID0gY2FsZW5kYXJCdXR0b25UZXh0T3ZlcnJpZGVzW2J1dHRvbk5hbWVdKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0SWNvbkNsYXNzKGJ1dHRvbk5hbWUsIGlzUnRsKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uVGV4dCA9IGNhbGVuZGFyQnV0dG9uVGV4dFtidXR0b25OYW1lXSk7IC8vIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGRlZmF1bHRcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAncHJldlllYXInIHx8IGJ1dHRvbk5hbWUgPT09ICduZXh0WWVhcicpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldk9yTmV4dCA9IGJ1dHRvbk5hbWUgPT09ICdwcmV2WWVhcicgPyAncHJldicgOiAnbmV4dCc7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IGludGVybmFsQ29tbW9uLmZvcm1hdFdpdGhPcmRpbmFscyhjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXNbcHJldk9yTmV4dF0gfHxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25IaW50c1twcmV2T3JOZXh0XSwgW1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckJ1dHRvblRleHQueWVhciB8fCAneWVhcicsXG4gICAgICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICBdLCBjYWxlbmRhckJ1dHRvblRleHRbYnV0dG9uTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnV0dG9uSGludCA9IChuYXZVbml0KSA9PiBpbnRlcm5hbENvbW1vbi5mb3JtYXRXaXRoT3JkaW5hbHMoY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzW2J1dHRvbk5hbWVdIHx8XG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQnV0dG9uSGludHNbYnV0dG9uTmFtZV0sIFtcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25UZXh0W25hdlVuaXRdIHx8IG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgICAgIG5hdlVuaXQsXG4gICAgICAgICAgICAgICAgXSwgY2FsZW5kYXJCdXR0b25UZXh0W2J1dHRvbk5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBidXR0b25OYW1lLCBidXR0b25DbGljaywgYnV0dG9uSWNvbiwgYnV0dG9uVGV4dCwgYnV0dG9uSGludCB9O1xuICAgIH0pKSk7XG4gICAgcmV0dXJuIHsgd2lkZ2V0cywgdmlld3NXaXRoQnV0dG9ucywgaGFzVGl0bGUgfTtcbn1cblxuLy8gYWx3YXlzIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmlldy4gb3RoZXJ3aXNlLCBpdCdkIG5lZWQgdG8gY2hhbmdlIHZhbHVlIGV2ZXJ5IHRpbWUgZGF0ZSBjaGFuZ2VzXG5jbGFzcyBWaWV3SW1wbCB7XG4gICAgY29uc3RydWN0b3IodHlwZSwgZ2V0Q3VycmVudERhdGEsIGRhdGVFbnYpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50RGF0YSA9IGdldEN1cnJlbnREYXRhO1xuICAgICAgICB0aGlzLmRhdGVFbnYgPSBkYXRlRW52O1xuICAgIH1cbiAgICBnZXQgY2FsZW5kYXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkuY2FsZW5kYXJBcGk7XG4gICAgfVxuICAgIGdldCB0aXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudERhdGEoKS52aWV3VGl0bGU7XG4gICAgfVxuICAgIGdldCBhY3RpdmVTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLnN0YXJ0KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZUVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLmVuZCk7XG4gICAgfVxuICAgIGdldCBjdXJyZW50U3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGVFbnYudG9EYXRlKHRoaXMuZ2V0Q3VycmVudERhdGEoKS5kYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2Uuc3RhcnQpO1xuICAgIH1cbiAgICBnZXQgY3VycmVudEVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5lbmQpO1xuICAgIH1cbiAgICBnZXRPcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLm9wdGlvbnNbbmFtZV07IC8vIGFyZSB0aGUgdmlldy1zcGVjaWZpYyBvcHRpb25zXG4gICAgfVxufVxuXG5sZXQgZXZlbnRTb3VyY2VEZWYkMiA9IHtcbiAgICBpZ25vcmVSYW5nZTogdHJ1ZSxcbiAgICBwYXJzZU1ldGEocmVmaW5lZCkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZpbmVkLmV2ZW50cykpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZpbmVkLmV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGZldGNoKGFyZywgc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayh7XG4gICAgICAgICAgICByYXdFdmVudHM6IGFyZy5ldmVudFNvdXJjZS5tZXRhLFxuICAgICAgICB9KTtcbiAgICB9LFxufTtcbmNvbnN0IGFycmF5RXZlbnRTb3VyY2VQbHVnaW4gPSBjcmVhdGVQbHVnaW4oe1xuICAgIG5hbWU6ICdhcnJheS1ldmVudC1zb3VyY2UnLFxuICAgIGV2ZW50U291cmNlRGVmczogW2V2ZW50U291cmNlRGVmJDJdLFxufSk7XG5cbmxldCBldmVudFNvdXJjZURlZiQxID0ge1xuICAgIHBhcnNlTWV0YShyZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVmaW5lZC5ldmVudHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZpbmVkLmV2ZW50cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGZldGNoKGFyZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0ZUVudiB9ID0gYXJnLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IGZ1bmMgPSBhcmcuZXZlbnRTb3VyY2UubWV0YTtcbiAgICAgICAgaW50ZXJuYWxDb21tb24udW5wcm9taXNpZnkoZnVuYy5iaW5kKG51bGwsIGludGVybmFsQ29tbW9uLmJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUoYXJnLnJhbmdlLCBkYXRlRW52KSksIChyYXdFdmVudHMpID0+IHN1Y2Nlc3NDYWxsYmFjayh7IHJhd0V2ZW50cyB9KSwgZXJyb3JDYWxsYmFjayk7XG4gICAgfSxcbn07XG5jb25zdCBmdW5jRXZlbnRTb3VyY2VQbHVnaW4gPSBjcmVhdGVQbHVnaW4oe1xuICAgIG5hbWU6ICdmdW5jLWV2ZW50LXNvdXJjZScsXG4gICAgZXZlbnRTb3VyY2VEZWZzOiBbZXZlbnRTb3VyY2VEZWYkMV0sXG59KTtcblxuY29uc3QgSlNPTl9GRUVEX0VWRU5UX1NPVVJDRV9SRUZJTkVSUyA9IHtcbiAgICBtZXRob2Q6IFN0cmluZyxcbiAgICBleHRyYVBhcmFtczogaW50ZXJuYWxDb21tb24uaWRlbnRpdHksXG4gICAgc3RhcnRQYXJhbTogU3RyaW5nLFxuICAgIGVuZFBhcmFtOiBTdHJpbmcsXG4gICAgdGltZVpvbmVQYXJhbTogU3RyaW5nLFxufTtcblxubGV0IGV2ZW50U291cmNlRGVmID0ge1xuICAgIHBhcnNlTWV0YShyZWZpbmVkKSB7XG4gICAgICAgIGlmIChyZWZpbmVkLnVybCAmJiAocmVmaW5lZC5mb3JtYXQgPT09ICdqc29uJyB8fCAhcmVmaW5lZC5mb3JtYXQpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogcmVmaW5lZC51cmwsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiAnanNvbicsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAocmVmaW5lZC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgZXh0cmFQYXJhbXM6IHJlZmluZWQuZXh0cmFQYXJhbXMsXG4gICAgICAgICAgICAgICAgc3RhcnRQYXJhbTogcmVmaW5lZC5zdGFydFBhcmFtLFxuICAgICAgICAgICAgICAgIGVuZFBhcmFtOiByZWZpbmVkLmVuZFBhcmFtLFxuICAgICAgICAgICAgICAgIHRpbWVab25lUGFyYW06IHJlZmluZWQudGltZVpvbmVQYXJhbSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBmZXRjaChhcmcsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7IG1ldGEgfSA9IGFyZy5ldmVudFNvdXJjZTtcbiAgICAgICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IGJ1aWxkUmVxdWVzdFBhcmFtcyhtZXRhLCBhcmcucmFuZ2UsIGFyZy5jb250ZXh0KTtcbiAgICAgICAgaW50ZXJuYWxDb21tb24ucmVxdWVzdEpzb24obWV0YS5tZXRob2QsIG1ldGEudXJsLCByZXF1ZXN0UGFyYW1zKS50aGVuKChbcmF3RXZlbnRzLCByZXNwb25zZV0pID0+IHtcbiAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayh7IHJhd0V2ZW50cywgcmVzcG9uc2UgfSk7XG4gICAgICAgIH0sIGVycm9yQ2FsbGJhY2spO1xuICAgIH0sXG59O1xuY29uc3QganNvbkZlZWRFdmVudFNvdXJjZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ2pzb24tZXZlbnQtc291cmNlJyxcbiAgICBldmVudFNvdXJjZVJlZmluZXJzOiBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTLFxuICAgIGV2ZW50U291cmNlRGVmczogW2V2ZW50U291cmNlRGVmXSxcbn0pO1xuZnVuY3Rpb24gYnVpbGRSZXF1ZXN0UGFyYW1zKG1ldGEsIHJhbmdlLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZGF0ZUVudiwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICBsZXQgc3RhcnRQYXJhbTtcbiAgICBsZXQgZW5kUGFyYW07XG4gICAgbGV0IHRpbWVab25lUGFyYW07XG4gICAgbGV0IGN1c3RvbVJlcXVlc3RQYXJhbXM7XG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIHN0YXJ0UGFyYW0gPSBtZXRhLnN0YXJ0UGFyYW07XG4gICAgaWYgKHN0YXJ0UGFyYW0gPT0gbnVsbCkge1xuICAgICAgICBzdGFydFBhcmFtID0gb3B0aW9ucy5zdGFydFBhcmFtO1xuICAgIH1cbiAgICBlbmRQYXJhbSA9IG1ldGEuZW5kUGFyYW07XG4gICAgaWYgKGVuZFBhcmFtID09IG51bGwpIHtcbiAgICAgICAgZW5kUGFyYW0gPSBvcHRpb25zLmVuZFBhcmFtO1xuICAgIH1cbiAgICB0aW1lWm9uZVBhcmFtID0gbWV0YS50aW1lWm9uZVBhcmFtO1xuICAgIGlmICh0aW1lWm9uZVBhcmFtID09IG51bGwpIHtcbiAgICAgICAgdGltZVpvbmVQYXJhbSA9IG9wdGlvbnMudGltZVpvbmVQYXJhbTtcbiAgICB9XG4gICAgLy8gcmV0cmlldmUgYW55IG91dGJvdW5kIEdFVC9QT1NUIGRhdGEgZnJvbSB0aGUgb3B0aW9uc1xuICAgIGlmICh0eXBlb2YgbWV0YS5leHRyYVBhcmFtcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBzdXBwbGllZCBhcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGtleS92YWx1ZSBvYmplY3RcbiAgICAgICAgY3VzdG9tUmVxdWVzdFBhcmFtcyA9IG1ldGEuZXh0cmFQYXJhbXMoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIHByb2JhYmx5IHN1cHBsaWVkIGFzIGEgc3RyYWlnaHQga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICBjdXN0b21SZXF1ZXN0UGFyYW1zID0gbWV0YS5leHRyYVBhcmFtcyB8fCB7fTtcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihwYXJhbXMsIGN1c3RvbVJlcXVlc3RQYXJhbXMpO1xuICAgIHBhcmFtc1tzdGFydFBhcmFtXSA9IGRhdGVFbnYuZm9ybWF0SXNvKHJhbmdlLnN0YXJ0KTtcbiAgICBwYXJhbXNbZW5kUGFyYW1dID0gZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2UuZW5kKTtcbiAgICBpZiAoZGF0ZUVudi50aW1lWm9uZSAhPT0gJ2xvY2FsJykge1xuICAgICAgICBwYXJhbXNbdGltZVpvbmVQYXJhbV0gPSBkYXRlRW52LnRpbWVab25lO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xufVxuXG5jb25zdCBTSU1QTEVfUkVDVVJSSU5HX1JFRklORVJTID0ge1xuICAgIGRheXNPZldlZWs6IGludGVybmFsQ29tbW9uLmlkZW50aXR5LFxuICAgIHN0YXJ0VGltZTogaW50ZXJuYWxDb21tb24uY3JlYXRlRHVyYXRpb24sXG4gICAgZW5kVGltZTogaW50ZXJuYWxDb21tb24uY3JlYXRlRHVyYXRpb24sXG4gICAgZHVyYXRpb246IGludGVybmFsQ29tbW9uLmNyZWF0ZUR1cmF0aW9uLFxuICAgIHN0YXJ0UmVjdXI6IGludGVybmFsQ29tbW9uLmlkZW50aXR5LFxuICAgIGVuZFJlY3VyOiBpbnRlcm5hbENvbW1vbi5pZGVudGl0eSxcbn07XG5cbmxldCByZWN1cnJpbmcgPSB7XG4gICAgcGFyc2UocmVmaW5lZCwgZGF0ZUVudikge1xuICAgICAgICBpZiAocmVmaW5lZC5kYXlzT2ZXZWVrIHx8IHJlZmluZWQuc3RhcnRUaW1lIHx8IHJlZmluZWQuZW5kVGltZSB8fCByZWZpbmVkLnN0YXJ0UmVjdXIgfHwgcmVmaW5lZC5lbmRSZWN1cikge1xuICAgICAgICAgICAgbGV0IHJlY3VycmluZ0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgZGF5c09mV2VlazogcmVmaW5lZC5kYXlzT2ZXZWVrIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lOiByZWZpbmVkLnN0YXJ0VGltZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGVuZFRpbWU6IHJlZmluZWQuZW5kVGltZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIHN0YXJ0UmVjdXI6IHJlZmluZWQuc3RhcnRSZWN1ciA/IGRhdGVFbnYuY3JlYXRlTWFya2VyKHJlZmluZWQuc3RhcnRSZWN1cikgOiBudWxsLFxuICAgICAgICAgICAgICAgIGVuZFJlY3VyOiByZWZpbmVkLmVuZFJlY3VyID8gZGF0ZUVudi5jcmVhdGVNYXJrZXIocmVmaW5lZC5lbmRSZWN1cikgOiBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbjtcbiAgICAgICAgICAgIGlmIChyZWZpbmVkLmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24gPSByZWZpbmVkLmR1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkdXJhdGlvbiAmJiByZWZpbmVkLnN0YXJ0VGltZSAmJiByZWZpbmVkLmVuZFRpbWUpIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGludGVybmFsQ29tbW9uLnN1YnRyYWN0RHVyYXRpb25zKHJlZmluZWQuZW5kVGltZSwgcmVmaW5lZC5zdGFydFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhbGxEYXlHdWVzczogQm9vbGVhbighcmVmaW5lZC5zdGFydFRpbWUgJiYgIXJlZmluZWQuZW5kVGltZSksXG4gICAgICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgdHlwZURhdGE6IHJlY3VycmluZ0RhdGEsIC8vIGRvZXNuJ3QgbmVlZCBlbmRUaW1lIGFueW1vcmUgYnV0IG9oIHdlbGxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBleHBhbmQodHlwZURhdGEsIGZyYW1pbmdSYW5nZSwgZGF0ZUVudikge1xuICAgICAgICBsZXQgY2xpcHBlZEZyYW1pbmdSYW5nZSA9IGludGVybmFsQ29tbW9uLmludGVyc2VjdFJhbmdlcyhmcmFtaW5nUmFuZ2UsIHsgc3RhcnQ6IHR5cGVEYXRhLnN0YXJ0UmVjdXIsIGVuZDogdHlwZURhdGEuZW5kUmVjdXIgfSk7XG4gICAgICAgIGlmIChjbGlwcGVkRnJhbWluZ1JhbmdlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwYW5kUmFuZ2VzKHR5cGVEYXRhLmRheXNPZldlZWssIHR5cGVEYXRhLnN0YXJ0VGltZSwgY2xpcHBlZEZyYW1pbmdSYW5nZSwgZGF0ZUVudik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH0sXG59O1xuY29uc3Qgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBuYW1lOiAnc2ltcGxlLXJlY3VycmluZy1ldmVudCcsXG4gICAgcmVjdXJyaW5nVHlwZXM6IFtyZWN1cnJpbmddLFxuICAgIGV2ZW50UmVmaW5lcnM6IFNJTVBMRV9SRUNVUlJJTkdfUkVGSU5FUlMsXG59KTtcbmZ1bmN0aW9uIGV4cGFuZFJhbmdlcyhkYXlzT2ZXZWVrLCBzdGFydFRpbWUsIGZyYW1pbmdSYW5nZSwgZGF0ZUVudikge1xuICAgIGxldCBkb3dIYXNoID0gZGF5c09mV2VlayA/IGludGVybmFsQ29tbW9uLmFycmF5VG9IYXNoKGRheXNPZldlZWspIDogbnVsbDtcbiAgICBsZXQgZGF5TWFya2VyID0gaW50ZXJuYWxDb21tb24uc3RhcnRPZkRheShmcmFtaW5nUmFuZ2Uuc3RhcnQpO1xuICAgIGxldCBlbmRNYXJrZXIgPSBmcmFtaW5nUmFuZ2UuZW5kO1xuICAgIGxldCBpbnN0YW5jZVN0YXJ0cyA9IFtdO1xuICAgIHdoaWxlIChkYXlNYXJrZXIgPCBlbmRNYXJrZXIpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlU3RhcnQ7XG4gICAgICAgIC8vIGlmIGV2ZXJ5ZGF5LCBvciB0aGlzIHBhcnRpY3VsYXIgZGF5LW9mLXdlZWtcbiAgICAgICAgaWYgKCFkb3dIYXNoIHx8IGRvd0hhc2hbZGF5TWFya2VyLmdldFVUQ0RheSgpXSkge1xuICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSkge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhcnQgPSBkYXRlRW52LmFkZChkYXlNYXJrZXIsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVN0YXJ0ID0gZGF5TWFya2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5zdGFuY2VTdGFydHMucHVzaChpbnN0YW5jZVN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBkYXlNYXJrZXIgPSBpbnRlcm5hbENvbW1vbi5hZGREYXlzKGRheU1hcmtlciwgMSk7XG4gICAgfVxuICAgIHJldHVybiBpbnN0YW5jZVN0YXJ0cztcbn1cblxuY29uc3QgY2hhbmdlSGFuZGxlclBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ2NoYW5nZS1oYW5kbGVyJyxcbiAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczoge1xuICAgICAgICBldmVudHMoZXZlbnRzLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBoYW5kbGVFdmVudFNvdXJjZXMoW2V2ZW50c10sIGNvbnRleHQpO1xuICAgICAgICB9LFxuICAgICAgICBldmVudFNvdXJjZXM6IGhhbmRsZUV2ZW50U291cmNlcyxcbiAgICB9LFxufSk7XG4vKlxuQlVHOiBpZiBgZXZlbnRgIHdhcyBzdXBwbGllZCwgYWxsIHByZXZpb3VzbHktZ2l2ZW4gYGV2ZW50U291cmNlc2Agd2lsbCBiZSB3aXBlZCBvdXRcbiovXG5mdW5jdGlvbiBoYW5kbGVFdmVudFNvdXJjZXMoaW5wdXRzLCBjb250ZXh0KSB7XG4gICAgbGV0IHVuZm91bmRTb3VyY2VzID0gaW50ZXJuYWxDb21tb24uaGFzaFZhbHVlc1RvQXJyYXkoY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50U291cmNlcyk7XG4gICAgaWYgKHVuZm91bmRTb3VyY2VzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBpbnB1dHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIEFycmF5LmlzQXJyYXkodW5mb3VuZFNvdXJjZXNbMF0uX3JhdykgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShpbnB1dHNbMF0pKSB7XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFU0VUX1JBV19FVkVOVFMnLFxuICAgICAgICAgICAgc291cmNlSWQ6IHVuZm91bmRTb3VyY2VzWzBdLnNvdXJjZUlkLFxuICAgICAgICAgICAgcmF3RXZlbnRzOiBpbnB1dHNbMF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZXdJbnB1dHMgPSBbXTtcbiAgICBmb3IgKGxldCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgICAgbGV0IGlucHV0Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmZvdW5kU291cmNlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHVuZm91bmRTb3VyY2VzW2ldLl9yYXcgPT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgdW5mb3VuZFNvdXJjZXMuc3BsaWNlKGksIDEpOyAvLyBkZWxldGVcbiAgICAgICAgICAgICAgICBpbnB1dEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlucHV0Rm91bmQpIHtcbiAgICAgICAgICAgIG5ld0lucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCB1bmZvdW5kU291cmNlIG9mIHVuZm91bmRTb3VyY2VzKSB7XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVF9TT1VSQ0UnLFxuICAgICAgICAgICAgc291cmNlSWQ6IHVuZm91bmRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBuZXdJbnB1dCBvZiBuZXdJbnB1dHMpIHtcbiAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS5hZGRFdmVudFNvdXJjZShuZXdJbnB1dCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVEYXRlUHJvZmlsZShkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdkYXRlc1NldCcsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxDb21tb24uYnVpbGRSYW5nZUFwaVdpdGhUaW1lWm9uZShkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgY29udGV4dC5kYXRlRW52KSksIHsgdmlldzogY29udGV4dC52aWV3QXBpIH0pKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRTdG9yZShldmVudFN0b3JlLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZW1pdHRlciB9ID0gY29udGV4dDtcbiAgICBpZiAoZW1pdHRlci5oYXNIYW5kbGVycygnZXZlbnRzU2V0JykpIHtcbiAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudHNTZXQnLCBpbnRlcm5hbENvbW1vbi5idWlsZEV2ZW50QXBpcyhldmVudFN0b3JlLCBjb250ZXh0KSk7XG4gICAgfVxufVxuXG4vKlxudGhpcyBhcnJheSBpcyBleHBvc2VkIG9uIHRoZSByb290IG5hbWVzcGFjZSBzbyB0aGF0IFVNRCBwbHVnaW5zIGNhbiBhZGQgdG8gaXQuXG5zZWUgdGhlIHJvbGx1cC1idW5kbGVzIHNjcmlwdC5cbiovXG5jb25zdCBnbG9iYWxQbHVnaW5zID0gW1xuICAgIGFycmF5RXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgZnVuY0V2ZW50U291cmNlUGx1Z2luLFxuICAgIGpzb25GZWVkRXZlbnRTb3VyY2VQbHVnaW4sXG4gICAgc2ltcGxlUmVjdXJyaW5nRXZlbnRzUGx1Z2luLFxuICAgIGNoYW5nZUhhbmRsZXJQbHVnaW4sXG4gICAgY3JlYXRlUGx1Z2luKHtcbiAgICAgICAgbmFtZTogJ21pc2MnLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogW1xuICAgICAgICAgICAgKHN0YXRlKSA9PiBjb21wdXRlRXZlbnRTb3VyY2VzTG9hZGluZyhzdGF0ZS5ldmVudFNvdXJjZXMpLFxuICAgICAgICBdLFxuICAgICAgICBwcm9wU2V0SGFuZGxlcnM6IHtcbiAgICAgICAgICAgIGRhdGVQcm9maWxlOiBoYW5kbGVEYXRlUHJvZmlsZSxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IGhhbmRsZUV2ZW50U3RvcmUsXG4gICAgICAgIH0sXG4gICAgfSksXG5dO1xuXG5jbGFzcyBUYXNrUnVubmVyIHtcbiAgICBjb25zdHJ1Y3RvcihydW5UYXNrT3B0aW9uLCBkcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgIHRoaXMucnVuVGFza09wdGlvbiA9IHJ1blRhc2tPcHRpb247XG4gICAgICAgIHRoaXMuZHJhaW5lZE9wdGlvbiA9IGRyYWluZWRPcHRpb247XG4gICAgICAgIHRoaXMucXVldWUgPSBbXTtcbiAgICAgICAgdGhpcy5kZWxheWVkUnVubmVyID0gbmV3IGludGVybmFsQ29tbW9uLkRlbGF5ZWRSdW5uZXIodGhpcy5kcmFpbi5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgcmVxdWVzdCh0YXNrLCBkZWxheSkge1xuICAgICAgICB0aGlzLnF1ZXVlLnB1c2godGFzayk7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXF1ZXN0KGRlbGF5KTtcbiAgICB9XG4gICAgcGF1c2Uoc2NvcGUpIHtcbiAgICAgICAgdGhpcy5kZWxheWVkUnVubmVyLnBhdXNlKHNjb3BlKTtcbiAgICB9XG4gICAgcmVzdW1lKHNjb3BlLCBmb3JjZSkge1xuICAgICAgICB0aGlzLmRlbGF5ZWRSdW5uZXIucmVzdW1lKHNjb3BlLCBmb3JjZSk7XG4gICAgfVxuICAgIGRyYWluKCkge1xuICAgICAgICBsZXQgeyBxdWV1ZSB9ID0gdGhpcztcbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGNvbXBsZXRlZFRhc2tzID0gW107XG4gICAgICAgICAgICBsZXQgdGFzaztcbiAgICAgICAgICAgIHdoaWxlICgodGFzayA9IHF1ZXVlLnNoaWZ0KCkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ydW5UYXNrKHRhc2spO1xuICAgICAgICAgICAgICAgIGNvbXBsZXRlZFRhc2tzLnB1c2godGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRyYWluZWQoY29tcGxldGVkVGFza3MpO1xuICAgICAgICB9IC8vIGtlZXAgZ29pbmcsIGluIGNhc2UgbmV3IHRhc2tzIHdlcmUgYWRkZWQgaW4gdGhlIGRyYWluZWQgaGFuZGxlclxuICAgIH1cbiAgICBydW5UYXNrKHRhc2spIHtcbiAgICAgICAgaWYgKHRoaXMucnVuVGFza09wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5ydW5UYXNrT3B0aW9uKHRhc2spO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRyYWluZWQoY29tcGxldGVkVGFza3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhaW5lZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uKGNvbXBsZXRlZFRhc2tzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gQ29tcHV0ZXMgd2hhdCB0aGUgdGl0bGUgYXQgdGhlIHRvcCBvZiB0aGUgY2FsZW5kYXJBcGkgc2hvdWxkIGJlIGZvciB0aGlzIHZpZXdcbmZ1bmN0aW9uIGJ1aWxkVGl0bGUoZGF0ZVByb2ZpbGUsIHZpZXdPcHRpb25zLCBkYXRlRW52KSB7XG4gICAgbGV0IHJhbmdlO1xuICAgIC8vIGZvciB2aWV3cyB0aGF0IHNwYW4gYSBsYXJnZSB1bml0IG9mIHRpbWUsIHNob3cgdGhlIHByb3BlciBpbnRlcnZhbCwgaWdub3Jpbmcgc3RyYXkgZGF5cyBiZWZvcmUgYW5kIGFmdGVyXG4gICAgaWYgKC9eKHllYXJ8bW9udGgpJC8udGVzdChkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2VVbml0KSkge1xuICAgICAgICByYW5nZSA9IGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGZvciBkYXkgdW5pdHMgb3Igc21hbGxlciwgdXNlIHRoZSBhY3R1YWwgZGF5IHJhbmdlXG4gICAgICAgIHJhbmdlID0gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2U7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIGludGVybmFsQ29tbW9uLmNyZWF0ZUZvcm1hdHRlcih2aWV3T3B0aW9ucy50aXRsZUZvcm1hdCB8fCBidWlsZFRpdGxlRm9ybWF0KGRhdGVQcm9maWxlKSksIHtcbiAgICAgICAgaXNFbmRFeGNsdXNpdmU6IGRhdGVQcm9maWxlLmlzUmFuZ2VBbGxEYXksXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IHZpZXdPcHRpb25zLnRpdGxlUmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBHZW5lcmF0ZXMgdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdGl0bGUgZm9yIHRoZSBjdXJyZW50IGRhdGUgcmFuZ2UuXG4vLyBBdHRlbXB0cyB0byBjb21wdXRlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZvcm1hdCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQgd2l0aCBgdGl0bGVGb3JtYXRgLlxuZnVuY3Rpb24gYnVpbGRUaXRsZUZvcm1hdChkYXRlUHJvZmlsZSkge1xuICAgIGxldCB7IGN1cnJlbnRSYW5nZVVuaXQgfSA9IGRhdGVQcm9maWxlO1xuICAgIGlmIChjdXJyZW50UmFuZ2VVbml0ID09PSAneWVhcicpIHtcbiAgICAgICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnIH07XG4gICAgfVxuICAgIGlmIChjdXJyZW50UmFuZ2VVbml0ID09PSAnbW9udGgnKSB7XG4gICAgICAgIHJldHVybiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9OyAvLyBsaWtlIFwiU2VwdGVtYmVyIDIwMTRcIlxuICAgIH1cbiAgICBsZXQgZGF5cyA9IGludGVybmFsQ29tbW9uLmRpZmZXaG9sZURheXMoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0LCBkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UuZW5kKTtcbiAgICBpZiAoZGF5cyAhPT0gbnVsbCAmJiBkYXlzID4gMSkge1xuICAgICAgICAvLyBtdWx0aS1kYXkgcmFuZ2UuIHNob3J0ZXIsIGxpa2UgXCJTZXAgOSAtIDEwIDIwMTRcIlxuICAgICAgICByZXR1cm4geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJyB9O1xuICAgIH1cbiAgICAvLyBvbmUgZGF5LiBsb25nZXIsIGxpa2UgXCJTZXB0ZW1iZXIgOSAyMDE0XCJcbiAgICByZXR1cm4geyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH07XG59XG5cbi8vIGluIGZ1dHVyZSByZWZhY3RvciwgZG8gdGhlIHJlZHV4LXN0eWxlIGZ1bmN0aW9uKHN0YXRlPWluaXRpYWwpIGZvciBpbml0aWFsLXN0YXRlXG4vLyBhbHNvLCB3aGF0ZXZlciBpcyBoYXBwZW5pbmcgaW4gY29uc3RydWN0b3IsIGhhdmUgaXQgaGFwcGVuIGluIGFjdGlvbiBxdWV1ZSB0b29cbmNsYXNzIENhbGVuZGFyRGF0YU1hbmFnZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YSA9IGludGVybmFsQ29tbW9uLm1lbW9pemUodGhpcy5fY29tcHV0ZUN1cnJlbnRWaWV3RGF0YSk7XG4gICAgICAgIHRoaXMub3JnYW5pemVSYXdMb2NhbGVzID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShvcmdhbml6ZVJhd0xvY2FsZXMpO1xuICAgICAgICB0aGlzLmJ1aWxkTG9jYWxlID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZExvY2FsZSk7XG4gICAgICAgIHRoaXMuYnVpbGRQbHVnaW5Ib29rcyA9IGJ1aWxkQnVpbGRQbHVnaW5Ib29rcygpO1xuICAgICAgICB0aGlzLmJ1aWxkRGF0ZUVudiA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoYnVpbGREYXRlRW52JDEpO1xuICAgICAgICB0aGlzLmJ1aWxkVGhlbWUgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVGhlbWUpO1xuICAgICAgICB0aGlzLnBhcnNlVG9vbGJhcnMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKHBhcnNlVG9vbGJhcnMpO1xuICAgICAgICB0aGlzLmJ1aWxkVmlld1NwZWNzID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZFZpZXdTcGVjcyk7XG4gICAgICAgIHRoaXMuYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvciA9IGludGVybmFsQ29tbW9uLm1lbW9pemVPYmpBcmcoYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3QXBpID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZFZpZXdBcGkpO1xuICAgICAgICB0aGlzLmJ1aWxkVmlld1VpUHJvcHMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplT2JqQXJnKGJ1aWxkVmlld1VpUHJvcHMpO1xuICAgICAgICB0aGlzLmJ1aWxkRXZlbnRVaUJ5U291cmNlID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZEV2ZW50VWlCeVNvdXJjZSwgaW50ZXJuYWxDb21tb24uaXNQcm9wc0VxdWFsKTtcbiAgICAgICAgdGhpcy5idWlsZEV2ZW50VWlCYXNlcyA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoYnVpbGRFdmVudFVpQmFzZXMpO1xuICAgICAgICB0aGlzLnBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplT2JqQXJnKHBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMpO1xuICAgICAgICB0aGlzLmJ1aWxkVGl0bGUgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVGl0bGUpO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgaW50ZXJuYWxDb21tb24uRW1pdHRlcigpO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lciA9IG5ldyBUYXNrUnVubmVyKHRoaXMuX2hhbmRsZUFjdGlvbi5iaW5kKHRoaXMpLCB0aGlzLnVwZGF0ZURhdGEuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0ID0ge307XG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc1JlZmluZWQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnMgPSB7fTtcbiAgICAgICAgdGhpcy5vcHRpb25zRm9yUmVmaW5pbmcgPSBbXTtcbiAgICAgICAgdGhpcy5vcHRpb25zRm9ySGFuZGxpbmcgPSBbXTtcbiAgICAgICAgdGhpcy5nZXRDdXJyZW50RGF0YSA9ICgpID0+IHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCA9IChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnJlcXVlc3QoYWN0aW9uKTsgLy8gcHJvdGVjdHMgYWdhaW5zdCByZWN1cnNpdmUgY2FsbHMgdG8gX2hhbmRsZUFjdGlvblxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnBhdXNlKCk7XG4gICAgICAgIGxldCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzID0ge307XG4gICAgICAgIGxldCBvcHRpb25zRGF0YSA9IHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhKHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgcHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICBsZXQgY3VycmVudFZpZXdUeXBlID0gb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLmluaXRpYWxWaWV3IHx8IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLmluaXRpYWxWaWV3O1xuICAgICAgICBsZXQgY3VycmVudFZpZXdEYXRhID0gdGhpcy5jb21wdXRlQ3VycmVudFZpZXdEYXRhKGN1cnJlbnRWaWV3VHlwZSwgb3B0aW9uc0RhdGEsIHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIC8vIHdpcmUgdGhpbmdzIHVwXG4gICAgICAgIC8vIFRPRE86IG5vdCBEUllcbiAgICAgICAgcHJvcHMuY2FsZW5kYXJBcGkuY3VycmVudERhdGFNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgdGhpcy5lbWl0dGVyLnNldFRoaXNDb250ZXh0KHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgdGhpcy5lbWl0dGVyLnNldE9wdGlvbnMoY3VycmVudFZpZXdEYXRhLm9wdGlvbnMpO1xuICAgICAgICBsZXQgY3VycmVudERhdGUgPSBpbnRlcm5hbENvbW1vbi5nZXRJbml0aWFsRGF0ZShvcHRpb25zRGF0YS5jYWxlbmRhck9wdGlvbnMsIG9wdGlvbnNEYXRhLmRhdGVFbnYpO1xuICAgICAgICBsZXQgZGF0ZVByb2ZpbGUgPSBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGQoY3VycmVudERhdGUpO1xuICAgICAgICBpZiAoIWludGVybmFsQ29tbW9uLnJhbmdlQ29udGFpbnNNYXJrZXIoZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGN1cnJlbnREYXRlKSkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSBkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2Uuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNhbGVuZGFyQ29udGV4dCA9IHtcbiAgICAgICAgICAgIGRhdGVFbnY6IG9wdGlvbnNEYXRhLmRhdGVFbnYsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zRGF0YS5jYWxlbmRhck9wdGlvbnMsXG4gICAgICAgICAgICBwbHVnaW5Ib29rczogb3B0aW9uc0RhdGEucGx1Z2luSG9va3MsXG4gICAgICAgICAgICBjYWxlbmRhckFwaTogcHJvcHMuY2FsZW5kYXJBcGksXG4gICAgICAgICAgICBkaXNwYXRjaDogdGhpcy5kaXNwYXRjaCxcbiAgICAgICAgICAgIGVtaXR0ZXI6IHRoaXMuZW1pdHRlcixcbiAgICAgICAgICAgIGdldEN1cnJlbnREYXRhOiB0aGlzLmdldEN1cnJlbnREYXRhLFxuICAgICAgICB9O1xuICAgICAgICAvLyBuZWVkcyB0byBiZSBhZnRlciBzZXRUaGlzQ29udGV4dFxuICAgICAgICBmb3IgKGxldCBjYWxsYmFjayBvZiBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcy5jb250ZXh0SW5pdCkge1xuICAgICAgICAgICAgY2FsbGJhY2soY2FsZW5kYXJDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOT1QgRFJZXG4gICAgICAgIGxldCBldmVudFNvdXJjZXMgPSBpbml0RXZlbnRTb3VyY2VzKG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucywgZGF0ZVByb2ZpbGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIGxldCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICAgICAgY3VycmVudFZpZXdUeXBlLFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZSxcbiAgICAgICAgICAgIGJ1c2luZXNzSG91cnM6IHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICAgICAgZXZlbnRTb3VyY2VzLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiB7fSxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IGludGVybmFsQ29tbW9uLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmU6IGludGVybmFsQ29tbW9uLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiAnJyxcbiAgICAgICAgICAgIGV2ZW50RHJhZzogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiBudWxsLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiB0aGlzLmJ1aWxkVmlld1VpUHJvcHMoY2FsZW5kYXJDb250ZXh0KS5zZWxlY3Rpb25Db25maWcsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBjb250ZXh0QW5kU3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNhbGVuZGFyQ29udGV4dCksIGluaXRpYWxTdGF0ZSk7XG4gICAgICAgIGZvciAobGV0IHJlZHVjZXIgb2Ygb3B0aW9uc0RhdGEucGx1Z2luSG9va3MucmVkdWNlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5pdGlhbFN0YXRlLCByZWR1Y2VyKG51bGwsIG51bGwsIGNvbnRleHRBbmRTdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wdXRlSXNMb2FkaW5nKGluaXRpYWxTdGF0ZSwgY2FsZW5kYXJDb250ZXh0KSkge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2xvYWRpbmcnLCB0cnVlKTsgLy8gTk9UIERSWVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0YSgpO1xuICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5yZXN1bWUoKTtcbiAgICB9XG4gICAgcmVzZXRPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgY2hhbmdlZE9wdGlvbk5hbWVzKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoY2hhbmdlZE9wdGlvbk5hbWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3BzLm9wdGlvbk92ZXJyaWRlcyA9IG9wdGlvbk92ZXJyaWRlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHByb3BzLm9wdGlvbk92ZXJyaWRlcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHByb3BzLm9wdGlvbk92ZXJyaWRlcyB8fCB7fSkpLCBvcHRpb25PdmVycmlkZXMpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zRm9yUmVmaW5pbmcucHVzaCguLi5jaGFuZ2VkT3B0aW9uTmFtZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VkT3B0aW9uTmFtZXMgPT09IHVuZGVmaW5lZCB8fCBjaGFuZ2VkT3B0aW9uTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvblJ1bm5lci5yZXF1ZXN0KHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTk9USElORycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlQWN0aW9uKGFjdGlvbikge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUsIGVtaXR0ZXIgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzID0gcmVkdWNlRHluYW1pY09wdGlvbk92ZXJyaWRlcyhzdGF0ZS5keW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBhY3Rpb24pO1xuICAgICAgICBsZXQgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgbGV0IGN1cnJlbnRWaWV3VHlwZSA9IHJlZHVjZVZpZXdUeXBlKHN0YXRlLmN1cnJlbnRWaWV3VHlwZSwgYWN0aW9uKTtcbiAgICAgICAgbGV0IGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShjdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICAvLyB3aXJlIHRoaW5ncyB1cFxuICAgICAgICAvLyBUT0RPOiBub3QgRFJZXG4gICAgICAgIHByb3BzLmNhbGVuZGFyQXBpLmN1cnJlbnREYXRhTWFuYWdlciA9IHRoaXM7XG4gICAgICAgIGVtaXR0ZXIuc2V0VGhpc0NvbnRleHQocHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICBlbWl0dGVyLnNldE9wdGlvbnMoY3VycmVudFZpZXdEYXRhLm9wdGlvbnMpO1xuICAgICAgICBsZXQgY2FsZW5kYXJDb250ZXh0ID0ge1xuICAgICAgICAgICAgZGF0ZUVudjogb3B0aW9uc0RhdGEuZGF0ZUVudixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzOiBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGNhbGVuZGFyQXBpOiBwcm9wcy5jYWxlbmRhckFwaSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiB0aGlzLmRpc3BhdGNoLFxuICAgICAgICAgICAgZW1pdHRlcixcbiAgICAgICAgICAgIGdldEN1cnJlbnREYXRhOiB0aGlzLmdldEN1cnJlbnREYXRhLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgeyBjdXJyZW50RGF0ZSwgZGF0ZVByb2ZpbGUgfSA9IHN0YXRlO1xuICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YS5kYXRlUHJvZmlsZUdlbmVyYXRvciAhPT0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yKSB7IC8vIGhhY2tcbiAgICAgICAgICAgIGRhdGVQcm9maWxlID0gY3VycmVudFZpZXdEYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKGN1cnJlbnREYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50RGF0ZSA9IGludGVybmFsQ29tbW9uLnJlZHVjZUN1cnJlbnREYXRlKGN1cnJlbnREYXRlLCBhY3Rpb24pO1xuICAgICAgICBkYXRlUHJvZmlsZSA9IHJlZHVjZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBhY3Rpb24sIGN1cnJlbnREYXRlLCBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgPT09ICdQUkVWJyB8fCAvLyBUT0RPOiBtb3ZlIHRoaXMgbG9naWMgaW50byBEYXRlUHJvZmlsZUdlbmVyYXRvclxuICAgICAgICAgICAgYWN0aW9uLnR5cGUgPT09ICdORVhUJyB8fCAvLyBcIlxuICAgICAgICAgICAgIWludGVybmFsQ29tbW9uLnJhbmdlQ29udGFpbnNNYXJrZXIoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXMoc3RhdGUuZXZlbnRTb3VyY2VzLCBhY3Rpb24sIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICBsZXQgZXZlbnRTdG9yZSA9IGludGVybmFsQ29tbW9uLnJlZHVjZUV2ZW50U3RvcmUoc3RhdGUuZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICBsZXQgaXNFdmVudHNMb2FkaW5nID0gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoZXZlbnRTb3VyY2VzKTsgLy8gQkFELiBhbHNvIGNhbGxlZCBpbiB0aGlzIGZ1bmMgaW4gY29tcHV0ZUlzTG9hZGluZ1xuICAgICAgICBsZXQgcmVuZGVyYWJsZUV2ZW50U3RvcmUgPSAoaXNFdmVudHNMb2FkaW5nICYmICFjdXJyZW50Vmlld0RhdGEub3B0aW9ucy5wcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nKSA/XG4gICAgICAgICAgICAoc3RhdGUucmVuZGVyYWJsZUV2ZW50U3RvcmUgfHwgZXZlbnRTdG9yZSkgOiAvLyB0cnkgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICAgICAgZXZlbnRTdG9yZTtcbiAgICAgICAgbGV0IHsgZXZlbnRVaVNpbmdsZUJhc2UsIHNlbGVjdGlvbkNvbmZpZyB9ID0gdGhpcy5idWlsZFZpZXdVaVByb3BzKGNhbGVuZGFyQ29udGV4dCk7IC8vIHdpbGwgbWVtb2l6ZSBvYmpcbiAgICAgICAgbGV0IGV2ZW50VWlCeVNvdXJjZSA9IHRoaXMuYnVpbGRFdmVudFVpQnlTb3VyY2UoZXZlbnRTb3VyY2VzKTtcbiAgICAgICAgbGV0IGV2ZW50VWlCYXNlcyA9IHRoaXMuYnVpbGRFdmVudFVpQmFzZXMocmVuZGVyYWJsZUV2ZW50U3RvcmUuZGVmcywgZXZlbnRVaVNpbmdsZUJhc2UsIGV2ZW50VWlCeVNvdXJjZSk7XG4gICAgICAgIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBjdXJyZW50Vmlld1R5cGUsXG4gICAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICAgIGRhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTb3VyY2VzLFxuICAgICAgICAgICAgZXZlbnRTdG9yZSxcbiAgICAgICAgICAgIHJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgc2VsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzLFxuICAgICAgICAgICAgYnVzaW5lc3NIb3VyczogdGhpcy5wYXJzZUNvbnRleHRCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dCksXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiByZWR1Y2VEYXRlU2VsZWN0aW9uKHN0YXRlLmRhdGVTZWxlY3Rpb24sIGFjdGlvbiksXG4gICAgICAgICAgICBldmVudFNlbGVjdGlvbjogcmVkdWNlU2VsZWN0ZWRFdmVudChzdGF0ZS5ldmVudFNlbGVjdGlvbiwgYWN0aW9uKSxcbiAgICAgICAgICAgIGV2ZW50RHJhZzogcmVkdWNlRXZlbnREcmFnKHN0YXRlLmV2ZW50RHJhZywgYWN0aW9uKSxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiByZWR1Y2VFdmVudFJlc2l6ZShzdGF0ZS5ldmVudFJlc2l6ZSwgYWN0aW9uKSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNvbnRleHRBbmRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgbmV3U3RhdGUpO1xuICAgICAgICBmb3IgKGxldCByZWR1Y2VyIG9mIG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLnJlZHVjZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld1N0YXRlLCByZWR1Y2VyKHN0YXRlLCBhY3Rpb24sIGNvbnRleHRBbmRTdGF0ZSkpOyAvLyBnaXZlIHRoZSBPTEQgc3RhdGUsIGZvciBvbGQgdmFsdWVcbiAgICAgICAgfVxuICAgICAgICBsZXQgd2FzTG9hZGluZyA9IGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIGxldCBpc0xvYWRpbmcgPSBjb21wdXRlSXNMb2FkaW5nKG5ld1N0YXRlLCBjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICAvLyBUT0RPOiB1c2UgcHJvcFNldEhhbmRsZXJzIGluIHBsdWdpbiBzeXN0ZW1cbiAgICAgICAgaWYgKCF3YXNMb2FkaW5nICYmIGlzTG9hZGluZykge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdsb2FkaW5nJywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAod2FzTG9hZGluZyAmJiAhaXNMb2FkaW5nKSB7XG4gICAgICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2xvYWRpbmcnLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICBpZiAocHJvcHMub25BY3Rpb24pIHtcbiAgICAgICAgICAgIHByb3BzLm9uQWN0aW9uKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlRGF0YSgpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgb2xkRGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgbGV0IG9wdGlvbnNEYXRhID0gdGhpcy5jb21wdXRlT3B0aW9uc0RhdGEocHJvcHMub3B0aW9uT3ZlcnJpZGVzLCBzdGF0ZS5keW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIGxldCBjdXJyZW50Vmlld0RhdGEgPSB0aGlzLmNvbXB1dGVDdXJyZW50Vmlld0RhdGEoc3RhdGUuY3VycmVudFZpZXdUeXBlLCBvcHRpb25zRGF0YSwgcHJvcHMub3B0aW9uT3ZlcnJpZGVzLCBzdGF0ZS5keW5hbWljT3B0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmRhdGEgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHZpZXdUaXRsZTogdGhpcy5idWlsZFRpdGxlKHN0YXRlLmRhdGVQcm9maWxlLCBjdXJyZW50Vmlld0RhdGEub3B0aW9ucywgb3B0aW9uc0RhdGEuZGF0ZUVudiksIGNhbGVuZGFyQXBpOiBwcm9wcy5jYWxlbmRhckFwaSwgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsIGVtaXR0ZXI6IHRoaXMuZW1pdHRlciwgZ2V0Q3VycmVudERhdGE6IHRoaXMuZ2V0Q3VycmVudERhdGEgfSwgb3B0aW9uc0RhdGEpLCBjdXJyZW50Vmlld0RhdGEpLCBzdGF0ZSk7XG4gICAgICAgIGxldCBjaGFuZ2VIYW5kbGVycyA9IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLm9wdGlvbkNoYW5nZUhhbmRsZXJzO1xuICAgICAgICBsZXQgb2xkQ2FsZW5kYXJPcHRpb25zID0gb2xkRGF0YSAmJiBvbGREYXRhLmNhbGVuZGFyT3B0aW9ucztcbiAgICAgICAgbGV0IG5ld0NhbGVuZGFyT3B0aW9ucyA9IG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucztcbiAgICAgICAgaWYgKG9sZENhbGVuZGFyT3B0aW9ucyAmJiBvbGRDYWxlbmRhck9wdGlvbnMgIT09IG5ld0NhbGVuZGFyT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9sZENhbGVuZGFyT3B0aW9ucy50aW1lWm9uZSAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zLnRpbWVab25lKSB7XG4gICAgICAgICAgICAgICAgLy8gaGFja1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50U291cmNlcyA9IGRhdGEuZXZlbnRTb3VyY2VzID0gcmVkdWNlRXZlbnRTb3VyY2VzTmV3VGltZVpvbmUoZGF0YS5ldmVudFNvdXJjZXMsIHN0YXRlLmRhdGVQcm9maWxlLCBkYXRhKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5ldmVudFN0b3JlID0gZGF0YS5ldmVudFN0b3JlID0gaW50ZXJuYWxDb21tb24ucmV6b25lRXZlbnRTdG9yZURhdGVzKGRhdGEuZXZlbnRTdG9yZSwgb2xkRGF0YS5kYXRlRW52LCBkYXRhLmRhdGVFbnYpO1xuICAgICAgICAgICAgICAgIHN0YXRlLnJlbmRlcmFibGVFdmVudFN0b3JlID0gZGF0YS5yZW5kZXJhYmxlRXZlbnRTdG9yZSA9IGludGVybmFsQ29tbW9uLnJlem9uZUV2ZW50U3RvcmVEYXRlcyhkYXRhLnJlbmRlcmFibGVFdmVudFN0b3JlLCBvbGREYXRhLmRhdGVFbnYsIGRhdGEuZGF0ZUVudik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBvcHRpb25OYW1lIGluIGNoYW5nZUhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc0ZvckhhbmRsaW5nLmluZGV4T2Yob3B0aW9uTmFtZSkgIT09IC0xIHx8XG4gICAgICAgICAgICAgICAgICAgIG9sZENhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zW29wdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXJzW29wdGlvbk5hbWVdKG5ld0NhbGVuZGFyT3B0aW9uc1tvcHRpb25OYW1lXSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9uc0ZvckhhbmRsaW5nID0gW107XG4gICAgICAgIGlmIChwcm9wcy5vbkRhdGEpIHtcbiAgICAgICAgICAgIHByb3BzLm9uRGF0YShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wdXRlT3B0aW9uc0RhdGEob3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBjYWxlbmRhckFwaSkge1xuICAgICAgICAvLyBUT0RPOiBibGFja2xpc3Qgb3B0aW9ucyB0aGF0IGFyZSBoYW5kbGVkIGJ5IG9wdGlvbkNoYW5nZUhhbmRsZXJzXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zRm9yUmVmaW5pbmcubGVuZ3RoICYmXG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMgPT09IHRoaXMuc3RhYmxlT3B0aW9uT3ZlcnJpZGVzICYmXG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzID09PSB0aGlzLnN0YWJsZUR5bmFtaWNPcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YWJsZUNhbGVuZGFyT3B0aW9uc0RhdGE7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcmVmaW5lZE9wdGlvbnMsIHBsdWdpbkhvb2tzLCBsb2NhbGVEZWZhdWx0cywgYXZhaWxhYmxlTG9jYWxlRGF0YSwgZXh0cmEsIH0gPSB0aGlzLnByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMob3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgd2FyblVua25vd25PcHRpb25zKGV4dHJhKTtcbiAgICAgICAgbGV0IGRhdGVFbnYgPSB0aGlzLmJ1aWxkRGF0ZUVudihyZWZpbmVkT3B0aW9ucy50aW1lWm9uZSwgcmVmaW5lZE9wdGlvbnMubG9jYWxlLCByZWZpbmVkT3B0aW9ucy53ZWVrTnVtYmVyQ2FsY3VsYXRpb24sIHJlZmluZWRPcHRpb25zLmZpcnN0RGF5LCByZWZpbmVkT3B0aW9ucy53ZWVrVGV4dCwgcGx1Z2luSG9va3MsIGF2YWlsYWJsZUxvY2FsZURhdGEsIHJlZmluZWRPcHRpb25zLmRlZmF1bHRSYW5nZVNlcGFyYXRvcik7XG4gICAgICAgIGxldCB2aWV3U3BlY3MgPSB0aGlzLmJ1aWxkVmlld1NwZWNzKHBsdWdpbkhvb2tzLnZpZXdzLCB0aGlzLnN0YWJsZU9wdGlvbk92ZXJyaWRlcywgdGhpcy5zdGFibGVEeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBsb2NhbGVEZWZhdWx0cyk7XG4gICAgICAgIGxldCB0aGVtZSA9IHRoaXMuYnVpbGRUaGVtZShyZWZpbmVkT3B0aW9ucywgcGx1Z2luSG9va3MpO1xuICAgICAgICBsZXQgdG9vbGJhckNvbmZpZyA9IHRoaXMucGFyc2VUb29sYmFycyhyZWZpbmVkT3B0aW9ucywgdGhpcy5zdGFibGVPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhYmxlQ2FsZW5kYXJPcHRpb25zRGF0YSA9IHtcbiAgICAgICAgICAgIGNhbGVuZGFyT3B0aW9uczogcmVmaW5lZE9wdGlvbnMsXG4gICAgICAgICAgICBwbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGRhdGVFbnYsXG4gICAgICAgICAgICB2aWV3U3BlY3MsXG4gICAgICAgICAgICB0aGVtZSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIGF2YWlsYWJsZVJhd0xvY2FsZXM6IGF2YWlsYWJsZUxvY2FsZURhdGEubWFwLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBhbHdheXMgY2FsbGVkIGZyb20gYmVoaW5kIGEgbWVtb2l6ZXJcbiAgICBwcm9jZXNzUmF3Q2FsZW5kYXJPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcykge1xuICAgICAgICBsZXQgeyBsb2NhbGVzLCBsb2NhbGUgfSA9IGludGVybmFsQ29tbW9uLm1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgYXZhaWxhYmxlTG9jYWxlRGF0YSA9IHRoaXMub3JnYW5pemVSYXdMb2NhbGVzKGxvY2FsZXMpO1xuICAgICAgICBsZXQgYXZhaWxhYmxlUmF3TG9jYWxlcyA9IGF2YWlsYWJsZUxvY2FsZURhdGEubWFwO1xuICAgICAgICBsZXQgbG9jYWxlRGVmYXVsdHMgPSB0aGlzLmJ1aWxkTG9jYWxlKGxvY2FsZSB8fCBhdmFpbGFibGVMb2NhbGVEYXRhLmRlZmF1bHRDb2RlLCBhdmFpbGFibGVSYXdMb2NhbGVzKS5vcHRpb25zO1xuICAgICAgICBsZXQgcGx1Z2luSG9va3MgPSB0aGlzLmJ1aWxkUGx1Z2luSG9va3Mob3B0aW9uT3ZlcnJpZGVzLnBsdWdpbnMgfHwgW10sIGdsb2JhbFBsdWdpbnMpO1xuICAgICAgICBsZXQgcmVmaW5lcnMgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fUkVGSU5FUlMpLCBpbnRlcm5hbENvbW1vbi5DQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUyksIGludGVybmFsQ29tbW9uLkNBTEVOREFSX09QVElPTl9SRUZJTkVSUyksIHBsdWdpbkhvb2tzLmxpc3RlbmVyUmVmaW5lcnMpLCBwbHVnaW5Ib29rcy5vcHRpb25SZWZpbmVycyk7XG4gICAgICAgIGxldCBleHRyYSA9IHt9O1xuICAgICAgICBsZXQgcmF3ID0gaW50ZXJuYWxDb21tb24ubWVyZ2VSYXdPcHRpb25zKFtcbiAgICAgICAgICAgIGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTLFxuICAgICAgICAgICAgbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBdKTtcbiAgICAgICAgbGV0IHJlZmluZWQgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRSYXcgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dDtcbiAgICAgICAgbGV0IGN1cnJlbnRSZWZpbmVkID0gdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZDtcbiAgICAgICAgbGV0IGFueUNoYW5nZXMgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgb3B0aW9uTmFtZSBpbiByYXcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNGb3JSZWZpbmluZy5pbmRleE9mKG9wdGlvbk5hbWUpID09PSAtMSAmJiAocmF3W29wdGlvbk5hbWVdID09PSBjdXJyZW50UmF3W29wdGlvbk5hbWVdIHx8IChpbnRlcm5hbENvbW1vbi5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SU1tvcHRpb25OYW1lXSAmJlxuICAgICAgICAgICAgICAgIChvcHRpb25OYW1lIGluIGN1cnJlbnRSYXcpICYmXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0oY3VycmVudFJhd1tvcHRpb25OYW1lXSwgcmF3W29wdGlvbk5hbWVdKSkpKSB7XG4gICAgICAgICAgICAgICAgcmVmaW5lZFtvcHRpb25OYW1lXSA9IGN1cnJlbnRSZWZpbmVkW29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVmaW5lcnNbb3B0aW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGV4dHJhW29wdGlvbk5hbWVdID0gY3VycmVudFJhd1tvcHRpb25OYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55Q2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQgPSByYXc7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkID0gcmVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3RhYmxlT3B0aW9uT3ZlcnJpZGVzID0gb3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICAgICAgdGhpcy5zdGFibGVEeW5hbWljT3B0aW9uT3ZlcnJpZGVzID0gZHluYW1pY09wdGlvbk92ZXJyaWRlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnNGb3JIYW5kbGluZy5wdXNoKC4uLnRoaXMub3B0aW9uc0ZvclJlZmluaW5nKTtcbiAgICAgICAgdGhpcy5vcHRpb25zRm9yUmVmaW5pbmcgPSBbXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd09wdGlvbnM6IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0LFxuICAgICAgICAgICAgcmVmaW5lZE9wdGlvbnM6IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQsXG4gICAgICAgICAgICBwbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGF2YWlsYWJsZUxvY2FsZURhdGEsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIGV4dHJhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfY29tcHV0ZUN1cnJlbnRWaWV3RGF0YSh2aWV3VHlwZSwgb3B0aW9uc0RhdGEsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcykge1xuICAgICAgICBsZXQgdmlld1NwZWMgPSBvcHRpb25zRGF0YS52aWV3U3BlY3Nbdmlld1R5cGVdO1xuICAgICAgICBpZiAoIXZpZXdTcGVjKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZpZXdUeXBlIFwiJHt2aWV3VHlwZX1cIiBpcyBub3QgYXZhaWxhYmxlLiBQbGVhc2UgbWFrZSBzdXJlIHlvdSd2ZSBsb2FkZWQgYWxsIG5lY2Nlc3NhcnkgcGx1Z2luc2ApO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHJlZmluZWRPcHRpb25zLCBleHRyYSB9ID0gdGhpcy5wcm9jZXNzUmF3Vmlld09wdGlvbnModmlld1NwZWMsIG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLCBvcHRpb25zRGF0YS5sb2NhbGVEZWZhdWx0cywgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgd2FyblVua25vd25PcHRpb25zKGV4dHJhKTtcbiAgICAgICAgbGV0IGRhdGVQcm9maWxlR2VuZXJhdG9yID0gdGhpcy5idWlsZERhdGVQcm9maWxlR2VuZXJhdG9yKHtcbiAgICAgICAgICAgIGRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3M6IHZpZXdTcGVjLm9wdGlvbkRlZmF1bHRzLmRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MsXG4gICAgICAgICAgICBkdXJhdGlvbjogdmlld1NwZWMuZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvblVuaXQ6IHZpZXdTcGVjLmR1cmF0aW9uVW5pdCxcbiAgICAgICAgICAgIHVzZXNNaW5NYXhUaW1lOiB2aWV3U3BlYy5vcHRpb25EZWZhdWx0cy51c2VzTWluTWF4VGltZSxcbiAgICAgICAgICAgIGRhdGVFbnY6IG9wdGlvbnNEYXRhLmRhdGVFbnYsXG4gICAgICAgICAgICBjYWxlbmRhckFwaTogdGhpcy5wcm9wcy5jYWxlbmRhckFwaSxcbiAgICAgICAgICAgIHNsb3RNaW5UaW1lOiByZWZpbmVkT3B0aW9ucy5zbG90TWluVGltZSxcbiAgICAgICAgICAgIHNsb3RNYXhUaW1lOiByZWZpbmVkT3B0aW9ucy5zbG90TWF4VGltZSxcbiAgICAgICAgICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IHJlZmluZWRPcHRpb25zLnNob3dOb25DdXJyZW50RGF0ZXMsXG4gICAgICAgICAgICBkYXlDb3VudDogcmVmaW5lZE9wdGlvbnMuZGF5Q291bnQsXG4gICAgICAgICAgICBkYXRlQWxpZ25tZW50OiByZWZpbmVkT3B0aW9ucy5kYXRlQWxpZ25tZW50LFxuICAgICAgICAgICAgZGF0ZUluY3JlbWVudDogcmVmaW5lZE9wdGlvbnMuZGF0ZUluY3JlbWVudCxcbiAgICAgICAgICAgIGhpZGRlbkRheXM6IHJlZmluZWRPcHRpb25zLmhpZGRlbkRheXMsXG4gICAgICAgICAgICB3ZWVrZW5kczogcmVmaW5lZE9wdGlvbnMud2Vla2VuZHMsXG4gICAgICAgICAgICBub3dJbnB1dDogcmVmaW5lZE9wdGlvbnMubm93LFxuICAgICAgICAgICAgdmFsaWRSYW5nZUlucHV0OiByZWZpbmVkT3B0aW9ucy52YWxpZFJhbmdlLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlSW5wdXQ6IHJlZmluZWRPcHRpb25zLnZpc2libGVSYW5nZSxcbiAgICAgICAgICAgIGZpeGVkV2Vla0NvdW50OiByZWZpbmVkT3B0aW9ucy5maXhlZFdlZWtDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCB2aWV3QXBpID0gdGhpcy5idWlsZFZpZXdBcGkodmlld1R5cGUsIHRoaXMuZ2V0Q3VycmVudERhdGEsIG9wdGlvbnNEYXRhLmRhdGVFbnYpO1xuICAgICAgICByZXR1cm4geyB2aWV3U3BlYywgb3B0aW9uczogcmVmaW5lZE9wdGlvbnMsIGRhdGVQcm9maWxlR2VuZXJhdG9yLCB2aWV3QXBpIH07XG4gICAgfVxuICAgIHByb2Nlc3NSYXdWaWV3T3B0aW9ucyh2aWV3U3BlYywgcGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpIHtcbiAgICAgICAgbGV0IHJhdyA9IGludGVybmFsQ29tbW9uLm1lcmdlUmF3T3B0aW9ucyhbXG4gICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUyxcbiAgICAgICAgICAgIHZpZXdTcGVjLm9wdGlvbkRlZmF1bHRzLFxuICAgICAgICAgICAgbG9jYWxlRGVmYXVsdHMsXG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICB2aWV3U3BlYy5vcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICBdKTtcbiAgICAgICAgbGV0IHJlZmluZXJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX1JFRklORVJTKSwgaW50ZXJuYWxDb21tb24uQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMpLCBpbnRlcm5hbENvbW1vbi5DQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMpLCBpbnRlcm5hbENvbW1vbi5WSUVXX09QVElPTl9SRUZJTkVSUyksIHBsdWdpbkhvb2tzLmxpc3RlbmVyUmVmaW5lcnMpLCBwbHVnaW5Ib29rcy5vcHRpb25SZWZpbmVycyk7XG4gICAgICAgIGxldCByZWZpbmVkID0ge307XG4gICAgICAgIGxldCBjdXJyZW50UmF3ID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dDtcbiAgICAgICAgbGV0IGN1cnJlbnRSZWZpbmVkID0gdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkO1xuICAgICAgICBsZXQgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICBsZXQgZXh0cmEgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgb3B0aW9uTmFtZSBpbiByYXcpIHtcbiAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAoaW50ZXJuYWxDb21tb24uQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdLCBjdXJyZW50UmF3W29wdGlvbk5hbWVdKSkpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gY3VycmVudFJlZmluZWRbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmF3W29wdGlvbk5hbWVdID09PSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dFtvcHRpb25OYW1lXSB8fFxuICAgICAgICAgICAgICAgICAgICAoaW50ZXJuYWxDb21tb24uQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsQ29tbW9uLkNPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdKHJhd1tvcHRpb25OYW1lXSwgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXRbb3B0aW9uTmFtZV0pKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uTmFtZSBpbiB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkKSB7IC8vIG1pZ2h0IGJlIGFuIFwiZXh0cmFcIiBwcm9wXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZFtvcHRpb25OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gcmVmaW5lcnNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhW29wdGlvbk5hbWVdID0gcmF3W29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhbnlDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55Q2hhbmdlcykge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHJlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhd09wdGlvbnM6IHRoaXMuY3VycmVudFZpZXdPcHRpb25zSW5wdXQsXG4gICAgICAgICAgICByZWZpbmVkT3B0aW9uczogdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkLFxuICAgICAgICAgICAgZXh0cmEsXG4gICAgICAgIH07XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGREYXRlRW52JDEodGltZVpvbmUsIGV4cGxpY2l0TG9jYWxlLCB3ZWVrTnVtYmVyQ2FsY3VsYXRpb24sIGZpcnN0RGF5LCB3ZWVrVGV4dCwgcGx1Z2luSG9va3MsIGF2YWlsYWJsZUxvY2FsZURhdGEsIGRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICBsZXQgbG9jYWxlID0gYnVpbGRMb2NhbGUoZXhwbGljaXRMb2NhbGUgfHwgYXZhaWxhYmxlTG9jYWxlRGF0YS5kZWZhdWx0Q29kZSwgYXZhaWxhYmxlTG9jYWxlRGF0YS5tYXApO1xuICAgIHJldHVybiBuZXcgaW50ZXJuYWxDb21tb24uRGF0ZUVudih7XG4gICAgICAgIGNhbGVuZGFyU3lzdGVtOiAnZ3JlZ29yeScsXG4gICAgICAgIHRpbWVab25lLFxuICAgICAgICBuYW1lZFRpbWVab25lSW1wbDogcGx1Z2luSG9va3MubmFtZWRUaW1lWm9uZWRJbXBsLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIHdlZWtOdW1iZXJDYWxjdWxhdGlvbixcbiAgICAgICAgZmlyc3REYXksXG4gICAgICAgIHdlZWtUZXh0LFxuICAgICAgICBjbWRGb3JtYXR0ZXI6IHBsdWdpbkhvb2tzLmNtZEZvcm1hdHRlcixcbiAgICAgICAgZGVmYXVsdFNlcGFyYXRvcixcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVGhlbWUob3B0aW9ucywgcGx1Z2luSG9va3MpIHtcbiAgICBsZXQgVGhlbWVDbGFzcyA9IHBsdWdpbkhvb2tzLnRoZW1lQ2xhc3Nlc1tvcHRpb25zLnRoZW1lU3lzdGVtXSB8fCBTdGFuZGFyZFRoZW1lO1xuICAgIHJldHVybiBuZXcgVGhlbWVDbGFzcyhvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVByb2ZpbGVHZW5lcmF0b3IocHJvcHMpIHtcbiAgICBsZXQgRGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyA9IHByb3BzLmRhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MgfHwgaW50ZXJuYWxDb21tb24uRGF0ZVByb2ZpbGVHZW5lcmF0b3I7XG4gICAgcmV0dXJuIG5ldyBEYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzKHByb3BzKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmlld0FwaSh0eXBlLCBnZXRDdXJyZW50RGF0YSwgZGF0ZUVudikge1xuICAgIHJldHVybiBuZXcgVmlld0ltcGwodHlwZSwgZ2V0Q3VycmVudERhdGEsIGRhdGVFbnYpO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFVpQnlTb3VyY2UoZXZlbnRTb3VyY2VzKSB7XG4gICAgcmV0dXJuIGludGVybmFsQ29tbW9uLm1hcEhhc2goZXZlbnRTb3VyY2VzLCAoZXZlbnRTb3VyY2UpID0+IGV2ZW50U291cmNlLnVpKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRVaUJhc2VzKGV2ZW50RGVmcywgZXZlbnRVaVNpbmdsZUJhc2UsIGV2ZW50VWlCeVNvdXJjZSkge1xuICAgIGxldCBldmVudFVpQmFzZXMgPSB7ICcnOiBldmVudFVpU2luZ2xlQmFzZSB9O1xuICAgIGZvciAobGV0IGRlZklkIGluIGV2ZW50RGVmcykge1xuICAgICAgICBsZXQgZGVmID0gZXZlbnREZWZzW2RlZklkXTtcbiAgICAgICAgaWYgKGRlZi5zb3VyY2VJZCAmJiBldmVudFVpQnlTb3VyY2VbZGVmLnNvdXJjZUlkXSkge1xuICAgICAgICAgICAgZXZlbnRVaUJhc2VzW2RlZklkXSA9IGV2ZW50VWlCeVNvdXJjZVtkZWYuc291cmNlSWRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudFVpQmFzZXM7XG59XG5mdW5jdGlvbiBidWlsZFZpZXdVaVByb3BzKGNhbGVuZGFyQ29udGV4dCkge1xuICAgIGxldCB7IG9wdGlvbnMgfSA9IGNhbGVuZGFyQ29udGV4dDtcbiAgICByZXR1cm4ge1xuICAgICAgICBldmVudFVpU2luZ2xlQmFzZTogaW50ZXJuYWxDb21tb24uY3JlYXRlRXZlbnRVaSh7XG4gICAgICAgICAgICBkaXNwbGF5OiBvcHRpb25zLmV2ZW50RGlzcGxheSxcbiAgICAgICAgICAgIGVkaXRhYmxlOiBvcHRpb25zLmVkaXRhYmxlLFxuICAgICAgICAgICAgc3RhcnRFZGl0YWJsZTogb3B0aW9ucy5ldmVudFN0YXJ0RWRpdGFibGUsXG4gICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiBvcHRpb25zLmV2ZW50RHVyYXRpb25FZGl0YWJsZSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IG9wdGlvbnMuZXZlbnRDb25zdHJhaW50LFxuICAgICAgICAgICAgb3ZlcmxhcDogdHlwZW9mIG9wdGlvbnMuZXZlbnRPdmVybGFwID09PSAnYm9vbGVhbicgPyBvcHRpb25zLmV2ZW50T3ZlcmxhcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFsbG93OiBvcHRpb25zLmV2ZW50QWxsb3csXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IG9wdGlvbnMuZXZlbnRCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogb3B0aW9ucy5ldmVudEJvcmRlckNvbG9yLFxuICAgICAgICAgICAgdGV4dENvbG9yOiBvcHRpb25zLmV2ZW50VGV4dENvbG9yLFxuICAgICAgICAgICAgY29sb3I6IG9wdGlvbnMuZXZlbnRDb2xvcixcbiAgICAgICAgICAgIC8vIGNsYXNzTmFtZXM6IG9wdGlvbnMuZXZlbnRDbGFzc05hbWVzIC8vIHJlbmRlciBob29rIHdpbGwgaGFuZGxlIHRoaXNcbiAgICAgICAgfSwgY2FsZW5kYXJDb250ZXh0KSxcbiAgICAgICAgc2VsZWN0aW9uQ29uZmlnOiBpbnRlcm5hbENvbW1vbi5jcmVhdGVFdmVudFVpKHtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IG9wdGlvbnMuc2VsZWN0Q29uc3RyYWludCxcbiAgICAgICAgICAgIG92ZXJsYXA6IHR5cGVvZiBvcHRpb25zLnNlbGVjdE92ZXJsYXAgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuc2VsZWN0T3ZlcmxhcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFsbG93OiBvcHRpb25zLnNlbGVjdEFsbG93LFxuICAgICAgICB9LCBjYWxlbmRhckNvbnRleHQpLFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSXNMb2FkaW5nKHN0YXRlLCBjb250ZXh0KSB7XG4gICAgZm9yIChsZXQgaXNMb2FkaW5nRnVuYyBvZiBjb250ZXh0LnBsdWdpbkhvb2tzLmlzTG9hZGluZ0Z1bmNzKSB7XG4gICAgICAgIGlmIChpc0xvYWRpbmdGdW5jKHN0YXRlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gcGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyhjYWxlbmRhckNvbnRleHQpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24ucGFyc2VCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dC5vcHRpb25zLmJ1c2luZXNzSG91cnMsIGNhbGVuZGFyQ29udGV4dCk7XG59XG5mdW5jdGlvbiB3YXJuVW5rbm93bk9wdGlvbnMob3B0aW9ucywgdmlld05hbWUpIHtcbiAgICBmb3IgKGxldCBvcHRpb25OYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBVbmtub3duIG9wdGlvbiAnJHtvcHRpb25OYW1lfSdgICtcbiAgICAgICAgICAgICh2aWV3TmFtZSA/IGAgZm9yIHZpZXcgJyR7dmlld05hbWV9J2AgOiAnJykpO1xuICAgIH1cbn1cblxuY2xhc3MgVG9vbGJhclNlY3Rpb24gZXh0ZW5kcyBpbnRlcm5hbENvbW1vbi5CYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMucHJvcHMud2lkZ2V0R3JvdXBzLm1hcCgod2lkZ2V0R3JvdXApID0+IHRoaXMucmVuZGVyV2lkZ2V0R3JvdXAod2lkZ2V0R3JvdXApKTtcbiAgICAgICAgcmV0dXJuIHByZWFjdC5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ2ZjLXRvb2xiYXItY2h1bmsnIH0sIC4uLmNoaWxkcmVuKTtcbiAgICB9XG4gICAgcmVuZGVyV2lkZ2V0R3JvdXAod2lkZ2V0R3JvdXApIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHRoZW1lIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IFtdO1xuICAgICAgICBsZXQgaXNPbmx5QnV0dG9ucyA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHdpZGdldCBvZiB3aWRnZXRHcm91cCkge1xuICAgICAgICAgICAgbGV0IHsgYnV0dG9uTmFtZSwgYnV0dG9uQ2xpY2ssIGJ1dHRvblRleHQsIGJ1dHRvbkljb24sIGJ1dHRvbkhpbnQgfSA9IHdpZGdldDtcbiAgICAgICAgICAgIGlmIChidXR0b25OYW1lID09PSAndGl0bGUnKSB7XG4gICAgICAgICAgICAgICAgaXNPbmx5QnV0dG9ucyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7IGNsYXNzTmFtZTogXCJmYy10b29sYmFyLXRpdGxlXCIsIGlkOiBwcm9wcy50aXRsZUlkIH0sIHByb3BzLnRpdGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgaXNQcmVzc2VkID0gYnV0dG9uTmFtZSA9PT0gcHJvcHMuYWN0aXZlQnV0dG9uO1xuICAgICAgICAgICAgICAgIGxldCBpc0Rpc2FibGVkID0gKCFwcm9wcy5pc1RvZGF5RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAndG9kYXknKSB8fFxuICAgICAgICAgICAgICAgICAgICAoIXByb3BzLmlzUHJldkVuYWJsZWQgJiYgYnV0dG9uTmFtZSA9PT0gJ3ByZXYnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoIXByb3BzLmlzTmV4dEVuYWJsZWQgJiYgYnV0dG9uTmFtZSA9PT0gJ25leHQnKTtcbiAgICAgICAgICAgICAgICBsZXQgYnV0dG9uQ2xhc3NlcyA9IFtgZmMtJHtidXR0b25OYW1lfS1idXR0b25gLCB0aGVtZS5nZXRDbGFzcygnYnV0dG9uJyldO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQ2xhc3Nlcy5wdXNoKHRoZW1lLmdldENsYXNzKCdidXR0b25BY3RpdmUnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2gocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyB0eXBlOiBcImJ1dHRvblwiLCB0aXRsZTogdHlwZW9mIGJ1dHRvbkhpbnQgPT09ICdmdW5jdGlvbicgPyBidXR0b25IaW50KHByb3BzLm5hdlVuaXQpIDogYnV0dG9uSGludCwgZGlzYWJsZWQ6IGlzRGlzYWJsZWQsIFwiYXJpYS1wcmVzc2VkXCI6IGlzUHJlc3NlZCwgY2xhc3NOYW1lOiBidXR0b25DbGFzc2VzLmpvaW4oJyAnKSwgb25DbGljazogYnV0dG9uQ2xpY2sgfSwgYnV0dG9uVGV4dCB8fCAoYnV0dG9uSWNvbiA/IHByZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogYnV0dG9uSWNvbiB9KSA6ICcnKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgZ3JvdXBDbGFzc05hbWUgPSAoaXNPbmx5QnV0dG9ucyAmJiB0aGVtZS5nZXRDbGFzcygnYnV0dG9uR3JvdXAnKSkgfHwgJyc7XG4gICAgICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiBncm91cENsYXNzTmFtZSB9LCAuLi5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH1cbn1cblxuY2xhc3MgVG9vbGJhciBleHRlbmRzIGludGVybmFsQ29tbW9uLkJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgbW9kZWwsIGV4dHJhQ2xhc3NOYW1lIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgZm9yY2VMdHIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0YXJ0Q29udGVudDtcbiAgICAgICAgbGV0IGVuZENvbnRlbnQ7XG4gICAgICAgIGxldCBzZWN0aW9uV2lkZ2V0cyA9IG1vZGVsLnNlY3Rpb25XaWRnZXRzO1xuICAgICAgICBsZXQgY2VudGVyQ29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmNlbnRlcjtcbiAgICAgICAgaWYgKHNlY3Rpb25XaWRnZXRzLmxlZnQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0Q29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VjdGlvbldpZGdldHMucmlnaHQpIHtcbiAgICAgICAgICAgIGZvcmNlTHRyID0gdHJ1ZTtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZENvbnRlbnQgPSBzZWN0aW9uV2lkZ2V0cy5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICBleHRyYUNsYXNzTmFtZSB8fCAnJyxcbiAgICAgICAgICAgICdmYy10b29sYmFyJyxcbiAgICAgICAgICAgIGZvcmNlTHRyID8gJ2ZjLXRvb2xiYXItbHRyJyA6ICcnLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmpvaW4oJyAnKSB9LFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJTZWN0aW9uKCdzdGFydCcsIHN0YXJ0Q29udGVudCB8fCBbXSksXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ2NlbnRlcicsIGNlbnRlckNvbnRlbnQgfHwgW10pLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJTZWN0aW9uKCdlbmQnLCBlbmRDb250ZW50IHx8IFtdKSkpO1xuICAgIH1cbiAgICByZW5kZXJTZWN0aW9uKGtleSwgd2lkZ2V0R3JvdXBzKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xiYXJTZWN0aW9uLCB7IGtleToga2V5LCB3aWRnZXRHcm91cHM6IHdpZGdldEdyb3VwcywgdGl0bGU6IHByb3BzLnRpdGxlLCBuYXZVbml0OiBwcm9wcy5uYXZVbml0LCBhY3RpdmVCdXR0b246IHByb3BzLmFjdGl2ZUJ1dHRvbiwgaXNUb2RheUVuYWJsZWQ6IHByb3BzLmlzVG9kYXlFbmFibGVkLCBpc1ByZXZFbmFibGVkOiBwcm9wcy5pc1ByZXZFbmFibGVkLCBpc05leHRFbmFibGVkOiBwcm9wcy5pc05leHRFbmFibGVkLCB0aXRsZUlkOiBwcm9wcy50aXRsZUlkIH0pKTtcbiAgICB9XG59XG5cbmNsYXNzIFZpZXdIYXJuZXNzIGV4dGVuZHMgaW50ZXJuYWxDb21tb24uQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBhdmFpbGFibGVXaWR0aDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbCA9IChlbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uc2V0UmVmKHRoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXZhaWxhYmxlV2lkdGgoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBhc3BlY3RSYXRpbyB9ID0gcHJvcHM7XG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLXZpZXctaGFybmVzcycsXG4gICAgICAgICAgICAoYXNwZWN0UmF0aW8gfHwgcHJvcHMubGlxdWlkIHx8IHByb3BzLmhlaWdodClcbiAgICAgICAgICAgICAgICA/ICdmYy12aWV3LWhhcm5lc3MtYWN0aXZlJyAvLyBoYXJuZXNzIGNvbnRyb2xzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgICAgICA6ICdmYy12aWV3LWhhcm5lc3MtcGFzc2l2ZScsIC8vIGxldCB0aGUgdmlldyBkbyB0aGUgaGVpZ2h0XG4gICAgICAgIF07XG4gICAgICAgIGxldCBoZWlnaHQgPSAnJztcbiAgICAgICAgbGV0IHBhZGRpbmdCb3R0b20gPSAnJztcbiAgICAgICAgaWYgKGFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUuYXZhaWxhYmxlV2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBzdGF0ZS5hdmFpbGFibGVXaWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gd2hpbGUgd2FpdGluZyB0byBrbm93IGF2YWlsYWJsZVdpZHRoLCB3ZSBjYW4ndCBzZXQgaGVpZ2h0IHRvICp6ZXJvKlxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2lsbCBjYXVzZSBsb3RzIG9mIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgd2l0aGluIHNjcm9sbGdyaWQuXG4gICAgICAgICAgICAgICAgLy8gQkVUVEVSOiBkb24ndCBzdGFydCByZW5kZXJpbmcgQU5ZVEhJTkcgeWV0IHVudGlsIHdlIGtub3cgY29udGFpbmVyIHdpZHRoXG4gICAgICAgICAgICAgICAgLy8gTk9URTogd2h5IG5vdCBhbHdheXMgdXNlIHBhZGRpbmdCb3R0b20/IENhdXNlcyBoZWlnaHQgb3NjaWxsYXRpb24gKGlzc3VlIDU2MDYpXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbSA9IGAkeygxIC8gYXNwZWN0UmF0aW8pICogMTAwfSVgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGVpZ2h0ID0gcHJvcHMuaGVpZ2h0IHx8ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImFyaWEtbGFiZWxsZWRieVwiOiBwcm9wcy5sYWJlbGVkQnlJZCwgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpLCBzdHlsZTogeyBoZWlnaHQsIHBhZGRpbmdCb3R0b20gfSB9LCBwcm9wcy5jaGlsZHJlbikpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFkZFJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVSZXNpemUpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlbW92ZVJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVSZXNpemUpO1xuICAgIH1cbiAgICB1cGRhdGVBdmFpbGFibGVXaWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwgJiYgLy8gbmVlZGVkLiBidXQgd2h5P1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5hc3BlY3RSYXRpbyAvLyBhc3BlY3RSYXRpbyBpcyB0aGUgb25seSBoZWlnaHQgc2V0dGluZyB0aGF0IG5lZWRzIGF2YWlsYWJsZVdpZHRoXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGF2YWlsYWJsZVdpZHRoOiB0aGlzLmVsLm9mZnNldFdpZHRoIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKlxuRGV0ZWN0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhbiBldmVudCB3aXRoaW4gYSBEYXRlQ29tcG9uZW50XG4qL1xuY2xhc3MgRXZlbnRDbGlja2luZyBleHRlbmRzIGludGVybmFsQ29tbW9uLkludGVyYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuaGFuZGxlU2VnQ2xpY2sgPSAoZXYsIHNlZ0VsKSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICBsZXQgc2VnID0gaW50ZXJuYWxDb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgaWYgKHNlZyAmJiAvLyBtaWdodCBiZSB0aGUgPGRpdj4gc3Vycm91bmRpbmcgdGhlIG1vcmUgbGlua1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pc1ZhbGlkU2VnRG93bkVsKGV2LnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAvLyBvdXIgd2F5IHRvIHNpbXVsYXRlIGEgbGluayBjbGljayBmb3IgZWxlbWVudHMgdGhhdCBjYW4ndCBiZSA8YT4gdGFnc1xuICAgICAgICAgICAgICAgIC8vIGdyYWIgYmVmb3JlIHRyaWdnZXIgZmlyZWQgaW4gY2FzZSB0cmlnZ2VyIHRyYXNoZXMgRE9NIHRocnUgcmVyZW5kZXJpbmdcbiAgICAgICAgICAgICAgICBsZXQgaGFzVXJsQ29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uZWxlbWVudENsb3Nlc3QoZXYudGFyZ2V0LCAnLmZjLWV2ZW50LWZvcmNlZC11cmwnKTtcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gaGFzVXJsQ29udGFpbmVyID8gaGFzVXJsQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2FbaHJlZl0nKS5ocmVmIDogJyc7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2xpY2snLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiBzZWdFbCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBpbnRlcm5hbENvbW1vbi5FdmVudEltcGwoY29tcG9uZW50LmNvbnRleHQsIHNlZy5ldmVudFJhbmdlLmRlZiwgc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh1cmwgJiYgIWV2LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRlc3Ryb3kgPSBpbnRlcm5hbENvbW1vbi5saXN0ZW5CeVNlbGVjdG9yKHNldHRpbmdzLmVsLCAnY2xpY2snLCAnLmZjLWV2ZW50JywgLy8gb24gYm90aCBmZyBhbmQgYmcgZXZlbnRzXG4gICAgICAgIHRoaXMuaGFuZGxlU2VnQ2xpY2spO1xuICAgIH1cbn1cblxuLypcblRyaWdnZXJzIGV2ZW50cyBhbmQgYWRkcy9yZW1vdmVzIGNvcmUgY2xhc3NOYW1lcyB3aGVuIHRoZSB1c2VyJ3MgcG9pbnRlclxuZW50ZXJzL2xlYXZlcyBldmVudC1lbGVtZW50cyBvZiBhIGNvbXBvbmVudC5cbiovXG5jbGFzcyBFdmVudEhvdmVyaW5nIGV4dGVuZHMgaW50ZXJuYWxDb21tb24uSW50ZXJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgLy8gZm9yIHNpbXVsYXRpbmcgYW4gZXZlbnRNb3VzZUxlYXZlIHdoZW4gdGhlIGV2ZW50IGVsIGlzIGRlc3Ryb3llZCB3aGlsZSBtb3VzZSBpcyBvdmVyIGl0XG4gICAgICAgIHRoaXMuaGFuZGxlRXZlbnRFbFJlbW92ZSA9IChlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsID09PSB0aGlzLmN1cnJlbnRTZWdFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2VnTGVhdmUobnVsbCwgdGhpcy5jdXJyZW50U2VnRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ0VudGVyID0gKGV2LCBzZWdFbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGludGVybmFsQ29tbW9uLmdldEVsU2VnKHNlZ0VsKSkgeyAvLyBUT0RPOiBiZXR0ZXIgd2F5IHRvIG1ha2Ugc3VyZSBub3QgaG92ZXJpbmcgb3ZlciBtb3JlKyBsaW5rIG9yIGl0cyB3cmFwcGVyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VnRWwgPSBzZWdFbDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCgnZXZlbnRNb3VzZUVudGVyJywgZXYsIHNlZ0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdMZWF2ZSA9IChldiwgc2VnRWwpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRTZWdFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNlZ0VsID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudCgnZXZlbnRNb3VzZUxlYXZlJywgZXYsIHNlZ0VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5yZW1vdmVIb3Zlckxpc3RlbmVycyA9IGludGVybmFsQ29tbW9uLmxpc3RlblRvSG92ZXJCeVNlbGVjdG9yKHNldHRpbmdzLmVsLCAnLmZjLWV2ZW50JywgLy8gb24gYm90aCBmZyBhbmQgYmcgZXZlbnRzXG4gICAgICAgIHRoaXMuaGFuZGxlU2VnRW50ZXIsIHRoaXMuaGFuZGxlU2VnTGVhdmUpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnJlbW92ZUhvdmVyTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHRyaWdnZXJFdmVudChwdWJsaWNFdk5hbWUsIGV2LCBzZWdFbCkge1xuICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGNvbnRleHQgfSA9IGNvbXBvbmVudDtcbiAgICAgICAgbGV0IHNlZyA9IGludGVybmFsQ29tbW9uLmdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgaWYgKCFldiB8fCBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChldi50YXJnZXQpKSB7XG4gICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcihwdWJsaWNFdk5hbWUsIHtcbiAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBpbnRlcm5hbENvbW1vbi5FdmVudEltcGwoY29udGV4dCwgc2VnLmV2ZW50UmFuZ2UuZGVmLCBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAganNFdmVudDogZXYsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIENhbGVuZGFyQ29udGVudCBleHRlbmRzIGludGVybmFsQ29tbW9uLlB1cmVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmJ1aWxkVmlld0NvbnRleHQgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGludGVybmFsQ29tbW9uLmJ1aWxkVmlld0NvbnRleHQpO1xuICAgICAgICB0aGlzLmJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnMpO1xuICAgICAgICB0aGlzLmJ1aWxkVG9vbGJhclByb3BzID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZFRvb2xiYXJQcm9wcyk7XG4gICAgICAgIHRoaXMuaGVhZGVyUmVmID0gcHJlYWN0LmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLmZvb3RlclJlZiA9IHByZWFjdC5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5pbnRlcmFjdGlvbnNTdG9yZSA9IHt9O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHZpZXdMYWJlbElkOiBpbnRlcm5hbENvbW1vbi5nZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICB9O1xuICAgICAgICAvLyBDb21wb25lbnQgUmVnaXN0cmF0aW9uXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IChjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpID0+IHtcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IGludGVybmFsQ29tbW9uLnBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyhjb21wb25lbnQsIHNldHRpbmdzSW5wdXQpO1xuICAgICAgICAgICAgbGV0IERFRkFVTFRfSU5URVJBQ1RJT05TID0gW1xuICAgICAgICAgICAgICAgIEV2ZW50Q2xpY2tpbmcsXG4gICAgICAgICAgICAgICAgRXZlbnRIb3ZlcmluZyxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsZXQgaW50ZXJhY3Rpb25DbGFzc2VzID0gREVGQVVMVF9JTlRFUkFDVElPTlMuY29uY2F0KHRoaXMucHJvcHMucGx1Z2luSG9va3MuY29tcG9uZW50SW50ZXJhY3Rpb25zKTtcbiAgICAgICAgICAgIGxldCBpbnRlcmFjdGlvbnMgPSBpbnRlcmFjdGlvbkNsYXNzZXMubWFwKChUaGVJbnRlcmFjdGlvbkNsYXNzKSA9PiBuZXcgVGhlSW50ZXJhY3Rpb25DbGFzcyhzZXR0aW5ncykpO1xuICAgICAgICAgICAgdGhpcy5pbnRlcmFjdGlvbnNTdG9yZVtjb21wb25lbnQudWlkXSA9IGludGVyYWN0aW9ucztcbiAgICAgICAgICAgIGludGVybmFsQ29tbW9uLmludGVyYWN0aW9uU2V0dGluZ3NTdG9yZVtjb21wb25lbnQudWlkXSA9IHNldHRpbmdzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCA9IChjb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdO1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIGludGVybmFsQ29tbW9uLmludGVyYWN0aW9uU2V0dGluZ3NTdG9yZVtjb21wb25lbnQudWlkXTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVzaXppbmdcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy5yZXNpemVSdW5uZXIgPSBuZXcgaW50ZXJuYWxDb21tb24uRGVsYXllZFJ1bm5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmVtaXR0ZXIudHJpZ2dlcignX3Jlc2l6ZScsIHRydWUpOyAvLyBzaG91bGQgd2luZG93IHJlc2l6ZXMgYmUgY29uc2lkZXJlZCBcImZvcmNlZFwiID9cbiAgICAgICAgICAgIHRoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCd3aW5kb3dSZXNpemUnLCB7IHZpZXc6IHRoaXMucHJvcHMudmlld0FwaSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaGFuZGxlV2luZG93UmVzaXplID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGFuZGxlV2luZG93UmVzaXplICYmXG4gICAgICAgICAgICAgICAgZXYudGFyZ2V0ID09PSB3aW5kb3cgLy8gYXZvaWQganF1aSBldmVudHNcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplUnVubmVyLnJlcXVlc3Qob3B0aW9ucy53aW5kb3dSZXNpemVEZWxheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qXG4gICAgcmVuZGVycyBJTlNJREUgb2YgYW4gb3V0ZXIgZGl2XG4gICAgKi9cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyB0b29sYmFyQ29uZmlnLCBvcHRpb25zIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IHRvb2xiYXJQcm9wcyA9IHRoaXMuYnVpbGRUb29sYmFyUHJvcHMocHJvcHMudmlld1NwZWMsIHByb3BzLmRhdGVQcm9maWxlLCBwcm9wcy5kYXRlUHJvZmlsZUdlbmVyYXRvciwgcHJvcHMuY3VycmVudERhdGUsIGludGVybmFsQ29tbW9uLmdldE5vdyhwcm9wcy5vcHRpb25zLm5vdywgcHJvcHMuZGF0ZUVudiksIC8vIFRPRE86IHVzZSBOb3dUaW1lcj8/Pz9cbiAgICAgICAgcHJvcHMudmlld1RpdGxlKTtcbiAgICAgICAgbGV0IHZpZXdWR3JvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgdmlld0hlaWdodCA9ICcnO1xuICAgICAgICBsZXQgdmlld0FzcGVjdFJhdGlvO1xuICAgICAgICBpZiAocHJvcHMuaXNIZWlnaHRBdXRvIHx8IHByb3BzLmZvclByaW50KSB7XG4gICAgICAgICAgICB2aWV3SGVpZ2h0ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5oZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmlld1ZHcm93ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmNvbnRlbnRIZWlnaHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmlld0hlaWdodCA9IG9wdGlvbnMuY29udGVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZpZXdBc3BlY3RSYXRpbyA9IE1hdGgubWF4KG9wdGlvbnMuYXNwZWN0UmF0aW8sIDAuNSk7IC8vIHByZXZlbnQgZnJvbSBnZXR0aW5nIHRvbyB0YWxsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZpZXdDb250ZXh0ID0gdGhpcy5idWlsZFZpZXdDb250ZXh0KHByb3BzLnZpZXdTcGVjLCBwcm9wcy52aWV3QXBpLCBwcm9wcy5vcHRpb25zLCBwcm9wcy5kYXRlUHJvZmlsZUdlbmVyYXRvciwgcHJvcHMuZGF0ZUVudiwgcHJvcHMudGhlbWUsIHByb3BzLnBsdWdpbkhvb2tzLCBwcm9wcy5kaXNwYXRjaCwgcHJvcHMuZ2V0Q3VycmVudERhdGEsIHByb3BzLmVtaXR0ZXIsIHByb3BzLmNhbGVuZGFyQXBpLCB0aGlzLnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsIHRoaXMudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KTtcbiAgICAgICAgbGV0IHZpZXdMYWJlbElkID0gKHRvb2xiYXJDb25maWcuaGVhZGVyICYmIHRvb2xiYXJDb25maWcuaGVhZGVyLmhhc1RpdGxlKVxuICAgICAgICAgICAgPyB0aGlzLnN0YXRlLnZpZXdMYWJlbElkXG4gICAgICAgICAgICA6ICcnO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KGludGVybmFsQ29tbW9uLlZpZXdDb250ZXh0VHlwZS5Qcm92aWRlciwgeyB2YWx1ZTogdmlld0NvbnRleHQgfSxcbiAgICAgICAgICAgIHRvb2xiYXJDb25maWcuaGVhZGVyICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChUb29sYmFyLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0aGlzLmhlYWRlclJlZiwgZXh0cmFDbGFzc05hbWU6IFwiZmMtaGVhZGVyLXRvb2xiYXJcIiwgbW9kZWw6IHRvb2xiYXJDb25maWcuaGVhZGVyLCB0aXRsZUlkOiB2aWV3TGFiZWxJZCB9LCB0b29sYmFyUHJvcHMpKSksXG4gICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChWaWV3SGFybmVzcywgeyBsaXF1aWQ6IHZpZXdWR3JvdywgaGVpZ2h0OiB2aWV3SGVpZ2h0LCBhc3BlY3RSYXRpbzogdmlld0FzcGVjdFJhdGlvLCBsYWJlbGVkQnlJZDogdmlld0xhYmVsSWQgfSxcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclZpZXcocHJvcHMpLFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRBcHBlbmRDb250ZW50KCkpLFxuICAgICAgICAgICAgdG9vbGJhckNvbmZpZy5mb290ZXIgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRoaXMuZm9vdGVyUmVmLCBleHRyYUNsYXNzTmFtZTogXCJmYy1mb290ZXItdG9vbGJhclwiLCBtb2RlbDogdG9vbGJhckNvbmZpZy5mb290ZXIsIHRpdGxlSWQ6IFwiXCIgfSwgdG9vbGJhclByb3BzKSkpKSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgdGhpcy5jYWxlbmRhckludGVyYWN0aW9ucyA9IHByb3BzLnBsdWdpbkhvb2tzLmNhbGVuZGFySW50ZXJhY3Rpb25zXG4gICAgICAgICAgICAubWFwKChDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MpID0+IG5ldyBDYWxlbmRhckludGVyYWN0aW9uQ2xhc3MocHJvcHMpKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgbGV0IHsgcHJvcFNldEhhbmRsZXJzIH0gPSBwcm9wcy5wbHVnaW5Ib29rcztcbiAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBwcm9wU2V0SGFuZGxlcnNbcHJvcE5hbWVdKHByb3BzW3Byb3BOYW1lXSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHByb3BTZXRIYW5kbGVycyB9ID0gcHJvcHMucGx1Z2luSG9va3M7XG4gICAgICAgIGZvciAobGV0IHByb3BOYW1lIGluIHByb3BTZXRIYW5kbGVycykge1xuICAgICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSAhPT0gcHJldlByb3BzW3Byb3BOYW1lXSkge1xuICAgICAgICAgICAgICAgIHByb3BTZXRIYW5kbGVyc1twcm9wTmFtZV0ocHJvcHNbcHJvcE5hbWVdLCBwcm9wcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhhbmRsZVdpbmRvd1Jlc2l6ZSk7XG4gICAgICAgIHRoaXMucmVzaXplUnVubmVyLmNsZWFyKCk7XG4gICAgICAgIGZvciAobGV0IGludGVyYWN0aW9uIG9mIHRoaXMuY2FsZW5kYXJJbnRlcmFjdGlvbnMpIHtcbiAgICAgICAgICAgIGludGVyYWN0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BzLmVtaXR0ZXIudHJpZ2dlcignX3VubW91bnQnKTtcbiAgICB9XG4gICAgYnVpbGRBcHBlbmRDb250ZW50KCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gcHJvcHMucGx1Z2luSG9va3Mudmlld0NvbnRhaW5lckFwcGVuZHMubWFwKChidWlsZEFwcGVuZENvbnRlbnQpID0+IGJ1aWxkQXBwZW5kQ29udGVudChwcm9wcykpO1xuICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQocHJlYWN0LkZyYWdtZW50LCB7fSwgLi4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZW5kZXJWaWV3KHByb3BzKSB7XG4gICAgICAgIGxldCB7IHBsdWdpbkhvb2tzIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IHsgdmlld1NwZWMgfSA9IHByb3BzO1xuICAgICAgICBsZXQgdmlld1Byb3BzID0ge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgYnVzaW5lc3NIb3VyczogcHJvcHMuYnVzaW5lc3NIb3VycyxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IHByb3BzLnJlbmRlcmFibGVFdmVudFN0b3JlLFxuICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiBwcm9wcy5ldmVudFVpQmFzZXMsXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBwcm9wcy5kYXRlU2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLFxuICAgICAgICAgICAgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsXG4gICAgICAgICAgICBldmVudFJlc2l6ZTogcHJvcHMuZXZlbnRSZXNpemUsXG4gICAgICAgICAgICBpc0hlaWdodEF1dG86IHByb3BzLmlzSGVpZ2h0QXV0byxcbiAgICAgICAgICAgIGZvclByaW50OiBwcm9wcy5mb3JQcmludCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVycyA9IHRoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyhwbHVnaW5Ib29rcy52aWV3UHJvcHNUcmFuc2Zvcm1lcnMpO1xuICAgICAgICBmb3IgKGxldCB0cmFuc2Zvcm1lciBvZiB0cmFuc2Zvcm1lcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odmlld1Byb3BzLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm0odmlld1Byb3BzLCBwcm9wcykpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBWaWV3Q29tcG9uZW50ID0gdmlld1NwZWMuY29tcG9uZW50O1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFZpZXdDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHZpZXdQcm9wcykpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZFRvb2xiYXJQcm9wcyh2aWV3U3BlYywgZGF0ZVByb2ZpbGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yLCBjdXJyZW50RGF0ZSwgbm93LCB0aXRsZSkge1xuICAgIC8vIGRvbid0IGZvcmNlIGFueSBkYXRlLXByb2ZpbGVzIHRvIHZhbGlkIGRhdGUgcHJvZmlsZXMgKHRoZSBgZmFsc2VgKSBzbyB0aGF0IHdlIGNhbiB0ZWxsIGlmIGl0J3MgaW52YWxpZFxuICAgIGxldCB0b2RheUluZm8gPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZChub3csIHVuZGVmaW5lZCwgZmFsc2UpOyAvLyBUT0RPOiBuZWVkIGB1bmRlZmluZWRgIG9yIGVsc2UgSU5GSU5JVEUgTE9PUCBmb3Igc29tZSByZWFzb25cbiAgICBsZXQgcHJldkluZm8gPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZFByZXYoZGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmYWxzZSk7XG4gICAgbGV0IG5leHRJbmZvID0gZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGROZXh0KGRhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSwgZmFsc2UpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBhY3RpdmVCdXR0b246IHZpZXdTcGVjLnR5cGUsXG4gICAgICAgIG5hdlVuaXQ6IHZpZXdTcGVjLnNpbmdsZVVuaXQsXG4gICAgICAgIGlzVG9kYXlFbmFibGVkOiB0b2RheUluZm8uaXNWYWxpZCAmJiAhaW50ZXJuYWxDb21tb24ucmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIG5vdyksXG4gICAgICAgIGlzUHJldkVuYWJsZWQ6IHByZXZJbmZvLmlzVmFsaWQsXG4gICAgICAgIGlzTmV4dEVuYWJsZWQ6IG5leHRJbmZvLmlzVmFsaWQsXG4gICAgfTtcbn1cbi8vIFBsdWdpblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnModGhlQ2xhc3Nlcykge1xuICAgIHJldHVybiB0aGVDbGFzc2VzLm1hcCgoVGhlQ2xhc3MpID0+IG5ldyBUaGVDbGFzcygpKTtcbn1cblxuY2xhc3MgQ2FsZW5kYXIgZXh0ZW5kcyBpbnRlcm5hbENvbW1vbi5DYWxlbmRhckltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVsLCBvcHRpb25PdmVycmlkZXMgPSB7fSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNSZW5kZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmN1cnJlbnRDbGFzc05hbWVzID0gW107XG4gICAgICAgIHRoaXMuY3VzdG9tQ29udGVudFJlbmRlcklkID0gMDtcbiAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb24gPSAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBhY3Rpb25zIHdlIGtub3cgd2Ugd2FudCB0byByZW5kZXIgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdTRVRfRVZFTlRfRFJBRyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnU0VUX0VWRU5UX1JFU0laRSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnRyeURyYWluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRGF0YSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlcXVlc3QoZGF0YS5jYWxlbmRhck9wdGlvbnMucmVyZW5kZXJEZWxheSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuZGVyUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgeyBjdXJyZW50RGF0YSB9ID0gdGhpcztcbiAgICAgICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5mbHVzaFN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcmVhY3QucmVuZGVyKHByZWFjdC5jcmVhdGVFbGVtZW50KGludGVybmFsQ29tbW9uLkNhbGVuZGFyUm9vdCwgeyBvcHRpb25zOiBjdXJyZW50RGF0YS5jYWxlbmRhck9wdGlvbnMsIHRoZW1lOiBjdXJyZW50RGF0YS50aGVtZSwgZW1pdHRlcjogY3VycmVudERhdGEuZW1pdHRlciB9LCAoY2xhc3NOYW1lcywgaGVpZ2h0LCBpc0hlaWdodEF1dG8sIGZvclByaW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENsYXNzTmFtZXMoY2xhc3NOYW1lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodChoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChpbnRlcm5hbENvbW1vbi5SZW5kZXJJZC5Qcm92aWRlciwgeyB2YWx1ZTogdGhpcy5jdXN0b21Db250ZW50UmVuZGVySWQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChDYWxlbmRhckNvbnRlbnQsIE9iamVjdC5hc3NpZ24oeyBpc0hlaWdodEF1dG86IGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQ6IGZvclByaW50IH0sIGN1cnJlbnREYXRhKSkpKTtcbiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuZWwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcHJlYWN0LnJlbmRlcihudWxsLCB0aGlzLmVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENsYXNzTmFtZXMoW10pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KCcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaW50ZXJuYWxDb21tb24uZW5zdXJlRWxIYXNTdHlsZXMoZWwpO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyID0gbmV3IGludGVybmFsQ29tbW9uLkRlbGF5ZWRSdW5uZXIodGhpcy5oYW5kbGVSZW5kZXJSZXF1ZXN0KTtcbiAgICAgICAgbmV3IENhbGVuZGFyRGF0YU1hbmFnZXIoe1xuICAgICAgICAgICAgb3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHRoaXMsXG4gICAgICAgICAgICBvbkFjdGlvbjogdGhpcy5oYW5kbGVBY3Rpb24sXG4gICAgICAgICAgICBvbkRhdGE6IHRoaXMuaGFuZGxlRGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHdhc1JlbmRlcmluZyA9IHRoaXMuaXNSZW5kZXJpbmc7XG4gICAgICAgIGlmICghd2FzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzUmVuZGVyaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tQ29udGVudFJlbmRlcklkICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVxdWVzdCgpO1xuICAgICAgICBpZiAod2FzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5pc1JlbmRlcmluZykge1xuICAgICAgICAgICAgdGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVxdWVzdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZVNpemUoKSB7XG4gICAgICAgIGludGVybmFsQ29tbW9uLmZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci51cGRhdGVTaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBiYXRjaFJlbmRlcmluZyhmdW5jKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnBhdXNlKCdiYXRjaFJlbmRlcmluZycpO1xuICAgICAgICBmdW5jKCk7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlc3VtZSgnYmF0Y2hSZW5kZXJpbmcnKTtcbiAgICB9XG4gICAgcGF1c2VSZW5kZXJpbmcoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnBhdXNlKCdwYXVzZVJlbmRlcmluZycpO1xuICAgIH1cbiAgICByZXN1bWVSZW5kZXJpbmcoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyUnVubmVyLnJlc3VtZSgncGF1c2VSZW5kZXJpbmcnLCB0cnVlKTtcbiAgICB9XG4gICAgcmVzZXRPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgY2hhbmdlZE9wdGlvbk5hbWVzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFNYW5hZ2VyLnJlc2V0T3B0aW9ucyhvcHRpb25PdmVycmlkZXMsIGNoYW5nZWRPcHRpb25OYW1lcyk7XG4gICAgfVxuICAgIHNldENsYXNzTmFtZXMoY2xhc3NOYW1lcykge1xuICAgICAgICBpZiAoIWludGVybmFsQ29tbW9uLmlzQXJyYXlzRXF1YWwoY2xhc3NOYW1lcywgdGhpcy5jdXJyZW50Q2xhc3NOYW1lcykpIHtcbiAgICAgICAgICAgIGxldCB7IGNsYXNzTGlzdCB9ID0gdGhpcy5lbDtcbiAgICAgICAgICAgIGZvciAobGV0IGNsYXNzTmFtZSBvZiB0aGlzLmN1cnJlbnRDbGFzc05hbWVzKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgY2xhc3NOYW1lIG9mIGNsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDbGFzc05hbWVzID0gY2xhc3NOYW1lcztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRIZWlnaHQoaGVpZ2h0KSB7XG4gICAgICAgIGludGVybmFsQ29tbW9uLmFwcGx5U3R5bGVQcm9wKHRoaXMuZWwsICdoZWlnaHQnLCBoZWlnaHQpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlSW5wdXQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRlRW52ID0gYnVpbGREYXRlRW52KG9wdGlvbnMpO1xuICAgIGxldCBmb3JtYXR0ZXIgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVGb3JtYXR0ZXIob3B0aW9ucyk7XG4gICAgbGV0IGRhdGVNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGRhdGVJbnB1dCk7XG4gICAgaWYgKCFkYXRlTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChkYXRlTWV0YS5tYXJrZXIsIGZvcm1hdHRlciwge1xuICAgICAgICBmb3JjZWRUem86IGRhdGVNZXRhLmZvcmNlZFR6byxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFJhbmdlKHN0YXJ0SW5wdXQsIGVuZElucHV0LCBvcHRpb25zKSB7XG4gICAgbGV0IGRhdGVFbnYgPSBidWlsZERhdGVFbnYodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgPyBvcHRpb25zIDoge30pOyAvLyBwYXNzIGluIGlmIG5vbi1udWxsIG9iamVjdFxuICAgIGxldCBmb3JtYXR0ZXIgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVGb3JtYXR0ZXIob3B0aW9ucyk7XG4gICAgbGV0IHN0YXJ0TWV0YSA9IGRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShzdGFydElucHV0KTtcbiAgICBsZXQgZW5kTWV0YSA9IGRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShlbmRJbnB1dCk7XG4gICAgaWYgKCFzdGFydE1ldGEgfHwgIWVuZE1ldGEpIHsgLy8gVE9ETzogd2FybmluZz9cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZUVudi5mb3JtYXRSYW5nZShzdGFydE1ldGEubWFya2VyLCBlbmRNZXRhLm1hcmtlciwgZm9ybWF0dGVyLCB7XG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE1ldGEuZm9yY2VkVHpvLFxuICAgICAgICBmb3JjZWRFbmRUem86IGVuZE1ldGEuZm9yY2VkVHpvLFxuICAgICAgICBpc0VuZEV4Y2x1c2l2ZTogb3B0aW9ucy5pc0VuZEV4Y2x1c2l2ZSxcbiAgICAgICAgZGVmYXVsdFNlcGFyYXRvcjogaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFMuZGVmYXVsdFJhbmdlU2VwYXJhdG9yLFxuICAgIH0pO1xufVxuLy8gVE9ETzogbW9yZSBEUlkgYW5kIG9wdGltaXplZFxuZnVuY3Rpb24gYnVpbGREYXRlRW52KHNldHRpbmdzKSB7XG4gICAgbGV0IGxvY2FsZSA9IGJ1aWxkTG9jYWxlKHNldHRpbmdzLmxvY2FsZSB8fCAnZW4nLCBvcmdhbml6ZVJhd0xvY2FsZXMoW10pLm1hcCk7IC8vIFRPRE86IGRvbid0IGhhcmRjb2RlICdlbicgZXZlcnl3aGVyZVxuICAgIHJldHVybiBuZXcgaW50ZXJuYWxDb21tb24uRGF0ZUVudihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyB0aW1lWm9uZTogaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFMudGltZVpvbmUsIGNhbGVuZGFyU3lzdGVtOiAnZ3JlZ29yeScgfSwgc2V0dGluZ3MpLCB7IGxvY2FsZSB9KSk7XG59XG5cbi8vIEhFTFBFUlNcbi8qXG5pZiBuZXh0RGF5VGhyZXNob2xkIGlzIHNwZWNpZmllZCwgc2xpY2luZyBpcyBkb25lIGluIGFuIGFsbC1kYXkgZmFzaGlvbi5cbnlvdSBjYW4gZ2V0IG5leHREYXlUaHJlc2hvbGQgZnJvbSBjb250ZXh0Lm5leHREYXlUaHJlc2hvbGRcbiovXG5mdW5jdGlvbiBzbGljZUV2ZW50cyhwcm9wcywgYWxsRGF5KSB7XG4gICAgcmV0dXJuIGludGVybmFsQ29tbW9uLnNsaWNlRXZlbnRTdG9yZShwcm9wcy5ldmVudFN0b3JlLCBwcm9wcy5ldmVudFVpQmFzZXMsIHByb3BzLmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBhbGxEYXkgPyBwcm9wcy5uZXh0RGF5VGhyZXNob2xkIDogbnVsbCkuZmc7XG59XG5cbmNvbnN0IHZlcnNpb24gPSAnNi4xLjgnO1xuXG5leHBvcnRzLkpzb25SZXF1ZXN0RXJyb3IgPSBpbnRlcm5hbENvbW1vbi5Kc29uUmVxdWVzdEVycm9yO1xuZXhwb3J0cy5DYWxlbmRhciA9IENhbGVuZGFyO1xuZXhwb3J0cy5jcmVhdGVQbHVnaW4gPSBjcmVhdGVQbHVnaW47XG5leHBvcnRzLmZvcm1hdERhdGUgPSBmb3JtYXREYXRlO1xuZXhwb3J0cy5mb3JtYXRSYW5nZSA9IGZvcm1hdFJhbmdlO1xuZXhwb3J0cy5nbG9iYWxMb2NhbGVzID0gZ2xvYmFsTG9jYWxlcztcbmV4cG9ydHMuZ2xvYmFsUGx1Z2lucyA9IGdsb2JhbFBsdWdpbnM7XG5leHBvcnRzLnNsaWNlRXZlbnRzID0gc2xpY2VFdmVudHM7XG5leHBvcnRzLnZlcnNpb24gPSB2ZXJzaW9uO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJlYWN0ID0gcmVxdWlyZSgncHJlYWN0Jyk7XG52YXIgY29tcGF0ID0gcmVxdWlyZSgncHJlYWN0L2NvbXBhdCcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcE5hbWVzcGFjZShlKSB7XG4gICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSByZXR1cm4gZTtcbiAgICB2YXIgbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgaWYgKGUpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICAgICAgaWYgKGsgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgIHZhciBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBrKTtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgaywgZC5nZXQgPyBkIDoge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVba107IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5bXCJkZWZhdWx0XCJdID0gZTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuKTtcbn1cblxudmFyIHByZWFjdF9fbmFtZXNwYWNlID0gLyojX19QVVJFX18qL19pbnRlcm9wTmFtZXNwYWNlKHByZWFjdCk7XG5cbmNvbnN0IHN0eWxlVGV4dHMgPSBbXTtcbmNvbnN0IHN0eWxlRWxzID0gbmV3IE1hcCgpO1xuZnVuY3Rpb24gaW5qZWN0U3R5bGVzKHN0eWxlVGV4dCkge1xuICAgIHN0eWxlVGV4dHMucHVzaChzdHlsZVRleHQpO1xuICAgIHN0eWxlRWxzLmZvckVhY2goKHN0eWxlRWwpID0+IHtcbiAgICAgICAgYXBwZW5kU3R5bGVzVG8oc3R5bGVFbCwgc3R5bGVUZXh0KTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVuc3VyZUVsSGFzU3R5bGVzKGVsKSB7XG4gICAgaWYgKGVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIHJlZ2lzdGVyU3R5bGVzUm9vdChlbC5nZXRSb290Tm9kZSgpKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWdpc3RlclN0eWxlc1Jvb3Qocm9vdE5vZGUpIHtcbiAgICBsZXQgc3R5bGVFbCA9IHN0eWxlRWxzLmdldChyb290Tm9kZSk7XG4gICAgaWYgKCFzdHlsZUVsIHx8ICFzdHlsZUVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIHN0eWxlRWwgPSByb290Tm9kZS5xdWVyeVNlbGVjdG9yKCdzdHlsZVtkYXRhLWZ1bGxjYWxlbmRhcl0nKTtcbiAgICAgICAgaWYgKCFzdHlsZUVsKSB7XG4gICAgICAgICAgICBzdHlsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgIHN0eWxlRWwuc2V0QXR0cmlidXRlKCdkYXRhLWZ1bGxjYWxlbmRhcicsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IG5vbmNlID0gZ2V0Tm9uY2VWYWx1ZSgpO1xuICAgICAgICAgICAgaWYgKG5vbmNlKSB7XG4gICAgICAgICAgICAgICAgc3R5bGVFbC5ub25jZSA9IG5vbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFyZW50RWwgPSByb290Tm9kZSA9PT0gZG9jdW1lbnQgPyBkb2N1bWVudC5oZWFkIDogcm9vdE5vZGU7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRCZWZvcmUgPSByb290Tm9kZSA9PT0gZG9jdW1lbnRcbiAgICAgICAgICAgICAgICA/IHBhcmVudEVsLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdCxsaW5rW3JlbD1zdHlsZXNoZWV0XSxsaW5rW2FzPXN0eWxlXSxzdHlsZScpXG4gICAgICAgICAgICAgICAgOiBwYXJlbnRFbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKHN0eWxlRWwsIGluc2VydEJlZm9yZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGVFbHMuc2V0KHJvb3ROb2RlLCBzdHlsZUVsKTtcbiAgICAgICAgaHlkcmF0ZVN0eWxlc1Jvb3Qoc3R5bGVFbCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaHlkcmF0ZVN0eWxlc1Jvb3Qoc3R5bGVFbCkge1xuICAgIGZvciAoY29uc3Qgc3R5bGVUZXh0IG9mIHN0eWxlVGV4dHMpIHtcbiAgICAgICAgYXBwZW5kU3R5bGVzVG8oc3R5bGVFbCwgc3R5bGVUZXh0KTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBlbmRTdHlsZXNUbyhzdHlsZUVsLCBzdHlsZVRleHQpIHtcbiAgICBjb25zdCB7IHNoZWV0IH0gPSBzdHlsZUVsO1xuICAgIGNvbnN0IHJ1bGVDbnQgPSBzaGVldC5jc3NSdWxlcy5sZW5ndGg7XG4gICAgc3R5bGVUZXh0LnNwbGl0KCd9JykuZm9yRWFjaCgoc3R5bGVTdHIsIGkpID0+IHtcbiAgICAgICAgc3R5bGVTdHIgPSBzdHlsZVN0ci50cmltKCk7XG4gICAgICAgIGlmIChzdHlsZVN0cikge1xuICAgICAgICAgICAgc2hlZXQuaW5zZXJ0UnVsZShzdHlsZVN0ciArICd9JywgcnVsZUNudCArIGkpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBub25jZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxubGV0IHF1ZXJpZWROb25jZVZhbHVlO1xuZnVuY3Rpb24gZ2V0Tm9uY2VWYWx1ZSgpIHtcbiAgICBpZiAocXVlcmllZE5vbmNlVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWVyaWVkTm9uY2VWYWx1ZSA9IHF1ZXJ5Tm9uY2VWYWx1ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcmllZE5vbmNlVmFsdWU7XG59XG4vKlxuVE9ETzogZGlzY291cmFnZSBtZXRhIHRhZyBhbmQgaW5zdGVhZCBwdXQgbm9uY2UgYXR0cmlidXRlIG9uIHBsYWNlaG9sZGVyIDxzdHlsZT4gdGFnXG4qL1xuZnVuY3Rpb24gcXVlcnlOb25jZVZhbHVlKCkge1xuICAgIGNvbnN0IG1ldGFXaXRoTm9uY2UgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3Atbm9uY2VcIl0nKTtcbiAgICBpZiAobWV0YVdpdGhOb25jZSAmJiBtZXRhV2l0aE5vbmNlLmhhc0F0dHJpYnV0ZSgnY29udGVudCcpKSB7XG4gICAgICAgIHJldHVybiBtZXRhV2l0aE5vbmNlLmdldEF0dHJpYnV0ZSgnY29udGVudCcpO1xuICAgIH1cbiAgICBjb25zdCBlbFdpdGhOb25jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTtcbiAgICBpZiAoZWxXaXRoTm9uY2UpIHtcbiAgICAgICAgcmV0dXJuIGVsV2l0aE5vbmNlLm5vbmNlIHx8ICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG4vLyBtYWluXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJlZ2lzdGVyU3R5bGVzUm9vdChkb2N1bWVudCk7XG59XG5cbnZhciBjc3NfMjQ4eiA9IFwiOnJvb3R7LS1mYy1zbWFsbC1mb250LXNpemU6Ljg1ZW07LS1mYy1wYWdlLWJnLWNvbG9yOiNmZmY7LS1mYy1uZXV0cmFsLWJnLWNvbG9yOmhzbGEoMCwwJSw4MiUsLjMpOy0tZmMtbmV1dHJhbC10ZXh0LWNvbG9yOmdyZXk7LS1mYy1ib3JkZXItY29sb3I6I2RkZDstLWZjLWJ1dHRvbi10ZXh0LWNvbG9yOiNmZmY7LS1mYy1idXR0b24tYmctY29sb3I6IzJjM2U1MDstLWZjLWJ1dHRvbi1ib3JkZXItY29sb3I6IzJjM2U1MDstLWZjLWJ1dHRvbi1ob3Zlci1iZy1jb2xvcjojMWUyYjM3Oy0tZmMtYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcjojMWEyNTJmOy0tZmMtYnV0dG9uLWFjdGl2ZS1iZy1jb2xvcjojMWEyNTJmOy0tZmMtYnV0dG9uLWFjdGl2ZS1ib3JkZXItY29sb3I6IzE1MWUyNzstLWZjLWV2ZW50LWJnLWNvbG9yOiMzNzg4ZDg7LS1mYy1ldmVudC1ib3JkZXItY29sb3I6IzM3ODhkODstLWZjLWV2ZW50LXRleHQtY29sb3I6I2ZmZjstLWZjLWV2ZW50LXNlbGVjdGVkLW92ZXJsYXktY29sb3I6cmdiYSgwLDAsMCwuMjUpOy0tZmMtbW9yZS1saW5rLWJnLWNvbG9yOiNkMGQwZDA7LS1mYy1tb3JlLWxpbmstdGV4dC1jb2xvcjppbmhlcml0Oy0tZmMtZXZlbnQtcmVzaXplci10aGlja25lc3M6OHB4Oy0tZmMtZXZlbnQtcmVzaXplci1kb3QtdG90YWwtd2lkdGg6OHB4Oy0tZmMtZXZlbnQtcmVzaXplci1kb3QtYm9yZGVyLXdpZHRoOjFweDstLWZjLW5vbi1idXNpbmVzcy1jb2xvcjpoc2xhKDAsMCUsODQlLC4zKTstLWZjLWJnLWV2ZW50LWNvbG9yOiM4ZmRmODI7LS1mYy1iZy1ldmVudC1vcGFjaXR5OjAuMzstLWZjLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDE4OCwyMzIsMjQxLC4zKTstLWZjLXRvZGF5LWJnLWNvbG9yOnJnYmEoMjU1LDIyMCw0MCwuMTUpOy0tZmMtbm93LWluZGljYXRvci1jb2xvcjpyZWR9LmZjLW5vdC1hbGxvd2VkLC5mYy1ub3QtYWxsb3dlZCAuZmMtZXZlbnR7Y3Vyc29yOm5vdC1hbGxvd2VkfS5mY3tkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZvbnQtc2l6ZToxZW19LmZjLC5mYyAqLC5mYyA6YWZ0ZXIsLmZjIDpiZWZvcmV7Ym94LXNpemluZzpib3JkZXItYm94fS5mYyB0YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtmb250LXNpemU6MWVtfS5mYyB0aHt0ZXh0LWFsaWduOmNlbnRlcn0uZmMgdGQsLmZjIHRoe3BhZGRpbmc6MDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmZjIGFbZGF0YS1uYXZsaW5rXXtjdXJzb3I6cG9pbnRlcn0uZmMgYVtkYXRhLW5hdmxpbmtdOmhvdmVye3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9LmZjLWRpcmVjdGlvbi1sdHJ7ZGlyZWN0aW9uOmx0cjt0ZXh0LWFsaWduOmxlZnR9LmZjLWRpcmVjdGlvbi1ydGx7ZGlyZWN0aW9uOnJ0bDt0ZXh0LWFsaWduOnJpZ2h0fS5mYy10aGVtZS1zdGFuZGFyZCB0ZCwuZmMtdGhlbWUtc3RhbmRhcmQgdGh7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1mYy1ib3JkZXItY29sb3IpfS5mYy1saXF1aWQtaGFjayB0ZCwuZmMtbGlxdWlkLWhhY2sgdGh7cG9zaXRpb246cmVsYXRpdmV9QGZvbnQtZmFjZXtmb250LWZhbWlseTpmY2ljb25zO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtzcmM6dXJsKFxcXCJkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODtiYXNlNjQsQUFFQUFBQUxBSUFBQXdBd1QxTXZNZzhTQmZBQUFBQzhBQUFBWUdOdFlYQVhWdEtOQUFBQkhBQUFBRlJuWVhOd0FBQUFFQUFBQVhBQUFBQUlaMng1WmdZeWR4SUFBQUY0QUFBRk5HaGxZV1FVSjdjSUFBQUdyQUFBQURab2FHVmhCMjBEekFBQUJ1UUFBQUFrYUcxMGVDSUFCaFFBQUFjSUFBQUFMR3h2WTJFRDRBVTZBQUFITkFBQUFCaHRZWGh3QUE4QWpBQUFCMHdBQUFBZ2JtRnRaWHNyNjkwQUFBZHNBQUFCaG5CdmMzUUFBd0FBQUFBSTlBQUFBQ0FBQXdQQUFaQUFCUUFBQXBrQ3pBQUFBSThDbVFMTUFBQUI2d0F6QVFrQUFBQUFBQUFBQUFBQUFBQUFBQUFCRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFEcEJnUEEvOEFBUUFQQUFFQUFBQUFCQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFEQUFBQUF3QUFBQndBQVFBREFBQUFIQUFEQUFFQUFBQWNBQVFBT0FBQUFBb0FDQUFDQUFJQUFRQWc2UWIvL2YvL0FBQUFBQUFnNlFELy9mLy9BQUgvNHhjRUFBTUFBUUFBQUFBQUFBQUFBQUFBQVFBQi8vOEFEd0FCQUFBQUFBQUFBQUFBQWdBQU56a0JBQUFBQUFFQUFBQUFBQUFBQUFBQ0FBQTNPUUVBQUFBQUFRQUFBQUFBQUFBQUFBSUFBRGM1QVFBQUFBQUJBV0lBalFLZUFza0FFd0FBSlNjM05qUW5KaUlIQVFZVUZ3RVdNamMyTkNjQ251TGlEUTBNSkF6L0FBME5BUUFNSkF3TkRjbmk0Z3dqRFF3TS93QU5Jd3ovQUEwTkRDTU5BQUFBQVFGaUFJMENuZ0xKQUJNQUFDVUJOalFuQVNZaUJ3WVVId0VIQmhRWEZqSTNBWjRCQUEwTi93QU1KQXdORGVMaURRME1KQXlOQVFBTUl3MEJBQXdNRFNNTTR1SU5Jd3dORFFBQUFBSUE0Z0MzQXg0Q25nQVRBQ2NBQUNVbk56WTBKeVlpRHdFR0ZCOEJGakkzTmpRbklTYzNOalFuSmlJUEFRWVVId0VXTWpjMk5DY0I4N2UzRFEwTUl3M1ZEUTNWRFNNTURRMEJLN2UzRFEwTUpBelZEUTNWRENRTURRM3p1TGNNSkF3TkRkVU5Jd3pXREF3Tkl3eTR0d3drREEwTjFRMGpETllNREEwakRBQUFBZ0RpQUxjREhnS2VBQk1BSndBQUpUYzJOQzhCSmlJSEJoUWZBUWNHRkJjV01qY2hOelkwTHdFbUlnY0dGQjhCQndZVUZ4WXlOd0pKMVEwTjFRMGpEQTBOdDdjTkRRd2pEZjdWMVEwTjFRd2tEQTBOdDdjTkRRd2tETGZXRENNTjFRME5EQ1FNdDdnTUl3ME1ETllNSXczVkRRME1KQXkzdUF3akRRd01BQUFEQUZVQUFBT3JBMVVBTXdCb0FIY0FBQk1pQmdjT0FRY09BUWNPQVJVUkZCWVhIZ0VYSGdFWEhnRXpJVEkyTno0Qk56NEJOejRCTlJFMEppY3VBU2N1QVNjdUFTTUZJVElXRng0QkZ4NEJGeDRCRlJFVUJnY09BUWNPQVFjT0FTTWhJaVluTGdFbkxnRW5MZ0UxRVRRMk56NEJOejRCTno0Qk14TWhNalkxTkNZaklTSUdGUlFXTTlVTkdBd0xGUWtKRGdVRkJRVUZCUTRKQ1JVTERCZ05BbFlOR0F3TEZRa0pEZ1VGQlFVRkJRNEpDUlVMREJnTi9hb0NWZ1FJQkFRSEF3TUZBUUlCQVFJQkJRTURCd1FFQ0FUOXFnUUlCQVFIQXdNRkFRSUJBUUlCQlFNREJ3UUVDQVNBQVZZUkdSa1IvcW9SR1JrUkExVUZCQVVPQ1FrVkRBc1pEZjJyRFJrTERCVUpDQTRGQlFVRkJRVU9DUWdWREFzWkRRSlZEUmtMREJVSkNRNEZCQVZWQWdFQ0JRTUNCd1FFQ0FYOXF3UUpBd1FIQXdNRkFRSUNBZ0lCQlFNREJ3UURDUVFDVlFVSUJBUUhBZ01GQWdFQy9vQVpFaEVaR1JFU0dRQUFBQUFEQUZVQUFBT3JBMVVBTXdCb0FJa0FBQk1pQmdjT0FRY09BUWNPQVJVUkZCWVhIZ0VYSGdFWEhnRXpJVEkyTno0Qk56NEJOejRCTlJFMEppY3VBU2N1QVNjdUFTTUZJVElXRng0QkZ4NEJGeDRCRlJFVUJnY09BUWNPQVFjT0FTTWhJaVluTGdFbkxnRW5MZ0UxRVRRMk56NEJOejRCTno0Qk14TXpGUlFXTXpJMlBRRXpNalkxTkNZckFUVTBKaU1pQmgwQkl5SUdGUlFXTTlVTkdBd0xGUWtKRGdVRkJRVUZCUTRKQ1JVTERCZ05BbFlOR0F3TEZRa0pEZ1VGQlFVRkJRNEpDUlVMREJnTi9hb0NWZ1FJQkFRSEF3TUZBUUlCQVFJQkJRTURCd1FFQ0FUOXFnUUlCQVFIQXdNRkFRSUJBUUlCQlFNREJ3UUVDQVNBZ0JrU0VobUFFUmtaRVlBWkVoSVpnQkVaR1JFRFZRVUVCUTRKQ1JVTUN4a04vYXNOR1FzTUZRa0lEZ1VGQlFVRkJRNEpDQlVNQ3hrTkFsVU5HUXNNRlFrSkRnVUVCVlVDQVFJRkF3SUhCQVFJQmYyckJBa0RCQWNEQXdVQkFnSUNBZ0VGQXdNSEJBTUpCQUpWQlFnRUJBY0NBd1VDQVFMK2dJQVNHUmtTZ0JrU0VSbUFFaGtaRW9BWkVSSVpBQUFCQU9JQWpRTWVBc2tBSUFBQUV4Y0hCaFFYRmpJL0FSY1dNamMyTkM4Qk56WTBKeVlpRHdFbkppSUhCaFFYNHVMaURRME1KQXppNGd3a0RBME40dUlORFF3a0RPTGlEQ1FNRFEwQ2plTGlEU01NRFEzaDRRME5EQ01ONHVJTUl3ME1ET0xpREF3Tkl3d0FBQUFCQUFBQUFRQUFhNW4weTE4UFBQVUFDd1FBQUFBQUFOaXZPVnNBQUFBQTJLODVXd0FBQUFBRHF3TlZBQUFBQ0FBQ0FBQUFBQUFBQUFFQUFBUEEvOEFBQUFRQUFBQUFBQU9yQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFMQkFBQUFBQUFBQUFBQUFBQUFnQUFBQVFBQVdJRUFBRmlCQUFBNGdRQUFPSUVBQUJWQkFBQVZRUUFBT0lBQUFBQUFBb0FGQUFlQUVRQWFnQ3FBT29CbmdKa0Fwb0FBUUFBQUFzQWlnQURBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNEFyZ0FCQUFBQUFBQUJBQWNBQUFBQkFBQUFBQUFDQUFjQVlBQUJBQUFBQUFBREFBY0FOZ0FCQUFBQUFBQUVBQWNBZFFBQkFBQUFBQUFGQUFzQUZRQUJBQUFBQUFBR0FBY0FTd0FCQUFBQUFBQUtBQm9BaWdBREFBRUVDUUFCQUE0QUJ3QURBQUVFQ1FBQ0FBNEFad0FEQUFFRUNRQURBQTRBUFFBREFBRUVDUUFFQUE0QWZBQURBQUVFQ1FBRkFCWUFJQUFEQUFFRUNRQUdBQTRBVWdBREFBRUVDUUFLQURRQXBHWmphV052Ym5NQVpnQmpBR2tBWXdCdkFHNEFjMVpsY25OcGIyNGdNUzR3QUZZQVpRQnlBSE1BYVFCdkFHNEFJQUF4QUM0QU1HWmphV052Ym5NQVpnQmpBR2tBWXdCdkFHNEFjMlpqYVdOdmJuTUFaZ0JqQUdrQVl3QnZBRzRBYzFKbFozVnNZWElBVWdCbEFHY0FkUUJzQUdFQWNtWmphV052Ym5NQVpnQmpBR2tBWXdCdkFHNEFjMFp2Ym5RZ1oyVnVaWEpoZEdWa0lHSjVJRWxqYjAxdmIyNHVBRVlBYndCdUFIUUFJQUJuQUdVQWJnQmxBSElBWVFCMEFHVUFaQUFnQUdJQWVRQWdBRWtBWXdCdkFFMEFid0J2QUc0QUxnQUFBQU1BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPVxcXCIpIGZvcm1hdChcXFwidHJ1ZXR5cGVcXFwiKX0uZmMtaWNvbntzcGVhazpub25lOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtZmFtaWx5OmZjaWNvbnMhaW1wb3J0YW50O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2hlaWdodDoxZW07bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LXRyYW5zZm9ybTpub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt3aWR0aDoxZW19LmZjLWljb24tY2hldnJvbi1sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwMFxcXCJ9LmZjLWljb24tY2hldnJvbi1yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGU5MDFcXFwifS5mYy1pY29uLWNoZXZyb25zLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxlOTAyXFxcIn0uZmMtaWNvbi1jaGV2cm9ucy1yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGU5MDNcXFwifS5mYy1pY29uLW1pbnVzLXNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGU5MDRcXFwifS5mYy1pY29uLXBsdXMtc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwNVxcXCJ9LmZjLWljb24teDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGU5MDZcXFwifS5mYyAuZmMtYnV0dG9ue2JvcmRlci1yYWRpdXM6MDtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7bWFyZ2luOjA7b3ZlcmZsb3c6dmlzaWJsZTt0ZXh0LXRyYW5zZm9ybTpub25lfS5mYyAuZmMtYnV0dG9uOmZvY3Vze291dGxpbmU6MXB4IGRvdHRlZDtvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcn0uZmMgLmZjLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufS5mYyAuZmMtYnV0dG9uOm5vdCg6ZGlzYWJsZWQpe2N1cnNvcjpwb2ludGVyfS5mYyAuZmMtYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOi4yNWVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNTtwYWRkaW5nOi40ZW0gLjY1ZW07dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZmMgLmZjLWJ1dHRvbjpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uZmMgLmZjLWJ1dHRvbjpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNDQsNjIsODAsLjI1KTtvdXRsaW5lOjB9LmZjIC5mYy1idXR0b246ZGlzYWJsZWR7b3BhY2l0eTouNjV9LmZjIC5mYy1idXR0b24tcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWZjLWJ1dHRvbi1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWZjLWJ1dHRvbi1ib3JkZXItY29sb3IpO2NvbG9yOnZhcigtLWZjLWJ1dHRvbi10ZXh0LWNvbG9yKX0uZmMgLmZjLWJ1dHRvbi1wcmltYXJ5OmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZmMtYnV0dG9uLWhvdmVyLWJnLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tZmMtYnV0dG9uLWhvdmVyLWJvcmRlci1jb2xvcik7Y29sb3I6dmFyKC0tZmMtYnV0dG9uLXRleHQtY29sb3IpfS5mYyAuZmMtYnV0dG9uLXByaW1hcnk6ZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mYy1idXR0b24tYmctY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1mYy1idXR0b24tYm9yZGVyLWNvbG9yKTtjb2xvcjp2YXIoLS1mYy1idXR0b24tdGV4dC1jb2xvcil9LmZjIC5mYy1idXR0b24tcHJpbWFyeTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNzYsOTEsMTA2LC41KX0uZmMgLmZjLWJ1dHRvbi1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpLmZjLWJ1dHRvbi1hY3RpdmUsLmZjIC5mYy1idXR0b24tcHJpbWFyeTpub3QoOmRpc2FibGVkKTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mYy1idXR0b24tYWN0aXZlLWJnLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tZmMtYnV0dG9uLWFjdGl2ZS1ib3JkZXItY29sb3IpO2NvbG9yOnZhcigtLWZjLWJ1dHRvbi10ZXh0LWNvbG9yKX0uZmMgLmZjLWJ1dHRvbi1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpLmZjLWJ1dHRvbi1hY3RpdmU6Zm9jdXMsLmZjIC5mYy1idXR0b24tcHJpbWFyeTpub3QoOmRpc2FibGVkKTphY3RpdmU6Zm9jdXN7Ym94LXNoYWRvdzowIDAgMCAuMnJlbSByZ2JhKDc2LDkxLDEwNiwuNSl9LmZjIC5mYy1idXR0b24gLmZjLWljb257Zm9udC1zaXplOjEuNWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZmMgLmZjLWJ1dHRvbi1ncm91cHtkaXNwbGF5OmlubGluZS1mbGV4O3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0uZmMgLmZjLWJ1dHRvbi1ncm91cD4uZmMtYnV0dG9ue2ZsZXg6MSAxIGF1dG87cG9zaXRpb246cmVsYXRpdmV9LmZjIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbi5mYy1idXR0b24tYWN0aXZlLC5mYyAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246YWN0aXZlLC5mYyAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246Zm9jdXMsLmZjIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbjpob3Zlcnt6LWluZGV4OjF9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWJ1dHRvbi1ncm91cD4uZmMtYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7bWFyZ2luLWxlZnQ6LTFweH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246bm90KDpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LmZjLWRpcmVjdGlvbi1ydGwgLmZjLWJ1dHRvbi1ncm91cD4uZmMtYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDttYXJnaW4tcmlnaHQ6LTFweH0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246bm90KDpsYXN0LWNoaWxkKXtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS5mYyAuZmMtdG9vbGJhcnthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVufS5mYyAuZmMtdG9vbGJhci5mYy1oZWFkZXItdG9vbGJhcnttYXJnaW4tYm90dG9tOjEuNWVtfS5mYyAuZmMtdG9vbGJhci5mYy1mb290ZXItdG9vbGJhcnttYXJnaW4tdG9wOjEuNWVtfS5mYyAuZmMtdG9vbGJhci10aXRsZXtmb250LXNpemU6MS43NWVtO21hcmdpbjowfS5mYy1kaXJlY3Rpb24tbHRyIC5mYy10b29sYmFyPio+Om5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi43NWVtfS5mYy1kaXJlY3Rpb24tcnRsIC5mYy10b29sYmFyPio+Om5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1yaWdodDouNzVlbX0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtdG9vbGJhci1sdHJ7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2V9LmZjIC5mYy1zY3JvbGxlcnstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLXNjcm9sbGVyLWxpcXVpZHtoZWlnaHQ6MTAwJX0uZmMgLmZjLXNjcm9sbGVyLWxpcXVpZC1hYnNvbHV0ZXtib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH0uZmMgLmZjLXNjcm9sbGVyLWhhcm5lc3N7ZGlyZWN0aW9uOmx0cjtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9LmZjIC5mYy1zY3JvbGxlci1oYXJuZXNzLWxpcXVpZHtoZWlnaHQ6MTAwJX0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtc2Nyb2xsZXItaGFybmVzcz4uZmMtc2Nyb2xsZXJ7ZGlyZWN0aW9uOnJ0bH0uZmMtdGhlbWUtc3RhbmRhcmQgLmZjLXNjcm9sbGdyaWR7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1mYy1ib3JkZXItY29sb3IpfS5mYyAuZmMtc2Nyb2xsZ3JpZCwuZmMgLmZjLXNjcm9sbGdyaWQgdGFibGV7dGFibGUtbGF5b3V0OmZpeGVkO3dpZHRoOjEwMCV9LmZjIC5mYy1zY3JvbGxncmlkIHRhYmxle2JvcmRlci1sZWZ0LXN0eWxlOmhpZGRlbjtib3JkZXItcmlnaHQtc3R5bGU6aGlkZGVuO2JvcmRlci10b3Atc3R5bGU6aGlkZGVufS5mYyAuZmMtc2Nyb2xsZ3JpZHtib3JkZXItYm90dG9tLXdpZHRoOjA7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlO2JvcmRlci1yaWdodC13aWR0aDowfS5mYyAuZmMtc2Nyb2xsZ3JpZC1saXF1aWR7aGVpZ2h0OjEwMCV9LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24sLmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24gdGFibGUsLmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24+dGR7aGVpZ2h0OjFweH0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1saXF1aWQ+dGR7aGVpZ2h0OjEwMCV9LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24+Kntib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci10b3Atd2lkdGg6MH0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1mb290ZXI+KiwuZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1oZWFkZXI+Kntib3JkZXItYm90dG9tLXdpZHRoOjB9LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24tYm9keSB0YWJsZSwuZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1mb290ZXIgdGFibGV7Ym9yZGVyLWJvdHRvbS1zdHlsZTpoaWRkZW59LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24tc3RpY2t5Pip7YmFja2dyb3VuZDp2YXIoLS1mYy1wYWdlLWJnLWNvbG9yKTtwb3NpdGlvbjpzdGlja3k7ei1pbmRleDozfS5mYyAuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWhlYWRlci5mYy1zY3JvbGxncmlkLXNlY3Rpb24tc3RpY2t5Pip7dG9wOjB9LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24tZm9vdGVyLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1zdGlja3k+Kntib3R0b206MH0uZmMgLmZjLXNjcm9sbGdyaWQtc3RpY2t5LXNoaW17aGVpZ2h0OjFweDttYXJnaW4tYm90dG9tOi0xcHh9LmZjLXN0aWNreXtwb3NpdGlvbjpzdGlja3l9LmZjIC5mYy12aWV3LWhhcm5lc3N7ZmxleC1ncm93OjE7cG9zaXRpb246cmVsYXRpdmV9LmZjIC5mYy12aWV3LWhhcm5lc3MtYWN0aXZlPi5mYy12aWV3e2JvdHRvbTowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfS5mYyAuZmMtY29sLWhlYWRlci1jZWxsLWN1c2hpb257ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzoycHggNHB4fS5mYyAuZmMtYmctZXZlbnQsLmZjIC5mYy1oaWdobGlnaHQsLmZjIC5mYy1ub24tYnVzaW5lc3N7Ym90dG9tOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9LmZjIC5mYy1ub24tYnVzaW5lc3N7YmFja2dyb3VuZDp2YXIoLS1mYy1ub24tYnVzaW5lc3MtY29sb3IpfS5mYyAuZmMtYmctZXZlbnR7YmFja2dyb3VuZDp2YXIoLS1mYy1iZy1ldmVudC1jb2xvcik7b3BhY2l0eTp2YXIoLS1mYy1iZy1ldmVudC1vcGFjaXR5KX0uZmMgLmZjLWJnLWV2ZW50IC5mYy1ldmVudC10aXRsZXtmb250LXNpemU6dmFyKC0tZmMtc21hbGwtZm9udC1zaXplKTtmb250LXN0eWxlOml0YWxpYzttYXJnaW46LjVlbX0uZmMgLmZjLWhpZ2hsaWdodHtiYWNrZ3JvdW5kOnZhcigtLWZjLWhpZ2hsaWdodC1jb2xvcil9LmZjIC5mYy1jZWxsLXNoYWRlZCwuZmMgLmZjLWRheS1kaXNhYmxlZHtiYWNrZ3JvdW5kOnZhcigtLWZjLW5ldXRyYWwtYmctY29sb3IpfWEuZmMtZXZlbnQsYS5mYy1ldmVudDpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uZmMtZXZlbnQuZmMtZXZlbnQtZHJhZ2dhYmxlLC5mYy1ldmVudFtocmVmXXtjdXJzb3I6cG9pbnRlcn0uZmMtZXZlbnQgLmZjLWV2ZW50LW1haW57cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfS5mYy1ldmVudC1kcmFnZ2luZzpub3QoLmZjLWV2ZW50LXNlbGVjdGVkKXtvcGFjaXR5Oi43NX0uZmMtZXZlbnQtZHJhZ2dpbmcuZmMtZXZlbnQtc2VsZWN0ZWR7Ym94LXNoYWRvdzowIDJweCA3cHggcmdiYSgwLDAsMCwuMyl9LmZjLWV2ZW50IC5mYy1ldmVudC1yZXNpemVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjR9LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVyLC5mYy1ldmVudDpob3ZlciAuZmMtZXZlbnQtcmVzaXplcntkaXNwbGF5OmJsb2NrfS5mYy1ldmVudC1zZWxlY3RlZCAuZmMtZXZlbnQtcmVzaXplcntiYWNrZ3JvdW5kOnZhcigtLWZjLXBhZ2UtYmctY29sb3IpO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCkvMik7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDp2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC1ib3JkZXItd2lkdGgpO2hlaWdodDp2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCk7d2lkdGg6dmFyKC0tZmMtZXZlbnQtcmVzaXplci1kb3QtdG90YWwtd2lkdGgpfS5mYy1ldmVudC1zZWxlY3RlZCAuZmMtZXZlbnQtcmVzaXplcjpiZWZvcmV7Ym90dG9tOi0yMHB4O2NvbnRlbnQ6XFxcIlxcXCI7bGVmdDotMjBweDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotMjBweDt0b3A6LTIwcHh9LmZjLWV2ZW50LXNlbGVjdGVkLC5mYy1ldmVudDpmb2N1c3tib3gtc2hhZG93OjAgMnB4IDVweCByZ2JhKDAsMCwwLC4yKX0uZmMtZXZlbnQtc2VsZWN0ZWQ6YmVmb3JlLC5mYy1ldmVudDpmb2N1czpiZWZvcmV7Ym90dG9tOjA7Y29udGVudDpcXFwiXFxcIjtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MDt6LWluZGV4OjN9LmZjLWV2ZW50LXNlbGVjdGVkOmFmdGVyLC5mYy1ldmVudDpmb2N1czphZnRlcntiYWNrZ3JvdW5kOnZhcigtLWZjLWV2ZW50LXNlbGVjdGVkLW92ZXJsYXktY29sb3IpO2JvdHRvbTotMXB4O2NvbnRlbnQ6XFxcIlxcXCI7bGVmdDotMXB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0xcHg7dG9wOi0xcHg7ei1pbmRleDoxfS5mYy1oLWV2ZW50e2JhY2tncm91bmQtY29sb3I6dmFyKC0tZmMtZXZlbnQtYmctY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZmMtZXZlbnQtYm9yZGVyLWNvbG9yKTtkaXNwbGF5OmJsb2NrfS5mYy1oLWV2ZW50IC5mYy1ldmVudC1tYWlue2NvbG9yOnZhcigtLWZjLWV2ZW50LXRleHQtY29sb3IpfS5mYy1oLWV2ZW50IC5mYy1ldmVudC1tYWluLWZyYW1le2Rpc3BsYXk6ZmxleH0uZmMtaC1ldmVudCAuZmMtZXZlbnQtdGltZXttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59LmZjLWgtZXZlbnQgLmZjLWV2ZW50LXRpdGxlLWNvbnRhaW5lcntmbGV4LWdyb3c6MTtmbGV4LXNocmluazoxO21pbi13aWR0aDowfS5mYy1oLWV2ZW50IC5mYy1ldmVudC10aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jaztsZWZ0OjA7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3JpZ2h0OjA7dmVydGljYWwtYWxpZ246dG9wfS5mYy1oLWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkOmJlZm9yZXtib3R0b206LTEwcHg7dG9wOi0xMHB4fS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1kYXlncmlkLWJsb2NrLWV2ZW50Om5vdCguZmMtZXZlbnQtc3RhcnQpLC5mYy1kaXJlY3Rpb24tcnRsIC5mYy1kYXlncmlkLWJsb2NrLWV2ZW50Om5vdCguZmMtZXZlbnQtZW5kKXtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWxlZnQtd2lkdGg6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWRheWdyaWQtYmxvY2stZXZlbnQ6bm90KC5mYy1ldmVudC1lbmQpLC5mYy1kaXJlY3Rpb24tcnRsIC5mYy1kYXlncmlkLWJsb2NrLWV2ZW50Om5vdCguZmMtZXZlbnQtc3RhcnQpe2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXJpZ2h0LXdpZHRoOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uZmMtaC1ldmVudDpub3QoLmZjLWV2ZW50LXNlbGVjdGVkKSAuZmMtZXZlbnQtcmVzaXplcntib3R0b206MDt0b3A6MDt3aWR0aDp2YXIoLS1mYy1ldmVudC1yZXNpemVyLXRoaWNrbmVzcyl9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWgtZXZlbnQ6bm90KC5mYy1ldmVudC1zZWxlY3RlZCkgLmZjLWV2ZW50LXJlc2l6ZXItc3RhcnQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWgtZXZlbnQ6bm90KC5mYy1ldmVudC1zZWxlY3RlZCkgLmZjLWV2ZW50LXJlc2l6ZXItZW5ke2N1cnNvcjp3LXJlc2l6ZTtsZWZ0OmNhbGModmFyKC0tZmMtZXZlbnQtcmVzaXplci10aGlja25lc3MpKi0uNSl9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWgtZXZlbnQ6bm90KC5mYy1ldmVudC1zZWxlY3RlZCkgLmZjLWV2ZW50LXJlc2l6ZXItZW5kLC5mYy1kaXJlY3Rpb24tcnRsIC5mYy1oLWV2ZW50Om5vdCguZmMtZXZlbnQtc2VsZWN0ZWQpIC5mYy1ldmVudC1yZXNpemVyLXN0YXJ0e2N1cnNvcjplLXJlc2l6ZTtyaWdodDpjYWxjKHZhcigtLWZjLWV2ZW50LXJlc2l6ZXItdGhpY2tuZXNzKSotLjUpfS5mYy1oLWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVye21hcmdpbi10b3A6Y2FsYyh2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCkqLS41KTt0b3A6NTAlfS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1oLWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVyLXN0YXJ0LC5mYy1kaXJlY3Rpb24tcnRsIC5mYy1oLWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVyLWVuZHtsZWZ0OmNhbGModmFyKC0tZmMtZXZlbnQtcmVzaXplci1kb3QtdG90YWwtd2lkdGgpKi0uNSl9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXItZW5kLC5mYy1kaXJlY3Rpb24tcnRsIC5mYy1oLWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVyLXN0YXJ0e3JpZ2h0OmNhbGModmFyKC0tZmMtZXZlbnQtcmVzaXplci1kb3QtdG90YWwtd2lkdGgpKi0uNSl9LmZjIC5mYy1wb3BvdmVye2JveC1zaGFkb3c6MCAycHggNnB4IHJnYmEoMCwwLDAsLjE1KTtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4Ojk5OTl9LmZjIC5mYy1wb3BvdmVyLWhlYWRlcnthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjtwYWRkaW5nOjNweCA0cHh9LmZjIC5mYy1wb3BvdmVyLXRpdGxle21hcmdpbjowIDJweH0uZmMgLmZjLXBvcG92ZXItY2xvc2V7Y3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjEuMWVtO29wYWNpdHk6LjY1fS5mYy10aGVtZS1zdGFuZGFyZCAuZmMtcG9wb3ZlcntiYWNrZ3JvdW5kOnZhcigtLWZjLXBhZ2UtYmctY29sb3IpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tZmMtYm9yZGVyLWNvbG9yKX0uZmMtdGhlbWUtc3RhbmRhcmQgLmZjLXBvcG92ZXItaGVhZGVye2JhY2tncm91bmQ6dmFyKC0tZmMtbmV1dHJhbC1iZy1jb2xvcil9XCI7XG5pbmplY3RTdHlsZXMoY3NzXzI0OHopO1xuXG5mdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsKSB7XG4gICAgaWYgKGVsLnBhcmVudE5vZGUpIHtcbiAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgfVxufVxuLy8gUXVlcnlpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGVsZW1lbnRDbG9zZXN0KGVsLCBzZWxlY3Rvcikge1xuICAgIGlmIChlbC5jbG9zZXN0KSB7XG4gICAgICAgIHJldHVybiBlbC5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgICAgLy8gcmVhbGx5IGJhZCBmYWxsYmFjayBmb3IgSUVcbiAgICAgICAgLy8gZnJvbSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9jbG9zZXN0XG4gICAgfVxuICAgIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGVsKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZG8ge1xuICAgICAgICBpZiAoZWxlbWVudE1hdGNoZXMoZWwsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gKGVsLnBhcmVudEVsZW1lbnQgfHwgZWwucGFyZW50Tm9kZSk7XG4gICAgfSB3aGlsZSAoZWwgIT09IG51bGwgJiYgZWwubm9kZVR5cGUgPT09IDEpO1xuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG1ldGhvZCA9IGVsLm1hdGNoZXMgfHwgZWwubWF0Y2hlc1NlbGVjdG9yIHx8IGVsLm1zTWF0Y2hlc1NlbGVjdG9yO1xuICAgIHJldHVybiBtZXRob2QuY2FsbChlbCwgc2VsZWN0b3IpO1xufVxuLy8gYWNjZXB0cyBtdWx0aXBsZSBzdWJqZWN0IGVsc1xuLy8gcmV0dXJucyBhIHJlYWwgYXJyYXkuIGdvb2QgZm9yIG1ldGhvZHMgbGlrZSBmb3JFYWNoXG4vLyBUT0RPOiBhY2NlcHQgdGhlIGRvY3VtZW50XG5mdW5jdGlvbiBmaW5kRWxlbWVudHMoY29udGFpbmVyLCBzZWxlY3Rvcikge1xuICAgIGxldCBjb250YWluZXJzID0gY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBbY29udGFpbmVyXSA6IGNvbnRhaW5lcjtcbiAgICBsZXQgYWxsTWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGFpbmVycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZXQgbWF0Y2hlcyA9IGNvbnRhaW5lcnNbaV0ucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbWF0Y2hlcy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgYWxsTWF0Y2hlcy5wdXNoKG1hdGNoZXNbal0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGxNYXRjaGVzO1xufVxuLy8gYWNjZXB0cyBtdWx0aXBsZSBzdWJqZWN0IGVsc1xuLy8gb25seSBxdWVyaWVzIGRpcmVjdCBjaGlsZCBlbGVtZW50cyAvLyBUT0RPOiByZW5hbWUgdG8gZmluZERpcmVjdENoaWxkcmVuIVxuZnVuY3Rpb24gZmluZERpcmVjdENoaWxkcmVuKHBhcmVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgcGFyZW50cyA9IHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gW3BhcmVudF0gOiBwYXJlbnQ7XG4gICAgbGV0IGFsbE1hdGNoZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmVudHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBwYXJlbnRzW2ldLmNoaWxkcmVuOyAvLyBvbmx5IGV2ZXIgZWxlbWVudHNcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZE5vZGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGROb2RlID0gY2hpbGROb2Rlc1tqXTtcbiAgICAgICAgICAgIGlmICghc2VsZWN0b3IgfHwgZWxlbWVudE1hdGNoZXMoY2hpbGROb2RlLCBzZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgICBhbGxNYXRjaGVzLnB1c2goY2hpbGROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWxsTWF0Y2hlcztcbn1cbi8vIFN0eWxlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBQSVhFTF9QUk9QX1JFID0gLyh0b3B8bGVmdHxyaWdodHxib3R0b218d2lkdGh8aGVpZ2h0KSQvaTtcbmZ1bmN0aW9uIGFwcGx5U3R5bGUoZWwsIHByb3BzKSB7XG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcHJvcHMpIHtcbiAgICAgICAgYXBwbHlTdHlsZVByb3AoZWwsIHByb3BOYW1lLCBwcm9wc1twcm9wTmFtZV0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5U3R5bGVQcm9wKGVsLCBuYW1lLCB2YWwpIHtcbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSAnJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiYgUElYRUxfUFJPUF9SRS50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGVsLnN0eWxlW25hbWVdID0gYCR7dmFsfXB4YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsLnN0eWxlW25hbWVdID0gdmFsO1xuICAgIH1cbn1cbi8vIEV2ZW50IEhhbmRsaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBpZiBpbnRlcmNlcHRpbmcgYnViYmxlZCBldmVudHMgYXQgdGhlIGRvY3VtZW50L3dpbmRvdy9ib2R5IGxldmVsLFxuLy8gYW5kIHdhbnQgdG8gc2VlIG9yaWdpbmF0aW5nIGVsZW1lbnQgKHRoZSAndGFyZ2V0JyksIHVzZSB0aGlzIHV0aWwgaW5zdGVhZFxuLy8gb2YgYGV2LnRhcmdldGAgYmVjYXVzZSBpdCBnb2VzIHdpdGhpbiB3ZWItY29tcG9uZW50IGJvdW5kYXJpZXMuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldFZpYVJvb3QoZXYpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIHJldHVybiAoX2IgPSAoX2EgPSBldi5jb21wb3NlZFBhdGgpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGV2KVswXSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogZXYudGFyZ2V0O1xufVxuLy8gVW5pcXVlIElEIGZvciBET00gYXR0cmlidXRlXG5sZXQgZ3VpZCQxID0gMDtcbmZ1bmN0aW9uIGdldFVuaXF1ZURvbUlkKCkge1xuICAgIGd1aWQkMSArPSAxO1xuICAgIHJldHVybiAnZmMtZG9tLScgKyBndWlkJDE7XG59XG5cbi8vIFN0b3BzIGEgbW91c2UvdG91Y2ggZXZlbnQgZnJvbSBkb2luZyBpdCdzIG5hdGl2ZSBicm93c2VyIGFjdGlvblxuZnVuY3Rpb24gcHJldmVudERlZmF1bHQoZXYpIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xufVxuLy8gRXZlbnQgRGVsZWdhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gYnVpbGREZWxlZ2F0aW9uSGFuZGxlcihzZWxlY3RvciwgaGFuZGxlcikge1xuICAgIHJldHVybiAoZXYpID0+IHtcbiAgICAgICAgbGV0IG1hdGNoZWRDaGlsZCA9IGVsZW1lbnRDbG9zZXN0KGV2LnRhcmdldCwgc2VsZWN0b3IpO1xuICAgICAgICBpZiAobWF0Y2hlZENoaWxkKSB7XG4gICAgICAgICAgICBoYW5kbGVyLmNhbGwobWF0Y2hlZENoaWxkLCBldiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5mdW5jdGlvbiBsaXN0ZW5CeVNlbGVjdG9yKGNvbnRhaW5lciwgZXZlbnRUeXBlLCBzZWxlY3RvciwgaGFuZGxlcikge1xuICAgIGxldCBhdHRhY2hlZEhhbmRsZXIgPSBidWlsZERlbGVnYXRpb25IYW5kbGVyKHNlbGVjdG9yLCBoYW5kbGVyKTtcbiAgICBjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGF0dGFjaGVkSGFuZGxlcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBhdHRhY2hlZEhhbmRsZXIpO1xuICAgIH07XG59XG5mdW5jdGlvbiBsaXN0ZW5Ub0hvdmVyQnlTZWxlY3Rvcihjb250YWluZXIsIHNlbGVjdG9yLCBvbk1vdXNlRW50ZXIsIG9uTW91c2VMZWF2ZSkge1xuICAgIGxldCBjdXJyZW50TWF0Y2hlZENoaWxkO1xuICAgIHJldHVybiBsaXN0ZW5CeVNlbGVjdG9yKGNvbnRhaW5lciwgJ21vdXNlb3ZlcicsIHNlbGVjdG9yLCAobW91c2VPdmVyRXYsIG1hdGNoZWRDaGlsZCkgPT4ge1xuICAgICAgICBpZiAobWF0Y2hlZENoaWxkICE9PSBjdXJyZW50TWF0Y2hlZENoaWxkKSB7XG4gICAgICAgICAgICBjdXJyZW50TWF0Y2hlZENoaWxkID0gbWF0Y2hlZENoaWxkO1xuICAgICAgICAgICAgb25Nb3VzZUVudGVyKG1vdXNlT3ZlckV2LCBtYXRjaGVkQ2hpbGQpO1xuICAgICAgICAgICAgbGV0IHJlYWxPbk1vdXNlTGVhdmUgPSAobW91c2VMZWF2ZUV2KSA9PiB7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hdGNoZWRDaGlsZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlKG1vdXNlTGVhdmVFdiwgbWF0Y2hlZENoaWxkKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVkQ2hpbGQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGxpc3RlbiB0byB0aGUgbmV4dCBtb3VzZWxlYXZlLCBhbmQgdGhlbiB1bmF0dGFjaFxuICAgICAgICAgICAgbWF0Y2hlZENoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCByZWFsT25Nb3VzZUxlYXZlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuLy8gQW5pbWF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCB0cmFuc2l0aW9uRXZlbnROYW1lcyA9IFtcbiAgICAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgJ290cmFuc2l0aW9uZW5kJyxcbiAgICAnb1RyYW5zaXRpb25FbmQnLFxuICAgICdtc1RyYW5zaXRpb25FbmQnLFxuICAgICd0cmFuc2l0aW9uZW5kJyxcbl07XG4vLyB0cmlnZ2VyZWQgb25seSB3aGVuIHRoZSBuZXh0IHNpbmdsZSBzdWJzZXF1ZW50IHRyYW5zaXRpb24gZmluaXNoZXNcbmZ1bmN0aW9uIHdoZW5UcmFuc2l0aW9uRG9uZShlbCwgY2FsbGJhY2spIHtcbiAgICBsZXQgcmVhbENhbGxiYWNrID0gKGV2KSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKGV2KTtcbiAgICAgICAgdHJhbnNpdGlvbkV2ZW50TmFtZXMuZm9yRWFjaCgoZXZlbnROYW1lKSA9PiB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcmVhbENhbGxiYWNrKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB0cmFuc2l0aW9uRXZlbnROYW1lcy5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHJlYWxDYWxsYmFjayk7IC8vIGNyb3NzLWJyb3dzZXIgd2F5IHRvIGRldGVybWluZSB3aGVuIHRoZSB0cmFuc2l0aW9uIGZpbmlzaGVzXG4gICAgfSk7XG59XG4vLyBBUklBIHdvcmthcm91bmRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjcmVhdGVBcmlhQ2xpY2tBdHRycyhoYW5kbGVyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBvbkNsaWNrOiBoYW5kbGVyIH0sIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0YWJJbmRleDogMCxcbiAgICAgICAgb25LZXlEb3duKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5ID09PSAnRW50ZXInIHx8IGV2LmtleSA9PT0gJyAnKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihldik7XG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsgLy8gaWYgc3BhY2UsIGRvbid0IHNjcm9sbCBkb3duIHBhZ2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5sZXQgZ3VpZE51bWJlciA9IDA7XG5mdW5jdGlvbiBndWlkKCkge1xuICAgIGd1aWROdW1iZXIgKz0gMTtcbiAgICByZXR1cm4gU3RyaW5nKGd1aWROdW1iZXIpO1xufVxuLyogRnVsbENhbGVuZGFyLXNwZWNpZmljIERPTSBVdGlsaXRpZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLy8gTWFrZSB0aGUgbW91c2UgY3Vyc29yIGV4cHJlc3MgdGhhdCBhbiBldmVudCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBhcmVhXG5mdW5jdGlvbiBkaXNhYmxlQ3Vyc29yKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnZmMtbm90LWFsbG93ZWQnKTtcbn1cbi8vIFJldHVybnMgdGhlIG1vdXNlIGN1cnNvciB0byBpdHMgb3JpZ2luYWwgbG9va1xuZnVuY3Rpb24gZW5hYmxlQ3Vyc29yKCkge1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnZmMtbm90LWFsbG93ZWQnKTtcbn1cbi8qIFNlbGVjdGlvblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5mdW5jdGlvbiBwcmV2ZW50U2VsZWN0aW9uKGVsKSB7XG4gICAgZWwuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJztcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIHByZXZlbnREZWZhdWx0KTtcbn1cbmZ1bmN0aW9uIGFsbG93U2VsZWN0aW9uKGVsKSB7XG4gICAgZWwuc3R5bGUudXNlclNlbGVjdCA9ICcnO1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgcHJldmVudERlZmF1bHQpO1xufVxuLyogQ29udGV4dCBNZW51XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHByZXZlbnRDb250ZXh0TWVudShlbCkge1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgcHJldmVudERlZmF1bHQpO1xufVxuZnVuY3Rpb24gYWxsb3dDb250ZXh0TWVudShlbCkge1xuICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgcHJldmVudERlZmF1bHQpO1xufVxuZnVuY3Rpb24gcGFyc2VGaWVsZFNwZWNzKGlucHV0KSB7XG4gICAgbGV0IHNwZWNzID0gW107XG4gICAgbGV0IHRva2VucyA9IFtdO1xuICAgIGxldCBpO1xuICAgIGxldCB0b2tlbjtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0b2tlbnMgPSBpbnB1dC5zcGxpdCgvXFxzKixcXHMqLyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0b2tlbnMgPSBbaW5wdXRdO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICB0b2tlbnMgPSBpbnB1dDtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNwZWNzLnB1c2godG9rZW4uY2hhckF0KDApID09PSAnLScgP1xuICAgICAgICAgICAgICAgIHsgZmllbGQ6IHRva2VuLnN1YnN0cmluZygxKSwgb3JkZXI6IC0xIH0gOlxuICAgICAgICAgICAgICAgIHsgZmllbGQ6IHRva2VuLCBvcmRlcjogMSB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdG9rZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHNwZWNzLnB1c2goeyBmdW5jOiB0b2tlbiB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BlY3M7XG59XG5mdW5jdGlvbiBjb21wYXJlQnlGaWVsZFNwZWNzKG9iajAsIG9iajEsIGZpZWxkU3BlY3MpIHtcbiAgICBsZXQgaTtcbiAgICBsZXQgY21wO1xuICAgIGZvciAoaSA9IDA7IGkgPCBmaWVsZFNwZWNzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNtcCA9IGNvbXBhcmVCeUZpZWxkU3BlYyhvYmowLCBvYmoxLCBmaWVsZFNwZWNzW2ldKTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgICAgcmV0dXJuIGNtcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlYyhvYmowLCBvYmoxLCBmaWVsZFNwZWMpIHtcbiAgICBpZiAoZmllbGRTcGVjLmZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkU3BlYy5mdW5jKG9iajAsIG9iajEpO1xuICAgIH1cbiAgICByZXR1cm4gZmxleGlibGVDb21wYXJlKG9iajBbZmllbGRTcGVjLmZpZWxkXSwgb2JqMVtmaWVsZFNwZWMuZmllbGRdKVxuICAgICAgICAqIChmaWVsZFNwZWMub3JkZXIgfHwgMSk7XG59XG5mdW5jdGlvbiBmbGV4aWJsZUNvbXBhcmUoYSwgYikge1xuICAgIGlmICghYSAmJiAhYikge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChhID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoYSkubG9jYWxlQ29tcGFyZShTdHJpbmcoYikpO1xuICAgIH1cbiAgICByZXR1cm4gYSAtIGI7XG59XG4vKiBTdHJpbmcgVXRpbGl0aWVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHBhZFN0YXJ0KHZhbCwgbGVuKSB7XG4gICAgbGV0IHMgPSBTdHJpbmcodmFsKTtcbiAgICByZXR1cm4gJzAwMCcuc3Vic3RyKDAsIGxlbiAtIHMubGVuZ3RoKSArIHM7XG59XG5mdW5jdGlvbiBmb3JtYXRXaXRoT3JkaW5hbHMoZm9ybWF0dGVyLCBhcmdzLCBmYWxsYmFja1RleHQpIHtcbiAgICBpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVyKC4uLmFyZ3MpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ3N0cmluZycpIHsgLy8gbm9uLWJsYW5rIHN0cmluZ1xuICAgICAgICByZXR1cm4gYXJncy5yZWR1Y2UoKHN0ciwgYXJnLCBpbmRleCkgPT4gKHN0ci5yZXBsYWNlKCckJyArIGluZGV4LCBhcmcgfHwgJycpKSwgZm9ybWF0dGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbi8qIE51bWJlciBVdGlsaXRpZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gY29tcGFyZU51bWJlcnMoYSwgYikge1xuICAgIHJldHVybiBhIC0gYjtcbn1cbmZ1bmN0aW9uIGlzSW50KG4pIHtcbiAgICByZXR1cm4gbiAlIDEgPT09IDA7XG59XG4vKiBGQy1zcGVjaWZpYyBET00gZGltZW5zaW9uIHN0dWZmXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIGNvbXB1dGVTbWFsbGVzdENlbGxXaWR0aChjZWxsRWwpIHtcbiAgICBsZXQgYWxsV2lkdGhFbCA9IGNlbGxFbC5xdWVyeVNlbGVjdG9yKCcuZmMtc2Nyb2xsZ3JpZC1zaHJpbmstZnJhbWUnKTtcbiAgICBsZXQgY29udGVudFdpZHRoRWwgPSBjZWxsRWwucXVlcnlTZWxlY3RvcignLmZjLXNjcm9sbGdyaWQtc2hyaW5rLWN1c2hpb24nKTtcbiAgICBpZiAoIWFsbFdpZHRoRWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWVkcyBmYy1zY3JvbGxncmlkLXNocmluay1mcmFtZSBjbGFzc05hbWUnKTsgLy8gVE9ETzogdXNlIGNvbnN0XG4gICAgfVxuICAgIGlmICghY29udGVudFdpZHRoRWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCduZWVkcyBmYy1zY3JvbGxncmlkLXNocmluay1jdXNoaW9uIGNsYXNzTmFtZScpO1xuICAgIH1cbiAgICByZXR1cm4gY2VsbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gYWxsV2lkdGhFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCArIC8vIHRoZSBjZWxsIHBhZGRpbmcrYm9yZGVyXG4gICAgICAgIGNvbnRlbnRXaWR0aEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xufVxuXG5jb25zdCBJTlRFUk5BTF9VTklUUyA9IFsneWVhcnMnLCAnbW9udGhzJywgJ2RheXMnLCAnbWlsbGlzZWNvbmRzJ107XG5jb25zdCBQQVJTRV9SRSA9IC9eKC0/KSg/OihcXGQrKVxcLik/KFxcZCspOihcXGRcXGQpKD86OihcXGRcXGQpKD86XFwuKFxcZFxcZFxcZCkpPyk/Lztcbi8vIFBhcnNpbmcgYW5kIENyZWF0aW9uXG5mdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwgdW5pdCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZyhpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByZXR1cm4gcGFyc2VPYmplY3QoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gcGFyc2VPYmplY3QoeyBbdW5pdCB8fCAnbWlsbGlzZWNvbmRzJ106IGlucHV0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nKHMpIHtcbiAgICBsZXQgbSA9IFBBUlNFX1JFLmV4ZWMocyk7XG4gICAgaWYgKG0pIHtcbiAgICAgICAgbGV0IHNpZ24gPSBtWzFdID8gLTEgOiAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgICAgICBtb250aHM6IDAsXG4gICAgICAgICAgICBkYXlzOiBzaWduICogKG1bMl0gPyBwYXJzZUludChtWzJdLCAxMCkgOiAwKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogc2lnbiAqICgobVszXSA/IHBhcnNlSW50KG1bM10sIDEwKSA6IDApICogNjAgKiA2MCAqIDEwMDAgKyAvLyBob3Vyc1xuICAgICAgICAgICAgICAgIChtWzRdID8gcGFyc2VJbnQobVs0XSwgMTApIDogMCkgKiA2MCAqIDEwMDAgKyAvLyBtaW51dGVzXG4gICAgICAgICAgICAgICAgKG1bNV0gPyBwYXJzZUludChtWzVdLCAxMCkgOiAwKSAqIDEwMDAgKyAvLyBzZWNvbmRzXG4gICAgICAgICAgICAgICAgKG1bNl0gPyBwYXJzZUludChtWzZdLCAxMCkgOiAwKSAvLyBtc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBwYXJzZU9iamVjdChvYmopIHtcbiAgICBsZXQgZHVyYXRpb24gPSB7XG4gICAgICAgIHllYXJzOiBvYmoueWVhcnMgfHwgb2JqLnllYXIgfHwgMCxcbiAgICAgICAgbW9udGhzOiBvYmoubW9udGhzIHx8IG9iai5tb250aCB8fCAwLFxuICAgICAgICBkYXlzOiBvYmouZGF5cyB8fCBvYmouZGF5IHx8IDAsXG4gICAgICAgIG1pbGxpc2Vjb25kczogKG9iai5ob3VycyB8fCBvYmouaG91ciB8fCAwKSAqIDYwICogNjAgKiAxMDAwICsgLy8gaG91cnNcbiAgICAgICAgICAgIChvYmoubWludXRlcyB8fCBvYmoubWludXRlIHx8IDApICogNjAgKiAxMDAwICsgLy8gbWludXRlc1xuICAgICAgICAgICAgKG9iai5zZWNvbmRzIHx8IG9iai5zZWNvbmQgfHwgMCkgKiAxMDAwICsgLy8gc2Vjb25kc1xuICAgICAgICAgICAgKG9iai5taWxsaXNlY29uZHMgfHwgb2JqLm1pbGxpc2Vjb25kIHx8IG9iai5tcyB8fCAwKSwgLy8gbXNcbiAgICB9O1xuICAgIGxldCB3ZWVrcyA9IG9iai53ZWVrcyB8fCBvYmoud2VlaztcbiAgICBpZiAod2Vla3MpIHtcbiAgICAgICAgZHVyYXRpb24uZGF5cyArPSB3ZWVrcyAqIDc7XG4gICAgICAgIGR1cmF0aW9uLnNwZWNpZmllZFdlZWtzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGR1cmF0aW9uO1xufVxuLy8gRXF1YWxpdHlcbmZ1bmN0aW9uIGR1cmF0aW9uc0VxdWFsKGQwLCBkMSkge1xuICAgIHJldHVybiBkMC55ZWFycyA9PT0gZDEueWVhcnMgJiZcbiAgICAgICAgZDAubW9udGhzID09PSBkMS5tb250aHMgJiZcbiAgICAgICAgZDAuZGF5cyA9PT0gZDEuZGF5cyAmJlxuICAgICAgICBkMC5taWxsaXNlY29uZHMgPT09IGQxLm1pbGxpc2Vjb25kcztcbn1cbmZ1bmN0aW9uIGFzQ2xlYW5EYXlzKGR1cikge1xuICAgIGlmICghZHVyLnllYXJzICYmICFkdXIubW9udGhzICYmICFkdXIubWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIHJldHVybiBkdXIuZGF5cztcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG4vLyBTaW1wbGUgTWF0aFxuZnVuY3Rpb24gYWRkRHVyYXRpb25zKGQwLCBkMSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiBkMC55ZWFycyArIGQxLnllYXJzLFxuICAgICAgICBtb250aHM6IGQwLm1vbnRocyArIGQxLm1vbnRocyxcbiAgICAgICAgZGF5czogZDAuZGF5cyArIGQxLmRheXMsXG4gICAgICAgIG1pbGxpc2Vjb25kczogZDAubWlsbGlzZWNvbmRzICsgZDEubWlsbGlzZWNvbmRzLFxuICAgIH07XG59XG5mdW5jdGlvbiBzdWJ0cmFjdER1cmF0aW9ucyhkMSwgZDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB5ZWFyczogZDEueWVhcnMgLSBkMC55ZWFycyxcbiAgICAgICAgbW9udGhzOiBkMS5tb250aHMgLSBkMC5tb250aHMsXG4gICAgICAgIGRheXM6IGQxLmRheXMgLSBkMC5kYXlzLFxuICAgICAgICBtaWxsaXNlY29uZHM6IGQxLm1pbGxpc2Vjb25kcyAtIGQwLm1pbGxpc2Vjb25kcyxcbiAgICB9O1xufVxuZnVuY3Rpb24gbXVsdGlwbHlEdXJhdGlvbihkLCBuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IGQueWVhcnMgKiBuLFxuICAgICAgICBtb250aHM6IGQubW9udGhzICogbixcbiAgICAgICAgZGF5czogZC5kYXlzICogbixcbiAgICAgICAgbWlsbGlzZWNvbmRzOiBkLm1pbGxpc2Vjb25kcyAqIG4sXG4gICAgfTtcbn1cbi8vIENvbnZlcnNpb25zXG4vLyBcIlJvdWdoXCIgYmVjYXVzZSB0aGV5IGFyZSBiYXNlZCBvbiBhdmVyYWdlLWNhc2UgR3JlZ29yaWFuIG1vbnRocy95ZWFyc1xuZnVuY3Rpb24gYXNSb3VnaFllYXJzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoRGF5cyhkdXIpIC8gMzY1O1xufVxuZnVuY3Rpb24gYXNSb3VnaE1vbnRocyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaERheXMoZHVyKSAvIDMwO1xufVxuZnVuY3Rpb24gYXNSb3VnaERheXMoZHVyKSB7XG4gICAgcmV0dXJuIGFzUm91Z2hNcyhkdXIpIC8gODY0ZTU7XG59XG5mdW5jdGlvbiBhc1JvdWdoTWludXRlcyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaE1zKGR1cikgLyAoMTAwMCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGFzUm91Z2hTZWNvbmRzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoTXMoZHVyKSAvIDEwMDA7XG59XG5mdW5jdGlvbiBhc1JvdWdoTXMoZHVyKSB7XG4gICAgcmV0dXJuIGR1ci55ZWFycyAqICgzNjUgKiA4NjRlNSkgK1xuICAgICAgICBkdXIubW9udGhzICogKDMwICogODY0ZTUpICtcbiAgICAgICAgZHVyLmRheXMgKiA4NjRlNSArXG4gICAgICAgIGR1ci5taWxsaXNlY29uZHM7XG59XG4vLyBBZHZhbmNlZCBNYXRoXG5mdW5jdGlvbiB3aG9sZURpdmlkZUR1cmF0aW9ucyhudW1lcmF0b3IsIGRlbm9taW5hdG9yKSB7XG4gICAgbGV0IHJlcyA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBJTlRFUk5BTF9VTklUUy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZXQgdW5pdCA9IElOVEVSTkFMX1VOSVRTW2ldO1xuICAgICAgICBpZiAoZGVub21pbmF0b3JbdW5pdF0pIHtcbiAgICAgICAgICAgIGxldCBsb2NhbFJlcyA9IG51bWVyYXRvclt1bml0XSAvIGRlbm9taW5hdG9yW3VuaXRdO1xuICAgICAgICAgICAgaWYgKCFpc0ludChsb2NhbFJlcykgfHwgKHJlcyAhPT0gbnVsbCAmJiByZXMgIT09IGxvY2FsUmVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzID0gbG9jYWxSZXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobnVtZXJhdG9yW3VuaXRdKSB7XG4gICAgICAgICAgICAvLyBuZWVkcyB0byBkaXZpZGUgYnkgc29tZXRoaW5nIGJ1dCBjYW4ndCFcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyKSB7XG4gICAgbGV0IG1zID0gZHVyLm1pbGxpc2Vjb25kcztcbiAgICBpZiAobXMpIHtcbiAgICAgICAgaWYgKG1zICUgMTAwMCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IG1zIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCkgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdzZWNvbmQnLCB2YWx1ZTogbXMgLyAxMDAwIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zICUgKDEwMDAgKiA2MCAqIDYwKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21pbnV0ZScsIHZhbHVlOiBtcyAvICgxMDAwICogNjApIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1zKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnaG91cicsIHZhbHVlOiBtcyAvICgxMDAwICogNjAgKiA2MCkgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoZHVyLmRheXMpIHtcbiAgICAgICAgaWYgKGR1ci5zcGVjaWZpZWRXZWVrcyAmJiBkdXIuZGF5cyAlIDcgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd3ZWVrJywgdmFsdWU6IGR1ci5kYXlzIC8gNyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHVuaXQ6ICdkYXknLCB2YWx1ZTogZHVyLmRheXMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci5tb250aHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21vbnRoJywgdmFsdWU6IGR1ci5tb250aHMgfTtcbiAgICB9XG4gICAgaWYgKGR1ci55ZWFycykge1xuICAgICAgICByZXR1cm4geyB1bml0OiAneWVhcicsIHZhbHVlOiBkdXIueWVhcnMgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdW5pdDogJ21pbGxpc2Vjb25kJywgdmFsdWU6IDAgfTtcbn1cblxuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbi8vIE1lcmdlcyBhbiBhcnJheSBvZiBvYmplY3RzIGludG8gYSBzaW5nbGUgb2JqZWN0LlxuLy8gVGhlIHNlY29uZCBhcmd1bWVudCBhbGxvd3MgZm9yIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHdobydzIG9iamVjdCB2YWx1ZXMgd2lsbCBiZSBtZXJnZWQgdG9nZXRoZXIuXG5mdW5jdGlvbiBtZXJnZVByb3BzKHByb3BPYmpzLCBjb21wbGV4UHJvcHNNYXApIHtcbiAgICBsZXQgZGVzdCA9IHt9O1xuICAgIGlmIChjb21wbGV4UHJvcHNNYXApIHtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBjb21wbGV4UHJvcHNNYXApIHtcbiAgICAgICAgICAgIGlmIChjb21wbGV4UHJvcHNNYXBbbmFtZV0gPT09IGlzTWF5YmVPYmplY3RzRXF1YWwpIHsgLy8gaW1wbGllcyB0aGF0IGl0J3Mgb2JqZWN0LW1lcmdlYWJsZVxuICAgICAgICAgICAgICAgIGxldCBjb21wbGV4T2JqcyA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgdGhlIHRyYWlsaW5nIG9iamVjdCB2YWx1ZXMsIHN0b3BwaW5nIHdoZW4gYSBub24tb2JqZWN0IGlzIGRpc2NvdmVyZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcHJvcE9ianMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHByb3BPYmpzW2ldW25hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsKSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleE9ianMudW5zaGlmdCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W25hbWVdID0gdmFsOyAvLyBpZiB0aGVyZSB3ZXJlIG5vIG9iamVjdHMsIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdHJhaWxpbmcgdmFsdWVzIHdlcmUgb2JqZWN0cywgdXNlIHRoZSBtZXJnZWQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAoY29tcGxleE9ianMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc3RbbmFtZV0gPSBtZXJnZVByb3BzKGNvbXBsZXhPYmpzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY29weSB2YWx1ZXMgaW50byB0aGUgZGVzdGluYXRpb24sIGdvaW5nIGZyb20gbGFzdCB0byBmaXJzdFxuICAgIGZvciAobGV0IGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBsZXQgcHJvcHMgPSBwcm9wT2Jqc1tpXTtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBwcm9wcykge1xuICAgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSkgeyAvLyBpZiBhbHJlYWR5IGFzc2lnbmVkIGJ5IHByZXZpb3VzIHByb3BzIG9yIGNvbXBsZXggcHJvcHMsIGRvbid0IHJlYXNzaWduXG4gICAgICAgICAgICAgICAgZGVzdFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXN0O1xufVxuZnVuY3Rpb24gZmlsdGVySGFzaChoYXNoLCBmdW5jKSB7XG4gICAgbGV0IGZpbHRlcmVkID0ge307XG4gICAgZm9yIChsZXQga2V5IGluIGhhc2gpIHtcbiAgICAgICAgaWYgKGZ1bmMoaGFzaFtrZXldLCBrZXkpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrZXldID0gaGFzaFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJlZDtcbn1cbmZ1bmN0aW9uIG1hcEhhc2goaGFzaCwgZnVuYykge1xuICAgIGxldCBuZXdIYXNoID0ge307XG4gICAgZm9yIChsZXQga2V5IGluIGhhc2gpIHtcbiAgICAgICAgbmV3SGFzaFtrZXldID0gZnVuYyhoYXNoW2tleV0sIGtleSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdIYXNoO1xufVxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYSkge1xuICAgIGxldCBoYXNoID0ge307XG4gICAgZm9yIChsZXQgaXRlbSBvZiBhKSB7XG4gICAgICAgIGhhc2hbaXRlbV0gPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaDtcbn1cbi8vIFRPRE86IHJlYXNzZXNzIGJyb3dzZXIgc3VwcG9ydFxuLy8gaHR0cHM6Ly9jYW5pdXNlLmNvbS8/c2VhcmNoPW9iamVjdC52YWx1ZXNcbmZ1bmN0aW9uIGhhc2hWYWx1ZXNUb0FycmF5KG9iaikge1xuICAgIGxldCBhID0gW107XG4gICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICBhLnB1c2gob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbn1cbmZ1bmN0aW9uIGlzUHJvcHNFcXVhbChvYmowLCBvYmoxKSB7XG4gICAgaWYgKG9iajAgPT09IG9iajEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBvYmowKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajAsIGtleSkpIHtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBvYmoxKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqMSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmoxLCBrZXkpKSB7XG4gICAgICAgICAgICBpZiAob2JqMFtrZXldICE9PSBvYmoxW2tleV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBIQU5ETEVSX1JFID0gL15vbltBLVpdLztcbmZ1bmN0aW9uIGlzTm9uSGFuZGxlclByb3BzRXF1YWwob2JqMCwgb2JqMSkge1xuICAgIGNvbnN0IGtleXMgPSBnZXRVbmVxdWFsUHJvcHMob2JqMCwgb2JqMSk7XG4gICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKCFIQU5ETEVSX1JFLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZ2V0VW5lcXVhbFByb3BzKG9iajAsIG9iajEpIHtcbiAgICBsZXQga2V5cyA9IFtdO1xuICAgIGZvciAobGV0IGtleSBpbiBvYmowKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajAsIGtleSkpIHtcbiAgICAgICAgICAgIGlmICghKGtleSBpbiBvYmoxKSkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChvYmowW2tleV0gIT09IG9iajFba2V5XSkge1xuICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gY29tcGFyZU9ianMob2xkUHJvcHMsIG5ld1Byb3BzLCBlcXVhbGl0eUZ1bmNzID0ge30pIHtcbiAgICBpZiAob2xkUHJvcHMgPT09IG5ld1Byb3BzKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBmb3IgKGxldCBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaWYgKGtleSBpbiBvbGRQcm9wcyAmJiBpc09ialZhbHNFcXVhbChvbGRQcm9wc1trZXldLCBuZXdQcm9wc1trZXldLCBlcXVhbGl0eUZ1bmNzW2tleV0pKSA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGZvciBwcm9wcyB0aGF0IHdlcmUgb21pdHRlZCBpbiB0aGUgbmV3XG4gICAgZm9yIChsZXQga2V5IGluIG9sZFByb3BzKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBuZXdQcm9wcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8qXG5hc3N1bWVkIFwidHJ1ZVwiIGVxdWFsaXR5IGZvciBoYW5kbGVyIG5hbWVzIGxpa2UgXCJvblJlY2VpdmVTb21ldGhpbmdcIlxuKi9cbmZ1bmN0aW9uIGlzT2JqVmFsc0VxdWFsKHZhbDAsIHZhbDEsIGNvbXBhcmF0b3IpIHtcbiAgICBpZiAodmFsMCA9PT0gdmFsMSB8fCBjb21wYXJhdG9yID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcih2YWwwLCB2YWwxKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY29sbGVjdEZyb21IYXNoKGhhc2gsIHN0YXJ0SW5kZXggPSAwLCBlbmRJbmRleCwgc3RlcCA9IDEpIHtcbiAgICBsZXQgcmVzID0gW107XG4gICAgaWYgKGVuZEluZGV4ID09IG51bGwpIHtcbiAgICAgICAgZW5kSW5kZXggPSBPYmplY3Qua2V5cyhoYXNoKS5sZW5ndGg7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkgKz0gc3RlcCkge1xuICAgICAgICBsZXQgdmFsID0gaGFzaFtpXTtcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7IC8vIHdpbGwgZGlzcmVnYXJkIHVuZGVmaW5lZCBmb3Igc3BhcnNlIGFycmF5c1xuICAgICAgICAgICAgcmVzLnB1c2godmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBUT0RPOiBuZXcgdXRpbCBhcnJheWlmeT9cbmZ1bmN0aW9uIHJlbW92ZUV4YWN0KGFycmF5LCBleGFjdFZhbCkge1xuICAgIGxldCByZW1vdmVDbnQgPSAwO1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFycmF5Lmxlbmd0aCkge1xuICAgICAgICBpZiAoYXJyYXlbaV0gPT09IGV4YWN0VmFsKSB7XG4gICAgICAgICAgICBhcnJheS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICByZW1vdmVDbnQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlQ250O1xufVxuZnVuY3Rpb24gaXNBcnJheXNFcXVhbChhMCwgYTEsIGVxdWFsaXR5RnVuYykge1xuICAgIGlmIChhMCA9PT0gYTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBsZW4gPSBhMC5sZW5ndGg7XG4gICAgbGV0IGk7XG4gICAgaWYgKGxlbiAhPT0gYTEubGVuZ3RoKSB7IC8vIG5vdCBhcnJheT8gb3Igbm90IHNhbWUgbGVuZ3RoP1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBpZiAoIShlcXVhbGl0eUZ1bmMgPyBlcXVhbGl0eUZ1bmMoYTBbaV0sIGExW2ldKSA6IGEwW2ldID09PSBhMVtpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgREFZX0lEUyA9IFsnc3VuJywgJ21vbicsICd0dWUnLCAnd2VkJywgJ3RodScsICdmcmknLCAnc2F0J107XG4vLyBBZGRpbmdcbmZ1bmN0aW9uIGFkZFdlZWtzKG0sIG4pIHtcbiAgICBsZXQgYSA9IGRhdGVUb1V0Y0FycmF5KG0pO1xuICAgIGFbMl0gKz0gbiAqIDc7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGEpO1xufVxuZnVuY3Rpb24gYWRkRGF5cyhtLCBuKSB7XG4gICAgbGV0IGEgPSBkYXRlVG9VdGNBcnJheShtKTtcbiAgICBhWzJdICs9IG47XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGEpO1xufVxuZnVuY3Rpb24gYWRkTXMobSwgbikge1xuICAgIGxldCBhID0gZGF0ZVRvVXRjQXJyYXkobSk7XG4gICAgYVs2XSArPSBuO1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShhKTtcbn1cbi8vIERpZmZpbmcgKGFsbCByZXR1cm4gZmxvYXRzKVxuLy8gVE9ETzogd2h5IG5vdCB1c2UgcmFuZ2VzP1xuZnVuY3Rpb24gZGlmZldlZWtzKG0wLCBtMSkge1xuICAgIHJldHVybiBkaWZmRGF5cyhtMCwgbTEpIC8gNztcbn1cbmZ1bmN0aW9uIGRpZmZEYXlzKG0wLCBtMSkge1xuICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvICgxMDAwICogNjAgKiA2MCAqIDI0KTtcbn1cbmZ1bmN0aW9uIGRpZmZIb3VycyhtMCwgbTEpIHtcbiAgICByZXR1cm4gKG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSkgLyAoMTAwMCAqIDYwICogNjApO1xufVxuZnVuY3Rpb24gZGlmZk1pbnV0ZXMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gKDEwMDAgKiA2MCk7XG59XG5mdW5jdGlvbiBkaWZmU2Vjb25kcyhtMCwgbTEpIHtcbiAgICByZXR1cm4gKG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSkgLyAxMDAwO1xufVxuZnVuY3Rpb24gZGlmZkRheUFuZFRpbWUobTAsIG0xKSB7XG4gICAgbGV0IG0wZGF5ID0gc3RhcnRPZkRheShtMCk7XG4gICAgbGV0IG0xZGF5ID0gc3RhcnRPZkRheShtMSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgIG1vbnRoczogMCxcbiAgICAgICAgZGF5czogTWF0aC5yb3VuZChkaWZmRGF5cyhtMGRheSwgbTFkYXkpKSxcbiAgICAgICAgbWlsbGlzZWNvbmRzOiAobTEudmFsdWVPZigpIC0gbTFkYXkudmFsdWVPZigpKSAtIChtMC52YWx1ZU9mKCkgLSBtMGRheS52YWx1ZU9mKCkpLFxuICAgIH07XG59XG4vLyBEaWZmaW5nIFdob2xlIFVuaXRzXG5mdW5jdGlvbiBkaWZmV2hvbGVXZWVrcyhtMCwgbTEpIHtcbiAgICBsZXQgZCA9IGRpZmZXaG9sZURheXMobTAsIG0xKTtcbiAgICBpZiAoZCAhPT0gbnVsbCAmJiBkICUgNyA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZCAvIDc7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZGlmZldob2xlRGF5cyhtMCwgbTEpIHtcbiAgICBpZiAodGltZUFzTXMobTApID09PSB0aW1lQXNNcyhtMSkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZGlmZkRheXMobTAsIG0xKSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8gU3RhcnQtT2ZcbmZ1bmN0aW9uIHN0YXJ0T2ZEYXkobSkge1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShbXG4gICAgICAgIG0uZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgbS5nZXRVVENNb250aCgpLFxuICAgICAgICBtLmdldFVUQ0RhdGUoKSxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHN0YXJ0T2ZIb3VyKG0pIHtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoW1xuICAgICAgICBtLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIG0uZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgbS5nZXRVVENEYXRlKCksXG4gICAgICAgIG0uZ2V0VVRDSG91cnMoKSxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHN0YXJ0T2ZNaW51dGUobSkge1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShbXG4gICAgICAgIG0uZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgbS5nZXRVVENNb250aCgpLFxuICAgICAgICBtLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgbS5nZXRVVENIb3VycygpLFxuICAgICAgICBtLmdldFVUQ01pbnV0ZXMoKSxcbiAgICBdKTtcbn1cbmZ1bmN0aW9uIHN0YXJ0T2ZTZWNvbmQobSkge1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShbXG4gICAgICAgIG0uZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgbS5nZXRVVENNb250aCgpLFxuICAgICAgICBtLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgbS5nZXRVVENIb3VycygpLFxuICAgICAgICBtLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgICAgbS5nZXRVVENTZWNvbmRzKCksXG4gICAgXSk7XG59XG4vLyBXZWVrIENvbXB1dGF0aW9uXG5mdW5jdGlvbiB3ZWVrT2ZZZWFyKG1hcmtlciwgZG93LCBkb3kpIHtcbiAgICBsZXQgeSA9IG1hcmtlci5nZXRVVENGdWxsWWVhcigpO1xuICAgIGxldCB3ID0gd2Vla09mR2l2ZW5ZZWFyKG1hcmtlciwgeSwgZG93LCBkb3kpO1xuICAgIGlmICh3IDwgMSkge1xuICAgICAgICByZXR1cm4gd2Vla09mR2l2ZW5ZZWFyKG1hcmtlciwgeSAtIDEsIGRvdywgZG95KTtcbiAgICB9XG4gICAgbGV0IG5leHRXID0gd2Vla09mR2l2ZW5ZZWFyKG1hcmtlciwgeSArIDEsIGRvdywgZG95KTtcbiAgICBpZiAobmV4dFcgPj0gMSkge1xuICAgICAgICByZXR1cm4gTWF0aC5taW4odywgbmV4dFcpO1xuICAgIH1cbiAgICByZXR1cm4gdztcbn1cbmZ1bmN0aW9uIHdlZWtPZkdpdmVuWWVhcihtYXJrZXIsIHllYXIsIGRvdywgZG95KSB7XG4gICAgbGV0IGZpcnN0V2Vla1N0YXJ0ID0gYXJyYXlUb1V0Y0RhdGUoW3llYXIsIDAsIDEgKyBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpXSk7XG4gICAgbGV0IGRheVN0YXJ0ID0gc3RhcnRPZkRheShtYXJrZXIpO1xuICAgIGxldCBkYXlzID0gTWF0aC5yb3VuZChkaWZmRGF5cyhmaXJzdFdlZWtTdGFydCwgZGF5U3RhcnQpKTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzIC8gNykgKyAxOyAvLyB6ZXJvLWluZGV4ZWRcbn1cbi8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG5mdW5jdGlvbiBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpIHtcbiAgICAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICBsZXQgZndkID0gNyArIGRvdyAtIGRveTtcbiAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgbGV0IGZ3ZGx3ID0gKDcgKyBhcnJheVRvVXRjRGF0ZShbeWVhciwgMCwgZndkXSkuZ2V0VVRDRGF5KCkgLSBkb3cpICUgNztcbiAgICByZXR1cm4gLWZ3ZGx3ICsgZndkIC0gMTtcbn1cbi8vIEFycmF5IENvbnZlcnNpb25cbmZ1bmN0aW9uIGRhdGVUb0xvY2FsQXJyYXkoZGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRNb250aCgpLFxuICAgICAgICBkYXRlLmdldERhdGUoKSxcbiAgICAgICAgZGF0ZS5nZXRIb3VycygpLFxuICAgICAgICBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICAgICAgZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICAgIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgXTtcbn1cbmZ1bmN0aW9uIGFycmF5VG9Mb2NhbERhdGUoYSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShhWzBdLCBhWzFdIHx8IDAsIGFbMl0gPT0gbnVsbCA/IDEgOiBhWzJdLCAvLyBkYXkgb2YgbW9udGhcbiAgICBhWzNdIHx8IDAsIGFbNF0gfHwgMCwgYVs1XSB8fCAwKTtcbn1cbmZ1bmN0aW9uIGRhdGVUb1V0Y0FycmF5KGRhdGUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENEYXRlKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENNaW51dGVzKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDU2Vjb25kcygpLFxuICAgICAgICBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpLFxuICAgIF07XG59XG5mdW5jdGlvbiBhcnJheVRvVXRjRGF0ZShhKSB7XG4gICAgLy8gYWNjb3JkaW5nIHRvIHdlYiBzdGFuZGFyZHMgKGFuZCBTYWZhcmkpLCBhIG1vbnRoIGluZGV4IGlzIHJlcXVpcmVkLlxuICAgIC8vIG1hc3NhZ2UgaWYgb25seSBnaXZlbiBhIHllYXIuXG4gICAgaWYgKGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGEgPSBhLmNvbmNhdChbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoLi4uYSkpO1xufVxuLy8gT3RoZXIgVXRpbHNcbmZ1bmN0aW9uIGlzVmFsaWREYXRlKG0pIHtcbiAgICByZXR1cm4gIWlzTmFOKG0udmFsdWVPZigpKTtcbn1cbmZ1bmN0aW9uIHRpbWVBc01zKG0pIHtcbiAgICByZXR1cm4gbS5nZXRVVENIb3VycygpICogMTAwMCAqIDYwICogNjAgK1xuICAgICAgICBtLmdldFVUQ01pbnV0ZXMoKSAqIDEwMDAgKiA2MCArXG4gICAgICAgIG0uZ2V0VVRDU2Vjb25kcygpICogMTAwMCArXG4gICAgICAgIG0uZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG59XG5cbi8vIHRpbWVab25lT2Zmc2V0IGlzIGluIG1pbnV0ZXNcbmZ1bmN0aW9uIGJ1aWxkSXNvU3RyaW5nKG1hcmtlciwgdGltZVpvbmVPZmZzZXQsIHN0cmlwWmVyb1RpbWUgPSBmYWxzZSkge1xuICAgIGxldCBzID0gbWFya2VyLnRvSVNPU3RyaW5nKCk7XG4gICAgcyA9IHMucmVwbGFjZSgnLjAwMCcsICcnKTtcbiAgICBpZiAoc3RyaXBaZXJvVGltZSkge1xuICAgICAgICBzID0gcy5yZXBsYWNlKCdUMDA6MDA6MDBaJywgJycpO1xuICAgIH1cbiAgICBpZiAocy5sZW5ndGggPiAxMCkgeyAvLyB0aW1lIHBhcnQgd2Fzbid0IHN0cmlwcGVkLCBjYW4gYWRkIHRpbWV6b25lIGluZm9cbiAgICAgICAgaWYgKHRpbWVab25lT2Zmc2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoJ1onLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGltZVpvbmVPZmZzZXQgIT09IDApIHtcbiAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoJ1onLCBmb3JtYXRUaW1lWm9uZU9mZnNldCh0aW1lWm9uZU9mZnNldCwgdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG90aGVyd2lzZSwgaXRzIFVUQy0wIGFuZCB3ZSB3YW50IHRvIGtlZXAgdGhlIFpcbiAgICB9XG4gICAgcmV0dXJuIHM7XG59XG4vLyBmb3JtYXRzIHRoZSBkYXRlLCBidXQgd2l0aCBubyB0aW1lIHBhcnRcbi8vIFRPRE86IHNvbWVob3cgbWVyZ2Ugd2l0aCBidWlsZElzb1N0cmluZyBhbmQgc3RyaXBaZXJvVGltZVxuLy8gVE9ETzogcmVuYW1lLiBvbWl0IFwic3RyaW5nXCJcbmZ1bmN0aW9uIGZvcm1hdERheVN0cmluZyhtYXJrZXIpIHtcbiAgICByZXR1cm4gbWFya2VyLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvVC4qJC8sICcnKTtcbn1cbmZ1bmN0aW9uIGZvcm1hdElzb01vbnRoU3RyKG1hcmtlcikge1xuICAgIHJldHVybiBtYXJrZXIudG9JU09TdHJpbmcoKS5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0vKVswXTtcbn1cbi8vIFRPRE86IHVzZSBEYXRlOjp0b0lTT1N0cmluZyBhbmQgdXNlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIFQ/XG5mdW5jdGlvbiBmb3JtYXRJc29UaW1lU3RyaW5nKG1hcmtlcikge1xuICAgIHJldHVybiBwYWRTdGFydChtYXJrZXIuZ2V0VVRDSG91cnMoKSwgMikgKyAnOicgK1xuICAgICAgICBwYWRTdGFydChtYXJrZXIuZ2V0VVRDTWludXRlcygpLCAyKSArICc6JyArXG4gICAgICAgIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENTZWNvbmRzKCksIDIpO1xufVxuZnVuY3Rpb24gZm9ybWF0VGltZVpvbmVPZmZzZXQobWludXRlcywgZG9Jc28gPSBmYWxzZSkge1xuICAgIGxldCBzaWduID0gbWludXRlcyA8IDAgPyAnLScgOiAnKyc7XG4gICAgbGV0IGFicyA9IE1hdGguYWJzKG1pbnV0ZXMpO1xuICAgIGxldCBob3VycyA9IE1hdGguZmxvb3IoYWJzIC8gNjApO1xuICAgIGxldCBtaW5zID0gTWF0aC5yb3VuZChhYnMgJSA2MCk7XG4gICAgaWYgKGRvSXNvKSB7XG4gICAgICAgIHJldHVybiBgJHtzaWduICsgcGFkU3RhcnQoaG91cnMsIDIpfToke3BhZFN0YXJ0KG1pbnMsIDIpfWA7XG4gICAgfVxuICAgIHJldHVybiBgR01UJHtzaWdufSR7aG91cnN9JHttaW5zID8gYDoke3BhZFN0YXJ0KG1pbnMsIDIpfWAgOiAnJ31gO1xufVxuXG5mdW5jdGlvbiBtZW1vaXplKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICBsZXQgY3VycmVudEFyZ3M7XG4gICAgbGV0IGN1cnJlbnRSZXM7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5uZXdBcmdzKSB7XG4gICAgICAgIGlmICghY3VycmVudEFyZ3MpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZXMgPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFpc0FycmF5c0VxdWFsKGN1cnJlbnRBcmdzLCBuZXdBcmdzKSkge1xuICAgICAgICAgICAgaWYgKHRlYXJkb3duRnVuYykge1xuICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXMgPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ3MpO1xuICAgICAgICAgICAgaWYgKCFyZXNFcXVhbGl0eSB8fCAhcmVzRXF1YWxpdHkocmVzLCBjdXJyZW50UmVzKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSZXMgPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZ3MgPSBuZXdBcmdzO1xuICAgICAgICByZXR1cm4gY3VycmVudFJlcztcbiAgICB9O1xufVxuZnVuY3Rpb24gbWVtb2l6ZU9iakFyZyh3b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgbGV0IGN1cnJlbnRBcmc7XG4gICAgbGV0IGN1cnJlbnRSZXM7XG4gICAgcmV0dXJuIChuZXdBcmcpID0+IHtcbiAgICAgICAgaWYgKCFjdXJyZW50QXJnKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVzID0gd29ya2VyRnVuYy5jYWxsKHRoaXMsIG5ld0FyZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzUHJvcHNFcXVhbChjdXJyZW50QXJnLCBuZXdBcmcpKSB7XG4gICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlcyA9IHdvcmtlckZ1bmMuY2FsbCh0aGlzLCBuZXdBcmcpO1xuICAgICAgICAgICAgaWYgKCFyZXNFcXVhbGl0eSB8fCAhcmVzRXF1YWxpdHkocmVzLCBjdXJyZW50UmVzKSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRSZXMgPSByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZyA9IG5ld0FyZztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXM7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lbW9pemVBcnJheWxpa2UoLy8gdXNlZCBhdCBhbGw/XG53b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgbGV0IGN1cnJlbnRBcmdTZXRzID0gW107XG4gICAgbGV0IGN1cnJlbnRSZXN1bHRzID0gW107XG4gICAgcmV0dXJuIChuZXdBcmdTZXRzKSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50TGVuID0gY3VycmVudEFyZ1NldHMubGVuZ3RoO1xuICAgICAgICBsZXQgbmV3TGVuID0gbmV3QXJnU2V0cy5sZW5ndGg7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yICg7IGkgPCBjdXJyZW50TGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICghbmV3QXJnU2V0c1tpXSkgeyAvLyBvbmUgb2YgdGhlIG9sZCBzZXRzIG5vIGxvbmdlciBleGlzdHNcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzdWx0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzQXJyYXlzRXF1YWwoY3VycmVudEFyZ1NldHNbaV0sIG5ld0FyZ1NldHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlYXJkb3duRnVuYykge1xuICAgICAgICAgICAgICAgICAgICB0ZWFyZG93bkZ1bmMoY3VycmVudFJlc3VsdHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzID0gd29ya2VyRnVuYy5hcHBseSh0aGlzLCBuZXdBcmdTZXRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXN1bHRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UmVzdWx0c1tpXSA9IHJlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IGkgPCBuZXdMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY3VycmVudFJlc3VsdHNbaV0gPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ1NldHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRBcmdTZXRzID0gbmV3QXJnU2V0cztcbiAgICAgICAgY3VycmVudFJlc3VsdHMuc3BsaWNlKG5ld0xlbik7IC8vIHJlbW92ZSBleGNlc3NcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXN1bHRzO1xuICAgIH07XG59XG5mdW5jdGlvbiBtZW1vaXplSGFzaGxpa2Uod29ya2VyRnVuYywgcmVzRXF1YWxpdHksIHRlYXJkb3duRnVuYykge1xuICAgIGxldCBjdXJyZW50QXJnSGFzaCA9IHt9O1xuICAgIGxldCBjdXJyZW50UmVzSGFzaCA9IHt9O1xuICAgIHJldHVybiAobmV3QXJnSGFzaCkgPT4ge1xuICAgICAgICBsZXQgbmV3UmVzSGFzaCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbmV3QXJnSGFzaCkge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50UmVzSGFzaFtrZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gd29ya2VyRnVuYy5hcHBseSh0aGlzLCBuZXdBcmdIYXNoW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzQXJyYXlzRXF1YWwoY3VycmVudEFyZ0hhc2hba2V5XSwgbmV3QXJnSGFzaFtrZXldKSkge1xuICAgICAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXNIYXNoW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgcmVzID0gd29ya2VyRnVuYy5hcHBseSh0aGlzLCBuZXdBcmdIYXNoW2tleV0pO1xuICAgICAgICAgICAgICAgIG5ld1Jlc0hhc2hba2V5XSA9IChyZXNFcXVhbGl0eSAmJiByZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXNIYXNoW2tleV0pKVxuICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnRSZXNIYXNoW2tleV1cbiAgICAgICAgICAgICAgICAgICAgOiByZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXdSZXNIYXNoW2tleV0gPSBjdXJyZW50UmVzSGFzaFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRBcmdIYXNoID0gbmV3QXJnSGFzaDtcbiAgICAgICAgY3VycmVudFJlc0hhc2ggPSBuZXdSZXNIYXNoO1xuICAgICAgICByZXR1cm4gbmV3UmVzSGFzaDtcbiAgICB9O1xufVxuXG5jb25zdCBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUyA9IHtcbiAgICB3ZWVrOiAzLFxuICAgIHNlcGFyYXRvcjogMCxcbiAgICBvbWl0WmVyb01pbnV0ZTogMCxcbiAgICBtZXJpZGllbTogMCxcbiAgICBvbWl0Q29tbWFzOiAwLFxufTtcbmNvbnN0IFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTID0ge1xuICAgIHRpbWVab25lTmFtZTogNyxcbiAgICBlcmE6IDYsXG4gICAgeWVhcjogNSxcbiAgICBtb250aDogNCxcbiAgICBkYXk6IDIsXG4gICAgd2Vla2RheTogMixcbiAgICBob3VyOiAxLFxuICAgIG1pbnV0ZTogMSxcbiAgICBzZWNvbmQ6IDEsXG59O1xuY29uc3QgTUVSSURJRU1fUkUgPSAvXFxzKihbYXBdKVxcLj9tXFwuPy9pOyAvLyBlYXRzIHVwIGxlYWRpbmcgc3BhY2VzIHRvb1xuY29uc3QgQ09NTUFfUkUgPSAvLC9nOyAvLyB3ZSBuZWVkIHJlIGZvciBnbG9iYWxuZXNzXG5jb25zdCBNVUxUSV9TUEFDRV9SRSA9IC9cXHMrL2c7XG5jb25zdCBMVFJfUkUgPSAvXFx1MjAwZS9nOyAvLyBjb250cm9sIGNoYXJhY3RlclxuY29uc3QgVVRDX1JFID0gL1VUQ3xHTVQvO1xuY2xhc3MgTmF0aXZlRm9ybWF0dGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihmb3JtYXRTZXR0aW5ncykge1xuICAgICAgICBsZXQgc3RhbmRhcmREYXRlUHJvcHMgPSB7fTtcbiAgICAgICAgbGV0IGV4dGVuZGVkU2V0dGluZ3MgPSB7fTtcbiAgICAgICAgbGV0IHNldmVyaXR5ID0gMDtcbiAgICAgICAgZm9yIChsZXQgbmFtZSBpbiBmb3JtYXRTZXR0aW5ncykge1xuICAgICAgICAgICAgaWYgKG5hbWUgaW4gRVhURU5ERURfU0VUVElOR1NfQU5EX1NFVkVSSVRJRVMpIHtcbiAgICAgICAgICAgICAgICBleHRlbmRlZFNldHRpbmdzW25hbWVdID0gZm9ybWF0U2V0dGluZ3NbbmFtZV07XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHkgPSBNYXRoLm1heChFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFU1tuYW1lXSwgc2V2ZXJpdHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RhbmRhcmREYXRlUHJvcHNbbmFtZV0gPSBmb3JtYXRTZXR0aW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZSBpbiBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUykgeyAvLyBUT0RPOiB3aGF0IGFib3V0IGhvdXIxMj8gbm8gc2V2ZXJpdHlcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHkgPSBNYXRoLm1heChTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFU1tuYW1lXSwgc2V2ZXJpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YW5kYXJkRGF0ZVByb3BzID0gc3RhbmRhcmREYXRlUHJvcHM7XG4gICAgICAgIHRoaXMuZXh0ZW5kZWRTZXR0aW5ncyA9IGV4dGVuZGVkU2V0dGluZ3M7XG4gICAgICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgdGhpcy5idWlsZEZvcm1hdHRpbmdGdW5jID0gbWVtb2l6ZShidWlsZEZvcm1hdHRpbmdGdW5jKTtcbiAgICB9XG4gICAgZm9ybWF0KGRhdGUsIGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRGb3JtYXR0aW5nRnVuYyh0aGlzLnN0YW5kYXJkRGF0ZVByb3BzLCB0aGlzLmV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpKGRhdGUpO1xuICAgIH1cbiAgICBmb3JtYXRSYW5nZShzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIGxldCB7IHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGlmZlNldmVyaXR5ID0gY29tcHV0ZU1hcmtlckRpZmZTZXZlcml0eShzdGFydC5tYXJrZXIsIGVuZC5tYXJrZXIsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgICAgICBpZiAoIWRpZmZTZXZlcml0eSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID0gZGlmZlNldmVyaXR5O1xuICAgICAgICBpZiAoYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID4gMSAmJiAvLyB0aGUgdHdvIGRhdGVzIGFyZSBkaWZmZXJlbnQgaW4gYSB3YXkgdGhhdCdzIGxhcmdlciBzY2FsZSB0aGFuIHRpbWVcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy55ZWFyID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMueWVhciA9PT0gJzItZGlnaXQnKSAmJlxuICAgICAgICAgICAgKHN0YW5kYXJkRGF0ZVByb3BzLm1vbnRoID09PSAnbnVtZXJpYycgfHwgc3RhbmRhcmREYXRlUHJvcHMubW9udGggPT09ICcyLWRpZ2l0JykgJiZcbiAgICAgICAgICAgIChzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICdudW1lcmljJyB8fCBzdGFuZGFyZERhdGVQcm9wcy5kYXkgPT09ICcyLWRpZ2l0JykpIHtcbiAgICAgICAgICAgIGJpZ2dlc3RVbml0Rm9yUGFydGlhbCA9IDE7IC8vIG1ha2UgaXQgbG9vayBsaWtlIHRoZSBkYXRlcyBhcmUgb25seSBkaWZmZXJlbnQgaW4gdGVybXMgb2YgdGltZVxuICAgICAgICB9XG4gICAgICAgIGxldCBmdWxsMCA9IHRoaXMuZm9ybWF0KHN0YXJ0LCBjb250ZXh0KTtcbiAgICAgICAgbGV0IGZ1bGwxID0gdGhpcy5mb3JtYXQoZW5kLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGZ1bGwwID09PSBmdWxsMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGwwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJ0aWFsRGF0ZVByb3BzID0gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhzdGFuZGFyZERhdGVQcm9wcywgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsKTtcbiAgICAgICAgbGV0IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyA9IGJ1aWxkRm9ybWF0dGluZ0Z1bmMocGFydGlhbERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCk7XG4gICAgICAgIGxldCBwYXJ0aWFsMCA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhzdGFydCk7XG4gICAgICAgIGxldCBwYXJ0aWFsMSA9IHBhcnRpYWxGb3JtYXR0aW5nRnVuYyhlbmQpO1xuICAgICAgICBsZXQgaW5zZXJ0aW9uID0gZmluZENvbW1vbkluc2VydGlvbihmdWxsMCwgcGFydGlhbDAsIGZ1bGwxLCBwYXJ0aWFsMSk7XG4gICAgICAgIGxldCBzZXBhcmF0b3IgPSBleHRlbmRlZFNldHRpbmdzLnNlcGFyYXRvciB8fCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yIHx8IGNvbnRleHQuZGVmYXVsdFNlcGFyYXRvciB8fCAnJztcbiAgICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGluc2VydGlvbi5iZWZvcmUgKyBwYXJ0aWFsMCArIHNlcGFyYXRvciArIHBhcnRpYWwxICsgaW5zZXJ0aW9uLmFmdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxsMCArIHNlcGFyYXRvciArIGZ1bGwxO1xuICAgIH1cbiAgICBnZXRMYXJnZXN0VW5pdCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnNldmVyaXR5KSB7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd5ZWFyJztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21vbnRoJztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3dlZWsnO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZGF5JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICd0aW1lJzsgLy8gcmVhbGx5P1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGRGb3JtYXR0aW5nRnVuYyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCkge1xuICAgIGxldCBzdGFuZGFyZERhdGVQcm9wQ250ID0gT2JqZWN0LmtleXMoc3RhbmRhcmREYXRlUHJvcHMpLmxlbmd0aDtcbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcENudCA9PT0gMSAmJiBzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcmV0dXJuIChkYXRlKSA9PiAoZm9ybWF0VGltZVpvbmVPZmZzZXQoZGF0ZS50aW1lWm9uZU9mZnNldCkpO1xuICAgIH1cbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcENudCA9PT0gMCAmJiBleHRlbmRlZFNldHRpbmdzLndlZWspIHtcbiAgICAgICAgcmV0dXJuIChkYXRlKSA9PiAoZm9ybWF0V2Vla051bWJlcihjb250ZXh0LmNvbXB1dGVXZWVrTnVtYmVyKGRhdGUubWFya2VyKSwgY29udGV4dC53ZWVrVGV4dCwgY29udGV4dC53ZWVrVGV4dExvbmcsIGNvbnRleHQubG9jYWxlLCBleHRlbmRlZFNldHRpbmdzLndlZWspKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkTmF0aXZlRm9ybWF0dGluZ0Z1bmMoc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gYnVpbGROYXRpdmVGb3JtYXR0aW5nRnVuYyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCkge1xuICAgIHN0YW5kYXJkRGF0ZVByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhbmRhcmREYXRlUHJvcHMpOyAvLyBjb3B5XG4gICAgZXh0ZW5kZWRTZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIGV4dGVuZGVkU2V0dGluZ3MpOyAvLyBjb3B5XG4gICAgc2FuaXRpemVTZXR0aW5ncyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncyk7XG4gICAgc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmUgPSAnVVRDJzsgLy8gd2UgbGV2ZXJhZ2UgdGhlIG9ubHkgZ3VhcmFudGVlZCB0aW1lWm9uZSBmb3Igb3VyIFVUQyBtYXJrZXJzXG4gICAgbGV0IG5vcm1hbEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGNvbnRleHQubG9jYWxlLmNvZGVzLCBzdGFuZGFyZERhdGVQcm9wcyk7XG4gICAgbGV0IHplcm9Gb3JtYXQ7IC8vIG5lZWRlZD9cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSkge1xuICAgICAgICBsZXQgemVyb1Byb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhbmRhcmREYXRlUHJvcHMpO1xuICAgICAgICBkZWxldGUgemVyb1Byb3BzLm1pbnV0ZTsgLy8gc2Vjb25kcyBhbmQgbXMgd2VyZSBhbHJlYWR5IGNvbnNpZGVyZWQgaW4gc2FuaXRpemVTZXR0aW5nc1xuICAgICAgICB6ZXJvRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoY29udGV4dC5sb2NhbGUuY29kZXMsIHplcm9Qcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiAoZGF0ZSkgPT4ge1xuICAgICAgICBsZXQgeyBtYXJrZXIgfSA9IGRhdGU7XG4gICAgICAgIGxldCBmb3JtYXQ7XG4gICAgICAgIGlmICh6ZXJvRm9ybWF0ICYmICFtYXJrZXIuZ2V0VVRDTWludXRlcygpKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSB6ZXJvRm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbm9ybWFsRm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBzID0gZm9ybWF0LmZvcm1hdChtYXJrZXIpO1xuICAgICAgICByZXR1cm4gcG9zdFByb2Nlc3MocywgZGF0ZSwgc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MsIGNvbnRleHQpO1xuICAgIH07XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVNldHRpbmdzKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzKSB7XG4gICAgLy8gZGVhbCB3aXRoIGEgYnJvd3NlciBpbmNvbnNpc3RlbmN5IHdoZXJlIGZvcm1hdHRpbmcgdGhlIHRpbWV6b25lXG4gICAgLy8gcmVxdWlyZXMgdGhhdCB0aGUgaG91ci9taW51dGUgYmUgcHJlc2VudC5cbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lKSB7XG4gICAgICAgIGlmICghc3RhbmRhcmREYXRlUHJvcHMuaG91cikge1xuICAgICAgICAgICAgc3RhbmRhcmREYXRlUHJvcHMuaG91ciA9ICcyLWRpZ2l0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YW5kYXJkRGF0ZVByb3BzLm1pbnV0ZSkge1xuICAgICAgICAgICAgc3RhbmRhcmREYXRlUHJvcHMubWludXRlID0gJzItZGlnaXQnO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG9ubHkgc3VwcG9ydCBzaG9ydCB0aW1lem9uZSBuYW1lc1xuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUgPT09ICdsb25nJykge1xuICAgICAgICBzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUgPSAnc2hvcnQnO1xuICAgIH1cbiAgICAvLyBpZiByZXF1ZXN0aW5nIHRvIGRpc3BsYXkgc2Vjb25kcywgTVVTVCBkaXNwbGF5IG1pbnV0ZXNcbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZSAmJiAoc3RhbmRhcmREYXRlUHJvcHMuc2Vjb25kIHx8IHN0YW5kYXJkRGF0ZVByb3BzLm1pbGxpc2Vjb25kKSkge1xuICAgICAgICBkZWxldGUgZXh0ZW5kZWRTZXR0aW5ncy5vbWl0WmVyb01pbnV0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBwb3N0UHJvY2VzcyhzLCBkYXRlLCBzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCkge1xuICAgIHMgPSBzLnJlcGxhY2UoTFRSX1JFLCAnJyk7IC8vIHJlbW92ZSBsZWZ0LXRvLXJpZ2h0IGNvbnRyb2wgY2hhcnMuIGRvIGZpcnN0LiBnb29kIGZvciBvdGhlciByZWdleGVzXG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSA9PT0gJ3Nob3J0Jykge1xuICAgICAgICBzID0gaW5qZWN0VHpvU3RyKHMsIChjb250ZXh0LnRpbWVab25lID09PSAnVVRDJyB8fCBkYXRlLnRpbWVab25lT2Zmc2V0ID09IG51bGwpID9cbiAgICAgICAgICAgICdVVEMnIDogLy8gaW1wb3J0YW50IHRvIG5vcm1hbGl6ZSBmb3IgSUUsIHdoaWNoIGRvZXMgXCJHTVRcIlxuICAgICAgICAgICAgZm9ybWF0VGltZVpvbmVPZmZzZXQoZGF0ZS50aW1lWm9uZU9mZnNldCkpO1xuICAgIH1cbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5vbWl0Q29tbWFzKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoQ09NTUFfUkUsICcnKS50cmltKCk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZFNldHRpbmdzLm9taXRaZXJvTWludXRlKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoJzowMCcsICcnKTsgLy8gemVyb0Zvcm1hdCBkb2Vzbid0IGFsd2F5cyBhY2hpZXZlIHRoaXNcbiAgICB9XG4gICAgLy8gXiBkbyBhbnl0aGluZyB0aGF0IG1pZ2h0IGNyZWF0ZSBhZGphY2VudCBzcGFjZXMgYmVmb3JlIHRoaXMgcG9pbnQsXG4gICAgLy8gYmVjYXVzZSBNRVJJRElFTV9SRSBsaWtlcyB0byBlYXQgdXAgbG9hZGluZyBzcGFjZXNcbiAgICBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5tZXJpZGllbSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcyA9IHMucmVwbGFjZShNRVJJRElFTV9SRSwgJycpLnRyaW0oKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXh0ZW5kZWRTZXR0aW5ncy5tZXJpZGllbSA9PT0gJ25hcnJvdycpIHsgLy8gYS9wXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsIChtMCwgbTEpID0+IG0xLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSAnc2hvcnQnKSB7IC8vIGFtL3BtXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsIChtMCwgbTEpID0+IGAke20xLnRvTG9jYWxlTG93ZXJDYXNlKCl9bWApO1xuICAgIH1cbiAgICBlbHNlIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSAnbG93ZXJjYXNlJykgeyAvLyBvdGhlciBtZXJpZGllbSB0cmFuc2Zvcm1lcnMgYWxyZWFkeSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlXG4gICAgICAgIHMgPSBzLnJlcGxhY2UoTUVSSURJRU1fUkUsIChtMCkgPT4gbTAudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIHMgPSBzLnJlcGxhY2UoTVVMVElfU1BBQ0VfUkUsICcgJyk7XG4gICAgcyA9IHMudHJpbSgpO1xuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gaW5qZWN0VHpvU3RyKHMsIHR6b1N0cikge1xuICAgIGxldCByZXBsYWNlZCA9IGZhbHNlO1xuICAgIHMgPSBzLnJlcGxhY2UoVVRDX1JFLCAoKSA9PiB7XG4gICAgICAgIHJlcGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHR6b1N0cjtcbiAgICB9KTtcbiAgICAvLyBJRTExIGRvZXNuJ3QgaW5jbHVkZSBVVEMvR01UIGluIHRoZSBvcmlnaW5hbCBzdHJpbmcsIHNvIGFwcGVuZCB0byBlbmRcbiAgICBpZiAoIXJlcGxhY2VkKSB7XG4gICAgICAgIHMgKz0gYCAke3R6b1N0cn1gO1xuICAgIH1cbiAgICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXIobnVtLCB3ZWVrVGV4dCwgd2Vla1RleHRMb25nLCBsb2NhbGUsIGRpc3BsYXkpIHtcbiAgICBsZXQgcGFydHMgPSBbXTtcbiAgICBpZiAoZGlzcGxheSA9PT0gJ2xvbmcnKSB7XG4gICAgICAgIHBhcnRzLnB1c2god2Vla1RleHRMb25nKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlzcGxheSA9PT0gJ3Nob3J0JyB8fCBkaXNwbGF5ID09PSAnbmFycm93Jykge1xuICAgICAgICBwYXJ0cy5wdXNoKHdlZWtUZXh0KTtcbiAgICB9XG4gICAgaWYgKGRpc3BsYXkgPT09ICdsb25nJyB8fCBkaXNwbGF5ID09PSAnc2hvcnQnKSB7XG4gICAgICAgIHBhcnRzLnB1c2goJyAnKTtcbiAgICB9XG4gICAgcGFydHMucHVzaChsb2NhbGUuc2ltcGxlTnVtYmVyRm9ybWF0LmZvcm1hdChudW0pKTtcbiAgICBpZiAobG9jYWxlLm9wdGlvbnMuZGlyZWN0aW9uID09PSAncnRsJykgeyAvLyBUT0RPOiB1c2UgY29udHJvbCBjaGFyYWN0ZXJzIGluc3RlYWQ/XG4gICAgICAgIHBhcnRzLnJldmVyc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJycpO1xufVxuLy8gUmFuZ2UgRm9ybWF0dGluZyBVdGlsc1xuLy8gMCA9IGV4YWN0bHkgdGhlIHNhbWVcbi8vIDEgPSBkaWZmZXJlbnQgYnkgdGltZVxuLy8gYW5kIGJpZ2dlclxuZnVuY3Rpb24gY29tcHV0ZU1hcmtlckRpZmZTZXZlcml0eShkMCwgZDEsIGNhKSB7XG4gICAgaWYgKGNhLmdldE1hcmtlclllYXIoZDApICE9PSBjYS5nZXRNYXJrZXJZZWFyKGQxKSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICB9XG4gICAgaWYgKGNhLmdldE1hcmtlck1vbnRoKGQwKSAhPT0gY2EuZ2V0TWFya2VyTW9udGgoZDEpKSB7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH1cbiAgICBpZiAoY2EuZ2V0TWFya2VyRGF5KGQwKSAhPT0gY2EuZ2V0TWFya2VyRGF5KGQxKSkge1xuICAgICAgICByZXR1cm4gMjtcbiAgICB9XG4gICAgaWYgKHRpbWVBc01zKGQwKSAhPT0gdGltZUFzTXMoZDEpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVQYXJ0aWFsRm9ybWF0dGluZ09wdGlvbnMob3B0aW9ucywgYmlnZ2VzdFVuaXQpIHtcbiAgICBsZXQgcGFydGlhbE9wdGlvbnMgPSB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCEobmFtZSBpbiBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFUykgfHwgLy8gbm90IGEgZGF0ZSBwYXJ0IHByb3AgKGxpa2UgdGltZVpvbmUpXG4gICAgICAgICAgICBTVEFOREFSRF9EQVRFX1BST1BfU0VWRVJJVElFU1tuYW1lXSA8PSBiaWdnZXN0VW5pdCkge1xuICAgICAgICAgICAgcGFydGlhbE9wdGlvbnNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWFsT3B0aW9ucztcbn1cbmZ1bmN0aW9uIGZpbmRDb21tb25JbnNlcnRpb24oZnVsbDAsIHBhcnRpYWwwLCBmdWxsMSwgcGFydGlhbDEpIHtcbiAgICBsZXQgaTAgPSAwO1xuICAgIHdoaWxlIChpMCA8IGZ1bGwwLmxlbmd0aCkge1xuICAgICAgICBsZXQgZm91bmQwID0gZnVsbDAuaW5kZXhPZihwYXJ0aWFsMCwgaTApO1xuICAgICAgICBpZiAoZm91bmQwID09PSAtMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJlZm9yZTAgPSBmdWxsMC5zdWJzdHIoMCwgZm91bmQwKTtcbiAgICAgICAgaTAgPSBmb3VuZDAgKyBwYXJ0aWFsMC5sZW5ndGg7XG4gICAgICAgIGxldCBhZnRlcjAgPSBmdWxsMC5zdWJzdHIoaTApO1xuICAgICAgICBsZXQgaTEgPSAwO1xuICAgICAgICB3aGlsZSAoaTEgPCBmdWxsMS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBmb3VuZDEgPSBmdWxsMS5pbmRleE9mKHBhcnRpYWwxLCBpMSk7XG4gICAgICAgICAgICBpZiAoZm91bmQxID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGJlZm9yZTEgPSBmdWxsMS5zdWJzdHIoMCwgZm91bmQxKTtcbiAgICAgICAgICAgIGkxID0gZm91bmQxICsgcGFydGlhbDEubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGFmdGVyMSA9IGZ1bGwxLnN1YnN0cihpMSk7XG4gICAgICAgICAgICBpZiAoYmVmb3JlMCA9PT0gYmVmb3JlMSAmJiBhZnRlcjAgPT09IGFmdGVyMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGJlZm9yZTogYmVmb3JlMCxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGFmdGVyMCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBleHBhbmRab25lZE1hcmtlcihkYXRlSW5mbywgY2FsZW5kYXJTeXN0ZW0pIHtcbiAgICBsZXQgYSA9IGNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkoZGF0ZUluZm8ubWFya2VyKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBtYXJrZXI6IGRhdGVJbmZvLm1hcmtlcixcbiAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVJbmZvLnRpbWVab25lT2Zmc2V0LFxuICAgICAgICBhcnJheTogYSxcbiAgICAgICAgeWVhcjogYVswXSxcbiAgICAgICAgbW9udGg6IGFbMV0sXG4gICAgICAgIGRheTogYVsyXSxcbiAgICAgICAgaG91cjogYVszXSxcbiAgICAgICAgbWludXRlOiBhWzRdLFxuICAgICAgICBzZWNvbmQ6IGFbNV0sXG4gICAgICAgIG1pbGxpc2Vjb25kOiBhWzZdLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICBsZXQgc3RhcnRJbmZvID0gZXhwYW5kWm9uZWRNYXJrZXIoc3RhcnQsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pO1xuICAgIGxldCBlbmRJbmZvID0gZW5kID8gZXhwYW5kWm9uZWRNYXJrZXIoZW5kLCBjb250ZXh0LmNhbGVuZGFyU3lzdGVtKSA6IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogc3RhcnRJbmZvLFxuICAgICAgICBzdGFydDogc3RhcnRJbmZvLFxuICAgICAgICBlbmQ6IGVuZEluZm8sXG4gICAgICAgIHRpbWVab25lOiBjb250ZXh0LnRpbWVab25lLFxuICAgICAgICBsb2NhbGVDb2RlczogY29udGV4dC5sb2NhbGUuY29kZXMsXG4gICAgICAgIGRlZmF1bHRTZXBhcmF0b3I6IGJldHRlckRlZmF1bHRTZXBhcmF0b3IgfHwgY29udGV4dC5kZWZhdWx0U2VwYXJhdG9yLFxuICAgIH07XG59XG5cbi8qXG5UT0RPOiBmaXggdGhlIHRlcm1pbm9sb2d5IG9mIFwiZm9ybWF0dGVyXCIgdnMgXCJmb3JtYXR0aW5nIGZ1bmNcIlxuKi9cbi8qXG5BdCB0aGUgdGltZSBvZiBpbnN0YW50aWF0aW9uLCB0aGlzIG9iamVjdCBkb2VzIG5vdCBrbm93IHdoaWNoIGNtZC1mb3JtYXR0aW5nIHN5c3RlbSBpdCB3aWxsIHVzZS5cbkl0IHJlY2VpdmVzIHRoaXMgYXQgdGhlIHRpbWUgb2YgZm9ybWF0dGluZywgYXMgYSBzZXR0aW5nLlxuKi9cbmNsYXNzIENtZEZvcm1hdHRlciB7XG4gICAgY29uc3RydWN0b3IoY21kU3RyKSB7XG4gICAgICAgIHRoaXMuY21kU3RyID0gY21kU3RyO1xuICAgIH1cbiAgICBmb3JtYXQoZGF0ZSwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKGRhdGUsIG51bGwsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9XG4gICAgZm9ybWF0UmFuZ2Uoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jbWRGb3JtYXR0ZXIodGhpcy5jbWRTdHIsIGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9XG59XG5cbmNsYXNzIEZ1bmNGb3JtYXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5mdW5jID0gZnVuYztcbiAgICB9XG4gICAgZm9ybWF0KGRhdGUsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuYyhjcmVhdGVWZXJib3NlRm9ybWF0dGluZ0FyZyhkYXRlLCBudWxsLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSk7XG4gICAgfVxuICAgIGZvcm1hdFJhbmdlKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuYyhjcmVhdGVWZXJib3NlRm9ybWF0dGluZ0FyZyhzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoaW5wdXQpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiBpbnB1dCkgeyAvLyBub24tbnVsbCBvYmplY3RcbiAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGb3JtYXR0ZXIoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbmV3IENtZEZvcm1hdHRlcihpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdW5jRm9ybWF0dGVyKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbi8vIGJhc2Ugb3B0aW9uc1xuLy8gLS0tLS0tLS0tLS0tXG5jb25zdCBCQVNFX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBuYXZMaW5rRGF5Q2xpY2s6IGlkZW50aXR5LFxuICAgIG5hdkxpbmtXZWVrQ2xpY2s6IGlkZW50aXR5LFxuICAgIGR1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBib290c3RyYXBGb250QXdlc29tZTogaWRlbnRpdHksXG4gICAgYnV0dG9uSWNvbnM6IGlkZW50aXR5LFxuICAgIGN1c3RvbUJ1dHRvbnM6IGlkZW50aXR5LFxuICAgIGRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBkZWZhdWx0VGltZWRFdmVudER1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBuZXh0RGF5VGhyZXNob2xkOiBjcmVhdGVEdXJhdGlvbixcbiAgICBzY3JvbGxUaW1lOiBjcmVhdGVEdXJhdGlvbixcbiAgICBzY3JvbGxUaW1lUmVzZXQ6IEJvb2xlYW4sXG4gICAgc2xvdE1pblRpbWU6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHNsb3RNYXhUaW1lOiBjcmVhdGVEdXJhdGlvbixcbiAgICBkYXlQb3BvdmVyRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgc2xvdER1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBzbmFwRHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGhlYWRlclRvb2xiYXI6IGlkZW50aXR5LFxuICAgIGZvb3RlclRvb2xiYXI6IGlkZW50aXR5LFxuICAgIGRlZmF1bHRSYW5nZVNlcGFyYXRvcjogU3RyaW5nLFxuICAgIHRpdGxlUmFuZ2VTZXBhcmF0b3I6IFN0cmluZyxcbiAgICBmb3JjZUV2ZW50RHVyYXRpb246IEJvb2xlYW4sXG4gICAgZGF5SGVhZGVyczogQm9vbGVhbixcbiAgICBkYXlIZWFkZXJGb3JtYXQ6IGNyZWF0ZUZvcm1hdHRlcixcbiAgICBkYXlIZWFkZXJDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBkYXlIZWFkZXJDb250ZW50OiBpZGVudGl0eSxcbiAgICBkYXlIZWFkZXJEaWRNb3VudDogaWRlbnRpdHksXG4gICAgZGF5SGVhZGVyV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIGRheUNlbGxDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBkYXlDZWxsQ29udGVudDogaWRlbnRpdHksXG4gICAgZGF5Q2VsbERpZE1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlDZWxsV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIGluaXRpYWxWaWV3OiBTdHJpbmcsXG4gICAgYXNwZWN0UmF0aW86IE51bWJlcixcbiAgICB3ZWVrZW5kczogQm9vbGVhbixcbiAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246IGlkZW50aXR5LFxuICAgIHdlZWtOdW1iZXJzOiBCb29sZWFuLFxuICAgIHdlZWtOdW1iZXJDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICB3ZWVrTnVtYmVyQ29udGVudDogaWRlbnRpdHksXG4gICAgd2Vla051bWJlckRpZE1vdW50OiBpZGVudGl0eSxcbiAgICB3ZWVrTnVtYmVyV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIGVkaXRhYmxlOiBCb29sZWFuLFxuICAgIHZpZXdDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICB2aWV3RGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHZpZXdXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgbm93SW5kaWNhdG9yOiBCb29sZWFuLFxuICAgIG5vd0luZGljYXRvckNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIG5vd0luZGljYXRvckNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIG5vd0luZGljYXRvckRpZE1vdW50OiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3JXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2hvd05vbkN1cnJlbnREYXRlczogQm9vbGVhbixcbiAgICBsYXp5RmV0Y2hpbmc6IEJvb2xlYW4sXG4gICAgc3RhcnRQYXJhbTogU3RyaW5nLFxuICAgIGVuZFBhcmFtOiBTdHJpbmcsXG4gICAgdGltZVpvbmVQYXJhbTogU3RyaW5nLFxuICAgIHRpbWVab25lOiBTdHJpbmcsXG4gICAgbG9jYWxlczogaWRlbnRpdHksXG4gICAgbG9jYWxlOiBpZGVudGl0eSxcbiAgICB0aGVtZVN5c3RlbTogU3RyaW5nLFxuICAgIGRyYWdSZXZlcnREdXJhdGlvbjogTnVtYmVyLFxuICAgIGRyYWdTY3JvbGw6IEJvb2xlYW4sXG4gICAgYWxsRGF5TWFpbnRhaW5EdXJhdGlvbjogQm9vbGVhbixcbiAgICB1bnNlbGVjdEF1dG86IEJvb2xlYW4sXG4gICAgZHJvcEFjY2VwdDogaWRlbnRpdHksXG4gICAgZXZlbnRPcmRlcjogcGFyc2VGaWVsZFNwZWNzLFxuICAgIGV2ZW50T3JkZXJTdHJpY3Q6IEJvb2xlYW4sXG4gICAgaGFuZGxlV2luZG93UmVzaXplOiBCb29sZWFuLFxuICAgIHdpbmRvd1Jlc2l6ZURlbGF5OiBOdW1iZXIsXG4gICAgbG9uZ1ByZXNzRGVsYXk6IE51bWJlcixcbiAgICBldmVudERyYWdNaW5EaXN0YW5jZTogTnVtYmVyLFxuICAgIGV4cGFuZFJvd3M6IEJvb2xlYW4sXG4gICAgaGVpZ2h0OiBpZGVudGl0eSxcbiAgICBjb250ZW50SGVpZ2h0OiBpZGVudGl0eSxcbiAgICBkaXJlY3Rpb246IFN0cmluZyxcbiAgICB3ZWVrTnVtYmVyRm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgZXZlbnRSZXNpemFibGVGcm9tU3RhcnQ6IEJvb2xlYW4sXG4gICAgZGlzcGxheUV2ZW50VGltZTogQm9vbGVhbixcbiAgICBkaXNwbGF5RXZlbnRFbmQ6IEJvb2xlYW4sXG4gICAgd2Vla1RleHQ6IFN0cmluZyxcbiAgICB3ZWVrVGV4dExvbmc6IFN0cmluZyxcbiAgICBwcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nOiBCb29sZWFuLFxuICAgIGJ1c2luZXNzSG91cnM6IGlkZW50aXR5LFxuICAgIGluaXRpYWxEYXRlOiBpZGVudGl0eSxcbiAgICBub3c6IGlkZW50aXR5LFxuICAgIGV2ZW50RGF0YVRyYW5zZm9ybTogaWRlbnRpdHksXG4gICAgc3RpY2t5SGVhZGVyRGF0ZXM6IGlkZW50aXR5LFxuICAgIHN0aWNreUZvb3RlclNjcm9sbGJhcjogaWRlbnRpdHksXG4gICAgdmlld0hlaWdodDogaWRlbnRpdHksXG4gICAgZGVmYXVsdEFsbERheTogQm9vbGVhbixcbiAgICBldmVudFNvdXJjZUZhaWx1cmU6IGlkZW50aXR5LFxuICAgIGV2ZW50U291cmNlU3VjY2VzczogaWRlbnRpdHksXG4gICAgZXZlbnREaXNwbGF5OiBTdHJpbmcsXG4gICAgZXZlbnRTdGFydEVkaXRhYmxlOiBCb29sZWFuLFxuICAgIGV2ZW50RHVyYXRpb25FZGl0YWJsZTogQm9vbGVhbixcbiAgICBldmVudE92ZXJsYXA6IGlkZW50aXR5LFxuICAgIGV2ZW50Q29uc3RyYWludDogaWRlbnRpdHksXG4gICAgZXZlbnRBbGxvdzogaWRlbnRpdHksXG4gICAgZXZlbnRCYWNrZ3JvdW5kQ29sb3I6IFN0cmluZyxcbiAgICBldmVudEJvcmRlckNvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRUZXh0Q29sb3I6IFN0cmluZyxcbiAgICBldmVudENvbG9yOiBTdHJpbmcsXG4gICAgZXZlbnRDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBldmVudENvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGV2ZW50RGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIGV2ZW50V2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIHNlbGVjdENvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIHNlbGVjdE92ZXJsYXA6IGlkZW50aXR5LFxuICAgIHNlbGVjdEFsbG93OiBpZGVudGl0eSxcbiAgICBkcm9wcGFibGU6IEJvb2xlYW4sXG4gICAgdW5zZWxlY3RDYW5jZWw6IFN0cmluZyxcbiAgICBzbG90TGFiZWxGb3JtYXQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYW5lQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgc2xvdExhbmVDb250ZW50OiBpZGVudGl0eSxcbiAgICBzbG90TGFuZURpZE1vdW50OiBpZGVudGl0eSxcbiAgICBzbG90TGFuZVdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBzbG90TGFiZWxDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBzbG90TGFiZWxDb250ZW50OiBpZGVudGl0eSxcbiAgICBzbG90TGFiZWxEaWRNb3VudDogaWRlbnRpdHksXG4gICAgc2xvdExhYmVsV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIGRheU1heEV2ZW50czogaWRlbnRpdHksXG4gICAgZGF5TWF4RXZlbnRSb3dzOiBpZGVudGl0eSxcbiAgICBkYXlNaW5XaWR0aDogTnVtYmVyLFxuICAgIHNsb3RMYWJlbEludGVydmFsOiBjcmVhdGVEdXJhdGlvbixcbiAgICBhbGxEYXlUZXh0OiBTdHJpbmcsXG4gICAgYWxsRGF5Q2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgYWxsRGF5Q29udGVudDogaWRlbnRpdHksXG4gICAgYWxsRGF5RGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIGFsbERheVdpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBzbG90TWluV2lkdGg6IE51bWJlcixcbiAgICBuYXZMaW5rczogQm9vbGVhbixcbiAgICBldmVudFRpbWVGb3JtYXQ6IGNyZWF0ZUZvcm1hdHRlcixcbiAgICByZXJlbmRlckRlbGF5OiBOdW1iZXIsXG4gICAgbW9yZUxpbmtUZXh0OiBpZGVudGl0eSxcbiAgICBtb3JlTGlua0hpbnQ6IGlkZW50aXR5LFxuICAgIHNlbGVjdE1pbkRpc3RhbmNlOiBOdW1iZXIsXG4gICAgc2VsZWN0YWJsZTogQm9vbGVhbixcbiAgICBzZWxlY3RMb25nUHJlc3NEZWxheTogTnVtYmVyLFxuICAgIGV2ZW50TG9uZ1ByZXNzRGVsYXk6IE51bWJlcixcbiAgICBzZWxlY3RNaXJyb3I6IEJvb2xlYW4sXG4gICAgZXZlbnRNYXhTdGFjazogTnVtYmVyLFxuICAgIGV2ZW50TWluSGVpZ2h0OiBOdW1iZXIsXG4gICAgZXZlbnRNaW5XaWR0aDogTnVtYmVyLFxuICAgIGV2ZW50U2hvcnRIZWlnaHQ6IE51bWJlcixcbiAgICBzbG90RXZlbnRPdmVybGFwOiBCb29sZWFuLFxuICAgIHBsdWdpbnM6IGlkZW50aXR5LFxuICAgIGZpcnN0RGF5OiBOdW1iZXIsXG4gICAgZGF5Q291bnQ6IE51bWJlcixcbiAgICBkYXRlQWxpZ25tZW50OiBTdHJpbmcsXG4gICAgZGF0ZUluY3JlbWVudDogY3JlYXRlRHVyYXRpb24sXG4gICAgaGlkZGVuRGF5czogaWRlbnRpdHksXG4gICAgZml4ZWRXZWVrQ291bnQ6IEJvb2xlYW4sXG4gICAgdmFsaWRSYW5nZTogaWRlbnRpdHksXG4gICAgdmlzaWJsZVJhbmdlOiBpZGVudGl0eSxcbiAgICB0aXRsZUZvcm1hdDogaWRlbnRpdHksXG4gICAgZXZlbnRJbnRlcmFjdGl2ZTogQm9vbGVhbixcbiAgICAvLyBvbmx5IHVzZWQgYnkgbGlzdC12aWV3LCBidXQgbGFuZ3VhZ2VzIGRlZmluZSB0aGUgdmFsdWUsIHNvIHdlIG5lZWQgaXQgaW4gYmFzZSBvcHRpb25zXG4gICAgbm9FdmVudHNUZXh0OiBTdHJpbmcsXG4gICAgdmlld0hpbnQ6IGlkZW50aXR5LFxuICAgIG5hdkxpbmtIaW50OiBpZGVudGl0eSxcbiAgICBjbG9zZUhpbnQ6IFN0cmluZyxcbiAgICB0aW1lSGludDogU3RyaW5nLFxuICAgIGV2ZW50SGludDogU3RyaW5nLFxuICAgIG1vcmVMaW5rQ2xpY2s6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtDb250ZW50OiBpZGVudGl0eSxcbiAgICBtb3JlTGlua0RpZE1vdW50OiBpZGVudGl0eSxcbiAgICBtb3JlTGlua1dpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBtb250aFN0YXJ0Rm9ybWF0OiBjcmVhdGVGb3JtYXR0ZXIsXG4gICAgLy8gZm9yIGNvbm5lY3RvcnNcbiAgICAvLyAoY2FuJ3QgYmUgcGFydCBvZiBwbHVnaW4gc3lzdGVtIGIvYyBtdXN0IGJlIHByb3ZpZGVkIGF0IHJ1bnRpbWUpXG4gICAgaGFuZGxlQ3VzdG9tUmVuZGVyaW5nOiBpZGVudGl0eSxcbiAgICBjdXN0b21SZW5kZXJpbmdNZXRhTWFwOiBpZGVudGl0eSxcbiAgICBjdXN0b21SZW5kZXJpbmdSZXBsYWNlc0VsOiBCb29sZWFuLFxufTtcbi8vIGRvIE5PVCBnaXZlIGEgdHlwZSBoZXJlLiBuZWVkIGB0eXBlb2YgQkFTRV9PUFRJT05fREVGQVVMVFNgIHRvIGdpdmUgcmVhbCByZXN1bHRzLlxuLy8gcmF3IHZhbHVlcy5cbmNvbnN0IEJBU0VfT1BUSU9OX0RFRkFVTFRTID0ge1xuICAgIGV2ZW50RGlzcGxheTogJ2F1dG8nLFxuICAgIGRlZmF1bHRSYW5nZVNlcGFyYXRvcjogJyAtICcsXG4gICAgdGl0bGVSYW5nZVNlcGFyYXRvcjogJyBcXHUyMDEzICcsXG4gICAgZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbjogJzAxOjAwOjAwJyxcbiAgICBkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbjogeyBkYXk6IDEgfSxcbiAgICBmb3JjZUV2ZW50RHVyYXRpb246IGZhbHNlLFxuICAgIG5leHREYXlUaHJlc2hvbGQ6ICcwMDowMDowMCcsXG4gICAgZGF5SGVhZGVyczogdHJ1ZSxcbiAgICBpbml0aWFsVmlldzogJycsXG4gICAgYXNwZWN0UmF0aW86IDEuMzUsXG4gICAgaGVhZGVyVG9vbGJhcjoge1xuICAgICAgICBzdGFydDogJ3RpdGxlJyxcbiAgICAgICAgY2VudGVyOiAnJyxcbiAgICAgICAgZW5kOiAndG9kYXkgcHJldixuZXh0JyxcbiAgICB9LFxuICAgIHdlZWtlbmRzOiB0cnVlLFxuICAgIHdlZWtOdW1iZXJzOiBmYWxzZSxcbiAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdsb2NhbCcsXG4gICAgZWRpdGFibGU6IGZhbHNlLFxuICAgIG5vd0luZGljYXRvcjogZmFsc2UsXG4gICAgc2Nyb2xsVGltZTogJzA2OjAwOjAwJyxcbiAgICBzY3JvbGxUaW1lUmVzZXQ6IHRydWUsXG4gICAgc2xvdE1pblRpbWU6ICcwMDowMDowMCcsXG4gICAgc2xvdE1heFRpbWU6ICcyNDowMDowMCcsXG4gICAgc2hvd05vbkN1cnJlbnREYXRlczogdHJ1ZSxcbiAgICBsYXp5RmV0Y2hpbmc6IHRydWUsXG4gICAgc3RhcnRQYXJhbTogJ3N0YXJ0JyxcbiAgICBlbmRQYXJhbTogJ2VuZCcsXG4gICAgdGltZVpvbmVQYXJhbTogJ3RpbWVab25lJyxcbiAgICB0aW1lWm9uZTogJ2xvY2FsJyxcbiAgICBsb2NhbGVzOiBbXSxcbiAgICBsb2NhbGU6ICcnLFxuICAgIHRoZW1lU3lzdGVtOiAnc3RhbmRhcmQnLFxuICAgIGRyYWdSZXZlcnREdXJhdGlvbjogNTAwLFxuICAgIGRyYWdTY3JvbGw6IHRydWUsXG4gICAgYWxsRGF5TWFpbnRhaW5EdXJhdGlvbjogZmFsc2UsXG4gICAgdW5zZWxlY3RBdXRvOiB0cnVlLFxuICAgIGRyb3BBY2NlcHQ6ICcqJyxcbiAgICBldmVudE9yZGVyOiAnc3RhcnQsLWR1cmF0aW9uLGFsbERheSx0aXRsZScsXG4gICAgZGF5UG9wb3ZlckZvcm1hdDogeyBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJywgeWVhcjogJ251bWVyaWMnIH0sXG4gICAgaGFuZGxlV2luZG93UmVzaXplOiB0cnVlLFxuICAgIHdpbmRvd1Jlc2l6ZURlbGF5OiAxMDAsXG4gICAgbG9uZ1ByZXNzRGVsYXk6IDEwMDAsXG4gICAgZXZlbnREcmFnTWluRGlzdGFuY2U6IDUsXG4gICAgZXhwYW5kUm93czogZmFsc2UsXG4gICAgbmF2TGlua3M6IGZhbHNlLFxuICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgIGV2ZW50TWluSGVpZ2h0OiAxNSxcbiAgICBldmVudE1pbldpZHRoOiAzMCxcbiAgICBldmVudFNob3J0SGVpZ2h0OiAzMCxcbiAgICBtb250aFN0YXJ0Rm9ybWF0OiB7IG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0sXG59O1xuLy8gY2FsZW5kYXIgbGlzdGVuZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IENBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTID0ge1xuICAgIGRhdGVzU2V0OiBpZGVudGl0eSxcbiAgICBldmVudHNTZXQ6IGlkZW50aXR5LFxuICAgIGV2ZW50QWRkOiBpZGVudGl0eSxcbiAgICBldmVudENoYW5nZTogaWRlbnRpdHksXG4gICAgZXZlbnRSZW1vdmU6IGlkZW50aXR5LFxuICAgIHdpbmRvd1Jlc2l6ZTogaWRlbnRpdHksXG4gICAgZXZlbnRDbGljazogaWRlbnRpdHksXG4gICAgZXZlbnRNb3VzZUVudGVyOiBpZGVudGl0eSxcbiAgICBldmVudE1vdXNlTGVhdmU6IGlkZW50aXR5LFxuICAgIHNlbGVjdDogaWRlbnRpdHksXG4gICAgdW5zZWxlY3Q6IGlkZW50aXR5LFxuICAgIGxvYWRpbmc6IGlkZW50aXR5LFxuICAgIC8vIGludGVybmFsXG4gICAgX3VubW91bnQ6IGlkZW50aXR5LFxuICAgIF9iZWZvcmVwcmludDogaWRlbnRpdHksXG4gICAgX2FmdGVycHJpbnQ6IGlkZW50aXR5LFxuICAgIF9ub0V2ZW50RHJvcDogaWRlbnRpdHksXG4gICAgX25vRXZlbnRSZXNpemU6IGlkZW50aXR5LFxuICAgIF9yZXNpemU6IGlkZW50aXR5LFxuICAgIF9zY3JvbGxSZXF1ZXN0OiBpZGVudGl0eSxcbn07XG4vLyBjYWxlbmRhci1zcGVjaWZpYyBvcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMgPSB7XG4gICAgYnV0dG9uVGV4dDogaWRlbnRpdHksXG4gICAgYnV0dG9uSGludHM6IGlkZW50aXR5LFxuICAgIHZpZXdzOiBpZGVudGl0eSxcbiAgICBwbHVnaW5zOiBpZGVudGl0eSxcbiAgICBpbml0aWFsRXZlbnRzOiBpZGVudGl0eSxcbiAgICBldmVudHM6IGlkZW50aXR5LFxuICAgIGV2ZW50U291cmNlczogaWRlbnRpdHksXG59O1xuY29uc3QgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMgPSB7XG4gICAgaGVhZGVyVG9vbGJhcjogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBmb290ZXJUb29sYmFyOiBpc01heWJlT2JqZWN0c0VxdWFsLFxuICAgIGJ1dHRvblRleHQ6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSGludHM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uSWNvbnM6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgZGF0ZUluY3JlbWVudDogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBwbHVnaW5zOiBpc01heWJlQXJyYXlzRXF1YWwsXG4gICAgZXZlbnRzOiBpc01heWJlQXJyYXlzRXF1YWwsXG4gICAgZXZlbnRTb3VyY2VzOiBpc01heWJlQXJyYXlzRXF1YWwsXG4gICAgWydyZXNvdXJjZXMnXTogaXNNYXliZUFycmF5c0VxdWFsLFxufTtcbmZ1bmN0aW9uIGlzTWF5YmVPYmplY3RzRXF1YWwoYSwgYikge1xuICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT09ICdvYmplY3QnICYmIGEgJiYgYikgeyAvLyBib3RoIG5vbi1udWxsIG9iamVjdHNcbiAgICAgICAgcmV0dXJuIGlzUHJvcHNFcXVhbChhLCBiKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG5mdW5jdGlvbiBpc01heWJlQXJyYXlzRXF1YWwoYSwgYikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICAgICAgcmV0dXJuIGlzQXJyYXlzRXF1YWwoYSwgYik7XG4gICAgfVxuICAgIHJldHVybiBhID09PSBiO1xufVxuLy8gdmlldy1zcGVjaWZpYyBvcHRpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IFZJRVdfT1BUSU9OX1JFRklORVJTID0ge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICBjb21wb25lbnQ6IGlkZW50aXR5LFxuICAgIGJ1dHRvblRleHQ6IFN0cmluZyxcbiAgICBidXR0b25UZXh0S2V5OiBTdHJpbmcsXG4gICAgZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzczogaWRlbnRpdHksXG4gICAgdXNlc01pbk1heFRpbWU6IEJvb2xlYW4sXG4gICAgY2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgY29udGVudDogaWRlbnRpdHksXG4gICAgZGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHdpbGxVbm1vdW50OiBpZGVudGl0eSxcbn07XG4vLyB1dGlsIGZ1bmNzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBtZXJnZVJhd09wdGlvbnMob3B0aW9uU2V0cykge1xuICAgIHJldHVybiBtZXJnZVByb3BzKG9wdGlvblNldHMsIENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTKTtcbn1cbmZ1bmN0aW9uIHJlZmluZVByb3BzKGlucHV0LCByZWZpbmVycykge1xuICAgIGxldCByZWZpbmVkID0ge307XG4gICAgbGV0IGV4dHJhID0ge307XG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcmVmaW5lcnMpIHtcbiAgICAgICAgaWYgKHByb3BOYW1lIGluIGlucHV0KSB7XG4gICAgICAgICAgICByZWZpbmVkW3Byb3BOYW1lXSA9IHJlZmluZXJzW3Byb3BOYW1lXShpbnB1dFtwcm9wTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHByb3BOYW1lIGluIGlucHV0KSB7XG4gICAgICAgIGlmICghKHByb3BOYW1lIGluIHJlZmluZXJzKSkge1xuICAgICAgICAgICAgZXh0cmFbcHJvcE5hbWVdID0gaW5wdXRbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHJlZmluZWQsIGV4dHJhIH07XG59XG5mdW5jdGlvbiBpZGVudGl0eShyYXcpIHtcbiAgICByZXR1cm4gcmF3O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudEluc3RhbmNlKGRlZklkLCByYW5nZSwgZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlSWQ6IGd1aWQoKSxcbiAgICAgICAgZGVmSWQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBmb3JjZWRTdGFydFR6bzogZm9yY2VkU3RhcnRUem8gPT0gbnVsbCA/IG51bGwgOiBmb3JjZWRTdGFydFR6byxcbiAgICAgICAgZm9yY2VkRW5kVHpvOiBmb3JjZWRFbmRUem8gPT0gbnVsbCA/IG51bGwgOiBmb3JjZWRFbmRUem8sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZWN1cnJpbmcocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgZGF0ZUVudiwgcmVjdXJyaW5nVHlwZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3VycmluZ1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCBwYXJzZWQgPSByZWN1cnJpbmdUeXBlc1tpXS5wYXJzZShyZWZpbmVkLCBkYXRlRW52KTtcbiAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgbGV0IHsgYWxsRGF5IH0gPSByZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGFsbERheSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgYWxsRGF5ID0gZGVmYXVsdEFsbERheTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsRGF5ID0gcGFyc2VkLmFsbERheUd1ZXNzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhbGxEYXksXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IHBhcnNlZC5kdXJhdGlvbixcbiAgICAgICAgICAgICAgICB0eXBlRGF0YTogcGFyc2VkLnR5cGVEYXRhLFxuICAgICAgICAgICAgICAgIHR5cGVJZDogaSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBleHBhbmRSZWN1cnJpbmcoZXZlbnRTdG9yZSwgZnJhbWluZ1JhbmdlLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZGF0ZUVudiwgcGx1Z2luSG9va3MsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgbGV0IHsgZGVmcywgaW5zdGFuY2VzIH0gPSBldmVudFN0b3JlO1xuICAgIC8vIHJlbW92ZSBleGlzdGluZyByZWN1cnJpbmcgaW5zdGFuY2VzXG4gICAgLy8gVE9ETzogYmFkLiBhbHdheXMgZXhwYW5kIGV2ZW50cyBhcyBhIHNlY29uZCBzdGVwXG4gICAgaW5zdGFuY2VzID0gZmlsdGVySGFzaChpbnN0YW5jZXMsIChpbnN0YW5jZSkgPT4gIWRlZnNbaW5zdGFuY2UuZGVmSWRdLnJlY3VycmluZ0RlZik7XG4gICAgZm9yIChsZXQgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICBsZXQgZGVmID0gZGVmc1tkZWZJZF07XG4gICAgICAgIGlmIChkZWYucmVjdXJyaW5nRGVmKSB7XG4gICAgICAgICAgICBsZXQgeyBkdXJhdGlvbiB9ID0gZGVmLnJlY3VycmluZ0RlZjtcbiAgICAgICAgICAgIGlmICghZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGRlZi5hbGxEYXkgP1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uIDpcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kZWZhdWx0VGltZWRFdmVudER1cmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHN0YXJ0cyA9IGV4cGFuZFJlY3VycmluZ1JhbmdlcyhkZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHBsdWdpbkhvb2tzLnJlY3VycmluZ1R5cGVzKTtcbiAgICAgICAgICAgIGZvciAobGV0IHN0YXJ0IG9mIHN0YXJ0cykge1xuICAgICAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogZGF0ZUVudi5hZGQoc3RhcnQsIGR1cmF0aW9uKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBkZWZzLCBpbnN0YW5jZXMgfTtcbn1cbi8qXG5FdmVudCBNVVNUIGhhdmUgYSByZWN1cnJpbmdEZWZcbiovXG5mdW5jdGlvbiBleHBhbmRSZWN1cnJpbmdSYW5nZXMoZXZlbnREZWYsIGR1cmF0aW9uLCBmcmFtaW5nUmFuZ2UsIGRhdGVFbnYsIHJlY3VycmluZ1R5cGVzKSB7XG4gICAgbGV0IHR5cGVEZWYgPSByZWN1cnJpbmdUeXBlc1tldmVudERlZi5yZWN1cnJpbmdEZWYudHlwZUlkXTtcbiAgICBsZXQgbWFya2VycyA9IHR5cGVEZWYuZXhwYW5kKGV2ZW50RGVmLnJlY3VycmluZ0RlZi50eXBlRGF0YSwge1xuICAgICAgICBzdGFydDogZGF0ZUVudi5zdWJ0cmFjdChmcmFtaW5nUmFuZ2Uuc3RhcnQsIGR1cmF0aW9uKSxcbiAgICAgICAgZW5kOiBmcmFtaW5nUmFuZ2UuZW5kLFxuICAgIH0sIGRhdGVFbnYpO1xuICAgIC8vIHRoZSByZWN1cnJlbmNlIHBsdWdpbnMgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgYWxsLWRheSBldmVudHMgYXJlIHN0YXJ0LW9mLWRheSwgc28gd2UgaGF2ZSB0b1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgbWFya2VycyA9IG1hcmtlcnMubWFwKHN0YXJ0T2ZEYXkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya2Vycztcbn1cblxuZnVuY3Rpb24gcGFyc2VFdmVudHMocmF3RXZlbnRzLCBldmVudFNvdXJjZSwgY29udGV4dCwgYWxsb3dPcGVuUmFuZ2UsIGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwKSB7XG4gICAgbGV0IGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICBsZXQgZXZlbnRSZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KTtcbiAgICBmb3IgKGxldCByYXdFdmVudCBvZiByYXdFdmVudHMpIHtcbiAgICAgICAgbGV0IHR1cGxlID0gcGFyc2VFdmVudChyYXdFdmVudCwgZXZlbnRTb3VyY2UsIGNvbnRleHQsIGFsbG93T3BlblJhbmdlLCBldmVudFJlZmluZXJzLCBkZWZJZE1hcCwgaW5zdGFuY2VJZE1hcCk7XG4gICAgICAgIGlmICh0dXBsZSkge1xuICAgICAgICAgICAgZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUsIGV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSkge1xuICAgIGV2ZW50U3RvcmUuZGVmc1t0dXBsZS5kZWYuZGVmSWRdID0gdHVwbGUuZGVmO1xuICAgIGlmICh0dXBsZS5pbnN0YW5jZSkge1xuICAgICAgICBldmVudFN0b3JlLmluc3RhbmNlc1t0dXBsZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSA9IHR1cGxlLmluc3RhbmNlO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRTdG9yZTtcbn1cbi8vIHJldHJpZXZlcyBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIGdyb3VwSWQgYXMgdGhlIGluc3RhbmNlIHNwZWNpZmllZCBieSBgaW5zdGFuY2VJZGBcbi8vIG9yIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBpbnN0YW5jZS5cbi8vIHdoeSBtaWdodCBpbnN0YW5jZUlkIG5vdCBiZSBpbiB0aGUgc3RvcmU/IGFuIGV2ZW50IGZyb20gYW5vdGhlciBjYWxlbmRhcj9cbmZ1bmN0aW9uIGdldFJlbGV2YW50RXZlbnRzKGV2ZW50U3RvcmUsIGluc3RhbmNlSWQpIHtcbiAgICBsZXQgaW5zdGFuY2UgPSBldmVudFN0b3JlLmluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgbGV0IGRlZiA9IGV2ZW50U3RvcmUuZGVmc1tpbnN0YW5jZS5kZWZJZF07XG4gICAgICAgIC8vIGdldCBldmVudHMvaW5zdGFuY2VzIHdpdGggc2FtZSBncm91cFxuICAgICAgICBsZXQgbmV3U3RvcmUgPSBmaWx0ZXJFdmVudFN0b3JlRGVmcyhldmVudFN0b3JlLCAobG9va0RlZikgPT4gaXNFdmVudERlZnNHcm91cGVkKGRlZiwgbG9va0RlZikpO1xuICAgICAgICAvLyBhZGQgdGhlIG9yaWdpbmFsXG4gICAgICAgIC8vIFRPRE86IHdpc2ggd2UgY291bGQgdXNlIGV2ZW50VHVwbGVUb1N0b3JlIG9yIHNvbWV0aGluZyBsaWtlIGl0XG4gICAgICAgIG5ld1N0b3JlLmRlZnNbZGVmLmRlZklkXSA9IGRlZjtcbiAgICAgICAgbmV3U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgIHJldHVybiBuZXdTdG9yZTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xufVxuZnVuY3Rpb24gaXNFdmVudERlZnNHcm91cGVkKGRlZjAsIGRlZjEpIHtcbiAgICByZXR1cm4gQm9vbGVhbihkZWYwLmdyb3VwSWQgJiYgZGVmMC5ncm91cElkID09PSBkZWYxLmdyb3VwSWQpO1xufVxuZnVuY3Rpb24gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCkge1xuICAgIHJldHVybiB7IGRlZnM6IHt9LCBpbnN0YW5jZXM6IHt9IH07XG59XG5mdW5jdGlvbiBtZXJnZUV2ZW50U3RvcmVzKHN0b3JlMCwgc3RvcmUxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdG9yZTAuZGVmcyksIHN0b3JlMS5kZWZzKSxcbiAgICAgICAgaW5zdGFuY2VzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlMC5pbnN0YW5jZXMpLCBzdG9yZTEuaW5zdGFuY2VzKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgZmlsdGVyRnVuYykge1xuICAgIGxldCBkZWZzID0gZmlsdGVySGFzaChldmVudFN0b3JlLmRlZnMsIGZpbHRlckZ1bmMpO1xuICAgIGxldCBpbnN0YW5jZXMgPSBmaWx0ZXJIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCAoaW5zdGFuY2UpID0+IChkZWZzW2luc3RhbmNlLmRlZklkXSAvLyBzdGlsbCBleGlzdHM/XG4gICAgKSk7XG4gICAgcmV0dXJuIHsgZGVmcywgaW5zdGFuY2VzIH07XG59XG5mdW5jdGlvbiBleGNsdWRlU3ViRXZlbnRTdG9yZShtYXN0ZXIsIHN1Yikge1xuICAgIGxldCB7IGRlZnMsIGluc3RhbmNlcyB9ID0gbWFzdGVyO1xuICAgIGxldCBmaWx0ZXJlZERlZnMgPSB7fTtcbiAgICBsZXQgZmlsdGVyZWRJbnN0YW5jZXMgPSB7fTtcbiAgICBmb3IgKGxldCBkZWZJZCBpbiBkZWZzKSB7XG4gICAgICAgIGlmICghc3ViLmRlZnNbZGVmSWRdKSB7IC8vIG5vdCBleHBsaWNpdGx5IGV4Y2x1ZGVkXG4gICAgICAgICAgICBmaWx0ZXJlZERlZnNbZGVmSWRdID0gZGVmc1tkZWZJZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgaWYgKCFzdWIuaW5zdGFuY2VzW2luc3RhbmNlSWRdICYmIC8vIG5vdCBleHBsaWNpdGx5IGV4Y2x1ZGVkXG4gICAgICAgICAgICBmaWx0ZXJlZERlZnNbaW5zdGFuY2VzW2luc3RhbmNlSWRdLmRlZklkXSAvLyBkZWYgd2Fzbid0IGZpbHRlcmVkIGF3YXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZEluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZzOiBmaWx0ZXJlZERlZnMsXG4gICAgICAgIGluc3RhbmNlczogZmlsdGVyZWRJbnN0YW5jZXMsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29uc3RyYWludChpbnB1dCwgY29udGV4dCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICByZXR1cm4gcGFyc2VFdmVudHMoaW5wdXQsIG51bGwsIGNvbnRleHQsIHRydWUpOyAvLyBhbGxvd09wZW5SYW5nZT10cnVlXG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByZXR1cm4gcGFyc2VFdmVudHMoW2lucHV0XSwgbnVsbCwgY29udGV4dCwgdHJ1ZSk7IC8vIGFsbG93T3BlblJhbmdlPXRydWVcbiAgICB9XG4gICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhpbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNsYXNzTmFtZXMocmF3KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgICAgICByZXR1cm4gcmF3O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHJhdy5zcGxpdCgvXFxzKy8pO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59XG5cbi8vIFRPRE86IGJldHRlciBjYWxsZWQgXCJFdmVudFNldHRpbmdzXCIgb3IgXCJFdmVudENvbmZpZ1wiXG4vLyBUT0RPOiBtb3ZlIHRoaXMgZmlsZSBpbnRvIHN0cnVjdHNcbi8vIFRPRE86IHNlcGFyYXRlIGNvbnN0cmFpbnQvb3ZlcmxhcC9hbGxvdywgYmVjYXVzZSBzZWxlY3Rpb24gdXNlcyBvbmx5IHRoYXQsIG5vdCBvdGhlciBwcm9wc1xuY29uc3QgRVZFTlRfVUlfUkVGSU5FUlMgPSB7XG4gICAgZGlzcGxheTogU3RyaW5nLFxuICAgIGVkaXRhYmxlOiBCb29sZWFuLFxuICAgIHN0YXJ0RWRpdGFibGU6IEJvb2xlYW4sXG4gICAgZHVyYXRpb25FZGl0YWJsZTogQm9vbGVhbixcbiAgICBjb25zdHJhaW50OiBpZGVudGl0eSxcbiAgICBvdmVybGFwOiBpZGVudGl0eSxcbiAgICBhbGxvdzogaWRlbnRpdHksXG4gICAgY2xhc3NOYW1lOiBwYXJzZUNsYXNzTmFtZXMsXG4gICAgY2xhc3NOYW1lczogcGFyc2VDbGFzc05hbWVzLFxuICAgIGNvbG9yOiBTdHJpbmcsXG4gICAgYmFja2dyb3VuZENvbG9yOiBTdHJpbmcsXG4gICAgYm9yZGVyQ29sb3I6IFN0cmluZyxcbiAgICB0ZXh0Q29sb3I6IFN0cmluZyxcbn07XG5jb25zdCBFTVBUWV9FVkVOVF9VSSA9IHtcbiAgICBkaXNwbGF5OiBudWxsLFxuICAgIHN0YXJ0RWRpdGFibGU6IG51bGwsXG4gICAgZHVyYXRpb25FZGl0YWJsZTogbnVsbCxcbiAgICBjb25zdHJhaW50czogW10sXG4gICAgb3ZlcmxhcDogbnVsbCxcbiAgICBhbGxvd3M6IFtdLFxuICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgYm9yZGVyQ29sb3I6ICcnLFxuICAgIHRleHRDb2xvcjogJycsXG4gICAgY2xhc3NOYW1lczogW10sXG59O1xuZnVuY3Rpb24gY3JlYXRlRXZlbnRVaShyZWZpbmVkLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnN0cmFpbnQgPSBub3JtYWxpemVDb25zdHJhaW50KHJlZmluZWQuY29uc3RyYWludCwgY29udGV4dCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheTogcmVmaW5lZC5kaXNwbGF5IHx8IG51bGwsXG4gICAgICAgIHN0YXJ0RWRpdGFibGU6IHJlZmluZWQuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gcmVmaW5lZC5zdGFydEVkaXRhYmxlIDogcmVmaW5lZC5lZGl0YWJsZSxcbiAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogcmVmaW5lZC5kdXJhdGlvbkVkaXRhYmxlICE9IG51bGwgPyByZWZpbmVkLmR1cmF0aW9uRWRpdGFibGUgOiByZWZpbmVkLmVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogY29uc3RyYWludCAhPSBudWxsID8gW2NvbnN0cmFpbnRdIDogW10sXG4gICAgICAgIG92ZXJsYXA6IHJlZmluZWQub3ZlcmxhcCAhPSBudWxsID8gcmVmaW5lZC5vdmVybGFwIDogbnVsbCxcbiAgICAgICAgYWxsb3dzOiByZWZpbmVkLmFsbG93ICE9IG51bGwgPyBbcmVmaW5lZC5hbGxvd10gOiBbXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiByZWZpbmVkLmJhY2tncm91bmRDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICBib3JkZXJDb2xvcjogcmVmaW5lZC5ib3JkZXJDb2xvciB8fCByZWZpbmVkLmNvbG9yIHx8ICcnLFxuICAgICAgICB0ZXh0Q29sb3I6IHJlZmluZWQudGV4dENvbG9yIHx8ICcnLFxuICAgICAgICBjbGFzc05hbWVzOiAocmVmaW5lZC5jbGFzc05hbWUgfHwgW10pLmNvbmNhdChyZWZpbmVkLmNsYXNzTmFtZXMgfHwgW10pLCAvLyBqb2luIHNpbmd1bGFyIGFuZCBwbHVyYWxcbiAgICB9O1xufVxuLy8gVE9ETzogcHJldmVudCBhZ2FpbnN0IHByb2JsZW1zIHdpdGggPDIgYXJncyFcbmZ1bmN0aW9uIGNvbWJpbmVFdmVudFVpcyh1aXMpIHtcbiAgICByZXR1cm4gdWlzLnJlZHVjZShjb21iaW5lVHdvRXZlbnRVaXMsIEVNUFRZX0VWRU5UX1VJKTtcbn1cbmZ1bmN0aW9uIGNvbWJpbmVUd29FdmVudFVpcyhpdGVtMCwgaXRlbTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5OiBpdGVtMS5kaXNwbGF5ICE9IG51bGwgPyBpdGVtMS5kaXNwbGF5IDogaXRlbTAuZGlzcGxheSxcbiAgICAgICAgc3RhcnRFZGl0YWJsZTogaXRlbTEuc3RhcnRFZGl0YWJsZSAhPSBudWxsID8gaXRlbTEuc3RhcnRFZGl0YWJsZSA6IGl0ZW0wLnN0YXJ0RWRpdGFibGUsXG4gICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgIT0gbnVsbCA/IGl0ZW0xLmR1cmF0aW9uRWRpdGFibGUgOiBpdGVtMC5kdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICBjb25zdHJhaW50czogaXRlbTAuY29uc3RyYWludHMuY29uY2F0KGl0ZW0xLmNvbnN0cmFpbnRzKSxcbiAgICAgICAgb3ZlcmxhcDogdHlwZW9mIGl0ZW0xLm92ZXJsYXAgPT09ICdib29sZWFuJyA/IGl0ZW0xLm92ZXJsYXAgOiBpdGVtMC5vdmVybGFwLFxuICAgICAgICBhbGxvd3M6IGl0ZW0wLmFsbG93cy5jb25jYXQoaXRlbTEuYWxsb3dzKSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBpdGVtMS5iYWNrZ3JvdW5kQ29sb3IgfHwgaXRlbTAuYmFja2dyb3VuZENvbG9yLFxuICAgICAgICBib3JkZXJDb2xvcjogaXRlbTEuYm9yZGVyQ29sb3IgfHwgaXRlbTAuYm9yZGVyQ29sb3IsXG4gICAgICAgIHRleHRDb2xvcjogaXRlbTEudGV4dENvbG9yIHx8IGl0ZW0wLnRleHRDb2xvcixcbiAgICAgICAgY2xhc3NOYW1lczogaXRlbTAuY2xhc3NOYW1lcy5jb25jYXQoaXRlbTEuY2xhc3NOYW1lcyksXG4gICAgfTtcbn1cblxuY29uc3QgRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlMgPSB7XG4gICAgaWQ6IFN0cmluZyxcbiAgICBncm91cElkOiBTdHJpbmcsXG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICB1cmw6IFN0cmluZyxcbiAgICBpbnRlcmFjdGl2ZTogQm9vbGVhbixcbn07XG5jb25zdCBFVkVOVF9EQVRFX1JFRklORVJTID0ge1xuICAgIHN0YXJ0OiBpZGVudGl0eSxcbiAgICBlbmQ6IGlkZW50aXR5LFxuICAgIGRhdGU6IGlkZW50aXR5LFxuICAgIGFsbERheTogQm9vbGVhbixcbn07XG5jb25zdCBFVkVOVF9SRUZJTkVSUyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBFVkVOVF9OT05fREFURV9SRUZJTkVSUyksIEVWRU5UX0RBVEVfUkVGSU5FUlMpLCB7IGV4dGVuZGVkUHJvcHM6IGlkZW50aXR5IH0pO1xuZnVuY3Rpb24gcGFyc2VFdmVudChyYXcsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgcmVmaW5lcnMgPSBidWlsZEV2ZW50UmVmaW5lcnMoY29udGV4dCksIGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwKSB7XG4gICAgbGV0IHsgcmVmaW5lZCwgZXh0cmEgfSA9IHJlZmluZUV2ZW50RGVmKHJhdywgY29udGV4dCwgcmVmaW5lcnMpO1xuICAgIGxldCBkZWZhdWx0QWxsRGF5ID0gY29tcHV0ZUlzRGVmYXVsdEFsbERheShldmVudFNvdXJjZSwgY29udGV4dCk7XG4gICAgbGV0IHJlY3VycmluZ1JlcyA9IHBhcnNlUmVjdXJyaW5nKHJlZmluZWQsIGRlZmF1bHRBbGxEYXksIGNvbnRleHQuZGF0ZUVudiwgY29udGV4dC5wbHVnaW5Ib29rcy5yZWN1cnJpbmdUeXBlcyk7XG4gICAgaWYgKHJlY3VycmluZ1Jlcykge1xuICAgICAgICBsZXQgZGVmID0gcGFyc2VFdmVudERlZihyZWZpbmVkLCBleHRyYSwgZXZlbnRTb3VyY2UgPyBldmVudFNvdXJjZS5zb3VyY2VJZCA6ICcnLCByZWN1cnJpbmdSZXMuYWxsRGF5LCBCb29sZWFuKHJlY3VycmluZ1Jlcy5kdXJhdGlvbiksIGNvbnRleHQsIGRlZklkTWFwKTtcbiAgICAgICAgZGVmLnJlY3VycmluZ0RlZiA9IHtcbiAgICAgICAgICAgIHR5cGVJZDogcmVjdXJyaW5nUmVzLnR5cGVJZCxcbiAgICAgICAgICAgIHR5cGVEYXRhOiByZWN1cnJpbmdSZXMudHlwZURhdGEsXG4gICAgICAgICAgICBkdXJhdGlvbjogcmVjdXJyaW5nUmVzLmR1cmF0aW9uLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBkZWYsIGluc3RhbmNlOiBudWxsIH07XG4gICAgfVxuICAgIGxldCBzaW5nbGVSZXMgPSBwYXJzZVNpbmdsZShyZWZpbmVkLCBkZWZhdWx0QWxsRGF5LCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSk7XG4gICAgaWYgKHNpbmdsZVJlcykge1xuICAgICAgICBsZXQgZGVmID0gcGFyc2VFdmVudERlZihyZWZpbmVkLCBleHRyYSwgZXZlbnRTb3VyY2UgPyBldmVudFNvdXJjZS5zb3VyY2VJZCA6ICcnLCBzaW5nbGVSZXMuYWxsRGF5LCBzaW5nbGVSZXMuaGFzRW5kLCBjb250ZXh0LCBkZWZJZE1hcCk7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmLmRlZklkLCBzaW5nbGVSZXMucmFuZ2UsIHNpbmdsZVJlcy5mb3JjZWRTdGFydFR6bywgc2luZ2xlUmVzLmZvcmNlZEVuZFR6byk7XG4gICAgICAgIGlmIChpbnN0YW5jZUlkTWFwICYmIGRlZi5wdWJsaWNJZCAmJiBpbnN0YW5jZUlkTWFwW2RlZi5wdWJsaWNJZF0pIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmluc3RhbmNlSWQgPSBpbnN0YW5jZUlkTWFwW2RlZi5wdWJsaWNJZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZGVmLCBpbnN0YW5jZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJlZmluZUV2ZW50RGVmKHJhdywgY29udGV4dCwgcmVmaW5lcnMgPSBidWlsZEV2ZW50UmVmaW5lcnMoY29udGV4dCkpIHtcbiAgICByZXR1cm4gcmVmaW5lUHJvcHMocmF3LCByZWZpbmVycyk7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50UmVmaW5lcnMoY29udGV4dCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRVZFTlRfVUlfUkVGSU5FUlMpLCBFVkVOVF9SRUZJTkVSUyksIGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRSZWZpbmVycyk7XG59XG4vKlxuV2lsbCBOT1QgcG9wdWxhdGUgZXh0ZW5kZWRQcm9wcyB3aXRoIHRoZSBsZWZ0b3ZlciBwcm9wZXJ0aWVzLlxuV2lsbCBOT1QgcG9wdWxhdGUgZGF0ZS1yZWxhdGVkIHByb3BzLlxuKi9cbmZ1bmN0aW9uIHBhcnNlRXZlbnREZWYocmVmaW5lZCwgZXh0cmEsIHNvdXJjZUlkLCBhbGxEYXksIGhhc0VuZCwgY29udGV4dCwgZGVmSWRNYXApIHtcbiAgICBsZXQgZGVmID0ge1xuICAgICAgICB0aXRsZTogcmVmaW5lZC50aXRsZSB8fCAnJyxcbiAgICAgICAgZ3JvdXBJZDogcmVmaW5lZC5ncm91cElkIHx8ICcnLFxuICAgICAgICBwdWJsaWNJZDogcmVmaW5lZC5pZCB8fCAnJyxcbiAgICAgICAgdXJsOiByZWZpbmVkLnVybCB8fCAnJyxcbiAgICAgICAgcmVjdXJyaW5nRGVmOiBudWxsLFxuICAgICAgICBkZWZJZDogKChkZWZJZE1hcCAmJiByZWZpbmVkLmlkKSA/IGRlZklkTWFwW3JlZmluZWQuaWRdIDogJycpIHx8IGd1aWQoKSxcbiAgICAgICAgc291cmNlSWQsXG4gICAgICAgIGFsbERheSxcbiAgICAgICAgaGFzRW5kLFxuICAgICAgICBpbnRlcmFjdGl2ZTogcmVmaW5lZC5pbnRlcmFjdGl2ZSxcbiAgICAgICAgdWk6IGNyZWF0ZUV2ZW50VWkocmVmaW5lZCwgY29udGV4dCksXG4gICAgICAgIGV4dGVuZGVkUHJvcHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHJlZmluZWQuZXh0ZW5kZWRQcm9wcyB8fCB7fSkpLCBleHRyYSksXG4gICAgfTtcbiAgICBmb3IgKGxldCBtZW1iZXJBZGRlciBvZiBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50RGVmTWVtYmVyQWRkZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGVmLCBtZW1iZXJBZGRlcihyZWZpbmVkKSk7XG4gICAgfVxuICAgIC8vIGhlbHAgb3V0IEV2ZW50SW1wbCBmcm9tIGhhdmluZyB1c2VyIG1vZGlmeSBwcm9wc1xuICAgIE9iamVjdC5mcmVlemUoZGVmLnVpLmNsYXNzTmFtZXMpO1xuICAgIE9iamVjdC5mcmVlemUoZGVmLmV4dGVuZGVkUHJvcHMpO1xuICAgIHJldHVybiBkZWY7XG59XG5mdW5jdGlvbiBwYXJzZVNpbmdsZShyZWZpbmVkLCBkZWZhdWx0QWxsRGF5LCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSkge1xuICAgIGxldCB7IGFsbERheSB9ID0gcmVmaW5lZDtcbiAgICBsZXQgc3RhcnRNZXRhO1xuICAgIGxldCBzdGFydE1hcmtlciA9IG51bGw7XG4gICAgbGV0IGhhc0VuZCA9IGZhbHNlO1xuICAgIGxldCBlbmRNZXRhO1xuICAgIGxldCBlbmRNYXJrZXIgPSBudWxsO1xuICAgIGxldCBzdGFydElucHV0ID0gcmVmaW5lZC5zdGFydCAhPSBudWxsID8gcmVmaW5lZC5zdGFydCA6IHJlZmluZWQuZGF0ZTtcbiAgICBzdGFydE1ldGEgPSBjb250ZXh0LmRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShzdGFydElucHV0KTtcbiAgICBpZiAoc3RhcnRNZXRhKSB7XG4gICAgICAgIHN0YXJ0TWFya2VyID0gc3RhcnRNZXRhLm1hcmtlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWFsbG93T3BlblJhbmdlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocmVmaW5lZC5lbmQgIT0gbnVsbCkge1xuICAgICAgICBlbmRNZXRhID0gY29udGV4dC5kYXRlRW52LmNyZWF0ZU1hcmtlck1ldGEocmVmaW5lZC5lbmQpO1xuICAgIH1cbiAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgaWYgKGRlZmF1bHRBbGxEYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgYWxsRGF5ID0gZGVmYXVsdEFsbERheTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgZGF0ZSBwcm9wcyBMQVNUXG4gICAgICAgICAgICBhbGxEYXkgPSAoIXN0YXJ0TWV0YSB8fCBzdGFydE1ldGEuaXNUaW1lVW5zcGVjaWZpZWQpICYmXG4gICAgICAgICAgICAgICAgKCFlbmRNZXRhIHx8IGVuZE1ldGEuaXNUaW1lVW5zcGVjaWZpZWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChhbGxEYXkgJiYgc3RhcnRNYXJrZXIpIHtcbiAgICAgICAgc3RhcnRNYXJrZXIgPSBzdGFydE9mRGF5KHN0YXJ0TWFya2VyKTtcbiAgICB9XG4gICAgaWYgKGVuZE1ldGEpIHtcbiAgICAgICAgZW5kTWFya2VyID0gZW5kTWV0YS5tYXJrZXI7XG4gICAgICAgIGlmIChhbGxEYXkpIHtcbiAgICAgICAgICAgIGVuZE1hcmtlciA9IHN0YXJ0T2ZEYXkoZW5kTWFya2VyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyIDw9IHN0YXJ0TWFya2VyKSB7XG4gICAgICAgICAgICBlbmRNYXJrZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbmRNYXJrZXIpIHtcbiAgICAgICAgaGFzRW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWFsbG93T3BlblJhbmdlKSB7XG4gICAgICAgIGhhc0VuZCA9IGNvbnRleHQub3B0aW9ucy5mb3JjZUV2ZW50RHVyYXRpb24gfHwgZmFsc2U7XG4gICAgICAgIGVuZE1hcmtlciA9IGNvbnRleHQuZGF0ZUVudi5hZGQoc3RhcnRNYXJrZXIsIGFsbERheSA/XG4gICAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24gOlxuICAgICAgICAgICAgY29udGV4dC5vcHRpb25zLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxEYXksXG4gICAgICAgIGhhc0VuZCxcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IHN0YXJ0TWFya2VyLCBlbmQ6IGVuZE1hcmtlciB9LFxuICAgICAgICBmb3JjZWRTdGFydFR6bzogc3RhcnRNZXRhID8gc3RhcnRNZXRhLmZvcmNlZFR6byA6IG51bGwsXG4gICAgICAgIGZvcmNlZEVuZFR6bzogZW5kTWV0YSA/IGVuZE1ldGEuZm9yY2VkVHpvIDogbnVsbCxcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZUlzRGVmYXVsdEFsbERheShldmVudFNvdXJjZSwgY29udGV4dCkge1xuICAgIGxldCByZXMgPSBudWxsO1xuICAgIGlmIChldmVudFNvdXJjZSkge1xuICAgICAgICByZXMgPSBldmVudFNvdXJjZS5kZWZhdWx0QWxsRGF5O1xuICAgIH1cbiAgICBpZiAocmVzID09IG51bGwpIHtcbiAgICAgICAgcmVzID0gY29udGV4dC5vcHRpb25zLmRlZmF1bHRBbGxEYXk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbmNvbnN0IERFRl9ERUZBVUxUUyA9IHtcbiAgICBzdGFydFRpbWU6ICcwOTowMCcsXG4gICAgZW5kVGltZTogJzE3OjAwJyxcbiAgICBkYXlzT2ZXZWVrOiBbMSwgMiwgMywgNCwgNV0sXG4gICAgZGlzcGxheTogJ2ludmVyc2UtYmFja2dyb3VuZCcsXG4gICAgY2xhc3NOYW1lczogJ2ZjLW5vbi1idXNpbmVzcycsXG4gICAgZ3JvdXBJZDogJ19idXNpbmVzc0hvdXJzJywgLy8gc28gbXVsdGlwbGUgZGVmcyBnZXQgZ3JvdXBlZFxufTtcbi8qXG5UT0RPOiBwYXNzIGFyb3VuZCBhcyBFdmVudERlZkhhc2ghISFcbiovXG5mdW5jdGlvbiBwYXJzZUJ1c2luZXNzSG91cnMoaW5wdXQsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gcGFyc2VFdmVudHMocmVmaW5lSW5wdXRzKGlucHV0KSwgbnVsbCwgY29udGV4dCk7XG59XG5mdW5jdGlvbiByZWZpbmVJbnB1dHMoaW5wdXQpIHtcbiAgICBsZXQgcmF3RGVmcztcbiAgICBpZiAoaW5wdXQgPT09IHRydWUpIHtcbiAgICAgICAgcmF3RGVmcyA9IFt7fV07IC8vIHdpbGwgZ2V0IERFRl9ERUZBVUxUUyB2ZXJiYXRpbVxuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAvLyBpZiBzcGVjaWZ5aW5nIGFuIGFycmF5LCBldmVyeSBzdWItZGVmaW5pdGlvbiBORUVEUyBhIGRheS1vZi13ZWVrXG4gICAgICAgIHJhd0RlZnMgPSBpbnB1dC5maWx0ZXIoKHJhd0RlZikgPT4gcmF3RGVmLmRheXNPZldlZWspO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByYXdEZWZzID0gW2lucHV0XTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIGlzIHByb2JhYmx5IGZhbHNlXG4gICAgICAgIHJhd0RlZnMgPSBbXTtcbiAgICB9XG4gICAgcmF3RGVmcyA9IHJhd0RlZnMubWFwKChyYXdEZWYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIERFRl9ERUZBVUxUUyksIHJhd0RlZikpKTtcbiAgICByZXR1cm4gcmF3RGVmcztcbn1cblxuLyogRGF0ZSBzdHVmZiB0aGF0IGRvZXNuJ3QgYmVsb25nIGluIGRhdGVsaWIgY29yZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBnaXZlbiBhIHRpbWVkIHJhbmdlLCBjb21wdXRlcyBhbiBhbGwtZGF5IHJhbmdlIHRoYXQgaGFzIHRoZSBzYW1lIGV4YWN0IGR1cmF0aW9uLFxuLy8gYnV0IHdob3NlIHN0YXJ0IHRpbWUgaXMgYWxpZ25lZCB3aXRoIHRoZSBzdGFydCBvZiB0aGUgZGF5LlxuZnVuY3Rpb24gY29tcHV0ZUFsaWduZWREYXlSYW5nZSh0aW1lZFJhbmdlKSB7XG4gICAgbGV0IGRheUNudCA9IE1hdGguZmxvb3IoZGlmZkRheXModGltZWRSYW5nZS5zdGFydCwgdGltZWRSYW5nZS5lbmQpKSB8fCAxO1xuICAgIGxldCBzdGFydCA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5zdGFydCk7XG4gICAgbGV0IGVuZCA9IGFkZERheXMoc3RhcnQsIGRheUNudCk7XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuLy8gZ2l2ZW4gYSB0aW1lZCByYW5nZSwgY29tcHV0ZXMgYW4gYWxsLWRheSByYW5nZSBiYXNlZCBvbiBob3cgZm9yIHRoZSBlbmQgZGF0ZSBibGVlZHMgaW50byB0aGUgbmV4dCBkYXlcbi8vIFRPRE86IGdpdmUgbmV4dERheVRocmVzaG9sZCBhIGRlZmF1bHQgYXJnXG5mdW5jdGlvbiBjb21wdXRlVmlzaWJsZURheVJhbmdlKHRpbWVkUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQgPSBjcmVhdGVEdXJhdGlvbigwKSkge1xuICAgIGxldCBzdGFydERheSA9IG51bGw7XG4gICAgbGV0IGVuZERheSA9IG51bGw7XG4gICAgaWYgKHRpbWVkUmFuZ2UuZW5kKSB7XG4gICAgICAgIGVuZERheSA9IHN0YXJ0T2ZEYXkodGltZWRSYW5nZS5lbmQpO1xuICAgICAgICBsZXQgZW5kVGltZU1TID0gdGltZWRSYW5nZS5lbmQudmFsdWVPZigpIC0gZW5kRGF5LnZhbHVlT2YoKTsgLy8gIyBvZiBtaWxsaXNlY29uZHMgaW50byBgZW5kRGF5YFxuICAgICAgICAvLyBJZiB0aGUgZW5kIHRpbWUgaXMgYWN0dWFsbHkgaW5jbHVzaXZlbHkgcGFydCBvZiB0aGUgbmV4dCBkYXkgYW5kIGlzIGVxdWFsIHRvIG9yXG4gICAgICAgIC8vIGJleW9uZCB0aGUgbmV4dCBkYXkgdGhyZXNob2xkLCBhZGp1c3QgdGhlIGVuZCB0byBiZSB0aGUgZXhjbHVzaXZlIGVuZCBvZiBgZW5kRGF5YC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBsZWF2aW5nIGl0IGFzIGluY2x1c2l2ZSB3aWxsIGNhdXNlIGl0IHRvIGV4Y2x1ZGUgYGVuZERheWAuXG4gICAgICAgIGlmIChlbmRUaW1lTVMgJiYgZW5kVGltZU1TID49IGFzUm91Z2hNcyhuZXh0RGF5VGhyZXNob2xkKSkge1xuICAgICAgICAgICAgZW5kRGF5ID0gYWRkRGF5cyhlbmREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lZFJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0RGF5ID0gc3RhcnRPZkRheSh0aW1lZFJhbmdlLnN0YXJ0KTsgLy8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZGF5IHRoZSByYW5nZSBzdGFydHNcbiAgICAgICAgLy8gSWYgZW5kIGlzIHdpdGhpbiBgc3RhcnREYXlgIGJ1dCBub3QgcGFzdCBuZXh0RGF5VGhyZXNob2xkLCBhc3NpZ24gdGhlIGRlZmF1bHQgZHVyYXRpb24gb2Ygb25lIGRheS5cbiAgICAgICAgaWYgKGVuZERheSAmJiBlbmREYXkgPD0gc3RhcnREYXkpIHtcbiAgICAgICAgICAgIGVuZERheSA9IGFkZERheXMoc3RhcnREYXksIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydERheSwgZW5kOiBlbmREYXkgfTtcbn1cbi8vIHNwYW5zIGZyb20gb25lIGRheSBpbnRvIGFub3RoZXI/XG5mdW5jdGlvbiBpc011bHRpRGF5UmFuZ2UocmFuZ2UpIHtcbiAgICBsZXQgdmlzaWJsZVJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIGRpZmZEYXlzKHZpc2libGVSYW5nZS5zdGFydCwgdmlzaWJsZVJhbmdlLmVuZCkgPiAxO1xufVxuZnVuY3Rpb24gZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgZGF0ZUVudiwgbGFyZ2VVbml0KSB7XG4gICAgaWYgKGxhcmdlVW5pdCA9PT0gJ3llYXInKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihkYXRlRW52LmRpZmZXaG9sZVllYXJzKGRhdGUwLCBkYXRlMSksICd5ZWFyJyk7XG4gICAgfVxuICAgIGlmIChsYXJnZVVuaXQgPT09ICdtb250aCcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGRhdGVFbnYuZGlmZldob2xlTW9udGhzKGRhdGUwLCBkYXRlMSksICdtb250aCcpO1xuICAgIH1cbiAgICByZXR1cm4gZGlmZkRheUFuZFRpbWUoZGF0ZTAsIGRhdGUxKTsgLy8gcmV0dXJucyBhIGR1cmF0aW9uXG59XG5cbmZ1bmN0aW9uIHBvaW50SW5zaWRlUmVjdChwb2ludCwgcmVjdCkge1xuICAgIHJldHVybiBwb2ludC5sZWZ0ID49IHJlY3QubGVmdCAmJlxuICAgICAgICBwb2ludC5sZWZ0IDwgcmVjdC5yaWdodCAmJlxuICAgICAgICBwb2ludC50b3AgPj0gcmVjdC50b3AgJiZcbiAgICAgICAgcG9pbnQudG9wIDwgcmVjdC5ib3R0b207XG59XG4vLyBSZXR1cm5zIGEgbmV3IHJlY3RhbmdsZSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byByZWN0YW5nbGVzLiBJZiB0aGV5IGRvbid0IGludGVyc2VjdCwgcmV0dXJucyBmYWxzZVxuZnVuY3Rpb24gaW50ZXJzZWN0UmVjdHMocmVjdDEsIHJlY3QyKSB7XG4gICAgbGV0IHJlcyA9IHtcbiAgICAgICAgbGVmdDogTWF0aC5tYXgocmVjdDEubGVmdCwgcmVjdDIubGVmdCksXG4gICAgICAgIHJpZ2h0OiBNYXRoLm1pbihyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpLFxuICAgICAgICB0b3A6IE1hdGgubWF4KHJlY3QxLnRvcCwgcmVjdDIudG9wKSxcbiAgICAgICAgYm90dG9tOiBNYXRoLm1pbihyZWN0MS5ib3R0b20sIHJlY3QyLmJvdHRvbSksXG4gICAgfTtcbiAgICBpZiAocmVzLmxlZnQgPCByZXMucmlnaHQgJiYgcmVzLnRvcCA8IHJlcy5ib3R0b20pIHtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdHJhbnNsYXRlUmVjdChyZWN0LCBkZWx0YVgsIGRlbHRhWSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGRlbHRhWCxcbiAgICAgICAgcmlnaHQ6IHJlY3QucmlnaHQgKyBkZWx0YVgsXG4gICAgICAgIHRvcDogcmVjdC50b3AgKyBkZWx0YVksXG4gICAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20gKyBkZWx0YVksXG4gICAgfTtcbn1cbi8vIFJldHVybnMgYSBuZXcgcG9pbnQgdGhhdCB3aWxsIGhhdmUgYmVlbiBtb3ZlZCB0byByZXNpZGUgd2l0aGluIHRoZSBnaXZlbiByZWN0YW5nbGVcbmZ1bmN0aW9uIGNvbnN0cmFpblBvaW50KHBvaW50LCByZWN0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogTWF0aC5taW4oTWF0aC5tYXgocG9pbnQubGVmdCwgcmVjdC5sZWZ0KSwgcmVjdC5yaWdodCksXG4gICAgICAgIHRvcDogTWF0aC5taW4oTWF0aC5tYXgocG9pbnQudG9wLCByZWN0LnRvcCksIHJlY3QuYm90dG9tKSxcbiAgICB9O1xufVxuLy8gUmV0dXJucyBhIHBvaW50IHRoYXQgaXMgdGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gcmVjdGFuZ2xlXG5mdW5jdGlvbiBnZXRSZWN0Q2VudGVyKHJlY3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyLFxuICAgICAgICB0b3A6IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDIsXG4gICAgfTtcbn1cbi8vIFN1YnRyYWN0cyBwb2ludDIncyBjb29yZGluYXRlcyBmcm9tIHBvaW50MSdzIGNvb3JkaW5hdGVzLCByZXR1cm5pbmcgYSBkZWx0YVxuZnVuY3Rpb24gZGlmZlBvaW50cyhwb2ludDEsIHBvaW50Mikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IHBvaW50MS5sZWZ0IC0gcG9pbnQyLmxlZnQsXG4gICAgICAgIHRvcDogcG9pbnQxLnRvcCAtIHBvaW50Mi50b3AsXG4gICAgfTtcbn1cblxubGV0IGNhblZHcm93V2l0aGluQ2VsbDtcbmZ1bmN0aW9uIGdldENhblZHcm93V2l0aGluQ2VsbCgpIHtcbiAgICBpZiAoY2FuVkdyb3dXaXRoaW5DZWxsID09IG51bGwpIHtcbiAgICAgICAgY2FuVkdyb3dXaXRoaW5DZWxsID0gY29tcHV0ZUNhblZHcm93V2l0aGluQ2VsbCgpO1xuICAgIH1cbiAgICByZXR1cm4gY2FuVkdyb3dXaXRoaW5DZWxsO1xufVxuZnVuY3Rpb24gY29tcHV0ZUNhblZHcm93V2l0aGluQ2VsbCgpIHtcbiAgICAvLyBmb3IgU1NSLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbCBpbW1lZGlhdGVseSBhdCB0b3AtbGV2ZWxcbiAgICAvLyBUT0RPOiBqdXN0IG1ha2UgdGhpcyBsb2dpYyBleGVjdXRlIHRvcC1sZXZlbCwgaW1tZWRpYXRlbHksIGluc3RlYWQgb2YgZG9pbmcgbGF6aWx5XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBlbC5zdHlsZS50b3AgPSAnMHB4JztcbiAgICBlbC5zdHlsZS5sZWZ0ID0gJzBweCc7XG4gICAgZWwuaW5uZXJIVE1MID0gJzx0YWJsZT48dHI+PHRkPjxkaXY+PC9kaXY+PC90ZD48L3RyPjwvdGFibGU+JztcbiAgICBlbC5xdWVyeVNlbGVjdG9yKCd0YWJsZScpLnN0eWxlLmhlaWdodCA9ICcxMDBweCc7XG4gICAgZWwucXVlcnlTZWxlY3RvcignZGl2Jykuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIGxldCBkaXYgPSBlbC5xdWVyeVNlbGVjdG9yKCdkaXYnKTtcbiAgICBsZXQgcG9zc2libGUgPSBkaXYub2Zmc2V0SGVpZ2h0ID4gMDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsKTtcbiAgICByZXR1cm4gcG9zc2libGU7XG59XG5cbmNvbnN0IEVNUFRZX0VWRU5UX1NUT1JFID0gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7IC8vIGZvciBwdXJlY29tcG9uZW50cy4gVE9ETzoga2VlcCBlbHNld2hlcmVcbmNsYXNzIFNwbGl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5nZXRLZXlzRm9yRXZlbnREZWZzID0gbWVtb2l6ZSh0aGlzLl9nZXRLZXlzRm9yRXZlbnREZWZzKTtcbiAgICAgICAgdGhpcy5zcGxpdERhdGVTZWxlY3Rpb24gPSBtZW1vaXplKHRoaXMuX3NwbGl0RGF0ZVNwYW4pO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnRTdG9yZSA9IG1lbW9pemUodGhpcy5fc3BsaXRFdmVudFN0b3JlKTtcbiAgICAgICAgdGhpcy5zcGxpdEluZGl2aWR1YWxVaSA9IG1lbW9pemUodGhpcy5fc3BsaXRJbmRpdmlkdWFsVWkpO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnREcmFnID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEludGVyYWN0aW9uKTtcbiAgICAgICAgdGhpcy5zcGxpdEV2ZW50UmVzaXplID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEludGVyYWN0aW9uKTtcbiAgICAgICAgdGhpcy5ldmVudFVpQnVpbGRlcnMgPSB7fTsgLy8gVE9ETzogdHlwZXNjcmlwdCBwcm90ZWN0aW9uXG4gICAgfVxuICAgIHNwbGl0UHJvcHMocHJvcHMpIHtcbiAgICAgICAgbGV0IGtleUluZm9zID0gdGhpcy5nZXRLZXlJbmZvKHByb3BzKTtcbiAgICAgICAgbGV0IGRlZktleXMgPSB0aGlzLmdldEtleXNGb3JFdmVudERlZnMocHJvcHMuZXZlbnRTdG9yZSk7XG4gICAgICAgIGxldCBkYXRlU2VsZWN0aW9ucyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uKHByb3BzLmRhdGVTZWxlY3Rpb24pO1xuICAgICAgICBsZXQgaW5kaXZpZHVhbFVpID0gdGhpcy5zcGxpdEluZGl2aWR1YWxVaShwcm9wcy5ldmVudFVpQmFzZXMsIGRlZktleXMpOyAvLyB0aGUgaW5kaXZpZHVhbCAqYmFzZXMqXG4gICAgICAgIGxldCBldmVudFN0b3JlcyA9IHRoaXMuc3BsaXRFdmVudFN0b3JlKHByb3BzLmV2ZW50U3RvcmUsIGRlZktleXMpO1xuICAgICAgICBsZXQgZXZlbnREcmFncyA9IHRoaXMuc3BsaXRFdmVudERyYWcocHJvcHMuZXZlbnREcmFnKTtcbiAgICAgICAgbGV0IGV2ZW50UmVzaXplcyA9IHRoaXMuc3BsaXRFdmVudFJlc2l6ZShwcm9wcy5ldmVudFJlc2l6ZSk7XG4gICAgICAgIGxldCBzcGxpdFByb3BzID0ge307XG4gICAgICAgIHRoaXMuZXZlbnRVaUJ1aWxkZXJzID0gbWFwSGFzaChrZXlJbmZvcywgKGluZm8sIGtleSkgPT4gdGhpcy5ldmVudFVpQnVpbGRlcnNba2V5XSB8fCBtZW1vaXplKGJ1aWxkRXZlbnRVaUZvcktleSkpO1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4ga2V5SW5mb3MpIHtcbiAgICAgICAgICAgIGxldCBrZXlJbmZvID0ga2V5SW5mb3Nba2V5XTtcbiAgICAgICAgICAgIGxldCBldmVudFN0b3JlID0gZXZlbnRTdG9yZXNba2V5XSB8fCBFTVBUWV9FVkVOVF9TVE9SRTtcbiAgICAgICAgICAgIGxldCBidWlsZEV2ZW50VWkgPSB0aGlzLmV2ZW50VWlCdWlsZGVyc1trZXldO1xuICAgICAgICAgICAgc3BsaXRQcm9wc1trZXldID0ge1xuICAgICAgICAgICAgICAgIGJ1c2luZXNzSG91cnM6IGtleUluZm8uYnVzaW5lc3NIb3VycyB8fCBwcm9wcy5idXNpbmVzc0hvdXJzLFxuICAgICAgICAgICAgICAgIGRhdGVTZWxlY3Rpb246IGRhdGVTZWxlY3Rpb25zW2tleV0gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlLFxuICAgICAgICAgICAgICAgIGV2ZW50VWlCYXNlczogYnVpbGRFdmVudFVpKHByb3BzLmV2ZW50VWlCYXNlc1snJ10sIGtleUluZm8udWksIGluZGl2aWR1YWxVaVtrZXldKSxcbiAgICAgICAgICAgICAgICBldmVudFNlbGVjdGlvbjogZXZlbnRTdG9yZS5pbnN0YW5jZXNbcHJvcHMuZXZlbnRTZWxlY3Rpb25dID8gcHJvcHMuZXZlbnRTZWxlY3Rpb24gOiAnJyxcbiAgICAgICAgICAgICAgICBldmVudERyYWc6IGV2ZW50RHJhZ3Nba2V5XSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGV2ZW50UmVzaXplOiBldmVudFJlc2l6ZXNba2V5XSB8fCBudWxsLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRQcm9wcztcbiAgICB9XG4gICAgX3NwbGl0RGF0ZVNwYW4oZGF0ZVNwYW4pIHtcbiAgICAgICAgbGV0IGRhdGVTcGFucyA9IHt9O1xuICAgICAgICBpZiAoZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzRm9yRGF0ZVNwYW4oZGF0ZVNwYW4pO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICBkYXRlU3BhbnNba2V5XSA9IGRhdGVTcGFuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlU3BhbnM7XG4gICAgfVxuICAgIF9nZXRLZXlzRm9yRXZlbnREZWZzKGV2ZW50U3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIG1hcEhhc2goZXZlbnRTdG9yZS5kZWZzLCAoZXZlbnREZWYpID0+IHRoaXMuZ2V0S2V5c0ZvckV2ZW50RGVmKGV2ZW50RGVmKSk7XG4gICAgfVxuICAgIF9zcGxpdEV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgZGVmS2V5cykge1xuICAgICAgICBsZXQgeyBkZWZzLCBpbnN0YW5jZXMgfSA9IGV2ZW50U3RvcmU7XG4gICAgICAgIGxldCBzcGxpdFN0b3JlcyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBkZWZJZCBpbiBkZWZzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgZGVmS2V5c1tkZWZJZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNwbGl0U3RvcmVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc3BsaXRTdG9yZXNba2V5XSA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzcGxpdFN0b3Jlc1trZXldLmRlZnNbZGVmSWRdID0gZGVmc1tkZWZJZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBkZWZLZXlzW2luc3RhbmNlLmRlZklkXSkge1xuICAgICAgICAgICAgICAgIGlmIChzcGxpdFN0b3Jlc1trZXldKSB7IC8vIG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gY3JlYXRlZFxuICAgICAgICAgICAgICAgICAgICBzcGxpdFN0b3Jlc1trZXldLmluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRTdG9yZXM7XG4gICAgfVxuICAgIF9zcGxpdEluZGl2aWR1YWxVaShldmVudFVpQmFzZXMsIGRlZktleXMpIHtcbiAgICAgICAgbGV0IHNwbGl0SGFzaGVzID0ge307XG4gICAgICAgIGZvciAobGV0IGRlZklkIGluIGV2ZW50VWlCYXNlcykge1xuICAgICAgICAgICAgaWYgKGRlZklkKSB7IC8vIG5vdCB0aGUgJycga2V5XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGRlZktleXNbZGVmSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3BsaXRIYXNoZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BsaXRIYXNoZXNba2V5XSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0SGFzaGVzW2tleV1bZGVmSWRdID0gZXZlbnRVaUJhc2VzW2RlZklkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwbGl0SGFzaGVzO1xuICAgIH1cbiAgICBfc3BsaXRJbnRlcmFjdGlvbihpbnRlcmFjdGlvbikge1xuICAgICAgICBsZXQgc3BsaXRTdGF0ZXMgPSB7fTtcbiAgICAgICAgaWYgKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICBsZXQgYWZmZWN0ZWRTdG9yZXMgPSB0aGlzLl9zcGxpdEV2ZW50U3RvcmUoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMsIHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMpKTtcbiAgICAgICAgICAgIC8vIGNhbid0IHJlbHkgb24gZGVmS2V5cyBiZWNhdXNlIGV2ZW50IGRhdGEgaXMgbXV0YXRlZFxuICAgICAgICAgICAgbGV0IG11dGF0ZWRLZXlzQnlEZWZJZCA9IHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMoaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyk7XG4gICAgICAgICAgICBsZXQgbXV0YXRlZFN0b3JlcyA9IHRoaXMuX3NwbGl0RXZlbnRTdG9yZShpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzLCBtdXRhdGVkS2V5c0J5RGVmSWQpO1xuICAgICAgICAgICAgbGV0IHBvcHVsYXRlID0gKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3BsaXRTdGF0ZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdFN0YXRlc1trZXldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IGFmZmVjdGVkU3RvcmVzW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBtdXRhdGVkU3RvcmVzW2tleV0gfHwgRU1QVFlfRVZFTlRfU1RPUkUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0V2ZW50OiBpbnRlcmFjdGlvbi5pc0V2ZW50LFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gYWZmZWN0ZWRTdG9yZXMpIHtcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG11dGF0ZWRTdG9yZXMpIHtcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGxpdFN0YXRlcztcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50VWlGb3JLZXkoYWxsVWksIGV2ZW50VWlGb3JLZXksIGluZGl2aWR1YWxVaSkge1xuICAgIGxldCBiYXNlUGFydHMgPSBbXTtcbiAgICBpZiAoYWxsVWkpIHtcbiAgICAgICAgYmFzZVBhcnRzLnB1c2goYWxsVWkpO1xuICAgIH1cbiAgICBpZiAoZXZlbnRVaUZvcktleSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChldmVudFVpRm9yS2V5KTtcbiAgICB9XG4gICAgbGV0IHN0dWZmID0ge1xuICAgICAgICAnJzogY29tYmluZUV2ZW50VWlzKGJhc2VQYXJ0cyksXG4gICAgfTtcbiAgICBpZiAoaW5kaXZpZHVhbFVpKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3R1ZmYsIGluZGl2aWR1YWxVaSk7XG4gICAgfVxuICAgIHJldHVybiBzdHVmZjtcbn1cblxuZnVuY3Rpb24gcGFyc2VSYW5nZShpbnB1dCwgZGF0ZUVudikge1xuICAgIGxldCBzdGFydCA9IG51bGw7XG4gICAgbGV0IGVuZCA9IG51bGw7XG4gICAgaWYgKGlucHV0LnN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoaW5wdXQuc3RhcnQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQuZW5kKSB7XG4gICAgICAgIGVuZCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKGlucHV0LmVuZCk7XG4gICAgfVxuICAgIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICYmIGVuZCAmJiBlbmQgPCBzdGFydCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuLy8gU0lERS1FRkZFQ1Q6IHdpbGwgbXV0YXRlIHJhbmdlcy5cbi8vIFdpbGwgcmV0dXJuIGEgbmV3IGFycmF5IHJlc3VsdC5cbmZ1bmN0aW9uIGludmVydFJhbmdlcyhyYW5nZXMsIGNvbnN0cmFpbnRSYW5nZSkge1xuICAgIGxldCBpbnZlcnRlZFJhbmdlcyA9IFtdO1xuICAgIGxldCB7IHN0YXJ0IH0gPSBjb25zdHJhaW50UmFuZ2U7IC8vIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJhbmdlLiB0aGUgc3RhcnQgb2YgdGhlIG5ldyByYW5nZVxuICAgIGxldCBpO1xuICAgIGxldCBkYXRlUmFuZ2U7XG4gICAgLy8gcmFuZ2VzIG5lZWQgdG8gYmUgaW4gb3JkZXIuIHJlcXVpcmVkIGZvciBvdXIgZGF0ZS13YWxraW5nIGFsZ29yaXRobVxuICAgIHJhbmdlcy5zb3J0KGNvbXBhcmVSYW5nZXMpO1xuICAgIGZvciAoaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgZGF0ZVJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAvLyBhZGQgdGhlIHNwYW4gb2YgdGltZSBiZWZvcmUgdGhlIGV2ZW50IChpZiB0aGVyZSBpcyBhbnkpXG4gICAgICAgIGlmIChkYXRlUmFuZ2Uuc3RhcnQgPiBzdGFydCkgeyAvLyBjb21wYXJlIG1pbGxpc2Vjb25kIHRpbWUgKHNraXAgYW55IGFtYmlnIGxvZ2ljKVxuICAgICAgICAgICAgaW52ZXJ0ZWRSYW5nZXMucHVzaCh7IHN0YXJ0LCBlbmQ6IGRhdGVSYW5nZS5zdGFydCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlLmVuZCA+IHN0YXJ0KSB7XG4gICAgICAgICAgICBzdGFydCA9IGRhdGVSYW5nZS5lbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBzcGFuIG9mIHRpbWUgYWZ0ZXIgdGhlIGxhc3QgZXZlbnQgKGlmIHRoZXJlIGlzIGFueSlcbiAgICBpZiAoc3RhcnQgPCBjb25zdHJhaW50UmFuZ2UuZW5kKSB7IC8vIGNvbXBhcmUgbWlsbGlzZWNvbmQgdGltZSAoc2tpcCBhbnkgYW1iaWcgbG9naWMpXG4gICAgICAgIGludmVydGVkUmFuZ2VzLnB1c2goeyBzdGFydCwgZW5kOiBjb25zdHJhaW50UmFuZ2UuZW5kIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaW52ZXJ0ZWRSYW5nZXM7XG59XG5mdW5jdGlvbiBjb21wYXJlUmFuZ2VzKHJhbmdlMCwgcmFuZ2UxKSB7XG4gICAgcmV0dXJuIHJhbmdlMC5zdGFydC52YWx1ZU9mKCkgLSByYW5nZTEuc3RhcnQudmFsdWVPZigpOyAvLyBlYXJsaWVyIHJhbmdlcyBnbyBmaXJzdFxufVxuZnVuY3Rpb24gaW50ZXJzZWN0UmFuZ2VzKHJhbmdlMCwgcmFuZ2UxKSB7XG4gICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2UwO1xuICAgIGxldCBuZXdSYW5nZSA9IG51bGw7XG4gICAgaWYgKHJhbmdlMS5zdGFydCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RhcnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2UxLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShNYXRoLm1heChzdGFydC52YWx1ZU9mKCksIHJhbmdlMS5zdGFydC52YWx1ZU9mKCkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmFuZ2UxLmVuZCAhPSBudWxsKSB7XG4gICAgICAgIGlmIChlbmQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGVuZCA9IHJhbmdlMS5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbmQgPSBuZXcgRGF0ZShNYXRoLm1pbihlbmQudmFsdWVPZigpLCByYW5nZTEuZW5kLnZhbHVlT2YoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydCA9PT0gbnVsbCB8fCBlbmQgPT09IG51bGwgfHwgc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgbmV3UmFuZ2UgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1JhbmdlO1xufVxuZnVuY3Rpb24gcmFuZ2VzRXF1YWwocmFuZ2UwLCByYW5nZTEpIHtcbiAgICByZXR1cm4gKHJhbmdlMC5zdGFydCA9PT0gbnVsbCA/IG51bGwgOiByYW5nZTAuc3RhcnQudmFsdWVPZigpKSA9PT0gKHJhbmdlMS5zdGFydCA9PT0gbnVsbCA/IG51bGwgOiByYW5nZTEuc3RhcnQudmFsdWVPZigpKSAmJlxuICAgICAgICAocmFuZ2UwLmVuZCA9PT0gbnVsbCA/IG51bGwgOiByYW5nZTAuZW5kLnZhbHVlT2YoKSkgPT09IChyYW5nZTEuZW5kID09PSBudWxsID8gbnVsbCA6IHJhbmdlMS5lbmQudmFsdWVPZigpKTtcbn1cbmZ1bmN0aW9uIHJhbmdlc0ludGVyc2VjdChyYW5nZTAsIHJhbmdlMSkge1xuICAgIHJldHVybiAocmFuZ2UwLmVuZCA9PT0gbnVsbCB8fCByYW5nZTEuc3RhcnQgPT09IG51bGwgfHwgcmFuZ2UwLmVuZCA+IHJhbmdlMS5zdGFydCkgJiZcbiAgICAgICAgKHJhbmdlMC5zdGFydCA9PT0gbnVsbCB8fCByYW5nZTEuZW5kID09PSBudWxsIHx8IHJhbmdlMC5zdGFydCA8IHJhbmdlMS5lbmQpO1xufVxuZnVuY3Rpb24gcmFuZ2VDb250YWluc1JhbmdlKG91dGVyUmFuZ2UsIGlubmVyUmFuZ2UpIHtcbiAgICByZXR1cm4gKG91dGVyUmFuZ2Uuc3RhcnQgPT09IG51bGwgfHwgKGlubmVyUmFuZ2Uuc3RhcnQgIT09IG51bGwgJiYgaW5uZXJSYW5nZS5zdGFydCA+PSBvdXRlclJhbmdlLnN0YXJ0KSkgJiZcbiAgICAgICAgKG91dGVyUmFuZ2UuZW5kID09PSBudWxsIHx8IChpbm5lclJhbmdlLmVuZCAhPT0gbnVsbCAmJiBpbm5lclJhbmdlLmVuZCA8PSBvdXRlclJhbmdlLmVuZCkpO1xufVxuZnVuY3Rpb24gcmFuZ2VDb250YWluc01hcmtlcihyYW5nZSwgZGF0ZSkge1xuICAgIHJldHVybiAocmFuZ2Uuc3RhcnQgPT09IG51bGwgfHwgZGF0ZSA+PSByYW5nZS5zdGFydCkgJiZcbiAgICAgICAgKHJhbmdlLmVuZCA9PT0gbnVsbCB8fCBkYXRlIDwgcmFuZ2UuZW5kKTtcbn1cbi8vIElmIHRoZSBnaXZlbiBkYXRlIGlzIG5vdCB3aXRoaW4gdGhlIGdpdmVuIHJhbmdlLCBtb3ZlIGl0IGluc2lkZS5cbi8vIChJZiBpdCdzIHBhc3QgdGhlIGVuZCwgbWFrZSBpdCBvbmUgbWlsbGlzZWNvbmQgYmVmb3JlIHRoZSBlbmQpLlxuZnVuY3Rpb24gY29uc3RyYWluTWFya2VyVG9SYW5nZShkYXRlLCByYW5nZSkge1xuICAgIGlmIChyYW5nZS5zdGFydCAhPSBudWxsICYmIGRhdGUgPCByYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7XG4gICAgfVxuICAgIGlmIChyYW5nZS5lbmQgIT0gbnVsbCAmJiBkYXRlID49IHJhbmdlLmVuZCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUocmFuZ2UuZW5kLnZhbHVlT2YoKSAtIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZU1ldGEoZGF0ZSwgdG9kYXlSYW5nZSwgbm93RGF0ZSwgZGF0ZVByb2ZpbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkb3c6IGRhdGUuZ2V0VVRDRGF5KCksXG4gICAgICAgIGlzRGlzYWJsZWQ6IEJvb2xlYW4oZGF0ZVByb2ZpbGUgJiYgIXJhbmdlQ29udGFpbnNNYXJrZXIoZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGRhdGUpKSxcbiAgICAgICAgaXNPdGhlcjogQm9vbGVhbihkYXRlUHJvZmlsZSAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIGRhdGUpKSxcbiAgICAgICAgaXNUb2RheTogQm9vbGVhbih0b2RheVJhbmdlICYmIHJhbmdlQ29udGFpbnNNYXJrZXIodG9kYXlSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc1Bhc3Q6IEJvb2xlYW4obm93RGF0ZSA/IChkYXRlIDwgbm93RGF0ZSkgOiB0b2RheVJhbmdlID8gKGRhdGUgPCB0b2RheVJhbmdlLnN0YXJ0KSA6IGZhbHNlKSxcbiAgICAgICAgaXNGdXR1cmU6IEJvb2xlYW4obm93RGF0ZSA/IChkYXRlID4gbm93RGF0ZSkgOiB0b2RheVJhbmdlID8gKGRhdGUgPj0gdG9kYXlSYW5nZS5lbmQpIDogZmFsc2UpLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXREYXlDbGFzc05hbWVzKG1ldGEsIHRoZW1lKSB7XG4gICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1kYXknLFxuICAgICAgICBgZmMtZGF5LSR7REFZX0lEU1ttZXRhLmRvd119YCxcbiAgICBdO1xuICAgIGlmIChtZXRhLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChtZXRhLmlzVG9kYXkpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LXRvZGF5Jyk7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ3RvZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzUGFzdCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktcGFzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzRnV0dXJlKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS1mdXR1cmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc090aGVyKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS1vdGhlcicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuZnVuY3Rpb24gZ2V0U2xvdENsYXNzTmFtZXMobWV0YSwgdGhlbWUpIHtcbiAgICBsZXQgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgJ2ZjLXNsb3QnLFxuICAgICAgICBgZmMtc2xvdC0ke0RBWV9JRFNbbWV0YS5kb3ddfWAsXG4gICAgXTtcbiAgICBpZiAobWV0YS5pc0Rpc2FibGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2xvdC1kaXNhYmxlZCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1ldGEuaXNUb2RheSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXRvZGF5Jyk7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ3RvZGF5JykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzUGFzdCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LXBhc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0YS5pc0Z1dHVyZSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LWZ1dHVyZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuXG5jb25zdCBEQVlfRk9STUFUID0gY3JlYXRlRm9ybWF0dGVyKHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnLCBkYXk6ICdudW1lcmljJyB9KTtcbmNvbnN0IFdFRUtfRk9STUFUID0gY3JlYXRlRm9ybWF0dGVyKHsgd2VlazogJ2xvbmcnIH0pO1xuZnVuY3Rpb24gYnVpbGROYXZMaW5rQXR0cnMoY29udGV4dCwgZGF0ZU1hcmtlciwgdmlld1R5cGUgPSAnZGF5JywgaXNUYWJiYWJsZSA9IHRydWUpIHtcbiAgICBjb25zdCB7IGRhdGVFbnYsIG9wdGlvbnMsIGNhbGVuZGFyQXBpIH0gPSBjb250ZXh0O1xuICAgIGxldCBkYXRlU3RyID0gZGF0ZUVudi5mb3JtYXQoZGF0ZU1hcmtlciwgdmlld1R5cGUgPT09ICd3ZWVrJyA/IFdFRUtfRk9STUFUIDogREFZX0ZPUk1BVCk7XG4gICAgaWYgKG9wdGlvbnMubmF2TGlua3MpIHtcbiAgICAgICAgbGV0IHpvbmVkRGF0ZSA9IGRhdGVFbnYudG9EYXRlKGRhdGVNYXJrZXIpO1xuICAgICAgICBjb25zdCBoYW5kbGVJbnRlcmFjdGlvbiA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IGN1c3RvbUFjdGlvbiA9IHZpZXdUeXBlID09PSAnZGF5JyA/IG9wdGlvbnMubmF2TGlua0RheUNsaWNrIDpcbiAgICAgICAgICAgICAgICB2aWV3VHlwZSA9PT0gJ3dlZWsnID8gb3B0aW9ucy5uYXZMaW5rV2Vla0NsaWNrIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY3VzdG9tQWN0aW9uLmNhbGwoY2FsZW5kYXJBcGksIGRhdGVFbnYudG9EYXRlKGRhdGVNYXJrZXIpLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1c3RvbUFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlld1R5cGUgPSBjdXN0b21BY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhbGVuZGFyQXBpLnpvb21UbyhkYXRlTWFya2VyLCB2aWV3VHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgdGl0bGU6IGZvcm1hdFdpdGhPcmRpbmFscyhvcHRpb25zLm5hdkxpbmtIaW50LCBbZGF0ZVN0ciwgem9uZWREYXRlXSwgZGF0ZVN0ciksICdkYXRhLW5hdmxpbmsnOiAnJyB9LCAoaXNUYWJiYWJsZVxuICAgICAgICAgICAgPyBjcmVhdGVBcmlhQ2xpY2tBdHRycyhoYW5kbGVJbnRlcmFjdGlvbilcbiAgICAgICAgICAgIDogeyBvbkNsaWNrOiBoYW5kbGVJbnRlcmFjdGlvbiB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7ICdhcmlhLWxhYmVsJzogZGF0ZVN0ciB9O1xufVxuXG5sZXQgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gbnVsbDtcbmZ1bmN0aW9uIGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0KCkge1xuICAgIGlmIChfaXNSdGxTY3JvbGxiYXJPbkxlZnQgPT09IG51bGwpIHtcbiAgICAgICAgX2lzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gY29tcHV0ZUlzUnRsU2Nyb2xsYmFyT25MZWZ0KCk7XG4gICAgfVxuICAgIHJldHVybiBfaXNSdGxTY3JvbGxiYXJPbkxlZnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQoKSB7XG4gICAgbGV0IG91dGVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBhcHBseVN0eWxlKG91dGVyRWwsIHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogLTEwMDAsXG4gICAgICAgIGxlZnQ6IDAsXG4gICAgICAgIGJvcmRlcjogMCxcbiAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnLFxuICAgICAgICBkaXJlY3Rpb246ICdydGwnLFxuICAgIH0pO1xuICAgIG91dGVyRWwuaW5uZXJIVE1MID0gJzxkaXY+PC9kaXY+JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG91dGVyRWwpO1xuICAgIGxldCBpbm5lckVsID0gb3V0ZXJFbC5maXJzdENoaWxkO1xuICAgIGxldCByZXMgPSBpbm5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgPiBvdXRlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgcmVtb3ZlRWxlbWVudChvdXRlckVsKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5sZXQgX3Njcm9sbGJhcldpZHRocztcbmZ1bmN0aW9uIGdldFNjcm9sbGJhcldpZHRocygpIHtcbiAgICBpZiAoIV9zY3JvbGxiYXJXaWR0aHMpIHtcbiAgICAgICAgX3Njcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHMoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9zY3JvbGxiYXJXaWR0aHM7XG59XG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzKCkge1xuICAgIGxldCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCc7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICBlbC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpO1xuICAgIGxldCByZXMgPSBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIHJldHVybiByZXM7XG59XG4vLyBXQVJOSU5HOiB3aWxsIGluY2x1ZGUgYm9yZGVyXG5mdW5jdGlvbiBjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwoZWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB4OiBlbC5vZmZzZXRIZWlnaHQgLSBlbC5jbGllbnRIZWlnaHQsXG4gICAgICAgIHk6IGVsLm9mZnNldFdpZHRoIC0gZWwuY2xpZW50V2lkdGgsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUVkZ2VzKGVsLCBnZXRQYWRkaW5nID0gZmFsc2UpIHtcbiAgICBsZXQgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICBsZXQgYm9yZGVyTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCkgfHwgMDtcbiAgICBsZXQgYm9yZGVyUmlnaHQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDEwKSB8fCAwO1xuICAgIGxldCBib3JkZXJUb3AgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoLCAxMCkgfHwgMDtcbiAgICBsZXQgYm9yZGVyQm90dG9tID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJCb3R0b21XaWR0aCwgMTApIHx8IDA7XG4gICAgbGV0IGJhZFNjcm9sbGJhcldpZHRocyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbChlbCk7IC8vIGluY2x1ZGVzIGJvcmRlciFcbiAgICBsZXQgc2Nyb2xsYmFyTGVmdFJpZ2h0ID0gYmFkU2Nyb2xsYmFyV2lkdGhzLnkgLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQ7XG4gICAgbGV0IHNjcm9sbGJhckJvdHRvbSA9IGJhZFNjcm9sbGJhcldpZHRocy54IC0gYm9yZGVyVG9wIC0gYm9yZGVyQm90dG9tO1xuICAgIGxldCByZXMgPSB7XG4gICAgICAgIGJvcmRlckxlZnQsXG4gICAgICAgIGJvcmRlclJpZ2h0LFxuICAgICAgICBib3JkZXJUb3AsXG4gICAgICAgIGJvcmRlckJvdHRvbSxcbiAgICAgICAgc2Nyb2xsYmFyQm90dG9tLFxuICAgICAgICBzY3JvbGxiYXJMZWZ0OiAwLFxuICAgICAgICBzY3JvbGxiYXJSaWdodDogMCxcbiAgICB9O1xuICAgIGlmIChnZXRJc1J0bFNjcm9sbGJhck9uTGVmdCgpICYmIGNvbXB1dGVkU3R5bGUuZGlyZWN0aW9uID09PSAncnRsJykgeyAvLyBpcyB0aGUgc2Nyb2xsYmFyIG9uIHRoZSBsZWZ0IHNpZGU/XG4gICAgICAgIHJlcy5zY3JvbGxiYXJMZWZ0ID0gc2Nyb2xsYmFyTGVmdFJpZ2h0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVzLnNjcm9sbGJhclJpZ2h0ID0gc2Nyb2xsYmFyTGVmdFJpZ2h0O1xuICAgIH1cbiAgICBpZiAoZ2V0UGFkZGluZykge1xuICAgICAgICByZXMucGFkZGluZ0xlZnQgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdMZWZ0LCAxMCkgfHwgMDtcbiAgICAgICAgcmVzLnBhZGRpbmdSaWdodCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1JpZ2h0LCAxMCkgfHwgMDtcbiAgICAgICAgcmVzLnBhZGRpbmdUb3AgPSBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKSB8fCAwO1xuICAgICAgICByZXMucGFkZGluZ0JvdHRvbSA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ0JvdHRvbSwgMTApIHx8IDA7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjb21wdXRlSW5uZXJSZWN0KGVsLCBnb1dpdGhpblBhZGRpbmcgPSBmYWxzZSwgZG9Gcm9tV2luZG93Vmlld3BvcnQpIHtcbiAgICBsZXQgb3V0ZXJSZWN0ID0gZG9Gcm9tV2luZG93Vmlld3BvcnQgPyBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IGNvbXB1dGVSZWN0KGVsKTtcbiAgICBsZXQgZWRnZXMgPSBjb21wdXRlRWRnZXMoZWwsIGdvV2l0aGluUGFkZGluZyk7XG4gICAgbGV0IHJlcyA9IHtcbiAgICAgICAgbGVmdDogb3V0ZXJSZWN0LmxlZnQgKyBlZGdlcy5ib3JkZXJMZWZ0ICsgZWRnZXMuc2Nyb2xsYmFyTGVmdCxcbiAgICAgICAgcmlnaHQ6IG91dGVyUmVjdC5yaWdodCAtIGVkZ2VzLmJvcmRlclJpZ2h0IC0gZWRnZXMuc2Nyb2xsYmFyUmlnaHQsXG4gICAgICAgIHRvcDogb3V0ZXJSZWN0LnRvcCArIGVkZ2VzLmJvcmRlclRvcCxcbiAgICAgICAgYm90dG9tOiBvdXRlclJlY3QuYm90dG9tIC0gZWRnZXMuYm9yZGVyQm90dG9tIC0gZWRnZXMuc2Nyb2xsYmFyQm90dG9tLFxuICAgIH07XG4gICAgaWYgKGdvV2l0aGluUGFkZGluZykge1xuICAgICAgICByZXMubGVmdCArPSBlZGdlcy5wYWRkaW5nTGVmdDtcbiAgICAgICAgcmVzLnJpZ2h0IC09IGVkZ2VzLnBhZGRpbmdSaWdodDtcbiAgICAgICAgcmVzLnRvcCArPSBlZGdlcy5wYWRkaW5nVG9wO1xuICAgICAgICByZXMuYm90dG9tIC09IGVkZ2VzLnBhZGRpbmdCb3R0b207XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiBjb21wdXRlUmVjdChlbCkge1xuICAgIGxldCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICB0b3A6IHJlY3QudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxuICAgICAgICByaWdodDogcmVjdC5yaWdodCArIHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICAgICAgYm90dG9tOiByZWN0LmJvdHRvbSArIHdpbmRvdy5wYWdlWU9mZnNldCxcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcHV0ZUNsaXBwZWRDbGllbnRSZWN0KGVsKSB7XG4gICAgbGV0IGNsaXBwaW5nUGFyZW50cyA9IGdldENsaXBwaW5nUGFyZW50cyhlbCk7XG4gICAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBmb3IgKGxldCBjbGlwcGluZ1BhcmVudCBvZiBjbGlwcGluZ1BhcmVudHMpIHtcbiAgICAgICAgbGV0IGludGVyc2VjdGlvbiA9IGludGVyc2VjdFJlY3RzKHJlY3QsIGNsaXBwaW5nUGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbikge1xuICAgICAgICAgICAgcmVjdCA9IGludGVyc2VjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWN0O1xufVxuLy8gZG9lcyBub3QgcmV0dXJuIHdpbmRvd1xuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsKSB7XG4gICAgbGV0IHBhcmVudHMgPSBbXTtcbiAgICB3aGlsZSAoZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgeyAvLyB3aWxsIHN0b3Agd2hlbiBnZXRzIHRvIGRvY3VtZW50IG9yIG51bGxcbiAgICAgICAgbGV0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gICAgICAgIGlmIChjb21wdXRlZFN0eWxlLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoKC8oYXV0b3xzY3JvbGwpLykudGVzdChjb21wdXRlZFN0eWxlLm92ZXJmbG93ICsgY29tcHV0ZWRTdHlsZS5vdmVyZmxvd1kgKyBjb21wdXRlZFN0eWxlLm92ZXJmbG93WCkpIHtcbiAgICAgICAgICAgIHBhcmVudHMucHVzaChlbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWwgPSBlbC5wYXJlbnROb2RlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn1cblxuLypcbmdpdmVuIGEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyBhIHJlc3VsdCBhc3luY2hyb25vdXNseS5cbnRoZSBmdW5jdGlvbiBjYW4gZWl0aGVyIGNhbGwgcGFzc2VkLWluIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgY2FsbGJhY2tzLFxub3IgaXQgY2FuIHJldHVybiBhIHByb21pc2UuXG5pZiB5b3UgbmVlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1zIHRvIGZ1bmMsIGJpbmQgdGhlbSBmaXJzdC5cbiovXG5mdW5jdGlvbiB1bnByb21pc2lmeShmdW5jLCBub3JtYWxpemVkU3VjY2Vzc0NhbGxiYWNrLCBub3JtYWxpemVkRmFpbHVyZUNhbGxiYWNrKSB7XG4gICAgLy8gZ3VhcmQgYWdhaW5zdCBzdWNjZXNzL2ZhaWx1cmUgY2FsbGJhY2tzIGJlaW5nIGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuICAgIC8vIGFuZCBndWFyZCBhZ2FpbnN0IGEgcHJvbWlzZSBBTkQgY2FsbGJhY2sgYmVpbmcgdXNlZCB0b2dldGhlci5cbiAgICBsZXQgaXNSZXNvbHZlZCA9IGZhbHNlO1xuICAgIGxldCB3cmFwcGVkU3VjY2VzcyA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgaWYgKCFpc1Jlc29sdmVkKSB7XG4gICAgICAgICAgICBpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRTdWNjZXNzQ2FsbGJhY2socmVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHdyYXBwZWRGYWlsdXJlID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNSZXNvbHZlZCkge1xuICAgICAgICAgICAgaXNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgICAgICBub3JtYWxpemVkRmFpbHVyZUNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHJlcyA9IGZ1bmMod3JhcHBlZFN1Y2Nlc3MsIHdyYXBwZWRGYWlsdXJlKTtcbiAgICBpZiAocmVzICYmIHR5cGVvZiByZXMudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXMudGhlbih3cmFwcGVkU3VjY2Vzcywgd3JhcHBlZEZhaWx1cmUpO1xuICAgIH1cbn1cblxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICAgICAgdGhpcy50aGlzQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICAgIHNldFRoaXNDb250ZXh0KHRoaXNDb250ZXh0KSB7XG4gICAgICAgIHRoaXMudGhpc0NvbnRleHQgPSB0aGlzQ29udGV4dDtcbiAgICB9XG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgfVxuICAgIG9uKHR5cGUsIGhhbmRsZXIpIHtcbiAgICAgICAgYWRkVG9IYXNoKHRoaXMuaGFuZGxlcnMsIHR5cGUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICBvZmYodHlwZSwgaGFuZGxlcikge1xuICAgICAgICByZW1vdmVGcm9tSGFzaCh0aGlzLmhhbmRsZXJzLCB0eXBlLCBoYW5kbGVyKTtcbiAgICB9XG4gICAgdHJpZ2dlcih0eXBlLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCBhdHRhY2hlZEhhbmRsZXJzID0gdGhpcy5oYW5kbGVyc1t0eXBlXSB8fCBbXTtcbiAgICAgICAgbGV0IG9wdGlvbkhhbmRsZXIgPSB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdO1xuICAgICAgICBsZXQgaGFuZGxlcnMgPSBbXS5jb25jYXQob3B0aW9uSGFuZGxlciB8fCBbXSwgYXR0YWNoZWRIYW5kbGVycyk7XG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcy50aGlzQ29udGV4dCwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzSGFuZGxlcnModHlwZSkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbigodGhpcy5oYW5kbGVyc1t0eXBlXSAmJiB0aGlzLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zW3R5cGVdKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkVG9IYXNoKGhhc2gsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICAoaGFzaFt0eXBlXSB8fCAoaGFzaFt0eXBlXSA9IFtdKSlcbiAgICAgICAgLnB1c2goaGFuZGxlcik7XG59XG5mdW5jdGlvbiByZW1vdmVGcm9tSGFzaChoYXNoLCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGhhc2hbdHlwZV0pIHtcbiAgICAgICAgICAgIGhhc2hbdHlwZV0gPSBoYXNoW3R5cGVdLmZpbHRlcigoZnVuYykgPT4gZnVuYyAhPT0gaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW3R5cGVdOyAvLyByZW1vdmUgYWxsIGhhbmRsZXIgZnVuY3MgZm9yIHRoaXMgdHlwZVxuICAgIH1cbn1cblxuLypcblJlY29yZHMgb2Zmc2V0IGluZm9ybWF0aW9uIGZvciBhIHNldCBvZiBlbGVtZW50cywgcmVsYXRpdmUgdG8gYW4gb3JpZ2luIGVsZW1lbnQuXG5DYW4gcmVjb3JkIHRoZSBsZWZ0L3JpZ2h0IE9SIHRoZSB0b3AvYm90dG9tIE9SIGJvdGguXG5Qcm92aWRlcyBtZXRob2RzIGZvciBxdWVyeWluZyB0aGUgY2FjaGUgYnkgcG9zaXRpb24uXG4qL1xuY2xhc3MgUG9zaXRpb25DYWNoZSB7XG4gICAgY29uc3RydWN0b3Iob3JpZ2luRWwsIGVscywgaXNIb3Jpem9udGFsLCBpc1ZlcnRpY2FsKSB7XG4gICAgICAgIHRoaXMuZWxzID0gZWxzO1xuICAgICAgICBsZXQgb3JpZ2luQ2xpZW50UmVjdCA9IHRoaXMub3JpZ2luQ2xpZW50UmVjdCA9IG9yaWdpbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyAvLyByZWxhdGl2ZSB0byB2aWV3cG9ydCB0b3AtbGVmdFxuICAgICAgICBpZiAoaXNIb3Jpem9udGFsKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRWxIb3Jpem9udGFscyhvcmlnaW5DbGllbnRSZWN0LmxlZnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkRWxWZXJ0aWNhbHMob3JpZ2luQ2xpZW50UmVjdC50b3ApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFBvcHVsYXRlcyB0aGUgbGVmdC9yaWdodCBpbnRlcm5hbCBjb29yZGluYXRlIGFycmF5c1xuICAgIGJ1aWxkRWxIb3Jpem9udGFscyhvcmlnaW5DbGllbnRMZWZ0KSB7XG4gICAgICAgIGxldCBsZWZ0cyA9IFtdO1xuICAgICAgICBsZXQgcmlnaHRzID0gW107XG4gICAgICAgIGZvciAobGV0IGVsIG9mIHRoaXMuZWxzKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgbGVmdHMucHVzaChyZWN0LmxlZnQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgICAgIHJpZ2h0cy5wdXNoKHJlY3QucmlnaHQgLSBvcmlnaW5DbGllbnRMZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlZnRzID0gbGVmdHM7XG4gICAgICAgIHRoaXMucmlnaHRzID0gcmlnaHRzO1xuICAgIH1cbiAgICAvLyBQb3B1bGF0ZXMgdGhlIHRvcC9ib3R0b20gaW50ZXJuYWwgY29vcmRpbmF0ZSBhcnJheXNcbiAgICBidWlsZEVsVmVydGljYWxzKG9yaWdpbkNsaWVudFRvcCkge1xuICAgICAgICBsZXQgdG9wcyA9IFtdO1xuICAgICAgICBsZXQgYm90dG9tcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBlbCBvZiB0aGlzLmVscykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRvcHMucHVzaChyZWN0LnRvcCAtIG9yaWdpbkNsaWVudFRvcCk7XG4gICAgICAgICAgICBib3R0b21zLnB1c2gocmVjdC5ib3R0b20gLSBvcmlnaW5DbGllbnRUb3ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9wcyA9IHRvcHM7XG4gICAgICAgIHRoaXMuYm90dG9tcyA9IGJvdHRvbXM7XG4gICAgfVxuICAgIC8vIEdpdmVuIGEgbGVmdCBvZmZzZXQgKGZyb20gZG9jdW1lbnQgbGVmdCksIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbCB0aGF0IGl0IGhvcml6b250YWxseSBpbnRlcnNlY3RzLlxuICAgIC8vIElmIG5vIGludGVyc2VjdGlvbiBpcyBtYWRlLCByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICBsZWZ0VG9JbmRleChsZWZ0UG9zaXRpb24pIHtcbiAgICAgICAgbGV0IHsgbGVmdHMsIHJpZ2h0cyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGxlbiA9IGxlZnRzLmxlbmd0aDtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKGxlZnRQb3NpdGlvbiA+PSBsZWZ0c1tpXSAmJiBsZWZ0UG9zaXRpb24gPCByaWdodHNbaV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBUT0RPOiBiZXR0ZXJcbiAgICB9XG4gICAgLy8gR2l2ZW4gYSB0b3Agb2Zmc2V0IChmcm9tIGRvY3VtZW50IHRvcCksIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBlbCB0aGF0IGl0IHZlcnRpY2FsbHkgaW50ZXJzZWN0cy5cbiAgICAvLyBJZiBubyBpbnRlcnNlY3Rpb24gaXMgbWFkZSwgcmV0dXJucyB1bmRlZmluZWQuXG4gICAgdG9wVG9JbmRleCh0b3BQb3NpdGlvbikge1xuICAgICAgICBsZXQgeyB0b3BzLCBib3R0b21zIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbGVuID0gdG9wcy5sZW5ndGg7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGlmICh0b3BQb3NpdGlvbiA+PSB0b3BzW2ldICYmIHRvcFBvc2l0aW9uIDwgYm90dG9tc1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFRPRE86IGJldHRlclxuICAgIH1cbiAgICAvLyBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICBnZXRXaWR0aChsZWZ0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmlnaHRzW2xlZnRJbmRleF0gLSB0aGlzLmxlZnRzW2xlZnRJbmRleF07XG4gICAgfVxuICAgIC8vIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXhcbiAgICBnZXRIZWlnaHQodG9wSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm90dG9tc1t0b3BJbmRleF0gLSB0aGlzLnRvcHNbdG9wSW5kZXhdO1xuICAgIH1cbiAgICBzaW1pbGFyVG8ob3RoZXJDYWNoZSkge1xuICAgICAgICByZXR1cm4gc2ltaWxhck51bUFycmF5cyh0aGlzLnRvcHMgfHwgW10sIG90aGVyQ2FjaGUudG9wcyB8fCBbXSkgJiZcbiAgICAgICAgICAgIHNpbWlsYXJOdW1BcnJheXModGhpcy5ib3R0b21zIHx8IFtdLCBvdGhlckNhY2hlLmJvdHRvbXMgfHwgW10pICYmXG4gICAgICAgICAgICBzaW1pbGFyTnVtQXJyYXlzKHRoaXMubGVmdHMgfHwgW10sIG90aGVyQ2FjaGUubGVmdHMgfHwgW10pICYmXG4gICAgICAgICAgICBzaW1pbGFyTnVtQXJyYXlzKHRoaXMucmlnaHRzIHx8IFtdLCBvdGhlckNhY2hlLnJpZ2h0cyB8fCBbXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2ltaWxhck51bUFycmF5cyhhLCBiKSB7XG4gICAgY29uc3QgbGVuID0gYS5sZW5ndGg7XG4gICAgaWYgKGxlbiAhPT0gYi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChNYXRoLnJvdW5kKGFbaV0pICE9PSBNYXRoLnJvdW5kKGJbaV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qIGVzbGludCBtYXgtY2xhc3Nlcy1wZXItZmlsZTogXCJvZmZcIiAqL1xuLypcbkFuIG9iamVjdCBmb3IgZ2V0dGluZy9zZXR0aW5nIHNjcm9sbC1yZWxhdGVkIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LlxuSW50ZXJuYWxseSwgdGhpcyBpcyBkb25lIHZlcnkgZGlmZmVyZW50bHkgZm9yIHdpbmRvdyB2ZXJzdXMgRE9NIGVsZW1lbnQsXG5zbyB0aGlzIG9iamVjdCBzZXJ2ZXMgYXMgYSBjb21tb24gaW50ZXJmYWNlLlxuKi9cbmNsYXNzIFNjcm9sbENvbnRyb2xsZXIge1xuICAgIGdldE1heFNjcm9sbFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KCkgLSB0aGlzLmdldENsaWVudEhlaWdodCgpO1xuICAgIH1cbiAgICBnZXRNYXhTY3JvbGxMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxXaWR0aCgpIC0gdGhpcy5nZXRDbGllbnRXaWR0aCgpO1xuICAgIH1cbiAgICBjYW5TY3JvbGxWZXJ0aWNhbGx5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXhTY3JvbGxUb3AoKSA+IDA7XG4gICAgfVxuICAgIGNhblNjcm9sbEhvcml6b250YWxseSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpID4gMDtcbiAgICB9XG4gICAgY2FuU2Nyb2xsVXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbFRvcCgpID4gMDtcbiAgICB9XG4gICAgY2FuU2Nyb2xsRG93bigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsVG9wKCkgPCB0aGlzLmdldE1heFNjcm9sbFRvcCgpO1xuICAgIH1cbiAgICBjYW5TY3JvbGxMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxMZWZ0KCkgPiAwO1xuICAgIH1cbiAgICBjYW5TY3JvbGxSaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsTGVmdCgpIDwgdGhpcy5nZXRNYXhTY3JvbGxMZWZ0KCk7XG4gICAgfVxufVxuY2xhc3MgRWxlbWVudFNjcm9sbENvbnRyb2xsZXIgZXh0ZW5kcyBTY3JvbGxDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgfVxuICAgIGdldFNjcm9sbFRvcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc2Nyb2xsVG9wO1xuICAgIH1cbiAgICBnZXRTY3JvbGxMZWZ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5zY3JvbGxMZWZ0O1xuICAgIH1cbiAgICBzZXRTY3JvbGxUb3AodG9wKSB7XG4gICAgICAgIHRoaXMuZWwuc2Nyb2xsVG9wID0gdG9wO1xuICAgIH1cbiAgICBzZXRTY3JvbGxMZWZ0KGxlZnQpIHtcbiAgICAgICAgdGhpcy5lbC5zY3JvbGxMZWZ0ID0gbGVmdDtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbFdpZHRoO1xuICAgIH1cbiAgICBnZXRTY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbEhlaWdodDtcbiAgICB9XG4gICAgZ2V0Q2xpZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGdldENsaWVudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5jbGllbnRXaWR0aDtcbiAgICB9XG59XG5jbGFzcyBXaW5kb3dTY3JvbGxDb250cm9sbGVyIGV4dGVuZHMgU2Nyb2xsQ29udHJvbGxlciB7XG4gICAgZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIH1cbiAgICBnZXRTY3JvbGxMZWZ0KCkge1xuICAgICAgICByZXR1cm4gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgIH1cbiAgICBzZXRTY3JvbGxUb3Aobikge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsKHdpbmRvdy5wYWdlWE9mZnNldCwgbik7XG4gICAgfVxuICAgIHNldFNjcm9sbExlZnQobikge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsKG4sIHdpbmRvdy5wYWdlWU9mZnNldCk7XG4gICAgfVxuICAgIGdldFNjcm9sbFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH1cbiAgICBnZXRTY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgIH1cbiAgICBnZXRDbGllbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIH1cbiAgICBnZXRDbGllbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB9XG59XG5cbmNsYXNzIFRoZW1lIHtcbiAgICBjb25zdHJ1Y3RvcihjYWxlbmRhck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRoaXMuaWNvbk92ZXJyaWRlT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldEljb25PdmVycmlkZShjYWxlbmRhck9wdGlvbnNbdGhpcy5pY29uT3ZlcnJpZGVPcHRpb25dKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRJY29uT3ZlcnJpZGUoaWNvbk92ZXJyaWRlSGFzaCkge1xuICAgICAgICBsZXQgaWNvbkNsYXNzZXNDb3B5O1xuICAgICAgICBsZXQgYnV0dG9uTmFtZTtcbiAgICAgICAgaWYgKHR5cGVvZiBpY29uT3ZlcnJpZGVIYXNoID09PSAnb2JqZWN0JyAmJiBpY29uT3ZlcnJpZGVIYXNoKSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICAgICAgaWNvbkNsYXNzZXNDb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5pY29uQ2xhc3Nlcyk7XG4gICAgICAgICAgICBmb3IgKGJ1dHRvbk5hbWUgaW4gaWNvbk92ZXJyaWRlSGFzaCkge1xuICAgICAgICAgICAgICAgIGljb25DbGFzc2VzQ29weVtidXR0b25OYW1lXSA9IHRoaXMuYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgoaWNvbk92ZXJyaWRlSGFzaFtidXR0b25OYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmljb25DbGFzc2VzID0gaWNvbkNsYXNzZXNDb3B5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGljb25PdmVycmlkZUhhc2ggPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmljb25DbGFzc2VzID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgoY2xhc3NOYW1lKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSB0aGlzLmljb25PdmVycmlkZVByZWZpeDtcbiAgICAgICAgaWYgKHByZWZpeCAmJiBjbGFzc05hbWUuaW5kZXhPZihwcmVmaXgpICE9PSAwKSB7IC8vIGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHByZWZpeCArIGNsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lO1xuICAgIH1cbiAgICBnZXRDbGFzcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3Nlc1trZXldIHx8ICcnO1xuICAgIH1cbiAgICBnZXRJY29uQ2xhc3MoYnV0dG9uTmFtZSwgaXNSdGwpIHtcbiAgICAgICAgbGV0IGNsYXNzTmFtZTtcbiAgICAgICAgaWYgKGlzUnRsICYmIHRoaXMucnRsSWNvbkNsYXNzZXMpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoaXMucnRsSWNvbkNsYXNzZXNbYnV0dG9uTmFtZV0gfHwgdGhpcy5pY29uQ2xhc3Nlc1tidXR0b25OYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRoaXMuaWNvbkNsYXNzZXNbYnV0dG9uTmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuYmFzZUljb25DbGFzc30gJHtjbGFzc05hbWV9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldEN1c3RvbUJ1dHRvbkljb25DbGFzcyhjdXN0b21CdXR0b25Qcm9wcykge1xuICAgICAgICBsZXQgY2xhc3NOYW1lO1xuICAgICAgICBpZiAodGhpcy5pY29uT3ZlcnJpZGVDdXN0b21CdXR0b25PcHRpb24pIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZSA9IGN1c3RvbUJ1dHRvblByb3BzW3RoaXMuaWNvbk92ZXJyaWRlQ3VzdG9tQnV0dG9uT3B0aW9uXTtcbiAgICAgICAgICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5iYXNlSWNvbkNsYXNzfSAke3RoaXMuYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgoY2xhc3NOYW1lKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59XG5UaGVtZS5wcm90b3R5cGUuY2xhc3NlcyA9IHt9O1xuVGhlbWUucHJvdG90eXBlLmljb25DbGFzc2VzID0ge307XG5UaGVtZS5wcm90b3R5cGUuYmFzZUljb25DbGFzcyA9ICcnO1xuVGhlbWUucHJvdG90eXBlLmljb25PdmVycmlkZVByZWZpeCA9ICcnO1xuXG4vKlxuTk9URTogdGhpcyBjYW4gYmUgYSBwdWJsaWMgQVBJLCBlc3BlY2lhbGx5IGNyZWF0ZUVsZW1lbnQgZm9yIGhvb2tzLlxuU2VlIGV4YW1wbGVzL3R5cGVzY3JpcHQtc2NoZWR1bGVyL3NyYy9pbmRleC50c1xuKi9cbmZ1bmN0aW9uIGZsdXNoU3luYyhydW5CZWZvcmVGbHVzaCkge1xuICAgIHJ1bkJlZm9yZUZsdXNoKCk7XG4gICAgbGV0IG9sZERlYm91bmNlUmVuZGVyaW5nID0gcHJlYWN0X19uYW1lc3BhY2Uub3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZzsgLy8gb3JpZ1xuICAgIGxldCBjYWxsYmFja1EgPSBbXTtcbiAgICBmdW5jdGlvbiBleGVjQ2FsbGJhY2tTeW5jKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrUS5wdXNoKGNhbGxiYWNrKTtcbiAgICB9XG4gICAgcHJlYWN0X19uYW1lc3BhY2Uub3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZyA9IGV4ZWNDYWxsYmFja1N5bmM7XG4gICAgcHJlYWN0X19uYW1lc3BhY2UucmVuZGVyKHByZWFjdF9fbmFtZXNwYWNlLmNyZWF0ZUVsZW1lbnQoRmFrZUNvbXBvbmVudCwge30pLCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG4gICAgd2hpbGUgKGNhbGxiYWNrUS5sZW5ndGgpIHtcbiAgICAgICAgY2FsbGJhY2tRLnNoaWZ0KCkoKTtcbiAgICB9XG4gICAgcHJlYWN0X19uYW1lc3BhY2Uub3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZyA9IG9sZERlYm91bmNlUmVuZGVyaW5nO1xufVxuY2xhc3MgRmFrZUNvbXBvbmVudCBleHRlbmRzIHByZWFjdF9fbmFtZXNwYWNlLkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkgeyByZXR1cm4gcHJlYWN0X19uYW1lc3BhY2UuY3JlYXRlRWxlbWVudCgnZGl2Jywge30pOyB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7IHRoaXMuc2V0U3RhdGUoe30pOyB9XG59XG4vLyBUT0RPOiB1c2UgcHJlYWN0L2NvbXBhdCBpbnN0ZWFkP1xuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUpIHtcbiAgICBsZXQgQ29udGV4dFR5cGUgPSBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSk7XG4gICAgbGV0IG9yaWdQcm92aWRlciA9IENvbnRleHRUeXBlLlByb3ZpZGVyO1xuICAgIENvbnRleHRUeXBlLlByb3ZpZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgaXNOZXcgPSAhdGhpcy5nZXRDaGlsZENvbnRleHQ7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IG9yaWdQcm92aWRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgICBpZiAoaXNOZXcpIHtcbiAgICAgICAgICAgIGxldCBzdWJzID0gW107XG4gICAgICAgICAgICB0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IChfcHJvcHMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy52YWx1ZSAhPT0gX3Byb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5jb250ZXh0ID0gX3Byb3BzLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zdWIgPSAoYykgPT4ge1xuICAgICAgICAgICAgICAgIHN1YnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICBsZXQgb2xkID0gYy5jb21wb25lbnRXaWxsVW5tb3VudDtcbiAgICAgICAgICAgICAgICBjLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWJzLnNwbGljZShzdWJzLmluZGV4T2YoYyksIDEpO1xuICAgICAgICAgICAgICAgICAgICBvbGQgJiYgb2xkLmNhbGwoYyk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH07XG4gICAgcmV0dXJuIENvbnRleHRUeXBlO1xufVxuXG5jbGFzcyBTY3JvbGxSZXNwb25kZXIge1xuICAgIGNvbnN0cnVjdG9yKGV4ZWNGdW5jLCBlbWl0dGVyLCBzY3JvbGxUaW1lLCBzY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgdGhpcy5leGVjRnVuYyA9IGV4ZWNGdW5jO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBlbWl0dGVyO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWUgPSBzY3JvbGxUaW1lO1xuICAgICAgICB0aGlzLnNjcm9sbFRpbWVSZXNldCA9IHNjcm9sbFRpbWVSZXNldDtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0ID0gKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMucXVldWVkUmVxdWVzdCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucXVldWVkUmVxdWVzdCB8fCB7fSwgcmVxdWVzdCk7XG4gICAgICAgICAgICB0aGlzLmRyYWluKCk7XG4gICAgICAgIH07XG4gICAgICAgIGVtaXR0ZXIub24oJ19zY3JvbGxSZXF1ZXN0JywgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0KTtcbiAgICAgICAgdGhpcy5maXJlSW5pdGlhbFNjcm9sbCgpO1xuICAgIH1cbiAgICBkZXRhY2goKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlci5vZmYoJ19zY3JvbGxSZXF1ZXN0JywgdGhpcy5oYW5kbGVTY3JvbGxSZXF1ZXN0KTtcbiAgICB9XG4gICAgdXBkYXRlKGlzRGF0ZXNOZXcpIHtcbiAgICAgICAgaWYgKGlzRGF0ZXNOZXcgJiYgdGhpcy5zY3JvbGxUaW1lUmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZUluaXRpYWxTY3JvbGwoKTsgLy8gd2lsbCBkcmFpblxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kcmFpbigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZpcmVJbml0aWFsU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3Qoe1xuICAgICAgICAgICAgdGltZTogdGhpcy5zY3JvbGxUaW1lLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJhaW4oKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlZFJlcXVlc3QgJiYgdGhpcy5leGVjRnVuYyh0aGlzLnF1ZXVlZFJlcXVlc3QpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlZFJlcXVlc3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBWaWV3Q29udGV4dFR5cGUgPSBjcmVhdGVDb250ZXh0KHt9KTsgLy8gZm9yIENvbXBvbmVudHNcbmZ1bmN0aW9uIGJ1aWxkVmlld0NvbnRleHQodmlld1NwZWMsIHZpZXdBcGksIHZpZXdPcHRpb25zLCBkYXRlUHJvZmlsZUdlbmVyYXRvciwgZGF0ZUVudiwgdGhlbWUsIHBsdWdpbkhvb2tzLCBkaXNwYXRjaCwgZ2V0Q3VycmVudERhdGEsIGVtaXR0ZXIsIGNhbGVuZGFyQXBpLCByZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50LCB1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlRW52LFxuICAgICAgICBvcHRpb25zOiB2aWV3T3B0aW9ucyxcbiAgICAgICAgcGx1Z2luSG9va3MsXG4gICAgICAgIGVtaXR0ZXIsXG4gICAgICAgIGRpc3BhdGNoLFxuICAgICAgICBnZXRDdXJyZW50RGF0YSxcbiAgICAgICAgY2FsZW5kYXJBcGksXG4gICAgICAgIHZpZXdTcGVjLFxuICAgICAgICB2aWV3QXBpLFxuICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvcixcbiAgICAgICAgdGhlbWUsXG4gICAgICAgIGlzUnRsOiB2aWV3T3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnLFxuICAgICAgICBhZGRSZXNpemVIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIub24oJ19yZXNpemUnLCBoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlUmVzaXplSGFuZGxlcihoYW5kbGVyKSB7XG4gICAgICAgICAgICBlbWl0dGVyLm9mZignX3Jlc2l6ZScsIGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVTY3JvbGxSZXNwb25kZXIoZXhlY0Z1bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2Nyb2xsUmVzcG9uZGVyKGV4ZWNGdW5jLCBlbWl0dGVyLCBjcmVhdGVEdXJhdGlvbih2aWV3T3B0aW9ucy5zY3JvbGxUaW1lKSwgdmlld09wdGlvbnMuc2Nyb2xsVGltZVJlc2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCxcbiAgICAgICAgdW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50LFxuICAgIH07XG59XG5cbi8qIGVzbGludCBtYXgtY2xhc3Nlcy1wZXItZmlsZTogb2ZmICovXG5jbGFzcyBQdXJlQ29tcG9uZW50IGV4dGVuZHMgcHJlYWN0LkNvbXBvbmVudCB7XG4gICAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5sb2coZ2V0VW5lcXVhbFByb3BzKG5leHRQcm9wcywgdGhpcy5wcm9wcyksIGdldFVuZXF1YWxQcm9wcyhuZXh0U3RhdGUsIHRoaXMuc3RhdGUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWNvbXBhcmVPYmpzKHRoaXMucHJvcHMsIG5leHRQcm9wcywgdGhpcy5wcm9wRXF1YWxpdHkpIHx8XG4gICAgICAgICAgICAhY29tcGFyZU9ianModGhpcy5zdGF0ZSwgbmV4dFN0YXRlLCB0aGlzLnN0YXRlRXF1YWxpdHkpO1xuICAgIH1cbiAgICAvLyBIQUNLIGZvciBmcmVha2luJyBSZWFjdCBTdHJpY3RNb2RlXG4gICAgc2FmZVNldFN0YXRlKG5ld1N0YXRlKSB7XG4gICAgICAgIGlmICghY29tcGFyZU9ianModGhpcy5zdGF0ZSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlKSwgbmV3U3RhdGUpLCB0aGlzLnN0YXRlRXF1YWxpdHkpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblB1cmVDb21wb25lbnQuYWRkUHJvcHNFcXVhbGl0eSA9IGFkZFByb3BzRXF1YWxpdHk7XG5QdXJlQ29tcG9uZW50LmFkZFN0YXRlRXF1YWxpdHkgPSBhZGRTdGF0ZUVxdWFsaXR5O1xuUHVyZUNvbXBvbmVudC5jb250ZXh0VHlwZSA9IFZpZXdDb250ZXh0VHlwZTtcblB1cmVDb21wb25lbnQucHJvdG90eXBlLnByb3BFcXVhbGl0eSA9IHt9O1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUuc3RhdGVFcXVhbGl0eSA9IHt9O1xuY2xhc3MgQmFzZUNvbXBvbmVudCBleHRlbmRzIFB1cmVDb21wb25lbnQge1xufVxuQmFzZUNvbXBvbmVudC5jb250ZXh0VHlwZSA9IFZpZXdDb250ZXh0VHlwZTtcbmZ1bmN0aW9uIGFkZFByb3BzRXF1YWxpdHkocHJvcEVxdWFsaXR5KSB7XG4gICAgbGV0IGhhc2ggPSBPYmplY3QuY3JlYXRlKHRoaXMucHJvdG90eXBlLnByb3BFcXVhbGl0eSk7XG4gICAgT2JqZWN0LmFzc2lnbihoYXNoLCBwcm9wRXF1YWxpdHkpO1xuICAgIHRoaXMucHJvdG90eXBlLnByb3BFcXVhbGl0eSA9IGhhc2g7XG59XG5mdW5jdGlvbiBhZGRTdGF0ZUVxdWFsaXR5KHN0YXRlRXF1YWxpdHkpIHtcbiAgICBsZXQgaGFzaCA9IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUuc3RhdGVFcXVhbGl0eSk7XG4gICAgT2JqZWN0LmFzc2lnbihoYXNoLCBzdGF0ZUVxdWFsaXR5KTtcbiAgICB0aGlzLnByb3RvdHlwZS5zdGF0ZUVxdWFsaXR5ID0gaGFzaDtcbn1cbi8vIHVzZSBvdGhlciBvbmVcbmZ1bmN0aW9uIHNldFJlZihyZWYsIGN1cnJlbnQpIHtcbiAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZWYoY3VycmVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlZikge1xuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzAyOVxuICAgICAgICByZWYuY3VycmVudCA9IGN1cnJlbnQ7XG4gICAgfVxufVxuXG4vKlxuYW4gSU5URVJBQ1RBQkxFIGRhdGUgY29tcG9uZW50XG5cblBVUlBPU0VTOlxuLSBob29rIHVwIHRvIGZnLCBmaWxsLCBhbmQgbWlycm9yIHJlbmRlcmVyc1xuLSBpbnRlcmZhY2UgZm9yIGRyYWdnaW5nIGFuZCBoaXRzXG4qL1xuY2xhc3MgRGF0ZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnVpZCA9IGd1aWQoKTtcbiAgICB9XG4gICAgLy8gSGl0IFN5c3RlbVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJlcGFyZUhpdHMoKSB7XG4gICAgfVxuICAgIHF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3AsIGVsV2lkdGgsIGVsSGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiBudWxsOyAvLyB0aGlzIHNob3VsZCBiZSBhYnN0cmFjdFxuICAgIH1cbiAgICAvLyBQb2ludGVyIEludGVyYWN0aW9uIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBpc1ZhbGlkU2VnRG93bkVsKGVsKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5wcm9wcy5ldmVudERyYWcgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIXRoaXMucHJvcHMuZXZlbnRSZXNpemUgJiYgLy8gSEFDS1xuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLWV2ZW50LW1pcnJvcicpO1xuICAgIH1cbiAgICBpc1ZhbGlkRGF0ZURvd25FbChlbCkge1xuICAgICAgICByZXR1cm4gIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLWV2ZW50Om5vdCguZmMtYmctZXZlbnQpJykgJiZcbiAgICAgICAgICAgICFlbGVtZW50Q2xvc2VzdChlbCwgJy5mYy1tb3JlLWxpbmsnKSAmJiAvLyBhIFwibW9yZS4uXCIgbGlua1xuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnYVtkYXRhLW5hdmxpbmtdJykgJiYgLy8gYSBjbGlja2FibGUgbmF2IGxpbmtcbiAgICAgICAgICAgICFlbGVtZW50Q2xvc2VzdChlbCwgJy5mYy1wb3BvdmVyJyk7IC8vIGhhY2tcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUN1cnJlbnREYXRlKGN1cnJlbnREYXRlLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9EQVRFJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZGF0ZU1hcmtlcjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGF0ZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRJbml0aWFsRGF0ZShvcHRpb25zLCBkYXRlRW52KSB7XG4gICAgbGV0IGluaXRpYWxEYXRlSW5wdXQgPSBvcHRpb25zLmluaXRpYWxEYXRlO1xuICAgIC8vIGNvbXB1dGUgdGhlIGluaXRpYWwgYW1iaWctdGltZXpvbmUgZGF0ZVxuICAgIGlmIChpbml0aWFsRGF0ZUlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuY3JlYXRlTWFya2VyKGluaXRpYWxEYXRlSW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0Tm93KG9wdGlvbnMubm93LCBkYXRlRW52KTsgLy8gZ2V0Tm93IGFscmVhZHkgcmV0dXJucyB1bnpvbmVkXG59XG5mdW5jdGlvbiBnZXROb3cobm93SW5wdXQsIGRhdGVFbnYpIHtcbiAgICBpZiAodHlwZW9mIG5vd0lucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5vd0lucHV0ID0gbm93SW5wdXQoKTtcbiAgICB9XG4gICAgaWYgKG5vd0lucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuY3JlYXRlTm93TWFya2VyKCk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmNyZWF0ZU1hcmtlcihub3dJbnB1dCk7XG59XG5cbmNsYXNzIERhdGVQcm9maWxlR2VuZXJhdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICAgIHRoaXMubm93RGF0ZSA9IGdldE5vdyhwcm9wcy5ub3dJbnB1dCwgcHJvcHMuZGF0ZUVudik7XG4gICAgICAgIHRoaXMuaW5pdEhpZGRlbkRheXMoKTtcbiAgICB9XG4gICAgLyogRGF0ZSBSYW5nZSBDb21wdXRhdGlvblxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgLy8gQnVpbGRzIGEgc3RydWN0dXJlIHdpdGggaW5mbyBhYm91dCB3aGF0IHRoZSBkYXRlcy9yYW5nZXMgd2lsbCBiZSBmb3IgdGhlIFwicHJldlwiIHZpZXcuXG4gICAgYnVpbGRQcmV2KGN1cnJlbnREYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZvcmNlVG9WYWxpZCkge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgcHJldkRhdGUgPSBkYXRlRW52LnN1YnRyYWN0KGRhdGVFbnYuc3RhcnRPZihjdXJyZW50RGF0ZSwgY3VycmVudERhdGVQcm9maWxlLmN1cnJlbnRSYW5nZVVuaXQpLCAvLyBpbXBvcnRhbnQgZm9yIHN0YXJ0LW9mLW1vbnRoXG4gICAgICAgIGN1cnJlbnREYXRlUHJvZmlsZS5kYXRlSW5jcmVtZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGQocHJldkRhdGUsIC0xLCBmb3JjZVRvVmFsaWQpO1xuICAgIH1cbiAgICAvLyBCdWlsZHMgYSBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGFib3V0IHdoYXQgdGhlIGRhdGVzL3JhbmdlcyB3aWxsIGJlIGZvciB0aGUgXCJuZXh0XCIgdmlldy5cbiAgICBidWlsZE5leHQoY3VycmVudERhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSwgZm9yY2VUb1ZhbGlkKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBuZXh0RGF0ZSA9IGRhdGVFbnYuYWRkKGRhdGVFbnYuc3RhcnRPZihjdXJyZW50RGF0ZSwgY3VycmVudERhdGVQcm9maWxlLmN1cnJlbnRSYW5nZVVuaXQpLCAvLyBpbXBvcnRhbnQgZm9yIHN0YXJ0LW9mLW1vbnRoXG4gICAgICAgIGN1cnJlbnREYXRlUHJvZmlsZS5kYXRlSW5jcmVtZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGQobmV4dERhdGUsIDEsIGZvcmNlVG9WYWxpZCk7XG4gICAgfVxuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSBob2xkaW5nIGRhdGVzL3JhbmdlcyBmb3IgcmVuZGVyaW5nIGFyb3VuZCB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAvLyBPcHRpb25hbCBkaXJlY3Rpb24gcGFyYW0gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGUgaXMgYmVpbmcgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWRcbiAgICAvLyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gZGVjcmVtZW50ZWQgPSAtMSwgaW5jcmVtZW50ZWQgPSAxIChkZWZhdWx0KS5cbiAgICBidWlsZChjdXJyZW50RGF0ZSwgZGlyZWN0aW9uLCBmb3JjZVRvVmFsaWQgPSB0cnVlKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdmFsaWRSYW5nZTtcbiAgICAgICAgbGV0IGN1cnJlbnRJbmZvO1xuICAgICAgICBsZXQgaXNSYW5nZUFsbERheTtcbiAgICAgICAgbGV0IHJlbmRlclJhbmdlO1xuICAgICAgICBsZXQgYWN0aXZlUmFuZ2U7XG4gICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICB2YWxpZFJhbmdlID0gdGhpcy5idWlsZFZhbGlkUmFuZ2UoKTtcbiAgICAgICAgdmFsaWRSYW5nZSA9IHRoaXMudHJpbUhpZGRlbkRheXModmFsaWRSYW5nZSk7XG4gICAgICAgIGlmIChmb3JjZVRvVmFsaWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gY29uc3RyYWluTWFya2VyVG9SYW5nZShjdXJyZW50RGF0ZSwgdmFsaWRSYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEluZm8gPSB0aGlzLmJ1aWxkQ3VycmVudFJhbmdlSW5mbyhjdXJyZW50RGF0ZSwgZGlyZWN0aW9uKTtcbiAgICAgICAgaXNSYW5nZUFsbERheSA9IC9eKHllYXJ8bW9udGh8d2Vla3xkYXkpJC8udGVzdChjdXJyZW50SW5mby51bml0KTtcbiAgICAgICAgcmVuZGVyUmFuZ2UgPSB0aGlzLmJ1aWxkUmVuZGVyUmFuZ2UodGhpcy50cmltSGlkZGVuRGF5cyhjdXJyZW50SW5mby5yYW5nZSksIGN1cnJlbnRJbmZvLnVuaXQsIGlzUmFuZ2VBbGxEYXkpO1xuICAgICAgICByZW5kZXJSYW5nZSA9IHRoaXMudHJpbUhpZGRlbkRheXMocmVuZGVyUmFuZ2UpO1xuICAgICAgICBhY3RpdmVSYW5nZSA9IHJlbmRlclJhbmdlO1xuICAgICAgICBpZiAoIXByb3BzLnNob3dOb25DdXJyZW50RGF0ZXMpIHtcbiAgICAgICAgICAgIGFjdGl2ZVJhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKGFjdGl2ZVJhbmdlLCBjdXJyZW50SW5mby5yYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWN0aXZlUmFuZ2UgPSB0aGlzLmFkanVzdEFjdGl2ZVJhbmdlKGFjdGl2ZVJhbmdlKTtcbiAgICAgICAgYWN0aXZlUmFuZ2UgPSBpbnRlcnNlY3RSYW5nZXMoYWN0aXZlUmFuZ2UsIHZhbGlkUmFuZ2UpOyAvLyBtaWdodCByZXR1cm4gbnVsbFxuICAgICAgICAvLyBpdCdzIGludmFsaWQgaWYgdGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGRhdGUgaXMgbm90IGNvbnRhaW5lZCxcbiAgICAgICAgLy8gb3IgaWYgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgb3V0c2lkZSBvZiB0aGUgdmFsaWQgcmFuZ2UuXG4gICAgICAgIGlzVmFsaWQgPSByYW5nZXNJbnRlcnNlY3QoY3VycmVudEluZm8ucmFuZ2UsIHZhbGlkUmFuZ2UpO1xuICAgICAgICAvLyBIQUNLOiBjb25zdHJhaW4gdG8gcmVuZGVyLXJhbmdlIHNvIGBjdXJyZW50RGF0ZWAgaXMgbW9yZSB1c2VmdWwgdG8gdmlldyByZW5kZXJpbmdcbiAgICAgICAgaWYgKCFyYW5nZUNvbnRhaW5zTWFya2VyKHJlbmRlclJhbmdlLCBjdXJyZW50RGF0ZSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlID0gcmVuZGVyUmFuZ2Uuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgLy8gY29uc3RyYWludCBmb3Igd2hlcmUgcHJldi9uZXh0IG9wZXJhdGlvbnMgY2FuIGdvIGFuZCB3aGVyZSBldmVudHMgY2FuIGJlIGRyYWdnZWQvcmVzaXplZCB0by5cbiAgICAgICAgICAgIC8vIGFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHN0YXJ0IGFuZCBlbmQgcHJvcGVydGllcy5cbiAgICAgICAgICAgIHZhbGlkUmFuZ2UsXG4gICAgICAgICAgICAvLyByYW5nZSB0aGUgdmlldyBpcyBmb3JtYWxseSByZXNwb25zaWJsZSBmb3IuXG4gICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSwgYSBtb250aCB2aWV3IG1pZ2h0IGhhdmUgMXN0LTMxc3QsIGV4Y2x1ZGluZyBwYWRkZWQgZGF0ZXNcbiAgICAgICAgICAgIGN1cnJlbnRSYW5nZTogY3VycmVudEluZm8ucmFuZ2UsXG4gICAgICAgICAgICAvLyBuYW1lIG9mIGxhcmdlc3QgdW5pdCBiZWluZyBkaXNwbGF5ZWQsIGxpa2UgXCJtb250aFwiIG9yIFwid2Vla1wiXG4gICAgICAgICAgICBjdXJyZW50UmFuZ2VVbml0OiBjdXJyZW50SW5mby51bml0LFxuICAgICAgICAgICAgaXNSYW5nZUFsbERheSxcbiAgICAgICAgICAgIC8vIGRhdGVzIHRoYXQgZGlzcGxheSBldmVudHMgYW5kIGFjY2VwdCBkcmFnLW4tZHJvcFxuICAgICAgICAgICAgLy8gd2lsbCBiZSBgbnVsbGAgaWYgbm8gZGF0ZXMgYWNjZXB0IGV2ZW50c1xuICAgICAgICAgICAgYWN0aXZlUmFuZ2UsXG4gICAgICAgICAgICAvLyBkYXRlIHJhbmdlIHdpdGggYSByZW5kZXJlZCBza2VsZXRvblxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgbm90LWFjdGl2ZSBkYXlzIHRoYXQgbmVlZCBzb21lIHNvcnQgb2YgRE9NXG4gICAgICAgICAgICByZW5kZXJSYW5nZSxcbiAgICAgICAgICAgIC8vIER1cmF0aW9uIG9iamVjdCB0aGF0IGRlbm90ZXMgdGhlIGZpcnN0IHZpc2libGUgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5XG4gICAgICAgICAgICBzbG90TWluVGltZTogcHJvcHMuc2xvdE1pblRpbWUsXG4gICAgICAgICAgICAvLyBEdXJhdGlvbiBvYmplY3QgdGhhdCBkZW5vdGVzIHRoZSBleGNsdXNpdmUgdmlzaWJsZSBlbmQgdGltZSBvZiBhbnkgZ2l2ZW4gZGF5XG4gICAgICAgICAgICBzbG90TWF4VGltZTogcHJvcHMuc2xvdE1heFRpbWUsXG4gICAgICAgICAgICBpc1ZhbGlkLFxuICAgICAgICAgICAgLy8gaG93IGZhciB0aGUgY3VycmVudCBkYXRlIHdpbGwgbW92ZSBmb3IgYSBwcmV2L25leHQgb3BlcmF0aW9uXG4gICAgICAgICAgICBkYXRlSW5jcmVtZW50OiB0aGlzLmJ1aWxkRGF0ZUluY3JlbWVudChjdXJyZW50SW5mby5kdXJhdGlvbiksXG4gICAgICAgICAgICAvLyBwYXNzIGEgZmFsbGJhY2sgKG1pZ2h0IGJlIG51bGwpIF5cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gQnVpbGRzIGFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIHN0YXJ0L2VuZCBwcm9wZXJ0aWVzLlxuICAgIC8vIEluZGljYXRlcyB0aGUgbWluaW11bS9tYXhpbXVtIGRhdGVzIHRvIGRpc3BsYXkuXG4gICAgLy8gbm90IHJlc3BvbnNpYmxlIGZvciB0cmltbWluZyBoaWRkZW4gZGF5cy5cbiAgICBidWlsZFZhbGlkUmFuZ2UoKSB7XG4gICAgICAgIGxldCBpbnB1dCA9IHRoaXMucHJvcHMudmFsaWRSYW5nZUlucHV0O1xuICAgICAgICBsZXQgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbCh0aGlzLnByb3BzLmNhbGVuZGFyQXBpLCB0aGlzLm5vd0RhdGUpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZpbmVSYW5nZShzaW1wbGVJbnB1dCkgfHxcbiAgICAgICAgICAgIHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9OyAvLyBjb21wbGV0ZWx5IG9wZW4tZW5kZWRcbiAgICB9XG4gICAgLy8gQnVpbGRzIGEgc3RydWN0dXJlIHdpdGggaW5mbyBhYm91dCB0aGUgXCJjdXJyZW50XCIgcmFuZ2UsIHRoZSByYW5nZSB0aGF0IGlzXG4gICAgLy8gaGlnaGxpZ2h0ZWQgYXMgYmVpbmcgdGhlIGN1cnJlbnQgbW9udGggZm9yIGV4YW1wbGUuXG4gICAgLy8gU2VlIGJ1aWxkKCkgZm9yIGEgZGVzY3JpcHRpb24gb2YgYGRpcmVjdGlvbmAuXG4gICAgLy8gR3VhcmFudGVlZCB0byBoYXZlIGByYW5nZWAgYW5kIGB1bml0YCBwcm9wZXJ0aWVzLiBgZHVyYXRpb25gIGlzIG9wdGlvbmFsLlxuICAgIGJ1aWxkQ3VycmVudFJhbmdlSW5mbyhkYXRlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkdXJhdGlvbiA9IG51bGw7XG4gICAgICAgIGxldCB1bml0ID0gbnVsbDtcbiAgICAgICAgbGV0IHJhbmdlID0gbnVsbDtcbiAgICAgICAgbGV0IGRheUNvdW50O1xuICAgICAgICBpZiAocHJvcHMuZHVyYXRpb24pIHtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gcHJvcHMuZHVyYXRpb247XG4gICAgICAgICAgICB1bml0ID0gcHJvcHMuZHVyYXRpb25Vbml0O1xuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24oZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKGRheUNvdW50ID0gdGhpcy5wcm9wcy5kYXlDb3VudCkpIHtcbiAgICAgICAgICAgIHVuaXQgPSAnZGF5JztcbiAgICAgICAgICAgIHJhbmdlID0gdGhpcy5idWlsZFJhbmdlRnJvbURheUNvdW50KGRhdGUsIGRpcmVjdGlvbiwgZGF5Q291bnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChyYW5nZSA9IHRoaXMuYnVpbGRDdXN0b21WaXNpYmxlUmFuZ2UoZGF0ZSkpKSB7XG4gICAgICAgICAgICB1bml0ID0gcHJvcHMuZGF0ZUVudi5ncmVhdGVzdFdob2xlVW5pdChyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKS51bml0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB0aGlzLmdldEZhbGxiYWNrRHVyYXRpb24oKTtcbiAgICAgICAgICAgIHVuaXQgPSBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IoZHVyYXRpb24pLnVuaXQ7XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuYnVpbGRSYW5nZUZyb21EdXJhdGlvbihkYXRlLCBkaXJlY3Rpb24sIGR1cmF0aW9uLCB1bml0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkdXJhdGlvbiwgdW5pdCwgcmFuZ2UgfTtcbiAgICB9XG4gICAgZ2V0RmFsbGJhY2tEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgZGF5OiAxIH0pO1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIGEgbmV3IGFjdGl2ZVJhbmdlIHRvIGhhdmUgdGltZSB2YWx1ZXMgKHVuLWFtYmlndWF0ZSlcbiAgICAvLyBzbG90TWluVGltZSBvciBzbG90TWF4VGltZSBjYXVzZXMgdGhlIHJhbmdlIHRvIGV4cGFuZC5cbiAgICBhZGp1c3RBY3RpdmVSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBkYXRlRW52LCB1c2VzTWluTWF4VGltZSwgc2xvdE1pblRpbWUsIHNsb3RNYXhUaW1lIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSByYW5nZTtcbiAgICAgICAgaWYgKHVzZXNNaW5NYXhUaW1lKSB7XG4gICAgICAgICAgICAvLyBleHBhbmQgYWN0aXZlIHJhbmdlIGlmIHNsb3RNaW5UaW1lIGlzIG5lZ2F0aXZlICh3aHkgbm90IHdoZW4gcG9zaXRpdmU/KVxuICAgICAgICAgICAgaWYgKGFzUm91Z2hEYXlzKHNsb3RNaW5UaW1lKSA8IDApIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0T2ZEYXkoc3RhcnQpOyAvLyBuZWNlc3Nhcnk/XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBkYXRlRW52LmFkZChzdGFydCwgc2xvdE1pblRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXhwYW5kIGFjdGl2ZSByYW5nZSBpZiBzbG90TWF4VGltZSBpcyBiZXlvbmQgb25lIGRheSAod2h5IG5vdCB3aGVuIG5lZ2F0aXZlPylcbiAgICAgICAgICAgIGlmIChhc1JvdWdoRGF5cyhzbG90TWF4VGltZSkgPiAxKSB7XG4gICAgICAgICAgICAgICAgZW5kID0gc3RhcnRPZkRheShlbmQpOyAvLyBuZWNlc3Nhcnk/XG4gICAgICAgICAgICAgICAgZW5kID0gYWRkRGF5cyhlbmQsIC0xKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChlbmQsIHNsb3RNYXhUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgfVxuICAgIC8vIEJ1aWxkcyB0aGUgXCJjdXJyZW50XCIgcmFuZ2Ugd2hlbiBpdCBpcyBzcGVjaWZpZWQgYXMgYW4gZXhwbGljaXQgZHVyYXRpb24uXG4gICAgLy8gYHVuaXRgIGlzIHRoZSBhbHJlYWR5LWNvbXB1dGVkIGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvciB1bml0IG9mIGR1cmF0aW9uLlxuICAgIGJ1aWxkUmFuZ2VGcm9tRHVyYXRpb24oZGF0ZSwgZGlyZWN0aW9uLCBkdXJhdGlvbiwgdW5pdCkge1xuICAgICAgICBsZXQgeyBkYXRlRW52LCBkYXRlQWxpZ25tZW50IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgc3RhcnQ7XG4gICAgICAgIGxldCBlbmQ7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIC8vIGNvbXB1dGUgd2hhdCB0aGUgYWxpZ25tZW50IHNob3VsZCBiZVxuICAgICAgICBpZiAoIWRhdGVBbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIGxldCB7IGRhdGVJbmNyZW1lbnQgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgICBpZiAoZGF0ZUluY3JlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgc21hbGxlciBvZiB0aGUgdHdvIHVuaXRzXG4gICAgICAgICAgICAgICAgaWYgKGFzUm91Z2hNcyhkYXRlSW5jcmVtZW50KSA8IGFzUm91Z2hNcyhkdXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkYXRlSW5jcmVtZW50KS51bml0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0ZUFsaWdubWVudCA9IHVuaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIHZpZXcgZGlzcGxheXMgYSBzaW5nbGUgZGF5IG9yIHNtYWxsZXJcbiAgICAgICAgaWYgKGFzUm91Z2hEYXlzKGR1cmF0aW9uKSA8PSAxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0hpZGRlbkRheShzdGFydCkpIHtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuc2tpcEhpZGRlbkRheXMoc3RhcnQsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydE9mRGF5KHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjb21wdXRlUmVzKCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlRW52LnN0YXJ0T2YoZGF0ZSwgZGF0ZUFsaWdubWVudCk7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChzdGFydCwgZHVyYXRpb24pO1xuICAgICAgICAgICAgcmVzID0geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgY29tcHV0ZVJlcygpO1xuICAgICAgICAvLyBpZiByYW5nZSBpcyBjb21wbGV0ZWx5IGVudmVsb3BlZCBieSBoaWRkZW4gZGF5cywgZ28gcGFzdCB0aGUgaGlkZGVuIGRheXNcbiAgICAgICAgaWYgKCF0aGlzLnRyaW1IaWRkZW5EYXlzKHJlcykpIHtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGRhdGUsIGRpcmVjdGlvbik7XG4gICAgICAgICAgICBjb21wdXRlUmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgLy8gQnVpbGRzIHRoZSBcImN1cnJlbnRcIiByYW5nZSB3aGVuIGEgZGF5Q291bnQgaXMgc3BlY2lmaWVkLlxuICAgIGJ1aWxkUmFuZ2VGcm9tRGF5Q291bnQoZGF0ZSwgZGlyZWN0aW9uLCBkYXlDb3VudCkge1xuICAgICAgICBsZXQgeyBkYXRlRW52LCBkYXRlQWxpZ25tZW50IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgcnVubmluZ0NvdW50ID0gMDtcbiAgICAgICAgbGV0IHN0YXJ0ID0gZGF0ZTtcbiAgICAgICAgbGV0IGVuZDtcbiAgICAgICAgaWYgKGRhdGVBbGlnbm1lbnQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5zdGFydE9mKHN0YXJ0LCBkYXRlQWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IHN0YXJ0T2ZEYXkoc3RhcnQpO1xuICAgICAgICBzdGFydCA9IHRoaXMuc2tpcEhpZGRlbkRheXMoc3RhcnQsIGRpcmVjdGlvbik7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBlbmQgPSBhZGREYXlzKGVuZCwgMSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNIaWRkZW5EYXkoZW5kKSkge1xuICAgICAgICAgICAgICAgIHJ1bm5pbmdDb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChydW5uaW5nQ291bnQgPCBkYXlDb3VudCk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG4gICAgLy8gQnVpbGRzIGEgbm9ybWFsaXplZCByYW5nZSBvYmplY3QgZm9yIHRoZSBcInZpc2libGVcIiByYW5nZSxcbiAgICAvLyB3aGljaCBpcyBhIHdheSB0byBkZWZpbmUgdGhlIGN1cnJlbnRSYW5nZSBhbmQgYWN0aXZlUmFuZ2UgYXQgdGhlIHNhbWUgdGltZS5cbiAgICBidWlsZEN1c3RvbVZpc2libGVSYW5nZShkYXRlKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgaW5wdXQgPSBwcm9wcy52aXNpYmxlUmFuZ2VJbnB1dDtcbiAgICAgICAgbGV0IHNpbXBsZUlucHV0ID0gdHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGlucHV0LmNhbGwocHJvcHMuY2FsZW5kYXJBcGksIHByb3BzLmRhdGVFbnYudG9EYXRlKGRhdGUpKVxuICAgICAgICAgICAgOiBpbnB1dDtcbiAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5yZWZpbmVSYW5nZShzaW1wbGVJbnB1dCk7XG4gICAgICAgIGlmIChyYW5nZSAmJiAocmFuZ2Uuc3RhcnQgPT0gbnVsbCB8fCByYW5nZS5lbmQgPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByYW5nZTtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZXMgdGhlIHJhbmdlIHRoYXQgd2lsbCByZXByZXNlbnQgdGhlIGVsZW1lbnQvY2VsbHMgZm9yICpyZW5kZXJpbmcqLFxuICAgIC8vIGJ1dCB3aGljaCBtYXkgaGF2ZSB2b2lkZWQgZGF5cy90aW1lcy5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIGJ1aWxkUmVuZGVyUmFuZ2UoY3VycmVudFJhbmdlLCBjdXJyZW50UmFuZ2VVbml0LCBpc1JhbmdlQWxsRGF5KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UmFuZ2U7XG4gICAgfVxuICAgIC8vIENvbXB1dGUgdGhlIGR1cmF0aW9uIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGFkZGVkL3N1YnN0cmFjdGVkIHRvIHRoZSBjdXJyZW50IGRhdGVcbiAgICAvLyB3aGVuIGEgcHJldi9uZXh0IG9wZXJhdGlvbiBoYXBwZW5zLlxuICAgIGJ1aWxkRGF0ZUluY3JlbWVudChmYWxsYmFjaykge1xuICAgICAgICBsZXQgeyBkYXRlSW5jcmVtZW50IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgY3VzdG9tQWxpZ25tZW50O1xuICAgICAgICBpZiAoZGF0ZUluY3JlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVJbmNyZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjdXN0b21BbGlnbm1lbnQgPSB0aGlzLnByb3BzLmRhdGVBbGlnbm1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oMSwgY3VzdG9tQWxpZ25tZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBkYXlzOiAxIH0pO1xuICAgIH1cbiAgICByZWZpbmVSYW5nZShyYW5nZUlucHV0KSB7XG4gICAgICAgIGlmIChyYW5nZUlucHV0KSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2UgPSBwYXJzZVJhbmdlKHJhbmdlSW5wdXQsIHRoaXMucHJvcHMuZGF0ZUVudik7XG4gICAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IGNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvKiBIaWRkZW4gRGF5c1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gICAgLy8gSW5pdGlhbGl6ZXMgaW50ZXJuYWwgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2FsY3VsYXRpbmcgaGlkZGVuIGRheXMtb2Ytd2Vla1xuICAgIGluaXRIaWRkZW5EYXlzKCkge1xuICAgICAgICBsZXQgaGlkZGVuRGF5cyA9IHRoaXMucHJvcHMuaGlkZGVuRGF5cyB8fCBbXTsgLy8gYXJyYXkgb2YgZGF5LW9mLXdlZWsgaW5kaWNlcyB0aGF0IGFyZSBoaWRkZW5cbiAgICAgICAgbGV0IGlzSGlkZGVuRGF5SGFzaCA9IFtdOyAvLyBpcyB0aGUgZGF5LW9mLXdlZWsgaGlkZGVuPyAoaGFzaCB3aXRoIGRheS1vZi13ZWVrLWluZGV4IC0+IGJvb2wpXG4gICAgICAgIGxldCBkYXlDbnQgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMud2Vla2VuZHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBoaWRkZW5EYXlzLnB1c2goMCwgNik7IC8vIDA9c3VuZGF5LCA2PXNhdHVyZGF5XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCEoaXNIaWRkZW5EYXlIYXNoW2ldID0gaGlkZGVuRGF5cy5pbmRleE9mKGkpICE9PSAtMSkpIHtcbiAgICAgICAgICAgICAgICBkYXlDbnQgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRheUNudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGhpZGRlbkRheXMnKTsgLy8gYWxsIGRheXMgd2VyZSBoaWRkZW4/IGJhZC5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzSGlkZGVuRGF5SGFzaCA9IGlzSGlkZGVuRGF5SGFzaDtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGRheXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHJhbmdlIHRoYXQgYXJlIGNvbXB1dGVkIGFzIGhpZGRlbi5cbiAgICAvLyBJZiB0aGUgd2hvbGUgcmFuZ2UgaXMgdHJpbW1lZCBvZmYsIHJldHVybnMgbnVsbFxuICAgIHRyaW1IaWRkZW5EYXlzKHJhbmdlKSB7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuICAgICAgICBpZiAoc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgZW5kID0gdGhpcy5za2lwSGlkZGVuRGF5cyhlbmQsIC0xLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBlbmQgPT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBJcyB0aGUgY3VycmVudCBkYXkgaGlkZGVuP1xuICAgIC8vIGBkYXlgIGlzIGEgZGF5LW9mLXdlZWsgaW5kZXggKDAtNiksIG9yIGEgRGF0ZSAodXNlZCBmb3IgVVRDKVxuICAgIGlzSGlkZGVuRGF5KGRheSkge1xuICAgICAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgZGF5ID0gZGF5LmdldFVUQ0RheSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGlkZGVuRGF5SGFzaFtkYXldO1xuICAgIH1cbiAgICAvLyBJbmNyZW1lbnRpbmcgdGhlIGN1cnJlbnQgZGF5IHVudGlsIGl0IGlzIG5vIGxvbmdlciBhIGhpZGRlbiBkYXksIHJldHVybmluZyBhIGNvcHkuXG4gICAgLy8gRE9FUyBOT1QgQ09OU0lERVIgdmFsaWRSYW5nZSFcbiAgICAvLyBJZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBgZGF0ZWAgaXMgbm90IGEgaGlkZGVuIGRheSwgZG9uJ3QgZG8gYW55dGhpbmcuXG4gICAgLy8gUGFzcyBgaXNFeGNsdXNpdmVgIGFzIGB0cnVlYCBpZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbmQgZGF0ZS5cbiAgICAvLyBgaW5jYCBkZWZhdWx0cyB0byBgMWAgKGluY3JlbWVudCBvbmUgZGF5IGZvcndhcmQgZWFjaCB0aW1lKVxuICAgIHNraXBIaWRkZW5EYXlzKGRhdGUsIGluYyA9IDEsIGlzRXhjbHVzaXZlID0gZmFsc2UpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuaXNIaWRkZW5EYXlIYXNoWyhkYXRlLmdldFVUQ0RheSgpICsgKGlzRXhjbHVzaXZlID8gaW5jIDogMCkgKyA3KSAlIDddKSB7XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCBpbmMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJpZ2dlckRhdGVTZWxlY3Qoc2VsZWN0aW9uLCBwZXYsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignc2VsZWN0JywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQoc2VsZWN0aW9uLCBjb250ZXh0KSksIHsganNFdmVudDogcGV2ID8gcGV2Lm9yaWdFdmVudCA6IG51bGwsIHZpZXc6IGNvbnRleHQudmlld0FwaSB8fCBjb250ZXh0LmNhbGVuZGFyQXBpLnZpZXcgfSkpO1xufVxuZnVuY3Rpb24gdHJpZ2dlckRhdGVVbnNlbGVjdChwZXYsIGNvbnRleHQpIHtcbiAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcigndW5zZWxlY3QnLCB7XG4gICAgICAgIGpzRXZlbnQ6IHBldiA/IHBldi5vcmlnRXZlbnQgOiBudWxsLFxuICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfHwgY29udGV4dC5jYWxlbmRhckFwaS52aWV3LFxuICAgIH0pO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KGRhdGVTcGFuLCBjb250ZXh0KSB7XG4gICAgbGV0IHByb3BzID0ge307XG4gICAgZm9yIChsZXQgdHJhbnNmb3JtIG9mIGNvbnRleHQucGx1Z2luSG9va3MuZGF0ZVNwYW5UcmFuc2Zvcm1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgY29udGV4dCkpO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHByb3BzLCBidWlsZERhdGVTcGFuQXBpKGRhdGVTcGFuLCBjb250ZXh0LmRhdGVFbnYpKTtcbiAgICByZXR1cm4gcHJvcHM7XG59XG4vLyBHaXZlbiBhbiBldmVudCdzIGFsbERheSBzdGF0dXMgYW5kIHN0YXJ0IGRhdGUsIHJldHVybiB3aGF0IGl0cyBmYWxsYmFjayBlbmQgZGF0ZSBzaG91bGQgYmUuXG4vLyBUT0RPOiByZW5hbWUgdG8gY29tcHV0ZURlZmF1bHRFdmVudEVuZFxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV2ZW50RW5kKGFsbERheSwgbWFya2VyLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZGF0ZUVudiwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICBsZXQgZW5kID0gbWFya2VyO1xuICAgIGlmIChhbGxEYXkpIHtcbiAgICAgICAgZW5kID0gc3RhcnRPZkRheShlbmQpO1xuICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChlbmQsIG9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZW5kID0gZGF0ZUVudi5hZGQoZW5kLCBvcHRpb25zLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZW5kO1xufVxuXG4vLyBhcHBsaWVzIHRoZSBtdXRhdGlvbiB0byBBTEwgZGVmcy9pbnN0YW5jZXMgd2l0aGluIHRoZSBldmVudCBzdG9yZVxuZnVuY3Rpb24gYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudENvbmZpZ0Jhc2UsIG11dGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGV2ZW50Q29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhldmVudFN0b3JlLmRlZnMsIGV2ZW50Q29uZmlnQmFzZSk7XG4gICAgbGV0IGRlc3QgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICBmb3IgKGxldCBkZWZJZCBpbiBldmVudFN0b3JlLmRlZnMpIHtcbiAgICAgICAgbGV0IGRlZiA9IGV2ZW50U3RvcmUuZGVmc1tkZWZJZF07XG4gICAgICAgIGRlc3QuZGVmc1tkZWZJZF0gPSBhcHBseU11dGF0aW9uVG9FdmVudERlZihkZWYsIGV2ZW50Q29uZmlnc1tkZWZJZF0sIG11dGF0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBldmVudFN0b3JlLmluc3RhbmNlcykge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBldmVudFN0b3JlLmluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICAgICAgbGV0IGRlZiA9IGRlc3QuZGVmc1tpbnN0YW5jZS5kZWZJZF07IC8vIGltcG9ydGFudCB0byBncmFiIHRoZSBuZXdseSBtb2RpZmllZCBkZWZcbiAgICAgICAgZGVzdC5pbnN0YW5jZXNbaW5zdGFuY2VJZF0gPSBhcHBseU11dGF0aW9uVG9FdmVudEluc3RhbmNlKGluc3RhbmNlLCBkZWYsIGV2ZW50Q29uZmlnc1tpbnN0YW5jZS5kZWZJZF0sIG11dGF0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9FdmVudERlZihldmVudERlZiwgZXZlbnRDb25maWcsIG11dGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IHN0YW5kYXJkUHJvcHMgPSBtdXRhdGlvbi5zdGFuZGFyZFByb3BzIHx8IHt9O1xuICAgIC8vIGlmIGhhc0VuZCBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLCBndWVzcyBhIGdvb2QgdmFsdWUgYmFzZWQgb24gZGVsdGFzLlxuICAgIC8vIGlmIGR1cmF0aW9uIHdpbGwgY2hhbmdlLCB0aGVyZSdzIG5vIHdheSB0aGUgZGVmYXVsdCBkdXJhdGlvbiB3aWxsIHBlcnNpc3QsXG4gICAgLy8gYW5kIHRodXMsIHdlIG5lZWQgdG8gbWFyayB0aGUgZXZlbnQgYXMgaGF2aW5nIGEgcmVhbCBlbmRcbiAgICBpZiAoc3RhbmRhcmRQcm9wcy5oYXNFbmQgPT0gbnVsbCAmJlxuICAgICAgICBldmVudENvbmZpZy5kdXJhdGlvbkVkaXRhYmxlICYmXG4gICAgICAgIChtdXRhdGlvbi5zdGFydERlbHRhIHx8IG11dGF0aW9uLmVuZERlbHRhKSkge1xuICAgICAgICBzdGFuZGFyZFByb3BzLmhhc0VuZCA9IHRydWU7IC8vIFRPRE86IGlzIHRoaXMgbXV0YXRpb24gb2theT9cbiAgICB9XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnREZWYpLCBzdGFuZGFyZFByb3BzKSwgeyB1aTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudERlZi51aSksIHN0YW5kYXJkUHJvcHMudWkpIH0pO1xuICAgIGlmIChtdXRhdGlvbi5leHRlbmRlZFByb3BzKSB7XG4gICAgICAgIGNvcHkuZXh0ZW5kZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29weS5leHRlbmRlZFByb3BzKSwgbXV0YXRpb24uZXh0ZW5kZWRQcm9wcyk7XG4gICAgfVxuICAgIGZvciAobGV0IGFwcGxpZXIgb2YgY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudERlZk11dGF0aW9uQXBwbGllcnMpIHtcbiAgICAgICAgYXBwbGllcihjb3B5LCBtdXRhdGlvbiwgY29udGV4dCk7XG4gICAgfVxuICAgIGlmICghY29weS5oYXNFbmQgJiYgY29udGV4dC5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbikge1xuICAgICAgICBjb3B5Lmhhc0VuZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuZnVuY3Rpb24gYXBwbHlNdXRhdGlvblRvRXZlbnRJbnN0YW5jZShldmVudEluc3RhbmNlLCBldmVudERlZiwgLy8gbXVzdCBmaXJzdCBiZSBtb2RpZmllZCBieSBhcHBseU11dGF0aW9uVG9FdmVudERlZlxuZXZlbnRDb25maWcsIG11dGF0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZGF0ZUVudiB9ID0gY29udGV4dDtcbiAgICBsZXQgZm9yY2VBbGxEYXkgPSBtdXRhdGlvbi5zdGFuZGFyZFByb3BzICYmIG11dGF0aW9uLnN0YW5kYXJkUHJvcHMuYWxsRGF5ID09PSB0cnVlO1xuICAgIGxldCBjbGVhckVuZCA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgJiYgbXV0YXRpb24uc3RhbmRhcmRQcm9wcy5oYXNFbmQgPT09IGZhbHNlO1xuICAgIGxldCBjb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRJbnN0YW5jZSk7XG4gICAgaWYgKGZvcmNlQWxsRGF5KSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSBjb21wdXRlQWxpZ25lZERheVJhbmdlKGNvcHkucmFuZ2UpO1xuICAgIH1cbiAgICBpZiAobXV0YXRpb24uZGF0ZXNEZWx0YSAmJiBldmVudENvbmZpZy5zdGFydEVkaXRhYmxlKSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoY29weS5yYW5nZS5zdGFydCwgbXV0YXRpb24uZGF0ZXNEZWx0YSksXG4gICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2UuZW5kLCBtdXRhdGlvbi5kYXRlc0RlbHRhKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnN0YXJ0RGVsdGEgJiYgZXZlbnRDb25maWcuZHVyYXRpb25FZGl0YWJsZSkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2Uuc3RhcnQsIG11dGF0aW9uLnN0YXJ0RGVsdGEpLFxuICAgICAgICAgICAgZW5kOiBjb3B5LnJhbmdlLmVuZCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLmVuZERlbHRhICYmIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChjb3B5LnJhbmdlLmVuZCwgbXV0YXRpb24uZW5kRGVsdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAoY2xlYXJFbmQpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBjb3B5LnJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgZW5kOiBnZXREZWZhdWx0RXZlbnRFbmQoZXZlbnREZWYuYWxsRGF5LCBjb3B5LnJhbmdlLnN0YXJ0LCBjb250ZXh0KSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaW4gY2FzZSBldmVudCB3YXMgYWxsLWRheSBidXQgdGhlIHN1cHBsaWVkIGRlbHRhcyB3ZXJlIG5vdFxuICAgIC8vIGJldHRlciB1dGlsIGZvciB0aGlzP1xuICAgIGlmIChldmVudERlZi5hbGxEYXkpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE9mRGF5KGNvcHkucmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgZW5kOiBzdGFydE9mRGF5KGNvcHkucmFuZ2UuZW5kKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gaGFuZGxlIGludmFsaWQgZHVyYXRpb25zXG4gICAgaWYgKGNvcHkucmFuZ2UuZW5kIDwgY29weS5yYW5nZS5zdGFydCkge1xuICAgICAgICBjb3B5LnJhbmdlLmVuZCA9IGdldERlZmF1bHRFdmVudEVuZChldmVudERlZi5hbGxEYXksIGNvcHkucmFuZ2Uuc3RhcnQsIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cblxuY2xhc3MgRXZlbnRTb3VyY2VJbXBsIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBpbnRlcm5hbEV2ZW50U291cmNlKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZSA9IGludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgfVxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRfU09VUkNFJyxcbiAgICAgICAgICAgIHNvdXJjZUlkOiB0aGlzLmludGVybmFsRXZlbnRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWZldGNoKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0ZFVENIX0VWRU5UX1NPVVJDRVMnLFxuICAgICAgICAgICAgc291cmNlSWRzOiBbdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkXSxcbiAgICAgICAgICAgIGlzUmVmZXRjaDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5wdWJsaWNJZDtcbiAgICB9XG4gICAgZ2V0IHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5tZXRhLnVybDtcbiAgICB9XG4gICAgZ2V0IGZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5tZXRhLmZvcm1hdDsgLy8gVE9ETzogYmFkLiBub3QgZ3VhcmFudGVlZFxuICAgIH1cbn1cblxuY2xhc3MgRXZlbnRJbXBsIHtcbiAgICAvLyBpbnN0YW5jZSB3aWxsIGJlIG51bGwgaWYgZXhwcmVzc2luZyBhIHJlY3VycmluZyBldmVudCB0aGF0IGhhcyBubyBjdXJyZW50IGluc3RhbmNlcyxcbiAgICAvLyBPUiBpZiB0cnlpbmcgdG8gdmFsaWRhdGUgYW4gaW5jb21pbmcgZXh0ZXJuYWwgZXZlbnQgdGhhdCBoYXMgbm8gZGF0ZXMgYXNzaWduZWRcbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBkZWYsIGluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLl9kZWYgPSBkZWY7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdGFuY2UgfHwgbnVsbDtcbiAgICB9XG4gICAgLypcbiAgICBUT0RPOiBtYWtlIGV2ZW50IHN0cnVjdCBtb3JlIHJlc3BvbnNpYmxlIGZvciB0aGlzXG4gICAgKi9cbiAgICBzZXRQcm9wKG5hbWUsIHZhbCkge1xuICAgICAgICBpZiAobmFtZSBpbiBFVkVOVF9EQVRFX1JFRklORVJTKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBzZXQgZGF0ZS1yZWxhdGVkIHByb3AgXFwnbmFtZVxcJy4gVXNlIG9uZSBvZiB0aGUgZGF0ZS1yZWxhdGVkIG1ldGhvZHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgcHJvcGVyIGFsaWFzaW5nIHN5c3RlbT9cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lID09PSAnaWQnKSB7XG4gICAgICAgICAgICB2YWwgPSBFVkVOVF9OT05fREFURV9SRUZJTkVSU1tuYW1lXSh2YWwpO1xuICAgICAgICAgICAgdGhpcy5tdXRhdGUoe1xuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHM6IHsgcHVibGljSWQ6IHZhbCB9LCAvLyBoYXJkY29kZWQgaW50ZXJuYWwgbmFtZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSBpbiBFVkVOVF9OT05fREFURV9SRUZJTkVSUykge1xuICAgICAgICAgICAgdmFsID0gRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlNbbmFtZV0odmFsKTtcbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzOiB7IFtuYW1lXTogdmFsIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lIGluIEVWRU5UX1VJX1JFRklORVJTKSB7XG4gICAgICAgICAgICBsZXQgdWkgPSBFVkVOVF9VSV9SRUZJTkVSU1tuYW1lXSh2YWwpO1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgICAgICB1aSA9IHsgYmFja2dyb3VuZENvbG9yOiB2YWwsIGJvcmRlckNvbG9yOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgICAgICAgICAgICB1aSA9IHsgc3RhcnRFZGl0YWJsZTogdmFsLCBkdXJhdGlvbkVkaXRhYmxlOiB2YWwgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHVpID0geyBbbmFtZV06IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoe1xuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHM6IHsgdWkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3Qgc2V0IHByb3AgJyR7bmFtZX0nLiBVc2Ugc2V0RXh0ZW5kZWRQcm9wIGluc3RlYWQuYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0RXh0ZW5kZWRQcm9wKG5hbWUsIHZhbCkge1xuICAgICAgICB0aGlzLm11dGF0ZSh7XG4gICAgICAgICAgICBleHRlbmRlZFByb3BzOiB7IFtuYW1lXTogdmFsIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRTdGFydChzdGFydElucHV0LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHsgZGF0ZUVudiB9ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgbGV0IHN0YXJ0ID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoc3RhcnRJbnB1dCk7XG4gICAgICAgIGlmIChzdGFydCAmJiB0aGlzLl9pbnN0YW5jZSkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZVJhbmdlID0gdGhpcy5faW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICBsZXQgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7IC8vIHdoYXQgaWYgcGFyc2VkIGJhZCE/XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tYWludGFpbkR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldEVuZChlbmRJbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgIGxldCBlbmQ7XG4gICAgICAgIGlmIChlbmRJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihlbmRJbnB1dCk7XG4gICAgICAgICAgICBpZiAoIWVuZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gVE9ETzogd2FybmluZyBpZiBwYXJzZWQgYmFkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZERlbHRhID0gZGlmZkRhdGVzKHRoaXMuX2luc3RhbmNlLnJhbmdlLmVuZCwgZW5kLCBkYXRlRW52LCBvcHRpb25zLmdyYW51bGFyaXR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGVuZERlbHRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFuZGFyZFByb3BzOiB7IGhhc0VuZDogZmFsc2UgfSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXREYXRlcyhzdGFydElucHV0LCBlbmRJbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgIGxldCBzdGFuZGFyZFByb3BzID0geyBhbGxEYXk6IG9wdGlvbnMuYWxsRGF5IH07XG4gICAgICAgIGxldCBzdGFydCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKHN0YXJ0SW5wdXQpO1xuICAgICAgICBsZXQgZW5kO1xuICAgICAgICBpZiAoIXN0YXJ0KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmRJbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbmQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihlbmRJbnB1dCk7XG4gICAgICAgICAgICBpZiAoIWVuZCkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2VSYW5nZSA9IHRoaXMuX2luc3RhbmNlLnJhbmdlO1xuICAgICAgICAgICAgLy8gd2hlbiBjb21wdXRpbmcgdGhlIGRpZmYgZm9yIGFuIGV2ZW50IGJlaW5nIGNvbnZlcnRlZCB0byBhbGwtZGF5LFxuICAgICAgICAgICAgLy8gY29tcHV0ZSBkaWZmIG9mZiBvZiB0aGUgYWxsLWRheSB2YWx1ZXMgdGhlIHdheSBldmVudC1tdXRhdGlvbiBkb2VzLlxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWxsRGF5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VSYW5nZSA9IGNvbXB1dGVBbGlnbmVkRGF5UmFuZ2UoaW5zdGFuY2VSYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhcnREZWx0YSA9IGRpZmZEYXRlcyhpbnN0YW5jZVJhbmdlLnN0YXJ0LCBzdGFydCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuZERlbHRhID0gZGlmZkRhdGVzKGluc3RhbmNlUmFuZ2UuZW5kLCBlbmQsIGRhdGVFbnYsIG9wdGlvbnMuZ3JhbnVsYXJpdHkpO1xuICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbnNFcXVhbChzdGFydERlbHRhLCBlbmREZWx0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhLCBzdGFuZGFyZFByb3BzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhLCBlbmREZWx0YSwgc3RhbmRhcmRQcm9wcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHsgLy8gbWVhbnMgXCJjbGVhciB0aGUgZW5kXCJcbiAgICAgICAgICAgICAgICBzdGFuZGFyZFByb3BzLmhhc0VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRlKHsgZGF0ZXNEZWx0YTogc3RhcnREZWx0YSwgc3RhbmRhcmRQcm9wcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3ZlU3RhcnQoZGVsdGFJbnB1dCkge1xuICAgICAgICBsZXQgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFydERlbHRhOiBkZWx0YSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtb3ZlRW5kKGRlbHRhSW5wdXQpIHtcbiAgICAgICAgbGV0IGRlbHRhID0gY3JlYXRlRHVyYXRpb24oZGVsdGFJbnB1dCk7XG4gICAgICAgIGlmIChkZWx0YSkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHsgZW5kRGVsdGE6IGRlbHRhIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmVEYXRlcyhkZWx0YUlucHV0KSB7XG4gICAgICAgIGxldCBkZWx0YSA9IGNyZWF0ZUR1cmF0aW9uKGRlbHRhSW5wdXQpO1xuICAgICAgICBpZiAoZGVsdGEpIHsgLy8gVE9ETzogd2FybmluZyBpZiBwYXJzZWQgYmFkXG4gICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGRhdGVzRGVsdGE6IGRlbHRhIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEFsbERheShhbGxEYXksIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgc3RhbmRhcmRQcm9wcyA9IHsgYWxsRGF5IH07XG4gICAgICAgIGxldCB7IG1haW50YWluRHVyYXRpb24gfSA9IG9wdGlvbnM7XG4gICAgICAgIGlmIChtYWludGFpbkR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIG1haW50YWluRHVyYXRpb24gPSB0aGlzLl9jb250ZXh0Lm9wdGlvbnMuYWxsRGF5TWFpbnRhaW5EdXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmFsbERheSAhPT0gYWxsRGF5KSB7XG4gICAgICAgICAgICBzdGFuZGFyZFByb3BzLmhhc0VuZCA9IG1haW50YWluRHVyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tdXRhdGUoeyBzdGFuZGFyZFByb3BzIH0pO1xuICAgIH1cbiAgICBmb3JtYXRSYW5nZShmb3JtYXRJbnB1dCkge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLl9jb250ZXh0O1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgbGV0IGZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihmb3JtYXRJbnB1dCk7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuaGFzRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZUVudi5mb3JtYXRSYW5nZShpbnN0YW5jZS5yYW5nZS5zdGFydCwgaW5zdGFuY2UucmFuZ2UuZW5kLCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgICAgICAgICBmb3JjZWRTdGFydFR6bzogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgICAgICAgICAgZm9yY2VkRW5kVHpvOiBpbnN0YW5jZS5mb3JjZWRFbmRUem8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0ZUVudi5mb3JtYXQoaW5zdGFuY2UucmFuZ2Uuc3RhcnQsIGZvcm1hdHRlciwge1xuICAgICAgICAgICAgZm9yY2VkVHpvOiBpbnN0YW5jZS5mb3JjZWRTdGFydFR6byxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11dGF0ZShtdXRhdGlvbikge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICBsZXQgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuICAgICAgICAgICAgbGV0IHsgZXZlbnRTdG9yZSB9ID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICAgICAgbGV0IHJlbGV2YW50RXZlbnRzID0gZ2V0UmVsZXZhbnRFdmVudHMoZXZlbnRTdG9yZSwgaW5zdGFuY2UuaW5zdGFuY2VJZCk7XG4gICAgICAgICAgICBsZXQgZXZlbnRDb25maWdCYXNlID0ge1xuICAgICAgICAgICAgICAgICcnOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50czogW10sXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFsbG93czogW10sXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJycsXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lczogW10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZWxldmFudEV2ZW50cyA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgICAgICAgICAgbGV0IG9sZEV2ZW50ID0gbmV3IEV2ZW50SW1wbChjb250ZXh0LCBkZWYsIGluc3RhbmNlKTsgLy8gc25hcHNob3RcbiAgICAgICAgICAgIHRoaXMuX2RlZiA9IHJlbGV2YW50RXZlbnRzLmRlZnNbZGVmLmRlZklkXTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gcmVsZXZhbnRFdmVudHMuaW5zdGFuY2VzW2luc3RhbmNlLmluc3RhbmNlSWRdO1xuICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICBvbGRFdmVudCxcbiAgICAgICAgICAgICAgICBldmVudDogdGhpcyxcbiAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBidWlsZEV2ZW50QXBpcyhyZWxldmFudEV2ZW50cywgY29udGV4dCwgaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVTRVRfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmUsIC8vIHRoZSBPUklHSU5BTCBzdG9yZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlKCkge1xuICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgIGxldCBhc1N0b3JlID0gZXZlbnRBcGlUb1N0b3JlKHRoaXMpO1xuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFzU3RvcmUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZW1vdmUnLCB7XG4gICAgICAgICAgICBldmVudDogdGhpcyxcbiAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IFtdLFxuICAgICAgICAgICAgcmV2ZXJ0KCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogYXNTdG9yZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgc291cmNlKCkge1xuICAgICAgICBsZXQgeyBzb3VyY2VJZCB9ID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoc291cmNlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRTb3VyY2VJbXBsKHRoaXMuX2NvbnRleHQsIHRoaXMuX2NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFNvdXJjZXNbc291cmNlSWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgP1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dC5kYXRlRW52LnRvRGF0ZSh0aGlzLl9pbnN0YW5jZS5yYW5nZS5zdGFydCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9XG4gICAgZ2V0IGVuZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9kZWYuaGFzRW5kKSA/XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLmVuZCkgOlxuICAgICAgICAgICAgbnVsbDtcbiAgICB9XG4gICAgZ2V0IHN0YXJ0U3RyKCkge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dC5kYXRlRW52LmZvcm1hdElzbyhpbnN0YW5jZS5yYW5nZS5zdGFydCwge1xuICAgICAgICAgICAgICAgIG9taXRUaW1lOiB0aGlzLl9kZWYuYWxsRGF5LFxuICAgICAgICAgICAgICAgIGZvcmNlZFR6bzogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGdldCBlbmRTdHIoKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UgJiYgdGhpcy5fZGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQuZGF0ZUVudi5mb3JtYXRJc28oaW5zdGFuY2UucmFuZ2UuZW5kLCB7XG4gICAgICAgICAgICAgICAgb21pdFRpbWU6IHRoaXMuX2RlZi5hbGxEYXksXG4gICAgICAgICAgICAgICAgZm9yY2VkVHpvOiBpbnN0YW5jZS5mb3JjZWRFbmRUem8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIC8vIGNvbXB1dGFibGUgcHJvcHMgdGhhdCBhbGwgYWNjZXNzIHRoZSBkZWZcbiAgICAvLyBUT0RPOiBmaW5kIGEgVHlwZVNjcmlwdC1jb21wYXRpYmxlIHdheSB0byBkbyB0aGlzIGF0IHNjYWxlXG4gICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5fZGVmLnB1YmxpY0lkOyB9XG4gICAgZ2V0IGdyb3VwSWQoKSB7IHJldHVybiB0aGlzLl9kZWYuZ3JvdXBJZDsgfVxuICAgIGdldCBhbGxEYXkoKSB7IHJldHVybiB0aGlzLl9kZWYuYWxsRGF5OyB9XG4gICAgZ2V0IHRpdGxlKCkgeyByZXR1cm4gdGhpcy5fZGVmLnRpdGxlOyB9XG4gICAgZ2V0IHVybCgpIHsgcmV0dXJuIHRoaXMuX2RlZi51cmw7IH1cbiAgICBnZXQgZGlzcGxheSgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5kaXNwbGF5IHx8ICdhdXRvJzsgfSAvLyBiYWQuIGp1c3Qgbm9ybWFsaXplIHRoZSB0eXBlIGVhcmxpZXJcbiAgICBnZXQgc3RhcnRFZGl0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5zdGFydEVkaXRhYmxlOyB9XG4gICAgZ2V0IGR1cmF0aW9uRWRpdGFibGUoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuZHVyYXRpb25FZGl0YWJsZTsgfVxuICAgIGdldCBjb25zdHJhaW50KCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmNvbnN0cmFpbnRzWzBdIHx8IG51bGw7IH1cbiAgICBnZXQgb3ZlcmxhcCgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5vdmVybGFwOyB9XG4gICAgZ2V0IGFsbG93KCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmFsbG93c1swXSB8fCBudWxsOyB9XG4gICAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5iYWNrZ3JvdW5kQ29sb3I7IH1cbiAgICBnZXQgYm9yZGVyQ29sb3IoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuYm9yZGVyQ29sb3I7IH1cbiAgICBnZXQgdGV4dENvbG9yKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLnRleHRDb2xvcjsgfVxuICAgIC8vIE5PVEU6IHVzZXIgY2FuJ3QgbW9kaWZ5IHRoZXNlIGJlY2F1c2UgT2JqZWN0LmZyZWV6ZSB3YXMgY2FsbGVkIGluIGV2ZW50LWRlZiBwYXJzaW5nXG4gICAgZ2V0IGNsYXNzTmFtZXMoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY2xhc3NOYW1lczsgfVxuICAgIGdldCBleHRlbmRlZFByb3BzKCkgeyByZXR1cm4gdGhpcy5fZGVmLmV4dGVuZGVkUHJvcHM7IH1cbiAgICB0b1BsYWluT2JqZWN0KHNldHRpbmdzID0ge30pIHtcbiAgICAgICAgbGV0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgbGV0IHsgdWkgfSA9IGRlZjtcbiAgICAgICAgbGV0IHsgc3RhcnRTdHIsIGVuZFN0ciB9ID0gdGhpcztcbiAgICAgICAgbGV0IHJlcyA9IHtcbiAgICAgICAgICAgIGFsbERheTogZGVmLmFsbERheSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlZi50aXRsZSkge1xuICAgICAgICAgICAgcmVzLnRpdGxlID0gZGVmLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydFN0cikge1xuICAgICAgICAgICAgcmVzLnN0YXJ0ID0gc3RhcnRTdHI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZFN0cikge1xuICAgICAgICAgICAgcmVzLmVuZCA9IGVuZFN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLnB1YmxpY0lkKSB7XG4gICAgICAgICAgICByZXMuaWQgPSBkZWYucHVibGljSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5ncm91cElkKSB7XG4gICAgICAgICAgICByZXMuZ3JvdXBJZCA9IGRlZi5ncm91cElkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYudXJsKSB7XG4gICAgICAgICAgICByZXMudXJsID0gZGVmLnVybDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodWkuZGlzcGxheSAmJiB1aS5kaXNwbGF5ICE9PSAnYXV0bycpIHtcbiAgICAgICAgICAgIHJlcy5kaXNwbGF5ID0gdWkuZGlzcGxheTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiB3aGF0IGFib3V0IHJlY3VycmluZy1ldmVudCBwcm9wZXJ0aWVzPz8/XG4gICAgICAgIC8vIFRPRE86IGluY2x1ZGUgc3RhcnRFZGl0YWJsZS9kdXJhdGlvbkVkaXRhYmxlL2NvbnN0cmFpbnQvb3ZlcmxhcC9hbGxvd1xuICAgICAgICBpZiAoc2V0dGluZ3MuY29sbGFwc2VDb2xvciAmJiB1aS5iYWNrZ3JvdW5kQ29sb3IgJiYgdWkuYmFja2dyb3VuZENvbG9yID09PSB1aS5ib3JkZXJDb2xvcikge1xuICAgICAgICAgICAgcmVzLmNvbG9yID0gdWkuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHVpLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgICAgIHJlcy5iYWNrZ3JvdW5kQ29sb3IgPSB1aS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodWkuYm9yZGVyQ29sb3IpIHtcbiAgICAgICAgICAgICAgICByZXMuYm9yZGVyQ29sb3IgPSB1aS5ib3JkZXJDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodWkudGV4dENvbG9yKSB7XG4gICAgICAgICAgICByZXMudGV4dENvbG9yID0gdWkudGV4dENvbG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1aS5jbGFzc05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLmNsYXNzTmFtZXMgPSB1aS5jbGFzc05hbWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZWYuZXh0ZW5kZWRQcm9wcykubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuY29sbGFwc2VFeHRlbmRlZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihyZXMsIGRlZi5leHRlbmRlZFByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlcy5leHRlbmRlZFByb3BzID0gZGVmLmV4dGVuZGVkUHJvcHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgdG9KU09OKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b1BsYWluT2JqZWN0KCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZXZlbnRBcGlUb1N0b3JlKGV2ZW50QXBpKSB7XG4gICAgbGV0IGRlZiA9IGV2ZW50QXBpLl9kZWY7XG4gICAgbGV0IGluc3RhbmNlID0gZXZlbnRBcGkuX2luc3RhbmNlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZnM6IHsgW2RlZi5kZWZJZF06IGRlZiB9LFxuICAgICAgICBpbnN0YW5jZXM6IGluc3RhbmNlXG4gICAgICAgICAgICA/IHsgW2luc3RhbmNlLmluc3RhbmNlSWRdOiBpbnN0YW5jZSB9XG4gICAgICAgICAgICA6IHt9LFxuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50QXBpcyhldmVudFN0b3JlLCBjb250ZXh0LCBleGNsdWRlSW5zdGFuY2UpIHtcbiAgICBsZXQgeyBkZWZzLCBpbnN0YW5jZXMgfSA9IGV2ZW50U3RvcmU7XG4gICAgbGV0IGV2ZW50QXBpcyA9IFtdO1xuICAgIGxldCBleGNsdWRlSW5zdGFuY2VJZCA9IGV4Y2x1ZGVJbnN0YW5jZSA/IGV4Y2x1ZGVJbnN0YW5jZS5pbnN0YW5jZUlkIDogJyc7XG4gICAgZm9yIChsZXQgaWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpZF07XG4gICAgICAgIGxldCBkZWYgPSBkZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgaWYgKGluc3RhbmNlLmluc3RhbmNlSWQgIT09IGV4Y2x1ZGVJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBldmVudEFwaXMucHVzaChuZXcgRXZlbnRJbXBsKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRBcGlzO1xufVxuXG4vKlxuU3BlY2lmeWluZyBuZXh0RGF5VGhyZXNob2xkIHNpZ25hbHMgdGhhdCBhbGwtZGF5IHJhbmdlcyBzaG91bGQgYmUgc2xpY2VkLlxuKi9cbmZ1bmN0aW9uIHNsaWNlRXZlbnRTdG9yZShldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGZyYW1pbmdSYW5nZSwgbmV4dERheVRocmVzaG9sZCkge1xuICAgIGxldCBpbnZlcnNlQmdCeUdyb3VwSWQgPSB7fTtcbiAgICBsZXQgaW52ZXJzZUJnQnlEZWZJZCA9IHt9O1xuICAgIGxldCBkZWZCeUdyb3VwSWQgPSB7fTtcbiAgICBsZXQgYmdSYW5nZXMgPSBbXTtcbiAgICBsZXQgZmdSYW5nZXMgPSBbXTtcbiAgICBsZXQgZXZlbnRVaXMgPSBjb21waWxlRXZlbnRVaXMoZXZlbnRTdG9yZS5kZWZzLCBldmVudFVpQmFzZXMpO1xuICAgIGZvciAobGV0IGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICBsZXQgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgbGV0IHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgaWYgKHVpLmRpc3BsYXkgPT09ICdpbnZlcnNlLWJhY2tncm91bmQnKSB7XG4gICAgICAgICAgICBpZiAoZGVmLmdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdID0gW107XG4gICAgICAgICAgICAgICAgaWYgKCFkZWZCeUdyb3VwSWRbZGVmLmdyb3VwSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZkJ5R3JvdXBJZFtkZWYuZ3JvdXBJZF0gPSBkZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtkZWZJZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICBsZXQgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgbGV0IHVpID0gZXZlbnRVaXNbZGVmLmRlZklkXTtcbiAgICAgICAgbGV0IG9yaWdSYW5nZSA9IGluc3RhbmNlLnJhbmdlO1xuICAgICAgICBsZXQgbm9ybWFsUmFuZ2UgPSAoIWRlZi5hbGxEYXkgJiYgbmV4dERheVRocmVzaG9sZCkgP1xuICAgICAgICAgICAgY29tcHV0ZVZpc2libGVEYXlSYW5nZShvcmlnUmFuZ2UsIG5leHREYXlUaHJlc2hvbGQpIDpcbiAgICAgICAgICAgIG9yaWdSYW5nZTtcbiAgICAgICAgbGV0IHNsaWNlZFJhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKG5vcm1hbFJhbmdlLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBpZiAoc2xpY2VkUmFuZ2UpIHtcbiAgICAgICAgICAgIGlmICh1aS5kaXNwbGF5ID09PSAnaW52ZXJzZS1iYWNrZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeUdyb3VwSWRbZGVmLmdyb3VwSWRdLnB1c2goc2xpY2VkUmFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52ZXJzZUJnQnlEZWZJZFtpbnN0YW5jZS5kZWZJZF0ucHVzaChzbGljZWRSYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodWkuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgKHVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyA/IGJnUmFuZ2VzIDogZmdSYW5nZXMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkZWYsXG4gICAgICAgICAgICAgICAgICAgIHVpLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHNsaWNlZFJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBpc1N0YXJ0OiBub3JtYWxSYW5nZS5zdGFydCAmJiBub3JtYWxSYW5nZS5zdGFydC52YWx1ZU9mKCkgPT09IHNsaWNlZFJhbmdlLnN0YXJ0LnZhbHVlT2YoKSxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmQ6IG5vcm1hbFJhbmdlLmVuZCAmJiBub3JtYWxSYW5nZS5lbmQudmFsdWVPZigpID09PSBzbGljZWRSYW5nZS5lbmQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGdyb3VwSWQgaW4gaW52ZXJzZUJnQnlHcm91cElkKSB7IC8vIEJZIEdST1VQXG4gICAgICAgIGxldCByYW5nZXMgPSBpbnZlcnNlQmdCeUdyb3VwSWRbZ3JvdXBJZF07XG4gICAgICAgIGxldCBpbnZlcnRlZFJhbmdlcyA9IGludmVydFJhbmdlcyhyYW5nZXMsIGZyYW1pbmdSYW5nZSk7XG4gICAgICAgIGZvciAobGV0IGludmVydGVkUmFuZ2Ugb2YgaW52ZXJ0ZWRSYW5nZXMpIHtcbiAgICAgICAgICAgIGxldCBkZWYgPSBkZWZCeUdyb3VwSWRbZ3JvdXBJZF07XG4gICAgICAgICAgICBsZXQgdWkgPSBldmVudFVpc1tkZWYuZGVmSWRdO1xuICAgICAgICAgICAgYmdSYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZGVmLFxuICAgICAgICAgICAgICAgIHVpLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGRlZklkIGluIGludmVyc2VCZ0J5RGVmSWQpIHtcbiAgICAgICAgbGV0IHJhbmdlcyA9IGludmVyc2VCZ0J5RGVmSWRbZGVmSWRdO1xuICAgICAgICBsZXQgaW52ZXJ0ZWRSYW5nZXMgPSBpbnZlcnRSYW5nZXMocmFuZ2VzLCBmcmFtaW5nUmFuZ2UpO1xuICAgICAgICBmb3IgKGxldCBpbnZlcnRlZFJhbmdlIG9mIGludmVydGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBiZ1Jhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkZWY6IGV2ZW50U3RvcmUuZGVmc1tkZWZJZF0sXG4gICAgICAgICAgICAgICAgdWk6IGV2ZW50VWlzW2RlZklkXSxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZTogbnVsbCxcbiAgICAgICAgICAgICAgICByYW5nZTogaW52ZXJ0ZWRSYW5nZSxcbiAgICAgICAgICAgICAgICBpc1N0YXJ0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0VuZDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBiZzogYmdSYW5nZXMsIGZnOiBmZ1JhbmdlcyB9O1xufVxuZnVuY3Rpb24gaGFzQmdSZW5kZXJpbmcoZGVmKSB7XG4gICAgcmV0dXJuIGRlZi51aS5kaXNwbGF5ID09PSAnYmFja2dyb3VuZCcgfHwgZGVmLnVpLmRpc3BsYXkgPT09ICdpbnZlcnNlLWJhY2tncm91bmQnO1xufVxuZnVuY3Rpb24gc2V0RWxTZWcoZWwsIHNlZykge1xuICAgIGVsLmZjU2VnID0gc2VnO1xufVxuZnVuY3Rpb24gZ2V0RWxTZWcoZWwpIHtcbiAgICByZXR1cm4gZWwuZmNTZWcgfHxcbiAgICAgICAgZWwucGFyZW50Tm9kZS5mY1NlZyB8fCAvLyBmb3IgdGhlIGhhcm5lc3NcbiAgICAgICAgbnVsbDtcbn1cbi8vIGV2ZW50IHVpIGNvbXB1dGF0aW9uXG5mdW5jdGlvbiBjb21waWxlRXZlbnRVaXMoZXZlbnREZWZzLCBldmVudFVpQmFzZXMpIHtcbiAgICByZXR1cm4gbWFwSGFzaChldmVudERlZnMsIChldmVudERlZikgPT4gY29tcGlsZUV2ZW50VWkoZXZlbnREZWYsIGV2ZW50VWlCYXNlcykpO1xufVxuZnVuY3Rpb24gY29tcGlsZUV2ZW50VWkoZXZlbnREZWYsIGV2ZW50VWlCYXNlcykge1xuICAgIGxldCB1aXMgPSBbXTtcbiAgICBpZiAoZXZlbnRVaUJhc2VzWycnXSkge1xuICAgICAgICB1aXMucHVzaChldmVudFVpQmFzZXNbJyddKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50VWlCYXNlc1tldmVudERlZi5kZWZJZF0pIHtcbiAgICAgICAgdWlzLnB1c2goZXZlbnRVaUJhc2VzW2V2ZW50RGVmLmRlZklkXSk7XG4gICAgfVxuICAgIHVpcy5wdXNoKGV2ZW50RGVmLnVpKTtcbiAgICByZXR1cm4gY29tYmluZUV2ZW50VWlzKHVpcyk7XG59XG5mdW5jdGlvbiBzb3J0RXZlbnRTZWdzKHNlZ3MsIGV2ZW50T3JkZXJTcGVjcykge1xuICAgIGxldCBvYmpzID0gc2Vncy5tYXAoYnVpbGRTZWdDb21wYXJlT2JqKTtcbiAgICBvYmpzLnNvcnQoKG9iajAsIG9iajEpID0+IGNvbXBhcmVCeUZpZWxkU3BlY3Mob2JqMCwgb2JqMSwgZXZlbnRPcmRlclNwZWNzKSk7XG4gICAgcmV0dXJuIG9ianMubWFwKChjKSA9PiBjLl9zZWcpO1xufVxuLy8gcmV0dXJucyBhIG9iamVjdCB3aXRoIGFsbCBwcmltaXRpdmUgcHJvcHMgdGhhdCBjYW4gYmUgY29tcGFyZWRcbmZ1bmN0aW9uIGJ1aWxkU2VnQ29tcGFyZU9iaihzZWcpIHtcbiAgICBsZXQgeyBldmVudFJhbmdlIH0gPSBzZWc7XG4gICAgbGV0IGV2ZW50RGVmID0gZXZlbnRSYW5nZS5kZWY7XG4gICAgbGV0IHJhbmdlID0gZXZlbnRSYW5nZS5pbnN0YW5jZSA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UucmFuZ2UgOiBldmVudFJhbmdlLnJhbmdlO1xuICAgIGxldCBzdGFydCA9IHJhbmdlLnN0YXJ0ID8gcmFuZ2Uuc3RhcnQudmFsdWVPZigpIDogMDsgLy8gVE9ETzogYmV0dGVyIHN1cHBvcnQgZm9yIG9wZW4tcmFuZ2UgZXZlbnRzXG4gICAgbGV0IGVuZCA9IHJhbmdlLmVuZCA/IHJhbmdlLmVuZC52YWx1ZU9mKCkgOiAwOyAvLyBcIlxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnREZWYuZXh0ZW5kZWRQcm9wcyksIGV2ZW50RGVmKSwgeyBpZDogZXZlbnREZWYucHVibGljSWQsIHN0YXJ0LFxuICAgICAgICBlbmQsIGR1cmF0aW9uOiBlbmQgLSBzdGFydCwgYWxsRGF5OiBOdW1iZXIoZXZlbnREZWYuYWxsRGF5KSwgX3NlZzogc2VnIH0pO1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ0RyYWdnYWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBwbHVnaW5Ib29rcyB9ID0gY29udGV4dDtcbiAgICBsZXQgdHJhbnNmb3JtZXJzID0gcGx1Z2luSG9va3MuaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnM7XG4gICAgbGV0IHsgZGVmLCB1aSB9ID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgbGV0IHZhbCA9IHVpLnN0YXJ0RWRpdGFibGU7XG4gICAgZm9yIChsZXQgdHJhbnNmb3JtZXIgb2YgdHJhbnNmb3JtZXJzKSB7XG4gICAgICAgIHZhbCA9IHRyYW5zZm9ybWVyKHZhbCwgZGVmLCB1aSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBjb21wdXRlU2VnU3RhcnRSZXNpemFibGUoc2VnLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHNlZy5pc1N0YXJ0ICYmIHNlZy5ldmVudFJhbmdlLnVpLmR1cmF0aW9uRWRpdGFibGUgJiYgY29udGV4dC5vcHRpb25zLmV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0O1xufVxuZnVuY3Rpb24gY29tcHV0ZVNlZ0VuZFJlc2l6YWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2VnLmlzRW5kICYmIHNlZy5ldmVudFJhbmdlLnVpLmR1cmF0aW9uRWRpdGFibGU7XG59XG5mdW5jdGlvbiBidWlsZFNlZ1RpbWVUZXh0KHNlZywgdGltZUZvcm1hdCwgY29udGV4dCwgZGVmYXVsdERpc3BsYXlFdmVudFRpbWUsIC8vIGRlZmF1bHRzIHRvIHRydWVcbmRlZmF1bHREaXNwbGF5RXZlbnRFbmQsIC8vIGRlZmF1bHRzIHRvIHRydWVcbnN0YXJ0T3ZlcnJpZGUsIGVuZE92ZXJyaWRlKSB7XG4gICAgbGV0IHsgZGF0ZUVudiwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICBsZXQgeyBkaXNwbGF5RXZlbnRUaW1lLCBkaXNwbGF5RXZlbnRFbmQgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGV2ZW50RGVmID0gc2VnLmV2ZW50UmFuZ2UuZGVmO1xuICAgIGxldCBldmVudEluc3RhbmNlID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgaWYgKGRpc3BsYXlFdmVudFRpbWUgPT0gbnVsbCkge1xuICAgICAgICBkaXNwbGF5RXZlbnRUaW1lID0gZGVmYXVsdERpc3BsYXlFdmVudFRpbWUgIT09IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheUV2ZW50RW5kID09IG51bGwpIHtcbiAgICAgICAgZGlzcGxheUV2ZW50RW5kID0gZGVmYXVsdERpc3BsYXlFdmVudEVuZCAhPT0gZmFsc2U7XG4gICAgfVxuICAgIGxldCB3aG9sZUV2ZW50U3RhcnQgPSBldmVudEluc3RhbmNlLnJhbmdlLnN0YXJ0O1xuICAgIGxldCB3aG9sZUV2ZW50RW5kID0gZXZlbnRJbnN0YW5jZS5yYW5nZS5lbmQ7XG4gICAgbGV0IHNlZ1N0YXJ0ID0gc3RhcnRPdmVycmlkZSB8fCBzZWcuc3RhcnQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG4gICAgbGV0IHNlZ0VuZCA9IGVuZE92ZXJyaWRlIHx8IHNlZy5lbmQgfHwgc2VnLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xuICAgIGxldCBpc1N0YXJ0RGF5ID0gc3RhcnRPZkRheSh3aG9sZUV2ZW50U3RhcnQpLnZhbHVlT2YoKSA9PT0gc3RhcnRPZkRheShzZWdTdGFydCkudmFsdWVPZigpO1xuICAgIGxldCBpc0VuZERheSA9IHN0YXJ0T2ZEYXkoYWRkTXMod2hvbGVFdmVudEVuZCwgLTEpKS52YWx1ZU9mKCkgPT09IHN0YXJ0T2ZEYXkoYWRkTXMoc2VnRW5kLCAtMSkpLnZhbHVlT2YoKTtcbiAgICBpZiAoZGlzcGxheUV2ZW50VGltZSAmJiAhZXZlbnREZWYuYWxsRGF5ICYmIChpc1N0YXJ0RGF5IHx8IGlzRW5kRGF5KSkge1xuICAgICAgICBzZWdTdGFydCA9IGlzU3RhcnREYXkgPyB3aG9sZUV2ZW50U3RhcnQgOiBzZWdTdGFydDtcbiAgICAgICAgc2VnRW5kID0gaXNFbmREYXkgPyB3aG9sZUV2ZW50RW5kIDogc2VnRW5kO1xuICAgICAgICBpZiAoZGlzcGxheUV2ZW50RW5kICYmIGV2ZW50RGVmLmhhc0VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2Uoc2VnU3RhcnQsIHNlZ0VuZCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sXG4gICAgICAgICAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRPdmVycmlkZSA/IG51bGwgOiBldmVudEluc3RhbmNlLmZvcmNlZEVuZFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChzZWdTdGFydCwgdGltZUZvcm1hdCwge1xuICAgICAgICAgICAgZm9yY2VkVHpvOiBzdGFydE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIC8vIG5vb29vbywgc2FtZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufVxuZnVuY3Rpb24gZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UsIG5vd0RhdGUpIHtcbiAgICBsZXQgc2VnUmFuZ2UgPSBzZWcuZXZlbnRSYW5nZS5yYW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBpc1Bhc3Q6IHNlZ1JhbmdlLmVuZCA8IChub3dEYXRlIHx8IHRvZGF5UmFuZ2Uuc3RhcnQpLFxuICAgICAgICBpc0Z1dHVyZTogc2VnUmFuZ2Uuc3RhcnQgPj0gKG5vd0RhdGUgfHwgdG9kYXlSYW5nZS5lbmQpLFxuICAgICAgICBpc1RvZGF5OiB0b2RheVJhbmdlICYmIHJhbmdlQ29udGFpbnNNYXJrZXIodG9kYXlSYW5nZSwgc2VnUmFuZ2Uuc3RhcnQpLFxuICAgIH07XG59XG5mdW5jdGlvbiBnZXRFdmVudENsYXNzTmFtZXMocHJvcHMpIHtcbiAgICBsZXQgY2xhc3NOYW1lcyA9IFsnZmMtZXZlbnQnXTtcbiAgICBpZiAocHJvcHMuaXNNaXJyb3IpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1taXJyb3InKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRHJhZ2dhYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dhYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0UmVzaXphYmxlIHx8IHByb3BzLmlzRW5kUmVzaXphYmxlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtcmVzaXphYmxlJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZHJhZ2dpbmcnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzUmVzaXppbmcpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1yZXNpemluZycpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNTZWxlY3RlZCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LXNlbGVjdGVkJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1N0YXJ0KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtc3RhcnQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRW5kKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZW5kJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1Bhc3QpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1wYXN0Jyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1RvZGF5KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtdG9kYXknKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRnV0dXJlKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtZnV0dXJlJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFJhbmdlS2V5KGV2ZW50UmFuZ2UpIHtcbiAgICByZXR1cm4gZXZlbnRSYW5nZS5pbnN0YW5jZVxuICAgICAgICA/IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZFxuICAgICAgICA6IGAke2V2ZW50UmFuZ2UuZGVmLmRlZklkfToke2V2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQudG9JU09TdHJpbmcoKX1gO1xuICAgIC8vIGludmVyc2UtYmFja2dyb3VuZCBldmVudHMgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBpbnN0YW5jZXMuIFRPRE86IGJldHRlciBzb2x1dGlvblxufVxuZnVuY3Rpb24gZ2V0U2VnQW5jaG9yQXR0cnMoc2VnLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgZGVmLCBpbnN0YW5jZSB9ID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgbGV0IHsgdXJsIH0gPSBkZWY7XG4gICAgaWYgKHVybCkge1xuICAgICAgICByZXR1cm4geyBocmVmOiB1cmwgfTtcbiAgICB9XG4gICAgbGV0IHsgZW1pdHRlciwgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICBsZXQgeyBldmVudEludGVyYWN0aXZlIH0gPSBvcHRpb25zO1xuICAgIGlmIChldmVudEludGVyYWN0aXZlID09IG51bGwpIHtcbiAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IGRlZi5pbnRlcmFjdGl2ZTtcbiAgICAgICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbnRlcmFjdGl2ZSA9IEJvb2xlYW4oZW1pdHRlci5oYXNIYW5kbGVycygnZXZlbnRDbGljaycpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBtb2NrIHdoYXQgaGFwcGVucyBpbiBFdmVudENsaWNraW5nXG4gICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUpIHtcbiAgICAgICAgLy8gb25seSBhdHRhY2gga2V5Ym9hcmQtcmVsYXRlZCBoYW5kbGVycyBiZWNhdXNlIGNsaWNrIGhhbmRsZXIgaXMgYWxyZWFkeSBkb25lIGluIEV2ZW50Q2xpY2tpbmdcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzKChldikgPT4ge1xuICAgICAgICAgICAgZW1pdHRlci50cmlnZ2VyKCdldmVudENsaWNrJywge1xuICAgICAgICAgICAgICAgIGVsOiBldi50YXJnZXQsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEltcGwoY29udGV4dCwgZGVmLCBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAganNFdmVudDogZXYsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge307XG59XG5cbmNvbnN0IFNUQU5EQVJEX1BST1BTID0ge1xuICAgIHN0YXJ0OiBpZGVudGl0eSxcbiAgICBlbmQ6IGlkZW50aXR5LFxuICAgIGFsbERheTogQm9vbGVhbixcbn07XG5mdW5jdGlvbiBwYXJzZURhdGVTcGFuKHJhdywgZGF0ZUVudiwgZGVmYXVsdER1cmF0aW9uKSB7XG4gICAgbGV0IHNwYW4gPSBwYXJzZU9wZW5EYXRlU3BhbihyYXcsIGRhdGVFbnYpO1xuICAgIGxldCB7IHJhbmdlIH0gPSBzcGFuO1xuICAgIGlmICghcmFuZ2Uuc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICghcmFuZ2UuZW5kKSB7XG4gICAgICAgIGlmIChkZWZhdWx0RHVyYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmFuZ2UuZW5kID0gZGF0ZUVudi5hZGQocmFuZ2Uuc3RhcnQsIGRlZmF1bHREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBzcGFuO1xufVxuLypcblRPRE86IHNvbWVob3cgY29tYmluZSB3aXRoIHBhcnNlUmFuZ2U/XG5XaWxsIHJldHVybiBudWxsIGlmIHRoZSBzdGFydC9lbmQgcHJvcHMgd2VyZSBwcmVzZW50IGJ1dCBwYXJzZWQgaW52YWxpZGx5LlxuKi9cbmZ1bmN0aW9uIHBhcnNlT3BlbkRhdGVTcGFuKHJhdywgZGF0ZUVudikge1xuICAgIGxldCB7IHJlZmluZWQ6IHN0YW5kYXJkUHJvcHMsIGV4dHJhIH0gPSByZWZpbmVQcm9wcyhyYXcsIFNUQU5EQVJEX1BST1BTKTtcbiAgICBsZXQgc3RhcnRNZXRhID0gc3RhbmRhcmRQcm9wcy5zdGFydCA/IGRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShzdGFuZGFyZFByb3BzLnN0YXJ0KSA6IG51bGw7XG4gICAgbGV0IGVuZE1ldGEgPSBzdGFuZGFyZFByb3BzLmVuZCA/IGRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShzdGFuZGFyZFByb3BzLmVuZCkgOiBudWxsO1xuICAgIGxldCB7IGFsbERheSB9ID0gc3RhbmRhcmRQcm9wcztcbiAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgYWxsRGF5ID0gKHN0YXJ0TWV0YSAmJiBzdGFydE1ldGEuaXNUaW1lVW5zcGVjaWZpZWQpICYmXG4gICAgICAgICAgICAoIWVuZE1ldGEgfHwgZW5kTWV0YS5pc1RpbWVVbnNwZWNpZmllZCk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgcmFuZ2U6IHtcbiAgICAgICAgICAgIHN0YXJ0OiBzdGFydE1ldGEgPyBzdGFydE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgICAgIGVuZDogZW5kTWV0YSA/IGVuZE1ldGEubWFya2VyIDogbnVsbCxcbiAgICAgICAgfSwgYWxsRGF5IH0sIGV4dHJhKTtcbn1cbmZ1bmN0aW9uIGlzRGF0ZVNwYW5zRXF1YWwoc3BhbjAsIHNwYW4xKSB7XG4gICAgcmV0dXJuIHJhbmdlc0VxdWFsKHNwYW4wLnJhbmdlLCBzcGFuMS5yYW5nZSkgJiZcbiAgICAgICAgc3BhbjAuYWxsRGF5ID09PSBzcGFuMS5hbGxEYXkgJiZcbiAgICAgICAgaXNTcGFuUHJvcHNFcXVhbChzcGFuMCwgc3BhbjEpO1xufVxuLy8gdGhlIE5PTi1EQVRFLVJFTEFURUQgcHJvcHNcbmZ1bmN0aW9uIGlzU3BhblByb3BzRXF1YWwoc3BhbjAsIHNwYW4xKSB7XG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gc3BhbjEpIHtcbiAgICAgICAgaWYgKHByb3BOYW1lICE9PSAncmFuZ2UnICYmIHByb3BOYW1lICE9PSAnYWxsRGF5Jykge1xuICAgICAgICAgICAgaWYgKHNwYW4wW3Byb3BOYW1lXSAhPT0gc3BhbjFbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFyZSB0aGVyZSBhbnkgcHJvcHMgdGhhdCBzcGFuMCBoYXMgdGhhdCBzcGFuMSBET0VTTidUIGhhdmU/XG4gICAgLy8gYm90aCBoYXZlIHJhbmdlL2FsbERheSwgc28gbm8gbmVlZCB0byBzcGVjaWFsLWNhc2UuXG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gc3BhbjApIHtcbiAgICAgICAgaWYgKCEocHJvcE5hbWUgaW4gc3BhbjEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBidWlsZERhdGVTcGFuQXBpKHNwYW4sIGRhdGVFbnYpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBidWlsZFJhbmdlQXBpKHNwYW4ucmFuZ2UsIGRhdGVFbnYsIHNwYW4uYWxsRGF5KSksIHsgYWxsRGF5OiBzcGFuLmFsbERheSB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmUocmFuZ2UsIGRhdGVFbnYsIG9taXRUaW1lKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYnVpbGRSYW5nZUFwaShyYW5nZSwgZGF0ZUVudiwgb21pdFRpbWUpKSwgeyB0aW1lWm9uZTogZGF0ZUVudi50aW1lWm9uZSB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUmFuZ2VBcGkocmFuZ2UsIGRhdGVFbnYsIG9taXRUaW1lKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGRhdGVFbnYudG9EYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBkYXRlRW52LnRvRGF0ZShyYW5nZS5lbmQpLFxuICAgICAgICBzdGFydFN0cjogZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQsIHsgb21pdFRpbWUgfSksXG4gICAgICAgIGVuZFN0cjogZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2UuZW5kLCB7IG9taXRUaW1lIH0pLFxuICAgIH07XG59XG5mdW5jdGlvbiBmYWJyaWNhdGVFdmVudFJhbmdlKGRhdGVTcGFuLCBldmVudFVpQmFzZXMsIGNvbnRleHQpIHtcbiAgICBsZXQgcmVzID0gcmVmaW5lRXZlbnREZWYoeyBlZGl0YWJsZTogZmFsc2UgfSwgY29udGV4dCk7XG4gICAgbGV0IGRlZiA9IHBhcnNlRXZlbnREZWYocmVzLnJlZmluZWQsIHJlcy5leHRyYSwgJycsIC8vIHNvdXJjZUlkXG4gICAgZGF0ZVNwYW4uYWxsRGF5LCB0cnVlLCAvLyBoYXNFbmRcbiAgICBjb250ZXh0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWYsXG4gICAgICAgIHVpOiBjb21waWxlRXZlbnRVaShkZWYsIGV2ZW50VWlCYXNlcyksXG4gICAgICAgIGluc3RhbmNlOiBjcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgZGF0ZVNwYW4ucmFuZ2UpLFxuICAgICAgICByYW5nZTogZGF0ZVNwYW4ucmFuZ2UsXG4gICAgICAgIGlzU3RhcnQ6IHRydWUsXG4gICAgICAgIGlzRW5kOiB0cnVlLFxuICAgIH07XG59XG5cbmxldCBjYWxlbmRhclN5c3RlbUNsYXNzTWFwID0ge307XG5mdW5jdGlvbiByZWdpc3RlckNhbGVuZGFyU3lzdGVtKG5hbWUsIHRoZUNsYXNzKSB7XG4gICAgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSA9IHRoZUNsYXNzO1xufVxuZnVuY3Rpb24gY3JlYXRlQ2FsZW5kYXJTeXN0ZW0obmFtZSkge1xuICAgIHJldHVybiBuZXcgY2FsZW5kYXJTeXN0ZW1DbGFzc01hcFtuYW1lXSgpO1xufVxuY2xhc3MgR3JlZ29yaWFuQ2FsZW5kYXJTeXN0ZW0ge1xuICAgIGdldE1hcmtlclllYXIoZCkge1xuICAgICAgICByZXR1cm4gZC5nZXRVVENGdWxsWWVhcigpO1xuICAgIH1cbiAgICBnZXRNYXJrZXJNb250aChkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ01vbnRoKCk7XG4gICAgfVxuICAgIGdldE1hcmtlckRheShkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0RhdGUoKTtcbiAgICB9XG4gICAgYXJyYXlUb01hcmtlcihhcnIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGFycik7XG4gICAgfVxuICAgIG1hcmtlclRvQXJyYXkobWFya2VyKSB7XG4gICAgICAgIHJldHVybiBkYXRlVG9VdGNBcnJheShtYXJrZXIpO1xuICAgIH1cbn1cbnJlZ2lzdGVyQ2FsZW5kYXJTeXN0ZW0oJ2dyZWdvcnknLCBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbSk7XG5cbmNvbnN0IElTT19SRSA9IC9eXFxzKihcXGR7NH0pKC0/KFxcZHsyfSkoLT8oXFxkezJ9KShbVCBdKFxcZHsyfSk6PyhcXGR7Mn0pKDo/KFxcZHsyfSkoXFwuKFxcZCspKT8pPyhafCgoWy0rXSkoXFxkezJ9KSg6PyhcXGR7Mn0pKT8pKT8pPyk/KT8kLztcbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICAgIGxldCBtID0gSVNPX1JFLmV4ZWMoc3RyKTtcbiAgICBpZiAobSkge1xuICAgICAgICBsZXQgbWFya2VyID0gbmV3IERhdGUoRGF0ZS5VVEMoTnVtYmVyKG1bMV0pLCBtWzNdID8gTnVtYmVyKG1bM10pIC0gMSA6IDAsIE51bWJlcihtWzVdIHx8IDEpLCBOdW1iZXIobVs3XSB8fCAwKSwgTnVtYmVyKG1bOF0gfHwgMCksIE51bWJlcihtWzEwXSB8fCAwKSwgbVsxMl0gPyBOdW1iZXIoYDAuJHttWzEyXX1gKSAqIDEwMDAgOiAwKSk7XG4gICAgICAgIGlmIChpc1ZhbGlkRGF0ZShtYXJrZXIpKSB7XG4gICAgICAgICAgICBsZXQgdGltZVpvbmVPZmZzZXQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG1bMTNdKSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSAobVsxNV0gPT09ICctJyA/IC0xIDogMSkgKiAoTnVtYmVyKG1bMTZdIHx8IDApICogNjAgK1xuICAgICAgICAgICAgICAgICAgICBOdW1iZXIobVsxOF0gfHwgMCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIsXG4gICAgICAgICAgICAgICAgaXNUaW1lVW5zcGVjaWZpZWQ6ICFtWzZdLFxuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuY2xhc3MgRGF0ZUVudiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgbGV0IHRpbWVab25lID0gdGhpcy50aW1lWm9uZSA9IHNldHRpbmdzLnRpbWVab25lO1xuICAgICAgICBsZXQgaXNOYW1lZFRpbWVab25lID0gdGltZVpvbmUgIT09ICdsb2NhbCcgJiYgdGltZVpvbmUgIT09ICdVVEMnO1xuICAgICAgICBpZiAoc2V0dGluZ3MubmFtZWRUaW1lWm9uZUltcGwgJiYgaXNOYW1lZFRpbWVab25lKSB7XG4gICAgICAgICAgICB0aGlzLm5hbWVkVGltZVpvbmVJbXBsID0gbmV3IHNldHRpbmdzLm5hbWVkVGltZVpvbmVJbXBsKHRpbWVab25lKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbkNvbXB1dGVPZmZzZXQgPSBCb29sZWFuKCFpc05hbWVkVGltZVpvbmUgfHwgdGhpcy5uYW1lZFRpbWVab25lSW1wbCk7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0gPSBjcmVhdGVDYWxlbmRhclN5c3RlbShzZXR0aW5ncy5jYWxlbmRhclN5c3RlbSk7XG4gICAgICAgIHRoaXMubG9jYWxlID0gc2V0dGluZ3MubG9jYWxlO1xuICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5sb2NhbGUud2Vlay5kb3c7XG4gICAgICAgIHRoaXMud2Vla0RveSA9IHNldHRpbmdzLmxvY2FsZS53ZWVrLmRveTtcbiAgICAgICAgaWYgKHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ0lTTycpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla0RvdyA9IDE7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3kgPSA0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuZmlyc3REYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtEb3cgPSBzZXR0aW5ncy5maXJzdERheTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyRnVuYyA9IHNldHRpbmdzLndlZWtOdW1iZXJDYWxjdWxhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndlZWtUZXh0ID0gc2V0dGluZ3Mud2Vla1RleHQgIT0gbnVsbCA/IHNldHRpbmdzLndlZWtUZXh0IDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHQ7XG4gICAgICAgIHRoaXMud2Vla1RleHRMb25nID0gKHNldHRpbmdzLndlZWtUZXh0TG9uZyAhPSBudWxsID8gc2V0dGluZ3Mud2Vla1RleHRMb25nIDogc2V0dGluZ3MubG9jYWxlLm9wdGlvbnMud2Vla1RleHRMb25nKSB8fCB0aGlzLndlZWtUZXh0O1xuICAgICAgICB0aGlzLmNtZEZvcm1hdHRlciA9IHNldHRpbmdzLmNtZEZvcm1hdHRlcjtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2VwYXJhdG9yID0gc2V0dGluZ3MuZGVmYXVsdFNlcGFyYXRvcjtcbiAgICB9XG4gICAgLy8gQ3JlYXRpbmcgLyBQYXJzaW5nXG4gICAgY3JlYXRlTWFya2VyKGlucHV0KSB7XG4gICAgICAgIGxldCBtZXRhID0gdGhpcy5jcmVhdGVNYXJrZXJNZXRhKGlucHV0KTtcbiAgICAgICAgaWYgKG1ldGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXRhLm1hcmtlcjtcbiAgICB9XG4gICAgY3JlYXRlTm93TWFya2VyKCkge1xuICAgICAgICBpZiAodGhpcy5jYW5Db21wdXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aW1lc3RhbXBUb01hcmtlcihuZXcgRGF0ZSgpLnZhbHVlT2YoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgY2FuJ3QgY29tcHV0ZSB0aGUgY3VycmVudCBkYXRlIHZhbCBmb3IgYSB0aW1lem9uZSxcbiAgICAgICAgLy8gYmV0dGVyIHRvIGdpdmUgdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSB2YWxzIHRoYW4gVVRDXG4gICAgICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShkYXRlVG9Mb2NhbEFycmF5KG5ldyBEYXRlKCkpKTtcbiAgICB9XG4gICAgY3JlYXRlTWFya2VyTWV0YShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2UoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBtYXJrZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbWFya2VyID0gdGhpcy50aW1lc3RhbXBUb01hcmtlcihpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgbWFya2VyID0gdGhpcy50aW1lc3RhbXBUb01hcmtlcihpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIG1hcmtlciA9IGFycmF5VG9VdGNEYXRlKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFya2VyID09PSBudWxsIHx8ICFpc1ZhbGlkRGF0ZShtYXJrZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtYXJrZXIsIGlzVGltZVVuc3BlY2lmaWVkOiBmYWxzZSwgZm9yY2VkVHpvOiBudWxsIH07XG4gICAgfVxuICAgIHBhcnNlKHMpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gcGFyc2Uocyk7XG4gICAgICAgIGlmIChwYXJ0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgbWFya2VyIH0gPSBwYXJ0cztcbiAgICAgICAgbGV0IGZvcmNlZFR6byA9IG51bGw7XG4gICAgICAgIGlmIChwYXJ0cy50aW1lWm9uZU9mZnNldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuQ29tcHV0ZU9mZnNldCkge1xuICAgICAgICAgICAgICAgIG1hcmtlciA9IHRoaXMudGltZXN0YW1wVG9NYXJrZXIobWFya2VyLnZhbHVlT2YoKSAtIHBhcnRzLnRpbWVab25lT2Zmc2V0ICogNjAgKiAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcmNlZFR6byA9IHBhcnRzLnRpbWVab25lT2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1hcmtlciwgaXNUaW1lVW5zcGVjaWZpZWQ6IHBhcnRzLmlzVGltZVVuc3BlY2lmaWVkLCBmb3JjZWRUem8gfTtcbiAgICB9XG4gICAgLy8gQWNjZXNzb3JzXG4gICAgZ2V0WWVhcihtYXJrZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtYXJrZXIpO1xuICAgIH1cbiAgICBnZXRNb250aChtYXJrZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobWFya2VyKTtcbiAgICB9XG4gICAgZ2V0RGF5KG1hcmtlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobWFya2VyKTtcbiAgICB9XG4gICAgLy8gQWRkaW5nIC8gU3VidHJhY3RpbmdcbiAgICBhZGQobWFya2VyLCBkdXIpIHtcbiAgICAgICAgbGV0IGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVswXSArPSBkdXIueWVhcnM7XG4gICAgICAgIGFbMV0gKz0gZHVyLm1vbnRocztcbiAgICAgICAgYVsyXSArPSBkdXIuZGF5cztcbiAgICAgICAgYVs2XSArPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH1cbiAgICBzdWJ0cmFjdChtYXJrZXIsIGR1cikge1xuICAgICAgICBsZXQgYSA9IHRoaXMuY2FsZW5kYXJTeXN0ZW0ubWFya2VyVG9BcnJheShtYXJrZXIpO1xuICAgICAgICBhWzBdIC09IGR1ci55ZWFycztcbiAgICAgICAgYVsxXSAtPSBkdXIubW9udGhzO1xuICAgICAgICBhWzJdIC09IGR1ci5kYXlzO1xuICAgICAgICBhWzZdIC09IGR1ci5taWxsaXNlY29uZHM7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoYSk7XG4gICAgfVxuICAgIGFkZFllYXJzKG1hcmtlciwgbikge1xuICAgICAgICBsZXQgYSA9IHRoaXMuY2FsZW5kYXJTeXN0ZW0ubWFya2VyVG9BcnJheShtYXJrZXIpO1xuICAgICAgICBhWzBdICs9IG47XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoYSk7XG4gICAgfVxuICAgIGFkZE1vbnRocyhtYXJrZXIsIG4pIHtcbiAgICAgICAgbGV0IGEgPSB0aGlzLmNhbGVuZGFyU3lzdGVtLm1hcmtlclRvQXJyYXkobWFya2VyKTtcbiAgICAgICAgYVsxXSArPSBuO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKGEpO1xuICAgIH1cbiAgICAvLyBEaWZmaW5nIFdob2xlIFVuaXRzXG4gICAgZGlmZldob2xlWWVhcnMobTAsIG0xKSB7XG4gICAgICAgIGxldCB7IGNhbGVuZGFyU3lzdGVtIH0gPSB0aGlzO1xuICAgICAgICBpZiAodGltZUFzTXMobTApID09PSB0aW1lQXNNcyhtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMCkgPT09IGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSA9PT0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtMSkgLSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0wKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGlmZldob2xlTW9udGhzKG0wLCBtMSkge1xuICAgICAgICBsZXQgeyBjYWxlbmRhclN5c3RlbSB9ID0gdGhpcztcbiAgICAgICAgaWYgKHRpbWVBc01zKG0wKSA9PT0gdGltZUFzTXMobTEpICYmXG4gICAgICAgICAgICBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTApID09PSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJEYXkobTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0wKSkgK1xuICAgICAgICAgICAgICAgIChjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobTApKSAqIDEyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBSYW5nZSAvIER1cmF0aW9uXG4gICAgZ3JlYXRlc3RXaG9sZVVuaXQobTAsIG0xKSB7XG4gICAgICAgIGxldCBuID0gdGhpcy5kaWZmV2hvbGVZZWFycyhtMCwgbTEpO1xuICAgICAgICBpZiAobiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3llYXInLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSB0aGlzLmRpZmZXaG9sZU1vbnRocyhtMCwgbTEpO1xuICAgICAgICBpZiAobiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ21vbnRoJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gZGlmZldob2xlV2Vla3MobTAsIG0xKTtcbiAgICAgICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICd3ZWVrJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gZGlmZldob2xlRGF5cyhtMCwgbTEpO1xuICAgICAgICBpZiAobiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ2RheScsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IGRpZmZIb3VycyhtMCwgbTEpO1xuICAgICAgICBpZiAoaXNJbnQobikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdob3VyJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gZGlmZk1pbnV0ZXMobTAsIG0xKTtcbiAgICAgICAgaWYgKGlzSW50KG4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnbWludXRlJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gZGlmZlNlY29uZHMobTAsIG0xKTtcbiAgICAgICAgaWYgKGlzSW50KG4pKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnc2Vjb25kJywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB1bml0OiAnbWlsbGlzZWNvbmQnLCB2YWx1ZTogbTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpIH07XG4gICAgfVxuICAgIGNvdW50RHVyYXRpb25zQmV0d2VlbihtMCwgbTEsIGQpIHtcbiAgICAgICAgLy8gVE9ETzogY2FuIHVzZSBncmVhdGVzdFdob2xlVW5pdFxuICAgICAgICBsZXQgZGlmZjtcbiAgICAgICAgaWYgKGQueWVhcnMpIHtcbiAgICAgICAgICAgIGRpZmYgPSB0aGlzLmRpZmZXaG9sZVllYXJzKG0wLCBtMSk7XG4gICAgICAgICAgICBpZiAoZGlmZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmIC8gYXNSb3VnaFllYXJzKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkLm1vbnRocykge1xuICAgICAgICAgICAgZGlmZiA9IHRoaXMuZGlmZldob2xlTW9udGhzKG0wLCBtMSk7XG4gICAgICAgICAgICBpZiAoZGlmZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmIC8gYXNSb3VnaE1vbnRocyhkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5kYXlzKSB7XG4gICAgICAgICAgICBkaWZmID0gZGlmZldob2xlRGF5cyhtMCwgbTEpO1xuICAgICAgICAgICAgaWYgKGRpZmYgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlmZiAvIGFzUm91Z2hEYXlzKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvIGFzUm91Z2hNcyhkKTtcbiAgICB9XG4gICAgLy8gU3RhcnQtT2ZcbiAgICAvLyB0aGVzZSBET04nVCByZXR1cm4gem9uZWQtZGF0ZXMuIG9ubHkgVVRDIHN0YXJ0LW9mIGRhdGVzXG4gICAgc3RhcnRPZihtLCB1bml0KSB7XG4gICAgICAgIGlmICh1bml0ID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2ZZZWFyKG0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mTW9udGgobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICd3ZWVrJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZldlZWsobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdkYXknKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkRheShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ2hvdXInKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZkhvdXIobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdtaW51dGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhcnRPZk1pbnV0ZShtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ3NlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mU2Vjb25kKG0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGFydE9mWWVhcihtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoW1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0pLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgc3RhcnRPZk1vbnRoKG0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihbXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobSksXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlck1vbnRoKG0pLFxuICAgICAgICBdKTtcbiAgICB9XG4gICAgc3RhcnRPZldlZWsobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgICAgICBtLmdldFVUQ0RhdGUoKSAtICgobS5nZXRVVENEYXkoKSAtIHRoaXMud2Vla0RvdyArIDcpICUgNyksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvLyBXZWVrIE51bWJlclxuICAgIGNvbXB1dGVXZWVrTnVtYmVyKG1hcmtlcikge1xuICAgICAgICBpZiAodGhpcy53ZWVrTnVtYmVyRnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Vla051bWJlckZ1bmModGhpcy50b0RhdGUobWFya2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobWFya2VyLCB0aGlzLndlZWtEb3csIHRoaXMud2Vla0RveSk7XG4gICAgfVxuICAgIC8vIFRPRE86IGNob2tlIG9uIHRpbWVab25lTmFtZTogbG9uZ1xuICAgIGZvcm1hdChtYXJrZXIsIGZvcm1hdHRlciwgZGF0ZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdCh7XG4gICAgICAgICAgICBtYXJrZXIsXG4gICAgICAgICAgICB0aW1lWm9uZU9mZnNldDogZGF0ZU9wdGlvbnMuZm9yY2VkVHpvICE9IG51bGwgP1xuICAgICAgICAgICAgICAgIGRhdGVPcHRpb25zLmZvcmNlZFR6byA6XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRGb3JNYXJrZXIobWFya2VyKSxcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICAgIGZvcm1hdFJhbmdlKHN0YXJ0LCBlbmQsIGZvcm1hdHRlciwgZGF0ZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoZGF0ZU9wdGlvbnMuaXNFbmRFeGNsdXNpdmUpIHtcbiAgICAgICAgICAgIGVuZCA9IGFkZE1zKGVuZCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0UmFuZ2Uoe1xuICAgICAgICAgICAgbWFya2VyOiBzdGFydCxcbiAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0OiBkYXRlT3B0aW9ucy5mb3JjZWRTdGFydFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRTdGFydFR6byA6XG4gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRGb3JNYXJrZXIoc3RhcnQpLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgICBtYXJrZXI6IGVuZCxcbiAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0OiBkYXRlT3B0aW9ucy5mb3JjZWRFbmRUem8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZGF0ZU9wdGlvbnMuZm9yY2VkRW5kVHpvIDpcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEZvck1hcmtlcihlbmQpLFxuICAgICAgICB9LCB0aGlzLCBkYXRlT3B0aW9ucy5kZWZhdWx0U2VwYXJhdG9yKTtcbiAgICB9XG4gICAgLypcbiAgICBEVU1COiB0aGUgb21pdFRpbWUgYXJnIGlzIGR1bWIuIGlmIHdlIG9taXQgdGhlIHRpbWUsIHdlIHdhbnQgdG8gb21pdCB0aGUgdGltZXpvbmUgb2Zmc2V0LiBhbmQgaWYgd2UgZG8gdGhhdCxcbiAgICBtaWdodCBhcyB3ZWxsIHVzZSBidWlsZElzb1N0cmluZyBvciBzb21lIG90aGVyIHV0aWwgZGlyZWN0bHlcbiAgICAqL1xuICAgIGZvcm1hdElzbyhtYXJrZXIsIGV4dHJhT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCB0aW1lWm9uZU9mZnNldCA9IG51bGw7XG4gICAgICAgIGlmICghZXh0cmFPcHRpb25zLm9taXRUaW1lWm9uZU9mZnNldCkge1xuICAgICAgICAgICAgaWYgKGV4dHJhT3B0aW9ucy5mb3JjZWRUem8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0ID0gZXh0cmFPcHRpb25zLmZvcmNlZFR6bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0ID0gdGhpcy5vZmZzZXRGb3JNYXJrZXIobWFya2VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnVpbGRJc29TdHJpbmcobWFya2VyLCB0aW1lWm9uZU9mZnNldCwgZXh0cmFPcHRpb25zLm9taXRUaW1lKTtcbiAgICB9XG4gICAgLy8gVGltZVpvbmVcbiAgICB0aW1lc3RhbXBUb01hcmtlcihtcykge1xuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGRhdGVUb0xvY2FsQXJyYXkobmV3IERhdGUobXMpKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnIHx8ICF0aGlzLm5hbWVkVGltZVpvbmVJbXBsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZSh0aGlzLm5hbWVkVGltZVpvbmVJbXBsLnRpbWVzdGFtcFRvQXJyYXkobXMpKTtcbiAgICB9XG4gICAgb2Zmc2V0Rm9yTWFya2VyKG0pIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiAtYXJyYXlUb0xvY2FsRGF0ZShkYXRlVG9VdGNBcnJheShtKSkuZ2V0VGltZXpvbmVPZmZzZXQoKTsgLy8gY29udmVydCBcImludmVyc2VcIiBvZmZzZXQgdG8gXCJub3JtYWxcIiBvZmZzZXRcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ1VUQycpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm5hbWVkVGltZVpvbmVJbXBsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lZFRpbWVab25lSW1wbC5vZmZzZXRGb3JBcnJheShkYXRlVG9VdGNBcnJheShtKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIENvbnZlcnNpb25cbiAgICB0b0RhdGUobSwgZm9yY2VkVHpvKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVab25lID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlUb0xvY2FsRGF0ZShkYXRlVG9VdGNBcnJheShtKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdVVEMnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobS52YWx1ZU9mKCkpOyAvLyBtYWtlIHN1cmUgaXQncyBhIGNvcHlcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMubmFtZWRUaW1lWm9uZUltcGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtLnZhbHVlT2YoKSAtIChmb3JjZWRUem8gfHwgMCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtLnZhbHVlT2YoKSAtXG4gICAgICAgICAgICB0aGlzLm5hbWVkVGltZVpvbmVJbXBsLm9mZnNldEZvckFycmF5KGRhdGVUb1V0Y0FycmF5KG0pKSAqIDEwMDAgKiA2MCk7XG4gICAgfVxufVxuXG5jbGFzcyBOYW1lZFRpbWVab25lSW1wbCB7XG4gICAgY29uc3RydWN0b3IodGltZVpvbmVOYW1lKSB7XG4gICAgICAgIHRoaXMudGltZVpvbmVOYW1lID0gdGltZVpvbmVOYW1lO1xuICAgIH1cbn1cblxuY2xhc3MgU2VnSGllcmFyY2h5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gc2V0dGluZ3NcbiAgICAgICAgdGhpcy5zdHJpY3RPcmRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFsbG93UmVzbGljaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4Q29vcmQgPSAtMTsgLy8gLTEgbWVhbnMgbm8gbWF4XG4gICAgICAgIHRoaXMubWF4U3RhY2tDbnQgPSAtMTsgLy8gLTEgbWVhbnMgbm8gbWF4XG4gICAgICAgIHRoaXMubGV2ZWxDb29yZHMgPSBbXTsgLy8gb3JkZXJlZFxuICAgICAgICB0aGlzLmVudHJpZXNCeUxldmVsID0gW107IC8vIHBhcmFsbGVsIHdpdGggbGV2ZWxDb29yZHNcbiAgICAgICAgdGhpcy5zdGFja0NudHMgPSB7fTsgLy8gVE9ETzogdXNlIGJldHRlciB0ZWNobmlxdWUhP1xuICAgIH1cbiAgICBhZGRTZWdzKGlucHV0cykge1xuICAgICAgICBsZXQgaGlkZGVuRW50cmllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbnB1dCBvZiBpbnB1dHMpIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0RW50cnkoaW5wdXQsIGhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW5FbnRyaWVzO1xuICAgIH1cbiAgICBpbnNlcnRFbnRyeShlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICBsZXQgaW5zZXJ0aW9uID0gdGhpcy5maW5kSW5zZXJ0aW9uKGVudHJ5KTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbnNlcnRpb25WYWxpZChpbnNlcnRpb24sIGVudHJ5KSkge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRFbnRyeUF0KGVudHJ5LCBpbnNlcnRpb24pO1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW52YWxpZEluc2VydGlvbihpbnNlcnRpb24sIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICB9XG4gICAgaXNJbnNlcnRpb25WYWxpZChpbnNlcnRpb24sIGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAodGhpcy5tYXhDb29yZCA9PT0gLTEgfHwgaW5zZXJ0aW9uLmxldmVsQ29vcmQgKyBlbnRyeS50aGlja25lc3MgPD0gdGhpcy5tYXhDb29yZCkgJiZcbiAgICAgICAgICAgICh0aGlzLm1heFN0YWNrQ250ID09PSAtMSB8fCBpbnNlcnRpb24uc3RhY2tDbnQgPCB0aGlzLm1heFN0YWNrQ250KTtcbiAgICB9XG4gICAgLy8gcmV0dXJucyBudW1iZXIgb2YgbmV3IGVudHJpZXMgaW5zZXJ0ZWRcbiAgICBoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uKGluc2VydGlvbiwgZW50cnksIGhpZGRlbkVudHJpZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dSZXNsaWNpbmcgJiYgaW5zZXJ0aW9uLnRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGl0RW50cnkoZW50cnksIGluc2VydGlvbi50b3VjaGluZ0VudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgc3BsaXRFbnRyeShlbnRyeSwgYmFycmllciwgaGlkZGVuRW50cmllcykge1xuICAgICAgICBsZXQgcGFydENudCA9IDA7XG4gICAgICAgIGxldCBzcGxpdEhpZGRlbkVudHJpZXMgPSBbXTtcbiAgICAgICAgbGV0IGVudHJ5U3BhbiA9IGVudHJ5LnNwYW47XG4gICAgICAgIGxldCBiYXJyaWVyU3BhbiA9IGJhcnJpZXIuc3BhbjtcbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5zdGFydCA8IGJhcnJpZXJTcGFuLnN0YXJ0KSB7XG4gICAgICAgICAgICBwYXJ0Q250ICs9IHRoaXMuaW5zZXJ0RW50cnkoe1xuICAgICAgICAgICAgICAgIGluZGV4OiBlbnRyeS5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGVudHJ5LnRoaWNrbmVzcyxcbiAgICAgICAgICAgICAgICBzcGFuOiB7IHN0YXJ0OiBlbnRyeVNwYW4uc3RhcnQsIGVuZDogYmFycmllclNwYW4uc3RhcnQgfSxcbiAgICAgICAgICAgIH0sIHNwbGl0SGlkZGVuRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5U3Bhbi5lbmQgPiBiYXJyaWVyU3Bhbi5lbmQpIHtcbiAgICAgICAgICAgIHBhcnRDbnQgKz0gdGhpcy5pbnNlcnRFbnRyeSh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVudHJ5LmluZGV4LFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgIHNwYW46IHsgc3RhcnQ6IGJhcnJpZXJTcGFuLmVuZCwgZW5kOiBlbnRyeVNwYW4uZW5kIH0sXG4gICAgICAgICAgICB9LCBzcGxpdEhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0Q250KSB7XG4gICAgICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGluZGV4OiBlbnRyeS5pbmRleCxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGVudHJ5LnRoaWNrbmVzcyxcbiAgICAgICAgICAgICAgICBzcGFuOiBpbnRlcnNlY3RTcGFucyhiYXJyaWVyU3BhbiwgZW50cnlTcGFuKSwgLy8gZ3VhcmFudGVlZCB0byBpbnRlcnNlY3RcbiAgICAgICAgICAgIH0sIC4uLnNwbGl0SGlkZGVuRW50cmllcyk7XG4gICAgICAgICAgICByZXR1cm4gcGFydENudDtcbiAgICAgICAgfVxuICAgICAgICBoaWRkZW5FbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaW5zZXJ0RW50cnlBdChlbnRyeSwgaW5zZXJ0aW9uKSB7XG4gICAgICAgIGxldCB7IGVudHJpZXNCeUxldmVsLCBsZXZlbENvb3JkcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKGluc2VydGlvbi5sYXRlcmFsID09PSAtMSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGxldmVsXG4gICAgICAgICAgICBpbnNlcnRBdChsZXZlbENvb3JkcywgaW5zZXJ0aW9uLmxldmVsLCBpbnNlcnRpb24ubGV2ZWxDb29yZCk7XG4gICAgICAgICAgICBpbnNlcnRBdChlbnRyaWVzQnlMZXZlbCwgaW5zZXJ0aW9uLmxldmVsLCBbZW50cnldKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGluc2VydCBpbnRvIGV4aXN0aW5nIGxldmVsXG4gICAgICAgICAgICBpbnNlcnRBdChlbnRyaWVzQnlMZXZlbFtpbnNlcnRpb24ubGV2ZWxdLCBpbnNlcnRpb24ubGF0ZXJhbCwgZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhY2tDbnRzW2J1aWxkRW50cnlLZXkoZW50cnkpXSA9IGluc2VydGlvbi5zdGFja0NudDtcbiAgICB9XG4gICAgZmluZEluc2VydGlvbihuZXdFbnRyeSkge1xuICAgICAgICBsZXQgeyBsZXZlbENvb3JkcywgZW50cmllc0J5TGV2ZWwsIHN0cmljdE9yZGVyLCBzdGFja0NudHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBsZXZlbENudCA9IGxldmVsQ29vcmRzLmxlbmd0aDtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZUNvb3JkID0gMDtcbiAgICAgICAgbGV0IHRvdWNoaW5nTGV2ZWwgPSAtMTtcbiAgICAgICAgbGV0IHRvdWNoaW5nTGF0ZXJhbCA9IC0xO1xuICAgICAgICBsZXQgdG91Y2hpbmdFbnRyeSA9IG51bGw7XG4gICAgICAgIGxldCBzdGFja0NudCA9IDA7XG4gICAgICAgIGZvciAobGV0IHRyYWNraW5nTGV2ZWwgPSAwOyB0cmFja2luZ0xldmVsIDwgbGV2ZWxDbnQ7IHRyYWNraW5nTGV2ZWwgKz0gMSkge1xuICAgICAgICAgICAgbGV0IHRyYWNraW5nQ29vcmQgPSBsZXZlbENvb3Jkc1t0cmFja2luZ0xldmVsXTtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IGxldmVsIGlzIHBhc3QgdGhlIHBsYWNlZCBlbnRyeSwgd2UgaGF2ZSBmb3VuZCBhIGdvb2QgZW1wdHkgc3BhY2UgYW5kIGNhbiBzdG9wLlxuICAgICAgICAgICAgLy8gaWYgc3RyaWN0T3JkZXIsIGtlZXAgZmluZGluZyBtb3JlIGxhdGVyYWwgaW50ZXJzZWN0aW9ucy5cbiAgICAgICAgICAgIGlmICghc3RyaWN0T3JkZXIgJiYgdHJhY2tpbmdDb29yZCA+PSBjYW5kaWRhdGVDb29yZCArIG5ld0VudHJ5LnRoaWNrbmVzcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHRyYWNraW5nRW50cmllcyA9IGVudHJpZXNCeUxldmVsW3RyYWNraW5nTGV2ZWxdO1xuICAgICAgICAgICAgbGV0IHRyYWNraW5nRW50cnk7XG4gICAgICAgICAgICBsZXQgc2VhcmNoUmVzID0gYmluYXJ5U2VhcmNoKHRyYWNraW5nRW50cmllcywgbmV3RW50cnkuc3Bhbi5zdGFydCwgZ2V0RW50cnlTcGFuRW5kKTsgLy8gZmluZCBmaXJzdCBlbnRyeSBhZnRlciBuZXdFbnRyeSdzIGVuZFxuICAgICAgICAgICAgbGV0IGxhdGVyYWxJbmRleCA9IHNlYXJjaFJlc1swXSArIHNlYXJjaFJlc1sxXTsgLy8gaWYgZXhhY3QgbWF0Y2ggKHdoaWNoIGRvZXNuJ3QgY29sbGlkZSksIGdvIHRvIG5leHQgb25lXG4gICAgICAgICAgICB3aGlsZSAoIC8vIGxvb3AgdGhyb3VnaCBlbnRyaWVzIHRoYXQgaG9yaXpvbnRhbGx5IGludGVyc2VjdFxuICAgICAgICAgICAgKHRyYWNraW5nRW50cnkgPSB0cmFja2luZ0VudHJpZXNbbGF0ZXJhbEluZGV4XSkgJiYgLy8gYnV0IG5vdCBwYXN0IHRoZSB3aG9sZSBlbnRyeSBsaXN0XG4gICAgICAgICAgICAgICAgdHJhY2tpbmdFbnRyeS5zcGFuLnN0YXJ0IDwgbmV3RW50cnkuc3Bhbi5lbmQgLy8gYW5kIG5vdCBlbnRpcmVseSBwYXN0IG5ld0VudHJ5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgdHJhY2tpbmdFbnRyeUJvdHRvbSA9IHRyYWNraW5nQ29vcmQgKyB0cmFja2luZ0VudHJ5LnRoaWNrbmVzcztcbiAgICAgICAgICAgICAgICAvLyBpbnRlcnNlY3RzIGludG8gdGhlIHRvcCBvZiB0aGUgY2FuZGlkYXRlP1xuICAgICAgICAgICAgICAgIGlmICh0cmFja2luZ0VudHJ5Qm90dG9tID4gY2FuZGlkYXRlQ29vcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlQ29vcmQgPSB0cmFja2luZ0VudHJ5Qm90dG9tO1xuICAgICAgICAgICAgICAgICAgICB0b3VjaGluZ0VudHJ5ID0gdHJhY2tpbmdFbnRyeTtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hpbmdMZXZlbCA9IHRyYWNraW5nTGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRvdWNoaW5nTGF0ZXJhbCA9IGxhdGVyYWxJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gYnV0dHMgdXAgYWdhaW5zdCB0b3Agb2YgY2FuZGlkYXRlPyAod2lsbCBoYXBwZW4gaWYganVzdCBpbnRlcnNlY3RlZCBhcyB3ZWxsKVxuICAgICAgICAgICAgICAgIGlmICh0cmFja2luZ0VudHJ5Qm90dG9tID09PSBjYW5kaWRhdGVDb29yZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YWNrQ250IG9mIHRoZSB0cmFja2luZ0VudHJpZXMgdGhhdCBidXR0IHVwXG4gICAgICAgICAgICAgICAgICAgIHN0YWNrQ250ID0gTWF0aC5tYXgoc3RhY2tDbnQsIHN0YWNrQ250c1tidWlsZEVudHJ5S2V5KHRyYWNraW5nRW50cnkpXSArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXRlcmFsSW5kZXggKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGUgZGVzdGluYXRpb24gbGV2ZWwgd2lsbCBiZSBhZnRlciB0b3VjaGluZ0VudHJ5J3MgbGV2ZWwuIGZpbmQgaXRcbiAgICAgICAgbGV0IGRlc3RMZXZlbCA9IDA7XG4gICAgICAgIGlmICh0b3VjaGluZ0VudHJ5KSB7XG4gICAgICAgICAgICBkZXN0TGV2ZWwgPSB0b3VjaGluZ0xldmVsICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChkZXN0TGV2ZWwgPCBsZXZlbENudCAmJiBsZXZlbENvb3Jkc1tkZXN0TGV2ZWxdIDwgY2FuZGlkYXRlQ29vcmQpIHtcbiAgICAgICAgICAgICAgICBkZXN0TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiBhZGRpbmcgdG8gYW4gZXhpc3RpbmcgbGV2ZWwsIGZpbmQgd2hlcmUgdG8gaW5zZXJ0XG4gICAgICAgIGxldCBkZXN0TGF0ZXJhbCA9IC0xO1xuICAgICAgICBpZiAoZGVzdExldmVsIDwgbGV2ZWxDbnQgJiYgbGV2ZWxDb29yZHNbZGVzdExldmVsXSA9PT0gY2FuZGlkYXRlQ29vcmQpIHtcbiAgICAgICAgICAgIGRlc3RMYXRlcmFsID0gYmluYXJ5U2VhcmNoKGVudHJpZXNCeUxldmVsW2Rlc3RMZXZlbF0sIG5ld0VudHJ5LnNwYW4uZW5kLCBnZXRFbnRyeVNwYW5FbmQpWzBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3VjaGluZ0xldmVsLFxuICAgICAgICAgICAgdG91Y2hpbmdMYXRlcmFsLFxuICAgICAgICAgICAgdG91Y2hpbmdFbnRyeSxcbiAgICAgICAgICAgIHN0YWNrQ250LFxuICAgICAgICAgICAgbGV2ZWxDb29yZDogY2FuZGlkYXRlQ29vcmQsXG4gICAgICAgICAgICBsZXZlbDogZGVzdExldmVsLFxuICAgICAgICAgICAgbGF0ZXJhbDogZGVzdExhdGVyYWwsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIHNvcnRlZCBieSBsZXZlbENvb3JkIChsb3dlc3QgdG8gaGlnaGVzdClcbiAgICB0b1JlY3RzKCkge1xuICAgICAgICBsZXQgeyBlbnRyaWVzQnlMZXZlbCwgbGV2ZWxDb29yZHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBsZXZlbENudCA9IGVudHJpZXNCeUxldmVsLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlY3RzID0gW107XG4gICAgICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCBsZXZlbENudDsgbGV2ZWwgKz0gMSkge1xuICAgICAgICAgICAgbGV0IGVudHJpZXMgPSBlbnRyaWVzQnlMZXZlbFtsZXZlbF07XG4gICAgICAgICAgICBsZXQgbGV2ZWxDb29yZCA9IGxldmVsQ29vcmRzW2xldmVsXTtcbiAgICAgICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgICAgICByZWN0cy5wdXNoKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZW50cnkpLCB7IGxldmVsQ29vcmQgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWN0cztcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRFbnRyeVNwYW5FbmQoZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkuc3Bhbi5lbmQ7XG59XG5mdW5jdGlvbiBidWlsZEVudHJ5S2V5KGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5LmluZGV4ICsgJzonICsgZW50cnkuc3Bhbi5zdGFydDtcbn1cbi8vIHJldHVybnMgZ3JvdXBzIHdpdGggZW50cmllcyBzb3J0ZWQgYnkgaW5wdXQgb3JkZXJcbmZ1bmN0aW9uIGdyb3VwSW50ZXJzZWN0aW5nRW50cmllcyhlbnRyaWVzKSB7XG4gICAgbGV0IG1lcmdlcyA9IFtdO1xuICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkTWVyZ2VzID0gW107XG4gICAgICAgIGxldCBodW5ncnlNZXJnZSA9IHtcbiAgICAgICAgICAgIHNwYW46IGVudHJ5LnNwYW4sXG4gICAgICAgICAgICBlbnRyaWVzOiBbZW50cnldLFxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGxldCBtZXJnZSBvZiBtZXJnZXMpIHtcbiAgICAgICAgICAgIGlmIChpbnRlcnNlY3RTcGFucyhtZXJnZS5zcGFuLCBodW5ncnlNZXJnZS5zcGFuKSkge1xuICAgICAgICAgICAgICAgIGh1bmdyeU1lcmdlID0ge1xuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiBtZXJnZS5lbnRyaWVzLmNvbmNhdChodW5ncnlNZXJnZS5lbnRyaWVzKSxcbiAgICAgICAgICAgICAgICAgICAgc3Bhbjogam9pblNwYW5zKG1lcmdlLnNwYW4sIGh1bmdyeU1lcmdlLnNwYW4pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZE1lcmdlcy5wdXNoKG1lcmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaWx0ZXJlZE1lcmdlcy5wdXNoKGh1bmdyeU1lcmdlKTtcbiAgICAgICAgbWVyZ2VzID0gZmlsdGVyZWRNZXJnZXM7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZXM7XG59XG5mdW5jdGlvbiBqb2luU3BhbnMoc3BhbjAsIHNwYW4xKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IE1hdGgubWluKHNwYW4wLnN0YXJ0LCBzcGFuMS5zdGFydCksXG4gICAgICAgIGVuZDogTWF0aC5tYXgoc3BhbjAuZW5kLCBzcGFuMS5lbmQpLFxuICAgIH07XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RTcGFucyhzcGFuMCwgc3BhbjEpIHtcbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChzcGFuMC5zdGFydCwgc3BhbjEuc3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihzcGFuMC5lbmQsIHNwYW4xLmVuZCk7XG4gICAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vLyBnZW5lcmFsIHV0aWxcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaW5zZXJ0QXQoYXJyLCBpbmRleCwgaXRlbSkge1xuICAgIGFyci5zcGxpY2UoaW5kZXgsIDAsIGl0ZW0pO1xufVxuZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGEsIHNlYXJjaFZhbCwgZ2V0SXRlbVZhbCkge1xuICAgIGxldCBzdGFydEluZGV4ID0gMDtcbiAgICBsZXQgZW5kSW5kZXggPSBhLmxlbmd0aDsgLy8gZXhjbHVzaXZlXG4gICAgaWYgKCFlbmRJbmRleCB8fCBzZWFyY2hWYWwgPCBnZXRJdGVtVmFsKGFbc3RhcnRJbmRleF0pKSB7IC8vIG5vIGl0ZW1zIE9SIGJlZm9yZSBmaXJzdCBpdGVtXG4gICAgICAgIHJldHVybiBbMCwgMF07XG4gICAgfVxuICAgIGlmIChzZWFyY2hWYWwgPiBnZXRJdGVtVmFsKGFbZW5kSW5kZXggLSAxXSkpIHsgLy8gYWZ0ZXIgbGFzdCBpdGVtXG4gICAgICAgIHJldHVybiBbZW5kSW5kZXgsIDBdO1xuICAgIH1cbiAgICB3aGlsZSAoc3RhcnRJbmRleCA8IGVuZEluZGV4KSB7XG4gICAgICAgIGxldCBtaWRkbGVJbmRleCA9IE1hdGguZmxvb3Ioc3RhcnRJbmRleCArIChlbmRJbmRleCAtIHN0YXJ0SW5kZXgpIC8gMik7XG4gICAgICAgIGxldCBtaWRkbGVWYWwgPSBnZXRJdGVtVmFsKGFbbWlkZGxlSW5kZXhdKTtcbiAgICAgICAgaWYgKHNlYXJjaFZhbCA8IG1pZGRsZVZhbCkge1xuICAgICAgICAgICAgZW5kSW5kZXggPSBtaWRkbGVJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzZWFyY2hWYWwgPiBtaWRkbGVWYWwpIHtcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBtaWRkbGVJbmRleCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7IC8vIGVxdWFsIVxuICAgICAgICAgICAgcmV0dXJuIFttaWRkbGVJbmRleCwgMV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtzdGFydEluZGV4LCAwXTtcbn1cblxuY2xhc3MgSW50ZXJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50ID0gc2V0dGluZ3MuY29tcG9uZW50O1xuICAgICAgICB0aGlzLmlzSGl0Q29tYm9BbGxvd2VkID0gc2V0dGluZ3MuaXNIaXRDb21ib0FsbG93ZWQgfHwgbnVsbDtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUludGVyYWN0aW9uU2V0dGluZ3MoY29tcG9uZW50LCBpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgZWw6IGlucHV0LmVsLFxuICAgICAgICB1c2VFdmVudENlbnRlcjogaW5wdXQudXNlRXZlbnRDZW50ZXIgIT0gbnVsbCA/IGlucHV0LnVzZUV2ZW50Q2VudGVyIDogdHJ1ZSxcbiAgICAgICAgaXNIaXRDb21ib0FsbG93ZWQ6IGlucHV0LmlzSGl0Q29tYm9BbGxvd2VkIHx8IG51bGwsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgW3NldHRpbmdzLmNvbXBvbmVudC51aWRdOiBzZXR0aW5ncyxcbiAgICB9O1xufVxuLy8gZ2xvYmFsIHN0YXRlXG5jb25zdCBpbnRlcmFjdGlvblNldHRpbmdzU3RvcmUgPSB7fTtcblxuLypcbkFuIGFic3RyYWN0aW9uIGZvciBhIGRyYWdnaW5nIGludGVyYWN0aW9uIG9yaWdpbmF0aW5nIG9uIGFuIGV2ZW50LlxuRG9lcyBoaWdoZXItbGV2ZWwgdGhpbmdzIHRoYW4gUG9pbnRlckRyYWdnZXIsIHN1Y2ggYXMgcG9zc2libHk6XG4tIGEgXCJtaXJyb3JcIiB0aGF0IG1vdmVzIHdpdGggdGhlIHBvaW50ZXJcbi0gYSBtaW5pbXVtIG51bWJlciBvZiBwaXhlbHMgb3Igb3RoZXIgY3JpdGVyaWEgZm9yIGEgdHJ1ZSBkcmFnIHRvIGJlZ2luXG5cbnN1YmNsYXNzZXMgbXVzdCBlbWl0OlxuLSBwb2ludGVyZG93blxuLSBkcmFnc3RhcnRcbi0gZHJhZ21vdmVcbi0gcG9pbnRlcnVwXG4tIGRyYWdlbmRcbiovXG5jbGFzcyBFbGVtZW50RHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGVsLCBzZWxlY3Rvcikge1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgRW1pdHRlcigpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgIH1cbiAgICBzZXRNaXJyb3JJc1Zpc2libGUoYm9vbCkge1xuICAgICAgICAvLyBvcHRpb25hbCBpZiBzdWJjbGFzcyBkb2Vzbid0IHdhbnQgdG8gc3VwcG9ydCBhIG1pcnJvclxuICAgIH1cbiAgICBzZXRNaXJyb3JOZWVkc1JldmVydChib29sKSB7XG4gICAgICAgIC8vIG9wdGlvbmFsIGlmIHN1YmNsYXNzIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IGEgbWlycm9yXG4gICAgfVxuICAgIHNldEF1dG9TY3JvbGxFbmFibGVkKGJvb2wpIHtcbiAgICAgICAgLy8gb3B0aW9uYWxcbiAgICB9XG59XG5cbi8vIFRPRE86IGdldCByaWQgb2YgdGhpcyBpbiBmYXZvciBvZiBvcHRpb25zIHN5c3RlbSxcbi8vIHRobyBpdCdzIHJlYWxseSBlYXN5IHRvIGFjY2VzcyB0aGlzIGdsb2JhbGx5IHJhdGhlciB0aGFuIHBhc3MgdGhydSBvcHRpb25zLlxuY29uc3QgY29uZmlnID0ge307XG5cbi8qXG5JbmZvcm1hdGlvbiBhYm91dCB3aGF0IHdpbGwgaGFwcGVuIHdoZW4gYW4gZXh0ZXJuYWwgZWxlbWVudCBpcyBkcmFnZ2VkLWFuZC1kcm9wcGVkXG5vbnRvIGEgY2FsZW5kYXIuIENvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjcmVhdGluZyBhbiBldmVudC5cbiovXG5jb25zdCBEUkFHX01FVEFfUkVGSU5FUlMgPSB7XG4gICAgc3RhcnRUaW1lOiBjcmVhdGVEdXJhdGlvbixcbiAgICBkdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgY3JlYXRlOiBCb29sZWFuLFxuICAgIHNvdXJjZUlkOiBTdHJpbmcsXG59O1xuZnVuY3Rpb24gcGFyc2VEcmFnTWV0YShyYXcpIHtcbiAgICBsZXQgeyByZWZpbmVkLCBleHRyYSB9ID0gcmVmaW5lUHJvcHMocmF3LCBEUkFHX01FVEFfUkVGSU5FUlMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0VGltZTogcmVmaW5lZC5zdGFydFRpbWUgfHwgbnVsbCxcbiAgICAgICAgZHVyYXRpb246IHJlZmluZWQuZHVyYXRpb24gfHwgbnVsbCxcbiAgICAgICAgY3JlYXRlOiByZWZpbmVkLmNyZWF0ZSAhPSBudWxsID8gcmVmaW5lZC5jcmVhdGUgOiB0cnVlLFxuICAgICAgICBzb3VyY2VJZDogcmVmaW5lZC5zb3VyY2VJZCxcbiAgICAgICAgbGVmdG92ZXJQcm9wczogZXh0cmEsXG4gICAgfTtcbn1cblxuY2xhc3MgQ2FsZW5kYXJSb290IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBmb3JQcmludDogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZm9yUHJpbnQ6IHRydWUgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlQWZ0ZXJQcmludCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb3JQcmludDogZmFsc2UgfSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IHByb3BzO1xuICAgICAgICBsZXQgeyBmb3JQcmludCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgbGV0IGlzSGVpZ2h0QXV0byA9IGZvclByaW50IHx8IG9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0bycgfHwgb3B0aW9ucy5jb250ZW50SGVpZ2h0ID09PSAnYXV0byc7XG4gICAgICAgIGxldCBoZWlnaHQgPSAoIWlzSGVpZ2h0QXV0byAmJiBvcHRpb25zLmhlaWdodCAhPSBudWxsKSA/IG9wdGlvbnMuaGVpZ2h0IDogJyc7XG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjJyxcbiAgICAgICAgICAgIGZvclByaW50ID8gJ2ZjLW1lZGlhLXByaW50JyA6ICdmYy1tZWRpYS1zY3JlZW4nLFxuICAgICAgICAgICAgYGZjLWRpcmVjdGlvbi0ke29wdGlvbnMuZGlyZWN0aW9ufWAsXG4gICAgICAgICAgICBwcm9wcy50aGVtZS5nZXRDbGFzcygncm9vdCcpLFxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWdldENhblZHcm93V2l0aGluQ2VsbCgpKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWxpcXVpZC1oYWNrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BzLmNoaWxkcmVuKGNsYXNzTmFtZXMsIGhlaWdodCwgaXNIZWlnaHRBdXRvLCBmb3JQcmludCk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBsZXQgeyBlbWl0dGVyIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBlbWl0dGVyLm9uKCdfYmVmb3JlcHJpbnQnLCB0aGlzLmhhbmRsZUJlZm9yZVByaW50KTtcbiAgICAgICAgZW1pdHRlci5vbignX2FmdGVycHJpbnQnLCB0aGlzLmhhbmRsZUFmdGVyUHJpbnQpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgbGV0IHsgZW1pdHRlciB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgZW1pdHRlci5vZmYoJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9mZignX2FmdGVycHJpbnQnLCB0aGlzLmhhbmRsZUFmdGVyUHJpbnQpO1xuICAgIH1cbn1cblxuLy8gQ29tcHV0ZXMgYSBkZWZhdWx0IGNvbHVtbiBoZWFkZXIgZm9ybWF0dGluZyBzdHJpbmcgaWYgYGNvbEZvcm1hdGAgaXMgbm90IGV4cGxpY2l0bHkgZGVmaW5lZFxuZnVuY3Rpb24gY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0KGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXlDbnQpIHtcbiAgICAvLyBpZiBtb3JlIHRoYW4gb25lIHdlZWsgcm93LCBvciBpZiB0aGVyZSBhcmUgYSBsb3Qgb2YgY29sdW1ucyB3aXRoIG5vdCBtdWNoIHNwYWNlLFxuICAgIC8vIHB1dCBqdXN0IHRoZSBkYXkgbnVtYmVycyB3aWxsIGJlIGluIGVhY2ggY2VsbFxuICAgIGlmICghZGF0ZXNSZXBEaXN0aW5jdERheXMgfHwgZGF5Q250ID4gMTApIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdzaG9ydCcgfSk7IC8vIFwiU2F0XCJcbiAgICB9XG4gICAgaWYgKGRheUNudCA+IDEpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdzaG9ydCcsIG1vbnRoOiAnbnVtZXJpYycsIGRheTogJ251bWVyaWMnLCBvbWl0Q29tbWFzOiB0cnVlIH0pOyAvLyBcIlNhdCAxMS8xMlwiXG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrZGF5OiAnbG9uZycgfSk7IC8vIFwiU2F0dXJkYXlcIlxufVxuXG5jb25zdCBDTEFTU19OQU1FID0gJ2ZjLWNvbC1oZWFkZXItY2VsbCc7IC8vIGRvIHRoZSBjdXNoaW9uIHRvbz8gbm9cbmZ1bmN0aW9uIHJlbmRlcklubmVyJDEocmVuZGVyUHJvcHMpIHtcbiAgICByZXR1cm4gcmVuZGVyUHJvcHMudGV4dDtcbn1cblxuY2xhc3MgQ29udGVudEluamVjdG9yIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuaWQgPSBndWlkKCk7XG4gICAgICAgIHRoaXMucXVldWVkRG9tTm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50RG9tTm9kZXMgPSBbXTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbCA9IChlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZWxSZWYpIHtcbiAgICAgICAgICAgICAgICBzZXRSZWYodGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICAgICAgY29uc3QgeyBjdXN0b21HZW5lcmF0b3IsIGRlZmF1bHRHZW5lcmF0b3IsIHJlbmRlclByb3BzIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgYXR0cnMgPSBidWlsZEVsQXR0cnMocHJvcHMpO1xuICAgICAgICBsZXQgdXNlRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5uZXJDb250ZW50O1xuICAgICAgICBsZXQgcXVldWVkRG9tTm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnRHZW5lcmF0b3JNZXRhO1xuICAgICAgICBpZiAoY3VzdG9tR2VuZXJhdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUdlbmVyYXRvclJlcyA9IHR5cGVvZiBjdXN0b21HZW5lcmF0b3IgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgICAgIGN1c3RvbUdlbmVyYXRvcihyZW5kZXJQcm9wcywgcHJlYWN0LmNyZWF0ZUVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICBjdXN0b21HZW5lcmF0b3I7XG4gICAgICAgICAgICBpZiAoY3VzdG9tR2VuZXJhdG9yUmVzID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdXNlRGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc09iamVjdCA9IGN1c3RvbUdlbmVyYXRvclJlcyAmJiB0eXBlb2YgY3VzdG9tR2VuZXJhdG9yUmVzID09PSAnb2JqZWN0JzsgLy8gbm9uLW51bGxcbiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QgJiYgKCdodG1sJyBpbiBjdXN0b21HZW5lcmF0b3JSZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID0geyBfX2h0bWw6IGN1c3RvbUdlbmVyYXRvclJlcy5odG1sIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0ICYmICgnZG9tTm9kZXMnIGluIGN1c3RvbUdlbmVyYXRvclJlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWVkRG9tTm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjdXN0b21HZW5lcmF0b3JSZXMuZG9tTm9kZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3QgJiYgdHlwZW9mIGN1c3RvbUdlbmVyYXRvclJlcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmUgdmFsdWUgKGxpa2Ugc3RyaW5nIG9yIG51bWJlcilcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJDb250ZW50ID0gY3VzdG9tR2VuZXJhdG9yUmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYW4gZXhvdGljIG9iamVjdCBmb3IgaGFuZGxlQ3VzdG9tUmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRHZW5lcmF0b3JNZXRhID0gY3VzdG9tR2VuZXJhdG9yUmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVzZURlZmF1bHQgPSAhaGFzQ3VzdG9tUmVuZGVyaW5nSGFuZGxlcihwcm9wcy5nZW5lcmF0b3JOYW1lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXNlRGVmYXVsdCAmJiBkZWZhdWx0R2VuZXJhdG9yKSB7XG4gICAgICAgICAgICBpbm5lckNvbnRlbnQgPSBkZWZhdWx0R2VuZXJhdG9yKHJlbmRlclByb3BzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnF1ZXVlZERvbU5vZGVzID0gcXVldWVkRG9tTm9kZXM7XG4gICAgICAgIHRoaXMuY3VycmVudEdlbmVyYXRvck1ldGEgPSBjdXJyZW50R2VuZXJhdG9yTWV0YTtcbiAgICAgICAgcmV0dXJuIHByZWFjdC5jcmVhdGVFbGVtZW50KHByb3BzLmVsVGFnLCBhdHRycywgaW5uZXJDb250ZW50KTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuYXBwbHlRdWV1ZXVkRG9tTm9kZXMoKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ3VzdG9tUmVuZGVyaW5nKHRydWUpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIHRoaXMuYXBwbHlRdWV1ZXVkRG9tTm9kZXMoKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ3VzdG9tUmVuZGVyaW5nKHRydWUpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ3VzdG9tUmVuZGVyaW5nKGZhbHNlKTsgLy8gVE9ETzogZGlmZmVyZW50IEFQSSBmb3IgcmVtb3ZhbD9cbiAgICB9XG4gICAgdHJpZ2dlckN1c3RvbVJlbmRlcmluZyhpc0FjdGl2ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgaGFuZGxlQ3VzdG9tUmVuZGVyaW5nLCBjdXN0b21SZW5kZXJpbmdNZXRhTWFwIH0gPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIGlmIChoYW5kbGVDdXN0b21SZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGdlbmVyYXRvck1ldGEgPSAoX2EgPSB0aGlzLmN1cnJlbnRHZW5lcmF0b3JNZXRhKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdXN0b21SZW5kZXJpbmdNZXRhTWFwID09PSBudWxsIHx8IGN1c3RvbVJlbmRlcmluZ01ldGFNYXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGN1c3RvbVJlbmRlcmluZ01ldGFNYXBbcHJvcHMuZ2VuZXJhdG9yTmFtZV07XG4gICAgICAgICAgICBpZiAoZ2VuZXJhdG9yTWV0YSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZUN1c3RvbVJlbmRlcmluZyhPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBpZDogdGhpcy5pZCwgaXNBY3RpdmUsIGNvbnRhaW5lckVsOiB0aGlzLmJhc2UsIHJlcG9ydE5ld0NvbnRhaW5lckVsOiB0aGlzLmhhbmRsZUVsLCAvLyBmb3IgY3VzdG9tUmVuZGVyaW5nUmVwbGFjZXNFbFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JNZXRhIH0sIHByb3BzKSwgeyBlbENsYXNzZXM6IChwcm9wcy5lbENsYXNzZXMgfHwgW10pLmZpbHRlcihpc1RydXRoeSkgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGx5UXVldWV1ZERvbU5vZGVzKCkge1xuICAgICAgICBjb25zdCB7IHF1ZXVlZERvbU5vZGVzLCBjdXJyZW50RG9tTm9kZXMgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5iYXNlO1xuICAgICAgICBpZiAoIWlzQXJyYXlzRXF1YWwocXVldWVkRG9tTm9kZXMsIGN1cnJlbnREb21Ob2RlcykpIHtcbiAgICAgICAgICAgIGN1cnJlbnREb21Ob2Rlcy5mb3JFYWNoKHJlbW92ZUVsZW1lbnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgbmV3Tm9kZSBvZiBxdWV1ZWREb21Ob2Rlcykge1xuICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKG5ld05vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jdXJyZW50RG9tTm9kZXMgPSBxdWV1ZWREb21Ob2RlcztcbiAgICAgICAgfVxuICAgIH1cbn1cbkNvbnRlbnRJbmplY3Rvci5hZGRQcm9wc0VxdWFsaXR5KHtcbiAgICBlbENsYXNzZXM6IGlzQXJyYXlzRXF1YWwsXG4gICAgZWxTdHlsZTogaXNQcm9wc0VxdWFsLFxuICAgIGVsQXR0cnM6IGlzTm9uSGFuZGxlclByb3BzRXF1YWwsXG4gICAgcmVuZGVyUHJvcHM6IGlzUHJvcHNFcXVhbCxcbn0pO1xuLy8gVXRpbFxuLypcbkRvZXMgVUktZnJhbWV3b3JrIHByb3ZpZGUgY3VzdG9tIHdheSBvZiByZW5kZXJpbmc/XG4qL1xuZnVuY3Rpb24gaGFzQ3VzdG9tUmVuZGVyaW5nSGFuZGxlcihnZW5lcmF0b3JOYW1lLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIHJldHVybiBCb29sZWFuKG9wdGlvbnMuaGFuZGxlQ3VzdG9tUmVuZGVyaW5nICYmXG4gICAgICAgIGdlbmVyYXRvck5hbWUgJiZcbiAgICAgICAgKChfYSA9IG9wdGlvbnMuY3VzdG9tUmVuZGVyaW5nTWV0YU1hcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hW2dlbmVyYXRvck5hbWVdKSk7XG59XG5mdW5jdGlvbiBidWlsZEVsQXR0cnMocHJvcHMsIGV4dHJhQ2xhc3NOYW1lcykge1xuICAgIGNvbnN0IGF0dHJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5lbEF0dHJzKSwgeyByZWY6IHByb3BzLmVsUmVmIH0pO1xuICAgIGlmIChwcm9wcy5lbENsYXNzZXMgfHwgZXh0cmFDbGFzc05hbWVzKSB7XG4gICAgICAgIGF0dHJzLmNsYXNzTmFtZSA9IChwcm9wcy5lbENsYXNzZXMgfHwgW10pXG4gICAgICAgICAgICAuY29uY2F0KGV4dHJhQ2xhc3NOYW1lcyB8fCBbXSlcbiAgICAgICAgICAgIC5jb25jYXQoYXR0cnMuY2xhc3NOYW1lIHx8IFtdKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmVsU3R5bGUpIHtcbiAgICAgICAgYXR0cnMuc3R5bGUgPSBwcm9wcy5lbFN0eWxlO1xuICAgIH1cbiAgICByZXR1cm4gYXR0cnM7XG59XG5mdW5jdGlvbiBpc1RydXRoeSh2YWwpIHtcbiAgICByZXR1cm4gQm9vbGVhbih2YWwpO1xufVxuXG5jb25zdCBSZW5kZXJJZCA9IGNyZWF0ZUNvbnRleHQoMCk7XG5cbmNsYXNzIENvbnRlbnRDb250YWluZXIgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5Jbm5lckNvbnRlbnQgPSBJbm5lckNvbnRlbnRJbmplY3Rvci5iaW5kKHVuZGVmaW5lZCwgdGhpcyk7XG4gICAgICAgIHRoaXMuaGFuZGxlUm9vdEVsID0gKGVsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbCA9IGVsO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZWxSZWYpIHtcbiAgICAgICAgICAgICAgICBzZXRSZWYodGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZENsYXNzTmFtZXMgPSBnZW5lcmF0ZUNsYXNzTmFtZXMocHJvcHMuY2xhc3NOYW1lR2VuZXJhdG9yLCBwcm9wcy5yZW5kZXJQcm9wcyk7XG4gICAgICAgIGlmIChwcm9wcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgZWxBdHRycyA9IGJ1aWxkRWxBdHRycyhwcm9wcywgZ2VuZXJhdGVkQ2xhc3NOYW1lcyk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuKHRoaXMuSW5uZXJDb250ZW50LCBwcm9wcy5yZW5kZXJQcm9wcywgZWxBdHRycyk7XG4gICAgICAgICAgICBpZiAocHJvcHMuZWxUYWcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQocHJvcHMuZWxUYWcsIGVsQXR0cnMsIGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudCgoQ29udGVudEluamVjdG9yKSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcyksIHsgZWxSZWY6IHRoaXMuaGFuZGxlUm9vdEVsLCBlbFRhZzogcHJvcHMuZWxUYWcgfHwgJ2RpdicsIGVsQ2xhc3NlczogKHByb3BzLmVsQ2xhc3NlcyB8fCBbXSkuY29uY2F0KGdlbmVyYXRlZENsYXNzTmFtZXMpLCByZW5kZXJJZDogdGhpcy5jb250ZXh0IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcykuZGlkTW91bnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMucmVuZGVyUHJvcHMpLCB7IGVsOiB0aGlzLnJvb3RFbCB8fCB0aGlzLmJhc2UgfSkpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgKF9iID0gKF9hID0gdGhpcy5wcm9wcykud2lsbFVubW91bnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMucmVuZGVyUHJvcHMpLCB7IGVsOiB0aGlzLnJvb3RFbCB8fCB0aGlzLmJhc2UgfSkpO1xuICAgIH1cbn1cbkNvbnRlbnRDb250YWluZXIuY29udGV4dFR5cGUgPSBSZW5kZXJJZDtcbmZ1bmN0aW9uIElubmVyQ29udGVudEluamVjdG9yKGNvbnRhaW5lckNvbXBvbmVudCwgcHJvcHMpIHtcbiAgICBjb25zdCBwYXJlbnRQcm9wcyA9IGNvbnRhaW5lckNvbXBvbmVudC5wcm9wcztcbiAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoKENvbnRlbnRJbmplY3RvciksIE9iamVjdC5hc3NpZ24oeyByZW5kZXJQcm9wczogcGFyZW50UHJvcHMucmVuZGVyUHJvcHMsIGdlbmVyYXRvck5hbWU6IHBhcmVudFByb3BzLmdlbmVyYXRvck5hbWUsIGN1c3RvbUdlbmVyYXRvcjogcGFyZW50UHJvcHMuY3VzdG9tR2VuZXJhdG9yLCBkZWZhdWx0R2VuZXJhdG9yOiBwYXJlbnRQcm9wcy5kZWZhdWx0R2VuZXJhdG9yLCByZW5kZXJJZDogY29udGFpbmVyQ29tcG9uZW50LmNvbnRleHQgfSwgcHJvcHMpKTtcbn1cbi8vIFV0aWxzXG5mdW5jdGlvbiBnZW5lcmF0ZUNsYXNzTmFtZXMoY2xhc3NOYW1lR2VuZXJhdG9yLCByZW5kZXJQcm9wcykge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0eXBlb2YgY2xhc3NOYW1lR2VuZXJhdG9yID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgY2xhc3NOYW1lR2VuZXJhdG9yKHJlbmRlclByb3BzKSA6XG4gICAgICAgIGNsYXNzTmFtZUdlbmVyYXRvciB8fCBbXTtcbiAgICByZXR1cm4gdHlwZW9mIGNsYXNzTmFtZXMgPT09ICdzdHJpbmcnID8gW2NsYXNzTmFtZXNdIDogY2xhc3NOYW1lcztcbn1cblxuLy8gQkFEIG5hbWUgZm9yIHRoaXMgY2xhc3Mgbm93LiB1c2VkIGluIHRoZSBIZWFkZXJcbmNsYXNzIFRhYmxlRGF0ZUNlbGwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYsIG9wdGlvbnMsIHRoZW1lLCB2aWV3QXBpIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBkYXRlLCBkYXRlUHJvZmlsZSB9ID0gcHJvcHM7XG4gICAgICAgIGxldCBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcHJvcHMudG9kYXlSYW5nZSwgbnVsbCwgZGF0ZVByb2ZpbGUpO1xuICAgICAgICBsZXQgY2xhc3NOYW1lcyA9IFtDTEFTU19OQU1FXS5jb25jYXQoZ2V0RGF5Q2xhc3NOYW1lcyhkYXlNZXRhLCB0aGVtZSkpO1xuICAgICAgICBsZXQgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIHByb3BzLmRheUhlYWRlckZvcm1hdCk7XG4gICAgICAgIC8vIGlmIGNvbENudCBpcyAxLCB3ZSBhcmUgYWxyZWFkeSBpbiBhIGRheS12aWV3IGFuZCBkb24ndCBuZWVkIGEgbmF2bGlua1xuICAgICAgICBsZXQgbmF2TGlua0F0dHJzID0gKCFkYXlNZXRhLmlzRGlzYWJsZWQgJiYgcHJvcHMuY29sQ250ID4gMSlcbiAgICAgICAgICAgID8gYnVpbGROYXZMaW5rQXR0cnModGhpcy5jb250ZXh0LCBkYXRlKVxuICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgbGV0IHJlbmRlclByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBkYXRlOiBkYXRlRW52LnRvRGF0ZShkYXRlKSwgdmlldzogdmlld0FwaSB9LCBwcm9wcy5leHRyYVJlbmRlclByb3BzKSwgeyB0ZXh0IH0pLCBkYXlNZXRhKTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCB7IGVsVGFnOiBcInRoXCIsIGVsQ2xhc3NlczogY2xhc3NOYW1lcywgZWxBdHRyczogT2JqZWN0LmFzc2lnbih7IHJvbGU6ICdjb2x1bW5oZWFkZXInLCBjb2xTcGFuOiBwcm9wcy5jb2xTcGFuLCAnZGF0YS1kYXRlJzogIWRheU1ldGEuaXNEaXNhYmxlZCA/IGZvcm1hdERheVN0cmluZyhkYXRlKSA6IHVuZGVmaW5lZCB9LCBwcm9wcy5leHRyYURhdGFBdHRycyksIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJkYXlIZWFkZXJDb250ZW50XCIsIGN1c3RvbUdlbmVyYXRvcjogb3B0aW9ucy5kYXlIZWFkZXJDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiByZW5kZXJJbm5lciQxLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMuZGF5SGVhZGVyQ2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIChJbm5lckNvbnRhaW5lcikgPT4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy1pbm5lclwiIH0sICFkYXlNZXRhLmlzRGlzYWJsZWQgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KElubmVyQ29udGFpbmVyLCB7IGVsVGFnOiBcImFcIiwgZWxBdHRyczogbmF2TGlua0F0dHJzLCBlbENsYXNzZXM6IFtcbiAgICAgICAgICAgICAgICAnZmMtY29sLWhlYWRlci1jZWxsLWN1c2hpb24nLFxuICAgICAgICAgICAgICAgIHByb3BzLmlzU3RpY2t5ICYmICdmYy1zdGlja3knLFxuICAgICAgICAgICAgXSB9KSkpKSkpO1xuICAgIH1cbn1cblxuY29uc3QgV0VFS0RBWV9GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrZGF5OiAnbG9uZycgfSk7XG5jbGFzcyBUYWJsZURvd0NlbGwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBkYXRlRW52LCB0aGVtZSwgdmlld0FwaSwgb3B0aW9ucyB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgZGF0ZSA9IGFkZERheXMobmV3IERhdGUoMjU5MjAwMDAwKSwgcHJvcHMuZG93KTsgLy8gc3RhcnQgd2l0aCBTdW4sIDA0IEphbiAxOTcwIDAwOjAwOjAwIEdNVFxuICAgICAgICBsZXQgZGF0ZU1ldGEgPSB7XG4gICAgICAgICAgICBkb3c6IHByb3BzLmRvdyxcbiAgICAgICAgICAgIGlzRGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNGdXR1cmU6IGZhbHNlLFxuICAgICAgICAgICAgaXNQYXN0OiBmYWxzZSxcbiAgICAgICAgICAgIGlzVG9kYXk6IGZhbHNlLFxuICAgICAgICAgICAgaXNPdGhlcjogZmFsc2UsXG4gICAgICAgIH07XG4gICAgICAgIGxldCB0ZXh0ID0gZGF0ZUVudi5mb3JtYXQoZGF0ZSwgcHJvcHMuZGF5SGVhZGVyRm9ybWF0KTtcbiAgICAgICAgbGV0IHJlbmRlclByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IC8vIFRPRE86IG1ha2UgdGhpcyBwdWJsaWM/XG4gICAgICAgICAgICBkYXRlIH0sIGRhdGVNZXRhKSwgeyB2aWV3OiB2aWV3QXBpIH0pLCBwcm9wcy5leHRyYVJlbmRlclByb3BzKSwgeyB0ZXh0IH0pO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRDb250YWluZXIsIHsgZWxUYWc6IFwidGhcIiwgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgQ0xBU1NfTkFNRSxcbiAgICAgICAgICAgICAgICAuLi5nZXREYXlDbGFzc05hbWVzKGRhdGVNZXRhLCB0aGVtZSksXG4gICAgICAgICAgICAgICAgLi4uKHByb3BzLmV4dHJhQ2xhc3NOYW1lcyB8fCBbXSksXG4gICAgICAgICAgICBdLCBlbEF0dHJzOiBPYmplY3QuYXNzaWduKHsgcm9sZTogJ2NvbHVtbmhlYWRlcicsIGNvbFNwYW46IHByb3BzLmNvbFNwYW4gfSwgcHJvcHMuZXh0cmFEYXRhQXR0cnMpLCByZW5kZXJQcm9wczogcmVuZGVyUHJvcHMsIGdlbmVyYXRvck5hbWU6IFwiZGF5SGVhZGVyQ29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMuZGF5SGVhZGVyQ29udGVudCwgZGVmYXVsdEdlbmVyYXRvcjogcmVuZGVySW5uZXIkMSwgY2xhc3NOYW1lR2VuZXJhdG9yOiBvcHRpb25zLmRheUhlYWRlckNsYXNzTmFtZXMsIGRpZE1vdW50OiBvcHRpb25zLmRheUhlYWRlckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5kYXlIZWFkZXJXaWxsVW5tb3VudCB9LCAoSW5uZXJDb250ZW50KSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSxcbiAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KElubmVyQ29udGVudCwgeyBlbFRhZzogXCJhXCIsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgICAgICAnZmMtY29sLWhlYWRlci1jZWxsLWN1c2hpb24nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5pc1N0aWNreSAmJiAnZmMtc3RpY2t5JyxcbiAgICAgICAgICAgICAgICBdLCBlbEF0dHJzOiB7XG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogZGF0ZUVudi5mb3JtYXQoZGF0ZSwgV0VFS0RBWV9GT1JNQVQpLFxuICAgICAgICAgICAgICAgIH0gfSkpKSkpO1xuICAgIH1cbn1cblxuY2xhc3MgTm93VGltZXIgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcywgY29udGV4dCkge1xuICAgICAgICBzdXBlcihwcm9wcywgY29udGV4dCk7XG4gICAgICAgIHRoaXMuaW5pdGlhbE5vd0RhdGUgPSBnZXROb3coY29udGV4dC5vcHRpb25zLm5vdywgY29udGV4dC5kYXRlRW52KTtcbiAgICAgICAgdGhpcy5pbml0aWFsTm93UXVlcmllZE1zID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLmNvbXB1dGVUaW1pbmcoKS5jdXJyZW50U3RhdGU7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4oc3RhdGUubm93RGF0ZSwgc3RhdGUudG9kYXlSYW5nZSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnNldFRpbWVvdXQoKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgICBpZiAocHJldlByb3BzLnVuaXQgIT09IHRoaXMucHJvcHMudW5pdCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgIH1cbiAgICBjb21wdXRlVGltaW5nKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHVucm91bmRlZE5vdyA9IGFkZE1zKHRoaXMuaW5pdGlhbE5vd0RhdGUsIG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGhpcy5pbml0aWFsTm93UXVlcmllZE1zKTtcbiAgICAgICAgbGV0IGN1cnJlbnRVbml0U3RhcnQgPSBjb250ZXh0LmRhdGVFbnYuc3RhcnRPZih1bnJvdW5kZWROb3csIHByb3BzLnVuaXQpO1xuICAgICAgICBsZXQgbmV4dFVuaXRTdGFydCA9IGNvbnRleHQuZGF0ZUVudi5hZGQoY3VycmVudFVuaXRTdGFydCwgY3JlYXRlRHVyYXRpb24oMSwgcHJvcHMudW5pdCkpO1xuICAgICAgICBsZXQgd2FpdE1zID0gbmV4dFVuaXRTdGFydC52YWx1ZU9mKCkgLSB1bnJvdW5kZWROb3cudmFsdWVPZigpO1xuICAgICAgICAvLyB0aGVyZSBpcyBhIG1heCBzZXRUaW1lb3V0IG1zIHZhbHVlIChodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzQ2ODY1MC85NjM0MilcbiAgICAgICAgLy8gZW5zdXJlIG5vIGxvbmdlciB0aGFuIGEgZGF5XG4gICAgICAgIHdhaXRNcyA9IE1hdGgubWluKDEwMDAgKiA2MCAqIDYwICogMjQsIHdhaXRNcyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjdXJyZW50U3RhdGU6IHsgbm93RGF0ZTogY3VycmVudFVuaXRTdGFydCwgdG9kYXlSYW5nZTogYnVpbGREYXlSYW5nZShjdXJyZW50VW5pdFN0YXJ0KSB9LFxuICAgICAgICAgICAgbmV4dFN0YXRlOiB7IG5vd0RhdGU6IG5leHRVbml0U3RhcnQsIHRvZGF5UmFuZ2U6IGJ1aWxkRGF5UmFuZ2UobmV4dFVuaXRTdGFydCkgfSxcbiAgICAgICAgICAgIHdhaXRNcyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgpIHtcbiAgICAgICAgbGV0IHsgbmV4dFN0YXRlLCB3YWl0TXMgfSA9IHRoaXMuY29tcHV0ZVRpbWluZygpO1xuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRpbWVvdXQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB3YWl0TXMpO1xuICAgIH1cbiAgICBjbGVhclRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbk5vd1RpbWVyLmNvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuZnVuY3Rpb24gYnVpbGREYXlSYW5nZShkYXRlKSB7XG4gICAgbGV0IHN0YXJ0ID0gc3RhcnRPZkRheShkYXRlKTtcbiAgICBsZXQgZW5kID0gYWRkRGF5cyhzdGFydCwgMSk7XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG5jbGFzcyBEYXlIZWFkZXIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIgPSBtZW1vaXplKGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcik7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgZGF0ZXMsIGRhdGVQcm9maWxlLCBkYXRlc1JlcERpc3RpbmN0RGF5cywgcmVuZGVySW50cm8gfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBkYXlIZWFkZXJGb3JtYXQgPSB0aGlzLmNyZWF0ZURheUhlYWRlckZvcm1hdHRlcihjb250ZXh0Lm9wdGlvbnMuZGF5SGVhZGVyRm9ybWF0LCBkYXRlc1JlcERpc3RpbmN0RGF5cywgZGF0ZXMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChOb3dUaW1lciwgeyB1bml0OiBcImRheVwiIH0sIChub3dEYXRlLCB0b2RheVJhbmdlKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgIHJlbmRlckludHJvICYmIHJlbmRlckludHJvKCdkYXknKSxcbiAgICAgICAgICAgIGRhdGVzLm1hcCgoZGF0ZSkgPT4gKGRhdGVzUmVwRGlzdGluY3REYXlzID8gKHByZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlRGF0ZUNlbGwsIHsga2V5OiBkYXRlLnRvSVNPU3RyaW5nKCksIGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSwgY29sQ250OiBkYXRlcy5sZW5ndGgsIGRheUhlYWRlckZvcm1hdDogZGF5SGVhZGVyRm9ybWF0IH0pKSA6IChwcmVhY3QuY3JlYXRlRWxlbWVudChUYWJsZURvd0NlbGwsIHsga2V5OiBkYXRlLmdldFVUQ0RheSgpLCBkb3c6IGRhdGUuZ2V0VVRDRGF5KCksIGRheUhlYWRlckZvcm1hdDogZGF5SGVhZGVyRm9ybWF0IH0pKSkpKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIoZXhwbGljaXRGb3JtYXQsIGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXRlQ250KSB7XG4gICAgcmV0dXJuIGV4cGxpY2l0Rm9ybWF0IHx8IGNvbXB1dGVGYWxsYmFja0hlYWRlckZvcm1hdChkYXRlc1JlcERpc3RpbmN0RGF5cywgZGF0ZUNudCk7XG59XG5cbmNsYXNzIERheVNlcmllc01vZGVsIHtcbiAgICBjb25zdHJ1Y3RvcihyYW5nZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IpIHtcbiAgICAgICAgbGV0IGRhdGUgPSByYW5nZS5zdGFydDtcbiAgICAgICAgbGV0IHsgZW5kIH0gPSByYW5nZTtcbiAgICAgICAgbGV0IGluZGljZXMgPSBbXTtcbiAgICAgICAgbGV0IGRhdGVzID0gW107XG4gICAgICAgIGxldCBkYXlJbmRleCA9IC0xO1xuICAgICAgICB3aGlsZSAoZGF0ZSA8IGVuZCkgeyAvLyBsb29wIGVhY2ggZGF5IGZyb20gc3RhcnQgdG8gZW5kXG4gICAgICAgICAgICBpZiAoZGF0ZVByb2ZpbGVHZW5lcmF0b3IuaXNIaWRkZW5EYXkoZGF0ZSkpIHtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goZGF5SW5kZXggKyAwLjUpOyAvLyBtYXJrIHRoYXQgaXQncyBiZXR3ZWVuIGluZGljZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRheUluZGV4ICs9IDE7XG4gICAgICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGRheUluZGV4KTtcbiAgICAgICAgICAgICAgICBkYXRlcy5wdXNoKGRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0ZSA9IGFkZERheXMoZGF0ZSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRlcyA9IGRhdGVzO1xuICAgICAgICB0aGlzLmluZGljZXMgPSBpbmRpY2VzO1xuICAgICAgICB0aGlzLmNudCA9IGRhdGVzLmxlbmd0aDtcbiAgICB9XG4gICAgc2xpY2VSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgZmlyc3RJbmRleCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KHJhbmdlLnN0YXJ0KTsgLy8gaW5jbHVzaXZlIGZpcnN0IGluZGV4XG4gICAgICAgIGxldCBsYXN0SW5kZXggPSB0aGlzLmdldERhdGVEYXlJbmRleChhZGREYXlzKHJhbmdlLmVuZCwgLTEpKTsgLy8gaW5jbHVzaXZlIGxhc3QgaW5kZXhcbiAgICAgICAgbGV0IGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5tYXgoMCwgZmlyc3RJbmRleCk7XG4gICAgICAgIGxldCBjbGlwcGVkTGFzdEluZGV4ID0gTWF0aC5taW4odGhpcy5jbnQgLSAxLCBsYXN0SW5kZXgpO1xuICAgICAgICAvLyBkZWFsIHdpdGggaW4tYmV0d2VlbiBpbmRpY2VzXG4gICAgICAgIGNsaXBwZWRGaXJzdEluZGV4ID0gTWF0aC5jZWlsKGNsaXBwZWRGaXJzdEluZGV4KTsgLy8gaW4tYmV0d2VlbiBzdGFydHMgcm91bmQgdG8gbmV4dCBjZWxsXG4gICAgICAgIGNsaXBwZWRMYXN0SW5kZXggPSBNYXRoLmZsb29yKGNsaXBwZWRMYXN0SW5kZXgpOyAvLyBpbi1iZXR3ZWVuIGVuZHMgcm91bmQgdG8gcHJldiBjZWxsXG4gICAgICAgIGlmIChjbGlwcGVkRmlyc3RJbmRleCA8PSBjbGlwcGVkTGFzdEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZpcnN0SW5kZXg6IGNsaXBwZWRGaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgIGxhc3RJbmRleDogY2xpcHBlZExhc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc1N0YXJ0OiBmaXJzdEluZGV4ID09PSBjbGlwcGVkRmlyc3RJbmRleCxcbiAgICAgICAgICAgICAgICBpc0VuZDogbGFzdEluZGV4ID09PSBjbGlwcGVkTGFzdEluZGV4LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gR2l2ZW4gYSBkYXRlLCByZXR1cm5zIGl0cyBjaHJvbm9sb2NpYWwgY2VsbC1pbmRleCBmcm9tIHRoZSBmaXJzdCBjZWxsIG9mIHRoZSBncmlkLlxuICAgIC8vIElmIHRoZSBkYXRlIGxpZXMgYmV0d2VlbiBjZWxscyAoYmVjYXVzZSBvZiBoaWRkZW5EYXlzKSwgcmV0dXJucyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJldHdlZW4gb2Zmc2V0cy5cbiAgICAvLyBJZiBiZWZvcmUgdGhlIGZpcnN0IG9mZnNldCwgcmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlci5cbiAgICAvLyBJZiBhZnRlciB0aGUgbGFzdCBvZmZzZXQsIHJldHVybnMgYW4gb2Zmc2V0IHBhc3QgdGhlIGxhc3QgY2VsbCBvZmZzZXQuXG4gICAgLy8gT25seSB3b3JrcyBmb3IgKnN0YXJ0KiBkYXRlcyBvZiBjZWxscy4gV2lsbCBub3Qgd29yayBmb3IgZXhjbHVzaXZlIGVuZCBkYXRlcyBmb3IgY2VsbHMuXG4gICAgZ2V0RGF0ZURheUluZGV4KGRhdGUpIHtcbiAgICAgICAgbGV0IHsgaW5kaWNlcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGRheU9mZnNldCA9IE1hdGguZmxvb3IoZGlmZkRheXModGhpcy5kYXRlc1swXSwgZGF0ZSkpO1xuICAgICAgICBpZiAoZGF5T2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGljZXNbMF0gLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlPZmZzZXQgPj0gaW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV0gKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbmRpY2VzW2RheU9mZnNldF07XG4gICAgfVxufVxuXG5jbGFzcyBEYXlUYWJsZU1vZGVsIHtcbiAgICBjb25zdHJ1Y3RvcihkYXlTZXJpZXMsIGJyZWFrT25XZWVrcykge1xuICAgICAgICBsZXQgeyBkYXRlcyB9ID0gZGF5U2VyaWVzO1xuICAgICAgICBsZXQgZGF5c1BlclJvdztcbiAgICAgICAgbGV0IGZpcnN0RGF5O1xuICAgICAgICBsZXQgcm93Q250O1xuICAgICAgICBpZiAoYnJlYWtPbldlZWtzKSB7XG4gICAgICAgICAgICAvLyBjb3VudCBjb2x1bW5zIHVudGlsIHRoZSBkYXktb2Ytd2VlayByZXBlYXRzXG4gICAgICAgICAgICBmaXJzdERheSA9IGRhdGVzWzBdLmdldFVUQ0RheSgpO1xuICAgICAgICAgICAgZm9yIChkYXlzUGVyUm93ID0gMTsgZGF5c1BlclJvdyA8IGRhdGVzLmxlbmd0aDsgZGF5c1BlclJvdyArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVzW2RheXNQZXJSb3ddLmdldFVUQ0RheSgpID09PSBmaXJzdERheSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dDbnQgPSBNYXRoLmNlaWwoZGF0ZXMubGVuZ3RoIC8gZGF5c1BlclJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByb3dDbnQgPSAxO1xuICAgICAgICAgICAgZGF5c1BlclJvdyA9IGRhdGVzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJvd0NudCA9IHJvd0NudDtcbiAgICAgICAgdGhpcy5jb2xDbnQgPSBkYXlzUGVyUm93O1xuICAgICAgICB0aGlzLmRheVNlcmllcyA9IGRheVNlcmllcztcbiAgICAgICAgdGhpcy5jZWxscyA9IHRoaXMuYnVpbGRDZWxscygpO1xuICAgICAgICB0aGlzLmhlYWRlckRhdGVzID0gdGhpcy5idWlsZEhlYWRlckRhdGVzKCk7XG4gICAgfVxuICAgIGJ1aWxkQ2VsbHMoKSB7XG4gICAgICAgIGxldCByb3dzID0gW107XG4gICAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IHRoaXMucm93Q250OyByb3cgKz0gMSkge1xuICAgICAgICAgICAgbGV0IGNlbGxzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgICAgICBjZWxscy5wdXNoKHRoaXMuYnVpbGRDZWxsKHJvdywgY29sKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3dzLnB1c2goY2VsbHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgICBidWlsZENlbGwocm93LCBjb2wpIHtcbiAgICAgICAgbGV0IGRhdGUgPSB0aGlzLmRheVNlcmllcy5kYXRlc1tyb3cgKiB0aGlzLmNvbENudCArIGNvbF07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBrZXk6IGRhdGUudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGJ1aWxkSGVhZGVyRGF0ZXMoKSB7XG4gICAgICAgIGxldCBkYXRlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB0aGlzLmNvbENudDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIGRhdGVzLnB1c2godGhpcy5jZWxsc1swXVtjb2xdLmRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG4gICAgc2xpY2VSYW5nZShyYW5nZSkge1xuICAgICAgICBsZXQgeyBjb2xDbnQgfSA9IHRoaXM7XG4gICAgICAgIGxldCBzZXJpZXNTZWcgPSB0aGlzLmRheVNlcmllcy5zbGljZVJhbmdlKHJhbmdlKTtcbiAgICAgICAgbGV0IHNlZ3MgPSBbXTtcbiAgICAgICAgaWYgKHNlcmllc1NlZykge1xuICAgICAgICAgICAgbGV0IHsgZmlyc3RJbmRleCwgbGFzdEluZGV4IH0gPSBzZXJpZXNTZWc7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSBmaXJzdEluZGV4O1xuICAgICAgICAgICAgd2hpbGUgKGluZGV4IDw9IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBNYXRoLmZsb29yKGluZGV4IC8gY29sQ250KTtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gTWF0aC5taW4oKHJvdyArIDEpICogY29sQ250LCBsYXN0SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBzZWdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29sOiBpbmRleCAlIGNvbENudCxcbiAgICAgICAgICAgICAgICAgICAgbGFzdENvbDogKG5leHRJbmRleCAtIDEpICUgY29sQ250LFxuICAgICAgICAgICAgICAgICAgICBpc1N0YXJ0OiBzZXJpZXNTZWcuaXNTdGFydCAmJiBpbmRleCA9PT0gZmlyc3RJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmQ6IHNlcmllc1NlZy5pc0VuZCAmJiAobmV4dEluZGV4IC0gMSkgPT09IGxhc3RJbmRleCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VncztcbiAgICB9XG59XG5cbmNsYXNzIFNsaWNlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuc2xpY2VCdXNpbmVzc0hvdXJzID0gbWVtb2l6ZSh0aGlzLl9zbGljZUJ1c2luZXNzSG91cnMpO1xuICAgICAgICB0aGlzLnNsaWNlRGF0ZVNlbGVjdGlvbiA9IG1lbW9pemUodGhpcy5fc2xpY2VEYXRlU3Bhbik7XG4gICAgICAgIHRoaXMuc2xpY2VFdmVudFN0b3JlID0gbWVtb2l6ZSh0aGlzLl9zbGljZUV2ZW50U3RvcmUpO1xuICAgICAgICB0aGlzLnNsaWNlRXZlbnREcmFnID0gbWVtb2l6ZSh0aGlzLl9zbGljZUludGVyYWN0aW9uKTtcbiAgICAgICAgdGhpcy5zbGljZUV2ZW50UmVzaXplID0gbWVtb2l6ZSh0aGlzLl9zbGljZUludGVyYWN0aW9uKTtcbiAgICAgICAgdGhpcy5mb3JjZURheUlmTGlzdEl0ZW0gPSBmYWxzZTsgLy8gaGFja1xuICAgIH1cbiAgICBzbGljZVByb3BzKHByb3BzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgY29udGV4dCwgLi4uZXh0cmFBcmdzKSB7XG4gICAgICAgIGxldCB7IGV2ZW50VWlCYXNlcyB9ID0gcHJvcHM7XG4gICAgICAgIGxldCBldmVudFNlZ3MgPSB0aGlzLnNsaWNlRXZlbnRTdG9yZShwcm9wcy5ldmVudFN0b3JlLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCAuLi5leHRyYUFyZ3MpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0ZVNlbGVjdGlvblNlZ3M6IHRoaXMuc2xpY2VEYXRlU2VsZWN0aW9uKHByb3BzLmRhdGVTZWxlY3Rpb24sIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCBldmVudFVpQmFzZXMsIGNvbnRleHQsIC4uLmV4dHJhQXJncyksXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJTZWdzOiB0aGlzLnNsaWNlQnVzaW5lc3NIb3Vycyhwcm9wcy5idXNpbmVzc0hvdXJzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgY29udGV4dCwgLi4uZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIGZnRXZlbnRTZWdzOiBldmVudFNlZ3MuZmcsXG4gICAgICAgICAgICBiZ0V2ZW50U2VnczogZXZlbnRTZWdzLmJnLFxuICAgICAgICAgICAgZXZlbnREcmFnOiB0aGlzLnNsaWNlRXZlbnREcmFnKHByb3BzLmV2ZW50RHJhZywgZXZlbnRVaUJhc2VzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgLi4uZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiB0aGlzLnNsaWNlRXZlbnRSZXNpemUocHJvcHMuZXZlbnRSZXNpemUsIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIC4uLmV4dHJhQXJncyksXG4gICAgICAgICAgICBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sXG4gICAgICAgIH07IC8vIFRPRE86IGdpdmUgaW50ZXJhY3Rpb25TZWdzP1xuICAgIH1cbiAgICBzbGljZU5vd0RhdGUoLy8gZG9lcyBub3QgbWVtb2l6ZVxuICAgIGRhdGUsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCBjb250ZXh0LCAuLi5leHRyYUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NsaWNlRGF0ZVNwYW4oeyByYW5nZTogeyBzdGFydDogZGF0ZSwgZW5kOiBhZGRNcyhkYXRlLCAxKSB9LCBhbGxEYXk6IGZhbHNlIH0sIC8vIGFkZCAxIG1zLCBwcm90ZWN0IGFnYWluc3QgbnVsbCByYW5nZVxuICAgICAgICBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwge30sIGNvbnRleHQsIC4uLmV4dHJhQXJncyk7XG4gICAgfVxuICAgIF9zbGljZUJ1c2luZXNzSG91cnMoYnVzaW5lc3NIb3VycywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQsIC4uLmV4dHJhQXJncykge1xuICAgICAgICBpZiAoIWJ1c2luZXNzSG91cnMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2xpY2VFdmVudFN0b3JlKGV4cGFuZFJlY3VycmluZyhidXNpbmVzc0hvdXJzLCBjb21wdXRlQWN0aXZlUmFuZ2UoZGF0ZVByb2ZpbGUsIEJvb2xlYW4obmV4dERheVRocmVzaG9sZCkpLCBjb250ZXh0KSwge30sIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCAuLi5leHRyYUFyZ3MpLmJnO1xuICAgIH1cbiAgICBfc2xpY2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIC4uLmV4dHJhQXJncykge1xuICAgICAgICBpZiAoZXZlbnRTdG9yZSkge1xuICAgICAgICAgICAgbGV0IHJhbmdlUmVzID0gc2xpY2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgY29tcHV0ZUFjdGl2ZVJhbmdlKGRhdGVQcm9maWxlLCBCb29sZWFuKG5leHREYXlUaHJlc2hvbGQpKSwgbmV4dERheVRocmVzaG9sZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJnOiB0aGlzLnNsaWNlRXZlbnRSYW5nZXMocmFuZ2VSZXMuYmcsIGV4dHJhQXJncyksXG4gICAgICAgICAgICAgICAgZmc6IHRoaXMuc2xpY2VFdmVudFJhbmdlcyhyYW5nZVJlcy5mZywgZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgYmc6IFtdLCBmZzogW10gfTtcbiAgICB9XG4gICAgX3NsaWNlSW50ZXJhY3Rpb24oaW50ZXJhY3Rpb24sIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIC4uLmV4dHJhQXJncykge1xuICAgICAgICBpZiAoIWludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmFuZ2VSZXMgPSBzbGljZUV2ZW50U3RvcmUoaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cywgZXZlbnRVaUJhc2VzLCBjb21wdXRlQWN0aXZlUmFuZ2UoZGF0ZVByb2ZpbGUsIEJvb2xlYW4obmV4dERheVRocmVzaG9sZCkpLCBuZXh0RGF5VGhyZXNob2xkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNlZ3M6IHRoaXMuc2xpY2VFdmVudFJhbmdlcyhyYW5nZVJlcy5mZywgZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIGFmZmVjdGVkSW5zdGFuY2VzOiBpbnRlcmFjdGlvbi5hZmZlY3RlZEV2ZW50cy5pbnN0YW5jZXMsXG4gICAgICAgICAgICBpc0V2ZW50OiBpbnRlcmFjdGlvbi5pc0V2ZW50LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfc2xpY2VEYXRlU3BhbihkYXRlU3BhbiwgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGV2ZW50VWlCYXNlcywgY29udGV4dCwgLi4uZXh0cmFBcmdzKSB7XG4gICAgICAgIGlmICghZGF0ZVNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYWN0aXZlUmFuZ2UgPSBjb21wdXRlQWN0aXZlUmFuZ2UoZGF0ZVByb2ZpbGUsIEJvb2xlYW4obmV4dERheVRocmVzaG9sZCkpO1xuICAgICAgICBsZXQgYWN0aXZlRGF0ZVNwYW5SYW5nZSA9IGludGVyc2VjdFJhbmdlcyhkYXRlU3Bhbi5yYW5nZSwgYWN0aXZlUmFuZ2UpO1xuICAgICAgICBpZiAoYWN0aXZlRGF0ZVNwYW5SYW5nZSkge1xuICAgICAgICAgICAgZGF0ZVNwYW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGVTcGFuKSwgeyByYW5nZTogYWN0aXZlRGF0ZVNwYW5SYW5nZSB9KTtcbiAgICAgICAgICAgIGxldCBldmVudFJhbmdlID0gZmFicmljYXRlRXZlbnRSYW5nZShkYXRlU3BhbiwgZXZlbnRVaUJhc2VzLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGxldCBzZWdzID0gdGhpcy5zbGljZVJhbmdlKGRhdGVTcGFuLnJhbmdlLCAuLi5leHRyYUFyZ3MpO1xuICAgICAgICAgICAgZm9yIChsZXQgc2VnIG9mIHNlZ3MpIHtcbiAgICAgICAgICAgICAgICBzZWcuZXZlbnRSYW5nZSA9IGV2ZW50UmFuZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2VncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBzbGljZUV2ZW50UmFuZ2VzKGV2ZW50UmFuZ2VzLCBleHRyYUFyZ3MpIHtcbiAgICAgICAgbGV0IHNlZ3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZXZlbnRSYW5nZSBvZiBldmVudFJhbmdlcykge1xuICAgICAgICAgICAgc2Vncy5wdXNoKC4uLnRoaXMuc2xpY2VFdmVudFJhbmdlKGV2ZW50UmFuZ2UsIGV4dHJhQXJncykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH1cbiAgICAvKlxuICAgIFwiY29tcGxldGVcIiBzZWcgbWVhbnMgaXQgaGFzIGNvbXBvbmVudCBhbmQgZXZlbnRSYW5nZVxuICAgICovXG4gICAgc2xpY2VFdmVudFJhbmdlKGV2ZW50UmFuZ2UsIGV4dHJhQXJncykge1xuICAgICAgICBsZXQgZGF0ZVJhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICAgICAgLy8gaGFjayB0byBtYWtlIG11bHRpLWRheSBldmVudHMgdGhhdCBhcmUgYmVpbmcgZm9yY2UtZGlzcGxheWVkIGFzIGxpc3QtaXRlbXMgdG8gdGFrZSB1cCBvbmx5IG9uZSBkYXlcbiAgICAgICAgaWYgKHRoaXMuZm9yY2VEYXlJZkxpc3RJdGVtICYmIGV2ZW50UmFuZ2UudWkuZGlzcGxheSA9PT0gJ2xpc3QtaXRlbScpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogZGF0ZVJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogYWRkRGF5cyhkYXRlUmFuZ2Uuc3RhcnQsIDEpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2VncyA9IHRoaXMuc2xpY2VSYW5nZShkYXRlUmFuZ2UsIC4uLmV4dHJhQXJncyk7XG4gICAgICAgIGZvciAobGV0IHNlZyBvZiBzZWdzKSB7XG4gICAgICAgICAgICBzZWcuZXZlbnRSYW5nZSA9IGV2ZW50UmFuZ2U7XG4gICAgICAgICAgICBzZWcuaXNTdGFydCA9IGV2ZW50UmFuZ2UuaXNTdGFydCAmJiBzZWcuaXNTdGFydDtcbiAgICAgICAgICAgIHNlZy5pc0VuZCA9IGV2ZW50UmFuZ2UuaXNFbmQgJiYgc2VnLmlzRW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH1cbn1cbi8qXG5mb3IgaW5jb3Jwb3JhdGluZyBzbG90TWluVGltZS9zbG90TWF4VGltZSBpZiBhcHByb3ByaWF0ZVxuVE9ETzogc2hvdWxkIGJlIHBhcnQgb2YgRGF0ZVByb2ZpbGUhXG5UaW1lbGluZURhdGVQcm9maWxlIGFscmVhZHkgZG9lcyB0aGlzIGJ0d1xuKi9cbmZ1bmN0aW9uIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICBsZXQgcmFuZ2UgPSBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZTtcbiAgICBpZiAoaXNDb21wb25lbnRBbGxEYXkpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogYWRkTXMocmFuZ2Uuc3RhcnQsIGRhdGVQcm9maWxlLnNsb3RNaW5UaW1lLm1pbGxpc2Vjb25kcyksXG4gICAgICAgIGVuZDogYWRkTXMocmFuZ2UuZW5kLCBkYXRlUHJvZmlsZS5zbG90TWF4VGltZS5taWxsaXNlY29uZHMgLSA4NjRlNSksIC8vIDg2NGU1ID0gbXMgaW4gYSBkYXlcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWR1Y2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGFjdGlvbiwgZXZlbnRTb3VyY2VzLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnUkVDRUlWRV9FVkVOVFMnOiAvLyByYXdcbiAgICAgICAgICAgIHJldHVybiByZWNlaXZlUmF3RXZlbnRzKGV2ZW50U3RvcmUsIGV2ZW50U291cmNlc1thY3Rpb24uc291cmNlSWRdLCBhY3Rpb24uZmV0Y2hJZCwgYWN0aW9uLmZldGNoUmFuZ2UsIGFjdGlvbi5yYXdFdmVudHMsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRVNFVF9SQVdfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiByZXNldFJhd0V2ZW50cyhldmVudFN0b3JlLCBldmVudFNvdXJjZXNbYWN0aW9uLnNvdXJjZUlkXSwgYWN0aW9uLnJhd0V2ZW50cywgZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdBRERfRVZFTlRTJzogLy8gYWxyZWFkeSBwYXJzZWQsIGJ1dCBub3QgZXhwYW5kZWRcbiAgICAgICAgICAgIHJldHVybiBhZGRFdmVudChldmVudFN0b3JlLCBhY3Rpb24uZXZlbnRTdG9yZSwgLy8gbmV3IG9uZXNcbiAgICAgICAgICAgIGRhdGVQcm9maWxlID8gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UgOiBudWxsLCBjb250ZXh0KTtcbiAgICAgICAgY2FzZSAnUkVTRVRfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZXZlbnRTdG9yZTtcbiAgICAgICAgY2FzZSAnTUVSR0VfRVZFTlRTJzogLy8gYWxyZWFkeSBwYXJzZWQgYW5kIGV4cGFuZGVkXG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VFdmVudFN0b3JlcyhldmVudFN0b3JlLCBhY3Rpb24uZXZlbnRTdG9yZSk7XG4gICAgICAgIGNhc2UgJ1BSRVYnOiAvLyBUT0RPOiBob3cgZG8gd2UgdHJhY2sgYWxsIGFjdGlvbnMgdGhhdCBhZmZlY3QgZGF0ZVByb2ZpbGUgOihcbiAgICAgICAgY2FzZSAnTkVYVCc6XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9EQVRFJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICBpZiAoZGF0ZVByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwYW5kUmVjdXJyaW5nKGV2ZW50U3RvcmUsIGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudFN0b3JlO1xuICAgICAgICBjYXNlICdSRU1PVkVfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiBleGNsdWRlU3ViRXZlbnRTdG9yZShldmVudFN0b3JlLCBhY3Rpb24uZXZlbnRTdG9yZSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9FVkVOVF9TT1VSQ0UnOlxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVFdmVudHNCeVNvdXJjZUlkKGV2ZW50U3RvcmUsIGFjdGlvbi5zb3VyY2VJZCk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9BTExfRVZFTlRfU09VUkNFUyc6XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgKGV2ZW50RGVmKSA9PiAoIWV2ZW50RGVmLnNvdXJjZUlkIC8vIG9ubHkga2VlcCBldmVudHMgd2l0aCBubyBzb3VyY2UgaWRcbiAgICAgICAgICAgICkpO1xuICAgICAgICBjYXNlICdSRU1PVkVfQUxMX0VWRU5UUyc6XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRTdG9yZTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWNlaXZlUmF3RXZlbnRzKGV2ZW50U3RvcmUsIGV2ZW50U291cmNlLCBmZXRjaElkLCBmZXRjaFJhbmdlLCByYXdFdmVudHMsIGNvbnRleHQpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UgJiYgLy8gbm90IGFscmVhZHkgcmVtb3ZlZFxuICAgICAgICBmZXRjaElkID09PSBldmVudFNvdXJjZS5sYXRlc3RGZXRjaElkIC8vIFRPRE86IHdpc2ggdGhpcyBsb2dpYyB3YXMgYWx3YXlzIGluIGV2ZW50LXNvdXJjZXNcbiAgICApIHtcbiAgICAgICAgbGV0IHN1YnNldCA9IHBhcnNlRXZlbnRzKHRyYW5zZm9ybVJhd0V2ZW50cyhyYXdFdmVudHMsIGV2ZW50U291cmNlLCBjb250ZXh0KSwgZXZlbnRTb3VyY2UsIGNvbnRleHQpO1xuICAgICAgICBpZiAoZmV0Y2hSYW5nZSkge1xuICAgICAgICAgICAgc3Vic2V0ID0gZXhwYW5kUmVjdXJyaW5nKHN1YnNldCwgZmV0Y2hSYW5nZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lcmdlRXZlbnRTdG9yZXMoZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2Uuc291cmNlSWQpLCBzdWJzZXQpO1xuICAgIH1cbiAgICByZXR1cm4gZXZlbnRTdG9yZTtcbn1cbmZ1bmN0aW9uIHJlc2V0UmF3RXZlbnRzKGV4aXN0aW5nRXZlbnRTdG9yZSwgZXZlbnRTb3VyY2UsIHJhd0V2ZW50cywgYWN0aXZlUmFuZ2UsIGNvbnRleHQpIHtcbiAgICBjb25zdCB7IGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwIH0gPSBidWlsZFB1YmxpY0lkTWFwcyhleGlzdGluZ0V2ZW50U3RvcmUpO1xuICAgIGxldCBuZXdFdmVudFN0b3JlID0gcGFyc2VFdmVudHModHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpLCBldmVudFNvdXJjZSwgY29udGV4dCwgZmFsc2UsIGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwKTtcbiAgICByZXR1cm4gZXhwYW5kUmVjdXJyaW5nKG5ld0V2ZW50U3RvcmUsIGFjdGl2ZVJhbmdlLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybVJhd0V2ZW50cyhyYXdFdmVudHMsIGV2ZW50U291cmNlLCBjb250ZXh0KSB7XG4gICAgbGV0IGNhbEVhY2hUcmFuc2Zvcm0gPSBjb250ZXh0Lm9wdGlvbnMuZXZlbnREYXRhVHJhbnNmb3JtO1xuICAgIGxldCBzb3VyY2VFYWNoVHJhbnNmb3JtID0gZXZlbnRTb3VyY2UgPyBldmVudFNvdXJjZS5ldmVudERhdGFUcmFuc2Zvcm0gOiBudWxsO1xuICAgIGlmIChzb3VyY2VFYWNoVHJhbnNmb3JtKSB7XG4gICAgICAgIHJhd0V2ZW50cyA9IHRyYW5zZm9ybUVhY2hSYXdFdmVudChyYXdFdmVudHMsIHNvdXJjZUVhY2hUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICBpZiAoY2FsRWFjaFRyYW5zZm9ybSkge1xuICAgICAgICByYXdFdmVudHMgPSB0cmFuc2Zvcm1FYWNoUmF3RXZlbnQocmF3RXZlbnRzLCBjYWxFYWNoVHJhbnNmb3JtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhd0V2ZW50cztcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUVhY2hSYXdFdmVudChyYXdFdmVudHMsIGZ1bmMpIHtcbiAgICBsZXQgcmVmaW5lZEV2ZW50cztcbiAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgcmVmaW5lZEV2ZW50cyA9IHJhd0V2ZW50cztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlZmluZWRFdmVudHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcmF3RXZlbnQgb2YgcmF3RXZlbnRzKSB7XG4gICAgICAgICAgICBsZXQgcmVmaW5lZEV2ZW50ID0gZnVuYyhyYXdFdmVudCk7XG4gICAgICAgICAgICBpZiAocmVmaW5lZEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgcmVmaW5lZEV2ZW50cy5wdXNoKHJlZmluZWRFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVkRXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlZmluZWRFdmVudHMucHVzaChyYXdFdmVudCk7XG4gICAgICAgICAgICB9IC8vIGlmIGEgZGlmZmVyZW50IGZhbHN5IHZhbHVlLCBkbyBub3RoaW5nXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZmluZWRFdmVudHM7XG59XG5mdW5jdGlvbiBhZGRFdmVudChldmVudFN0b3JlLCBzdWJzZXQsIGV4cGFuZFJhbmdlLCBjb250ZXh0KSB7XG4gICAgaWYgKGV4cGFuZFJhbmdlKSB7XG4gICAgICAgIHN1YnNldCA9IGV4cGFuZFJlY3VycmluZyhzdWJzZXQsIGV4cGFuZFJhbmdlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRXZlbnRTdG9yZXMoZXZlbnRTdG9yZSwgc3Vic2V0KTtcbn1cbmZ1bmN0aW9uIHJlem9uZUV2ZW50U3RvcmVEYXRlcyhldmVudFN0b3JlLCBvbGREYXRlRW52LCBuZXdEYXRlRW52KSB7XG4gICAgbGV0IHsgZGVmcyB9ID0gZXZlbnRTdG9yZTtcbiAgICBsZXQgaW5zdGFuY2VzID0gbWFwSGFzaChldmVudFN0b3JlLmluc3RhbmNlcywgKGluc3RhbmNlKSA9PiB7XG4gICAgICAgIGxldCBkZWYgPSBkZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgaWYgKGRlZi5hbGxEYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsgLy8gaXNuJ3QgZGVwZW5kZW50IG9uIHRpbWV6b25lXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5zdGFuY2UpLCB7IHJhbmdlOiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG5ld0RhdGVFbnYuY3JlYXRlTWFya2VyKG9sZERhdGVFbnYudG9EYXRlKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBpbnN0YW5jZS5mb3JjZWRTdGFydFR6bykpLFxuICAgICAgICAgICAgICAgIGVuZDogbmV3RGF0ZUVudi5jcmVhdGVNYXJrZXIob2xkRGF0ZUVudi50b0RhdGUoaW5zdGFuY2UucmFuZ2UuZW5kLCBpbnN0YW5jZS5mb3JjZWRFbmRUem8pKSxcbiAgICAgICAgICAgIH0sIGZvcmNlZFN0YXJ0VHpvOiBuZXdEYXRlRW52LmNhbkNvbXB1dGVPZmZzZXQgPyBudWxsIDogaW5zdGFuY2UuZm9yY2VkU3RhcnRUem8sIGZvcmNlZEVuZFR6bzogbmV3RGF0ZUVudi5jYW5Db21wdXRlT2Zmc2V0ID8gbnVsbCA6IGluc3RhbmNlLmZvcmNlZEVuZFR6byB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4geyBkZWZzLCBpbnN0YW5jZXMgfTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVFdmVudHNCeVNvdXJjZUlkKGV2ZW50U3RvcmUsIHNvdXJjZUlkKSB7XG4gICAgcmV0dXJuIGZpbHRlckV2ZW50U3RvcmVEZWZzKGV2ZW50U3RvcmUsIChldmVudERlZikgPT4gZXZlbnREZWYuc291cmNlSWQgIT09IHNvdXJjZUlkKTtcbn1cbi8vIFFVRVNUSU9OOiB3aHkgbm90IGp1c3QgcmV0dXJuIGluc3RhbmNlcz8gZG8gYSBnZW5lcmFsIG9iamVjdC1wcm9wZXJ0eS1leGNsdXNpb24gdXRpbFxuZnVuY3Rpb24gZXhjbHVkZUluc3RhbmNlcyhldmVudFN0b3JlLCByZW1vdmFscykge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZnM6IGV2ZW50U3RvcmUuZGVmcyxcbiAgICAgICAgaW5zdGFuY2VzOiBmaWx0ZXJIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCAoaW5zdGFuY2UpID0+ICFyZW1vdmFsc1tpbnN0YW5jZS5pbnN0YW5jZUlkXSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUHVibGljSWRNYXBzKGV2ZW50U3RvcmUpIHtcbiAgICBjb25zdCB7IGRlZnMsIGluc3RhbmNlcyB9ID0gZXZlbnRTdG9yZTtcbiAgICBjb25zdCBkZWZJZE1hcCA9IHt9O1xuICAgIGNvbnN0IGluc3RhbmNlSWRNYXAgPSB7fTtcbiAgICBmb3IgKGxldCBkZWZJZCBpbiBkZWZzKSB7XG4gICAgICAgIGNvbnN0IGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICBjb25zdCB7IHB1YmxpY0lkIH0gPSBkZWY7XG4gICAgICAgIGlmIChwdWJsaWNJZCkge1xuICAgICAgICAgICAgZGVmSWRNYXBbcHVibGljSWRdID0gZGVmSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgIGNvbnN0IGRlZiA9IGRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBjb25zdCB7IHB1YmxpY0lkIH0gPSBkZWY7XG4gICAgICAgIGlmIChwdWJsaWNJZCkge1xuICAgICAgICAgICAgaW5zdGFuY2VJZE1hcFtwdWJsaWNJZF0gPSBpbnN0YW5jZUlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwIH07XG59XG5cbi8vIGhpZ2gtbGV2ZWwgc2VnbWVudGluZy1hd2FyZSB0ZXN0ZXIgZnVuY3Rpb25zXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGlzSW50ZXJhY3Rpb25WYWxpZChpbnRlcmFjdGlvbiwgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBpbnN0YW5jZXMgfSA9IGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHM7XG4gICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgaWYgKCFyYW5nZUNvbnRhaW5zUmFuZ2UoZGF0ZVByb2ZpbGUudmFsaWRSYW5nZSwgaW5zdGFuY2VzW2luc3RhbmNlSWRdLnJhbmdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc05ld1Byb3BzVmFsaWQoeyBldmVudERyYWc6IGludGVyYWN0aW9uIH0sIGNvbnRleHQpOyAvLyBIQUNLOiB0aGUgZXZlbnREcmFnIHByb3BzIGlzIHVzZWQgZm9yIEFMTCBpbnRlcmFjdGlvbnNcbn1cbmZ1bmN0aW9uIGlzRGF0ZVNlbGVjdGlvblZhbGlkKGRhdGVTZWxlY3Rpb24sIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFyYW5nZUNvbnRhaW5zUmFuZ2UoZGF0ZVByb2ZpbGUudmFsaWRSYW5nZSwgZGF0ZVNlbGVjdGlvbi5yYW5nZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNOZXdQcm9wc1ZhbGlkKHsgZGF0ZVNlbGVjdGlvbiB9LCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGlzTmV3UHJvcHNWYWxpZChuZXdQcm9wcywgY29udGV4dCkge1xuICAgIGxldCBjYWxlbmRhclN0YXRlID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgIGxldCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oeyBidXNpbmVzc0hvdXJzOiBjYWxlbmRhclN0YXRlLmJ1c2luZXNzSG91cnMsIGRhdGVTZWxlY3Rpb246ICcnLCBldmVudFN0b3JlOiBjYWxlbmRhclN0YXRlLmV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlczogY2FsZW5kYXJTdGF0ZS5ldmVudFVpQmFzZXMsIGV2ZW50U2VsZWN0aW9uOiAnJywgZXZlbnREcmFnOiBudWxsLCBldmVudFJlc2l6ZTogbnVsbCB9LCBuZXdQcm9wcyk7XG4gICAgcmV0dXJuIChjb250ZXh0LnBsdWdpbkhvb2tzLmlzUHJvcHNWYWxpZCB8fCBpc1Byb3BzVmFsaWQpKHByb3BzLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIGlzUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhID0ge30sIGZpbHRlckNvbmZpZykge1xuICAgIGlmIChzdGF0ZS5ldmVudERyYWcgJiYgIWlzSW50ZXJhY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbiAmJiAhaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBNb3ZpbmcgRXZlbnQgVmFsaWRhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0ludGVyYWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICBsZXQgY3VycmVudFN0YXRlID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgIGxldCBpbnRlcmFjdGlvbiA9IHN0YXRlLmV2ZW50RHJhZzsgLy8gSEFDSzogdGhlIGV2ZW50RHJhZyBwcm9wcyBpcyB1c2VkIGZvciBBTEwgaW50ZXJhY3Rpb25zXG4gICAgbGV0IHN1YmplY3RFdmVudFN0b3JlID0gaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cztcbiAgICBsZXQgc3ViamVjdERlZnMgPSBzdWJqZWN0RXZlbnRTdG9yZS5kZWZzO1xuICAgIGxldCBzdWJqZWN0SW5zdGFuY2VzID0gc3ViamVjdEV2ZW50U3RvcmUuaW5zdGFuY2VzO1xuICAgIGxldCBzdWJqZWN0Q29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhzdWJqZWN0RGVmcywgaW50ZXJhY3Rpb24uaXNFdmVudCA/XG4gICAgICAgIHN0YXRlLmV2ZW50VWlCYXNlcyA6XG4gICAgICAgIHsgJyc6IGN1cnJlbnRTdGF0ZS5zZWxlY3Rpb25Db25maWcgfSk7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzdWJqZWN0Q29uZmlncyA9IG1hcEhhc2goc3ViamVjdENvbmZpZ3MsIGZpbHRlckNvbmZpZyk7XG4gICAgfVxuICAgIC8vIGV4Y2x1ZGUgdGhlIHN1YmplY3QgZXZlbnRzLiBUT0RPOiBleGNsdWRlIGRlZnMgdG9vP1xuICAgIGxldCBvdGhlckV2ZW50U3RvcmUgPSBleGNsdWRlSW5zdGFuY2VzKHN0YXRlLmV2ZW50U3RvcmUsIGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyk7XG4gICAgbGV0IG90aGVyRGVmcyA9IG90aGVyRXZlbnRTdG9yZS5kZWZzO1xuICAgIGxldCBvdGhlckluc3RhbmNlcyA9IG90aGVyRXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgbGV0IG90aGVyQ29uZmlncyA9IGNvbXBpbGVFdmVudFVpcyhvdGhlckRlZnMsIHN0YXRlLmV2ZW50VWlCYXNlcyk7XG4gICAgZm9yIChsZXQgc3ViamVjdEluc3RhbmNlSWQgaW4gc3ViamVjdEluc3RhbmNlcykge1xuICAgICAgICBsZXQgc3ViamVjdEluc3RhbmNlID0gc3ViamVjdEluc3RhbmNlc1tzdWJqZWN0SW5zdGFuY2VJZF07XG4gICAgICAgIGxldCBzdWJqZWN0UmFuZ2UgPSBzdWJqZWN0SW5zdGFuY2UucmFuZ2U7XG4gICAgICAgIGxldCBzdWJqZWN0Q29uZmlnID0gc3ViamVjdENvbmZpZ3Nbc3ViamVjdEluc3RhbmNlLmRlZklkXTtcbiAgICAgICAgbGV0IHN1YmplY3REZWYgPSBzdWJqZWN0RGVmc1tzdWJqZWN0SW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICAvLyBjb25zdHJhaW50XG4gICAgICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHN1YmplY3RDb25maWcuY29uc3RyYWludHMsIHN1YmplY3RSYW5nZSwgb3RoZXJFdmVudFN0b3JlLCBzdGF0ZS5idXNpbmVzc0hvdXJzLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIG92ZXJsYXBcbiAgICAgICAgbGV0IHsgZXZlbnRPdmVybGFwIH0gPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgIGxldCBldmVudE92ZXJsYXBGdW5jID0gdHlwZW9mIGV2ZW50T3ZlcmxhcCA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50T3ZlcmxhcCA6IG51bGw7XG4gICAgICAgIGZvciAobGV0IG90aGVySW5zdGFuY2VJZCBpbiBvdGhlckluc3RhbmNlcykge1xuICAgICAgICAgICAgbGV0IG90aGVySW5zdGFuY2UgPSBvdGhlckluc3RhbmNlc1tvdGhlckluc3RhbmNlSWRdO1xuICAgICAgICAgICAgLy8gaW50ZXJzZWN0ISBldmFsdWF0ZVxuICAgICAgICAgICAgaWYgKHJhbmdlc0ludGVyc2VjdChzdWJqZWN0UmFuZ2UsIG90aGVySW5zdGFuY2UucmFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IG90aGVyT3ZlcmxhcCA9IG90aGVyQ29uZmlnc1tvdGhlckluc3RhbmNlLmRlZklkXS5vdmVybGFwO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNpZGVyIHRoZSBvdGhlciBldmVudCdzIG92ZXJsYXAuIG9ubHkgZG8gdGhpcyBpZiB0aGUgc3ViamVjdCBldmVudCBpcyBhIFwicmVhbFwiIGV2ZW50XG4gICAgICAgICAgICAgICAgaWYgKG90aGVyT3ZlcmxhcCA9PT0gZmFsc2UgJiYgaW50ZXJhY3Rpb24uaXNFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzdWJqZWN0Q29uZmlnLm92ZXJsYXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50T3ZlcmxhcEZ1bmMgJiYgIWV2ZW50T3ZlcmxhcEZ1bmMobmV3IEV2ZW50SW1wbChjb250ZXh0LCBvdGhlckRlZnNbb3RoZXJJbnN0YW5jZS5kZWZJZF0sIG90aGVySW5zdGFuY2UpLCAvLyBzdGlsbCBldmVudFxuICAgICAgICAgICAgICAgIG5ldyBFdmVudEltcGwoY29udGV4dCwgc3ViamVjdERlZiwgc3ViamVjdEluc3RhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBhbGxvdyAoYSBmdW5jdGlvbilcbiAgICAgICAgbGV0IGNhbGVuZGFyRXZlbnRTdG9yZSA9IGN1cnJlbnRTdGF0ZS5ldmVudFN0b3JlOyAvLyBuZWVkIGdsb2JhbC10by1jYWxlbmRhciwgbm90IGxvY2FsIHRvIGNvbXBvbmVudCAoc3BsaXR0YWJsZSlzdGF0ZVxuICAgICAgICBmb3IgKGxldCBzdWJqZWN0QWxsb3cgb2Ygc3ViamVjdENvbmZpZy5hbGxvd3MpIHtcbiAgICAgICAgICAgIGxldCBzdWJqZWN0RGF0ZVNwYW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGVTcGFuTWV0YSksIHsgcmFuZ2U6IHN1YmplY3RJbnN0YW5jZS5yYW5nZSwgYWxsRGF5OiBzdWJqZWN0RGVmLmFsbERheSB9KTtcbiAgICAgICAgICAgIGxldCBvcmlnRGVmID0gY2FsZW5kYXJFdmVudFN0b3JlLmRlZnNbc3ViamVjdERlZi5kZWZJZF07XG4gICAgICAgICAgICBsZXQgb3JpZ0luc3RhbmNlID0gY2FsZW5kYXJFdmVudFN0b3JlLmluc3RhbmNlc1tzdWJqZWN0SW5zdGFuY2VJZF07XG4gICAgICAgICAgICBsZXQgZXZlbnRBcGk7XG4gICAgICAgICAgICBpZiAob3JpZ0RlZikgeyAvLyB3YXMgcHJldmlvdXNseSBpbiB0aGUgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICBldmVudEFwaSA9IG5ldyBFdmVudEltcGwoY29udGV4dCwgb3JpZ0RlZiwgb3JpZ0luc3RhbmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyB3YXMgYW4gZXh0ZXJuYWwgZXZlbnRcbiAgICAgICAgICAgICAgICBldmVudEFwaSA9IG5ldyBFdmVudEltcGwoY29udGV4dCwgc3ViamVjdERlZik7IC8vIG5vIGluc3RhbmNlLCBiZWNhdXNlIGhhZCBubyBkYXRlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdWJqZWN0QWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KHN1YmplY3REYXRlU3BhbiwgY29udGV4dCksIGV2ZW50QXBpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIERhdGUgU2VsZWN0aW9uIFZhbGlkYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZChzdGF0ZSwgY29udGV4dCwgZGF0ZVNwYW5NZXRhLCBmaWx0ZXJDb25maWcpIHtcbiAgICBsZXQgcmVsZXZhbnRFdmVudFN0b3JlID0gc3RhdGUuZXZlbnRTdG9yZTtcbiAgICBsZXQgcmVsZXZhbnREZWZzID0gcmVsZXZhbnRFdmVudFN0b3JlLmRlZnM7XG4gICAgbGV0IHJlbGV2YW50SW5zdGFuY2VzID0gcmVsZXZhbnRFdmVudFN0b3JlLmluc3RhbmNlcztcbiAgICBsZXQgc2VsZWN0aW9uID0gc3RhdGUuZGF0ZVNlbGVjdGlvbjtcbiAgICBsZXQgc2VsZWN0aW9uUmFuZ2UgPSBzZWxlY3Rpb24ucmFuZ2U7XG4gICAgbGV0IHsgc2VsZWN0aW9uQ29uZmlnIH0gPSBjb250ZXh0LmdldEN1cnJlbnREYXRhKCk7XG4gICAgaWYgKGZpbHRlckNvbmZpZykge1xuICAgICAgICBzZWxlY3Rpb25Db25maWcgPSBmaWx0ZXJDb25maWcoc2VsZWN0aW9uQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gY29uc3RyYWludFxuICAgIGlmICghYWxsQ29uc3RyYWludHNQYXNzKHNlbGVjdGlvbkNvbmZpZy5jb25zdHJhaW50cywgc2VsZWN0aW9uUmFuZ2UsIHJlbGV2YW50RXZlbnRTdG9yZSwgc3RhdGUuYnVzaW5lc3NIb3VycywgY29udGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBvdmVybGFwXG4gICAgbGV0IHsgc2VsZWN0T3ZlcmxhcCB9ID0gY29udGV4dC5vcHRpb25zO1xuICAgIGxldCBzZWxlY3RPdmVybGFwRnVuYyA9IHR5cGVvZiBzZWxlY3RPdmVybGFwID09PSAnZnVuY3Rpb24nID8gc2VsZWN0T3ZlcmxhcCA6IG51bGw7XG4gICAgZm9yIChsZXQgcmVsZXZhbnRJbnN0YW5jZUlkIGluIHJlbGV2YW50SW5zdGFuY2VzKSB7XG4gICAgICAgIGxldCByZWxldmFudEluc3RhbmNlID0gcmVsZXZhbnRJbnN0YW5jZXNbcmVsZXZhbnRJbnN0YW5jZUlkXTtcbiAgICAgICAgLy8gaW50ZXJzZWN0ISBldmFsdWF0ZVxuICAgICAgICBpZiAocmFuZ2VzSW50ZXJzZWN0KHNlbGVjdGlvblJhbmdlLCByZWxldmFudEluc3RhbmNlLnJhbmdlKSkge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkNvbmZpZy5vdmVybGFwID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZWxlY3RPdmVybGFwRnVuYyAmJiAhc2VsZWN0T3ZlcmxhcEZ1bmMobmV3IEV2ZW50SW1wbChjb250ZXh0LCByZWxldmFudERlZnNbcmVsZXZhbnRJbnN0YW5jZS5kZWZJZF0sIHJlbGV2YW50SW5zdGFuY2UpLCBudWxsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhbGxvdyAoYSBmdW5jdGlvbilcbiAgICBmb3IgKGxldCBzZWxlY3Rpb25BbGxvdyBvZiBzZWxlY3Rpb25Db25maWcuYWxsb3dzKSB7XG4gICAgICAgIGxldCBmdWxsRGF0ZVNwYW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdGVTcGFuTWV0YSksIHNlbGVjdGlvbik7XG4gICAgICAgIGlmICghc2VsZWN0aW9uQWxsb3coYnVpbGREYXRlU3BhbkFwaVdpdGhDb250ZXh0KGZ1bGxEYXRlU3BhbiwgY29udGV4dCksIG51bGwpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBDb25zdHJhaW50IFV0aWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGFsbENvbnN0cmFpbnRzUGFzcyhjb25zdHJhaW50cywgc3ViamVjdFJhbmdlLCBvdGhlckV2ZW50U3RvcmUsIGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBjb250ZXh0KSB7XG4gICAgZm9yIChsZXQgY29uc3RyYWludCBvZiBjb25zdHJhaW50cykge1xuICAgICAgICBpZiAoIWFueVJhbmdlc0NvbnRhaW5SYW5nZShjb25zdHJhaW50VG9SYW5nZXMoY29uc3RyYWludCwgc3ViamVjdFJhbmdlLCBvdGhlckV2ZW50U3RvcmUsIGJ1c2luZXNzSG91cnNVbmV4cGFuZGVkLCBjb250ZXh0KSwgc3ViamVjdFJhbmdlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY29uc3RyYWludFRvUmFuZ2VzKGNvbnN0cmFpbnQsIHN1YmplY3RSYW5nZSwgLy8gZm9yIGV4cGFuZGluZyBhIHJlY3VycmluZyBjb25zdHJhaW50LCBvciBleHBhbmRpbmcgYnVzaW5lc3MgaG91cnNcbm90aGVyRXZlbnRTdG9yZSwgLy8gZm9yIGlmIGNvbnN0cmFpbnQgaXMgYW4gZXZlbiBncm91cCBJRFxuYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQsIC8vIGZvciBpZiBjb25zdHJhaW50IGlzICdidXNpbmVzc0hvdXJzJ1xuY29udGV4dCkge1xuICAgIGlmIChjb25zdHJhaW50ID09PSAnYnVzaW5lc3NIb3VycycpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmVUb1JhbmdlcyhleHBhbmRSZWN1cnJpbmcoYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQsIHN1YmplY3RSYW5nZSwgY29udGV4dCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnQgPT09ICdzdHJpbmcnKSB7IC8vIGFuIGdyb3VwIElEXG4gICAgICAgIHJldHVybiBldmVudFN0b3JlVG9SYW5nZXMoZmlsdGVyRXZlbnRTdG9yZURlZnMob3RoZXJFdmVudFN0b3JlLCAoZXZlbnREZWYpID0+IGV2ZW50RGVmLmdyb3VwSWQgPT09IGNvbnN0cmFpbnQpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb25zdHJhaW50ID09PSAnb2JqZWN0JyAmJiBjb25zdHJhaW50KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByZXR1cm4gZXZlbnRTdG9yZVRvUmFuZ2VzKGV4cGFuZFJlY3VycmluZyhjb25zdHJhaW50LCBzdWJqZWN0UmFuZ2UsIGNvbnRleHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdOyAvLyBpZiBpdCdzIGZhbHNlXG59XG4vLyBUT0RPOiBtb3ZlIHRvIGV2ZW50LXN0b3JlIGZpbGU/XG5mdW5jdGlvbiBldmVudFN0b3JlVG9SYW5nZXMoZXZlbnRTdG9yZSkge1xuICAgIGxldCB7IGluc3RhbmNlcyB9ID0gZXZlbnRTdG9yZTtcbiAgICBsZXQgcmFuZ2VzID0gW107XG4gICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goaW5zdGFuY2VzW2luc3RhbmNlSWRdLnJhbmdlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cbi8vIFRPRE86IG1vdmUgdG8gZ2VvbSBmaWxlP1xuZnVuY3Rpb24gYW55UmFuZ2VzQ29udGFpblJhbmdlKG91dGVyUmFuZ2VzLCBpbm5lclJhbmdlKSB7XG4gICAgZm9yIChsZXQgb3V0ZXJSYW5nZSBvZiBvdXRlclJhbmdlcykge1xuICAgICAgICBpZiAocmFuZ2VDb250YWluc1JhbmdlKG91dGVyUmFuZ2UsIGlubmVyUmFuZ2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmNsYXNzIEpzb25SZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXF1ZXN0SnNvbihtZXRob2QsIHVybCwgcGFyYW1zKSB7XG4gICAgbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3QgZmV0Y2hPcHRpb25zID0ge1xuICAgICAgICBtZXRob2QsXG4gICAgfTtcbiAgICBpZiAobWV0aG9kID09PSAnR0VUJykge1xuICAgICAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArXG4gICAgICAgICAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmZXRjaE9wdGlvbnMuYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKTtcbiAgICAgICAgZmV0Y2hPcHRpb25zLmhlYWRlcnMgPSB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucykudGhlbigoZmV0Y2hSZXMpID0+IHtcbiAgICAgICAgaWYgKGZldGNoUmVzLm9rKSB7XG4gICAgICAgICAgICByZXR1cm4gZmV0Y2hSZXMuanNvbigpLnRoZW4oKHBhcnNlZFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtwYXJzZWRSZXNwb25zZSwgZmV0Y2hSZXNdO1xuICAgICAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc29uUmVxdWVzdEVycm9yKCdGYWlsdXJlIHBhcnNpbmcgSlNPTicsIGZldGNoUmVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25SZXF1ZXN0RXJyb3IoJ1JlcXVlc3QgZmFpbGVkJywgZmV0Y2hSZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmNsYXNzIERlbGF5ZWRSdW5uZXIge1xuICAgIGNvbnN0cnVjdG9yKGRyYWluZWRPcHRpb24pIHtcbiAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uID0gZHJhaW5lZE9wdGlvbjtcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGF1c2VEZXB0aHMgPSB7fTtcbiAgICAgICAgdGhpcy50aW1lb3V0SWQgPSAwO1xuICAgIH1cbiAgICByZXF1ZXN0KGRlbGF5KSB7XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5pc1BhdXNlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgICAgICAgICAgaWYgKGRlbGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyeURyYWluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoLy8gTk9UIE9QVElNQUwhIFRPRE86IGxvb2sgYXQgZGVib3VuY2VcbiAgICAgICAgICAgICAgICB0aGlzLnRyeURyYWluLmJpbmQodGhpcyksIGRlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXVzZShzY29wZSA9ICcnKSB7XG4gICAgICAgIGxldCB7IHBhdXNlRGVwdGhzIH0gPSB0aGlzO1xuICAgICAgICBwYXVzZURlcHRoc1tzY29wZV0gPSAocGF1c2VEZXB0aHNbc2NvcGVdIHx8IDApICsgMTtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgICB9XG4gICAgcmVzdW1lKHNjb3BlID0gJycsIGZvcmNlKSB7XG4gICAgICAgIGxldCB7IHBhdXNlRGVwdGhzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoc2NvcGUgaW4gcGF1c2VEZXB0aHMpIHtcbiAgICAgICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXVzZURlcHRoc1tzY29wZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXVzZURlcHRoc1tzY29wZV0gLT0gMTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSBwYXVzZURlcHRoc1tzY29wZV07XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhdXNlRGVwdGhzW3Njb3BlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyeURyYWluKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnBhdXNlRGVwdGhzKS5sZW5ndGg7XG4gICAgfVxuICAgIHRyeURyYWluKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNSdW5uaW5nICYmICF0aGlzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWluZWQoKTsgLy8gbWlnaHQgc2V0IGlzRGlydHkgdG8gdHJ1ZSBhZ2FpblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGF1c2VEZXB0aHMgPSB7fTtcbiAgICB9XG4gICAgY2xlYXJUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhaW5lZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZHJhaW5lZE9wdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IFZJU0lCTEVfSElEREVOX1JFID0gL14odmlzaWJsZXxoaWRkZW4pJC87XG5jbGFzcyBTY3JvbGxlciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmhhbmRsZUVsID0gKGVsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBzZXRSZWYodGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBsaXF1aWQsIGxpcXVpZElzQWJzb2x1dGUgfSA9IHByb3BzO1xuICAgICAgICBsZXQgaXNBYnNvbHV0ZSA9IGxpcXVpZCAmJiBsaXF1aWRJc0Fic29sdXRlO1xuICAgICAgICBsZXQgY2xhc3NOYW1lID0gWydmYy1zY3JvbGxlciddO1xuICAgICAgICBpZiAobGlxdWlkKSB7XG4gICAgICAgICAgICBpZiAobGlxdWlkSXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKCdmYy1zY3JvbGxlci1saXF1aWQtYWJzb2x1dGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5wdXNoKCdmYy1zY3JvbGxlci1saXF1aWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiB0aGlzLmhhbmRsZUVsLCBjbGFzc05hbWU6IGNsYXNzTmFtZS5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dYOiBwcm9wcy5vdmVyZmxvd1gsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3dZOiBwcm9wcy5vdmVyZmxvd1ksXG4gICAgICAgICAgICAgICAgbGVmdDogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUxlZnQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAoaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lUmlnaHQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogKGlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVMZWZ0IHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodDogKCFpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVSaWdodCB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAoIWlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUJvdHRvbSB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBwcm9wcy5tYXhIZWlnaHQgfHwgJycsXG4gICAgICAgICAgICB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIG5lZWRzWFNjcm9sbGluZygpIHtcbiAgICAgICAgaWYgKFZJU0lCTEVfSElEREVOX1JFLnRlc3QodGhpcy5wcm9wcy5vdmVyZmxvd1gpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGVzdGluZyBzY3JvbGxXaWR0aD5jbGllbnRXaWR0aCBpcyB1bnJlbGlhYmxlIGNyb3NzLWJyb3dzZXIgd2hlbiBwaXhlbCBoZWlnaHRzIGFyZW4ndCBpbnRlZ2Vycy5cbiAgICAgICAgLy8gbXVjaCBtb3JlIHJlbGlhYmxlIHRvIHNlZSBpZiBjaGlsZHJlbiBhcmUgdGFsbGVyIHRoYW4gdGhlIHNjcm9sbGVyLCBldmVuIHRobyBkb2Vzbid0IGFjY291bnQgZm9yXG4gICAgICAgIC8vIGlubmVyLWNoaWxkIG1hcmdpbnMgYW5kIGFic29sdXRlIHBvc2l0aW9uaW5nXG4gICAgICAgIGxldCB7IGVsIH0gPSB0aGlzO1xuICAgICAgICBsZXQgcmVhbENsaWVudFdpZHRoID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHRoaXMuZ2V0WVNjcm9sbGJhcldpZHRoKCk7XG4gICAgICAgIGxldCB7IGNoaWxkcmVuIH0gPSBlbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgbGV0IGNoaWxkRWwgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjaGlsZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoID4gcmVhbENsaWVudFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBuZWVkc1lTY3JvbGxpbmcoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dZKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRlc3Rpbmcgc2Nyb2xsSGVpZ2h0PmNsaWVudEhlaWdodCBpcyB1bnJlbGlhYmxlIGNyb3NzLWJyb3dzZXIgd2hlbiBwaXhlbCBoZWlnaHRzIGFyZW4ndCBpbnRlZ2Vycy5cbiAgICAgICAgLy8gbXVjaCBtb3JlIHJlbGlhYmxlIHRvIHNlZSBpZiBjaGlsZHJlbiBhcmUgdGFsbGVyIHRoYW4gdGhlIHNjcm9sbGVyLCBldmVuIHRobyBkb2Vzbid0IGFjY291bnQgZm9yXG4gICAgICAgIC8vIGlubmVyLWNoaWxkIG1hcmdpbnMgYW5kIGFic29sdXRlIHBvc2l0aW9uaW5nXG4gICAgICAgIGxldCB7IGVsIH0gPSB0aGlzO1xuICAgICAgICBsZXQgcmVhbENsaWVudEhlaWdodCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IC0gdGhpcy5nZXRYU2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgbGV0IHsgY2hpbGRyZW4gfSA9IGVsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRFbCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ID4gcmVhbENsaWVudEhlaWdodCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0WFNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICBpZiAoVklTSUJMRV9ISURERU5fUkUudGVzdCh0aGlzLnByb3BzLm92ZXJmbG93WCkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsLm9mZnNldEhlaWdodCAtIHRoaXMuZWwuY2xpZW50SGVpZ2h0OyAvLyBvbmx5IHdvcmtzIGJlY2F1c2Ugd2UgZ3VhcmFudGVlIG5vIGJvcmRlcnMuIFRPRE86IGFkZCB0byBDU1Mgd2l0aCBpbXBvcnRhbnQ/XG4gICAgfVxuICAgIGdldFlTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgICAgaWYgKFZJU0lCTEVfSElEREVOX1JFLnRlc3QodGhpcy5wcm9wcy5vdmVyZmxvd1kpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lbC5vZmZzZXRXaWR0aCAtIHRoaXMuZWwuY2xpZW50V2lkdGg7IC8vIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWUgbm8gYm9yZGVycy4gVE9ETzogYWRkIHRvIENTUyB3aXRoIGltcG9ydGFudD9cbiAgICB9XG59XG5cbi8qXG5UT0RPOiBzb21laG93IGluZmVyIE90aGVyQXJncyBmcm9tIG1hc3RlckNhbGxiYWNrP1xuVE9ETzogaW5mZXIgUmVmVHlwZSBmcm9tIG1hc3RlckNhbGxiYWNrIGlmIHByb3ZpZGVkXG4qL1xuY2xhc3MgUmVmTWFwIHtcbiAgICBjb25zdHJ1Y3RvcihtYXN0ZXJDYWxsYmFjaykge1xuICAgICAgICB0aGlzLm1hc3RlckNhbGxiYWNrID0gbWFzdGVyQ2FsbGJhY2s7XG4gICAgICAgIHRoaXMuY3VycmVudE1hcCA9IHt9O1xuICAgICAgICB0aGlzLmRlcHRocyA9IHt9O1xuICAgICAgICB0aGlzLmNhbGxiYWNrTWFwID0ge307XG4gICAgICAgIHRoaXMuaGFuZGxlVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGRlcHRocywgY3VycmVudE1hcCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBmb3IgYnVnLi4uIEFDVFVBTExZOiBjYW4gcHJvYmFibHkgZG8gYXdheSB3aXRoIHRoaXMgbm93IHRoYXQgY2FsbGVycyBkb24ndCBzaGFyZSBudW1lcmljIGluZGljZXMgYW55bW9yZVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSAoa2V5IGluIGN1cnJlbnRNYXApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXBba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICBkZXB0aHNba2V5XSA9IChkZXB0aHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVwdGhzW2tleV0gLT0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWRlcHRoc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXJyZW50TWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhbGxiYWNrTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLm1hc3RlckNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXN0ZXJDYWxsYmFjayhudWxsLCBTdHJpbmcoa2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc3RlckNhbGxiYWNrKHZhbCwgU3RyaW5nKGtleSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgY3JlYXRlUmVmKGtleSkge1xuICAgICAgICBsZXQgcmVmQ2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrTWFwW2tleV07XG4gICAgICAgIGlmICghcmVmQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJlZkNhbGxiYWNrID0gdGhpcy5jYWxsYmFja01hcFtrZXldID0gKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVmFsdWUodmFsLCBTdHJpbmcoa2V5KSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZDYWxsYmFjaztcbiAgICB9XG4gICAgLy8gVE9ETzogY2hlY2sgY2FsbGVycyB0aGF0IGRvbid0IGNhcmUgYWJvdXQgb3JkZXIuIHNob3VsZCB1c2UgZ2V0QWxsIGluc3RlYWRcbiAgICAvLyBOT1RFOiB0aGlzIG1ldGhvZCBoYXMgYmVjb21lIGxlc3MgdmFsdWFibGUgbm93IHRoYXQgd2UgYXJlIGVuY291cmFnZWQgdG8gbWFwIG9yZGVyIGJ5IHNvbWUgb3RoZXIgaW5kZXhcbiAgICAvLyBUT0RPOiBwcm92aWRlIE9ORSBhcnJheS1leHBvcnQgZnVuY3Rpb24sIGJ1aWxkQXJyYXksIHdoaWNoIGZhaWxzIG9uIG5vbi1udW1lcmljIGluZGV4ZXMuIGNhbGxlciBjYW4gbWFuaXB1bGF0ZSBhbmQgXCJjb2xsZWN0XCJcbiAgICBjb2xsZWN0KHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzdGVwKSB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0RnJvbUhhc2godGhpcy5jdXJyZW50TWFwLCBzdGFydEluZGV4LCBlbmRJbmRleCwgc3RlcCk7XG4gICAgfVxuICAgIGdldEFsbCgpIHtcbiAgICAgICAgcmV0dXJuIGhhc2hWYWx1ZXNUb0FycmF5KHRoaXMuY3VycmVudE1hcCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlU2hyaW5rV2lkdGgoY2h1bmtFbHMpIHtcbiAgICBsZXQgc2hyaW5rQ2VsbHMgPSBmaW5kRWxlbWVudHMoY2h1bmtFbHMsICcuZmMtc2Nyb2xsZ3JpZC1zaHJpbmsnKTtcbiAgICBsZXQgbGFyZ2VzdFdpZHRoID0gMDtcbiAgICBmb3IgKGxldCBzaHJpbmtDZWxsIG9mIHNocmlua0NlbGxzKSB7XG4gICAgICAgIGxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoKHNocmlua0NlbGwpKTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguY2VpbChsYXJnZXN0V2lkdGgpOyAvLyA8dGFibGU+IGVsZW1lbnRzIHdvcmsgYmVzdCB3aXRoIGludGVnZXJzLiByb3VuZCB1cCB0byBlbnN1cmUgY29udGVudHMgZml0c1xufVxuZnVuY3Rpb24gZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodChwcm9wcywgc2VjdGlvbkNvbmZpZykge1xuICAgIHJldHVybiBwcm9wcy5saXF1aWQgJiYgc2VjdGlvbkNvbmZpZy5saXF1aWQ7IC8vIGRvZXMgdGhlIHNlY3Rpb24gZG8gbGlxdWlkLWhlaWdodD8gKG5lZWQgdG8gaGF2ZSB3aG9sZSBzY3JvbGxncmlkIGxpcXVpZC1oZWlnaHQgYXMgd2VsbClcbn1cbmZ1bmN0aW9uIGdldEFsbG93WVNjcm9sbGluZyhwcm9wcywgc2VjdGlvbkNvbmZpZykge1xuICAgIHJldHVybiBzZWN0aW9uQ29uZmlnLm1heEhlaWdodCAhPSBudWxsIHx8IC8vIGlmIGl0cyBwb3NzaWJsZSBmb3IgdGhlIGhlaWdodCB0byBtYXggb3V0LCB3ZSBtaWdodCBuZWVkIHNjcm9sbGJhcnNcbiAgICAgICAgZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodChwcm9wcywgc2VjdGlvbkNvbmZpZyk7IC8vIGlmIHRoZSBzZWN0aW9uIGlzIGxpcXVpZCBoZWlnaHQsIGl0IG1pZ2h0IGNvbmRlbnNlIGVub3VnaCB0byByZXF1aXJlIHNjcm9sbGJhcnNcbn1cbi8vIFRPRE86IE9OTFkgdXNlIGBhcmdgLiBmb3JjZSBvdXQgaW50ZXJuYWwgZnVuY3Rpb24gdG8gdXNlIHNhbWUgQVBJXG5mdW5jdGlvbiByZW5kZXJDaHVua0NvbnRlbnQoc2VjdGlvbkNvbmZpZywgY2h1bmtDb25maWcsIGFyZywgaXNIZWFkZXIpIHtcbiAgICBsZXQgeyBleHBhbmRSb3dzIH0gPSBhcmc7XG4gICAgbGV0IGNvbnRlbnQgPSB0eXBlb2YgY2h1bmtDb25maWcuY29udGVudCA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIGNodW5rQ29uZmlnLmNvbnRlbnQoYXJnKSA6XG4gICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KCd0YWJsZScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiBbXG4gICAgICAgICAgICAgICAgY2h1bmtDb25maWcudGFibGVDbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgc2VjdGlvbkNvbmZpZy5zeW5jUm93SGVpZ2h0cyA/ICdmYy1zY3JvbGxncmlkLXN5bmMtdGFibGUnIDogJycsXG4gICAgICAgICAgICBdLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IGFyZy50YWJsZU1pbldpZHRoLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBhcmcuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBleHBhbmRSb3dzID8gYXJnLmNsaWVudEhlaWdodCA6ICcnLCAvLyBjc3MgYGhlaWdodGAgb24gYSA8dGFibGU+IHNlcnZlcyBhcyBhIG1pbi1oZWlnaHRcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sIGFyZy50YWJsZUNvbEdyb3VwTm9kZSwgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoaXNIZWFkZXIgPyAndGhlYWQnIDogJ3Rib2R5Jywge1xuICAgICAgICAgICAgcm9sZTogJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgIH0sIHR5cGVvZiBjaHVua0NvbmZpZy5yb3dDb250ZW50ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGNodW5rQ29uZmlnLnJvd0NvbnRlbnQoYXJnKVxuICAgICAgICAgICAgOiBjaHVua0NvbmZpZy5yb3dDb250ZW50KSk7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5mdW5jdGlvbiBpc0NvbFByb3BzRXF1YWwoY29sczAsIGNvbHMxKSB7XG4gICAgcmV0dXJuIGlzQXJyYXlzRXF1YWwoY29sczAsIGNvbHMxLCBpc1Byb3BzRXF1YWwpO1xufVxuZnVuY3Rpb24gcmVuZGVyTWljcm9Db2xHcm91cChjb2xzLCBzaHJpbmtXaWR0aCkge1xuICAgIGxldCBjb2xOb2RlcyA9IFtdO1xuICAgIC8qXG4gICAgZm9yIENvbFByb3BzIHdpdGggc3BhbnMsIGl0IHdvdWxkIGhhdmUgYmVlbiBncmVhdCB0byBtYWtlIGEgc2luZ2xlIDxjb2wgc3Bhbj1cIlwiPlxuICAgIEhPV0VWRVIsIENocm9tZSB3YXMgZ2V0dGluZyBtZXNzaW5nIHVwIGRpc3RyaWJ1dGluZyB0aGUgd2lkdGggdG8gPHRkPi88dGg+IGVsZW1lbnRzIHdpdGggY29sc3BhbnMuXG4gICAgU09MVVRJT046IG1ha2luZyBpbmRpdmlkdWFsIDxjb2w+IGVsZW1lbnRzIG1ha2VzIENocm9tZSBiZWhhdmUuXG4gICAgKi9cbiAgICBmb3IgKGxldCBjb2xQcm9wcyBvZiBjb2xzKSB7XG4gICAgICAgIGxldCBzcGFuID0gY29sUHJvcHMuc3BhbiB8fCAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW47IGkgKz0gMSkge1xuICAgICAgICAgICAgY29sTm9kZXMucHVzaChwcmVhY3QuY3JlYXRlRWxlbWVudChcImNvbFwiLCB7IHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb2xQcm9wcy53aWR0aCA9PT0gJ3NocmluaycgPyBzYW5pdGl6ZVNocmlua1dpZHRoKHNocmlua1dpZHRoKSA6IChjb2xQcm9wcy53aWR0aCB8fCAnJyksXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBjb2xQcm9wcy5taW5XaWR0aCB8fCAnJyxcbiAgICAgICAgICAgICAgICB9IH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2NvbGdyb3VwJywge30sIC4uLmNvbE5vZGVzKTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU2hyaW5rV2lkdGgoc2hyaW5rV2lkdGgpIHtcbiAgICAvKiB3aHkgND8gaWYgd2UgZG8gMCwgaXQgd2lsbCBraWxsIGFueSBib3JkZXIsIHdoaWNoIGFyZSBuZWVkZWQgZm9yIGNvbXB1dGVTbWFsbGVzdENlbGxXaWR0aFxuICAgIDQgYWNjb3VudHMgZm9yIDIgMi1waXhlbCBib3JkZXJzLiBUT0RPOiBiZXR0ZXIgc29sdXRpb24/ICovXG4gICAgcmV0dXJuIHNocmlua1dpZHRoID09IG51bGwgPyA0IDogc2hyaW5rV2lkdGg7XG59XG5mdW5jdGlvbiBoYXNTaHJpbmtXaWR0aChjb2xzKSB7XG4gICAgZm9yIChsZXQgY29sIG9mIGNvbHMpIHtcbiAgICAgICAgaWYgKGNvbC53aWR0aCA9PT0gJ3NocmluaycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFNjcm9sbEdyaWRDbGFzc05hbWVzKGxpcXVpZCwgY29udGV4dCkge1xuICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtc2Nyb2xsZ3JpZCcsXG4gICAgICAgIGNvbnRleHQudGhlbWUuZ2V0Q2xhc3MoJ3RhYmxlJyksXG4gICAgXTtcbiAgICBpZiAobGlxdWlkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2Nyb2xsZ3JpZC1saXF1aWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5mdW5jdGlvbiBnZXRTZWN0aW9uQ2xhc3NOYW1lcyhzZWN0aW9uQ29uZmlnLCB3aG9sZVRhYmxlVkdyb3cpIHtcbiAgICBsZXQgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgJ2ZjLXNjcm9sbGdyaWQtc2VjdGlvbicsXG4gICAgICAgIGBmYy1zY3JvbGxncmlkLXNlY3Rpb24tJHtzZWN0aW9uQ29uZmlnLnR5cGV9YCxcbiAgICAgICAgc2VjdGlvbkNvbmZpZy5jbGFzc05hbWUsIC8vIHVzZWQ/XG4gICAgXTtcbiAgICBpZiAod2hvbGVUYWJsZVZHcm93ICYmIHNlY3Rpb25Db25maWcubGlxdWlkICYmIHNlY3Rpb25Db25maWcubWF4SGVpZ2h0ID09IG51bGwpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLXNlY3Rpb24tbGlxdWlkJyk7XG4gICAgfVxuICAgIGlmIChzZWN0aW9uQ29uZmlnLmlzU3RpY2t5KSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLXN0aWNreScpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIHJlbmRlclNjcm9sbFNoaW0oYXJnKSB7XG4gICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1zY3JvbGxncmlkLXN0aWNreS1zaGltXCIsIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogYXJnLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgbWluV2lkdGg6IGFyZy50YWJsZU1pbldpZHRoLFxuICAgICAgICB9IH0pKTtcbn1cbmZ1bmN0aW9uIGdldFN0aWNreUhlYWRlckRhdGVzKG9wdGlvbnMpIHtcbiAgICBsZXQgeyBzdGlja3lIZWFkZXJEYXRlcyB9ID0gb3B0aW9ucztcbiAgICBpZiAoc3RpY2t5SGVhZGVyRGF0ZXMgPT0gbnVsbCB8fCBzdGlja3lIZWFkZXJEYXRlcyA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHN0aWNreUhlYWRlckRhdGVzID0gb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLnZpZXdIZWlnaHQgPT09ICdhdXRvJztcbiAgICB9XG4gICAgcmV0dXJuIHN0aWNreUhlYWRlckRhdGVzO1xufVxuZnVuY3Rpb24gZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyKG9wdGlvbnMpIHtcbiAgICBsZXQgeyBzdGlja3lGb290ZXJTY3JvbGxiYXIgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHN0aWNreUZvb3RlclNjcm9sbGJhciA9PSBudWxsIHx8IHN0aWNreUZvb3RlclNjcm9sbGJhciA9PT0gJ2F1dG8nKSB7XG4gICAgICAgIHN0aWNreUZvb3RlclNjcm9sbGJhciA9IG9wdGlvbnMuaGVpZ2h0ID09PSAnYXV0bycgfHwgb3B0aW9ucy52aWV3SGVpZ2h0ID09PSAnYXV0byc7XG4gICAgfVxuICAgIHJldHVybiBzdGlja3lGb290ZXJTY3JvbGxiYXI7XG59XG5cbmNsYXNzIFNpbXBsZVNjcm9sbEdyaWQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzQ29scyA9IG1lbW9pemUoKGEpID0+IGEsIGlzQ29sUHJvcHNFcXVhbCk7IC8vIHNvIHdlIGdldCBzYW1lIGBjb2xzYCBwcm9wcyBldmVyeSB0aW1lXG4gICAgICAgIC8vIHl1Y2t5IHRvIG1lbW9pemUgVk5vZGVzLCBidXQgbXVjaCBtb3JlIGVmZmljaWVudCBmb3IgY29uc3VtZXJzXG4gICAgICAgIHRoaXMucmVuZGVyTWljcm9Db2xHcm91cCA9IG1lbW9pemUocmVuZGVyTWljcm9Db2xHcm91cCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJSZWZzID0gbmV3IFJlZk1hcCgpO1xuICAgICAgICB0aGlzLnNjcm9sbGVyRWxSZWZzID0gbmV3IFJlZk1hcCh0aGlzLl9oYW5kbGVTY3JvbGxlckVsLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2hyaW5rV2lkdGg6IG51bGwsXG4gICAgICAgICAgICBmb3JjZVlTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgICAgICAgIHNjcm9sbGVyQ2xpZW50V2lkdGhzOiB7fSxcbiAgICAgICAgICAgIHNjcm9sbGVyQ2xpZW50SGVpZ2h0czoge30sXG4gICAgICAgIH07XG4gICAgICAgIC8vIFRPRE86IGNhbiBkbyBhIHJlYWxseSBzaW1wbGUgcHJpbnQtdmlldy4gZG9udCBuZWVkIHRvIGpvaW4gcm93c1xuICAgICAgICB0aGlzLmhhbmRsZVNpemluZyA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2FmZVNldFN0YXRlKE9iamVjdC5hc3NpZ24oeyBzaHJpbmtXaWR0aDogdGhpcy5jb21wdXRlU2hyaW5rV2lkdGgoKSB9LCB0aGlzLmNvbXB1dGVTY3JvbGxlckRpbXMoKSkpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBzdGF0ZSwgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHNlY3Rpb25Db25maWdzID0gcHJvcHMuc2VjdGlvbnMgfHwgW107XG4gICAgICAgIGxldCBjb2xzID0gdGhpcy5wcm9jZXNzQ29scyhwcm9wcy5jb2xzKTtcbiAgICAgICAgbGV0IG1pY3JvQ29sR3JvdXBOb2RlID0gdGhpcy5yZW5kZXJNaWNyb0NvbEdyb3VwKGNvbHMsIHN0YXRlLnNocmlua1dpZHRoKTtcbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBnZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcyhwcm9wcy5saXF1aWQsIGNvbnRleHQpO1xuICAgICAgICBpZiAocHJvcHMuY29sbGFwc2libGVXaWR0aCkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLWNvbGxhcHNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogbWFrZSBEUllcbiAgICAgICAgbGV0IGNvbmZpZ0NudCA9IHNlY3Rpb25Db25maWdzLmxlbmd0aDtcbiAgICAgICAgbGV0IGNvbmZpZ0kgPSAwO1xuICAgICAgICBsZXQgY3VycmVudENvbmZpZztcbiAgICAgICAgbGV0IGhlYWRTZWN0aW9uTm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IGJvZHlTZWN0aW9uTm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IGZvb3RTZWN0aW9uTm9kZXMgPSBbXTtcbiAgICAgICAgd2hpbGUgKGNvbmZpZ0kgPCBjb25maWdDbnQgJiYgKGN1cnJlbnRDb25maWcgPSBzZWN0aW9uQ29uZmlnc1tjb25maWdJXSkudHlwZSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgIGhlYWRTZWN0aW9uTm9kZXMucHVzaCh0aGlzLnJlbmRlclNlY3Rpb24oY3VycmVudENvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIHRydWUpKTtcbiAgICAgICAgICAgIGNvbmZpZ0kgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnYm9keScpIHtcbiAgICAgICAgICAgIGJvZHlTZWN0aW9uTm9kZXMucHVzaCh0aGlzLnJlbmRlclNlY3Rpb24oY3VycmVudENvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIGZhbHNlKSk7XG4gICAgICAgICAgICBjb25maWdJICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGNvbmZpZ0kgPCBjb25maWdDbnQgJiYgKGN1cnJlbnRDb25maWcgPSBzZWN0aW9uQ29uZmlnc1tjb25maWdJXSkudHlwZSA9PT0gJ2Zvb3RlcicpIHtcbiAgICAgICAgICAgIGZvb3RTZWN0aW9uTm9kZXMucHVzaCh0aGlzLnJlbmRlclNlY3Rpb24oY3VycmVudENvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIHRydWUpKTtcbiAgICAgICAgICAgIGNvbmZpZ0kgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaXJlZm94IGJ1Zzogd2hlbiBzZXR0aW5nIGhlaWdodCBvbiB0YWJsZSBhbmQgdGhlcmUgaXMgYSB0aGVhZCBvciB0Zm9vdCxcbiAgICAgICAgLy8gdGhlIG5lY2Vzc2FyeSBoZWlnaHQ6MTAwJSBvbiB0aGUgbGlxdWlkLWhlaWdodCBib2R5IHNlY3Rpb24gZm9yY2VzIHRoZSAqd2hvbGUqIHRhYmxlIHRvIGJlIHRhbGxlci4gKGJ1ZyAjNTUyNClcbiAgICAgICAgLy8gdXNlIGdldENhblZHcm93V2l0aGluQ2VsbCBhcyBhIHdheSB0byBkZXRlY3QgdGFibGUtc3R1cGlkIGZpcmVmb3guXG4gICAgICAgIC8vIGlmIHNvLCB1c2UgYSBzaW1wbGVyIGRvbSBzdHJ1Y3R1cmUsIGphbSBldmVyeXRoaW5nIGludG8gYSBsb25lIHRib2R5LlxuICAgICAgICBsZXQgaXNCdWdneSA9ICFnZXRDYW5WR3Jvd1dpdGhpbkNlbGwoKTtcbiAgICAgICAgY29uc3Qgcm9sZUF0dHJzID0geyByb2xlOiAncm93Z3JvdXAnIH07XG4gICAgICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudCgndGFibGUnLCB7XG4gICAgICAgICAgICByb2xlOiAnZ3JpZCcsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpLFxuICAgICAgICAgICAgc3R5bGU6IHsgaGVpZ2h0OiBwcm9wcy5oZWlnaHQgfSxcbiAgICAgICAgfSwgQm9vbGVhbighaXNCdWdneSAmJiBoZWFkU2VjdGlvbk5vZGVzLmxlbmd0aCkgJiYgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3RoZWFkJywgcm9sZUF0dHJzLCAuLi5oZWFkU2VjdGlvbk5vZGVzKSwgQm9vbGVhbighaXNCdWdneSAmJiBib2R5U2VjdGlvbk5vZGVzLmxlbmd0aCkgJiYgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jywgcm9sZUF0dHJzLCAuLi5ib2R5U2VjdGlvbk5vZGVzKSwgQm9vbGVhbighaXNCdWdneSAmJiBmb290U2VjdGlvbk5vZGVzLmxlbmd0aCkgJiYgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3Rmb290Jywgcm9sZUF0dHJzLCAuLi5mb290U2VjdGlvbk5vZGVzKSwgaXNCdWdneSAmJiBwcmVhY3QuY3JlYXRlRWxlbWVudCgndGJvZHknLCByb2xlQXR0cnMsIC4uLmhlYWRTZWN0aW9uTm9kZXMsIC4uLmJvZHlTZWN0aW9uTm9kZXMsIC4uLmZvb3RTZWN0aW9uTm9kZXMpKTtcbiAgICB9XG4gICAgcmVuZGVyU2VjdGlvbihzZWN0aW9uQ29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgaXNIZWFkZXIpIHtcbiAgICAgICAgaWYgKCdvdXRlckNvbnRlbnQnIGluIHNlY3Rpb25Db25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQocHJlYWN0LkZyYWdtZW50LCB7IGtleTogc2VjdGlvbkNvbmZpZy5rZXkgfSwgc2VjdGlvbkNvbmZpZy5vdXRlckNvbnRlbnQpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwidHJcIiwgeyBrZXk6IHNlY3Rpb25Db25maWcua2V5LCByb2xlOiBcInByZXNlbnRhdGlvblwiLCBjbGFzc05hbWU6IGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHRoaXMucHJvcHMubGlxdWlkKS5qb2luKCcgJykgfSwgdGhpcy5yZW5kZXJDaHVua1RkKHNlY3Rpb25Db25maWcsIG1pY3JvQ29sR3JvdXBOb2RlLCBzZWN0aW9uQ29uZmlnLmNodW5rLCBpc0hlYWRlcikpKTtcbiAgICB9XG4gICAgcmVuZGVyQ2h1bmtUZChzZWN0aW9uQ29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgY2h1bmtDb25maWcsIGlzSGVhZGVyKSB7XG4gICAgICAgIGlmICgnb3V0ZXJDb250ZW50JyBpbiBjaHVua0NvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIGNodW5rQ29uZmlnLm91dGVyQ29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgZm9yY2VZU2Nyb2xsYmFycywgc2Nyb2xsZXJDbGllbnRXaWR0aHMsIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgbGV0IG5lZWRzWVNjcm9sbGluZyA9IGdldEFsbG93WVNjcm9sbGluZyhwcm9wcywgc2VjdGlvbkNvbmZpZyk7IC8vIFRPRE86IGRvIGxhemlseS4gZG8gaW4gc2VjdGlvbiBjb25maWc/XG4gICAgICAgIGxldCBpc0xpcXVpZCA9IGdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQocHJvcHMsIHNlY3Rpb25Db25maWcpO1xuICAgICAgICAvLyBmb3IgYCFwcm9wcy5saXF1aWRgIC0gaXMgV0hPTEUgc2Nyb2xsZ3JpZCBuYXR1cmFsIGhlaWdodD9cbiAgICAgICAgLy8gVE9ETzogZG8gc2FtZSB0aGluZyBpbiBhZHZhbmNlZCBzY3JvbGxncmlkPyBwcm9sbHkgbm90IGIvYyBhbHdheXMgaGFzIGhvcml6b250YWwgc2Nyb2xsYmFyc1xuICAgICAgICBsZXQgb3ZlcmZsb3dZID0gIXByb3BzLmxpcXVpZCA/ICd2aXNpYmxlJyA6XG4gICAgICAgICAgICBmb3JjZVlTY3JvbGxiYXJzID8gJ3Njcm9sbCcgOlxuICAgICAgICAgICAgICAgICFuZWVkc1lTY3JvbGxpbmcgPyAnaGlkZGVuJyA6XG4gICAgICAgICAgICAgICAgICAgICdhdXRvJztcbiAgICAgICAgbGV0IHNlY3Rpb25LZXkgPSBzZWN0aW9uQ29uZmlnLmtleTtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSByZW5kZXJDaHVua0NvbnRlbnQoc2VjdGlvbkNvbmZpZywgY2h1bmtDb25maWcsIHtcbiAgICAgICAgICAgIHRhYmxlQ29sR3JvdXBOb2RlOiBtaWNyb0NvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgIHRhYmxlTWluV2lkdGg6ICcnLFxuICAgICAgICAgICAgY2xpZW50V2lkdGg6ICghcHJvcHMuY29sbGFwc2libGVXaWR0aCAmJiBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSAhPT0gdW5kZWZpbmVkKSA/IHNjcm9sbGVyQ2xpZW50V2lkdGhzW3NlY3Rpb25LZXldIDogbnVsbCxcbiAgICAgICAgICAgIGNsaWVudEhlaWdodDogc2Nyb2xsZXJDbGllbnRIZWlnaHRzW3NlY3Rpb25LZXldICE9PSB1bmRlZmluZWQgPyBzY3JvbGxlckNsaWVudEhlaWdodHNbc2VjdGlvbktleV0gOiBudWxsLFxuICAgICAgICAgICAgZXhwYW5kUm93czogc2VjdGlvbkNvbmZpZy5leHBhbmRSb3dzLFxuICAgICAgICAgICAgc3luY1Jvd0hlaWdodHM6IGZhbHNlLFxuICAgICAgICAgICAgcm93U3luY0hlaWdodHM6IFtdLFxuICAgICAgICAgICAgcmVwb3J0Um93SGVpZ2h0Q2hhbmdlOiAoKSA9PiB7IH0sXG4gICAgICAgIH0sIGlzSGVhZGVyKTtcbiAgICAgICAgcmV0dXJuIHByZWFjdC5jcmVhdGVFbGVtZW50KGlzSGVhZGVyID8gJ3RoJyA6ICd0ZCcsIHtcbiAgICAgICAgICAgIHJlZjogY2h1bmtDb25maWcuZWxSZWYsXG4gICAgICAgICAgICByb2xlOiAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgfSwgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGBmYy1zY3JvbGxlci1oYXJuZXNzJHtpc0xpcXVpZCA/ICcgZmMtc2Nyb2xsZXItaGFybmVzcy1saXF1aWQnIDogJyd9YCB9LFxuICAgICAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHsgcmVmOiB0aGlzLnNjcm9sbGVyUmVmcy5jcmVhdGVSZWYoc2VjdGlvbktleSksIGVsUmVmOiB0aGlzLnNjcm9sbGVyRWxSZWZzLmNyZWF0ZVJlZihzZWN0aW9uS2V5KSwgb3ZlcmZsb3dZOiBvdmVyZmxvd1ksIG92ZXJmbG93WDogIXByb3BzLmxpcXVpZCA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nIC8qIG5hdHVyYWwgaGVpZ2h0PyAqLywgbWF4SGVpZ2h0OiBzZWN0aW9uQ29uZmlnLm1heEhlaWdodCwgbGlxdWlkOiBpc0xpcXVpZCwgbGlxdWlkSXNBYnNvbHV0ZSAvLyBiZWNhdXNlIGl0cyB3aXRoaW4gYSBoYXJuZXNzXG4gICAgICAgICAgICAgICAgOiB0cnVlIH0sIGNvbnRlbnQpKSk7XG4gICAgfVxuICAgIF9oYW5kbGVTY3JvbGxlckVsKHNjcm9sbGVyRWwsIGtleSkge1xuICAgICAgICBsZXQgc2VjdGlvbiA9IGdldFNlY3Rpb25CeUtleSh0aGlzLnByb3BzLnNlY3Rpb25zLCBrZXkpO1xuICAgICAgICBpZiAoc2VjdGlvbikge1xuICAgICAgICAgICAgc2V0UmVmKHNlY3Rpb24uY2h1bmsuc2Nyb2xsZXJFbFJlZiwgc2Nyb2xsZXJFbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2l6aW5nKCk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hZGRSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICAvLyBUT0RPOiBuZWVkIGJldHRlciBzb2x1dGlvbiB3aGVuIHN0YXRlIGNvbnRhaW5zIG5vbi1zaXppbmcgdGhpbmdzXG4gICAgICAgIHRoaXMuaGFuZGxlU2l6aW5nKCk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzaXplSGFuZGxlcih0aGlzLmhhbmRsZVNpemluZyk7XG4gICAgfVxuICAgIGNvbXB1dGVTaHJpbmtXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIGhhc1Nocmlua1dpZHRoKHRoaXMucHJvcHMuY29scylcbiAgICAgICAgICAgID8gY29tcHV0ZVNocmlua1dpZHRoKHRoaXMuc2Nyb2xsZXJFbFJlZnMuZ2V0QWxsKCkpXG4gICAgICAgICAgICA6IDA7XG4gICAgfVxuICAgIGNvbXB1dGVTY3JvbGxlckRpbXMoKSB7XG4gICAgICAgIGxldCBzY3JvbGxiYXJXaWR0aCA9IGdldFNjcm9sbGJhcldpZHRocygpO1xuICAgICAgICBsZXQgeyBzY3JvbGxlclJlZnMsIHNjcm9sbGVyRWxSZWZzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZm9yY2VZU2Nyb2xsYmFycyA9IGZhbHNlO1xuICAgICAgICBsZXQgc2Nyb2xsZXJDbGllbnRXaWR0aHMgPSB7fTtcbiAgICAgICAgbGV0IHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBzZWN0aW9uS2V5IGluIHNjcm9sbGVyUmVmcy5jdXJyZW50TWFwKSB7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsZXIgPSBzY3JvbGxlclJlZnMuY3VycmVudE1hcFtzZWN0aW9uS2V5XTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxlciAmJiBzY3JvbGxlci5uZWVkc1lTY3JvbGxpbmcoKSkge1xuICAgICAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHNlY3Rpb24gb2YgdGhpcy5wcm9wcy5zZWN0aW9ucykge1xuICAgICAgICAgICAgbGV0IHNlY3Rpb25LZXkgPSBzZWN0aW9uLmtleTtcbiAgICAgICAgICAgIGxldCBzY3JvbGxlckVsID0gc2Nyb2xsZXJFbFJlZnMuY3VycmVudE1hcFtzZWN0aW9uS2V5XTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxlckVsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhcm5lc3NFbCA9IHNjcm9sbGVyRWwucGFyZW50Tm9kZTsgLy8gVE9ETzogd2VpcmQgd2F5IHRvIGdldCB0aGlzLiBuZWVkIGhhcm5lc3MgYi9jIGRvZXNuJ3QgaW5jbHVkZSB0YWJsZSBib3JkZXJzXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRXaWR0aHNbc2VjdGlvbktleV0gPSBNYXRoLmZsb29yKGhhcm5lc3NFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIChmb3JjZVlTY3JvbGxiYXJzXG4gICAgICAgICAgICAgICAgICAgID8gc2Nyb2xsYmFyV2lkdGgueSAvLyB1c2UgZ2xvYmFsIGJlY2F1c2Ugc2Nyb2xsZXIgbWlnaHQgbm90IGhhdmUgc2Nyb2xsYmFycyB5ZXQgYnV0IHdpbGwgbmVlZCB0aGVtIGluIGZ1dHVyZVxuICAgICAgICAgICAgICAgICAgICA6IDApKTtcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNsaWVudEhlaWdodHNbc2VjdGlvbktleV0gPSBNYXRoLmZsb29yKGhhcm5lc3NFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZvcmNlWVNjcm9sbGJhcnMsIHNjcm9sbGVyQ2xpZW50V2lkdGhzLCBzY3JvbGxlckNsaWVudEhlaWdodHMgfTtcbiAgICB9XG59XG5TaW1wbGVTY3JvbGxHcmlkLmFkZFN0YXRlRXF1YWxpdHkoe1xuICAgIHNjcm9sbGVyQ2xpZW50V2lkdGhzOiBpc1Byb3BzRXF1YWwsXG4gICAgc2Nyb2xsZXJDbGllbnRIZWlnaHRzOiBpc1Byb3BzRXF1YWwsXG59KTtcbmZ1bmN0aW9uIGdldFNlY3Rpb25CeUtleShzZWN0aW9ucywga2V5KSB7XG4gICAgZm9yIChsZXQgc2VjdGlvbiBvZiBzZWN0aW9ucykge1xuICAgICAgICBpZiAoc2VjdGlvbi5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb247XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNsYXNzIEV2ZW50Q29udGFpbmVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuaGFuZGxlRWwgPSAoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIHNldEVsU2VnKGVsLCB0aGlzLnByb3BzLnNlZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCB7IHNlZyB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IHsgZXZlbnRSYW5nZSB9ID0gc2VnO1xuICAgICAgICBjb25zdCB7IHVpIH0gPSBldmVudFJhbmdlO1xuICAgICAgICBjb25zdCByZW5kZXJQcm9wcyA9IHtcbiAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRJbXBsKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIHRpbWVUZXh0OiBwcm9wcy50aW1lVGV4dCxcbiAgICAgICAgICAgIHRleHRDb2xvcjogdWkudGV4dENvbG9yLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB1aS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICBib3JkZXJDb2xvcjogdWkuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICBpc0RyYWdnYWJsZTogIXByb3BzLmRpc2FibGVEcmFnZ2luZyAmJiBjb21wdXRlU2VnRHJhZ2dhYmxlKHNlZywgY29udGV4dCksXG4gICAgICAgICAgICBpc1N0YXJ0UmVzaXphYmxlOiAhcHJvcHMuZGlzYWJsZVJlc2l6aW5nICYmIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpLFxuICAgICAgICAgICAgaXNFbmRSZXNpemFibGU6ICFwcm9wcy5kaXNhYmxlUmVzaXppbmcgJiYgY29tcHV0ZVNlZ0VuZFJlc2l6YWJsZShzZWcpLFxuICAgICAgICAgICAgaXNNaXJyb3I6IEJvb2xlYW4ocHJvcHMuaXNEcmFnZ2luZyB8fCBwcm9wcy5pc1Jlc2l6aW5nIHx8IHByb3BzLmlzRGF0ZVNlbGVjdGluZyksXG4gICAgICAgICAgICBpc1N0YXJ0OiBCb29sZWFuKHNlZy5pc1N0YXJ0KSxcbiAgICAgICAgICAgIGlzRW5kOiBCb29sZWFuKHNlZy5pc0VuZCksXG4gICAgICAgICAgICBpc1Bhc3Q6IEJvb2xlYW4ocHJvcHMuaXNQYXN0KSxcbiAgICAgICAgICAgIGlzRnV0dXJlOiBCb29sZWFuKHByb3BzLmlzRnV0dXJlKSxcbiAgICAgICAgICAgIGlzVG9kYXk6IEJvb2xlYW4ocHJvcHMuaXNUb2RheSksXG4gICAgICAgICAgICBpc1NlbGVjdGVkOiBCb29sZWFuKHByb3BzLmlzU2VsZWN0ZWQpLFxuICAgICAgICAgICAgaXNEcmFnZ2luZzogQm9vbGVhbihwcm9wcy5pc0RyYWdnaW5nKSxcbiAgICAgICAgICAgIGlzUmVzaXppbmc6IEJvb2xlYW4ocHJvcHMuaXNSZXNpemluZyksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgLyogY29udGFpbnMgY2hpbGRyZW4gKi8sIHsgZWxSZWY6IHRoaXMuaGFuZGxlRWwsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgIC4uLmdldEV2ZW50Q2xhc3NOYW1lcyhyZW5kZXJQcm9wcyksXG4gICAgICAgICAgICAgICAgLi4uc2VnLmV2ZW50UmFuZ2UudWkuY2xhc3NOYW1lcyxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMuZWxDbGFzc2VzIHx8IFtdKSxcbiAgICAgICAgICAgIF0sIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJldmVudENvbnRlbnRcIiwgY3VzdG9tR2VuZXJhdG9yOiBvcHRpb25zLmV2ZW50Q29udGVudCwgZGVmYXVsdEdlbmVyYXRvcjogcHJvcHMuZGVmYXVsdEdlbmVyYXRvciwgY2xhc3NOYW1lR2VuZXJhdG9yOiBvcHRpb25zLmV2ZW50Q2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMuZXZlbnREaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZXZlbnRXaWxsVW5tb3VudCB9KSkpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAgIGlmICh0aGlzLmVsICYmIHRoaXMucHJvcHMuc2VnICE9PSBwcmV2UHJvcHMuc2VnKSB7XG4gICAgICAgICAgICBzZXRFbFNlZyh0aGlzLmVsLCB0aGlzLnByb3BzLnNlZyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIHNob3VsZCBub3QgYmUgYSBwdXJlY29tcG9uZW50XG5jbGFzcyBTdGFuZGFyZEV2ZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICAgICAgbGV0IHsgc2VnIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IHsgdWkgfSA9IHNlZy5ldmVudFJhbmdlO1xuICAgICAgICBsZXQgdGltZUZvcm1hdCA9IG9wdGlvbnMuZXZlbnRUaW1lRm9ybWF0IHx8IHByb3BzLmRlZmF1bHRUaW1lRm9ybWF0O1xuICAgICAgICBsZXQgdGltZVRleHQgPSBidWlsZFNlZ1RpbWVUZXh0KHNlZywgdGltZUZvcm1hdCwgY29udGV4dCwgcHJvcHMuZGVmYXVsdERpc3BsYXlFdmVudFRpbWUsIHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRFbmQpO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KEV2ZW50Q29udGFpbmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyAvKiBpbmNsdWRlcyBlbFJlZiAqLywgeyBlbFRhZzogXCJhXCIsIGVsU3R5bGU6IHtcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogdWkuYm9yZGVyQ29sb3IsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB1aS5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgICAgICB9LCBlbEF0dHJzOiBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpLCBkZWZhdWx0R2VuZXJhdG9yOiByZW5kZXJJbm5lckNvbnRlbnQkMSwgdGltZVRleHQ6IHRpbWVUZXh0IH0pLCAoSW5uZXJDb250ZW50LCBldmVudENvbnRlbnRBcmcpID0+IChwcmVhY3QuY3JlYXRlRWxlbWVudChwcmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChJbm5lckNvbnRlbnQsIHsgZWxUYWc6IFwiZGl2XCIsIGVsQ2xhc3NlczogWydmYy1ldmVudC1tYWluJ10sIGVsU3R5bGU6IHsgY29sb3I6IGV2ZW50Q29udGVudEFyZy50ZXh0Q29sb3IgfSB9KSxcbiAgICAgICAgICAgIEJvb2xlYW4oZXZlbnRDb250ZW50QXJnLmlzU3RhcnRSZXNpemFibGUpICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC1yZXNpemVyIGZjLWV2ZW50LXJlc2l6ZXItc3RhcnRcIiB9KSksXG4gICAgICAgICAgICBCb29sZWFuKGV2ZW50Q29udGVudEFyZy5pc0VuZFJlc2l6YWJsZSkgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXJlc2l6ZXIgZmMtZXZlbnQtcmVzaXplci1lbmRcIiB9KSkpKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudCQxKGlubmVyUHJvcHMpIHtcbiAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LW1haW4tZnJhbWVcIiB9LFxuICAgICAgICBpbm5lclByb3BzLnRpbWVUZXh0ICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aW1lXCIgfSwgaW5uZXJQcm9wcy50aW1lVGV4dCkpLFxuICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZS1jb250YWluZXJcIiB9LFxuICAgICAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGUgZmMtc3RpY2t5XCIgfSwgaW5uZXJQcm9wcy5ldmVudC50aXRsZSB8fCBwcmVhY3QuY3JlYXRlRWxlbWVudChwcmVhY3QuRnJhZ21lbnQsIG51bGwsIFwiXFx1MDBBMFwiKSkpKSk7XG59XG5cbmNvbnN0IE5vd0luZGljYXRvckNvbnRhaW5lciA9IChwcm9wcykgPT4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFZpZXdDb250ZXh0VHlwZS5Db25zdW1lciwgbnVsbCwgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCByZW5kZXJQcm9wcyA9IHtcbiAgICAgICAgaXNBeGlzOiBwcm9wcy5pc0F4aXMsXG4gICAgICAgIGRhdGU6IGNvbnRleHQuZGF0ZUVudi50b0RhdGUocHJvcHMuZGF0ZSksXG4gICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICB9O1xuICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgLyogaW5jbHVkZXMgY2hpbGRyZW4gKi8sIHsgZWxUYWc6IHByb3BzLmVsVGFnIHx8ICdkaXYnLCByZW5kZXJQcm9wczogcmVuZGVyUHJvcHMsIGdlbmVyYXRvck5hbWU6IFwibm93SW5kaWNhdG9yQ29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMubm93SW5kaWNhdG9yQ29udGVudCwgY2xhc3NOYW1lR2VuZXJhdG9yOiBvcHRpb25zLm5vd0luZGljYXRvckNsYXNzTmFtZXMsIGRpZE1vdW50OiBvcHRpb25zLm5vd0luZGljYXRvckRpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5ub3dJbmRpY2F0b3JXaWxsVW5tb3VudCB9KSkpO1xufSkpO1xuXG5jb25zdCBEQVlfTlVNX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IGRheTogJ251bWVyaWMnIH0pO1xuY2xhc3MgRGF5Q2VsbENvbnRhaW5lciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnJlZmluZVJlbmRlclByb3BzID0gbWVtb2l6ZU9iakFyZyhyZWZpbmVSZW5kZXJQcm9wcyk7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgICAgIGxldCByZW5kZXJQcm9wcyA9IHRoaXMucmVmaW5lUmVuZGVyUHJvcHMoe1xuICAgICAgICAgICAgZGF0ZTogcHJvcHMuZGF0ZSxcbiAgICAgICAgICAgIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsXG4gICAgICAgICAgICBpc01vbnRoU3RhcnQ6IHByb3BzLmlzTW9udGhTdGFydCB8fCBmYWxzZSxcbiAgICAgICAgICAgIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsXG4gICAgICAgICAgICBleHRyYVJlbmRlclByb3BzOiBwcm9wcy5leHRyYVJlbmRlclByb3BzLFxuICAgICAgICAgICAgdmlld0FwaTogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgZGF0ZUVudjogY29udGV4dC5kYXRlRW52LFxuICAgICAgICAgICAgbW9udGhTdGFydEZvcm1hdDogb3B0aW9ucy5tb250aFN0YXJ0Rm9ybWF0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyAvKiBpbmNsdWRlcyBjaGlsZHJlbiAqLywgeyBlbENsYXNzZXM6IFtcbiAgICAgICAgICAgICAgICAuLi5nZXREYXlDbGFzc05hbWVzKHJlbmRlclByb3BzLCBjb250ZXh0LnRoZW1lKSxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMuZWxDbGFzc2VzIHx8IFtdKSxcbiAgICAgICAgICAgIF0sIGVsQXR0cnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuZWxBdHRycyksIChyZW5kZXJQcm9wcy5pc0Rpc2FibGVkID8ge30gOiB7ICdkYXRhLWRhdGUnOiBmb3JtYXREYXlTdHJpbmcocHJvcHMuZGF0ZSkgfSkpLCByZW5kZXJQcm9wczogcmVuZGVyUHJvcHMsIGdlbmVyYXRvck5hbWU6IFwiZGF5Q2VsbENvbnRlbnRcIiwgY3VzdG9tR2VuZXJhdG9yOiBvcHRpb25zLmRheUNlbGxDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiBwcm9wcy5kZWZhdWx0R2VuZXJhdG9yLCBjbGFzc05hbWVHZW5lcmF0b3I6IFxuICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIGN1c3RvbSBjbGFzc05hbWVzIGlmIGRpc2FibGVkXG4gICAgICAgICAgICByZW5kZXJQcm9wcy5pc0Rpc2FibGVkID8gdW5kZWZpbmVkIDogb3B0aW9ucy5kYXlDZWxsQ2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMuZGF5Q2VsbERpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5kYXlDZWxsV2lsbFVubW91bnQgfSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoYXNDdXN0b21EYXlDZWxsQ29udGVudChvcHRpb25zKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4ob3B0aW9ucy5kYXlDZWxsQ29udGVudCB8fCBoYXNDdXN0b21SZW5kZXJpbmdIYW5kbGVyKCdkYXlDZWxsQ29udGVudCcsIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIHJlZmluZVJlbmRlclByb3BzKHJhdykge1xuICAgIGxldCB7IGRhdGUsIGRhdGVFbnYsIGRhdGVQcm9maWxlLCBpc01vbnRoU3RhcnQgfSA9IHJhdztcbiAgICBsZXQgZGF5TWV0YSA9IGdldERhdGVNZXRhKGRhdGUsIHJhdy50b2RheVJhbmdlLCBudWxsLCBkYXRlUHJvZmlsZSk7XG4gICAgbGV0IGRheU51bWJlclRleHQgPSByYXcuc2hvd0RheU51bWJlciA/IChkYXRlRW52LmZvcm1hdChkYXRlLCBpc01vbnRoU3RhcnQgPyByYXcubW9udGhTdGFydEZvcm1hdCA6IERBWV9OVU1fRk9STUFUKSkgOiAnJztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBkYXRlOiBkYXRlRW52LnRvRGF0ZShkYXRlKSwgdmlldzogcmF3LnZpZXdBcGkgfSwgZGF5TWV0YSksIHsgaXNNb250aFN0YXJ0LFxuICAgICAgICBkYXlOdW1iZXJUZXh0IH0pLCByYXcuZXh0cmFSZW5kZXJQcm9wcyk7XG59XG5cbmNsYXNzIEJnRXZlbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBzZWcgfSA9IHByb3BzO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KEV2ZW50Q29udGFpbmVyLCB7IGVsVGFnOiBcImRpdlwiLCBlbENsYXNzZXM6IFsnZmMtYmctZXZlbnQnXSwgZWxTdHlsZTogeyBiYWNrZ3JvdW5kQ29sb3I6IHNlZy5ldmVudFJhbmdlLnVpLmJhY2tncm91bmRDb2xvciB9LCBkZWZhdWx0R2VuZXJhdG9yOiByZW5kZXJJbm5lckNvbnRlbnQsIHNlZzogc2VnLCB0aW1lVGV4dDogXCJcIiwgaXNEcmFnZ2luZzogZmFsc2UsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBmYWxzZSwgaXNQYXN0OiBwcm9wcy5pc1Bhc3QsIGlzRnV0dXJlOiBwcm9wcy5pc0Z1dHVyZSwgaXNUb2RheTogcHJvcHMuaXNUb2RheSwgZGlzYWJsZURyYWdnaW5nOiB0cnVlLCBkaXNhYmxlUmVzaXppbmc6IHRydWUgfSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChwcm9wcykge1xuICAgIGxldCB7IHRpdGxlIH0gPSBwcm9wcy5ldmVudDtcbiAgICByZXR1cm4gdGl0bGUgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpdGxlXCIgfSwgcHJvcHMuZXZlbnQudGl0bGUpKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckZpbGwoZmlsbFR5cGUpIHtcbiAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBgZmMtJHtmaWxsVHlwZX1gIH0pKTtcbn1cblxuY29uc3QgV2Vla051bWJlckNvbnRhaW5lciA9IChwcm9wcykgPT4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFZpZXdDb250ZXh0VHlwZS5Db25zdW1lciwgbnVsbCwgKGNvbnRleHQpID0+IHtcbiAgICBsZXQgeyBkYXRlRW52LCBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCB7IGRhdGUgfSA9IHByb3BzO1xuICAgIGxldCBmb3JtYXQgPSBvcHRpb25zLndlZWtOdW1iZXJGb3JtYXQgfHwgcHJvcHMuZGVmYXVsdEZvcm1hdDtcbiAgICBsZXQgbnVtID0gZGF0ZUVudi5jb21wdXRlV2Vla051bWJlcihkYXRlKTsgLy8gVE9ETzogc29tZWhvdyB1c2UgZm9yIGZvcm1hdHRpbmcgYXMgd2VsbD9cbiAgICBsZXQgdGV4dCA9IGRhdGVFbnYuZm9ybWF0KGRhdGUsIGZvcm1hdCk7XG4gICAgbGV0IHJlbmRlclByb3BzID0geyBudW0sIHRleHQsIGRhdGUgfTtcbiAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRDb250YWluZXIgLy8gd2h5IGlzbid0IFdlZWtOdW1iZXJDb250ZW50QXJnIGJlaW5nIGF1dG8tZGV0ZWN0ZWQ/XG4gICAgLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyAvKiBpbmNsdWRlcyBjaGlsZHJlbiAqLywgeyByZW5kZXJQcm9wczogcmVuZGVyUHJvcHMsIGdlbmVyYXRvck5hbWU6IFwid2Vla051bWJlckNvbnRlbnRcIiwgY3VzdG9tR2VuZXJhdG9yOiBvcHRpb25zLndlZWtOdW1iZXJDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiByZW5kZXJJbm5lciwgY2xhc3NOYW1lR2VuZXJhdG9yOiBvcHRpb25zLndlZWtOdW1iZXJDbGFzc05hbWVzLCBkaWRNb3VudDogb3B0aW9ucy53ZWVrTnVtYmVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLndlZWtOdW1iZXJXaWxsVW5tb3VudCB9KSkpO1xufSkpO1xuZnVuY3Rpb24gcmVuZGVySW5uZXIoaW5uZXJQcm9wcykge1xuICAgIHJldHVybiBpbm5lclByb3BzLnRleHQ7XG59XG5cbmNvbnN0IFBBRERJTkdfRlJPTV9WSUVXUE9SVCA9IDEwO1xuY2xhc3MgUG9wb3ZlciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgdGl0bGVJZDogZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSb290RWwgPSAoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsID0gZWw7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyAqYW55d2hlcmUqIGluIHRoZSBkb2N1bWVudCwgZm9yIHRoZSBhdXRvSGlkZSBmZWF0dXJlXG4gICAgICAgIHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZURvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIC8vIG9ubHkgaGlkZSB0aGUgcG9wb3ZlciBpZiB0aGUgY2xpY2sgaGFwcGVuZWQgb3V0c2lkZSB0aGUgcG9wb3ZlclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXRWaWFSb290KGV2KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5yb290RWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2VDbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURvY3VtZW50S2V5RG93biA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKGV2LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNsb3NlQ2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVDbG9zZUNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHsgb25DbG9zZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgICAgIGlmIChvbkNsb3NlKSB7XG4gICAgICAgICAgICAgICAgb25DbG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHRoZW1lLCBvcHRpb25zIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB7IHByb3BzLCBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtcG9wb3ZlcicsXG4gICAgICAgICAgICB0aGVtZS5nZXRDbGFzcygncG9wb3ZlcicpLFxuICAgICAgICBdLmNvbmNhdChwcm9wcy5leHRyYUNsYXNzTmFtZXMgfHwgW10pO1xuICAgICAgICByZXR1cm4gY29tcGF0LmNyZWF0ZVBvcnRhbChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5leHRyYUF0dHJzLCB7IGlkOiBwcm9wcy5pZCwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmpvaW4oJyAnKSwgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3RhdGUudGl0bGVJZCwgcmVmOiB0aGlzLmhhbmRsZVJvb3RFbCB9KSxcbiAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiAnZmMtcG9wb3Zlci1oZWFkZXIgJyArIHRoZW1lLmdldENsYXNzKCdwb3BvdmVySGVhZGVyJykgfSxcbiAgICAgICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6IFwiZmMtcG9wb3Zlci10aXRsZVwiLCBpZDogc3RhdGUudGl0bGVJZCB9LCBwcm9wcy50aXRsZSksXG4gICAgICAgICAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiAnZmMtcG9wb3Zlci1jbG9zZSAnICsgdGhlbWUuZ2V0SWNvbkNsYXNzKCdjbG9zZScpLCB0aXRsZTogb3B0aW9ucy5jbG9zZUhpbnQsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xvc2VDbGljayB9KSksXG4gICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogJ2ZjLXBvcG92ZXItYm9keSAnICsgdGhlbWUuZ2V0Q2xhc3MoJ3BvcG92ZXJDb250ZW50JykgfSwgcHJvcHMuY2hpbGRyZW4pKSwgcHJvcHMucGFyZW50RWwpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93bik7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50S2V5RG93bik7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93bik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50S2V5RG93bik7XG4gICAgfVxuICAgIHVwZGF0ZVNpemUoKSB7XG4gICAgICAgIGxldCB7IGlzUnRsIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB7IGFsaWdubWVudEVsLCBhbGlnbkdyaWRUb3AgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCB7IHJvb3RFbCB9ID0gdGhpcztcbiAgICAgICAgbGV0IGFsaWdubWVudFJlY3QgPSBjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QoYWxpZ25tZW50RWwpO1xuICAgICAgICBpZiAoYWxpZ25tZW50UmVjdCkge1xuICAgICAgICAgICAgbGV0IHBvcG92ZXJEaW1zID0gcm9vdEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgLy8gcG9zaXRpb24gcmVsYXRpdmUgdG8gdmlld3BvcnRcbiAgICAgICAgICAgIGxldCBwb3BvdmVyVG9wID0gYWxpZ25HcmlkVG9wXG4gICAgICAgICAgICAgICAgPyBlbGVtZW50Q2xvc2VzdChhbGlnbm1lbnRFbCwgJy5mYy1zY3JvbGxncmlkJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gICAgICAgICAgICAgICAgOiBhbGlnbm1lbnRSZWN0LnRvcDtcbiAgICAgICAgICAgIGxldCBwb3BvdmVyTGVmdCA9IGlzUnRsID8gYWxpZ25tZW50UmVjdC5yaWdodCAtIHBvcG92ZXJEaW1zLndpZHRoIDogYWxpZ25tZW50UmVjdC5sZWZ0O1xuICAgICAgICAgICAgLy8gY29uc3RyYWluXG4gICAgICAgICAgICBwb3BvdmVyVG9wID0gTWF0aC5tYXgocG9wb3ZlclRvcCwgUEFERElOR19GUk9NX1ZJRVdQT1JUKTtcbiAgICAgICAgICAgIHBvcG92ZXJMZWZ0ID0gTWF0aC5taW4ocG9wb3ZlckxlZnQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAtIFBBRERJTkdfRlJPTV9WSUVXUE9SVCAtIHBvcG92ZXJEaW1zLndpZHRoKTtcbiAgICAgICAgICAgIHBvcG92ZXJMZWZ0ID0gTWF0aC5tYXgocG9wb3ZlckxlZnQsIFBBRERJTkdfRlJPTV9WSUVXUE9SVCk7XG4gICAgICAgICAgICBsZXQgb3JpZ2luID0gcm9vdEVsLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGFwcGx5U3R5bGUocm9vdEVsLCB7XG4gICAgICAgICAgICAgICAgdG9wOiBwb3BvdmVyVG9wIC0gb3JpZ2luLnRvcCxcbiAgICAgICAgICAgICAgICBsZWZ0OiBwb3BvdmVyTGVmdCAtIG9yaWdpbi5sZWZ0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNsYXNzIE1vcmVQb3BvdmVyIGV4dGVuZHMgRGF0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuaGFuZGxlUm9vdEVsID0gKHJvb3RFbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb290RWwgPSByb290RWw7XG4gICAgICAgICAgICBpZiAocm9vdEVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQodGhpcywge1xuICAgICAgICAgICAgICAgICAgICBlbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgICAgICB1c2VFdmVudENlbnRlcjogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IG9wdGlvbnMsIGRhdGVFbnYgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHN0YXJ0RGF0ZSwgdG9kYXlSYW5nZSwgZGF0ZVByb2ZpbGUgfSA9IHByb3BzO1xuICAgICAgICBsZXQgdGl0bGUgPSBkYXRlRW52LmZvcm1hdChzdGFydERhdGUsIG9wdGlvbnMuZGF5UG9wb3ZlckZvcm1hdCk7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoRGF5Q2VsbENvbnRhaW5lciwgeyBlbFJlZjogdGhpcy5oYW5kbGVSb290RWwsIGRhdGU6IHN0YXJ0RGF0ZSwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlIH0sIChJbm5lckNvbnRlbnQsIHJlbmRlclByb3BzLCBlbEF0dHJzKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoUG9wb3ZlciwgeyBlbFJlZjogZWxBdHRycy5yZWYsIGlkOiBwcm9wcy5pZCwgdGl0bGU6IHRpdGxlLCBleHRyYUNsYXNzTmFtZXM6IFsnZmMtbW9yZS1wb3BvdmVyJ10uY29uY2F0KGVsQXR0cnMuY2xhc3NOYW1lIHx8IFtdKSwgZXh0cmFBdHRyczogZWxBdHRycyAvKiBUT0RPOiBtYWtlIHRoZXNlIHRpbWUtYmFzZWQgd2hlbiBub3Qgd2hvbGUtZGF5PyAqLywgcGFyZW50RWw6IHByb3BzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcDogcHJvcHMuYWxpZ25HcmlkVG9wLCBvbkNsb3NlOiBwcm9wcy5vbkNsb3NlIH0sXG4gICAgICAgICAgICBoYXNDdXN0b21EYXlDZWxsQ29udGVudChvcHRpb25zKSAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJDb250ZW50LCB7IGVsVGFnOiBcImRpdlwiLCBlbENsYXNzZXM6IFsnZmMtbW9yZS1wb3BvdmVyLW1pc2MnXSB9KSksXG4gICAgICAgICAgICBwcm9wcy5jaGlsZHJlbikpKSk7XG4gICAgfVxuICAgIHF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3AsIGVsV2lkdGgsIGVsSGVpZ2h0KSB7XG4gICAgICAgIGxldCB7IHJvb3RFbCwgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChwb3NpdGlvbkxlZnQgPj0gMCAmJiBwb3NpdGlvbkxlZnQgPCBlbFdpZHRoICYmXG4gICAgICAgICAgICBwb3NpdGlvblRvcCA+PSAwICYmIHBvc2l0aW9uVG9wIDwgZWxIZWlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgICAgIGRhdGVTcGFuOiBPYmplY3QuYXNzaWduKHsgYWxsRGF5OiAhcHJvcHMuZm9yY2VUaW1lZCwgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwcm9wcy5zdGFydERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHByb3BzLmVuZERhdGUsXG4gICAgICAgICAgICAgICAgICAgIH0gfSwgcHJvcHMuZXh0cmFEYXRlU3BhbiksXG4gICAgICAgICAgICAgICAgZGF5RWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICByZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGVsV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogZWxIZWlnaHQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYXllcjogMSwgLy8gaW1wb3J0YW50IHdoZW4gY29tcGFyaW5nIHdpdGggaGl0cyBmcm9tIG90aGVyIGNvbXBvbmVudHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5jbGFzcyBNb3JlTGlua0NvbnRhaW5lciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaXNQb3BvdmVyT3BlbjogZmFsc2UsXG4gICAgICAgICAgICBwb3BvdmVySWQ6IGdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlTGlua0VsID0gKGxpbmtFbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5saW5rRWwgPSBsaW5rRWw7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBsaW5rRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUNsaWNrID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IG1vcmVMaW5rQ2xpY2sgfSA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgICAgIGxldCBkYXRlID0gY29tcHV0ZVJhbmdlKHByb3BzKS5zdGFydDtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGJ1aWxkUHVibGljU2VnKHNlZykge1xuICAgICAgICAgICAgICAgIGxldCB7IGRlZiwgaW5zdGFuY2UsIHJhbmdlIH0gPSBzZWcuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IEV2ZW50SW1wbChjb250ZXh0LCBkZWYsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGNvbnRleHQuZGF0ZUVudi50b0RhdGUocmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgICAgICAgICBlbmQ6IGNvbnRleHQuZGF0ZUVudi50b0RhdGUocmFuZ2UuZW5kKSxcbiAgICAgICAgICAgICAgICAgICAgaXNTdGFydDogc2VnLmlzU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgIGlzRW5kOiBzZWcuaXNFbmQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9yZUxpbmtDbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIG1vcmVMaW5rQ2xpY2sgPSBtb3JlTGlua0NsaWNrKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYWxsRGF5OiBCb29sZWFuKHByb3BzLmFsbERheURhdGUpLFxuICAgICAgICAgICAgICAgICAgICBhbGxTZWdzOiBwcm9wcy5hbGxTZWdzLm1hcChidWlsZFB1YmxpY1NlZyksXG4gICAgICAgICAgICAgICAgICAgIGhpZGRlblNlZ3M6IHByb3BzLmhpZGRlblNlZ3MubWFwKGJ1aWxkUHVibGljU2VnKSxcbiAgICAgICAgICAgICAgICAgICAganNFdmVudDogZXYsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbW9yZUxpbmtDbGljayB8fCBtb3JlTGlua0NsaWNrID09PSAncG9wb3ZlcicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNQb3BvdmVyT3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBtb3JlTGlua0NsaWNrID09PSAnc3RyaW5nJykgeyAvLyBhIHZpZXcgbmFtZVxuICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsZW5kYXJBcGkuem9vbVRvKGRhdGUsIG1vcmVMaW5rQ2xpY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvcG92ZXJDbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc1BvcG92ZXJPcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCAoY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgbGV0IHsgdmlld0FwaSwgb3B0aW9ucywgY2FsZW5kYXJBcGkgfSA9IGNvbnRleHQ7XG4gICAgICAgICAgICBsZXQgeyBtb3JlTGlua1RleHQgfSA9IG9wdGlvbnM7XG4gICAgICAgICAgICBsZXQgeyBtb3JlQ250IH0gPSBwcm9wcztcbiAgICAgICAgICAgIGxldCByYW5nZSA9IGNvbXB1dGVSYW5nZShwcm9wcyk7XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHR5cGVvZiBtb3JlTGlua1RleHQgPT09ICdmdW5jdGlvbicgLy8gVE9ETzogZXZlbnR1YWxseSB1c2UgZm9ybWF0V2l0aE9yZGluYWxzXG4gICAgICAgICAgICAgICAgPyBtb3JlTGlua1RleHQuY2FsbChjYWxlbmRhckFwaSwgbW9yZUNudClcbiAgICAgICAgICAgICAgICA6IGArJHttb3JlQ250fSAke21vcmVMaW5rVGV4dH1gO1xuICAgICAgICAgICAgbGV0IGhpbnQgPSBmb3JtYXRXaXRoT3JkaW5hbHMob3B0aW9ucy5tb3JlTGlua0hpbnQsIFttb3JlQ250XSwgdGV4dCk7XG4gICAgICAgICAgICBsZXQgcmVuZGVyUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgbnVtOiBtb3JlQ250LFxuICAgICAgICAgICAgICAgIHNob3J0VGV4dDogYCske21vcmVDbnR9YCxcbiAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdBcGksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChwcmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICAgICAgQm9vbGVhbihwcm9wcy5tb3JlQ250KSAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudENvbnRhaW5lciwgeyBlbFRhZzogcHJvcHMuZWxUYWcgfHwgJ2EnLCBlbFJlZjogdGhpcy5oYW5kbGVMaW5rRWwsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHByb3BzLmVsQ2xhc3NlcyB8fCBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZmMtbW9yZS1saW5rJyxcbiAgICAgICAgICAgICAgICAgICAgXSwgZWxTdHlsZTogcHJvcHMuZWxTdHlsZSwgZWxBdHRyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzLmVsQXR0cnMpLCBjcmVhdGVBcmlhQ2xpY2tBdHRycyh0aGlzLmhhbmRsZUNsaWNrKSksIHsgdGl0bGU6IGhpbnQsICdhcmlhLWV4cGFuZGVkJzogc3RhdGUuaXNQb3BvdmVyT3BlbiwgJ2FyaWEtY29udHJvbHMnOiBzdGF0ZS5pc1BvcG92ZXJPcGVuID8gc3RhdGUucG9wb3ZlcklkIDogJycgfSksIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJtb3JlTGlua0NvbnRlbnRcIiwgY3VzdG9tR2VuZXJhdG9yOiBvcHRpb25zLm1vcmVMaW5rQ29udGVudCwgZGVmYXVsdEdlbmVyYXRvcjogcHJvcHMuZGVmYXVsdEdlbmVyYXRvciB8fCByZW5kZXJNb3JlTGlua0lubmVyLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMubW9yZUxpbmtDbGFzc05hbWVzLCBkaWRNb3VudDogb3B0aW9ucy5tb3JlTGlua0RpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5tb3JlTGlua1dpbGxVbm1vdW50IH0sIHByb3BzLmNoaWxkcmVuKSksXG4gICAgICAgICAgICAgICAgc3RhdGUuaXNQb3BvdmVyT3BlbiAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoTW9yZVBvcG92ZXIsIHsgaWQ6IHN0YXRlLnBvcG92ZXJJZCwgc3RhcnREYXRlOiByYW5nZS5zdGFydCwgZW5kRGF0ZTogcmFuZ2UuZW5kLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIHBhcmVudEVsOiB0aGlzLnBhcmVudEVsLCBhbGlnbm1lbnRFbDogcHJvcHMuYWxpZ25tZW50RWxSZWYgP1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuYWxpZ25tZW50RWxSZWYuY3VycmVudCA6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmtFbCwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIGZvcmNlVGltZWQ6IHByb3BzLmZvcmNlVGltZWQsIG9uQ2xvc2U6IHRoaXMuaGFuZGxlUG9wb3ZlckNsb3NlIH0sIHByb3BzLnBvcG92ZXJDb250ZW50KCkpKSkpO1xuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsKCk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbCgpO1xuICAgIH1cbiAgICB1cGRhdGVQYXJlbnRFbCgpIHtcbiAgICAgICAgaWYgKHRoaXMubGlua0VsKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsID0gZWxlbWVudENsb3Nlc3QodGhpcy5saW5rRWwsICcuZmMtdmlldy1oYXJuZXNzJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJNb3JlTGlua0lubmVyKHByb3BzKSB7XG4gICAgcmV0dXJuIHByb3BzLnRleHQ7XG59XG5mdW5jdGlvbiBjb21wdXRlUmFuZ2UocHJvcHMpIHtcbiAgICBpZiAocHJvcHMuYWxsRGF5RGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHByb3BzLmFsbERheURhdGUsXG4gICAgICAgICAgICBlbmQ6IGFkZERheXMocHJvcHMuYWxsRGF5RGF0ZSwgMSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGxldCB7IGhpZGRlblNlZ3MgfSA9IHByb3BzO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBjb21wdXRlRWFybGllc3RTZWdTdGFydChoaWRkZW5TZWdzKSxcbiAgICAgICAgZW5kOiBjb21wdXRlTGF0ZXN0U2VnRW5kKGhpZGRlblNlZ3MpLFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlRWFybGllc3RTZWdTdGFydChzZWdzKSB7XG4gICAgcmV0dXJuIHNlZ3MucmVkdWNlKHBpY2tFYXJsaWVzdFN0YXJ0KS5ldmVudFJhbmdlLnJhbmdlLnN0YXJ0O1xufVxuZnVuY3Rpb24gcGlja0VhcmxpZXN0U3RhcnQoc2VnMCwgc2VnMSkge1xuICAgIHJldHVybiBzZWcwLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQgPCBzZWcxLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQgPyBzZWcwIDogc2VnMTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVMYXRlc3RTZWdFbmQoc2Vncykge1xuICAgIHJldHVybiBzZWdzLnJlZHVjZShwaWNrTGF0ZXN0RW5kKS5ldmVudFJhbmdlLnJhbmdlLmVuZDtcbn1cbmZ1bmN0aW9uIHBpY2tMYXRlc3RFbmQoc2VnMCwgc2VnMSkge1xuICAgIHJldHVybiBzZWcwLmV2ZW50UmFuZ2UucmFuZ2UuZW5kID4gc2VnMS5ldmVudFJhbmdlLnJhbmdlLmVuZCA/IHNlZzAgOiBzZWcxO1xufVxuXG5jbGFzcyBWaWV3Q29udGFpbmVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICAgICAgbGV0IHJlbmRlclByb3BzID0geyB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgeyBlbFRhZzogcHJvcHMuZWxUYWcgfHwgJ2RpdicsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgIC4uLmJ1aWxkVmlld0NsYXNzTmFtZXMocHJvcHMudmlld1NwZWMpLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5lbENsYXNzZXMgfHwgW10pLFxuICAgICAgICAgICAgXSwgcmVuZGVyUHJvcHM6IHJlbmRlclByb3BzLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMudmlld0NsYXNzTmFtZXMsIGdlbmVyYXRvck5hbWU6IHVuZGVmaW5lZCwgZGlkTW91bnQ6IG9wdGlvbnMudmlld0RpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy52aWV3V2lsbFVubW91bnQgfSksICgpID0+IHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGRWaWV3Q2xhc3NOYW1lcyh2aWV3U3BlYykge1xuICAgIHJldHVybiBbXG4gICAgICAgIGBmYy0ke3ZpZXdTcGVjLnR5cGV9LXZpZXdgLFxuICAgICAgICAnZmMtdmlldycsXG4gICAgXTtcbn1cblxuY29uc3QgRVZFTlRfU09VUkNFX1JFRklORVJTID0ge1xuICAgIGlkOiBTdHJpbmcsXG4gICAgZGVmYXVsdEFsbERheTogQm9vbGVhbixcbiAgICB1cmw6IFN0cmluZyxcbiAgICBmb3JtYXQ6IFN0cmluZyxcbiAgICBldmVudHM6IGlkZW50aXR5LFxuICAgIGV2ZW50RGF0YVRyYW5zZm9ybTogaWRlbnRpdHksXG4gICAgLy8gZm9yIGFueSBuZXR3b3JrLXJlbGF0ZWQgc291cmNlc1xuICAgIHN1Y2Nlc3M6IGlkZW50aXR5LFxuICAgIGZhaWx1cmU6IGlkZW50aXR5LFxufTtcbmZ1bmN0aW9uIHBhcnNlRXZlbnRTb3VyY2UocmF3LCBjb250ZXh0LCByZWZpbmVycyA9IGJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyhjb250ZXh0KSkge1xuICAgIGxldCByYXdPYmo7XG4gICAgaWYgKHR5cGVvZiByYXcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJhd09iaiA9IHsgdXJsOiByYXcgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHJhdyA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICAgICAgcmF3T2JqID0geyBldmVudHM6IHJhdyB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcmF3ID09PSAnb2JqZWN0JyAmJiByYXcpIHsgLy8gbm90IG51bGxcbiAgICAgICAgcmF3T2JqID0gcmF3O1xuICAgIH1cbiAgICBpZiAocmF3T2JqKSB7XG4gICAgICAgIGxldCB7IHJlZmluZWQsIGV4dHJhIH0gPSByZWZpbmVQcm9wcyhyYXdPYmosIHJlZmluZXJzKTtcbiAgICAgICAgbGV0IG1ldGFSZXMgPSBidWlsZEV2ZW50U291cmNlTWV0YShyZWZpbmVkLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKG1ldGFSZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX3JhdzogcmF3LFxuICAgICAgICAgICAgICAgIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGxhdGVzdEZldGNoSWQ6ICcnLFxuICAgICAgICAgICAgICAgIGZldGNoUmFuZ2U6IG51bGwsXG4gICAgICAgICAgICAgICAgZGVmYXVsdEFsbERheTogcmVmaW5lZC5kZWZhdWx0QWxsRGF5LFxuICAgICAgICAgICAgICAgIGV2ZW50RGF0YVRyYW5zZm9ybTogcmVmaW5lZC5ldmVudERhdGFUcmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogcmVmaW5lZC5zdWNjZXNzLFxuICAgICAgICAgICAgICAgIGZhaWx1cmU6IHJlZmluZWQuZmFpbHVyZSxcbiAgICAgICAgICAgICAgICBwdWJsaWNJZDogcmVmaW5lZC5pZCB8fCAnJyxcbiAgICAgICAgICAgICAgICBzb3VyY2VJZDogZ3VpZCgpLFxuICAgICAgICAgICAgICAgIHNvdXJjZURlZklkOiBtZXRhUmVzLnNvdXJjZURlZklkLFxuICAgICAgICAgICAgICAgIG1ldGE6IG1ldGFSZXMubWV0YSxcbiAgICAgICAgICAgICAgICB1aTogY3JlYXRlRXZlbnRVaShyZWZpbmVkLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgICBleHRlbmRlZFByb3BzOiBleHRyYSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50U291cmNlUmVmaW5lcnMoY29udGV4dCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgRVZFTlRfVUlfUkVGSU5FUlMpLCBFVkVOVF9TT1VSQ0VfUkVGSU5FUlMpLCBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlUmVmaW5lcnMpO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFNvdXJjZU1ldGEocmF3LCBjb250ZXh0KSB7XG4gICAgbGV0IGRlZnMgPSBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50U291cmNlRGVmcztcbiAgICBmb3IgKGxldCBpID0gZGVmcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkgeyAvLyBsYXRlci1hZGRlZCBwbHVnaW5zIHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBsZXQgZGVmID0gZGVmc1tpXTtcbiAgICAgICAgbGV0IG1ldGEgPSBkZWYucGFyc2VNZXRhKHJhdyk7XG4gICAgICAgIGlmIChtZXRhKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzb3VyY2VEZWZJZDogaSwgbWV0YSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jbGFzcyBDYWxlbmRhckltcGwge1xuICAgIGdldEN1cnJlbnREYXRhKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZ2V0Q3VycmVudERhdGEoKTtcbiAgICB9XG4gICAgZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFNYW5hZ2VyLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgfVxuICAgIGdldCB2aWV3KCkgeyByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLnZpZXdBcGk7IH1cbiAgICBiYXRjaFJlbmRlcmluZyhjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgIH1cbiAgICB1cGRhdGVTaXplKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ19yZXNpemUnLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gT3B0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2V0T3B0aW9uKG5hbWUsIHZhbCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdTRVRfT1BUSU9OJyxcbiAgICAgICAgICAgIG9wdGlvbk5hbWU6IG5hbWUsXG4gICAgICAgICAgICByYXdPcHRpb25WYWx1ZTogdmFsLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0T3B0aW9uKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudERhdGFNYW5hZ2VyLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dFtuYW1lXTtcbiAgICB9XG4gICAgZ2V0QXZhaWxhYmxlTG9jYWxlQ29kZXMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmdldEN1cnJlbnREYXRhKCkuYXZhaWxhYmxlUmF3TG9jYWxlcyk7XG4gICAgfVxuICAgIC8vIFRyaWdnZXJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIG9uKGhhbmRsZXJOYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIGxldCB7IGN1cnJlbnREYXRhTWFuYWdlciB9ID0gdGhpcztcbiAgICAgICAgaWYgKGN1cnJlbnREYXRhTWFuYWdlci5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lcnNbaGFuZGxlck5hbWVdKSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vbihoYW5kbGVyTmFtZSwgaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gbGlzdGVuZXIgbmFtZSAnJHtoYW5kbGVyTmFtZX0nYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb2ZmKGhhbmRsZXJOYW1lLCBoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFNYW5hZ2VyLmVtaXR0ZXIub2ZmKGhhbmRsZXJOYW1lLCBoYW5kbGVyKTtcbiAgICB9XG4gICAgLy8gbm90IG1lYW50IGZvciBwdWJsaWMgdXNlXG4gICAgdHJpZ2dlcihoYW5kbGVyTmFtZSwgLi4uYXJncykge1xuICAgICAgICB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5lbWl0dGVyLnRyaWdnZXIoaGFuZGxlck5hbWUsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICAvLyBWaWV3XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjaGFuZ2VWaWV3KHZpZXdUeXBlLCBkYXRlT3JSYW5nZSkge1xuICAgICAgICB0aGlzLmJhdGNoUmVuZGVyaW5nKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgICAgIGlmIChkYXRlT3JSYW5nZSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRlT3JSYW5nZS5zdGFydCAmJiBkYXRlT3JSYW5nZS5lbmQpIHsgLy8gYSByYW5nZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX09QVElPTicsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25OYW1lOiAndmlzaWJsZVJhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJhd09wdGlvblZhbHVlOiBkYXRlT3JSYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9WSUVXX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlTWFya2VyOiBkYXRlRW52LmNyZWF0ZU1hcmtlcihkYXRlT3JSYW5nZSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX1ZJRVdfVFlQRScsXG4gICAgICAgICAgICAgICAgICAgIHZpZXdUeXBlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gRm9yY2VzIG5hdmlnYXRpb24gdG8gYSB2aWV3IGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAgICAvLyBgdmlld1R5cGVgIGNhbiBiZSBhIHNwZWNpZmljIHZpZXcgbmFtZSBvciBhIGdlbmVyaWMgb25lIGxpa2UgXCJ3ZWVrXCIgb3IgXCJkYXlcIi5cbiAgICAvLyBuZWVkcyB0byBjaGFuZ2VcbiAgICB6b29tVG8oZGF0ZU1hcmtlciwgdmlld1R5cGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBsZXQgc3BlYztcbiAgICAgICAgdmlld1R5cGUgPSB2aWV3VHlwZSB8fCAnZGF5JzsgLy8gZGF5IGlzIGRlZmF1bHQgem9vbVxuICAgICAgICBzcGVjID0gc3RhdGUudmlld1NwZWNzW3ZpZXdUeXBlXSB8fCB0aGlzLmdldFVuaXRWaWV3U3BlYyh2aWV3VHlwZSk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgaWYgKHNwZWMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICB2aWV3VHlwZTogc3BlYy50eXBlLFxuICAgICAgICAgICAgICAgIGRhdGVNYXJrZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICAgICAgZGF0ZU1hcmtlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEdpdmVuIGEgZHVyYXRpb24gc2luZ3VsYXIgdW5pdCwgbGlrZSBcIndlZWtcIiBvciBcImRheVwiLCBmaW5kcyBhIG1hdGNoaW5nIHZpZXcgc3BlYy5cbiAgICAvLyBQcmVmZXJlbmNlIGlzIGdpdmVuIHRvIHZpZXdzIHRoYXQgaGF2ZSBjb3JyZXNwb25kaW5nIGJ1dHRvbnMuXG4gICAgZ2V0VW5pdFZpZXdTcGVjKHVuaXQpIHtcbiAgICAgICAgbGV0IHsgdmlld1NwZWNzLCB0b29sYmFyQ29uZmlnIH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCB2aWV3VHlwZXMgPSBbXS5jb25jYXQodG9vbGJhckNvbmZpZy5oZWFkZXIgPyB0b29sYmFyQ29uZmlnLmhlYWRlci52aWV3c1dpdGhCdXR0b25zIDogW10sIHRvb2xiYXJDb25maWcuZm9vdGVyID8gdG9vbGJhckNvbmZpZy5mb290ZXIudmlld3NXaXRoQnV0dG9ucyA6IFtdKTtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGxldCBzcGVjO1xuICAgICAgICBmb3IgKGxldCB2aWV3VHlwZSBpbiB2aWV3U3BlY3MpIHtcbiAgICAgICAgICAgIHZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmlld1R5cGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBzcGVjID0gdmlld1NwZWNzW3ZpZXdUeXBlc1tpXV07XG4gICAgICAgICAgICBpZiAoc3BlYykge1xuICAgICAgICAgICAgICAgIGlmIChzcGVjLnNpbmdsZVVuaXQgPT09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBDdXJyZW50IERhdGVcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHByZXYoKSB7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdQUkVWJyB9KTtcbiAgICB9XG4gICAgbmV4dCgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ05FWFQnIH0pO1xuICAgIH1cbiAgICBwcmV2WWVhcigpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgIGRhdGVNYXJrZXI6IHN0YXRlLmRhdGVFbnYuYWRkWWVhcnMoc3RhdGUuY3VycmVudERhdGUsIC0xKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5leHRZZWFyKCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX0RBVEUnLFxuICAgICAgICAgICAgZGF0ZU1hcmtlcjogc3RhdGUuZGF0ZUVudi5hZGRZZWFycyhzdGF0ZS5jdXJyZW50RGF0ZSwgMSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b2RheSgpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgIGRhdGVNYXJrZXI6IGdldE5vdyhzdGF0ZS5jYWxlbmRhck9wdGlvbnMubm93LCBzdGF0ZS5kYXRlRW52KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdvdG9EYXRlKHpvbmVkRGF0ZUlucHV0KSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmNyZWF0ZU1hcmtlcih6b25lZERhdGVJbnB1dCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNyZW1lbnREYXRlKGRlbHRhSW5wdXQpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBsZXQgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIGVsc2UsIHdhcm4gYWJvdXQgaW52YWxpZCBpbnB1dD9cbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICAgICAgZGF0ZU1hcmtlcjogc3RhdGUuZGF0ZUVudi5hZGQoc3RhdGUuY3VycmVudERhdGUsIGRlbHRhKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldERhdGUoKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmRhdGVFbnYudG9EYXRlKHN0YXRlLmN1cnJlbnREYXRlKTtcbiAgICB9XG4gICAgLy8gRGF0ZSBGb3JtYXR0aW5nIFV0aWxzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBmb3JtYXREYXRlKGQsIGZvcm1hdHRlcikge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChkYXRlRW52LmNyZWF0ZU1hcmtlcihkKSwgY3JlYXRlRm9ybWF0dGVyKGZvcm1hdHRlcikpO1xuICAgIH1cbiAgICAvLyBgc2V0dGluZ3NgIGlzIGZvciBmb3JtYXR0ZXIgQU5EIGlzRW5kRXhjbHVzaXZlXG4gICAgZm9ybWF0UmFuZ2UoZDAsIGQxLCBzZXR0aW5ncykge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKGRhdGVFbnYuY3JlYXRlTWFya2VyKGQwKSwgZGF0ZUVudi5jcmVhdGVNYXJrZXIoZDEpLCBjcmVhdGVGb3JtYXR0ZXIoc2V0dGluZ3MpLCBzZXR0aW5ncyk7XG4gICAgfVxuICAgIGZvcm1hdElzbyhkLCBvbWl0VGltZSkge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdElzbyhkYXRlRW52LmNyZWF0ZU1hcmtlcihkKSwgeyBvbWl0VGltZSB9KTtcbiAgICB9XG4gICAgLy8gRGF0ZSBTZWxlY3Rpb24gLyBFdmVudCBTZWxlY3Rpb24gLyBEYXlDbGlja1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2VsZWN0KGRhdGVPck9iaiwgZW5kRGF0ZSkge1xuICAgICAgICBsZXQgc2VsZWN0aW9uSW5wdXQ7XG4gICAgICAgIGlmIChlbmREYXRlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChkYXRlT3JPYmouc3RhcnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbklucHV0ID0gZGF0ZU9yT2JqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRlT3JPYmosXG4gICAgICAgICAgICAgICAgICAgIGVuZDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0aW9uSW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGVPck9iaixcbiAgICAgICAgICAgICAgICBlbmQ6IGVuZERhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IHNlbGVjdGlvbiA9IHBhcnNlRGF0ZVNwYW4oc2VsZWN0aW9uSW5wdXQsIHN0YXRlLmRhdGVFbnYsIGNyZWF0ZUR1cmF0aW9uKHsgZGF5czogMSB9KSk7XG4gICAgICAgIGlmIChzZWxlY3Rpb24pIHsgLy8gdGhyb3cgcGFyc2UgZXJyb3Igb3RoZXJ3aXNlP1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfREFURVMnLCBzZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIG51bGwsIHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1bnNlbGVjdChwZXYpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBpZiAoc3RhdGUuZGF0ZVNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9EQVRFUycgfSk7XG4gICAgICAgICAgICB0cmlnZ2VyRGF0ZVVuc2VsZWN0KHBldiwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFB1YmxpYyBFdmVudHMgQVBJXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBhZGRFdmVudChldmVudElucHV0LCBzb3VyY2VJbnB1dCkge1xuICAgICAgICBpZiAoZXZlbnRJbnB1dCBpbnN0YW5jZW9mIEV2ZW50SW1wbCkge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGV2ZW50SW5wdXQuX2RlZjtcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IGV2ZW50SW5wdXQuX2luc3RhbmNlO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnREYXRhID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICAgICAgLy8gbm90IGFscmVhZHkgcHJlc2VudD8gZG9uJ3Qgd2FudCB0byBhZGQgYW4gb2xkIHNuYXBzaG90XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnREYXRhLmV2ZW50U3RvcmUuZGVmc1tkZWYuZGVmSWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBRERfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRUdXBsZVRvU3RvcmUoeyBkZWYsIGluc3RhbmNlIH0pLCAvLyBUT0RPOiBiZXR0ZXIgdXRpbCBmb3IgdHdvIGFyZ3M/XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnRBZGQoZXZlbnRJbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRJbnB1dDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCBldmVudFNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZUlucHV0IGluc3RhbmNlb2YgRXZlbnRTb3VyY2VJbXBsKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZSA9IHNvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZUlucHV0ID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VJbnB1dCkgeyAvLyB0cnVlLiBwYXJ0IG9mIHRoZSBmaXJzdCBldmVudCBzb3VyY2VcbiAgICAgICAgICAgICAgICBbZXZlbnRTb3VyY2VdID0gaGFzaFZhbHVlc1RvQXJyYXkoc3RhdGUuZXZlbnRTb3VyY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzb3VyY2VJbnB1dCAhPSBudWxsKSB7IC8vIGFuIElELiBhY2NlcHRzIGEgbnVtYmVyIHRvb1xuICAgICAgICAgICAgbGV0IHNvdXJjZUFwaSA9IHRoaXMuZ2V0RXZlbnRTb3VyY2VCeUlkKHNvdXJjZUlucHV0KTsgLy8gVE9ETzogdXNlIGFuIGludGVybmFsIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIXNvdXJjZUFwaSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IGZpbmQgYW4gZXZlbnQgc291cmNlIHdpdGggSUQgXCIke3NvdXJjZUlucHV0fVwiYCk7IC8vIFRPRE86IHRlc3RcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50U291cmNlID0gc291cmNlQXBpLmludGVybmFsRXZlbnRTb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR1cGxlID0gcGFyc2VFdmVudChldmVudElucHV0LCBldmVudFNvdXJjZSwgc3RhdGUsIGZhbHNlKTtcbiAgICAgICAgaWYgKHR1cGxlKSB7XG4gICAgICAgICAgICBsZXQgbmV3RXZlbnRBcGkgPSBuZXcgRXZlbnRJbXBsKHN0YXRlLCB0dXBsZS5kZWYsIHR1cGxlLmRlZi5yZWN1cnJpbmdEZWYgPyBudWxsIDogdHVwbGUuaW5zdGFuY2UpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0FERF9FVkVOVFMnLFxuICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50VHVwbGVUb1N0b3JlKHR1cGxlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyRXZlbnRBZGQobmV3RXZlbnRBcGkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0V2ZW50QXBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cmlnZ2VyRXZlbnRBZGQoZXZlbnRBcGkpIHtcbiAgICAgICAgbGV0IHsgZW1pdHRlciB9ID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2V2ZW50QWRkJywge1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICByZXZlcnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBldmVudEFwaVRvU3RvcmUoZXZlbnRBcGkpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRPRE86IG9wdGltaXplXG4gICAgZ2V0RXZlbnRCeUlkKGlkKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IHsgZGVmcywgaW5zdGFuY2VzIH0gPSBzdGF0ZS5ldmVudFN0b3JlO1xuICAgICAgICBpZCA9IFN0cmluZyhpZCk7XG4gICAgICAgIGZvciAobGV0IGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgICAgIGxldCBkZWYgPSBkZWZzW2RlZklkXTtcbiAgICAgICAgICAgIGlmIChkZWYucHVibGljSWQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZi5yZWN1cnJpbmdEZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudEltcGwoc3RhdGUsIGRlZiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGluc3RhbmNlSWQgaW4gaW5zdGFuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLmRlZklkID09PSBkZWYuZGVmSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRJbXBsKHN0YXRlLCBkZWYsIGluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0RXZlbnRzKCkge1xuICAgICAgICBsZXQgY3VycmVudERhdGEgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHJldHVybiBidWlsZEV2ZW50QXBpcyhjdXJyZW50RGF0YS5ldmVudFN0b3JlLCBjdXJyZW50RGF0YSk7XG4gICAgfVxuICAgIHJlbW92ZUFsbEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdSRU1PVkVfQUxMX0VWRU5UUycgfSk7XG4gICAgfVxuICAgIC8vIFB1YmxpYyBFdmVudCBTb3VyY2VzIEFQSVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0RXZlbnRTb3VyY2VzKCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCBzb3VyY2VIYXNoID0gc3RhdGUuZXZlbnRTb3VyY2VzO1xuICAgICAgICBsZXQgc291cmNlQXBpcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbnRlcm5hbElkIGluIHNvdXJjZUhhc2gpIHtcbiAgICAgICAgICAgIHNvdXJjZUFwaXMucHVzaChuZXcgRXZlbnRTb3VyY2VJbXBsKHN0YXRlLCBzb3VyY2VIYXNoW2ludGVybmFsSWRdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZUFwaXM7XG4gICAgfVxuICAgIGdldEV2ZW50U291cmNlQnlJZChpZCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCBzb3VyY2VIYXNoID0gc3RhdGUuZXZlbnRTb3VyY2VzO1xuICAgICAgICBpZCA9IFN0cmluZyhpZCk7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZUlkIGluIHNvdXJjZUhhc2gpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2VIYXNoW3NvdXJjZUlkXS5wdWJsaWNJZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50U291cmNlSW1wbChzdGF0ZSwgc291cmNlSGFzaFtzb3VyY2VJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBhZGRFdmVudFNvdXJjZShzb3VyY2VJbnB1dCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGlmIChzb3VyY2VJbnB1dCBpbnN0YW5jZW9mIEV2ZW50U291cmNlSW1wbCkge1xuICAgICAgICAgICAgLy8gbm90IGFscmVhZHkgcHJlc2VudD8gZG9uJ3Qgd2FudCB0byBhZGQgYW4gb2xkIHNuYXBzaG90XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmV2ZW50U291cmNlc1tzb3VyY2VJbnB1dC5pbnRlcm5hbEV2ZW50U291cmNlLnNvdXJjZUlkXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQUREX0VWRU5UX1NPVVJDRVMnLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VzOiBbc291cmNlSW5wdXQuaW50ZXJuYWxFdmVudFNvdXJjZV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc291cmNlSW5wdXQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV2ZW50U291cmNlID0gcGFyc2VFdmVudFNvdXJjZShzb3VyY2VJbnB1dCwgc3RhdGUpO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UpIHsgLy8gVE9ETzogZXJyb3Igb3RoZXJ3aXNlP1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdBRERfRVZFTlRfU09VUkNFUycsIHNvdXJjZXM6IFtldmVudFNvdXJjZV0gfSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50U291cmNlSW1wbChzdGF0ZSwgZXZlbnRTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZW1vdmVBbGxFdmVudFNvdXJjZXMoKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnUkVNT1ZFX0FMTF9FVkVOVF9TT1VSQ0VTJyB9KTtcbiAgICB9XG4gICAgcmVmZXRjaEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdGRVRDSF9FVkVOVF9TT1VSQ0VTJywgaXNSZWZldGNoOiB0cnVlIH0pO1xuICAgIH1cbiAgICAvLyBTY3JvbGxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHNjcm9sbFRvVGltZSh0aW1lSW5wdXQpIHtcbiAgICAgICAgbGV0IHRpbWUgPSBjcmVhdGVEdXJhdGlvbih0aW1lSW5wdXQpO1xuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdfc2Nyb2xsUmVxdWVzdCcsIHsgdGltZSB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gICAgfVxuICAgIHNldCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBmb3IgKGxldCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIGhhbmRsZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN1YnNjcmliZShoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZXIodGhpcy5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKlxuU3Vic2NyaWJlcnMgd2lsbCBnZXQgYSBMSVNUIG9mIEN1c3RvbVJlbmRlcmluZ3NcbiovXG5jbGFzcyBDdXN0b21SZW5kZXJpbmdTdG9yZSBleHRlbmRzIFN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8vIGZvciBjb25zaXN0ZW50IG9yZGVyXG4gICAgaGFuZGxlKGN1c3RvbVJlbmRlcmluZykge1xuICAgICAgICBjb25zdCB7IG1hcCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGN1c3RvbVJlbmRlcmluZy5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgbWFwLnNldChjdXN0b21SZW5kZXJpbmcuaWQsIGN1c3RvbVJlbmRlcmluZyk7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXAuaGFzKGN1c3RvbVJlbmRlcmluZy5pZCkpIHtcbiAgICAgICAgICAgIG1hcC5kZWxldGUoY3VzdG9tUmVuZGVyaW5nLmlkKTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldChtYXApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnRzLkJBU0VfT1BUSU9OX0RFRkFVTFRTID0gQkFTRV9PUFRJT05fREVGQVVMVFM7XG5leHBvcnRzLkJBU0VfT1BUSU9OX1JFRklORVJTID0gQkFTRV9PUFRJT05fUkVGSU5FUlM7XG5leHBvcnRzLkJhc2VDb21wb25lbnQgPSBCYXNlQ29tcG9uZW50O1xuZXhwb3J0cy5CZ0V2ZW50ID0gQmdFdmVudDtcbmV4cG9ydHMuQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMgPSBDQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUztcbmV4cG9ydHMuQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTID0gQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTO1xuZXhwb3J0cy5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SUyA9IENPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTO1xuZXhwb3J0cy5DYWxlbmRhckltcGwgPSBDYWxlbmRhckltcGw7XG5leHBvcnRzLkNhbGVuZGFyUm9vdCA9IENhbGVuZGFyUm9vdDtcbmV4cG9ydHMuQ29udGVudENvbnRhaW5lciA9IENvbnRlbnRDb250YWluZXI7XG5leHBvcnRzLkN1c3RvbVJlbmRlcmluZ1N0b3JlID0gQ3VzdG9tUmVuZGVyaW5nU3RvcmU7XG5leHBvcnRzLkRhdGVDb21wb25lbnQgPSBEYXRlQ29tcG9uZW50O1xuZXhwb3J0cy5EYXRlRW52ID0gRGF0ZUVudjtcbmV4cG9ydHMuRGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbmV4cG9ydHMuRGF5Q2VsbENvbnRhaW5lciA9IERheUNlbGxDb250YWluZXI7XG5leHBvcnRzLkRheUhlYWRlciA9IERheUhlYWRlcjtcbmV4cG9ydHMuRGF5U2VyaWVzTW9kZWwgPSBEYXlTZXJpZXNNb2RlbDtcbmV4cG9ydHMuRGF5VGFibGVNb2RlbCA9IERheVRhYmxlTW9kZWw7XG5leHBvcnRzLkRlbGF5ZWRSdW5uZXIgPSBEZWxheWVkUnVubmVyO1xuZXhwb3J0cy5FbGVtZW50RHJhZ2dpbmcgPSBFbGVtZW50RHJhZ2dpbmc7XG5leHBvcnRzLkVsZW1lbnRTY3JvbGxDb250cm9sbGVyID0gRWxlbWVudFNjcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuZXhwb3J0cy5FdmVudENvbnRhaW5lciA9IEV2ZW50Q29udGFpbmVyO1xuZXhwb3J0cy5FdmVudEltcGwgPSBFdmVudEltcGw7XG5leHBvcnRzLkludGVyYWN0aW9uID0gSW50ZXJhY3Rpb247XG5leHBvcnRzLkpzb25SZXF1ZXN0RXJyb3IgPSBKc29uUmVxdWVzdEVycm9yO1xuZXhwb3J0cy5Nb3JlTGlua0NvbnRhaW5lciA9IE1vcmVMaW5rQ29udGFpbmVyO1xuZXhwb3J0cy5OYW1lZFRpbWVab25lSW1wbCA9IE5hbWVkVGltZVpvbmVJbXBsO1xuZXhwb3J0cy5Ob3dJbmRpY2F0b3JDb250YWluZXIgPSBOb3dJbmRpY2F0b3JDb250YWluZXI7XG5leHBvcnRzLk5vd1RpbWVyID0gTm93VGltZXI7XG5leHBvcnRzLlBvc2l0aW9uQ2FjaGUgPSBQb3NpdGlvbkNhY2hlO1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuUmVmTWFwID0gUmVmTWFwO1xuZXhwb3J0cy5SZW5kZXJJZCA9IFJlbmRlcklkO1xuZXhwb3J0cy5TY3JvbGxDb250cm9sbGVyID0gU2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuU2Nyb2xsUmVzcG9uZGVyID0gU2Nyb2xsUmVzcG9uZGVyO1xuZXhwb3J0cy5TY3JvbGxlciA9IFNjcm9sbGVyO1xuZXhwb3J0cy5TZWdIaWVyYXJjaHkgPSBTZWdIaWVyYXJjaHk7XG5leHBvcnRzLlNpbXBsZVNjcm9sbEdyaWQgPSBTaW1wbGVTY3JvbGxHcmlkO1xuZXhwb3J0cy5TbGljZXIgPSBTbGljZXI7XG5leHBvcnRzLlNwbGl0dGVyID0gU3BsaXR0ZXI7XG5leHBvcnRzLlN0YW5kYXJkRXZlbnQgPSBTdGFuZGFyZEV2ZW50O1xuZXhwb3J0cy5UYWJsZURhdGVDZWxsID0gVGFibGVEYXRlQ2VsbDtcbmV4cG9ydHMuVGFibGVEb3dDZWxsID0gVGFibGVEb3dDZWxsO1xuZXhwb3J0cy5UaGVtZSA9IFRoZW1lO1xuZXhwb3J0cy5WSUVXX09QVElPTl9SRUZJTkVSUyA9IFZJRVdfT1BUSU9OX1JFRklORVJTO1xuZXhwb3J0cy5WaWV3Q29udGFpbmVyID0gVmlld0NvbnRhaW5lcjtcbmV4cG9ydHMuVmlld0NvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuZXhwb3J0cy5XZWVrTnVtYmVyQ29udGFpbmVyID0gV2Vla051bWJlckNvbnRhaW5lcjtcbmV4cG9ydHMuV2luZG93U2Nyb2xsQ29udHJvbGxlciA9IFdpbmRvd1Njcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLmFkZERheXMgPSBhZGREYXlzO1xuZXhwb3J0cy5hZGREdXJhdGlvbnMgPSBhZGREdXJhdGlvbnM7XG5leHBvcnRzLmFkZE1zID0gYWRkTXM7XG5leHBvcnRzLmFkZFdlZWtzID0gYWRkV2Vla3M7XG5leHBvcnRzLmFsbG93Q29udGV4dE1lbnUgPSBhbGxvd0NvbnRleHRNZW51O1xuZXhwb3J0cy5hbGxvd1NlbGVjdGlvbiA9IGFsbG93U2VsZWN0aW9uO1xuZXhwb3J0cy5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlID0gYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZTtcbmV4cG9ydHMuYXBwbHlTdHlsZSA9IGFwcGx5U3R5bGU7XG5leHBvcnRzLmFwcGx5U3R5bGVQcm9wID0gYXBwbHlTdHlsZVByb3A7XG5leHBvcnRzLmFycmF5VG9IYXNoID0gYXJyYXlUb0hhc2g7XG5leHBvcnRzLmFzQ2xlYW5EYXlzID0gYXNDbGVhbkRheXM7XG5leHBvcnRzLmFzUm91Z2hNaW51dGVzID0gYXNSb3VnaE1pbnV0ZXM7XG5leHBvcnRzLmFzUm91Z2hNcyA9IGFzUm91Z2hNcztcbmV4cG9ydHMuYXNSb3VnaFNlY29uZHMgPSBhc1JvdWdoU2Vjb25kcztcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gYmluYXJ5U2VhcmNoO1xuZXhwb3J0cy5idWlsZEVsQXR0cnMgPSBidWlsZEVsQXR0cnM7XG5leHBvcnRzLmJ1aWxkRW50cnlLZXkgPSBidWlsZEVudHJ5S2V5O1xuZXhwb3J0cy5idWlsZEV2ZW50QXBpcyA9IGJ1aWxkRXZlbnRBcGlzO1xuZXhwb3J0cy5idWlsZEV2ZW50UmFuZ2VLZXkgPSBidWlsZEV2ZW50UmFuZ2VLZXk7XG5leHBvcnRzLmJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyA9IGJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycztcbmV4cG9ydHMuYnVpbGRJc29TdHJpbmcgPSBidWlsZElzb1N0cmluZztcbmV4cG9ydHMuYnVpbGROYXZMaW5rQXR0cnMgPSBidWlsZE5hdkxpbmtBdHRycztcbmV4cG9ydHMuYnVpbGRSYW5nZUFwaVdpdGhUaW1lWm9uZSA9IGJ1aWxkUmFuZ2VBcGlXaXRoVGltZVpvbmU7XG5leHBvcnRzLmJ1aWxkU2VnVGltZVRleHQgPSBidWlsZFNlZ1RpbWVUZXh0O1xuZXhwb3J0cy5idWlsZFZpZXdDbGFzc05hbWVzID0gYnVpbGRWaWV3Q2xhc3NOYW1lcztcbmV4cG9ydHMuYnVpbGRWaWV3Q29udGV4dCA9IGJ1aWxkVmlld0NvbnRleHQ7XG5leHBvcnRzLmNvbGxlY3RGcm9tSGFzaCA9IGNvbGxlY3RGcm9tSGFzaDtcbmV4cG9ydHMuY29tYmluZUV2ZW50VWlzID0gY29tYmluZUV2ZW50VWlzO1xuZXhwb3J0cy5jb21wYXJlQnlGaWVsZFNwZWNzID0gY29tcGFyZUJ5RmllbGRTcGVjcztcbmV4cG9ydHMuY29tcGFyZU51bWJlcnMgPSBjb21wYXJlTnVtYmVycztcbmV4cG9ydHMuY29tcGFyZU9ianMgPSBjb21wYXJlT2JqcztcbmV4cG9ydHMuY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQgPSBjb21wdXRlRWFybGllc3RTZWdTdGFydDtcbmV4cG9ydHMuY29tcHV0ZUVkZ2VzID0gY29tcHV0ZUVkZ2VzO1xuZXhwb3J0cy5jb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQgPSBjb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQ7XG5leHBvcnRzLmNvbXB1dGVJbm5lclJlY3QgPSBjb21wdXRlSW5uZXJSZWN0O1xuZXhwb3J0cy5jb21wdXRlUmVjdCA9IGNvbXB1dGVSZWN0O1xuZXhwb3J0cy5jb21wdXRlU2hyaW5rV2lkdGggPSBjb21wdXRlU2hyaW5rV2lkdGg7XG5leHBvcnRzLmNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UgPSBjb21wdXRlVmlzaWJsZURheVJhbmdlO1xuZXhwb3J0cy5jb25maWcgPSBjb25maWc7XG5leHBvcnRzLmNvbnN0cmFpblBvaW50ID0gY29uc3RyYWluUG9pbnQ7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVEdXJhdGlvbiA9IGNyZWF0ZUR1cmF0aW9uO1xuZXhwb3J0cy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmU7XG5leHBvcnRzLmNyZWF0ZUV2ZW50SW5zdGFuY2UgPSBjcmVhdGVFdmVudEluc3RhbmNlO1xuZXhwb3J0cy5jcmVhdGVFdmVudFVpID0gY3JlYXRlRXZlbnRVaTtcbmV4cG9ydHMuY3JlYXRlRm9ybWF0dGVyID0gY3JlYXRlRm9ybWF0dGVyO1xuZXhwb3J0cy5kaWZmRGF0ZXMgPSBkaWZmRGF0ZXM7XG5leHBvcnRzLmRpZmZEYXlBbmRUaW1lID0gZGlmZkRheUFuZFRpbWU7XG5leHBvcnRzLmRpZmZEYXlzID0gZGlmZkRheXM7XG5leHBvcnRzLmRpZmZQb2ludHMgPSBkaWZmUG9pbnRzO1xuZXhwb3J0cy5kaWZmV2Vla3MgPSBkaWZmV2Vla3M7XG5leHBvcnRzLmRpZmZXaG9sZURheXMgPSBkaWZmV2hvbGVEYXlzO1xuZXhwb3J0cy5kaWZmV2hvbGVXZWVrcyA9IGRpZmZXaG9sZVdlZWtzO1xuZXhwb3J0cy5kaXNhYmxlQ3Vyc29yID0gZGlzYWJsZUN1cnNvcjtcbmV4cG9ydHMuZWxlbWVudENsb3Nlc3QgPSBlbGVtZW50Q2xvc2VzdDtcbmV4cG9ydHMuZWxlbWVudE1hdGNoZXMgPSBlbGVtZW50TWF0Y2hlcztcbmV4cG9ydHMuZW5hYmxlQ3Vyc29yID0gZW5hYmxlQ3Vyc29yO1xuZXhwb3J0cy5lbnN1cmVFbEhhc1N0eWxlcyA9IGVuc3VyZUVsSGFzU3R5bGVzO1xuZXhwb3J0cy5ldmVudFR1cGxlVG9TdG9yZSA9IGV2ZW50VHVwbGVUb1N0b3JlO1xuZXhwb3J0cy5maWx0ZXJIYXNoID0gZmlsdGVySGFzaDtcbmV4cG9ydHMuZmluZERpcmVjdENoaWxkcmVuID0gZmluZERpcmVjdENoaWxkcmVuO1xuZXhwb3J0cy5maW5kRWxlbWVudHMgPSBmaW5kRWxlbWVudHM7XG5leHBvcnRzLmZsZXhpYmxlQ29tcGFyZSA9IGZsZXhpYmxlQ29tcGFyZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jO1xuZXhwb3J0cy5mb3JtYXREYXlTdHJpbmcgPSBmb3JtYXREYXlTdHJpbmc7XG5leHBvcnRzLmZvcm1hdElzb01vbnRoU3RyID0gZm9ybWF0SXNvTW9udGhTdHI7XG5leHBvcnRzLmZvcm1hdElzb1RpbWVTdHJpbmcgPSBmb3JtYXRJc29UaW1lU3RyaW5nO1xuZXhwb3J0cy5mb3JtYXRXaXRoT3JkaW5hbHMgPSBmb3JtYXRXaXRoT3JkaW5hbHM7XG5leHBvcnRzLmdldEFsbG93WVNjcm9sbGluZyA9IGdldEFsbG93WVNjcm9sbGluZztcbmV4cG9ydHMuZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsID0gZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsO1xuZXhwb3J0cy5nZXRDbGlwcGluZ1BhcmVudHMgPSBnZXRDbGlwcGluZ1BhcmVudHM7XG5leHBvcnRzLmdldERhdGVNZXRhID0gZ2V0RGF0ZU1ldGE7XG5leHBvcnRzLmdldERheUNsYXNzTmFtZXMgPSBnZXREYXlDbGFzc05hbWVzO1xuZXhwb3J0cy5nZXREZWZhdWx0RXZlbnRFbmQgPSBnZXREZWZhdWx0RXZlbnRFbmQ7XG5leHBvcnRzLmdldEVsU2VnID0gZ2V0RWxTZWc7XG5leHBvcnRzLmdldEVudHJ5U3BhbkVuZCA9IGdldEVudHJ5U3BhbkVuZDtcbmV4cG9ydHMuZ2V0RXZlbnRUYXJnZXRWaWFSb290ID0gZ2V0RXZlbnRUYXJnZXRWaWFSb290O1xuZXhwb3J0cy5nZXRJbml0aWFsRGF0ZSA9IGdldEluaXRpYWxEYXRlO1xuZXhwb3J0cy5nZXRJc1J0bFNjcm9sbGJhck9uTGVmdCA9IGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0O1xuZXhwb3J0cy5nZXROb3cgPSBnZXROb3c7XG5leHBvcnRzLmdldFJlY3RDZW50ZXIgPSBnZXRSZWN0Q2VudGVyO1xuZXhwb3J0cy5nZXRSZWxldmFudEV2ZW50cyA9IGdldFJlbGV2YW50RXZlbnRzO1xuZXhwb3J0cy5nZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcyA9IGdldFNjcm9sbEdyaWRDbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTY3JvbGxiYXJXaWR0aHMgPSBnZXRTY3JvbGxiYXJXaWR0aHM7XG5leHBvcnRzLmdldFNlY3Rpb25DbGFzc05hbWVzID0gZ2V0U2VjdGlvbkNsYXNzTmFtZXM7XG5leHBvcnRzLmdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQgPSBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0O1xuZXhwb3J0cy5nZXRTZWdBbmNob3JBdHRycyA9IGdldFNlZ0FuY2hvckF0dHJzO1xuZXhwb3J0cy5nZXRTZWdNZXRhID0gZ2V0U2VnTWV0YTtcbmV4cG9ydHMuZ2V0U2xvdENsYXNzTmFtZXMgPSBnZXRTbG90Q2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyO1xuZXhwb3J0cy5nZXRTdGlja3lIZWFkZXJEYXRlcyA9IGdldFN0aWNreUhlYWRlckRhdGVzO1xuZXhwb3J0cy5nZXRVbmlxdWVEb21JZCA9IGdldFVuaXF1ZURvbUlkO1xuZXhwb3J0cy5ncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IgPSBncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3I7XG5leHBvcnRzLmdyb3VwSW50ZXJzZWN0aW5nRW50cmllcyA9IGdyb3VwSW50ZXJzZWN0aW5nRW50cmllcztcbmV4cG9ydHMuZ3VpZCA9IGd1aWQ7XG5leHBvcnRzLmhhc0JnUmVuZGVyaW5nID0gaGFzQmdSZW5kZXJpbmc7XG5leHBvcnRzLmhhc0N1c3RvbURheUNlbGxDb250ZW50ID0gaGFzQ3VzdG9tRGF5Q2VsbENvbnRlbnQ7XG5leHBvcnRzLmhhc1Nocmlua1dpZHRoID0gaGFzU2hyaW5rV2lkdGg7XG5leHBvcnRzLmhhc2hWYWx1ZXNUb0FycmF5ID0gaGFzaFZhbHVlc1RvQXJyYXk7XG5leHBvcnRzLmlkZW50aXR5ID0gaWRlbnRpdHk7XG5leHBvcnRzLmluamVjdFN0eWxlcyA9IGluamVjdFN0eWxlcztcbmV4cG9ydHMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0gaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSA9IGludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlO1xuZXhwb3J0cy5pbnRlcnNlY3RSYW5nZXMgPSBpbnRlcnNlY3RSYW5nZXM7XG5leHBvcnRzLmludGVyc2VjdFJlY3RzID0gaW50ZXJzZWN0UmVjdHM7XG5leHBvcnRzLmludGVyc2VjdFNwYW5zID0gaW50ZXJzZWN0U3BhbnM7XG5leHBvcnRzLmlzQXJyYXlzRXF1YWwgPSBpc0FycmF5c0VxdWFsO1xuZXhwb3J0cy5pc0NvbFByb3BzRXF1YWwgPSBpc0NvbFByb3BzRXF1YWw7XG5leHBvcnRzLmlzRGF0ZVNlbGVjdGlvblZhbGlkID0gaXNEYXRlU2VsZWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzRGF0ZVNwYW5zRXF1YWwgPSBpc0RhdGVTcGFuc0VxdWFsO1xuZXhwb3J0cy5pc0ludCA9IGlzSW50O1xuZXhwb3J0cy5pc0ludGVyYWN0aW9uVmFsaWQgPSBpc0ludGVyYWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzTXVsdGlEYXlSYW5nZSA9IGlzTXVsdGlEYXlSYW5nZTtcbmV4cG9ydHMuaXNQcm9wc0VxdWFsID0gaXNQcm9wc0VxdWFsO1xuZXhwb3J0cy5pc1Byb3BzVmFsaWQgPSBpc1Byb3BzVmFsaWQ7XG5leHBvcnRzLmlzVmFsaWREYXRlID0gaXNWYWxpZERhdGU7XG5leHBvcnRzLmxpc3RlbkJ5U2VsZWN0b3IgPSBsaXN0ZW5CeVNlbGVjdG9yO1xuZXhwb3J0cy5saXN0ZW5Ub0hvdmVyQnlTZWxlY3RvciA9IGxpc3RlblRvSG92ZXJCeVNlbGVjdG9yO1xuZXhwb3J0cy5tYXBIYXNoID0gbWFwSGFzaDtcbmV4cG9ydHMubWVtb2l6ZSA9IG1lbW9pemU7XG5leHBvcnRzLm1lbW9pemVBcnJheWxpa2UgPSBtZW1vaXplQXJyYXlsaWtlO1xuZXhwb3J0cy5tZW1vaXplSGFzaGxpa2UgPSBtZW1vaXplSGFzaGxpa2U7XG5leHBvcnRzLm1lbW9pemVPYmpBcmcgPSBtZW1vaXplT2JqQXJnO1xuZXhwb3J0cy5tZXJnZUV2ZW50U3RvcmVzID0gbWVyZ2VFdmVudFN0b3JlcztcbmV4cG9ydHMubWVyZ2VQcm9wcyA9IG1lcmdlUHJvcHM7XG5leHBvcnRzLm1lcmdlUmF3T3B0aW9ucyA9IG1lcmdlUmF3T3B0aW9ucztcbmV4cG9ydHMubXVsdGlwbHlEdXJhdGlvbiA9IG11bHRpcGx5RHVyYXRpb247XG5leHBvcnRzLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnBhcnNlQnVzaW5lc3NIb3VycyA9IHBhcnNlQnVzaW5lc3NIb3VycztcbmV4cG9ydHMucGFyc2VDbGFzc05hbWVzID0gcGFyc2VDbGFzc05hbWVzO1xuZXhwb3J0cy5wYXJzZURyYWdNZXRhID0gcGFyc2VEcmFnTWV0YTtcbmV4cG9ydHMucGFyc2VFdmVudERlZiA9IHBhcnNlRXZlbnREZWY7XG5leHBvcnRzLnBhcnNlRXZlbnRTb3VyY2UgPSBwYXJzZUV2ZW50U291cmNlO1xuZXhwb3J0cy5wYXJzZUZpZWxkU3BlY3MgPSBwYXJzZUZpZWxkU3BlY3M7XG5leHBvcnRzLnBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyA9IHBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncztcbmV4cG9ydHMucG9pbnRJbnNpZGVSZWN0ID0gcG9pbnRJbnNpZGVSZWN0O1xuZXhwb3J0cy5wcmV2ZW50Q29udGV4dE1lbnUgPSBwcmV2ZW50Q29udGV4dE1lbnU7XG5leHBvcnRzLnByZXZlbnREZWZhdWx0ID0gcHJldmVudERlZmF1bHQ7XG5leHBvcnRzLnByZXZlbnRTZWxlY3Rpb24gPSBwcmV2ZW50U2VsZWN0aW9uO1xuZXhwb3J0cy5yYW5nZUNvbnRhaW5zTWFya2VyID0gcmFuZ2VDb250YWluc01hcmtlcjtcbmV4cG9ydHMucmFuZ2VDb250YWluc1JhbmdlID0gcmFuZ2VDb250YWluc1JhbmdlO1xuZXhwb3J0cy5yYW5nZXNFcXVhbCA9IHJhbmdlc0VxdWFsO1xuZXhwb3J0cy5yYW5nZXNJbnRlcnNlY3QgPSByYW5nZXNJbnRlcnNlY3Q7XG5leHBvcnRzLnJlZHVjZUN1cnJlbnREYXRlID0gcmVkdWNlQ3VycmVudERhdGU7XG5leHBvcnRzLnJlZHVjZUV2ZW50U3RvcmUgPSByZWR1Y2VFdmVudFN0b3JlO1xuZXhwb3J0cy5yZWZpbmVFdmVudERlZiA9IHJlZmluZUV2ZW50RGVmO1xuZXhwb3J0cy5yZWZpbmVQcm9wcyA9IHJlZmluZVByb3BzO1xuZXhwb3J0cy5yZW1vdmVFbGVtZW50ID0gcmVtb3ZlRWxlbWVudDtcbmV4cG9ydHMucmVtb3ZlRXhhY3QgPSByZW1vdmVFeGFjdDtcbmV4cG9ydHMucmVuZGVyQ2h1bmtDb250ZW50ID0gcmVuZGVyQ2h1bmtDb250ZW50O1xuZXhwb3J0cy5yZW5kZXJGaWxsID0gcmVuZGVyRmlsbDtcbmV4cG9ydHMucmVuZGVyTWljcm9Db2xHcm91cCA9IHJlbmRlck1pY3JvQ29sR3JvdXA7XG5leHBvcnRzLnJlbmRlclNjcm9sbFNoaW0gPSByZW5kZXJTY3JvbGxTaGltO1xuZXhwb3J0cy5yZXF1ZXN0SnNvbiA9IHJlcXVlc3RKc29uO1xuZXhwb3J0cy5yZXpvbmVFdmVudFN0b3JlRGF0ZXMgPSByZXpvbmVFdmVudFN0b3JlRGF0ZXM7XG5leHBvcnRzLnNhbml0aXplU2hyaW5rV2lkdGggPSBzYW5pdGl6ZVNocmlua1dpZHRoO1xuZXhwb3J0cy5zZXRSZWYgPSBzZXRSZWY7XG5leHBvcnRzLnNsaWNlRXZlbnRTdG9yZSA9IHNsaWNlRXZlbnRTdG9yZTtcbmV4cG9ydHMuc29ydEV2ZW50U2VncyA9IHNvcnRFdmVudFNlZ3M7XG5leHBvcnRzLnN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5O1xuZXhwb3J0cy5zdWJ0cmFjdER1cmF0aW9ucyA9IHN1YnRyYWN0RHVyYXRpb25zO1xuZXhwb3J0cy50cmFuc2xhdGVSZWN0ID0gdHJhbnNsYXRlUmVjdDtcbmV4cG9ydHMudHJpZ2dlckRhdGVTZWxlY3QgPSB0cmlnZ2VyRGF0ZVNlbGVjdDtcbmV4cG9ydHMudW5wcm9taXNpZnkgPSB1bnByb21pc2lmeTtcbmV4cG9ydHMud2hlblRyYW5zaXRpb25Eb25lID0gd2hlblRyYW5zaXRpb25Eb25lO1xuZXhwb3J0cy53aG9sZURpdmlkZUR1cmF0aW9ucyA9IHdob2xlRGl2aWRlRHVyYXRpb25zO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgaW50ZXJuYWxDb21tb24gPSByZXF1aXJlKCcuL2ludGVybmFsLWNvbW1vbi5janMnKTtcbnJlcXVpcmUoJ3ByZWFjdCcpO1xucmVxdWlyZSgncHJlYWN0L2NvbXBhdCcpO1xuXG5cblxuZXhwb3J0cy5CQVNFX09QVElPTl9ERUZBVUxUUyA9IGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTO1xuZXhwb3J0cy5CYXNlQ29tcG9uZW50ID0gaW50ZXJuYWxDb21tb24uQmFzZUNvbXBvbmVudDtcbmV4cG9ydHMuQmdFdmVudCA9IGludGVybmFsQ29tbW9uLkJnRXZlbnQ7XG5leHBvcnRzLkNhbGVuZGFySW1wbCA9IGludGVybmFsQ29tbW9uLkNhbGVuZGFySW1wbDtcbmV4cG9ydHMuQ2FsZW5kYXJSb290ID0gaW50ZXJuYWxDb21tb24uQ2FsZW5kYXJSb290O1xuZXhwb3J0cy5Db250ZW50Q29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uQ29udGVudENvbnRhaW5lcjtcbmV4cG9ydHMuQ3VzdG9tUmVuZGVyaW5nU3RvcmUgPSBpbnRlcm5hbENvbW1vbi5DdXN0b21SZW5kZXJpbmdTdG9yZTtcbmV4cG9ydHMuRGF0ZUNvbXBvbmVudCA9IGludGVybmFsQ29tbW9uLkRhdGVDb21wb25lbnQ7XG5leHBvcnRzLkRhdGVFbnYgPSBpbnRlcm5hbENvbW1vbi5EYXRlRW52O1xuZXhwb3J0cy5EYXRlUHJvZmlsZUdlbmVyYXRvciA9IGludGVybmFsQ29tbW9uLkRhdGVQcm9maWxlR2VuZXJhdG9yO1xuZXhwb3J0cy5EYXlDZWxsQ29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uRGF5Q2VsbENvbnRhaW5lcjtcbmV4cG9ydHMuRGF5SGVhZGVyID0gaW50ZXJuYWxDb21tb24uRGF5SGVhZGVyO1xuZXhwb3J0cy5EYXlTZXJpZXNNb2RlbCA9IGludGVybmFsQ29tbW9uLkRheVNlcmllc01vZGVsO1xuZXhwb3J0cy5EYXlUYWJsZU1vZGVsID0gaW50ZXJuYWxDb21tb24uRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuRGVsYXllZFJ1bm5lciA9IGludGVybmFsQ29tbW9uLkRlbGF5ZWRSdW5uZXI7XG5leHBvcnRzLkVsZW1lbnREcmFnZ2luZyA9IGludGVybmFsQ29tbW9uLkVsZW1lbnREcmFnZ2luZztcbmV4cG9ydHMuRWxlbWVudFNjcm9sbENvbnRyb2xsZXIgPSBpbnRlcm5hbENvbW1vbi5FbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuRW1pdHRlciA9IGludGVybmFsQ29tbW9uLkVtaXR0ZXI7XG5leHBvcnRzLkV2ZW50Q29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uRXZlbnRDb250YWluZXI7XG5leHBvcnRzLkV2ZW50SW1wbCA9IGludGVybmFsQ29tbW9uLkV2ZW50SW1wbDtcbmV4cG9ydHMuSW50ZXJhY3Rpb24gPSBpbnRlcm5hbENvbW1vbi5JbnRlcmFjdGlvbjtcbmV4cG9ydHMuTW9yZUxpbmtDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5Nb3JlTGlua0NvbnRhaW5lcjtcbmV4cG9ydHMuTmFtZWRUaW1lWm9uZUltcGwgPSBpbnRlcm5hbENvbW1vbi5OYW1lZFRpbWVab25lSW1wbDtcbmV4cG9ydHMuTm93SW5kaWNhdG9yQ29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uTm93SW5kaWNhdG9yQ29udGFpbmVyO1xuZXhwb3J0cy5Ob3dUaW1lciA9IGludGVybmFsQ29tbW9uLk5vd1RpbWVyO1xuZXhwb3J0cy5Qb3NpdGlvbkNhY2hlID0gaW50ZXJuYWxDb21tb24uUG9zaXRpb25DYWNoZTtcbmV4cG9ydHMuUmVmTWFwID0gaW50ZXJuYWxDb21tb24uUmVmTWFwO1xuZXhwb3J0cy5TY3JvbGxDb250cm9sbGVyID0gaW50ZXJuYWxDb21tb24uU2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuU2Nyb2xsUmVzcG9uZGVyID0gaW50ZXJuYWxDb21tb24uU2Nyb2xsUmVzcG9uZGVyO1xuZXhwb3J0cy5TY3JvbGxlciA9IGludGVybmFsQ29tbW9uLlNjcm9sbGVyO1xuZXhwb3J0cy5TZWdIaWVyYXJjaHkgPSBpbnRlcm5hbENvbW1vbi5TZWdIaWVyYXJjaHk7XG5leHBvcnRzLlNpbXBsZVNjcm9sbEdyaWQgPSBpbnRlcm5hbENvbW1vbi5TaW1wbGVTY3JvbGxHcmlkO1xuZXhwb3J0cy5TbGljZXIgPSBpbnRlcm5hbENvbW1vbi5TbGljZXI7XG5leHBvcnRzLlNwbGl0dGVyID0gaW50ZXJuYWxDb21tb24uU3BsaXR0ZXI7XG5leHBvcnRzLlN0YW5kYXJkRXZlbnQgPSBpbnRlcm5hbENvbW1vbi5TdGFuZGFyZEV2ZW50O1xuZXhwb3J0cy5UYWJsZURhdGVDZWxsID0gaW50ZXJuYWxDb21tb24uVGFibGVEYXRlQ2VsbDtcbmV4cG9ydHMuVGFibGVEb3dDZWxsID0gaW50ZXJuYWxDb21tb24uVGFibGVEb3dDZWxsO1xuZXhwb3J0cy5UaGVtZSA9IGludGVybmFsQ29tbW9uLlRoZW1lO1xuZXhwb3J0cy5WaWV3Q29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uVmlld0NvbnRhaW5lcjtcbmV4cG9ydHMuVmlld0NvbnRleHRUeXBlID0gaW50ZXJuYWxDb21tb24uVmlld0NvbnRleHRUeXBlO1xuZXhwb3J0cy5XZWVrTnVtYmVyQ29udGFpbmVyID0gaW50ZXJuYWxDb21tb24uV2Vla051bWJlckNvbnRhaW5lcjtcbmV4cG9ydHMuV2luZG93U2Nyb2xsQ29udHJvbGxlciA9IGludGVybmFsQ29tbW9uLldpbmRvd1Njcm9sbENvbnRyb2xsZXI7XG5leHBvcnRzLmFkZERheXMgPSBpbnRlcm5hbENvbW1vbi5hZGREYXlzO1xuZXhwb3J0cy5hZGREdXJhdGlvbnMgPSBpbnRlcm5hbENvbW1vbi5hZGREdXJhdGlvbnM7XG5leHBvcnRzLmFkZE1zID0gaW50ZXJuYWxDb21tb24uYWRkTXM7XG5leHBvcnRzLmFkZFdlZWtzID0gaW50ZXJuYWxDb21tb24uYWRkV2Vla3M7XG5leHBvcnRzLmFsbG93Q29udGV4dE1lbnUgPSBpbnRlcm5hbENvbW1vbi5hbGxvd0NvbnRleHRNZW51O1xuZXhwb3J0cy5hbGxvd1NlbGVjdGlvbiA9IGludGVybmFsQ29tbW9uLmFsbG93U2VsZWN0aW9uO1xuZXhwb3J0cy5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlID0gaW50ZXJuYWxDb21tb24uYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZTtcbmV4cG9ydHMuYXBwbHlTdHlsZSA9IGludGVybmFsQ29tbW9uLmFwcGx5U3R5bGU7XG5leHBvcnRzLmFzQ2xlYW5EYXlzID0gaW50ZXJuYWxDb21tb24uYXNDbGVhbkRheXM7XG5leHBvcnRzLmFzUm91Z2hNaW51dGVzID0gaW50ZXJuYWxDb21tb24uYXNSb3VnaE1pbnV0ZXM7XG5leHBvcnRzLmFzUm91Z2hNcyA9IGludGVybmFsQ29tbW9uLmFzUm91Z2hNcztcbmV4cG9ydHMuYXNSb3VnaFNlY29uZHMgPSBpbnRlcm5hbENvbW1vbi5hc1JvdWdoU2Vjb25kcztcbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gaW50ZXJuYWxDb21tb24uYmluYXJ5U2VhcmNoO1xuZXhwb3J0cy5idWlsZEVsQXR0cnMgPSBpbnRlcm5hbENvbW1vbi5idWlsZEVsQXR0cnM7XG5leHBvcnRzLmJ1aWxkRW50cnlLZXkgPSBpbnRlcm5hbENvbW1vbi5idWlsZEVudHJ5S2V5O1xuZXhwb3J0cy5idWlsZEV2ZW50QXBpcyA9IGludGVybmFsQ29tbW9uLmJ1aWxkRXZlbnRBcGlzO1xuZXhwb3J0cy5idWlsZEV2ZW50UmFuZ2VLZXkgPSBpbnRlcm5hbENvbW1vbi5idWlsZEV2ZW50UmFuZ2VLZXk7XG5leHBvcnRzLmJ1aWxkSXNvU3RyaW5nID0gaW50ZXJuYWxDb21tb24uYnVpbGRJc29TdHJpbmc7XG5leHBvcnRzLmJ1aWxkTmF2TGlua0F0dHJzID0gaW50ZXJuYWxDb21tb24uYnVpbGROYXZMaW5rQXR0cnM7XG5leHBvcnRzLmJ1aWxkU2VnVGltZVRleHQgPSBpbnRlcm5hbENvbW1vbi5idWlsZFNlZ1RpbWVUZXh0O1xuZXhwb3J0cy5jb2xsZWN0RnJvbUhhc2ggPSBpbnRlcm5hbENvbW1vbi5jb2xsZWN0RnJvbUhhc2g7XG5leHBvcnRzLmNvbWJpbmVFdmVudFVpcyA9IGludGVybmFsQ29tbW9uLmNvbWJpbmVFdmVudFVpcztcbmV4cG9ydHMuY29tcGFyZUJ5RmllbGRTcGVjcyA9IGludGVybmFsQ29tbW9uLmNvbXBhcmVCeUZpZWxkU3BlY3M7XG5leHBvcnRzLmNvbXBhcmVOdW1iZXJzID0gaW50ZXJuYWxDb21tb24uY29tcGFyZU51bWJlcnM7XG5leHBvcnRzLmNvbXBhcmVPYmpzID0gaW50ZXJuYWxDb21tb24uY29tcGFyZU9ianM7XG5leHBvcnRzLmNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0ID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQ7XG5leHBvcnRzLmNvbXB1dGVFZGdlcyA9IGludGVybmFsQ29tbW9uLmNvbXB1dGVFZGdlcztcbmV4cG9ydHMuY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0ID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0O1xuZXhwb3J0cy5jb21wdXRlSW5uZXJSZWN0ID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZUlubmVyUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVJlY3QgPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlUmVjdDtcbmV4cG9ydHMuY29tcHV0ZVNocmlua1dpZHRoID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZVNocmlua1dpZHRoO1xuZXhwb3J0cy5jb21wdXRlVmlzaWJsZURheVJhbmdlID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZVZpc2libGVEYXlSYW5nZTtcbmV4cG9ydHMuY29uZmlnID0gaW50ZXJuYWxDb21tb24uY29uZmlnO1xuZXhwb3J0cy5jb25zdHJhaW5Qb2ludCA9IGludGVybmFsQ29tbW9uLmNvbnN0cmFpblBvaW50O1xuZXhwb3J0cy5jcmVhdGVEdXJhdGlvbiA9IGludGVybmFsQ29tbW9uLmNyZWF0ZUR1cmF0aW9uO1xuZXhwb3J0cy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVFbXB0eUV2ZW50U3RvcmU7XG5leHBvcnRzLmNyZWF0ZUV2ZW50SW5zdGFuY2UgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVFdmVudEluc3RhbmNlO1xuZXhwb3J0cy5jcmVhdGVFdmVudFVpID0gaW50ZXJuYWxDb21tb24uY3JlYXRlRXZlbnRVaTtcbmV4cG9ydHMuY3JlYXRlRm9ybWF0dGVyID0gaW50ZXJuYWxDb21tb24uY3JlYXRlRm9ybWF0dGVyO1xuZXhwb3J0cy5kaWZmRGF0ZXMgPSBpbnRlcm5hbENvbW1vbi5kaWZmRGF0ZXM7XG5leHBvcnRzLmRpZmZEYXlBbmRUaW1lID0gaW50ZXJuYWxDb21tb24uZGlmZkRheUFuZFRpbWU7XG5leHBvcnRzLmRpZmZEYXlzID0gaW50ZXJuYWxDb21tb24uZGlmZkRheXM7XG5leHBvcnRzLmRpZmZQb2ludHMgPSBpbnRlcm5hbENvbW1vbi5kaWZmUG9pbnRzO1xuZXhwb3J0cy5kaWZmV2Vla3MgPSBpbnRlcm5hbENvbW1vbi5kaWZmV2Vla3M7XG5leHBvcnRzLmRpZmZXaG9sZURheXMgPSBpbnRlcm5hbENvbW1vbi5kaWZmV2hvbGVEYXlzO1xuZXhwb3J0cy5kaWZmV2hvbGVXZWVrcyA9IGludGVybmFsQ29tbW9uLmRpZmZXaG9sZVdlZWtzO1xuZXhwb3J0cy5kaXNhYmxlQ3Vyc29yID0gaW50ZXJuYWxDb21tb24uZGlzYWJsZUN1cnNvcjtcbmV4cG9ydHMuZWxlbWVudENsb3Nlc3QgPSBpbnRlcm5hbENvbW1vbi5lbGVtZW50Q2xvc2VzdDtcbmV4cG9ydHMuZWxlbWVudE1hdGNoZXMgPSBpbnRlcm5hbENvbW1vbi5lbGVtZW50TWF0Y2hlcztcbmV4cG9ydHMuZW5hYmxlQ3Vyc29yID0gaW50ZXJuYWxDb21tb24uZW5hYmxlQ3Vyc29yO1xuZXhwb3J0cy5ldmVudFR1cGxlVG9TdG9yZSA9IGludGVybmFsQ29tbW9uLmV2ZW50VHVwbGVUb1N0b3JlO1xuZXhwb3J0cy5maWx0ZXJIYXNoID0gaW50ZXJuYWxDb21tb24uZmlsdGVySGFzaDtcbmV4cG9ydHMuZmluZERpcmVjdENoaWxkcmVuID0gaW50ZXJuYWxDb21tb24uZmluZERpcmVjdENoaWxkcmVuO1xuZXhwb3J0cy5maW5kRWxlbWVudHMgPSBpbnRlcm5hbENvbW1vbi5maW5kRWxlbWVudHM7XG5leHBvcnRzLmZsZXhpYmxlQ29tcGFyZSA9IGludGVybmFsQ29tbW9uLmZsZXhpYmxlQ29tcGFyZTtcbmV4cG9ydHMuZm9ybWF0RGF5U3RyaW5nID0gaW50ZXJuYWxDb21tb24uZm9ybWF0RGF5U3RyaW5nO1xuZXhwb3J0cy5mb3JtYXRJc29Nb250aFN0ciA9IGludGVybmFsQ29tbW9uLmZvcm1hdElzb01vbnRoU3RyO1xuZXhwb3J0cy5mb3JtYXRJc29UaW1lU3RyaW5nID0gaW50ZXJuYWxDb21tb24uZm9ybWF0SXNvVGltZVN0cmluZztcbmV4cG9ydHMuZ2V0QWxsb3dZU2Nyb2xsaW5nID0gaW50ZXJuYWxDb21tb24uZ2V0QWxsb3dZU2Nyb2xsaW5nO1xuZXhwb3J0cy5nZXRDYW5WR3Jvd1dpdGhpbkNlbGwgPSBpbnRlcm5hbENvbW1vbi5nZXRDYW5WR3Jvd1dpdGhpbkNlbGw7XG5leHBvcnRzLmdldENsaXBwaW5nUGFyZW50cyA9IGludGVybmFsQ29tbW9uLmdldENsaXBwaW5nUGFyZW50cztcbmV4cG9ydHMuZ2V0RGF0ZU1ldGEgPSBpbnRlcm5hbENvbW1vbi5nZXREYXRlTWV0YTtcbmV4cG9ydHMuZ2V0RGF5Q2xhc3NOYW1lcyA9IGludGVybmFsQ29tbW9uLmdldERheUNsYXNzTmFtZXM7XG5leHBvcnRzLmdldERlZmF1bHRFdmVudEVuZCA9IGludGVybmFsQ29tbW9uLmdldERlZmF1bHRFdmVudEVuZDtcbmV4cG9ydHMuZ2V0RWxTZWcgPSBpbnRlcm5hbENvbW1vbi5nZXRFbFNlZztcbmV4cG9ydHMuZ2V0RW50cnlTcGFuRW5kID0gaW50ZXJuYWxDb21tb24uZ2V0RW50cnlTcGFuRW5kO1xuZXhwb3J0cy5nZXRFdmVudFRhcmdldFZpYVJvb3QgPSBpbnRlcm5hbENvbW1vbi5nZXRFdmVudFRhcmdldFZpYVJvb3Q7XG5leHBvcnRzLmdldElzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gaW50ZXJuYWxDb21tb24uZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQ7XG5leHBvcnRzLmdldFJlY3RDZW50ZXIgPSBpbnRlcm5hbENvbW1vbi5nZXRSZWN0Q2VudGVyO1xuZXhwb3J0cy5nZXRSZWxldmFudEV2ZW50cyA9IGludGVybmFsQ29tbW9uLmdldFJlbGV2YW50RXZlbnRzO1xuZXhwb3J0cy5nZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcyA9IGludGVybmFsQ29tbW9uLmdldFNjcm9sbEdyaWRDbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTY3JvbGxiYXJXaWR0aHMgPSBpbnRlcm5hbENvbW1vbi5nZXRTY3JvbGxiYXJXaWR0aHM7XG5leHBvcnRzLmdldFNlY3Rpb25DbGFzc05hbWVzID0gaW50ZXJuYWxDb21tb24uZ2V0U2VjdGlvbkNsYXNzTmFtZXM7XG5leHBvcnRzLmdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQgPSBpbnRlcm5hbENvbW1vbi5nZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0O1xuZXhwb3J0cy5nZXRTZWdBbmNob3JBdHRycyA9IGludGVybmFsQ29tbW9uLmdldFNlZ0FuY2hvckF0dHJzO1xuZXhwb3J0cy5nZXRTZWdNZXRhID0gaW50ZXJuYWxDb21tb24uZ2V0U2VnTWV0YTtcbmV4cG9ydHMuZ2V0U2xvdENsYXNzTmFtZXMgPSBpbnRlcm5hbENvbW1vbi5nZXRTbG90Q2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gaW50ZXJuYWxDb21tb24uZ2V0U3RpY2t5Rm9vdGVyU2Nyb2xsYmFyO1xuZXhwb3J0cy5nZXRTdGlja3lIZWFkZXJEYXRlcyA9IGludGVybmFsQ29tbW9uLmdldFN0aWNreUhlYWRlckRhdGVzO1xuZXhwb3J0cy5nZXRVbmlxdWVEb21JZCA9IGludGVybmFsQ29tbW9uLmdldFVuaXF1ZURvbUlkO1xuZXhwb3J0cy5ncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IgPSBpbnRlcm5hbENvbW1vbi5ncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3I7XG5leHBvcnRzLmdyb3VwSW50ZXJzZWN0aW5nRW50cmllcyA9IGludGVybmFsQ29tbW9uLmdyb3VwSW50ZXJzZWN0aW5nRW50cmllcztcbmV4cG9ydHMuZ3VpZCA9IGludGVybmFsQ29tbW9uLmd1aWQ7XG5leHBvcnRzLmhhc0JnUmVuZGVyaW5nID0gaW50ZXJuYWxDb21tb24uaGFzQmdSZW5kZXJpbmc7XG5leHBvcnRzLmhhc0N1c3RvbURheUNlbGxDb250ZW50ID0gaW50ZXJuYWxDb21tb24uaGFzQ3VzdG9tRGF5Q2VsbENvbnRlbnQ7XG5leHBvcnRzLmhhc1Nocmlua1dpZHRoID0gaW50ZXJuYWxDb21tb24uaGFzU2hyaW5rV2lkdGg7XG5leHBvcnRzLmlkZW50aXR5ID0gaW50ZXJuYWxDb21tb24uaWRlbnRpdHk7XG5leHBvcnRzLmluamVjdFN0eWxlcyA9IGludGVybmFsQ29tbW9uLmluamVjdFN0eWxlcztcbmV4cG9ydHMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlID0gaW50ZXJuYWxDb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSA9IGludGVybmFsQ29tbW9uLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlO1xuZXhwb3J0cy5pbnRlcnNlY3RSYW5nZXMgPSBpbnRlcm5hbENvbW1vbi5pbnRlcnNlY3RSYW5nZXM7XG5leHBvcnRzLmludGVyc2VjdFJlY3RzID0gaW50ZXJuYWxDb21tb24uaW50ZXJzZWN0UmVjdHM7XG5leHBvcnRzLmludGVyc2VjdFNwYW5zID0gaW50ZXJuYWxDb21tb24uaW50ZXJzZWN0U3BhbnM7XG5leHBvcnRzLmlzQXJyYXlzRXF1YWwgPSBpbnRlcm5hbENvbW1vbi5pc0FycmF5c0VxdWFsO1xuZXhwb3J0cy5pc0NvbFByb3BzRXF1YWwgPSBpbnRlcm5hbENvbW1vbi5pc0NvbFByb3BzRXF1YWw7XG5leHBvcnRzLmlzRGF0ZVNlbGVjdGlvblZhbGlkID0gaW50ZXJuYWxDb21tb24uaXNEYXRlU2VsZWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzRGF0ZVNwYW5zRXF1YWwgPSBpbnRlcm5hbENvbW1vbi5pc0RhdGVTcGFuc0VxdWFsO1xuZXhwb3J0cy5pc0ludCA9IGludGVybmFsQ29tbW9uLmlzSW50O1xuZXhwb3J0cy5pc0ludGVyYWN0aW9uVmFsaWQgPSBpbnRlcm5hbENvbW1vbi5pc0ludGVyYWN0aW9uVmFsaWQ7XG5leHBvcnRzLmlzTXVsdGlEYXlSYW5nZSA9IGludGVybmFsQ29tbW9uLmlzTXVsdGlEYXlSYW5nZTtcbmV4cG9ydHMuaXNQcm9wc0VxdWFsID0gaW50ZXJuYWxDb21tb24uaXNQcm9wc0VxdWFsO1xuZXhwb3J0cy5pc1Byb3BzVmFsaWQgPSBpbnRlcm5hbENvbW1vbi5pc1Byb3BzVmFsaWQ7XG5leHBvcnRzLmlzVmFsaWREYXRlID0gaW50ZXJuYWxDb21tb24uaXNWYWxpZERhdGU7XG5leHBvcnRzLm1hcEhhc2ggPSBpbnRlcm5hbENvbW1vbi5tYXBIYXNoO1xuZXhwb3J0cy5tZW1vaXplID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZTtcbmV4cG9ydHMubWVtb2l6ZUFycmF5bGlrZSA9IGludGVybmFsQ29tbW9uLm1lbW9pemVBcnJheWxpa2U7XG5leHBvcnRzLm1lbW9pemVIYXNobGlrZSA9IGludGVybmFsQ29tbW9uLm1lbW9pemVIYXNobGlrZTtcbmV4cG9ydHMubWVtb2l6ZU9iakFyZyA9IGludGVybmFsQ29tbW9uLm1lbW9pemVPYmpBcmc7XG5leHBvcnRzLm1lcmdlRXZlbnRTdG9yZXMgPSBpbnRlcm5hbENvbW1vbi5tZXJnZUV2ZW50U3RvcmVzO1xuZXhwb3J0cy5tdWx0aXBseUR1cmF0aW9uID0gaW50ZXJuYWxDb21tb24ubXVsdGlwbHlEdXJhdGlvbjtcbmV4cG9ydHMucGFkU3RhcnQgPSBpbnRlcm5hbENvbW1vbi5wYWRTdGFydDtcbmV4cG9ydHMucGFyc2VCdXNpbmVzc0hvdXJzID0gaW50ZXJuYWxDb21tb24ucGFyc2VCdXNpbmVzc0hvdXJzO1xuZXhwb3J0cy5wYXJzZUNsYXNzTmFtZXMgPSBpbnRlcm5hbENvbW1vbi5wYXJzZUNsYXNzTmFtZXM7XG5leHBvcnRzLnBhcnNlRHJhZ01ldGEgPSBpbnRlcm5hbENvbW1vbi5wYXJzZURyYWdNZXRhO1xuZXhwb3J0cy5wYXJzZUV2ZW50RGVmID0gaW50ZXJuYWxDb21tb24ucGFyc2VFdmVudERlZjtcbmV4cG9ydHMucGFyc2VGaWVsZFNwZWNzID0gaW50ZXJuYWxDb21tb24ucGFyc2VGaWVsZFNwZWNzO1xuZXhwb3J0cy5wYXJzZU1hcmtlciA9IGludGVybmFsQ29tbW9uLnBhcnNlO1xuZXhwb3J0cy5wb2ludEluc2lkZVJlY3QgPSBpbnRlcm5hbENvbW1vbi5wb2ludEluc2lkZVJlY3Q7XG5leHBvcnRzLnByZXZlbnRDb250ZXh0TWVudSA9IGludGVybmFsQ29tbW9uLnByZXZlbnRDb250ZXh0TWVudTtcbmV4cG9ydHMucHJldmVudERlZmF1bHQgPSBpbnRlcm5hbENvbW1vbi5wcmV2ZW50RGVmYXVsdDtcbmV4cG9ydHMucHJldmVudFNlbGVjdGlvbiA9IGludGVybmFsQ29tbW9uLnByZXZlbnRTZWxlY3Rpb247XG5leHBvcnRzLnJhbmdlQ29udGFpbnNNYXJrZXIgPSBpbnRlcm5hbENvbW1vbi5yYW5nZUNvbnRhaW5zTWFya2VyO1xuZXhwb3J0cy5yYW5nZUNvbnRhaW5zUmFuZ2UgPSBpbnRlcm5hbENvbW1vbi5yYW5nZUNvbnRhaW5zUmFuZ2U7XG5leHBvcnRzLnJhbmdlc0VxdWFsID0gaW50ZXJuYWxDb21tb24ucmFuZ2VzRXF1YWw7XG5leHBvcnRzLnJhbmdlc0ludGVyc2VjdCA9IGludGVybmFsQ29tbW9uLnJhbmdlc0ludGVyc2VjdDtcbmV4cG9ydHMucmVmaW5lRXZlbnREZWYgPSBpbnRlcm5hbENvbW1vbi5yZWZpbmVFdmVudERlZjtcbmV4cG9ydHMucmVmaW5lUHJvcHMgPSBpbnRlcm5hbENvbW1vbi5yZWZpbmVQcm9wcztcbmV4cG9ydHMucmVtb3ZlRWxlbWVudCA9IGludGVybmFsQ29tbW9uLnJlbW92ZUVsZW1lbnQ7XG5leHBvcnRzLnJlbW92ZUV4YWN0ID0gaW50ZXJuYWxDb21tb24ucmVtb3ZlRXhhY3Q7XG5leHBvcnRzLnJlbmRlckNodW5rQ29udGVudCA9IGludGVybmFsQ29tbW9uLnJlbmRlckNodW5rQ29udGVudDtcbmV4cG9ydHMucmVuZGVyRmlsbCA9IGludGVybmFsQ29tbW9uLnJlbmRlckZpbGw7XG5leHBvcnRzLnJlbmRlck1pY3JvQ29sR3JvdXAgPSBpbnRlcm5hbENvbW1vbi5yZW5kZXJNaWNyb0NvbEdyb3VwO1xuZXhwb3J0cy5yZW5kZXJTY3JvbGxTaGltID0gaW50ZXJuYWxDb21tb24ucmVuZGVyU2Nyb2xsU2hpbTtcbmV4cG9ydHMucmVxdWVzdEpzb24gPSBpbnRlcm5hbENvbW1vbi5yZXF1ZXN0SnNvbjtcbmV4cG9ydHMuc2FuaXRpemVTaHJpbmtXaWR0aCA9IGludGVybmFsQ29tbW9uLnNhbml0aXplU2hyaW5rV2lkdGg7XG5leHBvcnRzLnNldFJlZiA9IGludGVybmFsQ29tbW9uLnNldFJlZjtcbmV4cG9ydHMuc2xpY2VFdmVudFN0b3JlID0gaW50ZXJuYWxDb21tb24uc2xpY2VFdmVudFN0b3JlO1xuZXhwb3J0cy5zb3J0RXZlbnRTZWdzID0gaW50ZXJuYWxDb21tb24uc29ydEV2ZW50U2VncztcbmV4cG9ydHMuc3RhcnRPZkRheSA9IGludGVybmFsQ29tbW9uLnN0YXJ0T2ZEYXk7XG5leHBvcnRzLnRyYW5zbGF0ZVJlY3QgPSBpbnRlcm5hbENvbW1vbi50cmFuc2xhdGVSZWN0O1xuZXhwb3J0cy50cmlnZ2VyRGF0ZVNlbGVjdCA9IGludGVybmFsQ29tbW9uLnRyaWdnZXJEYXRlU2VsZWN0O1xuZXhwb3J0cy51bnByb21pc2lmeSA9IGludGVybmFsQ29tbW9uLnVucHJvbWlzaWZ5O1xuZXhwb3J0cy53aGVuVHJhbnNpdGlvbkRvbmUgPSBpbnRlcm5hbENvbW1vbi53aGVuVHJhbnNpdGlvbkRvbmU7XG5leHBvcnRzLndob2xlRGl2aWRlRHVyYXRpb25zID0gaW50ZXJuYWxDb21tb24ud2hvbGVEaXZpZGVEdXJhdGlvbnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBwcmVhY3QgPSByZXF1aXJlKCdwcmVhY3QnKTtcbnZhciBjb21wYXQgPSByZXF1aXJlKCdwcmVhY3QvY29tcGF0Jyk7XG52YXIgaW50ZXJuYWxDb21tb24gPSByZXF1aXJlKCcuL2ludGVybmFsLWNvbW1vbi5janMnKTtcblxuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnY3JlYXRlUG9ydGFsJywge1xuXHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbXBhdC5jcmVhdGVQb3J0YWw7IH1cbn0pO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gaW50ZXJuYWxDb21tb24uY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuZmx1c2hTeW5jID0gaW50ZXJuYWxDb21tb24uZmx1c2hTeW5jO1xuT2JqZWN0LmtleXMocHJlYWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdGlmIChrICE9PSAnZGVmYXVsdCcgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkoaykpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrLCB7XG5cdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByZWFjdFtrXTsgfVxuXHR9KTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgaW5kZXhfY2pzID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL2luZGV4LmNqcycpO1xudmFyIGludGVybmFsQ29tbW9uID0gcmVxdWlyZSgnLi9pbnRlcm5hbC5janMnKTtcbnJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9pbnRlcm5hbC5janMnKTtcbnJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9wcmVhY3QuY2pzJyk7XG5cbnZhciBpbmRleCA9IGluZGV4X2Nqcy5jcmVhdGVQbHVnaW4oe1xuICAgIG5hbWU6ICdAZnVsbGNhbGVuZGFyL2RheWdyaWQnLFxuICAgIGluaXRpYWxWaWV3OiAnZGF5R3JpZE1vbnRoJyxcbiAgICB2aWV3czoge1xuICAgICAgICBkYXlHcmlkOiB7XG4gICAgICAgICAgICBjb21wb25lbnQ6IGludGVybmFsQ29tbW9uLkRheUdyaWRWaWV3LFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzczogaW50ZXJuYWxDb21tb24uVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvcixcbiAgICAgICAgfSxcbiAgICAgICAgZGF5R3JpZERheToge1xuICAgICAgICAgICAgdHlwZTogJ2RheUdyaWQnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgZGF5czogMSB9LFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkV2Vlazoge1xuICAgICAgICAgICAgdHlwZTogJ2RheUdyaWQnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgd2Vla3M6IDEgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZGF5R3JpZE1vbnRoOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBtb250aHM6IDEgfSxcbiAgICAgICAgICAgIGZpeGVkV2Vla0NvdW50OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkWWVhcjoge1xuICAgICAgICAgICAgdHlwZTogJ2RheUdyaWQnLFxuICAgICAgICAgICAgZHVyYXRpb246IHsgeWVhcnM6IDEgfSxcbiAgICAgICAgfSxcbiAgICB9LFxufSk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaW5kZXg7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBpbnRlcm5hbF9janMgPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvcmUvaW50ZXJuYWwuY2pzJyk7XG52YXIgcHJlYWN0X2NqcyA9IHJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9wcmVhY3QuY2pzJyk7XG5cbnZhciBjc3NfMjQ4eiA9IFwiOnJvb3R7LS1mYy1kYXlncmlkLWV2ZW50LWRvdC13aWR0aDo4cHh9LmZjLWRheWdyaWQtZGF5LWV2ZW50czphZnRlciwuZmMtZGF5Z3JpZC1kYXktZXZlbnRzOmJlZm9yZSwuZmMtZGF5Z3JpZC1kYXktZnJhbWU6YWZ0ZXIsLmZjLWRheWdyaWQtZGF5LWZyYW1lOmJlZm9yZSwuZmMtZGF5Z3JpZC1ldmVudC1oYXJuZXNzOmFmdGVyLC5mYy1kYXlncmlkLWV2ZW50LWhhcm5lc3M6YmVmb3Jle2NsZWFyOmJvdGg7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OnRhYmxlfS5mYyAuZmMtZGF5Z3JpZC1ib2R5e3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MX0uZmMgLmZjLWRheWdyaWQtZGF5LmZjLWRheS10b2RheXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWZjLXRvZGF5LWJnLWNvbG9yKX0uZmMgLmZjLWRheWdyaWQtZGF5LWZyYW1le21pbi1oZWlnaHQ6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLWRheWdyaWQtZGF5LXRvcHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2V9LmZjIC5mYy1kYXktb3RoZXIgLmZjLWRheWdyaWQtZGF5LXRvcHtvcGFjaXR5Oi4zfS5mYyAuZmMtZGF5Z3JpZC1kYXktbnVtYmVye3BhZGRpbmc6NHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6NH0uZmMgLmZjLWRheWdyaWQtbW9udGgtc3RhcnR7Zm9udC1zaXplOjEuMWVtO2ZvbnQtd2VpZ2h0OjcwMH0uZmMgLmZjLWRheWdyaWQtZGF5LWV2ZW50c3ttYXJnaW4tdG9wOjFweH0uZmMgLmZjLWRheWdyaWQtYm9keS1iYWxhbmNlZCAuZmMtZGF5Z3JpZC1kYXktZXZlbnRze2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowfS5mYyAuZmMtZGF5Z3JpZC1ib2R5LXVuYmFsYW5jZWQgLmZjLWRheWdyaWQtZGF5LWV2ZW50c3ttaW4taGVpZ2h0OjJlbTtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLWRheWdyaWQtYm9keS1uYXR1cmFsIC5mYy1kYXlncmlkLWRheS1ldmVudHN7bWFyZ2luLWJvdHRvbToxZW19LmZjIC5mYy1kYXlncmlkLWV2ZW50LWhhcm5lc3N7cG9zaXRpb246cmVsYXRpdmV9LmZjIC5mYy1kYXlncmlkLWV2ZW50LWhhcm5lc3MtYWJze2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfS5mYyAuZmMtZGF5Z3JpZC1iZy1oYXJuZXNze2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowfS5mYyAuZmMtZGF5Z3JpZC1kYXktYmcgLmZjLW5vbi1idXNpbmVzc3t6LWluZGV4OjF9LmZjIC5mYy1kYXlncmlkLWRheS1iZyAuZmMtYmctZXZlbnR7ei1pbmRleDoyfS5mYyAuZmMtZGF5Z3JpZC1kYXktYmcgLmZjLWhpZ2hsaWdodHt6LWluZGV4OjN9LmZjIC5mYy1kYXlncmlkLWV2ZW50e21hcmdpbi10b3A6MXB4O3otaW5kZXg6Nn0uZmMgLmZjLWRheWdyaWQtZXZlbnQuZmMtZXZlbnQtbWlycm9ye3otaW5kZXg6N30uZmMgLmZjLWRheWdyaWQtZGF5LWJvdHRvbXtmb250LXNpemU6Ljg1ZW07bWFyZ2luOjAgMnB4fS5mYyAuZmMtZGF5Z3JpZC1kYXktYm90dG9tOmFmdGVyLC5mYyAuZmMtZGF5Z3JpZC1kYXktYm90dG9tOmJlZm9yZXtjbGVhcjpib3RoO2NvbnRlbnQ6XFxcIlxcXCI7ZGlzcGxheTp0YWJsZX0uZmMgLmZjLWRheWdyaWQtbW9yZS1saW5re2JvcmRlci1yYWRpdXM6M3B4O2N1cnNvcjpwb2ludGVyO2xpbmUtaGVpZ2h0OjE7bWFyZ2luLXRvcDoxcHg7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MnB4O3Bvc2l0aW9uOnJlbGF0aXZlO3doaXRlLXNwYWNlOm5vd3JhcDt6LWluZGV4OjR9LmZjIC5mYy1kYXlncmlkLW1vcmUtbGluazpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5mYyAuZmMtZGF5Z3JpZC13ZWVrLW51bWJlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWZjLW5ldXRyYWwtYmctY29sb3IpO2NvbG9yOnZhcigtLWZjLW5ldXRyYWwtdGV4dC1jb2xvcik7bWluLXdpZHRoOjEuNWVtO3BhZGRpbmc6MnB4O3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO3RvcDowO3otaW5kZXg6NX0uZmMgLmZjLW1vcmUtcG9wb3ZlciAuZmMtcG9wb3Zlci1ib2R5e21pbi13aWR0aDoyMjBweDtwYWRkaW5nOjEwcHh9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWRheWdyaWQtZXZlbnQuZmMtZXZlbnQtc3RhcnQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtZXZlbnQuZmMtZXZlbnQtZW5ke21hcmdpbi1sZWZ0OjJweH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtZGF5Z3JpZC1ldmVudC5mYy1ldmVudC1lbmQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtZXZlbnQuZmMtZXZlbnQtc3RhcnR7bWFyZ2luLXJpZ2h0OjJweH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtZGF5Z3JpZC1tb3JlLWxpbmt7ZmxvYXQ6bGVmdH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtZGF5Z3JpZC13ZWVrLW51bWJlcntib3JkZXItcmFkaXVzOjAgMCAzcHggMDtsZWZ0OjB9LmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtbW9yZS1saW5re2Zsb2F0OnJpZ2h0fS5mYy1kaXJlY3Rpb24tcnRsIC5mYy1kYXlncmlkLXdlZWstbnVtYmVye2JvcmRlci1yYWRpdXM6MCAwIDAgM3B4O3JpZ2h0OjB9LmZjLWxpcXVpZC1oYWNrIC5mYy1kYXlncmlkLWRheS1mcmFtZXtwb3NpdGlvbjpzdGF0aWN9LmZjLWRheWdyaWQtZXZlbnR7Ym9yZGVyLXJhZGl1czozcHg7Zm9udC1zaXplOnZhcigtLWZjLXNtYWxsLWZvbnQtc2l6ZSk7cG9zaXRpb246cmVsYXRpdmU7d2hpdGUtc3BhY2U6bm93cmFwfS5mYy1kYXlncmlkLWJsb2NrLWV2ZW50IC5mYy1ldmVudC10aW1le2ZvbnQtd2VpZ2h0OjcwMH0uZmMtZGF5Z3JpZC1ibG9jay1ldmVudCAuZmMtZXZlbnQtdGltZSwuZmMtZGF5Z3JpZC1ibG9jay1ldmVudCAuZmMtZXZlbnQtdGl0bGV7cGFkZGluZzoxcHh9LmZjLWRheWdyaWQtZG90LWV2ZW50e2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7cGFkZGluZzoycHggMH0uZmMtZGF5Z3JpZC1kb3QtZXZlbnQgLmZjLWV2ZW50LXRpdGxle2ZsZXgtZ3JvdzoxO2ZsZXgtc2hyaW5rOjE7Zm9udC13ZWlnaHQ6NzAwO21pbi13aWR0aDowO292ZXJmbG93OmhpZGRlbn0uZmMtZGF5Z3JpZC1kb3QtZXZlbnQuZmMtZXZlbnQtbWlycm9yLC5mYy1kYXlncmlkLWRvdC1ldmVudDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEpfS5mYy1kYXlncmlkLWRvdC1ldmVudC5mYy1ldmVudC1zZWxlY3RlZDpiZWZvcmV7Ym90dG9tOi0xMHB4O3RvcDotMTBweH0uZmMtZGF5Z3JpZC1ldmVudC1kb3R7Ym9yZGVyOmNhbGModmFyKC0tZmMtZGF5Z3JpZC1ldmVudC1kb3Qtd2lkdGgpLzIpIHNvbGlkIHZhcigtLWZjLWV2ZW50LWJvcmRlci1jb2xvcik7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLWZjLWRheWdyaWQtZXZlbnQtZG90LXdpZHRoKS8yKTtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2hlaWdodDowO21hcmdpbjowIDRweDt3aWR0aDowfS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1kYXlncmlkLWV2ZW50IC5mYy1ldmVudC10aW1le21hcmdpbi1yaWdodDozcHh9LmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtZXZlbnQgLmZjLWV2ZW50LXRpbWV7bWFyZ2luLWxlZnQ6M3B4fVwiO1xuaW50ZXJuYWxfY2pzLmluamVjdFN0eWxlcyhjc3NfMjQ4eik7XG5cbmZ1bmN0aW9uIHNwbGl0U2Vnc0J5Um93KHNlZ3MsIHJvd0NudCkge1xuICAgIGxldCBieVJvdyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q250OyBpICs9IDEpIHtcbiAgICAgICAgYnlSb3dbaV0gPSBbXTtcbiAgICB9XG4gICAgZm9yIChsZXQgc2VnIG9mIHNlZ3MpIHtcbiAgICAgICAgYnlSb3dbc2VnLnJvd10ucHVzaChzZWcpO1xuICAgIH1cbiAgICByZXR1cm4gYnlSb3c7XG59XG5mdW5jdGlvbiBzcGxpdFNlZ3NCeUZpcnN0Q29sKHNlZ3MsIGNvbENudCkge1xuICAgIGxldCBieUNvbCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sQ250OyBpICs9IDEpIHtcbiAgICAgICAgYnlDb2xbaV0gPSBbXTtcbiAgICB9XG4gICAgZm9yIChsZXQgc2VnIG9mIHNlZ3MpIHtcbiAgICAgICAgYnlDb2xbc2VnLmZpcnN0Q29sXS5wdXNoKHNlZyk7XG4gICAgfVxuICAgIHJldHVybiBieUNvbDtcbn1cbmZ1bmN0aW9uIHNwbGl0SW50ZXJhY3Rpb25CeVJvdyh1aSwgcm93Q250KSB7XG4gICAgbGV0IGJ5Um93ID0gW107XG4gICAgaWYgKCF1aSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NudDsgaSArPSAxKSB7XG4gICAgICAgICAgICBieVJvd1tpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q250OyBpICs9IDEpIHtcbiAgICAgICAgICAgIGJ5Um93W2ldID0ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkSW5zdGFuY2VzOiB1aS5hZmZlY3RlZEluc3RhbmNlcyxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB1aS5pc0V2ZW50LFxuICAgICAgICAgICAgICAgIHNlZ3M6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBzZWcgb2YgdWkuc2Vncykge1xuICAgICAgICAgICAgYnlSb3dbc2VnLnJvd10uc2Vncy5wdXNoKHNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5Um93O1xufVxuXG5jb25zdCBERUZBVUxUX1RBQkxFX0VWRU5UX1RJTUVfRk9STUFUID0gaW50ZXJuYWxfY2pzLmNyZWF0ZUZvcm1hdHRlcih7XG4gICAgaG91cjogJ251bWVyaWMnLFxuICAgIG1pbnV0ZTogJzItZGlnaXQnLFxuICAgIG9taXRaZXJvTWludXRlOiB0cnVlLFxuICAgIG1lcmlkaWVtOiAnbmFycm93Jyxcbn0pO1xuZnVuY3Rpb24gaGFzTGlzdEl0ZW1EaXNwbGF5KHNlZykge1xuICAgIGxldCB7IGRpc3BsYXkgfSA9IHNlZy5ldmVudFJhbmdlLnVpO1xuICAgIHJldHVybiBkaXNwbGF5ID09PSAnbGlzdC1pdGVtJyB8fCAoZGlzcGxheSA9PT0gJ2F1dG8nICYmXG4gICAgICAgICFzZWcuZXZlbnRSYW5nZS5kZWYuYWxsRGF5ICYmXG4gICAgICAgIHNlZy5maXJzdENvbCA9PT0gc2VnLmxhc3RDb2wgJiYgLy8gY2FuJ3QgYmUgbXVsdGktZGF5XG4gICAgICAgIHNlZy5pc1N0YXJ0ICYmIC8vIFwiXG4gICAgICAgIHNlZy5pc0VuZCAvLyBcIlxuICAgICk7XG59XG5cbmNsYXNzIFRhYmxlQmxvY2tFdmVudCBleHRlbmRzIGludGVybmFsX2Nqcy5CYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuU3RhbmRhcmRFdmVudCwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHsgZWxDbGFzc2VzOiBbJ2ZjLWRheWdyaWQtZXZlbnQnLCAnZmMtZGF5Z3JpZC1ibG9jay1ldmVudCcsICdmYy1oLWV2ZW50J10sIGRlZmF1bHRUaW1lRm9ybWF0OiBERUZBVUxUX1RBQkxFX0VWRU5UX1RJTUVfRk9STUFULCBkZWZhdWx0RGlzcGxheUV2ZW50RW5kOiBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50RW5kLCBkaXNhYmxlUmVzaXppbmc6ICFwcm9wcy5zZWcuZXZlbnRSYW5nZS5kZWYuYWxsRGF5IH0pKSk7XG4gICAgfVxufVxuXG5jbGFzcyBUYWJsZUxpc3RJdGVtRXZlbnQgZXh0ZW5kcyBpbnRlcm5hbF9janMuQmFzZUNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICAgICAgbGV0IHsgc2VnIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPSBvcHRpb25zLmV2ZW50VGltZUZvcm1hdCB8fCBERUZBVUxUX1RBQkxFX0VWRU5UX1RJTUVfRk9STUFUO1xuICAgICAgICBsZXQgdGltZVRleHQgPSBpbnRlcm5hbF9janMuYnVpbGRTZWdUaW1lVGV4dChzZWcsIHRpbWVGb3JtYXQsIGNvbnRleHQsIHRydWUsIHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRFbmQpO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuRXZlbnRDb250YWluZXIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7IGVsVGFnOiBcImFcIiwgZWxDbGFzc2VzOiBbJ2ZjLWRheWdyaWQtZXZlbnQnLCAnZmMtZGF5Z3JpZC1kb3QtZXZlbnQnXSwgZWxBdHRyczogaW50ZXJuYWxfY2pzLmdldFNlZ0FuY2hvckF0dHJzKHByb3BzLnNlZywgY29udGV4dCksIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlcklubmVyQ29udGVudCwgdGltZVRleHQ6IHRpbWVUZXh0LCBpc1Jlc2l6aW5nOiBmYWxzZSwgaXNEYXRlU2VsZWN0aW5nOiBmYWxzZSB9KSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlcklubmVyQ29udGVudChyZW5kZXJQcm9wcykge1xuICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWV2ZW50LWRvdFwiLCBzdHlsZTogeyBib3JkZXJDb2xvcjogcmVuZGVyUHJvcHMuYm9yZGVyQ29sb3IgfHwgcmVuZGVyUHJvcHMuYmFja2dyb3VuZENvbG9yIH0gfSksXG4gICAgICAgIHJlbmRlclByb3BzLnRpbWVUZXh0ICYmIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGltZVwiIH0sIHJlbmRlclByb3BzLnRpbWVUZXh0KSksXG4gICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZVwiIH0sIHJlbmRlclByb3BzLmV2ZW50LnRpdGxlIHx8IHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIikpKSk7XG59XG5cbmNsYXNzIFRhYmxlQ2VsbE1vcmVMaW5rIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNvbXBpbGVTZWdzID0gaW50ZXJuYWxfY2pzLm1lbW9pemUoY29tcGlsZVNlZ3MpO1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBhbGxTZWdzLCBpbnZpc2libGVTZWdzIH0gPSB0aGlzLmNvbXBpbGVTZWdzKHByb3BzLnNpbmdsZVBsYWNlbWVudHMpO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuTW9yZUxpbmtDb250YWluZXIsIHsgZWxDbGFzc2VzOiBbJ2ZjLWRheWdyaWQtbW9yZS1saW5rJ10sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgYWxsRGF5RGF0ZTogcHJvcHMuYWxsRGF5RGF0ZSwgbW9yZUNudDogcHJvcHMubW9yZUNudCwgYWxsU2VnczogYWxsU2VncywgaGlkZGVuU2VnczogaW52aXNpYmxlU2VncywgYWxpZ25tZW50RWxSZWY6IHByb3BzLmFsaWdubWVudEVsUmVmLCBhbGlnbkdyaWRUb3A6IHByb3BzLmFsaWduR3JpZFRvcCwgZXh0cmFEYXRlU3BhbjogcHJvcHMuZXh0cmFEYXRlU3BhbiwgcG9wb3ZlckNvbnRlbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNGb3JjZWRJbnZpc2libGUgPSAocHJvcHMuZXZlbnREcmFnID8gcHJvcHMuZXZlbnREcmFnLmFmZmVjdGVkSW5zdGFuY2VzIDogbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHByb3BzLmV2ZW50UmVzaXplID8gcHJvcHMuZXZlbnRSZXNpemUuYWZmZWN0ZWRJbnN0YW5jZXMgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgICB7fTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBhbGxTZWdzLm1hcCgoc2VnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YW5jZUlkID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1ldmVudC1oYXJuZXNzXCIsIGtleTogaW5zdGFuY2VJZCwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBpc0ZvcmNlZEludmlzaWJsZVtpbnN0YW5jZUlkXSA/ICdoaWRkZW4nIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB9IH0sIGhhc0xpc3RJdGVtRGlzcGxheShzZWcpID8gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZUxpc3RJdGVtRXZlbnQsIE9iamVjdC5hc3NpZ24oeyBzZWc6IHNlZywgaXNEcmFnZ2luZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGluc3RhbmNlSWQgPT09IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBkZWZhdWx0RGlzcGxheUV2ZW50RW5kOiBmYWxzZSB9LCBpbnRlcm5hbF9janMuZ2V0U2VnTWV0YShzZWcsIHByb3BzLnRvZGF5UmFuZ2UpKSkpIDogKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZUJsb2NrRXZlbnQsIE9iamVjdC5hc3NpZ24oeyBzZWc6IHNlZywgaXNEcmFnZ2luZzogZmFsc2UsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZmFsc2UgfSwgaW50ZXJuYWxfY2pzLmdldFNlZ01ldGEoc2VnLCBwcm9wcy50b2RheVJhbmdlKSkpKSkpO1xuICAgICAgICAgICAgICAgIH0pKSk7XG4gICAgICAgICAgICB9IH0pKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21waWxlU2VncyhzaW5nbGVQbGFjZW1lbnRzKSB7XG4gICAgbGV0IGFsbFNlZ3MgPSBbXTtcbiAgICBsZXQgaW52aXNpYmxlU2VncyA9IFtdO1xuICAgIGZvciAobGV0IHBsYWNlbWVudCBvZiBzaW5nbGVQbGFjZW1lbnRzKSB7XG4gICAgICAgIGFsbFNlZ3MucHVzaChwbGFjZW1lbnQuc2VnKTtcbiAgICAgICAgaWYgKCFwbGFjZW1lbnQuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICBpbnZpc2libGVTZWdzLnB1c2gocGxhY2VtZW50LnNlZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgYWxsU2VncywgaW52aXNpYmxlU2VncyB9O1xufVxuXG5jb25zdCBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCA9IGludGVybmFsX2Nqcy5jcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnbmFycm93JyB9KTtcbmNsYXNzIFRhYmxlQ2VsbCBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5yb290RWxSZWYgPSBwcmVhY3RfY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZGF5TnVtYmVySWQ6IGludGVybmFsX2Nqcy5nZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVJvb3RFbCA9IChlbCkgPT4ge1xuICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnNldFJlZih0aGlzLnJvb3RFbFJlZiwgZWwpO1xuICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgY29udGV4dCwgcHJvcHMsIHN0YXRlLCByb290RWxSZWYgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IG9wdGlvbnMsIGRhdGVFbnYgfSA9IGNvbnRleHQ7XG4gICAgICAgIGxldCB7IGRhdGUsIGRhdGVQcm9maWxlIH0gPSBwcm9wcztcbiAgICAgICAgLy8gVE9ETzogbWVtb2l6ZSB0aGlzP1xuICAgICAgICBjb25zdCBpc01vbnRoU3RhcnQgPSBwcm9wcy5zaG93RGF5TnVtYmVyICYmXG4gICAgICAgICAgICBzaG91bGREaXNwbGF5TW9udGhTdGFydChkYXRlLCBkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIGRhdGVFbnYpO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuRGF5Q2VsbENvbnRhaW5lciwgeyBlbFRhZzogXCJ0ZFwiLCBlbFJlZjogdGhpcy5oYW5kbGVSb290RWwsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgICdmYy1kYXlncmlkLWRheScsXG4gICAgICAgICAgICAgICAgLi4uKHByb3BzLmV4dHJhQ2xhc3NOYW1lcyB8fCBbXSksXG4gICAgICAgICAgICBdLCBlbEF0dHJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuZXh0cmFEYXRhQXR0cnMpLCAocHJvcHMuc2hvd0RheU51bWJlciA/IHsgJ2FyaWEtbGFiZWxsZWRieSc6IHN0YXRlLmRheU51bWJlcklkIH0gOiB7fSkpLCB7IHJvbGU6ICdncmlkY2VsbCcgfSksIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlclRvcElubmVyLCBkYXRlOiBkYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIHNob3dEYXlOdW1iZXI6IHByb3BzLnNob3dEYXlOdW1iZXIsIGlzTW9udGhTdGFydDogaXNNb250aFN0YXJ0LCBleHRyYVJlbmRlclByb3BzOiBwcm9wcy5leHRyYVJlbmRlclByb3BzIH0sIChJbm5lckNvbnRlbnQsIHJlbmRlclByb3BzKSA9PiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgcmVmOiBwcm9wcy5pbm5lckVsUmVmLCBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktZnJhbWUgZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIsIHN0eWxlOiB7IG1pbkhlaWdodDogcHJvcHMubWluSGVpZ2h0IH0gfSxcbiAgICAgICAgICAgIHByb3BzLnNob3dXZWVrTnVtYmVyICYmIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxfY2pzLldlZWtOdW1iZXJDb250YWluZXIsIHsgZWxUYWc6IFwiYVwiLCBlbENsYXNzZXM6IFsnZmMtZGF5Z3JpZC13ZWVrLW51bWJlciddLCBlbEF0dHJzOiBpbnRlcm5hbF9janMuYnVpbGROYXZMaW5rQXR0cnMoY29udGV4dCwgZGF0ZSwgJ3dlZWsnKSwgZGF0ZTogZGF0ZSwgZGVmYXVsdEZvcm1hdDogREVGQVVMVF9XRUVLX05VTV9GT1JNQVQgfSkpLFxuICAgICAgICAgICAgIXJlbmRlclByb3BzLmlzRGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAocHJvcHMuc2hvd0RheU51bWJlciB8fCBpbnRlcm5hbF9janMuaGFzQ3VzdG9tRGF5Q2VsbENvbnRlbnQob3B0aW9ucykgfHwgcHJvcHMuZm9yY2VEYXlUb3ApID8gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS10b3BcIiB9LFxuICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChJbm5lckNvbnRlbnQsIHsgZWxUYWc6IFwiYVwiLCBlbENsYXNzZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1kYXlncmlkLWRheS1udW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb250aFN0YXJ0ICYmICdmYy1kYXlncmlkLW1vbnRoLXN0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgXSwgZWxBdHRyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbnRlcm5hbF9janMuYnVpbGROYXZMaW5rQXR0cnMoY29udGV4dCwgZGF0ZSkpLCB7IGlkOiBzdGF0ZS5kYXlOdW1iZXJJZCB9KSB9KSkpIDogcHJvcHMuc2hvd0RheU51bWJlciA/IChcbiAgICAgICAgICAgIC8vIGZvciBjcmVhdGluZyBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSAoc2VlIGlzc3VlICM3MTYyKVxuICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZGF5LXRvcFwiLCBzdHlsZTogeyB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9IH0sXG4gICAgICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiYVwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1udW1iZXJcIiB9LCBcIlxcdTAwQTBcIikpKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1ldmVudHNcIiwgcmVmOiBwcm9wcy5mZ0NvbnRlbnRFbFJlZiB9LFxuICAgICAgICAgICAgICAgIHByb3BzLmZnQ29udGVudCxcbiAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktYm90dG9tXCIsIHN0eWxlOiB7IG1hcmdpblRvcDogcHJvcHMubW9yZU1hcmdpblRvcCB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZUNlbGxNb3JlTGluaywgeyBhbGxEYXlEYXRlOiBkYXRlLCBzaW5nbGVQbGFjZW1lbnRzOiBwcm9wcy5zaW5nbGVQbGFjZW1lbnRzLCBtb3JlQ250OiBwcm9wcy5tb3JlQ250LCBhbGlnbm1lbnRFbFJlZjogcm9vdEVsUmVmLCBhbGlnbkdyaWRUb3A6ICFwcm9wcy5zaG93RGF5TnVtYmVyLCBleHRyYURhdGVTcGFuOiBwcm9wcy5leHRyYURhdGVTcGFuLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSB9KSkpLFxuICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZGF5LWJnXCIgfSwgcHJvcHMuYmdDb250ZW50KSkpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVyVG9wSW5uZXIocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuZGF5TnVtYmVyVGV4dCB8fCBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCwgXCJcXHUwMEEwXCIpO1xufVxuZnVuY3Rpb24gc2hvdWxkRGlzcGxheU1vbnRoU3RhcnQoZGF0ZSwgY3VycmVudFJhbmdlLCBkYXRlRW52KSB7XG4gICAgY29uc3QgeyBzdGFydDogY3VycmVudFN0YXJ0LCBlbmQ6IGN1cnJlbnRFbmQgfSA9IGN1cnJlbnRSYW5nZTtcbiAgICBjb25zdCBjdXJyZW50RW5kSW5jbCA9IGludGVybmFsX2Nqcy5hZGRNcyhjdXJyZW50RW5kLCAtMSk7XG4gICAgY29uc3QgY3VycmVudEZpcnN0WWVhciA9IGRhdGVFbnYuZ2V0WWVhcihjdXJyZW50U3RhcnQpO1xuICAgIGNvbnN0IGN1cnJlbnRGaXJzdE1vbnRoID0gZGF0ZUVudi5nZXRNb250aChjdXJyZW50U3RhcnQpO1xuICAgIGNvbnN0IGN1cnJlbnRMYXN0WWVhciA9IGRhdGVFbnYuZ2V0WWVhcihjdXJyZW50RW5kSW5jbCk7XG4gICAgY29uc3QgY3VycmVudExhc3RNb250aCA9IGRhdGVFbnYuZ2V0TW9udGgoY3VycmVudEVuZEluY2wpO1xuICAgIC8vIHNwYW5zIG1vcmUgdGhhbiBvbmUgbW9udGg/XG4gICAgcmV0dXJuICEoY3VycmVudEZpcnN0WWVhciA9PT0gY3VycmVudExhc3RZZWFyICYmIGN1cnJlbnRGaXJzdE1vbnRoID09PSBjdXJyZW50TGFzdE1vbnRoKSAmJlxuICAgICAgICBCb29sZWFuKFxuICAgICAgICAvLyBmaXJzdCBkYXRlIGluIGN1cnJlbnQgdmlldz9cbiAgICAgICAgZGF0ZS52YWx1ZU9mKCkgPT09IGN1cnJlbnRTdGFydC52YWx1ZU9mKCkgfHxcbiAgICAgICAgICAgIC8vIGEgbW9udGgtc3RhcnQgdGhhdCdzIHdpdGhpbiB0aGUgY3VycmVudCByYW5nZT9cbiAgICAgICAgICAgIChkYXRlRW52LmdldERheShkYXRlKSA9PT0gMSAmJiBkYXRlLnZhbHVlT2YoKSA8IGN1cnJlbnRFbmQudmFsdWVPZigpKSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVGZ1NlZ1BsYWNlbWVudChzZWdzLCAvLyBhc3N1bWVkIGFscmVhZHkgc29ydGVkXG5kYXlNYXhFdmVudHMsIGRheU1heEV2ZW50Um93cywgc3RyaWN0T3JkZXIsIGV2ZW50SW5zdGFuY2VIZWlnaHRzLCBtYXhDb250ZW50SGVpZ2h0LCBjZWxscykge1xuICAgIGxldCBoaWVyYXJjaHkgPSBuZXcgRGF5R3JpZFNlZ0hpZXJhcmNoeSgpO1xuICAgIGhpZXJhcmNoeS5hbGxvd1Jlc2xpY2luZyA9IHRydWU7XG4gICAgaGllcmFyY2h5LnN0cmljdE9yZGVyID0gc3RyaWN0T3JkZXI7XG4gICAgaWYgKGRheU1heEV2ZW50cyA9PT0gdHJ1ZSB8fCBkYXlNYXhFdmVudFJvd3MgPT09IHRydWUpIHtcbiAgICAgICAgaGllcmFyY2h5Lm1heENvb3JkID0gbWF4Q29udGVudEhlaWdodDtcbiAgICAgICAgaGllcmFyY2h5LmhpZGRlbkNvbnN1bWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGRheU1heEV2ZW50cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaGllcmFyY2h5Lm1heFN0YWNrQ250ID0gZGF5TWF4RXZlbnRzO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF5TWF4RXZlbnRSb3dzID09PSAnbnVtYmVyJykge1xuICAgICAgICBoaWVyYXJjaHkubWF4U3RhY2tDbnQgPSBkYXlNYXhFdmVudFJvd3M7XG4gICAgICAgIGhpZXJhcmNoeS5oaWRkZW5Db25zdW1lcyA9IHRydWU7XG4gICAgfVxuICAgIC8vIGNyZWF0ZSBzZWdJbnB1dHMgb25seSBmb3Igc2VncyB3aXRoIGtub3duIGhlaWdodHNcbiAgICBsZXQgc2VnSW5wdXRzID0gW107XG4gICAgbGV0IHVua25vd25IZWlnaHRTZWdzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCBzZWcgPSBzZWdzW2ldO1xuICAgICAgICBsZXQgeyBpbnN0YW5jZUlkIH0gPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZTtcbiAgICAgICAgbGV0IGV2ZW50SGVpZ2h0ID0gZXZlbnRJbnN0YW5jZUhlaWdodHNbaW5zdGFuY2VJZF07XG4gICAgICAgIGlmIChldmVudEhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICBzZWdJbnB1dHMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzOiBldmVudEhlaWdodCxcbiAgICAgICAgICAgICAgICBzcGFuOiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzZWcuZmlyc3RDb2wsXG4gICAgICAgICAgICAgICAgICAgIGVuZDogc2VnLmxhc3RDb2wgKyAxLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHVua25vd25IZWlnaHRTZWdzLnB1c2goc2VnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgaGlkZGVuRW50cmllcyA9IGhpZXJhcmNoeS5hZGRTZWdzKHNlZ0lucHV0cyk7XG4gICAgbGV0IHNlZ1JlY3RzID0gaGllcmFyY2h5LnRvUmVjdHMoKTtcbiAgICBsZXQgeyBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMsIGxlZnRvdmVyTWFyZ2lucyB9ID0gcGxhY2VSZWN0cyhzZWdSZWN0cywgc2VncywgY2VsbHMpO1xuICAgIGxldCBtb3JlQ250cyA9IFtdO1xuICAgIGxldCBtb3JlTWFyZ2luVG9wcyA9IFtdO1xuICAgIC8vIGFkZCBzZWdzIHdpdGggdW5rbm93biBoZWlnaHRzXG4gICAgZm9yIChsZXQgc2VnIG9mIHVua25vd25IZWlnaHRTZWdzKSB7XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50c1tzZWcuZmlyc3RDb2xdLnB1c2goe1xuICAgICAgICAgICAgc2VnLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHNlZy5maXJzdENvbDsgY29sIDw9IHNlZy5sYXN0Q29sOyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgc2luZ2xlQ29sUGxhY2VtZW50c1tjb2xdLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IDAsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWRkIHRoZSBoaWRkZW4gZW50cmllc1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNlbGxzLmxlbmd0aDsgY29sICs9IDEpIHtcbiAgICAgICAgbW9yZUNudHMucHVzaCgwKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaGlkZGVuRW50cnkgb2YgaGlkZGVuRW50cmllcykge1xuICAgICAgICBsZXQgc2VnID0gc2Vnc1toaWRkZW5FbnRyeS5pbmRleF07XG4gICAgICAgIGxldCBoaWRkZW5TcGFuID0gaGlkZGVuRW50cnkuc3BhbjtcbiAgICAgICAgbXVsdGlDb2xQbGFjZW1lbnRzW2hpZGRlblNwYW4uc3RhcnRdLnB1c2goe1xuICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgaGlkZGVuU3Bhbi5zdGFydCwgaGlkZGVuU3Bhbi5lbmQsIGNlbGxzKSxcbiAgICAgICAgICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICBpc0Fic29sdXRlOiB0cnVlLFxuICAgICAgICAgICAgYWJzb2x1dGVUb3A6IDAsXG4gICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGxldCBjb2wgPSBoaWRkZW5TcGFuLnN0YXJ0OyBjb2wgPCBoaWRkZW5TcGFuLmVuZDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIG1vcmVDbnRzW2NvbF0gKz0gMTtcbiAgICAgICAgICAgIHNpbmdsZUNvbFBsYWNlbWVudHNbY29sXS5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWc6IHJlc2xpY2VTZWcoc2VnLCBjb2wsIGNvbCArIDEsIGNlbGxzKSxcbiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQWJzb2x1dGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGRlYWwgd2l0aCBsZWZ0b3ZlciBtYXJnaW5zXG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY2VsbHMubGVuZ3RoOyBjb2wgKz0gMSkge1xuICAgICAgICBtb3JlTWFyZ2luVG9wcy5wdXNoKGxlZnRvdmVyTWFyZ2luc1tjb2xdKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2luZ2xlQ29sUGxhY2VtZW50cywgbXVsdGlDb2xQbGFjZW1lbnRzLCBtb3JlQ250cywgbW9yZU1hcmdpblRvcHMgfTtcbn1cbi8vIHJlY3RzIG9yZGVyZWQgYnkgdG9wIGNvb3JkLCB0aGVuIGxlZnRcbmZ1bmN0aW9uIHBsYWNlUmVjdHMoYWxsUmVjdHMsIHNlZ3MsIGNlbGxzKSB7XG4gICAgbGV0IHJlY3RzQnlFYWNoQ29sID0gZ3JvdXBSZWN0c0J5RWFjaENvbChhbGxSZWN0cywgY2VsbHMubGVuZ3RoKTtcbiAgICBsZXQgc2luZ2xlQ29sUGxhY2VtZW50cyA9IFtdO1xuICAgIGxldCBtdWx0aUNvbFBsYWNlbWVudHMgPSBbXTtcbiAgICBsZXQgbGVmdG92ZXJNYXJnaW5zID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY2VsbHMubGVuZ3RoOyBjb2wgKz0gMSkge1xuICAgICAgICBsZXQgcmVjdHMgPSByZWN0c0J5RWFjaENvbFtjb2xdO1xuICAgICAgICAvLyBjb21wdXRlIGFsbCBzdGF0aWMgc2VncyBpbiBzaW5nbGVQbGFjZW1lbnRzXG4gICAgICAgIGxldCBzaW5nbGVQbGFjZW1lbnRzID0gW107XG4gICAgICAgIGxldCBjdXJyZW50SGVpZ2h0ID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRNYXJnaW5Ub3AgPSAwO1xuICAgICAgICBmb3IgKGxldCByZWN0IG9mIHJlY3RzKSB7XG4gICAgICAgICAgICBsZXQgc2VnID0gc2Vnc1tyZWN0LmluZGV4XTtcbiAgICAgICAgICAgIHNpbmdsZVBsYWNlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgY29sLCBjb2wgKyAxLCBjZWxscyksXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQWJzb2x1dGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiByZWN0LmxldmVsQ29vcmQsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiByZWN0LmxldmVsQ29vcmQgLSBjdXJyZW50SGVpZ2h0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjdXJyZW50SGVpZ2h0ID0gcmVjdC5sZXZlbENvb3JkICsgcmVjdC50aGlja25lc3M7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29tcHV0ZSBtaXhlZCBzdGF0aWMvYWJzb2x1dGUgc2VncyBpbiBtdWx0aVBsYWNlbWVudHNcbiAgICAgICAgbGV0IG11bHRpUGxhY2VtZW50cyA9IFtdO1xuICAgICAgICBjdXJyZW50SGVpZ2h0ID0gMDtcbiAgICAgICAgY3VycmVudE1hcmdpblRvcCA9IDA7XG4gICAgICAgIGZvciAobGV0IHJlY3Qgb2YgcmVjdHMpIHtcbiAgICAgICAgICAgIGxldCBzZWcgPSBzZWdzW3JlY3QuaW5kZXhdO1xuICAgICAgICAgICAgbGV0IGlzQWJzb2x1dGUgPSByZWN0LnNwYW4uZW5kIC0gcmVjdC5zcGFuLnN0YXJ0ID4gMTsgLy8gbXVsdGktY29sdW1uP1xuICAgICAgICAgICAgbGV0IGlzRmlyc3RDb2wgPSByZWN0LnNwYW4uc3RhcnQgPT09IGNvbDtcbiAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgKz0gcmVjdC5sZXZlbENvb3JkIC0gY3VycmVudEhlaWdodDsgLy8gYW1vdW50IG9mIHNwYWNlIHNpbmNlIGJvdHRvbSBvZiBwcmV2aW91cyBzZWdcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSByZWN0LmxldmVsQ29vcmQgKyByZWN0LnRoaWNrbmVzczsgLy8gaGVpZ2h0IHdpbGwgbm93IGJlIGJvdHRvbSBvZiBjdXJyZW50IHNlZ1xuICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wICs9IHJlY3QudGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpcnN0Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIG11bHRpUGxhY2VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiByZWN0LmxldmVsQ29vcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlyc3RDb2wpIHtcbiAgICAgICAgICAgICAgICBtdWx0aVBsYWNlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIHJlY3Quc3Bhbi5zdGFydCwgcmVjdC5zcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogcmVjdC5sZXZlbENvb3JkLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGN1cnJlbnRNYXJnaW5Ub3AsIC8vIGNsYWltIHRoZSBtYXJnaW5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWFyZ2luVG9wID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzLnB1c2goc2luZ2xlUGxhY2VtZW50cyk7XG4gICAgICAgIG11bHRpQ29sUGxhY2VtZW50cy5wdXNoKG11bHRpUGxhY2VtZW50cyk7XG4gICAgICAgIGxlZnRvdmVyTWFyZ2lucy5wdXNoKGN1cnJlbnRNYXJnaW5Ub3ApO1xuICAgIH1cbiAgICByZXR1cm4geyBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMsIGxlZnRvdmVyTWFyZ2lucyB9O1xufVxuZnVuY3Rpb24gZ3JvdXBSZWN0c0J5RWFjaENvbChyZWN0cywgY29sQ250KSB7XG4gICAgbGV0IHJlY3RzQnlFYWNoQ29sID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sQ250OyBjb2wgKz0gMSkge1xuICAgICAgICByZWN0c0J5RWFjaENvbC5wdXNoKFtdKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcmVjdCBvZiByZWN0cykge1xuICAgICAgICBmb3IgKGxldCBjb2wgPSByZWN0LnNwYW4uc3RhcnQ7IGNvbCA8IHJlY3Quc3Bhbi5lbmQ7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICByZWN0c0J5RWFjaENvbFtjb2xdLnB1c2gocmVjdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlY3RzQnlFYWNoQ29sO1xufVxuZnVuY3Rpb24gcmVzbGljZVNlZyhzZWcsIHNwYW5TdGFydCwgc3BhbkVuZCwgY2VsbHMpIHtcbiAgICBpZiAoc2VnLmZpcnN0Q29sID09PSBzcGFuU3RhcnQgJiYgc2VnLmxhc3RDb2wgPT09IHNwYW5FbmQgLSAxKSB7XG4gICAgICAgIHJldHVybiBzZWc7XG4gICAgfVxuICAgIGxldCBldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgbGV0IG9yaWdSYW5nZSA9IGV2ZW50UmFuZ2UucmFuZ2U7XG4gICAgbGV0IHNsaWNlZFJhbmdlID0gaW50ZXJuYWxfY2pzLmludGVyc2VjdFJhbmdlcyhvcmlnUmFuZ2UsIHtcbiAgICAgICAgc3RhcnQ6IGNlbGxzW3NwYW5TdGFydF0uZGF0ZSxcbiAgICAgICAgZW5kOiBpbnRlcm5hbF9janMuYWRkRGF5cyhjZWxsc1tzcGFuRW5kIC0gMV0uZGF0ZSwgMSksXG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc2VnKSwgeyBmaXJzdENvbDogc3BhblN0YXJ0LCBsYXN0Q29sOiBzcGFuRW5kIC0gMSwgZXZlbnRSYW5nZToge1xuICAgICAgICAgICAgZGVmOiBldmVudFJhbmdlLmRlZixcbiAgICAgICAgICAgIHVpOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50UmFuZ2UudWkpLCB7IGR1cmF0aW9uRWRpdGFibGU6IGZhbHNlIH0pLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGV2ZW50UmFuZ2UuaW5zdGFuY2UsXG4gICAgICAgICAgICByYW5nZTogc2xpY2VkUmFuZ2UsXG4gICAgICAgIH0sIGlzU3RhcnQ6IHNlZy5pc1N0YXJ0ICYmIHNsaWNlZFJhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gb3JpZ1JhbmdlLnN0YXJ0LnZhbHVlT2YoKSwgaXNFbmQ6IHNlZy5pc0VuZCAmJiBzbGljZWRSYW5nZS5lbmQudmFsdWVPZigpID09PSBvcmlnUmFuZ2UuZW5kLnZhbHVlT2YoKSB9KTtcbn1cbmNsYXNzIERheUdyaWRTZWdIaWVyYXJjaHkgZXh0ZW5kcyBpbnRlcm5hbF9janMuU2VnSGllcmFyY2h5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gY29uZmlnXG4gICAgICAgIHRoaXMuaGlkZGVuQ29uc3VtZXMgPSBmYWxzZTtcbiAgICAgICAgLy8gYWxsb3dzIHVzIHRvIGtlZXAgaGlkZGVuIGVudHJpZXMgaW4gdGhlIGhpZXJhcmNoeSBzbyB0aGV5IHRha2UgdXAgc3BhY2VcbiAgICAgICAgdGhpcy5mb3JjZUhpZGRlbiA9IHt9O1xuICAgIH1cbiAgICBhZGRTZWdzKHNlZ0lucHV0cykge1xuICAgICAgICBjb25zdCBoaWRkZW5TZWdzID0gc3VwZXIuYWRkU2VncyhzZWdJbnB1dHMpO1xuICAgICAgICBjb25zdCB7IGVudHJpZXNCeUxldmVsIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBleGNsdWRlSGlkZGVuID0gKGVudHJ5KSA9PiAhdGhpcy5mb3JjZUhpZGRlbltpbnRlcm5hbF9janMuYnVpbGRFbnRyeUtleShlbnRyeSldO1xuICAgICAgICAvLyByZW1vdmUgdGhlIGZvcmNlZC1oaWRkZW4gc2Vnc1xuICAgICAgICBmb3IgKGxldCBsZXZlbCA9IDA7IGxldmVsIDwgZW50cmllc0J5TGV2ZWwubGVuZ3RoOyBsZXZlbCArPSAxKSB7XG4gICAgICAgICAgICBlbnRyaWVzQnlMZXZlbFtsZXZlbF0gPSBlbnRyaWVzQnlMZXZlbFtsZXZlbF0uZmlsdGVyKGV4Y2x1ZGVIaWRkZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW5TZWdzO1xuICAgIH1cbiAgICBoYW5kbGVJbnZhbGlkSW5zZXJ0aW9uKGluc2VydGlvbiwgZW50cnksIGhpZGRlbkVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgeyBlbnRyaWVzQnlMZXZlbCwgZm9yY2VIaWRkZW4gfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHsgdG91Y2hpbmdFbnRyeSwgdG91Y2hpbmdMZXZlbCwgdG91Y2hpbmdMYXRlcmFsIH0gPSBpbnNlcnRpb247XG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkNvbnN1bWVzICYmIHRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdWNoaW5nRW50cnlJZCA9IGludGVybmFsX2Nqcy5idWlsZEVudHJ5S2V5KHRvdWNoaW5nRW50cnkpO1xuICAgICAgICAgICAgLy8gaWYgbm90IGFscmVhZHkgaGlkZGVuXG4gICAgICAgICAgICBpZiAoIWZvcmNlSGlkZGVuW3RvdWNoaW5nRW50cnlJZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbGxvd1Jlc2xpY2luZykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckVudHJ5ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0b3VjaGluZ0VudHJ5KSwgeyBzcGFuOiBpbnRlcm5hbF9janMuaW50ZXJzZWN0U3BhbnModG91Y2hpbmdFbnRyeS5zcGFuLCBlbnRyeS5zcGFuKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJFbnRyeUlkID0gaW50ZXJuYWxfY2pzLmJ1aWxkRW50cnlLZXkocGxhY2Vob2xkZXJFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGZvcmNlSGlkZGVuW3BsYWNlaG9sZGVyRW50cnlJZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzQnlMZXZlbFt0b3VjaGluZ0xldmVsXVt0b3VjaGluZ0xhdGVyYWxdID0gcGxhY2Vob2xkZXJFbnRyeTsgLy8gcmVwbGFjZSB0b3VjaGluZ0VudHJ5IHdpdGggb3VyIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3BsaXRFbnRyeSh0b3VjaGluZ0VudHJ5LCBlbnRyeSwgaGlkZGVuRW50cmllcyk7IC8vIHNwbGl0IHVwIHRoZSB0b3VjaGluZ0VudHJ5LCByZWluc2VydCBpdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VIaWRkZW5bdG91Y2hpbmdFbnRyeUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhpZGRlbkVudHJpZXMucHVzaCh0b3VjaGluZ0VudHJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUludmFsaWRJbnNlcnRpb24oaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcyk7XG4gICAgfVxufVxuXG5jbGFzcyBUYWJsZVJvdyBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jZWxsRWxSZWZzID0gbmV3IGludGVybmFsX2Nqcy5SZWZNYXAoKTsgLy8gdGhlIDx0ZD5cbiAgICAgICAgdGhpcy5mcmFtZUVsUmVmcyA9IG5ldyBpbnRlcm5hbF9janMuUmVmTWFwKCk7IC8vIHRoZSBmYy1kYXlncmlkLWRheS1mcmFtZVxuICAgICAgICB0aGlzLmZnRWxSZWZzID0gbmV3IGludGVybmFsX2Nqcy5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWV2ZW50c1xuICAgICAgICB0aGlzLnNlZ0hhcm5lc3NSZWZzID0gbmV3IGludGVybmFsX2Nqcy5SZWZNYXAoKTsgLy8gaW5kZXhlZCBieSBcImluc3RhbmNlSWQ6Zmlyc3RDb2xcIlxuICAgICAgICB0aGlzLnJvb3RFbFJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBmcmFtZVBvc2l0aW9uczogbnVsbCxcbiAgICAgICAgICAgIG1heENvbnRlbnRIZWlnaHQ6IG51bGwsXG4gICAgICAgICAgICBldmVudEluc3RhbmNlSGVpZ2h0czoge30sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUmVzaXplID0gKGlzRm9yY2VkKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNGb3JjZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemluZyh0cnVlKTsgLy8gaXNFeHRlcm5hbD10cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBsZXQgY29sQ250ID0gcHJvcHMuY2VsbHMubGVuZ3RoO1xuICAgICAgICBsZXQgYnVzaW5lc3NIb3Vyc0J5Q29sID0gc3BsaXRTZWdzQnlGaXJzdENvbChwcm9wcy5idXNpbmVzc0hvdXJTZWdzLCBjb2xDbnQpO1xuICAgICAgICBsZXQgYmdFdmVudFNlZ3NCeUNvbCA9IHNwbGl0U2Vnc0J5Rmlyc3RDb2wocHJvcHMuYmdFdmVudFNlZ3MsIGNvbENudCk7XG4gICAgICAgIGxldCBoaWdobGlnaHRTZWdzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHRoaXMuZ2V0SGlnaGxpZ2h0U2VncygpLCBjb2xDbnQpO1xuICAgICAgICBsZXQgbWlycm9yU2Vnc0J5Q29sID0gc3BsaXRTZWdzQnlGaXJzdENvbCh0aGlzLmdldE1pcnJvclNlZ3MoKSwgY29sQ250KTtcbiAgICAgICAgbGV0IHsgc2luZ2xlQ29sUGxhY2VtZW50cywgbXVsdGlDb2xQbGFjZW1lbnRzLCBtb3JlQ250cywgbW9yZU1hcmdpblRvcHMgfSA9IGNvbXB1dGVGZ1NlZ1BsYWNlbWVudChpbnRlcm5hbF9janMuc29ydEV2ZW50U2Vncyhwcm9wcy5mZ0V2ZW50U2Vncywgb3B0aW9ucy5ldmVudE9yZGVyKSwgcHJvcHMuZGF5TWF4RXZlbnRzLCBwcm9wcy5kYXlNYXhFdmVudFJvd3MsIG9wdGlvbnMuZXZlbnRPcmRlclN0cmljdCwgc3RhdGUuZXZlbnRJbnN0YW5jZUhlaWdodHMsIHN0YXRlLm1heENvbnRlbnRIZWlnaHQsIHByb3BzLmNlbGxzKTtcbiAgICAgICAgbGV0IGlzRm9yY2VkSW52aXNpYmxlID0gLy8gVE9ETzogbWVzc3kgd2F5IHRvIGNvbXB1dGUgdGhpc1xuICAgICAgICAgKHByb3BzLmV2ZW50RHJhZyAmJiBwcm9wcy5ldmVudERyYWcuYWZmZWN0ZWRJbnN0YW5jZXMpIHx8XG4gICAgICAgICAgICAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuYWZmZWN0ZWRJbnN0YW5jZXMpIHx8XG4gICAgICAgICAgICB7fTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IHJlZjogdGhpcy5yb290RWxSZWYsIHJvbGU6IFwicm93XCIgfSxcbiAgICAgICAgICAgIHByb3BzLnJlbmRlckludHJvICYmIHByb3BzLnJlbmRlckludHJvKCksXG4gICAgICAgICAgICBwcm9wcy5jZWxscy5tYXAoKGNlbGwsIGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBub3JtYWxGZ05vZGVzID0gdGhpcy5yZW5kZXJGZ1NlZ3MoY29sLCBwcm9wcy5mb3JQcmludCA/IHNpbmdsZUNvbFBsYWNlbWVudHNbY29sXSA6IG11bHRpQ29sUGxhY2VtZW50c1tjb2xdLCBwcm9wcy50b2RheVJhbmdlLCBpc0ZvcmNlZEludmlzaWJsZSk7XG4gICAgICAgICAgICAgICAgbGV0IG1pcnJvckZnTm9kZXMgPSB0aGlzLnJlbmRlckZnU2Vncyhjb2wsIGJ1aWxkTWlycm9yUGxhY2VtZW50cyhtaXJyb3JTZWdzQnlDb2xbY29sXSwgbXVsdGlDb2xQbGFjZW1lbnRzKSwgcHJvcHMudG9kYXlSYW5nZSwge30sIEJvb2xlYW4ocHJvcHMuZXZlbnREcmFnKSwgQm9vbGVhbihwcm9wcy5ldmVudFJlc2l6ZSksIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZUNlbGwsIHsga2V5OiBjZWxsLmtleSwgZWxSZWY6IHRoaXMuY2VsbEVsUmVmcy5jcmVhdGVSZWYoY2VsbC5rZXkpLCBpbm5lckVsUmVmOiB0aGlzLmZyYW1lRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSkgLyogRkYgPHRkPiBwcm9ibGVtLCBidXQgb2theSB0byB1c2UgZm9yIGxlZnQvcmlnaHQuIFRPRE86IHJlbmFtZSBwcm9wICovLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGU6IGNlbGwuZGF0ZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlcnMsIHNob3dXZWVrTnVtYmVyOiBwcm9wcy5zaG93V2Vla051bWJlcnMgJiYgY29sID09PSAwLCBmb3JjZURheVRvcDogcHJvcHMuc2hvd1dlZWtOdW1iZXJzIC8qIGV2ZW4gZGlzcGxheWluZyB3ZWVrbnVtIGZvciByb3csIG5vdCBuZWNlc3NhcmlseSBkYXkgKi8sIHRvZGF5UmFuZ2U6IHByb3BzLnRvZGF5UmFuZ2UsIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgZXZlbnREcmFnOiBwcm9wcy5ldmVudERyYWcsIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSwgZXh0cmFSZW5kZXJQcm9wczogY2VsbC5leHRyYVJlbmRlclByb3BzLCBleHRyYURhdGFBdHRyczogY2VsbC5leHRyYURhdGFBdHRycywgZXh0cmFDbGFzc05hbWVzOiBjZWxsLmV4dHJhQ2xhc3NOYW1lcywgZXh0cmFEYXRlU3BhbjogY2VsbC5leHRyYURhdGVTcGFuLCBtb3JlQ250OiBtb3JlQ250c1tjb2xdLCBtb3JlTWFyZ2luVG9wOiBtb3JlTWFyZ2luVG9wc1tjb2xdLCBzaW5nbGVQbGFjZW1lbnRzOiBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0sIGZnQ29udGVudEVsUmVmOiB0aGlzLmZnRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGZnQ29udGVudDogKCAvLyBGcmFnbWVudCBzY29wZXMgdGhlIGtleXNcbiAgICAgICAgICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCwgbm9ybWFsRmdOb2RlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCwgbWlycm9yRmdOb2RlcykpKSwgYmdDb250ZW50OiAoIC8vIEZyYWdtZW50IHNjb3BlcyB0aGUga2V5c1xuICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmlsbFNlZ3MoaGlnaGxpZ2h0U2Vnc0J5Q29sW2NvbF0sICdoaWdobGlnaHQnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmlsbFNlZ3MoYnVzaW5lc3NIb3Vyc0J5Q29sW2NvbF0sICdub24tYnVzaW5lc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyRmlsbFNlZ3MoYmdFdmVudFNlZ3NCeUNvbFtjb2xdLCAnYmctZXZlbnQnKSkpLCBtaW5IZWlnaHQ6IHByb3BzLmNlbGxNaW5IZWlnaHQgfSkpO1xuICAgICAgICAgICAgfSkpKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKHRydWUpO1xuICAgICAgICB0aGlzLmNvbnRleHQuYWRkUmVzaXplSGFuZGxlcih0aGlzLmhhbmRsZVJlc2l6ZSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBsZXQgY3VycmVudFByb3BzID0gdGhpcy5wcm9wcztcbiAgICAgICAgdGhpcy51cGRhdGVTaXppbmcoIWludGVybmFsX2Nqcy5pc1Byb3BzRXF1YWwocHJldlByb3BzLCBjdXJyZW50UHJvcHMpKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlUmVzaXplKTtcbiAgICB9XG4gICAgZ2V0SGlnaGxpZ2h0U2VncygpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChwcm9wcy5ldmVudERyYWcgJiYgcHJvcHMuZXZlbnREcmFnLnNlZ3MubGVuZ3RoKSB7IC8vIG1lc3N5IGNoZWNrXG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZXZlbnREcmFnLnNlZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzLmV2ZW50UmVzaXplICYmIHByb3BzLmV2ZW50UmVzaXplLnNlZ3MubGVuZ3RoKSB7IC8vIG1lc3N5IGNoZWNrXG4gICAgICAgICAgICByZXR1cm4gcHJvcHMuZXZlbnRSZXNpemUuc2VncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHMuZGF0ZVNlbGVjdGlvblNlZ3M7XG4gICAgfVxuICAgIGdldE1pcnJvclNlZ3MoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmVuZGVyRmdTZWdzKGNvbCwgc2VnUGxhY2VtZW50cywgdG9kYXlSYW5nZSwgaXNGb3JjZWRJbnZpc2libGUsIGlzRHJhZ2dpbmcsIGlzUmVzaXppbmcsIGlzRGF0ZVNlbGVjdGluZykge1xuICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBldmVudFNlbGVjdGlvbiB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IHsgZnJhbWVQb3NpdGlvbnMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGxldCBkZWZhdWx0RGlzcGxheUV2ZW50RW5kID0gdGhpcy5wcm9wcy5jZWxscy5sZW5ndGggPT09IDE7IC8vIGNvbENudCA9PT0gMVxuICAgICAgICBsZXQgaXNNaXJyb3IgPSBpc0RyYWdnaW5nIHx8IGlzUmVzaXppbmcgfHwgaXNEYXRlU2VsZWN0aW5nO1xuICAgICAgICBsZXQgbm9kZXMgPSBbXTtcbiAgICAgICAgaWYgKGZyYW1lUG9zaXRpb25zKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwbGFjZW1lbnQgb2Ygc2VnUGxhY2VtZW50cykge1xuICAgICAgICAgICAgICAgIGxldCB7IHNlZyB9ID0gcGxhY2VtZW50O1xuICAgICAgICAgICAgICAgIGxldCB7IGluc3RhbmNlSWQgfSA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBpbnN0YW5jZUlkICsgJzonICsgY29sO1xuICAgICAgICAgICAgICAgIGxldCBpc1Zpc2libGUgPSBwbGFjZW1lbnQuaXNWaXNpYmxlICYmICFpc0ZvcmNlZEludmlzaWJsZVtpbnN0YW5jZUlkXTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBYnNvbHV0ZSA9IHBsYWNlbWVudC5pc0Fic29sdXRlO1xuICAgICAgICAgICAgICAgIGxldCBsZWZ0ID0gJyc7XG4gICAgICAgICAgICAgICAgbGV0IHJpZ2h0ID0gJyc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuaXNSdGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBmcmFtZVBvc2l0aW9ucy5sZWZ0c1tzZWcubGFzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5sZWZ0c1tzZWcuZmlyc3RDb2xdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IGZyYW1lUG9zaXRpb25zLnJpZ2h0c1tzZWcuZmlyc3RDb2xdIC0gZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5sYXN0Q29sXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIGtub3duIGJ1ZzogZXZlbnRzIHRoYXQgYXJlIGZvcmNlIHRvIGJlIGxpc3QtaXRlbSBidXQgc3BhbiBtdWx0aXBsZSBkYXlzIHN0aWxsIHRha2UgdXAgc3BhY2UgaW4gbGF0ZXIgY29sdW1uc1xuICAgICAgICAgICAgICAgIHRvZG86IGluIHByaW50IHZpZXcsIGZvciBtdWx0aS1kYXkgZXZlbnRzLCBkb24ndCBkaXNwbGF5IHRpdGxlIHdpdGhpbiBub24tc3RhcnQvZW5kIHNlZ3NcbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiAnZmMtZGF5Z3JpZC1ldmVudC1oYXJuZXNzJyArIChpc0Fic29sdXRlID8gJyBmYy1kYXlncmlkLWV2ZW50LWhhcm5lc3MtYWJzJyA6ICcnKSwga2V5OiBrZXksIHJlZjogaXNNaXJyb3IgPyBudWxsIDogdGhpcy5zZWdIYXJuZXNzUmVmcy5jcmVhdGVSZWYoa2V5KSwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGlzVmlzaWJsZSA/ICcnIDogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IGlzQWJzb2x1dGUgPyAnJyA6IHBsYWNlbWVudC5tYXJnaW5Ub3AsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGlzQWJzb2x1dGUgPyBwbGFjZW1lbnQuYWJzb2x1dGVUb3AgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICByaWdodCxcbiAgICAgICAgICAgICAgICAgICAgfSB9LCBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSA/IChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoVGFibGVMaXN0SXRlbUV2ZW50LCBPYmplY3QuYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsIGlzU2VsZWN0ZWQ6IGluc3RhbmNlSWQgPT09IGV2ZW50U2VsZWN0aW9uLCBkZWZhdWx0RGlzcGxheUV2ZW50RW5kOiBkZWZhdWx0RGlzcGxheUV2ZW50RW5kIH0sIGludGVybmFsX2Nqcy5nZXRTZWdNZXRhKHNlZywgdG9kYXlSYW5nZSkpKSkgOiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlQmxvY2tFdmVudCwgT2JqZWN0LmFzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBpc0RyYWdnaW5nLCBpc1Jlc2l6aW5nOiBpc1Jlc2l6aW5nLCBpc0RhdGVTZWxlY3Rpbmc6IGlzRGF0ZVNlbGVjdGluZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGRlZmF1bHREaXNwbGF5RXZlbnRFbmQgfSwgaW50ZXJuYWxfY2pzLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlKSkpKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgcmVuZGVyRmlsbFNlZ3Moc2VncywgZmlsbFR5cGUpIHtcbiAgICAgICAgbGV0IHsgaXNSdGwgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgdG9kYXlSYW5nZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IHsgZnJhbWVQb3NpdGlvbnMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBpZiAoZnJhbWVQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNlZyBvZiBzZWdzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxlZnRSaWdodENzcyA9IGlzUnRsID8ge1xuICAgICAgICAgICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmxhc3RDb2xdIC0gZnJhbWVQb3NpdGlvbnMubGVmdHNbc2VnLmZpcnN0Q29sXSxcbiAgICAgICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBrZXk6IGludGVybmFsX2Nqcy5idWlsZEV2ZW50UmFuZ2VLZXkoc2VnLmV2ZW50UmFuZ2UpLCBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1iZy1oYXJuZXNzXCIsIHN0eWxlOiBsZWZ0UmlnaHRDc3MgfSwgZmlsbFR5cGUgPT09ICdiZy1ldmVudCcgP1xuICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxfY2pzLkJnRXZlbnQsIE9iamVjdC5hc3NpZ24oeyBzZWc6IHNlZyB9LCBpbnRlcm5hbF9janMuZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UpKSkgOlxuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMucmVuZGVyRmlsbChmaWxsVHlwZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIHt9LCAuLi5ub2Rlcyk7XG4gICAgfVxuICAgIHVwZGF0ZVNpemluZyhpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBzdGF0ZSwgZnJhbWVFbFJlZnMgfSA9IHRoaXM7XG4gICAgICAgIGlmICghcHJvcHMuZm9yUHJpbnQgJiZcbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoICE9PSBudWxsIC8vIHBvc2l0aW9uaW5nIHJlYWR5P1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpc0V4dGVybmFsU2l6aW5nQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZyYW1lRWxzID0gcHJvcHMuY2VsbHMubWFwKChjZWxsKSA9PiBmcmFtZUVsUmVmcy5jdXJyZW50TWFwW2NlbGwua2V5XSk7XG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lRWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3JpZ2luRWwgPSB0aGlzLnJvb3RFbFJlZi5jdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UG9zaXRpb25DYWNoZSA9IG5ldyBpbnRlcm5hbF9janMuUG9zaXRpb25DYWNoZShvcmlnaW5FbCwgZnJhbWVFbHMsIHRydWUsIC8vIGlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUuZnJhbWVQb3NpdGlvbnMgfHwgIXN0YXRlLmZyYW1lUG9zaXRpb25zLnNpbWlsYXJUbyhuZXdQb3NpdGlvbkNhY2hlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVQb3NpdGlvbnM6IG5ldyBpbnRlcm5hbF9janMuUG9zaXRpb25DYWNoZShvcmlnaW5FbCwgZnJhbWVFbHMsIHRydWUsIC8vIGlzSG9yaXpvbnRhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2xkSW5zdGFuY2VIZWlnaHRzID0gdGhpcy5zdGF0ZS5ldmVudEluc3RhbmNlSGVpZ2h0cztcbiAgICAgICAgICAgIGNvbnN0IG5ld0luc3RhbmNlSGVpZ2h0cyA9IHRoaXMucXVlcnlFdmVudEluc3RhbmNlSGVpZ2h0cygpO1xuICAgICAgICAgICAgY29uc3QgbGltaXRCeUNvbnRlbnRIZWlnaHQgPSBwcm9wcy5kYXlNYXhFdmVudHMgPT09IHRydWUgfHwgcHJvcHMuZGF5TWF4RXZlbnRSb3dzID09PSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zYWZlU2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC8vIEhBQ0sgdG8gcHJldmVudCBvc2NpbGxhdGlvbnMgb2YgZXZlbnRzIGJlaW5nIHNob3duL2hpZGRlbiBmcm9tIG1heC1ldmVudC1yb3dzXG4gICAgICAgICAgICAgICAgLy8gRXNzZW50aWFsbHksIG9uY2UgeW91IGNvbXB1dGUgYW4gZWxlbWVudCdzIGhlaWdodCwgbmV2ZXIgbnVsbC1vdXQuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWx3YXlzIGRpc3BsYXkgYWxsIGV2ZW50cywgYXMgdmlzaWJpbGl0eTpoaWRkZW4/XG4gICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUhlaWdodHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb2xkSW5zdGFuY2VIZWlnaHRzKSwgbmV3SW5zdGFuY2VIZWlnaHRzKSxcbiAgICAgICAgICAgICAgICBtYXhDb250ZW50SGVpZ2h0OiBsaW1pdEJ5Q29udGVudEhlaWdodCA/IHRoaXMuY29tcHV0ZU1heENvbnRlbnRIZWlnaHQoKSA6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzKCkge1xuICAgICAgICBsZXQgc2VnRWxNYXAgPSB0aGlzLnNlZ0hhcm5lc3NSZWZzLmN1cnJlbnRNYXA7XG4gICAgICAgIGxldCBldmVudEluc3RhbmNlSGVpZ2h0cyA9IHt9O1xuICAgICAgICAvLyBnZXQgdGhlIG1heCBoZWlnaHQgYW1vbmdzdCBpbnN0YW5jZSBzZWdzXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBzZWdFbE1hcCkge1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IE1hdGgucm91bmQoc2VnRWxNYXBba2V5XS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpO1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlSWQgPSBrZXkuc3BsaXQoJzonKVswXTsgLy8gZGVjb25zdHJ1Y3QgaG93IHJlbmRlckZnU2VncyBtYWtlcyB0aGUga2V5XG4gICAgICAgICAgICBldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXSA9IE1hdGgubWF4KGV2ZW50SW5zdGFuY2VIZWlnaHRzW2luc3RhbmNlSWRdIHx8IDAsIGhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50SW5zdGFuY2VIZWlnaHRzO1xuICAgIH1cbiAgICBjb21wdXRlTWF4Q29udGVudEhlaWdodCgpIHtcbiAgICAgICAgbGV0IGZpcnN0S2V5ID0gdGhpcy5wcm9wcy5jZWxsc1swXS5rZXk7XG4gICAgICAgIGxldCBjZWxsRWwgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcFtmaXJzdEtleV07XG4gICAgICAgIGxldCBmY0NvbnRhaW5lckVsID0gdGhpcy5mZ0VsUmVmcy5jdXJyZW50TWFwW2ZpcnN0S2V5XTtcbiAgICAgICAgcmV0dXJuIGNlbGxFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gLSBmY0NvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICB9XG4gICAgZ2V0Q2VsbEVscygpIHtcbiAgICAgICAgbGV0IGVsTWFwID0gdGhpcy5jZWxsRWxSZWZzLmN1cnJlbnRNYXA7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNlbGxzLm1hcCgoY2VsbCkgPT4gZWxNYXBbY2VsbC5rZXldKTtcbiAgICB9XG59XG5UYWJsZVJvdy5hZGRTdGF0ZUVxdWFsaXR5KHtcbiAgICBldmVudEluc3RhbmNlSGVpZ2h0czogaW50ZXJuYWxfY2pzLmlzUHJvcHNFcXVhbCxcbn0pO1xuZnVuY3Rpb24gYnVpbGRNaXJyb3JQbGFjZW1lbnRzKG1pcnJvclNlZ3MsIGNvbFBsYWNlbWVudHMpIHtcbiAgICBpZiAoIW1pcnJvclNlZ3MubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHRvcHNCeUluc3RhbmNlSWQgPSBidWlsZEFic29sdXRlVG9wSGFzaChjb2xQbGFjZW1lbnRzKTsgLy8gVE9ETzogY2FjaGUgdGhpcyBhdCBmaXJzdCByZW5kZXI/XG4gICAgcmV0dXJuIG1pcnJvclNlZ3MubWFwKChzZWcpID0+ICh7XG4gICAgICAgIHNlZyxcbiAgICAgICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgICAgICBpc0Fic29sdXRlOiB0cnVlLFxuICAgICAgICBhYnNvbHV0ZVRvcDogdG9wc0J5SW5zdGFuY2VJZFtzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSxcbiAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQWJzb2x1dGVUb3BIYXNoKGNvbFBsYWNlbWVudHMpIHtcbiAgICBsZXQgdG9wc0J5SW5zdGFuY2VJZCA9IHt9O1xuICAgIGZvciAobGV0IHBsYWNlbWVudHMgb2YgY29sUGxhY2VtZW50cykge1xuICAgICAgICBmb3IgKGxldCBwbGFjZW1lbnQgb2YgcGxhY2VtZW50cykge1xuICAgICAgICAgICAgdG9wc0J5SW5zdGFuY2VJZFtwbGFjZW1lbnQuc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBwbGFjZW1lbnQuYWJzb2x1dGVUb3A7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvcHNCeUluc3RhbmNlSWQ7XG59XG5cbmNsYXNzIFRhYmxlUm93cyBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MgPSBpbnRlcm5hbF9janMubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIHRoaXMuc3BsaXRCZ0V2ZW50U2VncyA9IGludGVybmFsX2Nqcy5tZW1vaXplKHNwbGl0U2Vnc0J5Um93KTtcbiAgICAgICAgdGhpcy5zcGxpdEZnRXZlbnRTZWdzID0gaW50ZXJuYWxfY2pzLm1lbW9pemUoc3BsaXRTZWdzQnlSb3cpO1xuICAgICAgICB0aGlzLnNwbGl0RGF0ZVNlbGVjdGlvblNlZ3MgPSBpbnRlcm5hbF9janMubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudERyYWcgPSBpbnRlcm5hbF9janMubWVtb2l6ZShzcGxpdEludGVyYWN0aW9uQnlSb3cpO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnRSZXNpemUgPSBpbnRlcm5hbF9janMubWVtb2l6ZShzcGxpdEludGVyYWN0aW9uQnlSb3cpO1xuICAgICAgICB0aGlzLnJvd1JlZnMgPSBuZXcgaW50ZXJuYWxfY2pzLlJlZk1hcCgpO1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgcm93Q250ID0gcHJvcHMuY2VsbHMubGVuZ3RoO1xuICAgICAgICBsZXQgYnVzaW5lc3NIb3VyU2Vnc0J5Um93ID0gdGhpcy5zcGxpdEJ1c2luZXNzSG91clNlZ3MocHJvcHMuYnVzaW5lc3NIb3VyU2Vncywgcm93Q250KTtcbiAgICAgICAgbGV0IGJnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0QmdFdmVudFNlZ3MocHJvcHMuYmdFdmVudFNlZ3MsIHJvd0NudCk7XG4gICAgICAgIGxldCBmZ0V2ZW50U2Vnc0J5Um93ID0gdGhpcy5zcGxpdEZnRXZlbnRTZWdzKHByb3BzLmZnRXZlbnRTZWdzLCByb3dDbnQpO1xuICAgICAgICBsZXQgZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyA9IHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uU2Vncyhwcm9wcy5kYXRlU2VsZWN0aW9uU2Vncywgcm93Q250KTtcbiAgICAgICAgbGV0IGV2ZW50RHJhZ0J5Um93ID0gdGhpcy5zcGxpdEV2ZW50RHJhZyhwcm9wcy5ldmVudERyYWcsIHJvd0NudCk7XG4gICAgICAgIGxldCBldmVudFJlc2l6ZUJ5Um93ID0gdGhpcy5zcGxpdEV2ZW50UmVzaXplKHByb3BzLmV2ZW50UmVzaXplLCByb3dDbnQpO1xuICAgICAgICAvLyBmb3IgRGF5R3JpZCB2aWV3IHdpdGggbWFueSByb3dzLCBmb3JjZSBhIG1pbi1oZWlnaHQgb24gY2VsbHMgc28gZG9lc24ndCBhcHBlYXIgc3F1aXNoZWRcbiAgICAgICAgLy8gY2hvb3NlIDcgYmVjYXVzZSBhIG1vbnRoIHZpZXcgd2lsbCBoYXZlIG1heCA2IHJvd3NcbiAgICAgICAgbGV0IGNlbGxNaW5IZWlnaHQgPSAocm93Q250ID49IDcgJiYgcHJvcHMuY2xpZW50V2lkdGgpID9cbiAgICAgICAgICAgIHByb3BzLmNsaWVudFdpZHRoIC8gY29udGV4dC5vcHRpb25zLmFzcGVjdFJhdGlvIC8gNiA6XG4gICAgICAgICAgICBudWxsO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuTm93VGltZXIsIHsgdW5pdDogXCJkYXlcIiB9LCAobm93RGF0ZSwgdG9kYXlSYW5nZSkgPT4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBwcm9wcy5jZWxscy5tYXAoKGNlbGxzLCByb3cpID0+IChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoVGFibGVSb3csIHsgcmVmOiB0aGlzLnJvd1JlZnMuY3JlYXRlUmVmKHJvdyksIGtleTogY2VsbHMubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyBjZWxsc1swXS5kYXRlLnRvSVNPU3RyaW5nKCkgLyogYmVzdD8gb3IgcHV0IGtleSBvbiBjZWxsPyBvciB1c2UgZGlmZiBmb3JtYXR0ZXI/ICovXG4gICAgICAgICAgICAgICAgOiByb3cgLy8gaW4gY2FzZSB0aGVyZSBhcmUgbm8gY2VsbHMgKGxpa2Ugd2hlbiByZXNvdXJjZSB2aWV3IGlzIGxvYWRpbmcpXG4gICAgICAgICAgICAsIHNob3dEYXlOdW1iZXJzOiByb3dDbnQgPiAxLCBzaG93V2Vla051bWJlcnM6IHByb3BzLnNob3dXZWVrTnVtYmVycywgdG9kYXlSYW5nZTogdG9kYXlSYW5nZSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCBjZWxsczogY2VsbHMsIHJlbmRlckludHJvOiBwcm9wcy5yZW5kZXJSb3dJbnRybywgYnVzaW5lc3NIb3VyU2VnczogYnVzaW5lc3NIb3VyU2Vnc0J5Um93W3Jvd10sIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbiwgYmdFdmVudFNlZ3M6IGJnRXZlbnRTZWdzQnlSb3dbcm93XS5maWx0ZXIoaXNTZWdBbGxEYXkpIC8qIGhhY2sgKi8sIGZnRXZlbnRTZWdzOiBmZ0V2ZW50U2Vnc0J5Um93W3Jvd10sIGRhdGVTZWxlY3Rpb25TZWdzOiBkYXRlU2VsZWN0aW9uU2Vnc0J5Um93W3Jvd10sIGV2ZW50RHJhZzogZXZlbnREcmFnQnlSb3dbcm93XSwgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplQnlSb3dbcm93XSwgZGF5TWF4RXZlbnRzOiBwcm9wcy5kYXlNYXhFdmVudHMsIGRheU1heEV2ZW50Um93czogcHJvcHMuZGF5TWF4RXZlbnRSb3dzLCBjbGllbnRXaWR0aDogcHJvcHMuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogcHJvcHMuY2xpZW50SGVpZ2h0LCBjZWxsTWluSGVpZ2h0OiBjZWxsTWluSGVpZ2h0LCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQgfSkpKSkpKSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICAvLyBIQUNLOiBuZWVkIGEgZGF5Z3JpZCB3cmFwcGVyIHBhcmVudCB0byBkbyBwb3NpdGlvbmluZ1xuICAgICAgICAvLyBOT1RFOiBhIGRheWdyaWQgcmVzb3VyY2UgdmlldyB3L28gcmVzb3VyY2VzIGNhbiBoYXZlIHplcm8gY2VsbHNcbiAgICAgICAgY29uc3QgZmlyc3RDZWxsRWwgPSB0aGlzLnJvd1JlZnMuY3VycmVudE1hcFswXS5nZXRDZWxsRWxzKClbMF07XG4gICAgICAgIHRoaXMucm9vdEVsID0gZmlyc3RDZWxsRWwgPyBmaXJzdENlbGxFbC5jbG9zZXN0KCcuZmMtZGF5Z3JpZC1ib2R5JykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5yb290RWwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgICBlbDogdGhpcy5yb290RWwsXG4gICAgICAgICAgICAgICAgaXNIaXRDb21ib0FsbG93ZWQ6IHRoaXMucHJvcHMuaXNIaXRDb21ib0FsbG93ZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdEVsKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50KHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5yb290RWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEhpdCBTeXN0ZW1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJlcGFyZUhpdHMoKSB7XG4gICAgICAgIHRoaXMucm93UG9zaXRpb25zID0gbmV3IGludGVybmFsX2Nqcy5Qb3NpdGlvbkNhY2hlKHRoaXMucm9vdEVsLCB0aGlzLnJvd1JlZnMuY29sbGVjdCgpLm1hcCgocm93T2JqKSA9PiByb3dPYmouZ2V0Q2VsbEVscygpWzBdKSwgLy8gZmlyc3QgY2VsbCBlbCBpbiBlYWNoIHJvdy4gVE9ETzogbm90IG9wdGltYWxcbiAgICAgICAgZmFsc2UsIHRydWUpO1xuICAgICAgICB0aGlzLmNvbFBvc2l0aW9ucyA9IG5ldyBpbnRlcm5hbF9janMuUG9zaXRpb25DYWNoZSh0aGlzLnJvb3RFbCwgdGhpcy5yb3dSZWZzLmN1cnJlbnRNYXBbMF0uZ2V0Q2VsbEVscygpLCAvLyBjZWxsIGVscyBpbiBmaXJzdCByb3dcbiAgICAgICAgdHJ1ZSwgLy8gaG9yaXpvbnRhbFxuICAgICAgICBmYWxzZSk7XG4gICAgfVxuICAgIHF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3ApIHtcbiAgICAgICAgbGV0IHsgY29sUG9zaXRpb25zLCByb3dQb3NpdGlvbnMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBjb2wgPSBjb2xQb3NpdGlvbnMubGVmdFRvSW5kZXgocG9zaXRpb25MZWZ0KTtcbiAgICAgICAgbGV0IHJvdyA9IHJvd1Bvc2l0aW9ucy50b3BUb0luZGV4KHBvc2l0aW9uVG9wKTtcbiAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIGNvbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IHRoaXMucHJvcHMuY2VsbHNbcm93XVtjb2xdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSxcbiAgICAgICAgICAgICAgICBkYXRlU3BhbjogT2JqZWN0LmFzc2lnbih7IHJhbmdlOiB0aGlzLmdldENlbGxSYW5nZShyb3csIGNvbCksIGFsbERheTogdHJ1ZSB9LCBjZWxsLmV4dHJhRGF0ZVNwYW4pLFxuICAgICAgICAgICAgICAgIGRheUVsOiB0aGlzLmdldENlbGxFbChyb3csIGNvbCksXG4gICAgICAgICAgICAgICAgcmVjdDoge1xuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBjb2xQb3NpdGlvbnMubGVmdHNbY29sXSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGNvbFBvc2l0aW9ucy5yaWdodHNbY29sXSxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiByb3dQb3NpdGlvbnMudG9wc1tyb3ddLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206IHJvd1Bvc2l0aW9ucy5ib3R0b21zW3Jvd10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsYXllcjogMCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldENlbGxFbChyb3csIGNvbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dSZWZzLmN1cnJlbnRNYXBbcm93XS5nZXRDZWxsRWxzKClbY29sXTsgLy8gVE9ETzogbm90IG9wdGltYWxcbiAgICB9XG4gICAgZ2V0Q2VsbFJhbmdlKHJvdywgY29sKSB7XG4gICAgICAgIGxldCBzdGFydCA9IHRoaXMucHJvcHMuY2VsbHNbcm93XVtjb2xdLmRhdGU7XG4gICAgICAgIGxldCBlbmQgPSBpbnRlcm5hbF9janMuYWRkRGF5cyhzdGFydCwgMSk7XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1NlZ0FsbERheShzZWcpIHtcbiAgICByZXR1cm4gc2VnLmV2ZW50UmFuZ2UuZGVmLmFsbERheTtcbn1cblxuY2xhc3MgVGFibGUgZXh0ZW5kcyBpbnRlcm5hbF9janMuRGF0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWxSZWYgPSBwcmVhY3RfY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLm5lZWRzU2Nyb2xsUmVzZXQgPSBmYWxzZTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgZGF5TWF4RXZlbnRSb3dzLCBkYXlNYXhFdmVudHMsIGV4cGFuZFJvd3MgfSA9IHByb3BzO1xuICAgICAgICBsZXQgbGltaXRWaWFCYWxhbmNlZCA9IGRheU1heEV2ZW50cyA9PT0gdHJ1ZSB8fCBkYXlNYXhFdmVudFJvd3MgPT09IHRydWU7XG4gICAgICAgIC8vIGlmIHJvd3MgY2FuJ3QgZXhwYW5kIHRvIGZpbGwgZml4ZWQgaGVpZ2h0LCBjYW4ndCBkbyBiYWxhbmNlZC1oZWlnaHQgZXZlbnQgbGltaXRcbiAgICAgICAgLy8gVE9ETzogYmVzdCBwbGFjZSB0byBub3JtYWxpemUgdGhlc2Ugb3B0aW9ucz9cbiAgICAgICAgaWYgKGxpbWl0VmlhQmFsYW5jZWQgJiYgIWV4cGFuZFJvd3MpIHtcbiAgICAgICAgICAgIGxpbWl0VmlhQmFsYW5jZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGRheU1heEV2ZW50Um93cyA9IG51bGw7XG4gICAgICAgICAgICBkYXlNYXhFdmVudHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAgICAgJ2ZjLWRheWdyaWQtYm9keScsXG4gICAgICAgICAgICBsaW1pdFZpYUJhbGFuY2VkID8gJ2ZjLWRheWdyaWQtYm9keS1iYWxhbmNlZCcgOiAnZmMtZGF5Z3JpZC1ib2R5LXVuYmFsYW5jZWQnLFxuICAgICAgICAgICAgZXhwYW5kUm93cyA/ICcnIDogJ2ZjLWRheWdyaWQtYm9keS1uYXR1cmFsJywgLy8gd2lsbCBoZWlnaHQgb2Ygb25lIHJvdyBkZXBlbmQgb24gdGhlIG90aGVycz9cbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHRoaXMuZWxSZWYsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlc2UgcHJvcHMgYXJlIGltcG9ydGFudCB0byBnaXZlIHRoaXMgd3JhcHBlciBjb3JyZWN0IGRpbWVuc2lvbnMgZm9yIGludGVyYWN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGlmIHdlIHNldCBpdCBoZXJlLCBjYW4gd2UgYXZvaWQgZ2l2aW5nIHRvIGlubmVyIHRhYmxlcz9cbiAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgbWluV2lkdGg6IHByb3BzLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJ0YWJsZVwiLCB7IHJvbGU6IFwicHJlc2VudGF0aW9uXCIsIGNsYXNzTmFtZTogXCJmYy1zY3JvbGxncmlkLXN5bmMtdGFibGVcIiwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogcHJvcHMudGFibGVNaW5XaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBleHBhbmRSb3dzID8gcHJvcHMuY2xpZW50SGVpZ2h0IDogJycsXG4gICAgICAgICAgICAgICAgfSB9LFxuICAgICAgICAgICAgICAgIHByb3BzLmNvbEdyb3VwTm9kZSxcbiAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiLCB7IHJvbGU6IFwicHJlc2VudGF0aW9uXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlUm93cywgeyBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGNlbGxzOiBwcm9wcy5jZWxscywgcmVuZGVyUm93SW50cm86IHByb3BzLnJlbmRlclJvd0ludHJvLCBzaG93V2Vla051bWJlcnM6IHByb3BzLnNob3dXZWVrTnVtYmVycywgY2xpZW50V2lkdGg6IHByb3BzLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IHByb3BzLmNsaWVudEhlaWdodCwgYnVzaW5lc3NIb3VyU2VnczogcHJvcHMuYnVzaW5lc3NIb3VyU2VncywgYmdFdmVudFNlZ3M6IHByb3BzLmJnRXZlbnRTZWdzLCBmZ0V2ZW50U2VnczogcHJvcHMuZmdFdmVudFNlZ3MsIGRhdGVTZWxlY3Rpb25TZWdzOiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncywgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCBkYXlNYXhFdmVudHM6IGRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBkYXlNYXhFdmVudFJvd3MsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCwgaXNIaXRDb21ib0FsbG93ZWQ6IHByb3BzLmlzSGl0Q29tYm9BbGxvd2VkIH0pKSkpKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFNjcm9sbFJlc2V0KCk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5kYXRlUHJvZmlsZSAhPT0gdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0U2Nyb2xsUmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmx1c2hTY3JvbGxSZXNldCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3RTY3JvbGxSZXNldCgpIHtcbiAgICAgICAgdGhpcy5uZWVkc1Njcm9sbFJlc2V0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mbHVzaFNjcm9sbFJlc2V0KCk7XG4gICAgfVxuICAgIGZsdXNoU2Nyb2xsUmVzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLm5lZWRzU2Nyb2xsUmVzZXQgJiZcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2xpZW50V2lkdGggLy8gc2l6ZXMgY29tcHV0ZWQ/XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc3ViamVjdEVsID0gZ2V0U2Nyb2xsU3ViamVjdEVsKHRoaXMuZWxSZWYuY3VycmVudCwgdGhpcy5wcm9wcy5kYXRlUHJvZmlsZSk7XG4gICAgICAgICAgICBpZiAoc3ViamVjdEVsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luRWwgPSBzdWJqZWN0RWwuY2xvc2VzdCgnLmZjLWRheWdyaWQtYm9keScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEVsID0gb3JpZ2luRWwuY2xvc2VzdCgnLmZjLXNjcm9sbGVyJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gc3ViamVjdEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAgICAgICBzY3JvbGxFbC5zY3JvbGxUb3AgPSBzY3JvbGxUb3AgPyAoc2Nyb2xsVG9wICsgMSkgOiAwOyAvLyBvdmVyY29tZSBib3JkZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubmVlZHNTY3JvbGxSZXNldCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsU3ViamVjdEVsKGNvbnRhaW5lckVsLCBkYXRlUHJvZmlsZSkge1xuICAgIGxldCBlbDtcbiAgICBpZiAoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdC5tYXRjaCgveWVhcnxtb250aC8pKSB7XG4gICAgICAgIGVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcihgW2RhdGEtZGF0ZT1cIiR7aW50ZXJuYWxfY2pzLmZvcm1hdElzb01vbnRoU3RyKGRhdGVQcm9maWxlLmN1cnJlbnREYXRlKX0tMDFcIl1gKTtcbiAgICAgICAgLy8gZXZlbiBpZiB2aWV3IGlzIG1vbnRoLWJhc2VkLCBmaXJzdC1vZi1tb250aCBtaWdodCBiZSBoaWRkZW4uLi5cbiAgICB9XG4gICAgaWYgKCFlbCkge1xuICAgICAgICBlbCA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWRhdGU9XCIke2ludGVybmFsX2Nqcy5mb3JtYXREYXlTdHJpbmcoZGF0ZVByb2ZpbGUuY3VycmVudERhdGUpfVwiXWApO1xuICAgICAgICAvLyBjb3VsZCBzdGlsbCBiZSBoaWRkZW4gaWYgYW4gaW50ZXJpb3ItdmlldyBoaWRkZW4gZGF5XG4gICAgfVxuICAgIHJldHVybiBlbDtcbn1cblxuY2xhc3MgRGF5VGFibGVTbGljZXIgZXh0ZW5kcyBpbnRlcm5hbF9janMuU2xpY2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5mb3JjZURheUlmTGlzdEl0ZW0gPSB0cnVlO1xuICAgIH1cbiAgICBzbGljZVJhbmdlKGRhdGVSYW5nZSwgZGF5VGFibGVNb2RlbCkge1xuICAgICAgICByZXR1cm4gZGF5VGFibGVNb2RlbC5zbGljZVJhbmdlKGRhdGVSYW5nZSk7XG4gICAgfVxufVxuXG5jbGFzcyBEYXlUYWJsZSBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zbGljZXIgPSBuZXcgRGF5VGFibGVTbGljZXIoKTtcbiAgICAgICAgdGhpcy50YWJsZVJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlLCBPYmplY3QuYXNzaWduKHsgcmVmOiB0aGlzLnRhYmxlUmVmIH0sIHRoaXMuc2xpY2VyLnNsaWNlUHJvcHMocHJvcHMsIHByb3BzLmRhdGVQcm9maWxlLCBwcm9wcy5uZXh0RGF5VGhyZXNob2xkLCBjb250ZXh0LCBwcm9wcy5kYXlUYWJsZU1vZGVsKSwgeyBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGNlbGxzOiBwcm9wcy5kYXlUYWJsZU1vZGVsLmNlbGxzLCBjb2xHcm91cE5vZGU6IHByb3BzLmNvbEdyb3VwTm9kZSwgdGFibGVNaW5XaWR0aDogcHJvcHMudGFibGVNaW5XaWR0aCwgcmVuZGVyUm93SW50cm86IHByb3BzLnJlbmRlclJvd0ludHJvLCBkYXlNYXhFdmVudHM6IHByb3BzLmRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBwcm9wcy5kYXlNYXhFdmVudFJvd3MsIHNob3dXZWVrTnVtYmVyczogcHJvcHMuc2hvd1dlZWtOdW1iZXJzLCBleHBhbmRSb3dzOiBwcm9wcy5leHBhbmRSb3dzLCBoZWFkZXJBbGlnbkVsUmVmOiBwcm9wcy5oZWFkZXJBbGlnbkVsUmVmLCBjbGllbnRXaWR0aDogcHJvcHMuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogcHJvcHMuY2xpZW50SGVpZ2h0LCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQgfSkpKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlRGF0ZVByb2ZpbGVHZW5lcmF0b3IgZXh0ZW5kcyBpbnRlcm5hbF9janMuRGF0ZVByb2ZpbGVHZW5lcmF0b3Ige1xuICAgIC8vIENvbXB1dGVzIHRoZSBkYXRlIHJhbmdlIHRoYXQgd2lsbCBiZSByZW5kZXJlZFxuICAgIGJ1aWxkUmVuZGVyUmFuZ2UoY3VycmVudFJhbmdlLCBjdXJyZW50UmFuZ2VVbml0LCBpc1JhbmdlQWxsRGF5KSB7XG4gICAgICAgIGxldCByZW5kZXJSYW5nZSA9IHN1cGVyLmJ1aWxkUmVuZGVyUmFuZ2UoY3VycmVudFJhbmdlLCBjdXJyZW50UmFuZ2VVbml0LCBpc1JhbmdlQWxsRGF5KTtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBidWlsZERheVRhYmxlUmVuZGVyUmFuZ2Uoe1xuICAgICAgICAgICAgY3VycmVudFJhbmdlOiByZW5kZXJSYW5nZSxcbiAgICAgICAgICAgIHNuYXBUb1dlZWs6IC9eKHllYXJ8bW9udGgpJC8udGVzdChjdXJyZW50UmFuZ2VVbml0KSxcbiAgICAgICAgICAgIGZpeGVkV2Vla0NvdW50OiBwcm9wcy5maXhlZFdlZWtDb3VudCxcbiAgICAgICAgICAgIGRhdGVFbnY6IHByb3BzLmRhdGVFbnYsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkRGF5VGFibGVSZW5kZXJSYW5nZShwcm9wcykge1xuICAgIGxldCB7IGRhdGVFbnYsIGN1cnJlbnRSYW5nZSB9ID0gcHJvcHM7XG4gICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gY3VycmVudFJhbmdlO1xuICAgIGxldCBlbmRPZldlZWs7XG4gICAgLy8geWVhciBhbmQgbW9udGggdmlld3Mgc2hvdWxkIGJlIGFsaWduZWQgd2l0aCB3ZWVrcy4gdGhpcyBpcyBhbHJlYWR5IGRvbmUgZm9yIHdlZWtcbiAgICBpZiAocHJvcHMuc25hcFRvV2Vlaykge1xuICAgICAgICBzdGFydCA9IGRhdGVFbnYuc3RhcnRPZldlZWsoc3RhcnQpO1xuICAgICAgICAvLyBtYWtlIGVuZC1vZi13ZWVrIGlmIG5vdCBhbHJlYWR5XG4gICAgICAgIGVuZE9mV2VlayA9IGRhdGVFbnYuc3RhcnRPZldlZWsoZW5kKTtcbiAgICAgICAgaWYgKGVuZE9mV2Vlay52YWx1ZU9mKCkgIT09IGVuZC52YWx1ZU9mKCkpIHtcbiAgICAgICAgICAgIGVuZCA9IGludGVybmFsX2Nqcy5hZGRXZWVrcyhlbmRPZldlZWssIDEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVuc3VyZSA2IHdlZWtzXG4gICAgaWYgKHByb3BzLmZpeGVkV2Vla0NvdW50KSB7XG4gICAgICAgIC8vIFRPRE86IGluc3RlYWQgb2YgdGhlc2UgZGF0ZS1tYXRoIGd5bW5hc3RpY3MgKGZvciBtdWx0aW1vbnRoIHZpZXcpLFxuICAgICAgICAvLyBjb21wdXRlIGRhdGVwcm9maWxlcyBvZiBhbGwgbW9udGhzLCB0aGVuIHVzZSBzdGFydCBvZiBmaXJzdCBhbmQgZW5kIG9mIGxhc3QuXG4gICAgICAgIGxldCBsYXN0TW9udGhSZW5kZXJTdGFydCA9IGRhdGVFbnYuc3RhcnRPZldlZWsoZGF0ZUVudi5zdGFydE9mTW9udGgoaW50ZXJuYWxfY2pzLmFkZERheXMoY3VycmVudFJhbmdlLmVuZCwgLTEpKSk7XG4gICAgICAgIGxldCByb3dDbnQgPSBNYXRoLmNlaWwoLy8gY291bGQgYmUgcGFydGlhbCB3ZWVrcyBkdWUgdG8gaGlkZGVuRGF5c1xuICAgICAgICBpbnRlcm5hbF9janMuZGlmZldlZWtzKGxhc3RNb250aFJlbmRlclN0YXJ0LCBlbmQpKTtcbiAgICAgICAgZW5kID0gaW50ZXJuYWxfY2pzLmFkZFdlZWtzKGVuZCwgNiAtIHJvd0NudCk7XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbn1cblxuLyogQW4gYWJzdHJhY3QgY2xhc3MgZm9yIHRoZSBkYXlncmlkIHZpZXdzLCBhcyB3ZWxsIGFzIG1vbnRoIHZpZXcuIFJlbmRlcnMgb25lIG9yIG1vcmUgcm93cyBvZiBkYXkgY2VsbHMuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8vIEl0IGlzIGEgbWFuYWdlciBmb3IgYSBUYWJsZSBzdWJjb21wb25lbnQsIHdoaWNoIGRvZXMgbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZy5cbi8vIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB3aWR0aC9oZWlnaHQuXG5jbGFzcyBUYWJsZVZpZXcgZXh0ZW5kcyBpbnRlcm5hbF9janMuRGF0ZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuaGVhZGVyRWxSZWYgPSBwcmVhY3RfY2pzLmNyZWF0ZVJlZigpO1xuICAgIH1cbiAgICByZW5kZXJTaW1wbGVMYXlvdXQoaGVhZGVyUm93Q29udGVudCwgYm9keUNvbnRlbnQpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGxldCBzZWN0aW9ucyA9IFtdO1xuICAgICAgICBsZXQgc3RpY2t5SGVhZGVyRGF0ZXMgPSBpbnRlcm5hbF9janMuZ2V0U3RpY2t5SGVhZGVyRGF0ZXMoY29udGV4dC5vcHRpb25zKTtcbiAgICAgICAgaWYgKGhlYWRlclJvd0NvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHN0aWNreUhlYWRlckRhdGVzLFxuICAgICAgICAgICAgICAgIGNodW5rOiB7XG4gICAgICAgICAgICAgICAgICAgIGVsUmVmOiB0aGlzLmhlYWRlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZUNsYXNzTmFtZTogJ2ZjLWNvbC1oZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICByb3dDb250ZW50OiBoZWFkZXJSb3dDb250ZW50LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgIGtleTogJ2JvZHknLFxuICAgICAgICAgICAgbGlxdWlkOiB0cnVlLFxuICAgICAgICAgICAgY2h1bms6IHsgY29udGVudDogYm9keUNvbnRlbnQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5WaWV3Q29udGFpbmVyLCB7IGVsQ2xhc3NlczogWydmYy1kYXlncmlkJ10sIHZpZXdTcGVjOiBjb250ZXh0LnZpZXdTcGVjIH0sXG4gICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxfY2pzLlNpbXBsZVNjcm9sbEdyaWQsIHsgbGlxdWlkOiAhcHJvcHMuaXNIZWlnaHRBdXRvICYmICFwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogcHJvcHMuZm9yUHJpbnQsIGNvbHM6IFtdIC8qIFRPRE86IG1ha2Ugb3B0aW9uYWw/ICovLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTtcbiAgICB9XG4gICAgcmVuZGVySFNjcm9sbExheW91dChoZWFkZXJSb3dDb250ZW50LCBib2R5Q29udGVudCwgY29sQ250LCBkYXlNaW5XaWR0aCkge1xuICAgICAgICBsZXQgU2Nyb2xsR3JpZCA9IHRoaXMuY29udGV4dC5wbHVnaW5Ib29rcy5zY3JvbGxHcmlkSW1wbDtcbiAgICAgICAgaWYgKCFTY3JvbGxHcmlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFNjcm9sbEdyaWQgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHN0aWNreUhlYWRlckRhdGVzID0gIXByb3BzLmZvclByaW50ICYmIGludGVybmFsX2Nqcy5nZXRTdGlja3lIZWFkZXJEYXRlcyhjb250ZXh0Lm9wdGlvbnMpO1xuICAgICAgICBsZXQgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gIXByb3BzLmZvclByaW50ICYmIGludGVybmFsX2Nqcy5nZXRTdGlja3lGb290ZXJTY3JvbGxiYXIoY29udGV4dC5vcHRpb25zKTtcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGlmIChoZWFkZXJSb3dDb250ZW50KSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiBzdGlja3lIZWFkZXJEYXRlcyxcbiAgICAgICAgICAgICAgICBjaHVua3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsUmVmOiB0aGlzLmhlYWRlckVsUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDbGFzc05hbWU6ICdmYy1jb2wtaGVhZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGhlYWRlclJvd0NvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnYm9keScsXG4gICAgICAgICAgICBrZXk6ICdib2R5JyxcbiAgICAgICAgICAgIGxpcXVpZDogdHJ1ZSxcbiAgICAgICAgICAgIGNodW5rczogW3tcbiAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGJvZHlDb250ZW50LFxuICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0aWNreUZvb3RlclNjcm9sbGJhcikge1xuICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Zvb3RlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnZm9vdGVyJyxcbiAgICAgICAgICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjaHVua3M6IFt7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGludGVybmFsX2Nqcy5yZW5kZXJTY3JvbGxTaGltLFxuICAgICAgICAgICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5WaWV3Q29udGFpbmVyLCB7IGVsQ2xhc3NlczogWydmYy1kYXlncmlkJ10sIHZpZXdTcGVjOiBjb250ZXh0LnZpZXdTcGVjIH0sXG4gICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoU2Nyb2xsR3JpZCwgeyBsaXF1aWQ6ICFwcm9wcy5pc0hlaWdodEF1dG8gJiYgIXByb3BzLmZvclByaW50LCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQsIGNvbGxhcHNpYmxlV2lkdGg6IHByb3BzLmZvclByaW50LCBjb2xHcm91cHM6IFt7IGNvbHM6IFt7IHNwYW46IGNvbENudCwgbWluV2lkdGg6IGRheU1pbldpZHRoIH1dIH1dLCBzZWN0aW9uczogc2VjdGlvbnMgfSkpKTtcbiAgICB9XG59XG5cbmNsYXNzIERheVRhYmxlVmlldyBleHRlbmRzIFRhYmxlVmlldyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYnVpbGREYXlUYWJsZU1vZGVsID0gaW50ZXJuYWxfY2pzLm1lbW9pemUoYnVpbGREYXlUYWJsZU1vZGVsKTtcbiAgICAgICAgdGhpcy5oZWFkZXJSZWYgPSBwcmVhY3RfY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLnRhYmxlUmVmID0gcHJlYWN0X2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgLy8gY2FuJ3Qgb3ZlcnJpZGUgYW55IGxpZmVjeWNsZSBtZXRob2RzIGZyb20gcGFyZW50XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgb3B0aW9ucywgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkYXlUYWJsZU1vZGVsID0gdGhpcy5idWlsZERheVRhYmxlTW9kZWwocHJvcHMuZGF0ZVByb2ZpbGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgbGV0IGhlYWRlckNvbnRlbnQgPSBvcHRpb25zLmRheUhlYWRlcnMgJiYgKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuRGF5SGVhZGVyLCB7IHJlZjogdGhpcy5oZWFkZXJSZWYsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZGF0ZXM6IGRheVRhYmxlTW9kZWwuaGVhZGVyRGF0ZXMsIGRhdGVzUmVwRGlzdGluY3REYXlzOiBkYXlUYWJsZU1vZGVsLnJvd0NudCA9PT0gMSB9KSk7XG4gICAgICAgIGxldCBib2R5Q29udGVudCA9IChjb250ZW50QXJnKSA9PiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KERheVRhYmxlLCB7IHJlZjogdGhpcy50YWJsZVJlZiwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCBkYXlUYWJsZU1vZGVsOiBkYXlUYWJsZU1vZGVsLCBidXNpbmVzc0hvdXJzOiBwcm9wcy5idXNpbmVzc0hvdXJzLCBkYXRlU2VsZWN0aW9uOiBwcm9wcy5kYXRlU2VsZWN0aW9uLCBldmVudFN0b3JlOiBwcm9wcy5ldmVudFN0b3JlLCBldmVudFVpQmFzZXM6IHByb3BzLmV2ZW50VWlCYXNlcywgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCBuZXh0RGF5VGhyZXNob2xkOiBvcHRpb25zLm5leHREYXlUaHJlc2hvbGQsIGNvbEdyb3VwTm9kZTogY29udGVudEFyZy50YWJsZUNvbEdyb3VwTm9kZSwgdGFibGVNaW5XaWR0aDogY29udGVudEFyZy50YWJsZU1pbldpZHRoLCBkYXlNYXhFdmVudHM6IG9wdGlvbnMuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3M6IG9wdGlvbnMuZGF5TWF4RXZlbnRSb3dzLCBzaG93V2Vla051bWJlcnM6IG9wdGlvbnMud2Vla051bWJlcnMsIGV4cGFuZFJvd3M6ICFwcm9wcy5pc0hlaWdodEF1dG8sIGhlYWRlckFsaWduRWxSZWY6IHRoaXMuaGVhZGVyRWxSZWYsIGNsaWVudFdpZHRoOiBjb250ZW50QXJnLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQ6IGNvbnRlbnRBcmcuY2xpZW50SGVpZ2h0LCBmb3JQcmludDogcHJvcHMuZm9yUHJpbnQgfSkpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5kYXlNaW5XaWR0aFxuICAgICAgICAgICAgPyB0aGlzLnJlbmRlckhTY3JvbGxMYXlvdXQoaGVhZGVyQ29udGVudCwgYm9keUNvbnRlbnQsIGRheVRhYmxlTW9kZWwuY29sQ250LCBvcHRpb25zLmRheU1pbldpZHRoKVxuICAgICAgICAgICAgOiB0aGlzLnJlbmRlclNpbXBsZUxheW91dChoZWFkZXJDb250ZW50LCBib2R5Q29udGVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGREYXlUYWJsZU1vZGVsKGRhdGVQcm9maWxlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgIGxldCBkYXlTZXJpZXMgPSBuZXcgaW50ZXJuYWxfY2pzLkRheVNlcmllc01vZGVsKGRhdGVQcm9maWxlLnJlbmRlclJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgcmV0dXJuIG5ldyBpbnRlcm5hbF9janMuRGF5VGFibGVNb2RlbChkYXlTZXJpZXMsIC95ZWFyfG1vbnRofHdlZWsvLnRlc3QoZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCkpO1xufVxuXG5leHBvcnRzLkRheUdyaWRWaWV3ID0gRGF5VGFibGVWaWV3O1xuZXhwb3J0cy5EYXlUYWJsZSA9IERheVRhYmxlO1xuZXhwb3J0cy5EYXlUYWJsZVNsaWNlciA9IERheVRhYmxlU2xpY2VyO1xuZXhwb3J0cy5UYWJsZSA9IFRhYmxlO1xuZXhwb3J0cy5UYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yID0gVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvcjtcbmV4cG9ydHMuVGFibGVSb3dzID0gVGFibGVSb3dzO1xuZXhwb3J0cy5UYWJsZVZpZXcgPSBUYWJsZVZpZXc7XG5leHBvcnRzLmJ1aWxkRGF5VGFibGVNb2RlbCA9IGJ1aWxkRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuYnVpbGREYXlUYWJsZVJlbmRlclJhbmdlID0gYnVpbGREYXlUYWJsZVJlbmRlclJhbmdlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgaW5kZXhfY2pzID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL2luZGV4LmNqcycpO1xudmFyIGludGVybmFsX2NqcyA9IHJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9pbnRlcm5hbC5janMnKTtcblxuaW50ZXJuYWxfY2pzLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCA9IDUwMDtcbmxldCBpZ25vcmVNb3VzZURlcHRoID0gMDtcbmxldCBsaXN0ZW5lckNudCA9IDA7XG5sZXQgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbi8qXG5Vc2VzIGEgXCJwb2ludGVyXCIgYWJzdHJhY3Rpb24sIHdoaWNoIG1vbml0b3JzIFVJIGV2ZW50cyBmb3IgYm90aCBtb3VzZSBhbmQgdG91Y2guXG5UcmFja3Mgd2hlbiB0aGUgcG9pbnRlciBcImRyYWdzXCIgb24gYSBjZXJ0YWluIGVsZW1lbnQsIG1lYW5pbmcgZG93bittb3ZlK3VwLlxuXG5BbHNvLCB0cmFja3MgaWYgdGhlcmUgd2FzIHRvdWNoLXNjcm9sbGluZy5cbkFsc28sIGNhbiBwcmV2ZW50IHRvdWNoLXNjcm9sbGluZyBmcm9tIGhhcHBlbmluZy5cbkFsc28sIGNhbiBmaXJlIHBvaW50ZXJtb3ZlIGV2ZW50cyB3aGVuIHNjcm9sbGluZyBoYXBwZW5zIHVuZGVybmVhdGgsIGV2ZW4gd2hlbiBubyByZWFsIHBvaW50ZXIgbW92ZW1lbnQuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBwb2ludGVybW92ZVxuLSBwb2ludGVydXBcbiovXG5jbGFzcyBQb2ludGVyRHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgLy8gb3B0aW9ucyB0aGF0IGNhbiBiZSBkaXJlY3RseSBhc3NpZ25lZCBieSBjYWxsZXJcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9ICcnOyAvLyB3aWxsIGNhdXNlIHN1YmplY3RFbCBpbiBhbGwgZW1pdHRlZCBldmVudHMgdG8gYmUgdGhpcyBlbGVtZW50XG4gICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0b3IgPSAnJztcbiAgICAgICAgdGhpcy5zaG91bGRJZ25vcmVNb3ZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvdWxkV2F0Y2hTY3JvbGwgPSB0cnVlOyAvLyBmb3Igc2ltdWxhdGluZyBwb2ludGVybW92ZSBvbiBzY3JvbGxcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVzXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzVG91Y2hEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhc1RvdWNoU2Nyb2xsID0gZmFsc2U7XG4gICAgICAgIC8vIE1vdXNlXG4gICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZURvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRJZ25vcmVNb3VzZSgpICYmXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpICYmXG4gICAgICAgICAgICAgICAgdGhpcy50cnlTdGFydChldikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGV2ID0gdGhpcy5jcmVhdGVFdmVudEZyb21Nb3VzZShldiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJkb3duJywgcGV2KTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTY3JvbGxXYXRjaChwZXYpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgcGV2ID0gdGhpcy5jcmVhdGVFdmVudEZyb21Nb3VzZShldik7XG4gICAgICAgICAgICB0aGlzLnJlY29yZENvb3JkcyhwZXYpO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywgcGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZVVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVydXAnLCB0aGlzLmNyZWF0ZUV2ZW50RnJvbU1vdXNlKGV2KSk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXAoKTsgLy8gY2FsbCBsYXN0IHNvIHRoYXQgcG9pbnRlcnVwIGhhcyBhY2Nlc3MgdG8gcHJvcHNcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVG91Y2hcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoU3RhcnQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyeVN0YXJ0KGV2KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNUb3VjaERyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgcGV2ID0gdGhpcy5jcmVhdGVFdmVudEZyb21Ub3VjaChldiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJkb3duJywgcGV2KTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTY3JvbGxXYXRjaChwZXYpO1xuICAgICAgICAgICAgICAgIC8vIHVubGlrZSBtb3VzZSwgbmVlZCB0byBhdHRhY2ggdG8gdGFyZ2V0LCBub3QgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDU3NjAwMTRcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RWwgPSBldi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaEVuZCk7IC8vIHRyZWF0IGl0IGFzIGEgdG91Y2ggZW5kXG4gICAgICAgICAgICAgICAgLy8gYXR0YWNoIGEgaGFuZGxlciB0byBnZXQgY2FsbGVkIHdoZW4gQU5ZIHNjcm9sbCBhY3Rpb24gaGFwcGVucyBvbiB0aGUgcGFnZS5cbiAgICAgICAgICAgICAgICAvLyB0aGlzIHdhcyBpbXBvc3NpYmxlIHRvIGRvIHdpdGggbm9ybWFsIG9uL29mZiBiZWNhdXNlICdzY3JvbGwnIGRvZXNuJ3QgYnViYmxlLlxuICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMyOTU0NTY1Lzk2MzQyXG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlVG91Y2hTY3JvbGwsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoTW92ZSA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IHBldiA9IHRoaXMuY3JlYXRlRXZlbnRGcm9tVG91Y2goZXYpO1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb29yZHMocGV2KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIHBldik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hFbmQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHsgLy8gZG9uZSB0byBndWFyZCBhZ2FpbnN0IHRvdWNoZW5kIGZvbGxvd2VkIGJ5IHRvdWNoY2FuY2VsXG4gICAgICAgICAgICAgICAgbGV0IHRhcmdldEVsID0gZXYudGFyZ2V0O1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICAgICAgICB0YXJnZXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuaGFuZGxlVG91Y2hFbmQpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5oYW5kbGVUb3VjaEVuZCk7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlVG91Y2hTY3JvbGwsIHRydWUpOyAvLyB1c2VDYXB0dXJlZD10cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuY3JlYXRlRXZlbnRGcm9tVG91Y2goZXYpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFudXAoKTsgLy8gY2FsbCBsYXN0IHNvIHRoYXQgcG9pbnRlcnVwIGhhcyBhY2Nlc3MgdG8gcHJvcHNcbiAgICAgICAgICAgICAgICB0aGlzLmlzVG91Y2hEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdNb3VzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVRvdWNoU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53YXNUb3VjaFNjcm9sbCA9IHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIGxldCBwYWdlWCA9ICh3aW5kb3cucGFnZVhPZmZzZXQgLSB0aGlzLnByZXZTY3JvbGxYKSArIHRoaXMucHJldlBhZ2VYO1xuICAgICAgICAgICAgICAgIGxldCBwYWdlWSA9ICh3aW5kb3cucGFnZVlPZmZzZXQgLSB0aGlzLnByZXZTY3JvbGxZKSArIHRoaXMucHJldlBhZ2VZO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVybW92ZScsIHtcbiAgICAgICAgICAgICAgICAgICAgb3JpZ0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICAgICAgaXNUb3VjaDogdGhpcy5pc1RvdWNoRHJhZ2dpbmcsXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3RFbDogdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VYLFxuICAgICAgICAgICAgICAgICAgICBwYWdlWSxcbiAgICAgICAgICAgICAgICAgICAgZGVsdGFYOiBwYWdlWCAtIHRoaXMub3JpZ1BhZ2VYLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVk6IHBhZ2VZIC0gdGhpcy5vcmlnUGFnZVksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBjb250YWluZXJFbDtcbiAgICAgICAgdGhpcy5lbWl0dGVyID0gbmV3IGludGVybmFsX2Nqcy5FbWl0dGVyKCk7XG4gICAgICAgIGNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICBsaXN0ZW5lckNyZWF0ZWQoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuICAgICAgICBsaXN0ZW5lckRlc3Ryb3llZCgpO1xuICAgIH1cbiAgICB0cnlTdGFydChldikge1xuICAgICAgICBsZXQgc3ViamVjdEVsID0gdGhpcy5xdWVyeVN1YmplY3RFbChldik7XG4gICAgICAgIGxldCBkb3duRWwgPSBldi50YXJnZXQ7XG4gICAgICAgIGlmIChzdWJqZWN0RWwgJiZcbiAgICAgICAgICAgICghdGhpcy5oYW5kbGVTZWxlY3RvciB8fCBpbnRlcm5hbF9janMuZWxlbWVudENsb3Nlc3QoZG93bkVsLCB0aGlzLmhhbmRsZVNlbGVjdG9yKSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEVsID0gc3ViamVjdEVsO1xuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTsgLy8gZG8gdGhpcyBmaXJzdCBzbyBjYW5jZWxUb3VjaFNjcm9sbCB3aWxsIHdvcmtcbiAgICAgICAgICAgIHRoaXMud2FzVG91Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2xlYW51cCgpIHtcbiAgICAgICAgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3ViamVjdEVsID0gbnVsbDtcbiAgICAgICAgLy8ga2VlcCB3YXNUb3VjaFNjcm9sbCBhcm91bmQgZm9yIGxhdGVyIGFjY2Vzc1xuICAgICAgICB0aGlzLmRlc3Ryb3lTY3JvbGxXYXRjaCgpO1xuICAgIH1cbiAgICBxdWVyeVN1YmplY3RFbChldikge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChldi50YXJnZXQsIHRoaXMuc2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lckVsO1xuICAgIH1cbiAgICBzaG91bGRJZ25vcmVNb3VzZSgpIHtcbiAgICAgICAgcmV0dXJuIGlnbm9yZU1vdXNlRGVwdGggfHwgdGhpcy5pc1RvdWNoRHJhZ2dpbmc7XG4gICAgfVxuICAgIC8vIGNhbiBiZSBjYWxsZWQgYnkgdXNlciBvZiB0aGlzIGNsYXNzLCB0byBjYW5jZWwgdG91Y2gtYmFzZWQgc2Nyb2xsaW5nIGZvciB0aGUgY3VycmVudCBkcmFnXG4gICAgY2FuY2VsVG91Y2hTY3JvbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgIGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTY3JvbGxpbmcgdGhhdCBzaW11bGF0ZXMgcG9pbnRlcm1vdmVzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGluaXRTY3JvbGxXYXRjaChldikge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXYXRjaFNjcm9sbCkge1xuICAgICAgICAgICAgdGhpcy5yZWNvcmRDb29yZHMoZXYpO1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZT10cnVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVjb3JkQ29vcmRzKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFdhdGNoU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZQYWdlWCA9IGV2LnBhZ2VYO1xuICAgICAgICAgICAgdGhpcy5wcmV2UGFnZVkgPSBldi5wYWdlWTtcbiAgICAgICAgICAgIHRoaXMucHJldlNjcm9sbFggPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICB0aGlzLnByZXZTY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3lTY3JvbGxXYXRjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkV2F0Y2hTY3JvbGwpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBFdmVudCBOb3JtYWxpemF0aW9uXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNyZWF0ZUV2ZW50RnJvbU1vdXNlKGV2LCBpc0ZpcnN0KSB7XG4gICAgICAgIGxldCBkZWx0YVggPSAwO1xuICAgICAgICBsZXQgZGVsdGFZID0gMDtcbiAgICAgICAgLy8gVE9ETzogcmVwZWF0IGNvZGVcbiAgICAgICAgaWYgKGlzRmlyc3QpIHtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VYID0gZXYucGFnZVg7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWSA9IGV2LnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsdGFYID0gZXYucGFnZVggLSB0aGlzLm9yaWdQYWdlWDtcbiAgICAgICAgICAgIGRlbHRhWSA9IGV2LnBhZ2VZIC0gdGhpcy5vcmlnUGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yaWdFdmVudDogZXYsXG4gICAgICAgICAgICBpc1RvdWNoOiBmYWxzZSxcbiAgICAgICAgICAgIHN1YmplY3RFbDogdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICBwYWdlWDogZXYucGFnZVgsXG4gICAgICAgICAgICBwYWdlWTogZXYucGFnZVksXG4gICAgICAgICAgICBkZWx0YVgsXG4gICAgICAgICAgICBkZWx0YVksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2LCBpc0ZpcnN0KSB7XG4gICAgICAgIGxldCB0b3VjaGVzID0gZXYudG91Y2hlcztcbiAgICAgICAgbGV0IHBhZ2VYO1xuICAgICAgICBsZXQgcGFnZVk7XG4gICAgICAgIGxldCBkZWx0YVggPSAwO1xuICAgICAgICBsZXQgZGVsdGFZID0gMDtcbiAgICAgICAgLy8gaWYgdG91Y2ggY29vcmRzIGF2YWlsYWJsZSwgcHJlZmVyLFxuICAgICAgICAvLyBiZWNhdXNlIEZGIHdvdWxkIGdpdmUgYmFkIGV2LnBhZ2VYIGV2LnBhZ2VZXG4gICAgICAgIGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYWdlWCA9IHRvdWNoZXNbMF0ucGFnZVg7XG4gICAgICAgICAgICBwYWdlWSA9IHRvdWNoZXNbMF0ucGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwYWdlWCA9IGV2LnBhZ2VYO1xuICAgICAgICAgICAgcGFnZVkgPSBldi5wYWdlWTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiByZXBlYXQgY29kZVxuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgICAgdGhpcy5vcmlnUGFnZVggPSBwYWdlWDtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VZID0gcGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWx0YVggPSBwYWdlWCAtIHRoaXMub3JpZ1BhZ2VYO1xuICAgICAgICAgICAgZGVsdGFZID0gcGFnZVkgLSB0aGlzLm9yaWdQYWdlWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ0V2ZW50OiBldixcbiAgICAgICAgICAgIGlzVG91Y2g6IHRydWUsXG4gICAgICAgICAgICBzdWJqZWN0RWw6IHRoaXMuc3ViamVjdEVsLFxuICAgICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgICBwYWdlWSxcbiAgICAgICAgICAgIGRlbHRhWCxcbiAgICAgICAgICAgIGRlbHRhWSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyBSZXR1cm5zIGEgYm9vbGVhbiB3aGV0aGVyIHRoaXMgd2FzIGEgbGVmdCBtb3VzZSBjbGljayBhbmQgbm8gY3RybCBrZXkgKHdoaWNoIG1lYW5zIHJpZ2h0IGNsaWNrIG9uIE1hYylcbmZ1bmN0aW9uIGlzUHJpbWFyeU1vdXNlQnV0dG9uKGV2KSB7XG4gICAgcmV0dXJuIGV2LmJ1dHRvbiA9PT0gMCAmJiAhZXYuY3RybEtleTtcbn1cbi8vIElnbm9yaW5nIGZha2UgbW91c2UgZXZlbnRzIGdlbmVyYXRlZCBieSB0b3VjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gc3RhcnRJZ25vcmluZ01vdXNlKCkge1xuICAgIGlnbm9yZU1vdXNlRGVwdGggKz0gMTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWdub3JlTW91c2VEZXB0aCAtPSAxO1xuICAgIH0sIGludGVybmFsX2Nqcy5jb25maWcudG91Y2hNb3VzZUlnbm9yZVdhaXQpO1xufVxuLy8gV2Ugd2FudCB0byBhdHRhY2ggdG91Y2htb3ZlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciBTYWZhcmlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGxpc3RlbmVyQ3JlYXRlZCgpIHtcbiAgICBsaXN0ZW5lckNudCArPSAxO1xuICAgIGlmIChsaXN0ZW5lckNudCA9PT0gMSkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25XaW5kb3dUb3VjaE1vdmUsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gbGlzdGVuZXJEZXN0cm95ZWQoKSB7XG4gICAgbGlzdGVuZXJDbnQgLT0gMTtcbiAgICBpZiAoIWxpc3RlbmVyQ250KSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbldpbmRvd1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBvbldpbmRvd1RvdWNoTW92ZShldikge1xuICAgIGlmIChpc1dpbmRvd1RvdWNoTW92ZUNhbmNlbGxlZCkge1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cblxuLypcbkFuIGVmZmVjdCBpbiB3aGljaCBhbiBlbGVtZW50IGZvbGxvd3MgdGhlIG1vdmVtZW50IG9mIGEgcG9pbnRlciBhY3Jvc3MgdGhlIHNjcmVlbi5cblRoZSBtb3ZpbmcgZWxlbWVudCBpcyBhIGNsb25lIG9mIHNvbWUgb3RoZXIgZWxlbWVudC5cbk11c3QgY2FsbCBzdGFydCArIGhhbmRsZU1vdmUgKyBzdG9wLlxuKi9cbmNsYXNzIEVsZW1lbnRNaXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlOyAvLyBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZFxuICAgICAgICB0aGlzLnNvdXJjZUVsID0gbnVsbDtcbiAgICAgICAgdGhpcy5taXJyb3JFbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlRWxSZWN0ID0gbnVsbDsgLy8gc2NyZWVuIGNvb3JkcyByZWxhdGl2ZSB0byB2aWV3cG9ydFxuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBkaXJlY3RseSBieSBjYWxsZXJcbiAgICAgICAgdGhpcy5wYXJlbnROb2RlID0gZG9jdW1lbnQuYm9keTsgLy8gSElHSExZIFNVR0dFU1RFRCB0byBzZXQgdGhpcyB0byBzaWRlc3RlcCBTaGFkb3dET00gaXNzdWVzXG4gICAgICAgIHRoaXMuekluZGV4ID0gOTk5OTtcbiAgICAgICAgdGhpcy5yZXZlcnREdXJhdGlvbiA9IDA7XG4gICAgfVxuICAgIHN0YXJ0KHNvdXJjZUVsLCBwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VFbCA9IHNvdXJjZUVsO1xuICAgICAgICB0aGlzLnNvdXJjZUVsUmVjdCA9IHRoaXMuc291cmNlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMub3JpZ1NjcmVlblggPSBwYWdlWCAtIHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICAgICAgdGhpcy5vcmlnU2NyZWVuWSA9IHBhZ2VZIC0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICB0aGlzLmRlbHRhWCA9IDA7XG4gICAgICAgIHRoaXMuZGVsdGFZID0gMDtcbiAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7XG4gICAgfVxuICAgIGhhbmRsZU1vdmUocGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIHRoaXMuZGVsdGFYID0gKHBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0KSAtIHRoaXMub3JpZ1NjcmVlblg7XG4gICAgICAgIHRoaXMuZGVsdGFZID0gKHBhZ2VZIC0gd2luZG93LnBhZ2VZT2Zmc2V0KSAtIHRoaXMub3JpZ1NjcmVlblk7XG4gICAgICAgIHRoaXMudXBkYXRlRWxQb3NpdGlvbigpO1xuICAgIH1cbiAgICAvLyBjYW4gYmUgY2FsbGVkIGJlZm9yZSBzdGFydFxuICAgIHNldElzVmlzaWJsZShib29sKSB7XG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlID0gYm9vbDsgLy8gbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSB1cGRhdGVFbFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7IC8vIGJlY2F1c2Ugd2FzIG5vdCB1cGRhdGluZyB0aGUgcG9zaXRpb24gd2hpbGUgaW52aXNpYmxlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1pcnJvckVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBib29sO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFsd2F5cyBhc3luY1xuICAgIHN0b3AobmVlZHNSZXZlcnRBbmltYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgICAgIGxldCBkb25lID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAobmVlZHNSZXZlcnRBbmltYXRpb24gJiZcbiAgICAgICAgICAgIHRoaXMubWlycm9yRWwgJiZcbiAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlICYmXG4gICAgICAgICAgICB0aGlzLnJldmVydER1cmF0aW9uICYmIC8vIGlmIDAsIHRyYW5zaXRpb24gd29uJ3Qgd29ya1xuICAgICAgICAgICAgKHRoaXMuZGVsdGFYIHx8IHRoaXMuZGVsdGFZKSAvLyBpZiBzYW1lIGNvb3JkcywgdHJhbnNpdGlvbiB3b24ndCB3b3JrXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kb1JldmVydEFuaW1hdGlvbihkb25lLCB0aGlzLnJldmVydER1cmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9uZSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZG9SZXZlcnRBbmltYXRpb24oY2FsbGJhY2ssIHJldmVydER1cmF0aW9uKSB7XG4gICAgICAgIGxldCBtaXJyb3JFbCA9IHRoaXMubWlycm9yRWw7XG4gICAgICAgIGxldCBmaW5hbFNvdXJjZUVsUmVjdCA9IHRoaXMuc291cmNlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIGJlY2F1c2UgYXV0b3Njcm9sbGluZyBtaWdodCBoYXZlIGhhcHBlbmVkXG4gICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPVxuICAgICAgICAgICAgJ3RvcCAnICsgcmV2ZXJ0RHVyYXRpb24gKyAnbXMsJyArXG4gICAgICAgICAgICAgICAgJ2xlZnQgJyArIHJldmVydER1cmF0aW9uICsgJ21zJztcbiAgICAgICAgaW50ZXJuYWxfY2pzLmFwcGx5U3R5bGUobWlycm9yRWwsIHtcbiAgICAgICAgICAgIGxlZnQ6IGZpbmFsU291cmNlRWxSZWN0LmxlZnQsXG4gICAgICAgICAgICB0b3A6IGZpbmFsU291cmNlRWxSZWN0LnRvcCxcbiAgICAgICAgfSk7XG4gICAgICAgIGludGVybmFsX2Nqcy53aGVuVHJhbnNpdGlvbkRvbmUobWlycm9yRWwsICgpID0+IHtcbiAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnRyYW5zaXRpb24gPSAnJztcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICBpZiAodGhpcy5taXJyb3JFbCkge1xuICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnJlbW92ZUVsZW1lbnQodGhpcy5taXJyb3JFbCk7XG4gICAgICAgICAgICB0aGlzLm1pcnJvckVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNvdXJjZUVsID0gbnVsbDtcbiAgICB9XG4gICAgdXBkYXRlRWxQb3NpdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuc291cmNlRWwgJiYgdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGludGVybmFsX2Nqcy5hcHBseVN0eWxlKHRoaXMuZ2V0TWlycm9yRWwoKSwge1xuICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMuc291cmNlRWxSZWN0LmxlZnQgKyB0aGlzLmRlbHRhWCxcbiAgICAgICAgICAgICAgICB0b3A6IHRoaXMuc291cmNlRWxSZWN0LnRvcCArIHRoaXMuZGVsdGFZLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0TWlycm9yRWwoKSB7XG4gICAgICAgIGxldCBzb3VyY2VFbFJlY3QgPSB0aGlzLnNvdXJjZUVsUmVjdDtcbiAgICAgICAgbGV0IG1pcnJvckVsID0gdGhpcy5taXJyb3JFbDtcbiAgICAgICAgaWYgKCFtaXJyb3JFbCkge1xuICAgICAgICAgICAgbWlycm9yRWwgPSB0aGlzLm1pcnJvckVsID0gdGhpcy5zb3VyY2VFbC5jbG9uZU5vZGUodHJ1ZSk7IC8vIGNsb25lQ2hpbGRyZW49dHJ1ZVxuICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBsb25nIHRhcHMgb3IgYW55IG1vdXNlIGludGVyYWN0aW9uIGNhdXNpbmcgc2VsZWN0aW9uL21lbnVzLlxuICAgICAgICAgICAgLy8gd291bGQgdXNlIHByZXZlbnRTZWxlY3Rpb24oKSwgYnV0IHRoYXQgcHJldmVudHMgc2VsZWN0c3RhcnQsIGNhdXNpbmcgcHJvYmxlbXMuXG4gICAgICAgICAgICBtaXJyb3JFbC5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgICAgICAgICAgbWlycm9yRWwuY2xhc3NMaXN0LmFkZCgnZmMtZXZlbnQtZHJhZ2dpbmcnKTtcbiAgICAgICAgICAgIGludGVybmFsX2Nqcy5hcHBseVN0eWxlKG1pcnJvckVsLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgekluZGV4OiB0aGlzLnpJbmRleCxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAnJyxcbiAgICAgICAgICAgICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICAgICAgICAgICB3aWR0aDogc291cmNlRWxSZWN0LnJpZ2h0IC0gc291cmNlRWxSZWN0LmxlZnQsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBzb3VyY2VFbFJlY3QuYm90dG9tIC0gc291cmNlRWxSZWN0LnRvcCxcbiAgICAgICAgICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG1pcnJvckVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlycm9yRWw7XG4gICAgfVxufVxuXG4vKlxuSXMgYSBjYWNoZSBmb3IgYSBnaXZlbiBlbGVtZW50J3Mgc2Nyb2xsIGluZm9ybWF0aW9uIChhbGwgdGhlIGluZm8gdGhhdCBTY3JvbGxDb250cm9sbGVyIHN0b3JlcylcbmluIGFkZGl0aW9uIHRoZSBcImNsaWVudCByZWN0YW5nbGVcIiBvZiB0aGUgZWxlbWVudC4uIHRoZSBhcmVhIHdpdGhpbiB0aGUgc2Nyb2xsYmFycy5cblxuVGhlIGNhY2hlIGNhbiBiZSBpbiBvbmUgb2YgdHdvIG1vZGVzOlxuLSBkb2VzTGlzdGVuaW5nOmZhbHNlIC0gaWdub3JlcyB3aGVuIHRoZSBjb250YWluZXIgaXMgc2Nyb2xsZWQgYnkgc29tZW9uZSBlbHNlXG4tIGRvZXNMaXN0ZW5pbmc6dHJ1ZSAtIHdhdGNoIGZvciBzY3JvbGxpbmcgYW5kIHVwZGF0ZSB0aGUgY2FjaGVcbiovXG5jbGFzcyBTY3JvbGxHZW9tQ2FjaGUgZXh0ZW5kcyBpbnRlcm5hbF9janMuU2Nyb2xsQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3Ioc2Nyb2xsQ29udHJvbGxlciwgZG9lc0xpc3RlbmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFRvcCgpO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQ2hhbmdlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udHJvbGxlciA9IHNjcm9sbENvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuZG9lc0xpc3RlbmluZyA9IGRvZXNMaXN0ZW5pbmc7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5vcmlnU2Nyb2xsVG9wID0gc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy5vcmlnU2Nyb2xsTGVmdCA9IHNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsTGVmdCgpO1xuICAgICAgICB0aGlzLnNjcm9sbFdpZHRoID0gc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxXaWR0aCgpO1xuICAgICAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIHRoaXMuY2xpZW50V2lkdGggPSBzY3JvbGxDb250cm9sbGVyLmdldENsaWVudFdpZHRoKCk7XG4gICAgICAgIHRoaXMuY2xpZW50SGVpZ2h0ID0gc2Nyb2xsQ29udHJvbGxlci5nZXRDbGllbnRIZWlnaHQoKTtcbiAgICAgICAgdGhpcy5jbGllbnRSZWN0ID0gdGhpcy5jb21wdXRlQ2xpZW50UmVjdCgpOyAvLyBkbyBsYXN0IGluIGNhc2UgaXQgbmVlZHMgY2FjaGVkIHZhbHVlc1xuICAgICAgICBpZiAodGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmdldEV2ZW50VGFyZ2V0KCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXZlbnRUYXJnZXQoKS5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb3A7XG4gICAgfVxuICAgIGdldFNjcm9sbExlZnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHNldFNjcm9sbFRvcCh0b3ApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxDb250cm9sbGVyLnNldFNjcm9sbFRvcCh0b3ApO1xuICAgICAgICBpZiAoIXRoaXMuZG9lc0xpc3RlbmluZykge1xuICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCByZWx5aW5nIG9uIHRoZSBlbGVtZW50IHRvIG5vcm1hbGl6ZSBvdXQtb2YtYm91bmRzIHNjcm9sbCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gc2FuaXRpemUgb3Vyc2VsdmVzXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IE1hdGgubWF4KE1hdGgubWluKHRvcCwgdGhpcy5nZXRNYXhTY3JvbGxUb3AoKSksIDApO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRTY3JvbGxMZWZ0KHRvcCkge1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRyb2xsZXIuc2V0U2Nyb2xsTGVmdCh0b3ApO1xuICAgICAgICBpZiAoIXRoaXMuZG9lc0xpc3RlbmluZykge1xuICAgICAgICAgICAgLy8gd2UgYXJlIG5vdCByZWx5aW5nIG9uIHRoZSBlbGVtZW50IHRvIG5vcm1hbGl6ZSBvdXQtb2YtYm91bmRzIHNjcm9sbCB2YWx1ZXNcbiAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gc2FuaXRpemUgb3Vyc2VsdmVzXG4gICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSBNYXRoLm1heChNYXRoLm1pbih0b3AsIHRoaXMuZ2V0TWF4U2Nyb2xsTGVmdCgpKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldENsaWVudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRXaWR0aDtcbiAgICB9XG4gICAgZ2V0Q2xpZW50SGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGdldFNjcm9sbFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxXaWR0aDtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGhhbmRsZVNjcm9sbENoYW5nZSgpIHtcbiAgICB9XG59XG5cbmNsYXNzIEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUgZXh0ZW5kcyBTY3JvbGxHZW9tQ2FjaGUge1xuICAgIGNvbnN0cnVjdG9yKGVsLCBkb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgIHN1cGVyKG5ldyBpbnRlcm5hbF9janMuRWxlbWVudFNjcm9sbENvbnRyb2xsZXIoZWwpLCBkb2VzTGlzdGVuaW5nKTtcbiAgICB9XG4gICAgZ2V0RXZlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbENvbnRyb2xsZXIuZWw7XG4gICAgfVxuICAgIGNvbXB1dGVDbGllbnRSZWN0KCkge1xuICAgICAgICByZXR1cm4gaW50ZXJuYWxfY2pzLmNvbXB1dGVJbm5lclJlY3QodGhpcy5zY3JvbGxDb250cm9sbGVyLmVsKTtcbiAgICB9XG59XG5cbmNsYXNzIFdpbmRvd1Njcm9sbEdlb21DYWNoZSBleHRlbmRzIFNjcm9sbEdlb21DYWNoZSB7XG4gICAgY29uc3RydWN0b3IoZG9lc0xpc3RlbmluZykge1xuICAgICAgICBzdXBlcihuZXcgaW50ZXJuYWxfY2pzLldpbmRvd1Njcm9sbENvbnRyb2xsZXIoKSwgZG9lc0xpc3RlbmluZyk7XG4gICAgfVxuICAgIGdldEV2ZW50VGFyZ2V0KCkge1xuICAgICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgICBjb21wdXRlQ2xpZW50UmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuc2Nyb2xsTGVmdCxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnNjcm9sbExlZnQgKyB0aGlzLmNsaWVudFdpZHRoLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnNjcm9sbFRvcCxcbiAgICAgICAgICAgIGJvdHRvbTogdGhpcy5zY3JvbGxUb3AgKyB0aGlzLmNsaWVudEhlaWdodCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gdGhlIHdpbmRvdyBpcyB0aGUgb25seSBzY3JvbGwgb2JqZWN0IHRoYXQgY2hhbmdlcyBpdCdzIHJlY3RhbmdsZSByZWxhdGl2ZVxuICAgIC8vIHRvIHRoZSBkb2N1bWVudCdzIHRvcGxlZnQgYXMgaXQgc2Nyb2xsc1xuICAgIGhhbmRsZVNjcm9sbENoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5jbGllbnRSZWN0ID0gdGhpcy5jb21wdXRlQ2xpZW50UmVjdCgpO1xuICAgIH1cbn1cblxuLy8gSWYgYXZhaWxhYmxlIHdlIGFyZSB1c2luZyBuYXRpdmUgXCJwZXJmb3JtYW5jZVwiIEFQSSBpbnN0ZWFkIG9mIFwiRGF0ZVwiXG4vLyBSZWFkIG1vcmUgYWJvdXQgaXQgb24gTUROOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1BlcmZvcm1hbmNlXG5jb25zdCBnZXRUaW1lID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnZnVuY3Rpb24nID8gcGVyZm9ybWFuY2Uubm93IDogRGF0ZS5ub3c7XG4vKlxuRm9yIGEgcG9pbnRlciBpbnRlcmFjdGlvbiwgYXV0b21hdGljYWxseSBzY3JvbGxzIGNlcnRhaW4gc2Nyb2xsIGNvbnRhaW5lcnMgd2hlbiB0aGUgcG9pbnRlclxuYXBwcm9hY2hlcyB0aGUgZWRnZS5cblxuVGhlIGNhbGxlciBtdXN0IGNhbGwgc3RhcnQgKyBoYW5kbGVNb3ZlICsgc3RvcC5cbiovXG5jbGFzcyBBdXRvU2Nyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBieSBjYWxsZXJcbiAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjcm9sbFF1ZXJ5ID0gW3dpbmRvdywgJy5mYy1zY3JvbGxlciddO1xuICAgICAgICB0aGlzLmVkZ2VUaHJlc2hvbGQgPSA1MDsgLy8gcGl4ZWxzXG4gICAgICAgIHRoaXMubWF4VmVsb2NpdHkgPSAzMDA7IC8vIHBpeGVscyBwZXIgc2Vjb25kXG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlXG4gICAgICAgIHRoaXMucG9pbnRlclNjcmVlblggPSBudWxsO1xuICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5ZID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IG51bGw7XG4gICAgICAgIC8vIHByb3RlY3QgYWdhaW5zdCB0aGUgaW5pdGlhbCBwb2ludGVyZG93biBiZWluZyB0b28gY2xvc2UgdG8gYW4gZWRnZSBhbmQgc3RhcnRpbmcgdGhlIHNjcm9sbFxuICAgICAgICB0aGlzLmV2ZXJNb3ZlZFVwID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlck1vdmVkRG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZXJNb3ZlZExlZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFuaW1hdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0FuaW1hdGluZykgeyAvLyB3YXNuJ3QgY2FuY2VsbGVkIGJldHdlZW4gYW5pbWF0aW9uIGNhbGxzXG4gICAgICAgICAgICAgICAgbGV0IGVkZ2UgPSB0aGlzLmNvbXB1dGVCZXN0RWRnZSh0aGlzLnBvaW50ZXJTY3JlZW5YICsgd2luZG93LnBhZ2VYT2Zmc2V0LCB0aGlzLnBvaW50ZXJTY3JlZW5ZICsgd2luZG93LnBhZ2VZT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoZWRnZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm93ID0gZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNpZGUoZWRnZSwgKG5vdyAtIHRoaXMubXNTaW5jZVJlcXVlc3QpIC8gMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbihub3cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlOyAvLyB3aWxsIHN0b3AgYW5pbWF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydChwYWdlWCwgcGFnZVksIHNjcm9sbFN0YXJ0RWwpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IHRoaXMuYnVpbGRDYWNoZXMoc2Nyb2xsU3RhcnRFbCk7XG4gICAgICAgICAgICB0aGlzLnBvaW50ZXJTY3JlZW5YID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclNjcmVlblkgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRVcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWREb3duID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZExlZnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkUmlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlTW92ZShwYWdlWCwgcGFnZVkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU1vdmUocGFnZVgsIHBhZ2VZKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgbGV0IHBvaW50ZXJTY3JlZW5YID0gcGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICBsZXQgcG9pbnRlclNjcmVlblkgPSBwYWdlWSAtIHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgICAgIGxldCB5RGVsdGEgPSB0aGlzLnBvaW50ZXJTY3JlZW5ZID09PSBudWxsID8gMCA6IHBvaW50ZXJTY3JlZW5ZIC0gdGhpcy5wb2ludGVyU2NyZWVuWTtcbiAgICAgICAgICAgIGxldCB4RGVsdGEgPSB0aGlzLnBvaW50ZXJTY3JlZW5YID09PSBudWxsID8gMCA6IHBvaW50ZXJTY3JlZW5YIC0gdGhpcy5wb2ludGVyU2NyZWVuWDtcbiAgICAgICAgICAgIGlmICh5RGVsdGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRVcCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh5RGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWREb3duID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh4RGVsdGEgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHhEZWx0YSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZFJpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucG9pbnRlclNjcmVlblggPSBwb2ludGVyU2NyZWVuWDtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclNjcmVlblkgPSBwb2ludGVyU2NyZWVuWTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FuaW1hdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbihnZXRUaW1lKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0b3AoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlOyAvLyB3aWxsIHN0b3AgYW5pbWF0aW9uXG4gICAgICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiB0aGlzLnNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgICAgIHNjcm9sbENhY2hlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2FjaGVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uKG5vdykge1xuICAgICAgICB0aGlzLm1zU2luY2VSZXF1ZXN0ID0gbm93O1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRlKTtcbiAgICB9XG4gICAgaGFuZGxlU2lkZShlZGdlLCBzZWNvbmRzKSB7XG4gICAgICAgIGxldCB7IHNjcm9sbENhY2hlIH0gPSBlZGdlO1xuICAgICAgICBsZXQgeyBlZGdlVGhyZXNob2xkIH0gPSB0aGlzO1xuICAgICAgICBsZXQgaW52RGlzdGFuY2UgPSBlZGdlVGhyZXNob2xkIC0gZWRnZS5kaXN0YW5jZTtcbiAgICAgICAgbGV0IHZlbG9jaXR5ID0gLy8gdGhlIGNsb3NlciB0byB0aGUgZWRnZSwgdGhlIGZhc3RlciB3ZSBzY3JvbGxcbiAgICAgICAgICgoaW52RGlzdGFuY2UgKiBpbnZEaXN0YW5jZSkgLyAoZWRnZVRocmVzaG9sZCAqIGVkZ2VUaHJlc2hvbGQpKSAqIC8vIHF1YWRyYXRpY1xuICAgICAgICAgICAgdGhpcy5tYXhWZWxvY2l0eSAqIHNlY29uZHM7XG4gICAgICAgIGxldCBzaWduID0gMTtcbiAgICAgICAgc3dpdGNoIChlZGdlLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgICAgICAgIHNpZ24gPSAtMTtcbiAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICBzY3JvbGxDYWNoZS5zZXRTY3JvbGxMZWZ0KHNjcm9sbENhY2hlLmdldFNjcm9sbExlZnQoKSArIHZlbG9jaXR5ICogc2lnbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgICAgICAgIHNpZ24gPSAtMTtcbiAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuc2V0U2Nyb2xsVG9wKHNjcm9sbENhY2hlLmdldFNjcm9sbFRvcCgpICsgdmVsb2NpdHkgKiBzaWduKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBsZWZ0L3RvcCBhcmUgcmVsYXRpdmUgdG8gZG9jdW1lbnQgdG9wbGVmdFxuICAgIGNvbXB1dGVCZXN0RWRnZShsZWZ0LCB0b3ApIHtcbiAgICAgICAgbGV0IHsgZWRnZVRocmVzaG9sZCB9ID0gdGhpcztcbiAgICAgICAgbGV0IGJlc3RTaWRlID0gbnVsbDtcbiAgICAgICAgbGV0IHNjcm9sbENhY2hlcyA9IHRoaXMuc2Nyb2xsQ2FjaGVzIHx8IFtdO1xuICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiBzY3JvbGxDYWNoZXMpIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gc2Nyb2xsQ2FjaGUuY2xpZW50UmVjdDtcbiAgICAgICAgICAgIGxldCBsZWZ0RGlzdCA9IGxlZnQgLSByZWN0LmxlZnQ7XG4gICAgICAgICAgICBsZXQgcmlnaHREaXN0ID0gcmVjdC5yaWdodCAtIGxlZnQ7XG4gICAgICAgICAgICBsZXQgdG9wRGlzdCA9IHRvcCAtIHJlY3QudG9wO1xuICAgICAgICAgICAgbGV0IGJvdHRvbURpc3QgPSByZWN0LmJvdHRvbSAtIHRvcDtcbiAgICAgICAgICAgIC8vIGNvbXBsZXRlbHkgd2l0aGluIHRoZSByZWN0P1xuICAgICAgICAgICAgaWYgKGxlZnREaXN0ID49IDAgJiYgcmlnaHREaXN0ID49IDAgJiYgdG9wRGlzdCA+PSAwICYmIGJvdHRvbURpc3QgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0b3BEaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWRVcCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxVcCgpICYmXG4gICAgICAgICAgICAgICAgICAgICghYmVzdFNpZGUgfHwgYmVzdFNpZGUuZGlzdGFuY2UgPiB0b3BEaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0U2lkZSA9IHsgc2Nyb2xsQ2FjaGUsIG5hbWU6ICd0b3AnLCBkaXN0YW5jZTogdG9wRGlzdCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYm90dG9tRGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkRG93biAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxEb3duKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IGJvdHRvbURpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTaWRlID0geyBzY3JvbGxDYWNoZSwgbmFtZTogJ2JvdHRvbScsIGRpc3RhbmNlOiBib3R0b21EaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsZWZ0RGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkTGVmdCAmJiBzY3JvbGxDYWNoZS5jYW5TY3JvbGxMZWZ0KCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IGxlZnREaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0U2lkZSA9IHsgc2Nyb2xsQ2FjaGUsIG5hbWU6ICdsZWZ0JywgZGlzdGFuY2U6IGxlZnREaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyaWdodERpc3QgPD0gZWRnZVRocmVzaG9sZCAmJiB0aGlzLmV2ZXJNb3ZlZFJpZ2h0ICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbFJpZ2h0KCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IHJpZ2h0RGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlLCBuYW1lOiAncmlnaHQnLCBkaXN0YW5jZTogcmlnaHREaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiZXN0U2lkZTtcbiAgICB9XG4gICAgYnVpbGRDYWNoZXMoc2Nyb2xsU3RhcnRFbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNjcm9sbEVscyhzY3JvbGxTdGFydEVsKS5tYXAoKGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWwgPT09IHdpbmRvdykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2luZG93U2Nyb2xsR2VvbUNhY2hlKGZhbHNlKTsgLy8gZmFsc2UgPSBkb24ndCBsaXN0ZW4gdG8gdXNlci1nZW5lcmF0ZWQgc2Nyb2xsc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFbGVtZW50U2Nyb2xsR2VvbUNhY2hlKGVsLCBmYWxzZSk7IC8vIGZhbHNlID0gZG9uJ3QgbGlzdGVuIHRvIHVzZXItZ2VuZXJhdGVkIHNjcm9sbHNcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHF1ZXJ5U2Nyb2xsRWxzKHNjcm9sbFN0YXJ0RWwpIHtcbiAgICAgICAgbGV0IGVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBxdWVyeSBvZiB0aGlzLnNjcm9sbFF1ZXJ5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGVscy5wdXNoKHF1ZXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVscy5wdXNoKC4uLkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHNjcm9sbFN0YXJ0RWwuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbHM7XG4gICAgfVxufVxuXG4vKlxuTW9uaXRvcnMgZHJhZ2dpbmcgb24gYW4gZWxlbWVudC4gSGFzIGEgbnVtYmVyIG9mIGhpZ2gtbGV2ZWwgZmVhdHVyZXM6XG4tIG1pbmltdW0gZGlzdGFuY2UgcmVxdWlyZWQgYmVmb3JlIGRyYWdnaW5nXG4tIG1pbmltdW0gd2FpdCB0aW1lIChcImRlbGF5XCIpIGJlZm9yZSBkcmFnZ2luZ1xuLSBhIG1pcnJvciBlbGVtZW50IHRoYXQgZm9sbG93cyB0aGUgcG9pbnRlclxuKi9cbmNsYXNzIEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcgZXh0ZW5kcyBpbnRlcm5hbF9janMuRWxlbWVudERyYWdnaW5nIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJFbCwgc2VsZWN0b3IpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyRWwpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsID0gY29udGFpbmVyRWw7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgZGlyZWN0bHkgc2V0IGJ5IGNhbGxlclxuICAgICAgICAvLyB0aGUgY2FsbGVyIGNhbiBhbHNvIHNldCB0aGUgUG9pbnRlckRyYWdnaW5nJ3Mgb3B0aW9ucyBhcyB3ZWxsXG4gICAgICAgIHRoaXMuZGVsYXkgPSBudWxsO1xuICAgICAgICB0aGlzLm1pbkRpc3RhbmNlID0gMDtcbiAgICAgICAgdGhpcy50b3VjaFNjcm9sbEFsbG93ZWQgPSB0cnVlOyAvLyBwcmV2ZW50cyBkcmFnIGZyb20gc3RhcnRpbmcgYW5kIGJsb2NrcyBzY3JvbGxpbmcgZHVyaW5nIGRyYWdcbiAgICAgICAgdGhpcy5taXJyb3JOZWVkc1JldmVydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzSW50ZXJhY3RpbmcgPSBmYWxzZTsgLy8gaXMgdGhlIHVzZXIgdmFsaWRseSBtb3ZpbmcgdGhlIHBvaW50ZXI/IGxhc3RzIHVudGlsIHBvaW50ZXJ1cFxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gaXMgaXQgSU5URU5URlVMTFkgZHJhZ2dpbmc/IGxhc3RzIHVudGlsIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgdGhpcy5pc0RlbGF5RW5kZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICB0aGlzLm9uUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSB7IC8vIHNvIG5ldyBkcmFnIGRvZXNuJ3QgaGFwcGVuIHdoaWxlIHJldmVydCBhbmltYXRpb24gaXMgZ29pbmdcbiAgICAgICAgICAgICAgICB0aGlzLmlzSW50ZXJhY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEZWxheUVuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnByZXZlbnRTZWxlY3Rpb24oZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnByZXZlbnRDb250ZXh0TWVudShkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGxpbmtzIGZyb20gYmVpbmcgdmlzaXRlZCBpZiB0aGVyZSdzIGFuIGV2ZW50dWFsIGRyYWcuXG4gICAgICAgICAgICAgICAgLy8gYWxzbyBwcmV2ZW50cyBzZWxlY3Rpb24gaW4gb2xkZXIgYnJvd3NlcnMgKG1heWJlPykuXG4gICAgICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSBmb3IgdG91Y2gsIGJlc2lkZXMsIGJyb3dzZXIgd291bGQgY29tcGxhaW4gYWJvdXQgcGFzc2l2ZW5lc3MuXG4gICAgICAgICAgICAgICAgaWYgKCFldi5pc1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2Lm9yaWdFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnRlcmFjdGluZyAmJiAvLyBub3QgZGVzdHJveWVkIHZpYSBwb2ludGVyZG93biBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnBvaW50ZXIuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpb25zIHJlbGF0ZWQgdG8gaW5pdGlhdGluZyBkcmFnc3RhcnQrZHJhZ21vdmUrZHJhZ2VuZC4uLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvci5zZXRJc1Zpc2libGUoZmFsc2UpOyAvLyByZXNldC4gY2FsbGVyIG11c3Qgc2V0LXZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3Iuc3RhcnQoZXYuc3ViamVjdEVsLCBldi5wYWdlWCwgZXYucGFnZVkpOyAvLyBtdXN0IGhhcHBlbiBvbiBmaXJzdCBwb2ludGVyIGRvd25cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydERlbGF5KGV2KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURpc3RhbmNlU3VycGFzc2VkKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblBvaW50ZXJNb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0ludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywgZXYpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtaW5EaXN0YW5jZSA9IHRoaXMubWluRGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXN0YW5jZVNxOyAvLyBjdXJyZW50IGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiwgc3F1YXJlZFxuICAgICAgICAgICAgICAgICAgICBsZXQgeyBkZWx0YVgsIGRlbHRhWSB9ID0gZXY7XG4gICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlU3EgPSBkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZVNxID49IG1pbkRpc3RhbmNlICogbWluRGlzdGFuY2UpIHsgLy8gdXNlIHB5dGhhZ29yZWFuIHRoZW9yZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQoZXYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSByZWFsIHBvaW50ZXIgbW92ZT8gKG5vdCBvbmUgc2ltdWxhdGVkIGJ5IHNjcm9sbGluZylcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2Lm9yaWdFdmVudC50eXBlICE9PSAnc2Nyb2xsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taXJyb3IuaGFuZGxlTW92ZShldi5wYWdlWCwgZXYucGFnZVkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsZXIuaGFuZGxlTW92ZShldi5wYWdlWCwgZXYucGFnZVkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnbW92ZScsIGV2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Qb2ludGVyVXAgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzSW50ZXJhY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMuYWxsb3dTZWxlY3Rpb24oZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmFsbG93Q29udGV4dE1lbnUoZG9jdW1lbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIGV2KTsgLy8gY2FuIHBvdGVudGlhbGx5IHNldCBtaXJyb3JOZWVkc1JldmVydFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVN0b3BEcmFnKGV2KTsgLy8gd2hpY2ggd2lsbCBzdG9wIHRoZSBtaXJyb3JcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVsYXlUaW1lb3V0SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZGVsYXlUaW1lb3V0SWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwb2ludGVyID0gdGhpcy5wb2ludGVyID0gbmV3IFBvaW50ZXJEcmFnZ2luZyhjb250YWluZXJFbCk7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLm9uUG9pbnRlckRvd24pO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCB0aGlzLm9uUG9pbnRlclVwKTtcbiAgICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICBwb2ludGVyLnNlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5taXJyb3IgPSBuZXcgRWxlbWVudE1pcnJvcigpO1xuICAgICAgICB0aGlzLmF1dG9TY3JvbGxlciA9IG5ldyBBdXRvU2Nyb2xsZXIoKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5wb2ludGVyLmRlc3Ryb3koKTtcbiAgICAgICAgLy8gSEFDSzogc2ltdWxhdGUgYSBwb2ludGVyLXVwIHRvIGVuZCB0aGUgY3VycmVudCBkcmFnXG4gICAgICAgIC8vIFRPRE86IGZpcmUgJ2RyYWdlbmQnIGRpcmVjdGx5IGFuZCBzdG9wIGludGVyYWN0aW9uLiBkaXNjb3VyYWdlIHVzZSBvZiBwb2ludGVydXAgZXZlbnQgKGIvYyBtaWdodCBub3QgZmlyZSlcbiAgICAgICAgdGhpcy5vblBvaW50ZXJVcCh7fSk7XG4gICAgfVxuICAgIHN0YXJ0RGVsYXkoZXYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVsYXlFbmQoZXYpO1xuICAgICAgICAgICAgfSwgdGhpcy5kZWxheSk7IC8vIG5vdCBhc3NpZ25hYmxlIHRvIG51bWJlciFcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRGVsYXlFbmQoZXYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZURlbGF5RW5kKGV2KSB7XG4gICAgICAgIHRoaXMuaXNEZWxheUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50cnlTdGFydERyYWcoZXYpO1xuICAgIH1cbiAgICBoYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldikge1xuICAgICAgICB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyeVN0YXJ0RHJhZyhldik7XG4gICAgfVxuICAgIHRyeVN0YXJ0RHJhZyhldikge1xuICAgICAgICBpZiAodGhpcy5pc0RlbGF5RW5kZWQgJiYgdGhpcy5pc0Rpc3RhbmNlU3VycGFzc2VkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucG9pbnRlci53YXNUb3VjaFNjcm9sbCB8fCB0aGlzLnRvdWNoU2Nyb2xsQWxsb3dlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JOZWVkc1JldmVydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0b1Njcm9sbGVyLnN0YXJ0KGV2LnBhZ2VYLCBldi5wYWdlWSwgdGhpcy5jb250YWluZXJFbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdzdGFydCcsIGV2KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50b3VjaFNjcm9sbEFsbG93ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRlci5jYW5jZWxUb3VjaFNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0cnlTdG9wRHJhZyhldikge1xuICAgICAgICAvLyAuc3RvcCgpIGlzIEFMV0FZUyBhc3luY2hyb25vdXMsIHdoaWNoIHdlIE5FRUQgYmVjYXVzZSB3ZSB3YW50IGFsbCBwb2ludGVydXAgZXZlbnRzXG4gICAgICAgIC8vIHRoYXQgY29tZSBmcm9tIHRoZSBkb2N1bWVudCB0byBmaXJlIGJlZm9yZWhhbmQuIG11Y2ggbW9yZSBjb252ZW5pZW50IHRoaXMgd2F5LlxuICAgICAgICB0aGlzLm1pcnJvci5zdG9wKHRoaXMubWlycm9yTmVlZHNSZXZlcnQsIHRoaXMuc3RvcERyYWcuYmluZCh0aGlzLCBldikpO1xuICAgIH1cbiAgICBzdG9wRHJhZyhldikge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdlbmQnLCBldik7XG4gICAgfVxuICAgIC8vIGZpbGwgaW4gdGhlIGltcGxlbWVudGF0aW9ucy4uLlxuICAgIHNldElnbm9yZU1vdmUoYm9vbCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuc2hvdWxkSWdub3JlTW92ZSA9IGJvb2w7XG4gICAgfVxuICAgIHNldE1pcnJvcklzVmlzaWJsZShib29sKSB7XG4gICAgICAgIHRoaXMubWlycm9yLnNldElzVmlzaWJsZShib29sKTtcbiAgICB9XG4gICAgc2V0TWlycm9yTmVlZHNSZXZlcnQoYm9vbCkge1xuICAgICAgICB0aGlzLm1pcnJvck5lZWRzUmV2ZXJ0ID0gYm9vbDtcbiAgICB9XG4gICAgc2V0QXV0b1Njcm9sbEVuYWJsZWQoYm9vbCkge1xuICAgICAgICB0aGlzLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBib29sO1xuICAgIH1cbn1cblxuLypcbldoZW4gdGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQsIGl0IHJlY29yZHMgdGhlIG9mZnNldCBvZiBhbiBlbGVtZW50IChyZWxhdGl2ZSB0byB0aGUgZG9jdW1lbnQgdG9wbGVmdCksXG5hbmQgY29udGludWVzIHRvIG1vbml0b3Igc2Nyb2xsaW5nLCB1cGRhdGluZyB0aGUgY2FjaGVkIGNvb3JkaW5hdGVzIGlmIGl0IG5lZWRzIHRvLlxuRG9lcyBub3QgYWNjZXNzIHRoZSBET00gYWZ0ZXIgaW5zdGFudGlhdGlvbiwgc28gaGlnaGx5IHBlcmZvcm1hbnQuXG5cbkFsc28ga2VlcHMgdHJhY2sgb2YgYWxsIHNjcm9sbGluZy9vdmVyZmxvdzpoaWRkZW4gY29udGFpbmVycyB0aGF0IGFyZSBwYXJlbnRzIG9mIHRoZSBnaXZlbiBlbGVtZW50XG5hbmQgYW4gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gcG9pbnQgaXMgaW5zaWRlIHRoZSBjb21iaW5lZCBjbGlwcGluZyByZWN0YW5nbGUuXG4qL1xuY2xhc3MgT2Zmc2V0VHJhY2tlciB7XG4gICAgY29uc3RydWN0b3IoZWwpIHtcbiAgICAgICAgdGhpcy5vcmlnUmVjdCA9IGludGVybmFsX2Nqcy5jb21wdXRlUmVjdChlbCk7XG4gICAgICAgIC8vIHdpbGwgd29yayBmaW5lIGZvciBkaXZzIHRoYXQgaGF2ZSBvdmVyZmxvdzpoaWRkZW5cbiAgICAgICAgdGhpcy5zY3JvbGxDYWNoZXMgPSBpbnRlcm5hbF9janMuZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsKS5tYXAoKHNjcm9sbEVsKSA9PiBuZXcgRWxlbWVudFNjcm9sbEdlb21DYWNoZShzY3JvbGxFbCwgdHJ1ZSkpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiB0aGlzLnNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVMZWZ0KCkge1xuICAgICAgICBsZXQgbGVmdCA9IHRoaXMub3JpZ1JlY3QubGVmdDtcbiAgICAgICAgZm9yIChsZXQgc2Nyb2xsQ2FjaGUgb2YgdGhpcy5zY3JvbGxDYWNoZXMpIHtcbiAgICAgICAgICAgIGxlZnQgKz0gc2Nyb2xsQ2FjaGUub3JpZ1Njcm9sbExlZnQgLSBzY3JvbGxDYWNoZS5nZXRTY3JvbGxMZWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxlZnQ7XG4gICAgfVxuICAgIGNvbXB1dGVUb3AoKSB7XG4gICAgICAgIGxldCB0b3AgPSB0aGlzLm9yaWdSZWN0LnRvcDtcbiAgICAgICAgZm9yIChsZXQgc2Nyb2xsQ2FjaGUgb2YgdGhpcy5zY3JvbGxDYWNoZXMpIHtcbiAgICAgICAgICAgIHRvcCArPSBzY3JvbGxDYWNoZS5vcmlnU2Nyb2xsVG9wIC0gc2Nyb2xsQ2FjaGUuZ2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvcDtcbiAgICB9XG4gICAgaXNXaXRoaW5DbGlwcGluZyhwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgbGV0IHBvaW50ID0geyBsZWZ0OiBwYWdlWCwgdG9wOiBwYWdlWSB9O1xuICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiB0aGlzLnNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgaWYgKCFpc0lnbm9yZWRDbGlwcGluZyhzY3JvbGxDYWNoZS5nZXRFdmVudFRhcmdldCgpKSAmJlxuICAgICAgICAgICAgICAgICFpbnRlcm5hbF9janMucG9pbnRJbnNpZGVSZWN0KHBvaW50LCBzY3JvbGxDYWNoZS5jbGllbnRSZWN0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG4vLyBjZXJ0YWluIGNsaXBwaW5nIGNvbnRhaW5lcnMgc2hvdWxkIG5ldmVyIGNvbnN0cmFpbiBpbnRlcmFjdGlvbnMsIGxpa2UgPGh0bWw+IGFuZCA8Ym9keT5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mdWxsY2FsZW5kYXIvZnVsbGNhbGVuZGFyL2lzc3Vlcy8zNjE1XG5mdW5jdGlvbiBpc0lnbm9yZWRDbGlwcGluZyhub2RlKSB7XG4gICAgbGV0IHRhZ05hbWUgPSBub2RlLnRhZ05hbWU7XG4gICAgcmV0dXJuIHRhZ05hbWUgPT09ICdIVE1MJyB8fCB0YWdOYW1lID09PSAnQk9EWSc7XG59XG5cbi8qXG5UcmFja3MgbW92ZW1lbnQgb3ZlciBtdWx0aXBsZSBkcm9wcGFibGUgYXJlYXMgKGFrYSBcImhpdHNcIilcbnRoYXQgZXhpc3QgaW4gb25lIG9yIG1vcmUgRGF0ZUNvbXBvbmVudHMuXG5SZWxpZXMgb24gYW4gZXhpc3RpbmcgZHJhZ2dhYmxlLlxuXG5lbWl0czpcbi0gcG9pbnRlcmRvd25cbi0gZHJhZ3N0YXJ0XG4tIGhpdGNoYW5nZSAtIGZpcmVzIGluaXRpYWxseSwgZXZlbiBpZiBub3Qgb3ZlciBhIGhpdFxuLSBwb2ludGVydXBcbi0gKGhpdGNoYW5nZSAtIGFnYWluLCB0byBudWxsLCBpZiBlbmRlZCBvdmVyIGEgaGl0KVxuLSBkcmFnZW5kXG4qL1xuY2xhc3MgSGl0RHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnaW5nLCBkcm9wcGFibGVTdG9yZSkge1xuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBieSBjYWxsZXJcbiAgICAgICAgdGhpcy51c2VTdWJqZWN0Q2VudGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVxdWlyZUluaXRpYWwgPSB0cnVlOyAvLyBpZiBkb2Vzbid0IHN0YXJ0IG91dCBvbiBhIGhpdCwgd29uJ3QgZW1pdCBhbnkgZXZlbnRzXG4gICAgICAgIHRoaXMuaW5pdGlhbEhpdCA9IG51bGw7XG4gICAgICAgIHRoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5maW5hbEhpdCA9IG51bGw7IC8vIHdvbid0IGV2ZXIgYmUgcG9wdWxhdGVkIGlmIHNob3VsZElnbm9yZU1vdmVcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyRG93biA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IHsgZHJhZ2dpbmcgfSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxIaXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5maW5hbEhpdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVIaXRzKCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NGaXJzdENvb3JkKGV2KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxIaXQgfHwgIXRoaXMucmVxdWlyZUluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXJlIHRoaXMgYmVmb3JlIGNvbXB1dGluZyBwcm9jZXNzRmlyc3RDb29yZCwgc28gbGlzdGVuZXJzIGNhbiBjYW5jZWwuIHRoaXMgZ2V0cyBmaXJlZCBieSBhbG1vc3QgZXZlcnkgaGFuZGxlciA6KFxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVyZG93bicsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ3N0YXJ0JywgZXYpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVNb3ZlKGV2LCB0cnVlKTsgLy8gZm9yY2UgPSBmaXJlIGV2ZW4gaWYgaW5pdGlhbGx5IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnTW92ZSA9IChldikgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVNb3ZlKGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyVXAgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVsZWFzZUhpdHMoKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVydXAnLCBldik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ0VuZCA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubW92aW5nSGl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2hpdHVwZGF0ZScsIG51bGwsIHRydWUsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmluYWxIaXQgPSB0aGlzLm1vdmluZ0hpdDtcbiAgICAgICAgICAgIHRoaXMubW92aW5nSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRyb3BwYWJsZVN0b3JlID0gZHJvcHBhYmxlU3RvcmU7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ21vdmUnLCB0aGlzLmhhbmRsZURyYWdNb3ZlKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGRyYWdnaW5nO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgaW50ZXJuYWxfY2pzLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgLy8gc2V0cyBpbml0aWFsSGl0XG4gICAgLy8gc2V0cyBjb29yZEFkanVzdFxuICAgIHByb2Nlc3NGaXJzdENvb3JkKGV2KSB7XG4gICAgICAgIGxldCBvcmlnUG9pbnQgPSB7IGxlZnQ6IGV2LnBhZ2VYLCB0b3A6IGV2LnBhZ2VZIH07XG4gICAgICAgIGxldCBhZGp1c3RlZFBvaW50ID0gb3JpZ1BvaW50O1xuICAgICAgICBsZXQgc3ViamVjdEVsID0gZXYuc3ViamVjdEVsO1xuICAgICAgICBsZXQgc3ViamVjdFJlY3Q7XG4gICAgICAgIGlmIChzdWJqZWN0RWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgeyAvLyBpLmUuIG5vdCBhIERvY3VtZW50L1NoYWRvd1Jvb3RcbiAgICAgICAgICAgIHN1YmplY3RSZWN0ID0gaW50ZXJuYWxfY2pzLmNvbXB1dGVSZWN0KHN1YmplY3RFbCk7XG4gICAgICAgICAgICBhZGp1c3RlZFBvaW50ID0gaW50ZXJuYWxfY2pzLmNvbnN0cmFpblBvaW50KGFkanVzdGVkUG9pbnQsIHN1YmplY3RSZWN0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5pdGlhbEhpdCA9IHRoaXMuaW5pdGlhbEhpdCA9IHRoaXMucXVlcnlIaXRGb3JPZmZzZXQoYWRqdXN0ZWRQb2ludC5sZWZ0LCBhZGp1c3RlZFBvaW50LnRvcCk7XG4gICAgICAgIGlmIChpbml0aWFsSGl0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VTdWJqZWN0Q2VudGVyICYmIHN1YmplY3RSZWN0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNsaWNlZFN1YmplY3RSZWN0ID0gaW50ZXJuYWxfY2pzLmludGVyc2VjdFJlY3RzKHN1YmplY3RSZWN0LCBpbml0aWFsSGl0LnJlY3QpO1xuICAgICAgICAgICAgICAgIGlmIChzbGljZWRTdWJqZWN0UmVjdCkge1xuICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFBvaW50ID0gaW50ZXJuYWxfY2pzLmdldFJlY3RDZW50ZXIoc2xpY2VkU3ViamVjdFJlY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29vcmRBZGp1c3QgPSBpbnRlcm5hbF9janMuZGlmZlBvaW50cyhhZGp1c3RlZFBvaW50LCBvcmlnUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb29yZEFkanVzdCA9IHsgbGVmdDogMCwgdG9wOiAwIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlTW92ZShldiwgZm9yY2VIYW5kbGUpIHtcbiAgICAgICAgbGV0IGhpdCA9IHRoaXMucXVlcnlIaXRGb3JPZmZzZXQoZXYucGFnZVggKyB0aGlzLmNvb3JkQWRqdXN0LmxlZnQsIGV2LnBhZ2VZICsgdGhpcy5jb29yZEFkanVzdC50b3ApO1xuICAgICAgICBpZiAoZm9yY2VIYW5kbGUgfHwgIWlzSGl0c0VxdWFsKHRoaXMubW92aW5nSGl0LCBoaXQpKSB7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ0hpdCA9IGhpdDtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdoaXR1cGRhdGUnLCBoaXQsIGZhbHNlLCBldik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJlcGFyZUhpdHMoKSB7XG4gICAgICAgIHRoaXMub2Zmc2V0VHJhY2tlcnMgPSBpbnRlcm5hbF9janMubWFwSGFzaCh0aGlzLmRyb3BwYWJsZVN0b3JlLCAoaW50ZXJhY3Rpb25TZXR0aW5ncykgPT4ge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb25TZXR0aW5ncy5jb21wb25lbnQucHJlcGFyZUhpdHMoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgT2Zmc2V0VHJhY2tlcihpbnRlcmFjdGlvblNldHRpbmdzLmVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbGVhc2VIaXRzKCkge1xuICAgICAgICBsZXQgeyBvZmZzZXRUcmFja2VycyB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gb2Zmc2V0VHJhY2tlcnMpIHtcbiAgICAgICAgICAgIG9mZnNldFRyYWNrZXJzW2lkXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXRUcmFja2VycyA9IHt9O1xuICAgIH1cbiAgICBxdWVyeUhpdEZvck9mZnNldChvZmZzZXRMZWZ0LCBvZmZzZXRUb3ApIHtcbiAgICAgICAgbGV0IHsgZHJvcHBhYmxlU3RvcmUsIG9mZnNldFRyYWNrZXJzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmVzdEhpdCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGlkIGluIGRyb3BwYWJsZVN0b3JlKSB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gZHJvcHBhYmxlU3RvcmVbaWRdLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGxldCBvZmZzZXRUcmFja2VyID0gb2Zmc2V0VHJhY2tlcnNbaWRdO1xuICAgICAgICAgICAgaWYgKG9mZnNldFRyYWNrZXIgJiYgLy8gd2Fzbid0IGRlc3Ryb3llZCBtaWQtZHJhZ1xuICAgICAgICAgICAgICAgIG9mZnNldFRyYWNrZXIuaXNXaXRoaW5DbGlwcGluZyhvZmZzZXRMZWZ0LCBvZmZzZXRUb3ApKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpbkxlZnQgPSBvZmZzZXRUcmFja2VyLmNvbXB1dGVMZWZ0KCk7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpblRvcCA9IG9mZnNldFRyYWNrZXIuY29tcHV0ZVRvcCgpO1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbkxlZnQgPSBvZmZzZXRMZWZ0IC0gb3JpZ2luTGVmdDtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb25Ub3AgPSBvZmZzZXRUb3AgLSBvcmlnaW5Ub3A7XG4gICAgICAgICAgICAgICAgbGV0IHsgb3JpZ1JlY3QgfSA9IG9mZnNldFRyYWNrZXI7XG4gICAgICAgICAgICAgICAgbGV0IHdpZHRoID0gb3JpZ1JlY3QucmlnaHQgLSBvcmlnUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBvcmlnUmVjdC5ib3R0b20gLSBvcmlnUmVjdC50b3A7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgd2l0aGluIHRoZSBlbGVtZW50J3MgYm91bmRzXG4gICAgICAgICAgICAgICAgcG9zaXRpb25MZWZ0ID49IDAgJiYgcG9zaXRpb25MZWZ0IDwgd2lkdGggJiZcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Ub3AgPj0gMCAmJiBwb3NpdGlvblRvcCA8IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaGl0ID0gY29tcG9uZW50LnF1ZXJ5SGl0KHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3AsIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGl0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBoaXQgaXMgd2l0aGluIGFjdGl2ZVJhbmdlLCBtZWFuaW5nIGl0J3Mgbm90IGEgZGVhZCBjZWxsXG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5yYW5nZUNvbnRhaW5zUmFuZ2UoaGl0LmRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBoaXQuZGF0ZVNwYW4ucmFuZ2UpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCFiZXN0SGl0IHx8IGhpdC5sYXllciA+IGJlc3RIaXQubGF5ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQuY29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5jb250ZXh0ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZXR0ZXIgd2F5IHRvIHJlLW9yaWVudCByZWN0YW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LmxlZnQgKz0gb3JpZ2luTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LnJpZ2h0ICs9IG9yaWdpbkxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQucmVjdC50b3AgKz0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LnJlY3QuYm90dG9tICs9IG9yaWdpblRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RIaXQgPSBoaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RIaXQ7XG4gICAgfVxufVxuZnVuY3Rpb24gaXNIaXRzRXF1YWwoaGl0MCwgaGl0MSkge1xuICAgIGlmICghaGl0MCAmJiAhaGl0MSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKEJvb2xlYW4oaGl0MCkgIT09IEJvb2xlYW4oaGl0MSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaW50ZXJuYWxfY2pzLmlzRGF0ZVNwYW5zRXF1YWwoaGl0MC5kYXRlU3BhbiwgaGl0MS5kYXRlU3Bhbik7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZGF0ZVNwYW4sIGNvbnRleHQpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBmb3IgKGxldCB0cmFuc2Zvcm0gb2YgY29udGV4dC5wbHVnaW5Ib29rcy5kYXRlUG9pbnRUcmFuc2Zvcm1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgY29udGV4dCkpO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHByb3BzLCBidWlsZERhdGVQb2ludEFwaShkYXRlU3BhbiwgY29udGV4dC5kYXRlRW52KSk7XG4gICAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUG9pbnRBcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGU6IGRhdGVFbnYudG9EYXRlKHNwYW4ucmFuZ2Uuc3RhcnQpLFxuICAgICAgICBkYXRlU3RyOiBkYXRlRW52LmZvcm1hdElzbyhzcGFuLnJhbmdlLnN0YXJ0LCB7IG9taXRUaW1lOiBzcGFuLmFsbERheSB9KSxcbiAgICAgICAgYWxsRGF5OiBzcGFuLmFsbERheSxcbiAgICB9O1xufVxuXG4vKlxuTW9uaXRvcnMgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSBzcGVjaWZpYyBkYXRlL3RpbWUgb2YgYSBjb21wb25lbnQuXG5BIHBvaW50ZXJkb3duK3BvaW50ZXJ1cCBvbiB0aGUgc2FtZSBcImhpdFwiIGNvbnN0aXR1dGVzIGEgY2xpY2suXG4qL1xuY2xhc3MgRGF0ZUNsaWNraW5nIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkludGVyYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAocGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkcmFnZ2luZyB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCBkb3duRWwgPSBwZXYub3JpZ0V2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIC8vIGRvIHRoaXMgaW4gcG9pbnRlcmRvd24gKG5vdCBkcmFnZW5kKSBiZWNhdXNlIERPTSBtaWdodCBiZSBtdXRhdGVkIGJ5IHRoZSB0aW1lIGRyYWdlbmQgaXMgZmlyZWRcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIXRoaXMuY29tcG9uZW50LmlzVmFsaWREYXRlRG93bkVsKGRvd25FbCkpO1xuICAgICAgICB9O1xuICAgICAgICAvLyB3b24ndCBldmVuIGZpcmUgaWYgbW92aW5nIHdhcyBpZ25vcmVkXG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ0VuZCA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IHsgY29tcG9uZW50IH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgcG9pbnRlciB9ID0gdGhpcy5kcmFnZ2luZztcbiAgICAgICAgICAgIGlmICghcG9pbnRlci53YXNUb3VjaFNjcm9sbCkge1xuICAgICAgICAgICAgICAgIGxldCB7IGluaXRpYWxIaXQsIGZpbmFsSGl0IH0gPSB0aGlzLmhpdERyYWdnaW5nO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsSGl0ICYmIGZpbmFsSGl0ICYmIGlzSGl0c0VxdWFsKGluaXRpYWxIaXQsIGZpbmFsSGl0KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSBjb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoaW5pdGlhbEhpdC5kYXRlU3BhbiwgY29udGV4dCkpLCB7IGRheUVsOiBpbml0aWFsSGl0LmRheUVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB8fCBjb250ZXh0LmNhbGVuZGFyQXBpLnZpZXcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdkYXRlQ2xpY2snLCBhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gd2UgRE8gd2FudCB0byB3YXRjaCBwb2ludGVyIG1vdmVzIGJlY2F1c2Ugb3RoZXJ3aXNlIGZpbmFsSGl0IHdvbid0IGdldCBwb3B1bGF0ZWRcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IG5ldyBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nKHNldHRpbmdzLmVsKTtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5hdXRvU2Nyb2xsZXIuaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBoaXREcmFnZ2luZyA9IHRoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcodGhpcy5kcmFnZ2luZywgaW50ZXJuYWxfY2pzLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbi8qXG5UcmFja3Mgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgcG9ydGlvbiBvZiB0aW1lIG9mIGEgY29tcG9uZW50LFxuY29uc3RpdHV0ZWQgYnkgYSBkcmFnIG92ZXIgZGF0ZSBjZWxscywgd2l0aCBhIHBvc3NpYmxlIGRlbGF5IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRyYWcuXG4qL1xuY2xhc3MgRGF0ZVNlbGVjdGluZyBleHRlbmRzIGludGVybmFsX2Nqcy5JbnRlcmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xuICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb21wb25lbnQsIGRyYWdnaW5nIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICBsZXQgY2FuU2VsZWN0ID0gb3B0aW9ucy5zZWxlY3RhYmxlICYmXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmlzVmFsaWREYXRlRG93bkVsKGV2Lm9yaWdFdmVudC50YXJnZXQpO1xuICAgICAgICAgICAgLy8gZG9uJ3QgYm90aGVyIHRvIHdhdGNoIGV4cGVuc2l2ZSBtb3ZlcyBpZiBjb21wb25lbnQgd29uJ3QgZG8gc2VsZWN0aW9uXG4gICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKCFjYW5TZWxlY3QpO1xuICAgICAgICAgICAgLy8gaWYgdG91Y2gsIHJlcXVpcmUgdXNlciB0byBob2xkIGRvd25cbiAgICAgICAgICAgIGRyYWdnaW5nLmRlbGF5ID0gZXYuaXNUb3VjaCA/IGdldENvbXBvbmVudFRvdWNoRGVsYXkkMShjb21wb25lbnQpIDogbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50LmNvbnRleHQuY2FsZW5kYXJBcGkudW5zZWxlY3QoZXYpOyAvLyB1bnNlbGVjdCBwcmV2aW91cyBzZWxlY3Rpb25zXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlSGl0VXBkYXRlID0gKGhpdCwgaXNGaW5hbCkgPT4ge1xuICAgICAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICBsZXQgZHJhZ1NlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxIaXQgPSB0aGlzLmhpdERyYWdnaW5nLmluaXRpYWxIaXQ7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2FsbG93ZWQgPSBoaXQuY29tcG9uZW50SWQgPT09IGluaXRpYWxIaXQuY29tcG9uZW50SWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pc0hpdENvbWJvQWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy5pc0hpdENvbWJvQWxsb3dlZChpbml0aWFsSGl0LCBoaXQpO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgICBkcmFnU2VsZWN0aW9uID0gam9pbkhpdHNJbnRvU2VsZWN0aW9uKGluaXRpYWxIaXQsIGhpdCwgY29udGV4dC5wbHVnaW5Ib29rcy5kYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkcmFnU2VsZWN0aW9uIHx8ICFpbnRlcm5hbF9janMuaXNEYXRlU2VsZWN0aW9uVmFsaWQoZHJhZ1NlbGVjdGlvbiwgaGl0LmRhdGVQcm9maWxlLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZHJhZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnU0VMRUNUX0RBVEVTJywgc2VsZWN0aW9uOiBkcmFnU2VsZWN0aW9uIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzRmluYWwpIHsgLy8gb25seSB1bnNlbGVjdCBpZiBtb3ZlZCBhd2F5IHdoaWxlIGRyYWdnaW5nXG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9EQVRFUycgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5lbmFibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5kaXNhYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb24gPSBkcmFnU2VsZWN0aW9uOyAvLyBvbmx5IGNsZWFyIGlmIG1vdmVkIGF3YXkgZnJvbSBhbGwgaGl0cyB3aGlsZSBkcmFnZ2luZ1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJVcCA9IChwZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRyYWdTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBzZWxlY3Rpb24gaXMgYWxyZWFkeSByZW5kZXJlZCwgc28ganVzdCBuZWVkIHRvIHJlcG9ydCBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMudHJpZ2dlckRhdGVTZWxlY3QodGhpcy5kcmFnU2VsZWN0aW9uLCBwZXYsIHRoaXMuY29tcG9uZW50LmNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1NlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gc2V0dGluZ3M7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICBsZXQgZHJhZ2dpbmcgPSB0aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy50b3VjaFNjcm9sbEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgZHJhZ2dpbmcubWluRGlzdGFuY2UgPSBvcHRpb25zLnNlbGVjdE1pbkRpc3RhbmNlIHx8IDA7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBvcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIGxldCBoaXREcmFnZ2luZyA9IHRoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcodGhpcy5kcmFnZ2luZywgaW50ZXJuYWxfY2pzLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCB0aGlzLmhhbmRsZVBvaW50ZXJVcCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRvdWNoRGVsYXkkMShjb21wb25lbnQpIHtcbiAgICBsZXQgeyBvcHRpb25zIH0gPSBjb21wb25lbnQuY29udGV4dDtcbiAgICBsZXQgZGVsYXkgPSBvcHRpb25zLnNlbGVjdExvbmdQcmVzc0RlbGF5O1xuICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGF5ID0gb3B0aW9ucy5sb25nUHJlc3NEZWxheTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xufVxuZnVuY3Rpb24gam9pbkhpdHNJbnRvU2VsZWN0aW9uKGhpdDAsIGhpdDEsIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpIHtcbiAgICBsZXQgZGF0ZVNwYW4wID0gaGl0MC5kYXRlU3BhbjtcbiAgICBsZXQgZGF0ZVNwYW4xID0gaGl0MS5kYXRlU3BhbjtcbiAgICBsZXQgbXMgPSBbXG4gICAgICAgIGRhdGVTcGFuMC5yYW5nZS5zdGFydCxcbiAgICAgICAgZGF0ZVNwYW4wLnJhbmdlLmVuZCxcbiAgICAgICAgZGF0ZVNwYW4xLnJhbmdlLnN0YXJ0LFxuICAgICAgICBkYXRlU3BhbjEucmFuZ2UuZW5kLFxuICAgIF07XG4gICAgbXMuc29ydChpbnRlcm5hbF9janMuY29tcGFyZU51bWJlcnMpO1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIGZvciAobGV0IHRyYW5zZm9ybWVyIG9mIGRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpIHtcbiAgICAgICAgbGV0IHJlcyA9IHRyYW5zZm9ybWVyKGhpdDAsIGhpdDEpO1xuICAgICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wcywgcmVzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcm9wcy5yYW5nZSA9IHsgc3RhcnQ6IG1zWzBdLCBlbmQ6IG1zWzNdIH07XG4gICAgcHJvcHMuYWxsRGF5ID0gZGF0ZVNwYW4wLmFsbERheTtcbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbmNsYXNzIEV2ZW50RHJhZ2dpbmcgZXh0ZW5kcyBpbnRlcm5hbF9janMuSW50ZXJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgdGhpcy5zdWJqZWN0RWwgPSBudWxsO1xuICAgICAgICB0aGlzLnN1YmplY3RTZWcgPSBudWxsOyAvLyB0aGUgc2VnIGJlaW5nIHNlbGVjdGVkL2RyYWdnZWRcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlbnRSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMucmVsZXZhbnRFdmVudHMgPSBudWxsOyAvLyB0aGUgZXZlbnRzIGJlaW5nIGRyYWdnZWRcbiAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgb3JpZ1RhcmdldCA9IGV2Lm9yaWdFdmVudC50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgeyBjb21wb25lbnQsIGRyYWdnaW5nIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgbWlycm9yIH0gPSBkcmFnZ2luZztcbiAgICAgICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgbGV0IGluaXRpYWxDb250ZXh0ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICB0aGlzLnN1YmplY3RFbCA9IGV2LnN1YmplY3RFbDtcbiAgICAgICAgICAgIGxldCBzdWJqZWN0U2VnID0gdGhpcy5zdWJqZWN0U2VnID0gaW50ZXJuYWxfY2pzLmdldEVsU2VnKGV2LnN1YmplY3RFbCk7XG4gICAgICAgICAgICBsZXQgZXZlbnRSYW5nZSA9IHRoaXMuZXZlbnRSYW5nZSA9IHN1YmplY3RTZWcuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIGxldCBldmVudEluc3RhbmNlSWQgPSBldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICB0aGlzLnJlbGV2YW50RXZlbnRzID0gaW50ZXJuYWxfY2pzLmdldFJlbGV2YW50RXZlbnRzKGluaXRpYWxDb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZSwgZXZlbnRJbnN0YW5jZUlkKTtcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pbkRpc3RhbmNlID0gZXYuaXNUb3VjaCA/IDAgOiBvcHRpb25zLmV2ZW50RHJhZ01pbkRpc3RhbmNlO1xuICAgICAgICAgICAgZHJhZ2dpbmcuZGVsYXkgPVxuICAgICAgICAgICAgICAgIC8vIG9ubHkgZG8gYSB0b3VjaCBkZWxheSBpZiB0b3VjaCBhbmQgdGhpcyBldmVudCBoYXNuJ3QgYmVlbiBzZWxlY3RlZCB5ZXRcbiAgICAgICAgICAgICAgICAoZXYuaXNUb3VjaCAmJiBldmVudEluc3RhbmNlSWQgIT09IGNvbXBvbmVudC5wcm9wcy5ldmVudFNlbGVjdGlvbikgP1xuICAgICAgICAgICAgICAgICAgICBnZXRDb21wb25lbnRUb3VjaERlbGF5KGNvbXBvbmVudCkgOlxuICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZml4ZWRNaXJyb3JQYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBtaXJyb3IucGFyZW50Tm9kZSA9IG9wdGlvbnMuZml4ZWRNaXJyb3JQYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtaXJyb3IucGFyZW50Tm9kZSA9IGludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChvcmlnVGFyZ2V0LCAnLmZjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtaXJyb3IucmV2ZXJ0RHVyYXRpb24gPSBvcHRpb25zLmRyYWdSZXZlcnREdXJhdGlvbjtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkID0gY29tcG9uZW50LmlzVmFsaWRTZWdEb3duRWwob3JpZ1RhcmdldCkgJiZcbiAgICAgICAgICAgICAgICAhaW50ZXJuYWxfY2pzLmVsZW1lbnRDbG9zZXN0KG9yaWdUYXJnZXQsICcuZmMtZXZlbnQtcmVzaXplcicpOyAvLyBOT1Qgb24gYSByZXNpemVyXG4gICAgICAgICAgICBkcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKCFpc1ZhbGlkKTtcbiAgICAgICAgICAgIC8vIGRpc2FibGUgZHJhZ2dpbmcgZm9yIGVsZW1lbnRzIHRoYXQgYXJlIHJlc2l6YWJsZSAoaWUsIHNlbGVjdGFibGUpXG4gICAgICAgICAgICAvLyBidXQgYXJlIG5vdCBkcmFnZ2FibGVcbiAgICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGlzVmFsaWQgJiZcbiAgICAgICAgICAgICAgICBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudC1kcmFnZ2FibGUnKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCBpbml0aWFsQ29udGV4dCA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICBsZXQgZXZlbnRSYW5nZSA9IHRoaXMuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIGxldCBldmVudEluc3RhbmNlSWQgPSBldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQ7XG4gICAgICAgICAgICBpZiAoZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VsZWN0IGEgZGlmZmVyZW50IGV2ZW50P1xuICAgICAgICAgICAgICAgIGlmIChldmVudEluc3RhbmNlSWQgIT09IHRoaXMuY29tcG9uZW50LnByb3BzLmV2ZW50U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1NFTEVDVF9FVkVOVCcsIGV2ZW50SW5zdGFuY2VJZCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBub3cgdXNpbmcgbW91c2UsIGJ1dCB3YXMgcHJldmlvdXMgdG91Y2ggaW50ZXJhY3Rpb24sIGNsZWFyIHNlbGVjdGVkIGV2ZW50XG4gICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRUxFQ1RfRVZFTlQnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmNhbGVuZGFyQXBpLnVuc2VsZWN0KGV2KTsgLy8gdW5zZWxlY3QgKmRhdGUqIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcmFnU3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKGluaXRpYWxDb250ZXh0LCBldmVudFJhbmdlLmRlZiwgZXZlbnRSYW5nZS5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogaW5pdGlhbENvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVIaXRVcGRhdGUgPSAoaGl0LCBpc0ZpbmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZWxldmFudEV2ZW50cyA9IHRoaXMucmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICBsZXQgaW5pdGlhbEhpdCA9IHRoaXMuaGl0RHJhZ2dpbmcuaW5pdGlhbEhpdDtcbiAgICAgICAgICAgIGxldCBpbml0aWFsQ29udGV4dCA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICAvLyBzdGF0ZXMgYmFzZWQgb24gbmV3IGhpdFxuICAgICAgICAgICAgbGV0IHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGlzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dCA9IGhpdC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGxldCByZWNlaXZpbmdPcHRpb25zID0gcmVjZWl2aW5nQ29udGV4dC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsQ29udGV4dCA9PT0gcmVjZWl2aW5nQ29udGV4dCB8fFxuICAgICAgICAgICAgICAgICAgICAocmVjZWl2aW5nT3B0aW9ucy5lZGl0YWJsZSAmJiByZWNlaXZpbmdPcHRpb25zLmRyb3BwYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBjb21wdXRlRXZlbnRNdXRhdGlvbihpbml0aWFsSGl0LCBoaXQsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gaW50ZXJuYWxfY2pzLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIHJlY2VpdmluZ0NvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFVpQmFzZXMsIG11dGF0aW9uLCByZWNlaXZpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsX2Nqcy5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBpbnRlcm5hbF9janMuY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURyYWcocmVjZWl2aW5nQ29udGV4dCwgaW50ZXJhY3Rpb24pO1xuICAgICAgICAgICAgaWYgKCFpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMuZW5hYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMuZGlzYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0ZpbmFsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0ID09PSByZWNlaXZpbmdDb250ZXh0ICYmIC8vIFRPRE86IHdyaXRlIHRlc3QgZm9yIHRoaXNcbiAgICAgICAgICAgICAgICAgICAgaXNIaXRzRXF1YWwoaW5pdGlhbEhpdCwgaGl0KSkge1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcuc2V0TWlycm9yTmVlZHNSZXZlcnQoIW11dGF0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyByZW5kZXIgdGhlIG1pcnJvciBpZiBubyBhbHJlYWR5LXJlbmRlcmVkIG1pcnJvclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHdpc2ggd2UgY291bGQgc29tZWhvdyB3YWl0IGZvciBkaXNwYXRjaCB0byBndWFyYW50ZWUgcmVuZGVyXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JJc1Zpc2libGUoIWhpdCB8fCAhdGhpcy5zdWJqZWN0RWwuZ2V0Um9vdE5vZGUoKS5xdWVyeVNlbGVjdG9yKCcuZmMtZXZlbnQtbWlycm9yJykpO1xuICAgICAgICAgICAgICAgIC8vIGFzc2lnbiBzdGF0ZXMgYmFzZWQgb24gbmV3IGhpdFxuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nQ29udGV4dCA9IHJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlclVwID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFudXAoKTsgLy8gYmVjYXVzZSBoYW5kbGVEcmFnRW5kIHdvbid0IGZpcmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxDb250ZXh0ID0gdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbFZpZXcgPSBpbml0aWFsQ29udGV4dC52aWV3QXBpO1xuICAgICAgICAgICAgICAgIGxldCB7IHJlY2VpdmluZ0NvbnRleHQsIHZhbGlkTXV0YXRpb24gfSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50RGVmID0gdGhpcy5ldmVudFJhbmdlLmRlZjtcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnRJbnN0YW5jZSA9IHRoaXMuZXZlbnRSYW5nZS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnRBcGkgPSBuZXcgaW50ZXJuYWxfY2pzLkV2ZW50SW1wbChpbml0aWFsQ29udGV4dCwgZXZlbnREZWYsIGV2ZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgIGxldCByZWxldmFudEV2ZW50cyA9IHRoaXMucmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgbGV0IG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IHRoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgICAgIGxldCB7IGZpbmFsSGl0IH0gPSB0aGlzLmhpdERyYWdnaW5nO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJEcmFnKCk7IC8vIG11c3QgaGFwcGVuIGFmdGVyIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50RHJhZ1N0b3AnLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IGluaXRpYWxWaWV3LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgd2l0aGluIHNhbWUgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmluZ0NvbnRleHQgPT09IGluaXRpYWxDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZEV2ZW50QXBpID0gbmV3IGludGVybmFsX2Nqcy5FdmVudEltcGwoaW5pdGlhbENvbnRleHQsIG11dGF0ZWRSZWxldmFudEV2ZW50cy5kZWZzW2V2ZW50RGVmLmRlZklkXSwgZXZlbnRJbnN0YW5jZSA/IG11dGF0ZWRSZWxldmFudEV2ZW50cy5pbnN0YW5jZXNbZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkXSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50Q2hhbmdlQXJnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogdXBkYXRlZEV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5idWlsZEV2ZW50QXBpcyhtdXRhdGVkUmVsZXZhbnRFdmVudHMsIGluaXRpYWxDb250ZXh0LCBldmVudEluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHMsIC8vIHRoZSBwcmUtY2hhbmdlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJhbnNmb3JtZWQgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHRyYW5zZm9ybWVyIG9mIGluaXRpYWxDb250ZXh0LmdldEN1cnJlbnREYXRhKCkucGx1Z2luSG9va3MuZXZlbnREcm9wVHJhbnNmb3JtZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0cmFuc2Zvcm1lZCwgdHJhbnNmb3JtZXIodmFsaWRNdXRhdGlvbiwgaW5pdGlhbENvbnRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcm9wJywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgdHJhbnNmb3JtZWQpLCB7IGVsOiBldi5zdWJqZWN0RWwsIGRlbHRhOiB2YWxpZE11dGF0aW9uLmRhdGVzRGVsdGEsIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCwgdmlldzogaW5pdGlhbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudENoYW5nZScsIGV2ZW50Q2hhbmdlQXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgaW4gZGlmZmVyZW50IGNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50UmVtb3ZlQXJnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuYnVpbGRFdmVudEFwaXMocmVsZXZhbnRFdmVudHMsIGluaXRpYWxDb250ZXh0LCBldmVudEluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudExlYXZlJywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudFJlbW92ZUFyZyksIHsgZHJhZ2dlZEVsOiBldi5zdWJqZWN0RWwsIHZpZXc6IGluaXRpYWxWaWV3IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZW1vdmUnLCBldmVudFJlbW92ZUFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkZWRFdmVudERlZiA9IG11dGF0ZWRSZWxldmFudEV2ZW50cy5kZWZzW2V2ZW50RGVmLmRlZklkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRlZEV2ZW50SW5zdGFuY2UgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHMuaW5zdGFuY2VzW2V2ZW50SW5zdGFuY2UuaW5zdGFuY2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRkZWRFdmVudEFwaSA9IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKHJlY2VpdmluZ0NvbnRleHQsIGFkZGVkRXZlbnREZWYsIGFkZGVkRXZlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBtdXRhdGVkUmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBldmVudEFkZEFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogYWRkZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzLCByZWNlaXZpbmdDb250ZXh0LCBhZGRlZEV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBtdXRhdGVkUmVsZXZhbnRFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50QWRkJywgZXZlbnRBZGRBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFTEVDVF9FVkVOVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VJZDogZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2Ryb3AnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZmluYWxIaXQuZGF0ZVNwYW4sIHJlY2VpdmluZ0NvbnRleHQpKSwgeyBkcmFnZ2VkRWw6IGV2LnN1YmplY3RFbCwganNFdmVudDogZXYub3JpZ0V2ZW50LCB2aWV3OiBmaW5hbEhpdC5jb250ZXh0LnZpZXdBcGkgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVjZWl2ZScsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRBZGRBcmcpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCB2aWV3OiBmaW5hbEhpdC5jb250ZXh0LnZpZXdBcGkgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ19ub0V2ZW50RHJvcCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICBsZXQgZHJhZ2dpbmcgPSB0aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gRXZlbnREcmFnZ2luZy5TRUxFQ1RPUjtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBvcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIGxldCBoaXREcmFnZ2luZyA9IHRoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcodGhpcy5kcmFnZ2luZywgaW50ZXJuYWxfY2pzLmludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLnVzZVN1YmplY3RDZW50ZXIgPSBzZXR0aW5ncy51c2VFdmVudENlbnRlcjtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCB0aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvLyByZW5kZXIgYSBkcmFnIHN0YXRlIG9uIHRoZSBuZXh0IHJlY2VpdmluZ0NhbGVuZGFyXG4gICAgZGlzcGxheURyYWcobmV4dENvbnRleHQsIHN0YXRlKSB7XG4gICAgICAgIGxldCBpbml0aWFsQ29udGV4dCA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIGxldCBwcmV2Q29udGV4dCA9IHRoaXMucmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgLy8gZG9lcyB0aGUgcHJldmlvdXMgY2FsZW5kYXIgbmVlZCB0byBiZSBjbGVhcmVkP1xuICAgICAgICBpZiAocHJldkNvbnRleHQgJiYgcHJldkNvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICAvLyBkb2VzIHRoZSBpbml0aWFsIGNhbGVuZGFyIG5lZWQgdG8gYmUgY2xlYXJlZD9cbiAgICAgICAgICAgIC8vIGlmIHNvLCBkb24ndCBjbGVhciBhbGwgdGhlIHdheS4gd2Ugc3RpbGwgbmVlZCB0byB0byBoaWRlIHRoZSBhZmZlY3RlZEV2ZW50c1xuICAgICAgICAgICAgaWYgKHByZXZDb250ZXh0ID09PSBpbml0aWFsQ29udGV4dCkge1xuICAgICAgICAgICAgICAgIHByZXZDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9FVkVOVF9EUkFHJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiBzdGF0ZS5hZmZlY3RlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gY29tcGxldGVseSBjbGVhciB0aGUgb2xkIGNhbGVuZGFyIGlmIGl0IHdhc24ndCB0aGUgaW5pdGlhbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldkNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICBuZXh0Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsIHN0YXRlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyRHJhZygpIHtcbiAgICAgICAgbGV0IGluaXRpYWxDYWxlbmRhciA9IHRoaXMuY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIGxldCB7IHJlY2VpdmluZ0NvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGlmIChyZWNlaXZpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBpbml0aWFsIGNhbGVuZGFyIG1pZ2h0IGhhdmUgYW4gZHVtbXkgZHJhZyBzdGF0ZSBmcm9tIGRpc3BsYXlEcmFnXG4gICAgICAgIGlmIChpbml0aWFsQ2FsZW5kYXIgIT09IHJlY2VpdmluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgIGluaXRpYWxDYWxlbmRhci5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9EUkFHJyB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICB0aGlzLnN1YmplY3RTZWcgPSBudWxsO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudFJhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVjZWl2aW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMudmFsaWRNdXRhdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICB9XG59XG4vLyBUT0RPOiB0ZXN0IHRoaXMgaW4gSUUxMVxuLy8gUVVFU1RJT046IHdoeSBkbyB3ZSBuZWVkIGl0IG9uIHRoZSByZXNpemFibGU/Pz9cbkV2ZW50RHJhZ2dpbmcuU0VMRUNUT1IgPSAnLmZjLWV2ZW50LWRyYWdnYWJsZSwgLmZjLWV2ZW50LXJlc2l6YWJsZSc7XG5mdW5jdGlvbiBjb21wdXRlRXZlbnRNdXRhdGlvbihoaXQwLCBoaXQxLCBtYXNzYWdlcnMpIHtcbiAgICBsZXQgZGF0ZVNwYW4wID0gaGl0MC5kYXRlU3BhbjtcbiAgICBsZXQgZGF0ZVNwYW4xID0gaGl0MS5kYXRlU3BhbjtcbiAgICBsZXQgZGF0ZTAgPSBkYXRlU3BhbjAucmFuZ2Uuc3RhcnQ7XG4gICAgbGV0IGRhdGUxID0gZGF0ZVNwYW4xLnJhbmdlLnN0YXJ0O1xuICAgIGxldCBzdGFuZGFyZFByb3BzID0ge307XG4gICAgaWYgKGRhdGVTcGFuMC5hbGxEYXkgIT09IGRhdGVTcGFuMS5hbGxEYXkpIHtcbiAgICAgICAgc3RhbmRhcmRQcm9wcy5hbGxEYXkgPSBkYXRlU3BhbjEuYWxsRGF5O1xuICAgICAgICBzdGFuZGFyZFByb3BzLmhhc0VuZCA9IGhpdDEuY29udGV4dC5vcHRpb25zLmFsbERheU1haW50YWluRHVyYXRpb247XG4gICAgICAgIGlmIChkYXRlU3BhbjEuYWxsRGF5KSB7XG4gICAgICAgICAgICAvLyBtZWFucyBkYXRlMSBpcyBhbHJlYWR5IHN0YXJ0LW9mLWRheSxcbiAgICAgICAgICAgIC8vIGJ1dCBkYXRlMCBuZWVkcyB0byBiZSBjb252ZXJ0ZWRcbiAgICAgICAgICAgIGRhdGUwID0gaW50ZXJuYWxfY2pzLnN0YXJ0T2ZEYXkoZGF0ZTApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBkZWx0YSA9IGludGVybmFsX2Nqcy5kaWZmRGF0ZXMoZGF0ZTAsIGRhdGUxLCBoaXQwLmNvbnRleHQuZGF0ZUVudiwgaGl0MC5jb21wb25lbnRJZCA9PT0gaGl0MS5jb21wb25lbnRJZCA/XG4gICAgICAgIGhpdDAubGFyZ2VVbml0IDpcbiAgICAgICAgbnVsbCk7XG4gICAgaWYgKGRlbHRhLm1pbGxpc2Vjb25kcykgeyAvLyBoYXMgaG91cnMvbWludXRlcy9zZWNvbmRzXG4gICAgICAgIHN0YW5kYXJkUHJvcHMuYWxsRGF5ID0gZmFsc2U7XG4gICAgfVxuICAgIGxldCBtdXRhdGlvbiA9IHtcbiAgICAgICAgZGF0ZXNEZWx0YTogZGVsdGEsXG4gICAgICAgIHN0YW5kYXJkUHJvcHMsXG4gICAgfTtcbiAgICBmb3IgKGxldCBtYXNzYWdlciBvZiBtYXNzYWdlcnMpIHtcbiAgICAgICAgbWFzc2FnZXIobXV0YXRpb24sIGhpdDAsIGhpdDEpO1xuICAgIH1cbiAgICByZXR1cm4gbXV0YXRpb247XG59XG5mdW5jdGlvbiBnZXRDb21wb25lbnRUb3VjaERlbGF5KGNvbXBvbmVudCkge1xuICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgIGxldCBkZWxheSA9IG9wdGlvbnMuZXZlbnRMb25nUHJlc3NEZWxheTtcbiAgICBpZiAoZGVsYXkgPT0gbnVsbCkge1xuICAgICAgICBkZWxheSA9IG9wdGlvbnMubG9uZ1ByZXNzRGVsYXk7XG4gICAgfVxuICAgIHJldHVybiBkZWxheTtcbn1cblxuY2xhc3MgRXZlbnRSZXNpemluZyBleHRlbmRzIGludGVybmFsX2Nqcy5JbnRlcmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xuICAgICAgICAvLyBpbnRlcm5hbCBzdGF0ZVxuICAgICAgICB0aGlzLmRyYWdnaW5nU2VnRWwgPSBudWxsO1xuICAgICAgICB0aGlzLmRyYWdnaW5nU2VnID0gbnVsbDsgLy8gVE9ETzogcmVuYW1lIHRvIHJlc2l6aW5nU2VnPyBzdWJqZWN0U2VnP1xuICAgICAgICB0aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgc2VnRWwgPSB0aGlzLnF1ZXJ5U2VnRWwoZXYpO1xuICAgICAgICAgICAgbGV0IHNlZyA9IGludGVybmFsX2Nqcy5nZXRFbFNlZyhzZWdFbCk7XG4gICAgICAgICAgICBsZXQgZXZlbnRSYW5nZSA9IHRoaXMuZXZlbnRSYW5nZSA9IHNlZy5ldmVudFJhbmdlO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5taW5EaXN0YW5jZSA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgbmVlZCB0byBiZSB3b3JraW5nIHdpdGggYSBzZWxlY3RlZCBldmVudFxuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5zZXRJZ25vcmVNb3ZlKCF0aGlzLmNvbXBvbmVudC5pc1ZhbGlkU2VnRG93bkVsKGV2Lm9yaWdFdmVudC50YXJnZXQpIHx8XG4gICAgICAgICAgICAgICAgKGV2LmlzVG91Y2ggJiYgdGhpcy5jb21wb25lbnQucHJvcHMuZXZlbnRTZWxlY3Rpb24gIT09IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICBsZXQgZXZlbnRSYW5nZSA9IHRoaXMuZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHRoaXMucmVsZXZhbnRFdmVudHMgPSBpbnRlcm5hbF9janMuZ2V0UmVsZXZhbnRFdmVudHMoY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50U3RvcmUsIHRoaXMuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkKTtcbiAgICAgICAgICAgIGxldCBzZWdFbCA9IHRoaXMucXVlcnlTZWdFbChldik7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nU2VnRWwgPSBzZWdFbDtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmdTZWcgPSBpbnRlcm5hbF9janMuZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdCgpO1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplU3RhcnQnLCB7XG4gICAgICAgICAgICAgICAgZWw6IHNlZ0VsLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgaW50ZXJuYWxfY2pzLkV2ZW50SW1wbChjb250ZXh0LCBldmVudFJhbmdlLmRlZiwgZXZlbnRSYW5nZS5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAganNFdmVudDogZXYub3JpZ0V2ZW50LFxuICAgICAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IChoaXQsIGlzRmluYWwsIGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGxldCByZWxldmFudEV2ZW50cyA9IHRoaXMucmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICBsZXQgaW5pdGlhbEhpdCA9IHRoaXMuaGl0RHJhZ2dpbmcuaW5pdGlhbEhpdDtcbiAgICAgICAgICAgIGxldCBldmVudEluc3RhbmNlID0gdGhpcy5ldmVudFJhbmdlLmluc3RhbmNlO1xuICAgICAgICAgICAgbGV0IG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGlzSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVyYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGRpc2FsbG93ZWQgPSBoaXQuY29tcG9uZW50SWQgPT09IGluaXRpYWxIaXQuY29tcG9uZW50SWRcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5pc0hpdENvbWJvQWxsb3dlZFxuICAgICAgICAgICAgICAgICAgICAmJiAhdGhpcy5pc0hpdENvbWJvQWxsb3dlZChpbml0aWFsSGl0LCBoaXQpO1xuICAgICAgICAgICAgICAgIGlmICghZGlzYWxsb3dlZCkge1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbiA9IGNvbXB1dGVNdXRhdGlvbihpbml0aWFsSGl0LCBoaXQsIGV2LnN1YmplY3RFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZjLWV2ZW50LXJlc2l6ZXItc3RhcnQnKSwgZXZlbnRJbnN0YW5jZS5yYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gaW50ZXJuYWxfY2pzLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUocmVsZXZhbnRFdmVudHMsIGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFVpQmFzZXMsIG11dGF0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gbXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWxfY2pzLmlzSW50ZXJhY3Rpb25WYWxpZChpbnRlcmFjdGlvbiwgaGl0LmRhdGVQcm9maWxlLCBjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtdXRhdGVkUmVsZXZhbnRFdmVudHMpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9FVkVOVF9SRVNJWkUnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogaW50ZXJhY3Rpb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX1JFU0laRScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5lbmFibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5kaXNhYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24gJiYgaXNIaXRzRXF1YWwoaW5pdGlhbEhpdCwgaGl0KSkge1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRNdXRhdGlvbiA9IG11dGF0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGNvbnRleHQgfSA9IHRoaXMuY29tcG9uZW50O1xuICAgICAgICAgICAgbGV0IGV2ZW50RGVmID0gdGhpcy5ldmVudFJhbmdlLmRlZjtcbiAgICAgICAgICAgIGxldCBldmVudEluc3RhbmNlID0gdGhpcy5ldmVudFJhbmdlLmluc3RhbmNlO1xuICAgICAgICAgICAgbGV0IGV2ZW50QXBpID0gbmV3IGludGVybmFsX2Nqcy5FdmVudEltcGwoY29udGV4dCwgZXZlbnREZWYsIGV2ZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgbGV0IHJlbGV2YW50RXZlbnRzID0gdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGxldCBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSB0aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlc2l6ZVN0b3AnLCB7XG4gICAgICAgICAgICAgICAgZWw6IHRoaXMuZHJhZ2dpbmdTZWdFbCxcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAganNFdmVudDogZXYub3JpZ0V2ZW50LFxuICAgICAgICAgICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRNdXRhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkRXZlbnRBcGkgPSBuZXcgaW50ZXJuYWxfY2pzLkV2ZW50SW1wbChjb250ZXh0LCBtdXRhdGVkUmVsZXZhbnRFdmVudHMuZGVmc1tldmVudERlZi5kZWZJZF0sIGV2ZW50SW5zdGFuY2UgPyBtdXRhdGVkUmVsZXZhbnRFdmVudHMuaW5zdGFuY2VzW2V2ZW50SW5zdGFuY2UuaW5zdGFuY2VJZF0gOiBudWxsKTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnRDaGFuZ2VBcmcgPSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHVwZGF0ZWRFdmVudEFwaSxcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogaW50ZXJuYWxfY2pzLmJ1aWxkRXZlbnRBcGlzKG11dGF0ZWRSZWxldmFudEV2ZW50cywgY29udGV4dCwgZXZlbnRJbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IHJlbGV2YW50RXZlbnRzLCAvLyB0aGUgcHJlLWNoYW5nZSBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplJywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudENoYW5nZUFyZyksIHsgZWw6IHRoaXMuZHJhZ2dpbmdTZWdFbCwgc3RhcnREZWx0YTogdGhpcy52YWxpZE11dGF0aW9uLnN0YXJ0RGVsdGEgfHwgaW50ZXJuYWxfY2pzLmNyZWF0ZUR1cmF0aW9uKDApLCBlbmREZWx0YTogdGhpcy52YWxpZE11dGF0aW9uLmVuZERlbHRhIHx8IGludGVybmFsX2Nqcy5jcmVhdGVEdXJhdGlvbigwKSwganNFdmVudDogZXYub3JpZ0V2ZW50LCB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfSkpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudENoYW5nZScsIGV2ZW50Q2hhbmdlQXJnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdfbm9FdmVudFJlc2l6ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVzZXQgYWxsIGludGVybmFsIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nU2VnID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIC8vIG9rYXkgdG8ga2VlcCBldmVudEluc3RhbmNlIGFyb3VuZC4gdXNlZnVsIHRvIHNldCBpdCBpbiBoYW5kbGVQb2ludGVyRG93blxuICAgICAgICB9O1xuICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHNldHRpbmdzO1xuICAgICAgICBsZXQgZHJhZ2dpbmcgPSB0aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gJy5mYy1ldmVudC1yZXNpemVyJztcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBjb21wb25lbnQuY29udGV4dC5vcHRpb25zLmRyYWdTY3JvbGw7XG4gICAgICAgIGxldCBoaXREcmFnZ2luZyA9IHRoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcodGhpcy5kcmFnZ2luZywgaW50ZXJuYWxfY2pzLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlKHNldHRpbmdzKSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfVxuICAgIHF1ZXJ5U2VnRWwoZXYpIHtcbiAgICAgICAgcmV0dXJuIGludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChldi5zdWJqZWN0RWwsICcuZmMtZXZlbnQnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjb21wdXRlTXV0YXRpb24oaGl0MCwgaGl0MSwgaXNGcm9tU3RhcnQsIGluc3RhbmNlUmFuZ2UpIHtcbiAgICBsZXQgZGF0ZUVudiA9IGhpdDAuY29udGV4dC5kYXRlRW52O1xuICAgIGxldCBkYXRlMCA9IGhpdDAuZGF0ZVNwYW4ucmFuZ2Uuc3RhcnQ7XG4gICAgbGV0IGRhdGUxID0gaGl0MS5kYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICBsZXQgZGVsdGEgPSBpbnRlcm5hbF9janMuZGlmZkRhdGVzKGRhdGUwLCBkYXRlMSwgZGF0ZUVudiwgaGl0MC5sYXJnZVVuaXQpO1xuICAgIGlmIChpc0Zyb21TdGFydCkge1xuICAgICAgICBpZiAoZGF0ZUVudi5hZGQoaW5zdGFuY2VSYW5nZS5zdGFydCwgZGVsdGEpIDwgaW5zdGFuY2VSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0RGVsdGE6IGRlbHRhIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0ZUVudi5hZGQoaW5zdGFuY2VSYW5nZS5lbmQsIGRlbHRhKSA+IGluc3RhbmNlUmFuZ2Uuc3RhcnQpIHtcbiAgICAgICAgcmV0dXJuIHsgZW5kRGVsdGE6IGRlbHRhIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jbGFzcyBVbnNlbGVjdEF1dG8ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0ID0gZmFsc2U7IC8vIHdpc2ggd2UgY291bGQgdXNlIGEgc2VsZWN0b3IgdG8gZGV0ZWN0IGRhdGUgc2VsZWN0aW9uLCBidXQgdXNlcyBoaXQgc3lzdGVtXG4gICAgICAgIHRoaXMubWF0Y2hlc0NhbmNlbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1hdGNoZXNFdmVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uU2VsZWN0ID0gKHNlbGVjdEluZm8pID0+IHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RJbmZvLmpzRXZlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uRG9jdW1lbnRQb2ludGVyRG93biA9IChwZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB1bnNlbGVjdENhbmNlbCA9IHRoaXMuY29udGV4dC5vcHRpb25zLnVuc2VsZWN0Q2FuY2VsO1xuICAgICAgICAgICAgbGV0IGRvd25FbCA9IGludGVybmFsX2Nqcy5nZXRFdmVudFRhcmdldFZpYVJvb3QocGV2Lm9yaWdFdmVudCk7XG4gICAgICAgICAgICB0aGlzLm1hdGNoZXNDYW5jZWwgPSAhIWludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChkb3duRWwsIHVuc2VsZWN0Q2FuY2VsKTtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0V2ZW50ID0gISFpbnRlcm5hbF9janMuZWxlbWVudENsb3Nlc3QoZG93bkVsLCBFdmVudERyYWdnaW5nLlNFTEVDVE9SKTsgLy8gaW50ZXJhY3Rpb24gc3RhcnRlZCBvbiBhbiBldmVudD9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50UG9pbnRlclVwID0gKHBldikgPT4ge1xuICAgICAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IGRvY3VtZW50UG9pbnRlciB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCBjYWxlbmRhclN0YXRlID0gY29udGV4dC5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICAgICAgLy8gdG91Y2gtc2Nyb2xsaW5nIHNob3VsZCBuZXZlciB1bmZvY3VzIGFueSB0eXBlIG9mIHNlbGVjdGlvblxuICAgICAgICAgICAgaWYgKCFkb2N1bWVudFBvaW50ZXIud2FzVG91Y2hTY3JvbGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTdGF0ZS5kYXRlU2VsZWN0aW9uICYmIC8vIGFuIGV4aXN0aW5nIGRhdGUgc2VsZWN0aW9uP1xuICAgICAgICAgICAgICAgICAgICAhdGhpcy5pc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0IC8vIGEgbmV3IHBvaW50ZXItaW5pdGlhdGVkIGRhdGUgc2VsZWN0aW9uIHNpbmNlIGxhc3Qgb25Eb2N1bWVudFBvaW50ZXJVcD9cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVuc2VsZWN0QXV0byA9IGNvbnRleHQub3B0aW9ucy51bnNlbGVjdEF1dG87XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bnNlbGVjdEF1dG8gJiYgKCF1bnNlbGVjdEF1dG8gfHwgIXRoaXMubWF0Y2hlc0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY2FsZW5kYXJBcGkudW5zZWxlY3QocGV2KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTdGF0ZS5ldmVudFNlbGVjdGlvbiAmJiAvLyBhbiBleGlzdGluZyBldmVudCBzZWxlY3RlZD9cbiAgICAgICAgICAgICAgICAgICAgIXRoaXMubWF0Y2hlc0V2ZW50IC8vIGludGVyYWN0aW9uIERJRE4nVCBzdGFydCBvbiBhbiBldmVudFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VMRUNUX0VWRU5UJyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgPSBmYWxzZTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGRvY3VtZW50UG9pbnRlciA9IHRoaXMuZG9jdW1lbnRQb2ludGVyID0gbmV3IFBvaW50ZXJEcmFnZ2luZyhkb2N1bWVudCk7XG4gICAgICAgIGRvY3VtZW50UG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlID0gdHJ1ZTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLnNob3VsZFdhdGNoU2Nyb2xsID0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50UG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMub25Eb2N1bWVudFBvaW50ZXJEb3duKTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMub25Eb2N1bWVudFBvaW50ZXJVcCk7XG4gICAgICAgIC8qXG4gICAgICAgIFRPRE86IGJldHRlciB3YXkgdG8ga25vdyBhYm91dCB3aGV0aGVyIHRoZXJlIHdhcyBhIHNlbGVjdGlvbiB3aXRoIHRoZSBwb2ludGVyXG4gICAgICAgICovXG4gICAgICAgIGNvbnRleHQuZW1pdHRlci5vbignc2VsZWN0JywgdGhpcy5vblNlbGVjdCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5lbWl0dGVyLm9mZignc2VsZWN0JywgdGhpcy5vblNlbGVjdCk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRQb2ludGVyLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbmNvbnN0IE9QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBmaXhlZE1pcnJvclBhcmVudDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxufTtcbmNvbnN0IExJU1RFTkVSX1JFRklORVJTID0ge1xuICAgIGRhdGVDbGljazogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50RHJhZ1N0YXJ0OiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG4gICAgZXZlbnREcmFnU3RvcDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50RHJvcDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50UmVzaXplU3RhcnQ6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbiAgICBldmVudFJlc2l6ZVN0b3A6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbiAgICBldmVudFJlc2l6ZTogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGRyb3A6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbiAgICBldmVudFJlY2VpdmU6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbiAgICBldmVudExlYXZlOiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG59O1xuXG4vKlxuR2l2ZW4gYW4gYWxyZWFkeSBpbnN0YW50aWF0ZWQgZHJhZ2dhYmxlIG9iamVjdCBmb3Igb25lLW9yLW1vcmUgZWxlbWVudHMsXG5JbnRlcnByZXRzIGFueSBkcmFnZ2luZyBhcyBhbiBhdHRlbXB0IHRvIGRyYWcgYW4gZXZlbnRzIHRoYXQgbGl2ZXMgb3V0c2lkZVxub2YgYSBjYWxlbmRhciBvbnRvIGEgY2FsZW5kYXIuXG4qL1xuY2xhc3MgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGRyYWdnaW5nLCBzdXBwbGllZERyYWdNZXRhKSB7XG4gICAgICAgIHRoaXMucmVjZWl2aW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJvcHBhYmxlRXZlbnQgPSBudWxsOyAvLyB3aWxsIGV4aXN0IGZvciBhbGwgZHJhZ3MsIGV2ZW4gaWYgY3JlYXRlOmZhbHNlXG4gICAgICAgIHRoaXMuc3VwcGxpZWREcmFnTWV0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJhZ01ldGEgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IChldikgPT4ge1xuICAgICAgICAgICAgdGhpcy5kcmFnTWV0YSA9IHRoaXMuYnVpbGREcmFnTWV0YShldi5zdWJqZWN0RWwpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IChoaXQsIGlzRmluYWwsIGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkcmFnZ2luZyB9ID0gdGhpcy5oaXREcmFnZ2luZztcbiAgICAgICAgICAgIGxldCByZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBtdXRhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICAgICAgaXNFdmVudDogdGhpcy5kcmFnTWV0YS5jcmVhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGhpdCkge1xuICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQgPSBoaXQuY29udGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYW5Ecm9wRWxPbkNhbGVuZGFyKGV2LnN1YmplY3RFbCwgcmVjZWl2aW5nQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcHBhYmxlRXZlbnQgPSBjb21wdXRlRXZlbnRGb3JEYXRlU3BhbihoaXQuZGF0ZVNwYW4sIHRoaXMuZHJhZ01ldGEsIHJlY2VpdmluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzID0gaW50ZXJuYWxfY2pzLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgaXNJbnZhbGlkID0gIWludGVybmFsX2Nqcy5pc0ludGVyYWN0aW9uVmFsaWQoaW50ZXJhY3Rpb24sIGhpdC5kYXRlUHJvZmlsZSwgcmVjZWl2aW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBpbnRlcm5hbF9janMuY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlEcmFnKHJlY2VpdmluZ0NvbnRleHQsIGludGVyYWN0aW9uKTtcbiAgICAgICAgICAgIC8vIHNob3cgbWlycm9yIGlmIG5vIGFscmVhZHktcmVuZGVyZWQgbWlycm9yIGVsZW1lbnQgT1IgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gdGhlIG1pcnJvciAoPylcbiAgICAgICAgICAgIC8vIFRPRE86IHdpc2ggd2UgY291bGQgc29tZWhvdyB3YWl0IGZvciBkaXNwYXRjaCB0byBndWFyYW50ZWUgcmVuZGVyXG4gICAgICAgICAgICBkcmFnZ2luZy5zZXRNaXJyb3JJc1Zpc2libGUoaXNGaW5hbCB8fCAhZHJvcHBhYmxlRXZlbnQgfHwgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mYy1ldmVudC1taXJyb3InKSk7XG4gICAgICAgICAgICBpZiAoIWlzSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5lbmFibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5kaXNhYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICAgICAgICBkcmFnZ2luZy5zZXRNaXJyb3JOZWVkc1JldmVydCghZHJvcHBhYmxlRXZlbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nQ29udGV4dCA9IHJlY2VpdmluZ0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wcGFibGVFdmVudCA9IGRyb3BwYWJsZUV2ZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSAocGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyByZWNlaXZpbmdDb250ZXh0LCBkcm9wcGFibGVFdmVudCB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuY2xlYXJEcmFnKCk7XG4gICAgICAgICAgICBpZiAocmVjZWl2aW5nQ29udGV4dCAmJiBkcm9wcGFibGVFdmVudCkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEhpdCA9IHRoaXMuaGl0RHJhZ2dpbmcuZmluYWxIaXQ7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsVmlldyA9IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaTtcbiAgICAgICAgICAgICAgICBsZXQgZHJhZ01ldGEgPSB0aGlzLmRyYWdNZXRhO1xuICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdkcm9wJywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBidWlsZERhdGVQb2ludEFwaVdpdGhDb250ZXh0KGZpbmFsSGl0LmRhdGVTcGFuLCByZWNlaXZpbmdDb250ZXh0KSksIHsgZHJhZ2dlZEVsOiBwZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBwZXYub3JpZ0V2ZW50LCB2aWV3OiBmaW5hbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgIGlmIChkcmFnTWV0YS5jcmVhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkZGluZ0V2ZW50cyA9IGludGVybmFsX2Nqcy5ldmVudFR1cGxlVG9TdG9yZShkcm9wcGFibGVFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBhZGRpbmdFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRUxFQ1RfRVZFTlQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VJZDogZHJvcHBhYmxlRXZlbnQuaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hbCB0aGF0IGFuIGV4dGVybmFsIGV2ZW50IGxhbmRlZFxuICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZWNlaXZlJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKHJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50LmRlZiwgZHJvcHBhYmxlRXZlbnQuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICByZXZlcnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogYWRkaW5nRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRFbDogcGV2LnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXc6IGZpbmFsVmlldyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZHJvcHBhYmxlRXZlbnQgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgaGl0RHJhZ2dpbmcgPSB0aGlzLmhpdERyYWdnaW5nID0gbmV3IEhpdERyYWdnaW5nKGRyYWdnaW5nLCBpbnRlcm5hbF9janMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcucmVxdWlyZUluaXRpYWwgPSBmYWxzZTsgLy8gd2lsbCBzdGFydCBvdXRzaWRlIG9mIGEgY29tcG9uZW50XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0KTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignaGl0dXBkYXRlJywgdGhpcy5oYW5kbGVIaXRVcGRhdGUpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICAgICAgdGhpcy5zdXBwbGllZERyYWdNZXRhID0gc3VwcGxpZWREcmFnTWV0YTtcbiAgICB9XG4gICAgYnVpbGREcmFnTWV0YShzdWJqZWN0RWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxfY2pzLnBhcnNlRHJhZ01ldGEodGhpcy5zdXBwbGllZERyYWdNZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3VwcGxpZWREcmFnTWV0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGludGVybmFsX2Nqcy5wYXJzZURyYWdNZXRhKHRoaXMuc3VwcGxpZWREcmFnTWV0YShzdWJqZWN0RWwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0RHJhZ01ldGFGcm9tRWwoc3ViamVjdEVsKTtcbiAgICB9XG4gICAgZGlzcGxheURyYWcobmV4dENvbnRleHQsIHN0YXRlKSB7XG4gICAgICAgIGxldCBwcmV2Q29udGV4dCA9IHRoaXMucmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgaWYgKHByZXZDb250ZXh0ICYmIHByZXZDb250ZXh0ICE9PSBuZXh0Q29udGV4dCkge1xuICAgICAgICAgICAgcHJldkNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICBuZXh0Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfRVZFTlRfRFJBRycsIHN0YXRlIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyRHJhZygpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNhbkRyb3BFbE9uQ2FsZW5kYXIoZWwsIHJlY2VpdmluZ0NvbnRleHQpIHtcbiAgICAgICAgbGV0IGRyb3BBY2NlcHQgPSByZWNlaXZpbmdDb250ZXh0Lm9wdGlvbnMuZHJvcEFjY2VwdDtcbiAgICAgICAgaWYgKHR5cGVvZiBkcm9wQWNjZXB0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZHJvcEFjY2VwdC5jYWxsKHJlY2VpdmluZ0NvbnRleHQuY2FsZW5kYXJBcGksIGVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRyb3BBY2NlcHQgPT09ICdzdHJpbmcnICYmIGRyb3BBY2NlcHQpIHtcbiAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGludGVybmFsX2Nqcy5lbGVtZW50TWF0Y2hlcyhlbCwgZHJvcEFjY2VwdCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbi8vIFV0aWxzIGZvciBjb21wdXRpbmcgZXZlbnQgc3RvcmUgZnJvbSB0aGUgRHJhZ01ldGFcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNvbXB1dGVFdmVudEZvckRhdGVTcGFuKGRhdGVTcGFuLCBkcmFnTWV0YSwgY29udGV4dCkge1xuICAgIGxldCBkZWZQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIGRyYWdNZXRhLmxlZnRvdmVyUHJvcHMpO1xuICAgIGZvciAobGV0IHRyYW5zZm9ybSBvZiBjb250ZXh0LnBsdWdpbkhvb2tzLmV4dGVybmFsRGVmVHJhbnNmb3Jtcykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGRlZlByb3BzLCB0cmFuc2Zvcm0oZGF0ZVNwYW4sIGRyYWdNZXRhKSk7XG4gICAgfVxuICAgIGxldCB7IHJlZmluZWQsIGV4dHJhIH0gPSBpbnRlcm5hbF9janMucmVmaW5lRXZlbnREZWYoZGVmUHJvcHMsIGNvbnRleHQpO1xuICAgIGxldCBkZWYgPSBpbnRlcm5hbF9janMucGFyc2VFdmVudERlZihyZWZpbmVkLCBleHRyYSwgZHJhZ01ldGEuc291cmNlSWQsIGRhdGVTcGFuLmFsbERheSwgY29udGV4dC5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbiB8fCBCb29sZWFuKGRyYWdNZXRhLmR1cmF0aW9uKSwgLy8gaGFzRW5kXG4gICAgY29udGV4dCk7XG4gICAgbGV0IHN0YXJ0ID0gZGF0ZVNwYW4ucmFuZ2Uuc3RhcnQ7XG4gICAgLy8gb25seSByZWx5IG9uIHRpbWUgaW5mbyBpZiBkcm9wIHpvbmUgaXMgYWxsLWRheSxcbiAgICAvLyBvdGhlcndpc2UsIHdlIGFscmVhZHkga25vdyB0aGUgdGltZVxuICAgIGlmIChkYXRlU3Bhbi5hbGxEYXkgJiYgZHJhZ01ldGEuc3RhcnRUaW1lKSB7XG4gICAgICAgIHN0YXJ0ID0gY29udGV4dC5kYXRlRW52LmFkZChzdGFydCwgZHJhZ01ldGEuc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgbGV0IGVuZCA9IGRyYWdNZXRhLmR1cmF0aW9uID9cbiAgICAgICAgY29udGV4dC5kYXRlRW52LmFkZChzdGFydCwgZHJhZ01ldGEuZHVyYXRpb24pIDpcbiAgICAgICAgaW50ZXJuYWxfY2pzLmdldERlZmF1bHRFdmVudEVuZChkYXRlU3Bhbi5hbGxEYXksIHN0YXJ0LCBjb250ZXh0KTtcbiAgICBsZXQgaW5zdGFuY2UgPSBpbnRlcm5hbF9janMuY3JlYXRlRXZlbnRJbnN0YW5jZShkZWYuZGVmSWQsIHsgc3RhcnQsIGVuZCB9KTtcbiAgICByZXR1cm4geyBkZWYsIGluc3RhbmNlIH07XG59XG4vLyBVdGlscyBmb3IgZXh0cmFjdGluZyBkYXRhIGZyb20gZWxlbWVudFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZ2V0RHJhZ01ldGFGcm9tRWwoZWwpIHtcbiAgICBsZXQgc3RyID0gZ2V0RW1iZWRkZWRFbERhdGEoZWwsICdldmVudCcpO1xuICAgIGxldCBvYmogPSBzdHIgP1xuICAgICAgICBKU09OLnBhcnNlKHN0cikgOlxuICAgICAgICB7IGNyZWF0ZTogZmFsc2UgfTsgLy8gaWYgbm8gZW1iZWRkZWQgZGF0YSwgYXNzdW1lIG5vIGV2ZW50IGNyZWF0aW9uXG4gICAgcmV0dXJuIGludGVybmFsX2Nqcy5wYXJzZURyYWdNZXRhKG9iaik7XG59XG5pbnRlcm5hbF9janMuY29uZmlnLmRhdGFBdHRyUHJlZml4ID0gJyc7XG5mdW5jdGlvbiBnZXRFbWJlZGRlZEVsRGF0YShlbCwgbmFtZSkge1xuICAgIGxldCBwcmVmaXggPSBpbnRlcm5hbF9janMuY29uZmlnLmRhdGFBdHRyUHJlZml4O1xuICAgIGxldCBwcmVmaXhlZE5hbWUgPSAocHJlZml4ID8gcHJlZml4ICsgJy0nIDogJycpICsgbmFtZTtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLScgKyBwcmVmaXhlZE5hbWUpIHx8ICcnO1xufVxuXG4vKlxuTWFrZXMgYW4gZWxlbWVudCAodGhhdCBpcyAqZXh0ZXJuYWwqIHRvIGFueSBjYWxlbmRhcikgZHJhZ2dhYmxlLlxuQ2FuIHBhc3MgaW4gZGF0YSB0aGF0IGRldGVybWluZXMgaG93IGFuIGV2ZW50IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGRyb3BwZWQgb250byBhIGNhbGVuZGFyLlxuTGV2ZXJhZ2VzIEZ1bGxDYWxlbmRhcidzIGludGVybmFsIGRyYWctbi1kcm9wIGZ1bmN0aW9uYWxpdHkgV0lUSE9VVCBhIHRoaXJkLXBhcnR5IGRyYWcgc3lzdGVtLlxuKi9cbmNsYXNzIEV4dGVybmFsRHJhZ2dhYmxlIHtcbiAgICBjb25zdHJ1Y3RvcihlbCwgc2V0dGluZ3MgPSB7fSkge1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkcmFnZ2luZyB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IG1pbkRpc3RhbmNlLCBsb25nUHJlc3NEZWxheSB9ID0gdGhpcy5zZXR0aW5ncztcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pbkRpc3RhbmNlID1cbiAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSAhPSBudWxsID9cbiAgICAgICAgICAgICAgICAgICAgbWluRGlzdGFuY2UgOlxuICAgICAgICAgICAgICAgICAgICAoZXYuaXNUb3VjaCA/IDAgOiBpbnRlcm5hbF9janMuQkFTRV9PUFRJT05fREVGQVVMVFMuZXZlbnREcmFnTWluRGlzdGFuY2UpO1xuICAgICAgICAgICAgZHJhZ2dpbmcuZGVsYXkgPVxuICAgICAgICAgICAgICAgIGV2LmlzVG91Y2ggPyAvLyBUT0RPOiBldmVudHVhbGx5IHJlYWQgZXZlbnRMb25nUHJlc3NEZWxheSBpbnN0ZWFkIHZ2dlxuICAgICAgICAgICAgICAgICAgICAobG9uZ1ByZXNzRGVsYXkgIT0gbnVsbCA/IGxvbmdQcmVzc0RlbGF5IDogaW50ZXJuYWxfY2pzLkJBU0VfT1BUSU9OX0RFRkFVTFRTLmxvbmdQcmVzc0RlbGF5KSA6XG4gICAgICAgICAgICAgICAgICAgIDA7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXYuaXNUb3VjaCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVsYXkgJiZcbiAgICAgICAgICAgICAgICBldi5zdWJqZWN0RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdmYy1ldmVudCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5taXJyb3IuZ2V0TWlycm9yRWwoKS5jbGFzc0xpc3QuYWRkKCdmYy1ldmVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgICAgIGxldCBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhlbCk7XG4gICAgICAgIGRyYWdnaW5nLnRvdWNoU2Nyb2xsQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoc2V0dGluZ3MuaXRlbVNlbGVjdG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSBzZXR0aW5ncy5pdGVtU2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLmFwcGVuZFRvICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pcnJvci5wYXJlbnROb2RlID0gc2V0dGluZ3MuYXBwZW5kVG87IC8vIFRPRE86IHdyaXRlIHRlc3RzXG4gICAgICAgIH1cbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBuZXcgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcoZHJhZ2dpbmcsIHNldHRpbmdzLmV2ZW50RGF0YSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH1cbn1cblxuLypcbkRldGVjdHMgd2hlbiBhICpUSElSRC1QQVJUWSogZHJhZy1uLWRyb3Agc3lzdGVtIGludGVyYWN0cyB3aXRoIGVsZW1lbnRzLlxuVGhlIHRoaXJkLXBhcnR5IHN5c3RlbSBpcyByZXNwb25zaWJsZSBmb3IgZHJhd2luZyB0aGUgdmlzdWFscyBlZmZlY3RzIG9mIHRoZSBkcmFnLlxuVGhpcyBjbGFzcyBzaW1wbHkgbW9uaXRvcnMgZm9yIHBvaW50ZXIgbW92ZW1lbnRzIGFuZCBmaXJlcyBldmVudHMuXG5JdCBhbHNvIGhhcyB0aGUgYWJpbGl0eSB0byBoaWRlIHRoZSBtb3ZpbmcgZWxlbWVudCAodGhlIFwibWlycm9yXCIpIGR1cmluZyB0aGUgZHJhZy5cbiovXG5jbGFzcyBJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyBleHRlbmRzIGludGVybmFsX2Nqcy5FbGVtZW50RHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsKSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lckVsKTtcbiAgICAgICAgdGhpcy5zaG91bGRJZ25vcmVNb3ZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWlycm9yU2VsZWN0b3IgPSAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50TWlycm9yRWwgPSBudWxsO1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBldik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgZHJhZ3N0YXJ0IHJpZ2h0IGF3YXkuIGRvZXMgbm90IHN1cHBvcnQgZGVsYXkgb3IgbWluLWRpc3RhbmNlXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdzdGFydCcsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyTW92ZSA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ21vdmUnLCBldik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlclVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICAvLyBmaXJlIGRyYWdlbmQgcmlnaHQgYXdheS4gZG9lcyBub3Qgc3VwcG9ydCBhIHJldmVydCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ2VuZCcsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvaW50ZXIgPSB0aGlzLnBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJtb3ZlJywgdGhpcy5oYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICBzZXRJZ25vcmVNb3ZlKGJvb2wpIHtcbiAgICAgICAgdGhpcy5zaG91bGRJZ25vcmVNb3ZlID0gYm9vbDtcbiAgICB9XG4gICAgc2V0TWlycm9ySXNWaXNpYmxlKGJvb2wpIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIC8vIHJlc3RvcmUgYSBwcmV2aW91c2x5IGhpZGRlbiBlbGVtZW50LlxuICAgICAgICAgICAgLy8gdXNlIHRoZSByZWZlcmVuY2UgaW4gY2FzZSB0aGUgc2VsZWN0b3IgY2xhc3MgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLlxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1pcnJvckVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWlycm9yRWwuc3R5bGUudmlzaWJpbGl0eSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pcnJvckVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxldCBtaXJyb3JFbCA9IHRoaXMubWlycm9yU2VsZWN0b3JcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBzb21laG93IHF1ZXJ5IEZ1bGxDYWxlbmRhcnMgV0lUSElOIHNoYWRvdy1yb290c1xuICAgICAgICAgICAgICAgID8gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLm1pcnJvclNlbGVjdG9yKVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGlmIChtaXJyb3JFbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pcnJvckVsID0gbWlycm9yRWw7XG4gICAgICAgICAgICAgICAgbWlycm9yRWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG4vKlxuQnJpZGdlcyB0aGlyZC1wYXJ0eSBkcmFnLW4tZHJvcCBzeXN0ZW1zIHdpdGggRnVsbENhbGVuZGFyLlxuTXVzdCBiZSBpbnN0YW50aWF0ZWQgYW5kIGRlc3Ryb3llZCBieSBjYWxsZXIuXG4qL1xuY2xhc3MgVGhpcmRQYXJ0eURyYWdnYWJsZSB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyT3JTZXR0aW5ncywgc2V0dGluZ3MpIHtcbiAgICAgICAgbGV0IGNvbnRhaW5lckVsID0gZG9jdW1lbnQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gd2lzaCB3ZSBjb3VsZCBqdXN0IHRlc3QgaW5zdGFuY2VvZiBFdmVudFRhcmdldCwgYnV0IGRvZXNuJ3Qgd29yayBpbiBJRTExXG4gICAgICAgIGNvbnRhaW5lck9yU2V0dGluZ3MgPT09IGRvY3VtZW50IHx8XG4gICAgICAgICAgICBjb250YWluZXJPclNldHRpbmdzIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgY29udGFpbmVyRWwgPSBjb250YWluZXJPclNldHRpbmdzO1xuICAgICAgICAgICAgc2V0dGluZ3MgPSBzZXR0aW5ncyB8fCB7fTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldHRpbmdzID0gKGNvbnRhaW5lck9yU2V0dGluZ3MgfHwge30pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgSW5mZXJyZWRFbGVtZW50RHJhZ2dpbmcoY29udGFpbmVyRWwpO1xuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLml0ZW1TZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSBzZXR0aW5ncy5pdGVtU2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGFpbmVyRWwgPT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICBkcmFnZ2luZy5wb2ludGVyLnNlbGVjdG9yID0gJ1tkYXRhLWV2ZW50XSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5taXJyb3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLm1pcnJvclNlbGVjdG9yID0gc2V0dGluZ3MubWlycm9yU2VsZWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgbmV3IEV4dGVybmFsRWxlbWVudERyYWdnaW5nKGRyYWdnaW5nLCBzZXR0aW5ncy5ldmVudERhdGEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9XG59XG5cbnZhciBpbmRleCA9IGluZGV4X2Nqcy5jcmVhdGVQbHVnaW4oe1xuICAgIG5hbWU6ICdAZnVsbGNhbGVuZGFyL2ludGVyYWN0aW9uJyxcbiAgICBjb21wb25lbnRJbnRlcmFjdGlvbnM6IFtEYXRlQ2xpY2tpbmcsIERhdGVTZWxlY3RpbmcsIEV2ZW50RHJhZ2dpbmcsIEV2ZW50UmVzaXppbmddLFxuICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBbVW5zZWxlY3RBdXRvXSxcbiAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nLFxuICAgIG9wdGlvblJlZmluZXJzOiBPUFRJT05fUkVGSU5FUlMsXG4gICAgbGlzdGVuZXJSZWZpbmVyczogTElTVEVORVJfUkVGSU5FUlMsXG59KTtcblxuZXhwb3J0cy5EcmFnZ2FibGUgPSBFeHRlcm5hbERyYWdnYWJsZTtcbmV4cG9ydHMuVGhpcmRQYXJ0eURyYWdnYWJsZSA9IFRoaXJkUGFydHlEcmFnZ2FibGU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGluZGV4O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvLyBzdGFydHVwXG4vLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8vIFRoaXMgZW50cnkgbW9kdWxlIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgbW9kdWxlcyBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkXG52YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNTE5KTtcbiJdLCJuYW1lcyI6WyJ0IiwiciIsInUiLCJpIiwibyIsImYiLCJjIiwiZSIsIl9fYiIsImEiLCJfX3IiLCJ2IiwiZGlmZmVkIiwibCIsIl9fYyIsIm0iLCJ1bm1vdW50IiwiZCIsIl9faCIsIl9fSCIsIl9fIiwibGVuZ3RoIiwicHVzaCIsIl9fViIsInAiLCJuIiwieSIsIkIiLCJfX04iLCJzZXRTdGF0ZSIsInNob3VsZENvbXBvbmVudFVwZGF0ZSIsImZpbHRlciIsImV2ZXJ5IiwiY2FsbCIsInRoaXMiLCJmb3JFYWNoIiwicHJvcHMiLCJoIiwiX19zIiwieiIsInMiLCJfIiwiRiIsImN1cnJlbnQiLCJBIiwiY29uY2F0IiwiVCIsInEiLCJjb250ZXh0Iiwic3ViIiwidmFsdWUiLCJ4IiwidXNlRGVidWdWYWx1ZSIsIlAiLCJjb21wb25lbnREaWRDYXRjaCIsIlYiLCJfX3YiLCJfX20iLCJiIiwic2hpZnQiLCJfX1AiLCJrIiwidyIsIl9fZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImoiLCJzb21lIiwiZyIsImNsZWFyVGltZW91dCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsIkMiLCJFIiwiUiIsInJlZiIsImRpc3BsYXlOYW1lIiwibmFtZSIsInByb3RvdHlwZSIsImlzUmVhY3RDb21wb25lbnQiLCJfX2YiLCJpc1B1cmVSZWFjdENvbXBvbmVudCIsInN0YXRlIiwidHlwZSIsIk4iLCJTeW1ib2wiLCJmb3IiLCIkJHR5cGVvZiIsInJlbmRlciIsIm1hcCIsIk8iLCJjb3VudCIsIm9ubHkiLCJ0b0FycmF5IiwidGhlbiIsIl9fayIsIkkiLCJMIiwiVSIsImluc2VydEJlZm9yZSIsIl9fZCIsIkQiLCJfX3UiLCJfX2EiLCJNIiwiZGVmYXVsdCIsIl9fUiIsIl9fTyIsInBvcCIsImZvcmNlVXBkYXRlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJmYWxsYmFjayIsImNoaWxkcmVuIiwiVyIsImRlbGV0ZSIsInJldmVhbE9yZGVyIiwic2l6ZSIsImdldENoaWxkQ29udGV4dCIsIiQiLCJub2RlVHlwZSIsInBhcmVudE5vZGUiLCJjaGlsZE5vZGVzIiwiYXBwZW5kQ2hpbGQiLCJyZW1vdmVDaGlsZCIsInNwbGljZSIsImluZGV4T2YiLCJjb250YWluZXJJbmZvIiwiZ2V0IiwiTWFwIiwicmV2ZXJzZSIsInNldCIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudERpZE1vdW50IiwiSCIsIloiLCJ0ZXN0IiwiWSIsInRleHRDb250ZW50IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIkciLCJldmVudCIsIkoiLCJLIiwiY2FuY2VsQnViYmxlIiwiUSIsImRlZmF1bHRQcmV2ZW50ZWQiLCJwZXJzaXN0IiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJuYXRpdmVFdmVudCIsIlgiLCJubiIsImNsYXNzIiwidG4iLCJ2bm9kZSIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsIm11bHRpcGxlIiwiQXJyYXkiLCJpc0FycmF5Iiwic2VsZWN0ZWQiLCJkZWZhdWx0VmFsdWUiLCJjbGFzc05hbWUiLCJlbnVtZXJhYmxlIiwiZW4iLCJybiIsIlJlYWN0Q3VycmVudERpc3BhdGNoZXIiLCJyZWFkQ29udGV4dCIsIl9fbiIsInVuIiwib24iLCJiaW5kIiwibG4iLCJjbiIsImFwcGx5IiwiYXJndW1lbnRzIiwiZm4iLCJhbiIsImJhc2UiLCJzbiIsImhuIiwidm4iLCJkbiIsInBuIiwibW4iLCJ5biIsIl9uIiwiYm4iLCJ1c2VTdGF0ZSIsInVzZUlkIiwidXNlUmVkdWNlciIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZUluc2VydGlvbkVmZmVjdCIsInVzZVRyYW5zaXRpb24iLCJ1c2VEZWZlcnJlZFZhbHVlIiwidXNlU3luY0V4dGVybmFsU3RvcmUiLCJzdGFydFRyYW5zaXRpb24iLCJ1c2VSZWYiLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTWVtbyIsInVzZUNhbGxiYWNrIiwidXNlQ29udGV4dCIsInZlcnNpb24iLCJDaGlsZHJlbiIsImh5ZHJhdGUiLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiY3JlYXRlUG9ydGFsIiwiY3JlYXRlQ29udGV4dCIsImNyZWF0ZUZhY3RvcnkiLCJjbG9uZUVsZW1lbnQiLCJjcmVhdGVSZWYiLCJGcmFnbWVudCIsImlzVmFsaWRFbGVtZW50IiwiZmluZERPTU5vZGUiLCJDb21wb25lbnQiLCJQdXJlQ29tcG9uZW50IiwibWVtbyIsImZvcndhcmRSZWYiLCJmbHVzaFN5bmMiLCJ1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyIsIlN0cmljdE1vZGUiLCJTdXNwZW5zZSIsIlN1c3BlbnNlTGlzdCIsImxhenkiLCJfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCIsImRlZmF1bHRQcm9wcyIsImtleSIsImNvbnN0cnVjdG9yIiwic2V0UHJvcGVydHkiLCJzdHlsZSIsImNzc1RleHQiLCJzbGljZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmVtb3ZlQXR0cmlidXRlIiwic2V0QXR0cmlidXRlIiwiZGVib3VuY2VSZW5kZXJpbmciLCJzb3J0Iiwib3duZXJTVkdFbGVtZW50IiwibmV4dFNpYmxpbmciLCJTIiwiY29udGV4dFR5cGUiLCJfX0UiLCJfc2IiLCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMiLCJjb21wb25lbnRXaWxsTW91bnQiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50V2lsbFVwZGF0ZSIsImdldFNuYXBzaG90QmVmb3JlVXBkYXRlIiwibG9jYWxOYW1lIiwiY3JlYXRlVGV4dE5vZGUiLCJjcmVhdGVFbGVtZW50TlMiLCJpcyIsImRhdGEiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImF0dHJpYnV0ZXMiLCJfX2h0bWwiLCJpbm5lckhUTUwiLCJjaGVja2VkIiwiZmlyc3RDaGlsZCIsIkNvbnN1bWVyIiwiUHJvdmlkZXIiLCJnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkNWVF9NU19TIiwiQ1ZUX1NfTUlOIiwiQ1ZUX01JTl9IUiIsIkNWVF9IUl9EQVkiLCJDVlRfTVNfREFZIiwiQ0FMX0hFSUdIVF9ESUZGIiwiQ09MT1JfV0hJVEUiLCJDT0xPUl9URVhUIiwiQ09MT1JfUFVSUExFIiwiQ09MT1JfT1JBTkdFIiwiQ09MT1JfWUVMTE9XIiwiQ09MT1JfR1JFRU4iLCJDT0xPUl9CUk9XTiIsIlJHWF9JTlRFR0VSIiwiUkdYX1dPUkQiLCJSR1hfREFURSIsImNhbGVuZGFyIiwiX2NvcHlfYnVmZmVyIiwiX21vZGUiLCJfY2FsZW5kYXIiLCJfbm90aWZpY2F0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZXYiLCJtb2RlIiwiY2xpY2tfZGF0ZSIsImNsaWNrX2V2ZW50Iiwic2VsZWN0X3JhbmdlIiwiX21vZGFsX2tleV9ldmVudCIsIk1vZGFsIiwiX21vZGFsX3N1Yl9ldmVudCIsIl9tb2RhbF9jb25maXJtIiwiX2V2ZW50X2xpc3QiLCJDYWxlbmRhckV2ZW50TGlzdCIsImNsZWFyIiwiaW5uZXJUZXh0IiwiZGV2dCIsImNsaWNrZWQiLCJ0YXJnZXQiLCJpZCIsIkVycm9yIiwiY29uc29sZSIsImxvZyIsImRhdGVTdHIiLCJwb3B1bGF0ZVRleHQiLCJkYXRlIiwidG9EYXRlU3RyaW5nIiwib3BlbiIsImFkZCIsIktleUV2ZW50IiwiYWRkRXZlbnQiLCJ0aXRsZSIsInN0YXJ0IiwiY29weSIsImNsb25lIiwic2V0X2RhdGUiLCJzZXRfZ2lkIiwiZ2lkIiwic3RhcnRTdHIiLCJlbmRTdHIiLCJ1bnRpbCIsIkRhdGUiLCJzZXREYXRlIiwiZW5kIiwiZ2V0RGF0ZSIsInVudGlsU3RyIiwidG9JU09TdHJpbmciLCJzdWJzdHJpbmciLCJpbXBvcnRfZXZlbnRzIiwibWFrZV9yZWN1cnJlbmNlIiwiZ3JvdXBJZCIsImdldF9ldmVudCIsIk51bWJlciIsImRlbGV0ZV9ldmVudCIsIm5fc2libGluZ3MiLCJnZXRfZXZlbnRfc2libGluZ3MiLCJzZXRFbGVtZW50Q2xhc3MiLCJkZWxldGVfZ3JvdXAiLCJFZGl0b3IiLCJ1cGRhdGVfcHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJ1cGRhdGVkIiwiYXNzaWduIiwiZGF5c19hcGFydCIsInZhbHVlT2YiLCJ1dGlsIiwic2V0X2lubmVyIiwic3ViamVjdCIsInJlY29yZCIsInRpbWVwb2ludCIsInRsZmJfcHJvcGVydGllcyIsInByb2plY3QiLCJxdWVyeSIsIlVSTFNlYXJjaFBhcmFtcyIsIndpbmRvdyIsImxvY2F0aW9uIiwic2VhcmNoIiwidG8iLCJ2YWxpZGF0b3IiLCJwYXJhbSIsImhhcyIsImFsZXJ0IiwiZ2V0X3VybF9wcm9wZXJ0aWVzIiwiY2FsZW5kYXJFbCIsIkNhbGVuZGFyIiwicGx1Z2lucyIsImluaXRpYWxWaWV3IiwidmFsaWRSYW5nZSIsImhlYWRlclRvb2xiYXIiLCJsZWZ0IiwicmlnaHQiLCJlZGl0YWJsZSIsInNlbGVjdGFibGUiLCJzaG93Tm9uQ3VycmVudERhdGVzIiwiZml4ZWRXZWVrQ291bnQiLCJoZWlnaHQiLCJpbm5lckhlaWdodCIsInNldE9wdGlvbiIsIl9vbnN1Ym1pdCIsImVsIiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJfZWxlbWVudCIsIl9mb3JtIiwicXVlcnlTZWxlY3RvciIsImNsb3NlIiwicHJldmVudERlZmF1bHQiLCJzdWJtaXQiLCJyZXNldCIsImdldEZvcm1EYXRhIiwic3VibWl0X2J1dHRvbl92YWx1ZSIsInN1Ym1pdHRlciIsImFwcGVuZCIsInBvcHVsYXRlRm9ybSIsImVsZW1lbnRzIiwibmFtZWRJdGVtIiwic2VsZWN0b3IiLCJlbGVtZW50IiwicmVtb3ZlIiwiRm9ybURhdGEiLCJvbnN1Ym1pdCIsIl9kYXRlIiwiaXNOYU4iLCJnZXRVVENEYXkiLCJnZXRVVENEYXRlIiwiZ2V0VVRDTW9udGgiLCJnZXRVVENGdWxsWWVhciIsInRvU3RyaW5nIiwic2V0X2RheSIsImRheSIsInNldFVUQ0RhdGUiLCJpc1NhbWVEYXkiLCJ5ZWFyIiwibW9udGgiLCJpc0FmdGVyIiwiaXNCZWZvcmUiLCJDYWxlbmRhckRhdGUiLCJfZWlkIiwiX2dpZCIsIl90aXRsZSIsIl90eXBlIiwic2V0X2VpZCIsImVpZCIsIndlZWtkYXlzIiwiZXZlbnRzIiwiZHQiLCJuZXh0X2RheSIsImluY2x1ZGVzIiwid2Vla2RheSIsIkNhbGVuZGFyRXZlbnQiLCJfY2F0ZWdvcnkiLCJfc3Vic3RhbmNlIiwiX21ldGhvZCIsIl90aW1lcyIsIl9hbW91bnQiLCJfdW5pdHMiLCJfdW5pdHNPdGhlciIsInNldF9wcm9wZXJ0aWVzIiwiVXNlRXZlbnQiLCJjYXRlZ29yeSIsInN1YnN0YW5jZSIsIm1ldGhvZCIsInRpbWVzIiwiYW1vdW50IiwidW5pdHMiLCJ1bml0c090aGVyIiwidXBkYXRlX3RpdGxlIiwiZnVsbGNhbGVuZGFyIiwiX25leHRfZWlkIiwiX25leHRfZ2lkIiwiX2V2ZW50cyIsIl9mdWxsY2FsZW5kYXIiLCJzdGFydF9kYXRlIiwiZW5kX2RhdGUiLCJfZ2V0X25leHRfZWlkIiwibmV4dF9laWQiLCJfZ2V0X25leHRfZ2lkIiwibmV4dF9naWQiLCJmaW5kIiwidW5kZWZpbmVkIiwiZ2V0X2V2ZW50X2dyb3VwIiwiZ2V0X2V2ZW50cyIsInJlYXNzaWduIiwiZ2V0RXZlbnRCeUlkIiwiZ2V0RXZlbnRzIiwiZ2lkX21hcHBpbmciLCJyZWR1Y2UiLCJhY2MiLCJjdXIiLCJ0ZXh0Q29sb3IiLCJjb2xvcnMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJib3JkZXJDb2xvciIsInNlcmlhbGl6ZV9ldmVudHMiLCJhcyIsInRleHQiLCJOb2RlTGlzdCIsIm1vZGFsIiwiY2xvc2VzdCIsImV4cG9ydHMiLCJpbnRlcm5hbENvbW1vbiIsInByZWFjdCIsImdsb2JhbExvY2FsZXMiLCJNSU5JTUFMX1JBV19FTl9MT0NBTEUiLCJjb2RlIiwid2VlayIsImRvdyIsImRveSIsImRpcmVjdGlvbiIsImJ1dHRvblRleHQiLCJwcmV2IiwibmV4dCIsInByZXZZZWFyIiwibmV4dFllYXIiLCJ0b2RheSIsImxpc3QiLCJ3ZWVrVGV4dCIsIndlZWtUZXh0TG9uZyIsImNsb3NlSGludCIsInRpbWVIaW50IiwiZXZlbnRIaW50IiwiYWxsRGF5VGV4dCIsIm1vcmVMaW5rVGV4dCIsIm5vRXZlbnRzVGV4dCIsIlJBV19FTl9MT0NBTEUiLCJidXR0b25IaW50cyIsInVuaXQiLCJ2aWV3SGludCIsIm5hdkxpbmtIaW50IiwibW9yZUxpbmtIaW50IiwiZXZlbnRDbnQiLCJvcmdhbml6ZVJhd0xvY2FsZXMiLCJleHBsaWNpdFJhd0xvY2FsZXMiLCJkZWZhdWx0Q29kZSIsImFsbFJhd0xvY2FsZXMiLCJyYXdMb2NhbGVNYXAiLCJyYXdMb2NhbGUiLCJidWlsZExvY2FsZSIsImlucHV0U2luZ3VsYXIiLCJhdmFpbGFibGUiLCJjb2RlQXJnIiwiY29kZXMiLCJyYXciLCJwYXJ0cyIsInRvTG9jYWxlTG93ZXJDYXNlIiwic3BsaXQiLCJzaW1wbGVJZCIsImpvaW4iLCJxdWVyeVJhd0xvY2FsZSIsInBhcnNlTG9jYWxlIiwicXVlcnlMb2NhbGUiLCJtZXJnZWQiLCJtZXJnZVByb3BzIiwic2ltcGxlTnVtYmVyRm9ybWF0IiwiSW50bCIsIk51bWJlckZvcm1hdCIsIm9wdGlvbnMiLCJjcmVhdGVQbHVnaW4iLCJpbnB1dCIsImd1aWQiLCJwcmVtaXVtUmVsZWFzZURhdGUiLCJkZXBzIiwicmVkdWNlcnMiLCJpc0xvYWRpbmdGdW5jcyIsImNvbnRleHRJbml0IiwiZXZlbnRSZWZpbmVycyIsImV2ZW50RGVmTWVtYmVyQWRkZXJzIiwiZXZlbnRTb3VyY2VSZWZpbmVycyIsImlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzIiwiZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnMiLCJldmVudERlZk11dGF0aW9uQXBwbGllcnMiLCJkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzIiwiZGF0ZVBvaW50VHJhbnNmb3JtcyIsImRhdGVTcGFuVHJhbnNmb3JtcyIsInZpZXdzIiwidmlld1Byb3BzVHJhbnNmb3JtZXJzIiwiaXNQcm9wc1ZhbGlkIiwiZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zIiwidmlld0NvbnRhaW5lckFwcGVuZHMiLCJldmVudERyb3BUcmFuc2Zvcm1lcnMiLCJjb21wb25lbnRJbnRlcmFjdGlvbnMiLCJjYWxlbmRhckludGVyYWN0aW9ucyIsInRoZW1lQ2xhc3NlcyIsImV2ZW50U291cmNlRGVmcyIsImNtZEZvcm1hdHRlciIsInJlY3VycmluZ1R5cGVzIiwibmFtZWRUaW1lWm9uZWRJbXBsIiwiZWxlbWVudERyYWdnaW5nSW1wbCIsIm9wdGlvbkNoYW5nZUhhbmRsZXJzIiwic2Nyb2xsR3JpZEltcGwiLCJsaXN0ZW5lclJlZmluZXJzIiwib3B0aW9uUmVmaW5lcnMiLCJwcm9wU2V0SGFuZGxlcnMiLCJTdGFuZGFyZFRoZW1lIiwiVGhlbWUiLCJlbnN1cmVWaWV3RGVmIiwidmlld1R5cGUiLCJoYXNoIiwiZGVmYXVsdENvbmZpZ3MiLCJvdmVycmlkZUNvbmZpZ3MiLCJ2aWV3RGVmIiwiZGVmYXVsdENvbmZpZyIsIm92ZXJyaWRlQ29uZmlnIiwicXVlcnlQcm9wIiwidGhlQ29tcG9uZW50Iiwic3VwZXJUeXBlIiwic3VwZXJEZWYiLCJjb21wb25lbnQiLCJkZWZhdWx0cyIsInJhd09wdGlvbnMiLCJvdmVycmlkZXMiLCJidWlsZFZpZXdEZWYiLCJwYXJzZVZpZXdDb25maWdzIiwiaW5wdXRzIiwibWFwSGFzaCIsInBhcnNlVmlld0NvbmZpZyIsImNvbnRlbnQiLCJjcmVhdGVWaWV3SG9va0NvbXBvbmVudCIsIkJhc2VDb21wb25lbnQiLCJ2aWV3UHJvcHMiLCJWaWV3Q29udGV4dFR5cGUiLCJDb250ZW50Q29udGFpbmVyIiwiZWxUYWciLCJlbENsYXNzZXMiLCJidWlsZFZpZXdDbGFzc05hbWVzIiwidmlld1NwZWMiLCJyZW5kZXJQcm9wcyIsIm5leHREYXlUaHJlc2hvbGQiLCJnZW5lcmF0b3JOYW1lIiwiY3VzdG9tR2VuZXJhdG9yIiwiY2xhc3NOYW1lR2VuZXJhdG9yIiwiY2xhc3NOYW1lcyIsImRpZE1vdW50Iiwid2lsbFVubW91bnQiLCJidWlsZFZpZXdTcGVjcyIsImRlZmF1bHRJbnB1dHMiLCJvcHRpb25PdmVycmlkZXMiLCJkeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwibG9jYWxlRGVmYXVsdHMiLCJ2aWV3RGVmcyIsImNvbXBpbGVWaWV3RGVmcyIsImR1cmF0aW9uSW5wdXQiLCJkdXJhdGlvbiIsImR1cmF0aW9uVW5pdCIsInNpbmdsZVVuaXQiLCJzaW5nbGVVbml0T3ZlcnJpZGVzIiwianNvbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXMiLCJkdXJhdGlvbklucHV0TWFwIiwiY3JlYXRlRHVyYXRpb24iLCJjcmVhdGVEdXJhdGlvbkNhY2hlZCIsImRlbm9tIiwiZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIiwicXVlcnlCdXR0b25UZXh0Iiwib3B0aW9uc1N1YnNldCIsImJ1dHRvblRleHRNYXAiLCJidXR0b25UZXh0S2V5IiwicXVlcnlCdXR0b25UaXRsZSIsImJ1dHRvbktleSIsIm9wdGlvbkRlZmF1bHRzIiwiYnV0dG9uVGV4dE92ZXJyaWRlIiwiYnV0dG9uVGV4dERlZmF1bHQiLCJCQVNFX09QVElPTl9ERUZBVUxUUyIsImJ1dHRvblRpdGxlT3ZlcnJpZGUiLCJidXR0b25IaW50IiwiYnV0dG9uVGl0bGVEZWZhdWx0IiwiYnVpbGRWaWV3U3BlYyIsImNsYXNzZXMiLCJyb290IiwidGFibGVDZWxsU2hhZGVkIiwiYnV0dG9uR3JvdXAiLCJidXR0b24iLCJidXR0b25BY3RpdmUiLCJiYXNlSWNvbkNsYXNzIiwiaWNvbkNsYXNzZXMiLCJydGxJY29uQ2xhc3NlcyIsImljb25PdmVycmlkZU9wdGlvbiIsImljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbiIsImljb25PdmVycmlkZVByZWZpeCIsImNvbXB1dGVFdmVudFNvdXJjZXNMb2FkaW5nIiwiZXZlbnRTb3VyY2VzIiwic291cmNlSWQiLCJpc0ZldGNoaW5nIiwiYWRkU291cmNlcyIsImV2ZW50U291cmNlSGFzaCIsInNvdXJjZXMiLCJmZXRjaFJhbmdlIiwic291cmNlIiwiZmV0Y2hEaXJ0eVNvdXJjZXMiLCJzb3VyY2VIYXNoIiwiZmV0Y2hTb3VyY2VzQnlJZHMiLCJmaWx0ZXJIYXNoIiwiZXZlbnRTb3VyY2UiLCJkb2VzU291cmNlTmVlZFJhbmdlIiwibGF6eUZldGNoaW5nIiwibGF0ZXN0RmV0Y2hJZCIsImlzU291cmNlRGlydHkiLCJwcmV2U291cmNlcyIsInNvdXJjZUlkSGFzaCIsImlzUmVmZXRjaCIsIm5leHRTb3VyY2VzIiwiZmV0Y2hTb3VyY2UiLCJjYWxlbmRhckFwaSIsInNvdXJjZURlZiIsInBsdWdpbkhvb2tzIiwic291cmNlRGVmSWQiLCJmZXRjaElkIiwiZmV0Y2giLCJyYW5nZSIsInJhd0V2ZW50cyIsImV2ZW50U291cmNlU3VjY2VzcyIsInJlc3BvbnNlIiwic3VjY2VzcyIsImRpc3BhdGNoIiwiZXJyb3IiLCJlcnJvckhhbmRsZWQiLCJldmVudFNvdXJjZUZhaWx1cmUiLCJmYWlsdXJlIiwid2FybiIsIm1lc3NhZ2UiLCJleGNsdWRlU3RhdGljU291cmNlcyIsImlnbm9yZVJhbmdlIiwicmVkdWNlRGF0ZVNlbGVjdGlvbiIsImN1cnJlbnRTZWxlY3Rpb24iLCJhY3Rpb24iLCJzZWxlY3Rpb24iLCJyZWR1Y2VTZWxlY3RlZEV2ZW50IiwiY3VycmVudEluc3RhbmNlSWQiLCJldmVudEluc3RhbmNlSWQiLCJyZWR1Y2VFdmVudERyYWciLCJjdXJyZW50RHJhZyIsIm5ld0RyYWciLCJhZmZlY3RlZEV2ZW50cyIsIm11dGF0ZWRFdmVudHMiLCJpc0V2ZW50IiwicmVkdWNlRXZlbnRSZXNpemUiLCJjdXJyZW50UmVzaXplIiwibmV3UmVzaXplIiwicGFyc2VUb29sYmFycyIsImNhbGVuZGFyT3B0aW9ucyIsImNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzIiwidGhlbWUiLCJ2aWV3U3BlY3MiLCJoZWFkZXIiLCJwYXJzZVRvb2xiYXIiLCJmb290ZXIiLCJmb290ZXJUb29sYmFyIiwic2VjdGlvblN0ckhhc2giLCJzZWN0aW9uV2lkZ2V0cyIsInZpZXdzV2l0aEJ1dHRvbnMiLCJoYXNUaXRsZSIsInNlY3Rpb25OYW1lIiwic2VjdGlvblJlcyIsInBhcnNlU2VjdGlvbiIsIndpZGdldHMiLCJzZWN0aW9uU3RyIiwiaXNSdGwiLCJjYWxlbmRhckN1c3RvbUJ1dHRvbnMiLCJjdXN0b21CdXR0b25zIiwiY2FsZW5kYXJCdXR0b25UZXh0T3ZlcnJpZGVzIiwiY2FsZW5kYXJCdXR0b25UZXh0IiwiY2FsZW5kYXJCdXR0b25IaW50T3ZlcnJpZGVzIiwiY2FsZW5kYXJCdXR0b25IaW50cyIsInNlY3Rpb25TdWJzdHJzIiwiYnV0dG9uR3JvdXBTdHIiLCJidXR0b25OYW1lIiwiY3VzdG9tQnV0dG9uUHJvcHMiLCJidXR0b25DbGljayIsImJ1dHRvbkljb24iLCJjbGljayIsImdldEN1c3RvbUJ1dHRvbkljb25DbGFzcyIsImdldEljb25DbGFzcyIsImhpbnQiLCJjaGFuZ2VWaWV3IiwidGV4dEZhbGxiYWNrIiwiZm9ybWF0V2l0aE9yZGluYWxzIiwicHJldk9yTmV4dCIsIm5hdlVuaXQiLCJWaWV3SW1wbCIsImdldEN1cnJlbnREYXRhIiwiZGF0ZUVudiIsInZpZXdUaXRsZSIsImFjdGl2ZVN0YXJ0IiwidG9EYXRlIiwiZGF0ZVByb2ZpbGUiLCJhY3RpdmVSYW5nZSIsImFjdGl2ZUVuZCIsImN1cnJlbnRTdGFydCIsImN1cnJlbnRSYW5nZSIsImN1cnJlbnRFbmQiLCJnZXRPcHRpb24iLCJoYW5kbGVFdmVudFNvdXJjZXMiLCJ1bmZvdW5kU291cmNlcyIsImhhc2hWYWx1ZXNUb0FycmF5IiwiX3JhdyIsIm5ld0lucHV0cyIsImlucHV0Rm91bmQiLCJ1bmZvdW5kU291cmNlIiwibmV3SW5wdXQiLCJhZGRFdmVudFNvdXJjZSIsImdsb2JhbFBsdWdpbnMiLCJwYXJzZU1ldGEiLCJyZWZpbmVkIiwiYXJnIiwic3VjY2Vzc0NhbGxiYWNrIiwibWV0YSIsImVycm9yQ2FsbGJhY2siLCJmdW5jIiwidW5wcm9taXNpZnkiLCJidWlsZFJhbmdlQXBpV2l0aFRpbWVab25lIiwiU3RyaW5nIiwiZXh0cmFQYXJhbXMiLCJpZGVudGl0eSIsInN0YXJ0UGFyYW0iLCJlbmRQYXJhbSIsInRpbWVab25lUGFyYW0iLCJ1cmwiLCJmb3JtYXQiLCJ0b1VwcGVyQ2FzZSIsInJlcXVlc3RQYXJhbXMiLCJjdXN0b21SZXF1ZXN0UGFyYW1zIiwicGFyYW1zIiwiZm9ybWF0SXNvIiwidGltZVpvbmUiLCJidWlsZFJlcXVlc3RQYXJhbXMiLCJyZXF1ZXN0SnNvbiIsInBhcnNlIiwiZGF5c09mV2VlayIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJzdGFydFJlY3VyIiwiZW5kUmVjdXIiLCJyZWN1cnJpbmdEYXRhIiwiY3JlYXRlTWFya2VyIiwic3VidHJhY3REdXJhdGlvbnMiLCJhbGxEYXlHdWVzcyIsIkJvb2xlYW4iLCJ0eXBlRGF0YSIsImV4cGFuZCIsImZyYW1pbmdSYW5nZSIsImNsaXBwZWRGcmFtaW5nUmFuZ2UiLCJpbnRlcnNlY3RSYW5nZXMiLCJkb3dIYXNoIiwiYXJyYXlUb0hhc2giLCJkYXlNYXJrZXIiLCJzdGFydE9mRGF5IiwiZW5kTWFya2VyIiwiaW5zdGFuY2VTdGFydHMiLCJpbnN0YW5jZVN0YXJ0IiwiYWRkRGF5cyIsImV4cGFuZFJhbmdlcyIsImVtaXR0ZXIiLCJ0cmlnZ2VyIiwidmlldyIsInZpZXdBcGkiLCJldmVudFN0b3JlIiwiaGFzSGFuZGxlcnMiLCJidWlsZEV2ZW50QXBpcyIsIlRhc2tSdW5uZXIiLCJydW5UYXNrT3B0aW9uIiwiZHJhaW5lZE9wdGlvbiIsInF1ZXVlIiwiZGVsYXllZFJ1bm5lciIsIkRlbGF5ZWRSdW5uZXIiLCJkcmFpbiIsInJlcXVlc3QiLCJ0YXNrIiwiZGVsYXkiLCJwYXVzZSIsInNjb3BlIiwicmVzdW1lIiwiZm9yY2UiLCJjb21wbGV0ZWRUYXNrcyIsInJ1blRhc2siLCJkcmFpbmVkIiwiYnVpbGRUaXRsZSIsInZpZXdPcHRpb25zIiwiY3VycmVudFJhbmdlVW5pdCIsImZvcm1hdFJhbmdlIiwiY3JlYXRlRm9ybWF0dGVyIiwidGl0bGVGb3JtYXQiLCJkYXlzIiwiZGlmZldob2xlRGF5cyIsImJ1aWxkVGl0bGVGb3JtYXQiLCJpc0VuZEV4Y2x1c2l2ZSIsImlzUmFuZ2VBbGxEYXkiLCJkZWZhdWx0U2VwYXJhdG9yIiwidGl0bGVSYW5nZVNlcGFyYXRvciIsIkNhbGVuZGFyRGF0YU1hbmFnZXIiLCJjb21wdXRlQ3VycmVudFZpZXdEYXRhIiwibWVtb2l6ZSIsIl9jb21wdXRlQ3VycmVudFZpZXdEYXRhIiwiYnVpbGRQbHVnaW5Ib29rcyIsImN1cnJlbnRIb29rcyIsImN1cnJlbnRPdmVycmlkZURlZnMiLCJjdXJyZW50R2xvYmFsRGVmcyIsIm92ZXJyaWRlRGVmcyIsImdsb2JhbERlZnMiLCJpc0FycmF5c0VxdWFsIiwicGx1Z2luRGVmcyIsImN1cnJlbnRQbHVnaW5JZHMiLCJob29rcyIsImFkZERlZnMiLCJkZWZzIiwiZGVmIiwicGx1Z2luTmFtZSIsImN1cnJlbnRJZCIsImhvb2tzMSIsImRhdGUwIiwiaG9va3MwIiwiZGF0ZTEiLCJNYXRoIiwibWF4IiwiYnVpbGRCdWlsZFBsdWdpbkhvb2tzIiwiYnVpbGREYXRlRW52IiwiYnVpbGREYXRlRW52JDEiLCJidWlsZFRoZW1lIiwiYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvciIsIm1lbW9pemVPYmpBcmciLCJidWlsZFZpZXdBcGkiLCJidWlsZFZpZXdVaVByb3BzIiwiYnVpbGRFdmVudFVpQnlTb3VyY2UiLCJpc1Byb3BzRXF1YWwiLCJidWlsZEV2ZW50VWlCYXNlcyIsInBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMiLCJFbWl0dGVyIiwiYWN0aW9uUnVubmVyIiwiX2hhbmRsZUFjdGlvbiIsInVwZGF0ZURhdGEiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCIsImN1cnJlbnRWaWV3T3B0aW9uc0lucHV0IiwiY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCIsImN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyIsIm9wdGlvbnNGb3JSZWZpbmluZyIsIm9wdGlvbnNGb3JIYW5kbGluZyIsIm9wdGlvbnNEYXRhIiwiY29tcHV0ZU9wdGlvbnNEYXRhIiwiY3VycmVudFZpZXdUeXBlIiwiY3VycmVudFZpZXdEYXRhIiwiY3VycmVudERhdGFNYW5hZ2VyIiwic2V0VGhpc0NvbnRleHQiLCJzZXRPcHRpb25zIiwiY3VycmVudERhdGUiLCJnZXRJbml0aWFsRGF0ZSIsImRhdGVQcm9maWxlR2VuZXJhdG9yIiwiYnVpbGQiLCJyYW5nZUNvbnRhaW5zTWFya2VyIiwiY2FsZW5kYXJDb250ZXh0IiwiY2FsbGJhY2siLCJyZWZpbmVycyIsImJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyIsInJhd1NvdXJjZXMiLCJpbml0aWFsRXZlbnRzIiwidW5zaGlmdCIsInJhd1NvdXJjZSIsInBhcnNlRXZlbnRTb3VyY2UiLCJwYXJzZUluaXRpYWxTb3VyY2VzIiwiaW5pdEV2ZW50U291cmNlcyIsImluaXRpYWxTdGF0ZSIsImJ1c2luZXNzSG91cnMiLCJldmVudFVpQmFzZXMiLCJjcmVhdGVFbXB0eUV2ZW50U3RvcmUiLCJyZW5kZXJhYmxlRXZlbnRTdG9yZSIsImRhdGVTZWxlY3Rpb24iLCJldmVudFNlbGVjdGlvbiIsImV2ZW50RHJhZyIsImV2ZW50UmVzaXplIiwic2VsZWN0aW9uQ29uZmlnIiwiY29udGV4dEFuZFN0YXRlIiwicmVkdWNlciIsImNvbXB1dGVJc0xvYWRpbmciLCJyZXNldE9wdGlvbnMiLCJjaGFuZ2VkT3B0aW9uTmFtZXMiLCJvcHRpb25OYW1lIiwicmF3T3B0aW9uVmFsdWUiLCJyZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwicmVkdWNlVmlld1R5cGUiLCJyZWR1Y2VDdXJyZW50RGF0ZSIsImN1cnJlbnREYXRlUHJvZmlsZSIsImRwIiwiZGF0ZU1hcmtlciIsImJ1aWxkUHJldiIsImlzVmFsaWQiLCJidWlsZE5leHQiLCJyZWR1Y2VEYXRlUHJvZmlsZSIsInNvdXJjZUlkcyIsInJlY2VpdmVSZXNwb25zZSIsInJlZHVjZUV2ZW50U291cmNlcyIsInJlZHVjZUV2ZW50U3RvcmUiLCJwcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nIiwiZXZlbnRVaVNpbmdsZUJhc2UiLCJldmVudFVpQnlTb3VyY2UiLCJuZXdTdGF0ZSIsIndhc0xvYWRpbmciLCJpc0xvYWRpbmciLCJvbkFjdGlvbiIsIm9sZERhdGEiLCJjaGFuZ2VIYW5kbGVycyIsIm9sZENhbGVuZGFyT3B0aW9ucyIsIm5ld0NhbGVuZGFyT3B0aW9ucyIsInJlZHVjZUV2ZW50U291cmNlc05ld1RpbWVab25lIiwicmV6b25lRXZlbnRTdG9yZURhdGVzIiwib25EYXRhIiwic3RhYmxlT3B0aW9uT3ZlcnJpZGVzIiwic3RhYmxlRHluYW1pY09wdGlvbk92ZXJyaWRlcyIsInN0YWJsZUNhbGVuZGFyT3B0aW9uc0RhdGEiLCJyZWZpbmVkT3B0aW9ucyIsImF2YWlsYWJsZUxvY2FsZURhdGEiLCJleHRyYSIsInByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMiLCJ3YXJuVW5rbm93bk9wdGlvbnMiLCJsb2NhbGUiLCJ3ZWVrTnVtYmVyQ2FsY3VsYXRpb24iLCJmaXJzdERheSIsImRlZmF1bHRSYW5nZVNlcGFyYXRvciIsInRvb2xiYXJDb25maWciLCJhdmFpbGFibGVSYXdMb2NhbGVzIiwibG9jYWxlcyIsIm1lcmdlUmF3T3B0aW9ucyIsIkJBU0VfT1BUSU9OX1JFRklORVJTIiwiQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMiLCJDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMiLCJjdXJyZW50UmF3IiwiY3VycmVudFJlZmluZWQiLCJhbnlDaGFuZ2VzIiwiQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMiLCJwcm9jZXNzUmF3Vmlld09wdGlvbnMiLCJkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzIiwidXNlc01pbk1heFRpbWUiLCJzbG90TWluVGltZSIsInNsb3RNYXhUaW1lIiwiZGF5Q291bnQiLCJkYXRlQWxpZ25tZW50IiwiZGF0ZUluY3JlbWVudCIsImhpZGRlbkRheXMiLCJ3ZWVrZW5kcyIsIm5vd0lucHV0Iiwibm93IiwidmFsaWRSYW5nZUlucHV0IiwidmlzaWJsZVJhbmdlSW5wdXQiLCJ2aXNpYmxlUmFuZ2UiLCJWSUVXX09QVElPTl9SRUZJTkVSUyIsImV4cGxpY2l0TG9jYWxlIiwiRGF0ZUVudiIsImNhbGVuZGFyU3lzdGVtIiwibmFtZWRUaW1lWm9uZUltcGwiLCJ0aGVtZVN5c3RlbSIsIkRhdGVQcm9maWxlR2VuZXJhdG9yIiwidWkiLCJldmVudERlZnMiLCJkZWZJZCIsImNyZWF0ZUV2ZW50VWkiLCJkaXNwbGF5IiwiZXZlbnREaXNwbGF5Iiwic3RhcnRFZGl0YWJsZSIsImV2ZW50U3RhcnRFZGl0YWJsZSIsImR1cmF0aW9uRWRpdGFibGUiLCJldmVudER1cmF0aW9uRWRpdGFibGUiLCJjb25zdHJhaW50IiwiZXZlbnRDb25zdHJhaW50Iiwib3ZlcmxhcCIsImV2ZW50T3ZlcmxhcCIsImFsbG93IiwiZXZlbnRBbGxvdyIsImV2ZW50QmFja2dyb3VuZENvbG9yIiwiZXZlbnRCb3JkZXJDb2xvciIsImV2ZW50VGV4dENvbG9yIiwiY29sb3IiLCJldmVudENvbG9yIiwic2VsZWN0Q29uc3RyYWludCIsInNlbGVjdE92ZXJsYXAiLCJzZWxlY3RBbGxvdyIsImlzTG9hZGluZ0Z1bmMiLCJwYXJzZUJ1c2luZXNzSG91cnMiLCJ2aWV3TmFtZSIsIlRvb2xiYXJTZWN0aW9uIiwid2lkZ2V0R3JvdXBzIiwid2lkZ2V0R3JvdXAiLCJyZW5kZXJXaWRnZXRHcm91cCIsImlzT25seUJ1dHRvbnMiLCJ3aWRnZXQiLCJ0aXRsZUlkIiwiaXNQcmVzc2VkIiwiYWN0aXZlQnV0dG9uIiwiaXNEaXNhYmxlZCIsImlzVG9kYXlFbmFibGVkIiwiaXNQcmV2RW5hYmxlZCIsImlzTmV4dEVuYWJsZWQiLCJidXR0b25DbGFzc2VzIiwiZ2V0Q2xhc3MiLCJkaXNhYmxlZCIsIm9uQ2xpY2siLCJncm91cENsYXNzTmFtZSIsIlRvb2xiYXIiLCJzdGFydENvbnRlbnQiLCJlbmRDb250ZW50IiwibW9kZWwiLCJleHRyYUNsYXNzTmFtZSIsImZvcmNlTHRyIiwiY2VudGVyQ29udGVudCIsImNlbnRlciIsInJlbmRlclNlY3Rpb24iLCJWaWV3SGFybmVzcyIsInN1cGVyIiwiYXZhaWxhYmxlV2lkdGgiLCJoYW5kbGVFbCIsInNldFJlZiIsImVsUmVmIiwidXBkYXRlQXZhaWxhYmxlV2lkdGgiLCJoYW5kbGVSZXNpemUiLCJhc3BlY3RSYXRpbyIsImxpcXVpZCIsInBhZGRpbmdCb3R0b20iLCJsYWJlbGVkQnlJZCIsImFkZFJlc2l6ZUhhbmRsZXIiLCJyZW1vdmVSZXNpemVIYW5kbGVyIiwib2Zmc2V0V2lkdGgiLCJFdmVudENsaWNraW5nIiwiSW50ZXJhY3Rpb24iLCJzZXR0aW5ncyIsImhhbmRsZVNlZ0NsaWNrIiwic2VnRWwiLCJzZWciLCJnZXRFbFNlZyIsImlzVmFsaWRTZWdEb3duRWwiLCJoYXNVcmxDb250YWluZXIiLCJlbGVtZW50Q2xvc2VzdCIsImhyZWYiLCJFdmVudEltcGwiLCJldmVudFJhbmdlIiwiaW5zdGFuY2UiLCJqc0V2ZW50IiwiZGVzdHJveSIsImxpc3RlbkJ5U2VsZWN0b3IiLCJFdmVudEhvdmVyaW5nIiwiaGFuZGxlRXZlbnRFbFJlbW92ZSIsImN1cnJlbnRTZWdFbCIsImhhbmRsZVNlZ0xlYXZlIiwiaGFuZGxlU2VnRW50ZXIiLCJ0cmlnZ2VyRXZlbnQiLCJyZW1vdmVIb3Zlckxpc3RlbmVycyIsImxpc3RlblRvSG92ZXJCeVNlbGVjdG9yIiwicHVibGljRXZOYW1lIiwiQ2FsZW5kYXJDb250ZW50IiwiYnVpbGRWaWV3Q29udGV4dCIsImJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnMiLCJidWlsZFRvb2xiYXJQcm9wcyIsImhlYWRlclJlZiIsImZvb3RlclJlZiIsImludGVyYWN0aW9uc1N0b3JlIiwidmlld0xhYmVsSWQiLCJnZXRVbmlxdWVEb21JZCIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJzZXR0aW5nc0lucHV0IiwicGFyc2VJbnRlcmFjdGlvblNldHRpbmdzIiwiaW50ZXJhY3Rpb25zIiwiVGhlSW50ZXJhY3Rpb25DbGFzcyIsInVpZCIsImludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSIsInVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImxpc3RlbmVycyIsImxpc3RlbmVyIiwicmVzaXplUnVubmVyIiwiaGFuZGxlV2luZG93UmVzaXplIiwid2luZG93UmVzaXplRGVsYXkiLCJ2aWV3QXNwZWN0UmF0aW8iLCJ0b29sYmFyUHJvcHMiLCJnZXROb3ciLCJ2aWV3Vkdyb3ciLCJ2aWV3SGVpZ2h0IiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb250ZW50SGVpZ2h0Iiwidmlld0NvbnRleHQiLCJyZW5kZXJWaWV3IiwiYnVpbGRBcHBlbmRDb250ZW50IiwiQ2FsZW5kYXJJbnRlcmFjdGlvbkNsYXNzIiwicHJvcE5hbWUiLCJwcmV2UHJvcHMiLCJpbnRlcmFjdGlvbiIsInRyYW5zZm9ybWVycyIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtIiwiVmlld0NvbXBvbmVudCIsInRvZGF5SW5mbyIsInByZXZJbmZvIiwibmV4dEluZm8iLCJ0aGVDbGFzc2VzIiwiVGhlQ2xhc3MiLCJDYWxlbmRhckltcGwiLCJpc1JlbmRlcmluZyIsImlzUmVuZGVyZWQiLCJjdXJyZW50Q2xhc3NOYW1lcyIsImN1c3RvbUNvbnRlbnRSZW5kZXJJZCIsImhhbmRsZUFjdGlvbiIsInJlbmRlclJ1bm5lciIsInRyeURyYWluIiwiaGFuZGxlRGF0YSIsImN1cnJlbnREYXRhIiwicmVyZW5kZXJEZWxheSIsImhhbmRsZVJlbmRlclJlcXVlc3QiLCJDYWxlbmRhclJvb3QiLCJzZXRDbGFzc05hbWVzIiwic2V0SGVpZ2h0IiwiUmVuZGVySWQiLCJlbnN1cmVFbEhhc1N0eWxlcyIsIndhc1JlbmRlcmluZyIsInVwZGF0ZVNpemUiLCJiYXRjaFJlbmRlcmluZyIsInBhdXNlUmVuZGVyaW5nIiwicmVzdW1lUmVuZGVyaW5nIiwiYXBwbHlTdHlsZVByb3AiLCJKc29uUmVxdWVzdEVycm9yIiwiZm9ybWF0RGF0ZSIsImRhdGVJbnB1dCIsImZvcm1hdHRlciIsImRhdGVNZXRhIiwiY3JlYXRlTWFya2VyTWV0YSIsIm1hcmtlciIsImZvcmNlZFR6byIsInN0YXJ0SW5wdXQiLCJlbmRJbnB1dCIsInN0YXJ0TWV0YSIsImVuZE1ldGEiLCJmb3JjZWRTdGFydFR6byIsImZvcmNlZEVuZFR6byIsInNsaWNlRXZlbnRzIiwiYWxsRGF5Iiwic2xpY2VFdmVudFN0b3JlIiwiZmciLCJjb21wYXQiLCJfaW50ZXJvcE5hbWVzcGFjZSIsIl9fZXNNb2R1bGUiLCJjcmVhdGUiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZnJlZXplIiwicHJlYWN0X19uYW1lc3BhY2UiLCJzdHlsZVRleHRzIiwic3R5bGVFbHMiLCJpbmplY3RTdHlsZXMiLCJzdHlsZVRleHQiLCJzdHlsZUVsIiwiYXBwZW5kU3R5bGVzVG8iLCJyZWdpc3RlclN0eWxlc1Jvb3QiLCJyb290Tm9kZSIsImlzQ29ubmVjdGVkIiwibm9uY2UiLCJxdWVyaWVkTm9uY2VWYWx1ZSIsIm1ldGFXaXRoTm9uY2UiLCJoYXNBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJlbFdpdGhOb25jZSIsInF1ZXJ5Tm9uY2VWYWx1ZSIsInBhcmVudEVsIiwiaGVhZCIsImh5ZHJhdGVTdHlsZXNSb290Iiwic2hlZXQiLCJydWxlQ250IiwiY3NzUnVsZXMiLCJzdHlsZVN0ciIsInRyaW0iLCJpbnNlcnRSdWxlIiwicmVtb3ZlRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsImVsZW1lbnRNYXRjaGVzIiwicGFyZW50RWxlbWVudCIsIm1hdGNoZXMiLCJtYXRjaGVzU2VsZWN0b3IiLCJtc01hdGNoZXNTZWxlY3RvciIsImZpbmRFbGVtZW50cyIsImNvbnRhaW5lciIsImNvbnRhaW5lcnMiLCJIVE1MRWxlbWVudCIsImFsbE1hdGNoZXMiLCJQSVhFTF9QUk9QX1JFIiwiYXBwbHlTdHlsZSIsInZhbCIsImdldEV2ZW50VGFyZ2V0VmlhUm9vdCIsIl9hIiwiX2IiLCJjb21wb3NlZFBhdGgiLCJndWlkJDEiLCJldmVudFR5cGUiLCJoYW5kbGVyIiwiYXR0YWNoZWRIYW5kbGVyIiwibWF0Y2hlZENoaWxkIiwiYnVpbGREZWxlZ2F0aW9uSGFuZGxlciIsInRyYW5zaXRpb25FdmVudE5hbWVzIiwiY3JlYXRlQXJpYUNsaWNrQXR0cnMiLCJjcmVhdGVBcmlhS2V5Ym9hcmRBdHRycyIsInRhYkluZGV4Iiwib25LZXlEb3duIiwiZ3VpZE51bWJlciIsInBhcnNlRmllbGRTcGVjcyIsInRva2VuIiwic3BlY3MiLCJ0b2tlbnMiLCJjaGFyQXQiLCJmaWVsZCIsIm9yZGVyIiwiY29tcGFyZUJ5RmllbGRTcGVjcyIsIm9iajAiLCJvYmoxIiwiZmllbGRTcGVjcyIsImNtcCIsImNvbXBhcmVCeUZpZWxkU3BlYyIsImZpZWxkU3BlYyIsImZsZXhpYmxlQ29tcGFyZSIsImxvY2FsZUNvbXBhcmUiLCJwYWRTdGFydCIsImxlbiIsInN1YnN0ciIsImFyZ3MiLCJmYWxsYmFja1RleHQiLCJzdHIiLCJpbmRleCIsImlzSW50IiwiY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoIiwiY2VsbEVsIiwiYWxsV2lkdGhFbCIsImNvbnRlbnRXaWR0aEVsIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJJTlRFUk5BTF9VTklUUyIsIlBBUlNFX1JFIiwiZXhlYyIsInNpZ24iLCJ5ZWFycyIsIm1vbnRocyIsInBhcnNlSW50IiwibWlsbGlzZWNvbmRzIiwicGFyc2VTdHJpbmciLCJwYXJzZU9iamVjdCIsIm9iaiIsImhvdXJzIiwiaG91ciIsIm1pbnV0ZXMiLCJtaW51dGUiLCJzZWNvbmRzIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJtcyIsIndlZWtzIiwic3BlY2lmaWVkV2Vla3MiLCJhc1JvdWdoRGF5cyIsImR1ciIsImFzUm91Z2hNcyIsImhhc093blByb3BlcnR5IiwicHJvcE9ianMiLCJjb21wbGV4UHJvcHNNYXAiLCJkZXN0IiwiaXNNYXliZU9iamVjdHNFcXVhbCIsImNvbXBsZXhPYmpzIiwiZmlsdGVyZWQiLCJuZXdIYXNoIiwiSEFORExFUl9SRSIsImdldFVuZXF1YWxQcm9wcyIsImNvbXBhcmVPYmpzIiwib2xkUHJvcHMiLCJuZXdQcm9wcyIsImVxdWFsaXR5RnVuY3MiLCJ2YWwwIiwidmFsMSIsImNvbXBhcmF0b3IiLCJjb2xsZWN0RnJvbUhhc2giLCJzdGFydEluZGV4IiwiZW5kSW5kZXgiLCJzdGVwIiwiYTAiLCJhMSIsImVxdWFsaXR5RnVuYyIsIkRBWV9JRFMiLCJkYXRlVG9VdGNBcnJheSIsImFycmF5VG9VdGNEYXRlIiwiYWRkTXMiLCJkaWZmRGF5cyIsIm0wIiwibTEiLCJkaWZmRGF5QW5kVGltZSIsIm0wZGF5IiwibTFkYXkiLCJyb3VuZCIsImRpZmZXaG9sZVdlZWtzIiwidGltZUFzTXMiLCJ3ZWVrT2ZHaXZlblllYXIiLCJmaXJzdFdlZWtTdGFydCIsImZpcnN0V2Vla09mZnNldCIsImRheVN0YXJ0IiwiZmxvb3IiLCJmd2QiLCJkYXRlVG9Mb2NhbEFycmF5IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJnZXRNaWxsaXNlY29uZHMiLCJhcnJheVRvTG9jYWxEYXRlIiwiZ2V0VVRDSG91cnMiLCJnZXRVVENNaW51dGVzIiwiZ2V0VVRDU2Vjb25kcyIsImdldFVUQ01pbGxpc2Vjb25kcyIsIlVUQyIsImlzVmFsaWREYXRlIiwiYnVpbGRJc29TdHJpbmciLCJ0aW1lWm9uZU9mZnNldCIsInN0cmlwWmVyb1RpbWUiLCJmb3JtYXRUaW1lWm9uZU9mZnNldCIsImZvcm1hdERheVN0cmluZyIsImRvSXNvIiwiYWJzIiwibWlucyIsIndvcmtlckZ1bmMiLCJyZXNFcXVhbGl0eSIsInRlYXJkb3duRnVuYyIsImN1cnJlbnRBcmdzIiwiY3VycmVudFJlcyIsIm5ld0FyZ3MiLCJjdXJyZW50QXJnIiwibmV3QXJnIiwiRVhURU5ERURfU0VUVElOR1NfQU5EX1NFVkVSSVRJRVMiLCJzZXBhcmF0b3IiLCJvbWl0WmVyb01pbnV0ZSIsIm1lcmlkaWVtIiwib21pdENvbW1hcyIsIlNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTIiwidGltZVpvbmVOYW1lIiwiZXJhIiwiTUVSSURJRU1fUkUiLCJDT01NQV9SRSIsIk1VTFRJX1NQQUNFX1JFIiwiTFRSX1JFIiwiVVRDX1JFIiwiTmF0aXZlRm9ybWF0dGVyIiwiZm9ybWF0U2V0dGluZ3MiLCJzdGFuZGFyZERhdGVQcm9wcyIsImV4dGVuZGVkU2V0dGluZ3MiLCJzZXZlcml0eSIsImJ1aWxkRm9ybWF0dGluZ0Z1bmMiLCJiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yIiwiZGlmZlNldmVyaXR5IiwiZDAiLCJkMSIsImNhIiwiZ2V0TWFya2VyWWVhciIsImdldE1hcmtlck1vbnRoIiwiZ2V0TWFya2VyRGF5IiwiYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsIiwiZnVsbDAiLCJmdWxsMSIsInBhcnRpYWxGb3JtYXR0aW5nRnVuYyIsImJpZ2dlc3RVbml0IiwicGFydGlhbE9wdGlvbnMiLCJjb21wdXRlUGFydGlhbEZvcm1hdHRpbmdPcHRpb25zIiwicGFydGlhbDAiLCJwYXJ0aWFsMSIsImluc2VydGlvbiIsImkwIiwiZm91bmQwIiwiYmVmb3JlMCIsImFmdGVyMCIsImkxIiwiZm91bmQxIiwiYmVmb3JlMSIsImFmdGVyMSIsImJlZm9yZSIsImFmdGVyIiwiZmluZENvbW1vbkluc2VydGlvbiIsImdldExhcmdlc3RVbml0Iiwic3RhbmRhcmREYXRlUHJvcENudCIsIm51bSIsImNvbXB1dGVXZWVrTnVtYmVyIiwic2FuaXRpemVTZXR0aW5ncyIsInplcm9Gb3JtYXQiLCJub3JtYWxGb3JtYXQiLCJEYXRlVGltZUZvcm1hdCIsInplcm9Qcm9wcyIsInR6b1N0ciIsInJlcGxhY2VkIiwiaW5qZWN0VHpvU3RyIiwicG9zdFByb2Nlc3MiLCJidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jIiwiZXhwYW5kWm9uZWRNYXJrZXIiLCJkYXRlSW5mbyIsIm1hcmtlclRvQXJyYXkiLCJhcnJheSIsImNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnIiwic3RhcnRJbmZvIiwibG9jYWxlQ29kZXMiLCJDbWRGb3JtYXR0ZXIiLCJjbWRTdHIiLCJGdW5jRm9ybWF0dGVyIiwibmF2TGlua0RheUNsaWNrIiwibmF2TGlua1dlZWtDbGljayIsImJvb3RzdHJhcEZvbnRBd2Vzb21lIiwiYnV0dG9uSWNvbnMiLCJkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiIsImRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24iLCJzY3JvbGxUaW1lIiwic2Nyb2xsVGltZVJlc2V0IiwiZGF5UG9wb3ZlckZvcm1hdCIsInNsb3REdXJhdGlvbiIsInNuYXBEdXJhdGlvbiIsImZvcmNlRXZlbnREdXJhdGlvbiIsImRheUhlYWRlcnMiLCJkYXlIZWFkZXJGb3JtYXQiLCJkYXlIZWFkZXJDbGFzc05hbWVzIiwiZGF5SGVhZGVyQ29udGVudCIsImRheUhlYWRlckRpZE1vdW50IiwiZGF5SGVhZGVyV2lsbFVubW91bnQiLCJkYXlDZWxsQ2xhc3NOYW1lcyIsImRheUNlbGxDb250ZW50IiwiZGF5Q2VsbERpZE1vdW50IiwiZGF5Q2VsbFdpbGxVbm1vdW50Iiwid2Vla051bWJlcnMiLCJ3ZWVrTnVtYmVyQ2xhc3NOYW1lcyIsIndlZWtOdW1iZXJDb250ZW50Iiwid2Vla051bWJlckRpZE1vdW50Iiwid2Vla051bWJlcldpbGxVbm1vdW50Iiwidmlld0NsYXNzTmFtZXMiLCJ2aWV3RGlkTW91bnQiLCJ2aWV3V2lsbFVubW91bnQiLCJub3dJbmRpY2F0b3IiLCJub3dJbmRpY2F0b3JDbGFzc05hbWVzIiwibm93SW5kaWNhdG9yQ29udGVudCIsIm5vd0luZGljYXRvckRpZE1vdW50Iiwibm93SW5kaWNhdG9yV2lsbFVubW91bnQiLCJkcmFnUmV2ZXJ0RHVyYXRpb24iLCJkcmFnU2Nyb2xsIiwiYWxsRGF5TWFpbnRhaW5EdXJhdGlvbiIsInVuc2VsZWN0QXV0byIsImRyb3BBY2NlcHQiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsImxvbmdQcmVzc0RlbGF5IiwiZXZlbnREcmFnTWluRGlzdGFuY2UiLCJleHBhbmRSb3dzIiwid2Vla051bWJlckZvcm1hdCIsImV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0IiwiZGlzcGxheUV2ZW50VGltZSIsImRpc3BsYXlFdmVudEVuZCIsImluaXRpYWxEYXRlIiwiZXZlbnREYXRhVHJhbnNmb3JtIiwic3RpY2t5SGVhZGVyRGF0ZXMiLCJzdGlja3lGb290ZXJTY3JvbGxiYXIiLCJkZWZhdWx0QWxsRGF5IiwiZXZlbnRDbGFzc05hbWVzIiwiZXZlbnRDb250ZW50IiwiZXZlbnREaWRNb3VudCIsImV2ZW50V2lsbFVubW91bnQiLCJkcm9wcGFibGUiLCJ1bnNlbGVjdENhbmNlbCIsInNsb3RMYWJlbEZvcm1hdCIsInNsb3RMYW5lQ2xhc3NOYW1lcyIsInNsb3RMYW5lQ29udGVudCIsInNsb3RMYW5lRGlkTW91bnQiLCJzbG90TGFuZVdpbGxVbm1vdW50Iiwic2xvdExhYmVsQ2xhc3NOYW1lcyIsInNsb3RMYWJlbENvbnRlbnQiLCJzbG90TGFiZWxEaWRNb3VudCIsInNsb3RMYWJlbFdpbGxVbm1vdW50IiwiZGF5TWF4RXZlbnRzIiwiZGF5TWF4RXZlbnRSb3dzIiwiZGF5TWluV2lkdGgiLCJzbG90TGFiZWxJbnRlcnZhbCIsImFsbERheUNsYXNzTmFtZXMiLCJhbGxEYXlDb250ZW50IiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsInNsb3RNaW5XaWR0aCIsIm5hdkxpbmtzIiwiZXZlbnRUaW1lRm9ybWF0Iiwic2VsZWN0TWluRGlzdGFuY2UiLCJzZWxlY3RMb25nUHJlc3NEZWxheSIsImV2ZW50TG9uZ1ByZXNzRGVsYXkiLCJzZWxlY3RNaXJyb3IiLCJldmVudE1heFN0YWNrIiwiZXZlbnRNaW5IZWlnaHQiLCJldmVudE1pbldpZHRoIiwiZXZlbnRTaG9ydEhlaWdodCIsInNsb3RFdmVudE92ZXJsYXAiLCJldmVudEludGVyYWN0aXZlIiwibW9yZUxpbmtDbGljayIsIm1vcmVMaW5rQ2xhc3NOYW1lcyIsIm1vcmVMaW5rQ29udGVudCIsIm1vcmVMaW5rRGlkTW91bnQiLCJtb3JlTGlua1dpbGxVbm1vdW50IiwibW9udGhTdGFydEZvcm1hdCIsImhhbmRsZUN1c3RvbVJlbmRlcmluZyIsImN1c3RvbVJlbmRlcmluZ01ldGFNYXAiLCJjdXN0b21SZW5kZXJpbmdSZXBsYWNlc0VsIiwiZGF0ZXNTZXQiLCJldmVudHNTZXQiLCJldmVudEFkZCIsImV2ZW50Q2hhbmdlIiwiZXZlbnRSZW1vdmUiLCJ3aW5kb3dSZXNpemUiLCJldmVudENsaWNrIiwiZXZlbnRNb3VzZUVudGVyIiwiZXZlbnRNb3VzZUxlYXZlIiwic2VsZWN0IiwidW5zZWxlY3QiLCJsb2FkaW5nIiwiX3VubW91bnQiLCJfYmVmb3JlcHJpbnQiLCJfYWZ0ZXJwcmludCIsIl9ub0V2ZW50RHJvcCIsIl9ub0V2ZW50UmVzaXplIiwiX3Jlc2l6ZSIsIl9zY3JvbGxSZXF1ZXN0IiwiaXNNYXliZUFycmF5c0VxdWFsIiwicmVmaW5lUHJvcHMiLCJjcmVhdGVFdmVudEluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImV4cGFuZFJlY3VycmluZyIsImluc3RhbmNlcyIsInJlY3VycmluZ0RlZiIsInN0YXJ0cyIsImV4cGFuZFJlY3VycmluZ1JhbmdlcyIsImV2ZW50RGVmIiwibWFya2VycyIsInR5cGVJZCIsInN1YnRyYWN0IiwicGFyc2VFdmVudHMiLCJhbGxvd09wZW5SYW5nZSIsImRlZklkTWFwIiwiaW5zdGFuY2VJZE1hcCIsImJ1aWxkRXZlbnRSZWZpbmVycyIsInJhd0V2ZW50IiwidHVwbGUiLCJwYXJzZUV2ZW50IiwiZXZlbnRUdXBsZVRvU3RvcmUiLCJnZXRSZWxldmFudEV2ZW50cyIsIm5ld1N0b3JlIiwiZmlsdGVyRXZlbnRTdG9yZURlZnMiLCJsb29rRGVmIiwiaXNFdmVudERlZnNHcm91cGVkIiwiZGVmMCIsImRlZjEiLCJtZXJnZUV2ZW50U3RvcmVzIiwic3RvcmUwIiwic3RvcmUxIiwiZmlsdGVyRnVuYyIsInBhcnNlQ2xhc3NOYW1lcyIsIkVWRU5UX1VJX1JFRklORVJTIiwiRU1QVFlfRVZFTlRfVUkiLCJjb25zdHJhaW50cyIsImFsbG93cyIsIm5vcm1hbGl6ZUNvbnN0cmFpbnQiLCJjb21iaW5lRXZlbnRVaXMiLCJ1aXMiLCJjb21iaW5lVHdvRXZlbnRVaXMiLCJpdGVtMCIsIml0ZW0xIiwiRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlMiLCJpbnRlcmFjdGl2ZSIsIkVWRU5UX0RBVEVfUkVGSU5FUlMiLCJFVkVOVF9SRUZJTkVSUyIsImV4dGVuZGVkUHJvcHMiLCJyZWZpbmVFdmVudERlZiIsImNvbXB1dGVJc0RlZmF1bHRBbGxEYXkiLCJyZWN1cnJpbmdSZXMiLCJwYXJzZWQiLCJwYXJzZVJlY3VycmluZyIsInBhcnNlRXZlbnREZWYiLCJzaW5nbGVSZXMiLCJzdGFydE1hcmtlciIsImhhc0VuZCIsImlzVGltZVVuc3BlY2lmaWVkIiwicGFyc2VTaW5nbGUiLCJwdWJsaWNJZCIsIm1lbWJlckFkZGVyIiwiREVGX0RFRkFVTFRTIiwiY29tcHV0ZUFsaWduZWREYXlSYW5nZSIsInRpbWVkUmFuZ2UiLCJkYXlDbnQiLCJjb21wdXRlVmlzaWJsZURheVJhbmdlIiwic3RhcnREYXkiLCJlbmREYXkiLCJlbmRUaW1lTVMiLCJkaWZmRGF0ZXMiLCJsYXJnZVVuaXQiLCJkaWZmV2hvbGVZZWFycyIsImRpZmZXaG9sZU1vbnRocyIsImludGVyc2VjdFJlY3RzIiwicmVjdDEiLCJyZWN0MiIsIm1pbiIsInRvcCIsImJvdHRvbSIsImNhblZHcm93V2l0aGluQ2VsbCIsImdldENhblZHcm93V2l0aGluQ2VsbCIsInBvc2l0aW9uIiwiYm9keSIsInBvc3NpYmxlIiwib2Zmc2V0SGVpZ2h0IiwiY29tcHV0ZUNhblZHcm93V2l0aGluQ2VsbCIsIkVNUFRZX0VWRU5UX1NUT1JFIiwiYnVpbGRFdmVudFVpRm9yS2V5IiwiYWxsVWkiLCJldmVudFVpRm9yS2V5IiwiaW5kaXZpZHVhbFVpIiwiYmFzZVBhcnRzIiwic3R1ZmYiLCJpbnZlcnRSYW5nZXMiLCJyYW5nZXMiLCJjb25zdHJhaW50UmFuZ2UiLCJkYXRlUmFuZ2UiLCJpbnZlcnRlZFJhbmdlcyIsImNvbXBhcmVSYW5nZXMiLCJyYW5nZTAiLCJyYW5nZTEiLCJuZXdSYW5nZSIsInJhbmdlc0VxdWFsIiwicmFuZ2VzSW50ZXJzZWN0IiwicmFuZ2VDb250YWluc1JhbmdlIiwib3V0ZXJSYW5nZSIsImlubmVyUmFuZ2UiLCJnZXREYXRlTWV0YSIsInRvZGF5UmFuZ2UiLCJub3dEYXRlIiwiaXNPdGhlciIsImlzVG9kYXkiLCJpc1Bhc3QiLCJpc0Z1dHVyZSIsImdldERheUNsYXNzTmFtZXMiLCJEQVlfRk9STUFUIiwiV0VFS19GT1JNQVQiLCJidWlsZE5hdkxpbmtBdHRycyIsImlzVGFiYmFibGUiLCJ6b25lZERhdGUiLCJoYW5kbGVJbnRlcmFjdGlvbiIsImN1c3RvbUFjdGlvbiIsInpvb21UbyIsIl9zY3JvbGxiYXJXaWR0aHMiLCJfaXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJnZXRJc1J0bFNjcm9sbGJhck9uTGVmdCIsIm91dGVyRWwiLCJib3JkZXIiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJnZXRTY3JvbGxiYXJXaWR0aHMiLCJjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwiLCJjb21wdXRlU2Nyb2xsYmFyV2lkdGhzIiwiY2xpZW50SGVpZ2h0IiwiY2xpZW50V2lkdGgiLCJjb21wdXRlRWRnZXMiLCJnZXRQYWRkaW5nIiwiY29tcHV0ZWRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyVG9wIiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b20iLCJib3JkZXJCb3R0b21XaWR0aCIsImJhZFNjcm9sbGJhcldpZHRocyIsInNjcm9sbGJhckxlZnRSaWdodCIsInNjcm9sbGJhckJvdHRvbSIsInNjcm9sbGJhckxlZnQiLCJzY3JvbGxiYXJSaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ1RvcCIsImNvbXB1dGVSZWN0IiwicmVjdCIsInBhZ2VYT2Zmc2V0IiwicGFnZVlPZmZzZXQiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJwYXJlbnRzIiwib3ZlcmZsb3dZIiwib3ZlcmZsb3dYIiwiaGFuZGxlcnMiLCJ0aGlzQ29udGV4dCIsImFkZFRvSGFzaCIsIm9mZiIsInJlbW92ZUZyb21IYXNoIiwiYXR0YWNoZWRIYW5kbGVycyIsIm9wdGlvbkhhbmRsZXIiLCJzaW1pbGFyTnVtQXJyYXlzIiwiU2Nyb2xsQ29udHJvbGxlciIsImdldE1heFNjcm9sbFRvcCIsImdldFNjcm9sbEhlaWdodCIsImdldENsaWVudEhlaWdodCIsImdldE1heFNjcm9sbExlZnQiLCJnZXRTY3JvbGxXaWR0aCIsImdldENsaWVudFdpZHRoIiwiY2FuU2Nyb2xsVmVydGljYWxseSIsImNhblNjcm9sbEhvcml6b250YWxseSIsImNhblNjcm9sbFVwIiwiZ2V0U2Nyb2xsVG9wIiwiY2FuU2Nyb2xsRG93biIsImNhblNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiY2FuU2Nyb2xsUmlnaHQiLCJzZXRJY29uT3ZlcnJpZGUiLCJpY29uT3ZlcnJpZGVIYXNoIiwiaWNvbkNsYXNzZXNDb3B5IiwiYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgiLCJwcmVmaXgiLCJGYWtlQ29tcG9uZW50IiwiQ29udGV4dFR5cGUiLCJvcmlnUHJvdmlkZXIiLCJpc05ldyIsInN1YnMiLCJfcHJvcHMiLCJvbGQiLCJTY3JvbGxSZXNwb25kZXIiLCJleGVjRnVuYyIsImhhbmRsZVNjcm9sbFJlcXVlc3QiLCJxdWV1ZWRSZXF1ZXN0IiwiZmlyZUluaXRpYWxTY3JvbGwiLCJkZXRhY2giLCJ1cGRhdGUiLCJpc0RhdGVzTmV3IiwidGltZSIsIm5leHRQcm9wcyIsIm5leHRTdGF0ZSIsImRlYnVnIiwicHJvcEVxdWFsaXR5Iiwic3RhdGVFcXVhbGl0eSIsInNhZmVTZXRTdGF0ZSIsImFkZFByb3BzRXF1YWxpdHkiLCJhZGRTdGF0ZUVxdWFsaXR5IiwiRGF0ZUNvbXBvbmVudCIsInByZXBhcmVIaXRzIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImVsV2lkdGgiLCJlbEhlaWdodCIsImlzVmFsaWREYXRlRG93bkVsIiwiY3JlYXRlTm93TWFya2VyIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJwZXYiLCJidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQiLCJvcmlnRXZlbnQiLCJkYXRlU3BhbiIsInNwYW4iLCJidWlsZFJhbmdlQXBpIiwiZ2V0RGVmYXVsdEV2ZW50RW5kIiwiYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZSIsImV2ZW50Q29uZmlnQmFzZSIsIm11dGF0aW9uIiwiZXZlbnRDb25maWdzIiwiY29tcGlsZUV2ZW50VWlzIiwiYXBwbHlNdXRhdGlvblRvRXZlbnREZWYiLCJhcHBseU11dGF0aW9uVG9FdmVudEluc3RhbmNlIiwiZXZlbnRDb25maWciLCJzdGFuZGFyZFByb3BzIiwic3RhcnREZWx0YSIsImVuZERlbHRhIiwiYXBwbGllciIsImV2ZW50SW5zdGFuY2UiLCJmb3JjZUFsbERheSIsImNsZWFyRW5kIiwiZGF0ZXNEZWx0YSIsIkV2ZW50U291cmNlSW1wbCIsImludGVybmFsRXZlbnRTb3VyY2UiLCJyZWZldGNoIiwiX2NvbnRleHQiLCJfZGVmIiwiX2luc3RhbmNlIiwic2V0UHJvcCIsIm11dGF0ZSIsInNldEV4dGVuZGVkUHJvcCIsInNldFN0YXJ0IiwiZ3JhbnVsYXJpdHkiLCJtYWludGFpbkR1cmF0aW9uIiwic2V0RW5kIiwic2V0RGF0ZXMiLCJpbnN0YW5jZVJhbmdlIiwibW92ZVN0YXJ0IiwiZGVsdGFJbnB1dCIsImRlbHRhIiwibW92ZUVuZCIsIm1vdmVEYXRlcyIsInNldEFsbERheSIsImZvcm1hdElucHV0IiwicmVsZXZhbnRFdmVudHMiLCJvbGRFdmVudCIsInJlbGF0ZWRFdmVudHMiLCJyZXZlcnQiLCJhc1N0b3JlIiwiZXZlbnRBcGlUb1N0b3JlIiwib21pdFRpbWUiLCJ0b1BsYWluT2JqZWN0IiwiY29sbGFwc2VDb2xvciIsImNvbGxhcHNlRXh0ZW5kZWRQcm9wcyIsInRvSlNPTiIsImV2ZW50QXBpIiwiZXhjbHVkZUluc3RhbmNlIiwiZXZlbnRBcGlzIiwiZXhjbHVkZUluc3RhbmNlSWQiLCJpbnZlcnNlQmdCeUdyb3VwSWQiLCJpbnZlcnNlQmdCeURlZklkIiwiZGVmQnlHcm91cElkIiwiYmdSYW5nZXMiLCJmZ1JhbmdlcyIsImV2ZW50VWlzIiwib3JpZ1JhbmdlIiwibm9ybWFsUmFuZ2UiLCJzbGljZWRSYW5nZSIsImlzU3RhcnQiLCJpc0VuZCIsImludmVydGVkUmFuZ2UiLCJiZyIsInNldEVsU2VnIiwiZmNTZWciLCJjb21waWxlRXZlbnRVaSIsImJ1aWxkU2VnQ29tcGFyZU9iaiIsIl9zZWciLCJjb21wdXRlU2VnRHJhZ2dhYmxlIiwiY29tcHV0ZVNlZ1N0YXJ0UmVzaXphYmxlIiwiY29tcHV0ZVNlZ0VuZFJlc2l6YWJsZSIsImJ1aWxkU2VnVGltZVRleHQiLCJ0aW1lRm9ybWF0IiwiZGVmYXVsdERpc3BsYXlFdmVudFRpbWUiLCJkZWZhdWx0RGlzcGxheUV2ZW50RW5kIiwic3RhcnRPdmVycmlkZSIsImVuZE92ZXJyaWRlIiwid2hvbGVFdmVudFN0YXJ0Iiwid2hvbGVFdmVudEVuZCIsInNlZ1N0YXJ0Iiwic2VnRW5kIiwiaXNTdGFydERheSIsImlzRW5kRGF5IiwiZ2V0RXZlbnRDbGFzc05hbWVzIiwiaXNNaXJyb3IiLCJpc0RyYWdnYWJsZSIsImlzU3RhcnRSZXNpemFibGUiLCJpc0VuZFJlc2l6YWJsZSIsImlzRHJhZ2dpbmciLCJpc1Jlc2l6aW5nIiwiaXNTZWxlY3RlZCIsImdldFNlZ0FuY2hvckF0dHJzIiwiU1RBTkRBUkRfUFJPUFMiLCJjYWxlbmRhclN5c3RlbUNsYXNzTWFwIiwidGhlQ2xhc3MiLCJhcnJheVRvTWFya2VyIiwiYXJyIiwiSVNPX1JFIiwiZ2V0RW50cnlTcGFuRW5kIiwiZW50cnkiLCJidWlsZEVudHJ5S2V5IiwiaW50ZXJzZWN0U3BhbnMiLCJzcGFuMCIsInNwYW4xIiwiaW5zZXJ0QXQiLCJpdGVtIiwiYmluYXJ5U2VhcmNoIiwic2VhcmNoVmFsIiwiZ2V0SXRlbVZhbCIsIm1pZGRsZUluZGV4IiwibWlkZGxlVmFsIiwiRFJBR19NRVRBX1JFRklORVJTIiwiY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0IiwiZGF0ZXNSZXBEaXN0aW5jdERheXMiLCJDTEFTU19OQU1FIiwicmVuZGVySW5uZXIkMSIsIkNvbnRlbnRJbmplY3RvciIsInF1ZXVlZERvbU5vZGVzIiwiY3VycmVudERvbU5vZGVzIiwiZGVmYXVsdEdlbmVyYXRvciIsImF0dHJzIiwiYnVpbGRFbEF0dHJzIiwiaW5uZXJDb250ZW50IiwiY3VycmVudEdlbmVyYXRvck1ldGEiLCJ1c2VEZWZhdWx0IiwiY3VzdG9tR2VuZXJhdG9yUmVzIiwiaXNPYmplY3QiLCJodG1sIiwiZG9tTm9kZXMiLCJoYXNDdXN0b21SZW5kZXJpbmdIYW5kbGVyIiwiYXBwbHlRdWV1ZXVkRG9tTm9kZXMiLCJ0cmlnZ2VyQ3VzdG9tUmVuZGVyaW5nIiwiaXNBY3RpdmUiLCJnZW5lcmF0b3JNZXRhIiwiY29udGFpbmVyRWwiLCJyZXBvcnROZXdDb250YWluZXJFbCIsImlzVHJ1dGh5IiwibmV3Tm9kZSIsImV4dHJhQ2xhc3NOYW1lcyIsImVsQXR0cnMiLCJlbFN0eWxlIiwiSW5uZXJDb250ZW50IiwiSW5uZXJDb250ZW50SW5qZWN0b3IiLCJoYW5kbGVSb290RWwiLCJyb290RWwiLCJnZW5lcmF0ZWRDbGFzc05hbWVzIiwiZ2VuZXJhdGVDbGFzc05hbWVzIiwicmVuZGVySWQiLCJjb250YWluZXJDb21wb25lbnQiLCJwYXJlbnRQcm9wcyIsIlRhYmxlRGF0ZUNlbGwiLCJkYXlNZXRhIiwibmF2TGlua0F0dHJzIiwiY29sQ250IiwiZXh0cmFSZW5kZXJQcm9wcyIsInJvbGUiLCJjb2xTcGFuIiwiZXh0cmFEYXRhQXR0cnMiLCJJbm5lckNvbnRhaW5lciIsImlzU3RpY2t5IiwiV0VFS0RBWV9GT1JNQVQiLCJUYWJsZURvd0NlbGwiLCJOb3dUaW1lciIsImluaXRpYWxOb3dEYXRlIiwiaW5pdGlhbE5vd1F1ZXJpZWRNcyIsImNvbXB1dGVUaW1pbmciLCJjdXJyZW50U3RhdGUiLCJ1bnJvdW5kZWROb3ciLCJjdXJyZW50VW5pdFN0YXJ0Iiwic3RhcnRPZiIsIm5leHRVbml0U3RhcnQiLCJ3YWl0TXMiLCJidWlsZERheVJhbmdlIiwidGltZW91dElkIiwiY3JlYXRlRGF5SGVhZGVyRm9ybWF0dGVyIiwiZXhwbGljaXRGb3JtYXQiLCJkYXRlQ250IiwiY29tcHV0ZUFjdGl2ZVJhbmdlIiwiaXNDb21wb25lbnRBbGxEYXkiLCJ0cmFuc2Zvcm1SYXdFdmVudHMiLCJjYWxFYWNoVHJhbnNmb3JtIiwic291cmNlRWFjaFRyYW5zZm9ybSIsInRyYW5zZm9ybUVhY2hSYXdFdmVudCIsInJlZmluZWRFdmVudHMiLCJyZWZpbmVkRXZlbnQiLCJleGNsdWRlRXZlbnRzQnlTb3VyY2VJZCIsImlzTmV3UHJvcHNWYWxpZCIsImNhbGVuZGFyU3RhdGUiLCJkYXRlU3Bhbk1ldGEiLCJmaWx0ZXJDb25maWciLCJzdWJqZWN0RXZlbnRTdG9yZSIsInN1YmplY3REZWZzIiwic3ViamVjdEluc3RhbmNlcyIsInN1YmplY3RDb25maWdzIiwib3RoZXJFdmVudFN0b3JlIiwicmVtb3ZhbHMiLCJvdGhlckRlZnMiLCJvdGhlckluc3RhbmNlcyIsIm90aGVyQ29uZmlncyIsInN1YmplY3RJbnN0YW5jZUlkIiwic3ViamVjdEluc3RhbmNlIiwic3ViamVjdFJhbmdlIiwic3ViamVjdENvbmZpZyIsInN1YmplY3REZWYiLCJhbGxDb25zdHJhaW50c1Bhc3MiLCJldmVudE92ZXJsYXBGdW5jIiwib3RoZXJJbnN0YW5jZUlkIiwib3RoZXJJbnN0YW5jZSIsImNhbGVuZGFyRXZlbnRTdG9yZSIsInN1YmplY3RBbGxvdyIsInN1YmplY3REYXRlU3BhbiIsIm9yaWdEZWYiLCJvcmlnSW5zdGFuY2UiLCJpc0ludGVyYWN0aW9uUHJvcHNWYWxpZCIsInJlbGV2YW50RXZlbnRTdG9yZSIsInJlbGV2YW50RGVmcyIsInJlbGV2YW50SW5zdGFuY2VzIiwic2VsZWN0aW9uUmFuZ2UiLCJzZWxlY3RPdmVybGFwRnVuYyIsInJlbGV2YW50SW5zdGFuY2VJZCIsInJlbGV2YW50SW5zdGFuY2UiLCJzZWxlY3Rpb25BbGxvdyIsImlzRGF0ZVNlbGVjdGlvblByb3BzVmFsaWQiLCJidXNpbmVzc0hvdXJzVW5leHBhbmRlZCIsImFueVJhbmdlc0NvbnRhaW5SYW5nZSIsImNvbnN0cmFpbnRUb1JhbmdlcyIsImV2ZW50U3RvcmVUb1JhbmdlcyIsIm91dGVyUmFuZ2VzIiwiVklTSUJMRV9ISURERU5fUkUiLCJTY3JvbGxlciIsImxpcXVpZElzQWJzb2x1dGUiLCJpc0Fic29sdXRlIiwib3ZlcmNvbWVMZWZ0Iiwib3ZlcmNvbWVSaWdodCIsIm92ZXJjb21lQm90dG9tIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwibWFyZ2luQm90dG9tIiwibWF4SGVpZ2h0IiwibmVlZHNYU2Nyb2xsaW5nIiwicmVhbENsaWVudFdpZHRoIiwiZ2V0WVNjcm9sbGJhcldpZHRoIiwibmVlZHNZU2Nyb2xsaW5nIiwicmVhbENsaWVudEhlaWdodCIsImdldFhTY3JvbGxiYXJXaWR0aCIsIlJlZk1hcCIsIm1hc3RlckNhbGxiYWNrIiwiY3VycmVudE1hcCIsImRlcHRocyIsImNhbGxiYWNrTWFwIiwiaGFuZGxlVmFsdWUiLCJyZW1vdmVkIiwiYWRkZWQiLCJyZWZDYWxsYmFjayIsImNvbGxlY3QiLCJnZXRBbGwiLCJjb21wdXRlU2hyaW5rV2lkdGgiLCJjaHVua0VscyIsInNocmlua0NlbGxzIiwibGFyZ2VzdFdpZHRoIiwic2hyaW5rQ2VsbCIsImNlaWwiLCJnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0Iiwic2VjdGlvbkNvbmZpZyIsImdldEFsbG93WVNjcm9sbGluZyIsInJlbmRlckNodW5rQ29udGVudCIsImNodW5rQ29uZmlnIiwiaXNIZWFkZXIiLCJ0YWJsZUNsYXNzTmFtZSIsInN5bmNSb3dIZWlnaHRzIiwibWluV2lkdGgiLCJ0YWJsZU1pbldpZHRoIiwidGFibGVDb2xHcm91cE5vZGUiLCJyb3dDb250ZW50IiwiaXNDb2xQcm9wc0VxdWFsIiwiY29sczAiLCJjb2xzMSIsInJlbmRlck1pY3JvQ29sR3JvdXAiLCJjb2xzIiwic2hyaW5rV2lkdGgiLCJjb2xOb2RlcyIsImNvbFByb3BzIiwic2FuaXRpemVTaHJpbmtXaWR0aCIsImhhc1Nocmlua1dpZHRoIiwiY29sIiwiZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMiLCJnZXRTZWN0aW9uQ2xhc3NOYW1lcyIsIndob2xlVGFibGVWR3JvdyIsIlNpbXBsZVNjcm9sbEdyaWQiLCJwcm9jZXNzQ29scyIsInNjcm9sbGVyUmVmcyIsInNjcm9sbGVyRWxSZWZzIiwiX2hhbmRsZVNjcm9sbGVyRWwiLCJmb3JjZVlTY3JvbGxiYXJzIiwic2Nyb2xsZXJDbGllbnRXaWR0aHMiLCJzY3JvbGxlckNsaWVudEhlaWdodHMiLCJoYW5kbGVTaXppbmciLCJjb21wdXRlU2Nyb2xsZXJEaW1zIiwic2VjdGlvbkNvbmZpZ3MiLCJzZWN0aW9ucyIsIm1pY3JvQ29sR3JvdXBOb2RlIiwiY29sbGFwc2libGVXaWR0aCIsImN1cnJlbnRDb25maWciLCJjb25maWdDbnQiLCJjb25maWdJIiwiaGVhZFNlY3Rpb25Ob2RlcyIsImJvZHlTZWN0aW9uTm9kZXMiLCJmb290U2VjdGlvbk5vZGVzIiwiaXNCdWdneSIsInJvbGVBdHRycyIsIm91dGVyQ29udGVudCIsInJlbmRlckNodW5rVGQiLCJjaHVuayIsImlzTGlxdWlkIiwic2VjdGlvbktleSIsInJvd1N5bmNIZWlnaHRzIiwicmVwb3J0Um93SGVpZ2h0Q2hhbmdlIiwic2Nyb2xsZXJFbCIsInNlY3Rpb24iLCJnZXRTZWN0aW9uQnlLZXkiLCJzY3JvbGxlckVsUmVmIiwic2Nyb2xsYmFyV2lkdGgiLCJzY3JvbGxlciIsImhhcm5lc3NFbCIsIkV2ZW50Q29udGFpbmVyIiwidGltZVRleHQiLCJkaXNhYmxlRHJhZ2dpbmciLCJkaXNhYmxlUmVzaXppbmciLCJpc0RhdGVTZWxlY3RpbmciLCJyZW5kZXJJbm5lckNvbnRlbnQkMSIsImlubmVyUHJvcHMiLCJEQVlfTlVNX0ZPUk1BVCIsIkRheUNlbGxDb250YWluZXIiLCJyZWZpbmVSZW5kZXJQcm9wcyIsImlzTW9udGhTdGFydCIsInNob3dEYXlOdW1iZXIiLCJoYXNDdXN0b21EYXlDZWxsQ29udGVudCIsImRheU51bWJlclRleHQiLCJyZW5kZXJJbm5lckNvbnRlbnQiLCJyZW5kZXJJbm5lciIsIlBvcG92ZXIiLCJoYW5kbGVEb2N1bWVudE1vdXNlRG93biIsImhhbmRsZUNsb3NlQ2xpY2siLCJoYW5kbGVEb2N1bWVudEtleURvd24iLCJvbkNsb3NlIiwiZXh0cmFBdHRycyIsImFsaWdubWVudEVsIiwiYWxpZ25HcmlkVG9wIiwiYWxpZ25tZW50UmVjdCIsImNsaXBwaW5nUGFyZW50cyIsImNsaXBwaW5nUGFyZW50IiwiaW50ZXJzZWN0aW9uIiwiY29tcHV0ZUNsaXBwZWRDbGllbnRSZWN0IiwicG9wb3ZlckRpbXMiLCJwb3BvdmVyVG9wIiwicG9wb3ZlckxlZnQiLCJvcmlnaW4iLCJvZmZzZXRQYXJlbnQiLCJNb3JlUG9wb3ZlciIsInVzZUV2ZW50Q2VudGVyIiwic3RhcnREYXRlIiwiZm9yY2VUaW1lZCIsImVuZERhdGUiLCJleHRyYURhdGVTcGFuIiwiZGF5RWwiLCJsYXllciIsInJlbmRlck1vcmVMaW5rSW5uZXIiLCJjb21wdXRlUmFuZ2UiLCJhbGxEYXlEYXRlIiwiaGlkZGVuU2VncyIsImNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0Iiwic2VncyIsInBpY2tMYXRlc3RFbmQiLCJwaWNrRWFybGllc3RTdGFydCIsInNlZzAiLCJzZWcxIiwiRVZFTlRfU09VUkNFX1JFRklORVJTIiwicmF3T2JqIiwibWV0YVJlcyIsImJ1aWxkRXZlbnRTb3VyY2VNZXRhIiwiU3RvcmUiLCJjdXJyZW50VmFsdWUiLCJzdWJzY3JpYmUiLCJCZ0V2ZW50IiwiZ2V0QXZhaWxhYmxlTG9jYWxlQ29kZXMiLCJoYW5kbGVyTmFtZSIsImRhdGVPclJhbmdlIiwic3BlYyIsImdldFVuaXRWaWV3U3BlYyIsInZpZXdUeXBlcyIsImFkZFllYXJzIiwiZ290b0RhdGUiLCJ6b25lZERhdGVJbnB1dCIsImluY3JlbWVudERhdGUiLCJkYXRlT3JPYmoiLCJzZWxlY3Rpb25JbnB1dCIsImRlZmF1bHREdXJhdGlvbiIsInBhcnNlT3BlbkRhdGVTcGFuIiwicGFyc2VEYXRlU3BhbiIsInRyaWdnZXJEYXRlVW5zZWxlY3QiLCJldmVudElucHV0Iiwic291cmNlSW5wdXQiLCJ0cmlnZ2VyRXZlbnRBZGQiLCJzb3VyY2VBcGkiLCJnZXRFdmVudFNvdXJjZUJ5SWQiLCJuZXdFdmVudEFwaSIsInJlbW92ZUFsbEV2ZW50cyIsImdldEV2ZW50U291cmNlcyIsInNvdXJjZUFwaXMiLCJpbnRlcm5hbElkIiwicmVtb3ZlQWxsRXZlbnRTb3VyY2VzIiwicmVmZXRjaEV2ZW50cyIsInNjcm9sbFRvVGltZSIsInRpbWVJbnB1dCIsImhhbmRsZUJlZm9yZVByaW50IiwiaGFuZGxlQWZ0ZXJQcmludCIsIkN1c3RvbVJlbmRlcmluZ1N0b3JlIiwiaGFuZGxlIiwiY3VzdG9tUmVuZGVyaW5nIiwiaXNOYW1lZFRpbWVab25lIiwiY2FuQ29tcHV0ZU9mZnNldCIsImNyZWF0ZUNhbGVuZGFyU3lzdGVtIiwid2Vla0RvdyIsIndlZWtEb3kiLCJ3ZWVrTnVtYmVyRnVuYyIsInRpbWVzdGFtcFRvTWFya2VyIiwiZ2V0WWVhciIsImdldERheSIsImFkZE1vbnRocyIsImdyZWF0ZXN0V2hvbGVVbml0IiwiZGlmZkhvdXJzIiwiZGlmZk1pbnV0ZXMiLCJkaWZmU2Vjb25kcyIsImNvdW50RHVyYXRpb25zQmV0d2VlbiIsImRpZmYiLCJzdGFydE9mWWVhciIsInN0YXJ0T2ZNb250aCIsInN0YXJ0T2ZXZWVrIiwic3RhcnRPZkhvdXIiLCJzdGFydE9mTWludXRlIiwic3RhcnRPZlNlY29uZCIsIm5leHRXIiwid2Vla09mWWVhciIsImRhdGVPcHRpb25zIiwib2Zmc2V0Rm9yTWFya2VyIiwiZXh0cmFPcHRpb25zIiwib21pdFRpbWVab25lT2Zmc2V0IiwidGltZXN0YW1wVG9BcnJheSIsImdldFRpbWV6b25lT2Zmc2V0Iiwib2Zmc2V0Rm9yQXJyYXkiLCJpbml0SGlkZGVuRGF5cyIsImZvcmNlVG9WYWxpZCIsInByZXZEYXRlIiwibmV4dERhdGUiLCJjdXJyZW50SW5mbyIsInJlbmRlclJhbmdlIiwiYnVpbGRWYWxpZFJhbmdlIiwidHJpbUhpZGRlbkRheXMiLCJidWlsZEN1cnJlbnRSYW5nZUluZm8iLCJidWlsZFJlbmRlclJhbmdlIiwiYWRqdXN0QWN0aXZlUmFuZ2UiLCJidWlsZERhdGVJbmNyZW1lbnQiLCJzaW1wbGVJbnB1dCIsInJlZmluZVJhbmdlIiwiYnVpbGRSYW5nZUZyb21EdXJhdGlvbiIsImJ1aWxkUmFuZ2VGcm9tRGF5Q291bnQiLCJidWlsZEN1c3RvbVZpc2libGVSYW5nZSIsImdldEZhbGxiYWNrRHVyYXRpb24iLCJjb21wdXRlUmVzIiwiaXNIaWRkZW5EYXkiLCJza2lwSGlkZGVuRGF5cyIsInJ1bm5pbmdDb3VudCIsImN1c3RvbUFsaWdubWVudCIsInJhbmdlSW5wdXQiLCJwYXJzZVJhbmdlIiwiaXNIaWRkZW5EYXlIYXNoIiwiaW5jIiwiaXNFeGNsdXNpdmUiLCJEYXlIZWFkZXIiLCJkYXRlcyIsInJlbmRlckludHJvIiwiRGF5U2VyaWVzTW9kZWwiLCJpbmRpY2VzIiwiZGF5SW5kZXgiLCJjbnQiLCJzbGljZVJhbmdlIiwiZmlyc3RJbmRleCIsImdldERhdGVEYXlJbmRleCIsImxhc3RJbmRleCIsImNsaXBwZWRGaXJzdEluZGV4IiwiY2xpcHBlZExhc3RJbmRleCIsImRheU9mZnNldCIsIkRheVRhYmxlTW9kZWwiLCJkYXlTZXJpZXMiLCJicmVha09uV2Vla3MiLCJkYXlzUGVyUm93Iiwicm93Q250IiwiY2VsbHMiLCJidWlsZENlbGxzIiwiaGVhZGVyRGF0ZXMiLCJidWlsZEhlYWRlckRhdGVzIiwicm93cyIsInJvdyIsImJ1aWxkQ2VsbCIsInNlcmllc1NlZyIsIm5leHRJbmRleCIsImZpcnN0Q29sIiwibGFzdENvbCIsImlzUnVubmluZyIsImlzRGlydHkiLCJwYXVzZURlcHRocyIsImlzUGF1c2VkIiwiRWxlbWVudERyYWdnaW5nIiwic2V0TWlycm9ySXNWaXNpYmxlIiwiYm9vbCIsInNldE1pcnJvck5lZWRzUmV2ZXJ0Iiwic2V0QXV0b1Njcm9sbEVuYWJsZWQiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsInNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJzZXRTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJpc0hpdENvbWJvQWxsb3dlZCIsIk1vcmVMaW5rQ29udGFpbmVyIiwiaXNQb3BvdmVyT3BlbiIsInBvcG92ZXJJZCIsImhhbmRsZUxpbmtFbCIsImxpbmtFbCIsImhhbmRsZUNsaWNrIiwiYnVpbGRQdWJsaWNTZWciLCJhbGxTZWdzIiwiaGFuZGxlUG9wb3ZlckNsb3NlIiwibW9yZUNudCIsInNob3J0VGV4dCIsImFsaWdubWVudEVsUmVmIiwicG9wb3ZlckNvbnRlbnQiLCJ1cGRhdGVQYXJlbnRFbCIsIk5hbWVkVGltZVpvbmVJbXBsIiwiTm93SW5kaWNhdG9yQ29udGFpbmVyIiwiaXNBeGlzIiwiUG9zaXRpb25DYWNoZSIsIm9yaWdpbkVsIiwiZWxzIiwiaXNIb3Jpem9udGFsIiwiaXNWZXJ0aWNhbCIsIm9yaWdpbkNsaWVudFJlY3QiLCJidWlsZEVsSG9yaXpvbnRhbHMiLCJidWlsZEVsVmVydGljYWxzIiwib3JpZ2luQ2xpZW50TGVmdCIsImxlZnRzIiwicmlnaHRzIiwib3JpZ2luQ2xpZW50VG9wIiwidG9wcyIsImJvdHRvbXMiLCJsZWZ0VG9JbmRleCIsImxlZnRQb3NpdGlvbiIsInRvcFRvSW5kZXgiLCJ0b3BQb3NpdGlvbiIsImdldFdpZHRoIiwibGVmdEluZGV4IiwiZ2V0SGVpZ2h0IiwidG9wSW5kZXgiLCJzaW1pbGFyVG8iLCJvdGhlckNhY2hlIiwiU2VnSGllcmFyY2h5Iiwic3RyaWN0T3JkZXIiLCJhbGxvd1Jlc2xpY2luZyIsIm1heENvb3JkIiwibWF4U3RhY2tDbnQiLCJsZXZlbENvb3JkcyIsImVudHJpZXNCeUxldmVsIiwic3RhY2tDbnRzIiwiYWRkU2VncyIsImhpZGRlbkVudHJpZXMiLCJpbnNlcnRFbnRyeSIsImZpbmRJbnNlcnRpb24iLCJpc0luc2VydGlvblZhbGlkIiwiaW5zZXJ0RW50cnlBdCIsImhhbmRsZUludmFsaWRJbnNlcnRpb24iLCJsZXZlbENvb3JkIiwidGhpY2tuZXNzIiwic3RhY2tDbnQiLCJ0b3VjaGluZ0VudHJ5Iiwic3BsaXRFbnRyeSIsImJhcnJpZXIiLCJwYXJ0Q250Iiwic3BsaXRIaWRkZW5FbnRyaWVzIiwiZW50cnlTcGFuIiwiYmFycmllclNwYW4iLCJsYXRlcmFsIiwibGV2ZWwiLCJuZXdFbnRyeSIsImxldmVsQ250IiwiY2FuZGlkYXRlQ29vcmQiLCJ0b3VjaGluZ0xldmVsIiwidG91Y2hpbmdMYXRlcmFsIiwidHJhY2tpbmdMZXZlbCIsInRyYWNraW5nQ29vcmQiLCJ0cmFja2luZ0VudHJ5IiwidHJhY2tpbmdFbnRyaWVzIiwic2VhcmNoUmVzIiwibGF0ZXJhbEluZGV4IiwidHJhY2tpbmdFbnRyeUJvdHRvbSIsImRlc3RMZXZlbCIsImRlc3RMYXRlcmFsIiwidG9SZWN0cyIsInJlY3RzIiwiZW50cmllcyIsIlNsaWNlciIsInNsaWNlQnVzaW5lc3NIb3VycyIsIl9zbGljZUJ1c2luZXNzSG91cnMiLCJzbGljZURhdGVTZWxlY3Rpb24iLCJfc2xpY2VEYXRlU3BhbiIsIl9zbGljZUV2ZW50U3RvcmUiLCJzbGljZUV2ZW50RHJhZyIsIl9zbGljZUludGVyYWN0aW9uIiwic2xpY2VFdmVudFJlc2l6ZSIsImZvcmNlRGF5SWZMaXN0SXRlbSIsInNsaWNlUHJvcHMiLCJleHRyYUFyZ3MiLCJldmVudFNlZ3MiLCJkYXRlU2VsZWN0aW9uU2VncyIsImJ1c2luZXNzSG91clNlZ3MiLCJmZ0V2ZW50U2VncyIsImJnRXZlbnRTZWdzIiwic2xpY2VOb3dEYXRlIiwicmFuZ2VSZXMiLCJzbGljZUV2ZW50UmFuZ2VzIiwiYWZmZWN0ZWRJbnN0YW5jZXMiLCJhY3RpdmVEYXRlU3BhblJhbmdlIiwiZmFicmljYXRlRXZlbnRSYW5nZSIsImV2ZW50UmFuZ2VzIiwic2xpY2VFdmVudFJhbmdlIiwiU3BsaXR0ZXIiLCJnZXRLZXlzRm9yRXZlbnREZWZzIiwiX2dldEtleXNGb3JFdmVudERlZnMiLCJzcGxpdERhdGVTZWxlY3Rpb24iLCJfc3BsaXREYXRlU3BhbiIsInNwbGl0RXZlbnRTdG9yZSIsIl9zcGxpdEV2ZW50U3RvcmUiLCJzcGxpdEluZGl2aWR1YWxVaSIsIl9zcGxpdEluZGl2aWR1YWxVaSIsInNwbGl0RXZlbnREcmFnIiwiX3NwbGl0SW50ZXJhY3Rpb24iLCJzcGxpdEV2ZW50UmVzaXplIiwiZXZlbnRVaUJ1aWxkZXJzIiwic3BsaXRQcm9wcyIsImtleUluZm9zIiwiZ2V0S2V5SW5mbyIsImRlZktleXMiLCJkYXRlU2VsZWN0aW9ucyIsImV2ZW50U3RvcmVzIiwiZXZlbnREcmFncyIsImV2ZW50UmVzaXplcyIsImluZm8iLCJrZXlJbmZvIiwiYnVpbGRFdmVudFVpIiwiZGF0ZVNwYW5zIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwiZ2V0S2V5c0ZvckV2ZW50RGVmIiwic3BsaXRTdG9yZXMiLCJzcGxpdEhhc2hlcyIsInNwbGl0U3RhdGVzIiwiYWZmZWN0ZWRTdG9yZXMiLCJtdXRhdGVkS2V5c0J5RGVmSWQiLCJtdXRhdGVkU3RvcmVzIiwicG9wdWxhdGUiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJldmVudENvbnRlbnRBcmciLCJWaWV3Q29udGFpbmVyIiwiV2Vla051bWJlckNvbnRhaW5lciIsImRlZmF1bHRGb3JtYXQiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwic2Nyb2xsIiwiYWRkRHVyYXRpb25zIiwiYWRkV2Vla3MiLCJhbGxvd0NvbnRleHRNZW51IiwiYWxsb3dTZWxlY3Rpb24iLCJ1c2VyU2VsZWN0IiwiYXNDbGVhbkRheXMiLCJhc1JvdWdoTWludXRlcyIsImFzUm91Z2hTZWNvbmRzIiwiYnVpbGRFdmVudFJhbmdlS2V5IiwiY3JlYXRlU2Nyb2xsUmVzcG9uZGVyIiwiY29tcGFyZU51bWJlcnMiLCJjb21wdXRlSW5uZXJSZWN0IiwiZ29XaXRoaW5QYWRkaW5nIiwiZG9Gcm9tV2luZG93Vmlld3BvcnQiLCJvdXRlclJlY3QiLCJlZGdlcyIsImNvbmZpZyIsImNvbnN0cmFpblBvaW50IiwicG9pbnQiLCJkaWZmUG9pbnRzIiwicG9pbnQxIiwicG9pbnQyIiwiZGlmZldlZWtzIiwiZGlzYWJsZUN1cnNvciIsImVuYWJsZUN1cnNvciIsImdldFJvb3ROb2RlIiwiZmluZERpcmVjdENoaWxkcmVuIiwicGFyZW50IiwiY2hpbGROb2RlIiwicnVuQmVmb3JlRmx1c2giLCJvbGREZWJvdW5jZVJlbmRlcmluZyIsImNhbGxiYWNrUSIsImZvcm1hdElzb01vbnRoU3RyIiwibWF0Y2giLCJmb3JtYXRJc29UaW1lU3RyaW5nIiwiaW5pdGlhbERhdGVJbnB1dCIsImdldFJlY3RDZW50ZXIiLCJnZXRTZWdNZXRhIiwic2VnUmFuZ2UiLCJnZXRTbG90Q2xhc3NOYW1lcyIsImdldFN0aWNreUZvb3RlclNjcm9sbGJhciIsImdldFN0aWNreUhlYWRlckRhdGVzIiwiZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzIiwibWVyZ2VzIiwiZmlsdGVyZWRNZXJnZXMiLCJodW5ncnlNZXJnZSIsIm1lcmdlIiwiaGFzQmdSZW5kZXJpbmciLCJpbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSIsImlzRGF0ZVNlbGVjdGlvblZhbGlkIiwiaXNEYXRlU3BhbnNFcXVhbCIsImlzU3BhblByb3BzRXF1YWwiLCJpc0ludGVyYWN0aW9uVmFsaWQiLCJpc011bHRpRGF5UmFuZ2UiLCJvbk1vdXNlRW50ZXIiLCJvbk1vdXNlTGVhdmUiLCJjdXJyZW50TWF0Y2hlZENoaWxkIiwibW91c2VPdmVyRXYiLCJyZWFsT25Nb3VzZUxlYXZlIiwibW91c2VMZWF2ZUV2IiwibWVtb2l6ZUFycmF5bGlrZSIsImN1cnJlbnRBcmdTZXRzIiwiY3VycmVudFJlc3VsdHMiLCJuZXdBcmdTZXRzIiwiY3VycmVudExlbiIsIm5ld0xlbiIsIm1lbW9pemVIYXNobGlrZSIsImN1cnJlbnRBcmdIYXNoIiwiY3VycmVudFJlc0hhc2giLCJuZXdBcmdIYXNoIiwibmV3UmVzSGFzaCIsIm9wdGlvblNldHMiLCJtdWx0aXBseUR1cmF0aW9uIiwicmF3RGVmcyIsInJhd0RlZiIsInJlZmluZUlucHV0cyIsInBhcnNlRHJhZ01ldGEiLCJsZWZ0b3ZlclByb3BzIiwicG9pbnRJbnNpZGVSZWN0IiwicHJldmVudENvbnRleHRNZW51IiwicHJldmVudFNlbGVjdGlvbiIsInN1YnNldCIsInJlY2VpdmVSYXdFdmVudHMiLCJleGlzdGluZ0V2ZW50U3RvcmUiLCJidWlsZFB1YmxpY0lkTWFwcyIsInJlc2V0UmF3RXZlbnRzIiwiZXhwYW5kUmFuZ2UiLCJtYXN0ZXIiLCJmaWx0ZXJlZERlZnMiLCJmaWx0ZXJlZEluc3RhbmNlcyIsImV4Y2x1ZGVTdWJFdmVudFN0b3JlIiwicmVtb3ZlRXhhY3QiLCJleGFjdFZhbCIsInJlbW92ZUNudCIsInJlbmRlckZpbGwiLCJmaWxsVHlwZSIsInJlbmRlclNjcm9sbFNoaW0iLCJmZXRjaE9wdGlvbnMiLCJoZWFkZXJzIiwiZmV0Y2hSZXMiLCJvayIsInBhcnNlZFJlc3BvbnNlIiwib2xkRGF0ZUVudiIsIm5ld0RhdGVFbnYiLCJzb3J0RXZlbnRTZWdzIiwiZXZlbnRPcmRlclNwZWNzIiwib2JqcyIsInRyYW5zbGF0ZVJlY3QiLCJkZWx0YVgiLCJkZWx0YVkiLCJub3JtYWxpemVkU3VjY2Vzc0NhbGxiYWNrIiwibm9ybWFsaXplZEZhaWx1cmVDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJ3cmFwcGVkU3VjY2VzcyIsIndyYXBwZWRGYWlsdXJlIiwid2hlblRyYW5zaXRpb25Eb25lIiwicmVhbENhbGxiYWNrIiwiZXZlbnROYW1lIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsImxvY2FsUmVzIiwicGFyc2VNYXJrZXIiLCJpbmRleF9janMiLCJkYXlHcmlkIiwiRGF5R3JpZFZpZXciLCJUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yIiwiZGF5R3JpZERheSIsImRheUdyaWRXZWVrIiwiZGF5R3JpZE1vbnRoIiwiZGF5R3JpZFllYXIiLCJpbnRlcm5hbF9janMiLCJwcmVhY3RfY2pzIiwic3BsaXRTZWdzQnlSb3ciLCJieVJvdyIsInNwbGl0U2Vnc0J5Rmlyc3RDb2wiLCJieUNvbCIsInNwbGl0SW50ZXJhY3Rpb25CeVJvdyIsIkRFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQiLCJoYXNMaXN0SXRlbURpc3BsYXkiLCJUYWJsZUJsb2NrRXZlbnQiLCJUYWJsZUxpc3RJdGVtRXZlbnQiLCJUYWJsZUNlbGxNb3JlTGluayIsImNvbXBpbGVTZWdzIiwiaW52aXNpYmxlU2VncyIsInNpbmdsZVBsYWNlbWVudHMiLCJpc0ZvcmNlZEludmlzaWJsZSIsInZpc2liaWxpdHkiLCJwbGFjZW1lbnQiLCJpc1Zpc2libGUiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIlRhYmxlQ2VsbCIsInJvb3RFbFJlZiIsImRheU51bWJlcklkIiwiY3VycmVudEVuZEluY2wiLCJjdXJyZW50Rmlyc3RZZWFyIiwiY3VycmVudEZpcnN0TW9udGgiLCJjdXJyZW50TGFzdFllYXIiLCJjdXJyZW50TGFzdE1vbnRoIiwic2hvdWxkRGlzcGxheU1vbnRoU3RhcnQiLCJyZW5kZXJUb3BJbm5lciIsImlubmVyRWxSZWYiLCJtaW5IZWlnaHQiLCJzaG93V2Vla051bWJlciIsImZvcmNlRGF5VG9wIiwiZmdDb250ZW50RWxSZWYiLCJmZ0NvbnRlbnQiLCJtYXJnaW5Ub3AiLCJtb3JlTWFyZ2luVG9wIiwiYmdDb250ZW50IiwicmVzbGljZVNlZyIsInNwYW5TdGFydCIsInNwYW5FbmQiLCJEYXlHcmlkU2VnSGllcmFyY2h5IiwiaGlkZGVuQ29uc3VtZXMiLCJmb3JjZUhpZGRlbiIsInNlZ0lucHV0cyIsImV4Y2x1ZGVIaWRkZW4iLCJ0b3VjaGluZ0VudHJ5SWQiLCJwbGFjZWhvbGRlckVudHJ5IiwiVGFibGVSb3ciLCJjZWxsRWxSZWZzIiwiZnJhbWVFbFJlZnMiLCJmZ0VsUmVmcyIsInNlZ0hhcm5lc3NSZWZzIiwiZnJhbWVQb3NpdGlvbnMiLCJtYXhDb250ZW50SGVpZ2h0IiwiZXZlbnRJbnN0YW5jZUhlaWdodHMiLCJpc0ZvcmNlZCIsInVwZGF0ZVNpemluZyIsImJ1c2luZXNzSG91cnNCeUNvbCIsImJnRXZlbnRTZWdzQnlDb2wiLCJoaWdobGlnaHRTZWdzQnlDb2wiLCJnZXRIaWdobGlnaHRTZWdzIiwibWlycm9yU2Vnc0J5Q29sIiwiZ2V0TWlycm9yU2VncyIsInNpbmdsZUNvbFBsYWNlbWVudHMiLCJtdWx0aUNvbFBsYWNlbWVudHMiLCJtb3JlQ250cyIsIm1vcmVNYXJnaW5Ub3BzIiwiaGllcmFyY2h5IiwidW5rbm93bkhlaWdodFNlZ3MiLCJldmVudEhlaWdodCIsInNlZ1JlY3RzIiwibGVmdG92ZXJNYXJnaW5zIiwiYWxsUmVjdHMiLCJyZWN0c0J5RWFjaENvbCIsImdyb3VwUmVjdHNCeUVhY2hDb2wiLCJjdXJyZW50SGVpZ2h0IiwiY3VycmVudE1hcmdpblRvcCIsImFic29sdXRlVG9wIiwibXVsdGlQbGFjZW1lbnRzIiwiaXNGaXJzdENvbCIsInBsYWNlUmVjdHMiLCJoaWRkZW5FbnRyeSIsImhpZGRlblNwYW4iLCJjb21wdXRlRmdTZWdQbGFjZW1lbnQiLCJjZWxsIiwibm9ybWFsRmdOb2RlcyIsInJlbmRlckZnU2VncyIsIm1pcnJvckZnTm9kZXMiLCJtaXJyb3JTZWdzIiwiY29sUGxhY2VtZW50cyIsInRvcHNCeUluc3RhbmNlSWQiLCJwbGFjZW1lbnRzIiwiYnVpbGRBYnNvbHV0ZVRvcEhhc2giLCJidWlsZE1pcnJvclBsYWNlbWVudHMiLCJzaG93RGF5TnVtYmVycyIsInNob3dXZWVrTnVtYmVycyIsInJlbmRlckZpbGxTZWdzIiwiY2VsbE1pbkhlaWdodCIsInByZXZTdGF0ZSIsImN1cnJlbnRQcm9wcyIsInNlZ1BsYWNlbWVudHMiLCJub2RlcyIsImxlZnRSaWdodENzcyIsImlzRXh0ZXJuYWxTaXppbmdDaGFuZ2UiLCJmcmFtZUVscyIsIm5ld1Bvc2l0aW9uQ2FjaGUiLCJvbGRJbnN0YW5jZUhlaWdodHMiLCJuZXdJbnN0YW5jZUhlaWdodHMiLCJxdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzIiwibGltaXRCeUNvbnRlbnRIZWlnaHQiLCJjb21wdXRlTWF4Q29udGVudEhlaWdodCIsInNlZ0VsTWFwIiwiZmlyc3RLZXkiLCJmY0NvbnRhaW5lckVsIiwiZ2V0Q2VsbEVscyIsImVsTWFwIiwiVGFibGVSb3dzIiwic3BsaXRCdXNpbmVzc0hvdXJTZWdzIiwic3BsaXRCZ0V2ZW50U2VncyIsInNwbGl0RmdFdmVudFNlZ3MiLCJzcGxpdERhdGVTZWxlY3Rpb25TZWdzIiwicm93UmVmcyIsImJ1c2luZXNzSG91clNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJmZ0V2ZW50U2Vnc0J5Um93IiwiZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyIsImV2ZW50RHJhZ0J5Um93IiwiZXZlbnRSZXNpemVCeVJvdyIsInJlbmRlclJvd0ludHJvIiwiaXNTZWdBbGxEYXkiLCJmaXJzdENlbGxFbCIsInJvd1Bvc2l0aW9ucyIsInJvd09iaiIsImNvbFBvc2l0aW9ucyIsImdldENlbGxSYW5nZSIsImdldENlbGxFbCIsIlRhYmxlIiwibmVlZHNTY3JvbGxSZXNldCIsImxpbWl0VmlhQmFsYW5jZWQiLCJjb2xHcm91cE5vZGUiLCJyZXF1ZXN0U2Nyb2xsUmVzZXQiLCJmbHVzaFNjcm9sbFJlc2V0Iiwic3ViamVjdEVsIiwiZ2V0U2Nyb2xsU3ViamVjdEVsIiwic2Nyb2xsRWwiLCJEYXlUYWJsZVNsaWNlciIsImRheVRhYmxlTW9kZWwiLCJEYXlUYWJsZSIsInNsaWNlciIsInRhYmxlUmVmIiwiaGVhZGVyQWxpZ25FbFJlZiIsImJ1aWxkRGF5VGFibGVSZW5kZXJSYW5nZSIsInNuYXBUb1dlZWsiLCJlbmRPZldlZWsiLCJsYXN0TW9udGhSZW5kZXJTdGFydCIsIlRhYmxlVmlldyIsImhlYWRlckVsUmVmIiwicmVuZGVyU2ltcGxlTGF5b3V0IiwiaGVhZGVyUm93Q29udGVudCIsImJvZHlDb250ZW50IiwicmVuZGVySFNjcm9sbExheW91dCIsIlNjcm9sbEdyaWQiLCJjaHVua3MiLCJjb2xHcm91cHMiLCJidWlsZERheVRhYmxlTW9kZWwiLCJoZWFkZXJDb250ZW50IiwiY29udGVudEFyZyIsInRvdWNoTW91c2VJZ25vcmVXYWl0IiwiaWdub3JlTW91c2VEZXB0aCIsImxpc3RlbmVyQ250IiwiaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQiLCJQb2ludGVyRHJhZ2dpbmciLCJoYW5kbGVTZWxlY3RvciIsInNob3VsZElnbm9yZU1vdmUiLCJzaG91bGRXYXRjaFNjcm9sbCIsImlzVG91Y2hEcmFnZ2luZyIsIndhc1RvdWNoU2Nyb2xsIiwiaGFuZGxlTW91c2VEb3duIiwic2hvdWxkSWdub3JlTW91c2UiLCJjdHJsS2V5IiwiaXNQcmltYXJ5TW91c2VCdXR0b24iLCJ0cnlTdGFydCIsImNyZWF0ZUV2ZW50RnJvbU1vdXNlIiwiaW5pdFNjcm9sbFdhdGNoIiwiaGFuZGxlTW91c2VNb3ZlIiwiaGFuZGxlTW91c2VVcCIsInJlY29yZENvb3JkcyIsImNsZWFudXAiLCJoYW5kbGVUb3VjaFN0YXJ0IiwiY3JlYXRlRXZlbnRGcm9tVG91Y2giLCJ0YXJnZXRFbCIsImhhbmRsZVRvdWNoTW92ZSIsImhhbmRsZVRvdWNoRW5kIiwiaGFuZGxlVG91Y2hTY3JvbGwiLCJoYW5kbGVTY3JvbGwiLCJwYWdlWCIsInByZXZTY3JvbGxYIiwicHJldlBhZ2VYIiwicGFnZVkiLCJwcmV2U2Nyb2xsWSIsInByZXZQYWdlWSIsImlzVG91Y2giLCJvcmlnUGFnZVgiLCJvcmlnUGFnZVkiLCJwYXNzaXZlIiwib25XaW5kb3dUb3VjaE1vdmUiLCJxdWVyeVN1YmplY3RFbCIsImRvd25FbCIsImRlc3Ryb3lTY3JvbGxXYXRjaCIsImNhbmNlbFRvdWNoU2Nyb2xsIiwiaXNGaXJzdCIsInRvdWNoZXMiLCJFbGVtZW50TWlycm9yIiwic291cmNlRWwiLCJtaXJyb3JFbCIsInNvdXJjZUVsUmVjdCIsInpJbmRleCIsInJldmVydER1cmF0aW9uIiwib3JpZ1NjcmVlblgiLCJvcmlnU2NyZWVuWSIsInVwZGF0ZUVsUG9zaXRpb24iLCJoYW5kbGVNb3ZlIiwic2V0SXNWaXNpYmxlIiwic3RvcCIsIm5lZWRzUmV2ZXJ0QW5pbWF0aW9uIiwiZG9uZSIsImRvUmV2ZXJ0QW5pbWF0aW9uIiwiZmluYWxTb3VyY2VFbFJlY3QiLCJ0cmFuc2l0aW9uIiwiZ2V0TWlycm9yRWwiLCJjbG9uZU5vZGUiLCJib3hTaXppbmciLCJtYXJnaW4iLCJTY3JvbGxHZW9tQ2FjaGUiLCJzY3JvbGxDb250cm9sbGVyIiwiZG9lc0xpc3RlbmluZyIsImhhbmRsZVNjcm9sbENoYW5nZSIsIm9yaWdTY3JvbGxUb3AiLCJvcmlnU2Nyb2xsTGVmdCIsImNsaWVudFJlY3QiLCJjb21wdXRlQ2xpZW50UmVjdCIsImdldEV2ZW50VGFyZ2V0IiwiRWxlbWVudFNjcm9sbEdlb21DYWNoZSIsIldpbmRvd1Njcm9sbEdlb21DYWNoZSIsImdldFRpbWUiLCJwZXJmb3JtYW5jZSIsIkF1dG9TY3JvbGxlciIsImlzRW5hYmxlZCIsInNjcm9sbFF1ZXJ5IiwiZWRnZVRocmVzaG9sZCIsIm1heFZlbG9jaXR5IiwicG9pbnRlclNjcmVlblgiLCJwb2ludGVyU2NyZWVuWSIsImlzQW5pbWF0aW5nIiwic2Nyb2xsQ2FjaGVzIiwiZXZlck1vdmVkVXAiLCJldmVyTW92ZWREb3duIiwiZXZlck1vdmVkTGVmdCIsImV2ZXJNb3ZlZFJpZ2h0IiwiYW5pbWF0ZSIsImVkZ2UiLCJjb21wdXRlQmVzdEVkZ2UiLCJoYW5kbGVTaWRlIiwibXNTaW5jZVJlcXVlc3QiLCJyZXF1ZXN0QW5pbWF0aW9uIiwic2Nyb2xsU3RhcnRFbCIsImJ1aWxkQ2FjaGVzIiwieURlbHRhIiwieERlbHRhIiwic2Nyb2xsQ2FjaGUiLCJpbnZEaXN0YW5jZSIsImRpc3RhbmNlIiwidmVsb2NpdHkiLCJiZXN0U2lkZSIsImxlZnREaXN0IiwicmlnaHREaXN0IiwidG9wRGlzdCIsImJvdHRvbURpc3QiLCJxdWVyeVNjcm9sbEVscyIsIkZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmciLCJtaW5EaXN0YW5jZSIsInRvdWNoU2Nyb2xsQWxsb3dlZCIsIm1pcnJvck5lZWRzUmV2ZXJ0IiwiaXNJbnRlcmFjdGluZyIsImlzRGVsYXlFbmRlZCIsImlzRGlzdGFuY2VTdXJwYXNzZWQiLCJkZWxheVRpbWVvdXRJZCIsIm9uUG9pbnRlckRvd24iLCJwb2ludGVyIiwibWlycm9yIiwic3RhcnREZWxheSIsImhhbmRsZURpc3RhbmNlU3VycGFzc2VkIiwib25Qb2ludGVyTW92ZSIsImRpc3RhbmNlU3EiLCJhdXRvU2Nyb2xsZXIiLCJvblBvaW50ZXJVcCIsInRyeVN0b3BEcmFnIiwiaGFuZGxlRGVsYXlFbmQiLCJ0cnlTdGFydERyYWciLCJzdG9wRHJhZyIsInNldElnbm9yZU1vdmUiLCJPZmZzZXRUcmFja2VyIiwib3JpZ1JlY3QiLCJjb21wdXRlTGVmdCIsImNvbXB1dGVUb3AiLCJpc1dpdGhpbkNsaXBwaW5nIiwiaXNJZ25vcmVkQ2xpcHBpbmciLCJub2RlIiwidGFnTmFtZSIsIkhpdERyYWdnaW5nIiwiZHJhZ2dpbmciLCJkcm9wcGFibGVTdG9yZSIsInVzZVN1YmplY3RDZW50ZXIiLCJyZXF1aXJlSW5pdGlhbCIsImluaXRpYWxIaXQiLCJtb3ZpbmdIaXQiLCJmaW5hbEhpdCIsImhhbmRsZVBvaW50ZXJEb3duIiwicHJvY2Vzc0ZpcnN0Q29vcmQiLCJoYW5kbGVEcmFnU3RhcnQiLCJoYW5kbGVEcmFnTW92ZSIsImhhbmRsZVBvaW50ZXJVcCIsInJlbGVhc2VIaXRzIiwiaGFuZGxlRHJhZ0VuZCIsInN1YmplY3RSZWN0Iiwib3JpZ1BvaW50IiwiYWRqdXN0ZWRQb2ludCIsInF1ZXJ5SGl0Rm9yT2Zmc2V0Iiwic2xpY2VkU3ViamVjdFJlY3QiLCJjb29yZEFkanVzdCIsImZvcmNlSGFuZGxlIiwiaGl0IiwiaXNIaXRzRXF1YWwiLCJvZmZzZXRUcmFja2VycyIsImludGVyYWN0aW9uU2V0dGluZ3MiLCJvZmZzZXRMZWZ0Iiwib2Zmc2V0VG9wIiwiYmVzdEhpdCIsIm9mZnNldFRyYWNrZXIiLCJvcmlnaW5MZWZ0Iiwib3JpZ2luVG9wIiwiY29tcG9uZW50SWQiLCJoaXQwIiwiaGl0MSIsImJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQiLCJEYXRlQ2xpY2tpbmciLCJoaXREcmFnZ2luZyIsIkRhdGVTZWxlY3RpbmciLCJkcmFnU2VsZWN0aW9uIiwiY2FuU2VsZWN0IiwiZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxIiwiaGFuZGxlSGl0VXBkYXRlIiwiaXNGaW5hbCIsImlzSW52YWxpZCIsImRhdGVTcGFuMCIsImRhdGVTcGFuMSIsImpvaW5IaXRzSW50b1NlbGVjdGlvbiIsIkV2ZW50RHJhZ2dpbmciLCJzdWJqZWN0U2VnIiwicmVjZWl2aW5nQ29udGV4dCIsInZhbGlkTXV0YXRpb24iLCJtdXRhdGVkUmVsZXZhbnRFdmVudHMiLCJvcmlnVGFyZ2V0IiwiaW5pdGlhbENvbnRleHQiLCJnZXRDb21wb25lbnRUb3VjaERlbGF5IiwiZml4ZWRNaXJyb3JQYXJlbnQiLCJyZWNlaXZpbmdPcHRpb25zIiwibWFzc2FnZXJzIiwibWFzc2FnZXIiLCJjb21wdXRlRXZlbnRNdXRhdGlvbiIsImRpc3BsYXlEcmFnIiwiY2xlYXJEcmFnIiwidXBkYXRlZEV2ZW50QXBpIiwiZXZlbnRDaGFuZ2VBcmciLCJ0cmFuc2Zvcm1lZCIsImV2ZW50UmVtb3ZlQXJnIiwiZHJhZ2dlZEVsIiwiYWRkZWRFdmVudERlZiIsImFkZGVkRXZlbnRJbnN0YW5jZSIsImFkZGVkRXZlbnRBcGkiLCJldmVudEFkZEFyZyIsIlNFTEVDVE9SIiwibmV4dENvbnRleHQiLCJwcmV2Q29udGV4dCIsImluaXRpYWxDYWxlbmRhciIsIkV2ZW50UmVzaXppbmciLCJkcmFnZ2luZ1NlZ0VsIiwiZHJhZ2dpbmdTZWciLCJxdWVyeVNlZ0VsIiwiaXNGcm9tU3RhcnQiLCJjb21wdXRlTXV0YXRpb24iLCJPUFRJT05fUkVGSU5FUlMiLCJMSVNURU5FUl9SRUZJTkVSUyIsImRhdGVDbGljayIsImV2ZW50RHJhZ1N0YXJ0IiwiZXZlbnREcmFnU3RvcCIsImV2ZW50RHJvcCIsImV2ZW50UmVzaXplU3RhcnQiLCJldmVudFJlc2l6ZVN0b3AiLCJkcm9wIiwiZXZlbnRSZWNlaXZlIiwiZXZlbnRMZWF2ZSIsIkV4dGVybmFsRWxlbWVudERyYWdnaW5nIiwic3VwcGxpZWREcmFnTWV0YSIsImRyb3BwYWJsZUV2ZW50IiwiZHJhZ01ldGEiLCJidWlsZERyYWdNZXRhIiwiY2FuRHJvcEVsT25DYWxlbmRhciIsImRlZlByb3BzIiwiY29tcHV0ZUV2ZW50Rm9yRGF0ZVNwYW4iLCJmaW5hbFZpZXciLCJhZGRpbmdFdmVudHMiLCJkYXRhQXR0clByZWZpeCIsInByZWZpeGVkTmFtZSIsImdldEVtYmVkZGVkRWxEYXRhIiwiZ2V0RHJhZ01ldGFGcm9tRWwiLCJJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyIsIm1pcnJvclNlbGVjdG9yIiwiY3VycmVudE1pcnJvckVsIiwiaGFuZGxlUG9pbnRlck1vdmUiLCJpc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0IiwibWF0Y2hlc0NhbmNlbCIsIm1hdGNoZXNFdmVudCIsIm9uU2VsZWN0Iiwic2VsZWN0SW5mbyIsIm9uRG9jdW1lbnRQb2ludGVyRG93biIsIm9uRG9jdW1lbnRQb2ludGVyVXAiLCJkb2N1bWVudFBvaW50ZXIiLCJEcmFnZ2FibGUiLCJpdGVtU2VsZWN0b3IiLCJhcHBlbmRUbyIsImV2ZW50RGF0YSIsIlRoaXJkUGFydHlEcmFnZ2FibGUiLCJjb250YWluZXJPclNldHRpbmdzIiwiRWxlbWVudCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkZWZpbml0aW9uIiwicHJvcCIsInRvU3RyaW5nVGFnIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +(()=>{"use strict";var e={748:(e,t,n)=>{n.r(t),n.d(t,{Children:()=>G,Component:()=>a.Component,Fragment:()=>a.Fragment,PureComponent:()=>L,StrictMode:()=>Te,Suspense:()=>X,SuspenseList:()=>K,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:()=>ye,cloneElement:()=>Se,createContext:()=>a.createContext,createElement:()=>a.createElement,createFactory:()=>be,createPortal:()=>re,createRef:()=>a.createRef,default:()=>Ie,findDOMNode:()=>Ae,flushSync:()=>we,forwardRef:()=>V,hydrate:()=>ce,isValidElement:()=>Ee,lazy:()=>$,memo:()=>U,render:()=>le,startTransition:()=>Re,unmountComponentAtNode:()=>De,unstable_batchedUpdates:()=>Ce,useCallback:()=>A,useContext:()=>C,useDebugValue:()=>w,useDeferredValue:()=>Oe,useEffect:()=>_,useErrorBoundary:()=>T,useId:()=>R,useImperativeHandle:()=>S,useInsertionEffect:()=>ke,useLayoutEffect:()=>b,useMemo:()=>D,useReducer:()=>y,useRef:()=>E,useState:()=>v,useSyncExternalStore:()=>Me,useTransition:()=>xe,version:()=>_e});var r,i,s,o,a=n(400),l=0,c=[],d=[],u=a.options.__b,h=a.options.__r,f=a.options.diffed,p=a.options.__c,g=a.options.unmount;function m(e,t){a.options.__h&&a.options.__h(i,e,l||t),l=0;var n=i.__H||(i.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({__V:d}),n.__[e]}function v(e){return l=1,y(P,e)}function y(e,t,n){var s=m(r++,2);if(s.t=e,!s.__c&&(s.__=[n?n(t):P(void 0,t),function(e){var t=s.__N?s.__N[0]:s.__[0],n=s.t(t,e);t!==n&&(s.__N=[n,s.__[1]],s.__c.setState({}))}],s.__c=i,!i.u)){i.u=!0;var o=i.shouldComponentUpdate;i.shouldComponentUpdate=function(e,t,n){if(!s.__c.__H)return!0;var r=s.__c.__H.__.filter((function(e){return e.__c}));if(r.every((function(e){return!e.__N})))return!o||o.call(this,e,t,n);var i=!1;return r.forEach((function(e){if(e.__N){var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(i=!0)}})),!(!i&&s.__c.props===e)&&(!o||o.call(this,e,t,n))}}return s.__N||s.__}function _(e,t){var n=m(r++,3);!a.options.__s&&N(n.__H,t)&&(n.__=e,n.i=t,i.__H.__h.push(n))}function b(e,t){var n=m(r++,4);!a.options.__s&&N(n.__H,t)&&(n.__=e,n.i=t,i.__h.push(n))}function E(e){return l=5,D((function(){return{current:e}}),[])}function S(e,t,n){l=6,b((function(){return"function"==typeof e?(e(t()),function(){return e(null)}):e?(e.current=t(),function(){return e.current=null}):void 0}),null==n?n:n.concat(e))}function D(e,t){var n=m(r++,7);return N(n.__H,t)?(n.__V=e(),n.i=t,n.__h=e,n.__V):n.__}function A(e,t){return l=8,D((function(){return e}),t)}function C(e){var t=i.context[e.__c],n=m(r++,9);return n.c=e,t?(null==n.__&&(n.__=!0,t.sub(i)),t.props.value):e.__}function w(e,t){a.options.useDebugValue&&a.options.useDebugValue(t?t(e):e)}function T(e){var t=m(r++,10),n=v();return t.__=e,i.componentDidCatch||(i.componentDidCatch=function(e,r){t.__&&t.__(e,r),n[1](e)}),[n[0],function(){n[1](void 0)}]}function R(){var e=m(r++,11);if(!e.__){for(var t=i.__v;null!==t&&!t.__m&&null!==t.__;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__="P"+n[0]+"-"+n[1]++}return e.__}function O(){for(var e;e=c.shift();)if(e.__P&&e.__H)try{e.__H.__h.forEach(M),e.__H.__h.forEach(I),e.__H.__h=[]}catch(t){e.__H.__h=[],a.options.__e(t,e.__v)}}a.options.__b=function(e){i=null,u&&u(e)},a.options.__r=function(e){h&&h(e),r=0;var t=(i=e.__c).__H;t&&(s===i?(t.__h=[],i.__h=[],t.__.forEach((function(e){e.__N&&(e.__=e.__N),e.__V=d,e.__N=e.i=void 0}))):(t.__h.forEach(M),t.__h.forEach(I),t.__h=[])),s=i},a.options.diffed=function(e){f&&f(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(1!==c.push(t)&&o===a.options.requestAnimationFrame||((o=a.options.requestAnimationFrame)||k)(O)),t.__H.__.forEach((function(e){e.i&&(e.__H=e.i),e.__V!==d&&(e.__=e.__V),e.i=void 0,e.__V=d}))),s=i=null},a.options.__c=function(e,t){t.some((function(e){try{e.__h.forEach(M),e.__h=e.__h.filter((function(e){return!e.__||I(e)}))}catch(n){t.some((function(e){e.__h&&(e.__h=[])})),t=[],a.options.__e(n,e.__v)}})),p&&p(e,t)},a.options.unmount=function(e){g&&g(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.forEach((function(e){try{M(e)}catch(e){t=e}})),n.__H=void 0,t&&a.options.__e(t,n.__v))};var x="function"==typeof requestAnimationFrame;function k(e){var t,n=function(){clearTimeout(r),x&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,100);x&&(t=requestAnimationFrame(n))}function M(e){var t=i,n=e.__c;"function"==typeof n&&(e.__c=void 0,n()),i=t}function I(e){var t=i;e.__c=e.__(),i=t}function N(e,t){return!e||e.length!==t.length||t.some((function(t,n){return t!==e[n]}))}function P(e,t){return"function"==typeof t?t(e):t}function H(e,t){for(var n in t)e[n]=t[n];return e}function j(e,t){for(var n in e)if("__source"!==n&&!(n in t))return!0;for(var r in t)if("__source"!==r&&e[r]!==t[r])return!0;return!1}function B(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}function L(e){this.props=e}function U(e,t){function n(e){var n=this.props.ref,r=n==e.ref;return!r&&n&&(n.call?n(null):n.current=null),t?!t(this.props,e)||!r:j(this.props,e)}function r(t){return this.shouldComponentUpdate=n,(0,a.createElement)(e,t)}return r.displayName="Memo("+(e.displayName||e.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r}(L.prototype=new a.Component).isPureReactComponent=!0,L.prototype.shouldComponentUpdate=function(e,t){return j(this.props,e)||j(this.state,t)};var F=a.options.__b;a.options.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),F&&F(e)};var z="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function V(e){function t(t){var n=H({},t);return delete n.ref,e(n,t.ref||null)}return t.$$typeof=z,t.render=t,t.prototype.isReactComponent=t.__f=!0,t.displayName="ForwardRef("+(e.displayName||e.name)+")",t}var W=function(e,t){return null==e?null:(0,a.toChildArray)((0,a.toChildArray)(e).map(t))},G={map:W,forEach:W,count:function(e){return e?(0,a.toChildArray)(e).length:0},only:function(e){var t=(0,a.toChildArray)(e);if(1!==t.length)throw"Children.only";return t[0]},toArray:a.toChildArray},q=a.options.__e;a.options.__e=function(e,t,n,r){if(e.then)for(var i,s=t;s=s.__;)if((i=s.__c)&&i.__c)return null==t.__e&&(t.__e=n.__e,t.__k=n.__k),i.__c(e,t);q(e,t,n,r)};var Y=a.options.unmount;function Q(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),e.__c.__H=null),null!=(e=H({},e)).__c&&(e.__c.__P===n&&(e.__c.__P=t),e.__c=null),e.__k=e.__k&&e.__k.map((function(e){return Q(e,t,n)}))),e}function Z(e,t,n){return e&&(e.__v=null,e.__k=e.__k&&e.__k.map((function(e){return Z(e,t,n)})),e.__c&&e.__c.__P===t&&(e.__e&&n.insertBefore(e.__e,e.__d),e.__c.__e=!0,e.__c.__P=n)),e}function X(){this.__u=0,this.t=null,this.__b=null}function J(e){var t=e.__.__c;return t&&t.__a&&t.__a(e)}function $(e){var t,n,r;function i(i){if(t||(t=e()).then((function(e){n=e.default||e}),(function(e){r=e})),r)throw r;if(!n)throw t;return(0,a.createElement)(n,i)}return i.displayName="Lazy",i.__f=!0,i}function K(){this.u=null,this.o=null}a.options.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),Y&&Y(e)},(X.prototype=new a.Component).__c=function(e,t){var n=t.__c,r=this;null==r.t&&(r.t=[]),r.t.push(n);var i=J(r.__v),s=!1,o=function(){s||(s=!0,n.__R=null,i?i(a):a())};n.__R=o;var a=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=Z(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.t.pop();)t.forceUpdate()}},l=!0===t.__h;r.__u++||l||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(o,o)},X.prototype.componentWillUnmount=function(){this.t=[]},X.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=Q(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&(0,a.createElement)(a.Fragment,null,e.fallback);return i&&(i.__h=null),[(0,a.createElement)(a.Fragment,null,t.__a?null:e.children),i]};var ee=function(e,t,n){if(++n[1]===n[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(n=e.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),t.i.removeChild(e)}}),(0,a.render)((0,a.createElement)(te,{context:t.context},e.__v),t.l)):t.l&&t.componentWillUnmount()}function re(e,t){var n=(0,a.createElement)(ne,{__v:e,i:t});return n.containerInfo=t,n}(K.prototype=new a.Component).__a=function(e){var t=this,n=J(t.__v),r=t.o.get(e);return r[0]++,function(i){var s=function(){t.props.revealOrder?(r.push(i),ee(t,e,r)):i()};n?n(s):s()}},K.prototype.render=function(e){this.u=null,this.o=new Map;var t=(0,a.toChildArray)(e.children);e.revealOrder&&"b"===e.revealOrder[0]&&t.reverse();for(var n=t.length;n--;)this.o.set(t[n],this.u=[1,0,this.u]);return e.children},K.prototype.componentDidUpdate=K.prototype.componentDidMount=function(){var e=this;this.o.forEach((function(t,n){ee(e,n,t)}))};var ie="undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,se=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,oe="undefined"!=typeof document,ae=function(e){return("undefined"!=typeof Symbol&&"symbol"==typeof Symbol()?/fil|che|rad/i:/fil|che|ra/i).test(e)};function le(e,t,n){return null==t.__k&&(t.textContent=""),(0,a.render)(e,t),"function"==typeof n&&n(),e?e.__c:null}function ce(e,t,n){return(0,a.hydrate)(e,t),"function"==typeof n&&n(),e?e.__c:null}a.Component.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach((function(e){Object.defineProperty(a.Component.prototype,e,{configurable:!0,get:function(){return this["UNSAFE_"+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})}));var de=a.options.event;function ue(){}function he(){return this.cancelBubble}function fe(){return this.defaultPrevented}a.options.event=function(e){return de&&(e=de(e)),e.persist=ue,e.isPropagationStopped=he,e.isDefaultPrevented=fe,e.nativeEvent=e};var pe,ge={configurable:!0,get:function(){return this.class}},me=a.options.vnode;a.options.vnode=function(e){var t=e.type,n=e.props,r=n;if("string"==typeof t){var i=-1===t.indexOf("-");for(var s in r={},n){var o=n[s];oe&&"children"===s&&"noscript"===t||"value"===s&&"defaultValue"in n&&null==o||("defaultValue"===s&&"value"in n&&null==n.value?s="value":"download"===s&&!0===o?o="":/ondoubleclick/i.test(s)?s="ondblclick":/^onchange(textarea|input)/i.test(s+t)&&!ae(n.type)?s="oninput":/^onfocus$/i.test(s)?s="onfocusin":/^onblur$/i.test(s)?s="onfocusout":/^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(s)?s=s.toLowerCase():i&&se.test(s)?s=s.replace(/[A-Z0-9]/g,"-$&").toLowerCase():null===o&&(o=void 0),/^oninput$/i.test(s)&&(s=s.toLowerCase(),r[s]&&(s="oninputCapture")),r[s]=o)}"select"==t&&r.multiple&&Array.isArray(r.value)&&(r.value=(0,a.toChildArray)(n.children).forEach((function(e){e.props.selected=-1!=r.value.indexOf(e.props.value)}))),"select"==t&&null!=r.defaultValue&&(r.value=(0,a.toChildArray)(n.children).forEach((function(e){e.props.selected=r.multiple?-1!=r.defaultValue.indexOf(e.props.value):r.defaultValue==e.props.value}))),e.props=r,n.class!=n.className&&(ge.enumerable="className"in n,null!=n.className&&(r.class=n.className),Object.defineProperty(r,"className",ge))}e.$$typeof=ie,me&&me(e)};var ve=a.options.__r;a.options.__r=function(e){ve&&ve(e),pe=e.__c};var ye={ReactCurrentDispatcher:{current:{readContext:function(e){return pe.__n[e.__c].props.value}}}},_e="17.0.2";function be(e){return a.createElement.bind(null,e)}function Ee(e){return!!e&&e.$$typeof===ie}function Se(e){return Ee(e)?a.cloneElement.apply(null,arguments):e}function De(e){return!!e.__k&&((0,a.render)(null,e),!0)}function Ae(e){return e&&(e.base||1===e.nodeType&&e)||null}var Ce=function(e,t){return e(t)},we=function(e,t){return e(t)},Te=a.Fragment;function Re(e){e()}function Oe(e){return e}function xe(){return[!1,Re]}var ke=b;function Me(e,t){var n=t(),r=v({h:{__:n,v:t}}),i=r[0].h,s=r[1];return b((function(){i.__=n,i.v=t,B(i.__,t())||s({h:i})}),[e,n,t]),_((function(){return B(i.__,i.v())||s({h:i}),e((function(){B(i.__,i.v())||s({h:i})}))}),[e]),n}var Ie={useState:v,useId:R,useReducer:y,useEffect:_,useLayoutEffect:b,useInsertionEffect:ke,useTransition:xe,useDeferredValue:Oe,useSyncExternalStore:Me,startTransition:Re,useRef:E,useImperativeHandle:S,useMemo:D,useCallback:A,useContext:C,useDebugValue:w,version:"17.0.2",Children:G,render:le,hydrate:ce,unmountComponentAtNode:De,createPortal:re,createElement:a.createElement,createContext:a.createContext,createFactory:be,cloneElement:Se,createRef:a.createRef,Fragment:a.Fragment,isValidElement:Ee,findDOMNode:Ae,Component:a.Component,PureComponent:L,memo:U,forwardRef:V,flushSync:we,unstable_batchedUpdates:Ce,StrictMode:Te,Suspense:X,SuspenseList:K,lazy:$,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ye}},400:(e,t,n)=>{n.r(t),n.d(t,{Component:()=>C,Fragment:()=>b,cloneElement:()=>W,createContext:()=>G,createElement:()=>v,createRef:()=>_,h:()=>v,hydrate:()=>V,isValidElement:()=>o,options:()=>i,render:()=>z,toChildArray:()=>I});var r,i,s,o,a,l,c,d,u,h={},f=[],p=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function g(e,t){for(var n in t)e[n]=t[n];return e}function m(e){var t=e.parentNode;t&&t.removeChild(e)}function v(e,t,n){var i,s,o,a={};for(o in t)"key"==o?i=t[o]:"ref"==o?s=t[o]:a[o]=t[o];if(arguments.length>2&&(a.children=arguments.length>3?r.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(o in e.defaultProps)void 0===a[o]&&(a[o]=e.defaultProps[o]);return y(e,a,i,s,null)}function y(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++s:o};return null==o&&null!=i.vnode&&i.vnode(a),a}function _(){return{current:null}}function b(e){return e.children}function E(e,t,n){"-"===t[0]?e.setProperty(t,null==n?"":n):e[t]=null==n?"":"number"!=typeof n||p.test(t)?n:n+"px"}function S(e,t,n,r,i){var s;e:if("style"===t)if("string"==typeof n)e.style.cssText=n;else{if("string"==typeof r&&(e.style.cssText=r=""),r)for(t in r)n&&t in n||E(e.style,t,"");if(n)for(t in n)r&&n[t]===r[t]||E(e.style,t,n[t])}else if("o"===t[0]&&"n"===t[1])s=t!==(t=t.replace(/Capture$/,"")),t=t.toLowerCase()in e?t.toLowerCase().slice(2):t.slice(2),e.l||(e.l={}),e.l[t+s]=n,n?r||e.addEventListener(t,s?A:D,s):e.removeEventListener(t,s?A:D,s);else if("dangerouslySetInnerHTML"!==t){if(i)t=t.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if("width"!==t&&"height"!==t&&"href"!==t&&"list"!==t&&"form"!==t&&"tabIndex"!==t&&"download"!==t&&t in e)try{e[t]=null==n?"":n;break e}catch(e){}"function"==typeof n||(null==n||!1===n&&-1==t.indexOf("-")?e.removeAttribute(t):e.setAttribute(t,n))}}function D(e){a=!0;try{return this.l[e.type+!1](i.event?i.event(e):e)}finally{a=!1}}function A(e){a=!0;try{return this.l[e.type+!0](i.event?i.event(e):e)}finally{a=!1}}function C(e,t){this.props=e,this.context=t}function w(e,t){if(null==t)return e.__?w(e.__,e.__.__k.indexOf(e)+1):null;for(var n;tt&&l.sort((function(e,t){return e.__v.__b-t.__v.__b})));x.__r=0}function k(e,t,n,r,i,s,o,a,l,c){var d,u,p,g,m,v,_,E=r&&r.__k||f,S=E.length;for(n.__k=[],d=0;d0?y(g.type,g.props,g.key,g.ref?g.ref:null,g.__v):g)){if(g.__=n,g.__b=n.__b+1,null===(p=E[d])||p&&g.key==p.key&&g.type===p.type)E[d]=void 0;else for(u=0;u=0;t--)if((n=e.__k[t])&&(r=P(n)))return r;return null}function H(e,t,n,r,s,o,a,l,c){var d,u,h,f,p,m,v,y,_,E,S,D,A,w,T,R=t.type;if(void 0!==t.constructor)return null;null!=n.__h&&(c=n.__h,l=t.__e=n.__e,t.__h=null,o=[l]),(d=i.__b)&&d(t);try{e:if("function"==typeof R){if(y=t.props,_=(d=R.contextType)&&r[d.__c],E=d?_?_.props.value:d.__:r,n.__c?v=(u=t.__c=n.__c).__=u.__E:("prototype"in R&&R.prototype.render?t.__c=u=new R(y,E):(t.__c=u=new C(y,E),u.constructor=R,u.render=F),_&&_.sub(u),u.props=y,u.state||(u.state={}),u.context=E,u.__n=r,h=u.__d=!0,u.__h=[],u._sb=[]),null==u.__s&&(u.__s=u.state),null!=R.getDerivedStateFromProps&&(u.__s==u.state&&(u.__s=g({},u.__s)),g(u.__s,R.getDerivedStateFromProps(y,u.__s))),f=u.props,p=u.state,u.__v=t,h)null==R.getDerivedStateFromProps&&null!=u.componentWillMount&&u.componentWillMount(),null!=u.componentDidMount&&u.__h.push(u.componentDidMount);else{if(null==R.getDerivedStateFromProps&&y!==f&&null!=u.componentWillReceiveProps&&u.componentWillReceiveProps(y,E),!u.__e&&null!=u.shouldComponentUpdate&&!1===u.shouldComponentUpdate(y,u.__s,E)||t.__v===n.__v){for(t.__v!==n.__v&&(u.props=y,u.state=u.__s,u.__d=!1),t.__e=n.__e,t.__k=n.__k,t.__k.forEach((function(e){e&&(e.__=t)})),S=0;S2&&(a.children=arguments.length>3?r.call(arguments,2):n),y(e.type,a,i||e.key,s||e.ref,null)}function G(e,t){var n={__c:t="__cC"+u++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var n,r;return this.getChildContext||(n=[],(r={})[t]=this,this.getChildContext=function(){return r},this.shouldComponentUpdate=function(e){this.props.value!==e.value&&n.some((function(e){e.__e=!0,O(e)}))},this.sub=function(e){n.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){n.splice(n.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Provider.__=n.Consumer.contextType=n}r=f.slice,i={__e:function(e,t,n,r){for(var i,s,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((s=i.constructor)&&null!=s.getDerivedStateFromError&&(i.setState(s.getDerivedStateFromError(e)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},s=0,o=function(e){return null!=e&&void 0===e.constructor},a=!1,C.prototype.setState=function(e,t){var n;n=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=g({},this.state),"function"==typeof e&&(e=e(g({},n),this.props)),e&&g(n,e),null!=e&&this.__v&&(t&&this._sb.push(t),O(this))},C.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),O(this))},C.prototype.render=b,l=[],d="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,x.__r=0,u=0},603:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.calc_days_since_last_use=t.calc_total_units=t.calc_total_occasions=t.calc_days_used_amount=t.calc_days_used=void 0;var r=n(601);function i(e,t,n){for(var r=new Set,i=new Set,s=0,o=e;se?n:e}),new Date(s[0]));return(new Date(n).valueOf()-o.valueOf())/r.CVT_MS_DAY}},601:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RGX_DATE=t.RGX_WORD=t.RGX_INTEGER=t.COLOR_BROWN=t.COLOR_GREEN=t.COLOR_YELLOW=t.COLOR_ORANGE=t.COLOR_PURPLE=t.COLOR_TEXT=t.COLOR_WHITE=t.CAL_HEIGHT_DIFF=t.CVT_MS_DAY=t.CVT_HR_DAY=t.CVT_MIN_HR=t.CVT_S_MIN=t.CVT_MS_S=t.VERSION=void 0,t.VERSION="3.0.0",t.CVT_MS_S=1e3,t.CVT_S_MIN=60,t.CVT_MIN_HR=60,t.CVT_HR_DAY=24,t.CVT_MS_DAY=t.CVT_MS_S*t.CVT_S_MIN*t.CVT_MIN_HR*t.CVT_HR_DAY,t.CAL_HEIGHT_DIFF=205,t.COLOR_WHITE="#FFFFFF",t.COLOR_TEXT="#15141A",t.COLOR_PURPLE="#485FC7",t.COLOR_ORANGE="#E67975",t.COLOR_YELLOW="#F7DBA7",t.COLOR_GREEN="#041F1E",t.COLOR_BROWN="#5A352A",t.RGX_INTEGER=/^\d+$/,t.RGX_WORD=/^\w+$/,t.RGX_DATE=/^\d{4}-\d{2}-\d{2}$/},384:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Editor=void 0;var r=n(799),i=n(367),s=function(){function e(e){var t=this;this._copy_buffer=null,this._mode=null,this._calendar=e,this._substance_list=n(684),this._notification=document.getElementById("mode-notification"),this._substances_used={},document.querySelectorAll(".tlfb-edit-mode").forEach((function(e){return e.addEventListener("click",(function(e){return t.mode(e)}))})),this._calendar.on("dateClick",(function(e){return t.click_date(e)})),this._calendar.on("eventClick",(function(e){return t.click_event(e)})),this._calendar.on("select",(function(e){return t.select_range(e)})),this._modal_key_event=new r.Modal("modal-key-event"),this._modal_sub_event=new r.Modal("modal-substance-event"),this._modal_confirm=new r.Modal("modal-confirm");var s=new URLSearchParams(window.location.search),o=null==s.get("start")?s.get("start"):"2000-01-01",a=null==s.get("end")?s.get("end"):"2000-01-01";this._event_list=new i.CalendarEventList(o,a,this._calendar)}return e.prototype.clear=function(){this._mode=null,this._copy_buffer=null,this._notification.innerText="Click the edit menu to begin adding events."},e.prototype.mode=function(e){var t=e.target.id;switch(this.clear(),t){case"edit-mode-key-event":this._mode="add-key",this._notification.innerHTML="Click a date on the calendar to add a key date.";break;case"edit-mode-substance-event":0==Object.keys(this._substances_used).length?this._notification.innerHTML="Please update the substance list to include at least one substance.":(this._mode="add-su",this._notification.innerHTML="Click a date on the calendar to add a substance use event.");break;case"edit-mode-no-substance":this._mode="no-sub",this._notification.innerHTML="Click a date on the calendar on which there was no substances used.";break;case"edit-mode-copy":this._mode="copy",this._notification.innerHTML="Click an event on the calendar to copy.";break;case"edit-mode-delete":this._mode="delete",this._notification.innerHTML="Click an event on the calendar to delete.";break;default:throw Error("Edit.mode(): Invalid target received.")}console.log("Edit.mode(): ".concat(this._mode))},e.prototype.update_sub_options=function(e,t){t.innerHTML="",e.forEach((function(e){t.insertAdjacentHTML("beforeend",'"))}))},e.prototype.update_amount=function(){var e=document.getElementById("substance-event-amount");document.getElementById("substance-event-amount-unknown").checked?(e.value="",e.disabled=!0,e.required=!1):(e.value="",e.disabled=!1,e.required=!0)},e.prototype.update_units=function(){var e=document.getElementById("substance-event-units"),t=document.getElementById("substance-event-units-other");document.getElementById("substance-event-units-unknown").checked?(t.value="",e.disabled=!0,e.required=!1,t.disabled=!0,t.required=!1):(t.value="",e.disabled=!1,e.required=!0,t.disabled=!0,t.required=!1,e.children.length||(e.disabled=!0,e.required=!1,t.disabled=!1,t.required=!0),"other_unit"===e.value&&(t.disabled=!1,t.required=!0))},e.prototype.update_type_options=function(e,t){var n=document.getElementById("substance-event-type"),r=this._substance_list.substance[e].find((function(e){return e.label===t}));if(null!=r)if(r.hasOwnProperty("type")){n.disabled=!1;var i=[];r.type.forEach((function(e){i.push({value:e,label:e})})),i.push({value:"unknown",label:"unknown"}),this.update_sub_options(i,n)}else n.innerHTML="",n.disabled=!0;else n.innerHTML="",n.disabled=!0},e.prototype.update_unit_options=function(e,t){var n=document.getElementById("substance-event-units"),r=document.getElementById("substance-event-units-other"),i=[],s=this._substance_list.substance[e].find((function(e){return e.label===t}));null!=s?(s.hasOwnProperty("units")?(n.disabled=!1,r.disabled=!0,r.required=!1,s.units.forEach((function(e){i.push({value:e,label:e})})),i.push({value:"other_unit",label:"other"}),this.update_sub_options(i,n)):(n.innerHTML="",r.value="",n.disabled=!0),n.addEventListener("input",(function(){"other_unit"==n.value?(r.disabled=!1,r.required=!0):(r.value="",r.disabled=!0,r.required=!1)}))):(n.innerHTML="",r.value="",n.disabled=!0,r.disabled=!0,r.required=!1),this.update_units()},e.prototype.update_method_options=function(e,t){var n=this,r=document.getElementById("substance-event-method"),i=document.getElementById("substance-event-method-other");if(t){var s=[];this._substances_used[e].forEach((function(e){s.push({value:e.label,label:e.label})})),this.update_sub_options(s,r)}this.update_unit_options(e,r.value),this.update_type_options(e,r.value),r.value.includes("Other")?(i.disabled=!1,i.required=!0,this._modal_sub_event.setElementClass({"#substance-method-other":["is-hidden",!1]})):(i.disabled=!0,i.required=!1,this._modal_sub_event.setElementClass({"#substance-method-other":["is-hidden",!0]})),r.addEventListener("input",(function(){n.update_method_options(e,!1)}))},e.prototype.substance_event_options=function(){var e=this,t=document.getElementById("substance-event-category"),n=[];Object.keys(this._substances_used).forEach((function(t){var r=e._substance_list.category.find((function(e){return e.id===t.toString()}));n.push({value:r.id,label:r.label})})),this.update_sub_options(n,t),this.update_method_options(t.value,!0),t.addEventListener("input",(function(){e.update_method_options(t.value,!0)})),document.getElementById("substance-event-amount-unknown").addEventListener("input",(function(){e.update_amount()})),document.getElementById("substance-event-units-unknown").addEventListener("input",(function(){e.update_units()}))},e.prototype.get_substance_event_properties=function(e){var t="unknown"===e.get("substance-event-amount-unknown")?"unknown":Number(e.get("substance-event-amount")),n="unknown"===e.get("substance-event-units-unknown")?"unknown":e.get("substance-event-units");return{category:e.get("substance-event-category"),substance:this._substance_list.category.find((function(t){return t.id===e.get("substance-event-category")})).label,methodType:e.get("substance-event-type"),method:e.get("substance-event-method"),methodOther:e.get("substance-event-method-other"),times:Number(e.get("substance-event-occasions")),amount:t,units:n,unitsOther:e.get("substance-event-units-other"),note:e.get("substance-event-notes")}},e.prototype.click_date=function(e){var t=this;switch(console.log("Edit.click_date(): ".concat(e.dateStr)),this._mode){case"add-key":document.getElementById("add-key-event").innerText="Add to Timeline",this._modal_key_event.populateText({".subtitle":e.date.toDateString()}).open((function(n){t._event_list.add(new i.KeyEvent(e.dateStr,n.get("key-text")))}));break;case"add-su":var n=this._event_list.get_events().filter((function(e){return i.NoUseEvent.prototype.isPrototypeOf(e)})).map((function(e){return e.date}));this._notification.innerHTML="Click a date on the calendar to add a substance use event.",n.includes(e.dateStr)?this._notification.innerHTML="Please select a valid date for the substance event.":(this._notification.innerHTML="Click a date on the calendar to add a substance use event.",document.getElementById("add-substance-event").innerText="Add to Timeline",this.substance_event_options(),this.update_amount(),this._modal_sub_event.populateText({".subtitle":e.date.toDateString()}).open((function(n){var r=t.get_substance_event_properties(n);t._event_list.add(new i.UseEvent(e.dateStr,r))})));break;case"no-sub":this._event_list.add(new i.NoUseEvent(e.dateStr));case"copy":if(this._copy_buffer){var r=this._copy_buffer.clone();r.set_date(e.dateStr).set_gid(this._copy_buffer.gid),this._event_list.add(r,!1)}}},e.prototype.select_range=function(e){var t=this;console.log("Edit.select_range(): ".concat(e.startStr," to ").concat(e.endStr));var n=new Date(e.endStr);n.setDate(e.end.getDate()-2);var r=n.toISOString().substring(0,10);switch(this._mode){case"add-key":this._modal_key_event.populateText({".subtitle":"".concat(e.start.toDateString()," to ").concat(n.toDateString())}).open((function(n){var s=new i.KeyEvent(e.startStr,n.get("key-text"));t._event_list.import_events(s.make_recurrence([1,2,3,4,5,6,7],r))}));break;case"no-sub":var s=new i.NoUseEvent(e.startStr);this._event_list.import_events(s.make_recurrence([1,2,3,4,5,6,7],r))}},e.prototype.click_event=function(e){var t=this;switch(console.log("Edit.click_event(): ".concat(e.event.title," (event ").concat(e.event.id," / group ").concat(e.event.groupId,")")),this._mode){case"copy":this._copy_buffer=this._event_list.get_event(Number(e.event.id)),this._notification.innerHTML="Click any date to paste the event called ".concat(this._copy_buffer.title,".");break;case"delete":this.delete_event(Number(e.event.id));break;default:var n=this._event_list.get_event(Number(e.event.id));if(i.KeyEvent.prototype.isPrototypeOf(n)){var r={"key-text":n.title};this._modal_key_event.populateForm(r),document.getElementById("add-key-event").innerText="Update",this._modal_key_event.populateText({".subtitle":n.date}).open((function(n){t._event_list.get_event_group(Number(e.event.groupId)).forEach((function(e){e.set_properties({title:n.get("key-text")})})),e.event.setProp("title",n.get("key-text")),sessionStorage.setItem("eventsList",JSON.stringify(t._event_list.get_events()))}))}else if(i.UseEvent.prototype.isPrototypeOf(n)){var s={"substance-event-units-other":n.properties.unitsOther,"substance-event-occasions":n.properties.times.toString(),"substance-event-notes":n.properties.note,"substance-event-type":n.properties.methodType};"unknown"===n.properties.amount?document.getElementById("substance-event-amount-unknown").checked=!0:s["substance-event-amount"]=n.properties.amount.toString(),"unknown"===n.properties.units?document.getElementById("substance-event-units-unknown").checked=!0:s["substance-event-units"]=n.properties.units,this.substance_event_options(),this._modal_sub_event.populateForm({"substance-event-category":n.properties.category}),this.update_method_options(n.properties.category,!0),this._modal_sub_event.populateForm({"substance-event-method-other":n.properties.methodOther,"substance-event-method":n.properties.method}),this.update_method_options(n.properties.category,!1),this.update_type_options(n.properties.category,n.properties.method),this.update_unit_options(n.properties.category,n.properties.method),this.update_amount(),this._modal_sub_event.populateForm(s);var o=document.getElementById("substance-event-units"),a=document.getElementById("substance-event-units-other");"other_unit"==o.value&&(a.disabled=!1,a.required=!0),document.getElementById("add-substance-event").innerText="Update",this._modal_sub_event.populateText({".subtitle":n.date}).open((function(n){var r=t.get_substance_event_properties(n);t._event_list.get_event_group(Number(e.event.groupId)).forEach((function(e){e.set_properties(r)})),e.event.setProp("title",t._event_list.get_event(Number(e.event.id)).title),sessionStorage.setItem("eventsList",JSON.stringify(t._event_list.get_events()))}))}}},e.prototype.delete_event=function(e){var t=this,n=this._event_list.get_event(e),r=this._event_list.get_event_siblings(e).length;r>0?this._modal_confirm.populateText({".modal-card-title":"Confirm Deletion of Multiple Events",".content":"

The event on ".concat(n.date," titled ").concat(n.title," is related to ").concat(r," other events.

")+"

Confirm whether you want to delete just this event, or all of the events in the group.

"}).setElementClass({"#delete-all-button":["is-hidden",!1]}).open((function(r){r.forEach((function(e,t){return console.log("".concat(e," ").concat(t))})),"single"==r.get("action")?t._event_list.delete_event(e):"multiple"==r.get("action")&&t._event_list.delete_group(n.gid)})):this._modal_confirm.populateText({".modal-card-title":"Confirm Event Deletion",".content":"

Confirm that you want to delete the event on ".concat(n.date," titled ").concat(n.title,".

")}).setElementClass({"#delete-all-button":["is-hidden",!0]}).open((function(){t._event_list.delete_event(e)}))},e.prototype.get_event_list=function(){return this._event_list},e.prototype.update_substances_used=function(e){this._substances_used=e},e}();t.Editor=s},364:function(e,t,n){var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.File=void 0;var o=n(799),a=n(519),l=n(367),c=s(n(603)),d=n(601),u=function(){function e(e,t,r){var i=this;if(this._current_properties=e,this._calendar=t,this._modal_substances=new o.Modal("modal-select-substances"),this._modal_properties=new o.Modal("modal-update-properties"),this._modal_summary=new o.Modal("modal-get-summary"),this._modal_import_json=new o.Modal("modal-import-json"),this._modal_import_csv=new o.Modal("modal-import-csv"),this._modal_confirm_import=new o.Modal("modal-confirm-export"),this._substance_list=n(684),this._editor=r,null===sessionStorage.getItem("substancesUsed")?this._substances_used={}:(this._substances_used=JSON.parse(sessionStorage.getItem("substancesUsed")),this._editor.update_substances_used(this._substances_used)),null!=sessionStorage.getItem("eventsList")){var s=JSON.parse(sessionStorage.getItem("eventsList"));s.forEach((function(e){e._date=e._date._date})),this.deserialize_events_json(s)}document.querySelectorAll(".tlfb-file-mode").forEach((function(e){return e.addEventListener("click",(function(e){return i.mode(e)}))}))}return e.prototype.mode=function(e){var t=e.target.id;switch(t){case"mode-button-file-properties":document.getElementById("properties-warn").innerText="",this.change_properties();break;case"mode-button-edit-list":this.select_substance();break;case"mode-button-summarize":this.summarize();break;case"mode-button-import-json":this.import_json();break;case"mode-button-import-csv":this.import_csv();break;case"mode-button-export-json":this.export_json();break;case"mode-button-export-csv":this.export_csv()}console.log("Clicked: ".concat(t))},e.prototype.change_properties=function(){var e=this;this._modal_properties.populateForm({"project-name":this._current_properties.pid,"cam-id":this._current_properties.subject,"record-id":this._current_properties.record,"tlfb-event":this._current_properties.timepoint,"tlfb-start":this._current_properties.start,"tlfb-end":this._current_properties.end,"tlfb-keyfield":this._current_properties.keyfield,"tlfb-staff":this._current_properties.staff}),this._modal_properties.open((function(t){var n={subject:t.get("cam-identifier").toString(),record:t.get("record-identifier").toString(),pid:t.get("project-name").toString(),timepoint:t.get("tlfb-event").toString(),start:t.get("tlfb-start").toString(),end:t.get("tlfb-end").toString(),keyfield:t.get("tlfb-keyfield").toString(),staff:t.get("tlfb-staff").toString()};(0,a.update_properties)(e._current_properties,n),e._calendar.setOption("validRange",{start:e._current_properties.start,end:e._current_properties.end})}))},e.prototype.missing_properties_warn=function(e){var t="The following REDCap parameters were not recieved. Please manually fill them in: ";e.forEach((function(e){t=t+e+", "})),document.getElementById("properties-warn").innerText=t,this.change_properties()},e.prototype.get_deselected_substances=function(e,t){var n=[];return Object.keys(e).forEach((function(r){t.hasOwnProperty(r)?e[r].forEach((function(e){t[r].map((function(e){return e.label})).includes(e.label)||n.push(e.label)})):e[r].forEach((function(e){n.push(e.label)}))})),n},e.prototype.merge_selected_substances=function(e){var t=this;Object.keys(e).forEach((function(n){t._substances_used.hasOwnProperty(n)?e[n].forEach((function(e){var r=t._substance_list.substance[n].find((function(t){return t.label===e.label}));t._substances_used[n].map((function(e){return e.label})).includes(r.label)||t._substances_used[n].push(r)})):t._substances_used[n]=e[n]}))},e.prototype.select_substance=function(){var e=this;Object.keys(this._substances_used).forEach((function(t){e._substances_used[t].forEach((function(n){var r=e._substance_list.substance[t].findIndex((function(e){return e.label===n.label}));document.getElementById("".concat(r.toString()+t)).checked=!0}))})),this._modal_substances.populateText({".subtitle":this._current_properties.start+" to "+this._current_properties.end}).open((function(t){var n={};t.forEach((function(t){var r=t.toString().split(" "),i=e._substance_list.substance[r[1]][Number(r[0])];n.hasOwnProperty(r[1])?n[r[1]].push(i):n[r[1]]=[i]})),e.get_deselected_substances(e._substances_used,n).forEach((function(t){e._editor.get_event_list().delete_substance(t)})),e._substances_used=n,sessionStorage.setItem("substancesUsed",JSON.stringify(e._substances_used)),e._editor.update_substances_used(e._substances_used)}))},e.prototype.summarize=function(){var e=this,t=this._current_properties.days/7,n=(new Date).toISOString().split("T")[0],r=new l.CalendarDate(this._current_properties.start),i=new l.CalendarDate(this._current_properties.end),s=this._editor.get_event_list().get_events().filter((function(e){return(e.date_object.isAfter(r)||e.date_object.isSameDay(r))&&e.date_object.isBefore(i)&&l.UseEvent.prototype.isPrototypeOf(e)})),o=c.calc_days_used(s,"etoh"),a=c.calc_days_used(s,"cn"),d=c.calc_days_used(s,"nic"),u=c.calc_days_used_amount(s,"etoh");document.getElementById("tlfb_etoh_total_days").innerText=String(o),document.getElementById("tlfb_mj_total_days").innerText=String(a),document.getElementById("tlfb_nic_total_days").innerText=String(d);var h=c.calc_total_units(s,"Alcohol","standard drinks");document.getElementById("tlfb_etoh_total_units").innerHTML=o!=u?String(h)+"+":String(h);var f=c.calc_total_occasions(s,"cn"),p=c.calc_total_occasions(s,"nic");document.getElementById("tlfb_mj_total_units").innerHTML=String(f),document.getElementById("tlfb_nic_total_units").innerHTML=String(p),document.getElementById("tlfb_etoh_avg_unitsday").innerHTML=String((+h/+u).toFixed(3)),document.getElementById("tlfb_mj_avg_unitsday").innerHTML=String((+f/+a).toFixed(3)),document.getElementById("tlfb_nic_avg_unitsday").innerHTML=String((+p/+d).toFixed(3)),document.getElementById("tlfb_etoh_avg_units").innerHTML=String((+h/t).toFixed(3)),document.getElementById("tlfb_mj_avg_units").innerHTML=String((+f/t).toFixed(3)),document.getElementById("tlfb_nic_avg_units").innerHTML=String((+p/t).toFixed(3)),document.getElementById("tlfb_etoh_avg_days").innerHTML=String((+o/this._current_properties.days*7).toFixed(3)),document.getElementById("tlfb_mj_avg_days").innerHTML=String((+a/this._current_properties.days*7).toFixed(3)),document.getElementById("tlfb_nic_avg_days").innerHTML=String((+d/this._current_properties.days*7).toFixed(3)),document.getElementById("tlfb_etoh_last_use").innerHTML=String(c.calc_days_since_last_use(s,"etoh",n)),document.getElementById("tlfb_mj_last_use").innerHTML=String(c.calc_days_since_last_use(s,"cn",n)),document.getElementById("tlfb_nic_last_use").innerHTML=String(c.calc_days_since_last_use(s,"nic",n)),this._modal_summary.open((function(){e._modal_confirm_import.open((function(t){"json"===t.get("select-export-method")?e.export_json():"csv"===t.get("select-export-method")&&e.export_csv()}))}))},e.prototype.deserialize_events_json=function(e){var t=this,n=e.reduce((function(e,t){return e[String(t._gid)]?e[String(t._gid)].push(t):e[String(t._gid)]=[t],e}),{});Object.keys(n).forEach((function(e){var r=[];n[e].forEach((function(e){var t=e._date.split("T")[0];if("no-use"===e._type)r.push(new l.NoUseEvent(t));else if("key"===e._type)r.push(new l.KeyEvent(t,e._title));else if("use"===e._type){var n={category:e._category,substance:e._substance,methodType:e._methodType,method:e._method,methodOther:e._methodOther,times:Number(e._times),amount:"unknown"===e._amount?e._amount:Number(e._amount),units:e._units,unitsOther:e._unitsOther,note:e._note};r.push(new l.UseEvent(t,n))}})),t._editor.get_event_list().import_events(r,!0)}))},e.prototype.deserialize_events_csv=function(e){var t=this,n=e.reduce((function(e,t){return e[String(t[4])]?e[String(t[4])].push(t):e[String(t[4])]=[t],e}),{});Object.keys(n).forEach((function(e){var r=[];n[e].forEach((function(e){var t=e[1].split("T")[0];if("no-use"===e[2])r.push(new l.NoUseEvent(t));else if("key"===e[2])r.push(new l.KeyEvent(t,e[5]));else if("use"===e[2]){var n={category:e[6],substance:e[7],methodType:e[8],method:e[9],methodOther:e[10],times:Number(e[11]),amount:"unknown"===e[12]?e[12]:Number(e[12]),units:e[13],unitsOther:e[14],note:e[15]};r.push(new l.UseEvent(t,n))}})),t._editor.get_event_list().import_events(r,!0)}))},e.prototype.valid_JSON=function(e){try{if(["subject","event","pid","start","end","staff","record","keyfield","datetime"].forEach((function(t){if(!e.hasOwnProperty(t))throw new Error;if(null!=e[t]&&"string"!=typeof e[t])throw new Error})),0===e.events.length)return!0;e.events.forEach((function(e){if("object"!=typeof e)throw new Error}));var t=["category","substance","occasions","amount","units","notes"],n=["_category","_substance","_methodType","_method","_methodOther","_times","_amount","_units","_unitsOther","_note"];return e.events[0].hasOwnProperty("title")?(e.events.forEach((function(e){if("string"!=typeof e.title||"string"!=typeof e.type||"string"!=typeof e.start)throw new Error;if(e.hasOwnProperty("end")&&"string"!=typeof e.end)throw new Error;"substance-event"===e.type&&t.forEach((function(t){if("string"!=typeof e[t])throw new Error}))})),!0):(e.events.forEach((function(e){if("number"!=typeof e._eid||"number"!=typeof e._gid)throw new Error;if("string"!=typeof e._title||"string"!=typeof e._type||"string"!=typeof e._date)throw new Error;"use"===e._type&&n.forEach((function(t){if("_times"===t){if("number"!=typeof e[t])throw new Error}else if("_amount"===t){if("number"!=typeof e[t]&&"unknown"!=e[t])throw new Error}else if("_unitsOther"===t||"_methodOther"===t||"_methodType"===t||"_units"===t){if(null!=e[t]&&"string"!=typeof e[t])throw new Error}else if("string"!=typeof e[t])throw new Error}))})),!0)}catch(e){return!1}},e.prototype.valid_CSV=function(e){return JSON.stringify(e[0])==JSON.stringify(["Subject","Event","pID","Start","End","Staff","Record","Keyfield","Datetime","AppVersion","","","","","",""])&&JSON.stringify(e[2])==JSON.stringify(["","","","","","","","","","","","","","","",""])&&JSON.stringify(e[3])==JSON.stringify(["Event","Date","Type","eID","gID","Title","Category","Substance","MethodType","Method","MethodOther","Times","Amount","Units","UnitsOther","Note"])},e.prototype.import_json=function(){var e=this,t={},n=[],r={},i=this,s=document.getElementById("upload-out-subject"),o=document.getElementById("upload-out-event"),l=document.getElementById("upload-out-start"),c=document.getElementById("upload-out-end"),d=document.getElementById("upload-out-events"),u=document.getElementById("upload-out-earliest"),h=document.getElementById("upload-out-latest"),f=document.getElementById("upload-out-substances"),p=document.getElementById("filename-upload-json"),g=document.getElementById("json-warn"),m=[s,o,l,c,d,u,h,f,p,g];this.reset_modal_text(m),p.innerText="*.json",document.getElementById("upload-data-json").addEventListener("change",(function(a){e.reset_modal_text(m),p.innerText=a.target.files[0].name;var v=new FileReader;v.onload=function(e){var a=JSON.parse(e.target.result);if(!i.valid_JSON(a))return i._modal_import_json.reset(),void(g.innerText="The selected json file does not contain data in an accepted format.");if(t={subject:a.subject,record:a.record,pid:a.pid,timepoint:a.event,start:a.start,end:a.end,keyfield:a.keyfield,staff:a.staff},0!==(n=a.events).length&&a.events[0].hasOwnProperty("title")){var p=[],m=0,v=0;n.forEach((function(e){var t=[e.start];if(e.hasOwnProperty("end"))for(var n=new Date(e.start);n.toISOString().split("T")[0]!=e.end;)n.setDate(n.getDate()+1),t.push(n.toISOString().split("T")[0]);t.forEach((function(t){var n={_title:e.title,_date:t,_eid:m,_gid:v};if(m++,"key-event"===e.type)n._type="key",p.push(n);else if("substance-event"===e.type){var r="mj"===e.category?"cn":e.category,s=i._substance_list.substance[r].find((function(t){return t.label.toLowerCase()===e.substance.toLowerCase()}));if(n._type="use",n._category=r,n._substance=i._substance_list.category.find((function(e){return e.id===r})).label,n._times=e.occasions,n._amount=Number(e.occasions)*Number(e.amount),n._units=e.units,n._unitsOther=null,n._note=e.notes,null!=s)n._method=s.label,n._methodType=s.hasOwnProperty("type")?"unknown":null,n._methodOther=null;else{var o=i._substance_list.substance[r].slice(-1)[0];n._method=o.label,n._methodOther=e.substance,n._methodType=null,n._unitsOther=e.units}p.push(n)}})),v++})),n=p}if(s.classList.remove("has-text-danger"),s.innerText=a.subject,a.subject!=i._current_properties.subject&&s.classList.add("has-text-danger"),o.classList.remove("has-text-danger"),o.innerText=a.event,a.event!=i._current_properties.timepoint&&o.classList.add("has-text-danger"),l.classList.remove("has-text-danger"),l.innerText=a.start,a.start!=i._current_properties.start&&l.classList.add("has-text-danger"),c.classList.remove("has-text-danger"),c.innerText=a.end,a.end!=i._current_properties.end&&c.classList.add("has-text-danger"),d.innerText=String(a.events.length),a.events.length>0){var y=a.events.reduce((function(e,t){var n=new Date(t._date);return ne?n:e}),new Date(n[0]._date));h.innerText=_.toISOString().split("T")[0]}else u.innerText="-",h.innerText="-";var b="";n.forEach((function(e){if("use"===e._type){e._category="mj"===e._category?"cn":e._category;var t=i._substance_list.substance[e._category].find((function(t){return t.label===e._method}));r.hasOwnProperty(e._category)&&!r[e._category].includes(t)?r[e._category].push(t):r[e._category]=[t],b.includes(e._method)||(b=b+e._method+", ")}})),f.innerText=b},v.readAsText(a.target.files[0])})),this._modal_import_json.open((function(){(0,a.update_properties)(e._current_properties,t);var i=Object.keys(t).filter((function(e){return null===t[e]}));i.length&&e.missing_properties_warn(i),e._calendar.setOption("validRange",{start:e._current_properties.start,end:e._current_properties.end}),e.merge_selected_substances(r),e._editor.update_substances_used(e._substances_used),sessionStorage.setItem("substancesUsed",JSON.stringify(e._substances_used)),e.deserialize_events_json(n)}))},e.prototype.import_csv=function(){var e=this,t={},n=[],r={},i=this,s=document.getElementById("upload-csv-subject"),o=document.getElementById("upload-csv-event"),l=document.getElementById("upload-csv-start"),c=document.getElementById("upload-csv-end"),d=document.getElementById("upload-csv-events"),u=document.getElementById("upload-csv-earliest"),h=document.getElementById("upload-csv-latest"),f=document.getElementById("upload-csv-substances"),p=document.getElementById("filename-upload-csv"),g=document.getElementById("csv-warn"),m=[s,o,l,c,d,u,h,f,p,g];this.reset_modal_text(m),p.innerText="*.csv",document.getElementById("upload-data-csv").addEventListener("change",(function(a){g.innerText="",e.reset_modal_text(m),p.innerText=a.target.files[0].name;var v=new FileReader;v.onload=function(e){var a=e.target.result,p=[];if(a.split("\n").forEach((function(e){p.push(e.split(","))})),!i.valid_CSV(p))return i._modal_import_csv.reset(),void(g.innerText="The selected csv file does not contain data in an accepted format.");var m=p[1];if(n=p.length>4?p.slice(4,-1):[],t={subject:m[0],record:m[6],pid:m[2],timepoint:m[1],start:m[3],end:m[4],keyfield:m[7],staff:m[5]},s.classList.remove("has-text-danger"),s.innerText=m[0],m[0]!=i._current_properties.subject&&s.classList.add("has-text-danger"),o.classList.remove("has-text-danger"),o.innerText=m[1],m[1]!=i._current_properties.timepoint&&o.classList.add("has-text-danger"),l.classList.remove("has-text-danger"),l.innerText=m[3],m[3]!=i._current_properties.start&&l.classList.add("has-text-danger"),c.classList.remove("has-text-danger"),c.innerText=m[4],m[4]!=i._current_properties.end&&c.classList.add("has-text-danger"),d.innerText=String(n.length),n.length>0){var v=n.reduce((function(e,t){var n=new Date(t[1]);return ne?n:e}),new Date(n[0][1]));h.innerText=y.toISOString().split("T")[0]}else u.innerText="-",h.innerText="-";var _="";n.forEach((function(e){if("use"===e[2]){var t=e[9].includes(".")?e[9].replace(".",","):e[9],n=i._substance_list.substance[e[6]].find((function(e){return e.label===t}));r.hasOwnProperty(e[6])&&!r[e[6]].includes(n)?r[e[6]].push(n):r[e[6]]=[n],_.includes(e[9])||(_=_+e[9]+", ")}})),f.innerText=_},v.readAsText(a.target.files[0])})),this._modal_import_csv.open((function(){(0,a.update_properties)(e._current_properties,t);var i=Object.keys(t).filter((function(e){return null===t[e]}));i.length&&e.missing_properties_warn(i),e._calendar.setOption("validRange",{start:e._current_properties.start,end:e._current_properties.end}),e.merge_selected_substances(r),e._editor.update_substances_used(e._substances_used),sessionStorage.setItem("substancesUsed",JSON.stringify(e._substances_used)),e.deserialize_events_csv(n)}))},e.prototype.export_json=function(){var e="TLFB-"+this._current_properties.pid+"-"+this._current_properties.subject+"-"+this._current_properties.start+"-"+this._current_properties.end+".json",t={subject:this._current_properties.subject,event:this._current_properties.timepoint,pid:this._current_properties.pid,start:this._current_properties.start,end:this._current_properties.end,staff:this._current_properties.staff,record:this._current_properties.record,keyfield:this._current_properties.keyfield,datetime:new Date,appversion:d.VERSION,events:this._editor.get_event_list().serialize_events("json")},n=JSON.stringify(t),r=new Blob([n],{type:"application/json"}),i=URL.createObjectURL(r),s=document.createElement("a");s.href=i,s.download=e,s.click(),URL.revokeObjectURL(i)},e.prototype.export_csv=function(){var e="TLFB-"+this._current_properties.pid+"-"+this._current_properties.subject+"-"+this._current_properties.start+"-"+this._current_properties.end+".csv",t=[["Subject","Event","pID","Start","End","Staff","Record","Keyfield","Datetime","AppVersion","","","","","",""],[this._current_properties.subject,this._current_properties.timepoint,this._current_properties.pid,this._current_properties.start,this._current_properties.end,this._current_properties.staff,this._current_properties.record,this._current_properties.keyfield,(new Date).toISOString(),d.VERSION,"","","","","","",""],["","","","","","","","","","","","","","","",""]],n=this._editor.get_event_list().serialize_events("csv"),r=t.concat(n),i="";r.forEach((function(e){i=i+e.join(",")+"\n"}));var s=new Blob([i],{type:"text/csv"}),o=URL.createObjectURL(s),a=document.createElement("a");a.href=o,a.download=e,a.click(),URL.revokeObjectURL(o)},e.prototype.reset_modal_text=function(e){e.forEach((function(e){e.innerText=""}))},e}();t.File=u},519:function(e,t,n){var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n);var i=Object.getOwnPropertyDescriptor(t,n);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,i)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),s=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return i(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.update_properties=void 0;var a=n(553),l=o(n(610)),c=o(n(790)),d=n(384),u=n(364),h=s(n(882)),f=n(601);function p(){for(var e=new URLSearchParams(window.location.search),t={},n=[],r=0,i=[{name:"record",to:"record",validator:f.RGX_INTEGER},{name:"pid",to:"pid",validator:f.RGX_INTEGER},{name:"event",to:"timepoint",validator:f.RGX_WORD},{name:"subject",to:"subject",validator:f.RGX_WORD},{name:"start",to:"start",validator:f.RGX_DATE},{name:"end",to:"end",validator:f.RGX_DATE},{name:"keyfield",to:"keyfield",validator:f.RGX_WORD},{name:"staff",to:"staff",validator:f.RGX_WORD}];r0&&m.missing_properties_warn(r);var v=n(684),y=document.getElementById("substance-form");v.category.forEach((function(e){y.insertAdjacentHTML("beforeend",'
'.concat(e.label,"
")),v.substance[e.id].forEach((function(t,n){y.insertAdjacentHTML("beforeend",'\n
"))}))})),window.addEventListener("resize",(function(){s.setOption("height",window.innerHeight-f.CAL_HEIGHT_DIFF)}))}))},799:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Modal=void 0;var n=function(){function e(e){var t,n=this;this._onsubmit=null;var r=document.getElementById(e);if(null==r)throw Error("Modal(): Could not locate DOM element '#".concat(e,"'."));if(!r.classList.contains("modal"))throw Error("Modal(): '#".concat(e,"' is not of class 'modal'."));this._element=r,this._form=this._element.querySelector("form"),this._element.querySelectorAll(".modal-close, .cancel-operation").forEach((function(e){return e.addEventListener("click",(function(){return n.close()}))})),null===(t=this._form)||void 0===t||t.addEventListener("submit",(function(e){e.preventDefault(),n.submit(e)}))}return e.prototype.reset=function(){var e;console.log("Modal.reset(): ".concat(this._element.id)),null===(e=this._form)||void 0===e||e.reset()},e.prototype.submit=function(e){if(console.log("Modal.submit(): ".concat(this._element.id)),!this._form)throw Error("Modal.submit(): Cannot submit modal with no descendant form ".concat(this._element.id,"."));if(!this._onsubmit)throw Error("Modal.submit(): Form submitted but no handler specified.");var t=this.getFormData(),n=e.submitter.value;return n&&t.append("action",n),this._onsubmit(t),this.close()},e.prototype.populateForm=function(e){if(console.log("Modal.populateForm(): ".concat(this._element.id)),!this._form)throw Error("Modal.populateForm(): Cannot populate modal with no descendant form ".concat(this._element.id,"."));for(var t in e){if(!this._form.elements.namedItem(t))throw Error("Modal.populateForm(): Named element '".concat(t,"' not found in form."));this._form.elements.namedItem(t).value=e[t]}return this},e.prototype.populateText=function(e){for(var t in console.log("Modal.populateText(): ".concat(this._element.id)),e){var n=this._element.querySelector(t);if(!n)throw Error("Modal.populateText(): Element not found for '".concat(t,"'."));n.innerHTML=e[t]}return this},e.prototype.setElementClass=function(e){for(var t in console.log("Modal.addElementClass(): ".concat(this._element.id)),e){var n=this._element.querySelector(t);if(!n)throw Error("Modal.addElementClass(): Element not found for '".concat(t,"'."));e[t][1]?n.classList.add(e[t][0]):n.classList.remove(e[t][0])}return this},e.prototype.getFormData=function(){if(console.log("Modal.getFormData(): ".concat(this._element.id)),!this._form)throw Error("Modal.getFormData(): Cannot get form data for modal with no descendant form ".concat(this._element.id,"."));return new FormData(this._form)},e.prototype.open=function(e){return void 0===e&&(e=null),console.log("Modal.open(): ".concat(this._element.id)),this._onsubmit=e,this._element.classList.add("is-active"),this},e.prototype.close=function(){return console.log("Modal.close(): ".concat(this._element.id)),this._element.classList.remove("is-active"),this.reset(),this},e}();t.Modal=n},367:function(e,t,n){var r,i=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,"__esModule",{value:!0}),t.CalendarEventList=t.NoUseEvent=t.UseEvent=t.KeyEvent=t.CalendarEvent=t.CalendarDate=void 0;var s=n(601),o=function(){function e(e){if(!/^\d{4}-\d{2}-\d{2}$/.test(e))throw new Error("CalendarDate expects a date in 'YYYY-MM-DD' format.");if(this._date=new Date(e),isNaN(this._date.valueOf()))throw new Error("CalanderDate received an invalid date.")}return Object.defineProperty(e.prototype,"Date",{get:function(){return this._date},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"weekday",{get:function(){return this._date.getUTCDay()+1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"day",{get:function(){return this._date.getUTCDate()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"month",{get:function(){return this._date.getUTCMonth()+1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"year",{get:function(){return this._date.getUTCFullYear()},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this._date.toISOString().substring(0,10)},e.prototype.set_day=function(e){return this._date.setUTCDate(e),this},e.prototype.isSameDay=function(e){return this.year==e.year&&this.month==e.month&&this.day==e.day},e.prototype.isAfter=function(e){return this.year==e.year&&this.month==e.month&&this.day>e.day||this.year==e.year&&this.month>e.month||this.year>e.year},e.prototype.isBefore=function(e){return this.year==e.year&&this.month==e.month&&this.day{Object.defineProperty(t,"__esModule",{value:!0}),t.find_parent_modal=t.set_inner=void 0,t.set_inner=function(e,t){var n=document.getElementById(e);if(null==n)throw new Error("Failed to select element #".concat(e,"."));t instanceof NodeList?t.forEach((function(e){return n.appendChild(e)})):n.innerText=t},t.find_parent_modal=function(e){var t=e.closest(".modal");if(null==t)throw Error("find_parent_modal: No modal found in ancestry of ".concat(e,"."));return t}},553:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(873),i=n(400);n(748);const s=[],o={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",weekTextLong:"Week",closeHint:"Close",timeHint:"Time",eventHint:"Event",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"},a=Object.assign(Object.assign({},o),{buttonHints:{prev:"Previous $0",next:"Next $0",today:(e,t)=>"day"===t?"Today":`This ${e}`},viewHint:"$0 view",navLinkHint:"Go to $0",moreLinkHint:e=>`Show ${e} more event${1===e?"":"s"}`});function l(e){let t=e.length>0?e[0].code:"en",n=s.concat(e),r={en:a};for(let e of n)r[e.code]=e;return{map:r,defaultCode:t}}function c(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){let n=[].concat(e||[]),r=function(e,t){for(let n=0;n0;e-=1){let n=r.slice(0,e).join("-");if(t[n])return t[n]}}return null}(n,t)||a;return d(e,n,r)}(e,t):d(e.code,[e.code],e)}function d(e,t,n){let i=r.mergeProps([o,n],["buttonText"]);delete i.code;let{week:s}=i;return delete i.week,{codeArg:e,codes:t,week:s,simpleNumberFormat:new Intl.NumberFormat(e),options:i}}function u(e){return{id:r.guid(),name:e.name,premiumReleaseDate:e.premiumReleaseDate?new Date(e.premiumReleaseDate):void 0,deps:e.deps||[],reducers:e.reducers||[],isLoadingFuncs:e.isLoadingFuncs||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}class h extends r.Theme{}function f(e,t,n,r){if(t[e])return t[e];let i=function(e,t,n,r){let i=n[e],s=r[e],o=e=>i&&null!==i[e]?i[e]:s&&null!==s[e]?s[e]:null,a=o("component"),l=o("superType"),c=null;if(l){if(l===e)throw new Error("Can't have a custom view type that references itself");c=f(l,t,n,r)}return!a&&c&&(a=c.component),a?{type:e,component:a,defaults:Object.assign(Object.assign({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:Object.assign(Object.assign({},c?c.overrides:{}),s?s.rawOptions:{})}:null}(e,t,n,r);return i&&(t[e]=i),i}function p(e){return r.mapHash(e,g)}function g(e){let t="function"==typeof e?{component:e}:e,{component:n}=t;return t.content?n=m(t):!n||n.prototype instanceof r.BaseComponent||(n=m(Object.assign(Object.assign({},t),{content:n}))),{superType:t.type,component:n,rawOptions:t}}function m(e){return t=>i.createElement(r.ViewContextType.Consumer,null,(n=>i.createElement(r.ContentContainer,{elTag:"div",elClasses:r.buildViewClassNames(n.viewSpec),renderProps:Object.assign(Object.assign({},t),{nextDayThreshold:n.options.nextDayThreshold}),generatorName:void 0,customGenerator:e.content,classNameGenerator:e.classNames,didMount:e.didMount,willUnmount:e.willUnmount})))}function v(e,t,n,i){let s=p(e),o=p(t.views),a=function(e,t){let n,r={};for(n in e)f(n,r,e,t);for(n in t)f(n,r,e,t);return r}(s,o);return r.mapHash(a,(e=>function(e,t,n,i,s){let o=e.overrides.duration||e.defaults.duration||i.duration||n.duration,a=null,l="",c="",d={};if(o&&(a=function(e){let t=JSON.stringify(e),n=y[t];return void 0===n&&(n=r.createDuration(e),y[t]=n),n}(o),a)){let e=r.greatestDurationDenominator(a);l=e.unit,1===e.value&&(c=l,d=t[l]?t[l].rawOptions:{})}let u=t=>{let n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null},h=t=>{let n=t.buttonHints||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[c]?n[c]:null};return{type:e.type,component:e.component,duration:a,durationUnit:l,singleUnit:c,optionDefaults:e.defaults,optionOverrides:Object.assign(Object.assign({},d),e.overrides),buttonTextOverride:u(i)||u(n)||e.overrides.buttonText,buttonTextDefault:u(s)||e.defaults.buttonText||u(r.BASE_OPTION_DEFAULTS)||e.type,buttonTitleOverride:h(i)||h(n)||e.overrides.buttonHint,buttonTitleDefault:h(s)||e.defaults.buttonHint||h(r.BASE_OPTION_DEFAULTS)}}(e,o,t,n,i)))}h.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},h.prototype.baseIconClass="fc-icon",h.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},h.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},h.prototype.iconOverrideOption="buttonIcons",h.prototype.iconOverrideCustomButtonOption="icon",h.prototype.iconOverridePrefix="fc-icon-";let y={};function _(e){for(let t in e)if(e[t].isFetching)return!0;return!1}function b(e,t,n,r){let i={};for(let e of t)i[e.sourceId]=e;return n&&(i=E(i,n,r)),Object.assign(Object.assign({},e),i)}function E(e,t,n){return S(e,r.filterHash(e,(e=>function(e,t,n){return C(e,n)?!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.starte.fetchRange.end:!e.latestFetchId}(e,t,n))),t,!1,n)}function S(e,t,n,r,i){let s={};for(let o in e){let a=e[o];t[o]?s[o]=D(a,n,r,i):s[o]=a}return s}function D(e,t,n,i){let{options:s,calendarApi:o}=i,a=i.pluginHooks.eventSourceDefs[e.sourceDefId],l=r.guid();return a.fetch({eventSource:e,range:t,isRefetch:n,context:i},(n=>{let{rawEvents:r}=n;s.eventSourceSuccess&&(r=s.eventSourceSuccess.call(o,r,n.response)||r),e.success&&(r=e.success.call(o,r,n.response)||r),i.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:l,fetchRange:t,rawEvents:r})}),(n=>{let r=!1;s.eventSourceFailure&&(s.eventSourceFailure.call(o,n),r=!0),e.failure&&(e.failure(n),r=!0),r||console.warn(n.message,n),i.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:l,fetchRange:t,error:n})})),Object.assign(Object.assign({},e),{isFetching:!0,latestFetchId:l})}function A(e,t){return r.filterHash(e,(e=>C(e,t)))}function C(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function w(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function T(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function R(e,t){let n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function O(e,t){let n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return n=t.state,{affectedEvents:n.affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function x(e,t,n,r,i){return{header:e.headerToolbar?k(e.headerToolbar,e,t,n,r,i):null,footer:e.footerToolbar?k(e.footerToolbar,e,t,n,r,i):null}}function k(e,t,n,r,i,s){let o={},a=[],l=!1;for(let c in e){let d=M(e[c],t,n,r,i,s);o[c]=d.widgets,a.push(...d.viewsWithButtons),l=l||d.hasTitle}return{sectionWidgets:o,viewsWithButtons:a,hasTitle:l}}function M(e,t,n,i,s,o){let a="rtl"===t.direction,l=t.customButtons||{},c=n.buttonText||{},d=t.buttonText||{},u=n.buttonHints||{},h=t.buttonHints||{},f=e?e.split(" "):[],p=[],g=!1;return{widgets:f.map((e=>e.split(",").map((e=>{if("title"===e)return g=!0,{buttonName:e};let n,f,m,v,y,_;if(n=l[e])m=e=>{n.click&&n.click.call(e.target,e,e.target)},(v=i.getCustomButtonIconClass(n))||(v=i.getIconClass(e,a))||(y=n.text),_=n.hint||n.text;else if(f=s[e]){p.push(e),m=()=>{o.changeView(e)},(y=f.buttonTextOverride)||(v=i.getIconClass(e,a))||(y=f.buttonTextDefault);let n=f.buttonTextOverride||f.buttonTextDefault;_=r.formatWithOrdinals(f.buttonTitleOverride||f.buttonTitleDefault||t.viewHint,[n,e],n)}else if(o[e])if(m=()=>{o[e]()},(y=c[e])||(v=i.getIconClass(e,a))||(y=d[e]),"prevYear"===e||"nextYear"===e){let t="prevYear"===e?"prev":"next";_=r.formatWithOrdinals(u[t]||h[t],[d.year||"year","year"],d[e])}else _=t=>r.formatWithOrdinals(u[e]||h[e],[d[t]||t,t],d[e]);return{buttonName:e,buttonClick:m,buttonIcon:v,buttonText:y,buttonHint:_}})))),viewsWithButtons:p,hasTitle:g}}class I{constructor(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}get calendar(){return this.getCurrentData().calendarApi}get title(){return this.getCurrentData().viewTitle}get activeStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)}get activeEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)}get currentStart(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)}get currentEnd(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)}getOption(e){return this.getCurrentData().options[e]}}function N(e,t){let n=r.hashValuesToArray(t.getCurrentData().eventSources);if(1===n.length&&1===e.length&&Array.isArray(n[0]._raw)&&Array.isArray(e[0]))return void t.dispatch({type:"RESET_RAW_EVENTS",sourceId:n[0].sourceId,rawEvents:e[0]});let i=[];for(let t of e){let e=!1;for(let r=0;rArray.isArray(e.events)?e.events:null,fetch(e,t){t({rawEvents:e.eventSource.meta})}}]}),u({name:"func-event-source",eventSourceDefs:[{parseMeta:e=>"function"==typeof e.events?e.events:null,fetch(e,t,n){const{dateEnv:i}=e.context,s=e.eventSource.meta;r.unpromisify(s.bind(null,r.buildRangeApiWithTimeZone(e.range,i)),(e=>t({rawEvents:e})),n)}}]}),u({name:"json-event-source",eventSourceRefiners:{method:String,extraParams:r.identity,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:e=>!e.url||"json"!==e.format&&e.format?null:{url:e.url,format:"json",method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam},fetch(e,t,n){const{meta:i}=e.eventSource,s=function(e,t,n){let r,i,s,o,{dateEnv:a,options:l}=n,c={};return r=e.startParam,null==r&&(r=l.startParam),i=e.endParam,null==i&&(i=l.endParam),s=e.timeZoneParam,null==s&&(s=l.timeZoneParam),o="function"==typeof e.extraParams?e.extraParams():e.extraParams||{},Object.assign(c,o),c[r]=a.formatIso(t.start),c[i]=a.formatIso(t.end),"local"!==a.timeZone&&(c[s]=a.timeZone),c}(i,e.range,e.context);r.requestJson(i.method,i.url,s).then((([e,n])=>{t({rawEvents:e,response:n})}),n)}}]}),u({name:"simple-recurring-event",recurringTypes:[{parse(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){let n,i={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null};return e.duration&&(n=e.duration),!n&&e.startTime&&e.endTime&&(n=r.subtractDurations(e.endTime,e.startTime)),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:n,typeData:i}}return null},expand(e,t,n){let i=r.intersectRanges(t,{start:e.startRecur,end:e.endRecur});return i?function(e,t,n,i){let s=e?r.arrayToHash(e):null,o=r.startOfDay(n.start),a=n.end,l=[];for(;o_(e.eventSources)],propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",Object.assign(Object.assign({},r.buildRangeApiWithTimeZone(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){let{emitter:n}=t;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",r.buildEventApis(e,t))}}})];class H{constructor(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new r.DelayedRunner(this.drain.bind(this))}request(e,t){this.queue.push(e),this.delayedRunner.request(t)}pause(e){this.delayedRunner.pause(e)}resume(e,t){this.delayedRunner.resume(e,t)}drain(){let{queue:e}=this;for(;e.length;){let t,n=[];for(;t=e.shift();)this.runTask(t),n.push(t);this.drained(n)}}runTask(e){this.runTaskOption&&this.runTaskOption(e)}drained(e){this.drainedOption&&this.drainedOption(e)}}function j(e,t,n){let i;return i=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(i.start,i.end,r.createFormatter(t.titleFormat||function(e){let{currentRangeUnit:t}=e;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};let n=r.diffWholeDays(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}class B{constructor(e){this.computeCurrentViewData=r.memoize(this._computeCurrentViewData),this.organizeRawLocales=r.memoize(l),this.buildLocale=r.memoize(c),this.buildPluginHooks=function(){let e,t=[],n=[];return(i,s)=>(e&&r.isArraysEqual(i,t)&&r.isArraysEqual(s,n)||(e=function(e,t){let n={},r={premiumReleaseDate:void 0,reducers:[],isLoadingFuncs:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(let l of e){const e=l.name,c=n[e];void 0===c?(n[e]=l.id,i(l.deps),a=l,r={premiumReleaseDate:(t=(o=r).premiumReleaseDate,s=a.premiumReleaseDate,void 0===t?s:void 0===s?t:new Date(Math.max(t.valueOf(),s.valueOf()))),reducers:o.reducers.concat(a.reducers),isLoadingFuncs:o.isLoadingFuncs.concat(a.isLoadingFuncs),contextInit:o.contextInit.concat(a.contextInit),eventRefiners:Object.assign(Object.assign({},o.eventRefiners),a.eventRefiners),eventDefMemberAdders:o.eventDefMemberAdders.concat(a.eventDefMemberAdders),eventSourceRefiners:Object.assign(Object.assign({},o.eventSourceRefiners),a.eventSourceRefiners),isDraggableTransformers:o.isDraggableTransformers.concat(a.isDraggableTransformers),eventDragMutationMassagers:o.eventDragMutationMassagers.concat(a.eventDragMutationMassagers),eventDefMutationAppliers:o.eventDefMutationAppliers.concat(a.eventDefMutationAppliers),dateSelectionTransformers:o.dateSelectionTransformers.concat(a.dateSelectionTransformers),datePointTransforms:o.datePointTransforms.concat(a.datePointTransforms),dateSpanTransforms:o.dateSpanTransforms.concat(a.dateSpanTransforms),views:Object.assign(Object.assign({},o.views),a.views),viewPropsTransformers:o.viewPropsTransformers.concat(a.viewPropsTransformers),isPropsValid:a.isPropsValid||o.isPropsValid,externalDefTransforms:o.externalDefTransforms.concat(a.externalDefTransforms),viewContainerAppends:o.viewContainerAppends.concat(a.viewContainerAppends),eventDropTransformers:o.eventDropTransformers.concat(a.eventDropTransformers),calendarInteractions:o.calendarInteractions.concat(a.calendarInteractions),componentInteractions:o.componentInteractions.concat(a.componentInteractions),themeClasses:Object.assign(Object.assign({},o.themeClasses),a.themeClasses),eventSourceDefs:o.eventSourceDefs.concat(a.eventSourceDefs),cmdFormatter:a.cmdFormatter||o.cmdFormatter,recurringTypes:o.recurringTypes.concat(a.recurringTypes),namedTimeZonedImpl:a.namedTimeZonedImpl||o.namedTimeZonedImpl,initialView:o.initialView||a.initialView,elementDraggingImpl:o.elementDraggingImpl||a.elementDraggingImpl,optionChangeHandlers:Object.assign(Object.assign({},o.optionChangeHandlers),a.optionChangeHandlers),scrollGridImpl:a.scrollGridImpl||o.scrollGridImpl,listenerRefiners:Object.assign(Object.assign({},o.listenerRefiners),a.listenerRefiners),optionRefiners:Object.assign(Object.assign({},o.optionRefiners),a.optionRefiners),propSetHandlers:Object.assign(Object.assign({},o.propSetHandlers),a.propSetHandlers)}):c!==l.id&&console.warn(`Duplicate plugin '${e}'`)}var t,s,o,a}return e&&i(e),i(t),r}(i,s)),t=i,n=s,e)}(),this.buildDateEnv=r.memoize(L),this.buildTheme=r.memoize(U),this.parseToolbars=r.memoize(x),this.buildViewSpecs=r.memoize(v),this.buildDateProfileGenerator=r.memoizeObjArg(F),this.buildViewApi=r.memoize(z),this.buildViewUiProps=r.memoizeObjArg(G),this.buildEventUiBySource=r.memoize(V,r.isPropsEqual),this.buildEventUiBases=r.memoize(W),this.parseContextBusinessHours=r.memoizeObjArg(Y),this.buildTitle=r.memoize(j),this.emitter=new r.Emitter,this.actionRunner=new H(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.optionsForRefining=[],this.optionsForHandling=[],this.getCurrentData=()=>this.data,this.dispatch=e=>{this.actionRunner.request(e)},this.props=e,this.actionRunner.pause();let t={},n=this.computeOptionsData(e.optionOverrides,t,e.calendarApi),i=n.calendarOptions.initialView||n.pluginHooks.initialView,s=this.computeCurrentViewData(i,n,e.optionOverrides,t);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(s.options);let o=r.getInitialDate(n.calendarOptions,n.dateEnv),a=s.dateProfileGenerator.build(o);r.rangeContainsMarker(a.activeRange,o)||(o=a.currentRange.start);let d={dateEnv:n.dateEnv,options:n.calendarOptions,pluginHooks:n.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData};for(let e of n.pluginHooks.contextInit)e(d);let u=function(e,t,n){let i=t?t.activeRange:null;return b({},function(e,t){let n=r.buildEventSourceRefiners(t),i=[].concat(e.eventSources||[]),s=[];e.initialEvents&&i.unshift(e.initialEvents),e.events&&i.unshift(e.events);for(let e of i){let i=r.parseEventSource(e,t,n);i&&s.push(i)}return s}(e,n),i,n)}(n.calendarOptions,a,d),h={dynamicOptionOverrides:t,currentViewType:i,currentDate:o,dateProfile:a,businessHours:this.parseContextBusinessHours(d),eventSources:u,eventUiBases:{},eventStore:r.createEmptyEventStore(),renderableEventStore:r.createEmptyEventStore(),dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(d).selectionConfig},f=Object.assign(Object.assign({},d),h);for(let e of n.pluginHooks.reducers)Object.assign(h,e(null,null,f));q(h,d)&&this.emitter.trigger("loading",!0),this.state=h,this.updateData(),this.actionRunner.resume()}resetOptions(e,t){let{props:n}=this;void 0===t?n.optionOverrides=e:(n.optionOverrides=Object.assign(Object.assign({},n.optionOverrides||{}),e),this.optionsForRefining.push(...t)),(void 0===t||t.length)&&this.actionRunner.request({type:"NOTHING"})}_handleAction(e){let{props:t,state:n,emitter:i}=this,s=function(e,t){return"SET_OPTION"===t.type?Object.assign(Object.assign({},e),{[t.optionName]:t.rawOptionValue}):e}(n.dynamicOptionOverrides,e),o=this.computeOptionsData(t.optionOverrides,s,t.calendarApi),a=function(e,t){return"CHANGE_VIEW_TYPE"===t.type&&(e=t.viewType),e}(n.currentViewType,e),l=this.computeCurrentViewData(a,o,t.optionOverrides,s);t.calendarApi.currentDataManager=this,i.setThisContext(t.calendarApi),i.setOptions(l.options);let c={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:i,getCurrentData:this.getCurrentData},{currentDate:d,dateProfile:u}=n;this.data&&this.data.dateProfileGenerator!==l.dateProfileGenerator&&(u=l.dateProfileGenerator.build(d)),d=r.reduceCurrentDate(d,e),u=function(e,t,n,r){let i;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":return r.build(t.dateMarker);case"PREV":if(i=r.buildPrev(e,n),i.isValid)return i;break;case"NEXT":if(i=r.buildNext(e,n),i.isValid)return i}return e}(u,e,d,l.dateProfileGenerator),"PREV"!==e.type&&"NEXT"!==e.type&&r.rangeContainsMarker(u.currentRange,d)||(d=u.currentRange.start);let h=function(e,t,n,i){let s=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return b(e,t.sources,s,i);case"REMOVE_EVENT_SOURCE":return o=e,a=t.sourceId,r.filterHash(o,(e=>e.sourceId!==a));case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?E(e,s,i):e;case"FETCH_EVENT_SOURCES":return S(e,t.sourceIds?r.arrayToHash(t.sourceIds):A(e,i),s,t.isRefetch||!1,i);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){let i=e[t];return i&&n===i.latestFetchId?Object.assign(Object.assign({},e),{[t]:Object.assign(Object.assign({},i),{isFetching:!1,fetchRange:r})}):e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var o,a}(n.eventSources,e,u,c),f=r.reduceEventStore(n.eventStore,e,h,u,c),p=_(h)&&!l.options.progressiveEventRendering&&n.renderableEventStore||f,{eventUiSingleBase:g,selectionConfig:m}=this.buildViewUiProps(c),v=this.buildEventUiBySource(h),y={dynamicOptionOverrides:s,currentViewType:a,currentDate:d,dateProfile:u,eventSources:h,eventStore:f,renderableEventStore:p,selectionConfig:m,eventUiBases:this.buildEventUiBases(p.defs,g,v),businessHours:this.parseContextBusinessHours(c),dateSelection:w(n.dateSelection,e),eventSelection:T(n.eventSelection,e),eventDrag:R(n.eventDrag,e),eventResize:O(n.eventResize,e)},D=Object.assign(Object.assign({},c),y);for(let t of o.pluginHooks.reducers)Object.assign(y,t(n,e,D));let C=q(n,c),x=q(y,c);!C&&x?i.trigger("loading",!0):C&&!x&&i.trigger("loading",!1),this.state=y,t.onAction&&t.onAction(e)}updateData(){let{props:e,state:t}=this,n=this.data,i=this.computeOptionsData(e.optionOverrides,t.dynamicOptionOverrides,e.calendarApi),s=this.computeCurrentViewData(t.currentViewType,i,e.optionOverrides,t.dynamicOptionOverrides),o=this.data=Object.assign(Object.assign(Object.assign({viewTitle:this.buildTitle(t.dateProfile,s.options,i.dateEnv),calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},i),s),t),a=i.pluginHooks.optionChangeHandlers,l=n&&n.calendarOptions,c=i.calendarOptions;if(l&&l!==c){l.timeZone!==c.timeZone&&(t.eventSources=o.eventSources=function(e,t,n){let r=t?t.activeRange:null;return S(e,A(e,n),r,!0,n)}(o.eventSources,t.dateProfile,o),t.eventStore=o.eventStore=r.rezoneEventStoreDates(o.eventStore,n.dateEnv,o.dateEnv),t.renderableEventStore=o.renderableEventStore=r.rezoneEventStoreDates(o.renderableEventStore,n.dateEnv,o.dateEnv));for(let e in a)-1===this.optionsForHandling.indexOf(e)&&l[e]===c[e]||a[e](c[e],o)}this.optionsForHandling=[],e.onData&&e.onData(o)}computeOptionsData(e,t,n){if(!this.optionsForRefining.length&&e===this.stableOptionOverrides&&t===this.stableDynamicOptionOverrides)return this.stableCalendarOptionsData;let{refinedOptions:r,pluginHooks:i,localeDefaults:s,availableLocaleData:o,extra:a}=this.processRawCalendarOptions(e,t);Q(a);let l=this.buildDateEnv(r.timeZone,r.locale,r.weekNumberCalculation,r.firstDay,r.weekText,i,o,r.defaultRangeSeparator),c=this.buildViewSpecs(i.views,this.stableOptionOverrides,this.stableDynamicOptionOverrides,s),d=this.buildTheme(r,i),u=this.parseToolbars(r,this.stableOptionOverrides,d,c,n);return this.stableCalendarOptionsData={calendarOptions:r,pluginHooks:i,dateEnv:l,viewSpecs:c,theme:d,toolbarConfig:u,localeDefaults:s,availableRawLocales:o.map}}processRawCalendarOptions(e,t){let{locales:n,locale:i}=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,e,t]),s=this.organizeRawLocales(n),o=s.map,a=this.buildLocale(i||s.defaultCode,o).options,l=this.buildPluginHooks(e.plugins||[],P),c=this.currentCalendarOptionsRefiners=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.BASE_OPTION_REFINERS),r.CALENDAR_LISTENER_REFINERS),r.CALENDAR_OPTION_REFINERS),l.listenerRefiners),l.optionRefiners),d={},u=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,a,e,t]),h={},f=this.currentCalendarOptionsInput,p=this.currentCalendarOptionsRefined,g=!1;for(let e in u)-1===this.optionsForRefining.indexOf(e)&&(u[e]===f[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&e in f&&r.COMPLEX_OPTION_COMPARATORS[e](f[e],u[e]))?h[e]=p[e]:c[e]?(h[e]=c[e](u[e]),g=!0):d[e]=f[e];return g&&(this.currentCalendarOptionsInput=u,this.currentCalendarOptionsRefined=h,this.stableOptionOverrides=e,this.stableDynamicOptionOverrides=t),this.optionsForHandling.push(...this.optionsForRefining),this.optionsForRefining=[],{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:l,availableLocaleData:s,localeDefaults:a,extra:d}}_computeCurrentViewData(e,t,n,r){let i=t.viewSpecs[e];if(!i)throw new Error(`viewType "${e}" is not available. Please make sure you've loaded all neccessary plugins`);let{refinedOptions:s,extra:o}=this.processRawViewOptions(i,t.pluginHooks,t.localeDefaults,n,r);return Q(o),{viewSpec:i,options:s,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:i.optionDefaults.dateProfileGeneratorClass,duration:i.duration,durationUnit:i.durationUnit,usesMinMaxTime:i.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:s.slotMinTime,slotMaxTime:s.slotMaxTime,showNonCurrentDates:s.showNonCurrentDates,dayCount:s.dayCount,dateAlignment:s.dateAlignment,dateIncrement:s.dateIncrement,hiddenDays:s.hiddenDays,weekends:s.weekends,nowInput:s.now,validRangeInput:s.validRange,visibleRangeInput:s.visibleRange,fixedWeekCount:s.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}}processRawViewOptions(e,t,n,i,s){let o=r.mergeRawOptions([r.BASE_OPTION_DEFAULTS,e.optionDefaults,n,i,e.optionOverrides,s]),a=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},r.BASE_OPTION_REFINERS),r.CALENDAR_LISTENER_REFINERS),r.CALENDAR_OPTION_REFINERS),r.VIEW_OPTION_REFINERS),t.listenerRefiners),t.optionRefiners),l={},c=this.currentViewOptionsInput,d=this.currentViewOptionsRefined,u=!1,h={};for(let e in o)o[e]===c[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&r.COMPLEX_OPTION_COMPARATORS[e](o[e],c[e])?l[e]=d[e]:(o[e]===this.currentCalendarOptionsInput[e]||r.COMPLEX_OPTION_COMPARATORS[e]&&r.COMPLEX_OPTION_COMPARATORS[e](o[e],this.currentCalendarOptionsInput[e])?e in this.currentCalendarOptionsRefined&&(l[e]=this.currentCalendarOptionsRefined[e]):a[e]?l[e]=a[e](o[e]):h[e]=o[e],u=!0);return u&&(this.currentViewOptionsInput=o,this.currentViewOptionsRefined=l),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:h}}}function L(e,t,n,i,s,o,a,l){let d=c(t||a.defaultCode,a.map);return new r.DateEnv({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:o.namedTimeZonedImpl,locale:d,weekNumberCalculation:n,firstDay:i,weekText:s,cmdFormatter:o.cmdFormatter,defaultSeparator:l})}function U(e,t){return new(t.themeClasses[e.themeSystem]||h)(e)}function F(e){return new(e.dateProfileGeneratorClass||r.DateProfileGenerator)(e)}function z(e,t,n){return new I(e,t,n)}function V(e){return r.mapHash(e,(e=>e.ui))}function W(e,t,n){let r={"":t};for(let t in e){let i=e[t];i.sourceId&&n[i.sourceId]&&(r[t]=n[i.sourceId])}return r}function G(e){let{options:t}=e;return{eventUiSingleBase:r.createEventUi({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:r.createEventUi({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function q(e,t){for(let n of t.pluginHooks.isLoadingFuncs)if(n(e))return!0;return!1}function Y(e){return r.parseBusinessHours(e.options.businessHours,e)}function Q(e,t){for(let n in e)console.warn(`Unknown option '${n}'`+(t?` for view '${t}'`:""))}class Z extends r.BaseComponent{render(){let e=this.props.widgetGroups.map((e=>this.renderWidgetGroup(e)));return i.createElement("div",{className:"fc-toolbar-chunk"},...e)}renderWidgetGroup(e){let{props:t}=this,{theme:n}=this.context,r=[],s=!0;for(let o of e){let{buttonName:e,buttonClick:a,buttonText:l,buttonIcon:c,buttonHint:d}=o;if("title"===e)s=!1,r.push(i.createElement("h2",{className:"fc-toolbar-title",id:t.titleId},t.title));else{let s=e===t.activeButton,o=!t.isTodayEnabled&&"today"===e||!t.isPrevEnabled&&"prev"===e||!t.isNextEnabled&&"next"===e,u=[`fc-${e}-button`,n.getClass("button")];s&&u.push(n.getClass("buttonActive")),r.push(i.createElement("button",{type:"button",title:"function"==typeof d?d(t.navUnit):d,disabled:o,"aria-pressed":s,className:u.join(" "),onClick:a},l||(c?i.createElement("span",{className:c}):"")))}}if(r.length>1){let e=s&&n.getClass("buttonGroup")||"";return i.createElement("div",{className:e},...r)}return r[0]}}class X extends r.BaseComponent{render(){let e,t,{model:n,extraClassName:r}=this.props,s=!1,o=n.sectionWidgets,a=o.center;o.left?(s=!0,e=o.left):e=o.start,o.right?(s=!0,t=o.right):t=o.end;let l=[r||"","fc-toolbar",s?"fc-toolbar-ltr":""];return i.createElement("div",{className:l.join(" ")},this.renderSection("start",e||[]),this.renderSection("center",a||[]),this.renderSection("end",t||[]))}renderSection(e,t){let{props:n}=this;return i.createElement(Z,{key:e,widgetGroups:t,title:n.title,navUnit:n.navUnit,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled,titleId:n.titleId})}}class J extends r.BaseComponent{constructor(){super(...arguments),this.state={availableWidth:null},this.handleEl=e=>{this.el=e,r.setRef(this.props.elRef,e),this.updateAvailableWidth()},this.handleResize=()=>{this.updateAvailableWidth()}}render(){let{props:e,state:t}=this,{aspectRatio:n}=e,r=["fc-view-harness",n||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],s="",o="";return n?null!==t.availableWidth?s=t.availableWidth/n:o=1/n*100+"%":s=e.height||"",i.createElement("div",{"aria-labelledby":e.labeledById,ref:this.handleEl,className:r.join(" "),style:{height:s,paddingBottom:o}},e.children)}componentDidMount(){this.context.addResizeHandler(this.handleResize)}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}updateAvailableWidth(){this.el&&this.props.aspectRatio&&this.setState({availableWidth:this.el.offsetWidth})}}class $ extends r.Interaction{constructor(e){super(e),this.handleSegClick=(e,t)=>{let{component:n}=this,{context:i}=n,s=r.getElSeg(t);if(s&&n.isValidSegDownEl(e.target)){let o=r.elementClosest(e.target,".fc-event-forced-url"),a=o?o.querySelector("a[href]").href:"";i.emitter.trigger("eventClick",{el:t,event:new r.EventImpl(n.context,s.eventRange.def,s.eventRange.instance),jsEvent:e,view:i.viewApi}),a&&!e.defaultPrevented&&(window.location.href=a)}},this.destroy=r.listenBySelector(e.el,"click",".fc-event",this.handleSegClick)}}class K extends r.Interaction{constructor(e){super(e),this.handleEventElRemove=e=>{e===this.currentSegEl&&this.handleSegLeave(null,this.currentSegEl)},this.handleSegEnter=(e,t)=>{r.getElSeg(t)&&(this.currentSegEl=t,this.triggerEvent("eventMouseEnter",e,t))},this.handleSegLeave=(e,t)=>{this.currentSegEl&&(this.currentSegEl=null,this.triggerEvent("eventMouseLeave",e,t))},this.removeHoverListeners=r.listenToHoverBySelector(e.el,".fc-event",this.handleSegEnter,this.handleSegLeave)}destroy(){this.removeHoverListeners()}triggerEvent(e,t,n){let{component:i}=this,{context:s}=i,o=r.getElSeg(n);t&&!i.isValidSegDownEl(t.target)||s.emitter.trigger(e,{el:n,event:new r.EventImpl(s,o.eventRange.def,o.eventRange.instance),jsEvent:t,view:s.viewApi})}}class ee extends r.PureComponent{constructor(){super(...arguments),this.buildViewContext=r.memoize(r.buildViewContext),this.buildViewPropTransformers=r.memoize(ne),this.buildToolbarProps=r.memoize(te),this.headerRef=i.createRef(),this.footerRef=i.createRef(),this.interactionsStore={},this.state={viewLabelId:r.getUniqueDomId()},this.registerInteractiveComponent=(e,t)=>{let n=r.parseInteractionSettings(e,t),i=[$,K].concat(this.props.pluginHooks.componentInteractions).map((e=>new e(n)));this.interactionsStore[e.uid]=i,r.interactionSettingsStore[e.uid]=n},this.unregisterInteractiveComponent=e=>{let t=this.interactionsStore[e.uid];if(t){for(let e of t)e.destroy();delete this.interactionsStore[e.uid]}delete r.interactionSettingsStore[e.uid]},this.resizeRunner=new r.DelayedRunner((()=>{this.props.emitter.trigger("_resize",!0),this.props.emitter.trigger("windowResize",{view:this.props.viewApi})})),this.handleWindowResize=e=>{let{options:t}=this.props;t.handleWindowResize&&e.target===window&&this.resizeRunner.request(t.windowResizeDelay)}}render(){let e,{props:t}=this,{toolbarConfig:n,options:s}=t,o=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,r.getNow(t.options.now,t.dateEnv),t.viewTitle),a=!1,l="";t.isHeightAuto||t.forPrint?l="":null!=s.height?a=!0:null!=s.contentHeight?l=s.contentHeight:e=Math.max(s.aspectRatio,.5);let c=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent),d=n.header&&n.header.hasTitle?this.state.viewLabelId:"";return i.createElement(r.ViewContextType.Provider,{value:c},n.header&&i.createElement(X,Object.assign({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.header,titleId:d},o)),i.createElement(J,{liquid:a,height:l,aspectRatio:e,labeledById:d},this.renderView(t),this.buildAppendContent()),n.footer&&i.createElement(X,Object.assign({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footer,titleId:""},o)))}componentDidMount(){let{props:e}=this;this.calendarInteractions=e.pluginHooks.calendarInteractions.map((t=>new t(e))),window.addEventListener("resize",this.handleWindowResize);let{propSetHandlers:t}=e.pluginHooks;for(let n in t)t[n](e[n],e)}componentDidUpdate(e){let{props:t}=this,{propSetHandlers:n}=t.pluginHooks;for(let r in n)t[r]!==e[r]&&n[r](t[r],t)}componentWillUnmount(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(let e of this.calendarInteractions)e.destroy();this.props.emitter.trigger("_unmount")}buildAppendContent(){let{props:e}=this,t=e.pluginHooks.viewContainerAppends.map((t=>t(e)));return i.createElement(i.Fragment,{},...t)}renderView(e){let{pluginHooks:t}=e,{viewSpec:n}=e,r={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},s=this.buildViewPropTransformers(t.viewPropsTransformers);for(let t of s)Object.assign(r,t.transform(r,e));let o=n.component;return i.createElement(o,Object.assign({},r))}}function te(e,t,n,i,s,o){let a=n.build(s,void 0,!1),l=n.buildPrev(t,i,!1),c=n.buildNext(t,i,!1);return{title:o,activeButton:e.type,navUnit:e.singleUnit,isTodayEnabled:a.isValid&&!r.rangeContainsMarker(t.currentRange,s),isPrevEnabled:l.isValid,isNextEnabled:c.isValid}}function ne(e){return e.map((e=>new e))}class re extends r.CalendarImpl{constructor(e,t={}){super(),this.isRendering=!1,this.isRendered=!1,this.currentClassNames=[],this.customContentRenderId=0,this.handleAction=e=>{switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":this.renderRunner.tryDrain()}},this.handleData=e=>{this.currentData=e,this.renderRunner.request(e.calendarOptions.rerenderDelay)},this.handleRenderRequest=()=>{if(this.isRendering){this.isRendered=!0;let{currentData:e}=this;r.flushSync((()=>{i.render(i.createElement(r.CalendarRoot,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},((t,n,s,o)=>(this.setClassNames(t),this.setHeight(n),i.createElement(r.RenderId.Provider,{value:this.customContentRenderId},i.createElement(ee,Object.assign({isHeightAuto:s,forPrint:o},e)))))),this.el)}))}else this.isRendered&&(this.isRendered=!1,i.render(null,this.el),this.setClassNames([]),this.setHeight(""))},r.ensureElHasStyles(e),this.el=e,this.renderRunner=new r.DelayedRunner(this.handleRenderRequest),new B({optionOverrides:t,calendarApi:this,onAction:this.handleAction,onData:this.handleData})}render(){let e=this.isRendering;e?this.customContentRenderId+=1:this.isRendering=!0,this.renderRunner.request(),e&&this.updateSize()}destroy(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())}updateSize(){r.flushSync((()=>{super.updateSize()}))}batchRendering(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")}pauseRendering(){this.renderRunner.pause("pauseRendering")}resumeRendering(){this.renderRunner.resume("pauseRendering",!0)}resetOptions(e,t){this.currentDataManager.resetOptions(e,t)}setClassNames(e){if(!r.isArraysEqual(e,this.currentClassNames)){let{classList:t}=this.el;for(let e of this.currentClassNames)t.remove(e);for(let n of e)t.add(n);this.currentClassNames=e}}setHeight(e){r.applyStyleProp(this.el,"height",e)}}function ie(e){let t=c(e.locale||"en",l([]).map);return new r.DateEnv(Object.assign(Object.assign({timeZone:r.BASE_OPTION_DEFAULTS.timeZone,calendarSystem:"gregory"},e),{locale:t}))}t.JsonRequestError=r.JsonRequestError,t.Calendar=re,t.createPlugin=u,t.formatDate=function(e,t={}){let n=ie(t),i=r.createFormatter(t),s=n.createMarkerMeta(e);return s?n.format(s.marker,i,{forcedTzo:s.forcedTzo}):""},t.formatRange=function(e,t,n){let i=ie("object"==typeof n&&n?n:{}),s=r.createFormatter(n),o=i.createMarkerMeta(e),a=i.createMarkerMeta(t);return o&&a?i.formatRange(o.marker,a.marker,s,{forcedStartTzo:o.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:r.BASE_OPTION_DEFAULTS.defaultRangeSeparator}):""},t.globalLocales=s,t.globalPlugins=P,t.sliceEvents=function(e,t){return r.sliceEventStore(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},t.version="6.1.8"},873:(e,t,n)=>{var r=n(400),i=n(748);function s(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var o=s(r);const a=[],l=new Map;function c(e){a.push(e),l.forEach((t=>{u(t,e)}))}function d(e){let t=l.get(e);if(!t||!t.isConnected){if(t=e.querySelector("style[data-fullcalendar]"),!t){t=document.createElement("style"),t.setAttribute("data-fullcalendar","");const n=(void 0===h&&(h=function(){const e=document.querySelector('meta[name="csp-nonce"]');if(e&&e.hasAttribute("content"))return e.getAttribute("content");const t=document.querySelector("script[nonce]");return t&&t.nonce||""}()),h);n&&(t.nonce=n);const r=e===document?document.head:e,i=e===document?r.querySelector("script,link[rel=stylesheet],link[as=style],style"):r.firstChild;r.insertBefore(t,i)}l.set(e,t),function(e){for(const t of a)u(e,t)}(t)}}function u(e,t){const{sheet:n}=e,r=n.cssRules.length;t.split("}").forEach(((e,t)=>{(e=e.trim())&&n.insertRule(e+"}",r+t)}))}let h;function f(e){e.parentNode&&e.parentNode.removeChild(e)}function p(e,t){if(e.closest)return e.closest(t);if(!document.documentElement.contains(e))return null;do{if(g(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}function g(e,t){return(e.matches||e.matchesSelector||e.msMatchesSelector).call(e,t)}function m(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e.fc-button{flex:1 1 auto;position:relative}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-bottom-left-radius:0;border-top-left-radius:0}.fc .fc-toolbar{align-items:center;display:flex;justify-content:space-between}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-scroller-harness{direction:ltr;overflow:hidden;position:relative}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid var(--fc-border-color)}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{table-layout:fixed;width:100%}.fc .fc-scrollgrid table{border-left-style:hidden;border-right-style:hidden;border-top-style:hidden}.fc .fc-scrollgrid{border-bottom-width:0;border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section table,.fc .fc-scrollgrid-section>td{height:1px}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section>*{border-left-width:0;border-top-width:0}.fc .fc-scrollgrid-section-footer>*,.fc .fc-scrollgrid-section-header>*{border-bottom-width:0}.fc .fc-scrollgrid-section-body table,.fc .fc-scrollgrid-section-footer table{border-bottom-style:hidden}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color);position:sticky;z-index:3}.fc .fc-scrollgrid-section-header.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid-section-footer.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc-sticky{position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-view-harness-active>.fc-view{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business{bottom:0;left:0;position:absolute;right:0;top:0}.fc .fc-non-business{background:var(--fc-non-business-color)}.fc .fc-bg-event{background:var(--fc-bg-event-color);opacity:var(--fc-bg-event-opacity)}.fc .fc-bg-event .fc-event-title{font-size:var(--fc-small-font-size);font-style:italic;margin:.5em}.fc .fc-highlight{background:var(--fc-highlight-color)}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:var(--fc-neutral-bg-color)}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer{display:block}.fc-event-selected .fc-event-resizer{background:var(--fc-page-bg-color);border-color:inherit;border-radius:calc(var(--fc-event-resizer-dot-total-width)/2);border-style:solid;border-width:var(--fc-event-resizer-dot-border-width);height:var(--fc-event-resizer-dot-total-width);width:var(--fc-event-resizer-dot-total-width)}.fc-event-selected .fc-event-resizer:before{bottom:-20px;content:"";left:-20px;position:absolute;right:-20px;top:-20px}.fc-event-selected,.fc-event:focus{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before,.fc-event:focus:before{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:3}.fc-event-selected:after,.fc-event:focus:after{background:var(--fc-event-selected-overlay-color);bottom:-1px;content:"";left:-1px;position:absolute;right:-1px;top:-1px;z-index:1}.fc-h-event{background-color:var(--fc-event-bg-color);border:1px solid var(--fc-event-border-color);display:block}.fc-h-event .fc-event-main{color:var(--fc-event-text-color)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;left:0;max-width:100%;overflow:hidden;right:0;vertical-align:top}.fc-h-event.fc-event-selected:before{bottom:-10px;top:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-bottom-left-radius:0;border-left-width:0;border-top-left-radius:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-bottom-right-radius:0;border-right-width:0;border-top-right-radius:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{bottom:0;top:0;width:var(--fc-event-resizer-thickness)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:calc(var(--fc-event-resizer-thickness)*-.5)}.fc-h-event.fc-event-selected .fc-event-resizer{margin-top:calc(var(--fc-event-resizer-dot-total-width)*-.5);top:50%}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:calc(var(--fc-event-resizer-dot-total-width)*-.5)}.fc .fc-popover{box-shadow:0 2px 6px rgba(0,0,0,.15);position:absolute;z-index:9999}.fc .fc-popover-header{align-items:center;display:flex;flex-direction:row;justify-content:space-between;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;font-size:1.1em;opacity:.65}.fc-theme-standard .fc-popover{background:var(--fc-page-bg-color);border:1px solid var(--fc-border-color)}.fc-theme-standard .fc-popover-header{background:var(--fc-neutral-bg-color)}');const v=/(top|left|right|bottom|width|height)$/i;function y(e,t){for(let n in t)_(e,n,t[n])}function _(e,t,n){null==n?e.style[t]="":"number"==typeof n&&v.test(t)?e.style[t]=`${n}px`:e.style[t]=n}function b(e){var t,n;return null!==(n=null===(t=e.composedPath)||void 0===t?void 0:t.call(e)[0])&&void 0!==n?n:e.target}let E=0;function S(){return E+=1,"fc-dom-"+E}function D(e){e.preventDefault()}function A(e,t,n,r){let i=function(e,t){return n=>{let r=p(n.target,e);r&&t.call(r,n,r)}}(n,r);return e.addEventListener(t,i),()=>{e.removeEventListener(t,i)}}const C=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function w(e){return Object.assign({onClick:e},T(e))}function T(e){return{tabIndex:0,onKeyDown(t){"Enter"!==t.key&&" "!==t.key||(e(t),t.preventDefault())}}}let R=0;function O(){return R+=1,String(R)}function x(e){let t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;te.replace("$"+n,t||"")),e):n}function H(e){return e%1==0}function j(e){let t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}const B=["years","months","days","milliseconds"],L=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function U(e,t){return"string"==typeof e?function(e){let t=L.exec(e);if(t){let e=t[1]?-1:1;return{years:0,months:0,days:e*(t[2]?parseInt(t[2],10):0),milliseconds:e*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?F(e):"number"==typeof e?F({[t||"milliseconds"]:e}):null}function F(e){let t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function z(e){return V(e)/864e5}function V(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function W(e){let t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}const{hasOwnProperty:G}=Object.prototype;function q(e,t){let n={};if(t)for(let r in t)if(t[r]===Fe){let t=[];for(let i=e.length-1;i>=0;i-=1){let s=e[i][r];if("object"==typeof s&&s)t.unshift(s);else if(void 0!==s){n[r]=s;break}}t.length&&(n[r]=q(t))}for(let t=e.length-1;t>=0;t-=1){let r=e[t];for(let e in r)e in n||(n[e]=r[e])}return n}function Y(e,t){let n={};for(let r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Q(e,t){let n={};for(let r in e)n[r]=t(e[r],r);return n}function Z(e){let t=[];for(let n in e)t.push(e[n]);return t}function X(e,t){if(e===t)return!0;for(let n in e)if(G.call(e,n)&&!(n in t))return!1;for(let n in t)if(G.call(t,n)&&e[n]!==t[n])return!1;return!0}const J=/^on[A-Z]/;function $(e,t){let n=[];for(let r in e)G.call(e,r)&&(r in t||n.push(r));for(let r in t)G.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function K(e,t,n={}){if(e===t)return!0;for(let o in t)if(!(o in e&&(r=e[o],i=t[o],s=n[o],r===i||!0===s||s&&s(r,i))))return!1;var r,i,s;for(let n in e)if(!(n in t))return!1;return!0}function ee(e,t=0,n,r=1){let i=[];null==n&&(n=Object.keys(e).length);for(let s=t;s10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",be(t,!0)))),r}function _e(e){return e.toISOString().replace(/T.*$/,"")}function be(e,t=!1){let n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),s=Math.round(r%60);return t?`${n+N(i,2)}:${N(s,2)}`:`GMT${n}${i}${s?`:${N(s,2)}`:""}`}function Ee(e,t,n){let r,i;return function(...s){if(r){if(!te(r,s)){n&&n(i);let r=e.apply(this,s);t&&t(r,i)||(i=r)}}else i=e.apply(this,s);return r=s,i}}function Se(e,t,n){let r,i;return s=>{if(r){if(!X(r,s)){n&&n(i);let r=e.call(this,s);t&&t(r,i)||(i=r)}}else i=e.call(this,s);return r=s,i}}const De={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Ae={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Ce=/\s*([ap])\.?m\.?/i,we=/,/g,Te=/\s+/g,Re=/\u200e/g,Oe=/UTC|GMT/;class xe{constructor(e){let t={},n={},r=0;for(let i in e)i in De?(n[i]=e[i],r=Math.max(De[i],r)):(t[i]=e[i],i in Ae&&(r=Math.max(Ae[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Ee(ke)}format(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)}formatRange(e,t,n,r){let{standardDateProps:i,extendedSettings:s}=this,o=(a=e.marker,l=t.marker,(c=n.calendarSystem).getMarkerYear(a)!==c.getMarkerYear(l)?5:c.getMarkerMonth(a)!==c.getMarkerMonth(l)?4:c.getMarkerDay(a)!==c.getMarkerDay(l)?2:ve(a)!==ve(l)?1:0);var a,l,c;if(!o)return this.format(e,n);let d=o;!(d>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(d=1);let u=this.format(e,n),h=this.format(t,n);if(u===h)return u;let f=ke(function(e,t){let n={};for(let r in e)(!(r in Ae)||Ae[r]<=t)&&(n[r]=e[r]);return n}(i,d),s,n),p=f(e),g=f(t),m=function(e,t,n,r){let i=0;for(;ibe(e.timeZoneOffset):0===r&&t.week?e=>function(e,t,n,r,i){let s=[];return"long"===i?s.push(n):"short"!==i&&"narrow"!==i||s.push(t),"long"!==i&&"short"!==i||s.push(" "),s.push(r.simpleNumberFormat.format(e)),"rtl"===r.options.direction&&s.reverse(),s.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.weekTextLong,n.locale,t.week):function(e,t,n){e=Object.assign({},e),t=Object.assign({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit")),"long"===e.timeZoneName&&(e.timeZoneName="short"),t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";let r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){let t=Object.assign({},e);delete t.minute,r=new Intl.DateTimeFormat(n.locale.codes,t)}return s=>{let o,{marker:a}=s;return o=r&&!a.getUTCMinutes()?r:i,function(e,t,n,r,i){return e=e.replace(Re,""),"short"===n.timeZoneName&&(e=function(e,t){let n=!1;return e=e.replace(Oe,(()=>(n=!0,t))),n||(e+=` ${t}`),e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":be(t.timeZoneOffset))),r.omitCommas&&(e=e.replace(we,"").trim()),r.omitZeroMinute&&(e=e.replace(":00","")),!1===r.meridiem?e=e.replace(Ce,"").trim():"narrow"===r.meridiem?e=e.replace(Ce,((e,t)=>t.toLocaleLowerCase())):"short"===r.meridiem?e=e.replace(Ce,((e,t)=>`${t.toLocaleLowerCase()}m`)):"lowercase"===r.meridiem&&(e=e.replace(Ce,(e=>e.toLocaleLowerCase()))),e=(e=e.replace(Te," ")).trim()}(o.format(a),s,e,t,n)}}(e,t,n)}function Me(e,t){let n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function Ie(e,t,n,r){let i=Me(e,n.calendarSystem);return{date:i,start:i,end:t?Me(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}class Ne{constructor(e){this.cmdStr=e}format(e,t,n){return t.cmdFormatter(this.cmdStr,Ie(e,null,t,n))}formatRange(e,t,n,r){return n.cmdFormatter(this.cmdStr,Ie(e,t,n,r))}}class Pe{constructor(e){this.func=e}format(e,t,n){return this.func(Ie(e,null,t,n))}formatRange(e,t,n,r){return this.func(Ie(e,t,n,r))}}function He(e){return"object"==typeof e&&e?new xe(e):"string"==typeof e?new Ne(e):"function"==typeof e?new Pe(e):null}const je={navLinkDayClick:Ge,navLinkWeekClick:Ge,duration:U,bootstrapFontAwesome:Ge,buttonIcons:Ge,customButtons:Ge,defaultAllDayEventDuration:U,defaultTimedEventDuration:U,nextDayThreshold:U,scrollTime:U,scrollTimeReset:Boolean,slotMinTime:U,slotMaxTime:U,dayPopoverFormat:He,slotDuration:U,snapDuration:U,headerToolbar:Ge,footerToolbar:Ge,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:He,dayHeaderClassNames:Ge,dayHeaderContent:Ge,dayHeaderDidMount:Ge,dayHeaderWillUnmount:Ge,dayCellClassNames:Ge,dayCellContent:Ge,dayCellDidMount:Ge,dayCellWillUnmount:Ge,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:Ge,weekNumbers:Boolean,weekNumberClassNames:Ge,weekNumberContent:Ge,weekNumberDidMount:Ge,weekNumberWillUnmount:Ge,editable:Boolean,viewClassNames:Ge,viewDidMount:Ge,viewWillUnmount:Ge,nowIndicator:Boolean,nowIndicatorClassNames:Ge,nowIndicatorContent:Ge,nowIndicatorDidMount:Ge,nowIndicatorWillUnmount:Ge,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:Ge,locale:Ge,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:Ge,eventOrder:x,eventOrderStrict:Boolean,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:Ge,contentHeight:Ge,direction:String,weekNumberFormat:He,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,weekTextLong:String,progressiveEventRendering:Boolean,businessHours:Ge,initialDate:Ge,now:Ge,eventDataTransform:Ge,stickyHeaderDates:Ge,stickyFooterScrollbar:Ge,viewHeight:Ge,defaultAllDay:Boolean,eventSourceFailure:Ge,eventSourceSuccess:Ge,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:Ge,eventConstraint:Ge,eventAllow:Ge,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:Ge,eventContent:Ge,eventDidMount:Ge,eventWillUnmount:Ge,selectConstraint:Ge,selectOverlap:Ge,selectAllow:Ge,droppable:Boolean,unselectCancel:String,slotLabelFormat:Ge,slotLaneClassNames:Ge,slotLaneContent:Ge,slotLaneDidMount:Ge,slotLaneWillUnmount:Ge,slotLabelClassNames:Ge,slotLabelContent:Ge,slotLabelDidMount:Ge,slotLabelWillUnmount:Ge,dayMaxEvents:Ge,dayMaxEventRows:Ge,dayMinWidth:Number,slotLabelInterval:U,allDayText:String,allDayClassNames:Ge,allDayContent:Ge,allDayDidMount:Ge,allDayWillUnmount:Ge,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:He,rerenderDelay:Number,moreLinkText:Ge,moreLinkHint:Ge,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMaxStack:Number,eventMinHeight:Number,eventMinWidth:Number,eventShortHeight:Number,slotEventOverlap:Boolean,plugins:Ge,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:U,hiddenDays:Ge,fixedWeekCount:Boolean,validRange:Ge,visibleRange:Ge,titleFormat:Ge,eventInteractive:Boolean,noEventsText:String,viewHint:Ge,navLinkHint:Ge,closeHint:String,timeHint:String,eventHint:String,moreLinkClick:Ge,moreLinkClassNames:Ge,moreLinkContent:Ge,moreLinkDidMount:Ge,moreLinkWillUnmount:Ge,monthStartFormat:He,handleCustomRendering:Ge,customRenderingMetaMap:Ge,customRenderingReplacesEl:Boolean},Be={datesSet:Ge,eventsSet:Ge,eventAdd:Ge,eventChange:Ge,eventRemove:Ge,windowResize:Ge,eventClick:Ge,eventMouseEnter:Ge,eventMouseLeave:Ge,select:Ge,unselect:Ge,loading:Ge,_unmount:Ge,_beforeprint:Ge,_afterprint:Ge,_noEventDrop:Ge,_noEventResize:Ge,_resize:Ge,_scrollRequest:Ge},Le={buttonText:Ge,buttonHints:Ge,views:Ge,plugins:Ge,initialEvents:Ge,events:Ge,eventSources:Ge},Ue={headerToolbar:Fe,footerToolbar:Fe,buttonText:Fe,buttonHints:Fe,buttonIcons:Fe,dateIncrement:Fe,plugins:ze,events:ze,eventSources:ze,resources:ze};function Fe(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?X(e,t):e===t}function ze(e,t){return Array.isArray(e)&&Array.isArray(t)?te(e,t):e===t}const Ve={type:String,component:Ge,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:Ge,usesMinMaxTime:Boolean,classNames:Ge,content:Ge,didMount:Ge,willUnmount:Ge};function We(e,t){let n={},r={};for(let r in t)r in e&&(n[r]=t[r](e[r]));for(let n in e)n in t||(r[n]=e[n]);return{refined:n,extra:r}}function Ge(e){return e}function qe(e,t,n,r){return{instanceId:O(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function Ye(e,t,n){let{dateEnv:r,pluginHooks:i,options:s}=n,{defs:o,instances:a}=e;a=Y(a,(e=>!o[e.defId].recurringDef));for(let e in o){let n=o[e];if(n.recurringDef){let{duration:o}=n.recurringDef;o||(o=n.allDay?s.defaultAllDayEventDuration:s.defaultTimedEventDuration);let l=Qe(n,o,t,r,i.recurringTypes);for(let t of l){let n=qe(e,{start:t,end:r.add(t,o)});a[n.instanceId]=n}}}return{defs:o,instances:a}}function Qe(e,t,n,r,i){let s=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(s=s.map(ce)),s}function Ze(e,t,n,r,i,s){let o={defs:{},instances:{}},a=ut(n);for(let l of e){let e=ct(l,t,n,r,a,i,s);e&&Xe(e,o)}return o}function Xe(e,t={defs:{},instances:{}}){return t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Je(e,t){let n=e.instances[t];if(n){let t=e.defs[n.defId],r=Ke(e,(e=>{return n=t,r=e,Boolean(n.groupId&&n.groupId===r.groupId);var n,r}));return r.defs[t.defId]=t,r.instances[n.instanceId]=n,r}return{defs:{},instances:{}}}function $e(e,t){return{defs:Object.assign(Object.assign({},e.defs),t.defs),instances:Object.assign(Object.assign({},e.instances),t.instances)}}function Ke(e,t){let n=Y(e.defs,t),r=Y(e.instances,(e=>n[e.defId]));return{defs:n,instances:r}}function et(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}const tt={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:Ge,overlap:Ge,allow:Ge,className:et,classNames:et,color:String,backgroundColor:String,borderColor:String,textColor:String},nt={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function rt(e,t){let n=function(e,t){return Array.isArray(e)?Ze(e,null,t,!0):"object"==typeof e&&e?Ze([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function it(e){return e.reduce(st,nt)}function st(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}const ot={id:String,groupId:String,title:String,url:String,interactive:Boolean},at={start:Ge,end:Ge,date:Ge,allDay:Boolean},lt=Object.assign(Object.assign(Object.assign({},ot),at),{extendedProps:Ge});function ct(e,t,n,r,i=ut(n),s,o){let{refined:a,extra:l}=dt(e,n,i),c=function(e,t){let n=null;return e&&(n=e.defaultAllDay),null==n&&(n=t.options.defaultAllDay),n}(t,n),d=function(e,t,n,r){for(let i=0;i=V(t)&&(r=re(r,1))}return e.start&&(n=ce(e.start),r&&r<=n&&(r=re(n,1))),{start:n,end:r}}function mt(e,t,n,r){return"year"===r?U(n.diffWholeYears(e,t),"year"):"month"===r?U(n.diffWholeMonths(e,t),"month"):oe(e,t)}function vt(e,t){let n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left
",e.querySelector("table").style.height="100px",e.querySelector("div").style.height="100%",document.body.appendChild(e);let t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),yt}const bt={defs:{},instances:{}};function Et(e,t,n){let r=[];e&&r.push(e),t&&r.push(t);let i={"":it(r)};return n&&Object.assign(i,n),i}function St(e,t){let n,r,i=[],{start:s}=t;for(e.sort(Dt),n=0;ns&&i.push({start:s,end:r.start}),r.end>s&&(s=r.end);return st.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Rt(e,t){return(null===e.start||t>=e.start)&&(null===e.end||tn:!!t&&e>=t.end)}}function xt(e,t){let n=["fc-day",`fc-day-${ne[e.dow]}`];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}const kt=He({year:"numeric",month:"long",day:"numeric"}),Mt=He({week:"long"});function It(e,t,n="day",r=!0){const{dateEnv:i,options:s,calendarApi:o}=e;let a=i.format(t,"week"===n?Mt:kt);if(s.navLinks){let e=i.toDate(t);const l=e=>{let r="day"===n?s.navLinkDayClick:"week"===n?s.navLinkWeekClick:null;"function"==typeof r?r.call(o,i.toDate(t),e):("string"==typeof r&&(n=r),o.zoomTo(t,n))};return Object.assign({title:P(s.navLinkHint,[a,e],a),"data-navlink":""},r?w(l):{onClick:l})}return{"aria-label":a}}let Nt,Pt=null;function Ht(){return null===Pt&&(Pt=function(){let e=document.createElement("div");y(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="
",document.body.appendChild(e);let t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return f(e),t}()),Pt}function jt(){return Nt||(Nt=function(){let e=document.createElement("div");e.style.overflow="scroll",e.style.position="absolute",e.style.top="-9999px",e.style.left="-9999px",document.body.appendChild(e);let t=Bt(e);return document.body.removeChild(e),t}()),Nt}function Bt(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Lt(e,t=!1){let n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,s=parseInt(n.borderTopWidth,10)||0,o=parseInt(n.borderBottomWidth,10)||0,a=Bt(e),l=a.y-r-i,c={borderLeft:r,borderRight:i,borderTop:s,borderBottom:o,scrollbarBottom:a.x-s-o,scrollbarLeft:0,scrollbarRight:0};return Ht()&&"rtl"===n.direction?c.scrollbarLeft=l:c.scrollbarRight=l,t&&(c.paddingLeft=parseInt(n.paddingLeft,10)||0,c.paddingRight=parseInt(n.paddingRight,10)||0,c.paddingTop=parseInt(n.paddingTop,10)||0,c.paddingBottom=parseInt(n.paddingBottom,10)||0),c}function Ut(e){let t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function Ft(e){let t=[];for(;e instanceof HTMLElement;){let n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}class zt{constructor(){this.handlers={},this.thisContext=null}setThisContext(e){this.thisContext=e}setOptions(e){this.options=e}on(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)}off(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((e=>e!==n))):delete e[t]}(this.handlers,e,t)}trigger(e,...t){let n=this.handlers[e]||[],r=this.options&&this.options[e],i=[].concat(r||[],n);for(let e of i)e.apply(this.thisContext,t)}hasHandlers(e){return Boolean(this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e])}}function Vt(e,t){const n=e.length;if(n!==t.length)return!1;for(let r=0;r0}canScrollHorizontally(){return this.getMaxScrollLeft()>0}canScrollUp(){return this.getScrollTop()>0}canScrollDown(){return this.getScrollTop()0}canScrollRight(){return this.getScrollLeft(){this.props.value!==t.value&&e.forEach((e=>{e.context=t.value,e.forceUpdate()}))},this.sub=t=>{e.push(t);let n=t.componentWillUnmount;t.componentWillUnmount=()=>{e.splice(e.indexOf(t),1),n&&n.call(t)}}}return t},t}class Qt{constructor(e,t,n,r){this.execFunc=e,this.emitter=t,this.scrollTime=n,this.scrollTimeReset=r,this.handleScrollRequest=e=>{this.queuedRequest=Object.assign({},this.queuedRequest||{},e),this.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}detach(){this.emitter.off("_scrollRequest",this.handleScrollRequest)}update(e){e&&this.scrollTimeReset?this.fireInitialScroll():this.drain()}fireInitialScroll(){this.handleScrollRequest({time:this.scrollTime})}drain(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)}}const Zt=Yt({});class Xt extends r.Component{shouldComponentUpdate(e,t){return this.debug&&console.log($(e,this.props),$(t,this.state)),!K(this.props,e,this.propEquality)||!K(this.state,t,this.stateEquality)}safeSetState(e){K(this.state,Object.assign(Object.assign({},this.state),e),this.stateEquality)||this.setState(e)}}Xt.addPropsEquality=function(e){let t=Object.create(this.prototype.propEquality);Object.assign(t,e),this.prototype.propEquality=t},Xt.addStateEquality=function(e){let t=Object.create(this.prototype.stateEquality);Object.assign(t,e),this.prototype.stateEquality=t},Xt.contextType=Zt,Xt.prototype.propEquality={},Xt.prototype.stateEquality={};class Jt extends Xt{}function $t(e,t){"function"==typeof e?e(t):e&&(e.current=t)}Jt.contextType=Zt;class Kt extends Jt{constructor(){super(...arguments),this.uid=O()}prepareHits(){}queryHit(e,t,n,r){return null}isValidSegDownEl(e){return!this.props.eventDrag&&!this.props.eventResize&&!p(e,".fc-event-mirror")}isValidDateDownEl(e){return!(p(e,".fc-event:not(.fc-bg-event)")||p(e,".fc-more-link")||p(e,"a[data-navlink]")||p(e,".fc-popover"))}}function en(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}function tn(e,t,n){n.emitter.trigger("select",Object.assign(Object.assign({},nn(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function nn(e,t){let n={};for(let r of t.pluginHooks.dateSpanTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,i=t.dateEnv,Object.assign(Object.assign({},An(r.range,i,r.allDay)),{allDay:r.allDay}))),n}function rn(e,t,n){let{dateEnv:r,options:i}=n,s=t;return e?(s=ce(s),s=r.add(s,i.defaultAllDayEventDuration)):s=r.add(s,i.defaultTimedEventDuration),s}function sn(e,t,n,r){let i=pn(e.defs,t),s={defs:{},instances:{}};for(let t in e.defs){let o=e.defs[t];s.defs[t]=on(o,i[t],n,r)}for(let t in e.instances){let o=e.instances[t],a=s.defs[o.defId];s.instances[t]=an(o,a,i[o.defId],n,r)}return s}function on(e,t,n,r){let i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);let s=Object.assign(Object.assign(Object.assign({},e),i),{ui:Object.assign(Object.assign({},e.ui),i.ui)});n.extendedProps&&(s.extendedProps=Object.assign(Object.assign({},s.extendedProps),n.extendedProps));for(let e of r.pluginHooks.eventDefMutationAppliers)e(s,n,r);return!s.hasEnd&&r.options.forceEventDuration&&(s.hasEnd=!0),s}function an(e,t,n,r,i){let{dateEnv:s}=i,o=r.standardProps&&!0===r.standardProps.allDay,a=r.standardProps&&!1===r.standardProps.hasEnd,l=Object.assign({},e);return o&&(l.range=pt(l.range)),r.datesDelta&&n.startEditable&&(l.range={start:s.add(l.range.start,r.datesDelta),end:s.add(l.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(l.range={start:s.add(l.range.start,r.startDelta),end:l.range.end}),r.endDelta&&n.durationEditable&&(l.range={start:l.range.start,end:s.add(l.range.end,r.endDelta)}),a&&(l.range={start:l.range.start,end:rn(t.allDay,l.range.start,i)}),t.allDay&&(l.range={start:ce(l.range.start),end:ce(l.range.end)}),l.range.endgn(e,t)))}function gn(e,t){let n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),it(n)}function mn(e){let{eventRange:t}=e,n=t.def,r=t.instance?t.instance.range:t.range,i=r.start?r.start.valueOf():0,s=r.end?r.end.valueOf():0;return Object.assign(Object.assign(Object.assign({},n.extendedProps),n),{id:n.publicId,start:i,end:s,duration:s-i,allDay:Number(n.allDay),_seg:e})}function vn(e,t){let{pluginHooks:n}=t,r=n.isDraggableTransformers,{def:i,ui:s}=e.eventRange,o=s.startEditable;for(let e of r)o=e(o,i,s,t);return o}function yn(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function _n(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function bn(e,t,n,r,i,s,o){let{dateEnv:a,options:l}=n,{displayEventTime:c,displayEventEnd:d}=l,u=e.eventRange.def,h=e.eventRange.instance;null==c&&(c=!1!==r),null==d&&(d=!1!==i);let f=h.range.start,p=h.range.end,g=s||e.start||e.eventRange.range.start,m=o||e.end||e.eventRange.range.end,v=ce(f).valueOf()===ce(g).valueOf(),y=ce(ie(p,-1)).valueOf()===ce(ie(m,-1)).valueOf();return c&&!u.allDay&&(v||y)?(g=v?f:g,m=y?p:m,d&&u.hasEnd?a.formatRange(g,m,t,{forcedStartTzo:s?null:h.forcedStartTzo,forcedEndTzo:o?null:h.forcedEndTzo}):a.format(g,t,{forcedTzo:s?null:h.forcedStartTzo})):""}function En(e){let t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function Sn(e,t){let{def:n,instance:r}=e.eventRange,{url:i}=n;if(i)return{href:i};let{emitter:s,options:o}=t,{eventInteractive:a}=o;return null==a&&(a=n.interactive,null==a&&(a=Boolean(s.hasHandlers("eventClick")))),a?T((e=>{s.trigger("eventClick",{el:e.target,event:new cn(t,n,r),jsEvent:e,view:t.viewApi})})):{}}const Dn={start:Ge,end:Ge,allDay:Boolean};function An(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}let Cn={};var wn;wn=class{getMarkerYear(e){return e.getUTCFullYear()}getMarkerMonth(e){return e.getUTCMonth()}getMarkerDay(e){return e.getUTCDate()}arrayToMarker(e){return ge(e)}markerToArray(e){return pe(e)}},Cn.gregory=wn;const Tn=/^\s*(\d{4})(-?(\d{2})(-?(\d{2})([T ](\d{2}):?(\d{2})(:?(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Rn(e){let t=Tn.exec(e);if(t){let e=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number(`0.${t[12]}`):0));if(me(e)){let n=null;return t[13]&&(n=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:e,isTimeUnspecified:!t[6],timeZoneOffset:n}}}return null}function On(e){return e.span.end}function xn(e){return e.index+":"+e.span.start}function kn(e,t){let n=Math.max(e.start,t.start),r=Math.min(e.end,t.end);return nn(e[i-1]))return[i,0];for(;ro))return[s,1];r=s+1}}return[r,0]}const Nn={startTime:U,duration:U,create:Boolean,sourceId:String};function Pn(e,t){return He(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}const Hn="fc-col-header-cell";function jn(e){return e.text}class Bn extends Jt{constructor(){super(...arguments),this.id=O(),this.queuedDomNodes=[],this.currentDomNodes=[],this.handleEl=e=>{this.props.elRef&&$t(this.props.elRef,e)}}render(){const{props:e,context:t}=this,{options:n}=t,{customGenerator:i,defaultGenerator:s,renderProps:o}=e,a=Un(e);let l,c,d=!1,u=[];if(null!=i){const e="function"==typeof i?i(o,r.createElement):i;if(!0===e)d=!0;else{const t=e&&"object"==typeof e;t&&"html"in e?a.dangerouslySetInnerHTML={__html:e.html}:t&&"domNodes"in e?u=Array.prototype.slice.call(e.domNodes):t||"function"==typeof e?c=e:l=e}}else d=!Ln(e.generatorName,n);return d&&s&&(l=s(o)),this.queuedDomNodes=u,this.currentGeneratorMeta=c,r.createElement(e.elTag,a,l)}componentDidMount(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentDidUpdate(){this.applyQueueudDomNodes(),this.triggerCustomRendering(!0)}componentWillUnmount(){this.triggerCustomRendering(!1)}triggerCustomRendering(e){var t;const{props:n,context:r}=this,{handleCustomRendering:i,customRenderingMetaMap:s}=r.options;if(i){const r=null!==(t=this.currentGeneratorMeta)&&void 0!==t?t:null==s?void 0:s[n.generatorName];r&&i(Object.assign(Object.assign({id:this.id,isActive:e,containerEl:this.base,reportNewContainerEl:this.handleEl,generatorMeta:r},n),{elClasses:(n.elClasses||[]).filter(Fn)}))}}applyQueueudDomNodes(){const{queuedDomNodes:e,currentDomNodes:t}=this,n=this.base;if(!te(e,t)){t.forEach(f);for(let t of e)n.appendChild(t);this.currentDomNodes=e}}}function Ln(e,t){var n;return Boolean(t.handleCustomRendering&&e&&(null===(n=t.customRenderingMetaMap)||void 0===n?void 0:n[e]))}function Un(e,t){const n=Object.assign(Object.assign({},e.elAttrs),{ref:e.elRef});return(e.elClasses||t)&&(n.className=(e.elClasses||[]).concat(t||[]).concat(n.className||[]).filter(Boolean).join(" ")),e.elStyle&&(n.style=e.elStyle),n}function Fn(e){return Boolean(e)}Bn.addPropsEquality({elClasses:te,elStyle:X,elAttrs:function(e,t){const n=$(e,t);for(let e of n)if(!J.test(e))return!1;return!0},renderProps:X});const zn=Yt(0);class Vn extends r.Component{constructor(){super(...arguments),this.InnerContent=Wn.bind(void 0,this),this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&$t(this.props.elRef,e)}}render(){const{props:e}=this,t=function(e,t){const n="function"==typeof e?e(t):e||[];return"string"==typeof n?[n]:n}(e.classNameGenerator,e.renderProps);if(e.children){const n=Un(e,t),i=e.children(this.InnerContent,e.renderProps,n);return e.elTag?r.createElement(e.elTag,n,i):i}return r.createElement(Bn,Object.assign(Object.assign({},e),{elRef:this.handleRootEl,elTag:e.elTag||"div",elClasses:(e.elClasses||[]).concat(t),renderId:this.context}))}componentDidMount(){var e,t;null===(t=(e=this.props).didMount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}componentWillUnmount(){var e,t;null===(t=(e=this.props).willUnmount)||void 0===t||t.call(e,Object.assign(Object.assign({},this.props.renderProps),{el:this.rootEl||this.base}))}}function Wn(e,t){const n=e.props;return r.createElement(Bn,Object.assign({renderProps:n.renderProps,generatorName:n.generatorName,customGenerator:n.customGenerator,defaultGenerator:n.defaultGenerator,renderId:e.context},t))}Vn.contextType=zn;class Gn extends Jt{render(){let{dateEnv:e,options:t,theme:n,viewApi:i}=this.context,{props:s}=this,{date:o,dateProfile:a}=s,l=Ot(o,s.todayRange,null,a),c=[Hn].concat(xt(l,n)),d=e.format(o,s.dayHeaderFormat),u=!l.isDisabled&&s.colCnt>1?It(this.context,o):{},h=Object.assign(Object.assign(Object.assign({date:e.toDate(o),view:i},s.extraRenderProps),{text:d}),l);return r.createElement(Vn,{elTag:"th",elClasses:c,elAttrs:Object.assign({role:"columnheader",colSpan:s.colSpan,"data-date":l.isDisabled?void 0:_e(o)},s.extraDataAttrs),renderProps:h,generatorName:"dayHeaderContent",customGenerator:t.dayHeaderContent,defaultGenerator:jn,classNameGenerator:t.dayHeaderClassNames,didMount:t.dayHeaderDidMount,willUnmount:t.dayHeaderWillUnmount},(e=>r.createElement("div",{className:"fc-scrollgrid-sync-inner"},!l.isDisabled&&r.createElement(e,{elTag:"a",elAttrs:u,elClasses:["fc-col-header-cell-cushion",s.isSticky&&"fc-sticky"]}))))}}const qn=He({weekday:"long"});class Yn extends Jt{render(){let{props:e}=this,{dateEnv:t,theme:n,viewApi:i,options:s}=this.context,o=re(new Date(2592e5),e.dow),a={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},l=t.format(o,e.dayHeaderFormat),c=Object.assign(Object.assign(Object.assign(Object.assign({date:o},a),{view:i}),e.extraRenderProps),{text:l});return r.createElement(Vn,{elTag:"th",elClasses:[Hn,...xt(a,n),...e.extraClassNames||[]],elAttrs:Object.assign({role:"columnheader",colSpan:e.colSpan},e.extraDataAttrs),renderProps:c,generatorName:"dayHeaderContent",customGenerator:s.dayHeaderContent,defaultGenerator:jn,classNameGenerator:s.dayHeaderClassNames,didMount:s.dayHeaderDidMount,willUnmount:s.dayHeaderWillUnmount},(n=>r.createElement("div",{className:"fc-scrollgrid-sync-inner"},r.createElement(n,{elTag:"a",elClasses:["fc-col-header-cell-cushion",e.isSticky&&"fc-sticky"],elAttrs:{"aria-label":t.format(o,qn)}}))))}}class Qn extends r.Component{constructor(e,t){super(e,t),this.initialNowDate=en(t.options.now,t.dateEnv),this.initialNowQueriedMs=(new Date).valueOf(),this.state=this.computeTiming().currentState}render(){let{props:e,state:t}=this;return e.children(t.nowDate,t.todayRange)}componentDidMount(){this.setTimeout()}componentDidUpdate(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())}componentWillUnmount(){this.clearTimeout()}computeTiming(){let{props:e,context:t}=this,n=ie(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),i=t.dateEnv.add(r,U(1,e.unit)),s=i.valueOf()-n.valueOf();return s=Math.min(864e5,s),{currentState:{nowDate:r,todayRange:Zn(r)},nextState:{nowDate:i,todayRange:Zn(i)},waitMs:s}}setTimeout(){let{nextState:e,waitMs:t}=this.computeTiming();this.timeoutId=setTimeout((()=>{this.setState(e,(()=>{this.setTimeout()}))}),t)}clearTimeout(){this.timeoutId&&clearTimeout(this.timeoutId)}}function Zn(e){let t=ce(e);return{start:t,end:re(t,1)}}function Xn(e,t,n){return e||Pn(t,n)}function Jn(e,t){let n=e.activeRange;return t?n:{start:ie(n.start,e.slotMinTime.milliseconds),end:ie(n.end,e.slotMaxTime.milliseconds-864e5)}}function $n(e,t,n){let r=n.options.eventDataTransform,i=t?t.eventDataTransform:null;return i&&(e=Kn(e,i)),r&&(e=Kn(e,r)),e}function Kn(e,t){let n;if(t){n=[];for(let r of e){let e=t(r);e?n.push(e):null==e&&n.push(r)}}else n=e;return n}function er(e,t){return Ke(e,(e=>e.sourceId!==t))}function tr(e,t){let n=t.getCurrentData(),r=Object.assign({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||nr)(r,t)}function nr(e,t,n={},r){return!(e.eventDrag&&!function(e,t,n,r){let i=t.getCurrentData(),s=e.eventDrag,o=s.mutatedEvents,a=o.defs,l=o.instances,c=pn(a,s.isEvent?e.eventUiBases:{"":i.selectionConfig});r&&(c=Q(c,r));let d=(p=e.eventStore,g=s.affectedEvents.instances,{defs:p.defs,instances:Y(p.instances,(e=>!g[e.instanceId]))}),u=d.defs,h=d.instances,f=pn(u,e.eventUiBases);var p,g;for(let r in l){let o=l[r],p=o.range,g=c[o.defId],m=a[o.defId];if(!rr(g.constraints,p,d,e.businessHours,t))return!1;let{eventOverlap:v}=t.options,y="function"==typeof v?v:null;for(let e in h){let n=h[e];if(wt(p,n.range)){if(!1===f[n.defId].overlap&&s.isEvent)return!1;if(!1===g.overlap)return!1;if(y&&!y(new cn(t,u[n.defId],n),new cn(t,m,o)))return!1}}let _=i.eventStore;for(let e of g.allows){let i,s=Object.assign(Object.assign({},n),{range:o.range,allDay:m.allDay}),a=_.defs[m.defId],l=_.instances[r];if(i=a?new cn(t,a,l):new cn(t,m),!e(nn(s,t),i))return!1}}return!0}(e,t,n,r)||e.dateSelection&&!function(e,t,n,r){let i=e.eventStore,s=i.defs,o=i.instances,a=e.dateSelection,l=a.range,{selectionConfig:c}=t.getCurrentData();if(r&&(c=r(c)),!rr(c.constraints,l,i,e.businessHours,t))return!1;let{selectOverlap:d}=t.options,u="function"==typeof d?d:null;for(let e in o){let n=o[e];if(wt(l,n.range)){if(!1===c.overlap)return!1;if(u&&!u(new cn(t,s[n.defId],n),null))return!1}}for(let e of c.allows)if(!e(nn(Object.assign(Object.assign({},n),a),t),null))return!1;return!0}(e,t,n,r))}function rr(e,t,n,r,i){for(let s of e)if(!or(ir(s,t,n,r,i),t))return!1;return!0}function ir(e,t,n,r,i){return"businessHours"===e?sr(Ye(r,t,i)):"string"==typeof e?sr(Ke(n,(t=>t.groupId===e))):"object"==typeof e&&e?sr(Ye(e,t,i)):[]}function sr(e){let{instances:t}=e,n=[];for(let e in t)n.push(t[e].range);return n}function or(e,t){for(let n of e)if(Tt(n,t))return!0;return!1}Qn.contextType=Zt;class ar extends Error{constructor(e,t){super(e),this.response=t}}const lr=/^(visible|hidden)$/;class cr extends Jt{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,$t(this.props.elRef,e)}}render(){let{props:e}=this,{liquid:t,liquidIsAbsolute:n}=e,i=t&&n,s=["fc-scroller"];return t&&(n?s.push("fc-scroller-liquid-absolute"):s.push("fc-scroller-liquid")),r.createElement("div",{ref:this.handleEl,className:s.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:i&&-(e.overcomeLeft||0)||"",right:i&&-(e.overcomeRight||0)||"",bottom:i&&-(e.overcomeBottom||0)||"",marginLeft:!i&&-(e.overcomeLeft||0)||"",marginRight:!i&&-(e.overcomeRight||0)||"",marginBottom:!i&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)}needsXScrolling(){if(lr.test(this.props.overflowX))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0;return!1}needsYScrolling(){if(lr.test(this.props.overflowY))return!1;let{el:e}=this,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),{children:n}=e;for(let e=0;et)return!0;return!1}getXScrollbarWidth(){return lr.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight}getYScrollbarWidth(){return lr.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth}}class dr{constructor(e){this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=(e,t)=>{let{depths:n,currentMap:r}=this,i=!1,s=!1;null!==e?(i=t in r,r[t]=e,n[t]=(n[t]||0)+1,s=!0):(n[t]-=1,n[t]||(delete r[t],delete this.callbackMap[t],i=!0)),this.masterCallback&&(i&&this.masterCallback(null,String(t)),s&&this.masterCallback(e,String(t)))}}createRef(e){let t=this.callbackMap[e];return t||(t=this.callbackMap[e]=t=>{this.handleValue(t,String(e))}),t}collect(e,t,n){return ee(this.currentMap,e,t,n)}getAll(){return Z(this.currentMap)}}function ur(e){let t=m(e,".fc-scrollgrid-shrink"),n=0;for(let e of t)n=Math.max(n,j(e));return Math.ceil(n)}function hr(e,t){return e.liquid&&t.liquid}function fr(e,t){return null!=t.maxHeight||hr(e,t)}function pr(e,t,n,i){let{expandRows:s}=n;return"function"==typeof t.content?t.content(n):r.createElement("table",{role:"presentation",className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:s?n.clientHeight:""}},n.tableColGroupNode,r.createElement(i?"thead":"tbody",{role:"presentation"},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function gr(e,t){return te(e,t,X)}function mr(e,t){let n=[];for(let i of e){let e=i.span||1;for(let s=0;se),gr),this.renderMicroColGroup=Ee(mr),this.scrollerRefs=new dr,this.scrollerElRefs=new dr(this._handleScrollerEl.bind(this)),this.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},this.handleSizing=()=>{this.safeSetState(Object.assign({shrinkWidth:this.computeShrinkWidth()},this.computeScrollerDims()))}}render(){let{props:e,state:t,context:n}=this,i=e.sections||[],s=this.processCols(e.cols),o=this.renderMicroColGroup(s,t.shrinkWidth),a=_r(e.liquid,n);e.collapsibleWidth&&a.push("fc-scrollgrid-collapsible");let l,c=i.length,d=0,u=[],h=[],f=[];for(;d{}},i);return r.createElement(i?"th":"td",{ref:n.elRef,role:"presentation"},r.createElement("div",{className:"fc-scroller-harness"+(d?" fc-scroller-harness-liquid":"")},r.createElement(cr,{ref:this.scrollerRefs.createRef(h),elRef:this.scrollerElRefs.createRef(h),overflowY:u,overflowX:s.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:d,liquidIsAbsolute:!0},f)))}_handleScrollerEl(e,t){let n=function(e,t){for(let n of e)if(n.key===t)return n;return null}(this.props.sections,t);n&&$t(n.chunk.scrollerElRef,e)}componentDidMount(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)}componentDidUpdate(){this.handleSizing()}componentWillUnmount(){this.context.removeResizeHandler(this.handleSizing)}computeShrinkWidth(){return yr(this.props.cols)?ur(this.scrollerElRefs.getAll()):0}computeScrollerDims(){let e=jt(),{scrollerRefs:t,scrollerElRefs:n}=this,r=!1,i={},s={};for(let e in t.currentMap){let n=t.currentMap[e];if(n&&n.needsYScrolling()){r=!0;break}}for(let t of this.props.sections){let o=t.key,a=n.currentMap[o];if(a){let t=a.parentNode;i[o]=Math.floor(t.getBoundingClientRect().width-(r?e.y:0)),s[o]=Math.floor(t.getBoundingClientRect().height)}}return{forceYScrollbars:r,scrollerClientWidths:i,scrollerClientHeights:s}}}Er.addStateEquality({scrollerClientWidths:X,scrollerClientHeights:X});class Sr extends Jt{constructor(){super(...arguments),this.handleEl=e=>{this.el=e,e&&fn(e,this.props.seg)}}render(){const{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{eventRange:s}=i,{ui:o}=s,a={event:new cn(t,s.def,s.instance),view:t.viewApi,timeText:e.timeText,textColor:o.textColor,backgroundColor:o.backgroundColor,borderColor:o.borderColor,isDraggable:!e.disableDragging&&vn(i,t),isStartResizable:!e.disableResizing&&yn(i,t),isEndResizable:!e.disableResizing&&_n(i),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(i.isStart),isEnd:Boolean(i.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)};return r.createElement(Vn,Object.assign({},e,{elRef:this.handleEl,elClasses:[...En(a),...i.eventRange.ui.classNames,...e.elClasses||[]],renderProps:a,generatorName:"eventContent",customGenerator:n.eventContent,defaultGenerator:e.defaultGenerator,classNameGenerator:n.eventClassNames,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount}))}componentDidUpdate(e){this.el&&this.props.seg!==e.seg&&fn(this.el,this.props.seg)}}function Dr(e){return r.createElement("div",{className:"fc-event-main-frame"},e.timeText&&r.createElement("div",{className:"fc-event-time"},e.timeText),r.createElement("div",{className:"fc-event-title-container"},r.createElement("div",{className:"fc-event-title fc-sticky"},e.event.title||r.createElement(r.Fragment,null," "))))}const Ar=He({day:"numeric"});class Cr extends Jt{constructor(){super(...arguments),this.refineRenderProps=Se(Tr)}render(){let{props:e,context:t}=this,{options:n}=t,i=this.refineRenderProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,isMonthStart:e.isMonthStart||!1,showDayNumber:e.showDayNumber,extraRenderProps:e.extraRenderProps,viewApi:t.viewApi,dateEnv:t.dateEnv,monthStartFormat:n.monthStartFormat});return r.createElement(Vn,Object.assign({},e,{elClasses:[...xt(i,t.theme),...e.elClasses||[]],elAttrs:Object.assign(Object.assign({},e.elAttrs),i.isDisabled?{}:{"data-date":_e(e.date)}),renderProps:i,generatorName:"dayCellContent",customGenerator:n.dayCellContent,defaultGenerator:e.defaultGenerator,classNameGenerator:i.isDisabled?void 0:n.dayCellClassNames,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount}))}}function wr(e){return Boolean(e.dayCellContent||Ln("dayCellContent",e))}function Tr(e){let{date:t,dateEnv:n,dateProfile:r,isMonthStart:i}=e,s=Ot(t,e.todayRange,null,r),o=e.showDayNumber?n.format(t,i?e.monthStartFormat:Ar):"";return Object.assign(Object.assign(Object.assign({date:n.toDate(t),view:e.viewApi},s),{isMonthStart:i,dayNumberText:o}),e.extraRenderProps)}function Rr(e){let{title:t}=e.event;return t&&r.createElement("div",{className:"fc-event-title"},e.event.title)}function Or(e){return e.text}class xr extends Jt{constructor(){super(...arguments),this.state={titleId:S()},this.handleRootEl=e=>{this.rootEl=e,this.props.elRef&&$t(this.props.elRef,e)},this.handleDocumentMouseDown=e=>{const t=b(e);this.rootEl.contains(t)||this.handleCloseClick()},this.handleDocumentKeyDown=e=>{"Escape"===e.key&&this.handleCloseClick()},this.handleCloseClick=()=>{let{onClose:e}=this.props;e&&e()}}render(){let{theme:e,options:t}=this.context,{props:n,state:s}=this,o=["fc-popover",e.getClass("popover")].concat(n.extraClassNames||[]);return i.createPortal(r.createElement("div",Object.assign({},n.extraAttrs,{id:n.id,className:o.join(" "),"aria-labelledby":s.titleId,ref:this.handleRootEl}),r.createElement("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},r.createElement("span",{className:"fc-popover-title",id:s.titleId},n.title),r.createElement("span",{className:"fc-popover-close "+e.getIconClass("close"),title:t.closeHint,onClick:this.handleCloseClick})),r.createElement("div",{className:"fc-popover-body "+e.getClass("popoverContent")},n.children)),n.parentEl)}componentDidMount(){document.addEventListener("mousedown",this.handleDocumentMouseDown),document.addEventListener("keydown",this.handleDocumentKeyDown),this.updateSize()}componentWillUnmount(){document.removeEventListener("mousedown",this.handleDocumentMouseDown),document.removeEventListener("keydown",this.handleDocumentKeyDown)}updateSize(){let{isRtl:e}=this.context,{alignmentEl:t,alignGridTop:n}=this.props,{rootEl:r}=this,i=function(e){let t=Ft(e),n=e.getBoundingClientRect();for(let e of t){let t=vt(n,e.getBoundingClientRect());if(!t)return null;n=t}return n}(t);if(i){let s=r.getBoundingClientRect(),o=n?p(t,".fc-scrollgrid").getBoundingClientRect().top:i.top,a=e?i.right-s.width:i.left;o=Math.max(o,10),a=Math.min(a,document.documentElement.clientWidth-10-s.width),a=Math.max(a,10);let l=r.offsetParent.getBoundingClientRect();y(r,{top:o-l.top,left:a-l.left})}}}class kr extends Kt{constructor(){super(...arguments),this.handleRootEl=e=>{this.rootEl=e,e?this.context.registerInteractiveComponent(this,{el:e,useEventCenter:!1}):this.context.unregisterInteractiveComponent(this)}}render(){let{options:e,dateEnv:t}=this.context,{props:n}=this,{startDate:i,todayRange:s,dateProfile:o}=n,a=t.format(i,e.dayPopoverFormat);return r.createElement(Cr,{elRef:this.handleRootEl,date:i,dateProfile:o,todayRange:s},((t,i,s)=>r.createElement(xr,{elRef:s.ref,id:n.id,title:a,extraClassNames:["fc-more-popover"].concat(s.className||[]),extraAttrs:s,parentEl:n.parentEl,alignmentEl:n.alignmentEl,alignGridTop:n.alignGridTop,onClose:n.onClose},wr(e)&&r.createElement(t,{elTag:"div",elClasses:["fc-more-popover-misc"]}),n.children)))}queryHit(e,t,n,r){let{rootEl:i,props:s}=this;return e>=0&&e=0&&tt.eventRange.range.end?e:t}function jr(e){return[`fc-${e.type}-view`,"fc-view"]}const Br={id:String,defaultAllDay:Boolean,url:String,format:String,events:Ge,eventDataTransform:Ge,success:Ge,failure:Ge};function Lr(e,t,n=Ur(t)){let r;if("string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){let{refined:i,extra:s}=We(r,n),o=function(e,t){let n=t.pluginHooks.eventSourceDefs;for(let t=n.length-1;t>=0;t-=1){let r=n[t].parseMeta(e);if(r)return{sourceDefId:t,meta:r}}return null}(i,t);if(o)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:O(),sourceDefId:o.sourceDefId,meta:o.meta,ui:rt(i,t),extendedProps:s}}return null}function Ur(e){return Object.assign(Object.assign(Object.assign({},tt),Br),e.pluginHooks.eventSourceRefiners)}class Fr{constructor(){this.handlers=[]}set(e){this.currentValue=e;for(let t of this.handlers)t(e)}subscribe(e){this.handlers.push(e),void 0!==this.currentValue&&e(this.currentValue)}}t.BASE_OPTION_DEFAULTS={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",scrollTimeReset:!0,slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1,eventMinHeight:15,eventMinWidth:30,eventShortHeight:30,monthStartFormat:{month:"long",day:"numeric"}},t.BASE_OPTION_REFINERS=je,t.BaseComponent=Jt,t.BgEvent=class extends Jt{render(){let{props:e}=this,{seg:t}=e;return r.createElement(Sr,{elTag:"div",elClasses:["fc-bg-event"],elStyle:{backgroundColor:t.eventRange.ui.backgroundColor},defaultGenerator:Rr,seg:t,timeText:"",isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,disableDragging:!0,disableResizing:!0})}},t.CALENDAR_LISTENER_REFINERS=Be,t.CALENDAR_OPTION_REFINERS=Le,t.COMPLEX_OPTION_COMPARATORS=Ue,t.CalendarImpl=class{getCurrentData(){return this.currentDataManager.getCurrentData()}dispatch(e){this.currentDataManager.dispatch(e)}get view(){return this.getCurrentData().viewApi}batchRendering(e){e()}updateSize(){this.trigger("_resize",!0)}setOption(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})}getOption(e){return this.currentDataManager.currentCalendarOptionsInput[e]}getAvailableLocaleCodes(){return Object.keys(this.getCurrentData().availableRawLocales)}on(e,t){let{currentDataManager:n}=this;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn(`Unknown listener name '${e}'`)}off(e,t){this.currentDataManager.emitter.off(e,t)}trigger(e,...t){this.currentDataManager.emitter.trigger(e,...t)}changeView(e,t){this.batchRendering((()=>{if(this.unselect(),t)if(t.start&&t.end)this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),this.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{let{dateEnv:n}=this.getCurrentData();this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:n.createMarker(t)})}else this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})}))}zoomTo(e,t){let n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})}getUnitViewSpec(e){let t,n,{viewSpecs:r,toolbarConfig:i}=this.getCurrentData(),s=[].concat(i.header?i.header.viewsWithButtons:[],i.footer?i.footer.viewsWithButtons:[]);for(let e in r)s.push(e);for(t=0;t{this.dispatch({type:"REMOVE_EVENTS",eventStore:dn(e)})}})}getEventById(e){let t=this.getCurrentData(),{defs:n,instances:r}=t.eventStore;e=String(e);for(let i in n){let s=n[i];if(s.publicId===e){if(s.recurringDef)return new cn(t,s,null);for(let e in r){let n=r[e];if(n.defId===s.defId)return new cn(t,s,n)}}}return null}getEvents(){let e=this.getCurrentData();return un(e.eventStore,e)}removeAllEvents(){this.dispatch({type:"REMOVE_ALL_EVENTS"})}getEventSources(){let e=this.getCurrentData(),t=e.eventSources,n=[];for(let r in t)n.push(new ln(e,t[r]));return n}getEventSourceById(e){let t=this.getCurrentData(),n=t.eventSources;e=String(e);for(let r in n)if(n[r].publicId===e)return new ln(t,n[r]);return null}addEventSource(e){let t=this.getCurrentData();if(e instanceof ln)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;let n=Lr(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new ln(t,n)):null}removeAllEventSources(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})}refetchEvents(){this.dispatch({type:"FETCH_EVENT_SOURCES",isRefetch:!0})}scrollToTime(e){let t=U(e);t&&this.trigger("_scrollRequest",{time:t})}},t.CalendarRoot=class extends Jt{constructor(){super(...arguments),this.state={forPrint:!1},this.handleBeforePrint=()=>{this.setState({forPrint:!0})},this.handleAfterPrint=()=>{this.setState({forPrint:!1})}}render(){let{props:e}=this,{options:t}=e,{forPrint:n}=this.state,r=n||"auto"===t.height||"auto"===t.contentHeight,i=r||null==t.height?"":t.height,s=["fc",n?"fc-media-print":"fc-media-screen",`fc-direction-${t.direction}`,e.theme.getClass("root")];return _t()||s.push("fc-liquid-hack"),e.children(s,i,r,n)}componentDidMount(){let{emitter:e}=this.props;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)}componentWillUnmount(){let{emitter:e}=this.props;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)}},t.ContentContainer=Vn,t.CustomRenderingStore=class extends Fr{constructor(){super(...arguments),this.map=new Map}handle(e){const{map:t}=this;let n=!1;e.isActive?(t.set(e.id,e),n=!0):t.has(e.id)&&(t.delete(e.id),n=!0),n&&this.set(t)}},t.DateComponent=Kt,t.DateEnv=class{constructor(e){let t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Cn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.weekTextLong=(null!=e.weekTextLong?e.weekTextLong:e.locale.options.weekTextLong)||this.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}createMarker(e){let t=this.createMarkerMeta(e);return null===t?null:t.marker}createNowMarker(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):ge(he(new Date))}createMarkerMeta(e){if("string"==typeof e)return this.parse(e);let t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=ge(e)),null!==t&&me(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null}parse(e){let t=Rn(e);if(null===t)return null;let{marker:n}=t,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}}getYear(e){return this.calendarSystem.getMarkerYear(e)}getMonth(e){return this.calendarSystem.getMarkerMonth(e)}getDay(e){return this.calendarSystem.getMarkerDay(e)}add(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)}subtract(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)}addYears(e,t){let n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)}addMonths(e,t){let n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)}diffWholeYears(e,t){let{calendarSystem:n}=this;return ve(e)===ve(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null}diffWholeMonths(e,t){let{calendarSystem:n}=this;return ve(e)===ve(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null}greatestWholeUnit(e,t){let n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:(n=this.diffWholeMonths(e,t),null!==n?{unit:"month",value:n}:(n=ae(e,t),null!==n?{unit:"week",value:n}:(n=le(e,t),null!==n?{unit:"day",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t),H(n)?{unit:"hour",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t),H(n)?{unit:"minute",value:n}:(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t),H(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}))))))}countDurationsBetween(e,t,n){let r;return n.years&&(r=this.diffWholeYears(e,t),null!==r)?r/(z(n)/365):n.months&&(r=this.diffWholeMonths(e,t),null!==r)?r/(z(n)/30):n.days&&(r=le(e,t),null!==r)?r/z(n):(t.valueOf()-e.valueOf())/V(n)}startOf(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?ce(e):"hour"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return ge([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):null}startOfYear(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])}startOfMonth(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])}startOfWeek(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])}computeWeekNumber(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){let r=e.getUTCFullYear(),i=de(e,r,t,n);if(i<1)return de(e,r-1,t,n);let s=de(e,r+1,t,n);return s>=1?Math.min(i,s):i}(e,this.weekDow,this.weekDoy)}format(e,t,n={}){return t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)}formatRange(e,t,n,r={}){return r.isEndExclusive&&(t=ie(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)}formatIso(e,t={}){let n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),ye(e,n,t.omitTime)}timestampToMarker(e){return"local"===this.timeZone?ge(he(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?ge(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)}offsetForMarker(e){return"local"===this.timeZone?-fe(pe(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(pe(e)):null}toDate(e,t){return"local"===this.timeZone?fe(pe(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(pe(e))*60):new Date(e.valueOf()-(t||0))}},t.DateProfileGenerator=class{constructor(e){this.props=e,this.nowDate=en(e.nowInput,e.dateEnv),this.initHiddenDays()}buildPrev(e,t,n){let{dateEnv:r}=this.props,i=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,-1,n)}buildNext(e,t,n){let{dateEnv:r}=this.props,i=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(i,1,n)}build(e,t,n=!0){let r,i,s,o,a,l,{props:c}=this;var d,u;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(u=r).start&&d=u.end?new Date(u.end.valueOf()-1):d),i=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(i.unit),o=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,s),o=this.trimHiddenDays(o),a=o,c.showNonCurrentDates||(a=At(a,i.range)),a=this.adjustActiveRange(a),a=At(a,r),l=wt(i.range,r),Rt(o,e)||(e=o.start),{currentDate:e,validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:s,activeRange:a,renderRange:o,slotMinTime:c.slotMinTime,slotMaxTime:c.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(i.duration)}}buildValidRange(){let e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}}buildCurrentRangeInfo(e,t){let n,{props:r}=this,i=null,s=null,o=null;return r.duration?(i=r.duration,s=r.durationUnit,o=this.buildRangeFromDuration(e,t,i,s)):(n=this.props.dayCount)?(s="day",o=this.buildRangeFromDayCount(e,t,n)):(o=this.buildCustomVisibleRange(e))?s=r.dateEnv.greatestWholeUnit(o.start,o.end).unit:(i=this.getFallbackDuration(),s=W(i).unit,o=this.buildRangeFromDuration(e,t,i,s)),{duration:i,unit:s,range:o}}getFallbackDuration(){return U({day:1})}adjustActiveRange(e){let{dateEnv:t,usesMinMaxTime:n,slotMinTime:r,slotMaxTime:i}=this.props,{start:s,end:o}=e;return n&&(z(r)<0&&(s=ce(s),s=t.add(s,r)),z(i)>1&&(o=ce(o),o=re(o,-1),o=t.add(o,i))),{start:s,end:o}}buildRangeFromDuration(e,t,n,r){let i,s,o,{dateEnv:a,dateAlignment:l}=this.props;if(!l){let{dateIncrement:e}=this.props;l=e&&V(e)r.createElement("tr",{role:"row"},s&&s("day"),t.map((e=>i?r.createElement(Gn,{key:e.toISOString(),date:e,dateProfile:n,todayRange:a,colCnt:t.length,dayHeaderFormat:o}):r.createElement(Yn,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:o}))))))}},t.DaySeriesModel=class{constructor(e,t){let n=e.start,{end:r}=e,i=[],s=[],o=-1;for(;n=t.length?t[t.length-1]+1:t[n]}},t.DayTableModel=class{constructor(e,t){let n,r,i,{dates:s}=e;if(t){for(r=s[0].getUTCDay(),n=1;n{this.linkEl=e,this.props.elRef&&$t(this.props.elRef,e)},this.handleClick=e=>{let{props:t,context:n}=this,{moreLinkClick:r}=n.options,i=Ir(t).start;function s(e){let{def:t,instance:r,range:i}=e.eventRange;return{event:new cn(n,t,r),start:n.dateEnv.toDate(i.start),end:n.dateEnv.toDate(i.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof r&&(r=r({date:i,allDay:Boolean(t.allDayDate),allSegs:t.allSegs.map(s),hiddenSegs:t.hiddenSegs.map(s),jsEvent:e,view:n.viewApi})),r&&"popover"!==r?"string"==typeof r&&n.calendarApi.zoomTo(i,r):this.setState({isPopoverOpen:!0})},this.handlePopoverClose=()=>{this.setState({isPopoverOpen:!1})}}render(){let{props:e,state:t}=this;return r.createElement(Zt.Consumer,null,(n=>{let{viewApi:i,options:s,calendarApi:o}=n,{moreLinkText:a}=s,{moreCnt:l}=e,c=Ir(e),d="function"==typeof a?a.call(o,l):`+${l} ${a}`,u=P(s.moreLinkHint,[l],d),h={num:l,shortText:`+${l}`,text:d,view:i};return r.createElement(r.Fragment,null,Boolean(e.moreCnt)&&r.createElement(Vn,{elTag:e.elTag||"a",elRef:this.handleLinkEl,elClasses:[...e.elClasses||[],"fc-more-link"],elStyle:e.elStyle,elAttrs:Object.assign(Object.assign(Object.assign({},e.elAttrs),w(this.handleClick)),{title:u,"aria-expanded":t.isPopoverOpen,"aria-controls":t.isPopoverOpen?t.popoverId:""}),renderProps:h,generatorName:"moreLinkContent",customGenerator:s.moreLinkContent,defaultGenerator:e.defaultGenerator||Mr,classNameGenerator:s.moreLinkClassNames,didMount:s.moreLinkDidMount,willUnmount:s.moreLinkWillUnmount},e.children),t.isPopoverOpen&&r.createElement(kr,{id:t.popoverId,startDate:c.start,endDate:c.end,dateProfile:e.dateProfile,todayRange:e.todayRange,extraDateSpan:e.extraDateSpan,parentEl:this.parentEl,alignmentEl:e.alignmentElRef?e.alignmentElRef.current:this.linkEl,alignGridTop:e.alignGridTop,forceTimed:e.forceTimed,onClose:this.handlePopoverClose},e.popoverContent()))}))}componentDidMount(){this.updateParentEl()}componentDidUpdate(){this.updateParentEl()}updateParentEl(){this.linkEl&&(this.parentEl=p(this.linkEl,".fc-view-harness"))}},t.NamedTimeZoneImpl=class{constructor(e){this.timeZoneName=e}},t.NowIndicatorContainer=e=>r.createElement(Zt.Consumer,null,(t=>{let{options:n}=t,i={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return r.createElement(Vn,Object.assign({},e,{elTag:e.elTag||"div",renderProps:i,generatorName:"nowIndicatorContent",customGenerator:n.nowIndicatorContent,classNameGenerator:n.nowIndicatorClassNames,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount}))})),t.NowTimer=Qn,t.PositionCache=class{constructor(e,t,n,r){this.els=t;let i=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(i.left),r&&this.buildElVerticals(i.top)}buildElHorizontals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n}buildElVerticals(e){let t=[],n=[];for(let r of this.els){let i=r.getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n}leftToIndex(e){let t,{lefts:n,rights:r}=this,i=n.length;for(t=0;t=n[t]&&e=n[t]&&eo.end&&(r+=this.insertEntry({index:e.index,thickness:e.thickness,span:{start:o.end,end:s.end}},i)),r?(n.push({index:e.index,thickness:e.thickness,span:kn(o,s)},...i),r):(n.push(e),0)}insertEntryAt(e,t){let{entriesByLevel:n,levelCoords:r}=this;-1===t.lateral?(Mn(r,t.level,t.levelCoord),Mn(n,t.level,[e])):Mn(n[t.level],t.lateral,e),this.stackCnts[xn(e)]=t.stackCnt}findInsertion(e){let{levelCoords:t,entriesByLevel:n,strictOrder:r,stackCnts:i}=this,s=t.length,o=0,a=-1,l=-1,c=null,d=0;for(let u=0;u=o+e.thickness)break;let h,f=n[u],p=In(f,e.span.start,On),g=p[0]+p[1];for(;(h=f[g])&&h.span.starto&&(o=e,c=h,a=u,l=g),e===o&&(d=Math.max(d,i[xn(h)]+1)),g+=1}}let u=0;if(c)for(u=a+1;uthis.eventUiBuilders[t]||Ee(Et)));for(let n in t){let c=t[n],d=s[n]||bt,u=this.eventUiBuilders[n];l[n]={businessHours:c.businessHours||e.businessHours,dateSelection:r[n]||null,eventStore:d,eventUiBases:u(e.eventUiBases[""],c.ui,i[n]),eventSelection:d.instances[e.eventSelection]?e.eventSelection:"",eventDrag:o[n]||null,eventResize:a[n]||null}}return l}_splitDateSpan(e){let t={};if(e){let n=this.getKeysForDateSpan(e);for(let r of n)t[r]=e}return t}_getKeysForEventDefs(e){return Q(e.defs,(e=>this.getKeysForEventDef(e)))}_splitEventStore(e,t){let{defs:n,instances:r}=e,i={};for(let e in n)for(let r of t[e])i[r]||(i[r]={defs:{},instances:{}}),i[r].defs[e]=n[e];for(let e in r){let n=r[e];for(let r of t[n.defId])i[r]&&(i[r].instances[e]=n)}return i}_splitIndividualUi(e,t){let n={};for(let r in e)if(r)for(let i of t[r])n[i]||(n[i]={}),n[i][r]=e[r];return n}_splitInteraction(e){let t={};if(e){let n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),s=r=>{t[r]||(t[r]={affectedEvents:n[r]||bt,mutatedEvents:i[r]||bt,isEvent:e.isEvent})};for(let e in n)s(e);for(let e in i)s(e)}return t}},t.StandardEvent=class extends Jt{render(){let{props:e,context:t}=this,{options:n}=t,{seg:i}=e,{ui:s}=i.eventRange,o=bn(i,n.eventTimeFormat||e.defaultTimeFormat,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return r.createElement(Sr,Object.assign({},e,{elTag:"a",elStyle:{borderColor:s.borderColor,backgroundColor:s.backgroundColor},elAttrs:Sn(i,t),defaultGenerator:Dr,timeText:o}),((e,t)=>r.createElement(r.Fragment,null,r.createElement(e,{elTag:"div",elClasses:["fc-event-main"],elStyle:{color:t.textColor}}),Boolean(t.isStartResizable)&&r.createElement("div",{className:"fc-event-resizer fc-event-resizer-start"}),Boolean(t.isEndResizable)&&r.createElement("div",{className:"fc-event-resizer fc-event-resizer-end"}))))}},t.TableDateCell=Gn,t.TableDowCell=Yn,t.Theme=Gt,t.VIEW_OPTION_REFINERS=Ve,t.ViewContainer=class extends Jt{render(){let{props:e,context:t}=this,{options:n}=t,i={view:t.viewApi};return r.createElement(Vn,Object.assign({},e,{elTag:e.elTag||"div",elClasses:[...jr(e.viewSpec),...e.elClasses||[]],renderProps:i,classNameGenerator:n.viewClassNames,generatorName:void 0,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount}),(()=>e.children))}},t.ViewContextType=Zt,t.WeekNumberContainer=e=>r.createElement(Zt.Consumer,null,(t=>{let{dateEnv:n,options:i}=t,{date:s}=e,o=i.weekNumberFormat||e.defaultFormat,a={num:n.computeWeekNumber(s),text:n.format(s,o),date:s};return r.createElement(Vn,Object.assign({},e,{renderProps:a,generatorName:"weekNumberContent",customGenerator:i.weekNumberContent,defaultGenerator:Or,classNameGenerator:i.weekNumberClassNames,didMount:i.weekNumberDidMount,willUnmount:i.weekNumberWillUnmount}))})),t.WindowScrollController=class extends Wt{getScrollTop(){return window.pageYOffset}getScrollLeft(){return window.pageXOffset}setScrollTop(e){window.scroll(window.pageXOffset,e)}setScrollLeft(e){window.scroll(e,window.pageYOffset)}getScrollWidth(){return document.documentElement.scrollWidth}getScrollHeight(){return document.documentElement.scrollHeight}getClientHeight(){return document.documentElement.clientHeight}getClientWidth(){return document.documentElement.clientWidth}},t.addDays=re,t.addDurations=function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},t.addMs=ie,t.addWeeks=function(e,t){let n=pe(e);return n[2]+=7*t,ge(n)},t.allowContextMenu=function(e){e.removeEventListener("contextmenu",D)},t.allowSelection=function(e){e.style.userSelect="",e.removeEventListener("selectstart",D)},t.applyMutationToEventStore=sn,t.applyStyle=y,t.applyStyleProp=_,t.arrayToHash=function(e){let t={};for(let n of e)t[n]=!0;return t},t.asCleanDays=function(e){return e.years||e.months||e.milliseconds?0:e.days},t.asRoughMinutes=function(e){return V(e)/6e4},t.asRoughMs=V,t.asRoughSeconds=function(e){return V(e)/1e3},t.binarySearch=In,t.buildElAttrs=Un,t.buildEntryKey=xn,t.buildEventApis=un,t.buildEventRangeKey=function(e){return e.instance?e.instance.instanceId:`${e.def.defId}:${e.range.start.toISOString()}`},t.buildEventSourceRefiners=Ur,t.buildIsoString=ye,t.buildNavLinkAttrs=It,t.buildRangeApiWithTimeZone=function(e,t,n){return Object.assign(Object.assign({},An(e,t,n)),{timeZone:t.timeZone})},t.buildSegTimeText=bn,t.buildViewClassNames=jr,t.buildViewContext=function(e,t,n,r,i,s,o,a,l,c,d,u,h){return{dateEnv:i,options:n,pluginHooks:o,emitter:c,dispatch:a,getCurrentData:l,calendarApi:d,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:s,isRtl:"rtl"===n.direction,addResizeHandler(e){c.on("_resize",e)},removeResizeHandler(e){c.off("_resize",e)},createScrollResponder:e=>new Qt(e,c,U(n.scrollTime),n.scrollTimeReset),registerInteractiveComponent:u,unregisterInteractiveComponent:h}},t.collectFromHash=ee,t.combineEventUis=it,t.compareByFieldSpecs=k,t.compareNumbers=function(e,t){return e-t},t.compareObjs=K,t.computeEarliestSegStart=Nr,t.computeEdges=Lt,t.computeFallbackHeaderFormat=Pn,t.computeInnerRect=function(e,t=!1,n){let r=n?e.getBoundingClientRect():Ut(e),i=Lt(e,t),s={left:r.left+i.borderLeft+i.scrollbarLeft,right:r.right-i.borderRight-i.scrollbarRight,top:r.top+i.borderTop,bottom:r.bottom-i.borderBottom-i.scrollbarBottom};return t&&(s.left+=i.paddingLeft,s.right-=i.paddingRight,s.top+=i.paddingTop,s.bottom-=i.paddingBottom),s},t.computeRect=Ut,t.computeShrinkWidth=ur,t.computeVisibleDayRange=gt,t.config={},t.constrainPoint=function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},t.createContext=Yt,t.createDuration=U,t.createEmptyEventStore=function(){return{defs:{},instances:{}}},t.createEventInstance=qe,t.createEventUi=rt,t.createFormatter=He,t.diffDates=mt,t.diffDayAndTime=oe,t.diffDays=se,t.diffPoints=function(e,t){return{left:e.left-t.left,top:e.top-t.top}},t.diffWeeks=function(e,t){return se(e,t)/7},t.diffWholeDays=le,t.diffWholeWeeks=ae,t.disableCursor=function(){document.body.classList.add("fc-not-allowed")},t.elementClosest=p,t.elementMatches=g,t.enableCursor=function(){document.body.classList.remove("fc-not-allowed")},t.ensureElHasStyles=function(e){e.isConnected&&d(e.getRootNode())},t.eventTupleToStore=Xe,t.filterHash=Y,t.findDirectChildren=function(e,t){let n=e instanceof HTMLElement?[e]:e,r=[];for(let e=0;e=(n||t.end),isToday:t&&Rt(t,r.start)}},t.getSlotClassNames=function(e,t){let n=["fc-slot",`fc-slot-${ne[e.dow]}`];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n},t.getStickyFooterScrollbar=function(e){let{stickyFooterScrollbar:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},t.getStickyHeaderDates=function(e){let{stickyHeaderDates:t}=e;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t},t.getUniqueDomId=S,t.greatestDurationDenominator=W,t.groupIntersectingEntries=function(e){let t=[];for(let i of e){let e=[],s={span:i.span,entries:[i]};for(let i of t)kn(i.span,s.span)?s={entries:i.entries.concat(s.entries),span:(n=i.span,r=s.span,{start:Math.min(n.start,r.start),end:Math.max(n.end,r.end)})}:e.push(i);e.push(s),t=e}var n,r;return t},t.guid=O,t.hasBgRendering=function(e){return"background"===e.ui.display||"inverse-background"===e.ui.display},t.hasCustomDayCellContent=wr,t.hasShrinkWidth=yr,t.hashValuesToArray=Z,t.identity=Ge,t.injectStyles=c,t.interactionSettingsStore={},t.interactionSettingsToStore=function(e){return{[e.component.uid]:e}},t.intersectRanges=At,t.intersectRects=vt,t.intersectSpans=kn,t.isArraysEqual=te,t.isColPropsEqual=gr,t.isDateSelectionValid=function(e,t,n){return!!Tt(t.validRange,e.range)&&tr({dateSelection:e},n)},t.isDateSpansEqual=function(e,t){return Ct(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(let n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(let n in e)if(!(n in t))return!1;return!0}(e,t)},t.isInt=H,t.isInteractionValid=function(e,t,n){let{instances:r}=e.mutatedEvents;for(let e in r)if(!Tt(t.validRange,r[e].range))return!1;return tr({eventDrag:e},n)},t.isMultiDayRange=function(e){let t=gt(e);return se(t.start,t.end)>1},t.isPropsEqual=X,t.isPropsValid=nr,t.isValidDate=me,t.listenBySelector=A,t.listenToHoverBySelector=function(e,t,n,r){let i;return A(e,"mouseover",t,((e,t)=>{if(t!==i){i=t,n(e,t);let s=e=>{i=null,r(e,t),t.removeEventListener("mouseleave",s)};t.addEventListener("mouseleave",s)}}))},t.mapHash=Q,t.memoize=Ee,t.memoizeArraylike=function(e,t,n){let r=[],i=[];return s=>{let o=r.length,a=s.length,l=0;for(;l{let o={};for(let a in s)if(i[a])if(te(r[a],s[a]))o[a]=i[a];else{n&&n(i[a]);let r=e.apply(this,s[a]);o[a]=t&&t(r,i[a])?i[a]:r}else o[a]=e.apply(this,s[a]);return r=s,i=o,o}},t.memoizeObjArg=Se,t.mergeEventStores=$e,t.mergeProps=q,t.mergeRawOptions=function(e){return q(e,Ue)},t.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},t.padStart=N,t.parse=Rn,t.parseBusinessHours=function(e,t){return Ze(function(e){let t;return t=!0===e?[{}]:Array.isArray(e)?e.filter((e=>e.daysOfWeek)):"object"==typeof e&&e?[e]:[],t=t.map((e=>Object.assign(Object.assign({},ft),e))),t}(e),null,t)},t.parseClassNames=et,t.parseDragMeta=function(e){let{refined:t,extra:n}=We(e,Nn);return{startTime:t.startTime||null,duration:t.duration||null,create:null==t.create||t.create,sourceId:t.sourceId,leftoverProps:n}},t.parseEventDef=ht,t.parseEventSource=Lr,t.parseFieldSpecs=x,t.parseInteractionSettings=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter,isHitComboAllowed:t.isHitComboAllowed||null}},t.pointInsideRect=function(e,t){return e.left>=t.left&&e.left=t.top&&e.top!e.sourceId));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}},t.refineEventDef=dt,t.refineProps=We,t.removeElement=f,t.removeExact=function(e,t){let n=0,r=0;for(;r{if(e.ok)return e.json().then((t=>[t,e]),(()=>{throw new ar("Failure parsing JSON",e)}));throw new ar("Request failed",e)}))},t.rezoneEventStoreDates=function(e,t,n){let{defs:r}=e,i=Q(e.instances,(e=>r[e.defId].allDay?e:Object.assign(Object.assign({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})));return{defs:r,instances:i}},t.sanitizeShrinkWidth=vr,t.setRef=$t,t.sliceEventStore=hn,t.sortEventSegs=function(e,t){let n=e.map(mn);return n.sort(((e,n)=>k(e,n,t))),n.map((e=>e._seg))},t.startOfDay=ce,t.subtractDurations=function(e,t){return{years:e.years-t.years,months:e.months-t.months,days:e.days-t.days,milliseconds:e.milliseconds-t.milliseconds}},t.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},t.triggerDateSelect=tn,t.unpromisify=function(e,t,n){let r=!1,i=function(e){r||(r=!0,t(e))},s=function(e){r||(r=!0,n(e))},o=e(i,s);o&&"function"==typeof o.then&&o.then(i,s)},t.whenTransitionDone=function(e,t){let n=r=>{t(r),C.forEach((t=>{e.removeEventListener(t,n)}))};C.forEach((t=>{e.addEventListener(t,n)}))},t.wholeDivideDurations=function(e,t){let n=null;for(let r=0;r{Object.defineProperty(t,"__esModule",{value:!0});var r=n(873);n(400),n(748),t.BASE_OPTION_DEFAULTS=r.BASE_OPTION_DEFAULTS,t.BaseComponent=r.BaseComponent,t.BgEvent=r.BgEvent,t.CalendarImpl=r.CalendarImpl,t.CalendarRoot=r.CalendarRoot,t.ContentContainer=r.ContentContainer,t.CustomRenderingStore=r.CustomRenderingStore,t.DateComponent=r.DateComponent,t.DateEnv=r.DateEnv,t.DateProfileGenerator=r.DateProfileGenerator,t.DayCellContainer=r.DayCellContainer,t.DayHeader=r.DayHeader,t.DaySeriesModel=r.DaySeriesModel,t.DayTableModel=r.DayTableModel,t.DelayedRunner=r.DelayedRunner,t.ElementDragging=r.ElementDragging,t.ElementScrollController=r.ElementScrollController,t.Emitter=r.Emitter,t.EventContainer=r.EventContainer,t.EventImpl=r.EventImpl,t.Interaction=r.Interaction,t.MoreLinkContainer=r.MoreLinkContainer,t.NamedTimeZoneImpl=r.NamedTimeZoneImpl,t.NowIndicatorContainer=r.NowIndicatorContainer,t.NowTimer=r.NowTimer,t.PositionCache=r.PositionCache,t.RefMap=r.RefMap,t.ScrollController=r.ScrollController,t.ScrollResponder=r.ScrollResponder,t.Scroller=r.Scroller,t.SegHierarchy=r.SegHierarchy,t.SimpleScrollGrid=r.SimpleScrollGrid,t.Slicer=r.Slicer,t.Splitter=r.Splitter,t.StandardEvent=r.StandardEvent,t.TableDateCell=r.TableDateCell,t.TableDowCell=r.TableDowCell,t.Theme=r.Theme,t.ViewContainer=r.ViewContainer,t.ViewContextType=r.ViewContextType,t.WeekNumberContainer=r.WeekNumberContainer,t.WindowScrollController=r.WindowScrollController,t.addDays=r.addDays,t.addDurations=r.addDurations,t.addMs=r.addMs,t.addWeeks=r.addWeeks,t.allowContextMenu=r.allowContextMenu,t.allowSelection=r.allowSelection,t.applyMutationToEventStore=r.applyMutationToEventStore,t.applyStyle=r.applyStyle,t.asCleanDays=r.asCleanDays,t.asRoughMinutes=r.asRoughMinutes,t.asRoughMs=r.asRoughMs,t.asRoughSeconds=r.asRoughSeconds,t.binarySearch=r.binarySearch,t.buildElAttrs=r.buildElAttrs,t.buildEntryKey=r.buildEntryKey,t.buildEventApis=r.buildEventApis,t.buildEventRangeKey=r.buildEventRangeKey,t.buildIsoString=r.buildIsoString,t.buildNavLinkAttrs=r.buildNavLinkAttrs,t.buildSegTimeText=r.buildSegTimeText,t.collectFromHash=r.collectFromHash,t.combineEventUis=r.combineEventUis,t.compareByFieldSpecs=r.compareByFieldSpecs,t.compareNumbers=r.compareNumbers,t.compareObjs=r.compareObjs,t.computeEarliestSegStart=r.computeEarliestSegStart,t.computeEdges=r.computeEdges,t.computeFallbackHeaderFormat=r.computeFallbackHeaderFormat,t.computeInnerRect=r.computeInnerRect,t.computeRect=r.computeRect,t.computeShrinkWidth=r.computeShrinkWidth,t.computeVisibleDayRange=r.computeVisibleDayRange,t.config=r.config,t.constrainPoint=r.constrainPoint,t.createDuration=r.createDuration,t.createEmptyEventStore=r.createEmptyEventStore,t.createEventInstance=r.createEventInstance,t.createEventUi=r.createEventUi,t.createFormatter=r.createFormatter,t.diffDates=r.diffDates,t.diffDayAndTime=r.diffDayAndTime,t.diffDays=r.diffDays,t.diffPoints=r.diffPoints,t.diffWeeks=r.diffWeeks,t.diffWholeDays=r.diffWholeDays,t.diffWholeWeeks=r.diffWholeWeeks,t.disableCursor=r.disableCursor,t.elementClosest=r.elementClosest,t.elementMatches=r.elementMatches,t.enableCursor=r.enableCursor,t.eventTupleToStore=r.eventTupleToStore,t.filterHash=r.filterHash,t.findDirectChildren=r.findDirectChildren,t.findElements=r.findElements,t.flexibleCompare=r.flexibleCompare,t.formatDayString=r.formatDayString,t.formatIsoMonthStr=r.formatIsoMonthStr,t.formatIsoTimeString=r.formatIsoTimeString,t.getAllowYScrolling=r.getAllowYScrolling,t.getCanVGrowWithinCell=r.getCanVGrowWithinCell,t.getClippingParents=r.getClippingParents,t.getDateMeta=r.getDateMeta,t.getDayClassNames=r.getDayClassNames,t.getDefaultEventEnd=r.getDefaultEventEnd,t.getElSeg=r.getElSeg,t.getEntrySpanEnd=r.getEntrySpanEnd,t.getEventTargetViaRoot=r.getEventTargetViaRoot,t.getIsRtlScrollbarOnLeft=r.getIsRtlScrollbarOnLeft,t.getRectCenter=r.getRectCenter,t.getRelevantEvents=r.getRelevantEvents,t.getScrollGridClassNames=r.getScrollGridClassNames,t.getScrollbarWidths=r.getScrollbarWidths,t.getSectionClassNames=r.getSectionClassNames,t.getSectionHasLiquidHeight=r.getSectionHasLiquidHeight,t.getSegAnchorAttrs=r.getSegAnchorAttrs,t.getSegMeta=r.getSegMeta,t.getSlotClassNames=r.getSlotClassNames,t.getStickyFooterScrollbar=r.getStickyFooterScrollbar,t.getStickyHeaderDates=r.getStickyHeaderDates,t.getUniqueDomId=r.getUniqueDomId,t.greatestDurationDenominator=r.greatestDurationDenominator,t.groupIntersectingEntries=r.groupIntersectingEntries,t.guid=r.guid,t.hasBgRendering=r.hasBgRendering,t.hasCustomDayCellContent=r.hasCustomDayCellContent,t.hasShrinkWidth=r.hasShrinkWidth,t.identity=r.identity,t.injectStyles=r.injectStyles,t.interactionSettingsStore=r.interactionSettingsStore,t.interactionSettingsToStore=r.interactionSettingsToStore,t.intersectRanges=r.intersectRanges,t.intersectRects=r.intersectRects,t.intersectSpans=r.intersectSpans,t.isArraysEqual=r.isArraysEqual,t.isColPropsEqual=r.isColPropsEqual,t.isDateSelectionValid=r.isDateSelectionValid,t.isDateSpansEqual=r.isDateSpansEqual,t.isInt=r.isInt,t.isInteractionValid=r.isInteractionValid,t.isMultiDayRange=r.isMultiDayRange,t.isPropsEqual=r.isPropsEqual,t.isPropsValid=r.isPropsValid,t.isValidDate=r.isValidDate,t.mapHash=r.mapHash,t.memoize=r.memoize,t.memoizeArraylike=r.memoizeArraylike,t.memoizeHashlike=r.memoizeHashlike,t.memoizeObjArg=r.memoizeObjArg,t.mergeEventStores=r.mergeEventStores,t.multiplyDuration=r.multiplyDuration,t.padStart=r.padStart,t.parseBusinessHours=r.parseBusinessHours,t.parseClassNames=r.parseClassNames,t.parseDragMeta=r.parseDragMeta,t.parseEventDef=r.parseEventDef,t.parseFieldSpecs=r.parseFieldSpecs,t.parseMarker=r.parse,t.pointInsideRect=r.pointInsideRect,t.preventContextMenu=r.preventContextMenu,t.preventDefault=r.preventDefault,t.preventSelection=r.preventSelection,t.rangeContainsMarker=r.rangeContainsMarker,t.rangeContainsRange=r.rangeContainsRange,t.rangesEqual=r.rangesEqual,t.rangesIntersect=r.rangesIntersect,t.refineEventDef=r.refineEventDef,t.refineProps=r.refineProps,t.removeElement=r.removeElement,t.removeExact=r.removeExact,t.renderChunkContent=r.renderChunkContent,t.renderFill=r.renderFill,t.renderMicroColGroup=r.renderMicroColGroup,t.renderScrollShim=r.renderScrollShim,t.requestJson=r.requestJson,t.sanitizeShrinkWidth=r.sanitizeShrinkWidth,t.setRef=r.setRef,t.sliceEventStore=r.sliceEventStore,t.sortEventSegs=r.sortEventSegs,t.startOfDay=r.startOfDay,t.translateRect=r.translateRect,t.triggerDateSelect=r.triggerDateSelect,t.unpromisify=r.unpromisify,t.whenTransitionDone=r.whenTransitionDone,t.wholeDivideDurations=r.wholeDivideDurations},170:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(400),i=n(748),s=n(873);Object.defineProperty(t,"createPortal",{enumerable:!0,get:function(){return i.createPortal}}),t.createContext=s.createContext,t.flushSync=s.flushSync,Object.keys(r).forEach((function(e){"default"===e||t.hasOwnProperty(e)||Object.defineProperty(t,e,{enumerable:!0,get:function(){return r[e]}})}))},610:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(553),i=n(957);n(368),n(170);var s=r.createPlugin({name:"@fullcalendar/daygrid",initialView:"dayGridMonth",views:{dayGrid:{component:i.DayGridView,dateProfileGeneratorClass:i.TableDateProfileGenerator},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},fixedWeekCount:!0},dayGridYear:{type:"dayGrid",duration:{years:1}}}});t.default=s},957:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(368),i=n(170);function s(e,t){let n=[];for(let e=0;e{let n=(e.eventDrag?e.eventDrag.affectedInstances:null)||(e.eventResize?e.eventResize.affectedInstances:null)||{};return i.createElement(i.Fragment,null,t.map((t=>{let s=t.eventRange.instance.instanceId;return i.createElement("div",{className:"fc-daygrid-event-harness",key:s,style:{visibility:n[s]?"hidden":""}},c(t)?i.createElement(u,Object.assign({seg:t,isDragging:!1,isSelected:s===e.eventSelection,defaultDisplayEventEnd:!1},r.getSegMeta(t,e.todayRange))):i.createElement(d,Object.assign({seg:t,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:s===e.eventSelection,defaultDisplayEventEnd:!1},r.getSegMeta(t,e.todayRange))))})))}})}}function p(e){let t=[],n=[];for(let r of e)t.push(r.seg),r.isVisible||n.push(r.seg);return{allSegs:t,invisibleSegs:n}}const g=r.createFormatter({week:"narrow"});class m extends r.DateComponent{constructor(){super(...arguments),this.rootElRef=i.createRef(),this.state={dayNumberId:r.getUniqueDomId()},this.handleRootEl=e=>{r.setRef(this.rootElRef,e),r.setRef(this.props.elRef,e)}}render(){let{context:e,props:t,state:n,rootElRef:s}=this,{options:o,dateEnv:a}=e,{date:l,dateProfile:c}=t;const d=t.showDayNumber&&function(e,t,n){const{start:i,end:s}=t,o=r.addMs(s,-1),a=n.getYear(i),l=n.getMonth(i),c=n.getYear(o),d=n.getMonth(o);return!(a===c&&l===d)&&Boolean(e.valueOf()===i.valueOf()||1===n.getDay(e)&&e.valueOf()i.createElement("div",{ref:t.innerElRef,className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",style:{minHeight:t.minHeight}},t.showWeekNumber&&i.createElement(r.WeekNumberContainer,{elTag:"a",elClasses:["fc-daygrid-week-number"],elAttrs:r.buildNavLinkAttrs(e,l,"week"),date:l,defaultFormat:g}),!c.isDisabled&&(t.showDayNumber||r.hasCustomDayCellContent(o)||t.forceDayTop)?i.createElement("div",{className:"fc-daygrid-day-top"},i.createElement(a,{elTag:"a",elClasses:["fc-daygrid-day-number",d&&"fc-daygrid-month-start"],elAttrs:Object.assign(Object.assign({},r.buildNavLinkAttrs(e,l)),{id:n.dayNumberId})})):t.showDayNumber?i.createElement("div",{className:"fc-daygrid-day-top",style:{visibility:"hidden"}},i.createElement("a",{className:"fc-daygrid-day-number"}," ")):void 0,i.createElement("div",{className:"fc-daygrid-day-events",ref:t.fgContentElRef},t.fgContent,i.createElement("div",{className:"fc-daygrid-day-bottom",style:{marginTop:t.moreMarginTop}},i.createElement(f,{allDayDate:l,singlePlacements:t.singlePlacements,moreCnt:t.moreCnt,alignmentElRef:s,alignGridTop:!t.showDayNumber,extraDateSpan:t.extraDateSpan,dateProfile:t.dateProfile,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,todayRange:t.todayRange}))),i.createElement("div",{className:"fc-daygrid-day-bg"},t.bgContent))))}}function v(e){return e.dayNumberText||i.createElement(i.Fragment,null," ")}function y(e,t,n,i){if(e.firstCol===t&&e.lastCol===n-1)return e;let s=e.eventRange,o=s.range,a=r.intersectRanges(o,{start:i[t].date,end:r.addDays(i[n-1].date,1)});return Object.assign(Object.assign({},e),{firstCol:t,lastCol:n-1,eventRange:{def:s.def,ui:Object.assign(Object.assign({},s.ui),{durationEditable:!1}),instance:s.instance,range:a},isStart:e.isStart&&a.start.valueOf()===o.start.valueOf(),isEnd:e.isEnd&&a.end.valueOf()===o.end.valueOf()})}class _ extends r.SegHierarchy{constructor(){super(...arguments),this.hiddenConsumes=!1,this.forceHidden={}}addSegs(e){const t=super.addSegs(e),{entriesByLevel:n}=this,i=e=>!this.forceHidden[r.buildEntryKey(e)];for(let e=0;e{e&&this.updateSizing(!0)}}render(){let{props:e,state:t,context:n}=this,{options:s}=n,a=e.cells.length,l=o(e.businessHourSegs,a),c=o(e.bgEventSegs,a),d=o(this.getHighlightSegs(),a),u=o(this.getMirrorSegs(),a),{singleColPlacements:h,multiColPlacements:f,moreCnts:p,moreMarginTops:g}=function(e,t,n,r,i,s,o){let a=new _;a.allowReslicing=!0,a.strictOrder=r,!0===t||!0===n?(a.maxCoord=s,a.hiddenConsumes=!0):"number"==typeof t?a.maxStackCnt=t:"number"==typeof n&&(a.maxStackCnt=n,a.hiddenConsumes=!0);let l=[],c=[];for(let t=0;t1,o=r.span.start===e;d+=r.levelCoord-c,c=r.levelCoord+r.thickness,s?(d+=r.thickness,o&&u.push({seg:y(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!0,absoluteTop:r.levelCoord,marginTop:0})):o&&(u.push({seg:y(i,r.span.start,r.span.end,n),isVisible:!0,isAbsolute:!1,absoluteTop:r.levelCoord,marginTop:d}),d=0)}i.push(l),s.push(u),o.push(d)}return{singleColPlacements:i,multiColPlacements:s,leftoverMargins:o}}(u,e,o),g=[],m=[];for(let e of c){f[e.firstCol].push({seg:e,isVisible:!1,isAbsolute:!0,absoluteTop:0,marginTop:0});for(let t=e.firstCol;t<=e.lastCol;t+=1)h[t].push({seg:y(e,t,t+1,o),isVisible:!1,isAbsolute:!1,absoluteTop:0,marginTop:0})}for(let e=0;e{let r=this.renderFgSegs(n,e.forPrint?h[n]:f[n],e.todayRange,v),s=this.renderFgSegs(n,function(e,t){if(!e.length)return[];let n=function(e){let t={};for(let n of e)for(let e of n)t[e.seg.eventRange.instance.instanceId]=e.absoluteTop;return t}(t);return e.map((e=>({seg:e,isVisible:!0,isAbsolute:!0,absoluteTop:n[e.eventRange.instance.instanceId],marginTop:0})))}(u[n],f),e.todayRange,{},Boolean(e.eventDrag),Boolean(e.eventResize),!1);return i.createElement(m,{key:t.key,elRef:this.cellElRefs.createRef(t.key),innerElRef:this.frameElRefs.createRef(t.key),dateProfile:e.dateProfile,date:t.date,showDayNumber:e.showDayNumbers,showWeekNumber:e.showWeekNumbers&&0===n,forceDayTop:e.showWeekNumbers,todayRange:e.todayRange,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,extraRenderProps:t.extraRenderProps,extraDataAttrs:t.extraDataAttrs,extraClassNames:t.extraClassNames,extraDateSpan:t.extraDateSpan,moreCnt:p[n],moreMarginTop:g[n],singlePlacements:h[n],fgContentElRef:this.fgElRefs.createRef(t.key),fgContent:i.createElement(i.Fragment,null,i.createElement(i.Fragment,null,r),i.createElement(i.Fragment,null,s)),bgContent:i.createElement(i.Fragment,null,this.renderFillSegs(d[n],"highlight"),this.renderFillSegs(l[n],"non-business"),this.renderFillSegs(c[n],"bg-event")),minHeight:e.cellMinHeight})})))}componentDidMount(){this.updateSizing(!0),this.context.addResizeHandler(this.handleResize)}componentDidUpdate(e,t){let n=this.props;this.updateSizing(!r.isPropsEqual(e,n))}componentWillUnmount(){this.context.removeResizeHandler(this.handleResize)}getHighlightSegs(){let{props:e}=this;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs}getMirrorSegs(){let{props:e}=this;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]}renderFgSegs(e,t,n,s,o,a,l){let{context:h}=this,{eventSelection:f}=this.props,{framePositions:p}=this.state,g=1===this.props.cells.length,m=o||a||l,v=[];if(p)for(let y of t){let{seg:t}=y,{instanceId:_}=t.eventRange.instance,b=_+":"+e,E=y.isVisible&&!s[_],S=y.isAbsolute,D="",A="";S&&(h.isRtl?(A=0,D=p.lefts[t.lastCol]-p.lefts[t.firstCol]):(D=0,A=p.rights[t.firstCol]-p.rights[t.lastCol])),v.push(i.createElement("div",{className:"fc-daygrid-event-harness"+(S?" fc-daygrid-event-harness-abs":""),key:b,ref:m?null:this.segHarnessRefs.createRef(b),style:{visibility:E?"":"hidden",marginTop:S?"":y.marginTop,top:S?y.absoluteTop:"",left:D,right:A}},c(t)?i.createElement(u,Object.assign({seg:t,isDragging:o,isSelected:_===f,defaultDisplayEventEnd:g},r.getSegMeta(t,n))):i.createElement(d,Object.assign({seg:t,isDragging:o,isResizing:a,isDateSelecting:l,isSelected:_===f,defaultDisplayEventEnd:g},r.getSegMeta(t,n)))))}return v}renderFillSegs(e,t){let{isRtl:n}=this.context,{todayRange:s}=this.props,{framePositions:o}=this.state,a=[];if(o)for(let l of e){let e=n?{right:0,left:o.lefts[l.lastCol]-o.lefts[l.firstCol]}:{left:0,right:o.rights[l.firstCol]-o.rights[l.lastCol]};a.push(i.createElement("div",{key:r.buildEventRangeKey(l.eventRange),className:"fc-daygrid-bg-harness",style:e},"bg-event"===t?i.createElement(r.BgEvent,Object.assign({seg:l},r.getSegMeta(l,s))):r.renderFill(t)))}return i.createElement(i.Fragment,{},...a)}updateSizing(e){let{props:t,state:n,frameElRefs:i}=this;if(!t.forPrint&&null!==t.clientWidth){if(e){let e=t.cells.map((e=>i.currentMap[e.key]));if(e.length){let t=this.rootElRef.current,i=new r.PositionCache(t,e,!0,!1);n.framePositions&&n.framePositions.similarTo(i)||this.setState({framePositions:new r.PositionCache(t,e,!0,!1)})}}const s=this.state.eventInstanceHeights,o=this.queryEventInstanceHeights(),a=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.safeSetState({eventInstanceHeights:Object.assign(Object.assign({},s),o),maxContentHeight:a?this.computeMaxContentHeight():null})}}queryEventInstanceHeights(){let e=this.segHarnessRefs.currentMap,t={};for(let n in e){let r=Math.round(e[n].getBoundingClientRect().height),i=n.split(":")[0];t[i]=Math.max(t[i]||0,r)}return t}computeMaxContentHeight(){let e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top}getCellEls(){let e=this.cellElRefs.currentMap;return this.props.cells.map((t=>e[t.key]))}}b.addStateEquality({eventInstanceHeights:r.isPropsEqual});class E extends r.DateComponent{constructor(){super(...arguments),this.splitBusinessHourSegs=r.memoize(s),this.splitBgEventSegs=r.memoize(s),this.splitFgEventSegs=r.memoize(s),this.splitDateSelectionSegs=r.memoize(s),this.splitEventDrag=r.memoize(a),this.splitEventResize=r.memoize(a),this.rowRefs=new r.RefMap}render(){let{props:e,context:t}=this,n=e.cells.length,s=this.splitBusinessHourSegs(e.businessHourSegs,n),o=this.splitBgEventSegs(e.bgEventSegs,n),a=this.splitFgEventSegs(e.fgEventSegs,n),l=this.splitDateSelectionSegs(e.dateSelectionSegs,n),c=this.splitEventDrag(e.eventDrag,n),d=this.splitEventResize(e.eventResize,n),u=n>=7&&e.clientWidth?e.clientWidth/t.options.aspectRatio/6:null;return i.createElement(r.NowTimer,{unit:"day"},((t,r)=>i.createElement(i.Fragment,null,e.cells.map(((t,h)=>i.createElement(b,{ref:this.rowRefs.createRef(h),key:t.length?t[0].date.toISOString():h,showDayNumbers:n>1,showWeekNumbers:e.showWeekNumbers,todayRange:r,dateProfile:e.dateProfile,cells:t,renderIntro:e.renderRowIntro,businessHourSegs:s[h],eventSelection:e.eventSelection,bgEventSegs:o[h].filter(S),fgEventSegs:a[h],dateSelectionSegs:l[h],eventDrag:c[h],eventResize:d[h],dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,clientWidth:e.clientWidth,clientHeight:e.clientHeight,cellMinHeight:u,forPrint:e.forPrint}))))))}componentDidMount(){const e=this.rowRefs.currentMap[0].getCellEls()[0];this.rootEl=e?e.closest(".fc-daygrid-body"):null,this.rootEl&&this.context.registerInteractiveComponent(this,{el:this.rootEl,isHitComboAllowed:this.props.isHitComboAllowed})}componentWillUnmount(){this.rootEl&&(this.context.unregisterInteractiveComponent(this),this.rootEl=null)}prepareHits(){this.rowPositions=new r.PositionCache(this.rootEl,this.rowRefs.collect().map((e=>e.getCellEls()[0])),!1,!0),this.colPositions=new r.PositionCache(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)}queryHit(e,t){let{colPositions:n,rowPositions:r}=this,i=n.leftToIndex(e),s=r.topToIndex(t);if(null!=s&&null!=i){let e=this.props.cells[s][i];return{dateProfile:this.props.dateProfile,dateSpan:Object.assign({range:this.getCellRange(s,i),allDay:!0},e.extraDateSpan),dayEl:this.getCellEl(s,i),rect:{left:n.lefts[i],right:n.rights[i],top:r.tops[s],bottom:r.bottoms[s]},layer:0}}return null}getCellEl(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]}getCellRange(e,t){let n=this.props.cells[e][t].date;return{start:n,end:r.addDays(n,1)}}}function S(e){return e.eventRange.def.allDay}class D extends r.DateComponent{constructor(){super(...arguments),this.elRef=i.createRef(),this.needsScrollReset=!1}render(){let{props:e}=this,{dayMaxEventRows:t,dayMaxEvents:n,expandRows:r}=e,s=!0===n||!0===t;s&&!r&&(s=!1,t=null,n=null);let o=["fc-daygrid-body",s?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",r?"":"fc-daygrid-body-natural"];return i.createElement("div",{ref:this.elRef,className:o.join(" "),style:{width:e.clientWidth,minWidth:e.tableMinWidth}},i.createElement("table",{role:"presentation",className:"fc-scrollgrid-sync-table",style:{width:e.clientWidth,minWidth:e.tableMinWidth,height:r?e.clientHeight:""}},e.colGroupNode,i.createElement("tbody",{role:"presentation"},i.createElement(E,{dateProfile:e.dateProfile,cells:e.cells,renderRowIntro:e.renderRowIntro,showWeekNumbers:e.showWeekNumbers,clientWidth:e.clientWidth,clientHeight:e.clientHeight,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,dayMaxEvents:n,dayMaxEventRows:t,forPrint:e.forPrint,isHitComboAllowed:e.isHitComboAllowed}))))}componentDidMount(){this.requestScrollReset()}componentDidUpdate(e){e.dateProfile!==this.props.dateProfile?this.requestScrollReset():this.flushScrollReset()}requestScrollReset(){this.needsScrollReset=!0,this.flushScrollReset()}flushScrollReset(){if(this.needsScrollReset&&this.props.clientWidth){const e=function(e,t){let n;return t.currentRangeUnit.match(/year|month/)&&(n=e.querySelector(`[data-date="${r.formatIsoMonthStr(t.currentDate)}-01"]`)),n||(n=e.querySelector(`[data-date="${r.formatDayString(t.currentDate)}"]`)),n}(this.elRef.current,this.props.dateProfile);if(e){const t=e.closest(".fc-daygrid-body"),n=t.closest(".fc-scroller"),r=e.getBoundingClientRect().top-t.getBoundingClientRect().top;n.scrollTop=r?r+1:0}this.needsScrollReset=!1}}}class A extends r.Slicer{constructor(){super(...arguments),this.forceDayIfListItem=!0}sliceRange(e,t){return t.sliceRange(e)}}class C extends r.DateComponent{constructor(){super(...arguments),this.slicer=new A,this.tableRef=i.createRef()}render(){let{props:e,context:t}=this;return i.createElement(D,Object.assign({ref:this.tableRef},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))}}class w extends r.DateProfileGenerator{buildRenderRange(e,t,n){let r=super.buildRenderRange(e,t,n),{props:i}=this;return T({currentRange:r,snapToWeek:/^(year|month)$/.test(t),fixedWeekCount:i.fixedWeekCount,dateEnv:i.dateEnv})}}function T(e){let t,{dateEnv:n,currentRange:i}=e,{start:s,end:o}=i;if(e.snapToWeek&&(s=n.startOfWeek(s),t=n.startOfWeek(o),t.valueOf()!==o.valueOf()&&(o=r.addWeeks(t,1))),e.fixedWeekCount){let e=n.startOfWeek(n.startOfMonth(r.addDays(i.end,-1))),t=Math.ceil(r.diffWeeks(e,o));o=r.addWeeks(o,6-t)}return{start:s,end:o}}class R extends r.DateComponent{constructor(){super(...arguments),this.headerElRef=i.createRef()}renderSimpleLayout(e,t){let{props:n,context:s}=this,o=[],a=r.getStickyHeaderDates(s.options);return e&&o.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),o.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),i.createElement(r.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:s.viewSpec},i.createElement(r.SimpleScrollGrid,{liquid:!n.isHeightAuto&&!n.forPrint,collapsibleWidth:n.forPrint,cols:[],sections:o}))}renderHScrollLayout(e,t,n,s){let o=this.context.pluginHooks.scrollGridImpl;if(!o)throw new Error("No ScrollGrid implementation");let{props:a,context:l}=this,c=!a.forPrint&&r.getStickyHeaderDates(l.options),d=!a.forPrint&&r.getStickyFooterScrollbar(l.options),u=[];return e&&u.push({type:"header",key:"header",isSticky:c,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),u.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),d&&u.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:r.renderScrollShim}]}),i.createElement(r.ViewContainer,{elClasses:["fc-daygrid"],viewSpec:l.viewSpec},i.createElement(o,{liquid:!a.isHeightAuto&&!a.forPrint,forPrint:a.forPrint,collapsibleWidth:a.forPrint,colGroups:[{cols:[{span:n,minWidth:s}]}],sections:u}))}}function O(e,t){let n=new r.DaySeriesModel(e.renderRange,t);return new r.DayTableModel(n,/year|month|week/.test(e.currentRangeUnit))}t.DayGridView=class extends R{constructor(){super(...arguments),this.buildDayTableModel=r.memoize(O),this.headerRef=i.createRef(),this.tableRef=i.createRef()}render(){let{options:e,dateProfileGenerator:t}=this.context,{props:n}=this,s=this.buildDayTableModel(n.dateProfile,t),o=e.dayHeaders&&i.createElement(r.DayHeader,{ref:this.headerRef,dateProfile:n.dateProfile,dates:s.headerDates,datesRepDistinctDays:1===s.rowCnt}),a=t=>i.createElement(C,{ref:this.tableRef,dateProfile:n.dateProfile,dayTableModel:s,businessHours:n.businessHours,dateSelection:n.dateSelection,eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize,nextDayThreshold:e.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.weekNumbers,expandRows:!n.isHeightAuto,headerAlignElRef:this.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:n.forPrint});return e.dayMinWidth?this.renderHScrollLayout(o,a,s.colCnt,e.dayMinWidth):this.renderSimpleLayout(o,a)}},t.DayTable=C,t.DayTableSlicer=A,t.Table=D,t.TableDateProfileGenerator=w,t.TableRows=E,t.TableView=R,t.buildDayTableModel=O,t.buildDayTableRenderRange=T},790:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0});var r=n(553),i=n(368);i.config.touchMouseIgnoreWait=500;let s=0,o=0,a=!1;class l{constructor(e){this.subjectEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=e=>{if(!this.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&this.tryStart(e)){let t=this.createEventFromMouse(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t),this.shouldIgnoreMove||document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp)}},this.handleMouseMove=e=>{let t=this.createEventFromMouse(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleMouseUp=e=>{document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp),this.emitter.trigger("pointerup",this.createEventFromMouse(e)),this.cleanup()},this.handleTouchStart=e=>{if(this.tryStart(e)){this.isTouchDragging=!0;let t=this.createEventFromTouch(e,!0);this.emitter.trigger("pointerdown",t),this.initScrollWatch(t);let n=e.target;this.shouldIgnoreMove||n.addEventListener("touchmove",this.handleTouchMove),n.addEventListener("touchend",this.handleTouchEnd),n.addEventListener("touchcancel",this.handleTouchEnd),window.addEventListener("scroll",this.handleTouchScroll,!0)}},this.handleTouchMove=e=>{let t=this.createEventFromTouch(e);this.recordCoords(t),this.emitter.trigger("pointermove",t)},this.handleTouchEnd=e=>{if(this.isDragging){let t=e.target;t.removeEventListener("touchmove",this.handleTouchMove),t.removeEventListener("touchend",this.handleTouchEnd),t.removeEventListener("touchcancel",this.handleTouchEnd),window.removeEventListener("scroll",this.handleTouchScroll,!0),this.emitter.trigger("pointerup",this.createEventFromTouch(e)),this.cleanup(),this.isTouchDragging=!1,s+=1,setTimeout((()=>{s-=1}),i.config.touchMouseIgnoreWait)}},this.handleTouchScroll=()=>{this.wasTouchScroll=!0},this.handleScroll=e=>{if(!this.shouldIgnoreMove){let t=window.pageXOffset-this.prevScrollX+this.prevPageX,n=window.pageYOffset-this.prevScrollY+this.prevPageY;this.emitter.trigger("pointermove",{origEvent:e,isTouch:this.isTouchDragging,subjectEl:this.subjectEl,pageX:t,pageY:n,deltaX:t-this.origPageX,deltaY:n-this.origPageY})}},this.containerEl=e,this.emitter=new i.Emitter,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),o+=1,1===o&&window.addEventListener("touchmove",c,{passive:!1})}destroy(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),o-=1,o||window.removeEventListener("touchmove",c,{passive:!1})}tryStart(e){let t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!i.elementClosest(n,this.handleSelector)||(this.subjectEl=t,this.isDragging=!0,this.wasTouchScroll=!1,0))}cleanup(){a=!1,this.isDragging=!1,this.subjectEl=null,this.destroyScrollWatch()}querySubjectEl(e){return this.selector?i.elementClosest(e.target,this.selector):this.containerEl}shouldIgnoreMouse(){return s||this.isTouchDragging}cancelTouchScroll(){this.isDragging&&(a=!0)}initScrollWatch(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))}recordCoords(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)}destroyScrollWatch(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)}createEventFromMouse(e,t){let n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}}createEventFromTouch(e,t){let n,r,i=e.touches,s=0,o=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(s=n-this.origPageX,o=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:s,deltaY:o}}}function c(e){a&&e.preventDefault()}class d{constructor(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}start(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()}handleMove(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()}setIsVisible(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)}stop(e,t){let n=()=>{this.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(n,this.revertDuration):setTimeout(n,0)}doRevertAnimation(e,t){let n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",i.applyStyle(n,{left:r.left,top:r.top}),i.whenTransitionDone(n,(()=>{n.style.transition="",e()}))}cleanup(){this.mirrorEl&&(i.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null}updateElPosition(){this.sourceEl&&this.isVisible&&i.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})}getMirrorEl(){let e=this.sourceElRect,t=this.mirrorEl;return t||(t=this.mirrorEl=this.sourceEl.cloneNode(!0),t.style.userSelect="none",t.classList.add("fc-event-dragging"),i.applyStyle(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t}}class u extends i.ScrollController{constructor(e,t){super(),this.handleScroll=()=>{this.scrollTop=this.scrollController.getScrollTop(),this.scrollLeft=this.scrollController.getScrollLeft(),this.handleScrollChange()},this.scrollController=e,this.doesListening=t,this.scrollTop=this.origScrollTop=e.getScrollTop(),this.scrollLeft=this.origScrollLeft=e.getScrollLeft(),this.scrollWidth=e.getScrollWidth(),this.scrollHeight=e.getScrollHeight(),this.clientWidth=e.getClientWidth(),this.clientHeight=e.getClientHeight(),this.clientRect=this.computeClientRect(),this.doesListening&&this.getEventTarget().addEventListener("scroll",this.handleScroll)}destroy(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)}getScrollTop(){return this.scrollTop}getScrollLeft(){return this.scrollLeft}setScrollTop(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())}setScrollLeft(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())}getClientWidth(){return this.clientWidth}getClientHeight(){return this.clientHeight}getScrollWidth(){return this.scrollWidth}getScrollHeight(){return this.scrollHeight}handleScrollChange(){}}class h extends u{constructor(e,t){super(new i.ElementScrollController(e),t)}getEventTarget(){return this.scrollController.el}computeClientRect(){return i.computeInnerRect(this.scrollController.el)}}class f extends u{constructor(e){super(new i.WindowScrollController,e)}getEventTarget(){return window}computeClientRect(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}}handleScrollChange(){this.clientRect=this.computeClientRect()}}const p="function"==typeof performance?performance.now:Date.now;class g{constructor(){this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=()=>{if(this.isAnimating){let e=this.computeBestEdge(this.pointerScreenX+window.pageXOffset,this.pointerScreenY+window.pageYOffset);if(e){let t=p();this.handleSide(e,(t-this.msSinceRequest)/1e3),this.requestAnimation(t)}else this.isAnimating=!1}}}start(e,t,n){this.isEnabled&&(this.scrollCaches=this.buildCaches(n),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))}handleMove(e,t){if(this.isEnabled){let n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,s=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),s<0?this.everMovedLeft=!0:s>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}}stop(){if(this.isEnabled){this.isAnimating=!1;for(let e of this.scrollCaches)e.destroy();this.scrollCaches=null}}requestAnimation(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)}handleSide(e,t){let{scrollCache:n}=e,{edgeThreshold:r}=this,i=r-e.distance,s=i*i/(r*r)*this.maxVelocity*t,o=1;switch(e.name){case"left":o=-1;case"right":n.setScrollLeft(n.getScrollLeft()+s*o);break;case"top":o=-1;case"bottom":n.setScrollTop(n.getScrollTop()+s*o)}}computeBestEdge(e,t){let{edgeThreshold:n}=this,r=null,i=this.scrollCaches||[];for(let s of i){let i=s.clientRect,o=e-i.left,a=i.right-e,l=t-i.top,c=i.bottom-t;o>=0&&a>=0&&l>=0&&c>=0&&(l<=n&&this.everMovedUp&&s.canScrollUp()&&(!r||r.distance>l)&&(r={scrollCache:s,name:"top",distance:l}),c<=n&&this.everMovedDown&&s.canScrollDown()&&(!r||r.distance>c)&&(r={scrollCache:s,name:"bottom",distance:c}),o<=n&&this.everMovedLeft&&s.canScrollLeft()&&(!r||r.distance>o)&&(r={scrollCache:s,name:"left",distance:o}),a<=n&&this.everMovedRight&&s.canScrollRight()&&(!r||r.distance>a)&&(r={scrollCache:s,name:"right",distance:a}))}return r}buildCaches(e){return this.queryScrollEls(e).map((e=>e===window?new f(!1):new h(e,!1)))}queryScrollEls(e){let t=[];for(let n of this.scrollQuery)"object"==typeof n?t.push(n):t.push(...Array.prototype.slice.call(e.getRootNode().querySelectorAll(n)));return t}}class m extends i.ElementDragging{constructor(e,t){super(e),this.containerEl=e,this.delay=null,this.minDistance=0,this.touchScrollAllowed=!0,this.mirrorNeedsRevert=!1,this.isInteracting=!1,this.isDragging=!1,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.delayTimeoutId=null,this.onPointerDown=e=>{this.isDragging||(this.isInteracting=!0,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,i.preventSelection(document.body),i.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),this.emitter.trigger("pointerdown",e),this.isInteracting&&!this.pointer.shouldIgnoreMove&&(this.mirror.setIsVisible(!1),this.mirror.start(e.subjectEl,e.pageX,e.pageY),this.startDelay(e),this.minDistance||this.handleDistanceSurpassed(e)))},this.onPointerMove=e=>{if(this.isInteracting){if(this.emitter.trigger("pointermove",e),!this.isDistanceSurpassed){let t,n=this.minDistance,{deltaX:r,deltaY:i}=e;t=r*r+i*i,t>=n*n&&this.handleDistanceSurpassed(e)}this.isDragging&&("scroll"!==e.origEvent.type&&(this.mirror.handleMove(e.pageX,e.pageY),this.autoScroller.handleMove(e.pageX,e.pageY)),this.emitter.trigger("dragmove",e))}},this.onPointerUp=e=>{this.isInteracting&&(this.isInteracting=!1,i.allowSelection(document.body),i.allowContextMenu(document.body),this.emitter.trigger("pointerup",e),this.isDragging&&(this.autoScroller.stop(),this.tryStopDrag(e)),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null))};let n=this.pointer=new l(e);n.emitter.on("pointerdown",this.onPointerDown),n.emitter.on("pointermove",this.onPointerMove),n.emitter.on("pointerup",this.onPointerUp),t&&(n.selector=t),this.mirror=new d,this.autoScroller=new g}destroy(){this.pointer.destroy(),this.onPointerUp({})}startDelay(e){"number"==typeof this.delay?this.delayTimeoutId=setTimeout((()=>{this.delayTimeoutId=null,this.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)}handleDelayEnd(e){this.isDelayEnded=!0,this.tryStartDrag(e)}handleDistanceSurpassed(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)}tryStartDrag(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY,this.containerEl),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))}tryStopDrag(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))}stopDrag(e){this.isDragging=!1,this.emitter.trigger("dragend",e)}setIgnoreMove(e){this.pointer.shouldIgnoreMove=e}setMirrorIsVisible(e){this.mirror.setIsVisible(e)}setMirrorNeedsRevert(e){this.mirrorNeedsRevert=e}setAutoScrollEnabled(e){this.autoScroller.isEnabled=e}}class v{constructor(e){this.origRect=i.computeRect(e),this.scrollCaches=i.getClippingParents(e).map((e=>new h(e,!0)))}destroy(){for(let e of this.scrollCaches)e.destroy()}computeLeft(){let e=this.origRect.left;for(let t of this.scrollCaches)e+=t.origScrollLeft-t.getScrollLeft();return e}computeTop(){let e=this.origRect.top;for(let t of this.scrollCaches)e+=t.origScrollTop-t.getScrollTop();return e}isWithinClipping(e,t){let n={left:e,top:t};for(let e of this.scrollCaches)if(!y(e.getEventTarget())&&!i.pointInsideRect(n,e.clientRect))return!1;return!0}}function y(e){let t=e.tagName;return"HTML"===t||"BODY"===t}class _{constructor(e,t){this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=e=>{let{dragging:t}=this;this.initialHit=null,this.movingHit=null,this.finalHit=null,this.prepareHits(),this.processFirstCoord(e),this.initialHit||!this.requireInitial?(t.setIgnoreMove(!1),this.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=e=>{this.emitter.trigger("dragstart",e),this.handleMove(e,!0)},this.handleDragMove=e=>{this.emitter.trigger("dragmove",e),this.handleMove(e)},this.handlePointerUp=e=>{this.releaseHits(),this.emitter.trigger("pointerup",e)},this.handleDragEnd=e=>{this.movingHit&&this.emitter.trigger("hitupdate",null,!0,e),this.finalHit=this.movingHit,this.movingHit=null,this.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new i.Emitter}processFirstCoord(e){let t,n={left:e.pageX,top:e.pageY},r=n,s=e.subjectEl;s instanceof HTMLElement&&(t=i.computeRect(s),r=i.constrainPoint(r,t));let o=this.initialHit=this.queryHitForOffset(r.left,r.top);if(o){if(this.useSubjectCenter&&t){let e=i.intersectRects(t,o.rect);e&&(r=i.getRectCenter(e))}this.coordAdjust=i.diffPoints(r,n)}else this.coordAdjust={left:0,top:0}}handleMove(e,t){let n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&b(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))}prepareHits(){this.offsetTrackers=i.mapHash(this.droppableStore,(e=>(e.component.prepareHits(),new v(e.el))))}releaseHits(){let{offsetTrackers:e}=this;for(let t in e)e[t].destroy();this.offsetTrackers={}}queryHitForOffset(e,t){let{droppableStore:n,offsetTrackers:r}=this,s=null;for(let o in n){let a=n[o].component,l=r[o];if(l&&l.isWithinClipping(e,t)){let n=l.computeLeft(),r=l.computeTop(),c=e-n,d=t-r,{origRect:u}=l,h=u.right-u.left,f=u.bottom-u.top;if(c>=0&&c=0&&ds.layer)&&(e.componentId=o,e.context=a.context,e.rect.left+=n,e.rect.right+=n,e.rect.top+=r,e.rect.bottom+=r,s=e)}}}return s}}function b(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&i.isDateSpansEqual(e.dateSpan,t.dateSpan)}function E(e,t){let n={};for(let r of t.pluginHooks.datePointTransforms)Object.assign(n,r(e,t));var r,i;return Object.assign(n,(r=e,{date:(i=t.dateEnv).toDate(r.range.start),dateStr:i.formatIso(r.range.start,{omitTime:r.allDay}),allDay:r.allDay})),n}class S extends i.Interaction{constructor(e){super(e),this.handlePointerDown=e=>{let{dragging:t}=this,n=e.origEvent.target;t.setIgnoreMove(!this.component.isValidDateDownEl(n))},this.handleDragEnd=e=>{let{component:t}=this,{pointer:n}=this.dragging;if(!n.wasTouchScroll){let{initialHit:n,finalHit:r}=this.hitDragging;if(n&&r&&b(n,r)){let{context:r}=t,i=Object.assign(Object.assign({},E(n.dateSpan,r)),{dayEl:n.dayEl,jsEvent:e.origEvent,view:r.viewApi||r.calendarApi.view});r.emitter.trigger("dateClick",i)}}},this.dragging=new m(e.el),this.dragging.autoScroller.isEnabled=!1;let t=this.hitDragging=new _(this.dragging,i.interactionSettingsToStore(e));t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}}class D extends i.Interaction{constructor(e){super(e),this.dragSelection=null,this.handlePointerDown=e=>{let{component:t,dragging:n}=this,{options:r}=t.context,i=r.selectable&&t.isValidDateDownEl(e.origEvent.target);n.setIgnoreMove(!i),n.delay=e.isTouch?function(e){let{options:t}=e.context,n=t.selectLongPressDelay;return null==n&&(n=t.longPressDelay),n}(t):null},this.handleDragStart=e=>{this.component.context.calendarApi.unselect(e)},this.handleHitUpdate=(e,t)=>{let{context:n}=this.component,r=null,s=!1;if(e){let t=this.hitDragging.initialHit;e.componentId===t.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(t,e)||(r=function(e,t,n){let r=e.dateSpan,s=t.dateSpan,o=[r.range.start,r.range.end,s.range.start,s.range.end];o.sort(i.compareNumbers);let a={};for(let r of n){let n=r(e,t);if(!1===n)return null;n&&Object.assign(a,n)}return a.range={start:o[0],end:o[3]},a.allDay=r.allDay,a}(t,e,n.pluginHooks.dateSelectionTransformers)),r&&i.isDateSelectionValid(r,e.dateProfile,n)||(s=!0,r=null)}r?n.dispatch({type:"SELECT_DATES",selection:r}):t||n.dispatch({type:"UNSELECT_DATES"}),s?i.disableCursor():i.enableCursor(),t||(this.dragSelection=r)},this.handlePointerUp=e=>{this.dragSelection&&(i.triggerDateSelect(this.dragSelection,e,this.component.context),this.dragSelection=null)};let{component:t}=e,{options:n}=t.context,r=this.dragging=new m(e.el);r.touchScrollAllowed=!1,r.minDistance=n.selectMinDistance||0,r.autoScroller.isEnabled=n.dragScroll;let s=this.hitDragging=new _(this.dragging,i.interactionSettingsToStore(e));s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.dragging.destroy()}}class A extends i.Interaction{constructor(e){super(e),this.subjectEl=null,this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let t=e.origEvent.target,{component:n,dragging:r}=this,{mirror:s}=r,{options:o}=n.context,a=n.context;this.subjectEl=e.subjectEl;let l=this.subjectSeg=i.getElSeg(e.subjectEl),c=(this.eventRange=l.eventRange).instance.instanceId;this.relevantEvents=i.getRelevantEvents(a.getCurrentData().eventStore,c),r.minDistance=e.isTouch?0:o.eventDragMinDistance,r.delay=e.isTouch&&c!==n.props.eventSelection?function(e){let{options:t}=e.context,n=t.eventLongPressDelay;return null==n&&(n=t.longPressDelay),n}(n):null,o.fixedMirrorParent?s.parentNode=o.fixedMirrorParent:s.parentNode=i.elementClosest(t,".fc"),s.revertDuration=o.dragRevertDuration;let d=n.isValidSegDownEl(t)&&!i.elementClosest(t,".fc-event-resizer");r.setIgnoreMove(!d),this.isDragging=d&&e.subjectEl.classList.contains("fc-event-draggable")},this.handleDragStart=e=>{let t=this.component.context,n=this.eventRange,r=n.instance.instanceId;e.isTouch?r!==this.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),this.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:this.subjectEl,event:new i.EventImpl(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},this.handleHitUpdate=(e,t)=>{if(!this.isDragging)return;let n=this.relevantEvents,r=this.hitDragging.initialHit,s=this.component.context,o=null,a=null,l=null,c=!1,d={affectedEvents:n,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};if(e){o=e.context;let t=o.options;s===o||t.editable&&t.droppable?(a=function(e,t,n){let r=e.dateSpan,s=t.dateSpan,o=r.range.start,a=s.range.start,l={};r.allDay!==s.allDay&&(l.allDay=s.allDay,l.hasEnd=t.context.options.allDayMaintainDuration,s.allDay&&(o=i.startOfDay(o)));let c=i.diffDates(o,a,e.context.dateEnv,e.componentId===t.componentId?e.largeUnit:null);c.milliseconds&&(l.allDay=!1);let d={datesDelta:c,standardProps:l};for(let r of n)r(d,e,t);return d}(r,e,o.getCurrentData().pluginHooks.eventDragMutationMassagers),a&&(l=i.applyMutationToEventStore(n,o.getCurrentData().eventUiBases,a,o),d.mutatedEvents=l,i.isInteractionValid(d,e.dateProfile,o)||(c=!0,a=null,l=null,d.mutatedEvents=i.createEmptyEventStore()))):o=null}this.displayDrag(o,d),c?i.disableCursor():i.enableCursor(),t||(s===o&&b(r,e)&&(a=null),this.dragging.setMirrorNeedsRevert(!a),this.dragging.setMirrorIsVisible(!e||!this.subjectEl.getRootNode().querySelector(".fc-event-mirror")),this.receivingContext=o,this.validMutation=a,this.mutatedRelevantEvents=l)},this.handlePointerUp=()=>{this.isDragging||this.cleanup()},this.handleDragEnd=e=>{if(this.isDragging){let t=this.component.context,n=t.viewApi,{receivingContext:r,validMutation:s}=this,o=this.eventRange.def,a=this.eventRange.instance,l=new i.EventImpl(t,o,a),c=this.relevantEvents,d=this.mutatedRelevantEvents,{finalHit:u}=this.hitDragging;if(this.clearDrag(),t.emitter.trigger("eventDragStop",{el:this.subjectEl,event:l,jsEvent:e.origEvent,view:n}),s){if(r===t){let r=new i.EventImpl(t,d.defs[o.defId],a?d.instances[a.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:d});let u={oldEvent:l,event:r,relatedEvents:i.buildEventApis(d,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}},h={};for(let e of t.getCurrentData().pluginHooks.eventDropTransformers)Object.assign(h,e(s,t));t.emitter.trigger("eventDrop",Object.assign(Object.assign(Object.assign({},u),h),{el:e.subjectEl,delta:s.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",u)}else if(r){let s={event:l,relatedEvents:i.buildEventApis(c,t,a),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:c})}};t.emitter.trigger("eventLeave",Object.assign(Object.assign({},s),{draggedEl:e.subjectEl,view:n})),t.dispatch({type:"REMOVE_EVENTS",eventStore:c}),t.emitter.trigger("eventRemove",s);let h=d.defs[o.defId],f=d.instances[a.instanceId],p=new i.EventImpl(r,h,f);r.dispatch({type:"MERGE_EVENTS",eventStore:d});let g={event:p,relatedEvents:i.buildEventApis(d,r,f),revert(){r.dispatch({type:"REMOVE_EVENTS",eventStore:d})}};r.emitter.trigger("eventAdd",g),e.isTouch&&r.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instanceId}),r.emitter.trigger("drop",Object.assign(Object.assign({},E(u.dateSpan,r)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:u.context.viewApi})),r.emitter.trigger("eventReceive",Object.assign(Object.assign({},g),{draggedEl:e.subjectEl,view:u.context.viewApi}))}}else t.emitter.trigger("_noEventDrop")}this.cleanup()};let{component:t}=this,{options:n}=t.context,r=this.dragging=new m(e.el);r.pointer.selector=A.SELECTOR,r.touchScrollAllowed=!1,r.autoScroller.isEnabled=n.dragScroll;let s=this.hitDragging=new _(this.dragging,i.interactionSettingsStore);s.useSubjectCenter=e.useEventCenter,s.emitter.on("pointerdown",this.handlePointerDown),s.emitter.on("dragstart",this.handleDragStart),s.emitter.on("hitupdate",this.handleHitUpdate),s.emitter.on("pointerup",this.handlePointerUp),s.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}displayDrag(e,t){let n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:i.createEmptyEventStore(),isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){let e=this.component.context,{receivingContext:t}=this;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})}cleanup(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null}}A.SELECTOR=".fc-event-draggable, .fc-event-resizable";class C extends i.Interaction{constructor(e){super(e),this.draggingSegEl=null,this.draggingSeg=null,this.eventRange=null,this.relevantEvents=null,this.validMutation=null,this.mutatedRelevantEvents=null,this.handlePointerDown=e=>{let{component:t}=this,n=this.querySegEl(e),r=i.getElSeg(n),s=this.eventRange=r.eventRange;this.dragging.minDistance=t.context.options.eventDragMinDistance,this.dragging.setIgnoreMove(!this.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&this.component.props.eventSelection!==s.instance.instanceId)},this.handleDragStart=e=>{let{context:t}=this.component,n=this.eventRange;this.relevantEvents=i.getRelevantEvents(t.getCurrentData().eventStore,this.eventRange.instance.instanceId);let r=this.querySegEl(e);this.draggingSegEl=r,this.draggingSeg=i.getElSeg(r),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:r,event:new i.EventImpl(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi})},this.handleHitUpdate=(e,t,n)=>{let{context:r}=this.component,s=this.relevantEvents,o=this.hitDragging.initialHit,a=this.eventRange.instance,l=null,c=null,d=!1,u={affectedEvents:s,mutatedEvents:i.createEmptyEventStore(),isEvent:!0};e&&(e.componentId===o.componentId&&this.isHitComboAllowed&&!this.isHitComboAllowed(o,e)||(l=function(e,t,n,r){let s=e.context.dateEnv,o=e.dateSpan.range.start,a=t.dateSpan.range.start,l=i.diffDates(o,a,s,e.largeUnit);if(n){if(s.add(r.start,l)r.start)return{endDelta:l};return null}(o,e,n.subjectEl.classList.contains("fc-event-resizer-start"),a.range))),l&&(c=i.applyMutationToEventStore(s,r.getCurrentData().eventUiBases,l,r),u.mutatedEvents=c,i.isInteractionValid(u,e.dateProfile,r)||(d=!0,l=null,c=null,u.mutatedEvents=null)),c?r.dispatch({type:"SET_EVENT_RESIZE",state:u}):r.dispatch({type:"UNSET_EVENT_RESIZE"}),d?i.disableCursor():i.enableCursor(),t||(l&&b(o,e)&&(l=null),this.validMutation=l,this.mutatedRelevantEvents=c)},this.handleDragEnd=e=>{let{context:t}=this.component,n=this.eventRange.def,r=this.eventRange.instance,s=new i.EventImpl(t,n,r),o=this.relevantEvents,a=this.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:this.draggingSegEl,event:s,jsEvent:e.origEvent,view:t.viewApi}),this.validMutation){let l=new i.EventImpl(t,a.defs[n.defId],r?a.instances[r.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:a});let c={oldEvent:s,event:l,relatedEvents:i.buildEventApis(a,t,r),revert(){t.dispatch({type:"MERGE_EVENTS",eventStore:o})}};t.emitter.trigger("eventResize",Object.assign(Object.assign({},c),{el:this.draggingSegEl,startDelta:this.validMutation.startDelta||i.createDuration(0),endDelta:this.validMutation.endDelta||i.createDuration(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");this.draggingSeg=null,this.relevantEvents=null,this.validMutation=null};let{component:t}=e,n=this.dragging=new m(e.el);n.pointer.selector=".fc-event-resizer",n.touchScrollAllowed=!1,n.autoScroller.isEnabled=t.context.options.dragScroll;let r=this.hitDragging=new _(this.dragging,i.interactionSettingsToStore(e));r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),r.emitter.on("hitupdate",this.handleHitUpdate),r.emitter.on("dragend",this.handleDragEnd)}destroy(){this.dragging.destroy()}querySegEl(e){return i.elementClosest(e.subjectEl,".fc-event")}}const w={fixedMirrorParent:i.identity},T={dateClick:i.identity,eventDragStart:i.identity,eventDragStop:i.identity,eventDrop:i.identity,eventResizeStart:i.identity,eventResizeStop:i.identity,eventResize:i.identity,drop:i.identity,eventReceive:i.identity,eventLeave:i.identity};class R{constructor(e,t){this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=e=>{this.dragMeta=this.buildDragMeta(e.subjectEl)},this.handleHitUpdate=(e,t,n)=>{let{dragging:r}=this.hitDragging,s=null,o=null,a=!1,l={affectedEvents:i.createEmptyEventStore(),mutatedEvents:i.createEmptyEventStore(),isEvent:this.dragMeta.create};e&&(s=e.context,this.canDropElOnCalendar(n.subjectEl,s)&&(o=function(e,t,n){let r=Object.assign({},t.leftoverProps);for(let i of n.pluginHooks.externalDefTransforms)Object.assign(r,i(e,t));let{refined:s,extra:o}=i.refineEventDef(r,n),a=i.parseEventDef(s,o,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),l=e.range.start;e.allDay&&t.startTime&&(l=n.dateEnv.add(l,t.startTime));let c=t.duration?n.dateEnv.add(l,t.duration):i.getDefaultEventEnd(e.allDay,l,n);return{def:a,instance:i.createEventInstance(a.defId,{start:l,end:c})}}(e.dateSpan,this.dragMeta,s),l.mutatedEvents=i.eventTupleToStore(o),a=!i.isInteractionValid(l,e.dateProfile,s),a&&(l.mutatedEvents=i.createEmptyEventStore(),o=null))),this.displayDrag(s,l),r.setMirrorIsVisible(t||!o||!document.querySelector(".fc-event-mirror")),a?i.disableCursor():i.enableCursor(),t||(r.setMirrorNeedsRevert(!o),this.receivingContext=s,this.droppableEvent=o)},this.handleDragEnd=e=>{let{receivingContext:t,droppableEvent:n}=this;if(this.clearDrag(),t&&n){let r=this.hitDragging.finalHit,s=r.context.viewApi,o=this.dragMeta;if(t.emitter.trigger("drop",Object.assign(Object.assign({},E(r.dateSpan,t)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s})),o.create){let r=i.eventTupleToStore(n);t.dispatch({type:"MERGE_EVENTS",eventStore:r}),e.isTouch&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:n.instance.instanceId}),t.emitter.trigger("eventReceive",{event:new i.EventImpl(t,n.def,n.instance),relatedEvents:[],revert(){t.dispatch({type:"REMOVE_EVENTS",eventStore:r})},draggedEl:e.subjectEl,view:s})}}this.receivingContext=null,this.droppableEvent=null};let n=this.hitDragging=new _(e,i.interactionSettingsStore);n.requireInitial=!1,n.emitter.on("dragstart",this.handleDragStart),n.emitter.on("hitupdate",this.handleHitUpdate),n.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}buildDragMeta(e){return"object"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?i.parseDragMeta(this.suppliedDragMeta(e)):function(e){let t=function(e,t){let n=i.config.dataAttrPrefix,r=(n?n+"-":"")+"event";return e.getAttribute("data-"+r)||""}(e),n=t?JSON.parse(t):{create:!1};return i.parseDragMeta(n)}(e)}displayDrag(e,t){let n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})}clearDrag(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})}canDropElOnCalendar(e,t){let n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(i.elementMatches(e,n))}}i.config.dataAttrPrefix="";class O extends i.ElementDragging{constructor(e){super(e),this.shouldIgnoreMove=!1,this.mirrorSelector="",this.currentMirrorEl=null,this.handlePointerDown=e=>{this.emitter.trigger("pointerdown",e),this.shouldIgnoreMove||this.emitter.trigger("dragstart",e)},this.handlePointerMove=e=>{this.shouldIgnoreMove||this.emitter.trigger("dragmove",e)},this.handlePointerUp=e=>{this.emitter.trigger("pointerup",e),this.shouldIgnoreMove||this.emitter.trigger("dragend",e)};let t=this.pointer=new l(e);t.emitter.on("pointerdown",this.handlePointerDown),t.emitter.on("pointermove",this.handlePointerMove),t.emitter.on("pointerup",this.handlePointerUp)}destroy(){this.pointer.destroy()}setIgnoreMove(e){this.shouldIgnoreMove=e}setMirrorIsVisible(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{let e=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;e&&(this.currentMirrorEl=e,e.style.visibility="hidden")}}}var x=r.createPlugin({name:"@fullcalendar/interaction",componentInteractions:[S,D,A,C],calendarInteractions:[class{constructor(e){this.context=e,this.isRecentPointerDateSelect=!1,this.matchesCancel=!1,this.matchesEvent=!1,this.onSelect=e=>{e.jsEvent&&(this.isRecentPointerDateSelect=!0)},this.onDocumentPointerDown=e=>{let t=this.context.options.unselectCancel,n=i.getEventTargetViaRoot(e.origEvent);this.matchesCancel=!!i.elementClosest(n,t),this.matchesEvent=!!i.elementClosest(n,A.SELECTOR)},this.onDocumentPointerUp=e=>{let{context:t}=this,{documentPointer:n}=this,r=t.getCurrentData();if(!n.wasTouchScroll){if(r.dateSelection&&!this.isRecentPointerDateSelect){let n=t.options.unselectAuto;!n||n&&this.matchesCancel||t.calendarApi.unselect(e)}r.eventSelection&&!this.matchesEvent&&t.dispatch({type:"UNSELECT_EVENT"})}this.isRecentPointerDateSelect=!1};let t=this.documentPointer=new l(document);t.shouldIgnoreMove=!0,t.shouldWatchScroll=!1,t.emitter.on("pointerdown",this.onDocumentPointerDown),t.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}destroy(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()}}],elementDraggingImpl:m,optionRefiners:w,listenerRefiners:T});t.Draggable=class{constructor(e,t={}){this.handlePointerDown=e=>{let{dragging:t}=this,{minDistance:n,longPressDelay:r}=this.settings;t.minDistance=null!=n?n:e.isTouch?0:i.BASE_OPTION_DEFAULTS.eventDragMinDistance,t.delay=e.isTouch?null!=r?r:i.BASE_OPTION_DEFAULTS.longPressDelay:0},this.handleDragStart=e=>{e.isTouch&&this.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&this.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;let n=this.dragging=new m(e);n.touchScrollAllowed=!1,null!=t.itemSelector&&(n.pointer.selector=t.itemSelector),null!=t.appendTo&&(n.mirror.parentNode=t.appendTo),n.emitter.on("pointerdown",this.handlePointerDown),n.emitter.on("dragstart",this.handleDragStart),new R(n,t.eventData)}destroy(){this.dragging.destroy()}},t.ThirdPartyDraggable=class{constructor(e,t){let n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};let r=this.dragging=new O(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new R(r,t.eventData)}destroy(){this.dragging.destroy()}},t.default=x},684:e=>{e.exports=JSON.parse('{"category":[{"id":"etoh","label":"Alcohol"},{"id":"cn","label":"Cannabis"},{"id":"nic","label":"Nicotine"},{"id":"stim","label":"Stimulants"},{"id":"coc","label":"Cocaine"},{"id":"opi","label":"Opioids"},{"id":"hall","label":"Hallucinogens"},{"id":"diss","label":"Dissociatives"},{"id":"inh","label":"Inhalants"},{"id":"sdh","label":"Sedatives, Hypnotics or Anxiolytics"},{"id":"misc","label":"Miscellaneous"}],"substance":{"etoh":[{"label":"Alcohol","units":["standard drinks"]}],"cn":[{"label":"Smoked Cannabis","type":["Joints","Blunts","Bowls","Bongs"],"units":["joints","blunts","bowls","bongs","grams","milligrams","ounces","hits"]},{"label":"Vaped Cannabis","type":["Vape pen"],"units":["hits"]},{"label":"Spliffs","alt":"Cannabis/Nicotine Joints","units":["spliffs","grams","milligrams","hits"]},{"label":"Oral Cannabis","type":["Edibles","Infused Non-Alcoholic Drinks"],"units":["grams","milligrams","drinks"]},{"label":"Cannabis-Infused Alcohol","units":["standard drinks"]},{"label":"Synthetic Cannabis","alt":"K2","units":["grams","milligrams","ounces"]},{"label":"MJ Concentrates","units":["milligrams"]},{"label":"Tincture","units":["milliliters","drops"]},{"label":"Topical","units":["grams","milligrams","percent"]},{"label":"Other Cannabis","note":"Substance Name"}],"nic":[{"label":"Smoked Tobacco","type":["Cigarettes","Cigars","Pipes","Cigarillos"],"units":["cigarettes","cigars","pipes","cigarillos","hits"]},{"label":"E-Cigarettes","units":["hits"]},{"label":"Hookah","units":["hits"]},{"label":"Smokeless Tobacco","alt:":"Chewing Tobacco, Zyns, Snuff","type":["Chewing Tobacco","Nicotine Pouches","Snuff"],"units":["milligrams","pinches"]},{"label":"Other Nioctine","note":"Substance Name"}],"stim":[{"label":"Stimulant Medications","type":["Ritalin/Concerta","Adderall","Vyvanse"],"units":["tablets","milligrams"]},{"label":"Methamphetamine","type":["Powder/Speed","Ice/Crystal","Pills","Base"],"units":["grams","points"]},{"label":"Other Stimulant","note":"Substance Name"}],"coc":[{"label":"Cocaine","type":["Crack","Powder"],"units":["grams","lines"]}],"opi":[{"label":"Heroin","type":["Injected","Snorted","Smoked"],"units":["caps","grams"]},{"label":"Fentanyl","type":["Injected","Snorted","Smoked","Oral"],"units":["micrograms"]},{"label":"Opioid Medications","type":["Codeine","OxyContin","Vicodin","Percocet"],"units":["tablets","milligrams"],"note":"Substance Name (Not Specified Above)"},{"label":"Lean","alt":"Codeine/Alcohol Drink","units":["milligrams","drinks"]},{"label":"Other Opioid","note":"Substance Name"}],"hall":[{"label":"LSD","alt":"Acid","units":["micrograms","tablets"]},{"label":"Psilocybin","alt":"Mushrooms","units":["grams","mushrooms"]},{"label":"MDMA","alt":"Ecstasy, Molly","units":["milligrams","tablets"]},{"label":"Mescaline","alt":"Peyote","units":["milligrams","tablets","drinks"]},{"label":"Other Hallucinogen","note":"Substance Name"}],"diss":[{"label":"Ketamine","type":["Oral","Snorted","Injected"],"units":["milligrams","bumps","lines"]},{"label":"PCP","type":["Injected","Snorted","Smoked","Oral"],"units":["milligrams","tablets"]},{"label":"Other Dissociative","note":"Substance Name"}],"inh":[{"label":"Nitrous Oxide","alt":"Whippits","units":["cartridges"]},{"label":"Amyl Nitrate","alt":"Poppers","units":["bottles"]},{"label":"Aerosols","type":["Hairspray","Spray Paint"]},{"label":"Solvents","type":["Glue","Paint Thinner"]},{"label":"Other Inhalant","note":"Substance Name"}],"sdh":[{"label":"Benzodiazepines","alt":"Benzos","type":["Xanax","Valium","Ativan","Klonopin","Rohypnol"],"units":["milligrams","tablets"]},{"label":"Barbiturates","type":["Phenobarbital","Butalbital","Secobarbital","Pentobarbital"],"units":["milligrams","tablets"]},{"label":"Sleeping pills","alt":"Z Drugs","type":["Ambien","Lunesta","Sonata"],"units":["milligrams","tablets"]},{"label":"GHB","units":["grams","caps"]},{"label":"Quaaludes","units":["milligrams","tablets"]},{"label":"Other Sedative/Hypnotic/Anxiolytic","note":"Substance Name"}],"misc":[{"label":"Dextromethorphan","alt":"DXM, cough syrup","units":["milligrams"]},{"label":"Anabolic steroids","type":["Injected","Oral","Topical"],"units":["units","tablets"]},{"label":"Other Substance","note":"Substance Name"}]}}')}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n(519)})(); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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aWpHLFNBQVNweUQsU0FDbEIsR0FjSjltQixFQUFpQixRQUFJcEUsQywrcUlDdmpFakJtbEYsRUFBMkIsQ0FBQyxFQUdoQyxTQUFTQyxFQUFvQkMsR0FFNUIsSUFBSUMsRUFBZUgsRUFBeUJFLEdBQzVDLFFBQXFCajRGLElBQWpCazRGLEVBQ0gsT0FBT0EsRUFBYWxoRixRQUdyQixJQUFJbWhGLEVBQVNKLEVBQXlCRSxHQUFZLENBR2pEamhGLFFBQVMsQ0FBQyxHQU9YLE9BSEFvaEYsRUFBb0JILEdBQVVqckcsS0FBS21yRyxFQUFPbmhGLFFBQVNtaEYsRUFBUUEsRUFBT25oRixRQUFTZ2hGLEdBR3BFRyxFQUFPbmhGLE9BQ2YsQ0NyQkFnaEYsRUFBb0Joc0csRUFBSSxDQUFDZ3JCLEVBQVNxaEYsS0FDakMsSUFBSSxJQUFJLytGLEtBQU8rK0YsRUFDWEwsRUFBb0I3c0csRUFBRWt0RyxFQUFZLytGLEtBQVMwK0YsRUFBb0I3c0csRUFBRTZyQixFQUFTMWQsSUFDNUU1RixPQUFPQyxlQUFlcWpCLEVBQVMxZCxFQUFLLENBQUVoRSxZQUFZLEVBQU12QyxJQUFLc2xHLEVBQVcvK0YsSUFFMUUsRUNORDArRixFQUFvQjdzRyxFQUFJLENBQUNtL0MsRUFBS2xpQyxJQUFVMVUsT0FBTzlELFVBQVVvUyxlQUFlaFYsS0FBS3M5QyxFQUFLbGlDLEdDQ2xGNHZGLEVBQW9CaHRHLEVBQUtnc0IsSUFDSCxvQkFBWDdtQixRQUEwQkEsT0FBT21vRyxhQUMxQzVrRyxPQUFPQyxlQUFlcWpCLEVBQVM3bUIsT0FBT21vRyxZQUFhLENBQUVycUcsTUFBTyxXQUU3RHlGLE9BQU9DLGVBQWVxakIsRUFBUyxhQUFjLENBQUUvb0IsT0FBTyxHQUFPLEVDRnBDK3BHLEVBQW9CLEkiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90bGZiLy4vbm9kZV9tb2R1bGVzL3ByZWFjdC9ob29rcy9kaXN0L2hvb2tzLm1vZHVsZS5qcyIsIndlYnBhY2s6Ly90bGZiLy4vbm9kZV9tb2R1bGVzL3ByZWFjdC9jb21wYXQvZGlzdC9jb21wYXQubW9kdWxlLmpzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvcHJlYWN0L2Rpc3QvcHJlYWN0Lm1vZHVsZS5qcyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL2NhbGN1bGF0ZS50cyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL2VkaXRvci50cyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL2ZpbGUudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9tYWluLnRzIiwid2VicGFjazovL3RsZmIvLi9zcmMvbW9kYWwudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL3NyYy9zdGF0ZS50cyIsIndlYnBhY2s6Ly90bGZiLy4vc3JjL3V0aWwudHMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2NvcmUvaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9jb3JlL2ludGVybmFsLWNvbW1vbi5janMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2NvcmUvaW50ZXJuYWwuY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9jb3JlL3ByZWFjdC5janMiLCJ3ZWJwYWNrOi8vdGxmYi8uL25vZGVfbW9kdWxlcy9AZnVsbGNhbGVuZGFyL2RheWdyaWQvaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvLi9ub2RlX21vZHVsZXMvQGZ1bGxjYWxlbmRhci9kYXlncmlkL2ludGVybmFsLmNqcyIsIndlYnBhY2s6Ly90bGZiLy4vbm9kZV9tb2R1bGVzL0BmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb24vaW5kZXguY2pzIiwid2VicGFjazovL3RsZmIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vdGxmYi93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vdGxmYi93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RsZmIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90bGZiL3dlYnBhY2svc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnR7b3B0aW9ucyBhcyBufWZyb21cInByZWFjdFwiO3ZhciB0LHIsdSxpLG89MCxmPVtdLGM9W10sZT1uLl9fYixhPW4uX19yLHY9bi5kaWZmZWQsbD1uLl9fYyxtPW4udW5tb3VudDtmdW5jdGlvbiBkKHQsdSl7bi5fX2gmJm4uX19oKHIsdCxvfHx1KSxvPTA7dmFyIGk9ci5fX0h8fChyLl9fSD17X186W10sX19oOltdfSk7cmV0dXJuIHQ+PWkuX18ubGVuZ3RoJiZpLl9fLnB1c2goe19fVjpjfSksaS5fX1t0XX1mdW5jdGlvbiBwKG4pe3JldHVybiBvPTEseShCLG4pfWZ1bmN0aW9uIHkobix1LGkpe3ZhciBvPWQodCsrLDIpO2lmKG8udD1uLCFvLl9fYyYmKG8uX189W2k/aSh1KTpCKHZvaWQgMCx1KSxmdW5jdGlvbihuKXt2YXIgdD1vLl9fTj9vLl9fTlswXTpvLl9fWzBdLHI9by50KHQsbik7dCE9PXImJihvLl9fTj1bcixvLl9fWzFdXSxvLl9fYy5zZXRTdGF0ZSh7fSkpfV0sby5fX2M9ciwhci51KSl7ci51PSEwO3ZhciBmPXIuc2hvdWxkQ29tcG9uZW50VXBkYXRlO3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlPWZ1bmN0aW9uKG4sdCxyKXtpZighby5fX2MuX19IKXJldHVybiEwO3ZhciB1PW8uX19jLl9fSC5fXy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4uX19jfSk7aWYodS5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4hbi5fX059KSlyZXR1cm4hZnx8Zi5jYWxsKHRoaXMsbix0LHIpO3ZhciBpPSExO3JldHVybiB1LmZvckVhY2goZnVuY3Rpb24obil7aWYobi5fX04pe3ZhciB0PW4uX19bMF07bi5fXz1uLl9fTixuLl9fTj12b2lkIDAsdCE9PW4uX19bMF0mJihpPSEwKX19KSwhKCFpJiZvLl9fYy5wcm9wcz09PW4pJiYoIWZ8fGYuY2FsbCh0aGlzLG4sdCxyKSl9fXJldHVybiBvLl9fTnx8by5fX31mdW5jdGlvbiBoKHUsaSl7dmFyIG89ZCh0KyssMyk7IW4uX19zJiZ6KG8uX19ILGkpJiYoby5fXz11LG8uaT1pLHIuX19ILl9faC5wdXNoKG8pKX1mdW5jdGlvbiBzKHUsaSl7dmFyIG89ZCh0KyssNCk7IW4uX19zJiZ6KG8uX19ILGkpJiYoby5fXz11LG8uaT1pLHIuX19oLnB1c2gobykpfWZ1bmN0aW9uIF8obil7cmV0dXJuIG89NSxGKGZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bn19LFtdKX1mdW5jdGlvbiBBKG4sdCxyKXtvPTYscyhmdW5jdGlvbigpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4/KG4odCgpKSxmdW5jdGlvbigpe3JldHVybiBuKG51bGwpfSk6bj8obi5jdXJyZW50PXQoKSxmdW5jdGlvbigpe3JldHVybiBuLmN1cnJlbnQ9bnVsbH0pOnZvaWQgMH0sbnVsbD09cj9yOnIuY29uY2F0KG4pKX1mdW5jdGlvbiBGKG4scil7dmFyIHU9ZCh0KyssNyk7cmV0dXJuIHoodS5fX0gscik/KHUuX19WPW4oKSx1Lmk9cix1Ll9faD1uLHUuX19WKTp1Ll9ffWZ1bmN0aW9uIFQobix0KXtyZXR1cm4gbz04LEYoZnVuY3Rpb24oKXtyZXR1cm4gbn0sdCl9ZnVuY3Rpb24gcShuKXt2YXIgdT1yLmNvbnRleHRbbi5fX2NdLGk9ZCh0KyssOSk7cmV0dXJuIGkuYz1uLHU/KG51bGw9PWkuX18mJihpLl9fPSEwLHUuc3ViKHIpKSx1LnByb3BzLnZhbHVlKTpuLl9ffWZ1bmN0aW9uIHgodCxyKXtuLnVzZURlYnVnVmFsdWUmJm4udXNlRGVidWdWYWx1ZShyP3IodCk6dCl9ZnVuY3Rpb24gUChuKXt2YXIgdT1kKHQrKywxMCksaT1wKCk7cmV0dXJuIHUuX189bixyLmNvbXBvbmVudERpZENhdGNofHwoci5jb21wb25lbnREaWRDYXRjaD1mdW5jdGlvbihuLHQpe3UuX18mJnUuX18obix0KSxpWzFdKG4pfSksW2lbMF0sZnVuY3Rpb24oKXtpWzFdKHZvaWQgMCl9XX1mdW5jdGlvbiBWKCl7dmFyIG49ZCh0KyssMTEpO2lmKCFuLl9fKXtmb3IodmFyIHU9ci5fX3Y7bnVsbCE9PXUmJiF1Ll9fbSYmbnVsbCE9PXUuX187KXU9dS5fXzt2YXIgaT11Ll9fbXx8KHUuX19tPVswLDBdKTtuLl9fPVwiUFwiK2lbMF0rXCItXCIraVsxXSsrfXJldHVybiBuLl9ffWZ1bmN0aW9uIGIoKXtmb3IodmFyIHQ7dD1mLnNoaWZ0KCk7KWlmKHQuX19QJiZ0Ll9fSCl0cnl7dC5fX0guX19oLmZvckVhY2goayksdC5fX0guX19oLmZvckVhY2godyksdC5fX0guX19oPVtdfWNhdGNoKHIpe3QuX19ILl9faD1bXSxuLl9fZShyLHQuX192KX19bi5fX2I9ZnVuY3Rpb24obil7cj1udWxsLGUmJmUobil9LG4uX19yPWZ1bmN0aW9uKG4pe2EmJmEobiksdD0wO3ZhciBpPShyPW4uX19jKS5fX0g7aSYmKHU9PT1yPyhpLl9faD1bXSxyLl9faD1bXSxpLl9fLmZvckVhY2goZnVuY3Rpb24obil7bi5fX04mJihuLl9fPW4uX19OKSxuLl9fVj1jLG4uX19OPW4uaT12b2lkIDB9KSk6KGkuX19oLmZvckVhY2goayksaS5fX2guZm9yRWFjaCh3KSxpLl9faD1bXSkpLHU9cn0sbi5kaWZmZWQ9ZnVuY3Rpb24odCl7diYmdih0KTt2YXIgbz10Ll9fYztvJiZvLl9fSCYmKG8uX19ILl9faC5sZW5ndGgmJigxIT09Zi5wdXNoKG8pJiZpPT09bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fCgoaT1uLnJlcXVlc3RBbmltYXRpb25GcmFtZSl8fGopKGIpKSxvLl9fSC5fXy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaSYmKG4uX19IPW4uaSksbi5fX1YhPT1jJiYobi5fXz1uLl9fViksbi5pPXZvaWQgMCxuLl9fVj1jfSkpLHU9cj1udWxsfSxuLl9fYz1mdW5jdGlvbih0LHIpe3Iuc29tZShmdW5jdGlvbih0KXt0cnl7dC5fX2guZm9yRWFjaChrKSx0Ll9faD10Ll9faC5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIW4uX198fHcobil9KX1jYXRjaCh1KXtyLnNvbWUoZnVuY3Rpb24obil7bi5fX2gmJihuLl9faD1bXSl9KSxyPVtdLG4uX19lKHUsdC5fX3YpfX0pLGwmJmwodCxyKX0sbi51bm1vdW50PWZ1bmN0aW9uKHQpe20mJm0odCk7dmFyIHIsdT10Ll9fYzt1JiZ1Ll9fSCYmKHUuX19ILl9fLmZvckVhY2goZnVuY3Rpb24obil7dHJ5e2sobil9Y2F0Y2gobil7cj1ufX0pLHUuX19IPXZvaWQgMCxyJiZuLl9fZShyLHUuX192KSl9O3ZhciBnPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZTtmdW5jdGlvbiBqKG4pe3ZhciB0LHI9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodSksZyYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodCksc2V0VGltZW91dChuKX0sdT1zZXRUaW1lb3V0KHIsMTAwKTtnJiYodD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocikpfWZ1bmN0aW9uIGsobil7dmFyIHQ9cix1PW4uX19jO1wiZnVuY3Rpb25cIj09dHlwZW9mIHUmJihuLl9fYz12b2lkIDAsdSgpKSxyPXR9ZnVuY3Rpb24gdyhuKXt2YXIgdD1yO24uX19jPW4uX18oKSxyPXR9ZnVuY3Rpb24geihuLHQpe3JldHVybiFufHxuLmxlbmd0aCE9PXQubGVuZ3RofHx0LnNvbWUoZnVuY3Rpb24odCxyKXtyZXR1cm4gdCE9PW5bcl19KX1mdW5jdGlvbiBCKG4sdCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD90KG4pOnR9ZXhwb3J0e1QgYXMgdXNlQ2FsbGJhY2sscSBhcyB1c2VDb250ZXh0LHggYXMgdXNlRGVidWdWYWx1ZSxoIGFzIHVzZUVmZmVjdCxQIGFzIHVzZUVycm9yQm91bmRhcnksViBhcyB1c2VJZCxBIGFzIHVzZUltcGVyYXRpdmVIYW5kbGUscyBhcyB1c2VMYXlvdXRFZmZlY3QsRiBhcyB1c2VNZW1vLHkgYXMgdXNlUmVkdWNlcixfIGFzIHVzZVJlZixwIGFzIHVzZVN0YXRlfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhvb2tzLm1vZHVsZS5qcy5tYXBcbiIsImltcG9ydHtDb21wb25lbnQgYXMgbixjcmVhdGVFbGVtZW50IGFzIHQsb3B0aW9ucyBhcyBlLHRvQ2hpbGRBcnJheSBhcyByLEZyYWdtZW50IGFzIHUscmVuZGVyIGFzIG8saHlkcmF0ZSBhcyBpLGNyZWF0ZUNvbnRleHQgYXMgbCxjcmVhdGVSZWYgYXMgYyxjbG9uZUVsZW1lbnQgYXMgZn1mcm9tXCJwcmVhY3RcIjtleHBvcnR7Q29tcG9uZW50LEZyYWdtZW50LGNyZWF0ZUNvbnRleHQsY3JlYXRlRWxlbWVudCxjcmVhdGVSZWZ9ZnJvbVwicHJlYWN0XCI7aW1wb3J0e3VzZVN0YXRlIGFzIGEsdXNlSWQgYXMgcyx1c2VSZWR1Y2VyIGFzIGgsdXNlRWZmZWN0IGFzIHYsdXNlTGF5b3V0RWZmZWN0IGFzIGQsdXNlUmVmIGFzIHAsdXNlSW1wZXJhdGl2ZUhhbmRsZSBhcyBtLHVzZU1lbW8gYXMgeSx1c2VDYWxsYmFjayBhcyBfLHVzZUNvbnRleHQgYXMgYix1c2VEZWJ1Z1ZhbHVlIGFzIFN9ZnJvbVwicHJlYWN0L2hvb2tzXCI7ZXhwb3J0KmZyb21cInByZWFjdC9ob29rc1wiO2Z1bmN0aW9uIGcobix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV07cmV0dXJuIG59ZnVuY3Rpb24gQyhuLHQpe2Zvcih2YXIgZSBpbiBuKWlmKFwiX19zb3VyY2VcIiE9PWUmJiEoZSBpbiB0KSlyZXR1cm4hMDtmb3IodmFyIHIgaW4gdClpZihcIl9fc291cmNlXCIhPT1yJiZuW3JdIT09dFtyXSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBFKG4sdCl7cmV0dXJuIG49PT10JiYoMCE9PW58fDEvbj09MS90KXx8biE9biYmdCE9dH1mdW5jdGlvbiB3KG4pe3RoaXMucHJvcHM9bn1mdW5jdGlvbiBSKG4sZSl7ZnVuY3Rpb24gcihuKXt2YXIgdD10aGlzLnByb3BzLnJlZixyPXQ9PW4ucmVmO3JldHVybiFyJiZ0JiYodC5jYWxsP3QobnVsbCk6dC5jdXJyZW50PW51bGwpLGU/IWUodGhpcy5wcm9wcyxuKXx8IXI6Qyh0aGlzLnByb3BzLG4pfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlPXIsdChuLGUpfXJldHVybiB1LmRpc3BsYXlOYW1lPVwiTWVtbyhcIisobi5kaXNwbGF5TmFtZXx8bi5uYW1lKStcIilcIix1LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PSEwLHUuX19mPSEwLHV9KHcucHJvdG90eXBlPW5ldyBuKS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCx3LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gQyh0aGlzLnByb3BzLG4pfHxDKHRoaXMuc3RhdGUsdCl9O3ZhciB4PWUuX19iO2UuX19iPWZ1bmN0aW9uKG4pe24udHlwZSYmbi50eXBlLl9fZiYmbi5yZWYmJihuLnByb3BzLnJlZj1uLnJlZixuLnJlZj1udWxsKSx4JiZ4KG4pfTt2YXIgTj1cInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIil8fDM5MTE7ZnVuY3Rpb24gayhuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPWcoe30sdCk7cmV0dXJuIGRlbGV0ZSBlLnJlZixuKGUsdC5yZWZ8fG51bGwpfXJldHVybiB0LiQkdHlwZW9mPU4sdC5yZW5kZXI9dCx0LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXQuX19mPSEwLHQuZGlzcGxheU5hbWU9XCJGb3J3YXJkUmVmKFwiKyhuLmRpc3BsYXlOYW1lfHxuLm5hbWUpK1wiKVwiLHR9dmFyIEE9ZnVuY3Rpb24obix0KXtyZXR1cm4gbnVsbD09bj9udWxsOnIocihuKS5tYXAodCkpfSxPPXttYXA6QSxmb3JFYWNoOkEsY291bnQ6ZnVuY3Rpb24obil7cmV0dXJuIG4/cihuKS5sZW5ndGg6MH0sb25seTpmdW5jdGlvbihuKXt2YXIgdD1yKG4pO2lmKDEhPT10Lmxlbmd0aCl0aHJvd1wiQ2hpbGRyZW4ub25seVwiO3JldHVybiB0WzBdfSx0b0FycmF5OnJ9LFQ9ZS5fX2U7ZS5fX2U9ZnVuY3Rpb24obix0LGUscil7aWYobi50aGVuKWZvcih2YXIgdSxvPXQ7bz1vLl9fOylpZigodT1vLl9fYykmJnUuX19jKXJldHVybiBudWxsPT10Ll9fZSYmKHQuX19lPWUuX19lLHQuX19rPWUuX19rKSx1Ll9fYyhuLHQpO1Qobix0LGUscil9O3ZhciBJPWUudW5tb3VudDtmdW5jdGlvbiBMKG4sdCxlKXtyZXR1cm4gbiYmKG4uX19jJiZuLl9fYy5fX0gmJihuLl9fYy5fX0guX18uZm9yRWFjaChmdW5jdGlvbihuKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBuLl9fYyYmbi5fX2MoKX0pLG4uX19jLl9fSD1udWxsKSxudWxsIT0obj1nKHt9LG4pKS5fX2MmJihuLl9fYy5fX1A9PT1lJiYobi5fX2MuX19QPXQpLG4uX19jPW51bGwpLG4uX19rPW4uX19rJiZuLl9fay5tYXAoZnVuY3Rpb24obil7cmV0dXJuIEwobix0LGUpfSkpLG59ZnVuY3Rpb24gVShuLHQsZSl7cmV0dXJuIG4mJihuLl9fdj1udWxsLG4uX19rPW4uX19rJiZuLl9fay5tYXAoZnVuY3Rpb24obil7cmV0dXJuIFUobix0LGUpfSksbi5fX2MmJm4uX19jLl9fUD09PXQmJihuLl9fZSYmZS5pbnNlcnRCZWZvcmUobi5fX2Usbi5fX2QpLG4uX19jLl9fZT0hMCxuLl9fYy5fX1A9ZSkpLG59ZnVuY3Rpb24gRCgpe3RoaXMuX191PTAsdGhpcy50PW51bGwsdGhpcy5fX2I9bnVsbH1mdW5jdGlvbiBGKG4pe3ZhciB0PW4uX18uX19jO3JldHVybiB0JiZ0Ll9fYSYmdC5fX2Eobil9ZnVuY3Rpb24gTShuKXt2YXIgZSxyLHU7ZnVuY3Rpb24gbyhvKXtpZihlfHwoZT1uKCkpLnRoZW4oZnVuY3Rpb24obil7cj1uLmRlZmF1bHR8fG59LGZ1bmN0aW9uKG4pe3U9bn0pLHUpdGhyb3cgdTtpZighcil0aHJvdyBlO3JldHVybiB0KHIsbyl9cmV0dXJuIG8uZGlzcGxheU5hbWU9XCJMYXp5XCIsby5fX2Y9ITAsb31mdW5jdGlvbiBWKCl7dGhpcy51PW51bGwsdGhpcy5vPW51bGx9ZS51bm1vdW50PWZ1bmN0aW9uKG4pe3ZhciB0PW4uX19jO3QmJnQuX19SJiZ0Ll9fUigpLHQmJiEwPT09bi5fX2gmJihuLnR5cGU9bnVsbCksSSYmSShuKX0sKEQucHJvdG90eXBlPW5ldyBuKS5fX2M9ZnVuY3Rpb24obix0KXt2YXIgZT10Ll9fYyxyPXRoaXM7bnVsbD09ci50JiYoci50PVtdKSxyLnQucHVzaChlKTt2YXIgdT1GKHIuX192KSxvPSExLGk9ZnVuY3Rpb24oKXtvfHwobz0hMCxlLl9fUj1udWxsLHU/dShsKTpsKCkpfTtlLl9fUj1pO3ZhciBsPWZ1bmN0aW9uKCl7aWYoIS0tci5fX3Upe2lmKHIuc3RhdGUuX19hKXt2YXIgbj1yLnN0YXRlLl9fYTtyLl9fdi5fX2tbMF09VShuLG4uX19jLl9fUCxuLl9fYy5fX08pfXZhciB0O2ZvcihyLnNldFN0YXRlKHtfX2E6ci5fX2I9bnVsbH0pO3Q9ci50LnBvcCgpOyl0LmZvcmNlVXBkYXRlKCl9fSxjPSEwPT09dC5fX2g7ci5fX3UrK3x8Y3x8ci5zZXRTdGF0ZSh7X19hOnIuX19iPXIuX192Ll9fa1swXX0pLG4udGhlbihpLGkpfSxELnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3RoaXMudD1bXX0sRC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKG4sZSl7aWYodGhpcy5fX2Ipe2lmKHRoaXMuX192Ll9fayl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxvPXRoaXMuX192Ll9fa1swXS5fX2M7dGhpcy5fX3YuX19rWzBdPUwodGhpcy5fX2IscixvLl9fTz1vLl9fUCl9dGhpcy5fX2I9bnVsbH12YXIgaT1lLl9fYSYmdCh1LG51bGwsbi5mYWxsYmFjayk7cmV0dXJuIGkmJihpLl9faD1udWxsKSxbdCh1LG51bGwsZS5fX2E/bnVsbDpuLmNoaWxkcmVuKSxpXX07dmFyIFc9ZnVuY3Rpb24obix0LGUpe2lmKCsrZVsxXT09PWVbMF0mJm4uby5kZWxldGUodCksbi5wcm9wcy5yZXZlYWxPcmRlciYmKFwidFwiIT09bi5wcm9wcy5yZXZlYWxPcmRlclswXXx8IW4uby5zaXplKSlmb3IoZT1uLnU7ZTspe2Zvcig7ZS5sZW5ndGg+MzspZS5wb3AoKSgpO2lmKGVbMV08ZVswXSlicmVhaztuLnU9ZT1lWzJdfX07ZnVuY3Rpb24gUChuKXtyZXR1cm4gdGhpcy5nZXRDaGlsZENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb250ZXh0fSxuLmNoaWxkcmVufWZ1bmN0aW9uICQobil7dmFyIGU9dGhpcyxyPW4uaTtlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7byhudWxsLGUubCksZS5sPW51bGwsZS5pPW51bGx9LGUuaSYmZS5pIT09ciYmZS5jb21wb25lbnRXaWxsVW5tb3VudCgpLG4uX192PyhlLmx8fChlLmk9cixlLmw9e25vZGVUeXBlOjEscGFyZW50Tm9kZTpyLGNoaWxkTm9kZXM6W10sYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24obil7dGhpcy5jaGlsZE5vZGVzLnB1c2gobiksZS5pLmFwcGVuZENoaWxkKG4pfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24obix0KXt0aGlzLmNoaWxkTm9kZXMucHVzaChuKSxlLmkuYXBwZW5kQ2hpbGQobil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKG4pe3RoaXMuY2hpbGROb2Rlcy5zcGxpY2UodGhpcy5jaGlsZE5vZGVzLmluZGV4T2Yobik+Pj4xLDEpLGUuaS5yZW1vdmVDaGlsZChuKX19KSxvKHQoUCx7Y29udGV4dDplLmNvbnRleHR9LG4uX192KSxlLmwpKTplLmwmJmUuY29tcG9uZW50V2lsbFVubW91bnQoKX1mdW5jdGlvbiBqKG4sZSl7dmFyIHI9dCgkLHtfX3Y6bixpOmV9KTtyZXR1cm4gci5jb250YWluZXJJbmZvPWUscn0oVi5wcm90b3R5cGU9bmV3IG4pLl9fYT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLGU9Rih0Ll9fdikscj10Lm8uZ2V0KG4pO3JldHVybiByWzBdKyssZnVuY3Rpb24odSl7dmFyIG89ZnVuY3Rpb24oKXt0LnByb3BzLnJldmVhbE9yZGVyPyhyLnB1c2godSksVyh0LG4scikpOnUoKX07ZT9lKG8pOm8oKX19LFYucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihuKXt0aGlzLnU9bnVsbCx0aGlzLm89bmV3IE1hcDt2YXIgdD1yKG4uY2hpbGRyZW4pO24ucmV2ZWFsT3JkZXImJlwiYlwiPT09bi5yZXZlYWxPcmRlclswXSYmdC5yZXZlcnNlKCk7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLTspdGhpcy5vLnNldCh0W2VdLHRoaXMudT1bMSwwLHRoaXMudV0pO3JldHVybiBuLmNoaWxkcmVufSxWLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGU9Vi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO3RoaXMuby5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7VyhuLGUsdCl9KX07dmFyIHo9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIil8fDYwMTAzLEI9L14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxkb21pbmFudHxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxpbWFnZXxsZXR0ZXJ8bGlnaHRpbmd8bWFya2VyKD8hSHxXfFUpfG92ZXJsaW5lfHBhaW50fHBvaW50ZXJ8c2hhcGV8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dHJhbnNmb3JtfHVuZGVybGluZXx1bmljb2RlfHVuaXRzfHZ8dmVjdG9yfHZlcnR8d29yZHx3cml0aW5nfHgoPyFDKSlbQS1aXS8sSD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQsWj1mdW5jdGlvbihuKXtyZXR1cm4oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFN5bWJvbCYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbCgpPy9maWx8Y2hlfHJhZC9pOi9maWx8Y2hlfHJhL2kpLnRlc3Qobil9O2Z1bmN0aW9uIFkobix0LGUpe3JldHVybiBudWxsPT10Ll9fayYmKHQudGV4dENvbnRlbnQ9XCJcIiksbyhuLHQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJmUoKSxuP24uX19jOm51bGx9ZnVuY3Rpb24gcShuLHQsZSl7cmV0dXJuIGkobix0KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlKCksbj9uLl9fYzpudWxsfW4ucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e30sW1wiY29tcG9uZW50V2lsbE1vdW50XCIsXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIsXCJjb21wb25lbnRXaWxsVXBkYXRlXCJdLmZvckVhY2goZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tcIlVOU0FGRV9cIit0XX0sc2V0OmZ1bmN0aW9uKG4pe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpufSl9fSl9KTt2YXIgRz1lLmV2ZW50O2Z1bmN0aW9uIEooKXt9ZnVuY3Rpb24gSygpe3JldHVybiB0aGlzLmNhbmNlbEJ1YmJsZX1mdW5jdGlvbiBRKCl7cmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZH1lLmV2ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBHJiYobj1HKG4pKSxuLnBlcnNpc3Q9SixuLmlzUHJvcGFnYXRpb25TdG9wcGVkPUssbi5pc0RlZmF1bHRQcmV2ZW50ZWQ9USxuLm5hdGl2ZUV2ZW50PW59O3ZhciBYLG5uPXtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xhc3N9fSx0bj1lLnZub2RlO2Uudm5vZGU9ZnVuY3Rpb24obil7dmFyIHQ9bi50eXBlLGU9bi5wcm9wcyx1PWU7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe3ZhciBvPS0xPT09dC5pbmRleE9mKFwiLVwiKTtmb3IodmFyIGkgaW4gdT17fSxlKXt2YXIgbD1lW2ldO0gmJlwiY2hpbGRyZW5cIj09PWkmJlwibm9zY3JpcHRcIj09PXR8fFwidmFsdWVcIj09PWkmJlwiZGVmYXVsdFZhbHVlXCJpbiBlJiZudWxsPT1sfHwoXCJkZWZhdWx0VmFsdWVcIj09PWkmJlwidmFsdWVcImluIGUmJm51bGw9PWUudmFsdWU/aT1cInZhbHVlXCI6XCJkb3dubG9hZFwiPT09aSYmITA9PT1sP2w9XCJcIjovb25kb3VibGVjbGljay9pLnRlc3QoaSk/aT1cIm9uZGJsY2xpY2tcIjovXm9uY2hhbmdlKHRleHRhcmVhfGlucHV0KS9pLnRlc3QoaSt0KSYmIVooZS50eXBlKT9pPVwib25pbnB1dFwiOi9eb25mb2N1cyQvaS50ZXN0KGkpP2k9XCJvbmZvY3VzaW5cIjovXm9uYmx1ciQvaS50ZXN0KGkpP2k9XCJvbmZvY3Vzb3V0XCI6L15vbihBbml8VHJhfFRvdXxCZWZvcmVJbnB8Q29tcG8pLy50ZXN0KGkpP2k9aS50b0xvd2VyQ2FzZSgpOm8mJkIudGVzdChpKT9pPWkucmVwbGFjZSgvW0EtWjAtOV0vZyxcIi0kJlwiKS50b0xvd2VyQ2FzZSgpOm51bGw9PT1sJiYobD12b2lkIDApLC9eb25pbnB1dCQvaS50ZXN0KGkpJiYoaT1pLnRvTG93ZXJDYXNlKCksdVtpXSYmKGk9XCJvbmlucHV0Q2FwdHVyZVwiKSksdVtpXT1sKX1cInNlbGVjdFwiPT10JiZ1Lm11bHRpcGxlJiZBcnJheS5pc0FycmF5KHUudmFsdWUpJiYodS52YWx1ZT1yKGUuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24obil7bi5wcm9wcy5zZWxlY3RlZD0tMSE9dS52YWx1ZS5pbmRleE9mKG4ucHJvcHMudmFsdWUpfSkpLFwic2VsZWN0XCI9PXQmJm51bGwhPXUuZGVmYXVsdFZhbHVlJiYodS52YWx1ZT1yKGUuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24obil7bi5wcm9wcy5zZWxlY3RlZD11Lm11bHRpcGxlPy0xIT11LmRlZmF1bHRWYWx1ZS5pbmRleE9mKG4ucHJvcHMudmFsdWUpOnUuZGVmYXVsdFZhbHVlPT1uLnByb3BzLnZhbHVlfSkpLG4ucHJvcHM9dSxlLmNsYXNzIT1lLmNsYXNzTmFtZSYmKG5uLmVudW1lcmFibGU9XCJjbGFzc05hbWVcImluIGUsbnVsbCE9ZS5jbGFzc05hbWUmJih1LmNsYXNzPWUuY2xhc3NOYW1lKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodSxcImNsYXNzTmFtZVwiLG5uKSl9bi4kJHR5cGVvZj16LHRuJiZ0bihuKX07dmFyIGVuPWUuX19yO2UuX19yPWZ1bmN0aW9uKG4pe2VuJiZlbihuKSxYPW4uX19jfTt2YXIgcm49e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6e2N1cnJlbnQ6e3JlYWRDb250ZXh0OmZ1bmN0aW9uKG4pe3JldHVybiBYLl9fbltuLl9fY10ucHJvcHMudmFsdWV9fX19LHVuPVwiMTcuMC4yXCI7ZnVuY3Rpb24gb24obil7cmV0dXJuIHQuYmluZChudWxsLG4pfWZ1bmN0aW9uIGxuKG4pe3JldHVybiEhbiYmbi4kJHR5cGVvZj09PXp9ZnVuY3Rpb24gY24obil7cmV0dXJuIGxuKG4pP2YuYXBwbHkobnVsbCxhcmd1bWVudHMpOm59ZnVuY3Rpb24gZm4obil7cmV0dXJuISFuLl9fayYmKG8obnVsbCxuKSwhMCl9ZnVuY3Rpb24gYW4obil7cmV0dXJuIG4mJihuLmJhc2V8fDE9PT1uLm5vZGVUeXBlJiZuKXx8bnVsbH12YXIgc249ZnVuY3Rpb24obix0KXtyZXR1cm4gbih0KX0saG49ZnVuY3Rpb24obix0KXtyZXR1cm4gbih0KX0sdm49dTtmdW5jdGlvbiBkbihuKXtuKCl9ZnVuY3Rpb24gcG4obil7cmV0dXJuIG59ZnVuY3Rpb24gbW4oKXtyZXR1cm5bITEsZG5dfXZhciB5bj1kO2Z1bmN0aW9uIF9uKG4sdCl7dmFyIGU9dCgpLHI9YSh7aDp7X186ZSx2OnR9fSksdT1yWzBdLmgsbz1yWzFdO3JldHVybiBkKGZ1bmN0aW9uKCl7dS5fXz1lLHUudj10LEUodS5fXyx0KCkpfHxvKHtoOnV9KX0sW24sZSx0XSksdihmdW5jdGlvbigpe3JldHVybiBFKHUuX18sdS52KCkpfHxvKHtoOnV9KSxuKGZ1bmN0aW9uKCl7RSh1Ll9fLHUudigpKXx8byh7aDp1fSl9KX0sW25dKSxlfXZhciBibj17dXNlU3RhdGU6YSx1c2VJZDpzLHVzZVJlZHVjZXI6aCx1c2VFZmZlY3Q6dix1c2VMYXlvdXRFZmZlY3Q6ZCx1c2VJbnNlcnRpb25FZmZlY3Q6eW4sdXNlVHJhbnNpdGlvbjptbix1c2VEZWZlcnJlZFZhbHVlOnBuLHVzZVN5bmNFeHRlcm5hbFN0b3JlOl9uLHN0YXJ0VHJhbnNpdGlvbjpkbix1c2VSZWY6cCx1c2VJbXBlcmF0aXZlSGFuZGxlOm0sdXNlTWVtbzp5LHVzZUNhbGxiYWNrOl8sdXNlQ29udGV4dDpiLHVzZURlYnVnVmFsdWU6Uyx2ZXJzaW9uOlwiMTcuMC4yXCIsQ2hpbGRyZW46TyxyZW5kZXI6WSxoeWRyYXRlOnEsdW5tb3VudENvbXBvbmVudEF0Tm9kZTpmbixjcmVhdGVQb3J0YWw6aixjcmVhdGVFbGVtZW50OnQsY3JlYXRlQ29udGV4dDpsLGNyZWF0ZUZhY3Rvcnk6b24sY2xvbmVFbGVtZW50OmNuLGNyZWF0ZVJlZjpjLEZyYWdtZW50OnUsaXNWYWxpZEVsZW1lbnQ6bG4sZmluZERPTU5vZGU6YW4sQ29tcG9uZW50Om4sUHVyZUNvbXBvbmVudDp3LG1lbW86Uixmb3J3YXJkUmVmOmssZmx1c2hTeW5jOmhuLHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzOnNuLFN0cmljdE1vZGU6dm4sU3VzcGVuc2U6RCxTdXNwZW5zZUxpc3Q6VixsYXp5Ok0sX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6cm59O2V4cG9ydHtPIGFzIENoaWxkcmVuLHcgYXMgUHVyZUNvbXBvbmVudCx2biBhcyBTdHJpY3RNb2RlLEQgYXMgU3VzcGVuc2UsViBhcyBTdXNwZW5zZUxpc3Qscm4gYXMgX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsY24gYXMgY2xvbmVFbGVtZW50LG9uIGFzIGNyZWF0ZUZhY3RvcnksaiBhcyBjcmVhdGVQb3J0YWwsYm4gYXMgZGVmYXVsdCxhbiBhcyBmaW5kRE9NTm9kZSxobiBhcyBmbHVzaFN5bmMsayBhcyBmb3J3YXJkUmVmLHEgYXMgaHlkcmF0ZSxsbiBhcyBpc1ZhbGlkRWxlbWVudCxNIGFzIGxhenksUiBhcyBtZW1vLFkgYXMgcmVuZGVyLGRuIGFzIHN0YXJ0VHJhbnNpdGlvbixmbiBhcyB1bm1vdW50Q29tcG9uZW50QXROb2RlLHNuIGFzIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzLHBuIGFzIHVzZURlZmVycmVkVmFsdWUseW4gYXMgdXNlSW5zZXJ0aW9uRWZmZWN0LF9uIGFzIHVzZVN5bmNFeHRlcm5hbFN0b3JlLG1uIGFzIHVzZVRyYW5zaXRpb24sdW4gYXMgdmVyc2lvbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21wYXQubW9kdWxlLmpzLm1hcFxuIiwidmFyIG4sbCx1LGksdCxyLG8sZixlLGM9e30scz1bXSxhPS9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7ZnVuY3Rpb24gaChuLGwpe2Zvcih2YXIgdSBpbiBsKW5bdV09bFt1XTtyZXR1cm4gbn1mdW5jdGlvbiB2KG4pe3ZhciBsPW4ucGFyZW50Tm9kZTtsJiZsLnJlbW92ZUNoaWxkKG4pfWZ1bmN0aW9uIHkobCx1LGkpe3ZhciB0LHIsbyxmPXt9O2ZvcihvIGluIHUpXCJrZXlcIj09bz90PXVbb106XCJyZWZcIj09bz9yPXVbb106ZltvXT11W29dO2lmKGFyZ3VtZW50cy5sZW5ndGg+MiYmKGYuY2hpbGRyZW49YXJndW1lbnRzLmxlbmd0aD4zP24uY2FsbChhcmd1bWVudHMsMik6aSksXCJmdW5jdGlvblwiPT10eXBlb2YgbCYmbnVsbCE9bC5kZWZhdWx0UHJvcHMpZm9yKG8gaW4gbC5kZWZhdWx0UHJvcHMpdm9pZCAwPT09ZltvXSYmKGZbb109bC5kZWZhdWx0UHJvcHNbb10pO3JldHVybiBwKGwsZix0LHIsbnVsbCl9ZnVuY3Rpb24gcChuLGksdCxyLG8pe3ZhciBmPXt0eXBlOm4scHJvcHM6aSxrZXk6dCxyZWY6cixfX2s6bnVsbCxfXzpudWxsLF9fYjowLF9fZTpudWxsLF9fZDp2b2lkIDAsX19jOm51bGwsX19oOm51bGwsY29uc3RydWN0b3I6dm9pZCAwLF9fdjpudWxsPT1vPysrdTpvfTtyZXR1cm4gbnVsbD09byYmbnVsbCE9bC52bm9kZSYmbC52bm9kZShmKSxmfWZ1bmN0aW9uIGQoKXtyZXR1cm57Y3VycmVudDpudWxsfX1mdW5jdGlvbiBfKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIGsobixsLHUsaSx0KXt2YXIgcjtmb3IociBpbiB1KVwiY2hpbGRyZW5cIj09PXJ8fFwia2V5XCI9PT1yfHxyIGluIGx8fGcobixyLG51bGwsdVtyXSxpKTtmb3IociBpbiBsKXQmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGxbcl18fFwiY2hpbGRyZW5cIj09PXJ8fFwia2V5XCI9PT1yfHxcInZhbHVlXCI9PT1yfHxcImNoZWNrZWRcIj09PXJ8fHVbcl09PT1sW3JdfHxnKG4scixsW3JdLHVbcl0saSl9ZnVuY3Rpb24gYihuLGwsdSl7XCItXCI9PT1sWzBdP24uc2V0UHJvcGVydHkobCxudWxsPT11P1wiXCI6dSk6bltsXT1udWxsPT11P1wiXCI6XCJudW1iZXJcIiE9dHlwZW9mIHV8fGEudGVzdChsKT91OnUrXCJweFwifWZ1bmN0aW9uIGcobixsLHUsaSx0KXt2YXIgcjtuOmlmKFwic3R5bGVcIj09PWwpaWYoXCJzdHJpbmdcIj09dHlwZW9mIHUpbi5zdHlsZS5jc3NUZXh0PXU7ZWxzZXtpZihcInN0cmluZ1wiPT10eXBlb2YgaSYmKG4uc3R5bGUuY3NzVGV4dD1pPVwiXCIpLGkpZm9yKGwgaW4gaSl1JiZsIGluIHV8fGIobi5zdHlsZSxsLFwiXCIpO2lmKHUpZm9yKGwgaW4gdSlpJiZ1W2xdPT09aVtsXXx8YihuLnN0eWxlLGwsdVtsXSl9ZWxzZSBpZihcIm9cIj09PWxbMF0mJlwiblwiPT09bFsxXSlyPWwhPT0obD1sLnJlcGxhY2UoL0NhcHR1cmUkLyxcIlwiKSksbD1sLnRvTG93ZXJDYXNlKClpbiBuP2wudG9Mb3dlckNhc2UoKS5zbGljZSgyKTpsLnNsaWNlKDIpLG4ubHx8KG4ubD17fSksbi5sW2wrcl09dSx1P2l8fG4uYWRkRXZlbnRMaXN0ZW5lcihsLHI/dzptLHIpOm4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihsLHI/dzptLHIpO2Vsc2UgaWYoXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09bCl7aWYodClsPWwucmVwbGFjZSgveGxpbmsoSHw6aCkvLFwiaFwiKS5yZXBsYWNlKC9zTmFtZSQvLFwic1wiKTtlbHNlIGlmKFwid2lkdGhcIiE9PWwmJlwiaGVpZ2h0XCIhPT1sJiZcImhyZWZcIiE9PWwmJlwibGlzdFwiIT09bCYmXCJmb3JtXCIhPT1sJiZcInRhYkluZGV4XCIhPT1sJiZcImRvd25sb2FkXCIhPT1sJiZsIGluIG4pdHJ5e25bbF09bnVsbD09dT9cIlwiOnU7YnJlYWsgbn1jYXRjaChuKXt9XCJmdW5jdGlvblwiPT10eXBlb2YgdXx8KG51bGw9PXV8fCExPT09dSYmLTE9PWwuaW5kZXhPZihcIi1cIik/bi5yZW1vdmVBdHRyaWJ1dGUobCk6bi5zZXRBdHRyaWJ1dGUobCx1KSl9fWZ1bmN0aW9uIG0obil7dD0hMDt0cnl7cmV0dXJuIHRoaXMubFtuLnR5cGUrITFdKGwuZXZlbnQ/bC5ldmVudChuKTpuKX1maW5hbGx5e3Q9ITF9fWZ1bmN0aW9uIHcobil7dD0hMDt0cnl7cmV0dXJuIHRoaXMubFtuLnR5cGUrITBdKGwuZXZlbnQ/bC5ldmVudChuKTpuKX1maW5hbGx5e3Q9ITF9fWZ1bmN0aW9uIHgobixsKXt0aGlzLnByb3BzPW4sdGhpcy5jb250ZXh0PWx9ZnVuY3Rpb24gQShuLGwpe2lmKG51bGw9PWwpcmV0dXJuIG4uX18/QShuLl9fLG4uX18uX19rLmluZGV4T2YobikrMSk6bnVsbDtmb3IodmFyIHU7bDxuLl9fay5sZW5ndGg7bCsrKWlmKG51bGwhPSh1PW4uX19rW2xdKSYmbnVsbCE9dS5fX2UpcmV0dXJuIHUuX19lO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIG4udHlwZT9BKG4pOm51bGx9ZnVuY3Rpb24gUChuKXt2YXIgbCx1O2lmKG51bGwhPShuPW4uX18pJiZudWxsIT1uLl9fYyl7Zm9yKG4uX19lPW4uX19jLmJhc2U9bnVsbCxsPTA7bDxuLl9fay5sZW5ndGg7bCsrKWlmKG51bGwhPSh1PW4uX19rW2xdKSYmbnVsbCE9dS5fX2Upe24uX19lPW4uX19jLmJhc2U9dS5fX2U7YnJlYWt9cmV0dXJuIFAobil9fWZ1bmN0aW9uIEMobil7dD9zZXRUaW1lb3V0KG4pOmYobil9ZnVuY3Rpb24gVChuKXsoIW4uX19kJiYobi5fX2Q9ITApJiZyLnB1c2gobikmJiEkLl9fcisrfHxvIT09bC5kZWJvdW5jZVJlbmRlcmluZykmJigobz1sLmRlYm91bmNlUmVuZGVyaW5nKXx8QykoJCl9ZnVuY3Rpb24gJCgpe3ZhciBuLGwsdSxpLHQsbyxmLGU7Zm9yKHIuc29ydChmdW5jdGlvbihuLGwpe3JldHVybiBuLl9fdi5fX2ItbC5fX3YuX19ifSk7bj1yLnNoaWZ0KCk7KW4uX19kJiYobD1yLmxlbmd0aCxpPXZvaWQgMCx0PXZvaWQgMCxmPShvPSh1PW4pLl9fdikuX19lLChlPXUuX19QKSYmKGk9W10sKHQ9aCh7fSxvKSkuX192PW8uX192KzEsTShlLG8sdCx1Ll9fbix2b2lkIDAhPT1lLm93bmVyU1ZHRWxlbWVudCxudWxsIT1vLl9faD9bZl06bnVsbCxpLG51bGw9PWY/QShvKTpmLG8uX19oKSxOKGksbyksby5fX2UhPWYmJlAobykpLHIubGVuZ3RoPmwmJnIuc29ydChmdW5jdGlvbihuLGwpe3JldHVybiBuLl9fdi5fX2ItbC5fX3YuX19ifSkpOyQuX19yPTB9ZnVuY3Rpb24gSChuLGwsdSxpLHQscixvLGYsZSxhKXt2YXIgaCx2LHksZCxrLGIsZyxtPWkmJmkuX19rfHxzLHc9bS5sZW5ndGg7Zm9yKHUuX19rPVtdLGg9MDtoPGwubGVuZ3RoO2grKylpZihudWxsIT0oZD11Ll9fa1toXT1udWxsPT0oZD1sW2hdKXx8XCJib29sZWFuXCI9PXR5cGVvZiBkP251bGw6XCJzdHJpbmdcIj09dHlwZW9mIGR8fFwibnVtYmVyXCI9PXR5cGVvZiBkfHxcImJpZ2ludFwiPT10eXBlb2YgZD9wKG51bGwsZCxudWxsLG51bGwsZCk6QXJyYXkuaXNBcnJheShkKT9wKF8se2NoaWxkcmVuOmR9LG51bGwsbnVsbCxudWxsKTpkLl9fYj4wP3AoZC50eXBlLGQucHJvcHMsZC5rZXksZC5yZWY/ZC5yZWY6bnVsbCxkLl9fdik6ZCkpe2lmKGQuX189dSxkLl9fYj11Ll9fYisxLG51bGw9PT0oeT1tW2hdKXx8eSYmZC5rZXk9PXkua2V5JiZkLnR5cGU9PT15LnR5cGUpbVtoXT12b2lkIDA7ZWxzZSBmb3Iodj0wO3Y8dzt2Kyspe2lmKCh5PW1bdl0pJiZkLmtleT09eS5rZXkmJmQudHlwZT09PXkudHlwZSl7bVt2XT12b2lkIDA7YnJlYWt9eT1udWxsfU0obixkLHk9eXx8Yyx0LHIsbyxmLGUsYSksaz1kLl9fZSwodj1kLnJlZikmJnkucmVmIT12JiYoZ3x8KGc9W10pLHkucmVmJiZnLnB1c2goeS5yZWYsbnVsbCxkKSxnLnB1c2godixkLl9fY3x8ayxkKSksbnVsbCE9az8obnVsbD09YiYmKGI9ayksXCJmdW5jdGlvblwiPT10eXBlb2YgZC50eXBlJiZkLl9faz09PXkuX19rP2QuX19kPWU9SShkLGUsbik6ZT16KG4sZCx5LG0sayxlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB1LnR5cGUmJih1Ll9fZD1lKSk6ZSYmeS5fX2U9PWUmJmUucGFyZW50Tm9kZSE9biYmKGU9QSh5KSl9Zm9yKHUuX19lPWIsaD13O2gtLTspbnVsbCE9bVtoXSYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHUudHlwZSYmbnVsbCE9bVtoXS5fX2UmJm1baF0uX19lPT11Ll9fZCYmKHUuX19kPUwoaSkubmV4dFNpYmxpbmcpLHEobVtoXSxtW2hdKSk7aWYoZylmb3IoaD0wO2g8Zy5sZW5ndGg7aCsrKVMoZ1toXSxnWysraF0sZ1srK2hdKX1mdW5jdGlvbiBJKG4sbCx1KXtmb3IodmFyIGksdD1uLl9fayxyPTA7dCYmcjx0Lmxlbmd0aDtyKyspKGk9dFtyXSkmJihpLl9fPW4sbD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBpLnR5cGU/SShpLGwsdSk6eih1LGksaSx0LGkuX19lLGwpKTtyZXR1cm4gbH1mdW5jdGlvbiBqKG4sbCl7cmV0dXJuIGw9bHx8W10sbnVsbD09bnx8XCJib29sZWFuXCI9PXR5cGVvZiBufHwoQXJyYXkuaXNBcnJheShuKT9uLnNvbWUoZnVuY3Rpb24obil7aihuLGwpfSk6bC5wdXNoKG4pKSxsfWZ1bmN0aW9uIHoobixsLHUsaSx0LHIpe3ZhciBvLGYsZTtpZih2b2lkIDAhPT1sLl9fZClvPWwuX19kLGwuX19kPXZvaWQgMDtlbHNlIGlmKG51bGw9PXV8fHQhPXJ8fG51bGw9PXQucGFyZW50Tm9kZSluOmlmKG51bGw9PXJ8fHIucGFyZW50Tm9kZSE9PW4pbi5hcHBlbmRDaGlsZCh0KSxvPW51bGw7ZWxzZXtmb3IoZj1yLGU9MDsoZj1mLm5leHRTaWJsaW5nKSYmZTxpLmxlbmd0aDtlKz0xKWlmKGY9PXQpYnJlYWsgbjtuLmluc2VydEJlZm9yZSh0LHIpLG89cn1yZXR1cm4gdm9pZCAwIT09bz9vOnQubmV4dFNpYmxpbmd9ZnVuY3Rpb24gTChuKXt2YXIgbCx1LGk7aWYobnVsbD09bi50eXBlfHxcInN0cmluZ1wiPT10eXBlb2Ygbi50eXBlKXJldHVybiBuLl9fZTtpZihuLl9faylmb3IobD1uLl9fay5sZW5ndGgtMTtsPj0wO2wtLSlpZigodT1uLl9fa1tsXSkmJihpPUwodSkpKXJldHVybiBpO3JldHVybiBudWxsfWZ1bmN0aW9uIE0obix1LGksdCxyLG8sZixlLGMpe3ZhciBzLGEsdix5LHAsZCxrLGIsZyxtLHcsQSxQLEMsVCwkPXUudHlwZTtpZih2b2lkIDAhPT11LmNvbnN0cnVjdG9yKXJldHVybiBudWxsO251bGwhPWkuX19oJiYoYz1pLl9faCxlPXUuX19lPWkuX19lLHUuX19oPW51bGwsbz1bZV0pLChzPWwuX19iKSYmcyh1KTt0cnl7bjppZihcImZ1bmN0aW9uXCI9PXR5cGVvZiAkKXtpZihiPXUucHJvcHMsZz0ocz0kLmNvbnRleHRUeXBlKSYmdFtzLl9fY10sbT1zP2c/Zy5wcm9wcy52YWx1ZTpzLl9fOnQsaS5fX2M/az0oYT11Ll9fYz1pLl9fYykuX189YS5fX0U6KFwicHJvdG90eXBlXCJpbiAkJiYkLnByb3RvdHlwZS5yZW5kZXI/dS5fX2M9YT1uZXcgJChiLG0pOih1Ll9fYz1hPW5ldyB4KGIsbSksYS5jb25zdHJ1Y3Rvcj0kLGEucmVuZGVyPUIpLGcmJmcuc3ViKGEpLGEucHJvcHM9YixhLnN0YXRlfHwoYS5zdGF0ZT17fSksYS5jb250ZXh0PW0sYS5fX249dCx2PWEuX19kPSEwLGEuX19oPVtdLGEuX3NiPVtdKSxudWxsPT1hLl9fcyYmKGEuX19zPWEuc3RhdGUpLG51bGwhPSQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJiYoYS5fX3M9PWEuc3RhdGUmJihhLl9fcz1oKHt9LGEuX19zKSksaChhLl9fcywkLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhiLGEuX19zKSkpLHk9YS5wcm9wcyxwPWEuc3RhdGUsYS5fX3Y9dSx2KW51bGw9PSQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzJiZudWxsIT1hLmNvbXBvbmVudFdpbGxNb3VudCYmYS5jb21wb25lbnRXaWxsTW91bnQoKSxudWxsIT1hLmNvbXBvbmVudERpZE1vdW50JiZhLl9faC5wdXNoKGEuY29tcG9uZW50RGlkTW91bnQpO2Vsc2V7aWYobnVsbD09JC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMmJmIhPT15JiZudWxsIT1hLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmEuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhiLG0pLCFhLl9fZSYmbnVsbCE9YS5zaG91bGRDb21wb25lbnRVcGRhdGUmJiExPT09YS5zaG91bGRDb21wb25lbnRVcGRhdGUoYixhLl9fcyxtKXx8dS5fX3Y9PT1pLl9fdil7Zm9yKHUuX192IT09aS5fX3YmJihhLnByb3BzPWIsYS5zdGF0ZT1hLl9fcyxhLl9fZD0hMSksdS5fX2U9aS5fX2UsdS5fX2s9aS5fX2ssdS5fX2suZm9yRWFjaChmdW5jdGlvbihuKXtuJiYobi5fXz11KX0pLHc9MDt3PGEuX3NiLmxlbmd0aDt3KyspYS5fX2gucHVzaChhLl9zYlt3XSk7YS5fc2I9W10sYS5fX2gubGVuZ3RoJiZmLnB1c2goYSk7YnJlYWsgbn1udWxsIT1hLmNvbXBvbmVudFdpbGxVcGRhdGUmJmEuY29tcG9uZW50V2lsbFVwZGF0ZShiLGEuX19zLG0pLG51bGwhPWEuY29tcG9uZW50RGlkVXBkYXRlJiZhLl9faC5wdXNoKGZ1bmN0aW9uKCl7YS5jb21wb25lbnREaWRVcGRhdGUoeSxwLGQpfSl9aWYoYS5jb250ZXh0PW0sYS5wcm9wcz1iLGEuX19QPW4sQT1sLl9fcixQPTAsXCJwcm90b3R5cGVcImluICQmJiQucHJvdG90eXBlLnJlbmRlcil7Zm9yKGEuc3RhdGU9YS5fX3MsYS5fX2Q9ITEsQSYmQSh1KSxzPWEucmVuZGVyKGEucHJvcHMsYS5zdGF0ZSxhLmNvbnRleHQpLEM9MDtDPGEuX3NiLmxlbmd0aDtDKyspYS5fX2gucHVzaChhLl9zYltDXSk7YS5fc2I9W119ZWxzZSBkb3thLl9fZD0hMSxBJiZBKHUpLHM9YS5yZW5kZXIoYS5wcm9wcyxhLnN0YXRlLGEuY29udGV4dCksYS5zdGF0ZT1hLl9fc313aGlsZShhLl9fZCYmKytQPDI1KTthLnN0YXRlPWEuX19zLG51bGwhPWEuZ2V0Q2hpbGRDb250ZXh0JiYodD1oKGgoe30sdCksYS5nZXRDaGlsZENvbnRleHQoKSkpLHZ8fG51bGw9PWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fChkPWEuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoeSxwKSksVD1udWxsIT1zJiZzLnR5cGU9PT1fJiZudWxsPT1zLmtleT9zLnByb3BzLmNoaWxkcmVuOnMsSChuLEFycmF5LmlzQXJyYXkoVCk/VDpbVF0sdSxpLHQscixvLGYsZSxjKSxhLmJhc2U9dS5fX2UsdS5fX2g9bnVsbCxhLl9faC5sZW5ndGgmJmYucHVzaChhKSxrJiYoYS5fX0U9YS5fXz1udWxsKSxhLl9fZT0hMX1lbHNlIG51bGw9PW8mJnUuX192PT09aS5fX3Y/KHUuX19rPWkuX19rLHUuX19lPWkuX19lKTp1Ll9fZT1PKGkuX19lLHUsaSx0LHIsbyxmLGMpOyhzPWwuZGlmZmVkKSYmcyh1KX1jYXRjaChuKXt1Ll9fdj1udWxsLChjfHxudWxsIT1vKSYmKHUuX19lPWUsdS5fX2g9ISFjLG9bby5pbmRleE9mKGUpXT1udWxsKSxsLl9fZShuLHUsaSl9fWZ1bmN0aW9uIE4obix1KXtsLl9fYyYmbC5fX2ModSxuKSxuLnNvbWUoZnVuY3Rpb24odSl7dHJ5e249dS5fX2gsdS5fX2g9W10sbi5zb21lKGZ1bmN0aW9uKG4pe24uY2FsbCh1KX0pfWNhdGNoKG4pe2wuX19lKG4sdS5fX3YpfX0pfWZ1bmN0aW9uIE8obCx1LGksdCxyLG8sZixlKXt2YXIgcyxhLGgseT1pLnByb3BzLHA9dS5wcm9wcyxkPXUudHlwZSxfPTA7aWYoXCJzdmdcIj09PWQmJihyPSEwKSxudWxsIT1vKWZvcig7XzxvLmxlbmd0aDtfKyspaWYoKHM9b1tfXSkmJlwic2V0QXR0cmlidXRlXCJpbiBzPT0hIWQmJihkP3MubG9jYWxOYW1lPT09ZDozPT09cy5ub2RlVHlwZSkpe2w9cyxvW19dPW51bGw7YnJlYWt9aWYobnVsbD09bCl7aWYobnVsbD09PWQpcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHApO2w9cj9kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLGQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZCxwLmlzJiZwKSxvPW51bGwsZT0hMX1pZihudWxsPT09ZCl5PT09cHx8ZSYmbC5kYXRhPT09cHx8KGwuZGF0YT1wKTtlbHNle2lmKG89byYmbi5jYWxsKGwuY2hpbGROb2RlcyksYT0oeT1pLnByb3BzfHxjKS5kYW5nZXJvdXNseVNldElubmVySFRNTCxoPXAuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwsIWUpe2lmKG51bGwhPW8pZm9yKHk9e30sXz0wO188bC5hdHRyaWJ1dGVzLmxlbmd0aDtfKyspeVtsLmF0dHJpYnV0ZXNbX10ubmFtZV09bC5hdHRyaWJ1dGVzW19dLnZhbHVlOyhofHxhKSYmKGgmJihhJiZoLl9faHRtbD09YS5fX2h0bWx8fGguX19odG1sPT09bC5pbm5lckhUTUwpfHwobC5pbm5lckhUTUw9aCYmaC5fX2h0bWx8fFwiXCIpKX1pZihrKGwscCx5LHIsZSksaCl1Ll9faz1bXTtlbHNlIGlmKF89dS5wcm9wcy5jaGlsZHJlbixIKGwsQXJyYXkuaXNBcnJheShfKT9fOltfXSx1LGksdCxyJiZcImZvcmVpZ25PYmplY3RcIiE9PWQsbyxmLG8/b1swXTppLl9fayYmQShpLDApLGUpLG51bGwhPW8pZm9yKF89by5sZW5ndGg7Xy0tOyludWxsIT1vW19dJiZ2KG9bX10pO2V8fChcInZhbHVlXCJpbiBwJiZ2b2lkIDAhPT0oXz1wLnZhbHVlKSYmKF8hPT1sLnZhbHVlfHxcInByb2dyZXNzXCI9PT1kJiYhX3x8XCJvcHRpb25cIj09PWQmJl8hPT15LnZhbHVlKSYmZyhsLFwidmFsdWVcIixfLHkudmFsdWUsITEpLFwiY2hlY2tlZFwiaW4gcCYmdm9pZCAwIT09KF89cC5jaGVja2VkKSYmXyE9PWwuY2hlY2tlZCYmZyhsLFwiY2hlY2tlZFwiLF8seS5jaGVja2VkLCExKSl9cmV0dXJuIGx9ZnVuY3Rpb24gUyhuLHUsaSl7dHJ5e1wiZnVuY3Rpb25cIj09dHlwZW9mIG4/bih1KTpuLmN1cnJlbnQ9dX1jYXRjaChuKXtsLl9fZShuLGkpfX1mdW5jdGlvbiBxKG4sdSxpKXt2YXIgdCxyO2lmKGwudW5tb3VudCYmbC51bm1vdW50KG4pLCh0PW4ucmVmKSYmKHQuY3VycmVudCYmdC5jdXJyZW50IT09bi5fX2V8fFModCxudWxsLHUpKSxudWxsIT0odD1uLl9fYykpe2lmKHQuY29tcG9uZW50V2lsbFVubW91bnQpdHJ5e3QuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChuKXtsLl9fZShuLHUpfXQuYmFzZT10Ll9fUD1udWxsLG4uX19jPXZvaWQgMH1pZih0PW4uX19rKWZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXSYmcSh0W3JdLHUsaXx8XCJmdW5jdGlvblwiIT10eXBlb2Ygbi50eXBlKTtpfHxudWxsPT1uLl9fZXx8dihuLl9fZSksbi5fXz1uLl9fZT1uLl9fZD12b2lkIDB9ZnVuY3Rpb24gQihuLGwsdSl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3Iobix1KX1mdW5jdGlvbiBEKHUsaSx0KXt2YXIgcixvLGY7bC5fXyYmbC5fXyh1LGkpLG89KHI9XCJmdW5jdGlvblwiPT10eXBlb2YgdCk/bnVsbDp0JiZ0Ll9fa3x8aS5fX2ssZj1bXSxNKGksdT0oIXImJnR8fGkpLl9faz15KF8sbnVsbCxbdV0pLG98fGMsYyx2b2lkIDAhPT1pLm93bmVyU1ZHRWxlbWVudCwhciYmdD9bdF06bz9udWxsOmkuZmlyc3RDaGlsZD9uLmNhbGwoaS5jaGlsZE5vZGVzKTpudWxsLGYsIXImJnQ/dDpvP28uX19lOmkuZmlyc3RDaGlsZCxyKSxOKGYsdSl9ZnVuY3Rpb24gRShuLGwpe0QobixsLEUpfWZ1bmN0aW9uIEYobCx1LGkpe3ZhciB0LHIsbyxmPWgoe30sbC5wcm9wcyk7Zm9yKG8gaW4gdSlcImtleVwiPT1vP3Q9dVtvXTpcInJlZlwiPT1vP3I9dVtvXTpmW29dPXVbb107cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MiYmKGYuY2hpbGRyZW49YXJndW1lbnRzLmxlbmd0aD4zP24uY2FsbChhcmd1bWVudHMsMik6aSkscChsLnR5cGUsZix0fHxsLmtleSxyfHxsLnJlZixudWxsKX1mdW5jdGlvbiBHKG4sbCl7dmFyIHU9e19fYzpsPVwiX19jQ1wiK2UrKyxfXzpuLENvbnN1bWVyOmZ1bmN0aW9uKG4sbCl7cmV0dXJuIG4uY2hpbGRyZW4obCl9LFByb3ZpZGVyOmZ1bmN0aW9uKG4pe3ZhciB1LGk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0fHwodT1bXSwoaT17fSlbbF09dGhpcyx0aGlzLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybiBpfSx0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbihuKXt0aGlzLnByb3BzLnZhbHVlIT09bi52YWx1ZSYmdS5zb21lKGZ1bmN0aW9uKG4pe24uX19lPSEwLFQobil9KX0sdGhpcy5zdWI9ZnVuY3Rpb24obil7dS5wdXNoKG4pO3ZhciBsPW4uY29tcG9uZW50V2lsbFVubW91bnQ7bi5jb21wb25lbnRXaWxsVW5tb3VudD1mdW5jdGlvbigpe3Uuc3BsaWNlKHUuaW5kZXhPZihuKSwxKSxsJiZsLmNhbGwobil9fSksbi5jaGlsZHJlbn19O3JldHVybiB1LlByb3ZpZGVyLl9fPXUuQ29uc3VtZXIuY29udGV4dFR5cGU9dX1uPXMuc2xpY2UsbD17X19lOmZ1bmN0aW9uKG4sbCx1LGkpe2Zvcih2YXIgdCxyLG87bD1sLl9fOylpZigodD1sLl9fYykmJiF0Ll9fKXRyeXtpZigocj10LmNvbnN0cnVjdG9yKSYmbnVsbCE9ci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3ImJih0LnNldFN0YXRlKHIuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKG4pKSxvPXQuX19kKSxudWxsIT10LmNvbXBvbmVudERpZENhdGNoJiYodC5jb21wb25lbnREaWRDYXRjaChuLGl8fHt9KSxvPXQuX19kKSxvKXJldHVybiB0Ll9fRT10fWNhdGNoKGwpe249bH10aHJvdyBufX0sdT0wLGk9ZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJnZvaWQgMD09PW4uY29uc3RydWN0b3J9LHQ9ITEseC5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24obixsKXt2YXIgdTt1PW51bGwhPXRoaXMuX19zJiZ0aGlzLl9fcyE9PXRoaXMuc3RhdGU/dGhpcy5fX3M6dGhpcy5fX3M9aCh7fSx0aGlzLnN0YXRlKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiYobj1uKGgoe30sdSksdGhpcy5wcm9wcykpLG4mJmgodSxuKSxudWxsIT1uJiZ0aGlzLl9fdiYmKGwmJnRoaXMuX3NiLnB1c2gobCksVCh0aGlzKSl9LHgucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKG4pe3RoaXMuX192JiYodGhpcy5fX2U9ITAsbiYmdGhpcy5fX2gucHVzaChuKSxUKHRoaXMpKX0seC5wcm90b3R5cGUucmVuZGVyPV8scj1bXSxmPVwiZnVuY3Rpb25cIj09dHlwZW9mIFByb21pc2U/UHJvbWlzZS5wcm90b3R5cGUudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKTpzZXRUaW1lb3V0LCQuX19yPTAsZT0wO2V4cG9ydHt4IGFzIENvbXBvbmVudCxfIGFzIEZyYWdtZW50LEYgYXMgY2xvbmVFbGVtZW50LEcgYXMgY3JlYXRlQ29udGV4dCx5IGFzIGNyZWF0ZUVsZW1lbnQsZCBhcyBjcmVhdGVSZWYseSBhcyBoLEUgYXMgaHlkcmF0ZSxpIGFzIGlzVmFsaWRFbGVtZW50LGwgYXMgb3B0aW9ucyxEIGFzIHJlbmRlcixqIGFzIHRvQ2hpbGRBcnJheX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcmVhY3QubW9kdWxlLmpzLm1hcFxuIiwiLypcbiogICBjYWxjdWxhdGUuanNcbiogICBDYWxjdWxhdGUgdmFyaW91cyBtZXRyaWNzIG9uIHRoZSB0aW1lbGluZSBmb2xsb3ctYmFjayBkYXRhLlxuKi9cblxuaW1wb3J0IHsgVXNlRXZlbnQsIENhbGVuZGFyRXZlbnQgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuaW1wb3J0IHsgQ1ZUX01TX0RBWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG5cbmZ1bmN0aW9uIGNhbGNfdXNlX2RheXMoZXZlbnRsaXN0OiBBcnJheTxDYWxlbmRhckV2ZW50PiwgY2F0ZWdvcnk6IHN0cmluZywgaW5jbHVkZV91bmtub3duOiBib29sZWFuKTogQXJyYXk8c3RyaW5nPiB7XG5cbiAgICBsZXQgdXNlX2RheXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgIGxldCB1c2VfZGF5c19hbW91bnQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChsZXQgZXZlbnQgb2YgZXZlbnRsaXN0KSB7XG4gICAgICAgICAgICBpZigoZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMuY2F0ZWdvcnkgPT09IGNhdGVnb3J5KXtcbiAgICAgICAgICAgICAgICB1c2VfZGF5cy5hZGQoZXZlbnQuZGF0ZS5zdWJzdHJpbmcoMCwxMCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5hbW91bnQgIT0gXCJ1bmtub3duXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdXNlX2RheXNfYW1vdW50LmFkZChldmVudC5kYXRlLnN1YnN0cmluZygwLDEwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBcbiAgICB9XG5cbiAgICBpZiAoaW5jbHVkZV91bmtub3duKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHVzZV9kYXlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh1c2VfZGF5c19hbW91bnQpO1xuICAgIH1cbiAgIFxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY19kYXlzX3VzZWQoZXZlbnRsaXN0OiBBcnJheTxDYWxlbmRhckV2ZW50PiwgY2F0ZWdvcnk6IHN0cmluZykge1xuXG4gICAgbGV0IHVzZV9kYXlzID0gY2FsY191c2VfZGF5cyhldmVudGxpc3QsIGNhdGVnb3J5LCB0cnVlKTtcblxuICAgIHJldHVybiB1c2VfZGF5cy5sZW5ndGg7XG59XG5cbi8vIFVzZWQgdG8gY2FsY3VsYXRlIG51bWJlciBvZiBkYXlzIHdoZXJlIGFtb3VudCB1c2VkIGlzIGtub3duLlxuZXhwb3J0IGZ1bmN0aW9uIGNhbGNfZGF5c191c2VkX2Ftb3VudChldmVudGxpc3Q6IEFycmF5PENhbGVuZGFyRXZlbnQ+LCBjYXRlZ29yeTogc3RyaW5nKSB7XG5cbiAgICBsZXQgdXNlX2RheXMgPSBjYWxjX3VzZV9kYXlzKGV2ZW50bGlzdCwgY2F0ZWdvcnksIGZhbHNlKTtcblxuICAgIHJldHVybiB1c2VfZGF5cy5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjX3RvdGFsX29jY2FzaW9ucyhldmVudGxpc3Q6IEFycmF5PENhbGVuZGFyRXZlbnQ+LCBjYXRlZ29yeTogc3RyaW5nKSB7XG5cbiAgICBsZXQgdG90YWwgPSAwO1xuXG4gICAgZm9yIChsZXQgZXZlbnQgb2YgZXZlbnRsaXN0KSB7XG4gICAgICAgIGlmKChldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5jYXRlZ29yeSA9PT0gY2F0ZWdvcnkpe1xuICAgICAgICAgICAgdG90YWwrPU51bWJlcigoZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMudGltZXMpXG4gICAgICAgIH0gXG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsO1xufVxuXG4vKiBGb3IgYSBwYXJ0aWN1bGFyIHN1YnN0YW5jZSBhbmQgdW5pdCBvZiB0aGF0IHN1YnN0YW5jZSwgcmV0dXJuIHRoZSB0b3RhbFxuICogYW1vdW50IHVzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjX3RvdGFsX3VuaXRzKGV2ZW50bGlzdDogQXJyYXk8Q2FsZW5kYXJFdmVudD4sIHN1YnN0YW5jZTogc3RyaW5nLCB1bml0czogc3RyaW5nKSB7XG5cbiAgICBsZXQgdG90YWwgPSAwO1xuXG4gICAgZm9yIChsZXQgZXZlbnQgb2YgZXZlbnRsaXN0KSB7XG4gICAgICAgIGlmICgoZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMuc3Vic3RhbmNlID09IHN1YnN0YW5jZSAmJiBcbiAgICAgICAgICAgIChldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy51bml0cyA9PSB1bml0cyAmJlxuICAgICAgICAgICAgKGV2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLmFtb3VudCAhPSBcInVua25vd25cIilcbiAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBOdW1iZXIoKGV2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLmFtb3VudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY19kYXlzX3NpbmNlX2xhc3RfdXNlKGV2ZW50bGlzdDogQXJyYXk8Q2FsZW5kYXJFdmVudD4sIGNhdGVnb3J5OiBzdHJpbmcsIGRhdGUgOiBzdHJpbmcpIHtcbiAgICBsZXQgdXNlX2RheXNfc3RyOiBBcnJheTxzdHJpbmc+ID0gY2FsY191c2VfZGF5cyhldmVudGxpc3QsIGNhdGVnb3J5LCB0cnVlKTtcblxuICAgIGlmICh1c2VfZGF5c19zdHIubGVuZ3RoIDwgMSlcbiAgICAgICAgcmV0dXJuIE5hTjtcblxuICAgIGxldCBsYXN0X2RheSA9IHVzZV9kYXlzX3N0ci5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBjdXIpIHtcbiAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZShjdXIpO1xuICAgICAgICByZXR1cm4gKGQgPiBhY2MpID8gZCA6IGFjYztcbiAgICB9LCBuZXcgRGF0ZSh1c2VfZGF5c19zdHJbMF0pKTtcblxuICAgIHJldHVybiAoKChuZXcgRGF0ZShkYXRlKSkudmFsdWVPZigpIC0gbGFzdF9kYXkudmFsdWVPZigpKSAvIENWVF9NU19EQVkpXG59XG4iLCIvKiBjb25zdGFudHMudHNcbiAqIFxuICogRGVmaW5lcyB2YXJpb3VzIGNvbnN0YW50cyB1c2VkIGVsc2V3aGVyZS5cbiAqIFxuICogQ29weXJpZ2h0IChjKSAyMDI0LCBNaWNoYWVsIFBhc2NhbGUgPG1wcGFzY2FsZUBtZ2guaGFydmFyZC5lZHU+XG4gKiBMYXN0IG1vZGlmaWVkOiAyMDI0LTA4LTI2XG4gKi9cblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMy4wLjAnO1xuXG4vLyBUaW1lIGNvbnZlcnNpb24gZmFjdG9ycy5cbmV4cG9ydCBjb25zdCBDVlRfTVNfUyA9IDEwMDA7XG5leHBvcnQgY29uc3QgQ1ZUX1NfTUlOICA9IDYwO1xuZXhwb3J0IGNvbnN0IENWVF9NSU5fSFIgPSA2MDtcbmV4cG9ydCBjb25zdCBDVlRfSFJfREFZID0gMjQ7XG5leHBvcnQgY29uc3QgQ1ZUX01TX0RBWSA9IENWVF9NU19TICogQ1ZUX1NfTUlOICogQ1ZUX01JTl9IUiAqIENWVF9IUl9EQVk7XG5cbi8vIFRoZSBjYWxlbmRhciBoZWlnaHQgd2lsbCBiZSBzZXQgdG8gd2luZG93LmlubmVySGVpZ2h0IC0gQ0FMX0hFSUdIVF9ESUZGLlxuZXhwb3J0IGNvbnN0IENBTF9IRUlHSFRfRElGRiA9IDIwNTtcblxuXG5leHBvcnQgY29uc3QgQ09MT1JfV0hJVEUgID0gJyNGRkZGRkYnO1xuZXhwb3J0IGNvbnN0IENPTE9SX1RFWFQgICA9ICcjMTUxNDFBJztcblxuZXhwb3J0IGNvbnN0IENPTE9SX1BVUlBMRSA9ICcjNDg1RkM3JztcbmV4cG9ydCBjb25zdCBDT0xPUl9PUkFOR0UgPSAnI0U2Nzk3NSc7XG5leHBvcnQgY29uc3QgQ09MT1JfWUVMTE9XID0gJyNGN0RCQTcnO1xuZXhwb3J0IGNvbnN0IENPTE9SX0dSRUVOICA9ICcjMDQxRjFFJztcbmV4cG9ydCBjb25zdCBDT0xPUl9CUk9XTiAgPSAnIzVBMzUyQSc7XG5cbi8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIGlucHV0IHZhbGlkYXRpb24uXG5leHBvcnQgY29uc3QgUkdYX0lOVEVHRVIgPSAvXlxcZCskLztcbmV4cG9ydCBjb25zdCBSR1hfV09SRCAgICA9IC9eXFx3KyQvO1xuZXhwb3J0IGNvbnN0IFJHWF9EQVRFICAgID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvOyAvLyBZWVlZLU1NLUREXG4iLCIvKiBlZGl0b3IudHNcbiAqXG4gKiBUaGUgRWRpdG9yIGNsYXNzIGRlZmluZXMgYSB0eXBlIG9mIG9iamVjdCB0aGF0IG1hbmFnZXMgdGhlIHN0YXRlIG9mIHRoZSB1c2VyXG4gKiBpbnRlcmZhY2UsIHJlc3BvbmRzIHRvIGNsaWNrcywgb3BlbnMgZGlhbG9ndWVzLCBhbmQgZ2VuZXJhbGx5IGhhbmRsZXNcbiAqIFwiZWRpdGluZ1wiIGFjdGlvbnMuXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDI0LCBNaWNoYWVsIFBhc2NhbGUgPG1wcGFzY2FsZUBtZ2guaGFydmFyZC5lZHU+XG4gKiAgICAgICAgICAgICAgICAgICAgIEl2eSBaaHUgPGl6aHUxQG1naC5oYXJ2YXJkLmVkdT5cbiAqIExhc3QgbW9kaWZpZWQ6IDIwMjQtMDgtMTlcbiAqL1xuXG5pbXBvcnQgeyBDYWxlbmRhciwgRGF0ZVNlbGVjdEFyZywgRXZlbnRDbGlja0FyZyB9IGZyb20gXCJAZnVsbGNhbGVuZGFyL2NvcmVcIjtcbmltcG9ydCB7IERhdGVDbGlja0FyZyB9IGZyb20gXCJAZnVsbGNhbGVuZGFyL2ludGVyYWN0aW9uXCI7XG5cbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi9tb2RhbCdcbmltcG9ydCB7IENhbGVuZGFyRXZlbnRMaXN0LCBLZXlFdmVudCwgVXNlRXZlbnQsIENhbGVuZGFyRXZlbnQsIE5vVXNlRXZlbnQgfSBmcm9tIFwiLi9zdGF0ZVwiO1xuXG5pbXBvcnQgeyBTdWJzdGFuY2VMaXN0LCBTdWJzdGFuY2VJbmZvLCBVc2VFdmVudFByb3BlcnRpZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vLyBLZWVwIHRyYWNrIG9mIHRoZSBlZGl0IG1vZGUuXG5leHBvcnQgY2xhc3MgRWRpdG9yIHtcbiAgICBwcml2YXRlIF9tb2RlOiAnYWRkLWtleScgfCAnYWRkLXN1JyB8ICduby1zdWInIHwgJ2NvcHknIHwgJ2RlbGV0ZScgfCBudWxsO1xuICAgIHByaXZhdGUgX25vdGlmaWNhdGlvbjogSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBUaGUgY29weSBidWZmZXIgc3RvcmVzIGFuIGV2ZW50IGlkIHRvIGJlIGNvcGllZC5cbiAgICBwcml2YXRlIF9jb3B5X2J1ZmZlcjogQ2FsZW5kYXJFdmVudCB8IG51bGwgPSBudWxsXG5cbiAgICBwcml2YXRlIF9jYWxlbmRhcjogQ2FsZW5kYXI7XG5cbiAgICBwcml2YXRlIF9tb2RhbF9rZXlfZXZlbnQ6IE1vZGFsO1xuICAgIHByaXZhdGUgX21vZGFsX3N1Yl9ldmVudDogTW9kYWw7XG4gICAgcHJpdmF0ZSBfbW9kYWxfY29uZmlybTogTW9kYWw7XG5cbiAgICBwcml2YXRlIF9ldmVudF9saXN0OiBDYWxlbmRhckV2ZW50TGlzdFxuXG4gICAgcHJpdmF0ZSBfc3Vic3RhbmNlX2xpc3Q6IFN1YnN0YW5jZUxpc3Q7XG4gICAgcHJpdmF0ZSBfc3Vic3RhbmNlc191c2VkOiB7XG4gICAgICAgIFtuYW1lOiBzdHJpbmddOiBBcnJheTxTdWJzdGFuY2VJbmZvPlxuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihjYWxlbmRhcjogQ2FsZW5kYXIpIHtcbiAgICAgICAgdGhpcy5fbW9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyID0gY2FsZW5kYXI7XG4gICAgICAgIHRoaXMuX3N1YnN0YW5jZV9saXN0ID0gcmVxdWlyZSgnLi4vc3Vic3RhbmNlcy5qc29uJyk7XG5cbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGUtbm90aWZpY2F0aW9uJykgYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICB0aGlzLl9zdWJzdGFuY2VzX3VzZWQgPSB7fVxuXG4gICAgICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRsZmItZWRpdC1tb2RlJykuZm9yRWFjaCh4ID0+IHguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXYpID0+IHRoaXMubW9kZShldikpKVxuXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLm9uKCdkYXRlQ2xpY2snLCAoZXYpID0+IHRoaXMuY2xpY2tfZGF0ZShldikpXG4gICAgICAgIHRoaXMuX2NhbGVuZGFyLm9uKCdldmVudENsaWNrJywgKGV2KSA9PiB0aGlzLmNsaWNrX2V2ZW50KGV2KSlcbiAgICAgICAgdGhpcy5fY2FsZW5kYXIub24oJ3NlbGVjdCcsIChldikgPT4gdGhpcy5zZWxlY3RfcmFuZ2UoZXYpKVxuXG4gICAgICAgIHRoaXMuX21vZGFsX2tleV9ldmVudCA9IG5ldyBNb2RhbCgnbW9kYWwta2V5LWV2ZW50JylcbiAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50ID0gbmV3IE1vZGFsKCdtb2RhbC1zdWJzdGFuY2UtZXZlbnQnKVxuICAgICAgICB0aGlzLl9tb2RhbF9jb25maXJtID0gbmV3IE1vZGFsKCdtb2RhbC1jb25maXJtJylcblxuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7IFxuICAgICAgICBjb25zdCBzdGFydCA9IChxdWVyeS5nZXQoJ3N0YXJ0JykgPT0gdW5kZWZpbmVkKSA/IHF1ZXJ5LmdldCgnc3RhcnQnKSBhcyBzdHJpbmcgOiAnMjAwMC0wMS0wMSdcbiAgICAgICAgY29uc3QgZW5kID0gKHF1ZXJ5LmdldCgnZW5kJykgPT0gdW5kZWZpbmVkKSA/IHF1ZXJ5LmdldCgnZW5kJykgYXMgc3RyaW5nIDogJzIwMDAtMDEtMDEnXG4gICAgICAgIHRoaXMuX2V2ZW50X2xpc3QgPSBuZXcgQ2FsZW5kYXJFdmVudExpc3Qoc3RhcnQsIGVuZCwgdGhpcy5fY2FsZW5kYXIpXG4gICAgfSBcblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fbW9kZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2NvcHlfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uLmlubmVyVGV4dCA9ICdDbGljayB0aGUgZWRpdCBtZW51IHRvIGJlZ2luIGFkZGluZyBldmVudHMuJ1xuICAgIH1cblxuICAgIHB1YmxpYyBtb2RlKGRldnQ6IEV2ZW50KSB7XG5cbiAgICAgICAgY29uc3QgY2xpY2tlZCA9IChkZXZ0LnRhcmdldCBhcyBFbGVtZW50KS5pZDtcblxuICAgICAgICB0aGlzLmNsZWFyKClcblxuICAgICAgICBzd2l0Y2ggKGNsaWNrZWQpe1xuICAgICAgICAgICAgY2FzZSAnZWRpdC1tb2RlLWtleS1ldmVudCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9ICdhZGQta2V5J1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYSBkYXRlIG9uIHRoZSBjYWxlbmRhciB0byBhZGQgYSA8Yj5rZXkgZGF0ZTwvYj4uJ1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZWRpdC1tb2RlLXN1YnN0YW5jZS1ldmVudCc6XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N1YnN0YW5jZXNfdXNlZCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uLmlubmVySFRNTCA9ICdQbGVhc2UgdXBkYXRlIHRoZSA8Yj5zdWJzdGFuY2UgbGlzdDwvYj4gdG8gaW5jbHVkZSBhdCBsZWFzdCBvbmUgc3Vic3RhbmNlLidcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gJ2FkZC1zdSdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uLmlubmVySFRNTCA9ICdDbGljayBhIGRhdGUgb24gdGhlIGNhbGVuZGFyIHRvIGFkZCBhIDxiPnN1YnN0YW5jZSB1c2UgZXZlbnQ8L2I+LidcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlZGl0LW1vZGUtbm8tc3Vic3RhbmNlJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gJ25vLXN1YidcbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb24uaW5uZXJIVE1MID0gJ0NsaWNrIGEgZGF0ZSBvbiB0aGUgY2FsZW5kYXIgb24gd2hpY2ggdGhlcmUgd2FzIG5vIHN1YnN0YW5jZXMgdXNlZC4nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlZGl0LW1vZGUtY29weSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9ICdjb3B5J1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYW4gZXZlbnQgb24gdGhlIGNhbGVuZGFyIHRvIDxiPmNvcHk8L2I+LidcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2VkaXQtbW9kZS1kZWxldGUnOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vZGUgPSAnZGVsZXRlJ1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYW4gZXZlbnQgb24gdGhlIGNhbGVuZGFyIHRvIDxiPmRlbGV0ZTwvYj4uJ1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRWRpdC5tb2RlKCk6IEludmFsaWQgdGFyZ2V0IHJlY2VpdmVkLicpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhgRWRpdC5tb2RlKCk6ICR7dGhpcy5fbW9kZX1gKVxuICAgIH1cblxuXG4gICAgLy8gQWRkIHN1YnN0YW5jZSBldmVudCBmdW5jdGlvbnM6XG4gICAgcHJpdmF0ZSB1cGRhdGVfc3ViX29wdGlvbnMob3B0aW9uczogQXJyYXk8e3ZhbHVlOnN0cmluZywgbGFiZWw6c3RyaW5nfT4sIGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB1cGRhdGluZyBkcm9wZG93biBvcHRpb25zXG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gXCJcIlxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgZWxlbWVudC5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICAgICAgICAgJ2JlZm9yZWVuZCcsIFxuICAgICAgICAgICAgICAgIGA8b3B0aW9uIHZhbHVlPVwiJHtvcHRpb24udmFsdWV9XCI+JHtvcHRpb24ubGFiZWx9PC9vcHRpb24+YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV9hbW91bnQoKSB7XG4gICAgICAgIC8vIFRvZ2dsZSBhbW91bnQgdGV4dCBib3ggYmFzZWQgb24gaWYgYW1vdW50IGlzIGtub3duXG4gICAgICAgIGNvbnN0IGFtb3VudF9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtYW1vdW50JykgYXMgSFRNTElucHV0RWxlbWVudFxuICAgICAgICBjb25zdCBhbW91bnRfdW5rbm93bl9lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtYW1vdW50LXVua25vd24nKSBhcyBIVE1MSW5wdXRFbGVtZW50XG5cbiAgICAgICAgaWYgKGFtb3VudF91bmtub3duX2VsLmNoZWNrZWQpIHtcbiAgICAgICAgICAgIGFtb3VudF9lbC52YWx1ZSA9IFwiXCJcbiAgICAgICAgICAgIGFtb3VudF9lbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgICAgIGFtb3VudF9lbC5yZXF1aXJlZCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbW91bnRfZWwudmFsdWUgPSBcIlwiXG4gICAgICAgICAgICBhbW91bnRfZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgICAgICAgYW1vdW50X2VsLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVfdW5pdHMoKXtcbiAgICAgICAgLy8gVG9nZ2xlIHVuaXRzIGlucHV0cyBiYXNlZCBvbiBpZiB1bml0cyBpcyBrbm93blxuICAgICAgICBjb25zdCB1bml0c19lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMnKSBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgIGNvbnN0IHVuaXRzX290aGVyX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC11bml0cy1vdGhlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgY29uc3QgdW5rbm93bl91bml0c19lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMtdW5rbm93bicpIGFzIEhUTUxJbnB1dEVsZW1lbnRcblxuICAgICAgICBpZiAodW5rbm93bl91bml0c19lbC5jaGVja2VkKSB7XG4gICAgICAgICAgICB1bml0c19vdGhlcl9lbC52YWx1ZSA9IFwiXCJcbiAgICAgICAgICAgIHVuaXRzX2VsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICAgICAgdW5pdHNfZWwucmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgICAgdW5pdHNfb3RoZXJfZWwuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0c19vdGhlcl9lbC52YWx1ZSA9IFwiXCJcbiAgICAgICAgICAgIHVuaXRzX2VsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgIHVuaXRzX2VsLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgICAgICAgdW5pdHNfb3RoZXJfZWwuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IGZhbHNlXG5cbiAgICAgICAgICAgIGlmICghdW5pdHNfZWwuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdW5pdHNfZWwuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgdW5pdHNfZWwucmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHVuaXRzX2VsLnZhbHVlID09PSBcIm90aGVyX3VuaXRcIikge1xuICAgICAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlX3R5cGVfb3B0aW9ucyhzdWJzdGFuY2U6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdHlwZV9vcHRpb25zX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC10eXBlJykgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gICAgICAgIGNvbnN0IHN1YnN0YW5jZV9pbmZvOiBTdWJzdGFuY2VJbmZvIHwgdW5kZWZpbmVkID0gdGhpcy5fc3Vic3RhbmNlX2xpc3Quc3Vic3RhbmNlW3N1YnN0YW5jZV0uZmluZCgoc3ViKSA9PiBzdWIubGFiZWwgPT09IG1ldGhvZClcblxuICAgICAgICBpZiAoc3Vic3RhbmNlX2luZm8gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0YW5jZV9pbmZvLmhhc093blByb3BlcnR5KCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZV9vcHRpb25zX2VsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfb3B0aW9uczogQXJyYXk8e3ZhbHVlOnN0cmluZywgbGFiZWw6c3RyaW5nfT4gPSBbXVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RhbmNlX2luZm8udHlwZSEuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9vcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidmFsdWVcIjogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0eXBlX29wdGlvbnMucHVzaCh7XCJ2YWx1ZVwiOiBcInVua25vd25cIiwgXCJsYWJlbFwiOiBcInVua25vd25cIn0pXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfc3ViX29wdGlvbnModHlwZV9vcHRpb25zLCB0eXBlX29wdGlvbnNfZWwpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZV9vcHRpb25zX2VsLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZV9vcHRpb25zX2VsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHR5cGVfb3B0aW9uc19lbC5pbm5lckhUTUwgPSBcIlwiXG4gICAgICAgICAgICB0eXBlX29wdGlvbnNfZWwuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlX3VuaXRfb3B0aW9ucyhzdWJzdGFuY2U6IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdW5pdHNfb3B0aW9uc19lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMnKSBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgIGNvbnN0IHVuaXRzX290aGVyX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC11bml0cy1vdGhlcicpIGFzIEhUTUxJbnB1dEVsZW1lbnRcblxuICAgICAgICBjb25zdCB1bml0X29wdGlvbnMgOiBBcnJheTx7dmFsdWU6c3RyaW5nLCBsYWJlbDpzdHJpbmd9PiA9IFtdXG5cbiAgICAgICAgY29uc3Qgc3Vic3RhbmNlX2luZm86IFN1YnN0YW5jZUluZm8gfCB1bmRlZmluZWQgPSB0aGlzLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2Vbc3Vic3RhbmNlXS5maW5kKChzdWIpID0+IHN1Yi5sYWJlbCA9PT0gbWV0aG9kKVxuXG4gICAgICAgIGlmIChzdWJzdGFuY2VfaW5mbyAhPSB1bmRlZmluZWQpIHsgXG4gICAgICAgICAgICBpZiAoc3Vic3RhbmNlX2luZm8uaGFzT3duUHJvcGVydHkoJ3VuaXRzJykpIHtcbiAgICAgICAgICAgICAgICB1bml0c19vcHRpb25zX2VsLmRpc2FibGVkID0gZmFsc2VcbiAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgc3Vic3RhbmNlX2luZm8udW5pdHMhLmZvckVhY2goKHVuaXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdF9vcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiB1bml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB1bml0XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB1bml0X29wdGlvbnMucHVzaCh7XCJ2YWx1ZVwiOiBcIm90aGVyX3VuaXRcIiwgXCJsYWJlbFwiOiBcIm90aGVyXCJ9KVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX3N1Yl9vcHRpb25zKHVuaXRfb3B0aW9ucywgdW5pdHNfb3B0aW9uc19lbClcbiAgICBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5pdHNfb3B0aW9uc19lbC5pbm5lckhUTUwgPSBcIlwiXG4gICAgICAgICAgICAgICAgdW5pdHNfb3RoZXJfZWwudmFsdWUgPSBcIlwiXG4gICAgICAgICAgICAgICAgdW5pdHNfb3B0aW9uc19lbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgIHVuaXRzX29wdGlvbnNfZWwuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodW5pdHNfb3B0aW9uc19lbC52YWx1ZSA9PSBcIm90aGVyX3VuaXRcIikge1xuICAgICAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5kaXNhYmxlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLnZhbHVlID0gXCJcIlxuICAgICAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgdW5pdHNfb3RoZXJfZWwucmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bml0c19vcHRpb25zX2VsLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLnZhbHVlID0gXCJcIlxuICAgICAgICAgICAgdW5pdHNfb3B0aW9uc19lbC5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgICAgIHVuaXRzX290aGVyX2VsLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgICAgICAgdW5pdHNfb3RoZXJfZWwucmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlX3VuaXRzKClcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV9tZXRob2Rfb3B0aW9ucyhzdWJzdGFuY2U6IHN0cmluZywgY2hhbmdlX29wdGlvbnM6IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbWV0aG9kX29wdGlvbnNfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic3RhbmNlLWV2ZW50LW1ldGhvZCcpIGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgY29uc3QgbWV0aG9kX290aGVyX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC1tZXRob2Qtb3RoZXInKSEgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gICAgICAgIC8vIElmIHRoZSBzdWJzdGFuY2UgY2F0ZWdvcnkgY2hhbmdlcywgY2hhbmdlX29wdGlvbnMgaXMgdHJ1ZSAodXBkYXRlIG9wdGlvbnMgdG8gbWV0aG9kcyBpbiB0aGUgbmV3IGNhdGVnb3J5KVxuICAgICAgICBpZiAoY2hhbmdlX29wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZF9vcHRpb25zIDogQXJyYXk8e3ZhbHVlOnN0cmluZywgbGFiZWw6c3RyaW5nfT4gPSBbXVxuXG4gICAgICAgICAgICB0aGlzLl9zdWJzdGFuY2VzX3VzZWRbc3Vic3RhbmNlXS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICBtZXRob2Rfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBtZXRob2QubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogbWV0aG9kLmxhYmVsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9zdWJfb3B0aW9ucyhtZXRob2Rfb3B0aW9ucywgbWV0aG9kX29wdGlvbnNfZWwpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZV91bml0X29wdGlvbnMoc3Vic3RhbmNlLCBtZXRob2Rfb3B0aW9uc19lbC52YWx1ZSlcbiAgICAgICAgdGhpcy51cGRhdGVfdHlwZV9vcHRpb25zKHN1YnN0YW5jZSwgbWV0aG9kX29wdGlvbnNfZWwudmFsdWUpXG5cbiAgICAgICAgaWYgKG1ldGhvZF9vcHRpb25zX2VsLnZhbHVlLmluY2x1ZGVzKCdPdGhlcicpKSB7XG4gICAgICAgICAgICBtZXRob2Rfb3RoZXJfZWwuZGlzYWJsZWQgPSBmYWxzZVxuICAgICAgICAgICAgbWV0aG9kX290aGVyX2VsLnJlcXVpcmVkID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50LnNldEVsZW1lbnRDbGFzcyh7XG4gICAgICAgICAgICAgICAgJyNzdWJzdGFuY2UtbWV0aG9kLW90aGVyJzogWydpcy1oaWRkZW4nLCBmYWxzZV1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2Rfb3RoZXJfZWwuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICBtZXRob2Rfb3RoZXJfZWwucmVxdWlyZWQgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50LnNldEVsZW1lbnRDbGFzcyh7XG4gICAgICAgICAgICAgICAgJyNzdWJzdGFuY2UtbWV0aG9kLW90aGVyJzogWydpcy1oaWRkZW4nLCB0cnVlXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGhvZF9vcHRpb25zX2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVfbWV0aG9kX29wdGlvbnMoc3Vic3RhbmNlLCBmYWxzZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3Vic3RhbmNlX2V2ZW50X29wdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IGNhdGVnb3J5X29wdGlvbnNfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic3RhbmNlLWV2ZW50LWNhdGVnb3J5JykgYXMgSFRNTElucHV0RWxlbWVudFxuICAgICAgICBjb25zdCBjYXRlZ29yeV9vcHRpb25zIDogQXJyYXk8e3ZhbHVlOnN0cmluZywgbGFiZWw6c3RyaW5nfT4gPSBbXVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1YnN0YW5jZXNfdXNlZCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzdGFuY2UgOiB7aWQgOiBzdHJpbmcsIGxhYmVsIDogc3RyaW5nfSA9IHRoaXMuX3N1YnN0YW5jZV9saXN0LmNhdGVnb3J5LmZpbmQoc3ViID0+IHN1Yi5pZCA9PT0ga2V5LnRvU3RyaW5nKCkpIVxuICAgICAgICAgICAgY2F0ZWdvcnlfb3B0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IHN1YnN0YW5jZS5pZCxcbiAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHN1YnN0YW5jZS5sYWJlbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLnVwZGF0ZV9zdWJfb3B0aW9ucyhjYXRlZ29yeV9vcHRpb25zLCBjYXRlZ29yeV9vcHRpb25zX2VsKVxuICAgICAgICB0aGlzLnVwZGF0ZV9tZXRob2Rfb3B0aW9ucyhjYXRlZ29yeV9vcHRpb25zX2VsLnZhbHVlLCB0cnVlKVxuXG4gICAgICAgIGNhdGVnb3J5X29wdGlvbnNfZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9tZXRob2Rfb3B0aW9ucyhjYXRlZ29yeV9vcHRpb25zX2VsLnZhbHVlLCB0cnVlKVxuICAgICAgICB9KVxuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtYW1vdW50LXVua25vd24nKSEuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZV9hbW91bnQoKVxuICAgICAgICB9KVxuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMtdW5rbm93bicpIS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlX3VuaXRzKClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9zdWJzdGFuY2VfZXZlbnRfcHJvcGVydGllcyhkYXRhOiBGb3JtRGF0YSk6IFVzZUV2ZW50UHJvcGVydGllcyB7XG4gICAgICAgIGNvbnN0IGFtb3VudCA9IChkYXRhLmdldCgnc3Vic3RhbmNlLWV2ZW50LWFtb3VudC11bmtub3duJykgPT09IFwidW5rbm93blwiKSA/IFwidW5rbm93blwiIDogTnVtYmVyKGRhdGEuZ2V0KCdzdWJzdGFuY2UtZXZlbnQtYW1vdW50JykpXG4gICAgICAgIGNvbnN0IHVuaXRzID0gKGRhdGEuZ2V0KCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMtdW5rbm93bicpID09PSBcInVua25vd25cIikgPyBcInVua25vd25cIiA6IGRhdGEuZ2V0KCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMnKSBhcyBzdHJpbmdcblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzIDogVXNlRXZlbnRQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBkYXRhLmdldCgnc3Vic3RhbmNlLWV2ZW50LWNhdGVnb3J5JykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdWJzdGFuY2VcIjogdGhpcy5fc3Vic3RhbmNlX2xpc3QuY2F0ZWdvcnkuZmluZChzdWIgPT4gc3ViLmlkID09PSBkYXRhLmdldCgnc3Vic3RhbmNlLWV2ZW50LWNhdGVnb3J5JykgYXMgc3RyaW5nKSEubGFiZWwsXG4gICAgICAgICAgICBcIm1ldGhvZFR5cGVcIjogZGF0YS5nZXQoJ3N1YnN0YW5jZS1ldmVudC10eXBlJykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJtZXRob2RcIjogZGF0YS5nZXQoJ3N1YnN0YW5jZS1ldmVudC1tZXRob2QnKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBcIm1ldGhvZE90aGVyXCI6IGRhdGEuZ2V0KCdzdWJzdGFuY2UtZXZlbnQtbWV0aG9kLW90aGVyJykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJ0aW1lc1wiOiBOdW1iZXIoZGF0YS5nZXQoJ3N1YnN0YW5jZS1ldmVudC1vY2Nhc2lvbnMnKSksXG4gICAgICAgICAgICBcImFtb3VudFwiOiBhbW91bnQsXG4gICAgICAgICAgICBcInVuaXRzXCI6IHVuaXRzLFxuICAgICAgICAgICAgXCJ1bml0c090aGVyXCI6IGRhdGEuZ2V0KCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMtb3RoZXInKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBcIm5vdGVcIjogZGF0YS5nZXQoJ3N1YnN0YW5jZS1ldmVudC1ub3RlcycpIGFzIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzXG4gICAgfVxuXG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgZGF0ZTpcbiAgICBwdWJsaWMgY2xpY2tfZGF0ZShldjogRGF0ZUNsaWNrQXJnKSB7XG5cbiAgICAgICAgY29uc29sZS5sb2coYEVkaXQuY2xpY2tfZGF0ZSgpOiAke2V2LmRhdGVTdHJ9YClcbiAgICAgICAgXG4gICAgICAgIHN3aXRjaCAodGhpcy5fbW9kZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkLWtleSc6XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1rZXktZXZlbnQnKSEuaW5uZXJUZXh0ID0gXCJBZGQgdG8gVGltZWxpbmVcIlxuICAgICAgICAgICAgICAgIHRoaXMuX21vZGFsX2tleV9ldmVudC5wb3B1bGF0ZVRleHQoe1xuICAgICAgICAgICAgICAgICAgICAnLnN1YnRpdGxlJzogZXYuZGF0ZS50b0RhdGVTdHJpbmcoKVxuICAgICAgICAgICAgICAgIH0pLm9wZW4oKGRhdGE6IEZvcm1EYXRhKT0+e1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudF9saXN0LmFkZChuZXcgS2V5RXZlbnQoZXYuZGF0ZVN0ciwgZGF0YS5nZXQoJ2tleS10ZXh0JykgYXMgc3RyaW5nKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYWRkLXN1JzpcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2hvc2VuIGRhdGUgaGFzIGEgbm8tdXNlIGV2ZW50LCB0aGVuIHN1YnN0YW5jZSB1c2UgZXZlbnRzIGNhbm5vdCBiZSBhZGRlZC5cbiAgICAgICAgICAgICAgICBjb25zdCBub191c2VfZXZlbnRzID0gdGhpcy5fZXZlbnRfbGlzdC5nZXRfZXZlbnRzKCkuZmlsdGVyKChldmVudCkgID0+IE5vVXNlRXZlbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXZlbnQpKVxuICAgICAgICAgICAgICAgIGNvbnN0IG5vX3VzZV9kYXRlcyA9IG5vX3VzZV9ldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZGF0ZSlcblxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYSBkYXRlIG9uIHRoZSBjYWxlbmRhciB0byBhZGQgYSA8Yj5zdWJzdGFuY2UgdXNlIGV2ZW50PC9iPi4nXG5cbiAgICAgICAgICAgICAgICBpZiAobm9fdXNlX2RhdGVzLmluY2x1ZGVzKGV2LmRhdGVTdHIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnUGxlYXNlIHNlbGVjdCBhIHZhbGlkIGRhdGUgZm9yIHRoZSBzdWJzdGFuY2UgZXZlbnQuJ1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbi5pbm5lckhUTUwgPSAnQ2xpY2sgYSBkYXRlIG9uIHRoZSBjYWxlbmRhciB0byBhZGQgYSA8Yj5zdWJzdGFuY2UgdXNlIGV2ZW50PC9iPi4nXG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1zdWJzdGFuY2UtZXZlbnQnKSEuaW5uZXJUZXh0ID0gXCJBZGQgdG8gVGltZWxpbmVcIlxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic3RhbmNlX2V2ZW50X29wdGlvbnMoKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV9hbW91bnQoKVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGFsX3N1Yl9ldmVudC5wb3B1bGF0ZVRleHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgJy5zdWJ0aXRsZSc6IGV2LmRhdGUudG9EYXRlU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzIDogVXNlRXZlbnRQcm9wZXJ0aWVzID0gdGhpcy5nZXRfc3Vic3RhbmNlX2V2ZW50X3Byb3BlcnRpZXMoZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50X2xpc3QuYWRkKG5ldyBVc2VFdmVudChldi5kYXRlU3RyLCBwcm9wZXJ0aWVzKSlcbiAgICAgICAgICAgICAgICAgICAgfSkgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vLXN1Yic6XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5hZGQobmV3IE5vVXNlRXZlbnQoZXYuZGF0ZVN0cikpXG4gICAgICAgICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29weV9idWZmZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29weSA9IHRoaXMuX2NvcHlfYnVmZmVyLmNsb25lKClcbiAgICAgICAgICAgICAgICAgICAgY29weS5zZXRfZGF0ZShldi5kYXRlU3RyKS5zZXRfZ2lkKHRoaXMuX2NvcHlfYnVmZmVyLmdpZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5hZGQoY29weSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGRhdGUgcmFuZ2U6XG4gICAgcHVibGljIHNlbGVjdF9yYW5nZShldjogRGF0ZVNlbGVjdEFyZykge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGBFZGl0LnNlbGVjdF9yYW5nZSgpOiAke2V2LnN0YXJ0U3RyfSB0byAke2V2LmVuZFN0cn1gKVxuXG4gICAgICAgIGNvbnN0IHVudGlsID0gbmV3IERhdGUoZXYuZW5kU3RyKVxuICAgICAgICB1bnRpbC5zZXREYXRlKGV2LmVuZC5nZXREYXRlKCkgLSAyKVxuICAgICAgICBjb25zdCB1bnRpbFN0ciA9IHVudGlsLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsMTApXG5cbiAgICAgICAgc3dpdGNoICh0aGlzLl9tb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdhZGQta2V5JzpcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RhbF9rZXlfZXZlbnQucG9wdWxhdGVUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgJy5zdWJ0aXRsZSc6IGAke2V2LnN0YXJ0LnRvRGF0ZVN0cmluZygpfSB0byAke3VudGlsLnRvRGF0ZVN0cmluZygpfWBcbiAgICAgICAgICAgICAgICB9KS5vcGVuKChkYXRhOiBGb3JtRGF0YSk9PntcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBuZXcgS2V5RXZlbnQoZXYuc3RhcnRTdHIsIGRhdGEuZ2V0KCdrZXktdGV4dCcpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50X2xpc3QuaW1wb3J0X2V2ZW50cyhrZXkubWFrZV9yZWN1cnJlbmNlKFsxLDIsMyw0LDUsNiw3XSwgdW50aWxTdHIpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICduby1zdWInOlxuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG5ldyBOb1VzZUV2ZW50KGV2LnN0YXJ0U3RyKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRfbGlzdC5pbXBvcnRfZXZlbnRzKGtleS5tYWtlX3JlY3VycmVuY2UoWzEsMiwzLDQsNSw2LDddLCB1bnRpbFN0cikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8vIEhhbmRsZSBjbGljayBvbiBldmVudDpcbiAgICBwdWJsaWMgY2xpY2tfZXZlbnQoZXY6IEV2ZW50Q2xpY2tBcmcpIHtcblxuICAgICAgICBjb25zb2xlLmxvZyhgRWRpdC5jbGlja19ldmVudCgpOiAke2V2LmV2ZW50LnRpdGxlfSAoZXZlbnQgJHtldi5ldmVudC5pZH0gLyBncm91cCAke2V2LmV2ZW50Lmdyb3VwSWR9KWApXG5cbiAgICAgICAgc3dpdGNoICh0aGlzLl9tb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgICAgICAgICAvLyBGSVhNRTogaWYgbm90aGluZyBpbiBidWZmZXIsIHB1dCBpbiBidWZmZXIuXG4gICAgICAgICAgICAgICAgLy8gICAgICAgIGlmIHNvbWV0aGluZyBpbiBidWZmZXIsIGR1cGxpY2F0ZS5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb3B5X2J1ZmZlciA9IHRoaXMuX2V2ZW50X2xpc3QuZ2V0X2V2ZW50KE51bWJlcihldi5ldmVudC5pZCkpXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uLmlubmVySFRNTCA9IGBDbGljayBhbnkgZGF0ZSB0byBwYXN0ZSB0aGUgZXZlbnQgY2FsbGVkIDxiPiR7dGhpcy5fY29weV9idWZmZXIudGl0bGV9PC9iPi5gXG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVfZXZlbnQoTnVtYmVyKGV2LmV2ZW50LmlkKSlcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgLy8gRWRpdCBrZXkvdXNlIGV2ZW50cyBvbiBkZWZhdWx0XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbGlja2VkX2V2ZW50ID0gdGhpcy5fZXZlbnRfbGlzdC5nZXRfZXZlbnQoTnVtYmVyKGV2LmV2ZW50LmlkKSlcbiAgICAgICAgICAgICAgICBpZiAoS2V5RXZlbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoY2xpY2tlZF9ldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5X2V2ZW50X2RhdGE6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwia2V5LXRleHRcIjogY2xpY2tlZF9ldmVudC50aXRsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGFsX2tleV9ldmVudC5wb3B1bGF0ZUZvcm0oa2V5X2V2ZW50X2RhdGEpXG5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZC1rZXktZXZlbnQnKSEuaW5uZXJUZXh0ID0gXCJVcGRhdGVcIjtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RhbF9rZXlfZXZlbnQucG9wdWxhdGVUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICcuc3VidGl0bGUnOiBjbGlja2VkX2V2ZW50LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLl9ldmVudF9saXN0LmdldF9ldmVudF9ncm91cChOdW1iZXIoZXYuZXZlbnQuZ3JvdXBJZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQgYXMgS2V5RXZlbnQpLnNldF9wcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBkYXRhLmdldCgna2V5LXRleHQnKSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBldi5ldmVudC5zZXRQcm9wKCd0aXRsZScsIGRhdGEuZ2V0KCdrZXktdGV4dCcpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2ZW50c0xpc3QnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9ldmVudF9saXN0LmdldF9ldmVudHMoKSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihjbGlja2VkX2V2ZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXNlX2V2ZW50X2RhdGE6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3Vic3RhbmNlLWV2ZW50LXVuaXRzLW90aGVyXCI6IChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLnVuaXRzT3RoZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInN1YnN0YW5jZS1ldmVudC1vY2Nhc2lvbnNcIjogKChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLnRpbWVzKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzdWJzdGFuY2UtZXZlbnQtbm90ZXNcIjogKGNsaWNrZWRfZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMubm90ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3Vic3RhbmNlLWV2ZW50LXR5cGVcIjogKGNsaWNrZWRfZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMubWV0aG9kVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgoY2xpY2tlZF9ldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5hbW91bnQgPT09IFwidW5rbm93blwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC1hbW91bnQtdW5rbm93bicpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2V2ZW50X2RhdGFbXCJzdWJzdGFuY2UtZXZlbnQtYW1vdW50XCJdID0gKChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLmFtb3VudCkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLnVuaXRzID09PSBcInVua25vd25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWJzdGFuY2UtZXZlbnQtdW5pdHMtdW5rbm93bicpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2V2ZW50X2RhdGFbXCJzdWJzdGFuY2UtZXZlbnQtdW5pdHNcIl0gPSAoKGNsaWNrZWRfZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMudW5pdHMpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnN0YW5jZV9ldmVudF9vcHRpb25zKCkgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGFsX3N1Yl9ldmVudC5wb3B1bGF0ZUZvcm0oeyBcInN1YnN0YW5jZS1ldmVudC1jYXRlZ29yeVwiOiAoY2xpY2tlZF9ldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5jYXRlZ29yeX0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX21ldGhvZF9vcHRpb25zKChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLmNhdGVnb3J5LCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RhbF9zdWJfZXZlbnQucG9wdWxhdGVGb3JtKHsgXCJzdWJzdGFuY2UtZXZlbnQtbWV0aG9kLW90aGVyXCI6IChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLm1ldGhvZE90aGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzdWJzdGFuY2UtZXZlbnQtbWV0aG9kXCI6IChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLm1ldGhvZCx9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV9tZXRob2Rfb3B0aW9ucygoY2xpY2tlZF9ldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5jYXRlZ29yeSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX3R5cGVfb3B0aW9ucygoY2xpY2tlZF9ldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllcy5jYXRlZ29yeSwgKGNsaWNrZWRfZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMubWV0aG9kKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV91bml0X29wdGlvbnMoKGNsaWNrZWRfZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMuY2F0ZWdvcnksIChjbGlja2VkX2V2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLm1ldGhvZClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfYW1vdW50KClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kYWxfc3ViX2V2ZW50LnBvcHVsYXRlRm9ybSh1c2VfZXZlbnRfZGF0YSlcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1bml0c19vcHRpb25zX2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N1YnN0YW5jZS1ldmVudC11bml0cycpIGFzIEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdHNfb3RoZXJfZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3Vic3RhbmNlLWV2ZW50LXVuaXRzLW90aGVyJykgYXMgSFRNTElucHV0RWxlbWVudFxuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0c19vcHRpb25zX2VsLnZhbHVlID09IFwib3RoZXJfdW5pdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5kaXNhYmxlZCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB1bml0c19vdGhlcl9lbC5yZXF1aXJlZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc3Vic3RhbmNlLWV2ZW50JykhLmlubmVyVGV4dCA9IFwiVXBkYXRlXCJcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RhbF9zdWJfZXZlbnQucG9wdWxhdGVUZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICcuc3VidGl0bGUnOiBjbGlja2VkX2V2ZW50LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzIDogVXNlRXZlbnRQcm9wZXJ0aWVzID0gdGhpcy5nZXRfc3Vic3RhbmNlX2V2ZW50X3Byb3BlcnRpZXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuX2V2ZW50X2xpc3QuZ2V0X2V2ZW50X2dyb3VwKE51bWJlcihldi5ldmVudC5ncm91cElkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cC5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCBhcyBVc2VFdmVudCkuc2V0X3Byb3BlcnRpZXMocHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgZXYuZXZlbnQuc2V0UHJvcCgndGl0bGUnLCB0aGlzLl9ldmVudF9saXN0LmdldF9ldmVudChOdW1iZXIoZXYuZXZlbnQuaWQpKS50aXRsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2ZW50c0xpc3QnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9ldmVudF9saXN0LmdldF9ldmVudHMoKSkpXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9XG5cblxuICAgIC8vIERlbGV0ZSBldmVudCBvciBldmVudHMgKGdyb3VwIGV2ZW50cyk6XG4gICAgcHJpdmF0ZSBkZWxldGVfZXZlbnQoaWQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuX2V2ZW50X2xpc3QuZ2V0X2V2ZW50KGlkKVxuICAgICAgICBjb25zdCBuX3NpYmxpbmdzID0gdGhpcy5fZXZlbnRfbGlzdC5nZXRfZXZlbnRfc2libGluZ3MoaWQpLmxlbmd0aFxuXG4gICAgICAgIGlmIChuX3NpYmxpbmdzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxfY29uZmlybS5wb3B1bGF0ZVRleHQoe1xuICAgICAgICAgICAgICAgICcubW9kYWwtY2FyZC10aXRsZSc6ICdDb25maXJtIERlbGV0aW9uIG9mIE11bHRpcGxlIEV2ZW50cycsXG4gICAgICAgICAgICAgICAgJy5jb250ZW50JzogYDxwPlRoZSBldmVudCBvbiA8Yj4ke2V2ZW50LmRhdGV9PC9iPiB0aXRsZWQgPGk+JHtldmVudC50aXRsZX08L2k+IGlzIHJlbGF0ZWQgdG8gPGI+JHtuX3NpYmxpbmdzfTwvYj4gb3RoZXIgZXZlbnRzLjwvcD5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPHA+Q29uZmlybSB3aGV0aGVyIHlvdSB3YW50IHRvIGRlbGV0ZSA8dT5qdXN0IHRoaXMgZXZlbnQ8L3U+LCBvciA8dT5hbGw8L3U+IG9mIHRoZSBldmVudHMgaW4gdGhlIGdyb3VwLjwvcD5gXG4gICAgICAgICAgICB9KS5zZXRFbGVtZW50Q2xhc3Moe1xuICAgICAgICAgICAgICAgICcjZGVsZXRlLWFsbC1idXR0b24nOiBbJ2lzLWhpZGRlbicsIGZhbHNlXVxuICAgICAgICAgICAgfSkub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG4gICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKCh2LCBrKT0+Y29uc29sZS5sb2coYCR7dn0gJHtrfWApKVxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmdldCgnYWN0aW9uJykgPT0gJ3NpbmdsZScpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50X2xpc3QuZGVsZXRlX2V2ZW50KGlkKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEuZ2V0KCdhY3Rpb24nKSA9PSAnbXVsdGlwbGUnKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudF9saXN0LmRlbGV0ZV9ncm91cChldmVudC5naWQpXG4gICAgICAgICAgICB9KSBcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxfY29uZmlybS5wb3B1bGF0ZVRleHQoe1xuICAgICAgICAgICAgICAgICcubW9kYWwtY2FyZC10aXRsZSc6ICdDb25maXJtIEV2ZW50IERlbGV0aW9uJyxcbiAgICAgICAgICAgICAgICAnLmNvbnRlbnQnOiBgPHA+Q29uZmlybSB0aGF0IHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgZXZlbnQgb24gPGI+JHtldmVudC5kYXRlfTwvYj4gdGl0bGVkIDxpPiR7ZXZlbnQudGl0bGV9PC9pPi48L3A+YFxuICAgICAgICAgICAgfSkuc2V0RWxlbWVudENsYXNzKHtcbiAgICAgICAgICAgICAgICAnI2RlbGV0ZS1hbGwtYnV0dG9uJzogWydpcy1oaWRkZW4nLCB0cnVlXVxuICAgICAgICAgICAgfSkub3BlbigoKT0+e1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50X2xpc3QuZGVsZXRlX2V2ZW50KGlkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTWlzYy4gZnVuY3Rpb25zOlxuICAgIHB1YmxpYyBnZXRfZXZlbnRfbGlzdCgpOiBDYWxlbmRhckV2ZW50TGlzdCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudF9saXN0XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZV9zdWJzdGFuY2VzX3VzZWQobmV3X2xpc3Q6IHtbbmFtZTogc3RyaW5nXTogQXJyYXk8U3Vic3RhbmNlSW5mbz59KSB7XG4gICAgICAgIHRoaXMuX3N1YnN0YW5jZXNfdXNlZCA9IG5ld19saXN0XG4gICAgfVxufVxuIiwiLyogZmlsZS50c1xuKlxuKiBIYW5kbGUgYWN0aW9ucyB1bmRlciBmaWxlIGRyb3Bkb3duOiBleHBvcnRpbmcvaW1wb3J0aW5nIGRhdGEsXG4qIHN1bW1hcml6aW5nIGV2ZW50cywgYW5kIGNoYW5naW5nIFRMRkIgcHJvcGVydGllc1xuKiBcbiogQ29weXJpZ2h0IChjKSAyMDI0LCBJdnkgWmh1IDxpemh1MUBtZ2guaGFydmFyZC5lZHU+XG4qIExhc3QgbW9kaWZpZWQ6IDIwMjQtMDgtMTlcbiovXG5cbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi9tb2RhbCdcbmltcG9ydCB7IHVwZGF0ZV9wcm9wZXJ0aWVzIH0gZnJvbSBcIi4vbWFpblwiO1xuaW1wb3J0IHsgVExGQlByb3BlcnRpZXMsIFN1YnN0YW5jZUxpc3QsIFN1YnN0YW5jZUluZm8sIFN1YnN0YW5jZVVzZUxpc3QsIEpTT05EYXRhLCBTZXJpYWxpemVkRXZlbnQsIFVzZUV2ZW50UHJvcGVydGllcywgSlNPTkV2ZW50IH0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSAnQGZ1bGxjYWxlbmRhci9jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyRGF0ZSwgQ2FsZW5kYXJFdmVudCwgVXNlRXZlbnQsIE5vVXNlRXZlbnQsIEtleUV2ZW50IH0gZnJvbSAnLi9zdGF0ZSc7XG5cbmltcG9ydCAqIGFzIGNhbGN1bGF0ZSBmcm9tICcuL2NhbGN1bGF0ZSdcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vZWRpdG9yJztcbmltcG9ydCB7IFZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBGaWxlIHtcbiAgICBwcml2YXRlIF9jdXJyZW50X3Byb3BlcnRpZXM6IFRMRkJQcm9wZXJ0aWVzO1xuXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXI6IENhbGVuZGFyO1xuICAgIFxuICAgIHByaXZhdGUgX2VkaXRvcjogRWRpdG9yO1xuXG4gICAgcHJpdmF0ZSBfbW9kYWxfc3Vic3RhbmNlczogTW9kYWw7XG4gICAgcHJpdmF0ZSBfbW9kYWxfcHJvcGVydGllczogTW9kYWw7XG4gICAgcHJpdmF0ZSBfbW9kYWxfc3VtbWFyeTogTW9kYWw7XG4gICAgcHJpdmF0ZSBfbW9kYWxfaW1wb3J0X2pzb246IE1vZGFsO1xuICAgIHByaXZhdGUgX21vZGFsX2ltcG9ydF9jc3Y6IE1vZGFsO1xuICAgIHByaXZhdGUgX21vZGFsX2NvbmZpcm1faW1wb3J0OiBNb2RhbDtcblxuICAgIHByaXZhdGUgX3N1YnN0YW5jZV9saXN0OiBTdWJzdGFuY2VMaXN0O1xuICAgIHByaXZhdGUgX3N1YnN0YW5jZXNfdXNlZDogU3Vic3RhbmNlVXNlTGlzdDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih0bGZiX3Byb3BlcnRpZXM6IFRMRkJQcm9wZXJ0aWVzICxjYWxlbmRhcjogQ2FsZW5kYXIsIGVkaXRvcjogRWRpdG9yKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcyA9IHRsZmJfcHJvcGVydGllc1xuICAgICAgICB0aGlzLl9jYWxlbmRhciA9IGNhbGVuZGFyXG5cbiAgICAgICAgdGhpcy5fbW9kYWxfc3Vic3RhbmNlcyA9IG5ldyBNb2RhbCgnbW9kYWwtc2VsZWN0LXN1YnN0YW5jZXMnKTtcbiAgICAgICAgdGhpcy5fbW9kYWxfcHJvcGVydGllcyA9IG5ldyBNb2RhbCgnbW9kYWwtdXBkYXRlLXByb3BlcnRpZXMnKTtcbiAgICAgICAgdGhpcy5fbW9kYWxfc3VtbWFyeSA9IG5ldyBNb2RhbCgnbW9kYWwtZ2V0LXN1bW1hcnknKTtcbiAgICAgICAgdGhpcy5fbW9kYWxfaW1wb3J0X2pzb24gPSBuZXcgTW9kYWwoJ21vZGFsLWltcG9ydC1qc29uJyk7XG4gICAgICAgIHRoaXMuX21vZGFsX2ltcG9ydF9jc3YgPSBuZXcgTW9kYWwoJ21vZGFsLWltcG9ydC1jc3YnKTtcbiAgICAgICAgdGhpcy5fbW9kYWxfY29uZmlybV9pbXBvcnQgPSBuZXcgTW9kYWwoJ21vZGFsLWNvbmZpcm0tZXhwb3J0JylcblxuICAgICAgICB0aGlzLl9zdWJzdGFuY2VfbGlzdCA9IHJlcXVpcmUoJy4uL3N1YnN0YW5jZXMuanNvbicpO1xuXG4gICAgICAgIHRoaXMuX2VkaXRvciA9IGVkaXRvclxuXG4gICAgICAgIC8vIENoZWNrIHNlc3Npb24gc3RvcmFnZSBmb3Igc3Vic3RhbmNlIHVzZSBsaXN0IGFuZCBldmVudCBsaXN0IChwcmVzZXJ2ZSBkYXRhIGFmdGVyIHBhZ2UgcmVmcmVzaClcbiAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3N1YnN0YW5jZXNVc2VkJykgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1YnN0YW5jZXNfdXNlZCA9IHt9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3Vic3RhbmNlc191c2VkID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdzdWJzdGFuY2VzVXNlZCcpIGFzIHN0cmluZylcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvci51cGRhdGVfc3Vic3RhbmNlc191c2VkKHRoaXMuX3N1YnN0YW5jZXNfdXNlZClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdldmVudHNMaXN0JykgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW1pemVkX2V2ZW50cyA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZXZlbnRzTGlzdCcpIGFzIHN0cmluZylcblxuICAgICAgICAgICAgb3B0aW1pemVkX2V2ZW50cy5mb3JFYWNoKChldmVudDogSlNPTkV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuX2RhdGUgPSAoZXZlbnQuX2RhdGUgYXMge19kYXRlOiBzdHJpbmd9KS5fZGF0ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMuZGVzZXJpYWxpemVfZXZlbnRzX2pzb24ob3B0aW1pemVkX2V2ZW50cylcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50bGZiLWZpbGUtbW9kZScpLmZvckVhY2goeCA9PiB4LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2KSA9PiB0aGlzLm1vZGUoZXYpKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbW9kZShkZXZ0OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjbGlja2VkID0gKGRldnQudGFyZ2V0IGFzIEVsZW1lbnQpLmlkO1xuXG4gICAgICAgIHN3aXRjaCAoY2xpY2tlZCl7XG4gICAgICAgICAgICBjYXNlICdtb2RlLWJ1dHRvbi1maWxlLXByb3BlcnRpZXMnOlxuICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9wZXJ0aWVzLXdhcm4nKSEuaW5uZXJUZXh0ID0gXCJcIlxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlX3Byb3BlcnRpZXMoKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9kZS1idXR0b24tZWRpdC1saXN0JzpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdF9zdWJzdGFuY2UoKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9kZS1idXR0b24tc3VtbWFyaXplJzpcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcml6ZSgpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb2RlLWJ1dHRvbi1pbXBvcnQtanNvbic6XG4gICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRfanNvbigpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb2RlLWJ1dHRvbi1pbXBvcnQtY3N2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydF9jc3YoKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9kZS1idXR0b24tZXhwb3J0LWpzb24nOlxuICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0X2pzb24oKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9kZS1idXR0b24tZXhwb3J0LWNzdic6XG4gICAgICAgICAgICAgICAgdGhpcy5leHBvcnRfY3N2KClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgQ2xpY2tlZDogJHtjbGlja2VkfWApXG4gICAgfVxuXG5cbiAgICAvLyBDaGFuZ2UgVExGQiBwcm9wZXJ0aWVzIGZ1bmN0aW9uczpcbiAgICBwdWJsaWMgY2hhbmdlX3Byb3BlcnRpZXMoKSB7XG4gICAgICAgIHRoaXMuX21vZGFsX3Byb3BlcnRpZXMucG9wdWxhdGVGb3JtKHtcbiAgICAgICAgICAgIFwicHJvamVjdC1uYW1lXCI6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5waWQsXG4gICAgICAgICAgICBcImNhbS1pZFwiOiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3ViamVjdCxcbiAgICAgICAgICAgIFwicmVjb3JkLWlkXCI6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5yZWNvcmQsXG4gICAgICAgICAgICBcInRsZmItZXZlbnRcIjogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnRpbWVwb2ludCxcbiAgICAgICAgICAgIFwidGxmYi1zdGFydFwiOiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhcnQsXG4gICAgICAgICAgICBcInRsZmItZW5kXCI6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5lbmQsXG4gICAgICAgICAgICBcInRsZmIta2V5ZmllbGRcIjogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmtleWZpZWxkLFxuICAgICAgICAgICAgXCJ0bGZiLXN0YWZmXCI6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5zdGFmZlxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuX21vZGFsX3Byb3BlcnRpZXMub3BlbigoZGF0YTogRm9ybURhdGEpPT57XG4gICAgICAgICAgICBjb25zdCBuZXdfdGxmYl9wcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgIFwic3ViamVjdFwiOiBkYXRhLmdldCgnY2FtLWlkZW50aWZpZXInKSEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcInJlY29yZFwiOiBkYXRhLmdldCgncmVjb3JkLWlkZW50aWZpZXInKSEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcInBpZFwiOiBkYXRhLmdldCgncHJvamVjdC1uYW1lJykhLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgXCJ0aW1lcG9pbnRcIjogZGF0YS5nZXQoJ3RsZmItZXZlbnQnKSEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcInN0YXJ0XCI6IGRhdGEuZ2V0KFwidGxmYi1zdGFydFwiKSEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcImVuZFwiOiBkYXRhLmdldChcInRsZmItZW5kXCIpIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIFwia2V5ZmllbGRcIjogZGF0YS5nZXQoXCJ0bGZiLWtleWZpZWxkXCIpIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIFwic3RhZmZcIjogZGF0YS5nZXQoXCJ0bGZiLXN0YWZmXCIpIS50b1N0cmluZygpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlX3Byb3BlcnRpZXModGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLCBuZXdfdGxmYl9wcm9wZXJ0aWVzKVxuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXIuc2V0T3B0aW9uKCd2YWxpZFJhbmdlJywge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuZW5kXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBtaXNzaW5nX3Byb3BlcnRpZXNfd2FybihtaXNzaW5nX3RsZmJfcHJvcGVydGllczogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IG1pc3NpbmdfYWxlcnQgPSBcIlRoZSBmb2xsb3dpbmcgUkVEQ2FwIHBhcmFtZXRlcnMgd2VyZSBub3QgcmVjaWV2ZWQuIFBsZWFzZSBtYW51YWxseSBmaWxsIHRoZW0gaW46IFwiXG4gICAgICAgIG1pc3NpbmdfdGxmYl9wcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgIG1pc3NpbmdfYWxlcnQgPSBtaXNzaW5nX2FsZXJ0ICsgcHJvcCArIFwiLCBcIlxuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvcGVydGllcy13YXJuJykhLmlubmVyVGV4dCA9IG1pc3NpbmdfYWxlcnRcbiAgICAgICAgdGhpcy5jaGFuZ2VfcHJvcGVydGllcygpO1xuICAgIH1cblxuXG4gICAgLy8gU3Vic3RhbmNlLXVzZSBsaXN0IGZ1bmN0aW9uczpcbiAgICBwcml2YXRlIGdldF9kZXNlbGVjdGVkX3N1YnN0YW5jZXMob2xkX3N1Yl9saXN0OiBTdWJzdGFuY2VVc2VMaXN0LCBuZXdfc3ViX2xpc3Q6IFN1YnN0YW5jZVVzZUxpc3QpIHtcbiAgICAgICAgY29uc3QgZGVzZWxlY3RlZF9tZXRob2RzOiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIE9iamVjdC5rZXlzKG9sZF9zdWJfbGlzdCkuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHtcbiAgICAgICAgICAgIGlmIChuZXdfc3ViX2xpc3QuaGFzT3duUHJvcGVydHkoY2F0ZWdvcnkpKSB7XG4gICAgICAgICAgICAgICAgb2xkX3N1Yl9saXN0W2NhdGVnb3J5XS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdfc3ViX2xpc3RbY2F0ZWdvcnldLm1hcChlbCA9PiBlbC5sYWJlbCkuaW5jbHVkZXMobWV0aG9kLmxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZF9tZXRob2RzLnB1c2gobWV0aG9kLmxhYmVsKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2xkX3N1Yl9saXN0W2NhdGVnb3J5XS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxlY3RlZF9tZXRob2RzLnB1c2gobWV0aG9kLmxhYmVsKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBkZXNlbGVjdGVkX21ldGhvZHNcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmdlX3NlbGVjdGVkX3N1YnN0YW5jZXMobmV3X3N1Yl9saXN0OiBTdWJzdGFuY2VVc2VMaXN0KSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG5ld19zdWJfbGlzdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3Vic3RhbmNlc191c2VkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBuZXdfc3ViX2xpc3Rba2V5XS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3Vic3RhbmNlX2luZm8gPSB0aGlzLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2Vba2V5XS5maW5kKChzdWJzdGFuY2U6IFN1YnN0YW5jZUluZm8pID0+IHN1YnN0YW5jZS5sYWJlbCA9PT0gbWV0aG9kLmxhYmVsKSFcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9zdWJzdGFuY2VzX3VzZWRba2V5XS5tYXAoZWwgPT4gZWwubGFiZWwpLmluY2x1ZGVzKHN1YnN0YW5jZV9pbmZvLmxhYmVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Vic3RhbmNlc191c2VkW2tleV0ucHVzaChzdWJzdGFuY2VfaW5mbylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnN0YW5jZXNfdXNlZFtrZXldID0gbmV3X3N1Yl9saXN0W2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG4gIFxuICAgIHB1YmxpYyBzZWxlY3Rfc3Vic3RhbmNlKCkge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9zdWJzdGFuY2VzX3VzZWQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3Vic3RhbmNlc191c2VkW2tleV0uZm9yRWFjaCgoc3Vic3RhbmNlX3VzZWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzdGFuY2VfaW5kZXggPSB0aGlzLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2Vba2V5XS5maW5kSW5kZXgobWV0aG9kID0+IG1ldGhvZC5sYWJlbCA9PT0gc3Vic3RhbmNlX3VzZWQubGFiZWwpXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgJHtzdWJzdGFuY2VfaW5kZXgudG9TdHJpbmcoKSArIGtleX1gKSBhcyBIVE1MSW5wdXRFbGVtZW50XG4gICAgICAgICAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5fbW9kYWxfc3Vic3RhbmNlcy5wb3B1bGF0ZVRleHQoe1xuICAgICAgICAgICAgJy5zdWJ0aXRsZSc6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5zdGFydCArIFwiIHRvIFwiICsgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZFxuICAgICAgICB9KS5vcGVuKChkYXRhOiBGb3JtRGF0YSk9PntcbiAgICAgICAgICAgIGNvbnN0IHN1YnN0YW5jZXNfY2hlY2tlZDoge1xuICAgICAgICAgICAgICAgIFtuYW1lOiBzdHJpbmddOiBTdWJzdGFuY2VJbmZvW11cbiAgICAgICAgICAgIH0gPSB7fVxuXG4gICAgICAgICAgICAvLyBFYWNoIGNoZWNrYm94J3MgdmFsdWUgaXMgY29tcG9zZWQgb2YgdGhlIHN1YnN0YW5jZSdzIGNhdGVnb3J5IGFuZCB0aGUgaW5kZXggb2YgdGhlIFxuICAgICAgICAgICAgLy8gc3Vic3RhbmNlIChleC8gXCJldG9oIDBcIikgaW4gdGhhdCBjYXRlZ29yeSdzIGFycmF5IChzZWUgc3Vic3RhbmNlLmpzb24pXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQnJlYWsgZWFjaCBzdWJzdGFuY2UgaW50byBhcnJheSB3aXRoIGluZGV4IG51bWJlciBhbmQgY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VkID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIilcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJfaW5mbyA9IHRoaXMuX3N1YnN0YW5jZV9saXN0LnN1YnN0YW5jZVt1c2VkWzFdXVtOdW1iZXIodXNlZFswXSldXG4gICAgICAgICAgICAgICAgaWYgKHN1YnN0YW5jZXNfY2hlY2tlZC5oYXNPd25Qcm9wZXJ0eSh1c2VkWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RhbmNlc19jaGVja2VkW3VzZWRbMV1dLnB1c2goc3ViX2luZm8pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic3RhbmNlc19jaGVja2VkW3VzZWRbMV1dID0gW3N1Yl9pbmZvXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIC8vIElmIHN1YnN0YW5jZXMgd2VyZSBkZXNlbGVjdGVkLCByZW1vdmUgcmVsYXRlZCBzdWJzdGFuY2UgdXNlIGV2ZW50c1xuICAgICAgICAgICAgdGhpcy5nZXRfZGVzZWxlY3RlZF9zdWJzdGFuY2VzKHRoaXMuX3N1YnN0YW5jZXNfdXNlZCwgc3Vic3RhbmNlc19jaGVja2VkKS5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lZGl0b3IuZ2V0X2V2ZW50X2xpc3QoKS5kZWxldGVfc3Vic3RhbmNlKG1ldGhvZClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuX3N1YnN0YW5jZXNfdXNlZCA9IHN1YnN0YW5jZXNfY2hlY2tlZFxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnc3Vic3RhbmNlc1VzZWQnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9zdWJzdGFuY2VzX3VzZWQpKVxuICAgICAgICAgICAgdGhpcy5fZWRpdG9yLnVwZGF0ZV9zdWJzdGFuY2VzX3VzZWQodGhpcy5fc3Vic3RhbmNlc191c2VkKVxuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgLy8gU3VtbWFyeSBmdW5jdGlvbjpcbiAgICBwdWJsaWMgc3VtbWFyaXplKCkge1xuICAgICAgICBjb25zdCB3ZWVrczogbnVtYmVyID0gdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmRheXMgLyA3XG4gICAgICAgIGNvbnN0IHRvZGF5OiBzdHJpbmcgPSAobmV3IERhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IENhbGVuZGFyRGF0ZSh0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhcnQpXG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBDYWxlbmRhckRhdGUodGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZClcblxuICAgICAgICAvLyBPbmx5IHVzZSBldmVudHMgd2l0aGluIGdpdmVuIGRhdGUgcmFuZ2UgKGluIGNhc2UgZXZlbnRzIHdlcmUgYWRkZWQgYmVmb3JlIGRhdGUgcmFuZ2UgY2hhbmdlKVxuICAgICAgICBjb25zdCBzdWJzdGFuY2VfdXNlX2V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gdGhpcy5fZWRpdG9yLmdldF9ldmVudF9saXN0KCkuZ2V0X2V2ZW50cygpLmZpbHRlcigoZXZlbnQpID0+IFxuICAgICAgICAgICAgKGV2ZW50LmRhdGVfb2JqZWN0LmlzQWZ0ZXIoc3RhcnQpIHx8IGV2ZW50LmRhdGVfb2JqZWN0LmlzU2FtZURheShzdGFydCkpICYmXG4gICAgICAgICAgICAoZXZlbnQuZGF0ZV9vYmplY3QuaXNCZWZvcmUoZW5kKSkgJiZcbiAgICAgICAgICAgIChVc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihldmVudCkpXG4gICAgICAgIClcblxuICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgZGF5cyBlYWNoIHN1YnN0YW5jZSB3YXMgdXNlZC5cbiAgICAgICAgY29uc3QgZXRvaF91c2VfZGF5czogTnVtYmVyID0gY2FsY3VsYXRlLmNhbGNfZGF5c191c2VkKHN1YnN0YW5jZV91c2VfZXZlbnRzLCAnZXRvaCcpXG4gICAgICAgIGNvbnN0IG1qX3VzZV9kYXlzOiBOdW1iZXIgPSBjYWxjdWxhdGUuY2FsY19kYXlzX3VzZWQoc3Vic3RhbmNlX3VzZV9ldmVudHMsICdjbicpXG4gICAgICAgIGNvbnN0IG5pY191c2VfZGF5czogTnVtYmVyID0gY2FsY3VsYXRlLmNhbGNfZGF5c191c2VkKHN1YnN0YW5jZV91c2VfZXZlbnRzLCAnbmljJylcblxuICAgICAgICAvLyBUb3RhbCBudW1iZXIgb2YgZGF5cyBlYWNoIHN1YnN0YW5jZSB3YXMgdXNlZCwgd2l0aCBhbW91bnQgdXNlZCBrbm93bi5cbiAgICAgICAgY29uc3QgZXRvaF91c2VfZGF5c19hbW91bnQ6IE51bWJlciA9IGNhbGN1bGF0ZS5jYWxjX2RheXNfdXNlZF9hbW91bnQoc3Vic3RhbmNlX3VzZV9ldmVudHMsICdldG9oJylcblxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxmYl9ldG9oX3RvdGFsX2RheXMnKSEuaW5uZXJUZXh0ID0gU3RyaW5nKGV0b2hfdXNlX2RheXMpO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxmYl9tal90b3RhbF9kYXlzJykhLmlubmVyVGV4dCA9IFN0cmluZyhtal91c2VfZGF5cyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX25pY190b3RhbF9kYXlzJykhLmlubmVyVGV4dCA9IFN0cmluZyhuaWNfdXNlX2RheXMpO1xuXG4gICAgICAgIC8vIEZvciBhbGNvaG9sIG9ubHksIHJlcG9ydCB0aGUgdG90YWwgbnVtYmVyIG9mIGRyaW5rcy5cbiAgICAgICAgY29uc3QgZXRvaF90b3RhbF91bml0czogTnVtYmVyID0gY2FsY3VsYXRlLmNhbGNfdG90YWxfdW5pdHMoc3Vic3RhbmNlX3VzZV9ldmVudHMsICdBbGNvaG9sJywgJ3N0YW5kYXJkIGRyaW5rcycpXG5cbiAgICAgICAgaWYgKGV0b2hfdXNlX2RheXMgIT0gZXRvaF91c2VfZGF5c19hbW91bnQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX2V0b2hfdG90YWxfdW5pdHMnKSEuaW5uZXJIVE1MID0gU3RyaW5nKGV0b2hfdG90YWxfdW5pdHMpICsgXCIrXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxmYl9ldG9oX3RvdGFsX3VuaXRzJykhLmlubmVySFRNTCA9IFN0cmluZyhldG9oX3RvdGFsX3VuaXRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvciBhbGwgb3RoZXIgc3Vic3RhbmNlcywgcmVwb3J0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb2NjYXNpb25zLlxuICAgICAgICBjb25zdCBtal90b3RhbF91bml0czogTnVtYmVyID0gY2FsY3VsYXRlLmNhbGNfdG90YWxfb2NjYXNpb25zKHN1YnN0YW5jZV91c2VfZXZlbnRzLCAnY24nKVxuICAgICAgICBjb25zdCBuaWNfdG90YWxfdW5pdHM6IE51bWJlciA9IGNhbGN1bGF0ZS5jYWxjX3RvdGFsX29jY2FzaW9ucyhzdWJzdGFuY2VfdXNlX2V2ZW50cywgJ25pYycpXG5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbWpfdG90YWxfdW5pdHMnKSEuaW5uZXJIVE1MID0gU3RyaW5nKG1qX3RvdGFsX3VuaXRzKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbmljX3RvdGFsX3VuaXRzJykhLmlubmVySFRNTCA9IFN0cmluZyhuaWNfdG90YWxfdW5pdHMpO1xuICAgICAgICBcbiAgICAgICAgLy8gQXZlcmFnZSBvY2Nhc2lvbnMgcGVyIHVzZSBkYXkuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX2V0b2hfYXZnX3VuaXRzZGF5JykhLmlubmVySFRNTCA9IFN0cmluZygoK2V0b2hfdG90YWxfdW5pdHMvK2V0b2hfdXNlX2RheXNfYW1vdW50KS50b0ZpeGVkKDMpKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbWpfYXZnX3VuaXRzZGF5JykhLmlubmVySFRNTCA9IFN0cmluZygoK21qX3RvdGFsX3VuaXRzLyttal91c2VfZGF5cykudG9GaXhlZCgzKSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX25pY19hdmdfdW5pdHNkYXknKSEuaW5uZXJIVE1MID0gU3RyaW5nKCgrbmljX3RvdGFsX3VuaXRzLytuaWNfdXNlX2RheXMpLnRvRml4ZWQoMykpO1xuXG4gICAgICAgIC8vIEF2ZXJhZ2Ugb2NjYXNpb25zIHBlciB3ZWVrLlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxmYl9ldG9oX2F2Z191bml0cycpIS5pbm5lckhUTUwgPSBTdHJpbmcoKCtldG9oX3RvdGFsX3VuaXRzL3dlZWtzKS50b0ZpeGVkKDMpKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbWpfYXZnX3VuaXRzJykhLmlubmVySFRNTCA9IFN0cmluZygoK21qX3RvdGFsX3VuaXRzL3dlZWtzKS50b0ZpeGVkKDMpKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbmljX2F2Z191bml0cycpIS5pbm5lckhUTUwgPSBTdHJpbmcoKCtuaWNfdG90YWxfdW5pdHMvd2Vla3MpLnRvRml4ZWQoMykpO1xuXG4gICAgICAgIC8vIEF2ZXJhZ2UgZGF5cyBwZXIgd2Vlay5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfZXRvaF9hdmdfZGF5cycpIS5pbm5lckhUTUwgPSBTdHJpbmcoKCgrZXRvaF91c2VfZGF5cy90aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuZGF5cykqNykudG9GaXhlZCgzKSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX21qX2F2Z19kYXlzJykhLmlubmVySFRNTCA9IFN0cmluZygoKCttal91c2VfZGF5cy90aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuZGF5cykqNykudG9GaXhlZCgzKSk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0bGZiX25pY19hdmdfZGF5cycpIS5pbm5lckhUTUwgPSBTdHJpbmcoKCgrbmljX3VzZV9kYXlzL3RoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5kYXlzKSo3KS50b0ZpeGVkKDMpKTtcblxuICAgICAgICAvLyBEYXlzIHNpbmNlIGxhc3QgdXNlLlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxmYl9ldG9oX2xhc3RfdXNlJykhLmlubmVySFRNTCA9IFN0cmluZyhjYWxjdWxhdGUuY2FsY19kYXlzX3NpbmNlX2xhc3RfdXNlKHN1YnN0YW5jZV91c2VfZXZlbnRzLCBcImV0b2hcIiwgdG9kYXkpKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbWpfbGFzdF91c2UnKSEuaW5uZXJIVE1MID0gU3RyaW5nKGNhbGN1bGF0ZS5jYWxjX2RheXNfc2luY2VfbGFzdF91c2Uoc3Vic3RhbmNlX3VzZV9ldmVudHMsIFwiY25cIiwgdG9kYXkpKTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZmJfbmljX2xhc3RfdXNlJykhLmlubmVySFRNTCA9IFN0cmluZyhjYWxjdWxhdGUuY2FsY19kYXlzX3NpbmNlX2xhc3RfdXNlKHN1YnN0YW5jZV91c2VfZXZlbnRzLCBcIm5pY1wiLCB0b2RheSkpO1xuXG4gICAgICAgIHRoaXMuX21vZGFsX3N1bW1hcnkub3BlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbF9jb25maXJtX2ltcG9ydC5vcGVuKChkYXRhOiBGb3JtRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmdldCgnc2VsZWN0LWV4cG9ydC1tZXRob2QnKSA9PT0gJ2pzb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0X2pzb24oKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5nZXQoJ3NlbGVjdC1leHBvcnQtbWV0aG9kJykgPT09ICdjc3YnKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBvcnRfY3N2KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgLy8gRXhwb3J0aW5nIGFuZCBpbXBvcnRpbmcgZGF0YSBmdW5jdGlvbnM6XG5cbiAgICAvLyBEZXNlcmlhbGl6aW5nIGltcG9ydGVkIGV2ZW50czpcbiAgICBwdWJsaWMgZGVzZXJpYWxpemVfZXZlbnRzX2pzb24oZXZlbnRzOiBTZXJpYWxpemVkRXZlbnRbXSkge1xuICAgICAgICAvLyBHcm91cCBldmVudHMgd2l0aCB0aGUgc2FtZSBnaWQgdG9nZXRoZXIgdG8gZW5zdXJlIGdyb3VwcyBhcmUgcHJlc2VydmVkXG4gICAgICAgIGNvbnN0IGdyb3VwZWRfZXZlbnRzID0gZXZlbnRzLnJlZHVjZSgoYWNjOiB7XG4gICAgICAgICAgICBbbmFtZSA6IHN0cmluZ106IFNlcmlhbGl6ZWRFdmVudFtdXG4gICAgICAgIH0sIGN1cikgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2NbU3RyaW5nKGN1ci5fZ2lkKV0pIHtcbiAgICAgICAgICAgICAgICBhY2NbU3RyaW5nKGN1ci5fZ2lkKV0gPSBbY3VyXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY2NbU3RyaW5nKGN1ci5fZ2lkKV0ucHVzaChjdXIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgIH0sIHt9KVxuXG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwZWRfZXZlbnRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRfZXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgICAgICAgICAgZ3JvdXBlZF9ldmVudHNba2V5XS5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50X2RhdGUgPSAoZXZlbnQuX2RhdGUgYXMgc3RyaW5nKS5zcGxpdCgnVCcpWzBdXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Ll90eXBlID09PSBcIm5vLXVzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfZXZlbnRzLnB1c2gobmV3IE5vVXNlRXZlbnQoZXZlbnRfZGF0ZSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5fdHlwZSA9PT0gXCJrZXlcIikge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkX2V2ZW50cy5wdXNoKG5ldyBLZXlFdmVudChldmVudF9kYXRlLCAoZXZlbnQuX3RpdGxlIGFzIHN0cmluZykpKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuX3R5cGUgPT09IFwidXNlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRfcHJvcGVydGllczogVXNlRXZlbnRQcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBldmVudC5fY2F0ZWdvcnkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzdWJzdGFuY2VcIjogZXZlbnQuX3N1YnN0YW5jZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFR5cGVcIjogZXZlbnQuX21ldGhvZFR5cGUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJtZXRob2RcIjogZXZlbnQuX21ldGhvZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZE90aGVyXCI6IGV2ZW50Ll9tZXRob2RPdGhlciBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRpbWVzXCI6IE51bWJlcihldmVudC5fdGltZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhbW91bnRcIjogKGV2ZW50Ll9hbW91bnQgPT09IFwidW5rbm93blwiKSA/IGV2ZW50Ll9hbW91bnQgOiBOdW1iZXIoZXZlbnQuX2Ftb3VudCksXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVuaXRzXCI6IGV2ZW50Ll91bml0cyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVuaXRzT3RoZXJcIjogZXZlbnQuX3VuaXRzT3RoZXIgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub3RlXCI6IGV2ZW50Ll9ub3RlIGFzIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfZXZlbnRzLnB1c2gobmV3IFVzZUV2ZW50KGV2ZW50X2RhdGUsIGV2ZW50X3Byb3BlcnRpZXMpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fZWRpdG9yLmdldF9ldmVudF9saXN0KCkuaW1wb3J0X2V2ZW50cyhzZXJpYWxpemVkX2V2ZW50cywgdHJ1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzZXJpYWxpemVfZXZlbnRzX2NzdihldmVudHM6IChzdHJpbmcgfCBudW1iZXIpW11bXSkge1xuICAgICAgICAvLyBHcm91cCBldmVudHMgd2l0aCB0aGUgc2FtZSBnaWQgdG9nZXRoZXIgdG8gZW5zdXJlIGdyb3VwcyBhcmUgcHJlc2VydmVkXG4gICAgICAgIGNvbnN0IGdyb3VwZWRfZXZlbnRzID0gZXZlbnRzLnJlZHVjZSgoYWNjOiB7XG4gICAgICAgICAgICBbbmFtZSA6IHN0cmluZ106IChzdHJpbmcgfCBudW1iZXIpW11bXVxuICAgICAgICB9LCBjdXIpID0+IHtcbiAgICAgICAgICAgIGlmICghYWNjW1N0cmluZyhjdXJbNF0pXSkge1xuICAgICAgICAgICAgICAgIGFjY1tTdHJpbmcoY3VyWzRdKV0gPSBbY3VyXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhY2NbU3RyaW5nKGN1cls0XSldLnB1c2goY3VyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LCB7fSlcblxuICAgICAgICBPYmplY3Qua2V5cyhncm91cGVkX2V2ZW50cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkX2V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICAgICAgICAgIGdyb3VwZWRfZXZlbnRzW2tleV0uZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudF9kYXRlID0gKGV2ZW50WzFdIGFzIHN0cmluZykuc3BsaXQoJ1QnKVswXVxuICAgICAgICAgICAgICAgIGlmIChldmVudFsyXSA9PT0gXCJuby11c2VcIikge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkX2V2ZW50cy5wdXNoKG5ldyBOb1VzZUV2ZW50KGV2ZW50X2RhdGUpKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRbMl0gPT09IFwia2V5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9ldmVudHMucHVzaChuZXcgS2V5RXZlbnQoZXZlbnRfZGF0ZSwgKGV2ZW50WzVdYXMgc3RyaW5nKSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFsyXSA9PT0gXCJ1c2VcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudF9wcm9wZXJ0aWVzOiBVc2VFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IGV2ZW50WzZdIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic3Vic3RhbmNlXCI6IGV2ZW50WzddIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibWV0aG9kVHlwZVwiOiBldmVudFs4XSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZFwiOiBldmVudFs5XSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGhvZE90aGVyXCI6IGV2ZW50WzEwXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRpbWVzXCI6IE51bWJlcihldmVudFsxMV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhbW91bnRcIjogKGV2ZW50WzEyXSA9PT0gXCJ1bmtub3duXCIpID8gZXZlbnRbMTJdIDogTnVtYmVyKGV2ZW50WzEyXSksXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVuaXRzXCI6IGV2ZW50WzEzXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVuaXRzT3RoZXJcIjogZXZlbnRbMTRdIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibm90ZVwiOiBldmVudFsxNV0gYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9ldmVudHMucHVzaChuZXcgVXNlRXZlbnQoZXZlbnRfZGF0ZSwgZXZlbnRfcHJvcGVydGllcykpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9lZGl0b3IuZ2V0X2V2ZW50X2xpc3QoKS5pbXBvcnRfZXZlbnRzKHNlcmlhbGl6ZWRfZXZlbnRzLCB0cnVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIENoZWNraW5nIHZhbGlkaXR5IG9mIGltcG9ydGVkIGRhdGE6XG4gICAgcHVibGljIHZhbGlkX0pTT04oanNvbjogYW55KToganNvbiBpcyBKU09ORGF0YSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZF9kYXRhX3Byb3BlcnRpZXMgPSBbXCJzdWJqZWN0XCIsIFwiZXZlbnRcIiwgXCJwaWRcIiwgXCJzdGFydFwiLCBcImVuZFwiLCBcInN0YWZmXCIsIFwicmVjb3JkXCIsIFwia2V5ZmllbGRcIiwgXCJkYXRldGltZVwiXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YWxpZF9kYXRhX3Byb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkocHJvcGVydHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uW3Byb3BlcnR5XSAhPSBudWxsICYmIHR5cGVvZiBqc29uW3Byb3BlcnR5XSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGpzb24uZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpzb25bXCJldmVudHNcIl0uZm9yRWFjaCgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHYyX3ZhbHVlX3VzZV9ldmVudF9wcm9wZXJ0aWVzID0gW1wiY2F0ZWdvcnlcIiwgXCJzdWJzdGFuY2VcIiwgXCJvY2Nhc2lvbnNcIiwgXCJhbW91bnRcIiwgXCJ1bml0c1wiLCBcIm5vdGVzXCJdXG4gICAgICAgICAgICBjb25zdCB2YWxpZF91c2VfZXZlbnRfcHJvcGVydGllcyA9IFtcIl9jYXRlZ29yeVwiLCBcIl9zdWJzdGFuY2VcIiwgXCJfbWV0aG9kVHlwZVwiLCBcIl9tZXRob2RcIiwgXCJfbWV0aG9kT3RoZXJcIiwgXCJfdGltZXNcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIl9hbW91bnRcIiwgXCJfdW5pdHNcIiwgXCJfdW5pdHNPdGhlclwiLCBcIl9ub3RlXCJdXG5cbiAgICAgICAgICAgIC8vIFJ1biBpZiBpbXBvcnRlZCBkYXRhIGlzIGZyb20gdmVyc2lvbiAyXG4gICAgICAgICAgICBpZiAoanNvbi5ldmVudHNbMF0uaGFzT3duUHJvcGVydHkoJ3RpdGxlJykpIHtcbiAgICAgICAgICAgICAgICBqc29uLmV2ZW50cy5mb3JFYWNoKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQudGl0bGUgIT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPSBcInN0cmluZ1wiIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LnN0YXJ0ICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuaGFzT3duUHJvcGVydHkoJ2VuZCcpICYmIHR5cGVvZiBldmVudC5lbmQgIT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09PSAnc3Vic3RhbmNlLWV2ZW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdjJfdmFsdWVfdXNlX2V2ZW50X3Byb3BlcnRpZXMuZm9yRWFjaCgoZXZlbnRfcHJvcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnRbZXZlbnRfcHJvcF0gIT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUnVuIGlmIGltcG9ydGVkIGRhdGEgaXMgbm90IGZyb20gdmVyc2lvbiAyXG4gICAgICAgICAgICBqc29uLmV2ZW50cy5mb3JFYWNoKChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudC5fZWlkICE9IFwibnVtYmVyXCIgfHwgdHlwZW9mIGV2ZW50Ll9naWQgIT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50Ll90aXRsZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBldmVudC5fdHlwZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiBldmVudC5fZGF0ZSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Ll90eXBlID09PSBcInVzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkX3VzZV9ldmVudF9wcm9wZXJ0aWVzLmZvckVhY2goKGV2ZW50X3Byb3ApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudF9wcm9wID09PSBcIl90aW1lc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudFtldmVudF9wcm9wXSAhPSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGV2ZW50X3Byb3AgPT09IFwiX2Ftb3VudFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudFtldmVudF9wcm9wXSAhPSBcIm51bWJlclwiICYmICBldmVudFtldmVudF9wcm9wXSAhPSBcInVua25vd25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihldmVudF9wcm9wID09PSBcIl91bml0c090aGVyXCIgfHwgZXZlbnRfcHJvcCA9PT0gXCJfbWV0aG9kT3RoZXJcIiB8fCBldmVudF9wcm9wID09PSBcIl9tZXRob2RUeXBlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnRfcHJvcCA9PT0gXCJfdW5pdHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudFtldmVudF9wcm9wXSAhPSBudWxsICYmIHR5cGVvZiBldmVudFtldmVudF9wcm9wXSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50W2V2ZW50X3Byb3BdICE9IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRfQ1NWKGNzdjogKHN0cmluZyB8IG51bWJlcilbXVtdKSB7XG4gICAgICAgIGNvbnN0IHRpdGxlX3JvdyA9IFtcIlN1YmplY3RcIiwgXCJFdmVudFwiLCBcInBJRFwiLCBcIlN0YXJ0XCIsIFwiRW5kXCIsIFwiU3RhZmZcIiwgXCJSZWNvcmRcIiwgXCJLZXlmaWVsZFwiLCBcIkRhdGV0aW1lXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcHBWZXJzaW9uXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCJdXG4gICAgICAgIGNvbnN0IGV2ZW50X3RpdGxlX3JvdyA9IFtcIkV2ZW50XCIsIFwiRGF0ZVwiLCBcIlR5cGVcIiwgXCJlSURcIiwgJ2dJRCcsICdUaXRsZScsIFwiQ2F0ZWdvcnlcIiwgXCJTdWJzdGFuY2VcIiwgXCJNZXRob2RUeXBlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJNZXRob2RcIiwgXCJNZXRob2RPdGhlclwiLCBcIlRpbWVzXCIsIFwiQW1vdW50XCIsIFwiVW5pdHNcIiwgXCJVbml0c090aGVyXCIsIFwiTm90ZVwiXVxuICAgICAgICBjb25zdCBmaWxsZXJfcm93ID0gW1wiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCJdXG5cbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGNzdlswXSkgIT0gSlNPTi5zdHJpbmdpZnkodGl0bGVfcm93KSAgfHxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNzdlsyXSkgIT0gSlNPTi5zdHJpbmdpZnkoZmlsbGVyX3JvdykgfHxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNzdlszXSkgIT0gSlNPTi5zdHJpbmdpZnkoZXZlbnRfdGl0bGVfcm93KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvLyBJbXBvcnRpbmcgZGF0YTpcbiAgICBwdWJsaWMgaW1wb3J0X2pzb24oKSB7XG4gICAgICAgIGxldCBpbXBvcnRlZF9wcm9wZXJ0aWVzOiB7W25hbWU6IHN0cmluZ106IHN0cmluZ30gPSB7fVxuICAgICAgICBsZXQgZXZlbnRzOiBTZXJpYWxpemVkRXZlbnRbXSA9IFtdXG4gICAgICAgIGNvbnN0IGltcG9ydGVkX3N1YnN0YW5jZXM6IHtbbmFtZTogc3RyaW5nXTogU3Vic3RhbmNlSW5mb1tdfSA9IHt9XG5cbiAgICAgICAgY29uc3QgdGhpc19maWxlID0gdGhpc1xuXG4gICAgICAgIC8vIEdldCBIVE1MIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW1wb3J0ZWQgaW5mb3JtYXRpb25cbiAgICAgICAgY29uc3QgdXBsb2FkX3N1YmplY3RfanNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtb3V0LXN1YmplY3QnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2V2ZW50X2pzb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLW91dC1ldmVudCcpIVxuICAgICAgICBjb25zdCB1cGxvYWRfc3RhcnRfanNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtb3V0LXN0YXJ0JykhXG4gICAgICAgIGNvbnN0IHVwbG9hZF9lbmRfanNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtb3V0LWVuZCcpIVxuICAgICAgICBjb25zdCB1cGxvYWRfZXZlbnRzX2pzb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLW91dC1ldmVudHMnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2VhcmxpZXN0X2pzb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLW91dC1lYXJsaWVzdCcpIVxuICAgICAgICBjb25zdCB1cGxvYWRfbGF0ZXN0X2pzb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLW91dC1sYXRlc3QnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX3N1YnN0YW5jZXNfanNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtb3V0LXN1YnN0YW5jZXMnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2ZpbGVfbmFtZV9qc29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGVuYW1lLXVwbG9hZC1qc29uJykhXG4gICAgICAgIGNvbnN0IHdhcm5fZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc29uLXdhcm4nKSFcblxuICAgICAgICBjb25zdCBpbXBvcnRfZWxlbWVudHMgPSBbdXBsb2FkX3N1YmplY3RfanNvbiwgdXBsb2FkX2V2ZW50X2pzb24sIHVwbG9hZF9zdGFydF9qc29uLCB1cGxvYWRfZW5kX2pzb24sIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2V2ZW50c19qc29uLCB1cGxvYWRfZWFybGllc3RfanNvbiwgdXBsb2FkX2xhdGVzdF9qc29uLCB1cGxvYWRfc3Vic3RhbmNlc19qc29uLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZF9maWxlX25hbWVfanNvbiwgd2Fybl9lbGVtZW50XVxuXG4gICAgICAgIHRoaXMucmVzZXRfbW9kYWxfdGV4dChpbXBvcnRfZWxlbWVudHMpXG4gICAgICAgIHVwbG9hZF9maWxlX25hbWVfanNvbi5pbm5lclRleHQgPSBcIiouanNvblwiXG5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ1cGxvYWQtZGF0YS1qc29uXCIpIS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChldnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRfbW9kYWxfdGV4dChpbXBvcnRfZWxlbWVudHMpXG4gICAgICAgICAgICB1cGxvYWRfZmlsZV9uYW1lX2pzb24uaW5uZXJUZXh0ID0gKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXMhWzBdLm5hbWVcbiAgIFxuICAgICAgICAgICAgY29uc3Qgb2JfcmQgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgICAgICBvYl9yZC5vbmxvYWQgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2JfZGF0YTogSlNPTkRhdGEgPSBKU09OLnBhcnNlKGV2dC50YXJnZXQhLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghdGhpc19maWxlLnZhbGlkX0pTT04ob2JfZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc19maWxlLl9tb2RhbF9pbXBvcnRfanNvbi5yZXNldCgpXG4gICAgICAgICAgICAgICAgICAgIHdhcm5fZWxlbWVudC5pbm5lclRleHQgPSBcIlRoZSBzZWxlY3RlZCBqc29uIGZpbGUgZG9lcyBub3QgY29udGFpbiBkYXRhIGluIGFuIGFjY2VwdGVkIGZvcm1hdC5cIlxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpbXBvcnRlZF9wcm9wZXJ0aWVzID0ge1xuICAgICAgICAgICAgICAgICAgICBcInN1YmplY3RcIjogb2JfZGF0YS5zdWJqZWN0LFxuICAgICAgICAgICAgICAgICAgICBcInJlY29yZFwiOiBvYl9kYXRhLnJlY29yZCxcbiAgICAgICAgICAgICAgICAgICAgXCJwaWRcIjogb2JfZGF0YS5waWQsXG4gICAgICAgICAgICAgICAgICAgIFwidGltZXBvaW50XCI6IG9iX2RhdGEuZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIFwic3RhcnRcIjogb2JfZGF0YS5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgXCJlbmRcIjogb2JfZGF0YS5lbmQsXG4gICAgICAgICAgICAgICAgICAgIFwia2V5ZmllbGRcIjogb2JfZGF0YS5rZXlmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgXCJzdGFmZlwiOiBvYl9kYXRhLnN0YWZmXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZXZlbnRzID0gb2JfZGF0YS5ldmVudHNcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzX1YyID0gKGV2ZW50cy5sZW5ndGggPT09IDApID8gZmFsc2UgOiBvYl9kYXRhLmV2ZW50c1swXS5oYXNPd25Qcm9wZXJ0eSgndGl0bGUnKVxuXG4gICAgICAgICAgICAgICAgLy8gTWFwIHZlcnNpb24gMiBldmVudHMgaW50byBjdXJyZW50bHkgYWNjZXB0ZWQgZm9ybWF0XG4gICAgICAgICAgICAgICAgaWYgKGlzX1YyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRfZXZlbnRzOiBTZXJpYWxpemVkRXZlbnRbXSAgPSBbXVxuICAgICAgICAgICAgICAgICAgICBsZXQgZWlkID0gMFxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2lkID0gMFxuICAgICAgICAgICAgICAgICAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzID0gW2V2ZW50LnN0YXJ0XVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVudHMgd2l0aCBlbmQgZGF0ZSBzaWduaWZpZXMgcmVwZXRpdGlvbiBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5oYXNPd25Qcm9wZXJ0eSgnZW5kJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyciA9IG5ldyBEYXRlKGV2ZW50LnN0YXJ0IGFzIHN0cmluZylcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdICE9IGV2ZW50LmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyLnNldERhdGUoY3Vyci5nZXREYXRlKCkgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlcy5wdXNoKGN1cnIudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlcy5mb3JFYWNoKChkYXRlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRfb2JqZWN0OiB7W25hbWU6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IG9iamVjdCB8IG51bGx9ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGl0bGU6IGV2ZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGF0ZTogZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VpZDogZWlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2lkOiBnaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZCsrXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJrZXktZXZlbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX3R5cGUgPSBcImtleVwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZF9ldmVudHMucHVzaChldmVudF9vYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcInN1YnN0YW5jZS1ldmVudFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50X2NhdGVnb3J5ID0gKGV2ZW50LmNhdGVnb3J5ID09PSBcIm1qXCIpID8gXCJjblwiIDogZXZlbnQuY2F0ZWdvcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gdGhpc19maWxlLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2VbZXZlbnRfY2F0ZWdvcnkgYXMgc3RyaW5nXS5maW5kKChzdWIpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Yi5sYWJlbCkudG9Mb3dlckNhc2UoKSA9PT0gKGV2ZW50LnN1YnN0YW5jZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdC5fdHlwZSA9IFwidXNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfb2JqZWN0Ll9jYXRlZ29yeSA9IGV2ZW50X2NhdGVnb3J5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdC5fc3Vic3RhbmNlID0gdGhpc19maWxlLl9zdWJzdGFuY2VfbGlzdC5jYXRlZ29yeS5maW5kKHN1YiA9PiBzdWIuaWQgPT09IGV2ZW50X2NhdGVnb3J5KSEubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfb2JqZWN0Ll90aW1lcyA9IGV2ZW50Lm9jY2FzaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX2Ftb3VudCA9IE51bWJlcihldmVudC5vY2Nhc2lvbnMpICogTnVtYmVyKGV2ZW50LmFtb3VudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfb2JqZWN0Ll91bml0cyA9IGV2ZW50LnVuaXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdC5fdW5pdHNPdGhlciA9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfb2JqZWN0Ll9ub3RlID0gZXZlbnQubm90ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYWxsIFYyIHN1YnN0YW5jZXMvbWV0aG9kcyBleGlzdCBpbiBjdXJyZW50IHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdC5fbWV0aG9kID0gbWV0aG9kLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX21ldGhvZFR5cGUgPSAobWV0aG9kLmhhc093blByb3BlcnR5KCd0eXBlJykpID8gXCJ1bmtub3duXCIgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX21ldGhvZE90aGVyID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0aG9kX290aGVyID0gdGhpc19maWxlLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2VbZXZlbnRfY2F0ZWdvcnkgYXMgc3RyaW5nXS5zbGljZSgtMSlbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X29iamVjdC5fbWV0aG9kID0gbWV0aG9kX290aGVyLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX21ldGhvZE90aGVyID0gKGV2ZW50LnN1YnN0YW5jZSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX21ldGhvZFR5cGUgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9vYmplY3QuX3VuaXRzT3RoZXIgPSAoZXZlbnQudW5pdHMgYXMgc3RyaW5nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRfZXZlbnRzLnB1c2goZXZlbnRfb2JqZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGdpZCsrXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBldmVudHMgPSB1cGRhdGVkX2V2ZW50c1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFBvcHVsYXRlIEhUTUwgZWxlbWVudHMgd2l0aCBpbXBvcnRlZCBkYXRhIChyZWQgdGV4dCBzaWduaWZpZXMgY2hhbmdlIGZyb20gb3JpZ2luYWwgZGF0YSlcbiAgICAgICAgICAgICAgICB1cGxvYWRfc3ViamVjdF9qc29uLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy10ZXh0LWRhbmdlcicpXG4gICAgICAgICAgICAgICAgdXBsb2FkX3N1YmplY3RfanNvbi5pbm5lclRleHQgPSBvYl9kYXRhLnN1YmplY3RcbiAgICAgICAgICAgICAgICBpZiAob2JfZGF0YS5zdWJqZWN0ICE9IHRoaXNfZmlsZS5fY3VycmVudF9wcm9wZXJ0aWVzLnN1YmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX3N1YmplY3RfanNvbi5jbGFzc0xpc3QuYWRkKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwbG9hZF9ldmVudF9qc29uLmNsYXNzTGlzdC5yZW1vdmUoJ2hhcy10ZXh0LWRhbmdlcicpXG4gICAgICAgICAgICAgICAgdXBsb2FkX2V2ZW50X2pzb24uaW5uZXJUZXh0ID0gb2JfZGF0YS5ldmVudCFcbiAgICAgICAgICAgICAgICBpZiAob2JfZGF0YS5ldmVudCAhPSB0aGlzX2ZpbGUuX2N1cnJlbnRfcHJvcGVydGllcy50aW1lcG9pbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2V2ZW50X2pzb24uY2xhc3NMaXN0LmFkZCgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdXBsb2FkX3N0YXJ0X2pzb24uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB1cGxvYWRfc3RhcnRfanNvbi5pbm5lclRleHQgPSBvYl9kYXRhLnN0YXJ0XG4gICAgICAgICAgICAgICAgaWYgKG9iX2RhdGEuc3RhcnQgIT0gdGhpc19maWxlLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX3N0YXJ0X2pzb24uY2xhc3NMaXN0LmFkZCgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB1cGxvYWRfZW5kX2pzb24uY2xhc3NMaXN0LnJlbW92ZSgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB1cGxvYWRfZW5kX2pzb24uaW5uZXJUZXh0ID0gb2JfZGF0YS5lbmRcbiAgICAgICAgICAgICAgICBpZiAob2JfZGF0YS5lbmQgIT0gdGhpc19maWxlLl9jdXJyZW50X3Byb3BlcnRpZXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZF9lbmRfanNvbi5jbGFzc0xpc3QuYWRkKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwbG9hZF9ldmVudHNfanNvbi5pbm5lclRleHQgPSBTdHJpbmcob2JfZGF0YS5ldmVudHMubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKG9iX2RhdGEuZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWFybGllc3RfZGF5ID0gb2JfZGF0YS5ldmVudHMucmVkdWNlKGZ1bmN0aW9uKGFjYzogRGF0ZSwgY3VyOiB7W25hbWU6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IG9iamVjdH0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IERhdGUoY3VyLl9kYXRlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA8IGFjYykgPyBkIDogYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LCBuZXcgRGF0ZShldmVudHNbMF0uX2RhdGUgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZF9lYXJsaWVzdF9qc29uLmlubmVyVGV4dCA9IGVhcmxpZXN0X2RheS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXVxuICAgIFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3RfZGF5ID0gb2JfZGF0YS5ldmVudHMucmVkdWNlKGZ1bmN0aW9uKGFjYzogRGF0ZSwgY3VyOiB7W25hbWU6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IG9iamVjdH0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IERhdGUoY3VyLl9kYXRlIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA+IGFjYykgPyBkIDogYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LCBuZXcgRGF0ZShldmVudHNbMF0uX2RhdGUgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZF9sYXRlc3RfanNvbi5pbm5lclRleHQgPSBsYXRlc3RfZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2VhcmxpZXN0X2pzb24uaW5uZXJUZXh0ID0gXCItXCJcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2xhdGVzdF9qc29uLmlubmVyVGV4dCA9IFwiLVwiXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHN1YnN0YW5jZV9zdHJpbmcgPSBcIlwiXG4gICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5fdHlwZSA9PT0gJ3VzZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50Ll9jYXRlZ29yeSA9IChldmVudC5fY2F0ZWdvcnkgPT09IFwibWpcIikgPyBcImNuXCIgOiBldmVudC5fY2F0ZWdvcnkgLy8gVjIgc3Vic3RhbmNlIGxpc3QgaGFzIFwiY25cIiBhcyBcIm1qXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YnN0YW5jZV9pbmZvID0gdGhpc19maWxlLl9zdWJzdGFuY2VfbGlzdC5zdWJzdGFuY2VbZXZlbnQuX2NhdGVnb3J5IGFzIHN0cmluZ10uZmluZCgoc3Vic3RhbmNlOiBTdWJzdGFuY2VJbmZvKSA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGFuY2UubGFiZWwgPT09IGV2ZW50Ll9tZXRob2RcbiAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydGVkX3N1YnN0YW5jZXMuaGFzT3duUHJvcGVydHkoZXZlbnQuX2NhdGVnb3J5ISBhcyBzdHJpbmcpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhaW1wb3J0ZWRfc3Vic3RhbmNlc1tldmVudC5fY2F0ZWdvcnkgYXMgc3RyaW5nXS5pbmNsdWRlcyhzdWJzdGFuY2VfaW5mbyEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX3N1YnN0YW5jZXNbZXZlbnQuX2NhdGVnb3J5IGFzIHN0cmluZ10ucHVzaChzdWJzdGFuY2VfaW5mbyEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX3N1YnN0YW5jZXNbZXZlbnQuX2NhdGVnb3J5IGFzIHN0cmluZ10gPSBbc3Vic3RhbmNlX2luZm8hXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnN0YW5jZV9zdHJpbmcuaW5jbHVkZXMoZXZlbnQuX21ldGhvZCEgYXMgc3RyaW5nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0YW5jZV9zdHJpbmcgPSBzdWJzdGFuY2Vfc3RyaW5nICsgZXZlbnQuX21ldGhvZCArIFwiLCBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB1cGxvYWRfc3Vic3RhbmNlc19qc29uLmlubmVyVGV4dCA9IHN1YnN0YW5jZV9zdHJpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9iX3JkLnJlYWRBc1RleHQoKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXMhWzBdKTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5fbW9kYWxfaW1wb3J0X2pzb24ub3BlbigoKSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVfcHJvcGVydGllcyh0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMsIGltcG9ydGVkX3Byb3BlcnRpZXMpXG5cbiAgICAgICAgICAgIGNvbnN0IG1pc3NpbmdfcGFyYW1zID0gT2JqZWN0LmtleXMoaW1wb3J0ZWRfcHJvcGVydGllcykuZmlsdGVyKChrZXkpID0+IFxuICAgICAgICAgICAgICAgIGltcG9ydGVkX3Byb3BlcnRpZXNba2V5XSA9PT0gbnVsbFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBpZiAobWlzc2luZ19wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW5nX3Byb3BlcnRpZXNfd2FybihtaXNzaW5nX3BhcmFtcylcbiAgICAgICAgICAgIH0gXG5cbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyLnNldE9wdGlvbigndmFsaWRSYW5nZScsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZFxuICAgICAgICAgICAgfSkgXG4gICAgICAgICAgICB0aGlzLm1lcmdlX3NlbGVjdGVkX3N1YnN0YW5jZXMoaW1wb3J0ZWRfc3Vic3RhbmNlcylcbiAgICAgICAgICAgIHRoaXMuX2VkaXRvci51cGRhdGVfc3Vic3RhbmNlc191c2VkKHRoaXMuX3N1YnN0YW5jZXNfdXNlZClcbiAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3N1YnN0YW5jZXNVc2VkJywgSlNPTi5zdHJpbmdpZnkodGhpcy5fc3Vic3RhbmNlc191c2VkKSlcbiAgICAgICAgICAgIHRoaXMuZGVzZXJpYWxpemVfZXZlbnRzX2pzb24oZXZlbnRzKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBpbXBvcnRfY3N2KCkge1xuICAgICAgICBsZXQgaW1wb3J0ZWRfcHJvcGVydGllczoge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9ID0ge31cbiAgICAgICAgbGV0IGV2ZW50czogKHN0cmluZyB8IG51bWJlcilbXVtdID0gW11cbiAgICAgICAgY29uc3QgaW1wb3J0ZWRfc3Vic3RhbmNlczoge1tuYW1lOiBzdHJpbmddOiBTdWJzdGFuY2VJbmZvW119ID0ge31cblxuICAgICAgICBjb25zdCB0aGlzX2ZpbGUgPSB0aGlzXG5cbiAgICAgICAgLy8gR2V0IEhUTUwgZWxlbWVudHMgdG8gZGlzcGxheSBpbXBvcnRlZCBpbmZvcm1hdGlvblxuICAgICAgICBjb25zdCB1cGxvYWRfc3ViamVjdF9jc3YgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWNzdi1zdWJqZWN0JykhXG4gICAgICAgIGNvbnN0IHVwbG9hZF9ldmVudF9jc3YgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWNzdi1ldmVudCcpIVxuICAgICAgICBjb25zdCB1cGxvYWRfc3RhcnRfY3N2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC1jc3Ytc3RhcnQnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2VuZF9jc3YgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWNzdi1lbmQnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2V2ZW50c19jc3YgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWNzdi1ldmVudHMnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2VhcmxpZXN0X2NzdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtY3N2LWVhcmxpZXN0JykhXG4gICAgICAgIGNvbnN0IHVwbG9hZF9sYXRlc3RfY3N2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwbG9hZC1jc3YtbGF0ZXN0JykhXG4gICAgICAgIGNvbnN0IHVwbG9hZF9zdWJzdGFuY2VzX2NzdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtY3N2LXN1YnN0YW5jZXMnKSFcbiAgICAgICAgY29uc3QgdXBsb2FkX2ZpbGVfbmFtZV9jc3YgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsZW5hbWUtdXBsb2FkLWNzdicpIVxuICAgICAgICBjb25zdCB3YXJuX2VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3N2LXdhcm4nKSFcblxuICAgICAgICBjb25zdCBpbXBvcnRfZWxlbWVudHMgPSBbdXBsb2FkX3N1YmplY3RfY3N2LCB1cGxvYWRfZXZlbnRfY3N2LCB1cGxvYWRfc3RhcnRfY3N2LCB1cGxvYWRfZW5kX2NzdiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRfZXZlbnRzX2NzdiwgdXBsb2FkX2VhcmxpZXN0X2NzdiwgdXBsb2FkX2xhdGVzdF9jc3YsIHVwbG9hZF9zdWJzdGFuY2VzX2NzdiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGxvYWRfZmlsZV9uYW1lX2Nzdiwgd2Fybl9lbGVtZW50XVxuXG4gICAgICAgIHRoaXMucmVzZXRfbW9kYWxfdGV4dChpbXBvcnRfZWxlbWVudHMpXG4gICAgICAgIHVwbG9hZF9maWxlX25hbWVfY3N2LmlubmVyVGV4dCA9IFwiKi5jc3ZcIlxuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidXBsb2FkLWRhdGEtY3N2XCIpIS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIChldnQpID0+IHtcbiAgICAgICAgICAgIHdhcm5fZWxlbWVudC5pbm5lclRleHQgPSBcIlwiXG4gICAgICAgICAgICB0aGlzLnJlc2V0X21vZGFsX3RleHQoaW1wb3J0X2VsZW1lbnRzKVxuICAgICAgICAgICAgdXBsb2FkX2ZpbGVfbmFtZV9jc3YuaW5uZXJUZXh0ID0gKGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuZmlsZXMhWzBdLm5hbWVcblxuICAgICAgICAgICAgY29uc3Qgb2JfcmQgPSBuZXcgRmlsZVJlYWRlcigpOyBcblxuICAgICAgICAgICAgb2JfcmQub25sb2FkID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iX2RhdGE6IHN0cmluZyA9IGV2dC50YXJnZXQhLnJlc3VsdCBhcyBzdHJpbmdcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IChzdHJpbmcgfCBudW1iZXIpW11bXSAgPSBbXVxuXG4gICAgICAgICAgICAgICAgb2JfZGF0YS5zcGxpdChcIlxcblwiKS5mb3JFYWNoKChhcnJheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goYXJyYXkuc3BsaXQoXCIsXCIpKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXNfZmlsZS52YWxpZF9DU1YoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc19maWxlLl9tb2RhbF9pbXBvcnRfY3N2LnJlc2V0KClcbiAgICAgICAgICAgICAgICAgICAgd2Fybl9lbGVtZW50LmlubmVyVGV4dCA9IFwiVGhlIHNlbGVjdGVkIGNzdiBmaWxlIGRvZXMgbm90IGNvbnRhaW4gZGF0YSBpbiBhbiBhY2NlcHRlZCBmb3JtYXQuXCJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydGllc19kYXRhID0gZGF0YVsxXVxuICAgICAgICAgICAgICAgIGV2ZW50cyA9IChkYXRhLmxlbmd0aCA+IDQpID8gZGF0YS5zbGljZSg0LCAtMSkgOiBbXVxuXG4gICAgICAgICAgICAgICAgaW1wb3J0ZWRfcHJvcGVydGllcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgXCJzdWJqZWN0XCI6IHByb3BlcnRpZXNfZGF0YVswXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIFwicmVjb3JkXCI6IHByb3BlcnRpZXNfZGF0YVs2XSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIFwicGlkXCI6IHByb3BlcnRpZXNfZGF0YVsyXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIFwidGltZXBvaW50XCI6IHByb3BlcnRpZXNfZGF0YVsxXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIFwic3RhcnRcIjogcHJvcGVydGllc19kYXRhWzNdIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgXCJlbmRcIjogcHJvcGVydGllc19kYXRhWzRdIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgXCJrZXlmaWVsZFwiOiBwcm9wZXJ0aWVzX2RhdGFbN10gYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBcInN0YWZmXCI6IHByb3BlcnRpZXNfZGF0YVs1XSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgSFRNTCBlbGVtZW50cyB3aXRoIGltcG9ydGVkIGRhdGEgKHJlZCB0ZXh0IHNpZ25pZmllcyBjaGFuZ2UgZnJvbSBvcmlnaW5hbCBkYXRhKVxuICAgICAgICAgICAgICAgIHVwbG9hZF9zdWJqZWN0X2Nzdi5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIHVwbG9hZF9zdWJqZWN0X2Nzdi5pbm5lclRleHQgPSBwcm9wZXJ0aWVzX2RhdGFbMF0gYXMgc3RyaW5nXG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNfZGF0YVswXSAhPSB0aGlzX2ZpbGUuX2N1cnJlbnRfcHJvcGVydGllcy5zdWJqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZF9zdWJqZWN0X2Nzdi5jbGFzc0xpc3QuYWRkKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwbG9hZF9ldmVudF9jc3YuY2xhc3NMaXN0LnJlbW92ZSgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB1cGxvYWRfZXZlbnRfY3N2LmlubmVyVGV4dCA9IHByb3BlcnRpZXNfZGF0YVsxXSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllc19kYXRhWzFdICE9IHRoaXNfZmlsZS5fY3VycmVudF9wcm9wZXJ0aWVzLnRpbWVwb2ludCkge1xuICAgICAgICAgICAgICAgICAgICB1cGxvYWRfZXZlbnRfY3N2LmNsYXNzTGlzdC5hZGQoJ2hhcy10ZXh0LWRhbmdlcicpXG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIHVwbG9hZF9zdGFydF9jc3YuY2xhc3NMaXN0LnJlbW92ZSgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB1cGxvYWRfc3RhcnRfY3N2LmlubmVyVGV4dCA9IHByb3BlcnRpZXNfZGF0YVszXSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllc19kYXRhWzNdICE9IHRoaXNfZmlsZS5fY3VycmVudF9wcm9wZXJ0aWVzLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZF9zdGFydF9jc3YuY2xhc3NMaXN0LmFkZCgnaGFzLXRleHQtZGFuZ2VyJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB1cGxvYWRfZW5kX2Nzdi5jbGFzc0xpc3QucmVtb3ZlKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIHVwbG9hZF9lbmRfY3N2LmlubmVyVGV4dCA9IHByb3BlcnRpZXNfZGF0YVs0XSBhcyBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllc19kYXRhWzRdICE9IHRoaXNfZmlsZS5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICB1cGxvYWRfZW5kX2Nzdi5jbGFzc0xpc3QuYWRkKCdoYXMtdGV4dC1kYW5nZXInKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwbG9hZF9ldmVudHNfY3N2LmlubmVyVGV4dCA9IFN0cmluZyhldmVudHMubGVuZ3RoKVxuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVhcmxpZXN0X2RheSA9IGV2ZW50cy5yZWR1Y2UoZnVuY3Rpb24oYWNjOiBEYXRlLCBjdXI6IChzdHJpbmcgfCBudW1iZXIpW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkID0gbmV3IERhdGUoY3VyWzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA8IGFjYykgPyBkIDogYWNjO1xuICAgICAgICAgICAgICAgICAgICB9LCBuZXcgRGF0ZShldmVudHNbMF1bMV0pKTtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2VhcmxpZXN0X2Nzdi5pbm5lclRleHQgPSBlYXJsaWVzdF9kYXkudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3RfZGF5ID0gZXZlbnRzLnJlZHVjZShmdW5jdGlvbihhY2M6IERhdGUsIGN1cjogKHN0cmluZyB8IG51bWJlcilbXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSBuZXcgRGF0ZShjdXJbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkID4gYWNjKSA/IGQgOiBhY2M7XG4gICAgICAgICAgICAgICAgICAgIH0sIG5ldyBEYXRlKGV2ZW50c1swXVsxXSkpO1xuICAgICAgICAgICAgICAgICAgICB1cGxvYWRfbGF0ZXN0X2Nzdi5pbm5lclRleHQgPSBsYXRlc3RfZGF5LnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsb2FkX2VhcmxpZXN0X2Nzdi5pbm5lclRleHQgPSBcIi1cIlxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRfbGF0ZXN0X2Nzdi5pbm5lclRleHQgPSBcIi1cIlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzdWJzdGFuY2Vfc3RyaW5nID0gXCJcIlxuICAgICAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRbMl0gPT09ICd1c2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRob2QgPSAoKGV2ZW50WzldIGFzIHN0cmluZykuaW5jbHVkZXMoXCIuXCIpKSA/IChldmVudFs5XSBhcyBzdHJpbmcpLnJlcGxhY2UoXCIuXCIsIFwiLFwiKSA6IGV2ZW50WzldXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJzdGFuY2VfaW5mbyA9IHRoaXNfZmlsZS5fc3Vic3RhbmNlX2xpc3Quc3Vic3RhbmNlW2V2ZW50WzZdXS5maW5kKChzdWJzdGFuY2U6IFN1YnN0YW5jZUluZm8pID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0YW5jZS5sYWJlbCA9PT0gbWV0aG9kXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRfc3Vic3RhbmNlcy5oYXNPd25Qcm9wZXJ0eShldmVudFs2XSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICFpbXBvcnRlZF9zdWJzdGFuY2VzW2V2ZW50WzZdXS5pbmNsdWRlcyhzdWJzdGFuY2VfaW5mbyEpKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX3N1YnN0YW5jZXNbZXZlbnRbNl1dLnB1c2goc3Vic3RhbmNlX2luZm8hKSAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVkX3N1YnN0YW5jZXNbZXZlbnRbNl1dID0gW3N1YnN0YW5jZV9pbmZvIV1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzdGFuY2Vfc3RyaW5nLmluY2x1ZGVzKGV2ZW50WzldIGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdGFuY2Vfc3RyaW5nID0gc3Vic3RhbmNlX3N0cmluZyArIGV2ZW50WzldICsgXCIsIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHVwbG9hZF9zdWJzdGFuY2VzX2Nzdi5pbm5lclRleHQgPSBzdWJzdGFuY2Vfc3RyaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYl9yZC5yZWFkQXNUZXh0KChldnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzIVswXSk7XG4gICAgICAgIH0pXG4gICAgICAgIFxuICAgICAgICB0aGlzLl9tb2RhbF9pbXBvcnRfY3N2Lm9wZW4oKCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlX3Byb3BlcnRpZXModGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLCBpbXBvcnRlZF9wcm9wZXJ0aWVzKVxuXG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nX3BhcmFtcyA9IE9iamVjdC5rZXlzKGltcG9ydGVkX3Byb3BlcnRpZXMpLmZpbHRlcigoa2V5KSA9PiBcbiAgICAgICAgICAgICAgICBpbXBvcnRlZF9wcm9wZXJ0aWVzW2tleV0gPT09IG51bGxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKG1pc3NpbmdfcGFyYW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWlzc2luZ19wcm9wZXJ0aWVzX3dhcm4obWlzc2luZ19wYXJhbXMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyLnNldE9wdGlvbigndmFsaWRSYW5nZScsIHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZFxuICAgICAgICAgICAgfSkgXG5cbiAgICAgICAgICAgIHRoaXMubWVyZ2Vfc2VsZWN0ZWRfc3Vic3RhbmNlcyhpbXBvcnRlZF9zdWJzdGFuY2VzKVxuICAgICAgICAgICAgdGhpcy5fZWRpdG9yLnVwZGF0ZV9zdWJzdGFuY2VzX3VzZWQodGhpcy5fc3Vic3RhbmNlc191c2VkKVxuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnc3Vic3RhbmNlc1VzZWQnLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9zdWJzdGFuY2VzX3VzZWQpKVxuICAgICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZV9ldmVudHNfY3N2KGV2ZW50cylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBFeHBvcnRpbmcgZGF0YTpcbiAgICBwdWJsaWMgZXhwb3J0X2pzb24oKSB7XG4gICAgICAgIGNvbnN0IGZpbGVfbmFtZSA9IFwiVExGQi1cIiArIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5waWQgKyBcIi1cIiArIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5zdWJqZWN0ICsgXCItXCIgKyB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhcnQgKyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCItXCIgKyB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuZW5kICsgXCIuanNvblwiO1xuXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBzdWJqZWN0OiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3ViamVjdCxcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMudGltZXBvaW50LFxuICAgICAgICAgICAgcGlkOiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMucGlkLFxuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5zdGFydCxcbiAgICAgICAgICAgIGVuZDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmVuZCxcbiAgICAgICAgICAgIHN0YWZmOiB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhZmYsXG4gICAgICAgICAgICByZWNvcmQ6IHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5yZWNvcmQsXG4gICAgICAgICAgICBrZXlmaWVsZDogdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLmtleWZpZWxkLFxuICAgICAgICAgICAgZGF0ZXRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBhcHB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgICAgICAgICAgZXZlbnRzOiB0aGlzLl9lZGl0b3IuZ2V0X2V2ZW50X2xpc3QoKS5zZXJpYWxpemVfZXZlbnRzKCdqc29uJyksXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YV9qc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSlcbiAgICAgICAgY29uc3QganNvbl9ibG9iID0gbmV3IEJsb2IoW2RhdGFfanNvbl0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSlcbiAgICAgICAgY29uc3QgYmxvYl91cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGpzb25fYmxvYilcblxuICAgICAgICBjb25zdCBkb3dubG9hZF9hbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKVxuICAgICAgICBkb3dubG9hZF9hbmNob3IuaHJlZiA9IGJsb2JfdXJsXG4gICAgICAgIGRvd25sb2FkX2FuY2hvci5kb3dubG9hZCA9IGZpbGVfbmFtZVxuXG4gICAgICAgIGRvd25sb2FkX2FuY2hvci5jbGljaygpXG5cbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iX3VybClcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0X2NzdigpIHtcbiAgICAgICAgY29uc3QgZmlsZV9uYW1lID0gXCJUTEZCLVwiICsgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnBpZCArIFwiLVwiICsgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnN1YmplY3QgKyBcIi1cIiArIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5zdGFydCArIFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIi1cIiArIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5lbmQgKyBcIi5jc3ZcIjtcblxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzX3Jvd3M6IChzdHJpbmcgfCBudW1iZXIpW11bXSA9IFtcbiAgICAgICAgICAgIC8vIEhlYWRlciBmb3IgY3N2IGZpbGUsIFwiXCIgYXMgcGxhY2Vob2xkZXJzIGZvciBlbXB0eSBzcGFjZXNcbiAgICAgICAgICAgIFtcIlN1YmplY3RcIiwgXCJFdmVudFwiLCBcInBJRFwiLCBcIlN0YXJ0XCIsIFwiRW5kXCIsIFwiU3RhZmZcIiwgXCJSZWNvcmRcIiwgXCJLZXlmaWVsZFwiLCBcIkRhdGV0aW1lXCIsIFwiQXBwVmVyc2lvblwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiXSxcbiAgICAgICAgICAgIFt0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3ViamVjdCwgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnRpbWVwb2ludCwgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnBpZCwgdGhpcy5fY3VycmVudF9wcm9wZXJ0aWVzLnN0YXJ0LCBcbiAgICAgICAgICAgICB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuZW5kLCB0aGlzLl9jdXJyZW50X3Byb3BlcnRpZXMuc3RhZmYsIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5yZWNvcmQsIHRoaXMuX2N1cnJlbnRfcHJvcGVydGllcy5rZXlmaWVsZCwgXG4gICAgICAgICAgICAgKG5ldyBEYXRlKS50b0lTT1N0cmluZygpLCBWRVJTSU9OLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiXSxcbiAgICAgICAgICAgIFtcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiXSAvLyBFbXB0eSByb3cgZm9yIHJlYWRhYmlsaXR5IFxuICAgICAgICBdXG5cbiAgICAgICAgY29uc3QgZXZlbnRzX3Jvd3MgPSB0aGlzLl9lZGl0b3IuZ2V0X2V2ZW50X2xpc3QoKS5zZXJpYWxpemVfZXZlbnRzKCdjc3YnKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgYWxsX3Jvd3MgPSBwcm9wZXJ0aWVzX3Jvd3MuY29uY2F0KGV2ZW50c19yb3dzIGFzIChzdHJpbmcgfCBudW1iZXIpW11bXSlcblxuICAgICAgICBsZXQgY3N2X3N0cmluZyA9IFwiXCJcblxuICAgICAgICBhbGxfcm93cy5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgIGNzdl9zdHJpbmcgPSBjc3Zfc3RyaW5nICsgcm93LmpvaW4oXCIsXCIpICsgJ1xcbidcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgY3N2X2Jsb2IgPSBuZXcgQmxvYihbY3N2X3N0cmluZ10sIHsgdHlwZTogJ3RleHQvY3N2JyB9KVxuICAgICAgICBjb25zdCBibG9iX3VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoY3N2X2Jsb2IpXG5cbiAgICAgICAgY29uc3QgZG93bmxvYWRfYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIilcbiAgICAgICAgZG93bmxvYWRfYW5jaG9yLmhyZWYgPSBibG9iX3VybFxuICAgICAgICBkb3dubG9hZF9hbmNob3IuZG93bmxvYWQgPSBmaWxlX25hbWVcblxuICAgICAgICBkb3dubG9hZF9hbmNob3IuY2xpY2soKVxuXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYl91cmwpXG4gICAgfVxuXG5cbiAgICAvLyBNaXNjLiBoZWxwZXIgZnVuY3Rpb25zOlxuICAgIHB1YmxpYyByZXNldF9tb2RhbF90ZXh0KGVsZW1lbnRzOiBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJUZXh0ID0gXCJcIlxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsIi8qIG1haW4udHNcbiAqXG4gKiBFbnRyeSBwb2ludCB0byB0aGUgdGltZWxpbmUgZm9sbG93YmFjayBhcHBsaWNhdGlvbi5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQsIE1pY2hhZWwgUGFzY2FsZSA8bXBwYXNjYWxlQG1naC5oYXJ2YXJkLmVkdT5cbiAqICAgICAgICAgICAgICAgICAgICAgSXZ5IFpodSA8aXpodTFAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyNC0wOC0xNlxuICovXG5cbi8vP3N1YmplY3Q9UU8xMEEmc3RhcnQ9MjAyMi0wNy0xNSZlbmQ9MjAyMi0wOC0wOSZrZXlmaWVsZD1yZWNvcmRfaWRcbi8vJnJlY29yZD02NiZldmVudD1waWxvdF92Nl8yMHdrX2FybV8yJnBpZD0yODk1NVxuXG4vLyA/c3ViamVjdD1bcGlsb3RfdjBfc2NyZWVuaW5nX2FybV8yXVtyZWNvcmRfY2FtX2lkXVxuLy8gJnN0YXJ0PVt0bGZiX3N0YXJ0X2RhdGVdXG4vLyAmZW5kPVt0bGZiX2VuZF9kYXRlXVxuLy8gJmtleWZpZWxkPXJlY29yZF9pZFxuXG5cbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSAnQGZ1bGxjYWxlbmRhci9jb3JlJztcbmltcG9ydCBkYXlHcmlkUGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvZGF5Z3JpZCc7XG5pbXBvcnQgaW50ZXJhY3Rpb25QbHVnaW4gZnJvbSAnQGZ1bGxjYWxlbmRhci9pbnRlcmFjdGlvbic7XG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJy4vZWRpdG9yJ1xuaW1wb3J0IHsgRmlsZSB9IGZyb20gJy4vZmlsZSdcblxuaW1wb3J0IHsgVExGQlByb3BlcnRpZXMsIFN1YnN0YW5jZUxpc3QgfSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCdcbmltcG9ydCB7IFZFUlNJT04sIENWVF9NU19EQVksIENBTF9IRUlHSFRfRElGRiwgUkdYX0lOVEVHRVIsIFJHWF9XT1JELCBSR1hfREFURSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuXG5mdW5jdGlvbiBnZXRfdXJsX3Byb3BlcnRpZXMoKSB7XG4gICAgLy8gRmlsbCBpbiB0aG9zZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIFVSTCBxdWVyeSBzdHJpbmcuXG4gICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuXG4gICAgY29uc3QgcHJvcHM6IHtba2V5OiBzdHJpbmddOiBhbnl9PSB7fTtcblxuICAgIGNvbnN0IHBvc3NpYmxlID0gW1xuICAgICAgICAvLyBSRURDYXAgYm9va21hcmsgbGlua3Mgd2lsbCBhZGQgdGhlIHJlY29yZCwgZXZlbnQsIGFuZCBwcm9qZWN0IElELlxuICAgICAgICB7bmFtZTogJ3JlY29yZCcsICAgIHRvOiAncmVjb3JkJywgICAgdmFsaWRhdG9yOiBSR1hfSU5URUdFUn0sXG4gICAgICAgIHtuYW1lOiAncGlkJywgICAgICAgdG86ICdwaWQnLCAgICAgICB2YWxpZGF0b3I6IFJHWF9JTlRFR0VSfSxcbiAgICAgICAge25hbWU6ICdldmVudCcsICAgICB0bzogJ3RpbWVwb2ludCcsIHZhbGlkYXRvcjogUkdYX1dPUkR9LFxuXG4gICAgICAgIHtuYW1lOiAnc3ViamVjdCcsICAgdG86ICdzdWJqZWN0JywgICB2YWxpZGF0b3I6IFJHWF9XT1JEfSxcbiAgICAgICAge25hbWU6ICdzdGFydCcsICAgICB0bzogJ3N0YXJ0JywgICAgIHZhbGlkYXRvcjogUkdYX0RBVEV9LFxuICAgICAgICB7bmFtZTogJ2VuZCcsICAgICAgIHRvOiAnZW5kJywgICAgICAgdmFsaWRhdG9yOiBSR1hfREFURX0sXG4gICAgICAgIHtuYW1lOiAna2V5ZmllbGQnLCAgdG86ICdrZXlmaWVsZCcsICB2YWxpZGF0b3I6IFJHWF9XT1JEfSxcblxuICAgICAgICB7bmFtZTogJ3N0YWZmJywgICAgIHRvOiAnc3RhZmYnLCAgICAgdmFsaWRhdG9yOiBSR1hfV09SRH0sXG4gICAgXVxuXG4gICAgY29uc3QgbWlzc2luZ19wYXJhbXM6IHN0cmluZ1tdID0gW11cbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBvc3NpYmxlKSB7XG4gICAgICAgIGlmIChxdWVyeS5oYXMocGFyYW0ubmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChxdWVyeS5nZXQocGFyYW0ubmFtZSkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBtaXNzaW5nX3BhcmFtcy5wdXNoKHBhcmFtLm5hbWUpXG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICBpZiAoIXBhcmFtLnZhbGlkYXRvci50ZXN0KHF1ZXJ5LmdldChwYXJhbS5uYW1lKSEpKVxuICAgICAgICAgICAgICAgIGFsZXJ0KGAke3BhcmFtLm5hbWV9IG1pc3NwZWNpZmllZCBpbiB0aGUgVVJMIHF1ZXJ5LmApXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcHJvcHNbcGFyYW0udG9dID0gcXVlcnkuZ2V0KHBhcmFtLm5hbWUpIVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBxdWVyeS5kZWxldGUocGFyYW0ubmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pc3NpbmdfcGFyYW1zLnB1c2gocGFyYW0ubmFtZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICgocHJvcHMucmVjb3JkIHx8IHByb3BzLnBpZCB8fCBwcm9wcy50aW1lcG9pbnQpICYmXG4gICAgICAgICEocHJvcHMucmVjb3JkICYmIHByb3BzLnBpZCAmJiBwcm9wcy50aW1lcG9pbnQpKVxuICAgICAgICBhbGVydCgnU29tZSBidXQgbm90IGFsbCBSRURDYXAgcGFyYW1ldGVycyByZWNlaXZlZC4gUkVEQ2FwIG1heSBiZSBtaXNjb25maWd1cmVkLicpXG5cbiAgICAvLyBxdWVyeS5mb3JFYWNoKChfLCBrZXkpPT5hbGVydChgVW5rbm93biBwYXJhbWV0ZXIgc3BlY2lmaWVkIGluIFVSTCBxdWVyeTogJHtrZXl9YCkpXG4gICAgXG4gICAgcmV0dXJuIFtwcm9wcywgbWlzc2luZ19wYXJhbXNdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVfcHJvcGVydGllcyhwcm9wZXJ0aWVzOiBUTEZCUHJvcGVydGllcywgdXBkYXRlZDogKG9iamVjdCB8IFRMRkJQcm9wZXJ0aWVzKSkge1xuICAgIE9iamVjdC5hc3NpZ24ocHJvcGVydGllcywgdXBkYXRlZClcbiAgICBcbiAgICBjb25zdCBkYXlzX2FwYXJ0ID0gKChuZXcgRGF0ZShwcm9wZXJ0aWVzLmVuZCkpLnZhbHVlT2YoKSAtIChuZXcgRGF0ZShwcm9wZXJ0aWVzLnN0YXJ0KSkudmFsdWVPZigpKSAvIENWVF9NU19EQVlcblxuICAgIHByb3BlcnRpZXMuZGF5cyA9IGRheXNfYXBhcnRcblxuICAgIHV0aWwuc2V0X2lubmVyKFxuICAgICAgICAnY2FsZW5kYXItZmlsZS10aXRsZScsXG4gICAgICAgIGAke3Byb3BlcnRpZXMucGlkfSB8ICR7cHJvcGVydGllcy5zdWJqZWN0fSAvICR7cHJvcGVydGllcy5yZWNvcmR9IGF0ICR7cHJvcGVydGllcy50aW1lcG9pbnR9YFxuICAgIClcblxuICAgIHV0aWwuc2V0X2lubmVyKFxuICAgICAgICAnY2FsZW5kYXItZmlsZS1zdWJ0aXRsZScsXG4gICAgICAgIGAke3Byb3BlcnRpZXMuc3RhcnR9IHRvICR7cHJvcGVydGllcy5lbmR9ICgke2RheXNfYXBhcnR9IERheXMpYFxuICAgIClcblxuICAgIC8vIFVwZGF0ZSBVUkxcbiAgICBjb25zdCBwcm9wZXJ0eV9wYXJhbXMgPSBbXG4gICAgICAgIHtuYW1lOiAncmVjb3JkJywgICAgdG86ICdyZWNvcmQnfSxcbiAgICAgICAge25hbWU6ICdwaWQnLCAgICAgICB0bzogJ3BpZCd9LFxuICAgICAgICB7bmFtZTogJ2V2ZW50JywgICAgIHRvOiAndGltZXBvaW50J30sXG4gICAgICAgIHtuYW1lOiAnc3ViamVjdCcsICAgdG86ICdzdWJqZWN0J30sXG4gICAgICAgIHtuYW1lOiAnc3RhcnQnLCAgICAgdG86ICdzdGFydCd9LFxuICAgICAgICB7bmFtZTogJ2VuZCcsICAgICAgIHRvOiAnZW5kJ30sXG4gICAgICAgIHtuYW1lOiAna2V5ZmllbGQnLCAgdG86ICdrZXlmaWVsZCd9LFxuICAgICAgICB7bmFtZTogJ3N0YWZmJywgICAgIHRvOiAnc3RhZmYnfSxcbiAgICBdXG5cbiAgICBjb25zdCBxdWVyeSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBwcm9wZXJ0eV9wYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgcXVlcnkuc2V0KHBhcmFtLm5hbWUsIHVwZGF0ZWRbcGFyYW0udG8gYXMga2V5b2YgdHlwZW9mIHVwZGF0ZWRdKTtcbiAgICB9KVxuXG4gICAgY29uc3QgYmFzZV91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIj9cIilbMF1cbiAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShiYXNlX3VybCwgZG9jdW1lbnQudGl0bGUsIFwiP1wiICsgcXVlcnkudG9TdHJpbmcoKSk7XG59XG4gICAgXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG5cbiAgICBjb25zdCB0bGZiX3Byb3BlcnRpZXM6IFRMRkJQcm9wZXJ0aWVzID0ge1xuICAgICAgICBzdWJqZWN0OiAnJyxcbiAgICAgICAgcmVjb3JkOiAnJyxcbiAgICAgICAgdGltZXBvaW50OiAnJyxcbiAgICAgICAgcGlkOiAnJyxcbiAgICAgICAgc3RhcnQ6ICcnLFxuICAgICAgICBlbmQ6ICcnLFxuICAgICAgICBrZXlmaWVsZDogJycsXG4gICAgICAgIHN0YWZmOiAnJyxcbiAgICAgICAgZGF5czogMFxuICAgIH1cblxuICAgIGNvbnN0IHVybF90bGZiX3Byb3BlcnRpZXMgPSBnZXRfdXJsX3Byb3BlcnRpZXMoKVswXVxuICAgIGNvbnN0IG1pc3NpbmdfdGxmYl9wcm9wZXJ0aWVzID0gZ2V0X3VybF9wcm9wZXJ0aWVzKClbMV0gYXMgc3RyaW5nW11cblxuICAgIHVwZGF0ZV9wcm9wZXJ0aWVzKHRsZmJfcHJvcGVydGllcywgdXJsX3RsZmJfcHJvcGVydGllcyk7XG5cbiAgICBjb25zdCBjYWxlbmRhckVsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhcicpITtcblxuICAgIGNvbnN0IGNhbGVuZGFyID0gbmV3IENhbGVuZGFyKGNhbGVuZGFyRWwsIHtcbiAgICAgICAgcGx1Z2luczogWyBpbnRlcmFjdGlvblBsdWdpbiwgZGF5R3JpZFBsdWdpbiBdLFxuICAgICAgICBpbml0aWFsVmlldzogXCJkYXlHcmlkTW9udGhcIixcbiAgICAgICAgdmFsaWRSYW5nZToge1xuICAgICAgICAgICAgc3RhcnQ6IHRsZmJfcHJvcGVydGllcy5zdGFydCxcbiAgICAgICAgICAgIGVuZDogdGxmYl9wcm9wZXJ0aWVzLmVuZFxuICAgICAgICB9LFxuXG4gICAgICAgIGhlYWRlclRvb2xiYXI6IHtcbiAgICAgICAgICAgIGxlZnQ6ICd0aXRsZScsXG4gICAgICAgICAgICByaWdodDogJ3ByZXYsbmV4dCdcbiAgICAgICAgfSxcblxuICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIHNob3dOb25DdXJyZW50RGF0ZXM6IGZhbHNlLFxuICAgICAgICBmaXhlZFdlZWtDb3VudDogdHJ1ZSxcblxuICAgICAgICAvLyBhc3BlY3RSYXRpbzogMixcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBDQUxfSEVJR0hUX0RJRkYsXG5cbiAgICAgICAgLy8gZGF0ZUNsaWNrOiBmYy5jbGlja19kYXRlLFxuICAgICAgICAvLyBldmVudENsaWNrOiBmYy5jbGlja19ldmVudCxcbiAgICAgICAgLy8gc2VsZWN0OiBmYy5zZWxlY3RfZGF0ZXJhbmdlXG5cbiAgICB9KTtcblxuICAgIGNhbGVuZGFyLnJlbmRlcigpO1xuXG4gICAgdXRpbC5zZXRfaW5uZXIoJ2FwcGxpY2F0aW9uLXZlcnNpb24tdGl0bGUnLCBgVGltZWxpbmUtRm9sbG93YmFjayB2JHtWRVJTSU9OfWApO1xuXG4gICAgY29uc3QgZWRpdG9yID0gbmV3IEVkaXRvcihjYWxlbmRhcik7XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKHRsZmJfcHJvcGVydGllcywgY2FsZW5kYXIsIGVkaXRvcilcblxuICAgIC8vIFB1bGwgdXAgcHJvcGVydGllcyBtb2RhbCBpZiB0aGVyZSdzIGFueSBtaXNzaW5nIGRhdGEgZnJvbSBSRURDYXBcbiAgICBpZiAobWlzc2luZ190bGZiX3Byb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmaWxlLm1pc3NpbmdfcHJvcGVydGllc193YXJuKG1pc3NpbmdfdGxmYl9wcm9wZXJ0aWVzKVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIG9wdGlvbnMgZm9yIHN1YnN0YW5jZSBsaXN0IG1vZGFsXG4gICAgY29uc3QgX3N1YnN0YW5jZV9saXN0OiBTdWJzdGFuY2VMaXN0ID0gcmVxdWlyZSgnLi4vc3Vic3RhbmNlcy5qc29uJyk7XG4gICAgY29uc3QgX3N1YnN0YW5jZV9mb3JtOiBFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJzdGFuY2UtZm9ybVwiKSE7XG5cbiAgICBfc3Vic3RhbmNlX2xpc3QuY2F0ZWdvcnkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIF9zdWJzdGFuY2VfZm9ybS5pbnNlcnRBZGphY2VudEhUTUwoXG4gICAgICAgICAgICAnYmVmb3JlZW5kJyxcbiAgICAgICAgICAgIGA8aDUgY2xhc3M9XCJwdC01XCI+JHtlbC5sYWJlbH08L2g1PmBcbiAgICAgICAgKTtcblxuICAgICAgICBfc3Vic3RhbmNlX2xpc3Quc3Vic3RhbmNlW2VsLmlkXS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgX3N1YnN0YW5jZV9mb3JtLmluc2VydEFkamFjZW50SFRNTChcbiAgICAgICAgICAgICAgICAnYmVmb3JlZW5kJyxcbiAgICAgICAgICAgICAgICBgPGlucHV0IGNsYXNzPVwic3Vic3RhbmNlLWxpc3RcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIiR7aW5kZXgudG9TdHJpbmcoKSArIGVsLmlkfVwiIG5hbWU9XCIke2luZGV4LnRvU3RyaW5nKCkgKyBlbC5pZH1cIiBcbiAgICAgICAgICAgICAgICB2YWx1ZT1cIiR7aW5kZXgudG9TdHJpbmcoKX0gJHtlbC5pZH1cIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiJHtpbmRleC50b1N0cmluZygpICsgZWwuaWR9XCI+JHtlbGVtZW50LmxhYmVsfTwvbGFiZWw+PGJyPmBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBSZXNpemUganVzdCBoYXBwZW5lZCwgcGl4ZWxzIGNoYW5nZWRcbiAgICAgICAgY2FsZW5kYXIuc2V0T3B0aW9uKCdoZWlnaHQnLCB3aW5kb3cuaW5uZXJIZWlnaHQgLSBDQUxfSEVJR0hUX0RJRkYpO1xuICAgIH0pO1xuICAgIFxufSk7XG4iLCIvKiBtb2RhbC50c1xuICpcbiAqIFRoZSBNb2RhbCBjbGFzcyBoYW5kbGVzIGFsbCBvZiB0aGUgbW9kYWwgZm9ybXMgdXNlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQsIE1pY2hhZWwgUGFzY2FsZSA8bXBwYXNjYWxlQG1naC5oYXJ2YXJkLmVkdT5cbiAqIExhc3QgbW9kaWZpZWQ6IDIwMjMtMDctMjdcbiAqL1xuXG5leHBvcnQgY2xhc3MgTW9kYWwge1xuICAgIHByaXZhdGUgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIHByaXZhdGUgX2Zvcm06IEhUTUxGb3JtRWxlbWVudCB8IG51bGw7XG4gICAgcHJpdmF0ZSBfb25zdWJtaXQ6ICgoZGF0YTogRm9ybURhdGEpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuXG4gICAgICAgIGlmIChlbCA9PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsKCk6IENvdWxkIG5vdCBsb2NhdGUgRE9NIGVsZW1lbnQgJyMke2lkfScuYClcbiAgICAgICAgXG4gICAgICAgIGlmICghZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtb2RhbCcpKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsKCk6ICcjJHtpZH0nIGlzIG5vdCBvZiBjbGFzcyAnbW9kYWwnLmApXG4gICAgICAgIFxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZWw7XG4gICAgICAgIHRoaXMuX2Zvcm0gPSB0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Zvcm0nKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNldCB1cCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9kYWwtY2xvc2UsIC5jYW5jZWwtb3BlcmF0aW9uJykuZm9yRWFjaCh4ID0+IHguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpKTtcbiAgICAgICAgdGhpcy5fZm9ybT8uYWRkRXZlbnRMaXN0ZW5lcignc3VibWl0JywgKGRldnQpID0+IHtkZXZ0LnByZXZlbnREZWZhdWx0KCk7IHRoaXMuc3VibWl0KGRldnQpO30pO1xuICAgICAgICBcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5yZXNldCgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YClcbiAgICAgICAgdGhpcy5fZm9ybT8ucmVzZXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VibWl0KGRldnQ6IFN1Ym1pdEV2ZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5zdWJtaXQoKTogJHt0aGlzLl9lbGVtZW50LmlkfWApXG5cbiAgICAgICAgaWYgKCF0aGlzLl9mb3JtKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsLnN1Ym1pdCgpOiBDYW5ub3Qgc3VibWl0IG1vZGFsIHdpdGggbm8gZGVzY2VuZGFudCBmb3JtICR7dGhpcy5fZWxlbWVudC5pZH0uYClcblxuICAgICAgICBpZiAoIXRoaXMuX29uc3VibWl0KVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsLnN1Ym1pdCgpOiBGb3JtIHN1Ym1pdHRlZCBidXQgbm8gaGFuZGxlciBzcGVjaWZpZWQuYClcblxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRGb3JtRGF0YSgpXG4gICAgICAgIGNvbnN0IHN1Ym1pdF9idXR0b25fdmFsdWUgPSAoZGV2dC5zdWJtaXR0ZXIgYXMgSFRNTEZvcm1FbGVtZW50KS52YWx1ZVxuXG4gICAgICAgIGlmIChzdWJtaXRfYnV0dG9uX3ZhbHVlKVxuICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ2FjdGlvbicsIHN1Ym1pdF9idXR0b25fdmFsdWUpXG5cbiAgICAgICAgdGhpcy5fb25zdWJtaXQoZGF0YSlcblxuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb3B1bGF0ZUZvcm0oZGF0YToge1tuYW1lOiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5wb3B1bGF0ZUZvcm0oKTogJHt0aGlzLl9lbGVtZW50LmlkfWApXG5cbiAgICAgICAgaWYgKCF0aGlzLl9mb3JtKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1vZGFsLnBvcHVsYXRlRm9ybSgpOiBDYW5ub3QgcG9wdWxhdGUgbW9kYWwgd2l0aCBubyBkZXNjZW5kYW50IGZvcm0gJHt0aGlzLl9lbGVtZW50LmlkfS5gKVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZm9ybS5lbGVtZW50cy5uYW1lZEl0ZW0oa2V5KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwucG9wdWxhdGVGb3JtKCk6IE5hbWVkIGVsZW1lbnQgJyR7a2V5fScgbm90IGZvdW5kIGluIGZvcm0uYCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAodGhpcy5fZm9ybS5lbGVtZW50cy5uYW1lZEl0ZW0oa2V5KSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBwb3B1bGF0ZVRleHQoZGF0YTogeyBbc2VsZWN0b3I6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5wb3B1bGF0ZVRleHQoKTogJHt0aGlzLl9lbGVtZW50LmlkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3IgaW4gZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwucG9wdWxhdGVUZXh0KCk6IEVsZW1lbnQgbm90IGZvdW5kIGZvciAnJHtzZWxlY3Rvcn0nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBkYXRhW3NlbGVjdG9yXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFbGVtZW50Q2xhc3MoZGF0YTogeyBbc2VsZWN0b3I6IHN0cmluZ106IFtzdHJpbmcsIGJvb2xlYW5dIH0pIHtcbiAgICAgICAgY29uc29sZS5sb2coYE1vZGFsLmFkZEVsZW1lbnRDbGFzcygpOiAke3RoaXMuX2VsZW1lbnQuaWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBNb2RhbC5hZGRFbGVtZW50Q2xhc3MoKTogRWxlbWVudCBub3QgZm91bmQgZm9yICcke3NlbGVjdG9yfScuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChkYXRhW3NlbGVjdG9yXVsxXSlcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoZGF0YVtzZWxlY3Rvcl1bMF0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShkYXRhW3NlbGVjdG9yXVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Rm9ybURhdGEoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5nZXRGb3JtRGF0YSgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YClcblxuICAgICAgICBpZiAoIXRoaXMuX2Zvcm0pXG4gICAgICAgICB0aHJvdyBFcnJvcihgTW9kYWwuZ2V0Rm9ybURhdGEoKTogQ2Fubm90IGdldCBmb3JtIGRhdGEgZm9yIG1vZGFsIHdpdGggbm8gZGVzY2VuZGFudCBmb3JtICR7dGhpcy5fZWxlbWVudC5pZH0uYClcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKHRoaXMuX2Zvcm0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcGVuKG9uc3VibWl0OiAoKGRhdGE6IEZvcm1EYXRhKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5vcGVuKCk6ICR7dGhpcy5fZWxlbWVudC5pZH1gKVxuICAgICAgICB0aGlzLl9vbnN1Ym1pdCA9IG9uc3VibWl0O1xuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNb2RhbC5jbG9zZSgpOiAke3RoaXMuX2VsZW1lbnQuaWR9YClcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCIvKiBzdGF0ZS50c1xuICpcbiAqIE1hbmFnZSBjYWxlbmRhciBldmVudHMgc2VwYXJhdGVseSBmcm9tIHRoZSBjYWxlbmRhciBVSS5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQsIE1pY2hhZWwgUGFzY2FsZSA8bXBwYXNjYWxlQG1naC5oYXJ2YXJkLmVkdT5cbiAqICAgICAgICAgICAgICAgICAgICAgSXZ5IFpodSA8aXpodTFAbWdoLmhhcnZhcmQuZWR1PlxuICogTGFzdCBtb2RpZmllZDogMjAyNC0wOC0wOFxuICovXG5cbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSBcIkBmdWxsY2FsZW5kYXIvY29yZVwiO1xuaW1wb3J0IHsgQ09MT1JfV0hJVEUsIENPTE9SX1RFWFQsIENPTE9SX1BVUlBMRSwgQ09MT1JfWUVMTE9XLCBDT0xPUl9PUkFOR0UgfSBmcm9tICcuL2NvbnN0YW50cyc7IFxuXG5pbXBvcnQgeyBKU09ORXZlbnQsIFVzZUV2ZW50UHJvcGVydGllcyB9IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRhdGUge1xuICAgIHByaXZhdGUgX2RhdGU6IERhdGU7XG5cbiAgICAvLyBDYWxlbmRhckRhdGUgZXhwZWN0cyBJU08gODYwMSAnWVlZWS1NTS1ERCcgZGF0ZSBhbmQgaW50ZXJwcmV0cyBpdCBpbiBVVEMuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGU6IHN0cmluZykge1xuXG4gICAgICAgIGlmICghKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0kLykudGVzdChkYXRlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FsZW5kYXJEYXRlIGV4cGVjdHMgYSBkYXRlIGluIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LicpO1xuXG4gICAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcblxuICAgICAgICBpZiAoaXNOYU4odGhpcy5fZGF0ZS52YWx1ZU9mKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxhbmRlckRhdGUgcmVjZWl2ZWQgYW4gaW52YWxpZCBkYXRlLicpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgRGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGU7XG4gICAgfVxuXG4gICAgLy8gV2Vla2RheSB3aGVyZSBTdW5kYXkgPT0gMS5cbiAgICBwdWJsaWMgZ2V0IHdlZWtkYXkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0VVRDRGF5KCkgKyAxO1xuICAgIH1cblxuICAgIC8vIERheSBvZiB0aGUgbW9udGguXG4gICAgcHVibGljIGdldCBkYXkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIE1vbnRoIHdoZXJlIEphbnVhcnkgPT0gMS5cbiAgICBwdWJsaWMgZ2V0IG1vbnRoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIH1cblxuICAgIC8vIEZvdXIgZGlnaXQgeWVhci5cbiAgICBwdWJsaWMgZ2V0IHllYXIoKTogbnVtYmVyICB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsMTApXG4gICAgfVxuXG4gICAgcHVibGljIHNldF9kYXkoZGF5OiBudW1iZXIpOiBDYWxlbmRhckRhdGUge1xuICAgICAgICB0aGlzLl9kYXRlLnNldFVUQ0RhdGUoZGF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2FtZURheShkYXRlOiBDYWxlbmRhckRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA9PSBkYXRlLm1vbnRoICYmIHRoaXMuZGF5ID09IGRhdGUuZGF5O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0FmdGVyKGRhdGU6IENhbGVuZGFyRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA9PSBkYXRlLm1vbnRoICYmIHRoaXMuZGF5ID4gZGF0ZS5kYXkpIHx8XG4gICAgICAgICAgICAodGhpcy55ZWFyID09IGRhdGUueWVhciAmJiB0aGlzLm1vbnRoID4gZGF0ZS5tb250aCkgfHxcbiAgICAgICAgICAgICh0aGlzLnllYXIgPiBkYXRlLnllYXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0JlZm9yZShkYXRlOiBDYWxlbmRhckRhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnllYXIgPT0gZGF0ZS55ZWFyICYmIHRoaXMubW9udGggPT0gZGF0ZS5tb250aCAmJiB0aGlzLmRheSA8IGRhdGUuZGF5KSB8fFxuICAgICAgICAgICAgKHRoaXMueWVhciA9PSBkYXRlLnllYXIgJiYgdGhpcy5tb250aCA8IGRhdGUubW9udGgpIHx8XG4gICAgICAgICAgICAodGhpcy55ZWFyIDwgZGF0ZS55ZWFyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5leHRfZGF5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyRGF0ZSh0aGlzLnRvU3RyaW5nKCkpLnNldF9kYXkodGhpcy5kYXkgKyAxKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByZXZpb3VzX2RheSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYWxlbmRhckRhdGUodGhpcy50b1N0cmluZygpKS5zZXRfZGF5KHRoaXMuZGF5IC0gMSk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FsZW5kYXJFdmVudCB7XG5cbiAgICBwcml2YXRlIF9laWQgPSAwO1xuICAgIHByaXZhdGUgX2dpZCA9IDA7XG4gICAgcHJpdmF0ZSBfZGF0ZTogQ2FsZW5kYXJEYXRlO1xuICAgIHByb3RlY3RlZCBfdGl0bGUgPSAnVW5pbml0aWFsaXplZCBDYWxlbmRhckV2ZW50JztcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBfdHlwZTogJ2tleScgfCAndXNlJyB8ICduby11c2UnO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGU6IHN0cmluZywgdHlwZTogJ2tleScgfCAndXNlJyB8ICduby11c2UnKSB7XG4gICAgICAgIHRoaXMuX2RhdGUgPSBuZXcgQ2FsZW5kYXJEYXRlKGRhdGUpO1xuICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgY2xvbmUoKTogQ2FsZW5kYXJFdmVudDtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBnZXQgY29sb3JzKCk6IFtzdHJpbmcsIHN0cmluZ107XG5cbiAgICBwdWJsaWMgZ2V0IGVpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VpZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGdpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dpZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRlLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkYXRlX29iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGVcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGl0bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0eXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHlwZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRfZWlkKGVpZDogbnVtYmVyKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHRoaXMuX2VpZCA9IGVpZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldF9naWQoZ2lkOiBudW1iZXIpOiBDYWxlbmRhckV2ZW50IHtcbiAgICAgICAgdGhpcy5fZ2lkID0gZ2lkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0X2RhdGUoZGF0ZTogc3RyaW5nIHwgQ2FsZW5kYXJEYXRlKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIGlmIChkYXRlIGluc3RhbmNlb2YgQ2FsZW5kYXJEYXRlKVxuICAgICAgICAgICAgdGhpcy5fZGF0ZSA9IGRhdGU7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuX2RhdGUgPSBuZXcgQ2FsZW5kYXJEYXRlKGRhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBSZWN1cnJpbmcgZXZlbnRzIGFyZSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBldmVudHMgd2l0aCB0aGUgc2FtZSBnaWQuXG4gICAgLy8gVGhlIHVudGlsIGRhdGUgZm9yIGEgcmVjdXJyaW5nIGV2ZW50IGlzICppbmNsdXNpdmUqLlxuICAgIHB1YmxpYyBtYWtlX3JlY3VycmVuY2Uod2Vla2RheXM6IG51bWJlcltdLCB1bnRpbDogc3RyaW5nKTogQ2FsZW5kYXJFdmVudFtdIHtcblxuICAgICAgICBjb25zdCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGR0ID0gdGhpcy5fZGF0ZTsgIWR0LmlzQWZ0ZXIobmV3IENhbGVuZGFyRGF0ZSh1bnRpbCkpOyBkdCA9IGR0Lm5leHRfZGF5KSB7XG4gICAgICAgICAgICBpZiAod2Vla2RheXMuaW5jbHVkZXMoZHQud2Vla2RheSkpIHtcbiAgICAgICAgICAgICAgICBldmVudHMucHVzaCh0aGlzLmNsb25lKCkuc2V0X2dpZCh0aGlzLmdpZCkuc2V0X2VpZCh0aGlzLmVpZCkuc2V0X2RhdGUoZHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBldmVudHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgS2V5RXZlbnQgZXh0ZW5kcyBDYWxlbmRhckV2ZW50IHtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRlOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZGF0ZSwgJ2tleScpO1xuICAgICAgICB0aGlzLl90aXRsZSA9IHRpdGxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZSgpOiBDYWxlbmRhckV2ZW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBLZXlFdmVudCh0aGlzLmRhdGUsIHRoaXMuX3RpdGxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0X3Byb3BlcnRpZXMocHJvcGVydGllczoge3RpdGxlOiBzdHJpbmd9KTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gcHJvcGVydGllcy50aXRsZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGNvbG9ycygpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICAgICAgcmV0dXJuIFtDT0xPUl9PUkFOR0UsIENPTE9SX1RFWFRdXG4gICAgfSBcbn1cblxuZXhwb3J0IGNsYXNzIFVzZUV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG4gICAgcHJpdmF0ZSBfY2F0ZWdvcnkgPSAnJztcbiAgICBwcml2YXRlIF9zdWJzdGFuY2UgPSAnJztcbiAgICBwcml2YXRlIF9tZXRob2RUeXBlID0gJyc7XG4gICAgcHJpdmF0ZSBfbWV0aG9kID0gJyc7XG4gICAgcHJpdmF0ZSBfbWV0aG9kT3RoZXIgPSAnJztcbiAgICBwcml2YXRlIF90aW1lcyA9IDA7XG4gICAgcHJpdmF0ZSBfYW1vdW50ID0gMDtcbiAgICBwcml2YXRlIF91bml0cyA9ICcnO1xuICAgIHByaXZhdGUgX3VuaXRzT3RoZXIgPSAnJztcbiAgICBwcml2YXRlIF9ub3RlID0gJyc7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoZGF0ZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBVc2VFdmVudFByb3BlcnRpZXMgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKGRhdGUsICd1c2UnKTtcblxuICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5zZXRfcHJvcGVydGllcyhwcm9wZXJ0aWVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvbmUoKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHJldHVybiBuZXcgVXNlRXZlbnQodGhpcy5kYXRlLCB0aGlzLnByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sb3JzKCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgICAgICByZXR1cm4gW0NPTE9SX1BVUlBMRSwgQ09MT1JfV0hJVEVdXG4gICAgfSBcblxuICAgIHB1YmxpYyBnZXQgcHJvcGVydGllcygpOiBVc2VFdmVudFByb3BlcnRpZXMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICAgICAgIHRoaXMuX2NhdGVnb3J5LFxuICAgICAgICAgICAgc3Vic3RhbmNlOiAgICAgIHRoaXMuX3N1YnN0YW5jZSxcbiAgICAgICAgICAgIG1ldGhvZFR5cGU6ICAgICB0aGlzLl9tZXRob2RUeXBlLFxuICAgICAgICAgICAgbWV0aG9kOiAgICAgICAgIHRoaXMuX21ldGhvZCxcbiAgICAgICAgICAgIG1ldGhvZE90aGVyOiAgICB0aGlzLl9tZXRob2RPdGhlcixcbiAgICAgICAgICAgIHRpbWVzOiAgICAgICAgICB0aGlzLl90aW1lcyxcbiAgICAgICAgICAgIGFtb3VudDogICAgICAgICB0aGlzLl9hbW91bnQsXG4gICAgICAgICAgICB1bml0czogICAgICAgICAgdGhpcy5fdW5pdHMsXG4gICAgICAgICAgICB1bml0c090aGVyOiAgICAgdGhpcy5fdW5pdHNPdGhlcixcbiAgICAgICAgICAgIG5vdGU6ICAgICAgICAgICB0aGlzLl9ub3RlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIHNldF9wcm9wZXJ0aWVzKHByb3BlcnRpZXM6IFVzZUV2ZW50UHJvcGVydGllcyk6IENhbGVuZGFyRXZlbnQge1xuICAgICAgICB0aGlzLl9jYXRlZ29yeSAgICA9IHByb3BlcnRpZXMuY2F0ZWdvcnk7XG4gICAgICAgIHRoaXMuX3N1YnN0YW5jZSAgID0gcHJvcGVydGllcy5zdWJzdGFuY2U7XG4gICAgICAgIHRoaXMuX21ldGhvZFR5cGUgID0gcHJvcGVydGllcy5tZXRob2RUeXBlO1xuICAgICAgICB0aGlzLl9tZXRob2QgICAgICA9IHByb3BlcnRpZXMubWV0aG9kO1xuICAgICAgICB0aGlzLl9tZXRob2RPdGhlciA9IHByb3BlcnRpZXMubWV0aG9kT3RoZXI7XG4gICAgICAgIHRoaXMuX3RpbWVzICAgICAgID0gcHJvcGVydGllcy50aW1lcztcbiAgICAgICAgdGhpcy5fYW1vdW50ICAgICAgPSBwcm9wZXJ0aWVzLmFtb3VudCBhcyBudW1iZXI7XG4gICAgICAgIHRoaXMuX3VuaXRzICAgICAgID0gcHJvcGVydGllcy51bml0cztcbiAgICAgICAgdGhpcy5fdW5pdHNPdGhlciAgPSBwcm9wZXJ0aWVzLnVuaXRzT3RoZXI7XG4gICAgICAgIHRoaXMuX25vdGUgICAgICAgID0gcHJvcGVydGllcy5ub3RlO1xuICAgICAgICB0aGlzLnVwZGF0ZV90aXRsZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgdGl0bGUgZm9yIHRoZSBldmVudCBnaXZlbiB0aGUgZXZlbnQgcHJvcGVydGllcy5cbiAgICBwcml2YXRlIHVwZGF0ZV90aXRsZSgpIHtcbiAgICAgICAgbGV0IHVuaXQgOiBzdHJpbmcgPSB0aGlzLl91bml0c1xuICAgICAgICBpZiAodGhpcy5fdW5pdHNPdGhlciAhPSBudWxsICYmIHRoaXMuX3VuaXRzT3RoZXIgIT0gXCJcIikge1xuICAgICAgICAgICAgdW5pdCA9IHRoaXMuX3VuaXRzT3RoZXJcbiAgICAgICAgfSBlbHNlIGlmKHRoaXMuX3VuaXRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHVuaXQgPSBcIlwiXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGl0bGUgPSAgdGhpcy5fbWV0aG9kICsgJyAnICsgdGhpcy5fdGltZXMgKyBcInhcIiArIFwiIHwgXCIgKyB0aGlzLl9hbW91bnQgKyBcIiBcIiArIHVuaXQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm9Vc2VFdmVudCBleHRlbmRzIENhbGVuZGFyRXZlbnQge1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKGRhdGU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihkYXRlLCAnbm8tdXNlJyk7XG4gICAgICAgIHRoaXMuX3RpdGxlID0gXCJObyBzdWJzdGFuY2VzIHVzZWRcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvbmUoKTogQ2FsZW5kYXJFdmVudCB7XG4gICAgICAgIHJldHVybiBuZXcgTm9Vc2VFdmVudCh0aGlzLmRhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29sb3JzKCk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgICAgICByZXR1cm4gW0NPTE9SX1lFTExPVywgQ09MT1JfVEVYVF0gLy9cbiAgICB9IFxufVxuXG4vLyBBIENhbGVuZGFyRXZlbnRzIG9iamVjdCBzdG9yZXMgYW4gYXJyYXkgb2YgY2FsZW5kYXIgZXZlbnRzIGFuZCBwcm92aWRlc1xuLy8gYSBzYWZlIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGFuZCB1cGRhdGVkLlxuZXhwb3J0IGNsYXNzIENhbGVuZGFyRXZlbnRMaXN0IHtcbiAgICBwcml2YXRlIF9uZXh0X2VpZDogbnVtYmVyO1xuICAgIHByaXZhdGUgX25leHRfZ2lkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gICAgcHJpdmF0ZSBfZnVsbGNhbGVuZGFyOiBDYWxlbmRhcjtcblxuICAgIHB1YmxpYyByZWFkb25seSBzdGFydF9kYXRlOiBDYWxlbmRhckRhdGU7XG4gICAgcHVibGljIHJlYWRvbmx5IGVuZF9kYXRlOiBDYWxlbmRhckRhdGU7XG5cbiAgICAvLyBTdGFydCBhbmQgZW5kIGRhdGVzIGFyZSAqaW5jbHVzaXZlICouIFxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZywgZnVsbGNhbGVuZGFyOiBDYWxlbmRhciwgIGV2ZW50czogQ2FsZW5kYXJFdmVudFtdIHwgbnVsbCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmV4dF9laWQgPSAxO1xuICAgICAgICB0aGlzLl9uZXh0X2dpZCA9IDE7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9mdWxsY2FsZW5kYXIgPSBmdWxsY2FsZW5kYXI7XG4gICAgICAgIHRoaXMuc3RhcnRfZGF0ZSA9IG5ldyBDYWxlbmRhckRhdGUoc3RhcnQpO1xuICAgICAgICB0aGlzLmVuZF9kYXRlID0gbmV3IENhbGVuZGFyRGF0ZShlbmQpO1xuXG4gICAgICAgIGlmIChldmVudHMgIT0gbnVsbClcbiAgICAgICAgICAgIHRoaXMuaW1wb3J0X2V2ZW50cyhldmVudHMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldF9uZXh0X2VpZCgpIHtcbiAgICAgICAgY29uc3QgbmV4dF9laWQgPSB0aGlzLl9uZXh0X2VpZDtcbiAgICAgICAgdGhpcy5fbmV4dF9laWQrKztcbiAgICAgICAgcmV0dXJuIG5leHRfZWlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldF9uZXh0X2dpZCgpIHtcbiAgICAgICAgY29uc3QgbmV4dF9naWQgPSB0aGlzLl9uZXh0X2dpZDtcbiAgICAgICAgdGhpcy5fbmV4dF9naWQrKztcbiAgICAgICAgcmV0dXJuIG5leHRfZ2lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfZXZlbnQoZWlkOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9ldmVudHMuZmluZCgoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmVpZCA9PSBlaWQpO1xuICAgICAgICBpZiAoZXZlbnQgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENhbGVuZGFyRXZlbnRMaXN0LmdldF9ldmVudCgpOiBDb3VsZCBub3QgZmluZCBldmVudCAke2VpZH0uYClcbiAgICAgICAgcmV0dXJuIGV2ZW50XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudF9ncm91cChnaWQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuZ2lkID09IGdpZCk7XG4gICAgICAgIGlmIChldmVudHMubGVuZ3RoIDwgMSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBDYWxlbmRhckV2ZW50TGlzdC5nZXRfZXZlbnRfZ3JvdXAoKTogQ291bGQgbm90IGZpbmQgZXZlbnRzIGluIGdyb3VwICR7Z2lkfS5gKVxuICAgICAgICByZXR1cm4gZXZlbnRzXG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudF9zaWJsaW5ncyhlaWQ6IG51bWJlcikge1xuICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZ2V0X2V2ZW50KGVpZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldF9ldmVudF9ncm91cChldmVudC5naWQpLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmVpZCAhPSBlaWQpXG4gICAgfVxuXG4gICAgcHVibGljIGdldF9ldmVudHMoKTogQ2FsZW5kYXJFdmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKGV2ZW50OiBDYWxlbmRhckV2ZW50LCByZWFzc2lnbj10cnVlKTogQ2FsZW5kYXJFdmVudExpc3Qge1xuICAgICAgICB0aGlzLmltcG9ydF9ldmVudHMoW2V2ZW50XSwgcmVhc3NpZ24pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlX2V2ZW50KGVpZDogbnVtYmVyKTogQ2FsZW5kYXJFdmVudExpc3Qge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuZWlkICE9IGVpZCk7XG4gICAgICAgIHRoaXMuX2Z1bGxjYWxlbmRhci5nZXRFdmVudEJ5SWQoZWlkLnRvU3RyaW5nKCkpPy5yZW1vdmUoKVxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdldmVudHNMaXN0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRfZXZlbnRzKCkpKVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlX3N1YnN0YW5jZShtZXRob2Q6IHN0cmluZyk6IENhbGVuZGFyRXZlbnRMaXN0IHtcbiAgICAgICAgY29uc3QgcmVtb3ZlX2V2ZW50cyA9IHRoaXMuX2V2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBldmVudC50eXBlID09PSAndXNlJyAmJiAoZXZlbnQgYXMgVXNlRXZlbnQpLnByb3BlcnRpZXMubWV0aG9kID09PSBtZXRob2QpXG5cbiAgICAgICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+ICEoZXZlbnQudHlwZSA9PT0gJ3VzZScgJiYgKGV2ZW50IGFzIFVzZUV2ZW50KS5wcm9wZXJ0aWVzLm1ldGhvZCA9PT0gbWV0aG9kKSlcbiAgICAgICAgXG4gICAgICAgIHJlbW92ZV9ldmVudHMuZm9yRWFjaCgoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlX2V2ZW50KGV2ZW50LmVpZClcbiAgICAgICAgfSlcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXZlbnRzTGlzdCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0X2V2ZW50cygpKSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlX2dyb3VwKGdpZDogbnVtYmVyKTogQ2FsZW5kYXJFdmVudExpc3Qge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuZ2lkICE9IGdpZCk7XG5cbiAgICAgICAgdGhpcy5fZnVsbGNhbGVuZGFyLmdldEV2ZW50cygpLmZvckVhY2goXG4gICAgICAgICAgICAoZXZlbnQpID0+IHtpZiAoZXZlbnQuZ3JvdXBJZCA9PSBnaWQudG9TdHJpbmcoKSkgZXZlbnQucmVtb3ZlKCl9XG4gICAgICAgIClcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZXZlbnRzTGlzdCcsIEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0X2V2ZW50cygpKSlcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gSW1wb3J0IGV2ZW50cyBmcm9tIGFuIGFycmF5LlxuICAgIHB1YmxpYyBpbXBvcnRfZXZlbnRzKGV2ZW50czogQ2FsZW5kYXJFdmVudFtdLCByZWFzc2lnbj10cnVlKTogQ2FsZW5kYXJFdmVudExpc3Qge1xuXG4gICAgICAgIC8vIFByZXZlbnQgbm8tdXNlIGV2ZW50cyBiZWluZyBwbGFjZWQgb24gZGF0ZXMgd2l0aCBzdWJzdGFuY2UgdXNlIGV2ZW50c1xuICAgICAgICBjb25zdCBuZXdfbm9fdXNlID0gZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IE5vVXNlRXZlbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXZlbnQpKVxuICAgICAgICBsZXQgcmVsZXZhbnRfZXZlbnRzID0gdGhpcy5nZXRfZXZlbnRzKCkuZmlsdGVyKChldmVudCkgPT4gTm9Vc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihldmVudCkgfHwgVXNlRXZlbnQucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZXZlbnQpKVxuICAgICAgICByZWxldmFudF9ldmVudHMgPSByZWxldmFudF9ldmVudHMuY29uY2F0KGV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiBVc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihldmVudCkpKVxuICAgICAgICBjb25zdCBpbnZhbGlkX2RhdGVzID0gcmVsZXZhbnRfZXZlbnRzLm1hcCgoZXZlbnQpID0+IGV2ZW50LmRhdGUpXG5cbiAgICAgICAgY29uc3QgbmV3X3VzZSA9IGV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiBVc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihldmVudCkpXG4gICAgICAgIGNvbnN0IG5vX3VzZV9ldmVudHMgPSB0aGlzLmdldF9ldmVudHMoKS5maWx0ZXIoKGV2ZW50KSAgPT4gTm9Vc2VFdmVudC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihldmVudCkpXG4gICAgICAgIGNvbnN0IG5vX3VzZV9kYXRlcyA9IG5vX3VzZV9ldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQuZGF0ZSlcblxuICAgICAgICBuZXdfbm9fdXNlLmZvckVhY2goKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW52YWxpZF9kYXRlcy5pbmNsdWRlcyhldmVudC5kYXRlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50X2luZGV4ID0gZXZlbnRzLmluZGV4T2YoZXZlbnQpXG4gICAgICAgICAgICAgICAgZXZlbnRzLnNwbGljZShldmVudF9pbmRleCwgMSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBuZXdfdXNlLmZvckVhY2goKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobm9fdXNlX2RhdGVzLmluY2x1ZGVzKGV2ZW50LmRhdGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRfaW5kZXggPSBldmVudHMuaW5kZXhPZihldmVudClcbiAgICAgICAgICAgICAgICBldmVudHMuc3BsaWNlKGV2ZW50X2luZGV4LCAxKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIEdyb3VwIHJlbGF0aW9uc2hpcHMgbXVzdCBiZSBwcmVzZXJ2ZWQuXG4gICAgICAgIGNvbnN0IGdpZF9tYXBwaW5nID0gXG4gICAgICAgICAgICBldmVudHMucmVkdWNlKChhY2M6IE1hcDxudW1iZXIsIG51bWJlcj4sIGN1cjogQ2FsZW5kYXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXIuZ2lkID09IG51bGwpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V2ZW50IGlzIG1pc3NpbmcgYSBHSUQgYW5kIGNhbm5vdCBiZSBpbXBvcnRlZC4nKTtcblxuICAgICAgICAgICAgICAgIGlmICghYWNjLmhhcyhjdXIuZ2lkKSlcbiAgICAgICAgICAgICAgICAgICAgYWNjLnNldChjdXIuZ2lkLCB0aGlzLl9nZXRfbmV4dF9naWQoKSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCBuZXcgTWFwKCkpO1xuXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFxuICAgICAgICAgICAgdGhpcy5fZXZlbnRzLmNvbmNhdChldmVudHMubWFwKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVpZCA9IHRoaXMuX2dldF9uZXh0X2VpZCgpXG4gICAgICAgICAgICAgICAgY29uc3QgZ2lkID0gZ2lkX21hcHBpbmcuZ2V0KGV2ZW50LmdpZClcblxuICAgICAgICAgICAgICAgIC8vIEV2ZW50cyBjYW4gYmUgYXNzaWduZWQgYSBjb21wbGV0ZWx5IG5ldyBlaWQuXG4gICAgICAgICAgICAgICAgZXZlbnQuc2V0X2VpZChlaWQpO1xuICAgICAgICAgICAgICAgIGlmIChyZWFzc2lnbilcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBNYXAucHJvdG90eXBlLmdldCgpIGNhbiByZXR1cm4gdW5kZWZpbmVkLiBUaGF0IHNob3VsZG4ndCBoYXBwZW4gaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0X2dpZChnaWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbGNhbGVuZGFyLmFkZEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGV2ZW50LmVpZC50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICBncm91cElkOiBldmVudC5naWQudG9TdHJpbmcoKSxcblxuICAgICAgICAgICAgICAgICAgICBzdGFydDogZXZlbnQuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGV2ZW50LnRpdGxlLFxuXG4gICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogZXZlbnQuY29sb3JzWzFdLFxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGV2ZW50LmNvbG9yc1swXSxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGV2ZW50LmNvbG9yc1swXVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2ZW50c0xpc3QnLCBKU09OLnN0cmluZ2lmeSh0aGlzLmdldF9ldmVudHMoKSkpXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXJpYWxpemVfZXZlbnRzKGFzOiAnY3N2JyB8ICdqc29uJykge1xuICAgICAgICBzd2l0Y2ggKGFzKSB7XG4gICAgICAgICAgICBjYXNlICdjc3YnOlxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3M6IChzdHJpbmcgfCBudW1iZXIpW11bXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgW1wiRXZlbnRcIiwgXCJEYXRlXCIsIFwiVHlwZVwiLCBcImVJRFwiLCAnZ0lEJywgJ1RpdGxlJywgXCJDYXRlZ29yeVwiLCBcIlN1YnN0YW5jZVwiLCBcIk1ldGhvZFR5cGVcIiwgXCJNZXRob2RcIiwgXCJNZXRob2RPdGhlclwiLCBcIlRpbWVzXCIsIFxuICAgICAgICAgICAgICAgICAgICAgXCJBbW91bnRcIiwgXCJVbml0c1wiLCBcIlVuaXRzT3RoZXJcIiwgXCJOb3RlXCJdXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhcnJheSAocmVwcmVzZW50aW5nIHJvdykgZm9yIGVhY2ggZXZlbnRcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnRfY291bnQgPSAwXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRfZXZlbnRzKCkuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRfY291bnQrPTFcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRfcm93ID0gW2V2ZW50X2NvdW50LCBldmVudC5kYXRlLCBldmVudC50eXBlLCBldmVudC5laWQsIGV2ZW50LmdpZCwgZXZlbnQudGl0bGVdXG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ1c2VcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRfcHJvcGVydGllcyA9IChldmVudCBhcyBVc2VFdmVudCkucHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfcm93LnB1c2goZXZlbnRfcHJvcGVydGllcy5jYXRlZ29yeSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5ncyB3aXRoIGNvbW1hcyBjYXVzZSBlcnJvcnMgd2hlbiBjb252ZXJ0aW5nIHRvIGNzdlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50X3Byb3BlcnRpZXMuc3Vic3RhbmNlLmluY2x1ZGVzKFwiLFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3Jvdy5wdXNoKGV2ZW50X3Byb3BlcnRpZXMuc3Vic3RhbmNlLnJlcGxhY2UoXCIsXCIsIFwiLlwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfcm93LnB1c2goZXZlbnRfcHJvcGVydGllcy5zdWJzdGFuY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudF9yb3cucHVzaChldmVudF9wcm9wZXJ0aWVzLm1ldGhvZFR5cGUsIGV2ZW50X3Byb3BlcnRpZXMubWV0aG9kLCBldmVudF9wcm9wZXJ0aWVzLm1ldGhvZE90aGVyLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3Byb3BlcnRpZXMudGltZXMsIGV2ZW50X3Byb3BlcnRpZXMuYW1vdW50LCBldmVudF9wcm9wZXJ0aWVzLnVuaXRzLCBldmVudF9wcm9wZXJ0aWVzLnVuaXRzT3RoZXIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfcHJvcGVydGllcy5ub3RlKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcm93cy5wdXNoKGV2ZW50X3JvdylcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd3NcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIGNvbnN0IGpzb25fZXZlbnRzID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRfZXZlbnRzKCkpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW1pemVkX2V2ZW50cyA9IEpTT04ucGFyc2UoanNvbl9ldmVudHMpLm1hcCgoZXZlbnQ6IEpTT05FdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuX2RhdGUgPSAoZXZlbnQuX2RhdGUgYXMge19kYXRlOiBzdHJpbmd9KS5fZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpbWl6ZWRfZXZlbnRzXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKiB1dGlsLnRzXG4gKlxuICogTWlzY2VsbGFub3VzIGhlbHBlciBmdW5jdGlvbnNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQsIE1pY2hhZWwgUGFzY2FsZSA8bXBwYXNjYWxlQG1naC5oYXJ2YXJkLmVkdT5cbiAqIExhc3QgbW9kaWZpZWQ6IDIwMjMtMDctMjdcbiAqL1xuXG4vLyBTZXQgdGhlIElubmVyVGV4dCBvZiBhbiBlbGVtZW50LlxuZXhwb3J0IGZ1bmN0aW9uIHNldF9pbm5lcihpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfCBOb2RlTGlzdCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2VsZWN0IGVsZW1lbnQgIyR7aWR9LmApXG5cbiAgICBpZiAodGV4dCBpbnN0YW5jZW9mIE5vZGVMaXN0KVxuICAgICAgICB0ZXh0LmZvckVhY2goeCA9PiBlbGVtZW50LmFwcGVuZENoaWxkKHgpKTtcbiAgICBlbHNlXG4gICAgICAgIGVsZW1lbnQuaW5uZXJUZXh0ID0gdGV4dDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRfcGFyZW50X21vZGFsKGVsOiBFbGVtZW50KSB7XG4gICAgY29uc3QgbW9kYWwgPSBlbC5jbG9zZXN0KCcubW9kYWwnKTtcblxuICAgIGlmIChtb2RhbCA9PSBudWxsKVxuICAgICAgICB0aHJvdyBFcnJvcihgZmluZF9wYXJlbnRfbW9kYWw6IE5vIG1vZGFsIGZvdW5kIGluIGFuY2VzdHJ5IG9mICR7ZWx9LmApO1xuXG4gICAgcmV0dXJuIG1vZGFsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgaW50ZXJuYWxDb21tb24gPSByZXF1aXJlKCcuL2ludGVybmFsLWNvbW1vbi5janMnKTtcbnZhciBwcmVhY3QgPSByZXF1aXJlKCdwcmVhY3QnKTtcbnJlcXVpcmUoJ3ByZWFjdC9jb21wYXQnKTtcblxuY29uc3QgZ2xvYmFsTG9jYWxlcyA9IFtdO1xuXG5jb25zdCBNSU5JTUFMX1JBV19FTl9MT0NBTEUgPSB7XG4gICAgY29kZTogJ2VuJyxcbiAgICB3ZWVrOiB7XG4gICAgICAgIGRvdzogMCxcbiAgICAgICAgZG95OiA0LCAvLyA0IGRheXMgbmVlZCB0byBiZSB3aXRoaW4gdGhlIHllYXIgdG8gYmUgY29uc2lkZXJlZCB0aGUgZmlyc3Qgd2Vla1xuICAgIH0sXG4gICAgZGlyZWN0aW9uOiAnbHRyJyxcbiAgICBidXR0b25UZXh0OiB7XG4gICAgICAgIHByZXY6ICdwcmV2JyxcbiAgICAgICAgbmV4dDogJ25leHQnLFxuICAgICAgICBwcmV2WWVhcjogJ3ByZXYgeWVhcicsXG4gICAgICAgIG5leHRZZWFyOiAnbmV4dCB5ZWFyJyxcbiAgICAgICAgeWVhcjogJ3llYXInLFxuICAgICAgICB0b2RheTogJ3RvZGF5JyxcbiAgICAgICAgbW9udGg6ICdtb250aCcsXG4gICAgICAgIHdlZWs6ICd3ZWVrJyxcbiAgICAgICAgZGF5OiAnZGF5JyxcbiAgICAgICAgbGlzdDogJ2xpc3QnLFxuICAgIH0sXG4gICAgd2Vla1RleHQ6ICdXJyxcbiAgICB3ZWVrVGV4dExvbmc6ICdXZWVrJyxcbiAgICBjbG9zZUhpbnQ6ICdDbG9zZScsXG4gICAgdGltZUhpbnQ6ICdUaW1lJyxcbiAgICBldmVudEhpbnQ6ICdFdmVudCcsXG4gICAgYWxsRGF5VGV4dDogJ2FsbC1kYXknLFxuICAgIG1vcmVMaW5rVGV4dDogJ21vcmUnLFxuICAgIG5vRXZlbnRzVGV4dDogJ05vIGV2ZW50cyB0byBkaXNwbGF5Jyxcbn07XG5jb25zdCBSQVdfRU5fTE9DQUxFID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBNSU5JTUFMX1JBV19FTl9MT0NBTEUpLCB7IFxuICAgIC8vIEluY2x1ZGVzIHRoaW5ncyB3ZSBkb24ndCB3YW50IG90aGVyIGxvY2FsZXMgdG8gaW5oZXJpdCxcbiAgICAvLyB0aGluZ3MgdGhhdCBkZXJpdmUgZnJvbSBvdGhlciB0cmFuc2xhdGFibGUgc3RyaW5ncy5cbiAgICBidXR0b25IaW50czoge1xuICAgICAgICBwcmV2OiAnUHJldmlvdXMgJDAnLFxuICAgICAgICBuZXh0OiAnTmV4dCAkMCcsXG4gICAgICAgIHRvZGF5KGJ1dHRvblRleHQsIHVuaXQpIHtcbiAgICAgICAgICAgIHJldHVybiAodW5pdCA9PT0gJ2RheScpXG4gICAgICAgICAgICAgICAgPyAnVG9kYXknXG4gICAgICAgICAgICAgICAgOiBgVGhpcyAke2J1dHRvblRleHR9YDtcbiAgICAgICAgfSxcbiAgICB9LCB2aWV3SGludDogJyQwIHZpZXcnLCBuYXZMaW5rSGludDogJ0dvIHRvICQwJywgbW9yZUxpbmtIaW50KGV2ZW50Q250KSB7XG4gICAgICAgIHJldHVybiBgU2hvdyAke2V2ZW50Q250fSBtb3JlIGV2ZW50JHtldmVudENudCA9PT0gMSA/ICcnIDogJ3MnfWA7XG4gICAgfSB9KTtcbmZ1bmN0aW9uIG9yZ2FuaXplUmF3TG9jYWxlcyhleHBsaWNpdFJhd0xvY2FsZXMpIHtcbiAgICBsZXQgZGVmYXVsdENvZGUgPSBleHBsaWNpdFJhd0xvY2FsZXMubGVuZ3RoID4gMCA/IGV4cGxpY2l0UmF3TG9jYWxlc1swXS5jb2RlIDogJ2VuJztcbiAgICBsZXQgYWxsUmF3TG9jYWxlcyA9IGdsb2JhbExvY2FsZXMuY29uY2F0KGV4cGxpY2l0UmF3TG9jYWxlcyk7XG4gICAgbGV0IHJhd0xvY2FsZU1hcCA9IHtcbiAgICAgICAgZW46IFJBV19FTl9MT0NBTEUsXG4gICAgfTtcbiAgICBmb3IgKGxldCByYXdMb2NhbGUgb2YgYWxsUmF3TG9jYWxlcykge1xuICAgICAgICByYXdMb2NhbGVNYXBbcmF3TG9jYWxlLmNvZGVdID0gcmF3TG9jYWxlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBtYXA6IHJhd0xvY2FsZU1hcCxcbiAgICAgICAgZGVmYXVsdENvZGUsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkTG9jYWxlKGlucHV0U2luZ3VsYXIsIGF2YWlsYWJsZSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXRTaW5ndWxhciA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5wdXRTaW5ndWxhcikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlTG9jYWxlKGlucHV0U2luZ3VsYXIuY29kZSwgW2lucHV0U2luZ3VsYXIuY29kZV0sIGlucHV0U2luZ3VsYXIpO1xuICAgIH1cbiAgICByZXR1cm4gcXVlcnlMb2NhbGUoaW5wdXRTaW5ndWxhciwgYXZhaWxhYmxlKTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5TG9jYWxlKGNvZGVBcmcsIGF2YWlsYWJsZSkge1xuICAgIGxldCBjb2RlcyA9IFtdLmNvbmNhdChjb2RlQXJnIHx8IFtdKTsgLy8gd2lsbCBjb252ZXJ0IHRvIGFycmF5XG4gICAgbGV0IHJhdyA9IHF1ZXJ5UmF3TG9jYWxlKGNvZGVzLCBhdmFpbGFibGUpIHx8IFJBV19FTl9MT0NBTEU7XG4gICAgcmV0dXJuIHBhcnNlTG9jYWxlKGNvZGVBcmcsIGNvZGVzLCByYXcpO1xufVxuZnVuY3Rpb24gcXVlcnlSYXdMb2NhbGUoY29kZXMsIGF2YWlsYWJsZSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IHBhcnRzID0gY29kZXNbaV0udG9Mb2NhbGVMb3dlckNhc2UoKS5zcGxpdCgnLScpO1xuICAgICAgICBmb3IgKGxldCBqID0gcGFydHMubGVuZ3RoOyBqID4gMDsgaiAtPSAxKSB7XG4gICAgICAgICAgICBsZXQgc2ltcGxlSWQgPSBwYXJ0cy5zbGljZSgwLCBqKS5qb2luKCctJyk7XG4gICAgICAgICAgICBpZiAoYXZhaWxhYmxlW3NpbXBsZUlkXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVbc2ltcGxlSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcGFyc2VMb2NhbGUoY29kZUFyZywgY29kZXMsIHJhdykge1xuICAgIGxldCBtZXJnZWQgPSBpbnRlcm5hbENvbW1vbi5tZXJnZVByb3BzKFtNSU5JTUFMX1JBV19FTl9MT0NBTEUsIHJhd10sIFsnYnV0dG9uVGV4dCddKTtcbiAgICBkZWxldGUgbWVyZ2VkLmNvZGU7IC8vIGRvbid0IHdhbnQgdGhpcyBwYXJ0IG9mIHRoZSBvcHRpb25zXG4gICAgbGV0IHsgd2VlayB9ID0gbWVyZ2VkO1xuICAgIGRlbGV0ZSBtZXJnZWQud2VlaztcbiAgICByZXR1cm4ge1xuICAgICAgICBjb2RlQXJnLFxuICAgICAgICBjb2RlcyxcbiAgICAgICAgd2VlayxcbiAgICAgICAgc2ltcGxlTnVtYmVyRm9ybWF0OiBuZXcgSW50bC5OdW1iZXJGb3JtYXQoY29kZUFyZyksXG4gICAgICAgIG9wdGlvbnM6IG1lcmdlZCxcbiAgICB9O1xufVxuXG4vLyBUT0RPOiBlYXNpZXIgd2F5IHRvIGFkZCBuZXcgaG9va3M/IG5lZWQgdG8gdXBkYXRlIGEgbWlsbGlvbiB0aGluZ3NcbmZ1bmN0aW9uIGNyZWF0ZVBsdWdpbihpbnB1dCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBpbnRlcm5hbENvbW1vbi5ndWlkKCksXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIHByZW1pdW1SZWxlYXNlRGF0ZTogaW5wdXQucHJlbWl1bVJlbGVhc2VEYXRlID8gbmV3IERhdGUoaW5wdXQucHJlbWl1bVJlbGVhc2VEYXRlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGVwczogaW5wdXQuZGVwcyB8fCBbXSxcbiAgICAgICAgcmVkdWNlcnM6IGlucHV0LnJlZHVjZXJzIHx8IFtdLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogaW5wdXQuaXNMb2FkaW5nRnVuY3MgfHwgW10sXG4gICAgICAgIGNvbnRleHRJbml0OiBbXS5jb25jYXQoaW5wdXQuY29udGV4dEluaXQgfHwgW10pLFxuICAgICAgICBldmVudFJlZmluZXJzOiBpbnB1dC5ldmVudFJlZmluZXJzIHx8IHt9LFxuICAgICAgICBldmVudERlZk1lbWJlckFkZGVyczogaW5wdXQuZXZlbnREZWZNZW1iZXJBZGRlcnMgfHwgW10sXG4gICAgICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IGlucHV0LmV2ZW50U291cmNlUmVmaW5lcnMgfHwge30sXG4gICAgICAgIGlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzOiBpbnB1dC5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycyB8fCBbXSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IGlucHV0LmV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzIHx8IFtdLFxuICAgICAgICBldmVudERlZk11dGF0aW9uQXBwbGllcnM6IGlucHV0LmV2ZW50RGVmTXV0YXRpb25BcHBsaWVycyB8fCBbXSxcbiAgICAgICAgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczogaW5wdXQuZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycyB8fCBbXSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogaW5wdXQuZGF0ZVBvaW50VHJhbnNmb3JtcyB8fCBbXSxcbiAgICAgICAgZGF0ZVNwYW5UcmFuc2Zvcm1zOiBpbnB1dC5kYXRlU3BhblRyYW5zZm9ybXMgfHwgW10sXG4gICAgICAgIHZpZXdzOiBpbnB1dC52aWV3cyB8fCB7fSxcbiAgICAgICAgdmlld1Byb3BzVHJhbnNmb3JtZXJzOiBpbnB1dC52aWV3UHJvcHNUcmFuc2Zvcm1lcnMgfHwgW10sXG4gICAgICAgIGlzUHJvcHNWYWxpZDogaW5wdXQuaXNQcm9wc1ZhbGlkIHx8IG51bGwsXG4gICAgICAgIGV4dGVybmFsRGVmVHJhbnNmb3JtczogaW5wdXQuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zIHx8IFtdLFxuICAgICAgICB2aWV3Q29udGFpbmVyQXBwZW5kczogaW5wdXQudmlld0NvbnRhaW5lckFwcGVuZHMgfHwgW10sXG4gICAgICAgIGV2ZW50RHJvcFRyYW5zZm9ybWVyczogaW5wdXQuZXZlbnREcm9wVHJhbnNmb3JtZXJzIHx8IFtdLFxuICAgICAgICBjb21wb25lbnRJbnRlcmFjdGlvbnM6IGlucHV0LmNvbXBvbmVudEludGVyYWN0aW9ucyB8fCBbXSxcbiAgICAgICAgY2FsZW5kYXJJbnRlcmFjdGlvbnM6IGlucHV0LmNhbGVuZGFySW50ZXJhY3Rpb25zIHx8IFtdLFxuICAgICAgICB0aGVtZUNsYXNzZXM6IGlucHV0LnRoZW1lQ2xhc3NlcyB8fCB7fSxcbiAgICAgICAgZXZlbnRTb3VyY2VEZWZzOiBpbnB1dC5ldmVudFNvdXJjZURlZnMgfHwgW10sXG4gICAgICAgIGNtZEZvcm1hdHRlcjogaW5wdXQuY21kRm9ybWF0dGVyLFxuICAgICAgICByZWN1cnJpbmdUeXBlczogaW5wdXQucmVjdXJyaW5nVHlwZXMgfHwgW10sXG4gICAgICAgIG5hbWVkVGltZVpvbmVkSW1wbDogaW5wdXQubmFtZWRUaW1lWm9uZWRJbXBsLFxuICAgICAgICBpbml0aWFsVmlldzogaW5wdXQuaW5pdGlhbFZpZXcgfHwgJycsXG4gICAgICAgIGVsZW1lbnREcmFnZ2luZ0ltcGw6IGlucHV0LmVsZW1lbnREcmFnZ2luZ0ltcGwsXG4gICAgICAgIG9wdGlvbkNoYW5nZUhhbmRsZXJzOiBpbnB1dC5vcHRpb25DaGFuZ2VIYW5kbGVycyB8fCB7fSxcbiAgICAgICAgc2Nyb2xsR3JpZEltcGw6IGlucHV0LnNjcm9sbEdyaWRJbXBsIHx8IG51bGwsXG4gICAgICAgIGxpc3RlbmVyUmVmaW5lcnM6IGlucHV0Lmxpc3RlbmVyUmVmaW5lcnMgfHwge30sXG4gICAgICAgIG9wdGlvblJlZmluZXJzOiBpbnB1dC5vcHRpb25SZWZpbmVycyB8fCB7fSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiBpbnB1dC5wcm9wU2V0SGFuZGxlcnMgfHwge30sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luSG9va3MocGx1Z2luRGVmcywgZ2xvYmFsRGVmcykge1xuICAgIGxldCBjdXJyZW50UGx1Z2luSWRzID0ge307XG4gICAgbGV0IGhvb2tzID0ge1xuICAgICAgICBwcmVtaXVtUmVsZWFzZURhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVkdWNlcnM6IFtdLFxuICAgICAgICBpc0xvYWRpbmdGdW5jczogW10sXG4gICAgICAgIGNvbnRleHRJbml0OiBbXSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczoge30sXG4gICAgICAgIGV2ZW50RGVmTWVtYmVyQWRkZXJzOiBbXSxcbiAgICAgICAgZXZlbnRTb3VyY2VSZWZpbmVyczoge30sXG4gICAgICAgIGlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IFtdLFxuICAgICAgICBldmVudERlZk11dGF0aW9uQXBwbGllcnM6IFtdLFxuICAgICAgICBkYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogW10sXG4gICAgICAgIGRhdGVTcGFuVHJhbnNmb3JtczogW10sXG4gICAgICAgIHZpZXdzOiB7fSxcbiAgICAgICAgdmlld1Byb3BzVHJhbnNmb3JtZXJzOiBbXSxcbiAgICAgICAgaXNQcm9wc1ZhbGlkOiBudWxsLFxuICAgICAgICBleHRlcm5hbERlZlRyYW5zZm9ybXM6IFtdLFxuICAgICAgICB2aWV3Q29udGFpbmVyQXBwZW5kczogW10sXG4gICAgICAgIGV2ZW50RHJvcFRyYW5zZm9ybWVyczogW10sXG4gICAgICAgIGNvbXBvbmVudEludGVyYWN0aW9uczogW10sXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBbXSxcbiAgICAgICAgdGhlbWVDbGFzc2VzOiB7fSxcbiAgICAgICAgZXZlbnRTb3VyY2VEZWZzOiBbXSxcbiAgICAgICAgY21kRm9ybWF0dGVyOiBudWxsLFxuICAgICAgICByZWN1cnJpbmdUeXBlczogW10sXG4gICAgICAgIG5hbWVkVGltZVpvbmVkSW1wbDogbnVsbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6ICcnLFxuICAgICAgICBlbGVtZW50RHJhZ2dpbmdJbXBsOiBudWxsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczoge30sXG4gICAgICAgIHNjcm9sbEdyaWRJbXBsOiBudWxsLFxuICAgICAgICBsaXN0ZW5lclJlZmluZXJzOiB7fSxcbiAgICAgICAgb3B0aW9uUmVmaW5lcnM6IHt9LFxuICAgICAgICBwcm9wU2V0SGFuZGxlcnM6IHt9LFxuICAgIH07XG4gICAgZnVuY3Rpb24gYWRkRGVmcyhkZWZzKSB7XG4gICAgICAgIGZvciAobGV0IGRlZiBvZiBkZWZzKSB7XG4gICAgICAgICAgICBjb25zdCBwbHVnaW5OYW1lID0gZGVmLm5hbWU7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWQgPSBjdXJyZW50UGx1Z2luSWRzW3BsdWdpbk5hbWVdO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFBsdWdpbklkc1twbHVnaW5OYW1lXSA9IGRlZi5pZDtcbiAgICAgICAgICAgICAgICBhZGREZWZzKGRlZi5kZXBzKTtcbiAgICAgICAgICAgICAgICBob29rcyA9IGNvbWJpbmVIb29rcyhob29rcywgZGVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnRJZCAhPT0gZGVmLmlkKSB7XG4gICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IElEIHRoYW4gdGhlIG9uZSBhbHJlYWR5IGFkZGVkXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBEdXBsaWNhdGUgcGx1Z2luICcke3BsdWdpbk5hbWV9J2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwbHVnaW5EZWZzKSB7XG4gICAgICAgIGFkZERlZnMocGx1Z2luRGVmcyk7XG4gICAgfVxuICAgIGFkZERlZnMoZ2xvYmFsRGVmcyk7XG4gICAgcmV0dXJuIGhvb2tzO1xufVxuZnVuY3Rpb24gYnVpbGRCdWlsZFBsdWdpbkhvb2tzKCkge1xuICAgIGxldCBjdXJyZW50T3ZlcnJpZGVEZWZzID0gW107XG4gICAgbGV0IGN1cnJlbnRHbG9iYWxEZWZzID0gW107XG4gICAgbGV0IGN1cnJlbnRIb29rcztcbiAgICByZXR1cm4gKG92ZXJyaWRlRGVmcywgZ2xvYmFsRGVmcykgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnRIb29rcyB8fCAhaW50ZXJuYWxDb21tb24uaXNBcnJheXNFcXVhbChvdmVycmlkZURlZnMsIGN1cnJlbnRPdmVycmlkZURlZnMpIHx8ICFpbnRlcm5hbENvbW1vbi5pc0FycmF5c0VxdWFsKGdsb2JhbERlZnMsIGN1cnJlbnRHbG9iYWxEZWZzKSkge1xuICAgICAgICAgICAgY3VycmVudEhvb2tzID0gYnVpbGRQbHVnaW5Ib29rcyhvdmVycmlkZURlZnMsIGdsb2JhbERlZnMpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRPdmVycmlkZURlZnMgPSBvdmVycmlkZURlZnM7XG4gICAgICAgIGN1cnJlbnRHbG9iYWxEZWZzID0gZ2xvYmFsRGVmcztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRIb29rcztcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tYmluZUhvb2tzKGhvb2tzMCwgaG9va3MxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcHJlbWl1bVJlbGVhc2VEYXRlOiBjb21wYXJlT3B0aW9uYWxEYXRlcyhob29rczAucHJlbWl1bVJlbGVhc2VEYXRlLCBob29rczEucHJlbWl1bVJlbGVhc2VEYXRlKSxcbiAgICAgICAgcmVkdWNlcnM6IGhvb2tzMC5yZWR1Y2Vycy5jb25jYXQoaG9va3MxLnJlZHVjZXJzKSxcbiAgICAgICAgaXNMb2FkaW5nRnVuY3M6IGhvb2tzMC5pc0xvYWRpbmdGdW5jcy5jb25jYXQoaG9va3MxLmlzTG9hZGluZ0Z1bmNzKSxcbiAgICAgICAgY29udGV4dEluaXQ6IGhvb2tzMC5jb250ZXh0SW5pdC5jb25jYXQoaG9va3MxLmNvbnRleHRJbml0KSxcbiAgICAgICAgZXZlbnRSZWZpbmVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAuZXZlbnRSZWZpbmVycyksIGhvb2tzMS5ldmVudFJlZmluZXJzKSxcbiAgICAgICAgZXZlbnREZWZNZW1iZXJBZGRlcnM6IGhvb2tzMC5ldmVudERlZk1lbWJlckFkZGVycy5jb25jYXQoaG9va3MxLmV2ZW50RGVmTWVtYmVyQWRkZXJzKSxcbiAgICAgICAgZXZlbnRTb3VyY2VSZWZpbmVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAuZXZlbnRTb3VyY2VSZWZpbmVycyksIGhvb2tzMS5ldmVudFNvdXJjZVJlZmluZXJzKSxcbiAgICAgICAgaXNEcmFnZ2FibGVUcmFuc2Zvcm1lcnM6IGhvb2tzMC5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycy5jb25jYXQoaG9va3MxLmlzRHJhZ2dhYmxlVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZXZlbnREcmFnTXV0YXRpb25NYXNzYWdlcnM6IGhvb2tzMC5ldmVudERyYWdNdXRhdGlvbk1hc3NhZ2Vycy5jb25jYXQoaG9va3MxLmV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzKSxcbiAgICAgICAgZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzOiBob29rczAuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzLmNvbmNhdChob29rczEuZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzKSxcbiAgICAgICAgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVyczogaG9va3MwLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMuY29uY2F0KGhvb2tzMS5kYXRlU2VsZWN0aW9uVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgZGF0ZVBvaW50VHJhbnNmb3JtczogaG9va3MwLmRhdGVQb2ludFRyYW5zZm9ybXMuY29uY2F0KGhvb2tzMS5kYXRlUG9pbnRUcmFuc2Zvcm1zKSxcbiAgICAgICAgZGF0ZVNwYW5UcmFuc2Zvcm1zOiBob29rczAuZGF0ZVNwYW5UcmFuc2Zvcm1zLmNvbmNhdChob29rczEuZGF0ZVNwYW5UcmFuc2Zvcm1zKSxcbiAgICAgICAgdmlld3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLnZpZXdzKSwgaG9va3MxLnZpZXdzKSxcbiAgICAgICAgdmlld1Byb3BzVHJhbnNmb3JtZXJzOiBob29rczAudmlld1Byb3BzVHJhbnNmb3JtZXJzLmNvbmNhdChob29rczEudmlld1Byb3BzVHJhbnNmb3JtZXJzKSxcbiAgICAgICAgaXNQcm9wc1ZhbGlkOiBob29rczEuaXNQcm9wc1ZhbGlkIHx8IGhvb2tzMC5pc1Byb3BzVmFsaWQsXG4gICAgICAgIGV4dGVybmFsRGVmVHJhbnNmb3JtczogaG9va3MwLmV4dGVybmFsRGVmVHJhbnNmb3Jtcy5jb25jYXQoaG9va3MxLmV4dGVybmFsRGVmVHJhbnNmb3JtcyksXG4gICAgICAgIHZpZXdDb250YWluZXJBcHBlbmRzOiBob29rczAudmlld0NvbnRhaW5lckFwcGVuZHMuY29uY2F0KGhvb2tzMS52aWV3Q29udGFpbmVyQXBwZW5kcyksXG4gICAgICAgIGV2ZW50RHJvcFRyYW5zZm9ybWVyczogaG9va3MwLmV2ZW50RHJvcFRyYW5zZm9ybWVycy5jb25jYXQoaG9va3MxLmV2ZW50RHJvcFRyYW5zZm9ybWVycyksXG4gICAgICAgIGNhbGVuZGFySW50ZXJhY3Rpb25zOiBob29rczAuY2FsZW5kYXJJbnRlcmFjdGlvbnMuY29uY2F0KGhvb2tzMS5jYWxlbmRhckludGVyYWN0aW9ucyksXG4gICAgICAgIGNvbXBvbmVudEludGVyYWN0aW9uczogaG9va3MwLmNvbXBvbmVudEludGVyYWN0aW9ucy5jb25jYXQoaG9va3MxLmNvbXBvbmVudEludGVyYWN0aW9ucyksXG4gICAgICAgIHRoZW1lQ2xhc3NlczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAudGhlbWVDbGFzc2VzKSwgaG9va3MxLnRoZW1lQ2xhc3NlcyksXG4gICAgICAgIGV2ZW50U291cmNlRGVmczogaG9va3MwLmV2ZW50U291cmNlRGVmcy5jb25jYXQoaG9va3MxLmV2ZW50U291cmNlRGVmcyksXG4gICAgICAgIGNtZEZvcm1hdHRlcjogaG9va3MxLmNtZEZvcm1hdHRlciB8fCBob29rczAuY21kRm9ybWF0dGVyLFxuICAgICAgICByZWN1cnJpbmdUeXBlczogaG9va3MwLnJlY3VycmluZ1R5cGVzLmNvbmNhdChob29rczEucmVjdXJyaW5nVHlwZXMpLFxuICAgICAgICBuYW1lZFRpbWVab25lZEltcGw6IGhvb2tzMS5uYW1lZFRpbWVab25lZEltcGwgfHwgaG9va3MwLm5hbWVkVGltZVpvbmVkSW1wbCxcbiAgICAgICAgaW5pdGlhbFZpZXc6IGhvb2tzMC5pbml0aWFsVmlldyB8fCBob29rczEuaW5pdGlhbFZpZXcsXG4gICAgICAgIGVsZW1lbnREcmFnZ2luZ0ltcGw6IGhvb2tzMC5lbGVtZW50RHJhZ2dpbmdJbXBsIHx8IGhvb2tzMS5lbGVtZW50RHJhZ2dpbmdJbXBsLFxuICAgICAgICBvcHRpb25DaGFuZ2VIYW5kbGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLCBob29rczEub3B0aW9uQ2hhbmdlSGFuZGxlcnMpLFxuICAgICAgICBzY3JvbGxHcmlkSW1wbDogaG9va3MxLnNjcm9sbEdyaWRJbXBsIHx8IGhvb2tzMC5zY3JvbGxHcmlkSW1wbCxcbiAgICAgICAgbGlzdGVuZXJSZWZpbmVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBob29rczAubGlzdGVuZXJSZWZpbmVycyksIGhvb2tzMS5saXN0ZW5lclJlZmluZXJzKSxcbiAgICAgICAgb3B0aW9uUmVmaW5lcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaG9va3MwLm9wdGlvblJlZmluZXJzKSwgaG9va3MxLm9wdGlvblJlZmluZXJzKSxcbiAgICAgICAgcHJvcFNldEhhbmRsZXJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGhvb2tzMC5wcm9wU2V0SGFuZGxlcnMpLCBob29rczEucHJvcFNldEhhbmRsZXJzKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gY29tcGFyZU9wdGlvbmFsRGF0ZXMoZGF0ZTAsIGRhdGUxKSB7XG4gICAgaWYgKGRhdGUwID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRhdGUxO1xuICAgIH1cbiAgICBpZiAoZGF0ZTEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGF0ZTA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShNYXRoLm1heChkYXRlMC52YWx1ZU9mKCksIGRhdGUxLnZhbHVlT2YoKSkpO1xufVxuXG5jbGFzcyBTdGFuZGFyZFRoZW1lIGV4dGVuZHMgaW50ZXJuYWxDb21tb24uVGhlbWUge1xufVxuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuY2xhc3NlcyA9IHtcbiAgICByb290OiAnZmMtdGhlbWUtc3RhbmRhcmQnLFxuICAgIHRhYmxlQ2VsbFNoYWRlZDogJ2ZjLWNlbGwtc2hhZGVkJyxcbiAgICBidXR0b25Hcm91cDogJ2ZjLWJ1dHRvbi1ncm91cCcsXG4gICAgYnV0dG9uOiAnZmMtYnV0dG9uIGZjLWJ1dHRvbi1wcmltYXJ5JyxcbiAgICBidXR0b25BY3RpdmU6ICdmYy1idXR0b24tYWN0aXZlJyxcbn07XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5iYXNlSWNvbkNsYXNzID0gJ2ZjLWljb24nO1xuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUuaWNvbkNsYXNzZXMgPSB7XG4gICAgY2xvc2U6ICdmYy1pY29uLXgnLFxuICAgIHByZXY6ICdmYy1pY29uLWNoZXZyb24tbGVmdCcsXG4gICAgbmV4dDogJ2ZjLWljb24tY2hldnJvbi1yaWdodCcsXG4gICAgcHJldlllYXI6ICdmYy1pY29uLWNoZXZyb25zLWxlZnQnLFxuICAgIG5leHRZZWFyOiAnZmMtaWNvbi1jaGV2cm9ucy1yaWdodCcsXG59O1xuU3RhbmRhcmRUaGVtZS5wcm90b3R5cGUucnRsSWNvbkNsYXNzZXMgPSB7XG4gICAgcHJldjogJ2ZjLWljb24tY2hldnJvbi1yaWdodCcsXG4gICAgbmV4dDogJ2ZjLWljb24tY2hldnJvbi1sZWZ0JyxcbiAgICBwcmV2WWVhcjogJ2ZjLWljb24tY2hldnJvbnMtcmlnaHQnLFxuICAgIG5leHRZZWFyOiAnZmMtaWNvbi1jaGV2cm9ucy1sZWZ0Jyxcbn07XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5pY29uT3ZlcnJpZGVPcHRpb24gPSAnYnV0dG9uSWNvbnMnOyAvLyBUT0RPOiBtYWtlIFRTLWZyaWVuZGx5XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5pY29uT3ZlcnJpZGVDdXN0b21CdXR0b25PcHRpb24gPSAnaWNvbic7XG5TdGFuZGFyZFRoZW1lLnByb3RvdHlwZS5pY29uT3ZlcnJpZGVQcmVmaXggPSAnZmMtaWNvbi0nO1xuXG5mdW5jdGlvbiBjb21waWxlVmlld0RlZnMoZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncykge1xuICAgIGxldCBoYXNoID0ge307XG4gICAgbGV0IHZpZXdUeXBlO1xuICAgIGZvciAodmlld1R5cGUgaW4gZGVmYXVsdENvbmZpZ3MpIHtcbiAgICAgICAgZW5zdXJlVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgfVxuICAgIGZvciAodmlld1R5cGUgaW4gb3ZlcnJpZGVDb25maWdzKSB7XG4gICAgICAgIGVuc3VyZVZpZXdEZWYodmlld1R5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaDtcbn1cbmZ1bmN0aW9uIGVuc3VyZVZpZXdEZWYodmlld1R5cGUsIGhhc2gsIGRlZmF1bHRDb25maWdzLCBvdmVycmlkZUNvbmZpZ3MpIHtcbiAgICBpZiAoaGFzaFt2aWV3VHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIGhhc2hbdmlld1R5cGVdO1xuICAgIH1cbiAgICBsZXQgdmlld0RlZiA9IGJ1aWxkVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgaWYgKHZpZXdEZWYpIHtcbiAgICAgICAgaGFzaFt2aWV3VHlwZV0gPSB2aWV3RGVmO1xuICAgIH1cbiAgICByZXR1cm4gdmlld0RlZjtcbn1cbmZ1bmN0aW9uIGJ1aWxkVmlld0RlZih2aWV3VHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncykge1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0gZGVmYXVsdENvbmZpZ3Nbdmlld1R5cGVdO1xuICAgIGxldCBvdmVycmlkZUNvbmZpZyA9IG92ZXJyaWRlQ29uZmlnc1t2aWV3VHlwZV07XG4gICAgbGV0IHF1ZXJ5UHJvcCA9IChuYW1lKSA9PiAoKGRlZmF1bHRDb25maWcgJiYgZGVmYXVsdENvbmZpZ1tuYW1lXSAhPT0gbnVsbCkgPyBkZWZhdWx0Q29uZmlnW25hbWVdIDpcbiAgICAgICAgKChvdmVycmlkZUNvbmZpZyAmJiBvdmVycmlkZUNvbmZpZ1tuYW1lXSAhPT0gbnVsbCkgPyBvdmVycmlkZUNvbmZpZ1tuYW1lXSA6IG51bGwpKTtcbiAgICBsZXQgdGhlQ29tcG9uZW50ID0gcXVlcnlQcm9wKCdjb21wb25lbnQnKTtcbiAgICBsZXQgc3VwZXJUeXBlID0gcXVlcnlQcm9wKCdzdXBlclR5cGUnKTtcbiAgICBsZXQgc3VwZXJEZWYgPSBudWxsO1xuICAgIGlmIChzdXBlclR5cGUpIHtcbiAgICAgICAgaWYgKHN1cGVyVHlwZSA9PT0gdmlld1R5cGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBoYXZlIGEgY3VzdG9tIHZpZXcgdHlwZSB0aGF0IHJlZmVyZW5jZXMgaXRzZWxmJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXJEZWYgPSBlbnN1cmVWaWV3RGVmKHN1cGVyVHlwZSwgaGFzaCwgZGVmYXVsdENvbmZpZ3MsIG92ZXJyaWRlQ29uZmlncyk7XG4gICAgfVxuICAgIGlmICghdGhlQ29tcG9uZW50ICYmIHN1cGVyRGVmKSB7XG4gICAgICAgIHRoZUNvbXBvbmVudCA9IHN1cGVyRGVmLmNvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCF0aGVDb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHRocm93IGEgd2FybmluZywgbWlnaHQgYmUgc2V0dGluZ3MgZm9yIGEgc2luZ2xlLXVuaXQgdmlld1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB2aWV3VHlwZSxcbiAgICAgICAgY29tcG9uZW50OiB0aGVDb21wb25lbnQsXG4gICAgICAgIGRlZmF1bHRzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChzdXBlckRlZiA/IHN1cGVyRGVmLmRlZmF1bHRzIDoge30pKSwgKGRlZmF1bHRDb25maWcgPyBkZWZhdWx0Q29uZmlnLnJhd09wdGlvbnMgOiB7fSkpLFxuICAgICAgICBvdmVycmlkZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgKHN1cGVyRGVmID8gc3VwZXJEZWYub3ZlcnJpZGVzIDoge30pKSwgKG92ZXJyaWRlQ29uZmlnID8gb3ZlcnJpZGVDb25maWcucmF3T3B0aW9ucyA6IHt9KSksXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VWaWV3Q29uZmlncyhpbnB1dHMpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24ubWFwSGFzaChpbnB1dHMsIHBhcnNlVmlld0NvbmZpZyk7XG59XG5mdW5jdGlvbiBwYXJzZVZpZXdDb25maWcoaW5wdXQpIHtcbiAgICBsZXQgcmF3T3B0aW9ucyA9IHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgIHsgY29tcG9uZW50OiBpbnB1dCB9IDpcbiAgICAgICAgaW5wdXQ7XG4gICAgbGV0IHsgY29tcG9uZW50IH0gPSByYXdPcHRpb25zO1xuICAgIGlmIChyYXdPcHRpb25zLmNvbnRlbnQpIHtcbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIGNvbnRlbnQvY2xhc3NOYW1lcy9kaWRNb3VudC9ldGMgZnJvbSBvcHRpb25zP1xuICAgICAgICBjb21wb25lbnQgPSBjcmVhdGVWaWV3SG9va0NvbXBvbmVudChyYXdPcHRpb25zKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29tcG9uZW50ICYmICEoY29tcG9uZW50LnByb3RvdHlwZSBpbnN0YW5jZW9mIGludGVybmFsQ29tbW9uLkJhc2VDb21wb25lbnQpKSB7XG4gICAgICAgIC8vIFdIWT86IHBlb3BsZSB3ZXJlIHVzaW5nIGBjb21wb25lbnRgIHByb3BlcnR5IGZvciBgY29udGVudGBcbiAgICAgICAgLy8gVE9ETzogY29udmVyZ2Ugb24gb25lIHNldHRpbmcgbmFtZVxuICAgICAgICBjb21wb25lbnQgPSBjcmVhdGVWaWV3SG9va0NvbXBvbmVudChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJhd09wdGlvbnMpLCB7IGNvbnRlbnQ6IGNvbXBvbmVudCB9KSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1cGVyVHlwZTogcmF3T3B0aW9ucy50eXBlLFxuICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgcmF3T3B0aW9ucywgLy8gaW5jbHVkZXMgdHlwZSBhbmQgY29tcG9uZW50IHRvbyA6KFxuICAgIH07XG59XG5mdW5jdGlvbiBjcmVhdGVWaWV3SG9va0NvbXBvbmVudChvcHRpb25zKSB7XG4gICAgcmV0dXJuICh2aWV3UHJvcHMpID0+IChwcmVhY3QuY3JlYXRlRWxlbWVudChpbnRlcm5hbENvbW1vbi5WaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIChjb250ZXh0KSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxDb21tb24uQ29udGVudENvbnRhaW5lciwgeyBlbFRhZzogXCJkaXZcIiwgZWxDbGFzc2VzOiBpbnRlcm5hbENvbW1vbi5idWlsZFZpZXdDbGFzc05hbWVzKGNvbnRleHQudmlld1NwZWMpLCByZW5kZXJQcm9wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB2aWV3UHJvcHMpLCB7IG5leHREYXlUaHJlc2hvbGQ6IGNvbnRleHQub3B0aW9ucy5uZXh0RGF5VGhyZXNob2xkIH0pLCBnZW5lcmF0b3JOYW1lOiB1bmRlZmluZWQsIGN1c3RvbUdlbmVyYXRvcjogb3B0aW9ucy5jb250ZW50LCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMuY2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMuZGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLndpbGxVbm1vdW50IH0pKSkpO1xufVxuXG5mdW5jdGlvbiBidWlsZFZpZXdTcGVjcyhkZWZhdWx0SW5wdXRzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGxvY2FsZURlZmF1bHRzKSB7XG4gICAgbGV0IGRlZmF1bHRDb25maWdzID0gcGFyc2VWaWV3Q29uZmlncyhkZWZhdWx0SW5wdXRzKTtcbiAgICBsZXQgb3ZlcnJpZGVDb25maWdzID0gcGFyc2VWaWV3Q29uZmlncyhvcHRpb25PdmVycmlkZXMudmlld3MpO1xuICAgIGxldCB2aWV3RGVmcyA9IGNvbXBpbGVWaWV3RGVmcyhkZWZhdWx0Q29uZmlncywgb3ZlcnJpZGVDb25maWdzKTtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24ubWFwSGFzaCh2aWV3RGVmcywgKHZpZXdEZWYpID0+IGJ1aWxkVmlld1NwZWModmlld0RlZiwgb3ZlcnJpZGVDb25maWdzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGxvY2FsZURlZmF1bHRzKSk7XG59XG5mdW5jdGlvbiBidWlsZFZpZXdTcGVjKHZpZXdEZWYsIG92ZXJyaWRlQ29uZmlncywgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBsb2NhbGVEZWZhdWx0cykge1xuICAgIGxldCBkdXJhdGlvbklucHV0ID0gdmlld0RlZi5vdmVycmlkZXMuZHVyYXRpb24gfHxcbiAgICAgICAgdmlld0RlZi5kZWZhdWx0cy5kdXJhdGlvbiB8fFxuICAgICAgICBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLmR1cmF0aW9uIHx8XG4gICAgICAgIG9wdGlvbk92ZXJyaWRlcy5kdXJhdGlvbjtcbiAgICBsZXQgZHVyYXRpb24gPSBudWxsO1xuICAgIGxldCBkdXJhdGlvblVuaXQgPSAnJztcbiAgICBsZXQgc2luZ2xlVW5pdCA9ICcnO1xuICAgIGxldCBzaW5nbGVVbml0T3ZlcnJpZGVzID0ge307XG4gICAgaWYgKGR1cmF0aW9uSW5wdXQpIHtcbiAgICAgICAgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbkNhY2hlZChkdXJhdGlvbklucHV0KTtcbiAgICAgICAgaWYgKGR1cmF0aW9uKSB7IC8vIHZhbGlkP1xuICAgICAgICAgICAgbGV0IGRlbm9tID0gaW50ZXJuYWxDb21tb24uZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yKGR1cmF0aW9uKTtcbiAgICAgICAgICAgIGR1cmF0aW9uVW5pdCA9IGRlbm9tLnVuaXQ7XG4gICAgICAgICAgICBpZiAoZGVub20udmFsdWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBzaW5nbGVVbml0ID0gZHVyYXRpb25Vbml0O1xuICAgICAgICAgICAgICAgIHNpbmdsZVVuaXRPdmVycmlkZXMgPSBvdmVycmlkZUNvbmZpZ3NbZHVyYXRpb25Vbml0XSA/IG92ZXJyaWRlQ29uZmlnc1tkdXJhdGlvblVuaXRdLnJhd09wdGlvbnMgOiB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgcXVlcnlCdXR0b25UZXh0ID0gKG9wdGlvbnNTdWJzZXQpID0+IHtcbiAgICAgICAgbGV0IGJ1dHRvblRleHRNYXAgPSBvcHRpb25zU3Vic2V0LmJ1dHRvblRleHQgfHwge307XG4gICAgICAgIGxldCBidXR0b25UZXh0S2V5ID0gdmlld0RlZi5kZWZhdWx0cy5idXR0b25UZXh0S2V5O1xuICAgICAgICBpZiAoYnV0dG9uVGV4dEtleSAhPSBudWxsICYmIGJ1dHRvblRleHRNYXBbYnV0dG9uVGV4dEtleV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvblRleHRNYXBbYnV0dG9uVGV4dEtleV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvblRleHRNYXBbdmlld0RlZi50eXBlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uVGV4dE1hcFt2aWV3RGVmLnR5cGVdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25UZXh0TWFwW3NpbmdsZVVuaXRdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBidXR0b25UZXh0TWFwW3NpbmdsZVVuaXRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgbGV0IHF1ZXJ5QnV0dG9uVGl0bGUgPSAob3B0aW9uc1N1YnNldCkgPT4ge1xuICAgICAgICBsZXQgYnV0dG9uSGludHMgPSBvcHRpb25zU3Vic2V0LmJ1dHRvbkhpbnRzIHx8IHt9O1xuICAgICAgICBsZXQgYnV0dG9uS2V5ID0gdmlld0RlZi5kZWZhdWx0cy5idXR0b25UZXh0S2V5OyAvLyB1c2Ugc2FtZSBrZXkgYXMgdGV4dFxuICAgICAgICBpZiAoYnV0dG9uS2V5ICE9IG51bGwgJiYgYnV0dG9uSGludHNbYnV0dG9uS2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uSGludHNbYnV0dG9uS2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9uSGludHNbdmlld0RlZi50eXBlXSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYnV0dG9uSGludHNbdmlld0RlZi50eXBlXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9uSGludHNbc2luZ2xlVW5pdF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbkhpbnRzW3NpbmdsZVVuaXRdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogdmlld0RlZi50eXBlLFxuICAgICAgICBjb21wb25lbnQ6IHZpZXdEZWYuY29tcG9uZW50LFxuICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgZHVyYXRpb25Vbml0LFxuICAgICAgICBzaW5nbGVVbml0LFxuICAgICAgICBvcHRpb25EZWZhdWx0czogdmlld0RlZi5kZWZhdWx0cyxcbiAgICAgICAgb3B0aW9uT3ZlcnJpZGVzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNpbmdsZVVuaXRPdmVycmlkZXMpLCB2aWV3RGVmLm92ZXJyaWRlcyksXG4gICAgICAgIGJ1dHRvblRleHRPdmVycmlkZTogcXVlcnlCdXR0b25UZXh0KGR5bmFtaWNPcHRpb25PdmVycmlkZXMpIHx8XG4gICAgICAgICAgICBxdWVyeUJ1dHRvblRleHQob3B0aW9uT3ZlcnJpZGVzKSB8fCAvLyBjb25zdHJ1Y3Rvci1zcGVjaWZpZWQgYnV0dG9uVGV4dCBsb29rdXAgaGFzaCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICB2aWV3RGVmLm92ZXJyaWRlcy5idXR0b25UZXh0LFxuICAgICAgICBidXR0b25UZXh0RGVmYXVsdDogcXVlcnlCdXR0b25UZXh0KGxvY2FsZURlZmF1bHRzKSB8fFxuICAgICAgICAgICAgdmlld0RlZi5kZWZhdWx0cy5idXR0b25UZXh0IHx8XG4gICAgICAgICAgICBxdWVyeUJ1dHRvblRleHQoaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFMpIHx8XG4gICAgICAgICAgICB2aWV3RGVmLnR5cGUsXG4gICAgICAgIC8vIG5vdCBEUllcbiAgICAgICAgYnV0dG9uVGl0bGVPdmVycmlkZTogcXVlcnlCdXR0b25UaXRsZShkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB8fFxuICAgICAgICAgICAgcXVlcnlCdXR0b25UaXRsZShvcHRpb25PdmVycmlkZXMpIHx8XG4gICAgICAgICAgICB2aWV3RGVmLm92ZXJyaWRlcy5idXR0b25IaW50LFxuICAgICAgICBidXR0b25UaXRsZURlZmF1bHQ6IHF1ZXJ5QnV0dG9uVGl0bGUobG9jYWxlRGVmYXVsdHMpIHx8XG4gICAgICAgICAgICB2aWV3RGVmLmRlZmF1bHRzLmJ1dHRvbkhpbnQgfHxcbiAgICAgICAgICAgIHF1ZXJ5QnV0dG9uVGl0bGUoaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFMpLFxuICAgICAgICAvLyB3aWxsIGV2ZW50dWFsbHkgZmFsbCBiYWNrIHRvIGJ1dHRvblRleHRcbiAgICB9O1xufVxuLy8gaGFjayB0byBnZXQgbWVtb2l6YXRpb24gd29ya2luZ1xubGV0IGR1cmF0aW9uSW5wdXRNYXAgPSB7fTtcbmZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uQ2FjaGVkKGR1cmF0aW9uSW5wdXQpIHtcbiAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KGR1cmF0aW9uSW5wdXQpO1xuICAgIGxldCByZXMgPSBkdXJhdGlvbklucHV0TWFwW2pzb25dO1xuICAgIGlmIChyZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXMgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVEdXJhdGlvbihkdXJhdGlvbklucHV0KTtcbiAgICAgICAgZHVyYXRpb25JbnB1dE1hcFtqc29uXSA9IHJlcztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gcmVkdWNlVmlld1R5cGUodmlld1R5cGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICB2aWV3VHlwZSA9IGFjdGlvbi52aWV3VHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdUeXBlO1xufVxuXG5mdW5jdGlvbiByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnU0VUX09QVElPTic6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSwgeyBbYWN0aW9uLm9wdGlvbk5hbWVdOiBhY3Rpb24ucmF3T3B0aW9uVmFsdWUgfSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pY09wdGlvbk92ZXJyaWRlcztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJlZHVjZURhdGVQcm9maWxlKGN1cnJlbnREYXRlUHJvZmlsZSwgYWN0aW9uLCBjdXJyZW50RGF0ZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IpIHtcbiAgICBsZXQgZHA7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIHJldHVybiBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZChhY3Rpb24uZGF0ZU1hcmtlciB8fCBjdXJyZW50RGF0ZSk7XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9EQVRFJzpcbiAgICAgICAgICAgIHJldHVybiBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZChhY3Rpb24uZGF0ZU1hcmtlcik7XG4gICAgICAgIGNhc2UgJ1BSRVYnOlxuICAgICAgICAgICAgZHAgPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZFByZXYoY3VycmVudERhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSk7XG4gICAgICAgICAgICBpZiAoZHAuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgICAgIGRwID0gZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGROZXh0KGN1cnJlbnREYXRlUHJvZmlsZSwgY3VycmVudERhdGUpO1xuICAgICAgICAgICAgaWYgKGRwLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnREYXRlUHJvZmlsZTtcbn1cblxuZnVuY3Rpb24gaW5pdEV2ZW50U291cmNlcyhjYWxlbmRhck9wdGlvbnMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgbGV0IGFjdGl2ZVJhbmdlID0gZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGw7XG4gICAgcmV0dXJuIGFkZFNvdXJjZXMoe30sIHBhcnNlSW5pdGlhbFNvdXJjZXMoY2FsZW5kYXJPcHRpb25zLCBjb250ZXh0KSwgYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gcmVkdWNlRXZlbnRTb3VyY2VzKGV2ZW50U291cmNlcywgYWN0aW9uLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGxldCBhY3RpdmVSYW5nZSA9IGRhdGVQcm9maWxlID8gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UgOiBudWxsOyAvLyBuZWVkIHRoaXMgY2hlY2s/XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdBRERfRVZFTlRfU09VUkNFUyc6IC8vIGFscmVhZHkgcGFyc2VkXG4gICAgICAgICAgICByZXR1cm4gYWRkU291cmNlcyhldmVudFNvdXJjZXMsIGFjdGlvbi5zb3VyY2VzLCBhY3RpdmVSYW5nZSwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9FVkVOVF9TT1VSQ0UnOlxuICAgICAgICAgICAgcmV0dXJuIHJlbW92ZVNvdXJjZShldmVudFNvdXJjZXMsIGFjdGlvbi5zb3VyY2VJZCk7XG4gICAgICAgIGNhc2UgJ1BSRVYnOiAvLyBUT0RPOiBob3cgZG8gd2UgdHJhY2sgYWxsIGFjdGlvbnMgdGhhdCBhZmZlY3QgZGF0ZVByb2ZpbGUgOihcbiAgICAgICAgY2FzZSAnTkVYVCc6XG4gICAgICAgIGNhc2UgJ0NIQU5HRV9EQVRFJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX1ZJRVdfVFlQRSc6XG4gICAgICAgICAgICBpZiAoZGF0ZVByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hEaXJ0eVNvdXJjZXMoZXZlbnRTb3VyY2VzLCBhY3RpdmVSYW5nZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZXZlbnRTb3VyY2VzO1xuICAgICAgICBjYXNlICdGRVRDSF9FVkVOVF9TT1VSQ0VTJzpcbiAgICAgICAgICAgIHJldHVybiBmZXRjaFNvdXJjZXNCeUlkcyhldmVudFNvdXJjZXMsIGFjdGlvbi5zb3VyY2VJZHMgPyAvLyB3aHkgbm8gdHlwZT9cbiAgICAgICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5hcnJheVRvSGFzaChhY3Rpb24uc291cmNlSWRzKSA6XG4gICAgICAgICAgICAgICAgZXhjbHVkZVN0YXRpY1NvdXJjZXMoZXZlbnRTb3VyY2VzLCBjb250ZXh0KSwgYWN0aXZlUmFuZ2UsIGFjdGlvbi5pc1JlZmV0Y2ggfHwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRUNFSVZFX0VWRU5UUyc6XG4gICAgICAgIGNhc2UgJ1JFQ0VJVkVfRVZFTlRfRVJST1InOlxuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVSZXNwb25zZShldmVudFNvdXJjZXMsIGFjdGlvbi5zb3VyY2VJZCwgYWN0aW9uLmZldGNoSWQsIGFjdGlvbi5mZXRjaFJhbmdlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0FMTF9FVkVOVF9TT1VSQ0VTJzpcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBldmVudFNvdXJjZXM7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVkdWNlRXZlbnRTb3VyY2VzTmV3VGltZVpvbmUoZXZlbnRTb3VyY2VzLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGxldCBhY3RpdmVSYW5nZSA9IGRhdGVQcm9maWxlID8gZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UgOiBudWxsOyAvLyBuZWVkIHRoaXMgY2hlY2s/XG4gICAgcmV0dXJuIGZldGNoU291cmNlc0J5SWRzKGV2ZW50U291cmNlcywgZXhjbHVkZVN0YXRpY1NvdXJjZXMoZXZlbnRTb3VyY2VzLCBjb250ZXh0KSwgYWN0aXZlUmFuZ2UsIHRydWUsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmcoZXZlbnRTb3VyY2VzKSB7XG4gICAgZm9yIChsZXQgc291cmNlSWQgaW4gZXZlbnRTb3VyY2VzKSB7XG4gICAgICAgIGlmIChldmVudFNvdXJjZXNbc291cmNlSWRdLmlzRmV0Y2hpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGFkZFNvdXJjZXMoZXZlbnRTb3VyY2VIYXNoLCBzb3VyY2VzLCBmZXRjaFJhbmdlLCBjb250ZXh0KSB7XG4gICAgbGV0IGhhc2ggPSB7fTtcbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICBoYXNoW3NvdXJjZS5zb3VyY2VJZF0gPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgIGhhc2ggPSBmZXRjaERpcnR5U291cmNlcyhoYXNoLCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRTb3VyY2VIYXNoKSwgaGFzaCk7XG59XG5mdW5jdGlvbiByZW1vdmVTb3VyY2UoZXZlbnRTb3VyY2VIYXNoLCBzb3VyY2VJZCkge1xuICAgIHJldHVybiBpbnRlcm5hbENvbW1vbi5maWx0ZXJIYXNoKGV2ZW50U291cmNlSGFzaCwgKGV2ZW50U291cmNlKSA9PiBldmVudFNvdXJjZS5zb3VyY2VJZCAhPT0gc291cmNlSWQpO1xufVxuZnVuY3Rpb24gZmV0Y2hEaXJ0eVNvdXJjZXMoc291cmNlSGFzaCwgZmV0Y2hSYW5nZSwgY29udGV4dCkge1xuICAgIHJldHVybiBmZXRjaFNvdXJjZXNCeUlkcyhzb3VyY2VIYXNoLCBpbnRlcm5hbENvbW1vbi5maWx0ZXJIYXNoKHNvdXJjZUhhc2gsIChldmVudFNvdXJjZSkgPT4gaXNTb3VyY2VEaXJ0eShldmVudFNvdXJjZSwgZmV0Y2hSYW5nZSwgY29udGV4dCkpLCBmZXRjaFJhbmdlLCBmYWxzZSwgY29udGV4dCk7XG59XG5mdW5jdGlvbiBpc1NvdXJjZURpcnR5KGV2ZW50U291cmNlLCBmZXRjaFJhbmdlLCBjb250ZXh0KSB7XG4gICAgaWYgKCFkb2VzU291cmNlTmVlZFJhbmdlKGV2ZW50U291cmNlLCBjb250ZXh0KSkge1xuICAgICAgICByZXR1cm4gIWV2ZW50U291cmNlLmxhdGVzdEZldGNoSWQ7XG4gICAgfVxuICAgIHJldHVybiAhY29udGV4dC5vcHRpb25zLmxhenlGZXRjaGluZyB8fFxuICAgICAgICAhZXZlbnRTb3VyY2UuZmV0Y2hSYW5nZSB8fFxuICAgICAgICBldmVudFNvdXJjZS5pc0ZldGNoaW5nIHx8IC8vIGFsd2F5cyBjYW5jZWwgb3V0ZGF0ZWQgaW4tcHJvZ3Jlc3MgZmV0Y2hlc1xuICAgICAgICBmZXRjaFJhbmdlLnN0YXJ0IDwgZXZlbnRTb3VyY2UuZmV0Y2hSYW5nZS5zdGFydCB8fFxuICAgICAgICBmZXRjaFJhbmdlLmVuZCA+IGV2ZW50U291cmNlLmZldGNoUmFuZ2UuZW5kO1xufVxuZnVuY3Rpb24gZmV0Y2hTb3VyY2VzQnlJZHMocHJldlNvdXJjZXMsIHNvdXJjZUlkSGFzaCwgZmV0Y2hSYW5nZSwgaXNSZWZldGNoLCBjb250ZXh0KSB7XG4gICAgbGV0IG5leHRTb3VyY2VzID0ge307XG4gICAgZm9yIChsZXQgc291cmNlSWQgaW4gcHJldlNvdXJjZXMpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHByZXZTb3VyY2VzW3NvdXJjZUlkXTtcbiAgICAgICAgaWYgKHNvdXJjZUlkSGFzaFtzb3VyY2VJZF0pIHtcbiAgICAgICAgICAgIG5leHRTb3VyY2VzW3NvdXJjZUlkXSA9IGZldGNoU291cmNlKHNvdXJjZSwgZmV0Y2hSYW5nZSwgaXNSZWZldGNoLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG5leHRTb3VyY2VzW3NvdXJjZUlkXSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV4dFNvdXJjZXM7XG59XG5mdW5jdGlvbiBmZXRjaFNvdXJjZShldmVudFNvdXJjZSwgZmV0Y2hSYW5nZSwgaXNSZWZldGNoLCBjb250ZXh0KSB7XG4gICAgbGV0IHsgb3B0aW9ucywgY2FsZW5kYXJBcGkgfSA9IGNvbnRleHQ7XG4gICAgbGV0IHNvdXJjZURlZiA9IGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VEZWZzW2V2ZW50U291cmNlLnNvdXJjZURlZklkXTtcbiAgICBsZXQgZmV0Y2hJZCA9IGludGVybmFsQ29tbW9uLmd1aWQoKTtcbiAgICBzb3VyY2VEZWYuZmV0Y2goe1xuICAgICAgICBldmVudFNvdXJjZSxcbiAgICAgICAgcmFuZ2U6IGZldGNoUmFuZ2UsXG4gICAgICAgIGlzUmVmZXRjaCxcbiAgICAgICAgY29udGV4dCxcbiAgICB9LCAocmVzKSA9PiB7XG4gICAgICAgIGxldCB7IHJhd0V2ZW50cyB9ID0gcmVzO1xuICAgICAgICBpZiAob3B0aW9ucy5ldmVudFNvdXJjZVN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJhd0V2ZW50cyA9IG9wdGlvbnMuZXZlbnRTb3VyY2VTdWNjZXNzLmNhbGwoY2FsZW5kYXJBcGksIHJhd0V2ZW50cywgcmVzLnJlc3BvbnNlKSB8fCByYXdFdmVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJhd0V2ZW50cyA9IGV2ZW50U291cmNlLnN1Y2Nlc3MuY2FsbChjYWxlbmRhckFwaSwgcmF3RXZlbnRzLCByZXMucmVzcG9uc2UpIHx8IHJhd0V2ZW50cztcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdSRUNFSVZFX0VWRU5UUycsXG4gICAgICAgICAgICBzb3VyY2VJZDogZXZlbnRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgICAgICBmZXRjaElkLFxuICAgICAgICAgICAgZmV0Y2hSYW5nZSxcbiAgICAgICAgICAgIHJhd0V2ZW50cyxcbiAgICAgICAgfSk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGxldCBlcnJvckhhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZXZlbnRTb3VyY2VGYWlsdXJlKSB7XG4gICAgICAgICAgICBvcHRpb25zLmV2ZW50U291cmNlRmFpbHVyZS5jYWxsKGNhbGVuZGFyQXBpLCBlcnJvcik7XG4gICAgICAgICAgICBlcnJvckhhbmRsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5mYWlsdXJlKSB7XG4gICAgICAgICAgICBldmVudFNvdXJjZS5mYWlsdXJlKGVycm9yKTtcbiAgICAgICAgICAgIGVycm9ySGFuZGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlcnJvckhhbmRsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5tZXNzYWdlLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVDRUlWRV9FVkVOVF9FUlJPUicsXG4gICAgICAgICAgICBzb3VyY2VJZDogZXZlbnRTb3VyY2Uuc291cmNlSWQsXG4gICAgICAgICAgICBmZXRjaElkLFxuICAgICAgICAgICAgZmV0Y2hSYW5nZSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudFNvdXJjZSksIHsgaXNGZXRjaGluZzogdHJ1ZSwgbGF0ZXN0RmV0Y2hJZDogZmV0Y2hJZCB9KTtcbn1cbmZ1bmN0aW9uIHJlY2VpdmVSZXNwb25zZShzb3VyY2VIYXNoLCBzb3VyY2VJZCwgZmV0Y2hJZCwgZmV0Y2hSYW5nZSkge1xuICAgIGxldCBldmVudFNvdXJjZSA9IHNvdXJjZUhhc2hbc291cmNlSWRdO1xuICAgIGlmIChldmVudFNvdXJjZSAmJiAvLyBub3QgYWxyZWFkeSByZW1vdmVkXG4gICAgICAgIGZldGNoSWQgPT09IGV2ZW50U291cmNlLmxhdGVzdEZldGNoSWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc291cmNlSGFzaCksIHsgW3NvdXJjZUlkXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudFNvdXJjZSksIHsgaXNGZXRjaGluZzogZmFsc2UsIGZldGNoUmFuZ2UgfSkgfSk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VIYXNoO1xufVxuZnVuY3Rpb24gZXhjbHVkZVN0YXRpY1NvdXJjZXMoZXZlbnRTb3VyY2VzLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIGludGVybmFsQ29tbW9uLmZpbHRlckhhc2goZXZlbnRTb3VyY2VzLCAoZXZlbnRTb3VyY2UpID0+IGRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpKTtcbn1cbmZ1bmN0aW9uIHBhcnNlSW5pdGlhbFNvdXJjZXMocmF3T3B0aW9ucywgY29udGV4dCkge1xuICAgIGxldCByZWZpbmVycyA9IGludGVybmFsQ29tbW9uLmJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyhjb250ZXh0KTtcbiAgICBsZXQgcmF3U291cmNlcyA9IFtdLmNvbmNhdChyYXdPcHRpb25zLmV2ZW50U291cmNlcyB8fCBbXSk7XG4gICAgbGV0IHNvdXJjZXMgPSBbXTsgLy8gcGFyc2VkXG4gICAgaWYgKHJhd09wdGlvbnMuaW5pdGlhbEV2ZW50cykge1xuICAgICAgICByYXdTb3VyY2VzLnVuc2hpZnQocmF3T3B0aW9ucy5pbml0aWFsRXZlbnRzKTtcbiAgICB9XG4gICAgaWYgKHJhd09wdGlvbnMuZXZlbnRzKSB7XG4gICAgICAgIHJhd1NvdXJjZXMudW5zaGlmdChyYXdPcHRpb25zLmV2ZW50cyk7XG4gICAgfVxuICAgIGZvciAobGV0IHJhd1NvdXJjZSBvZiByYXdTb3VyY2VzKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBpbnRlcm5hbENvbW1vbi5wYXJzZUV2ZW50U291cmNlKHJhd1NvdXJjZSwgY29udGV4dCwgcmVmaW5lcnMpO1xuICAgICAgICBpZiAoc291cmNlKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbn1cbmZ1bmN0aW9uIGRvZXNTb3VyY2VOZWVkUmFuZ2UoZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICBsZXQgZGVmcyA9IGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VEZWZzO1xuICAgIHJldHVybiAhZGVmc1tldmVudFNvdXJjZS5zb3VyY2VEZWZJZF0uaWdub3JlUmFuZ2U7XG59XG5cbmZ1bmN0aW9uIHJlZHVjZURhdGVTZWxlY3Rpb24oY3VycmVudFNlbGVjdGlvbiwgYWN0aW9uKSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdVTlNFTEVDVF9EQVRFUyc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnU0VMRUNUX0RBVEVTJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uc2VsZWN0aW9uO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb247XG4gICAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2VTZWxlY3RlZEV2ZW50KGN1cnJlbnRJbnN0YW5jZUlkLCBhY3Rpb24pIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1VOU0VMRUNUX0VWRU5UJzpcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgY2FzZSAnU0VMRUNUX0VWRU5UJzpcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZXZlbnRJbnN0YW5jZUlkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbnN0YW5jZUlkO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlRXZlbnREcmFnKGN1cnJlbnREcmFnLCBhY3Rpb24pIHtcbiAgICBsZXQgbmV3RHJhZztcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1VOU0VUX0VWRU5UX0RSQUcnOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgJ1NFVF9FVkVOVF9EUkFHJzpcbiAgICAgICAgICAgIG5ld0RyYWcgPSBhY3Rpb24uc3RhdGU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiBuZXdEcmFnLmFmZmVjdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IG5ld0RyYWcubXV0YXRlZEV2ZW50cyxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiBuZXdEcmFnLmlzRXZlbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREcmFnO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlRXZlbnRSZXNpemUoY3VycmVudFJlc2l6ZSwgYWN0aW9uKSB7XG4gICAgbGV0IG5ld1Jlc2l6ZTtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1VOU0VUX0VWRU5UX1JFU0laRSc6XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAnU0VUX0VWRU5UX1JFU0laRSc6XG4gICAgICAgICAgICBuZXdSZXNpemUgPSBhY3Rpb24uc3RhdGU7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkRXZlbnRzOiBuZXdSZXNpemUuYWZmZWN0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgbXV0YXRlZEV2ZW50czogbmV3UmVzaXplLm11dGF0ZWRFdmVudHMsXG4gICAgICAgICAgICAgICAgaXNFdmVudDogbmV3UmVzaXplLmlzRXZlbnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNpemU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVRvb2xiYXJzKGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKSB7XG4gICAgbGV0IGhlYWRlciA9IGNhbGVuZGFyT3B0aW9ucy5oZWFkZXJUb29sYmFyID8gcGFyc2VUb29sYmFyKGNhbGVuZGFyT3B0aW9ucy5oZWFkZXJUb29sYmFyLCBjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSkgOiBudWxsO1xuICAgIGxldCBmb290ZXIgPSBjYWxlbmRhck9wdGlvbnMuZm9vdGVyVG9vbGJhciA/IHBhcnNlVG9vbGJhcihjYWxlbmRhck9wdGlvbnMuZm9vdGVyVG9vbGJhciwgY2FsZW5kYXJPcHRpb25zLCBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIDogbnVsbDtcbiAgICByZXR1cm4geyBoZWFkZXIsIGZvb3RlciB9O1xufVxuZnVuY3Rpb24gcGFyc2VUb29sYmFyKHNlY3Rpb25TdHJIYXNoLCBjYWxlbmRhck9wdGlvbnMsIGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCB0aGVtZSwgdmlld1NwZWNzLCBjYWxlbmRhckFwaSkge1xuICAgIGxldCBzZWN0aW9uV2lkZ2V0cyA9IHt9O1xuICAgIGxldCB2aWV3c1dpdGhCdXR0b25zID0gW107XG4gICAgbGV0IGhhc1RpdGxlID0gZmFsc2U7XG4gICAgZm9yIChsZXQgc2VjdGlvbk5hbWUgaW4gc2VjdGlvblN0ckhhc2gpIHtcbiAgICAgICAgbGV0IHNlY3Rpb25TdHIgPSBzZWN0aW9uU3RySGFzaFtzZWN0aW9uTmFtZV07XG4gICAgICAgIGxldCBzZWN0aW9uUmVzID0gcGFyc2VTZWN0aW9uKHNlY3Rpb25TdHIsIGNhbGVuZGFyT3B0aW9ucywgY2FsZW5kYXJPcHRpb25PdmVycmlkZXMsIHRoZW1lLCB2aWV3U3BlY3MsIGNhbGVuZGFyQXBpKTtcbiAgICAgICAgc2VjdGlvbldpZGdldHNbc2VjdGlvbk5hbWVdID0gc2VjdGlvblJlcy53aWRnZXRzO1xuICAgICAgICB2aWV3c1dpdGhCdXR0b25zLnB1c2goLi4uc2VjdGlvblJlcy52aWV3c1dpdGhCdXR0b25zKTtcbiAgICAgICAgaGFzVGl0bGUgPSBoYXNUaXRsZSB8fCBzZWN0aW9uUmVzLmhhc1RpdGxlO1xuICAgIH1cbiAgICByZXR1cm4geyBzZWN0aW9uV2lkZ2V0cywgdmlld3NXaXRoQnV0dG9ucywgaGFzVGl0bGUgfTtcbn1cbi8qXG5CQUQ6IHF1ZXJ5aW5nIGljb25zIGFuZCB0ZXh0IGhlcmUuIHNob3VsZCBiZSBkb25lIGF0IHJlbmRlciB0aW1lXG4qL1xuZnVuY3Rpb24gcGFyc2VTZWN0aW9uKHNlY3Rpb25TdHIsIGNhbGVuZGFyT3B0aW9ucywgLy8gZGVmYXVsdHMrb3ZlcnJpZGVzLCB0aGVuIHJlZmluZWRcbmNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLCAvLyBvdmVycmlkZXMgb25seSEsIHVucmVmaW5lZCA6KFxudGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpIHtcbiAgICBsZXQgaXNSdGwgPSBjYWxlbmRhck9wdGlvbnMuZGlyZWN0aW9uID09PSAncnRsJztcbiAgICBsZXQgY2FsZW5kYXJDdXN0b21CdXR0b25zID0gY2FsZW5kYXJPcHRpb25zLmN1c3RvbUJ1dHRvbnMgfHwge307XG4gICAgbGV0IGNhbGVuZGFyQnV0dG9uVGV4dE92ZXJyaWRlcyA9IGNhbGVuZGFyT3B0aW9uT3ZlcnJpZGVzLmJ1dHRvblRleHQgfHwge307XG4gICAgbGV0IGNhbGVuZGFyQnV0dG9uVGV4dCA9IGNhbGVuZGFyT3B0aW9ucy5idXR0b25UZXh0IHx8IHt9O1xuICAgIGxldCBjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXMgPSBjYWxlbmRhck9wdGlvbk92ZXJyaWRlcy5idXR0b25IaW50cyB8fCB7fTtcbiAgICBsZXQgY2FsZW5kYXJCdXR0b25IaW50cyA9IGNhbGVuZGFyT3B0aW9ucy5idXR0b25IaW50cyB8fCB7fTtcbiAgICBsZXQgc2VjdGlvblN1YnN0cnMgPSBzZWN0aW9uU3RyID8gc2VjdGlvblN0ci5zcGxpdCgnICcpIDogW107XG4gICAgbGV0IHZpZXdzV2l0aEJ1dHRvbnMgPSBbXTtcbiAgICBsZXQgaGFzVGl0bGUgPSBmYWxzZTtcbiAgICBsZXQgd2lkZ2V0cyA9IHNlY3Rpb25TdWJzdHJzLm1hcCgoYnV0dG9uR3JvdXBTdHIpID0+IChidXR0b25Hcm91cFN0ci5zcGxpdCgnLCcpLm1hcCgoYnV0dG9uTmFtZSkgPT4ge1xuICAgICAgICBpZiAoYnV0dG9uTmFtZSA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgaGFzVGl0bGUgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHsgYnV0dG9uTmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdXN0b21CdXR0b25Qcm9wcztcbiAgICAgICAgbGV0IHZpZXdTcGVjO1xuICAgICAgICBsZXQgYnV0dG9uQ2xpY2s7XG4gICAgICAgIGxldCBidXR0b25JY29uOyAvLyBvbmx5IG9uZSBvZiB0aGVzZSB3aWxsIGJlIHNldFxuICAgICAgICBsZXQgYnV0dG9uVGV4dDsgLy8gXCJcbiAgICAgICAgbGV0IGJ1dHRvbkhpbnQ7XG4gICAgICAgIC8vIF4gZm9yIHRoZSB0aXRsZT1cIlwiIGF0dHJpYnV0ZSwgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgICAgaWYgKChjdXN0b21CdXR0b25Qcm9wcyA9IGNhbGVuZGFyQ3VzdG9tQnV0dG9uc1tidXR0b25OYW1lXSkpIHtcbiAgICAgICAgICAgIGJ1dHRvbkNsaWNrID0gKGV2KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUJ1dHRvblByb3BzLmNsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1c3RvbUJ1dHRvblByb3BzLmNsaWNrLmNhbGwoZXYudGFyZ2V0LCBldiwgZXYudGFyZ2V0KTsgLy8gVE9ETzogdXNlIENhbGVuZGFyIHRoaXMgY29udGV4dD9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgKGJ1dHRvbkljb24gPSB0aGVtZS5nZXRDdXN0b21CdXR0b25JY29uQ2xhc3MoY3VzdG9tQnV0dG9uUHJvcHMpKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0SWNvbkNsYXNzKGJ1dHRvbk5hbWUsIGlzUnRsKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uVGV4dCA9IGN1c3RvbUJ1dHRvblByb3BzLnRleHQpO1xuICAgICAgICAgICAgYnV0dG9uSGludCA9IGN1c3RvbUJ1dHRvblByb3BzLmhpbnQgfHwgY3VzdG9tQnV0dG9uUHJvcHMudGV4dDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgodmlld1NwZWMgPSB2aWV3U3BlY3NbYnV0dG9uTmFtZV0pKSB7XG4gICAgICAgICAgICB2aWV3c1dpdGhCdXR0b25zLnB1c2goYnV0dG9uTmFtZSk7XG4gICAgICAgICAgICBidXR0b25DbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhckFwaS5jaGFuZ2VWaWV3KGJ1dHRvbk5hbWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIChidXR0b25UZXh0ID0gdmlld1NwZWMuYnV0dG9uVGV4dE92ZXJyaWRlKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25JY29uID0gdGhlbWUuZ2V0SWNvbkNsYXNzKGJ1dHRvbk5hbWUsIGlzUnRsKSkgfHxcbiAgICAgICAgICAgICAgICAoYnV0dG9uVGV4dCA9IHZpZXdTcGVjLmJ1dHRvblRleHREZWZhdWx0KTtcbiAgICAgICAgICAgIGxldCB0ZXh0RmFsbGJhY2sgPSB2aWV3U3BlYy5idXR0b25UZXh0T3ZlcnJpZGUgfHxcbiAgICAgICAgICAgICAgICB2aWV3U3BlYy5idXR0b25UZXh0RGVmYXVsdDtcbiAgICAgICAgICAgIGJ1dHRvbkhpbnQgPSBpbnRlcm5hbENvbW1vbi5mb3JtYXRXaXRoT3JkaW5hbHModmlld1NwZWMuYnV0dG9uVGl0bGVPdmVycmlkZSB8fFxuICAgICAgICAgICAgICAgIHZpZXdTcGVjLmJ1dHRvblRpdGxlRGVmYXVsdCB8fFxuICAgICAgICAgICAgICAgIGNhbGVuZGFyT3B0aW9ucy52aWV3SGludCwgW3RleHRGYWxsYmFjaywgYnV0dG9uTmFtZV0sIC8vIHZpZXctbmFtZSA9IGJ1dHRvbk5hbWVcbiAgICAgICAgICAgIHRleHRGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2FsZW5kYXJBcGlbYnV0dG9uTmFtZV0pIHsgLy8gYSBjYWxlbmRhckFwaSBtZXRob2RcbiAgICAgICAgICAgIGJ1dHRvbkNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGVuZGFyQXBpW2J1dHRvbk5hbWVdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgKGJ1dHRvblRleHQgPSBjYWxlbmRhckJ1dHRvblRleHRPdmVycmlkZXNbYnV0dG9uTmFtZV0pIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvbkljb24gPSB0aGVtZS5nZXRJY29uQ2xhc3MoYnV0dG9uTmFtZSwgaXNSdGwpKSB8fFxuICAgICAgICAgICAgICAgIChidXR0b25UZXh0ID0gY2FsZW5kYXJCdXR0b25UZXh0W2J1dHRvbk5hbWVdKTsgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGNvbnNpZGVyZWQgZGVmYXVsdFxuICAgICAgICAgICAgaWYgKGJ1dHRvbk5hbWUgPT09ICdwcmV2WWVhcicgfHwgYnV0dG9uTmFtZSA9PT0gJ25leHRZZWFyJykge1xuICAgICAgICAgICAgICAgIGxldCBwcmV2T3JOZXh0ID0gYnV0dG9uTmFtZSA9PT0gJ3ByZXZZZWFyJyA/ICdwcmV2JyA6ICduZXh0JztcbiAgICAgICAgICAgICAgICBidXR0b25IaW50ID0gaW50ZXJuYWxDb21tb24uZm9ybWF0V2l0aE9yZGluYWxzKGNhbGVuZGFyQnV0dG9uSGludE92ZXJyaWRlc1twcmV2T3JOZXh0XSB8fFxuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckJ1dHRvbkhpbnRzW3ByZXZPck5leHRdLCBbXG4gICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQnV0dG9uVGV4dC55ZWFyIHx8ICd5ZWFyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3llYXInLFxuICAgICAgICAgICAgICAgIF0sIGNhbGVuZGFyQnV0dG9uVGV4dFtidXR0b25OYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidXR0b25IaW50ID0gKG5hdlVuaXQpID0+IGludGVybmFsQ29tbW9uLmZvcm1hdFdpdGhPcmRpbmFscyhjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXNbYnV0dG9uTmFtZV0gfHxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJCdXR0b25IaW50c1tidXR0b25OYW1lXSwgW1xuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckJ1dHRvblRleHRbbmF2VW5pdF0gfHwgbmF2VW5pdCxcbiAgICAgICAgICAgICAgICAgICAgbmF2VW5pdCxcbiAgICAgICAgICAgICAgICBdLCBjYWxlbmRhckJ1dHRvblRleHRbYnV0dG9uTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGJ1dHRvbk5hbWUsIGJ1dHRvbkNsaWNrLCBidXR0b25JY29uLCBidXR0b25UZXh0LCBidXR0b25IaW50IH07XG4gICAgfSkpKTtcbiAgICByZXR1cm4geyB3aWRnZXRzLCB2aWV3c1dpdGhCdXR0b25zLCBoYXNUaXRsZSB9O1xufVxuXG4vLyBhbHdheXMgcmVwcmVzZW50cyB0aGUgY3VycmVudCB2aWV3LiBvdGhlcndpc2UsIGl0J2QgbmVlZCB0byBjaGFuZ2UgdmFsdWUgZXZlcnkgdGltZSBkYXRlIGNoYW5nZXNcbmNsYXNzIFZpZXdJbXBsIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBnZXRDdXJyZW50RGF0YSwgZGF0ZUVudikge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmdldEN1cnJlbnREYXRhID0gZ2V0Q3VycmVudERhdGE7XG4gICAgICAgIHRoaXMuZGF0ZUVudiA9IGRhdGVFbnY7XG4gICAgfVxuICAgIGdldCBjYWxlbmRhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudERhdGEoKS5jYWxlbmRhckFwaTtcbiAgICB9XG4gICAgZ2V0IHRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJyZW50RGF0YSgpLnZpZXdUaXRsZTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZVN0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2Uuc3RhcnQpO1xuICAgIH1cbiAgICBnZXQgYWN0aXZlRW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UuZW5kKTtcbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRTdGFydCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZUVudi50b0RhdGUodGhpcy5nZXRDdXJyZW50RGF0YSgpLmRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5zdGFydCk7XG4gICAgfVxuICAgIGdldCBjdXJyZW50RW5kKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRlRW52LnRvRGF0ZSh0aGlzLmdldEN1cnJlbnREYXRhKCkuZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlLmVuZCk7XG4gICAgfVxuICAgIGdldE9wdGlvbihuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkub3B0aW9uc1tuYW1lXTsgLy8gYXJlIHRoZSB2aWV3LXNwZWNpZmljIG9wdGlvbnNcbiAgICB9XG59XG5cbmxldCBldmVudFNvdXJjZURlZiQyID0ge1xuICAgIGlnbm9yZVJhbmdlOiB0cnVlLFxuICAgIHBhcnNlTWV0YShyZWZpbmVkKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmluZWQuZXZlbnRzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZmluZWQuZXZlbnRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2goYXJnLCBzdWNjZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHtcbiAgICAgICAgICAgIHJhd0V2ZW50czogYXJnLmV2ZW50U291cmNlLm1ldGEsXG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuY29uc3QgYXJyYXlFdmVudFNvdXJjZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ2FycmF5LWV2ZW50LXNvdXJjZScsXG4gICAgZXZlbnRTb3VyY2VEZWZzOiBbZXZlbnRTb3VyY2VEZWYkMl0sXG59KTtcblxubGV0IGV2ZW50U291cmNlRGVmJDEgPSB7XG4gICAgcGFyc2VNZXRhKHJlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWZpbmVkLmV2ZW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHJlZmluZWQuZXZlbnRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZmV0Y2goYXJnLCBzdWNjZXNzQ2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgeyBkYXRlRW52IH0gPSBhcmcuY29udGV4dDtcbiAgICAgICAgY29uc3QgZnVuYyA9IGFyZy5ldmVudFNvdXJjZS5tZXRhO1xuICAgICAgICBpbnRlcm5hbENvbW1vbi51bnByb21pc2lmeShmdW5jLmJpbmQobnVsbCwgaW50ZXJuYWxDb21tb24uYnVpbGRSYW5nZUFwaVdpdGhUaW1lWm9uZShhcmcucmFuZ2UsIGRhdGVFbnYpKSwgKHJhd0V2ZW50cykgPT4gc3VjY2Vzc0NhbGxiYWNrKHsgcmF3RXZlbnRzIH0pLCBlcnJvckNhbGxiYWNrKTtcbiAgICB9LFxufTtcbmNvbnN0IGZ1bmNFdmVudFNvdXJjZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ2Z1bmMtZXZlbnQtc291cmNlJyxcbiAgICBldmVudFNvdXJjZURlZnM6IFtldmVudFNvdXJjZURlZiQxXSxcbn0pO1xuXG5jb25zdCBKU09OX0ZFRURfRVZFTlRfU09VUkNFX1JFRklORVJTID0ge1xuICAgIG1ldGhvZDogU3RyaW5nLFxuICAgIGV4dHJhUGFyYW1zOiBpbnRlcm5hbENvbW1vbi5pZGVudGl0eSxcbiAgICBzdGFydFBhcmFtOiBTdHJpbmcsXG4gICAgZW5kUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZVBhcmFtOiBTdHJpbmcsXG59O1xuXG5sZXQgZXZlbnRTb3VyY2VEZWYgPSB7XG4gICAgcGFyc2VNZXRhKHJlZmluZWQpIHtcbiAgICAgICAgaWYgKHJlZmluZWQudXJsICYmIChyZWZpbmVkLmZvcm1hdCA9PT0gJ2pzb24nIHx8ICFyZWZpbmVkLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiByZWZpbmVkLnVybCxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6ICdqc29uJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6IChyZWZpbmVkLm1ldGhvZCB8fCAnR0VUJykudG9VcHBlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBleHRyYVBhcmFtczogcmVmaW5lZC5leHRyYVBhcmFtcyxcbiAgICAgICAgICAgICAgICBzdGFydFBhcmFtOiByZWZpbmVkLnN0YXJ0UGFyYW0sXG4gICAgICAgICAgICAgICAgZW5kUGFyYW06IHJlZmluZWQuZW5kUGFyYW0sXG4gICAgICAgICAgICAgICAgdGltZVpvbmVQYXJhbTogcmVmaW5lZC50aW1lWm9uZVBhcmFtLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGZldGNoKGFyZywgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIGNvbnN0IHsgbWV0YSB9ID0gYXJnLmV2ZW50U291cmNlO1xuICAgICAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gYnVpbGRSZXF1ZXN0UGFyYW1zKG1ldGEsIGFyZy5yYW5nZSwgYXJnLmNvbnRleHQpO1xuICAgICAgICBpbnRlcm5hbENvbW1vbi5yZXF1ZXN0SnNvbihtZXRhLm1ldGhvZCwgbWV0YS51cmwsIHJlcXVlc3RQYXJhbXMpLnRoZW4oKFtyYXdFdmVudHMsIHJlc3BvbnNlXSkgPT4ge1xuICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHsgcmF3RXZlbnRzLCByZXNwb25zZSB9KTtcbiAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7XG4gICAgfSxcbn07XG5jb25zdCBqc29uRmVlZEV2ZW50U291cmNlUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBuYW1lOiAnanNvbi1ldmVudC1zb3VyY2UnLFxuICAgIGV2ZW50U291cmNlUmVmaW5lcnM6IEpTT05fRkVFRF9FVkVOVF9TT1VSQ0VfUkVGSU5FUlMsXG4gICAgZXZlbnRTb3VyY2VEZWZzOiBbZXZlbnRTb3VyY2VEZWZdLFxufSk7XG5mdW5jdGlvbiBidWlsZFJlcXVlc3RQYXJhbXMobWV0YSwgcmFuZ2UsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBkYXRlRW52LCBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCBzdGFydFBhcmFtO1xuICAgIGxldCBlbmRQYXJhbTtcbiAgICBsZXQgdGltZVpvbmVQYXJhbTtcbiAgICBsZXQgY3VzdG9tUmVxdWVzdFBhcmFtcztcbiAgICBsZXQgcGFyYW1zID0ge307XG4gICAgc3RhcnRQYXJhbSA9IG1ldGEuc3RhcnRQYXJhbTtcbiAgICBpZiAoc3RhcnRQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgIHN0YXJ0UGFyYW0gPSBvcHRpb25zLnN0YXJ0UGFyYW07XG4gICAgfVxuICAgIGVuZFBhcmFtID0gbWV0YS5lbmRQYXJhbTtcbiAgICBpZiAoZW5kUGFyYW0gPT0gbnVsbCkge1xuICAgICAgICBlbmRQYXJhbSA9IG9wdGlvbnMuZW5kUGFyYW07XG4gICAgfVxuICAgIHRpbWVab25lUGFyYW0gPSBtZXRhLnRpbWVab25lUGFyYW07XG4gICAgaWYgKHRpbWVab25lUGFyYW0gPT0gbnVsbCkge1xuICAgICAgICB0aW1lWm9uZVBhcmFtID0gb3B0aW9ucy50aW1lWm9uZVBhcmFtO1xuICAgIH1cbiAgICAvLyByZXRyaWV2ZSBhbnkgb3V0Ym91bmQgR0VUL1BPU1QgZGF0YSBmcm9tIHRoZSBvcHRpb25zXG4gICAgaWYgKHR5cGVvZiBtZXRhLmV4dHJhUGFyYW1zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIHN1cHBsaWVkIGFzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEga2V5L3ZhbHVlIG9iamVjdFxuICAgICAgICBjdXN0b21SZXF1ZXN0UGFyYW1zID0gbWV0YS5leHRyYVBhcmFtcygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gcHJvYmFibHkgc3VwcGxpZWQgYXMgYSBzdHJhaWdodCBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgIGN1c3RvbVJlcXVlc3RQYXJhbXMgPSBtZXRhLmV4dHJhUGFyYW1zIHx8IHt9O1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKHBhcmFtcywgY3VzdG9tUmVxdWVzdFBhcmFtcyk7XG4gICAgcGFyYW1zW3N0YXJ0UGFyYW1dID0gZGF0ZUVudi5mb3JtYXRJc28ocmFuZ2Uuc3RhcnQpO1xuICAgIHBhcmFtc1tlbmRQYXJhbV0gPSBkYXRlRW52LmZvcm1hdElzbyhyYW5nZS5lbmQpO1xuICAgIGlmIChkYXRlRW52LnRpbWVab25lICE9PSAnbG9jYWwnKSB7XG4gICAgICAgIHBhcmFtc1t0aW1lWm9uZVBhcmFtXSA9IGRhdGVFbnYudGltZVpvbmU7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG59XG5cbmNvbnN0IFNJTVBMRV9SRUNVUlJJTkdfUkVGSU5FUlMgPSB7XG4gICAgZGF5c09mV2VlazogaW50ZXJuYWxDb21tb24uaWRlbnRpdHksXG4gICAgc3RhcnRUaW1lOiBpbnRlcm5hbENvbW1vbi5jcmVhdGVEdXJhdGlvbixcbiAgICBlbmRUaW1lOiBpbnRlcm5hbENvbW1vbi5jcmVhdGVEdXJhdGlvbixcbiAgICBkdXJhdGlvbjogaW50ZXJuYWxDb21tb24uY3JlYXRlRHVyYXRpb24sXG4gICAgc3RhcnRSZWN1cjogaW50ZXJuYWxDb21tb24uaWRlbnRpdHksXG4gICAgZW5kUmVjdXI6IGludGVybmFsQ29tbW9uLmlkZW50aXR5LFxufTtcblxubGV0IHJlY3VycmluZyA9IHtcbiAgICBwYXJzZShyZWZpbmVkLCBkYXRlRW52KSB7XG4gICAgICAgIGlmIChyZWZpbmVkLmRheXNPZldlZWsgfHwgcmVmaW5lZC5zdGFydFRpbWUgfHwgcmVmaW5lZC5lbmRUaW1lIHx8IHJlZmluZWQuc3RhcnRSZWN1ciB8fCByZWZpbmVkLmVuZFJlY3VyKSB7XG4gICAgICAgICAgICBsZXQgcmVjdXJyaW5nRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBkYXlzT2ZXZWVrOiByZWZpbmVkLmRheXNPZldlZWsgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdGFydFRpbWU6IHJlZmluZWQuc3RhcnRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kVGltZTogcmVmaW5lZC5lbmRUaW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgc3RhcnRSZWN1cjogcmVmaW5lZC5zdGFydFJlY3VyID8gZGF0ZUVudi5jcmVhdGVNYXJrZXIocmVmaW5lZC5zdGFydFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgZW5kUmVjdXI6IHJlZmluZWQuZW5kUmVjdXIgPyBkYXRlRW52LmNyZWF0ZU1hcmtlcihyZWZpbmVkLmVuZFJlY3VyKSA6IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGR1cmF0aW9uO1xuICAgICAgICAgICAgaWYgKHJlZmluZWQuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHJlZmluZWQuZHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWR1cmF0aW9uICYmIHJlZmluZWQuc3RhcnRUaW1lICYmIHJlZmluZWQuZW5kVGltZSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gaW50ZXJuYWxDb21tb24uc3VidHJhY3REdXJhdGlvbnMocmVmaW5lZC5lbmRUaW1lLCByZWZpbmVkLnN0YXJ0VGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFsbERheUd1ZXNzOiBCb29sZWFuKCFyZWZpbmVkLnN0YXJ0VGltZSAmJiAhcmVmaW5lZC5lbmRUaW1lKSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbixcbiAgICAgICAgICAgICAgICB0eXBlRGF0YTogcmVjdXJyaW5nRGF0YSwgLy8gZG9lc24ndCBuZWVkIGVuZFRpbWUgYW55bW9yZSBidXQgb2ggd2VsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIGV4cGFuZCh0eXBlRGF0YSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgICAgIGxldCBjbGlwcGVkRnJhbWluZ1JhbmdlID0gaW50ZXJuYWxDb21tb24uaW50ZXJzZWN0UmFuZ2VzKGZyYW1pbmdSYW5nZSwgeyBzdGFydDogdHlwZURhdGEuc3RhcnRSZWN1ciwgZW5kOiB0eXBlRGF0YS5lbmRSZWN1ciB9KTtcbiAgICAgICAgaWYgKGNsaXBwZWRGcmFtaW5nUmFuZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiBleHBhbmRSYW5nZXModHlwZURhdGEuZGF5c09mV2VlaywgdHlwZURhdGEuc3RhcnRUaW1lLCBjbGlwcGVkRnJhbWluZ1JhbmdlLCBkYXRlRW52KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfSxcbn07XG5jb25zdCBzaW1wbGVSZWN1cnJpbmdFdmVudHNQbHVnaW4gPSBjcmVhdGVQbHVnaW4oe1xuICAgIG5hbWU6ICdzaW1wbGUtcmVjdXJyaW5nLWV2ZW50JyxcbiAgICByZWN1cnJpbmdUeXBlczogW3JlY3VycmluZ10sXG4gICAgZXZlbnRSZWZpbmVyczogU0lNUExFX1JFQ1VSUklOR19SRUZJTkVSUyxcbn0pO1xuZnVuY3Rpb24gZXhwYW5kUmFuZ2VzKGRheXNPZldlZWssIHN0YXJ0VGltZSwgZnJhbWluZ1JhbmdlLCBkYXRlRW52KSB7XG4gICAgbGV0IGRvd0hhc2ggPSBkYXlzT2ZXZWVrID8gaW50ZXJuYWxDb21tb24uYXJyYXlUb0hhc2goZGF5c09mV2VlaykgOiBudWxsO1xuICAgIGxldCBkYXlNYXJrZXIgPSBpbnRlcm5hbENvbW1vbi5zdGFydE9mRGF5KGZyYW1pbmdSYW5nZS5zdGFydCk7XG4gICAgbGV0IGVuZE1hcmtlciA9IGZyYW1pbmdSYW5nZS5lbmQ7XG4gICAgbGV0IGluc3RhbmNlU3RhcnRzID0gW107XG4gICAgd2hpbGUgKGRheU1hcmtlciA8IGVuZE1hcmtlcikge1xuICAgICAgICBsZXQgaW5zdGFuY2VTdGFydDtcbiAgICAgICAgLy8gaWYgZXZlcnlkYXksIG9yIHRoaXMgcGFydGljdWxhciBkYXktb2Ytd2Vla1xuICAgICAgICBpZiAoIWRvd0hhc2ggfHwgZG93SGFzaFtkYXlNYXJrZXIuZ2V0VVRDRGF5KCldKSB7XG4gICAgICAgICAgICBpZiAoc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VTdGFydCA9IGRhdGVFbnYuYWRkKGRheU1hcmtlciwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlU3RhcnQgPSBkYXlNYXJrZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZVN0YXJ0cy5wdXNoKGluc3RhbmNlU3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGRheU1hcmtlciA9IGludGVybmFsQ29tbW9uLmFkZERheXMoZGF5TWFya2VyLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc3RhbmNlU3RhcnRzO1xufVxuXG5jb25zdCBjaGFuZ2VIYW5kbGVyUGx1Z2luID0gY3JlYXRlUGx1Z2luKHtcbiAgICBuYW1lOiAnY2hhbmdlLWhhbmRsZXInLFxuICAgIG9wdGlvbkNoYW5nZUhhbmRsZXJzOiB7XG4gICAgICAgIGV2ZW50cyhldmVudHMsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGhhbmRsZUV2ZW50U291cmNlcyhbZXZlbnRzXSwgY29udGV4dCk7XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50U291cmNlczogaGFuZGxlRXZlbnRTb3VyY2VzLFxuICAgIH0sXG59KTtcbi8qXG5CVUc6IGlmIGBldmVudGAgd2FzIHN1cHBsaWVkLCBhbGwgcHJldmlvdXNseS1naXZlbiBgZXZlbnRTb3VyY2VzYCB3aWxsIGJlIHdpcGVkIG91dFxuKi9cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50U291cmNlcyhpbnB1dHMsIGNvbnRleHQpIHtcbiAgICBsZXQgdW5mb3VuZFNvdXJjZXMgPSBpbnRlcm5hbENvbW1vbi5oYXNoVmFsdWVzVG9BcnJheShjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRTb3VyY2VzKTtcbiAgICBpZiAodW5mb3VuZFNvdXJjZXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGlucHV0cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh1bmZvdW5kU291cmNlc1swXS5fcmF3KSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0c1swXSkpIHtcbiAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVTRVRfUkFXX0VWRU5UUycsXG4gICAgICAgICAgICBzb3VyY2VJZDogdW5mb3VuZFNvdXJjZXNbMF0uc291cmNlSWQsXG4gICAgICAgICAgICByYXdFdmVudHM6IGlucHV0c1swXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5ld0lucHV0cyA9IFtdO1xuICAgIGZvciAobGV0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgICBsZXQgaW5wdXRGb3VuZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuZm91bmRTb3VyY2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAodW5mb3VuZFNvdXJjZXNbaV0uX3JhdyA9PT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICB1bmZvdW5kU291cmNlcy5zcGxpY2UoaSwgMSk7IC8vIGRlbGV0ZVxuICAgICAgICAgICAgICAgIGlucHV0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaW5wdXRGb3VuZCkge1xuICAgICAgICAgICAgbmV3SW5wdXRzLnB1c2goaW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHVuZm91bmRTb3VyY2Ugb2YgdW5mb3VuZFNvdXJjZXMpIHtcbiAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UX1NPVVJDRScsXG4gICAgICAgICAgICBzb3VyY2VJZDogdW5mb3VuZFNvdXJjZS5zb3VyY2VJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvciAobGV0IG5ld0lucHV0IG9mIG5ld0lucHV0cykge1xuICAgICAgICBjb250ZXh0LmNhbGVuZGFyQXBpLmFkZEV2ZW50U291cmNlKG5ld0lucHV0KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZURhdGVQcm9maWxlKGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2RhdGVzU2V0JywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbnRlcm5hbENvbW1vbi5idWlsZFJhbmdlQXBpV2l0aFRpbWVab25lKGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlLCBjb250ZXh0LmRhdGVFbnYpKSwgeyB2aWV3OiBjb250ZXh0LnZpZXdBcGkgfSkpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBlbWl0dGVyIH0gPSBjb250ZXh0O1xuICAgIGlmIChlbWl0dGVyLmhhc0hhbmRsZXJzKCdldmVudHNTZXQnKSkge1xuICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2V2ZW50c1NldCcsIGludGVybmFsQ29tbW9uLmJ1aWxkRXZlbnRBcGlzKGV2ZW50U3RvcmUsIGNvbnRleHQpKTtcbiAgICB9XG59XG5cbi8qXG50aGlzIGFycmF5IGlzIGV4cG9zZWQgb24gdGhlIHJvb3QgbmFtZXNwYWNlIHNvIHRoYXQgVU1EIHBsdWdpbnMgY2FuIGFkZCB0byBpdC5cbnNlZSB0aGUgcm9sbHVwLWJ1bmRsZXMgc2NyaXB0LlxuKi9cbmNvbnN0IGdsb2JhbFBsdWdpbnMgPSBbXG4gICAgYXJyYXlFdmVudFNvdXJjZVBsdWdpbixcbiAgICBmdW5jRXZlbnRTb3VyY2VQbHVnaW4sXG4gICAganNvbkZlZWRFdmVudFNvdXJjZVBsdWdpbixcbiAgICBzaW1wbGVSZWN1cnJpbmdFdmVudHNQbHVnaW4sXG4gICAgY2hhbmdlSGFuZGxlclBsdWdpbixcbiAgICBjcmVhdGVQbHVnaW4oe1xuICAgICAgICBuYW1lOiAnbWlzYycsXG4gICAgICAgIGlzTG9hZGluZ0Z1bmNzOiBbXG4gICAgICAgICAgICAoc3RhdGUpID0+IGNvbXB1dGVFdmVudFNvdXJjZXNMb2FkaW5nKHN0YXRlLmV2ZW50U291cmNlcyksXG4gICAgICAgIF0sXG4gICAgICAgIHByb3BTZXRIYW5kbGVyczoge1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IGhhbmRsZURhdGVQcm9maWxlLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogaGFuZGxlRXZlbnRTdG9yZSxcbiAgICAgICAgfSxcbiAgICB9KSxcbl07XG5cbmNsYXNzIFRhc2tSdW5uZXIge1xuICAgIGNvbnN0cnVjdG9yKHJ1blRhc2tPcHRpb24sIGRyYWluZWRPcHRpb24pIHtcbiAgICAgICAgdGhpcy5ydW5UYXNrT3B0aW9uID0gcnVuVGFza09wdGlvbjtcbiAgICAgICAgdGhpcy5kcmFpbmVkT3B0aW9uID0gZHJhaW5lZE9wdGlvbjtcbiAgICAgICAgdGhpcy5xdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLmRlbGF5ZWRSdW5uZXIgPSBuZXcgaW50ZXJuYWxDb21tb24uRGVsYXllZFJ1bm5lcih0aGlzLmRyYWluLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICByZXF1ZXN0KHRhc2ssIGRlbGF5KSB7XG4gICAgICAgIHRoaXMucXVldWUucHVzaCh0YXNrKTtcbiAgICAgICAgdGhpcy5kZWxheWVkUnVubmVyLnJlcXVlc3QoZGVsYXkpO1xuICAgIH1cbiAgICBwYXVzZShzY29wZSkge1xuICAgICAgICB0aGlzLmRlbGF5ZWRSdW5uZXIucGF1c2Uoc2NvcGUpO1xuICAgIH1cbiAgICByZXN1bWUoc2NvcGUsIGZvcmNlKSB7XG4gICAgICAgIHRoaXMuZGVsYXllZFJ1bm5lci5yZXN1bWUoc2NvcGUsIGZvcmNlKTtcbiAgICB9XG4gICAgZHJhaW4oKSB7XG4gICAgICAgIGxldCB7IHF1ZXVlIH0gPSB0aGlzO1xuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY29tcGxldGVkVGFza3MgPSBbXTtcbiAgICAgICAgICAgIGxldCB0YXNrO1xuICAgICAgICAgICAgd2hpbGUgKCh0YXNrID0gcXVldWUuc2hpZnQoKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1blRhc2sodGFzayk7XG4gICAgICAgICAgICAgICAgY29tcGxldGVkVGFza3MucHVzaCh0YXNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZHJhaW5lZChjb21wbGV0ZWRUYXNrcyk7XG4gICAgICAgIH0gLy8ga2VlcCBnb2luZywgaW4gY2FzZSBuZXcgdGFza3Mgd2VyZSBhZGRlZCBpbiB0aGUgZHJhaW5lZCBoYW5kbGVyXG4gICAgfVxuICAgIHJ1blRhc2sodGFzaykge1xuICAgICAgICBpZiAodGhpcy5ydW5UYXNrT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnJ1blRhc2tPcHRpb24odGFzayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZHJhaW5lZChjb21wbGV0ZWRUYXNrcykge1xuICAgICAgICBpZiAodGhpcy5kcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWluZWRPcHRpb24oY29tcGxldGVkVGFza3MpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBDb21wdXRlcyB3aGF0IHRoZSB0aXRsZSBhdCB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhckFwaSBzaG91bGQgYmUgZm9yIHRoaXMgdmlld1xuZnVuY3Rpb24gYnVpbGRUaXRsZShkYXRlUHJvZmlsZSwgdmlld09wdGlvbnMsIGRhdGVFbnYpIHtcbiAgICBsZXQgcmFuZ2U7XG4gICAgLy8gZm9yIHZpZXdzIHRoYXQgc3BhbiBhIGxhcmdlIHVuaXQgb2YgdGltZSwgc2hvdyB0aGUgcHJvcGVyIGludGVydmFsLCBpZ25vcmluZyBzdHJheSBkYXlzIGJlZm9yZSBhbmQgYWZ0ZXJcbiAgICBpZiAoL14oeWVhcnxtb250aCkkLy50ZXN0KGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZVVuaXQpKSB7XG4gICAgICAgIHJhbmdlID0gZGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gZm9yIGRheSB1bml0cyBvciBzbWFsbGVyLCB1c2UgdGhlIGFjdHVhbCBkYXkgcmFuZ2VcbiAgICAgICAgcmFuZ2UgPSBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgaW50ZXJuYWxDb21tb24uY3JlYXRlRm9ybWF0dGVyKHZpZXdPcHRpb25zLnRpdGxlRm9ybWF0IHx8IGJ1aWxkVGl0bGVGb3JtYXQoZGF0ZVByb2ZpbGUpKSwge1xuICAgICAgICBpc0VuZEV4Y2x1c2l2ZTogZGF0ZVByb2ZpbGUuaXNSYW5nZUFsbERheSxcbiAgICAgICAgZGVmYXVsdFNlcGFyYXRvcjogdmlld09wdGlvbnMudGl0bGVSYW5nZVNlcGFyYXRvcixcbiAgICB9KTtcbn1cbi8vIEdlbmVyYXRlcyB0aGUgZm9ybWF0IHN0cmluZyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aXRsZSBmb3IgdGhlIGN1cnJlbnQgZGF0ZSByYW5nZS5cbi8vIEF0dGVtcHRzIHRvIGNvbXB1dGUgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZm9ybWF0IGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCB3aXRoIGB0aXRsZUZvcm1hdGAuXG5mdW5jdGlvbiBidWlsZFRpdGxlRm9ybWF0KGRhdGVQcm9maWxlKSB7XG4gICAgbGV0IHsgY3VycmVudFJhbmdlVW5pdCB9ID0gZGF0ZVByb2ZpbGU7XG4gICAgaWYgKGN1cnJlbnRSYW5nZVVuaXQgPT09ICd5ZWFyJykge1xuICAgICAgICByZXR1cm4geyB5ZWFyOiAnbnVtZXJpYycgfTtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnRSYW5nZVVuaXQgPT09ICdtb250aCcpIHtcbiAgICAgICAgcmV0dXJuIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ2xvbmcnIH07IC8vIGxpa2UgXCJTZXB0ZW1iZXIgMjAxNFwiXG4gICAgfVxuICAgIGxldCBkYXlzID0gaW50ZXJuYWxDb21tb24uZGlmZldob2xlRGF5cyhkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2Uuc3RhcnQsIGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5lbmQpO1xuICAgIGlmIChkYXlzICE9PSBudWxsICYmIGRheXMgPiAxKSB7XG4gICAgICAgIC8vIG11bHRpLWRheSByYW5nZS4gc2hvcnRlciwgbGlrZSBcIlNlcCA5IC0gMTAgMjAxNFwiXG4gICAgICAgIHJldHVybiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnIH07XG4gICAgfVxuICAgIC8vIG9uZSBkYXkuIGxvbmdlciwgbGlrZSBcIlNlcHRlbWJlciA5IDIwMTRcIlxuICAgIHJldHVybiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfTtcbn1cblxuLy8gaW4gZnV0dXJlIHJlZmFjdG9yLCBkbyB0aGUgcmVkdXgtc3R5bGUgZnVuY3Rpb24oc3RhdGU9aW5pdGlhbCkgZm9yIGluaXRpYWwtc3RhdGVcbi8vIGFsc28sIHdoYXRldmVyIGlzIGhhcHBlbmluZyBpbiBjb25zdHJ1Y3RvciwgaGF2ZSBpdCBoYXBwZW4gaW4gYWN0aW9uIHF1ZXVlIHRvb1xuY2xhc3MgQ2FsZW5kYXJEYXRhTWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlQ3VycmVudFZpZXdEYXRhID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZSh0aGlzLl9jb21wdXRlQ3VycmVudFZpZXdEYXRhKTtcbiAgICAgICAgdGhpcy5vcmdhbml6ZVJhd0xvY2FsZXMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKG9yZ2FuaXplUmF3TG9jYWxlcyk7XG4gICAgICAgIHRoaXMuYnVpbGRMb2NhbGUgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkTG9jYWxlKTtcbiAgICAgICAgdGhpcy5idWlsZFBsdWdpbkhvb2tzID0gYnVpbGRCdWlsZFBsdWdpbkhvb2tzKCk7XG4gICAgICAgIHRoaXMuYnVpbGREYXRlRW52ID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZERhdGVFbnYkMSk7XG4gICAgICAgIHRoaXMuYnVpbGRUaGVtZSA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoYnVpbGRUaGVtZSk7XG4gICAgICAgIHRoaXMucGFyc2VUb29sYmFycyA9IGludGVybmFsQ29tbW9uLm1lbW9pemUocGFyc2VUb29sYmFycyk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3U3BlY3MgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVmlld1NwZWNzKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGVQcm9maWxlR2VuZXJhdG9yID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZU9iakFyZyhidWlsZERhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICAgICAgdGhpcy5idWlsZFZpZXdBcGkgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVmlld0FwaSk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3VWlQcm9wcyA9IGludGVybmFsQ29tbW9uLm1lbW9pemVPYmpBcmcoYnVpbGRWaWV3VWlQcm9wcyk7XG4gICAgICAgIHRoaXMuYnVpbGRFdmVudFVpQnlTb3VyY2UgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkRXZlbnRVaUJ5U291cmNlLCBpbnRlcm5hbENvbW1vbi5pc1Byb3BzRXF1YWwpO1xuICAgICAgICB0aGlzLmJ1aWxkRXZlbnRVaUJhc2VzID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZShidWlsZEV2ZW50VWlCYXNlcyk7XG4gICAgICAgIHRoaXMucGFyc2VDb250ZXh0QnVzaW5lc3NIb3VycyA9IGludGVybmFsQ29tbW9uLm1lbW9pemVPYmpBcmcocGFyc2VDb250ZXh0QnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuYnVpbGRUaXRsZSA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoYnVpbGRUaXRsZSk7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBpbnRlcm5hbENvbW1vbi5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyID0gbmV3IFRhc2tSdW5uZXIodGhpcy5faGFuZGxlQWN0aW9uLmJpbmQodGhpcyksIHRoaXMudXBkYXRlRGF0YS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc0lucHV0ID0ge307XG4gICAgICAgIHRoaXMuY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCA9IHt9O1xuICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyA9IHt9O1xuICAgICAgICB0aGlzLm9wdGlvbnNGb3JSZWZpbmluZyA9IFtdO1xuICAgICAgICB0aGlzLm9wdGlvbnNGb3JIYW5kbGluZyA9IFtdO1xuICAgICAgICB0aGlzLmdldEN1cnJlbnREYXRhID0gKCkgPT4gdGhpcy5kYXRhO1xuICAgICAgICB0aGlzLmRpc3BhdGNoID0gKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25SdW5uZXIucmVxdWVzdChhY3Rpb24pOyAvLyBwcm90ZWN0cyBhZ2FpbnN0IHJlY3Vyc2l2ZSBjYWxscyB0byBfaGFuZGxlQWN0aW9uXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5hY3Rpb25SdW5uZXIucGF1c2UoKTtcbiAgICAgICAgbGV0IGR5bmFtaWNPcHRpb25PdmVycmlkZXMgPSB7fTtcbiAgICAgICAgbGV0IG9wdGlvbnNEYXRhID0gdGhpcy5jb21wdXRlT3B0aW9uc0RhdGEocHJvcHMub3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzLCBwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIGxldCBjdXJyZW50Vmlld1R5cGUgPSBvcHRpb25zRGF0YS5jYWxlbmRhck9wdGlvbnMuaW5pdGlhbFZpZXcgfHwgb3B0aW9uc0RhdGEucGx1Z2luSG9va3MuaW5pdGlhbFZpZXc7XG4gICAgICAgIGxldCBjdXJyZW50Vmlld0RhdGEgPSB0aGlzLmNvbXB1dGVDdXJyZW50Vmlld0RhdGEoY3VycmVudFZpZXdUeXBlLCBvcHRpb25zRGF0YSwgcHJvcHMub3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKTtcbiAgICAgICAgLy8gd2lyZSB0aGluZ3MgdXBcbiAgICAgICAgLy8gVE9ETzogbm90IERSWVxuICAgICAgICBwcm9wcy5jYWxlbmRhckFwaS5jdXJyZW50RGF0YU1hbmFnZXIgPSB0aGlzO1xuICAgICAgICB0aGlzLmVtaXR0ZXIuc2V0VGhpc0NvbnRleHQocHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICB0aGlzLmVtaXR0ZXIuc2V0T3B0aW9ucyhjdXJyZW50Vmlld0RhdGEub3B0aW9ucyk7XG4gICAgICAgIGxldCBjdXJyZW50RGF0ZSA9IGludGVybmFsQ29tbW9uLmdldEluaXRpYWxEYXRlKG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucywgb3B0aW9uc0RhdGEuZGF0ZUVudik7XG4gICAgICAgIGxldCBkYXRlUHJvZmlsZSA9IGN1cnJlbnRWaWV3RGF0YS5kYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZChjdXJyZW50RGF0ZSk7XG4gICAgICAgIGlmICghaW50ZXJuYWxDb21tb24ucmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgY3VycmVudERhdGUpKSB7XG4gICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZS5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2FsZW5kYXJDb250ZXh0ID0ge1xuICAgICAgICAgICAgZGF0ZUVudjogb3B0aW9uc0RhdGEuZGF0ZUVudixcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNEYXRhLmNhbGVuZGFyT3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzOiBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcyxcbiAgICAgICAgICAgIGNhbGVuZGFyQXBpOiBwcm9wcy5jYWxlbmRhckFwaSxcbiAgICAgICAgICAgIGRpc3BhdGNoOiB0aGlzLmRpc3BhdGNoLFxuICAgICAgICAgICAgZW1pdHRlcjogdGhpcy5lbWl0dGVyLFxuICAgICAgICAgICAgZ2V0Q3VycmVudERhdGE6IHRoaXMuZ2V0Q3VycmVudERhdGEsXG4gICAgICAgIH07XG4gICAgICAgIC8vIG5lZWRzIHRvIGJlIGFmdGVyIHNldFRoaXNDb250ZXh0XG4gICAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLmNvbnRleHRJbml0KSB7XG4gICAgICAgICAgICBjYWxsYmFjayhjYWxlbmRhckNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5PVCBEUllcbiAgICAgICAgbGV0IGV2ZW50U291cmNlcyA9IGluaXRFdmVudFNvdXJjZXMob3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLCBkYXRlUHJvZmlsZSwgY2FsZW5kYXJDb250ZXh0KTtcbiAgICAgICAgbGV0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBjdXJyZW50Vmlld1R5cGUsXG4gICAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICAgIGRhdGVQcm9maWxlLFxuICAgICAgICAgICAgYnVzaW5lc3NIb3VyczogdGhpcy5wYXJzZUNvbnRleHRCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dCksXG4gICAgICAgICAgICBldmVudFNvdXJjZXMsXG4gICAgICAgICAgICBldmVudFVpQmFzZXM6IHt9LFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogaW50ZXJuYWxDb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICByZW5kZXJhYmxlRXZlbnRTdG9yZTogaW50ZXJuYWxDb21tb24uY3JlYXRlRW1wdHlFdmVudFN0b3JlKCksXG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uOiBudWxsLFxuICAgICAgICAgICAgZXZlbnRTZWxlY3Rpb246ICcnLFxuICAgICAgICAgICAgZXZlbnREcmFnOiBudWxsLFxuICAgICAgICAgICAgZXZlbnRSZXNpemU6IG51bGwsXG4gICAgICAgICAgICBzZWxlY3Rpb25Db25maWc6IHRoaXMuYnVpbGRWaWV3VWlQcm9wcyhjYWxlbmRhckNvbnRleHQpLnNlbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGNvbnRleHRBbmRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2FsZW5kYXJDb250ZXh0KSwgaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgZm9yIChsZXQgcmVkdWNlciBvZiBvcHRpb25zRGF0YS5wbHVnaW5Ib29rcy5yZWR1Y2Vycykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbml0aWFsU3RhdGUsIHJlZHVjZXIobnVsbCwgbnVsbCwgY29udGV4dEFuZFN0YXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXB1dGVJc0xvYWRpbmcoaW5pdGlhbFN0YXRlLCBjYWxlbmRhckNvbnRleHQpKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignbG9hZGluZycsIHRydWUpOyAvLyBOT1QgRFJZXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRhKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnJlc3VtZSgpO1xuICAgIH1cbiAgICByZXNldE9wdGlvbnMob3B0aW9uT3ZlcnJpZGVzLCBjaGFuZ2VkT3B0aW9uTmFtZXMpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChjaGFuZ2VkT3B0aW9uTmFtZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcHJvcHMub3B0aW9uT3ZlcnJpZGVzID0gb3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvcHMub3B0aW9uT3ZlcnJpZGVzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAocHJvcHMub3B0aW9uT3ZlcnJpZGVzIHx8IHt9KSksIG9wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNGb3JSZWZpbmluZy5wdXNoKC4uLmNoYW5nZWRPcHRpb25OYW1lcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZWRPcHRpb25OYW1lcyA9PT0gdW5kZWZpbmVkIHx8IGNoYW5nZWRPcHRpb25OYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uUnVubmVyLnJlcXVlc3Qoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdOT1RISU5HJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9oYW5kbGVBY3Rpb24oYWN0aW9uKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBzdGF0ZSwgZW1pdHRlciB9ID0gdGhpcztcbiAgICAgICAgbGV0IGR5bmFtaWNPcHRpb25PdmVycmlkZXMgPSByZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzKHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGFjdGlvbik7XG4gICAgICAgIGxldCBvcHRpb25zRGF0YSA9IHRoaXMuY29tcHV0ZU9wdGlvbnNEYXRhKHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcywgcHJvcHMuY2FsZW5kYXJBcGkpO1xuICAgICAgICBsZXQgY3VycmVudFZpZXdUeXBlID0gcmVkdWNlVmlld1R5cGUoc3RhdGUuY3VycmVudFZpZXdUeXBlLCBhY3Rpb24pO1xuICAgICAgICBsZXQgY3VycmVudFZpZXdEYXRhID0gdGhpcy5jb21wdXRlQ3VycmVudFZpZXdEYXRhKGN1cnJlbnRWaWV3VHlwZSwgb3B0aW9uc0RhdGEsIHByb3BzLm9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcyk7XG4gICAgICAgIC8vIHdpcmUgdGhpbmdzIHVwXG4gICAgICAgIC8vIFRPRE86IG5vdCBEUllcbiAgICAgICAgcHJvcHMuY2FsZW5kYXJBcGkuY3VycmVudERhdGFNYW5hZ2VyID0gdGhpcztcbiAgICAgICAgZW1pdHRlci5zZXRUaGlzQ29udGV4dChwcm9wcy5jYWxlbmRhckFwaSk7XG4gICAgICAgIGVtaXR0ZXIuc2V0T3B0aW9ucyhjdXJyZW50Vmlld0RhdGEub3B0aW9ucyk7XG4gICAgICAgIGxldCBjYWxlbmRhckNvbnRleHQgPSB7XG4gICAgICAgICAgICBkYXRlRW52OiBvcHRpb25zRGF0YS5kYXRlRW52LFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zLFxuICAgICAgICAgICAgcGx1Z2luSG9va3M6IG9wdGlvbnNEYXRhLnBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgZGlzcGF0Y2g6IHRoaXMuZGlzcGF0Y2gsXG4gICAgICAgICAgICBlbWl0dGVyLFxuICAgICAgICAgICAgZ2V0Q3VycmVudERhdGE6IHRoaXMuZ2V0Q3VycmVudERhdGEsXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IGN1cnJlbnREYXRlLCBkYXRlUHJvZmlsZSB9ID0gc3RhdGU7XG4gICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmRhdGVQcm9maWxlR2VuZXJhdG9yICE9PSBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IpIHsgLy8gaGFja1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGUgPSBjdXJyZW50Vmlld0RhdGEuZGF0ZVByb2ZpbGVHZW5lcmF0b3IuYnVpbGQoY3VycmVudERhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnREYXRlID0gaW50ZXJuYWxDb21tb24ucmVkdWNlQ3VycmVudERhdGUoY3VycmVudERhdGUsIGFjdGlvbik7XG4gICAgICAgIGRhdGVQcm9maWxlID0gcmVkdWNlRGF0ZVByb2ZpbGUoZGF0ZVByb2ZpbGUsIGFjdGlvbiwgY3VycmVudERhdGUsIGN1cnJlbnRWaWV3RGF0YS5kYXRlUHJvZmlsZUdlbmVyYXRvcik7XG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gJ1BSRVYnIHx8IC8vIFRPRE86IG1vdmUgdGhpcyBsb2dpYyBpbnRvIERhdGVQcm9maWxlR2VuZXJhdG9yXG4gICAgICAgICAgICBhY3Rpb24udHlwZSA9PT0gJ05FWFQnIHx8IC8vIFwiXG4gICAgICAgICAgICAhaW50ZXJuYWxDb21tb24ucmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2UsIGN1cnJlbnREYXRlKSkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSBkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2Uuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGV2ZW50U291cmNlcyA9IHJlZHVjZUV2ZW50U291cmNlcyhzdGF0ZS5ldmVudFNvdXJjZXMsIGFjdGlvbiwgZGF0ZVByb2ZpbGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIGxldCBldmVudFN0b3JlID0gaW50ZXJuYWxDb21tb24ucmVkdWNlRXZlbnRTdG9yZShzdGF0ZS5ldmVudFN0b3JlLCBhY3Rpb24sIGV2ZW50U291cmNlcywgZGF0ZVByb2ZpbGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIGxldCBpc0V2ZW50c0xvYWRpbmcgPSBjb21wdXRlRXZlbnRTb3VyY2VzTG9hZGluZyhldmVudFNvdXJjZXMpOyAvLyBCQUQuIGFsc28gY2FsbGVkIGluIHRoaXMgZnVuYyBpbiBjb21wdXRlSXNMb2FkaW5nXG4gICAgICAgIGxldCByZW5kZXJhYmxlRXZlbnRTdG9yZSA9IChpc0V2ZW50c0xvYWRpbmcgJiYgIWN1cnJlbnRWaWV3RGF0YS5vcHRpb25zLnByb2dyZXNzaXZlRXZlbnRSZW5kZXJpbmcpID9cbiAgICAgICAgICAgIChzdGF0ZS5yZW5kZXJhYmxlRXZlbnRTdG9yZSB8fCBldmVudFN0b3JlKSA6IC8vIHRyeSBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAgICAgICAgICBldmVudFN0b3JlO1xuICAgICAgICBsZXQgeyBldmVudFVpU2luZ2xlQmFzZSwgc2VsZWN0aW9uQ29uZmlnIH0gPSB0aGlzLmJ1aWxkVmlld1VpUHJvcHMoY2FsZW5kYXJDb250ZXh0KTsgLy8gd2lsbCBtZW1vaXplIG9ialxuICAgICAgICBsZXQgZXZlbnRVaUJ5U291cmNlID0gdGhpcy5idWlsZEV2ZW50VWlCeVNvdXJjZShldmVudFNvdXJjZXMpO1xuICAgICAgICBsZXQgZXZlbnRVaUJhc2VzID0gdGhpcy5idWlsZEV2ZW50VWlCYXNlcyhyZW5kZXJhYmxlRXZlbnRTdG9yZS5kZWZzLCBldmVudFVpU2luZ2xlQmFzZSwgZXZlbnRVaUJ5U291cmNlKTtcbiAgICAgICAgbGV0IG5ld1N0YXRlID0ge1xuICAgICAgICAgICAgZHluYW1pY09wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGN1cnJlbnRWaWV3VHlwZSxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICBldmVudFNvdXJjZXMsXG4gICAgICAgICAgICBldmVudFN0b3JlLFxuICAgICAgICAgICAgcmVuZGVyYWJsZUV2ZW50U3RvcmUsXG4gICAgICAgICAgICBzZWxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICBldmVudFVpQmFzZXMsXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJzOiB0aGlzLnBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMoY2FsZW5kYXJDb250ZXh0KSxcbiAgICAgICAgICAgIGRhdGVTZWxlY3Rpb246IHJlZHVjZURhdGVTZWxlY3Rpb24oc3RhdGUuZGF0ZVNlbGVjdGlvbiwgYWN0aW9uKSxcbiAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiByZWR1Y2VTZWxlY3RlZEV2ZW50KHN0YXRlLmV2ZW50U2VsZWN0aW9uLCBhY3Rpb24pLFxuICAgICAgICAgICAgZXZlbnREcmFnOiByZWR1Y2VFdmVudERyYWcoc3RhdGUuZXZlbnREcmFnLCBhY3Rpb24pLFxuICAgICAgICAgICAgZXZlbnRSZXNpemU6IHJlZHVjZUV2ZW50UmVzaXplKHN0YXRlLmV2ZW50UmVzaXplLCBhY3Rpb24pLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgY29udGV4dEFuZFN0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjYWxlbmRhckNvbnRleHQpLCBuZXdTdGF0ZSk7XG4gICAgICAgIGZvciAobGV0IHJlZHVjZXIgb2Ygb3B0aW9uc0RhdGEucGx1Z2luSG9va3MucmVkdWNlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3U3RhdGUsIHJlZHVjZXIoc3RhdGUsIGFjdGlvbiwgY29udGV4dEFuZFN0YXRlKSk7IC8vIGdpdmUgdGhlIE9MRCBzdGF0ZSwgZm9yIG9sZCB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGxldCB3YXNMb2FkaW5nID0gY29tcHV0ZUlzTG9hZGluZyhzdGF0ZSwgY2FsZW5kYXJDb250ZXh0KTtcbiAgICAgICAgbGV0IGlzTG9hZGluZyA9IGNvbXB1dGVJc0xvYWRpbmcobmV3U3RhdGUsIGNhbGVuZGFyQ29udGV4dCk7XG4gICAgICAgIC8vIFRPRE86IHVzZSBwcm9wU2V0SGFuZGxlcnMgaW4gcGx1Z2luIHN5c3RlbVxuICAgICAgICBpZiAoIXdhc0xvYWRpbmcgJiYgaXNMb2FkaW5nKSB7XG4gICAgICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2xvYWRpbmcnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3YXNMb2FkaW5nICYmICFpc0xvYWRpbmcpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIudHJpZ2dlcignbG9hZGluZycsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIGlmIChwcm9wcy5vbkFjdGlvbikge1xuICAgICAgICAgICAgcHJvcHMub25BY3Rpb24oYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGVEYXRhKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCBvbGREYXRhID0gdGhpcy5kYXRhO1xuICAgICAgICBsZXQgb3B0aW9uc0RhdGEgPSB0aGlzLmNvbXB1dGVPcHRpb25zRGF0YShwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMsIHByb3BzLmNhbGVuZGFyQXBpKTtcbiAgICAgICAgbGV0IGN1cnJlbnRWaWV3RGF0YSA9IHRoaXMuY29tcHV0ZUN1cnJlbnRWaWV3RGF0YShzdGF0ZS5jdXJyZW50Vmlld1R5cGUsIG9wdGlvbnNEYXRhLCBwcm9wcy5vcHRpb25PdmVycmlkZXMsIHN0YXRlLmR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgdmlld1RpdGxlOiB0aGlzLmJ1aWxkVGl0bGUoc3RhdGUuZGF0ZVByb2ZpbGUsIGN1cnJlbnRWaWV3RGF0YS5vcHRpb25zLCBvcHRpb25zRGF0YS5kYXRlRW52KSwgY2FsZW5kYXJBcGk6IHByb3BzLmNhbGVuZGFyQXBpLCBkaXNwYXRjaDogdGhpcy5kaXNwYXRjaCwgZW1pdHRlcjogdGhpcy5lbWl0dGVyLCBnZXRDdXJyZW50RGF0YTogdGhpcy5nZXRDdXJyZW50RGF0YSB9LCBvcHRpb25zRGF0YSksIGN1cnJlbnRWaWV3RGF0YSksIHN0YXRlKTtcbiAgICAgICAgbGV0IGNoYW5nZUhhbmRsZXJzID0gb3B0aW9uc0RhdGEucGx1Z2luSG9va3Mub3B0aW9uQ2hhbmdlSGFuZGxlcnM7XG4gICAgICAgIGxldCBvbGRDYWxlbmRhck9wdGlvbnMgPSBvbGREYXRhICYmIG9sZERhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICBsZXQgbmV3Q2FsZW5kYXJPcHRpb25zID0gb3B0aW9uc0RhdGEuY2FsZW5kYXJPcHRpb25zO1xuICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zICYmIG9sZENhbGVuZGFyT3B0aW9ucyAhPT0gbmV3Q2FsZW5kYXJPcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob2xkQ2FsZW5kYXJPcHRpb25zLnRpbWVab25lICE9PSBuZXdDYWxlbmRhck9wdGlvbnMudGltZVpvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyBoYWNrXG4gICAgICAgICAgICAgICAgc3RhdGUuZXZlbnRTb3VyY2VzID0gZGF0YS5ldmVudFNvdXJjZXMgPSByZWR1Y2VFdmVudFNvdXJjZXNOZXdUaW1lWm9uZShkYXRhLmV2ZW50U291cmNlcywgc3RhdGUuZGF0ZVByb2ZpbGUsIGRhdGEpO1xuICAgICAgICAgICAgICAgIHN0YXRlLmV2ZW50U3RvcmUgPSBkYXRhLmV2ZW50U3RvcmUgPSBpbnRlcm5hbENvbW1vbi5yZXpvbmVFdmVudFN0b3JlRGF0ZXMoZGF0YS5ldmVudFN0b3JlLCBvbGREYXRhLmRhdGVFbnYsIGRhdGEuZGF0ZUVudik7XG4gICAgICAgICAgICAgICAgc3RhdGUucmVuZGVyYWJsZUV2ZW50U3RvcmUgPSBkYXRhLnJlbmRlcmFibGVFdmVudFN0b3JlID0gaW50ZXJuYWxDb21tb24ucmV6b25lRXZlbnRTdG9yZURhdGVzKGRhdGEucmVuZGVyYWJsZUV2ZW50U3RvcmUsIG9sZERhdGEuZGF0ZUVudiwgZGF0YS5kYXRlRW52KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IG9wdGlvbk5hbWUgaW4gY2hhbmdlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zRm9ySGFuZGxpbmcuaW5kZXhPZihvcHRpb25OYW1lKSAhPT0gLTEgfHxcbiAgICAgICAgICAgICAgICAgICAgb2xkQ2FsZW5kYXJPcHRpb25zW29wdGlvbk5hbWVdICE9PSBuZXdDYWxlbmRhck9wdGlvbnNbb3B0aW9uTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGFuZGxlcnNbb3B0aW9uTmFtZV0obmV3Q2FsZW5kYXJPcHRpb25zW29wdGlvbk5hbWVdLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zRm9ySGFuZGxpbmcgPSBbXTtcbiAgICAgICAgaWYgKHByb3BzLm9uRGF0YSkge1xuICAgICAgICAgICAgcHJvcHMub25EYXRhKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXB1dGVPcHRpb25zRGF0YShvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGNhbGVuZGFyQXBpKSB7XG4gICAgICAgIC8vIFRPRE86IGJsYWNrbGlzdCBvcHRpb25zIHRoYXQgYXJlIGhhbmRsZWQgYnkgb3B0aW9uQ2hhbmdlSGFuZGxlcnNcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnNGb3JSZWZpbmluZy5sZW5ndGggJiZcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyA9PT0gdGhpcy5zdGFibGVPcHRpb25PdmVycmlkZXMgJiZcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMgPT09IHRoaXMuc3RhYmxlRHluYW1pY09wdGlvbk92ZXJyaWRlcykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhYmxlQ2FsZW5kYXJPcHRpb25zRGF0YTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyByZWZpbmVkT3B0aW9ucywgcGx1Z2luSG9va3MsIGxvY2FsZURlZmF1bHRzLCBhdmFpbGFibGVMb2NhbGVEYXRhLCBleHRyYSwgfSA9IHRoaXMucHJvY2Vzc1Jhd0NhbGVuZGFyT3B0aW9ucyhvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICB3YXJuVW5rbm93bk9wdGlvbnMoZXh0cmEpO1xuICAgICAgICBsZXQgZGF0ZUVudiA9IHRoaXMuYnVpbGREYXRlRW52KHJlZmluZWRPcHRpb25zLnRpbWVab25lLCByZWZpbmVkT3B0aW9ucy5sb2NhbGUsIHJlZmluZWRPcHRpb25zLndlZWtOdW1iZXJDYWxjdWxhdGlvbiwgcmVmaW5lZE9wdGlvbnMuZmlyc3REYXksIHJlZmluZWRPcHRpb25zLndlZWtUZXh0LCBwbHVnaW5Ib29rcywgYXZhaWxhYmxlTG9jYWxlRGF0YSwgcmVmaW5lZE9wdGlvbnMuZGVmYXVsdFJhbmdlU2VwYXJhdG9yKTtcbiAgICAgICAgbGV0IHZpZXdTcGVjcyA9IHRoaXMuYnVpbGRWaWV3U3BlY3MocGx1Z2luSG9va3Mudmlld3MsIHRoaXMuc3RhYmxlT3B0aW9uT3ZlcnJpZGVzLCB0aGlzLnN0YWJsZUR5bmFtaWNPcHRpb25PdmVycmlkZXMsIGxvY2FsZURlZmF1bHRzKTtcbiAgICAgICAgbGV0IHRoZW1lID0gdGhpcy5idWlsZFRoZW1lKHJlZmluZWRPcHRpb25zLCBwbHVnaW5Ib29rcyk7XG4gICAgICAgIGxldCB0b29sYmFyQ29uZmlnID0gdGhpcy5wYXJzZVRvb2xiYXJzKHJlZmluZWRPcHRpb25zLCB0aGlzLnN0YWJsZU9wdGlvbk92ZXJyaWRlcywgdGhlbWUsIHZpZXdTcGVjcywgY2FsZW5kYXJBcGkpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdGFibGVDYWxlbmRhck9wdGlvbnNEYXRhID0ge1xuICAgICAgICAgICAgY2FsZW5kYXJPcHRpb25zOiByZWZpbmVkT3B0aW9ucyxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgZGF0ZUVudixcbiAgICAgICAgICAgIHZpZXdTcGVjcyxcbiAgICAgICAgICAgIHRoZW1lLFxuICAgICAgICAgICAgdG9vbGJhckNvbmZpZyxcbiAgICAgICAgICAgIGxvY2FsZURlZmF1bHRzLFxuICAgICAgICAgICAgYXZhaWxhYmxlUmF3TG9jYWxlczogYXZhaWxhYmxlTG9jYWxlRGF0YS5tYXAsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIGFsd2F5cyBjYWxsZWQgZnJvbSBiZWhpbmQgYSBtZW1vaXplclxuICAgIHByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMob3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIGxldCB7IGxvY2FsZXMsIGxvY2FsZSB9ID0gaW50ZXJuYWxDb21tb24ubWVyZ2VSYXdPcHRpb25zKFtcbiAgICAgICAgICAgIGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTLFxuICAgICAgICAgICAgb3B0aW9uT3ZlcnJpZGVzLFxuICAgICAgICAgICAgZHluYW1pY09wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgXSk7XG4gICAgICAgIGxldCBhdmFpbGFibGVMb2NhbGVEYXRhID0gdGhpcy5vcmdhbml6ZVJhd0xvY2FsZXMobG9jYWxlcyk7XG4gICAgICAgIGxldCBhdmFpbGFibGVSYXdMb2NhbGVzID0gYXZhaWxhYmxlTG9jYWxlRGF0YS5tYXA7XG4gICAgICAgIGxldCBsb2NhbGVEZWZhdWx0cyA9IHRoaXMuYnVpbGRMb2NhbGUobG9jYWxlIHx8IGF2YWlsYWJsZUxvY2FsZURhdGEuZGVmYXVsdENvZGUsIGF2YWlsYWJsZVJhd0xvY2FsZXMpLm9wdGlvbnM7XG4gICAgICAgIGxldCBwbHVnaW5Ib29rcyA9IHRoaXMuYnVpbGRQbHVnaW5Ib29rcyhvcHRpb25PdmVycmlkZXMucGx1Z2lucyB8fCBbXSwgZ2xvYmFsUGx1Z2lucyk7XG4gICAgICAgIGxldCByZWZpbmVycyA9IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZXJzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbnRlcm5hbENvbW1vbi5CQVNFX09QVElPTl9SRUZJTkVSUyksIGludGVybmFsQ29tbW9uLkNBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTKSwgaW50ZXJuYWxDb21tb24uQ0FMRU5EQVJfT1BUSU9OX1JFRklORVJTKSwgcGx1Z2luSG9va3MubGlzdGVuZXJSZWZpbmVycyksIHBsdWdpbkhvb2tzLm9wdGlvblJlZmluZXJzKTtcbiAgICAgICAgbGV0IGV4dHJhID0ge307XG4gICAgICAgIGxldCByYXcgPSBpbnRlcm5hbENvbW1vbi5tZXJnZVJhd09wdGlvbnMoW1xuICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFMsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgcmVmaW5lZCA9IHt9O1xuICAgICAgICBsZXQgY3VycmVudFJhdyA9IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0O1xuICAgICAgICBsZXQgY3VycmVudFJlZmluZWQgPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkO1xuICAgICAgICBsZXQgYW55Q2hhbmdlcyA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBvcHRpb25OYW1lIGluIHJhdykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc0ZvclJlZmluaW5nLmluZGV4T2Yob3B0aW9uTmFtZSkgPT09IC0xICYmIChyYXdbb3B0aW9uTmFtZV0gPT09IGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0gfHwgKGludGVybmFsQ29tbW9uLkNPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTW29wdGlvbk5hbWVdICYmXG4gICAgICAgICAgICAgICAgKG9wdGlvbk5hbWUgaW4gY3VycmVudFJhdykgJiZcbiAgICAgICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SU1tvcHRpb25OYW1lXShjdXJyZW50UmF3W29wdGlvbk5hbWVdLCByYXdbb3B0aW9uTmFtZV0pKSkpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkW29wdGlvbk5hbWVdID0gY3VycmVudFJlZmluZWRbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZWZpbmVyc1tvcHRpb25OYW1lXSkge1xuICAgICAgICAgICAgICAgIHJlZmluZWRbb3B0aW9uTmFtZV0gPSByZWZpbmVyc1tvcHRpb25OYW1lXShyYXdbb3B0aW9uTmFtZV0pO1xuICAgICAgICAgICAgICAgIGFueUNoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZXh0cmFbb3B0aW9uTmFtZV0gPSBjdXJyZW50UmF3W29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbnlDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dCA9IHJhdztcbiAgICAgICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQgPSByZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdGFibGVPcHRpb25PdmVycmlkZXMgPSBvcHRpb25PdmVycmlkZXM7XG4gICAgICAgICAgICB0aGlzLnN0YWJsZUR5bmFtaWNPcHRpb25PdmVycmlkZXMgPSBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub3B0aW9uc0ZvckhhbmRsaW5nLnB1c2goLi4udGhpcy5vcHRpb25zRm9yUmVmaW5pbmcpO1xuICAgICAgICB0aGlzLm9wdGlvbnNGb3JSZWZpbmluZyA9IFtdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmF3T3B0aW9uczogdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQsXG4gICAgICAgICAgICByZWZpbmVkT3B0aW9uczogdGhpcy5jdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCxcbiAgICAgICAgICAgIHBsdWdpbkhvb2tzLFxuICAgICAgICAgICAgYXZhaWxhYmxlTG9jYWxlRGF0YSxcbiAgICAgICAgICAgIGxvY2FsZURlZmF1bHRzLFxuICAgICAgICAgICAgZXh0cmEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9jb21wdXRlQ3VycmVudFZpZXdEYXRhKHZpZXdUeXBlLCBvcHRpb25zRGF0YSwgb3B0aW9uT3ZlcnJpZGVzLCBkeW5hbWljT3B0aW9uT3ZlcnJpZGVzKSB7XG4gICAgICAgIGxldCB2aWV3U3BlYyA9IG9wdGlvbnNEYXRhLnZpZXdTcGVjc1t2aWV3VHlwZV07XG4gICAgICAgIGlmICghdmlld1NwZWMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdmlld1R5cGUgXCIke3ZpZXdUeXBlfVwiIGlzIG5vdCBhdmFpbGFibGUuIFBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGxvYWRlZCBhbGwgbmVjY2Vzc2FyeSBwbHVnaW5zYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHsgcmVmaW5lZE9wdGlvbnMsIGV4dHJhIH0gPSB0aGlzLnByb2Nlc3NSYXdWaWV3T3B0aW9ucyh2aWV3U3BlYywgb3B0aW9uc0RhdGEucGx1Z2luSG9va3MsIG9wdGlvbnNEYXRhLmxvY2FsZURlZmF1bHRzLCBvcHRpb25PdmVycmlkZXMsIGR5bmFtaWNPcHRpb25PdmVycmlkZXMpO1xuICAgICAgICB3YXJuVW5rbm93bk9wdGlvbnMoZXh0cmEpO1xuICAgICAgICBsZXQgZGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSB0aGlzLmJ1aWxkRGF0ZVByb2ZpbGVHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzczogdmlld1NwZWMub3B0aW9uRGVmYXVsdHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB2aWV3U3BlYy5kdXJhdGlvbixcbiAgICAgICAgICAgIGR1cmF0aW9uVW5pdDogdmlld1NwZWMuZHVyYXRpb25Vbml0LFxuICAgICAgICAgICAgdXNlc01pbk1heFRpbWU6IHZpZXdTcGVjLm9wdGlvbkRlZmF1bHRzLnVzZXNNaW5NYXhUaW1lLFxuICAgICAgICAgICAgZGF0ZUVudjogb3B0aW9uc0RhdGEuZGF0ZUVudixcbiAgICAgICAgICAgIGNhbGVuZGFyQXBpOiB0aGlzLnByb3BzLmNhbGVuZGFyQXBpLFxuICAgICAgICAgICAgc2xvdE1pblRpbWU6IHJlZmluZWRPcHRpb25zLnNsb3RNaW5UaW1lLFxuICAgICAgICAgICAgc2xvdE1heFRpbWU6IHJlZmluZWRPcHRpb25zLnNsb3RNYXhUaW1lLFxuICAgICAgICAgICAgc2hvd05vbkN1cnJlbnREYXRlczogcmVmaW5lZE9wdGlvbnMuc2hvd05vbkN1cnJlbnREYXRlcyxcbiAgICAgICAgICAgIGRheUNvdW50OiByZWZpbmVkT3B0aW9ucy5kYXlDb3VudCxcbiAgICAgICAgICAgIGRhdGVBbGlnbm1lbnQ6IHJlZmluZWRPcHRpb25zLmRhdGVBbGlnbm1lbnQsXG4gICAgICAgICAgICBkYXRlSW5jcmVtZW50OiByZWZpbmVkT3B0aW9ucy5kYXRlSW5jcmVtZW50LFxuICAgICAgICAgICAgaGlkZGVuRGF5czogcmVmaW5lZE9wdGlvbnMuaGlkZGVuRGF5cyxcbiAgICAgICAgICAgIHdlZWtlbmRzOiByZWZpbmVkT3B0aW9ucy53ZWVrZW5kcyxcbiAgICAgICAgICAgIG5vd0lucHV0OiByZWZpbmVkT3B0aW9ucy5ub3csXG4gICAgICAgICAgICB2YWxpZFJhbmdlSW5wdXQ6IHJlZmluZWRPcHRpb25zLnZhbGlkUmFuZ2UsXG4gICAgICAgICAgICB2aXNpYmxlUmFuZ2VJbnB1dDogcmVmaW5lZE9wdGlvbnMudmlzaWJsZVJhbmdlLFxuICAgICAgICAgICAgZml4ZWRXZWVrQ291bnQ6IHJlZmluZWRPcHRpb25zLmZpeGVkV2Vla0NvdW50LFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHZpZXdBcGkgPSB0aGlzLmJ1aWxkVmlld0FwaSh2aWV3VHlwZSwgdGhpcy5nZXRDdXJyZW50RGF0YSwgb3B0aW9uc0RhdGEuZGF0ZUVudik7XG4gICAgICAgIHJldHVybiB7IHZpZXdTcGVjLCBvcHRpb25zOiByZWZpbmVkT3B0aW9ucywgZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIHZpZXdBcGkgfTtcbiAgICB9XG4gICAgcHJvY2Vzc1Jhd1ZpZXdPcHRpb25zKHZpZXdTcGVjLCBwbHVnaW5Ib29rcywgbG9jYWxlRGVmYXVsdHMsIG9wdGlvbk92ZXJyaWRlcywgZHluYW1pY09wdGlvbk92ZXJyaWRlcykge1xuICAgICAgICBsZXQgcmF3ID0gaW50ZXJuYWxDb21tb24ubWVyZ2VSYXdPcHRpb25zKFtcbiAgICAgICAgICAgIGludGVybmFsQ29tbW9uLkJBU0VfT1BUSU9OX0RFRkFVTFRTLFxuICAgICAgICAgICAgdmlld1NwZWMub3B0aW9uRGVmYXVsdHMsXG4gICAgICAgICAgICBsb2NhbGVEZWZhdWx0cyxcbiAgICAgICAgICAgIG9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIHZpZXdTcGVjLm9wdGlvbk92ZXJyaWRlcyxcbiAgICAgICAgICAgIGR5bmFtaWNPcHRpb25PdmVycmlkZXMsXG4gICAgICAgIF0pO1xuICAgICAgICBsZXQgcmVmaW5lcnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fUkVGSU5FUlMpLCBpbnRlcm5hbENvbW1vbi5DQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUyksIGludGVybmFsQ29tbW9uLkNBTEVOREFSX09QVElPTl9SRUZJTkVSUyksIGludGVybmFsQ29tbW9uLlZJRVdfT1BUSU9OX1JFRklORVJTKSwgcGx1Z2luSG9va3MubGlzdGVuZXJSZWZpbmVycyksIHBsdWdpbkhvb2tzLm9wdGlvblJlZmluZXJzKTtcbiAgICAgICAgbGV0IHJlZmluZWQgPSB7fTtcbiAgICAgICAgbGV0IGN1cnJlbnRSYXcgPSB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc0lucHV0O1xuICAgICAgICBsZXQgY3VycmVudFJlZmluZWQgPSB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc1JlZmluZWQ7XG4gICAgICAgIGxldCBhbnlDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgIGxldCBleHRyYSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBvcHRpb25OYW1lIGluIHJhdykge1xuICAgICAgICAgICAgaWYgKHJhd1tvcHRpb25OYW1lXSA9PT0gY3VycmVudFJhd1tvcHRpb25OYW1lXSB8fFxuICAgICAgICAgICAgICAgIChpbnRlcm5hbENvbW1vbi5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SU1tvcHRpb25OYW1lXSAmJlxuICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SU1tvcHRpb25OYW1lXShyYXdbb3B0aW9uTmFtZV0sIGN1cnJlbnRSYXdbb3B0aW9uTmFtZV0pKSkge1xuICAgICAgICAgICAgICAgIHJlZmluZWRbb3B0aW9uTmFtZV0gPSBjdXJyZW50UmVmaW5lZFtvcHRpb25OYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyYXdbb3B0aW9uTmFtZV0gPT09IHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0W29wdGlvbk5hbWVdIHx8XG4gICAgICAgICAgICAgICAgICAgIChpbnRlcm5hbENvbW1vbi5DT01QTEVYX09QVElPTl9DT01QQVJBVE9SU1tvcHRpb25OYW1lXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlNbb3B0aW9uTmFtZV0ocmF3W29wdGlvbk5hbWVdLCB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNJbnB1dFtvcHRpb25OYW1lXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25OYW1lIGluIHRoaXMuY3VycmVudENhbGVuZGFyT3B0aW9uc1JlZmluZWQpIHsgLy8gbWlnaHQgYmUgYW4gXCJleHRyYVwiIHByb3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmluZWRbb3B0aW9uTmFtZV0gPSB0aGlzLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVkW29wdGlvbk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmluZXJzW29wdGlvbk5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZmluZWRbb3B0aW9uTmFtZV0gPSByZWZpbmVyc1tvcHRpb25OYW1lXShyYXdbb3B0aW9uTmFtZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFbb3B0aW9uTmFtZV0gPSByYXdbb3B0aW9uTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFueUNoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbnlDaGFuZ2VzKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc0lucHV0ID0gcmF3O1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld09wdGlvbnNSZWZpbmVkID0gcmVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmF3T3B0aW9uczogdGhpcy5jdXJyZW50Vmlld09wdGlvbnNJbnB1dCxcbiAgICAgICAgICAgIHJlZmluZWRPcHRpb25zOiB0aGlzLmN1cnJlbnRWaWV3T3B0aW9uc1JlZmluZWQsXG4gICAgICAgICAgICBleHRyYSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZERhdGVFbnYkMSh0aW1lWm9uZSwgZXhwbGljaXRMb2NhbGUsIHdlZWtOdW1iZXJDYWxjdWxhdGlvbiwgZmlyc3REYXksIHdlZWtUZXh0LCBwbHVnaW5Ib29rcywgYXZhaWxhYmxlTG9jYWxlRGF0YSwgZGVmYXVsdFNlcGFyYXRvcikge1xuICAgIGxldCBsb2NhbGUgPSBidWlsZExvY2FsZShleHBsaWNpdExvY2FsZSB8fCBhdmFpbGFibGVMb2NhbGVEYXRhLmRlZmF1bHRDb2RlLCBhdmFpbGFibGVMb2NhbGVEYXRhLm1hcCk7XG4gICAgcmV0dXJuIG5ldyBpbnRlcm5hbENvbW1vbi5EYXRlRW52KHtcbiAgICAgICAgY2FsZW5kYXJTeXN0ZW06ICdncmVnb3J5JyxcbiAgICAgICAgdGltZVpvbmUsXG4gICAgICAgIG5hbWVkVGltZVpvbmVJbXBsOiBwbHVnaW5Ib29rcy5uYW1lZFRpbWVab25lZEltcGwsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uLFxuICAgICAgICBmaXJzdERheSxcbiAgICAgICAgd2Vla1RleHQsXG4gICAgICAgIGNtZEZvcm1hdHRlcjogcGx1Z2luSG9va3MuY21kRm9ybWF0dGVyLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gYnVpbGRUaGVtZShvcHRpb25zLCBwbHVnaW5Ib29rcykge1xuICAgIGxldCBUaGVtZUNsYXNzID0gcGx1Z2luSG9va3MudGhlbWVDbGFzc2VzW29wdGlvbnMudGhlbWVTeXN0ZW1dIHx8IFN0YW5kYXJkVGhlbWU7XG4gICAgcmV0dXJuIG5ldyBUaGVtZUNsYXNzKG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvcihwcm9wcykge1xuICAgIGxldCBEYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzID0gcHJvcHMuZGF0ZVByb2ZpbGVHZW5lcmF0b3JDbGFzcyB8fCBpbnRlcm5hbENvbW1vbi5EYXRlUHJvZmlsZUdlbmVyYXRvcjtcbiAgICByZXR1cm4gbmV3IERhdGVQcm9maWxlR2VuZXJhdG9yQ2xhc3MocHJvcHMpO1xufVxuZnVuY3Rpb24gYnVpbGRWaWV3QXBpKHR5cGUsIGdldEN1cnJlbnREYXRhLCBkYXRlRW52KSB7XG4gICAgcmV0dXJuIG5ldyBWaWV3SW1wbCh0eXBlLCBnZXRDdXJyZW50RGF0YSwgZGF0ZUVudik7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50VWlCeVNvdXJjZShldmVudFNvdXJjZXMpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24ubWFwSGFzaChldmVudFNvdXJjZXMsIChldmVudFNvdXJjZSkgPT4gZXZlbnRTb3VyY2UudWkpO1xufVxuZnVuY3Rpb24gYnVpbGRFdmVudFVpQmFzZXMoZXZlbnREZWZzLCBldmVudFVpU2luZ2xlQmFzZSwgZXZlbnRVaUJ5U291cmNlKSB7XG4gICAgbGV0IGV2ZW50VWlCYXNlcyA9IHsgJyc6IGV2ZW50VWlTaW5nbGVCYXNlIH07XG4gICAgZm9yIChsZXQgZGVmSWQgaW4gZXZlbnREZWZzKSB7XG4gICAgICAgIGxldCBkZWYgPSBldmVudERlZnNbZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLnNvdXJjZUlkICYmIGV2ZW50VWlCeVNvdXJjZVtkZWYuc291cmNlSWRdKSB7XG4gICAgICAgICAgICBldmVudFVpQmFzZXNbZGVmSWRdID0gZXZlbnRVaUJ5U291cmNlW2RlZi5zb3VyY2VJZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50VWlCYXNlcztcbn1cbmZ1bmN0aW9uIGJ1aWxkVmlld1VpUHJvcHMoY2FsZW5kYXJDb250ZXh0KSB7XG4gICAgbGV0IHsgb3B0aW9ucyB9ID0gY2FsZW5kYXJDb250ZXh0O1xuICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50VWlTaW5nbGVCYXNlOiBpbnRlcm5hbENvbW1vbi5jcmVhdGVFdmVudFVpKHtcbiAgICAgICAgICAgIGRpc3BsYXk6IG9wdGlvbnMuZXZlbnREaXNwbGF5LFxuICAgICAgICAgICAgZWRpdGFibGU6IG9wdGlvbnMuZWRpdGFibGUsXG4gICAgICAgICAgICBzdGFydEVkaXRhYmxlOiBvcHRpb25zLmV2ZW50U3RhcnRFZGl0YWJsZSxcbiAgICAgICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IG9wdGlvbnMuZXZlbnREdXJhdGlvbkVkaXRhYmxlLFxuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5ldmVudENvbnN0cmFpbnQsXG4gICAgICAgICAgICBvdmVybGFwOiB0eXBlb2Ygb3B0aW9ucy5ldmVudE92ZXJsYXAgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuZXZlbnRPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuZXZlbnRBbGxvdyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5ldmVudEJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiBvcHRpb25zLmV2ZW50Qm9yZGVyQ29sb3IsXG4gICAgICAgICAgICB0ZXh0Q29sb3I6IG9wdGlvbnMuZXZlbnRUZXh0Q29sb3IsXG4gICAgICAgICAgICBjb2xvcjogb3B0aW9ucy5ldmVudENvbG9yLFxuICAgICAgICAgICAgLy8gY2xhc3NOYW1lczogb3B0aW9ucy5ldmVudENsYXNzTmFtZXMgLy8gcmVuZGVyIGhvb2sgd2lsbCBoYW5kbGUgdGhpc1xuICAgICAgICB9LCBjYWxlbmRhckNvbnRleHQpLFxuICAgICAgICBzZWxlY3Rpb25Db25maWc6IGludGVybmFsQ29tbW9uLmNyZWF0ZUV2ZW50VWkoe1xuICAgICAgICAgICAgY29uc3RyYWludDogb3B0aW9ucy5zZWxlY3RDb25zdHJhaW50LFxuICAgICAgICAgICAgb3ZlcmxhcDogdHlwZW9mIG9wdGlvbnMuc2VsZWN0T3ZlcmxhcCA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zZWxlY3RPdmVybGFwIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYWxsb3c6IG9wdGlvbnMuc2VsZWN0QWxsb3csXG4gICAgICAgIH0sIGNhbGVuZGFyQ29udGV4dCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVJc0xvYWRpbmcoc3RhdGUsIGNvbnRleHQpIHtcbiAgICBmb3IgKGxldCBpc0xvYWRpbmdGdW5jIG9mIGNvbnRleHQucGx1Z2luSG9va3MuaXNMb2FkaW5nRnVuY3MpIHtcbiAgICAgICAgaWYgKGlzTG9hZGluZ0Z1bmMoc3RhdGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBwYXJzZUNvbnRleHRCdXNpbmVzc0hvdXJzKGNhbGVuZGFyQ29udGV4dCkge1xuICAgIHJldHVybiBpbnRlcm5hbENvbW1vbi5wYXJzZUJ1c2luZXNzSG91cnMoY2FsZW5kYXJDb250ZXh0Lm9wdGlvbnMuYnVzaW5lc3NIb3VycywgY2FsZW5kYXJDb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHdhcm5Vbmtub3duT3B0aW9ucyhvcHRpb25zLCB2aWV3TmFtZSkge1xuICAgIGZvciAobGV0IG9wdGlvbk5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gb3B0aW9uICcke29wdGlvbk5hbWV9J2AgK1xuICAgICAgICAgICAgKHZpZXdOYW1lID8gYCBmb3IgdmlldyAnJHt2aWV3TmFtZX0nYCA6ICcnKSk7XG4gICAgfVxufVxuXG5jbGFzcyBUb29sYmFyU2VjdGlvbiBleHRlbmRzIGludGVybmFsQ29tbW9uLkJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gdGhpcy5wcm9wcy53aWRnZXRHcm91cHMubWFwKCh3aWRnZXRHcm91cCkgPT4gdGhpcy5yZW5kZXJXaWRnZXRHcm91cCh3aWRnZXRHcm91cCkpO1xuICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAnZmMtdG9vbGJhci1jaHVuaycgfSwgLi4uY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZW5kZXJXaWRnZXRHcm91cCh3aWRnZXRHcm91cCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgdGhlbWUgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gW107XG4gICAgICAgIGxldCBpc09ubHlCdXR0b25zID0gdHJ1ZTtcbiAgICAgICAgZm9yIChsZXQgd2lkZ2V0IG9mIHdpZGdldEdyb3VwKSB7XG4gICAgICAgICAgICBsZXQgeyBidXR0b25OYW1lLCBidXR0b25DbGljaywgYnV0dG9uVGV4dCwgYnV0dG9uSWNvbiwgYnV0dG9uSGludCB9ID0gd2lkZ2V0O1xuICAgICAgICAgICAgaWYgKGJ1dHRvbk5hbWUgPT09ICd0aXRsZScpIHtcbiAgICAgICAgICAgICAgICBpc09ubHlCdXR0b25zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChwcmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHsgY2xhc3NOYW1lOiBcImZjLXRvb2xiYXItdGl0bGVcIiwgaWQ6IHByb3BzLnRpdGxlSWQgfSwgcHJvcHMudGl0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBpc1ByZXNzZWQgPSBidXR0b25OYW1lID09PSBwcm9wcy5hY3RpdmVCdXR0b247XG4gICAgICAgICAgICAgICAgbGV0IGlzRGlzYWJsZWQgPSAoIXByb3BzLmlzVG9kYXlFbmFibGVkICYmIGJ1dHRvbk5hbWUgPT09ICd0b2RheScpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNQcmV2RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAncHJldicpIHx8XG4gICAgICAgICAgICAgICAgICAgICghcHJvcHMuaXNOZXh0RW5hYmxlZCAmJiBidXR0b25OYW1lID09PSAnbmV4dCcpO1xuICAgICAgICAgICAgICAgIGxldCBidXR0b25DbGFzc2VzID0gW2BmYy0ke2J1dHRvbk5hbWV9LWJ1dHRvbmAsIHRoZW1lLmdldENsYXNzKCdidXR0b24nKV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25DbGFzc2VzLnB1c2godGhlbWUuZ2V0Q2xhc3MoJ2J1dHRvbkFjdGl2ZScpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChwcmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7IHR5cGU6IFwiYnV0dG9uXCIsIHRpdGxlOiB0eXBlb2YgYnV0dG9uSGludCA9PT0gJ2Z1bmN0aW9uJyA/IGJ1dHRvbkhpbnQocHJvcHMubmF2VW5pdCkgOiBidXR0b25IaW50LCBkaXNhYmxlZDogaXNEaXNhYmxlZCwgXCJhcmlhLXByZXNzZWRcIjogaXNQcmVzc2VkLCBjbGFzc05hbWU6IGJ1dHRvbkNsYXNzZXMuam9pbignICcpLCBvbkNsaWNrOiBidXR0b25DbGljayB9LCBidXR0b25UZXh0IHx8IChidXR0b25JY29uID8gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBidXR0b25JY29uIH0pIDogJycpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGxldCBncm91cENsYXNzTmFtZSA9IChpc09ubHlCdXR0b25zICYmIHRoZW1lLmdldENsYXNzKCdidXR0b25Hcm91cCcpKSB8fCAnJztcbiAgICAgICAgICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6IGdyb3VwQ2xhc3NOYW1lIH0sIC4uLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW5bMF07XG4gICAgfVxufVxuXG5jbGFzcyBUb29sYmFyIGV4dGVuZHMgaW50ZXJuYWxDb21tb24uQmFzZUNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBtb2RlbCwgZXh0cmFDbGFzc05hbWUgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBmb3JjZUx0ciA9IGZhbHNlO1xuICAgICAgICBsZXQgc3RhcnRDb250ZW50O1xuICAgICAgICBsZXQgZW5kQ29udGVudDtcbiAgICAgICAgbGV0IHNlY3Rpb25XaWRnZXRzID0gbW9kZWwuc2VjdGlvbldpZGdldHM7XG4gICAgICAgIGxldCBjZW50ZXJDb250ZW50ID0gc2VjdGlvbldpZGdldHMuY2VudGVyO1xuICAgICAgICBpZiAoc2VjdGlvbldpZGdldHMubGVmdCkge1xuICAgICAgICAgICAgZm9yY2VMdHIgPSB0cnVlO1xuICAgICAgICAgICAgc3RhcnRDb250ZW50ID0gc2VjdGlvbldpZGdldHMubGVmdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0Q29udGVudCA9IHNlY3Rpb25XaWRnZXRzLnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWN0aW9uV2lkZ2V0cy5yaWdodCkge1xuICAgICAgICAgICAgZm9yY2VMdHIgPSB0cnVlO1xuICAgICAgICAgICAgZW5kQ29udGVudCA9IHNlY3Rpb25XaWRnZXRzLnJpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZW5kQ29udGVudCA9IHNlY3Rpb25XaWRnZXRzLmVuZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgICAgIGV4dHJhQ2xhc3NOYW1lIHx8ICcnLFxuICAgICAgICAgICAgJ2ZjLXRvb2xiYXInLFxuICAgICAgICAgICAgZm9yY2VMdHIgPyAnZmMtdG9vbGJhci1sdHInIDogJycsXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpIH0sXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ3N0YXJ0Jywgc3RhcnRDb250ZW50IHx8IFtdKSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyU2VjdGlvbignY2VudGVyJywgY2VudGVyQ29udGVudCB8fCBbXSksXG4gICAgICAgICAgICB0aGlzLnJlbmRlclNlY3Rpb24oJ2VuZCcsIGVuZENvbnRlbnQgfHwgW10pKSk7XG4gICAgfVxuICAgIHJlbmRlclNlY3Rpb24oa2V5LCB3aWRnZXRHcm91cHMpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbGJhclNlY3Rpb24sIHsga2V5OiBrZXksIHdpZGdldEdyb3Vwczogd2lkZ2V0R3JvdXBzLCB0aXRsZTogcHJvcHMudGl0bGUsIG5hdlVuaXQ6IHByb3BzLm5hdlVuaXQsIGFjdGl2ZUJ1dHRvbjogcHJvcHMuYWN0aXZlQnV0dG9uLCBpc1RvZGF5RW5hYmxlZDogcHJvcHMuaXNUb2RheUVuYWJsZWQsIGlzUHJldkVuYWJsZWQ6IHByb3BzLmlzUHJldkVuYWJsZWQsIGlzTmV4dEVuYWJsZWQ6IHByb3BzLmlzTmV4dEVuYWJsZWQsIHRpdGxlSWQ6IHByb3BzLnRpdGxlSWQgfSkpO1xuICAgIH1cbn1cblxuY2xhc3MgVmlld0hhcm5lc3MgZXh0ZW5kcyBpbnRlcm5hbENvbW1vbi5CYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUVsID0gKGVsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVsID0gZWw7XG4gICAgICAgICAgICBpbnRlcm5hbENvbW1vbi5zZXRSZWYodGhpcy5wcm9wcy5lbFJlZiwgZWwpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBdmFpbGFibGVXaWR0aCgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXZhaWxhYmxlV2lkdGgoKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGFzcGVjdFJhdGlvIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtdmlldy1oYXJuZXNzJyxcbiAgICAgICAgICAgIChhc3BlY3RSYXRpbyB8fCBwcm9wcy5saXF1aWQgfHwgcHJvcHMuaGVpZ2h0KVxuICAgICAgICAgICAgICAgID8gJ2ZjLXZpZXctaGFybmVzcy1hY3RpdmUnIC8vIGhhcm5lc3MgY29udHJvbHMgdGhlIGhlaWdodFxuICAgICAgICAgICAgICAgIDogJ2ZjLXZpZXctaGFybmVzcy1wYXNzaXZlJywgLy8gbGV0IHRoZSB2aWV3IGRvIHRoZSBoZWlnaHRcbiAgICAgICAgXTtcbiAgICAgICAgbGV0IGhlaWdodCA9ICcnO1xuICAgICAgICBsZXQgcGFkZGluZ0JvdHRvbSA9ICcnO1xuICAgICAgICBpZiAoYXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hdmFpbGFibGVXaWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IHN0YXRlLmF2YWlsYWJsZVdpZHRoIC8gYXNwZWN0UmF0aW87XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB3aGlsZSB3YWl0aW5nIHRvIGtub3cgYXZhaWxhYmxlV2lkdGgsIHdlIGNhbid0IHNldCBoZWlnaHQgdG8gKnplcm8qXG4gICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3aWxsIGNhdXNlIGxvdHMgb2YgdW5uZWNlc3Nhcnkgc2Nyb2xsYmFycyB3aXRoaW4gc2Nyb2xsZ3JpZC5cbiAgICAgICAgICAgICAgICAvLyBCRVRURVI6IGRvbid0IHN0YXJ0IHJlbmRlcmluZyBBTllUSElORyB5ZXQgdW50aWwgd2Uga25vdyBjb250YWluZXIgd2lkdGhcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiB3aHkgbm90IGFsd2F5cyB1c2UgcGFkZGluZ0JvdHRvbT8gQ2F1c2VzIGhlaWdodCBvc2NpbGxhdGlvbiAoaXNzdWUgNTYwNilcbiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tID0gYCR7KDEgLyBhc3BlY3RSYXRpbykgKiAxMDB9JWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBwcm9wcy5oZWlnaHQgfHwgJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHByb3BzLmxhYmVsZWRCeUlkLCByZWY6IHRoaXMuaGFuZGxlRWwsIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksIHN0eWxlOiB7IGhlaWdodCwgcGFkZGluZ0JvdHRvbSB9IH0sIHByb3BzLmNoaWxkcmVuKSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuYWRkUmVzaXplSGFuZGxlcih0aGlzLmhhbmRsZVJlc2l6ZSk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmNvbnRleHQucmVtb3ZlUmVzaXplSGFuZGxlcih0aGlzLmhhbmRsZVJlc2l6ZSk7XG4gICAgfVxuICAgIHVwZGF0ZUF2YWlsYWJsZVdpZHRoKCkge1xuICAgICAgICBpZiAodGhpcy5lbCAmJiAvLyBuZWVkZWQuIGJ1dCB3aHk/XG4gICAgICAgICAgICB0aGlzLnByb3BzLmFzcGVjdFJhdGlvIC8vIGFzcGVjdFJhdGlvIGlzIHRoZSBvbmx5IGhlaWdodCBzZXR0aW5nIHRoYXQgbmVlZHMgYXZhaWxhYmxlV2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgYXZhaWxhYmxlV2lkdGg6IHRoaXMuZWwub2Zmc2V0V2lkdGggfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qXG5EZXRlY3RzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIGFuIGV2ZW50IHdpdGhpbiBhIERhdGVDb21wb25lbnRcbiovXG5jbGFzcyBFdmVudENsaWNraW5nIGV4dGVuZHMgaW50ZXJuYWxDb21tb24uSW50ZXJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdDbGljayA9IChldiwgc2VnRWwpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IGNvbnRleHQgfSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgIGxldCBzZWcgPSBpbnRlcm5hbENvbW1vbi5nZXRFbFNlZyhzZWdFbCk7XG4gICAgICAgICAgICBpZiAoc2VnICYmIC8vIG1pZ2h0IGJlIHRoZSA8ZGl2PiBzdXJyb3VuZGluZyB0aGUgbW9yZSBsaW5rXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LmlzVmFsaWRTZWdEb3duRWwoZXYudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIC8vIG91ciB3YXkgdG8gc2ltdWxhdGUgYSBsaW5rIGNsaWNrIGZvciBlbGVtZW50cyB0aGF0IGNhbid0IGJlIDxhPiB0YWdzXG4gICAgICAgICAgICAgICAgLy8gZ3JhYiBiZWZvcmUgdHJpZ2dlciBmaXJlZCBpbiBjYXNlIHRyaWdnZXIgdHJhc2hlcyBET00gdGhydSByZXJlbmRlcmluZ1xuICAgICAgICAgICAgICAgIGxldCBoYXNVcmxDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5lbGVtZW50Q2xvc2VzdChldi50YXJnZXQsICcuZmMtZXZlbnQtZm9yY2VkLXVybCcpO1xuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBoYXNVcmxDb250YWluZXIgPyBoYXNVcmxDb250YWluZXIucXVlcnlTZWxlY3RvcignYVtocmVmXScpLmhyZWYgOiAnJztcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRDbGljaycsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHNlZ0VsLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IGludGVybmFsQ29tbW9uLkV2ZW50SW1wbChjb21wb25lbnQuY29udGV4dCwgc2VnLmV2ZW50UmFuZ2UuZGVmLCBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2LFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHVybCAmJiAhZXYuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGVzdHJveSA9IGludGVybmFsQ29tbW9uLmxpc3RlbkJ5U2VsZWN0b3Ioc2V0dGluZ3MuZWwsICdjbGljaycsICcuZmMtZXZlbnQnLCAvLyBvbiBib3RoIGZnIGFuZCBiZyBldmVudHNcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdDbGljayk7XG4gICAgfVxufVxuXG4vKlxuVHJpZ2dlcnMgZXZlbnRzIGFuZCBhZGRzL3JlbW92ZXMgY29yZSBjbGFzc05hbWVzIHdoZW4gdGhlIHVzZXIncyBwb2ludGVyXG5lbnRlcnMvbGVhdmVzIGV2ZW50LWVsZW1lbnRzIG9mIGEgY29tcG9uZW50LlxuKi9cbmNsYXNzIEV2ZW50SG92ZXJpbmcgZXh0ZW5kcyBpbnRlcm5hbENvbW1vbi5JbnRlcmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xuICAgICAgICAvLyBmb3Igc2ltdWxhdGluZyBhbiBldmVudE1vdXNlTGVhdmUgd2hlbiB0aGUgZXZlbnQgZWwgaXMgZGVzdHJveWVkIHdoaWxlIG1vdXNlIGlzIG92ZXIgaXRcbiAgICAgICAgdGhpcy5oYW5kbGVFdmVudEVsUmVtb3ZlID0gKGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoZWwgPT09IHRoaXMuY3VycmVudFNlZ0VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTZWdMZWF2ZShudWxsLCB0aGlzLmN1cnJlbnRTZWdFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlU2VnRW50ZXIgPSAoZXYsIHNlZ0VsKSA9PiB7XG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxDb21tb24uZ2V0RWxTZWcoc2VnRWwpKSB7IC8vIFRPRE86IGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIG5vdCBob3ZlcmluZyBvdmVyIG1vcmUrIGxpbmsgb3IgaXRzIHdyYXBwZXJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTZWdFbCA9IHNlZ0VsO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KCdldmVudE1vdXNlRW50ZXInLCBldiwgc2VnRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVNlZ0xlYXZlID0gKGV2LCBzZWdFbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNlZ0VsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2VnRWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlckV2ZW50KCdldmVudE1vdXNlTGVhdmUnLCBldiwgc2VnRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlbW92ZUhvdmVyTGlzdGVuZXJzID0gaW50ZXJuYWxDb21tb24ubGlzdGVuVG9Ib3ZlckJ5U2VsZWN0b3Ioc2V0dGluZ3MuZWwsICcuZmMtZXZlbnQnLCAvLyBvbiBib3RoIGZnIGFuZCBiZyBldmVudHNcbiAgICAgICAgdGhpcy5oYW5kbGVTZWdFbnRlciwgdGhpcy5oYW5kbGVTZWdMZWF2ZSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlSG92ZXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgdHJpZ2dlckV2ZW50KHB1YmxpY0V2TmFtZSwgZXYsIHNlZ0VsKSB7XG4gICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gY29tcG9uZW50O1xuICAgICAgICBsZXQgc2VnID0gaW50ZXJuYWxDb21tb24uZ2V0RWxTZWcoc2VnRWwpO1xuICAgICAgICBpZiAoIWV2IHx8IGNvbXBvbmVudC5pc1ZhbGlkU2VnRG93bkVsKGV2LnRhcmdldCkpIHtcbiAgICAgICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKHB1YmxpY0V2TmFtZSwge1xuICAgICAgICAgICAgICAgIGVsOiBzZWdFbCxcbiAgICAgICAgICAgICAgICBldmVudDogbmV3IGludGVybmFsQ29tbW9uLkV2ZW50SW1wbChjb250ZXh0LCBzZWcuZXZlbnRSYW5nZS5kZWYsIHNlZy5ldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgQ2FsZW5kYXJDb250ZW50IGV4dGVuZHMgaW50ZXJuYWxDb21tb24uUHVyZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3Q29udGV4dCA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoaW50ZXJuYWxDb21tb24uYnVpbGRWaWV3Q29udGV4dCk7XG4gICAgICAgIHRoaXMuYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyA9IGludGVybmFsQ29tbW9uLm1lbW9pemUoYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyk7XG4gICAgICAgIHRoaXMuYnVpbGRUb29sYmFyUHJvcHMgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplKGJ1aWxkVG9vbGJhclByb3BzKTtcbiAgICAgICAgdGhpcy5oZWFkZXJSZWYgPSBwcmVhY3QuY3JlYXRlUmVmKCk7XG4gICAgICAgIHRoaXMuZm9vdGVyUmVmID0gcHJlYWN0LmNyZWF0ZVJlZigpO1xuICAgICAgICB0aGlzLmludGVyYWN0aW9uc1N0b3JlID0ge307XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgdmlld0xhYmVsSWQ6IGludGVybmFsQ29tbW9uLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIENvbXBvbmVudCBSZWdpc3RyYXRpb25cbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgdGhpcy5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50ID0gKGNvbXBvbmVudCwgc2V0dGluZ3NJbnB1dCkgPT4ge1xuICAgICAgICAgICAgbGV0IHNldHRpbmdzID0gaW50ZXJuYWxDb21tb24ucGFyc2VJbnRlcmFjdGlvblNldHRpbmdzKGNvbXBvbmVudCwgc2V0dGluZ3NJbnB1dCk7XG4gICAgICAgICAgICBsZXQgREVGQVVMVF9JTlRFUkFDVElPTlMgPSBbXG4gICAgICAgICAgICAgICAgRXZlbnRDbGlja2luZyxcbiAgICAgICAgICAgICAgICBFdmVudEhvdmVyaW5nLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxldCBpbnRlcmFjdGlvbkNsYXNzZXMgPSBERUZBVUxUX0lOVEVSQUNUSU9OUy5jb25jYXQodGhpcy5wcm9wcy5wbHVnaW5Ib29rcy5jb21wb25lbnRJbnRlcmFjdGlvbnMpO1xuICAgICAgICAgICAgbGV0IGludGVyYWN0aW9ucyA9IGludGVyYWN0aW9uQ2xhc3Nlcy5tYXAoKFRoZUludGVyYWN0aW9uQ2xhc3MpID0+IG5ldyBUaGVJbnRlcmFjdGlvbkNsYXNzKHNldHRpbmdzKSk7XG4gICAgICAgICAgICB0aGlzLmludGVyYWN0aW9uc1N0b3JlW2NvbXBvbmVudC51aWRdID0gaW50ZXJhY3Rpb25zO1xuICAgICAgICAgICAgaW50ZXJuYWxDb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlW2NvbXBvbmVudC51aWRdID0gc2V0dGluZ3M7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudW5yZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50ID0gKGNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxpc3RlbmVycyA9IHRoaXMuaW50ZXJhY3Rpb25zU3RvcmVbY29tcG9uZW50LnVpZF07XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuaW50ZXJhY3Rpb25zU3RvcmVbY29tcG9uZW50LnVpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgaW50ZXJuYWxDb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlW2NvbXBvbmVudC51aWRdO1xuICAgICAgICB9O1xuICAgICAgICAvLyBSZXNpemluZ1xuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLnJlc2l6ZVJ1bm5lciA9IG5ldyBpbnRlcm5hbENvbW1vbi5EZWxheWVkUnVubmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCdfcmVzaXplJywgdHJ1ZSk7IC8vIHNob3VsZCB3aW5kb3cgcmVzaXplcyBiZSBjb25zaWRlcmVkIFwiZm9yY2VkXCIgP1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5lbWl0dGVyLnRyaWdnZXIoJ3dpbmRvd1Jlc2l6ZScsIHsgdmlldzogdGhpcy5wcm9wcy52aWV3QXBpIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oYW5kbGVXaW5kb3dSZXNpemUgJiZcbiAgICAgICAgICAgICAgICBldi50YXJnZXQgPT09IHdpbmRvdyAvLyBhdm9pZCBqcXVpIGV2ZW50c1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVSdW5uZXIucmVxdWVzdChvcHRpb25zLndpbmRvd1Jlc2l6ZURlbGF5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgLypcbiAgICByZW5kZXJzIElOU0lERSBvZiBhbiBvdXRlciBkaXZcbiAgICAqL1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHRvb2xiYXJDb25maWcsIG9wdGlvbnMgfSA9IHByb3BzO1xuICAgICAgICBsZXQgdG9vbGJhclByb3BzID0gdGhpcy5idWlsZFRvb2xiYXJQcm9wcyhwcm9wcy52aWV3U3BlYywgcHJvcHMuZGF0ZVByb2ZpbGUsIHByb3BzLmRhdGVQcm9maWxlR2VuZXJhdG9yLCBwcm9wcy5jdXJyZW50RGF0ZSwgaW50ZXJuYWxDb21tb24uZ2V0Tm93KHByb3BzLm9wdGlvbnMubm93LCBwcm9wcy5kYXRlRW52KSwgLy8gVE9ETzogdXNlIE5vd1RpbWVyPz8/P1xuICAgICAgICBwcm9wcy52aWV3VGl0bGUpO1xuICAgICAgICBsZXQgdmlld1ZHcm93ID0gZmFsc2U7XG4gICAgICAgIGxldCB2aWV3SGVpZ2h0ID0gJyc7XG4gICAgICAgIGxldCB2aWV3QXNwZWN0UmF0aW87XG4gICAgICAgIGlmIChwcm9wcy5pc0hlaWdodEF1dG8gfHwgcHJvcHMuZm9yUHJpbnQpIHtcbiAgICAgICAgICAgIHZpZXdIZWlnaHQgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2aWV3Vkdyb3cgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuY29udGVudEhlaWdodCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2aWV3SGVpZ2h0ID0gb3B0aW9ucy5jb250ZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmlld0FzcGVjdFJhdGlvID0gTWF0aC5tYXgob3B0aW9ucy5hc3BlY3RSYXRpbywgMC41KTsgLy8gcHJldmVudCBmcm9tIGdldHRpbmcgdG9vIHRhbGxcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlld0NvbnRleHQgPSB0aGlzLmJ1aWxkVmlld0NvbnRleHQocHJvcHMudmlld1NwZWMsIHByb3BzLnZpZXdBcGksIHByb3BzLm9wdGlvbnMsIHByb3BzLmRhdGVQcm9maWxlR2VuZXJhdG9yLCBwcm9wcy5kYXRlRW52LCBwcm9wcy50aGVtZSwgcHJvcHMucGx1Z2luSG9va3MsIHByb3BzLmRpc3BhdGNoLCBwcm9wcy5nZXRDdXJyZW50RGF0YSwgcHJvcHMuZW1pdHRlciwgcHJvcHMuY2FsZW5kYXJBcGksIHRoaXMucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCwgdGhpcy51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQpO1xuICAgICAgICBsZXQgdmlld0xhYmVsSWQgPSAodG9vbGJhckNvbmZpZy5oZWFkZXIgJiYgdG9vbGJhckNvbmZpZy5oZWFkZXIuaGFzVGl0bGUpXG4gICAgICAgICAgICA/IHRoaXMuc3RhdGUudmlld0xhYmVsSWRcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxDb21tb24uVmlld0NvbnRleHRUeXBlLlByb3ZpZGVyLCB7IHZhbHVlOiB2aWV3Q29udGV4dCB9LFxuICAgICAgICAgICAgdG9vbGJhckNvbmZpZy5oZWFkZXIgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFRvb2xiYXIsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRoaXMuaGVhZGVyUmVmLCBleHRyYUNsYXNzTmFtZTogXCJmYy1oZWFkZXItdG9vbGJhclwiLCBtb2RlbDogdG9vbGJhckNvbmZpZy5oZWFkZXIsIHRpdGxlSWQ6IHZpZXdMYWJlbElkIH0sIHRvb2xiYXJQcm9wcykpKSxcbiAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KFZpZXdIYXJuZXNzLCB7IGxpcXVpZDogdmlld1ZHcm93LCBoZWlnaHQ6IHZpZXdIZWlnaHQsIGFzcGVjdFJhdGlvOiB2aWV3QXNwZWN0UmF0aW8sIGxhYmVsZWRCeUlkOiB2aWV3TGFiZWxJZCB9LFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyVmlldyhwcm9wcyksXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEFwcGVuZENvbnRlbnQoKSksXG4gICAgICAgICAgICB0b29sYmFyQ29uZmlnLmZvb3RlciAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbGJhciwgT2JqZWN0LmFzc2lnbih7IHJlZjogdGhpcy5mb290ZXJSZWYsIGV4dHJhQ2xhc3NOYW1lOiBcImZjLWZvb3Rlci10b29sYmFyXCIsIG1vZGVsOiB0b29sYmFyQ29uZmlnLmZvb3RlciwgdGl0bGVJZDogXCJcIiB9LCB0b29sYmFyUHJvcHMpKSkpKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICB0aGlzLmNhbGVuZGFySW50ZXJhY3Rpb25zID0gcHJvcHMucGx1Z2luSG9va3MuY2FsZW5kYXJJbnRlcmFjdGlvbnNcbiAgICAgICAgICAgIC5tYXAoKENhbGVuZGFySW50ZXJhY3Rpb25DbGFzcykgPT4gbmV3IENhbGVuZGFySW50ZXJhY3Rpb25DbGFzcyhwcm9wcykpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUpO1xuICAgICAgICBsZXQgeyBwcm9wU2V0SGFuZGxlcnMgfSA9IHByb3BzLnBsdWdpbkhvb2tzO1xuICAgICAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBwcm9wU2V0SGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHByb3BTZXRIYW5kbGVyc1twcm9wTmFtZV0ocHJvcHNbcHJvcE5hbWVdLCBwcm9wcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgcHJvcFNldEhhbmRsZXJzIH0gPSBwcm9wcy5wbHVnaW5Ib29rcztcbiAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gcHJvcFNldEhhbmRsZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbcHJvcE5hbWVdICE9PSBwcmV2UHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcHJvcFNldEhhbmRsZXJzW3Byb3BOYW1lXShwcm9wc1twcm9wTmFtZV0sIHByb3BzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICAgICAgdGhpcy5yZXNpemVSdW5uZXIuY2xlYXIoKTtcbiAgICAgICAgZm9yIChsZXQgaW50ZXJhY3Rpb24gb2YgdGhpcy5jYWxlbmRhckludGVyYWN0aW9ucykge1xuICAgICAgICAgICAgaW50ZXJhY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcHMuZW1pdHRlci50cmlnZ2VyKCdfdW5tb3VudCcpO1xuICAgIH1cbiAgICBidWlsZEFwcGVuZENvbnRlbnQoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBwcm9wcy5wbHVnaW5Ib29rcy52aWV3Q29udGFpbmVyQXBwZW5kcy5tYXAoKGJ1aWxkQXBwZW5kQ29udGVudCkgPT4gYnVpbGRBcHBlbmRDb250ZW50KHByb3BzKSk7XG4gICAgICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudChwcmVhY3QuRnJhZ21lbnQsIHt9LCAuLi5jaGlsZHJlbik7XG4gICAgfVxuICAgIHJlbmRlclZpZXcocHJvcHMpIHtcbiAgICAgICAgbGV0IHsgcGx1Z2luSG9va3MgfSA9IHByb3BzO1xuICAgICAgICBsZXQgeyB2aWV3U3BlYyB9ID0gcHJvcHM7XG4gICAgICAgIGxldCB2aWV3UHJvcHMgPSB7XG4gICAgICAgICAgICBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICBidXNpbmVzc0hvdXJzOiBwcm9wcy5idXNpbmVzc0hvdXJzLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogcHJvcHMucmVuZGVyYWJsZUV2ZW50U3RvcmUsXG4gICAgICAgICAgICBldmVudFVpQmFzZXM6IHByb3BzLmV2ZW50VWlCYXNlcyxcbiAgICAgICAgICAgIGRhdGVTZWxlY3Rpb246IHByb3BzLmRhdGVTZWxlY3Rpb24sXG4gICAgICAgICAgICBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sXG4gICAgICAgICAgICBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZyxcbiAgICAgICAgICAgIGV2ZW50UmVzaXplOiBwcm9wcy5ldmVudFJlc2l6ZSxcbiAgICAgICAgICAgIGlzSGVpZ2h0QXV0bzogcHJvcHMuaXNIZWlnaHRBdXRvLFxuICAgICAgICAgICAgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50LFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdHJhbnNmb3JtZXJzID0gdGhpcy5idWlsZFZpZXdQcm9wVHJhbnNmb3JtZXJzKHBsdWdpbkhvb2tzLnZpZXdQcm9wc1RyYW5zZm9ybWVycyk7XG4gICAgICAgIGZvciAobGV0IHRyYW5zZm9ybWVyIG9mIHRyYW5zZm9ybWVycykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih2aWV3UHJvcHMsIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2aWV3UHJvcHMsIHByb3BzKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFZpZXdDb21wb25lbnQgPSB2aWV3U3BlYy5jb21wb25lbnQ7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld0NvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdmlld1Byb3BzKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkVG9vbGJhclByb3BzKHZpZXdTcGVjLCBkYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IsIGN1cnJlbnREYXRlLCBub3csIHRpdGxlKSB7XG4gICAgLy8gZG9uJ3QgZm9yY2UgYW55IGRhdGUtcHJvZmlsZXMgdG8gdmFsaWQgZGF0ZSBwcm9maWxlcyAodGhlIGBmYWxzZWApIHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgaXQncyBpbnZhbGlkXG4gICAgbGV0IHRvZGF5SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkKG5vdywgdW5kZWZpbmVkLCBmYWxzZSk7IC8vIFRPRE86IG5lZWQgYHVuZGVmaW5lZGAgb3IgZWxzZSBJTkZJTklURSBMT09QIGZvciBzb21lIHJlYXNvblxuICAgIGxldCBwcmV2SW5mbyA9IGRhdGVQcm9maWxlR2VuZXJhdG9yLmJ1aWxkUHJldihkYXRlUHJvZmlsZSwgY3VycmVudERhdGUsIGZhbHNlKTtcbiAgICBsZXQgbmV4dEluZm8gPSBkYXRlUHJvZmlsZUdlbmVyYXRvci5idWlsZE5leHQoZGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmYWxzZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGFjdGl2ZUJ1dHRvbjogdmlld1NwZWMudHlwZSxcbiAgICAgICAgbmF2VW5pdDogdmlld1NwZWMuc2luZ2xlVW5pdCxcbiAgICAgICAgaXNUb2RheUVuYWJsZWQ6IHRvZGF5SW5mby5pc1ZhbGlkICYmICFpbnRlcm5hbENvbW1vbi5yYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZSwgbm93KSxcbiAgICAgICAgaXNQcmV2RW5hYmxlZDogcHJldkluZm8uaXNWYWxpZCxcbiAgICAgICAgaXNOZXh0RW5hYmxlZDogbmV4dEluZm8uaXNWYWxpZCxcbiAgICB9O1xufVxuLy8gUGx1Z2luXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gYnVpbGRWaWV3UHJvcFRyYW5zZm9ybWVycyh0aGVDbGFzc2VzKSB7XG4gICAgcmV0dXJuIHRoZUNsYXNzZXMubWFwKChUaGVDbGFzcykgPT4gbmV3IFRoZUNsYXNzKCkpO1xufVxuXG5jbGFzcyBDYWxlbmRhciBleHRlbmRzIGludGVybmFsQ29tbW9uLkNhbGVuZGFySW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWwsIG9wdGlvbk92ZXJyaWRlcyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1JlbmRlcmVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudENsYXNzTmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXN0b21Db250ZW50UmVuZGVySWQgPSAwO1xuICAgICAgICB0aGlzLmhhbmRsZUFjdGlvbiA9IChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIC8vIGFjdGlvbnMgd2Uga25vdyB3ZSB3YW50IHRvIHJlbmRlciBpbW1lZGlhdGVseVxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1NFVF9FVkVOVF9EUkFHJzpcbiAgICAgICAgICAgICAgICBjYXNlICdTRVRfRVZFTlRfUkVTSVpFJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIudHJ5RHJhaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEYXRhID0gKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVxdWVzdChkYXRhLmNhbGVuZGFyT3B0aW9ucy5yZXJlbmRlckRlbGF5KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZW5kZXJSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSZW5kZXJpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVuZGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCB7IGN1cnJlbnREYXRhIH0gPSB0aGlzO1xuICAgICAgICAgICAgICAgIGludGVybmFsQ29tbW9uLmZsdXNoU3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHByZWFjdC5yZW5kZXIocHJlYWN0LmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxDb21tb24uQ2FsZW5kYXJSb290LCB7IG9wdGlvbnM6IGN1cnJlbnREYXRhLmNhbGVuZGFyT3B0aW9ucywgdGhlbWU6IGN1cnJlbnREYXRhLnRoZW1lLCBlbWl0dGVyOiBjdXJyZW50RGF0YS5lbWl0dGVyIH0sIChjbGFzc05hbWVzLCBoZWlnaHQsIGlzSGVpZ2h0QXV0bywgZm9yUHJpbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KGhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KGludGVybmFsQ29tbW9uLlJlbmRlcklkLlByb3ZpZGVyLCB7IHZhbHVlOiB0aGlzLmN1c3RvbUNvbnRlbnRSZW5kZXJJZCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KENhbGVuZGFyQ29udGVudCwgT2JqZWN0LmFzc2lnbih7IGlzSGVpZ2h0QXV0bzogaXNIZWlnaHRBdXRvLCBmb3JQcmludDogZm9yUHJpbnQgfSwgY3VycmVudERhdGEpKSkpO1xuICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5lbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwcmVhY3QucmVuZGVyKG51bGwsIHRoaXMuZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xhc3NOYW1lcyhbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpbnRlcm5hbENvbW1vbi5lbnN1cmVFbEhhc1N0eWxlcyhlbCk7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIgPSBuZXcgaW50ZXJuYWxDb21tb24uRGVsYXllZFJ1bm5lcih0aGlzLmhhbmRsZVJlbmRlclJlcXVlc3QpO1xuICAgICAgICBuZXcgQ2FsZW5kYXJEYXRhTWFuYWdlcih7XG4gICAgICAgICAgICBvcHRpb25PdmVycmlkZXMsXG4gICAgICAgICAgICBjYWxlbmRhckFwaTogdGhpcyxcbiAgICAgICAgICAgIG9uQWN0aW9uOiB0aGlzLmhhbmRsZUFjdGlvbixcbiAgICAgICAgICAgIG9uRGF0YTogdGhpcy5oYW5kbGVEYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgd2FzUmVuZGVyaW5nID0gdGhpcy5pc1JlbmRlcmluZztcbiAgICAgICAgaWYgKCF3YXNSZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21Db250ZW50UmVuZGVySWQgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbmRlclJ1bm5lci5yZXF1ZXN0KCk7XG4gICAgICAgIGlmICh3YXNSZW5kZXJpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVuZGVyaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlbmRlclJ1bm5lci5yZXF1ZXN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlU2l6ZSgpIHtcbiAgICAgICAgaW50ZXJuYWxDb21tb24uZmx1c2hTeW5jKCgpID0+IHtcbiAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGJhdGNoUmVuZGVyaW5nKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucGF1c2UoJ2JhdGNoUmVuZGVyaW5nJyk7XG4gICAgICAgIGZ1bmMoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVzdW1lKCdiYXRjaFJlbmRlcmluZycpO1xuICAgIH1cbiAgICBwYXVzZVJlbmRlcmluZygpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucGF1c2UoJ3BhdXNlUmVuZGVyaW5nJyk7XG4gICAgfVxuICAgIHJlc3VtZVJlbmRlcmluZygpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJSdW5uZXIucmVzdW1lKCdwYXVzZVJlbmRlcmluZycsIHRydWUpO1xuICAgIH1cbiAgICByZXNldE9wdGlvbnMob3B0aW9uT3ZlcnJpZGVzLCBjaGFuZ2VkT3B0aW9uTmFtZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIucmVzZXRPcHRpb25zKG9wdGlvbk92ZXJyaWRlcywgY2hhbmdlZE9wdGlvbk5hbWVzKTtcbiAgICB9XG4gICAgc2V0Q2xhc3NOYW1lcyhjbGFzc05hbWVzKSB7XG4gICAgICAgIGlmICghaW50ZXJuYWxDb21tb24uaXNBcnJheXNFcXVhbChjbGFzc05hbWVzLCB0aGlzLmN1cnJlbnRDbGFzc05hbWVzKSkge1xuICAgICAgICAgICAgbGV0IHsgY2xhc3NMaXN0IH0gPSB0aGlzLmVsO1xuICAgICAgICAgICAgZm9yIChsZXQgY2xhc3NOYW1lIG9mIHRoaXMuY3VycmVudENsYXNzTmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBjbGFzc05hbWUgb2YgY2xhc3NOYW1lcykge1xuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY3VycmVudENsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEhlaWdodChoZWlnaHQpIHtcbiAgICAgICAgaW50ZXJuYWxDb21tb24uYXBwbHlTdHlsZVByb3AodGhpcy5lbCwgJ2hlaWdodCcsIGhlaWdodCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGRhdGVJbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGRhdGVFbnYgPSBidWlsZERhdGVFbnYob3B0aW9ucyk7XG4gICAgbGV0IGZvcm1hdHRlciA9IGludGVybmFsQ29tbW9uLmNyZWF0ZUZvcm1hdHRlcihvcHRpb25zKTtcbiAgICBsZXQgZGF0ZU1ldGEgPSBkYXRlRW52LmNyZWF0ZU1hcmtlck1ldGEoZGF0ZUlucHV0KTtcbiAgICBpZiAoIWRhdGVNZXRhKSB7IC8vIFRPRE86IHdhcm5pbmc/XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGRhdGVNZXRhLm1hcmtlciwgZm9ybWF0dGVyLCB7XG4gICAgICAgIGZvcmNlZFR6bzogZGF0ZU1ldGEuZm9yY2VkVHpvLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gZm9ybWF0UmFuZ2Uoc3RhcnRJbnB1dCwgZW5kSW5wdXQsIG9wdGlvbnMpIHtcbiAgICBsZXQgZGF0ZUVudiA9IGJ1aWxkRGF0ZUVudih0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucyA/IG9wdGlvbnMgOiB7fSk7IC8vIHBhc3MgaW4gaWYgbm9uLW51bGwgb2JqZWN0XG4gICAgbGV0IGZvcm1hdHRlciA9IGludGVybmFsQ29tbW9uLmNyZWF0ZUZvcm1hdHRlcihvcHRpb25zKTtcbiAgICBsZXQgc3RhcnRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YXJ0SW5wdXQpO1xuICAgIGxldCBlbmRNZXRhID0gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKGVuZElucHV0KTtcbiAgICBpZiAoIXN0YXJ0TWV0YSB8fCAhZW5kTWV0YSkgeyAvLyBUT0RPOiB3YXJuaW5nP1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKHN0YXJ0TWV0YS5tYXJrZXIsIGVuZE1ldGEubWFya2VyLCBmb3JtYXR0ZXIsIHtcbiAgICAgICAgZm9yY2VkU3RhcnRUem86IHN0YXJ0TWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGZvcmNlZEVuZFR6bzogZW5kTWV0YS5mb3JjZWRUem8sXG4gICAgICAgIGlzRW5kRXhjbHVzaXZlOiBvcHRpb25zLmlzRW5kRXhjbHVzaXZlLFxuICAgICAgICBkZWZhdWx0U2VwYXJhdG9yOiBpbnRlcm5hbENvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUy5kZWZhdWx0UmFuZ2VTZXBhcmF0b3IsXG4gICAgfSk7XG59XG4vLyBUT0RPOiBtb3JlIERSWSBhbmQgb3B0aW1pemVkXG5mdW5jdGlvbiBidWlsZERhdGVFbnYoc2V0dGluZ3MpIHtcbiAgICBsZXQgbG9jYWxlID0gYnVpbGRMb2NhbGUoc2V0dGluZ3MubG9jYWxlIHx8ICdlbicsIG9yZ2FuaXplUmF3TG9jYWxlcyhbXSkubWFwKTsgLy8gVE9ETzogZG9uJ3QgaGFyZGNvZGUgJ2VuJyBldmVyeXdoZXJlXG4gICAgcmV0dXJuIG5ldyBpbnRlcm5hbENvbW1vbi5EYXRlRW52KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IHRpbWVab25lOiBpbnRlcm5hbENvbW1vbi5CQVNFX09QVElPTl9ERUZBVUxUUy50aW1lWm9uZSwgY2FsZW5kYXJTeXN0ZW06ICdncmVnb3J5JyB9LCBzZXR0aW5ncyksIHsgbG9jYWxlIH0pKTtcbn1cblxuLy8gSEVMUEVSU1xuLypcbmlmIG5leHREYXlUaHJlc2hvbGQgaXMgc3BlY2lmaWVkLCBzbGljaW5nIGlzIGRvbmUgaW4gYW4gYWxsLWRheSBmYXNoaW9uLlxueW91IGNhbiBnZXQgbmV4dERheVRocmVzaG9sZCBmcm9tIGNvbnRleHQubmV4dERheVRocmVzaG9sZFxuKi9cbmZ1bmN0aW9uIHNsaWNlRXZlbnRzKHByb3BzLCBhbGxEYXkpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxDb21tb24uc2xpY2VFdmVudFN0b3JlKHByb3BzLmV2ZW50U3RvcmUsIHByb3BzLmV2ZW50VWlCYXNlcywgcHJvcHMuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGFsbERheSA/IHByb3BzLm5leHREYXlUaHJlc2hvbGQgOiBudWxsKS5mZztcbn1cblxuY29uc3QgdmVyc2lvbiA9ICc2LjEuOCc7XG5cbmV4cG9ydHMuSnNvblJlcXVlc3RFcnJvciA9IGludGVybmFsQ29tbW9uLkpzb25SZXF1ZXN0RXJyb3I7XG5leHBvcnRzLkNhbGVuZGFyID0gQ2FsZW5kYXI7XG5leHBvcnRzLmNyZWF0ZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbjtcbmV4cG9ydHMuZm9ybWF0RGF0ZSA9IGZvcm1hdERhdGU7XG5leHBvcnRzLmZvcm1hdFJhbmdlID0gZm9ybWF0UmFuZ2U7XG5leHBvcnRzLmdsb2JhbExvY2FsZXMgPSBnbG9iYWxMb2NhbGVzO1xuZXhwb3J0cy5nbG9iYWxQbHVnaW5zID0gZ2xvYmFsUGx1Z2lucztcbmV4cG9ydHMuc2xpY2VFdmVudHMgPSBzbGljZUV2ZW50cztcbmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBwcmVhY3QgPSByZXF1aXJlKCdwcmVhY3QnKTtcbnZhciBjb21wYXQgPSByZXF1aXJlKCdwcmVhY3QvY29tcGF0Jyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wTmFtZXNwYWNlKGUpIHtcbiAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHJldHVybiBlO1xuICAgIHZhciBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoZSkge1xuICAgICAgICBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgICBpZiAoayAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIGspO1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBrLCBkLmdldCA/IGQgOiB7XG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZVtrXTsgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbltcImRlZmF1bHRcIl0gPSBlO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKG4pO1xufVxuXG52YXIgcHJlYWN0X19uYW1lc3BhY2UgPSAvKiNfX1BVUkVfXyovX2ludGVyb3BOYW1lc3BhY2UocHJlYWN0KTtcblxuY29uc3Qgc3R5bGVUZXh0cyA9IFtdO1xuY29uc3Qgc3R5bGVFbHMgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBpbmplY3RTdHlsZXMoc3R5bGVUZXh0KSB7XG4gICAgc3R5bGVUZXh0cy5wdXNoKHN0eWxlVGV4dCk7XG4gICAgc3R5bGVFbHMuZm9yRWFjaCgoc3R5bGVFbCkgPT4ge1xuICAgICAgICBhcHBlbmRTdHlsZXNUbyhzdHlsZUVsLCBzdHlsZVRleHQpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZW5zdXJlRWxIYXNTdHlsZXMoZWwpIHtcbiAgICBpZiAoZWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgcmVnaXN0ZXJTdHlsZXNSb290KGVsLmdldFJvb3ROb2RlKCkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyU3R5bGVzUm9vdChyb290Tm9kZSkge1xuICAgIGxldCBzdHlsZUVsID0gc3R5bGVFbHMuZ2V0KHJvb3ROb2RlKTtcbiAgICBpZiAoIXN0eWxlRWwgfHwgIXN0eWxlRWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgc3R5bGVFbCA9IHJvb3ROb2RlLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtZnVsbGNhbGVuZGFyXScpO1xuICAgICAgICBpZiAoIXN0eWxlRWwpIHtcbiAgICAgICAgICAgIHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgc3R5bGVFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZnVsbGNhbGVuZGFyJywgJycpO1xuICAgICAgICAgICAgY29uc3Qgbm9uY2UgPSBnZXROb25jZVZhbHVlKCk7XG4gICAgICAgICAgICBpZiAobm9uY2UpIHtcbiAgICAgICAgICAgICAgICBzdHlsZUVsLm5vbmNlID0gbm9uY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbCA9IHJvb3ROb2RlID09PSBkb2N1bWVudCA/IGRvY3VtZW50LmhlYWQgOiByb290Tm9kZTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IHJvb3ROb2RlID09PSBkb2N1bWVudFxuICAgICAgICAgICAgICAgID8gcGFyZW50RWwucXVlcnlTZWxlY3Rvcignc2NyaXB0LGxpbmtbcmVsPXN0eWxlc2hlZXRdLGxpbmtbYXM9c3R5bGVdLHN0eWxlJylcbiAgICAgICAgICAgICAgICA6IHBhcmVudEVsLmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUoc3R5bGVFbCwgaW5zZXJ0QmVmb3JlKTtcbiAgICAgICAgfVxuICAgICAgICBzdHlsZUVscy5zZXQocm9vdE5vZGUsIHN0eWxlRWwpO1xuICAgICAgICBoeWRyYXRlU3R5bGVzUm9vdChzdHlsZUVsKTtcbiAgICB9XG59XG5mdW5jdGlvbiBoeWRyYXRlU3R5bGVzUm9vdChzdHlsZUVsKSB7XG4gICAgZm9yIChjb25zdCBzdHlsZVRleHQgb2Ygc3R5bGVUZXh0cykge1xuICAgICAgICBhcHBlbmRTdHlsZXNUbyhzdHlsZUVsLCBzdHlsZVRleHQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGVuZFN0eWxlc1RvKHN0eWxlRWwsIHN0eWxlVGV4dCkge1xuICAgIGNvbnN0IHsgc2hlZXQgfSA9IHN0eWxlRWw7XG4gICAgY29uc3QgcnVsZUNudCA9IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDtcbiAgICBzdHlsZVRleHQuc3BsaXQoJ30nKS5mb3JFYWNoKChzdHlsZVN0ciwgaSkgPT4ge1xuICAgICAgICBzdHlsZVN0ciA9IHN0eWxlU3RyLnRyaW0oKTtcbiAgICAgICAgaWYgKHN0eWxlU3RyKSB7XG4gICAgICAgICAgICBzaGVldC5pbnNlcnRSdWxlKHN0eWxlU3RyICsgJ30nLCBydWxlQ250ICsgaSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIG5vbmNlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5sZXQgcXVlcmllZE5vbmNlVmFsdWU7XG5mdW5jdGlvbiBnZXROb25jZVZhbHVlKCkge1xuICAgIGlmIChxdWVyaWVkTm9uY2VWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXJpZWROb25jZVZhbHVlID0gcXVlcnlOb25jZVZhbHVlKCk7XG4gICAgfVxuICAgIHJldHVybiBxdWVyaWVkTm9uY2VWYWx1ZTtcbn1cbi8qXG5UT0RPOiBkaXNjb3VyYWdlIG1ldGEgdGFnIGFuZCBpbnN0ZWFkIHB1dCBub25jZSBhdHRyaWJ1dGUgb24gcGxhY2Vob2xkZXIgPHN0eWxlPiB0YWdcbiovXG5mdW5jdGlvbiBxdWVyeU5vbmNlVmFsdWUoKSB7XG4gICAgY29uc3QgbWV0YVdpdGhOb25jZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcC1ub25jZVwiXScpO1xuICAgIGlmIChtZXRhV2l0aE5vbmNlICYmIG1ldGFXaXRoTm9uY2UuaGFzQXR0cmlidXRlKCdjb250ZW50JykpIHtcbiAgICAgICAgcmV0dXJuIG1ldGFXaXRoTm9uY2UuZ2V0QXR0cmlidXRlKCdjb250ZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IGVsV2l0aE5vbmNlID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W25vbmNlXScpO1xuICAgIGlmIChlbFdpdGhOb25jZSkge1xuICAgICAgICByZXR1cm4gZWxXaXRoTm9uY2Uubm9uY2UgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cbi8vIG1haW5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmVnaXN0ZXJTdHlsZXNSb290KGRvY3VtZW50KTtcbn1cblxudmFyIGNzc18yNDh6ID0gXCI6cm9vdHstLWZjLXNtYWxsLWZvbnQtc2l6ZTouODVlbTstLWZjLXBhZ2UtYmctY29sb3I6I2ZmZjstLWZjLW5ldXRyYWwtYmctY29sb3I6aHNsYSgwLDAlLDgyJSwuMyk7LS1mYy1uZXV0cmFsLXRleHQtY29sb3I6Z3JleTstLWZjLWJvcmRlci1jb2xvcjojZGRkOy0tZmMtYnV0dG9uLXRleHQtY29sb3I6I2ZmZjstLWZjLWJ1dHRvbi1iZy1jb2xvcjojMmMzZTUwOy0tZmMtYnV0dG9uLWJvcmRlci1jb2xvcjojMmMzZTUwOy0tZmMtYnV0dG9uLWhvdmVyLWJnLWNvbG9yOiMxZTJiMzc7LS1mYy1idXR0b24taG92ZXItYm9yZGVyLWNvbG9yOiMxYTI1MmY7LS1mYy1idXR0b24tYWN0aXZlLWJnLWNvbG9yOiMxYTI1MmY7LS1mYy1idXR0b24tYWN0aXZlLWJvcmRlci1jb2xvcjojMTUxZTI3Oy0tZmMtZXZlbnQtYmctY29sb3I6IzM3ODhkODstLWZjLWV2ZW50LWJvcmRlci1jb2xvcjojMzc4OGQ4Oy0tZmMtZXZlbnQtdGV4dC1jb2xvcjojZmZmOy0tZmMtZXZlbnQtc2VsZWN0ZWQtb3ZlcmxheS1jb2xvcjpyZ2JhKDAsMCwwLC4yNSk7LS1mYy1tb3JlLWxpbmstYmctY29sb3I6I2QwZDBkMDstLWZjLW1vcmUtbGluay10ZXh0LWNvbG9yOmluaGVyaXQ7LS1mYy1ldmVudC1yZXNpemVyLXRoaWNrbmVzczo4cHg7LS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aDo4cHg7LS1mYy1ldmVudC1yZXNpemVyLWRvdC1ib3JkZXItd2lkdGg6MXB4Oy0tZmMtbm9uLWJ1c2luZXNzLWNvbG9yOmhzbGEoMCwwJSw4NCUsLjMpOy0tZmMtYmctZXZlbnQtY29sb3I6IzhmZGY4MjstLWZjLWJnLWV2ZW50LW9wYWNpdHk6MC4zOy0tZmMtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMTg4LDIzMiwyNDEsLjMpOy0tZmMtdG9kYXktYmctY29sb3I6cmdiYSgyNTUsMjIwLDQwLC4xNSk7LS1mYy1ub3ctaW5kaWNhdG9yLWNvbG9yOnJlZH0uZmMtbm90LWFsbG93ZWQsLmZjLW5vdC1hbGxvd2VkIC5mYy1ldmVudHtjdXJzb3I6bm90LWFsbG93ZWR9LmZje2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOjFlbX0uZmMsLmZjICosLmZjIDphZnRlciwuZmMgOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9LmZjIHRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowO2ZvbnQtc2l6ZToxZW19LmZjIHRoe3RleHQtYWxpZ246Y2VudGVyfS5mYyB0ZCwuZmMgdGh7cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOnRvcH0uZmMgYVtkYXRhLW5hdmxpbmtde2N1cnNvcjpwb2ludGVyfS5mYyBhW2RhdGEtbmF2bGlua106aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZmMtZGlyZWN0aW9uLWx0cntkaXJlY3Rpb246bHRyO3RleHQtYWxpZ246bGVmdH0uZmMtZGlyZWN0aW9uLXJ0bHtkaXJlY3Rpb246cnRsO3RleHQtYWxpZ246cmlnaHR9LmZjLXRoZW1lLXN0YW5kYXJkIHRkLC5mYy10aGVtZS1zdGFuZGFyZCB0aHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWZjLWJvcmRlci1jb2xvcil9LmZjLWxpcXVpZC1oYWNrIHRkLC5mYy1saXF1aWQtaGFjayB0aHtwb3NpdGlvbjpyZWxhdGl2ZX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OmZjaWNvbnM7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3NyYzp1cmwoXFxcImRhdGE6YXBwbGljYXRpb24veC1mb250LXR0ZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxBQUVBQUFBTEFJQUFBd0F3VDFNdk1nOFNCZkFBQUFDOEFBQUFZR050WVhBWFZ0S05BQUFCSEFBQUFGUm5ZWE53QUFBQUVBQUFBWEFBQUFBSVoyeDVaZ1l5ZHhJQUFBRjRBQUFGTkdobFlXUVVKN2NJQUFBR3JBQUFBRFpvYUdWaEIyMER6QUFBQnVRQUFBQWthRzEwZUNJQUJoUUFBQWNJQUFBQUxHeHZZMkVENEFVNkFBQUhOQUFBQUJodFlYaHdBQThBakFBQUIwd0FBQUFnYm1GdFpYc3I2OTBBQUFkc0FBQUJobkJ2YzNRQUF3QUFBQUFJOUFBQUFDQUFBd1BBQVpBQUJRQUFBcGtDekFBQUFJOENtUUxNQUFBQjZ3QXpBUWtBQUFBQUFBQUFBQUFBQUFBQUFBQUJFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQURwQmdQQS84QUFRQVBBQUVBQUFBQUJBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQURBQUFBQXdBQUFCd0FBUUFEQUFBQUhBQURBQUVBQUFBY0FBUUFPQUFBQUFvQUNBQUNBQUlBQVFBZzZRYi8vZi8vQUFBQUFBQWc2UUQvL2YvL0FBSC80eGNFQUFNQUFRQUFBQUFBQUFBQUFBQUFBUUFCLy84QUR3QUJBQUFBQUFBQUFBQUFBZ0FBTnprQkFBQUFBQUVBQUFBQUFBQUFBQUFDQUFBM09RRUFBQUFBQVFBQUFBQUFBQUFBQUFJQUFEYzVBUUFBQUFBQkFXSUFqUUtlQXNrQUV3QUFKU2MzTmpRbkppSUhBUVlVRndFV01qYzJOQ2NDbnVMaURRME1KQXovQUEwTkFRQU1KQXdORGNuaTRnd2pEUXdNL3dBTkl3ei9BQTBORENNTkFBQUFBUUZpQUkwQ25nTEpBQk1BQUNVQk5qUW5BU1lpQndZVUh3RUhCaFFYRmpJM0FaNEJBQTBOL3dBTUpBd05EZUxpRFEwTUpBeU5BUUFNSXcwQkFBd01EU01NNHVJTkl3d05EUUFBQUFJQTRnQzNBeDRDbmdBVEFDY0FBQ1VuTnpZMEp5WWlEd0VHRkI4QkZqSTNOalFuSVNjM05qUW5KaUlQQVFZVUh3RVdNamMyTkNjQjg3ZTNEUTBNSXczVkRRM1ZEU01NRFEwQks3ZTNEUTBNSkF6VkRRM1ZEQ1FNRFEzenVMY01KQXdORGRVTkl3eldEQXdOSXd5NHR3d2tEQTBOMVEwakROWU1EQTBqREFBQUFnRGlBTGNESGdLZUFCTUFKd0FBSlRjMk5DOEJKaUlIQmhRZkFRY0dGQmNXTWpjaE56WTBMd0VtSWdjR0ZCOEJCd1lVRnhZeU53SkoxUTBOMVEwakRBME50N2NORFF3akRmN1YxUTBOMVF3a0RBME50N2NORFF3a0RMZldEQ01OMVEwTkRDUU10N2dNSXcwTUROWU1JdzNWRFEwTUpBeTN1QXdqRFF3TUFBQURBRlVBQUFPckExVUFNd0JvQUhjQUFCTWlCZ2NPQVFjT0FRY09BUlVSRkJZWEhnRVhIZ0VYSGdFeklUSTJOejRCTno0Qk56NEJOUkUwSmljdUFTY3VBU2N1QVNNRklUSVdGeDRCRng0QkZ4NEJGUkVVQmdjT0FRY09BUWNPQVNNaElpWW5MZ0VuTGdFbkxnRTFFVFEyTno0Qk56NEJOejRCTXhNaE1qWTFOQ1lqSVNJR0ZSUVdNOVVOR0F3TEZRa0pEZ1VGQlFVRkJRNEpDUlVMREJnTkFsWU5HQXdMRlFrSkRnVUZCUVVGQlE0SkNSVUxEQmdOL2FvQ1ZnUUlCQVFIQXdNRkFRSUJBUUlCQlFNREJ3UUVDQVQ5cWdRSUJBUUhBd01GQVFJQkFRSUJCUU1EQndRRUNBU0FBVllSR1JrUi9xb1JHUmtSQTFVRkJBVU9DUWtWREFzWkRmMnJEUmtMREJVSkNBNEZCUVVGQlFVT0NRZ1ZEQXNaRFFKVkRSa0xEQlVKQ1E0RkJBVlZBZ0VDQlFNQ0J3UUVDQVg5cXdRSkF3UUhBd01GQVFJQ0FnSUJCUU1EQndRRENRUUNWUVVJQkFRSEFnTUZBZ0VDL29BWkVoRVpHUkVTR1FBQUFBQURBRlVBQUFPckExVUFNd0JvQUlrQUFCTWlCZ2NPQVFjT0FRY09BUlVSRkJZWEhnRVhIZ0VYSGdFeklUSTJOejRCTno0Qk56NEJOUkUwSmljdUFTY3VBU2N1QVNNRklUSVdGeDRCRng0QkZ4NEJGUkVVQmdjT0FRY09BUWNPQVNNaElpWW5MZ0VuTGdFbkxnRTFFVFEyTno0Qk56NEJOejRCTXhNekZSUVdNekkyUFFFek1qWTFOQ1lyQVRVMEppTWlCaDBCSXlJR0ZSUVdNOVVOR0F3TEZRa0pEZ1VGQlFVRkJRNEpDUlVMREJnTkFsWU5HQXdMRlFrSkRnVUZCUVVGQlE0SkNSVUxEQmdOL2FvQ1ZnUUlCQVFIQXdNRkFRSUJBUUlCQlFNREJ3UUVDQVQ5cWdRSUJBUUhBd01GQVFJQkFRSUJCUU1EQndRRUNBU0FnQmtTRWhtQUVSa1pFWUFaRWhJWmdCRVpHUkVEVlFVRUJRNEpDUlVNQ3hrTi9hc05HUXNNRlFrSURnVUZCUVVGQlE0SkNCVU1DeGtOQWxVTkdRc01GUWtKRGdVRUJWVUNBUUlGQXdJSEJBUUlCZjJyQkFrREJBY0RBd1VCQWdJQ0FnRUZBd01IQkFNSkJBSlZCUWdFQkFjQ0F3VUNBUUwrZ0lBU0dSa1NnQmtTRVJtQUVoa1pFb0FaRVJJWkFBQUJBT0lBalFNZUFza0FJQUFBRXhjSEJoUVhGakkvQVJjV01qYzJOQzhCTnpZMEp5WWlEd0VuSmlJSEJoUVg0dUxpRFEwTUpBemk0Z3drREEwTjR1SU5EUXdrRE9MaURDUU1EUTBDamVMaURTTU1EUTNoNFEwTkRDTU40dUlNSXcwTURPTGlEQXdOSXd3QUFBQUJBQUFBQVFBQWE1bjB5MThQUFBVQUN3UUFBQUFBQU5pdk9Wc0FBQUFBMks4NVd3QUFBQUFEcXdOVkFBQUFDQUFDQUFBQUFBQUFBQUVBQUFQQS84QUFBQVFBQUFBQUFBT3JBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUxCQUFBQUFBQUFBQUFBQUFBQWdBQUFBUUFBV0lFQUFGaUJBQUE0Z1FBQU9JRUFBQlZCQUFBVlFRQUFPSUFBQUFBQUFvQUZBQWVBRVFBYWdDcUFPb0JuZ0prQXBvQUFRQUFBQXNBaWdBREFBQUFBQUFDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE0QXJnQUJBQUFBQUFBQkFBY0FBQUFCQUFBQUFBQUNBQWNBWUFBQkFBQUFBQUFEQUFjQU5nQUJBQUFBQUFBRUFBY0FkUUFCQUFBQUFBQUZBQXNBRlFBQkFBQUFBQUFHQUFjQVN3QUJBQUFBQUFBS0FCb0FpZ0FEQUFFRUNRQUJBQTRBQndBREFBRUVDUUFDQUE0QVp3QURBQUVFQ1FBREFBNEFQUUFEQUFFRUNRQUVBQTRBZkFBREFBRUVDUUFGQUJZQUlBQURBQUVFQ1FBR0FBNEFVZ0FEQUFFRUNRQUtBRFFBcEdaamFXTnZibk1BWmdCakFHa0FZd0J2QUc0QWMxWmxjbk5wYjI0Z01TNHdBRllBWlFCeUFITUFhUUJ2QUc0QUlBQXhBQzRBTUdaamFXTnZibk1BWmdCakFHa0FZd0J2QUc0QWMyWmphV052Ym5NQVpnQmpBR2tBWXdCdkFHNEFjMUpsWjNWc1lYSUFVZ0JsQUdjQWRRQnNBR0VBY21aamFXTnZibk1BWmdCakFHa0FZd0J2QUc0QWMwWnZiblFnWjJWdVpYSmhkR1ZrSUdKNUlFbGpiMDF2YjI0dUFFWUFid0J1QUhRQUlBQm5BR1VBYmdCbEFISUFZUUIwQUdVQVpBQWdBR0lBZVFBZ0FFa0FZd0J2QUUwQWJ3QnZBRzRBTGdBQUFBTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9XFxcIikgZm9ybWF0KFxcXCJ0cnVldHlwZVxcXCIpfS5mYy1pY29ue3NwZWFrOm5vbmU7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1mYW1pbHk6ZmNpY29ucyFpbXBvcnRhbnQ7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDo0MDA7aGVpZ2h0OjFlbTtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RleHQtdHJhbnNmb3JtOm5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO3dpZHRoOjFlbX0uZmMtaWNvbi1jaGV2cm9uLWxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxlOTAwXFxcIn0uZmMtaWNvbi1jaGV2cm9uLXJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwMVxcXCJ9LmZjLWljb24tY2hldnJvbnMtbGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGU5MDJcXFwifS5mYy1pY29uLWNoZXZyb25zLXJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwM1xcXCJ9LmZjLWljb24tbWludXMtc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwNFxcXCJ9LmZjLWljb24tcGx1cy1zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxlOTA1XFxcIn0uZmMtaWNvbi14OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZTkwNlxcXCJ9LmZjIC5mYy1idXR0b257Ym9yZGVyLXJhZGl1czowO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7bGluZS1oZWlnaHQ6aW5oZXJpdDttYXJnaW46MDtvdmVyZmxvdzp2aXNpYmxlO3RleHQtdHJhbnNmb3JtOm5vbmV9LmZjIC5mYy1idXR0b246Zm9jdXN7b3V0bGluZToxcHggZG90dGVkO291dGxpbmU6NXB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yfS5mYyAuZmMtYnV0dG9uey13ZWJraXQtYXBwZWFyYW5jZTpidXR0b259LmZjIC5mYy1idXR0b246bm90KDpkaXNhYmxlZCl7Y3Vyc29yOnBvaW50ZXJ9LmZjIC5mYy1idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6LjI1ZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS41O3BhZGRpbmc6LjRlbSAuNjVlbTt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYyAuZmMtYnV0dG9uOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lfS5mYyAuZmMtYnV0dG9uOmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg0NCw2Miw4MCwuMjUpO291dGxpbmU6MH0uZmMgLmZjLWJ1dHRvbjpkaXNhYmxlZHtvcGFjaXR5Oi42NX0uZmMgLmZjLWJ1dHRvbi1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tZmMtYnV0dG9uLWJnLWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tZmMtYnV0dG9uLWJvcmRlci1jb2xvcik7Y29sb3I6dmFyKC0tZmMtYnV0dG9uLXRleHQtY29sb3IpfS5mYyAuZmMtYnV0dG9uLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mYy1idXR0b24taG92ZXItYmctY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1mYy1idXR0b24taG92ZXItYm9yZGVyLWNvbG9yKTtjb2xvcjp2YXIoLS1mYy1idXR0b24tdGV4dC1jb2xvcil9LmZjIC5mYy1idXR0b24tcHJpbWFyeTpkaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWZjLWJ1dHRvbi1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWZjLWJ1dHRvbi1ib3JkZXItY29sb3IpO2NvbG9yOnZhcigtLWZjLWJ1dHRvbi10ZXh0LWNvbG9yKX0uZmMgLmZjLWJ1dHRvbi1wcmltYXJ5OmZvY3Vze2JveC1zaGFkb3c6MCAwIDAgLjJyZW0gcmdiYSg3Niw5MSwxMDYsLjUpfS5mYyAuZmMtYnV0dG9uLXByaW1hcnk6bm90KDpkaXNhYmxlZCkuZmMtYnV0dG9uLWFjdGl2ZSwuZmMgLmZjLWJ1dHRvbi1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWZjLWJ1dHRvbi1hY3RpdmUtYmctY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1mYy1idXR0b24tYWN0aXZlLWJvcmRlci1jb2xvcik7Y29sb3I6dmFyKC0tZmMtYnV0dG9uLXRleHQtY29sb3IpfS5mYyAuZmMtYnV0dG9uLXByaW1hcnk6bm90KDpkaXNhYmxlZCkuZmMtYnV0dG9uLWFjdGl2ZTpmb2N1cywuZmMgLmZjLWJ1dHRvbi1wcmltYXJ5Om5vdCg6ZGlzYWJsZWQpOmFjdGl2ZTpmb2N1c3tib3gtc2hhZG93OjAgMCAwIC4ycmVtIHJnYmEoNzYsOTEsMTA2LC41KX0uZmMgLmZjLWJ1dHRvbiAuZmMtaWNvbntmb250LXNpemU6MS41ZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYyAuZmMtYnV0dG9uLWdyb3Vwe2Rpc3BsYXk6aW5saW5lLWZsZXg7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlfS5mYyAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b257ZmxleDoxIDEgYXV0bztwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLWJ1dHRvbi1ncm91cD4uZmMtYnV0dG9uLmZjLWJ1dHRvbi1hY3RpdmUsLmZjIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbjphY3RpdmUsLmZjIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbjpmb2N1cywuZmMgLmZjLWJ1dHRvbi1ncm91cD4uZmMtYnV0dG9uOmhvdmVye3otaW5kZXg6MX0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDttYXJnaW4tbGVmdDotMXB4fS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbjpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtYnV0dG9uLWdyb3VwPi5mYy1idXR0b246bm90KDpmaXJzdC1jaGlsZCl7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO21hcmdpbi1yaWdodDotMXB4fS5mYy1kaXJlY3Rpb24tcnRsIC5mYy1idXR0b24tZ3JvdXA+LmZjLWJ1dHRvbjpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LmZjIC5mYy10b29sYmFye2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmZjIC5mYy10b29sYmFyLmZjLWhlYWRlci10b29sYmFye21hcmdpbi1ib3R0b206MS41ZW19LmZjIC5mYy10b29sYmFyLmZjLWZvb3Rlci10b29sYmFye21hcmdpbi10b3A6MS41ZW19LmZjIC5mYy10b29sYmFyLXRpdGxle2ZvbnQtc2l6ZToxLjc1ZW07bWFyZ2luOjB9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLXRvb2xiYXI+Kj46bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6Ljc1ZW19LmZjLWRpcmVjdGlvbi1ydGwgLmZjLXRvb2xiYXI+Kj46bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLXJpZ2h0Oi43NWVtfS5mYy1kaXJlY3Rpb24tcnRsIC5mYy10b29sYmFyLWx0cntmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0uZmMgLmZjLXNjcm9sbGVyey13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYyAuZmMtc2Nyb2xsZXItbGlxdWlke2hlaWdodDoxMDAlfS5mYyAuZmMtc2Nyb2xsZXItbGlxdWlkLWFic29sdXRle2JvdHRvbTowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowfS5mYyAuZmMtc2Nyb2xsZXItaGFybmVzc3tkaXJlY3Rpb246bHRyO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLXNjcm9sbGVyLWhhcm5lc3MtbGlxdWlke2hlaWdodDoxMDAlfS5mYy1kaXJlY3Rpb24tcnRsIC5mYy1zY3JvbGxlci1oYXJuZXNzPi5mYy1zY3JvbGxlcntkaXJlY3Rpb246cnRsfS5mYy10aGVtZS1zdGFuZGFyZCAuZmMtc2Nyb2xsZ3JpZHtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWZjLWJvcmRlci1jb2xvcil9LmZjIC5mYy1zY3JvbGxncmlkLC5mYyAuZmMtc2Nyb2xsZ3JpZCB0YWJsZXt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJX0uZmMgLmZjLXNjcm9sbGdyaWQgdGFibGV7Ym9yZGVyLWxlZnQtc3R5bGU6aGlkZGVuO2JvcmRlci1yaWdodC1zdHlsZTpoaWRkZW47Ym9yZGVyLXRvcC1zdHlsZTpoaWRkZW59LmZjIC5mYy1zY3JvbGxncmlke2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7Ym9yZGVyLXJpZ2h0LXdpZHRoOjB9LmZjIC5mYy1zY3JvbGxncmlkLWxpcXVpZHtoZWlnaHQ6MTAwJX0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbiwuZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbiB0YWJsZSwuZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbj50ZHtoZWlnaHQ6MXB4fS5mYyAuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWxpcXVpZD50ZHtoZWlnaHQ6MTAwJX0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbj4qe2JvcmRlci1sZWZ0LXdpZHRoOjA7Ym9yZGVyLXRvcC13aWR0aDowfS5mYyAuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWZvb3Rlcj4qLC5mYyAuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWhlYWRlcj4qe2JvcmRlci1ib3R0b20td2lkdGg6MH0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1ib2R5IHRhYmxlLC5mYyAuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLWZvb3RlciB0YWJsZXtib3JkZXItYm90dG9tLXN0eWxlOmhpZGRlbn0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1zdGlja3k+KntiYWNrZ3JvdW5kOnZhcigtLWZjLXBhZ2UtYmctY29sb3IpO3Bvc2l0aW9uOnN0aWNreTt6LWluZGV4OjN9LmZjIC5mYy1zY3JvbGxncmlkLXNlY3Rpb24taGVhZGVyLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1zdGlja3k+Knt0b3A6MH0uZmMgLmZjLXNjcm9sbGdyaWQtc2VjdGlvbi1mb290ZXIuZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uLXN0aWNreT4qe2JvdHRvbTowfS5mYyAuZmMtc2Nyb2xsZ3JpZC1zdGlja3ktc2hpbXtoZWlnaHQ6MXB4O21hcmdpbi1ib3R0b206LTFweH0uZmMtc3RpY2t5e3Bvc2l0aW9uOnN0aWNreX0uZmMgLmZjLXZpZXctaGFybmVzc3tmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLXZpZXctaGFybmVzcy1hY3RpdmU+LmZjLXZpZXd7Ym90dG9tOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9LmZjIC5mYy1jb2wtaGVhZGVyLWNlbGwtY3VzaGlvbntkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjJweCA0cHh9LmZjIC5mYy1iZy1ldmVudCwuZmMgLmZjLWhpZ2hsaWdodCwuZmMgLmZjLW5vbi1idXNpbmVzc3tib3R0b206MDtsZWZ0OjA7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MH0uZmMgLmZjLW5vbi1idXNpbmVzc3tiYWNrZ3JvdW5kOnZhcigtLWZjLW5vbi1idXNpbmVzcy1jb2xvcil9LmZjIC5mYy1iZy1ldmVudHtiYWNrZ3JvdW5kOnZhcigtLWZjLWJnLWV2ZW50LWNvbG9yKTtvcGFjaXR5OnZhcigtLWZjLWJnLWV2ZW50LW9wYWNpdHkpfS5mYyAuZmMtYmctZXZlbnQgLmZjLWV2ZW50LXRpdGxle2ZvbnQtc2l6ZTp2YXIoLS1mYy1zbWFsbC1mb250LXNpemUpO2ZvbnQtc3R5bGU6aXRhbGljO21hcmdpbjouNWVtfS5mYyAuZmMtaGlnaGxpZ2h0e2JhY2tncm91bmQ6dmFyKC0tZmMtaGlnaGxpZ2h0LWNvbG9yKX0uZmMgLmZjLWNlbGwtc2hhZGVkLC5mYyAuZmMtZGF5LWRpc2FibGVke2JhY2tncm91bmQ6dmFyKC0tZmMtbmV1dHJhbC1iZy1jb2xvcil9YS5mYy1ldmVudCxhLmZjLWV2ZW50OmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lfS5mYy1ldmVudC5mYy1ldmVudC1kcmFnZ2FibGUsLmZjLWV2ZW50W2hyZWZde2N1cnNvcjpwb2ludGVyfS5mYy1ldmVudCAuZmMtZXZlbnQtbWFpbntwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjJ9LmZjLWV2ZW50LWRyYWdnaW5nOm5vdCguZmMtZXZlbnQtc2VsZWN0ZWQpe29wYWNpdHk6Ljc1fS5mYy1ldmVudC1kcmFnZ2luZy5mYy1ldmVudC1zZWxlY3RlZHtib3gtc2hhZG93OjAgMnB4IDdweCByZ2JhKDAsMCwwLC4zKX0uZmMtZXZlbnQgLmZjLWV2ZW50LXJlc2l6ZXJ7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6NH0uZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXIsLmZjLWV2ZW50OmhvdmVyIC5mYy1ldmVudC1yZXNpemVye2Rpc3BsYXk6YmxvY2t9LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVye2JhY2tncm91bmQ6dmFyKC0tZmMtcGFnZS1iZy1jb2xvcik7Ym9yZGVyLWNvbG9yOmluaGVyaXQ7Ym9yZGVyLXJhZGl1czpjYWxjKHZhcigtLWZjLWV2ZW50LXJlc2l6ZXItZG90LXRvdGFsLXdpZHRoKS8yKTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOnZhcigtLWZjLWV2ZW50LXJlc2l6ZXItZG90LWJvcmRlci13aWR0aCk7aGVpZ2h0OnZhcigtLWZjLWV2ZW50LXJlc2l6ZXItZG90LXRvdGFsLXdpZHRoKTt3aWR0aDp2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCl9LmZjLWV2ZW50LXNlbGVjdGVkIC5mYy1ldmVudC1yZXNpemVyOmJlZm9yZXtib3R0b206LTIwcHg7Y29udGVudDpcXFwiXFxcIjtsZWZ0Oi0yMHB4O3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi0yMHB4O3RvcDotMjBweH0uZmMtZXZlbnQtc2VsZWN0ZWQsLmZjLWV2ZW50OmZvY3Vze2JveC1zaGFkb3c6MCAycHggNXB4IHJnYmEoMCwwLDAsLjIpfS5mYy1ldmVudC1zZWxlY3RlZDpiZWZvcmUsLmZjLWV2ZW50OmZvY3VzOmJlZm9yZXtib3R0b206MDtjb250ZW50OlxcXCJcXFwiO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowO3RvcDowO3otaW5kZXg6M30uZmMtZXZlbnQtc2VsZWN0ZWQ6YWZ0ZXIsLmZjLWV2ZW50OmZvY3VzOmFmdGVye2JhY2tncm91bmQ6dmFyKC0tZmMtZXZlbnQtc2VsZWN0ZWQtb3ZlcmxheS1jb2xvcik7Ym90dG9tOi0xcHg7Y29udGVudDpcXFwiXFxcIjtsZWZ0Oi0xcHg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6LTFweDt0b3A6LTFweDt6LWluZGV4OjF9LmZjLWgtZXZlbnR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1mYy1ldmVudC1iZy1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1mYy1ldmVudC1ib3JkZXItY29sb3IpO2Rpc3BsYXk6YmxvY2t9LmZjLWgtZXZlbnQgLmZjLWV2ZW50LW1haW57Y29sb3I6dmFyKC0tZmMtZXZlbnQtdGV4dC1jb2xvcil9LmZjLWgtZXZlbnQgLmZjLWV2ZW50LW1haW4tZnJhbWV7ZGlzcGxheTpmbGV4fS5mYy1oLWV2ZW50IC5mYy1ldmVudC10aW1le21heC13aWR0aDoxMDAlO292ZXJmbG93OmhpZGRlbn0uZmMtaC1ldmVudCAuZmMtZXZlbnQtdGl0bGUtY29udGFpbmVye2ZsZXgtZ3JvdzoxO2ZsZXgtc2hyaW5rOjE7bWluLXdpZHRoOjB9LmZjLWgtZXZlbnQgLmZjLWV2ZW50LXRpdGxle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xlZnQ6MDttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47cmlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQ6YmVmb3Jle2JvdHRvbTotMTBweDt0b3A6LTEwcHh9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWRheWdyaWQtYmxvY2stZXZlbnQ6bm90KC5mYy1ldmVudC1zdGFydCksLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtYmxvY2stZXZlbnQ6bm90KC5mYy1ldmVudC1lbmQpe2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtZGF5Z3JpZC1ibG9jay1ldmVudDpub3QoLmZjLWV2ZW50LWVuZCksLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtYmxvY2stZXZlbnQ6bm90KC5mYy1ldmVudC1zdGFydCl7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MDtib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS5mYy1oLWV2ZW50Om5vdCguZmMtZXZlbnQtc2VsZWN0ZWQpIC5mYy1ldmVudC1yZXNpemVye2JvdHRvbTowO3RvcDowO3dpZHRoOnZhcigtLWZjLWV2ZW50LXJlc2l6ZXItdGhpY2tuZXNzKX0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtaC1ldmVudDpub3QoLmZjLWV2ZW50LXNlbGVjdGVkKSAuZmMtZXZlbnQtcmVzaXplci1zdGFydCwuZmMtZGlyZWN0aW9uLXJ0bCAuZmMtaC1ldmVudDpub3QoLmZjLWV2ZW50LXNlbGVjdGVkKSAuZmMtZXZlbnQtcmVzaXplci1lbmR7Y3Vyc29yOnctcmVzaXplO2xlZnQ6Y2FsYyh2YXIoLS1mYy1ldmVudC1yZXNpemVyLXRoaWNrbmVzcykqLS41KX0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtaC1ldmVudDpub3QoLmZjLWV2ZW50LXNlbGVjdGVkKSAuZmMtZXZlbnQtcmVzaXplci1lbmQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWgtZXZlbnQ6bm90KC5mYy1ldmVudC1zZWxlY3RlZCkgLmZjLWV2ZW50LXJlc2l6ZXItc3RhcnR7Y3Vyc29yOmUtcmVzaXplO3JpZ2h0OmNhbGModmFyKC0tZmMtZXZlbnQtcmVzaXplci10aGlja25lc3MpKi0uNSl9LmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXJ7bWFyZ2luLXRvcDpjYWxjKHZhcigtLWZjLWV2ZW50LXJlc2l6ZXItZG90LXRvdGFsLXdpZHRoKSotLjUpO3RvcDo1MCV9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXItc3RhcnQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXItZW5ke2xlZnQ6Y2FsYyh2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCkqLS41KX0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtaC1ldmVudC5mYy1ldmVudC1zZWxlY3RlZCAuZmMtZXZlbnQtcmVzaXplci1lbmQsLmZjLWRpcmVjdGlvbi1ydGwgLmZjLWgtZXZlbnQuZmMtZXZlbnQtc2VsZWN0ZWQgLmZjLWV2ZW50LXJlc2l6ZXItc3RhcnR7cmlnaHQ6Y2FsYyh2YXIoLS1mYy1ldmVudC1yZXNpemVyLWRvdC10b3RhbC13aWR0aCkqLS41KX0uZmMgLmZjLXBvcG92ZXJ7Ym94LXNoYWRvdzowIDJweCA2cHggcmdiYSgwLDAsMCwuMTUpO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk5OX0uZmMgLmZjLXBvcG92ZXItaGVhZGVye2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6M3B4IDRweH0uZmMgLmZjLXBvcG92ZXItdGl0bGV7bWFyZ2luOjAgMnB4fS5mYyAuZmMtcG9wb3Zlci1jbG9zZXtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MS4xZW07b3BhY2l0eTouNjV9LmZjLXRoZW1lLXN0YW5kYXJkIC5mYy1wb3BvdmVye2JhY2tncm91bmQ6dmFyKC0tZmMtcGFnZS1iZy1jb2xvcik7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1mYy1ib3JkZXItY29sb3IpfS5mYy10aGVtZS1zdGFuZGFyZCAuZmMtcG9wb3Zlci1oZWFkZXJ7YmFja2dyb3VuZDp2YXIoLS1mYy1uZXV0cmFsLWJnLWNvbG9yKX1cIjtcbmluamVjdFN0eWxlcyhjc3NfMjQ4eik7XG5cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWwpIHtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSkge1xuICAgICAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgICB9XG59XG4vLyBRdWVyeWluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gZWxlbWVudENsb3Nlc3QoZWwsIHNlbGVjdG9yKSB7XG4gICAgaWYgKGVsLmNsb3Nlc3QpIHtcbiAgICAgICAgcmV0dXJuIGVsLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgICAgICAvLyByZWFsbHkgYmFkIGZhbGxiYWNrIGZvciBJRVxuICAgICAgICAvLyBmcm9tIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2Nsb3Nlc3RcbiAgICB9XG4gICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMoZWwpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkbyB7XG4gICAgICAgIGlmIChlbGVtZW50TWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWw7XG4gICAgICAgIH1cbiAgICAgICAgZWwgPSAoZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlKTtcbiAgICB9IHdoaWxlIChlbCAhPT0gbnVsbCAmJiBlbC5ub2RlVHlwZSA9PT0gMSk7XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgbWV0aG9kID0gZWwubWF0Y2hlcyB8fCBlbC5tYXRjaGVzU2VsZWN0b3IgfHwgZWwubXNNYXRjaGVzU2VsZWN0b3I7XG4gICAgcmV0dXJuIG1ldGhvZC5jYWxsKGVsLCBzZWxlY3Rvcik7XG59XG4vLyBhY2NlcHRzIG11bHRpcGxlIHN1YmplY3QgZWxzXG4vLyByZXR1cm5zIGEgcmVhbCBhcnJheS4gZ29vZCBmb3IgbWV0aG9kcyBsaWtlIGZvckVhY2hcbi8vIFRPRE86IGFjY2VwdCB0aGUgZG9jdW1lbnRcbmZ1bmN0aW9uIGZpbmRFbGVtZW50cyhjb250YWluZXIsIHNlbGVjdG9yKSB7XG4gICAgbGV0IGNvbnRhaW5lcnMgPSBjb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IFtjb250YWluZXJdIDogY29udGFpbmVyO1xuICAgIGxldCBhbGxNYXRjaGVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gY29udGFpbmVyc1tpXS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXRjaGVzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBhbGxNYXRjaGVzLnB1c2gobWF0Y2hlc1tqXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFsbE1hdGNoZXM7XG59XG4vLyBhY2NlcHRzIG11bHRpcGxlIHN1YmplY3QgZWxzXG4vLyBvbmx5IHF1ZXJpZXMgZGlyZWN0IGNoaWxkIGVsZW1lbnRzIC8vIFRPRE86IHJlbmFtZSB0byBmaW5kRGlyZWN0Q2hpbGRyZW4hXG5mdW5jdGlvbiBmaW5kRGlyZWN0Q2hpbGRyZW4ocGFyZW50LCBzZWxlY3Rvcikge1xuICAgIGxldCBwYXJlbnRzID0gcGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBbcGFyZW50XSA6IHBhcmVudDtcbiAgICBsZXQgYWxsTWF0Y2hlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBsZXQgY2hpbGROb2RlcyA9IHBhcmVudHNbaV0uY2hpbGRyZW47IC8vIG9ubHkgZXZlciBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkTm9kZXMubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2pdO1xuICAgICAgICAgICAgaWYgKCFzZWxlY3RvciB8fCBlbGVtZW50TWF0Y2hlcyhjaGlsZE5vZGUsIHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICAgIGFsbE1hdGNoZXMucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGxNYXRjaGVzO1xufVxuLy8gU3R5bGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IFBJWEVMX1BST1BfUkUgPSAvKHRvcHxsZWZ0fHJpZ2h0fGJvdHRvbXx3aWR0aHxoZWlnaHQpJC9pO1xuZnVuY3Rpb24gYXBwbHlTdHlsZShlbCwgcHJvcHMpIHtcbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBwcm9wcykge1xuICAgICAgICBhcHBseVN0eWxlUHJvcChlbCwgcHJvcE5hbWUsIHByb3BzW3Byb3BOYW1lXSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXBwbHlTdHlsZVByb3AoZWwsIG5hbWUsIHZhbCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICBlbC5zdHlsZVtuYW1lXSA9ICcnO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBQSVhFTF9QUk9QX1JFLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSBgJHt2YWx9cHhgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZWwuc3R5bGVbbmFtZV0gPSB2YWw7XG4gICAgfVxufVxuLy8gRXZlbnQgSGFuZGxpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIGlmIGludGVyY2VwdGluZyBidWJibGVkIGV2ZW50cyBhdCB0aGUgZG9jdW1lbnQvd2luZG93L2JvZHkgbGV2ZWwsXG4vLyBhbmQgd2FudCB0byBzZWUgb3JpZ2luYXRpbmcgZWxlbWVudCAodGhlICd0YXJnZXQnKSwgdXNlIHRoaXMgdXRpbCBpbnN0ZWFkXG4vLyBvZiBgZXYudGFyZ2V0YCBiZWNhdXNlIGl0IGdvZXMgd2l0aGluIHdlYi1jb21wb25lbnQgYm91bmRhcmllcy5cbmZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0VmlhUm9vdChldikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgcmV0dXJuIChfYiA9IChfYSA9IGV2LmNvbXBvc2VkUGF0aCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoZXYpWzBdKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBldi50YXJnZXQ7XG59XG4vLyBVbmlxdWUgSUQgZm9yIERPTSBhdHRyaWJ1dGVcbmxldCBndWlkJDEgPSAwO1xuZnVuY3Rpb24gZ2V0VW5pcXVlRG9tSWQoKSB7XG4gICAgZ3VpZCQxICs9IDE7XG4gICAgcmV0dXJuICdmYy1kb20tJyArIGd1aWQkMTtcbn1cblxuLy8gU3RvcHMgYSBtb3VzZS90b3VjaCBldmVudCBmcm9tIGRvaW5nIGl0J3MgbmF0aXZlIGJyb3dzZXIgYWN0aW9uXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChldikge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG59XG4vLyBFdmVudCBEZWxlZ2F0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBidWlsZERlbGVnYXRpb25IYW5kbGVyKHNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gICAgcmV0dXJuIChldikgPT4ge1xuICAgICAgICBsZXQgbWF0Y2hlZENoaWxkID0gZWxlbWVudENsb3Nlc3QoZXYudGFyZ2V0LCBzZWxlY3Rvcik7XG4gICAgICAgIGlmIChtYXRjaGVkQ2hpbGQpIHtcbiAgICAgICAgICAgIGhhbmRsZXIuY2FsbChtYXRjaGVkQ2hpbGQsIGV2LCBtYXRjaGVkQ2hpbGQpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGxpc3RlbkJ5U2VsZWN0b3IoY29udGFpbmVyLCBldmVudFR5cGUsIHNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gICAgbGV0IGF0dGFjaGVkSGFuZGxlciA9IGJ1aWxkRGVsZWdhdGlvbkhhbmRsZXIoc2VsZWN0b3IsIGhhbmRsZXIpO1xuICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgYXR0YWNoZWRIYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGF0dGFjaGVkSGFuZGxlcik7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGxpc3RlblRvSG92ZXJCeVNlbGVjdG9yKGNvbnRhaW5lciwgc2VsZWN0b3IsIG9uTW91c2VFbnRlciwgb25Nb3VzZUxlYXZlKSB7XG4gICAgbGV0IGN1cnJlbnRNYXRjaGVkQ2hpbGQ7XG4gICAgcmV0dXJuIGxpc3RlbkJ5U2VsZWN0b3IoY29udGFpbmVyLCAnbW91c2VvdmVyJywgc2VsZWN0b3IsIChtb3VzZU92ZXJFdiwgbWF0Y2hlZENoaWxkKSA9PiB7XG4gICAgICAgIGlmIChtYXRjaGVkQ2hpbGQgIT09IGN1cnJlbnRNYXRjaGVkQ2hpbGQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRNYXRjaGVkQ2hpbGQgPSBtYXRjaGVkQ2hpbGQ7XG4gICAgICAgICAgICBvbk1vdXNlRW50ZXIobW91c2VPdmVyRXYsIG1hdGNoZWRDaGlsZCk7XG4gICAgICAgICAgICBsZXQgcmVhbE9uTW91c2VMZWF2ZSA9IChtb3VzZUxlYXZlRXYpID0+IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2hlZENoaWxkID0gbnVsbDtcbiAgICAgICAgICAgICAgICBvbk1vdXNlTGVhdmUobW91c2VMZWF2ZUV2LCBtYXRjaGVkQ2hpbGQpO1xuICAgICAgICAgICAgICAgIG1hdGNoZWRDaGlsZC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgcmVhbE9uTW91c2VMZWF2ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHRoZSBuZXh0IG1vdXNlbGVhdmUsIGFuZCB0aGVuIHVuYXR0YWNoXG4gICAgICAgICAgICBtYXRjaGVkQ2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHJlYWxPbk1vdXNlTGVhdmUpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBBbmltYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IHRyYW5zaXRpb25FdmVudE5hbWVzID0gW1xuICAgICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgICAnb3RyYW5zaXRpb25lbmQnLFxuICAgICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgJ21zVHJhbnNpdGlvbkVuZCcsXG4gICAgJ3RyYW5zaXRpb25lbmQnLFxuXTtcbi8vIHRyaWdnZXJlZCBvbmx5IHdoZW4gdGhlIG5leHQgc2luZ2xlIHN1YnNlcXVlbnQgdHJhbnNpdGlvbiBmaW5pc2hlc1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25Eb25lKGVsLCBjYWxsYmFjaykge1xuICAgIGxldCByZWFsQ2FsbGJhY2sgPSAoZXYpID0+IHtcbiAgICAgICAgY2FsbGJhY2soZXYpO1xuICAgICAgICB0cmFuc2l0aW9uRXZlbnROYW1lcy5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCByZWFsQ2FsbGJhY2spO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHRyYW5zaXRpb25FdmVudE5hbWVzLmZvckVhY2goKGV2ZW50TmFtZSkgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgcmVhbENhbGxiYWNrKTsgLy8gY3Jvc3MtYnJvd3NlciB3YXkgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHRyYW5zaXRpb24gZmluaXNoZXNcbiAgICB9KTtcbn1cbi8vIEFSSUEgd29ya2Fyb3VuZHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZXIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IG9uQ2xpY2s6IGhhbmRsZXIgfSwgY3JlYXRlQXJpYUtleWJvYXJkQXR0cnMoaGFuZGxlcikpO1xufVxuZnVuY3Rpb24gY3JlYXRlQXJpYUtleWJvYXJkQXR0cnMoaGFuZGxlcikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICBvbktleURvd24oZXYpIHtcbiAgICAgICAgICAgIGlmIChldi5rZXkgPT09ICdFbnRlcicgfHwgZXYua2V5ID09PSAnICcpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGV2KTtcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOyAvLyBpZiBzcGFjZSwgZG9uJ3Qgc2Nyb2xsIGRvd24gcGFnZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH07XG59XG5cbmxldCBndWlkTnVtYmVyID0gMDtcbmZ1bmN0aW9uIGd1aWQoKSB7XG4gICAgZ3VpZE51bWJlciArPSAxO1xuICAgIHJldHVybiBTdHJpbmcoZ3VpZE51bWJlcik7XG59XG4vKiBGdWxsQ2FsZW5kYXItc3BlY2lmaWMgRE9NIFV0aWxpdGllc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4vLyBNYWtlIHRoZSBtb3VzZSBjdXJzb3IgZXhwcmVzcyB0aGF0IGFuIGV2ZW50IGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IGFyZWFcbmZ1bmN0aW9uIGRpc2FibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLy8gUmV0dXJucyB0aGUgbW91c2UgY3Vyc29yIHRvIGl0cyBvcmlnaW5hbCBsb29rXG5mdW5jdGlvbiBlbmFibGVDdXJzb3IoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdmYy1ub3QtYWxsb3dlZCcpO1xufVxuLyogU2VsZWN0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmZ1bmN0aW9uIHByZXZlbnRTZWxlY3Rpb24oZWwpIHtcbiAgICBlbC5zdHlsZS51c2VyU2VsZWN0ID0gJ25vbmUnO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdHN0YXJ0JywgcHJldmVudERlZmF1bHQpO1xufVxuZnVuY3Rpb24gYWxsb3dTZWxlY3Rpb24oZWwpIHtcbiAgICBlbC5zdHlsZS51c2VyU2VsZWN0ID0gJyc7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0c3RhcnQnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG4vKiBDb250ZXh0IE1lbnVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcHJldmVudENvbnRleHRNZW51KGVsKSB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBhbGxvd0NvbnRleHRNZW51KGVsKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBwcmV2ZW50RGVmYXVsdCk7XG59XG5mdW5jdGlvbiBwYXJzZUZpZWxkU3BlY3MoaW5wdXQpIHtcbiAgICBsZXQgc3BlY3MgPSBbXTtcbiAgICBsZXQgdG9rZW5zID0gW107XG4gICAgbGV0IGk7XG4gICAgbGV0IHRva2VuO1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0LnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRva2VucyA9IFtpbnB1dF07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHRva2VucyA9IGlucHV0O1xuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh0b2tlbi5jaGFyQXQoMCkgPT09ICctJyA/XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4uc3Vic3RyaW5nKDEpLCBvcmRlcjogLTEgfSA6XG4gICAgICAgICAgICAgICAgeyBmaWVsZDogdG9rZW4sIG9yZGVyOiAxIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3BlY3MucHVzaCh7IGZ1bmM6IHRva2VuIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVjcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVCeUZpZWxkU3BlY3Mob2JqMCwgb2JqMSwgZmllbGRTcGVjcykge1xuICAgIGxldCBpO1xuICAgIGxldCBjbXA7XG4gICAgZm9yIChpID0gMDsgaSA8IGZpZWxkU3BlY3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY21wID0gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlY3NbaV0pO1xuICAgICAgICBpZiAoY21wKSB7XG4gICAgICAgICAgICByZXR1cm4gY21wO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcGFyZUJ5RmllbGRTcGVjKG9iajAsIG9iajEsIGZpZWxkU3BlYykge1xuICAgIGlmIChmaWVsZFNwZWMuZnVuYykge1xuICAgICAgICByZXR1cm4gZmllbGRTcGVjLmZ1bmMob2JqMCwgb2JqMSk7XG4gICAgfVxuICAgIHJldHVybiBmbGV4aWJsZUNvbXBhcmUob2JqMFtmaWVsZFNwZWMuZmllbGRdLCBvYmoxW2ZpZWxkU3BlYy5maWVsZF0pXG4gICAgICAgICogKGZpZWxkU3BlYy5vcmRlciB8fCAxKTtcbn1cbmZ1bmN0aW9uIGZsZXhpYmxlQ29tcGFyZShhLCBiKSB7XG4gICAgaWYgKCFhICYmICFiKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpZiAoYiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiKSk7XG4gICAgfVxuICAgIHJldHVybiBhIC0gYjtcbn1cbi8qIFN0cmluZyBVdGlsaXRpZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gcGFkU3RhcnQodmFsLCBsZW4pIHtcbiAgICBsZXQgcyA9IFN0cmluZyh2YWwpO1xuICAgIHJldHVybiAnMDAwJy5zdWJzdHIoMCwgbGVuIC0gcy5sZW5ndGgpICsgcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFdpdGhPcmRpbmFscyhmb3JtYXR0ZXIsIGFyZ3MsIGZhbGxiYWNrVGV4dCkge1xuICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIoLi4uYXJncyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnc3RyaW5nJykgeyAvLyBub24tYmxhbmsgc3RyaW5nXG4gICAgICAgIHJldHVybiBhcmdzLnJlZHVjZSgoc3RyLCBhcmcsIGluZGV4KSA9PiAoc3RyLnJlcGxhY2UoJyQnICsgaW5kZXgsIGFyZyB8fCAnJykpLCBmb3JtYXR0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsbGJhY2tUZXh0O1xufVxuLyogTnVtYmVyIFV0aWxpdGllc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5mdW5jdGlvbiBjb21wYXJlTnVtYmVycyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgLSBiO1xufVxuZnVuY3Rpb24gaXNJbnQobikge1xuICAgIHJldHVybiBuICUgMSA9PT0gMDtcbn1cbi8qIEZDLXNwZWNpZmljIERPTSBkaW1lbnNpb24gc3R1ZmZcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuZnVuY3Rpb24gY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoKGNlbGxFbCkge1xuICAgIGxldCBhbGxXaWR0aEVsID0gY2VsbEVsLnF1ZXJ5U2VsZWN0b3IoJy5mYy1zY3JvbGxncmlkLXNocmluay1mcmFtZScpO1xuICAgIGxldCBjb250ZW50V2lkdGhFbCA9IGNlbGxFbC5xdWVyeVNlbGVjdG9yKCcuZmMtc2Nyb2xsZ3JpZC1zaHJpbmstY3VzaGlvbicpO1xuICAgIGlmICghYWxsV2lkdGhFbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWRzIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWZyYW1lIGNsYXNzTmFtZScpOyAvLyBUT0RPOiB1c2UgY29uc3RcbiAgICB9XG4gICAgaWYgKCFjb250ZW50V2lkdGhFbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWRzIGZjLXNjcm9sbGdyaWQtc2hyaW5rLWN1c2hpb24gY2xhc3NOYW1lJyk7XG4gICAgfVxuICAgIHJldHVybiBjZWxsRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLSBhbGxXaWR0aEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICsgLy8gdGhlIGNlbGwgcGFkZGluZytib3JkZXJcbiAgICAgICAgY29udGVudFdpZHRoRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG59XG5cbmNvbnN0IElOVEVSTkFMX1VOSVRTID0gWyd5ZWFycycsICdtb250aHMnLCAnZGF5cycsICdtaWxsaXNlY29uZHMnXTtcbmNvbnN0IFBBUlNFX1JFID0gL14oLT8pKD86KFxcZCspXFwuKT8oXFxkKyk6KFxcZFxcZCkoPzo6KFxcZFxcZCkoPzpcXC4oXFxkXFxkXFxkKSk/KT8vO1xuLy8gUGFyc2luZyBhbmQgQ3JlYXRpb25cbmZ1bmN0aW9uIGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB1bml0KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgIHJldHVybiBwYXJzZU9iamVjdChpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU9iamVjdCh7IFt1bml0IHx8ICdtaWxsaXNlY29uZHMnXTogaW5wdXQgfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcGFyc2VTdHJpbmcocykge1xuICAgIGxldCBtID0gUEFSU0VfUkUuZXhlYyhzKTtcbiAgICBpZiAobSkge1xuICAgICAgICBsZXQgc2lnbiA9IG1bMV0gPyAtMSA6IDE7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogMCxcbiAgICAgICAgICAgIG1vbnRoczogMCxcbiAgICAgICAgICAgIGRheXM6IHNpZ24gKiAobVsyXSA/IHBhcnNlSW50KG1bMl0sIDEwKSA6IDApLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzOiBzaWduICogKChtWzNdID8gcGFyc2VJbnQobVszXSwgMTApIDogMCkgKiA2MCAqIDYwICogMTAwMCArIC8vIGhvdXJzXG4gICAgICAgICAgICAgICAgKG1bNF0gPyBwYXJzZUludChtWzRdLCAxMCkgOiAwKSAqIDYwICogMTAwMCArIC8vIG1pbnV0ZXNcbiAgICAgICAgICAgICAgICAobVs1XSA/IHBhcnNlSW50KG1bNV0sIDEwKSA6IDApICogMTAwMCArIC8vIHNlY29uZHNcbiAgICAgICAgICAgICAgICAobVs2XSA/IHBhcnNlSW50KG1bNl0sIDEwKSA6IDApIC8vIG1zXG4gICAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHBhcnNlT2JqZWN0KG9iaikge1xuICAgIGxldCBkdXJhdGlvbiA9IHtcbiAgICAgICAgeWVhcnM6IG9iai55ZWFycyB8fCBvYmoueWVhciB8fCAwLFxuICAgICAgICBtb250aHM6IG9iai5tb250aHMgfHwgb2JqLm1vbnRoIHx8IDAsXG4gICAgICAgIGRheXM6IG9iai5kYXlzIHx8IG9iai5kYXkgfHwgMCxcbiAgICAgICAgbWlsbGlzZWNvbmRzOiAob2JqLmhvdXJzIHx8IG9iai5ob3VyIHx8IDApICogNjAgKiA2MCAqIDEwMDAgKyAvLyBob3Vyc1xuICAgICAgICAgICAgKG9iai5taW51dGVzIHx8IG9iai5taW51dGUgfHwgMCkgKiA2MCAqIDEwMDAgKyAvLyBtaW51dGVzXG4gICAgICAgICAgICAob2JqLnNlY29uZHMgfHwgb2JqLnNlY29uZCB8fCAwKSAqIDEwMDAgKyAvLyBzZWNvbmRzXG4gICAgICAgICAgICAob2JqLm1pbGxpc2Vjb25kcyB8fCBvYmoubWlsbGlzZWNvbmQgfHwgb2JqLm1zIHx8IDApLCAvLyBtc1xuICAgIH07XG4gICAgbGV0IHdlZWtzID0gb2JqLndlZWtzIHx8IG9iai53ZWVrO1xuICAgIGlmICh3ZWVrcykge1xuICAgICAgICBkdXJhdGlvbi5kYXlzICs9IHdlZWtzICogNztcbiAgICAgICAgZHVyYXRpb24uc3BlY2lmaWVkV2Vla3MgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZHVyYXRpb247XG59XG4vLyBFcXVhbGl0eVxuZnVuY3Rpb24gZHVyYXRpb25zRXF1YWwoZDAsIGQxKSB7XG4gICAgcmV0dXJuIGQwLnllYXJzID09PSBkMS55ZWFycyAmJlxuICAgICAgICBkMC5tb250aHMgPT09IGQxLm1vbnRocyAmJlxuICAgICAgICBkMC5kYXlzID09PSBkMS5kYXlzICYmXG4gICAgICAgIGQwLm1pbGxpc2Vjb25kcyA9PT0gZDEubWlsbGlzZWNvbmRzO1xufVxuZnVuY3Rpb24gYXNDbGVhbkRheXMoZHVyKSB7XG4gICAgaWYgKCFkdXIueWVhcnMgJiYgIWR1ci5tb250aHMgJiYgIWR1ci5taWxsaXNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIGR1ci5kYXlzO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn1cbi8vIFNpbXBsZSBNYXRoXG5mdW5jdGlvbiBhZGREdXJhdGlvbnMoZDAsIGQxKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IGQwLnllYXJzICsgZDEueWVhcnMsXG4gICAgICAgIG1vbnRoczogZDAubW9udGhzICsgZDEubW9udGhzLFxuICAgICAgICBkYXlzOiBkMC5kYXlzICsgZDEuZGF5cyxcbiAgICAgICAgbWlsbGlzZWNvbmRzOiBkMC5taWxsaXNlY29uZHMgKyBkMS5taWxsaXNlY29uZHMsXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHN1YnRyYWN0RHVyYXRpb25zKGQxLCBkMCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHllYXJzOiBkMS55ZWFycyAtIGQwLnllYXJzLFxuICAgICAgICBtb250aHM6IGQxLm1vbnRocyAtIGQwLm1vbnRocyxcbiAgICAgICAgZGF5czogZDEuZGF5cyAtIGQwLmRheXMsXG4gICAgICAgIG1pbGxpc2Vjb25kczogZDEubWlsbGlzZWNvbmRzIC0gZDAubWlsbGlzZWNvbmRzLFxuICAgIH07XG59XG5mdW5jdGlvbiBtdWx0aXBseUR1cmF0aW9uKGQsIG4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICB5ZWFyczogZC55ZWFycyAqIG4sXG4gICAgICAgIG1vbnRoczogZC5tb250aHMgKiBuLFxuICAgICAgICBkYXlzOiBkLmRheXMgKiBuLFxuICAgICAgICBtaWxsaXNlY29uZHM6IGQubWlsbGlzZWNvbmRzICogbixcbiAgICB9O1xufVxuLy8gQ29udmVyc2lvbnNcbi8vIFwiUm91Z2hcIiBiZWNhdXNlIHRoZXkgYXJlIGJhc2VkIG9uIGF2ZXJhZ2UtY2FzZSBHcmVnb3JpYW4gbW9udGhzL3llYXJzXG5mdW5jdGlvbiBhc1JvdWdoWWVhcnMoZHVyKSB7XG4gICAgcmV0dXJuIGFzUm91Z2hEYXlzKGR1cikgLyAzNjU7XG59XG5mdW5jdGlvbiBhc1JvdWdoTW9udGhzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoRGF5cyhkdXIpIC8gMzA7XG59XG5mdW5jdGlvbiBhc1JvdWdoRGF5cyhkdXIpIHtcbiAgICByZXR1cm4gYXNSb3VnaE1zKGR1cikgLyA4NjRlNTtcbn1cbmZ1bmN0aW9uIGFzUm91Z2hNaW51dGVzKGR1cikge1xuICAgIHJldHVybiBhc1JvdWdoTXMoZHVyKSAvICgxMDAwICogNjApO1xufVxuZnVuY3Rpb24gYXNSb3VnaFNlY29uZHMoZHVyKSB7XG4gICAgcmV0dXJuIGFzUm91Z2hNcyhkdXIpIC8gMTAwMDtcbn1cbmZ1bmN0aW9uIGFzUm91Z2hNcyhkdXIpIHtcbiAgICByZXR1cm4gZHVyLnllYXJzICogKDM2NSAqIDg2NGU1KSArXG4gICAgICAgIGR1ci5tb250aHMgKiAoMzAgKiA4NjRlNSkgK1xuICAgICAgICBkdXIuZGF5cyAqIDg2NGU1ICtcbiAgICAgICAgZHVyLm1pbGxpc2Vjb25kcztcbn1cbi8vIEFkdmFuY2VkIE1hdGhcbmZ1bmN0aW9uIHdob2xlRGl2aWRlRHVyYXRpb25zKG51bWVyYXRvciwgZGVub21pbmF0b3IpIHtcbiAgICBsZXQgcmVzID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IElOVEVSTkFMX1VOSVRTLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGxldCB1bml0ID0gSU5URVJOQUxfVU5JVFNbaV07XG4gICAgICAgIGlmIChkZW5vbWluYXRvclt1bml0XSkge1xuICAgICAgICAgICAgbGV0IGxvY2FsUmVzID0gbnVtZXJhdG9yW3VuaXRdIC8gZGVub21pbmF0b3JbdW5pdF07XG4gICAgICAgICAgICBpZiAoIWlzSW50KGxvY2FsUmVzKSB8fCAocmVzICE9PSBudWxsICYmIHJlcyAhPT0gbG9jYWxSZXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMgPSBsb2NhbFJlcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChudW1lcmF0b3JbdW5pdF0pIHtcbiAgICAgICAgICAgIC8vIG5lZWRzIHRvIGRpdmlkZSBieSBzb21ldGhpbmcgYnV0IGNhbid0IVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkdXIpIHtcbiAgICBsZXQgbXMgPSBkdXIubWlsbGlzZWNvbmRzO1xuICAgIGlmIChtcykge1xuICAgICAgICBpZiAobXMgJSAxMDAwICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnbWlsbGlzZWNvbmQnLCB2YWx1ZTogbXMgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXMgJSAoMTAwMCAqIDYwKSAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3NlY29uZCcsIHZhbHVlOiBtcyAvIDEwMDAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXMgJSAoMTAwMCAqIDYwICogNjApICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnbWludXRlJywgdmFsdWU6IG1zIC8gKDEwMDAgKiA2MCkgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobXMpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdob3VyJywgdmFsdWU6IG1zIC8gKDEwMDAgKiA2MCAqIDYwKSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChkdXIuZGF5cykge1xuICAgICAgICBpZiAoZHVyLnNwZWNpZmllZFdlZWtzICYmIGR1ci5kYXlzICUgNyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3dlZWsnLCB2YWx1ZTogZHVyLmRheXMgLyA3IH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdW5pdDogJ2RheScsIHZhbHVlOiBkdXIuZGF5cyB9O1xuICAgIH1cbiAgICBpZiAoZHVyLm1vbnRocykge1xuICAgICAgICByZXR1cm4geyB1bml0OiAnbW9udGgnLCB2YWx1ZTogZHVyLm1vbnRocyB9O1xuICAgIH1cbiAgICBpZiAoZHVyLnllYXJzKSB7XG4gICAgICAgIHJldHVybiB7IHVuaXQ6ICd5ZWFyJywgdmFsdWU6IGR1ci55ZWFycyB9O1xuICAgIH1cbiAgICByZXR1cm4geyB1bml0OiAnbWlsbGlzZWNvbmQnLCB2YWx1ZTogMCB9O1xufVxuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLy8gTWVyZ2VzIGFuIGFycmF5IG9mIG9iamVjdHMgaW50byBhIHNpbmdsZSBvYmplY3QuXG4vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IGFsbG93cyBmb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgd2hvJ3Mgb2JqZWN0IHZhbHVlcyB3aWxsIGJlIG1lcmdlZCB0b2dldGhlci5cbmZ1bmN0aW9uIG1lcmdlUHJvcHMocHJvcE9ianMsIGNvbXBsZXhQcm9wc01hcCkge1xuICAgIGxldCBkZXN0ID0ge307XG4gICAgaWYgKGNvbXBsZXhQcm9wc01hcCkge1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNvbXBsZXhQcm9wc01hcCkge1xuICAgICAgICAgICAgaWYgKGNvbXBsZXhQcm9wc01hcFtuYW1lXSA9PT0gaXNNYXliZU9iamVjdHNFcXVhbCkgeyAvLyBpbXBsaWVzIHRoYXQgaXQncyBvYmplY3QtbWVyZ2VhYmxlXG4gICAgICAgICAgICAgICAgbGV0IGNvbXBsZXhPYmpzID0gW107XG4gICAgICAgICAgICAgICAgLy8gY29sbGVjdCB0aGUgdHJhaWxpbmcgb2JqZWN0IHZhbHVlcywgc3RvcHBpbmcgd2hlbiBhIG5vbi1vYmplY3QgaXMgZGlzY292ZXJlZFxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBwcm9wT2Jqcy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gcHJvcE9ianNbaV1bbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4T2Jqcy51bnNoaWZ0KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbbmFtZV0gPSB2YWw7IC8vIGlmIHRoZXJlIHdlcmUgbm8gb2JqZWN0cywgdGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0cmFpbGluZyB2YWx1ZXMgd2VyZSBvYmplY3RzLCB1c2UgdGhlIG1lcmdlZCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChjb21wbGV4T2Jqcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtuYW1lXSA9IG1lcmdlUHJvcHMoY29tcGxleE9ianMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBjb3B5IHZhbHVlcyBpbnRvIHRoZSBkZXN0aW5hdGlvbiwgZ29pbmcgZnJvbSBsYXN0IHRvIGZpcnN0XG4gICAgZm9yIChsZXQgaSA9IHByb3BPYmpzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICAgIGxldCBwcm9wcyA9IHByb3BPYmpzW2ldO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoIShuYW1lIGluIGRlc3QpKSB7IC8vIGlmIGFscmVhZHkgYXNzaWduZWQgYnkgcHJldmlvdXMgcHJvcHMgb3IgY29tcGxleCBwcm9wcywgZG9uJ3QgcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBkZXN0W25hbWVdID0gcHJvcHNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlc3Q7XG59XG5mdW5jdGlvbiBmaWx0ZXJIYXNoKGhhc2gsIGZ1bmMpIHtcbiAgICBsZXQgZmlsdGVyZWQgPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgaW4gaGFzaCkge1xuICAgICAgICBpZiAoZnVuYyhoYXNoW2tleV0sIGtleSkpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tleV0gPSBoYXNoW2tleV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkO1xufVxuZnVuY3Rpb24gbWFwSGFzaChoYXNoLCBmdW5jKSB7XG4gICAgbGV0IG5ld0hhc2ggPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgaW4gaGFzaCkge1xuICAgICAgICBuZXdIYXNoW2tleV0gPSBmdW5jKGhhc2hba2V5XSwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0hhc2g7XG59XG5mdW5jdGlvbiBhcnJheVRvSGFzaChhKSB7XG4gICAgbGV0IGhhc2ggPSB7fTtcbiAgICBmb3IgKGxldCBpdGVtIG9mIGEpIHtcbiAgICAgICAgaGFzaFtpdGVtXSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xufVxuLy8gVE9ETzogcmVhc3Nlc3MgYnJvd3NlciBzdXBwb3J0XG4vLyBodHRwczovL2Nhbml1c2UuY29tLz9zZWFyY2g9b2JqZWN0LnZhbHVlc1xuZnVuY3Rpb24gaGFzaFZhbHVlc1RvQXJyYXkob2JqKSB7XG4gICAgbGV0IGEgPSBbXTtcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGEucHVzaChvYmpba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBhO1xufVxuZnVuY3Rpb24gaXNQcm9wc0VxdWFsKG9iajAsIG9iajEpIHtcbiAgICBpZiAob2JqMCA9PT0gb2JqMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChsZXQga2V5IGluIG9iajApIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqMCwga2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iajEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBvYmoxKSB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iajEsIGtleSkpIHtcbiAgICAgICAgICAgIGlmIChvYmowW2tleV0gIT09IG9iajFba2V5XSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmNvbnN0IEhBTkRMRVJfUkUgPSAvXm9uW0EtWl0vO1xuZnVuY3Rpb24gaXNOb25IYW5kbGVyUHJvcHNFcXVhbChvYmowLCBvYmoxKSB7XG4gICAgY29uc3Qga2V5cyA9IGdldFVuZXF1YWxQcm9wcyhvYmowLCBvYmoxKTtcbiAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAoIUhBTkRMRVJfUkUudGVzdChrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZXRVbmVxdWFsUHJvcHMob2JqMCwgb2JqMSkge1xuICAgIGxldCBrZXlzID0gW107XG4gICAgZm9yIChsZXQga2V5IGluIG9iajApIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqMCwga2V5KSkge1xuICAgICAgICAgICAgaWYgKCEoa2V5IGluIG9iajEpKSB7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQga2V5IGluIG9iajEpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqMSwga2V5KSkge1xuICAgICAgICAgICAgaWYgKG9iajBba2V5XSAhPT0gb2JqMVtrZXldKSB7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBjb21wYXJlT2JqcyhvbGRQcm9wcywgbmV3UHJvcHMsIGVxdWFsaXR5RnVuY3MgPSB7fSkge1xuICAgIGlmIChvbGRQcm9wcyA9PT0gbmV3UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAobGV0IGtleSBpbiBuZXdQcm9wcykge1xuICAgICAgICBpZiAoa2V5IGluIG9sZFByb3BzICYmIGlzT2JqVmFsc0VxdWFsKG9sZFByb3BzW2tleV0sIG5ld1Byb3BzW2tleV0sIGVxdWFsaXR5RnVuY3Nba2V5XSkpIDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gY2hlY2sgZm9yIHByb3BzIHRoYXQgd2VyZSBvbWl0dGVkIGluIHRoZSBuZXdcbiAgICBmb3IgKGxldCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIG5ld1Byb3BzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLypcbmFzc3VtZWQgXCJ0cnVlXCIgZXF1YWxpdHkgZm9yIGhhbmRsZXIgbmFtZXMgbGlrZSBcIm9uUmVjZWl2ZVNvbWV0aGluZ1wiXG4qL1xuZnVuY3Rpb24gaXNPYmpWYWxzRXF1YWwodmFsMCwgdmFsMSwgY29tcGFyYXRvcikge1xuICAgIGlmICh2YWwwID09PSB2YWwxIHx8IGNvbXBhcmF0b3IgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKHZhbDAsIHZhbDEpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBjb2xsZWN0RnJvbUhhc2goaGFzaCwgc3RhcnRJbmRleCA9IDAsIGVuZEluZGV4LCBzdGVwID0gMSkge1xuICAgIGxldCByZXMgPSBbXTtcbiAgICBpZiAoZW5kSW5kZXggPT0gbnVsbCkge1xuICAgICAgICBlbmRJbmRleCA9IE9iamVjdC5rZXlzKGhhc2gpLmxlbmd0aDtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSArPSBzdGVwKSB7XG4gICAgICAgIGxldCB2YWwgPSBoYXNoW2ldO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHsgLy8gd2lsbCBkaXNyZWdhcmQgdW5kZWZpbmVkIGZvciBzcGFyc2UgYXJyYXlzXG4gICAgICAgICAgICByZXMucHVzaCh2YWwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFRPRE86IG5ldyB1dGlsIGFycmF5aWZ5P1xuZnVuY3Rpb24gcmVtb3ZlRXhhY3QoYXJyYXksIGV4YWN0VmFsKSB7XG4gICAgbGV0IHJlbW92ZUNudCA9IDA7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIGlmIChhcnJheVtpXSA9PT0gZXhhY3RWYWwpIHtcbiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIHJlbW92ZUNudCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZW1vdmVDbnQ7XG59XG5mdW5jdGlvbiBpc0FycmF5c0VxdWFsKGEwLCBhMSwgZXF1YWxpdHlGdW5jKSB7XG4gICAgaWYgKGEwID09PSBhMSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGxlbiA9IGEwLmxlbmd0aDtcbiAgICBsZXQgaTtcbiAgICBpZiAobGVuICE9PSBhMS5sZW5ndGgpIHsgLy8gbm90IGFycmF5PyBvciBub3Qgc2FtZSBsZW5ndGg/XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGlmICghKGVxdWFsaXR5RnVuYyA/IGVxdWFsaXR5RnVuYyhhMFtpXSwgYTFbaV0pIDogYTBbaV0gPT09IGExW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCBEQVlfSURTID0gWydzdW4nLCAnbW9uJywgJ3R1ZScsICd3ZWQnLCAndGh1JywgJ2ZyaScsICdzYXQnXTtcbi8vIEFkZGluZ1xuZnVuY3Rpb24gYWRkV2Vla3MobSwgbikge1xuICAgIGxldCBhID0gZGF0ZVRvVXRjQXJyYXkobSk7XG4gICAgYVsyXSArPSBuICogNztcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYSk7XG59XG5mdW5jdGlvbiBhZGREYXlzKG0sIG4pIHtcbiAgICBsZXQgYSA9IGRhdGVUb1V0Y0FycmF5KG0pO1xuICAgIGFbMl0gKz0gbjtcbiAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYSk7XG59XG5mdW5jdGlvbiBhZGRNcyhtLCBuKSB7XG4gICAgbGV0IGEgPSBkYXRlVG9VdGNBcnJheShtKTtcbiAgICBhWzZdICs9IG47XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGEpO1xufVxuLy8gRGlmZmluZyAoYWxsIHJldHVybiBmbG9hdHMpXG4vLyBUT0RPOiB3aHkgbm90IHVzZSByYW5nZXM/XG5mdW5jdGlvbiBkaWZmV2Vla3MobTAsIG0xKSB7XG4gICAgcmV0dXJuIGRpZmZEYXlzKG0wLCBtMSkgLyA3O1xufVxuZnVuY3Rpb24gZGlmZkRheXMobTAsIG0xKSB7XG4gICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpO1xufVxuZnVuY3Rpb24gZGlmZkhvdXJzKG0wLCBtMSkge1xuICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvICgxMDAwICogNjAgKiA2MCk7XG59XG5mdW5jdGlvbiBkaWZmTWludXRlcyhtMCwgbTEpIHtcbiAgICByZXR1cm4gKG0xLnZhbHVlT2YoKSAtIG0wLnZhbHVlT2YoKSkgLyAoMTAwMCAqIDYwKTtcbn1cbmZ1bmN0aW9uIGRpZmZTZWNvbmRzKG0wLCBtMSkge1xuICAgIHJldHVybiAobTEudmFsdWVPZigpIC0gbTAudmFsdWVPZigpKSAvIDEwMDA7XG59XG5mdW5jdGlvbiBkaWZmRGF5QW5kVGltZShtMCwgbTEpIHtcbiAgICBsZXQgbTBkYXkgPSBzdGFydE9mRGF5KG0wKTtcbiAgICBsZXQgbTFkYXkgPSBzdGFydE9mRGF5KG0xKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB5ZWFyczogMCxcbiAgICAgICAgbW9udGhzOiAwLFxuICAgICAgICBkYXlzOiBNYXRoLnJvdW5kKGRpZmZEYXlzKG0wZGF5LCBtMWRheSkpLFxuICAgICAgICBtaWxsaXNlY29uZHM6IChtMS52YWx1ZU9mKCkgLSBtMWRheS52YWx1ZU9mKCkpIC0gKG0wLnZhbHVlT2YoKSAtIG0wZGF5LnZhbHVlT2YoKSksXG4gICAgfTtcbn1cbi8vIERpZmZpbmcgV2hvbGUgVW5pdHNcbmZ1bmN0aW9uIGRpZmZXaG9sZVdlZWtzKG0wLCBtMSkge1xuICAgIGxldCBkID0gZGlmZldob2xlRGF5cyhtMCwgbTEpO1xuICAgIGlmIChkICE9PSBudWxsICYmIGQgJSA3ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBkIC8gNztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkaWZmV2hvbGVEYXlzKG0wLCBtMSkge1xuICAgIGlmICh0aW1lQXNNcyhtMCkgPT09IHRpbWVBc01zKG0xKSkge1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChkaWZmRGF5cyhtMCwgbTEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG4vLyBTdGFydC1PZlxuZnVuY3Rpb24gc3RhcnRPZkRheShtKSB7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKFtcbiAgICAgICAgbS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBtLmdldFVUQ01vbnRoKCksXG4gICAgICAgIG0uZ2V0VVRDRGF0ZSgpLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc3RhcnRPZkhvdXIobSkge1xuICAgIHJldHVybiBhcnJheVRvVXRjRGF0ZShbXG4gICAgICAgIG0uZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgbS5nZXRVVENNb250aCgpLFxuICAgICAgICBtLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgbS5nZXRVVENIb3VycygpLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc3RhcnRPZk1pbnV0ZShtKSB7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKFtcbiAgICAgICAgbS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBtLmdldFVUQ01vbnRoKCksXG4gICAgICAgIG0uZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBtLmdldFVUQ0hvdXJzKCksXG4gICAgICAgIG0uZ2V0VVRDTWludXRlcygpLFxuICAgIF0pO1xufVxuZnVuY3Rpb24gc3RhcnRPZlNlY29uZChtKSB7XG4gICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKFtcbiAgICAgICAgbS5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBtLmdldFVUQ01vbnRoKCksXG4gICAgICAgIG0uZ2V0VVRDRGF0ZSgpLFxuICAgICAgICBtLmdldFVUQ0hvdXJzKCksXG4gICAgICAgIG0uZ2V0VVRDTWludXRlcygpLFxuICAgICAgICBtLmdldFVUQ1NlY29uZHMoKSxcbiAgICBdKTtcbn1cbi8vIFdlZWsgQ29tcHV0YXRpb25cbmZ1bmN0aW9uIHdlZWtPZlllYXIobWFya2VyLCBkb3csIGRveSkge1xuICAgIGxldCB5ID0gbWFya2VyLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgbGV0IHcgPSB3ZWVrT2ZHaXZlblllYXIobWFya2VyLCB5LCBkb3csIGRveSk7XG4gICAgaWYgKHcgPCAxKSB7XG4gICAgICAgIHJldHVybiB3ZWVrT2ZHaXZlblllYXIobWFya2VyLCB5IC0gMSwgZG93LCBkb3kpO1xuICAgIH1cbiAgICBsZXQgbmV4dFcgPSB3ZWVrT2ZHaXZlblllYXIobWFya2VyLCB5ICsgMSwgZG93LCBkb3kpO1xuICAgIGlmIChuZXh0VyA+PSAxKSB7XG4gICAgICAgIHJldHVybiBNYXRoLm1pbih3LCBuZXh0Vyk7XG4gICAgfVxuICAgIHJldHVybiB3O1xufVxuZnVuY3Rpb24gd2Vla09mR2l2ZW5ZZWFyKG1hcmtlciwgeWVhciwgZG93LCBkb3kpIHtcbiAgICBsZXQgZmlyc3RXZWVrU3RhcnQgPSBhcnJheVRvVXRjRGF0ZShbeWVhciwgMCwgMSArIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSldKTtcbiAgICBsZXQgZGF5U3RhcnQgPSBzdGFydE9mRGF5KG1hcmtlcik7XG4gICAgbGV0IGRheXMgPSBNYXRoLnJvdW5kKGRpZmZEYXlzKGZpcnN0V2Vla1N0YXJ0LCBkYXlTdGFydCkpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMgLyA3KSArIDE7IC8vIHplcm8taW5kZXhlZFxufVxuLy8gc3RhcnQtb2YtZmlyc3Qtd2VlayAtIHN0YXJ0LW9mLXllYXJcbmZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgIC8vIGZpcnN0LXdlZWsgZGF5IC0tIHdoaWNoIGphbnVhcnkgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCB3ZWVrICg0IGZvciBpc28sIDEgZm9yIG90aGVyKVxuICAgIGxldCBmd2QgPSA3ICsgZG93IC0gZG95O1xuICAgIC8vIGZpcnN0LXdlZWsgZGF5IGxvY2FsIHdlZWtkYXkgLS0gd2hpY2ggbG9jYWwgd2Vla2RheSBpcyBmd2RcbiAgICBsZXQgZndkbHcgPSAoNyArIGFycmF5VG9VdGNEYXRlKFt5ZWFyLCAwLCBmd2RdKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xufVxuLy8gQXJyYXkgQ29udmVyc2lvblxuZnVuY3Rpb24gZGF0ZVRvTG9jYWxBcnJheShkYXRlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBkYXRlLmdldE1vbnRoKCksXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgICBkYXRlLmdldEhvdXJzKCksXG4gICAgICAgIGRhdGUuZ2V0TWludXRlcygpLFxuICAgICAgICBkYXRlLmdldFNlY29uZHMoKSxcbiAgICAgICAgZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gYXJyYXlUb0xvY2FsRGF0ZShhKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGFbMF0sIGFbMV0gfHwgMCwgYVsyXSA9PSBudWxsID8gMSA6IGFbMl0sIC8vIGRheSBvZiBtb250aFxuICAgIGFbM10gfHwgMCwgYVs0XSB8fCAwLCBhWzVdIHx8IDApO1xufVxuZnVuY3Rpb24gZGF0ZVRvVXRjQXJyYXkoZGF0ZSkge1xuICAgIHJldHVybiBbXG4gICAgICAgIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENNb250aCgpLFxuICAgICAgICBkYXRlLmdldFVUQ0RhdGUoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENIb3VycygpLFxuICAgICAgICBkYXRlLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgICAgZGF0ZS5nZXRVVENTZWNvbmRzKCksXG4gICAgICAgIGRhdGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCksXG4gICAgXTtcbn1cbmZ1bmN0aW9uIGFycmF5VG9VdGNEYXRlKGEpIHtcbiAgICAvLyBhY2NvcmRpbmcgdG8gd2ViIHN0YW5kYXJkcyAoYW5kIFNhZmFyaSksIGEgbW9udGggaW5kZXggaXMgcmVxdWlyZWQuXG4gICAgLy8gbWFzc2FnZSBpZiBvbmx5IGdpdmVuIGEgeWVhci5cbiAgICBpZiAoYS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgYSA9IGEuY29uY2F0KFswXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyguLi5hKSk7XG59XG4vLyBPdGhlciBVdGlsc1xuZnVuY3Rpb24gaXNWYWxpZERhdGUobSkge1xuICAgIHJldHVybiAhaXNOYU4obS52YWx1ZU9mKCkpO1xufVxuZnVuY3Rpb24gdGltZUFzTXMobSkge1xuICAgIHJldHVybiBtLmdldFVUQ0hvdXJzKCkgKiAxMDAwICogNjAgKiA2MCArXG4gICAgICAgIG0uZ2V0VVRDTWludXRlcygpICogMTAwMCAqIDYwICtcbiAgICAgICAgbS5nZXRVVENTZWNvbmRzKCkgKiAxMDAwICtcbiAgICAgICAgbS5nZXRVVENNaWxsaXNlY29uZHMoKTtcbn1cblxuLy8gdGltZVpvbmVPZmZzZXQgaXMgaW4gbWludXRlc1xuZnVuY3Rpb24gYnVpbGRJc29TdHJpbmcobWFya2VyLCB0aW1lWm9uZU9mZnNldCwgc3RyaXBaZXJvVGltZSA9IGZhbHNlKSB7XG4gICAgbGV0IHMgPSBtYXJrZXIudG9JU09TdHJpbmcoKTtcbiAgICBzID0gcy5yZXBsYWNlKCcuMDAwJywgJycpO1xuICAgIGlmIChzdHJpcFplcm9UaW1lKSB7XG4gICAgICAgIHMgPSBzLnJlcGxhY2UoJ1QwMDowMDowMFonLCAnJyk7XG4gICAgfVxuICAgIGlmIChzLmxlbmd0aCA+IDEwKSB7IC8vIHRpbWUgcGFydCB3YXNuJ3Qgc3RyaXBwZWQsIGNhbiBhZGQgdGltZXpvbmUgaW5mb1xuICAgICAgICBpZiAodGltZVpvbmVPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsICcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aW1lWm9uZU9mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgnWicsIGZvcm1hdFRpbWVab25lT2Zmc2V0KHRpbWVab25lT2Zmc2V0LCB0cnVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3RoZXJ3aXNlLCBpdHMgVVRDLTAgYW5kIHdlIHdhbnQgdG8ga2VlcCB0aGUgWlxuICAgIH1cbiAgICByZXR1cm4gcztcbn1cbi8vIGZvcm1hdHMgdGhlIGRhdGUsIGJ1dCB3aXRoIG5vIHRpbWUgcGFydFxuLy8gVE9ETzogc29tZWhvdyBtZXJnZSB3aXRoIGJ1aWxkSXNvU3RyaW5nIGFuZCBzdHJpcFplcm9UaW1lXG4vLyBUT0RPOiByZW5hbWUuIG9taXQgXCJzdHJpbmdcIlxuZnVuY3Rpb24gZm9ybWF0RGF5U3RyaW5nKG1hcmtlcikge1xuICAgIHJldHVybiBtYXJrZXIudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9ULiokLywgJycpO1xufVxuZnVuY3Rpb24gZm9ybWF0SXNvTW9udGhTdHIobWFya2VyKSB7XG4gICAgcmV0dXJuIG1hcmtlci50b0lTT1N0cmluZygpLm1hdGNoKC9eXFxkezR9LVxcZHsyfS8pWzBdO1xufVxuLy8gVE9ETzogdXNlIERhdGU6OnRvSVNPU3RyaW5nIGFuZCB1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgVD9cbmZ1bmN0aW9uIGZvcm1hdElzb1RpbWVTdHJpbmcobWFya2VyKSB7XG4gICAgcmV0dXJuIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENIb3VycygpLCAyKSArICc6JyArXG4gICAgICAgIHBhZFN0YXJ0KG1hcmtlci5nZXRVVENNaW51dGVzKCksIDIpICsgJzonICtcbiAgICAgICAgcGFkU3RhcnQobWFya2VyLmdldFVUQ1NlY29uZHMoKSwgMik7XG59XG5mdW5jdGlvbiBmb3JtYXRUaW1lWm9uZU9mZnNldChtaW51dGVzLCBkb0lzbyA9IGZhbHNlKSB7XG4gICAgbGV0IHNpZ24gPSBtaW51dGVzIDwgMCA/ICctJyA6ICcrJztcbiAgICBsZXQgYWJzID0gTWF0aC5hYnMobWludXRlcyk7XG4gICAgbGV0IGhvdXJzID0gTWF0aC5mbG9vcihhYnMgLyA2MCk7XG4gICAgbGV0IG1pbnMgPSBNYXRoLnJvdW5kKGFicyAlIDYwKTtcbiAgICBpZiAoZG9Jc28pIHtcbiAgICAgICAgcmV0dXJuIGAke3NpZ24gKyBwYWRTdGFydChob3VycywgMil9OiR7cGFkU3RhcnQobWlucywgMil9YDtcbiAgICB9XG4gICAgcmV0dXJuIGBHTVQke3NpZ259JHtob3Vyc30ke21pbnMgPyBgOiR7cGFkU3RhcnQobWlucywgMil9YCA6ICcnfWA7XG59XG5cbmZ1bmN0aW9uIG1lbW9pemUod29ya2VyRnVuYywgcmVzRXF1YWxpdHksIHRlYXJkb3duRnVuYykge1xuICAgIGxldCBjdXJyZW50QXJncztcbiAgICBsZXQgY3VycmVudFJlcztcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLm5ld0FyZ3MpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50QXJncykge1xuICAgICAgICAgICAgY3VycmVudFJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWlzQXJyYXlzRXF1YWwoY3VycmVudEFyZ3MsIG5ld0FyZ3MpKSB7XG4gICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlcyA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJncyk7XG4gICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXMpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlcyA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJncyA9IG5ld0FyZ3M7XG4gICAgICAgIHJldHVybiBjdXJyZW50UmVzO1xuICAgIH07XG59XG5mdW5jdGlvbiBtZW1vaXplT2JqQXJnKHdvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICBsZXQgY3VycmVudEFyZztcbiAgICBsZXQgY3VycmVudFJlcztcbiAgICByZXR1cm4gKG5ld0FyZykgPT4ge1xuICAgICAgICBpZiAoIWN1cnJlbnRBcmcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZXMgPSB3b3JrZXJGdW5jLmNhbGwodGhpcywgbmV3QXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaXNQcm9wc0VxdWFsKGN1cnJlbnRBcmcsIG5ld0FyZykpIHtcbiAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICB0ZWFyZG93bkZ1bmMoY3VycmVudFJlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzID0gd29ya2VyRnVuYy5jYWxsKHRoaXMsIG5ld0FyZyk7XG4gICAgICAgICAgICBpZiAoIXJlc0VxdWFsaXR5IHx8ICFyZXNFcXVhbGl0eShyZXMsIGN1cnJlbnRSZXMpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFJlcyA9IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50QXJnID0gbmV3QXJnO1xuICAgICAgICByZXR1cm4gY3VycmVudFJlcztcbiAgICB9O1xufVxuZnVuY3Rpb24gbWVtb2l6ZUFycmF5bGlrZSgvLyB1c2VkIGF0IGFsbD9cbndvcmtlckZ1bmMsIHJlc0VxdWFsaXR5LCB0ZWFyZG93bkZ1bmMpIHtcbiAgICBsZXQgY3VycmVudEFyZ1NldHMgPSBbXTtcbiAgICBsZXQgY3VycmVudFJlc3VsdHMgPSBbXTtcbiAgICByZXR1cm4gKG5ld0FyZ1NldHMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRMZW4gPSBjdXJyZW50QXJnU2V0cy5sZW5ndGg7XG4gICAgICAgIGxldCBuZXdMZW4gPSBuZXdBcmdTZXRzLmxlbmd0aDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBmb3IgKDsgaSA8IGN1cnJlbnRMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKCFuZXdBcmdTZXRzW2ldKSB7IC8vIG9uZSBvZiB0aGUgb2xkIHNldHMgbm8gbG9uZ2VyIGV4aXN0c1xuICAgICAgICAgICAgICAgIGlmICh0ZWFyZG93bkZ1bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGVhcmRvd25GdW5jKGN1cnJlbnRSZXN1bHRzW2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNBcnJheXNFcXVhbChjdXJyZW50QXJnU2V0c1tpXSwgbmV3QXJnU2V0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGVhcmRvd25GdW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlYXJkb3duRnVuYyhjdXJyZW50UmVzdWx0c1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXMgPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ1NldHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzRXF1YWxpdHkgfHwgIXJlc0VxdWFsaXR5KHJlcywgY3VycmVudFJlc3VsdHNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSZXN1bHRzW2ldID0gcmVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKDsgaSA8IG5ld0xlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVzdWx0c1tpXSA9IHdvcmtlckZ1bmMuYXBwbHkodGhpcywgbmV3QXJnU2V0c1tpXSk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZ1NldHMgPSBuZXdBcmdTZXRzO1xuICAgICAgICBjdXJyZW50UmVzdWx0cy5zcGxpY2UobmV3TGVuKTsgLy8gcmVtb3ZlIGV4Y2Vzc1xuICAgICAgICByZXR1cm4gY3VycmVudFJlc3VsdHM7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lbW9pemVIYXNobGlrZSh3b3JrZXJGdW5jLCByZXNFcXVhbGl0eSwgdGVhcmRvd25GdW5jKSB7XG4gICAgbGV0IGN1cnJlbnRBcmdIYXNoID0ge307XG4gICAgbGV0IGN1cnJlbnRSZXNIYXNoID0ge307XG4gICAgcmV0dXJuIChuZXdBcmdIYXNoKSA9PiB7XG4gICAgICAgIGxldCBuZXdSZXNIYXNoID0ge307XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBuZXdBcmdIYXNoKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZXNIYXNoW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdSZXNIYXNoW2tleV0gPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ0hhc2hba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNBcnJheXNFcXVhbChjdXJyZW50QXJnSGFzaFtrZXldLCBuZXdBcmdIYXNoW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRlYXJkb3duRnVuYykge1xuICAgICAgICAgICAgICAgICAgICB0ZWFyZG93bkZ1bmMoY3VycmVudFJlc0hhc2hba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCByZXMgPSB3b3JrZXJGdW5jLmFwcGx5KHRoaXMsIG5ld0FyZ0hhc2hba2V5XSk7XG4gICAgICAgICAgICAgICAgbmV3UmVzSGFzaFtrZXldID0gKHJlc0VxdWFsaXR5ICYmIHJlc0VxdWFsaXR5KHJlcywgY3VycmVudFJlc0hhc2hba2V5XSkpXG4gICAgICAgICAgICAgICAgICAgID8gY3VycmVudFJlc0hhc2hba2V5XVxuICAgICAgICAgICAgICAgICAgICA6IHJlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1Jlc0hhc2hba2V5XSA9IGN1cnJlbnRSZXNIYXNoW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEFyZ0hhc2ggPSBuZXdBcmdIYXNoO1xuICAgICAgICBjdXJyZW50UmVzSGFzaCA9IG5ld1Jlc0hhc2g7XG4gICAgICAgIHJldHVybiBuZXdSZXNIYXNoO1xuICAgIH07XG59XG5cbmNvbnN0IEVYVEVOREVEX1NFVFRJTkdTX0FORF9TRVZFUklUSUVTID0ge1xuICAgIHdlZWs6IDMsXG4gICAgc2VwYXJhdG9yOiAwLFxuICAgIG9taXRaZXJvTWludXRlOiAwLFxuICAgIG1lcmlkaWVtOiAwLFxuICAgIG9taXRDb21tYXM6IDAsXG59O1xuY29uc3QgU1RBTkRBUkRfREFURV9QUk9QX1NFVkVSSVRJRVMgPSB7XG4gICAgdGltZVpvbmVOYW1lOiA3LFxuICAgIGVyYTogNixcbiAgICB5ZWFyOiA1LFxuICAgIG1vbnRoOiA0LFxuICAgIGRheTogMixcbiAgICB3ZWVrZGF5OiAyLFxuICAgIGhvdXI6IDEsXG4gICAgbWludXRlOiAxLFxuICAgIHNlY29uZDogMSxcbn07XG5jb25zdCBNRVJJRElFTV9SRSA9IC9cXHMqKFthcF0pXFwuP21cXC4/L2k7IC8vIGVhdHMgdXAgbGVhZGluZyBzcGFjZXMgdG9vXG5jb25zdCBDT01NQV9SRSA9IC8sL2c7IC8vIHdlIG5lZWQgcmUgZm9yIGdsb2JhbG5lc3NcbmNvbnN0IE1VTFRJX1NQQUNFX1JFID0gL1xccysvZztcbmNvbnN0IExUUl9SRSA9IC9cXHUyMDBlL2c7IC8vIGNvbnRyb2wgY2hhcmFjdGVyXG5jb25zdCBVVENfUkUgPSAvVVRDfEdNVC87XG5jbGFzcyBOYXRpdmVGb3JtYXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKGZvcm1hdFNldHRpbmdzKSB7XG4gICAgICAgIGxldCBzdGFuZGFyZERhdGVQcm9wcyA9IHt9O1xuICAgICAgICBsZXQgZXh0ZW5kZWRTZXR0aW5ncyA9IHt9O1xuICAgICAgICBsZXQgc2V2ZXJpdHkgPSAwO1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGZvcm1hdFNldHRpbmdzKSB7XG4gICAgICAgICAgICBpZiAobmFtZSBpbiBFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUykge1xuICAgICAgICAgICAgICAgIGV4dGVuZGVkU2V0dGluZ3NbbmFtZV0gPSBmb3JtYXRTZXR0aW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBzZXZlcml0eSA9IE1hdGgubWF4KEVYVEVOREVEX1NFVFRJTkdTX0FORF9TRVZFUklUSUVTW25hbWVdLCBzZXZlcml0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFuZGFyZERhdGVQcm9wc1tuYW1lXSA9IGZvcm1hdFNldHRpbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lIGluIFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTKSB7IC8vIFRPRE86IHdoYXQgYWJvdXQgaG91cjEyPyBubyBzZXZlcml0eVxuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eSA9IE1hdGgubWF4KFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTW25hbWVdLCBzZXZlcml0eSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhbmRhcmREYXRlUHJvcHMgPSBzdGFuZGFyZERhdGVQcm9wcztcbiAgICAgICAgdGhpcy5leHRlbmRlZFNldHRpbmdzID0gZXh0ZW5kZWRTZXR0aW5ncztcbiAgICAgICAgdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB0aGlzLmJ1aWxkRm9ybWF0dGluZ0Z1bmMgPSBtZW1vaXplKGJ1aWxkRm9ybWF0dGluZ0Z1bmMpO1xuICAgIH1cbiAgICBmb3JtYXQoZGF0ZSwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1hdHRpbmdGdW5jKHRoaXMuc3RhbmRhcmREYXRlUHJvcHMsIHRoaXMuZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCkoZGF0ZSk7XG4gICAgfVxuICAgIGZvcm1hdFJhbmdlKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpIHtcbiAgICAgICAgbGV0IHsgc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MgfSA9IHRoaXM7XG4gICAgICAgIGxldCBkaWZmU2V2ZXJpdHkgPSBjb21wdXRlTWFya2VyRGlmZlNldmVyaXR5KHN0YXJ0Lm1hcmtlciwgZW5kLm1hcmtlciwgY29udGV4dC5jYWxlbmRhclN5c3RlbSk7XG4gICAgICAgIGlmICghZGlmZlNldmVyaXR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQoc3RhcnQsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBiaWdnZXN0VW5pdEZvclBhcnRpYWwgPSBkaWZmU2V2ZXJpdHk7XG4gICAgICAgIGlmIChiaWdnZXN0VW5pdEZvclBhcnRpYWwgPiAxICYmIC8vIHRoZSB0d28gZGF0ZXMgYXJlIGRpZmZlcmVudCBpbiBhIHdheSB0aGF0J3MgbGFyZ2VyIHNjYWxlIHRoYW4gdGltZVxuICAgICAgICAgICAgKHN0YW5kYXJkRGF0ZVByb3BzLnllYXIgPT09ICdudW1lcmljJyB8fCBzdGFuZGFyZERhdGVQcm9wcy55ZWFyID09PSAnMi1kaWdpdCcpICYmXG4gICAgICAgICAgICAoc3RhbmRhcmREYXRlUHJvcHMubW9udGggPT09ICdudW1lcmljJyB8fCBzdGFuZGFyZERhdGVQcm9wcy5tb250aCA9PT0gJzItZGlnaXQnKSAmJlxuICAgICAgICAgICAgKHN0YW5kYXJkRGF0ZVByb3BzLmRheSA9PT0gJ251bWVyaWMnIHx8IHN0YW5kYXJkRGF0ZVByb3BzLmRheSA9PT0gJzItZGlnaXQnKSkge1xuICAgICAgICAgICAgYmlnZ2VzdFVuaXRGb3JQYXJ0aWFsID0gMTsgLy8gbWFrZSBpdCBsb29rIGxpa2UgdGhlIGRhdGVzIGFyZSBvbmx5IGRpZmZlcmVudCBpbiB0ZXJtcyBvZiB0aW1lXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZ1bGwwID0gdGhpcy5mb3JtYXQoc3RhcnQsIGNvbnRleHQpO1xuICAgICAgICBsZXQgZnVsbDEgPSB0aGlzLmZvcm1hdChlbmQsIGNvbnRleHQpO1xuICAgICAgICBpZiAoZnVsbDAgPT09IGZ1bGwxKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnRpYWxEYXRlUHJvcHMgPSBjb21wdXRlUGFydGlhbEZvcm1hdHRpbmdPcHRpb25zKHN0YW5kYXJkRGF0ZVByb3BzLCBiaWdnZXN0VW5pdEZvclBhcnRpYWwpO1xuICAgICAgICBsZXQgcGFydGlhbEZvcm1hdHRpbmdGdW5jID0gYnVpbGRGb3JtYXR0aW5nRnVuYyhwYXJ0aWFsRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KTtcbiAgICAgICAgbGV0IHBhcnRpYWwwID0gcGFydGlhbEZvcm1hdHRpbmdGdW5jKHN0YXJ0KTtcbiAgICAgICAgbGV0IHBhcnRpYWwxID0gcGFydGlhbEZvcm1hdHRpbmdGdW5jKGVuZCk7XG4gICAgICAgIGxldCBpbnNlcnRpb24gPSBmaW5kQ29tbW9uSW5zZXJ0aW9uKGZ1bGwwLCBwYXJ0aWFsMCwgZnVsbDEsIHBhcnRpYWwxKTtcbiAgICAgICAgbGV0IHNlcGFyYXRvciA9IGV4dGVuZGVkU2V0dGluZ3Muc2VwYXJhdG9yIHx8IGJldHRlckRlZmF1bHRTZXBhcmF0b3IgfHwgY29udGV4dC5kZWZhdWx0U2VwYXJhdG9yIHx8ICcnO1xuICAgICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zZXJ0aW9uLmJlZm9yZSArIHBhcnRpYWwwICsgc2VwYXJhdG9yICsgcGFydGlhbDEgKyBpbnNlcnRpb24uYWZ0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGwwICsgc2VwYXJhdG9yICsgZnVsbDE7XG4gICAgfVxuICAgIGdldExhcmdlc3RVbml0KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc2V2ZXJpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3llYXInO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnbW9udGgnO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHJldHVybiAnd2Vlayc7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdkYXknO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RpbWUnOyAvLyByZWFsbHk/XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZEZvcm1hdHRpbmdGdW5jKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KSB7XG4gICAgbGV0IHN0YW5kYXJkRGF0ZVByb3BDbnQgPSBPYmplY3Qua2V5cyhzdGFuZGFyZERhdGVQcm9wcykubGVuZ3RoO1xuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wQ250ID09PSAxICYmIHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSA9PT0gJ3Nob3J0Jykge1xuICAgICAgICByZXR1cm4gKGRhdGUpID0+IChmb3JtYXRUaW1lWm9uZU9mZnNldChkYXRlLnRpbWVab25lT2Zmc2V0KSk7XG4gICAgfVxuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wQ250ID09PSAwICYmIGV4dGVuZGVkU2V0dGluZ3Mud2Vlaykge1xuICAgICAgICByZXR1cm4gKGRhdGUpID0+IChmb3JtYXRXZWVrTnVtYmVyKGNvbnRleHQuY29tcHV0ZVdlZWtOdW1iZXIoZGF0ZS5tYXJrZXIpLCBjb250ZXh0LndlZWtUZXh0LCBjb250ZXh0LndlZWtUZXh0TG9uZywgY29udGV4dC5sb2NhbGUsIGV4dGVuZGVkU2V0dGluZ3Mud2VlaykpO1xuICAgIH1cbiAgICByZXR1cm4gYnVpbGROYXRpdmVGb3JtYXR0aW5nRnVuYyhzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCk7XG59XG5mdW5jdGlvbiBidWlsZE5hdGl2ZUZvcm1hdHRpbmdGdW5jKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KSB7XG4gICAgc3RhbmRhcmREYXRlUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGFuZGFyZERhdGVQcm9wcyk7IC8vIGNvcHlcbiAgICBleHRlbmRlZFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZXh0ZW5kZWRTZXR0aW5ncyk7IC8vIGNvcHlcbiAgICBzYW5pdGl6ZVNldHRpbmdzKHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzKTtcbiAgICBzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZSA9ICdVVEMnOyAvLyB3ZSBsZXZlcmFnZSB0aGUgb25seSBndWFyYW50ZWVkIHRpbWVab25lIGZvciBvdXIgVVRDIG1hcmtlcnNcbiAgICBsZXQgbm9ybWFsRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoY29udGV4dC5sb2NhbGUuY29kZXMsIHN0YW5kYXJkRGF0ZVByb3BzKTtcbiAgICBsZXQgemVyb0Zvcm1hdDsgLy8gbmVlZGVkP1xuICAgIGlmIChleHRlbmRlZFNldHRpbmdzLm9taXRaZXJvTWludXRlKSB7XG4gICAgICAgIGxldCB6ZXJvUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBzdGFuZGFyZERhdGVQcm9wcyk7XG4gICAgICAgIGRlbGV0ZSB6ZXJvUHJvcHMubWludXRlOyAvLyBzZWNvbmRzIGFuZCBtcyB3ZXJlIGFscmVhZHkgY29uc2lkZXJlZCBpbiBzYW5pdGl6ZVNldHRpbmdzXG4gICAgICAgIHplcm9Gb3JtYXQgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChjb250ZXh0LmxvY2FsZS5jb2RlcywgemVyb1Byb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIChkYXRlKSA9PiB7XG4gICAgICAgIGxldCB7IG1hcmtlciB9ID0gZGF0ZTtcbiAgICAgICAgbGV0IGZvcm1hdDtcbiAgICAgICAgaWYgKHplcm9Gb3JtYXQgJiYgIW1hcmtlci5nZXRVVENNaW51dGVzKCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IHplcm9Gb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBub3JtYWxGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHMgPSBmb3JtYXQuZm9ybWF0KG1hcmtlcik7XG4gICAgICAgIHJldHVybiBwb3N0UHJvY2VzcyhzLCBkYXRlLCBzdGFuZGFyZERhdGVQcm9wcywgZXh0ZW5kZWRTZXR0aW5ncywgY29udGV4dCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplU2V0dGluZ3Moc3RhbmRhcmREYXRlUHJvcHMsIGV4dGVuZGVkU2V0dGluZ3MpIHtcbiAgICAvLyBkZWFsIHdpdGggYSBicm93c2VyIGluY29uc2lzdGVuY3kgd2hlcmUgZm9ybWF0dGluZyB0aGUgdGltZXpvbmVcbiAgICAvLyByZXF1aXJlcyB0aGF0IHRoZSBob3VyL21pbnV0ZSBiZSBwcmVzZW50LlxuICAgIGlmIChzdGFuZGFyZERhdGVQcm9wcy50aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgaWYgKCFzdGFuZGFyZERhdGVQcm9wcy5ob3VyKSB7XG4gICAgICAgICAgICBzdGFuZGFyZERhdGVQcm9wcy5ob3VyID0gJzItZGlnaXQnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhbmRhcmREYXRlUHJvcHMubWludXRlKSB7XG4gICAgICAgICAgICBzdGFuZGFyZERhdGVQcm9wcy5taW51dGUgPSAnMi1kaWdpdCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gb25seSBzdXBwb3J0IHNob3J0IHRpbWV6b25lIG5hbWVzXG4gICAgaWYgKHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSA9PT0gJ2xvbmcnKSB7XG4gICAgICAgIHN0YW5kYXJkRGF0ZVByb3BzLnRpbWVab25lTmFtZSA9ICdzaG9ydCc7XG4gICAgfVxuICAgIC8vIGlmIHJlcXVlc3RpbmcgdG8gZGlzcGxheSBzZWNvbmRzLCBNVVNUIGRpc3BsYXkgbWludXRlc1xuICAgIGlmIChleHRlbmRlZFNldHRpbmdzLm9taXRaZXJvTWludXRlICYmIChzdGFuZGFyZERhdGVQcm9wcy5zZWNvbmQgfHwgc3RhbmRhcmREYXRlUHJvcHMubWlsbGlzZWNvbmQpKSB7XG4gICAgICAgIGRlbGV0ZSBleHRlbmRlZFNldHRpbmdzLm9taXRaZXJvTWludXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBvc3RQcm9jZXNzKHMsIGRhdGUsIHN0YW5kYXJkRGF0ZVByb3BzLCBleHRlbmRlZFNldHRpbmdzLCBjb250ZXh0KSB7XG4gICAgcyA9IHMucmVwbGFjZShMVFJfUkUsICcnKTsgLy8gcmVtb3ZlIGxlZnQtdG8tcmlnaHQgY29udHJvbCBjaGFycy4gZG8gZmlyc3QuIGdvb2QgZm9yIG90aGVyIHJlZ2V4ZXNcbiAgICBpZiAoc3RhbmRhcmREYXRlUHJvcHMudGltZVpvbmVOYW1lID09PSAnc2hvcnQnKSB7XG4gICAgICAgIHMgPSBpbmplY3RUem9TdHIocywgKGNvbnRleHQudGltZVpvbmUgPT09ICdVVEMnIHx8IGRhdGUudGltZVpvbmVPZmZzZXQgPT0gbnVsbCkgP1xuICAgICAgICAgICAgJ1VUQycgOiAvLyBpbXBvcnRhbnQgdG8gbm9ybWFsaXplIGZvciBJRSwgd2hpY2ggZG9lcyBcIkdNVFwiXG4gICAgICAgICAgICBmb3JtYXRUaW1lWm9uZU9mZnNldChkYXRlLnRpbWVab25lT2Zmc2V0KSk7XG4gICAgfVxuICAgIGlmIChleHRlbmRlZFNldHRpbmdzLm9taXRDb21tYXMpIHtcbiAgICAgICAgcyA9IHMucmVwbGFjZShDT01NQV9SRSwgJycpLnRyaW0oKTtcbiAgICB9XG4gICAgaWYgKGV4dGVuZGVkU2V0dGluZ3Mub21pdFplcm9NaW51dGUpIHtcbiAgICAgICAgcyA9IHMucmVwbGFjZSgnOjAwJywgJycpOyAvLyB6ZXJvRm9ybWF0IGRvZXNuJ3QgYWx3YXlzIGFjaGlldmUgdGhpc1xuICAgIH1cbiAgICAvLyBeIGRvIGFueXRoaW5nIHRoYXQgbWlnaHQgY3JlYXRlIGFkamFjZW50IHNwYWNlcyBiZWZvcmUgdGhpcyBwb2ludCxcbiAgICAvLyBiZWNhdXNlIE1FUklESUVNX1JFIGxpa2VzIHRvIGVhdCB1cCBsb2FkaW5nIHNwYWNlc1xuICAgIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSBmYWxzZSkge1xuICAgICAgICBzID0gcy5yZXBsYWNlKE1FUklESUVNX1JFLCAnJykudHJpbSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChleHRlbmRlZFNldHRpbmdzLm1lcmlkaWVtID09PSAnbmFycm93JykgeyAvLyBhL3BcbiAgICAgICAgcyA9IHMucmVwbGFjZShNRVJJRElFTV9SRSwgKG0wLCBtMSkgPT4gbTEudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09ICdzaG9ydCcpIHsgLy8gYW0vcG1cbiAgICAgICAgcyA9IHMucmVwbGFjZShNRVJJRElFTV9SRSwgKG0wLCBtMSkgPT4gYCR7bTEudG9Mb2NhbGVMb3dlckNhc2UoKX1tYCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4dGVuZGVkU2V0dGluZ3MubWVyaWRpZW0gPT09ICdsb3dlcmNhc2UnKSB7IC8vIG90aGVyIG1lcmlkaWVtIHRyYW5zZm9ybWVycyBhbHJlYWR5IGNvbnZlcnRlZCB0byBsb3dlcmNhc2VcbiAgICAgICAgcyA9IHMucmVwbGFjZShNRVJJRElFTV9SRSwgKG0wKSA9PiBtMC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICB9XG4gICAgcyA9IHMucmVwbGFjZShNVUxUSV9TUEFDRV9SRSwgJyAnKTtcbiAgICBzID0gcy50cmltKCk7XG4gICAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBpbmplY3RUem9TdHIocywgdHpvU3RyKSB7XG4gICAgbGV0IHJlcGxhY2VkID0gZmFsc2U7XG4gICAgcyA9IHMucmVwbGFjZShVVENfUkUsICgpID0+IHtcbiAgICAgICAgcmVwbGFjZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHpvU3RyO1xuICAgIH0pO1xuICAgIC8vIElFMTEgZG9lc24ndCBpbmNsdWRlIFVUQy9HTVQgaW4gdGhlIG9yaWdpbmFsIHN0cmluZywgc28gYXBwZW5kIHRvIGVuZFxuICAgIGlmICghcmVwbGFjZWQpIHtcbiAgICAgICAgcyArPSBgICR7dHpvU3RyfWA7XG4gICAgfVxuICAgIHJldHVybiBzO1xufVxuZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcihudW0sIHdlZWtUZXh0LCB3ZWVrVGV4dExvbmcsIGxvY2FsZSwgZGlzcGxheSkge1xuICAgIGxldCBwYXJ0cyA9IFtdO1xuICAgIGlmIChkaXNwbGF5ID09PSAnbG9uZycpIHtcbiAgICAgICAgcGFydHMucHVzaCh3ZWVrVGV4dExvbmcpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwbGF5ID09PSAnc2hvcnQnIHx8IGRpc3BsYXkgPT09ICduYXJyb3cnKSB7XG4gICAgICAgIHBhcnRzLnB1c2god2Vla1RleHQpO1xuICAgIH1cbiAgICBpZiAoZGlzcGxheSA9PT0gJ2xvbmcnIHx8IGRpc3BsYXkgPT09ICdzaG9ydCcpIHtcbiAgICAgICAgcGFydHMucHVzaCgnICcpO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGxvY2FsZS5zaW1wbGVOdW1iZXJGb3JtYXQuZm9ybWF0KG51bSkpO1xuICAgIGlmIChsb2NhbGUub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdydGwnKSB7IC8vIFRPRE86IHVzZSBjb250cm9sIGNoYXJhY3RlcnMgaW5zdGVhZD9cbiAgICAgICAgcGFydHMucmV2ZXJzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignJyk7XG59XG4vLyBSYW5nZSBGb3JtYXR0aW5nIFV0aWxzXG4vLyAwID0gZXhhY3RseSB0aGUgc2FtZVxuLy8gMSA9IGRpZmZlcmVudCBieSB0aW1lXG4vLyBhbmQgYmlnZ2VyXG5mdW5jdGlvbiBjb21wdXRlTWFya2VyRGlmZlNldmVyaXR5KGQwLCBkMSwgY2EpIHtcbiAgICBpZiAoY2EuZ2V0TWFya2VyWWVhcihkMCkgIT09IGNhLmdldE1hcmtlclllYXIoZDEpKSB7XG4gICAgICAgIHJldHVybiA1O1xuICAgIH1cbiAgICBpZiAoY2EuZ2V0TWFya2VyTW9udGgoZDApICE9PSBjYS5nZXRNYXJrZXJNb250aChkMSkpIHtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICAgIGlmIChjYS5nZXRNYXJrZXJEYXkoZDApICE9PSBjYS5nZXRNYXJrZXJEYXkoZDEpKSB7XG4gICAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBpZiAodGltZUFzTXMoZDApICE9PSB0aW1lQXNNcyhkMSkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuZnVuY3Rpb24gY29tcHV0ZVBhcnRpYWxGb3JtYXR0aW5nT3B0aW9ucyhvcHRpb25zLCBiaWdnZXN0VW5pdCkge1xuICAgIGxldCBwYXJ0aWFsT3B0aW9ucyA9IHt9O1xuICAgIGZvciAobGV0IG5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgICBpZiAoIShuYW1lIGluIFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTKSB8fCAvLyBub3QgYSBkYXRlIHBhcnQgcHJvcCAobGlrZSB0aW1lWm9uZSlcbiAgICAgICAgICAgIFNUQU5EQVJEX0RBVEVfUFJPUF9TRVZFUklUSUVTW25hbWVdIDw9IGJpZ2dlc3RVbml0KSB7XG4gICAgICAgICAgICBwYXJ0aWFsT3B0aW9uc1tuYW1lXSA9IG9wdGlvbnNbbmFtZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcnRpYWxPcHRpb25zO1xufVxuZnVuY3Rpb24gZmluZENvbW1vbkluc2VydGlvbihmdWxsMCwgcGFydGlhbDAsIGZ1bGwxLCBwYXJ0aWFsMSkge1xuICAgIGxldCBpMCA9IDA7XG4gICAgd2hpbGUgKGkwIDwgZnVsbDAubGVuZ3RoKSB7XG4gICAgICAgIGxldCBmb3VuZDAgPSBmdWxsMC5pbmRleE9mKHBhcnRpYWwwLCBpMCk7XG4gICAgICAgIGlmIChmb3VuZDAgPT09IC0xKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmVmb3JlMCA9IGZ1bGwwLnN1YnN0cigwLCBmb3VuZDApO1xuICAgICAgICBpMCA9IGZvdW5kMCArIHBhcnRpYWwwLmxlbmd0aDtcbiAgICAgICAgbGV0IGFmdGVyMCA9IGZ1bGwwLnN1YnN0cihpMCk7XG4gICAgICAgIGxldCBpMSA9IDA7XG4gICAgICAgIHdoaWxlIChpMSA8IGZ1bGwxLmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IGZvdW5kMSA9IGZ1bGwxLmluZGV4T2YocGFydGlhbDEsIGkxKTtcbiAgICAgICAgICAgIGlmIChmb3VuZDEgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmVmb3JlMSA9IGZ1bGwxLnN1YnN0cigwLCBmb3VuZDEpO1xuICAgICAgICAgICAgaTEgPSBmb3VuZDEgKyBwYXJ0aWFsMS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgYWZ0ZXIxID0gZnVsbDEuc3Vic3RyKGkxKTtcbiAgICAgICAgICAgIGlmIChiZWZvcmUwID09PSBiZWZvcmUxICYmIGFmdGVyMCA9PT0gYWZ0ZXIxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBiZWZvcmUwLFxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogYWZ0ZXIwLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFpvbmVkTWFya2VyKGRhdGVJbmZvLCBjYWxlbmRhclN5c3RlbSkge1xuICAgIGxldCBhID0gY2FsZW5kYXJTeXN0ZW0ubWFya2VyVG9BcnJheShkYXRlSW5mby5tYXJrZXIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIG1hcmtlcjogZGF0ZUluZm8ubWFya2VyLFxuICAgICAgICB0aW1lWm9uZU9mZnNldDogZGF0ZUluZm8udGltZVpvbmVPZmZzZXQsXG4gICAgICAgIGFycmF5OiBhLFxuICAgICAgICB5ZWFyOiBhWzBdLFxuICAgICAgICBtb250aDogYVsxXSxcbiAgICAgICAgZGF5OiBhWzJdLFxuICAgICAgICBob3VyOiBhWzNdLFxuICAgICAgICBtaW51dGU6IGFbNF0sXG4gICAgICAgIHNlY29uZDogYVs1XSxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IGFbNl0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmcoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgIGxldCBzdGFydEluZm8gPSBleHBhbmRab25lZE1hcmtlcihzdGFydCwgY29udGV4dC5jYWxlbmRhclN5c3RlbSk7XG4gICAgbGV0IGVuZEluZm8gPSBlbmQgPyBleHBhbmRab25lZE1hcmtlcihlbmQsIGNvbnRleHQuY2FsZW5kYXJTeXN0ZW0pIDogbnVsbDtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRlOiBzdGFydEluZm8sXG4gICAgICAgIHN0YXJ0OiBzdGFydEluZm8sXG4gICAgICAgIGVuZDogZW5kSW5mbyxcbiAgICAgICAgdGltZVpvbmU6IGNvbnRleHQudGltZVpvbmUsXG4gICAgICAgIGxvY2FsZUNvZGVzOiBjb250ZXh0LmxvY2FsZS5jb2RlcyxcbiAgICAgICAgZGVmYXVsdFNlcGFyYXRvcjogYmV0dGVyRGVmYXVsdFNlcGFyYXRvciB8fCBjb250ZXh0LmRlZmF1bHRTZXBhcmF0b3IsXG4gICAgfTtcbn1cblxuLypcblRPRE86IGZpeCB0aGUgdGVybWlub2xvZ3kgb2YgXCJmb3JtYXR0ZXJcIiB2cyBcImZvcm1hdHRpbmcgZnVuY1wiXG4qL1xuLypcbkF0IHRoZSB0aW1lIG9mIGluc3RhbnRpYXRpb24sIHRoaXMgb2JqZWN0IGRvZXMgbm90IGtub3cgd2hpY2ggY21kLWZvcm1hdHRpbmcgc3lzdGVtIGl0IHdpbGwgdXNlLlxuSXQgcmVjZWl2ZXMgdGhpcyBhdCB0aGUgdGltZSBvZiBmb3JtYXR0aW5nLCBhcyBhIHNldHRpbmcuXG4qL1xuY2xhc3MgQ21kRm9ybWF0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcihjbWRTdHIpIHtcbiAgICAgICAgdGhpcy5jbWRTdHIgPSBjbWRTdHI7XG4gICAgfVxuICAgIGZvcm1hdChkYXRlLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNtZEZvcm1hdHRlcih0aGlzLmNtZFN0ciwgY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmcoZGF0ZSwgbnVsbCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikpO1xuICAgIH1cbiAgICBmb3JtYXRSYW5nZShzdGFydCwgZW5kLCBjb250ZXh0LCBiZXR0ZXJEZWZhdWx0U2VwYXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNtZEZvcm1hdHRlcih0aGlzLmNtZFN0ciwgY3JlYXRlVmVyYm9zZUZvcm1hdHRpbmdBcmcoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikpO1xuICAgIH1cbn1cblxuY2xhc3MgRnVuY0Zvcm1hdHRlciB7XG4gICAgY29uc3RydWN0b3IoZnVuYykge1xuICAgICAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIH1cbiAgICBmb3JtYXQoZGF0ZSwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jKGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKGRhdGUsIG51bGwsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9XG4gICAgZm9ybWF0UmFuZ2Uoc3RhcnQsIGVuZCwgY29udGV4dCwgYmV0dGVyRGVmYXVsdFNlcGFyYXRvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jKGNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnKHN0YXJ0LCBlbmQsIGNvbnRleHQsIGJldHRlckRlZmF1bHRTZXBhcmF0b3IpKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZvcm1hdHRlcihpbnB1dCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmIGlucHV0KSB7IC8vIG5vbi1udWxsIG9iamVjdFxuICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUZvcm1hdHRlcihpbnB1dCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ21kRm9ybWF0dGVyKGlucHV0KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmNGb3JtYXR0ZXIoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuLy8gYmFzZSBvcHRpb25zXG4vLyAtLS0tLS0tLS0tLS1cbmNvbnN0IEJBU0VfT1BUSU9OX1JFRklORVJTID0ge1xuICAgIG5hdkxpbmtEYXlDbGljazogaWRlbnRpdHksXG4gICAgbmF2TGlua1dlZWtDbGljazogaWRlbnRpdHksXG4gICAgZHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGJvb3RzdHJhcEZvbnRBd2Vzb21lOiBpZGVudGl0eSxcbiAgICBidXR0b25JY29uczogaWRlbnRpdHksXG4gICAgY3VzdG9tQnV0dG9uczogaWRlbnRpdHksXG4gICAgZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIG5leHREYXlUaHJlc2hvbGQ6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHNjcm9sbFRpbWU6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHNjcm9sbFRpbWVSZXNldDogQm9vbGVhbixcbiAgICBzbG90TWluVGltZTogY3JlYXRlRHVyYXRpb24sXG4gICAgc2xvdE1heFRpbWU6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGRheVBvcG92ZXJGb3JtYXQ6IGNyZWF0ZUZvcm1hdHRlcixcbiAgICBzbG90RHVyYXRpb246IGNyZWF0ZUR1cmF0aW9uLFxuICAgIHNuYXBEdXJhdGlvbjogY3JlYXRlRHVyYXRpb24sXG4gICAgaGVhZGVyVG9vbGJhcjogaWRlbnRpdHksXG4gICAgZm9vdGVyVG9vbGJhcjogaWRlbnRpdHksXG4gICAgZGVmYXVsdFJhbmdlU2VwYXJhdG9yOiBTdHJpbmcsXG4gICAgdGl0bGVSYW5nZVNlcGFyYXRvcjogU3RyaW5nLFxuICAgIGZvcmNlRXZlbnREdXJhdGlvbjogQm9vbGVhbixcbiAgICBkYXlIZWFkZXJzOiBCb29sZWFuLFxuICAgIGRheUhlYWRlckZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIGRheUhlYWRlckNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGRheUhlYWRlckNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIGRheUhlYWRlckRpZE1vdW50OiBpZGVudGl0eSxcbiAgICBkYXlIZWFkZXJXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgZGF5Q2VsbENsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGRheUNlbGxDb250ZW50OiBpZGVudGl0eSxcbiAgICBkYXlDZWxsRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIGRheUNlbGxXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgaW5pdGlhbFZpZXc6IFN0cmluZyxcbiAgICBhc3BlY3RSYXRpbzogTnVtYmVyLFxuICAgIHdlZWtlbmRzOiBCb29sZWFuLFxuICAgIHdlZWtOdW1iZXJDYWxjdWxhdGlvbjogaWRlbnRpdHksXG4gICAgd2Vla051bWJlcnM6IEJvb2xlYW4sXG4gICAgd2Vla051bWJlckNsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIHdlZWtOdW1iZXJDb250ZW50OiBpZGVudGl0eSxcbiAgICB3ZWVrTnVtYmVyRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHdlZWtOdW1iZXJXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgdmlld0NsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIHZpZXdEaWRNb3VudDogaWRlbnRpdHksXG4gICAgdmlld1dpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBub3dJbmRpY2F0b3I6IEJvb2xlYW4sXG4gICAgbm93SW5kaWNhdG9yQ2xhc3NOYW1lczogaWRlbnRpdHksXG4gICAgbm93SW5kaWNhdG9yQ29udGVudDogaWRlbnRpdHksXG4gICAgbm93SW5kaWNhdG9yRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIG5vd0luZGljYXRvcldpbGxVbm1vdW50OiBpZGVudGl0eSxcbiAgICBzaG93Tm9uQ3VycmVudERhdGVzOiBCb29sZWFuLFxuICAgIGxhenlGZXRjaGluZzogQm9vbGVhbixcbiAgICBzdGFydFBhcmFtOiBTdHJpbmcsXG4gICAgZW5kUGFyYW06IFN0cmluZyxcbiAgICB0aW1lWm9uZVBhcmFtOiBTdHJpbmcsXG4gICAgdGltZVpvbmU6IFN0cmluZyxcbiAgICBsb2NhbGVzOiBpZGVudGl0eSxcbiAgICBsb2NhbGU6IGlkZW50aXR5LFxuICAgIHRoZW1lU3lzdGVtOiBTdHJpbmcsXG4gICAgZHJhZ1JldmVydER1cmF0aW9uOiBOdW1iZXIsXG4gICAgZHJhZ1Njcm9sbDogQm9vbGVhbixcbiAgICBhbGxEYXlNYWludGFpbkR1cmF0aW9uOiBCb29sZWFuLFxuICAgIHVuc2VsZWN0QXV0bzogQm9vbGVhbixcbiAgICBkcm9wQWNjZXB0OiBpZGVudGl0eSxcbiAgICBldmVudE9yZGVyOiBwYXJzZUZpZWxkU3BlY3MsXG4gICAgZXZlbnRPcmRlclN0cmljdDogQm9vbGVhbixcbiAgICBoYW5kbGVXaW5kb3dSZXNpemU6IEJvb2xlYW4sXG4gICAgd2luZG93UmVzaXplRGVsYXk6IE51bWJlcixcbiAgICBsb25nUHJlc3NEZWxheTogTnVtYmVyLFxuICAgIGV2ZW50RHJhZ01pbkRpc3RhbmNlOiBOdW1iZXIsXG4gICAgZXhwYW5kUm93czogQm9vbGVhbixcbiAgICBoZWlnaHQ6IGlkZW50aXR5LFxuICAgIGNvbnRlbnRIZWlnaHQ6IGlkZW50aXR5LFxuICAgIGRpcmVjdGlvbjogU3RyaW5nLFxuICAgIHdlZWtOdW1iZXJGb3JtYXQ6IGNyZWF0ZUZvcm1hdHRlcixcbiAgICBldmVudFJlc2l6YWJsZUZyb21TdGFydDogQm9vbGVhbixcbiAgICBkaXNwbGF5RXZlbnRUaW1lOiBCb29sZWFuLFxuICAgIGRpc3BsYXlFdmVudEVuZDogQm9vbGVhbixcbiAgICB3ZWVrVGV4dDogU3RyaW5nLFxuICAgIHdlZWtUZXh0TG9uZzogU3RyaW5nLFxuICAgIHByb2dyZXNzaXZlRXZlbnRSZW5kZXJpbmc6IEJvb2xlYW4sXG4gICAgYnVzaW5lc3NIb3VyczogaWRlbnRpdHksXG4gICAgaW5pdGlhbERhdGU6IGlkZW50aXR5LFxuICAgIG5vdzogaWRlbnRpdHksXG4gICAgZXZlbnREYXRhVHJhbnNmb3JtOiBpZGVudGl0eSxcbiAgICBzdGlja3lIZWFkZXJEYXRlczogaWRlbnRpdHksXG4gICAgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyOiBpZGVudGl0eSxcbiAgICB2aWV3SGVpZ2h0OiBpZGVudGl0eSxcbiAgICBkZWZhdWx0QWxsRGF5OiBCb29sZWFuLFxuICAgIGV2ZW50U291cmNlRmFpbHVyZTogaWRlbnRpdHksXG4gICAgZXZlbnRTb3VyY2VTdWNjZXNzOiBpZGVudGl0eSxcbiAgICBldmVudERpc3BsYXk6IFN0cmluZyxcbiAgICBldmVudFN0YXJ0RWRpdGFibGU6IEJvb2xlYW4sXG4gICAgZXZlbnREdXJhdGlvbkVkaXRhYmxlOiBCb29sZWFuLFxuICAgIGV2ZW50T3ZlcmxhcDogaWRlbnRpdHksXG4gICAgZXZlbnRDb25zdHJhaW50OiBpZGVudGl0eSxcbiAgICBldmVudEFsbG93OiBpZGVudGl0eSxcbiAgICBldmVudEJhY2tncm91bmRDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50Qm9yZGVyQ29sb3I6IFN0cmluZyxcbiAgICBldmVudFRleHRDb2xvcjogU3RyaW5nLFxuICAgIGV2ZW50Q29sb3I6IFN0cmluZyxcbiAgICBldmVudENsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIGV2ZW50Q29udGVudDogaWRlbnRpdHksXG4gICAgZXZlbnREaWRNb3VudDogaWRlbnRpdHksXG4gICAgZXZlbnRXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgc2VsZWN0Q29uc3RyYWludDogaWRlbnRpdHksXG4gICAgc2VsZWN0T3ZlcmxhcDogaWRlbnRpdHksXG4gICAgc2VsZWN0QWxsb3c6IGlkZW50aXR5LFxuICAgIGRyb3BwYWJsZTogQm9vbGVhbixcbiAgICB1bnNlbGVjdENhbmNlbDogU3RyaW5nLFxuICAgIHNsb3RMYWJlbEZvcm1hdDogaWRlbnRpdHksXG4gICAgc2xvdExhbmVDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBzbG90TGFuZUNvbnRlbnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYW5lRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYW5lV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYWJlbENsYXNzTmFtZXM6IGlkZW50aXR5LFxuICAgIHNsb3RMYWJlbENvbnRlbnQ6IGlkZW50aXR5LFxuICAgIHNsb3RMYWJlbERpZE1vdW50OiBpZGVudGl0eSxcbiAgICBzbG90TGFiZWxXaWxsVW5tb3VudDogaWRlbnRpdHksXG4gICAgZGF5TWF4RXZlbnRzOiBpZGVudGl0eSxcbiAgICBkYXlNYXhFdmVudFJvd3M6IGlkZW50aXR5LFxuICAgIGRheU1pbldpZHRoOiBOdW1iZXIsXG4gICAgc2xvdExhYmVsSW50ZXJ2YWw6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGFsbERheVRleHQ6IFN0cmluZyxcbiAgICBhbGxEYXlDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBhbGxEYXlDb250ZW50OiBpZGVudGl0eSxcbiAgICBhbGxEYXlEaWRNb3VudDogaWRlbnRpdHksXG4gICAgYWxsRGF5V2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIHNsb3RNaW5XaWR0aDogTnVtYmVyLFxuICAgIG5hdkxpbmtzOiBCb29sZWFuLFxuICAgIGV2ZW50VGltZUZvcm1hdDogY3JlYXRlRm9ybWF0dGVyLFxuICAgIHJlcmVuZGVyRGVsYXk6IE51bWJlcixcbiAgICBtb3JlTGlua1RleHQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rSGludDogaWRlbnRpdHksXG4gICAgc2VsZWN0TWluRGlzdGFuY2U6IE51bWJlcixcbiAgICBzZWxlY3RhYmxlOiBCb29sZWFuLFxuICAgIHNlbGVjdExvbmdQcmVzc0RlbGF5OiBOdW1iZXIsXG4gICAgZXZlbnRMb25nUHJlc3NEZWxheTogTnVtYmVyLFxuICAgIHNlbGVjdE1pcnJvcjogQm9vbGVhbixcbiAgICBldmVudE1heFN0YWNrOiBOdW1iZXIsXG4gICAgZXZlbnRNaW5IZWlnaHQ6IE51bWJlcixcbiAgICBldmVudE1pbldpZHRoOiBOdW1iZXIsXG4gICAgZXZlbnRTaG9ydEhlaWdodDogTnVtYmVyLFxuICAgIHNsb3RFdmVudE92ZXJsYXA6IEJvb2xlYW4sXG4gICAgcGx1Z2luczogaWRlbnRpdHksXG4gICAgZmlyc3REYXk6IE51bWJlcixcbiAgICBkYXlDb3VudDogTnVtYmVyLFxuICAgIGRhdGVBbGlnbm1lbnQ6IFN0cmluZyxcbiAgICBkYXRlSW5jcmVtZW50OiBjcmVhdGVEdXJhdGlvbixcbiAgICBoaWRkZW5EYXlzOiBpZGVudGl0eSxcbiAgICBmaXhlZFdlZWtDb3VudDogQm9vbGVhbixcbiAgICB2YWxpZFJhbmdlOiBpZGVudGl0eSxcbiAgICB2aXNpYmxlUmFuZ2U6IGlkZW50aXR5LFxuICAgIHRpdGxlRm9ybWF0OiBpZGVudGl0eSxcbiAgICBldmVudEludGVyYWN0aXZlOiBCb29sZWFuLFxuICAgIC8vIG9ubHkgdXNlZCBieSBsaXN0LXZpZXcsIGJ1dCBsYW5ndWFnZXMgZGVmaW5lIHRoZSB2YWx1ZSwgc28gd2UgbmVlZCBpdCBpbiBiYXNlIG9wdGlvbnNcbiAgICBub0V2ZW50c1RleHQ6IFN0cmluZyxcbiAgICB2aWV3SGludDogaWRlbnRpdHksXG4gICAgbmF2TGlua0hpbnQ6IGlkZW50aXR5LFxuICAgIGNsb3NlSGludDogU3RyaW5nLFxuICAgIHRpbWVIaW50OiBTdHJpbmcsXG4gICAgZXZlbnRIaW50OiBTdHJpbmcsXG4gICAgbW9yZUxpbmtDbGljazogaWRlbnRpdHksXG4gICAgbW9yZUxpbmtDbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBtb3JlTGlua0NvbnRlbnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rRGlkTW91bnQ6IGlkZW50aXR5LFxuICAgIG1vcmVMaW5rV2lsbFVubW91bnQ6IGlkZW50aXR5LFxuICAgIG1vbnRoU3RhcnRGb3JtYXQ6IGNyZWF0ZUZvcm1hdHRlcixcbiAgICAvLyBmb3IgY29ubmVjdG9yc1xuICAgIC8vIChjYW4ndCBiZSBwYXJ0IG9mIHBsdWdpbiBzeXN0ZW0gYi9jIG11c3QgYmUgcHJvdmlkZWQgYXQgcnVudGltZSlcbiAgICBoYW5kbGVDdXN0b21SZW5kZXJpbmc6IGlkZW50aXR5LFxuICAgIGN1c3RvbVJlbmRlcmluZ01ldGFNYXA6IGlkZW50aXR5LFxuICAgIGN1c3RvbVJlbmRlcmluZ1JlcGxhY2VzRWw6IEJvb2xlYW4sXG59O1xuLy8gZG8gTk9UIGdpdmUgYSB0eXBlIGhlcmUuIG5lZWQgYHR5cGVvZiBCQVNFX09QVElPTl9ERUZBVUxUU2AgdG8gZ2l2ZSByZWFsIHJlc3VsdHMuXG4vLyByYXcgdmFsdWVzLlxuY29uc3QgQkFTRV9PUFRJT05fREVGQVVMVFMgPSB7XG4gICAgZXZlbnREaXNwbGF5OiAnYXV0bycsXG4gICAgZGVmYXVsdFJhbmdlU2VwYXJhdG9yOiAnIC0gJyxcbiAgICB0aXRsZVJhbmdlU2VwYXJhdG9yOiAnIFxcdTIwMTMgJyxcbiAgICBkZWZhdWx0VGltZWRFdmVudER1cmF0aW9uOiAnMDE6MDA6MDAnLFxuICAgIGRlZmF1bHRBbGxEYXlFdmVudER1cmF0aW9uOiB7IGRheTogMSB9LFxuICAgIGZvcmNlRXZlbnREdXJhdGlvbjogZmFsc2UsXG4gICAgbmV4dERheVRocmVzaG9sZDogJzAwOjAwOjAwJyxcbiAgICBkYXlIZWFkZXJzOiB0cnVlLFxuICAgIGluaXRpYWxWaWV3OiAnJyxcbiAgICBhc3BlY3RSYXRpbzogMS4zNSxcbiAgICBoZWFkZXJUb29sYmFyOiB7XG4gICAgICAgIHN0YXJ0OiAndGl0bGUnLFxuICAgICAgICBjZW50ZXI6ICcnLFxuICAgICAgICBlbmQ6ICd0b2RheSBwcmV2LG5leHQnLFxuICAgIH0sXG4gICAgd2Vla2VuZHM6IHRydWUsXG4gICAgd2Vla051bWJlcnM6IGZhbHNlLFxuICAgIHdlZWtOdW1iZXJDYWxjdWxhdGlvbjogJ2xvY2FsJyxcbiAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgbm93SW5kaWNhdG9yOiBmYWxzZSxcbiAgICBzY3JvbGxUaW1lOiAnMDY6MDA6MDAnLFxuICAgIHNjcm9sbFRpbWVSZXNldDogdHJ1ZSxcbiAgICBzbG90TWluVGltZTogJzAwOjAwOjAwJyxcbiAgICBzbG90TWF4VGltZTogJzI0OjAwOjAwJyxcbiAgICBzaG93Tm9uQ3VycmVudERhdGVzOiB0cnVlLFxuICAgIGxhenlGZXRjaGluZzogdHJ1ZSxcbiAgICBzdGFydFBhcmFtOiAnc3RhcnQnLFxuICAgIGVuZFBhcmFtOiAnZW5kJyxcbiAgICB0aW1lWm9uZVBhcmFtOiAndGltZVpvbmUnLFxuICAgIHRpbWVab25lOiAnbG9jYWwnLFxuICAgIGxvY2FsZXM6IFtdLFxuICAgIGxvY2FsZTogJycsXG4gICAgdGhlbWVTeXN0ZW06ICdzdGFuZGFyZCcsXG4gICAgZHJhZ1JldmVydER1cmF0aW9uOiA1MDAsXG4gICAgZHJhZ1Njcm9sbDogdHJ1ZSxcbiAgICBhbGxEYXlNYWludGFpbkR1cmF0aW9uOiBmYWxzZSxcbiAgICB1bnNlbGVjdEF1dG86IHRydWUsXG4gICAgZHJvcEFjY2VwdDogJyonLFxuICAgIGV2ZW50T3JkZXI6ICdzdGFydCwtZHVyYXRpb24sYWxsRGF5LHRpdGxlJyxcbiAgICBkYXlQb3BvdmVyRm9ybWF0OiB7IG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnLCB5ZWFyOiAnbnVtZXJpYycgfSxcbiAgICBoYW5kbGVXaW5kb3dSZXNpemU6IHRydWUsXG4gICAgd2luZG93UmVzaXplRGVsYXk6IDEwMCxcbiAgICBsb25nUHJlc3NEZWxheTogMTAwMCxcbiAgICBldmVudERyYWdNaW5EaXN0YW5jZTogNSxcbiAgICBleHBhbmRSb3dzOiBmYWxzZSxcbiAgICBuYXZMaW5rczogZmFsc2UsXG4gICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgZXZlbnRNaW5IZWlnaHQ6IDE1LFxuICAgIGV2ZW50TWluV2lkdGg6IDMwLFxuICAgIGV2ZW50U2hvcnRIZWlnaHQ6IDMwLFxuICAgIG1vbnRoU3RhcnRGb3JtYXQ6IHsgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSxcbn07XG4vLyBjYWxlbmRhciBsaXN0ZW5lcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMgPSB7XG4gICAgZGF0ZXNTZXQ6IGlkZW50aXR5LFxuICAgIGV2ZW50c1NldDogaWRlbnRpdHksXG4gICAgZXZlbnRBZGQ6IGlkZW50aXR5LFxuICAgIGV2ZW50Q2hhbmdlOiBpZGVudGl0eSxcbiAgICBldmVudFJlbW92ZTogaWRlbnRpdHksXG4gICAgd2luZG93UmVzaXplOiBpZGVudGl0eSxcbiAgICBldmVudENsaWNrOiBpZGVudGl0eSxcbiAgICBldmVudE1vdXNlRW50ZXI6IGlkZW50aXR5LFxuICAgIGV2ZW50TW91c2VMZWF2ZTogaWRlbnRpdHksXG4gICAgc2VsZWN0OiBpZGVudGl0eSxcbiAgICB1bnNlbGVjdDogaWRlbnRpdHksXG4gICAgbG9hZGluZzogaWRlbnRpdHksXG4gICAgLy8gaW50ZXJuYWxcbiAgICBfdW5tb3VudDogaWRlbnRpdHksXG4gICAgX2JlZm9yZXByaW50OiBpZGVudGl0eSxcbiAgICBfYWZ0ZXJwcmludDogaWRlbnRpdHksXG4gICAgX25vRXZlbnREcm9wOiBpZGVudGl0eSxcbiAgICBfbm9FdmVudFJlc2l6ZTogaWRlbnRpdHksXG4gICAgX3Jlc2l6ZTogaWRlbnRpdHksXG4gICAgX3Njcm9sbFJlcXVlc3Q6IGlkZW50aXR5LFxufTtcbi8vIGNhbGVuZGFyLXNwZWNpZmljIG9wdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IENBTEVOREFSX09QVElPTl9SRUZJTkVSUyA9IHtcbiAgICBidXR0b25UZXh0OiBpZGVudGl0eSxcbiAgICBidXR0b25IaW50czogaWRlbnRpdHksXG4gICAgdmlld3M6IGlkZW50aXR5LFxuICAgIHBsdWdpbnM6IGlkZW50aXR5LFxuICAgIGluaXRpYWxFdmVudHM6IGlkZW50aXR5LFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnRTb3VyY2VzOiBpZGVudGl0eSxcbn07XG5jb25zdCBDT01QTEVYX09QVElPTl9DT01QQVJBVE9SUyA9IHtcbiAgICBoZWFkZXJUb29sYmFyOiBpc01heWJlT2JqZWN0c0VxdWFsLFxuICAgIGZvb3RlclRvb2xiYXI6IGlzTWF5YmVPYmplY3RzRXF1YWwsXG4gICAgYnV0dG9uVGV4dDogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBidXR0b25IaW50czogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBidXR0b25JY29uczogaXNNYXliZU9iamVjdHNFcXVhbCxcbiAgICBkYXRlSW5jcmVtZW50OiBpc01heWJlT2JqZWN0c0VxdWFsLFxuICAgIHBsdWdpbnM6IGlzTWF5YmVBcnJheXNFcXVhbCxcbiAgICBldmVudHM6IGlzTWF5YmVBcnJheXNFcXVhbCxcbiAgICBldmVudFNvdXJjZXM6IGlzTWF5YmVBcnJheXNFcXVhbCxcbiAgICBbJ3Jlc291cmNlcyddOiBpc01heWJlQXJyYXlzRXF1YWwsXG59O1xuZnVuY3Rpb24gaXNNYXliZU9iamVjdHNFcXVhbChhLCBiKSB7XG4gICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiA9PT0gJ29iamVjdCcgJiYgYSAmJiBiKSB7IC8vIGJvdGggbm9uLW51bGwgb2JqZWN0c1xuICAgICAgICByZXR1cm4gaXNQcm9wc0VxdWFsKGEsIGIpO1xuICAgIH1cbiAgICByZXR1cm4gYSA9PT0gYjtcbn1cbmZ1bmN0aW9uIGlzTWF5YmVBcnJheXNFcXVhbChhLCBiKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgICAgICByZXR1cm4gaXNBcnJheXNFcXVhbChhLCBiKTtcbiAgICB9XG4gICAgcmV0dXJuIGEgPT09IGI7XG59XG4vLyB2aWV3LXNwZWNpZmljIG9wdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgVklFV19PUFRJT05fUkVGSU5FUlMgPSB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIGNvbXBvbmVudDogaWRlbnRpdHksXG4gICAgYnV0dG9uVGV4dDogU3RyaW5nLFxuICAgIGJ1dHRvblRleHRLZXk6IFN0cmluZyxcbiAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiBpZGVudGl0eSxcbiAgICB1c2VzTWluTWF4VGltZTogQm9vbGVhbixcbiAgICBjbGFzc05hbWVzOiBpZGVudGl0eSxcbiAgICBjb250ZW50OiBpZGVudGl0eSxcbiAgICBkaWRNb3VudDogaWRlbnRpdHksXG4gICAgd2lsbFVubW91bnQ6IGlkZW50aXR5LFxufTtcbi8vIHV0aWwgZnVuY3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIG1lcmdlUmF3T3B0aW9ucyhvcHRpb25TZXRzKSB7XG4gICAgcmV0dXJuIG1lcmdlUHJvcHMob3B0aW9uU2V0cywgQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMpO1xufVxuZnVuY3Rpb24gcmVmaW5lUHJvcHMoaW5wdXQsIHJlZmluZXJzKSB7XG4gICAgbGV0IHJlZmluZWQgPSB7fTtcbiAgICBsZXQgZXh0cmEgPSB7fTtcbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiByZWZpbmVycykge1xuICAgICAgICBpZiAocHJvcE5hbWUgaW4gaW5wdXQpIHtcbiAgICAgICAgICAgIHJlZmluZWRbcHJvcE5hbWVdID0gcmVmaW5lcnNbcHJvcE5hbWVdKGlucHV0W3Byb3BOYW1lXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgcHJvcE5hbWUgaW4gaW5wdXQpIHtcbiAgICAgICAgaWYgKCEocHJvcE5hbWUgaW4gcmVmaW5lcnMpKSB7XG4gICAgICAgICAgICBleHRyYVtwcm9wTmFtZV0gPSBpbnB1dFtwcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcmVmaW5lZCwgZXh0cmEgfTtcbn1cbmZ1bmN0aW9uIGlkZW50aXR5KHJhdykge1xuICAgIHJldHVybiByYXc7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmSWQsIHJhbmdlLCBmb3JjZWRTdGFydFR6bywgZm9yY2VkRW5kVHpvKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2VJZDogZ3VpZCgpLFxuICAgICAgICBkZWZJZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBmb3JjZWRTdGFydFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICBmb3JjZWRFbmRUem86IGZvcmNlZEVuZFR6byA9PSBudWxsID8gbnVsbCA6IGZvcmNlZEVuZFR6byxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVJlY3VycmluZyhyZWZpbmVkLCBkZWZhdWx0QWxsRGF5LCBkYXRlRW52LCByZWN1cnJpbmdUeXBlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdXJyaW5nVHlwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IHBhcnNlZCA9IHJlY3VycmluZ1R5cGVzW2ldLnBhcnNlKHJlZmluZWQsIGRhdGVFbnYpO1xuICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICBsZXQgeyBhbGxEYXkgfSA9IHJlZmluZWQ7XG4gICAgICAgICAgICBpZiAoYWxsRGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhbGxEYXkgPSBkZWZhdWx0QWxsRGF5O1xuICAgICAgICAgICAgICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBhbGxEYXkgPSBwYXJzZWQuYWxsRGF5R3Vlc3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsRGF5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFsbERheSxcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogcGFyc2VkLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgIHR5cGVEYXRhOiBwYXJzZWQudHlwZURhdGEsXG4gICAgICAgICAgICAgICAgdHlwZUlkOiBpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGV4cGFuZFJlY3VycmluZyhldmVudFN0b3JlLCBmcmFtaW5nUmFuZ2UsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBkYXRlRW52LCBwbHVnaW5Ib29rcywgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICBsZXQgeyBkZWZzLCBpbnN0YW5jZXMgfSA9IGV2ZW50U3RvcmU7XG4gICAgLy8gcmVtb3ZlIGV4aXN0aW5nIHJlY3VycmluZyBpbnN0YW5jZXNcbiAgICAvLyBUT0RPOiBiYWQuIGFsd2F5cyBleHBhbmQgZXZlbnRzIGFzIGEgc2Vjb25kIHN0ZXBcbiAgICBpbnN0YW5jZXMgPSBmaWx0ZXJIYXNoKGluc3RhbmNlcywgKGluc3RhbmNlKSA9PiAhZGVmc1tpbnN0YW5jZS5kZWZJZF0ucmVjdXJyaW5nRGVmKTtcbiAgICBmb3IgKGxldCBkZWZJZCBpbiBkZWZzKSB7XG4gICAgICAgIGxldCBkZWYgPSBkZWZzW2RlZklkXTtcbiAgICAgICAgaWYgKGRlZi5yZWN1cnJpbmdEZWYpIHtcbiAgICAgICAgICAgIGxldCB7IGR1cmF0aW9uIH0gPSBkZWYucmVjdXJyaW5nRGVmO1xuICAgICAgICAgICAgaWYgKCFkdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZGVmLmFsbERheSA/XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdEFsbERheUV2ZW50RHVyYXRpb24gOlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhcnRzID0gZXhwYW5kUmVjdXJyaW5nUmFuZ2VzKGRlZiwgZHVyYXRpb24sIGZyYW1pbmdSYW5nZSwgZGF0ZUVudiwgcGx1Z2luSG9va3MucmVjdXJyaW5nVHlwZXMpO1xuICAgICAgICAgICAgZm9yIChsZXQgc3RhcnQgb2Ygc3RhcnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gY3JlYXRlRXZlbnRJbnN0YW5jZShkZWZJZCwge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBkYXRlRW52LmFkZChzdGFydCwgZHVyYXRpb24pLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluc3RhbmNlc1tpbnN0YW5jZS5pbnN0YW5jZUlkXSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGRlZnMsIGluc3RhbmNlcyB9O1xufVxuLypcbkV2ZW50IE1VU1QgaGF2ZSBhIHJlY3VycmluZ0RlZlxuKi9cbmZ1bmN0aW9uIGV4cGFuZFJlY3VycmluZ1JhbmdlcyhldmVudERlZiwgZHVyYXRpb24sIGZyYW1pbmdSYW5nZSwgZGF0ZUVudiwgcmVjdXJyaW5nVHlwZXMpIHtcbiAgICBsZXQgdHlwZURlZiA9IHJlY3VycmluZ1R5cGVzW2V2ZW50RGVmLnJlY3VycmluZ0RlZi50eXBlSWRdO1xuICAgIGxldCBtYXJrZXJzID0gdHlwZURlZi5leHBhbmQoZXZlbnREZWYucmVjdXJyaW5nRGVmLnR5cGVEYXRhLCB7XG4gICAgICAgIHN0YXJ0OiBkYXRlRW52LnN1YnRyYWN0KGZyYW1pbmdSYW5nZS5zdGFydCwgZHVyYXRpb24pLFxuICAgICAgICBlbmQ6IGZyYW1pbmdSYW5nZS5lbmQsXG4gICAgfSwgZGF0ZUVudik7XG4gICAgLy8gdGhlIHJlY3VycmVuY2UgcGx1Z2lucyBkb24ndCBndWFyYW50ZWUgdGhhdCBhbGwtZGF5IGV2ZW50cyBhcmUgc3RhcnQtb2YtZGF5LCBzbyB3ZSBoYXZlIHRvXG4gICAgaWYgKGV2ZW50RGVmLmFsbERheSkge1xuICAgICAgICBtYXJrZXJzID0gbWFya2Vycy5tYXAoc3RhcnRPZkRheSk7XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXJzO1xufVxuXG5mdW5jdGlvbiBwYXJzZUV2ZW50cyhyYXdFdmVudHMsIGV2ZW50U291cmNlLCBjb250ZXh0LCBhbGxvd09wZW5SYW5nZSwgZGVmSWRNYXAsIGluc3RhbmNlSWRNYXApIHtcbiAgICBsZXQgZXZlbnRTdG9yZSA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xuICAgIGxldCBldmVudFJlZmluZXJzID0gYnVpbGRFdmVudFJlZmluZXJzKGNvbnRleHQpO1xuICAgIGZvciAobGV0IHJhd0V2ZW50IG9mIHJhd0V2ZW50cykge1xuICAgICAgICBsZXQgdHVwbGUgPSBwYXJzZUV2ZW50KHJhd0V2ZW50LCBldmVudFNvdXJjZSwgY29udGV4dCwgYWxsb3dPcGVuUmFuZ2UsIGV2ZW50UmVmaW5lcnMsIGRlZklkTWFwLCBpbnN0YW5jZUlkTWFwKTtcbiAgICAgICAgaWYgKHR1cGxlKSB7XG4gICAgICAgICAgICBldmVudFR1cGxlVG9TdG9yZSh0dXBsZSwgZXZlbnRTdG9yZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV2ZW50U3RvcmU7XG59XG5mdW5jdGlvbiBldmVudFR1cGxlVG9TdG9yZSh0dXBsZSwgZXZlbnRTdG9yZSA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpKSB7XG4gICAgZXZlbnRTdG9yZS5kZWZzW3R1cGxlLmRlZi5kZWZJZF0gPSB0dXBsZS5kZWY7XG4gICAgaWYgKHR1cGxlLmluc3RhbmNlKSB7XG4gICAgICAgIGV2ZW50U3RvcmUuaW5zdGFuY2VzW3R1cGxlLmluc3RhbmNlLmluc3RhbmNlSWRdID0gdHVwbGUuaW5zdGFuY2U7XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuLy8gcmV0cmlldmVzIGV2ZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUgZ3JvdXBJZCBhcyB0aGUgaW5zdGFuY2Ugc3BlY2lmaWVkIGJ5IGBpbnN0YW5jZUlkYFxuLy8gb3IgdGhleSBhcmUgdGhlIHNhbWUgYXMgdGhlIGluc3RhbmNlLlxuLy8gd2h5IG1pZ2h0IGluc3RhbmNlSWQgbm90IGJlIGluIHRoZSBzdG9yZT8gYW4gZXZlbnQgZnJvbSBhbm90aGVyIGNhbGVuZGFyP1xuZnVuY3Rpb24gZ2V0UmVsZXZhbnRFdmVudHMoZXZlbnRTdG9yZSwgaW5zdGFuY2VJZCkge1xuICAgIGxldCBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICBsZXQgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2luc3RhbmNlLmRlZklkXTtcbiAgICAgICAgLy8gZ2V0IGV2ZW50cy9pbnN0YW5jZXMgd2l0aCBzYW1lIGdyb3VwXG4gICAgICAgIGxldCBuZXdTdG9yZSA9IGZpbHRlckV2ZW50U3RvcmVEZWZzKGV2ZW50U3RvcmUsIChsb29rRGVmKSA9PiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmLCBsb29rRGVmKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gVE9ETzogd2lzaCB3ZSBjb3VsZCB1c2UgZXZlbnRUdXBsZVRvU3RvcmUgb3Igc29tZXRoaW5nIGxpa2UgaXRcbiAgICAgICAgbmV3U3RvcmUuZGVmc1tkZWYuZGVmSWRdID0gZGVmO1xuICAgICAgICBuZXdTdG9yZS5pbnN0YW5jZXNbaW5zdGFuY2UuaW5zdGFuY2VJZF0gPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIG5ld1N0b3JlO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG59XG5mdW5jdGlvbiBpc0V2ZW50RGVmc0dyb3VwZWQoZGVmMCwgZGVmMSkge1xuICAgIHJldHVybiBCb29sZWFuKGRlZjAuZ3JvdXBJZCAmJiBkZWYwLmdyb3VwSWQgPT09IGRlZjEuZ3JvdXBJZCk7XG59XG5mdW5jdGlvbiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSB7XG4gICAgcmV0dXJuIHsgZGVmczoge30sIGluc3RhbmNlczoge30gfTtcbn1cbmZ1bmN0aW9uIG1lcmdlRXZlbnRTdG9yZXMoc3RvcmUwLCBzdG9yZTEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkZWZzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0b3JlMC5kZWZzKSwgc3RvcmUxLmRlZnMpLFxuICAgICAgICBpbnN0YW5jZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RvcmUwLmluc3RhbmNlcyksIHN0b3JlMS5pbnN0YW5jZXMpLFxuICAgIH07XG59XG5mdW5jdGlvbiBmaWx0ZXJFdmVudFN0b3JlRGVmcyhldmVudFN0b3JlLCBmaWx0ZXJGdW5jKSB7XG4gICAgbGV0IGRlZnMgPSBmaWx0ZXJIYXNoKGV2ZW50U3RvcmUuZGVmcywgZmlsdGVyRnVuYyk7XG4gICAgbGV0IGluc3RhbmNlcyA9IGZpbHRlckhhc2goZXZlbnRTdG9yZS5pbnN0YW5jZXMsIChpbnN0YW5jZSkgPT4gKGRlZnNbaW5zdGFuY2UuZGVmSWRdIC8vIHN0aWxsIGV4aXN0cz9cbiAgICApKTtcbiAgICByZXR1cm4geyBkZWZzLCBpbnN0YW5jZXMgfTtcbn1cbmZ1bmN0aW9uIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKG1hc3Rlciwgc3ViKSB7XG4gICAgbGV0IHsgZGVmcywgaW5zdGFuY2VzIH0gPSBtYXN0ZXI7XG4gICAgbGV0IGZpbHRlcmVkRGVmcyA9IHt9O1xuICAgIGxldCBmaWx0ZXJlZEluc3RhbmNlcyA9IHt9O1xuICAgIGZvciAobGV0IGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgaWYgKCFzdWIuZGVmc1tkZWZJZF0pIHsgLy8gbm90IGV4cGxpY2l0bHkgZXhjbHVkZWRcbiAgICAgICAgICAgIGZpbHRlcmVkRGVmc1tkZWZJZF0gPSBkZWZzW2RlZklkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICBpZiAoIXN1Yi5pbnN0YW5jZXNbaW5zdGFuY2VJZF0gJiYgLy8gbm90IGV4cGxpY2l0bHkgZXhjbHVkZWRcbiAgICAgICAgICAgIGZpbHRlcmVkRGVmc1tpbnN0YW5jZXNbaW5zdGFuY2VJZF0uZGVmSWRdIC8vIGRlZiB3YXNuJ3QgZmlsdGVyZWQgYXdheVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGZpbHRlcmVkSW5zdGFuY2VzW2luc3RhbmNlSWRdID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRlZnM6IGZpbHRlcmVkRGVmcyxcbiAgICAgICAgaW5zdGFuY2VzOiBmaWx0ZXJlZEluc3RhbmNlcyxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb25zdHJhaW50KGlucHV0LCBjb250ZXh0KSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV2ZW50cyhpbnB1dCwgbnVsbCwgY29udGV4dCwgdHJ1ZSk7IC8vIGFsbG93T3BlblJhbmdlPXRydWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgIHJldHVybiBwYXJzZUV2ZW50cyhbaW5wdXRdLCBudWxsLCBjb250ZXh0LCB0cnVlKTsgLy8gYWxsb3dPcGVuUmFuZ2U9dHJ1ZVxuICAgIH1cbiAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2xhc3NOYW1lcyhyYXcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gcmF3LnNwbGl0KC9cXHMrLyk7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cblxuLy8gVE9ETzogYmV0dGVyIGNhbGxlZCBcIkV2ZW50U2V0dGluZ3NcIiBvciBcIkV2ZW50Q29uZmlnXCJcbi8vIFRPRE86IG1vdmUgdGhpcyBmaWxlIGludG8gc3RydWN0c1xuLy8gVE9ETzogc2VwYXJhdGUgY29uc3RyYWludC9vdmVybGFwL2FsbG93LCBiZWNhdXNlIHNlbGVjdGlvbiB1c2VzIG9ubHkgdGhhdCwgbm90IG90aGVyIHByb3BzXG5jb25zdCBFVkVOVF9VSV9SRUZJTkVSUyA9IHtcbiAgICBkaXNwbGF5OiBTdHJpbmcsXG4gICAgZWRpdGFibGU6IEJvb2xlYW4sXG4gICAgc3RhcnRFZGl0YWJsZTogQm9vbGVhbixcbiAgICBkdXJhdGlvbkVkaXRhYmxlOiBCb29sZWFuLFxuICAgIGNvbnN0cmFpbnQ6IGlkZW50aXR5LFxuICAgIG92ZXJsYXA6IGlkZW50aXR5LFxuICAgIGFsbG93OiBpZGVudGl0eSxcbiAgICBjbGFzc05hbWU6IHBhcnNlQ2xhc3NOYW1lcyxcbiAgICBjbGFzc05hbWVzOiBwYXJzZUNsYXNzTmFtZXMsXG4gICAgY29sb3I6IFN0cmluZyxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IFN0cmluZyxcbiAgICBib3JkZXJDb2xvcjogU3RyaW5nLFxuICAgIHRleHRDb2xvcjogU3RyaW5nLFxufTtcbmNvbnN0IEVNUFRZX0VWRU5UX1VJID0ge1xuICAgIGRpc3BsYXk6IG51bGwsXG4gICAgc3RhcnRFZGl0YWJsZTogbnVsbCxcbiAgICBkdXJhdGlvbkVkaXRhYmxlOiBudWxsLFxuICAgIGNvbnN0cmFpbnRzOiBbXSxcbiAgICBvdmVybGFwOiBudWxsLFxuICAgIGFsbG93czogW10sXG4gICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICBib3JkZXJDb2xvcjogJycsXG4gICAgdGV4dENvbG9yOiAnJyxcbiAgICBjbGFzc05hbWVzOiBbXSxcbn07XG5mdW5jdGlvbiBjcmVhdGVFdmVudFVpKHJlZmluZWQsIGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludCA9IG5vcm1hbGl6ZUNvbnN0cmFpbnQocmVmaW5lZC5jb25zdHJhaW50LCBjb250ZXh0KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5OiByZWZpbmVkLmRpc3BsYXkgfHwgbnVsbCxcbiAgICAgICAgc3RhcnRFZGl0YWJsZTogcmVmaW5lZC5zdGFydEVkaXRhYmxlICE9IG51bGwgPyByZWZpbmVkLnN0YXJ0RWRpdGFibGUgOiByZWZpbmVkLmVkaXRhYmxlLFxuICAgICAgICBkdXJhdGlvbkVkaXRhYmxlOiByZWZpbmVkLmR1cmF0aW9uRWRpdGFibGUgIT0gbnVsbCA/IHJlZmluZWQuZHVyYXRpb25FZGl0YWJsZSA6IHJlZmluZWQuZWRpdGFibGUsXG4gICAgICAgIGNvbnN0cmFpbnRzOiBjb25zdHJhaW50ICE9IG51bGwgPyBbY29uc3RyYWludF0gOiBbXSxcbiAgICAgICAgb3ZlcmxhcDogcmVmaW5lZC5vdmVybGFwICE9IG51bGwgPyByZWZpbmVkLm92ZXJsYXAgOiBudWxsLFxuICAgICAgICBhbGxvd3M6IHJlZmluZWQuYWxsb3cgIT0gbnVsbCA/IFtyZWZpbmVkLmFsbG93XSA6IFtdLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHJlZmluZWQuYmFja2dyb3VuZENvbG9yIHx8IHJlZmluZWQuY29sb3IgfHwgJycsXG4gICAgICAgIGJvcmRlckNvbG9yOiByZWZpbmVkLmJvcmRlckNvbG9yIHx8IHJlZmluZWQuY29sb3IgfHwgJycsXG4gICAgICAgIHRleHRDb2xvcjogcmVmaW5lZC50ZXh0Q29sb3IgfHwgJycsXG4gICAgICAgIGNsYXNzTmFtZXM6IChyZWZpbmVkLmNsYXNzTmFtZSB8fCBbXSkuY29uY2F0KHJlZmluZWQuY2xhc3NOYW1lcyB8fCBbXSksIC8vIGpvaW4gc2luZ3VsYXIgYW5kIHBsdXJhbFxuICAgIH07XG59XG4vLyBUT0RPOiBwcmV2ZW50IGFnYWluc3QgcHJvYmxlbXMgd2l0aCA8MiBhcmdzIVxuZnVuY3Rpb24gY29tYmluZUV2ZW50VWlzKHVpcykge1xuICAgIHJldHVybiB1aXMucmVkdWNlKGNvbWJpbmVUd29FdmVudFVpcywgRU1QVFlfRVZFTlRfVUkpO1xufVxuZnVuY3Rpb24gY29tYmluZVR3b0V2ZW50VWlzKGl0ZW0wLCBpdGVtMSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRpc3BsYXk6IGl0ZW0xLmRpc3BsYXkgIT0gbnVsbCA/IGl0ZW0xLmRpc3BsYXkgOiBpdGVtMC5kaXNwbGF5LFxuICAgICAgICBzdGFydEVkaXRhYmxlOiBpdGVtMS5zdGFydEVkaXRhYmxlICE9IG51bGwgPyBpdGVtMS5zdGFydEVkaXRhYmxlIDogaXRlbTAuc3RhcnRFZGl0YWJsZSxcbiAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogaXRlbTEuZHVyYXRpb25FZGl0YWJsZSAhPSBudWxsID8gaXRlbTEuZHVyYXRpb25FZGl0YWJsZSA6IGl0ZW0wLmR1cmF0aW9uRWRpdGFibGUsXG4gICAgICAgIGNvbnN0cmFpbnRzOiBpdGVtMC5jb25zdHJhaW50cy5jb25jYXQoaXRlbTEuY29uc3RyYWludHMpLFxuICAgICAgICBvdmVybGFwOiB0eXBlb2YgaXRlbTEub3ZlcmxhcCA9PT0gJ2Jvb2xlYW4nID8gaXRlbTEub3ZlcmxhcCA6IGl0ZW0wLm92ZXJsYXAsXG4gICAgICAgIGFsbG93czogaXRlbTAuYWxsb3dzLmNvbmNhdChpdGVtMS5hbGxvd3MpLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGl0ZW0xLmJhY2tncm91bmRDb2xvciB8fCBpdGVtMC5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgICAgIGJvcmRlckNvbG9yOiBpdGVtMS5ib3JkZXJDb2xvciB8fCBpdGVtMC5ib3JkZXJDb2xvcixcbiAgICAgICAgdGV4dENvbG9yOiBpdGVtMS50ZXh0Q29sb3IgfHwgaXRlbTAudGV4dENvbG9yLFxuICAgICAgICBjbGFzc05hbWVzOiBpdGVtMC5jbGFzc05hbWVzLmNvbmNhdChpdGVtMS5jbGFzc05hbWVzKSxcbiAgICB9O1xufVxuXG5jb25zdCBFVkVOVF9OT05fREFURV9SRUZJTkVSUyA9IHtcbiAgICBpZDogU3RyaW5nLFxuICAgIGdyb3VwSWQ6IFN0cmluZyxcbiAgICB0aXRsZTogU3RyaW5nLFxuICAgIHVybDogU3RyaW5nLFxuICAgIGludGVyYWN0aXZlOiBCb29sZWFuLFxufTtcbmNvbnN0IEVWRU5UX0RBVEVfUkVGSU5FUlMgPSB7XG4gICAgc3RhcnQ6IGlkZW50aXR5LFxuICAgIGVuZDogaWRlbnRpdHksXG4gICAgZGF0ZTogaWRlbnRpdHksXG4gICAgYWxsRGF5OiBCb29sZWFuLFxufTtcbmNvbnN0IEVWRU5UX1JFRklORVJTID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIEVWRU5UX05PTl9EQVRFX1JFRklORVJTKSwgRVZFTlRfREFURV9SRUZJTkVSUyksIHsgZXh0ZW5kZWRQcm9wczogaWRlbnRpdHkgfSk7XG5mdW5jdGlvbiBwYXJzZUV2ZW50KHJhdywgZXZlbnRTb3VyY2UsIGNvbnRleHQsIGFsbG93T3BlblJhbmdlLCByZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KSwgZGVmSWRNYXAsIGluc3RhbmNlSWRNYXApIHtcbiAgICBsZXQgeyByZWZpbmVkLCBleHRyYSB9ID0gcmVmaW5lRXZlbnREZWYocmF3LCBjb250ZXh0LCByZWZpbmVycyk7XG4gICAgbGV0IGRlZmF1bHRBbGxEYXkgPSBjb21wdXRlSXNEZWZhdWx0QWxsRGF5KGV2ZW50U291cmNlLCBjb250ZXh0KTtcbiAgICBsZXQgcmVjdXJyaW5nUmVzID0gcGFyc2VSZWN1cnJpbmcocmVmaW5lZCwgZGVmYXVsdEFsbERheSwgY29udGV4dC5kYXRlRW52LCBjb250ZXh0LnBsdWdpbkhvb2tzLnJlY3VycmluZ1R5cGVzKTtcbiAgICBpZiAocmVjdXJyaW5nUmVzKSB7XG4gICAgICAgIGxldCBkZWYgPSBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLnNvdXJjZUlkIDogJycsIHJlY3VycmluZ1Jlcy5hbGxEYXksIEJvb2xlYW4ocmVjdXJyaW5nUmVzLmR1cmF0aW9uKSwgY29udGV4dCwgZGVmSWRNYXApO1xuICAgICAgICBkZWYucmVjdXJyaW5nRGVmID0ge1xuICAgICAgICAgICAgdHlwZUlkOiByZWN1cnJpbmdSZXMudHlwZUlkLFxuICAgICAgICAgICAgdHlwZURhdGE6IHJlY3VycmluZ1Jlcy50eXBlRGF0YSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiByZWN1cnJpbmdSZXMuZHVyYXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IGRlZiwgaW5zdGFuY2U6IG51bGwgfTtcbiAgICB9XG4gICAgbGV0IHNpbmdsZVJlcyA9IHBhcnNlU2luZ2xlKHJlZmluZWQsIGRlZmF1bHRBbGxEYXksIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKTtcbiAgICBpZiAoc2luZ2xlUmVzKSB7XG4gICAgICAgIGxldCBkZWYgPSBwYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLnNvdXJjZUlkIDogJycsIHNpbmdsZVJlcy5hbGxEYXksIHNpbmdsZVJlcy5oYXNFbmQsIGNvbnRleHQsIGRlZklkTWFwKTtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gY3JlYXRlRXZlbnRJbnN0YW5jZShkZWYuZGVmSWQsIHNpbmdsZVJlcy5yYW5nZSwgc2luZ2xlUmVzLmZvcmNlZFN0YXJ0VHpvLCBzaW5nbGVSZXMuZm9yY2VkRW5kVHpvKTtcbiAgICAgICAgaWYgKGluc3RhbmNlSWRNYXAgJiYgZGVmLnB1YmxpY0lkICYmIGluc3RhbmNlSWRNYXBbZGVmLnB1YmxpY0lkXSkge1xuICAgICAgICAgICAgaW5zdGFuY2UuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWRNYXBbZGVmLnB1YmxpY0lkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBkZWYsIGluc3RhbmNlIH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcmVmaW5lRXZlbnREZWYocmF3LCBjb250ZXh0LCByZWZpbmVycyA9IGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KSkge1xuICAgIHJldHVybiByZWZpbmVQcm9wcyhyYXcsIHJlZmluZXJzKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRSZWZpbmVycyhjb250ZXh0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBFVkVOVF9VSV9SRUZJTkVSUyksIEVWRU5UX1JFRklORVJTKSwgY29udGV4dC5wbHVnaW5Ib29rcy5ldmVudFJlZmluZXJzKTtcbn1cbi8qXG5XaWxsIE5PVCBwb3B1bGF0ZSBleHRlbmRlZFByb3BzIHdpdGggdGhlIGxlZnRvdmVyIHByb3BlcnRpZXMuXG5XaWxsIE5PVCBwb3B1bGF0ZSBkYXRlLXJlbGF0ZWQgcHJvcHMuXG4qL1xuZnVuY3Rpb24gcGFyc2VFdmVudERlZihyZWZpbmVkLCBleHRyYSwgc291cmNlSWQsIGFsbERheSwgaGFzRW5kLCBjb250ZXh0LCBkZWZJZE1hcCkge1xuICAgIGxldCBkZWYgPSB7XG4gICAgICAgIHRpdGxlOiByZWZpbmVkLnRpdGxlIHx8ICcnLFxuICAgICAgICBncm91cElkOiByZWZpbmVkLmdyb3VwSWQgfHwgJycsXG4gICAgICAgIHB1YmxpY0lkOiByZWZpbmVkLmlkIHx8ICcnLFxuICAgICAgICB1cmw6IHJlZmluZWQudXJsIHx8ICcnLFxuICAgICAgICByZWN1cnJpbmdEZWY6IG51bGwsXG4gICAgICAgIGRlZklkOiAoKGRlZklkTWFwICYmIHJlZmluZWQuaWQpID8gZGVmSWRNYXBbcmVmaW5lZC5pZF0gOiAnJykgfHwgZ3VpZCgpLFxuICAgICAgICBzb3VyY2VJZCxcbiAgICAgICAgYWxsRGF5LFxuICAgICAgICBoYXNFbmQsXG4gICAgICAgIGludGVyYWN0aXZlOiByZWZpbmVkLmludGVyYWN0aXZlLFxuICAgICAgICB1aTogY3JlYXRlRXZlbnRVaShyZWZpbmVkLCBjb250ZXh0KSxcbiAgICAgICAgZXh0ZW5kZWRQcm9wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAocmVmaW5lZC5leHRlbmRlZFByb3BzIHx8IHt9KSksIGV4dHJhKSxcbiAgICB9O1xuICAgIGZvciAobGV0IG1lbWJlckFkZGVyIG9mIGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnREZWZNZW1iZXJBZGRlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkZWYsIG1lbWJlckFkZGVyKHJlZmluZWQpKTtcbiAgICB9XG4gICAgLy8gaGVscCBvdXQgRXZlbnRJbXBsIGZyb20gaGF2aW5nIHVzZXIgbW9kaWZ5IHByb3BzXG4gICAgT2JqZWN0LmZyZWV6ZShkZWYudWkuY2xhc3NOYW1lcyk7XG4gICAgT2JqZWN0LmZyZWV6ZShkZWYuZXh0ZW5kZWRQcm9wcyk7XG4gICAgcmV0dXJuIGRlZjtcbn1cbmZ1bmN0aW9uIHBhcnNlU2luZ2xlKHJlZmluZWQsIGRlZmF1bHRBbGxEYXksIGNvbnRleHQsIGFsbG93T3BlblJhbmdlKSB7XG4gICAgbGV0IHsgYWxsRGF5IH0gPSByZWZpbmVkO1xuICAgIGxldCBzdGFydE1ldGE7XG4gICAgbGV0IHN0YXJ0TWFya2VyID0gbnVsbDtcbiAgICBsZXQgaGFzRW5kID0gZmFsc2U7XG4gICAgbGV0IGVuZE1ldGE7XG4gICAgbGV0IGVuZE1hcmtlciA9IG51bGw7XG4gICAgbGV0IHN0YXJ0SW5wdXQgPSByZWZpbmVkLnN0YXJ0ICE9IG51bGwgPyByZWZpbmVkLnN0YXJ0IDogcmVmaW5lZC5kYXRlO1xuICAgIHN0YXJ0TWV0YSA9IGNvbnRleHQuZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YXJ0SW5wdXQpO1xuICAgIGlmIChzdGFydE1ldGEpIHtcbiAgICAgICAgc3RhcnRNYXJrZXIgPSBzdGFydE1ldGEubWFya2VyO1xuICAgIH1cbiAgICBlbHNlIGlmICghYWxsb3dPcGVuUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChyZWZpbmVkLmVuZCAhPSBudWxsKSB7XG4gICAgICAgIGVuZE1ldGEgPSBjb250ZXh0LmRhdGVFbnYuY3JlYXRlTWFya2VyTWV0YShyZWZpbmVkLmVuZCk7XG4gICAgfVxuICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICBpZiAoZGVmYXVsdEFsbERheSAhPSBudWxsKSB7XG4gICAgICAgICAgICBhbGxEYXkgPSBkZWZhdWx0QWxsRGF5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBkYXRlIHByb3BzIExBU1RcbiAgICAgICAgICAgIGFsbERheSA9ICghc3RhcnRNZXRhIHx8IHN0YXJ0TWV0YS5pc1RpbWVVbnNwZWNpZmllZCkgJiZcbiAgICAgICAgICAgICAgICAoIWVuZE1ldGEgfHwgZW5kTWV0YS5pc1RpbWVVbnNwZWNpZmllZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbERheSAmJiBzdGFydE1hcmtlcikge1xuICAgICAgICBzdGFydE1hcmtlciA9IHN0YXJ0T2ZEYXkoc3RhcnRNYXJrZXIpO1xuICAgIH1cbiAgICBpZiAoZW5kTWV0YSkge1xuICAgICAgICBlbmRNYXJrZXIgPSBlbmRNZXRhLm1hcmtlcjtcbiAgICAgICAgaWYgKGFsbERheSkge1xuICAgICAgICAgICAgZW5kTWFya2VyID0gc3RhcnRPZkRheShlbmRNYXJrZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIgPD0gc3RhcnRNYXJrZXIpIHtcbiAgICAgICAgICAgIGVuZE1hcmtlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuZE1hcmtlcikge1xuICAgICAgICBoYXNFbmQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICghYWxsb3dPcGVuUmFuZ2UpIHtcbiAgICAgICAgaGFzRW5kID0gY29udGV4dC5vcHRpb25zLmZvcmNlRXZlbnREdXJhdGlvbiB8fCBmYWxzZTtcbiAgICAgICAgZW5kTWFya2VyID0gY29udGV4dC5kYXRlRW52LmFkZChzdGFydE1hcmtlciwgYWxsRGF5ID9cbiAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiA6XG4gICAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbERheSxcbiAgICAgICAgaGFzRW5kLFxuICAgICAgICByYW5nZTogeyBzdGFydDogc3RhcnRNYXJrZXIsIGVuZDogZW5kTWFya2VyIH0sXG4gICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBzdGFydE1ldGEgPyBzdGFydE1ldGEuZm9yY2VkVHpvIDogbnVsbCxcbiAgICAgICAgZm9yY2VkRW5kVHpvOiBlbmRNZXRhID8gZW5kTWV0YS5mb3JjZWRUem8gOiBudWxsLFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlSXNEZWZhdWx0QWxsRGF5KGV2ZW50U291cmNlLCBjb250ZXh0KSB7XG4gICAgbGV0IHJlcyA9IG51bGw7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICAgIHJlcyA9IGV2ZW50U291cmNlLmRlZmF1bHRBbGxEYXk7XG4gICAgfVxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICByZXMgPSBjb250ZXh0Lm9wdGlvbnMuZGVmYXVsdEFsbERheTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuY29uc3QgREVGX0RFRkFVTFRTID0ge1xuICAgIHN0YXJ0VGltZTogJzA5OjAwJyxcbiAgICBlbmRUaW1lOiAnMTc6MDAnLFxuICAgIGRheXNPZldlZWs6IFsxLCAyLCAzLCA0LCA1XSxcbiAgICBkaXNwbGF5OiAnaW52ZXJzZS1iYWNrZ3JvdW5kJyxcbiAgICBjbGFzc05hbWVzOiAnZmMtbm9uLWJ1c2luZXNzJyxcbiAgICBncm91cElkOiAnX2J1c2luZXNzSG91cnMnLCAvLyBzbyBtdWx0aXBsZSBkZWZzIGdldCBncm91cGVkXG59O1xuLypcblRPRE86IHBhc3MgYXJvdW5kIGFzIEV2ZW50RGVmSGFzaCEhIVxuKi9cbmZ1bmN0aW9uIHBhcnNlQnVzaW5lc3NIb3VycyhpbnB1dCwgY29udGV4dCkge1xuICAgIHJldHVybiBwYXJzZUV2ZW50cyhyZWZpbmVJbnB1dHMoaW5wdXQpLCBudWxsLCBjb250ZXh0KTtcbn1cbmZ1bmN0aW9uIHJlZmluZUlucHV0cyhpbnB1dCkge1xuICAgIGxldCByYXdEZWZzO1xuICAgIGlmIChpbnB1dCA9PT0gdHJ1ZSkge1xuICAgICAgICByYXdEZWZzID0gW3t9XTsgLy8gd2lsbCBnZXQgREVGX0RFRkFVTFRTIHZlcmJhdGltXG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgICAgIC8vIGlmIHNwZWNpZnlpbmcgYW4gYXJyYXksIGV2ZXJ5IHN1Yi1kZWZpbml0aW9uIE5FRURTIGEgZGF5LW9mLXdlZWtcbiAgICAgICAgcmF3RGVmcyA9IGlucHV0LmZpbHRlcigocmF3RGVmKSA9PiByYXdEZWYuZGF5c09mV2Vlayk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgIHJhd0RlZnMgPSBbaW5wdXRdO1xuICAgIH1cbiAgICBlbHNlIHsgLy8gaXMgcHJvYmFibHkgZmFsc2VcbiAgICAgICAgcmF3RGVmcyA9IFtdO1xuICAgIH1cbiAgICByYXdEZWZzID0gcmF3RGVmcy5tYXAoKHJhd0RlZikgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGX0RFRkFVTFRTKSwgcmF3RGVmKSkpO1xuICAgIHJldHVybiByYXdEZWZzO1xufVxuXG4vKiBEYXRlIHN0dWZmIHRoYXQgZG9lc24ndCBiZWxvbmcgaW4gZGF0ZWxpYiBjb3JlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbi8vIGdpdmVuIGEgdGltZWQgcmFuZ2UsIGNvbXB1dGVzIGFuIGFsbC1kYXkgcmFuZ2UgdGhhdCBoYXMgdGhlIHNhbWUgZXhhY3QgZHVyYXRpb24sXG4vLyBidXQgd2hvc2Ugc3RhcnQgdGltZSBpcyBhbGlnbmVkIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSBkYXkuXG5mdW5jdGlvbiBjb21wdXRlQWxpZ25lZERheVJhbmdlKHRpbWVkUmFuZ2UpIHtcbiAgICBsZXQgZGF5Q250ID0gTWF0aC5mbG9vcihkaWZmRGF5cyh0aW1lZFJhbmdlLnN0YXJ0LCB0aW1lZFJhbmdlLmVuZCkpIHx8IDE7XG4gICAgbGV0IHN0YXJ0ID0gc3RhcnRPZkRheSh0aW1lZFJhbmdlLnN0YXJ0KTtcbiAgICBsZXQgZW5kID0gYWRkRGF5cyhzdGFydCwgZGF5Q250KTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG4vLyBnaXZlbiBhIHRpbWVkIHJhbmdlLCBjb21wdXRlcyBhbiBhbGwtZGF5IHJhbmdlIGJhc2VkIG9uIGhvdyBmb3IgdGhlIGVuZCBkYXRlIGJsZWVkcyBpbnRvIHRoZSBuZXh0IGRheVxuLy8gVE9ETzogZ2l2ZSBuZXh0RGF5VGhyZXNob2xkIGEgZGVmYXVsdCBhcmdcbmZ1bmN0aW9uIGNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UodGltZWRSYW5nZSwgbmV4dERheVRocmVzaG9sZCA9IGNyZWF0ZUR1cmF0aW9uKDApKSB7XG4gICAgbGV0IHN0YXJ0RGF5ID0gbnVsbDtcbiAgICBsZXQgZW5kRGF5ID0gbnVsbDtcbiAgICBpZiAodGltZWRSYW5nZS5lbmQpIHtcbiAgICAgICAgZW5kRGF5ID0gc3RhcnRPZkRheSh0aW1lZFJhbmdlLmVuZCk7XG4gICAgICAgIGxldCBlbmRUaW1lTVMgPSB0aW1lZFJhbmdlLmVuZC52YWx1ZU9mKCkgLSBlbmREYXkudmFsdWVPZigpOyAvLyAjIG9mIG1pbGxpc2Vjb25kcyBpbnRvIGBlbmREYXlgXG4gICAgICAgIC8vIElmIHRoZSBlbmQgdGltZSBpcyBhY3R1YWxseSBpbmNsdXNpdmVseSBwYXJ0IG9mIHRoZSBuZXh0IGRheSBhbmQgaXMgZXF1YWwgdG8gb3JcbiAgICAgICAgLy8gYmV5b25kIHRoZSBuZXh0IGRheSB0aHJlc2hvbGQsIGFkanVzdCB0aGUgZW5kIHRvIGJlIHRoZSBleGNsdXNpdmUgZW5kIG9mIGBlbmREYXlgLlxuICAgICAgICAvLyBPdGhlcndpc2UsIGxlYXZpbmcgaXQgYXMgaW5jbHVzaXZlIHdpbGwgY2F1c2UgaXQgdG8gZXhjbHVkZSBgZW5kRGF5YC5cbiAgICAgICAgaWYgKGVuZFRpbWVNUyAmJiBlbmRUaW1lTVMgPj0gYXNSb3VnaE1zKG5leHREYXlUaHJlc2hvbGQpKSB7XG4gICAgICAgICAgICBlbmREYXkgPSBhZGREYXlzKGVuZERheSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVkUmFuZ2Uuc3RhcnQpIHtcbiAgICAgICAgc3RhcnREYXkgPSBzdGFydE9mRGF5KHRpbWVkUmFuZ2Uuc3RhcnQpOyAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXkgdGhlIHJhbmdlIHN0YXJ0c1xuICAgICAgICAvLyBJZiBlbmQgaXMgd2l0aGluIGBzdGFydERheWAgYnV0IG5vdCBwYXN0IG5leHREYXlUaHJlc2hvbGQsIGFzc2lnbiB0aGUgZGVmYXVsdCBkdXJhdGlvbiBvZiBvbmUgZGF5LlxuICAgICAgICBpZiAoZW5kRGF5ICYmIGVuZERheSA8PSBzdGFydERheSkge1xuICAgICAgICAgICAgZW5kRGF5ID0gYWRkRGF5cyhzdGFydERheSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0RGF5LCBlbmQ6IGVuZERheSB9O1xufVxuLy8gc3BhbnMgZnJvbSBvbmUgZGF5IGludG8gYW5vdGhlcj9cbmZ1bmN0aW9uIGlzTXVsdGlEYXlSYW5nZShyYW5nZSkge1xuICAgIGxldCB2aXNpYmxlUmFuZ2UgPSBjb21wdXRlVmlzaWJsZURheVJhbmdlKHJhbmdlKTtcbiAgICByZXR1cm4gZGlmZkRheXModmlzaWJsZVJhbmdlLnN0YXJ0LCB2aXNpYmxlUmFuZ2UuZW5kKSA+IDE7XG59XG5mdW5jdGlvbiBkaWZmRGF0ZXMoZGF0ZTAsIGRhdGUxLCBkYXRlRW52LCBsYXJnZVVuaXQpIHtcbiAgICBpZiAobGFyZ2VVbml0ID09PSAneWVhcicpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKGRhdGVFbnYuZGlmZldob2xlWWVhcnMoZGF0ZTAsIGRhdGUxKSwgJ3llYXInKTtcbiAgICB9XG4gICAgaWYgKGxhcmdlVW5pdCA9PT0gJ21vbnRoJykge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oZGF0ZUVudi5kaWZmV2hvbGVNb250aHMoZGF0ZTAsIGRhdGUxKSwgJ21vbnRoJyk7XG4gICAgfVxuICAgIHJldHVybiBkaWZmRGF5QW5kVGltZShkYXRlMCwgZGF0ZTEpOyAvLyByZXR1cm5zIGEgZHVyYXRpb25cbn1cblxuZnVuY3Rpb24gcG9pbnRJbnNpZGVSZWN0KHBvaW50LCByZWN0KSB7XG4gICAgcmV0dXJuIHBvaW50LmxlZnQgPj0gcmVjdC5sZWZ0ICYmXG4gICAgICAgIHBvaW50LmxlZnQgPCByZWN0LnJpZ2h0ICYmXG4gICAgICAgIHBvaW50LnRvcCA+PSByZWN0LnRvcCAmJlxuICAgICAgICBwb2ludC50b3AgPCByZWN0LmJvdHRvbTtcbn1cbi8vIFJldHVybnMgYSBuZXcgcmVjdGFuZ2xlIHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuIElmIHRoZXkgZG9uJ3QgaW50ZXJzZWN0LCByZXR1cm5zIGZhbHNlXG5mdW5jdGlvbiBpbnRlcnNlY3RSZWN0cyhyZWN0MSwgcmVjdDIpIHtcbiAgICBsZXQgcmVzID0ge1xuICAgICAgICBsZWZ0OiBNYXRoLm1heChyZWN0MS5sZWZ0LCByZWN0Mi5sZWZ0KSxcbiAgICAgICAgcmlnaHQ6IE1hdGgubWluKHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCksXG4gICAgICAgIHRvcDogTWF0aC5tYXgocmVjdDEudG9wLCByZWN0Mi50b3ApLFxuICAgICAgICBib3R0b206IE1hdGgubWluKHJlY3QxLmJvdHRvbSwgcmVjdDIuYm90dG9tKSxcbiAgICB9O1xuICAgIGlmIChyZXMubGVmdCA8IHJlcy5yaWdodCAmJiByZXMudG9wIDwgcmVzLmJvdHRvbSkge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0cmFuc2xhdGVSZWN0KHJlY3QsIGRlbHRhWCwgZGVsdGFZKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgZGVsdGFYLFxuICAgICAgICByaWdodDogcmVjdC5yaWdodCArIGRlbHRhWCxcbiAgICAgICAgdG9wOiByZWN0LnRvcCArIGRlbHRhWSxcbiAgICAgICAgYm90dG9tOiByZWN0LmJvdHRvbSArIGRlbHRhWSxcbiAgICB9O1xufVxuLy8gUmV0dXJucyBhIG5ldyBwb2ludCB0aGF0IHdpbGwgaGF2ZSBiZWVuIG1vdmVkIHRvIHJlc2lkZSB3aXRoaW4gdGhlIGdpdmVuIHJlY3RhbmdsZVxuZnVuY3Rpb24gY29uc3RyYWluUG9pbnQocG9pbnQsIHJlY3QpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiBNYXRoLm1pbihNYXRoLm1heChwb2ludC5sZWZ0LCByZWN0LmxlZnQpLCByZWN0LnJpZ2h0KSxcbiAgICAgICAgdG9wOiBNYXRoLm1pbihNYXRoLm1heChwb2ludC50b3AsIHJlY3QudG9wKSwgcmVjdC5ib3R0b20pLFxuICAgIH07XG59XG4vLyBSZXR1cm5zIGEgcG9pbnQgdGhhdCBpcyB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbiByZWN0YW5nbGVcbmZ1bmN0aW9uIGdldFJlY3RDZW50ZXIocmVjdCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGxlZnQ6IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIsXG4gICAgICAgIHRvcDogKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMixcbiAgICB9O1xufVxuLy8gU3VidHJhY3RzIHBvaW50MidzIGNvb3JkaW5hdGVzIGZyb20gcG9pbnQxJ3MgY29vcmRpbmF0ZXMsIHJldHVybmluZyBhIGRlbHRhXG5mdW5jdGlvbiBkaWZmUG9pbnRzKHBvaW50MSwgcG9pbnQyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGVmdDogcG9pbnQxLmxlZnQgLSBwb2ludDIubGVmdCxcbiAgICAgICAgdG9wOiBwb2ludDEudG9wIC0gcG9pbnQyLnRvcCxcbiAgICB9O1xufVxuXG5sZXQgY2FuVkdyb3dXaXRoaW5DZWxsO1xuZnVuY3Rpb24gZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsKCkge1xuICAgIGlmIChjYW5WR3Jvd1dpdGhpbkNlbGwgPT0gbnVsbCkge1xuICAgICAgICBjYW5WR3Jvd1dpdGhpbkNlbGwgPSBjb21wdXRlQ2FuVkdyb3dXaXRoaW5DZWxsKCk7XG4gICAgfVxuICAgIHJldHVybiBjYW5WR3Jvd1dpdGhpbkNlbGw7XG59XG5mdW5jdGlvbiBjb21wdXRlQ2FuVkdyb3dXaXRoaW5DZWxsKCkge1xuICAgIC8vIGZvciBTU1IsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsIGltbWVkaWF0ZWx5IGF0IHRvcC1sZXZlbFxuICAgIC8vIFRPRE86IGp1c3QgbWFrZSB0aGlzIGxvZ2ljIGV4ZWN1dGUgdG9wLWxldmVsLCBpbW1lZGlhdGVseSwgaW5zdGVhZCBvZiBkb2luZyBsYXppbHlcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGVsLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSAnMHB4JztcbiAgICBlbC5pbm5lckhUTUwgPSAnPHRhYmxlPjx0cj48dGQ+PGRpdj48L2Rpdj48L3RkPjwvdHI+PC90YWJsZT4nO1xuICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJykuc3R5bGUuaGVpZ2h0ID0gJzEwMHB4JztcbiAgICBlbC5xdWVyeVNlbGVjdG9yKCdkaXYnKS5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgbGV0IGRpdiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGxldCBwb3NzaWJsZSA9IGRpdi5vZmZzZXRIZWlnaHQgPiAwO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIHJldHVybiBwb3NzaWJsZTtcbn1cblxuY29uc3QgRU1QVFlfRVZFTlRfU1RPUkUgPSBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTsgLy8gZm9yIHB1cmVjb21wb25lbnRzLiBUT0RPOiBrZWVwIGVsc2V3aGVyZVxuY2xhc3MgU3BsaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmdldEtleXNGb3JFdmVudERlZnMgPSBtZW1vaXplKHRoaXMuX2dldEtleXNGb3JFdmVudERlZnMpO1xuICAgICAgICB0aGlzLnNwbGl0RGF0ZVNlbGVjdGlvbiA9IG1lbW9pemUodGhpcy5fc3BsaXREYXRlU3Bhbik7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudFN0b3JlID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEV2ZW50U3RvcmUpO1xuICAgICAgICB0aGlzLnNwbGl0SW5kaXZpZHVhbFVpID0gbWVtb2l6ZSh0aGlzLl9zcGxpdEluZGl2aWR1YWxVaSk7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNwbGl0RXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NwbGl0SW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmV2ZW50VWlCdWlsZGVycyA9IHt9OyAvLyBUT0RPOiB0eXBlc2NyaXB0IHByb3RlY3Rpb25cbiAgICB9XG4gICAgc3BsaXRQcm9wcyhwcm9wcykge1xuICAgICAgICBsZXQga2V5SW5mb3MgPSB0aGlzLmdldEtleUluZm8ocHJvcHMpO1xuICAgICAgICBsZXQgZGVmS2V5cyA9IHRoaXMuZ2V0S2V5c0ZvckV2ZW50RGVmcyhwcm9wcy5ldmVudFN0b3JlKTtcbiAgICAgICAgbGV0IGRhdGVTZWxlY3Rpb25zID0gdGhpcy5zcGxpdERhdGVTZWxlY3Rpb24ocHJvcHMuZGF0ZVNlbGVjdGlvbik7XG4gICAgICAgIGxldCBpbmRpdmlkdWFsVWkgPSB0aGlzLnNwbGl0SW5kaXZpZHVhbFVpKHByb3BzLmV2ZW50VWlCYXNlcywgZGVmS2V5cyk7IC8vIHRoZSBpbmRpdmlkdWFsICpiYXNlcypcbiAgICAgICAgbGV0IGV2ZW50U3RvcmVzID0gdGhpcy5zcGxpdEV2ZW50U3RvcmUocHJvcHMuZXZlbnRTdG9yZSwgZGVmS2V5cyk7XG4gICAgICAgIGxldCBldmVudERyYWdzID0gdGhpcy5zcGxpdEV2ZW50RHJhZyhwcm9wcy5ldmVudERyYWcpO1xuICAgICAgICBsZXQgZXZlbnRSZXNpemVzID0gdGhpcy5zcGxpdEV2ZW50UmVzaXplKHByb3BzLmV2ZW50UmVzaXplKTtcbiAgICAgICAgbGV0IHNwbGl0UHJvcHMgPSB7fTtcbiAgICAgICAgdGhpcy5ldmVudFVpQnVpbGRlcnMgPSBtYXBIYXNoKGtleUluZm9zLCAoaW5mbywga2V5KSA9PiB0aGlzLmV2ZW50VWlCdWlsZGVyc1trZXldIHx8IG1lbW9pemUoYnVpbGRFdmVudFVpRm9yS2V5KSk7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBrZXlJbmZvcykge1xuICAgICAgICAgICAgbGV0IGtleUluZm8gPSBrZXlJbmZvc1trZXldO1xuICAgICAgICAgICAgbGV0IGV2ZW50U3RvcmUgPSBldmVudFN0b3Jlc1trZXldIHx8IEVNUFRZX0VWRU5UX1NUT1JFO1xuICAgICAgICAgICAgbGV0IGJ1aWxkRXZlbnRVaSA9IHRoaXMuZXZlbnRVaUJ1aWxkZXJzW2tleV07XG4gICAgICAgICAgICBzcGxpdFByb3BzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgYnVzaW5lc3NIb3Vyczoga2V5SW5mby5idXNpbmVzc0hvdXJzIHx8IHByb3BzLmJ1c2luZXNzSG91cnMsXG4gICAgICAgICAgICAgICAgZGF0ZVNlbGVjdGlvbjogZGF0ZVNlbGVjdGlvbnNba2V5XSB8fCBudWxsLFxuICAgICAgICAgICAgICAgIGV2ZW50U3RvcmUsXG4gICAgICAgICAgICAgICAgZXZlbnRVaUJhc2VzOiBidWlsZEV2ZW50VWkocHJvcHMuZXZlbnRVaUJhc2VzWycnXSwga2V5SW5mby51aSwgaW5kaXZpZHVhbFVpW2tleV0pLFxuICAgICAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiBldmVudFN0b3JlLmluc3RhbmNlc1twcm9wcy5ldmVudFNlbGVjdGlvbl0gPyBwcm9wcy5ldmVudFNlbGVjdGlvbiA6ICcnLFxuICAgICAgICAgICAgICAgIGV2ZW50RHJhZzogZXZlbnREcmFnc1trZXldIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgZXZlbnRSZXNpemU6IGV2ZW50UmVzaXplc1trZXldIHx8IG51bGwsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGxpdFByb3BzO1xuICAgIH1cbiAgICBfc3BsaXREYXRlU3BhbihkYXRlU3Bhbikge1xuICAgICAgICBsZXQgZGF0ZVNwYW5zID0ge307XG4gICAgICAgIGlmIChkYXRlU3Bhbikge1xuICAgICAgICAgICAgbGV0IGtleXMgPSB0aGlzLmdldEtleXNGb3JEYXRlU3BhbihkYXRlU3Bhbik7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgIGRhdGVTcGFuc1trZXldID0gZGF0ZVNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGVTcGFucztcbiAgICB9XG4gICAgX2dldEtleXNGb3JFdmVudERlZnMoZXZlbnRTdG9yZSkge1xuICAgICAgICByZXR1cm4gbWFwSGFzaChldmVudFN0b3JlLmRlZnMsIChldmVudERlZikgPT4gdGhpcy5nZXRLZXlzRm9yRXZlbnREZWYoZXZlbnREZWYpKTtcbiAgICB9XG4gICAgX3NwbGl0RXZlbnRTdG9yZShldmVudFN0b3JlLCBkZWZLZXlzKSB7XG4gICAgICAgIGxldCB7IGRlZnMsIGluc3RhbmNlcyB9ID0gZXZlbnRTdG9yZTtcbiAgICAgICAgbGV0IHNwbGl0U3RvcmVzID0ge307XG4gICAgICAgIGZvciAobGV0IGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBkZWZLZXlzW2RlZklkXSkge1xuICAgICAgICAgICAgICAgIGlmICghc3BsaXRTdG9yZXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBzcGxpdFN0b3Jlc1trZXldID0gY3JlYXRlRW1wdHlFdmVudFN0b3JlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uZGVmc1tkZWZJZF0gPSBkZWZzW2RlZklkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIGRlZktleXNbaW5zdGFuY2UuZGVmSWRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0U3RvcmVzW2tleV0pIHsgLy8gbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkXG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RvcmVzW2tleV0uaW5zdGFuY2VzW2luc3RhbmNlSWRdID0gaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGxpdFN0b3JlcztcbiAgICB9XG4gICAgX3NwbGl0SW5kaXZpZHVhbFVpKGV2ZW50VWlCYXNlcywgZGVmS2V5cykge1xuICAgICAgICBsZXQgc3BsaXRIYXNoZXMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgZGVmSWQgaW4gZXZlbnRVaUJhc2VzKSB7XG4gICAgICAgICAgICBpZiAoZGVmSWQpIHsgLy8gbm90IHRoZSAnJyBrZXlcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgZGVmS2V5c1tkZWZJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzcGxpdEhhc2hlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdEhhc2hlc1trZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3BsaXRIYXNoZXNba2V5XVtkZWZJZF0gPSBldmVudFVpQmFzZXNbZGVmSWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BsaXRIYXNoZXM7XG4gICAgfVxuICAgIF9zcGxpdEludGVyYWN0aW9uKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGxldCBzcGxpdFN0YXRlcyA9IHt9O1xuICAgICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIGxldCBhZmZlY3RlZFN0b3JlcyA9IHRoaXMuX3NwbGl0RXZlbnRTdG9yZShpbnRlcmFjdGlvbi5hZmZlY3RlZEV2ZW50cywgdGhpcy5fZ2V0S2V5c0ZvckV2ZW50RGVmcyhpbnRlcmFjdGlvbi5hZmZlY3RlZEV2ZW50cykpO1xuICAgICAgICAgICAgLy8gY2FuJ3QgcmVseSBvbiBkZWZLZXlzIGJlY2F1c2UgZXZlbnQgZGF0YSBpcyBtdXRhdGVkXG4gICAgICAgICAgICBsZXQgbXV0YXRlZEtleXNCeURlZklkID0gdGhpcy5fZ2V0S2V5c0ZvckV2ZW50RGVmcyhpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzKTtcbiAgICAgICAgICAgIGxldCBtdXRhdGVkU3RvcmVzID0gdGhpcy5fc3BsaXRFdmVudFN0b3JlKGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMsIG11dGF0ZWRLZXlzQnlEZWZJZCk7XG4gICAgICAgICAgICBsZXQgcG9wdWxhdGUgPSAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGxpdFN0YXRlc1trZXldKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0U3RhdGVzW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogYWZmZWN0ZWRTdG9yZXNba2V5XSB8fCBFTVBUWV9FVkVOVF9TVE9SRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IG11dGF0ZWRTdG9yZXNba2V5XSB8fCBFTVBUWV9FVkVOVF9TVE9SRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRXZlbnQ6IGludGVyYWN0aW9uLmlzRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBhZmZlY3RlZFN0b3Jlcykge1xuICAgICAgICAgICAgICAgIHBvcHVsYXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gbXV0YXRlZFN0b3Jlcykge1xuICAgICAgICAgICAgICAgIHBvcHVsYXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwbGl0U3RhdGVzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRVaUZvcktleShhbGxVaSwgZXZlbnRVaUZvcktleSwgaW5kaXZpZHVhbFVpKSB7XG4gICAgbGV0IGJhc2VQYXJ0cyA9IFtdO1xuICAgIGlmIChhbGxVaSkge1xuICAgICAgICBiYXNlUGFydHMucHVzaChhbGxVaSk7XG4gICAgfVxuICAgIGlmIChldmVudFVpRm9yS2V5KSB7XG4gICAgICAgIGJhc2VQYXJ0cy5wdXNoKGV2ZW50VWlGb3JLZXkpO1xuICAgIH1cbiAgICBsZXQgc3R1ZmYgPSB7XG4gICAgICAgICcnOiBjb21iaW5lRXZlbnRVaXMoYmFzZVBhcnRzKSxcbiAgICB9O1xuICAgIGlmIChpbmRpdmlkdWFsVWkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHVmZiwgaW5kaXZpZHVhbFVpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0dWZmO1xufVxuXG5mdW5jdGlvbiBwYXJzZVJhbmdlKGlucHV0LCBkYXRlRW52KSB7XG4gICAgbGV0IHN0YXJ0ID0gbnVsbDtcbiAgICBsZXQgZW5kID0gbnVsbDtcbiAgICBpZiAoaW5wdXQuc3RhcnQpIHtcbiAgICAgICAgc3RhcnQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihpbnB1dC5zdGFydCk7XG4gICAgfVxuICAgIGlmIChpbnB1dC5lbmQpIHtcbiAgICAgICAgZW5kID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoaW5wdXQuZW5kKTtcbiAgICB9XG4gICAgaWYgKCFzdGFydCAmJiAhZW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgJiYgZW5kICYmIGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG4vLyBTSURFLUVGRkVDVDogd2lsbCBtdXRhdGUgcmFuZ2VzLlxuLy8gV2lsbCByZXR1cm4gYSBuZXcgYXJyYXkgcmVzdWx0LlxuZnVuY3Rpb24gaW52ZXJ0UmFuZ2VzKHJhbmdlcywgY29uc3RyYWludFJhbmdlKSB7XG4gICAgbGV0IGludmVydGVkUmFuZ2VzID0gW107XG4gICAgbGV0IHsgc3RhcnQgfSA9IGNvbnN0cmFpbnRSYW5nZTsgLy8gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgcmFuZ2UuIHRoZSBzdGFydCBvZiB0aGUgbmV3IHJhbmdlXG4gICAgbGV0IGk7XG4gICAgbGV0IGRhdGVSYW5nZTtcbiAgICAvLyByYW5nZXMgbmVlZCB0byBiZSBpbiBvcmRlci4gcmVxdWlyZWQgZm9yIG91ciBkYXRlLXdhbGtpbmcgYWxnb3JpdGhtXG4gICAgcmFuZ2VzLnNvcnQoY29tcGFyZVJhbmdlcyk7XG4gICAgZm9yIChpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBkYXRlUmFuZ2UgPSByYW5nZXNbaV07XG4gICAgICAgIC8vIGFkZCB0aGUgc3BhbiBvZiB0aW1lIGJlZm9yZSB0aGUgZXZlbnQgKGlmIHRoZXJlIGlzIGFueSlcbiAgICAgICAgaWYgKGRhdGVSYW5nZS5zdGFydCA+IHN0YXJ0KSB7IC8vIGNvbXBhcmUgbWlsbGlzZWNvbmQgdGltZSAoc2tpcCBhbnkgYW1iaWcgbG9naWMpXG4gICAgICAgICAgICBpbnZlcnRlZFJhbmdlcy5wdXNoKHsgc3RhcnQsIGVuZDogZGF0ZVJhbmdlLnN0YXJ0IH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2UuZW5kID4gc3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gZGF0ZVJhbmdlLmVuZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgdGhlIHNwYW4gb2YgdGltZSBhZnRlciB0aGUgbGFzdCBldmVudCAoaWYgdGhlcmUgaXMgYW55KVxuICAgIGlmIChzdGFydCA8IGNvbnN0cmFpbnRSYW5nZS5lbmQpIHsgLy8gY29tcGFyZSBtaWxsaXNlY29uZCB0aW1lIChza2lwIGFueSBhbWJpZyBsb2dpYylcbiAgICAgICAgaW52ZXJ0ZWRSYW5nZXMucHVzaCh7IHN0YXJ0LCBlbmQ6IGNvbnN0cmFpbnRSYW5nZS5lbmQgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbnZlcnRlZFJhbmdlcztcbn1cbmZ1bmN0aW9uIGNvbXBhcmVSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICByZXR1cm4gcmFuZ2UwLnN0YXJ0LnZhbHVlT2YoKSAtIHJhbmdlMS5zdGFydC52YWx1ZU9mKCk7IC8vIGVhcmxpZXIgcmFuZ2VzIGdvIGZpcnN0XG59XG5mdW5jdGlvbiBpbnRlcnNlY3RSYW5nZXMocmFuZ2UwLCByYW5nZTEpIHtcbiAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSByYW5nZTA7XG4gICAgbGV0IG5ld1JhbmdlID0gbnVsbDtcbiAgICBpZiAocmFuZ2UxLnN0YXJ0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzdGFydCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhcnQgPSByYW5nZTEuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKE1hdGgubWF4KHN0YXJ0LnZhbHVlT2YoKSwgcmFuZ2UxLnN0YXJ0LnZhbHVlT2YoKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyYW5nZTEuZW5kICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGVuZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZW5kID0gcmFuZ2UxLmVuZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVuZCA9IG5ldyBEYXRlKE1hdGgubWluKGVuZC52YWx1ZU9mKCksIHJhbmdlMS5lbmQudmFsdWVPZigpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0ID09PSBudWxsIHx8IGVuZCA9PT0gbnVsbCB8fCBzdGFydCA8IGVuZCkge1xuICAgICAgICBuZXdSYW5nZSA9IHsgc3RhcnQsIGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbmV3UmFuZ2U7XG59XG5mdW5jdGlvbiByYW5nZXNFcXVhbChyYW5nZTAsIHJhbmdlMSkge1xuICAgIHJldHVybiAocmFuZ2UwLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5zdGFydC52YWx1ZU9mKCkpID09PSAocmFuZ2UxLnN0YXJ0ID09PSBudWxsID8gbnVsbCA6IHJhbmdlMS5zdGFydC52YWx1ZU9mKCkpICYmXG4gICAgICAgIChyYW5nZTAuZW5kID09PSBudWxsID8gbnVsbCA6IHJhbmdlMC5lbmQudmFsdWVPZigpKSA9PT0gKHJhbmdlMS5lbmQgPT09IG51bGwgPyBudWxsIDogcmFuZ2UxLmVuZC52YWx1ZU9mKCkpO1xufVxuZnVuY3Rpb24gcmFuZ2VzSW50ZXJzZWN0KHJhbmdlMCwgcmFuZ2UxKSB7XG4gICAgcmV0dXJuIChyYW5nZTAuZW5kID09PSBudWxsIHx8IHJhbmdlMS5zdGFydCA9PT0gbnVsbCB8fCByYW5nZTAuZW5kID4gcmFuZ2UxLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UwLnN0YXJ0ID09PSBudWxsIHx8IHJhbmdlMS5lbmQgPT09IG51bGwgfHwgcmFuZ2UwLnN0YXJ0IDwgcmFuZ2UxLmVuZCk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkge1xuICAgIHJldHVybiAob3V0ZXJSYW5nZS5zdGFydCA9PT0gbnVsbCB8fCAoaW5uZXJSYW5nZS5zdGFydCAhPT0gbnVsbCAmJiBpbm5lclJhbmdlLnN0YXJ0ID49IG91dGVyUmFuZ2Uuc3RhcnQpKSAmJlxuICAgICAgICAob3V0ZXJSYW5nZS5lbmQgPT09IG51bGwgfHwgKGlubmVyUmFuZ2UuZW5kICE9PSBudWxsICYmIGlubmVyUmFuZ2UuZW5kIDw9IG91dGVyUmFuZ2UuZW5kKSk7XG59XG5mdW5jdGlvbiByYW5nZUNvbnRhaW5zTWFya2VyKHJhbmdlLCBkYXRlKSB7XG4gICAgcmV0dXJuIChyYW5nZS5zdGFydCA9PT0gbnVsbCB8fCBkYXRlID49IHJhbmdlLnN0YXJ0KSAmJlxuICAgICAgICAocmFuZ2UuZW5kID09PSBudWxsIHx8IGRhdGUgPCByYW5nZS5lbmQpO1xufVxuLy8gSWYgdGhlIGdpdmVuIGRhdGUgaXMgbm90IHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UsIG1vdmUgaXQgaW5zaWRlLlxuLy8gKElmIGl0J3MgcGFzdCB0aGUgZW5kLCBtYWtlIGl0IG9uZSBtaWxsaXNlY29uZCBiZWZvcmUgdGhlIGVuZCkuXG5mdW5jdGlvbiBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGRhdGUsIHJhbmdlKSB7XG4gICAgaWYgKHJhbmdlLnN0YXJ0ICE9IG51bGwgJiYgZGF0ZSA8IHJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIHJldHVybiByYW5nZS5zdGFydDtcbiAgICB9XG4gICAgaWYgKHJhbmdlLmVuZCAhPSBudWxsICYmIGRhdGUgPj0gcmFuZ2UuZW5kKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShyYW5nZS5lbmQudmFsdWVPZigpIC0gMSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlO1xufVxuXG5mdW5jdGlvbiBnZXREYXRlTWV0YShkYXRlLCB0b2RheVJhbmdlLCBub3dEYXRlLCBkYXRlUHJvZmlsZSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRvdzogZGF0ZS5nZXRVVENEYXkoKSxcbiAgICAgICAgaXNEaXNhYmxlZDogQm9vbGVhbihkYXRlUHJvZmlsZSAmJiAhcmFuZ2VDb250YWluc01hcmtlcihkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc090aGVyOiBCb29sZWFuKGRhdGVQcm9maWxlICYmICFyYW5nZUNvbnRhaW5zTWFya2VyKGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZSwgZGF0ZSkpLFxuICAgICAgICBpc1RvZGF5OiBCb29sZWFuKHRvZGF5UmFuZ2UgJiYgcmFuZ2VDb250YWluc01hcmtlcih0b2RheVJhbmdlLCBkYXRlKSksXG4gICAgICAgIGlzUGFzdDogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPCBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA8IHRvZGF5UmFuZ2Uuc3RhcnQpIDogZmFsc2UpLFxuICAgICAgICBpc0Z1dHVyZTogQm9vbGVhbihub3dEYXRlID8gKGRhdGUgPiBub3dEYXRlKSA6IHRvZGF5UmFuZ2UgPyAoZGF0ZSA+PSB0b2RheVJhbmdlLmVuZCkgOiBmYWxzZSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldERheUNsYXNzTmFtZXMobWV0YSwgdGhlbWUpIHtcbiAgICBsZXQgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgJ2ZjLWRheScsXG4gICAgICAgIGBmYy1kYXktJHtEQVlfSURTW21ldGEuZG93XX1gLFxuICAgIF07XG4gICAgaWYgKG1ldGEuaXNEaXNhYmxlZCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS1kaXNhYmxlZCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1ldGEuaXNUb2RheSkge1xuICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1kYXktdG9kYXknKTtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCh0aGVtZS5nZXRDbGFzcygndG9kYXknKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEuaXNQYXN0KSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWRheS1wYXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEuaXNGdXR1cmUpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LWZ1dHVyZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzT3RoZXIpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZGF5LW90aGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5mdW5jdGlvbiBnZXRTbG90Q2xhc3NOYW1lcyhtZXRhLCB0aGVtZSkge1xuICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtc2xvdCcsXG4gICAgICAgIGBmYy1zbG90LSR7REFZX0lEU1ttZXRhLmRvd119YCxcbiAgICBdO1xuICAgIGlmIChtZXRhLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zbG90LWRpc2FibGVkJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobWV0YS5pc1RvZGF5KSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNsb3QtdG9kYXknKTtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCh0aGVtZS5nZXRDbGFzcygndG9kYXknKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEuaXNQYXN0KSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNsb3QtcGFzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRhLmlzRnV0dXJlKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNsb3QtZnV0dXJlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5cbmNvbnN0IERBWV9GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyB5ZWFyOiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycsIGRheTogJ251bWVyaWMnIH0pO1xuY29uc3QgV0VFS19GT1JNQVQgPSBjcmVhdGVGb3JtYXR0ZXIoeyB3ZWVrOiAnbG9uZycgfSk7XG5mdW5jdGlvbiBidWlsZE5hdkxpbmtBdHRycyhjb250ZXh0LCBkYXRlTWFya2VyLCB2aWV3VHlwZSA9ICdkYXknLCBpc1RhYmJhYmxlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHsgZGF0ZUVudiwgb3B0aW9ucywgY2FsZW5kYXJBcGkgfSA9IGNvbnRleHQ7XG4gICAgbGV0IGRhdGVTdHIgPSBkYXRlRW52LmZvcm1hdChkYXRlTWFya2VyLCB2aWV3VHlwZSA9PT0gJ3dlZWsnID8gV0VFS19GT1JNQVQgOiBEQVlfRk9STUFUKTtcbiAgICBpZiAob3B0aW9ucy5uYXZMaW5rcykge1xuICAgICAgICBsZXQgem9uZWREYXRlID0gZGF0ZUVudi50b0RhdGUoZGF0ZU1hcmtlcik7XG4gICAgICAgIGNvbnN0IGhhbmRsZUludGVyYWN0aW9uID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgY3VzdG9tQWN0aW9uID0gdmlld1R5cGUgPT09ICdkYXknID8gb3B0aW9ucy5uYXZMaW5rRGF5Q2xpY2sgOlxuICAgICAgICAgICAgICAgIHZpZXdUeXBlID09PSAnd2VlaycgPyBvcHRpb25zLm5hdkxpbmtXZWVrQ2xpY2sgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXN0b21BY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjdXN0b21BY3Rpb24uY2FsbChjYWxlbmRhckFwaSwgZGF0ZUVudi50b0RhdGUoZGF0ZU1hcmtlciksIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VzdG9tQWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB2aWV3VHlwZSA9IGN1c3RvbUFjdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJBcGkuem9vbVRvKGRhdGVNYXJrZXIsIHZpZXdUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyB0aXRsZTogZm9ybWF0V2l0aE9yZGluYWxzKG9wdGlvbnMubmF2TGlua0hpbnQsIFtkYXRlU3RyLCB6b25lZERhdGVdLCBkYXRlU3RyKSwgJ2RhdGEtbmF2bGluayc6ICcnIH0sIChpc1RhYmJhYmxlXG4gICAgICAgICAgICA/IGNyZWF0ZUFyaWFDbGlja0F0dHJzKGhhbmRsZUludGVyYWN0aW9uKVxuICAgICAgICAgICAgOiB7IG9uQ2xpY2s6IGhhbmRsZUludGVyYWN0aW9uIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgJ2FyaWEtbGFiZWwnOiBkYXRlU3RyIH07XG59XG5cbmxldCBfaXNSdGxTY3JvbGxiYXJPbkxlZnQgPSBudWxsO1xuZnVuY3Rpb24gZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQoKSB7XG4gICAgaWYgKF9pc1J0bFNjcm9sbGJhck9uTGVmdCA9PT0gbnVsbCkge1xuICAgICAgICBfaXNSdGxTY3JvbGxiYXJPbkxlZnQgPSBjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQoKTtcbiAgICB9XG4gICAgcmV0dXJuIF9pc1J0bFNjcm9sbGJhck9uTGVmdDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVJc1J0bFNjcm9sbGJhck9uTGVmdCgpIHtcbiAgICBsZXQgb3V0ZXJFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGFwcGx5U3R5bGUob3V0ZXJFbCwge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgdG9wOiAtMTAwMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICBvdmVyZmxvdzogJ3Njcm9sbCcsXG4gICAgICAgIGRpcmVjdGlvbjogJ3J0bCcsXG4gICAgfSk7XG4gICAgb3V0ZXJFbC5pbm5lckhUTUwgPSAnPGRpdj48L2Rpdj4nO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXJFbCk7XG4gICAgbGV0IGlubmVyRWwgPSBvdXRlckVsLmZpcnN0Q2hpbGQ7XG4gICAgbGV0IHJlcyA9IGlubmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA+IG91dGVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICByZW1vdmVFbGVtZW50KG91dGVyRWwpO1xuICAgIHJldHVybiByZXM7XG59XG5cbmxldCBfc2Nyb2xsYmFyV2lkdGhzO1xuZnVuY3Rpb24gZ2V0U2Nyb2xsYmFyV2lkdGhzKCkge1xuICAgIGlmICghX3Njcm9sbGJhcldpZHRocykge1xuICAgICAgICBfc2Nyb2xsYmFyV2lkdGhzID0gY29tcHV0ZVNjcm9sbGJhcldpZHRocygpO1xuICAgIH1cbiAgICByZXR1cm4gX3Njcm9sbGJhcldpZHRocztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVTY3JvbGxiYXJXaWR0aHMoKSB7XG4gICAgbGV0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWwuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBlbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgZWwuc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgIGVsLnN0eWxlLmxlZnQgPSAnLTk5OTlweCc7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbCk7XG4gICAgbGV0IHJlcyA9IGNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbChlbCk7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8vIFdBUk5JTkc6IHdpbGwgaW5jbHVkZSBib3JkZXJcbmZ1bmN0aW9uIGNvbXB1dGVTY3JvbGxiYXJXaWR0aHNGb3JFbChlbCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGVsLm9mZnNldEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCxcbiAgICAgICAgeTogZWwub2Zmc2V0V2lkdGggLSBlbC5jbGllbnRXaWR0aCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRWRnZXMoZWwsIGdldFBhZGRpbmcgPSBmYWxzZSkge1xuICAgIGxldCBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgIGxldCBib3JkZXJMZWZ0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsIDEwKSB8fCAwO1xuICAgIGxldCBib3JkZXJSaWdodCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyUmlnaHRXaWR0aCwgMTApIHx8IDA7XG4gICAgbGV0IGJvcmRlclRvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwKSB8fCAwO1xuICAgIGxldCBib3JkZXJCb3R0b20gPSBwYXJzZUludChjb21wdXRlZFN0eWxlLmJvcmRlckJvdHRvbVdpZHRoLCAxMCkgfHwgMDtcbiAgICBsZXQgYmFkU2Nyb2xsYmFyV2lkdGhzID0gY29tcHV0ZVNjcm9sbGJhcldpZHRoc0ZvckVsKGVsKTsgLy8gaW5jbHVkZXMgYm9yZGVyIVxuICAgIGxldCBzY3JvbGxiYXJMZWZ0UmlnaHQgPSBiYWRTY3JvbGxiYXJXaWR0aHMueSAtIGJvcmRlckxlZnQgLSBib3JkZXJSaWdodDtcbiAgICBsZXQgc2Nyb2xsYmFyQm90dG9tID0gYmFkU2Nyb2xsYmFyV2lkdGhzLnggLSBib3JkZXJUb3AgLSBib3JkZXJCb3R0b207XG4gICAgbGV0IHJlcyA9IHtcbiAgICAgICAgYm9yZGVyTGVmdCxcbiAgICAgICAgYm9yZGVyUmlnaHQsXG4gICAgICAgIGJvcmRlclRvcCxcbiAgICAgICAgYm9yZGVyQm90dG9tLFxuICAgICAgICBzY3JvbGxiYXJCb3R0b20sXG4gICAgICAgIHNjcm9sbGJhckxlZnQ6IDAsXG4gICAgICAgIHNjcm9sbGJhclJpZ2h0OiAwLFxuICAgIH07XG4gICAgaWYgKGdldElzUnRsU2Nyb2xsYmFyT25MZWZ0KCkgJiYgY29tcHV0ZWRTdHlsZS5kaXJlY3Rpb24gPT09ICdydGwnKSB7IC8vIGlzIHRoZSBzY3JvbGxiYXIgb24gdGhlIGxlZnQgc2lkZT9cbiAgICAgICAgcmVzLnNjcm9sbGJhckxlZnQgPSBzY3JvbGxiYXJMZWZ0UmlnaHQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXMuc2Nyb2xsYmFyUmlnaHQgPSBzY3JvbGxiYXJMZWZ0UmlnaHQ7XG4gICAgfVxuICAgIGlmIChnZXRQYWRkaW5nKSB7XG4gICAgICAgIHJlcy5wYWRkaW5nTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ0xlZnQsIDEwKSB8fCAwO1xuICAgICAgICByZXMucGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nUmlnaHQsIDEwKSB8fCAwO1xuICAgICAgICByZXMucGFkZGluZ1RvcCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCwgMTApIHx8IDA7XG4gICAgICAgIHJlcy5wYWRkaW5nQm90dG9tID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tLCAxMCkgfHwgMDtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVJbm5lclJlY3QoZWwsIGdvV2l0aGluUGFkZGluZyA9IGZhbHNlLCBkb0Zyb21XaW5kb3dWaWV3cG9ydCkge1xuICAgIGxldCBvdXRlclJlY3QgPSBkb0Zyb21XaW5kb3dWaWV3cG9ydCA/IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogY29tcHV0ZVJlY3QoZWwpO1xuICAgIGxldCBlZGdlcyA9IGNvbXB1dGVFZGdlcyhlbCwgZ29XaXRoaW5QYWRkaW5nKTtcbiAgICBsZXQgcmVzID0ge1xuICAgICAgICBsZWZ0OiBvdXRlclJlY3QubGVmdCArIGVkZ2VzLmJvcmRlckxlZnQgKyBlZGdlcy5zY3JvbGxiYXJMZWZ0LFxuICAgICAgICByaWdodDogb3V0ZXJSZWN0LnJpZ2h0IC0gZWRnZXMuYm9yZGVyUmlnaHQgLSBlZGdlcy5zY3JvbGxiYXJSaWdodCxcbiAgICAgICAgdG9wOiBvdXRlclJlY3QudG9wICsgZWRnZXMuYm9yZGVyVG9wLFxuICAgICAgICBib3R0b206IG91dGVyUmVjdC5ib3R0b20gLSBlZGdlcy5ib3JkZXJCb3R0b20gLSBlZGdlcy5zY3JvbGxiYXJCb3R0b20sXG4gICAgfTtcbiAgICBpZiAoZ29XaXRoaW5QYWRkaW5nKSB7XG4gICAgICAgIHJlcy5sZWZ0ICs9IGVkZ2VzLnBhZGRpbmdMZWZ0O1xuICAgICAgICByZXMucmlnaHQgLT0gZWRnZXMucGFkZGluZ1JpZ2h0O1xuICAgICAgICByZXMudG9wICs9IGVkZ2VzLnBhZGRpbmdUb3A7XG4gICAgICAgIHJlcy5ib3R0b20gLT0gZWRnZXMucGFkZGluZ0JvdHRvbTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNvbXB1dGVSZWN0KGVsKSB7XG4gICAgbGV0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBsZWZ0OiByZWN0LmxlZnQgKyB3aW5kb3cucGFnZVhPZmZzZXQsXG4gICAgICAgIHRvcDogcmVjdC50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQsXG4gICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LFxuICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgd2luZG93LnBhZ2VZT2Zmc2V0LFxuICAgIH07XG59XG5mdW5jdGlvbiBjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QoZWwpIHtcbiAgICBsZXQgY2xpcHBpbmdQYXJlbnRzID0gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsKTtcbiAgICBsZXQgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGZvciAobGV0IGNsaXBwaW5nUGFyZW50IG9mIGNsaXBwaW5nUGFyZW50cykge1xuICAgICAgICBsZXQgaW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0UmVjdHMocmVjdCwgY2xpcHBpbmdQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICBpZiAoaW50ZXJzZWN0aW9uKSB7XG4gICAgICAgICAgICByZWN0ID0gaW50ZXJzZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlY3Q7XG59XG4vLyBkb2VzIG5vdCByZXR1cm4gd2luZG93XG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWwpIHtcbiAgICBsZXQgcGFyZW50cyA9IFtdO1xuICAgIHdoaWxlIChlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7IC8vIHdpbGwgc3RvcCB3aGVuIGdldHMgdG8gZG9jdW1lbnQgb3IgbnVsbFxuICAgICAgICBsZXQgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKTtcbiAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoLyhhdXRvfHNjcm9sbCkvKS50ZXN0KGNvbXB1dGVkU3R5bGUub3ZlcmZsb3cgKyBjb21wdXRlZFN0eWxlLm92ZXJmbG93WSArIGNvbXB1dGVkU3R5bGUub3ZlcmZsb3dYKSkge1xuICAgICAgICAgICAgcGFyZW50cy5wdXNoKGVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbCA9IGVsLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRzO1xufVxuXG4vKlxuZ2l2ZW4gYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEgcmVzdWx0IGFzeW5jaHJvbm91c2x5LlxudGhlIGZ1bmN0aW9uIGNhbiBlaXRoZXIgY2FsbCBwYXNzZWQtaW4gc3VjY2VzcyBhbmQgZmFpbHVyZSBjYWxsYmFja3MsXG5vciBpdCBjYW4gcmV0dXJuIGEgcHJvbWlzZS5cbmlmIHlvdSBuZWVkIHRvIHBhc3MgYWRkaXRpb25hbCBwYXJhbXMgdG8gZnVuYywgYmluZCB0aGVtIGZpcnN0LlxuKi9cbmZ1bmN0aW9uIHVucHJvbWlzaWZ5KGZ1bmMsIG5vcm1hbGl6ZWRTdWNjZXNzQ2FsbGJhY2ssIG5vcm1hbGl6ZWRGYWlsdXJlQ2FsbGJhY2spIHtcbiAgICAvLyBndWFyZCBhZ2FpbnN0IHN1Y2Nlc3MvZmFpbHVyZSBjYWxsYmFja3MgYmVpbmcgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXG4gICAgLy8gYW5kIGd1YXJkIGFnYWluc3QgYSBwcm9taXNlIEFORCBjYWxsYmFjayBiZWluZyB1c2VkIHRvZ2V0aGVyLlxuICAgIGxldCBpc1Jlc29sdmVkID0gZmFsc2U7XG4gICAgbGV0IHdyYXBwZWRTdWNjZXNzID0gZnVuY3Rpb24gKHJlcykge1xuICAgICAgICBpZiAoIWlzUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIGlzUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbm9ybWFsaXplZFN1Y2Nlc3NDYWxsYmFjayhyZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgd3JhcHBlZEZhaWx1cmUgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc1Jlc29sdmVkKSB7XG4gICAgICAgICAgICBpc1Jlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRGYWlsdXJlQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBsZXQgcmVzID0gZnVuYyh3cmFwcGVkU3VjY2Vzcywgd3JhcHBlZEZhaWx1cmUpO1xuICAgIGlmIChyZXMgJiYgdHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlcy50aGVuKHdyYXBwZWRTdWNjZXNzLCB3cmFwcGVkRmFpbHVyZSk7XG4gICAgfVxufVxuXG5jbGFzcyBFbWl0dGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgICAgICB0aGlzLnRoaXNDb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgc2V0VGhpc0NvbnRleHQodGhpc0NvbnRleHQpIHtcbiAgICAgICAgdGhpcy50aGlzQ29udGV4dCA9IHRoaXNDb250ZXh0O1xuICAgIH1cbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgb24odHlwZSwgaGFuZGxlcikge1xuICAgICAgICBhZGRUb0hhc2godGhpcy5oYW5kbGVycywgdHlwZSwgaGFuZGxlcik7XG4gICAgfVxuICAgIG9mZih0eXBlLCBoYW5kbGVyKSB7XG4gICAgICAgIHJlbW92ZUZyb21IYXNoKHRoaXMuaGFuZGxlcnMsIHR5cGUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICB0cmlnZ2VyKHR5cGUsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IGF0dGFjaGVkSGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW3R5cGVdIHx8IFtdO1xuICAgICAgICBsZXQgb3B0aW9uSGFuZGxlciA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbdHlwZV07XG4gICAgICAgIGxldCBoYW5kbGVycyA9IFtdLmNvbmNhdChvcHRpb25IYW5kbGVyIHx8IFtdLCBhdHRhY2hlZEhhbmRsZXJzKTtcbiAgICAgICAgZm9yIChsZXQgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLnRoaXNDb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXNIYW5kbGVycyh0eXBlKSB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKCh0aGlzLmhhbmRsZXJzW3R5cGVdICYmIHRoaXMuaGFuZGxlcnNbdHlwZV0ubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbdHlwZV0pKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRUb0hhc2goaGFzaCwgdHlwZSwgaGFuZGxlcikge1xuICAgIChoYXNoW3R5cGVdIHx8IChoYXNoW3R5cGVdID0gW10pKVxuICAgICAgICAucHVzaChoYW5kbGVyKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUZyb21IYXNoKGhhc2gsIHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICBpZiAoaGFzaFt0eXBlXSkge1xuICAgICAgICAgICAgaGFzaFt0eXBlXSA9IGhhc2hbdHlwZV0uZmlsdGVyKChmdW5jKSA9PiBmdW5jICE9PSBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGhhc2hbdHlwZV07IC8vIHJlbW92ZSBhbGwgaGFuZGxlciBmdW5jcyBmb3IgdGhpcyB0eXBlXG4gICAgfVxufVxuXG4vKlxuUmVjb3JkcyBvZmZzZXQgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIGVsZW1lbnRzLCByZWxhdGl2ZSB0byBhbiBvcmlnaW4gZWxlbWVudC5cbkNhbiByZWNvcmQgdGhlIGxlZnQvcmlnaHQgT1IgdGhlIHRvcC9ib3R0b20gT1IgYm90aC5cblByb3ZpZGVzIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIHRoZSBjYWNoZSBieSBwb3NpdGlvbi5cbiovXG5jbGFzcyBQb3NpdGlvbkNhY2hlIHtcbiAgICBjb25zdHJ1Y3RvcihvcmlnaW5FbCwgZWxzLCBpc0hvcml6b250YWwsIGlzVmVydGljYWwpIHtcbiAgICAgICAgdGhpcy5lbHMgPSBlbHM7XG4gICAgICAgIGxldCBvcmlnaW5DbGllbnRSZWN0ID0gdGhpcy5vcmlnaW5DbGllbnRSZWN0ID0gb3JpZ2luRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIHJlbGF0aXZlIHRvIHZpZXdwb3J0IHRvcC1sZWZ0XG4gICAgICAgIGlmIChpc0hvcml6b250YWwpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRFbEhvcml6b250YWxzKG9yaWdpbkNsaWVudFJlY3QubGVmdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRFbFZlcnRpY2FscyhvcmlnaW5DbGllbnRSZWN0LnRvcCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUG9wdWxhdGVzIHRoZSBsZWZ0L3JpZ2h0IGludGVybmFsIGNvb3JkaW5hdGUgYXJyYXlzXG4gICAgYnVpbGRFbEhvcml6b250YWxzKG9yaWdpbkNsaWVudExlZnQpIHtcbiAgICAgICAgbGV0IGxlZnRzID0gW107XG4gICAgICAgIGxldCByaWdodHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZWwgb2YgdGhpcy5lbHMpIHtcbiAgICAgICAgICAgIGxldCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBsZWZ0cy5wdXNoKHJlY3QubGVmdCAtIG9yaWdpbkNsaWVudExlZnQpO1xuICAgICAgICAgICAgcmlnaHRzLnB1c2gocmVjdC5yaWdodCAtIG9yaWdpbkNsaWVudExlZnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVmdHMgPSBsZWZ0cztcbiAgICAgICAgdGhpcy5yaWdodHMgPSByaWdodHM7XG4gICAgfVxuICAgIC8vIFBvcHVsYXRlcyB0aGUgdG9wL2JvdHRvbSBpbnRlcm5hbCBjb29yZGluYXRlIGFycmF5c1xuICAgIGJ1aWxkRWxWZXJ0aWNhbHMob3JpZ2luQ2xpZW50VG9wKSB7XG4gICAgICAgIGxldCB0b3BzID0gW107XG4gICAgICAgIGxldCBib3R0b21zID0gW107XG4gICAgICAgIGZvciAobGV0IGVsIG9mIHRoaXMuZWxzKSB7XG4gICAgICAgICAgICBsZXQgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdG9wcy5wdXNoKHJlY3QudG9wIC0gb3JpZ2luQ2xpZW50VG9wKTtcbiAgICAgICAgICAgIGJvdHRvbXMucHVzaChyZWN0LmJvdHRvbSAtIG9yaWdpbkNsaWVudFRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b3BzID0gdG9wcztcbiAgICAgICAgdGhpcy5ib3R0b21zID0gYm90dG9tcztcbiAgICB9XG4gICAgLy8gR2l2ZW4gYSBsZWZ0IG9mZnNldCAoZnJvbSBkb2N1bWVudCBsZWZ0KSwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsIHRoYXQgaXQgaG9yaXpvbnRhbGx5IGludGVyc2VjdHMuXG4gICAgLy8gSWYgbm8gaW50ZXJzZWN0aW9uIGlzIG1hZGUsIHJldHVybnMgdW5kZWZpbmVkLlxuICAgIGxlZnRUb0luZGV4KGxlZnRQb3NpdGlvbikge1xuICAgICAgICBsZXQgeyBsZWZ0cywgcmlnaHRzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgbGVuID0gbGVmdHMubGVuZ3RoO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAobGVmdFBvc2l0aW9uID49IGxlZnRzW2ldICYmIGxlZnRQb3NpdGlvbiA8IHJpZ2h0c1tpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFRPRE86IGJldHRlclxuICAgIH1cbiAgICAvLyBHaXZlbiBhIHRvcCBvZmZzZXQgKGZyb20gZG9jdW1lbnQgdG9wKSwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGVsIHRoYXQgaXQgdmVydGljYWxseSBpbnRlcnNlY3RzLlxuICAgIC8vIElmIG5vIGludGVyc2VjdGlvbiBpcyBtYWRlLCByZXR1cm5zIHVuZGVmaW5lZC5cbiAgICB0b3BUb0luZGV4KHRvcFBvc2l0aW9uKSB7XG4gICAgICAgIGxldCB7IHRvcHMsIGJvdHRvbXMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBsZW4gPSB0b3BzLmxlbmd0aDtcbiAgICAgICAgbGV0IGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgaWYgKHRvcFBvc2l0aW9uID49IHRvcHNbaV0gJiYgdG9wUG9zaXRpb24gPCBib3R0b21zW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gVE9ETzogYmV0dGVyXG4gICAgfVxuICAgIC8vIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIGdldFdpZHRoKGxlZnRJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaWdodHNbbGVmdEluZGV4XSAtIHRoaXMubGVmdHNbbGVmdEluZGV4XTtcbiAgICB9XG4gICAgLy8gR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleFxuICAgIGdldEhlaWdodCh0b3BJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ib3R0b21zW3RvcEluZGV4XSAtIHRoaXMudG9wc1t0b3BJbmRleF07XG4gICAgfVxuICAgIHNpbWlsYXJUbyhvdGhlckNhY2hlKSB7XG4gICAgICAgIHJldHVybiBzaW1pbGFyTnVtQXJyYXlzKHRoaXMudG9wcyB8fCBbXSwgb3RoZXJDYWNoZS50b3BzIHx8IFtdKSAmJlxuICAgICAgICAgICAgc2ltaWxhck51bUFycmF5cyh0aGlzLmJvdHRvbXMgfHwgW10sIG90aGVyQ2FjaGUuYm90dG9tcyB8fCBbXSkgJiZcbiAgICAgICAgICAgIHNpbWlsYXJOdW1BcnJheXModGhpcy5sZWZ0cyB8fCBbXSwgb3RoZXJDYWNoZS5sZWZ0cyB8fCBbXSkgJiZcbiAgICAgICAgICAgIHNpbWlsYXJOdW1BcnJheXModGhpcy5yaWdodHMgfHwgW10sIG90aGVyQ2FjaGUucmlnaHRzIHx8IFtdKTtcbiAgICB9XG59XG5mdW5jdGlvbiBzaW1pbGFyTnVtQXJyYXlzKGEsIGIpIHtcbiAgICBjb25zdCBsZW4gPSBhLmxlbmd0aDtcbiAgICBpZiAobGVuICE9PSBiLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKE1hdGgucm91bmQoYVtpXSkgIT09IE1hdGgucm91bmQoYltpXSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBcIm9mZlwiICovXG4vKlxuQW4gb2JqZWN0IGZvciBnZXR0aW5nL3NldHRpbmcgc2Nyb2xsLXJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuXG5JbnRlcm5hbGx5LCB0aGlzIGlzIGRvbmUgdmVyeSBkaWZmZXJlbnRseSBmb3Igd2luZG93IHZlcnN1cyBET00gZWxlbWVudCxcbnNvIHRoaXMgb2JqZWN0IHNlcnZlcyBhcyBhIGNvbW1vbiBpbnRlcmZhY2UuXG4qL1xuY2xhc3MgU2Nyb2xsQ29udHJvbGxlciB7XG4gICAgZ2V0TWF4U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxIZWlnaHQoKSAtIHRoaXMuZ2V0Q2xpZW50SGVpZ2h0KCk7XG4gICAgfVxuICAgIGdldE1heFNjcm9sbExlZnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbFdpZHRoKCkgLSB0aGlzLmdldENsaWVudFdpZHRoKCk7XG4gICAgfVxuICAgIGNhblNjcm9sbFZlcnRpY2FsbHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE1heFNjcm9sbFRvcCgpID4gMDtcbiAgICB9XG4gICAgY2FuU2Nyb2xsSG9yaXpvbnRhbGx5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNYXhTY3JvbGxMZWZ0KCkgPiAwO1xuICAgIH1cbiAgICBjYW5TY3JvbGxVcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2Nyb2xsVG9wKCkgPiAwO1xuICAgIH1cbiAgICBjYW5TY3JvbGxEb3duKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxUb3AoKSA8IHRoaXMuZ2V0TWF4U2Nyb2xsVG9wKCk7XG4gICAgfVxuICAgIGNhblNjcm9sbExlZnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFNjcm9sbExlZnQoKSA+IDA7XG4gICAgfVxuICAgIGNhblNjcm9sbFJpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTY3JvbGxMZWZ0KCkgPCB0aGlzLmdldE1heFNjcm9sbExlZnQoKTtcbiAgICB9XG59XG5jbGFzcyBFbGVtZW50U2Nyb2xsQ29udHJvbGxlciBleHRlbmRzIFNjcm9sbENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsVG9wKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbC5zY3JvbGxUb3A7XG4gICAgfVxuICAgIGdldFNjcm9sbExlZnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLnNjcm9sbExlZnQ7XG4gICAgfVxuICAgIHNldFNjcm9sbFRvcCh0b3ApIHtcbiAgICAgICAgdGhpcy5lbC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgfVxuICAgIHNldFNjcm9sbExlZnQobGVmdCkge1xuICAgICAgICB0aGlzLmVsLnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgIH1cbiAgICBnZXRTY3JvbGxXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc2Nyb2xsV2lkdGg7XG4gICAgfVxuICAgIGdldFNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWwuc2Nyb2xsSGVpZ2h0O1xuICAgIH1cbiAgICBnZXRDbGllbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgZ2V0Q2xpZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsLmNsaWVudFdpZHRoO1xuICAgIH1cbn1cbmNsYXNzIFdpbmRvd1Njcm9sbENvbnRyb2xsZXIgZXh0ZW5kcyBTY3JvbGxDb250cm9sbGVyIHtcbiAgICBnZXRTY3JvbGxUb3AoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgfVxuICAgIGdldFNjcm9sbExlZnQoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgfVxuICAgIHNldFNjcm9sbFRvcChuKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGwod2luZG93LnBhZ2VYT2Zmc2V0LCBuKTtcbiAgICB9XG4gICAgc2V0U2Nyb2xsTGVmdChuKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGwobiwgd2luZG93LnBhZ2VZT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgfVxuICAgIGdldFNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGdldENsaWVudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGdldENsaWVudFdpZHRoKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIH1cbn1cblxuY2xhc3MgVGhlbWUge1xuICAgIGNvbnN0cnVjdG9yKGNhbGVuZGFyT3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5pY29uT3ZlcnJpZGVPcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SWNvbk92ZXJyaWRlKGNhbGVuZGFyT3B0aW9uc1t0aGlzLmljb25PdmVycmlkZU9wdGlvbl0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldEljb25PdmVycmlkZShpY29uT3ZlcnJpZGVIYXNoKSB7XG4gICAgICAgIGxldCBpY29uQ2xhc3Nlc0NvcHk7XG4gICAgICAgIGxldCBidXR0b25OYW1lO1xuICAgICAgICBpZiAodHlwZW9mIGljb25PdmVycmlkZUhhc2ggPT09ICdvYmplY3QnICYmIGljb25PdmVycmlkZUhhc2gpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgICAgICBpY29uQ2xhc3Nlc0NvcHkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmljb25DbGFzc2VzKTtcbiAgICAgICAgICAgIGZvciAoYnV0dG9uTmFtZSBpbiBpY29uT3ZlcnJpZGVIYXNoKSB7XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzZXNDb3B5W2J1dHRvbk5hbWVdID0gdGhpcy5hcHBseUljb25PdmVycmlkZVByZWZpeChpY29uT3ZlcnJpZGVIYXNoW2J1dHRvbk5hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSBpY29uQ2xhc3Nlc0NvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaWNvbk92ZXJyaWRlSGFzaCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuaWNvbkNsYXNzZXMgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhcHBseUljb25PdmVycmlkZVByZWZpeChjbGFzc05hbWUpIHtcbiAgICAgICAgbGV0IHByZWZpeCA9IHRoaXMuaWNvbk92ZXJyaWRlUHJlZml4O1xuICAgICAgICBpZiAocHJlZml4ICYmIGNsYXNzTmFtZS5pbmRleE9mKHByZWZpeCkgIT09IDApIHsgLy8gaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgY2xhc3NOYW1lID0gcHJlZml4ICsgY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc05hbWU7XG4gICAgfVxuICAgIGdldENsYXNzKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc2VzW2tleV0gfHwgJyc7XG4gICAgfVxuICAgIGdldEljb25DbGFzcyhidXR0b25OYW1lLCBpc1J0bCkge1xuICAgICAgICBsZXQgY2xhc3NOYW1lO1xuICAgICAgICBpZiAoaXNSdGwgJiYgdGhpcy5ydGxJY29uQ2xhc3Nlcykge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5ydGxJY29uQ2xhc3Nlc1tidXR0b25OYW1lXSB8fCB0aGlzLmljb25DbGFzc2VzW2J1dHRvbk5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gdGhpcy5pY29uQ2xhc3Nlc1tidXR0b25OYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5iYXNlSWNvbkNsYXNzfSAke2NsYXNzTmFtZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZ2V0Q3VzdG9tQnV0dG9uSWNvbkNsYXNzKGN1c3RvbUJ1dHRvblByb3BzKSB7XG4gICAgICAgIGxldCBjbGFzc05hbWU7XG4gICAgICAgIGlmICh0aGlzLmljb25PdmVycmlkZUN1c3RvbUJ1dHRvbk9wdGlvbikge1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gY3VzdG9tQnV0dG9uUHJvcHNbdGhpcy5pY29uT3ZlcnJpZGVDdXN0b21CdXR0b25PcHRpb25dO1xuICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmJhc2VJY29uQ2xhc3N9ICR7dGhpcy5hcHBseUljb25PdmVycmlkZVByZWZpeChjbGFzc05hbWUpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbn1cblRoZW1lLnByb3RvdHlwZS5jbGFzc2VzID0ge307XG5UaGVtZS5wcm90b3R5cGUuaWNvbkNsYXNzZXMgPSB7fTtcblRoZW1lLnByb3RvdHlwZS5iYXNlSWNvbkNsYXNzID0gJyc7XG5UaGVtZS5wcm90b3R5cGUuaWNvbk92ZXJyaWRlUHJlZml4ID0gJyc7XG5cbi8qXG5OT1RFOiB0aGlzIGNhbiBiZSBhIHB1YmxpYyBBUEksIGVzcGVjaWFsbHkgY3JlYXRlRWxlbWVudCBmb3IgaG9va3MuXG5TZWUgZXhhbXBsZXMvdHlwZXNjcmlwdC1zY2hlZHVsZXIvc3JjL2luZGV4LnRzXG4qL1xuZnVuY3Rpb24gZmx1c2hTeW5jKHJ1bkJlZm9yZUZsdXNoKSB7XG4gICAgcnVuQmVmb3JlRmx1c2goKTtcbiAgICBsZXQgb2xkRGVib3VuY2VSZW5kZXJpbmcgPSBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nOyAvLyBvcmlnXG4gICAgbGV0IGNhbGxiYWNrUSA9IFtdO1xuICAgIGZ1bmN0aW9uIGV4ZWNDYWxsYmFja1N5bmMoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2tRLnB1c2goY2FsbGJhY2spO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gZXhlY0NhbGxiYWNrU3luYztcbiAgICBwcmVhY3RfX25hbWVzcGFjZS5yZW5kZXIocHJlYWN0X19uYW1lc3BhY2UuY3JlYXRlRWxlbWVudChGYWtlQ29tcG9uZW50LCB7fSksIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcbiAgICB3aGlsZSAoY2FsbGJhY2tRLmxlbmd0aCkge1xuICAgICAgICBjYWxsYmFja1Euc2hpZnQoKSgpO1xuICAgIH1cbiAgICBwcmVhY3RfX25hbWVzcGFjZS5vcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nID0gb2xkRGVib3VuY2VSZW5kZXJpbmc7XG59XG5jbGFzcyBGYWtlQ29tcG9uZW50IGV4dGVuZHMgcHJlYWN0X19uYW1lc3BhY2UuQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7IHJldHVybiBwcmVhY3RfX25hbWVzcGFjZS5jcmVhdGVFbGVtZW50KCdkaXYnLCB7fSk7IH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHsgdGhpcy5zZXRTdGF0ZSh7fSk7IH1cbn1cbi8vIFRPRE86IHVzZSBwcmVhY3QvY29tcGF0IGluc3RlYWQ/XG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSkge1xuICAgIGxldCBDb250ZXh0VHlwZSA9IHByZWFjdF9fbmFtZXNwYWNlLmNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlKTtcbiAgICBsZXQgb3JpZ1Byb3ZpZGVyID0gQ29udGV4dFR5cGUuUHJvdmlkZXI7XG4gICAgQ29udGV4dFR5cGUuUHJvdmlkZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxldCBpc05ldyA9ICF0aGlzLmdldENoaWxkQ29udGV4dDtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gb3JpZ1Byb3ZpZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgICAgbGV0IHN1YnMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gKF9wcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnZhbHVlICE9PSBfcHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vicy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnN1YiA9IChjKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vicy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIGxldCBvbGQgPSBjLmNvbXBvbmVudFdpbGxVbm1vdW50O1xuICAgICAgICAgICAgICAgIGMuY29tcG9uZW50V2lsbFVubW91bnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnMuc3BsaWNlKHN1YnMuaW5kZXhPZihjKSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIG9sZCAmJiBvbGQuY2FsbChjKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgfTtcbiAgICByZXR1cm4gQ29udGV4dFR5cGU7XG59XG5cbmNsYXNzIFNjcm9sbFJlc3BvbmRlciB7XG4gICAgY29uc3RydWN0b3IoZXhlY0Z1bmMsIGVtaXR0ZXIsIHNjcm9sbFRpbWUsIHNjcm9sbFRpbWVSZXNldCkge1xuICAgICAgICB0aGlzLmV4ZWNGdW5jID0gZXhlY0Z1bmM7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IGVtaXR0ZXI7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGltZSA9IHNjcm9sbFRpbWU7XG4gICAgICAgIHRoaXMuc2Nyb2xsVGltZVJlc2V0ID0gc2Nyb2xsVGltZVJlc2V0O1xuICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3QgPSAocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZWRSZXF1ZXN0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5xdWV1ZWRSZXF1ZXN0IHx8IHt9LCByZXF1ZXN0KTtcbiAgICAgICAgICAgIHRoaXMuZHJhaW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgZW1pdHRlci5vbignX3Njcm9sbFJlcXVlc3QnLCB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3QpO1xuICAgICAgICB0aGlzLmZpcmVJbml0aWFsU2Nyb2xsKCk7XG4gICAgfVxuICAgIGRldGFjaCgpIHtcbiAgICAgICAgdGhpcy5lbWl0dGVyLm9mZignX3Njcm9sbFJlcXVlc3QnLCB0aGlzLmhhbmRsZVNjcm9sbFJlcXVlc3QpO1xuICAgIH1cbiAgICB1cGRhdGUoaXNEYXRlc05ldykge1xuICAgICAgICBpZiAoaXNEYXRlc05ldyAmJiB0aGlzLnNjcm9sbFRpbWVSZXNldCkge1xuICAgICAgICAgICAgdGhpcy5maXJlSW5pdGlhbFNjcm9sbCgpOyAvLyB3aWxsIGRyYWluXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRyYWluKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmlyZUluaXRpYWxTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsUmVxdWVzdCh7XG4gICAgICAgICAgICB0aW1lOiB0aGlzLnNjcm9sbFRpbWUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkcmFpbigpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVkUmVxdWVzdCAmJiB0aGlzLmV4ZWNGdW5jKHRoaXMucXVldWVkUmVxdWVzdCkpIHtcbiAgICAgICAgICAgIHRoaXMucXVldWVkUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmNvbnN0IFZpZXdDb250ZXh0VHlwZSA9IGNyZWF0ZUNvbnRleHQoe30pOyAvLyBmb3IgQ29tcG9uZW50c1xuZnVuY3Rpb24gYnVpbGRWaWV3Q29udGV4dCh2aWV3U3BlYywgdmlld0FwaSwgdmlld09wdGlvbnMsIGRhdGVQcm9maWxlR2VuZXJhdG9yLCBkYXRlRW52LCB0aGVtZSwgcGx1Z2luSG9va3MsIGRpc3BhdGNoLCBnZXRDdXJyZW50RGF0YSwgZW1pdHRlciwgY2FsZW5kYXJBcGksIHJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsIHVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGVFbnYsXG4gICAgICAgIG9wdGlvbnM6IHZpZXdPcHRpb25zLFxuICAgICAgICBwbHVnaW5Ib29rcyxcbiAgICAgICAgZW1pdHRlcixcbiAgICAgICAgZGlzcGF0Y2gsXG4gICAgICAgIGdldEN1cnJlbnREYXRhLFxuICAgICAgICBjYWxlbmRhckFwaSxcbiAgICAgICAgdmlld1NwZWMsXG4gICAgICAgIHZpZXdBcGksXG4gICAgICAgIGRhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB0aGVtZSxcbiAgICAgICAgaXNSdGw6IHZpZXdPcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3J0bCcsXG4gICAgICAgIGFkZFJlc2l6ZUhhbmRsZXIoaGFuZGxlcikge1xuICAgICAgICAgICAgZW1pdHRlci5vbignX3Jlc2l6ZScsIGhhbmRsZXIpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmVSZXNpemVIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGVtaXR0ZXIub2ZmKCdfcmVzaXplJywgaGFuZGxlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVNjcm9sbFJlc3BvbmRlcihleGVjRnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTY3JvbGxSZXNwb25kZXIoZXhlY0Z1bmMsIGVtaXR0ZXIsIGNyZWF0ZUR1cmF0aW9uKHZpZXdPcHRpb25zLnNjcm9sbFRpbWUpLCB2aWV3T3B0aW9ucy5zY3JvbGxUaW1lUmVzZXQpO1xuICAgICAgICB9LFxuICAgICAgICByZWdpc3RlckludGVyYWN0aXZlQ29tcG9uZW50LFxuICAgICAgICB1bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQsXG4gICAgfTtcbn1cblxuLyogZXNsaW50IG1heC1jbGFzc2VzLXBlci1maWxlOiBvZmYgKi9cbmNsYXNzIFB1cmVDb21wb25lbnQgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50IHtcbiAgICBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhnZXRVbmVxdWFsUHJvcHMobmV4dFByb3BzLCB0aGlzLnByb3BzKSwgZ2V0VW5lcXVhbFByb3BzKG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhY29tcGFyZU9ianModGhpcy5wcm9wcywgbmV4dFByb3BzLCB0aGlzLnByb3BFcXVhbGl0eSkgfHxcbiAgICAgICAgICAgICFjb21wYXJlT2Jqcyh0aGlzLnN0YXRlLCBuZXh0U3RhdGUsIHRoaXMuc3RhdGVFcXVhbGl0eSk7XG4gICAgfVxuICAgIC8vIEhBQ0sgZm9yIGZyZWFraW4nIFJlYWN0IFN0cmljdE1vZGVcbiAgICBzYWZlU2V0U3RhdGUobmV3U3RhdGUpIHtcbiAgICAgICAgaWYgKCFjb21wYXJlT2Jqcyh0aGlzLnN0YXRlLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUpLCBuZXdTdGF0ZSksIHRoaXMuc3RhdGVFcXVhbGl0eSkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuUHVyZUNvbXBvbmVudC5hZGRQcm9wc0VxdWFsaXR5ID0gYWRkUHJvcHNFcXVhbGl0eTtcblB1cmVDb21wb25lbnQuYWRkU3RhdGVFcXVhbGl0eSA9IGFkZFN0YXRlRXF1YWxpdHk7XG5QdXJlQ29tcG9uZW50LmNvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuUHVyZUNvbXBvbmVudC5wcm90b3R5cGUucHJvcEVxdWFsaXR5ID0ge307XG5QdXJlQ29tcG9uZW50LnByb3RvdHlwZS5zdGF0ZUVxdWFsaXR5ID0ge307XG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgUHVyZUNvbXBvbmVudCB7XG59XG5CYXNlQ29tcG9uZW50LmNvbnRleHRUeXBlID0gVmlld0NvbnRleHRUeXBlO1xuZnVuY3Rpb24gYWRkUHJvcHNFcXVhbGl0eShwcm9wRXF1YWxpdHkpIHtcbiAgICBsZXQgaGFzaCA9IE9iamVjdC5jcmVhdGUodGhpcy5wcm90b3R5cGUucHJvcEVxdWFsaXR5KTtcbiAgICBPYmplY3QuYXNzaWduKGhhc2gsIHByb3BFcXVhbGl0eSk7XG4gICAgdGhpcy5wcm90b3R5cGUucHJvcEVxdWFsaXR5ID0gaGFzaDtcbn1cbmZ1bmN0aW9uIGFkZFN0YXRlRXF1YWxpdHkoc3RhdGVFcXVhbGl0eSkge1xuICAgIGxldCBoYXNoID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnByb3RvdHlwZS5zdGF0ZUVxdWFsaXR5KTtcbiAgICBPYmplY3QuYXNzaWduKGhhc2gsIHN0YXRlRXF1YWxpdHkpO1xuICAgIHRoaXMucHJvdG90eXBlLnN0YXRlRXF1YWxpdHkgPSBoYXNoO1xufVxuLy8gdXNlIG90aGVyIG9uZVxuZnVuY3Rpb24gc2V0UmVmKHJlZiwgY3VycmVudCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlZihjdXJyZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVmKSB7XG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMDI5XG4gICAgICAgIHJlZi5jdXJyZW50ID0gY3VycmVudDtcbiAgICB9XG59XG5cbi8qXG5hbiBJTlRFUkFDVEFCTEUgZGF0ZSBjb21wb25lbnRcblxuUFVSUE9TRVM6XG4tIGhvb2sgdXAgdG8gZmcsIGZpbGwsIGFuZCBtaXJyb3IgcmVuZGVyZXJzXG4tIGludGVyZmFjZSBmb3IgZHJhZ2dpbmcgYW5kIGhpdHNcbiovXG5jbGFzcyBEYXRlQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudWlkID0gZ3VpZCgpO1xuICAgIH1cbiAgICAvLyBIaXQgU3lzdGVtXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBwcmVwYXJlSGl0cygpIHtcbiAgICB9XG4gICAgcXVlcnlIaXQocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7IC8vIHRoaXMgc2hvdWxkIGJlIGFic3RyYWN0XG4gICAgfVxuICAgIC8vIFBvaW50ZXIgSW50ZXJhY3Rpb24gVXRpbHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGlzVmFsaWRTZWdEb3duRWwoZWwpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnByb3BzLmV2ZW50RHJhZyAmJiAvLyBIQUNLXG4gICAgICAgICAgICAhdGhpcy5wcm9wcy5ldmVudFJlc2l6ZSAmJiAvLyBIQUNLXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtZXZlbnQtbWlycm9yJyk7XG4gICAgfVxuICAgIGlzVmFsaWREYXRlRG93bkVsKGVsKSB7XG4gICAgICAgIHJldHVybiAhZWxlbWVudENsb3Nlc3QoZWwsICcuZmMtZXZlbnQ6bm90KC5mYy1iZy1ldmVudCknKSAmJlxuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLW1vcmUtbGluaycpICYmIC8vIGEgXCJtb3JlLi5cIiBsaW5rXG4gICAgICAgICAgICAhZWxlbWVudENsb3Nlc3QoZWwsICdhW2RhdGEtbmF2bGlua10nKSAmJiAvLyBhIGNsaWNrYWJsZSBuYXYgbGlua1xuICAgICAgICAgICAgIWVsZW1lbnRDbG9zZXN0KGVsLCAnLmZjLXBvcG92ZXInKTsgLy8gaGFja1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVkdWNlQ3VycmVudERhdGUoY3VycmVudERhdGUsIGFjdGlvbikge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5kYXRlTWFya2VyO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnREYXRlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEluaXRpYWxEYXRlKG9wdGlvbnMsIGRhdGVFbnYpIHtcbiAgICBsZXQgaW5pdGlhbERhdGVJbnB1dCA9IG9wdGlvbnMuaW5pdGlhbERhdGU7XG4gICAgLy8gY29tcHV0ZSB0aGUgaW5pdGlhbCBhbWJpZy10aW1lem9uZSBkYXRlXG4gICAgaWYgKGluaXRpYWxEYXRlSW5wdXQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVNYXJrZXIoaW5pdGlhbERhdGVJbnB1dCk7XG4gICAgfVxuICAgIHJldHVybiBnZXROb3cob3B0aW9ucy5ub3csIGRhdGVFbnYpOyAvLyBnZXROb3cgYWxyZWFkeSByZXR1cm5zIHVuem9uZWRcbn1cbmZ1bmN0aW9uIGdldE5vdyhub3dJbnB1dCwgZGF0ZUVudikge1xuICAgIGlmICh0eXBlb2Ygbm93SW5wdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbm93SW5wdXQgPSBub3dJbnB1dCgpO1xuICAgIH1cbiAgICBpZiAobm93SW5wdXQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZGF0ZUVudi5jcmVhdGVOb3dNYXJrZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVFbnYuY3JlYXRlTWFya2VyKG5vd0lucHV0KTtcbn1cblxuY2xhc3MgRGF0ZVByb2ZpbGVHZW5lcmF0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICAgICAgdGhpcy5ub3dEYXRlID0gZ2V0Tm93KHByb3BzLm5vd0lucHV0LCBwcm9wcy5kYXRlRW52KTtcbiAgICAgICAgdGhpcy5pbml0SGlkZGVuRGF5cygpO1xuICAgIH1cbiAgICAvKiBEYXRlIFJhbmdlIENvbXB1dGF0aW9uXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgICAvLyBCdWlsZHMgYSBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGFib3V0IHdoYXQgdGhlIGRhdGVzL3JhbmdlcyB3aWxsIGJlIGZvciB0aGUgXCJwcmV2XCIgdmlldy5cbiAgICBidWlsZFByZXYoY3VycmVudERhdGVQcm9maWxlLCBjdXJyZW50RGF0ZSwgZm9yY2VUb1ZhbGlkKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBwcmV2RGF0ZSA9IGRhdGVFbnYuc3VidHJhY3QoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChwcmV2RGF0ZSwgLTEsIGZvcmNlVG9WYWxpZCk7XG4gICAgfVxuICAgIC8vIEJ1aWxkcyBhIHN0cnVjdHVyZSB3aXRoIGluZm8gYWJvdXQgd2hhdCB0aGUgZGF0ZXMvcmFuZ2VzIHdpbGwgYmUgZm9yIHRoZSBcIm5leHRcIiB2aWV3LlxuICAgIGJ1aWxkTmV4dChjdXJyZW50RGF0ZVByb2ZpbGUsIGN1cnJlbnREYXRlLCBmb3JjZVRvVmFsaWQpIHtcbiAgICAgICAgbGV0IHsgZGF0ZUVudiB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IG5leHREYXRlID0gZGF0ZUVudi5hZGQoZGF0ZUVudi5zdGFydE9mKGN1cnJlbnREYXRlLCBjdXJyZW50RGF0ZVByb2ZpbGUuY3VycmVudFJhbmdlVW5pdCksIC8vIGltcG9ydGFudCBmb3Igc3RhcnQtb2YtbW9udGhcbiAgICAgICAgY3VycmVudERhdGVQcm9maWxlLmRhdGVJbmNyZW1lbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWlsZChuZXh0RGF0ZSwgMSwgZm9yY2VUb1ZhbGlkKTtcbiAgICB9XG4gICAgLy8gQnVpbGRzIGEgc3RydWN0dXJlIGhvbGRpbmcgZGF0ZXMvcmFuZ2VzIGZvciByZW5kZXJpbmcgYXJvdW5kIHRoZSBnaXZlbiBkYXRlLlxuICAgIC8vIE9wdGlvbmFsIGRpcmVjdGlvbiBwYXJhbSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0ZSBpcyBiZWluZyBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZFxuICAgIC8vIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBkZWNyZW1lbnRlZCA9IC0xLCBpbmNyZW1lbnRlZCA9IDEgKGRlZmF1bHQpLlxuICAgIGJ1aWxkKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24sIGZvcmNlVG9WYWxpZCA9IHRydWUpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB2YWxpZFJhbmdlO1xuICAgICAgICBsZXQgY3VycmVudEluZm87XG4gICAgICAgIGxldCBpc1JhbmdlQWxsRGF5O1xuICAgICAgICBsZXQgcmVuZGVyUmFuZ2U7XG4gICAgICAgIGxldCBhY3RpdmVSYW5nZTtcbiAgICAgICAgbGV0IGlzVmFsaWQ7XG4gICAgICAgIHZhbGlkUmFuZ2UgPSB0aGlzLmJ1aWxkVmFsaWRSYW5nZSgpO1xuICAgICAgICB2YWxpZFJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyh2YWxpZFJhbmdlKTtcbiAgICAgICAgaWYgKGZvcmNlVG9WYWxpZCkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSBjb25zdHJhaW5NYXJrZXJUb1JhbmdlKGN1cnJlbnREYXRlLCB2YWxpZFJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50SW5mbyA9IHRoaXMuYnVpbGRDdXJyZW50UmFuZ2VJbmZvKGN1cnJlbnREYXRlLCBkaXJlY3Rpb24pO1xuICAgICAgICBpc1JhbmdlQWxsRGF5ID0gL14oeWVhcnxtb250aHx3ZWVrfGRheSkkLy50ZXN0KGN1cnJlbnRJbmZvLnVuaXQpO1xuICAgICAgICByZW5kZXJSYW5nZSA9IHRoaXMuYnVpbGRSZW5kZXJSYW5nZSh0aGlzLnRyaW1IaWRkZW5EYXlzKGN1cnJlbnRJbmZvLnJhbmdlKSwgY3VycmVudEluZm8udW5pdCwgaXNSYW5nZUFsbERheSk7XG4gICAgICAgIHJlbmRlclJhbmdlID0gdGhpcy50cmltSGlkZGVuRGF5cyhyZW5kZXJSYW5nZSk7XG4gICAgICAgIGFjdGl2ZVJhbmdlID0gcmVuZGVyUmFuZ2U7XG4gICAgICAgIGlmICghcHJvcHMuc2hvd05vbkN1cnJlbnREYXRlcykge1xuICAgICAgICAgICAgYWN0aXZlUmFuZ2UgPSBpbnRlcnNlY3RSYW5nZXMoYWN0aXZlUmFuZ2UsIGN1cnJlbnRJbmZvLnJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVSYW5nZSA9IHRoaXMuYWRqdXN0QWN0aXZlUmFuZ2UoYWN0aXZlUmFuZ2UpO1xuICAgICAgICBhY3RpdmVSYW5nZSA9IGludGVyc2VjdFJhbmdlcyhhY3RpdmVSYW5nZSwgdmFsaWRSYW5nZSk7IC8vIG1pZ2h0IHJldHVybiBudWxsXG4gICAgICAgIC8vIGl0J3MgaW52YWxpZCBpZiB0aGUgb3JpZ2luYWxseSByZXF1ZXN0ZWQgZGF0ZSBpcyBub3QgY29udGFpbmVkLFxuICAgICAgICAvLyBvciBpZiB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSBvdXRzaWRlIG9mIHRoZSB2YWxpZCByYW5nZS5cbiAgICAgICAgaXNWYWxpZCA9IHJhbmdlc0ludGVyc2VjdChjdXJyZW50SW5mby5yYW5nZSwgdmFsaWRSYW5nZSk7XG4gICAgICAgIC8vIEhBQ0s6IGNvbnN0cmFpbiB0byByZW5kZXItcmFuZ2Ugc28gYGN1cnJlbnREYXRlYCBpcyBtb3JlIHVzZWZ1bCB0byB2aWV3IHJlbmRlcmluZ1xuICAgICAgICBpZiAoIXJhbmdlQ29udGFpbnNNYXJrZXIocmVuZGVyUmFuZ2UsIGN1cnJlbnREYXRlKSkge1xuICAgICAgICAgICAgY3VycmVudERhdGUgPSByZW5kZXJSYW5nZS5zdGFydDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICAvLyBjb25zdHJhaW50IGZvciB3aGVyZSBwcmV2L25leHQgb3BlcmF0aW9ucyBjYW4gZ28gYW5kIHdoZXJlIGV2ZW50cyBjYW4gYmUgZHJhZ2dlZC9yZXNpemVkIHRvLlxuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQgYW5kIGVuZCBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgdmFsaWRSYW5nZSxcbiAgICAgICAgICAgIC8vIHJhbmdlIHRoZSB2aWV3IGlzIGZvcm1hbGx5IHJlc3BvbnNpYmxlIGZvci5cbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCBhIG1vbnRoIHZpZXcgbWlnaHQgaGF2ZSAxc3QtMzFzdCwgZXhjbHVkaW5nIHBhZGRlZCBkYXRlc1xuICAgICAgICAgICAgY3VycmVudFJhbmdlOiBjdXJyZW50SW5mby5yYW5nZSxcbiAgICAgICAgICAgIC8vIG5hbWUgb2YgbGFyZ2VzdCB1bml0IGJlaW5nIGRpc3BsYXllZCwgbGlrZSBcIm1vbnRoXCIgb3IgXCJ3ZWVrXCJcbiAgICAgICAgICAgIGN1cnJlbnRSYW5nZVVuaXQ6IGN1cnJlbnRJbmZvLnVuaXQsXG4gICAgICAgICAgICBpc1JhbmdlQWxsRGF5LFxuICAgICAgICAgICAgLy8gZGF0ZXMgdGhhdCBkaXNwbGF5IGV2ZW50cyBhbmQgYWNjZXB0IGRyYWctbi1kcm9wXG4gICAgICAgICAgICAvLyB3aWxsIGJlIGBudWxsYCBpZiBubyBkYXRlcyBhY2NlcHQgZXZlbnRzXG4gICAgICAgICAgICBhY3RpdmVSYW5nZSxcbiAgICAgICAgICAgIC8vIGRhdGUgcmFuZ2Ugd2l0aCBhIHJlbmRlcmVkIHNrZWxldG9uXG4gICAgICAgICAgICAvLyBpbmNsdWRlcyBub3QtYWN0aXZlIGRheXMgdGhhdCBuZWVkIHNvbWUgc29ydCBvZiBET01cbiAgICAgICAgICAgIHJlbmRlclJhbmdlLFxuICAgICAgICAgICAgLy8gRHVyYXRpb24gb2JqZWN0IHRoYXQgZGVub3RlcyB0aGUgZmlyc3QgdmlzaWJsZSB0aW1lIG9mIGFueSBnaXZlbiBkYXlcbiAgICAgICAgICAgIHNsb3RNaW5UaW1lOiBwcm9wcy5zbG90TWluVGltZSxcbiAgICAgICAgICAgIC8vIER1cmF0aW9uIG9iamVjdCB0aGF0IGRlbm90ZXMgdGhlIGV4Y2x1c2l2ZSB2aXNpYmxlIGVuZCB0aW1lIG9mIGFueSBnaXZlbiBkYXlcbiAgICAgICAgICAgIHNsb3RNYXhUaW1lOiBwcm9wcy5zbG90TWF4VGltZSxcbiAgICAgICAgICAgIGlzVmFsaWQsXG4gICAgICAgICAgICAvLyBob3cgZmFyIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBtb3ZlIGZvciBhIHByZXYvbmV4dCBvcGVyYXRpb25cbiAgICAgICAgICAgIGRhdGVJbmNyZW1lbnQ6IHRoaXMuYnVpbGREYXRlSW5jcmVtZW50KGN1cnJlbnRJbmZvLmR1cmF0aW9uKSxcbiAgICAgICAgICAgIC8vIHBhc3MgYSBmYWxsYmFjayAobWlnaHQgYmUgbnVsbCkgXlxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBCdWlsZHMgYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgc3RhcnQvZW5kIHByb3BlcnRpZXMuXG4gICAgLy8gSW5kaWNhdGVzIHRoZSBtaW5pbXVtL21heGltdW0gZGF0ZXMgdG8gZGlzcGxheS5cbiAgICAvLyBub3QgcmVzcG9uc2libGUgZm9yIHRyaW1taW5nIGhpZGRlbiBkYXlzLlxuICAgIGJ1aWxkVmFsaWRSYW5nZSgpIHtcbiAgICAgICAgbGV0IGlucHV0ID0gdGhpcy5wcm9wcy52YWxpZFJhbmdlSW5wdXQ7XG4gICAgICAgIGxldCBzaW1wbGVJbnB1dCA9IHR5cGVvZiBpbnB1dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBpbnB1dC5jYWxsKHRoaXMucHJvcHMuY2FsZW5kYXJBcGksIHRoaXMubm93RGF0ZSlcbiAgICAgICAgICAgIDogaW5wdXQ7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZVJhbmdlKHNpbXBsZUlucHV0KSB8fFxuICAgICAgICAgICAgeyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07IC8vIGNvbXBsZXRlbHkgb3Blbi1lbmRlZFxuICAgIH1cbiAgICAvLyBCdWlsZHMgYSBzdHJ1Y3R1cmUgd2l0aCBpbmZvIGFib3V0IHRoZSBcImN1cnJlbnRcIiByYW5nZSwgdGhlIHJhbmdlIHRoYXQgaXNcbiAgICAvLyBoaWdobGlnaHRlZCBhcyBiZWluZyB0aGUgY3VycmVudCBtb250aCBmb3IgZXhhbXBsZS5cbiAgICAvLyBTZWUgYnVpbGQoKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBgZGlyZWN0aW9uYC5cbiAgICAvLyBHdWFyYW50ZWVkIHRvIGhhdmUgYHJhbmdlYCBhbmQgYHVuaXRgIHByb3BlcnRpZXMuIGBkdXJhdGlvbmAgaXMgb3B0aW9uYWwuXG4gICAgYnVpbGRDdXJyZW50UmFuZ2VJbmZvKGRhdGUsIGRpcmVjdGlvbikge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgbGV0IHVuaXQgPSBudWxsO1xuICAgICAgICBsZXQgcmFuZ2UgPSBudWxsO1xuICAgICAgICBsZXQgZGF5Q291bnQ7XG4gICAgICAgIGlmIChwcm9wcy5kdXJhdGlvbikge1xuICAgICAgICAgICAgZHVyYXRpb24gPSBwcm9wcy5kdXJhdGlvbjtcbiAgICAgICAgICAgIHVuaXQgPSBwcm9wcy5kdXJhdGlvblVuaXQ7XG4gICAgICAgICAgICByYW5nZSA9IHRoaXMuYnVpbGRSYW5nZUZyb21EdXJhdGlvbihkYXRlLCBkaXJlY3Rpb24sIGR1cmF0aW9uLCB1bml0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoZGF5Q291bnQgPSB0aGlzLnByb3BzLmRheUNvdW50KSkge1xuICAgICAgICAgICAgdW5pdCA9ICdkYXknO1xuICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLmJ1aWxkUmFuZ2VGcm9tRGF5Q291bnQoZGF0ZSwgZGlyZWN0aW9uLCBkYXlDb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKHJhbmdlID0gdGhpcy5idWlsZEN1c3RvbVZpc2libGVSYW5nZShkYXRlKSkpIHtcbiAgICAgICAgICAgIHVuaXQgPSBwcm9wcy5kYXRlRW52LmdyZWF0ZXN0V2hvbGVVbml0KHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpLnVuaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHRoaXMuZ2V0RmFsbGJhY2tEdXJhdGlvbigpO1xuICAgICAgICAgICAgdW5pdCA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcihkdXJhdGlvbikudW5pdDtcbiAgICAgICAgICAgIHJhbmdlID0gdGhpcy5idWlsZFJhbmdlRnJvbUR1cmF0aW9uKGRhdGUsIGRpcmVjdGlvbiwgZHVyYXRpb24sIHVuaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGR1cmF0aW9uLCB1bml0LCByYW5nZSB9O1xuICAgIH1cbiAgICBnZXRGYWxsYmFja0R1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBkYXk6IDEgfSk7XG4gICAgfVxuICAgIC8vIFJldHVybnMgYSBuZXcgYWN0aXZlUmFuZ2UgdG8gaGF2ZSB0aW1lIHZhbHVlcyAodW4tYW1iaWd1YXRlKVxuICAgIC8vIHNsb3RNaW5UaW1lIG9yIHNsb3RNYXhUaW1lIGNhdXNlcyB0aGUgcmFuZ2UgdG8gZXhwYW5kLlxuICAgIGFkanVzdEFjdGl2ZVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYsIHVzZXNNaW5NYXhUaW1lLCBzbG90TWluVGltZSwgc2xvdE1heFRpbWUgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuICAgICAgICBpZiAodXNlc01pbk1heFRpbWUpIHtcbiAgICAgICAgICAgIC8vIGV4cGFuZCBhY3RpdmUgcmFuZ2UgaWYgc2xvdE1pblRpbWUgaXMgbmVnYXRpdmUgKHdoeSBub3Qgd2hlbiBwb3NpdGl2ZT8pXG4gICAgICAgICAgICBpZiAoYXNSb3VnaERheXMoc2xvdE1pblRpbWUpIDwgMCkge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRPZkRheShzdGFydCk7IC8vIG5lY2Vzc2FyeT9cbiAgICAgICAgICAgICAgICBzdGFydCA9IGRhdGVFbnYuYWRkKHN0YXJ0LCBzbG90TWluVGltZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBhbmQgYWN0aXZlIHJhbmdlIGlmIHNsb3RNYXhUaW1lIGlzIGJleW9uZCBvbmUgZGF5ICh3aHkgbm90IHdoZW4gbmVnYXRpdmU/KVxuICAgICAgICAgICAgaWYgKGFzUm91Z2hEYXlzKHNsb3RNYXhUaW1lKSA+IDEpIHtcbiAgICAgICAgICAgICAgICBlbmQgPSBzdGFydE9mRGF5KGVuZCk7IC8vIG5lY2Vzc2FyeT9cbiAgICAgICAgICAgICAgICBlbmQgPSBhZGREYXlzKGVuZCwgLTEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGVFbnYuYWRkKGVuZCwgc2xvdE1heFRpbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG4gICAgLy8gQnVpbGRzIHRoZSBcImN1cnJlbnRcIiByYW5nZSB3aGVuIGl0IGlzIHNwZWNpZmllZCBhcyBhbiBleHBsaWNpdCBkdXJhdGlvbi5cbiAgICAvLyBgdW5pdGAgaXMgdGhlIGFscmVhZHktY29tcHV0ZWQgZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yIHVuaXQgb2YgZHVyYXRpb24uXG4gICAgYnVpbGRSYW5nZUZyb21EdXJhdGlvbihkYXRlLCBkaXJlY3Rpb24sIGR1cmF0aW9uLCB1bml0KSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYsIGRhdGVBbGlnbm1lbnQgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBzdGFydDtcbiAgICAgICAgbGV0IGVuZDtcbiAgICAgICAgbGV0IHJlcztcbiAgICAgICAgLy8gY29tcHV0ZSB3aGF0IHRoZSBhbGlnbm1lbnQgc2hvdWxkIGJlXG4gICAgICAgIGlmICghZGF0ZUFsaWdubWVudCkge1xuICAgICAgICAgICAgbGV0IHsgZGF0ZUluY3JlbWVudCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgICAgIGlmIChkYXRlSW5jcmVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBzbWFsbGVyIG9mIHRoZSB0d28gdW5pdHNcbiAgICAgICAgICAgICAgICBpZiAoYXNSb3VnaE1zKGRhdGVJbmNyZW1lbnQpIDwgYXNSb3VnaE1zKGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlQWxpZ25tZW50ID0gZ3JlYXRlc3REdXJhdGlvbkRlbm9taW5hdG9yKGRhdGVJbmNyZW1lbnQpLnVuaXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRlQWxpZ25tZW50ID0gdW5pdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRlQWxpZ25tZW50ID0gdW5pdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB0aGUgdmlldyBkaXNwbGF5cyBhIHNpbmdsZSBkYXkgb3Igc21hbGxlclxuICAgICAgICBpZiAoYXNSb3VnaERheXMoZHVyYXRpb24pIDw9IDEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSGlkZGVuRGF5KHN0YXJ0KSkge1xuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IHN0YXJ0T2ZEYXkoc3RhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVSZXMoKSB7XG4gICAgICAgICAgICBzdGFydCA9IGRhdGVFbnYuc3RhcnRPZihkYXRlLCBkYXRlQWxpZ25tZW50KTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGVFbnYuYWRkKHN0YXJ0LCBkdXJhdGlvbik7XG4gICAgICAgICAgICByZXMgPSB7IHN0YXJ0LCBlbmQgfTtcbiAgICAgICAgfVxuICAgICAgICBjb21wdXRlUmVzKCk7XG4gICAgICAgIC8vIGlmIHJhbmdlIGlzIGNvbXBsZXRlbHkgZW52ZWxvcGVkIGJ5IGhpZGRlbiBkYXlzLCBnbyBwYXN0IHRoZSBoaWRkZW4gZGF5c1xuICAgICAgICBpZiAoIXRoaXMudHJpbUhpZGRlbkRheXMocmVzKSkge1xuICAgICAgICAgICAgZGF0ZSA9IHRoaXMuc2tpcEhpZGRlbkRheXMoZGF0ZSwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIGNvbXB1dGVSZXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICAvLyBCdWlsZHMgdGhlIFwiY3VycmVudFwiIHJhbmdlIHdoZW4gYSBkYXlDb3VudCBpcyBzcGVjaWZpZWQuXG4gICAgYnVpbGRSYW5nZUZyb21EYXlDb3VudChkYXRlLCBkaXJlY3Rpb24sIGRheUNvdW50KSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYsIGRhdGVBbGlnbm1lbnQgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBydW5uaW5nQ291bnQgPSAwO1xuICAgICAgICBsZXQgc3RhcnQgPSBkYXRlO1xuICAgICAgICBsZXQgZW5kO1xuICAgICAgICBpZiAoZGF0ZUFsaWdubWVudCkge1xuICAgICAgICAgICAgc3RhcnQgPSBkYXRlRW52LnN0YXJ0T2Yoc3RhcnQsIGRhdGVBbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0ID0gc3RhcnRPZkRheShzdGFydCk7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5za2lwSGlkZGVuRGF5cyhzdGFydCwgZGlyZWN0aW9uKTtcbiAgICAgICAgZW5kID0gc3RhcnQ7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGVuZCA9IGFkZERheXMoZW5kLCAxKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0hpZGRlbkRheShlbmQpKSB7XG4gICAgICAgICAgICAgICAgcnVubmluZ0NvdW50ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHJ1bm5pbmdDb3VudCA8IGRheUNvdW50KTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH1cbiAgICAvLyBCdWlsZHMgYSBub3JtYWxpemVkIHJhbmdlIG9iamVjdCBmb3IgdGhlIFwidmlzaWJsZVwiIHJhbmdlLFxuICAgIC8vIHdoaWNoIGlzIGEgd2F5IHRvIGRlZmluZSB0aGUgY3VycmVudFJhbmdlIGFuZCBhY3RpdmVSYW5nZSBhdCB0aGUgc2FtZSB0aW1lLlxuICAgIGJ1aWxkQ3VzdG9tVmlzaWJsZVJhbmdlKGRhdGUpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBpbnB1dCA9IHByb3BzLnZpc2libGVSYW5nZUlucHV0O1xuICAgICAgICBsZXQgc2ltcGxlSW5wdXQgPSB0eXBlb2YgaW5wdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gaW5wdXQuY2FsbChwcm9wcy5jYWxlbmRhckFwaSwgcHJvcHMuZGF0ZUVudi50b0RhdGUoZGF0ZSkpXG4gICAgICAgICAgICA6IGlucHV0O1xuICAgICAgICBsZXQgcmFuZ2UgPSB0aGlzLnJlZmluZVJhbmdlKHNpbXBsZUlucHV0KTtcbiAgICAgICAgaWYgKHJhbmdlICYmIChyYW5nZS5zdGFydCA9PSBudWxsIHx8IHJhbmdlLmVuZCA9PSBudWxsKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJhbmdlO1xuICAgIH1cbiAgICAvLyBDb21wdXRlcyB0aGUgcmFuZ2UgdGhhdCB3aWxsIHJlcHJlc2VudCB0aGUgZWxlbWVudC9jZWxscyBmb3IgKnJlbmRlcmluZyosXG4gICAgLy8gYnV0IHdoaWNoIG1heSBoYXZlIHZvaWRlZCBkYXlzL3RpbWVzLlxuICAgIC8vIG5vdCByZXNwb25zaWJsZSBmb3IgdHJpbW1pbmcgaGlkZGVuIGRheXMuXG4gICAgYnVpbGRSZW5kZXJSYW5nZShjdXJyZW50UmFuZ2UsIGN1cnJlbnRSYW5nZVVuaXQsIGlzUmFuZ2VBbGxEYXkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRSYW5nZTtcbiAgICB9XG4gICAgLy8gQ29tcHV0ZSB0aGUgZHVyYXRpb24gdmFsdWUgdGhhdCBzaG91bGQgYmUgYWRkZWQvc3Vic3RyYWN0ZWQgdG8gdGhlIGN1cnJlbnQgZGF0ZVxuICAgIC8vIHdoZW4gYSBwcmV2L25leHQgb3BlcmF0aW9uIGhhcHBlbnMuXG4gICAgYnVpbGREYXRlSW5jcmVtZW50KGZhbGxiYWNrKSB7XG4gICAgICAgIGxldCB7IGRhdGVJbmNyZW1lbnQgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGxldCBjdXN0b21BbGlnbm1lbnQ7XG4gICAgICAgIGlmIChkYXRlSW5jcmVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZUluY3JlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGN1c3RvbUFsaWdubWVudCA9IHRoaXMucHJvcHMuZGF0ZUFsaWdubWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbigxLCBjdXN0b21BbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IGRheXM6IDEgfSk7XG4gICAgfVxuICAgIHJlZmluZVJhbmdlKHJhbmdlSW5wdXQpIHtcbiAgICAgICAgaWYgKHJhbmdlSW5wdXQpIHtcbiAgICAgICAgICAgIGxldCByYW5nZSA9IHBhcnNlUmFuZ2UocmFuZ2VJbnB1dCwgdGhpcy5wcm9wcy5kYXRlRW52KTtcbiAgICAgICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgICAgIHJhbmdlID0gY29tcHV0ZVZpc2libGVEYXlSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qIEhpZGRlbiBEYXlzXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgICAvLyBJbml0aWFsaXplcyBpbnRlcm5hbCB2YXJpYWJsZXMgcmVsYXRlZCB0byBjYWxjdWxhdGluZyBoaWRkZW4gZGF5cy1vZi13ZWVrXG4gICAgaW5pdEhpZGRlbkRheXMoKSB7XG4gICAgICAgIGxldCBoaWRkZW5EYXlzID0gdGhpcy5wcm9wcy5oaWRkZW5EYXlzIHx8IFtdOyAvLyBhcnJheSBvZiBkYXktb2Ytd2VlayBpbmRpY2VzIHRoYXQgYXJlIGhpZGRlblxuICAgICAgICBsZXQgaXNIaWRkZW5EYXlIYXNoID0gW107IC8vIGlzIHRoZSBkYXktb2Ytd2VlayBoaWRkZW4/IChoYXNoIHdpdGggZGF5LW9mLXdlZWstaW5kZXggLT4gYm9vbClcbiAgICAgICAgbGV0IGRheUNudCA9IDA7XG4gICAgICAgIGxldCBpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy53ZWVrZW5kcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGhpZGRlbkRheXMucHVzaCgwLCA2KTsgLy8gMD1zdW5kYXksIDY9c2F0dXJkYXlcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoIShpc0hpZGRlbkRheUhhc2hbaV0gPSBoaWRkZW5EYXlzLmluZGV4T2YoaSkgIT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGRheUNudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZGF5Q250KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaGlkZGVuRGF5cycpOyAvLyBhbGwgZGF5cyB3ZXJlIGhpZGRlbj8gYmFkLlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNIaWRkZW5EYXlIYXNoID0gaXNIaWRkZW5EYXlIYXNoO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZGF5cyBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgcmFuZ2UgdGhhdCBhcmUgY29tcHV0ZWQgYXMgaGlkZGVuLlxuICAgIC8vIElmIHRoZSB3aG9sZSByYW5nZSBpcyB0cmltbWVkIG9mZiwgcmV0dXJucyBudWxsXG4gICAgdHJpbUhpZGRlbkRheXMocmFuZ2UpIHtcbiAgICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gcmFuZ2U7XG4gICAgICAgIGlmIChzdGFydCkge1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKHN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLnNraXBIaWRkZW5EYXlzKGVuZCwgLTEsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsIHx8IHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIElzIHRoZSBjdXJyZW50IGRheSBoaWRkZW4/XG4gICAgLy8gYGRheWAgaXMgYSBkYXktb2Ytd2VlayBpbmRleCAoMC02KSwgb3IgYSBEYXRlICh1c2VkIGZvciBVVEMpXG4gICAgaXNIaWRkZW5EYXkoZGF5KSB7XG4gICAgICAgIGlmIChkYXkgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICBkYXkgPSBkYXkuZ2V0VVRDRGF5KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5EYXlIYXNoW2RheV07XG4gICAgfVxuICAgIC8vIEluY3JlbWVudGluZyB0aGUgY3VycmVudCBkYXkgdW50aWwgaXQgaXMgbm8gbG9uZ2VyIGEgaGlkZGVuIGRheSwgcmV0dXJuaW5nIGEgY29weS5cbiAgICAvLyBET0VTIE5PVCBDT05TSURFUiB2YWxpZFJhbmdlIVxuICAgIC8vIElmIHRoZSBpbml0aWFsIHZhbHVlIG9mIGBkYXRlYCBpcyBub3QgYSBoaWRkZW4gZGF5LCBkb24ndCBkbyBhbnl0aGluZy5cbiAgICAvLyBQYXNzIGBpc0V4Y2x1c2l2ZWAgYXMgYHRydWVgIGlmIHlvdSBhcmUgZGVhbGluZyB3aXRoIGFuIGVuZCBkYXRlLlxuICAgIC8vIGBpbmNgIGRlZmF1bHRzIHRvIGAxYCAoaW5jcmVtZW50IG9uZSBkYXkgZm9yd2FyZCBlYWNoIHRpbWUpXG4gICAgc2tpcEhpZGRlbkRheXMoZGF0ZSwgaW5jID0gMSwgaXNFeGNsdXNpdmUgPSBmYWxzZSkge1xuICAgICAgICB3aGlsZSAodGhpcy5pc0hpZGRlbkRheUhhc2hbKGRhdGUuZ2V0VVRDRGF5KCkgKyAoaXNFeGNsdXNpdmUgPyBpbmMgOiAwKSArIDcpICUgN10pIHtcbiAgICAgICAgICAgIGRhdGUgPSBhZGREYXlzKGRhdGUsIGluYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyRGF0ZVNlbGVjdChzZWxlY3Rpb24sIHBldiwgY29udGV4dCkge1xuICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdzZWxlY3QnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJ1aWxkRGF0ZVNwYW5BcGlXaXRoQ29udGV4dChzZWxlY3Rpb24sIGNvbnRleHQpKSwgeyBqc0V2ZW50OiBwZXYgPyBwZXYub3JpZ0V2ZW50IDogbnVsbCwgdmlldzogY29udGV4dC52aWV3QXBpIHx8IGNvbnRleHQuY2FsZW5kYXJBcGkudmlldyB9KSk7XG59XG5mdW5jdGlvbiB0cmlnZ2VyRGF0ZVVuc2VsZWN0KHBldiwgY29udGV4dCkge1xuICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCd1bnNlbGVjdCcsIHtcbiAgICAgICAganNFdmVudDogcGV2ID8gcGV2Lm9yaWdFdmVudCA6IG51bGwsXG4gICAgICAgIHZpZXc6IGNvbnRleHQudmlld0FwaSB8fCBjb250ZXh0LmNhbGVuZGFyQXBpLnZpZXcsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQoZGF0ZVNwYW4sIGNvbnRleHQpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBmb3IgKGxldCB0cmFuc2Zvcm0gb2YgY29udGV4dC5wbHVnaW5Ib29rcy5kYXRlU3BhblRyYW5zZm9ybXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wcywgdHJhbnNmb3JtKGRhdGVTcGFuLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIGJ1aWxkRGF0ZVNwYW5BcGkoZGF0ZVNwYW4sIGNvbnRleHQuZGF0ZUVudikpO1xuICAgIHJldHVybiBwcm9wcztcbn1cbi8vIEdpdmVuIGFuIGV2ZW50J3MgYWxsRGF5IHN0YXR1cyBhbmQgc3RhcnQgZGF0ZSwgcmV0dXJuIHdoYXQgaXRzIGZhbGxiYWNrIGVuZCBkYXRlIHNob3VsZCBiZS5cbi8vIFRPRE86IHJlbmFtZSB0byBjb21wdXRlRGVmYXVsdEV2ZW50RW5kXG5mdW5jdGlvbiBnZXREZWZhdWx0RXZlbnRFbmQoYWxsRGF5LCBtYXJrZXIsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBkYXRlRW52LCBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCBlbmQgPSBtYXJrZXI7XG4gICAgaWYgKGFsbERheSkge1xuICAgICAgICBlbmQgPSBzdGFydE9mRGF5KGVuZCk7XG4gICAgICAgIGVuZCA9IGRhdGVFbnYuYWRkKGVuZCwgb3B0aW9ucy5kZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBlbmQgPSBkYXRlRW52LmFkZChlbmQsIG9wdGlvbnMuZGVmYXVsdFRpbWVkRXZlbnREdXJhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIGFwcGxpZXMgdGhlIG11dGF0aW9uIHRvIEFMTCBkZWZzL2luc3RhbmNlcyB3aXRoaW4gdGhlIGV2ZW50IHN0b3JlXG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50Q29uZmlnQmFzZSwgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgZXZlbnRDb25maWdzID0gY29tcGlsZUV2ZW50VWlzKGV2ZW50U3RvcmUuZGVmcywgZXZlbnRDb25maWdCYXNlKTtcbiAgICBsZXQgZGVzdCA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpO1xuICAgIGZvciAobGV0IGRlZklkIGluIGV2ZW50U3RvcmUuZGVmcykge1xuICAgICAgICBsZXQgZGVmID0gZXZlbnRTdG9yZS5kZWZzW2RlZklkXTtcbiAgICAgICAgZGVzdC5kZWZzW2RlZklkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGRlZiwgZXZlbnRDb25maWdzW2RlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGV2ZW50U3RvcmUuaW5zdGFuY2VzKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IGV2ZW50U3RvcmUuaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICBsZXQgZGVmID0gZGVzdC5kZWZzW2luc3RhbmNlLmRlZklkXTsgLy8gaW1wb3J0YW50IHRvIGdyYWIgdGhlIG5ld2x5IG1vZGlmaWVkIGRlZlxuICAgICAgICBkZXN0Lmluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IGFwcGx5TXV0YXRpb25Ub0V2ZW50SW5zdGFuY2UoaW5zdGFuY2UsIGRlZiwgZXZlbnRDb25maWdzW2luc3RhbmNlLmRlZklkXSwgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbmZ1bmN0aW9uIGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmKGV2ZW50RGVmLCBldmVudENvbmZpZywgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgc3RhbmRhcmRQcm9wcyA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgfHwge307XG4gICAgLy8gaWYgaGFzRW5kIGhhcyBub3QgYmVlbiBzcGVjaWZpZWQsIGd1ZXNzIGEgZ29vZCB2YWx1ZSBiYXNlZCBvbiBkZWx0YXMuXG4gICAgLy8gaWYgZHVyYXRpb24gd2lsbCBjaGFuZ2UsIHRoZXJlJ3Mgbm8gd2F5IHRoZSBkZWZhdWx0IGR1cmF0aW9uIHdpbGwgcGVyc2lzdCxcbiAgICAvLyBhbmQgdGh1cywgd2UgbmVlZCB0byBtYXJrIHRoZSBldmVudCBhcyBoYXZpbmcgYSByZWFsIGVuZFxuICAgIGlmIChzdGFuZGFyZFByb3BzLmhhc0VuZCA9PSBudWxsICYmXG4gICAgICAgIGV2ZW50Q29uZmlnLmR1cmF0aW9uRWRpdGFibGUgJiZcbiAgICAgICAgKG11dGF0aW9uLnN0YXJ0RGVsdGEgfHwgbXV0YXRpb24uZW5kRGVsdGEpKSB7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gdHJ1ZTsgLy8gVE9ETzogaXMgdGhpcyBtdXRhdGlvbiBva2F5P1xuICAgIH1cbiAgICBsZXQgY29weSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudERlZiksIHN0YW5kYXJkUHJvcHMpLCB7IHVpOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50RGVmLnVpKSwgc3RhbmRhcmRQcm9wcy51aSkgfSk7XG4gICAgaWYgKG11dGF0aW9uLmV4dGVuZGVkUHJvcHMpIHtcbiAgICAgICAgY29weS5leHRlbmRlZFByb3BzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb3B5LmV4dGVuZGVkUHJvcHMpLCBtdXRhdGlvbi5leHRlbmRlZFByb3BzKTtcbiAgICB9XG4gICAgZm9yIChsZXQgYXBwbGllciBvZiBjb250ZXh0LnBsdWdpbkhvb2tzLmV2ZW50RGVmTXV0YXRpb25BcHBsaWVycykge1xuICAgICAgICBhcHBsaWVyKGNvcHksIG11dGF0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKCFjb3B5Lmhhc0VuZCAmJiBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uKSB7XG4gICAgICAgIGNvcHkuaGFzRW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvcHk7XG59XG5mdW5jdGlvbiBhcHBseU11dGF0aW9uVG9FdmVudEluc3RhbmNlKGV2ZW50SW5zdGFuY2UsIGV2ZW50RGVmLCAvLyBtdXN0IGZpcnN0IGJlIG1vZGlmaWVkIGJ5IGFwcGx5TXV0YXRpb25Ub0V2ZW50RGVmXG5ldmVudENvbmZpZywgbXV0YXRpb24sIGNvbnRleHQpIHtcbiAgICBsZXQgeyBkYXRlRW52IH0gPSBjb250ZXh0O1xuICAgIGxldCBmb3JjZUFsbERheSA9IG11dGF0aW9uLnN0YW5kYXJkUHJvcHMgJiYgbXV0YXRpb24uc3RhbmRhcmRQcm9wcy5hbGxEYXkgPT09IHRydWU7XG4gICAgbGV0IGNsZWFyRW5kID0gbXV0YXRpb24uc3RhbmRhcmRQcm9wcyAmJiBtdXRhdGlvbi5zdGFuZGFyZFByb3BzLmhhc0VuZCA9PT0gZmFsc2U7XG4gICAgbGV0IGNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBldmVudEluc3RhbmNlKTtcbiAgICBpZiAoZm9yY2VBbGxEYXkpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IGNvbXB1dGVBbGlnbmVkRGF5UmFuZ2UoY29weS5yYW5nZSk7XG4gICAgfVxuICAgIGlmIChtdXRhdGlvbi5kYXRlc0RlbHRhICYmIGV2ZW50Q29uZmlnLnN0YXJ0RWRpdGFibGUpIHtcbiAgICAgICAgY29weS5yYW5nZSA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBkYXRlRW52LmFkZChjb3B5LnJhbmdlLnN0YXJ0LCBtdXRhdGlvbi5kYXRlc0RlbHRhKSxcbiAgICAgICAgICAgIGVuZDogZGF0ZUVudi5hZGQoY29weS5yYW5nZS5lbmQsIG11dGF0aW9uLmRhdGVzRGVsdGEpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAobXV0YXRpb24uc3RhcnREZWx0YSAmJiBldmVudENvbmZpZy5kdXJhdGlvbkVkaXRhYmxlKSB7XG4gICAgICAgIGNvcHkucmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogZGF0ZUVudi5hZGQoY29weS5yYW5nZS5zdGFydCwgbXV0YXRpb24uc3RhcnREZWx0YSksXG4gICAgICAgICAgICBlbmQ6IGNvcHkucmFuZ2UuZW5kLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAobXV0YXRpb24uZW5kRGVsdGEgJiYgZXZlbnRDb25maWcuZHVyYXRpb25FZGl0YWJsZSkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGNvcHkucmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGRhdGVFbnYuYWRkKGNvcHkucmFuZ2UuZW5kLCBtdXRhdGlvbi5lbmREZWx0YSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmIChjbGVhckVuZCkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGNvcHkucmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICBlbmQ6IGdldERlZmF1bHRFdmVudEVuZChldmVudERlZi5hbGxEYXksIGNvcHkucmFuZ2Uuc3RhcnQsIGNvbnRleHQpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBpbiBjYXNlIGV2ZW50IHdhcyBhbGwtZGF5IGJ1dCB0aGUgc3VwcGxpZWQgZGVsdGFzIHdlcmUgbm90XG4gICAgLy8gYmV0dGVyIHV0aWwgZm9yIHRoaXM/XG4gICAgaWYgKGV2ZW50RGVmLmFsbERheSkge1xuICAgICAgICBjb3B5LnJhbmdlID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0T2ZEYXkoY29weS5yYW5nZS5zdGFydCksXG4gICAgICAgICAgICBlbmQ6IHN0YXJ0T2ZEYXkoY29weS5yYW5nZS5lbmQpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyBoYW5kbGUgaW52YWxpZCBkdXJhdGlvbnNcbiAgICBpZiAoY29weS5yYW5nZS5lbmQgPCBjb3B5LnJhbmdlLnN0YXJ0KSB7XG4gICAgICAgIGNvcHkucmFuZ2UuZW5kID0gZ2V0RGVmYXVsdEV2ZW50RW5kKGV2ZW50RGVmLmFsbERheSwgY29weS5yYW5nZS5zdGFydCwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuXG5jbGFzcyBFdmVudFNvdXJjZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIGludGVybmFsRXZlbnRTb3VyY2UpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlID0gaW50ZXJuYWxFdmVudFNvdXJjZTtcbiAgICB9XG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVF9TT1VSQ0UnLFxuICAgICAgICAgICAgc291cmNlSWQ6IHRoaXMuaW50ZXJuYWxFdmVudFNvdXJjZS5zb3VyY2VJZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmV0Y2goKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnRkVUQ0hfRVZFTlRfU09VUkNFUycsXG4gICAgICAgICAgICBzb3VyY2VJZHM6IFt0aGlzLmludGVybmFsRXZlbnRTb3VyY2Uuc291cmNlSWRdLFxuICAgICAgICAgICAgaXNSZWZldGNoOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLnB1YmxpY0lkO1xuICAgIH1cbiAgICBnZXQgdXJsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLm1ldGEudXJsO1xuICAgIH1cbiAgICBnZXQgZm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEV2ZW50U291cmNlLm1ldGEuZm9ybWF0OyAvLyBUT0RPOiBiYWQuIG5vdCBndWFyYW50ZWVkXG4gICAgfVxufVxuXG5jbGFzcyBFdmVudEltcGwge1xuICAgIC8vIGluc3RhbmNlIHdpbGwgYmUgbnVsbCBpZiBleHByZXNzaW5nIGEgcmVjdXJyaW5nIGV2ZW50IHRoYXQgaGFzIG5vIGN1cnJlbnQgaW5zdGFuY2VzLFxuICAgIC8vIE9SIGlmIHRyeWluZyB0byB2YWxpZGF0ZSBhbiBpbmNvbWluZyBleHRlcm5hbCBldmVudCB0aGF0IGhhcyBubyBkYXRlcyBhc3NpZ25lZFxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuX2RlZiA9IGRlZjtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZSB8fCBudWxsO1xuICAgIH1cbiAgICAvKlxuICAgIFRPRE86IG1ha2UgZXZlbnQgc3RydWN0IG1vcmUgcmVzcG9uc2libGUgZm9yIHRoaXNcbiAgICAqL1xuICAgIHNldFByb3AobmFtZSwgdmFsKSB7XG4gICAgICAgIGlmIChuYW1lIGluIEVWRU5UX0RBVEVfUkVGSU5FUlMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IHNldCBkYXRlLXJlbGF0ZWQgcHJvcCBcXCduYW1lXFwnLiBVc2Ugb25lIG9mIHRoZSBkYXRlLXJlbGF0ZWQgbWV0aG9kcyBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSBwcm9wZXIgYWxpYXNpbmcgc3lzdGVtP1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdpZCcpIHtcbiAgICAgICAgICAgIHZhbCA9IEVWRU5UX05PTl9EQVRFX1JFRklORVJTW25hbWVdKHZhbCk7XG4gICAgICAgICAgICB0aGlzLm11dGF0ZSh7XG4gICAgICAgICAgICAgICAgc3RhbmRhcmRQcm9wczogeyBwdWJsaWNJZDogdmFsIH0sIC8vIGhhcmRjb2RlZCBpbnRlcm5hbCBuYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lIGluIEVWRU5UX05PTl9EQVRFX1JFRklORVJTKSB7XG4gICAgICAgICAgICB2YWwgPSBFVkVOVF9OT05fREFURV9SRUZJTkVSU1tuYW1lXSh2YWwpO1xuICAgICAgICAgICAgdGhpcy5tdXRhdGUoe1xuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHM6IHsgW25hbWVdOiB2YWwgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5hbWUgaW4gRVZFTlRfVUlfUkVGSU5FUlMpIHtcbiAgICAgICAgICAgIGxldCB1aSA9IEVWRU5UX1VJX1JFRklORVJTW25hbWVdKHZhbCk7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2NvbG9yJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBiYWNrZ3JvdW5kQ29sb3I6IHZhbCwgYm9yZGVyQ29sb3I6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2VkaXRhYmxlJykge1xuICAgICAgICAgICAgICAgIHVpID0geyBzdGFydEVkaXRhYmxlOiB2YWwsIGR1cmF0aW9uRWRpdGFibGU6IHZhbCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdWkgPSB7IFtuYW1lXTogdmFsIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm11dGF0ZSh7XG4gICAgICAgICAgICAgICAgc3RhbmRhcmRQcm9wczogeyB1aSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBzZXQgcHJvcCAnJHtuYW1lfScuIFVzZSBzZXRFeHRlbmRlZFByb3AgaW5zdGVhZC5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRFeHRlbmRlZFByb3AobmFtZSwgdmFsKSB7XG4gICAgICAgIHRoaXMubXV0YXRlKHtcbiAgICAgICAgICAgIGV4dGVuZGVkUHJvcHM6IHsgW25hbWVdOiB2YWwgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFN0YXJ0KHN0YXJ0SW5wdXQsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgeyBkYXRlRW52IH0gPSB0aGlzLl9jb250ZXh0O1xuICAgICAgICBsZXQgc3RhcnQgPSBkYXRlRW52LmNyZWF0ZU1hcmtlcihzdGFydElucHV0KTtcbiAgICAgICAgaWYgKHN0YXJ0ICYmIHRoaXMuX2luc3RhbmNlKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgbGV0IGluc3RhbmNlUmFuZ2UgPSB0aGlzLl9pbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgICAgIGxldCBzdGFydERlbHRhID0gZGlmZkRhdGVzKGluc3RhbmNlUmFuZ2Uuc3RhcnQsIHN0YXJ0LCBkYXRlRW52LCBvcHRpb25zLmdyYW51bGFyaXR5KTsgLy8gd2hhdCBpZiBwYXJzZWQgYmFkIT9cbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1haW50YWluRHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGRhdGVzRGVsdGE6IHN0YXJ0RGVsdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YXJ0RGVsdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0RW5kKGVuZElucHV0LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHsgZGF0ZUVudiB9ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgbGV0IGVuZDtcbiAgICAgICAgaWYgKGVuZElucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVuZCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKGVuZElucHV0KTtcbiAgICAgICAgICAgIGlmICghZW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kRGVsdGEgPSBkaWZmRGF0ZXModGhpcy5faW5zdGFuY2UucmFuZ2UuZW5kLCBlbmQsIGRhdGVFbnYsIG9wdGlvbnMuZ3JhbnVsYXJpdHkpO1xuICAgICAgICAgICAgICAgIHRoaXMubXV0YXRlKHsgZW5kRGVsdGEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YW5kYXJkUHJvcHM6IHsgaGFzRW5kOiBmYWxzZSB9IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHNldERhdGVzKHN0YXJ0SW5wdXQsIGVuZElucHV0LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHsgZGF0ZUVudiB9ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgbGV0IHN0YW5kYXJkUHJvcHMgPSB7IGFsbERheTogb3B0aW9ucy5hbGxEYXkgfTtcbiAgICAgICAgbGV0IHN0YXJ0ID0gZGF0ZUVudi5jcmVhdGVNYXJrZXIoc3RhcnRJbnB1dCk7XG4gICAgICAgIGxldCBlbmQ7XG4gICAgICAgIGlmICghc3RhcnQpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gVE9ETzogd2FybmluZyBpZiBwYXJzZWQgYmFkXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZElucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVuZCA9IGRhdGVFbnYuY3JlYXRlTWFya2VyKGVuZElucHV0KTtcbiAgICAgICAgICAgIGlmICghZW5kKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5faW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGxldCBpbnN0YW5jZVJhbmdlID0gdGhpcy5faW5zdGFuY2UucmFuZ2U7XG4gICAgICAgICAgICAvLyB3aGVuIGNvbXB1dGluZyB0aGUgZGlmZiBmb3IgYW4gZXZlbnQgYmVpbmcgY29udmVydGVkIHRvIGFsbC1kYXksXG4gICAgICAgICAgICAvLyBjb21wdXRlIGRpZmYgb2ZmIG9mIHRoZSBhbGwtZGF5IHZhbHVlcyB0aGUgd2F5IGV2ZW50LW11dGF0aW9uIGRvZXMuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbGxEYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZVJhbmdlID0gY29tcHV0ZUFsaWduZWREYXlSYW5nZShpbnN0YW5jZVJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzdGFydERlbHRhID0gZGlmZkRhdGVzKGluc3RhbmNlUmFuZ2Uuc3RhcnQsIHN0YXJ0LCBkYXRlRW52LCBvcHRpb25zLmdyYW51bGFyaXR5KTtcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZW5kRGVsdGEgPSBkaWZmRGF0ZXMoaW5zdGFuY2VSYW5nZS5lbmQsIGVuZCwgZGF0ZUVudiwgb3B0aW9ucy5ncmFudWxhcml0eSk7XG4gICAgICAgICAgICAgICAgaWYgKGR1cmF0aW9uc0VxdWFsKHN0YXJ0RGVsdGEsIGVuZERlbHRhKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IGRhdGVzRGVsdGE6IHN0YXJ0RGVsdGEsIHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YXJ0RGVsdGEsIGVuZERlbHRhLCBzdGFuZGFyZFByb3BzIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgeyAvLyBtZWFucyBcImNsZWFyIHRoZSBlbmRcIlxuICAgICAgICAgICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBkYXRlc0RlbHRhOiBzdGFydERlbHRhLCBzdGFuZGFyZFByb3BzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmVTdGFydChkZWx0YUlucHV0KSB7XG4gICAgICAgIGxldCBkZWx0YSA9IGNyZWF0ZUR1cmF0aW9uKGRlbHRhSW5wdXQpO1xuICAgICAgICBpZiAoZGVsdGEpIHsgLy8gVE9ETzogd2FybmluZyBpZiBwYXJzZWQgYmFkXG4gICAgICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YXJ0RGVsdGE6IGRlbHRhIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1vdmVFbmQoZGVsdGFJbnB1dCkge1xuICAgICAgICBsZXQgZGVsdGEgPSBjcmVhdGVEdXJhdGlvbihkZWx0YUlucHV0KTtcbiAgICAgICAgaWYgKGRlbHRhKSB7IC8vIFRPRE86IHdhcm5pbmcgaWYgcGFyc2VkIGJhZFxuICAgICAgICAgICAgdGhpcy5tdXRhdGUoeyBlbmREZWx0YTogZGVsdGEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbW92ZURhdGVzKGRlbHRhSW5wdXQpIHtcbiAgICAgICAgbGV0IGRlbHRhID0gY3JlYXRlRHVyYXRpb24oZGVsdGFJbnB1dCk7XG4gICAgICAgIGlmIChkZWx0YSkgeyAvLyBUT0RPOiB3YXJuaW5nIGlmIHBhcnNlZCBiYWRcbiAgICAgICAgICAgIHRoaXMubXV0YXRlKHsgZGF0ZXNEZWx0YTogZGVsdGEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QWxsRGF5KGFsbERheSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGxldCBzdGFuZGFyZFByb3BzID0geyBhbGxEYXkgfTtcbiAgICAgICAgbGV0IHsgbWFpbnRhaW5EdXJhdGlvbiB9ID0gb3B0aW9ucztcbiAgICAgICAgaWYgKG1haW50YWluRHVyYXRpb24gPT0gbnVsbCkge1xuICAgICAgICAgICAgbWFpbnRhaW5EdXJhdGlvbiA9IHRoaXMuX2NvbnRleHQub3B0aW9ucy5hbGxEYXlNYWludGFpbkR1cmF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYuYWxsRGF5ICE9PSBhbGxEYXkpIHtcbiAgICAgICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gbWFpbnRhaW5EdXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm11dGF0ZSh7IHN0YW5kYXJkUHJvcHMgfSk7XG4gICAgfVxuICAgIGZvcm1hdFJhbmdlKGZvcm1hdElucHV0KSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICBsZXQgZm9ybWF0dGVyID0gY3JlYXRlRm9ybWF0dGVyKGZvcm1hdElucHV0KTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5oYXNFbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdFJhbmdlKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCBpbnN0YW5jZS5yYW5nZS5lbmQsIGZvcm1hdHRlciwge1xuICAgICAgICAgICAgICAgIGZvcmNlZFN0YXJ0VHpvOiBpbnN0YW5jZS5mb3JjZWRTdGFydFR6byxcbiAgICAgICAgICAgICAgICBmb3JjZWRFbmRUem86IGluc3RhbmNlLmZvcmNlZEVuZFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRlRW52LmZvcm1hdChpbnN0YW5jZS5yYW5nZS5zdGFydCwgZm9ybWF0dGVyLCB7XG4gICAgICAgICAgICBmb3JjZWRUem86IGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbXV0YXRlKG11dGF0aW9uKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGxldCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgICAgICBsZXQgY29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICAgICAgICBsZXQgeyBldmVudFN0b3JlIH0gPSBjb250ZXh0LmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgICAgICBsZXQgcmVsZXZhbnRFdmVudHMgPSBnZXRSZWxldmFudEV2ZW50cyhldmVudFN0b3JlLCBpbnN0YW5jZS5pbnN0YW5jZUlkKTtcbiAgICAgICAgICAgIGxldCBldmVudENvbmZpZ0Jhc2UgPSB7XG4gICAgICAgICAgICAgICAgJyc6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJycsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uRWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcnLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVzOiBbXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlbGV2YW50RXZlbnRzID0gYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZShyZWxldmFudEV2ZW50cywgZXZlbnRDb25maWdCYXNlLCBtdXRhdGlvbiwgY29udGV4dCk7XG4gICAgICAgICAgICBsZXQgb2xkRXZlbnQgPSBuZXcgRXZlbnRJbXBsKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpOyAvLyBzbmFwc2hvdFxuICAgICAgICAgICAgdGhpcy5fZGVmID0gcmVsZXZhbnRFdmVudHMuZGVmc1tkZWYuZGVmSWRdO1xuICAgICAgICAgICAgdGhpcy5faW5zdGFuY2UgPSByZWxldmFudEV2ZW50cy5pbnN0YW5jZXNbaW5zdGFuY2UuaW5zdGFuY2VJZF07XG4gICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywge1xuICAgICAgICAgICAgICAgIG9sZEV2ZW50LFxuICAgICAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGJ1aWxkRXZlbnRBcGlzKHJlbGV2YW50RXZlbnRzLCBjb250ZXh0LCBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgcmV2ZXJ0KCkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRVNFVF9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZSwgLy8gdGhlIE9SSUdJTkFMIHN0b3JlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5fY29udGV4dDtcbiAgICAgICAgbGV0IGFzU3RvcmUgPSBldmVudEFwaVRvU3RvcmUodGhpcyk7XG4gICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgZXZlbnRTdG9yZTogYXNTdG9yZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlbW92ZScsIHtcbiAgICAgICAgICAgIGV2ZW50OiB0aGlzLFxuICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogW10sXG4gICAgICAgICAgICByZXZlcnQoKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBhc1N0b3JlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBzb3VyY2UoKSB7XG4gICAgICAgIGxldCB7IHNvdXJjZUlkIH0gPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChzb3VyY2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZUltcGwodGhpcy5fY29udGV4dCwgdGhpcy5fY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50U291cmNlc1tzb3VyY2VJZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXQgc3RhcnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSA/XG4gICAgICAgICAgICB0aGlzLl9jb250ZXh0LmRhdGVFbnYudG9EYXRlKHRoaXMuX2luc3RhbmNlLnJhbmdlLnN0YXJ0KSA6XG4gICAgICAgICAgICBudWxsO1xuICAgIH1cbiAgICBnZXQgZW5kKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2RlZi5oYXNFbmQpID9cbiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuZGF0ZUVudi50b0RhdGUodGhpcy5faW5zdGFuY2UucmFuZ2UuZW5kKSA6XG4gICAgICAgICAgICBudWxsO1xuICAgIH1cbiAgICBnZXQgc3RhcnRTdHIoKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZXh0LmRhdGVFbnYuZm9ybWF0SXNvKGluc3RhbmNlLnJhbmdlLnN0YXJ0LCB7XG4gICAgICAgICAgICAgICAgb21pdFRpbWU6IHRoaXMuX2RlZi5hbGxEYXksXG4gICAgICAgICAgICAgICAgZm9yY2VkVHpvOiBpbnN0YW5jZS5mb3JjZWRTdGFydFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgZ2V0IGVuZFN0cigpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIGlmIChpbnN0YW5jZSAmJiB0aGlzLl9kZWYuaGFzRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGV4dC5kYXRlRW52LmZvcm1hdElzbyhpbnN0YW5jZS5yYW5nZS5lbmQsIHtcbiAgICAgICAgICAgICAgICBvbWl0VGltZTogdGhpcy5fZGVmLmFsbERheSxcbiAgICAgICAgICAgICAgICBmb3JjZWRUem86IGluc3RhbmNlLmZvcmNlZEVuZFR6byxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgLy8gY29tcHV0YWJsZSBwcm9wcyB0aGF0IGFsbCBhY2Nlc3MgdGhlIGRlZlxuICAgIC8vIFRPRE86IGZpbmQgYSBUeXBlU2NyaXB0LWNvbXBhdGlibGUgd2F5IHRvIGRvIHRoaXMgYXQgc2NhbGVcbiAgICBnZXQgaWQoKSB7IHJldHVybiB0aGlzLl9kZWYucHVibGljSWQ7IH1cbiAgICBnZXQgZ3JvdXBJZCgpIHsgcmV0dXJuIHRoaXMuX2RlZi5ncm91cElkOyB9XG4gICAgZ2V0IGFsbERheSgpIHsgcmV0dXJuIHRoaXMuX2RlZi5hbGxEYXk7IH1cbiAgICBnZXQgdGl0bGUoKSB7IHJldHVybiB0aGlzLl9kZWYudGl0bGU7IH1cbiAgICBnZXQgdXJsKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVybDsgfVxuICAgIGdldCBkaXNwbGF5KCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmRpc3BsYXkgfHwgJ2F1dG8nOyB9IC8vIGJhZC4ganVzdCBub3JtYWxpemUgdGhlIHR5cGUgZWFybGllclxuICAgIGdldCBzdGFydEVkaXRhYmxlKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLnN0YXJ0RWRpdGFibGU7IH1cbiAgICBnZXQgZHVyYXRpb25FZGl0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5kdXJhdGlvbkVkaXRhYmxlOyB9XG4gICAgZ2V0IGNvbnN0cmFpbnQoKSB7IHJldHVybiB0aGlzLl9kZWYudWkuY29uc3RyYWludHNbMF0gfHwgbnVsbDsgfVxuICAgIGdldCBvdmVybGFwKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLm92ZXJsYXA7IH1cbiAgICBnZXQgYWxsb3coKSB7IHJldHVybiB0aGlzLl9kZWYudWkuYWxsb3dzWzBdIHx8IG51bGw7IH1cbiAgICBnZXQgYmFja2dyb3VuZENvbG9yKCkgeyByZXR1cm4gdGhpcy5fZGVmLnVpLmJhY2tncm91bmRDb2xvcjsgfVxuICAgIGdldCBib3JkZXJDb2xvcigpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5ib3JkZXJDb2xvcjsgfVxuICAgIGdldCB0ZXh0Q29sb3IoKSB7IHJldHVybiB0aGlzLl9kZWYudWkudGV4dENvbG9yOyB9XG4gICAgLy8gTk9URTogdXNlciBjYW4ndCBtb2RpZnkgdGhlc2UgYmVjYXVzZSBPYmplY3QuZnJlZXplIHdhcyBjYWxsZWQgaW4gZXZlbnQtZGVmIHBhcnNpbmdcbiAgICBnZXQgY2xhc3NOYW1lcygpIHsgcmV0dXJuIHRoaXMuX2RlZi51aS5jbGFzc05hbWVzOyB9XG4gICAgZ2V0IGV4dGVuZGVkUHJvcHMoKSB7IHJldHVybiB0aGlzLl9kZWYuZXh0ZW5kZWRQcm9wczsgfVxuICAgIHRvUGxhaW5PYmplY3Qoc2V0dGluZ3MgPSB7fSkge1xuICAgICAgICBsZXQgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBsZXQgeyB1aSB9ID0gZGVmO1xuICAgICAgICBsZXQgeyBzdGFydFN0ciwgZW5kU3RyIH0gPSB0aGlzO1xuICAgICAgICBsZXQgcmVzID0ge1xuICAgICAgICAgICAgYWxsRGF5OiBkZWYuYWxsRGF5LFxuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVmLnRpdGxlKSB7XG4gICAgICAgICAgICByZXMudGl0bGUgPSBkZWYudGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0U3RyKSB7XG4gICAgICAgICAgICByZXMuc3RhcnQgPSBzdGFydFN0cjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kU3RyKSB7XG4gICAgICAgICAgICByZXMuZW5kID0gZW5kU3RyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYucHVibGljSWQpIHtcbiAgICAgICAgICAgIHJlcy5pZCA9IGRlZi5wdWJsaWNJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmdyb3VwSWQpIHtcbiAgICAgICAgICAgIHJlcy5ncm91cElkID0gZGVmLmdyb3VwSWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi51cmwpIHtcbiAgICAgICAgICAgIHJlcy51cmwgPSBkZWYudXJsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1aS5kaXNwbGF5ICYmIHVpLmRpc3BsYXkgIT09ICdhdXRvJykge1xuICAgICAgICAgICAgcmVzLmRpc3BsYXkgPSB1aS5kaXNwbGF5O1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IHdoYXQgYWJvdXQgcmVjdXJyaW5nLWV2ZW50IHByb3BlcnRpZXM/Pz9cbiAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBzdGFydEVkaXRhYmxlL2R1cmF0aW9uRWRpdGFibGUvY29uc3RyYWludC9vdmVybGFwL2FsbG93XG4gICAgICAgIGlmIChzZXR0aW5ncy5jb2xsYXBzZUNvbG9yICYmIHVpLmJhY2tncm91bmRDb2xvciAmJiB1aS5iYWNrZ3JvdW5kQ29sb3IgPT09IHVpLmJvcmRlckNvbG9yKSB7XG4gICAgICAgICAgICByZXMuY29sb3IgPSB1aS5iYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodWkuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICAgICAgcmVzLmJhY2tncm91bmRDb2xvciA9IHVpLmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1aS5ib3JkZXJDb2xvcikge1xuICAgICAgICAgICAgICAgIHJlcy5ib3JkZXJDb2xvciA9IHVpLmJvcmRlckNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh1aS50ZXh0Q29sb3IpIHtcbiAgICAgICAgICAgIHJlcy50ZXh0Q29sb3IgPSB1aS50ZXh0Q29sb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVpLmNsYXNzTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXMuY2xhc3NOYW1lcyA9IHVpLmNsYXNzTmFtZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRlZi5leHRlbmRlZFByb3BzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jb2xsYXBzZUV4dGVuZGVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHJlcywgZGVmLmV4dGVuZGVkUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzLmV4dGVuZGVkUHJvcHMgPSBkZWYuZXh0ZW5kZWRQcm9wcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvUGxhaW5PYmplY3QoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBldmVudEFwaVRvU3RvcmUoZXZlbnRBcGkpIHtcbiAgICBsZXQgZGVmID0gZXZlbnRBcGkuX2RlZjtcbiAgICBsZXQgaW5zdGFuY2UgPSBldmVudEFwaS5faW5zdGFuY2U7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogeyBbZGVmLmRlZklkXTogZGVmIH0sXG4gICAgICAgIGluc3RhbmNlczogaW5zdGFuY2VcbiAgICAgICAgICAgID8geyBbaW5zdGFuY2UuaW5zdGFuY2VJZF06IGluc3RhbmNlIH1cbiAgICAgICAgICAgIDoge30sXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRBcGlzKGV2ZW50U3RvcmUsIGNvbnRleHQsIGV4Y2x1ZGVJbnN0YW5jZSkge1xuICAgIGxldCB7IGRlZnMsIGluc3RhbmNlcyB9ID0gZXZlbnRTdG9yZTtcbiAgICBsZXQgZXZlbnRBcGlzID0gW107XG4gICAgbGV0IGV4Y2x1ZGVJbnN0YW5jZUlkID0gZXhjbHVkZUluc3RhbmNlID8gZXhjbHVkZUluc3RhbmNlLmluc3RhbmNlSWQgOiAnJztcbiAgICBmb3IgKGxldCBpZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VzW2lkXTtcbiAgICAgICAgbGV0IGRlZiA9IGRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBpZiAoaW5zdGFuY2UuaW5zdGFuY2VJZCAhPT0gZXhjbHVkZUluc3RhbmNlSWQpIHtcbiAgICAgICAgICAgIGV2ZW50QXBpcy5wdXNoKG5ldyBFdmVudEltcGwoY29udGV4dCwgZGVmLCBpbnN0YW5jZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudEFwaXM7XG59XG5cbi8qXG5TcGVjaWZ5aW5nIG5leHREYXlUaHJlc2hvbGQgc2lnbmFscyB0aGF0IGFsbC1kYXkgcmFuZ2VzIHNob3VsZCBiZSBzbGljZWQuXG4qL1xuZnVuY3Rpb24gc2xpY2VFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgZnJhbWluZ1JhbmdlLCBuZXh0RGF5VGhyZXNob2xkKSB7XG4gICAgbGV0IGludmVyc2VCZ0J5R3JvdXBJZCA9IHt9O1xuICAgIGxldCBpbnZlcnNlQmdCeURlZklkID0ge307XG4gICAgbGV0IGRlZkJ5R3JvdXBJZCA9IHt9O1xuICAgIGxldCBiZ1JhbmdlcyA9IFtdO1xuICAgIGxldCBmZ1JhbmdlcyA9IFtdO1xuICAgIGxldCBldmVudFVpcyA9IGNvbXBpbGVFdmVudFVpcyhldmVudFN0b3JlLmRlZnMsIGV2ZW50VWlCYXNlcyk7XG4gICAgZm9yIChsZXQgZGVmSWQgaW4gZXZlbnRTdG9yZS5kZWZzKSB7XG4gICAgICAgIGxldCBkZWYgPSBldmVudFN0b3JlLmRlZnNbZGVmSWRdO1xuICAgICAgICBsZXQgdWkgPSBldmVudFVpc1tkZWYuZGVmSWRdO1xuICAgICAgICBpZiAodWkuZGlzcGxheSA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCcpIHtcbiAgICAgICAgICAgIGlmIChkZWYuZ3JvdXBJZCkge1xuICAgICAgICAgICAgICAgIGludmVyc2VCZ0J5R3JvdXBJZFtkZWYuZ3JvdXBJZF0gPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoIWRlZkJ5R3JvdXBJZFtkZWYuZ3JvdXBJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmQnlHcm91cElkW2RlZi5ncm91cElkXSA9IGRlZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeURlZklkW2RlZklkXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGluc3RhbmNlSWQgaW4gZXZlbnRTdG9yZS5pbnN0YW5jZXMpIHtcbiAgICAgICAgbGV0IGluc3RhbmNlID0gZXZlbnRTdG9yZS5pbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gICAgICAgIGxldCBkZWYgPSBldmVudFN0b3JlLmRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBsZXQgdWkgPSBldmVudFVpc1tkZWYuZGVmSWRdO1xuICAgICAgICBsZXQgb3JpZ1JhbmdlID0gaW5zdGFuY2UucmFuZ2U7XG4gICAgICAgIGxldCBub3JtYWxSYW5nZSA9ICghZGVmLmFsbERheSAmJiBuZXh0RGF5VGhyZXNob2xkKSA/XG4gICAgICAgICAgICBjb21wdXRlVmlzaWJsZURheVJhbmdlKG9yaWdSYW5nZSwgbmV4dERheVRocmVzaG9sZCkgOlxuICAgICAgICAgICAgb3JpZ1JhbmdlO1xuICAgICAgICBsZXQgc2xpY2VkUmFuZ2UgPSBpbnRlcnNlY3RSYW5nZXMobm9ybWFsUmFuZ2UsIGZyYW1pbmdSYW5nZSk7XG4gICAgICAgIGlmIChzbGljZWRSYW5nZSkge1xuICAgICAgICAgICAgaWYgKHVpLmRpc3BsYXkgPT09ICdpbnZlcnNlLWJhY2tncm91bmQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZi5ncm91cElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmVyc2VCZ0J5R3JvdXBJZFtkZWYuZ3JvdXBJZF0ucHVzaChzbGljZWRSYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnZlcnNlQmdCeURlZklkW2luc3RhbmNlLmRlZklkXS5wdXNoKHNsaWNlZFJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1aS5kaXNwbGF5ICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAodWkuZGlzcGxheSA9PT0gJ2JhY2tncm91bmQnID8gYmdSYW5nZXMgOiBmZ1JhbmdlcykucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGRlZixcbiAgICAgICAgICAgICAgICAgICAgdWksXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICByYW5nZTogc2xpY2VkUmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IG5vcm1hbFJhbmdlLnN0YXJ0ICYmIG5vcm1hbFJhbmdlLnN0YXJ0LnZhbHVlT2YoKSA9PT0gc2xpY2VkUmFuZ2Uuc3RhcnQudmFsdWVPZigpLFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogbm9ybWFsUmFuZ2UuZW5kICYmIG5vcm1hbFJhbmdlLmVuZC52YWx1ZU9mKCkgPT09IHNsaWNlZFJhbmdlLmVuZC52YWx1ZU9mKCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgZ3JvdXBJZCBpbiBpbnZlcnNlQmdCeUdyb3VwSWQpIHsgLy8gQlkgR1JPVVBcbiAgICAgICAgbGV0IHJhbmdlcyA9IGludmVyc2VCZ0J5R3JvdXBJZFtncm91cElkXTtcbiAgICAgICAgbGV0IGludmVydGVkUmFuZ2VzID0gaW52ZXJ0UmFuZ2VzKHJhbmdlcywgZnJhbWluZ1JhbmdlKTtcbiAgICAgICAgZm9yIChsZXQgaW52ZXJ0ZWRSYW5nZSBvZiBpbnZlcnRlZFJhbmdlcykge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGRlZkJ5R3JvdXBJZFtncm91cElkXTtcbiAgICAgICAgICAgIGxldCB1aSA9IGV2ZW50VWlzW2RlZi5kZWZJZF07XG4gICAgICAgICAgICBiZ1Jhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBkZWYsXG4gICAgICAgICAgICAgICAgdWksXG4gICAgICAgICAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGludmVydGVkUmFuZ2UsXG4gICAgICAgICAgICAgICAgaXNTdGFydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNFbmQ6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgZGVmSWQgaW4gaW52ZXJzZUJnQnlEZWZJZCkge1xuICAgICAgICBsZXQgcmFuZ2VzID0gaW52ZXJzZUJnQnlEZWZJZFtkZWZJZF07XG4gICAgICAgIGxldCBpbnZlcnRlZFJhbmdlcyA9IGludmVydFJhbmdlcyhyYW5nZXMsIGZyYW1pbmdSYW5nZSk7XG4gICAgICAgIGZvciAobGV0IGludmVydGVkUmFuZ2Ugb2YgaW52ZXJ0ZWRSYW5nZXMpIHtcbiAgICAgICAgICAgIGJnUmFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgIGRlZjogZXZlbnRTdG9yZS5kZWZzW2RlZklkXSxcbiAgICAgICAgICAgICAgICB1aTogZXZlbnRVaXNbZGVmSWRdLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBpbnZlcnRlZFJhbmdlLFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzRW5kOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGJnOiBiZ1JhbmdlcywgZmc6IGZnUmFuZ2VzIH07XG59XG5mdW5jdGlvbiBoYXNCZ1JlbmRlcmluZyhkZWYpIHtcbiAgICByZXR1cm4gZGVmLnVpLmRpc3BsYXkgPT09ICdiYWNrZ3JvdW5kJyB8fCBkZWYudWkuZGlzcGxheSA9PT0gJ2ludmVyc2UtYmFja2dyb3VuZCc7XG59XG5mdW5jdGlvbiBzZXRFbFNlZyhlbCwgc2VnKSB7XG4gICAgZWwuZmNTZWcgPSBzZWc7XG59XG5mdW5jdGlvbiBnZXRFbFNlZyhlbCkge1xuICAgIHJldHVybiBlbC5mY1NlZyB8fFxuICAgICAgICBlbC5wYXJlbnROb2RlLmZjU2VnIHx8IC8vIGZvciB0aGUgaGFybmVzc1xuICAgICAgICBudWxsO1xufVxuLy8gZXZlbnQgdWkgY29tcHV0YXRpb25cbmZ1bmN0aW9uIGNvbXBpbGVFdmVudFVpcyhldmVudERlZnMsIGV2ZW50VWlCYXNlcykge1xuICAgIHJldHVybiBtYXBIYXNoKGV2ZW50RGVmcywgKGV2ZW50RGVmKSA9PiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKSk7XG59XG5mdW5jdGlvbiBjb21waWxlRXZlbnRVaShldmVudERlZiwgZXZlbnRVaUJhc2VzKSB7XG4gICAgbGV0IHVpcyA9IFtdO1xuICAgIGlmIChldmVudFVpQmFzZXNbJyddKSB7XG4gICAgICAgIHVpcy5wdXNoKGV2ZW50VWlCYXNlc1snJ10pO1xuICAgIH1cbiAgICBpZiAoZXZlbnRVaUJhc2VzW2V2ZW50RGVmLmRlZklkXSkge1xuICAgICAgICB1aXMucHVzaChldmVudFVpQmFzZXNbZXZlbnREZWYuZGVmSWRdKTtcbiAgICB9XG4gICAgdWlzLnB1c2goZXZlbnREZWYudWkpO1xuICAgIHJldHVybiBjb21iaW5lRXZlbnRVaXModWlzKTtcbn1cbmZ1bmN0aW9uIHNvcnRFdmVudFNlZ3Moc2VncywgZXZlbnRPcmRlclNwZWNzKSB7XG4gICAgbGV0IG9ianMgPSBzZWdzLm1hcChidWlsZFNlZ0NvbXBhcmVPYmopO1xuICAgIG9ianMuc29ydCgob2JqMCwgb2JqMSkgPT4gY29tcGFyZUJ5RmllbGRTcGVjcyhvYmowLCBvYmoxLCBldmVudE9yZGVyU3BlY3MpKTtcbiAgICByZXR1cm4gb2Jqcy5tYXAoKGMpID0+IGMuX3NlZyk7XG59XG4vLyByZXR1cm5zIGEgb2JqZWN0IHdpdGggYWxsIHByaW1pdGl2ZSBwcm9wcyB0aGF0IGNhbiBiZSBjb21wYXJlZFxuZnVuY3Rpb24gYnVpbGRTZWdDb21wYXJlT2JqKHNlZykge1xuICAgIGxldCB7IGV2ZW50UmFuZ2UgfSA9IHNlZztcbiAgICBsZXQgZXZlbnREZWYgPSBldmVudFJhbmdlLmRlZjtcbiAgICBsZXQgcmFuZ2UgPSBldmVudFJhbmdlLmluc3RhbmNlID8gZXZlbnRSYW5nZS5pbnN0YW5jZS5yYW5nZSA6IGV2ZW50UmFuZ2UucmFuZ2U7XG4gICAgbGV0IHN0YXJ0ID0gcmFuZ2Uuc3RhcnQgPyByYW5nZS5zdGFydC52YWx1ZU9mKCkgOiAwOyAvLyBUT0RPOiBiZXR0ZXIgc3VwcG9ydCBmb3Igb3Blbi1yYW5nZSBldmVudHNcbiAgICBsZXQgZW5kID0gcmFuZ2UuZW5kID8gcmFuZ2UuZW5kLnZhbHVlT2YoKSA6IDA7IC8vIFwiXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudERlZi5leHRlbmRlZFByb3BzKSwgZXZlbnREZWYpLCB7IGlkOiBldmVudERlZi5wdWJsaWNJZCwgc3RhcnQsXG4gICAgICAgIGVuZCwgZHVyYXRpb246IGVuZCAtIHN0YXJ0LCBhbGxEYXk6IE51bWJlcihldmVudERlZi5hbGxEYXkpLCBfc2VnOiBzZWcgfSk7XG59XG5mdW5jdGlvbiBjb21wdXRlU2VnRHJhZ2dhYmxlKHNlZywgY29udGV4dCkge1xuICAgIGxldCB7IHBsdWdpbkhvb2tzIH0gPSBjb250ZXh0O1xuICAgIGxldCB0cmFuc2Zvcm1lcnMgPSBwbHVnaW5Ib29rcy5pc0RyYWdnYWJsZVRyYW5zZm9ybWVycztcbiAgICBsZXQgeyBkZWYsIHVpIH0gPSBzZWcuZXZlbnRSYW5nZTtcbiAgICBsZXQgdmFsID0gdWkuc3RhcnRFZGl0YWJsZTtcbiAgICBmb3IgKGxldCB0cmFuc2Zvcm1lciBvZiB0cmFuc2Zvcm1lcnMpIHtcbiAgICAgICAgdmFsID0gdHJhbnNmb3JtZXIodmFsLCBkZWYsIHVpLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVTZWdTdGFydFJlc2l6YWJsZShzZWcsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gc2VnLmlzU3RhcnQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZSAmJiBjb250ZXh0Lm9wdGlvbnMuZXZlbnRSZXNpemFibGVGcm9tU3RhcnQ7XG59XG5mdW5jdGlvbiBjb21wdXRlU2VnRW5kUmVzaXphYmxlKHNlZywgY29udGV4dCkge1xuICAgIHJldHVybiBzZWcuaXNFbmQgJiYgc2VnLmV2ZW50UmFuZ2UudWkuZHVyYXRpb25FZGl0YWJsZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBkZWZhdWx0RGlzcGxheUV2ZW50VGltZSwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuZGVmYXVsdERpc3BsYXlFdmVudEVuZCwgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuc3RhcnRPdmVycmlkZSwgZW5kT3ZlcnJpZGUpIHtcbiAgICBsZXQgeyBkYXRlRW52LCBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCB7IGRpc3BsYXlFdmVudFRpbWUsIGRpc3BsYXlFdmVudEVuZCB9ID0gb3B0aW9ucztcbiAgICBsZXQgZXZlbnREZWYgPSBzZWcuZXZlbnRSYW5nZS5kZWY7XG4gICAgbGV0IGV2ZW50SW5zdGFuY2UgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZTtcbiAgICBpZiAoZGlzcGxheUV2ZW50VGltZSA9PSBudWxsKSB7XG4gICAgICAgIGRpc3BsYXlFdmVudFRpbWUgPSBkZWZhdWx0RGlzcGxheUV2ZW50VGltZSAhPT0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChkaXNwbGF5RXZlbnRFbmQgPT0gbnVsbCkge1xuICAgICAgICBkaXNwbGF5RXZlbnRFbmQgPSBkZWZhdWx0RGlzcGxheUV2ZW50RW5kICE9PSBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHdob2xlRXZlbnRTdGFydCA9IGV2ZW50SW5zdGFuY2UucmFuZ2Uuc3RhcnQ7XG4gICAgbGV0IHdob2xlRXZlbnRFbmQgPSBldmVudEluc3RhbmNlLnJhbmdlLmVuZDtcbiAgICBsZXQgc2VnU3RhcnQgPSBzdGFydE92ZXJyaWRlIHx8IHNlZy5zdGFydCB8fCBzZWcuZXZlbnRSYW5nZS5yYW5nZS5zdGFydDtcbiAgICBsZXQgc2VnRW5kID0gZW5kT3ZlcnJpZGUgfHwgc2VnLmVuZCB8fCBzZWcuZXZlbnRSYW5nZS5yYW5nZS5lbmQ7XG4gICAgbGV0IGlzU3RhcnREYXkgPSBzdGFydE9mRGF5KHdob2xlRXZlbnRTdGFydCkudmFsdWVPZigpID09PSBzdGFydE9mRGF5KHNlZ1N0YXJ0KS52YWx1ZU9mKCk7XG4gICAgbGV0IGlzRW5kRGF5ID0gc3RhcnRPZkRheShhZGRNcyh3aG9sZUV2ZW50RW5kLCAtMSkpLnZhbHVlT2YoKSA9PT0gc3RhcnRPZkRheShhZGRNcyhzZWdFbmQsIC0xKSkudmFsdWVPZigpO1xuICAgIGlmIChkaXNwbGF5RXZlbnRUaW1lICYmICFldmVudERlZi5hbGxEYXkgJiYgKGlzU3RhcnREYXkgfHwgaXNFbmREYXkpKSB7XG4gICAgICAgIHNlZ1N0YXJ0ID0gaXNTdGFydERheSA/IHdob2xlRXZlbnRTdGFydCA6IHNlZ1N0YXJ0O1xuICAgICAgICBzZWdFbmQgPSBpc0VuZERheSA/IHdob2xlRXZlbnRFbmQgOiBzZWdFbmQ7XG4gICAgICAgIGlmIChkaXNwbGF5RXZlbnRFbmQgJiYgZXZlbnREZWYuaGFzRW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZUVudi5mb3JtYXRSYW5nZShzZWdTdGFydCwgc2VnRW5kLCB0aW1lRm9ybWF0LCB7XG4gICAgICAgICAgICAgICAgZm9yY2VkU3RhcnRUem86IHN0YXJ0T3ZlcnJpZGUgPyBudWxsIDogZXZlbnRJbnN0YW5jZS5mb3JjZWRTdGFydFR6byxcbiAgICAgICAgICAgICAgICBmb3JjZWRFbmRUem86IGVuZE92ZXJyaWRlID8gbnVsbCA6IGV2ZW50SW5zdGFuY2UuZm9yY2VkRW5kVHpvLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KHNlZ1N0YXJ0LCB0aW1lRm9ybWF0LCB7XG4gICAgICAgICAgICBmb3JjZWRUem86IHN0YXJ0T3ZlcnJpZGUgPyBudWxsIDogZXZlbnRJbnN0YW5jZS5mb3JjZWRTdGFydFR6bywgLy8gbm9vb29vLCBzYW1lXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG59XG5mdW5jdGlvbiBnZXRTZWdNZXRhKHNlZywgdG9kYXlSYW5nZSwgbm93RGF0ZSkge1xuICAgIGxldCBzZWdSYW5nZSA9IHNlZy5ldmVudFJhbmdlLnJhbmdlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGlzUGFzdDogc2VnUmFuZ2UuZW5kIDwgKG5vd0RhdGUgfHwgdG9kYXlSYW5nZS5zdGFydCksXG4gICAgICAgIGlzRnV0dXJlOiBzZWdSYW5nZS5zdGFydCA+PSAobm93RGF0ZSB8fCB0b2RheVJhbmdlLmVuZCksXG4gICAgICAgIGlzVG9kYXk6IHRvZGF5UmFuZ2UgJiYgcmFuZ2VDb250YWluc01hcmtlcih0b2RheVJhbmdlLCBzZWdSYW5nZS5zdGFydCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGdldEV2ZW50Q2xhc3NOYW1lcyhwcm9wcykge1xuICAgIGxldCBjbGFzc05hbWVzID0gWydmYy1ldmVudCddO1xuICAgIGlmIChwcm9wcy5pc01pcnJvcikge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LW1pcnJvcicpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNEcmFnZ2FibGUpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1kcmFnZ2FibGUnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzU3RhcnRSZXNpemFibGUgfHwgcHJvcHMuaXNFbmRSZXNpemFibGUpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1yZXNpemFibGUnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1kcmFnZ2luZycpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNSZXNpemluZykge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LXJlc2l6aW5nJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtZXZlbnQtc2VsZWN0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzU3RhcnQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1zdGFydCcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNFbmQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1lbmQnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzUGFzdCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLWV2ZW50LXBhc3QnKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmlzVG9kYXkpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC10b2RheScpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuaXNGdXR1cmUpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1ldmVudC1mdXR1cmUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXM7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50UmFuZ2VLZXkoZXZlbnRSYW5nZSkge1xuICAgIHJldHVybiBldmVudFJhbmdlLmluc3RhbmNlXG4gICAgICAgID8gZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkXG4gICAgICAgIDogYCR7ZXZlbnRSYW5nZS5kZWYuZGVmSWR9OiR7ZXZlbnRSYW5nZS5yYW5nZS5zdGFydC50b0lTT1N0cmluZygpfWA7XG4gICAgLy8gaW52ZXJzZS1iYWNrZ3JvdW5kIGV2ZW50cyBkb24ndCBoYXZlIHNwZWNpZmljIGluc3RhbmNlcy4gVE9ETzogYmV0dGVyIHNvbHV0aW9uXG59XG5mdW5jdGlvbiBnZXRTZWdBbmNob3JBdHRycyhzZWcsIGNvbnRleHQpIHtcbiAgICBsZXQgeyBkZWYsIGluc3RhbmNlIH0gPSBzZWcuZXZlbnRSYW5nZTtcbiAgICBsZXQgeyB1cmwgfSA9IGRlZjtcbiAgICBpZiAodXJsKSB7XG4gICAgICAgIHJldHVybiB7IGhyZWY6IHVybCB9O1xuICAgIH1cbiAgICBsZXQgeyBlbWl0dGVyLCBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgIGxldCB7IGV2ZW50SW50ZXJhY3RpdmUgfSA9IG9wdGlvbnM7XG4gICAgaWYgKGV2ZW50SW50ZXJhY3RpdmUgPT0gbnVsbCkge1xuICAgICAgICBldmVudEludGVyYWN0aXZlID0gZGVmLmludGVyYWN0aXZlO1xuICAgICAgICBpZiAoZXZlbnRJbnRlcmFjdGl2ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBldmVudEludGVyYWN0aXZlID0gQm9vbGVhbihlbWl0dGVyLmhhc0hhbmRsZXJzKCdldmVudENsaWNrJykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG1vY2sgd2hhdCBoYXBwZW5zIGluIEV2ZW50Q2xpY2tpbmdcbiAgICBpZiAoZXZlbnRJbnRlcmFjdGl2ZSkge1xuICAgICAgICAvLyBvbmx5IGF0dGFjaCBrZXlib2FyZC1yZWxhdGVkIGhhbmRsZXJzIGJlY2F1c2UgY2xpY2sgaGFuZGxlciBpcyBhbHJlYWR5IGRvbmUgaW4gRXZlbnRDbGlja2luZ1xuICAgICAgICByZXR1cm4gY3JlYXRlQXJpYUtleWJvYXJkQXR0cnMoKGV2KSA9PiB7XG4gICAgICAgICAgICBlbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2xpY2snLCB7XG4gICAgICAgICAgICAgICAgZWw6IGV2LnRhcmdldCxcbiAgICAgICAgICAgICAgICBldmVudDogbmV3IEV2ZW50SW1wbChjb250ZXh0LCBkZWYsIGluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICB2aWV3OiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cblxuY29uc3QgU1RBTkRBUkRfUFJPUFMgPSB7XG4gICAgc3RhcnQ6IGlkZW50aXR5LFxuICAgIGVuZDogaWRlbnRpdHksXG4gICAgYWxsRGF5OiBCb29sZWFuLFxufTtcbmZ1bmN0aW9uIHBhcnNlRGF0ZVNwYW4ocmF3LCBkYXRlRW52LCBkZWZhdWx0RHVyYXRpb24pIHtcbiAgICBsZXQgc3BhbiA9IHBhcnNlT3BlbkRhdGVTcGFuKHJhdywgZGF0ZUVudik7XG4gICAgbGV0IHsgcmFuZ2UgfSA9IHNwYW47XG4gICAgaWYgKCFyYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFyYW5nZS5lbmQpIHtcbiAgICAgICAgaWYgKGRlZmF1bHREdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByYW5nZS5lbmQgPSBkYXRlRW52LmFkZChyYW5nZS5zdGFydCwgZGVmYXVsdER1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYW47XG59XG4vKlxuVE9ETzogc29tZWhvdyBjb21iaW5lIHdpdGggcGFyc2VSYW5nZT9cbldpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHN0YXJ0L2VuZCBwcm9wcyB3ZXJlIHByZXNlbnQgYnV0IHBhcnNlZCBpbnZhbGlkbHkuXG4qL1xuZnVuY3Rpb24gcGFyc2VPcGVuRGF0ZVNwYW4ocmF3LCBkYXRlRW52KSB7XG4gICAgbGV0IHsgcmVmaW5lZDogc3RhbmRhcmRQcm9wcywgZXh0cmEgfSA9IHJlZmluZVByb3BzKHJhdywgU1RBTkRBUkRfUFJPUFMpO1xuICAgIGxldCBzdGFydE1ldGEgPSBzdGFuZGFyZFByb3BzLnN0YXJ0ID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuc3RhcnQpIDogbnVsbDtcbiAgICBsZXQgZW5kTWV0YSA9IHN0YW5kYXJkUHJvcHMuZW5kID8gZGF0ZUVudi5jcmVhdGVNYXJrZXJNZXRhKHN0YW5kYXJkUHJvcHMuZW5kKSA6IG51bGw7XG4gICAgbGV0IHsgYWxsRGF5IH0gPSBzdGFuZGFyZFByb3BzO1xuICAgIGlmIChhbGxEYXkgPT0gbnVsbCkge1xuICAgICAgICBhbGxEYXkgPSAoc3RhcnRNZXRhICYmIHN0YXJ0TWV0YS5pc1RpbWVVbnNwZWNpZmllZCkgJiZcbiAgICAgICAgICAgICghZW5kTWV0YSB8fCBlbmRNZXRhLmlzVGltZVVuc3BlY2lmaWVkKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyByYW5nZToge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0TWV0YSA/IHN0YXJ0TWV0YS5tYXJrZXIgOiBudWxsLFxuICAgICAgICAgICAgZW5kOiBlbmRNZXRhID8gZW5kTWV0YS5tYXJrZXIgOiBudWxsLFxuICAgICAgICB9LCBhbGxEYXkgfSwgZXh0cmEpO1xufVxuZnVuY3Rpb24gaXNEYXRlU3BhbnNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4gcmFuZ2VzRXF1YWwoc3BhbjAucmFuZ2UsIHNwYW4xLnJhbmdlKSAmJlxuICAgICAgICBzcGFuMC5hbGxEYXkgPT09IHNwYW4xLmFsbERheSAmJlxuICAgICAgICBpc1NwYW5Qcm9wc0VxdWFsKHNwYW4wLCBzcGFuMSk7XG59XG4vLyB0aGUgTk9OLURBVEUtUkVMQVRFRCBwcm9wc1xuZnVuY3Rpb24gaXNTcGFuUHJvcHNFcXVhbChzcGFuMCwgc3BhbjEpIHtcbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBzcGFuMSkge1xuICAgICAgICBpZiAocHJvcE5hbWUgIT09ICdyYW5nZScgJiYgcHJvcE5hbWUgIT09ICdhbGxEYXknKSB7XG4gICAgICAgICAgICBpZiAoc3BhbjBbcHJvcE5hbWVdICE9PSBzcGFuMVtwcm9wTmFtZV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYXJlIHRoZXJlIGFueSBwcm9wcyB0aGF0IHNwYW4wIGhhcyB0aGF0IHNwYW4xIERPRVNOJ1QgaGF2ZT9cbiAgICAvLyBib3RoIGhhdmUgcmFuZ2UvYWxsRGF5LCBzbyBubyBuZWVkIHRvIHNwZWNpYWwtY2FzZS5cbiAgICBmb3IgKGxldCBwcm9wTmFtZSBpbiBzcGFuMCkge1xuICAgICAgICBpZiAoIShwcm9wTmFtZSBpbiBzcGFuMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRGF0ZVNwYW5BcGkoc3BhbiwgZGF0ZUVudikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJ1aWxkUmFuZ2VBcGkoc3Bhbi5yYW5nZSwgZGF0ZUVudiwgc3Bhbi5hbGxEYXkpKSwgeyBhbGxEYXk6IHNwYW4uYWxsRGF5IH0pO1xufVxuZnVuY3Rpb24gYnVpbGRSYW5nZUFwaVdpdGhUaW1lWm9uZShyYW5nZSwgZGF0ZUVudiwgb21pdFRpbWUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBidWlsZFJhbmdlQXBpKHJhbmdlLCBkYXRlRW52LCBvbWl0VGltZSkpLCB7IHRpbWVab25lOiBkYXRlRW52LnRpbWVab25lIH0pO1xufVxuZnVuY3Rpb24gYnVpbGRSYW5nZUFwaShyYW5nZSwgZGF0ZUVudiwgb21pdFRpbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogZGF0ZUVudi50b0RhdGUocmFuZ2Uuc3RhcnQpLFxuICAgICAgICBlbmQ6IGRhdGVFbnYudG9EYXRlKHJhbmdlLmVuZCksXG4gICAgICAgIHN0YXJ0U3RyOiBkYXRlRW52LmZvcm1hdElzbyhyYW5nZS5zdGFydCwgeyBvbWl0VGltZSB9KSxcbiAgICAgICAgZW5kU3RyOiBkYXRlRW52LmZvcm1hdElzbyhyYW5nZS5lbmQsIHsgb21pdFRpbWUgfSksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGZhYnJpY2F0ZUV2ZW50UmFuZ2UoZGF0ZVNwYW4sIGV2ZW50VWlCYXNlcywgY29udGV4dCkge1xuICAgIGxldCByZXMgPSByZWZpbmVFdmVudERlZih7IGVkaXRhYmxlOiBmYWxzZSB9LCBjb250ZXh0KTtcbiAgICBsZXQgZGVmID0gcGFyc2VFdmVudERlZihyZXMucmVmaW5lZCwgcmVzLmV4dHJhLCAnJywgLy8gc291cmNlSWRcbiAgICBkYXRlU3Bhbi5hbGxEYXksIHRydWUsIC8vIGhhc0VuZFxuICAgIGNvbnRleHQpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGRlZixcbiAgICAgICAgdWk6IGNvbXBpbGVFdmVudFVpKGRlZiwgZXZlbnRVaUJhc2VzKSxcbiAgICAgICAgaW5zdGFuY2U6IGNyZWF0ZUV2ZW50SW5zdGFuY2UoZGVmLmRlZklkLCBkYXRlU3Bhbi5yYW5nZSksXG4gICAgICAgIHJhbmdlOiBkYXRlU3Bhbi5yYW5nZSxcbiAgICAgICAgaXNTdGFydDogdHJ1ZSxcbiAgICAgICAgaXNFbmQ6IHRydWUsXG4gICAgfTtcbn1cblxubGV0IGNhbGVuZGFyU3lzdGVtQ2xhc3NNYXAgPSB7fTtcbmZ1bmN0aW9uIHJlZ2lzdGVyQ2FsZW5kYXJTeXN0ZW0obmFtZSwgdGhlQ2xhc3MpIHtcbiAgICBjYWxlbmRhclN5c3RlbUNsYXNzTWFwW25hbWVdID0gdGhlQ2xhc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVDYWxlbmRhclN5c3RlbShuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBjYWxlbmRhclN5c3RlbUNsYXNzTWFwW25hbWVdKCk7XG59XG5jbGFzcyBHcmVnb3JpYW5DYWxlbmRhclN5c3RlbSB7XG4gICAgZ2V0TWFya2VyWWVhcihkKSB7XG4gICAgICAgIHJldHVybiBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfVxuICAgIGdldE1hcmtlck1vbnRoKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuZ2V0VVRDTW9udGgoKTtcbiAgICB9XG4gICAgZ2V0TWFya2VyRGF5KGQpIHtcbiAgICAgICAgcmV0dXJuIGQuZ2V0VVRDRGF0ZSgpO1xuICAgIH1cbiAgICBhcnJheVRvTWFya2VyKGFycikge1xuICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoYXJyKTtcbiAgICB9XG4gICAgbWFya2VyVG9BcnJheShtYXJrZXIpIHtcbiAgICAgICAgcmV0dXJuIGRhdGVUb1V0Y0FycmF5KG1hcmtlcik7XG4gICAgfVxufVxucmVnaXN0ZXJDYWxlbmRhclN5c3RlbSgnZ3JlZ29yeScsIEdyZWdvcmlhbkNhbGVuZGFyU3lzdGVtKTtcblxuY29uc3QgSVNPX1JFID0gL15cXHMqKFxcZHs0fSkoLT8oXFxkezJ9KSgtPyhcXGR7Mn0pKFtUIF0oXFxkezJ9KTo/KFxcZHsyfSkoOj8oXFxkezJ9KShcXC4oXFxkKykpPyk/KFp8KChbLStdKShcXGR7Mn0pKDo/KFxcZHsyfSkpPykpPyk/KT8pPyQvO1xuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gICAgbGV0IG0gPSBJU09fUkUuZXhlYyhzdHIpO1xuICAgIGlmIChtKSB7XG4gICAgICAgIGxldCBtYXJrZXIgPSBuZXcgRGF0ZShEYXRlLlVUQyhOdW1iZXIobVsxXSksIG1bM10gPyBOdW1iZXIobVszXSkgLSAxIDogMCwgTnVtYmVyKG1bNV0gfHwgMSksIE51bWJlcihtWzddIHx8IDApLCBOdW1iZXIobVs4XSB8fCAwKSwgTnVtYmVyKG1bMTBdIHx8IDApLCBtWzEyXSA/IE51bWJlcihgMC4ke21bMTJdfWApICogMTAwMCA6IDApKTtcbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG1hcmtlcikpIHtcbiAgICAgICAgICAgIGxldCB0aW1lWm9uZU9mZnNldCA9IG51bGw7XG4gICAgICAgICAgICBpZiAobVsxM10pIHtcbiAgICAgICAgICAgICAgICB0aW1lWm9uZU9mZnNldCA9IChtWzE1XSA9PT0gJy0nID8gLTEgOiAxKSAqIChOdW1iZXIobVsxNl0gfHwgMCkgKiA2MCArXG4gICAgICAgICAgICAgICAgICAgIE51bWJlcihtWzE4XSB8fCAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1hcmtlcixcbiAgICAgICAgICAgICAgICBpc1RpbWVVbnNwZWNpZmllZDogIW1bNl0sXG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG5jbGFzcyBEYXRlRW52IHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBsZXQgdGltZVpvbmUgPSB0aGlzLnRpbWVab25lID0gc2V0dGluZ3MudGltZVpvbmU7XG4gICAgICAgIGxldCBpc05hbWVkVGltZVpvbmUgPSB0aW1lWm9uZSAhPT0gJ2xvY2FsJyAmJiB0aW1lWm9uZSAhPT0gJ1VUQyc7XG4gICAgICAgIGlmIChzZXR0aW5ncy5uYW1lZFRpbWVab25lSW1wbCAmJiBpc05hbWVkVGltZVpvbmUpIHtcbiAgICAgICAgICAgIHRoaXMubmFtZWRUaW1lWm9uZUltcGwgPSBuZXcgc2V0dGluZ3MubmFtZWRUaW1lWm9uZUltcGwodGltZVpvbmUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2FuQ29tcHV0ZU9mZnNldCA9IEJvb2xlYW4oIWlzTmFtZWRUaW1lWm9uZSB8fCB0aGlzLm5hbWVkVGltZVpvbmVJbXBsKTtcbiAgICAgICAgdGhpcy5jYWxlbmRhclN5c3RlbSA9IGNyZWF0ZUNhbGVuZGFyU3lzdGVtKHNldHRpbmdzLmNhbGVuZGFyU3lzdGVtKTtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBzZXR0aW5ncy5sb2NhbGU7XG4gICAgICAgIHRoaXMud2Vla0RvdyA9IHNldHRpbmdzLmxvY2FsZS53ZWVrLmRvdztcbiAgICAgICAgdGhpcy53ZWVrRG95ID0gc2V0dGluZ3MubG9jYWxlLndlZWsuZG95O1xuICAgICAgICBpZiAoc2V0dGluZ3Mud2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnSVNPJykge1xuICAgICAgICAgICAgdGhpcy53ZWVrRG93ID0gMTtcbiAgICAgICAgICAgIHRoaXMud2Vla0RveSA9IDQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5maXJzdERheSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMud2Vla0RvdyA9IHNldHRpbmdzLmZpcnN0RGF5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3Mud2Vla051bWJlckNhbGN1bGF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJGdW5jID0gc2V0dGluZ3Mud2Vla051bWJlckNhbGN1bGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud2Vla1RleHQgPSBzZXR0aW5ncy53ZWVrVGV4dCAhPSBudWxsID8gc2V0dGluZ3Mud2Vla1RleHQgOiBzZXR0aW5ncy5sb2NhbGUub3B0aW9ucy53ZWVrVGV4dDtcbiAgICAgICAgdGhpcy53ZWVrVGV4dExvbmcgPSAoc2V0dGluZ3Mud2Vla1RleHRMb25nICE9IG51bGwgPyBzZXR0aW5ncy53ZWVrVGV4dExvbmcgOiBzZXR0aW5ncy5sb2NhbGUub3B0aW9ucy53ZWVrVGV4dExvbmcpIHx8IHRoaXMud2Vla1RleHQ7XG4gICAgICAgIHRoaXMuY21kRm9ybWF0dGVyID0gc2V0dGluZ3MuY21kRm9ybWF0dGVyO1xuICAgICAgICB0aGlzLmRlZmF1bHRTZXBhcmF0b3IgPSBzZXR0aW5ncy5kZWZhdWx0U2VwYXJhdG9yO1xuICAgIH1cbiAgICAvLyBDcmVhdGluZyAvIFBhcnNpbmdcbiAgICBjcmVhdGVNYXJrZXIoaW5wdXQpIHtcbiAgICAgICAgbGV0IG1ldGEgPSB0aGlzLmNyZWF0ZU1hcmtlck1ldGEoaW5wdXQpO1xuICAgICAgICBpZiAobWV0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGEubWFya2VyO1xuICAgIH1cbiAgICBjcmVhdGVOb3dNYXJrZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXB1dGVPZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKG5ldyBEYXRlKCkudmFsdWVPZigpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpZiB3ZSBjYW4ndCBjb21wdXRlIHRoZSBjdXJyZW50IGRhdGUgdmFsIGZvciBhIHRpbWV6b25lLFxuICAgICAgICAvLyBiZXR0ZXIgdG8gZ2l2ZSB0aGUgY3VycmVudCBsb2NhbCBkYXRlIHZhbHMgdGhhbiBVVENcbiAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKGRhdGVUb0xvY2FsQXJyYXkobmV3IERhdGUoKSkpO1xuICAgIH1cbiAgICBjcmVhdGVNYXJrZXJNZXRhKGlucHV0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZShpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1hcmtlciA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGlucHV0ID0gaW5wdXQudmFsdWVPZigpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgPSB0aGlzLnRpbWVzdGFtcFRvTWFya2VyKGlucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgbWFya2VyID0gYXJyYXlUb1V0Y0RhdGUoaW5wdXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrZXIgPT09IG51bGwgfHwgIWlzVmFsaWREYXRlKG1hcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1hcmtlciwgaXNUaW1lVW5zcGVjaWZpZWQ6IGZhbHNlLCBmb3JjZWRUem86IG51bGwgfTtcbiAgICB9XG4gICAgcGFyc2Uocykge1xuICAgICAgICBsZXQgcGFydHMgPSBwYXJzZShzKTtcbiAgICAgICAgaWYgKHBhcnRzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBtYXJrZXIgfSA9IHBhcnRzO1xuICAgICAgICBsZXQgZm9yY2VkVHpvID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcnRzLnRpbWVab25lT2Zmc2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5Db21wdXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbWFya2VyID0gdGhpcy50aW1lc3RhbXBUb01hcmtlcihtYXJrZXIudmFsdWVPZigpIC0gcGFydHMudGltZVpvbmVPZmZzZXQgKiA2MCAqIDEwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yY2VkVHpvID0gcGFydHMudGltZVpvbmVPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbWFya2VyLCBpc1RpbWVVbnNwZWNpZmllZDogcGFydHMuaXNUaW1lVW5zcGVjaWZpZWQsIGZvcmNlZFR6byB9O1xuICAgIH1cbiAgICAvLyBBY2Nlc3NvcnNcbiAgICBnZXRZZWFyKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG1hcmtlcik7XG4gICAgfVxuICAgIGdldE1vbnRoKG1hcmtlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJNb250aChtYXJrZXIpO1xuICAgIH1cbiAgICBnZXREYXkobWFya2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBBZGRpbmcgLyBTdWJ0cmFjdGluZ1xuICAgIGFkZChtYXJrZXIsIGR1cikge1xuICAgICAgICBsZXQgYSA9IHRoaXMuY2FsZW5kYXJTeXN0ZW0ubWFya2VyVG9BcnJheShtYXJrZXIpO1xuICAgICAgICBhWzBdICs9IGR1ci55ZWFycztcbiAgICAgICAgYVsxXSArPSBkdXIubW9udGhzO1xuICAgICAgICBhWzJdICs9IGR1ci5kYXlzO1xuICAgICAgICBhWzZdICs9IGR1ci5taWxsaXNlY29uZHM7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoYSk7XG4gICAgfVxuICAgIHN1YnRyYWN0KG1hcmtlciwgZHVyKSB7XG4gICAgICAgIGxldCBhID0gdGhpcy5jYWxlbmRhclN5c3RlbS5tYXJrZXJUb0FycmF5KG1hcmtlcik7XG4gICAgICAgIGFbMF0gLT0gZHVyLnllYXJzO1xuICAgICAgICBhWzFdIC09IGR1ci5tb250aHM7XG4gICAgICAgIGFbMl0gLT0gZHVyLmRheXM7XG4gICAgICAgIGFbNl0gLT0gZHVyLm1pbGxpc2Vjb25kcztcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihhKTtcbiAgICB9XG4gICAgYWRkWWVhcnMobWFya2VyLCBuKSB7XG4gICAgICAgIGxldCBhID0gdGhpcy5jYWxlbmRhclN5c3RlbS5tYXJrZXJUb0FycmF5KG1hcmtlcik7XG4gICAgICAgIGFbMF0gKz0gbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihhKTtcbiAgICB9XG4gICAgYWRkTW9udGhzKG1hcmtlciwgbikge1xuICAgICAgICBsZXQgYSA9IHRoaXMuY2FsZW5kYXJTeXN0ZW0ubWFya2VyVG9BcnJheShtYXJrZXIpO1xuICAgICAgICBhWzFdICs9IG47XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoYSk7XG4gICAgfVxuICAgIC8vIERpZmZpbmcgV2hvbGUgVW5pdHNcbiAgICBkaWZmV2hvbGVZZWFycyhtMCwgbTEpIHtcbiAgICAgICAgbGV0IHsgY2FsZW5kYXJTeXN0ZW0gfSA9IHRoaXM7XG4gICAgICAgIGlmICh0aW1lQXNNcyhtMCkgPT09IHRpbWVBc01zKG0xKSAmJlxuICAgICAgICAgICAgY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyRGF5KG0wKSA9PT0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyRGF5KG0xKSAmJlxuICAgICAgICAgICAgY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTApID09PSBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJNb250aChtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0xKSAtIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobTApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkaWZmV2hvbGVNb250aHMobTAsIG0xKSB7XG4gICAgICAgIGxldCB7IGNhbGVuZGFyU3lzdGVtIH0gPSB0aGlzO1xuICAgICAgICBpZiAodGltZUFzTXMobTApID09PSB0aW1lQXNNcyhtMSkgJiZcbiAgICAgICAgICAgIGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMCkgPT09IGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlckRheShtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTEpIC0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobTApKSArXG4gICAgICAgICAgICAgICAgKGNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobTEpIC0gY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtMCkpICogMTI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFJhbmdlIC8gRHVyYXRpb25cbiAgICBncmVhdGVzdFdob2xlVW5pdChtMCwgbTEpIHtcbiAgICAgICAgbGV0IG4gPSB0aGlzLmRpZmZXaG9sZVllYXJzKG0wLCBtMSk7XG4gICAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAneWVhcicsIHZhbHVlOiBuIH07XG4gICAgICAgIH1cbiAgICAgICAgbiA9IHRoaXMuZGlmZldob2xlTW9udGhzKG0wLCBtMSk7XG4gICAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnbW9udGgnLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmV2hvbGVXZWVrcyhtMCwgbTEpO1xuICAgICAgICBpZiAobiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ3dlZWsnLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgICAgIGlmIChuICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4geyB1bml0OiAnZGF5JywgdmFsdWU6IG4gfTtcbiAgICAgICAgfVxuICAgICAgICBuID0gZGlmZkhvdXJzKG0wLCBtMSk7XG4gICAgICAgIGlmIChpc0ludChuKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdW5pdDogJ2hvdXInLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmTWludXRlcyhtMCwgbTEpO1xuICAgICAgICBpZiAoaXNJbnQobikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdtaW51dGUnLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIG4gPSBkaWZmU2Vjb25kcyhtMCwgbTEpO1xuICAgICAgICBpZiAoaXNJbnQobikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHVuaXQ6ICdzZWNvbmQnLCB2YWx1ZTogbiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHVuaXQ6ICdtaWxsaXNlY29uZCcsIHZhbHVlOiBtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkgfTtcbiAgICB9XG4gICAgY291bnREdXJhdGlvbnNCZXR3ZWVuKG0wLCBtMSwgZCkge1xuICAgICAgICAvLyBUT0RPOiBjYW4gdXNlIGdyZWF0ZXN0V2hvbGVVbml0XG4gICAgICAgIGxldCBkaWZmO1xuICAgICAgICBpZiAoZC55ZWFycykge1xuICAgICAgICAgICAgZGlmZiA9IHRoaXMuZGlmZldob2xlWWVhcnMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoWWVhcnMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGQubW9udGhzKSB7XG4gICAgICAgICAgICBkaWZmID0gdGhpcy5kaWZmV2hvbGVNb250aHMobTAsIG0xKTtcbiAgICAgICAgICAgIGlmIChkaWZmICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpZmYgLyBhc1JvdWdoTW9udGhzKGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkLmRheXMpIHtcbiAgICAgICAgICAgIGRpZmYgPSBkaWZmV2hvbGVEYXlzKG0wLCBtMSk7XG4gICAgICAgICAgICBpZiAoZGlmZiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkaWZmIC8gYXNSb3VnaERheXMoZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChtMS52YWx1ZU9mKCkgLSBtMC52YWx1ZU9mKCkpIC8gYXNSb3VnaE1zKGQpO1xuICAgIH1cbiAgICAvLyBTdGFydC1PZlxuICAgIC8vIHRoZXNlIERPTidUIHJldHVybiB6b25lZC1kYXRlcy4gb25seSBVVEMgc3RhcnQtb2YgZGF0ZXNcbiAgICBzdGFydE9mKG0sIHVuaXQpIHtcbiAgICAgICAgaWYgKHVuaXQgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRPZlllYXIobSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuaXQgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0T2ZNb250aChtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ3dlZWsnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydE9mV2VlayhtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mRGF5KG0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID09PSAnaG91cicpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mSG91cihtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pdCA9PT0gJ21pbnV0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGFydE9mTWludXRlKG0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bml0ID09PSAnc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0T2ZTZWNvbmQobSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHN0YXJ0T2ZZZWFyKG0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJTeXN0ZW0uYXJyYXlUb01hcmtlcihbXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyU3lzdGVtLmdldE1hcmtlclllYXIobSksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBzdGFydE9mTW9udGgobSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhclN5c3RlbS5hcnJheVRvTWFya2VyKFtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyWWVhcihtKSxcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTeXN0ZW0uZ2V0TWFya2VyTW9udGgobSksXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBzdGFydE9mV2VlayhtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU3lzdGVtLmFycmF5VG9NYXJrZXIoW1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJZZWFyKG0pLFxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclN5c3RlbS5nZXRNYXJrZXJNb250aChtKSxcbiAgICAgICAgICAgIG0uZ2V0VVRDRGF0ZSgpIC0gKChtLmdldFVUQ0RheSgpIC0gdGhpcy53ZWVrRG93ICsgNykgJSA3KSxcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8vIFdlZWsgTnVtYmVyXG4gICAgY29tcHV0ZVdlZWtOdW1iZXIobWFya2VyKSB7XG4gICAgICAgIGlmICh0aGlzLndlZWtOdW1iZXJGdW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWVrTnVtYmVyRnVuYyh0aGlzLnRvRGF0ZShtYXJrZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtYXJrZXIsIHRoaXMud2Vla0RvdywgdGhpcy53ZWVrRG95KTtcbiAgICB9XG4gICAgLy8gVE9ETzogY2hva2Ugb24gdGltZVpvbmVOYW1lOiBsb25nXG4gICAgZm9ybWF0KG1hcmtlciwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KHtcbiAgICAgICAgICAgIG1hcmtlcixcbiAgICAgICAgICAgIHRpbWVab25lT2Zmc2V0OiBkYXRlT3B0aW9ucy5mb3JjZWRUem8gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgZGF0ZU9wdGlvbnMuZm9yY2VkVHpvIDpcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEZvck1hcmtlcihtYXJrZXIpLFxuICAgICAgICB9LCB0aGlzKTtcbiAgICB9XG4gICAgZm9ybWF0UmFuZ2Uoc3RhcnQsIGVuZCwgZm9ybWF0dGVyLCBkYXRlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmIChkYXRlT3B0aW9ucy5pc0VuZEV4Y2x1c2l2ZSkge1xuICAgICAgICAgICAgZW5kID0gYWRkTXMoZW5kLCAtMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRSYW5nZSh7XG4gICAgICAgICAgICBtYXJrZXI6IHN0YXJ0LFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvICE9IG51bGwgP1xuICAgICAgICAgICAgICAgIGRhdGVPcHRpb25zLmZvcmNlZFN0YXJ0VHpvIDpcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldEZvck1hcmtlcihzdGFydCksXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIG1hcmtlcjogZW5kLFxuICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQ6IGRhdGVPcHRpb25zLmZvcmNlZEVuZFR6byAhPSBudWxsID9cbiAgICAgICAgICAgICAgICBkYXRlT3B0aW9ucy5mb3JjZWRFbmRUem8gOlxuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0Rm9yTWFya2VyKGVuZCksXG4gICAgICAgIH0sIHRoaXMsIGRhdGVPcHRpb25zLmRlZmF1bHRTZXBhcmF0b3IpO1xuICAgIH1cbiAgICAvKlxuICAgIERVTUI6IHRoZSBvbWl0VGltZSBhcmcgaXMgZHVtYi4gaWYgd2Ugb21pdCB0aGUgdGltZSwgd2Ugd2FudCB0byBvbWl0IHRoZSB0aW1lem9uZSBvZmZzZXQuIGFuZCBpZiB3ZSBkbyB0aGF0LFxuICAgIG1pZ2h0IGFzIHdlbGwgdXNlIGJ1aWxkSXNvU3RyaW5nIG9yIHNvbWUgb3RoZXIgdXRpbCBkaXJlY3RseVxuICAgICovXG4gICAgZm9ybWF0SXNvKG1hcmtlciwgZXh0cmFPcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHRpbWVab25lT2Zmc2V0ID0gbnVsbDtcbiAgICAgICAgaWYgKCFleHRyYU9wdGlvbnMub21pdFRpbWVab25lT2Zmc2V0KSB7XG4gICAgICAgICAgICBpZiAoZXh0cmFPcHRpb25zLmZvcmNlZFR6byAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSBleHRyYU9wdGlvbnMuZm9yY2VkVHpvO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGltZVpvbmVPZmZzZXQgPSB0aGlzLm9mZnNldEZvck1hcmtlcihtYXJrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZElzb1N0cmluZyhtYXJrZXIsIHRpbWVab25lT2Zmc2V0LCBleHRyYU9wdGlvbnMub21pdFRpbWUpO1xuICAgIH1cbiAgICAvLyBUaW1lWm9uZVxuICAgIHRpbWVzdGFtcFRvTWFya2VyKG1zKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVab25lID09PSAnbG9jYWwnKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlUb1V0Y0RhdGUoZGF0ZVRvTG9jYWxBcnJheShuZXcgRGF0ZShtcykpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ1VUQycgfHwgIXRoaXMubmFtZWRUaW1lWm9uZUltcGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycmF5VG9VdGNEYXRlKHRoaXMubmFtZWRUaW1lWm9uZUltcGwudGltZXN0YW1wVG9BcnJheShtcykpO1xuICAgIH1cbiAgICBvZmZzZXRGb3JNYXJrZXIobSkge1xuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ2xvY2FsJykge1xuICAgICAgICAgICAgcmV0dXJuIC1hcnJheVRvTG9jYWxEYXRlKGRhdGVUb1V0Y0FycmF5KG0pKS5nZXRUaW1lem9uZU9mZnNldCgpOyAvLyBjb252ZXJ0IFwiaW52ZXJzZVwiIG9mZnNldCB0byBcIm5vcm1hbFwiIG9mZnNldFxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnRpbWVab25lID09PSAnVVRDJykge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubmFtZWRUaW1lWm9uZUltcGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWVkVGltZVpvbmVJbXBsLm9mZnNldEZvckFycmF5KGRhdGVUb1V0Y0FycmF5KG0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gQ29udmVyc2lvblxuICAgIHRvRGF0ZShtLCBmb3JjZWRUem8pIHtcbiAgICAgICAgaWYgKHRoaXMudGltZVpvbmUgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheVRvTG9jYWxEYXRlKGRhdGVUb1V0Y0FycmF5KG0pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy50aW1lWm9uZSA9PT0gJ1VUQycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtLnZhbHVlT2YoKSk7IC8vIG1ha2Ugc3VyZSBpdCdzIGEgY29weVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uYW1lZFRpbWVab25lSW1wbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC0gKGZvcmNlZFR6byB8fCAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG0udmFsdWVPZigpIC1cbiAgICAgICAgICAgIHRoaXMubmFtZWRUaW1lWm9uZUltcGwub2Zmc2V0Rm9yQXJyYXkoZGF0ZVRvVXRjQXJyYXkobSkpICogMTAwMCAqIDYwKTtcbiAgICB9XG59XG5cbmNsYXNzIE5hbWVkVGltZVpvbmVJbXBsIHtcbiAgICBjb25zdHJ1Y3Rvcih0aW1lWm9uZU5hbWUpIHtcbiAgICAgICAgdGhpcy50aW1lWm9uZU5hbWUgPSB0aW1lWm9uZU5hbWU7XG4gICAgfVxufVxuXG5jbGFzcyBTZWdIaWVyYXJjaHkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvLyBzZXR0aW5nc1xuICAgICAgICB0aGlzLnN0cmljdE9yZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWxsb3dSZXNsaWNpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXhDb29yZCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5tYXhTdGFja0NudCA9IC0xOyAvLyAtMSBtZWFucyBubyBtYXhcbiAgICAgICAgdGhpcy5sZXZlbENvb3JkcyA9IFtdOyAvLyBvcmRlcmVkXG4gICAgICAgIHRoaXMuZW50cmllc0J5TGV2ZWwgPSBbXTsgLy8gcGFyYWxsZWwgd2l0aCBsZXZlbENvb3Jkc1xuICAgICAgICB0aGlzLnN0YWNrQ250cyA9IHt9OyAvLyBUT0RPOiB1c2UgYmV0dGVyIHRlY2huaXF1ZSE/XG4gICAgfVxuICAgIGFkZFNlZ3MoaW5wdXRzKSB7XG4gICAgICAgIGxldCBoaWRkZW5FbnRyaWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGlucHV0IG9mIGlucHV0cykge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRFbnRyeShpbnB1dCwgaGlkZGVuRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZGRlbkVudHJpZXM7XG4gICAgfVxuICAgIGluc2VydEVudHJ5KGVudHJ5LCBoaWRkZW5FbnRyaWVzKSB7XG4gICAgICAgIGxldCBpbnNlcnRpb24gPSB0aGlzLmZpbmRJbnNlcnRpb24oZW50cnkpO1xuICAgICAgICBpZiAodGhpcy5pc0luc2VydGlvblZhbGlkKGluc2VydGlvbiwgZW50cnkpKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEVudHJ5QXQoZW50cnksIGluc2VydGlvbik7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbnZhbGlkSW5zZXJ0aW9uKGluc2VydGlvbiwgZW50cnksIGhpZGRlbkVudHJpZXMpO1xuICAgIH1cbiAgICBpc0luc2VydGlvblZhbGlkKGluc2VydGlvbiwgZW50cnkpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLm1heENvb3JkID09PSAtMSB8fCBpbnNlcnRpb24ubGV2ZWxDb29yZCArIGVudHJ5LnRoaWNrbmVzcyA8PSB0aGlzLm1heENvb3JkKSAmJlxuICAgICAgICAgICAgKHRoaXMubWF4U3RhY2tDbnQgPT09IC0xIHx8IGluc2VydGlvbi5zdGFja0NudCA8IHRoaXMubWF4U3RhY2tDbnQpO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIG51bWJlciBvZiBuZXcgZW50cmllcyBpbnNlcnRlZFxuICAgIGhhbmRsZUludmFsaWRJbnNlcnRpb24oaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICBpZiAodGhpcy5hbGxvd1Jlc2xpY2luZyAmJiBpbnNlcnRpb24udG91Y2hpbmdFbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXRFbnRyeShlbnRyeSwgaW5zZXJ0aW9uLnRvdWNoaW5nRW50cnksIGhpZGRlbkVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGhpZGRlbkVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBzcGxpdEVudHJ5KGVudHJ5LCBiYXJyaWVyLCBoaWRkZW5FbnRyaWVzKSB7XG4gICAgICAgIGxldCBwYXJ0Q250ID0gMDtcbiAgICAgICAgbGV0IHNwbGl0SGlkZGVuRW50cmllcyA9IFtdO1xuICAgICAgICBsZXQgZW50cnlTcGFuID0gZW50cnkuc3BhbjtcbiAgICAgICAgbGV0IGJhcnJpZXJTcGFuID0gYmFycmllci5zcGFuO1xuICAgICAgICBpZiAoZW50cnlTcGFuLnN0YXJ0IDwgYmFycmllclNwYW4uc3RhcnQpIHtcbiAgICAgICAgICAgIHBhcnRDbnQgKz0gdGhpcy5pbnNlcnRFbnRyeSh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVudHJ5LmluZGV4LFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgIHNwYW46IHsgc3RhcnQ6IGVudHJ5U3Bhbi5zdGFydCwgZW5kOiBiYXJyaWVyU3Bhbi5zdGFydCB9LFxuICAgICAgICAgICAgfSwgc3BsaXRIaWRkZW5FbnRyaWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlTcGFuLmVuZCA+IGJhcnJpZXJTcGFuLmVuZCkge1xuICAgICAgICAgICAgcGFydENudCArPSB0aGlzLmluc2VydEVudHJ5KHtcbiAgICAgICAgICAgICAgICBpbmRleDogZW50cnkuaW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpY2tuZXNzOiBlbnRyeS50aGlja25lc3MsXG4gICAgICAgICAgICAgICAgc3BhbjogeyBzdGFydDogYmFycmllclNwYW4uZW5kLCBlbmQ6IGVudHJ5U3Bhbi5lbmQgfSxcbiAgICAgICAgICAgIH0sIHNwbGl0SGlkZGVuRW50cmllcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRDbnQpIHtcbiAgICAgICAgICAgIGhpZGRlbkVudHJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW5kZXg6IGVudHJ5LmluZGV4LFxuICAgICAgICAgICAgICAgIHRoaWNrbmVzczogZW50cnkudGhpY2tuZXNzLFxuICAgICAgICAgICAgICAgIHNwYW46IGludGVyc2VjdFNwYW5zKGJhcnJpZXJTcGFuLCBlbnRyeVNwYW4pLCAvLyBndWFyYW50ZWVkIHRvIGludGVyc2VjdFxuICAgICAgICAgICAgfSwgLi4uc3BsaXRIaWRkZW5FbnRyaWVzKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0Q250O1xuICAgICAgICB9XG4gICAgICAgIGhpZGRlbkVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBpbnNlcnRFbnRyeUF0KGVudHJ5LCBpbnNlcnRpb24pIHtcbiAgICAgICAgbGV0IHsgZW50cmllc0J5TGV2ZWwsIGxldmVsQ29vcmRzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoaW5zZXJ0aW9uLmxhdGVyYWwgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgbGV2ZWxcbiAgICAgICAgICAgIGluc2VydEF0KGxldmVsQ29vcmRzLCBpbnNlcnRpb24ubGV2ZWwsIGluc2VydGlvbi5sZXZlbENvb3JkKTtcbiAgICAgICAgICAgIGluc2VydEF0KGVudHJpZXNCeUxldmVsLCBpbnNlcnRpb24ubGV2ZWwsIFtlbnRyeV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gZXhpc3RpbmcgbGV2ZWxcbiAgICAgICAgICAgIGluc2VydEF0KGVudHJpZXNCeUxldmVsW2luc2VydGlvbi5sZXZlbF0sIGluc2VydGlvbi5sYXRlcmFsLCBlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGFja0NudHNbYnVpbGRFbnRyeUtleShlbnRyeSldID0gaW5zZXJ0aW9uLnN0YWNrQ250O1xuICAgIH1cbiAgICBmaW5kSW5zZXJ0aW9uKG5ld0VudHJ5KSB7XG4gICAgICAgIGxldCB7IGxldmVsQ29vcmRzLCBlbnRyaWVzQnlMZXZlbCwgc3RyaWN0T3JkZXIsIHN0YWNrQ250cyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGxldmVsQ250ID0gbGV2ZWxDb29yZHMubGVuZ3RoO1xuICAgICAgICBsZXQgY2FuZGlkYXRlQ29vcmQgPSAwO1xuICAgICAgICBsZXQgdG91Y2hpbmdMZXZlbCA9IC0xO1xuICAgICAgICBsZXQgdG91Y2hpbmdMYXRlcmFsID0gLTE7XG4gICAgICAgIGxldCB0b3VjaGluZ0VudHJ5ID0gbnVsbDtcbiAgICAgICAgbGV0IHN0YWNrQ250ID0gMDtcbiAgICAgICAgZm9yIChsZXQgdHJhY2tpbmdMZXZlbCA9IDA7IHRyYWNraW5nTGV2ZWwgPCBsZXZlbENudDsgdHJhY2tpbmdMZXZlbCArPSAxKSB7XG4gICAgICAgICAgICBsZXQgdHJhY2tpbmdDb29yZCA9IGxldmVsQ29vcmRzW3RyYWNraW5nTGV2ZWxdO1xuICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgbGV2ZWwgaXMgcGFzdCB0aGUgcGxhY2VkIGVudHJ5LCB3ZSBoYXZlIGZvdW5kIGEgZ29vZCBlbXB0eSBzcGFjZSBhbmQgY2FuIHN0b3AuXG4gICAgICAgICAgICAvLyBpZiBzdHJpY3RPcmRlciwga2VlcCBmaW5kaW5nIG1vcmUgbGF0ZXJhbCBpbnRlcnNlY3Rpb25zLlxuICAgICAgICAgICAgaWYgKCFzdHJpY3RPcmRlciAmJiB0cmFja2luZ0Nvb3JkID49IGNhbmRpZGF0ZUNvb3JkICsgbmV3RW50cnkudGhpY2tuZXNzKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgdHJhY2tpbmdFbnRyaWVzID0gZW50cmllc0J5TGV2ZWxbdHJhY2tpbmdMZXZlbF07XG4gICAgICAgICAgICBsZXQgdHJhY2tpbmdFbnRyeTtcbiAgICAgICAgICAgIGxldCBzZWFyY2hSZXMgPSBiaW5hcnlTZWFyY2godHJhY2tpbmdFbnRyaWVzLCBuZXdFbnRyeS5zcGFuLnN0YXJ0LCBnZXRFbnRyeVNwYW5FbmQpOyAvLyBmaW5kIGZpcnN0IGVudHJ5IGFmdGVyIG5ld0VudHJ5J3MgZW5kXG4gICAgICAgICAgICBsZXQgbGF0ZXJhbEluZGV4ID0gc2VhcmNoUmVzWzBdICsgc2VhcmNoUmVzWzFdOyAvLyBpZiBleGFjdCBtYXRjaCAod2hpY2ggZG9lc24ndCBjb2xsaWRlKSwgZ28gdG8gbmV4dCBvbmVcbiAgICAgICAgICAgIHdoaWxlICggLy8gbG9vcCB0aHJvdWdoIGVudHJpZXMgdGhhdCBob3Jpem9udGFsbHkgaW50ZXJzZWN0XG4gICAgICAgICAgICAodHJhY2tpbmdFbnRyeSA9IHRyYWNraW5nRW50cmllc1tsYXRlcmFsSW5kZXhdKSAmJiAvLyBidXQgbm90IHBhc3QgdGhlIHdob2xlIGVudHJ5IGxpc3RcbiAgICAgICAgICAgICAgICB0cmFja2luZ0VudHJ5LnNwYW4uc3RhcnQgPCBuZXdFbnRyeS5zcGFuLmVuZCAvLyBhbmQgbm90IGVudGlyZWx5IHBhc3QgbmV3RW50cnlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCB0cmFja2luZ0VudHJ5Qm90dG9tID0gdHJhY2tpbmdDb29yZCArIHRyYWNraW5nRW50cnkudGhpY2tuZXNzO1xuICAgICAgICAgICAgICAgIC8vIGludGVyc2VjdHMgaW50byB0aGUgdG9wIG9mIHRoZSBjYW5kaWRhdGU/XG4gICAgICAgICAgICAgICAgaWYgKHRyYWNraW5nRW50cnlCb3R0b20gPiBjYW5kaWRhdGVDb29yZCkge1xuICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVDb29yZCA9IHRyYWNraW5nRW50cnlCb3R0b207XG4gICAgICAgICAgICAgICAgICAgIHRvdWNoaW5nRW50cnkgPSB0cmFja2luZ0VudHJ5O1xuICAgICAgICAgICAgICAgICAgICB0b3VjaGluZ0xldmVsID0gdHJhY2tpbmdMZXZlbDtcbiAgICAgICAgICAgICAgICAgICAgdG91Y2hpbmdMYXRlcmFsID0gbGF0ZXJhbEluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBidXR0cyB1cCBhZ2FpbnN0IHRvcCBvZiBjYW5kaWRhdGU/ICh3aWxsIGhhcHBlbiBpZiBqdXN0IGludGVyc2VjdGVkIGFzIHdlbGwpXG4gICAgICAgICAgICAgICAgaWYgKHRyYWNraW5nRW50cnlCb3R0b20gPT09IGNhbmRpZGF0ZUNvb3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgdGhlIGhpZ2hlc3QgcG9zc2libGUgc3RhY2tDbnQgb2YgdGhlIHRyYWNraW5nRW50cmllcyB0aGF0IGJ1dHQgdXBcbiAgICAgICAgICAgICAgICAgICAgc3RhY2tDbnQgPSBNYXRoLm1heChzdGFja0NudCwgc3RhY2tDbnRzW2J1aWxkRW50cnlLZXkodHJhY2tpbmdFbnRyeSldICsgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhdGVyYWxJbmRleCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHRoZSBkZXN0aW5hdGlvbiBsZXZlbCB3aWxsIGJlIGFmdGVyIHRvdWNoaW5nRW50cnkncyBsZXZlbC4gZmluZCBpdFxuICAgICAgICBsZXQgZGVzdExldmVsID0gMDtcbiAgICAgICAgaWYgKHRvdWNoaW5nRW50cnkpIHtcbiAgICAgICAgICAgIGRlc3RMZXZlbCA9IHRvdWNoaW5nTGV2ZWwgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGRlc3RMZXZlbCA8IGxldmVsQ250ICYmIGxldmVsQ29vcmRzW2Rlc3RMZXZlbF0gPCBjYW5kaWRhdGVDb29yZCkge1xuICAgICAgICAgICAgICAgIGRlc3RMZXZlbCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGlmIGFkZGluZyB0byBhbiBleGlzdGluZyBsZXZlbCwgZmluZCB3aGVyZSB0byBpbnNlcnRcbiAgICAgICAgbGV0IGRlc3RMYXRlcmFsID0gLTE7XG4gICAgICAgIGlmIChkZXN0TGV2ZWwgPCBsZXZlbENudCAmJiBsZXZlbENvb3Jkc1tkZXN0TGV2ZWxdID09PSBjYW5kaWRhdGVDb29yZCkge1xuICAgICAgICAgICAgZGVzdExhdGVyYWwgPSBiaW5hcnlTZWFyY2goZW50cmllc0J5TGV2ZWxbZGVzdExldmVsXSwgbmV3RW50cnkuc3Bhbi5lbmQsIGdldEVudHJ5U3BhbkVuZClbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdWNoaW5nTGV2ZWwsXG4gICAgICAgICAgICB0b3VjaGluZ0xhdGVyYWwsXG4gICAgICAgICAgICB0b3VjaGluZ0VudHJ5LFxuICAgICAgICAgICAgc3RhY2tDbnQsXG4gICAgICAgICAgICBsZXZlbENvb3JkOiBjYW5kaWRhdGVDb29yZCxcbiAgICAgICAgICAgIGxldmVsOiBkZXN0TGV2ZWwsXG4gICAgICAgICAgICBsYXRlcmFsOiBkZXN0TGF0ZXJhbCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gc29ydGVkIGJ5IGxldmVsQ29vcmQgKGxvd2VzdCB0byBoaWdoZXN0KVxuICAgIHRvUmVjdHMoKSB7XG4gICAgICAgIGxldCB7IGVudHJpZXNCeUxldmVsLCBsZXZlbENvb3JkcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGxldmVsQ250ID0gZW50cmllc0J5TGV2ZWwubGVuZ3RoO1xuICAgICAgICBsZXQgcmVjdHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgbGV2ZWwgPSAwOyBsZXZlbCA8IGxldmVsQ250OyBsZXZlbCArPSAxKSB7XG4gICAgICAgICAgICBsZXQgZW50cmllcyA9IGVudHJpZXNCeUxldmVsW2xldmVsXTtcbiAgICAgICAgICAgIGxldCBsZXZlbENvb3JkID0gbGV2ZWxDb29yZHNbbGV2ZWxdO1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgIHJlY3RzLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlbnRyeSksIHsgbGV2ZWxDb29yZCB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlY3RzO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEVudHJ5U3BhbkVuZChlbnRyeSkge1xuICAgIHJldHVybiBlbnRyeS5zcGFuLmVuZDtcbn1cbmZ1bmN0aW9uIGJ1aWxkRW50cnlLZXkoZW50cnkpIHtcbiAgICByZXR1cm4gZW50cnkuaW5kZXggKyAnOicgKyBlbnRyeS5zcGFuLnN0YXJ0O1xufVxuLy8gcmV0dXJucyBncm91cHMgd2l0aCBlbnRyaWVzIHNvcnRlZCBieSBpbnB1dCBvcmRlclxuZnVuY3Rpb24gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzKGVudHJpZXMpIHtcbiAgICBsZXQgbWVyZ2VzID0gW107XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZmlsdGVyZWRNZXJnZXMgPSBbXTtcbiAgICAgICAgbGV0IGh1bmdyeU1lcmdlID0ge1xuICAgICAgICAgICAgc3BhbjogZW50cnkuc3BhbixcbiAgICAgICAgICAgIGVudHJpZXM6IFtlbnRyeV0sXG4gICAgICAgIH07XG4gICAgICAgIGZvciAobGV0IG1lcmdlIG9mIG1lcmdlcykge1xuICAgICAgICAgICAgaWYgKGludGVyc2VjdFNwYW5zKG1lcmdlLnNwYW4sIGh1bmdyeU1lcmdlLnNwYW4pKSB7XG4gICAgICAgICAgICAgICAgaHVuZ3J5TWVyZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXM6IG1lcmdlLmVudHJpZXMuY29uY2F0KGh1bmdyeU1lcmdlLmVudHJpZXMpLFxuICAgICAgICAgICAgICAgICAgICBzcGFuOiBqb2luU3BhbnMobWVyZ2Uuc3BhbiwgaHVuZ3J5TWVyZ2Uuc3BhbiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2gobWVyZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbHRlcmVkTWVyZ2VzLnB1c2goaHVuZ3J5TWVyZ2UpO1xuICAgICAgICBtZXJnZXMgPSBmaWx0ZXJlZE1lcmdlcztcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlcztcbn1cbmZ1bmN0aW9uIGpvaW5TcGFucyhzcGFuMCwgc3BhbjEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogTWF0aC5taW4oc3BhbjAuc3RhcnQsIHNwYW4xLnN0YXJ0KSxcbiAgICAgICAgZW5kOiBNYXRoLm1heChzcGFuMC5lbmQsIHNwYW4xLmVuZCksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFNwYW5zKHNwYW4wLCBzcGFuMSkge1xuICAgIGxldCBzdGFydCA9IE1hdGgubWF4KHNwYW4wLnN0YXJ0LCBzcGFuMS5zdGFydCk7XG4gICAgbGV0IGVuZCA9IE1hdGgubWluKHNwYW4wLmVuZCwgc3BhbjEuZW5kKTtcbiAgICBpZiAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbi8vIGdlbmVyYWwgdXRpbFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpbnNlcnRBdChhcnIsIGluZGV4LCBpdGVtKSB7XG4gICAgYXJyLnNwbGljZShpbmRleCwgMCwgaXRlbSk7XG59XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYSwgc2VhcmNoVmFsLCBnZXRJdGVtVmFsKSB7XG4gICAgbGV0IHN0YXJ0SW5kZXggPSAwO1xuICAgIGxldCBlbmRJbmRleCA9IGEubGVuZ3RoOyAvLyBleGNsdXNpdmVcbiAgICBpZiAoIWVuZEluZGV4IHx8IHNlYXJjaFZhbCA8IGdldEl0ZW1WYWwoYVtzdGFydEluZGV4XSkpIHsgLy8gbm8gaXRlbXMgT1IgYmVmb3JlIGZpcnN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9XG4gICAgaWYgKHNlYXJjaFZhbCA+IGdldEl0ZW1WYWwoYVtlbmRJbmRleCAtIDFdKSkgeyAvLyBhZnRlciBsYXN0IGl0ZW1cbiAgICAgICAgcmV0dXJuIFtlbmRJbmRleCwgMF07XG4gICAgfVxuICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXgpIHtcbiAgICAgICAgbGV0IG1pZGRsZUluZGV4ID0gTWF0aC5mbG9vcihzdGFydEluZGV4ICsgKGVuZEluZGV4IC0gc3RhcnRJbmRleCkgLyAyKTtcbiAgICAgICAgbGV0IG1pZGRsZVZhbCA9IGdldEl0ZW1WYWwoYVttaWRkbGVJbmRleF0pO1xuICAgICAgICBpZiAoc2VhcmNoVmFsIDwgbWlkZGxlVmFsKSB7XG4gICAgICAgICAgICBlbmRJbmRleCA9IG1pZGRsZUluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNlYXJjaFZhbCA+IG1pZGRsZVZhbCkge1xuICAgICAgICAgICAgc3RhcnRJbmRleCA9IG1pZGRsZUluZGV4ICsgMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHsgLy8gZXF1YWwhXG4gICAgICAgICAgICByZXR1cm4gW21pZGRsZUluZGV4LCAxXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3N0YXJ0SW5kZXgsIDBdO1xufVxuXG5jbGFzcyBJbnRlcmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQgPSBzZXR0aW5ncy5jb21wb25lbnQ7XG4gICAgICAgIHRoaXMuaXNIaXRDb21ib0FsbG93ZWQgPSBzZXR0aW5ncy5pc0hpdENvbWJvQWxsb3dlZCB8fCBudWxsO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlSW50ZXJhY3Rpb25TZXR0aW5ncyhjb21wb25lbnQsIGlucHV0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29tcG9uZW50LFxuICAgICAgICBlbDogaW5wdXQuZWwsXG4gICAgICAgIHVzZUV2ZW50Q2VudGVyOiBpbnB1dC51c2VFdmVudENlbnRlciAhPSBudWxsID8gaW5wdXQudXNlRXZlbnRDZW50ZXIgOiB0cnVlLFxuICAgICAgICBpc0hpdENvbWJvQWxsb3dlZDogaW5wdXQuaXNIaXRDb21ib0FsbG93ZWQgfHwgbnVsbCxcbiAgICB9O1xufVxuZnVuY3Rpb24gaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBbc2V0dGluZ3MuY29tcG9uZW50LnVpZF06IHNldHRpbmdzLFxuICAgIH07XG59XG4vLyBnbG9iYWwgc3RhdGVcbmNvbnN0IGludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSA9IHt9O1xuXG4vKlxuQW4gYWJzdHJhY3Rpb24gZm9yIGEgZHJhZ2dpbmcgaW50ZXJhY3Rpb24gb3JpZ2luYXRpbmcgb24gYW4gZXZlbnQuXG5Eb2VzIGhpZ2hlci1sZXZlbCB0aGluZ3MgdGhhbiBQb2ludGVyRHJhZ2dlciwgc3VjaCBhcyBwb3NzaWJseTpcbi0gYSBcIm1pcnJvclwiIHRoYXQgbW92ZXMgd2l0aCB0aGUgcG9pbnRlclxuLSBhIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyBvciBvdGhlciBjcml0ZXJpYSBmb3IgYSB0cnVlIGRyYWcgdG8gYmVnaW5cblxuc3ViY2xhc3NlcyBtdXN0IGVtaXQ6XG4tIHBvaW50ZXJkb3duXG4tIGRyYWdzdGFydFxuLSBkcmFnbW92ZVxuLSBwb2ludGVydXBcbi0gZHJhZ2VuZFxuKi9cbmNsYXNzIEVsZW1lbnREcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3IoZWwsIHNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBFbWl0dGVyKCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgfVxuICAgIHNldE1pcnJvcklzVmlzaWJsZShib29sKSB7XG4gICAgICAgIC8vIG9wdGlvbmFsIGlmIHN1YmNsYXNzIGRvZXNuJ3Qgd2FudCB0byBzdXBwb3J0IGEgbWlycm9yXG4gICAgfVxuICAgIHNldE1pcnJvck5lZWRzUmV2ZXJ0KGJvb2wpIHtcbiAgICAgICAgLy8gb3B0aW9uYWwgaWYgc3ViY2xhc3MgZG9lc24ndCB3YW50IHRvIHN1cHBvcnQgYSBtaXJyb3JcbiAgICB9XG4gICAgc2V0QXV0b1Njcm9sbEVuYWJsZWQoYm9vbCkge1xuICAgICAgICAvLyBvcHRpb25hbFxuICAgIH1cbn1cblxuLy8gVE9ETzogZ2V0IHJpZCBvZiB0aGlzIGluIGZhdm9yIG9mIG9wdGlvbnMgc3lzdGVtLFxuLy8gdGhvIGl0J3MgcmVhbGx5IGVhc3kgdG8gYWNjZXNzIHRoaXMgZ2xvYmFsbHkgcmF0aGVyIHRoYW4gcGFzcyB0aHJ1IG9wdGlvbnMuXG5jb25zdCBjb25maWcgPSB7fTtcblxuLypcbkluZm9ybWF0aW9uIGFib3V0IHdoYXQgd2lsbCBoYXBwZW4gd2hlbiBhbiBleHRlcm5hbCBlbGVtZW50IGlzIGRyYWdnZWQtYW5kLWRyb3BwZWRcbm9udG8gYSBjYWxlbmRhci4gQ29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGNyZWF0aW5nIGFuIGV2ZW50LlxuKi9cbmNvbnN0IERSQUdfTUVUQV9SRUZJTkVSUyA9IHtcbiAgICBzdGFydFRpbWU6IGNyZWF0ZUR1cmF0aW9uLFxuICAgIGR1cmF0aW9uOiBjcmVhdGVEdXJhdGlvbixcbiAgICBjcmVhdGU6IEJvb2xlYW4sXG4gICAgc291cmNlSWQ6IFN0cmluZyxcbn07XG5mdW5jdGlvbiBwYXJzZURyYWdNZXRhKHJhdykge1xuICAgIGxldCB7IHJlZmluZWQsIGV4dHJhIH0gPSByZWZpbmVQcm9wcyhyYXcsIERSQUdfTUVUQV9SRUZJTkVSUyk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRUaW1lOiByZWZpbmVkLnN0YXJ0VGltZSB8fCBudWxsLFxuICAgICAgICBkdXJhdGlvbjogcmVmaW5lZC5kdXJhdGlvbiB8fCBudWxsLFxuICAgICAgICBjcmVhdGU6IHJlZmluZWQuY3JlYXRlICE9IG51bGwgPyByZWZpbmVkLmNyZWF0ZSA6IHRydWUsXG4gICAgICAgIHNvdXJjZUlkOiByZWZpbmVkLnNvdXJjZUlkLFxuICAgICAgICBsZWZ0b3ZlclByb3BzOiBleHRyYSxcbiAgICB9O1xufVxuXG5jbGFzcyBDYWxlbmRhclJvb3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZvclByaW50OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVCZWZvcmVQcmludCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb3JQcmludDogdHJ1ZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVBZnRlclByaW50ID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvclByaW50OiBmYWxzZSB9KTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gcHJvcHM7XG4gICAgICAgIGxldCB7IGZvclByaW50IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBsZXQgaXNIZWlnaHRBdXRvID0gZm9yUHJpbnQgfHwgb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLmNvbnRlbnRIZWlnaHQgPT09ICdhdXRvJztcbiAgICAgICAgbGV0IGhlaWdodCA9ICghaXNIZWlnaHRBdXRvICYmIG9wdGlvbnMuaGVpZ2h0ICE9IG51bGwpID8gb3B0aW9ucy5oZWlnaHQgOiAnJztcbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMnLFxuICAgICAgICAgICAgZm9yUHJpbnQgPyAnZmMtbWVkaWEtcHJpbnQnIDogJ2ZjLW1lZGlhLXNjcmVlbicsXG4gICAgICAgICAgICBgZmMtZGlyZWN0aW9uLSR7b3B0aW9ucy5kaXJlY3Rpb259YCxcbiAgICAgICAgICAgIHByb3BzLnRoZW1lLmdldENsYXNzKCdyb290JyksXG4gICAgICAgIF07XG4gICAgICAgIGlmICghZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsKCkpIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgnZmMtbGlxdWlkLWhhY2snKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4oY2xhc3NOYW1lcywgaGVpZ2h0LCBpc0hlaWdodEF1dG8sIGZvclByaW50KTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGxldCB7IGVtaXR0ZXIgfSA9IHRoaXMucHJvcHM7XG4gICAgICAgIGVtaXR0ZXIub24oJ19iZWZvcmVwcmludCcsIHRoaXMuaGFuZGxlQmVmb3JlUHJpbnQpO1xuICAgICAgICBlbWl0dGVyLm9uKCdfYWZ0ZXJwcmludCcsIHRoaXMuaGFuZGxlQWZ0ZXJQcmludCk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBsZXQgeyBlbWl0dGVyIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBlbWl0dGVyLm9mZignX2JlZm9yZXByaW50JywgdGhpcy5oYW5kbGVCZWZvcmVQcmludCk7XG4gICAgICAgIGVtaXR0ZXIub2ZmKCdfYWZ0ZXJwcmludCcsIHRoaXMuaGFuZGxlQWZ0ZXJQcmludCk7XG4gICAgfVxufVxuXG4vLyBDb21wdXRlcyBhIGRlZmF1bHQgY29sdW1uIGhlYWRlciBmb3JtYXR0aW5nIHN0cmluZyBpZiBgY29sRm9ybWF0YCBpcyBub3QgZXhwbGljaXRseSBkZWZpbmVkXG5mdW5jdGlvbiBjb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQoZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRheUNudCkge1xuICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgd2VlayByb3csIG9yIGlmIHRoZXJlIGFyZSBhIGxvdCBvZiBjb2x1bW5zIHdpdGggbm90IG11Y2ggc3BhY2UsXG4gICAgLy8gcHV0IGp1c3QgdGhlIGRheSBudW1iZXJzIHdpbGwgYmUgaW4gZWFjaCBjZWxsXG4gICAgaWYgKCFkYXRlc1JlcERpc3RpbmN0RGF5cyB8fCBkYXlDbnQgPiAxMCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JyB9KTsgLy8gXCJTYXRcIlxuICAgIH1cbiAgICBpZiAoZGF5Q250ID4gMSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRm9ybWF0dGVyKHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycsIG9taXRDb21tYXM6IHRydWUgfSk7IC8vIFwiU2F0IDExLzEyXCJcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTsgLy8gXCJTYXR1cmRheVwiXG59XG5cbmNvbnN0IENMQVNTX05BTUUgPSAnZmMtY29sLWhlYWRlci1jZWxsJzsgLy8gZG8gdGhlIGN1c2hpb24gdG9vPyBub1xuZnVuY3Rpb24gcmVuZGVySW5uZXIkMShyZW5kZXJQcm9wcykge1xuICAgIHJldHVybiByZW5kZXJQcm9wcy50ZXh0O1xufVxuXG5jbGFzcyBDb250ZW50SW5qZWN0b3IgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5pZCA9IGd1aWQoKTtcbiAgICAgICAgdGhpcy5xdWV1ZWREb21Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnREb21Ob2RlcyA9IFtdO1xuICAgICAgICB0aGlzLmhhbmRsZUVsID0gKGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBjb25zdCB7IGN1c3RvbUdlbmVyYXRvciwgZGVmYXVsdEdlbmVyYXRvciwgcmVuZGVyUHJvcHMgfSA9IHByb3BzO1xuICAgICAgICBjb25zdCBhdHRycyA9IGJ1aWxkRWxBdHRycyhwcm9wcyk7XG4gICAgICAgIGxldCB1c2VEZWZhdWx0ID0gZmFsc2U7XG4gICAgICAgIGxldCBpbm5lckNvbnRlbnQ7XG4gICAgICAgIGxldCBxdWV1ZWREb21Ob2RlcyA9IFtdO1xuICAgICAgICBsZXQgY3VycmVudEdlbmVyYXRvck1ldGE7XG4gICAgICAgIGlmIChjdXN0b21HZW5lcmF0b3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tR2VuZXJhdG9yUmVzID0gdHlwZW9mIGN1c3RvbUdlbmVyYXRvciA9PT0gJ2Z1bmN0aW9uJyA/XG4gICAgICAgICAgICAgICAgY3VzdG9tR2VuZXJhdG9yKHJlbmRlclByb3BzLCBwcmVhY3QuY3JlYXRlRWxlbWVudCkgOlxuICAgICAgICAgICAgICAgIGN1c3RvbUdlbmVyYXRvcjtcbiAgICAgICAgICAgIGlmIChjdXN0b21HZW5lcmF0b3JSZXMgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB1c2VEZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gY3VzdG9tR2VuZXJhdG9yUmVzICYmIHR5cGVvZiBjdXN0b21HZW5lcmF0b3JSZXMgPT09ICdvYmplY3QnOyAvLyBub24tbnVsbFxuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdCAmJiAoJ2h0bWwnIGluIGN1c3RvbUdlbmVyYXRvclJlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPSB7IF9faHRtbDogY3VzdG9tR2VuZXJhdG9yUmVzLmh0bWwgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QgJiYgKCdkb21Ob2RlcycgaW4gY3VzdG9tR2VuZXJhdG9yUmVzKSkge1xuICAgICAgICAgICAgICAgICAgICBxdWV1ZWREb21Ob2RlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGN1c3RvbUdlbmVyYXRvclJlcy5kb21Ob2Rlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdCAmJiB0eXBlb2YgY3VzdG9tR2VuZXJhdG9yUmVzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSB2YWx1ZSAobGlrZSBzdHJpbmcgb3IgbnVtYmVyKVxuICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRlbnQgPSBjdXN0b21HZW5lcmF0b3JSZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBhbiBleG90aWMgb2JqZWN0IGZvciBoYW5kbGVDdXN0b21SZW5kZXJpbmdcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEdlbmVyYXRvck1ldGEgPSBjdXN0b21HZW5lcmF0b3JSZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXNlRGVmYXVsdCA9ICFoYXNDdXN0b21SZW5kZXJpbmdIYW5kbGVyKHByb3BzLmdlbmVyYXRvck5hbWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1c2VEZWZhdWx0ICYmIGRlZmF1bHRHZW5lcmF0b3IpIHtcbiAgICAgICAgICAgIGlubmVyQ29udGVudCA9IGRlZmF1bHRHZW5lcmF0b3IocmVuZGVyUHJvcHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVldWVkRG9tTm9kZXMgPSBxdWV1ZWREb21Ob2RlcztcbiAgICAgICAgdGhpcy5jdXJyZW50R2VuZXJhdG9yTWV0YSA9IGN1cnJlbnRHZW5lcmF0b3JNZXRhO1xuICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQocHJvcHMuZWxUYWcsIGF0dHJzLCBpbm5lckNvbnRlbnQpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5hcHBseVF1ZXVldWREb21Ob2RlcygpO1xuICAgICAgICB0aGlzLnRyaWdnZXJDdXN0b21SZW5kZXJpbmcodHJ1ZSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgdGhpcy5hcHBseVF1ZXVldWREb21Ob2RlcygpO1xuICAgICAgICB0aGlzLnRyaWdnZXJDdXN0b21SZW5kZXJpbmcodHJ1ZSk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLnRyaWdnZXJDdXN0b21SZW5kZXJpbmcoZmFsc2UpOyAvLyBUT0RPOiBkaWZmZXJlbnQgQVBJIGZvciByZW1vdmFsP1xuICAgIH1cbiAgICB0cmlnZ2VyQ3VzdG9tUmVuZGVyaW5nKGlzQWN0aXZlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgeyBoYW5kbGVDdXN0b21SZW5kZXJpbmcsIGN1c3RvbVJlbmRlcmluZ01ldGFNYXAgfSA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgaWYgKGhhbmRsZUN1c3RvbVJlbmRlcmluZykge1xuICAgICAgICAgICAgY29uc3QgZ2VuZXJhdG9yTWV0YSA9IChfYSA9IHRoaXMuY3VycmVudEdlbmVyYXRvck1ldGEpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGN1c3RvbVJlbmRlcmluZ01ldGFNYXAgPT09IG51bGwgfHwgY3VzdG9tUmVuZGVyaW5nTWV0YU1hcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogY3VzdG9tUmVuZGVyaW5nTWV0YU1hcFtwcm9wcy5nZW5lcmF0b3JOYW1lXTtcbiAgICAgICAgICAgIGlmIChnZW5lcmF0b3JNZXRhKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ3VzdG9tUmVuZGVyaW5nKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGlkOiB0aGlzLmlkLCBpc0FjdGl2ZSwgY29udGFpbmVyRWw6IHRoaXMuYmFzZSwgcmVwb3J0TmV3Q29udGFpbmVyRWw6IHRoaXMuaGFuZGxlRWwsIC8vIGZvciBjdXN0b21SZW5kZXJpbmdSZXBsYWNlc0VsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck1ldGEgfSwgcHJvcHMpLCB7IGVsQ2xhc3NlczogKHByb3BzLmVsQ2xhc3NlcyB8fCBbXSkuZmlsdGVyKGlzVHJ1dGh5KSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwbHlRdWV1ZXVkRG9tTm9kZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgcXVldWVkRG9tTm9kZXMsIGN1cnJlbnREb21Ob2RlcyB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmJhc2U7XG4gICAgICAgIGlmICghaXNBcnJheXNFcXVhbChxdWV1ZWREb21Ob2RlcywgY3VycmVudERvbU5vZGVzKSkge1xuICAgICAgICAgICAgY3VycmVudERvbU5vZGVzLmZvckVhY2gocmVtb3ZlRWxlbWVudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBuZXdOb2RlIG9mIHF1ZXVlZERvbU5vZGVzKSB7XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQobmV3Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnREb21Ob2RlcyA9IHF1ZXVlZERvbU5vZGVzO1xuICAgICAgICB9XG4gICAgfVxufVxuQ29udGVudEluamVjdG9yLmFkZFByb3BzRXF1YWxpdHkoe1xuICAgIGVsQ2xhc3NlczogaXNBcnJheXNFcXVhbCxcbiAgICBlbFN0eWxlOiBpc1Byb3BzRXF1YWwsXG4gICAgZWxBdHRyczogaXNOb25IYW5kbGVyUHJvcHNFcXVhbCxcbiAgICByZW5kZXJQcm9wczogaXNQcm9wc0VxdWFsLFxufSk7XG4vLyBVdGlsXG4vKlxuRG9lcyBVSS1mcmFtZXdvcmsgcHJvdmlkZSBjdXN0b20gd2F5IG9mIHJlbmRlcmluZz9cbiovXG5mdW5jdGlvbiBoYXNDdXN0b21SZW5kZXJpbmdIYW5kbGVyKGdlbmVyYXRvck5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgcmV0dXJuIEJvb2xlYW4ob3B0aW9ucy5oYW5kbGVDdXN0b21SZW5kZXJpbmcgJiZcbiAgICAgICAgZ2VuZXJhdG9yTmFtZSAmJlxuICAgICAgICAoKF9hID0gb3B0aW9ucy5jdXN0b21SZW5kZXJpbmdNZXRhTWFwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbZ2VuZXJhdG9yTmFtZV0pKTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRWxBdHRycyhwcm9wcywgZXh0cmFDbGFzc05hbWVzKSB7XG4gICAgY29uc3QgYXR0cnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzLmVsQXR0cnMpLCB7IHJlZjogcHJvcHMuZWxSZWYgfSk7XG4gICAgaWYgKHByb3BzLmVsQ2xhc3NlcyB8fCBleHRyYUNsYXNzTmFtZXMpIHtcbiAgICAgICAgYXR0cnMuY2xhc3NOYW1lID0gKHByb3BzLmVsQ2xhc3NlcyB8fCBbXSlcbiAgICAgICAgICAgIC5jb25jYXQoZXh0cmFDbGFzc05hbWVzIHx8IFtdKVxuICAgICAgICAgICAgLmNvbmNhdChhdHRycy5jbGFzc05hbWUgfHwgW10pXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignICcpO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZWxTdHlsZSkge1xuICAgICAgICBhdHRycy5zdHlsZSA9IHByb3BzLmVsU3R5bGU7XG4gICAgfVxuICAgIHJldHVybiBhdHRycztcbn1cbmZ1bmN0aW9uIGlzVHJ1dGh5KHZhbCkge1xuICAgIHJldHVybiBCb29sZWFuKHZhbCk7XG59XG5cbmNvbnN0IFJlbmRlcklkID0gY3JlYXRlQ29udGV4dCgwKTtcblxuY2xhc3MgQ29udGVudENvbnRhaW5lciBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLklubmVyQ29udGVudCA9IElubmVyQ29udGVudEluamVjdG9yLmJpbmQodW5kZWZpbmVkLCB0aGlzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVSb290RWwgPSAoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsID0gZWw7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5lbFJlZikge1xuICAgICAgICAgICAgICAgIHNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQ2xhc3NOYW1lcyA9IGdlbmVyYXRlQ2xhc3NOYW1lcyhwcm9wcy5jbGFzc05hbWVHZW5lcmF0b3IsIHByb3BzLnJlbmRlclByb3BzKTtcbiAgICAgICAgaWYgKHByb3BzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBlbEF0dHJzID0gYnVpbGRFbEF0dHJzKHByb3BzLCBnZW5lcmF0ZWRDbGFzc05hbWVzKTtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4odGhpcy5Jbm5lckNvbnRlbnQsIHByb3BzLnJlbmRlclByb3BzLCBlbEF0dHJzKTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5lbFRhZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudChwcm9wcy5lbFRhZywgZWxBdHRycywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByZWFjdC5jcmVhdGVFbGVtZW50KChDb250ZW50SW5qZWN0b3IpLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSwgeyBlbFJlZjogdGhpcy5oYW5kbGVSb290RWwsIGVsVGFnOiBwcm9wcy5lbFRhZyB8fCAnZGl2JywgZWxDbGFzc2VzOiAocHJvcHMuZWxDbGFzc2VzIHx8IFtdKS5jb25jYXQoZ2VuZXJhdGVkQ2xhc3NOYW1lcyksIHJlbmRlcklkOiB0aGlzLmNvbnRleHQgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLnByb3BzKS5kaWRNb3VudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcy5yZW5kZXJQcm9wcyksIHsgZWw6IHRoaXMucm9vdEVsIHx8IHRoaXMuYmFzZSB9KSk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAoX2IgPSAoX2EgPSB0aGlzLnByb3BzKS53aWxsVW5tb3VudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5wcm9wcy5yZW5kZXJQcm9wcyksIHsgZWw6IHRoaXMucm9vdEVsIHx8IHRoaXMuYmFzZSB9KSk7XG4gICAgfVxufVxuQ29udGVudENvbnRhaW5lci5jb250ZXh0VHlwZSA9IFJlbmRlcklkO1xuZnVuY3Rpb24gSW5uZXJDb250ZW50SW5qZWN0b3IoY29udGFpbmVyQ29tcG9uZW50LCBwcm9wcykge1xuICAgIGNvbnN0IHBhcmVudFByb3BzID0gY29udGFpbmVyQ29tcG9uZW50LnByb3BzO1xuICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudCgoQ29udGVudEluamVjdG9yKSwgT2JqZWN0LmFzc2lnbih7IHJlbmRlclByb3BzOiBwYXJlbnRQcm9wcy5yZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogcGFyZW50UHJvcHMuZ2VuZXJhdG9yTmFtZSwgY3VzdG9tR2VuZXJhdG9yOiBwYXJlbnRQcm9wcy5jdXN0b21HZW5lcmF0b3IsIGRlZmF1bHRHZW5lcmF0b3I6IHBhcmVudFByb3BzLmRlZmF1bHRHZW5lcmF0b3IsIHJlbmRlcklkOiBjb250YWluZXJDb21wb25lbnQuY29udGV4dCB9LCBwcm9wcykpO1xufVxuLy8gVXRpbHNcbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhc3NOYW1lcyhjbGFzc05hbWVHZW5lcmF0b3IsIHJlbmRlclByb3BzKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IHR5cGVvZiBjbGFzc05hbWVHZW5lcmF0b3IgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICBjbGFzc05hbWVHZW5lcmF0b3IocmVuZGVyUHJvcHMpIDpcbiAgICAgICAgY2xhc3NOYW1lR2VuZXJhdG9yIHx8IFtdO1xuICAgIHJldHVybiB0eXBlb2YgY2xhc3NOYW1lcyA9PT0gJ3N0cmluZycgPyBbY2xhc3NOYW1lc10gOiBjbGFzc05hbWVzO1xufVxuXG4vLyBCQUQgbmFtZSBmb3IgdGhpcyBjbGFzcyBub3cuIHVzZWQgaW4gdGhlIEhlYWRlclxuY2xhc3MgVGFibGVEYXRlQ2VsbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgZGF0ZUVudiwgb3B0aW9ucywgdGhlbWUsIHZpZXdBcGkgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGRhdGUsIGRhdGVQcm9maWxlIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IGRheU1ldGEgPSBnZXREYXRlTWV0YShkYXRlLCBwcm9wcy50b2RheVJhbmdlLCBudWxsLCBkYXRlUHJvZmlsZSk7XG4gICAgICAgIGxldCBjbGFzc05hbWVzID0gW0NMQVNTX05BTUVdLmNvbmNhdChnZXREYXlDbGFzc05hbWVzKGRheU1ldGEsIHRoZW1lKSk7XG4gICAgICAgIGxldCB0ZXh0ID0gZGF0ZUVudi5mb3JtYXQoZGF0ZSwgcHJvcHMuZGF5SGVhZGVyRm9ybWF0KTtcbiAgICAgICAgLy8gaWYgY29sQ250IGlzIDEsIHdlIGFyZSBhbHJlYWR5IGluIGEgZGF5LXZpZXcgYW5kIGRvbid0IG5lZWQgYSBuYXZsaW5rXG4gICAgICAgIGxldCBuYXZMaW5rQXR0cnMgPSAoIWRheU1ldGEuaXNEaXNhYmxlZCAmJiBwcm9wcy5jb2xDbnQgPiAxKVxuICAgICAgICAgICAgPyBidWlsZE5hdkxpbmtBdHRycyh0aGlzLmNvbnRleHQsIGRhdGUpXG4gICAgICAgICAgICA6IHt9O1xuICAgICAgICBsZXQgcmVuZGVyUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGRhdGU6IGRhdGVFbnYudG9EYXRlKGRhdGUpLCB2aWV3OiB2aWV3QXBpIH0sIHByb3BzLmV4dHJhUmVuZGVyUHJvcHMpLCB7IHRleHQgfSksIGRheU1ldGEpO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRDb250YWluZXIsIHsgZWxUYWc6IFwidGhcIiwgZWxDbGFzc2VzOiBjbGFzc05hbWVzLCBlbEF0dHJzOiBPYmplY3QuYXNzaWduKHsgcm9sZTogJ2NvbHVtbmhlYWRlcicsIGNvbFNwYW46IHByb3BzLmNvbFNwYW4sICdkYXRhLWRhdGUnOiAhZGF5TWV0YS5pc0Rpc2FibGVkID8gZm9ybWF0RGF5U3RyaW5nKGRhdGUpIDogdW5kZWZpbmVkIH0sIHByb3BzLmV4dHJhRGF0YUF0dHJzKSwgcmVuZGVyUHJvcHM6IHJlbmRlclByb3BzLCBnZW5lcmF0b3JOYW1lOiBcImRheUhlYWRlckNvbnRlbnRcIiwgY3VzdG9tR2VuZXJhdG9yOiBvcHRpb25zLmRheUhlYWRlckNvbnRlbnQsIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlcklubmVyJDEsIGNsYXNzTmFtZUdlbmVyYXRvcjogb3B0aW9ucy5kYXlIZWFkZXJDbGFzc05hbWVzLCBkaWRNb3VudDogb3B0aW9ucy5kYXlIZWFkZXJEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyV2lsbFVubW91bnQgfSwgKElubmVyQ29udGFpbmVyKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtc2Nyb2xsZ3JpZC1zeW5jLWlubmVyXCIgfSwgIWRheU1ldGEuaXNEaXNhYmxlZCAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJDb250YWluZXIsIHsgZWxUYWc6IFwiYVwiLCBlbEF0dHJzOiBuYXZMaW5rQXR0cnMsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgICdmYy1jb2wtaGVhZGVyLWNlbGwtY3VzaGlvbicsXG4gICAgICAgICAgICAgICAgcHJvcHMuaXNTdGlja3kgJiYgJ2ZjLXN0aWNreScsXG4gICAgICAgICAgICBdIH0pKSkpKSk7XG4gICAgfVxufVxuXG5jb25zdCBXRUVLREFZX0ZPUk1BVCA9IGNyZWF0ZUZvcm1hdHRlcih7IHdlZWtkYXk6ICdsb25nJyB9KTtcbmNsYXNzIFRhYmxlRG93Q2VsbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGRhdGVFbnYsIHRoZW1lLCB2aWV3QXBpLCBvcHRpb25zIH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBkYXRlID0gYWRkRGF5cyhuZXcgRGF0ZSgyNTkyMDAwMDApLCBwcm9wcy5kb3cpOyAvLyBzdGFydCB3aXRoIFN1biwgMDQgSmFuIDE5NzAgMDA6MDA6MDAgR01UXG4gICAgICAgIGxldCBkYXRlTWV0YSA9IHtcbiAgICAgICAgICAgIGRvdzogcHJvcHMuZG93LFxuICAgICAgICAgICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICBpc0Z1dHVyZTogZmFsc2UsXG4gICAgICAgICAgICBpc1Bhc3Q6IGZhbHNlLFxuICAgICAgICAgICAgaXNUb2RheTogZmFsc2UsXG4gICAgICAgICAgICBpc090aGVyOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHRleHQgPSBkYXRlRW52LmZvcm1hdChkYXRlLCBwcm9wcy5kYXlIZWFkZXJGb3JtYXQpO1xuICAgICAgICBsZXQgcmVuZGVyUHJvcHMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgLy8gVE9ETzogbWFrZSB0aGlzIHB1YmxpYz9cbiAgICAgICAgICAgIGRhdGUgfSwgZGF0ZU1ldGEpLCB7IHZpZXc6IHZpZXdBcGkgfSksIHByb3BzLmV4dHJhUmVuZGVyUHJvcHMpLCB7IHRleHQgfSk7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudENvbnRhaW5lciwgeyBlbFRhZzogXCJ0aFwiLCBlbENsYXNzZXM6IFtcbiAgICAgICAgICAgICAgICBDTEFTU19OQU1FLFxuICAgICAgICAgICAgICAgIC4uLmdldERheUNsYXNzTmFtZXMoZGF0ZU1ldGEsIHRoZW1lKSxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMuZXh0cmFDbGFzc05hbWVzIHx8IFtdKSxcbiAgICAgICAgICAgIF0sIGVsQXR0cnM6IE9iamVjdC5hc3NpZ24oeyByb2xlOiAnY29sdW1uaGVhZGVyJywgY29sU3BhbjogcHJvcHMuY29sU3BhbiB9LCBwcm9wcy5leHRyYURhdGFBdHRycyksIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJkYXlIZWFkZXJDb250ZW50XCIsIGN1c3RvbUdlbmVyYXRvcjogb3B0aW9ucy5kYXlIZWFkZXJDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiByZW5kZXJJbm5lciQxLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMuZGF5SGVhZGVyQ2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMuZGF5SGVhZGVyRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUhlYWRlcldpbGxVbm1vdW50IH0sIChJbm5lckNvbnRlbnQpID0+IChwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1zY3JvbGxncmlkLXN5bmMtaW5uZXJcIiB9LFxuICAgICAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoSW5uZXJDb250ZW50LCB7IGVsVGFnOiBcImFcIiwgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICdmYy1jb2wtaGVhZGVyLWNlbGwtY3VzaGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmlzU3RpY2t5ICYmICdmYy1zdGlja3knLFxuICAgICAgICAgICAgICAgIF0sIGVsQXR0cnM6IHtcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiBkYXRlRW52LmZvcm1hdChkYXRlLCBXRUVLREFZX0ZPUk1BVCksXG4gICAgICAgICAgICAgICAgfSB9KSkpKSk7XG4gICAgfVxufVxuXG5jbGFzcyBOb3dUaW1lciBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcbiAgICAgICAgdGhpcy5pbml0aWFsTm93RGF0ZSA9IGdldE5vdyhjb250ZXh0Lm9wdGlvbnMubm93LCBjb250ZXh0LmRhdGVFbnYpO1xuICAgICAgICB0aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMgPSBuZXcgRGF0ZSgpLnZhbHVlT2YoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuY29tcHV0ZVRpbWluZygpLmN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBwcm9wcy5jaGlsZHJlbihzdGF0ZS5ub3dEYXRlLCBzdGF0ZS50b2RheVJhbmdlKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZW91dCgpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAgIGlmIChwcmV2UHJvcHMudW5pdCAhPT0gdGhpcy5wcm9wcy51bml0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lb3V0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgfVxuICAgIGNvbXB1dGVUaW1pbmcoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgdW5yb3VuZGVkTm93ID0gYWRkTXModGhpcy5pbml0aWFsTm93RGF0ZSwgbmV3IERhdGUoKS52YWx1ZU9mKCkgLSB0aGlzLmluaXRpYWxOb3dRdWVyaWVkTXMpO1xuICAgICAgICBsZXQgY3VycmVudFVuaXRTdGFydCA9IGNvbnRleHQuZGF0ZUVudi5zdGFydE9mKHVucm91bmRlZE5vdywgcHJvcHMudW5pdCk7XG4gICAgICAgIGxldCBuZXh0VW5pdFN0YXJ0ID0gY29udGV4dC5kYXRlRW52LmFkZChjdXJyZW50VW5pdFN0YXJ0LCBjcmVhdGVEdXJhdGlvbigxLCBwcm9wcy51bml0KSk7XG4gICAgICAgIGxldCB3YWl0TXMgPSBuZXh0VW5pdFN0YXJ0LnZhbHVlT2YoKSAtIHVucm91bmRlZE5vdy52YWx1ZU9mKCk7XG4gICAgICAgIC8vIHRoZXJlIGlzIGEgbWF4IHNldFRpbWVvdXQgbXMgdmFsdWUgKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDY4NjUwLzk2MzQyKVxuICAgICAgICAvLyBlbnN1cmUgbm8gbG9uZ2VyIHRoYW4gYSBkYXlcbiAgICAgICAgd2FpdE1zID0gTWF0aC5taW4oMTAwMCAqIDYwICogNjAgKiAyNCwgd2FpdE1zKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGN1cnJlbnRTdGF0ZTogeyBub3dEYXRlOiBjdXJyZW50VW5pdFN0YXJ0LCB0b2RheVJhbmdlOiBidWlsZERheVJhbmdlKGN1cnJlbnRVbml0U3RhcnQpIH0sXG4gICAgICAgICAgICBuZXh0U3RhdGU6IHsgbm93RGF0ZTogbmV4dFVuaXRTdGFydCwgdG9kYXlSYW5nZTogYnVpbGREYXlSYW5nZShuZXh0VW5pdFN0YXJ0KSB9LFxuICAgICAgICAgICAgd2FpdE1zLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCkge1xuICAgICAgICBsZXQgeyBuZXh0U3RhdGUsIHdhaXRNcyB9ID0gdGhpcy5jb21wdXRlVGltaW5nKCk7XG4gICAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGltZW91dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIHdhaXRNcyk7XG4gICAgfVxuICAgIGNsZWFyVGltZW91dCgpIHtcbiAgICAgICAgaWYgKHRoaXMudGltZW91dElkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgfVxufVxuTm93VGltZXIuY29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG5mdW5jdGlvbiBidWlsZERheVJhbmdlKGRhdGUpIHtcbiAgICBsZXQgc3RhcnQgPSBzdGFydE9mRGF5KGRhdGUpO1xuICAgIGxldCBlbmQgPSBhZGREYXlzKHN0YXJ0LCAxKTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG59XG5cbmNsYXNzIERheUhlYWRlciBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNyZWF0ZURheUhlYWRlckZvcm1hdHRlciA9IG1lbW9pemUoY3JlYXRlRGF5SGVhZGVyRm9ybWF0dGVyKTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBkYXRlcywgZGF0ZVByb2ZpbGUsIGRhdGVzUmVwRGlzdGluY3REYXlzLCByZW5kZXJJbnRybyB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IGRheUhlYWRlckZvcm1hdCA9IHRoaXMuY3JlYXRlRGF5SGVhZGVyRm9ybWF0dGVyKGNvbnRleHQub3B0aW9ucy5kYXlIZWFkZXJGb3JtYXQsIGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXRlcy5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KE5vd1RpbWVyLCB7IHVuaXQ6IFwiZGF5XCIgfSwgKG5vd0RhdGUsIHRvZGF5UmFuZ2UpID0+IChwcmVhY3QuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcm9sZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgcmVuZGVySW50cm8gJiYgcmVuZGVySW50cm8oJ2RheScpLFxuICAgICAgICAgICAgZGF0ZXMubWFwKChkYXRlKSA9PiAoZGF0ZXNSZXBEaXN0aW5jdERheXMgPyAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVEYXRlQ2VsbCwgeyBrZXk6IGRhdGUudG9JU09TdHJpbmcoKSwgZGF0ZTogZGF0ZSwgZGF0ZVByb2ZpbGU6IGRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBjb2xDbnQ6IGRhdGVzLmxlbmd0aCwgZGF5SGVhZGVyRm9ybWF0OiBkYXlIZWFkZXJGb3JtYXQgfSkpIDogKHByZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlRG93Q2VsbCwgeyBrZXk6IGRhdGUuZ2V0VVRDRGF5KCksIGRvdzogZGF0ZS5nZXRVVENEYXkoKSwgZGF5SGVhZGVyRm9ybWF0OiBkYXlIZWFkZXJGb3JtYXQgfSkpKSkpKSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZURheUhlYWRlckZvcm1hdHRlcihleHBsaWNpdEZvcm1hdCwgZGF0ZXNSZXBEaXN0aW5jdERheXMsIGRhdGVDbnQpIHtcbiAgICByZXR1cm4gZXhwbGljaXRGb3JtYXQgfHwgY29tcHV0ZUZhbGxiYWNrSGVhZGVyRm9ybWF0KGRhdGVzUmVwRGlzdGluY3REYXlzLCBkYXRlQ250KTtcbn1cblxuY2xhc3MgRGF5U2VyaWVzTW9kZWwge1xuICAgIGNvbnN0cnVjdG9yKHJhbmdlLCBkYXRlUHJvZmlsZUdlbmVyYXRvcikge1xuICAgICAgICBsZXQgZGF0ZSA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICBsZXQgeyBlbmQgfSA9IHJhbmdlO1xuICAgICAgICBsZXQgaW5kaWNlcyA9IFtdO1xuICAgICAgICBsZXQgZGF0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGRheUluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlIChkYXRlIDwgZW5kKSB7IC8vIGxvb3AgZWFjaCBkYXkgZnJvbSBzdGFydCB0byBlbmRcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZUdlbmVyYXRvci5pc0hpZGRlbkRheShkYXRlKSkge1xuICAgICAgICAgICAgICAgIGluZGljZXMucHVzaChkYXlJbmRleCArIDAuNSk7IC8vIG1hcmsgdGhhdCBpdCdzIGJldHdlZW4gaW5kaWNlc1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF5SW5kZXggKz0gMTtcbiAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goZGF5SW5kZXgpO1xuICAgICAgICAgICAgICAgIGRhdGVzLnB1c2goZGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRlID0gYWRkRGF5cyhkYXRlLCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGVzID0gZGF0ZXM7XG4gICAgICAgIHRoaXMuaW5kaWNlcyA9IGluZGljZXM7XG4gICAgICAgIHRoaXMuY250ID0gZGF0ZXMubGVuZ3RoO1xuICAgIH1cbiAgICBzbGljZVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIGxldCBmaXJzdEluZGV4ID0gdGhpcy5nZXREYXRlRGF5SW5kZXgocmFuZ2Uuc3RhcnQpOyAvLyBpbmNsdXNpdmUgZmlyc3QgaW5kZXhcbiAgICAgICAgbGV0IGxhc3RJbmRleCA9IHRoaXMuZ2V0RGF0ZURheUluZGV4KGFkZERheXMocmFuZ2UuZW5kLCAtMSkpOyAvLyBpbmNsdXNpdmUgbGFzdCBpbmRleFxuICAgICAgICBsZXQgY2xpcHBlZEZpcnN0SW5kZXggPSBNYXRoLm1heCgwLCBmaXJzdEluZGV4KTtcbiAgICAgICAgbGV0IGNsaXBwZWRMYXN0SW5kZXggPSBNYXRoLm1pbih0aGlzLmNudCAtIDEsIGxhc3RJbmRleCk7XG4gICAgICAgIC8vIGRlYWwgd2l0aCBpbi1iZXR3ZWVuIGluZGljZXNcbiAgICAgICAgY2xpcHBlZEZpcnN0SW5kZXggPSBNYXRoLmNlaWwoY2xpcHBlZEZpcnN0SW5kZXgpOyAvLyBpbi1iZXR3ZWVuIHN0YXJ0cyByb3VuZCB0byBuZXh0IGNlbGxcbiAgICAgICAgY2xpcHBlZExhc3RJbmRleCA9IE1hdGguZmxvb3IoY2xpcHBlZExhc3RJbmRleCk7IC8vIGluLWJldHdlZW4gZW5kcyByb3VuZCB0byBwcmV2IGNlbGxcbiAgICAgICAgaWYgKGNsaXBwZWRGaXJzdEluZGV4IDw9IGNsaXBwZWRMYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlyc3RJbmRleDogY2xpcHBlZEZpcnN0SW5kZXgsXG4gICAgICAgICAgICAgICAgbGFzdEluZGV4OiBjbGlwcGVkTGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIGlzU3RhcnQ6IGZpcnN0SW5kZXggPT09IGNsaXBwZWRGaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgIGlzRW5kOiBsYXN0SW5kZXggPT09IGNsaXBwZWRMYXN0SW5kZXgsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBHaXZlbiBhIGRhdGUsIHJldHVybnMgaXRzIGNocm9ub2xvY2lhbCBjZWxsLWluZGV4IGZyb20gdGhlIGZpcnN0IGNlbGwgb2YgdGhlIGdyaWQuXG4gICAgLy8gSWYgdGhlIGRhdGUgbGllcyBiZXR3ZWVuIGNlbGxzIChiZWNhdXNlIG9mIGhpZGRlbkRheXMpLCByZXR1cm5zIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUgYmV0d2VlbiBvZmZzZXRzLlxuICAgIC8vIElmIGJlZm9yZSB0aGUgZmlyc3Qgb2Zmc2V0LCByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyLlxuICAgIC8vIElmIGFmdGVyIHRoZSBsYXN0IG9mZnNldCwgcmV0dXJucyBhbiBvZmZzZXQgcGFzdCB0aGUgbGFzdCBjZWxsIG9mZnNldC5cbiAgICAvLyBPbmx5IHdvcmtzIGZvciAqc3RhcnQqIGRhdGVzIG9mIGNlbGxzLiBXaWxsIG5vdCB3b3JrIGZvciBleGNsdXNpdmUgZW5kIGRhdGVzIGZvciBjZWxscy5cbiAgICBnZXREYXRlRGF5SW5kZXgoZGF0ZSkge1xuICAgICAgICBsZXQgeyBpbmRpY2VzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgZGF5T2Zmc2V0ID0gTWF0aC5mbG9vcihkaWZmRGF5cyh0aGlzLmRhdGVzWzBdLCBkYXRlKSk7XG4gICAgICAgIGlmIChkYXlPZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5kaWNlc1swXSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheU9mZnNldCA+PSBpbmRpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGluZGljZXNbZGF5T2Zmc2V0XTtcbiAgICB9XG59XG5cbmNsYXNzIERheVRhYmxlTW9kZWwge1xuICAgIGNvbnN0cnVjdG9yKGRheVNlcmllcywgYnJlYWtPbldlZWtzKSB7XG4gICAgICAgIGxldCB7IGRhdGVzIH0gPSBkYXlTZXJpZXM7XG4gICAgICAgIGxldCBkYXlzUGVyUm93O1xuICAgICAgICBsZXQgZmlyc3REYXk7XG4gICAgICAgIGxldCByb3dDbnQ7XG4gICAgICAgIGlmIChicmVha09uV2Vla3MpIHtcbiAgICAgICAgICAgIC8vIGNvdW50IGNvbHVtbnMgdW50aWwgdGhlIGRheS1vZi13ZWVrIHJlcGVhdHNcbiAgICAgICAgICAgIGZpcnN0RGF5ID0gZGF0ZXNbMF0uZ2V0VVRDRGF5KCk7XG4gICAgICAgICAgICBmb3IgKGRheXNQZXJSb3cgPSAxOyBkYXlzUGVyUm93IDwgZGF0ZXMubGVuZ3RoOyBkYXlzUGVyUm93ICs9IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0ZXNbZGF5c1BlclJvd10uZ2V0VVRDRGF5KCkgPT09IGZpcnN0RGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd0NudCA9IE1hdGguY2VpbChkYXRlcy5sZW5ndGggLyBkYXlzUGVyUm93KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJvd0NudCA9IDE7XG4gICAgICAgICAgICBkYXlzUGVyUm93ID0gZGF0ZXMubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm93Q250ID0gcm93Q250O1xuICAgICAgICB0aGlzLmNvbENudCA9IGRheXNQZXJSb3c7XG4gICAgICAgIHRoaXMuZGF5U2VyaWVzID0gZGF5U2VyaWVzO1xuICAgICAgICB0aGlzLmNlbGxzID0gdGhpcy5idWlsZENlbGxzKCk7XG4gICAgICAgIHRoaXMuaGVhZGVyRGF0ZXMgPSB0aGlzLmJ1aWxkSGVhZGVyRGF0ZXMoKTtcbiAgICB9XG4gICAgYnVpbGRDZWxscygpIHtcbiAgICAgICAgbGV0IHJvd3MgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdGhpcy5yb3dDbnQ7IHJvdyArPSAxKSB7XG4gICAgICAgICAgICBsZXQgY2VsbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRoaXMuY29sQ250OyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgICAgIGNlbGxzLnB1c2godGhpcy5idWlsZENlbGwocm93LCBjb2wpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd3MucHVzaChjZWxscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuICAgIGJ1aWxkQ2VsbChyb3csIGNvbCkge1xuICAgICAgICBsZXQgZGF0ZSA9IHRoaXMuZGF5U2VyaWVzLmRhdGVzW3JvdyAqIHRoaXMuY29sQ250ICsgY29sXTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleTogZGF0ZS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYnVpbGRIZWFkZXJEYXRlcygpIHtcbiAgICAgICAgbGV0IGRhdGVzID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHRoaXMuY29sQ250OyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgZGF0ZXMucHVzaCh0aGlzLmNlbGxzWzBdW2NvbF0uZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGVzO1xuICAgIH1cbiAgICBzbGljZVJhbmdlKHJhbmdlKSB7XG4gICAgICAgIGxldCB7IGNvbENudCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHNlcmllc1NlZyA9IHRoaXMuZGF5U2VyaWVzLnNsaWNlUmFuZ2UocmFuZ2UpO1xuICAgICAgICBsZXQgc2VncyA9IFtdO1xuICAgICAgICBpZiAoc2VyaWVzU2VnKSB7XG4gICAgICAgICAgICBsZXQgeyBmaXJzdEluZGV4LCBsYXN0SW5kZXggfSA9IHNlcmllc1NlZztcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGZpcnN0SW5kZXg7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdyA9IE1hdGguZmxvb3IoaW5kZXggLyBjb2xDbnQpO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0SW5kZXggPSBNYXRoLm1pbigocm93ICsgMSkgKiBjb2xDbnQsIGxhc3RJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIHNlZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb2w6IGluZGV4ICUgY29sQ250LFxuICAgICAgICAgICAgICAgICAgICBsYXN0Q29sOiAobmV4dEluZGV4IC0gMSkgJSBjb2xDbnQsXG4gICAgICAgICAgICAgICAgICAgIGlzU3RhcnQ6IHNlcmllc1NlZy5pc1N0YXJ0ICYmIGluZGV4ID09PSBmaXJzdEluZGV4LFxuICAgICAgICAgICAgICAgICAgICBpc0VuZDogc2VyaWVzU2VnLmlzRW5kICYmIChuZXh0SW5kZXggLSAxKSA9PT0gbGFzdEluZGV4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWdzO1xuICAgIH1cbn1cblxuY2xhc3MgU2xpY2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5zbGljZUJ1c2luZXNzSG91cnMgPSBtZW1vaXplKHRoaXMuX3NsaWNlQnVzaW5lc3NIb3Vycyk7XG4gICAgICAgIHRoaXMuc2xpY2VEYXRlU2VsZWN0aW9uID0gbWVtb2l6ZSh0aGlzLl9zbGljZURhdGVTcGFuKTtcbiAgICAgICAgdGhpcy5zbGljZUV2ZW50U3RvcmUgPSBtZW1vaXplKHRoaXMuX3NsaWNlRXZlbnRTdG9yZSk7XG4gICAgICAgIHRoaXMuc2xpY2VFdmVudERyYWcgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLnNsaWNlRXZlbnRSZXNpemUgPSBtZW1vaXplKHRoaXMuX3NsaWNlSW50ZXJhY3Rpb24pO1xuICAgICAgICB0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSA9IGZhbHNlOyAvLyBoYWNrXG4gICAgfVxuICAgIHNsaWNlUHJvcHMocHJvcHMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCBjb250ZXh0LCAuLi5leHRyYUFyZ3MpIHtcbiAgICAgICAgbGV0IHsgZXZlbnRVaUJhc2VzIH0gPSBwcm9wcztcbiAgICAgICAgbGV0IGV2ZW50U2VncyA9IHRoaXMuc2xpY2VFdmVudFN0b3JlKHByb3BzLmV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlcywgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIC4uLmV4dHJhQXJncyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRlU2VsZWN0aW9uU2VnczogdGhpcy5zbGljZURhdGVTZWxlY3Rpb24ocHJvcHMuZGF0ZVNlbGVjdGlvbiwgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGV2ZW50VWlCYXNlcywgY29udGV4dCwgLi4uZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIGJ1c2luZXNzSG91clNlZ3M6IHRoaXMuc2xpY2VCdXNpbmVzc0hvdXJzKHByb3BzLmJ1c2luZXNzSG91cnMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCBjb250ZXh0LCAuLi5leHRyYUFyZ3MpLFxuICAgICAgICAgICAgZmdFdmVudFNlZ3M6IGV2ZW50U2Vncy5mZyxcbiAgICAgICAgICAgIGJnRXZlbnRTZWdzOiBldmVudFNlZ3MuYmcsXG4gICAgICAgICAgICBldmVudERyYWc6IHRoaXMuc2xpY2VFdmVudERyYWcocHJvcHMuZXZlbnREcmFnLCBldmVudFVpQmFzZXMsIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCAuLi5leHRyYUFyZ3MpLFxuICAgICAgICAgICAgZXZlbnRSZXNpemU6IHRoaXMuc2xpY2VFdmVudFJlc2l6ZShwcm9wcy5ldmVudFJlc2l6ZSwgZXZlbnRVaUJhc2VzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgLi4uZXh0cmFBcmdzKSxcbiAgICAgICAgICAgIGV2ZW50U2VsZWN0aW9uOiBwcm9wcy5ldmVudFNlbGVjdGlvbixcbiAgICAgICAgfTsgLy8gVE9ETzogZ2l2ZSBpbnRlcmFjdGlvblNlZ3M/XG4gICAgfVxuICAgIHNsaWNlTm93RGF0ZSgvLyBkb2VzIG5vdCBtZW1vaXplXG4gICAgZGF0ZSwgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQsIC4uLmV4dHJhQXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2xpY2VEYXRlU3Bhbih7IHJhbmdlOiB7IHN0YXJ0OiBkYXRlLCBlbmQ6IGFkZE1zKGRhdGUsIDEpIH0sIGFsbERheTogZmFsc2UgfSwgLy8gYWRkIDEgbXMsIHByb3RlY3QgYWdhaW5zdCBudWxsIHJhbmdlXG4gICAgICAgIGRhdGVQcm9maWxlLCBuZXh0RGF5VGhyZXNob2xkLCB7fSwgY29udGV4dCwgLi4uZXh0cmFBcmdzKTtcbiAgICB9XG4gICAgX3NsaWNlQnVzaW5lc3NIb3VycyhidXNpbmVzc0hvdXJzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgY29udGV4dCwgLi4uZXh0cmFBcmdzKSB7XG4gICAgICAgIGlmICghYnVzaW5lc3NIb3Vycykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zbGljZUV2ZW50U3RvcmUoZXhwYW5kUmVjdXJyaW5nKGJ1c2luZXNzSG91cnMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIGNvbnRleHQpLCB7fSwgZGF0ZVByb2ZpbGUsIG5leHREYXlUaHJlc2hvbGQsIC4uLmV4dHJhQXJncykuYmc7XG4gICAgfVxuICAgIF9zbGljZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgLi4uZXh0cmFBcmdzKSB7XG4gICAgICAgIGlmIChldmVudFN0b3JlKSB7XG4gICAgICAgICAgICBsZXQgcmFuZ2VSZXMgPSBzbGljZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzLCBjb21wdXRlQWN0aXZlUmFuZ2UoZGF0ZVByb2ZpbGUsIEJvb2xlYW4obmV4dERheVRocmVzaG9sZCkpLCBuZXh0RGF5VGhyZXNob2xkKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYmc6IHRoaXMuc2xpY2VFdmVudFJhbmdlcyhyYW5nZVJlcy5iZywgZXh0cmFBcmdzKSxcbiAgICAgICAgICAgICAgICBmZzogdGhpcy5zbGljZUV2ZW50UmFuZ2VzKHJhbmdlUmVzLmZnLCBleHRyYUFyZ3MpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBiZzogW10sIGZnOiBbXSB9O1xuICAgIH1cbiAgICBfc2xpY2VJbnRlcmFjdGlvbihpbnRlcmFjdGlvbiwgZXZlbnRVaUJhc2VzLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgLi4uZXh0cmFBcmdzKSB7XG4gICAgICAgIGlmICghaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByYW5nZVJlcyA9IHNsaWNlRXZlbnRTdG9yZShpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzLCBldmVudFVpQmFzZXMsIGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSksIG5leHREYXlUaHJlc2hvbGQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VnczogdGhpcy5zbGljZUV2ZW50UmFuZ2VzKHJhbmdlUmVzLmZnLCBleHRyYUFyZ3MpLFxuICAgICAgICAgICAgYWZmZWN0ZWRJbnN0YW5jZXM6IGludGVyYWN0aW9uLmFmZmVjdGVkRXZlbnRzLmluc3RhbmNlcyxcbiAgICAgICAgICAgIGlzRXZlbnQ6IGludGVyYWN0aW9uLmlzRXZlbnQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9zbGljZURhdGVTcGFuKGRhdGVTcGFuLCBkYXRlUHJvZmlsZSwgbmV4dERheVRocmVzaG9sZCwgZXZlbnRVaUJhc2VzLCBjb250ZXh0LCAuLi5leHRyYUFyZ3MpIHtcbiAgICAgICAgaWYgKCFkYXRlU3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhY3RpdmVSYW5nZSA9IGNvbXB1dGVBY3RpdmVSYW5nZShkYXRlUHJvZmlsZSwgQm9vbGVhbihuZXh0RGF5VGhyZXNob2xkKSk7XG4gICAgICAgIGxldCBhY3RpdmVEYXRlU3BhblJhbmdlID0gaW50ZXJzZWN0UmFuZ2VzKGRhdGVTcGFuLnJhbmdlLCBhY3RpdmVSYW5nZSk7XG4gICAgICAgIGlmIChhY3RpdmVEYXRlU3BhblJhbmdlKSB7XG4gICAgICAgICAgICBkYXRlU3BhbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0ZVNwYW4pLCB7IHJhbmdlOiBhY3RpdmVEYXRlU3BhblJhbmdlIH0pO1xuICAgICAgICAgICAgbGV0IGV2ZW50UmFuZ2UgPSBmYWJyaWNhdGVFdmVudFJhbmdlKGRhdGVTcGFuLCBldmVudFVpQmFzZXMsIGNvbnRleHQpO1xuICAgICAgICAgICAgbGV0IHNlZ3MgPSB0aGlzLnNsaWNlUmFuZ2UoZGF0ZVNwYW4ucmFuZ2UsIC4uLmV4dHJhQXJncyk7XG4gICAgICAgICAgICBmb3IgKGxldCBzZWcgb2Ygc2Vncykge1xuICAgICAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLypcbiAgICBcImNvbXBsZXRlXCIgc2VnIG1lYW5zIGl0IGhhcyBjb21wb25lbnQgYW5kIGV2ZW50UmFuZ2VcbiAgICAqL1xuICAgIHNsaWNlRXZlbnRSYW5nZXMoZXZlbnRSYW5nZXMsIGV4dHJhQXJncykge1xuICAgICAgICBsZXQgc2VncyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBldmVudFJhbmdlIG9mIGV2ZW50UmFuZ2VzKSB7XG4gICAgICAgICAgICBzZWdzLnB1c2goLi4udGhpcy5zbGljZUV2ZW50UmFuZ2UoZXZlbnRSYW5nZSwgZXh0cmFBcmdzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ3M7XG4gICAgfVxuICAgIC8qXG4gICAgXCJjb21wbGV0ZVwiIHNlZyBtZWFucyBpdCBoYXMgY29tcG9uZW50IGFuZCBldmVudFJhbmdlXG4gICAgKi9cbiAgICBzbGljZUV2ZW50UmFuZ2UoZXZlbnRSYW5nZSwgZXh0cmFBcmdzKSB7XG4gICAgICAgIGxldCBkYXRlUmFuZ2UgPSBldmVudFJhbmdlLnJhbmdlO1xuICAgICAgICAvLyBoYWNrIHRvIG1ha2UgbXVsdGktZGF5IGV2ZW50cyB0aGF0IGFyZSBiZWluZyBmb3JjZS1kaXNwbGF5ZWQgYXMgbGlzdC1pdGVtcyB0byB0YWtlIHVwIG9ubHkgb25lIGRheVxuICAgICAgICBpZiAodGhpcy5mb3JjZURheUlmTGlzdEl0ZW0gJiYgZXZlbnRSYW5nZS51aS5kaXNwbGF5ID09PSAnbGlzdC1pdGVtJykge1xuICAgICAgICAgICAgZGF0ZVJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiBhZGREYXlzKGRhdGVSYW5nZS5zdGFydCwgMSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCBzZWdzID0gdGhpcy5zbGljZVJhbmdlKGRhdGVSYW5nZSwgLi4uZXh0cmFBcmdzKTtcbiAgICAgICAgZm9yIChsZXQgc2VnIG9mIHNlZ3MpIHtcbiAgICAgICAgICAgIHNlZy5ldmVudFJhbmdlID0gZXZlbnRSYW5nZTtcbiAgICAgICAgICAgIHNlZy5pc1N0YXJ0ID0gZXZlbnRSYW5nZS5pc1N0YXJ0ICYmIHNlZy5pc1N0YXJ0O1xuICAgICAgICAgICAgc2VnLmlzRW5kID0gZXZlbnRSYW5nZS5pc0VuZCAmJiBzZWcuaXNFbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlZ3M7XG4gICAgfVxufVxuLypcbmZvciBpbmNvcnBvcmF0aW5nIHNsb3RNaW5UaW1lL3Nsb3RNYXhUaW1lIGlmIGFwcHJvcHJpYXRlXG5UT0RPOiBzaG91bGQgYmUgcGFydCBvZiBEYXRlUHJvZmlsZSFcblRpbWVsaW5lRGF0ZVByb2ZpbGUgYWxyZWFkeSBkb2VzIHRoaXMgYnR3XG4qL1xuZnVuY3Rpb24gY29tcHV0ZUFjdGl2ZVJhbmdlKGRhdGVQcm9maWxlLCBpc0NvbXBvbmVudEFsbERheSkge1xuICAgIGxldCByYW5nZSA9IGRhdGVQcm9maWxlLmFjdGl2ZVJhbmdlO1xuICAgIGlmIChpc0NvbXBvbmVudEFsbERheSkge1xuICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiBhZGRNcyhyYW5nZS5zdGFydCwgZGF0ZVByb2ZpbGUuc2xvdE1pblRpbWUubWlsbGlzZWNvbmRzKSxcbiAgICAgICAgZW5kOiBhZGRNcyhyYW5nZS5lbmQsIGRhdGVQcm9maWxlLnNsb3RNYXhUaW1lLm1pbGxpc2Vjb25kcyAtIDg2NGU1KSwgLy8gODY0ZTUgPSBtcyBpbiBhIGRheVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJlZHVjZUV2ZW50U3RvcmUoZXZlbnRTdG9yZSwgYWN0aW9uLCBldmVudFNvdXJjZXMsIGRhdGVQcm9maWxlLCBjb250ZXh0KSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlICdSRUNFSVZFX0VWRU5UUyc6IC8vIHJhd1xuICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2VzW2FjdGlvbi5zb3VyY2VJZF0sIGFjdGlvbi5mZXRjaElkLCBhY3Rpb24uZmV0Y2hSYW5nZSwgYWN0aW9uLnJhd0V2ZW50cywgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ1JFU0VUX1JBV19FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlc2V0UmF3RXZlbnRzKGV2ZW50U3RvcmUsIGV2ZW50U291cmNlc1thY3Rpb24uc291cmNlSWRdLCBhY3Rpb24ucmF3RXZlbnRzLCBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSwgY29udGV4dCk7XG4gICAgICAgIGNhc2UgJ0FERF9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCwgYnV0IG5vdCBleHBhbmRlZFxuICAgICAgICAgICAgcmV0dXJuIGFkZEV2ZW50KGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlLCAvLyBuZXcgb25lc1xuICAgICAgICAgICAgZGF0ZVByb2ZpbGUgPyBkYXRlUHJvZmlsZS5hY3RpdmVSYW5nZSA6IG51bGwsIGNvbnRleHQpO1xuICAgICAgICBjYXNlICdSRVNFVF9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5ldmVudFN0b3JlO1xuICAgICAgICBjYXNlICdNRVJHRV9FVkVOVFMnOiAvLyBhbHJlYWR5IHBhcnNlZCBhbmQgZXhwYW5kZWRcbiAgICAgICAgICAgIHJldHVybiBtZXJnZUV2ZW50U3RvcmVzKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUFJFVic6IC8vIFRPRE86IGhvdyBkbyB3ZSB0cmFjayBhbGwgYWN0aW9ucyB0aGF0IGFmZmVjdCBkYXRlUHJvZmlsZSA6KFxuICAgICAgICBjYXNlICdORVhUJzpcbiAgICAgICAgY2FzZSAnQ0hBTkdFX0RBVEUnOlxuICAgICAgICBjYXNlICdDSEFOR0VfVklFV19UWVBFJzpcbiAgICAgICAgICAgIGlmIChkYXRlUHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBhbmRSZWN1cnJpbmcoZXZlbnRTdG9yZSwgZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmU7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9FVkVOVFMnOlxuICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVTdWJFdmVudFN0b3JlKGV2ZW50U3RvcmUsIGFjdGlvbi5ldmVudFN0b3JlKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0VWRU5UX1NPVVJDRSc6XG4gICAgICAgICAgICByZXR1cm4gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgYWN0aW9uLnNvdXJjZUlkKTtcbiAgICAgICAgY2FzZSAnUkVNT1ZFX0FMTF9FVkVOVF9TT1VSQ0VTJzpcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJFdmVudFN0b3JlRGVmcyhldmVudFN0b3JlLCAoZXZlbnREZWYpID0+ICghZXZlbnREZWYuc291cmNlSWQgLy8gb25seSBrZWVwIGV2ZW50cyB3aXRoIG5vIHNvdXJjZSBpZFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIGNhc2UgJ1JFTU9WRV9BTExfRVZFTlRTJzpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBldmVudFN0b3JlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlY2VpdmVSYXdFdmVudHMoZXZlbnRTdG9yZSwgZXZlbnRTb3VyY2UsIGZldGNoSWQsIGZldGNoUmFuZ2UsIHJhd0V2ZW50cywgY29udGV4dCkge1xuICAgIGlmIChldmVudFNvdXJjZSAmJiAvLyBub3QgYWxyZWFkeSByZW1vdmVkXG4gICAgICAgIGZldGNoSWQgPT09IGV2ZW50U291cmNlLmxhdGVzdEZldGNoSWQgLy8gVE9ETzogd2lzaCB0aGlzIGxvZ2ljIHdhcyBhbHdheXMgaW4gZXZlbnQtc291cmNlc1xuICAgICkge1xuICAgICAgICBsZXQgc3Vic2V0ID0gcGFyc2VFdmVudHModHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpLCBldmVudFNvdXJjZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChmZXRjaFJhbmdlKSB7XG4gICAgICAgICAgICBzdWJzZXQgPSBleHBhbmRSZWN1cnJpbmcoc3Vic2V0LCBmZXRjaFJhbmdlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVyZ2VFdmVudFN0b3JlcyhleGNsdWRlRXZlbnRzQnlTb3VyY2VJZChldmVudFN0b3JlLCBldmVudFNvdXJjZS5zb3VyY2VJZCksIHN1YnNldCk7XG4gICAgfVxuICAgIHJldHVybiBldmVudFN0b3JlO1xufVxuZnVuY3Rpb24gcmVzZXRSYXdFdmVudHMoZXhpc3RpbmdFdmVudFN0b3JlLCBldmVudFNvdXJjZSwgcmF3RXZlbnRzLCBhY3RpdmVSYW5nZSwgY29udGV4dCkge1xuICAgIGNvbnN0IHsgZGVmSWRNYXAsIGluc3RhbmNlSWRNYXAgfSA9IGJ1aWxkUHVibGljSWRNYXBzKGV4aXN0aW5nRXZlbnRTdG9yZSk7XG4gICAgbGV0IG5ld0V2ZW50U3RvcmUgPSBwYXJzZUV2ZW50cyh0cmFuc2Zvcm1SYXdFdmVudHMocmF3RXZlbnRzLCBldmVudFNvdXJjZSwgY29udGV4dCksIGV2ZW50U291cmNlLCBjb250ZXh0LCBmYWxzZSwgZGVmSWRNYXAsIGluc3RhbmNlSWRNYXApO1xuICAgIHJldHVybiBleHBhbmRSZWN1cnJpbmcobmV3RXZlbnRTdG9yZSwgYWN0aXZlUmFuZ2UsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtUmF3RXZlbnRzKHJhd0V2ZW50cywgZXZlbnRTb3VyY2UsIGNvbnRleHQpIHtcbiAgICBsZXQgY2FsRWFjaFRyYW5zZm9ybSA9IGNvbnRleHQub3B0aW9ucy5ldmVudERhdGFUcmFuc2Zvcm07XG4gICAgbGV0IHNvdXJjZUVhY2hUcmFuc2Zvcm0gPSBldmVudFNvdXJjZSA/IGV2ZW50U291cmNlLmV2ZW50RGF0YVRyYW5zZm9ybSA6IG51bGw7XG4gICAgaWYgKHNvdXJjZUVhY2hUcmFuc2Zvcm0pIHtcbiAgICAgICAgcmF3RXZlbnRzID0gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgc291cmNlRWFjaFRyYW5zZm9ybSk7XG4gICAgfVxuICAgIGlmIChjYWxFYWNoVHJhbnNmb3JtKSB7XG4gICAgICAgIHJhd0V2ZW50cyA9IHRyYW5zZm9ybUVhY2hSYXdFdmVudChyYXdFdmVudHMsIGNhbEVhY2hUcmFuc2Zvcm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmF3RXZlbnRzO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtRWFjaFJhd0V2ZW50KHJhd0V2ZW50cywgZnVuYykge1xuICAgIGxldCByZWZpbmVkRXZlbnRzO1xuICAgIGlmICghZnVuYykge1xuICAgICAgICByZWZpbmVkRXZlbnRzID0gcmF3RXZlbnRzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmVmaW5lZEV2ZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByYXdFdmVudCBvZiByYXdFdmVudHMpIHtcbiAgICAgICAgICAgIGxldCByZWZpbmVkRXZlbnQgPSBmdW5jKHJhd0V2ZW50KTtcbiAgICAgICAgICAgIGlmIChyZWZpbmVkRXZlbnQpIHtcbiAgICAgICAgICAgICAgICByZWZpbmVkRXZlbnRzLnB1c2gocmVmaW5lZEV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlZmluZWRFdmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVmaW5lZEV2ZW50cy5wdXNoKHJhd0V2ZW50KTtcbiAgICAgICAgICAgIH0gLy8gaWYgYSBkaWZmZXJlbnQgZmFsc3kgdmFsdWUsIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVmaW5lZEV2ZW50cztcbn1cbmZ1bmN0aW9uIGFkZEV2ZW50KGV2ZW50U3RvcmUsIHN1YnNldCwgZXhwYW5kUmFuZ2UsIGNvbnRleHQpIHtcbiAgICBpZiAoZXhwYW5kUmFuZ2UpIHtcbiAgICAgICAgc3Vic2V0ID0gZXhwYW5kUmVjdXJyaW5nKHN1YnNldCwgZXhwYW5kUmFuZ2UsIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VFdmVudFN0b3JlcyhldmVudFN0b3JlLCBzdWJzZXQpO1xufVxuZnVuY3Rpb24gcmV6b25lRXZlbnRTdG9yZURhdGVzKGV2ZW50U3RvcmUsIG9sZERhdGVFbnYsIG5ld0RhdGVFbnYpIHtcbiAgICBsZXQgeyBkZWZzIH0gPSBldmVudFN0b3JlO1xuICAgIGxldCBpbnN0YW5jZXMgPSBtYXBIYXNoKGV2ZW50U3RvcmUuaW5zdGFuY2VzLCAoaW5zdGFuY2UpID0+IHtcbiAgICAgICAgbGV0IGRlZiA9IGRlZnNbaW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBpZiAoZGVmLmFsbERheSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOyAvLyBpc24ndCBkZXBlbmRlbnQgb24gdGltZXpvbmVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbnN0YW5jZSksIHsgcmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBzdGFydDogbmV3RGF0ZUVudi5jcmVhdGVNYXJrZXIob2xkRGF0ZUVudi50b0RhdGUoaW5zdGFuY2UucmFuZ2Uuc3RhcnQsIGluc3RhbmNlLmZvcmNlZFN0YXJ0VHpvKSksXG4gICAgICAgICAgICAgICAgZW5kOiBuZXdEYXRlRW52LmNyZWF0ZU1hcmtlcihvbGREYXRlRW52LnRvRGF0ZShpbnN0YW5jZS5yYW5nZS5lbmQsIGluc3RhbmNlLmZvcmNlZEVuZFR6bykpLFxuICAgICAgICAgICAgfSwgZm9yY2VkU3RhcnRUem86IG5ld0RhdGVFbnYuY2FuQ29tcHV0ZU9mZnNldCA/IG51bGwgOiBpbnN0YW5jZS5mb3JjZWRTdGFydFR6bywgZm9yY2VkRW5kVHpvOiBuZXdEYXRlRW52LmNhbkNvbXB1dGVPZmZzZXQgPyBudWxsIDogaW5zdGFuY2UuZm9yY2VkRW5kVHpvIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB7IGRlZnMsIGluc3RhbmNlcyB9O1xufVxuZnVuY3Rpb24gZXhjbHVkZUV2ZW50c0J5U291cmNlSWQoZXZlbnRTdG9yZSwgc291cmNlSWQpIHtcbiAgICByZXR1cm4gZmlsdGVyRXZlbnRTdG9yZURlZnMoZXZlbnRTdG9yZSwgKGV2ZW50RGVmKSA9PiBldmVudERlZi5zb3VyY2VJZCAhPT0gc291cmNlSWQpO1xufVxuLy8gUVVFU1RJT046IHdoeSBub3QganVzdCByZXR1cm4gaW5zdGFuY2VzPyBkbyBhIGdlbmVyYWwgb2JqZWN0LXByb3BlcnR5LWV4Y2x1c2lvbiB1dGlsXG5mdW5jdGlvbiBleGNsdWRlSW5zdGFuY2VzKGV2ZW50U3RvcmUsIHJlbW92YWxzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGVmczogZXZlbnRTdG9yZS5kZWZzLFxuICAgICAgICBpbnN0YW5jZXM6IGZpbHRlckhhc2goZXZlbnRTdG9yZS5pbnN0YW5jZXMsIChpbnN0YW5jZSkgPT4gIXJlbW92YWxzW2luc3RhbmNlLmluc3RhbmNlSWRdKSxcbiAgICB9O1xufVxuZnVuY3Rpb24gYnVpbGRQdWJsaWNJZE1hcHMoZXZlbnRTdG9yZSkge1xuICAgIGNvbnN0IHsgZGVmcywgaW5zdGFuY2VzIH0gPSBldmVudFN0b3JlO1xuICAgIGNvbnN0IGRlZklkTWFwID0ge307XG4gICAgY29uc3QgaW5zdGFuY2VJZE1hcCA9IHt9O1xuICAgIGZvciAobGV0IGRlZklkIGluIGRlZnMpIHtcbiAgICAgICAgY29uc3QgZGVmID0gZGVmc1tkZWZJZF07XG4gICAgICAgIGNvbnN0IHsgcHVibGljSWQgfSA9IGRlZjtcbiAgICAgICAgaWYgKHB1YmxpY0lkKSB7XG4gICAgICAgICAgICBkZWZJZE1hcFtwdWJsaWNJZF0gPSBkZWZJZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgICAgICAgY29uc3QgZGVmID0gZGVmc1tpbnN0YW5jZS5kZWZJZF07XG4gICAgICAgIGNvbnN0IHsgcHVibGljSWQgfSA9IGRlZjtcbiAgICAgICAgaWYgKHB1YmxpY0lkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUlkTWFwW3B1YmxpY0lkXSA9IGluc3RhbmNlSWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZGVmSWRNYXAsIGluc3RhbmNlSWRNYXAgfTtcbn1cblxuLy8gaGlnaC1sZXZlbCBzZWdtZW50aW5nLWF3YXJlIHRlc3RlciBmdW5jdGlvbnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gaXNJbnRlcmFjdGlvblZhbGlkKGludGVyYWN0aW9uLCBkYXRlUHJvZmlsZSwgY29udGV4dCkge1xuICAgIGxldCB7IGluc3RhbmNlcyB9ID0gaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cztcbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICBpZiAoIXJhbmdlQ29udGFpbnNSYW5nZShkYXRlUHJvZmlsZS52YWxpZFJhbmdlLCBpbnN0YW5jZXNbaW5zdGFuY2VJZF0ucmFuZ2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlzTmV3UHJvcHNWYWxpZCh7IGV2ZW50RHJhZzogaW50ZXJhY3Rpb24gfSwgY29udGV4dCk7IC8vIEhBQ0s6IHRoZSBldmVudERyYWcgcHJvcHMgaXMgdXNlZCBmb3IgQUxMIGludGVyYWN0aW9uc1xufVxuZnVuY3Rpb24gaXNEYXRlU2VsZWN0aW9uVmFsaWQoZGF0ZVNlbGVjdGlvbiwgZGF0ZVByb2ZpbGUsIGNvbnRleHQpIHtcbiAgICBpZiAoIXJhbmdlQ29udGFpbnNSYW5nZShkYXRlUHJvZmlsZS52YWxpZFJhbmdlLCBkYXRlU2VsZWN0aW9uLnJhbmdlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpc05ld1Byb3BzVmFsaWQoeyBkYXRlU2VsZWN0aW9uIH0sIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNOZXdQcm9wc1ZhbGlkKG5ld1Byb3BzLCBjb250ZXh0KSB7XG4gICAgbGV0IGNhbGVuZGFyU3RhdGUgPSBjb250ZXh0LmdldEN1cnJlbnREYXRhKCk7XG4gICAgbGV0IHByb3BzID0gT2JqZWN0LmFzc2lnbih7IGJ1c2luZXNzSG91cnM6IGNhbGVuZGFyU3RhdGUuYnVzaW5lc3NIb3VycywgZGF0ZVNlbGVjdGlvbjogJycsIGV2ZW50U3RvcmU6IGNhbGVuZGFyU3RhdGUuZXZlbnRTdG9yZSwgZXZlbnRVaUJhc2VzOiBjYWxlbmRhclN0YXRlLmV2ZW50VWlCYXNlcywgZXZlbnRTZWxlY3Rpb246ICcnLCBldmVudERyYWc6IG51bGwsIGV2ZW50UmVzaXplOiBudWxsIH0sIG5ld1Byb3BzKTtcbiAgICByZXR1cm4gKGNvbnRleHQucGx1Z2luSG9va3MuaXNQcm9wc1ZhbGlkIHx8IGlzUHJvcHNWYWxpZCkocHJvcHMsIGNvbnRleHQpO1xufVxuZnVuY3Rpb24gaXNQcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEgPSB7fSwgZmlsdGVyQ29uZmlnKSB7XG4gICAgaWYgKHN0YXRlLmV2ZW50RHJhZyAmJiAhaXNJbnRlcmFjdGlvblByb3BzVmFsaWQoc3RhdGUsIGNvbnRleHQsIGRhdGVTcGFuTWV0YSwgZmlsdGVyQ29uZmlnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5kYXRlU2VsZWN0aW9uICYmICFpc0RhdGVTZWxlY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIE1vdmluZyBFdmVudCBWYWxpZGF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmZ1bmN0aW9uIGlzSW50ZXJhY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykge1xuICAgIGxldCBjdXJyZW50U3RhdGUgPSBjb250ZXh0LmdldEN1cnJlbnREYXRhKCk7XG4gICAgbGV0IGludGVyYWN0aW9uID0gc3RhdGUuZXZlbnREcmFnOyAvLyBIQUNLOiB0aGUgZXZlbnREcmFnIHByb3BzIGlzIHVzZWQgZm9yIEFMTCBpbnRlcmFjdGlvbnNcbiAgICBsZXQgc3ViamVjdEV2ZW50U3RvcmUgPSBpbnRlcmFjdGlvbi5tdXRhdGVkRXZlbnRzO1xuICAgIGxldCBzdWJqZWN0RGVmcyA9IHN1YmplY3RFdmVudFN0b3JlLmRlZnM7XG4gICAgbGV0IHN1YmplY3RJbnN0YW5jZXMgPSBzdWJqZWN0RXZlbnRTdG9yZS5pbnN0YW5jZXM7XG4gICAgbGV0IHN1YmplY3RDb25maWdzID0gY29tcGlsZUV2ZW50VWlzKHN1YmplY3REZWZzLCBpbnRlcmFjdGlvbi5pc0V2ZW50ID9cbiAgICAgICAgc3RhdGUuZXZlbnRVaUJhc2VzIDpcbiAgICAgICAgeyAnJzogY3VycmVudFN0YXRlLnNlbGVjdGlvbkNvbmZpZyB9KTtcbiAgICBpZiAoZmlsdGVyQ29uZmlnKSB7XG4gICAgICAgIHN1YmplY3RDb25maWdzID0gbWFwSGFzaChzdWJqZWN0Q29uZmlncywgZmlsdGVyQ29uZmlnKTtcbiAgICB9XG4gICAgLy8gZXhjbHVkZSB0aGUgc3ViamVjdCBldmVudHMuIFRPRE86IGV4Y2x1ZGUgZGVmcyB0b28/XG4gICAgbGV0IG90aGVyRXZlbnRTdG9yZSA9IGV4Y2x1ZGVJbnN0YW5jZXMoc3RhdGUuZXZlbnRTdG9yZSwgaW50ZXJhY3Rpb24uYWZmZWN0ZWRFdmVudHMuaW5zdGFuY2VzKTtcbiAgICBsZXQgb3RoZXJEZWZzID0gb3RoZXJFdmVudFN0b3JlLmRlZnM7XG4gICAgbGV0IG90aGVySW5zdGFuY2VzID0gb3RoZXJFdmVudFN0b3JlLmluc3RhbmNlcztcbiAgICBsZXQgb3RoZXJDb25maWdzID0gY29tcGlsZUV2ZW50VWlzKG90aGVyRGVmcywgc3RhdGUuZXZlbnRVaUJhc2VzKTtcbiAgICBmb3IgKGxldCBzdWJqZWN0SW5zdGFuY2VJZCBpbiBzdWJqZWN0SW5zdGFuY2VzKSB7XG4gICAgICAgIGxldCBzdWJqZWN0SW5zdGFuY2UgPSBzdWJqZWN0SW5zdGFuY2VzW3N1YmplY3RJbnN0YW5jZUlkXTtcbiAgICAgICAgbGV0IHN1YmplY3RSYW5nZSA9IHN1YmplY3RJbnN0YW5jZS5yYW5nZTtcbiAgICAgICAgbGV0IHN1YmplY3RDb25maWcgPSBzdWJqZWN0Q29uZmlnc1tzdWJqZWN0SW5zdGFuY2UuZGVmSWRdO1xuICAgICAgICBsZXQgc3ViamVjdERlZiA9IHN1YmplY3REZWZzW3N1YmplY3RJbnN0YW5jZS5kZWZJZF07XG4gICAgICAgIC8vIGNvbnN0cmFpbnRcbiAgICAgICAgaWYgKCFhbGxDb25zdHJhaW50c1Bhc3Moc3ViamVjdENvbmZpZy5jb25zdHJhaW50cywgc3ViamVjdFJhbmdlLCBvdGhlckV2ZW50U3RvcmUsIHN0YXRlLmJ1c2luZXNzSG91cnMsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3ZlcmxhcFxuICAgICAgICBsZXQgeyBldmVudE92ZXJsYXAgfSA9IGNvbnRleHQub3B0aW9ucztcbiAgICAgICAgbGV0IGV2ZW50T3ZlcmxhcEZ1bmMgPSB0eXBlb2YgZXZlbnRPdmVybGFwID09PSAnZnVuY3Rpb24nID8gZXZlbnRPdmVybGFwIDogbnVsbDtcbiAgICAgICAgZm9yIChsZXQgb3RoZXJJbnN0YW5jZUlkIGluIG90aGVySW5zdGFuY2VzKSB7XG4gICAgICAgICAgICBsZXQgb3RoZXJJbnN0YW5jZSA9IG90aGVySW5zdGFuY2VzW290aGVySW5zdGFuY2VJZF07XG4gICAgICAgICAgICAvLyBpbnRlcnNlY3QhIGV2YWx1YXRlXG4gICAgICAgICAgICBpZiAocmFuZ2VzSW50ZXJzZWN0KHN1YmplY3RSYW5nZSwgb3RoZXJJbnN0YW5jZS5yYW5nZSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3RoZXJPdmVybGFwID0gb3RoZXJDb25maWdzW290aGVySW5zdGFuY2UuZGVmSWRdLm92ZXJsYXA7XG4gICAgICAgICAgICAgICAgLy8gY29uc2lkZXIgdGhlIG90aGVyIGV2ZW50J3Mgb3ZlcmxhcC4gb25seSBkbyB0aGlzIGlmIHRoZSBzdWJqZWN0IGV2ZW50IGlzIGEgXCJyZWFsXCIgZXZlbnRcbiAgICAgICAgICAgICAgICBpZiAob3RoZXJPdmVybGFwID09PSBmYWxzZSAmJiBpbnRlcmFjdGlvbi5pc0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YmplY3RDb25maWcub3ZlcmxhcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRPdmVybGFwRnVuYyAmJiAhZXZlbnRPdmVybGFwRnVuYyhuZXcgRXZlbnRJbXBsKGNvbnRleHQsIG90aGVyRGVmc1tvdGhlckluc3RhbmNlLmRlZklkXSwgb3RoZXJJbnN0YW5jZSksIC8vIHN0aWxsIGV2ZW50XG4gICAgICAgICAgICAgICAgbmV3IEV2ZW50SW1wbChjb250ZXh0LCBzdWJqZWN0RGVmLCBzdWJqZWN0SW5zdGFuY2UpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGFsbG93IChhIGZ1bmN0aW9uKVxuICAgICAgICBsZXQgY2FsZW5kYXJFdmVudFN0b3JlID0gY3VycmVudFN0YXRlLmV2ZW50U3RvcmU7IC8vIG5lZWQgZ2xvYmFsLXRvLWNhbGVuZGFyLCBub3QgbG9jYWwgdG8gY29tcG9uZW50IChzcGxpdHRhYmxlKXN0YXRlXG4gICAgICAgIGZvciAobGV0IHN1YmplY3RBbGxvdyBvZiBzdWJqZWN0Q29uZmlnLmFsbG93cykge1xuICAgICAgICAgICAgbGV0IHN1YmplY3REYXRlU3BhbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0ZVNwYW5NZXRhKSwgeyByYW5nZTogc3ViamVjdEluc3RhbmNlLnJhbmdlLCBhbGxEYXk6IHN1YmplY3REZWYuYWxsRGF5IH0pO1xuICAgICAgICAgICAgbGV0IG9yaWdEZWYgPSBjYWxlbmRhckV2ZW50U3RvcmUuZGVmc1tzdWJqZWN0RGVmLmRlZklkXTtcbiAgICAgICAgICAgIGxldCBvcmlnSW5zdGFuY2UgPSBjYWxlbmRhckV2ZW50U3RvcmUuaW5zdGFuY2VzW3N1YmplY3RJbnN0YW5jZUlkXTtcbiAgICAgICAgICAgIGxldCBldmVudEFwaTtcbiAgICAgICAgICAgIGlmIChvcmlnRGVmKSB7IC8vIHdhcyBwcmV2aW91c2x5IGluIHRoZSBjYWxlbmRhclxuICAgICAgICAgICAgICAgIGV2ZW50QXBpID0gbmV3IEV2ZW50SW1wbChjb250ZXh0LCBvcmlnRGVmLCBvcmlnSW5zdGFuY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIHdhcyBhbiBleHRlcm5hbCBldmVudFxuICAgICAgICAgICAgICAgIGV2ZW50QXBpID0gbmV3IEV2ZW50SW1wbChjb250ZXh0LCBzdWJqZWN0RGVmKTsgLy8gbm8gaW5zdGFuY2UsIGJlY2F1c2UgaGFkIG5vIGRhdGVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN1YmplY3RBbGxvdyhidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQoc3ViamVjdERhdGVTcGFuLCBjb250ZXh0KSwgZXZlbnRBcGkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLy8gRGF0ZSBTZWxlY3Rpb24gVmFsaWRhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBpc0RhdGVTZWxlY3Rpb25Qcm9wc1ZhbGlkKHN0YXRlLCBjb250ZXh0LCBkYXRlU3Bhbk1ldGEsIGZpbHRlckNvbmZpZykge1xuICAgIGxldCByZWxldmFudEV2ZW50U3RvcmUgPSBzdGF0ZS5ldmVudFN0b3JlO1xuICAgIGxldCByZWxldmFudERlZnMgPSByZWxldmFudEV2ZW50U3RvcmUuZGVmcztcbiAgICBsZXQgcmVsZXZhbnRJbnN0YW5jZXMgPSByZWxldmFudEV2ZW50U3RvcmUuaW5zdGFuY2VzO1xuICAgIGxldCBzZWxlY3Rpb24gPSBzdGF0ZS5kYXRlU2VsZWN0aW9uO1xuICAgIGxldCBzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5yYW5nZTtcbiAgICBsZXQgeyBzZWxlY3Rpb25Db25maWcgfSA9IGNvbnRleHQuZ2V0Q3VycmVudERhdGEoKTtcbiAgICBpZiAoZmlsdGVyQ29uZmlnKSB7XG4gICAgICAgIHNlbGVjdGlvbkNvbmZpZyA9IGZpbHRlckNvbmZpZyhzZWxlY3Rpb25Db25maWcpO1xuICAgIH1cbiAgICAvLyBjb25zdHJhaW50XG4gICAgaWYgKCFhbGxDb25zdHJhaW50c1Bhc3Moc2VsZWN0aW9uQ29uZmlnLmNvbnN0cmFpbnRzLCBzZWxlY3Rpb25SYW5nZSwgcmVsZXZhbnRFdmVudFN0b3JlLCBzdGF0ZS5idXNpbmVzc0hvdXJzLCBjb250ZXh0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIG92ZXJsYXBcbiAgICBsZXQgeyBzZWxlY3RPdmVybGFwIH0gPSBjb250ZXh0Lm9wdGlvbnM7XG4gICAgbGV0IHNlbGVjdE92ZXJsYXBGdW5jID0gdHlwZW9mIHNlbGVjdE92ZXJsYXAgPT09ICdmdW5jdGlvbicgPyBzZWxlY3RPdmVybGFwIDogbnVsbDtcbiAgICBmb3IgKGxldCByZWxldmFudEluc3RhbmNlSWQgaW4gcmVsZXZhbnRJbnN0YW5jZXMpIHtcbiAgICAgICAgbGV0IHJlbGV2YW50SW5zdGFuY2UgPSByZWxldmFudEluc3RhbmNlc1tyZWxldmFudEluc3RhbmNlSWRdO1xuICAgICAgICAvLyBpbnRlcnNlY3QhIGV2YWx1YXRlXG4gICAgICAgIGlmIChyYW5nZXNJbnRlcnNlY3Qoc2VsZWN0aW9uUmFuZ2UsIHJlbGV2YW50SW5zdGFuY2UucmFuZ2UpKSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uQ29uZmlnLm92ZXJsYXAgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGVjdE92ZXJsYXBGdW5jICYmICFzZWxlY3RPdmVybGFwRnVuYyhuZXcgRXZlbnRJbXBsKGNvbnRleHQsIHJlbGV2YW50RGVmc1tyZWxldmFudEluc3RhbmNlLmRlZklkXSwgcmVsZXZhbnRJbnN0YW5jZSksIG51bGwpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFsbG93IChhIGZ1bmN0aW9uKVxuICAgIGZvciAobGV0IHNlbGVjdGlvbkFsbG93IG9mIHNlbGVjdGlvbkNvbmZpZy5hbGxvd3MpIHtcbiAgICAgICAgbGV0IGZ1bGxEYXRlU3BhbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0ZVNwYW5NZXRhKSwgc2VsZWN0aW9uKTtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25BbGxvdyhidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQoZnVsbERhdGVTcGFuLCBjb250ZXh0KSwgbnVsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIENvbnN0cmFpbnQgVXRpbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gYWxsQ29uc3RyYWludHNQYXNzKGNvbnN0cmFpbnRzLCBzdWJqZWN0UmFuZ2UsIG90aGVyRXZlbnRTdG9yZSwgYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQsIGNvbnRleHQpIHtcbiAgICBmb3IgKGxldCBjb25zdHJhaW50IG9mIGNvbnN0cmFpbnRzKSB7XG4gICAgICAgIGlmICghYW55UmFuZ2VzQ29udGFpblJhbmdlKGNvbnN0cmFpbnRUb1Jhbmdlcyhjb25zdHJhaW50LCBzdWJqZWN0UmFuZ2UsIG90aGVyRXZlbnRTdG9yZSwgYnVzaW5lc3NIb3Vyc1VuZXhwYW5kZWQsIGNvbnRleHQpLCBzdWJqZWN0UmFuZ2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjb25zdHJhaW50VG9SYW5nZXMoY29uc3RyYWludCwgc3ViamVjdFJhbmdlLCAvLyBmb3IgZXhwYW5kaW5nIGEgcmVjdXJyaW5nIGNvbnN0cmFpbnQsIG9yIGV4cGFuZGluZyBidXNpbmVzcyBob3Vyc1xub3RoZXJFdmVudFN0b3JlLCAvLyBmb3IgaWYgY29uc3RyYWludCBpcyBhbiBldmVuIGdyb3VwIElEXG5idXNpbmVzc0hvdXJzVW5leHBhbmRlZCwgLy8gZm9yIGlmIGNvbnN0cmFpbnQgaXMgJ2J1c2luZXNzSG91cnMnXG5jb250ZXh0KSB7XG4gICAgaWYgKGNvbnN0cmFpbnQgPT09ICdidXNpbmVzc0hvdXJzJykge1xuICAgICAgICByZXR1cm4gZXZlbnRTdG9yZVRvUmFuZ2VzKGV4cGFuZFJlY3VycmluZyhidXNpbmVzc0hvdXJzVW5leHBhbmRlZCwgc3ViamVjdFJhbmdlLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29uc3RyYWludCA9PT0gJ3N0cmluZycpIHsgLy8gYW4gZ3JvdXAgSURcbiAgICAgICAgcmV0dXJuIGV2ZW50U3RvcmVUb1JhbmdlcyhmaWx0ZXJFdmVudFN0b3JlRGVmcyhvdGhlckV2ZW50U3RvcmUsIChldmVudERlZikgPT4gZXZlbnREZWYuZ3JvdXBJZCA9PT0gY29uc3RyYWludCkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnN0cmFpbnQgPT09ICdvYmplY3QnICYmIGNvbnN0cmFpbnQpIHsgLy8gbm9uLW51bGwgb2JqZWN0XG4gICAgICAgIHJldHVybiBldmVudFN0b3JlVG9SYW5nZXMoZXhwYW5kUmVjdXJyaW5nKGNvbnN0cmFpbnQsIHN1YmplY3RSYW5nZSwgY29udGV4dCkpO1xuICAgIH1cbiAgICByZXR1cm4gW107IC8vIGlmIGl0J3MgZmFsc2Vcbn1cbi8vIFRPRE86IG1vdmUgdG8gZXZlbnQtc3RvcmUgZmlsZT9cbmZ1bmN0aW9uIGV2ZW50U3RvcmVUb1JhbmdlcyhldmVudFN0b3JlKSB7XG4gICAgbGV0IHsgaW5zdGFuY2VzIH0gPSBldmVudFN0b3JlO1xuICAgIGxldCByYW5nZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpbnN0YW5jZUlkIGluIGluc3RhbmNlcykge1xuICAgICAgICByYW5nZXMucHVzaChpbnN0YW5jZXNbaW5zdGFuY2VJZF0ucmFuZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuLy8gVE9ETzogbW92ZSB0byBnZW9tIGZpbGU/XG5mdW5jdGlvbiBhbnlSYW5nZXNDb250YWluUmFuZ2Uob3V0ZXJSYW5nZXMsIGlubmVyUmFuZ2UpIHtcbiAgICBmb3IgKGxldCBvdXRlclJhbmdlIG9mIG91dGVyUmFuZ2VzKSB7XG4gICAgICAgIGlmIChyYW5nZUNvbnRhaW5zUmFuZ2Uob3V0ZXJSYW5nZSwgaW5uZXJSYW5nZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuY2xhc3MgSnNvblJlcXVlc3RFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCByZXNwb25zZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHJlcXVlc3RKc29uKG1ldGhvZCwgdXJsLCBwYXJhbXMpIHtcbiAgICBtZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSB7XG4gICAgICAgIG1ldGhvZCxcbiAgICB9O1xuICAgIGlmIChtZXRob2QgPT09ICdHRVQnKSB7XG4gICAgICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICtcbiAgICAgICAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpO1xuICAgICAgICBmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKS50aGVuKChmZXRjaFJlcykgPT4ge1xuICAgICAgICBpZiAoZmV0Y2hSZXMub2spIHtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaFJlcy5qc29uKCkudGhlbigocGFyc2VkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BhcnNlZFJlc3BvbnNlLCBmZXRjaFJlc107XG4gICAgICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25SZXF1ZXN0RXJyb3IoJ0ZhaWx1cmUgcGFyc2luZyBKU09OJywgZmV0Y2hSZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSnNvblJlcXVlc3RFcnJvcignUmVxdWVzdCBmYWlsZWQnLCBmZXRjaFJlcyk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuY2xhc3MgRGVsYXllZFJ1bm5lciB7XG4gICAgY29uc3RydWN0b3IoZHJhaW5lZE9wdGlvbikge1xuICAgICAgICB0aGlzLmRyYWluZWRPcHRpb24gPSBkcmFpbmVkT3B0aW9uO1xuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXVzZURlcHRocyA9IHt9O1xuICAgICAgICB0aGlzLnRpbWVvdXRJZCA9IDA7XG4gICAgfVxuICAgIHJlcXVlc3QoZGVsYXkpIHtcbiAgICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLmlzUGF1c2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KCk7XG4gICAgICAgICAgICBpZiAoZGVsYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJ5RHJhaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dCgvLyBOT1QgT1BUSU1BTCEgVE9ETzogbG9vayBhdCBkZWJvdW5jZVxuICAgICAgICAgICAgICAgIHRoaXMudHJ5RHJhaW4uYmluZCh0aGlzKSwgZGVsYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHBhdXNlKHNjb3BlID0gJycpIHtcbiAgICAgICAgbGV0IHsgcGF1c2VEZXB0aHMgfSA9IHRoaXM7XG4gICAgICAgIHBhdXNlRGVwdGhzW3Njb3BlXSA9IChwYXVzZURlcHRoc1tzY29wZV0gfHwgMCkgKyAxO1xuICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgIH1cbiAgICByZXN1bWUoc2NvcGUgPSAnJywgZm9yY2UpIHtcbiAgICAgICAgbGV0IHsgcGF1c2VEZXB0aHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChzY29wZSBpbiBwYXVzZURlcHRocykge1xuICAgICAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhdXNlRGVwdGhzW3Njb3BlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHBhdXNlRGVwdGhzW3Njb3BlXSAtPSAxO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IHBhdXNlRGVwdGhzW3Njb3BlXTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwdGggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGF1c2VEZXB0aHNbc2NvcGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudHJ5RHJhaW4oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc1BhdXNlZCgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucGF1c2VEZXB0aHMpLmxlbmd0aDtcbiAgICB9XG4gICAgdHJ5RHJhaW4oKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmcgJiYgIXRoaXMuaXNQYXVzZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuaXNEaXJ0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhaW5lZCgpOyAvLyBtaWdodCBzZXQgaXNEaXJ0eSB0byB0cnVlIGFnYWluXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmNsZWFyVGltZW91dCgpO1xuICAgICAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYXVzZURlcHRocyA9IHt9O1xuICAgIH1cbiAgICBjbGVhclRpbWVvdXQoKSB7XG4gICAgICAgIGlmICh0aGlzLnRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgICAgICAgIHRoaXMudGltZW91dElkID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkcmFpbmVkKCkge1xuICAgICAgICBpZiAodGhpcy5kcmFpbmVkT3B0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRyYWluZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY29uc3QgVklTSUJMRV9ISURERU5fUkUgPSAvXih2aXNpYmxlfGhpZGRlbikkLztcbmNsYXNzIFNjcm9sbGVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuaGFuZGxlRWwgPSAoZWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgICAgIHNldFJlZih0aGlzLnByb3BzLmVsUmVmLCBlbCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGxpcXVpZCwgbGlxdWlkSXNBYnNvbHV0ZSB9ID0gcHJvcHM7XG4gICAgICAgIGxldCBpc0Fic29sdXRlID0gbGlxdWlkICYmIGxpcXVpZElzQWJzb2x1dGU7XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBbJ2ZjLXNjcm9sbGVyJ107XG4gICAgICAgIGlmIChsaXF1aWQpIHtcbiAgICAgICAgICAgIGlmIChsaXF1aWRJc0Fic29sdXRlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lLnB1c2goJ2ZjLXNjcm9sbGVyLWxpcXVpZC1hYnNvbHV0ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lLnB1c2goJ2ZjLXNjcm9sbGVyLWxpcXVpZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHRoaXMuaGFuZGxlRWwsIGNsYXNzTmFtZTogY2xhc3NOYW1lLmpvaW4oJyAnKSwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1g6IHByb3BzLm92ZXJmbG93WCxcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1k6IHByb3BzLm92ZXJmbG93WSxcbiAgICAgICAgICAgICAgICBsZWZ0OiAoaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lTGVmdCB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgcmlnaHQ6IChpc0Fic29sdXRlICYmIC0ocHJvcHMub3ZlcmNvbWVSaWdodCB8fCAwKSkgfHwgJycsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAoaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lQm90dG9tIHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAoIWlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZUxlZnQgfHwgMCkpIHx8ICcnLFxuICAgICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiAoIWlzQWJzb2x1dGUgJiYgLShwcm9wcy5vdmVyY29tZVJpZ2h0IHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206ICghaXNBYnNvbHV0ZSAmJiAtKHByb3BzLm92ZXJjb21lQm90dG9tIHx8IDApKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IHByb3BzLm1heEhlaWdodCB8fCAnJyxcbiAgICAgICAgICAgIH0gfSwgcHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9XG4gICAgbmVlZHNYU2Nyb2xsaW5nKCkge1xuICAgICAgICBpZiAoVklTSUJMRV9ISURERU5fUkUudGVzdCh0aGlzLnByb3BzLm92ZXJmbG93WCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyB0ZXN0aW5nIHNjcm9sbFdpZHRoPmNsaWVudFdpZHRoIGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgbGV0IHsgZWwgfSA9IHRoaXM7XG4gICAgICAgIGxldCByZWFsQ2xpZW50V2lkdGggPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gdGhpcy5nZXRZU2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgbGV0IHsgY2hpbGRyZW4gfSA9IGVsO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRFbCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgICAgaWYgKGNoaWxkRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPiByZWFsQ2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIG5lZWRzWVNjcm9sbGluZygpIHtcbiAgICAgICAgaWYgKFZJU0lCTEVfSElEREVOX1JFLnRlc3QodGhpcy5wcm9wcy5vdmVyZmxvd1kpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGVzdGluZyBzY3JvbGxIZWlnaHQ+Y2xpZW50SGVpZ2h0IGlzIHVucmVsaWFibGUgY3Jvc3MtYnJvd3NlciB3aGVuIHBpeGVsIGhlaWdodHMgYXJlbid0IGludGVnZXJzLlxuICAgICAgICAvLyBtdWNoIG1vcmUgcmVsaWFibGUgdG8gc2VlIGlmIGNoaWxkcmVuIGFyZSB0YWxsZXIgdGhhbiB0aGUgc2Nyb2xsZXIsIGV2ZW4gdGhvIGRvZXNuJ3QgYWNjb3VudCBmb3JcbiAgICAgICAgLy8gaW5uZXItY2hpbGQgbWFyZ2lucyBhbmQgYWJzb2x1dGUgcG9zaXRpb25pbmdcbiAgICAgICAgbGV0IHsgZWwgfSA9IHRoaXM7XG4gICAgICAgIGxldCByZWFsQ2xpZW50SGVpZ2h0ID0gdGhpcy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSB0aGlzLmdldFhTY3JvbGxiYXJXaWR0aCgpO1xuICAgICAgICBsZXQgeyBjaGlsZHJlbiB9ID0gZWw7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGxldCBjaGlsZEVsID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoY2hpbGRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgPiByZWFsQ2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXRYU2Nyb2xsYmFyV2lkdGgoKSB7XG4gICAgICAgIGlmIChWSVNJQkxFX0hJRERFTl9SRS50ZXN0KHRoaXMucHJvcHMub3ZlcmZsb3dYKSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZWwub2Zmc2V0SGVpZ2h0IC0gdGhpcy5lbC5jbGllbnRIZWlnaHQ7IC8vIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWUgbm8gYm9yZGVycy4gVE9ETzogYWRkIHRvIENTUyB3aXRoIGltcG9ydGFudD9cbiAgICB9XG4gICAgZ2V0WVNjcm9sbGJhcldpZHRoKCkge1xuICAgICAgICBpZiAoVklTSUJMRV9ISURERU5fUkUudGVzdCh0aGlzLnByb3BzLm92ZXJmbG93WSkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmVsLm9mZnNldFdpZHRoIC0gdGhpcy5lbC5jbGllbnRXaWR0aDsgLy8gb25seSB3b3JrcyBiZWNhdXNlIHdlIGd1YXJhbnRlZSBubyBib3JkZXJzLiBUT0RPOiBhZGQgdG8gQ1NTIHdpdGggaW1wb3J0YW50P1xuICAgIH1cbn1cblxuLypcblRPRE86IHNvbWVob3cgaW5mZXIgT3RoZXJBcmdzIGZyb20gbWFzdGVyQ2FsbGJhY2s/XG5UT0RPOiBpbmZlciBSZWZUeXBlIGZyb20gbWFzdGVyQ2FsbGJhY2sgaWYgcHJvdmlkZWRcbiovXG5jbGFzcyBSZWZNYXAge1xuICAgIGNvbnN0cnVjdG9yKG1hc3RlckNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubWFzdGVyQ2FsbGJhY2sgPSBtYXN0ZXJDYWxsYmFjaztcbiAgICAgICAgdGhpcy5jdXJyZW50TWFwID0ge307XG4gICAgICAgIHRoaXMuZGVwdGhzID0ge307XG4gICAgICAgIHRoaXMuY2FsbGJhY2tNYXAgPSB7fTtcbiAgICAgICAgdGhpcy5oYW5kbGVWYWx1ZSA9ICh2YWwsIGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IHsgZGVwdGhzLCBjdXJyZW50TWFwIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBidWcuLi4gQUNUVUFMTFk6IGNhbiBwcm9iYWJseSBkbyBhd2F5IHdpdGggdGhpcyBub3cgdGhhdCBjYWxsZXJzIGRvbid0IHNoYXJlIG51bWVyaWMgaW5kaWNlcyBhbnltb3JlXG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IChrZXkgaW4gY3VycmVudE1hcCk7XG4gICAgICAgICAgICAgICAgY3VycmVudE1hcFtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIGRlcHRoc1trZXldID0gKGRlcHRoc1trZXldIHx8IDApICsgMTtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXB0aHNba2V5XSAtPSAxO1xuICAgICAgICAgICAgICAgIGlmICghZGVwdGhzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGN1cnJlbnRNYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMubWFzdGVyQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc3RlckNhbGxiYWNrKG51bGwsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFzdGVyQ2FsbGJhY2sodmFsLCBTdHJpbmcoa2V5KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjcmVhdGVSZWYoa2V5KSB7XG4gICAgICAgIGxldCByZWZDYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tNYXBba2V5XTtcbiAgICAgICAgaWYgKCFyZWZDYWxsYmFjaykge1xuICAgICAgICAgICAgcmVmQ2FsbGJhY2sgPSB0aGlzLmNhbGxiYWNrTWFwW2tleV0gPSAodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVWYWx1ZSh2YWwsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZkNhbGxiYWNrO1xuICAgIH1cbiAgICAvLyBUT0RPOiBjaGVjayBjYWxsZXJzIHRoYXQgZG9uJ3QgY2FyZSBhYm91dCBvcmRlci4gc2hvdWxkIHVzZSBnZXRBbGwgaW5zdGVhZFxuICAgIC8vIE5PVEU6IHRoaXMgbWV0aG9kIGhhcyBiZWNvbWUgbGVzcyB2YWx1YWJsZSBub3cgdGhhdCB3ZSBhcmUgZW5jb3VyYWdlZCB0byBtYXAgb3JkZXIgYnkgc29tZSBvdGhlciBpbmRleFxuICAgIC8vIFRPRE86IHByb3ZpZGUgT05FIGFycmF5LWV4cG9ydCBmdW5jdGlvbiwgYnVpbGRBcnJheSwgd2hpY2ggZmFpbHMgb24gbm9uLW51bWVyaWMgaW5kZXhlcy4gY2FsbGVyIGNhbiBtYW5pcHVsYXRlIGFuZCBcImNvbGxlY3RcIlxuICAgIGNvbGxlY3Qoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHN0ZXApIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3RGcm9tSGFzaCh0aGlzLmN1cnJlbnRNYXAsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBzdGVwKTtcbiAgICB9XG4gICAgZ2V0QWxsKCkge1xuICAgICAgICByZXR1cm4gaGFzaFZhbHVlc1RvQXJyYXkodGhpcy5jdXJyZW50TWFwKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVTaHJpbmtXaWR0aChjaHVua0Vscykge1xuICAgIGxldCBzaHJpbmtDZWxscyA9IGZpbmRFbGVtZW50cyhjaHVua0VscywgJy5mYy1zY3JvbGxncmlkLXNocmluaycpO1xuICAgIGxldCBsYXJnZXN0V2lkdGggPSAwO1xuICAgIGZvciAobGV0IHNocmlua0NlbGwgb2Ygc2hyaW5rQ2VsbHMpIHtcbiAgICAgICAgbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjb21wdXRlU21hbGxlc3RDZWxsV2lkdGgoc2hyaW5rQ2VsbCkpO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5jZWlsKGxhcmdlc3RXaWR0aCk7IC8vIDx0YWJsZT4gZWxlbWVudHMgd29yayBiZXN0IHdpdGggaW50ZWdlcnMuIHJvdW5kIHVwIHRvIGVuc3VyZSBjb250ZW50cyBmaXRzXG59XG5mdW5jdGlvbiBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHByb3BzLmxpcXVpZCAmJiBzZWN0aW9uQ29uZmlnLmxpcXVpZDsgLy8gZG9lcyB0aGUgc2VjdGlvbiBkbyBsaXF1aWQtaGVpZ2h0PyAobmVlZCB0byBoYXZlIHdob2xlIHNjcm9sbGdyaWQgbGlxdWlkLWhlaWdodCBhcyB3ZWxsKVxufVxuZnVuY3Rpb24gZ2V0QWxsb3dZU2Nyb2xsaW5nKHByb3BzLCBzZWN0aW9uQ29uZmlnKSB7XG4gICAgcmV0dXJuIHNlY3Rpb25Db25maWcubWF4SGVpZ2h0ICE9IG51bGwgfHwgLy8gaWYgaXRzIHBvc3NpYmxlIGZvciB0aGUgaGVpZ2h0IHRvIG1heCBvdXQsIHdlIG1pZ2h0IG5lZWQgc2Nyb2xsYmFyc1xuICAgICAgICBnZXRTZWN0aW9uSGFzTGlxdWlkSGVpZ2h0KHByb3BzLCBzZWN0aW9uQ29uZmlnKTsgLy8gaWYgdGhlIHNlY3Rpb24gaXMgbGlxdWlkIGhlaWdodCwgaXQgbWlnaHQgY29uZGVuc2UgZW5vdWdoIHRvIHJlcXVpcmUgc2Nyb2xsYmFyc1xufVxuLy8gVE9ETzogT05MWSB1c2UgYGFyZ2AuIGZvcmNlIG91dCBpbnRlcm5hbCBmdW5jdGlvbiB0byB1c2Ugc2FtZSBBUElcbmZ1bmN0aW9uIHJlbmRlckNodW5rQ29udGVudChzZWN0aW9uQ29uZmlnLCBjaHVua0NvbmZpZywgYXJnLCBpc0hlYWRlcikge1xuICAgIGxldCB7IGV4cGFuZFJvd3MgfSA9IGFyZztcbiAgICBsZXQgY29udGVudCA9IHR5cGVvZiBjaHVua0NvbmZpZy5jb250ZW50ID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgY2h1bmtDb25maWcuY29udGVudChhcmcpIDpcbiAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoJ3RhYmxlJywge1xuICAgICAgICAgICAgcm9sZTogJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgICAgICBjbGFzc05hbWU6IFtcbiAgICAgICAgICAgICAgICBjaHVua0NvbmZpZy50YWJsZUNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICBzZWN0aW9uQ29uZmlnLnN5bmNSb3dIZWlnaHRzID8gJ2ZjLXNjcm9sbGdyaWQtc3luYy10YWJsZScgOiAnJyxcbiAgICAgICAgICAgIF0uam9pbignICcpLFxuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogYXJnLnRhYmxlTWluV2lkdGgsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGFyZy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBhcmcuY2xpZW50SGVpZ2h0IDogJycsIC8vIGNzcyBgaGVpZ2h0YCBvbiBhIDx0YWJsZT4gc2VydmVzIGFzIGEgbWluLWhlaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSwgYXJnLnRhYmxlQ29sR3JvdXBOb2RlLCBwcmVhY3QuY3JlYXRlRWxlbWVudChpc0hlYWRlciA/ICd0aGVhZCcgOiAndGJvZHknLCB7XG4gICAgICAgICAgICByb2xlOiAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgfSwgdHlwZW9mIGNodW5rQ29uZmlnLnJvd0NvbnRlbnQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gY2h1bmtDb25maWcucm93Q29udGVudChhcmcpXG4gICAgICAgICAgICA6IGNodW5rQ29uZmlnLnJvd0NvbnRlbnQpKTtcbiAgICByZXR1cm4gY29udGVudDtcbn1cbmZ1bmN0aW9uIGlzQ29sUHJvcHNFcXVhbChjb2xzMCwgY29sczEpIHtcbiAgICByZXR1cm4gaXNBcnJheXNFcXVhbChjb2xzMCwgY29sczEsIGlzUHJvcHNFcXVhbCk7XG59XG5mdW5jdGlvbiByZW5kZXJNaWNyb0NvbEdyb3VwKGNvbHMsIHNocmlua1dpZHRoKSB7XG4gICAgbGV0IGNvbE5vZGVzID0gW107XG4gICAgLypcbiAgICBmb3IgQ29sUHJvcHMgd2l0aCBzcGFucywgaXQgd291bGQgaGF2ZSBiZWVuIGdyZWF0IHRvIG1ha2UgYSBzaW5nbGUgPGNvbCBzcGFuPVwiXCI+XG4gICAgSE9XRVZFUiwgQ2hyb21lIHdhcyBnZXR0aW5nIG1lc3NpbmcgdXAgZGlzdHJpYnV0aW5nIHRoZSB3aWR0aCB0byA8dGQ+Lzx0aD4gZWxlbWVudHMgd2l0aCBjb2xzcGFucy5cbiAgICBTT0xVVElPTjogbWFraW5nIGluZGl2aWR1YWwgPGNvbD4gZWxlbWVudHMgbWFrZXMgQ2hyb21lIGJlaGF2ZS5cbiAgICAqL1xuICAgIGZvciAobGV0IGNvbFByb3BzIG9mIGNvbHMpIHtcbiAgICAgICAgbGV0IHNwYW4gPSBjb2xQcm9wcy5zcGFuIHx8IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb2xOb2Rlcy5wdXNoKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiY29sXCIsIHsgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbFByb3BzLndpZHRoID09PSAnc2hyaW5rJyA/IHNhbml0aXplU2hyaW5rV2lkdGgoc2hyaW5rV2lkdGgpIDogKGNvbFByb3BzLndpZHRoIHx8ICcnKSxcbiAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGNvbFByb3BzLm1pbldpZHRoIHx8ICcnLFxuICAgICAgICAgICAgICAgIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcmVhY3QuY3JlYXRlRWxlbWVudCgnY29sZ3JvdXAnLCB7fSwgLi4uY29sTm9kZXMpO1xufVxuZnVuY3Rpb24gc2FuaXRpemVTaHJpbmtXaWR0aChzaHJpbmtXaWR0aCkge1xuICAgIC8qIHdoeSA0PyBpZiB3ZSBkbyAwLCBpdCB3aWxsIGtpbGwgYW55IGJvcmRlciwgd2hpY2ggYXJlIG5lZWRlZCBmb3IgY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoXG4gICAgNCBhY2NvdW50cyBmb3IgMiAyLXBpeGVsIGJvcmRlcnMuIFRPRE86IGJldHRlciBzb2x1dGlvbj8gKi9cbiAgICByZXR1cm4gc2hyaW5rV2lkdGggPT0gbnVsbCA/IDQgOiBzaHJpbmtXaWR0aDtcbn1cbmZ1bmN0aW9uIGhhc1Nocmlua1dpZHRoKGNvbHMpIHtcbiAgICBmb3IgKGxldCBjb2wgb2YgY29scykge1xuICAgICAgICBpZiAoY29sLndpZHRoID09PSAnc2hyaW5rJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXMobGlxdWlkLCBjb250ZXh0KSB7XG4gICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICdmYy1zY3JvbGxncmlkJyxcbiAgICAgICAgY29udGV4dC50aGVtZS5nZXRDbGFzcygndGFibGUnKSxcbiAgICBdO1xuICAgIGlmIChsaXF1aWQpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLWxpcXVpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lcztcbn1cbmZ1bmN0aW9uIGdldFNlY3Rpb25DbGFzc05hbWVzKHNlY3Rpb25Db25maWcsIHdob2xlVGFibGVWR3Jvdykge1xuICAgIGxldCBjbGFzc05hbWVzID0gW1xuICAgICAgICAnZmMtc2Nyb2xsZ3JpZC1zZWN0aW9uJyxcbiAgICAgICAgYGZjLXNjcm9sbGdyaWQtc2VjdGlvbi0ke3NlY3Rpb25Db25maWcudHlwZX1gLFxuICAgICAgICBzZWN0aW9uQ29uZmlnLmNsYXNzTmFtZSwgLy8gdXNlZD9cbiAgICBdO1xuICAgIGlmICh3aG9sZVRhYmxlVkdyb3cgJiYgc2VjdGlvbkNvbmZpZy5saXF1aWQgJiYgc2VjdGlvbkNvbmZpZy5tYXhIZWlnaHQgPT0gbnVsbCkge1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtc2VjdGlvbi1saXF1aWQnKTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb25Db25maWcuaXNTdGlja3kpIHtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdmYy1zY3JvbGxncmlkLXNlY3Rpb24tc3RpY2t5Jyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWVzO1xufVxuZnVuY3Rpb24gcmVuZGVyU2Nyb2xsU2hpbShhcmcpIHtcbiAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3RpY2t5LXNoaW1cIiwgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiBhcmcuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICBtaW5XaWR0aDogYXJnLnRhYmxlTWluV2lkdGgsXG4gICAgICAgIH0gfSkpO1xufVxuZnVuY3Rpb24gZ2V0U3RpY2t5SGVhZGVyRGF0ZXMob3B0aW9ucykge1xuICAgIGxldCB7IHN0aWNreUhlYWRlckRhdGVzIH0gPSBvcHRpb25zO1xuICAgIGlmIChzdGlja3lIZWFkZXJEYXRlcyA9PSBudWxsIHx8IHN0aWNreUhlYWRlckRhdGVzID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5SGVhZGVyRGF0ZXMgPSBvcHRpb25zLmhlaWdodCA9PT0gJ2F1dG8nIHx8IG9wdGlvbnMudmlld0hlaWdodCA9PT0gJ2F1dG8nO1xuICAgIH1cbiAgICByZXR1cm4gc3RpY2t5SGVhZGVyRGF0ZXM7XG59XG5mdW5jdGlvbiBnZXRTdGlja3lGb290ZXJTY3JvbGxiYXIob3B0aW9ucykge1xuICAgIGxldCB7IHN0aWNreUZvb3RlclNjcm9sbGJhciB9ID0gb3B0aW9ucztcbiAgICBpZiAoc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09IG51bGwgfHwgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID09PSAnYXV0bycpIHtcbiAgICAgICAgc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyID0gb3B0aW9ucy5oZWlnaHQgPT09ICdhdXRvJyB8fCBvcHRpb25zLnZpZXdIZWlnaHQgPT09ICdhdXRvJztcbiAgICB9XG4gICAgcmV0dXJuIHN0aWNreUZvb3RlclNjcm9sbGJhcjtcbn1cblxuY2xhc3MgU2ltcGxlU2Nyb2xsR3JpZCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnByb2Nlc3NDb2xzID0gbWVtb2l6ZSgoYSkgPT4gYSwgaXNDb2xQcm9wc0VxdWFsKTsgLy8gc28gd2UgZ2V0IHNhbWUgYGNvbHNgIHByb3BzIGV2ZXJ5IHRpbWVcbiAgICAgICAgLy8geXVja3kgdG8gbWVtb2l6ZSBWTm9kZXMsIGJ1dCBtdWNoIG1vcmUgZWZmaWNpZW50IGZvciBjb25zdW1lcnNcbiAgICAgICAgdGhpcy5yZW5kZXJNaWNyb0NvbEdyb3VwID0gbWVtb2l6ZShyZW5kZXJNaWNyb0NvbEdyb3VwKTtcbiAgICAgICAgdGhpcy5zY3JvbGxlclJlZnMgPSBuZXcgUmVmTWFwKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsZXJFbFJlZnMgPSBuZXcgUmVmTWFwKHRoaXMuX2hhbmRsZVNjcm9sbGVyRWwuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzaHJpbmtXaWR0aDogbnVsbCxcbiAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnM6IGZhbHNlLFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IHt9LFxuICAgICAgICAgICAgc2Nyb2xsZXJDbGllbnRIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gVE9ETzogY2FuIGRvIGEgcmVhbGx5IHNpbXBsZSBwcmludC12aWV3LiBkb250IG5lZWQgdG8gam9pbiByb3dzXG4gICAgICAgIHRoaXMuaGFuZGxlU2l6aW5nID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zYWZlU2V0U3RhdGUoT2JqZWN0LmFzc2lnbih7IHNocmlua1dpZHRoOiB0aGlzLmNvbXB1dGVTaHJpbmtXaWR0aCgpIH0sIHRoaXMuY29tcHV0ZVNjcm9sbGVyRGltcygpKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgc2VjdGlvbkNvbmZpZ3MgPSBwcm9wcy5zZWN0aW9ucyB8fCBbXTtcbiAgICAgICAgbGV0IGNvbHMgPSB0aGlzLnByb2Nlc3NDb2xzKHByb3BzLmNvbHMpO1xuICAgICAgICBsZXQgbWljcm9Db2xHcm91cE5vZGUgPSB0aGlzLnJlbmRlck1pY3JvQ29sR3JvdXAoY29scywgc3RhdGUuc2hyaW5rV2lkdGgpO1xuICAgICAgICBsZXQgY2xhc3NOYW1lcyA9IGdldFNjcm9sbEdyaWRDbGFzc05hbWVzKHByb3BzLmxpcXVpZCwgY29udGV4dCk7XG4gICAgICAgIGlmIChwcm9wcy5jb2xsYXBzaWJsZVdpZHRoKSB7XG4gICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ2ZjLXNjcm9sbGdyaWQtY29sbGFwc2libGUnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBtYWtlIERSWVxuICAgICAgICBsZXQgY29uZmlnQ250ID0gc2VjdGlvbkNvbmZpZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgY29uZmlnSSA9IDA7XG4gICAgICAgIGxldCBjdXJyZW50Q29uZmlnO1xuICAgICAgICBsZXQgaGVhZFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICBsZXQgYm9keVNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICBsZXQgZm9vdFNlY3Rpb25Ob2RlcyA9IFtdO1xuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgaGVhZFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb25maWdJIDwgY29uZmlnQ250ICYmIChjdXJyZW50Q29uZmlnID0gc2VjdGlvbkNvbmZpZ3NbY29uZmlnSV0pLnR5cGUgPT09ICdib2R5Jykge1xuICAgICAgICAgICAgYm9keVNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgZmFsc2UpKTtcbiAgICAgICAgICAgIGNvbmZpZ0kgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoY29uZmlnSSA8IGNvbmZpZ0NudCAmJiAoY3VycmVudENvbmZpZyA9IHNlY3Rpb25Db25maWdzW2NvbmZpZ0ldKS50eXBlID09PSAnZm9vdGVyJykge1xuICAgICAgICAgICAgZm9vdFNlY3Rpb25Ob2Rlcy5wdXNoKHRoaXMucmVuZGVyU2VjdGlvbihjdXJyZW50Q29uZmlnLCBtaWNyb0NvbEdyb3VwTm9kZSwgdHJ1ZSkpO1xuICAgICAgICAgICAgY29uZmlnSSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpcmVmb3ggYnVnOiB3aGVuIHNldHRpbmcgaGVpZ2h0IG9uIHRhYmxlIGFuZCB0aGVyZSBpcyBhIHRoZWFkIG9yIHRmb290LFxuICAgICAgICAvLyB0aGUgbmVjZXNzYXJ5IGhlaWdodDoxMDAlIG9uIHRoZSBsaXF1aWQtaGVpZ2h0IGJvZHkgc2VjdGlvbiBmb3JjZXMgdGhlICp3aG9sZSogdGFibGUgdG8gYmUgdGFsbGVyLiAoYnVnICM1NTI0KVxuICAgICAgICAvLyB1c2UgZ2V0Q2FuVkdyb3dXaXRoaW5DZWxsIGFzIGEgd2F5IHRvIGRldGVjdCB0YWJsZS1zdHVwaWQgZmlyZWZveC5cbiAgICAgICAgLy8gaWYgc28sIHVzZSBhIHNpbXBsZXIgZG9tIHN0cnVjdHVyZSwgamFtIGV2ZXJ5dGhpbmcgaW50byBhIGxvbmUgdGJvZHkuXG4gICAgICAgIGxldCBpc0J1Z2d5ID0gIWdldENhblZHcm93V2l0aGluQ2VsbCgpO1xuICAgICAgICBjb25zdCByb2xlQXR0cnMgPSB7IHJvbGU6ICdyb3dncm91cCcgfTtcbiAgICAgICAgcmV0dXJuIHByZWFjdC5jcmVhdGVFbGVtZW50KCd0YWJsZScsIHtcbiAgICAgICAgICAgIHJvbGU6ICdncmlkJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKCcgJyksXG4gICAgICAgICAgICBzdHlsZTogeyBoZWlnaHQ6IHByb3BzLmhlaWdodCB9LFxuICAgICAgICB9LCBCb29sZWFuKCFpc0J1Z2d5ICYmIGhlYWRTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiBwcmVhY3QuY3JlYXRlRWxlbWVudCgndGhlYWQnLCByb2xlQXR0cnMsIC4uLmhlYWRTZWN0aW9uTm9kZXMpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGJvZHlTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiBwcmVhY3QuY3JlYXRlRWxlbWVudCgndGJvZHknLCByb2xlQXR0cnMsIC4uLmJvZHlTZWN0aW9uTm9kZXMpLCBCb29sZWFuKCFpc0J1Z2d5ICYmIGZvb3RTZWN0aW9uTm9kZXMubGVuZ3RoKSAmJiBwcmVhY3QuY3JlYXRlRWxlbWVudCgndGZvb3QnLCByb2xlQXR0cnMsIC4uLmZvb3RTZWN0aW9uTm9kZXMpLCBpc0J1Z2d5ICYmIHByZWFjdC5jcmVhdGVFbGVtZW50KCd0Ym9keScsIHJvbGVBdHRycywgLi4uaGVhZFNlY3Rpb25Ob2RlcywgLi4uYm9keVNlY3Rpb25Ob2RlcywgLi4uZm9vdFNlY3Rpb25Ob2RlcykpO1xuICAgIH1cbiAgICByZW5kZXJTZWN0aW9uKHNlY3Rpb25Db25maWcsIG1pY3JvQ29sR3JvdXBOb2RlLCBpc0hlYWRlcikge1xuICAgICAgICBpZiAoJ291dGVyQ29udGVudCcgaW4gc2VjdGlvbkNvbmZpZykge1xuICAgICAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChwcmVhY3QuRnJhZ21lbnQsIHsga2V5OiBzZWN0aW9uQ29uZmlnLmtleSB9LCBzZWN0aW9uQ29uZmlnLm91dGVyQ29udGVudCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0clwiLCB7IGtleTogc2VjdGlvbkNvbmZpZy5rZXksIHJvbGU6IFwicHJlc2VudGF0aW9uXCIsIGNsYXNzTmFtZTogZ2V0U2VjdGlvbkNsYXNzTmFtZXMoc2VjdGlvbkNvbmZpZywgdGhpcy5wcm9wcy5saXF1aWQpLmpvaW4oJyAnKSB9LCB0aGlzLnJlbmRlckNodW5rVGQoc2VjdGlvbkNvbmZpZywgbWljcm9Db2xHcm91cE5vZGUsIHNlY3Rpb25Db25maWcuY2h1bmssIGlzSGVhZGVyKSkpO1xuICAgIH1cbiAgICByZW5kZXJDaHVua1RkKHNlY3Rpb25Db25maWcsIG1pY3JvQ29sR3JvdXBOb2RlLCBjaHVua0NvbmZpZywgaXNIZWFkZXIpIHtcbiAgICAgICAgaWYgKCdvdXRlckNvbnRlbnQnIGluIGNodW5rQ29uZmlnKSB7XG4gICAgICAgICAgICByZXR1cm4gY2h1bmtDb25maWcub3V0ZXJDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBmb3JjZVlTY3JvbGxiYXJzLCBzY3JvbGxlckNsaWVudFdpZHRocywgc2Nyb2xsZXJDbGllbnRIZWlnaHRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBsZXQgbmVlZHNZU2Nyb2xsaW5nID0gZ2V0QWxsb3dZU2Nyb2xsaW5nKHByb3BzLCBzZWN0aW9uQ29uZmlnKTsgLy8gVE9ETzogZG8gbGF6aWx5LiBkbyBpbiBzZWN0aW9uIGNvbmZpZz9cbiAgICAgICAgbGV0IGlzTGlxdWlkID0gZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodChwcm9wcywgc2VjdGlvbkNvbmZpZyk7XG4gICAgICAgIC8vIGZvciBgIXByb3BzLmxpcXVpZGAgLSBpcyBXSE9MRSBzY3JvbGxncmlkIG5hdHVyYWwgaGVpZ2h0P1xuICAgICAgICAvLyBUT0RPOiBkbyBzYW1lIHRoaW5nIGluIGFkdmFuY2VkIHNjcm9sbGdyaWQ/IHByb2xseSBub3QgYi9jIGFsd2F5cyBoYXMgaG9yaXpvbnRhbCBzY3JvbGxiYXJzXG4gICAgICAgIGxldCBvdmVyZmxvd1kgPSAhcHJvcHMubGlxdWlkID8gJ3Zpc2libGUnIDpcbiAgICAgICAgICAgIGZvcmNlWVNjcm9sbGJhcnMgPyAnc2Nyb2xsJyA6XG4gICAgICAgICAgICAgICAgIW5lZWRzWVNjcm9sbGluZyA/ICdoaWRkZW4nIDpcbiAgICAgICAgICAgICAgICAgICAgJ2F1dG8nO1xuICAgICAgICBsZXQgc2VjdGlvbktleSA9IHNlY3Rpb25Db25maWcua2V5O1xuICAgICAgICBsZXQgY29udGVudCA9IHJlbmRlckNodW5rQ29udGVudChzZWN0aW9uQ29uZmlnLCBjaHVua0NvbmZpZywge1xuICAgICAgICAgICAgdGFibGVDb2xHcm91cE5vZGU6IG1pY3JvQ29sR3JvdXBOb2RlLFxuICAgICAgICAgICAgdGFibGVNaW5XaWR0aDogJycsXG4gICAgICAgICAgICBjbGllbnRXaWR0aDogKCFwcm9wcy5jb2xsYXBzaWJsZVdpZHRoICYmIHNjcm9sbGVyQ2xpZW50V2lkdGhzW3NlY3Rpb25LZXldICE9PSB1bmRlZmluZWQpID8gc2Nyb2xsZXJDbGllbnRXaWR0aHNbc2VjdGlvbktleV0gOiBudWxsLFxuICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBzY3JvbGxlckNsaWVudEhlaWdodHNbc2VjdGlvbktleV0gIT09IHVuZGVmaW5lZCA/IHNjcm9sbGVyQ2xpZW50SGVpZ2h0c1tzZWN0aW9uS2V5XSA6IG51bGwsXG4gICAgICAgICAgICBleHBhbmRSb3dzOiBzZWN0aW9uQ29uZmlnLmV4cGFuZFJvd3MsXG4gICAgICAgICAgICBzeW5jUm93SGVpZ2h0czogZmFsc2UsXG4gICAgICAgICAgICByb3dTeW5jSGVpZ2h0czogW10sXG4gICAgICAgICAgICByZXBvcnRSb3dIZWlnaHRDaGFuZ2U6ICgpID0+IHsgfSxcbiAgICAgICAgfSwgaXNIZWFkZXIpO1xuICAgICAgICByZXR1cm4gcHJlYWN0LmNyZWF0ZUVsZW1lbnQoaXNIZWFkZXIgPyAndGgnIDogJ3RkJywge1xuICAgICAgICAgICAgcmVmOiBjaHVua0NvbmZpZy5lbFJlZixcbiAgICAgICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICB9LCBwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogYGZjLXNjcm9sbGVyLWhhcm5lc3Mke2lzTGlxdWlkID8gJyBmYy1zY3JvbGxlci1oYXJuZXNzLWxpcXVpZCcgOiAnJ31gIH0sXG4gICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChTY3JvbGxlciwgeyByZWY6IHRoaXMuc2Nyb2xsZXJSZWZzLmNyZWF0ZVJlZihzZWN0aW9uS2V5KSwgZWxSZWY6IHRoaXMuc2Nyb2xsZXJFbFJlZnMuY3JlYXRlUmVmKHNlY3Rpb25LZXkpLCBvdmVyZmxvd1k6IG92ZXJmbG93WSwgb3ZlcmZsb3dYOiAhcHJvcHMubGlxdWlkID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgLyogbmF0dXJhbCBoZWlnaHQ/ICovLCBtYXhIZWlnaHQ6IHNlY3Rpb25Db25maWcubWF4SGVpZ2h0LCBsaXF1aWQ6IGlzTGlxdWlkLCBsaXF1aWRJc0Fic29sdXRlIC8vIGJlY2F1c2UgaXRzIHdpdGhpbiBhIGhhcm5lc3NcbiAgICAgICAgICAgICAgICA6IHRydWUgfSwgY29udGVudCkpKTtcbiAgICB9XG4gICAgX2hhbmRsZVNjcm9sbGVyRWwoc2Nyb2xsZXJFbCwga2V5KSB7XG4gICAgICAgIGxldCBzZWN0aW9uID0gZ2V0U2VjdGlvbkJ5S2V5KHRoaXMucHJvcHMuc2VjdGlvbnMsIGtleSk7XG4gICAgICAgIGlmIChzZWN0aW9uKSB7XG4gICAgICAgICAgICBzZXRSZWYoc2VjdGlvbi5jaHVuay5zY3JvbGxlckVsUmVmLCBzY3JvbGxlckVsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVTaXppbmcoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmFkZFJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVTaXppbmcpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIC8vIFRPRE86IG5lZWQgYmV0dGVyIHNvbHV0aW9uIHdoZW4gc3RhdGUgY29udGFpbnMgbm9uLXNpemluZyB0aGluZ3NcbiAgICAgICAgdGhpcy5oYW5kbGVTaXppbmcoKTtcbiAgICB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC5yZW1vdmVSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlU2l6aW5nKTtcbiAgICB9XG4gICAgY29tcHV0ZVNocmlua1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gaGFzU2hyaW5rV2lkdGgodGhpcy5wcm9wcy5jb2xzKVxuICAgICAgICAgICAgPyBjb21wdXRlU2hyaW5rV2lkdGgodGhpcy5zY3JvbGxlckVsUmVmcy5nZXRBbGwoKSlcbiAgICAgICAgICAgIDogMDtcbiAgICB9XG4gICAgY29tcHV0ZVNjcm9sbGVyRGltcygpIHtcbiAgICAgICAgbGV0IHNjcm9sbGJhcldpZHRoID0gZ2V0U2Nyb2xsYmFyV2lkdGhzKCk7XG4gICAgICAgIGxldCB7IHNjcm9sbGVyUmVmcywgc2Nyb2xsZXJFbFJlZnMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBmb3JjZVlTY3JvbGxiYXJzID0gZmFsc2U7XG4gICAgICAgIGxldCBzY3JvbGxlckNsaWVudFdpZHRocyA9IHt9O1xuICAgICAgICBsZXQgc2Nyb2xsZXJDbGllbnRIZWlnaHRzID0ge307XG4gICAgICAgIGZvciAobGV0IHNlY3Rpb25LZXkgaW4gc2Nyb2xsZXJSZWZzLmN1cnJlbnRNYXApIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxlciA9IHNjcm9sbGVyUmVmcy5jdXJyZW50TWFwW3NlY3Rpb25LZXldO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyICYmIHNjcm9sbGVyLm5lZWRzWVNjcm9sbGluZygpKSB7XG4gICAgICAgICAgICAgICAgZm9yY2VZU2Nyb2xsYmFycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgc2VjdGlvbiBvZiB0aGlzLnByb3BzLnNlY3Rpb25zKSB7XG4gICAgICAgICAgICBsZXQgc2VjdGlvbktleSA9IHNlY3Rpb24ua2V5O1xuICAgICAgICAgICAgbGV0IHNjcm9sbGVyRWwgPSBzY3JvbGxlckVsUmVmcy5jdXJyZW50TWFwW3NlY3Rpb25LZXldO1xuICAgICAgICAgICAgaWYgKHNjcm9sbGVyRWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaGFybmVzc0VsID0gc2Nyb2xsZXJFbC5wYXJlbnROb2RlOyAvLyBUT0RPOiB3ZWlyZCB3YXkgdG8gZ2V0IHRoaXMuIG5lZWQgaGFybmVzcyBiL2MgZG9lc24ndCBpbmNsdWRlIHRhYmxlIGJvcmRlcnNcbiAgICAgICAgICAgICAgICBzY3JvbGxlckNsaWVudFdpZHRoc1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIC0gKGZvcmNlWVNjcm9sbGJhcnNcbiAgICAgICAgICAgICAgICAgICAgPyBzY3JvbGxiYXJXaWR0aC55IC8vIHVzZSBnbG9iYWwgYmVjYXVzZSBzY3JvbGxlciBtaWdodCBub3QgaGF2ZSBzY3JvbGxiYXJzIHlldCBidXQgd2lsbCBuZWVkIHRoZW0gaW4gZnV0dXJlXG4gICAgICAgICAgICAgICAgICAgIDogMCkpO1xuICAgICAgICAgICAgICAgIHNjcm9sbGVyQ2xpZW50SGVpZ2h0c1tzZWN0aW9uS2V5XSA9IE1hdGguZmxvb3IoaGFybmVzc0VsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9yY2VZU2Nyb2xsYmFycywgc2Nyb2xsZXJDbGllbnRXaWR0aHMsIHNjcm9sbGVyQ2xpZW50SGVpZ2h0cyB9O1xuICAgIH1cbn1cblNpbXBsZVNjcm9sbEdyaWQuYWRkU3RhdGVFcXVhbGl0eSh7XG4gICAgc2Nyb2xsZXJDbGllbnRXaWR0aHM6IGlzUHJvcHNFcXVhbCxcbiAgICBzY3JvbGxlckNsaWVudEhlaWdodHM6IGlzUHJvcHNFcXVhbCxcbn0pO1xuZnVuY3Rpb24gZ2V0U2VjdGlvbkJ5S2V5KHNlY3Rpb25zLCBrZXkpIHtcbiAgICBmb3IgKGxldCBzZWN0aW9uIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGlmIChzZWN0aW9uLmtleSA9PT0ga2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gc2VjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuY2xhc3MgRXZlbnRDb250YWluZXIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFbCA9IChlbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgc2V0RWxTZWcoZWwsIHRoaXMucHJvcHMuc2VnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBjb25zdCB7IG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHsgc2VnIH0gPSBwcm9wcztcbiAgICAgICAgY29uc3QgeyBldmVudFJhbmdlIH0gPSBzZWc7XG4gICAgICAgIGNvbnN0IHsgdWkgfSA9IGV2ZW50UmFuZ2U7XG4gICAgICAgIGNvbnN0IHJlbmRlclByb3BzID0ge1xuICAgICAgICAgICAgZXZlbnQ6IG5ldyBFdmVudEltcGwoY29udGV4dCwgZXZlbnRSYW5nZS5kZWYsIGV2ZW50UmFuZ2UuaW5zdGFuY2UpLFxuICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgdGltZVRleHQ6IHByb3BzLnRpbWVUZXh0LFxuICAgICAgICAgICAgdGV4dENvbG9yOiB1aS50ZXh0Q29sb3IsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHVpLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIGJvcmRlckNvbG9yOiB1aS5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgIGlzRHJhZ2dhYmxlOiAhcHJvcHMuZGlzYWJsZURyYWdnaW5nICYmIGNvbXB1dGVTZWdEcmFnZ2FibGUoc2VnLCBjb250ZXh0KSxcbiAgICAgICAgICAgIGlzU3RhcnRSZXNpemFibGU6ICFwcm9wcy5kaXNhYmxlUmVzaXppbmcgJiYgY29tcHV0ZVNlZ1N0YXJ0UmVzaXphYmxlKHNlZywgY29udGV4dCksXG4gICAgICAgICAgICBpc0VuZFJlc2l6YWJsZTogIXByb3BzLmRpc2FibGVSZXNpemluZyAmJiBjb21wdXRlU2VnRW5kUmVzaXphYmxlKHNlZyksXG4gICAgICAgICAgICBpc01pcnJvcjogQm9vbGVhbihwcm9wcy5pc0RyYWdnaW5nIHx8IHByb3BzLmlzUmVzaXppbmcgfHwgcHJvcHMuaXNEYXRlU2VsZWN0aW5nKSxcbiAgICAgICAgICAgIGlzU3RhcnQ6IEJvb2xlYW4oc2VnLmlzU3RhcnQpLFxuICAgICAgICAgICAgaXNFbmQ6IEJvb2xlYW4oc2VnLmlzRW5kKSxcbiAgICAgICAgICAgIGlzUGFzdDogQm9vbGVhbihwcm9wcy5pc1Bhc3QpLFxuICAgICAgICAgICAgaXNGdXR1cmU6IEJvb2xlYW4ocHJvcHMuaXNGdXR1cmUpLFxuICAgICAgICAgICAgaXNUb2RheTogQm9vbGVhbihwcm9wcy5pc1RvZGF5KSxcbiAgICAgICAgICAgIGlzU2VsZWN0ZWQ6IEJvb2xlYW4ocHJvcHMuaXNTZWxlY3RlZCksXG4gICAgICAgICAgICBpc0RyYWdnaW5nOiBCb29sZWFuKHByb3BzLmlzRHJhZ2dpbmcpLFxuICAgICAgICAgICAgaXNSZXNpemluZzogQm9vbGVhbihwcm9wcy5pc1Jlc2l6aW5nKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyAvKiBjb250YWlucyBjaGlsZHJlbiAqLywgeyBlbFJlZjogdGhpcy5oYW5kbGVFbCwgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgLi4uZ2V0RXZlbnRDbGFzc05hbWVzKHJlbmRlclByb3BzKSxcbiAgICAgICAgICAgICAgICAuLi5zZWcuZXZlbnRSYW5nZS51aS5jbGFzc05hbWVzLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5lbENsYXNzZXMgfHwgW10pLFxuICAgICAgICAgICAgXSwgcmVuZGVyUHJvcHM6IHJlbmRlclByb3BzLCBnZW5lcmF0b3JOYW1lOiBcImV2ZW50Q29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMuZXZlbnRDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiBwcm9wcy5kZWZhdWx0R2VuZXJhdG9yLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMuZXZlbnRDbGFzc05hbWVzLCBkaWRNb3VudDogb3B0aW9ucy5ldmVudERpZE1vdW50LCB3aWxsVW5tb3VudDogb3B0aW9ucy5ldmVudFdpbGxVbm1vdW50IH0pKSk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuZWwgJiYgdGhpcy5wcm9wcy5zZWcgIT09IHByZXZQcm9wcy5zZWcpIHtcbiAgICAgICAgICAgIHNldEVsU2VnKHRoaXMuZWwsIHRoaXMucHJvcHMuc2VnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gc2hvdWxkIG5vdCBiZSBhIHB1cmVjb21wb25lbnRcbmNsYXNzIFN0YW5kYXJkRXZlbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBsZXQgeyBzZWcgfSA9IHByb3BzO1xuICAgICAgICBsZXQgeyB1aSB9ID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgIGxldCB0aW1lRm9ybWF0ID0gb3B0aW9ucy5ldmVudFRpbWVGb3JtYXQgfHwgcHJvcHMuZGVmYXVsdFRpbWVGb3JtYXQ7XG4gICAgICAgIGxldCB0aW1lVGV4dCA9IGJ1aWxkU2VnVGltZVRleHQoc2VnLCB0aW1lRm9ybWF0LCBjb250ZXh0LCBwcm9wcy5kZWZhdWx0RGlzcGxheUV2ZW50VGltZSwgcHJvcHMuZGVmYXVsdERpc3BsYXlFdmVudEVuZCk7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRDb250YWluZXIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIC8qIGluY2x1ZGVzIGVsUmVmICovLCB7IGVsVGFnOiBcImFcIiwgZWxTdHlsZToge1xuICAgICAgICAgICAgICAgIGJvcmRlckNvbG9yOiB1aS5ib3JkZXJDb2xvcixcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHVpLmJhY2tncm91bmRDb2xvcixcbiAgICAgICAgICAgIH0sIGVsQXR0cnM6IGdldFNlZ0FuY2hvckF0dHJzKHNlZywgY29udGV4dCksIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlcklubmVyQ29udGVudCQxLCB0aW1lVGV4dDogdGltZVRleHQgfSksIChJbm5lckNvbnRlbnQsIGV2ZW50Q29udGVudEFyZykgPT4gKHByZWFjdC5jcmVhdGVFbGVtZW50KHByZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KElubmVyQ29udGVudCwgeyBlbFRhZzogXCJkaXZcIiwgZWxDbGFzc2VzOiBbJ2ZjLWV2ZW50LW1haW4nXSwgZWxTdHlsZTogeyBjb2xvcjogZXZlbnRDb250ZW50QXJnLnRleHRDb2xvciB9IH0pLFxuICAgICAgICAgICAgQm9vbGVhbihldmVudENvbnRlbnRBcmcuaXNTdGFydFJlc2l6YWJsZSkgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXJlc2l6ZXIgZmMtZXZlbnQtcmVzaXplci1zdGFydFwiIH0pKSxcbiAgICAgICAgICAgIEJvb2xlYW4oZXZlbnRDb250ZW50QXJnLmlzRW5kUmVzaXphYmxlKSAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtcmVzaXplciBmYy1ldmVudC1yZXNpemVyLWVuZFwiIH0pKSkpKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVySW5uZXJDb250ZW50JDEoaW5uZXJQcm9wcykge1xuICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtbWFpbi1mcmFtZVwiIH0sXG4gICAgICAgIGlubmVyUHJvcHMudGltZVRleHQgJiYgKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpbWVcIiB9LCBpbm5lclByb3BzLnRpbWVUZXh0KSksXG4gICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpdGxlLWNvbnRhaW5lclwiIH0sXG4gICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aXRsZSBmYy1zdGlja3lcIiB9LCBpbm5lclByb3BzLmV2ZW50LnRpdGxlIHx8IHByZWFjdC5jcmVhdGVFbGVtZW50KHByZWFjdC5GcmFnbWVudCwgbnVsbCwgXCJcXHUwMEEwXCIpKSkpKTtcbn1cblxuY29uc3QgTm93SW5kaWNhdG9yQ29udGFpbmVyID0gKHByb3BzKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCAoY29udGV4dCkgPT4ge1xuICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgbGV0IHJlbmRlclByb3BzID0ge1xuICAgICAgICBpc0F4aXM6IHByb3BzLmlzQXhpcyxcbiAgICAgICAgZGF0ZTogY29udGV4dC5kYXRlRW52LnRvRGF0ZShwcm9wcy5kYXRlKSxcbiAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgIH07XG4gICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyAvKiBpbmNsdWRlcyBjaGlsZHJlbiAqLywgeyBlbFRhZzogcHJvcHMuZWxUYWcgfHwgJ2RpdicsIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJub3dJbmRpY2F0b3JDb250ZW50XCIsIGN1c3RvbUdlbmVyYXRvcjogb3B0aW9ucy5ub3dJbmRpY2F0b3JDb250ZW50LCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMubm93SW5kaWNhdG9yQ2xhc3NOYW1lcywgZGlkTW91bnQ6IG9wdGlvbnMubm93SW5kaWNhdG9yRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLm5vd0luZGljYXRvcldpbGxVbm1vdW50IH0pKSk7XG59KSk7XG5cbmNvbnN0IERBWV9OVU1fRk9STUFUID0gY3JlYXRlRm9ybWF0dGVyKHsgZGF5OiAnbnVtZXJpYycgfSk7XG5jbGFzcyBEYXlDZWxsQ29udGFpbmVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMucmVmaW5lUmVuZGVyUHJvcHMgPSBtZW1vaXplT2JqQXJnKHJlZmluZVJlbmRlclByb3BzKTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29udGV4dDtcbiAgICAgICAgbGV0IHJlbmRlclByb3BzID0gdGhpcy5yZWZpbmVSZW5kZXJQcm9wcyh7XG4gICAgICAgICAgICBkYXRlOiBwcm9wcy5kYXRlLFxuICAgICAgICAgICAgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSxcbiAgICAgICAgICAgIGlzTW9udGhTdGFydDogcHJvcHMuaXNNb250aFN0YXJ0IHx8IGZhbHNlLFxuICAgICAgICAgICAgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlcixcbiAgICAgICAgICAgIGV4dHJhUmVuZGVyUHJvcHM6IHByb3BzLmV4dHJhUmVuZGVyUHJvcHMsXG4gICAgICAgICAgICB2aWV3QXBpOiBjb250ZXh0LnZpZXdBcGksXG4gICAgICAgICAgICBkYXRlRW52OiBjb250ZXh0LmRhdGVFbnYsXG4gICAgICAgICAgICBtb250aFN0YXJ0Rm9ybWF0OiBvcHRpb25zLm1vbnRoU3RhcnRGb3JtYXQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRDb250YWluZXIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIC8qIGluY2x1ZGVzIGNoaWxkcmVuICovLCB7IGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgIC4uLmdldERheUNsYXNzTmFtZXMocmVuZGVyUHJvcHMsIGNvbnRleHQudGhlbWUpLFxuICAgICAgICAgICAgICAgIC4uLihwcm9wcy5lbENsYXNzZXMgfHwgW10pLFxuICAgICAgICAgICAgXSwgZWxBdHRyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5lbEF0dHJzKSwgKHJlbmRlclByb3BzLmlzRGlzYWJsZWQgPyB7fSA6IHsgJ2RhdGEtZGF0ZSc6IGZvcm1hdERheVN0cmluZyhwcm9wcy5kYXRlKSB9KSksIHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJkYXlDZWxsQ29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMuZGF5Q2VsbENvbnRlbnQsIGRlZmF1bHRHZW5lcmF0b3I6IHByb3BzLmRlZmF1bHRHZW5lcmF0b3IsIGNsYXNzTmFtZUdlbmVyYXRvcjogXG4gICAgICAgICAgICAvLyBkb24ndCB1c2UgY3VzdG9tIGNsYXNzTmFtZXMgaWYgZGlzYWJsZWRcbiAgICAgICAgICAgIHJlbmRlclByb3BzLmlzRGlzYWJsZWQgPyB1bmRlZmluZWQgOiBvcHRpb25zLmRheUNlbGxDbGFzc05hbWVzLCBkaWRNb3VudDogb3B0aW9ucy5kYXlDZWxsRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLmRheUNlbGxXaWxsVW5tb3VudCB9KSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGhhc0N1c3RvbURheUNlbGxDb250ZW50KG9wdGlvbnMpIHtcbiAgICByZXR1cm4gQm9vbGVhbihvcHRpb25zLmRheUNlbGxDb250ZW50IHx8IGhhc0N1c3RvbVJlbmRlcmluZ0hhbmRsZXIoJ2RheUNlbGxDb250ZW50Jywgb3B0aW9ucykpO1xufVxuZnVuY3Rpb24gcmVmaW5lUmVuZGVyUHJvcHMocmF3KSB7XG4gICAgbGV0IHsgZGF0ZSwgZGF0ZUVudiwgZGF0ZVByb2ZpbGUsIGlzTW9udGhTdGFydCB9ID0gcmF3O1xuICAgIGxldCBkYXlNZXRhID0gZ2V0RGF0ZU1ldGEoZGF0ZSwgcmF3LnRvZGF5UmFuZ2UsIG51bGwsIGRhdGVQcm9maWxlKTtcbiAgICBsZXQgZGF5TnVtYmVyVGV4dCA9IHJhdy5zaG93RGF5TnVtYmVyID8gKGRhdGVFbnYuZm9ybWF0KGRhdGUsIGlzTW9udGhTdGFydCA/IHJhdy5tb250aFN0YXJ0Rm9ybWF0IDogREFZX05VTV9GT1JNQVQpKSA6ICcnO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7IGRhdGU6IGRhdGVFbnYudG9EYXRlKGRhdGUpLCB2aWV3OiByYXcudmlld0FwaSB9LCBkYXlNZXRhKSwgeyBpc01vbnRoU3RhcnQsXG4gICAgICAgIGRheU51bWJlclRleHQgfSksIHJhdy5leHRyYVJlbmRlclByb3BzKTtcbn1cblxuY2xhc3MgQmdFdmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHNlZyB9ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRDb250YWluZXIsIHsgZWxUYWc6IFwiZGl2XCIsIGVsQ2xhc3NlczogWydmYy1iZy1ldmVudCddLCBlbFN0eWxlOiB7IGJhY2tncm91bmRDb2xvcjogc2VnLmV2ZW50UmFuZ2UudWkuYmFja2dyb3VuZENvbG9yIH0sIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlcklubmVyQ29udGVudCwgc2VnOiBzZWcsIHRpbWVUZXh0OiBcIlwiLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGZhbHNlLCBpc1Bhc3Q6IHByb3BzLmlzUGFzdCwgaXNGdXR1cmU6IHByb3BzLmlzRnV0dXJlLCBpc1RvZGF5OiBwcm9wcy5pc1RvZGF5LCBkaXNhYmxlRHJhZ2dpbmc6IHRydWUsIGRpc2FibGVSZXNpemluZzogdHJ1ZSB9KSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVySW5uZXJDb250ZW50KHByb3BzKSB7XG4gICAgbGV0IHsgdGl0bGUgfSA9IHByb3BzLmV2ZW50O1xuICAgIHJldHVybiB0aXRsZSAmJiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZXZlbnQtdGl0bGVcIiB9LCBwcm9wcy5ldmVudC50aXRsZSkpO1xufVxuZnVuY3Rpb24gcmVuZGVyRmlsbChmaWxsVHlwZSkge1xuICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IGBmYy0ke2ZpbGxUeXBlfWAgfSkpO1xufVxuXG5jb25zdCBXZWVrTnVtYmVyQ29udGFpbmVyID0gKHByb3BzKSA9PiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoVmlld0NvbnRleHRUeXBlLkNvbnN1bWVyLCBudWxsLCAoY29udGV4dCkgPT4ge1xuICAgIGxldCB7IGRhdGVFbnYsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgbGV0IHsgZGF0ZSB9ID0gcHJvcHM7XG4gICAgbGV0IGZvcm1hdCA9IG9wdGlvbnMud2Vla051bWJlckZvcm1hdCB8fCBwcm9wcy5kZWZhdWx0Rm9ybWF0O1xuICAgIGxldCBudW0gPSBkYXRlRW52LmNvbXB1dGVXZWVrTnVtYmVyKGRhdGUpOyAvLyBUT0RPOiBzb21laG93IHVzZSBmb3IgZm9ybWF0dGluZyBhcyB3ZWxsP1xuICAgIGxldCB0ZXh0ID0gZGF0ZUVudi5mb3JtYXQoZGF0ZSwgZm9ybWF0KTtcbiAgICBsZXQgcmVuZGVyUHJvcHMgPSB7IG51bSwgdGV4dCwgZGF0ZSB9O1xuICAgIHJldHVybiAocHJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudENvbnRhaW5lciAvLyB3aHkgaXNuJ3QgV2Vla051bWJlckNvbnRlbnRBcmcgYmVpbmcgYXV0by1kZXRlY3RlZD9cbiAgICAsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIC8qIGluY2x1ZGVzIGNoaWxkcmVuICovLCB7IHJlbmRlclByb3BzOiByZW5kZXJQcm9wcywgZ2VuZXJhdG9yTmFtZTogXCJ3ZWVrTnVtYmVyQ29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMud2Vla051bWJlckNvbnRlbnQsIGRlZmF1bHRHZW5lcmF0b3I6IHJlbmRlcklubmVyLCBjbGFzc05hbWVHZW5lcmF0b3I6IG9wdGlvbnMud2Vla051bWJlckNsYXNzTmFtZXMsIGRpZE1vdW50OiBvcHRpb25zLndlZWtOdW1iZXJEaWRNb3VudCwgd2lsbFVubW91bnQ6IG9wdGlvbnMud2Vla051bWJlcldpbGxVbm1vdW50IH0pKSk7XG59KSk7XG5mdW5jdGlvbiByZW5kZXJJbm5lcihpbm5lclByb3BzKSB7XG4gICAgcmV0dXJuIGlubmVyUHJvcHMudGV4dDtcbn1cblxuY29uc3QgUEFERElOR19GUk9NX1ZJRVdQT1JUID0gMTA7XG5jbGFzcyBQb3BvdmVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICB0aXRsZUlkOiBnZXRVbmlxdWVEb21JZCgpLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVJvb3RFbCA9IChlbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yb290RWwgPSBlbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVsUmVmKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVmKHRoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gVHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzICphbnl3aGVyZSogaW4gdGhlIGRvY3VtZW50LCBmb3IgdGhlIGF1dG9IaWRlIGZlYXR1cmVcbiAgICAgICAgdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93biA9IChldikgPT4ge1xuICAgICAgICAgICAgLy8gb25seSBoaWRlIHRoZSBwb3BvdmVyIGlmIHRoZSBjbGljayBoYXBwZW5lZCBvdXRzaWRlIHRoZSBwb3BvdmVyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBnZXRFdmVudFRhcmdldFZpYVJvb3QoZXYpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJvb3RFbC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDbG9zZUNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXYua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2VDbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUNsb3NlQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBvbkNsb3NlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICAgICAgaWYgKG9uQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICBvbkNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgdGhlbWUsIG9wdGlvbnMgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY2xhc3NOYW1lcyA9IFtcbiAgICAgICAgICAgICdmYy1wb3BvdmVyJyxcbiAgICAgICAgICAgIHRoZW1lLmdldENsYXNzKCdwb3BvdmVyJyksXG4gICAgICAgIF0uY29uY2F0KHByb3BzLmV4dHJhQ2xhc3NOYW1lcyB8fCBbXSk7XG4gICAgICAgIHJldHVybiBjb21wYXQuY3JlYXRlUG9ydGFsKHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLmV4dHJhQXR0cnMsIHsgaWQ6IHByb3BzLmlkLCBjbGFzc05hbWU6IGNsYXNzTmFtZXMuam9pbignICcpLCBcImFyaWEtbGFiZWxsZWRieVwiOiBzdGF0ZS50aXRsZUlkLCByZWY6IHRoaXMuaGFuZGxlUm9vdEVsIH0pLFxuICAgICAgICAgICAgcHJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWhlYWRlciAnICsgdGhlbWUuZ2V0Q2xhc3MoJ3BvcG92ZXJIZWFkZXInKSB9LFxuICAgICAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGNsYXNzTmFtZTogXCJmYy1wb3BvdmVyLXRpdGxlXCIsIGlkOiBzdGF0ZS50aXRsZUlkIH0sIHByb3BzLnRpdGxlKSxcbiAgICAgICAgICAgICAgICBwcmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBjbGFzc05hbWU6ICdmYy1wb3BvdmVyLWNsb3NlICcgKyB0aGVtZS5nZXRJY29uQ2xhc3MoJ2Nsb3NlJyksIHRpdGxlOiBvcHRpb25zLmNsb3NlSGludCwgb25DbGljazogdGhpcy5oYW5kbGVDbG9zZUNsaWNrIH0pKSxcbiAgICAgICAgICAgIHByZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiAnZmMtcG9wb3Zlci1ib2R5ICcgKyB0aGVtZS5nZXRDbGFzcygncG9wb3ZlckNvbnRlbnQnKSB9LCBwcm9wcy5jaGlsZHJlbikpLCBwcm9wcy5wYXJlbnRFbCk7XG4gICAgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duKTtcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlEb3duKTtcbiAgICB9XG4gICAgdXBkYXRlU2l6ZSgpIHtcbiAgICAgICAgbGV0IHsgaXNSdGwgfSA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgbGV0IHsgYWxpZ25tZW50RWwsIGFsaWduR3JpZFRvcCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgbGV0IHsgcm9vdEVsIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYWxpZ25tZW50UmVjdCA9IGNvbXB1dGVDbGlwcGVkQ2xpZW50UmVjdChhbGlnbm1lbnRFbCk7XG4gICAgICAgIGlmIChhbGlnbm1lbnRSZWN0KSB7XG4gICAgICAgICAgICBsZXQgcG9wb3ZlckRpbXMgPSByb290RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAvLyBwb3NpdGlvbiByZWxhdGl2ZSB0byB2aWV3cG9ydFxuICAgICAgICAgICAgbGV0IHBvcG92ZXJUb3AgPSBhbGlnbkdyaWRUb3BcbiAgICAgICAgICAgICAgICA/IGVsZW1lbnRDbG9zZXN0KGFsaWdubWVudEVsLCAnLmZjLXNjcm9sbGdyaWQnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgICAgICAgICAgICA6IGFsaWdubWVudFJlY3QudG9wO1xuICAgICAgICAgICAgbGV0IHBvcG92ZXJMZWZ0ID0gaXNSdGwgPyBhbGlnbm1lbnRSZWN0LnJpZ2h0IC0gcG9wb3ZlckRpbXMud2lkdGggOiBhbGlnbm1lbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAvLyBjb25zdHJhaW5cbiAgICAgICAgICAgIHBvcG92ZXJUb3AgPSBNYXRoLm1heChwb3BvdmVyVG9wLCBQQURESU5HX0ZST01fVklFV1BPUlQpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1pbihwb3BvdmVyTGVmdCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIC0gUEFERElOR19GUk9NX1ZJRVdQT1JUIC0gcG9wb3ZlckRpbXMud2lkdGgpO1xuICAgICAgICAgICAgcG9wb3ZlckxlZnQgPSBNYXRoLm1heChwb3BvdmVyTGVmdCwgUEFERElOR19GUk9NX1ZJRVdQT1JUKTtcbiAgICAgICAgICAgIGxldCBvcmlnaW4gPSByb290RWwub2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgYXBwbHlTdHlsZShyb290RWwsIHtcbiAgICAgICAgICAgICAgICB0b3A6IHBvcG92ZXJUb3AgLSBvcmlnaW4udG9wLFxuICAgICAgICAgICAgICAgIGxlZnQ6IHBvcG92ZXJMZWZ0IC0gb3JpZ2luLmxlZnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgTW9yZVBvcG92ZXIgZXh0ZW5kcyBEYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVSb290RWwgPSAocm9vdEVsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbCA9IHJvb3RFbDtcbiAgICAgICAgICAgIGlmIChyb290RWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCh0aGlzLCB7XG4gICAgICAgICAgICAgICAgICAgIGVsOiByb290RWwsXG4gICAgICAgICAgICAgICAgICAgIHVzZUV2ZW50Q2VudGVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgb3B0aW9ucywgZGF0ZUVudiB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgc3RhcnREYXRlLCB0b2RheVJhbmdlLCBkYXRlUHJvZmlsZSB9ID0gcHJvcHM7XG4gICAgICAgIGxldCB0aXRsZSA9IGRhdGVFbnYuZm9ybWF0KHN0YXJ0RGF0ZSwgb3B0aW9ucy5kYXlQb3BvdmVyRm9ybWF0KTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChEYXlDZWxsQ29udGFpbmVyLCB7IGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCwgZGF0ZTogc3RhcnREYXRlLCBkYXRlUHJvZmlsZTogZGF0ZVByb2ZpbGUsIHRvZGF5UmFuZ2U6IHRvZGF5UmFuZ2UgfSwgKElubmVyQ29udGVudCwgcmVuZGVyUHJvcHMsIGVsQXR0cnMpID0+IChwcmVhY3QuY3JlYXRlRWxlbWVudChQb3BvdmVyLCB7IGVsUmVmOiBlbEF0dHJzLnJlZiwgaWQ6IHByb3BzLmlkLCB0aXRsZTogdGl0bGUsIGV4dHJhQ2xhc3NOYW1lczogWydmYy1tb3JlLXBvcG92ZXInXS5jb25jYXQoZWxBdHRycy5jbGFzc05hbWUgfHwgW10pLCBleHRyYUF0dHJzOiBlbEF0dHJzIC8qIFRPRE86IG1ha2UgdGhlc2UgdGltZS1iYXNlZCB3aGVuIG5vdCB3aG9sZS1kYXk/ICovLCBwYXJlbnRFbDogcHJvcHMucGFyZW50RWwsIGFsaWdubWVudEVsOiBwcm9wcy5hbGlnbm1lbnRFbCwgYWxpZ25HcmlkVG9wOiBwcm9wcy5hbGlnbkdyaWRUb3AsIG9uQ2xvc2U6IHByb3BzLm9uQ2xvc2UgfSxcbiAgICAgICAgICAgIGhhc0N1c3RvbURheUNlbGxDb250ZW50KG9wdGlvbnMpICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChJbm5lckNvbnRlbnQsIHsgZWxUYWc6IFwiZGl2XCIsIGVsQ2xhc3NlczogWydmYy1tb3JlLXBvcG92ZXItbWlzYyddIH0pKSxcbiAgICAgICAgICAgIHByb3BzLmNoaWxkcmVuKSkpKTtcbiAgICB9XG4gICAgcXVlcnlIaXQocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgZWxXaWR0aCwgZWxIZWlnaHQpIHtcbiAgICAgICAgbGV0IHsgcm9vdEVsLCBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKHBvc2l0aW9uTGVmdCA+PSAwICYmIHBvc2l0aW9uTGVmdCA8IGVsV2lkdGggJiZcbiAgICAgICAgICAgIHBvc2l0aW9uVG9wID49IDAgJiYgcG9zaXRpb25Ub3AgPCBlbEhlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsXG4gICAgICAgICAgICAgICAgZGF0ZVNwYW46IE9iamVjdC5hc3NpZ24oeyBhbGxEYXk6ICFwcm9wcy5mb3JjZVRpbWVkLCByYW5nZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHByb3BzLnN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogcHJvcHMuZW5kRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgfSB9LCBwcm9wcy5leHRyYURhdGVTcGFuKSxcbiAgICAgICAgICAgICAgICBkYXlFbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgIHJlY3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogZWxXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBlbEhlaWdodCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxheWVyOiAxLCAvLyBpbXBvcnRhbnQgd2hlbiBjb21wYXJpbmcgd2l0aCBoaXRzIGZyb20gb3RoZXIgY29tcG9uZW50c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5cbmNsYXNzIE1vcmVMaW5rQ29udGFpbmVyIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBpc1BvcG92ZXJPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgIHBvcG92ZXJJZDogZ2V0VW5pcXVlRG9tSWQoKSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVMaW5rRWwgPSAobGlua0VsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxpbmtFbCA9IGxpbmtFbDtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLmVsUmVmKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVmKHRoaXMucHJvcHMuZWxSZWYsIGxpbmtFbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgbW9yZUxpbmtDbGljayB9ID0gY29udGV4dC5vcHRpb25zO1xuICAgICAgICAgICAgbGV0IGRhdGUgPSBjb21wdXRlUmFuZ2UocHJvcHMpLnN0YXJ0O1xuICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRQdWJsaWNTZWcoc2VnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgZGVmLCBpbnN0YW5jZSwgcmFuZ2UgfSA9IHNlZy5ldmVudFJhbmdlO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXcgRXZlbnRJbXBsKGNvbnRleHQsIGRlZiwgaW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogY29udGV4dC5kYXRlRW52LnRvRGF0ZShyYW5nZS5zdGFydCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogY29udGV4dC5kYXRlRW52LnRvRGF0ZShyYW5nZS5lbmQpLFxuICAgICAgICAgICAgICAgICAgICBpc1N0YXJ0OiBzZWcuaXNTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgaXNFbmQ6IHNlZy5pc0VuZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBtb3JlTGlua0NsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgbW9yZUxpbmtDbGljayA9IG1vcmVMaW5rQ2xpY2soe1xuICAgICAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBhbGxEYXk6IEJvb2xlYW4ocHJvcHMuYWxsRGF5RGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGFsbFNlZ3M6IHByb3BzLmFsbFNlZ3MubWFwKGJ1aWxkUHVibGljU2VnKSxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuU2VnczogcHJvcHMuaGlkZGVuU2Vncy5tYXAoYnVpbGRQdWJsaWNTZWcpLFxuICAgICAgICAgICAgICAgICAgICBqc0V2ZW50OiBldixcbiAgICAgICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFtb3JlTGlua0NsaWNrIHx8IG1vcmVMaW5rQ2xpY2sgPT09ICdwb3BvdmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc1BvcG92ZXJPcGVuOiB0cnVlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1vcmVMaW5rQ2xpY2sgPT09ICdzdHJpbmcnKSB7IC8vIGEgdmlldyBuYW1lXG4gICAgICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS56b29tVG8oZGF0ZSwgbW9yZUxpbmtDbGljayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUG9wb3ZlckNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzUG9wb3Zlck9wZW46IGZhbHNlIH0pO1xuICAgICAgICB9O1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChwcmVhY3QuY3JlYXRlRWxlbWVudChWaWV3Q29udGV4dFR5cGUuQ29uc3VtZXIsIG51bGwsIChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyB2aWV3QXBpLCBvcHRpb25zLCBjYWxlbmRhckFwaSB9ID0gY29udGV4dDtcbiAgICAgICAgICAgIGxldCB7IG1vcmVMaW5rVGV4dCB9ID0gb3B0aW9ucztcbiAgICAgICAgICAgIGxldCB7IG1vcmVDbnQgfSA9IHByb3BzO1xuICAgICAgICAgICAgbGV0IHJhbmdlID0gY29tcHV0ZVJhbmdlKHByb3BzKTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdHlwZW9mIG1vcmVMaW5rVGV4dCA9PT0gJ2Z1bmN0aW9uJyAvLyBUT0RPOiBldmVudHVhbGx5IHVzZSBmb3JtYXRXaXRoT3JkaW5hbHNcbiAgICAgICAgICAgICAgICA/IG1vcmVMaW5rVGV4dC5jYWxsKGNhbGVuZGFyQXBpLCBtb3JlQ250KVxuICAgICAgICAgICAgICAgIDogYCske21vcmVDbnR9ICR7bW9yZUxpbmtUZXh0fWA7XG4gICAgICAgICAgICBsZXQgaGludCA9IGZvcm1hdFdpdGhPcmRpbmFscyhvcHRpb25zLm1vcmVMaW5rSGludCwgW21vcmVDbnRdLCB0ZXh0KTtcbiAgICAgICAgICAgIGxldCByZW5kZXJQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBudW06IG1vcmVDbnQsXG4gICAgICAgICAgICAgICAgc2hvcnRUZXh0OiBgKyR7bW9yZUNudH1gLFxuICAgICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgICAgdmlldzogdmlld0FwaSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KHByZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICBCb29sZWFuKHByb3BzLm1vcmVDbnQpICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50Q29udGFpbmVyLCB7IGVsVGFnOiBwcm9wcy5lbFRhZyB8fCAnYScsIGVsUmVmOiB0aGlzLmhhbmRsZUxpbmtFbCwgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4ocHJvcHMuZWxDbGFzc2VzIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmYy1tb3JlLWxpbmsnLFxuICAgICAgICAgICAgICAgICAgICBdLCBlbFN0eWxlOiBwcm9wcy5lbFN0eWxlLCBlbEF0dHJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuZWxBdHRycyksIGNyZWF0ZUFyaWFDbGlja0F0dHJzKHRoaXMuaGFuZGxlQ2xpY2spKSwgeyB0aXRsZTogaGludCwgJ2FyaWEtZXhwYW5kZWQnOiBzdGF0ZS5pc1BvcG92ZXJPcGVuLCAnYXJpYS1jb250cm9scyc6IHN0YXRlLmlzUG9wb3Zlck9wZW4gPyBzdGF0ZS5wb3BvdmVySWQgOiAnJyB9KSwgcmVuZGVyUHJvcHM6IHJlbmRlclByb3BzLCBnZW5lcmF0b3JOYW1lOiBcIm1vcmVMaW5rQ29udGVudFwiLCBjdXN0b21HZW5lcmF0b3I6IG9wdGlvbnMubW9yZUxpbmtDb250ZW50LCBkZWZhdWx0R2VuZXJhdG9yOiBwcm9wcy5kZWZhdWx0R2VuZXJhdG9yIHx8IHJlbmRlck1vcmVMaW5rSW5uZXIsIGNsYXNzTmFtZUdlbmVyYXRvcjogb3B0aW9ucy5tb3JlTGlua0NsYXNzTmFtZXMsIGRpZE1vdW50OiBvcHRpb25zLm1vcmVMaW5rRGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLm1vcmVMaW5rV2lsbFVubW91bnQgfSwgcHJvcHMuY2hpbGRyZW4pKSxcbiAgICAgICAgICAgICAgICBzdGF0ZS5pc1BvcG92ZXJPcGVuICYmIChwcmVhY3QuY3JlYXRlRWxlbWVudChNb3JlUG9wb3ZlciwgeyBpZDogc3RhdGUucG9wb3ZlcklkLCBzdGFydERhdGU6IHJhbmdlLnN0YXJ0LCBlbmREYXRlOiByYW5nZS5lbmQsIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXh0cmFEYXRlU3BhbjogcHJvcHMuZXh0cmFEYXRlU3BhbiwgcGFyZW50RWw6IHRoaXMucGFyZW50RWwsIGFsaWdubWVudEVsOiBwcm9wcy5hbGlnbm1lbnRFbFJlZiA/XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy5hbGlnbm1lbnRFbFJlZi5jdXJyZW50IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlua0VsLCBhbGlnbkdyaWRUb3A6IHByb3BzLmFsaWduR3JpZFRvcCwgZm9yY2VUaW1lZDogcHJvcHMuZm9yY2VUaW1lZCwgb25DbG9zZTogdGhpcy5oYW5kbGVQb3BvdmVyQ2xvc2UgfSwgcHJvcHMucG9wb3ZlckNvbnRlbnQoKSkpKSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUGFyZW50RWwoKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsKCk7XG4gICAgfVxuICAgIHVwZGF0ZVBhcmVudEVsKCkge1xuICAgICAgICBpZiAodGhpcy5saW5rRWwpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWwgPSBlbGVtZW50Q2xvc2VzdCh0aGlzLmxpbmtFbCwgJy5mYy12aWV3LWhhcm5lc3MnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIHJlbmRlck1vcmVMaW5rSW5uZXIocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMudGV4dDtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVSYW5nZShwcm9wcykge1xuICAgIGlmIChwcm9wcy5hbGxEYXlEYXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogcHJvcHMuYWxsRGF5RGF0ZSxcbiAgICAgICAgICAgIGVuZDogYWRkRGF5cyhwcm9wcy5hbGxEYXlEYXRlLCAxKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgbGV0IHsgaGlkZGVuU2VncyB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnQ6IGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KGhpZGRlblNlZ3MpLFxuICAgICAgICBlbmQ6IGNvbXB1dGVMYXRlc3RTZWdFbmQoaGlkZGVuU2VncyksXG4gICAgfTtcbn1cbmZ1bmN0aW9uIGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0KHNlZ3MpIHtcbiAgICByZXR1cm4gc2Vncy5yZWR1Y2UocGlja0VhcmxpZXN0U3RhcnQpLmV2ZW50UmFuZ2UucmFuZ2Uuc3RhcnQ7XG59XG5mdW5jdGlvbiBwaWNrRWFybGllc3RTdGFydChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA8IHNlZzEuZXZlbnRSYW5nZS5yYW5nZS5zdGFydCA/IHNlZzAgOiBzZWcxO1xufVxuZnVuY3Rpb24gY29tcHV0ZUxhdGVzdFNlZ0VuZChzZWdzKSB7XG4gICAgcmV0dXJuIHNlZ3MucmVkdWNlKHBpY2tMYXRlc3RFbmQpLmV2ZW50UmFuZ2UucmFuZ2UuZW5kO1xufVxuZnVuY3Rpb24gcGlja0xhdGVzdEVuZChzZWcwLCBzZWcxKSB7XG4gICAgcmV0dXJuIHNlZzAuZXZlbnRSYW5nZS5yYW5nZS5lbmQgPiBzZWcxLmV2ZW50UmFuZ2UucmFuZ2UuZW5kID8gc2VnMCA6IHNlZzE7XG59XG5cbmNsYXNzIFZpZXdDb250YWluZXIgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBsZXQgcmVuZGVyUHJvcHMgPSB7IHZpZXc6IGNvbnRleHQudmlld0FwaSB9O1xuICAgICAgICByZXR1cm4gKHByZWFjdC5jcmVhdGVFbGVtZW50KENvbnRlbnRDb250YWluZXIsIE9iamVjdC5hc3NpZ24oe30sIHByb3BzLCB7IGVsVGFnOiBwcm9wcy5lbFRhZyB8fCAnZGl2JywgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgLi4uYnVpbGRWaWV3Q2xhc3NOYW1lcyhwcm9wcy52aWV3U3BlYyksXG4gICAgICAgICAgICAgICAgLi4uKHByb3BzLmVsQ2xhc3NlcyB8fCBbXSksXG4gICAgICAgICAgICBdLCByZW5kZXJQcm9wczogcmVuZGVyUHJvcHMsIGNsYXNzTmFtZUdlbmVyYXRvcjogb3B0aW9ucy52aWV3Q2xhc3NOYW1lcywgZ2VuZXJhdG9yTmFtZTogdW5kZWZpbmVkLCBkaWRNb3VudDogb3B0aW9ucy52aWV3RGlkTW91bnQsIHdpbGxVbm1vdW50OiBvcHRpb25zLnZpZXdXaWxsVW5tb3VudCB9KSwgKCkgPT4gcHJvcHMuY2hpbGRyZW4pKTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZFZpZXdDbGFzc05hbWVzKHZpZXdTcGVjKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgYGZjLSR7dmlld1NwZWMudHlwZX0tdmlld2AsXG4gICAgICAgICdmYy12aWV3JyxcbiAgICBdO1xufVxuXG5jb25zdCBFVkVOVF9TT1VSQ0VfUkVGSU5FUlMgPSB7XG4gICAgaWQ6IFN0cmluZyxcbiAgICBkZWZhdWx0QWxsRGF5OiBCb29sZWFuLFxuICAgIHVybDogU3RyaW5nLFxuICAgIGZvcm1hdDogU3RyaW5nLFxuICAgIGV2ZW50czogaWRlbnRpdHksXG4gICAgZXZlbnREYXRhVHJhbnNmb3JtOiBpZGVudGl0eSxcbiAgICAvLyBmb3IgYW55IG5ldHdvcmstcmVsYXRlZCBzb3VyY2VzXG4gICAgc3VjY2VzczogaWRlbnRpdHksXG4gICAgZmFpbHVyZTogaWRlbnRpdHksXG59O1xuZnVuY3Rpb24gcGFyc2VFdmVudFNvdXJjZShyYXcsIGNvbnRleHQsIHJlZmluZXJzID0gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzKGNvbnRleHQpKSB7XG4gICAgbGV0IHJhd09iajtcbiAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmF3T2JqID0geyB1cmw6IHJhdyB9O1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgcmF3ID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgICAgICByYXdPYmogPSB7IGV2ZW50czogcmF3IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByYXcgPT09ICdvYmplY3QnICYmIHJhdykgeyAvLyBub3QgbnVsbFxuICAgICAgICByYXdPYmogPSByYXc7XG4gICAgfVxuICAgIGlmIChyYXdPYmopIHtcbiAgICAgICAgbGV0IHsgcmVmaW5lZCwgZXh0cmEgfSA9IHJlZmluZVByb3BzKHJhd09iaiwgcmVmaW5lcnMpO1xuICAgICAgICBsZXQgbWV0YVJlcyA9IGJ1aWxkRXZlbnRTb3VyY2VNZXRhKHJlZmluZWQsIGNvbnRleHQpO1xuICAgICAgICBpZiAobWV0YVJlcykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfcmF3OiByYXcsXG4gICAgICAgICAgICAgICAgaXNGZXRjaGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgbGF0ZXN0RmV0Y2hJZDogJycsXG4gICAgICAgICAgICAgICAgZmV0Y2hSYW5nZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0QWxsRGF5OiByZWZpbmVkLmRlZmF1bHRBbGxEYXksXG4gICAgICAgICAgICAgICAgZXZlbnREYXRhVHJhbnNmb3JtOiByZWZpbmVkLmV2ZW50RGF0YVRyYW5zZm9ybSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiByZWZpbmVkLnN1Y2Nlc3MsXG4gICAgICAgICAgICAgICAgZmFpbHVyZTogcmVmaW5lZC5mYWlsdXJlLFxuICAgICAgICAgICAgICAgIHB1YmxpY0lkOiByZWZpbmVkLmlkIHx8ICcnLFxuICAgICAgICAgICAgICAgIHNvdXJjZUlkOiBndWlkKCksXG4gICAgICAgICAgICAgICAgc291cmNlRGVmSWQ6IG1ldGFSZXMuc291cmNlRGVmSWQsXG4gICAgICAgICAgICAgICAgbWV0YTogbWV0YVJlcy5tZXRhLFxuICAgICAgICAgICAgICAgIHVpOiBjcmVhdGVFdmVudFVpKHJlZmluZWQsIGNvbnRleHQpLFxuICAgICAgICAgICAgICAgIGV4dGVuZGVkUHJvcHM6IGV4dHJhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyhjb250ZXh0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBFVkVOVF9VSV9SRUZJTkVSUyksIEVWRU5UX1NPVVJDRV9SRUZJTkVSUyksIGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VSZWZpbmVycyk7XG59XG5mdW5jdGlvbiBidWlsZEV2ZW50U291cmNlTWV0YShyYXcsIGNvbnRleHQpIHtcbiAgICBsZXQgZGVmcyA9IGNvbnRleHQucGx1Z2luSG9va3MuZXZlbnRTb3VyY2VEZWZzO1xuICAgIGZvciAobGV0IGkgPSBkZWZzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7IC8vIGxhdGVyLWFkZGVkIHBsdWdpbnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICAgIGxldCBkZWYgPSBkZWZzW2ldO1xuICAgICAgICBsZXQgbWV0YSA9IGRlZi5wYXJzZU1ldGEocmF3KTtcbiAgICAgICAgaWYgKG1ldGEpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZURlZklkOiBpLCBtZXRhIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNsYXNzIENhbGVuZGFySW1wbCB7XG4gICAgZ2V0Q3VycmVudERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRhTWFuYWdlci5nZXRDdXJyZW50RGF0YSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICB9XG4gICAgZ2V0IHZpZXcoKSB7IHJldHVybiB0aGlzLmdldEN1cnJlbnREYXRhKCkudmlld0FwaTsgfVxuICAgIGJhdGNoUmVuZGVyaW5nKGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHVwZGF0ZVNpemUoKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcignX3Jlc2l6ZScsIHRydWUpO1xuICAgIH1cbiAgICAvLyBPcHRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBzZXRPcHRpb24obmFtZSwgdmFsKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ1NFVF9PUFRJT04nLFxuICAgICAgICAgICAgb3B0aW9uTmFtZTogbmFtZSxcbiAgICAgICAgICAgIHJhd09wdGlvblZhbHVlOiB2YWwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRPcHRpb24obmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuY3VycmVudENhbGVuZGFyT3B0aW9uc0lucHV0W25hbWVdO1xuICAgIH1cbiAgICBnZXRBdmFpbGFibGVMb2NhbGVDb2RlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuZ2V0Q3VycmVudERhdGEoKS5hdmFpbGFibGVSYXdMb2NhbGVzKTtcbiAgICB9XG4gICAgLy8gVHJpZ2dlclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgb24oaGFuZGxlck5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgbGV0IHsgY3VycmVudERhdGFNYW5hZ2VyIH0gPSB0aGlzO1xuICAgICAgICBpZiAoY3VycmVudERhdGFNYW5hZ2VyLmN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVyc1toYW5kbGVyTmFtZV0pIHtcbiAgICAgICAgICAgIGN1cnJlbnREYXRhTWFuYWdlci5lbWl0dGVyLm9uKGhhbmRsZXJOYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBsaXN0ZW5lciBuYW1lICcke2hhbmRsZXJOYW1lfSdgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvZmYoaGFuZGxlck5hbWUsIGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RGF0YU1hbmFnZXIuZW1pdHRlci5vZmYoaGFuZGxlck5hbWUsIGhhbmRsZXIpO1xuICAgIH1cbiAgICAvLyBub3QgbWVhbnQgZm9yIHB1YmxpYyB1c2VcbiAgICB0cmlnZ2VyKGhhbmRsZXJOYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERhdGFNYW5hZ2VyLmVtaXR0ZXIudHJpZ2dlcihoYW5kbGVyTmFtZSwgLi4uYXJncyk7XG4gICAgfVxuICAgIC8vIFZpZXdcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGNoYW5nZVZpZXcodmlld1R5cGUsIGRhdGVPclJhbmdlKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hSZW5kZXJpbmcoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICAgICAgaWYgKGRhdGVPclJhbmdlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGVPclJhbmdlLnN0YXJ0ICYmIGRhdGVPclJhbmdlLmVuZCkgeyAvLyBhIHJhbmdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9WSUVXX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfT1BUSU9OJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbk5hbWU6ICd2aXNpYmxlUmFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3T3B0aW9uVmFsdWU6IGRhdGVPclJhbmdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX1ZJRVdfVFlQRScsXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVNYXJrZXI6IGRhdGVFbnYuY3JlYXRlTWFya2VyKGRhdGVPclJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfVklFV19UWVBFJyxcbiAgICAgICAgICAgICAgICAgICAgdmlld1R5cGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBGb3JjZXMgbmF2aWdhdGlvbiB0byBhIHZpZXcgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICAgIC8vIGB2aWV3VHlwZWAgY2FuIGJlIGEgc3BlY2lmaWMgdmlldyBuYW1lIG9yIGEgZ2VuZXJpYyBvbmUgbGlrZSBcIndlZWtcIiBvciBcImRheVwiLlxuICAgIC8vIG5lZWRzIHRvIGNoYW5nZVxuICAgIHpvb21UbyhkYXRlTWFya2VyLCB2aWV3VHlwZSkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCBzcGVjO1xuICAgICAgICB2aWV3VHlwZSA9IHZpZXdUeXBlIHx8ICdkYXknOyAvLyBkYXkgaXMgZGVmYXVsdCB6b29tXG4gICAgICAgIHNwZWMgPSBzdGF0ZS52aWV3U3BlY3Nbdmlld1R5cGVdIHx8IHRoaXMuZ2V0VW5pdFZpZXdTcGVjKHZpZXdUeXBlKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICBpZiAoc3BlYykge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9WSUVXX1RZUEUnLFxuICAgICAgICAgICAgICAgIHZpZXdUeXBlOiBzcGVjLnR5cGUsXG4gICAgICAgICAgICAgICAgZGF0ZU1hcmtlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgICAgICBkYXRlTWFya2VyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gR2l2ZW4gYSBkdXJhdGlvbiBzaW5ndWxhciB1bml0LCBsaWtlIFwid2Vla1wiIG9yIFwiZGF5XCIsIGZpbmRzIGEgbWF0Y2hpbmcgdmlldyBzcGVjLlxuICAgIC8vIFByZWZlcmVuY2UgaXMgZ2l2ZW4gdG8gdmlld3MgdGhhdCBoYXZlIGNvcnJlc3BvbmRpbmcgYnV0dG9ucy5cbiAgICBnZXRVbml0Vmlld1NwZWModW5pdCkge1xuICAgICAgICBsZXQgeyB2aWV3U3BlY3MsIHRvb2xiYXJDb25maWcgfSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IHZpZXdUeXBlcyA9IFtdLmNvbmNhdCh0b29sYmFyQ29uZmlnLmhlYWRlciA/IHRvb2xiYXJDb25maWcuaGVhZGVyLnZpZXdzV2l0aEJ1dHRvbnMgOiBbXSwgdG9vbGJhckNvbmZpZy5mb290ZXIgPyB0b29sYmFyQ29uZmlnLmZvb3Rlci52aWV3c1dpdGhCdXR0b25zIDogW10pO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IHNwZWM7XG4gICAgICAgIGZvciAobGV0IHZpZXdUeXBlIGluIHZpZXdTcGVjcykge1xuICAgICAgICAgICAgdmlld1R5cGVzLnB1c2godmlld1R5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB2aWV3VHlwZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHNwZWMgPSB2aWV3U3BlY3Nbdmlld1R5cGVzW2ldXTtcbiAgICAgICAgICAgIGlmIChzcGVjKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWMuc2luZ2xlVW5pdCA9PT0gdW5pdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BlYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEN1cnJlbnQgRGF0ZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJldigpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1BSRVYnIH0pO1xuICAgIH1cbiAgICBuZXh0KCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnTkVYVCcgfSk7XG4gICAgfVxuICAgIHByZXZZZWFyKCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX0RBVEUnLFxuICAgICAgICAgICAgZGF0ZU1hcmtlcjogc3RhdGUuZGF0ZUVudi5hZGRZZWFycyhzdGF0ZS5jdXJyZW50RGF0ZSwgLTEpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmV4dFllYXIoKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdDSEFOR0VfREFURScsXG4gICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZFllYXJzKHN0YXRlLmN1cnJlbnREYXRlLCAxKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvZGF5KCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIHRoaXMudW5zZWxlY3QoKTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiAnQ0hBTkdFX0RBVEUnLFxuICAgICAgICAgICAgZGF0ZU1hcmtlcjogZ2V0Tm93KHN0YXRlLmNhbGVuZGFyT3B0aW9ucy5ub3csIHN0YXRlLmRhdGVFbnYpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ290b0RhdGUoem9uZWREYXRlSW5wdXQpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICB0aGlzLnVuc2VsZWN0KCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgIGRhdGVNYXJrZXI6IHN0YXRlLmRhdGVFbnYuY3JlYXRlTWFya2VyKHpvbmVkRGF0ZUlucHV0KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluY3JlbWVudERhdGUoZGVsdGFJbnB1dCkge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGxldCBkZWx0YSA9IGNyZWF0ZUR1cmF0aW9uKGRlbHRhSW5wdXQpO1xuICAgICAgICBpZiAoZGVsdGEpIHsgLy8gZWxzZSwgd2FybiBhYm91dCBpbnZhbGlkIGlucHV0P1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdCgpO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ0NIQU5HRV9EQVRFJyxcbiAgICAgICAgICAgICAgICBkYXRlTWFya2VyOiBzdGF0ZS5kYXRlRW52LmFkZChzdGF0ZS5jdXJyZW50RGF0ZSwgZGVsdGEpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RGF0ZSgpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICByZXR1cm4gc3RhdGUuZGF0ZUVudi50b0RhdGUoc3RhdGUuY3VycmVudERhdGUpO1xuICAgIH1cbiAgICAvLyBEYXRlIEZvcm1hdHRpbmcgVXRpbHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGZvcm1hdERhdGUoZCwgZm9ybWF0dGVyKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0KGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCBjcmVhdGVGb3JtYXR0ZXIoZm9ybWF0dGVyKSk7XG4gICAgfVxuICAgIC8vIGBzZXR0aW5nc2AgaXMgZm9yIGZvcm1hdHRlciBBTkQgaXNFbmRFeGNsdXNpdmVcbiAgICBmb3JtYXRSYW5nZShkMCwgZDEsIHNldHRpbmdzKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0UmFuZ2UoZGF0ZUVudi5jcmVhdGVNYXJrZXIoZDApLCBkYXRlRW52LmNyZWF0ZU1hcmtlcihkMSksIGNyZWF0ZUZvcm1hdHRlcihzZXR0aW5ncyksIHNldHRpbmdzKTtcbiAgICB9XG4gICAgZm9ybWF0SXNvKGQsIG9taXRUaW1lKSB7XG4gICAgICAgIGxldCB7IGRhdGVFbnYgfSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGRhdGVFbnYuZm9ybWF0SXNvKGRhdGVFbnYuY3JlYXRlTWFya2VyKGQpLCB7IG9taXRUaW1lIH0pO1xuICAgIH1cbiAgICAvLyBEYXRlIFNlbGVjdGlvbiAvIEV2ZW50IFNlbGVjdGlvbiAvIERheUNsaWNrXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBzZWxlY3QoZGF0ZU9yT2JqLCBlbmREYXRlKSB7XG4gICAgICAgIGxldCBzZWxlY3Rpb25JbnB1dDtcbiAgICAgICAgaWYgKGVuZERhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGRhdGVPck9iai5zdGFydCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5wdXQgPSBkYXRlT3JPYmo7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbnB1dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGRhdGVPck9iaixcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25JbnB1dCA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogZGF0ZU9yT2JqLFxuICAgICAgICAgICAgICAgIGVuZDogZW5kRGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBsZXQgc2VsZWN0aW9uID0gcGFyc2VEYXRlU3BhbihzZWxlY3Rpb25JbnB1dCwgc3RhdGUuZGF0ZUVudiwgY3JlYXRlRHVyYXRpb24oeyBkYXlzOiAxIH0pKTtcbiAgICAgICAgaWYgKHNlbGVjdGlvbikgeyAvLyB0aHJvdyBwYXJzZSBlcnJvciBvdGhlcndpc2U/XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1NFTEVDVF9EQVRFUycsIHNlbGVjdGlvbiB9KTtcbiAgICAgICAgICAgIHRyaWdnZXJEYXRlU2VsZWN0KHNlbGVjdGlvbiwgbnVsbCwgc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVuc2VsZWN0KHBldikge1xuICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGlmIChzdGF0ZS5kYXRlU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VMRUNUX0RBVEVTJyB9KTtcbiAgICAgICAgICAgIHRyaWdnZXJEYXRlVW5zZWxlY3QocGV2LCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gUHVibGljIEV2ZW50cyBBUElcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGFkZEV2ZW50KGV2ZW50SW5wdXQsIHNvdXJjZUlucHV0KSB7XG4gICAgICAgIGlmIChldmVudElucHV0IGluc3RhbmNlb2YgRXZlbnRJbXBsKSB7XG4gICAgICAgICAgICBsZXQgZGVmID0gZXZlbnRJbnB1dC5fZGVmO1xuICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gZXZlbnRJbnB1dC5faW5zdGFuY2U7XG4gICAgICAgICAgICBsZXQgY3VycmVudERhdGEgPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgICAgICAvLyBub3QgYWxyZWFkeSBwcmVzZW50PyBkb24ndCB3YW50IHRvIGFkZCBhbiBvbGQgc25hcHNob3RcbiAgICAgICAgICAgIGlmICghY3VycmVudERhdGEuZXZlbnRTdG9yZS5kZWZzW2RlZi5kZWZJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0FERF9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBldmVudFR1cGxlVG9TdG9yZSh7IGRlZiwgaW5zdGFuY2UgfSksIC8vIFRPRE86IGJldHRlciB1dGlsIGZvciB0d28gYXJncz9cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudEFkZChldmVudElucHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBldmVudElucHV0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IGV2ZW50U291cmNlO1xuICAgICAgICBpZiAoc291cmNlSW5wdXQgaW5zdGFuY2VvZiBFdmVudFNvdXJjZUltcGwpIHtcbiAgICAgICAgICAgIGV2ZW50U291cmNlID0gc291cmNlSW5wdXQuaW50ZXJuYWxFdmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlSW5wdXQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUlucHV0KSB7IC8vIHRydWUuIHBhcnQgb2YgdGhlIGZpcnN0IGV2ZW50IHNvdXJjZVxuICAgICAgICAgICAgICAgIFtldmVudFNvdXJjZV0gPSBoYXNoVmFsdWVzVG9BcnJheShzdGF0ZS5ldmVudFNvdXJjZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNvdXJjZUlucHV0ICE9IG51bGwpIHsgLy8gYW4gSUQuIGFjY2VwdHMgYSBudW1iZXIgdG9vXG4gICAgICAgICAgICBsZXQgc291cmNlQXBpID0gdGhpcy5nZXRFdmVudFNvdXJjZUJ5SWQoc291cmNlSW5wdXQpOyAvLyBUT0RPOiB1c2UgYW4gaW50ZXJuYWwgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghc291cmNlQXBpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgZmluZCBhbiBldmVudCBzb3VyY2Ugd2l0aCBJRCBcIiR7c291cmNlSW5wdXR9XCJgKTsgLy8gVE9ETzogdGVzdFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXZlbnRTb3VyY2UgPSBzb3VyY2VBcGkuaW50ZXJuYWxFdmVudFNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdHVwbGUgPSBwYXJzZUV2ZW50KGV2ZW50SW5wdXQsIGV2ZW50U291cmNlLCBzdGF0ZSwgZmFsc2UpO1xuICAgICAgICBpZiAodHVwbGUpIHtcbiAgICAgICAgICAgIGxldCBuZXdFdmVudEFwaSA9IG5ldyBFdmVudEltcGwoc3RhdGUsIHR1cGxlLmRlZiwgdHVwbGUuZGVmLnJlY3VycmluZ0RlZiA/IG51bGwgOiB0dXBsZS5pbnN0YW5jZSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnQUREX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogZXZlbnRUdXBsZVRvU3RvcmUodHVwbGUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJFdmVudEFkZChuZXdFdmVudEFwaSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3RXZlbnRBcGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyaWdnZXJFdmVudEFkZChldmVudEFwaSkge1xuICAgICAgICBsZXQgeyBlbWl0dGVyIH0gPSB0aGlzLmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgIGVtaXR0ZXIudHJpZ2dlcignZXZlbnRBZGQnLCB7XG4gICAgICAgICAgICBldmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBbXSxcbiAgICAgICAgICAgIHJldmVydDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVNT1ZFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGV2ZW50QXBpVG9TdG9yZShldmVudEFwaSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVE9ETzogb3B0aW1pemVcbiAgICBnZXRFdmVudEJ5SWQoaWQpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5nZXRDdXJyZW50RGF0YSgpO1xuICAgICAgICBsZXQgeyBkZWZzLCBpbnN0YW5jZXMgfSA9IHN0YXRlLmV2ZW50U3RvcmU7XG4gICAgICAgIGlkID0gU3RyaW5nKGlkKTtcbiAgICAgICAgZm9yIChsZXQgZGVmSWQgaW4gZGVmcykge1xuICAgICAgICAgICAgbGV0IGRlZiA9IGRlZnNbZGVmSWRdO1xuICAgICAgICAgICAgaWYgKGRlZi5wdWJsaWNJZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVmLnJlY3VycmluZ0RlZikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV2ZW50SW1wbChzdGF0ZSwgZGVmLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5zdGFuY2VJZCBpbiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UuZGVmSWQgPT09IGRlZi5kZWZJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudEltcGwoc3RhdGUsIGRlZiwgaW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXRFdmVudHMoKSB7XG4gICAgICAgIGxldCBjdXJyZW50RGF0YSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgcmV0dXJuIGJ1aWxkRXZlbnRBcGlzKGN1cnJlbnREYXRhLmV2ZW50U3RvcmUsIGN1cnJlbnREYXRhKTtcbiAgICB9XG4gICAgcmVtb3ZlQWxsRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1JFTU9WRV9BTExfRVZFTlRTJyB9KTtcbiAgICB9XG4gICAgLy8gUHVibGljIEV2ZW50IFNvdXJjZXMgQVBJXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBnZXRFdmVudFNvdXJjZXMoKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IHNvdXJjZUhhc2ggPSBzdGF0ZS5ldmVudFNvdXJjZXM7XG4gICAgICAgIGxldCBzb3VyY2VBcGlzID0gW107XG4gICAgICAgIGZvciAobGV0IGludGVybmFsSWQgaW4gc291cmNlSGFzaCkge1xuICAgICAgICAgICAgc291cmNlQXBpcy5wdXNoKG5ldyBFdmVudFNvdXJjZUltcGwoc3RhdGUsIHNvdXJjZUhhc2hbaW50ZXJuYWxJZF0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlQXBpcztcbiAgICB9XG4gICAgZ2V0RXZlbnRTb3VyY2VCeUlkKGlkKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgbGV0IHNvdXJjZUhhc2ggPSBzdGF0ZS5ldmVudFNvdXJjZXM7XG4gICAgICAgIGlkID0gU3RyaW5nKGlkKTtcbiAgICAgICAgZm9yIChsZXQgc291cmNlSWQgaW4gc291cmNlSGFzaCkge1xuICAgICAgICAgICAgaWYgKHNvdXJjZUhhc2hbc291cmNlSWRdLnB1YmxpY0lkID09PSBpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRTb3VyY2VJbXBsKHN0YXRlLCBzb3VyY2VIYXNoW3NvdXJjZUlkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGFkZEV2ZW50U291cmNlKHNvdXJjZUlucHV0KSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuZ2V0Q3VycmVudERhdGEoKTtcbiAgICAgICAgaWYgKHNvdXJjZUlucHV0IGluc3RhbmNlb2YgRXZlbnRTb3VyY2VJbXBsKSB7XG4gICAgICAgICAgICAvLyBub3QgYWxyZWFkeSBwcmVzZW50PyBkb24ndCB3YW50IHRvIGFkZCBhbiBvbGQgc25hcHNob3RcbiAgICAgICAgICAgIGlmICghc3RhdGUuZXZlbnRTb3VyY2VzW3NvdXJjZUlucHV0LmludGVybmFsRXZlbnRTb3VyY2Uuc291cmNlSWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBRERfRVZFTlRfU09VUkNFUycsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZXM6IFtzb3VyY2VJbnB1dC5pbnRlcm5hbEV2ZW50U291cmNlXSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VJbnB1dDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXZlbnRTb3VyY2UgPSBwYXJzZUV2ZW50U291cmNlKHNvdXJjZUlucHV0LCBzdGF0ZSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZSkgeyAvLyBUT0RPOiBlcnJvciBvdGhlcndpc2U/XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0FERF9FVkVOVF9TT1VSQ0VTJywgc291cmNlczogW2V2ZW50U291cmNlXSB9KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRTb3VyY2VJbXBsKHN0YXRlLCBldmVudFNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJlbW92ZUFsbEV2ZW50U291cmNlcygpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdSRU1PVkVfQUxMX0VWRU5UX1NPVVJDRVMnIH0pO1xuICAgIH1cbiAgICByZWZldGNoRXZlbnRzKCkge1xuICAgICAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0ZFVENIX0VWRU5UX1NPVVJDRVMnLCBpc1JlZmV0Y2g6IHRydWUgfSk7XG4gICAgfVxuICAgIC8vIFNjcm9sbFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2Nyb2xsVG9UaW1lKHRpbWVJbnB1dCkge1xuICAgICAgICBsZXQgdGltZSA9IGNyZWF0ZUR1cmF0aW9uKHRpbWVJbnB1dCk7XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ19zY3JvbGxSZXF1ZXN0JywgeyB0aW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jbGFzcyBTdG9yZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWU7XG4gICAgICAgIGZvciAobGV0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgICAgICAgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Vic2NyaWJlKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGFuZGxlcih0aGlzLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qXG5TdWJzY3JpYmVycyB3aWxsIGdldCBhIExJU1Qgb2YgQ3VzdG9tUmVuZGVyaW5nc1xuKi9cbmNsYXNzIEN1c3RvbVJlbmRlcmluZ1N0b3JlIGV4dGVuZHMgU3RvcmUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgLy8gZm9yIGNvbnNpc3RlbnQgb3JkZXJcbiAgICBoYW5kbGUoY3VzdG9tUmVuZGVyaW5nKSB7XG4gICAgICAgIGNvbnN0IHsgbWFwIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoY3VzdG9tUmVuZGVyaW5nLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICBtYXAuc2V0KGN1c3RvbVJlbmRlcmluZy5pZCwgY3VzdG9tUmVuZGVyaW5nKTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1hcC5oYXMoY3VzdG9tUmVuZGVyaW5nLmlkKSkge1xuICAgICAgICAgICAgbWFwLmRlbGV0ZShjdXN0b21SZW5kZXJpbmcuaWQpO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KG1hcCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydHMuQkFTRV9PUFRJT05fREVGQVVMVFMgPSBCQVNFX09QVElPTl9ERUZBVUxUUztcbmV4cG9ydHMuQkFTRV9PUFRJT05fUkVGSU5FUlMgPSBCQVNFX09QVElPTl9SRUZJTkVSUztcbmV4cG9ydHMuQmFzZUNvbXBvbmVudCA9IEJhc2VDb21wb25lbnQ7XG5leHBvcnRzLkJnRXZlbnQgPSBCZ0V2ZW50O1xuZXhwb3J0cy5DQUxFTkRBUl9MSVNURU5FUl9SRUZJTkVSUyA9IENBTEVOREFSX0xJU1RFTkVSX1JFRklORVJTO1xuZXhwb3J0cy5DQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMgPSBDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlM7XG5leHBvcnRzLkNPTVBMRVhfT1BUSU9OX0NPTVBBUkFUT1JTID0gQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlM7XG5leHBvcnRzLkNhbGVuZGFySW1wbCA9IENhbGVuZGFySW1wbDtcbmV4cG9ydHMuQ2FsZW5kYXJSb290ID0gQ2FsZW5kYXJSb290O1xuZXhwb3J0cy5Db250ZW50Q29udGFpbmVyID0gQ29udGVudENvbnRhaW5lcjtcbmV4cG9ydHMuQ3VzdG9tUmVuZGVyaW5nU3RvcmUgPSBDdXN0b21SZW5kZXJpbmdTdG9yZTtcbmV4cG9ydHMuRGF0ZUNvbXBvbmVudCA9IERhdGVDb21wb25lbnQ7XG5leHBvcnRzLkRhdGVFbnYgPSBEYXRlRW52O1xuZXhwb3J0cy5EYXRlUHJvZmlsZUdlbmVyYXRvciA9IERhdGVQcm9maWxlR2VuZXJhdG9yO1xuZXhwb3J0cy5EYXlDZWxsQ29udGFpbmVyID0gRGF5Q2VsbENvbnRhaW5lcjtcbmV4cG9ydHMuRGF5SGVhZGVyID0gRGF5SGVhZGVyO1xuZXhwb3J0cy5EYXlTZXJpZXNNb2RlbCA9IERheVNlcmllc01vZGVsO1xuZXhwb3J0cy5EYXlUYWJsZU1vZGVsID0gRGF5VGFibGVNb2RlbDtcbmV4cG9ydHMuRGVsYXllZFJ1bm5lciA9IERlbGF5ZWRSdW5uZXI7XG5leHBvcnRzLkVsZW1lbnREcmFnZ2luZyA9IEVsZW1lbnREcmFnZ2luZztcbmV4cG9ydHMuRWxlbWVudFNjcm9sbENvbnRyb2xsZXIgPSBFbGVtZW50U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuRW1pdHRlciA9IEVtaXR0ZXI7XG5leHBvcnRzLkV2ZW50Q29udGFpbmVyID0gRXZlbnRDb250YWluZXI7XG5leHBvcnRzLkV2ZW50SW1wbCA9IEV2ZW50SW1wbDtcbmV4cG9ydHMuSW50ZXJhY3Rpb24gPSBJbnRlcmFjdGlvbjtcbmV4cG9ydHMuSnNvblJlcXVlc3RFcnJvciA9IEpzb25SZXF1ZXN0RXJyb3I7XG5leHBvcnRzLk1vcmVMaW5rQ29udGFpbmVyID0gTW9yZUxpbmtDb250YWluZXI7XG5leHBvcnRzLk5hbWVkVGltZVpvbmVJbXBsID0gTmFtZWRUaW1lWm9uZUltcGw7XG5leHBvcnRzLk5vd0luZGljYXRvckNvbnRhaW5lciA9IE5vd0luZGljYXRvckNvbnRhaW5lcjtcbmV4cG9ydHMuTm93VGltZXIgPSBOb3dUaW1lcjtcbmV4cG9ydHMuUG9zaXRpb25DYWNoZSA9IFBvc2l0aW9uQ2FjaGU7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5SZWZNYXAgPSBSZWZNYXA7XG5leHBvcnRzLlJlbmRlcklkID0gUmVuZGVySWQ7XG5leHBvcnRzLlNjcm9sbENvbnRyb2xsZXIgPSBTY3JvbGxDb250cm9sbGVyO1xuZXhwb3J0cy5TY3JvbGxSZXNwb25kZXIgPSBTY3JvbGxSZXNwb25kZXI7XG5leHBvcnRzLlNjcm9sbGVyID0gU2Nyb2xsZXI7XG5leHBvcnRzLlNlZ0hpZXJhcmNoeSA9IFNlZ0hpZXJhcmNoeTtcbmV4cG9ydHMuU2ltcGxlU2Nyb2xsR3JpZCA9IFNpbXBsZVNjcm9sbEdyaWQ7XG5leHBvcnRzLlNsaWNlciA9IFNsaWNlcjtcbmV4cG9ydHMuU3BsaXR0ZXIgPSBTcGxpdHRlcjtcbmV4cG9ydHMuU3RhbmRhcmRFdmVudCA9IFN0YW5kYXJkRXZlbnQ7XG5leHBvcnRzLlRhYmxlRGF0ZUNlbGwgPSBUYWJsZURhdGVDZWxsO1xuZXhwb3J0cy5UYWJsZURvd0NlbGwgPSBUYWJsZURvd0NlbGw7XG5leHBvcnRzLlRoZW1lID0gVGhlbWU7XG5leHBvcnRzLlZJRVdfT1BUSU9OX1JFRklORVJTID0gVklFV19PUFRJT05fUkVGSU5FUlM7XG5leHBvcnRzLlZpZXdDb250YWluZXIgPSBWaWV3Q29udGFpbmVyO1xuZXhwb3J0cy5WaWV3Q29udGV4dFR5cGUgPSBWaWV3Q29udGV4dFR5cGU7XG5leHBvcnRzLldlZWtOdW1iZXJDb250YWluZXIgPSBXZWVrTnVtYmVyQ29udGFpbmVyO1xuZXhwb3J0cy5XaW5kb3dTY3JvbGxDb250cm9sbGVyID0gV2luZG93U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuYWRkRGF5cyA9IGFkZERheXM7XG5leHBvcnRzLmFkZER1cmF0aW9ucyA9IGFkZER1cmF0aW9ucztcbmV4cG9ydHMuYWRkTXMgPSBhZGRNcztcbmV4cG9ydHMuYWRkV2Vla3MgPSBhZGRXZWVrcztcbmV4cG9ydHMuYWxsb3dDb250ZXh0TWVudSA9IGFsbG93Q29udGV4dE1lbnU7XG5leHBvcnRzLmFsbG93U2VsZWN0aW9uID0gYWxsb3dTZWxlY3Rpb247XG5leHBvcnRzLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUgPSBhcHBseU11dGF0aW9uVG9FdmVudFN0b3JlO1xuZXhwb3J0cy5hcHBseVN0eWxlID0gYXBwbHlTdHlsZTtcbmV4cG9ydHMuYXBwbHlTdHlsZVByb3AgPSBhcHBseVN0eWxlUHJvcDtcbmV4cG9ydHMuYXJyYXlUb0hhc2ggPSBhcnJheVRvSGFzaDtcbmV4cG9ydHMuYXNDbGVhbkRheXMgPSBhc0NsZWFuRGF5cztcbmV4cG9ydHMuYXNSb3VnaE1pbnV0ZXMgPSBhc1JvdWdoTWludXRlcztcbmV4cG9ydHMuYXNSb3VnaE1zID0gYXNSb3VnaE1zO1xuZXhwb3J0cy5hc1JvdWdoU2Vjb25kcyA9IGFzUm91Z2hTZWNvbmRzO1xuZXhwb3J0cy5iaW5hcnlTZWFyY2ggPSBiaW5hcnlTZWFyY2g7XG5leHBvcnRzLmJ1aWxkRWxBdHRycyA9IGJ1aWxkRWxBdHRycztcbmV4cG9ydHMuYnVpbGRFbnRyeUtleSA9IGJ1aWxkRW50cnlLZXk7XG5leHBvcnRzLmJ1aWxkRXZlbnRBcGlzID0gYnVpbGRFdmVudEFwaXM7XG5leHBvcnRzLmJ1aWxkRXZlbnRSYW5nZUtleSA9IGJ1aWxkRXZlbnRSYW5nZUtleTtcbmV4cG9ydHMuYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzID0gYnVpbGRFdmVudFNvdXJjZVJlZmluZXJzO1xuZXhwb3J0cy5idWlsZElzb1N0cmluZyA9IGJ1aWxkSXNvU3RyaW5nO1xuZXhwb3J0cy5idWlsZE5hdkxpbmtBdHRycyA9IGJ1aWxkTmF2TGlua0F0dHJzO1xuZXhwb3J0cy5idWlsZFJhbmdlQXBpV2l0aFRpbWVab25lID0gYnVpbGRSYW5nZUFwaVdpdGhUaW1lWm9uZTtcbmV4cG9ydHMuYnVpbGRTZWdUaW1lVGV4dCA9IGJ1aWxkU2VnVGltZVRleHQ7XG5leHBvcnRzLmJ1aWxkVmlld0NsYXNzTmFtZXMgPSBidWlsZFZpZXdDbGFzc05hbWVzO1xuZXhwb3J0cy5idWlsZFZpZXdDb250ZXh0ID0gYnVpbGRWaWV3Q29udGV4dDtcbmV4cG9ydHMuY29sbGVjdEZyb21IYXNoID0gY29sbGVjdEZyb21IYXNoO1xuZXhwb3J0cy5jb21iaW5lRXZlbnRVaXMgPSBjb21iaW5lRXZlbnRVaXM7XG5leHBvcnRzLmNvbXBhcmVCeUZpZWxkU3BlY3MgPSBjb21wYXJlQnlGaWVsZFNwZWNzO1xuZXhwb3J0cy5jb21wYXJlTnVtYmVycyA9IGNvbXBhcmVOdW1iZXJzO1xuZXhwb3J0cy5jb21wYXJlT2JqcyA9IGNvbXBhcmVPYmpzO1xuZXhwb3J0cy5jb21wdXRlRWFybGllc3RTZWdTdGFydCA9IGNvbXB1dGVFYXJsaWVzdFNlZ1N0YXJ0O1xuZXhwb3J0cy5jb21wdXRlRWRnZXMgPSBjb21wdXRlRWRnZXM7XG5leHBvcnRzLmNvbXB1dGVGYWxsYmFja0hlYWRlckZvcm1hdCA9IGNvbXB1dGVGYWxsYmFja0hlYWRlckZvcm1hdDtcbmV4cG9ydHMuY29tcHV0ZUlubmVyUmVjdCA9IGNvbXB1dGVJbm5lclJlY3Q7XG5leHBvcnRzLmNvbXB1dGVSZWN0ID0gY29tcHV0ZVJlY3Q7XG5leHBvcnRzLmNvbXB1dGVTaHJpbmtXaWR0aCA9IGNvbXB1dGVTaHJpbmtXaWR0aDtcbmV4cG9ydHMuY29tcHV0ZVZpc2libGVEYXlSYW5nZSA9IGNvbXB1dGVWaXNpYmxlRGF5UmFuZ2U7XG5leHBvcnRzLmNvbmZpZyA9IGNvbmZpZztcbmV4cG9ydHMuY29uc3RyYWluUG9pbnQgPSBjb25zdHJhaW5Qb2ludDtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb247XG5leHBvcnRzLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSA9IGNyZWF0ZUVtcHR5RXZlbnRTdG9yZTtcbmV4cG9ydHMuY3JlYXRlRXZlbnRJbnN0YW5jZSA9IGNyZWF0ZUV2ZW50SW5zdGFuY2U7XG5leHBvcnRzLmNyZWF0ZUV2ZW50VWkgPSBjcmVhdGVFdmVudFVpO1xuZXhwb3J0cy5jcmVhdGVGb3JtYXR0ZXIgPSBjcmVhdGVGb3JtYXR0ZXI7XG5leHBvcnRzLmRpZmZEYXRlcyA9IGRpZmZEYXRlcztcbmV4cG9ydHMuZGlmZkRheUFuZFRpbWUgPSBkaWZmRGF5QW5kVGltZTtcbmV4cG9ydHMuZGlmZkRheXMgPSBkaWZmRGF5cztcbmV4cG9ydHMuZGlmZlBvaW50cyA9IGRpZmZQb2ludHM7XG5leHBvcnRzLmRpZmZXZWVrcyA9IGRpZmZXZWVrcztcbmV4cG9ydHMuZGlmZldob2xlRGF5cyA9IGRpZmZXaG9sZURheXM7XG5leHBvcnRzLmRpZmZXaG9sZVdlZWtzID0gZGlmZldob2xlV2Vla3M7XG5leHBvcnRzLmRpc2FibGVDdXJzb3IgPSBkaXNhYmxlQ3Vyc29yO1xuZXhwb3J0cy5lbGVtZW50Q2xvc2VzdCA9IGVsZW1lbnRDbG9zZXN0O1xuZXhwb3J0cy5lbGVtZW50TWF0Y2hlcyA9IGVsZW1lbnRNYXRjaGVzO1xuZXhwb3J0cy5lbmFibGVDdXJzb3IgPSBlbmFibGVDdXJzb3I7XG5leHBvcnRzLmVuc3VyZUVsSGFzU3R5bGVzID0gZW5zdXJlRWxIYXNTdHlsZXM7XG5leHBvcnRzLmV2ZW50VHVwbGVUb1N0b3JlID0gZXZlbnRUdXBsZVRvU3RvcmU7XG5leHBvcnRzLmZpbHRlckhhc2ggPSBmaWx0ZXJIYXNoO1xuZXhwb3J0cy5maW5kRGlyZWN0Q2hpbGRyZW4gPSBmaW5kRGlyZWN0Q2hpbGRyZW47XG5leHBvcnRzLmZpbmRFbGVtZW50cyA9IGZpbmRFbGVtZW50cztcbmV4cG9ydHMuZmxleGlibGVDb21wYXJlID0gZmxleGlibGVDb21wYXJlO1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBmbHVzaFN5bmM7XG5leHBvcnRzLmZvcm1hdERheVN0cmluZyA9IGZvcm1hdERheVN0cmluZztcbmV4cG9ydHMuZm9ybWF0SXNvTW9udGhTdHIgPSBmb3JtYXRJc29Nb250aFN0cjtcbmV4cG9ydHMuZm9ybWF0SXNvVGltZVN0cmluZyA9IGZvcm1hdElzb1RpbWVTdHJpbmc7XG5leHBvcnRzLmZvcm1hdFdpdGhPcmRpbmFscyA9IGZvcm1hdFdpdGhPcmRpbmFscztcbmV4cG9ydHMuZ2V0QWxsb3dZU2Nyb2xsaW5nID0gZ2V0QWxsb3dZU2Nyb2xsaW5nO1xuZXhwb3J0cy5nZXRDYW5WR3Jvd1dpdGhpbkNlbGwgPSBnZXRDYW5WR3Jvd1dpdGhpbkNlbGw7XG5leHBvcnRzLmdldENsaXBwaW5nUGFyZW50cyA9IGdldENsaXBwaW5nUGFyZW50cztcbmV4cG9ydHMuZ2V0RGF0ZU1ldGEgPSBnZXREYXRlTWV0YTtcbmV4cG9ydHMuZ2V0RGF5Q2xhc3NOYW1lcyA9IGdldERheUNsYXNzTmFtZXM7XG5leHBvcnRzLmdldERlZmF1bHRFdmVudEVuZCA9IGdldERlZmF1bHRFdmVudEVuZDtcbmV4cG9ydHMuZ2V0RWxTZWcgPSBnZXRFbFNlZztcbmV4cG9ydHMuZ2V0RW50cnlTcGFuRW5kID0gZ2V0RW50cnlTcGFuRW5kO1xuZXhwb3J0cy5nZXRFdmVudFRhcmdldFZpYVJvb3QgPSBnZXRFdmVudFRhcmdldFZpYVJvb3Q7XG5leHBvcnRzLmdldEluaXRpYWxEYXRlID0gZ2V0SW5pdGlhbERhdGU7XG5leHBvcnRzLmdldElzUnRsU2Nyb2xsYmFyT25MZWZ0ID0gZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQ7XG5leHBvcnRzLmdldE5vdyA9IGdldE5vdztcbmV4cG9ydHMuZ2V0UmVjdENlbnRlciA9IGdldFJlY3RDZW50ZXI7XG5leHBvcnRzLmdldFJlbGV2YW50RXZlbnRzID0gZ2V0UmVsZXZhbnRFdmVudHM7XG5leHBvcnRzLmdldFNjcm9sbEdyaWRDbGFzc05hbWVzID0gZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXM7XG5leHBvcnRzLmdldFNjcm9sbGJhcldpZHRocyA9IGdldFNjcm9sbGJhcldpZHRocztcbmV4cG9ydHMuZ2V0U2VjdGlvbkNsYXNzTmFtZXMgPSBnZXRTZWN0aW9uQ2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodCA9IGdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQ7XG5leHBvcnRzLmdldFNlZ0FuY2hvckF0dHJzID0gZ2V0U2VnQW5jaG9yQXR0cnM7XG5leHBvcnRzLmdldFNlZ01ldGEgPSBnZXRTZWdNZXRhO1xuZXhwb3J0cy5nZXRTbG90Q2xhc3NOYW1lcyA9IGdldFNsb3RDbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTdGlja3lGb290ZXJTY3JvbGxiYXIgPSBnZXRTdGlja3lGb290ZXJTY3JvbGxiYXI7XG5leHBvcnRzLmdldFN0aWNreUhlYWRlckRhdGVzID0gZ2V0U3RpY2t5SGVhZGVyRGF0ZXM7XG5leHBvcnRzLmdldFVuaXF1ZURvbUlkID0gZ2V0VW5pcXVlRG9tSWQ7XG5leHBvcnRzLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvciA9IGdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcjtcbmV4cG9ydHMuZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzID0gZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzO1xuZXhwb3J0cy5ndWlkID0gZ3VpZDtcbmV4cG9ydHMuaGFzQmdSZW5kZXJpbmcgPSBoYXNCZ1JlbmRlcmluZztcbmV4cG9ydHMuaGFzQ3VzdG9tRGF5Q2VsbENvbnRlbnQgPSBoYXNDdXN0b21EYXlDZWxsQ29udGVudDtcbmV4cG9ydHMuaGFzU2hyaW5rV2lkdGggPSBoYXNTaHJpbmtXaWR0aDtcbmV4cG9ydHMuaGFzaFZhbHVlc1RvQXJyYXkgPSBoYXNoVmFsdWVzVG9BcnJheTtcbmV4cG9ydHMuaWRlbnRpdHkgPSBpZGVudGl0eTtcbmV4cG9ydHMuaW5qZWN0U3R5bGVzID0gaW5qZWN0U3R5bGVzO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzU3RvcmUgPSBpbnRlcmFjdGlvblNldHRpbmdzU3RvcmU7XG5leHBvcnRzLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlID0gaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmU7XG5leHBvcnRzLmludGVyc2VjdFJhbmdlcyA9IGludGVyc2VjdFJhbmdlcztcbmV4cG9ydHMuaW50ZXJzZWN0UmVjdHMgPSBpbnRlcnNlY3RSZWN0cztcbmV4cG9ydHMuaW50ZXJzZWN0U3BhbnMgPSBpbnRlcnNlY3RTcGFucztcbmV4cG9ydHMuaXNBcnJheXNFcXVhbCA9IGlzQXJyYXlzRXF1YWw7XG5leHBvcnRzLmlzQ29sUHJvcHNFcXVhbCA9IGlzQ29sUHJvcHNFcXVhbDtcbmV4cG9ydHMuaXNEYXRlU2VsZWN0aW9uVmFsaWQgPSBpc0RhdGVTZWxlY3Rpb25WYWxpZDtcbmV4cG9ydHMuaXNEYXRlU3BhbnNFcXVhbCA9IGlzRGF0ZVNwYW5zRXF1YWw7XG5leHBvcnRzLmlzSW50ID0gaXNJbnQ7XG5leHBvcnRzLmlzSW50ZXJhY3Rpb25WYWxpZCA9IGlzSW50ZXJhY3Rpb25WYWxpZDtcbmV4cG9ydHMuaXNNdWx0aURheVJhbmdlID0gaXNNdWx0aURheVJhbmdlO1xuZXhwb3J0cy5pc1Byb3BzRXF1YWwgPSBpc1Byb3BzRXF1YWw7XG5leHBvcnRzLmlzUHJvcHNWYWxpZCA9IGlzUHJvcHNWYWxpZDtcbmV4cG9ydHMuaXNWYWxpZERhdGUgPSBpc1ZhbGlkRGF0ZTtcbmV4cG9ydHMubGlzdGVuQnlTZWxlY3RvciA9IGxpc3RlbkJ5U2VsZWN0b3I7XG5leHBvcnRzLmxpc3RlblRvSG92ZXJCeVNlbGVjdG9yID0gbGlzdGVuVG9Ib3ZlckJ5U2VsZWN0b3I7XG5leHBvcnRzLm1hcEhhc2ggPSBtYXBIYXNoO1xuZXhwb3J0cy5tZW1vaXplID0gbWVtb2l6ZTtcbmV4cG9ydHMubWVtb2l6ZUFycmF5bGlrZSA9IG1lbW9pemVBcnJheWxpa2U7XG5leHBvcnRzLm1lbW9pemVIYXNobGlrZSA9IG1lbW9pemVIYXNobGlrZTtcbmV4cG9ydHMubWVtb2l6ZU9iakFyZyA9IG1lbW9pemVPYmpBcmc7XG5leHBvcnRzLm1lcmdlRXZlbnRTdG9yZXMgPSBtZXJnZUV2ZW50U3RvcmVzO1xuZXhwb3J0cy5tZXJnZVByb3BzID0gbWVyZ2VQcm9wcztcbmV4cG9ydHMubWVyZ2VSYXdPcHRpb25zID0gbWVyZ2VSYXdPcHRpb25zO1xuZXhwb3J0cy5tdWx0aXBseUR1cmF0aW9uID0gbXVsdGlwbHlEdXJhdGlvbjtcbmV4cG9ydHMucGFkU3RhcnQgPSBwYWRTdGFydDtcbmV4cG9ydHMucGFyc2UgPSBwYXJzZTtcbmV4cG9ydHMucGFyc2VCdXNpbmVzc0hvdXJzID0gcGFyc2VCdXNpbmVzc0hvdXJzO1xuZXhwb3J0cy5wYXJzZUNsYXNzTmFtZXMgPSBwYXJzZUNsYXNzTmFtZXM7XG5leHBvcnRzLnBhcnNlRHJhZ01ldGEgPSBwYXJzZURyYWdNZXRhO1xuZXhwb3J0cy5wYXJzZUV2ZW50RGVmID0gcGFyc2VFdmVudERlZjtcbmV4cG9ydHMucGFyc2VFdmVudFNvdXJjZSA9IHBhcnNlRXZlbnRTb3VyY2U7XG5leHBvcnRzLnBhcnNlRmllbGRTcGVjcyA9IHBhcnNlRmllbGRTcGVjcztcbmV4cG9ydHMucGFyc2VJbnRlcmFjdGlvblNldHRpbmdzID0gcGFyc2VJbnRlcmFjdGlvblNldHRpbmdzO1xuZXhwb3J0cy5wb2ludEluc2lkZVJlY3QgPSBwb2ludEluc2lkZVJlY3Q7XG5leHBvcnRzLnByZXZlbnRDb250ZXh0TWVudSA9IHByZXZlbnRDb250ZXh0TWVudTtcbmV4cG9ydHMucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDtcbmV4cG9ydHMucHJldmVudFNlbGVjdGlvbiA9IHByZXZlbnRTZWxlY3Rpb247XG5leHBvcnRzLnJhbmdlQ29udGFpbnNNYXJrZXIgPSByYW5nZUNvbnRhaW5zTWFya2VyO1xuZXhwb3J0cy5yYW5nZUNvbnRhaW5zUmFuZ2UgPSByYW5nZUNvbnRhaW5zUmFuZ2U7XG5leHBvcnRzLnJhbmdlc0VxdWFsID0gcmFuZ2VzRXF1YWw7XG5leHBvcnRzLnJhbmdlc0ludGVyc2VjdCA9IHJhbmdlc0ludGVyc2VjdDtcbmV4cG9ydHMucmVkdWNlQ3VycmVudERhdGUgPSByZWR1Y2VDdXJyZW50RGF0ZTtcbmV4cG9ydHMucmVkdWNlRXZlbnRTdG9yZSA9IHJlZHVjZUV2ZW50U3RvcmU7XG5leHBvcnRzLnJlZmluZUV2ZW50RGVmID0gcmVmaW5lRXZlbnREZWY7XG5leHBvcnRzLnJlZmluZVByb3BzID0gcmVmaW5lUHJvcHM7XG5leHBvcnRzLnJlbW92ZUVsZW1lbnQgPSByZW1vdmVFbGVtZW50O1xuZXhwb3J0cy5yZW1vdmVFeGFjdCA9IHJlbW92ZUV4YWN0O1xuZXhwb3J0cy5yZW5kZXJDaHVua0NvbnRlbnQgPSByZW5kZXJDaHVua0NvbnRlbnQ7XG5leHBvcnRzLnJlbmRlckZpbGwgPSByZW5kZXJGaWxsO1xuZXhwb3J0cy5yZW5kZXJNaWNyb0NvbEdyb3VwID0gcmVuZGVyTWljcm9Db2xHcm91cDtcbmV4cG9ydHMucmVuZGVyU2Nyb2xsU2hpbSA9IHJlbmRlclNjcm9sbFNoaW07XG5leHBvcnRzLnJlcXVlc3RKc29uID0gcmVxdWVzdEpzb247XG5leHBvcnRzLnJlem9uZUV2ZW50U3RvcmVEYXRlcyA9IHJlem9uZUV2ZW50U3RvcmVEYXRlcztcbmV4cG9ydHMuc2FuaXRpemVTaHJpbmtXaWR0aCA9IHNhbml0aXplU2hyaW5rV2lkdGg7XG5leHBvcnRzLnNldFJlZiA9IHNldFJlZjtcbmV4cG9ydHMuc2xpY2VFdmVudFN0b3JlID0gc2xpY2VFdmVudFN0b3JlO1xuZXhwb3J0cy5zb3J0RXZlbnRTZWdzID0gc29ydEV2ZW50U2VncztcbmV4cG9ydHMuc3RhcnRPZkRheSA9IHN0YXJ0T2ZEYXk7XG5leHBvcnRzLnN1YnRyYWN0RHVyYXRpb25zID0gc3VidHJhY3REdXJhdGlvbnM7XG5leHBvcnRzLnRyYW5zbGF0ZVJlY3QgPSB0cmFuc2xhdGVSZWN0O1xuZXhwb3J0cy50cmlnZ2VyRGF0ZVNlbGVjdCA9IHRyaWdnZXJEYXRlU2VsZWN0O1xuZXhwb3J0cy51bnByb21pc2lmeSA9IHVucHJvbWlzaWZ5O1xuZXhwb3J0cy53aGVuVHJhbnNpdGlvbkRvbmUgPSB3aGVuVHJhbnNpdGlvbkRvbmU7XG5leHBvcnRzLndob2xlRGl2aWRlRHVyYXRpb25zID0gd2hvbGVEaXZpZGVEdXJhdGlvbnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBpbnRlcm5hbENvbW1vbiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwtY29tbW9uLmNqcycpO1xucmVxdWlyZSgncHJlYWN0Jyk7XG5yZXF1aXJlKCdwcmVhY3QvY29tcGF0Jyk7XG5cblxuXG5leHBvcnRzLkJBU0VfT1BUSU9OX0RFRkFVTFRTID0gaW50ZXJuYWxDb21tb24uQkFTRV9PUFRJT05fREVGQVVMVFM7XG5leHBvcnRzLkJhc2VDb21wb25lbnQgPSBpbnRlcm5hbENvbW1vbi5CYXNlQ29tcG9uZW50O1xuZXhwb3J0cy5CZ0V2ZW50ID0gaW50ZXJuYWxDb21tb24uQmdFdmVudDtcbmV4cG9ydHMuQ2FsZW5kYXJJbXBsID0gaW50ZXJuYWxDb21tb24uQ2FsZW5kYXJJbXBsO1xuZXhwb3J0cy5DYWxlbmRhclJvb3QgPSBpbnRlcm5hbENvbW1vbi5DYWxlbmRhclJvb3Q7XG5leHBvcnRzLkNvbnRlbnRDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5Db250ZW50Q29udGFpbmVyO1xuZXhwb3J0cy5DdXN0b21SZW5kZXJpbmdTdG9yZSA9IGludGVybmFsQ29tbW9uLkN1c3RvbVJlbmRlcmluZ1N0b3JlO1xuZXhwb3J0cy5EYXRlQ29tcG9uZW50ID0gaW50ZXJuYWxDb21tb24uRGF0ZUNvbXBvbmVudDtcbmV4cG9ydHMuRGF0ZUVudiA9IGludGVybmFsQ29tbW9uLkRhdGVFbnY7XG5leHBvcnRzLkRhdGVQcm9maWxlR2VuZXJhdG9yID0gaW50ZXJuYWxDb21tb24uRGF0ZVByb2ZpbGVHZW5lcmF0b3I7XG5leHBvcnRzLkRheUNlbGxDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5EYXlDZWxsQ29udGFpbmVyO1xuZXhwb3J0cy5EYXlIZWFkZXIgPSBpbnRlcm5hbENvbW1vbi5EYXlIZWFkZXI7XG5leHBvcnRzLkRheVNlcmllc01vZGVsID0gaW50ZXJuYWxDb21tb24uRGF5U2VyaWVzTW9kZWw7XG5leHBvcnRzLkRheVRhYmxlTW9kZWwgPSBpbnRlcm5hbENvbW1vbi5EYXlUYWJsZU1vZGVsO1xuZXhwb3J0cy5EZWxheWVkUnVubmVyID0gaW50ZXJuYWxDb21tb24uRGVsYXllZFJ1bm5lcjtcbmV4cG9ydHMuRWxlbWVudERyYWdnaW5nID0gaW50ZXJuYWxDb21tb24uRWxlbWVudERyYWdnaW5nO1xuZXhwb3J0cy5FbGVtZW50U2Nyb2xsQ29udHJvbGxlciA9IGludGVybmFsQ29tbW9uLkVsZW1lbnRTY3JvbGxDb250cm9sbGVyO1xuZXhwb3J0cy5FbWl0dGVyID0gaW50ZXJuYWxDb21tb24uRW1pdHRlcjtcbmV4cG9ydHMuRXZlbnRDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5FdmVudENvbnRhaW5lcjtcbmV4cG9ydHMuRXZlbnRJbXBsID0gaW50ZXJuYWxDb21tb24uRXZlbnRJbXBsO1xuZXhwb3J0cy5JbnRlcmFjdGlvbiA9IGludGVybmFsQ29tbW9uLkludGVyYWN0aW9uO1xuZXhwb3J0cy5Nb3JlTGlua0NvbnRhaW5lciA9IGludGVybmFsQ29tbW9uLk1vcmVMaW5rQ29udGFpbmVyO1xuZXhwb3J0cy5OYW1lZFRpbWVab25lSW1wbCA9IGludGVybmFsQ29tbW9uLk5hbWVkVGltZVpvbmVJbXBsO1xuZXhwb3J0cy5Ob3dJbmRpY2F0b3JDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5Ob3dJbmRpY2F0b3JDb250YWluZXI7XG5leHBvcnRzLk5vd1RpbWVyID0gaW50ZXJuYWxDb21tb24uTm93VGltZXI7XG5leHBvcnRzLlBvc2l0aW9uQ2FjaGUgPSBpbnRlcm5hbENvbW1vbi5Qb3NpdGlvbkNhY2hlO1xuZXhwb3J0cy5SZWZNYXAgPSBpbnRlcm5hbENvbW1vbi5SZWZNYXA7XG5leHBvcnRzLlNjcm9sbENvbnRyb2xsZXIgPSBpbnRlcm5hbENvbW1vbi5TY3JvbGxDb250cm9sbGVyO1xuZXhwb3J0cy5TY3JvbGxSZXNwb25kZXIgPSBpbnRlcm5hbENvbW1vbi5TY3JvbGxSZXNwb25kZXI7XG5leHBvcnRzLlNjcm9sbGVyID0gaW50ZXJuYWxDb21tb24uU2Nyb2xsZXI7XG5leHBvcnRzLlNlZ0hpZXJhcmNoeSA9IGludGVybmFsQ29tbW9uLlNlZ0hpZXJhcmNoeTtcbmV4cG9ydHMuU2ltcGxlU2Nyb2xsR3JpZCA9IGludGVybmFsQ29tbW9uLlNpbXBsZVNjcm9sbEdyaWQ7XG5leHBvcnRzLlNsaWNlciA9IGludGVybmFsQ29tbW9uLlNsaWNlcjtcbmV4cG9ydHMuU3BsaXR0ZXIgPSBpbnRlcm5hbENvbW1vbi5TcGxpdHRlcjtcbmV4cG9ydHMuU3RhbmRhcmRFdmVudCA9IGludGVybmFsQ29tbW9uLlN0YW5kYXJkRXZlbnQ7XG5leHBvcnRzLlRhYmxlRGF0ZUNlbGwgPSBpbnRlcm5hbENvbW1vbi5UYWJsZURhdGVDZWxsO1xuZXhwb3J0cy5UYWJsZURvd0NlbGwgPSBpbnRlcm5hbENvbW1vbi5UYWJsZURvd0NlbGw7XG5leHBvcnRzLlRoZW1lID0gaW50ZXJuYWxDb21tb24uVGhlbWU7XG5leHBvcnRzLlZpZXdDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5WaWV3Q29udGFpbmVyO1xuZXhwb3J0cy5WaWV3Q29udGV4dFR5cGUgPSBpbnRlcm5hbENvbW1vbi5WaWV3Q29udGV4dFR5cGU7XG5leHBvcnRzLldlZWtOdW1iZXJDb250YWluZXIgPSBpbnRlcm5hbENvbW1vbi5XZWVrTnVtYmVyQ29udGFpbmVyO1xuZXhwb3J0cy5XaW5kb3dTY3JvbGxDb250cm9sbGVyID0gaW50ZXJuYWxDb21tb24uV2luZG93U2Nyb2xsQ29udHJvbGxlcjtcbmV4cG9ydHMuYWRkRGF5cyA9IGludGVybmFsQ29tbW9uLmFkZERheXM7XG5leHBvcnRzLmFkZER1cmF0aW9ucyA9IGludGVybmFsQ29tbW9uLmFkZER1cmF0aW9ucztcbmV4cG9ydHMuYWRkTXMgPSBpbnRlcm5hbENvbW1vbi5hZGRNcztcbmV4cG9ydHMuYWRkV2Vla3MgPSBpbnRlcm5hbENvbW1vbi5hZGRXZWVrcztcbmV4cG9ydHMuYWxsb3dDb250ZXh0TWVudSA9IGludGVybmFsQ29tbW9uLmFsbG93Q29udGV4dE1lbnU7XG5leHBvcnRzLmFsbG93U2VsZWN0aW9uID0gaW50ZXJuYWxDb21tb24uYWxsb3dTZWxlY3Rpb247XG5leHBvcnRzLmFwcGx5TXV0YXRpb25Ub0V2ZW50U3RvcmUgPSBpbnRlcm5hbENvbW1vbi5hcHBseU11dGF0aW9uVG9FdmVudFN0b3JlO1xuZXhwb3J0cy5hcHBseVN0eWxlID0gaW50ZXJuYWxDb21tb24uYXBwbHlTdHlsZTtcbmV4cG9ydHMuYXNDbGVhbkRheXMgPSBpbnRlcm5hbENvbW1vbi5hc0NsZWFuRGF5cztcbmV4cG9ydHMuYXNSb3VnaE1pbnV0ZXMgPSBpbnRlcm5hbENvbW1vbi5hc1JvdWdoTWludXRlcztcbmV4cG9ydHMuYXNSb3VnaE1zID0gaW50ZXJuYWxDb21tb24uYXNSb3VnaE1zO1xuZXhwb3J0cy5hc1JvdWdoU2Vjb25kcyA9IGludGVybmFsQ29tbW9uLmFzUm91Z2hTZWNvbmRzO1xuZXhwb3J0cy5iaW5hcnlTZWFyY2ggPSBpbnRlcm5hbENvbW1vbi5iaW5hcnlTZWFyY2g7XG5leHBvcnRzLmJ1aWxkRWxBdHRycyA9IGludGVybmFsQ29tbW9uLmJ1aWxkRWxBdHRycztcbmV4cG9ydHMuYnVpbGRFbnRyeUtleSA9IGludGVybmFsQ29tbW9uLmJ1aWxkRW50cnlLZXk7XG5leHBvcnRzLmJ1aWxkRXZlbnRBcGlzID0gaW50ZXJuYWxDb21tb24uYnVpbGRFdmVudEFwaXM7XG5leHBvcnRzLmJ1aWxkRXZlbnRSYW5nZUtleSA9IGludGVybmFsQ29tbW9uLmJ1aWxkRXZlbnRSYW5nZUtleTtcbmV4cG9ydHMuYnVpbGRJc29TdHJpbmcgPSBpbnRlcm5hbENvbW1vbi5idWlsZElzb1N0cmluZztcbmV4cG9ydHMuYnVpbGROYXZMaW5rQXR0cnMgPSBpbnRlcm5hbENvbW1vbi5idWlsZE5hdkxpbmtBdHRycztcbmV4cG9ydHMuYnVpbGRTZWdUaW1lVGV4dCA9IGludGVybmFsQ29tbW9uLmJ1aWxkU2VnVGltZVRleHQ7XG5leHBvcnRzLmNvbGxlY3RGcm9tSGFzaCA9IGludGVybmFsQ29tbW9uLmNvbGxlY3RGcm9tSGFzaDtcbmV4cG9ydHMuY29tYmluZUV2ZW50VWlzID0gaW50ZXJuYWxDb21tb24uY29tYmluZUV2ZW50VWlzO1xuZXhwb3J0cy5jb21wYXJlQnlGaWVsZFNwZWNzID0gaW50ZXJuYWxDb21tb24uY29tcGFyZUJ5RmllbGRTcGVjcztcbmV4cG9ydHMuY29tcGFyZU51bWJlcnMgPSBpbnRlcm5hbENvbW1vbi5jb21wYXJlTnVtYmVycztcbmV4cG9ydHMuY29tcGFyZU9ianMgPSBpbnRlcm5hbENvbW1vbi5jb21wYXJlT2JqcztcbmV4cG9ydHMuY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQgPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlRWFybGllc3RTZWdTdGFydDtcbmV4cG9ydHMuY29tcHV0ZUVkZ2VzID0gaW50ZXJuYWxDb21tb24uY29tcHV0ZUVkZ2VzO1xuZXhwb3J0cy5jb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQgPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQ7XG5leHBvcnRzLmNvbXB1dGVJbm5lclJlY3QgPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlSW5uZXJSZWN0O1xuZXhwb3J0cy5jb21wdXRlUmVjdCA9IGludGVybmFsQ29tbW9uLmNvbXB1dGVSZWN0O1xuZXhwb3J0cy5jb21wdXRlU2hyaW5rV2lkdGggPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlU2hyaW5rV2lkdGg7XG5leHBvcnRzLmNvbXB1dGVWaXNpYmxlRGF5UmFuZ2UgPSBpbnRlcm5hbENvbW1vbi5jb21wdXRlVmlzaWJsZURheVJhbmdlO1xuZXhwb3J0cy5jb25maWcgPSBpbnRlcm5hbENvbW1vbi5jb25maWc7XG5leHBvcnRzLmNvbnN0cmFpblBvaW50ID0gaW50ZXJuYWxDb21tb24uY29uc3RyYWluUG9pbnQ7XG5leHBvcnRzLmNyZWF0ZUR1cmF0aW9uID0gaW50ZXJuYWxDb21tb24uY3JlYXRlRHVyYXRpb247XG5leHBvcnRzLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSA9IGludGVybmFsQ29tbW9uLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZTtcbmV4cG9ydHMuY3JlYXRlRXZlbnRJbnN0YW5jZSA9IGludGVybmFsQ29tbW9uLmNyZWF0ZUV2ZW50SW5zdGFuY2U7XG5leHBvcnRzLmNyZWF0ZUV2ZW50VWkgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVFdmVudFVpO1xuZXhwb3J0cy5jcmVhdGVGb3JtYXR0ZXIgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVGb3JtYXR0ZXI7XG5leHBvcnRzLmRpZmZEYXRlcyA9IGludGVybmFsQ29tbW9uLmRpZmZEYXRlcztcbmV4cG9ydHMuZGlmZkRheUFuZFRpbWUgPSBpbnRlcm5hbENvbW1vbi5kaWZmRGF5QW5kVGltZTtcbmV4cG9ydHMuZGlmZkRheXMgPSBpbnRlcm5hbENvbW1vbi5kaWZmRGF5cztcbmV4cG9ydHMuZGlmZlBvaW50cyA9IGludGVybmFsQ29tbW9uLmRpZmZQb2ludHM7XG5leHBvcnRzLmRpZmZXZWVrcyA9IGludGVybmFsQ29tbW9uLmRpZmZXZWVrcztcbmV4cG9ydHMuZGlmZldob2xlRGF5cyA9IGludGVybmFsQ29tbW9uLmRpZmZXaG9sZURheXM7XG5leHBvcnRzLmRpZmZXaG9sZVdlZWtzID0gaW50ZXJuYWxDb21tb24uZGlmZldob2xlV2Vla3M7XG5leHBvcnRzLmRpc2FibGVDdXJzb3IgPSBpbnRlcm5hbENvbW1vbi5kaXNhYmxlQ3Vyc29yO1xuZXhwb3J0cy5lbGVtZW50Q2xvc2VzdCA9IGludGVybmFsQ29tbW9uLmVsZW1lbnRDbG9zZXN0O1xuZXhwb3J0cy5lbGVtZW50TWF0Y2hlcyA9IGludGVybmFsQ29tbW9uLmVsZW1lbnRNYXRjaGVzO1xuZXhwb3J0cy5lbmFibGVDdXJzb3IgPSBpbnRlcm5hbENvbW1vbi5lbmFibGVDdXJzb3I7XG5leHBvcnRzLmV2ZW50VHVwbGVUb1N0b3JlID0gaW50ZXJuYWxDb21tb24uZXZlbnRUdXBsZVRvU3RvcmU7XG5leHBvcnRzLmZpbHRlckhhc2ggPSBpbnRlcm5hbENvbW1vbi5maWx0ZXJIYXNoO1xuZXhwb3J0cy5maW5kRGlyZWN0Q2hpbGRyZW4gPSBpbnRlcm5hbENvbW1vbi5maW5kRGlyZWN0Q2hpbGRyZW47XG5leHBvcnRzLmZpbmRFbGVtZW50cyA9IGludGVybmFsQ29tbW9uLmZpbmRFbGVtZW50cztcbmV4cG9ydHMuZmxleGlibGVDb21wYXJlID0gaW50ZXJuYWxDb21tb24uZmxleGlibGVDb21wYXJlO1xuZXhwb3J0cy5mb3JtYXREYXlTdHJpbmcgPSBpbnRlcm5hbENvbW1vbi5mb3JtYXREYXlTdHJpbmc7XG5leHBvcnRzLmZvcm1hdElzb01vbnRoU3RyID0gaW50ZXJuYWxDb21tb24uZm9ybWF0SXNvTW9udGhTdHI7XG5leHBvcnRzLmZvcm1hdElzb1RpbWVTdHJpbmcgPSBpbnRlcm5hbENvbW1vbi5mb3JtYXRJc29UaW1lU3RyaW5nO1xuZXhwb3J0cy5nZXRBbGxvd1lTY3JvbGxpbmcgPSBpbnRlcm5hbENvbW1vbi5nZXRBbGxvd1lTY3JvbGxpbmc7XG5leHBvcnRzLmdldENhblZHcm93V2l0aGluQ2VsbCA9IGludGVybmFsQ29tbW9uLmdldENhblZHcm93V2l0aGluQ2VsbDtcbmV4cG9ydHMuZ2V0Q2xpcHBpbmdQYXJlbnRzID0gaW50ZXJuYWxDb21tb24uZ2V0Q2xpcHBpbmdQYXJlbnRzO1xuZXhwb3J0cy5nZXREYXRlTWV0YSA9IGludGVybmFsQ29tbW9uLmdldERhdGVNZXRhO1xuZXhwb3J0cy5nZXREYXlDbGFzc05hbWVzID0gaW50ZXJuYWxDb21tb24uZ2V0RGF5Q2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0RGVmYXVsdEV2ZW50RW5kID0gaW50ZXJuYWxDb21tb24uZ2V0RGVmYXVsdEV2ZW50RW5kO1xuZXhwb3J0cy5nZXRFbFNlZyA9IGludGVybmFsQ29tbW9uLmdldEVsU2VnO1xuZXhwb3J0cy5nZXRFbnRyeVNwYW5FbmQgPSBpbnRlcm5hbENvbW1vbi5nZXRFbnRyeVNwYW5FbmQ7XG5leHBvcnRzLmdldEV2ZW50VGFyZ2V0VmlhUm9vdCA9IGludGVybmFsQ29tbW9uLmdldEV2ZW50VGFyZ2V0VmlhUm9vdDtcbmV4cG9ydHMuZ2V0SXNSdGxTY3JvbGxiYXJPbkxlZnQgPSBpbnRlcm5hbENvbW1vbi5nZXRJc1J0bFNjcm9sbGJhck9uTGVmdDtcbmV4cG9ydHMuZ2V0UmVjdENlbnRlciA9IGludGVybmFsQ29tbW9uLmdldFJlY3RDZW50ZXI7XG5leHBvcnRzLmdldFJlbGV2YW50RXZlbnRzID0gaW50ZXJuYWxDb21tb24uZ2V0UmVsZXZhbnRFdmVudHM7XG5leHBvcnRzLmdldFNjcm9sbEdyaWRDbGFzc05hbWVzID0gaW50ZXJuYWxDb21tb24uZ2V0U2Nyb2xsR3JpZENsYXNzTmFtZXM7XG5leHBvcnRzLmdldFNjcm9sbGJhcldpZHRocyA9IGludGVybmFsQ29tbW9uLmdldFNjcm9sbGJhcldpZHRocztcbmV4cG9ydHMuZ2V0U2VjdGlvbkNsYXNzTmFtZXMgPSBpbnRlcm5hbENvbW1vbi5nZXRTZWN0aW9uQ2xhc3NOYW1lcztcbmV4cG9ydHMuZ2V0U2VjdGlvbkhhc0xpcXVpZEhlaWdodCA9IGludGVybmFsQ29tbW9uLmdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQ7XG5leHBvcnRzLmdldFNlZ0FuY2hvckF0dHJzID0gaW50ZXJuYWxDb21tb24uZ2V0U2VnQW5jaG9yQXR0cnM7XG5leHBvcnRzLmdldFNlZ01ldGEgPSBpbnRlcm5hbENvbW1vbi5nZXRTZWdNZXRhO1xuZXhwb3J0cy5nZXRTbG90Q2xhc3NOYW1lcyA9IGludGVybmFsQ29tbW9uLmdldFNsb3RDbGFzc05hbWVzO1xuZXhwb3J0cy5nZXRTdGlja3lGb290ZXJTY3JvbGxiYXIgPSBpbnRlcm5hbENvbW1vbi5nZXRTdGlja3lGb290ZXJTY3JvbGxiYXI7XG5leHBvcnRzLmdldFN0aWNreUhlYWRlckRhdGVzID0gaW50ZXJuYWxDb21tb24uZ2V0U3RpY2t5SGVhZGVyRGF0ZXM7XG5leHBvcnRzLmdldFVuaXF1ZURvbUlkID0gaW50ZXJuYWxDb21tb24uZ2V0VW5pcXVlRG9tSWQ7XG5leHBvcnRzLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvciA9IGludGVybmFsQ29tbW9uLmdyZWF0ZXN0RHVyYXRpb25EZW5vbWluYXRvcjtcbmV4cG9ydHMuZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzID0gaW50ZXJuYWxDb21tb24uZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzO1xuZXhwb3J0cy5ndWlkID0gaW50ZXJuYWxDb21tb24uZ3VpZDtcbmV4cG9ydHMuaGFzQmdSZW5kZXJpbmcgPSBpbnRlcm5hbENvbW1vbi5oYXNCZ1JlbmRlcmluZztcbmV4cG9ydHMuaGFzQ3VzdG9tRGF5Q2VsbENvbnRlbnQgPSBpbnRlcm5hbENvbW1vbi5oYXNDdXN0b21EYXlDZWxsQ29udGVudDtcbmV4cG9ydHMuaGFzU2hyaW5rV2lkdGggPSBpbnRlcm5hbENvbW1vbi5oYXNTaHJpbmtXaWR0aDtcbmV4cG9ydHMuaWRlbnRpdHkgPSBpbnRlcm5hbENvbW1vbi5pZGVudGl0eTtcbmV4cG9ydHMuaW5qZWN0U3R5bGVzID0gaW50ZXJuYWxDb21tb24uaW5qZWN0U3R5bGVzO1xuZXhwb3J0cy5pbnRlcmFjdGlvblNldHRpbmdzU3RvcmUgPSBpbnRlcm5hbENvbW1vbi5pbnRlcmFjdGlvblNldHRpbmdzU3RvcmU7XG5leHBvcnRzLmludGVyYWN0aW9uU2V0dGluZ3NUb1N0b3JlID0gaW50ZXJuYWxDb21tb24uaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmU7XG5leHBvcnRzLmludGVyc2VjdFJhbmdlcyA9IGludGVybmFsQ29tbW9uLmludGVyc2VjdFJhbmdlcztcbmV4cG9ydHMuaW50ZXJzZWN0UmVjdHMgPSBpbnRlcm5hbENvbW1vbi5pbnRlcnNlY3RSZWN0cztcbmV4cG9ydHMuaW50ZXJzZWN0U3BhbnMgPSBpbnRlcm5hbENvbW1vbi5pbnRlcnNlY3RTcGFucztcbmV4cG9ydHMuaXNBcnJheXNFcXVhbCA9IGludGVybmFsQ29tbW9uLmlzQXJyYXlzRXF1YWw7XG5leHBvcnRzLmlzQ29sUHJvcHNFcXVhbCA9IGludGVybmFsQ29tbW9uLmlzQ29sUHJvcHNFcXVhbDtcbmV4cG9ydHMuaXNEYXRlU2VsZWN0aW9uVmFsaWQgPSBpbnRlcm5hbENvbW1vbi5pc0RhdGVTZWxlY3Rpb25WYWxpZDtcbmV4cG9ydHMuaXNEYXRlU3BhbnNFcXVhbCA9IGludGVybmFsQ29tbW9uLmlzRGF0ZVNwYW5zRXF1YWw7XG5leHBvcnRzLmlzSW50ID0gaW50ZXJuYWxDb21tb24uaXNJbnQ7XG5leHBvcnRzLmlzSW50ZXJhY3Rpb25WYWxpZCA9IGludGVybmFsQ29tbW9uLmlzSW50ZXJhY3Rpb25WYWxpZDtcbmV4cG9ydHMuaXNNdWx0aURheVJhbmdlID0gaW50ZXJuYWxDb21tb24uaXNNdWx0aURheVJhbmdlO1xuZXhwb3J0cy5pc1Byb3BzRXF1YWwgPSBpbnRlcm5hbENvbW1vbi5pc1Byb3BzRXF1YWw7XG5leHBvcnRzLmlzUHJvcHNWYWxpZCA9IGludGVybmFsQ29tbW9uLmlzUHJvcHNWYWxpZDtcbmV4cG9ydHMuaXNWYWxpZERhdGUgPSBpbnRlcm5hbENvbW1vbi5pc1ZhbGlkRGF0ZTtcbmV4cG9ydHMubWFwSGFzaCA9IGludGVybmFsQ29tbW9uLm1hcEhhc2g7XG5leHBvcnRzLm1lbW9pemUgPSBpbnRlcm5hbENvbW1vbi5tZW1vaXplO1xuZXhwb3J0cy5tZW1vaXplQXJyYXlsaWtlID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZUFycmF5bGlrZTtcbmV4cG9ydHMubWVtb2l6ZUhhc2hsaWtlID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZUhhc2hsaWtlO1xuZXhwb3J0cy5tZW1vaXplT2JqQXJnID0gaW50ZXJuYWxDb21tb24ubWVtb2l6ZU9iakFyZztcbmV4cG9ydHMubWVyZ2VFdmVudFN0b3JlcyA9IGludGVybmFsQ29tbW9uLm1lcmdlRXZlbnRTdG9yZXM7XG5leHBvcnRzLm11bHRpcGx5RHVyYXRpb24gPSBpbnRlcm5hbENvbW1vbi5tdWx0aXBseUR1cmF0aW9uO1xuZXhwb3J0cy5wYWRTdGFydCA9IGludGVybmFsQ29tbW9uLnBhZFN0YXJ0O1xuZXhwb3J0cy5wYXJzZUJ1c2luZXNzSG91cnMgPSBpbnRlcm5hbENvbW1vbi5wYXJzZUJ1c2luZXNzSG91cnM7XG5leHBvcnRzLnBhcnNlQ2xhc3NOYW1lcyA9IGludGVybmFsQ29tbW9uLnBhcnNlQ2xhc3NOYW1lcztcbmV4cG9ydHMucGFyc2VEcmFnTWV0YSA9IGludGVybmFsQ29tbW9uLnBhcnNlRHJhZ01ldGE7XG5leHBvcnRzLnBhcnNlRXZlbnREZWYgPSBpbnRlcm5hbENvbW1vbi5wYXJzZUV2ZW50RGVmO1xuZXhwb3J0cy5wYXJzZUZpZWxkU3BlY3MgPSBpbnRlcm5hbENvbW1vbi5wYXJzZUZpZWxkU3BlY3M7XG5leHBvcnRzLnBhcnNlTWFya2VyID0gaW50ZXJuYWxDb21tb24ucGFyc2U7XG5leHBvcnRzLnBvaW50SW5zaWRlUmVjdCA9IGludGVybmFsQ29tbW9uLnBvaW50SW5zaWRlUmVjdDtcbmV4cG9ydHMucHJldmVudENvbnRleHRNZW51ID0gaW50ZXJuYWxDb21tb24ucHJldmVudENvbnRleHRNZW51O1xuZXhwb3J0cy5wcmV2ZW50RGVmYXVsdCA9IGludGVybmFsQ29tbW9uLnByZXZlbnREZWZhdWx0O1xuZXhwb3J0cy5wcmV2ZW50U2VsZWN0aW9uID0gaW50ZXJuYWxDb21tb24ucHJldmVudFNlbGVjdGlvbjtcbmV4cG9ydHMucmFuZ2VDb250YWluc01hcmtlciA9IGludGVybmFsQ29tbW9uLnJhbmdlQ29udGFpbnNNYXJrZXI7XG5leHBvcnRzLnJhbmdlQ29udGFpbnNSYW5nZSA9IGludGVybmFsQ29tbW9uLnJhbmdlQ29udGFpbnNSYW5nZTtcbmV4cG9ydHMucmFuZ2VzRXF1YWwgPSBpbnRlcm5hbENvbW1vbi5yYW5nZXNFcXVhbDtcbmV4cG9ydHMucmFuZ2VzSW50ZXJzZWN0ID0gaW50ZXJuYWxDb21tb24ucmFuZ2VzSW50ZXJzZWN0O1xuZXhwb3J0cy5yZWZpbmVFdmVudERlZiA9IGludGVybmFsQ29tbW9uLnJlZmluZUV2ZW50RGVmO1xuZXhwb3J0cy5yZWZpbmVQcm9wcyA9IGludGVybmFsQ29tbW9uLnJlZmluZVByb3BzO1xuZXhwb3J0cy5yZW1vdmVFbGVtZW50ID0gaW50ZXJuYWxDb21tb24ucmVtb3ZlRWxlbWVudDtcbmV4cG9ydHMucmVtb3ZlRXhhY3QgPSBpbnRlcm5hbENvbW1vbi5yZW1vdmVFeGFjdDtcbmV4cG9ydHMucmVuZGVyQ2h1bmtDb250ZW50ID0gaW50ZXJuYWxDb21tb24ucmVuZGVyQ2h1bmtDb250ZW50O1xuZXhwb3J0cy5yZW5kZXJGaWxsID0gaW50ZXJuYWxDb21tb24ucmVuZGVyRmlsbDtcbmV4cG9ydHMucmVuZGVyTWljcm9Db2xHcm91cCA9IGludGVybmFsQ29tbW9uLnJlbmRlck1pY3JvQ29sR3JvdXA7XG5leHBvcnRzLnJlbmRlclNjcm9sbFNoaW0gPSBpbnRlcm5hbENvbW1vbi5yZW5kZXJTY3JvbGxTaGltO1xuZXhwb3J0cy5yZXF1ZXN0SnNvbiA9IGludGVybmFsQ29tbW9uLnJlcXVlc3RKc29uO1xuZXhwb3J0cy5zYW5pdGl6ZVNocmlua1dpZHRoID0gaW50ZXJuYWxDb21tb24uc2FuaXRpemVTaHJpbmtXaWR0aDtcbmV4cG9ydHMuc2V0UmVmID0gaW50ZXJuYWxDb21tb24uc2V0UmVmO1xuZXhwb3J0cy5zbGljZUV2ZW50U3RvcmUgPSBpbnRlcm5hbENvbW1vbi5zbGljZUV2ZW50U3RvcmU7XG5leHBvcnRzLnNvcnRFdmVudFNlZ3MgPSBpbnRlcm5hbENvbW1vbi5zb3J0RXZlbnRTZWdzO1xuZXhwb3J0cy5zdGFydE9mRGF5ID0gaW50ZXJuYWxDb21tb24uc3RhcnRPZkRheTtcbmV4cG9ydHMudHJhbnNsYXRlUmVjdCA9IGludGVybmFsQ29tbW9uLnRyYW5zbGF0ZVJlY3Q7XG5leHBvcnRzLnRyaWdnZXJEYXRlU2VsZWN0ID0gaW50ZXJuYWxDb21tb24udHJpZ2dlckRhdGVTZWxlY3Q7XG5leHBvcnRzLnVucHJvbWlzaWZ5ID0gaW50ZXJuYWxDb21tb24udW5wcm9taXNpZnk7XG5leHBvcnRzLndoZW5UcmFuc2l0aW9uRG9uZSA9IGludGVybmFsQ29tbW9uLndoZW5UcmFuc2l0aW9uRG9uZTtcbmV4cG9ydHMud2hvbGVEaXZpZGVEdXJhdGlvbnMgPSBpbnRlcm5hbENvbW1vbi53aG9sZURpdmlkZUR1cmF0aW9ucztcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIHByZWFjdCA9IHJlcXVpcmUoJ3ByZWFjdCcpO1xudmFyIGNvbXBhdCA9IHJlcXVpcmUoJ3ByZWFjdC9jb21wYXQnKTtcbnZhciBpbnRlcm5hbENvbW1vbiA9IHJlcXVpcmUoJy4vaW50ZXJuYWwtY29tbW9uLmNqcycpO1xuXG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdjcmVhdGVQb3J0YWwnLCB7XG5cdGVudW1lcmFibGU6IHRydWUsXG5cdGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tcGF0LmNyZWF0ZVBvcnRhbDsgfVxufSk7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBpbnRlcm5hbENvbW1vbi5jcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5mbHVzaFN5bmMgPSBpbnRlcm5hbENvbW1vbi5mbHVzaFN5bmM7XG5PYmplY3Qua2V5cyhwcmVhY3QpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcblx0aWYgKGsgIT09ICdkZWZhdWx0JyAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShrKSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGssIHtcblx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJlYWN0W2tdOyB9XG5cdH0pO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBpbmRleF9janMgPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvcmUvaW5kZXguY2pzJyk7XG52YXIgaW50ZXJuYWxDb21tb24gPSByZXF1aXJlKCcuL2ludGVybmFsLmNqcycpO1xucmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL2ludGVybmFsLmNqcycpO1xucmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL3ByZWFjdC5janMnKTtcblxudmFyIGluZGV4ID0gaW5kZXhfY2pzLmNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ0BmdWxsY2FsZW5kYXIvZGF5Z3JpZCcsXG4gICAgaW5pdGlhbFZpZXc6ICdkYXlHcmlkTW9udGgnLFxuICAgIHZpZXdzOiB7XG4gICAgICAgIGRheUdyaWQ6IHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogaW50ZXJuYWxDb21tb24uRGF5R3JpZFZpZXcsXG4gICAgICAgICAgICBkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzOiBpbnRlcm5hbENvbW1vbi5UYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yLFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkRGF5OiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyBkYXlzOiAxIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGRheUdyaWRXZWVrOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyB3ZWVrczogMSB9LFxuICAgICAgICB9LFxuICAgICAgICBkYXlHcmlkTW9udGg6IHtcbiAgICAgICAgICAgIHR5cGU6ICdkYXlHcmlkJyxcbiAgICAgICAgICAgIGR1cmF0aW9uOiB7IG1vbnRoczogMSB9LFxuICAgICAgICAgICAgZml4ZWRXZWVrQ291bnQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGRheUdyaWRZZWFyOiB7XG4gICAgICAgICAgICB0eXBlOiAnZGF5R3JpZCcsXG4gICAgICAgICAgICBkdXJhdGlvbjogeyB5ZWFyczogMSB9LFxuICAgICAgICB9LFxuICAgIH0sXG59KTtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBpbmRleDtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxudmFyIGludGVybmFsX2NqcyA9IHJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9pbnRlcm5hbC5janMnKTtcbnZhciBwcmVhY3RfY2pzID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL3ByZWFjdC5janMnKTtcblxudmFyIGNzc18yNDh6ID0gXCI6cm9vdHstLWZjLWRheWdyaWQtZXZlbnQtZG90LXdpZHRoOjhweH0uZmMtZGF5Z3JpZC1kYXktZXZlbnRzOmFmdGVyLC5mYy1kYXlncmlkLWRheS1ldmVudHM6YmVmb3JlLC5mYy1kYXlncmlkLWRheS1mcmFtZTphZnRlciwuZmMtZGF5Z3JpZC1kYXktZnJhbWU6YmVmb3JlLC5mYy1kYXlncmlkLWV2ZW50LWhhcm5lc3M6YWZ0ZXIsLmZjLWRheWdyaWQtZXZlbnQtaGFybmVzczpiZWZvcmV7Y2xlYXI6Ym90aDtjb250ZW50OlxcXCJcXFwiO2Rpc3BsYXk6dGFibGV9LmZjIC5mYy1kYXlncmlkLWJvZHl7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxfS5mYyAuZmMtZGF5Z3JpZC1kYXkuZmMtZGF5LXRvZGF5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tZmMtdG9kYXktYmctY29sb3IpfS5mYyAuZmMtZGF5Z3JpZC1kYXktZnJhbWV7bWluLWhlaWdodDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYyAuZmMtZGF5Z3JpZC1kYXktdG9we2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0uZmMgLmZjLWRheS1vdGhlciAuZmMtZGF5Z3JpZC1kYXktdG9we29wYWNpdHk6LjN9LmZjIC5mYy1kYXlncmlkLWRheS1udW1iZXJ7cGFkZGluZzo0cHg7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDo0fS5mYyAuZmMtZGF5Z3JpZC1tb250aC1zdGFydHtmb250LXNpemU6MS4xZW07Zm9udC13ZWlnaHQ6NzAwfS5mYyAuZmMtZGF5Z3JpZC1kYXktZXZlbnRze21hcmdpbi10b3A6MXB4fS5mYyAuZmMtZGF5Z3JpZC1ib2R5LWJhbGFuY2VkIC5mYy1kYXlncmlkLWRheS1ldmVudHN7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjB9LmZjIC5mYy1kYXlncmlkLWJvZHktdW5iYWxhbmNlZCAuZmMtZGF5Z3JpZC1kYXktZXZlbnRze21pbi1oZWlnaHQ6MmVtO3Bvc2l0aW9uOnJlbGF0aXZlfS5mYyAuZmMtZGF5Z3JpZC1ib2R5LW5hdHVyYWwgLmZjLWRheWdyaWQtZGF5LWV2ZW50c3ttYXJnaW4tYm90dG9tOjFlbX0uZmMgLmZjLWRheWdyaWQtZXZlbnQtaGFybmVzc3twb3NpdGlvbjpyZWxhdGl2ZX0uZmMgLmZjLWRheWdyaWQtZXZlbnQtaGFybmVzcy1hYnN7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9LmZjIC5mYy1kYXlncmlkLWJnLWhhcm5lc3N7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjB9LmZjIC5mYy1kYXlncmlkLWRheS1iZyAuZmMtbm9uLWJ1c2luZXNze3otaW5kZXg6MX0uZmMgLmZjLWRheWdyaWQtZGF5LWJnIC5mYy1iZy1ldmVudHt6LWluZGV4OjJ9LmZjIC5mYy1kYXlncmlkLWRheS1iZyAuZmMtaGlnaGxpZ2h0e3otaW5kZXg6M30uZmMgLmZjLWRheWdyaWQtZXZlbnR7bWFyZ2luLXRvcDoxcHg7ei1pbmRleDo2fS5mYyAuZmMtZGF5Z3JpZC1ldmVudC5mYy1ldmVudC1taXJyb3J7ei1pbmRleDo3fS5mYyAuZmMtZGF5Z3JpZC1kYXktYm90dG9te2ZvbnQtc2l6ZTouODVlbTttYXJnaW46MCAycHh9LmZjIC5mYy1kYXlncmlkLWRheS1ib3R0b206YWZ0ZXIsLmZjIC5mYy1kYXlncmlkLWRheS1ib3R0b206YmVmb3Jle2NsZWFyOmJvdGg7Y29udGVudDpcXFwiXFxcIjtkaXNwbGF5OnRhYmxlfS5mYyAuZmMtZGF5Z3JpZC1tb3JlLWxpbmt7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29yOnBvaW50ZXI7bGluZS1oZWlnaHQ6MTttYXJnaW4tdG9wOjFweDttYXgtd2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzoycHg7cG9zaXRpb246cmVsYXRpdmU7d2hpdGUtc3BhY2U6bm93cmFwO3otaW5kZXg6NH0uZmMgLmZjLWRheWdyaWQtbW9yZS1saW5rOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9LmZjIC5mYy1kYXlncmlkLXdlZWstbnVtYmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tZmMtbmV1dHJhbC1iZy1jb2xvcik7Y29sb3I6dmFyKC0tZmMtbmV1dHJhbC10ZXh0LWNvbG9yKTttaW4td2lkdGg6MS41ZW07cGFkZGluZzoycHg7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7dG9wOjA7ei1pbmRleDo1fS5mYyAuZmMtbW9yZS1wb3BvdmVyIC5mYy1wb3BvdmVyLWJvZHl7bWluLXdpZHRoOjIyMHB4O3BhZGRpbmc6MTBweH0uZmMtZGlyZWN0aW9uLWx0ciAuZmMtZGF5Z3JpZC1ldmVudC5mYy1ldmVudC1zdGFydCwuZmMtZGlyZWN0aW9uLXJ0bCAuZmMtZGF5Z3JpZC1ldmVudC5mYy1ldmVudC1lbmR7bWFyZ2luLWxlZnQ6MnB4fS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1kYXlncmlkLWV2ZW50LmZjLWV2ZW50LWVuZCwuZmMtZGlyZWN0aW9uLXJ0bCAuZmMtZGF5Z3JpZC1ldmVudC5mYy1ldmVudC1zdGFydHttYXJnaW4tcmlnaHQ6MnB4fS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1kYXlncmlkLW1vcmUtbGlua3tmbG9hdDpsZWZ0fS5mYy1kaXJlY3Rpb24tbHRyIC5mYy1kYXlncmlkLXdlZWstbnVtYmVye2JvcmRlci1yYWRpdXM6MCAwIDNweCAwO2xlZnQ6MH0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtZGF5Z3JpZC1tb3JlLWxpbmt7ZmxvYXQ6cmlnaHR9LmZjLWRpcmVjdGlvbi1ydGwgLmZjLWRheWdyaWQtd2Vlay1udW1iZXJ7Ym9yZGVyLXJhZGl1czowIDAgMCAzcHg7cmlnaHQ6MH0uZmMtbGlxdWlkLWhhY2sgLmZjLWRheWdyaWQtZGF5LWZyYW1le3Bvc2l0aW9uOnN0YXRpY30uZmMtZGF5Z3JpZC1ldmVudHtib3JkZXItcmFkaXVzOjNweDtmb250LXNpemU6dmFyKC0tZmMtc21hbGwtZm9udC1zaXplKTtwb3NpdGlvbjpyZWxhdGl2ZTt3aGl0ZS1zcGFjZTpub3dyYXB9LmZjLWRheWdyaWQtYmxvY2stZXZlbnQgLmZjLWV2ZW50LXRpbWV7Zm9udC13ZWlnaHQ6NzAwfS5mYy1kYXlncmlkLWJsb2NrLWV2ZW50IC5mYy1ldmVudC10aW1lLC5mYy1kYXlncmlkLWJsb2NrLWV2ZW50IC5mYy1ldmVudC10aXRsZXtwYWRkaW5nOjFweH0uZmMtZGF5Z3JpZC1kb3QtZXZlbnR7YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjJweCAwfS5mYy1kYXlncmlkLWRvdC1ldmVudCAuZmMtZXZlbnQtdGl0bGV7ZmxleC1ncm93OjE7ZmxleC1zaHJpbms6MTtmb250LXdlaWdodDo3MDA7bWluLXdpZHRoOjA7b3ZlcmZsb3c6aGlkZGVufS5mYy1kYXlncmlkLWRvdC1ldmVudC5mYy1ldmVudC1taXJyb3IsLmZjLWRheWdyaWQtZG90LWV2ZW50OmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMSl9LmZjLWRheWdyaWQtZG90LWV2ZW50LmZjLWV2ZW50LXNlbGVjdGVkOmJlZm9yZXtib3R0b206LTEwcHg7dG9wOi0xMHB4fS5mYy1kYXlncmlkLWV2ZW50LWRvdHtib3JkZXI6Y2FsYyh2YXIoLS1mYy1kYXlncmlkLWV2ZW50LWRvdC13aWR0aCkvMikgc29saWQgdmFyKC0tZmMtZXZlbnQtYm9yZGVyLWNvbG9yKTtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tZmMtZGF5Z3JpZC1ldmVudC1kb3Qtd2lkdGgpLzIpO2JveC1zaXppbmc6Y29udGVudC1ib3g7aGVpZ2h0OjA7bWFyZ2luOjAgNHB4O3dpZHRoOjB9LmZjLWRpcmVjdGlvbi1sdHIgLmZjLWRheWdyaWQtZXZlbnQgLmZjLWV2ZW50LXRpbWV7bWFyZ2luLXJpZ2h0OjNweH0uZmMtZGlyZWN0aW9uLXJ0bCAuZmMtZGF5Z3JpZC1ldmVudCAuZmMtZXZlbnQtdGltZXttYXJnaW4tbGVmdDozcHh9XCI7XG5pbnRlcm5hbF9janMuaW5qZWN0U3R5bGVzKGNzc18yNDh6KTtcblxuZnVuY3Rpb24gc3BsaXRTZWdzQnlSb3coc2Vncywgcm93Q250KSB7XG4gICAgbGV0IGJ5Um93ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICBieVJvd1tpXSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKGxldCBzZWcgb2Ygc2Vncykge1xuICAgICAgICBieVJvd1tzZWcucm93XS5wdXNoKHNlZyk7XG4gICAgfVxuICAgIHJldHVybiBieVJvdztcbn1cbmZ1bmN0aW9uIHNwbGl0U2Vnc0J5Rmlyc3RDb2woc2VncywgY29sQ250KSB7XG4gICAgbGV0IGJ5Q29sID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xDbnQ7IGkgKz0gMSkge1xuICAgICAgICBieUNvbFtpXSA9IFtdO1xuICAgIH1cbiAgICBmb3IgKGxldCBzZWcgb2Ygc2Vncykge1xuICAgICAgICBieUNvbFtzZWcuZmlyc3RDb2xdLnB1c2goc2VnKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5Q29sO1xufVxuZnVuY3Rpb24gc3BsaXRJbnRlcmFjdGlvbkJ5Um93KHVpLCByb3dDbnQpIHtcbiAgICBsZXQgYnlSb3cgPSBbXTtcbiAgICBpZiAoIXVpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q250OyBpICs9IDEpIHtcbiAgICAgICAgICAgIGJ5Um93W2ldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dDbnQ7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnlSb3dbaV0gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRJbnN0YW5jZXM6IHVpLmFmZmVjdGVkSW5zdGFuY2VzLFxuICAgICAgICAgICAgICAgIGlzRXZlbnQ6IHVpLmlzRXZlbnQsXG4gICAgICAgICAgICAgICAgc2VnczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IHNlZyBvZiB1aS5zZWdzKSB7XG4gICAgICAgICAgICBieVJvd1tzZWcucm93XS5zZWdzLnB1c2goc2VnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnlSb3c7XG59XG5cbmNvbnN0IERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQgPSBpbnRlcm5hbF9janMuY3JlYXRlRm9ybWF0dGVyKHtcbiAgICBob3VyOiAnbnVtZXJpYycsXG4gICAgbWludXRlOiAnMi1kaWdpdCcsXG4gICAgb21pdFplcm9NaW51dGU6IHRydWUsXG4gICAgbWVyaWRpZW06ICduYXJyb3cnLFxufSk7XG5mdW5jdGlvbiBoYXNMaXN0SXRlbURpc3BsYXkoc2VnKSB7XG4gICAgbGV0IHsgZGlzcGxheSB9ID0gc2VnLmV2ZW50UmFuZ2UudWk7XG4gICAgcmV0dXJuIGRpc3BsYXkgPT09ICdsaXN0LWl0ZW0nIHx8IChkaXNwbGF5ID09PSAnYXV0bycgJiZcbiAgICAgICAgIXNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXkgJiZcbiAgICAgICAgc2VnLmZpcnN0Q29sID09PSBzZWcubGFzdENvbCAmJiAvLyBjYW4ndCBiZSBtdWx0aS1kYXlcbiAgICAgICAgc2VnLmlzU3RhcnQgJiYgLy8gXCJcbiAgICAgICAgc2VnLmlzRW5kIC8vIFwiXG4gICAgKTtcbn1cblxuY2xhc3MgVGFibGVCbG9ja0V2ZW50IGV4dGVuZHMgaW50ZXJuYWxfY2pzLkJhc2VDb21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5TdGFuZGFyZEV2ZW50LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgeyBlbENsYXNzZXM6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWJsb2NrLWV2ZW50JywgJ2ZjLWgtZXZlbnQnXSwgZGVmYXVsdFRpbWVGb3JtYXQ6IERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQsIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IHByb3BzLmRlZmF1bHREaXNwbGF5RXZlbnRFbmQsIGRpc2FibGVSZXNpemluZzogIXByb3BzLnNlZy5ldmVudFJhbmdlLmRlZi5hbGxEYXkgfSkpKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlTGlzdEl0ZW1FdmVudCBleHRlbmRzIGludGVybmFsX2Nqcy5CYXNlQ29tcG9uZW50IHtcbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSBjb250ZXh0O1xuICAgICAgICBsZXQgeyBzZWcgfSA9IHByb3BzO1xuICAgICAgICBsZXQgdGltZUZvcm1hdCA9IG9wdGlvbnMuZXZlbnRUaW1lRm9ybWF0IHx8IERFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQ7XG4gICAgICAgIGxldCB0aW1lVGV4dCA9IGludGVybmFsX2Nqcy5idWlsZFNlZ1RpbWVUZXh0KHNlZywgdGltZUZvcm1hdCwgY29udGV4dCwgdHJ1ZSwgcHJvcHMuZGVmYXVsdERpc3BsYXlFdmVudEVuZCk7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5FdmVudENvbnRhaW5lciwgT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHsgZWxUYWc6IFwiYVwiLCBlbENsYXNzZXM6IFsnZmMtZGF5Z3JpZC1ldmVudCcsICdmYy1kYXlncmlkLWRvdC1ldmVudCddLCBlbEF0dHJzOiBpbnRlcm5hbF9janMuZ2V0U2VnQW5jaG9yQXR0cnMocHJvcHMuc2VnLCBjb250ZXh0KSwgZGVmYXVsdEdlbmVyYXRvcjogcmVuZGVySW5uZXJDb250ZW50LCB0aW1lVGV4dDogdGltZVRleHQsIGlzUmVzaXppbmc6IGZhbHNlLCBpc0RhdGVTZWxlY3Rpbmc6IGZhbHNlIH0pKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVuZGVySW5uZXJDb250ZW50KHJlbmRlclByb3BzKSB7XG4gICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZXZlbnQtZG90XCIsIHN0eWxlOiB7IGJvcmRlckNvbG9yOiByZW5kZXJQcm9wcy5ib3JkZXJDb2xvciB8fCByZW5kZXJQcm9wcy5iYWNrZ3JvdW5kQ29sb3IgfSB9KSxcbiAgICAgICAgcmVuZGVyUHJvcHMudGltZVRleHQgJiYgKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1ldmVudC10aW1lXCIgfSwgcmVuZGVyUHJvcHMudGltZVRleHQpKSxcbiAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWV2ZW50LXRpdGxlXCIgfSwgcmVuZGVyUHJvcHMuZXZlbnQudGl0bGUgfHwgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIG51bGwsIFwiXFx1MDBBMFwiKSkpKTtcbn1cblxuY2xhc3MgVGFibGVDZWxsTW9yZUxpbmsgZXh0ZW5kcyBpbnRlcm5hbF9janMuQmFzZUNvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY29tcGlsZVNlZ3MgPSBpbnRlcm5hbF9janMubWVtb2l6ZShjb21waWxlU2Vncyk7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGFsbFNlZ3MsIGludmlzaWJsZVNlZ3MgfSA9IHRoaXMuY29tcGlsZVNlZ3MocHJvcHMuc2luZ2xlUGxhY2VtZW50cyk7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5Nb3JlTGlua0NvbnRhaW5lciwgeyBlbENsYXNzZXM6IFsnZmMtZGF5Z3JpZC1tb3JlLWxpbmsnXSwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlLCBhbGxEYXlEYXRlOiBwcm9wcy5hbGxEYXlEYXRlLCBtb3JlQ250OiBwcm9wcy5tb3JlQ250LCBhbGxTZWdzOiBhbGxTZWdzLCBoaWRkZW5TZWdzOiBpbnZpc2libGVTZWdzLCBhbGlnbm1lbnRFbFJlZjogcHJvcHMuYWxpZ25tZW50RWxSZWYsIGFsaWduR3JpZFRvcDogcHJvcHMuYWxpZ25HcmlkVG9wLCBleHRyYURhdGVTcGFuOiBwcm9wcy5leHRyYURhdGVTcGFuLCBwb3BvdmVyQ29udGVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpc0ZvcmNlZEludmlzaWJsZSA9IChwcm9wcy5ldmVudERyYWcgPyBwcm9wcy5ldmVudERyYWcuYWZmZWN0ZWRJbnN0YW5jZXMgOiBudWxsKSB8fFxuICAgICAgICAgICAgICAgICAgICAocHJvcHMuZXZlbnRSZXNpemUgPyBwcm9wcy5ldmVudFJlc2l6ZS5hZmZlY3RlZEluc3RhbmNlcyA6IG51bGwpIHx8XG4gICAgICAgICAgICAgICAgICAgIHt9O1xuICAgICAgICAgICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIG51bGwsIGFsbFNlZ3MubWFwKChzZWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbmNlSWQgPSBzZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWV2ZW50LWhhcm5lc3NcIiwga2V5OiBpbnN0YW5jZUlkLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IGlzRm9yY2VkSW52aXNpYmxlW2luc3RhbmNlSWRdID8gJ2hpZGRlbicgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gfSwgaGFzTGlzdEl0ZW1EaXNwbGF5KHNlZykgPyAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlTGlzdEl0ZW1FdmVudCwgT2JqZWN0LmFzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gcHJvcHMuZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGZhbHNlIH0sIGludGVybmFsX2Nqcy5nZXRTZWdNZXRhKHNlZywgcHJvcHMudG9kYXlSYW5nZSkpKSkgOiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlQmxvY2tFdmVudCwgT2JqZWN0LmFzc2lnbih7IHNlZzogc2VnLCBpc0RyYWdnaW5nOiBmYWxzZSwgaXNSZXNpemluZzogZmFsc2UsIGlzRGF0ZVNlbGVjdGluZzogZmFsc2UsIGlzU2VsZWN0ZWQ6IGluc3RhbmNlSWQgPT09IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBkZWZhdWx0RGlzcGxheUV2ZW50RW5kOiBmYWxzZSB9LCBpbnRlcm5hbF9janMuZ2V0U2VnTWV0YShzZWcsIHByb3BzLnRvZGF5UmFuZ2UpKSkpKSk7XG4gICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0gfSkpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXBpbGVTZWdzKHNpbmdsZVBsYWNlbWVudHMpIHtcbiAgICBsZXQgYWxsU2VncyA9IFtdO1xuICAgIGxldCBpbnZpc2libGVTZWdzID0gW107XG4gICAgZm9yIChsZXQgcGxhY2VtZW50IG9mIHNpbmdsZVBsYWNlbWVudHMpIHtcbiAgICAgICAgYWxsU2Vncy5wdXNoKHBsYWNlbWVudC5zZWcpO1xuICAgICAgICBpZiAoIXBsYWNlbWVudC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgIGludmlzaWJsZVNlZ3MucHVzaChwbGFjZW1lbnQuc2VnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBhbGxTZWdzLCBpbnZpc2libGVTZWdzIH07XG59XG5cbmNvbnN0IERFRkFVTFRfV0VFS19OVU1fRk9STUFUID0gaW50ZXJuYWxfY2pzLmNyZWF0ZUZvcm1hdHRlcih7IHdlZWs6ICduYXJyb3cnIH0pO1xuY2xhc3MgVGFibGVDZWxsIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkRhdGVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnJvb3RFbFJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBkYXlOdW1iZXJJZDogaW50ZXJuYWxfY2pzLmdldFVuaXF1ZURvbUlkKCksXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUm9vdEVsID0gKGVsKSA9PiB7XG4gICAgICAgICAgICBpbnRlcm5hbF9janMuc2V0UmVmKHRoaXMucm9vdEVsUmVmLCBlbCk7XG4gICAgICAgICAgICBpbnRlcm5hbF9janMuc2V0UmVmKHRoaXMucHJvcHMuZWxSZWYsIGVsKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBjb250ZXh0LCBwcm9wcywgc3RhdGUsIHJvb3RFbFJlZiB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucywgZGF0ZUVudiB9ID0gY29udGV4dDtcbiAgICAgICAgbGV0IHsgZGF0ZSwgZGF0ZVByb2ZpbGUgfSA9IHByb3BzO1xuICAgICAgICAvLyBUT0RPOiBtZW1vaXplIHRoaXM/XG4gICAgICAgIGNvbnN0IGlzTW9udGhTdGFydCA9IHByb3BzLnNob3dEYXlOdW1iZXIgJiZcbiAgICAgICAgICAgIHNob3VsZERpc3BsYXlNb250aFN0YXJ0KGRhdGUsIGRhdGVQcm9maWxlLmN1cnJlbnRSYW5nZSwgZGF0ZUVudik7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5EYXlDZWxsQ29udGFpbmVyLCB7IGVsVGFnOiBcInRkXCIsIGVsUmVmOiB0aGlzLmhhbmRsZVJvb3RFbCwgZWxDbGFzc2VzOiBbXG4gICAgICAgICAgICAgICAgJ2ZjLWRheWdyaWQtZGF5JyxcbiAgICAgICAgICAgICAgICAuLi4ocHJvcHMuZXh0cmFDbGFzc05hbWVzIHx8IFtdKSxcbiAgICAgICAgICAgIF0sIGVsQXR0cnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwcm9wcy5leHRyYURhdGFBdHRycyksIChwcm9wcy5zaG93RGF5TnVtYmVyID8geyAnYXJpYS1sYWJlbGxlZGJ5Jzogc3RhdGUuZGF5TnVtYmVySWQgfSA6IHt9KSksIHsgcm9sZTogJ2dyaWRjZWxsJyB9KSwgZGVmYXVsdEdlbmVyYXRvcjogcmVuZGVyVG9wSW5uZXIsIGRhdGU6IGRhdGUsIGRhdGVQcm9maWxlOiBkYXRlUHJvZmlsZSwgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgc2hvd0RheU51bWJlcjogcHJvcHMuc2hvd0RheU51bWJlciwgaXNNb250aFN0YXJ0OiBpc01vbnRoU3RhcnQsIGV4dHJhUmVuZGVyUHJvcHM6IHByb3BzLmV4dHJhUmVuZGVyUHJvcHMgfSwgKElubmVyQ29udGVudCwgcmVuZGVyUHJvcHMpID0+IChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IHByb3BzLmlubmVyRWxSZWYsIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1mcmFtZSBmYy1zY3JvbGxncmlkLXN5bmMtaW5uZXJcIiwgc3R5bGU6IHsgbWluSGVpZ2h0OiBwcm9wcy5taW5IZWlnaHQgfSB9LFxuICAgICAgICAgICAgcHJvcHMuc2hvd1dlZWtOdW1iZXIgJiYgKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuV2Vla051bWJlckNvbnRhaW5lciwgeyBlbFRhZzogXCJhXCIsIGVsQ2xhc3NlczogWydmYy1kYXlncmlkLXdlZWstbnVtYmVyJ10sIGVsQXR0cnM6IGludGVybmFsX2Nqcy5idWlsZE5hdkxpbmtBdHRycyhjb250ZXh0LCBkYXRlLCAnd2VlaycpLCBkYXRlOiBkYXRlLCBkZWZhdWx0Rm9ybWF0OiBERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCB9KSksXG4gICAgICAgICAgICAhcmVuZGVyUHJvcHMuaXNEaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgIChwcm9wcy5zaG93RGF5TnVtYmVyIHx8IGludGVybmFsX2Nqcy5oYXNDdXN0b21EYXlDZWxsQ29udGVudChvcHRpb25zKSB8fCBwcm9wcy5mb3JjZURheVRvcCkgPyAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZGF5LXRvcFwiIH0sXG4gICAgICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KElubmVyQ29udGVudCwgeyBlbFRhZzogXCJhXCIsIGVsQ2xhc3NlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2ZjLWRheWdyaWQtZGF5LW51bWJlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc01vbnRoU3RhcnQgJiYgJ2ZjLWRheWdyaWQtbW9udGgtc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBdLCBlbEF0dHJzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGludGVybmFsX2Nqcy5idWlsZE5hdkxpbmtBdHRycyhjb250ZXh0LCBkYXRlKSksIHsgaWQ6IHN0YXRlLmRheU51bWJlcklkIH0pIH0pKSkgOiBwcm9wcy5zaG93RGF5TnVtYmVyID8gKFxuICAgICAgICAgICAgLy8gZm9yIGNyZWF0aW5nIGNvcnJlY3QgYW1vdW50IG9mIHNwYWNlIChzZWUgaXNzdWUgIzcxNjIpXG4gICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktdG9wXCIsIHN0eWxlOiB7IHZpc2liaWxpdHk6ICdoaWRkZW4nIH0gfSxcbiAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZGF5LW51bWJlclwiIH0sIFwiXFx1MDBBMFwiKSkpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgY2xhc3NOYW1lOiBcImZjLWRheWdyaWQtZGF5LWV2ZW50c1wiLCByZWY6IHByb3BzLmZnQ29udGVudEVsUmVmIH0sXG4gICAgICAgICAgICAgICAgcHJvcHMuZmdDb250ZW50LFxuICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWRheS1ib3R0b21cIiwgc3R5bGU6IHsgbWFyZ2luVG9wOiBwcm9wcy5tb3JlTWFyZ2luVG9wIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgcHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlQ2VsbE1vcmVMaW5rLCB7IGFsbERheURhdGU6IGRhdGUsIHNpbmdsZVBsYWNlbWVudHM6IHByb3BzLnNpbmdsZVBsYWNlbWVudHMsIG1vcmVDbnQ6IHByb3BzLm1vcmVDbnQsIGFsaWdubWVudEVsUmVmOiByb290RWxSZWYsIGFsaWduR3JpZFRvcDogIXByb3BzLnNob3dEYXlOdW1iZXIsIGV4dHJhRGF0ZVNwYW46IHByb3BzLmV4dHJhRGF0ZVNwYW4sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCB0b2RheVJhbmdlOiBwcm9wcy50b2RheVJhbmdlIH0pKSksXG4gICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6IFwiZmMtZGF5Z3JpZC1kYXktYmdcIiB9LCBwcm9wcy5iZ0NvbnRlbnQpKSkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZW5kZXJUb3BJbm5lcihwcm9wcykge1xuICAgIHJldHVybiBwcm9wcy5kYXlOdW1iZXJUZXh0IHx8IHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBcIlxcdTAwQTBcIik7XG59XG5mdW5jdGlvbiBzaG91bGREaXNwbGF5TW9udGhTdGFydChkYXRlLCBjdXJyZW50UmFuZ2UsIGRhdGVFbnYpIHtcbiAgICBjb25zdCB7IHN0YXJ0OiBjdXJyZW50U3RhcnQsIGVuZDogY3VycmVudEVuZCB9ID0gY3VycmVudFJhbmdlO1xuICAgIGNvbnN0IGN1cnJlbnRFbmRJbmNsID0gaW50ZXJuYWxfY2pzLmFkZE1zKGN1cnJlbnRFbmQsIC0xKTtcbiAgICBjb25zdCBjdXJyZW50Rmlyc3RZZWFyID0gZGF0ZUVudi5nZXRZZWFyKGN1cnJlbnRTdGFydCk7XG4gICAgY29uc3QgY3VycmVudEZpcnN0TW9udGggPSBkYXRlRW52LmdldE1vbnRoKGN1cnJlbnRTdGFydCk7XG4gICAgY29uc3QgY3VycmVudExhc3RZZWFyID0gZGF0ZUVudi5nZXRZZWFyKGN1cnJlbnRFbmRJbmNsKTtcbiAgICBjb25zdCBjdXJyZW50TGFzdE1vbnRoID0gZGF0ZUVudi5nZXRNb250aChjdXJyZW50RW5kSW5jbCk7XG4gICAgLy8gc3BhbnMgbW9yZSB0aGFuIG9uZSBtb250aD9cbiAgICByZXR1cm4gIShjdXJyZW50Rmlyc3RZZWFyID09PSBjdXJyZW50TGFzdFllYXIgJiYgY3VycmVudEZpcnN0TW9udGggPT09IGN1cnJlbnRMYXN0TW9udGgpICYmXG4gICAgICAgIEJvb2xlYW4oXG4gICAgICAgIC8vIGZpcnN0IGRhdGUgaW4gY3VycmVudCB2aWV3P1xuICAgICAgICBkYXRlLnZhbHVlT2YoKSA9PT0gY3VycmVudFN0YXJ0LnZhbHVlT2YoKSB8fFxuICAgICAgICAgICAgLy8gYSBtb250aC1zdGFydCB0aGF0J3Mgd2l0aGluIHRoZSBjdXJyZW50IHJhbmdlP1xuICAgICAgICAgICAgKGRhdGVFbnYuZ2V0RGF5KGRhdGUpID09PSAxICYmIGRhdGUudmFsdWVPZigpIDwgY3VycmVudEVuZC52YWx1ZU9mKCkpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUZnU2VnUGxhY2VtZW50KHNlZ3MsIC8vIGFzc3VtZWQgYWxyZWFkeSBzb3J0ZWRcbmRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzLCBzdHJpY3RPcmRlciwgZXZlbnRJbnN0YW5jZUhlaWdodHMsIG1heENvbnRlbnRIZWlnaHQsIGNlbGxzKSB7XG4gICAgbGV0IGhpZXJhcmNoeSA9IG5ldyBEYXlHcmlkU2VnSGllcmFyY2h5KCk7XG4gICAgaGllcmFyY2h5LmFsbG93UmVzbGljaW5nID0gdHJ1ZTtcbiAgICBoaWVyYXJjaHkuc3RyaWN0T3JkZXIgPSBzdHJpY3RPcmRlcjtcbiAgICBpZiAoZGF5TWF4RXZlbnRzID09PSB0cnVlIHx8IGRheU1heEV2ZW50Um93cyA9PT0gdHJ1ZSkge1xuICAgICAgICBoaWVyYXJjaHkubWF4Q29vcmQgPSBtYXhDb250ZW50SGVpZ2h0O1xuICAgICAgICBoaWVyYXJjaHkuaGlkZGVuQ29uc3VtZXMgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGF5TWF4RXZlbnRzID09PSAnbnVtYmVyJykge1xuICAgICAgICBoaWVyYXJjaHkubWF4U3RhY2tDbnQgPSBkYXlNYXhFdmVudHM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkYXlNYXhFdmVudFJvd3MgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGhpZXJhcmNoeS5tYXhTdGFja0NudCA9IGRheU1heEV2ZW50Um93cztcbiAgICAgICAgaGllcmFyY2h5LmhpZGRlbkNvbnN1bWVzID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gY3JlYXRlIHNlZ0lucHV0cyBvbmx5IGZvciBzZWdzIHdpdGgga25vd24gaGVpZ2h0c1xuICAgIGxldCBzZWdJbnB1dHMgPSBbXTtcbiAgICBsZXQgdW5rbm93bkhlaWdodFNlZ3MgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ3MubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbGV0IHNlZyA9IHNlZ3NbaV07XG4gICAgICAgIGxldCB7IGluc3RhbmNlSWQgfSA9IHNlZy5ldmVudFJhbmdlLmluc3RhbmNlO1xuICAgICAgICBsZXQgZXZlbnRIZWlnaHQgPSBldmVudEluc3RhbmNlSGVpZ2h0c1tpbnN0YW5jZUlkXTtcbiAgICAgICAgaWYgKGV2ZW50SGVpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNlZ0lucHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICB0aGlja25lc3M6IGV2ZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgIHNwYW46IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHNlZy5maXJzdENvbCxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBzZWcubGFzdENvbCArIDEsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdW5rbm93bkhlaWdodFNlZ3MucHVzaChzZWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBoaWRkZW5FbnRyaWVzID0gaGllcmFyY2h5LmFkZFNlZ3Moc2VnSW5wdXRzKTtcbiAgICBsZXQgc2VnUmVjdHMgPSBoaWVyYXJjaHkudG9SZWN0cygpO1xuICAgIGxldCB7IHNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zIH0gPSBwbGFjZVJlY3RzKHNlZ1JlY3RzLCBzZWdzLCBjZWxscyk7XG4gICAgbGV0IG1vcmVDbnRzID0gW107XG4gICAgbGV0IG1vcmVNYXJnaW5Ub3BzID0gW107XG4gICAgLy8gYWRkIHNlZ3Mgd2l0aCB1bmtub3duIGhlaWdodHNcbiAgICBmb3IgKGxldCBzZWcgb2YgdW5rbm93bkhlaWdodFNlZ3MpIHtcbiAgICAgICAgbXVsdGlDb2xQbGFjZW1lbnRzW3NlZy5maXJzdENvbF0ucHVzaCh7XG4gICAgICAgICAgICBzZWcsXG4gICAgICAgICAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgaXNBYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGFic29sdXRlVG9wOiAwLFxuICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgY29sID0gc2VnLmZpcnN0Q29sOyBjb2wgPD0gc2VnLmxhc3RDb2w7IGNvbCArPSAxKSB7XG4gICAgICAgICAgICBzaW5nbGVDb2xQbGFjZW1lbnRzW2NvbF0ucHVzaCh7XG4gICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgY29sLCBjb2wgKyAxLCBjZWxscyksXG4gICAgICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgdGhlIGhpZGRlbiBlbnRyaWVzXG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY2VsbHMubGVuZ3RoOyBjb2wgKz0gMSkge1xuICAgICAgICBtb3JlQ250cy5wdXNoKDApO1xuICAgIH1cbiAgICBmb3IgKGxldCBoaWRkZW5FbnRyeSBvZiBoaWRkZW5FbnRyaWVzKSB7XG4gICAgICAgIGxldCBzZWcgPSBzZWdzW2hpZGRlbkVudHJ5LmluZGV4XTtcbiAgICAgICAgbGV0IGhpZGRlblNwYW4gPSBoaWRkZW5FbnRyeS5zcGFuO1xuICAgICAgICBtdWx0aUNvbFBsYWNlbWVudHNbaGlkZGVuU3Bhbi5zdGFydF0ucHVzaCh7XG4gICAgICAgICAgICBzZWc6IHJlc2xpY2VTZWcoc2VnLCBoaWRkZW5TcGFuLnN0YXJ0LCBoaWRkZW5TcGFuLmVuZCwgY2VsbHMpLFxuICAgICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGlzQWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgICBhYnNvbHV0ZVRvcDogMCxcbiAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IGhpZGRlblNwYW4uc3RhcnQ7IGNvbCA8IGhpZGRlblNwYW4uZW5kOyBjb2wgKz0gMSkge1xuICAgICAgICAgICAgbW9yZUNudHNbY29sXSArPSAxO1xuICAgICAgICAgICAgc2luZ2xlQ29sUGxhY2VtZW50c1tjb2xdLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlZzogcmVzbGljZVNlZyhzZWcsIGNvbCwgY29sICsgMSwgY2VsbHMpLFxuICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IDAsXG4gICAgICAgICAgICAgICAgbWFyZ2luVG9wOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZGVhbCB3aXRoIGxlZnRvdmVyIG1hcmdpbnNcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjZWxscy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgIG1vcmVNYXJnaW5Ub3BzLnB1c2gobGVmdG92ZXJNYXJnaW5zW2NvbF0pO1xuICAgIH1cbiAgICByZXR1cm4geyBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMsIG1vcmVDbnRzLCBtb3JlTWFyZ2luVG9wcyB9O1xufVxuLy8gcmVjdHMgb3JkZXJlZCBieSB0b3AgY29vcmQsIHRoZW4gbGVmdFxuZnVuY3Rpb24gcGxhY2VSZWN0cyhhbGxSZWN0cywgc2VncywgY2VsbHMpIHtcbiAgICBsZXQgcmVjdHNCeUVhY2hDb2wgPSBncm91cFJlY3RzQnlFYWNoQ29sKGFsbFJlY3RzLCBjZWxscy5sZW5ndGgpO1xuICAgIGxldCBzaW5nbGVDb2xQbGFjZW1lbnRzID0gW107XG4gICAgbGV0IG11bHRpQ29sUGxhY2VtZW50cyA9IFtdO1xuICAgIGxldCBsZWZ0b3Zlck1hcmdpbnMgPSBbXTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjZWxscy5sZW5ndGg7IGNvbCArPSAxKSB7XG4gICAgICAgIGxldCByZWN0cyA9IHJlY3RzQnlFYWNoQ29sW2NvbF07XG4gICAgICAgIC8vIGNvbXB1dGUgYWxsIHN0YXRpYyBzZWdzIGluIHNpbmdsZVBsYWNlbWVudHNcbiAgICAgICAgbGV0IHNpbmdsZVBsYWNlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGN1cnJlbnRIZWlnaHQgPSAwO1xuICAgICAgICBsZXQgY3VycmVudE1hcmdpblRvcCA9IDA7XG4gICAgICAgIGZvciAobGV0IHJlY3Qgb2YgcmVjdHMpIHtcbiAgICAgICAgICAgIGxldCBzZWcgPSBzZWdzW3JlY3QuaW5kZXhdO1xuICAgICAgICAgICAgc2luZ2xlUGxhY2VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWc6IHJlc2xpY2VTZWcoc2VnLCBjb2wsIGNvbCArIDEsIGNlbGxzKSxcbiAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IHJlY3QubGV2ZWxDb29yZCxcbiAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IHJlY3QubGV2ZWxDb29yZCAtIGN1cnJlbnRIZWlnaHQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgPSByZWN0LmxldmVsQ29vcmQgKyByZWN0LnRoaWNrbmVzcztcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21wdXRlIG1peGVkIHN0YXRpYy9hYnNvbHV0ZSBzZWdzIGluIG11bHRpUGxhY2VtZW50c1xuICAgICAgICBsZXQgbXVsdGlQbGFjZW1lbnRzID0gW107XG4gICAgICAgIGN1cnJlbnRIZWlnaHQgPSAwO1xuICAgICAgICBjdXJyZW50TWFyZ2luVG9wID0gMDtcbiAgICAgICAgZm9yIChsZXQgcmVjdCBvZiByZWN0cykge1xuICAgICAgICAgICAgbGV0IHNlZyA9IHNlZ3NbcmVjdC5pbmRleF07XG4gICAgICAgICAgICBsZXQgaXNBYnNvbHV0ZSA9IHJlY3Quc3Bhbi5lbmQgLSByZWN0LnNwYW4uc3RhcnQgPiAxOyAvLyBtdWx0aS1jb2x1bW4/XG4gICAgICAgICAgICBsZXQgaXNGaXJzdENvbCA9IHJlY3Quc3Bhbi5zdGFydCA9PT0gY29sO1xuICAgICAgICAgICAgY3VycmVudE1hcmdpblRvcCArPSByZWN0LmxldmVsQ29vcmQgLSBjdXJyZW50SGVpZ2h0OyAvLyBhbW91bnQgb2Ygc3BhY2Ugc2luY2UgYm90dG9tIG9mIHByZXZpb3VzIHNlZ1xuICAgICAgICAgICAgY3VycmVudEhlaWdodCA9IHJlY3QubGV2ZWxDb29yZCArIHJlY3QudGhpY2tuZXNzOyAvLyBoZWlnaHQgd2lsbCBub3cgYmUgYm90dG9tIG9mIGN1cnJlbnQgc2VnXG4gICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgKz0gcmVjdC50aGlja25lc3M7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3RDb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlQbGFjZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgcmVjdC5zcGFuLnN0YXJ0LCByZWN0LnNwYW4uZW5kLCBjZWxscyksXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVUb3A6IHJlY3QubGV2ZWxDb29yZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogMCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNGaXJzdENvbCkge1xuICAgICAgICAgICAgICAgIG11bHRpUGxhY2VtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VnOiByZXNsaWNlU2VnKHNlZywgcmVjdC5zcGFuLnN0YXJ0LCByZWN0LnNwYW4uZW5kLCBjZWxscyksXG4gICAgICAgICAgICAgICAgICAgIGlzVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGFic29sdXRlVG9wOiByZWN0LmxldmVsQ29vcmQsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogY3VycmVudE1hcmdpblRvcCwgLy8gY2xhaW0gdGhlIG1hcmdpblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRNYXJnaW5Ub3AgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNpbmdsZUNvbFBsYWNlbWVudHMucHVzaChzaW5nbGVQbGFjZW1lbnRzKTtcbiAgICAgICAgbXVsdGlDb2xQbGFjZW1lbnRzLnB1c2gobXVsdGlQbGFjZW1lbnRzKTtcbiAgICAgICAgbGVmdG92ZXJNYXJnaW5zLnB1c2goY3VycmVudE1hcmdpblRvcCk7XG4gICAgfVxuICAgIHJldHVybiB7IHNpbmdsZUNvbFBsYWNlbWVudHMsIG11bHRpQ29sUGxhY2VtZW50cywgbGVmdG92ZXJNYXJnaW5zIH07XG59XG5mdW5jdGlvbiBncm91cFJlY3RzQnlFYWNoQ29sKHJlY3RzLCBjb2xDbnQpIHtcbiAgICBsZXQgcmVjdHNCeUVhY2hDb2wgPSBbXTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBjb2xDbnQ7IGNvbCArPSAxKSB7XG4gICAgICAgIHJlY3RzQnlFYWNoQ29sLnB1c2goW10pO1xuICAgIH1cbiAgICBmb3IgKGxldCByZWN0IG9mIHJlY3RzKSB7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IHJlY3Quc3Bhbi5zdGFydDsgY29sIDwgcmVjdC5zcGFuLmVuZDsgY29sICs9IDEpIHtcbiAgICAgICAgICAgIHJlY3RzQnlFYWNoQ29sW2NvbF0ucHVzaChyZWN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVjdHNCeUVhY2hDb2w7XG59XG5mdW5jdGlvbiByZXNsaWNlU2VnKHNlZywgc3BhblN0YXJ0LCBzcGFuRW5kLCBjZWxscykge1xuICAgIGlmIChzZWcuZmlyc3RDb2wgPT09IHNwYW5TdGFydCAmJiBzZWcubGFzdENvbCA9PT0gc3BhbkVuZCAtIDEpIHtcbiAgICAgICAgcmV0dXJuIHNlZztcbiAgICB9XG4gICAgbGV0IGV2ZW50UmFuZ2UgPSBzZWcuZXZlbnRSYW5nZTtcbiAgICBsZXQgb3JpZ1JhbmdlID0gZXZlbnRSYW5nZS5yYW5nZTtcbiAgICBsZXQgc2xpY2VkUmFuZ2UgPSBpbnRlcm5hbF9janMuaW50ZXJzZWN0UmFuZ2VzKG9yaWdSYW5nZSwge1xuICAgICAgICBzdGFydDogY2VsbHNbc3BhblN0YXJ0XS5kYXRlLFxuICAgICAgICBlbmQ6IGludGVybmFsX2Nqcy5hZGREYXlzKGNlbGxzW3NwYW5FbmQgLSAxXS5kYXRlLCAxKSxcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzZWcpLCB7IGZpcnN0Q29sOiBzcGFuU3RhcnQsIGxhc3RDb2w6IHNwYW5FbmQgLSAxLCBldmVudFJhbmdlOiB7XG4gICAgICAgICAgICBkZWY6IGV2ZW50UmFuZ2UuZGVmLFxuICAgICAgICAgICAgdWk6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRSYW5nZS51aSksIHsgZHVyYXRpb25FZGl0YWJsZTogZmFsc2UgfSksXG4gICAgICAgICAgICBpbnN0YW5jZTogZXZlbnRSYW5nZS5pbnN0YW5jZSxcbiAgICAgICAgICAgIHJhbmdlOiBzbGljZWRSYW5nZSxcbiAgICAgICAgfSwgaXNTdGFydDogc2VnLmlzU3RhcnQgJiYgc2xpY2VkUmFuZ2Uuc3RhcnQudmFsdWVPZigpID09PSBvcmlnUmFuZ2Uuc3RhcnQudmFsdWVPZigpLCBpc0VuZDogc2VnLmlzRW5kICYmIHNsaWNlZFJhbmdlLmVuZC52YWx1ZU9mKCkgPT09IG9yaWdSYW5nZS5lbmQudmFsdWVPZigpIH0pO1xufVxuY2xhc3MgRGF5R3JpZFNlZ0hpZXJhcmNoeSBleHRlbmRzIGludGVybmFsX2Nqcy5TZWdIaWVyYXJjaHkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyBjb25maWdcbiAgICAgICAgdGhpcy5oaWRkZW5Db25zdW1lcyA9IGZhbHNlO1xuICAgICAgICAvLyBhbGxvd3MgdXMgdG8ga2VlcCBoaWRkZW4gZW50cmllcyBpbiB0aGUgaGllcmFyY2h5IHNvIHRoZXkgdGFrZSB1cCBzcGFjZVxuICAgICAgICB0aGlzLmZvcmNlSGlkZGVuID0ge307XG4gICAgfVxuICAgIGFkZFNlZ3Moc2VnSW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IGhpZGRlblNlZ3MgPSBzdXBlci5hZGRTZWdzKHNlZ0lucHV0cyk7XG4gICAgICAgIGNvbnN0IHsgZW50cmllc0J5TGV2ZWwgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVIaWRkZW4gPSAoZW50cnkpID0+ICF0aGlzLmZvcmNlSGlkZGVuW2ludGVybmFsX2Nqcy5idWlsZEVudHJ5S2V5KGVudHJ5KV07XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgZm9yY2VkLWhpZGRlbiBzZWdzXG4gICAgICAgIGZvciAobGV0IGxldmVsID0gMDsgbGV2ZWwgPCBlbnRyaWVzQnlMZXZlbC5sZW5ndGg7IGxldmVsICs9IDEpIHtcbiAgICAgICAgICAgIGVudHJpZXNCeUxldmVsW2xldmVsXSA9IGVudHJpZXNCeUxldmVsW2xldmVsXS5maWx0ZXIoZXhjbHVkZUhpZGRlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhpZGRlblNlZ3M7XG4gICAgfVxuICAgIGhhbmRsZUludmFsaWRJbnNlcnRpb24oaW5zZXJ0aW9uLCBlbnRyeSwgaGlkZGVuRW50cmllcykge1xuICAgICAgICBjb25zdCB7IGVudHJpZXNCeUxldmVsLCBmb3JjZUhpZGRlbiB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgeyB0b3VjaGluZ0VudHJ5LCB0b3VjaGluZ0xldmVsLCB0b3VjaGluZ0xhdGVyYWwgfSA9IGluc2VydGlvbjtcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuQ29uc3VtZXMgJiYgdG91Y2hpbmdFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgdG91Y2hpbmdFbnRyeUlkID0gaW50ZXJuYWxfY2pzLmJ1aWxkRW50cnlLZXkodG91Y2hpbmdFbnRyeSk7XG4gICAgICAgICAgICAvLyBpZiBub3QgYWxyZWFkeSBoaWRkZW5cbiAgICAgICAgICAgIGlmICghZm9yY2VIaWRkZW5bdG91Y2hpbmdFbnRyeUlkXSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFsbG93UmVzbGljaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyRW50cnkgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRvdWNoaW5nRW50cnkpLCB7IHNwYW46IGludGVybmFsX2Nqcy5pbnRlcnNlY3RTcGFucyh0b3VjaGluZ0VudHJ5LnNwYW4sIGVudHJ5LnNwYW4pIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlckVudHJ5SWQgPSBpbnRlcm5hbF9janMuYnVpbGRFbnRyeUtleShwbGFjZWhvbGRlckVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgZm9yY2VIaWRkZW5bcGxhY2Vob2xkZXJFbnRyeUlkXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNCeUxldmVsW3RvdWNoaW5nTGV2ZWxdW3RvdWNoaW5nTGF0ZXJhbF0gPSBwbGFjZWhvbGRlckVudHJ5OyAvLyByZXBsYWNlIHRvdWNoaW5nRW50cnkgd2l0aCBvdXIgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGxpdEVudHJ5KHRvdWNoaW5nRW50cnksIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTsgLy8gc3BsaXQgdXAgdGhlIHRvdWNoaW5nRW50cnksIHJlaW5zZXJ0IGl0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUhpZGRlblt0b3VjaGluZ0VudHJ5SWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuRW50cmllcy5wdXNoKHRvdWNoaW5nRW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIuaGFuZGxlSW52YWxpZEluc2VydGlvbihpbnNlcnRpb24sIGVudHJ5LCBoaWRkZW5FbnRyaWVzKTtcbiAgICB9XG59XG5cbmNsYXNzIFRhYmxlUm93IGV4dGVuZHMgaW50ZXJuYWxfY2pzLkRhdGVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNlbGxFbFJlZnMgPSBuZXcgaW50ZXJuYWxfY2pzLlJlZk1hcCgpOyAvLyB0aGUgPHRkPlxuICAgICAgICB0aGlzLmZyYW1lRWxSZWZzID0gbmV3IGludGVybmFsX2Nqcy5SZWZNYXAoKTsgLy8gdGhlIGZjLWRheWdyaWQtZGF5LWZyYW1lXG4gICAgICAgIHRoaXMuZmdFbFJlZnMgPSBuZXcgaW50ZXJuYWxfY2pzLlJlZk1hcCgpOyAvLyB0aGUgZmMtZGF5Z3JpZC1kYXktZXZlbnRzXG4gICAgICAgIHRoaXMuc2VnSGFybmVzc1JlZnMgPSBuZXcgaW50ZXJuYWxfY2pzLlJlZk1hcCgpOyAvLyBpbmRleGVkIGJ5IFwiaW5zdGFuY2VJZDpmaXJzdENvbFwiXG4gICAgICAgIHRoaXMucm9vdEVsUmVmID0gcHJlYWN0X2Nqcy5jcmVhdGVSZWYoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGZyYW1lUG9zaXRpb25zOiBudWxsLFxuICAgICAgICAgICAgbWF4Q29udGVudEhlaWdodDogbnVsbCxcbiAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VIZWlnaHRzOiB7fSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZXNpemUgPSAoaXNGb3JjZWQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0ZvcmNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6aW5nKHRydWUpOyAvLyBpc0V4dGVybmFsPXRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgc3RhdGUsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gICAgICAgIGxldCBjb2xDbnQgPSBwcm9wcy5jZWxscy5sZW5ndGg7XG4gICAgICAgIGxldCBidXNpbmVzc0hvdXJzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHByb3BzLmJ1c2luZXNzSG91clNlZ3MsIGNvbENudCk7XG4gICAgICAgIGxldCBiZ0V2ZW50U2Vnc0J5Q29sID0gc3BsaXRTZWdzQnlGaXJzdENvbChwcm9wcy5iZ0V2ZW50U2VncywgY29sQ250KTtcbiAgICAgICAgbGV0IGhpZ2hsaWdodFNlZ3NCeUNvbCA9IHNwbGl0U2Vnc0J5Rmlyc3RDb2wodGhpcy5nZXRIaWdobGlnaHRTZWdzKCksIGNvbENudCk7XG4gICAgICAgIGxldCBtaXJyb3JTZWdzQnlDb2wgPSBzcGxpdFNlZ3NCeUZpcnN0Q29sKHRoaXMuZ2V0TWlycm9yU2VncygpLCBjb2xDbnQpO1xuICAgICAgICBsZXQgeyBzaW5nbGVDb2xQbGFjZW1lbnRzLCBtdWx0aUNvbFBsYWNlbWVudHMsIG1vcmVDbnRzLCBtb3JlTWFyZ2luVG9wcyB9ID0gY29tcHV0ZUZnU2VnUGxhY2VtZW50KGludGVybmFsX2Nqcy5zb3J0RXZlbnRTZWdzKHByb3BzLmZnRXZlbnRTZWdzLCBvcHRpb25zLmV2ZW50T3JkZXIpLCBwcm9wcy5kYXlNYXhFdmVudHMsIHByb3BzLmRheU1heEV2ZW50Um93cywgb3B0aW9ucy5ldmVudE9yZGVyU3RyaWN0LCBzdGF0ZS5ldmVudEluc3RhbmNlSGVpZ2h0cywgc3RhdGUubWF4Q29udGVudEhlaWdodCwgcHJvcHMuY2VsbHMpO1xuICAgICAgICBsZXQgaXNGb3JjZWRJbnZpc2libGUgPSAvLyBUT0RPOiBtZXNzeSB3YXkgdG8gY29tcHV0ZSB0aGlzXG4gICAgICAgICAocHJvcHMuZXZlbnREcmFnICYmIHByb3BzLmV2ZW50RHJhZy5hZmZlY3RlZEluc3RhbmNlcykgfHxcbiAgICAgICAgICAgIChwcm9wcy5ldmVudFJlc2l6ZSAmJiBwcm9wcy5ldmVudFJlc2l6ZS5hZmZlY3RlZEluc3RhbmNlcykgfHxcbiAgICAgICAgICAgIHt9O1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcInRyXCIsIHsgcmVmOiB0aGlzLnJvb3RFbFJlZiwgcm9sZTogXCJyb3dcIiB9LFxuICAgICAgICAgICAgcHJvcHMucmVuZGVySW50cm8gJiYgcHJvcHMucmVuZGVySW50cm8oKSxcbiAgICAgICAgICAgIHByb3BzLmNlbGxzLm1hcCgoY2VsbCwgY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG5vcm1hbEZnTm9kZXMgPSB0aGlzLnJlbmRlckZnU2Vncyhjb2wsIHByb3BzLmZvclByaW50ID8gc2luZ2xlQ29sUGxhY2VtZW50c1tjb2xdIDogbXVsdGlDb2xQbGFjZW1lbnRzW2NvbF0sIHByb3BzLnRvZGF5UmFuZ2UsIGlzRm9yY2VkSW52aXNpYmxlKTtcbiAgICAgICAgICAgICAgICBsZXQgbWlycm9yRmdOb2RlcyA9IHRoaXMucmVuZGVyRmdTZWdzKGNvbCwgYnVpbGRNaXJyb3JQbGFjZW1lbnRzKG1pcnJvclNlZ3NCeUNvbFtjb2xdLCBtdWx0aUNvbFBsYWNlbWVudHMpLCBwcm9wcy50b2RheVJhbmdlLCB7fSwgQm9vbGVhbihwcm9wcy5ldmVudERyYWcpLCBCb29sZWFuKHByb3BzLmV2ZW50UmVzaXplKSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KFRhYmxlQ2VsbCwgeyBrZXk6IGNlbGwua2V5LCBlbFJlZjogdGhpcy5jZWxsRWxSZWZzLmNyZWF0ZVJlZihjZWxsLmtleSksIGlubmVyRWxSZWY6IHRoaXMuZnJhbWVFbFJlZnMuY3JlYXRlUmVmKGNlbGwua2V5KSAvKiBGRiA8dGQ+IHByb2JsZW0sIGJ1dCBva2F5IHRvIHVzZSBmb3IgbGVmdC9yaWdodC4gVE9ETzogcmVuYW1lIHByb3AgKi8sIGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgZGF0ZTogY2VsbC5kYXRlLCBzaG93RGF5TnVtYmVyOiBwcm9wcy5zaG93RGF5TnVtYmVycywgc2hvd1dlZWtOdW1iZXI6IHByb3BzLnNob3dXZWVrTnVtYmVycyAmJiBjb2wgPT09IDAsIGZvcmNlRGF5VG9wOiBwcm9wcy5zaG93V2Vla051bWJlcnMgLyogZXZlbiBkaXNwbGF5aW5nIHdlZWtudW0gZm9yIHJvdywgbm90IG5lY2Vzc2FyaWx5IGRheSAqLywgdG9kYXlSYW5nZTogcHJvcHMudG9kYXlSYW5nZSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBldmVudERyYWc6IHByb3BzLmV2ZW50RHJhZywgZXZlbnRSZXNpemU6IHByb3BzLmV2ZW50UmVzaXplLCBleHRyYVJlbmRlclByb3BzOiBjZWxsLmV4dHJhUmVuZGVyUHJvcHMsIGV4dHJhRGF0YUF0dHJzOiBjZWxsLmV4dHJhRGF0YUF0dHJzLCBleHRyYUNsYXNzTmFtZXM6IGNlbGwuZXh0cmFDbGFzc05hbWVzLCBleHRyYURhdGVTcGFuOiBjZWxsLmV4dHJhRGF0ZVNwYW4sIG1vcmVDbnQ6IG1vcmVDbnRzW2NvbF0sIG1vcmVNYXJnaW5Ub3A6IG1vcmVNYXJnaW5Ub3BzW2NvbF0sIHNpbmdsZVBsYWNlbWVudHM6IHNpbmdsZUNvbFBsYWNlbWVudHNbY29sXSwgZmdDb250ZW50RWxSZWY6IHRoaXMuZmdFbFJlZnMuY3JlYXRlUmVmKGNlbGwua2V5KSwgZmdDb250ZW50OiAoIC8vIEZyYWdtZW50IHNjb3BlcyB0aGUga2V5c1xuICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBub3JtYWxGZ05vZGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLCBtaXJyb3JGZ05vZGVzKSkpLCBiZ0NvbnRlbnQ6ICggLy8gRnJhZ21lbnQgc2NvcGVzIHRoZSBrZXlzXG4gICAgICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChwcmVhY3RfY2pzLkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGaWxsU2VncyhoaWdobGlnaHRTZWdzQnlDb2xbY29sXSwgJ2hpZ2hsaWdodCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGaWxsU2VncyhidXNpbmVzc0hvdXJzQnlDb2xbY29sXSwgJ25vbi1idXNpbmVzcycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJGaWxsU2VncyhiZ0V2ZW50U2Vnc0J5Q29sW2NvbF0sICdiZy1ldmVudCcpKSksIG1pbkhlaWdodDogcHJvcHMuY2VsbE1pbkhlaWdodCB9KSk7XG4gICAgICAgICAgICB9KSkpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTaXppbmcodHJ1ZSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5hZGRSZXNpemVIYW5kbGVyKHRoaXMuaGFuZGxlUmVzaXplKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICAgIGxldCBjdXJyZW50UHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgICB0aGlzLnVwZGF0ZVNpemluZyghaW50ZXJuYWxfY2pzLmlzUHJvcHNFcXVhbChwcmV2UHJvcHMsIGN1cnJlbnRQcm9wcykpO1xuICAgIH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnJlbW92ZVJlc2l6ZUhhbmRsZXIodGhpcy5oYW5kbGVSZXNpemUpO1xuICAgIH1cbiAgICBnZXRIaWdobGlnaHRTZWdzKCkge1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKHByb3BzLmV2ZW50RHJhZyAmJiBwcm9wcy5ldmVudERyYWcuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudERyYWcuc2VncztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMuZXZlbnRSZXNpemUgJiYgcHJvcHMuZXZlbnRSZXNpemUuc2Vncy5sZW5ndGgpIHsgLy8gbWVzc3kgY2hlY2tcbiAgICAgICAgICAgIHJldHVybiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wcy5kYXRlU2VsZWN0aW9uU2VncztcbiAgICB9XG4gICAgZ2V0TWlycm9yU2VncygpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgICAgIGlmIChwcm9wcy5ldmVudFJlc2l6ZSAmJiBwcm9wcy5ldmVudFJlc2l6ZS5zZWdzLmxlbmd0aCkgeyAvLyBtZXNzeSBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzLmV2ZW50UmVzaXplLnNlZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZW5kZXJGZ1NlZ3MoY29sLCBzZWdQbGFjZW1lbnRzLCB0b2RheVJhbmdlLCBpc0ZvcmNlZEludmlzaWJsZSwgaXNEcmFnZ2luZywgaXNSZXNpemluZywgaXNEYXRlU2VsZWN0aW5nKSB7XG4gICAgICAgIGxldCB7IGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IGV2ZW50U2VsZWN0aW9uIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgeyBmcmFtZVBvc2l0aW9ucyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgbGV0IGRlZmF1bHREaXNwbGF5RXZlbnRFbmQgPSB0aGlzLnByb3BzLmNlbGxzLmxlbmd0aCA9PT0gMTsgLy8gY29sQ250ID09PSAxXG4gICAgICAgIGxldCBpc01pcnJvciA9IGlzRHJhZ2dpbmcgfHwgaXNSZXNpemluZyB8fCBpc0RhdGVTZWxlY3Rpbmc7XG4gICAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgICBpZiAoZnJhbWVQb3NpdGlvbnMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHBsYWNlbWVudCBvZiBzZWdQbGFjZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgc2VnIH0gPSBwbGFjZW1lbnQ7XG4gICAgICAgICAgICAgICAgbGV0IHsgaW5zdGFuY2VJZCB9ID0gc2VnLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGluc3RhbmNlSWQgKyAnOicgKyBjb2w7XG4gICAgICAgICAgICAgICAgbGV0IGlzVmlzaWJsZSA9IHBsYWNlbWVudC5pc1Zpc2libGUgJiYgIWlzRm9yY2VkSW52aXNpYmxlW2luc3RhbmNlSWRdO1xuICAgICAgICAgICAgICAgIGxldCBpc0Fic29sdXRlID0gcGxhY2VtZW50LmlzQWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgbGV0IGxlZnQgPSAnJztcbiAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5pc1J0bCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5sYXN0Q29sXSAtIGZyYW1lUG9zaXRpb25zLmxlZnRzW3NlZy5maXJzdENvbF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gZnJhbWVQb3NpdGlvbnMucmlnaHRzW3NlZy5maXJzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmxhc3RDb2xdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAga25vd24gYnVnOiBldmVudHMgdGhhdCBhcmUgZm9yY2UgdG8gYmUgbGlzdC1pdGVtIGJ1dCBzcGFuIG11bHRpcGxlIGRheXMgc3RpbGwgdGFrZSB1cCBzcGFjZSBpbiBsYXRlciBjb2x1bW5zXG4gICAgICAgICAgICAgICAgdG9kbzogaW4gcHJpbnQgdmlldywgZm9yIG11bHRpLWRheSBldmVudHMsIGRvbid0IGRpc3BsYXkgdGl0bGUgd2l0aGluIG5vbi1zdGFydC9lbmQgc2Vnc1xuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBjbGFzc05hbWU6ICdmYy1kYXlncmlkLWV2ZW50LWhhcm5lc3MnICsgKGlzQWJzb2x1dGUgPyAnIGZjLWRheWdyaWQtZXZlbnQtaGFybmVzcy1hYnMnIDogJycpLCBrZXk6IGtleSwgcmVmOiBpc01pcnJvciA/IG51bGwgOiB0aGlzLnNlZ0hhcm5lc3NSZWZzLmNyZWF0ZVJlZihrZXkpLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogaXNWaXNpYmxlID8gJycgOiAnaGlkZGVuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogaXNBYnNvbHV0ZSA/ICcnIDogcGxhY2VtZW50Lm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogaXNBYnNvbHV0ZSA/IHBsYWNlbWVudC5hYnNvbHV0ZVRvcCA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB9IH0sIGhhc0xpc3RJdGVtRGlzcGxheShzZWcpID8gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZUxpc3RJdGVtRXZlbnQsIE9iamVjdC5hc3NpZ24oeyBzZWc6IHNlZywgaXNEcmFnZ2luZzogaXNEcmFnZ2luZywgaXNTZWxlY3RlZDogaW5zdGFuY2VJZCA9PT0gZXZlbnRTZWxlY3Rpb24sIGRlZmF1bHREaXNwbGF5RXZlbnRFbmQ6IGRlZmF1bHREaXNwbGF5RXZlbnRFbmQgfSwgaW50ZXJuYWxfY2pzLmdldFNlZ01ldGEoc2VnLCB0b2RheVJhbmdlKSkpKSA6IChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoVGFibGVCbG9ja0V2ZW50LCBPYmplY3QuYXNzaWduKHsgc2VnOiBzZWcsIGlzRHJhZ2dpbmc6IGlzRHJhZ2dpbmcsIGlzUmVzaXppbmc6IGlzUmVzaXppbmcsIGlzRGF0ZVNlbGVjdGluZzogaXNEYXRlU2VsZWN0aW5nLCBpc1NlbGVjdGVkOiBpbnN0YW5jZUlkID09PSBldmVudFNlbGVjdGlvbiwgZGVmYXVsdERpc3BsYXlFdmVudEVuZDogZGVmYXVsdERpc3BsYXlFdmVudEVuZCB9LCBpbnRlcm5hbF9janMuZ2V0U2VnTWV0YShzZWcsIHRvZGF5UmFuZ2UpKSkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cbiAgICByZW5kZXJGaWxsU2VncyhzZWdzLCBmaWxsVHlwZSkge1xuICAgICAgICBsZXQgeyBpc1J0bCB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgeyB0b2RheVJhbmdlIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBsZXQgeyBmcmFtZVBvc2l0aW9ucyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICAgIGlmIChmcmFtZVBvc2l0aW9ucykge1xuICAgICAgICAgICAgZm9yIChsZXQgc2VnIG9mIHNlZ3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGVmdFJpZ2h0Q3NzID0gaXNSdGwgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwLFxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBmcmFtZVBvc2l0aW9ucy5sZWZ0c1tzZWcubGFzdENvbF0gLSBmcmFtZVBvc2l0aW9ucy5sZWZ0c1tzZWcuZmlyc3RDb2xdLFxuICAgICAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBmcmFtZVBvc2l0aW9ucy5yaWdodHNbc2VnLmZpcnN0Q29sXSAtIGZyYW1lUG9zaXRpb25zLnJpZ2h0c1tzZWcubGFzdENvbF0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGtleTogaW50ZXJuYWxfY2pzLmJ1aWxkRXZlbnRSYW5nZUtleShzZWcuZXZlbnRSYW5nZSksIGNsYXNzTmFtZTogXCJmYy1kYXlncmlkLWJnLWhhcm5lc3NcIiwgc3R5bGU6IGxlZnRSaWdodENzcyB9LCBmaWxsVHlwZSA9PT0gJ2JnLWV2ZW50JyA/XG4gICAgICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuQmdFdmVudCwgT2JqZWN0LmFzc2lnbih7IHNlZzogc2VnIH0sIGludGVybmFsX2Nqcy5nZXRTZWdNZXRhKHNlZywgdG9kYXlSYW5nZSkpKSA6XG4gICAgICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5yZW5kZXJGaWxsKGZpbGxUeXBlKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQocHJlYWN0X2Nqcy5GcmFnbWVudCwge30sIC4uLm5vZGVzKTtcbiAgICB9XG4gICAgdXBkYXRlU2l6aW5nKGlzRXh0ZXJuYWxTaXppbmdDaGFuZ2UpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIHN0YXRlLCBmcmFtZUVsUmVmcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKCFwcm9wcy5mb3JQcmludCAmJlxuICAgICAgICAgICAgcHJvcHMuY2xpZW50V2lkdGggIT09IG51bGwgLy8gcG9zaXRpb25pbmcgcmVhZHk/XG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGlzRXh0ZXJuYWxTaXppbmdDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgZnJhbWVFbHMgPSBwcm9wcy5jZWxscy5tYXAoKGNlbGwpID0+IGZyYW1lRWxSZWZzLmN1cnJlbnRNYXBbY2VsbC5rZXldKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVFbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5FbCA9IHRoaXMucm9vdEVsUmVmLmN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdQb3NpdGlvbkNhY2hlID0gbmV3IGludGVybmFsX2Nqcy5Qb3NpdGlvbkNhY2hlKG9yaWdpbkVsLCBmcmFtZUVscywgdHJ1ZSwgLy8gaXNIb3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5mcmFtZVBvc2l0aW9ucyB8fCAhc3RhdGUuZnJhbWVQb3NpdGlvbnMuc2ltaWxhclRvKG5ld1Bvc2l0aW9uQ2FjaGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVBvc2l0aW9uczogbmV3IGludGVybmFsX2Nqcy5Qb3NpdGlvbkNhY2hlKG9yaWdpbkVsLCBmcmFtZUVscywgdHJ1ZSwgLy8gaXNIb3Jpem9udGFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvbGRJbnN0YW5jZUhlaWdodHMgPSB0aGlzLnN0YXRlLmV2ZW50SW5zdGFuY2VIZWlnaHRzO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5zdGFuY2VIZWlnaHRzID0gdGhpcy5xdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzKCk7XG4gICAgICAgICAgICBjb25zdCBsaW1pdEJ5Q29udGVudEhlaWdodCA9IHByb3BzLmRheU1heEV2ZW50cyA9PT0gdHJ1ZSB8fCBwcm9wcy5kYXlNYXhFdmVudFJvd3MgPT09IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNhZmVTZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLy8gSEFDSyB0byBwcmV2ZW50IG9zY2lsbGF0aW9ucyBvZiBldmVudHMgYmVpbmcgc2hvd24vaGlkZGVuIGZyb20gbWF4LWV2ZW50LXJvd3NcbiAgICAgICAgICAgICAgICAvLyBFc3NlbnRpYWxseSwgb25jZSB5b3UgY29tcHV0ZSBhbiBlbGVtZW50J3MgaGVpZ2h0LCBuZXZlciBudWxsLW91dC5cbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbHdheXMgZGlzcGxheSBhbGwgZXZlbnRzLCBhcyB2aXNpYmlsaXR5OmhpZGRlbj9cbiAgICAgICAgICAgICAgICBldmVudEluc3RhbmNlSGVpZ2h0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvbGRJbnN0YW5jZUhlaWdodHMpLCBuZXdJbnN0YW5jZUhlaWdodHMpLFxuICAgICAgICAgICAgICAgIG1heENvbnRlbnRIZWlnaHQ6IGxpbWl0QnlDb250ZW50SGVpZ2h0ID8gdGhpcy5jb21wdXRlTWF4Q29udGVudEhlaWdodCgpIDogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXJ5RXZlbnRJbnN0YW5jZUhlaWdodHMoKSB7XG4gICAgICAgIGxldCBzZWdFbE1hcCA9IHRoaXMuc2VnSGFybmVzc1JlZnMuY3VycmVudE1hcDtcbiAgICAgICAgbGV0IGV2ZW50SW5zdGFuY2VIZWlnaHRzID0ge307XG4gICAgICAgIC8vIGdldCB0aGUgbWF4IGhlaWdodCBhbW9uZ3N0IGluc3RhbmNlIHNlZ3NcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNlZ0VsTWFwKSB7XG4gICAgICAgICAgICBsZXQgaGVpZ2h0ID0gTWF0aC5yb3VuZChzZWdFbE1hcFtrZXldLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7XG4gICAgICAgICAgICBsZXQgaW5zdGFuY2VJZCA9IGtleS5zcGxpdCgnOicpWzBdOyAvLyBkZWNvbnN0cnVjdCBob3cgcmVuZGVyRmdTZWdzIG1ha2VzIHRoZSBrZXlcbiAgICAgICAgICAgIGV2ZW50SW5zdGFuY2VIZWlnaHRzW2luc3RhbmNlSWRdID0gTWF0aC5tYXgoZXZlbnRJbnN0YW5jZUhlaWdodHNbaW5zdGFuY2VJZF0gfHwgMCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXZlbnRJbnN0YW5jZUhlaWdodHM7XG4gICAgfVxuICAgIGNvbXB1dGVNYXhDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgZmlyc3RLZXkgPSB0aGlzLnByb3BzLmNlbGxzWzBdLmtleTtcbiAgICAgICAgbGV0IGNlbGxFbCA9IHRoaXMuY2VsbEVsUmVmcy5jdXJyZW50TWFwW2ZpcnN0S2V5XTtcbiAgICAgICAgbGV0IGZjQ29udGFpbmVyRWwgPSB0aGlzLmZnRWxSZWZzLmN1cnJlbnRNYXBbZmlyc3RLZXldO1xuICAgICAgICByZXR1cm4gY2VsbEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIGZjQ29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgIH1cbiAgICBnZXRDZWxsRWxzKCkge1xuICAgICAgICBsZXQgZWxNYXAgPSB0aGlzLmNlbGxFbFJlZnMuY3VycmVudE1hcDtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2VsbHMubWFwKChjZWxsKSA9PiBlbE1hcFtjZWxsLmtleV0pO1xuICAgIH1cbn1cblRhYmxlUm93LmFkZFN0YXRlRXF1YWxpdHkoe1xuICAgIGV2ZW50SW5zdGFuY2VIZWlnaHRzOiBpbnRlcm5hbF9janMuaXNQcm9wc0VxdWFsLFxufSk7XG5mdW5jdGlvbiBidWlsZE1pcnJvclBsYWNlbWVudHMobWlycm9yU2VncywgY29sUGxhY2VtZW50cykge1xuICAgIGlmICghbWlycm9yU2Vncy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsZXQgdG9wc0J5SW5zdGFuY2VJZCA9IGJ1aWxkQWJzb2x1dGVUb3BIYXNoKGNvbFBsYWNlbWVudHMpOyAvLyBUT0RPOiBjYWNoZSB0aGlzIGF0IGZpcnN0IHJlbmRlcj9cbiAgICByZXR1cm4gbWlycm9yU2Vncy5tYXAoKHNlZykgPT4gKHtcbiAgICAgICAgc2VnLFxuICAgICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICAgIGlzQWJzb2x1dGU6IHRydWUsXG4gICAgICAgIGFic29sdXRlVG9wOiB0b3BzQnlJbnN0YW5jZUlkW3NlZy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWRdLFxuICAgICAgICBtYXJnaW5Ub3A6IDAsXG4gICAgfSkpO1xufVxuZnVuY3Rpb24gYnVpbGRBYnNvbHV0ZVRvcEhhc2goY29sUGxhY2VtZW50cykge1xuICAgIGxldCB0b3BzQnlJbnN0YW5jZUlkID0ge307XG4gICAgZm9yIChsZXQgcGxhY2VtZW50cyBvZiBjb2xQbGFjZW1lbnRzKSB7XG4gICAgICAgIGZvciAobGV0IHBsYWNlbWVudCBvZiBwbGFjZW1lbnRzKSB7XG4gICAgICAgICAgICB0b3BzQnlJbnN0YW5jZUlkW3BsYWNlbWVudC5zZWcuZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkXSA9IHBsYWNlbWVudC5hYnNvbHV0ZVRvcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG9wc0J5SW5zdGFuY2VJZDtcbn1cblxuY2xhc3MgVGFibGVSb3dzIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkRhdGVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnNwbGl0QnVzaW5lc3NIb3VyU2VncyA9IGludGVybmFsX2Nqcy5tZW1vaXplKHNwbGl0U2Vnc0J5Um93KTtcbiAgICAgICAgdGhpcy5zcGxpdEJnRXZlbnRTZWdzID0gaW50ZXJuYWxfY2pzLm1lbW9pemUoc3BsaXRTZWdzQnlSb3cpO1xuICAgICAgICB0aGlzLnNwbGl0RmdFdmVudFNlZ3MgPSBpbnRlcm5hbF9janMubWVtb2l6ZShzcGxpdFNlZ3NCeVJvdyk7XG4gICAgICAgIHRoaXMuc3BsaXREYXRlU2VsZWN0aW9uU2VncyA9IGludGVybmFsX2Nqcy5tZW1vaXplKHNwbGl0U2Vnc0J5Um93KTtcbiAgICAgICAgdGhpcy5zcGxpdEV2ZW50RHJhZyA9IGludGVybmFsX2Nqcy5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeVJvdyk7XG4gICAgICAgIHRoaXMuc3BsaXRFdmVudFJlc2l6ZSA9IGludGVybmFsX2Nqcy5tZW1vaXplKHNwbGl0SW50ZXJhY3Rpb25CeVJvdyk7XG4gICAgICAgIHRoaXMucm93UmVmcyA9IG5ldyBpbnRlcm5hbF9janMuUmVmTWFwKCk7XG4gICAgfVxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IHsgcHJvcHMsIGNvbnRleHQgfSA9IHRoaXM7XG4gICAgICAgIGxldCByb3dDbnQgPSBwcm9wcy5jZWxscy5sZW5ndGg7XG4gICAgICAgIGxldCBidXNpbmVzc0hvdXJTZWdzQnlSb3cgPSB0aGlzLnNwbGl0QnVzaW5lc3NIb3VyU2Vncyhwcm9wcy5idXNpbmVzc0hvdXJTZWdzLCByb3dDbnQpO1xuICAgICAgICBsZXQgYmdFdmVudFNlZ3NCeVJvdyA9IHRoaXMuc3BsaXRCZ0V2ZW50U2Vncyhwcm9wcy5iZ0V2ZW50U2Vncywgcm93Q250KTtcbiAgICAgICAgbGV0IGZnRXZlbnRTZWdzQnlSb3cgPSB0aGlzLnNwbGl0RmdFdmVudFNlZ3MocHJvcHMuZmdFdmVudFNlZ3MsIHJvd0NudCk7XG4gICAgICAgIGxldCBkYXRlU2VsZWN0aW9uU2Vnc0J5Um93ID0gdGhpcy5zcGxpdERhdGVTZWxlY3Rpb25TZWdzKHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCByb3dDbnQpO1xuICAgICAgICBsZXQgZXZlbnREcmFnQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnREcmFnKHByb3BzLmV2ZW50RHJhZywgcm93Q250KTtcbiAgICAgICAgbGV0IGV2ZW50UmVzaXplQnlSb3cgPSB0aGlzLnNwbGl0RXZlbnRSZXNpemUocHJvcHMuZXZlbnRSZXNpemUsIHJvd0NudCk7XG4gICAgICAgIC8vIGZvciBEYXlHcmlkIHZpZXcgd2l0aCBtYW55IHJvd3MsIGZvcmNlIGEgbWluLWhlaWdodCBvbiBjZWxscyBzbyBkb2Vzbid0IGFwcGVhciBzcXVpc2hlZFxuICAgICAgICAvLyBjaG9vc2UgNyBiZWNhdXNlIGEgbW9udGggdmlldyB3aWxsIGhhdmUgbWF4IDYgcm93c1xuICAgICAgICBsZXQgY2VsbE1pbkhlaWdodCA9IChyb3dDbnQgPj0gNyAmJiBwcm9wcy5jbGllbnRXaWR0aCkgP1xuICAgICAgICAgICAgcHJvcHMuY2xpZW50V2lkdGggLyBjb250ZXh0Lm9wdGlvbnMuYXNwZWN0UmF0aW8gLyA2IDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgICAgIHJldHVybiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5Ob3dUaW1lciwgeyB1bml0OiBcImRheVwiIH0sIChub3dEYXRlLCB0b2RheVJhbmdlKSA9PiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KHByZWFjdF9janMuRnJhZ21lbnQsIG51bGwsIHByb3BzLmNlbGxzLm1hcCgoY2VsbHMsIHJvdykgPT4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChUYWJsZVJvdywgeyByZWY6IHRoaXMucm93UmVmcy5jcmVhdGVSZWYocm93KSwga2V5OiBjZWxscy5sZW5ndGhcbiAgICAgICAgICAgICAgICA/IGNlbGxzWzBdLmRhdGUudG9JU09TdHJpbmcoKSAvKiBiZXN0PyBvciBwdXQga2V5IG9uIGNlbGw/IG9yIHVzZSBkaWZmIGZvcm1hdHRlcj8gKi9cbiAgICAgICAgICAgICAgICA6IHJvdyAvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjZWxscyAobGlrZSB3aGVuIHJlc291cmNlIHZpZXcgaXMgbG9hZGluZylcbiAgICAgICAgICAgICwgc2hvd0RheU51bWJlcnM6IHJvd0NudCA+IDEsIHNob3dXZWVrTnVtYmVyczogcHJvcHMuc2hvd1dlZWtOdW1iZXJzLCB0b2RheVJhbmdlOiB0b2RheVJhbmdlLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGNlbGxzOiBjZWxscywgcmVuZGVySW50cm86IHByb3BzLnJlbmRlclJvd0ludHJvLCBidXNpbmVzc0hvdXJTZWdzOiBidXNpbmVzc0hvdXJTZWdzQnlSb3dbcm93XSwgZXZlbnRTZWxlY3Rpb246IHByb3BzLmV2ZW50U2VsZWN0aW9uLCBiZ0V2ZW50U2VnczogYmdFdmVudFNlZ3NCeVJvd1tyb3ddLmZpbHRlcihpc1NlZ0FsbERheSkgLyogaGFjayAqLywgZmdFdmVudFNlZ3M6IGZnRXZlbnRTZWdzQnlSb3dbcm93XSwgZGF0ZVNlbGVjdGlvblNlZ3M6IGRhdGVTZWxlY3Rpb25TZWdzQnlSb3dbcm93XSwgZXZlbnREcmFnOiBldmVudERyYWdCeVJvd1tyb3ddLCBldmVudFJlc2l6ZTogZXZlbnRSZXNpemVCeVJvd1tyb3ddLCBkYXlNYXhFdmVudHM6IHByb3BzLmRheU1heEV2ZW50cywgZGF5TWF4RXZlbnRSb3dzOiBwcm9wcy5kYXlNYXhFdmVudFJvd3MsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGNlbGxNaW5IZWlnaHQ6IGNlbGxNaW5IZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSkpKSkpKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIC8vIEhBQ0s6IG5lZWQgYSBkYXlncmlkIHdyYXBwZXIgcGFyZW50IHRvIGRvIHBvc2l0aW9uaW5nXG4gICAgICAgIC8vIE5PVEU6IGEgZGF5Z3JpZCByZXNvdXJjZSB2aWV3IHcvbyByZXNvdXJjZXMgY2FuIGhhdmUgemVybyBjZWxsc1xuICAgICAgICBjb25zdCBmaXJzdENlbGxFbCA9IHRoaXMucm93UmVmcy5jdXJyZW50TWFwWzBdLmdldENlbGxFbHMoKVswXTtcbiAgICAgICAgdGhpcy5yb290RWwgPSBmaXJzdENlbGxFbCA/IGZpcnN0Q2VsbEVsLmNsb3Nlc3QoJy5mYy1kYXlncmlkLWJvZHknKSA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnJvb3RFbCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQodGhpcywge1xuICAgICAgICAgICAgICAgIGVsOiB0aGlzLnJvb3RFbCxcbiAgICAgICAgICAgICAgICBpc0hpdENvbWJvQWxsb3dlZDogdGhpcy5wcm9wcy5pc0hpdENvbWJvQWxsb3dlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5yb290RWwpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC51bnJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnJvb3RFbCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gSGl0IFN5c3RlbVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBwcmVwYXJlSGl0cygpIHtcbiAgICAgICAgdGhpcy5yb3dQb3NpdGlvbnMgPSBuZXcgaW50ZXJuYWxfY2pzLlBvc2l0aW9uQ2FjaGUodGhpcy5yb290RWwsIHRoaXMucm93UmVmcy5jb2xsZWN0KCkubWFwKChyb3dPYmopID0+IHJvd09iai5nZXRDZWxsRWxzKClbMF0pLCAvLyBmaXJzdCBjZWxsIGVsIGluIGVhY2ggcm93LiBUT0RPOiBub3Qgb3B0aW1hbFxuICAgICAgICBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29sUG9zaXRpb25zID0gbmV3IGludGVybmFsX2Nqcy5Qb3NpdGlvbkNhY2hlKHRoaXMucm9vdEVsLCB0aGlzLnJvd1JlZnMuY3VycmVudE1hcFswXS5nZXRDZWxsRWxzKCksIC8vIGNlbGwgZWxzIGluIGZpcnN0IHJvd1xuICAgICAgICB0cnVlLCAvLyBob3Jpem9udGFsXG4gICAgICAgIGZhbHNlKTtcbiAgICB9XG4gICAgcXVlcnlIaXQocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCkge1xuICAgICAgICBsZXQgeyBjb2xQb3NpdGlvbnMsIHJvd1Bvc2l0aW9ucyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGNvbCA9IGNvbFBvc2l0aW9ucy5sZWZ0VG9JbmRleChwb3NpdGlvbkxlZnQpO1xuICAgICAgICBsZXQgcm93ID0gcm93UG9zaXRpb25zLnRvcFRvSW5kZXgocG9zaXRpb25Ub3ApO1xuICAgICAgICBpZiAocm93ICE9IG51bGwgJiYgY29sICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjZWxsID0gdGhpcy5wcm9wcy5jZWxsc1tyb3ddW2NvbF07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRhdGVQcm9maWxlOiB0aGlzLnByb3BzLmRhdGVQcm9maWxlLFxuICAgICAgICAgICAgICAgIGRhdGVTcGFuOiBPYmplY3QuYXNzaWduKHsgcmFuZ2U6IHRoaXMuZ2V0Q2VsbFJhbmdlKHJvdywgY29sKSwgYWxsRGF5OiB0cnVlIH0sIGNlbGwuZXh0cmFEYXRlU3BhbiksXG4gICAgICAgICAgICAgICAgZGF5RWw6IHRoaXMuZ2V0Q2VsbEVsKHJvdywgY29sKSxcbiAgICAgICAgICAgICAgICByZWN0OiB7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IGNvbFBvc2l0aW9ucy5sZWZ0c1tjb2xdLFxuICAgICAgICAgICAgICAgICAgICByaWdodDogY29sUG9zaXRpb25zLnJpZ2h0c1tjb2xdLFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHJvd1Bvc2l0aW9ucy50b3BzW3Jvd10sXG4gICAgICAgICAgICAgICAgICAgIGJvdHRvbTogcm93UG9zaXRpb25zLmJvdHRvbXNbcm93XSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxheWVyOiAwLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0Q2VsbEVsKHJvdywgY29sKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd1JlZnMuY3VycmVudE1hcFtyb3ddLmdldENlbGxFbHMoKVtjb2xdOyAvLyBUT0RPOiBub3Qgb3B0aW1hbFxuICAgIH1cbiAgICBnZXRDZWxsUmFuZ2Uocm93LCBjb2wpIHtcbiAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5wcm9wcy5jZWxsc1tyb3ddW2NvbF0uZGF0ZTtcbiAgICAgICAgbGV0IGVuZCA9IGludGVybmFsX2Nqcy5hZGREYXlzKHN0YXJ0LCAxKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzU2VnQWxsRGF5KHNlZykge1xuICAgIHJldHVybiBzZWcuZXZlbnRSYW5nZS5kZWYuYWxsRGF5O1xufVxuXG5jbGFzcyBUYWJsZSBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5lbFJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgICAgIHRoaXMubmVlZHNTY3JvbGxSZXNldCA9IGZhbHNlO1xuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB7IHByb3BzIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBkYXlNYXhFdmVudFJvd3MsIGRheU1heEV2ZW50cywgZXhwYW5kUm93cyB9ID0gcHJvcHM7XG4gICAgICAgIGxldCBsaW1pdFZpYUJhbGFuY2VkID0gZGF5TWF4RXZlbnRzID09PSB0cnVlIHx8IGRheU1heEV2ZW50Um93cyA9PT0gdHJ1ZTtcbiAgICAgICAgLy8gaWYgcm93cyBjYW4ndCBleHBhbmQgdG8gZmlsbCBmaXhlZCBoZWlnaHQsIGNhbid0IGRvIGJhbGFuY2VkLWhlaWdodCBldmVudCBsaW1pdFxuICAgICAgICAvLyBUT0RPOiBiZXN0IHBsYWNlIHRvIG5vcm1hbGl6ZSB0aGVzZSBvcHRpb25zP1xuICAgICAgICBpZiAobGltaXRWaWFCYWxhbmNlZCAmJiAhZXhwYW5kUm93cykge1xuICAgICAgICAgICAgbGltaXRWaWFCYWxhbmNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZGF5TWF4RXZlbnRSb3dzID0gbnVsbDtcbiAgICAgICAgICAgIGRheU1heEV2ZW50cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNsYXNzTmFtZXMgPSBbXG4gICAgICAgICAgICAnZmMtZGF5Z3JpZC1ib2R5JyxcbiAgICAgICAgICAgIGxpbWl0VmlhQmFsYW5jZWQgPyAnZmMtZGF5Z3JpZC1ib2R5LWJhbGFuY2VkJyA6ICdmYy1kYXlncmlkLWJvZHktdW5iYWxhbmNlZCcsXG4gICAgICAgICAgICBleHBhbmRSb3dzID8gJycgOiAnZmMtZGF5Z3JpZC1ib2R5LW5hdHVyYWwnLCAvLyB3aWxsIGhlaWdodCBvZiBvbmUgcm93IGRlcGVuZCBvbiB0aGUgb3RoZXJzP1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gKHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IHJlZjogdGhpcy5lbFJlZiwgY2xhc3NOYW1lOiBjbGFzc05hbWVzLmpvaW4oJyAnKSwgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAvLyB0aGVzZSBwcm9wcyBhcmUgaW1wb3J0YW50IHRvIGdpdmUgdGhpcyB3cmFwcGVyIGNvcnJlY3QgZGltZW5zaW9ucyBmb3IgaW50ZXJhY3Rpb25zXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogaWYgd2Ugc2V0IGl0IGhlcmUsIGNhbiB3ZSBhdm9pZCBnaXZpbmcgdG8gaW5uZXIgdGFibGVzP1xuICAgICAgICAgICAgICAgIHdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCxcbiAgICAgICAgICAgICAgICBtaW5XaWR0aDogcHJvcHMudGFibGVNaW5XaWR0aCxcbiAgICAgICAgICAgIH0gfSxcbiAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcInRhYmxlXCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiwgY2xhc3NOYW1lOiBcImZjLXNjcm9sbGdyaWQtc3luYy10YWJsZVwiLCBzdHlsZToge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcHJvcHMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGV4cGFuZFJvd3MgPyBwcm9wcy5jbGllbnRIZWlnaHQgOiAnJyxcbiAgICAgICAgICAgICAgICB9IH0sXG4gICAgICAgICAgICAgICAgcHJvcHMuY29sR3JvdXBOb2RlLFxuICAgICAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChcInRib2R5XCIsIHsgcm9sZTogXCJwcmVzZW50YXRpb25cIiB9LFxuICAgICAgICAgICAgICAgICAgICBwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoVGFibGVSb3dzLCB7IGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgY2VsbHM6IHByb3BzLmNlbGxzLCByZW5kZXJSb3dJbnRybzogcHJvcHMucmVuZGVyUm93SW50cm8sIHNob3dXZWVrTnVtYmVyczogcHJvcHMuc2hvd1dlZWtOdW1iZXJzLCBjbGllbnRXaWR0aDogcHJvcHMuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogcHJvcHMuY2xpZW50SGVpZ2h0LCBidXNpbmVzc0hvdXJTZWdzOiBwcm9wcy5idXNpbmVzc0hvdXJTZWdzLCBiZ0V2ZW50U2VnczogcHJvcHMuYmdFdmVudFNlZ3MsIGZnRXZlbnRTZWdzOiBwcm9wcy5mZ0V2ZW50U2VncywgZGF0ZVNlbGVjdGlvblNlZ3M6IHByb3BzLmRhdGVTZWxlY3Rpb25TZWdzLCBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sIGV2ZW50RHJhZzogcHJvcHMuZXZlbnREcmFnLCBldmVudFJlc2l6ZTogcHJvcHMuZXZlbnRSZXNpemUsIGRheU1heEV2ZW50czogZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3M6IGRheU1heEV2ZW50Um93cywgZm9yUHJpbnQ6IHByb3BzLmZvclByaW50LCBpc0hpdENvbWJvQWxsb3dlZDogcHJvcHMuaXNIaXRDb21ib0FsbG93ZWQgfSkpKSkpO1xuICAgIH1cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0U2Nyb2xsUmVzZXQoKTtcbiAgICB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgICBpZiAocHJldlByb3BzLmRhdGVQcm9maWxlICE9PSB0aGlzLnByb3BzLmRhdGVQcm9maWxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RTY3JvbGxSZXNldCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbHVzaFNjcm9sbFJlc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdFNjcm9sbFJlc2V0KCkge1xuICAgICAgICB0aGlzLm5lZWRzU2Nyb2xsUmVzZXQgPSB0cnVlO1xuICAgICAgICB0aGlzLmZsdXNoU2Nyb2xsUmVzZXQoKTtcbiAgICB9XG4gICAgZmx1c2hTY3JvbGxSZXNldCgpIHtcbiAgICAgICAgaWYgKHRoaXMubmVlZHNTY3JvbGxSZXNldCAmJlxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jbGllbnRXaWR0aCAvLyBzaXplcyBjb21wdXRlZD9cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJqZWN0RWwgPSBnZXRTY3JvbGxTdWJqZWN0RWwodGhpcy5lbFJlZi5jdXJyZW50LCB0aGlzLnByb3BzLmRhdGVQcm9maWxlKTtcbiAgICAgICAgICAgIGlmIChzdWJqZWN0RWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5FbCA9IHN1YmplY3RFbC5jbG9zZXN0KCcuZmMtZGF5Z3JpZC1ib2R5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRWwgPSBvcmlnaW5FbC5jbG9zZXN0KCcuZmMtc2Nyb2xsZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBzdWJqZWN0RWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC1cbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgICAgICAgICAgIHNjcm9sbEVsLnNjcm9sbFRvcCA9IHNjcm9sbFRvcCA/IChzY3JvbGxUb3AgKyAxKSA6IDA7IC8vIG92ZXJjb21lIGJvcmRlclxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZWVkc1Njcm9sbFJlc2V0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBnZXRTY3JvbGxTdWJqZWN0RWwoY29udGFpbmVyRWwsIGRhdGVQcm9maWxlKSB7XG4gICAgbGV0IGVsO1xuICAgIGlmIChkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2VVbml0Lm1hdGNoKC95ZWFyfG1vbnRoLykpIHtcbiAgICAgICAgZWwgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1kYXRlPVwiJHtpbnRlcm5hbF9janMuZm9ybWF0SXNvTW9udGhTdHIoZGF0ZVByb2ZpbGUuY3VycmVudERhdGUpfS0wMVwiXWApO1xuICAgICAgICAvLyBldmVuIGlmIHZpZXcgaXMgbW9udGgtYmFzZWQsIGZpcnN0LW9mLW1vbnRoIG1pZ2h0IGJlIGhpZGRlbi4uLlxuICAgIH1cbiAgICBpZiAoIWVsKSB7XG4gICAgICAgIGVsID0gY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcihgW2RhdGEtZGF0ZT1cIiR7aW50ZXJuYWxfY2pzLmZvcm1hdERheVN0cmluZyhkYXRlUHJvZmlsZS5jdXJyZW50RGF0ZSl9XCJdYCk7XG4gICAgICAgIC8vIGNvdWxkIHN0aWxsIGJlIGhpZGRlbiBpZiBhbiBpbnRlcmlvci12aWV3IGhpZGRlbiBkYXlcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xufVxuXG5jbGFzcyBEYXlUYWJsZVNsaWNlciBleHRlbmRzIGludGVybmFsX2Nqcy5TbGljZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmZvcmNlRGF5SWZMaXN0SXRlbSA9IHRydWU7XG4gICAgfVxuICAgIHNsaWNlUmFuZ2UoZGF0ZVJhbmdlLCBkYXlUYWJsZU1vZGVsKSB7XG4gICAgICAgIHJldHVybiBkYXlUYWJsZU1vZGVsLnNsaWNlUmFuZ2UoZGF0ZVJhbmdlKTtcbiAgICB9XG59XG5cbmNsYXNzIERheVRhYmxlIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkRhdGVDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnNsaWNlciA9IG5ldyBEYXlUYWJsZVNsaWNlcigpO1xuICAgICAgICB0aGlzLnRhYmxlUmVmID0gcHJlYWN0X2Nqcy5jcmVhdGVSZWYoKTtcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoVGFibGUsIE9iamVjdC5hc3NpZ24oeyByZWY6IHRoaXMudGFibGVSZWYgfSwgdGhpcy5zbGljZXIuc2xpY2VQcm9wcyhwcm9wcywgcHJvcHMuZGF0ZVByb2ZpbGUsIHByb3BzLm5leHREYXlUaHJlc2hvbGQsIGNvbnRleHQsIHByb3BzLmRheVRhYmxlTW9kZWwpLCB7IGRhdGVQcm9maWxlOiBwcm9wcy5kYXRlUHJvZmlsZSwgY2VsbHM6IHByb3BzLmRheVRhYmxlTW9kZWwuY2VsbHMsIGNvbEdyb3VwTm9kZTogcHJvcHMuY29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBwcm9wcy50YWJsZU1pbldpZHRoLCByZW5kZXJSb3dJbnRybzogcHJvcHMucmVuZGVyUm93SW50cm8sIGRheU1heEV2ZW50czogcHJvcHMuZGF5TWF4RXZlbnRzLCBkYXlNYXhFdmVudFJvd3M6IHByb3BzLmRheU1heEV2ZW50Um93cywgc2hvd1dlZWtOdW1iZXJzOiBwcm9wcy5zaG93V2Vla051bWJlcnMsIGV4cGFuZFJvd3M6IHByb3BzLmV4cGFuZFJvd3MsIGhlYWRlckFsaWduRWxSZWY6IHByb3BzLmhlYWRlckFsaWduRWxSZWYsIGNsaWVudFdpZHRoOiBwcm9wcy5jbGllbnRXaWR0aCwgY2xpZW50SGVpZ2h0OiBwcm9wcy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSkpO1xuICAgIH1cbn1cblxuY2xhc3MgVGFibGVEYXRlUHJvZmlsZUdlbmVyYXRvciBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlUHJvZmlsZUdlbmVyYXRvciB7XG4gICAgLy8gQ29tcHV0ZXMgdGhlIGRhdGUgcmFuZ2UgdGhhdCB3aWxsIGJlIHJlbmRlcmVkXG4gICAgYnVpbGRSZW5kZXJSYW5nZShjdXJyZW50UmFuZ2UsIGN1cnJlbnRSYW5nZVVuaXQsIGlzUmFuZ2VBbGxEYXkpIHtcbiAgICAgICAgbGV0IHJlbmRlclJhbmdlID0gc3VwZXIuYnVpbGRSZW5kZXJSYW5nZShjdXJyZW50UmFuZ2UsIGN1cnJlbnRSYW5nZVVuaXQsIGlzUmFuZ2VBbGxEYXkpO1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGJ1aWxkRGF5VGFibGVSZW5kZXJSYW5nZSh7XG4gICAgICAgICAgICBjdXJyZW50UmFuZ2U6IHJlbmRlclJhbmdlLFxuICAgICAgICAgICAgc25hcFRvV2VlazogL14oeWVhcnxtb250aCkkLy50ZXN0KGN1cnJlbnRSYW5nZVVuaXQpLFxuICAgICAgICAgICAgZml4ZWRXZWVrQ291bnQ6IHByb3BzLmZpeGVkV2Vla0NvdW50LFxuICAgICAgICAgICAgZGF0ZUVudjogcHJvcHMuZGF0ZUVudixcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYnVpbGREYXlUYWJsZVJlbmRlclJhbmdlKHByb3BzKSB7XG4gICAgbGV0IHsgZGF0ZUVudiwgY3VycmVudFJhbmdlIH0gPSBwcm9wcztcbiAgICBsZXQgeyBzdGFydCwgZW5kIH0gPSBjdXJyZW50UmFuZ2U7XG4gICAgbGV0IGVuZE9mV2VlaztcbiAgICAvLyB5ZWFyIGFuZCBtb250aCB2aWV3cyBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHdlZWtzLiB0aGlzIGlzIGFscmVhZHkgZG9uZSBmb3Igd2Vla1xuICAgIGlmIChwcm9wcy5zbmFwVG9XZWVrKSB7XG4gICAgICAgIHN0YXJ0ID0gZGF0ZUVudi5zdGFydE9mV2VlayhzdGFydCk7XG4gICAgICAgIC8vIG1ha2UgZW5kLW9mLXdlZWsgaWYgbm90IGFscmVhZHlcbiAgICAgICAgZW5kT2ZXZWVrID0gZGF0ZUVudi5zdGFydE9mV2VlayhlbmQpO1xuICAgICAgICBpZiAoZW5kT2ZXZWVrLnZhbHVlT2YoKSAhPT0gZW5kLnZhbHVlT2YoKSkge1xuICAgICAgICAgICAgZW5kID0gaW50ZXJuYWxfY2pzLmFkZFdlZWtzKGVuZE9mV2VlaywgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZW5zdXJlIDYgd2Vla3NcbiAgICBpZiAocHJvcHMuZml4ZWRXZWVrQ291bnQpIHtcbiAgICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiB0aGVzZSBkYXRlLW1hdGggZ3ltbmFzdGljcyAoZm9yIG11bHRpbW9udGggdmlldyksXG4gICAgICAgIC8vIGNvbXB1dGUgZGF0ZXByb2ZpbGVzIG9mIGFsbCBtb250aHMsIHRoZW4gdXNlIHN0YXJ0IG9mIGZpcnN0IGFuZCBlbmQgb2YgbGFzdC5cbiAgICAgICAgbGV0IGxhc3RNb250aFJlbmRlclN0YXJ0ID0gZGF0ZUVudi5zdGFydE9mV2VlayhkYXRlRW52LnN0YXJ0T2ZNb250aChpbnRlcm5hbF9janMuYWRkRGF5cyhjdXJyZW50UmFuZ2UuZW5kLCAtMSkpKTtcbiAgICAgICAgbGV0IHJvd0NudCA9IE1hdGguY2VpbCgvLyBjb3VsZCBiZSBwYXJ0aWFsIHdlZWtzIGR1ZSB0byBoaWRkZW5EYXlzXG4gICAgICAgIGludGVybmFsX2Nqcy5kaWZmV2Vla3MobGFzdE1vbnRoUmVuZGVyU3RhcnQsIGVuZCkpO1xuICAgICAgICBlbmQgPSBpbnRlcm5hbF9janMuYWRkV2Vla3MoZW5kLCA2IC0gcm93Q250KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xufVxuXG4vKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgdGhlIGRheWdyaWQgdmlld3MsIGFzIHdlbGwgYXMgbW9udGggdmlldy4gUmVuZGVycyBvbmUgb3IgbW9yZSByb3dzIG9mIGRheSBjZWxscy5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLy8gSXQgaXMgYSBtYW5hZ2VyIGZvciBhIFRhYmxlIHN1YmNvbXBvbmVudCwgd2hpY2ggZG9lcyBtb3N0IG9mIHRoZSBoZWF2eSBsaWZ0aW5nLlxuLy8gSXQgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHdpZHRoL2hlaWdodC5cbmNsYXNzIFRhYmxlVmlldyBleHRlbmRzIGludGVybmFsX2Nqcy5EYXRlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5oZWFkZXJFbFJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgfVxuICAgIHJlbmRlclNpbXBsZUxheW91dChoZWFkZXJSb3dDb250ZW50LCBib2R5Q29udGVudCkge1xuICAgICAgICBsZXQgeyBwcm9wcywgY29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHNlY3Rpb25zID0gW107XG4gICAgICAgIGxldCBzdGlja3lIZWFkZXJEYXRlcyA9IGludGVybmFsX2Nqcy5nZXRTdGlja3lIZWFkZXJEYXRlcyhjb250ZXh0Lm9wdGlvbnMpO1xuICAgICAgICBpZiAoaGVhZGVyUm93Q29udGVudCkge1xuICAgICAgICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAga2V5OiAnaGVhZGVyJyxcbiAgICAgICAgICAgICAgICBpc1N0aWNreTogc3RpY2t5SGVhZGVyRGF0ZXMsXG4gICAgICAgICAgICAgICAgY2h1bms6IHtcbiAgICAgICAgICAgICAgICAgICAgZWxSZWY6IHRoaXMuaGVhZGVyRWxSZWYsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlQ2xhc3NOYW1lOiAnZmMtY29sLWhlYWRlcicsXG4gICAgICAgICAgICAgICAgICAgIHJvd0NvbnRlbnQ6IGhlYWRlclJvd0NvbnRlbnQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2JvZHknLFxuICAgICAgICAgICAga2V5OiAnYm9keScsXG4gICAgICAgICAgICBsaXF1aWQ6IHRydWUsXG4gICAgICAgICAgICBjaHVuazogeyBjb250ZW50OiBib2R5Q29udGVudCB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxfY2pzLlZpZXdDb250YWluZXIsIHsgZWxDbGFzc2VzOiBbJ2ZjLWRheWdyaWQnXSwgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMgfSxcbiAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChpbnRlcm5hbF9janMuU2ltcGxlU2Nyb2xsR3JpZCwgeyBsaXF1aWQ6ICFwcm9wcy5pc0hlaWdodEF1dG8gJiYgIXByb3BzLmZvclByaW50LCBjb2xsYXBzaWJsZVdpZHRoOiBwcm9wcy5mb3JQcmludCwgY29sczogW10gLyogVE9ETzogbWFrZSBvcHRpb25hbD8gKi8sIHNlY3Rpb25zOiBzZWN0aW9ucyB9KSkpO1xuICAgIH1cbiAgICByZW5kZXJIU2Nyb2xsTGF5b3V0KGhlYWRlclJvd0NvbnRlbnQsIGJvZHlDb250ZW50LCBjb2xDbnQsIGRheU1pbldpZHRoKSB7XG4gICAgICAgIGxldCBTY3JvbGxHcmlkID0gdGhpcy5jb250ZXh0LnBsdWdpbkhvb2tzLnNjcm9sbEdyaWRJbXBsO1xuICAgICAgICBpZiAoIVNjcm9sbEdyaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gU2Nyb2xsR3JpZCBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCB7IHByb3BzLCBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICBsZXQgc3RpY2t5SGVhZGVyRGF0ZXMgPSAhcHJvcHMuZm9yUHJpbnQgJiYgaW50ZXJuYWxfY2pzLmdldFN0aWNreUhlYWRlckRhdGVzKGNvbnRleHQub3B0aW9ucyk7XG4gICAgICAgIGxldCBzdGlja3lGb290ZXJTY3JvbGxiYXIgPSAhcHJvcHMuZm9yUHJpbnQgJiYgaW50ZXJuYWxfY2pzLmdldFN0aWNreUZvb3RlclNjcm9sbGJhcihjb250ZXh0Lm9wdGlvbnMpO1xuICAgICAgICBsZXQgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgaWYgKGhlYWRlclJvd0NvbnRlbnQpIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdoZWFkZXInLFxuICAgICAgICAgICAgICAgIGtleTogJ2hlYWRlcicsXG4gICAgICAgICAgICAgICAgaXNTdGlja3k6IHN0aWNreUhlYWRlckRhdGVzLFxuICAgICAgICAgICAgICAgIGNodW5rczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxSZWY6IHRoaXMuaGVhZGVyRWxSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNsYXNzTmFtZTogJ2ZjLWNvbC1oZWFkZXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93Q29udGVudDogaGVhZGVyUm93Q29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6ICdib2R5JyxcbiAgICAgICAgICAgIGtleTogJ2JvZHknLFxuICAgICAgICAgICAgbGlxdWlkOiB0cnVlLFxuICAgICAgICAgICAgY2h1bmtzOiBbe1xuICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogYm9keUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgfV0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc3RpY2t5Rm9vdGVyU2Nyb2xsYmFyKSB7XG4gICAgICAgICAgICBzZWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZm9vdGVyJyxcbiAgICAgICAgICAgICAgICBrZXk6ICdmb290ZXInLFxuICAgICAgICAgICAgICAgIGlzU3RpY2t5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGNodW5rczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogaW50ZXJuYWxfY2pzLnJlbmRlclNjcm9sbFNoaW0sXG4gICAgICAgICAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoaW50ZXJuYWxfY2pzLlZpZXdDb250YWluZXIsIHsgZWxDbGFzc2VzOiBbJ2ZjLWRheWdyaWQnXSwgdmlld1NwZWM6IGNvbnRleHQudmlld1NwZWMgfSxcbiAgICAgICAgICAgIHByZWFjdF9janMuY3JlYXRlRWxlbWVudChTY3JvbGxHcmlkLCB7IGxpcXVpZDogIXByb3BzLmlzSGVpZ2h0QXV0byAmJiAhcHJvcHMuZm9yUHJpbnQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCwgY29sbGFwc2libGVXaWR0aDogcHJvcHMuZm9yUHJpbnQsIGNvbEdyb3VwczogW3sgY29sczogW3sgc3BhbjogY29sQ250LCBtaW5XaWR0aDogZGF5TWluV2lkdGggfV0gfV0sIHNlY3Rpb25zOiBzZWN0aW9ucyB9KSkpO1xuICAgIH1cbn1cblxuY2xhc3MgRGF5VGFibGVWaWV3IGV4dGVuZHMgVGFibGVWaWV3IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5idWlsZERheVRhYmxlTW9kZWwgPSBpbnRlcm5hbF9janMubWVtb2l6ZShidWlsZERheVRhYmxlTW9kZWwpO1xuICAgICAgICB0aGlzLmhlYWRlclJlZiA9IHByZWFjdF9janMuY3JlYXRlUmVmKCk7XG4gICAgICAgIHRoaXMudGFibGVSZWYgPSBwcmVhY3RfY2pzLmNyZWF0ZVJlZigpO1xuICAgICAgICAvLyBjYW4ndCBvdmVycmlkZSBhbnkgbGlmZWN5Y2xlIG1ldGhvZHMgZnJvbSBwYXJlbnRcbiAgICB9XG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgeyBvcHRpb25zLCBkYXRlUHJvZmlsZUdlbmVyYXRvciB9ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBsZXQgeyBwcm9wcyB9ID0gdGhpcztcbiAgICAgICAgbGV0IGRheVRhYmxlTW9kZWwgPSB0aGlzLmJ1aWxkRGF5VGFibGVNb2RlbChwcm9wcy5kYXRlUHJvZmlsZSwgZGF0ZVByb2ZpbGVHZW5lcmF0b3IpO1xuICAgICAgICBsZXQgaGVhZGVyQ29udGVudCA9IG9wdGlvbnMuZGF5SGVhZGVycyAmJiAocHJlYWN0X2Nqcy5jcmVhdGVFbGVtZW50KGludGVybmFsX2Nqcy5EYXlIZWFkZXIsIHsgcmVmOiB0aGlzLmhlYWRlclJlZiwgZGF0ZVByb2ZpbGU6IHByb3BzLmRhdGVQcm9maWxlLCBkYXRlczogZGF5VGFibGVNb2RlbC5oZWFkZXJEYXRlcywgZGF0ZXNSZXBEaXN0aW5jdERheXM6IGRheVRhYmxlTW9kZWwucm93Q250ID09PSAxIH0pKTtcbiAgICAgICAgbGV0IGJvZHlDb250ZW50ID0gKGNvbnRlbnRBcmcpID0+IChwcmVhY3RfY2pzLmNyZWF0ZUVsZW1lbnQoRGF5VGFibGUsIHsgcmVmOiB0aGlzLnRhYmxlUmVmLCBkYXRlUHJvZmlsZTogcHJvcHMuZGF0ZVByb2ZpbGUsIGRheVRhYmxlTW9kZWw6IGRheVRhYmxlTW9kZWwsIGJ1c2luZXNzSG91cnM6IHByb3BzLmJ1c2luZXNzSG91cnMsIGRhdGVTZWxlY3Rpb246IHByb3BzLmRhdGVTZWxlY3Rpb24sIGV2ZW50U3RvcmU6IHByb3BzLmV2ZW50U3RvcmUsIGV2ZW50VWlCYXNlczogcHJvcHMuZXZlbnRVaUJhc2VzLCBldmVudFNlbGVjdGlvbjogcHJvcHMuZXZlbnRTZWxlY3Rpb24sIGV2ZW50RHJhZzogcHJvcHMuZXZlbnREcmFnLCBldmVudFJlc2l6ZTogcHJvcHMuZXZlbnRSZXNpemUsIG5leHREYXlUaHJlc2hvbGQ6IG9wdGlvbnMubmV4dERheVRocmVzaG9sZCwgY29sR3JvdXBOb2RlOiBjb250ZW50QXJnLnRhYmxlQ29sR3JvdXBOb2RlLCB0YWJsZU1pbldpZHRoOiBjb250ZW50QXJnLnRhYmxlTWluV2lkdGgsIGRheU1heEV2ZW50czogb3B0aW9ucy5kYXlNYXhFdmVudHMsIGRheU1heEV2ZW50Um93czogb3B0aW9ucy5kYXlNYXhFdmVudFJvd3MsIHNob3dXZWVrTnVtYmVyczogb3B0aW9ucy53ZWVrTnVtYmVycywgZXhwYW5kUm93czogIXByb3BzLmlzSGVpZ2h0QXV0bywgaGVhZGVyQWxpZ25FbFJlZjogdGhpcy5oZWFkZXJFbFJlZiwgY2xpZW50V2lkdGg6IGNvbnRlbnRBcmcuY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodDogY29udGVudEFyZy5jbGllbnRIZWlnaHQsIGZvclByaW50OiBwcm9wcy5mb3JQcmludCB9KSk7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmRheU1pbldpZHRoXG4gICAgICAgICAgICA/IHRoaXMucmVuZGVySFNjcm9sbExheW91dChoZWFkZXJDb250ZW50LCBib2R5Q29udGVudCwgZGF5VGFibGVNb2RlbC5jb2xDbnQsIG9wdGlvbnMuZGF5TWluV2lkdGgpXG4gICAgICAgICAgICA6IHRoaXMucmVuZGVyU2ltcGxlTGF5b3V0KGhlYWRlckNvbnRlbnQsIGJvZHlDb250ZW50KTtcbiAgICB9XG59XG5mdW5jdGlvbiBidWlsZERheVRhYmxlTW9kZWwoZGF0ZVByb2ZpbGUsIGRhdGVQcm9maWxlR2VuZXJhdG9yKSB7XG4gICAgbGV0IGRheVNlcmllcyA9IG5ldyBpbnRlcm5hbF9janMuRGF5U2VyaWVzTW9kZWwoZGF0ZVByb2ZpbGUucmVuZGVyUmFuZ2UsIGRhdGVQcm9maWxlR2VuZXJhdG9yKTtcbiAgICByZXR1cm4gbmV3IGludGVybmFsX2Nqcy5EYXlUYWJsZU1vZGVsKGRheVNlcmllcywgL3llYXJ8bW9udGh8d2Vlay8udGVzdChkYXRlUHJvZmlsZS5jdXJyZW50UmFuZ2VVbml0KSk7XG59XG5cbmV4cG9ydHMuRGF5R3JpZFZpZXcgPSBEYXlUYWJsZVZpZXc7XG5leHBvcnRzLkRheVRhYmxlID0gRGF5VGFibGU7XG5leHBvcnRzLkRheVRhYmxlU2xpY2VyID0gRGF5VGFibGVTbGljZXI7XG5leHBvcnRzLlRhYmxlID0gVGFibGU7XG5leHBvcnRzLlRhYmxlRGF0ZVByb2ZpbGVHZW5lcmF0b3IgPSBUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yO1xuZXhwb3J0cy5UYWJsZVJvd3MgPSBUYWJsZVJvd3M7XG5leHBvcnRzLlRhYmxlVmlldyA9IFRhYmxlVmlldztcbmV4cG9ydHMuYnVpbGREYXlUYWJsZU1vZGVsID0gYnVpbGREYXlUYWJsZU1vZGVsO1xuZXhwb3J0cy5idWlsZERheVRhYmxlUmVuZGVyUmFuZ2UgPSBidWlsZERheVRhYmxlUmVuZGVyUmFuZ2U7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBpbmRleF9janMgPSByZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2NvcmUvaW5kZXguY2pzJyk7XG52YXIgaW50ZXJuYWxfY2pzID0gcmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9jb3JlL2ludGVybmFsLmNqcycpO1xuXG5pbnRlcm5hbF9janMuY29uZmlnLnRvdWNoTW91c2VJZ25vcmVXYWl0ID0gNTAwO1xubGV0IGlnbm9yZU1vdXNlRGVwdGggPSAwO1xubGV0IGxpc3RlbmVyQ250ID0gMDtcbmxldCBpc1dpbmRvd1RvdWNoTW92ZUNhbmNlbGxlZCA9IGZhbHNlO1xuLypcblVzZXMgYSBcInBvaW50ZXJcIiBhYnN0cmFjdGlvbiwgd2hpY2ggbW9uaXRvcnMgVUkgZXZlbnRzIGZvciBib3RoIG1vdXNlIGFuZCB0b3VjaC5cblRyYWNrcyB3aGVuIHRoZSBwb2ludGVyIFwiZHJhZ3NcIiBvbiBhIGNlcnRhaW4gZWxlbWVudCwgbWVhbmluZyBkb3duK21vdmUrdXAuXG5cbkFsc28sIHRyYWNrcyBpZiB0aGVyZSB3YXMgdG91Y2gtc2Nyb2xsaW5nLlxuQWxzbywgY2FuIHByZXZlbnQgdG91Y2gtc2Nyb2xsaW5nIGZyb20gaGFwcGVuaW5nLlxuQWxzbywgY2FuIGZpcmUgcG9pbnRlcm1vdmUgZXZlbnRzIHdoZW4gc2Nyb2xsaW5nIGhhcHBlbnMgdW5kZXJuZWF0aCwgZXZlbiB3aGVuIG5vIHJlYWwgcG9pbnRlciBtb3ZlbWVudC5cblxuZW1pdHM6XG4tIHBvaW50ZXJkb3duXG4tIHBvaW50ZXJtb3ZlXG4tIHBvaW50ZXJ1cFxuKi9cbmNsYXNzIFBvaW50ZXJEcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyRWwpIHtcbiAgICAgICAgdGhpcy5zdWJqZWN0RWwgPSBudWxsO1xuICAgICAgICAvLyBvcHRpb25zIHRoYXQgY2FuIGJlIGRpcmVjdGx5IGFzc2lnbmVkIGJ5IGNhbGxlclxuICAgICAgICB0aGlzLnNlbGVjdG9yID0gJyc7IC8vIHdpbGwgY2F1c2Ugc3ViamVjdEVsIGluIGFsbCBlbWl0dGVkIGV2ZW50cyB0byBiZSB0aGlzIGVsZW1lbnRcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3RvciA9ICcnO1xuICAgICAgICB0aGlzLnNob3VsZElnbm9yZU1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG91bGRXYXRjaFNjcm9sbCA9IHRydWU7IC8vIGZvciBzaW11bGF0aW5nIHBvaW50ZXJtb3ZlIG9uIHNjcm9sbFxuICAgICAgICAvLyBpbnRlcm5hbCBzdGF0ZXNcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNUb3VjaERyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2FzVG91Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgLy8gTW91c2VcbiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB0aGlzLmhhbmRsZU1vdXNlRG93biA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZElnbm9yZU1vdXNlKCkgJiZcbiAgICAgICAgICAgICAgICBpc1ByaW1hcnlNb3VzZUJ1dHRvbihldikgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVN0YXJ0KGV2KSkge1xuICAgICAgICAgICAgICAgIGxldCBwZXYgPSB0aGlzLmNyZWF0ZUV2ZW50RnJvbU1vdXNlKGV2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBwZXYpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNjcm9sbFdhdGNoKHBldik7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNob3VsZElnbm9yZU1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVNb3VzZU1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCBwZXYgPSB0aGlzLmNyZWF0ZUV2ZW50RnJvbU1vdXNlKGV2KTtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkQ29vcmRzKHBldik7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcm1vdmUnLCBwZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZU1vdXNlVXAgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYpKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICB9O1xuICAgICAgICAvLyBUb3VjaFxuICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hTdGFydCA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJ5U3RhcnQoZXYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RvdWNoRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBwZXYgPSB0aGlzLmNyZWF0ZUV2ZW50RnJvbVRvdWNoKGV2LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcmRvd24nLCBwZXYpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNjcm9sbFdhdGNoKHBldik7XG4gICAgICAgICAgICAgICAgLy8gdW5saWtlIG1vdXNlLCBuZWVkIHRvIGF0dGFjaCB0byB0YXJnZXQsIG5vdCBkb2N1bWVudFxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80NTc2MDAxNFxuICAgICAgICAgICAgICAgIGxldCB0YXJnZXRFbCA9IGV2LnRhcmdldDtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhcmdldEVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoRW5kKTsgLy8gdHJlYXQgaXQgYXMgYSB0b3VjaCBlbmRcbiAgICAgICAgICAgICAgICAvLyBhdHRhY2ggYSBoYW5kbGVyIHRvIGdldCBjYWxsZWQgd2hlbiBBTlkgc2Nyb2xsIGFjdGlvbiBoYXBwZW5zIG9uIHRoZSBwYWdlLlxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2FzIGltcG9zc2libGUgdG8gZG8gd2l0aCBub3JtYWwgb24vb2ZmIGJlY2F1c2UgJ3Njcm9sbCcgZG9lc24ndCBidWJibGUuXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI5NTQ1NjUvOTYzNDJcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVUb3VjaFNjcm9sbCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hNb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgcGV2ID0gdGhpcy5jcmVhdGVFdmVudEZyb21Ub3VjaChldik7XG4gICAgICAgICAgICB0aGlzLnJlY29yZENvb3JkcyhwZXYpO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywgcGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVUb3VjaEVuZCA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZykgeyAvLyBkb25lIHRvIGd1YXJkIGFnYWluc3QgdG91Y2hlbmQgZm9sbG93ZWQgYnkgdG91Y2hjYW5jZWxcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0RWwgPSBldi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgICAgICAgICAgIHRhcmdldEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVUb3VjaEVuZCk7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLmhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVUb3VjaFNjcm9sbCwgdHJ1ZSk7IC8vIHVzZUNhcHR1cmVkPXRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgdGhpcy5jcmVhdGVFdmVudEZyb21Ub3VjaChldikpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpOyAvLyBjYWxsIGxhc3Qgc28gdGhhdCBwb2ludGVydXAgaGFzIGFjY2VzcyB0byBwcm9wc1xuICAgICAgICAgICAgICAgIHRoaXMuaXNUb3VjaERyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgc3RhcnRJZ25vcmluZ01vdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlVG91Y2hTY3JvbGwgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhc1RvdWNoU2Nyb2xsID0gdHJ1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGwgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhZ2VYID0gKHdpbmRvdy5wYWdlWE9mZnNldCAtIHRoaXMucHJldlNjcm9sbFgpICsgdGhpcy5wcmV2UGFnZVg7XG4gICAgICAgICAgICAgICAgbGV0IHBhZ2VZID0gKHdpbmRvdy5wYWdlWU9mZnNldCAtIHRoaXMucHJldlNjcm9sbFkpICsgdGhpcy5wcmV2UGFnZVk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJtb3ZlJywge1xuICAgICAgICAgICAgICAgICAgICBvcmlnRXZlbnQ6IGV2LFxuICAgICAgICAgICAgICAgICAgICBpc1RvdWNoOiB0aGlzLmlzVG91Y2hEcmFnZ2luZyxcbiAgICAgICAgICAgICAgICAgICAgc3ViamVjdEVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVgsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VZLFxuICAgICAgICAgICAgICAgICAgICBkZWx0YVg6IHBhZ2VYIC0gdGhpcy5vcmlnUGFnZVgsXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhWTogcGFnZVkgLSB0aGlzLm9yaWdQYWdlWSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbCA9IGNvbnRhaW5lckVsO1xuICAgICAgICB0aGlzLmVtaXR0ZXIgPSBuZXcgaW50ZXJuYWxfY2pzLkVtaXR0ZXIoKTtcbiAgICAgICAgY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgICAgICBjb250YWluZXJFbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIGxpc3RlbmVyQ3JlYXRlZCgpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUb3VjaFN0YXJ0LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIGxpc3RlbmVyRGVzdHJveWVkKCk7XG4gICAgfVxuICAgIHRyeVN0YXJ0KGV2KSB7XG4gICAgICAgIGxldCBzdWJqZWN0RWwgPSB0aGlzLnF1ZXJ5U3ViamVjdEVsKGV2KTtcbiAgICAgICAgbGV0IGRvd25FbCA9IGV2LnRhcmdldDtcbiAgICAgICAgaWYgKHN1YmplY3RFbCAmJlxuICAgICAgICAgICAgKCF0aGlzLmhhbmRsZVNlbGVjdG9yIHx8IGludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChkb3duRWwsIHRoaXMuaGFuZGxlU2VsZWN0b3IpKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJqZWN0RWwgPSBzdWJqZWN0RWw7XG4gICAgICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlOyAvLyBkbyB0aGlzIGZpcnN0IHNvIGNhbmNlbFRvdWNoU2Nyb2xsIHdpbGwgd29ya1xuICAgICAgICAgICAgdGhpcy53YXNUb3VjaFNjcm9sbCA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjbGVhbnVwKCkge1xuICAgICAgICBpc1dpbmRvd1RvdWNoTW92ZUNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJqZWN0RWwgPSBudWxsO1xuICAgICAgICAvLyBrZWVwIHdhc1RvdWNoU2Nyb2xsIGFyb3VuZCBmb3IgbGF0ZXIgYWNjZXNzXG4gICAgICAgIHRoaXMuZGVzdHJveVNjcm9sbFdhdGNoKCk7XG4gICAgfVxuICAgIHF1ZXJ5U3ViamVjdEVsKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxfY2pzLmVsZW1lbnRDbG9zZXN0KGV2LnRhcmdldCwgdGhpcy5zZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyRWw7XG4gICAgfVxuICAgIHNob3VsZElnbm9yZU1vdXNlKCkge1xuICAgICAgICByZXR1cm4gaWdub3JlTW91c2VEZXB0aCB8fCB0aGlzLmlzVG91Y2hEcmFnZ2luZztcbiAgICB9XG4gICAgLy8gY2FuIGJlIGNhbGxlZCBieSB1c2VyIG9mIHRoaXMgY2xhc3MsIHRvIGNhbmNlbCB0b3VjaC1iYXNlZCBzY3JvbGxpbmcgZm9yIHRoZSBjdXJyZW50IGRyYWdcbiAgICBjYW5jZWxUb3VjaFNjcm9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFNjcm9sbGluZyB0aGF0IHNpbXVsYXRlcyBwb2ludGVybW92ZXNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgaW5pdFNjcm9sbFdhdGNoKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFdhdGNoU2Nyb2xsKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZENvb3Jkcyhldik7XG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwsIHRydWUpOyAvLyB1c2VDYXB0dXJlPXRydWVcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWNvcmRDb29yZHMoZXYpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkV2F0Y2hTY3JvbGwpIHtcbiAgICAgICAgICAgIHRoaXMucHJldlBhZ2VYID0gZXYucGFnZVg7XG4gICAgICAgICAgICB0aGlzLnByZXZQYWdlWSA9IGV2LnBhZ2VZO1xuICAgICAgICAgICAgdGhpcy5wcmV2U2Nyb2xsWCA9IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICAgICAgICAgIHRoaXMucHJldlNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveVNjcm9sbFdhdGNoKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXYXRjaFNjcm9sbCkge1xuICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsLCB0cnVlKTsgLy8gdXNlQ2FwdHVyZWQ9dHJ1ZVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEV2ZW50IE5vcm1hbGl6YXRpb25cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY3JlYXRlRXZlbnRGcm9tTW91c2UoZXYsIGlzRmlyc3QpIHtcbiAgICAgICAgbGV0IGRlbHRhWCA9IDA7XG4gICAgICAgIGxldCBkZWx0YVkgPSAwO1xuICAgICAgICAvLyBUT0RPOiByZXBlYXQgY29kZVxuICAgICAgICBpZiAoaXNGaXJzdCkge1xuICAgICAgICAgICAgdGhpcy5vcmlnUGFnZVggPSBldi5wYWdlWDtcbiAgICAgICAgICAgIHRoaXMub3JpZ1BhZ2VZID0gZXYucGFnZVk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWx0YVggPSBldi5wYWdlWCAtIHRoaXMub3JpZ1BhZ2VYO1xuICAgICAgICAgICAgZGVsdGFZID0gZXYucGFnZVkgLSB0aGlzLm9yaWdQYWdlWTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgb3JpZ0V2ZW50OiBldixcbiAgICAgICAgICAgIGlzVG91Y2g6IGZhbHNlLFxuICAgICAgICAgICAgc3ViamVjdEVsOiB0aGlzLnN1YmplY3RFbCxcbiAgICAgICAgICAgIHBhZ2VYOiBldi5wYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZOiBldi5wYWdlWSxcbiAgICAgICAgICAgIGRlbHRhWCxcbiAgICAgICAgICAgIGRlbHRhWSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY3JlYXRlRXZlbnRGcm9tVG91Y2goZXYsIGlzRmlyc3QpIHtcbiAgICAgICAgbGV0IHRvdWNoZXMgPSBldi50b3VjaGVzO1xuICAgICAgICBsZXQgcGFnZVg7XG4gICAgICAgIGxldCBwYWdlWTtcbiAgICAgICAgbGV0IGRlbHRhWCA9IDA7XG4gICAgICAgIGxldCBkZWx0YVkgPSAwO1xuICAgICAgICAvLyBpZiB0b3VjaCBjb29yZHMgYXZhaWxhYmxlLCBwcmVmZXIsXG4gICAgICAgIC8vIGJlY2F1c2UgRkYgd291bGQgZ2l2ZSBiYWQgZXYucGFnZVggZXYucGFnZVlcbiAgICAgICAgaWYgKHRvdWNoZXMgJiYgdG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHBhZ2VYID0gdG91Y2hlc1swXS5wYWdlWDtcbiAgICAgICAgICAgIHBhZ2VZID0gdG91Y2hlc1swXS5wYWdlWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhZ2VYID0gZXYucGFnZVg7XG4gICAgICAgICAgICBwYWdlWSA9IGV2LnBhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IHJlcGVhdCBjb2RlXG4gICAgICAgIGlmIChpc0ZpcnN0KSB7XG4gICAgICAgICAgICB0aGlzLm9yaWdQYWdlWCA9IHBhZ2VYO1xuICAgICAgICAgICAgdGhpcy5vcmlnUGFnZVkgPSBwYWdlWTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRlbHRhWCA9IHBhZ2VYIC0gdGhpcy5vcmlnUGFnZVg7XG4gICAgICAgICAgICBkZWx0YVkgPSBwYWdlWSAtIHRoaXMub3JpZ1BhZ2VZO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmlnRXZlbnQ6IGV2LFxuICAgICAgICAgICAgaXNUb3VjaDogdHJ1ZSxcbiAgICAgICAgICAgIHN1YmplY3RFbDogdGhpcy5zdWJqZWN0RWwsXG4gICAgICAgICAgICBwYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZLFxuICAgICAgICAgICAgZGVsdGFYLFxuICAgICAgICAgICAgZGVsdGFZLFxuICAgICAgICB9O1xuICAgIH1cbn1cbi8vIFJldHVybnMgYSBib29sZWFuIHdoZXRoZXIgdGhpcyB3YXMgYSBsZWZ0IG1vdXNlIGNsaWNrIGFuZCBubyBjdHJsIGtleSAod2hpY2ggbWVhbnMgcmlnaHQgY2xpY2sgb24gTWFjKVxuZnVuY3Rpb24gaXNQcmltYXJ5TW91c2VCdXR0b24oZXYpIHtcbiAgICByZXR1cm4gZXYuYnV0dG9uID09PSAwICYmICFldi5jdHJsS2V5O1xufVxuLy8gSWdub3JpbmcgZmFrZSBtb3VzZSBldmVudHMgZ2VuZXJhdGVkIGJ5IHRvdWNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBzdGFydElnbm9yaW5nTW91c2UoKSB7XG4gICAgaWdub3JlTW91c2VEZXB0aCArPSAxO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZ25vcmVNb3VzZURlcHRoIC09IDE7XG4gICAgfSwgaW50ZXJuYWxfY2pzLmNvbmZpZy50b3VjaE1vdXNlSWdub3JlV2FpdCk7XG59XG4vLyBXZSB3YW50IHRvIGF0dGFjaCB0b3VjaG1vdmUgYXMgZWFybHkgYXMgcG9zc2libGUgZm9yIFNhZmFyaVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gbGlzdGVuZXJDcmVhdGVkKCkge1xuICAgIGxpc3RlbmVyQ250ICs9IDE7XG4gICAgaWYgKGxpc3RlbmVyQ250ID09PSAxKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvbldpbmRvd1RvdWNoTW92ZSwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcbiAgICB9XG59XG5mdW5jdGlvbiBsaXN0ZW5lckRlc3Ryb3llZCgpIHtcbiAgICBsaXN0ZW5lckNudCAtPSAxO1xuICAgIGlmICghbGlzdGVuZXJDbnQpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uV2luZG93VG91Y2hNb3ZlLCB7IHBhc3NpdmU6IGZhbHNlIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG9uV2luZG93VG91Y2hNb3ZlKGV2KSB7XG4gICAgaWYgKGlzV2luZG93VG91Y2hNb3ZlQ2FuY2VsbGVkKSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxufVxuXG4vKlxuQW4gZWZmZWN0IGluIHdoaWNoIGFuIGVsZW1lbnQgZm9sbG93cyB0aGUgbW92ZW1lbnQgb2YgYSBwb2ludGVyIGFjcm9zcyB0aGUgc2NyZWVuLlxuVGhlIG1vdmluZyBlbGVtZW50IGlzIGEgY2xvbmUgb2Ygc29tZSBvdGhlciBlbGVtZW50LlxuTXVzdCBjYWxsIHN0YXJ0ICsgaGFuZGxlTW92ZSArIHN0b3AuXG4qL1xuY2xhc3MgRWxlbWVudE1pcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7IC8vIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkXG4gICAgICAgIHRoaXMuc291cmNlRWwgPSBudWxsO1xuICAgICAgICB0aGlzLm1pcnJvckVsID0gbnVsbDtcbiAgICAgICAgdGhpcy5zb3VyY2VFbFJlY3QgPSBudWxsOyAvLyBzY3JlZW4gY29vcmRzIHJlbGF0aXZlIHRvIHZpZXdwb3J0XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGRpcmVjdGx5IGJ5IGNhbGxlclxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBkb2N1bWVudC5ib2R5OyAvLyBISUdITFkgU1VHR0VTVEVEIHRvIHNldCB0aGlzIHRvIHNpZGVzdGVwIFNoYWRvd0RPTSBpc3N1ZXNcbiAgICAgICAgdGhpcy56SW5kZXggPSA5OTk5O1xuICAgICAgICB0aGlzLnJldmVydER1cmF0aW9uID0gMDtcbiAgICB9XG4gICAgc3RhcnQoc291cmNlRWwsIHBhZ2VYLCBwYWdlWSkge1xuICAgICAgICB0aGlzLnNvdXJjZUVsID0gc291cmNlRWw7XG4gICAgICAgIHRoaXMuc291cmNlRWxSZWN0ID0gdGhpcy5zb3VyY2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgdGhpcy5vcmlnU2NyZWVuWCA9IHBhZ2VYIC0gd2luZG93LnBhZ2VYT2Zmc2V0O1xuICAgICAgICB0aGlzLm9yaWdTY3JlZW5ZID0gcGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgIHRoaXMuZGVsdGFYID0gMDtcbiAgICAgICAgdGhpcy5kZWx0YVkgPSAwO1xuICAgICAgICB0aGlzLnVwZGF0ZUVsUG9zaXRpb24oKTtcbiAgICB9XG4gICAgaGFuZGxlTW92ZShwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgdGhpcy5kZWx0YVggPSAocGFnZVggLSB3aW5kb3cucGFnZVhPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWDtcbiAgICAgICAgdGhpcy5kZWx0YVkgPSAocGFnZVkgLSB3aW5kb3cucGFnZVlPZmZzZXQpIC0gdGhpcy5vcmlnU2NyZWVuWTtcbiAgICAgICAgdGhpcy51cGRhdGVFbFBvc2l0aW9uKCk7XG4gICAgfVxuICAgIC8vIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0XG4gICAgc2V0SXNWaXNpYmxlKGJvb2wpIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5taXJyb3JFbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgPSBib29sOyAvLyBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIHVwZGF0ZUVsUG9zaXRpb25cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVsUG9zaXRpb24oKTsgLy8gYmVjYXVzZSB3YXMgbm90IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBpbnZpc2libGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGJvb2w7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gYWx3YXlzIGFzeW5jXG4gICAgc3RvcChuZWVkc1JldmVydEFuaW1hdGlvbiwgY2FsbGJhY2spIHtcbiAgICAgICAgbGV0IGRvbmUgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChuZWVkc1JldmVydEFuaW1hdGlvbiAmJlxuICAgICAgICAgICAgdGhpcy5taXJyb3JFbCAmJlxuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGUgJiZcbiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RHVyYXRpb24gJiYgLy8gaWYgMCwgdHJhbnNpdGlvbiB3b24ndCB3b3JrXG4gICAgICAgICAgICAodGhpcy5kZWx0YVggfHwgdGhpcy5kZWx0YVkpIC8vIGlmIHNhbWUgY29vcmRzLCB0cmFuc2l0aW9uIHdvbid0IHdvcmtcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmRvUmV2ZXJ0QW5pbWF0aW9uKGRvbmUsIHRoaXMucmV2ZXJ0RHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkb1JldmVydEFuaW1hdGlvbihjYWxsYmFjaywgcmV2ZXJ0RHVyYXRpb24pIHtcbiAgICAgICAgbGV0IG1pcnJvckVsID0gdGhpcy5taXJyb3JFbDtcbiAgICAgICAgbGV0IGZpbmFsU291cmNlRWxSZWN0ID0gdGhpcy5zb3VyY2VFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgLy8gYmVjYXVzZSBhdXRvc2Nyb2xsaW5nIG1pZ2h0IGhhdmUgaGFwcGVuZWRcbiAgICAgICAgbWlycm9yRWwuc3R5bGUudHJhbnNpdGlvbiA9XG4gICAgICAgICAgICAndG9wICcgKyByZXZlcnREdXJhdGlvbiArICdtcywnICtcbiAgICAgICAgICAgICAgICAnbGVmdCAnICsgcmV2ZXJ0RHVyYXRpb24gKyAnbXMnO1xuICAgICAgICBpbnRlcm5hbF9janMuYXBwbHlTdHlsZShtaXJyb3JFbCwge1xuICAgICAgICAgICAgbGVmdDogZmluYWxTb3VyY2VFbFJlY3QubGVmdCxcbiAgICAgICAgICAgIHRvcDogZmluYWxTb3VyY2VFbFJlY3QudG9wLFxuICAgICAgICB9KTtcbiAgICAgICAgaW50ZXJuYWxfY2pzLndoZW5UcmFuc2l0aW9uRG9uZShtaXJyb3JFbCwgKCkgPT4ge1xuICAgICAgICAgICAgbWlycm9yRWwuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIGlmICh0aGlzLm1pcnJvckVsKSB7XG4gICAgICAgICAgICBpbnRlcm5hbF9janMucmVtb3ZlRWxlbWVudCh0aGlzLm1pcnJvckVsKTtcbiAgICAgICAgICAgIHRoaXMubWlycm9yRWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc291cmNlRWwgPSBudWxsO1xuICAgIH1cbiAgICB1cGRhdGVFbFBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zb3VyY2VFbCAmJiB0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmFwcGx5U3R5bGUodGhpcy5nZXRNaXJyb3JFbCgpLCB7XG4gICAgICAgICAgICAgICAgbGVmdDogdGhpcy5zb3VyY2VFbFJlY3QubGVmdCArIHRoaXMuZGVsdGFYLFxuICAgICAgICAgICAgICAgIHRvcDogdGhpcy5zb3VyY2VFbFJlY3QudG9wICsgdGhpcy5kZWx0YVksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRNaXJyb3JFbCgpIHtcbiAgICAgICAgbGV0IHNvdXJjZUVsUmVjdCA9IHRoaXMuc291cmNlRWxSZWN0O1xuICAgICAgICBsZXQgbWlycm9yRWwgPSB0aGlzLm1pcnJvckVsO1xuICAgICAgICBpZiAoIW1pcnJvckVsKSB7XG4gICAgICAgICAgICBtaXJyb3JFbCA9IHRoaXMubWlycm9yRWwgPSB0aGlzLnNvdXJjZUVsLmNsb25lTm9kZSh0cnVlKTsgLy8gY2xvbmVDaGlsZHJlbj10cnVlXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IGxvbmcgdGFwcyBvciBhbnkgbW91c2UgaW50ZXJhY3Rpb24gY2F1c2luZyBzZWxlY3Rpb24vbWVudXMuXG4gICAgICAgICAgICAvLyB3b3VsZCB1c2UgcHJldmVudFNlbGVjdGlvbigpLCBidXQgdGhhdCBwcmV2ZW50cyBzZWxlY3RzdGFydCwgY2F1c2luZyBwcm9ibGVtcy5cbiAgICAgICAgICAgIG1pcnJvckVsLnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgICAgICAgICBtaXJyb3JFbC5jbGFzc0xpc3QuYWRkKCdmYy1ldmVudC1kcmFnZ2luZycpO1xuICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmFwcGx5U3R5bGUobWlycm9yRWwsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6IHRoaXMuekluZGV4LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICcnLFxuICAgICAgICAgICAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBzb3VyY2VFbFJlY3QucmlnaHQgLSBzb3VyY2VFbFJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNvdXJjZUVsUmVjdC5ib3R0b20gLSBzb3VyY2VFbFJlY3QudG9wLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgYm90dG9tOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobWlycm9yRWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaXJyb3JFbDtcbiAgICB9XG59XG5cbi8qXG5JcyBhIGNhY2hlIGZvciBhIGdpdmVuIGVsZW1lbnQncyBzY3JvbGwgaW5mb3JtYXRpb24gKGFsbCB0aGUgaW5mbyB0aGF0IFNjcm9sbENvbnRyb2xsZXIgc3RvcmVzKVxuaW4gYWRkaXRpb24gdGhlIFwiY2xpZW50IHJlY3RhbmdsZVwiIG9mIHRoZSBlbGVtZW50Li4gdGhlIGFyZWEgd2l0aGluIHRoZSBzY3JvbGxiYXJzLlxuXG5UaGUgY2FjaGUgY2FuIGJlIGluIG9uZSBvZiB0d28gbW9kZXM6XG4tIGRvZXNMaXN0ZW5pbmc6ZmFsc2UgLSBpZ25vcmVzIHdoZW4gdGhlIGNvbnRhaW5lciBpcyBzY3JvbGxlZCBieSBzb21lb25lIGVsc2Vcbi0gZG9lc0xpc3RlbmluZzp0cnVlIC0gd2F0Y2ggZm9yIHNjcm9sbGluZyBhbmQgdXBkYXRlIHRoZSBjYWNoZVxuKi9cbmNsYXNzIFNjcm9sbEdlb21DYWNoZSBleHRlbmRzIGludGVybmFsX2Nqcy5TY3JvbGxDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzY3JvbGxDb250cm9sbGVyLCBkb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsVG9wKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbENvbnRyb2xsZXIuZ2V0U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGxDaGFuZ2UoKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zY3JvbGxDb250cm9sbGVyID0gc2Nyb2xsQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy5kb2VzTGlzdGVuaW5nID0gZG9lc0xpc3RlbmluZztcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLm9yaWdTY3JvbGxUb3AgPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFRvcCgpO1xuICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSB0aGlzLm9yaWdTY3JvbGxMZWZ0ID0gc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxMZWZ0KCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsV2lkdGggPSBzY3JvbGxDb250cm9sbGVyLmdldFNjcm9sbFdpZHRoKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gc2Nyb2xsQ29udHJvbGxlci5nZXRTY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgdGhpcy5jbGllbnRXaWR0aCA9IHNjcm9sbENvbnRyb2xsZXIuZ2V0Q2xpZW50V2lkdGgoKTtcbiAgICAgICAgdGhpcy5jbGllbnRIZWlnaHQgPSBzY3JvbGxDb250cm9sbGVyLmdldENsaWVudEhlaWdodCgpO1xuICAgICAgICB0aGlzLmNsaWVudFJlY3QgPSB0aGlzLmNvbXB1dGVDbGllbnRSZWN0KCk7IC8vIGRvIGxhc3QgaW4gY2FzZSBpdCBuZWVkcyBjYWNoZWQgdmFsdWVzXG4gICAgICAgIGlmICh0aGlzLmRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXZlbnRUYXJnZXQoKS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLmhhbmRsZVNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9lc0xpc3RlbmluZykge1xuICAgICAgICAgICAgdGhpcy5nZXRFdmVudFRhcmdldCgpLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRTY3JvbGxUb3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvcDtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsTGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsTGVmdDtcbiAgICB9XG4gICAgc2V0U2Nyb2xsVG9wKHRvcCkge1xuICAgICAgICB0aGlzLnNjcm9sbENvbnRyb2xsZXIuc2V0U2Nyb2xsVG9wKHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gTWF0aC5tYXgoTWF0aC5taW4odG9wLCB0aGlzLmdldE1heFNjcm9sbFRvcCgpKSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFNjcm9sbExlZnQodG9wKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udHJvbGxlci5zZXRTY3JvbGxMZWZ0KHRvcCk7XG4gICAgICAgIGlmICghdGhpcy5kb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHJlbHlpbmcgb24gdGhlIGVsZW1lbnQgdG8gbm9ybWFsaXplIG91dC1vZi1ib3VuZHMgc2Nyb2xsIHZhbHVlc1xuICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzYW5pdGl6ZSBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGVmdCA9IE1hdGgubWF4KE1hdGgubWluKHRvcCwgdGhpcy5nZXRNYXhTY3JvbGxMZWZ0KCkpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0Q2xpZW50V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudFdpZHRoO1xuICAgIH1cbiAgICBnZXRDbGllbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudEhlaWdodDtcbiAgICB9XG4gICAgZ2V0U2Nyb2xsV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFdpZHRoO1xuICAgIH1cbiAgICBnZXRTY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNjcm9sbEhlaWdodDtcbiAgICB9XG4gICAgaGFuZGxlU2Nyb2xsQ2hhbmdlKCkge1xuICAgIH1cbn1cblxuY2xhc3MgRWxlbWVudFNjcm9sbEdlb21DYWNoZSBleHRlbmRzIFNjcm9sbEdlb21DYWNoZSB7XG4gICAgY29uc3RydWN0b3IoZWwsIGRvZXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgc3VwZXIobmV3IGludGVybmFsX2Nqcy5FbGVtZW50U2Nyb2xsQ29udHJvbGxlcihlbCksIGRvZXNMaXN0ZW5pbmcpO1xuICAgIH1cbiAgICBnZXRFdmVudFRhcmdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQ29udHJvbGxlci5lbDtcbiAgICB9XG4gICAgY29tcHV0ZUNsaWVudFJlY3QoKSB7XG4gICAgICAgIHJldHVybiBpbnRlcm5hbF9janMuY29tcHV0ZUlubmVyUmVjdCh0aGlzLnNjcm9sbENvbnRyb2xsZXIuZWwpO1xuICAgIH1cbn1cblxuY2xhc3MgV2luZG93U2Nyb2xsR2VvbUNhY2hlIGV4dGVuZHMgU2Nyb2xsR2VvbUNhY2hlIHtcbiAgICBjb25zdHJ1Y3Rvcihkb2VzTGlzdGVuaW5nKSB7XG4gICAgICAgIHN1cGVyKG5ldyBpbnRlcm5hbF9janMuV2luZG93U2Nyb2xsQ29udHJvbGxlcigpLCBkb2VzTGlzdGVuaW5nKTtcbiAgICB9XG4gICAgZ2V0RXZlbnRUYXJnZXQoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3c7XG4gICAgfVxuICAgIGNvbXB1dGVDbGllbnRSZWN0KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGVmdDogdGhpcy5zY3JvbGxMZWZ0LFxuICAgICAgICAgICAgcmlnaHQ6IHRoaXMuc2Nyb2xsTGVmdCArIHRoaXMuY2xpZW50V2lkdGgsXG4gICAgICAgICAgICB0b3A6IHRoaXMuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgYm90dG9tOiB0aGlzLnNjcm9sbFRvcCArIHRoaXMuY2xpZW50SGVpZ2h0LFxuICAgICAgICB9O1xuICAgIH1cbiAgICAvLyB0aGUgd2luZG93IGlzIHRoZSBvbmx5IHNjcm9sbCBvYmplY3QgdGhhdCBjaGFuZ2VzIGl0J3MgcmVjdGFuZ2xlIHJlbGF0aXZlXG4gICAgLy8gdG8gdGhlIGRvY3VtZW50J3MgdG9wbGVmdCBhcyBpdCBzY3JvbGxzXG4gICAgaGFuZGxlU2Nyb2xsQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmNsaWVudFJlY3QgPSB0aGlzLmNvbXB1dGVDbGllbnRSZWN0KCk7XG4gICAgfVxufVxuXG4vLyBJZiBhdmFpbGFibGUgd2UgYXJlIHVzaW5nIG5hdGl2ZSBcInBlcmZvcm1hbmNlXCIgQVBJIGluc3RlYWQgb2YgXCJEYXRlXCJcbi8vIFJlYWQgbW9yZSBhYm91dCBpdCBvbiBNRE46XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUGVyZm9ybWFuY2VcbmNvbnN0IGdldFRpbWUgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdmdW5jdGlvbicgPyBwZXJmb3JtYW5jZS5ub3cgOiBEYXRlLm5vdztcbi8qXG5Gb3IgYSBwb2ludGVyIGludGVyYWN0aW9uLCBhdXRvbWF0aWNhbGx5IHNjcm9sbHMgY2VydGFpbiBzY3JvbGwgY29udGFpbmVycyB3aGVuIHRoZSBwb2ludGVyXG5hcHByb2FjaGVzIHRoZSBlZGdlLlxuXG5UaGUgY2FsbGVyIG11c3QgY2FsbCBzdGFydCArIGhhbmRsZU1vdmUgKyBzdG9wLlxuKi9cbmNsYXNzIEF1dG9TY3JvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGJ5IGNhbGxlclxuICAgICAgICB0aGlzLmlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2Nyb2xsUXVlcnkgPSBbd2luZG93LCAnLmZjLXNjcm9sbGVyJ107XG4gICAgICAgIHRoaXMuZWRnZVRocmVzaG9sZCA9IDUwOyAvLyBwaXhlbHNcbiAgICAgICAgdGhpcy5tYXhWZWxvY2l0eSA9IDMwMDsgLy8gcGl4ZWxzIHBlciBzZWNvbmRcbiAgICAgICAgLy8gaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWCA9IG51bGw7XG4gICAgICAgIHRoaXMucG9pbnRlclNjcmVlblkgPSBudWxsO1xuICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ2FjaGVzID0gbnVsbDtcbiAgICAgICAgLy8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBpbml0aWFsIHBvaW50ZXJkb3duIGJlaW5nIHRvbyBjbG9zZSB0byBhbiBlZGdlIGFuZCBzdGFydGluZyB0aGUgc2Nyb2xsXG4gICAgICAgIHRoaXMuZXZlck1vdmVkVXAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVyTW92ZWREb3duID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZlck1vdmVkTGVmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZXJNb3ZlZFJpZ2h0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQW5pbWF0aW5nKSB7IC8vIHdhc24ndCBjYW5jZWxsZWQgYmV0d2VlbiBhbmltYXRpb24gY2FsbHNcbiAgICAgICAgICAgICAgICBsZXQgZWRnZSA9IHRoaXMuY29tcHV0ZUJlc3RFZGdlKHRoaXMucG9pbnRlclNjcmVlblggKyB3aW5kb3cucGFnZVhPZmZzZXQsIHRoaXMucG9pbnRlclNjcmVlblkgKyB3aW5kb3cucGFnZVlPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGlmIChlZGdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3cgPSBnZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2lkZShlZGdlLCAobm93IC0gdGhpcy5tc1NpbmNlUmVxdWVzdCkgLyAxMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uKG5vdyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7IC8vIHdpbGwgc3RvcCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIHN0YXJ0KHBhZ2VYLCBwYWdlWSwgc2Nyb2xsU3RhcnRFbCkge1xuICAgICAgICBpZiAodGhpcy5pc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2FjaGVzID0gdGhpcy5idWlsZENhY2hlcyhzY3JvbGxTdGFydEVsKTtcbiAgICAgICAgICAgIHRoaXMucG9pbnRlclNjcmVlblggPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWSA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZFVwID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZERvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkTGVmdCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5ldmVyTW92ZWRSaWdodCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVNb3ZlKHBhZ2VYLCBwYWdlWSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlTW92ZShwYWdlWCwgcGFnZVkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRlclNjcmVlblggPSBwYWdlWCAtIHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICAgICAgICAgIGxldCBwb2ludGVyU2NyZWVuWSA9IHBhZ2VZIC0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgICAgICAgICAgbGV0IHlEZWx0YSA9IHRoaXMucG9pbnRlclNjcmVlblkgPT09IG51bGwgPyAwIDogcG9pbnRlclNjcmVlblkgLSB0aGlzLnBvaW50ZXJTY3JlZW5ZO1xuICAgICAgICAgICAgbGV0IHhEZWx0YSA9IHRoaXMucG9pbnRlclNjcmVlblggPT09IG51bGwgPyAwIDogcG9pbnRlclNjcmVlblggLSB0aGlzLnBvaW50ZXJTY3JlZW5YO1xuICAgICAgICAgICAgaWYgKHlEZWx0YSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZFVwID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHlEZWx0YSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZERvd24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHhEZWx0YSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZXJNb3ZlZExlZnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoeERlbHRhID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlck1vdmVkUmlnaHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWCA9IHBvaW50ZXJTY3JlZW5YO1xuICAgICAgICAgICAgdGhpcy5wb2ludGVyU2NyZWVuWSA9IHBvaW50ZXJTY3JlZW5ZO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQW5pbWF0aW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uKGdldFRpbWUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmlzQW5pbWF0aW5nID0gZmFsc2U7IC8vIHdpbGwgc3RvcCBhbmltYXRpb25cbiAgICAgICAgICAgIGZvciAobGV0IHNjcm9sbENhY2hlIG9mIHRoaXMuc2Nyb2xsQ2FjaGVzKSB7XG4gICAgICAgICAgICAgICAgc2Nyb2xsQ2FjaGUuZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDYWNoZXMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb24obm93KSB7XG4gICAgICAgIHRoaXMubXNTaW5jZVJlcXVlc3QgPSBub3c7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xuICAgIH1cbiAgICBoYW5kbGVTaWRlKGVkZ2UsIHNlY29uZHMpIHtcbiAgICAgICAgbGV0IHsgc2Nyb2xsQ2FjaGUgfSA9IGVkZ2U7XG4gICAgICAgIGxldCB7IGVkZ2VUaHJlc2hvbGQgfSA9IHRoaXM7XG4gICAgICAgIGxldCBpbnZEaXN0YW5jZSA9IGVkZ2VUaHJlc2hvbGQgLSBlZGdlLmRpc3RhbmNlO1xuICAgICAgICBsZXQgdmVsb2NpdHkgPSAvLyB0aGUgY2xvc2VyIHRvIHRoZSBlZGdlLCB0aGUgZmFzdGVyIHdlIHNjcm9sbFxuICAgICAgICAgKChpbnZEaXN0YW5jZSAqIGludkRpc3RhbmNlKSAvIChlZGdlVGhyZXNob2xkICogZWRnZVRocmVzaG9sZCkpICogLy8gcXVhZHJhdGljXG4gICAgICAgICAgICB0aGlzLm1heFZlbG9jaXR5ICogc2Vjb25kcztcbiAgICAgICAgbGV0IHNpZ24gPSAxO1xuICAgICAgICBzd2l0Y2ggKGVkZ2UubmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgICAgICAgc2lnbiA9IC0xO1xuICAgICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgICAgICAgIHNjcm9sbENhY2hlLnNldFNjcm9sbExlZnQoc2Nyb2xsQ2FjaGUuZ2V0U2Nyb2xsTGVmdCgpICsgdmVsb2NpdHkgKiBzaWduKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICAgICAgc2lnbiA9IC0xO1xuICAgICAgICAgICAgLy8gZmFsbHMgdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgICAgICBzY3JvbGxDYWNoZS5zZXRTY3JvbGxUb3Aoc2Nyb2xsQ2FjaGUuZ2V0U2Nyb2xsVG9wKCkgKyB2ZWxvY2l0eSAqIHNpZ24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGxlZnQvdG9wIGFyZSByZWxhdGl2ZSB0byBkb2N1bWVudCB0b3BsZWZ0XG4gICAgY29tcHV0ZUJlc3RFZGdlKGxlZnQsIHRvcCkge1xuICAgICAgICBsZXQgeyBlZGdlVGhyZXNob2xkIH0gPSB0aGlzO1xuICAgICAgICBsZXQgYmVzdFNpZGUgPSBudWxsO1xuICAgICAgICBsZXQgc2Nyb2xsQ2FjaGVzID0gdGhpcy5zY3JvbGxDYWNoZXMgfHwgW107XG4gICAgICAgIGZvciAobGV0IHNjcm9sbENhY2hlIG9mIHNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgbGV0IHJlY3QgPSBzY3JvbGxDYWNoZS5jbGllbnRSZWN0O1xuICAgICAgICAgICAgbGV0IGxlZnREaXN0ID0gbGVmdCAtIHJlY3QubGVmdDtcbiAgICAgICAgICAgIGxldCByaWdodERpc3QgPSByZWN0LnJpZ2h0IC0gbGVmdDtcbiAgICAgICAgICAgIGxldCB0b3BEaXN0ID0gdG9wIC0gcmVjdC50b3A7XG4gICAgICAgICAgICBsZXQgYm90dG9tRGlzdCA9IHJlY3QuYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgLy8gY29tcGxldGVseSB3aXRoaW4gdGhlIHJlY3Q/XG4gICAgICAgICAgICBpZiAobGVmdERpc3QgPj0gMCAmJiByaWdodERpc3QgPj0gMCAmJiB0b3BEaXN0ID49IDAgJiYgYm90dG9tRGlzdCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRvcERpc3QgPD0gZWRnZVRocmVzaG9sZCAmJiB0aGlzLmV2ZXJNb3ZlZFVwICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbFVwKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFiZXN0U2lkZSB8fCBiZXN0U2lkZS5kaXN0YW5jZSA+IHRvcERpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTaWRlID0geyBzY3JvbGxDYWNoZSwgbmFtZTogJ3RvcCcsIGRpc3RhbmNlOiB0b3BEaXN0IH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChib3R0b21EaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWREb3duICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbERvd24oKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gYm90dG9tRGlzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdFNpZGUgPSB7IHNjcm9sbENhY2hlLCBuYW1lOiAnYm90dG9tJywgZGlzdGFuY2U6IGJvdHRvbURpc3QgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGxlZnREaXN0IDw9IGVkZ2VUaHJlc2hvbGQgJiYgdGhpcy5ldmVyTW92ZWRMZWZ0ICYmIHNjcm9sbENhY2hlLmNhblNjcm9sbExlZnQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gbGVmdERpc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJlc3RTaWRlID0geyBzY3JvbGxDYWNoZSwgbmFtZTogJ2xlZnQnLCBkaXN0YW5jZTogbGVmdERpc3QgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJpZ2h0RGlzdCA8PSBlZGdlVGhyZXNob2xkICYmIHRoaXMuZXZlck1vdmVkUmlnaHQgJiYgc2Nyb2xsQ2FjaGUuY2FuU2Nyb2xsUmlnaHQoKSAmJlxuICAgICAgICAgICAgICAgICAgICAoIWJlc3RTaWRlIHx8IGJlc3RTaWRlLmRpc3RhbmNlID4gcmlnaHREaXN0KSkge1xuICAgICAgICAgICAgICAgICAgICBiZXN0U2lkZSA9IHsgc2Nyb2xsQ2FjaGUsIG5hbWU6ICdyaWdodCcsIGRpc3RhbmNlOiByaWdodERpc3QgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJlc3RTaWRlO1xuICAgIH1cbiAgICBidWlsZENhY2hlcyhzY3JvbGxTdGFydEVsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2Nyb2xsRWxzKHNjcm9sbFN0YXJ0RWwpLm1hcCgoZWwpID0+IHtcbiAgICAgICAgICAgIGlmIChlbCA9PT0gd2luZG93KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dTY3JvbGxHZW9tQ2FjaGUoZmFsc2UpOyAvLyBmYWxzZSA9IGRvbid0IGxpc3RlbiB0byB1c2VyLWdlbmVyYXRlZCBzY3JvbGxzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTY3JvbGxHZW9tQ2FjaGUoZWwsIGZhbHNlKTsgLy8gZmFsc2UgPSBkb24ndCBsaXN0ZW4gdG8gdXNlci1nZW5lcmF0ZWQgc2Nyb2xsc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcXVlcnlTY3JvbGxFbHMoc2Nyb2xsU3RhcnRFbCkge1xuICAgICAgICBsZXQgZWxzID0gW107XG4gICAgICAgIGZvciAobGV0IHF1ZXJ5IG9mIHRoaXMuc2Nyb2xsUXVlcnkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgZWxzLnB1c2gocXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxzLnB1c2goLi4uQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc2Nyb2xsU3RhcnRFbC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVscztcbiAgICB9XG59XG5cbi8qXG5Nb25pdG9ycyBkcmFnZ2luZyBvbiBhbiBlbGVtZW50LiBIYXMgYSBudW1iZXIgb2YgaGlnaC1sZXZlbCBmZWF0dXJlczpcbi0gbWluaW11bSBkaXN0YW5jZSByZXF1aXJlZCBiZWZvcmUgZHJhZ2dpbmdcbi0gbWluaW11bSB3YWl0IHRpbWUgKFwiZGVsYXlcIikgYmVmb3JlIGRyYWdnaW5nXG4tIGEgbWlycm9yIGVsZW1lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyXG4qL1xuY2xhc3MgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyBleHRlbmRzIGludGVybmFsX2Nqcy5FbGVtZW50RHJhZ2dpbmcge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsLCBzZWxlY3Rvcikge1xuICAgICAgICBzdXBlcihjb250YWluZXJFbCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwgPSBjb250YWluZXJFbDtcbiAgICAgICAgLy8gb3B0aW9ucyB0aGF0IGNhbiBiZSBkaXJlY3RseSBzZXQgYnkgY2FsbGVyXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgY2FuIGFsc28gc2V0IHRoZSBQb2ludGVyRHJhZ2dpbmcncyBvcHRpb25zIGFzIHdlbGxcbiAgICAgICAgdGhpcy5kZWxheSA9IG51bGw7XG4gICAgICAgIHRoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgICAgICB0aGlzLnRvdWNoU2Nyb2xsQWxsb3dlZCA9IHRydWU7IC8vIHByZXZlbnRzIGRyYWcgZnJvbSBzdGFydGluZyBhbmQgYmxvY2tzIHNjcm9sbGluZyBkdXJpbmcgZHJhZ1xuICAgICAgICB0aGlzLm1pcnJvck5lZWRzUmV2ZXJ0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlOyAvLyBpcyB0aGUgdXNlciB2YWxpZGx5IG1vdmluZyB0aGUgcG9pbnRlcj8gbGFzdHMgdW50aWwgcG9pbnRlcnVwXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlOyAvLyBpcyBpdCBJTlRFTlRGVUxMWSBkcmFnZ2luZz8gbGFzdHMgdW50aWwgYWZ0ZXIgcmV2ZXJ0IGFuaW1hdGlvblxuICAgICAgICB0aGlzLmlzRGVsYXlFbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWxheVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgIHRoaXMub25Qb2ludGVyRG93biA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHsgLy8gc28gbmV3IGRyYWcgZG9lc24ndCBoYXBwZW4gd2hpbGUgcmV2ZXJ0IGFuaW1hdGlvbiBpcyBnb2luZ1xuICAgICAgICAgICAgICAgIHRoaXMuaXNJbnRlcmFjdGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RlbGF5RW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMucHJldmVudFNlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMucHJldmVudENvbnRleHRNZW51KGRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgbGlua3MgZnJvbSBiZWluZyB2aXNpdGVkIGlmIHRoZXJlJ3MgYW4gZXZlbnR1YWwgZHJhZy5cbiAgICAgICAgICAgICAgICAvLyBhbHNvIHByZXZlbnRzIHNlbGVjdGlvbiBpbiBvbGRlciBicm93c2VycyAobWF5YmU/KS5cbiAgICAgICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGZvciB0b3VjaCwgYmVzaWRlcywgYnJvd3NlciB3b3VsZCBjb21wbGFpbiBhYm91dCBwYXNzaXZlbmVzcy5cbiAgICAgICAgICAgICAgICBpZiAoIWV2LmlzVG91Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZXYub3JpZ0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVyZG93bicsIGV2KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0ludGVyYWN0aW5nICYmIC8vIG5vdCBkZXN0cm95ZWQgdmlhIHBvaW50ZXJkb3duIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjdGlvbnMgcmVsYXRlZCB0byBpbml0aWF0aW5nIGRyYWdzdGFydCtkcmFnbW92ZStkcmFnZW5kLi4uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWlycm9yLnNldElzVmlzaWJsZShmYWxzZSk7IC8vIHJlc2V0LiBjYWxsZXIgbXVzdCBzZXQtdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvci5zdGFydChldi5zdWJqZWN0RWwsIGV2LnBhZ2VYLCBldi5wYWdlWSk7IC8vIG11c3QgaGFwcGVuIG9uIGZpcnN0IHBvaW50ZXIgZG93blxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RGVsYXkoZXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWluRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRGlzdGFuY2VTdXJwYXNzZWQoZXYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uUG9pbnRlck1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW50ZXJhY3RpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcm1vdmUnLCBldik7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbkRpc3RhbmNlID0gdGhpcy5taW5EaXN0YW5jZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpc3RhbmNlU3E7IC8vIGN1cnJlbnQgZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luLCBzcXVhcmVkXG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGRlbHRhWCwgZGVsdGFZIH0gPSBldjtcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VTcSA9IGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlU3EgPj0gbWluRGlzdGFuY2UgKiBtaW5EaXN0YW5jZSkgeyAvLyB1c2UgcHl0aGFnb3JlYW4gdGhlb3JlbVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVEaXN0YW5jZVN1cnBhc3NlZChldik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBhIHJlYWwgcG9pbnRlciBtb3ZlPyAobm90IG9uZSBzaW11bGF0ZWQgYnkgc2Nyb2xsaW5nKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZXYub3JpZ0V2ZW50LnR5cGUgIT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pcnJvci5oYW5kbGVNb3ZlKGV2LnBhZ2VYLCBldi5wYWdlWSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TY3JvbGxlci5oYW5kbGVNb3ZlKGV2LnBhZ2VYLCBldi5wYWdlWSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdtb3ZlJywgZXYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vblBvaW50ZXJVcCA9IChldikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNJbnRlcmFjdGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNJbnRlcmFjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5hbGxvd1NlbGVjdGlvbihkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbF9janMuYWxsb3dDb250ZXh0TWVudShkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcigncG9pbnRlcnVwJywgZXYpOyAvLyBjYW4gcG90ZW50aWFsbHkgc2V0IG1pcnJvck5lZWRzUmV2ZXJ0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TY3JvbGxlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5U3RvcERyYWcoZXYpOyAvLyB3aGljaCB3aWxsIHN0b3AgdGhlIG1pcnJvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWxheVRpbWVvdXRJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWxheVRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHBvaW50ZXIgPSB0aGlzLnBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGNvbnRhaW5lckVsKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMub25Qb2ludGVyRG93bik7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcm1vdmUnLCB0aGlzLm9uUG9pbnRlck1vdmUpO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMub25Qb2ludGVyVXApO1xuICAgICAgICBpZiAoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIHBvaW50ZXIuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1pcnJvciA9IG5ldyBFbGVtZW50TWlycm9yKCk7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGVyID0gbmV3IEF1dG9TY3JvbGxlcigpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLnBvaW50ZXIuZGVzdHJveSgpO1xuICAgICAgICAvLyBIQUNLOiBzaW11bGF0ZSBhIHBvaW50ZXItdXAgdG8gZW5kIHRoZSBjdXJyZW50IGRyYWdcbiAgICAgICAgLy8gVE9ETzogZmlyZSAnZHJhZ2VuZCcgZGlyZWN0bHkgYW5kIHN0b3AgaW50ZXJhY3Rpb24uIGRpc2NvdXJhZ2UgdXNlIG9mIHBvaW50ZXJ1cCBldmVudCAoYi9jIG1pZ2h0IG5vdCBmaXJlKVxuICAgICAgICB0aGlzLm9uUG9pbnRlclVwKHt9KTtcbiAgICB9XG4gICAgc3RhcnREZWxheShldikge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGF5VGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVvdXRJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgICAgICB9LCB0aGlzLmRlbGF5KTsgLy8gbm90IGFzc2lnbmFibGUgdG8gbnVtYmVyIVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVEZWxheUVuZChldik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlRGVsYXlFbmQoZXYpIHtcbiAgICAgICAgdGhpcy5pc0RlbGF5RW5kZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyeVN0YXJ0RHJhZyhldik7XG4gICAgfVxuICAgIGhhbmRsZURpc3RhbmNlU3VycGFzc2VkKGV2KSB7XG4gICAgICAgIHRoaXMuaXNEaXN0YW5jZVN1cnBhc3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMudHJ5U3RhcnREcmFnKGV2KTtcbiAgICB9XG4gICAgdHJ5U3RhcnREcmFnKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVsYXlFbmRlZCAmJiB0aGlzLmlzRGlzdGFuY2VTdXJwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5wb2ludGVyLndhc1RvdWNoU2Nyb2xsIHx8IHRoaXMudG91Y2hTY3JvbGxBbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvck5lZWRzUmV2ZXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2Nyb2xsZXIuc3RhcnQoZXYucGFnZVgsIGV2LnBhZ2VZLCB0aGlzLmNvbnRhaW5lckVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ3N0YXJ0JywgZXYpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvdWNoU2Nyb2xsQWxsb3dlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyLmNhbmNlbFRvdWNoU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRyeVN0b3BEcmFnKGV2KSB7XG4gICAgICAgIC8vIC5zdG9wKCkgaXMgQUxXQVlTIGFzeW5jaHJvbm91cywgd2hpY2ggd2UgTkVFRCBiZWNhdXNlIHdlIHdhbnQgYWxsIHBvaW50ZXJ1cCBldmVudHNcbiAgICAgICAgLy8gdGhhdCBjb21lIGZyb20gdGhlIGRvY3VtZW50IHRvIGZpcmUgYmVmb3JlaGFuZC4gbXVjaCBtb3JlIGNvbnZlbmllbnQgdGhpcyB3YXkuXG4gICAgICAgIHRoaXMubWlycm9yLnN0b3AodGhpcy5taXJyb3JOZWVkc1JldmVydCwgdGhpcy5zdG9wRHJhZy5iaW5kKHRoaXMsIGV2KSk7XG4gICAgfVxuICAgIHN0b3BEcmFnKGV2KSB7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ2VuZCcsIGV2KTtcbiAgICB9XG4gICAgLy8gZmlsbCBpbiB0aGUgaW1wbGVtZW50YXRpb25zLi4uXG4gICAgc2V0SWdub3JlTW92ZShib29sKSB7XG4gICAgICAgIHRoaXMucG9pbnRlci5zaG91bGRJZ25vcmVNb3ZlID0gYm9vbDtcbiAgICB9XG4gICAgc2V0TWlycm9ySXNWaXNpYmxlKGJvb2wpIHtcbiAgICAgICAgdGhpcy5taXJyb3Iuc2V0SXNWaXNpYmxlKGJvb2wpO1xuICAgIH1cbiAgICBzZXRNaXJyb3JOZWVkc1JldmVydChib29sKSB7XG4gICAgICAgIHRoaXMubWlycm9yTmVlZHNSZXZlcnQgPSBib29sO1xuICAgIH1cbiAgICBzZXRBdXRvU2Nyb2xsRW5hYmxlZChib29sKSB7XG4gICAgICAgIHRoaXMuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IGJvb2w7XG4gICAgfVxufVxuXG4vKlxuV2hlbiB0aGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCwgaXQgcmVjb3JkcyB0aGUgb2Zmc2V0IG9mIGFuIGVsZW1lbnQgKHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCB0b3BsZWZ0KSxcbmFuZCBjb250aW51ZXMgdG8gbW9uaXRvciBzY3JvbGxpbmcsIHVwZGF0aW5nIHRoZSBjYWNoZWQgY29vcmRpbmF0ZXMgaWYgaXQgbmVlZHMgdG8uXG5Eb2VzIG5vdCBhY2Nlc3MgdGhlIERPTSBhZnRlciBpbnN0YW50aWF0aW9uLCBzbyBoaWdobHkgcGVyZm9ybWFudC5cblxuQWxzbyBrZWVwcyB0cmFjayBvZiBhbGwgc2Nyb2xsaW5nL292ZXJmbG93OmhpZGRlbiBjb250YWluZXJzIHRoYXQgYXJlIHBhcmVudHMgb2YgdGhlIGdpdmVuIGVsZW1lbnRcbmFuZCBhbiBkZXRlcm1pbmUgaWYgYSBnaXZlbiBwb2ludCBpcyBpbnNpZGUgdGhlIGNvbWJpbmVkIGNsaXBwaW5nIHJlY3RhbmdsZS5cbiovXG5jbGFzcyBPZmZzZXRUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihlbCkge1xuICAgICAgICB0aGlzLm9yaWdSZWN0ID0gaW50ZXJuYWxfY2pzLmNvbXB1dGVSZWN0KGVsKTtcbiAgICAgICAgLy8gd2lsbCB3b3JrIGZpbmUgZm9yIGRpdnMgdGhhdCBoYXZlIG92ZXJmbG93OmhpZGRlblxuICAgICAgICB0aGlzLnNjcm9sbENhY2hlcyA9IGludGVybmFsX2Nqcy5nZXRDbGlwcGluZ1BhcmVudHMoZWwpLm1hcCgoc2Nyb2xsRWwpID0+IG5ldyBFbGVtZW50U2Nyb2xsR2VvbUNhY2hlKHNjcm9sbEVsLCB0cnVlKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGZvciAobGV0IHNjcm9sbENhY2hlIG9mIHRoaXMuc2Nyb2xsQ2FjaGVzKSB7XG4gICAgICAgICAgICBzY3JvbGxDYWNoZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29tcHV0ZUxlZnQoKSB7XG4gICAgICAgIGxldCBsZWZ0ID0gdGhpcy5vcmlnUmVjdC5sZWZ0O1xuICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiB0aGlzLnNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgbGVmdCArPSBzY3JvbGxDYWNoZS5vcmlnU2Nyb2xsTGVmdCAtIHNjcm9sbENhY2hlLmdldFNjcm9sbExlZnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGVmdDtcbiAgICB9XG4gICAgY29tcHV0ZVRvcCgpIHtcbiAgICAgICAgbGV0IHRvcCA9IHRoaXMub3JpZ1JlY3QudG9wO1xuICAgICAgICBmb3IgKGxldCBzY3JvbGxDYWNoZSBvZiB0aGlzLnNjcm9sbENhY2hlcykge1xuICAgICAgICAgICAgdG9wICs9IHNjcm9sbENhY2hlLm9yaWdTY3JvbGxUb3AgLSBzY3JvbGxDYWNoZS5nZXRTY3JvbGxUb3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9wO1xuICAgIH1cbiAgICBpc1dpdGhpbkNsaXBwaW5nKHBhZ2VYLCBwYWdlWSkge1xuICAgICAgICBsZXQgcG9pbnQgPSB7IGxlZnQ6IHBhZ2VYLCB0b3A6IHBhZ2VZIH07XG4gICAgICAgIGZvciAobGV0IHNjcm9sbENhY2hlIG9mIHRoaXMuc2Nyb2xsQ2FjaGVzKSB7XG4gICAgICAgICAgICBpZiAoIWlzSWdub3JlZENsaXBwaW5nKHNjcm9sbENhY2hlLmdldEV2ZW50VGFyZ2V0KCkpICYmXG4gICAgICAgICAgICAgICAgIWludGVybmFsX2Nqcy5wb2ludEluc2lkZVJlY3QocG9pbnQsIHNjcm9sbENhY2hlLmNsaWVudFJlY3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbi8vIGNlcnRhaW4gY2xpcHBpbmcgY29udGFpbmVycyBzaG91bGQgbmV2ZXIgY29uc3RyYWluIGludGVyYWN0aW9ucywgbGlrZSA8aHRtbD4gYW5kIDxib2R5PlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Z1bGxjYWxlbmRhci9mdWxsY2FsZW5kYXIvaXNzdWVzLzM2MTVcbmZ1bmN0aW9uIGlzSWdub3JlZENsaXBwaW5nKG5vZGUpIHtcbiAgICBsZXQgdGFnTmFtZSA9IG5vZGUudGFnTmFtZTtcbiAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ0hUTUwnIHx8IHRhZ05hbWUgPT09ICdCT0RZJztcbn1cblxuLypcblRyYWNrcyBtb3ZlbWVudCBvdmVyIG11bHRpcGxlIGRyb3BwYWJsZSBhcmVhcyAoYWthIFwiaGl0c1wiKVxudGhhdCBleGlzdCBpbiBvbmUgb3IgbW9yZSBEYXRlQ29tcG9uZW50cy5cblJlbGllcyBvbiBhbiBleGlzdGluZyBkcmFnZ2FibGUuXG5cbmVtaXRzOlxuLSBwb2ludGVyZG93blxuLSBkcmFnc3RhcnRcbi0gaGl0Y2hhbmdlIC0gZmlyZXMgaW5pdGlhbGx5LCBldmVuIGlmIG5vdCBvdmVyIGEgaGl0XG4tIHBvaW50ZXJ1cFxuLSAoaGl0Y2hhbmdlIC0gYWdhaW4sIHRvIG51bGwsIGlmIGVuZGVkIG92ZXIgYSBoaXQpXG4tIGRyYWdlbmRcbiovXG5jbGFzcyBIaXREcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3IoZHJhZ2dpbmcsIGRyb3BwYWJsZVN0b3JlKSB7XG4gICAgICAgIC8vIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGJ5IGNhbGxlclxuICAgICAgICB0aGlzLnVzZVN1YmplY3RDZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXF1aXJlSW5pdGlhbCA9IHRydWU7IC8vIGlmIGRvZXNuJ3Qgc3RhcnQgb3V0IG9uIGEgaGl0LCB3b24ndCBlbWl0IGFueSBldmVudHNcbiAgICAgICAgdGhpcy5pbml0aWFsSGl0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbmFsSGl0ID0gbnVsbDsgLy8gd29uJ3QgZXZlciBiZSBwb3B1bGF0ZWQgaWYgc2hvdWxkSWdub3JlTW92ZVxuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJEb3duID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBkcmFnZ2luZyB9ID0gdGhpcztcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbEhpdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLm1vdmluZ0hpdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmZpbmFsSGl0ID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUhpdHMoKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0ZpcnN0Q29vcmQoZXYpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5pdGlhbEhpdCB8fCAhdGhpcy5yZXF1aXJlSW5pdGlhbCkge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGZpcmUgdGhpcyBiZWZvcmUgY29tcHV0aW5nIHByb2Nlc3NGaXJzdENvb3JkLCBzbyBsaXN0ZW5lcnMgY2FuIGNhbmNlbC4gdGhpcyBnZXRzIGZpcmVkIGJ5IGFsbW9zdCBldmVyeSBoYW5kbGVyIDooXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJkb3duJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmcuc2V0SWdub3JlTW92ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnc3RhcnQnLCBldik7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU1vdmUoZXYsIHRydWUpOyAvLyBmb3JjZSA9IGZpcmUgZXZlbiBpZiBpbml0aWFsbHkgbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdNb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ21vdmUnLCBldik7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU1vdmUoZXYpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJVcCA9IChldikgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWxlYXNlSGl0cygpO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ3BvaW50ZXJ1cCcsIGV2KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tb3ZpbmdIaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignaGl0dXBkYXRlJywgbnVsbCwgdHJ1ZSwgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maW5hbEhpdCA9IHRoaXMubW92aW5nSGl0O1xuICAgICAgICAgICAgdGhpcy5tb3ZpbmdIaXQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2RyYWdlbmQnLCBldik7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZHJvcHBhYmxlU3RvcmUgPSBkcm9wcGFibGVTdG9yZTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgZHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnbW92ZScsIHRoaXMuaGFuZGxlRHJhZ01vdmUpO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCB0aGlzLmhhbmRsZVBvaW50ZXJVcCk7XG4gICAgICAgIGRyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nID0gZHJhZ2dpbmc7XG4gICAgICAgIHRoaXMuZW1pdHRlciA9IG5ldyBpbnRlcm5hbF9janMuRW1pdHRlcigpO1xuICAgIH1cbiAgICAvLyBzZXRzIGluaXRpYWxIaXRcbiAgICAvLyBzZXRzIGNvb3JkQWRqdXN0XG4gICAgcHJvY2Vzc0ZpcnN0Q29vcmQoZXYpIHtcbiAgICAgICAgbGV0IG9yaWdQb2ludCA9IHsgbGVmdDogZXYucGFnZVgsIHRvcDogZXYucGFnZVkgfTtcbiAgICAgICAgbGV0IGFkanVzdGVkUG9pbnQgPSBvcmlnUG9pbnQ7XG4gICAgICAgIGxldCBzdWJqZWN0RWwgPSBldi5zdWJqZWN0RWw7XG4gICAgICAgIGxldCBzdWJqZWN0UmVjdDtcbiAgICAgICAgaWYgKHN1YmplY3RFbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7IC8vIGkuZS4gbm90IGEgRG9jdW1lbnQvU2hhZG93Um9vdFxuICAgICAgICAgICAgc3ViamVjdFJlY3QgPSBpbnRlcm5hbF9janMuY29tcHV0ZVJlY3Qoc3ViamVjdEVsKTtcbiAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBpbnRlcm5hbF9janMuY29uc3RyYWluUG9pbnQoYWRqdXN0ZWRQb2ludCwgc3ViamVjdFJlY3QpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpbml0aWFsSGl0ID0gdGhpcy5pbml0aWFsSGl0ID0gdGhpcy5xdWVyeUhpdEZvck9mZnNldChhZGp1c3RlZFBvaW50LmxlZnQsIGFkanVzdGVkUG9pbnQudG9wKTtcbiAgICAgICAgaWYgKGluaXRpYWxIaXQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVN1YmplY3RDZW50ZXIgJiYgc3ViamVjdFJlY3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgc2xpY2VkU3ViamVjdFJlY3QgPSBpbnRlcm5hbF9janMuaW50ZXJzZWN0UmVjdHMoc3ViamVjdFJlY3QsIGluaXRpYWxIaXQucmVjdCk7XG4gICAgICAgICAgICAgICAgaWYgKHNsaWNlZFN1YmplY3RSZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUG9pbnQgPSBpbnRlcm5hbF9janMuZ2V0UmVjdENlbnRlcihzbGljZWRTdWJqZWN0UmVjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb29yZEFkanVzdCA9IGludGVybmFsX2Nqcy5kaWZmUG9pbnRzKGFkanVzdGVkUG9pbnQsIG9yaWdQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvb3JkQWRqdXN0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVNb3ZlKGV2LCBmb3JjZUhhbmRsZSkge1xuICAgICAgICBsZXQgaGl0ID0gdGhpcy5xdWVyeUhpdEZvck9mZnNldChldi5wYWdlWCArIHRoaXMuY29vcmRBZGp1c3QubGVmdCwgZXYucGFnZVkgKyB0aGlzLmNvb3JkQWRqdXN0LnRvcCk7XG4gICAgICAgIGlmIChmb3JjZUhhbmRsZSB8fCAhaXNIaXRzRXF1YWwodGhpcy5tb3ZpbmdIaXQsIGhpdCkpIHtcbiAgICAgICAgICAgIHRoaXMubW92aW5nSGl0ID0gaGl0O1xuICAgICAgICAgICAgdGhpcy5lbWl0dGVyLnRyaWdnZXIoJ2hpdHVwZGF0ZScsIGhpdCwgZmFsc2UsIGV2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcmVwYXJlSGl0cygpIHtcbiAgICAgICAgdGhpcy5vZmZzZXRUcmFja2VycyA9IGludGVybmFsX2Nqcy5tYXBIYXNoKHRoaXMuZHJvcHBhYmxlU3RvcmUsIChpbnRlcmFjdGlvblNldHRpbmdzKSA9PiB7XG4gICAgICAgICAgICBpbnRlcmFjdGlvblNldHRpbmdzLmNvbXBvbmVudC5wcmVwYXJlSGl0cygpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPZmZzZXRUcmFja2VyKGludGVyYWN0aW9uU2V0dGluZ3MuZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVsZWFzZUhpdHMoKSB7XG4gICAgICAgIGxldCB7IG9mZnNldFRyYWNrZXJzIH0gPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpZCBpbiBvZmZzZXRUcmFja2Vycykge1xuICAgICAgICAgICAgb2Zmc2V0VHJhY2tlcnNbaWRdLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9mZnNldFRyYWNrZXJzID0ge307XG4gICAgfVxuICAgIHF1ZXJ5SGl0Rm9yT2Zmc2V0KG9mZnNldExlZnQsIG9mZnNldFRvcCkge1xuICAgICAgICBsZXQgeyBkcm9wcGFibGVTdG9yZSwgb2Zmc2V0VHJhY2tlcnMgfSA9IHRoaXM7XG4gICAgICAgIGxldCBiZXN0SGl0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaWQgaW4gZHJvcHBhYmxlU3RvcmUpIHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSBkcm9wcGFibGVTdG9yZVtpZF0uY29tcG9uZW50O1xuICAgICAgICAgICAgbGV0IG9mZnNldFRyYWNrZXIgPSBvZmZzZXRUcmFja2Vyc1tpZF07XG4gICAgICAgICAgICBpZiAob2Zmc2V0VHJhY2tlciAmJiAvLyB3YXNuJ3QgZGVzdHJveWVkIG1pZC1kcmFnXG4gICAgICAgICAgICAgICAgb2Zmc2V0VHJhY2tlci5pc1dpdGhpbkNsaXBwaW5nKG9mZnNldExlZnQsIG9mZnNldFRvcCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luTGVmdCA9IG9mZnNldFRyYWNrZXIuY29tcHV0ZUxlZnQoKTtcbiAgICAgICAgICAgICAgICBsZXQgb3JpZ2luVG9wID0gb2Zmc2V0VHJhY2tlci5jb21wdXRlVG9wKCk7XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uTGVmdCA9IG9mZnNldExlZnQgLSBvcmlnaW5MZWZ0O1xuICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvblRvcCA9IG9mZnNldFRvcCAtIG9yaWdpblRvcDtcbiAgICAgICAgICAgICAgICBsZXQgeyBvcmlnUmVjdCB9ID0gb2Zmc2V0VHJhY2tlcjtcbiAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSBvcmlnUmVjdC5yaWdodCAtIG9yaWdSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IG9yaWdSZWN0LmJvdHRvbSAtIG9yaWdSZWN0LnRvcDtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB3aXRoaW4gdGhlIGVsZW1lbnQncyBib3VuZHNcbiAgICAgICAgICAgICAgICBwb3NpdGlvbkxlZnQgPj0gMCAmJiBwb3NpdGlvbkxlZnQgPCB3aWR0aCAmJlxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRvcCA+PSAwICYmIHBvc2l0aW9uVG9wIDwgaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBoaXQgPSBjb21wb25lbnQucXVlcnlIaXQocG9zaXRpb25MZWZ0LCBwb3NpdGlvblRvcCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoaXQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGhpdCBpcyB3aXRoaW4gYWN0aXZlUmFuZ2UsIG1lYW5pbmcgaXQncyBub3QgYSBkZWFkIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLnJhbmdlQ29udGFpbnNSYW5nZShoaXQuZGF0ZVByb2ZpbGUuYWN0aXZlUmFuZ2UsIGhpdC5kYXRlU3Bhbi5yYW5nZSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoIWJlc3RIaXQgfHwgaGl0LmxheWVyID4gYmVzdEhpdC5sYXllcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5jb21wb25lbnRJZCA9IGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LmNvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGJldHRlciB3YXkgdG8gcmUtb3JpZW50IHJlY3RhbmdsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LnJlY3QubGVmdCArPSBvcmlnaW5MZWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0LnJlY3QucmlnaHQgKz0gb3JpZ2luTGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpdC5yZWN0LnRvcCArPSBvcmlnaW5Ub3A7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXQucmVjdC5ib3R0b20gKz0gb3JpZ2luVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmVzdEhpdCA9IGhpdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmVzdEhpdDtcbiAgICB9XG59XG5mdW5jdGlvbiBpc0hpdHNFcXVhbChoaXQwLCBoaXQxKSB7XG4gICAgaWYgKCFoaXQwICYmICFoaXQxKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQm9vbGVhbihoaXQwKSAhPT0gQm9vbGVhbihoaXQxKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBpbnRlcm5hbF9janMuaXNEYXRlU3BhbnNFcXVhbChoaXQwLmRhdGVTcGFuLCBoaXQxLmRhdGVTcGFuKTtcbn1cblxuZnVuY3Rpb24gYnVpbGREYXRlUG9pbnRBcGlXaXRoQ29udGV4dChkYXRlU3BhbiwgY29udGV4dCkge1xuICAgIGxldCBwcm9wcyA9IHt9O1xuICAgIGZvciAobGV0IHRyYW5zZm9ybSBvZiBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVQb2ludFRyYW5zZm9ybXMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wcywgdHJhbnNmb3JtKGRhdGVTcGFuLCBjb250ZXh0KSk7XG4gICAgfVxuICAgIE9iamVjdC5hc3NpZ24ocHJvcHMsIGJ1aWxkRGF0ZVBvaW50QXBpKGRhdGVTcGFuLCBjb250ZXh0LmRhdGVFbnYpKTtcbiAgICByZXR1cm4gcHJvcHM7XG59XG5mdW5jdGlvbiBidWlsZERhdGVQb2ludEFwaShzcGFuLCBkYXRlRW52KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogZGF0ZUVudi50b0RhdGUoc3Bhbi5yYW5nZS5zdGFydCksXG4gICAgICAgIGRhdGVTdHI6IGRhdGVFbnYuZm9ybWF0SXNvKHNwYW4ucmFuZ2Uuc3RhcnQsIHsgb21pdFRpbWU6IHNwYW4uYWxsRGF5IH0pLFxuICAgICAgICBhbGxEYXk6IHNwYW4uYWxsRGF5LFxuICAgIH07XG59XG5cbi8qXG5Nb25pdG9ycyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIHNwZWNpZmljIGRhdGUvdGltZSBvZiBhIGNvbXBvbmVudC5cbkEgcG9pbnRlcmRvd24rcG9pbnRlcnVwIG9uIHRoZSBzYW1lIFwiaGl0XCIgY29uc3RpdHV0ZXMgYSBjbGljay5cbiovXG5jbGFzcyBEYXRlQ2xpY2tpbmcgZXh0ZW5kcyBpbnRlcm5hbF9janMuSW50ZXJhY3Rpb24ge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyRG93biA9IChwZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGRyYWdnaW5nIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGRvd25FbCA9IHBldi5vcmlnRXZlbnQudGFyZ2V0O1xuICAgICAgICAgICAgLy8gZG8gdGhpcyBpbiBwb2ludGVyZG93biAobm90IGRyYWdlbmQpIGJlY2F1c2UgRE9NIG1pZ2h0IGJlIG11dGF0ZWQgYnkgdGhlIHRpbWUgZHJhZ2VuZCBpcyBmaXJlZFxuICAgICAgICAgICAgZHJhZ2dpbmcuc2V0SWdub3JlTW92ZSghdGhpcy5jb21wb25lbnQuaXNWYWxpZERhdGVEb3duRWwoZG93bkVsKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIHdvbid0IGV2ZW4gZmlyZSBpZiBtb3Zpbmcgd2FzIGlnbm9yZWRcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnRW5kID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb21wb25lbnQgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgeyBwb2ludGVyIH0gPSB0aGlzLmRyYWdnaW5nO1xuICAgICAgICAgICAgaWYgKCFwb2ludGVyLndhc1RvdWNoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHsgaW5pdGlhbEhpdCwgZmluYWxIaXQgfSA9IHRoaXMuaGl0RHJhZ2dpbmc7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxIaXQgJiYgZmluYWxIaXQgJiYgaXNIaXRzRXF1YWwoaW5pdGlhbEhpdCwgZmluYWxIaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB7IGNvbnRleHQgfSA9IGNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFyZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYnVpbGREYXRlUG9pbnRBcGlXaXRoQ29udGV4dChpbml0aWFsSGl0LmRhdGVTcGFuLCBjb250ZXh0KSksIHsgZGF5RWw6IGluaXRpYWxIaXQuZGF5RWwsIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCwgdmlldzogY29udGV4dC52aWV3QXBpIHx8IGNvbnRleHQuY2FsZW5kYXJBcGkudmlldyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2RhdGVDbGljaycsIGFyZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyB3ZSBETyB3YW50IHRvIHdhdGNoIHBvaW50ZXIgbW92ZXMgYmVjYXVzZSBvdGhlcndpc2UgZmluYWxIaXQgd29uJ3QgZ2V0IHBvcHVsYXRlZFxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gbmV3IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcoc2V0dGluZ3MuZWwpO1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmF1dG9TY3JvbGxlci5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhpdERyYWdnaW5nID0gdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyh0aGlzLmRyYWdnaW5nLCBpbnRlcm5hbF9janMuaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH1cbn1cblxuLypcblRyYWNrcyB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBwb3J0aW9uIG9mIHRpbWUgb2YgYSBjb21wb25lbnQsXG5jb25zdGl0dXRlZCBieSBhIGRyYWcgb3ZlciBkYXRlIGNlbGxzLCB3aXRoIGEgcG9zc2libGUgZGVsYXkgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZHJhZy5cbiovXG5jbGFzcyBEYXRlU2VsZWN0aW5nIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkludGVyYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG4gICAgICAgIHRoaXMuZHJhZ1NlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGNvbXBvbmVudCwgZHJhZ2dpbmcgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSBjb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIGxldCBjYW5TZWxlY3QgPSBvcHRpb25zLnNlbGVjdGFibGUgJiZcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaXNWYWxpZERhdGVEb3duRWwoZXYub3JpZ0V2ZW50LnRhcmdldCk7XG4gICAgICAgICAgICAvLyBkb24ndCBib3RoZXIgdG8gd2F0Y2ggZXhwZW5zaXZlIG1vdmVzIGlmIGNvbXBvbmVudCB3b24ndCBkbyBzZWxlY3Rpb25cbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIWNhblNlbGVjdCk7XG4gICAgICAgICAgICAvLyBpZiB0b3VjaCwgcmVxdWlyZSB1c2VyIHRvIGhvbGQgZG93blxuICAgICAgICAgICAgZHJhZ2dpbmcuZGVsYXkgPSBldi5pc1RvdWNoID8gZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxKGNvbXBvbmVudCkgOiBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IChldikgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnQuY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChldik7IC8vIHVuc2VsZWN0IHByZXZpb3VzIHNlbGVjdGlvbnNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVIaXRVcGRhdGUgPSAoaGl0LCBpc0ZpbmFsKSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGxldCBkcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBpc0ludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbEhpdCA9IHRoaXMuaGl0RHJhZ2dpbmcuaW5pdGlhbEhpdDtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWxsb3dlZCA9IGhpdC5jb21wb25lbnRJZCA9PT0gaW5pdGlhbEhpdC5jb21wb25lbnRJZFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmlzSGl0Q29tYm9BbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLmlzSGl0Q29tYm9BbGxvd2VkKGluaXRpYWxIaXQsIGhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBqb2luSGl0c0ludG9TZWxlY3Rpb24oaW5pdGlhbEhpdCwgaGl0LCBjb250ZXh0LnBsdWdpbkhvb2tzLmRhdGVTZWxlY3Rpb25UcmFuc2Zvcm1lcnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWRyYWdTZWxlY3Rpb24gfHwgIWludGVybmFsX2Nqcy5pc0RhdGVTZWxlY3Rpb25WYWxpZChkcmFnU2VsZWN0aW9uLCBoaXQuZGF0ZVByb2ZpbGUsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGRyYWdTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkcmFnU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdTRUxFQ1RfREFURVMnLCBzZWxlY3Rpb246IGRyYWdTZWxlY3Rpb24gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaXNGaW5hbCkgeyAvLyBvbmx5IHVuc2VsZWN0IGlmIG1vdmVkIGF3YXkgd2hpbGUgZHJhZ2dpbmdcbiAgICAgICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VMRUNUX0RBVEVTJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1NlbGVjdGlvbiA9IGRyYWdTZWxlY3Rpb247IC8vIG9ubHkgY2xlYXIgaWYgbW92ZWQgYXdheSBmcm9tIGFsbCBoaXRzIHdoaWxlIGRyYWdnaW5nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlclVwID0gKHBldikgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpcyBhbHJlYWR5IHJlbmRlcmVkLCBzbyBqdXN0IG5lZWQgdG8gcmVwb3J0IHNlbGVjdGlvblxuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy50cmlnZ2VyRGF0ZVNlbGVjdCh0aGlzLmRyYWdTZWxlY3Rpb24sIHBldiwgdGhpcy5jb21wb25lbnQuY29udGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHsgY29tcG9uZW50IH0gPSBzZXR0aW5ncztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIGxldCBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhzZXR0aW5ncy5lbCk7XG4gICAgICAgIGRyYWdnaW5nLnRvdWNoU2Nyb2xsQWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICBkcmFnZ2luZy5taW5EaXN0YW5jZSA9IG9wdGlvbnMuc2VsZWN0TWluRGlzdGFuY2UgfHwgMDtcbiAgICAgICAgZHJhZ2dpbmcuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IG9wdGlvbnMuZHJhZ1Njcm9sbDtcbiAgICAgICAgbGV0IGhpdERyYWdnaW5nID0gdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyh0aGlzLmRyYWdnaW5nLCBpbnRlcm5hbF9janMuaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCB0aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ3BvaW50ZXJ1cCcsIHRoaXMuaGFuZGxlUG9pbnRlclVwKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfVxufVxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxKGNvbXBvbmVudCkge1xuICAgIGxldCB7IG9wdGlvbnMgfSA9IGNvbXBvbmVudC5jb250ZXh0O1xuICAgIGxldCBkZWxheSA9IG9wdGlvbnMuc2VsZWN0TG9uZ1ByZXNzRGVsYXk7XG4gICAgaWYgKGRlbGF5ID09IG51bGwpIHtcbiAgICAgICAgZGVsYXkgPSBvcHRpb25zLmxvbmdQcmVzc0RlbGF5O1xuICAgIH1cbiAgICByZXR1cm4gZGVsYXk7XG59XG5mdW5jdGlvbiBqb2luSGl0c0ludG9TZWxlY3Rpb24oaGl0MCwgaGl0MSwgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycykge1xuICAgIGxldCBkYXRlU3BhbjAgPSBoaXQwLmRhdGVTcGFuO1xuICAgIGxldCBkYXRlU3BhbjEgPSBoaXQxLmRhdGVTcGFuO1xuICAgIGxldCBtcyA9IFtcbiAgICAgICAgZGF0ZVNwYW4wLnJhbmdlLnN0YXJ0LFxuICAgICAgICBkYXRlU3BhbjAucmFuZ2UuZW5kLFxuICAgICAgICBkYXRlU3BhbjEucmFuZ2Uuc3RhcnQsXG4gICAgICAgIGRhdGVTcGFuMS5yYW5nZS5lbmQsXG4gICAgXTtcbiAgICBtcy5zb3J0KGludGVybmFsX2Nqcy5jb21wYXJlTnVtYmVycyk7XG4gICAgbGV0IHByb3BzID0ge307XG4gICAgZm9yIChsZXQgdHJhbnNmb3JtZXIgb2YgZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycykge1xuICAgICAgICBsZXQgcmVzID0gdHJhbnNmb3JtZXIoaGl0MCwgaGl0MSk7XG4gICAgICAgIGlmIChyZXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCByZXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByb3BzLnJhbmdlID0geyBzdGFydDogbXNbMF0sIGVuZDogbXNbM10gfTtcbiAgICBwcm9wcy5hbGxEYXkgPSBkYXRlU3BhbjAuYWxsRGF5O1xuICAgIHJldHVybiBwcm9wcztcbn1cblxuY2xhc3MgRXZlbnREcmFnZ2luZyBleHRlbmRzIGludGVybmFsX2Nqcy5JbnRlcmFjdGlvbiB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoc2V0dGluZ3MpO1xuICAgICAgICAvLyBpbnRlcm5hbCBzdGF0ZVxuICAgICAgICB0aGlzLnN1YmplY3RFbCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3ViamVjdFNlZyA9IG51bGw7IC8vIHRoZSBzZWcgYmVpbmcgc2VsZWN0ZWQvZHJhZ2dlZFxuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudFJhbmdlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWxldmFudEV2ZW50cyA9IG51bGw7IC8vIHRoZSBldmVudHMgYmVpbmcgZHJhZ2dlZFxuICAgICAgICB0aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbGlkTXV0YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCBvcmlnVGFyZ2V0ID0gZXYub3JpZ0V2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGxldCB7IGNvbXBvbmVudCwgZHJhZ2dpbmcgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgeyBtaXJyb3IgfSA9IGRyYWdnaW5nO1xuICAgICAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgICAgICBsZXQgaW5pdGlhbENvbnRleHQgPSBjb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIHRoaXMuc3ViamVjdEVsID0gZXYuc3ViamVjdEVsO1xuICAgICAgICAgICAgbGV0IHN1YmplY3RTZWcgPSB0aGlzLnN1YmplY3RTZWcgPSBpbnRlcm5hbF9janMuZ2V0RWxTZWcoZXYuc3ViamVjdEVsKTtcbiAgICAgICAgICAgIGxldCBldmVudFJhbmdlID0gdGhpcy5ldmVudFJhbmdlID0gc3ViamVjdFNlZy5ldmVudFJhbmdlO1xuICAgICAgICAgICAgbGV0IGV2ZW50SW5zdGFuY2VJZCA9IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgIHRoaXMucmVsZXZhbnRFdmVudHMgPSBpbnRlcm5hbF9janMuZ2V0UmVsZXZhbnRFdmVudHMoaW5pdGlhbENvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5ldmVudFN0b3JlLCBldmVudEluc3RhbmNlSWQpO1xuICAgICAgICAgICAgZHJhZ2dpbmcubWluRGlzdGFuY2UgPSBldi5pc1RvdWNoID8gMCA6IG9wdGlvbnMuZXZlbnREcmFnTWluRGlzdGFuY2U7XG4gICAgICAgICAgICBkcmFnZ2luZy5kZWxheSA9XG4gICAgICAgICAgICAgICAgLy8gb25seSBkbyBhIHRvdWNoIGRlbGF5IGlmIHRvdWNoIGFuZCB0aGlzIGV2ZW50IGhhc24ndCBiZWVuIHNlbGVjdGVkIHlldFxuICAgICAgICAgICAgICAgIChldi5pc1RvdWNoICYmIGV2ZW50SW5zdGFuY2VJZCAhPT0gY29tcG9uZW50LnByb3BzLmV2ZW50U2VsZWN0aW9uKSA/XG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSA6XG4gICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5maXhlZE1pcnJvclBhcmVudCkge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gb3B0aW9ucy5maXhlZE1pcnJvclBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1pcnJvci5wYXJlbnROb2RlID0gaW50ZXJuYWxfY2pzLmVsZW1lbnRDbG9zZXN0KG9yaWdUYXJnZXQsICcuZmMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1pcnJvci5yZXZlcnREdXJhdGlvbiA9IG9wdGlvbnMuZHJhZ1JldmVydER1cmF0aW9uO1xuICAgICAgICAgICAgbGV0IGlzVmFsaWQgPSBjb21wb25lbnQuaXNWYWxpZFNlZ0Rvd25FbChvcmlnVGFyZ2V0KSAmJlxuICAgICAgICAgICAgICAgICFpbnRlcm5hbF9janMuZWxlbWVudENsb3Nlc3Qob3JpZ1RhcmdldCwgJy5mYy1ldmVudC1yZXNpemVyJyk7IC8vIE5PVCBvbiBhIHJlc2l6ZXJcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldElnbm9yZU1vdmUoIWlzVmFsaWQpO1xuICAgICAgICAgICAgLy8gZGlzYWJsZSBkcmFnZ2luZyBmb3IgZWxlbWVudHMgdGhhdCBhcmUgcmVzaXphYmxlIChpZSwgc2VsZWN0YWJsZSlcbiAgICAgICAgICAgIC8vIGJ1dCBhcmUgbm90IGRyYWdnYWJsZVxuICAgICAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gaXNWYWxpZCAmJlxuICAgICAgICAgICAgICAgIGV2LnN1YmplY3RFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZjLWV2ZW50LWRyYWdnYWJsZScpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdTdGFydCA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IGluaXRpYWxDb250ZXh0ID0gdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIGxldCBldmVudFJhbmdlID0gdGhpcy5ldmVudFJhbmdlO1xuICAgICAgICAgICAgbGV0IGV2ZW50SW5zdGFuY2VJZCA9IGV2ZW50UmFuZ2UuaW5zdGFuY2UuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgIGlmIChldi5pc1RvdWNoKSB7XG4gICAgICAgICAgICAgICAgLy8gbmVlZCB0byBzZWxlY3QgYSBkaWZmZXJlbnQgZXZlbnQ/XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50SW5zdGFuY2VJZCAhPT0gdGhpcy5jb21wb25lbnQucHJvcHMuZXZlbnRTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnU0VMRUNUX0VWRU5UJywgZXZlbnRJbnN0YW5jZUlkIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIG5vdyB1c2luZyBtb3VzZSwgYnV0IHdhcyBwcmV2aW91cyB0b3VjaCBpbnRlcmFjdGlvbiwgY2xlYXIgc2VsZWN0ZWQgZXZlbnRcbiAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFTEVDVF9FVkVOVCcgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuY2FsZW5kYXJBcGkudW5zZWxlY3QoZXYpOyAvLyB1bnNlbGVjdCAqZGF0ZSogc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudERyYWdTdGFydCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHRoaXMuc3ViamVjdEVsLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IGludGVybmFsX2Nqcy5FdmVudEltcGwoaW5pdGlhbENvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAganNFdmVudDogZXYub3JpZ0V2ZW50LFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiBpbml0aWFsQ29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZUhpdFVwZGF0ZSA9IChoaXQsIGlzRmluYWwpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlbGV2YW50RXZlbnRzID0gdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGxldCBpbml0aWFsSGl0ID0gdGhpcy5oaXREcmFnZ2luZy5pbml0aWFsSGl0O1xuICAgICAgICAgICAgbGV0IGluaXRpYWxDb250ZXh0ID0gdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgICAgIC8vIHN0YXRlcyBiYXNlZCBvbiBuZXcgaGl0XG4gICAgICAgICAgICBsZXQgcmVjZWl2aW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgbGV0IG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IHJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0ID0gaGl0LmNvbnRleHQ7XG4gICAgICAgICAgICAgICAgbGV0IHJlY2VpdmluZ09wdGlvbnMgPSByZWNlaXZpbmdDb250ZXh0Lm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0ID09PSByZWNlaXZpbmdDb250ZXh0IHx8XG4gICAgICAgICAgICAgICAgICAgIChyZWNlaXZpbmdPcHRpb25zLmVkaXRhYmxlICYmIHJlY2VpdmluZ09wdGlvbnMuZHJvcHBhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbiA9IGNvbXB1dGVFdmVudE11dGF0aW9uKGluaXRpYWxIaXQsIGhpdCwgcmVjZWl2aW5nQ29udGV4dC5nZXRDdXJyZW50RGF0YSgpLnBsdWdpbkhvb2tzLmV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBpbnRlcm5hbF9janMuYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZShyZWxldmFudEV2ZW50cywgcmVjZWl2aW5nQ29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50VWlCYXNlcywgbXV0YXRpb24sIHJlY2VpdmluZ0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWxfY2pzLmlzSW50ZXJhY3Rpb25WYWxpZChpbnRlcmFjdGlvbiwgaGl0LmRhdGVQcm9maWxlLCByZWNlaXZpbmdDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5RHJhZyhyZWNlaXZpbmdDb250ZXh0LCBpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICBpZiAoIWlzSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5lbmFibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGludGVybmFsX2Nqcy5kaXNhYmxlQ3Vyc29yKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRmluYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbENvbnRleHQgPT09IHJlY2VpdmluZ0NvbnRleHQgJiYgLy8gVE9ETzogd3JpdGUgdGVzdCBmb3IgdGhpc1xuICAgICAgICAgICAgICAgICAgICBpc0hpdHNFcXVhbChpbml0aWFsSGl0LCBoaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5zZXRNaXJyb3JOZWVkc1JldmVydCghbXV0YXRpb24pO1xuICAgICAgICAgICAgICAgIC8vIHJlbmRlciB0aGUgbWlycm9yIGlmIG5vIGFscmVhZHktcmVuZGVyZWQgbWlycm9yXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2lzaCB3ZSBjb3VsZCBzb21laG93IHdhaXQgZm9yIGRpc3BhdGNoIHRvIGd1YXJhbnRlZSByZW5kZXJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nLnNldE1pcnJvcklzVmlzaWJsZSghaGl0IHx8ICF0aGlzLnN1YmplY3RFbC5nZXRSb290Tm9kZSgpLnF1ZXJ5U2VsZWN0b3IoJy5mYy1ldmVudC1taXJyb3InKSk7XG4gICAgICAgICAgICAgICAgLy8gYXNzaWduIHN0YXRlcyBiYXNlZCBvbiBuZXcgaGl0XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gcmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkTXV0YXRpb24gPSBtdXRhdGlvbjtcbiAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG11dGF0ZWRSZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyVXAgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYW51cCgpOyAvLyBiZWNhdXNlIGhhbmRsZURyYWdFbmQgd29uJ3QgZmlyZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZURyYWdFbmQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbENvbnRleHQgPSB0aGlzLmNvbXBvbmVudC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsVmlldyA9IGluaXRpYWxDb250ZXh0LnZpZXdBcGk7XG4gICAgICAgICAgICAgICAgbGV0IHsgcmVjZWl2aW5nQ29udGV4dCwgdmFsaWRNdXRhdGlvbiB9ID0gdGhpcztcbiAgICAgICAgICAgICAgICBsZXQgZXZlbnREZWYgPSB0aGlzLmV2ZW50UmFuZ2UuZGVmO1xuICAgICAgICAgICAgICAgIGxldCBldmVudEluc3RhbmNlID0gdGhpcy5ldmVudFJhbmdlLmluc3RhbmNlO1xuICAgICAgICAgICAgICAgIGxldCBldmVudEFwaSA9IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKGluaXRpYWxDb250ZXh0LCBldmVudERlZiwgZXZlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgbGV0IHJlbGV2YW50RXZlbnRzID0gdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgICAgICBsZXQgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgbGV0IHsgZmluYWxIaXQgfSA9IHRoaXMuaGl0RHJhZ2dpbmc7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRyYWcoKTsgLy8gbXVzdCBoYXBwZW4gYWZ0ZXIgcmV2ZXJ0IGFuaW1hdGlvblxuICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnREcmFnU3RvcCcsIHtcbiAgICAgICAgICAgICAgICAgICAgZWw6IHRoaXMuc3ViamVjdEVsLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogZXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgIGpzRXZlbnQ6IGV2Lm9yaWdFdmVudCxcbiAgICAgICAgICAgICAgICAgICAgdmlldzogaW5pdGlhbFZpZXcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCB3aXRoaW4gc2FtZSBjYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVjZWl2aW5nQ29udGV4dCA9PT0gaW5pdGlhbENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cGRhdGVkRXZlbnRBcGkgPSBuZXcgaW50ZXJuYWxfY2pzLkV2ZW50SW1wbChpbml0aWFsQ29udGV4dCwgbXV0YXRlZFJlbGV2YW50RXZlbnRzLmRlZnNbZXZlbnREZWYuZGVmSWRdLCBldmVudEluc3RhbmNlID8gbXV0YXRlZFJlbGV2YW50RXZlbnRzLmluc3RhbmNlc1tldmVudEluc3RhbmNlLmluc3RhbmNlSWRdIDogbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbnRDaGFuZ2VBcmcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB1cGRhdGVkRXZlbnRBcGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZEV2ZW50czogaW50ZXJuYWxfY2pzLmJ1aWxkRXZlbnRBcGlzKG11dGF0ZWRSZWxldmFudEV2ZW50cywgaW5pdGlhbENvbnRleHQsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cywgLy8gdGhlIHByZS1jaGFuZ2UgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmFuc2Zvcm1lZCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdHJhbnNmb3JtZXIgb2YgaW5pdGlhbENvbnRleHQuZ2V0Q3VycmVudERhdGEoKS5wbHVnaW5Ib29rcy5ldmVudERyb3BUcmFuc2Zvcm1lcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRyYW5zZm9ybWVkLCB0cmFuc2Zvcm1lcih2YWxpZE11dGF0aW9uLCBpbml0aWFsQ29udGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudERyb3AnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXZlbnRDaGFuZ2VBcmcpLCB0cmFuc2Zvcm1lZCksIHsgZWw6IGV2LnN1YmplY3RFbCwgZGVsdGE6IHZhbGlkTXV0YXRpb24uZGF0ZXNEZWx0YSwganNFdmVudDogZXYub3JpZ0V2ZW50LCB2aWV3OiBpbml0aWFsVmlldyB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCBpbiBkaWZmZXJlbnQgY2FsZW5kYXJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWNlaXZpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbnRSZW1vdmVBcmcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5idWlsZEV2ZW50QXBpcyhyZWxldmFudEV2ZW50cywgaW5pdGlhbENvbnRleHQsIGV2ZW50SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50TGVhdmUnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50UmVtb3ZlQXJnKSwgeyBkcmFnZ2VkRWw6IGV2LnN1YmplY3RFbCwgdmlldzogaW5pdGlhbFZpZXcgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiByZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbENvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlbW92ZScsIGV2ZW50UmVtb3ZlQXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRlZEV2ZW50RGVmID0gbXV0YXRlZFJlbGV2YW50RXZlbnRzLmRlZnNbZXZlbnREZWYuZGVmSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZGVkRXZlbnRJbnN0YW5jZSA9IG11dGF0ZWRSZWxldmFudEV2ZW50cy5pbnN0YW5jZXNbZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGRlZEV2ZW50QXBpID0gbmV3IGludGVybmFsX2Nqcy5FdmVudEltcGwocmVjZWl2aW5nQ29udGV4dCwgYWRkZWRFdmVudERlZiwgYWRkZWRFdmVudEluc3RhbmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdNRVJHRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV2ZW50QWRkQXJnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBhZGRlZEV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5idWlsZEV2ZW50QXBpcyhtdXRhdGVkUmVsZXZhbnRFdmVudHMsIHJlY2VpdmluZ0NvbnRleHQsIGFkZGVkRXZlbnRJbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRU1PVkVfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IG11dGF0ZWRSZWxldmFudEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRBZGQnLCBldmVudEFkZEFyZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VMRUNUX0VWRU5UJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUlkOiBldmVudEluc3RhbmNlLmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZHJvcCcsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYnVpbGREYXRlUG9pbnRBcGlXaXRoQ29udGV4dChmaW5hbEhpdC5kYXRlU3BhbiwgcmVjZWl2aW5nQ29udGV4dCkpLCB7IGRyYWdnZWRFbDogZXYuc3ViamVjdEVsLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZWNlaXZlJywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBldmVudEFkZEFyZyksIHsgZHJhZ2dlZEVsOiBldi5zdWJqZWN0RWwsIHZpZXc6IGZpbmFsSGl0LmNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxDb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignX25vRXZlbnREcm9wJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgICAgIGxldCBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhzZXR0aW5ncy5lbCk7XG4gICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSBFdmVudERyYWdnaW5nLlNFTEVDVE9SO1xuICAgICAgICBkcmFnZ2luZy50b3VjaFNjcm9sbEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgZHJhZ2dpbmcuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IG9wdGlvbnMuZHJhZ1Njcm9sbDtcbiAgICAgICAgbGV0IGhpdERyYWdnaW5nID0gdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyh0aGlzLmRyYWdnaW5nLCBpbnRlcm5hbF9janMuaW50ZXJhY3Rpb25TZXR0aW5nc1N0b3JlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcudXNlU3ViamVjdENlbnRlciA9IHNldHRpbmdzLnVzZUV2ZW50Q2VudGVyO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2hpdHVwZGF0ZScsIHRoaXMuaGFuZGxlSGl0VXBkYXRlKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5oYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnZW5kJywgdGhpcy5oYW5kbGVEcmFnRW5kKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfVxuICAgIC8vIHJlbmRlciBhIGRyYWcgc3RhdGUgb24gdGhlIG5leHQgcmVjZWl2aW5nQ2FsZW5kYXJcbiAgICBkaXNwbGF5RHJhZyhuZXh0Q29udGV4dCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IGluaXRpYWxDb250ZXh0ID0gdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgbGV0IHByZXZDb250ZXh0ID0gdGhpcy5yZWNlaXZpbmdDb250ZXh0O1xuICAgICAgICAvLyBkb2VzIHRoZSBwcmV2aW91cyBjYWxlbmRhciBuZWVkIHRvIGJlIGNsZWFyZWQ/XG4gICAgICAgIGlmIChwcmV2Q29udGV4dCAmJiBwcmV2Q29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIGRvZXMgdGhlIGluaXRpYWwgY2FsZW5kYXIgbmVlZCB0byBiZSBjbGVhcmVkP1xuICAgICAgICAgICAgLy8gaWYgc28sIGRvbid0IGNsZWFyIGFsbCB0aGUgd2F5LiB3ZSBzdGlsbCBuZWVkIHRvIHRvIGhpZGUgdGhlIGFmZmVjdGVkRXZlbnRzXG4gICAgICAgICAgICBpZiAocHJldkNvbnRleHQgPT09IGluaXRpYWxDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgcHJldkNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX0VWRU5UX0RSQUcnLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IHN0YXRlLmFmZmVjdGVkRXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZEV2ZW50czogaW50ZXJuYWxfY2pzLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBjb21wbGV0ZWx5IGNsZWFyIHRoZSBvbGQgY2FsZW5kYXIgaWYgaXQgd2Fzbid0IHRoZSBpbml0aWFsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9EUkFHJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dENvbnRleHQpIHtcbiAgICAgICAgICAgIG5leHRDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1NFVF9FVkVOVF9EUkFHJywgc3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xlYXJEcmFnKCkge1xuICAgICAgICBsZXQgaW5pdGlhbENhbGVuZGFyID0gdGhpcy5jb21wb25lbnQuY29udGV4dDtcbiAgICAgICAgbGV0IHsgcmVjZWl2aW5nQ29udGV4dCB9ID0gdGhpcztcbiAgICAgICAgaWYgKHJlY2VpdmluZ0NvbnRleHQpIHtcbiAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIGluaXRpYWwgY2FsZW5kYXIgbWlnaHQgaGF2ZSBhbiBkdW1teSBkcmFnIHN0YXRlIGZyb20gZGlzcGxheURyYWdcbiAgICAgICAgaWYgKGluaXRpYWxDYWxlbmRhciAhPT0gcmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICAgICAgaW5pdGlhbENhbGVuZGFyLmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUX0VWRU5UX0RSQUcnIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFudXAoKSB7XG4gICAgICAgIHRoaXMuc3ViamVjdFNlZyA9IG51bGw7XG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2ZW50UmFuZ2UgPSBudWxsO1xuICAgICAgICB0aGlzLnJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgIH1cbn1cbi8vIFRPRE86IHRlc3QgdGhpcyBpbiBJRTExXG4vLyBRVUVTVElPTjogd2h5IGRvIHdlIG5lZWQgaXQgb24gdGhlIHJlc2l6YWJsZT8/P1xuRXZlbnREcmFnZ2luZy5TRUxFQ1RPUiA9ICcuZmMtZXZlbnQtZHJhZ2dhYmxlLCAuZmMtZXZlbnQtcmVzaXphYmxlJztcbmZ1bmN0aW9uIGNvbXB1dGVFdmVudE11dGF0aW9uKGhpdDAsIGhpdDEsIG1hc3NhZ2Vycykge1xuICAgIGxldCBkYXRlU3BhbjAgPSBoaXQwLmRhdGVTcGFuO1xuICAgIGxldCBkYXRlU3BhbjEgPSBoaXQxLmRhdGVTcGFuO1xuICAgIGxldCBkYXRlMCA9IGRhdGVTcGFuMC5yYW5nZS5zdGFydDtcbiAgICBsZXQgZGF0ZTEgPSBkYXRlU3BhbjEucmFuZ2Uuc3RhcnQ7XG4gICAgbGV0IHN0YW5kYXJkUHJvcHMgPSB7fTtcbiAgICBpZiAoZGF0ZVNwYW4wLmFsbERheSAhPT0gZGF0ZVNwYW4xLmFsbERheSkge1xuICAgICAgICBzdGFuZGFyZFByb3BzLmFsbERheSA9IGRhdGVTcGFuMS5hbGxEYXk7XG4gICAgICAgIHN0YW5kYXJkUHJvcHMuaGFzRW5kID0gaGl0MS5jb250ZXh0Lm9wdGlvbnMuYWxsRGF5TWFpbnRhaW5EdXJhdGlvbjtcbiAgICAgICAgaWYgKGRhdGVTcGFuMS5hbGxEYXkpIHtcbiAgICAgICAgICAgIC8vIG1lYW5zIGRhdGUxIGlzIGFscmVhZHkgc3RhcnQtb2YtZGF5LFxuICAgICAgICAgICAgLy8gYnV0IGRhdGUwIG5lZWRzIHRvIGJlIGNvbnZlcnRlZFxuICAgICAgICAgICAgZGF0ZTAgPSBpbnRlcm5hbF9janMuc3RhcnRPZkRheShkYXRlMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGRlbHRhID0gaW50ZXJuYWxfY2pzLmRpZmZEYXRlcyhkYXRlMCwgZGF0ZTEsIGhpdDAuY29udGV4dC5kYXRlRW52LCBoaXQwLmNvbXBvbmVudElkID09PSBoaXQxLmNvbXBvbmVudElkID9cbiAgICAgICAgaGl0MC5sYXJnZVVuaXQgOlxuICAgICAgICBudWxsKTtcbiAgICBpZiAoZGVsdGEubWlsbGlzZWNvbmRzKSB7IC8vIGhhcyBob3Vycy9taW51dGVzL3NlY29uZHNcbiAgICAgICAgc3RhbmRhcmRQcm9wcy5hbGxEYXkgPSBmYWxzZTtcbiAgICB9XG4gICAgbGV0IG11dGF0aW9uID0ge1xuICAgICAgICBkYXRlc0RlbHRhOiBkZWx0YSxcbiAgICAgICAgc3RhbmRhcmRQcm9wcyxcbiAgICB9O1xuICAgIGZvciAobGV0IG1hc3NhZ2VyIG9mIG1hc3NhZ2Vycykge1xuICAgICAgICBtYXNzYWdlcihtdXRhdGlvbiwgaGl0MCwgaGl0MSk7XG4gICAgfVxuICAgIHJldHVybiBtdXRhdGlvbjtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRvdWNoRGVsYXkoY29tcG9uZW50KSB7XG4gICAgbGV0IHsgb3B0aW9ucyB9ID0gY29tcG9uZW50LmNvbnRleHQ7XG4gICAgbGV0IGRlbGF5ID0gb3B0aW9ucy5ldmVudExvbmdQcmVzc0RlbGF5O1xuICAgIGlmIChkZWxheSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGF5ID0gb3B0aW9ucy5sb25nUHJlc3NEZWxheTtcbiAgICB9XG4gICAgcmV0dXJuIGRlbGF5O1xufVxuXG5jbGFzcyBFdmVudFJlc2l6aW5nIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkludGVyYWN0aW9uIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5ncykge1xuICAgICAgICBzdXBlcihzZXR0aW5ncyk7XG4gICAgICAgIC8vIGludGVybmFsIHN0YXRlXG4gICAgICAgIHRoaXMuZHJhZ2dpbmdTZWdFbCA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmdTZWcgPSBudWxsOyAvLyBUT0RPOiByZW5hbWUgdG8gcmVzaXppbmdTZWc/IHN1YmplY3RTZWc/XG4gICAgICAgIHRoaXMuZXZlbnRSYW5nZSA9IG51bGw7XG4gICAgICAgIHRoaXMucmVsZXZhbnRFdmVudHMgPSBudWxsO1xuICAgICAgICB0aGlzLnZhbGlkTXV0YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCBzZWdFbCA9IHRoaXMucXVlcnlTZWdFbChldik7XG4gICAgICAgICAgICBsZXQgc2VnID0gaW50ZXJuYWxfY2pzLmdldEVsU2VnKHNlZ0VsKTtcbiAgICAgICAgICAgIGxldCBldmVudFJhbmdlID0gdGhpcy5ldmVudFJhbmdlID0gc2VnLmV2ZW50UmFuZ2U7XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nLm1pbkRpc3RhbmNlID0gY29tcG9uZW50LmNvbnRleHQub3B0aW9ucy5ldmVudERyYWdNaW5EaXN0YW5jZTtcbiAgICAgICAgICAgIC8vIGlmIHRvdWNoLCBuZWVkIHRvIGJlIHdvcmtpbmcgd2l0aCBhIHNlbGVjdGVkIGV2ZW50XG4gICAgICAgICAgICB0aGlzLmRyYWdnaW5nLnNldElnbm9yZU1vdmUoIXRoaXMuY29tcG9uZW50LmlzVmFsaWRTZWdEb3duRWwoZXYub3JpZ0V2ZW50LnRhcmdldCkgfHxcbiAgICAgICAgICAgICAgICAoZXYuaXNUb3VjaCAmJiB0aGlzLmNvbXBvbmVudC5wcm9wcy5ldmVudFNlbGVjdGlvbiAhPT0gZXZlbnRSYW5nZS5pbnN0YW5jZS5pbnN0YW5jZUlkKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgICAgICAgIGxldCBldmVudFJhbmdlID0gdGhpcy5ldmVudFJhbmdlO1xuICAgICAgICAgICAgdGhpcy5yZWxldmFudEV2ZW50cyA9IGludGVybmFsX2Nqcy5nZXRSZWxldmFudEV2ZW50cyhjb250ZXh0LmdldEN1cnJlbnREYXRhKCkuZXZlbnRTdG9yZSwgdGhpcy5ldmVudFJhbmdlLmluc3RhbmNlLmluc3RhbmNlSWQpO1xuICAgICAgICAgICAgbGV0IHNlZ0VsID0gdGhpcy5xdWVyeVNlZ0VsKGV2KTtcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmdTZWdFbCA9IHNlZ0VsO1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2luZ1NlZyA9IGludGVybmFsX2Nqcy5nZXRFbFNlZyhzZWdFbCk7XG4gICAgICAgICAgICBjb250ZXh0LmNhbGVuZGFyQXBpLnVuc2VsZWN0KCk7XG4gICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZXNpemVTdGFydCcsIHtcbiAgICAgICAgICAgICAgICBlbDogc2VnRWwsXG4gICAgICAgICAgICAgICAgZXZlbnQ6IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKGNvbnRleHQsIGV2ZW50UmFuZ2UuZGVmLCBldmVudFJhbmdlLmluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlSGl0VXBkYXRlID0gKGhpdCwgaXNGaW5hbCwgZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGNvbnRleHQgfSA9IHRoaXMuY29tcG9uZW50O1xuICAgICAgICAgICAgbGV0IHJlbGV2YW50RXZlbnRzID0gdGhpcy5yZWxldmFudEV2ZW50cztcbiAgICAgICAgICAgIGxldCBpbml0aWFsSGl0ID0gdGhpcy5oaXREcmFnZ2luZy5pbml0aWFsSGl0O1xuICAgICAgICAgICAgbGV0IGV2ZW50SW5zdGFuY2UgPSB0aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgbGV0IG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICBsZXQgaXNJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgYWZmZWN0ZWRFdmVudHM6IHJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChoaXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWxsb3dlZCA9IGhpdC5jb21wb25lbnRJZCA9PT0gaW5pdGlhbEhpdC5jb21wb25lbnRJZFxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmlzSGl0Q29tYm9BbGxvd2VkXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLmlzSGl0Q29tYm9BbGxvd2VkKGluaXRpYWxIaXQsIGhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhbGxvd2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gY29tcHV0ZU11dGF0aW9uKGluaXRpYWxIaXQsIGhpdCwgZXYuc3ViamVjdEVsLmNsYXNzTGlzdC5jb250YWlucygnZmMtZXZlbnQtcmVzaXplci1zdGFydCcpLCBldmVudEluc3RhbmNlLnJhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgICBtdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBpbnRlcm5hbF9janMuYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZShyZWxldmFudEV2ZW50cywgY29udGV4dC5nZXRDdXJyZW50RGF0YSgpLmV2ZW50VWlCYXNlcywgbXV0YXRpb24sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbF9janMuaXNJbnRlcmFjdGlvblZhbGlkKGludGVyYWN0aW9uLCBoaXQuZGF0ZVByb2ZpbGUsIGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSW52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbXV0YXRlZFJlbGV2YW50RXZlbnRzID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG11dGF0ZWRSZWxldmFudEV2ZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX0VWRU5UX1JFU0laRScsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpbnRlcmFjdGlvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfUkVTSVpFJyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbiAmJiBpc0hpdHNFcXVhbChpbml0aWFsSGl0LCBoaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZE11dGF0aW9uID0gbXV0YXRpb247XG4gICAgICAgICAgICAgICAgdGhpcy5tdXRhdGVkUmVsZXZhbnRFdmVudHMgPSBtdXRhdGVkUmVsZXZhbnRFdmVudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ0VuZCA9IChldikgPT4ge1xuICAgICAgICAgICAgbGV0IHsgY29udGV4dCB9ID0gdGhpcy5jb21wb25lbnQ7XG4gICAgICAgICAgICBsZXQgZXZlbnREZWYgPSB0aGlzLmV2ZW50UmFuZ2UuZGVmO1xuICAgICAgICAgICAgbGV0IGV2ZW50SW5zdGFuY2UgPSB0aGlzLmV2ZW50UmFuZ2UuaW5zdGFuY2U7XG4gICAgICAgICAgICBsZXQgZXZlbnRBcGkgPSBuZXcgaW50ZXJuYWxfY2pzLkV2ZW50SW1wbChjb250ZXh0LCBldmVudERlZiwgZXZlbnRJbnN0YW5jZSk7XG4gICAgICAgICAgICBsZXQgcmVsZXZhbnRFdmVudHMgPSB0aGlzLnJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgbGV0IG11dGF0ZWRSZWxldmFudEV2ZW50cyA9IHRoaXMubXV0YXRlZFJlbGV2YW50RXZlbnRzO1xuICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50UmVzaXplU3RvcCcsIHtcbiAgICAgICAgICAgICAgICBlbDogdGhpcy5kcmFnZ2luZ1NlZ0VsLFxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudEFwaSxcbiAgICAgICAgICAgICAgICBqc0V2ZW50OiBldi5vcmlnRXZlbnQsXG4gICAgICAgICAgICAgICAgdmlldzogY29udGV4dC52aWV3QXBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy52YWxpZE11dGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRFdmVudEFwaSA9IG5ldyBpbnRlcm5hbF9janMuRXZlbnRJbXBsKGNvbnRleHQsIG11dGF0ZWRSZWxldmFudEV2ZW50cy5kZWZzW2V2ZW50RGVmLmRlZklkXSwgZXZlbnRJbnN0YW5jZSA/IG11dGF0ZWRSZWxldmFudEV2ZW50cy5pbnN0YW5jZXNbZXZlbnRJbnN0YW5jZS5pbnN0YW5jZUlkXSA6IG51bGwpO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogbXV0YXRlZFJlbGV2YW50RXZlbnRzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCBldmVudENoYW5nZUFyZyA9IHtcbiAgICAgICAgICAgICAgICAgICAgb2xkRXZlbnQ6IGV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICBldmVudDogdXBkYXRlZEV2ZW50QXBpLFxuICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBpbnRlcm5hbF9janMuYnVpbGRFdmVudEFwaXMobXV0YXRlZFJlbGV2YW50RXZlbnRzLCBjb250ZXh0LCBldmVudEluc3RhbmNlKSxcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0KCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01FUkdFX0VWRU5UUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRTdG9yZTogcmVsZXZhbnRFdmVudHMsIC8vIHRoZSBwcmUtY2hhbmdlIGV2ZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmVtaXR0ZXIudHJpZ2dlcignZXZlbnRSZXNpemUnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV2ZW50Q2hhbmdlQXJnKSwgeyBlbDogdGhpcy5kcmFnZ2luZ1NlZ0VsLCBzdGFydERlbHRhOiB0aGlzLnZhbGlkTXV0YXRpb24uc3RhcnREZWx0YSB8fCBpbnRlcm5hbF9janMuY3JlYXRlRHVyYXRpb24oMCksIGVuZERlbHRhOiB0aGlzLnZhbGlkTXV0YXRpb24uZW5kRGVsdGEgfHwgaW50ZXJuYWxfY2pzLmNyZWF0ZUR1cmF0aW9uKDApLCBqc0V2ZW50OiBldi5vcmlnRXZlbnQsIHZpZXc6IGNvbnRleHQudmlld0FwaSB9KSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2V2ZW50Q2hhbmdlJywgZXZlbnRDaGFuZ2VBcmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ19ub0V2ZW50UmVzaXplJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCBhbGwgaW50ZXJuYWwgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dpbmdTZWcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5yZWxldmFudEV2ZW50cyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnZhbGlkTXV0YXRpb24gPSBudWxsO1xuICAgICAgICAgICAgLy8gb2theSB0byBrZWVwIGV2ZW50SW5zdGFuY2UgYXJvdW5kLiB1c2VmdWwgdG8gc2V0IGl0IGluIGhhbmRsZVBvaW50ZXJEb3duXG4gICAgICAgIH07XG4gICAgICAgIGxldCB7IGNvbXBvbmVudCB9ID0gc2V0dGluZ3M7XG4gICAgICAgIGxldCBkcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgPSBuZXcgRmVhdHVyZWZ1bEVsZW1lbnREcmFnZ2luZyhzZXR0aW5ncy5lbCk7XG4gICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSAnLmZjLWV2ZW50LXJlc2l6ZXInO1xuICAgICAgICBkcmFnZ2luZy50b3VjaFNjcm9sbEFsbG93ZWQgPSBmYWxzZTtcbiAgICAgICAgZHJhZ2dpbmcuYXV0b1Njcm9sbGVyLmlzRW5hYmxlZCA9IGNvbXBvbmVudC5jb250ZXh0Lm9wdGlvbnMuZHJhZ1Njcm9sbDtcbiAgICAgICAgbGV0IGhpdERyYWdnaW5nID0gdGhpcy5oaXREcmFnZ2luZyA9IG5ldyBIaXREcmFnZ2luZyh0aGlzLmRyYWdnaW5nLCBpbnRlcm5hbF9janMuaW50ZXJhY3Rpb25TZXR0aW5nc1RvU3RvcmUoc2V0dGluZ3MpKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbigncG9pbnRlcmRvd24nLCB0aGlzLmhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCB0aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRyYWdnaW5nLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgcXVlcnlTZWdFbChldikge1xuICAgICAgICByZXR1cm4gaW50ZXJuYWxfY2pzLmVsZW1lbnRDbG9zZXN0KGV2LnN1YmplY3RFbCwgJy5mYy1ldmVudCcpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGNvbXB1dGVNdXRhdGlvbihoaXQwLCBoaXQxLCBpc0Zyb21TdGFydCwgaW5zdGFuY2VSYW5nZSkge1xuICAgIGxldCBkYXRlRW52ID0gaGl0MC5jb250ZXh0LmRhdGVFbnY7XG4gICAgbGV0IGRhdGUwID0gaGl0MC5kYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICBsZXQgZGF0ZTEgPSBoaXQxLmRhdGVTcGFuLnJhbmdlLnN0YXJ0O1xuICAgIGxldCBkZWx0YSA9IGludGVybmFsX2Nqcy5kaWZmRGF0ZXMoZGF0ZTAsIGRhdGUxLCBkYXRlRW52LCBoaXQwLmxhcmdlVW5pdCk7XG4gICAgaWYgKGlzRnJvbVN0YXJ0KSB7XG4gICAgICAgIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLnN0YXJ0LCBkZWx0YSkgPCBpbnN0YW5jZVJhbmdlLmVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnREZWx0YTogZGVsdGEgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChkYXRlRW52LmFkZChpbnN0YW5jZVJhbmdlLmVuZCwgZGVsdGEpID4gaW5zdGFuY2VSYW5nZS5zdGFydCkge1xuICAgICAgICByZXR1cm4geyBlbmREZWx0YTogZGVsdGEgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmNsYXNzIFVuc2VsZWN0QXV0byB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgPSBmYWxzZTsgLy8gd2lzaCB3ZSBjb3VsZCB1c2UgYSBzZWxlY3RvciB0byBkZXRlY3QgZGF0ZSBzZWxlY3Rpb24sIGJ1dCB1c2VzIGhpdCBzeXN0ZW1cbiAgICAgICAgdGhpcy5tYXRjaGVzQ2FuY2VsID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWF0Y2hlc0V2ZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25TZWxlY3QgPSAoc2VsZWN0SW5mbykgPT4ge1xuICAgICAgICAgICAgaWYgKHNlbGVjdEluZm8uanNFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMub25Eb2N1bWVudFBvaW50ZXJEb3duID0gKHBldikgPT4ge1xuICAgICAgICAgICAgbGV0IHVuc2VsZWN0Q2FuY2VsID0gdGhpcy5jb250ZXh0Lm9wdGlvbnMudW5zZWxlY3RDYW5jZWw7XG4gICAgICAgICAgICBsZXQgZG93bkVsID0gaW50ZXJuYWxfY2pzLmdldEV2ZW50VGFyZ2V0VmlhUm9vdChwZXYub3JpZ0V2ZW50KTtcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc0NhbmNlbCA9ICEhaW50ZXJuYWxfY2pzLmVsZW1lbnRDbG9zZXN0KGRvd25FbCwgdW5zZWxlY3RDYW5jZWwpO1xuICAgICAgICAgICAgdGhpcy5tYXRjaGVzRXZlbnQgPSAhIWludGVybmFsX2Nqcy5lbGVtZW50Q2xvc2VzdChkb3duRWwsIEV2ZW50RHJhZ2dpbmcuU0VMRUNUT1IpOyAvLyBpbnRlcmFjdGlvbiBzdGFydGVkIG9uIGFuIGV2ZW50P1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uRG9jdW1lbnRQb2ludGVyVXAgPSAocGV2KSA9PiB7XG4gICAgICAgICAgICBsZXQgeyBjb250ZXh0IH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgZG9jdW1lbnRQb2ludGVyIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IGNhbGVuZGFyU3RhdGUgPSBjb250ZXh0LmdldEN1cnJlbnREYXRhKCk7XG4gICAgICAgICAgICAvLyB0b3VjaC1zY3JvbGxpbmcgc2hvdWxkIG5ldmVyIHVuZm9jdXMgYW55IHR5cGUgb2Ygc2VsZWN0aW9uXG4gICAgICAgICAgICBpZiAoIWRvY3VtZW50UG9pbnRlci53YXNUb3VjaFNjcm9sbCkge1xuICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhclN0YXRlLmRhdGVTZWxlY3Rpb24gJiYgLy8gYW4gZXhpc3RpbmcgZGF0ZSBzZWxlY3Rpb24/XG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmlzUmVjZW50UG9pbnRlckRhdGVTZWxlY3QgLy8gYSBuZXcgcG9pbnRlci1pbml0aWF0ZWQgZGF0ZSBzZWxlY3Rpb24gc2luY2UgbGFzdCBvbkRvY3VtZW50UG9pbnRlclVwP1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdW5zZWxlY3RBdXRvID0gY29udGV4dC5vcHRpb25zLnVuc2VsZWN0QXV0bztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVuc2VsZWN0QXV0byAmJiAoIXVuc2VsZWN0QXV0byB8fCAhdGhpcy5tYXRjaGVzQ2FuY2VsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jYWxlbmRhckFwaS51bnNlbGVjdChwZXYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhclN0YXRlLmV2ZW50U2VsZWN0aW9uICYmIC8vIGFuIGV4aXN0aW5nIGV2ZW50IHNlbGVjdGVkP1xuICAgICAgICAgICAgICAgICAgICAhdGhpcy5tYXRjaGVzRXZlbnQgLy8gaW50ZXJhY3Rpb24gRElETidUIHN0YXJ0IG9uIGFuIGV2ZW50XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRUxFQ1RfRVZFTlQnIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNSZWNlbnRQb2ludGVyRGF0ZVNlbGVjdCA9IGZhbHNlO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgZG9jdW1lbnRQb2ludGVyID0gdGhpcy5kb2N1bWVudFBvaW50ZXIgPSBuZXcgUG9pbnRlckRyYWdnaW5nKGRvY3VtZW50KTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLnNob3VsZElnbm9yZU1vdmUgPSB0cnVlO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuc2hvdWxkV2F0Y2hTY3JvbGwgPSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnRQb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlckRvd24pO1xuICAgICAgICBkb2N1bWVudFBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcnVwJywgdGhpcy5vbkRvY3VtZW50UG9pbnRlclVwKTtcbiAgICAgICAgLypcbiAgICAgICAgVE9ETzogYmV0dGVyIHdheSB0byBrbm93IGFib3V0IHdoZXRoZXIgdGhlcmUgd2FzIGEgc2VsZWN0aW9uIHdpdGggdGhlIHBvaW50ZXJcbiAgICAgICAgKi9cbiAgICAgICAgY29udGV4dC5lbWl0dGVyLm9uKCdzZWxlY3QnLCB0aGlzLm9uU2VsZWN0KTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmVtaXR0ZXIub2ZmKCdzZWxlY3QnLCB0aGlzLm9uU2VsZWN0KTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFBvaW50ZXIuZGVzdHJveSgpO1xuICAgIH1cbn1cblxuY29uc3QgT1BUSU9OX1JFRklORVJTID0ge1xuICAgIGZpeGVkTWlycm9yUGFyZW50OiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG59O1xuY29uc3QgTElTVEVORVJfUkVGSU5FUlMgPSB7XG4gICAgZGF0ZUNsaWNrOiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG4gICAgZXZlbnREcmFnU3RhcnQ6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbiAgICBldmVudERyYWdTdG9wOiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG4gICAgZXZlbnREcm9wOiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG4gICAgZXZlbnRSZXNpemVTdGFydDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50UmVzaXplU3RvcDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50UmVzaXplOiBpbnRlcm5hbF9janMuaWRlbnRpdHksXG4gICAgZHJvcDogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50UmVjZWl2ZTogaW50ZXJuYWxfY2pzLmlkZW50aXR5LFxuICAgIGV2ZW50TGVhdmU6IGludGVybmFsX2Nqcy5pZGVudGl0eSxcbn07XG5cbi8qXG5HaXZlbiBhbiBhbHJlYWR5IGluc3RhbnRpYXRlZCBkcmFnZ2FibGUgb2JqZWN0IGZvciBvbmUtb3ItbW9yZSBlbGVtZW50cyxcbkludGVycHJldHMgYW55IGRyYWdnaW5nIGFzIGFuIGF0dGVtcHQgdG8gZHJhZyBhbiBldmVudHMgdGhhdCBsaXZlcyBvdXRzaWRlXG5vZiBhIGNhbGVuZGFyIG9udG8gYSBjYWxlbmRhci5cbiovXG5jbGFzcyBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3IoZHJhZ2dpbmcsIHN1cHBsaWVkRHJhZ01ldGEpIHtcbiAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcm9wcGFibGVFdmVudCA9IG51bGw7IC8vIHdpbGwgZXhpc3QgZm9yIGFsbCBkcmFncywgZXZlbiBpZiBjcmVhdGU6ZmFsc2VcbiAgICAgICAgdGhpcy5zdXBwbGllZERyYWdNZXRhID0gbnVsbDtcbiAgICAgICAgdGhpcy5kcmFnTWV0YSA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRyYWdNZXRhID0gdGhpcy5idWlsZERyYWdNZXRhKGV2LnN1YmplY3RFbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlSGl0VXBkYXRlID0gKGhpdCwgaXNGaW5hbCwgZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGRyYWdnaW5nIH0gPSB0aGlzLmhpdERyYWdnaW5nO1xuICAgICAgICAgICAgbGV0IHJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGRyb3BwYWJsZUV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBpc0ludmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpbnRlcmFjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZEV2ZW50czogaW50ZXJuYWxfY2pzLmNyZWF0ZUVtcHR5RXZlbnRTdG9yZSgpLFxuICAgICAgICAgICAgICAgIG11dGF0ZWRFdmVudHM6IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKSxcbiAgICAgICAgICAgICAgICBpc0V2ZW50OiB0aGlzLmRyYWdNZXRhLmNyZWF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoaGl0KSB7XG4gICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dCA9IGhpdC5jb250ZXh0O1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkRyb3BFbE9uQ2FsZW5kYXIoZXYuc3ViamVjdEVsLCByZWNlaXZpbmdDb250ZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBkcm9wcGFibGVFdmVudCA9IGNvbXB1dGVFdmVudEZvckRhdGVTcGFuKGhpdC5kYXRlU3BhbiwgdGhpcy5kcmFnTWV0YSwgcmVjZWl2aW5nQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyYWN0aW9uLm11dGF0ZWRFdmVudHMgPSBpbnRlcm5hbF9janMuZXZlbnRUdXBsZVRvU3RvcmUoZHJvcHBhYmxlRXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBpc0ludmFsaWQgPSAhaW50ZXJuYWxfY2pzLmlzSW50ZXJhY3Rpb25WYWxpZChpbnRlcmFjdGlvbiwgaGl0LmRhdGVQcm9maWxlLCByZWNlaXZpbmdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW52YWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24ubXV0YXRlZEV2ZW50cyA9IGludGVybmFsX2Nqcy5jcmVhdGVFbXB0eUV2ZW50U3RvcmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwYWJsZUV2ZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcGxheURyYWcocmVjZWl2aW5nQ29udGV4dCwgaW50ZXJhY3Rpb24pO1xuICAgICAgICAgICAgLy8gc2hvdyBtaXJyb3IgaWYgbm8gYWxyZWFkeS1yZW5kZXJlZCBtaXJyb3IgZWxlbWVudCBPUiBpZiB3ZSBhcmUgc2h1dHRpbmcgZG93biB0aGUgbWlycm9yICg/KVxuICAgICAgICAgICAgLy8gVE9ETzogd2lzaCB3ZSBjb3VsZCBzb21laG93IHdhaXQgZm9yIGRpc3BhdGNoIHRvIGd1YXJhbnRlZSByZW5kZXJcbiAgICAgICAgICAgIGRyYWdnaW5nLnNldE1pcnJvcklzVmlzaWJsZShpc0ZpbmFsIHx8ICFkcm9wcGFibGVFdmVudCB8fCAhZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZjLWV2ZW50LW1pcnJvcicpKTtcbiAgICAgICAgICAgIGlmICghaXNJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmVuYWJsZUN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxfY2pzLmRpc2FibGVDdXJzb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNGaW5hbCkge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nLnNldE1pcnJvck5lZWRzUmV2ZXJ0KCFkcm9wcGFibGVFdmVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmdDb250ZXh0ID0gcmVjZWl2aW5nQ29udGV4dDtcbiAgICAgICAgICAgICAgICB0aGlzLmRyb3BwYWJsZUV2ZW50ID0gZHJvcHBhYmxlRXZlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaGFuZGxlRHJhZ0VuZCA9IChwZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IHJlY2VpdmluZ0NvbnRleHQsIGRyb3BwYWJsZUV2ZW50IH0gPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5jbGVhckRyYWcoKTtcbiAgICAgICAgICAgIGlmIChyZWNlaXZpbmdDb250ZXh0ICYmIGRyb3BwYWJsZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsSGl0ID0gdGhpcy5oaXREcmFnZ2luZy5maW5hbEhpdDtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxWaWV3ID0gZmluYWxIaXQuY29udGV4dC52aWV3QXBpO1xuICAgICAgICAgICAgICAgIGxldCBkcmFnTWV0YSA9IHRoaXMuZHJhZ01ldGE7XG4gICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5lbWl0dGVyLnRyaWdnZXIoJ2Ryb3AnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQoZmluYWxIaXQuZGF0ZVNwYW4sIHJlY2VpdmluZ0NvbnRleHQpKSwgeyBkcmFnZ2VkRWw6IHBldi5zdWJqZWN0RWwsIGpzRXZlbnQ6IHBldi5vcmlnRXZlbnQsIHZpZXc6IGZpbmFsVmlldyB9KSk7XG4gICAgICAgICAgICAgICAgaWYgKGRyYWdNZXRhLmNyZWF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkaW5nRXZlbnRzID0gaW50ZXJuYWxfY2pzLmV2ZW50VHVwbGVUb1N0b3JlKGRyb3BwYWJsZUV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTUVSR0VfRVZFTlRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U3RvcmU6IGFkZGluZ0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwZXYuaXNUb3VjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nQ29udGV4dC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFTEVDVF9FVkVOVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnN0YW5jZUlkOiBkcm9wcGFibGVFdmVudC5pbnN0YW5jZS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIHRoYXQgYW4gZXh0ZXJuYWwgZXZlbnQgbGFuZGVkXG4gICAgICAgICAgICAgICAgICAgIHJlY2VpdmluZ0NvbnRleHQuZW1pdHRlci50cmlnZ2VyKCdldmVudFJlY2VpdmUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbmV3IGludGVybmFsX2Nqcy5FdmVudEltcGwocmVjZWl2aW5nQ29udGV4dCwgZHJvcHBhYmxlRXZlbnQuZGVmLCBkcm9wcGFibGVFdmVudC5pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRXZlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldmVydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmdDb250ZXh0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JFTU9WRV9FVkVOVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFN0b3JlOiBhZGRpbmdFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZEVsOiBwZXYuc3ViamVjdEVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogZmluYWxWaWV3LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZ0NvbnRleHQgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5kcm9wcGFibGVFdmVudCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBoaXREcmFnZ2luZyA9IHRoaXMuaGl0RHJhZ2dpbmcgPSBuZXcgSGl0RHJhZ2dpbmcoZHJhZ2dpbmcsIGludGVybmFsX2Nqcy5pbnRlcmFjdGlvblNldHRpbmdzU3RvcmUpO1xuICAgICAgICBoaXREcmFnZ2luZy5yZXF1aXJlSW5pdGlhbCA9IGZhbHNlOyAvLyB3aWxsIHN0YXJ0IG91dHNpZGUgb2YgYSBjb21wb25lbnRcbiAgICAgICAgaGl0RHJhZ2dpbmcuZW1pdHRlci5vbignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICBoaXREcmFnZ2luZy5lbWl0dGVyLm9uKCdoaXR1cGRhdGUnLCB0aGlzLmhhbmRsZUhpdFVwZGF0ZSk7XG4gICAgICAgIGhpdERyYWdnaW5nLmVtaXR0ZXIub24oJ2RyYWdlbmQnLCB0aGlzLmhhbmRsZURyYWdFbmQpO1xuICAgICAgICB0aGlzLnN1cHBsaWVkRHJhZ01ldGEgPSBzdXBwbGllZERyYWdNZXRhO1xuICAgIH1cbiAgICBidWlsZERyYWdNZXRhKHN1YmplY3RFbCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3VwcGxpZWREcmFnTWV0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbF9janMucGFyc2VEcmFnTWV0YSh0aGlzLnN1cHBsaWVkRHJhZ01ldGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdXBwbGllZERyYWdNZXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxfY2pzLnBhcnNlRHJhZ01ldGEodGhpcy5zdXBwbGllZERyYWdNZXRhKHN1YmplY3RFbCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXREcmFnTWV0YUZyb21FbChzdWJqZWN0RWwpO1xuICAgIH1cbiAgICBkaXNwbGF5RHJhZyhuZXh0Q29udGV4dCwgc3RhdGUpIHtcbiAgICAgICAgbGV0IHByZXZDb250ZXh0ID0gdGhpcy5yZWNlaXZpbmdDb250ZXh0O1xuICAgICAgICBpZiAocHJldkNvbnRleHQgJiYgcHJldkNvbnRleHQgIT09IG5leHRDb250ZXh0KSB7XG4gICAgICAgICAgICBwcmV2Q29udGV4dC5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVF9FVkVOVF9EUkFHJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dENvbnRleHQpIHtcbiAgICAgICAgICAgIG5leHRDb250ZXh0LmRpc3BhdGNoKHsgdHlwZTogJ1NFVF9FVkVOVF9EUkFHJywgc3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2xlYXJEcmFnKCkge1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZpbmdDb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLnJlY2VpdmluZ0NvbnRleHQuZGlzcGF0Y2goeyB0eXBlOiAnVU5TRVRfRVZFTlRfRFJBRycgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2FuRHJvcEVsT25DYWxlbmRhcihlbCwgcmVjZWl2aW5nQ29udGV4dCkge1xuICAgICAgICBsZXQgZHJvcEFjY2VwdCA9IHJlY2VpdmluZ0NvbnRleHQub3B0aW9ucy5kcm9wQWNjZXB0O1xuICAgICAgICBpZiAodHlwZW9mIGRyb3BBY2NlcHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBkcm9wQWNjZXB0LmNhbGwocmVjZWl2aW5nQ29udGV4dC5jYWxlbmRhckFwaSwgZWwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZHJvcEFjY2VwdCA9PT0gJ3N0cmluZycgJiYgZHJvcEFjY2VwdCkge1xuICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oaW50ZXJuYWxfY2pzLmVsZW1lbnRNYXRjaGVzKGVsLCBkcm9wQWNjZXB0KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuLy8gVXRpbHMgZm9yIGNvbXB1dGluZyBldmVudCBzdG9yZSBmcm9tIHRoZSBEcmFnTWV0YVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZnVuY3Rpb24gY29tcHV0ZUV2ZW50Rm9yRGF0ZVNwYW4oZGF0ZVNwYW4sIGRyYWdNZXRhLCBjb250ZXh0KSB7XG4gICAgbGV0IGRlZlByb3BzID0gT2JqZWN0LmFzc2lnbih7fSwgZHJhZ01ldGEubGVmdG92ZXJQcm9wcyk7XG4gICAgZm9yIChsZXQgdHJhbnNmb3JtIG9mIGNvbnRleHQucGx1Z2luSG9va3MuZXh0ZXJuYWxEZWZUcmFuc2Zvcm1zKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZGVmUHJvcHMsIHRyYW5zZm9ybShkYXRlU3BhbiwgZHJhZ01ldGEpKTtcbiAgICB9XG4gICAgbGV0IHsgcmVmaW5lZCwgZXh0cmEgfSA9IGludGVybmFsX2Nqcy5yZWZpbmVFdmVudERlZihkZWZQcm9wcywgY29udGV4dCk7XG4gICAgbGV0IGRlZiA9IGludGVybmFsX2Nqcy5wYXJzZUV2ZW50RGVmKHJlZmluZWQsIGV4dHJhLCBkcmFnTWV0YS5zb3VyY2VJZCwgZGF0ZVNwYW4uYWxsRGF5LCBjb250ZXh0Lm9wdGlvbnMuZm9yY2VFdmVudER1cmF0aW9uIHx8IEJvb2xlYW4oZHJhZ01ldGEuZHVyYXRpb24pLCAvLyBoYXNFbmRcbiAgICBjb250ZXh0KTtcbiAgICBsZXQgc3RhcnQgPSBkYXRlU3Bhbi5yYW5nZS5zdGFydDtcbiAgICAvLyBvbmx5IHJlbHkgb24gdGltZSBpbmZvIGlmIGRyb3Agem9uZSBpcyBhbGwtZGF5LFxuICAgIC8vIG90aGVyd2lzZSwgd2UgYWxyZWFkeSBrbm93IHRoZSB0aW1lXG4gICAgaWYgKGRhdGVTcGFuLmFsbERheSAmJiBkcmFnTWV0YS5zdGFydFRpbWUpIHtcbiAgICAgICAgc3RhcnQgPSBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5zdGFydFRpbWUpO1xuICAgIH1cbiAgICBsZXQgZW5kID0gZHJhZ01ldGEuZHVyYXRpb24gP1xuICAgICAgICBjb250ZXh0LmRhdGVFbnYuYWRkKHN0YXJ0LCBkcmFnTWV0YS5kdXJhdGlvbikgOlxuICAgICAgICBpbnRlcm5hbF9janMuZ2V0RGVmYXVsdEV2ZW50RW5kKGRhdGVTcGFuLmFsbERheSwgc3RhcnQsIGNvbnRleHQpO1xuICAgIGxldCBpbnN0YW5jZSA9IGludGVybmFsX2Nqcy5jcmVhdGVFdmVudEluc3RhbmNlKGRlZi5kZWZJZCwgeyBzdGFydCwgZW5kIH0pO1xuICAgIHJldHVybiB7IGRlZiwgaW5zdGFuY2UgfTtcbn1cbi8vIFV0aWxzIGZvciBleHRyYWN0aW5nIGRhdGEgZnJvbSBlbGVtZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBnZXREcmFnTWV0YUZyb21FbChlbCkge1xuICAgIGxldCBzdHIgPSBnZXRFbWJlZGRlZEVsRGF0YShlbCwgJ2V2ZW50Jyk7XG4gICAgbGV0IG9iaiA9IHN0ciA/XG4gICAgICAgIEpTT04ucGFyc2Uoc3RyKSA6XG4gICAgICAgIHsgY3JlYXRlOiBmYWxzZSB9OyAvLyBpZiBubyBlbWJlZGRlZCBkYXRhLCBhc3N1bWUgbm8gZXZlbnQgY3JlYXRpb25cbiAgICByZXR1cm4gaW50ZXJuYWxfY2pzLnBhcnNlRHJhZ01ldGEob2JqKTtcbn1cbmludGVybmFsX2Nqcy5jb25maWcuZGF0YUF0dHJQcmVmaXggPSAnJztcbmZ1bmN0aW9uIGdldEVtYmVkZGVkRWxEYXRhKGVsLCBuYW1lKSB7XG4gICAgbGV0IHByZWZpeCA9IGludGVybmFsX2Nqcy5jb25maWcuZGF0YUF0dHJQcmVmaXg7XG4gICAgbGV0IHByZWZpeGVkTmFtZSA9IChwcmVmaXggPyBwcmVmaXggKyAnLScgOiAnJykgKyBuYW1lO1xuICAgIHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtJyArIHByZWZpeGVkTmFtZSkgfHwgJyc7XG59XG5cbi8qXG5NYWtlcyBhbiBlbGVtZW50ICh0aGF0IGlzICpleHRlcm5hbCogdG8gYW55IGNhbGVuZGFyKSBkcmFnZ2FibGUuXG5DYW4gcGFzcyBpbiBkYXRhIHRoYXQgZGV0ZXJtaW5lcyBob3cgYW4gZXZlbnQgd2lsbCBiZSBjcmVhdGVkIHdoZW4gZHJvcHBlZCBvbnRvIGEgY2FsZW5kYXIuXG5MZXZlcmFnZXMgRnVsbENhbGVuZGFyJ3MgaW50ZXJuYWwgZHJhZy1uLWRyb3AgZnVuY3Rpb25hbGl0eSBXSVRIT1VUIGEgdGhpcmQtcGFydHkgZHJhZyBzeXN0ZW0uXG4qL1xuY2xhc3MgRXh0ZXJuYWxEcmFnZ2FibGUge1xuICAgIGNvbnN0cnVjdG9yKGVsLCBzZXR0aW5ncyA9IHt9KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGxldCB7IGRyYWdnaW5nIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHsgbWluRGlzdGFuY2UsIGxvbmdQcmVzc0RlbGF5IH0gPSB0aGlzLnNldHRpbmdzO1xuICAgICAgICAgICAgZHJhZ2dpbmcubWluRGlzdGFuY2UgPVxuICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlICE9IG51bGwgP1xuICAgICAgICAgICAgICAgICAgICBtaW5EaXN0YW5jZSA6XG4gICAgICAgICAgICAgICAgICAgIChldi5pc1RvdWNoID8gMCA6IGludGVybmFsX2Nqcy5CQVNFX09QVElPTl9ERUZBVUxUUy5ldmVudERyYWdNaW5EaXN0YW5jZSk7XG4gICAgICAgICAgICBkcmFnZ2luZy5kZWxheSA9XG4gICAgICAgICAgICAgICAgZXYuaXNUb3VjaCA/IC8vIFRPRE86IGV2ZW50dWFsbHkgcmVhZCBldmVudExvbmdQcmVzc0RlbGF5IGluc3RlYWQgdnZ2XG4gICAgICAgICAgICAgICAgICAgIChsb25nUHJlc3NEZWxheSAhPSBudWxsID8gbG9uZ1ByZXNzRGVsYXkgOiBpbnRlcm5hbF9janMuQkFTRV9PUFRJT05fREVGQVVMVFMubG9uZ1ByZXNzRGVsYXkpIDpcbiAgICAgICAgICAgICAgICAgICAgMDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVEcmFnU3RhcnQgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIGlmIChldi5pc1RvdWNoICYmXG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnZ2luZy5kZWxheSAmJlxuICAgICAgICAgICAgICAgIGV2LnN1YmplY3RFbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZjLWV2ZW50JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdnaW5nLm1pcnJvci5nZXRNaXJyb3JFbCgpLmNsYXNzTGlzdC5hZGQoJ2ZjLWV2ZW50LXNlbGVjdGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgICAgbGV0IGRyYWdnaW5nID0gdGhpcy5kcmFnZ2luZyA9IG5ldyBGZWF0dXJlZnVsRWxlbWVudERyYWdnaW5nKGVsKTtcbiAgICAgICAgZHJhZ2dpbmcudG91Y2hTY3JvbGxBbGxvd2VkID0gZmFsc2U7XG4gICAgICAgIGlmIChzZXR0aW5ncy5pdGVtU2VsZWN0b3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhZ2dpbmcucG9pbnRlci5zZWxlY3RvciA9IHNldHRpbmdzLml0ZW1TZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuYXBwZW5kVG8gIT0gbnVsbCkge1xuICAgICAgICAgICAgZHJhZ2dpbmcubWlycm9yLnBhcmVudE5vZGUgPSBzZXR0aW5ncy5hcHBlbmRUbzsgLy8gVE9ETzogd3JpdGUgdGVzdHNcbiAgICAgICAgfVxuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdwb2ludGVyZG93bicsIHRoaXMuaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBkcmFnZ2luZy5lbWl0dGVyLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhhbmRsZURyYWdTdGFydCk7XG4gICAgICAgIG5ldyBFeHRlcm5hbEVsZW1lbnREcmFnZ2luZyhkcmFnZ2luZywgc2V0dGluZ3MuZXZlbnREYXRhKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2luZy5kZXN0cm95KCk7XG4gICAgfVxufVxuXG4vKlxuRGV0ZWN0cyB3aGVuIGEgKlRISVJELVBBUlRZKiBkcmFnLW4tZHJvcCBzeXN0ZW0gaW50ZXJhY3RzIHdpdGggZWxlbWVudHMuXG5UaGUgdGhpcmQtcGFydHkgc3lzdGVtIGlzIHJlc3BvbnNpYmxlIGZvciBkcmF3aW5nIHRoZSB2aXN1YWxzIGVmZmVjdHMgb2YgdGhlIGRyYWcuXG5UaGlzIGNsYXNzIHNpbXBseSBtb25pdG9ycyBmb3IgcG9pbnRlciBtb3ZlbWVudHMgYW5kIGZpcmVzIGV2ZW50cy5cbkl0IGFsc28gaGFzIHRoZSBhYmlsaXR5IHRvIGhpZGUgdGhlIG1vdmluZyBlbGVtZW50ICh0aGUgXCJtaXJyb3JcIikgZHVyaW5nIHRoZSBkcmFnLlxuKi9cbmNsYXNzIEluZmVycmVkRWxlbWVudERyYWdnaW5nIGV4dGVuZHMgaW50ZXJuYWxfY2pzLkVsZW1lbnREcmFnZ2luZyB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyRWwpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyRWwpO1xuICAgICAgICB0aGlzLnNob3VsZElnbm9yZU1vdmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5taXJyb3JTZWxlY3RvciA9ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9pbnRlckRvd24gPSAoZXYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVyZG93bicsIGV2KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5zaG91bGRJZ25vcmVNb3ZlKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBkcmFnc3RhcnQgcmlnaHQgYXdheS4gZG9lcyBub3Qgc3VwcG9ydCBkZWxheSBvciBtaW4tZGlzdGFuY2VcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXR0ZXIudHJpZ2dlcignZHJhZ3N0YXJ0JywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnbW92ZScsIGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5oYW5kbGVQb2ludGVyVXAgPSAoZXYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdwb2ludGVydXAnLCBldik7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2hvdWxkSWdub3JlTW92ZSkge1xuICAgICAgICAgICAgICAgIC8vIGZpcmUgZHJhZ2VuZCByaWdodCBhd2F5LiBkb2VzIG5vdCBzdXBwb3J0IGEgcmV2ZXJ0IGFuaW1hdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdHRlci50cmlnZ2VyKCdkcmFnZW5kJywgZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsZXQgcG9pbnRlciA9IHRoaXMucG9pbnRlciA9IG5ldyBQb2ludGVyRHJhZ2dpbmcoY29udGFpbmVyRWwpO1xuICAgICAgICBwb2ludGVyLmVtaXR0ZXIub24oJ3BvaW50ZXJkb3duJywgdGhpcy5oYW5kbGVQb2ludGVyRG93bik7XG4gICAgICAgIHBvaW50ZXIuZW1pdHRlci5vbigncG9pbnRlcm1vdmUnLCB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlKTtcbiAgICAgICAgcG9pbnRlci5lbWl0dGVyLm9uKCdwb2ludGVydXAnLCB0aGlzLmhhbmRsZVBvaW50ZXJVcCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMucG9pbnRlci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHNldElnbm9yZU1vdmUoYm9vbCkge1xuICAgICAgICB0aGlzLnNob3VsZElnbm9yZU1vdmUgPSBib29sO1xuICAgIH1cbiAgICBzZXRNaXJyb3JJc1Zpc2libGUoYm9vbCkge1xuICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgICAgLy8gcmVzdG9yZSBhIHByZXZpb3VzbHkgaGlkZGVuIGVsZW1lbnQuXG4gICAgICAgICAgICAvLyB1c2UgdGhlIHJlZmVyZW5jZSBpbiBjYXNlIHRoZSBzZWxlY3RvciBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TWlycm9yRWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNaXJyb3JFbC5zdHlsZS52aXNpYmlsaXR5ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWlycm9yRWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1pcnJvckVsID0gdGhpcy5taXJyb3JTZWxlY3RvclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHNvbWVob3cgcXVlcnkgRnVsbENhbGVuZGFycyBXSVRISU4gc2hhZG93LXJvb3RzXG4gICAgICAgICAgICAgICAgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMubWlycm9yU2VsZWN0b3IpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKG1pcnJvckVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWlycm9yRWwgPSBtaXJyb3JFbDtcbiAgICAgICAgICAgICAgICBtaXJyb3JFbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qXG5CcmlkZ2VzIHRoaXJkLXBhcnR5IGRyYWctbi1kcm9wIHN5c3RlbXMgd2l0aCBGdWxsQ2FsZW5kYXIuXG5NdXN0IGJlIGluc3RhbnRpYXRlZCBhbmQgZGVzdHJveWVkIGJ5IGNhbGxlci5cbiovXG5jbGFzcyBUaGlyZFBhcnR5RHJhZ2dhYmxlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJPclNldHRpbmdzLCBzZXR0aW5ncykge1xuICAgICAgICBsZXQgY29udGFpbmVyRWwgPSBkb2N1bWVudDtcbiAgICAgICAgaWYgKFxuICAgICAgICAvLyB3aXNoIHdlIGNvdWxkIGp1c3QgdGVzdCBpbnN0YW5jZW9mIEV2ZW50VGFyZ2V0LCBidXQgZG9lc24ndCB3b3JrIGluIElFMTFcbiAgICAgICAgY29udGFpbmVyT3JTZXR0aW5ncyA9PT0gZG9jdW1lbnQgfHxcbiAgICAgICAgICAgIGNvbnRhaW5lck9yU2V0dGluZ3MgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgICAgICBjb250YWluZXJFbCA9IGNvbnRhaW5lck9yU2V0dGluZ3M7XG4gICAgICAgICAgICBzZXR0aW5ncyA9IHNldHRpbmdzIHx8IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0dGluZ3MgPSAoY29udGFpbmVyT3JTZXR0aW5ncyB8fCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRyYWdnaW5nID0gdGhpcy5kcmFnZ2luZyA9IG5ldyBJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyhjb250YWluZXJFbCk7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MuaXRlbVNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZHJhZ2dpbmcucG9pbnRlci5zZWxlY3RvciA9IHNldHRpbmdzLml0ZW1TZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250YWluZXJFbCA9PT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIGRyYWdnaW5nLnBvaW50ZXIuc2VsZWN0b3IgPSAnW2RhdGEtZXZlbnRdJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLm1pcnJvclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZHJhZ2dpbmcubWlycm9yU2VsZWN0b3IgPSBzZXR0aW5ncy5taXJyb3JTZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBuZXcgRXh0ZXJuYWxFbGVtZW50RHJhZ2dpbmcoZHJhZ2dpbmcsIHNldHRpbmdzLmV2ZW50RGF0YSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZHJhZ2dpbmcuZGVzdHJveSgpO1xuICAgIH1cbn1cblxudmFyIGluZGV4ID0gaW5kZXhfY2pzLmNyZWF0ZVBsdWdpbih7XG4gICAgbmFtZTogJ0BmdWxsY2FsZW5kYXIvaW50ZXJhY3Rpb24nLFxuICAgIGNvbXBvbmVudEludGVyYWN0aW9uczogW0RhdGVDbGlja2luZywgRGF0ZVNlbGVjdGluZywgRXZlbnREcmFnZ2luZywgRXZlbnRSZXNpemluZ10sXG4gICAgY2FsZW5kYXJJbnRlcmFjdGlvbnM6IFtVbnNlbGVjdEF1dG9dLFxuICAgIGVsZW1lbnREcmFnZ2luZ0ltcGw6IEZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmcsXG4gICAgb3B0aW9uUmVmaW5lcnM6IE9QVElPTl9SRUZJTkVSUyxcbiAgICBsaXN0ZW5lclJlZmluZXJzOiBMSVNURU5FUl9SRUZJTkVSUyxcbn0pO1xuXG5leHBvcnRzLkRyYWdnYWJsZSA9IEV4dGVybmFsRHJhZ2dhYmxlO1xuZXhwb3J0cy5UaGlyZFBhcnR5RHJhZ2dhYmxlID0gVGhpcmRQYXJ0eURyYWdnYWJsZTtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gaW5kZXg7XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1MTkpO1xuIl0sIm5hbWVzIjpbInQiLCJyIiwidSIsImkiLCJvIiwiZiIsImMiLCJlIiwiX19iIiwiYSIsIl9fciIsInYiLCJkaWZmZWQiLCJsIiwiX19jIiwibSIsInVubW91bnQiLCJkIiwiX19oIiwiX19IIiwiX18iLCJsZW5ndGgiLCJwdXNoIiwiX19WIiwicCIsIm4iLCJ5IiwiQiIsIl9fTiIsInNldFN0YXRlIiwic2hvdWxkQ29tcG9uZW50VXBkYXRlIiwiZmlsdGVyIiwiZXZlcnkiLCJjYWxsIiwidGhpcyIsImZvckVhY2giLCJwcm9wcyIsImgiLCJfX3MiLCJ6IiwicyIsIl8iLCJGIiwiY3VycmVudCIsIkEiLCJjb25jYXQiLCJUIiwicSIsImNvbnRleHQiLCJzdWIiLCJ2YWx1ZSIsIngiLCJ1c2VEZWJ1Z1ZhbHVlIiwiUCIsImNvbXBvbmVudERpZENhdGNoIiwiViIsIl9fdiIsIl9fbSIsImIiLCJzaGlmdCIsIl9fUCIsImsiLCJ3IiwiX19lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiaiIsInNvbWUiLCJnIiwiY2xlYXJUaW1lb3V0IiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiQyIsIkUiLCJSIiwicmVmIiwiZGlzcGxheU5hbWUiLCJuYW1lIiwicHJvdG90eXBlIiwiaXNSZWFjdENvbXBvbmVudCIsIl9fZiIsImlzUHVyZVJlYWN0Q29tcG9uZW50Iiwic3RhdGUiLCJ0eXBlIiwiTiIsIlN5bWJvbCIsImZvciIsIiQkdHlwZW9mIiwicmVuZGVyIiwibWFwIiwiTyIsImNvdW50Iiwib25seSIsInRvQXJyYXkiLCJ0aGVuIiwiX19rIiwiSSIsIkwiLCJVIiwiaW5zZXJ0QmVmb3JlIiwiX19kIiwiRCIsIl9fdSIsIl9fYSIsIk0iLCJkZWZhdWx0IiwiX19SIiwiX19PIiwicG9wIiwiZm9yY2VVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImZhbGxiYWNrIiwiY2hpbGRyZW4iLCJXIiwiZGVsZXRlIiwicmV2ZWFsT3JkZXIiLCJzaXplIiwiZ2V0Q2hpbGRDb250ZXh0IiwiJCIsIm5vZGVUeXBlIiwicGFyZW50Tm9kZSIsImNoaWxkTm9kZXMiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwic3BsaWNlIiwiaW5kZXhPZiIsImNvbnRhaW5lckluZm8iLCJnZXQiLCJNYXAiLCJyZXZlcnNlIiwic2V0IiwiY29tcG9uZW50RGlkVXBkYXRlIiwiY29tcG9uZW50RGlkTW91bnQiLCJIIiwiWiIsInRlc3QiLCJZIiwidGV4dENvbnRlbnQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiRyIsImV2ZW50IiwiSiIsIksiLCJjYW5jZWxCdWJibGUiLCJRIiwiZGVmYXVsdFByZXZlbnRlZCIsInBlcnNpc3QiLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsImlzRGVmYXVsdFByZXZlbnRlZCIsIm5hdGl2ZUV2ZW50IiwiWCIsIm5uIiwiY2xhc3MiLCJ0biIsInZub2RlIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwibXVsdGlwbGUiLCJBcnJheSIsImlzQXJyYXkiLCJzZWxlY3RlZCIsImRlZmF1bHRWYWx1ZSIsImNsYXNzTmFtZSIsImVudW1lcmFibGUiLCJlbiIsInJuIiwiUmVhY3RDdXJyZW50RGlzcGF0Y2hlciIsInJlYWRDb250ZXh0IiwiX19uIiwidW4iLCJvbiIsImJpbmQiLCJsbiIsImNuIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbiIsImFuIiwiYmFzZSIsInNuIiwiaG4iLCJ2biIsImRuIiwicG4iLCJtbiIsInluIiwiX24iLCJibiIsInVzZVN0YXRlIiwidXNlSWQiLCJ1c2VSZWR1Y2VyIiwidXNlRWZmZWN0IiwidXNlTGF5b3V0RWZmZWN0IiwidXNlSW5zZXJ0aW9uRWZmZWN0IiwidXNlVHJhbnNpdGlvbiIsInVzZURlZmVycmVkVmFsdWUiLCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZSIsInN0YXJ0VHJhbnNpdGlvbiIsInVzZVJlZiIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJ1c2VNZW1vIiwidXNlQ2FsbGJhY2siLCJ1c2VDb250ZXh0IiwidmVyc2lvbiIsIkNoaWxkcmVuIiwiaHlkcmF0ZSIsInVubW91bnRDb21wb25lbnRBdE5vZGUiLCJjcmVhdGVQb3J0YWwiLCJjcmVhdGVDb250ZXh0IiwiY3JlYXRlRmFjdG9yeSIsImNsb25lRWxlbWVudCIsImNyZWF0ZVJlZiIsIkZyYWdtZW50IiwiaXNWYWxpZEVsZW1lbnQiLCJmaW5kRE9NTm9kZSIsIkNvbXBvbmVudCIsIlB1cmVDb21wb25lbnQiLCJtZW1vIiwiZm9yd2FyZFJlZiIsImZsdXNoU3luYyIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwiU3RyaWN0TW9kZSIsIlN1c3BlbnNlIiwiU3VzcGVuc2VMaXN0IiwibGF6eSIsIl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEIiwiZGVmYXVsdFByb3BzIiwia2V5IiwiY29uc3RydWN0b3IiLCJzZXRQcm9wZXJ0eSIsInN0eWxlIiwiY3NzVGV4dCIsInNsaWNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJkZWJvdW5jZVJlbmRlcmluZyIsInNvcnQiLCJvd25lclNWR0VsZW1lbnQiLCJuZXh0U2libGluZyIsIlMiLCJjb250ZXh0VHlwZSIsIl9fRSIsIl9zYiIsImdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyIsImNvbXBvbmVudFdpbGxNb3VudCIsImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJjb21wb25lbnRXaWxsVXBkYXRlIiwiZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUiLCJsb2NhbE5hbWUiLCJjcmVhdGVUZXh0Tm9kZSIsImNyZWF0ZUVsZW1lbnROUyIsImlzIiwiZGF0YSIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiYXR0cmlidXRlcyIsIl9faHRtbCIsImlubmVySFRNTCIsImNoZWNrZWQiLCJmaXJzdENoaWxkIiwiQ29uc3VtZXIiLCJQcm92aWRlciIsImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsIlByb21pc2UiLCJyZXNvbHZlIiwiY2FsY191c2VfZGF5cyIsImV2ZW50bGlzdCIsImNhdGVnb3J5IiwiaW5jbHVkZV91bmtub3duIiwidXNlX2RheXMiLCJTZXQiLCJ1c2VfZGF5c19hbW91bnQiLCJwcm9wZXJ0aWVzIiwiYWRkIiwiZGF0ZSIsInN1YnN0cmluZyIsImFtb3VudCIsImZyb20iLCJ0b3RhbCIsIk51bWJlciIsInRpbWVzIiwic3Vic3RhbmNlIiwidW5pdHMiLCJ1c2VfZGF5c19zdHIiLCJOYU4iLCJsYXN0X2RheSIsInJlZHVjZSIsImFjYyIsImN1ciIsIkRhdGUiLCJ2YWx1ZU9mIiwiQ1ZUX01TX0RBWSIsIlZFUlNJT04iLCJDVlRfTVNfUyIsIkNWVF9TX01JTiIsIkNWVF9NSU5fSFIiLCJDVlRfSFJfREFZIiwiQ0FMX0hFSUdIVF9ESUZGIiwiQ09MT1JfV0hJVEUiLCJDT0xPUl9URVhUIiwiQ09MT1JfUFVSUExFIiwiQ09MT1JfT1JBTkdFIiwiQ09MT1JfWUVMTE9XIiwiQ09MT1JfR1JFRU4iLCJDT0xPUl9CUk9XTiIsIlJHWF9JTlRFR0VSIiwiUkdYX1dPUkQiLCJSR1hfREFURSIsImNhbGVuZGFyIiwiX2NvcHlfYnVmZmVyIiwiX21vZGUiLCJfY2FsZW5kYXIiLCJfc3Vic3RhbmNlX2xpc3QiLCJfbm90aWZpY2F0aW9uIiwiZ2V0RWxlbWVudEJ5SWQiLCJfc3Vic3RhbmNlc191c2VkIiwicXVlcnlTZWxlY3RvckFsbCIsImV2IiwibW9kZSIsImNsaWNrX2RhdGUiLCJjbGlja19ldmVudCIsInNlbGVjdF9yYW5nZSIsIl9tb2RhbF9rZXlfZXZlbnQiLCJNb2RhbCIsIl9tb2RhbF9zdWJfZXZlbnQiLCJfbW9kYWxfY29uZmlybSIsInF1ZXJ5IiwiVVJMU2VhcmNoUGFyYW1zIiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJzdGFydCIsInVuZGVmaW5lZCIsImVuZCIsIl9ldmVudF9saXN0IiwiQ2FsZW5kYXJFdmVudExpc3QiLCJjbGVhciIsImlubmVyVGV4dCIsImRldnQiLCJjbGlja2VkIiwidGFyZ2V0IiwiaWQiLCJrZXlzIiwiRXJyb3IiLCJjb25zb2xlIiwibG9nIiwidXBkYXRlX3N1Yl9vcHRpb25zIiwib3B0aW9ucyIsImVsZW1lbnQiLCJvcHRpb24iLCJpbnNlcnRBZGphY2VudEhUTUwiLCJsYWJlbCIsInVwZGF0ZV9hbW91bnQiLCJhbW91bnRfZWwiLCJkaXNhYmxlZCIsInJlcXVpcmVkIiwidXBkYXRlX3VuaXRzIiwidW5pdHNfZWwiLCJ1bml0c19vdGhlcl9lbCIsInVwZGF0ZV90eXBlX29wdGlvbnMiLCJtZXRob2QiLCJ0eXBlX29wdGlvbnNfZWwiLCJzdWJzdGFuY2VfaW5mbyIsImZpbmQiLCJoYXNPd25Qcm9wZXJ0eSIsInVwZGF0ZV91bml0X29wdGlvbnMiLCJ1bml0c19vcHRpb25zX2VsIiwidW5pdF9vcHRpb25zIiwidW5pdCIsInVwZGF0ZV9tZXRob2Rfb3B0aW9ucyIsImNoYW5nZV9vcHRpb25zIiwibWV0aG9kX29wdGlvbnNfZWwiLCJtZXRob2Rfb3RoZXJfZWwiLCJpbmNsdWRlcyIsInNldEVsZW1lbnRDbGFzcyIsInN1YnN0YW5jZV9ldmVudF9vcHRpb25zIiwiY2F0ZWdvcnlfb3B0aW9uc19lbCIsImNhdGVnb3J5X29wdGlvbnMiLCJ0b1N0cmluZyIsImdldF9zdWJzdGFuY2VfZXZlbnRfcHJvcGVydGllcyIsImRhdGVTdHIiLCJwb3B1bGF0ZVRleHQiLCJ0b0RhdGVTdHJpbmciLCJvcGVuIiwiS2V5RXZlbnQiLCJub191c2VfZGF0ZXMiLCJnZXRfZXZlbnRzIiwiTm9Vc2VFdmVudCIsImlzUHJvdG90eXBlT2YiLCJVc2VFdmVudCIsImNvcHkiLCJjbG9uZSIsInNldF9kYXRlIiwic2V0X2dpZCIsImdpZCIsInN0YXJ0U3RyIiwiZW5kU3RyIiwidW50aWwiLCJzZXREYXRlIiwiZ2V0RGF0ZSIsInVudGlsU3RyIiwidG9JU09TdHJpbmciLCJpbXBvcnRfZXZlbnRzIiwibWFrZV9yZWN1cnJlbmNlIiwidGl0bGUiLCJncm91cElkIiwiZ2V0X2V2ZW50IiwiZGVsZXRlX2V2ZW50IiwiY2xpY2tlZF9ldmVudCIsImtleV9ldmVudF9kYXRhIiwicG9wdWxhdGVGb3JtIiwiZ2V0X2V2ZW50X2dyb3VwIiwic2V0X3Byb3BlcnRpZXMiLCJzZXRQcm9wIiwic2Vzc2lvblN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsInVzZV9ldmVudF9kYXRhIiwidW5pdHNPdGhlciIsIm5vdGUiLCJtZXRob2RUeXBlIiwibWV0aG9kT3RoZXIiLCJuX3NpYmxpbmdzIiwiZ2V0X2V2ZW50X3NpYmxpbmdzIiwiZGVsZXRlX2dyb3VwIiwiZ2V0X2V2ZW50X2xpc3QiLCJ1cGRhdGVfc3Vic3RhbmNlc191c2VkIiwibmV3X2xpc3QiLCJFZGl0b3IiLCJ0bGZiX3Byb3BlcnRpZXMiLCJlZGl0b3IiLCJfY3VycmVudF9wcm9wZXJ0aWVzIiwiX21vZGFsX3N1YnN0YW5jZXMiLCJfbW9kYWxfcHJvcGVydGllcyIsIl9tb2RhbF9zdW1tYXJ5IiwiX21vZGFsX2ltcG9ydF9qc29uIiwiX21vZGFsX2ltcG9ydF9jc3YiLCJfbW9kYWxfY29uZmlybV9pbXBvcnQiLCJfZWRpdG9yIiwiZ2V0SXRlbSIsInBhcnNlIiwib3B0aW1pemVkX2V2ZW50cyIsIl9kYXRlIiwiZGVzZXJpYWxpemVfZXZlbnRzX2pzb24iLCJjaGFuZ2VfcHJvcGVydGllcyIsInNlbGVjdF9zdWJzdGFuY2UiLCJzdW1tYXJpemUiLCJpbXBvcnRfanNvbiIsImltcG9ydF9jc3YiLCJleHBvcnRfanNvbiIsImV4cG9ydF9jc3YiLCJwaWQiLCJzdWJqZWN0IiwicmVjb3JkIiwidGltZXBvaW50Iiwia2V5ZmllbGQiLCJzdGFmZiIsIm5ld190bGZiX3Byb3BlcnRpZXMiLCJ1cGRhdGVfcHJvcGVydGllcyIsInNldE9wdGlvbiIsIm1pc3NpbmdfcHJvcGVydGllc193YXJuIiwibWlzc2luZ190bGZiX3Byb3BlcnRpZXMiLCJtaXNzaW5nX2FsZXJ0IiwicHJvcCIsImdldF9kZXNlbGVjdGVkX3N1YnN0YW5jZXMiLCJvbGRfc3ViX2xpc3QiLCJuZXdfc3ViX2xpc3QiLCJkZXNlbGVjdGVkX21ldGhvZHMiLCJlbCIsIm1lcmdlX3NlbGVjdGVkX3N1YnN0YW5jZXMiLCJzdWJzdGFuY2VfdXNlZCIsInN1YnN0YW5jZV9pbmRleCIsImZpbmRJbmRleCIsInN1YnN0YW5jZXNfY2hlY2tlZCIsInVzZWQiLCJzcGxpdCIsInN1Yl9pbmZvIiwiZGVsZXRlX3N1YnN0YW5jZSIsIndlZWtzIiwiZGF5cyIsInRvZGF5IiwiQ2FsZW5kYXJEYXRlIiwic3Vic3RhbmNlX3VzZV9ldmVudHMiLCJkYXRlX29iamVjdCIsImlzQWZ0ZXIiLCJpc1NhbWVEYXkiLCJpc0JlZm9yZSIsImV0b2hfdXNlX2RheXMiLCJjYWxjdWxhdGUiLCJjYWxjX2RheXNfdXNlZCIsIm1qX3VzZV9kYXlzIiwibmljX3VzZV9kYXlzIiwiZXRvaF91c2VfZGF5c19hbW91bnQiLCJjYWxjX2RheXNfdXNlZF9hbW91bnQiLCJTdHJpbmciLCJldG9oX3RvdGFsX3VuaXRzIiwiY2FsY190b3RhbF91bml0cyIsIm1qX3RvdGFsX3VuaXRzIiwiY2FsY190b3RhbF9vY2Nhc2lvbnMiLCJuaWNfdG90YWxfdW5pdHMiLCJ0b0ZpeGVkIiwiY2FsY19kYXlzX3NpbmNlX2xhc3RfdXNlIiwiZXZlbnRzIiwiZ3JvdXBlZF9ldmVudHMiLCJfZ2lkIiwic2VyaWFsaXplZF9ldmVudHMiLCJldmVudF9kYXRlIiwiX3R5cGUiLCJfdGl0bGUiLCJldmVudF9wcm9wZXJ0aWVzIiwiX2NhdGVnb3J5IiwiX3N1YnN0YW5jZSIsIl9tZXRob2RUeXBlIiwiX21ldGhvZCIsIl9tZXRob2RPdGhlciIsIl90aW1lcyIsIl9hbW91bnQiLCJfdW5pdHMiLCJfdW5pdHNPdGhlciIsIl9ub3RlIiwiZGVzZXJpYWxpemVfZXZlbnRzX2NzdiIsInZhbGlkX0pTT04iLCJqc29uIiwicHJvcGVydHkiLCJldmVudF9wcm9wIiwiX2VpZCIsImVyciIsInZhbGlkX0NTViIsImNzdiIsImltcG9ydGVkX3Byb3BlcnRpZXMiLCJpbXBvcnRlZF9zdWJzdGFuY2VzIiwidGhpc19maWxlIiwidXBsb2FkX3N1YmplY3RfanNvbiIsInVwbG9hZF9ldmVudF9qc29uIiwidXBsb2FkX3N0YXJ0X2pzb24iLCJ1cGxvYWRfZW5kX2pzb24iLCJ1cGxvYWRfZXZlbnRzX2pzb24iLCJ1cGxvYWRfZWFybGllc3RfanNvbiIsInVwbG9hZF9sYXRlc3RfanNvbiIsInVwbG9hZF9zdWJzdGFuY2VzX2pzb24iLCJ1cGxvYWRfZmlsZV9uYW1lX2pzb24iLCJ3YXJuX2VsZW1lbnQiLCJpbXBvcnRfZWxlbWVudHMiLCJyZXNldF9tb2RhbF90ZXh0IiwiZXZ0IiwiZmlsZXMiLCJvYl9yZCIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJvYl9kYXRhIiwicmVzdWx0IiwicmVzZXQiLCJkYXRlcyIsImN1cnIiLCJldmVudF9vYmplY3QiLCJvY2Nhc2lvbnMiLCJub3RlcyIsIm1ldGhvZF9vdGhlciIsImNsYXNzTGlzdCIsInJlbW92ZSIsImVhcmxpZXN0X2RheSIsImxhdGVzdF9kYXkiLCJzdWJzdGFuY2Vfc3RyaW5nIiwicmVhZEFzVGV4dCIsIm1pc3NpbmdfcGFyYW1zIiwidXBsb2FkX3N1YmplY3RfY3N2IiwidXBsb2FkX2V2ZW50X2NzdiIsInVwbG9hZF9zdGFydF9jc3YiLCJ1cGxvYWRfZW5kX2NzdiIsInVwbG9hZF9ldmVudHNfY3N2IiwidXBsb2FkX2VhcmxpZXN0X2NzdiIsInVwbG9hZF9sYXRlc3RfY3N2IiwidXBsb2FkX3N1YnN0YW5jZXNfY3N2IiwidXBsb2FkX2ZpbGVfbmFtZV9jc3YiLCJhcnJheSIsInByb3BlcnRpZXNfZGF0YSIsImZpbGVfbmFtZSIsImRhdGV0aW1lIiwiYXBwdmVyc2lvbiIsInNlcmlhbGl6ZV9ldmVudHMiLCJkYXRhX2pzb24iLCJqc29uX2Jsb2IiLCJCbG9iIiwiYmxvYl91cmwiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJkb3dubG9hZF9hbmNob3IiLCJocmVmIiwiZG93bmxvYWQiLCJjbGljayIsInJldm9rZU9iamVjdFVSTCIsInByb3BlcnRpZXNfcm93cyIsImV2ZW50c19yb3dzIiwiYWxsX3Jvd3MiLCJjc3Zfc3RyaW5nIiwicm93Iiwiam9pbiIsImNzdl9ibG9iIiwiZWxlbWVudHMiLCJGaWxlIiwiZ2V0X3VybF9wcm9wZXJ0aWVzIiwidG8iLCJ2YWxpZGF0b3IiLCJwYXJhbSIsImhhcyIsImFsZXJ0IiwidXBkYXRlZCIsImFzc2lnbiIsImRheXNfYXBhcnQiLCJ1dGlsIiwic2V0X2lubmVyIiwiYmFzZV91cmwiLCJoaXN0b3J5IiwicmVwbGFjZVN0YXRlIiwidXJsX3RsZmJfcHJvcGVydGllcyIsImNhbGVuZGFyRWwiLCJDYWxlbmRhciIsInBsdWdpbnMiLCJpbml0aWFsVmlldyIsInZhbGlkUmFuZ2UiLCJoZWFkZXJUb29sYmFyIiwibGVmdCIsInJpZ2h0IiwiZWRpdGFibGUiLCJzZWxlY3RhYmxlIiwic2hvd05vbkN1cnJlbnREYXRlcyIsImZpeGVkV2Vla0NvdW50IiwiaGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJmaWxlIiwiX3N1YnN0YW5jZV9mb3JtIiwiaW5kZXgiLCJfb25zdWJtaXQiLCJjb250YWlucyIsIl9lbGVtZW50IiwiX2Zvcm0iLCJxdWVyeVNlbGVjdG9yIiwiY2xvc2UiLCJwcmV2ZW50RGVmYXVsdCIsInN1Ym1pdCIsImdldEZvcm1EYXRhIiwic3VibWl0X2J1dHRvbl92YWx1ZSIsInN1Ym1pdHRlciIsImFwcGVuZCIsIm5hbWVkSXRlbSIsInNlbGVjdG9yIiwiRm9ybURhdGEiLCJvbnN1Ym1pdCIsImlzTmFOIiwiZ2V0VVRDRGF5IiwiZ2V0VVRDRGF0ZSIsImdldFVUQ01vbnRoIiwiZ2V0VVRDRnVsbFllYXIiLCJzZXRfZGF5IiwiZGF5Iiwic2V0VVRDRGF0ZSIsInllYXIiLCJtb250aCIsInNldF9laWQiLCJlaWQiLCJ3ZWVrZGF5cyIsImR0IiwibmV4dF9kYXkiLCJ3ZWVrZGF5IiwiQ2FsZW5kYXJFdmVudCIsInVwZGF0ZV90aXRsZSIsImZ1bGxjYWxlbmRhciIsIl9uZXh0X2VpZCIsIl9uZXh0X2dpZCIsIl9ldmVudHMiLCJfZnVsbGNhbGVuZGFyIiwic3RhcnRfZGF0ZSIsImVuZF9kYXRlIiwiX2dldF9uZXh0X2VpZCIsIm5leHRfZWlkIiwiX2dldF9uZXh0X2dpZCIsIm5leHRfZ2lkIiwicmVhc3NpZ24iLCJnZXRFdmVudEJ5SWQiLCJyZW1vdmVfZXZlbnRzIiwiZ2V0RXZlbnRzIiwibmV3X25vX3VzZSIsInJlbGV2YW50X2V2ZW50cyIsImludmFsaWRfZGF0ZXMiLCJuZXdfdXNlIiwiZXZlbnRfaW5kZXgiLCJnaWRfbWFwcGluZyIsImFkZEV2ZW50IiwidGV4dENvbG9yIiwiY29sb3JzIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJhcyIsImV2ZW50X3JvdyIsImpzb25fZXZlbnRzIiwidGV4dCIsIk5vZGVMaXN0IiwibW9kYWwiLCJjbG9zZXN0IiwiZXhwb3J0cyIsImludGVybmFsQ29tbW9uIiwicHJlYWN0IiwiZ2xvYmFsTG9jYWxlcyIsIk1JTklNQUxfUkFXX0VOX0xPQ0FMRSIsImNvZGUiLCJ3ZWVrIiwiZG93IiwiZG95IiwiZGlyZWN0aW9uIiwiYnV0dG9uVGV4dCIsInByZXYiLCJuZXh0IiwicHJldlllYXIiLCJuZXh0WWVhciIsImxpc3QiLCJ3ZWVrVGV4dCIsIndlZWtUZXh0TG9uZyIsImNsb3NlSGludCIsInRpbWVIaW50IiwiZXZlbnRIaW50IiwiYWxsRGF5VGV4dCIsIm1vcmVMaW5rVGV4dCIsIm5vRXZlbnRzVGV4dCIsIlJBV19FTl9MT0NBTEUiLCJidXR0b25IaW50cyIsInZpZXdIaW50IiwibmF2TGlua0hpbnQiLCJtb3JlTGlua0hpbnQiLCJldmVudENudCIsIm9yZ2FuaXplUmF3TG9jYWxlcyIsImV4cGxpY2l0UmF3TG9jYWxlcyIsImRlZmF1bHRDb2RlIiwiYWxsUmF3TG9jYWxlcyIsInJhd0xvY2FsZU1hcCIsInJhd0xvY2FsZSIsImJ1aWxkTG9jYWxlIiwiaW5wdXRTaW5ndWxhciIsImF2YWlsYWJsZSIsImNvZGVBcmciLCJjb2RlcyIsInJhdyIsInBhcnRzIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJzaW1wbGVJZCIsInF1ZXJ5UmF3TG9jYWxlIiwicGFyc2VMb2NhbGUiLCJxdWVyeUxvY2FsZSIsIm1lcmdlZCIsIm1lcmdlUHJvcHMiLCJzaW1wbGVOdW1iZXJGb3JtYXQiLCJJbnRsIiwiTnVtYmVyRm9ybWF0IiwiY3JlYXRlUGx1Z2luIiwiaW5wdXQiLCJndWlkIiwicHJlbWl1bVJlbGVhc2VEYXRlIiwiZGVwcyIsInJlZHVjZXJzIiwiaXNMb2FkaW5nRnVuY3MiLCJjb250ZXh0SW5pdCIsImV2ZW50UmVmaW5lcnMiLCJldmVudERlZk1lbWJlckFkZGVycyIsImV2ZW50U291cmNlUmVmaW5lcnMiLCJpc0RyYWdnYWJsZVRyYW5zZm9ybWVycyIsImV2ZW50RHJhZ011dGF0aW9uTWFzc2FnZXJzIiwiZXZlbnREZWZNdXRhdGlvbkFwcGxpZXJzIiwiZGF0ZVNlbGVjdGlvblRyYW5zZm9ybWVycyIsImRhdGVQb2ludFRyYW5zZm9ybXMiLCJkYXRlU3BhblRyYW5zZm9ybXMiLCJ2aWV3cyIsInZpZXdQcm9wc1RyYW5zZm9ybWVycyIsImlzUHJvcHNWYWxpZCIsImV4dGVybmFsRGVmVHJhbnNmb3JtcyIsInZpZXdDb250YWluZXJBcHBlbmRzIiwiZXZlbnREcm9wVHJhbnNmb3JtZXJzIiwiY29tcG9uZW50SW50ZXJhY3Rpb25zIiwiY2FsZW5kYXJJbnRlcmFjdGlvbnMiLCJ0aGVtZUNsYXNzZXMiLCJldmVudFNvdXJjZURlZnMiLCJjbWRGb3JtYXR0ZXIiLCJyZWN1cnJpbmdUeXBlcyIsIm5hbWVkVGltZVpvbmVkSW1wbCIsImVsZW1lbnREcmFnZ2luZ0ltcGwiLCJvcHRpb25DaGFuZ2VIYW5kbGVycyIsInNjcm9sbEdyaWRJbXBsIiwibGlzdGVuZXJSZWZpbmVycyIsIm9wdGlvblJlZmluZXJzIiwicHJvcFNldEhhbmRsZXJzIiwiU3RhbmRhcmRUaGVtZSIsIlRoZW1lIiwiZW5zdXJlVmlld0RlZiIsInZpZXdUeXBlIiwiaGFzaCIsImRlZmF1bHRDb25maWdzIiwib3ZlcnJpZGVDb25maWdzIiwidmlld0RlZiIsImRlZmF1bHRDb25maWciLCJvdmVycmlkZUNvbmZpZyIsInF1ZXJ5UHJvcCIsInRoZUNvbXBvbmVudCIsInN1cGVyVHlwZSIsInN1cGVyRGVmIiwiY29tcG9uZW50IiwiZGVmYXVsdHMiLCJyYXdPcHRpb25zIiwib3ZlcnJpZGVzIiwiYnVpbGRWaWV3RGVmIiwicGFyc2VWaWV3Q29uZmlncyIsImlucHV0cyIsIm1hcEhhc2giLCJwYXJzZVZpZXdDb25maWciLCJjb250ZW50IiwiY3JlYXRlVmlld0hvb2tDb21wb25lbnQiLCJCYXNlQ29tcG9uZW50Iiwidmlld1Byb3BzIiwiVmlld0NvbnRleHRUeXBlIiwiQ29udGVudENvbnRhaW5lciIsImVsVGFnIiwiZWxDbGFzc2VzIiwiYnVpbGRWaWV3Q2xhc3NOYW1lcyIsInZpZXdTcGVjIiwicmVuZGVyUHJvcHMiLCJuZXh0RGF5VGhyZXNob2xkIiwiZ2VuZXJhdG9yTmFtZSIsImN1c3RvbUdlbmVyYXRvciIsImNsYXNzTmFtZUdlbmVyYXRvciIsImNsYXNzTmFtZXMiLCJkaWRNb3VudCIsIndpbGxVbm1vdW50IiwiYnVpbGRWaWV3U3BlY3MiLCJkZWZhdWx0SW5wdXRzIiwib3B0aW9uT3ZlcnJpZGVzIiwiZHluYW1pY09wdGlvbk92ZXJyaWRlcyIsImxvY2FsZURlZmF1bHRzIiwidmlld0RlZnMiLCJjb21waWxlVmlld0RlZnMiLCJkdXJhdGlvbklucHV0IiwiZHVyYXRpb24iLCJkdXJhdGlvblVuaXQiLCJzaW5nbGVVbml0Iiwic2luZ2xlVW5pdE92ZXJyaWRlcyIsInJlcyIsImR1cmF0aW9uSW5wdXRNYXAiLCJjcmVhdGVEdXJhdGlvbiIsImNyZWF0ZUR1cmF0aW9uQ2FjaGVkIiwiZGVub20iLCJncmVhdGVzdER1cmF0aW9uRGVub21pbmF0b3IiLCJxdWVyeUJ1dHRvblRleHQiLCJvcHRpb25zU3Vic2V0IiwiYnV0dG9uVGV4dE1hcCIsImJ1dHRvblRleHRLZXkiLCJxdWVyeUJ1dHRvblRpdGxlIiwiYnV0dG9uS2V5Iiwib3B0aW9uRGVmYXVsdHMiLCJidXR0b25UZXh0T3ZlcnJpZGUiLCJidXR0b25UZXh0RGVmYXVsdCIsIkJBU0VfT1BUSU9OX0RFRkFVTFRTIiwiYnV0dG9uVGl0bGVPdmVycmlkZSIsImJ1dHRvbkhpbnQiLCJidXR0b25UaXRsZURlZmF1bHQiLCJidWlsZFZpZXdTcGVjIiwiY2xhc3NlcyIsInJvb3QiLCJ0YWJsZUNlbGxTaGFkZWQiLCJidXR0b25Hcm91cCIsImJ1dHRvbiIsImJ1dHRvbkFjdGl2ZSIsImJhc2VJY29uQ2xhc3MiLCJpY29uQ2xhc3NlcyIsInJ0bEljb25DbGFzc2VzIiwiaWNvbk92ZXJyaWRlT3B0aW9uIiwiaWNvbk92ZXJyaWRlQ3VzdG9tQnV0dG9uT3B0aW9uIiwiaWNvbk92ZXJyaWRlUHJlZml4IiwiY29tcHV0ZUV2ZW50U291cmNlc0xvYWRpbmciLCJldmVudFNvdXJjZXMiLCJzb3VyY2VJZCIsImlzRmV0Y2hpbmciLCJhZGRTb3VyY2VzIiwiZXZlbnRTb3VyY2VIYXNoIiwic291cmNlcyIsImZldGNoUmFuZ2UiLCJzb3VyY2UiLCJmZXRjaERpcnR5U291cmNlcyIsInNvdXJjZUhhc2giLCJmZXRjaFNvdXJjZXNCeUlkcyIsImZpbHRlckhhc2giLCJldmVudFNvdXJjZSIsImRvZXNTb3VyY2VOZWVkUmFuZ2UiLCJsYXp5RmV0Y2hpbmciLCJsYXRlc3RGZXRjaElkIiwiaXNTb3VyY2VEaXJ0eSIsInByZXZTb3VyY2VzIiwic291cmNlSWRIYXNoIiwiaXNSZWZldGNoIiwibmV4dFNvdXJjZXMiLCJmZXRjaFNvdXJjZSIsImNhbGVuZGFyQXBpIiwic291cmNlRGVmIiwicGx1Z2luSG9va3MiLCJzb3VyY2VEZWZJZCIsImZldGNoSWQiLCJmZXRjaCIsInJhbmdlIiwicmF3RXZlbnRzIiwiZXZlbnRTb3VyY2VTdWNjZXNzIiwicmVzcG9uc2UiLCJzdWNjZXNzIiwiZGlzcGF0Y2giLCJlcnJvciIsImVycm9ySGFuZGxlZCIsImV2ZW50U291cmNlRmFpbHVyZSIsImZhaWx1cmUiLCJ3YXJuIiwibWVzc2FnZSIsImV4Y2x1ZGVTdGF0aWNTb3VyY2VzIiwiaWdub3JlUmFuZ2UiLCJyZWR1Y2VEYXRlU2VsZWN0aW9uIiwiY3VycmVudFNlbGVjdGlvbiIsImFjdGlvbiIsInNlbGVjdGlvbiIsInJlZHVjZVNlbGVjdGVkRXZlbnQiLCJjdXJyZW50SW5zdGFuY2VJZCIsImV2ZW50SW5zdGFuY2VJZCIsInJlZHVjZUV2ZW50RHJhZyIsImN1cnJlbnREcmFnIiwibmV3RHJhZyIsImFmZmVjdGVkRXZlbnRzIiwibXV0YXRlZEV2ZW50cyIsImlzRXZlbnQiLCJyZWR1Y2VFdmVudFJlc2l6ZSIsImN1cnJlbnRSZXNpemUiLCJuZXdSZXNpemUiLCJwYXJzZVRvb2xiYXJzIiwiY2FsZW5kYXJPcHRpb25zIiwiY2FsZW5kYXJPcHRpb25PdmVycmlkZXMiLCJ0aGVtZSIsInZpZXdTcGVjcyIsImhlYWRlciIsInBhcnNlVG9vbGJhciIsImZvb3RlciIsImZvb3RlclRvb2xiYXIiLCJzZWN0aW9uU3RySGFzaCIsInNlY3Rpb25XaWRnZXRzIiwidmlld3NXaXRoQnV0dG9ucyIsImhhc1RpdGxlIiwic2VjdGlvbk5hbWUiLCJzZWN0aW9uUmVzIiwicGFyc2VTZWN0aW9uIiwid2lkZ2V0cyIsInNlY3Rpb25TdHIiLCJpc1J0bCIsImNhbGVuZGFyQ3VzdG9tQnV0dG9ucyIsImN1c3RvbUJ1dHRvbnMiLCJjYWxlbmRhckJ1dHRvblRleHRPdmVycmlkZXMiLCJjYWxlbmRhckJ1dHRvblRleHQiLCJjYWxlbmRhckJ1dHRvbkhpbnRPdmVycmlkZXMiLCJjYWxlbmRhckJ1dHRvbkhpbnRzIiwic2VjdGlvblN1YnN0cnMiLCJidXR0b25Hcm91cFN0ciIsImJ1dHRvbk5hbWUiLCJjdXN0b21CdXR0b25Qcm9wcyIsImJ1dHRvbkNsaWNrIiwiYnV0dG9uSWNvbiIsImdldEN1c3RvbUJ1dHRvbkljb25DbGFzcyIsImdldEljb25DbGFzcyIsImhpbnQiLCJjaGFuZ2VWaWV3IiwidGV4dEZhbGxiYWNrIiwiZm9ybWF0V2l0aE9yZGluYWxzIiwicHJldk9yTmV4dCIsIm5hdlVuaXQiLCJWaWV3SW1wbCIsImdldEN1cnJlbnREYXRhIiwiZGF0ZUVudiIsInZpZXdUaXRsZSIsImFjdGl2ZVN0YXJ0IiwidG9EYXRlIiwiZGF0ZVByb2ZpbGUiLCJhY3RpdmVSYW5nZSIsImFjdGl2ZUVuZCIsImN1cnJlbnRTdGFydCIsImN1cnJlbnRSYW5nZSIsImN1cnJlbnRFbmQiLCJnZXRPcHRpb24iLCJoYW5kbGVFdmVudFNvdXJjZXMiLCJ1bmZvdW5kU291cmNlcyIsImhhc2hWYWx1ZXNUb0FycmF5IiwiX3JhdyIsIm5ld0lucHV0cyIsImlucHV0Rm91bmQiLCJ1bmZvdW5kU291cmNlIiwibmV3SW5wdXQiLCJhZGRFdmVudFNvdXJjZSIsImdsb2JhbFBsdWdpbnMiLCJwYXJzZU1ldGEiLCJyZWZpbmVkIiwiYXJnIiwic3VjY2Vzc0NhbGxiYWNrIiwibWV0YSIsImVycm9yQ2FsbGJhY2siLCJmdW5jIiwidW5wcm9taXNpZnkiLCJidWlsZFJhbmdlQXBpV2l0aFRpbWVab25lIiwiZXh0cmFQYXJhbXMiLCJpZGVudGl0eSIsInN0YXJ0UGFyYW0iLCJlbmRQYXJhbSIsInRpbWVab25lUGFyYW0iLCJ1cmwiLCJmb3JtYXQiLCJ0b1VwcGVyQ2FzZSIsInJlcXVlc3RQYXJhbXMiLCJjdXN0b21SZXF1ZXN0UGFyYW1zIiwicGFyYW1zIiwiZm9ybWF0SXNvIiwidGltZVpvbmUiLCJidWlsZFJlcXVlc3RQYXJhbXMiLCJyZXF1ZXN0SnNvbiIsImRheXNPZldlZWsiLCJzdGFydFRpbWUiLCJlbmRUaW1lIiwic3RhcnRSZWN1ciIsImVuZFJlY3VyIiwicmVjdXJyaW5nRGF0YSIsImNyZWF0ZU1hcmtlciIsInN1YnRyYWN0RHVyYXRpb25zIiwiYWxsRGF5R3Vlc3MiLCJCb29sZWFuIiwidHlwZURhdGEiLCJleHBhbmQiLCJmcmFtaW5nUmFuZ2UiLCJjbGlwcGVkRnJhbWluZ1JhbmdlIiwiaW50ZXJzZWN0UmFuZ2VzIiwiZG93SGFzaCIsImFycmF5VG9IYXNoIiwiZGF5TWFya2VyIiwic3RhcnRPZkRheSIsImVuZE1hcmtlciIsImluc3RhbmNlU3RhcnRzIiwiaW5zdGFuY2VTdGFydCIsImFkZERheXMiLCJleHBhbmRSYW5nZXMiLCJlbWl0dGVyIiwidHJpZ2dlciIsInZpZXciLCJ2aWV3QXBpIiwiZXZlbnRTdG9yZSIsImhhc0hhbmRsZXJzIiwiYnVpbGRFdmVudEFwaXMiLCJUYXNrUnVubmVyIiwicnVuVGFza09wdGlvbiIsImRyYWluZWRPcHRpb24iLCJxdWV1ZSIsImRlbGF5ZWRSdW5uZXIiLCJEZWxheWVkUnVubmVyIiwiZHJhaW4iLCJyZXF1ZXN0IiwidGFzayIsImRlbGF5IiwicGF1c2UiLCJzY29wZSIsInJlc3VtZSIsImZvcmNlIiwiY29tcGxldGVkVGFza3MiLCJydW5UYXNrIiwiZHJhaW5lZCIsImJ1aWxkVGl0bGUiLCJ2aWV3T3B0aW9ucyIsImN1cnJlbnRSYW5nZVVuaXQiLCJmb3JtYXRSYW5nZSIsImNyZWF0ZUZvcm1hdHRlciIsInRpdGxlRm9ybWF0IiwiZGlmZldob2xlRGF5cyIsImJ1aWxkVGl0bGVGb3JtYXQiLCJpc0VuZEV4Y2x1c2l2ZSIsImlzUmFuZ2VBbGxEYXkiLCJkZWZhdWx0U2VwYXJhdG9yIiwidGl0bGVSYW5nZVNlcGFyYXRvciIsIkNhbGVuZGFyRGF0YU1hbmFnZXIiLCJjb21wdXRlQ3VycmVudFZpZXdEYXRhIiwibWVtb2l6ZSIsIl9jb21wdXRlQ3VycmVudFZpZXdEYXRhIiwiYnVpbGRQbHVnaW5Ib29rcyIsImN1cnJlbnRIb29rcyIsImN1cnJlbnRPdmVycmlkZURlZnMiLCJjdXJyZW50R2xvYmFsRGVmcyIsIm92ZXJyaWRlRGVmcyIsImdsb2JhbERlZnMiLCJpc0FycmF5c0VxdWFsIiwicGx1Z2luRGVmcyIsImN1cnJlbnRQbHVnaW5JZHMiLCJob29rcyIsImFkZERlZnMiLCJkZWZzIiwiZGVmIiwicGx1Z2luTmFtZSIsImN1cnJlbnRJZCIsImhvb2tzMSIsImRhdGUwIiwiaG9va3MwIiwiZGF0ZTEiLCJNYXRoIiwibWF4IiwiYnVpbGRCdWlsZFBsdWdpbkhvb2tzIiwiYnVpbGREYXRlRW52IiwiYnVpbGREYXRlRW52JDEiLCJidWlsZFRoZW1lIiwiYnVpbGREYXRlUHJvZmlsZUdlbmVyYXRvciIsIm1lbW9pemVPYmpBcmciLCJidWlsZFZpZXdBcGkiLCJidWlsZFZpZXdVaVByb3BzIiwiYnVpbGRFdmVudFVpQnlTb3VyY2UiLCJpc1Byb3BzRXF1YWwiLCJidWlsZEV2ZW50VWlCYXNlcyIsInBhcnNlQ29udGV4dEJ1c2luZXNzSG91cnMiLCJFbWl0dGVyIiwiYWN0aW9uUnVubmVyIiwiX2hhbmRsZUFjdGlvbiIsInVwZGF0ZURhdGEiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zSW5wdXQiLCJjdXJyZW50Q2FsZW5kYXJPcHRpb25zUmVmaW5lZCIsImN1cnJlbnRWaWV3T3B0aW9uc0lucHV0IiwiY3VycmVudFZpZXdPcHRpb25zUmVmaW5lZCIsImN1cnJlbnRDYWxlbmRhck9wdGlvbnNSZWZpbmVycyIsIm9wdGlvbnNGb3JSZWZpbmluZyIsIm9wdGlvbnNGb3JIYW5kbGluZyIsIm9wdGlvbnNEYXRhIiwiY29tcHV0ZU9wdGlvbnNEYXRhIiwiY3VycmVudFZpZXdUeXBlIiwiY3VycmVudFZpZXdEYXRhIiwiY3VycmVudERhdGFNYW5hZ2VyIiwic2V0VGhpc0NvbnRleHQiLCJzZXRPcHRpb25zIiwiY3VycmVudERhdGUiLCJnZXRJbml0aWFsRGF0ZSIsImRhdGVQcm9maWxlR2VuZXJhdG9yIiwiYnVpbGQiLCJyYW5nZUNvbnRhaW5zTWFya2VyIiwiY2FsZW5kYXJDb250ZXh0IiwiY2FsbGJhY2siLCJyZWZpbmVycyIsImJ1aWxkRXZlbnRTb3VyY2VSZWZpbmVycyIsInJhd1NvdXJjZXMiLCJpbml0aWFsRXZlbnRzIiwidW5zaGlmdCIsInJhd1NvdXJjZSIsInBhcnNlRXZlbnRTb3VyY2UiLCJwYXJzZUluaXRpYWxTb3VyY2VzIiwiaW5pdEV2ZW50U291cmNlcyIsImluaXRpYWxTdGF0ZSIsImJ1c2luZXNzSG91cnMiLCJldmVudFVpQmFzZXMiLCJjcmVhdGVFbXB0eUV2ZW50U3RvcmUiLCJyZW5kZXJhYmxlRXZlbnRTdG9yZSIsImRhdGVTZWxlY3Rpb24iLCJldmVudFNlbGVjdGlvbiIsImV2ZW50RHJhZyIsImV2ZW50UmVzaXplIiwic2VsZWN0aW9uQ29uZmlnIiwiY29udGV4dEFuZFN0YXRlIiwicmVkdWNlciIsImNvbXB1dGVJc0xvYWRpbmciLCJyZXNldE9wdGlvbnMiLCJjaGFuZ2VkT3B0aW9uTmFtZXMiLCJvcHRpb25OYW1lIiwicmF3T3B0aW9uVmFsdWUiLCJyZWR1Y2VEeW5hbWljT3B0aW9uT3ZlcnJpZGVzIiwicmVkdWNlVmlld1R5cGUiLCJyZWR1Y2VDdXJyZW50RGF0ZSIsImN1cnJlbnREYXRlUHJvZmlsZSIsImRwIiwiZGF0ZU1hcmtlciIsImJ1aWxkUHJldiIsImlzVmFsaWQiLCJidWlsZE5leHQiLCJyZWR1Y2VEYXRlUHJvZmlsZSIsInNvdXJjZUlkcyIsInJlY2VpdmVSZXNwb25zZSIsInJlZHVjZUV2ZW50U291cmNlcyIsInJlZHVjZUV2ZW50U3RvcmUiLCJwcm9ncmVzc2l2ZUV2ZW50UmVuZGVyaW5nIiwiZXZlbnRVaVNpbmdsZUJhc2UiLCJldmVudFVpQnlTb3VyY2UiLCJuZXdTdGF0ZSIsIndhc0xvYWRpbmciLCJpc0xvYWRpbmciLCJvbkFjdGlvbiIsIm9sZERhdGEiLCJjaGFuZ2VIYW5kbGVycyIsIm9sZENhbGVuZGFyT3B0aW9ucyIsIm5ld0NhbGVuZGFyT3B0aW9ucyIsInJlZHVjZUV2ZW50U291cmNlc05ld1RpbWVab25lIiwicmV6b25lRXZlbnRTdG9yZURhdGVzIiwib25EYXRhIiwic3RhYmxlT3B0aW9uT3ZlcnJpZGVzIiwic3RhYmxlRHluYW1pY09wdGlvbk92ZXJyaWRlcyIsInN0YWJsZUNhbGVuZGFyT3B0aW9uc0RhdGEiLCJyZWZpbmVkT3B0aW9ucyIsImF2YWlsYWJsZUxvY2FsZURhdGEiLCJleHRyYSIsInByb2Nlc3NSYXdDYWxlbmRhck9wdGlvbnMiLCJ3YXJuVW5rbm93bk9wdGlvbnMiLCJsb2NhbGUiLCJ3ZWVrTnVtYmVyQ2FsY3VsYXRpb24iLCJmaXJzdERheSIsImRlZmF1bHRSYW5nZVNlcGFyYXRvciIsInRvb2xiYXJDb25maWciLCJhdmFpbGFibGVSYXdMb2NhbGVzIiwibG9jYWxlcyIsIm1lcmdlUmF3T3B0aW9ucyIsIkJBU0VfT1BUSU9OX1JFRklORVJTIiwiQ0FMRU5EQVJfTElTVEVORVJfUkVGSU5FUlMiLCJDQUxFTkRBUl9PUFRJT05fUkVGSU5FUlMiLCJjdXJyZW50UmF3IiwiY3VycmVudFJlZmluZWQiLCJhbnlDaGFuZ2VzIiwiQ09NUExFWF9PUFRJT05fQ09NUEFSQVRPUlMiLCJwcm9jZXNzUmF3Vmlld09wdGlvbnMiLCJkYXRlUHJvZmlsZUdlbmVyYXRvckNsYXNzIiwidXNlc01pbk1heFRpbWUiLCJzbG90TWluVGltZSIsInNsb3RNYXhUaW1lIiwiZGF5Q291bnQiLCJkYXRlQWxpZ25tZW50IiwiZGF0ZUluY3JlbWVudCIsImhpZGRlbkRheXMiLCJ3ZWVrZW5kcyIsIm5vd0lucHV0Iiwibm93IiwidmFsaWRSYW5nZUlucHV0IiwidmlzaWJsZVJhbmdlSW5wdXQiLCJ2aXNpYmxlUmFuZ2UiLCJWSUVXX09QVElPTl9SRUZJTkVSUyIsImV4cGxpY2l0TG9jYWxlIiwiRGF0ZUVudiIsImNhbGVuZGFyU3lzdGVtIiwibmFtZWRUaW1lWm9uZUltcGwiLCJ0aGVtZVN5c3RlbSIsIkRhdGVQcm9maWxlR2VuZXJhdG9yIiwidWkiLCJldmVudERlZnMiLCJkZWZJZCIsImNyZWF0ZUV2ZW50VWkiLCJkaXNwbGF5IiwiZXZlbnREaXNwbGF5Iiwic3RhcnRFZGl0YWJsZSIsImV2ZW50U3RhcnRFZGl0YWJsZSIsImR1cmF0aW9uRWRpdGFibGUiLCJldmVudER1cmF0aW9uRWRpdGFibGUiLCJjb25zdHJhaW50IiwiZXZlbnRDb25zdHJhaW50Iiwib3ZlcmxhcCIsImV2ZW50T3ZlcmxhcCIsImFsbG93IiwiZXZlbnRBbGxvdyIsImV2ZW50QmFja2dyb3VuZENvbG9yIiwiZXZlbnRCb3JkZXJDb2xvciIsImV2ZW50VGV4dENvbG9yIiwiY29sb3IiLCJldmVudENvbG9yIiwic2VsZWN0Q29uc3RyYWludCIsInNlbGVjdE92ZXJsYXAiLCJzZWxlY3RBbGxvdyIsImlzTG9hZGluZ0Z1bmMiLCJwYXJzZUJ1c2luZXNzSG91cnMiLCJ2aWV3TmFtZSIsIlRvb2xiYXJTZWN0aW9uIiwid2lkZ2V0R3JvdXBzIiwid2lkZ2V0R3JvdXAiLCJyZW5kZXJXaWRnZXRHcm91cCIsImlzT25seUJ1dHRvbnMiLCJ3aWRnZXQiLCJ0aXRsZUlkIiwiaXNQcmVzc2VkIiwiYWN0aXZlQnV0dG9uIiwiaXNEaXNhYmxlZCIsImlzVG9kYXlFbmFibGVkIiwiaXNQcmV2RW5hYmxlZCIsImlzTmV4dEVuYWJsZWQiLCJidXR0b25DbGFzc2VzIiwiZ2V0Q2xhc3MiLCJvbkNsaWNrIiwiZ3JvdXBDbGFzc05hbWUiLCJUb29sYmFyIiwic3RhcnRDb250ZW50IiwiZW5kQ29udGVudCIsIm1vZGVsIiwiZXh0cmFDbGFzc05hbWUiLCJmb3JjZUx0ciIsImNlbnRlckNvbnRlbnQiLCJjZW50ZXIiLCJyZW5kZXJTZWN0aW9uIiwiVmlld0hhcm5lc3MiLCJzdXBlciIsImF2YWlsYWJsZVdpZHRoIiwiaGFuZGxlRWwiLCJzZXRSZWYiLCJlbFJlZiIsInVwZGF0ZUF2YWlsYWJsZVdpZHRoIiwiaGFuZGxlUmVzaXplIiwiYXNwZWN0UmF0aW8iLCJsaXF1aWQiLCJwYWRkaW5nQm90dG9tIiwibGFiZWxlZEJ5SWQiLCJhZGRSZXNpemVIYW5kbGVyIiwicmVtb3ZlUmVzaXplSGFuZGxlciIsIm9mZnNldFdpZHRoIiwiRXZlbnRDbGlja2luZyIsIkludGVyYWN0aW9uIiwic2V0dGluZ3MiLCJoYW5kbGVTZWdDbGljayIsInNlZ0VsIiwic2VnIiwiZ2V0RWxTZWciLCJpc1ZhbGlkU2VnRG93bkVsIiwiaGFzVXJsQ29udGFpbmVyIiwiZWxlbWVudENsb3Nlc3QiLCJFdmVudEltcGwiLCJldmVudFJhbmdlIiwiaW5zdGFuY2UiLCJqc0V2ZW50IiwiZGVzdHJveSIsImxpc3RlbkJ5U2VsZWN0b3IiLCJFdmVudEhvdmVyaW5nIiwiaGFuZGxlRXZlbnRFbFJlbW92ZSIsImN1cnJlbnRTZWdFbCIsImhhbmRsZVNlZ0xlYXZlIiwiaGFuZGxlU2VnRW50ZXIiLCJ0cmlnZ2VyRXZlbnQiLCJyZW1vdmVIb3Zlckxpc3RlbmVycyIsImxpc3RlblRvSG92ZXJCeVNlbGVjdG9yIiwicHVibGljRXZOYW1lIiwiQ2FsZW5kYXJDb250ZW50IiwiYnVpbGRWaWV3Q29udGV4dCIsImJ1aWxkVmlld1Byb3BUcmFuc2Zvcm1lcnMiLCJidWlsZFRvb2xiYXJQcm9wcyIsImhlYWRlclJlZiIsImZvb3RlclJlZiIsImludGVyYWN0aW9uc1N0b3JlIiwidmlld0xhYmVsSWQiLCJnZXRVbmlxdWVEb21JZCIsInJlZ2lzdGVySW50ZXJhY3RpdmVDb21wb25lbnQiLCJzZXR0aW5nc0lucHV0IiwicGFyc2VJbnRlcmFjdGlvblNldHRpbmdzIiwiaW50ZXJhY3Rpb25zIiwiVGhlSW50ZXJhY3Rpb25DbGFzcyIsInVpZCIsImludGVyYWN0aW9uU2V0dGluZ3NTdG9yZSIsInVucmVnaXN0ZXJJbnRlcmFjdGl2ZUNvbXBvbmVudCIsImxpc3RlbmVycyIsImxpc3RlbmVyIiwicmVzaXplUnVubmVyIiwiaGFuZGxlV2luZG93UmVzaXplIiwid2luZG93UmVzaXplRGVsYXkiLCJ2aWV3QXNwZWN0UmF0aW8iLCJ0b29sYmFyUHJvcHMiLCJnZXROb3ciLCJ2aWV3Vkdyb3ciLCJ2aWV3SGVpZ2h0IiwiaXNIZWlnaHRBdXRvIiwiZm9yUHJpbnQiLCJjb250ZW50SGVpZ2h0Iiwidmlld0NvbnRleHQiLCJyZW5kZXJWaWV3IiwiYnVpbGRBcHBlbmRDb250ZW50IiwiQ2FsZW5kYXJJbnRlcmFjdGlvbkNsYXNzIiwicHJvcE5hbWUiLCJwcmV2UHJvcHMiLCJpbnRlcmFjdGlvbiIsInRyYW5zZm9ybWVycyIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtIiwiVmlld0NvbXBvbmVudCIsInRvZGF5SW5mbyIsInByZXZJbmZvIiwibmV4dEluZm8iLCJ0aGVDbGFzc2VzIiwiVGhlQ2xhc3MiLCJDYWxlbmRhckltcGwiLCJpc1JlbmRlcmluZyIsImlzUmVuZGVyZWQiLCJjdXJyZW50Q2xhc3NOYW1lcyIsImN1c3RvbUNvbnRlbnRSZW5kZXJJZCIsImhhbmRsZUFjdGlvbiIsInJlbmRlclJ1bm5lciIsInRyeURyYWluIiwiaGFuZGxlRGF0YSIsImN1cnJlbnREYXRhIiwicmVyZW5kZXJEZWxheSIsImhhbmRsZVJlbmRlclJlcXVlc3QiLCJDYWxlbmRhclJvb3QiLCJzZXRDbGFzc05hbWVzIiwic2V0SGVpZ2h0IiwiUmVuZGVySWQiLCJlbnN1cmVFbEhhc1N0eWxlcyIsIndhc1JlbmRlcmluZyIsInVwZGF0ZVNpemUiLCJiYXRjaFJlbmRlcmluZyIsInBhdXNlUmVuZGVyaW5nIiwicmVzdW1lUmVuZGVyaW5nIiwiYXBwbHlTdHlsZVByb3AiLCJKc29uUmVxdWVzdEVycm9yIiwiZm9ybWF0RGF0ZSIsImRhdGVJbnB1dCIsImZvcm1hdHRlciIsImRhdGVNZXRhIiwiY3JlYXRlTWFya2VyTWV0YSIsIm1hcmtlciIsImZvcmNlZFR6byIsInN0YXJ0SW5wdXQiLCJlbmRJbnB1dCIsInN0YXJ0TWV0YSIsImVuZE1ldGEiLCJmb3JjZWRTdGFydFR6byIsImZvcmNlZEVuZFR6byIsInNsaWNlRXZlbnRzIiwiYWxsRGF5Iiwic2xpY2VFdmVudFN0b3JlIiwiZmciLCJjb21wYXQiLCJfaW50ZXJvcE5hbWVzcGFjZSIsIl9fZXNNb2R1bGUiLCJjcmVhdGUiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJmcmVlemUiLCJwcmVhY3RfX25hbWVzcGFjZSIsInN0eWxlVGV4dHMiLCJzdHlsZUVscyIsImluamVjdFN0eWxlcyIsInN0eWxlVGV4dCIsInN0eWxlRWwiLCJhcHBlbmRTdHlsZXNUbyIsInJlZ2lzdGVyU3R5bGVzUm9vdCIsInJvb3ROb2RlIiwiaXNDb25uZWN0ZWQiLCJub25jZSIsInF1ZXJpZWROb25jZVZhbHVlIiwibWV0YVdpdGhOb25jZSIsImhhc0F0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsImVsV2l0aE5vbmNlIiwicXVlcnlOb25jZVZhbHVlIiwicGFyZW50RWwiLCJoZWFkIiwiaHlkcmF0ZVN0eWxlc1Jvb3QiLCJzaGVldCIsInJ1bGVDbnQiLCJjc3NSdWxlcyIsInN0eWxlU3RyIiwidHJpbSIsImluc2VydFJ1bGUiLCJyZW1vdmVFbGVtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiZWxlbWVudE1hdGNoZXMiLCJwYXJlbnRFbGVtZW50IiwibWF0Y2hlcyIsIm1hdGNoZXNTZWxlY3RvciIsIm1zTWF0Y2hlc1NlbGVjdG9yIiwiZmluZEVsZW1lbnRzIiwiY29udGFpbmVyIiwiY29udGFpbmVycyIsIkhUTUxFbGVtZW50IiwiYWxsTWF0Y2hlcyIsIlBJWEVMX1BST1BfUkUiLCJhcHBseVN0eWxlIiwidmFsIiwiZ2V0RXZlbnRUYXJnZXRWaWFSb290IiwiX2EiLCJfYiIsImNvbXBvc2VkUGF0aCIsImd1aWQkMSIsImV2ZW50VHlwZSIsImhhbmRsZXIiLCJhdHRhY2hlZEhhbmRsZXIiLCJtYXRjaGVkQ2hpbGQiLCJidWlsZERlbGVnYXRpb25IYW5kbGVyIiwidHJhbnNpdGlvbkV2ZW50TmFtZXMiLCJjcmVhdGVBcmlhQ2xpY2tBdHRycyIsImNyZWF0ZUFyaWFLZXlib2FyZEF0dHJzIiwidGFiSW5kZXgiLCJvbktleURvd24iLCJndWlkTnVtYmVyIiwicGFyc2VGaWVsZFNwZWNzIiwidG9rZW4iLCJzcGVjcyIsInRva2VucyIsImNoYXJBdCIsImZpZWxkIiwib3JkZXIiLCJjb21wYXJlQnlGaWVsZFNwZWNzIiwib2JqMCIsIm9iajEiLCJmaWVsZFNwZWNzIiwiY21wIiwiY29tcGFyZUJ5RmllbGRTcGVjIiwiZmllbGRTcGVjIiwiZmxleGlibGVDb21wYXJlIiwibG9jYWxlQ29tcGFyZSIsInBhZFN0YXJ0IiwibGVuIiwic3Vic3RyIiwiYXJncyIsImZhbGxiYWNrVGV4dCIsInN0ciIsImlzSW50IiwiY29tcHV0ZVNtYWxsZXN0Q2VsbFdpZHRoIiwiY2VsbEVsIiwiYWxsV2lkdGhFbCIsImNvbnRlbnRXaWR0aEVsIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwid2lkdGgiLCJJTlRFUk5BTF9VTklUUyIsIlBBUlNFX1JFIiwiZXhlYyIsInNpZ24iLCJ5ZWFycyIsIm1vbnRocyIsInBhcnNlSW50IiwibWlsbGlzZWNvbmRzIiwicGFyc2VTdHJpbmciLCJwYXJzZU9iamVjdCIsIm9iaiIsImhvdXJzIiwiaG91ciIsIm1pbnV0ZXMiLCJtaW51dGUiLCJzZWNvbmRzIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJtcyIsInNwZWNpZmllZFdlZWtzIiwiYXNSb3VnaERheXMiLCJkdXIiLCJhc1JvdWdoTXMiLCJwcm9wT2JqcyIsImNvbXBsZXhQcm9wc01hcCIsImRlc3QiLCJpc01heWJlT2JqZWN0c0VxdWFsIiwiY29tcGxleE9ianMiLCJmaWx0ZXJlZCIsIm5ld0hhc2giLCJIQU5ETEVSX1JFIiwiZ2V0VW5lcXVhbFByb3BzIiwiY29tcGFyZU9ianMiLCJvbGRQcm9wcyIsIm5ld1Byb3BzIiwiZXF1YWxpdHlGdW5jcyIsInZhbDAiLCJ2YWwxIiwiY29tcGFyYXRvciIsImNvbGxlY3RGcm9tSGFzaCIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsInN0ZXAiLCJhMCIsImExIiwiZXF1YWxpdHlGdW5jIiwiREFZX0lEUyIsImRhdGVUb1V0Y0FycmF5IiwiYXJyYXlUb1V0Y0RhdGUiLCJhZGRNcyIsImRpZmZEYXlzIiwibTAiLCJtMSIsImRpZmZEYXlBbmRUaW1lIiwibTBkYXkiLCJtMWRheSIsInJvdW5kIiwiZGlmZldob2xlV2Vla3MiLCJ0aW1lQXNNcyIsIndlZWtPZkdpdmVuWWVhciIsImZpcnN0V2Vla1N0YXJ0IiwiZmlyc3RXZWVrT2Zmc2V0IiwiZGF5U3RhcnQiLCJmbG9vciIsImZ3ZCIsImRhdGVUb0xvY2FsQXJyYXkiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImdldE1pbGxpc2Vjb25kcyIsImFycmF5VG9Mb2NhbERhdGUiLCJnZXRVVENIb3VycyIsImdldFVUQ01pbnV0ZXMiLCJnZXRVVENTZWNvbmRzIiwiZ2V0VVRDTWlsbGlzZWNvbmRzIiwiVVRDIiwiaXNWYWxpZERhdGUiLCJidWlsZElzb1N0cmluZyIsInRpbWVab25lT2Zmc2V0Iiwic3RyaXBaZXJvVGltZSIsImZvcm1hdFRpbWVab25lT2Zmc2V0IiwiZm9ybWF0RGF5U3RyaW5nIiwiZG9Jc28iLCJhYnMiLCJtaW5zIiwid29ya2VyRnVuYyIsInJlc0VxdWFsaXR5IiwidGVhcmRvd25GdW5jIiwiY3VycmVudEFyZ3MiLCJjdXJyZW50UmVzIiwibmV3QXJncyIsImN1cnJlbnRBcmciLCJuZXdBcmciLCJFWFRFTkRFRF9TRVRUSU5HU19BTkRfU0VWRVJJVElFUyIsInNlcGFyYXRvciIsIm9taXRaZXJvTWludXRlIiwibWVyaWRpZW0iLCJvbWl0Q29tbWFzIiwiU1RBTkRBUkRfREFURV9QUk9QX1NFVkVSSVRJRVMiLCJ0aW1lWm9uZU5hbWUiLCJlcmEiLCJNRVJJRElFTV9SRSIsIkNPTU1BX1JFIiwiTVVMVElfU1BBQ0VfUkUiLCJMVFJfUkUiLCJVVENfUkUiLCJOYXRpdmVGb3JtYXR0ZXIiLCJmb3JtYXRTZXR0aW5ncyIsInN0YW5kYXJkRGF0ZVByb3BzIiwiZXh0ZW5kZWRTZXR0aW5ncyIsInNldmVyaXR5IiwiYnVpbGRGb3JtYXR0aW5nRnVuYyIsImJldHRlckRlZmF1bHRTZXBhcmF0b3IiLCJkaWZmU2V2ZXJpdHkiLCJkMCIsImQxIiwiY2EiLCJnZXRNYXJrZXJZZWFyIiwiZ2V0TWFya2VyTW9udGgiLCJnZXRNYXJrZXJEYXkiLCJiaWdnZXN0VW5pdEZvclBhcnRpYWwiLCJmdWxsMCIsImZ1bGwxIiwicGFydGlhbEZvcm1hdHRpbmdGdW5jIiwiYmlnZ2VzdFVuaXQiLCJwYXJ0aWFsT3B0aW9ucyIsImNvbXB1dGVQYXJ0aWFsRm9ybWF0dGluZ09wdGlvbnMiLCJwYXJ0aWFsMCIsInBhcnRpYWwxIiwiaW5zZXJ0aW9uIiwiaTAiLCJmb3VuZDAiLCJiZWZvcmUwIiwiYWZ0ZXIwIiwiaTEiLCJmb3VuZDEiLCJiZWZvcmUxIiwiYWZ0ZXIxIiwiYmVmb3JlIiwiYWZ0ZXIiLCJmaW5kQ29tbW9uSW5zZXJ0aW9uIiwiZ2V0TGFyZ2VzdFVuaXQiLCJzdGFuZGFyZERhdGVQcm9wQ250IiwibnVtIiwiY29tcHV0ZVdlZWtOdW1iZXIiLCJzYW5pdGl6ZVNldHRpbmdzIiwiemVyb0Zvcm1hdCIsIm5vcm1hbEZvcm1hdCIsIkRhdGVUaW1lRm9ybWF0IiwiemVyb1Byb3BzIiwidHpvU3RyIiwicmVwbGFjZWQiLCJpbmplY3RUem9TdHIiLCJwb3N0UHJvY2VzcyIsImJ1aWxkTmF0aXZlRm9ybWF0dGluZ0Z1bmMiLCJleHBhbmRab25lZE1hcmtlciIsImRhdGVJbmZvIiwibWFya2VyVG9BcnJheSIsImNyZWF0ZVZlcmJvc2VGb3JtYXR0aW5nQXJnIiwic3RhcnRJbmZvIiwibG9jYWxlQ29kZXMiLCJDbWRGb3JtYXR0ZXIiLCJjbWRTdHIiLCJGdW5jRm9ybWF0dGVyIiwibmF2TGlua0RheUNsaWNrIiwibmF2TGlua1dlZWtDbGljayIsImJvb3RzdHJhcEZvbnRBd2Vzb21lIiwiYnV0dG9uSWNvbnMiLCJkZWZhdWx0QWxsRGF5RXZlbnREdXJhdGlvbiIsImRlZmF1bHRUaW1lZEV2ZW50RHVyYXRpb24iLCJzY3JvbGxUaW1lIiwic2Nyb2xsVGltZVJlc2V0IiwiZGF5UG9wb3ZlckZvcm1hdCIsInNsb3REdXJhdGlvbiIsInNuYXBEdXJhdGlvbiIsImZvcmNlRXZlbnREdXJhdGlvbiIsImRheUhlYWRlcnMiLCJkYXlIZWFkZXJGb3JtYXQiLCJkYXlIZWFkZXJDbGFzc05hbWVzIiwiZGF5SGVhZGVyQ29udGVudCIsImRheUhlYWRlckRpZE1vdW50IiwiZGF5SGVhZGVyV2lsbFVubW91bnQiLCJkYXlDZWxsQ2xhc3NOYW1lcyIsImRheUNlbGxDb250ZW50IiwiZGF5Q2VsbERpZE1vdW50IiwiZGF5Q2VsbFdpbGxVbm1vdW50Iiwid2Vla051bWJlcnMiLCJ3ZWVrTnVtYmVyQ2xhc3NOYW1lcyIsIndlZWtOdW1iZXJDb250ZW50Iiwid2Vla051bWJlckRpZE1vdW50Iiwid2Vla051bWJlcldpbGxVbm1vdW50Iiwidmlld0NsYXNzTmFtZXMiLCJ2aWV3RGlkTW91bnQiLCJ2aWV3V2lsbFVubW91bnQiLCJub3dJbmRpY2F0b3IiLCJub3dJbmRpY2F0b3JDbGFzc05hbWVzIiwibm93SW5kaWNhdG9yQ29udGVudCIsIm5vd0luZGljYXRvckRpZE1vdW50Iiwibm93SW5kaWNhdG9yV2lsbFVubW91bnQiLCJkcmFnUmV2ZXJ0RHVyYXRpb24iLCJkcmFnU2Nyb2xsIiwiYWxsRGF5TWFpbnRhaW5EdXJhdGlvbiIsInVuc2VsZWN0QXV0byIsImRyb3BBY2NlcHQiLCJldmVudE9yZGVyIiwiZXZlbnRPcmRlclN0cmljdCIsImxvbmdQcmVzc0RlbGF5IiwiZXZlbnREcmFnTWluRGlzdGFuY2UiLCJleHBhbmRSb3dzIiwid2Vla051bWJlckZvcm1hdCIsImV2ZW50UmVzaXphYmxlRnJvbVN0YXJ0IiwiZGlzcGxheUV2ZW50VGltZSIsImRpc3BsYXlFdmVudEVuZCIsImluaXRpYWxEYXRlIiwiZXZlbnREYXRhVHJhbnNmb3JtIiwic3RpY2t5SGVhZGVyRGF0ZXMiLCJzdGlja3lGb290ZXJTY3JvbGxiYXIiLCJkZWZhdWx0QWxsRGF5IiwiZXZlbnRDbGFzc05hbWVzIiwiZXZlbnRDb250ZW50IiwiZXZlbnREaWRNb3VudCIsImV2ZW50V2lsbFVubW91bnQiLCJkcm9wcGFibGUiLCJ1bnNlbGVjdENhbmNlbCIsInNsb3RMYWJlbEZvcm1hdCIsInNsb3RMYW5lQ2xhc3NOYW1lcyIsInNsb3RMYW5lQ29udGVudCIsInNsb3RMYW5lRGlkTW91bnQiLCJzbG90TGFuZVdpbGxVbm1vdW50Iiwic2xvdExhYmVsQ2xhc3NOYW1lcyIsInNsb3RMYWJlbENvbnRlbnQiLCJzbG90TGFiZWxEaWRNb3VudCIsInNsb3RMYWJlbFdpbGxVbm1vdW50IiwiZGF5TWF4RXZlbnRzIiwiZGF5TWF4RXZlbnRSb3dzIiwiZGF5TWluV2lkdGgiLCJzbG90TGFiZWxJbnRlcnZhbCIsImFsbERheUNsYXNzTmFtZXMiLCJhbGxEYXlDb250ZW50IiwiYWxsRGF5RGlkTW91bnQiLCJhbGxEYXlXaWxsVW5tb3VudCIsInNsb3RNaW5XaWR0aCIsIm5hdkxpbmtzIiwiZXZlbnRUaW1lRm9ybWF0Iiwic2VsZWN0TWluRGlzdGFuY2UiLCJzZWxlY3RMb25nUHJlc3NEZWxheSIsImV2ZW50TG9uZ1ByZXNzRGVsYXkiLCJzZWxlY3RNaXJyb3IiLCJldmVudE1heFN0YWNrIiwiZXZlbnRNaW5IZWlnaHQiLCJldmVudE1pbldpZHRoIiwiZXZlbnRTaG9ydEhlaWdodCIsInNsb3RFdmVudE92ZXJsYXAiLCJldmVudEludGVyYWN0aXZlIiwibW9yZUxpbmtDbGljayIsIm1vcmVMaW5rQ2xhc3NOYW1lcyIsIm1vcmVMaW5rQ29udGVudCIsIm1vcmVMaW5rRGlkTW91bnQiLCJtb3JlTGlua1dpbGxVbm1vdW50IiwibW9udGhTdGFydEZvcm1hdCIsImhhbmRsZUN1c3RvbVJlbmRlcmluZyIsImN1c3RvbVJlbmRlcmluZ01ldGFNYXAiLCJjdXN0b21SZW5kZXJpbmdSZXBsYWNlc0VsIiwiZGF0ZXNTZXQiLCJldmVudHNTZXQiLCJldmVudEFkZCIsImV2ZW50Q2hhbmdlIiwiZXZlbnRSZW1vdmUiLCJ3aW5kb3dSZXNpemUiLCJldmVudENsaWNrIiwiZXZlbnRNb3VzZUVudGVyIiwiZXZlbnRNb3VzZUxlYXZlIiwic2VsZWN0IiwidW5zZWxlY3QiLCJsb2FkaW5nIiwiX3VubW91bnQiLCJfYmVmb3JlcHJpbnQiLCJfYWZ0ZXJwcmludCIsIl9ub0V2ZW50RHJvcCIsIl9ub0V2ZW50UmVzaXplIiwiX3Jlc2l6ZSIsIl9zY3JvbGxSZXF1ZXN0IiwiaXNNYXliZUFycmF5c0VxdWFsIiwicmVmaW5lUHJvcHMiLCJjcmVhdGVFdmVudEluc3RhbmNlIiwiaW5zdGFuY2VJZCIsImV4cGFuZFJlY3VycmluZyIsImluc3RhbmNlcyIsInJlY3VycmluZ0RlZiIsInN0YXJ0cyIsImV4cGFuZFJlY3VycmluZ1JhbmdlcyIsImV2ZW50RGVmIiwibWFya2VycyIsInR5cGVJZCIsInN1YnRyYWN0IiwicGFyc2VFdmVudHMiLCJhbGxvd09wZW5SYW5nZSIsImRlZklkTWFwIiwiaW5zdGFuY2VJZE1hcCIsImJ1aWxkRXZlbnRSZWZpbmVycyIsInJhd0V2ZW50IiwidHVwbGUiLCJwYXJzZUV2ZW50IiwiZXZlbnRUdXBsZVRvU3RvcmUiLCJnZXRSZWxldmFudEV2ZW50cyIsIm5ld1N0b3JlIiwiZmlsdGVyRXZlbnRTdG9yZURlZnMiLCJsb29rRGVmIiwiaXNFdmVudERlZnNHcm91cGVkIiwiZGVmMCIsImRlZjEiLCJtZXJnZUV2ZW50U3RvcmVzIiwic3RvcmUwIiwic3RvcmUxIiwiZmlsdGVyRnVuYyIsInBhcnNlQ2xhc3NOYW1lcyIsIkVWRU5UX1VJX1JFRklORVJTIiwiRU1QVFlfRVZFTlRfVUkiLCJjb25zdHJhaW50cyIsImFsbG93cyIsIm5vcm1hbGl6ZUNvbnN0cmFpbnQiLCJjb21iaW5lRXZlbnRVaXMiLCJ1aXMiLCJjb21iaW5lVHdvRXZlbnRVaXMiLCJpdGVtMCIsIml0ZW0xIiwiRVZFTlRfTk9OX0RBVEVfUkVGSU5FUlMiLCJpbnRlcmFjdGl2ZSIsIkVWRU5UX0RBVEVfUkVGSU5FUlMiLCJFVkVOVF9SRUZJTkVSUyIsImV4dGVuZGVkUHJvcHMiLCJyZWZpbmVFdmVudERlZiIsImNvbXB1dGVJc0RlZmF1bHRBbGxEYXkiLCJyZWN1cnJpbmdSZXMiLCJwYXJzZWQiLCJwYXJzZVJlY3VycmluZyIsInBhcnNlRXZlbnREZWYiLCJzaW5nbGVSZXMiLCJzdGFydE1hcmtlciIsImhhc0VuZCIsImlzVGltZVVuc3BlY2lmaWVkIiwicGFyc2VTaW5nbGUiLCJwdWJsaWNJZCIsIm1lbWJlckFkZGVyIiwiREVGX0RFRkFVTFRTIiwiY29tcHV0ZUFsaWduZWREYXlSYW5nZSIsInRpbWVkUmFuZ2UiLCJkYXlDbnQiLCJjb21wdXRlVmlzaWJsZURheVJhbmdlIiwic3RhcnREYXkiLCJlbmREYXkiLCJlbmRUaW1lTVMiLCJkaWZmRGF0ZXMiLCJsYXJnZVVuaXQiLCJkaWZmV2hvbGVZZWFycyIsImRpZmZXaG9sZU1vbnRocyIsImludGVyc2VjdFJlY3RzIiwicmVjdDEiLCJyZWN0MiIsIm1pbiIsInRvcCIsImJvdHRvbSIsImNhblZHcm93V2l0aGluQ2VsbCIsImdldENhblZHcm93V2l0aGluQ2VsbCIsInBvc2l0aW9uIiwiYm9keSIsInBvc3NpYmxlIiwib2Zmc2V0SGVpZ2h0IiwiY29tcHV0ZUNhblZHcm93V2l0aGluQ2VsbCIsIkVNUFRZX0VWRU5UX1NUT1JFIiwiYnVpbGRFdmVudFVpRm9yS2V5IiwiYWxsVWkiLCJldmVudFVpRm9yS2V5IiwiaW5kaXZpZHVhbFVpIiwiYmFzZVBhcnRzIiwic3R1ZmYiLCJpbnZlcnRSYW5nZXMiLCJyYW5nZXMiLCJjb25zdHJhaW50UmFuZ2UiLCJkYXRlUmFuZ2UiLCJpbnZlcnRlZFJhbmdlcyIsImNvbXBhcmVSYW5nZXMiLCJyYW5nZTAiLCJyYW5nZTEiLCJuZXdSYW5nZSIsInJhbmdlc0VxdWFsIiwicmFuZ2VzSW50ZXJzZWN0IiwicmFuZ2VDb250YWluc1JhbmdlIiwib3V0ZXJSYW5nZSIsImlubmVyUmFuZ2UiLCJnZXREYXRlTWV0YSIsInRvZGF5UmFuZ2UiLCJub3dEYXRlIiwiaXNPdGhlciIsImlzVG9kYXkiLCJpc1Bhc3QiLCJpc0Z1dHVyZSIsImdldERheUNsYXNzTmFtZXMiLCJEQVlfRk9STUFUIiwiV0VFS19GT1JNQVQiLCJidWlsZE5hdkxpbmtBdHRycyIsImlzVGFiYmFibGUiLCJ6b25lZERhdGUiLCJoYW5kbGVJbnRlcmFjdGlvbiIsImN1c3RvbUFjdGlvbiIsInpvb21UbyIsIl9zY3JvbGxiYXJXaWR0aHMiLCJfaXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJnZXRJc1J0bFNjcm9sbGJhck9uTGVmdCIsIm91dGVyRWwiLCJib3JkZXIiLCJwYWRkaW5nIiwib3ZlcmZsb3ciLCJjb21wdXRlSXNSdGxTY3JvbGxiYXJPbkxlZnQiLCJnZXRTY3JvbGxiYXJXaWR0aHMiLCJjb21wdXRlU2Nyb2xsYmFyV2lkdGhzRm9yRWwiLCJjb21wdXRlU2Nyb2xsYmFyV2lkdGhzIiwiY2xpZW50SGVpZ2h0IiwiY2xpZW50V2lkdGgiLCJjb21wdXRlRWRnZXMiLCJnZXRQYWRkaW5nIiwiY29tcHV0ZWRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJib3JkZXJMZWZ0IiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHQiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyVG9wIiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b20iLCJib3JkZXJCb3R0b21XaWR0aCIsImJhZFNjcm9sbGJhcldpZHRocyIsInNjcm9sbGJhckxlZnRSaWdodCIsInNjcm9sbGJhckJvdHRvbSIsInNjcm9sbGJhckxlZnQiLCJzY3JvbGxiYXJSaWdodCIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ1RvcCIsImNvbXB1dGVSZWN0IiwicmVjdCIsInBhZ2VYT2Zmc2V0IiwicGFnZVlPZmZzZXQiLCJnZXRDbGlwcGluZ1BhcmVudHMiLCJwYXJlbnRzIiwib3ZlcmZsb3dZIiwib3ZlcmZsb3dYIiwiaGFuZGxlcnMiLCJ0aGlzQ29udGV4dCIsImFkZFRvSGFzaCIsIm9mZiIsInJlbW92ZUZyb21IYXNoIiwiYXR0YWNoZWRIYW5kbGVycyIsIm9wdGlvbkhhbmRsZXIiLCJzaW1pbGFyTnVtQXJyYXlzIiwiU2Nyb2xsQ29udHJvbGxlciIsImdldE1heFNjcm9sbFRvcCIsImdldFNjcm9sbEhlaWdodCIsImdldENsaWVudEhlaWdodCIsImdldE1heFNjcm9sbExlZnQiLCJnZXRTY3JvbGxXaWR0aCIsImdldENsaWVudFdpZHRoIiwiY2FuU2Nyb2xsVmVydGljYWxseSIsImNhblNjcm9sbEhvcml6b250YWxseSIsImNhblNjcm9sbFVwIiwiZ2V0U2Nyb2xsVG9wIiwiY2FuU2Nyb2xsRG93biIsImNhblNjcm9sbExlZnQiLCJnZXRTY3JvbGxMZWZ0IiwiY2FuU2Nyb2xsUmlnaHQiLCJzZXRJY29uT3ZlcnJpZGUiLCJpY29uT3ZlcnJpZGVIYXNoIiwiaWNvbkNsYXNzZXNDb3B5IiwiYXBwbHlJY29uT3ZlcnJpZGVQcmVmaXgiLCJwcmVmaXgiLCJGYWtlQ29tcG9uZW50IiwiQ29udGV4dFR5cGUiLCJvcmlnUHJvdmlkZXIiLCJpc05ldyIsInN1YnMiLCJfcHJvcHMiLCJvbGQiLCJTY3JvbGxSZXNwb25kZXIiLCJleGVjRnVuYyIsImhhbmRsZVNjcm9sbFJlcXVlc3QiLCJxdWV1ZWRSZXF1ZXN0IiwiZmlyZUluaXRpYWxTY3JvbGwiLCJkZXRhY2giLCJ1cGRhdGUiLCJpc0RhdGVzTmV3IiwidGltZSIsIm5leHRQcm9wcyIsIm5leHRTdGF0ZSIsImRlYnVnIiwicHJvcEVxdWFsaXR5Iiwic3RhdGVFcXVhbGl0eSIsInNhZmVTZXRTdGF0ZSIsImFkZFByb3BzRXF1YWxpdHkiLCJhZGRTdGF0ZUVxdWFsaXR5IiwiRGF0ZUNvbXBvbmVudCIsInByZXBhcmVIaXRzIiwicXVlcnlIaXQiLCJwb3NpdGlvbkxlZnQiLCJwb3NpdGlvblRvcCIsImVsV2lkdGgiLCJlbEhlaWdodCIsImlzVmFsaWREYXRlRG93bkVsIiwiY3JlYXRlTm93TWFya2VyIiwidHJpZ2dlckRhdGVTZWxlY3QiLCJwZXYiLCJidWlsZERhdGVTcGFuQXBpV2l0aENvbnRleHQiLCJvcmlnRXZlbnQiLCJkYXRlU3BhbiIsInNwYW4iLCJidWlsZFJhbmdlQXBpIiwiZ2V0RGVmYXVsdEV2ZW50RW5kIiwiYXBwbHlNdXRhdGlvblRvRXZlbnRTdG9yZSIsImV2ZW50Q29uZmlnQmFzZSIsIm11dGF0aW9uIiwiZXZlbnRDb25maWdzIiwiY29tcGlsZUV2ZW50VWlzIiwiYXBwbHlNdXRhdGlvblRvRXZlbnREZWYiLCJhcHBseU11dGF0aW9uVG9FdmVudEluc3RhbmNlIiwiZXZlbnRDb25maWciLCJzdGFuZGFyZFByb3BzIiwic3RhcnREZWx0YSIsImVuZERlbHRhIiwiYXBwbGllciIsImV2ZW50SW5zdGFuY2UiLCJmb3JjZUFsbERheSIsImNsZWFyRW5kIiwiZGF0ZXNEZWx0YSIsIkV2ZW50U291cmNlSW1wbCIsImludGVybmFsRXZlbnRTb3VyY2UiLCJyZWZldGNoIiwiX2NvbnRleHQiLCJfZGVmIiwiX2luc3RhbmNlIiwibXV0YXRlIiwic2V0RXh0ZW5kZWRQcm9wIiwic2V0U3RhcnQiLCJncmFudWxhcml0eSIsIm1haW50YWluRHVyYXRpb24iLCJzZXRFbmQiLCJzZXREYXRlcyIsImluc3RhbmNlUmFuZ2UiLCJtb3ZlU3RhcnQiLCJkZWx0YUlucHV0IiwiZGVsdGEiLCJtb3ZlRW5kIiwibW92ZURhdGVzIiwic2V0QWxsRGF5IiwiZm9ybWF0SW5wdXQiLCJyZWxldmFudEV2ZW50cyIsIm9sZEV2ZW50IiwicmVsYXRlZEV2ZW50cyIsInJldmVydCIsImFzU3RvcmUiLCJldmVudEFwaVRvU3RvcmUiLCJvbWl0VGltZSIsInRvUGxhaW5PYmplY3QiLCJjb2xsYXBzZUNvbG9yIiwiY29sbGFwc2VFeHRlbmRlZFByb3BzIiwidG9KU09OIiwiZXZlbnRBcGkiLCJleGNsdWRlSW5zdGFuY2UiLCJldmVudEFwaXMiLCJleGNsdWRlSW5zdGFuY2VJZCIsImludmVyc2VCZ0J5R3JvdXBJZCIsImludmVyc2VCZ0J5RGVmSWQiLCJkZWZCeUdyb3VwSWQiLCJiZ1JhbmdlcyIsImZnUmFuZ2VzIiwiZXZlbnRVaXMiLCJvcmlnUmFuZ2UiLCJub3JtYWxSYW5nZSIsInNsaWNlZFJhbmdlIiwiaXNTdGFydCIsImlzRW5kIiwiaW52ZXJ0ZWRSYW5nZSIsImJnIiwic2V0RWxTZWciLCJmY1NlZyIsImNvbXBpbGVFdmVudFVpIiwiYnVpbGRTZWdDb21wYXJlT2JqIiwiX3NlZyIsImNvbXB1dGVTZWdEcmFnZ2FibGUiLCJjb21wdXRlU2VnU3RhcnRSZXNpemFibGUiLCJjb21wdXRlU2VnRW5kUmVzaXphYmxlIiwiYnVpbGRTZWdUaW1lVGV4dCIsInRpbWVGb3JtYXQiLCJkZWZhdWx0RGlzcGxheUV2ZW50VGltZSIsImRlZmF1bHREaXNwbGF5RXZlbnRFbmQiLCJzdGFydE92ZXJyaWRlIiwiZW5kT3ZlcnJpZGUiLCJ3aG9sZUV2ZW50U3RhcnQiLCJ3aG9sZUV2ZW50RW5kIiwic2VnU3RhcnQiLCJzZWdFbmQiLCJpc1N0YXJ0RGF5IiwiaXNFbmREYXkiLCJnZXRFdmVudENsYXNzTmFtZXMiLCJpc01pcnJvciIsImlzRHJhZ2dhYmxlIiwiaXNTdGFydFJlc2l6YWJsZSIsImlzRW5kUmVzaXphYmxlIiwiaXNEcmFnZ2luZyIsImlzUmVzaXppbmciLCJpc1NlbGVjdGVkIiwiZ2V0U2VnQW5jaG9yQXR0cnMiLCJTVEFOREFSRF9QUk9QUyIsImNhbGVuZGFyU3lzdGVtQ2xhc3NNYXAiLCJ0aGVDbGFzcyIsImFycmF5VG9NYXJrZXIiLCJhcnIiLCJJU09fUkUiLCJnZXRFbnRyeVNwYW5FbmQiLCJlbnRyeSIsImJ1aWxkRW50cnlLZXkiLCJpbnRlcnNlY3RTcGFucyIsInNwYW4wIiwic3BhbjEiLCJpbnNlcnRBdCIsIml0ZW0iLCJiaW5hcnlTZWFyY2giLCJzZWFyY2hWYWwiLCJnZXRJdGVtVmFsIiwibWlkZGxlSW5kZXgiLCJtaWRkbGVWYWwiLCJEUkFHX01FVEFfUkVGSU5FUlMiLCJjb21wdXRlRmFsbGJhY2tIZWFkZXJGb3JtYXQiLCJkYXRlc1JlcERpc3RpbmN0RGF5cyIsIkNMQVNTX05BTUUiLCJyZW5kZXJJbm5lciQxIiwiQ29udGVudEluamVjdG9yIiwicXVldWVkRG9tTm9kZXMiLCJjdXJyZW50RG9tTm9kZXMiLCJkZWZhdWx0R2VuZXJhdG9yIiwiYXR0cnMiLCJidWlsZEVsQXR0cnMiLCJpbm5lckNvbnRlbnQiLCJjdXJyZW50R2VuZXJhdG9yTWV0YSIsInVzZURlZmF1bHQiLCJjdXN0b21HZW5lcmF0b3JSZXMiLCJpc09iamVjdCIsImh0bWwiLCJkb21Ob2RlcyIsImhhc0N1c3RvbVJlbmRlcmluZ0hhbmRsZXIiLCJhcHBseVF1ZXVldWREb21Ob2RlcyIsInRyaWdnZXJDdXN0b21SZW5kZXJpbmciLCJpc0FjdGl2ZSIsImdlbmVyYXRvck1ldGEiLCJjb250YWluZXJFbCIsInJlcG9ydE5ld0NvbnRhaW5lckVsIiwiaXNUcnV0aHkiLCJuZXdOb2RlIiwiZXh0cmFDbGFzc05hbWVzIiwiZWxBdHRycyIsImVsU3R5bGUiLCJJbm5lckNvbnRlbnQiLCJJbm5lckNvbnRlbnRJbmplY3RvciIsImhhbmRsZVJvb3RFbCIsInJvb3RFbCIsImdlbmVyYXRlZENsYXNzTmFtZXMiLCJnZW5lcmF0ZUNsYXNzTmFtZXMiLCJyZW5kZXJJZCIsImNvbnRhaW5lckNvbXBvbmVudCIsInBhcmVudFByb3BzIiwiVGFibGVEYXRlQ2VsbCIsImRheU1ldGEiLCJuYXZMaW5rQXR0cnMiLCJjb2xDbnQiLCJleHRyYVJlbmRlclByb3BzIiwicm9sZSIsImNvbFNwYW4iLCJleHRyYURhdGFBdHRycyIsIklubmVyQ29udGFpbmVyIiwiaXNTdGlja3kiLCJXRUVLREFZX0ZPUk1BVCIsIlRhYmxlRG93Q2VsbCIsIk5vd1RpbWVyIiwiaW5pdGlhbE5vd0RhdGUiLCJpbml0aWFsTm93UXVlcmllZE1zIiwiY29tcHV0ZVRpbWluZyIsImN1cnJlbnRTdGF0ZSIsInVucm91bmRlZE5vdyIsImN1cnJlbnRVbml0U3RhcnQiLCJzdGFydE9mIiwibmV4dFVuaXRTdGFydCIsIndhaXRNcyIsImJ1aWxkRGF5UmFuZ2UiLCJ0aW1lb3V0SWQiLCJjcmVhdGVEYXlIZWFkZXJGb3JtYXR0ZXIiLCJleHBsaWNpdEZvcm1hdCIsImRhdGVDbnQiLCJjb21wdXRlQWN0aXZlUmFuZ2UiLCJpc0NvbXBvbmVudEFsbERheSIsInRyYW5zZm9ybVJhd0V2ZW50cyIsImNhbEVhY2hUcmFuc2Zvcm0iLCJzb3VyY2VFYWNoVHJhbnNmb3JtIiwidHJhbnNmb3JtRWFjaFJhd0V2ZW50IiwicmVmaW5lZEV2ZW50cyIsInJlZmluZWRFdmVudCIsImV4Y2x1ZGVFdmVudHNCeVNvdXJjZUlkIiwiaXNOZXdQcm9wc1ZhbGlkIiwiY2FsZW5kYXJTdGF0ZSIsImRhdGVTcGFuTWV0YSIsImZpbHRlckNvbmZpZyIsInN1YmplY3RFdmVudFN0b3JlIiwic3ViamVjdERlZnMiLCJzdWJqZWN0SW5zdGFuY2VzIiwic3ViamVjdENvbmZpZ3MiLCJvdGhlckV2ZW50U3RvcmUiLCJyZW1vdmFscyIsIm90aGVyRGVmcyIsIm90aGVySW5zdGFuY2VzIiwib3RoZXJDb25maWdzIiwic3ViamVjdEluc3RhbmNlSWQiLCJzdWJqZWN0SW5zdGFuY2UiLCJzdWJqZWN0UmFuZ2UiLCJzdWJqZWN0Q29uZmlnIiwic3ViamVjdERlZiIsImFsbENvbnN0cmFpbnRzUGFzcyIsImV2ZW50T3ZlcmxhcEZ1bmMiLCJvdGhlckluc3RhbmNlSWQiLCJvdGhlckluc3RhbmNlIiwiY2FsZW5kYXJFdmVudFN0b3JlIiwic3ViamVjdEFsbG93Iiwic3ViamVjdERhdGVTcGFuIiwib3JpZ0RlZiIsIm9yaWdJbnN0YW5jZSIsImlzSW50ZXJhY3Rpb25Qcm9wc1ZhbGlkIiwicmVsZXZhbnRFdmVudFN0b3JlIiwicmVsZXZhbnREZWZzIiwicmVsZXZhbnRJbnN0YW5jZXMiLCJzZWxlY3Rpb25SYW5nZSIsInNlbGVjdE92ZXJsYXBGdW5jIiwicmVsZXZhbnRJbnN0YW5jZUlkIiwicmVsZXZhbnRJbnN0YW5jZSIsInNlbGVjdGlvbkFsbG93IiwiaXNEYXRlU2VsZWN0aW9uUHJvcHNWYWxpZCIsImJ1c2luZXNzSG91cnNVbmV4cGFuZGVkIiwiYW55UmFuZ2VzQ29udGFpblJhbmdlIiwiY29uc3RyYWludFRvUmFuZ2VzIiwiZXZlbnRTdG9yZVRvUmFuZ2VzIiwib3V0ZXJSYW5nZXMiLCJWSVNJQkxFX0hJRERFTl9SRSIsIlNjcm9sbGVyIiwibGlxdWlkSXNBYnNvbHV0ZSIsImlzQWJzb2x1dGUiLCJvdmVyY29tZUxlZnQiLCJvdmVyY29tZVJpZ2h0Iiwib3ZlcmNvbWVCb3R0b20iLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXhIZWlnaHQiLCJuZWVkc1hTY3JvbGxpbmciLCJyZWFsQ2xpZW50V2lkdGgiLCJnZXRZU2Nyb2xsYmFyV2lkdGgiLCJuZWVkc1lTY3JvbGxpbmciLCJyZWFsQ2xpZW50SGVpZ2h0IiwiZ2V0WFNjcm9sbGJhcldpZHRoIiwiUmVmTWFwIiwibWFzdGVyQ2FsbGJhY2siLCJjdXJyZW50TWFwIiwiZGVwdGhzIiwiY2FsbGJhY2tNYXAiLCJoYW5kbGVWYWx1ZSIsInJlbW92ZWQiLCJhZGRlZCIsInJlZkNhbGxiYWNrIiwiY29sbGVjdCIsImdldEFsbCIsImNvbXB1dGVTaHJpbmtXaWR0aCIsImNodW5rRWxzIiwic2hyaW5rQ2VsbHMiLCJsYXJnZXN0V2lkdGgiLCJzaHJpbmtDZWxsIiwiY2VpbCIsImdldFNlY3Rpb25IYXNMaXF1aWRIZWlnaHQiLCJzZWN0aW9uQ29uZmlnIiwiZ2V0QWxsb3dZU2Nyb2xsaW5nIiwicmVuZGVyQ2h1bmtDb250ZW50IiwiY2h1bmtDb25maWciLCJpc0hlYWRlciIsInRhYmxlQ2xhc3NOYW1lIiwic3luY1Jvd0hlaWdodHMiLCJtaW5XaWR0aCIsInRhYmxlTWluV2lkdGgiLCJ0YWJsZUNvbEdyb3VwTm9kZSIsInJvd0NvbnRlbnQiLCJpc0NvbFByb3BzRXF1YWwiLCJjb2xzMCIsImNvbHMxIiwicmVuZGVyTWljcm9Db2xHcm91cCIsImNvbHMiLCJzaHJpbmtXaWR0aCIsImNvbE5vZGVzIiwiY29sUHJvcHMiLCJzYW5pdGl6ZVNocmlua1dpZHRoIiwiaGFzU2hyaW5rV2lkdGgiLCJjb2wiLCJnZXRTY3JvbGxHcmlkQ2xhc3NOYW1lcyIsImdldFNlY3Rpb25DbGFzc05hbWVzIiwid2hvbGVUYWJsZVZHcm93IiwiU2ltcGxlU2Nyb2xsR3JpZCIsInByb2Nlc3NDb2xzIiwic2Nyb2xsZXJSZWZzIiwic2Nyb2xsZXJFbFJlZnMiLCJfaGFuZGxlU2Nyb2xsZXJFbCIsImZvcmNlWVNjcm9sbGJhcnMiLCJzY3JvbGxlckNsaWVudFdpZHRocyIsInNjcm9sbGVyQ2xpZW50SGVpZ2h0cyIsImhhbmRsZVNpemluZyIsImNvbXB1dGVTY3JvbGxlckRpbXMiLCJzZWN0aW9uQ29uZmlncyIsInNlY3Rpb25zIiwibWljcm9Db2xHcm91cE5vZGUiLCJjb2xsYXBzaWJsZVdpZHRoIiwiY3VycmVudENvbmZpZyIsImNvbmZpZ0NudCIsImNvbmZpZ0kiLCJoZWFkU2VjdGlvbk5vZGVzIiwiYm9keVNlY3Rpb25Ob2RlcyIsImZvb3RTZWN0aW9uTm9kZXMiLCJpc0J1Z2d5Iiwicm9sZUF0dHJzIiwib3V0ZXJDb250ZW50IiwicmVuZGVyQ2h1bmtUZCIsImNodW5rIiwiaXNMaXF1aWQiLCJzZWN0aW9uS2V5Iiwicm93U3luY0hlaWdodHMiLCJyZXBvcnRSb3dIZWlnaHRDaGFuZ2UiLCJzY3JvbGxlckVsIiwic2VjdGlvbiIsImdldFNlY3Rpb25CeUtleSIsInNjcm9sbGVyRWxSZWYiLCJzY3JvbGxiYXJXaWR0aCIsInNjcm9sbGVyIiwiaGFybmVzc0VsIiwiRXZlbnRDb250YWluZXIiLCJ0aW1lVGV4dCIsImRpc2FibGVEcmFnZ2luZyIsImRpc2FibGVSZXNpemluZyIsImlzRGF0ZVNlbGVjdGluZyIsInJlbmRlcklubmVyQ29udGVudCQxIiwiaW5uZXJQcm9wcyIsIkRBWV9OVU1fRk9STUFUIiwiRGF5Q2VsbENvbnRhaW5lciIsInJlZmluZVJlbmRlclByb3BzIiwiaXNNb250aFN0YXJ0Iiwic2hvd0RheU51bWJlciIsImhhc0N1c3RvbURheUNlbGxDb250ZW50IiwiZGF5TnVtYmVyVGV4dCIsInJlbmRlcklubmVyQ29udGVudCIsInJlbmRlcklubmVyIiwiUG9wb3ZlciIsImhhbmRsZURvY3VtZW50TW91c2VEb3duIiwiaGFuZGxlQ2xvc2VDbGljayIsImhhbmRsZURvY3VtZW50S2V5RG93biIsIm9uQ2xvc2UiLCJleHRyYUF0dHJzIiwiYWxpZ25tZW50RWwiLCJhbGlnbkdyaWRUb3AiLCJhbGlnbm1lbnRSZWN0IiwiY2xpcHBpbmdQYXJlbnRzIiwiY2xpcHBpbmdQYXJlbnQiLCJpbnRlcnNlY3Rpb24iLCJjb21wdXRlQ2xpcHBlZENsaWVudFJlY3QiLCJwb3BvdmVyRGltcyIsInBvcG92ZXJUb3AiLCJwb3BvdmVyTGVmdCIsIm9yaWdpbiIsIm9mZnNldFBhcmVudCIsIk1vcmVQb3BvdmVyIiwidXNlRXZlbnRDZW50ZXIiLCJzdGFydERhdGUiLCJmb3JjZVRpbWVkIiwiZW5kRGF0ZSIsImV4dHJhRGF0ZVNwYW4iLCJkYXlFbCIsImxheWVyIiwicmVuZGVyTW9yZUxpbmtJbm5lciIsImNvbXB1dGVSYW5nZSIsImFsbERheURhdGUiLCJoaWRkZW5TZWdzIiwiY29tcHV0ZUVhcmxpZXN0U2VnU3RhcnQiLCJzZWdzIiwicGlja0xhdGVzdEVuZCIsInBpY2tFYXJsaWVzdFN0YXJ0Iiwic2VnMCIsInNlZzEiLCJFVkVOVF9TT1VSQ0VfUkVGSU5FUlMiLCJyYXdPYmoiLCJtZXRhUmVzIiwiYnVpbGRFdmVudFNvdXJjZU1ldGEiLCJTdG9yZSIsImN1cnJlbnRWYWx1ZSIsInN1YnNjcmliZSIsIkJnRXZlbnQiLCJnZXRBdmFpbGFibGVMb2NhbGVDb2RlcyIsImhhbmRsZXJOYW1lIiwiZGF0ZU9yUmFuZ2UiLCJzcGVjIiwiZ2V0VW5pdFZpZXdTcGVjIiwidmlld1R5cGVzIiwiYWRkWWVhcnMiLCJnb3RvRGF0ZSIsInpvbmVkRGF0ZUlucHV0IiwiaW5jcmVtZW50RGF0ZSIsImRhdGVPck9iaiIsInNlbGVjdGlvbklucHV0IiwiZGVmYXVsdER1cmF0aW9uIiwicGFyc2VPcGVuRGF0ZVNwYW4iLCJwYXJzZURhdGVTcGFuIiwidHJpZ2dlckRhdGVVbnNlbGVjdCIsImV2ZW50SW5wdXQiLCJzb3VyY2VJbnB1dCIsInRyaWdnZXJFdmVudEFkZCIsInNvdXJjZUFwaSIsImdldEV2ZW50U291cmNlQnlJZCIsIm5ld0V2ZW50QXBpIiwicmVtb3ZlQWxsRXZlbnRzIiwiZ2V0RXZlbnRTb3VyY2VzIiwic291cmNlQXBpcyIsImludGVybmFsSWQiLCJyZW1vdmVBbGxFdmVudFNvdXJjZXMiLCJyZWZldGNoRXZlbnRzIiwic2Nyb2xsVG9UaW1lIiwidGltZUlucHV0IiwiaGFuZGxlQmVmb3JlUHJpbnQiLCJoYW5kbGVBZnRlclByaW50IiwiQ3VzdG9tUmVuZGVyaW5nU3RvcmUiLCJoYW5kbGUiLCJjdXN0b21SZW5kZXJpbmciLCJpc05hbWVkVGltZVpvbmUiLCJjYW5Db21wdXRlT2Zmc2V0IiwiY3JlYXRlQ2FsZW5kYXJTeXN0ZW0iLCJ3ZWVrRG93Iiwid2Vla0RveSIsIndlZWtOdW1iZXJGdW5jIiwidGltZXN0YW1wVG9NYXJrZXIiLCJnZXRZZWFyIiwiZ2V0RGF5IiwiYWRkTW9udGhzIiwiZ3JlYXRlc3RXaG9sZVVuaXQiLCJkaWZmSG91cnMiLCJkaWZmTWludXRlcyIsImRpZmZTZWNvbmRzIiwiY291bnREdXJhdGlvbnNCZXR3ZWVuIiwiZGlmZiIsInN0YXJ0T2ZZZWFyIiwic3RhcnRPZk1vbnRoIiwic3RhcnRPZldlZWsiLCJzdGFydE9mSG91ciIsInN0YXJ0T2ZNaW51dGUiLCJzdGFydE9mU2Vjb25kIiwibmV4dFciLCJ3ZWVrT2ZZZWFyIiwiZGF0ZU9wdGlvbnMiLCJvZmZzZXRGb3JNYXJrZXIiLCJleHRyYU9wdGlvbnMiLCJvbWl0VGltZVpvbmVPZmZzZXQiLCJ0aW1lc3RhbXBUb0FycmF5IiwiZ2V0VGltZXpvbmVPZmZzZXQiLCJvZmZzZXRGb3JBcnJheSIsImluaXRIaWRkZW5EYXlzIiwiZm9yY2VUb1ZhbGlkIiwicHJldkRhdGUiLCJuZXh0RGF0ZSIsImN1cnJlbnRJbmZvIiwicmVuZGVyUmFuZ2UiLCJidWlsZFZhbGlkUmFuZ2UiLCJ0cmltSGlkZGVuRGF5cyIsImJ1aWxkQ3VycmVudFJhbmdlSW5mbyIsImJ1aWxkUmVuZGVyUmFuZ2UiLCJhZGp1c3RBY3RpdmVSYW5nZSIsImJ1aWxkRGF0ZUluY3JlbWVudCIsInNpbXBsZUlucHV0IiwicmVmaW5lUmFuZ2UiLCJidWlsZFJhbmdlRnJvbUR1cmF0aW9uIiwiYnVpbGRSYW5nZUZyb21EYXlDb3VudCIsImJ1aWxkQ3VzdG9tVmlzaWJsZVJhbmdlIiwiZ2V0RmFsbGJhY2tEdXJhdGlvbiIsImNvbXB1dGVSZXMiLCJpc0hpZGRlbkRheSIsInNraXBIaWRkZW5EYXlzIiwicnVubmluZ0NvdW50IiwiY3VzdG9tQWxpZ25tZW50IiwicmFuZ2VJbnB1dCIsInBhcnNlUmFuZ2UiLCJpc0hpZGRlbkRheUhhc2giLCJpbmMiLCJpc0V4Y2x1c2l2ZSIsIkRheUhlYWRlciIsInJlbmRlckludHJvIiwiRGF5U2VyaWVzTW9kZWwiLCJpbmRpY2VzIiwiZGF5SW5kZXgiLCJjbnQiLCJzbGljZVJhbmdlIiwiZmlyc3RJbmRleCIsImdldERhdGVEYXlJbmRleCIsImxhc3RJbmRleCIsImNsaXBwZWRGaXJzdEluZGV4IiwiY2xpcHBlZExhc3RJbmRleCIsImRheU9mZnNldCIsIkRheVRhYmxlTW9kZWwiLCJkYXlTZXJpZXMiLCJicmVha09uV2Vla3MiLCJkYXlzUGVyUm93Iiwicm93Q250IiwiY2VsbHMiLCJidWlsZENlbGxzIiwiaGVhZGVyRGF0ZXMiLCJidWlsZEhlYWRlckRhdGVzIiwicm93cyIsImJ1aWxkQ2VsbCIsInNlcmllc1NlZyIsIm5leHRJbmRleCIsImZpcnN0Q29sIiwibGFzdENvbCIsImlzUnVubmluZyIsImlzRGlydHkiLCJwYXVzZURlcHRocyIsImlzUGF1c2VkIiwiRWxlbWVudERyYWdnaW5nIiwic2V0TWlycm9ySXNWaXNpYmxlIiwiYm9vbCIsInNldE1pcnJvck5lZWRzUmV2ZXJ0Iiwic2V0QXV0b1Njcm9sbEVuYWJsZWQiLCJFbGVtZW50U2Nyb2xsQ29udHJvbGxlciIsInNjcm9sbFRvcCIsInNjcm9sbExlZnQiLCJzZXRTY3JvbGxUb3AiLCJzZXRTY3JvbGxMZWZ0Iiwic2Nyb2xsV2lkdGgiLCJzY3JvbGxIZWlnaHQiLCJpc0hpdENvbWJvQWxsb3dlZCIsIk1vcmVMaW5rQ29udGFpbmVyIiwiaXNQb3BvdmVyT3BlbiIsInBvcG92ZXJJZCIsImhhbmRsZUxpbmtFbCIsImxpbmtFbCIsImhhbmRsZUNsaWNrIiwiYnVpbGRQdWJsaWNTZWciLCJhbGxTZWdzIiwiaGFuZGxlUG9wb3ZlckNsb3NlIiwibW9yZUNudCIsInNob3J0VGV4dCIsImFsaWdubWVudEVsUmVmIiwicG9wb3ZlckNvbnRlbnQiLCJ1cGRhdGVQYXJlbnRFbCIsIk5hbWVkVGltZVpvbmVJbXBsIiwiTm93SW5kaWNhdG9yQ29udGFpbmVyIiwiaXNBeGlzIiwiUG9zaXRpb25DYWNoZSIsIm9yaWdpbkVsIiwiZWxzIiwiaXNIb3Jpem9udGFsIiwiaXNWZXJ0aWNhbCIsIm9yaWdpbkNsaWVudFJlY3QiLCJidWlsZEVsSG9yaXpvbnRhbHMiLCJidWlsZEVsVmVydGljYWxzIiwib3JpZ2luQ2xpZW50TGVmdCIsImxlZnRzIiwicmlnaHRzIiwib3JpZ2luQ2xpZW50VG9wIiwidG9wcyIsImJvdHRvbXMiLCJsZWZ0VG9JbmRleCIsImxlZnRQb3NpdGlvbiIsInRvcFRvSW5kZXgiLCJ0b3BQb3NpdGlvbiIsImdldFdpZHRoIiwibGVmdEluZGV4IiwiZ2V0SGVpZ2h0IiwidG9wSW5kZXgiLCJzaW1pbGFyVG8iLCJvdGhlckNhY2hlIiwiU2VnSGllcmFyY2h5Iiwic3RyaWN0T3JkZXIiLCJhbGxvd1Jlc2xpY2luZyIsIm1heENvb3JkIiwibWF4U3RhY2tDbnQiLCJsZXZlbENvb3JkcyIsImVudHJpZXNCeUxldmVsIiwic3RhY2tDbnRzIiwiYWRkU2VncyIsImhpZGRlbkVudHJpZXMiLCJpbnNlcnRFbnRyeSIsImZpbmRJbnNlcnRpb24iLCJpc0luc2VydGlvblZhbGlkIiwiaW5zZXJ0RW50cnlBdCIsImhhbmRsZUludmFsaWRJbnNlcnRpb24iLCJsZXZlbENvb3JkIiwidGhpY2tuZXNzIiwic3RhY2tDbnQiLCJ0b3VjaGluZ0VudHJ5Iiwic3BsaXRFbnRyeSIsImJhcnJpZXIiLCJwYXJ0Q250Iiwic3BsaXRIaWRkZW5FbnRyaWVzIiwiZW50cnlTcGFuIiwiYmFycmllclNwYW4iLCJsYXRlcmFsIiwibGV2ZWwiLCJuZXdFbnRyeSIsImxldmVsQ250IiwiY2FuZGlkYXRlQ29vcmQiLCJ0b3VjaGluZ0xldmVsIiwidG91Y2hpbmdMYXRlcmFsIiwidHJhY2tpbmdMZXZlbCIsInRyYWNraW5nQ29vcmQiLCJ0cmFja2luZ0VudHJ5IiwidHJhY2tpbmdFbnRyaWVzIiwic2VhcmNoUmVzIiwibGF0ZXJhbEluZGV4IiwidHJhY2tpbmdFbnRyeUJvdHRvbSIsImRlc3RMZXZlbCIsImRlc3RMYXRlcmFsIiwidG9SZWN0cyIsInJlY3RzIiwiZW50cmllcyIsIlNsaWNlciIsInNsaWNlQnVzaW5lc3NIb3VycyIsIl9zbGljZUJ1c2luZXNzSG91cnMiLCJzbGljZURhdGVTZWxlY3Rpb24iLCJfc2xpY2VEYXRlU3BhbiIsIl9zbGljZUV2ZW50U3RvcmUiLCJzbGljZUV2ZW50RHJhZyIsIl9zbGljZUludGVyYWN0aW9uIiwic2xpY2VFdmVudFJlc2l6ZSIsImZvcmNlRGF5SWZMaXN0SXRlbSIsInNsaWNlUHJvcHMiLCJleHRyYUFyZ3MiLCJldmVudFNlZ3MiLCJkYXRlU2VsZWN0aW9uU2VncyIsImJ1c2luZXNzSG91clNlZ3MiLCJmZ0V2ZW50U2VncyIsImJnRXZlbnRTZWdzIiwic2xpY2VOb3dEYXRlIiwicmFuZ2VSZXMiLCJzbGljZUV2ZW50UmFuZ2VzIiwiYWZmZWN0ZWRJbnN0YW5jZXMiLCJhY3RpdmVEYXRlU3BhblJhbmdlIiwiZmFicmljYXRlRXZlbnRSYW5nZSIsImV2ZW50UmFuZ2VzIiwic2xpY2VFdmVudFJhbmdlIiwiU3BsaXR0ZXIiLCJnZXRLZXlzRm9yRXZlbnREZWZzIiwiX2dldEtleXNGb3JFdmVudERlZnMiLCJzcGxpdERhdGVTZWxlY3Rpb24iLCJfc3BsaXREYXRlU3BhbiIsInNwbGl0RXZlbnRTdG9yZSIsIl9zcGxpdEV2ZW50U3RvcmUiLCJzcGxpdEluZGl2aWR1YWxVaSIsIl9zcGxpdEluZGl2aWR1YWxVaSIsInNwbGl0RXZlbnREcmFnIiwiX3NwbGl0SW50ZXJhY3Rpb24iLCJzcGxpdEV2ZW50UmVzaXplIiwiZXZlbnRVaUJ1aWxkZXJzIiwic3BsaXRQcm9wcyIsImtleUluZm9zIiwiZ2V0S2V5SW5mbyIsImRlZktleXMiLCJkYXRlU2VsZWN0aW9ucyIsImV2ZW50U3RvcmVzIiwiZXZlbnREcmFncyIsImV2ZW50UmVzaXplcyIsImluZm8iLCJrZXlJbmZvIiwiYnVpbGRFdmVudFVpIiwiZGF0ZVNwYW5zIiwiZ2V0S2V5c0ZvckRhdGVTcGFuIiwiZ2V0S2V5c0ZvckV2ZW50RGVmIiwic3BsaXRTdG9yZXMiLCJzcGxpdEhhc2hlcyIsInNwbGl0U3RhdGVzIiwiYWZmZWN0ZWRTdG9yZXMiLCJtdXRhdGVkS2V5c0J5RGVmSWQiLCJtdXRhdGVkU3RvcmVzIiwicG9wdWxhdGUiLCJTdGFuZGFyZEV2ZW50IiwiZGVmYXVsdFRpbWVGb3JtYXQiLCJldmVudENvbnRlbnRBcmciLCJWaWV3Q29udGFpbmVyIiwiV2Vla051bWJlckNvbnRhaW5lciIsImRlZmF1bHRGb3JtYXQiLCJXaW5kb3dTY3JvbGxDb250cm9sbGVyIiwic2Nyb2xsIiwiYWRkRHVyYXRpb25zIiwiYWRkV2Vla3MiLCJhbGxvd0NvbnRleHRNZW51IiwiYWxsb3dTZWxlY3Rpb24iLCJ1c2VyU2VsZWN0IiwiYXNDbGVhbkRheXMiLCJhc1JvdWdoTWludXRlcyIsImFzUm91Z2hTZWNvbmRzIiwiYnVpbGRFdmVudFJhbmdlS2V5IiwiY3JlYXRlU2Nyb2xsUmVzcG9uZGVyIiwiY29tcGFyZU51bWJlcnMiLCJjb21wdXRlSW5uZXJSZWN0IiwiZ29XaXRoaW5QYWRkaW5nIiwiZG9Gcm9tV2luZG93Vmlld3BvcnQiLCJvdXRlclJlY3QiLCJlZGdlcyIsImNvbmZpZyIsImNvbnN0cmFpblBvaW50IiwicG9pbnQiLCJkaWZmUG9pbnRzIiwicG9pbnQxIiwicG9pbnQyIiwiZGlmZldlZWtzIiwiZGlzYWJsZUN1cnNvciIsImVuYWJsZUN1cnNvciIsImdldFJvb3ROb2RlIiwiZmluZERpcmVjdENoaWxkcmVuIiwicGFyZW50IiwiY2hpbGROb2RlIiwicnVuQmVmb3JlRmx1c2giLCJvbGREZWJvdW5jZVJlbmRlcmluZyIsImNhbGxiYWNrUSIsImZvcm1hdElzb01vbnRoU3RyIiwibWF0Y2giLCJmb3JtYXRJc29UaW1lU3RyaW5nIiwiaW5pdGlhbERhdGVJbnB1dCIsImdldFJlY3RDZW50ZXIiLCJnZXRTZWdNZXRhIiwic2VnUmFuZ2UiLCJnZXRTbG90Q2xhc3NOYW1lcyIsImdldFN0aWNreUZvb3RlclNjcm9sbGJhciIsImdldFN0aWNreUhlYWRlckRhdGVzIiwiZ3JvdXBJbnRlcnNlY3RpbmdFbnRyaWVzIiwibWVyZ2VzIiwiZmlsdGVyZWRNZXJnZXMiLCJodW5ncnlNZXJnZSIsIm1lcmdlIiwiaGFzQmdSZW5kZXJpbmciLCJpbnRlcmFjdGlvblNldHRpbmdzVG9TdG9yZSIsImlzRGF0ZVNlbGVjdGlvblZhbGlkIiwiaXNEYXRlU3BhbnNFcXVhbCIsImlzU3BhblByb3BzRXF1YWwiLCJpc0ludGVyYWN0aW9uVmFsaWQiLCJpc011bHRpRGF5UmFuZ2UiLCJvbk1vdXNlRW50ZXIiLCJvbk1vdXNlTGVhdmUiLCJjdXJyZW50TWF0Y2hlZENoaWxkIiwibW91c2VPdmVyRXYiLCJyZWFsT25Nb3VzZUxlYXZlIiwibW91c2VMZWF2ZUV2IiwibWVtb2l6ZUFycmF5bGlrZSIsImN1cnJlbnRBcmdTZXRzIiwiY3VycmVudFJlc3VsdHMiLCJuZXdBcmdTZXRzIiwiY3VycmVudExlbiIsIm5ld0xlbiIsIm1lbW9pemVIYXNobGlrZSIsImN1cnJlbnRBcmdIYXNoIiwiY3VycmVudFJlc0hhc2giLCJuZXdBcmdIYXNoIiwibmV3UmVzSGFzaCIsIm9wdGlvblNldHMiLCJtdWx0aXBseUR1cmF0aW9uIiwicmF3RGVmcyIsInJhd0RlZiIsInJlZmluZUlucHV0cyIsInBhcnNlRHJhZ01ldGEiLCJsZWZ0b3ZlclByb3BzIiwicG9pbnRJbnNpZGVSZWN0IiwicHJldmVudENvbnRleHRNZW51IiwicHJldmVudFNlbGVjdGlvbiIsInN1YnNldCIsInJlY2VpdmVSYXdFdmVudHMiLCJleGlzdGluZ0V2ZW50U3RvcmUiLCJidWlsZFB1YmxpY0lkTWFwcyIsInJlc2V0UmF3RXZlbnRzIiwiZXhwYW5kUmFuZ2UiLCJtYXN0ZXIiLCJmaWx0ZXJlZERlZnMiLCJmaWx0ZXJlZEluc3RhbmNlcyIsImV4Y2x1ZGVTdWJFdmVudFN0b3JlIiwicmVtb3ZlRXhhY3QiLCJleGFjdFZhbCIsInJlbW92ZUNudCIsInJlbmRlckZpbGwiLCJmaWxsVHlwZSIsInJlbmRlclNjcm9sbFNoaW0iLCJmZXRjaE9wdGlvbnMiLCJoZWFkZXJzIiwiZmV0Y2hSZXMiLCJvayIsInBhcnNlZFJlc3BvbnNlIiwib2xkRGF0ZUVudiIsIm5ld0RhdGVFbnYiLCJzb3J0RXZlbnRTZWdzIiwiZXZlbnRPcmRlclNwZWNzIiwib2JqcyIsInRyYW5zbGF0ZVJlY3QiLCJkZWx0YVgiLCJkZWx0YVkiLCJub3JtYWxpemVkU3VjY2Vzc0NhbGxiYWNrIiwibm9ybWFsaXplZEZhaWx1cmVDYWxsYmFjayIsImlzUmVzb2x2ZWQiLCJ3cmFwcGVkU3VjY2VzcyIsIndyYXBwZWRGYWlsdXJlIiwid2hlblRyYW5zaXRpb25Eb25lIiwicmVhbENhbGxiYWNrIiwiZXZlbnROYW1lIiwid2hvbGVEaXZpZGVEdXJhdGlvbnMiLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsImxvY2FsUmVzIiwicGFyc2VNYXJrZXIiLCJpbmRleF9janMiLCJkYXlHcmlkIiwiRGF5R3JpZFZpZXciLCJUYWJsZURhdGVQcm9maWxlR2VuZXJhdG9yIiwiZGF5R3JpZERheSIsImRheUdyaWRXZWVrIiwiZGF5R3JpZE1vbnRoIiwiZGF5R3JpZFllYXIiLCJpbnRlcm5hbF9janMiLCJwcmVhY3RfY2pzIiwic3BsaXRTZWdzQnlSb3ciLCJieVJvdyIsInNwbGl0U2Vnc0J5Rmlyc3RDb2wiLCJieUNvbCIsInNwbGl0SW50ZXJhY3Rpb25CeVJvdyIsIkRFRkFVTFRfVEFCTEVfRVZFTlRfVElNRV9GT1JNQVQiLCJoYXNMaXN0SXRlbURpc3BsYXkiLCJUYWJsZUJsb2NrRXZlbnQiLCJUYWJsZUxpc3RJdGVtRXZlbnQiLCJUYWJsZUNlbGxNb3JlTGluayIsImNvbXBpbGVTZWdzIiwiaW52aXNpYmxlU2VncyIsInNpbmdsZVBsYWNlbWVudHMiLCJpc0ZvcmNlZEludmlzaWJsZSIsInZpc2liaWxpdHkiLCJwbGFjZW1lbnQiLCJpc1Zpc2libGUiLCJERUZBVUxUX1dFRUtfTlVNX0ZPUk1BVCIsIlRhYmxlQ2VsbCIsInJvb3RFbFJlZiIsImRheU51bWJlcklkIiwiY3VycmVudEVuZEluY2wiLCJjdXJyZW50Rmlyc3RZZWFyIiwiY3VycmVudEZpcnN0TW9udGgiLCJjdXJyZW50TGFzdFllYXIiLCJjdXJyZW50TGFzdE1vbnRoIiwic2hvdWxkRGlzcGxheU1vbnRoU3RhcnQiLCJyZW5kZXJUb3BJbm5lciIsImlubmVyRWxSZWYiLCJtaW5IZWlnaHQiLCJzaG93V2Vla051bWJlciIsImZvcmNlRGF5VG9wIiwiZmdDb250ZW50RWxSZWYiLCJmZ0NvbnRlbnQiLCJtYXJnaW5Ub3AiLCJtb3JlTWFyZ2luVG9wIiwiYmdDb250ZW50IiwicmVzbGljZVNlZyIsInNwYW5TdGFydCIsInNwYW5FbmQiLCJEYXlHcmlkU2VnSGllcmFyY2h5IiwiaGlkZGVuQ29uc3VtZXMiLCJmb3JjZUhpZGRlbiIsInNlZ0lucHV0cyIsImV4Y2x1ZGVIaWRkZW4iLCJ0b3VjaGluZ0VudHJ5SWQiLCJwbGFjZWhvbGRlckVudHJ5IiwiVGFibGVSb3ciLCJjZWxsRWxSZWZzIiwiZnJhbWVFbFJlZnMiLCJmZ0VsUmVmcyIsInNlZ0hhcm5lc3NSZWZzIiwiZnJhbWVQb3NpdGlvbnMiLCJtYXhDb250ZW50SGVpZ2h0IiwiZXZlbnRJbnN0YW5jZUhlaWdodHMiLCJpc0ZvcmNlZCIsInVwZGF0ZVNpemluZyIsImJ1c2luZXNzSG91cnNCeUNvbCIsImJnRXZlbnRTZWdzQnlDb2wiLCJoaWdobGlnaHRTZWdzQnlDb2wiLCJnZXRIaWdobGlnaHRTZWdzIiwibWlycm9yU2Vnc0J5Q29sIiwiZ2V0TWlycm9yU2VncyIsInNpbmdsZUNvbFBsYWNlbWVudHMiLCJtdWx0aUNvbFBsYWNlbWVudHMiLCJtb3JlQ250cyIsIm1vcmVNYXJnaW5Ub3BzIiwiaGllcmFyY2h5IiwidW5rbm93bkhlaWdodFNlZ3MiLCJldmVudEhlaWdodCIsInNlZ1JlY3RzIiwibGVmdG92ZXJNYXJnaW5zIiwiYWxsUmVjdHMiLCJyZWN0c0J5RWFjaENvbCIsImdyb3VwUmVjdHNCeUVhY2hDb2wiLCJjdXJyZW50SGVpZ2h0IiwiY3VycmVudE1hcmdpblRvcCIsImFic29sdXRlVG9wIiwibXVsdGlQbGFjZW1lbnRzIiwiaXNGaXJzdENvbCIsInBsYWNlUmVjdHMiLCJoaWRkZW5FbnRyeSIsImhpZGRlblNwYW4iLCJjb21wdXRlRmdTZWdQbGFjZW1lbnQiLCJjZWxsIiwibm9ybWFsRmdOb2RlcyIsInJlbmRlckZnU2VncyIsIm1pcnJvckZnTm9kZXMiLCJtaXJyb3JTZWdzIiwiY29sUGxhY2VtZW50cyIsInRvcHNCeUluc3RhbmNlSWQiLCJwbGFjZW1lbnRzIiwiYnVpbGRBYnNvbHV0ZVRvcEhhc2giLCJidWlsZE1pcnJvclBsYWNlbWVudHMiLCJzaG93RGF5TnVtYmVycyIsInNob3dXZWVrTnVtYmVycyIsInJlbmRlckZpbGxTZWdzIiwiY2VsbE1pbkhlaWdodCIsInByZXZTdGF0ZSIsImN1cnJlbnRQcm9wcyIsInNlZ1BsYWNlbWVudHMiLCJub2RlcyIsImxlZnRSaWdodENzcyIsImlzRXh0ZXJuYWxTaXppbmdDaGFuZ2UiLCJmcmFtZUVscyIsIm5ld1Bvc2l0aW9uQ2FjaGUiLCJvbGRJbnN0YW5jZUhlaWdodHMiLCJuZXdJbnN0YW5jZUhlaWdodHMiLCJxdWVyeUV2ZW50SW5zdGFuY2VIZWlnaHRzIiwibGltaXRCeUNvbnRlbnRIZWlnaHQiLCJjb21wdXRlTWF4Q29udGVudEhlaWdodCIsInNlZ0VsTWFwIiwiZmlyc3RLZXkiLCJmY0NvbnRhaW5lckVsIiwiZ2V0Q2VsbEVscyIsImVsTWFwIiwiVGFibGVSb3dzIiwic3BsaXRCdXNpbmVzc0hvdXJTZWdzIiwic3BsaXRCZ0V2ZW50U2VncyIsInNwbGl0RmdFdmVudFNlZ3MiLCJzcGxpdERhdGVTZWxlY3Rpb25TZWdzIiwicm93UmVmcyIsImJ1c2luZXNzSG91clNlZ3NCeVJvdyIsImJnRXZlbnRTZWdzQnlSb3ciLCJmZ0V2ZW50U2Vnc0J5Um93IiwiZGF0ZVNlbGVjdGlvblNlZ3NCeVJvdyIsImV2ZW50RHJhZ0J5Um93IiwiZXZlbnRSZXNpemVCeVJvdyIsInJlbmRlclJvd0ludHJvIiwiaXNTZWdBbGxEYXkiLCJmaXJzdENlbGxFbCIsInJvd1Bvc2l0aW9ucyIsInJvd09iaiIsImNvbFBvc2l0aW9ucyIsImdldENlbGxSYW5nZSIsImdldENlbGxFbCIsIlRhYmxlIiwibmVlZHNTY3JvbGxSZXNldCIsImxpbWl0VmlhQmFsYW5jZWQiLCJjb2xHcm91cE5vZGUiLCJyZXF1ZXN0U2Nyb2xsUmVzZXQiLCJmbHVzaFNjcm9sbFJlc2V0Iiwic3ViamVjdEVsIiwiZ2V0U2Nyb2xsU3ViamVjdEVsIiwic2Nyb2xsRWwiLCJEYXlUYWJsZVNsaWNlciIsImRheVRhYmxlTW9kZWwiLCJEYXlUYWJsZSIsInNsaWNlciIsInRhYmxlUmVmIiwiaGVhZGVyQWxpZ25FbFJlZiIsImJ1aWxkRGF5VGFibGVSZW5kZXJSYW5nZSIsInNuYXBUb1dlZWsiLCJlbmRPZldlZWsiLCJsYXN0TW9udGhSZW5kZXJTdGFydCIsIlRhYmxlVmlldyIsImhlYWRlckVsUmVmIiwicmVuZGVyU2ltcGxlTGF5b3V0IiwiaGVhZGVyUm93Q29udGVudCIsImJvZHlDb250ZW50IiwicmVuZGVySFNjcm9sbExheW91dCIsIlNjcm9sbEdyaWQiLCJjaHVua3MiLCJjb2xHcm91cHMiLCJidWlsZERheVRhYmxlTW9kZWwiLCJoZWFkZXJDb250ZW50IiwiY29udGVudEFyZyIsInRvdWNoTW91c2VJZ25vcmVXYWl0IiwiaWdub3JlTW91c2VEZXB0aCIsImxpc3RlbmVyQ250IiwiaXNXaW5kb3dUb3VjaE1vdmVDYW5jZWxsZWQiLCJQb2ludGVyRHJhZ2dpbmciLCJoYW5kbGVTZWxlY3RvciIsInNob3VsZElnbm9yZU1vdmUiLCJzaG91bGRXYXRjaFNjcm9sbCIsImlzVG91Y2hEcmFnZ2luZyIsIndhc1RvdWNoU2Nyb2xsIiwiaGFuZGxlTW91c2VEb3duIiwic2hvdWxkSWdub3JlTW91c2UiLCJjdHJsS2V5IiwiaXNQcmltYXJ5TW91c2VCdXR0b24iLCJ0cnlTdGFydCIsImNyZWF0ZUV2ZW50RnJvbU1vdXNlIiwiaW5pdFNjcm9sbFdhdGNoIiwiaGFuZGxlTW91c2VNb3ZlIiwiaGFuZGxlTW91c2VVcCIsInJlY29yZENvb3JkcyIsImNsZWFudXAiLCJoYW5kbGVUb3VjaFN0YXJ0IiwiY3JlYXRlRXZlbnRGcm9tVG91Y2giLCJ0YXJnZXRFbCIsImhhbmRsZVRvdWNoTW92ZSIsImhhbmRsZVRvdWNoRW5kIiwiaGFuZGxlVG91Y2hTY3JvbGwiLCJoYW5kbGVTY3JvbGwiLCJwYWdlWCIsInByZXZTY3JvbGxYIiwicHJldlBhZ2VYIiwicGFnZVkiLCJwcmV2U2Nyb2xsWSIsInByZXZQYWdlWSIsImlzVG91Y2giLCJvcmlnUGFnZVgiLCJvcmlnUGFnZVkiLCJwYXNzaXZlIiwib25XaW5kb3dUb3VjaE1vdmUiLCJxdWVyeVN1YmplY3RFbCIsImRvd25FbCIsImRlc3Ryb3lTY3JvbGxXYXRjaCIsImNhbmNlbFRvdWNoU2Nyb2xsIiwiaXNGaXJzdCIsInRvdWNoZXMiLCJFbGVtZW50TWlycm9yIiwic291cmNlRWwiLCJtaXJyb3JFbCIsInNvdXJjZUVsUmVjdCIsInpJbmRleCIsInJldmVydER1cmF0aW9uIiwib3JpZ1NjcmVlblgiLCJvcmlnU2NyZWVuWSIsInVwZGF0ZUVsUG9zaXRpb24iLCJoYW5kbGVNb3ZlIiwic2V0SXNWaXNpYmxlIiwic3RvcCIsIm5lZWRzUmV2ZXJ0QW5pbWF0aW9uIiwiZG9uZSIsImRvUmV2ZXJ0QW5pbWF0aW9uIiwiZmluYWxTb3VyY2VFbFJlY3QiLCJ0cmFuc2l0aW9uIiwiZ2V0TWlycm9yRWwiLCJjbG9uZU5vZGUiLCJib3hTaXppbmciLCJtYXJnaW4iLCJTY3JvbGxHZW9tQ2FjaGUiLCJzY3JvbGxDb250cm9sbGVyIiwiZG9lc0xpc3RlbmluZyIsImhhbmRsZVNjcm9sbENoYW5nZSIsIm9yaWdTY3JvbGxUb3AiLCJvcmlnU2Nyb2xsTGVmdCIsImNsaWVudFJlY3QiLCJjb21wdXRlQ2xpZW50UmVjdCIsImdldEV2ZW50VGFyZ2V0IiwiRWxlbWVudFNjcm9sbEdlb21DYWNoZSIsIldpbmRvd1Njcm9sbEdlb21DYWNoZSIsImdldFRpbWUiLCJwZXJmb3JtYW5jZSIsIkF1dG9TY3JvbGxlciIsImlzRW5hYmxlZCIsInNjcm9sbFF1ZXJ5IiwiZWRnZVRocmVzaG9sZCIsIm1heFZlbG9jaXR5IiwicG9pbnRlclNjcmVlblgiLCJwb2ludGVyU2NyZWVuWSIsImlzQW5pbWF0aW5nIiwic2Nyb2xsQ2FjaGVzIiwiZXZlck1vdmVkVXAiLCJldmVyTW92ZWREb3duIiwiZXZlck1vdmVkTGVmdCIsImV2ZXJNb3ZlZFJpZ2h0IiwiYW5pbWF0ZSIsImVkZ2UiLCJjb21wdXRlQmVzdEVkZ2UiLCJoYW5kbGVTaWRlIiwibXNTaW5jZVJlcXVlc3QiLCJyZXF1ZXN0QW5pbWF0aW9uIiwic2Nyb2xsU3RhcnRFbCIsImJ1aWxkQ2FjaGVzIiwieURlbHRhIiwieERlbHRhIiwic2Nyb2xsQ2FjaGUiLCJpbnZEaXN0YW5jZSIsImRpc3RhbmNlIiwidmVsb2NpdHkiLCJiZXN0U2lkZSIsImxlZnREaXN0IiwicmlnaHREaXN0IiwidG9wRGlzdCIsImJvdHRvbURpc3QiLCJxdWVyeVNjcm9sbEVscyIsIkZlYXR1cmVmdWxFbGVtZW50RHJhZ2dpbmciLCJtaW5EaXN0YW5jZSIsInRvdWNoU2Nyb2xsQWxsb3dlZCIsIm1pcnJvck5lZWRzUmV2ZXJ0IiwiaXNJbnRlcmFjdGluZyIsImlzRGVsYXlFbmRlZCIsImlzRGlzdGFuY2VTdXJwYXNzZWQiLCJkZWxheVRpbWVvdXRJZCIsIm9uUG9pbnRlckRvd24iLCJwb2ludGVyIiwibWlycm9yIiwic3RhcnREZWxheSIsImhhbmRsZURpc3RhbmNlU3VycGFzc2VkIiwib25Qb2ludGVyTW92ZSIsImRpc3RhbmNlU3EiLCJhdXRvU2Nyb2xsZXIiLCJvblBvaW50ZXJVcCIsInRyeVN0b3BEcmFnIiwiaGFuZGxlRGVsYXlFbmQiLCJ0cnlTdGFydERyYWciLCJzdG9wRHJhZyIsInNldElnbm9yZU1vdmUiLCJPZmZzZXRUcmFja2VyIiwib3JpZ1JlY3QiLCJjb21wdXRlTGVmdCIsImNvbXB1dGVUb3AiLCJpc1dpdGhpbkNsaXBwaW5nIiwiaXNJZ25vcmVkQ2xpcHBpbmciLCJub2RlIiwidGFnTmFtZSIsIkhpdERyYWdnaW5nIiwiZHJhZ2dpbmciLCJkcm9wcGFibGVTdG9yZSIsInVzZVN1YmplY3RDZW50ZXIiLCJyZXF1aXJlSW5pdGlhbCIsImluaXRpYWxIaXQiLCJtb3ZpbmdIaXQiLCJmaW5hbEhpdCIsImhhbmRsZVBvaW50ZXJEb3duIiwicHJvY2Vzc0ZpcnN0Q29vcmQiLCJoYW5kbGVEcmFnU3RhcnQiLCJoYW5kbGVEcmFnTW92ZSIsImhhbmRsZVBvaW50ZXJVcCIsInJlbGVhc2VIaXRzIiwiaGFuZGxlRHJhZ0VuZCIsInN1YmplY3RSZWN0Iiwib3JpZ1BvaW50IiwiYWRqdXN0ZWRQb2ludCIsInF1ZXJ5SGl0Rm9yT2Zmc2V0Iiwic2xpY2VkU3ViamVjdFJlY3QiLCJjb29yZEFkanVzdCIsImZvcmNlSGFuZGxlIiwiaGl0IiwiaXNIaXRzRXF1YWwiLCJvZmZzZXRUcmFja2VycyIsImludGVyYWN0aW9uU2V0dGluZ3MiLCJvZmZzZXRMZWZ0Iiwib2Zmc2V0VG9wIiwiYmVzdEhpdCIsIm9mZnNldFRyYWNrZXIiLCJvcmlnaW5MZWZ0Iiwib3JpZ2luVG9wIiwiY29tcG9uZW50SWQiLCJoaXQwIiwiaGl0MSIsImJ1aWxkRGF0ZVBvaW50QXBpV2l0aENvbnRleHQiLCJEYXRlQ2xpY2tpbmciLCJoaXREcmFnZ2luZyIsIkRhdGVTZWxlY3RpbmciLCJkcmFnU2VsZWN0aW9uIiwiY2FuU2VsZWN0IiwiZ2V0Q29tcG9uZW50VG91Y2hEZWxheSQxIiwiaGFuZGxlSGl0VXBkYXRlIiwiaXNGaW5hbCIsImlzSW52YWxpZCIsImRhdGVTcGFuMCIsImRhdGVTcGFuMSIsImpvaW5IaXRzSW50b1NlbGVjdGlvbiIsIkV2ZW50RHJhZ2dpbmciLCJzdWJqZWN0U2VnIiwicmVjZWl2aW5nQ29udGV4dCIsInZhbGlkTXV0YXRpb24iLCJtdXRhdGVkUmVsZXZhbnRFdmVudHMiLCJvcmlnVGFyZ2V0IiwiaW5pdGlhbENvbnRleHQiLCJnZXRDb21wb25lbnRUb3VjaERlbGF5IiwiZml4ZWRNaXJyb3JQYXJlbnQiLCJyZWNlaXZpbmdPcHRpb25zIiwibWFzc2FnZXJzIiwibWFzc2FnZXIiLCJjb21wdXRlRXZlbnRNdXRhdGlvbiIsImRpc3BsYXlEcmFnIiwiY2xlYXJEcmFnIiwidXBkYXRlZEV2ZW50QXBpIiwiZXZlbnRDaGFuZ2VBcmciLCJ0cmFuc2Zvcm1lZCIsImV2ZW50UmVtb3ZlQXJnIiwiZHJhZ2dlZEVsIiwiYWRkZWRFdmVudERlZiIsImFkZGVkRXZlbnRJbnN0YW5jZSIsImFkZGVkRXZlbnRBcGkiLCJldmVudEFkZEFyZyIsIlNFTEVDVE9SIiwibmV4dENvbnRleHQiLCJwcmV2Q29udGV4dCIsImluaXRpYWxDYWxlbmRhciIsIkV2ZW50UmVzaXppbmciLCJkcmFnZ2luZ1NlZ0VsIiwiZHJhZ2dpbmdTZWciLCJxdWVyeVNlZ0VsIiwiaXNGcm9tU3RhcnQiLCJjb21wdXRlTXV0YXRpb24iLCJPUFRJT05fUkVGSU5FUlMiLCJMSVNURU5FUl9SRUZJTkVSUyIsImRhdGVDbGljayIsImV2ZW50RHJhZ1N0YXJ0IiwiZXZlbnREcmFnU3RvcCIsImV2ZW50RHJvcCIsImV2ZW50UmVzaXplU3RhcnQiLCJldmVudFJlc2l6ZVN0b3AiLCJkcm9wIiwiZXZlbnRSZWNlaXZlIiwiZXZlbnRMZWF2ZSIsIkV4dGVybmFsRWxlbWVudERyYWdnaW5nIiwic3VwcGxpZWREcmFnTWV0YSIsImRyb3BwYWJsZUV2ZW50IiwiZHJhZ01ldGEiLCJidWlsZERyYWdNZXRhIiwiY2FuRHJvcEVsT25DYWxlbmRhciIsImRlZlByb3BzIiwiY29tcHV0ZUV2ZW50Rm9yRGF0ZVNwYW4iLCJmaW5hbFZpZXciLCJhZGRpbmdFdmVudHMiLCJkYXRhQXR0clByZWZpeCIsInByZWZpeGVkTmFtZSIsImdldEVtYmVkZGVkRWxEYXRhIiwiZ2V0RHJhZ01ldGFGcm9tRWwiLCJJbmZlcnJlZEVsZW1lbnREcmFnZ2luZyIsIm1pcnJvclNlbGVjdG9yIiwiY3VycmVudE1pcnJvckVsIiwiaGFuZGxlUG9pbnRlck1vdmUiLCJpc1JlY2VudFBvaW50ZXJEYXRlU2VsZWN0IiwibWF0Y2hlc0NhbmNlbCIsIm1hdGNoZXNFdmVudCIsIm9uU2VsZWN0Iiwic2VsZWN0SW5mbyIsIm9uRG9jdW1lbnRQb2ludGVyRG93biIsIm9uRG9jdW1lbnRQb2ludGVyVXAiLCJkb2N1bWVudFBvaW50ZXIiLCJEcmFnZ2FibGUiLCJpdGVtU2VsZWN0b3IiLCJhcHBlbmRUbyIsImV2ZW50RGF0YSIsIlRoaXJkUGFydHlEcmFnZ2FibGUiLCJjb250YWluZXJPclNldHRpbmdzIiwiRWxlbWVudCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkZWZpbml0aW9uIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file