@ditojs/ui 2.31.0 → 2.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,23 +1,23 @@
1
- (function(V,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("@vue/shared"),require("@ditojs/utils")):typeof define=="function"&&define.amd?define(["exports","@vue/shared","@ditojs/utils"],l):(V=typeof globalThis<"u"?globalThis:V||self,l(V["dito-ui"]={},V["@vue/shared"],V["@ditojs/utils"]))})(this,function(V,l,$){"use strict";function _t(e){return{year:(e==null?void 0:e.getFullYear())??0,month:(e==null?void 0:e.getMonth())??0,day:(e==null?void 0:e.getDate())??0,hour:(e==null?void 0:e.getHours())??0,minute:(e==null?void 0:e.getMinutes())??0,second:(e==null?void 0:e.getSeconds())??0,millisecond:(e==null?void 0:e.getMilliseconds())??0}}function Fe(e,t={}){return new Date(...Object.values({..._t(e),...t}))}function je(e,{locale:t="en-US",date:n=!0,time:s=!0}={}){const i=s?null:0;let[o,r,a,c,f,,d=i,,u=i,,p=i,,h=i]=tn(e,{date:n,time:s});if(f&&f.length>=4){t==="en-US"&&r==="/"&&c==="/"&&([o,a]=[a,o]),a=Ms(a,{locale:t});const y=b=>b===null||b.length===2;if(a!==null&&(!s||y(d)&&y(u)&&y(p)))return new Date(+f,+a,+o,+d,+u,+p,+h)}return null}function wt(e,t,{locale:n="en-US",date:s=!0,time:i=!0}={}){const o=tn(e,{date:s,time:i}),r=(u,p=o.length)=>{var b;let h=0,y=0;for(;(u===null||h<=u)&&y<p;)h+=((b=o[y++])==null?void 0:b.length)??0;return{position:h,index:y}},a=s?0:r(null,6).position;t+=a;let{index:c}=r(t);const f=n==="en-US",d=[f?"month":"day",null,f?"day":"month",null,"year",null,"hour",null,"minute",null,"second",null,"millisecond"];for(;c--;)if(d[c]){const u=r(null,c).position-a,p=u+o[c].length;return{name:d[c],start:u,end:p}}return null}function tn(e,{date:t=!0,time:n=!0}={}){const s=(e==null?void 0:e.split(/([\s.,:/]+)/))||[];return t||s.unshift("1",".","1",".","2000"," "),!n&&s.length>5&&(s.length=5),s}function Ms(e,{locale:t="en-US"}={}){const n=+e;if(!isNaN(n))return n-1;const s=e.trim().toLowerCase();if(s.length<3)return null;const i=new Intl.DateTimeFormat(t,{month:"short"}),o=new Intl.DateTimeFormat(t,{month:"long"});for(let r=0;r<12;r++){const a=new Date(2e3,r,1);if(i.format(a).toLowerCase().startsWith(s)||o.format(a).toLowerCase().startsWith(s))return r}return null}/**
2
- * @vue/reactivity v3.4.10
1
+ (function(D,a){typeof exports=="object"&&typeof module<"u"?a(exports,require("@vue/shared"),require("@ditojs/utils")):typeof define=="function"&&define.amd?define(["exports","@vue/shared","@ditojs/utils"],a):(D=typeof globalThis<"u"?globalThis:D||self,a(D["dito-ui"]={},D["@vue/shared"],D["@ditojs/utils"]))})(this,function(D,a,R){"use strict";function Mt(e){return{year:(e==null?void 0:e.getFullYear())??0,month:(e==null?void 0:e.getMonth())??0,day:(e==null?void 0:e.getDate())??0,hour:(e==null?void 0:e.getHours())??0,minute:(e==null?void 0:e.getMinutes())??0,second:(e==null?void 0:e.getSeconds())??0,millisecond:(e==null?void 0:e.getMilliseconds())??0}}function $e(e,t={}){return new Date(...Object.values({...Mt(e),...t}))}function Xe(e,{locale:t="en-US",date:n=!0,time:s=!0}={}){const o=s?null:0;let[i,r,l,u,f,,p=o,,c=o,,d=o,,h=o]=gn(e,{date:n,time:s});if(f&&f.length>=4){t==="en-US"&&r==="/"&&u==="/"&&([i,l]=[l,i]),l=qs(l,{locale:t});const y=V=>V===null||V.length===2;if(l!==null&&(!s||y(p)&&y(c)&&y(d)))return new Date(+f,+l,+i,+p,+c,+d,+h)}return null}function kt(e,t,{locale:n="en-US",date:s=!0,time:o=!0}={}){const i=gn(e,{date:s,time:o}),r=(c,d=i.length)=>{var V;let h=0,y=0;for(;(c===null||h<=c)&&y<d;)h+=((V=i[y++])==null?void 0:V.length)??0;return{position:h,index:y}},l=s?0:r(null,6).position;t+=l;let{index:u}=r(t);const f=n==="en-US",p=[f?"month":"day",null,f?"day":"month",null,"year",null,"hour",null,"minute",null,"second",null,"millisecond"];for(;u--;)if(p[u]){const c=r(null,u).position-l,d=c+i[u].length;return{name:p[u],start:c,end:d}}return null}function gn(e,{date:t=!0,time:n=!0}={}){const s=(e==null?void 0:e.split(/([\s.,:/]+)/))||[];return t||s.unshift("1",".","1",".","2000"," "),!n&&s.length>5&&(s.length=5),s}function qs(e,{locale:t="en-US"}={}){const n=+e;if(!isNaN(n))return n-1;const s=e.trim().toLowerCase();if(s.length<3)return null;const o=new Intl.DateTimeFormat(t,{month:"short"}),i=new Intl.DateTimeFormat(t,{month:"long"});for(let r=0;r<12;r++){const l=new Date(2e3,r,1);if(o.format(l).toLowerCase().startsWith(s)||i.format(l).toLowerCase().startsWith(s))return r}return null}/**
2
+ * @vue/reactivity v3.5.6
3
3
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
4
4
  * @license MIT
5
- **/function nn(e,...t){console.warn(`[Vue warn] ${e}`,...t)}let xs;function ks(e,t=xs){t&&t.active&&t.effects.push(e)}let Ae;class Fs{constructor(t,n,s,i){this.fn=t,this.trigger=n,this.scheduler=s,this.active=!0,this.deps=[],this._dirtyLevel=3,this._trackId=0,this._runnings=0,this._queryings=0,this._depsLength=0,ks(this,i)}get dirty(){if(this._dirtyLevel===1){this._dirtyLevel=0,this._queryings++,Ue();for(const t of this.deps)if(t.computed&&(As(t.computed),this._dirtyLevel>=2))break;Ye(),this._queryings--}return this._dirtyLevel>=2}set dirty(t){this._dirtyLevel=t?3:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=me,n=Ae;try{return me=!0,Ae=this,this._runnings++,sn(this),this.fn()}finally{on(this),this._runnings--,Ae=n,me=t}}stop(){var t;this.active&&(sn(this),on(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function As(e){return e.value}function sn(e){e._trackId++,e._depsLength=0}function on(e){if(e.deps&&e.deps.length>e._depsLength){for(let t=e._depsLength;t<e.deps.length;t++)rn(e.deps[t],e);e.deps.length=e._depsLength}}function rn(e,t){const n=e.get(t);n!==void 0&&t._trackId!==n&&(e.delete(t),e.size===0&&e.cleanup())}let me=!0,bt=0;const ln=[];function Ue(){ln.push(me),me=!1}function Ye(){const e=ln.pop();me=e===void 0?!0:e}function vt(){bt++}function Et(){for(bt--;!bt&&St.length;)St.shift()()}function Is(e,t,n){var s;if(t.get(e)!==e._trackId){t.set(e,e._trackId);const i=e.deps[e._depsLength];i!==t?(i&&rn(i,e),e.deps[e._depsLength++]=t):e._depsLength++,process.env.NODE_ENV!=="production"&&((s=e.onTrack)==null||s.call(e,l.extend({effect:e},n)))}}const St=[];function $s(e,t,n){var s;vt();for(const i of e.keys())if(!(!i.allowRecurse&&i._runnings)&&i._dirtyLevel<t&&(!i._runnings||t!==2)){const o=i._dirtyLevel;i._dirtyLevel=t,o===0&&(!i._queryings||t!==2)&&(process.env.NODE_ENV!=="production"&&((s=i.onTrigger)==null||s.call(i,l.extend({effect:i},n))),i.trigger(),i.scheduler&&St.push(i.scheduler))}Et()}const Rs=(e,t)=>{const n=new Map;return n.cleanup=e,n.computed=t,n},Nt=new WeakMap,ye=Symbol(process.env.NODE_ENV!=="production"?"iterate":""),Vt=Symbol(process.env.NODE_ENV!=="production"?"Map key iterate":"");function x(e,t,n){if(me&&Ae){let s=Nt.get(e);s||Nt.set(e,s=new Map);let i=s.get(n);i||s.set(n,i=Rs(()=>s.delete(n))),Is(Ae,i,process.env.NODE_ENV!=="production"?{target:e,type:t,key:n}:void 0)}}function oe(e,t,n,s,i,o){const r=Nt.get(e);if(!r)return;let a=[];if(t==="clear")a=[...r.values()];else if(n==="length"&&l.isArray(e)){const c=Number(s);r.forEach((f,d)=>{(d==="length"||!l.isSymbol(d)&&d>=c)&&a.push(f)})}else switch(n!==void 0&&a.push(r.get(n)),t){case"add":l.isArray(e)?l.isIntegerKey(n)&&a.push(r.get("length")):(a.push(r.get(ye)),l.isMap(e)&&a.push(r.get(Vt)));break;case"delete":l.isArray(e)||(a.push(r.get(ye)),l.isMap(e)&&a.push(r.get(Vt)));break;case"set":l.isMap(e)&&a.push(r.get(ye));break}vt();for(const c of a)c&&$s(c,3,process.env.NODE_ENV!=="production"?{target:e,type:t,key:n,newValue:s,oldValue:i,oldTarget:o}:void 0);Et()}const Ls=l.makeMap("__proto__,__v_isRef,__isVue"),an=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(l.isSymbol)),un=Bs();function Bs(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=S(this);for(let o=0,r=this.length;o<r;o++)x(s,"get",o+"");const i=s[t](...n);return i===-1||i===!1?s[t](...n.map(S)):i}}),["push","pop","shift","unshift","splice"].forEach(t=>{e[t]=function(...n){Ue(),vt();const s=S(this)[t].apply(this,n);return Et(),Ye(),s}}),e}function Hs(e){const t=S(this);return x(t,"has",e),t.hasOwnProperty(e)}class cn{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const i=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!i;if(n==="__v_isReadonly")return i;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(i?o?wn:_n:o?eo:yn).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=l.isArray(t);if(!i){if(r&&l.hasOwn(un,n))return Reflect.get(un,n,s);if(n==="hasOwnProperty")return Hs}const a=Reflect.get(t,n,s);return(l.isSymbol(n)?an.has(n):Ls(n))||(i||x(t,"get",n),o)?a:B(a)?r&&l.isIntegerKey(n)?a:a.value:l.isObject(a)?i?vn(a):bn(a):a}}class zs extends cn{constructor(t=!1){super(!1,t)}set(t,n,s,i){let o=t[n];if(!this._shallow){const c=we(o);if(!Tt(s)&&!we(s)&&(o=S(o),s=S(s)),!l.isArray(t)&&B(o)&&!B(s))return c?!1:(o.value=s,!0)}const r=l.isArray(t)&&l.isIntegerKey(n)?Number(n)<t.length:l.hasOwn(t,n),a=Reflect.set(t,n,s,i);return t===S(i)&&(r?l.hasChanged(s,o)&&oe(t,"set",n,s,o):oe(t,"add",n,s)),a}deleteProperty(t,n){const s=l.hasOwn(t,n),i=t[n],o=Reflect.deleteProperty(t,n);return o&&s&&oe(t,"delete",n,void 0,i),o}has(t,n){const s=Reflect.has(t,n);return(!l.isSymbol(n)||!an.has(n))&&x(t,"has",n),s}ownKeys(t){return x(t,"iterate",l.isArray(t)?"length":ye),Reflect.ownKeys(t)}}class fn extends cn{constructor(t=!1){super(!0,t)}set(t,n){return process.env.NODE_ENV!=="production"&&nn(`Set operation on key "${String(n)}" failed: target is readonly.`,t),!0}deleteProperty(t,n){return process.env.NODE_ENV!=="production"&&nn(`Delete operation on key "${String(n)}" failed: target is readonly.`,t),!0}}const Ks=new zs,js=new fn,Us=new fn(!0),Dt=e=>e,We=e=>Reflect.getPrototypeOf(e);function qe(e,t,n=!1,s=!1){e=e.__v_raw;const i=S(e),o=S(t);n||(l.hasChanged(t,o)&&x(i,"get",t),x(i,"get",o));const{has:r}=We(i),a=s?Dt:n?xt:Mt;if(r.call(i,t))return a(e.get(t));if(r.call(i,o))return a(e.get(o));e!==i&&e.get(t)}function Je(e,t=!1){const n=this.__v_raw,s=S(n),i=S(e);return t||(l.hasChanged(e,i)&&x(s,"has",e),x(s,"has",i)),e===i?n.has(e):n.has(e)||n.has(i)}function Ge(e,t=!1){return e=e.__v_raw,!t&&x(S(e),"iterate",ye),Reflect.get(e,"size",e)}function dn(e){e=S(e);const t=S(this);return We(t).has.call(t,e)||(t.add(e),oe(t,"add",e,e)),this}function pn(e,t){t=S(t);const n=S(this),{has:s,get:i}=We(n);let o=s.call(n,e);o?process.env.NODE_ENV!=="production"&&mn(n,s,e):(e=S(e),o=s.call(n,e));const r=i.call(n,e);return n.set(e,t),o?l.hasChanged(t,r)&&oe(n,"set",e,t,r):oe(n,"add",e,t),this}function hn(e){const t=S(this),{has:n,get:s}=We(t);let i=n.call(t,e);i?process.env.NODE_ENV!=="production"&&mn(t,n,e):(e=S(e),i=n.call(t,e));const o=s?s.call(t,e):void 0,r=t.delete(e);return i&&oe(t,"delete",e,void 0,o),r}function gn(){const e=S(this),t=e.size!==0,n=process.env.NODE_ENV!=="production"?l.isMap(e)?new Map(e):new Set(e):void 0,s=e.clear();return t&&oe(e,"clear",void 0,void 0,n),s}function Xe(e,t){return function(s,i){const o=this,r=o.__v_raw,a=S(r),c=t?Dt:e?xt:Mt;return!e&&x(a,"iterate",ye),r.forEach((f,d)=>s.call(i,c(f),c(d),o))}}function Qe(e,t,n){return function(...s){const i=this.__v_raw,o=S(i),r=l.isMap(o),a=e==="entries"||e===Symbol.iterator&&r,c=e==="keys"&&r,f=i[e](...s),d=n?Dt:t?xt:Mt;return!t&&x(o,"iterate",c?Vt:ye),{next(){const{value:u,done:p}=f.next();return p?{value:u,done:p}:{value:a?[d(u[0]),d(u[1])]:d(u),done:p}},[Symbol.iterator](){return this}}}}function ie(e){return function(...t){if(process.env.NODE_ENV!=="production"){const n=t[0]?`on key "${t[0]}" `:"";console.warn(`${l.capitalize(e)} operation ${n}failed: target is readonly.`,S(this))}return e==="delete"?!1:e==="clear"?void 0:this}}function Ys(){const e={get(o){return qe(this,o)},get size(){return Ge(this)},has:Je,add:dn,set:pn,delete:hn,clear:gn,forEach:Xe(!1,!1)},t={get(o){return qe(this,o,!1,!0)},get size(){return Ge(this)},has:Je,add:dn,set:pn,delete:hn,clear:gn,forEach:Xe(!1,!0)},n={get(o){return qe(this,o,!0)},get size(){return Ge(this,!0)},has(o){return Je.call(this,o,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!1)},s={get(o){return qe(this,o,!0,!0)},get size(){return Ge(this,!0)},has(o){return Je.call(this,o,!0)},add:ie("add"),set:ie("set"),delete:ie("delete"),clear:ie("clear"),forEach:Xe(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Qe(o,!1,!1),n[o]=Qe(o,!0,!1),t[o]=Qe(o,!1,!0),s[o]=Qe(o,!0,!0)}),[e,n,t,s]}const[Ws,qs,Js,Gs]=Ys();function Ct(e,t){const n=t?e?Gs:Js:e?qs:Ws;return(s,i,o)=>i==="__v_isReactive"?!e:i==="__v_isReadonly"?e:i==="__v_raw"?s:Reflect.get(l.hasOwn(n,i)&&i in s?n:s,i,o)}const Xs={get:Ct(!1,!1)},Qs={get:Ct(!0,!1)},Zs={get:Ct(!0,!0)};function mn(e,t,n){const s=S(n);if(s!==n&&t.call(e,s)){const i=l.toRawType(e);console.warn(`Reactive ${i} contains both the raw and reactive versions of the same object${i==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}const yn=new WeakMap,eo=new WeakMap,_n=new WeakMap,wn=new WeakMap;function to(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function no(e){return e.__v_skip||!Object.isExtensible(e)?0:to(l.toRawType(e))}function bn(e){return we(e)?e:Ot(e,!1,Ks,Xs,yn)}function vn(e){return Ot(e,!0,js,Qs,_n)}function Ze(e){return Ot(e,!0,Us,Zs,wn)}function Ot(e,t,n,s,i){if(!l.isObject(e))return process.env.NODE_ENV!=="production"&&console.warn(`value cannot be made reactive: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=i.get(e);if(o)return o;const r=no(e);if(r===0)return e;const a=new Proxy(e,r===2?s:n);return i.set(e,a),a}function _e(e){return we(e)?_e(e.__v_raw):!!(e&&e.__v_isReactive)}function we(e){return!!(e&&e.__v_isReadonly)}function Tt(e){return!!(e&&e.__v_isShallow)}function Pt(e){return _e(e)||we(e)}function S(e){const t=e&&e.__v_raw;return t?S(t):e}function En(e){return l.def(e,"__v_skip",!0),e}const Mt=e=>l.isObject(e)?bn(e):e,xt=e=>l.isObject(e)?vn(e):e;function B(e){return!!(e&&e.__v_isRef===!0)}function so(e){return B(e)?e.value:e}const oo={get:(e,t,n)=>so(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const i=e[t];return B(i)&&!B(n)?(i.value=n,!0):Reflect.set(e,t,n,s)}};function io(e){return _e(e)?e:new Proxy(e,oo)}/**
6
- * @vue/runtime-core v3.4.10
5
+ **/function ue(e,...t){console.warn(`[Vue warn] ${e}`,...t)}let N;const At=new WeakSet;class Gs{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,At.has(this)&&(At.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||Xs(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,_n(this),yn(this);const t=N,n=Q;N=this,Q=!0;try{return this.fn()}finally{process.env.NODE_ENV!=="production"&&N!==this&&ue("Active effect was not restored correctly - this is likely a Vue internal bug."),vn(this),N=t,Q=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Rt(t);this.deps=this.depsTail=void 0,_n(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?At.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){$t(this)&&this.run()}get dirty(){return $t(this)}}let mn=0,Re;function Xs(e){e.flags|=8,e.next=Re,Re=e}function It(){mn++}function Ft(){if(--mn>0)return;let e;for(;Re;){let t=Re;for(Re=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function yn(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function vn(e){let t,n=e.depsTail,s=n;for(;s;){const o=s.prevDep;s.version===-1?(s===n&&(n=o),Rt(s),Zs(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=o}e.deps=t,e.depsTail=n}function $t(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Qs(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Qs(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Qe))return;e.globalVersion=Qe;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!$t(e)){e.flags&=-3;return}const n=N,s=Q;N=e,Q=!0;try{yn(e);const o=e.fn(e._value);(t.version===0||a.hasChanged(o,e._value))&&(e._value=o,t.version++)}catch(o){throw t.version++,o}finally{N=n,Q=s,vn(e),e.flags&=-3}}function Rt(e){const{dep:t,prevSub:n,nextSub:s}=e;if(n&&(n.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=n,e.nextSub=void 0),t.subs===e&&(t.subs=n),!t.subs&&t.computed){t.computed.flags&=-5;for(let o=t.computed.deps;o;o=o.nextDep)Rt(o)}}function Zs(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Q=!0;const wn=[];function Le(){wn.push(Q),Q=!1}function He(){const e=wn.pop();Q=e===void 0?!0:e}function _n(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=N;N=void 0;try{t()}finally{N=n}}}let Qe=0;class ei{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class ti{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,process.env.NODE_ENV!=="production"&&(this.subsHead=void 0)}track(t){if(!N||!Q||N===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==N)n=this.activeLink=new ei(N,this),N.deps?(n.prevDep=N.depsTail,N.depsTail.nextDep=n,N.depsTail=n):N.deps=N.depsTail=n,N.flags&4&&bn(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=N.depsTail,n.nextDep=void 0,N.depsTail.nextDep=n,N.depsTail=n,N.deps===n&&(N.deps=s)}return process.env.NODE_ENV!=="production"&&N.onTrack&&N.onTrack(a.extend({effect:N},t)),n}trigger(t){this.version++,Qe++,this.notify(t)}notify(t){It();try{if(process.env.NODE_ENV!=="production")for(let n=this.subsHead;n;n=n.nextSub)n.sub.onTrigger&&!(n.sub.flags&8)&&n.sub.onTrigger(a.extend({effect:n.sub},t));for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ft()}}}function bn(e){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)bn(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),process.env.NODE_ENV!=="production"&&e.dep.subsHead===void 0&&(e.dep.subsHead=e),e.dep.subs=e}const Lt=new WeakMap,Se=Symbol(process.env.NODE_ENV!=="production"?"Object iterate":""),Ht=Symbol(process.env.NODE_ENV!=="production"?"Map keys iterate":""),Be=Symbol(process.env.NODE_ENV!=="production"?"Array iterate":"");function x(e,t,n){if(Q&&N){let s=Lt.get(e);s||Lt.set(e,s=new Map);let o=s.get(n);o||s.set(n,o=new ti),process.env.NODE_ENV!=="production"?o.track({target:e,type:t,key:n}):o.track()}}function ce(e,t,n,s,o,i){const r=Lt.get(e);if(!r){Qe++;return}const l=u=>{u&&(process.env.NODE_ENV!=="production"?u.trigger({target:e,type:t,key:n,newValue:s,oldValue:o,oldTarget:i}):u.trigger())};if(It(),t==="clear")r.forEach(l);else{const u=a.isArray(e),f=u&&a.isIntegerKey(n);if(u&&n==="length"){const p=Number(s);r.forEach((c,d)=>{(d==="length"||d===Be||!a.isSymbol(d)&&d>=p)&&l(c)})}else switch(n!==void 0&&l(r.get(n)),f&&l(r.get(Be)),t){case"add":u?f&&l(r.get("length")):(l(r.get(Se)),a.isMap(e)&&l(r.get(Ht)));break;case"delete":u||(l(r.get(Se)),a.isMap(e)&&l(r.get(Ht)));break;case"set":a.isMap(e)&&l(r.get(Se));break}}Ft()}function Te(e){const t=S(e);return t===e?t:(x(t,"iterate",Be),L(e)?t:t.map(H))}function Ze(e){return x(e=S(e),"iterate",Be),e}const ni={__proto__:null,[Symbol.iterator](){return Bt(this,Symbol.iterator,H)},concat(...e){return Te(this).concat(...e.map(t=>a.isArray(t)?Te(t):t))},entries(){return Bt(this,"entries",e=>(e[1]=H(e[1]),e))},every(e,t){return se(this,"every",e,t,void 0,arguments)},filter(e,t){return se(this,"filter",e,t,n=>n.map(H),arguments)},find(e,t){return se(this,"find",e,t,H,arguments)},findIndex(e,t){return se(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return se(this,"findLast",e,t,H,arguments)},findLastIndex(e,t){return se(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return se(this,"forEach",e,t,void 0,arguments)},includes(...e){return zt(this,"includes",e)},indexOf(...e){return zt(this,"indexOf",e)},join(e){return Te(this).join(e)},lastIndexOf(...e){return zt(this,"lastIndexOf",e)},map(e,t){return se(this,"map",e,t,void 0,arguments)},pop(){return ze(this,"pop")},push(...e){return ze(this,"push",e)},reduce(e,...t){return Sn(this,"reduce",e,t)},reduceRight(e,...t){return Sn(this,"reduceRight",e,t)},shift(){return ze(this,"shift")},some(e,t){return se(this,"some",e,t,void 0,arguments)},splice(...e){return ze(this,"splice",e)},toReversed(){return Te(this).toReversed()},toSorted(e){return Te(this).toSorted(e)},toSpliced(...e){return Te(this).toSpliced(...e)},unshift(...e){return ze(this,"unshift",e)},values(){return Bt(this,"values",H)}};function Bt(e,t,n){const s=Ze(e),o=s[t]();return s!==e&&!L(e)&&(o._next=o.next,o.next=()=>{const i=o._next();return i.value&&(i.value=n(i.value)),i}),o}const si=Array.prototype;function se(e,t,n,s,o,i){const r=Ze(e),l=r!==e&&!L(e),u=r[t];if(u!==si[t]){const c=u.apply(e,i);return l?H(c):c}let f=n;r!==e&&(l?f=function(c,d){return n.call(this,H(c),d,e)}:n.length>2&&(f=function(c,d){return n.call(this,c,d,e)}));const p=u.call(r,f,s);return l&&o?o(p):p}function Sn(e,t,n,s){const o=Ze(e);let i=n;return o!==e&&(L(e)?n.length>3&&(i=function(r,l,u){return n.call(this,r,l,u,e)}):i=function(r,l,u){return n.call(this,r,H(l),u,e)}),o[t](i,...s)}function zt(e,t,n){const s=S(e);x(s,"iterate",Be);const o=s[t](...n);return(o===-1||o===!1)&&lt(n[0])?(n[0]=S(n[0]),s[t](...n)):o}function ze(e,t,n=[]){Le(),It();const s=S(e)[t].apply(e,n);return Ft(),He(),s}const ii=a.makeMap("__proto__,__v_isRef,__isVue"),En=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(a.isSymbol));function oi(e){a.isSymbol(e)||(e=String(e));const t=S(this);return x(t,"has",e),t.hasOwnProperty(e)}class Dn{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const o=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(o?i?kn:Mn:i?vi:Pn).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const r=a.isArray(t);if(!o){let u;if(r&&(u=ni[n]))return u;if(n==="hasOwnProperty")return oi}const l=Reflect.get(t,n,F(t)?t:s);return(a.isSymbol(n)?En.has(n):ii(n))||(o||x(t,"get",n),i)?l:F(l)?r&&a.isIntegerKey(n)?l:l.value:a.isObject(l)?o?In(l):An(l):l}}class ri extends Dn{constructor(t=!1){super(!1,t)}set(t,n,s,o){let i=t[n];if(!this._isShallow){const u=de(i);if(!L(s)&&!de(s)&&(i=S(i),s=S(s)),!a.isArray(t)&&F(i)&&!F(s))return u?!1:(i.value=s,!0)}const r=a.isArray(t)&&a.isIntegerKey(n)?Number(n)<t.length:a.hasOwn(t,n),l=Reflect.set(t,n,s,F(t)?t:o);return t===S(o)&&(r?a.hasChanged(s,i)&&ce(t,"set",n,s,i):ce(t,"add",n,s)),l}deleteProperty(t,n){const s=a.hasOwn(t,n),o=t[n],i=Reflect.deleteProperty(t,n);return i&&s&&ce(t,"delete",n,void 0,o),i}has(t,n){const s=Reflect.has(t,n);return(!a.isSymbol(n)||!En.has(n))&&x(t,"has",n),s}ownKeys(t){return x(t,"iterate",a.isArray(t)?"length":Se),Reflect.ownKeys(t)}}class Nn extends Dn{constructor(t=!1){super(!0,t)}set(t,n){return process.env.NODE_ENV!=="production"&&ue(`Set operation on key "${String(n)}" failed: target is readonly.`,t),!0}deleteProperty(t,n){return process.env.NODE_ENV!=="production"&&ue(`Delete operation on key "${String(n)}" failed: target is readonly.`,t),!0}}const li=new ri,ai=new Nn,ui=new Nn(!0),jt=e=>e,et=e=>Reflect.getPrototypeOf(e);function tt(e,t,n=!1,s=!1){e=e.__v_raw;const o=S(e),i=S(t);n||(a.hasChanged(t,i)&&x(o,"get",t),x(o,"get",i));const{has:r}=et(o),l=s?jt:n?Yt:H;if(r.call(o,t))return l(e.get(t));if(r.call(o,i))return l(e.get(i));e!==o&&e.get(t)}function nt(e,t=!1){const n=this.__v_raw,s=S(n),o=S(e);return t||(a.hasChanged(e,o)&&x(s,"has",e),x(s,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function st(e,t=!1){return e=e.__v_raw,!t&&x(S(e),"iterate",Se),Reflect.get(e,"size",e)}function Vn(e,t=!1){!t&&!L(e)&&!de(e)&&(e=S(e));const n=S(this);return et(n).has.call(n,e)||(n.add(e),ce(n,"add",e,e)),this}function On(e,t,n=!1){!n&&!L(t)&&!de(t)&&(t=S(t));const s=S(this),{has:o,get:i}=et(s);let r=o.call(s,e);r?process.env.NODE_ENV!=="production"&&xn(s,o,e):(e=S(e),r=o.call(s,e));const l=i.call(s,e);return s.set(e,t),r?a.hasChanged(t,l)&&ce(s,"set",e,t,l):ce(s,"add",e,t),this}function Cn(e){const t=S(this),{has:n,get:s}=et(t);let o=n.call(t,e);o?process.env.NODE_ENV!=="production"&&xn(t,n,e):(e=S(e),o=n.call(t,e));const i=s?s.call(t,e):void 0,r=t.delete(e);return o&&ce(t,"delete",e,void 0,i),r}function Tn(){const e=S(this),t=e.size!==0,n=process.env.NODE_ENV!=="production"?a.isMap(e)?new Map(e):new Set(e):void 0,s=e.clear();return t&&ce(e,"clear",void 0,void 0,n),s}function it(e,t){return function(s,o){const i=this,r=i.__v_raw,l=S(r),u=t?jt:e?Yt:H;return!e&&x(l,"iterate",Se),r.forEach((f,p)=>s.call(o,u(f),u(p),i))}}function ot(e,t,n){return function(...s){const o=this.__v_raw,i=S(o),r=a.isMap(i),l=e==="entries"||e===Symbol.iterator&&r,u=e==="keys"&&r,f=o[e](...s),p=n?jt:t?Yt:H;return!t&&x(i,"iterate",u?Ht:Se),{next(){const{value:c,done:d}=f.next();return d?{value:c,done:d}:{value:l?[p(c[0]),p(c[1])]:p(c),done:d}},[Symbol.iterator](){return this}}}}function fe(e){return function(...t){if(process.env.NODE_ENV!=="production"){const n=t[0]?`on key "${t[0]}" `:"";ue(`${a.capitalize(e)} operation ${n}failed: target is readonly.`,S(this))}return e==="delete"?!1:e==="clear"?void 0:this}}function ci(){const e={get(i){return tt(this,i)},get size(){return st(this)},has:nt,add:Vn,set:On,delete:Cn,clear:Tn,forEach:it(!1,!1)},t={get(i){return tt(this,i,!1,!0)},get size(){return st(this)},has:nt,add(i){return Vn.call(this,i,!0)},set(i,r){return On.call(this,i,r,!0)},delete:Cn,clear:Tn,forEach:it(!1,!0)},n={get(i){return tt(this,i,!0)},get size(){return st(this,!0)},has(i){return nt.call(this,i,!0)},add:fe("add"),set:fe("set"),delete:fe("delete"),clear:fe("clear"),forEach:it(!0,!1)},s={get(i){return tt(this,i,!0,!0)},get size(){return st(this,!0)},has(i){return nt.call(this,i,!0)},add:fe("add"),set:fe("set"),delete:fe("delete"),clear:fe("clear"),forEach:it(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=ot(i,!1,!1),n[i]=ot(i,!0,!1),t[i]=ot(i,!1,!0),s[i]=ot(i,!0,!0)}),[e,n,t,s]}const[fi,di,pi,hi]=ci();function Kt(e,t){const n=t?e?hi:pi:e?di:fi;return(s,o,i)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?s:Reflect.get(a.hasOwn(n,o)&&o in s?n:s,o,i)}const gi={get:Kt(!1,!1)},mi={get:Kt(!0,!1)},yi={get:Kt(!0,!0)};function xn(e,t,n){const s=S(n);if(s!==n&&t.call(e,s)){const o=a.toRawType(e);ue(`Reactive ${o} contains both the raw and reactive versions of the same object${o==="Map"?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}const Pn=new WeakMap,vi=new WeakMap,Mn=new WeakMap,kn=new WeakMap;function wi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function _i(e){return e.__v_skip||!Object.isExtensible(e)?0:wi(a.toRawType(e))}function An(e){return de(e)?e:Ut(e,!1,li,gi,Pn)}function In(e){return Ut(e,!0,ai,mi,Mn)}function rt(e){return Ut(e,!0,ui,yi,kn)}function Ut(e,t,n,s,o){if(!a.isObject(e))return process.env.NODE_ENV!=="production"&&ue(`value cannot be made ${t?"readonly":"reactive"}: ${String(e)}`),e;if(e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=o.get(e);if(i)return i;const r=_i(e);if(r===0)return e;const l=new Proxy(e,r===2?s:n);return o.set(e,l),l}function Ee(e){return de(e)?Ee(e.__v_raw):!!(e&&e.__v_isReactive)}function de(e){return!!(e&&e.__v_isReadonly)}function L(e){return!!(e&&e.__v_isShallow)}function lt(e){return e?!!e.__v_raw:!1}function S(e){const t=e&&e.__v_raw;return t?S(t):e}function Fn(e){return!a.hasOwn(e,"__v_skip")&&Object.isExtensible(e)&&a.def(e,"__v_skip",!0),e}const H=e=>a.isObject(e)?An(e):e,Yt=e=>a.isObject(e)?In(e):e;function F(e){return e?e.__v_isRef===!0:!1}function bi(e){return F(e)?e.value:e}const Si={get:(e,t,n)=>t==="__v_raw"?e:bi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const o=e[t];return F(o)&&!F(n)?(o.value=n,!0):Reflect.set(e,t,n,s)}};function Ei(e){return Ee(e)?e:new Proxy(e,Si)}const at={},ut=new WeakMap;let De;function Di(e,t=!1,n=De){if(n){let s=ut.get(n);s||ut.set(n,s=[]),s.push(e)}else process.env.NODE_ENV!=="production"&&!t&&ue("onWatcherCleanup() was called when there was no active watcher to associate with.")}function Ni(e,t,n=a.EMPTY_OBJ){const{immediate:s,deep:o,once:i,scheduler:r,augmentJob:l,call:u}=n,f=_=>{(n.onWarn||ue)("Invalid watch source: ",_,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},p=_=>o?_:L(_)||o===!1||o===0?ie(_,1):ie(_);let c,d,h,y,V=!1,j=!1;if(F(e)?(d=()=>e.value,V=L(e)):Ee(e)?(d=()=>p(e),V=!0):a.isArray(e)?(j=!0,V=e.some(_=>Ee(_)||L(_)),d=()=>e.map(_=>{if(F(_))return _.value;if(Ee(_))return p(_);if(a.isFunction(_))return u?u(_,2):_();process.env.NODE_ENV!=="production"&&f(_)})):a.isFunction(e)?t?d=u?()=>u(e,2):e:d=()=>{if(h){Le();try{h()}finally{He()}}const _=De;De=c;try{return u?u(e,3,[y]):e(y)}finally{De=_}}:(d=a.NOOP,process.env.NODE_ENV!=="production"&&f(e)),t&&o){const _=d,k=o===!0?1/0:o;d=()=>ie(_(),k)}const te=()=>{c.stop()};if(i&&t){const _=t;t=(...k)=>{_(...k),te()}}let G=j?new Array(e.length).fill(at):at;const ne=_=>{if(!(!(c.flags&1)||!c.dirty&&!_))if(t){const k=c.run();if(o||V||(j?k.some((K,ae)=>a.hasChanged(K,G[ae])):a.hasChanged(k,G))){h&&h();const K=De;De=c;try{const ae=[k,G===at?void 0:j&&G[0]===at?[]:G,y];u?u(t,3,ae):t(...ae),G=k}finally{De=K}}}else c.run()};return l&&l(ne),c=new Gs(d),c.scheduler=r?()=>r(ne,!1):ne,y=_=>Di(_,!1,c),h=c.onStop=()=>{const _=ut.get(c);if(_){if(u)u(_,4);else for(const k of _)k();ut.delete(c)}},process.env.NODE_ENV!=="production"&&(c.onTrack=n.onTrack,c.onTrigger=n.onTrigger),t?s?ne(!0):G=c.run():r?r(ne.bind(null,!0),!0):c.run(),te.pause=c.pause.bind(c),te.resume=c.resume.bind(c),te.stop=te,te}function ie(e,t=1/0,n){if(t<=0||!a.isObject(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,F(e))ie(e.value,t,n);else if(a.isArray(e))for(let s=0;s<e.length;s++)ie(e[s],t,n);else if(a.isSet(e)||a.isMap(e))e.forEach(s=>{ie(s,t,n)});else if(a.isPlainObject(e)){for(const s in e)ie(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&ie(e[s],t,n)}return e}/**
6
+ * @vue/runtime-core v3.5.6
7
7
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
8
8
  * @license MIT
9
- **/const be=[];function ro(e){be.push(e)}function lo(){be.pop()}function v(e,...t){Ue();const n=be.length?be[be.length-1].component:null,s=n&&n.appContext.config.warnHandler,i=ao();if(s)ve(s,n,11,[e+t.join(""),n&&n.proxy,i.map(({vnode:o})=>`at <${os(n,o.type)}>`).join(`
10
- `),i]);else{const o=[`[Vue warn]: ${e}`,...t];i.length&&o.push(`
11
- `,...uo(i)),console.warn(...o)}Ye()}function ao(){let e=be[be.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const s=e.component&&e.component.parent;e=s&&s.vnode}return t}function uo(e){const t=[];return e.forEach((n,s)=>{t.push(...s===0?[]:[`
12
- `],...co(n))}),t}function co({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",s=e.component?e.component.parent==null:!1,i=` at <${os(e.component,e.type,s)}`,o=">"+n;return e.props?[i,...fo(e.props),o]:[i+o]}function fo(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(s=>{t.push(...Sn(s,e[s]))}),n.length>3&&t.push(" ..."),t}function Sn(e,t,n){return l.isString(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:B(t)?(t=Sn(e,S(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):l.isFunction(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=S(t),n?t:[`${e}=`,t])}function po(e,t){process.env.NODE_ENV!=="production"&&e!==void 0&&(typeof e!="number"?v(`${t} is not a valid number - got ${JSON.stringify(e)}.`):isNaN(e)&&v(`${t} is NaN - the duration expression might be incorrect.`))}const kt={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush. This is likely a Vue internals bug. Please open an issue at https://github.com/vuejs/core ."};function ve(e,t,n,s){let i;try{i=s?e(...s):e()}catch(o){Ft(o,t,n)}return i}function Ve(e,t,n,s){if(l.isFunction(e)){const o=ve(e,t,n,s);return o&&l.isPromise(o)&&o.catch(r=>{Ft(r,t,n)}),o}const i=[];for(let o=0;o<e.length;o++)i.push(Ve(e[o],t,n,s));return i}function Ft(e,t,n,s=!0){const i=t?t.vnode:null;if(t){let o=t.parent;const r=t.proxy,a=process.env.NODE_ENV!=="production"?kt[n]:`https://vuejs.org/errors/#runtime-${n}`;for(;o;){const f=o.ec;if(f){for(let d=0;d<f.length;d++)if(f[d](e,r,a)===!1)return}o=o.parent}const c=t.appContext.config.errorHandler;if(c){ve(c,null,10,[e,r,a]);return}}ho(e,n,i,s)}function ho(e,t,n,s=!0){if(process.env.NODE_ENV!=="production"){const i=kt[t];if(n&&ro(n),v(`Unhandled error${i?` during execution of ${i}`:""}`),n&&lo(),s)throw e;console.error(e)}else console.error(e)}let et=!1,At=!1;const Y=[];let re=0;const De=[];let Q=null,le=0;const Nn=Promise.resolve();let It=null;const go=100;function mo(e){const t=It||Nn;return e?t.then(this?e.bind(this):e):t}function yo(e){let t=re+1,n=Y.length;for(;t<n;){const s=t+n>>>1,i=Y[s],o=Ie(i);o<e||o===e&&i.pre?t=s+1:n=s}return t}function $t(e){(!Y.length||!Y.includes(e,et&&e.allowRecurse?re+1:re))&&(e.id==null?Y.push(e):Y.splice(yo(e.id),0,e),Vn())}function Vn(){!et&&!At&&(At=!0,It=Nn.then(Cn))}function Dn(e){l.isArray(e)?De.push(...e):(!Q||!Q.includes(e,e.allowRecurse?le+1:le))&&De.push(e),Vn()}function _o(e){if(De.length){const t=[...new Set(De)].sort((n,s)=>Ie(n)-Ie(s));if(De.length=0,Q){Q.push(...t);return}for(Q=t,process.env.NODE_ENV!=="production"&&(e=e||new Map),le=0;le<Q.length;le++)process.env.NODE_ENV!=="production"&&On(e,Q[le])||Q[le]();Q=null,le=0}}const Ie=e=>e.id==null?1/0:e.id,wo=(e,t)=>{const n=Ie(e)-Ie(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Cn(e){At=!1,et=!0,process.env.NODE_ENV!=="production"&&(e=e||new Map),Y.sort(wo);const t=process.env.NODE_ENV!=="production"?n=>On(e,n):l.NOOP;try{for(re=0;re<Y.length;re++){const n=Y[re];if(n&&n.active!==!1){if(process.env.NODE_ENV!=="production"&&t(n))continue;ve(n,null,14)}}}finally{re=0,Y.length=0,_o(e),et=!1,It=null,(Y.length||De.length)&&Cn(e)}}function On(e,t){if(!e.has(t))e.set(t,1);else{const n=e.get(t);if(n>go){const s=t.ownerInstance,i=s&&Jt(s.type);return Ft(`Maximum recursive updates exceeded${i?` in component <${i}>`:""}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,null,10),!0}else e.set(t,n+1)}}const Ce=new Set;process.env.NODE_ENV!=="production"&&(l.getGlobalThis().__VUE_HMR_RUNTIME__={createRecord:Rt(bo),rerender:Rt(vo),reload:Rt(Eo)});const tt=new Map;function bo(e,t){return tt.has(e)?!1:(tt.set(e,{initialDef:$e(t),instances:new Set}),!0)}function $e(e){return is(e)?e.__vccOpts:e}function vo(e,t){const n=tt.get(e);n&&(n.initialDef.render=t,[...n.instances].forEach(s=>{t&&(s.render=t,$e(s.type).render=t),s.renderCache=[],s.effect.dirty=!0,s.update()}))}function Eo(e,t){const n=tt.get(e);if(!n)return;t=$e(t),Tn(n.initialDef,t);const s=[...n.instances];for(const i of s){const o=$e(i.type);Ce.has(o)||(o!==n.initialDef&&Tn(o,t),Ce.add(o)),i.appContext.propsCache.delete(i.type),i.appContext.emitsCache.delete(i.type),i.appContext.optionsCache.delete(i.type),i.ceReload?(Ce.add(o),i.ceReload(t.styles),Ce.delete(o)):i.parent?(i.parent.effect.dirty=!0,$t(i.parent.update)):i.appContext.reload?i.appContext.reload():typeof window<"u"?window.location.reload():console.warn("[HMR] Root or manually mounted instance modified. Full reload required.")}Dn(()=>{for(const i of s)Ce.delete($e(i.type))})}function Tn(e,t){l.extend(e,t);for(const n in e)n!=="__file"&&!(n in t)&&delete e[n]}function Rt(e){return(t,n)=>{try{return e(t,n)}catch(s){console.error(s),console.warn("[HMR] Something went wrong during Vue component hot-reload. Full reload required.")}}}let ae,Re=[],Lt=!1;function So(e,...t){ae?ae.emit(e,...t):Lt||Re.push({event:e,args:t})}function Pn(e,t){var n,s;ae=e,ae?(ae.enabled=!0,Re.forEach(({event:i,args:o})=>ae.emit(i,...o)),Re=[]):typeof window<"u"&&window.HTMLElement&&!((s=(n=window.navigator)==null?void 0:n.userAgent)!=null&&s.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(o=>{Pn(o,t)}),setTimeout(()=>{ae||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,Lt=!0,Re=[])},3e3)):(Lt=!0,Re=[])}const No=Vo("component:updated");function Vo(e){return t=>{So(e,t.appContext.app,t.uid,t.parent?t.parent.uid:void 0,t)}}let D=null,Mn=null;function xn(e){const t=D;return D=e,Mn=e&&e.type.__scopeId||null,t}function H(e,t=D,n){if(!t||e._n)return e;const s=(...i)=>{s._d&&Wn(-1);const o=xn(t);let r;try{r=e(...i)}finally{xn(o),s._d&&Wn(1)}return process.env.NODE_ENV!=="production"&&No(t),r};return s._n=!0,s._c=!0,s._d=!0,s}function Vr(){}const Bt="components";function W(e,t){return Co(Bt,e,!0,t)||e}const Do=Symbol.for("v-ndc");function Co(e,t,n=!0,s=!1){const i=D||fe;if(i){const o=i.type;if(e===Bt){const a=Jt(o,!1);if(a&&(a===t||a===l.camelize(t)||a===l.capitalize(l.camelize(t))))return o}const r=kn(i[e]||o[e],t)||kn(i.appContext[e],t);if(!r&&s)return o;if(process.env.NODE_ENV!=="production"&&n&&!r){const a=e===Bt?`
13
- If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.`:"";v(`Failed to resolve ${e.slice(0,-1)}: ${t}${a}`)}return r}else process.env.NODE_ENV!=="production"&&v(`resolve${l.capitalize(e.slice(0,-1))} can only be used in render() or setup().`)}function kn(e,t){return e&&(e[t]||e[l.camelize(t)]||e[l.capitalize(l.camelize(t))])}const Oo=e=>e.__isSuspense;function To(e,t){t&&t.pendingBranch?l.isArray(e)?t.effects.push(...e):t.effects.push(e):Dn(e)}const Po=Symbol.for("v-scx"),Mo=()=>{{const e=Jo(Po);return e||process.env.NODE_ENV!=="production"&&v("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}},nt={};function xo(e,t,{immediate:n,deep:s,flush:i,once:o,onTrack:r,onTrigger:a}=l.EMPTY_OBJ){if(t&&o){const E=t;t=(...ne)=>{E(...ne),z()}}process.env.NODE_ENV!=="production"&&s!==void 0&&typeof s=="number"&&v('watch() "deep" option with number value will be used as watch depth in future versions. Please use a boolean instead to avoid potential breakage.'),process.env.NODE_ENV!=="production"&&!t&&(n!==void 0&&v('watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.'),s!==void 0&&v('watch() "deep" option is only respected when using the watch(source, callback, options?) signature.'),o!==void 0&&v('watch() "once" option is only respected when using the watch(source, callback, options?) signature.'));const c=E=>{v("Invalid watch source: ",E,"A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.")},f=fe,d=E=>s===!0?E:Ee(E,s===!1?1:void 0);let u,p=!1,h=!1;if(B(e)?(u=()=>e.value,p=Tt(e)):_e(e)?(u=()=>d(e),p=!0):l.isArray(e)?(h=!0,p=e.some(E=>_e(E)||Tt(E)),u=()=>e.map(E=>{if(B(E))return E.value;if(_e(E))return d(E);if(l.isFunction(E))return ve(E,f,2);process.env.NODE_ENV!=="production"&&c(E)})):l.isFunction(e)?t?u=()=>ve(e,f,2):u=()=>(y&&y(),Ve(e,f,3,[b])):(u=l.NOOP,process.env.NODE_ENV!=="production"&&c(e)),t&&s){const E=u;u=()=>Ee(E())}let y,b=E=>{y=C.onStop=()=>{ve(E,f,4),y=C.onStop=void 0}},A;if(qt)if(b=l.NOOP,t?n&&Ve(t,f,3,[u(),h?[]:void 0,b]):u(),i==="sync"){const E=Mo();A=E.__watcherHandles||(E.__watcherHandles=[])}else return l.NOOP;let R=h?new Array(e.length).fill(nt):nt;const L=()=>{if(!(!C.active||!C.dirty))if(t){const E=C.run();(s||p||(h?E.some((ne,N)=>l.hasChanged(ne,R[N])):l.hasChanged(E,R)))&&(y&&y(),Ve(t,f,3,[E,R===nt?void 0:h&&R[0]===nt?[]:R,b]),R=E)}else C.run()};L.allowRecurse=!!t;let G;i==="sync"?G=L:i==="post"?G=()=>Yn(L,f&&f.suspense):(L.pre=!0,f&&(L.id=f.uid),G=()=>$t(L));const C=new Fs(u,l.NOOP,G),z=()=>{C.stop()};return process.env.NODE_ENV!=="production"&&(C.onTrack=r,C.onTrigger=a),t?n?L():R=C.run():i==="post"?Yn(C.run.bind(C),f&&f.suspense):C.run(),A&&A.push(z),z}function ko(e,t,n){const s=this.proxy,i=l.isString(e)?e.includes(".")?Fo(s,e):()=>s[e]:e.bind(s,s);let o;l.isFunction(t)?o=t:(o=t.handler,n=t);const r=ts(this),a=xo(i,o.bind(s),n);return r(),a}function Fo(e,t){const n=t.split(".");return()=>{let s=e;for(let i=0;i<n.length&&s;i++)s=s[n[i]];return s}}function Ee(e,t,n=0,s){if(!l.isObject(e)||e.__v_skip)return e;if(t&&t>0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),B(e))Ee(e.value,t,n,s);else if(l.isArray(e))for(let i=0;i<e.length;i++)Ee(e[i],t,n,s);else if(l.isSet(e)||l.isMap(e))e.forEach(i=>{Ee(i,t,n,s)});else if(l.isPlainObject(e))for(const i in e)Ee(e[i],t,n,s);return e}function st(e,t){if(D===null)return process.env.NODE_ENV!=="production"&&v("withDirectives can only be used inside render functions."),e;const n=ss(D)||D.proxy,s=e.dirs||(e.dirs=[]);for(let i=0;i<t.length;i++){let[o,r,a,c=l.EMPTY_OBJ]=t[i];o&&(l.isFunction(o)&&(o={mounted:o,updated:o}),o.deep&&Ee(r),s.push({dir:o,instance:n,value:r,oldValue:void 0,arg:a,modifiers:c}))}return e}const ue=Symbol("_leaveCb"),ot=Symbol("_enterCb");function Ao(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Lo(()=>{e.isMounted=!0}),Bo(()=>{e.isUnmounting=!0}),e}const K=[Function,Array],Fn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:K,onEnter:K,onAfterEnter:K,onEnterCancelled:K,onBeforeLeave:K,onLeave:K,onAfterLeave:K,onLeaveCancelled:K,onBeforeAppear:K,onAppear:K,onAfterAppear:K,onAppearCancelled:K},Io={name:"BaseTransition",props:Fn,setup(e,{slots:t}){const n=es(),s=Ao();let i;return()=>{const o=t.default&&$n(t.default(),!0);if(!o||!o.length)return;let r=o[0];if(o.length>1){let b=!1;for(const A of o)if(A.type!==Z){if(process.env.NODE_ENV!=="production"&&b){v("<transition> can only be used on a single element or component. Use <transition-group> for lists.");break}if(r=A,b=!0,process.env.NODE_ENV==="production")break}}const a=S(e),{mode:c}=a;if(process.env.NODE_ENV!=="production"&&c&&c!=="in-out"&&c!=="out-in"&&c!=="default"&&v(`invalid <transition> mode: ${c}`),s.isLeaving)return zt(r);const f=In(r);if(!f)return zt(r);const d=Ht(f,a,s,n);Kt(f,d);const u=n.subTree,p=u&&In(u);let h=!1;const{getTransitionKey:y}=f.type;if(y){const b=y();i===void 0?i=b:b!==i&&(i=b,h=!0)}if(p&&p.type!==Z&&(!Jn(f,p)||h)){const b=Ht(p,a,s,n);if(Kt(p,b),c==="out-in")return s.isLeaving=!0,b.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},zt(r);c==="in-out"&&f.type!==Z&&(b.delayLeave=(A,R,L)=>{const G=An(s,p);G[String(p.key)]=p,A[ue]=()=>{R(),A[ue]=void 0,delete d.delayedLeave},d.delayedLeave=L})}return r}}};function An(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Ht(e,t,n,s){const{appear:i,mode:o,persisted:r=!1,onBeforeEnter:a,onEnter:c,onAfterEnter:f,onEnterCancelled:d,onBeforeLeave:u,onLeave:p,onAfterLeave:h,onLeaveCancelled:y,onBeforeAppear:b,onAppear:A,onAfterAppear:R,onAppearCancelled:L}=t,G=String(e.key),C=An(n,e),z=(N,P)=>{N&&Ve(N,s,9,P)},E=(N,P)=>{const k=P[1];z(N,P),l.isArray(N)?N.every(X=>X.length<=1)&&k():N.length<=1&&k()},ne={mode:o,persisted:r,beforeEnter(N){let P=a;if(!n.isMounted)if(i)P=b||a;else return;N[ue]&&N[ue](!0);const k=C[G];k&&Jn(e,k)&&k.el[ue]&&k.el[ue](),z(P,[N])},enter(N){let P=c,k=f,X=d;if(!n.isMounted)if(i)P=A||c,k=R||f,X=L||d;else return;let g=!1;const M=N[ot]=se=>{g||(g=!0,se?z(X,[N]):z(k,[N]),ne.delayedLeave&&ne.delayedLeave(),N[ot]=void 0)};P?E(P,[N,M]):M()},leave(N,P){const k=String(e.key);if(N[ot]&&N[ot](!0),n.isUnmounting)return P();z(u,[N]);let X=!1;const g=N[ue]=M=>{X||(X=!0,P(),M?z(y,[N]):z(h,[N]),N[ue]=void 0,C[k]===e&&delete C[k])};C[k]=e,p?E(p,[N,g]):g()},clone(N){return Ht(N,t,n,s)}};return ne}function zt(e){if(Rn(e))return e=Te(e),e.children=null,e}function In(e){return Rn(e)?process.env.NODE_ENV!=="production"&&e.component?e.component.subTree:e.children?e.children[0]:void 0:e}function Kt(e,t){e.shapeFlag&6&&e.component?Kt(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function $n(e,t=!1,n){let s=[],i=0;for(let o=0;o<e.length;o++){let r=e[o];const a=n==null?r.key:String(n)+String(r.key!=null?r.key:o);r.type===O?(r.patchFlag&128&&i++,s=s.concat($n(r.children,t,a))):(t||r.type!==Z)&&s.push(a!=null?Te(r,{key:a}):r)}if(i>1)for(let o=0;o<s.length;o++)s[o].patchFlag=-2;return s}const $o=e=>!!e.type.__asyncLoader,Rn=e=>e.type.__isKeepAlive;function Ro(e,t,n=fe,s=!1){if(n){const i=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...r)=>{if(n.isUnmounted)return;Ue();const a=ts(n),c=Ve(t,n,e,r);return a(),Ye(),c});return s?i.unshift(o):i.push(o),o}else if(process.env.NODE_ENV!=="production"){const i=l.toHandlerKey(kt[e].replace(/ hook$/,""));v(`${i} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`)}}const Ln=e=>(t,n=fe)=>(!qt||e==="sp")&&Ro(e,(...s)=>t(...s),n),Lo=Ln("m"),Bo=Ln("bum");function ce(e,t,n,s){let i;const o=n&&n[s];if(l.isArray(e)||l.isString(e)){i=new Array(e.length);for(let r=0,a=e.length;r<a;r++)i[r]=t(e[r],r,void 0,o&&o[r])}else if(typeof e=="number"){process.env.NODE_ENV!=="production"&&!Number.isInteger(e)&&v(`The v-for range expect an integer value but got ${e}.`),i=new Array(e);for(let r=0;r<e;r++)i[r]=t(r+1,r,void 0,o&&o[r])}else if(l.isObject(e))if(e[Symbol.iterator])i=Array.from(e,(r,a)=>t(r,a,void 0,o&&o[a]));else{const r=Object.keys(e);i=new Array(r.length);for(let a=0,c=r.length;a<c;a++){const f=r[a];i[a]=t(e[f],f,a,o&&o[a])}}else i=[];return n&&(n[s]=i),i}function T(e,t,n={},s,i){if(D.isCE||D.parent&&$o(D.parent)&&D.parent.isCE)return t!=="default"&&(n.name=t),F("slot",n,s&&s());let o=e[t];process.env.NODE_ENV!=="production"&&o&&o.length>1&&(v("SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."),o=()=>[]),o&&o._c&&(o._d=!1),m();const r=o&&Bn(o(n)),a=Oe(O,{key:n.key||r&&r.key||`_${t}`},r||(s?s():[]),r&&e._===1?64:-2);return!i&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),o&&o._c&&(o._d=!0),a}function Bn(e){return e.some(t=>lt(t)?!(t.type===Z||t.type===O&&!Bn(t.children)):!0)?e:null}const jt=e=>e?ti(e)?ss(e)||e.proxy:jt(e.parent):null,Le=l.extend(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>process.env.NODE_ENV!=="production"?Ze(e.props):e.props,$attrs:e=>process.env.NODE_ENV!=="production"?Ze(e.attrs):e.attrs,$slots:e=>process.env.NODE_ENV!=="production"?Ze(e.slots):e.slots,$refs:e=>process.env.NODE_ENV!=="production"?Ze(e.refs):e.refs,$parent:e=>jt(e.parent),$root:e=>jt(e.root),$emit:e=>e.emit,$options:e=>Uo(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,$t(e.update)}),$nextTick:e=>e.n||(e.n=mo.bind(e.proxy)),$watch:e=>ko.bind(e)}),Ho=e=>e==="_"||e==="$",Ut=(e,t)=>e!==l.EMPTY_OBJ&&!e.__isScriptSetup&&l.hasOwn(e,t),zo={get({_:e},t){const{ctx:n,setupState:s,data:i,props:o,accessCache:r,type:a,appContext:c}=e;if(process.env.NODE_ENV!=="production"&&t==="__isVue")return!0;let f;if(t[0]!=="$"){const h=r[t];if(h!==void 0)switch(h){case 1:return s[t];case 2:return i[t];case 4:return n[t];case 3:return o[t]}else{if(Ut(s,t))return r[t]=1,s[t];if(i!==l.EMPTY_OBJ&&l.hasOwn(i,t))return r[t]=2,i[t];if((f=e.propsOptions[0])&&l.hasOwn(f,t))return r[t]=3,o[t];if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];r[t]=0}}const d=Le[t];let u,p;if(d)return t==="$attrs"?(x(e,"get",t),process.env.NODE_ENV!=="production"&&void 0):process.env.NODE_ENV!=="production"&&t==="$slots"&&x(e,"get",t),d(e);if((u=a.__cssModules)&&(u=u[t]))return u;if(n!==l.EMPTY_OBJ&&l.hasOwn(n,t))return r[t]=4,n[t];if(p=c.config.globalProperties,l.hasOwn(p,t))return p[t];process.env.NODE_ENV!=="production"&&D&&(!l.isString(t)||t.indexOf("__v")!==0)&&(i!==l.EMPTY_OBJ&&Ho(t[0])&&l.hasOwn(i,t)?v(`Property ${JSON.stringify(t)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`):e===D&&v(`Property ${JSON.stringify(t)} was accessed during render but is not defined on instance.`))},set({_:e},t,n){const{data:s,setupState:i,ctx:o}=e;return Ut(i,t)?(i[t]=n,!0):process.env.NODE_ENV!=="production"&&i.__isScriptSetup&&l.hasOwn(i,t)?(v(`Cannot mutate <script setup> binding "${t}" from Options API.`),!1):s!==l.EMPTY_OBJ&&l.hasOwn(s,t)?(s[t]=n,!0):l.hasOwn(e.props,t)?(process.env.NODE_ENV!=="production"&&v(`Attempting to mutate prop "${t}". Props are readonly.`),!1):t[0]==="$"&&t.slice(1)in e?(process.env.NODE_ENV!=="production"&&v(`Attempting to mutate public property "${t}". Properties starting with $ are reserved and readonly.`),!1):(process.env.NODE_ENV!=="production"&&t in e.appContext.config.globalProperties?Object.defineProperty(o,t,{enumerable:!0,configurable:!0,value:n}):o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:i,propsOptions:o}},r){let a;return!!n[r]||e!==l.EMPTY_OBJ&&l.hasOwn(e,r)||Ut(t,r)||(a=o[0])&&l.hasOwn(a,r)||l.hasOwn(s,r)||l.hasOwn(Le,r)||l.hasOwn(i.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:l.hasOwn(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};process.env.NODE_ENV!=="production"&&(zo.ownKeys=e=>(v("Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead."),Reflect.ownKeys(e)));function Ko(){return jo().slots}function jo(){const e=es();return process.env.NODE_ENV!=="production"&&!e&&v("useContext() called without active instance."),e.setupContext||(e.setupContext=si(e))}function Hn(e){return l.isArray(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Uo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:i,optionsCache:o,config:{optionMergeStrategies:r}}=e.appContext,a=o.get(t);let c;return a?c=a:!i.length&&!n&&!s?c=t:(c={},i.length&&i.forEach(f=>it(c,f,r,!0)),it(c,t,r)),l.isObject(t)&&o.set(t,c),c}function it(e,t,n,s=!1){const{mixins:i,extends:o}=t;o&&it(e,o,n,!0),i&&i.forEach(r=>it(e,r,n,!0));for(const r in t)if(s&&r==="expose")process.env.NODE_ENV!=="production"&&v('"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.');else{const a=Yo[r]||n&&n[r];e[r]=a?a(e[r],t[r]):t[r]}return e}const Yo={data:zn,props:jn,emits:jn,methods:Be,computed:Be,beforeCreate:I,created:I,beforeMount:I,mounted:I,beforeUpdate:I,updated:I,beforeDestroy:I,beforeUnmount:I,destroyed:I,unmounted:I,activated:I,deactivated:I,errorCaptured:I,serverPrefetch:I,components:Be,directives:Be,watch:qo,provide:zn,inject:Wo};function zn(e,t){return t?e?function(){return l.extend(l.isFunction(e)?e.call(this,this):e,l.isFunction(t)?t.call(this,this):t)}:t:e}function Wo(e,t){return Be(Kn(e),Kn(t))}function Kn(e){if(l.isArray(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function I(e,t){return e?[...new Set([].concat(e,t))]:t}function Be(e,t){return e?l.extend(Object.create(null),e,t):t}function jn(e,t){return e?l.isArray(e)&&l.isArray(t)?[...new Set([...e,...t])]:l.extend(Object.create(null),Hn(e),Hn(t??{})):t}function qo(e,t){if(!e)return t;if(!t)return e;const n=l.extend(Object.create(null),e);for(const s in t)n[s]=I(e[s],t[s]);return n}let Un=null;function Jo(e,t,n=!1){const s=fe||D;if(s||Un){const i=s?s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:Un._context.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&l.isFunction(t)?t.call(s&&s.proxy):t;process.env.NODE_ENV!=="production"&&v(`injection "${String(e)}" not found.`)}else process.env.NODE_ENV!=="production"&&v("inject() can only be used inside setup() or functional components.")}const Yn=To,Go=e=>e.__isTeleport,O=Symbol.for("v-fgt"),Xo=Symbol.for("v-txt"),Z=Symbol.for("v-cmt"),rt=[];let q=null;function m(e=!1){rt.push(q=e?null:[])}function Qo(){rt.pop(),q=rt[rt.length-1]||null}let He=1;function Wn(e){He+=e}function qn(e){return e.dynamicChildren=He>0?q||l.EMPTY_ARR:null,Qo(),He>0&&q&&q.push(e),e}function w(e,t,n,s,i,o){return qn(_(e,t,n,s,i,o,!0))}function Oe(e,t,n,s,i){return qn(F(e,t,n,s,i,!0))}function lt(e){return e?e.__v_isVNode===!0:!1}function Jn(e,t){return process.env.NODE_ENV!=="production"&&t.shapeFlag&6&&Ce.has(t.type)?(e.shapeFlag&=-257,t.shapeFlag&=-513,!1):e.type===t.type&&e.key===t.key}const Zo=(...e)=>Qn(...e),Gn="__vInternal",Xn=({key:e})=>e??null,at=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?l.isString(e)||B(e)||l.isFunction(e)?{i:D,r:e,k:t,f:!!n}:e:null);function _(e,t=null,n=null,s=0,i=null,o=e===O?0:1,r=!1,a=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Xn(t),ref:t&&at(t),scopeId:Mn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:D};return a?(Yt(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=l.isString(n)?8:16),process.env.NODE_ENV!=="production"&&c.key!==c.key&&v("VNode created with invalid key (NaN). VNode type:",c.type),He>0&&!r&&q&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&q.push(c),c}const F=process.env.NODE_ENV!=="production"?Zo:Qn;function Qn(e,t=null,n=null,s=0,i=null,o=!1){if((!e||e===Do)&&(process.env.NODE_ENV!=="production"&&!e&&v(`Invalid vnode type when creating vnode: ${e}.`),e=Z),lt(e)){const a=Te(e,t,!0);return n&&Yt(a,n),He>0&&!o&&q&&(a.shapeFlag&6?q[q.indexOf(e)]=a:q.push(a)),a.patchFlag|=-2,a}if(is(e)&&(e=e.__vccOpts),t){t=ei(t);let{class:a,style:c}=t;a&&!l.isString(a)&&(t.class=l.normalizeClass(a)),l.isObject(c)&&(Pt(c)&&!l.isArray(c)&&(c=l.extend({},c)),t.style=l.normalizeStyle(c))}const r=l.isString(e)?1:Oo(e)?128:Go(e)?64:l.isObject(e)?4:l.isFunction(e)?2:0;return process.env.NODE_ENV!=="production"&&r&4&&Pt(e)&&(e=S(e),v("Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.",`
14
- Component that was made reactive: `,e)),_(e,t,n,s,i,r,o,!0)}function ei(e){return e?Pt(e)||Gn in e?l.extend({},e):e:null}function Te(e,t,n=!1){const{props:s,ref:i,patchFlag:o,children:r}=e,a=t?J(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&Xn(a),ref:t&&t.ref?n&&i?l.isArray(i)?i.concat(at(t)):[i,at(t)]:at(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:process.env.NODE_ENV!=="production"&&o===-1&&l.isArray(r)?r.map(Zn):r,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==O?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Te(e.ssContent),ssFallback:e.ssFallback&&Te(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Zn(e){const t=Te(e);return l.isArray(e.children)&&(t.children=e.children.map(Zn)),t}function ut(e=" ",t=0){return F(Xo,null,e,t)}function j(e="",t=!1){return t?(m(),Oe(Z,null,e)):F(Z,null,e)}function Yt(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(l.isArray(t))n=16;else if(typeof t=="object")if(s&65){const i=t.default;i&&(i._c&&(i._d=!1),Yt(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!(Gn in t)?t._ctx=D:i===3&&D&&(D.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else l.isFunction(t)?(t={default:t,_ctx:D},n=32):(t=String(t),s&64?(n=16,t=[ut(t)]):n=8);e.children=t,e.shapeFlag|=n}function J(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const i in s)if(i==="class")t.class!==s.class&&(t.class=l.normalizeClass([t.class,s.class]));else if(i==="style")t.style=l.normalizeStyle([t.style,s.style]);else if(l.isOn(i)){const o=t[i],r=s[i];r&&o!==r&&!(l.isArray(o)&&o.includes(r))&&(t[i]=o?[].concat(o,r):r)}else i!==""&&(t[i]=s[i])}return t}let fe=null;const es=()=>fe||D;let Wt;{const e=l.getGlobalThis(),t=(n,s)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(s),o=>{i.length>1?i.forEach(r=>r(o)):i[0](o)}};Wt=t("__VUE_INSTANCE_SETTERS__",n=>fe=n),t("__VUE_SSR_SETTERS__",n=>qt=n)}const ts=e=>{const t=fe;return Wt(e),e.scope.on(),()=>{e.scope.off(),Wt(t)}};function ti(e){return e.vnode.shapeFlag&4}let qt=!1;function ns(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,process.env.NODE_ENV!=="production"?{get(t,n){return x(e,"get","$attrs"),t[n]},set(){return v("setupContext.attrs is readonly."),!1},deleteProperty(){return v("setupContext.attrs is readonly."),!1}}:{get(t,n){return x(e,"get","$attrs"),t[n]}}))}function ni(e){return e.slotsProxy||(e.slotsProxy=new Proxy(e.slots,{get(t,n){return x(e,"get","$slots"),t[n]}}))}function si(e){const t=n=>{if(process.env.NODE_ENV!=="production"&&(e.exposed&&v("expose() should be called only once per setup()."),n!=null)){let s=typeof n;s==="object"&&(l.isArray(n)?s="array":B(n)&&(s="ref")),s!=="object"&&v(`expose() should be passed a plain object, received ${s}.`)}e.exposed=n||{}};return process.env.NODE_ENV!=="production"?Object.freeze({get attrs(){return ns(e)},get slots(){return ni(e)},get emit(){return(n,...s)=>e.emit(n,...s)},expose:t}):{get attrs(){return ns(e)},slots:e.slots,emit:e.emit,expose:t}}function ss(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(io(En(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Le)return Le[n](e)},has(t,n){return n in t||n in Le}}))}const oi=/(?:^|[-_])(\w)/g,ii=e=>e.replace(oi,t=>t.toUpperCase()).replace(/[-_]/g,"");function Jt(e,t=!0){return l.isFunction(e)?e.displayName||e.name:e.name||t&&e.__name}function os(e,t,n=!1){let s=Jt(t);if(!s&&t.__file){const i=t.__file.match(/([^/\\]+)\.\w+$/);i&&(s=i[1])}if(!s&&e&&e.parent){const i=o=>{for(const r in o)if(o[r]===t)return r};s=i(e.components||e.parent.type.components)||i(e.appContext.components)}return s?ii(s):n?"App":"Anonymous"}function is(e){return l.isFunction(e)&&"__vccOpts"in e}function rs(e,t,n){const s=arguments.length;return s===2?l.isObject(t)&&!l.isArray(t)?lt(t)?F(e,null,[t]):F(e,t):F(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&lt(n)&&(n=[n]),F(e,t,n))}function Gt(e){return!!(e&&e.__v_isShallow)}function ri(){if(process.env.NODE_ENV==="production"||typeof window>"u")return;const e={style:"color:#3ba776"},t={style:"color:#1677ff"},n={style:"color:#f5222d"},s={style:"color:#eb2f96"},i={header(u){return l.isObject(u)?u.__isVue?["div",e,"VueInstance"]:B(u)?["div",{},["span",e,d(u)],"<",a(u.value),">"]:_e(u)?["div",{},["span",e,Gt(u)?"ShallowReactive":"Reactive"],"<",a(u),`>${we(u)?" (readonly)":""}`]:we(u)?["div",{},["span",e,Gt(u)?"ShallowReadonly":"Readonly"],"<",a(u),">"]:null:null},hasBody(u){return u&&u.__isVue},body(u){if(u&&u.__isVue)return["div",{},...o(u.$)]}};function o(u){const p=[];u.type.props&&u.props&&p.push(r("props",S(u.props))),u.setupState!==l.EMPTY_OBJ&&p.push(r("setup",u.setupState)),u.data!==l.EMPTY_OBJ&&p.push(r("data",S(u.data)));const h=c(u,"computed");h&&p.push(r("computed",h));const y=c(u,"inject");return y&&p.push(r("injected",y)),p.push(["div",{},["span",{style:s.style+";opacity:0.66"},"$ (internal): "],["object",{object:u}]]),p}function r(u,p){return p=l.extend({},p),Object.keys(p).length?["div",{style:"line-height:1.25em;margin-bottom:0.6em"},["div",{style:"color:#476582"},u],["div",{style:"padding-left:1.25em"},...Object.keys(p).map(h=>["div",{},["span",s,h+": "],a(p[h],!1)])]]:["span",{}]}function a(u,p=!0){return typeof u=="number"?["span",t,u]:typeof u=="string"?["span",n,JSON.stringify(u)]:typeof u=="boolean"?["span",s,u]:l.isObject(u)?["object",{object:p?S(u):u}]:["span",n,String(u)]}function c(u,p){const h=u.type;if(l.isFunction(h))return;const y={};for(const b in u.ctx)f(h,b,p)&&(y[b]=u.ctx[b]);return y}function f(u,p,h){const y=u[h];if(l.isArray(y)&&y.includes(p)||l.isObject(y)&&p in y||u.extends&&f(u.extends,p,h)||u.mixins&&u.mixins.some(b=>f(b,p,h)))return!0}function d(u){return Gt(u)?"ShallowRef":u.effect?"ComputedRef":"Ref"}window.devtoolsFormatters?window.devtoolsFormatters.push(i):window.devtoolsFormatters=[i]}const li=process.env.NODE_ENV!=="production"?v:l.NOOP;process.env.NODE_ENV,process.env.NODE_ENV;/**
15
- * @vue/runtime-dom v3.4.10
9
+ **/const Ne=[];function Vi(e){Ne.push(e)}function Oi(){Ne.pop()}let Wt=!1;function b(e,...t){if(Wt)return;Wt=!0,Le();const n=Ne.length?Ne[Ne.length-1].component:null,s=n&&n.appContext.config.warnHandler,o=Ci();if(s)ct(s,n,11,[e+t.map(i=>{var r,l;return(l=(r=i.toString)==null?void 0:r.call(i))!=null?l:JSON.stringify(i)}).join(""),n&&n.proxy,o.map(({vnode:i})=>`at <${_s(n,i.type)}>`).join(`
10
+ `),o]);else{const i=[`[Vue warn]: ${e}`,...t];o.length&&i.push(`
11
+ `,...Ti(o)),console.warn(...i)}He(),Wt=!1}function Ci(){let e=Ne[Ne.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const s=e.component&&e.component.parent;e=s&&s.vnode}return t}function Ti(e){const t=[];return e.forEach((n,s)=>{t.push(...s===0?[]:[`
12
+ `],...xi(n))}),t}function xi({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",s=e.component?e.component.parent==null:!1,o=` at <${_s(e.component,e.type,s)}`,i=">"+n;return e.props?[o,...Pi(e.props),i]:[o+i]}function Pi(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(s=>{t.push(...$n(s,e[s]))}),n.length>3&&t.push(" ..."),t}function $n(e,t,n){return a.isString(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:F(t)?(t=$n(e,S(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):a.isFunction(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=S(t),n?t:[`${e}=`,t])}function Mi(e,t){process.env.NODE_ENV!=="production"&&e!==void 0&&(typeof e!="number"?b(`${t} is not a valid number - got ${JSON.stringify(e)}.`):isNaN(e)&&b(`${t} is NaN - the duration expression might be incorrect.`))}const Jt={sp:"serverPrefetch hook",bc:"beforeCreate hook",c:"created hook",bm:"beforeMount hook",m:"mounted hook",bu:"beforeUpdate hook",u:"updated",bum:"beforeUnmount hook",um:"unmounted hook",a:"activated hook",da:"deactivated hook",ec:"errorCaptured hook",rtc:"renderTracked hook",rtg:"renderTriggered hook",0:"setup function",1:"render function",2:"watcher getter",3:"watcher callback",4:"watcher cleanup function",5:"native event handler",6:"component event handler",7:"vnode hook",8:"directive hook",9:"transition hook",10:"app errorHandler",11:"app warnHandler",12:"ref function",13:"async component loader",14:"scheduler flush",15:"component update",16:"app unmount cleanup function"};function ct(e,t,n,s){try{return s?e(...s):e()}catch(o){qt(o,t,n)}}function ft(e,t,n,s){if(a.isFunction(e)){const o=ct(e,t,n,s);return o&&a.isPromise(o)&&o.catch(i=>{qt(i,t,n)}),o}if(a.isArray(e)){const o=[];for(let i=0;i<e.length;i++)o.push(ft(e[i],t,n,s));return o}else process.env.NODE_ENV!=="production"&&b(`Invalid value type passed to callWithAsyncErrorHandling(): ${typeof e}`)}function qt(e,t,n,s=!0){const o=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:r}=t&&t.appContext.config||a.EMPTY_OBJ;if(t){let l=t.parent;const u=t.proxy,f=process.env.NODE_ENV!=="production"?Jt[n]:`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const p=l.ec;if(p){for(let c=0;c<p.length;c++)if(p[c](e,u,f)===!1)return}l=l.parent}if(i){Le(),ct(i,null,10,[e,u,f]),He();return}}ki(e,n,o,s,r)}function ki(e,t,n,s=!0,o=!1){if(process.env.NODE_ENV!=="production"){const i=Jt[t];if(n&&Vi(n),b(`Unhandled error${i?` during execution of ${i}`:""}`),n&&Oi(),s)throw e;console.error(e)}else{if(o)throw e;console.error(e)}}let dt=!1,Gt=!1;const U=[];let oe=0;const xe=[];let pe=null,Pe=0;const Rn=Promise.resolve();let Xt=null;const Ai=100;function Ln(e){const t=Xt||Rn;return e?t.then(this?e.bind(this):e):t}function Ii(e){let t=dt?oe+1:0,n=U.length;for(;t<n;){const s=t+n>>>1,o=U[s],i=je(o);i<e||i===e&&o.flags&2?t=s+1:n=s}return t}function Qt(e){if(!(e.flags&1)){const t=je(e),n=U[U.length-1];!n||!(e.flags&2)&&t>=je(n)?U.push(e):U.splice(Ii(t),0,e),e.flags|=1,Hn()}}function Hn(){!dt&&!Gt&&(Gt=!0,Xt=Rn.then(zn))}function Bn(e){a.isArray(e)?xe.push(...e):pe&&e.id===-1?pe.splice(Pe+1,0,e):e.flags&1||(xe.push(e),e.flags|=1),Hn()}function Fi(e){if(xe.length){const t=[...new Set(xe)].sort((n,s)=>je(n)-je(s));if(xe.length=0,pe){pe.push(...t);return}for(pe=t,process.env.NODE_ENV!=="production"&&(e=e||new Map),Pe=0;Pe<pe.length;Pe++){const n=pe[Pe];process.env.NODE_ENV!=="production"&&jn(e,n)||(n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2)}pe=null,Pe=0}}const je=e=>e.id==null?e.flags&2?-1:1/0:e.id;function zn(e){Gt=!1,dt=!0,process.env.NODE_ENV!=="production"&&(e=e||new Map);const t=process.env.NODE_ENV!=="production"?n=>jn(e,n):a.NOOP;try{for(oe=0;oe<U.length;oe++){const n=U[oe];if(n&&!(n.flags&8)){if(process.env.NODE_ENV!=="production"&&t(n))continue;n.flags&4&&(n.flags&=-2),ct(n,n.i,n.i?15:14),n.flags&=-2}}}finally{for(;oe<U.length;oe++){const n=U[oe];n&&(n.flags&=-2)}oe=0,U.length=0,Fi(e),dt=!1,Xt=null,(U.length||xe.length)&&zn(e)}}function jn(e,t){const n=e.get(t)||0;if(n>Ai){const s=t.i,o=s&&cn(s.type);return qt(`Maximum recursive updates exceeded${o?` in component <${o}>`:""}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,null,10),!0}return e.set(t,n+1),!1}const pt=new Map;process.env.NODE_ENV!=="production"&&(a.getGlobalThis().__VUE_HMR_RUNTIME__={createRecord:Zt($i),rerender:Zt(Ri),reload:Zt(Li)});const ht=new Map;function $i(e,t){return ht.has(e)?!1:(ht.set(e,{initialDef:gt(t),instances:new Set}),!0)}function gt(e){return bs(e)?e.__vccOpts:e}function Ri(e,t){const n=ht.get(e);n&&(n.initialDef.render=t,[...n.instances].forEach(s=>{t&&(s.render=t,gt(s.type).render=t),s.renderCache=[],s.update()}))}function Li(e,t){const n=ht.get(e);if(!n)return;t=gt(t),Kn(n.initialDef,t);const s=[...n.instances];for(let o=0;o<s.length;o++){const i=s[o],r=gt(i.type);let l=pt.get(r);l||(r!==n.initialDef&&Kn(r,t),pt.set(r,l=new Set)),l.add(i),i.appContext.propsCache.delete(i.type),i.appContext.emitsCache.delete(i.type),i.appContext.optionsCache.delete(i.type),i.ceReload?(l.add(i),i.ceReload(t.styles),l.delete(i)):i.parent?Qt(()=>{i.parent.update(),l.delete(i)}):i.appContext.reload?i.appContext.reload():typeof window<"u"?window.location.reload():console.warn("[HMR] Root or manually mounted instance modified. Full reload required."),i.root.ce&&i!==i.root&&i.root.ce._removeChildStyle(r)}Bn(()=>{pt.clear()})}function Kn(e,t){a.extend(e,t);for(const n in e)n!=="__file"&&!(n in t)&&delete e[n]}function Zt(e){return(t,n)=>{try{return e(t,n)}catch(s){console.error(s),console.warn("[HMR] Something went wrong during Vue component hot-reload. Full reload required.")}}}let he,Ke=[],en=!1;function Hi(e,...t){he?he.emit(e,...t):en||Ke.push({event:e,args:t})}function Un(e,t){var n,s;he=e,he?(he.enabled=!0,Ke.forEach(({event:o,args:i})=>he.emit(o,...i)),Ke=[]):typeof window<"u"&&window.HTMLElement&&!((s=(n=window.navigator)==null?void 0:n.userAgent)!=null&&s.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(i=>{Un(i,t)}),setTimeout(()=>{he||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,en=!0,Ke=[])},3e3)):(en=!0,Ke=[])}const Bi=zi("component:updated");/*! #__NO_SIDE_EFFECTS__ */function zi(e){return t=>{Hi(e,t.appContext.app,t.uid,t.parent?t.parent.uid:void 0,t)}}let C=null,Yn=null;function Wn(e){const t=C;return C=e,Yn=e&&e.type.__scopeId||null,t}function B(e,t=C,n){if(!t||e._n)return e;const s=(...o)=>{s._d&&cs(-1);const i=Wn(t);let r;try{r=e(...o)}finally{Wn(i),s._d&&cs(1)}return process.env.NODE_ENV!=="production"&&Bi(t),r};return s._n=!0,s._c=!0,s._d=!0,s}function mt(e,t){if(C===null)return process.env.NODE_ENV!=="production"&&b("withDirectives can only be used inside render functions."),e;const n=ws(C),s=e.dirs||(e.dirs=[]);for(let o=0;o<t.length;o++){let[i,r,l,u=a.EMPTY_OBJ]=t[o];i&&(a.isFunction(i)&&(i={mounted:i,updated:i}),i.deep&&ie(r),s.push({dir:i,instance:n,value:r,oldValue:void 0,arg:l,modifiers:u}))}return e}const Jn=e=>e.__isTeleport,ge=Symbol("_leaveCb"),yt=Symbol("_enterCb");function ji(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ji(()=>{e.isMounted=!0}),qi(()=>{e.isUnmounting=!0}),e}const Y=[Function,Array],qn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Y,onEnter:Y,onAfterEnter:Y,onEnterCancelled:Y,onBeforeLeave:Y,onLeave:Y,onAfterLeave:Y,onLeaveCancelled:Y,onBeforeAppear:Y,onAppear:Y,onAfterAppear:Y,onAppearCancelled:Y},Gn=e=>{const t=e.subTree;return t.component?Gn(t.component):t},Ki={name:"BaseTransition",props:qn,setup(e,{slots:t}){const n=ms(),s=ji();return()=>{const o=t.default&&es(t.default(),!0);if(!o||!o.length)return;const i=Xn(o),r=S(e),{mode:l}=r;if(process.env.NODE_ENV!=="production"&&l&&l!=="in-out"&&l!=="out-in"&&l!=="default"&&b(`invalid <transition> mode: ${l}`),s.isLeaving)return nn(i);const u=Zn(i);if(!u)return nn(i);let f=tn(u,r,s,n,d=>f=d);u.type!==W&&vt(u,f);const p=n.subTree,c=p&&Zn(p);if(c&&c.type!==W&&!ds(u,c)&&Gn(n).type!==W){const d=tn(c,r,s,n);if(vt(c,d),l==="out-in"&&u.type!==W)return s.isLeaving=!0,d.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave},nn(i);l==="in-out"&&u.type!==W&&(d.delayLeave=(h,y,V)=>{const j=Qn(s,c);j[String(c.key)]=c,h[ge]=()=>{y(),h[ge]=void 0,delete f.delayedLeave},f.delayedLeave=V})}return i}}};function Xn(e){let t=e[0];if(e.length>1){let n=!1;for(const s of e)if(s.type!==W){if(process.env.NODE_ENV!=="production"&&n){b("<transition> can only be used on a single element or component. Use <transition-group> for lists.");break}if(t=s,n=!0,process.env.NODE_ENV==="production")break}}return t}const Ui=Ki;function Qn(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function tn(e,t,n,s,o){const{appear:i,mode:r,persisted:l=!1,onBeforeEnter:u,onEnter:f,onAfterEnter:p,onEnterCancelled:c,onBeforeLeave:d,onLeave:h,onAfterLeave:y,onLeaveCancelled:V,onBeforeAppear:j,onAppear:te,onAfterAppear:G,onAppearCancelled:ne}=t,_=String(e.key),k=Qn(n,e),K=(E,T)=>{E&&ft(E,s,9,T)},ae=(E,T)=>{const A=T[1];K(E,T),a.isArray(E)?E.every(g=>g.length<=1)&&A():E.length<=1&&A()},Ge={mode:r,persisted:l,beforeEnter(E){let T=u;if(!n.isMounted)if(i)T=j||u;else return;E[ge]&&E[ge](!0);const A=k[_];A&&ds(e,A)&&A.el[ge]&&A.el[ge](),K(T,[E])},enter(E){let T=f,A=p,g=c;if(!n.isMounted)if(i)T=te||f,A=G||p,g=ne||c;else return;let P=!1;const X=E[yt]=Pt=>{P||(P=!0,Pt?K(g,[E]):K(A,[E]),Ge.delayedLeave&&Ge.delayedLeave(),E[yt]=void 0)};T?ae(T,[E,X]):X()},leave(E,T){const A=String(e.key);if(E[yt]&&E[yt](!0),n.isUnmounting)return T();K(d,[E]);let g=!1;const P=E[ge]=X=>{g||(g=!0,T(),X?K(V,[E]):K(y,[E]),E[ge]=void 0,k[A]===e&&delete k[A])};k[A]=e,h?ae(h,[E,P]):P()},clone(E){const T=tn(E,t,n,s,o);return o&&o(T),T}};return Ge}function nn(e){if(ts(e))return e=Me(e),e.children=null,e}function Zn(e){if(!ts(e))return Jn(e.type)&&e.children?Xn(e.children):e;if(process.env.NODE_ENV!=="production"&&e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&a.isFunction(n.default))return n.default()}}function vt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,vt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function es(e,t=!1,n){let s=[],o=0;for(let i=0;i<e.length;i++){let r=e[i];const l=n==null?r.key:String(n)+String(r.key!=null?r.key:i);r.type===O?(r.patchFlag&128&&o++,s=s.concat(es(r.children,t,l))):(t||r.type!==W)&&s.push(l!=null?Me(r,{key:l}):r)}if(o>1)for(let i=0;i<s.length;i++)s[i].patchFlag=-2;return s}const Yi=e=>!!e.type.__asyncLoader,ts=e=>e.type.__isKeepAlive;function Wi(e,t,n=ye,s=!1){if(n){const o=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...r)=>{Le();const l=ys(n),u=ft(t,n,e,r);return l(),He(),u});return s?o.unshift(i):o.push(i),i}else if(process.env.NODE_ENV!=="production"){const o=a.toHandlerKey(Jt[e].replace(/ hook$/,""));b(`${o} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup(). If you are using async setup(), make sure to register lifecycle hooks before the first await statement.`)}}const ns=e=>(t,n=ye)=>{(!un||e==="sp")&&Wi(e,(...s)=>t(...s),n)},Ji=ns("m"),qi=ns("bum"),sn="components";function Z(e,t){return Xi(sn,e,!0,t)||e}const Gi=Symbol.for("v-ndc");function Xi(e,t,n=!0,s=!1){const o=C||ye;if(o){const i=o.type;if(e===sn){const l=cn(i,!1);if(l&&(l===t||l===a.camelize(t)||l===a.capitalize(a.camelize(t))))return i}const r=ss(o[e]||i[e],t)||ss(o.appContext[e],t);if(!r&&s)return i;if(process.env.NODE_ENV!=="production"&&n&&!r){const l=e===sn?`
13
+ If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.`:"";b(`Failed to resolve ${e.slice(0,-1)}: ${t}${l}`)}return r}else process.env.NODE_ENV!=="production"&&b(`resolve${a.capitalize(e.slice(0,-1))} can only be used in render() or setup().`)}function ss(e,t){return e&&(e[t]||e[a.camelize(t)]||e[a.capitalize(a.camelize(t))])}function me(e,t,n,s){let o;const i=n,r=a.isArray(e);if(r||a.isString(e)){const l=r&&Ee(e);let u=!1;l&&(u=!L(e),e=Ze(e)),o=new Array(e.length);for(let f=0,p=e.length;f<p;f++)o[f]=t(u?H(e[f]):e[f],f,void 0,i)}else if(typeof e=="number"){process.env.NODE_ENV!=="production"&&!Number.isInteger(e)&&b(`The v-for range expect an integer value but got ${e}.`),o=new Array(e);for(let l=0;l<e;l++)o[l]=t(l+1,l,void 0,i)}else if(a.isObject(e))if(e[Symbol.iterator])o=Array.from(e,(l,u)=>t(l,u,void 0,i));else{const l=Object.keys(e);o=new Array(l.length);for(let u=0,f=l.length;u<f;u++){const p=l[u];o[u]=t(e[p],p,u,i)}}else o=[];return o}function M(e,t,n={},s,o){if(C.ce||C.parent&&Yi(C.parent)&&C.parent.ce)return t!=="default"&&(n.name=t),m(),Ve(O,null,[I("slot",n,s&&s())],64);let i=e[t];process.env.NODE_ENV!=="production"&&i&&i.length>1&&(b("SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template."),i=()=>[]),i&&i._c&&(i._d=!1),m();const r=i&&is(i(n)),l=Ve(O,{key:(n.key||r&&r.key||`_${t}`)+(!r&&s?"_fb":"")},r||(s?s():[]),r&&e._===1?64:-2);return l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function is(e){return e.some(t=>bt(t)?!(t.type===W||t.type===O&&!is(t.children)):!0)?e:null}const on=e=>e?So(e)?ws(e):on(e.parent):null,Ue=a.extend(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>process.env.NODE_ENV!=="production"?rt(e.props):e.props,$attrs:e=>process.env.NODE_ENV!=="production"?rt(e.attrs):e.attrs,$slots:e=>process.env.NODE_ENV!=="production"?rt(e.slots):e.slots,$refs:e=>process.env.NODE_ENV!=="production"?rt(e.refs):e.refs,$parent:e=>on(e.parent),$root:e=>on(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>no(e),$forceUpdate:e=>e.f||(e.f=()=>{Qt(e.update)}),$nextTick:e=>e.n||(e.n=Ln.bind(e.proxy)),$watch:e=>ho.bind(e)}),Qi=e=>e==="_"||e==="$",rn=(e,t)=>e!==a.EMPTY_OBJ&&!e.__isScriptSetup&&a.hasOwn(e,t),Zi={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:o,props:i,accessCache:r,type:l,appContext:u}=e;if(process.env.NODE_ENV!=="production"&&t==="__isVue")return!0;let f;if(t[0]!=="$"){const h=r[t];if(h!==void 0)switch(h){case 1:return s[t];case 2:return o[t];case 4:return n[t];case 3:return i[t]}else{if(rn(s,t))return r[t]=1,s[t];if(o!==a.EMPTY_OBJ&&a.hasOwn(o,t))return r[t]=2,o[t];if((f=e.propsOptions[0])&&a.hasOwn(f,t))return r[t]=3,i[t];if(n!==a.EMPTY_OBJ&&a.hasOwn(n,t))return r[t]=4,n[t];r[t]=0}}const p=Ue[t];let c,d;if(p)return t==="$attrs"?(x(e.attrs,"get",""),process.env.NODE_ENV!=="production"&&void 0):process.env.NODE_ENV!=="production"&&t==="$slots"&&x(e,"get",t),p(e);if((c=l.__cssModules)&&(c=c[t]))return c;if(n!==a.EMPTY_OBJ&&a.hasOwn(n,t))return r[t]=4,n[t];if(d=u.config.globalProperties,a.hasOwn(d,t))return d[t];process.env.NODE_ENV!=="production"&&C&&(!a.isString(t)||t.indexOf("__v")!==0)&&(o!==a.EMPTY_OBJ&&Qi(t[0])&&a.hasOwn(o,t)?b(`Property ${JSON.stringify(t)} must be accessed via $data because it starts with a reserved character ("$" or "_") and is not proxied on the render context.`):e===C&&b(`Property ${JSON.stringify(t)} was accessed during render but is not defined on instance.`))},set({_:e},t,n){const{data:s,setupState:o,ctx:i}=e;return rn(o,t)?(o[t]=n,!0):process.env.NODE_ENV!=="production"&&o.__isScriptSetup&&a.hasOwn(o,t)?(b(`Cannot mutate <script setup> binding "${t}" from Options API.`),!1):s!==a.EMPTY_OBJ&&a.hasOwn(s,t)?(s[t]=n,!0):a.hasOwn(e.props,t)?(process.env.NODE_ENV!=="production"&&b(`Attempting to mutate prop "${t}". Props are readonly.`),!1):t[0]==="$"&&t.slice(1)in e?(process.env.NODE_ENV!=="production"&&b(`Attempting to mutate public property "${t}". Properties starting with $ are reserved and readonly.`),!1):(process.env.NODE_ENV!=="production"&&t in e.appContext.config.globalProperties?Object.defineProperty(i,t,{enumerable:!0,configurable:!0,value:n}):i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:o,propsOptions:i}},r){let l;return!!n[r]||e!==a.EMPTY_OBJ&&a.hasOwn(e,r)||rn(t,r)||(l=i[0])&&a.hasOwn(l,r)||a.hasOwn(s,r)||a.hasOwn(Ue,r)||a.hasOwn(o.config.globalProperties,r)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:a.hasOwn(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};process.env.NODE_ENV!=="production"&&(Zi.ownKeys=e=>(b("Avoid app logic that relies on enumerating keys on a component instance. The keys will be empty in production mode to avoid performance overhead."),Reflect.ownKeys(e)));function eo(){return to().slots}function to(){const e=ms();return process.env.NODE_ENV!=="production"&&!e&&b("useContext() called without active instance."),e.setupContext||(e.setupContext=Do(e))}function os(e){return a.isArray(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function no(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:r}}=e.appContext,l=i.get(t);let u;return l?u=l:!o.length&&!n&&!s?u=t:(u={},o.length&&o.forEach(f=>wt(u,f,r,!0)),wt(u,t,r)),a.isObject(t)&&i.set(t,u),u}function wt(e,t,n,s=!1){const{mixins:o,extends:i}=t;i&&wt(e,i,n,!0),o&&o.forEach(r=>wt(e,r,n,!0));for(const r in t)if(s&&r==="expose")process.env.NODE_ENV!=="production"&&b('"expose" option is ignored when declared in mixins or extends. It should only be declared in the base component itself.');else{const l=so[r]||n&&n[r];e[r]=l?l(e[r],t[r]):t[r]}return e}const so={data:rs,props:as,emits:as,methods:Ye,computed:Ye,beforeCreate:$,created:$,beforeMount:$,mounted:$,beforeUpdate:$,updated:$,beforeDestroy:$,beforeUnmount:$,destroyed:$,unmounted:$,activated:$,deactivated:$,errorCaptured:$,serverPrefetch:$,components:Ye,directives:Ye,watch:oo,provide:rs,inject:io};function rs(e,t){return t?e?function(){return a.extend(a.isFunction(e)?e.call(this,this):e,a.isFunction(t)?t.call(this,this):t)}:t:e}function io(e,t){return Ye(ls(e),ls(t))}function ls(e){if(a.isArray(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function $(e,t){return e?[...new Set([].concat(e,t))]:t}function Ye(e,t){return e?a.extend(Object.create(null),e,t):t}function as(e,t){return e?a.isArray(e)&&a.isArray(t)?[...new Set([...e,...t])]:a.extend(Object.create(null),os(e),os(t??{})):t}function oo(e,t){if(!e)return t;if(!t)return e;const n=a.extend(Object.create(null),e);for(const s in t)n[s]=$(e[s],t[s]);return n}let ro=null;function lo(e,t,n=!1){const s=ye||C;if(s||ro){const o=s?s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:void 0;if(o&&e in o)return o[e];if(arguments.length>1)return n&&a.isFunction(t)?t.call(s&&s.proxy):t;process.env.NODE_ENV!=="production"&&b(`injection "${String(e)}" not found.`)}else process.env.NODE_ENV!=="production"&&b("inject() can only be used inside setup() or functional components.")}const ao={},us=e=>Object.getPrototypeOf(e)===ao,uo=yo,co=Symbol.for("v-scx"),fo=()=>{{const e=lo(co);return e||process.env.NODE_ENV!=="production"&&b("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function po(e,t,n=a.EMPTY_OBJ){const{immediate:s,deep:o,flush:i,once:r}=n;process.env.NODE_ENV!=="production"&&!t&&(s!==void 0&&b('watch() "immediate" option is only respected when using the watch(source, callback, options?) signature.'),o!==void 0&&b('watch() "deep" option is only respected when using the watch(source, callback, options?) signature.'),r!==void 0&&b('watch() "once" option is only respected when using the watch(source, callback, options?) signature.'));const l=a.extend({},n);process.env.NODE_ENV!=="production"&&(l.onWarn=b);let u;if(un)if(i==="sync"){const d=fo();u=d.__watcherHandles||(d.__watcherHandles=[])}else if(!t||s)l.once=!0;else{const d=()=>{};return d.stop=a.NOOP,d.resume=a.NOOP,d.pause=a.NOOP,d}const f=ye;l.call=(d,h,y)=>ft(d,f,h,y);let p=!1;i==="post"?l.scheduler=d=>{uo(d,f&&f.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(d,h)=>{h?d():Qt(d)}),l.augmentJob=d=>{t&&(d.flags|=4),p&&(d.flags|=2,f&&(d.id=f.uid,d.i=f))};const c=Ni(e,t,l);return u&&u.push(c),c}function ho(e,t,n){const s=this.proxy,o=a.isString(e)?e.includes(".")?go(s,e):()=>s[e]:e.bind(s,s);let i;a.isFunction(t)?i=t:(i=t.handler,n=t);const r=ys(this),l=po(o,i.bind(s),n);return r(),l}function go(e,t){const n=t.split(".");return()=>{let s=e;for(let o=0;o<n.length&&s;o++)s=s[n[o]];return s}}function Wr(){}const mo=e=>e.__isSuspense;function yo(e,t){t&&t.pendingBranch?a.isArray(e)?t.effects.push(...e):t.effects.push(e):Bn(e)}const O=Symbol.for("v-fgt"),vo=Symbol.for("v-txt"),W=Symbol.for("v-cmt"),_t=[];let z=null;function m(e=!1){_t.push(z=e?null:[])}function wo(){_t.pop(),z=_t[_t.length-1]||null}let We=1;function cs(e){We+=e,e<0&&z&&(z.hasOnce=!0)}function fs(e){return e.dynamicChildren=We>0?z||a.EMPTY_ARR:null,wo(),We>0&&z&&z.push(e),e}function w(e,t,n,s,o,i){return fs(v(e,t,n,s,o,i,!0))}function Ve(e,t,n,s,o){return fs(I(e,t,n,s,o,!0))}function bt(e){return e?e.__v_isVNode===!0:!1}function ds(e,t){if(process.env.NODE_ENV!=="production"&&t.shapeFlag&6&&e.component){const n=pt.get(t.type);if(n&&n.has(e.component))return e.shapeFlag&=-257,t.shapeFlag&=-513,!1}return e.type===t.type&&e.key===t.key}const _o=(...e)=>hs(...e),ps=({key:e})=>e??null,St=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?a.isString(e)||F(e)||a.isFunction(e)?{i:C,r:e,k:t,f:!!n}:e:null);function v(e,t=null,n=null,s=0,o=null,i=e===O?0:1,r=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ps(t),ref:t&&St(t),scopeId:Yn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:C};return l?(ln(u,n),i&128&&e.normalize(u)):n&&(u.shapeFlag|=a.isString(n)?8:16),process.env.NODE_ENV!=="production"&&u.key!==u.key&&b("VNode created with invalid key (NaN). VNode type:",u.type),We>0&&!r&&z&&(u.patchFlag>0||i&6)&&u.patchFlag!==32&&z.push(u),u}const I=process.env.NODE_ENV!=="production"?_o:hs;function hs(e,t=null,n=null,s=0,o=null,i=!1){if((!e||e===Gi)&&(process.env.NODE_ENV!=="production"&&!e&&b(`Invalid vnode type when creating vnode: ${e}.`),e=W),bt(e)){const l=Me(e,t,!0);return n&&ln(l,n),We>0&&!i&&z&&(l.shapeFlag&6?z[z.indexOf(e)]=l:z.push(l)),l.patchFlag=-2,l}if(bs(e)&&(e=e.__vccOpts),t){t=bo(t);let{class:l,style:u}=t;l&&!a.isString(l)&&(t.class=a.normalizeClass(l)),a.isObject(u)&&(lt(u)&&!a.isArray(u)&&(u=a.extend({},u)),t.style=a.normalizeStyle(u))}const r=a.isString(e)?1:mo(e)?128:Jn(e)?64:a.isObject(e)?4:a.isFunction(e)?2:0;return process.env.NODE_ENV!=="production"&&r&4&&lt(e)&&(e=S(e),b("Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.",`
14
+ Component that was made reactive: `,e)),v(e,t,n,s,o,r,i,!0)}function bo(e){return e?lt(e)||us(e)?a.extend({},e):e:null}function Me(e,t,n=!1,s=!1){const{props:o,ref:i,patchFlag:r,children:l,transition:u}=e,f=t?ee(o||{},t):o,p={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&ps(f),ref:t&&t.ref?n&&i?a.isArray(i)?i.concat(St(t)):[i,St(t)]:St(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:process.env.NODE_ENV!=="production"&&r===-1&&a.isArray(l)?l.map(gs):l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==O?r===-1?16:r|16:r,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:u,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Me(e.ssContent),ssFallback:e.ssFallback&&Me(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return u&&s&&vt(p,u.clone(p)),p}function gs(e){const t=Me(e);return a.isArray(e.children)&&(t.children=e.children.map(gs)),t}function Et(e=" ",t=0){return I(vo,null,e,t)}function J(e="",t=!1){return t?(m(),Ve(W,null,e)):I(W,null,e)}function ln(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(a.isArray(t))n=16;else if(typeof t=="object")if(s&65){const o=t.default;o&&(o._c&&(o._d=!1),ln(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!us(t)?t._ctx=C:o===3&&C&&(C.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else a.isFunction(t)?(t={default:t,_ctx:C},n=32):(t=String(t),s&64?(n=16,t=[Et(t)]):n=8);e.children=t,e.shapeFlag|=n}function ee(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const o in s)if(o==="class")t.class!==s.class&&(t.class=a.normalizeClass([t.class,s.class]));else if(o==="style")t.style=a.normalizeStyle([t.style,s.style]);else if(a.isOn(o)){const i=t[o],r=s[o];r&&i!==r&&!(a.isArray(i)&&i.includes(r))&&(t[o]=i?[].concat(i,r):r)}else o!==""&&(t[o]=s[o])}return t}let ye=null;const ms=()=>ye||C;let an;{const e=a.getGlobalThis(),t=(n,s)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(s),i=>{o.length>1?o.forEach(r=>r(i)):o[0](i)}};an=t("__VUE_INSTANCE_SETTERS__",n=>ye=n),t("__VUE_SSR_SETTERS__",n=>un=n)}const ys=e=>{const t=ye;return an(e),e.scope.on(),()=>{e.scope.off(),an(t)}};function So(e){return e.vnode.shapeFlag&4}let un=!1;const vs=process.env.NODE_ENV!=="production"?{get(e,t){return x(e,"get",""),e[t]},set(){return b("setupContext.attrs is readonly."),!1},deleteProperty(){return b("setupContext.attrs is readonly."),!1}}:{get(e,t){return x(e,"get",""),e[t]}};function Eo(e){return new Proxy(e.slots,{get(t,n){return x(e,"get","$slots"),t[n]}})}function Do(e){const t=n=>{if(process.env.NODE_ENV!=="production"&&(e.exposed&&b("expose() should be called only once per setup()."),n!=null)){let s=typeof n;s==="object"&&(a.isArray(n)?s="array":F(n)&&(s="ref")),s!=="object"&&b(`expose() should be passed a plain object, received ${s}.`)}e.exposed=n||{}};if(process.env.NODE_ENV!=="production"){let n,s;return Object.freeze({get attrs(){return n||(n=new Proxy(e.attrs,vs))},get slots(){return s||(s=Eo(e))},get emit(){return(o,...i)=>e.emit(o,...i)},expose:t})}else return{attrs:new Proxy(e.attrs,vs),slots:e.slots,emit:e.emit,expose:t}}function ws(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ei(Fn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ue)return Ue[n](e)},has(t,n){return n in t||n in Ue}})):e.proxy}const No=/(?:^|[-_])(\w)/g,Vo=e=>e.replace(No,t=>t.toUpperCase()).replace(/[-_]/g,"");function cn(e,t=!0){return a.isFunction(e)?e.displayName||e.name:e.name||t&&e.__name}function _s(e,t,n=!1){let s=cn(t);if(!s&&t.__file){const o=t.__file.match(/([^/\\]+)\.\w+$/);o&&(s=o[1])}if(!s&&e&&e.parent){const o=i=>{for(const r in i)if(i[r]===t)return r};s=o(e.components||e.parent.type.components)||o(e.appContext.components)}return s?Vo(s):n?"App":"Anonymous"}function bs(e){return a.isFunction(e)&&"__vccOpts"in e}function Ss(e,t,n){const s=arguments.length;return s===2?a.isObject(t)&&!a.isArray(t)?bt(t)?I(e,null,[t]):I(e,t):I(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&bt(n)&&(n=[n]),I(e,t,n))}function Oo(){if(process.env.NODE_ENV==="production"||typeof window>"u")return;const e={style:"color:#3ba776"},t={style:"color:#1677ff"},n={style:"color:#f5222d"},s={style:"color:#eb2f96"},o={__vue_custom_formatter:!0,header(c){return a.isObject(c)?c.__isVue?["div",e,"VueInstance"]:F(c)?["div",{},["span",e,p(c)],"<",l("_value"in c?c._value:c),">"]:Ee(c)?["div",{},["span",e,L(c)?"ShallowReactive":"Reactive"],"<",l(c),`>${de(c)?" (readonly)":""}`]:de(c)?["div",{},["span",e,L(c)?"ShallowReadonly":"Readonly"],"<",l(c),">"]:null:null},hasBody(c){return c&&c.__isVue},body(c){if(c&&c.__isVue)return["div",{},...i(c.$)]}};function i(c){const d=[];c.type.props&&c.props&&d.push(r("props",S(c.props))),c.setupState!==a.EMPTY_OBJ&&d.push(r("setup",c.setupState)),c.data!==a.EMPTY_OBJ&&d.push(r("data",S(c.data)));const h=u(c,"computed");h&&d.push(r("computed",h));const y=u(c,"inject");return y&&d.push(r("injected",y)),d.push(["div",{},["span",{style:s.style+";opacity:0.66"},"$ (internal): "],["object",{object:c}]]),d}function r(c,d){return d=a.extend({},d),Object.keys(d).length?["div",{style:"line-height:1.25em;margin-bottom:0.6em"},["div",{style:"color:#476582"},c],["div",{style:"padding-left:1.25em"},...Object.keys(d).map(h=>["div",{},["span",s,h+": "],l(d[h],!1)])]]:["span",{}]}function l(c,d=!0){return typeof c=="number"?["span",t,c]:typeof c=="string"?["span",n,JSON.stringify(c)]:typeof c=="boolean"?["span",s,c]:a.isObject(c)?["object",{object:d?S(c):c}]:["span",n,String(c)]}function u(c,d){const h=c.type;if(a.isFunction(h))return;const y={};for(const V in c.ctx)f(h,V,d)&&(y[V]=c.ctx[V]);return y}function f(c,d,h){const y=c[h];if(a.isArray(y)&&y.includes(d)||a.isObject(y)&&d in y||c.extends&&f(c.extends,d,h)||c.mixins&&c.mixins.some(V=>f(V,d,h)))return!0}function p(c){return L(c)?"ShallowRef":c.effect?"ComputedRef":"Ref"}window.devtoolsFormatters?window.devtoolsFormatters.push(o):window.devtoolsFormatters=[o]}const Es=process.env.NODE_ENV!=="production"?b:a.NOOP;process.env.NODE_ENV,process.env.NODE_ENV;/**
15
+ * @vue/runtime-dom v3.5.6
16
16
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
17
17
  * @license MIT
18
- **/const de="transition",ze="animation",ct=Symbol("_vtc"),ft=(e,{slots:t})=>rs(Io,ai(e),t);ft.displayName="Transition";const ls={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ft.props=l.extend({},Fn,ls);const Se=(e,t=[])=>{l.isArray(e)?e.forEach(n=>n(...t)):e&&e(...t)},as=e=>e?l.isArray(e)?e.some(t=>t.length>1):e.length>1:!1;function ai(e){const t={};for(const g in e)g in ls||(t[g]=e[g]);if(e.css===!1)return t;const{name:n="v",type:s,duration:i,enterFromClass:o=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:f=r,appearToClass:d=a,leaveFromClass:u=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,y=ui(i),b=y&&y[0],A=y&&y[1],{onBeforeEnter:R,onEnter:L,onEnterCancelled:G,onLeave:C,onLeaveCancelled:z,onBeforeAppear:E=R,onAppear:ne=L,onAppearCancelled:N=G}=t,P=(g,M,se)=>{Ne(g,M?d:a),Ne(g,M?f:r),se&&se()},k=(g,M)=>{g._isLeaving=!1,Ne(g,u),Ne(g,h),Ne(g,p),M&&M()},X=g=>(M,se)=>{const Ts=g?ne:L,Ps=()=>P(M,g,se);Se(Ts,[M,Ps]),us(()=>{Ne(M,g?c:o),pe(M,g?d:a),as(Ts)||cs(M,s,b,Ps)})};return l.extend(t,{onBeforeEnter(g){Se(R,[g]),pe(g,o),pe(g,r)},onBeforeAppear(g){Se(E,[g]),pe(g,c),pe(g,f)},onEnter:X(!1),onAppear:X(!0),onLeave(g,M){g._isLeaving=!0;const se=()=>k(g,M);pe(g,u),di(),pe(g,p),us(()=>{g._isLeaving&&(Ne(g,u),pe(g,h),as(C)||cs(g,s,A,se))}),Se(C,[g,se])},onEnterCancelled(g){P(g,!1),Se(G,[g])},onAppearCancelled(g){P(g,!0),Se(N,[g])},onLeaveCancelled(g){k(g),Se(z,[g])}})}function ui(e){if(e==null)return null;if(l.isObject(e))return[Xt(e.enter),Xt(e.leave)];{const t=Xt(e);return[t,t]}}function Xt(e){const t=l.toNumber(e);return process.env.NODE_ENV!=="production"&&po(t,"<transition> explicit duration"),t}function pe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[ct]||(e[ct]=new Set)).add(t)}function Ne(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[ct];n&&(n.delete(t),n.size||(e[ct]=void 0))}function us(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ci=0;function cs(e,t,n,s){const i=e._endId=++ci,o=()=>{i===e._endId&&s()};if(n)return setTimeout(o,n);const{type:r,timeout:a,propCount:c}=fi(e,t);if(!r)return s();const f=r+"end";let d=0;const u=()=>{e.removeEventListener(f,p),o()},p=h=>{h.target===e&&++d>=c&&u()};setTimeout(()=>{d<c&&u()},a+1),e.addEventListener(f,p)}function fi(e,t){const n=window.getComputedStyle(e),s=y=>(n[y]||"").split(", "),i=s(`${de}Delay`),o=s(`${de}Duration`),r=fs(i,o),a=s(`${ze}Delay`),c=s(`${ze}Duration`),f=fs(a,c);let d=null,u=0,p=0;t===de?r>0&&(d=de,u=r,p=o.length):t===ze?f>0&&(d=ze,u=f,p=c.length):(u=Math.max(r,f),d=u>0?r>f?de:ze:null,p=d?d===de?o.length:c.length:0);const h=d===de&&/\b(transform|all)(,|$)/.test(s(`${de}Property`).toString());return{type:d,timeout:u,propCount:p,hasTransform:h}}function fs(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,s)=>ds(n)+ds(e[s])))}function ds(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function di(){return document.body.offsetHeight}const ps=Symbol("_vod"),Qt={beforeMount(e,{value:t},{transition:n}){e[ps]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ke(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Ke(e,!0),s.enter(e)):s.leave(e,()=>{Ke(e,!1)}):Ke(e,t))},beforeUnmount(e,{value:t}){Ke(e,t)}};process.env.NODE_ENV!=="production"&&(Qt.name="show");function Ke(e,t){e.style.display=t?e[ps]:"none"}Symbol(process.env.NODE_ENV!=="production"?"CSS_VAR_TEXT":"");function he(e,t,n,s){e.addEventListener(t,n,s)}const ge=e=>{const t=e.props["onUpdate:modelValue"]||!1;return l.isArray(t)?n=>l.invokeArrayFns(t,n):t};function pi(e){e.target.composing=!0}function hs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const U=Symbol("_assign"),gs={created(e,{modifiers:{lazy:t,trim:n,number:s}},i){e[U]=ge(i);const o=s||i.props&&i.props.type==="number";he(e,t?"change":"input",r=>{if(r.target.composing)return;let a=e.value;n&&(a=a.trim()),o&&(a=l.looseToNumber(a)),e[U](a)}),n&&he(e,"change",()=>{e.value=e.value.trim()}),t||(he(e,"compositionstart",pi),he(e,"compositionend",hs),he(e,"change",hs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:i}},o){if(e[U]=ge(o),e.composing)return;const r=i||e.type==="number"?l.looseToNumber(e.value):e.value,a=t??"";r!==a&&(document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===a)||(e.value=a))}},ms={deep:!0,created(e,t,n){e[U]=ge(n),he(e,"change",()=>{const s=e._modelValue,i=Pe(e),o=e.checked,r=e[U];if(l.isArray(s)){const a=l.looseIndexOf(s,i),c=a!==-1;if(o&&!c)r(s.concat(i));else if(!o&&c){const f=[...s];f.splice(a,1),r(f)}}else if(l.isSet(s)){const a=new Set(s);o?a.add(i):a.delete(i),r(a)}else r(ws(e,o))})},mounted:ys,beforeUpdate(e,t,n){e[U]=ge(n),ys(e,t,n)}};function ys(e,{value:t,oldValue:n},s){e._modelValue=t,l.isArray(t)?e.checked=l.looseIndexOf(t,s.props.value)>-1:l.isSet(t)?e.checked=t.has(s.props.value):t!==n&&(e.checked=l.looseEqual(t,ws(e,!0)))}const hi={created(e,{value:t},n){e.checked=l.looseEqual(t,n.props.value),e[U]=ge(n),he(e,"change",()=>{e[U](Pe(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[U]=ge(s),t!==n&&(e.checked=l.looseEqual(t,s.props.value))}},gi={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const i=l.isSet(t);he(e,"change",()=>{const o=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?l.looseToNumber(Pe(r)):Pe(r));e[U](e.multiple?i?new Set(o):o:o[0])}),e[U]=ge(s)},mounted(e,{value:t}){_s(e,t)},beforeUpdate(e,t,n){e[U]=ge(n)},updated(e,{value:t}){_s(e,t)}};function _s(e,t){const n=e.multiple;if(n&&!l.isArray(t)&&!l.isSet(t)){process.env.NODE_ENV!=="production"&&li(`<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(t).slice(8,-1)}.`);return}for(let s=0,i=e.options.length;s<i;s++){const o=e.options[s],r=Pe(o);if(n)l.isArray(t)?o.selected=l.looseIndexOf(t,r)>-1:o.selected=t.has(r);else if(l.looseEqual(Pe(o),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}function Pe(e){return"_value"in e?e._value:e.value}function ws(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const mi={created(e,t,n){dt(e,t,n,null,"created")},mounted(e,t,n){dt(e,t,n,null,"mounted")},beforeUpdate(e,t,n,s){dt(e,t,n,s,"beforeUpdate")},updated(e,t,n,s){dt(e,t,n,s,"updated")}};function yi(e,t){switch(e){case"SELECT":return gi;case"TEXTAREA":return gs;default:switch(t){case"checkbox":return ms;case"radio":return hi;default:return gs}}}function dt(e,t,n,s,i){const r=yi(e.tagName,n.props&&n.props.type)[i];r&&r(e,t,n,s)}const _i=["ctrl","shift","alt","meta"],wi={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>_i.some(n=>e[`${n}Key`]&&!t.includes(n))},Me=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(i,...o)=>{for(let r=0;r<t.length;r++){const a=wi[t[r]];if(a&&a(i,t))return}return e(i,...o)})};/**
19
- * vue v3.4.10
18
+ **/let Co;const Ds=typeof window<"u"&&window.trustedTypes;if(Ds)try{Co=Ds.createPolicy("vue",{createHTML:e=>e})}catch(e){process.env.NODE_ENV!=="production"&&Es(`Error creating trusted types policy: ${e}`)}const ve="transition",Je="animation",Dt=Symbol("_vtc"),Ns={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},To=a.extend({},qn,Ns),Vs=(e=>(e.displayName="Transition",e.props=To,e))((e,{slots:t})=>Ss(Ui,xo(e),t)),Oe=(e,t=[])=>{a.isArray(e)?e.forEach(n=>n(...t)):e&&e(...t)},Os=e=>e?a.isArray(e)?e.some(t=>t.length>1):e.length>1:!1;function xo(e){const t={};for(const g in e)g in Ns||(t[g]=e[g]);if(e.css===!1)return t;const{name:n="v",type:s,duration:o,enterFromClass:i=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:u=i,appearActiveClass:f=r,appearToClass:p=l,leaveFromClass:c=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,y=Po(o),V=y&&y[0],j=y&&y[1],{onBeforeEnter:te,onEnter:G,onEnterCancelled:ne,onLeave:_,onLeaveCancelled:k,onBeforeAppear:K=te,onAppear:ae=G,onAppearCancelled:Ge=ne}=t,E=(g,P,X)=>{Ce(g,P?p:l),Ce(g,P?f:r),X&&X()},T=(g,P)=>{g._isLeaving=!1,Ce(g,c),Ce(g,h),Ce(g,d),P&&P()},A=g=>(P,X)=>{const Pt=g?ae:G,Js=()=>E(P,g,X);Oe(Pt,[P,Js]),Cs(()=>{Ce(P,g?u:i),we(P,g?p:l),Os(Pt)||Ts(P,s,V,Js)})};return a.extend(t,{onBeforeEnter(g){Oe(te,[g]),we(g,i),we(g,r)},onBeforeAppear(g){Oe(K,[g]),we(g,u),we(g,f)},onEnter:A(!1),onAppear:A(!0),onLeave(g,P){g._isLeaving=!0;const X=()=>T(g,P);we(g,c),we(g,d),Ao(),Cs(()=>{g._isLeaving&&(Ce(g,c),we(g,h),Os(_)||Ts(g,s,j,X))}),Oe(_,[g,X])},onEnterCancelled(g){E(g,!1),Oe(ne,[g])},onAppearCancelled(g){E(g,!0),Oe(Ge,[g])},onLeaveCancelled(g){T(g),Oe(k,[g])}})}function Po(e){if(e==null)return null;if(a.isObject(e))return[fn(e.enter),fn(e.leave)];{const t=fn(e);return[t,t]}}function fn(e){const t=a.toNumber(e);return process.env.NODE_ENV!=="production"&&Mi(t,"<transition> explicit duration"),t}function we(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Dt]||(e[Dt]=new Set)).add(t)}function Ce(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Dt];n&&(n.delete(t),n.size||(e[Dt]=void 0))}function Cs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Mo=0;function Ts(e,t,n,s){const o=e._endId=++Mo,i=()=>{o===e._endId&&s()};if(n)return setTimeout(i,n);const{type:r,timeout:l,propCount:u}=ko(e,t);if(!r)return s();const f=r+"end";let p=0;const c=()=>{e.removeEventListener(f,d),i()},d=h=>{h.target===e&&++p>=u&&c()};setTimeout(()=>{p<u&&c()},l+1),e.addEventListener(f,d)}function ko(e,t){const n=window.getComputedStyle(e),s=y=>(n[y]||"").split(", "),o=s(`${ve}Delay`),i=s(`${ve}Duration`),r=xs(o,i),l=s(`${Je}Delay`),u=s(`${Je}Duration`),f=xs(l,u);let p=null,c=0,d=0;t===ve?r>0&&(p=ve,c=r,d=i.length):t===Je?f>0&&(p=Je,c=f,d=u.length):(c=Math.max(r,f),p=c>0?r>f?ve:Je:null,d=p?p===ve?i.length:u.length:0);const h=p===ve&&/\b(transform|all)(,|$)/.test(s(`${ve}Property`).toString());return{type:p,timeout:c,propCount:d,hasTransform:h}}function xs(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,s)=>Ps(n)+Ps(e[s])))}function Ps(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ao(){return document.body.offsetHeight}const Ms=Symbol("_vod"),Io=Symbol("_vsh"),dn={beforeMount(e,{value:t},{transition:n}){e[Ms]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):qe(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),qe(e,!0),s.enter(e)):s.leave(e,()=>{qe(e,!1)}):qe(e,t))},beforeUnmount(e,{value:t}){qe(e,t)}};process.env.NODE_ENV!=="production"&&(dn.name="show");function qe(e,t){e.style.display=t?e[Ms]:"none",e[Io]=!t}Symbol(process.env.NODE_ENV!=="production"?"CSS_VAR_TEXT":"");function _e(e,t,n,s){e.addEventListener(t,n,s)}const be=e=>{const t=e.props["onUpdate:modelValue"]||!1;return a.isArray(t)?n=>a.invokeArrayFns(t,n):t};function Fo(e){e.target.composing=!0}function ks(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const q=Symbol("_assign"),As={created(e,{modifiers:{lazy:t,trim:n,number:s}},o){e[q]=be(o);const i=s||o.props&&o.props.type==="number";_e(e,t?"change":"input",r=>{if(r.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=a.looseToNumber(l)),e[q](l)}),n&&_e(e,"change",()=>{e.value=e.value.trim()}),t||(_e(e,"compositionstart",Fo),_e(e,"compositionend",ks),_e(e,"change",ks))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:o,number:i}},r){if(e[q]=be(r),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?a.looseToNumber(e.value):e.value,u=t??"";l!==u&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||o&&e.value.trim()===u)||(e.value=u))}},Is={deep:!0,created(e,t,n){e[q]=be(n),_e(e,"change",()=>{const s=e._modelValue,o=ke(e),i=e.checked,r=e[q];if(a.isArray(s)){const l=a.looseIndexOf(s,o),u=l!==-1;if(i&&!u)r(s.concat(o));else if(!i&&u){const f=[...s];f.splice(l,1),r(f)}}else if(a.isSet(s)){const l=new Set(s);i?l.add(o):l.delete(o),r(l)}else r(Rs(e,i))})},mounted:Fs,beforeUpdate(e,t,n){e[q]=be(n),Fs(e,t,n)}};function Fs(e,{value:t,oldValue:n},s){e._modelValue=t;let o;a.isArray(t)?o=a.looseIndexOf(t,s.props.value)>-1:a.isSet(t)?o=t.has(s.props.value):o=a.looseEqual(t,Rs(e,!0)),e.checked!==o&&(e.checked=o)}const $o={created(e,{value:t},n){e.checked=a.looseEqual(t,n.props.value),e[q]=be(n),_e(e,"change",()=>{e[q](ke(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e[q]=be(s),t!==n&&(e.checked=a.looseEqual(t,s.props.value))}},Ro={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const o=a.isSet(t);_e(e,"change",()=>{const i=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?a.looseToNumber(ke(r)):ke(r));e[q](e.multiple?o?new Set(i):i:i[0]),e._assigning=!0,Ln(()=>{e._assigning=!1})}),e[q]=be(s)},mounted(e,{value:t,modifiers:{number:n}}){$s(e,t)},beforeUpdate(e,t,n){e[q]=be(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||$s(e,t)}};function $s(e,t,n){const s=e.multiple,o=a.isArray(t);if(s&&!o&&!a.isSet(t)){process.env.NODE_ENV!=="production"&&Es(`<select multiple v-model> expects an Array or Set value for its binding, but got ${Object.prototype.toString.call(t).slice(8,-1)}.`);return}for(let i=0,r=e.options.length;i<r;i++){const l=e.options[i],u=ke(l);if(s)if(o){const f=typeof u;f==="string"||f==="number"?l.selected=t.some(p=>String(p)===String(u)):l.selected=a.looseIndexOf(t,u)>-1}else l.selected=t.has(u);else if(a.looseEqual(ke(l),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}function ke(e){return"_value"in e?e._value:e.value}function Rs(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const Lo={created(e,t,n){Nt(e,t,n,null,"created")},mounted(e,t,n){Nt(e,t,n,null,"mounted")},beforeUpdate(e,t,n,s){Nt(e,t,n,s,"beforeUpdate")},updated(e,t,n,s){Nt(e,t,n,s,"updated")}};function Ho(e,t){switch(e){case"SELECT":return Ro;case"TEXTAREA":return As;default:switch(t){case"checkbox":return Is;case"radio":return $o;default:return As}}}function Nt(e,t,n,s,o){const r=Ho(e.tagName,n.props&&n.props.type)[o];r&&r(e,t,n,s)}const Bo=["ctrl","shift","alt","meta"],zo={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Bo.some(n=>e[`${n}Key`]&&!t.includes(n))},Ae=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(o,...i)=>{for(let r=0;r<t.length;r++){const l=zo[t[r]];if(l&&l(o,t))return}return e(o,...i)})};/**
19
+ * vue v3.5.6
20
20
  * (c) 2018-present Yuxi (Evan) You and Vue contributors
21
21
  * @license MIT
22
- **/function bi(){ri()}process.env.NODE_ENV!=="production"&&bi();const vi={class:"dito-calendar"},Ei={class:"dito-calendar-popup"},Si={class:"dito-calendar-inner"},Ni={class:"dito-calendar-header"},Vi={class:"dito-calendar-body"},Di={class:"dito-calendar-weekdays"},Ci={class:"dito-calendar-dates"},Oi=["onClick"],Ti={class:"dito-calendar-footer"},Pi=["title"],Mi={class:"dito-calendar-header"},xi={class:"dito-calendar-body"},ki={class:"dito-calendar-months"},Fi=["onClick"],Ai={class:"dito-calendar-header"},Ii={class:"dito-calendar-body"},$i={class:"dito-calendar-years"},Ri=["onClick"];function Li(e,t,n,s,i,o){return m(),w("div",vi,[_("div",Ei,[_("div",Si,[i.currentMode==="day"?(m(),w(O,{key:0},[_("div",Ni,[_("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>o.stepYear(-1))}),_("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>o.stepMonth(-1))}),_("span",null,[_("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>o.setMode("year"))},l.toDisplayString(o.dateToString(i.currentValue,{year:!0})),1),_("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>o.setMode("month"))},l.toDisplayString(o.dateToString(i.currentValue,{month:!0})),1)]),_("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>o.stepMonth(1))}),_("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>o.stepYear(1))})]),_("div",Vi,[_("div",Di,[(m(!0),w(O,null,ce(i.weekdayNames,r=>(m(),w("span",null,l.toDisplayString(r.short),1))),256))]),_("div",Ci,[(m(!0),w(O,null,ce(i.dateRange,r=>(m(),w("span",{class:l.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:a=>r.state!=="disabled"&&o.selectDate(r.date)},l.toDisplayString(r.text),11,Oi))),256))])]),_("div",Ti,[_("a",{class:"dito-calendar-select-now",role:"button",title:o.dateToString(new Date),onClick:t[6]||(t[6]=r=>o.selectDate(new Date))},null,8,Pi)])],64)):i.currentMode==="month"?(m(),w(O,{key:1},[_("div",Mi,[_("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>o.stepYear(-1))}),_("span",null,[_("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>o.setMode("year"))},l.toDisplayString(o.dateToString(i.currentValue,{year:!0})),1)]),_("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>o.stepYear(1))})]),_("div",xi,[_("div",ki,[(m(!0),w(O,null,ce(i.monthNames,(r,a)=>(m(),w("span",{class:l.normalizeClass(o.getMonthClass(a)),onClick:c=>o.selectMonth(a)},l.toDisplayString(r.short),11,Fi))),256))])])],64)):i.currentMode==="year"?(m(),w(O,{key:2},[_("div",Ai,[_("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>o.stepDecade(-1))}),_("span",null,l.toDisplayString(o.decadeToString(i.currentValue)),1),_("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>o.stepDecade(1))})]),_("div",Ii,[_("div",$i,[(m(!0),w(O,null,ce(i.yearRange,r=>(m(),w("span",{class:l.normalizeClass(o.getYearClass(r)),onClick:a=>o.selectYear(r)},l.toDisplayString(r),11,Ri))),256))])])],64)):j("",!0)])])])}const ee=(e,t)=>{const n=e.__vccOpts||e;for(const[s,i]of t)n[s]=i;return n},Bi={emits:["update:modelValue","select"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=Hi(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e,t=!1){this.currentValue=Fe(this.currentValue,e),t&&this.$emit("update:modelValue",this.currentValue)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:n,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(n,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e){this.setDate(_t(e),!0),this.$emit("select")},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1},!0)},selectYear(e){this.setMode("month"),this.setDate({year:e},!0)},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:n,day:s}={year:!0,month:!0,day:!0}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:n&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({step:e,enter:t,mode:n=this.currentMode,update:s=!1}){const{currentValue:i}=this;if(e){switch(n){case"day":this.setDate({day:i.getDate()+e},s);break;case"month":this.setDate({month:i.getMonth()+e},s);break;case"year":this.setDate({year:i.getFullYear()+e},s);break}return!0}else if(t){switch(this.currentMode){case"day":this.selectDate(i);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),n=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let f=0;f<10;f++)this.yearRange.push(s+f);let o=new Date(t,n,1).getDay()+1;o===0&&(o=7);const r=this.getDaysInMonth(t,n);if(o>1){const f=this.getYearMonth(t,n-1),d=this.getDaysInMonth(f.year,f.month);for(let u=1;u<o;u++){const p=d-o+u+1,h=new Date(f.year,f.month,p);this.dateRange.push({text:p,date:h,state:this.disabledDate(h)?"disabled":"gray"})}}const a=new Date;for(let f=1;f<=r;f++){const d=new Date(t,n,f),u=h=>h&&h.getDate()===f&&h.getFullYear()===t&&h.getMonth()===n,p=u(this.modelValue)?"active":u(a)?"today":this.disabledDate(d)?"disabled":u(e)?"current":null;this.dateRange.push({text:f,date:d,state:p})}const c=42-this.dateRange.length;if(c>0){const f=this.getYearMonth(t,n+1);for(let d=1;d<=c;d++){const u=new Date(f.year,f.month,d),p=this.disabledDate(u)?"disabled":"gray";this.dateRange.push({text:d,date:u,state:p})}}}}},bs={};function Hi(e){let t=bs[e];if(!t){const n=[];for(let i=0;i<7;i++){const o=new Date(0,0,i);n.push({long:o.toLocaleString(e,{weekday:"long"}),short:o.toLocaleString(e,{weekday:"short"})})}const s=[];for(let i=1;i<=12;i++){const o=new Date(0,i,0);s.push({long:o.toLocaleString(e,{month:"long"}),short:o.toLocaleString(e,{month:"short"})})}t=bs[e]={weekdayNames:n,monthNames:s}}return t}const vs=ee(Bi,[["render",Li]]);function pt(e,t){e=e instanceof NodeList?Array.from(e):$.asArray(e);for(const[n,s]of Object.entries(t))for(const i of e)i.addEventListener(n,s,!1);return{remove(){for(const[n,s]of Object.entries(t))for(const i of e)i.removeEventListener(n,s,!1)}}}function Es(...e){return{remove(){for(const t of e)t.remove()}}}function Ss(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e==null?void 0:e.keyCode]}function ht(e){const t=Ss(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}function Zt(e){const t=$.isString(e.target)?e.$refs[e.target]:e.target;return(t==null?void 0:t.$el)??t}const zi={class:"dito-trigger-container"};function Ki(e,t,n,s,i,o){return m(),w("div",zi,[n.alwaysShow?(m(),w("div",{key:0,class:l.normalizeClass(["dito-trigger",o.triggerClass]),ref:"trigger"},[T(e.$slots,"trigger")],2)):n.trigger==="click"?(m(),w("div",{key:1,class:l.normalizeClass(["dito-trigger",o.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>o.onClick&&o.onClick(...r))},[T(e.$slots,"trigger")],2)):n.trigger==="hover"?(m(),w("div",{key:2,class:l.normalizeClass(["dito-trigger",o.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>o.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>o.onHover(!1))},[T(e.$slots,"trigger")],34)):n.trigger==="focus"||n.trigger==="always"?(m(),w("div",{key:3,class:l.normalizeClass(["dito-trigger",o.triggerClass]),ref:"trigger"},[T(e.$slots,"trigger")],2)):j("",!0),F(ft,{name:`dito-${n.transition}`},{default:H(()=>[n.trigger==="hover"?st((m(),w("div",{key:0,class:l.normalizeClass(["dito-popup",o.popupClass]),ref:"popup",style:l.normalizeStyle(o.popupStyle),onMouseenter:t[3]||(t[3]=r=>o.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>o.onHover(!1))},[i.showPopup?T(e.$slots,"popup",{key:0}):j("",!0)],38)),[[Qt,i.showPopup]]):st((m(),w("div",{key:1,class:l.normalizeClass(["dito-popup",o.popupClass]),ref:"popup",style:l.normalizeStyle(o.popupStyle)},[i.showPopup?T(e.$slots,"popup",{key:0}):j("",!0)],6)),[[Qt,i.showPopup]])]),_:3},8,["name"])])}const en=ee({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement,focusEvents:null,closeEvents:null,popupEvents:null,blurTimer:null,mouseLeaveTimer:null}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${$.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""},triggerTarget(){return Zt(this)}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),this.$nextTick(()=>this.onShowPopup(e)))}},mounted(){const{trigger:e,popup:t}=this.$refs;this.trigger==="focus"&&(this.focusEvents=this.addFocusEvents(this.triggerTarget??e)),this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=pt(window,{mouseup:n=>{var s;this.showPopup&&!t.contains(n.target)&&!e.contains(n.target)&&!((s=this.triggerTarget)!=null&&s.contains(n.target))&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},unmounted(){var e,t,n;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),(n=this.popupEvents)==null||n.remove()},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const n=this.triggerTarget??e,s=this.target==="popup"?e:t.firstElementChild;s&&(s.style.width=getComputedStyle(n).width);const i=n.getBoundingClientRect(),o=i.left+window.scrollX,r=i.top+window.scrollY,a=i.width,c=i.height,f=t.offsetWidth,d=t.offsetHeight;let[u,p]=this.popupPlacement.split("-")||[];if(this.keepInView){const b=window.innerWidth,A=window.innerHeight;u==="top"?r<d&&(u="bottom"):u==="bottom"?A-r-c<d&&(u="top"):u==="left"?o<f&&(u="right"):u==="right"&&b-o-a<f&&(u="left"),p==="top"?A-r<d&&(p="bottom"):p==="bottom"?r+c<d&&(p="top"):p==="left"?b-o<f&&(p="right"):p==="right"&&o+a<f&&(p="left")}let h=0,y=0;switch(u){case"top":y-=d;break;case"left":h-=f;break;case"right":h+=a;break;case"bottom":y+=c;break}switch(p){case"right":h-=f-a;break;case"bottom":y-=d-c;break}if(this.cover&&(u==="top"?y+=c:u==="bottom"&&(y-=c)),n!==e){const b=e.getBoundingClientRect();h+=o-b.left,y+=r-b.top}t.style.left=`${h}px`,t.style.top=`${y}px`},addFocusEvents(e){const t=e.querySelectorAll("input, textarea");let n;return Es(pt(t,{focus:()=>{this.showPopup=!0,clearTimeout(this.blurTimer)},blur:()=>{this.blurTimer=setTimeout(()=>{this.$refs.popup.matches(":focus-within")||(this.showPopup=!1)},0)}}),pt(e,{mousedown:s=>{s.target.matches("input, textarea, button")||(s.preventDefault(),s.stopPropagation()),s.target.matches(".dito-button-clear")||(n=(this.triggerTarget??this.$refs.trigger).querySelector("input, textarea"),n&&!n.hasAttribute("readonly")?n.setAttribute("readonly","true"):n=null)},mouseup:s=>{n&&setTimeout(()=>{n.removeAttribute("readonly"),s.target.matches("input, textarea, button")||n.focus(),n=null},0)}}))},onShowPopup(e){var t;e?(this.trigger==="focus"&&(this.popupEvents=this.addFocusEvents(this.$refs.popup)),this.updatePosition()):((t=this.popupEvents)==null||t.remove(),this.popupEvents=null)},onClick(){this.disabled||(this.showPopup=!0)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",Ki]]),ji=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function Ui(e,t,n,s,i,o){return m(),w("div",{class:l.normalizeClass(["dito-input",o.classes])},[T(e.$slots,"before"),st(_("input",J({id:n.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>i.currentValue=r),type:n.type,name:n.name,title:n.title,disabled:n.disabled,readonly:n.readonly,autofocus:n.autofocus,placeholder:n.placeholder,autocomplete:n.autocomplete,"aria-label":n.title},o.attributes),null,16,ji),[[mi,i.currentValue]]),T(e.$slots,"after")],2)}const gt=ee({emits:["update:modelValue"],inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{classes(){return this.$attrs.class},attributes(){const{class:e,...t}=this.$attrs;return t},input(){return this.$refs.input},size(){const{size:e,min:t,max:n}=this.$attrs,s=i=>i!=null?`${i}`.length:0;return e||s(t)||s(n)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Ui]]);function Yi(e,t,n,s,i,o){return m(),w("i",{class:l.normalizeClass(["dito-icon",{["dito-icon--"+n.name]:!0,"dito-icon--disabled":n.disabled}])},null,2)}const mt=ee({props:{name:{type:String,required:!0},disabled:{type:Boolean,default:!1}}},[["render",Yi]]);function te(e,{start:t,end:n}){e!=null&&e.setSelectionRange&&(e.focus(),e.setSelectionRange(t,n))}function xe(e){return e&&"selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:null}function Wi(e,t,n,s,i,o){const r=W("Icon"),a=W("InputField"),c=W("Calendar"),f=W("Trigger");return m(),Oe(f,J({class:"dito-date-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[7]||(t[7]=d=>i.showPopup=d),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:H(()=>[e.$slots.trigger?T(e.$slots,"trigger",{key:0}):(m(),Oe(a,J({key:1,class:["dito-date-picker-input",{"dito-focus":o.focused}],ref:"input",modelValue:o.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>o.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>o.onFocus(!0)),onBlur:t[3]||(t[3]=d=>o.onFocus(!1)),onKeydown:o.onKeyDown,onMousedown:t[4]||(t[4]=Me(d=>o.onMouseDown(!1),["stop"]))}),{before:H(()=>[T(e.$slots,"before")]),after:H(()=>[F(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Me(d=>o.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),T(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:H(()=>[F(c,J({class:"dito-date-picker-popup",ref:"calendar",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d)},{locale:n.locale,disabledDate:n.disabledDate},{onSelect:t[6]||(t[6]=d=>i.showPopup=!1)}),null,16,["modelValue"])]),_:3},16,["show"])}const Ns=ee({components:{Trigger:en,Calendar:vs,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({date:$.defaultFormats.date,time:!1})},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Zt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return $.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){var s;const{ver:t,enter:n}=ht(e);if(t||n){e.preventDefault();const i=(s=xe(this.input))==null?void 0:s.start,o=r=>wt(this.currentText,r,this.formatOptions);if(t&&!this.showPopup)this.showPopup=!0;else{const{calendar:r}=this.$refs;if(r){const{name:a,start:c}=o(i)||{};a&&r.navigate({step:t,enter:n,mode:a,update:!0})&&this.$nextTick(()=>te(this.input,o(c)))}}}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Wi]]),qi={class:"dito-time-picker-popup"},Ji={class:"dito-time-picker-panel"},Gi={class:"dito-time-picker-hour",ref:"hour"},Xi=["onClick"],Qi={class:"dito-time-picker-panel"},Zi={class:"dito-time-picker-minute",ref:"minute"},er=["onClick"],tr={class:"dito-time-picker-panel"},nr={class:"dito-time-picker-second",ref:"second"},sr=["onClick"];function or(e,t,n,s,i,o){const r=W("Icon"),a=W("InputField"),c=W("Trigger");return m(),Oe(c,J({class:"dito-time-picker",ref:"trigger",show:i.showPopup,"onUpdate:show":t[5]||(t[5]=f=>i.showPopup=f),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:H(()=>[e.$slots.trigger?T(e.$slots,"trigger",{key:0}):(m(),Oe(a,J({key:1,class:["dito-time-picker-input",{"dito-focus":o.focused}],ref:"input",modelValue:o.currentText,"onUpdate:modelValue":t[1]||(t[1]=f=>o.currentText=f),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=f=>o.onFocus(!0)),onBlur:t[3]||(t[3]=f=>o.onFocus(!1)),onKeydown:o.onKeyDown,onMousedown:t[4]||(t[4]=Me(f=>o.onMouseDown(!1),["stop"]))}),{before:H(()=>[T(e.$slots,"before")]),after:H(()=>[F(r,{name:"clock",disabled:n.disabled,onMousedown:t[0]||(t[0]=Me(f=>o.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),T(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:H(()=>[_("div",qi,[_("div",Ji,[_("ul",Gi,[(m(),w(O,null,ce(24,f=>(m(),w(O,null,[n.disabledHour(f-1)?j("",!0):(m(),w("li",{key:0,class:l.normalizeClass({selected:o.hour===f-1}),onClick:d=>o.hour=f-1},l.toDisplayString(o.leftPad(f-1)),11,Xi))],64))),64))],512)]),_("div",Qi,[_("ul",Zi,[(m(),w(O,null,ce(60,f=>(m(),w(O,null,[n.disabledMinute(f-1)?j("",!0):(m(),w("li",{key:0,class:l.normalizeClass({selected:o.minute===f-1}),onClick:d=>o.minute=f-1},l.toDisplayString(o.leftPad(f-1)),11,er))],64))),64))],512)]),_("div",tr,[_("ul",nr,[(m(),w(O,null,ce(60,f=>(m(),w(O,null,[n.disabledSecond(f-1)?j("",!0):(m(),w("li",{key:0,class:l.normalizeClass({selected:o.second===f-1}),onClick:d=>o.second=f-1},l.toDisplayString(o.leftPad(f-1)),11,sr))],64))),64))],512)])])]),_:3},16,["show"])}const Vs=ee({components:{Trigger:en,InputField:gt,Icon:mt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({time:$.defaultFormats.time,date:!1})},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,ignoreNextChange:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=Zt(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return $.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);t&&(this.currentValue=t)}},currentDate(){return this.currentValue||Fe(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e,this.scrollAll(!0))},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e),this.scrollAll(!0))},currentText(){const{input:e}=this,t=xe(e);this.focused&&!this.ignoreNextChange&&t.start===t.end&&this.$nextTick(()=>te(e,t)),this.ignoreNextChange=!1},show(e){this.showPopup=e},showPopup(e,t){e&&this.scrollAll(!1),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=Fe(this.currentDate,{...e,millisecond:0})},scrollAll(e){const t=(n,s)=>{const i=this.$refs[n];if(i){const o=i.scrollHeight/(i.childElementCount+6),r=Math.round(s*o),a=Math.abs(i.scrollTop-r);i.scrollTo({top:r,behavior:e&&a<100?"smooth":"auto"})}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{input:t}=this,n=xe(t),{ver:s,enter:i}=ht(e);if(s||i){e.preventDefault();const o=r=>wt(this.currentText,r,this.formatOptions);if(s)if(!this.showPopup)this.showPopup=!0;else{const{name:r,start:a}=o(n.start)||{};if(r){const c=this[r]+s,f=this.$refs[r].childElementCount;this[r]=c<0?c+f:c>=f?c-f:c,this.ignoreNextChange=!0,this.$nextTick(()=>te(t,o(a)))}}else i&&(this.showPopup=!1)}else if(n.start===n.end){const{value:o}=t;let r=n.start;const a=c=>!isNaN(parseInt(c,10));if(e.key.length===1)if(a(e.key)&&r<o.length)o[r]===":"&&a(o[r-1])&&a(o[r-2])&&r++,a(o[r])&&(a(o[r+1])||a(o[r-1]))&&(t.value=o.slice(0,r)+o.slice(r+1),te(t,{start:r,end:r}));else{const c=$.format(this.currentValue,this.formatOptions).length;o.length===c?e.preventDefault():o.length>c&&(t.value=o.slice(0,c),te(t,n),e.preventDefault())}else e.key==="Backspace"&&(r===1||[" ",":"].includes(o[r-2]))&&(r===o.length||o[r]===":"?(r--,t.value=o.slice(0,r)+((o[r-1]??"")+"00")+o.slice(r+1),te(t,{start:r,end:r})):a(o[r])&&!a(+o[r+1])&&(t.value=o.slice(0,r)+"0"+o.slice(r),te(t,{start:r,end:r})))}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",or]]),ir={class:"dito-date-time-picker",ref:"picker"};function rr(e,t,n,s,i,o){const r=W("Icon"),a=W("InputField"),c=W("DatePicker"),f=W("TimePicker");return m(),w("div",ir,[_("div",{class:l.normalizeClass(["dito-date-time-picker__inner",{"dito-focus":o.focused}])},[F(a,J({class:["dito-date-time-picker__input",{"dito-focus":o.focused}],ref:"input",modelValue:o.currentText,"onUpdate:modelValue":t[1]||(t[1]=d=>o.currentText=d),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=d=>o.onFocus(!0)),onBlur:t[3]||(t[3]=d=>o.onFocus(!1)),onKeydown:o.onKeyDown,onMousedown:t[4]||(t[4]=Me(d=>o.onMouseDown(!1),["stop"]))}),{before:H(()=>[T(e.$slots,"before")]),after:H(()=>[F(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Me(d=>o.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),T(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]),F(c,J({ref:"date",modelValue:i.currentValue,"onUpdate:modelValue":t[5]||(t[5]=d=>i.currentValue=d),show:i.showDate,"onUpdate:show":t[6]||(t[6]=d=>i.showDate=d),placement:"bottom-left",target:e.$refs.picker},o.attributes),{trigger:H(()=>[]),_:1},16,["modelValue","show","target"]),F(f,J({ref:"time",modelValue:i.currentValue,"onUpdate:modelValue":t[7]||(t[7]=d=>i.currentValue=d),show:i.showTime,"onUpdate:show":t[8]||(t[8]=d=>i.showTime=d),placement:"bottom-right",target:e.$refs.picker},o.attributes),{trigger:H(()=>[]),_:1},16,["modelValue","show","target"])],2)],512)}const lr=ee({components:{InputField:gt,DatePicker:Ns,TimePicker:Vs,Icon:mt},emits:["update:modelValue","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},disabled:{type:Boolean,default:!1},locale:{type:String,default:"en-US"},format:{type:Object,default:null}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,inputFocused:!1,dateFocused:!1,timeFocused:!1,closedMode:null}},computed:{attributes(){const{transition:e,disabled:t,locale:n,formatOptions:s}=this;return{transition:e,disabled:t,locale:n,format:s}},focused(){return this.inputFocused||this.showDate||this.showTime},input(){return this.$refs.input.input},formatOptions(){return $.assignDeeply({locale:this.locale,time:$.defaultFormats.time,date:$.defaultFormats.date},{date:{month:"short",format:(e,t,n)=>{var s,i,o;return t==="literal"&&/\bat\b/.test(e)?", ":((o=(i=(s=this.format)==null?void 0:s.date)==null?void 0:i.format)==null?void 0:o.call(i,e,t,n))??e}}},this.format)},timeIndex(){var t;const e=this.currentText;if(e){const n=(t=e.match(/([\S]+\s*)$/))==null?void 0:t[1];if(n)return e.length-n.length}return null},currentText:{get(){return $.format(this.currentValue,this.formatOptions)||""},set(e){const t=je(e,this.formatOptions);if(t){const n=xe(this.input);this.currentValue=t,this.$nextTick(()=>te(this.input,n))}}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,e?this.updatePopups():(this.showDate=!1,this.showTime=!1)},onMouseDown(e){e&&(this.showDate||this.showTime)?(this.showDate=!1,this.showTime=!1):this.disabled||(this.focus(),requestAnimationFrame(()=>this.updatePopups()))},onKeyDown(e){const t=this.getMode(e);this.$refs[t].onKeyDown(e),e.defaultPrevented?this.closedMode=t:t!==this.closedMode&&this.updatePopups(t)},getMode(e=null){const{start:t}=xe(this.input),{hor:n}=ht(e);return this.timeIndex===null||t+n<this.timeIndex?"date":"time"},updatePopups(e=this.getMode()){e&&(this.closedMode=null),this.showDate=e==="date",this.showTime=e==="time"},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",rr]]),ar={class:"dito-pagination"},ur={key:0,class:"dito-pagination-total"},cr={key:1,class:"dito-buttons dito-buttons-round"},fr=["disabled","onClick"],dr={key:0};function pr(e,t,n,s,i,o){return m(),w("div",ar,[n.showTotal?(m(),w("div",ur,[n.total>0?(m(),w(O,{key:0},[ut(l.toDisplayString(o.first)+" – "+l.toDisplayString(o.last)+" / "+l.toDisplayString(n.total),1)],64)):j("",!0)])):j("",!0),o.numPages>1?(m(),w("div",cr,[(m(!0),w(O,null,ce(o.buttons,r=>(m(),w("button",{class:l.normalizeClass(["dito-button",o.getButtonClasses(r)]),disabled:r.disabled,onClick:a=>o.onClickButton(r)},[r.text?(m(),w("span",dr,l.toDisplayString(r.text),1)):j("",!0)],10,fr))),256))])):j("",!0)])}const hr=ee({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{showPrev:!0,showNext:!0,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.pageSize+1},last(){return Math.min(this.first+this.pageSize-1,this.total)},numPages(){return Math.ceil(this.total/this.pageSize)},buttons(){const{showPrev:e,showNext:t,currentPage:n,numPages:s}=this,i=e+t+1;let o=1,r=1;s<=i?r=s:n<=e+1?r=i:n>=s-t?(r=s,o=s-i+1):(o=n-e,r=n+t);const a=[];a.push({index:n-1,type:"prev",disabled:n<=1}),o>=2&&a.push({index:1,text:1}),o>2&&a.push({index:Math.max(1,n-10),type:"ellipsis-prev"});for(let c=o;c<=r;c++)a.push({index:c,text:c,active:c===n});return r<s-1&&a.push({index:Math.min(s,n+10),type:"ellipsis-next"}),r<=s-1&&a.push({index:s,text:s}),a.push({index:n+1,type:"next",disabled:n>=s}),a}},watch:{page(e){this.currentPage=e},pageSize(){this.currentPage>this.numPages&&(this.currentPage=this.numPages)},currentPage(e,t){e!==t&&this.$emit("update:page",e)}},created(){this.currentPage=this.page},methods:{getButtonClasses(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},onClickButton(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)}}},[["render",pr]]),gr={class:"dito-switch-pane"},mr=["id","name","disabled"],yr=_("div",{class:"dito-switch-button"},null,-1),_r={key:0,class:"dito-switch-label"};function wr(e,t,n,s,i,o){return m(),w("div",{class:l.normalizeClass(["dito-switch",o.classes]),style:l.normalizeStyle(o.styles)},[_("div",gr,[st(_("input",J({id:n.id,ref:"input"},o.attributes,{"onUpdate:modelValue":t[0]||(t[0]=r=>i.checked=r),type:"checkbox",name:n.name,disabled:n.disabled}),null,16,mr),[[ms,i.checked]]),yr,n.labels?(m(),w("span",_r,[i.checked?T(e.$slots,"checked",{key:0},()=>[ut(l.toDisplayString(n.labels.checked||"on"),1)]):T(e.$slots,"unchecked",{key:1},()=>[ut(l.toDisplayString(n.labels.unchecked||"off"),1)])])):j("",!0)])],6)}const br=ee({emits:["update:modelValue","change"],inheritAttrs:!1,props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){return[this.$attrs.class,{"dito-checked":this.checked,"dito-disabled":this.disabled}]},styles(){const{labels:{checked:e,unchecked:t}={}}=this,n=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":n?`${n*1.5}rem`:null}},attributes(){const{class:e,...t}=this.$attrs;return t}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",wr]]);function Ds({enabled:e},{slots:t}){return e?rs(ft,Er,t):t.default()}Ds.props={enabled:{type:Boolean,default:!0}};const vr=Ds,ke=(e,t)=>Object.assign(e.style,t),yt=e=>setTimeout(e,0),Cs=e=>getComputedStyle(e).height,Er={name:"dito-height",onAfterEnter(e){yt(()=>ke(e,{height:null}))},onEnter(e){const{width:t}=getComputedStyle(e);ke(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"}),yt(()=>{const{height:n}=getComputedStyle(e);ke(e,{width:null,position:null,visibility:null,height:0}),Cs(e),yt(()=>ke(e,{height:n}))})},onLeave(e){const{height:t}=getComputedStyle(e);ke(e,{height:t}),Cs(e),yt(()=>ke(e,{height:0}))}};function Os(e){return e&&$.asArray(e).some(t=>t.type!==Z)}function Sr(e,t={}){return e=$.isString(e)?Ko()[e]:e,Os(e==null?void 0:e(t))}function Nr(e){return En({value:e})}V.Calendar=vs,V.DatePicker=Ns,V.DateTimePicker=lr,V.Icon=mt,V.InputField=gt,V.Pagination=hr,V.SwitchButton=br,V.TimePicker=Vs,V.TransitionHeight=vr,V.Trigger=en,V.addEvents=pt,V.alterDate=Fe,V.combineEvents=Es,V.describeDate=_t,V.getDatePartAtPosition=wt,V.getKey=Ss,V.getKeyNavigation=ht,V.getSelection=xe,V.hasSlotContent=Sr,V.hasVNodeContent=Os,V.parseDate=je,V.raw=Nr,V.setSelection=te,Object.defineProperty(V,Symbol.toStringTag,{value:"Module"})});
23
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9kYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcmUvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS1idW5kbGVyLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvQ2FsZW5kYXIudnVlIiwiLi4vc3JjL3V0aWxzL2V2ZW50LmpzIiwiLi4vc3JjL3V0aWxzL3RyaWdnZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0lucHV0RmllbGQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSWNvbi52dWUiLCIuLi9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVBpY2tlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RhdGVUaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uL3NyYy91dGlscy92dWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGF0ZShkYXRlKSB7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICAgIG1vbnRoOiBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gICAgZGF5OiBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgICBob3VyOiBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gICAgbWludXRlOiBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgICBzZWNvbmQ6IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICAgIG1pbGxpc2Vjb25kOiBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGVyRGF0ZShkYXRlLCBvdmVycmlkZXMgPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoLi4uT2JqZWN0LnZhbHVlcyh7IC4uLmRlc2NyaWJlRGF0ZShkYXRlKSwgLi4ub3ZlcnJpZGVzIH0pKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKHN0cmluZywge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCB0aW1lRGVmYXVsdCA9IHRpbWUgPyBudWxsIDogMFxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuLVVTJyAmJiBzZXAxID09PSAnLycgJiYgc2VwMiA9PT0gJy8nKSB7XG4gICAgICAvLyBBbWVyaWNhbiBmb3JtYXQ6IE1NL0REL1lZWVlcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgICAreWVhcixcbiAgICAgICAgK21vbnRoLFxuICAgICAgICArZGF5LFxuICAgICAgICAraG91cixcbiAgICAgICAgK21pbnV0ZSxcbiAgICAgICAgK3NlY29uZCxcbiAgICAgICAgK21pbGxpc2Vjb25kXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUGFydEF0UG9zaXRpb24oc3RyaW5nLCBwb3NpdGlvbiwge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuXG4gIGNvbnN0IGdldFBvc2l0aW9uID0gKHBvc2l0aW9uLCBsZW5ndGggPSBwYXJ0cy5sZW5ndGgpID0+IHtcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBpbmRleCA9IDBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5tb2RpZmllZC1sb29wLWNvbmRpdGlvblxuICAgIHdoaWxlICgocG9zaXRpb24gPT09IG51bGwgfHwgcG9zIDw9IHBvc2l0aW9uKSAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcG9zICs9IHBhcnRzW2luZGV4KytdPy5sZW5ndGggPz8gMFxuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbjogcG9zLCBpbmRleCB9XG4gIH1cblxuICAvLyBUaW1lIHN0YXJ0cyBhdCBpbmRleCA2LCBkdWUgdG8gdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgZGF0ZS5cbiAgY29uc3Qgb2Zmc2V0ID0gIWRhdGUgPyBnZXRQb3NpdGlvbihudWxsLCA2KS5wb3NpdGlvbiA6IDBcbiAgcG9zaXRpb24gKz0gb2Zmc2V0XG5cbiAgbGV0IHsgaW5kZXggfSA9IGdldFBvc2l0aW9uKHBvc2l0aW9uKVxuXG4gIGNvbnN0IGlzVVMgPSBsb2NhbGUgPT09ICdlbi1VUydcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIGlzVVMgPyAnbW9udGgnIDogJ2RheScsXG4gICAgbnVsbCxcbiAgICBpc1VTID8gJ2RheScgOiAnbW9udGgnLFxuICAgIG51bGwsXG4gICAgJ3llYXInLFxuICAgIG51bGwsXG4gICAgJ2hvdXInLFxuICAgIG51bGwsXG4gICAgJ21pbnV0ZScsXG4gICAgbnVsbCxcbiAgICAnc2Vjb25kJyxcbiAgICBudWxsLFxuICAgICdtaWxsaXNlY29uZCdcbiAgXVxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmICh2YWx1ZXNbaW5kZXhdKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGdldFBvc2l0aW9uKG51bGwsIGluZGV4KS5wb3NpdGlvbiAtIG9mZnNldFxuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYXJ0c1tpbmRleF0ubGVuZ3RoXG4gICAgICByZXR1cm4geyBuYW1lOiB2YWx1ZXNbaW5kZXhdLCBzdGFydCwgZW5kIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlID0gdHJ1ZSwgdGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gc3RyaW5nPy5zcGxpdCgvKFtcXHMuLDovXSspLykgfHwgW11cbiAgaWYgKCFkYXRlKSB7XG4gICAgLy8gQWRkIGR1bW15IGRhdGUgcGFydHMgdG8gbWFrZSBzdXJlIHdlIGdldCBhIHRpbWUtb25seSBkYXRlLlxuICAgIHBhcnRzLnVuc2hpZnQoJzEnLCAnLicsICcxJywgJy4nLCAnMjAwMCcsICcgJylcbiAgfVxuICBpZiAoIXRpbWUgJiYgcGFydHMubGVuZ3RoID4gNSkge1xuICAgIHBhcnRzLmxlbmd0aCA9IDVcbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhJbmRleChtb250aCwgeyBsb2NhbGUgPSAnZW4tVVMnIH0gPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9ICttb250aFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSAtIDFcbiAgfVxuICBjb25zdCBtYXRjaCA9IG1vbnRoLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChtYXRjaC5sZW5ndGggPCAzKSByZXR1cm4gbnVsbFxuICBjb25zdCBzaG9ydEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICBjb25zdCBsb25nRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIGksIDEpXG4gICAgaWYgKFxuICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaCkgfHxcbiAgICAgIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaClcbiAgICApIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCIvKipcbiogQHZ1ZS9yZWFjdGl2aXR5IHYzLjQuMTBcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IE5PT1AsIGV4dGVuZCwgaXNBcnJheSwgaXNTeW1ib2wsIGlzTWFwLCBpc0ludGVnZXJLZXksIGhhc093biwgaGFzQ2hhbmdlZCwgaXNPYmplY3QsIG1ha2VNYXAsIGNhcGl0YWxpemUsIHRvUmF3VHlwZSwgZGVmLCBpc0Z1bmN0aW9uIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5mdW5jdGlvbiB3YXJuKG1zZywgLi4uYXJncykge1xuICBjb25zb2xlLndhcm4oYFtWdWUgd2Fybl0gJHttc2d9YCwgLi4uYXJncyk7XG59XG5cbmxldCBhY3RpdmVFZmZlY3RTY29wZTtcbmNsYXNzIEVmZmVjdFNjb3BlIHtcbiAgY29uc3RydWN0b3IoZGV0YWNoZWQgPSBmYWxzZSkge1xuICAgIHRoaXMuZGV0YWNoZWQgPSBkZXRhY2hlZDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZWZmZWN0cyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuY2xlYW51cHMgPSBbXTtcbiAgICB0aGlzLnBhcmVudCA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgIGlmICghZGV0YWNoZWQgJiYgYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgICAgIHRoaXMuaW5kZXggPSAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzIHx8IChhY3RpdmVFZmZlY3RTY29wZS5zY29wZXMgPSBbXSkpLnB1c2goXG4gICAgICAgIHRoaXNcbiAgICAgICkgLSAxO1xuICAgIH1cbiAgfVxuICBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cbiAgcnVuKGZuKSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgY29uc3QgY3VycmVudEVmZmVjdFNjb3BlID0gYWN0aXZlRWZmZWN0U2NvcGU7XG4gICAgICB0cnkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYWN0aXZlRWZmZWN0U2NvcGUgPSBjdXJyZW50RWZmZWN0U2NvcGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKGBjYW5ub3QgcnVuIGFuIGluYWN0aXZlIGVmZmVjdCBzY29wZS5gKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1kZXRhY2hlZCBzY29wZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvbigpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG5vbi1kZXRhY2hlZCBzY29wZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBvZmYoKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUgPSB0aGlzLnBhcmVudDtcbiAgfVxuICBzdG9wKGZyb21QYXJlbnQpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBsZXQgaSwgbDtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmVmZmVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWZmZWN0c1tpXS5zdG9wKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5jbGVhbnVwcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwc1tpXSgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2NvcGVzKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLnNjb3Blcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnNjb3Blc1tpXS5zdG9wKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZGV0YWNoZWQgJiYgdGhpcy5wYXJlbnQgJiYgIWZyb21QYXJlbnQpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHRoaXMucGFyZW50LnNjb3Blcy5wb3AoKTtcbiAgICAgICAgaWYgKGxhc3QgJiYgbGFzdCAhPT0gdGhpcykge1xuICAgICAgICAgIHRoaXMucGFyZW50LnNjb3Blc1t0aGlzLmluZGV4XSA9IGxhc3Q7XG4gICAgICAgICAgbGFzdC5pbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucGFyZW50ID0gdm9pZCAwO1xuICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlZmZlY3RTY29wZShkZXRhY2hlZCkge1xuICByZXR1cm4gbmV3IEVmZmVjdFNjb3BlKGRldGFjaGVkKTtcbn1cbmZ1bmN0aW9uIHJlY29yZEVmZmVjdFNjb3BlKGVmZmVjdCwgc2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZSkge1xuICBpZiAoc2NvcGUgJiYgc2NvcGUuYWN0aXZlKSB7XG4gICAgc2NvcGUuZWZmZWN0cy5wdXNoKGVmZmVjdCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEN1cnJlbnRTY29wZSgpIHtcbiAgcmV0dXJuIGFjdGl2ZUVmZmVjdFNjb3BlO1xufVxuZnVuY3Rpb24gb25TY29wZURpc3Bvc2UoZm4pIHtcbiAgaWYgKGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUuY2xlYW51cHMucHVzaChmbik7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4oXG4gICAgICBgb25TY29wZURpc3Bvc2UoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgZWZmZWN0IHNjb3BlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gXG4gICAgKTtcbiAgfVxufVxuXG5sZXQgYWN0aXZlRWZmZWN0O1xuY2xhc3MgUmVhY3RpdmVFZmZlY3Qge1xuICBjb25zdHJ1Y3RvcihmbiwgdHJpZ2dlciwgc2NoZWR1bGVyLCBzY29wZSkge1xuICAgIHRoaXMuZm4gPSBmbjtcbiAgICB0aGlzLnRyaWdnZXIgPSB0cmlnZ2VyO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyO1xuICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB0aGlzLmRlcHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9kaXJ0eUxldmVsID0gMztcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl90cmFja0lkID0gMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9ydW5uaW5ncyA9IDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fcXVlcnlpbmdzID0gMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl9kZXBzTGVuZ3RoID0gMDtcbiAgICByZWNvcmRFZmZlY3RTY29wZSh0aGlzLCBzY29wZSk7XG4gIH1cbiAgZ2V0IGRpcnR5KCkge1xuICAgIGlmICh0aGlzLl9kaXJ0eUxldmVsID09PSAxKSB7XG4gICAgICB0aGlzLl9kaXJ0eUxldmVsID0gMDtcbiAgICAgIHRoaXMuX3F1ZXJ5aW5ncysrO1xuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgZm9yIChjb25zdCBkZXAgb2YgdGhpcy5kZXBzKSB7XG4gICAgICAgIGlmIChkZXAuY29tcHV0ZWQpIHtcbiAgICAgICAgICB0cmlnZ2VyQ29tcHV0ZWQoZGVwLmNvbXB1dGVkKTtcbiAgICAgICAgICBpZiAodGhpcy5fZGlydHlMZXZlbCA+PSAyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHRoaXMuX3F1ZXJ5aW5ncy0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGlydHlMZXZlbCA+PSAyO1xuICB9XG4gIHNldCBkaXJ0eSh2KSB7XG4gICAgdGhpcy5fZGlydHlMZXZlbCA9IHYgPyAzIDogMDtcbiAgfVxuICBydW4oKSB7XG4gICAgdGhpcy5fZGlydHlMZXZlbCA9IDA7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICB9XG4gICAgbGV0IGxhc3RTaG91bGRUcmFjayA9IHNob3VsZFRyYWNrO1xuICAgIGxldCBsYXN0RWZmZWN0ID0gYWN0aXZlRWZmZWN0O1xuICAgIHRyeSB7XG4gICAgICBzaG91bGRUcmFjayA9IHRydWU7XG4gICAgICBhY3RpdmVFZmZlY3QgPSB0aGlzO1xuICAgICAgdGhpcy5fcnVubmluZ3MrKztcbiAgICAgIHByZUNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy5mbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwb3N0Q2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHRoaXMuX3J1bm5pbmdzLS07XG4gICAgICBhY3RpdmVFZmZlY3QgPSBsYXN0RWZmZWN0O1xuICAgICAgc2hvdWxkVHJhY2sgPSBsYXN0U2hvdWxkVHJhY2s7XG4gICAgfVxuICB9XG4gIHN0b3AoKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgcHJlQ2xlYW51cEVmZmVjdCh0aGlzKTtcbiAgICAgIHBvc3RDbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgKF9hID0gdGhpcy5vblN0b3ApID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXJDb21wdXRlZChjb21wdXRlZCkge1xuICByZXR1cm4gY29tcHV0ZWQudmFsdWU7XG59XG5mdW5jdGlvbiBwcmVDbGVhbnVwRWZmZWN0KGVmZmVjdDIpIHtcbiAgZWZmZWN0Mi5fdHJhY2tJZCsrO1xuICBlZmZlY3QyLl9kZXBzTGVuZ3RoID0gMDtcbn1cbmZ1bmN0aW9uIHBvc3RDbGVhbnVwRWZmZWN0KGVmZmVjdDIpIHtcbiAgaWYgKGVmZmVjdDIuZGVwcyAmJiBlZmZlY3QyLmRlcHMubGVuZ3RoID4gZWZmZWN0Mi5fZGVwc0xlbmd0aCkge1xuICAgIGZvciAobGV0IGkgPSBlZmZlY3QyLl9kZXBzTGVuZ3RoOyBpIDwgZWZmZWN0Mi5kZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjbGVhbnVwRGVwRWZmZWN0KGVmZmVjdDIuZGVwc1tpXSwgZWZmZWN0Mik7XG4gICAgfVxuICAgIGVmZmVjdDIuZGVwcy5sZW5ndGggPSBlZmZlY3QyLl9kZXBzTGVuZ3RoO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhbnVwRGVwRWZmZWN0KGRlcCwgZWZmZWN0Mikge1xuICBjb25zdCB0cmFja0lkID0gZGVwLmdldChlZmZlY3QyKTtcbiAgaWYgKHRyYWNrSWQgIT09IHZvaWQgMCAmJiBlZmZlY3QyLl90cmFja0lkICE9PSB0cmFja0lkKSB7XG4gICAgZGVwLmRlbGV0ZShlZmZlY3QyKTtcbiAgICBpZiAoZGVwLnNpemUgPT09IDApIHtcbiAgICAgIGRlcC5jbGVhbnVwKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlZmZlY3QoZm4sIG9wdGlvbnMpIHtcbiAgaWYgKGZuLmVmZmVjdCBpbnN0YW5jZW9mIFJlYWN0aXZlRWZmZWN0KSB7XG4gICAgZm4gPSBmbi5lZmZlY3QuZm47XG4gIH1cbiAgY29uc3QgX2VmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChmbiwgTk9PUCwgKCkgPT4ge1xuICAgIGlmIChfZWZmZWN0LmRpcnR5KSB7XG4gICAgICBfZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgZXh0ZW5kKF9lZmZlY3QsIG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zLnNjb3BlKVxuICAgICAgcmVjb3JkRWZmZWN0U2NvcGUoX2VmZmVjdCwgb3B0aW9ucy5zY29wZSk7XG4gIH1cbiAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLmxhenkpIHtcbiAgICBfZWZmZWN0LnJ1bigpO1xuICB9XG4gIGNvbnN0IHJ1bm5lciA9IF9lZmZlY3QucnVuLmJpbmQoX2VmZmVjdCk7XG4gIHJ1bm5lci5lZmZlY3QgPSBfZWZmZWN0O1xuICByZXR1cm4gcnVubmVyO1xufVxuZnVuY3Rpb24gc3RvcChydW5uZXIpIHtcbiAgcnVubmVyLmVmZmVjdC5zdG9wKCk7XG59XG5sZXQgc2hvdWxkVHJhY2sgPSB0cnVlO1xubGV0IHBhdXNlU2NoZWR1bGVTdGFjayA9IDA7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gcGF1c2VTY2hlZHVsaW5nKCkge1xuICBwYXVzZVNjaGVkdWxlU3RhY2srKztcbn1cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGluZygpIHtcbiAgcGF1c2VTY2hlZHVsZVN0YWNrLS07XG4gIHdoaWxlICghcGF1c2VTY2hlZHVsZVN0YWNrICYmIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5sZW5ndGgpIHtcbiAgICBxdWV1ZUVmZmVjdFNjaGVkdWxlcnMuc2hpZnQoKSgpO1xuICB9XG59XG5mdW5jdGlvbiB0cmFja0VmZmVjdChlZmZlY3QyLCBkZXAsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBpZiAoZGVwLmdldChlZmZlY3QyKSAhPT0gZWZmZWN0Mi5fdHJhY2tJZCkge1xuICAgIGRlcC5zZXQoZWZmZWN0MiwgZWZmZWN0Mi5fdHJhY2tJZCk7XG4gICAgY29uc3Qgb2xkRGVwID0gZWZmZWN0Mi5kZXBzW2VmZmVjdDIuX2RlcHNMZW5ndGhdO1xuICAgIGlmIChvbGREZXAgIT09IGRlcCkge1xuICAgICAgaWYgKG9sZERlcCkge1xuICAgICAgICBjbGVhbnVwRGVwRWZmZWN0KG9sZERlcCwgZWZmZWN0Mik7XG4gICAgICB9XG4gICAgICBlZmZlY3QyLmRlcHNbZWZmZWN0Mi5fZGVwc0xlbmd0aCsrXSA9IGRlcDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWZmZWN0Mi5fZGVwc0xlbmd0aCsrO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgKF9hID0gZWZmZWN0Mi5vblRyYWNrKSA9PSBudWxsID8gdm9pZCAwIDogX2EuY2FsbChlZmZlY3QyLCBleHRlbmQoeyBlZmZlY3Q6IGVmZmVjdDIgfSwgZGVidWdnZXJFdmVudEV4dHJhSW5mbykpO1xuICAgIH1cbiAgfVxufVxuY29uc3QgcXVldWVFZmZlY3RTY2hlZHVsZXJzID0gW107XG5mdW5jdGlvbiB0cmlnZ2VyRWZmZWN0cyhkZXAsIGRpcnR5TGV2ZWwsIGRlYnVnZ2VyRXZlbnRFeHRyYUluZm8pIHtcbiAgdmFyIF9hO1xuICBwYXVzZVNjaGVkdWxpbmcoKTtcbiAgZm9yIChjb25zdCBlZmZlY3QyIG9mIGRlcC5rZXlzKCkpIHtcbiAgICBpZiAoIWVmZmVjdDIuYWxsb3dSZWN1cnNlICYmIGVmZmVjdDIuX3J1bm5pbmdzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGVmZmVjdDIuX2RpcnR5TGV2ZWwgPCBkaXJ0eUxldmVsICYmICghZWZmZWN0Mi5fcnVubmluZ3MgfHwgZGlydHlMZXZlbCAhPT0gMikpIHtcbiAgICAgIGNvbnN0IGxhc3REaXJ0eUxldmVsID0gZWZmZWN0Mi5fZGlydHlMZXZlbDtcbiAgICAgIGVmZmVjdDIuX2RpcnR5TGV2ZWwgPSBkaXJ0eUxldmVsO1xuICAgICAgaWYgKGxhc3REaXJ0eUxldmVsID09PSAwICYmICghZWZmZWN0Mi5fcXVlcnlpbmdzIHx8IGRpcnR5TGV2ZWwgIT09IDIpKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgKF9hID0gZWZmZWN0Mi5vblRyaWdnZXIpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGVmZmVjdDIsIGV4dGVuZCh7IGVmZmVjdDogZWZmZWN0MiB9LCBkZWJ1Z2dlckV2ZW50RXh0cmFJbmZvKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWZmZWN0Mi50cmlnZ2VyKCk7XG4gICAgICAgIGlmIChlZmZlY3QyLnNjaGVkdWxlcikge1xuICAgICAgICAgIHF1ZXVlRWZmZWN0U2NoZWR1bGVycy5wdXNoKGVmZmVjdDIuc2NoZWR1bGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXNldFNjaGVkdWxpbmcoKTtcbn1cblxuY29uc3QgY3JlYXRlRGVwID0gKGNsZWFudXAsIGNvbXB1dGVkKSA9PiB7XG4gIGNvbnN0IGRlcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGRlcC5jbGVhbnVwID0gY2xlYW51cDtcbiAgZGVwLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG4gIHJldHVybiBkZXA7XG59O1xuXG5jb25zdCB0YXJnZXRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IElURVJBVEVfS0VZID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIml0ZXJhdGVcIiA6IFwiXCIpO1xuY29uc3QgTUFQX0tFWV9JVEVSQVRFX0tFWSA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJNYXAga2V5IGl0ZXJhdGVcIiA6IFwiXCIpO1xuZnVuY3Rpb24gdHJhY2sodGFyZ2V0LCB0eXBlLCBrZXkpIHtcbiAgaWYgKHNob3VsZFRyYWNrICYmIGFjdGl2ZUVmZmVjdCkge1xuICAgIGxldCBkZXBzTWFwID0gdGFyZ2V0TWFwLmdldCh0YXJnZXQpO1xuICAgIGlmICghZGVwc01hcCkge1xuICAgICAgdGFyZ2V0TWFwLnNldCh0YXJnZXQsIGRlcHNNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgbGV0IGRlcCA9IGRlcHNNYXAuZ2V0KGtleSk7XG4gICAgaWYgKCFkZXApIHtcbiAgICAgIGRlcHNNYXAuc2V0KGtleSwgZGVwID0gY3JlYXRlRGVwKCgpID0+IGRlcHNNYXAuZGVsZXRlKGtleSkpKTtcbiAgICB9XG4gICAgdHJhY2tFZmZlY3QoXG4gICAgICBhY3RpdmVFZmZlY3QsXG4gICAgICBkZXAsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGtleVxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHRyaWdnZXIodGFyZ2V0LCB0eXBlLCBrZXksIG5ld1ZhbHVlLCBvbGRWYWx1ZSwgb2xkVGFyZ2V0KSB7XG4gIGNvbnN0IGRlcHNNYXAgPSB0YXJnZXRNYXAuZ2V0KHRhcmdldCk7XG4gIGlmICghZGVwc01hcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZGVwcyA9IFtdO1xuICBpZiAodHlwZSA9PT0gXCJjbGVhclwiKSB7XG4gICAgZGVwcyA9IFsuLi5kZXBzTWFwLnZhbHVlcygpXTtcbiAgfSBlbHNlIGlmIChrZXkgPT09IFwibGVuZ3RoXCIgJiYgaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgY29uc3QgbmV3TGVuZ3RoID0gTnVtYmVyKG5ld1ZhbHVlKTtcbiAgICBkZXBzTWFwLmZvckVhY2goKGRlcCwga2V5MikgPT4ge1xuICAgICAgaWYgKGtleTIgPT09IFwibGVuZ3RoXCIgfHwgIWlzU3ltYm9sKGtleTIpICYmIGtleTIgPj0gbmV3TGVuZ3RoKSB7XG4gICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChrZXkgIT09IHZvaWQgMCkge1xuICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJhZGRcIjpcbiAgICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkpIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgZGVwcy5wdXNoKGRlcHNNYXAuZ2V0KE1BUF9LRVlfSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNJbnRlZ2VyS2V5KGtleSkpIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoXCJsZW5ndGhcIikpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICBpZiAoIWlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXBzTWFwLmdldChJVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgICAgaWYgKGlzTWFwKHRhcmdldCkpIHtcbiAgICAgICAgICBkZXBzLnB1c2goZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcGF1c2VTY2hlZHVsaW5nKCk7XG4gIGZvciAoY29uc3QgZGVwIG9mIGRlcHMpIHtcbiAgICBpZiAoZGVwKSB7XG4gICAgICB0cmlnZ2VyRWZmZWN0cyhcbiAgICAgICAgZGVwLFxuICAgICAgICAzLFxuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgICBvbGRUYXJnZXRcbiAgICAgICAgfSA6IHZvaWQgMFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRTY2hlZHVsaW5nKCk7XG59XG5mdW5jdGlvbiBnZXREZXBGcm9tUmVhY3RpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKF9hID0gdGFyZ2V0TWFwLmdldChvYmplY3QpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0KGtleSk7XG59XG5cbmNvbnN0IGlzTm9uVHJhY2thYmxlS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBtYWtlTWFwKGBfX3Byb3RvX18sX192X2lzUmVmLF9faXNWdWVgKTtcbmNvbnN0IGJ1aWx0SW5TeW1ib2xzID0gbmV3IFNldChcbiAgLyogQF9fUFVSRV9fICovIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN5bWJvbCkuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJhcmd1bWVudHNcIiAmJiBrZXkgIT09IFwiY2FsbGVyXCIpLm1hcCgoa2V5KSA9PiBTeW1ib2xba2V5XSkuZmlsdGVyKGlzU3ltYm9sKVxuKTtcbmNvbnN0IGFycmF5SW5zdHJ1bWVudGF0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMoKTtcbmZ1bmN0aW9uIGNyZWF0ZUFycmF5SW5zdHJ1bWVudGF0aW9ucygpIHtcbiAgY29uc3QgaW5zdHJ1bWVudGF0aW9ucyA9IHt9O1xuICBbXCJpbmNsdWRlc1wiLCBcImluZGV4T2ZcIiwgXCJsYXN0SW5kZXhPZlwiXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpbnN0cnVtZW50YXRpb25zW2tleV0gPSBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhcnIgPSB0b1Jhdyh0aGlzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJhY2soYXJyLCBcImdldFwiLCBpICsgXCJcIik7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPSBhcnJba2V5XSguLi5hcmdzKTtcbiAgICAgIGlmIChyZXMgPT09IC0xIHx8IHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGFycltrZXldKC4uLmFyZ3MubWFwKHRvUmF3KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH07XG4gIH0pO1xuICBbXCJwdXNoXCIsIFwicG9wXCIsIFwic2hpZnRcIiwgXCJ1bnNoaWZ0XCIsIFwic3BsaWNlXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGluc3RydW1lbnRhdGlvbnNba2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIHBhdXNlU2NoZWR1bGluZygpO1xuICAgICAgY29uc3QgcmVzID0gdG9SYXcodGhpcylba2V5XS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIHJlc2V0U2NoZWR1bGluZygpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIGluc3RydW1lbnRhdGlvbnM7XG59XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShrZXkpIHtcbiAgY29uc3Qgb2JqID0gdG9SYXcodGhpcyk7XG4gIHRyYWNrKG9iaiwgXCJoYXNcIiwga2V5KTtcbiAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpO1xufVxuY2xhc3MgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKF9pc1JlYWRvbmx5ID0gZmFsc2UsIF9zaGFsbG93ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9pc1JlYWRvbmx5ID0gX2lzUmVhZG9ubHk7XG4gICAgdGhpcy5fc2hhbGxvdyA9IF9zaGFsbG93O1xuICB9XG4gIGdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpIHtcbiAgICBjb25zdCBpc1JlYWRvbmx5MiA9IHRoaXMuX2lzUmVhZG9ubHksIHNoYWxsb3cgPSB0aGlzLl9zaGFsbG93O1xuICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIikge1xuICAgICAgcmV0dXJuICFpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFkb25seVwiKSB7XG4gICAgICByZXR1cm4gaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzU2hhbGxvd1wiKSB7XG4gICAgICByZXR1cm4gc2hhbGxvdztcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIpIHtcbiAgICAgIGlmIChyZWNlaXZlciA9PT0gKGlzUmVhZG9ubHkyID8gc2hhbGxvdyA/IHNoYWxsb3dSZWFkb25seU1hcCA6IHJlYWRvbmx5TWFwIDogc2hhbGxvdyA/IHNoYWxsb3dSZWFjdGl2ZU1hcCA6IHJlYWN0aXZlTWFwKS5nZXQodGFyZ2V0KSB8fCAvLyByZWNlaXZlciBpcyBub3QgdGhlIHJlYWN0aXZlIHByb3h5LCBidXQgaGFzIHRoZSBzYW1lIHByb3RvdHlwZVxuICAgICAgLy8gdGhpcyBtZWFucyB0aGUgcmVjaWV2ZXIgaXMgYSB1c2VyIHByb3h5IG9mIHRoZSByZWFjdGl2ZSBwcm94eVxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWNlaXZlcikpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0SXNBcnJheSA9IGlzQXJyYXkodGFyZ2V0KTtcbiAgICBpZiAoIWlzUmVhZG9ubHkyKSB7XG4gICAgICBpZiAodGFyZ2V0SXNBcnJheSAmJiBoYXNPd24oYXJyYXlJbnN0cnVtZW50YXRpb25zLCBrZXkpKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldChhcnJheUluc3RydW1lbnRhdGlvbnMsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gXCJoYXNPd25Qcm9wZXJ0eVwiKSB7XG4gICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKTtcbiAgICBpZiAoaXNTeW1ib2woa2V5KSA/IGJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpIDogaXNOb25UcmFja2FibGVLZXlzKGtleSkpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwga2V5KTtcbiAgICB9XG4gICAgaWYgKHNoYWxsb3cpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmIChpc1JlZihyZXMpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0SXNBcnJheSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IHJlcyA6IHJlcy52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHJlcykpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MiA/IHJlYWRvbmx5KHJlcykgOiByZWFjdGl2ZShyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5jbGFzcyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKHNoYWxsb3cgPSBmYWxzZSkge1xuICAgIHN1cGVyKGZhbHNlLCBzaGFsbG93KTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgIGxldCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmICghdGhpcy5fc2hhbGxvdykge1xuICAgICAgY29uc3QgaXNPbGRWYWx1ZVJlYWRvbmx5ID0gaXNSZWFkb25seShvbGRWYWx1ZSk7XG4gICAgICBpZiAoIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgICAgIG9sZFZhbHVlID0gdG9SYXcob2xkVmFsdWUpO1xuICAgICAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBcnJheSh0YXJnZXQpICYmIGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICAgIGlmIChpc09sZFZhbHVlUmVhZG9ubHkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2xkVmFsdWUudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBoYWRLZXkgPSBpc0FycmF5KHRhcmdldCkgJiYgaXNJbnRlZ2VyS2V5KGtleSkgPyBOdW1iZXIoa2V5KSA8IHRhcmdldC5sZW5ndGggOiBoYXNPd24odGFyZ2V0LCBrZXkpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3Quc2V0KHRhcmdldCwga2V5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xuICAgIGlmICh0YXJnZXQgPT09IHRvUmF3KHJlY2VpdmVyKSkge1xuICAgICAgaWYgKCFoYWRLZXkpIHtcbiAgICAgICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIGtleSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgICAgdHJpZ2dlcih0YXJnZXQsIFwic2V0XCIsIGtleSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSkge1xuICAgIGNvbnN0IGhhZEtleSA9IGhhc093bih0YXJnZXQsIGtleSk7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0YXJnZXRba2V5XTtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KTtcbiAgICBpZiAocmVzdWx0ICYmIGhhZEtleSkge1xuICAgICAgdHJpZ2dlcih0YXJnZXQsIFwiZGVsZXRlXCIsIGtleSwgdm9pZCAwLCBvbGRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaGFzKHRhcmdldCwga2V5KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5oYXModGFyZ2V0LCBrZXkpO1xuICAgIGlmICghaXNTeW1ib2woa2V5KSB8fCAhYnVpbHRJblN5bWJvbHMuaGFzKGtleSkpIHtcbiAgICAgIHRyYWNrKHRhcmdldCwgXCJoYXNcIiwga2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBvd25LZXlzKHRhcmdldCkge1xuICAgIHRyYWNrKFxuICAgICAgdGFyZ2V0LFxuICAgICAgXCJpdGVyYXRlXCIsXG4gICAgICBpc0FycmF5KHRhcmdldCkgPyBcImxlbmd0aFwiIDogSVRFUkFURV9LRVlcbiAgICApO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgfVxufVxuY2xhc3MgUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVhY3RpdmVIYW5kbGVyIHtcbiAgY29uc3RydWN0b3Ioc2hhbGxvdyA9IGZhbHNlKSB7XG4gICAgc3VwZXIodHJ1ZSwgc2hhbGxvdyk7XG4gIH1cbiAgc2V0KHRhcmdldCwga2V5KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBTZXQgb3BlcmF0aW9uIG9uIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBkZWxldGVQcm9wZXJ0eSh0YXJnZXQsIGtleSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRGVsZXRlIG9wZXJhdGlvbiBvbiBrZXkgXCIke1N0cmluZyhrZXkpfVwiIGZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbmNvbnN0IG11dGFibGVIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTXV0YWJsZVJlYWN0aXZlSGFuZGxlcigpO1xuY29uc3QgcmVhZG9ubHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIoKTtcbmNvbnN0IHNoYWxsb3dSZWFjdGl2ZUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyKFxuICB0cnVlXG4pO1xuY29uc3Qgc2hhbGxvd1JlYWRvbmx5SGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyKHRydWUpO1xuXG5jb25zdCB0b1NoYWxsb3cgPSAodmFsdWUpID0+IHZhbHVlO1xuY29uc3QgZ2V0UHJvdG8gPSAodikgPT4gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih2KTtcbmZ1bmN0aW9uIGdldCh0YXJnZXQsIGtleSwgaXNSZWFkb25seSA9IGZhbHNlLCBpc1NoYWxsb3cgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkpIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChrZXksIHJhd0tleSkpIHtcbiAgICAgIHRyYWNrKHJhd1RhcmdldCwgXCJnZXRcIiwga2V5KTtcbiAgICB9XG4gICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiLCByYXdLZXkpO1xuICB9XG4gIGNvbnN0IHsgaGFzOiBoYXMyIH0gPSBnZXRQcm90byhyYXdUYXJnZXQpO1xuICBjb25zdCB3cmFwID0gaXNTaGFsbG93ID8gdG9TaGFsbG93IDogaXNSZWFkb25seSA/IHRvUmVhZG9ubHkgOiB0b1JlYWN0aXZlO1xuICBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwga2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQoa2V5KSk7XG4gIH0gZWxzZSBpZiAoaGFzMi5jYWxsKHJhd1RhcmdldCwgcmF3S2V5KSkge1xuICAgIHJldHVybiB3cmFwKHRhcmdldC5nZXQocmF3S2V5KSk7XG4gIH0gZWxzZSBpZiAodGFyZ2V0ICE9PSByYXdUYXJnZXQpIHtcbiAgICB0YXJnZXQuZ2V0KGtleSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhcyhrZXksIGlzUmVhZG9ubHkgPSBmYWxzZSkge1xuICBjb25zdCB0YXJnZXQgPSB0aGlzW1wiX192X3Jhd1wiXTtcbiAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKCFpc1JlYWRvbmx5KSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwgcmF3S2V5KTtcbiAgfVxuICByZXR1cm4ga2V5ID09PSByYXdLZXkgPyB0YXJnZXQuaGFzKGtleSkgOiB0YXJnZXQuaGFzKGtleSkgfHwgdGFyZ2V0LmhhcyhyYXdLZXkpO1xufVxuZnVuY3Rpb24gc2l6ZSh0YXJnZXQsIGlzUmVhZG9ubHkgPSBmYWxzZSkge1xuICB0YXJnZXQgPSB0YXJnZXRbXCJfX3ZfcmF3XCJdO1xuICAhaXNSZWFkb25seSAmJiB0cmFjayh0b1Jhdyh0YXJnZXQpLCBcIml0ZXJhdGVcIiwgSVRFUkFURV9LRVkpO1xuICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBcInNpemVcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgY29uc3QgaGFkS2V5ID0gcHJvdG8uaGFzLmNhbGwodGFyZ2V0LCB2YWx1ZSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAgdGFyZ2V0LmFkZCh2YWx1ZSk7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiYWRkXCIsIHZhbHVlLCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5mdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHsgaGFzOiBoYXMyLCBnZXQ6IGdldDIgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gIGxldCBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIGtleSA9IHRvUmF3KGtleSk7XG4gICAgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gZ2V0Mi5jYWxsKHRhcmdldCwga2V5KTtcbiAgdGFyZ2V0LnNldChrZXksIHZhbHVlKTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwga2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwic2V0XCIsIGtleSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIGRlbGV0ZUVudHJ5KGtleSkge1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyID8gZ2V0Mi5jYWxsKHRhcmdldCwga2V5KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmRlbGV0ZShrZXkpO1xuICBpZiAoaGFkS2V5KSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiZGVsZXRlXCIsIGtleSwgdm9pZCAwLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgaGFkSXRlbXMgPSB0YXJnZXQuc2l6ZSAhPT0gMDtcbiAgY29uc3Qgb2xkVGFyZ2V0ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGlzTWFwKHRhcmdldCkgPyBuZXcgTWFwKHRhcmdldCkgOiBuZXcgU2V0KHRhcmdldCkgOiB2b2lkIDA7XG4gIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5jbGVhcigpO1xuICBpZiAoaGFkSXRlbXMpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJjbGVhclwiLCB2b2lkIDAsIHZvaWQgMCwgb2xkVGFyZ2V0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlRm9yRWFjaChpc1JlYWRvbmx5LCBpc1NoYWxsb3cpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBjb25zdCBvYnNlcnZlZCA9IHRoaXM7XG4gICAgY29uc3QgdGFyZ2V0ID0gb2JzZXJ2ZWRbXCJfX3ZfcmF3XCJdO1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gICAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdyA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAhaXNSZWFkb25seSAmJiB0cmFjayhyYXdUYXJnZXQsIFwiaXRlcmF0ZVwiLCBJVEVSQVRFX0tFWSk7XG4gICAgcmV0dXJuIHRhcmdldC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB3cmFwKHZhbHVlKSwgd3JhcChrZXkpLCBvYnNlcnZlZCk7XG4gICAgfSk7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJdGVyYWJsZU1ldGhvZChtZXRob2QsIGlzUmVhZG9ubHksIGlzU2hhbGxvdykge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRvUmF3KHRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0SXNNYXAgPSBpc01hcChyYXdUYXJnZXQpO1xuICAgIGNvbnN0IGlzUGFpciA9IG1ldGhvZCA9PT0gXCJlbnRyaWVzXCIgfHwgbWV0aG9kID09PSBTeW1ib2wuaXRlcmF0b3IgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaXNLZXlPbmx5ID0gbWV0aG9kID09PSBcImtleXNcIiAmJiB0YXJnZXRJc01hcDtcbiAgICBjb25zdCBpbm5lckl0ZXJhdG9yID0gdGFyZ2V0W21ldGhvZF0oLi4uYXJncyk7XG4gICAgY29uc3Qgd3JhcCA9IGlzU2hhbGxvdyA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAhaXNSZWFkb25seSAmJiB0cmFjayhcbiAgICAgIHJhd1RhcmdldCxcbiAgICAgIFwiaXRlcmF0ZVwiLFxuICAgICAgaXNLZXlPbmx5ID8gTUFQX0tFWV9JVEVSQVRFX0tFWSA6IElURVJBVEVfS0VZXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gaXRlcmF0b3IgcHJvdG9jb2xcbiAgICAgIG5leHQoKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGlubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gZG9uZSA/IHsgdmFsdWUsIGRvbmUgfSA6IHtcbiAgICAgICAgICB2YWx1ZTogaXNQYWlyID8gW3dyYXAodmFsdWVbMF0pLCB3cmFwKHZhbHVlWzFdKV0gOiB3cmFwKHZhbHVlKSxcbiAgICAgICAgICBkb25lXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgLy8gaXRlcmFibGUgcHJvdG9jb2xcbiAgICAgIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUmVhZG9ubHlNZXRob2QodHlwZSkge1xuICByZXR1cm4gZnVuY3Rpb24oLi4uYXJncykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmdzWzBdID8gYG9uIGtleSBcIiR7YXJnc1swXX1cIiBgIDogYGA7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke2NhcGl0YWxpemUodHlwZSl9IG9wZXJhdGlvbiAke2tleX1mYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0b1Jhdyh0aGlzKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGUgPT09IFwiZGVsZXRlXCIgPyBmYWxzZSA6IHR5cGUgPT09IFwiY2xlYXJcIiA/IHZvaWQgMCA6IHRoaXM7XG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVJbnN0cnVtZW50YXRpb25zKCkge1xuICBjb25zdCBtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXkpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzKTtcbiAgICB9LFxuICAgIGhhcyxcbiAgICBhZGQsXG4gICAgc2V0LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgY2xlYXIsXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaChmYWxzZSwgZmFsc2UpXG4gIH07XG4gIGNvbnN0IHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgZmFsc2UsIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzKTtcbiAgICB9LFxuICAgIGhhcyxcbiAgICBhZGQsXG4gICAgc2V0LFxuICAgIGRlbGV0ZTogZGVsZXRlRW50cnksXG4gICAgY2xlYXIsXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaChmYWxzZSwgdHJ1ZSlcbiAgfTtcbiAgY29uc3QgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIGZhbHNlKVxuICB9O1xuICBjb25zdCBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMsIHRydWUpO1xuICAgIH0sXG4gICAgaGFzKGtleSkge1xuICAgICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMsIGtleSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBhZGQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiYWRkXCIpLFxuICAgIHNldDogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJzZXRcIiksXG4gICAgZGVsZXRlOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImRlbGV0ZVwiKSxcbiAgICBjbGVhcjogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJjbGVhclwiKSxcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKHRydWUsIHRydWUpXG4gIH07XG4gIGNvbnN0IGl0ZXJhdG9yTWV0aG9kcyA9IFtcImtleXNcIiwgXCJ2YWx1ZXNcIiwgXCJlbnRyaWVzXCIsIFN5bWJvbC5pdGVyYXRvcl07XG4gIGl0ZXJhdG9yTWV0aG9kcy5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgZmFsc2UsXG4gICAgICBmYWxzZVxuICAgICk7XG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICB0cnVlLFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QoXG4gICAgICBtZXRob2QsXG4gICAgICBmYWxzZSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyW21ldGhvZF0gPSBjcmVhdGVJdGVyYWJsZU1ldGhvZChcbiAgICAgIG1ldGhvZCxcbiAgICAgIHRydWUsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiBbXG4gICAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMyLFxuICAgIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIsXG4gICAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyLFxuICAgIHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMyXG4gIF07XG59XG5jb25zdCBbXG4gIG11dGFibGVJbnN0cnVtZW50YXRpb25zLFxuICByZWFkb25seUluc3RydW1lbnRhdGlvbnMsXG4gIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zLFxuICBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zXG5dID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbnMoKTtcbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihpc1JlYWRvbmx5LCBzaGFsbG93KSB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbnMgPSBzaGFsbG93ID8gaXNSZWFkb25seSA/IHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnMgOiBzaGFsbG93SW5zdHJ1bWVudGF0aW9ucyA6IGlzUmVhZG9ubHkgPyByZWFkb25seUluc3RydW1lbnRhdGlvbnMgOiBtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucztcbiAgcmV0dXJuICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAoa2V5ID09PSBcIl9fdl9pc1JlYWN0aXZlXCIpIHtcbiAgICAgIHJldHVybiAhaXNSZWFkb25seTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFkb25seVwiKSB7XG4gICAgICByZXR1cm4gaXNSZWFkb25seTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICAgIHJldHVybiBSZWZsZWN0LmdldChcbiAgICAgIGhhc093bihpbnN0cnVtZW50YXRpb25zLCBrZXkpICYmIGtleSBpbiB0YXJnZXQgPyBpbnN0cnVtZW50YXRpb25zIDogdGFyZ2V0LFxuICAgICAga2V5LFxuICAgICAgcmVjZWl2ZXJcbiAgICApO1xuICB9O1xufVxuY29uc3QgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIoZmFsc2UsIHRydWUpXG59O1xuY29uc3QgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCBmYWxzZSlcbn07XG5jb25zdCBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcih0cnVlLCB0cnVlKVxufTtcbmZ1bmN0aW9uIGNoZWNrSWRlbnRpdHlLZXlzKHRhcmdldCwgaGFzMiwga2V5KSB7XG4gIGNvbnN0IHJhd0tleSA9IHRvUmF3KGtleSk7XG4gIGlmIChyYXdLZXkgIT09IGtleSAmJiBoYXMyLmNhbGwodGFyZ2V0LCByYXdLZXkpKSB7XG4gICAgY29uc3QgdHlwZSA9IHRvUmF3VHlwZSh0YXJnZXQpO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBSZWFjdGl2ZSAke3R5cGV9IGNvbnRhaW5zIGJvdGggdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgdGhlIHNhbWUgb2JqZWN0JHt0eXBlID09PSBgTWFwYCA/IGAgYXMga2V5c2AgOiBgYH0sIHdoaWNoIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcy4gQXZvaWQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gdGhlIHJhdyBhbmQgcmVhY3RpdmUgdmVyc2lvbnMgb2YgYW4gb2JqZWN0IGFuZCBvbmx5IHVzZSB0aGUgcmVhY3RpdmUgdmVyc2lvbiBpZiBwb3NzaWJsZS5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCByZWFjdGl2ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCByZWFkb25seU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3Qgc2hhbGxvd1JlYWRvbmx5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiB0YXJnZXRUeXBlTWFwKHJhd1R5cGUpIHtcbiAgc3dpdGNoIChyYXdUeXBlKSB7XG4gICAgY2FzZSBcIk9iamVjdFwiOlxuICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgcmV0dXJuIDEgLyogQ09NTU9OICovO1xuICAgIGNhc2UgXCJNYXBcIjpcbiAgICBjYXNlIFwiU2V0XCI6XG4gICAgY2FzZSBcIldlYWtNYXBcIjpcbiAgICBjYXNlIFwiV2Vha1NldFwiOlxuICAgICAgcmV0dXJuIDIgLyogQ09MTEVDVElPTiAqLztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDAgLyogSU5WQUxJRCAqLztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VGFyZ2V0VHlwZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWVbXCJfX3Zfc2tpcFwiXSB8fCAhT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkgPyAwIC8qIElOVkFMSUQgKi8gOiB0YXJnZXRUeXBlTWFwKHRvUmF3VHlwZSh2YWx1ZSkpO1xufVxuZnVuY3Rpb24gcmVhY3RpdmUodGFyZ2V0KSB7XG4gIGlmIChpc1JlYWRvbmx5KHRhcmdldCkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgZmFsc2UsXG4gICAgbXV0YWJsZUhhbmRsZXJzLFxuICAgIG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhY3RpdmVNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWFjdGl2ZSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICBmYWxzZSxcbiAgICBzaGFsbG93UmVhY3RpdmVIYW5kbGVycyxcbiAgICBzaGFsbG93Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFjdGl2ZU1hcFxuICApO1xufVxuZnVuY3Rpb24gcmVhZG9ubHkodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgdHJ1ZSxcbiAgICByZWFkb25seUhhbmRsZXJzLFxuICAgIHJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzLFxuICAgIHJlYWRvbmx5TWFwXG4gICk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVhZG9ubHkodGFyZ2V0KSB7XG4gIHJldHVybiBjcmVhdGVSZWFjdGl2ZU9iamVjdChcbiAgICB0YXJnZXQsXG4gICAgdHJ1ZSxcbiAgICBzaGFsbG93UmVhZG9ubHlIYW5kbGVycyxcbiAgICBzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWRvbmx5TWFwXG4gICk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWFjdGl2ZU9iamVjdCh0YXJnZXQsIGlzUmVhZG9ubHkyLCBiYXNlSGFuZGxlcnMsIGNvbGxlY3Rpb25IYW5kbGVycywgcHJveHlNYXApIHtcbiAgaWYgKCFpc09iamVjdCh0YXJnZXQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNvbnNvbGUud2FybihgdmFsdWUgY2Fubm90IGJlIG1hZGUgcmVhY3RpdmU6ICR7U3RyaW5nKHRhcmdldCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgaWYgKHRhcmdldFtcIl9fdl9yYXdcIl0gJiYgIShpc1JlYWRvbmx5MiAmJiB0YXJnZXRbXCJfX3ZfaXNSZWFjdGl2ZVwiXSkpIHtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nUHJveHkgPSBwcm94eU1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKGV4aXN0aW5nUHJveHkpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdQcm94eTtcbiAgfVxuICBjb25zdCB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZSh0YXJnZXQpO1xuICBpZiAodGFyZ2V0VHlwZSA9PT0gMCAvKiBJTlZBTElEICovKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShcbiAgICB0YXJnZXQsXG4gICAgdGFyZ2V0VHlwZSA9PT0gMiAvKiBDT0xMRUNUSU9OICovID8gY29sbGVjdGlvbkhhbmRsZXJzIDogYmFzZUhhbmRsZXJzXG4gICk7XG4gIHByb3h5TWFwLnNldCh0YXJnZXQsIHByb3h5KTtcbiAgcmV0dXJuIHByb3h5O1xufVxuZnVuY3Rpb24gaXNSZWFjdGl2ZSh2YWx1ZSkge1xuICBpZiAoaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaXNSZWFjdGl2ZSh2YWx1ZVtcIl9fdl9yYXdcIl0pO1xuICB9XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWN0aXZlXCJdKTtcbn1cbmZ1bmN0aW9uIGlzUmVhZG9ubHkodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlW1wiX192X2lzUmVhZG9ubHlcIl0pO1xufVxuZnVuY3Rpb24gaXNTaGFsbG93KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1NoYWxsb3dcIl0pO1xufVxuZnVuY3Rpb24gaXNQcm94eSh2YWx1ZSkge1xuICByZXR1cm4gaXNSZWFjdGl2ZSh2YWx1ZSkgfHwgaXNSZWFkb25seSh2YWx1ZSk7XG59XG5mdW5jdGlvbiB0b1JhdyhvYnNlcnZlZCkge1xuICBjb25zdCByYXcgPSBvYnNlcnZlZCAmJiBvYnNlcnZlZFtcIl9fdl9yYXdcIl07XG4gIHJldHVybiByYXcgPyB0b1JhdyhyYXcpIDogb2JzZXJ2ZWQ7XG59XG5mdW5jdGlvbiBtYXJrUmF3KHZhbHVlKSB7XG4gIGRlZih2YWx1ZSwgXCJfX3Zfc2tpcFwiLCB0cnVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgdG9SZWFjdGl2ZSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhY3RpdmUodmFsdWUpIDogdmFsdWU7XG5jb25zdCB0b1JlYWRvbmx5ID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFkb25seSh2YWx1ZSkgOiB2YWx1ZTtcblxuY2xhc3MgQ29tcHV0ZWRSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZ2V0dGVyLCBfc2V0dGVyLCBpc1JlYWRvbmx5LCBpc1NTUikge1xuICAgIHRoaXMuX3NldHRlciA9IF9zZXR0ZXI7XG4gICAgdGhpcy5kZXAgPSB2b2lkIDA7XG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9IGZhbHNlO1xuICAgIHRoaXMuZWZmZWN0ID0gbmV3IFJlYWN0aXZlRWZmZWN0KFxuICAgICAgKCkgPT4gZ2V0dGVyKHRoaXMuX3ZhbHVlKSxcbiAgICAgICgpID0+IHRyaWdnZXJSZWZWYWx1ZSh0aGlzLCAxKVxuICAgICk7XG4gICAgdGhpcy5lZmZlY3QuY29tcHV0ZWQgPSB0aGlzO1xuICAgIHRoaXMuZWZmZWN0LmFjdGl2ZSA9IHRoaXMuX2NhY2hlYWJsZSA9ICFpc1NTUjtcbiAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIl0gPSBpc1JlYWRvbmx5O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCBzZWxmID0gdG9SYXcodGhpcyk7XG4gICAgdHJhY2tSZWZWYWx1ZShzZWxmKTtcbiAgICBpZiAoIXNlbGYuX2NhY2hlYWJsZSB8fCBzZWxmLmVmZmVjdC5kaXJ0eSkge1xuICAgICAgaWYgKGhhc0NoYW5nZWQoc2VsZi5fdmFsdWUsIHNlbGYuX3ZhbHVlID0gc2VsZi5lZmZlY3QucnVuKCkpKSB7XG4gICAgICAgIHRyaWdnZXJSZWZWYWx1ZShzZWxmLCAyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlbGYuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWx1ZSkge1xuICAgIHRoaXMuX3NldHRlcihuZXdWYWx1ZSk7XG4gIH1cbiAgLy8gI3JlZ2lvbiBwb2x5ZmlsbCBfZGlydHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhpcmQgcGFydHkgY29kZSBmb3IgVnVlIDw9IDMuMy54XG4gIGdldCBfZGlydHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0LmRpcnR5O1xuICB9XG4gIHNldCBfZGlydHkodikge1xuICAgIHRoaXMuZWZmZWN0LmRpcnR5ID0gdjtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG59XG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgc2V0dGVyO1xuICBjb25zdCBvbmx5R2V0dGVyID0gaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpO1xuICBpZiAob25seUdldHRlcikge1xuICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucztcbiAgICBzZXR0ZXIgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gKCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfSA6IE5PT1A7XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLmdldDtcbiAgICBzZXR0ZXIgPSBnZXR0ZXJPck9wdGlvbnMuc2V0O1xuICB9XG4gIGNvbnN0IGNSZWYgPSBuZXcgQ29tcHV0ZWRSZWZJbXBsKGdldHRlciwgc2V0dGVyLCBvbmx5R2V0dGVyIHx8ICFzZXR0ZXIsIGlzU1NSKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZGVidWdPcHRpb25zICYmICFpc1NTUikge1xuICAgIGNSZWYuZWZmZWN0Lm9uVHJhY2sgPSBkZWJ1Z09wdGlvbnMub25UcmFjaztcbiAgICBjUmVmLmVmZmVjdC5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5mdW5jdGlvbiB0cmFja1JlZlZhbHVlKHJlZjIpIHtcbiAgaWYgKHNob3VsZFRyYWNrICYmIGFjdGl2ZUVmZmVjdCkge1xuICAgIHJlZjIgPSB0b1JhdyhyZWYyKTtcbiAgICB0cmFja0VmZmVjdChcbiAgICAgIGFjdGl2ZUVmZmVjdCxcbiAgICAgIHJlZjIuZGVwIHx8IChyZWYyLmRlcCA9IGNyZWF0ZURlcChcbiAgICAgICAgKCkgPT4gcmVmMi5kZXAgPSB2b2lkIDAsXG4gICAgICAgIHJlZjIgaW5zdGFuY2VvZiBDb21wdXRlZFJlZkltcGwgPyByZWYyIDogdm9pZCAwXG4gICAgICApKSxcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB7XG4gICAgICAgIHRhcmdldDogcmVmMixcbiAgICAgICAgdHlwZTogXCJnZXRcIixcbiAgICAgICAga2V5OiBcInZhbHVlXCJcbiAgICAgIH0gOiB2b2lkIDBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiB0cmlnZ2VyUmVmVmFsdWUocmVmMiwgZGlydHlMZXZlbCA9IDMsIG5ld1ZhbCkge1xuICByZWYyID0gdG9SYXcocmVmMik7XG4gIGNvbnN0IGRlcCA9IHJlZjIuZGVwO1xuICBpZiAoZGVwKSB7XG4gICAgdHJpZ2dlckVmZmVjdHMoXG4gICAgICBkZXAsXG4gICAgICBkaXJ0eUxldmVsLFxuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHtcbiAgICAgICAgdGFyZ2V0OiByZWYyLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBrZXk6IFwidmFsdWVcIixcbiAgICAgICAgbmV3VmFsdWU6IG5ld1ZhbFxuICAgICAgfSA6IHZvaWQgMFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzUmVmKHIpIHtcbiAgcmV0dXJuICEhKHIgJiYgci5fX3ZfaXNSZWYgPT09IHRydWUpO1xufVxuZnVuY3Rpb24gcmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIGZhbHNlKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWYodmFsdWUpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlZih2YWx1ZSwgdHJ1ZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVSZWYocmF3VmFsdWUsIHNoYWxsb3cpIHtcbiAgaWYgKGlzUmVmKHJhd1ZhbHVlKSkge1xuICAgIHJldHVybiByYXdWYWx1ZTtcbiAgfVxuICByZXR1cm4gbmV3IFJlZkltcGwocmF3VmFsdWUsIHNoYWxsb3cpO1xufVxuY2xhc3MgUmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKHZhbHVlLCBfX3ZfaXNTaGFsbG93KSB7XG4gICAgdGhpcy5fX3ZfaXNTaGFsbG93ID0gX192X2lzU2hhbGxvdztcbiAgICB0aGlzLmRlcCA9IHZvaWQgMDtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpcy5fcmF3VmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1Jhdyh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSBfX3ZfaXNTaGFsbG93ID8gdmFsdWUgOiB0b1JlYWN0aXZlKHZhbHVlKTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgdHJhY2tSZWZWYWx1ZSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbCkge1xuICAgIGNvbnN0IHVzZURpcmVjdFZhbHVlID0gdGhpcy5fX3ZfaXNTaGFsbG93IHx8IGlzU2hhbGxvdyhuZXdWYWwpIHx8IGlzUmVhZG9ubHkobmV3VmFsKTtcbiAgICBuZXdWYWwgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbCA6IHRvUmF3KG5ld1ZhbCk7XG4gICAgaWYgKGhhc0NoYW5nZWQobmV3VmFsLCB0aGlzLl9yYXdWYWx1ZSkpIHtcbiAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gbmV3VmFsO1xuICAgICAgdGhpcy5fdmFsdWUgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbCA6IHRvUmVhY3RpdmUobmV3VmFsKTtcbiAgICAgIHRyaWdnZXJSZWZWYWx1ZSh0aGlzLCAzLCBuZXdWYWwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZihyZWYyKSB7XG4gIHRyaWdnZXJSZWZWYWx1ZShyZWYyLCAzLCAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gcmVmMi52YWx1ZSA6IHZvaWQgMCk7XG59XG5mdW5jdGlvbiB1bnJlZihyZWYyKSB7XG4gIHJldHVybiBpc1JlZihyZWYyKSA/IHJlZjIudmFsdWUgOiByZWYyO1xufVxuZnVuY3Rpb24gdG9WYWx1ZShzb3VyY2UpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24oc291cmNlKSA/IHNvdXJjZSgpIDogdW5yZWYoc291cmNlKTtcbn1cbmNvbnN0IHNoYWxsb3dVbndyYXBIYW5kbGVycyA9IHtcbiAgZ2V0OiAodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSA9PiB1bnJlZihSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpKSxcbiAgc2V0OiAodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBwcm94eVJlZnMob2JqZWN0V2l0aFJlZnMpIHtcbiAgcmV0dXJuIGlzUmVhY3RpdmUob2JqZWN0V2l0aFJlZnMpID8gb2JqZWN0V2l0aFJlZnMgOiBuZXcgUHJveHkob2JqZWN0V2l0aFJlZnMsIHNoYWxsb3dVbndyYXBIYW5kbGVycyk7XG59XG5jbGFzcyBDdXN0b21SZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZmFjdG9yeSkge1xuICAgIHRoaXMuZGVwID0gdm9pZCAwO1xuICAgIHRoaXMuX192X2lzUmVmID0gdHJ1ZTtcbiAgICBjb25zdCB7IGdldCwgc2V0IH0gPSBmYWN0b3J5KFxuICAgICAgKCkgPT4gdHJhY2tSZWZWYWx1ZSh0aGlzKSxcbiAgICAgICgpID0+IHRyaWdnZXJSZWZWYWx1ZSh0aGlzKVxuICAgICk7XG4gICAgdGhpcy5fZ2V0ID0gZ2V0O1xuICAgIHRoaXMuX3NldCA9IHNldDtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldCgpO1xuICB9XG4gIHNldCB2YWx1ZShuZXdWYWwpIHtcbiAgICB0aGlzLl9zZXQobmV3VmFsKTtcbiAgfVxufVxuZnVuY3Rpb24gY3VzdG9tUmVmKGZhY3RvcnkpIHtcbiAgcmV0dXJuIG5ldyBDdXN0b21SZWZJbXBsKGZhY3RvcnkpO1xufVxuZnVuY3Rpb24gdG9SZWZzKG9iamVjdCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNQcm94eShvYmplY3QpKSB7XG4gICAgY29uc29sZS53YXJuKGB0b1JlZnMoKSBleHBlY3RzIGEgcmVhY3RpdmUgb2JqZWN0IGJ1dCByZWNlaXZlZCBhIHBsYWluIG9uZS5gKTtcbiAgfVxuICBjb25zdCByZXQgPSBpc0FycmF5KG9iamVjdCkgPyBuZXcgQXJyYXkob2JqZWN0Lmxlbmd0aCkgOiB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgcmV0W2tleV0gPSBwcm9wZXJ0eVRvUmVmKG9iamVjdCwga2V5KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuY2xhc3MgT2JqZWN0UmVmSW1wbCB7XG4gIGNvbnN0cnVjdG9yKF9vYmplY3QsIF9rZXksIF9kZWZhdWx0VmFsdWUpIHtcbiAgICB0aGlzLl9vYmplY3QgPSBfb2JqZWN0O1xuICAgIHRoaXMuX2tleSA9IF9rZXk7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gX2RlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuX29iamVjdFt0aGlzLl9rZXldO1xuICAgIHJldHVybiB2YWwgPT09IHZvaWQgMCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IHZhbDtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fb2JqZWN0W3RoaXMuX2tleV0gPSBuZXdWYWw7XG4gIH1cbiAgZ2V0IGRlcCgpIHtcbiAgICByZXR1cm4gZ2V0RGVwRnJvbVJlYWN0aXZlKHRvUmF3KHRoaXMuX29iamVjdCksIHRoaXMuX2tleSk7XG4gIH1cbn1cbmNsYXNzIEdldHRlclJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihfZ2V0dGVyKSB7XG4gICAgdGhpcy5fZ2V0dGVyID0gX2dldHRlcjtcbiAgICB0aGlzLl9fdl9pc1JlZiA9IHRydWU7XG4gICAgdGhpcy5fX3ZfaXNSZWFkb25seSA9IHRydWU7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXR0ZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gdG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAoaXNSZWYoc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIG5ldyBHZXR0ZXJSZWZJbXBsKHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSAmJiBhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWYoc291cmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJvcGVydHlUb1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGNvbnN0IHZhbCA9IHNvdXJjZVtrZXldO1xuICByZXR1cm4gaXNSZWYodmFsKSA/IHZhbCA6IG5ldyBPYmplY3RSZWZJbXBsKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xufVxuXG5jb25zdCBkZWZlcnJlZENvbXB1dGVkID0gY29tcHV0ZWQ7XG5cbmNvbnN0IFRyYWNrT3BUeXBlcyA9IHtcbiAgXCJHRVRcIjogXCJnZXRcIixcbiAgXCJIQVNcIjogXCJoYXNcIixcbiAgXCJJVEVSQVRFXCI6IFwiaXRlcmF0ZVwiXG59O1xuY29uc3QgVHJpZ2dlck9wVHlwZXMgPSB7XG4gIFwiU0VUXCI6IFwic2V0XCIsXG4gIFwiQUREXCI6IFwiYWRkXCIsXG4gIFwiREVMRVRFXCI6IFwiZGVsZXRlXCIsXG4gIFwiQ0xFQVJcIjogXCJjbGVhclwiXG59O1xuY29uc3QgUmVhY3RpdmVGbGFncyA9IHtcbiAgXCJTS0lQXCI6IFwiX192X3NraXBcIixcbiAgXCJJU19SRUFDVElWRVwiOiBcIl9fdl9pc1JlYWN0aXZlXCIsXG4gIFwiSVNfUkVBRE9OTFlcIjogXCJfX3ZfaXNSZWFkb25seVwiLFxuICBcIklTX1NIQUxMT1dcIjogXCJfX3ZfaXNTaGFsbG93XCIsXG4gIFwiUkFXXCI6IFwiX192X3Jhd1wiXG59O1xuXG5leHBvcnQgeyBFZmZlY3RTY29wZSwgSVRFUkFURV9LRVksIFJlYWN0aXZlRWZmZWN0LCBSZWFjdGl2ZUZsYWdzLCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjb21wdXRlZCwgY3VzdG9tUmVmLCBkZWZlcnJlZENvbXB1dGVkLCBlZmZlY3QsIGVmZmVjdFNjb3BlLCBlbmFibGVUcmFja2luZywgZ2V0Q3VycmVudFNjb3BlLCBpc1Byb3h5LCBpc1JlYWN0aXZlLCBpc1JlYWRvbmx5LCBpc1JlZiwgaXNTaGFsbG93LCBtYXJrUmF3LCBvblNjb3BlRGlzcG9zZSwgcGF1c2VTY2hlZHVsaW5nLCBwYXVzZVRyYWNraW5nLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCByZXNldFNjaGVkdWxpbmcsIHJlc2V0VHJhY2tpbmcsIHNoYWxsb3dSZWFjdGl2ZSwgc2hhbGxvd1JlYWRvbmx5LCBzaGFsbG93UmVmLCBzdG9wLCB0b1JhdywgdG9SZWYsIHRvUmVmcywgdG9WYWx1ZSwgdHJhY2ssIHRyaWdnZXIsIHRyaWdnZXJSZWYsIHVucmVmIH07XG4iLCIvKipcbiogQHZ1ZS9ydW50aW1lLWNvcmUgdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgcGF1c2VUcmFja2luZywgcmVzZXRUcmFja2luZywgaXNSZWYsIHRvUmF3LCBpc1NoYWxsb3cgYXMgaXNTaGFsbG93JDEsIGlzUmVhY3RpdmUsIFJlYWN0aXZlRWZmZWN0LCBnZXRDdXJyZW50U2NvcGUsIHJlZiwgc2hhbGxvd1JlYWRvbmx5LCB0cmFjaywgcmVhY3RpdmUsIHNoYWxsb3dSZWFjdGl2ZSwgdHJpZ2dlciwgaXNQcm94eSwgcHJveHlSZWZzLCBtYXJrUmF3LCBFZmZlY3RTY29wZSwgY29tcHV0ZWQgYXMgY29tcHV0ZWQkMSwgY3VzdG9tUmVmLCBpc1JlYWRvbmx5IH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5JztcbmV4cG9ydCB7IEVmZmVjdFNjb3BlLCBSZWFjdGl2ZUVmZmVjdCwgVHJhY2tPcFR5cGVzLCBUcmlnZ2VyT3BUeXBlcywgY3VzdG9tUmVmLCBlZmZlY3QsIGVmZmVjdFNjb3BlLCBnZXRDdXJyZW50U2NvcGUsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyaWdnZXJSZWYsIHVucmVmIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5JztcbmltcG9ydCB7IGlzU3RyaW5nLCBpc0Z1bmN0aW9uLCBpc1Byb21pc2UsIGlzQXJyYXksIE5PT1AsIGdldEdsb2JhbFRoaXMsIGV4dGVuZCwgRU1QVFlfT0JKLCB0b0hhbmRsZXJLZXksIGxvb3NlVG9OdW1iZXIsIGh5cGhlbmF0ZSwgY2FtZWxpemUsIGlzT2JqZWN0LCBpc09uLCBoYXNPd24sIGlzTW9kZWxMaXN0ZW5lciwgY2FwaXRhbGl6ZSwgdG9OdW1iZXIsIGhhc0NoYW5nZWQsIHJlbW92ZSwgaXNTZXQsIGlzTWFwLCBpc1BsYWluT2JqZWN0LCBpc0J1aWx0SW5EaXJlY3RpdmUsIGludm9rZUFycmF5Rm5zLCBpc1JlZ0V4cCwgaXNHbG9iYWxseUFsbG93ZWQsIE5PLCBkZWYsIGlzUmVzZXJ2ZWRQcm9wLCBFTVBUWV9BUlIsIHRvUmF3VHlwZSwgbWFrZU1hcCwgbm9ybWFsaXplQ2xhc3MsIHN0cmluZ2lmeVN0eWxlLCBub3JtYWxpemVTdHlsZSwgaXNLbm93blN2Z0F0dHIsIGlzQm9vbGVhbkF0dHIsIGlzS25vd25IdG1sQXR0ciwgaW5jbHVkZUJvb2xlYW5BdHRyIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuZXhwb3J0IHsgY2FtZWxpemUsIGNhcGl0YWxpemUsIG5vcm1hbGl6ZUNsYXNzLCBub3JtYWxpemVQcm9wcywgbm9ybWFsaXplU3R5bGUsIHRvRGlzcGxheVN0cmluZywgdG9IYW5kbGVyS2V5IH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5jb25zdCBzdGFjayA9IFtdO1xuZnVuY3Rpb24gcHVzaFdhcm5pbmdDb250ZXh0KHZub2RlKSB7XG4gIHN0YWNrLnB1c2godm5vZGUpO1xufVxuZnVuY3Rpb24gcG9wV2FybmluZ0NvbnRleHQoKSB7XG4gIHN0YWNrLnBvcCgpO1xufVxuZnVuY3Rpb24gd2FybiQxKG1zZywgLi4uYXJncykge1xuICBwYXVzZVRyYWNraW5nKCk7XG4gIGNvbnN0IGluc3RhbmNlID0gc3RhY2subGVuZ3RoID8gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uY29tcG9uZW50IDogbnVsbDtcbiAgY29uc3QgYXBwV2FybkhhbmRsZXIgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcjtcbiAgY29uc3QgdHJhY2UgPSBnZXRDb21wb25lbnRUcmFjZSgpO1xuICBpZiAoYXBwV2FybkhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBhcHBXYXJuSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMTEsXG4gICAgICBbXG4gICAgICAgIG1zZyArIGFyZ3Muam9pbihcIlwiKSxcbiAgICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2UucHJveHksXG4gICAgICAgIHRyYWNlLm1hcChcbiAgICAgICAgICAoeyB2bm9kZSB9KSA9PiBgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgdm5vZGUudHlwZSl9PmBcbiAgICAgICAgKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICB0cmFjZVxuICAgICAgXVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd2FybkFyZ3MgPSBbYFtWdWUgd2Fybl06ICR7bXNnfWAsIC4uLmFyZ3NdO1xuICAgIGlmICh0cmFjZS5sZW5ndGggJiYgLy8gYXZvaWQgc3BhbW1pbmcgY29uc29sZSBkdXJpbmcgdGVzdHNcbiAgICB0cnVlKSB7XG4gICAgICB3YXJuQXJncy5wdXNoKGBcbmAsIC4uLmZvcm1hdFRyYWNlKHRyYWNlKSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybiguLi53YXJuQXJncyk7XG4gIH1cbiAgcmVzZXRUcmFja2luZygpO1xufVxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50VHJhY2UoKSB7XG4gIGxldCBjdXJyZW50Vk5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcbiAgaWYgKCFjdXJyZW50Vk5vZGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZFN0YWNrID0gW107XG4gIHdoaWxlIChjdXJyZW50Vk5vZGUpIHtcbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFN0YWNrWzBdO1xuICAgIGlmIChsYXN0ICYmIGxhc3Qudm5vZGUgPT09IGN1cnJlbnRWTm9kZSkge1xuICAgICAgbGFzdC5yZWN1cnNlQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplZFN0YWNrLnB1c2goe1xuICAgICAgICB2bm9kZTogY3VycmVudFZOb2RlLFxuICAgICAgICByZWN1cnNlQ291bnQ6IDBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnRJbnN0YW5jZSA9IGN1cnJlbnRWTm9kZS5jb21wb25lbnQgJiYgY3VycmVudFZOb2RlLmNvbXBvbmVudC5wYXJlbnQ7XG4gICAgY3VycmVudFZOb2RlID0gcGFyZW50SW5zdGFuY2UgJiYgcGFyZW50SW5zdGFuY2Uudm5vZGU7XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRTdGFjaztcbn1cbmZ1bmN0aW9uIGZvcm1hdFRyYWNlKHRyYWNlKSB7XG4gIGNvbnN0IGxvZ3MgPSBbXTtcbiAgdHJhY2UuZm9yRWFjaCgoZW50cnksIGkpID0+IHtcbiAgICBsb2dzLnB1c2goLi4uaSA9PT0gMCA/IFtdIDogW2BcbmBdLCAuLi5mb3JtYXRUcmFjZUVudHJ5KGVudHJ5KSk7XG4gIH0pO1xuICByZXR1cm4gbG9ncztcbn1cbmZ1bmN0aW9uIGZvcm1hdFRyYWNlRW50cnkoeyB2bm9kZSwgcmVjdXJzZUNvdW50IH0pIHtcbiAgY29uc3QgcG9zdGZpeCA9IHJlY3Vyc2VDb3VudCA+IDAgPyBgLi4uICgke3JlY3Vyc2VDb3VudH0gcmVjdXJzaXZlIGNhbGxzKWAgOiBgYDtcbiAgY29uc3QgaXNSb290ID0gdm5vZGUuY29tcG9uZW50ID8gdm5vZGUuY29tcG9uZW50LnBhcmVudCA9PSBudWxsIDogZmFsc2U7XG4gIGNvbnN0IG9wZW4gPSBgIGF0IDwke2Zvcm1hdENvbXBvbmVudE5hbWUoXG4gICAgdm5vZGUuY29tcG9uZW50LFxuICAgIHZub2RlLnR5cGUsXG4gICAgaXNSb290XG4gICl9YDtcbiAgY29uc3QgY2xvc2UgPSBgPmAgKyBwb3N0Zml4O1xuICByZXR1cm4gdm5vZGUucHJvcHMgPyBbb3BlbiwgLi4uZm9ybWF0UHJvcHModm5vZGUucHJvcHMpLCBjbG9zZV0gOiBbb3BlbiArIGNsb3NlXTtcbn1cbmZ1bmN0aW9uIGZvcm1hdFByb3BzKHByb3BzKSB7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICBrZXlzLnNsaWNlKDAsIDMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIHJlcy5wdXNoKC4uLmZvcm1hdFByb3Aoa2V5LCBwcm9wc1trZXldKSk7XG4gIH0pO1xuICBpZiAoa2V5cy5sZW5ndGggPiAzKSB7XG4gICAgcmVzLnB1c2goYCAuLi5gKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gZm9ybWF0UHJvcChrZXksIHZhbHVlLCByYXcpIHtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PSR7dmFsdWV9YF07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PSR7dmFsdWV9YF07XG4gIH0gZWxzZSBpZiAoaXNSZWYodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBmb3JtYXRQcm9wKGtleSwgdG9SYXcodmFsdWUudmFsdWUpLCB0cnVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1SZWY8YCwgdmFsdWUsIGA+YF07XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICByZXR1cm4gW2Ake2tleX09Zm4ke3ZhbHVlLm5hbWUgPyBgPCR7dmFsdWUubmFtZX0+YCA6IGBgfWBdO1xuICB9IGVsc2Uge1xuICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgIHJldHVybiByYXcgPyB2YWx1ZSA6IFtgJHtrZXl9PWAsIHZhbHVlXTtcbiAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKHZhbCwgdHlwZSkge1xuICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpXG4gICAgcmV0dXJuO1xuICBpZiAodmFsID09PSB2b2lkIDApIHtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCAhPT0gXCJudW1iZXJcIikge1xuICAgIHdhcm4kMShgJHt0eXBlfSBpcyBub3QgYSB2YWxpZCBudW1iZXIgLSBnb3QgJHtKU09OLnN0cmluZ2lmeSh2YWwpfS5gKTtcbiAgfSBlbHNlIGlmIChpc05hTih2YWwpKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIE5hTiAtIHRoZSBkdXJhdGlvbiBleHByZXNzaW9uIG1pZ2h0IGJlIGluY29ycmVjdC5gKTtcbiAgfVxufVxuXG5jb25zdCBFcnJvckNvZGVzID0ge1xuICBcIlNFVFVQX0ZVTkNUSU9OXCI6IDAsXG4gIFwiMFwiOiBcIlNFVFVQX0ZVTkNUSU9OXCIsXG4gIFwiUkVOREVSX0ZVTkNUSU9OXCI6IDEsXG4gIFwiMVwiOiBcIlJFTkRFUl9GVU5DVElPTlwiLFxuICBcIldBVENIX0dFVFRFUlwiOiAyLFxuICBcIjJcIjogXCJXQVRDSF9HRVRURVJcIixcbiAgXCJXQVRDSF9DQUxMQkFDS1wiOiAzLFxuICBcIjNcIjogXCJXQVRDSF9DQUxMQkFDS1wiLFxuICBcIldBVENIX0NMRUFOVVBcIjogNCxcbiAgXCI0XCI6IFwiV0FUQ0hfQ0xFQU5VUFwiLFxuICBcIk5BVElWRV9FVkVOVF9IQU5ETEVSXCI6IDUsXG4gIFwiNVwiOiBcIk5BVElWRV9FVkVOVF9IQU5ETEVSXCIsXG4gIFwiQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJcIjogNixcbiAgXCI2XCI6IFwiQ09NUE9ORU5UX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJWTk9ERV9IT09LXCI6IDcsXG4gIFwiN1wiOiBcIlZOT0RFX0hPT0tcIixcbiAgXCJESVJFQ1RJVkVfSE9PS1wiOiA4LFxuICBcIjhcIjogXCJESVJFQ1RJVkVfSE9PS1wiLFxuICBcIlRSQU5TSVRJT05fSE9PS1wiOiA5LFxuICBcIjlcIjogXCJUUkFOU0lUSU9OX0hPT0tcIixcbiAgXCJBUFBfRVJST1JfSEFORExFUlwiOiAxMCxcbiAgXCIxMFwiOiBcIkFQUF9FUlJPUl9IQU5ETEVSXCIsXG4gIFwiQVBQX1dBUk5fSEFORExFUlwiOiAxMSxcbiAgXCIxMVwiOiBcIkFQUF9XQVJOX0hBTkRMRVJcIixcbiAgXCJGVU5DVElPTl9SRUZcIjogMTIsXG4gIFwiMTJcIjogXCJGVU5DVElPTl9SRUZcIixcbiAgXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCI6IDEzLFxuICBcIjEzXCI6IFwiQVNZTkNfQ09NUE9ORU5UX0xPQURFUlwiLFxuICBcIlNDSEVEVUxFUlwiOiAxNCxcbiAgXCIxNFwiOiBcIlNDSEVEVUxFUlwiXG59O1xuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyQxID0ge1xuICBbXCJzcFwiXTogXCJzZXJ2ZXJQcmVmZXRjaCBob29rXCIsXG4gIFtcImJjXCJdOiBcImJlZm9yZUNyZWF0ZSBob29rXCIsXG4gIFtcImNcIl06IFwiY3JlYXRlZCBob29rXCIsXG4gIFtcImJtXCJdOiBcImJlZm9yZU1vdW50IGhvb2tcIixcbiAgW1wibVwiXTogXCJtb3VudGVkIGhvb2tcIixcbiAgW1wiYnVcIl06IFwiYmVmb3JlVXBkYXRlIGhvb2tcIixcbiAgW1widVwiXTogXCJ1cGRhdGVkXCIsXG4gIFtcImJ1bVwiXTogXCJiZWZvcmVVbm1vdW50IGhvb2tcIixcbiAgW1widW1cIl06IFwidW5tb3VudGVkIGhvb2tcIixcbiAgW1wiYVwiXTogXCJhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJkYVwiXTogXCJkZWFjdGl2YXRlZCBob29rXCIsXG4gIFtcImVjXCJdOiBcImVycm9yQ2FwdHVyZWQgaG9va1wiLFxuICBbXCJydGNcIl06IFwicmVuZGVyVHJhY2tlZCBob29rXCIsXG4gIFtcInJ0Z1wiXTogXCJyZW5kZXJUcmlnZ2VyZWQgaG9va1wiLFxuICBbMF06IFwic2V0dXAgZnVuY3Rpb25cIixcbiAgWzFdOiBcInJlbmRlciBmdW5jdGlvblwiLFxuICBbMl06IFwid2F0Y2hlciBnZXR0ZXJcIixcbiAgWzNdOiBcIndhdGNoZXIgY2FsbGJhY2tcIixcbiAgWzRdOiBcIndhdGNoZXIgY2xlYW51cCBmdW5jdGlvblwiLFxuICBbNV06IFwibmF0aXZlIGV2ZW50IGhhbmRsZXJcIixcbiAgWzZdOiBcImNvbXBvbmVudCBldmVudCBoYW5kbGVyXCIsXG4gIFs3XTogXCJ2bm9kZSBob29rXCIsXG4gIFs4XTogXCJkaXJlY3RpdmUgaG9va1wiLFxuICBbOV06IFwidHJhbnNpdGlvbiBob29rXCIsXG4gIFsxMF06IFwiYXBwIGVycm9ySGFuZGxlclwiLFxuICBbMTFdOiBcImFwcCB3YXJuSGFuZGxlclwiLFxuICBbMTJdOiBcInJlZiBmdW5jdGlvblwiLFxuICBbMTNdOiBcImFzeW5jIGNvbXBvbmVudCBsb2FkZXJcIixcbiAgWzE0XTogXCJzY2hlZHVsZXIgZmx1c2guIFRoaXMgaXMgbGlrZWx5IGEgVnVlIGludGVybmFscyBidWcuIFBsZWFzZSBvcGVuIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS92dWVqcy9jb3JlIC5cIlxufTtcbmZ1bmN0aW9uIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpIHtcbiAgbGV0IHJlcztcbiAgdHJ5IHtcbiAgICByZXMgPSBhcmdzID8gZm4oLi4uYXJncykgOiBmbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgIGNvbnN0IHJlcyA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpO1xuICAgIGlmIChyZXMgJiYgaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcy5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgY29uc3QgdmFsdWVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZm4ubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZXMucHVzaChjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhmbltpXSwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuZnVuY3Rpb24gaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgdHlwZSwgdGhyb3dJbkRldiA9IHRydWUpIHtcbiAgY29uc3QgY29udGV4dFZOb2RlID0gaW5zdGFuY2UgPyBpbnN0YW5jZS52bm9kZSA6IG51bGw7XG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGxldCBjdXIgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gICAgY29uc3QgZXhwb3NlZEluc3RhbmNlID0gaW5zdGFuY2UucHJveHk7XG4gICAgY29uc3QgZXJyb3JJbmZvID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXSA6IGBodHRwczovL3Z1ZWpzLm9yZy9lcnJvcnMvI3J1bnRpbWUtJHt0eXBlfWA7XG4gICAgd2hpbGUgKGN1cikge1xuICAgICAgY29uc3QgZXJyb3JDYXB0dXJlZEhvb2tzID0gY3VyLmVjO1xuICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yQ2FwdHVyZWRIb29rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlcnJvckNhcHR1cmVkSG9va3NbaV0oZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mbykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXIgPSBjdXIucGFyZW50O1xuICAgIH1cbiAgICBjb25zdCBhcHBFcnJvckhhbmRsZXIgPSBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5lcnJvckhhbmRsZXI7XG4gICAgaWYgKGFwcEVycm9ySGFuZGxlcikge1xuICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICBhcHBFcnJvckhhbmRsZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIDEwLFxuICAgICAgICBbZXJyLCBleHBvc2VkSW5zdGFuY2UsIGVycm9ySW5mb11cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2KTtcbn1cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVyciwgdHlwZSwgY29udGV4dFZOb2RlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGluZm8gPSBFcnJvclR5cGVTdHJpbmdzJDFbdHlwZV07XG4gICAgaWYgKGNvbnRleHRWTm9kZSkge1xuICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KGNvbnRleHRWTm9kZSk7XG4gICAgfVxuICAgIHdhcm4kMShgVW5oYW5kbGVkIGVycm9yJHtpbmZvID8gYCBkdXJpbmcgZXhlY3V0aW9uIG9mICR7aW5mb31gIDogYGB9YCk7XG4gICAgaWYgKGNvbnRleHRWTm9kZSkge1xuICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICB9XG4gICAgaWYgKHRocm93SW5EZXYpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxubGV0IGlzRmx1c2hpbmcgPSBmYWxzZTtcbmxldCBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuY29uc3QgcXVldWUgPSBbXTtcbmxldCBmbHVzaEluZGV4ID0gMDtcbmNvbnN0IHBlbmRpbmdQb3N0Rmx1c2hDYnMgPSBbXTtcbmxldCBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xubGV0IHBvc3RGbHVzaEluZGV4ID0gMDtcbmNvbnN0IHJlc29sdmVkUHJvbWlzZSA9IC8qIEBfX1BVUkVfXyAqLyBQcm9taXNlLnJlc29sdmUoKTtcbmxldCBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbmNvbnN0IFJFQ1VSU0lPTl9MSU1JVCA9IDEwMDtcbmZ1bmN0aW9uIG5leHRUaWNrKGZuKSB7XG4gIGNvbnN0IHAgPSBjdXJyZW50Rmx1c2hQcm9taXNlIHx8IHJlc29sdmVkUHJvbWlzZTtcbiAgcmV0dXJuIGZuID8gcC50aGVuKHRoaXMgPyBmbi5iaW5kKHRoaXMpIDogZm4pIDogcDtcbn1cbmZ1bmN0aW9uIGZpbmRJbnNlcnRpb25JbmRleChpZCkge1xuICBsZXQgc3RhcnQgPSBmbHVzaEluZGV4ICsgMTtcbiAgbGV0IGVuZCA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyBlbmQgPj4+IDE7XG4gICAgY29uc3QgbWlkZGxlSm9iID0gcXVldWVbbWlkZGxlXTtcbiAgICBjb25zdCBtaWRkbGVKb2JJZCA9IGdldElkKG1pZGRsZUpvYik7XG4gICAgaWYgKG1pZGRsZUpvYklkIDwgaWQgfHwgbWlkZGxlSm9iSWQgPT09IGlkICYmIG1pZGRsZUpvYi5wcmUpIHtcbiAgICAgIHN0YXJ0ID0gbWlkZGxlICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gbWlkZGxlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhcnQ7XG59XG5mdW5jdGlvbiBxdWV1ZUpvYihqb2IpIHtcbiAgaWYgKCFxdWV1ZS5sZW5ndGggfHwgIXF1ZXVlLmluY2x1ZGVzKFxuICAgIGpvYixcbiAgICBpc0ZsdXNoaW5nICYmIGpvYi5hbGxvd1JlY3Vyc2UgPyBmbHVzaEluZGV4ICsgMSA6IGZsdXNoSW5kZXhcbiAgKSkge1xuICAgIGlmIChqb2IuaWQgPT0gbnVsbCkge1xuICAgICAgcXVldWUucHVzaChqb2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZS5zcGxpY2UoZmluZEluc2VydGlvbkluZGV4KGpvYi5pZCksIDAsIGpvYik7XG4gICAgfVxuICAgIHF1ZXVlRmx1c2goKTtcbiAgfVxufVxuZnVuY3Rpb24gcXVldWVGbHVzaCgpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nICYmICFpc0ZsdXNoUGVuZGluZykge1xuICAgIGlzRmx1c2hQZW5kaW5nID0gdHJ1ZTtcbiAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gcmVzb2x2ZWRQcm9taXNlLnRoZW4oZmx1c2hKb2JzKTtcbiAgfVxufVxuZnVuY3Rpb24gaW52YWxpZGF0ZUpvYihqb2IpIHtcbiAgY29uc3QgaSA9IHF1ZXVlLmluZGV4T2Yoam9iKTtcbiAgaWYgKGkgPiBmbHVzaEluZGV4KSB7XG4gICAgcXVldWUuc3BsaWNlKGksIDEpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZVBvc3RGbHVzaENiKGNiKSB7XG4gIGlmICghaXNBcnJheShjYikpIHtcbiAgICBpZiAoIWFjdGl2ZVBvc3RGbHVzaENicyB8fCAhYWN0aXZlUG9zdEZsdXNoQ2JzLmluY2x1ZGVzKFxuICAgICAgY2IsXG4gICAgICBjYi5hbGxvd1JlY3Vyc2UgPyBwb3N0Rmx1c2hJbmRleCArIDEgOiBwb3N0Rmx1c2hJbmRleFxuICAgICkpIHtcbiAgICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMucHVzaChjYik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMucHVzaCguLi5jYik7XG4gIH1cbiAgcXVldWVGbHVzaCgpO1xufVxuZnVuY3Rpb24gZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSwgc2VlbiwgaSA9IGlzRmx1c2hpbmcgPyBmbHVzaEluZGV4ICsgMSA6IDApIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjYiA9IHF1ZXVlW2ldO1xuICAgIGlmIChjYiAmJiBjYi5wcmUpIHtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjYi5pZCAhPT0gaW5zdGFuY2UudWlkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgIGktLTtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmbHVzaFBvc3RGbHVzaENicyhzZWVuKSB7XG4gIGlmIChwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBbLi4ubmV3IFNldChwZW5kaW5nUG9zdEZsdXNoQ2JzKV0uc29ydChcbiAgICAgIChhLCBiKSA9PiBnZXRJZChhKSAtIGdldElkKGIpXG4gICAgKTtcbiAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCA9IDA7XG4gICAgaWYgKGFjdGl2ZVBvc3RGbHVzaENicykge1xuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnB1c2goLi4uZGVkdXBlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGZvciAocG9zdEZsdXNoSW5kZXggPSAwOyBwb3N0Rmx1c2hJbmRleCA8IGFjdGl2ZVBvc3RGbHVzaENicy5sZW5ndGg7IHBvc3RGbHVzaEluZGV4KyspIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBhY3RpdmVQb3N0Rmx1c2hDYnNbcG9zdEZsdXNoSW5kZXhdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGFjdGl2ZVBvc3RGbHVzaENic1twb3N0Rmx1c2hJbmRleF0oKTtcbiAgICB9XG4gICAgYWN0aXZlUG9zdEZsdXNoQ2JzID0gbnVsbDtcbiAgICBwb3N0Rmx1c2hJbmRleCA9IDA7XG4gIH1cbn1cbmNvbnN0IGdldElkID0gKGpvYikgPT4gam9iLmlkID09IG51bGwgPyBJbmZpbml0eSA6IGpvYi5pZDtcbmNvbnN0IGNvbXBhcmF0b3IgPSAoYSwgYikgPT4ge1xuICBjb25zdCBkaWZmID0gZ2V0SWQoYSkgLSBnZXRJZChiKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICBpZiAoYS5wcmUgJiYgIWIucHJlKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGlmIChiLnByZSAmJiAhYS5wcmUpXG4gICAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gZGlmZjtcbn07XG5mdW5jdGlvbiBmbHVzaEpvYnMoc2Vlbikge1xuICBpc0ZsdXNoUGVuZGluZyA9IGZhbHNlO1xuICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIHF1ZXVlLnNvcnQoY29tcGFyYXRvcik7XG4gIGNvbnN0IGNoZWNrID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IChqb2IpID0+IGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBqb2IpIDogTk9PUDtcbiAgdHJ5IHtcbiAgICBmb3IgKGZsdXNoSW5kZXggPSAwOyBmbHVzaEluZGV4IDwgcXVldWUubGVuZ3RoOyBmbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGpvYiA9IHF1ZXVlW2ZsdXNoSW5kZXhdO1xuICAgICAgaWYgKGpvYiAmJiBqb2IuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVjayhqb2IpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKGpvYiwgbnVsbCwgMTQpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmbHVzaEluZGV4ID0gMDtcbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pO1xuICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICBpZiAocXVldWUubGVuZ3RoIHx8IHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgICBmbHVzaEpvYnMoc2Vlbik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgZm4pIHtcbiAgaWYgKCFzZWVuLmhhcyhmbikpIHtcbiAgICBzZWVuLnNldChmbiwgMSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY291bnQgPSBzZWVuLmdldChmbik7XG4gICAgaWYgKGNvdW50ID4gUkVDVVJTSU9OX0xJTUlUKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGZuLm93bmVySW5zdGFuY2U7XG4gICAgICBjb25zdCBjb21wb25lbnROYW1lID0gaW5zdGFuY2UgJiYgZ2V0Q29tcG9uZW50TmFtZShpbnN0YW5jZS50eXBlKTtcbiAgICAgIGhhbmRsZUVycm9yKFxuICAgICAgICBgTWF4aW11bSByZWN1cnNpdmUgdXBkYXRlcyBleGNlZWRlZCR7Y29tcG9uZW50TmFtZSA/IGAgaW4gY29tcG9uZW50IDwke2NvbXBvbmVudE5hbWV9PmAgOiBgYH0uIFRoaXMgbWVhbnMgeW91IGhhdmUgYSByZWFjdGl2ZSBlZmZlY3QgdGhhdCBpcyBtdXRhdGluZyBpdHMgb3duIGRlcGVuZGVuY2llcyBhbmQgdGh1cyByZWN1cnNpdmVseSB0cmlnZ2VyaW5nIGl0c2VsZi4gUG9zc2libGUgc291cmNlcyBpbmNsdWRlIGNvbXBvbmVudCB0ZW1wbGF0ZSwgcmVuZGVyIGZ1bmN0aW9uLCB1cGRhdGVkIGhvb2sgb3Igd2F0Y2hlciBzb3VyY2UgZnVuY3Rpb24uYCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMTBcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2Vlbi5zZXQoZm4sIGNvdW50ICsgMSk7XG4gICAgfVxuICB9XG59XG5cbmxldCBpc0htclVwZGF0aW5nID0gZmFsc2U7XG5jb25zdCBobXJEaXJ0eUNvbXBvbmVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX0hNUl9SVU5USU1FX18gPSB7XG4gICAgY3JlYXRlUmVjb3JkOiB0cnlXcmFwKGNyZWF0ZVJlY29yZCksXG4gICAgcmVyZW5kZXI6IHRyeVdyYXAocmVyZW5kZXIpLFxuICAgIHJlbG9hZDogdHJ5V3JhcChyZWxvYWQpXG4gIH07XG59XG5jb25zdCBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZnVuY3Rpb24gcmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgY29uc3QgaWQgPSBpbnN0YW5jZS50eXBlLl9faG1ySWQ7XG4gIGxldCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICBjcmVhdGVSZWNvcmQoaWQsIGluc3RhbmNlLnR5cGUpO1xuICAgIHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICB9XG4gIHJlY29yZC5pbnN0YW5jZXMuYWRkKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgbWFwLmdldChpbnN0YW5jZS50eXBlLl9faG1ySWQpLmluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVjb3JkKGlkLCBpbml0aWFsRGVmKSB7XG4gIGlmIChtYXAuaGFzKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtYXAuc2V0KGlkLCB7XG4gICAgaW5pdGlhbERlZjogbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5pdGlhbERlZiksXG4gICAgaW5zdGFuY2VzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICByZXR1cm4gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50Ll9fdmNjT3B0cyA6IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIHJlcmVuZGVyKGlkLCBuZXdSZW5kZXIpIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlY29yZC5pbml0aWFsRGVmLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgWy4uLnJlY29yZC5pbnN0YW5jZXNdLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgaWYgKG5ld1JlbmRlcikge1xuICAgICAgaW5zdGFuY2UucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgICAgbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSkucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgIH1cbiAgICBpbnN0YW5jZS5yZW5kZXJDYWNoZSA9IFtdO1xuICAgIGlzSG1yVXBkYXRpbmcgPSB0cnVlO1xuICAgIGluc3RhbmNlLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgaXNIbXJVcGRhdGluZyA9IGZhbHNlO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbG9hZChpZCwgbmV3Q29tcCkge1xuICBjb25zdCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpXG4gICAgcmV0dXJuO1xuICBuZXdDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQobmV3Q29tcCk7XG4gIHVwZGF0ZUNvbXBvbmVudERlZihyZWNvcmQuaW5pdGlhbERlZiwgbmV3Q29tcCk7XG4gIGNvbnN0IGluc3RhbmNlcyA9IFsuLi5yZWNvcmQuaW5zdGFuY2VzXTtcbiAgZm9yIChjb25zdCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHtcbiAgICBjb25zdCBvbGRDb21wID0gbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSk7XG4gICAgaWYgKCFobXJEaXJ0eUNvbXBvbmVudHMuaGFzKG9sZENvbXApKSB7XG4gICAgICBpZiAob2xkQ29tcCAhPT0gcmVjb3JkLmluaXRpYWxEZWYpIHtcbiAgICAgICAgdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApO1xuICAgICAgfVxuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmFkZChvbGRDb21wKTtcbiAgICB9XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGhtckRpcnR5Q29tcG9uZW50cy5hZGQob2xkQ29tcCk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuZGVsZXRlKG9sZENvbXApO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBpbnN0YW5jZS5wYXJlbnQuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgIHF1ZXVlSm9iKGluc3RhbmNlLnBhcmVudC51cGRhdGUpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQpIHtcbiAgICAgIGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbSE1SXSBSb290IG9yIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UgbW9kaWZpZWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBxdWV1ZVBvc3RGbHVzaENiKCgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGluc3RhbmNlIG9mIGluc3RhbmNlcykge1xuICAgICAgaG1yRGlydHlDb21wb25lbnRzLmRlbGV0ZShcbiAgICAgICAgbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSlcbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudERlZihvbGRDb21wLCBuZXdDb21wKSB7XG4gIGV4dGVuZChvbGRDb21wLCBuZXdDb21wKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gb2xkQ29tcCkge1xuICAgIGlmIChrZXkgIT09IFwiX19maWxlXCIgJiYgIShrZXkgaW4gbmV3Q29tcCkpIHtcbiAgICAgIGRlbGV0ZSBvbGRDb21wW2tleV07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB0cnlXcmFwKGZuKSB7XG4gIHJldHVybiAoaWQsIGFyZykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oaWQsIGFyZyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtITVJdIFNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBWdWUgY29tcG9uZW50IGhvdC1yZWxvYWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5sZXQgZGV2dG9vbHMkMTtcbmxldCBidWZmZXIgPSBbXTtcbmxldCBkZXZ0b29sc05vdEluc3RhbGxlZCA9IGZhbHNlO1xuZnVuY3Rpb24gZW1pdCQxKGV2ZW50LCAuLi5hcmdzKSB7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfSBlbHNlIGlmICghZGV2dG9vbHNOb3RJbnN0YWxsZWQpIHtcbiAgICBidWZmZXIucHVzaCh7IGV2ZW50LCBhcmdzIH0pO1xuICB9XG59XG5mdW5jdGlvbiBzZXREZXZ0b29sc0hvb2skMShob29rLCB0YXJnZXQpIHtcbiAgdmFyIF9hLCBfYjtcbiAgZGV2dG9vbHMkMSA9IGhvb2s7XG4gIGlmIChkZXZ0b29scyQxKSB7XG4gICAgZGV2dG9vbHMkMS5lbmFibGVkID0gdHJ1ZTtcbiAgICBidWZmZXIuZm9yRWFjaCgoeyBldmVudCwgYXJncyB9KSA9PiBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpKTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfSBlbHNlIGlmIChcbiAgICAvLyBoYW5kbGUgbGF0ZSBkZXZ0b29scyBpbmplY3Rpb24gLSBvbmx5IGRvIHRoaXMgaWYgd2UgYXJlIGluIGFuIGFjdHVhbFxuICAgIC8vIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gYXZvaWQgdGhlIHRpbWVyIGhhbmRsZSBzdGFsbGluZyB0ZXN0IHJ1bm5lciBleGl0XG4gICAgLy8gKCM0ODE1KVxuICAgIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgLy8gc29tZSBlbnZzIG1vY2sgd2luZG93IGJ1dCBub3QgZnVsbHlcbiAgICB3aW5kb3cuSFRNTEVsZW1lbnQgJiYgLy8gYWxzbyBleGNsdWRlIGpzZG9tXG4gICAgISgoX2IgPSAoX2EgPSB3aW5kb3cubmF2aWdhdG9yKSA9PSBudWxsID8gdm9pZCAwIDogX2EudXNlckFnZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2IuaW5jbHVkZXMoXCJqc2RvbVwiKSlcbiAgKSB7XG4gICAgY29uc3QgcmVwbGF5ID0gdGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0hPT0tfUkVQTEFZX18gPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyB8fCBbXTtcbiAgICByZXBsYXkucHVzaCgobmV3SG9vaykgPT4ge1xuICAgICAgc2V0RGV2dG9vbHNIb29rJDEobmV3SG9vaywgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGV2dG9vbHMkMSkge1xuICAgICAgICB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IG51bGw7XG4gICAgICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgICAgYnVmZmVyID0gW107XG4gICAgICB9XG4gICAgfSwgM2UzKTtcbiAgfSBlbHNlIHtcbiAgICBkZXZ0b29sc05vdEluc3RhbGxlZCA9IHRydWU7XG4gICAgYnVmZmVyID0gW107XG4gIH1cbn1cbmZ1bmN0aW9uIGRldnRvb2xzSW5pdEFwcChhcHAsIHZlcnNpb24pIHtcbiAgZW1pdCQxKFwiYXBwOmluaXRcIiAvKiBBUFBfSU5JVCAqLywgYXBwLCB2ZXJzaW9uLCB7XG4gICAgRnJhZ21lbnQsXG4gICAgVGV4dCxcbiAgICBDb21tZW50LFxuICAgIFN0YXRpY1xuICB9KTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzVW5tb3VudEFwcChhcHApIHtcbiAgZW1pdCQxKFwiYXBwOnVubW91bnRcIiAvKiBBUFBfVU5NT1VOVCAqLywgYXBwKTtcbn1cbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50QWRkZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDphZGRlZFwiIC8qIENPTVBPTkVOVF9BRERFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXCJjb21wb25lbnQ6dXBkYXRlZFwiIC8qIENPTVBPTkVOVF9VUERBVEVEICovKTtcbmNvbnN0IF9kZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKFxuICBcImNvbXBvbmVudDpyZW1vdmVkXCIgLyogQ09NUE9ORU5UX1JFTU9WRUQgKi9cbik7XG5jb25zdCBkZXZ0b29sc0NvbXBvbmVudFJlbW92ZWQgPSAoY29tcG9uZW50KSA9PiB7XG4gIGlmIChkZXZ0b29scyQxICYmIHR5cGVvZiBkZXZ0b29scyQxLmNsZWFudXBCdWZmZXIgPT09IFwiZnVuY3Rpb25cIiAmJiAvLyByZW1vdmUgdGhlIGNvbXBvbmVudCBpZiBpdCB3YXNuJ3QgYnVmZmVyZWRcbiAgIWRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlcihjb21wb25lbnQpKSB7XG4gICAgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZChjb21wb25lbnQpO1xuICB9XG59O1xuZnVuY3Rpb24gY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQpID0+IHtcbiAgICBlbWl0JDEoXG4gICAgICBob29rLFxuICAgICAgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLFxuICAgICAgY29tcG9uZW50LnVpZCxcbiAgICAgIGNvbXBvbmVudC5wYXJlbnQgPyBjb21wb25lbnQucGFyZW50LnVpZCA6IHZvaWQgMCxcbiAgICAgIGNvbXBvbmVudFxuICAgICk7XG4gIH07XG59XG5jb25zdCBkZXZ0b29sc1BlcmZTdGFydCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcbiAgXCJwZXJmOnN0YXJ0XCIgLyogUEVSRk9STUFOQ0VfU1RBUlQgKi9cbik7XG5jb25zdCBkZXZ0b29sc1BlcmZFbmQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlRGV2dG9vbHNQZXJmb3JtYW5jZUhvb2soXG4gIFwicGVyZjplbmRcIiAvKiBQRVJGT1JNQU5DRV9FTkQgKi9cbik7XG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhob29rKSB7XG4gIHJldHVybiAoY29tcG9uZW50LCB0eXBlLCB0aW1lKSA9PiB7XG4gICAgZW1pdCQxKGhvb2ssIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCwgY29tcG9uZW50LnVpZCwgY29tcG9uZW50LCB0eXBlLCB0aW1lKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGRldnRvb2xzQ29tcG9uZW50RW1pdChjb21wb25lbnQsIGV2ZW50LCBwYXJhbXMpIHtcbiAgZW1pdCQxKFxuICAgIFwiY29tcG9uZW50OmVtaXRcIiAvKiBDT01QT05FTlRfRU1JVCAqLyxcbiAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgY29tcG9uZW50LFxuICAgIGV2ZW50LFxuICAgIHBhcmFtc1xuICApO1xufVxuXG5mdW5jdGlvbiBlbWl0KGluc3RhbmNlLCBldmVudCwgLi4ucmF3QXJncykge1xuICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpXG4gICAgcmV0dXJuO1xuICBjb25zdCBwcm9wcyA9IGluc3RhbmNlLnZub2RlLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCB7XG4gICAgICBlbWl0c09wdGlvbnMsXG4gICAgICBwcm9wc09wdGlvbnM6IFtwcm9wc09wdGlvbnNdXG4gICAgfSA9IGluc3RhbmNlO1xuICAgIGlmIChlbWl0c09wdGlvbnMpIHtcbiAgICAgIGlmICghKGV2ZW50IGluIGVtaXRzT3B0aW9ucykgJiYgdHJ1ZSkge1xuICAgICAgICBpZiAoIXByb3BzT3B0aW9ucyB8fCAhKHRvSGFuZGxlcktleShldmVudCkgaW4gcHJvcHNPcHRpb25zKSkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBDb21wb25lbnQgZW1pdHRlZCBldmVudCBcIiR7ZXZlbnR9XCIgYnV0IGl0IGlzIG5laXRoZXIgZGVjbGFyZWQgaW4gdGhlIGVtaXRzIG9wdGlvbiBub3IgYXMgYW4gXCIke3RvSGFuZGxlcktleShldmVudCl9XCIgcHJvcC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gZW1pdHNPcHRpb25zW2V2ZW50XTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdG9yKSkge1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0b3IoLi4ucmF3QXJncyk7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGV2ZW50IGFyZ3VtZW50czogZXZlbnQgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIGV2ZW50IFwiJHtldmVudH1cIi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBsZXQgYXJncyA9IHJhd0FyZ3M7XG4gIGNvbnN0IGlzTW9kZWxMaXN0ZW5lciA9IGV2ZW50LnN0YXJ0c1dpdGgoXCJ1cGRhdGU6XCIpO1xuICBjb25zdCBtb2RlbEFyZyA9IGlzTW9kZWxMaXN0ZW5lciAmJiBldmVudC5zbGljZSg3KTtcbiAgaWYgKG1vZGVsQXJnICYmIG1vZGVsQXJnIGluIHByb3BzKSB7XG4gICAgY29uc3QgbW9kaWZpZXJzS2V5ID0gYCR7bW9kZWxBcmcgPT09IFwibW9kZWxWYWx1ZVwiID8gXCJtb2RlbFwiIDogbW9kZWxBcmd9TW9kaWZpZXJzYDtcbiAgICBjb25zdCB7IG51bWJlciwgdHJpbSB9ID0gcHJvcHNbbW9kaWZpZXJzS2V5XSB8fCBFTVBUWV9PQko7XG4gICAgaWYgKHRyaW0pIHtcbiAgICAgIGFyZ3MgPSByYXdBcmdzLm1hcCgoYSkgPT4gaXNTdHJpbmcoYSkgPyBhLnRyaW0oKSA6IGEpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAobG9vc2VUb051bWJlcik7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzQ29tcG9uZW50RW1pdChpbnN0YW5jZSwgZXZlbnQsIGFyZ3MpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgcHJvcHNbdG9IYW5kbGVyS2V5KGxvd2VyQ2FzZUV2ZW50KV0pIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYEV2ZW50IFwiJHtsb3dlckNhc2VFdmVudH1cIiBpcyBlbWl0dGVkIGluIGNvbXBvbmVudCAke2Zvcm1hdENvbXBvbmVudE5hbWUoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgaW5zdGFuY2UudHlwZVxuICAgICAgICApfSBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXCIke2V2ZW50fVwiLiBOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSB2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIke2h5cGhlbmF0ZShcbiAgICAgICAgICBldmVudFxuICAgICAgICApfVwiIGluc3RlYWQgb2YgXCIke2V2ZW50fVwiLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGxldCBoYW5kbGVyTmFtZTtcbiAgbGV0IGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShldmVudCldIHx8IC8vIGFsc28gdHJ5IGNhbWVsQ2FzZSBldmVudCBoYW5kbGVyICgjMjI0OSlcbiAgcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoY2FtZWxpemUoZXZlbnQpKV07XG4gIGlmICghaGFuZGxlciAmJiBpc01vZGVsTGlzdGVuZXIpIHtcbiAgICBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoaHlwaGVuYXRlKGV2ZW50KSldO1xuICB9XG4gIGlmIChoYW5kbGVyKSB7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBoYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbiAgY29uc3Qgb25jZUhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSArIGBPbmNlYF07XG4gIGlmIChvbmNlSGFuZGxlcikge1xuICAgIGlmICghaW5zdGFuY2UuZW1pdHRlZCkge1xuICAgICAgaW5zdGFuY2UuZW1pdHRlZCA9IHt9O1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuZW1pdHRlZFtoYW5kbGVyTmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdGFuY2UuZW1pdHRlZFtoYW5kbGVyTmFtZV0gPSB0cnVlO1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgb25jZUhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRW1pdHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQuZW1pdHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJhdyA9IGNvbXAuZW1pdHM7XG4gIGxldCBub3JtYWxpemVkID0ge307XG4gIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgY29uc3QgZXh0ZW5kRW1pdHMgPSAocmF3MikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZyb21FeHRlbmQgPSBub3JtYWxpemVFbWl0c09wdGlvbnMocmF3MiwgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICBpZiAobm9ybWFsaXplZEZyb21FeHRlbmQpIHtcbiAgICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7XG4gICAgICAgIGV4dGVuZChub3JtYWxpemVkLCBub3JtYWxpemVkRnJvbUV4dGVuZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZEVtaXRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kRW1pdHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZEVtaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIHJhdy5mb3JFYWNoKChrZXkpID0+IG5vcm1hbGl6ZWRba2V5XSA9IG51bGwpO1xuICB9IGVsc2Uge1xuICAgIGV4dGVuZChub3JtYWxpemVkLCByYXcpO1xuICB9XG4gIGlmIChpc09iamVjdChjb21wKSkge1xuICAgIGNhY2hlLnNldChjb21wLCBub3JtYWxpemVkKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIGlzRW1pdExpc3RlbmVyKG9wdGlvbnMsIGtleSkge1xuICBpZiAoIW9wdGlvbnMgfHwgIWlzT24oa2V5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBrZXkgPSBrZXkuc2xpY2UoMikucmVwbGFjZSgvT25jZSQvLCBcIlwiKTtcbiAgcmV0dXJuIGhhc093bihvcHRpb25zLCBrZXlbMF0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgxKSkgfHwgaGFzT3duKG9wdGlvbnMsIGh5cGhlbmF0ZShrZXkpKSB8fCBoYXNPd24ob3B0aW9ucywga2V5KTtcbn1cblxubGV0IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9IG51bGw7XG5sZXQgY3VycmVudFNjb3BlSWQgPSBudWxsO1xuZnVuY3Rpb24gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIGNvbnN0IHByZXYgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSA9IGluc3RhbmNlO1xuICBjdXJyZW50U2NvcGVJZCA9IGluc3RhbmNlICYmIGluc3RhbmNlLnR5cGUuX19zY29wZUlkIHx8IG51bGw7XG4gIHJldHVybiBwcmV2O1xufVxuZnVuY3Rpb24gcHVzaFNjb3BlSWQoaWQpIHtcbiAgY3VycmVudFNjb3BlSWQgPSBpZDtcbn1cbmZ1bmN0aW9uIHBvcFNjb3BlSWQoKSB7XG4gIGN1cnJlbnRTY29wZUlkID0gbnVsbDtcbn1cbmNvbnN0IHdpdGhTY29wZUlkID0gKF9pZCkgPT4gd2l0aEN0eDtcbmZ1bmN0aW9uIHdpdGhDdHgoZm4sIGN0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSwgaXNOb25TY29wZWRTbG90KSB7XG4gIGlmICghY3R4KVxuICAgIHJldHVybiBmbjtcbiAgaWYgKGZuLl9uKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG4gIGNvbnN0IHJlbmRlckZuV2l0aENvbnRleHQgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChyZW5kZXJGbldpdGhDb250ZXh0Ll9kKSB7XG4gICAgICBzZXRCbG9ja1RyYWNraW5nKC0xKTtcbiAgICB9XG4gICAgY29uc3QgcHJldkluc3RhbmNlID0gc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKGN0eCk7XG4gICAgbGV0IHJlcztcbiAgICB0cnkge1xuICAgICAgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2SW5zdGFuY2UpO1xuICAgICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgICAgc2V0QmxvY2tUcmFja2luZygxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoY3R4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fbiA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2MgPSB0cnVlO1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9kID0gdHJ1ZTtcbiAgcmV0dXJuIHJlbmRlckZuV2l0aENvbnRleHQ7XG59XG5cbmxldCBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG5mdW5jdGlvbiBtYXJrQXR0cnNBY2Nlc3NlZCgpIHtcbiAgYWNjZXNzZWRBdHRycyA9IHRydWU7XG59XG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlOiBDb21wb25lbnQsXG4gICAgdm5vZGUsXG4gICAgcHJveHksXG4gICAgd2l0aFByb3h5LFxuICAgIHByb3BzLFxuICAgIHByb3BzT3B0aW9uczogW3Byb3BzT3B0aW9uc10sXG4gICAgc2xvdHMsXG4gICAgYXR0cnMsXG4gICAgZW1pdCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyQ2FjaGUsXG4gICAgZGF0YSxcbiAgICBzZXR1cFN0YXRlLFxuICAgIGN0eCxcbiAgICBpbmhlcml0QXR0cnNcbiAgfSA9IGluc3RhbmNlO1xuICBsZXQgcmVzdWx0O1xuICBsZXQgZmFsbHRocm91Z2hBdHRycztcbiAgY29uc3QgcHJldiA9IHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgYWNjZXNzZWRBdHRycyA9IGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDQpIHtcbiAgICAgIGNvbnN0IHByb3h5VG9Vc2UgPSB3aXRoUHJveHkgfHwgcHJveHk7XG4gICAgICBjb25zdCB0aGlzUHJveHkgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwU3RhdGUuX19pc1NjcmlwdFNldHVwID8gbmV3IFByb3h5KHByb3h5VG9Vc2UsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBQcm9wZXJ0eSAnJHtTdHJpbmcoXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKX0nIHdhcyBhY2Nlc3NlZCB2aWEgJ3RoaXMnLiBBdm9pZCB1c2luZyAndGhpcycgaW4gdGVtcGxhdGVzLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpO1xuICAgICAgICB9XG4gICAgICB9KSA6IHByb3h5VG9Vc2U7XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyLmNhbGwoXG4gICAgICAgICAgdGhpc1Byb3h5LFxuICAgICAgICAgIHByb3h5VG9Vc2UsXG4gICAgICAgICAgcmVuZGVyQ2FjaGUsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc2V0dXBTdGF0ZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGN0eFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGF0dHJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByZW5kZXIyID0gQ29tcG9uZW50O1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYXR0cnMgPT09IHByb3BzKSB7XG4gICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBub3JtYWxpemVWTm9kZShcbiAgICAgICAgcmVuZGVyMi5sZW5ndGggPiAxID8gcmVuZGVyMihcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICAgICAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xvdHMsXG4gICAgICAgICAgICBlbWl0XG4gICAgICAgICAgfSA6IHsgYXR0cnMsIHNsb3RzLCBlbWl0IH1cbiAgICAgICAgKSA6IHJlbmRlcjIoXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICAgIC8qIHdlIGtub3cgaXQgZG9lc24ndCBuZWVkIGl0ICovXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBmYWxsdGhyb3VnaEF0dHJzID0gQ29tcG9uZW50LnByb3BzID8gYXR0cnMgOiBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2goYXR0cnMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYmxvY2tTdGFjay5sZW5ndGggPSAwO1xuICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDEpO1xuICAgIHJlc3VsdCA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9XG4gIGxldCByb290ID0gcmVzdWx0O1xuICBsZXQgc2V0Um9vdCA9IHZvaWQgMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcmVzdWx0LnBhdGNoRmxhZyA+IDAgJiYgcmVzdWx0LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICBbcm9vdCwgc2V0Um9vdF0gPSBnZXRDaGlsZFJvb3QocmVzdWx0KTtcbiAgfVxuICBpZiAoZmFsbHRocm91Z2hBdHRycyAmJiBpbmhlcml0QXR0cnMgIT09IGZhbHNlKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnIH0gPSByb290O1xuICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNikpIHtcbiAgICAgICAgaWYgKHByb3BzT3B0aW9ucyAmJiBrZXlzLnNvbWUoaXNNb2RlbExpc3RlbmVyKSkge1xuICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBmaWx0ZXJNb2RlbExpc3RlbmVycyhcbiAgICAgICAgICAgIGZhbGx0aHJvdWdoQXR0cnMsXG4gICAgICAgICAgICBwcm9wc09wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJvb3QgPSBjbG9uZVZOb2RlKHJvb3QsIGZhbGx0aHJvdWdoQXR0cnMpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFhY2Nlc3NlZEF0dHJzICYmIHJvb3QudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBjb25zdCBhbGxBdHRycyA9IE9iamVjdC5rZXlzKGF0dHJzKTtcbiAgICAgICAgY29uc3QgZXZlbnRBdHRycyA9IFtdO1xuICAgICAgICBjb25zdCBleHRyYUF0dHJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gYWxsQXR0cnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYWxsQXR0cnNbaV07XG4gICAgICAgICAgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICAgICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgICAgICAgICBldmVudEF0dHJzLnB1c2goa2V5WzJdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHRyYUF0dHJzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dHJhQXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCR7ZXh0cmFBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXh0cmFuZW91cyBub24tZW1pdHMgZXZlbnQgbGlzdGVuZXJzICgke2V2ZW50QXR0cnMuam9pbihcIiwgXCIpfSkgd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IHJvb3Qgbm9kZXMuIElmIHRoZSBsaXN0ZW5lciBpcyBpbnRlbmRlZCB0byBiZSBhIGNvbXBvbmVudCBjdXN0b20gZXZlbnQgbGlzdGVuZXIgb25seSwgZGVjbGFyZSBpdCB1c2luZyB0aGUgXCJlbWl0c1wiIG9wdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodm5vZGUuZGlycykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBSdW50aW1lIGRpcmVjdGl2ZSB1c2VkIG9uIGNvbXBvbmVudCB3aXRoIG5vbi1lbGVtZW50IHJvb3Qgbm9kZS4gVGhlIGRpcmVjdGl2ZXMgd2lsbCBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCk7XG4gICAgcm9vdC5kaXJzID0gcm9vdC5kaXJzID8gcm9vdC5kaXJzLmNvbmNhdCh2bm9kZS5kaXJzKSA6IHZub2RlLmRpcnM7XG4gIH1cbiAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNFbGVtZW50Um9vdChyb290KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IGluc2lkZSA8VHJhbnNpdGlvbj4gcmVuZGVycyBub24tZWxlbWVudCByb290IG5vZGUgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdC50cmFuc2l0aW9uID0gdm5vZGUudHJhbnNpdGlvbjtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXRSb290KSB7XG4gICAgc2V0Um9vdChyb290KTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSByb290O1xuICB9XG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCByYXdDaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICBjb25zdCBkeW5hbWljQ2hpbGRyZW4gPSB2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4pO1xuICBpZiAoIWNoaWxkUm9vdCkge1xuICAgIHJldHVybiBbdm5vZGUsIHZvaWQgMF07XG4gIH1cbiAgY29uc3QgaW5kZXggPSByYXdDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCk7XG4gIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgY29uc3Qgc2V0Um9vdCA9ICh1cGRhdGVkUm9vdCkgPT4ge1xuICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgfSBlbHNlIGlmICh1cGRhdGVkUm9vdC5wYXRjaEZsYWcgPiAwKSB7XG4gICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbbm9ybWFsaXplVk5vZGUoY2hpbGRSb290KSwgc2V0Um9vdF07XG59O1xuZnVuY3Rpb24gZmlsdGVyU2luZ2xlUm9vdChjaGlsZHJlbikge1xuICBsZXQgc2luZ2xlUm9vdDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgaWYgKGlzVk5vZGUoY2hpbGQpKSB7XG4gICAgICBpZiAoY2hpbGQudHlwZSAhPT0gQ29tbWVudCB8fCBjaGlsZC5jaGlsZHJlbiA9PT0gXCJ2LWlmXCIpIHtcbiAgICAgICAgaWYgKHNpbmdsZVJvb3QpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2luZ2xlUm9vdCA9IGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNpbmdsZVJvb3Q7XG59XG5jb25zdCBnZXRGdW5jdGlvbmFsRmFsbHRocm91Z2ggPSAoYXR0cnMpID0+IHtcbiAgbGV0IHJlcztcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIgfHwga2V5ID09PSBcInN0eWxlXCIgfHwgaXNPbihrZXkpKSB7XG4gICAgICAocmVzIHx8IChyZXMgPSB7fSkpW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGZpbHRlck1vZGVsTGlzdGVuZXJzID0gKGF0dHJzLCBwcm9wcykgPT4ge1xuICBjb25zdCByZXMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpIHx8ICEoa2V5LnNsaWNlKDkpIGluIHByb3BzKSkge1xuICAgICAgcmVzW2tleV0gPSBhdHRyc1trZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmNvbnN0IGlzRWxlbWVudFJvb3QgPSAodm5vZGUpID0+IHtcbiAgcmV0dXJuIHZub2RlLnNoYXBlRmxhZyAmICg2IHwgMSkgfHwgdm5vZGUudHlwZSA9PT0gQ29tbWVudDtcbn07XG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldlZOb2RlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkge1xuICBjb25zdCB7IHByb3BzOiBwcmV2UHJvcHMsIGNoaWxkcmVuOiBwcmV2Q2hpbGRyZW4sIGNvbXBvbmVudCB9ID0gcHJldlZOb2RlO1xuICBjb25zdCB7IHByb3BzOiBuZXh0UHJvcHMsIGNoaWxkcmVuOiBuZXh0Q2hpbGRyZW4sIHBhdGNoRmxhZyB9ID0gbmV4dFZOb2RlO1xuICBjb25zdCBlbWl0cyA9IGNvbXBvbmVudC5lbWl0c09wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG5leHRWTm9kZS5kaXJzIHx8IG5leHRWTm9kZS50cmFuc2l0aW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG9wdGltaXplZCAmJiBwYXRjaEZsYWcgPj0gMCkge1xuICAgIGlmIChwYXRjaEZsYWcgJiAxMDI0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgICByZXR1cm4gISFuZXh0UHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBkeW5hbWljUHJvcHMgPSBuZXh0Vk5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZHluYW1pY1Byb3BzW2ldO1xuICAgICAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0cywga2V5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChwcmV2Q2hpbGRyZW4gfHwgbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiB8fCAhbmV4dENoaWxkcmVuLiRzdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMgPT09IG5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIXByZXZQcm9wcykge1xuICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgIH1cbiAgICBpZiAoIW5leHRQcm9wcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBoYXNQcm9wc0NoYW5nZWQocHJldlByb3BzLCBuZXh0UHJvcHMsIGVtaXRzT3B0aW9ucykge1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIGlmIChuZXh0S2V5cy5sZW5ndGggIT09IE9iamVjdC5rZXlzKHByZXZQcm9wcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IG5leHRLZXlzW2ldO1xuICAgIGlmIChuZXh0UHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0gJiYgIWlzRW1pdExpc3RlbmVyKGVtaXRzT3B0aW9ucywga2V5KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUhPQ0hvc3RFbCh7IHZub2RlLCBwYXJlbnQgfSwgZWwpIHtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQuc3ViVHJlZTtcbiAgICBpZiAocm9vdC5zdXNwZW5zZSAmJiByb290LnN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9PT0gdm5vZGUpIHtcbiAgICAgIHJvb3QuZWwgPSB2bm9kZS5lbDtcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IHZub2RlKSB7XG4gICAgICAodm5vZGUgPSBwYXJlbnQudm5vZGUpLmVsID0gZWw7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9IFwiY29tcG9uZW50c1wiO1xuY29uc3QgRElSRUNUSVZFUyA9IFwiZGlyZWN0aXZlc1wiO1xuZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudChuYW1lLCBtYXliZVNlbGZSZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBuYW1lLCB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UpIHx8IG5hbWU7XG59XG5jb25zdCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UID0gU3ltYm9sLmZvcihcInYtbmRjXCIpO1xuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIGlmIChpc1N0cmluZyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBjb21wb25lbnQsIGZhbHNlKSB8fCBjb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudCB8fCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKG5hbWUpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChESVJFQ1RJVkVTLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVBc3NldCh0eXBlLCBuYW1lLCB3YXJuTWlzc2luZyA9IHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIHx8IGN1cnJlbnRJbnN0YW5jZTtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gQ09NUE9ORU5UUykge1xuICAgICAgY29uc3Qgc2VsZk5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgaWYgKHNlbGZOYW1lICYmIChzZWxmTmFtZSA9PT0gbmFtZSB8fCBzZWxmTmFtZSA9PT0gY2FtZWxpemUobmFtZSkgfHwgc2VsZk5hbWUgPT09IGNhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpKSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSAoXG4gICAgICAvLyBsb2NhbCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgcmVzb2x2ZShpbnN0YW5jZVt0eXBlXSB8fCBDb21wb25lbnRbdHlwZV0sIG5hbWUpIHx8IC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSlcbiAgICApO1xuICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgICAgY29uc3QgZXh0cmEgPSB0eXBlID09PSBDT01QT05FTlRTID8gYFxuSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gIDogYGA7XG4gICAgICB3YXJuJDEoYEZhaWxlZCB0byByZXNvbHZlICR7dHlwZS5zbGljZSgwLCAtMSl9OiAke25hbWV9JHtleHRyYX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHJlc29sdmUke2NhcGl0YWxpemUodHlwZS5zbGljZSgwLCAtMSkpfSBjYW4gb25seSBiZSB1c2VkIGluIHJlbmRlcigpIG9yIHNldHVwKCkuYFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmUocmVnaXN0cnksIG5hbWUpIHtcbiAgcmV0dXJuIHJlZ2lzdHJ5ICYmIChyZWdpc3RyeVtuYW1lXSB8fCByZWdpc3RyeVtjYW1lbGl6ZShuYW1lKV0gfHwgcmVnaXN0cnlbY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSldKTtcbn1cblxuY29uc3QgaXNTdXNwZW5zZSA9ICh0eXBlKSA9PiB0eXBlLl9faXNTdXNwZW5zZTtcbmxldCBzdXNwZW5zZUlkID0gMDtcbmNvbnN0IFN1c3BlbnNlSW1wbCA9IHtcbiAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAvLyBJbiBvcmRlciB0byBtYWtlIFN1c3BlbnNlIHRyZWUtc2hha2FibGUsIHdlIG5lZWQgdG8gYXZvaWQgaW1wb3J0aW5nIGl0XG4gIC8vIGRpcmVjdGx5IGluIHRoZSByZW5kZXJlci4gVGhlIHJlbmRlcmVyIGNoZWNrcyBmb3IgdGhlIF9faXNTdXNwZW5zZSBmbGFnXG4gIC8vIG9uIGEgdm5vZGUncyB0eXBlIGFuZCBjYWxscyB0aGUgYHByb2Nlc3NgIG1ldGhvZCwgcGFzc2luZyBpbiByZW5kZXJlclxuICAvLyBpbnRlcm5hbHMuXG4gIF9faXNTdXNwZW5zZTogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscykge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBtb3VudFN1c3BlbnNlKFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIHJlbmRlcmVySW50ZXJuYWxzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UuZGVwcyA+IDApIHtcbiAgICAgICAgbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGF0Y2hTdXNwZW5zZShcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICByZW5kZXJlckludGVybmFsc1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG4gIGh5ZHJhdGU6IGh5ZHJhdGVTdXNwZW5zZSxcbiAgY3JlYXRlOiBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5LFxuICBub3JtYWxpemU6IG5vcm1hbGl6ZVN1c3BlbnNlQ2hpbGRyZW5cbn07XG5jb25zdCBTdXNwZW5zZSA9IFN1c3BlbnNlSW1wbCA7XG5mdW5jdGlvbiB0cmlnZ2VyRXZlbnQodm5vZGUsIG5hbWUpIHtcbiAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzW25hbWVdO1xuICBpZiAoaXNGdW5jdGlvbihldmVudExpc3RlbmVyKSkge1xuICAgIGV2ZW50TGlzdGVuZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBvOiB7IGNyZWF0ZUVsZW1lbnQgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGhpZGRlbkNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGFuY2hvcixcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFsc1xuICApO1xuICBwYXRjaChcbiAgICBudWxsLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIG51bGwsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIG5hbWVzcGFjZSxcbiAgICBzbG90U2NvcGVJZHNcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPiAwKSB7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uUGVuZGluZ1wiKTtcbiAgICB0cmlnZ2VyRXZlbnQodm5vZGUsIFwib25GYWxsYmFja1wiKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZS5zc0ZhbGxiYWNrLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgdm5vZGUuc3NGYWxsYmFjayk7XG4gIH0gZWxzZSB7XG4gICAgc3VzcGVuc2UucmVzb2x2ZShmYWxzZSwgdHJ1ZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHBhdGNoU3VzcGVuc2UobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCB7IHA6IHBhdGNoLCB1bTogdW5tb3VudCwgbzogeyBjcmVhdGVFbGVtZW50IH0gfSkge1xuICBjb25zdCBzdXNwZW5zZSA9IG4yLnN1c3BlbnNlID0gbjEuc3VzcGVuc2U7XG4gIHN1c3BlbnNlLnZub2RlID0gbjI7XG4gIG4yLmVsID0gbjEuZWw7XG4gIGNvbnN0IG5ld0JyYW5jaCA9IG4yLnNzQ29udGVudDtcbiAgY29uc3QgbmV3RmFsbGJhY2sgPSBuMi5zc0ZhbGxiYWNrO1xuICBjb25zdCB7IGFjdGl2ZUJyYW5jaCwgcGVuZGluZ0JyYW5jaCwgaXNJbkZhbGxiYWNrLCBpc0h5ZHJhdGluZyB9ID0gc3VzcGVuc2U7XG4gIGlmIChwZW5kaW5nQnJhbmNoKSB7XG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IG5ld0JyYW5jaDtcbiAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgcGVuZGluZ0JyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICAgICAgbmV3RmFsbGJhY2ssXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICAgIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IHBlbmRpbmdCcmFuY2g7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bm1vdW50KHBlbmRpbmdCcmFuY2gsIHBhcmVudENvbXBvbmVudCwgc3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZGVwcyA9IDA7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLmxlbmd0aCA9IDA7XG4gICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgaWYgKGlzSW5GYWxsYmFjaykge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICAgIG5ld0ZhbGxiYWNrLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZUJyYW5jaCAmJiBpc1NhbWVWTm9kZVR5cGUobmV3QnJhbmNoLCBhY3RpdmVCcmFuY2gpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3QnJhbmNoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckV2ZW50KG4yLCBcIm9uUGVuZGluZ1wiKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgICBpZiAobmV3QnJhbmNoLnNoYXBlRmxhZyAmIDUxMikge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBuZXdCcmFuY2guY29tcG9uZW50LnN1c3BlbnNlSWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdXNwZW5zZS5wZW5kaW5nSWQgPSBzdXNwZW5zZUlkKys7XG4gICAgICB9XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgdGltZW91dCwgcGVuZGluZ0lkIH0gPSBzdXNwZW5zZTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0lkID09PSBwZW5kaW5nSWQpIHtcbiAgICAgICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRpbWVvdXQgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5mYWxsYmFjayhuZXdGYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZVN1c3BlbnNlQm91bmRhcnkodm5vZGUsIHBhcmVudFN1c3BlbnNlLCBwYXJlbnRDb21wb25lbnQsIGNvbnRhaW5lciwgaGlkZGVuQ29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBpc0h5ZHJhdGluZyA9IGZhbHNlKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUgJiYgIWhhc1dhcm5lZCkge1xuICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgY29uc29sZVtjb25zb2xlLmluZm8gPyBcImluZm9cIiA6IFwibG9nXCJdKFxuICAgICAgYDxTdXNwZW5zZT4gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIGl0cyBBUEkgd2lsbCBsaWtlbHkgY2hhbmdlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IHtcbiAgICBwOiBwYXRjaCxcbiAgICBtOiBtb3ZlLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG46IG5leHQsXG4gICAgbzogeyBwYXJlbnROb2RlLCByZW1vdmUgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGxldCBwYXJlbnRTdXNwZW5zZUlkO1xuICBjb25zdCBpc1N1c3BlbnNpYmxlID0gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKTtcbiAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgPT0gbnVsbCA/IHZvaWQgMCA6IHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlSWQgPSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQ7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzKys7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVvdXQgPSB2bm9kZS5wcm9wcyA/IHRvTnVtYmVyKHZub2RlLnByb3BzLnRpbWVvdXQpIDogdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcih0aW1lb3V0LCBgU3VzcGVuc2UgdGltZW91dGApO1xuICB9XG4gIGNvbnN0IGluaXRpYWxBbmNob3IgPSBhbmNob3I7XG4gIGNvbnN0IHN1c3BlbnNlID0ge1xuICAgIHZub2RlLFxuICAgIHBhcmVudDogcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIG5hbWVzcGFjZSxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGRlcHM6IDAsXG4gICAgcGVuZGluZ0lkOiBzdXNwZW5zZUlkKyssXG4gICAgdGltZW91dDogdHlwZW9mIHRpbWVvdXQgPT09IFwibnVtYmVyXCIgPyB0aW1lb3V0IDogLTEsXG4gICAgYWN0aXZlQnJhbmNoOiBudWxsLFxuICAgIHBlbmRpbmdCcmFuY2g6IG51bGwsXG4gICAgaXNJbkZhbGxiYWNrOiAhaXNIeWRyYXRpbmcsXG4gICAgaXNIeWRyYXRpbmcsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGVmZmVjdHM6IFtdLFxuICAgIHJlc29sdmUocmVzdW1lID0gZmFsc2UsIHN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgaWYgKCFyZXN1bWUgJiYgIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCB3aXRob3V0IGEgcGVuZGluZyBicmFuY2guYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1c3BlbnNlLmlzVW5tb3VudGVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgb24gYW4gYWxyZWFkeSB1bm1vdW50ZWQgc3VzcGVuc2UgYm91bmRhcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdm5vZGU6IHZub2RlMixcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBwZW5kaW5nSWQsXG4gICAgICAgIGVmZmVjdHMsXG4gICAgICAgIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIyXG4gICAgICB9ID0gc3VzcGVuc2U7XG4gICAgICBsZXQgZGVsYXlFbnRlciA9IGZhbHNlO1xuICAgICAgaWYgKHN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCFyZXN1bWUpIHtcbiAgICAgICAgZGVsYXlFbnRlciA9IGFjdGl2ZUJyYW5jaCAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24gJiYgcGVuZGluZ0JyYW5jaC50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nSWQgPT09IHN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBtb3ZlKFxuICAgICAgICAgICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICAgICAgICBhbmNob3IgPT09IGluaXRpYWxBbmNob3IgPyBuZXh0KGFjdGl2ZUJyYW5jaCkgOiBhbmNob3IsXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGl2ZUJyYW5jaCkge1xuICAgICAgICAgIGlmIChwYXJlbnROb2RlKGFjdGl2ZUJyYW5jaC5lbCkgIT09IHN1c3BlbnNlLmhpZGRlbkNvbnRhaW5lcikge1xuICAgICAgICAgICAgYW5jaG9yID0gbmV4dChhY3RpdmVCcmFuY2gpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1bm1vdW50KGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50Miwgc3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGVsYXlFbnRlcikge1xuICAgICAgICAgIG1vdmUocGVuZGluZ0JyYW5jaCwgY29udGFpbmVyMiwgYW5jaG9yLCAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBwZW5kaW5nQnJhbmNoKTtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBudWxsO1xuICAgICAgc3VzcGVuc2UuaXNJbkZhbGxiYWNrID0gZmFsc2U7XG4gICAgICBsZXQgcGFyZW50ID0gc3VzcGVuc2UucGFyZW50O1xuICAgICAgbGV0IGhhc1VucmVzb2x2ZWRBbmNlc3RvciA9IGZhbHNlO1xuICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50LnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICBwYXJlbnQuZWZmZWN0cy5wdXNoKC4uLmVmZmVjdHMpO1xuICAgICAgICAgIGhhc1VucmVzb2x2ZWRBbmNlc3RvciA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmICghaGFzVW5yZXNvbHZlZEFuY2VzdG9yICYmICFkZWxheUVudGVyKSB7XG4gICAgICAgIHF1ZXVlUG9zdEZsdXNoQ2IoZWZmZWN0cyk7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzID0gW107XG4gICAgICBpZiAoaXNTdXNwZW5zaWJsZSkge1xuICAgICAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiBwYXJlbnRTdXNwZW5zZUlkID09PSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQpIHtcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlLmRlcHMgPT09IDAgJiYgIXN5bmMpIHtcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25SZXNvbHZlXCIpO1xuICAgIH0sXG4gICAgZmFsbGJhY2soZmFsbGJhY2tWTm9kZSkge1xuICAgICAgaWYgKCFzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgdm5vZGU6IHZub2RlMiwgYWN0aXZlQnJhbmNoLCBwYXJlbnRDb21wb25lbnQ6IHBhcmVudENvbXBvbmVudDIsIGNvbnRhaW5lcjogY29udGFpbmVyMiwgbmFtZXNwYWNlOiBuYW1lc3BhY2UyIH0gPSBzdXNwZW5zZTtcbiAgICAgIHRyaWdnZXJFdmVudCh2bm9kZTIsIFwib25GYWxsYmFja1wiKTtcbiAgICAgIGNvbnN0IGFuY2hvcjIgPSBuZXh0KGFjdGl2ZUJyYW5jaCk7XG4gICAgICBjb25zdCBtb3VudEZhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXN1c3BlbnNlLmlzSW5GYWxsYmFjaykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGZhbGxiYWNrVk5vZGUsXG4gICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICBhbmNob3IyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudDIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgIG5hbWVzcGFjZTIsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIGZhbGxiYWNrVk5vZGUpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlbGF5RW50ZXIgPSBmYWxsYmFja1ZOb2RlLnRyYW5zaXRpb24gJiYgZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICBpZiAoZGVsYXlFbnRlcikge1xuICAgICAgICBhY3RpdmVCcmFuY2gudHJhbnNpdGlvbi5hZnRlckxlYXZlID0gbW91bnRGYWxsYmFjaztcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IHRydWU7XG4gICAgICB1bm1vdW50KFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIHBhcmVudENvbXBvbmVudDIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIC8vIG5vIHN1c3BlbnNlIHNvIHVubW91bnQgaG9va3MgZmlyZSBub3dcbiAgICAgICAgdHJ1ZVxuICAgICAgICAvLyBzaG91bGRSZW1vdmVcbiAgICAgICk7XG4gICAgICBpZiAoIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgbW91bnRGYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbW92ZShjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKSB7XG4gICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggJiYgbW92ZShzdXNwZW5zZS5hY3RpdmVCcmFuY2gsIGNvbnRhaW5lcjIsIGFuY2hvcjIsIHR5cGUpO1xuICAgICAgc3VzcGVuc2UuY29udGFpbmVyID0gY29udGFpbmVyMjtcbiAgICB9LFxuICAgIG5leHQoKSB7XG4gICAgICByZXR1cm4gc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG5leHQoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCkge1xuICAgICAgY29uc3QgaXNJblBlbmRpbmdTdXNwZW5zZSA9ICEhc3VzcGVuc2UucGVuZGluZ0JyYW5jaDtcbiAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlKSB7XG4gICAgICAgIHN1c3BlbnNlLmRlcHMrKztcbiAgICAgIH1cbiAgICAgIGNvbnN0IGh5ZHJhdGVkRWwgPSBpbnN0YW5jZS52bm9kZS5lbDtcbiAgICAgIGluc3RhbmNlLmFzeW5jRGVwLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMCk7XG4gICAgICB9KS50aGVuKChhc3luY1NldHVwUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5pc1VubW91bnRlZCB8fCBzdXNwZW5zZS5pc1VubW91bnRlZCB8fCBzdXNwZW5zZS5wZW5kaW5nSWQgIT09IGluc3RhbmNlLnN1c3BlbnNlSWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuYXN5bmNSZXNvbHZlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHsgdm5vZGU6IHZub2RlMiB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KHZub2RlMik7XG4gICAgICAgIH1cbiAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIGFzeW5jU2V0dXBSZXN1bHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGh5ZHJhdGVkRWwpIHtcbiAgICAgICAgICB2bm9kZTIuZWwgPSBoeWRyYXRlZEVsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gIWh5ZHJhdGVkRWwgJiYgaW5zdGFuY2Uuc3ViVHJlZS5lbDtcbiAgICAgICAgc2V0dXBSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgdm5vZGUyLFxuICAgICAgICAgIC8vIGNvbXBvbmVudCBtYXkgaGF2ZSBiZWVuIG1vdmVkIGJlZm9yZSByZXNvbHZlLlxuICAgICAgICAgIC8vIGlmIHRoaXMgaXMgbm90IGEgaHlkcmF0aW9uLCBpbnN0YW5jZS5zdWJUcmVlIHdpbGwgYmUgdGhlIGNvbW1lbnRcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlci5cbiAgICAgICAgICBwYXJlbnROb2RlKGh5ZHJhdGVkRWwgfHwgaW5zdGFuY2Uuc3ViVHJlZS5lbCksXG4gICAgICAgICAgLy8gYW5jaG9yIHdpbGwgbm90IGJlIHVzZWQgaWYgdGhpcyBpcyBoeWRyYXRpb24sIHNvIG9ubHkgbmVlZCB0b1xuICAgICAgICAgIC8vIGNvbnNpZGVyIHRoZSBjb21tZW50IHBsYWNlaG9sZGVyIGNhc2UuXG4gICAgICAgICAgaHlkcmF0ZWRFbCA/IG51bGwgOiBuZXh0KGluc3RhbmNlLnN1YlRyZWUpLFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgcmVtb3ZlKHBsYWNlaG9sZGVyKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIHZub2RlMi5lbCk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSAmJiAtLXN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdW5tb3VudChwYXJlbnRTdXNwZW5zZTIsIGRvUmVtb3ZlKSB7XG4gICAgICBzdXNwZW5zZS5pc1VubW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAoc3VzcGVuc2UuYWN0aXZlQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UyLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gc3VzcGVuc2U7XG59XG5mdW5jdGlvbiBoeWRyYXRlU3VzcGVuc2Uobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHJlbmRlcmVySW50ZXJuYWxzLCBoeWRyYXRlTm9kZSkge1xuICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlID0gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeShcbiAgICB2bm9kZSxcbiAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgbm9kZS5wYXJlbnROb2RlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICAgIG51bGwsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgdHJ1ZVxuICApO1xuICBjb25zdCByZXN1bHQgPSBoeWRyYXRlTm9kZShcbiAgICBub2RlLFxuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSB2bm9kZS5zc0NvbnRlbnQsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIHN1c3BlbnNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWRcbiAgKTtcbiAgaWYgKHN1c3BlbnNlLmRlcHMgPT09IDApIHtcbiAgICBzdXNwZW5zZS5yZXNvbHZlKGZhbHNlLCB0cnVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VDaGlsZHJlbih2bm9kZSkge1xuICBjb25zdCB7IHNoYXBlRmxhZywgY2hpbGRyZW4gfSA9IHZub2RlO1xuICBjb25zdCBpc1Nsb3RDaGlsZHJlbiA9IHNoYXBlRmxhZyAmIDMyO1xuICB2bm9kZS5zc0NvbnRlbnQgPSBub3JtYWxpemVTdXNwZW5zZVNsb3QoXG4gICAgaXNTbG90Q2hpbGRyZW4gPyBjaGlsZHJlbi5kZWZhdWx0IDogY2hpbGRyZW5cbiAgKTtcbiAgdm5vZGUuc3NGYWxsYmFjayA9IGlzU2xvdENoaWxkcmVuID8gbm9ybWFsaXplU3VzcGVuc2VTbG90KGNoaWxkcmVuLmZhbGxiYWNrKSA6IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplU3VzcGVuc2VTbG90KHMpIHtcbiAgbGV0IGJsb2NrO1xuICBpZiAoaXNGdW5jdGlvbihzKSkge1xuICAgIGNvbnN0IHRyYWNrQmxvY2sgPSBpc0Jsb2NrVHJlZUVuYWJsZWQgJiYgcy5fYztcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IGZhbHNlO1xuICAgICAgb3BlbkJsb2NrKCk7XG4gICAgfVxuICAgIHMgPSBzKCk7XG4gICAgaWYgKHRyYWNrQmxvY2spIHtcbiAgICAgIHMuX2QgPSB0cnVlO1xuICAgICAgYmxvY2sgPSBjdXJyZW50QmxvY2s7XG4gICAgICBjbG9zZUJsb2NrKCk7XG4gICAgfVxuICB9XG4gIGlmIChpc0FycmF5KHMpKSB7XG4gICAgY29uc3Qgc2luZ2xlQ2hpbGQgPSBmaWx0ZXJTaW5nbGVSb290KHMpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFzaW5nbGVDaGlsZCAmJiBzLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkICE9PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKS5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuJDEoYDxTdXNwZW5zZT4gc2xvdHMgZXhwZWN0IGEgc2luZ2xlIHJvb3Qgbm9kZS5gKTtcbiAgICB9XG4gICAgcyA9IHNpbmdsZUNoaWxkO1xuICB9XG4gIHMgPSBub3JtYWxpemVWTm9kZShzKTtcbiAgaWYgKGJsb2NrICYmICFzLmR5bmFtaWNDaGlsZHJlbikge1xuICAgIHMuZHluYW1pY0NoaWxkcmVuID0gYmxvY2suZmlsdGVyKChjKSA9PiBjICE9PSBzKTtcbiAgfVxuICByZXR1cm4gcztcbn1cbmZ1bmN0aW9uIHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlKGZuLCBzdXNwZW5zZSkge1xuICBpZiAoc3VzcGVuc2UgJiYgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgIGlmIChpc0FycmF5KGZuKSkge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKC4uLmZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5wdXNoKGZuKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcXVldWVQb3N0Rmx1c2hDYihmbik7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgYnJhbmNoKSB7XG4gIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCA9IGJyYW5jaDtcbiAgY29uc3QgeyB2bm9kZSwgcGFyZW50Q29tcG9uZW50IH0gPSBzdXNwZW5zZTtcbiAgbGV0IGVsID0gYnJhbmNoLmVsO1xuICB3aGlsZSAoIWVsICYmIGJyYW5jaC5jb21wb25lbnQpIHtcbiAgICBicmFuY2ggPSBicmFuY2guY29tcG9uZW50LnN1YlRyZWU7XG4gICAgZWwgPSBicmFuY2guZWw7XG4gIH1cbiAgdm5vZGUuZWwgPSBlbDtcbiAgaWYgKHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQuc3ViVHJlZSA9PT0gdm5vZGUpIHtcbiAgICBwYXJlbnRDb21wb25lbnQudm5vZGUuZWwgPSBlbDtcbiAgICB1cGRhdGVIT0NIb3N0RWwocGFyZW50Q29tcG9uZW50LCBlbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzVk5vZGVTdXNwZW5zaWJsZSh2bm9kZSkge1xuICB2YXIgX2E7XG4gIHJldHVybiAoKF9hID0gdm5vZGUucHJvcHMpID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdXNwZW5zaWJsZSkgIT0gbnVsbCAmJiB2bm9kZS5wcm9wcy5zdXNwZW5zaWJsZSAhPT0gZmFsc2U7XG59XG5cbmNvbnN0IHNzckNvbnRleHRLZXkgPSBTeW1ib2wuZm9yKFwidi1zY3hcIik7XG5jb25zdCB1c2VTU1JDb250ZXh0ID0gKCkgPT4ge1xuICB7XG4gICAgY29uc3QgY3R4ID0gaW5qZWN0KHNzckNvbnRleHRLZXkpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYFNlcnZlciByZW5kZXJpbmcgY29udGV4dCBub3QgcHJvdmlkZWQuIE1ha2Ugc3VyZSB0byBvbmx5IGNhbGwgdXNlU1NSQ29udGV4dCgpIGNvbmRpdGlvbmFsbHkgaW4gdGhlIHNlcnZlciBidWlsZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY3R4O1xuICB9XG59O1xuXG5mdW5jdGlvbiB3YXRjaEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goZWZmZWN0LCBudWxsLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHdhdGNoUG9zdEVmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJwb3N0XCIgfSkgOiB7IGZsdXNoOiBcInBvc3RcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaFN5bmNFZmZlY3QoZWZmZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBkb1dhdGNoKFxuICAgIGVmZmVjdCxcbiAgICBudWxsLFxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBleHRlbmQoe30sIG9wdGlvbnMsIHsgZmx1c2g6IFwic3luY1wiIH0pIDogeyBmbHVzaDogXCJzeW5jXCIgfVxuICApO1xufVxuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG5mdW5jdGlvbiB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBcXGB3YXRjaChmbiwgb3B0aW9ucz8pXFxgIHNpZ25hdHVyZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlIEFQSS4gVXNlIFxcYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylcXGAgaW5zdGVhZC4gXFxgd2F0Y2hcXGAgbm93IG9ubHkgc3VwcG9ydHMgXFxgd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZG9XYXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGRvV2F0Y2goc291cmNlLCBjYiwge1xuICBpbW1lZGlhdGUsXG4gIGRlZXAsXG4gIGZsdXNoLFxuICBvbmNlLFxuICBvblRyYWNrLFxuICBvblRyaWdnZXJcbn0gPSBFTVBUWV9PQkopIHtcbiAgaWYgKGNiICYmIG9uY2UpIHtcbiAgICBjb25zdCBfY2IgPSBjYjtcbiAgICBjYiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBfY2IoLi4uYXJncyk7XG4gICAgICB1bndhdGNoKCk7XG4gICAgfTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBkZWVwICE9PSB2b2lkIDAgJiYgdHlwZW9mIGRlZXAgPT09IFwibnVtYmVyXCIpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgd2F0Y2goKSBcImRlZXBcIiBvcHRpb24gd2l0aCBudW1iZXIgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHdhdGNoIGRlcHRoIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIHVzZSBhIGJvb2xlYW4gaW5zdGVhZCB0byBhdm9pZCBwb3RlbnRpYWwgYnJlYWthZ2UuYFxuICAgICk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWNiKSB7XG4gICAgaWYgKGltbWVkaWF0ZSAhPT0gdm9pZCAwKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGB3YXRjaCgpIFwiaW1tZWRpYXRlXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlZXAgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcImRlZXBcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob25jZSAhPT0gdm9pZCAwKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGB3YXRjaCgpIFwib25jZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHdhcm5JbnZhbGlkU291cmNlID0gKHMpID0+IHtcbiAgICB3YXJuJDEoXG4gICAgICBgSW52YWxpZCB3YXRjaCBzb3VyY2U6IGAsXG4gICAgICBzLFxuICAgICAgYEEgd2F0Y2ggc291cmNlIGNhbiBvbmx5IGJlIGEgZ2V0dGVyL2VmZmVjdCBmdW5jdGlvbiwgYSByZWYsIGEgcmVhY3RpdmUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiB0aGVzZSB0eXBlcy5gXG4gICAgKTtcbiAgfTtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gIGNvbnN0IHJlYWN0aXZlR2V0dGVyID0gKHNvdXJjZTIpID0+IGRlZXAgPT09IHRydWUgPyBzb3VyY2UyIDogKFxuICAgIC8vIGZvciBkZWVwOiBmYWxzZSwgb25seSB0cmF2ZXJzZSByb290LWxldmVsIHByb3BlcnRpZXNcbiAgICB0cmF2ZXJzZShzb3VyY2UyLCBkZWVwID09PSBmYWxzZSA/IDEgOiB2b2lkIDApXG4gICk7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBmb3JjZVRyaWdnZXIgPSBmYWxzZTtcbiAgbGV0IGlzTXVsdGlTb3VyY2UgPSBmYWxzZTtcbiAgaWYgKGlzUmVmKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiBzb3VyY2UudmFsdWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gaXNTaGFsbG93JDEoc291cmNlKTtcbiAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKHNvdXJjZSkpIHtcbiAgICBnZXR0ZXIgPSAoKSA9PiByZWFjdGl2ZUdldHRlcihzb3VyY2UpO1xuICAgIGZvcmNlVHJpZ2dlciA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShzb3VyY2UpKSB7XG4gICAgaXNNdWx0aVNvdXJjZSA9IHRydWU7XG4gICAgZm9yY2VUcmlnZ2VyID0gc291cmNlLnNvbWUoKHMpID0+IGlzUmVhY3RpdmUocykgfHwgaXNTaGFsbG93JDEocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVHZXR0ZXIocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhzLCBpbnN0YW5jZSwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oc291cmNlKSkge1xuICAgIGlmIChjYikge1xuICAgICAgZ2V0dGVyID0gKCkgPT4gY2FsbFdpdGhFcnJvckhhbmRsaW5nKHNvdXJjZSwgaW5zdGFuY2UsIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZXR0ZXIgPSAoKSA9PiB7XG4gICAgICAgIGlmIChjbGVhbnVwKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMyxcbiAgICAgICAgICBbb25DbGVhbnVwXVxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gTk9PUDtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gIH1cbiAgaWYgKGNiICYmIGRlZXApIHtcbiAgICBjb25zdCBiYXNlR2V0dGVyID0gZ2V0dGVyO1xuICAgIGdldHRlciA9ICgpID0+IHRyYXZlcnNlKGJhc2VHZXR0ZXIoKSk7XG4gIH1cbiAgbGV0IGNsZWFudXA7XG4gIGxldCBvbkNsZWFudXAgPSAoZm4pID0+IHtcbiAgICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9ICgpID0+IHtcbiAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIDQpO1xuICAgICAgY2xlYW51cCA9IGVmZmVjdC5vblN0b3AgPSB2b2lkIDA7XG4gICAgfTtcbiAgfTtcbiAgbGV0IHNzckNsZWFudXA7XG4gIGlmIChpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICBvbkNsZWFudXAgPSBOT09QO1xuICAgIGlmICghY2IpIHtcbiAgICAgIGdldHRlcigpO1xuICAgIH0gZWxzZSBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhjYiwgaW5zdGFuY2UsIDMsIFtcbiAgICAgICAgZ2V0dGVyKCksXG4gICAgICAgIGlzTXVsdGlTb3VyY2UgPyBbXSA6IHZvaWQgMCxcbiAgICAgICAgb25DbGVhbnVwXG4gICAgICBdKTtcbiAgICB9XG4gICAgaWYgKGZsdXNoID09PSBcInN5bmNcIikge1xuICAgICAgY29uc3QgY3R4ID0gdXNlU1NSQ29udGV4dCgpO1xuICAgICAgc3NyQ2xlYW51cCA9IGN0eC5fX3dhdGNoZXJIYW5kbGVzIHx8IChjdHguX193YXRjaGVySGFuZGxlcyA9IFtdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE5PT1A7XG4gICAgfVxuICB9XG4gIGxldCBvbGRWYWx1ZSA9IGlzTXVsdGlTb3VyY2UgPyBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCkuZmlsbChJTklUSUFMX1dBVENIRVJfVkFMVUUpIDogSU5JVElBTF9XQVRDSEVSX1ZBTFVFO1xuICBjb25zdCBqb2IgPSAoKSA9PiB7XG4gICAgaWYgKCFlZmZlY3QuYWN0aXZlIHx8ICFlZmZlY3QuZGlydHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNiKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICAgIGlmIChkZWVwIHx8IGZvcmNlVHJpZ2dlciB8fCAoaXNNdWx0aVNvdXJjZSA/IG5ld1ZhbHVlLnNvbWUoKHYsIGkpID0+IGhhc0NoYW5nZWQodiwgb2xkVmFsdWVbaV0pKSA6IGhhc0NoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKSkgfHwgZmFsc2UpIHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoY2IsIGluc3RhbmNlLCAzLCBbXG4gICAgICAgICAgbmV3VmFsdWUsXG4gICAgICAgICAgLy8gcGFzcyB1bmRlZmluZWQgYXMgdGhlIG9sZCB2YWx1ZSB3aGVuIGl0J3MgY2hhbmdlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gdm9pZCAwIDogaXNNdWx0aVNvdXJjZSAmJiBvbGRWYWx1ZVswXSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gW10gOiBvbGRWYWx1ZSxcbiAgICAgICAgICBvbkNsZWFudXBcbiAgICAgICAgXSk7XG4gICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH07XG4gIGpvYi5hbGxvd1JlY3Vyc2UgPSAhIWNiO1xuICBsZXQgc2NoZWR1bGVyO1xuICBpZiAoZmx1c2ggPT09IFwic3luY1wiKSB7XG4gICAgc2NoZWR1bGVyID0gam9iO1xuICB9IGVsc2UgaWYgKGZsdXNoID09PSBcInBvc3RcIikge1xuICAgIHNjaGVkdWxlciA9ICgpID0+IHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgfSBlbHNlIHtcbiAgICBqb2IucHJlID0gdHJ1ZTtcbiAgICBpZiAoaW5zdGFuY2UpXG4gICAgICBqb2IuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgc2NoZWR1bGVyID0gKCkgPT4gcXVldWVKb2Ioam9iKTtcbiAgfVxuICBjb25zdCBlZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoZ2V0dGVyLCBOT09QLCBzY2hlZHVsZXIpO1xuICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRTY29wZSgpO1xuICBjb25zdCB1bndhdGNoID0gKCkgPT4ge1xuICAgIGVmZmVjdC5zdG9wKCk7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICByZW1vdmUoc2NvcGUuZWZmZWN0cywgZWZmZWN0KTtcbiAgICB9XG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZWZmZWN0Lm9uVHJhY2sgPSBvblRyYWNrO1xuICAgIGVmZmVjdC5vblRyaWdnZXIgPSBvblRyaWdnZXI7XG4gIH1cbiAgaWYgKGNiKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgam9iKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9sZFZhbHVlID0gZWZmZWN0LnJ1bigpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChmbHVzaCA9PT0gXCJwb3N0XCIpIHtcbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICBlZmZlY3QucnVuLmJpbmQoZWZmZWN0KSxcbiAgICAgIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBlZmZlY3QucnVuKCk7XG4gIH1cbiAgaWYgKHNzckNsZWFudXApXG4gICAgc3NyQ2xlYW51cC5wdXNoKHVud2F0Y2gpO1xuICByZXR1cm4gdW53YXRjaDtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgcmVzZXQoKTtcbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cbmZ1bmN0aW9uIHRyYXZlcnNlKHZhbHVlLCBkZXB0aCwgY3VycmVudERlcHRoID0gMCwgc2Vlbikge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVtcIl9fdl9za2lwXCJdKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChkZXB0aCAmJiBkZXB0aCA+IDApIHtcbiAgICBpZiAoY3VycmVudERlcHRoID49IGRlcHRoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGN1cnJlbnREZXB0aCsrO1xuICB9XG4gIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgc2Vlbi5hZGQodmFsdWUpO1xuICBpZiAoaXNSZWYodmFsdWUpKSB7XG4gICAgdHJhdmVyc2UodmFsdWUudmFsdWUsIGRlcHRoLCBjdXJyZW50RGVwdGgsIHNlZW4pO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdHJhdmVyc2UodmFsdWVbaV0sIGRlcHRoLCBjdXJyZW50RGVwdGgsIHNlZW4pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkgfHwgaXNNYXAodmFsdWUpKSB7XG4gICAgdmFsdWUuZm9yRWFjaCgodikgPT4ge1xuICAgICAgdHJhdmVyc2UodiwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgdHJhdmVyc2UodmFsdWVba2V5XSwgZGVwdGgsIGN1cnJlbnREZXB0aCwgc2Vlbik7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpIHtcbiAgaWYgKGlzQnVpbHRJbkRpcmVjdGl2ZShuYW1lKSkge1xuICAgIHdhcm4kMShcIkRvIG5vdCB1c2UgYnVpbHQtaW4gZGlyZWN0aXZlIGlkcyBhcyBjdXN0b20gZGlyZWN0aXZlIGlkOiBcIiArIG5hbWUpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGlyZWN0aXZlcyh2bm9kZSwgZGlyZWN0aXZlcykge1xuICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID09PSBudWxsKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYHdpdGhEaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHJlbmRlciBmdW5jdGlvbnMuYCk7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0RXhwb3NlUHJveHkoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucHJveHk7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycyB8fCAodm5vZGUuZGlycyA9IFtdKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IFtkaXIsIHZhbHVlLCBhcmcsIG1vZGlmaWVycyA9IEVNUFRZX09CSl0gPSBkaXJlY3RpdmVzW2ldO1xuICAgIGlmIChkaXIpIHtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGRpcikpIHtcbiAgICAgICAgZGlyID0ge1xuICAgICAgICAgIG1vdW50ZWQ6IGRpcixcbiAgICAgICAgICB1cGRhdGVkOiBkaXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChkaXIuZGVlcCkge1xuICAgICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBiaW5kaW5ncy5wdXNoKHtcbiAgICAgICAgZGlyLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG9sZFZhbHVlOiB2b2lkIDAsXG4gICAgICAgIGFyZyxcbiAgICAgICAgbW9kaWZpZXJzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZub2RlO1xufVxuZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgcHJldlZOb2RlLCBpbnN0YW5jZSwgbmFtZSkge1xuICBjb25zdCBiaW5kaW5ncyA9IHZub2RlLmRpcnM7XG4gIGNvbnN0IG9sZEJpbmRpbmdzID0gcHJldlZOb2RlICYmIHByZXZWTm9kZS5kaXJzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmRpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgIGlmIChvbGRCaW5kaW5ncykge1xuICAgICAgYmluZGluZy5vbGRWYWx1ZSA9IG9sZEJpbmRpbmdzW2ldLnZhbHVlO1xuICAgIH1cbiAgICBsZXQgaG9vayA9IGJpbmRpbmcuZGlyW25hbWVdO1xuICAgIGlmIChob29rKSB7XG4gICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgOCwgW1xuICAgICAgICB2bm9kZS5lbCxcbiAgICAgICAgYmluZGluZyxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIHByZXZWTm9kZVxuICAgICAgXSk7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxlYXZlQ2JLZXkgPSBTeW1ib2woXCJfbGVhdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uSW1wbCA9IHtcbiAgbmFtZTogYEJhc2VUcmFuc2l0aW9uYCxcbiAgcHJvcHM6IEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2VHJhbnNpdGlvbktleTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuWzBdO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjaGlsZHJlbikge1xuICAgICAgICAgIGlmIChjLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGhhc0ZvdW5kKSB7XG4gICAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgICBcIjx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQgb3IgY29tcG9uZW50LiBVc2UgPHRyYW5zaXRpb24tZ3JvdXA+IGZvciBsaXN0cy5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoaWxkID0gYztcbiAgICAgICAgICAgIGhhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSlcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IHsgbW9kZSB9ID0gcmF3UHJvcHM7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtb2RlICYmIG1vZGUgIT09IFwiaW4tb3V0XCIgJiYgbW9kZSAhPT0gXCJvdXQtaW5cIiAmJiBtb2RlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgICB3YXJuJDEoYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXJDaGlsZCA9IGdldEtlZXBBbGl2ZUNoaWxkKGNoaWxkKTtcbiAgICAgIGlmICghaW5uZXJDaGlsZCkge1xuICAgICAgICByZXR1cm4gZW1wdHlQbGFjZWhvbGRlcihjaGlsZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBlbnRlckhvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgaW5uZXJDaGlsZCxcbiAgICAgICAgcmF3UHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBpbnN0YW5jZVxuICAgICAgKTtcbiAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhpbm5lckNoaWxkLCBlbnRlckhvb2tzKTtcbiAgICAgIGNvbnN0IG9sZENoaWxkID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgICAgIGNvbnN0IG9sZElubmVyQ2hpbGQgPSBvbGRDaGlsZCAmJiBnZXRLZWVwQWxpdmVDaGlsZChvbGRDaGlsZCk7XG4gICAgICBsZXQgdHJhbnNpdGlvbktleUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHsgZ2V0VHJhbnNpdGlvbktleSB9ID0gaW5uZXJDaGlsZC50eXBlO1xuICAgICAgaWYgKGdldFRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0VHJhbnNpdGlvbktleSgpO1xuICAgICAgICBpZiAocHJldlRyYW5zaXRpb25LZXkgPT09IHZvaWQgMCkge1xuICAgICAgICAgIHByZXZUcmFuc2l0aW9uS2V5ID0ga2V5O1xuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gcHJldlRyYW5zaXRpb25LZXkpIHtcbiAgICAgICAgICBwcmV2VHJhbnNpdGlvbktleSA9IGtleTtcbiAgICAgICAgICB0cmFuc2l0aW9uS2V5Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChvbGRJbm5lckNoaWxkICYmIG9sZElubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCAmJiAoIWlzU2FtZVZOb2RlVHlwZShpbm5lckNoaWxkLCBvbGRJbm5lckNoaWxkKSB8fCB0cmFuc2l0aW9uS2V5Q2hhbmdlZCkpIHtcbiAgICAgICAgY29uc3QgbGVhdmluZ0hvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICBvbGRJbm5lckNoaWxkLFxuICAgICAgICAgIHJhd1Byb3BzLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICk7XG4gICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhvbGRJbm5lckNoaWxkLCBsZWF2aW5nSG9va3MpO1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJvdXQtaW5cIikge1xuICAgICAgICAgIHN0YXRlLmlzTGVhdmluZyA9IHRydWU7XG4gICAgICAgICAgbGVhdmluZ0hvb2tzLmFmdGVyTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZS51cGRhdGUuYWN0aXZlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9IGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEJhc2VUcmFuc2l0aW9uID0gQmFzZVRyYW5zaXRpb25JbXBsO1xuZnVuY3Rpb24gZ2V0TGVhdmluZ05vZGVzRm9yVHlwZShzdGF0ZSwgdm5vZGUpIHtcbiAgY29uc3QgeyBsZWF2aW5nVk5vZGVzIH0gPSBzdGF0ZTtcbiAgbGV0IGxlYXZpbmdWTm9kZXNDYWNoZSA9IGxlYXZpbmdWTm9kZXMuZ2V0KHZub2RlLnR5cGUpO1xuICBpZiAoIWxlYXZpbmdWTm9kZXNDYWNoZSkge1xuICAgIGxlYXZpbmdWTm9kZXNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxlYXZpbmdWTm9kZXMuc2V0KHZub2RlLnR5cGUsIGxlYXZpbmdWTm9kZXNDYWNoZSk7XG4gIH1cbiAgcmV0dXJuIGxlYXZpbmdWTm9kZXNDYWNoZTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVUcmFuc2l0aW9uSG9va3Modm5vZGUsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIGFwcGVhcixcbiAgICBtb2RlLFxuICAgIHBlcnNpc3RlZCA9IGZhbHNlLFxuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkFmdGVyRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUxlYXZlLFxuICAgIG9uTGVhdmUsXG4gICAgb25BZnRlckxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIsXG4gICAgb25BcHBlYXIsXG4gICAgb25BZnRlckFwcGVhcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGtleSA9IFN0cmluZyh2bm9kZS5rZXkpO1xuICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSk7XG4gIGNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBob29rICYmIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaG9vayxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgOSxcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9O1xuICBjb25zdCBjYWxsQXN5bmNIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBjb25zdCBkb25lID0gYXJnc1sxXTtcbiAgICBjYWxsSG9vayhob29rLCBhcmdzKTtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaWYgKGhvb2suZXZlcnkoKGhvb2syKSA9PiBob29rMi5sZW5ndGggPD0gMSkpXG4gICAgICAgIGRvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGhvb2subGVuZ3RoIDw9IDEpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhvb2tzID0ge1xuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkLFxuICAgIGJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uQmVmb3JlRW50ZXI7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQmVmb3JlQXBwZWFyIHx8IG9uQmVmb3JlRW50ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgZWxbbGVhdmVDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVhdmluZ1ZOb2RlID0gbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleV07XG4gICAgICBpZiAobGVhdmluZ1ZOb2RlICYmIGlzU2FtZVZOb2RlVHlwZSh2bm9kZSwgbGVhdmluZ1ZOb2RlKSAmJiBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgbGVhdmluZ1ZOb2RlLmVsW2xlYXZlQ2JLZXldKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhob29rLCBbZWxdKTtcbiAgICB9LFxuICAgIGVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uRW50ZXI7XG4gICAgICBsZXQgYWZ0ZXJIb29rID0gb25BZnRlckVudGVyO1xuICAgICAgbGV0IGNhbmNlbEhvb2sgPSBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgaWYgKCFzdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICAgIGhvb2sgPSBvbkFwcGVhciB8fCBvbkVudGVyO1xuICAgICAgICAgIGFmdGVySG9vayA9IG9uQWZ0ZXJBcHBlYXIgfHwgb25BZnRlckVudGVyO1xuICAgICAgICAgIGNhbmNlbEhvb2sgPSBvbkFwcGVhckNhbmNlbGxlZCB8fCBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2VudGVyQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbGxIb29rKGNhbmNlbEhvb2ssIFtlbF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxIb29rKGFmdGVySG9vaywgW2VsXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhvb2tzLmRlbGF5ZWRMZWF2ZSkge1xuICAgICAgICAgIGhvb2tzLmRlbGF5ZWRMZWF2ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsW2VudGVyQ2JLZXldID0gdm9pZCAwO1xuICAgICAgfTtcbiAgICAgIGlmIChob29rKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2soaG9vaywgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBsZWF2ZShlbCwgcmVtb3ZlKSB7XG4gICAgICBjb25zdCBrZXkyID0gU3RyaW5nKHZub2RlLmtleSk7XG4gICAgICBpZiAoZWxbZW50ZXJDYktleV0pIHtcbiAgICAgICAgZWxbZW50ZXJDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmlzVW5tb3VudGluZykge1xuICAgICAgICByZXR1cm4gcmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhvbkJlZm9yZUxlYXZlLCBbZWxdKTtcbiAgICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSBlbFtsZWF2ZUNiS2V5XSA9IChjYW5jZWxsZWQpID0+IHtcbiAgICAgICAgaWYgKGNhbGxlZClcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIHJlbW92ZSgpO1xuICAgICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbEhvb2sob25BZnRlckxlYXZlLCBbZWxdKTtcbiAgICAgICAgfVxuICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGxlYXZpbmdWTm9kZXNDYWNoZVtrZXkyXSA9PT0gdm5vZGUpIHtcbiAgICAgICAgICBkZWxldGUgbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID0gdm5vZGU7XG4gICAgICBpZiAob25MZWF2ZSkge1xuICAgICAgICBjYWxsQXN5bmNIb29rKG9uTGVhdmUsIFtlbCwgZG9uZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xvbmUodm5vZGUyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyh2bm9kZTIsIHByb3BzLCBzdGF0ZSwgaW5zdGFuY2UpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhvb2tzO1xufVxuZnVuY3Rpb24gZW1wdHlQbGFjZWhvbGRlcih2bm9kZSkge1xuICBpZiAoaXNLZWVwQWxpdmUodm5vZGUpKSB7XG4gICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IG51bGw7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRLZWVwQWxpdmVDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gaXNLZWVwQWxpdmUodm5vZGUpID8gKFxuICAgIC8vICM3MTIxIGVuc3VyZSBnZXQgdGhlIGNoaWxkIGNvbXBvbmVudCBzdWJ0cmVlIGluIGNhc2VcbiAgICAvLyBpdCdzIGJlZW4gcmVwbGFjZWQgZHVyaW5nIEhNUlxuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUuY29tcG9uZW50ID8gdm5vZGUuY29tcG9uZW50LnN1YlRyZWUgOiB2bm9kZS5jaGlsZHJlbiA/IHZub2RlLmNoaWxkcmVuWzBdIDogdm9pZCAwXG4gICkgOiB2bm9kZTtcbn1cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgaG9va3MpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYgJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlLCBob29rcyk7XG4gIH0gZWxzZSBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgdm5vZGUuc3NDb250ZW50LnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0NvbnRlbnQpO1xuICAgIHZub2RlLnNzRmFsbGJhY2sudHJhbnNpdGlvbiA9IGhvb2tzLmNsb25lKHZub2RlLnNzRmFsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHZub2RlLnRyYW5zaXRpb24gPSBob29rcztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKGNoaWxkcmVuLCBrZWVwQ29tbWVudCA9IGZhbHNlLCBwYXJlbnRLZXkpIHtcbiAgbGV0IHJldCA9IFtdO1xuICBsZXQga2V5ZWRGcmFnbWVudENvdW50ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGNvbnN0IGtleSA9IHBhcmVudEtleSA9PSBudWxsID8gY2hpbGQua2V5IDogU3RyaW5nKHBhcmVudEtleSkgKyBTdHJpbmcoY2hpbGQua2V5ICE9IG51bGwgPyBjaGlsZC5rZXkgOiBpKTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmIChjaGlsZC5wYXRjaEZsYWcgJiAxMjgpXG4gICAgICAgIGtleWVkRnJhZ21lbnRDb3VudCsrO1xuICAgICAgcmV0ID0gcmV0LmNvbmNhdChcbiAgICAgICAgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKGNoaWxkLmNoaWxkcmVuLCBrZWVwQ29tbWVudCwga2V5KVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGtlZXBDb21tZW50IHx8IGNoaWxkLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgIHJldC5wdXNoKGtleSAhPSBudWxsID8gY2xvbmVWTm9kZShjaGlsZCwgeyBrZXkgfSkgOiBjaGlsZCk7XG4gICAgfVxuICB9XG4gIGlmIChrZXllZEZyYWdtZW50Q291bnQgPiAxKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJldFtpXS5wYXRjaEZsYWcgPSAtMjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQ29tcG9uZW50KG9wdGlvbnMsIGV4dHJhT3B0aW9ucykge1xuICByZXR1cm4gaXNGdW5jdGlvbihvcHRpb25zKSA/IChcbiAgICAvLyAjODMyNjogZXh0ZW5kIGNhbGwgYW5kIG9wdGlvbnMubmFtZSBhY2Nlc3MgYXJlIGNvbnNpZGVyZWQgc2lkZS1lZmZlY3RzXG4gICAgLy8gYnkgUm9sbHVwLCBzbyB3ZSBoYXZlIHRvIHdyYXAgaXQgaW4gYSBwdXJlLWFubm90YXRlZCBJSUZFLlxuICAgIC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZXh0ZW5kKHsgbmFtZTogb3B0aW9ucy5uYW1lIH0sIGV4dHJhT3B0aW9ucywgeyBzZXR1cDogb3B0aW9ucyB9KSkoKVxuICApIDogb3B0aW9ucztcbn1cblxuY29uc3QgaXNBc3luY1dyYXBwZXIgPSAoaSkgPT4gISFpLnR5cGUuX19hc3luY0xvYWRlcjtcbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUFzeW5jQ29tcG9uZW50KHNvdXJjZSkge1xuICBpZiAoaXNGdW5jdGlvbihzb3VyY2UpKSB7XG4gICAgc291cmNlID0geyBsb2FkZXI6IHNvdXJjZSB9O1xuICB9XG4gIGNvbnN0IHtcbiAgICBsb2FkZXIsXG4gICAgbG9hZGluZ0NvbXBvbmVudCxcbiAgICBlcnJvckNvbXBvbmVudCxcbiAgICBkZWxheSA9IDIwMCxcbiAgICB0aW1lb3V0LFxuICAgIC8vIHVuZGVmaW5lZCA9IG5ldmVyIHRpbWVzIG91dFxuICAgIHN1c3BlbnNpYmxlID0gdHJ1ZSxcbiAgICBvbkVycm9yOiB1c2VyT25FcnJvclxuICB9ID0gc291cmNlO1xuICBsZXQgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICBsZXQgcmVzb2x2ZWRDb21wO1xuICBsZXQgcmV0cmllcyA9IDA7XG4gIGNvbnN0IHJldHJ5ID0gKCkgPT4ge1xuICAgIHJldHJpZXMrKztcbiAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgcmV0dXJuIGxvYWQoKTtcbiAgfTtcbiAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICBsZXQgdGhpc1JlcXVlc3Q7XG4gICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0IHx8ICh0aGlzUmVxdWVzdCA9IHBlbmRpbmdSZXF1ZXN0ID0gbG9hZGVyKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpO1xuICAgICAgaWYgKHVzZXJPbkVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlclJldHJ5ID0gKCkgPT4gcmVzb2x2ZShyZXRyeSgpKTtcbiAgICAgICAgICBjb25zdCB1c2VyRmFpbCA9ICgpID0+IHJlamVjdChlcnIpO1xuICAgICAgICAgIHVzZXJPbkVycm9yKGVyciwgdXNlclJldHJ5LCB1c2VyRmFpbCwgcmV0cmllcyArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KS50aGVuKChjb21wKSA9PiB7XG4gICAgICBpZiAodGhpc1JlcXVlc3QgIT09IHBlbmRpbmdSZXF1ZXN0ICYmIHBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjb21wKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wICYmIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSBcIk1vZHVsZVwiKSkge1xuICAgICAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tcCAmJiAhaXNPYmplY3QoY29tcCkgJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRDb21wID0gY29tcDtcbiAgICAgIHJldHVybiBjb21wO1xuICAgIH0pKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmluZUNvbXBvbmVudCh7XG4gICAgbmFtZTogXCJBc3luY0NvbXBvbmVudFdyYXBwZXJcIixcbiAgICBfX2FzeW5jTG9hZGVyOiBsb2FkLFxuICAgIGdldCBfX2FzeW5jUmVzb2x2ZWQoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRDb21wO1xuICAgIH0sXG4gICAgc2V0dXAoKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgICAgIGlmIChyZXNvbHZlZENvbXApIHtcbiAgICAgICAgcmV0dXJuICgpID0+IGNyZWF0ZUlubmVyQ29tcChyZXNvbHZlZENvbXAsIGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaGFuZGxlRXJyb3IoXG4gICAgICAgICAgZXJyLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIDEzLFxuICAgICAgICAgICFlcnJvckNvbXBvbmVudFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIGlmIChzdXNwZW5zaWJsZSAmJiBpbnN0YW5jZS5zdXNwZW5zZSB8fCBpc0luU1NSQ29tcG9uZW50U2V0dXApIHtcbiAgICAgICAgcmV0dXJuIGxvYWQoKS50aGVuKChjb21wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGNyZWF0ZUlubmVyQ29tcChjb21wLCBpbnN0YW5jZSk7XG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgICAgcmV0dXJuICgpID0+IGVycm9yQ29tcG9uZW50ID8gY3JlYXRlVk5vZGUoZXJyb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJcbiAgICAgICAgICB9KSA6IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgbG9hZGVkID0gcmVmKGZhbHNlKTtcbiAgICAgIGNvbnN0IGVycm9yID0gcmVmKCk7XG4gICAgICBjb25zdCBkZWxheWVkID0gcmVmKCEhZGVsYXkpO1xuICAgICAgaWYgKGRlbGF5KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGRlbGF5ZWQudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgfVxuICAgICAgaWYgKHRpbWVvdXQgIT0gbnVsbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWxvYWRlZC52YWx1ZSAmJiAhZXJyb3IudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYEFzeW5jIGNvbXBvbmVudCB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgICAgICBlcnJvci52YWx1ZSA9IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgbG9hZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICBsb2FkZWQudmFsdWUgPSB0cnVlO1xuICAgICAgICBpZiAoaW5zdGFuY2UucGFyZW50ICYmIGlzS2VlcEFsaXZlKGluc3RhbmNlLnBhcmVudC52bm9kZSkpIHtcbiAgICAgICAgICBpbnN0YW5jZS5wYXJlbnQuZWZmZWN0LmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICBxdWV1ZUpvYihpbnN0YW5jZS5wYXJlbnQudXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAobG9hZGVkLnZhbHVlICYmIHJlc29sdmVkQ29tcCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IudmFsdWUgJiYgZXJyb3JDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUoZXJyb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvYWRpbmdDb21wb25lbnQgJiYgIWRlbGF5ZWQudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUobG9hZGluZ0NvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUlubmVyQ29tcChjb21wLCBwYXJlbnQpIHtcbiAgY29uc3QgeyByZWY6IHJlZjIsIHByb3BzLCBjaGlsZHJlbiwgY2UgfSA9IHBhcmVudC52bm9kZTtcbiAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShjb21wLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5yZWYgPSByZWYyO1xuICB2bm9kZS5jZSA9IGNlO1xuICBkZWxldGUgcGFyZW50LnZub2RlLmNlO1xuICByZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IGlzS2VlcEFsaXZlID0gKHZub2RlKSA9PiB2bm9kZS50eXBlLl9faXNLZWVwQWxpdmU7XG5jb25zdCBLZWVwQWxpdmVJbXBsID0ge1xuICBuYW1lOiBgS2VlcEFsaXZlYCxcbiAgLy8gTWFya2VyIGZvciBzcGVjaWFsIGhhbmRsaW5nIGluc2lkZSB0aGUgcmVuZGVyZXIuIFdlIGFyZSBub3QgdXNpbmcgYSA9PT1cbiAgLy8gY2hlY2sgZGlyZWN0bHkgb24gS2VlcEFsaXZlIGluIHRoZSByZW5kZXJlciwgYmVjYXVzZSBpbXBvcnRpbmcgaXQgZGlyZWN0bHlcbiAgLy8gd291bGQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHRyZWUtc2hha2VuLlxuICBfX2lzS2VlcEFsaXZlOiB0cnVlLFxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIGV4Y2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzaGFyZWRDb250ZXh0ID0gaW5zdGFuY2UuY3R4O1xuICAgIGlmICghc2hhcmVkQ29udGV4dC5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSA/IGNoaWxkcmVuWzBdIDogY2hpbGRyZW47XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3Qga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGV0IGN1cnJlbnQgPSBudWxsO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaW5zdGFuY2UuX192X2NhY2hlID0gY2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFN1c3BlbnNlID0gaW5zdGFuY2Uuc3VzcGVuc2U7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyZXI6IHtcbiAgICAgICAgcDogcGF0Y2gsXG4gICAgICAgIG06IG1vdmUsXG4gICAgICAgIHVtOiBfdW5tb3VudCxcbiAgICAgICAgbzogeyBjcmVhdGVFbGVtZW50IH1cbiAgICAgIH1cbiAgICB9ID0gc2hhcmVkQ29udGV4dDtcbiAgICBjb25zdCBzdG9yYWdlQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBzaGFyZWRDb250ZXh0LmFjdGl2YXRlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCAwLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgaW5zdGFuY2UyLnZub2RlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGluc3RhbmNlMixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UyLmEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZU1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICBkZXZ0b29sc0NvbXBvbmVudEFkZGVkKGluc3RhbmNlMik7XG4gICAgICB9XG4gICAgfTtcbiAgICBzaGFyZWRDb250ZXh0LmRlYWN0aXZhdGUgPSAodm5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIHN0b3JhZ2VDb250YWluZXIsIG51bGwsIDEsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChpbnN0YW5jZTIuZGEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuZGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZub2RlSG9vayA9IHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLm9uVm5vZGVVbm1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UyLmlzRGVhY3RpdmF0ZWQgPSB0cnVlO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgIGRldnRvb2xzQ29tcG9uZW50QWRkZWQoaW5zdGFuY2UyKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHVubW91bnQodm5vZGUpIHtcbiAgICAgIHJlc2V0U2hhcGVGbGFnKHZub2RlKTtcbiAgICAgIF91bm1vdW50KHZub2RlLCBpbnN0YW5jZSwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlKGZpbHRlcikge1xuICAgICAgY2FjaGUuZm9yRWFjaCgodm5vZGUsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh2bm9kZS50eXBlKTtcbiAgICAgICAgaWYgKG5hbWUgJiYgKCFmaWx0ZXIgfHwgIWZpbHRlcihuYW1lKSkpIHtcbiAgICAgICAgICBwcnVuZUNhY2hlRW50cnkoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGVFbnRyeShrZXkpIHtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKCFjdXJyZW50IHx8ICFpc1NhbWVWTm9kZVR5cGUoY2FjaGVkLCBjdXJyZW50KSkge1xuICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgcmVzZXRTaGFwZUZsYWcoY3VycmVudCk7XG4gICAgICB9XG4gICAgICBjYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIHdhdGNoKFxuICAgICAgKCkgPT4gW3Byb3BzLmluY2x1ZGUsIHByb3BzLmV4Y2x1ZGVdLFxuICAgICAgKFtpbmNsdWRlLCBleGNsdWRlXSkgPT4ge1xuICAgICAgICBpbmNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+IG1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpO1xuICAgICAgICBleGNsdWRlICYmIHBydW5lQ2FjaGUoKG5hbWUpID0+ICFtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKTtcbiAgICAgIH0sXG4gICAgICAvLyBwcnVuZSBwb3N0LXJlbmRlciBhZnRlciBgY3VycmVudGAgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgeyBmbHVzaDogXCJwb3N0XCIsIGRlZXA6IHRydWUgfVxuICAgICk7XG4gICAgbGV0IHBlbmRpbmdDYWNoZUtleSA9IG51bGw7XG4gICAgY29uc3QgY2FjaGVTdWJ0cmVlID0gKCkgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdDYWNoZUtleSAhPSBudWxsKSB7XG4gICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSkpO1xuICAgICAgfVxuICAgIH07XG4gICAgb25Nb3VudGVkKGNhY2hlU3VidHJlZSk7XG4gICAgb25VcGRhdGVkKGNhY2hlU3VidHJlZSk7XG4gICAgb25CZWZvcmVVbm1vdW50KCgpID0+IHtcbiAgICAgIGNhY2hlLmZvckVhY2goKGNhY2hlZCkgPT4ge1xuICAgICAgICBjb25zdCB7IHN1YlRyZWUsIHN1c3BlbnNlIH0gPSBpbnN0YW5jZTtcbiAgICAgICAgY29uc3Qgdm5vZGUgPSBnZXRJbm5lckNoaWxkKHN1YlRyZWUpO1xuICAgICAgICBpZiAoY2FjaGVkLnR5cGUgPT09IHZub2RlLnR5cGUgJiYgY2FjaGVkLmtleSA9PT0gdm5vZGUua2V5KSB7XG4gICAgICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgICAgIGNvbnN0IGRhID0gdm5vZGUuY29tcG9uZW50LmRhO1xuICAgICAgICAgIGRhICYmIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChkYSwgc3VzcGVuc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB1bm1vdW50KGNhY2hlZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0gbnVsbDtcbiAgICAgIGlmICghc2xvdHMuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgY29uc3QgcmF3Vk5vZGUgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKGBLZWVwQWxpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgY29tcG9uZW50IGNoaWxkLmApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fCAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQpICYmICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgbGV0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChyYXdWTm9kZSk7XG4gICAgICBjb25zdCBjb21wID0gdm5vZGUudHlwZTtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBpc0FzeW5jV3JhcHBlcih2bm9kZSkgPyB2bm9kZS50eXBlLl9fYXN5bmNSZXNvbHZlZCB8fCB7fSA6IGNvbXBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGluY2x1ZGUsIGV4Y2x1ZGUsIG1heCB9ID0gcHJvcHM7XG4gICAgICBpZiAoaW5jbHVkZSAmJiAoIW5hbWUgfHwgIW1hdGNoZXMoaW5jbHVkZSwgbmFtZSkpIHx8IGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKSB7XG4gICAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gdm5vZGUua2V5ID09IG51bGwgPyBjb21wIDogdm5vZGUua2V5O1xuICAgICAgY29uc3QgY2FjaGVkVk5vZGUgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmICh2bm9kZS5lbCkge1xuICAgICAgICB2bm9kZSA9IGNsb25lVk5vZGUodm5vZGUpO1xuICAgICAgICBpZiAocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgcmF3Vk5vZGUuc3NDb250ZW50ID0gdm5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBlbmRpbmdDYWNoZUtleSA9IGtleTtcbiAgICAgIGlmIChjYWNoZWRWTm9kZSkge1xuICAgICAgICB2bm9kZS5lbCA9IGNhY2hlZFZOb2RlLmVsO1xuICAgICAgICB2bm9kZS5jb21wb25lbnQgPSBjYWNoZWRWTm9kZS5jb21wb25lbnQ7XG4gICAgICAgIGlmICh2bm9kZS50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKHZub2RlLCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgfD0gNTEyO1xuICAgICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAga2V5cy5hZGQoa2V5KTtcbiAgICAgICAgaWYgKG1heCAmJiBrZXlzLnNpemUgPiBwYXJzZUludChtYXgsIDEwKSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShrZXlzLnZhbHVlcygpLm5leHQoKS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSAyNTY7XG4gICAgICBjdXJyZW50ID0gdm5vZGU7XG4gICAgICByZXR1cm4gaXNTdXNwZW5zZShyYXdWTm9kZS50eXBlKSA/IHJhd1ZOb2RlIDogdm5vZGU7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IEtlZXBBbGl2ZSA9IEtlZXBBbGl2ZUltcGw7XG5mdW5jdGlvbiBtYXRjaGVzKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKGlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zb21lKChwKSA9PiBtYXRjaGVzKHAsIG5hbWUpKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZyhwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNwbGl0KFwiLFwiKS5pbmNsdWRlcyhuYW1lKTtcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImRhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgdHlwZSwgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fCAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQuaXNEZWFjdGl2YXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBob29rKCk7XG4gIH0pO1xuICBpbmplY3RIb29rKHR5cGUsIHdyYXBwZWRIb29rLCB0YXJnZXQpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQucGFyZW50KSB7XG4gICAgICBpZiAoaXNLZWVwQWxpdmUoY3VycmVudC5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgIGluamVjdFRvS2VlcEFsaXZlUm9vdCh3cmFwcGVkSG9vaywgdHlwZSwgdGFyZ2V0LCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdFRvS2VlcEFsaXZlUm9vdChob29rLCB0eXBlLCB0YXJnZXQsIGtlZXBBbGl2ZVJvb3QpIHtcbiAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RIb29rKFxuICAgIHR5cGUsXG4gICAgaG9vayxcbiAgICBrZWVwQWxpdmVSb290LFxuICAgIHRydWVcbiAgICAvKiBwcmVwZW5kICovXG4gICk7XG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICByZW1vdmUoa2VlcEFsaXZlUm9vdFt0eXBlXSwgaW5qZWN0ZWQpO1xuICB9LCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVzZXRTaGFwZUZsYWcodm5vZGUpIHtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH4yNTY7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+NTEyO1xufVxuZnVuY3Rpb24gZ2V0SW5uZXJDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4ID8gdm5vZGUuc3NDb250ZW50IDogdm5vZGU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEhvb2sodHlwZSwgaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGFyZ2V0W3R5cGVdIHx8ICh0YXJnZXRbdHlwZV0gPSBbXSk7XG4gICAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2VoIHx8IChob29rLl9fd2VoID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0YXJnZXQuaXNVbm1vdW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGF1c2VUcmFja2luZygpO1xuICAgICAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGFyZ2V0KTtcbiAgICAgIGNvbnN0IHJlcyA9IGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIHRhcmdldCwgdHlwZSwgYXJncyk7XG4gICAgICByZXNldCgpO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbiAgICBpZiAocHJlcGVuZCkge1xuICAgICAgaG9va3MudW5zaGlmdCh3cmFwcGVkSG9vayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhvb2tzLnB1c2god3JhcHBlZEhvb2spO1xuICAgIH1cbiAgICByZXR1cm4gd3JhcHBlZEhvb2s7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGNvbnN0IGFwaU5hbWUgPSB0b0hhbmRsZXJLZXkoRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdLnJlcGxhY2UoLyBob29rJC8sIFwiXCIpKTtcbiAgICB3YXJuJDEoXG4gICAgICBgJHthcGlOYW1lfSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC4gTGlmZWN5Y2xlIGluamVjdGlvbiBBUElzIGNhbiBvbmx5IGJlIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiBvZiBzZXR1cCgpLmAgKyAoYCBJZiB5b3UgYXJlIHVzaW5nIGFzeW5jIHNldHVwKCksIG1ha2Ugc3VyZSB0byByZWdpc3RlciBsaWZlY3ljbGUgaG9va3MgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdCBzdGF0ZW1lbnQuYCApXG4gICAgKTtcbiAgfVxufVxuY29uc3QgY3JlYXRlSG9vayA9IChsaWZlY3ljbGUpID0+IChob29rLCB0YXJnZXQgPSBjdXJyZW50SW5zdGFuY2UpID0+IChcbiAgLy8gcG9zdC1jcmVhdGUgbGlmZWN5Y2xlIHJlZ2lzdHJhdGlvbnMgYXJlIG5vb3BzIGR1cmluZyBTU1IgKGV4Y2VwdCBmb3Igc2VydmVyUHJlZmV0Y2gpXG4gICghaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiKSAmJiBpbmplY3RIb29rKGxpZmVjeWNsZSwgKC4uLmFyZ3MpID0+IGhvb2soLi4uYXJncyksIHRhcmdldClcbik7XG5jb25zdCBvbkJlZm9yZU1vdW50ID0gY3JlYXRlSG9vayhcImJtXCIpO1xuY29uc3Qgb25Nb3VudGVkID0gY3JlYXRlSG9vayhcIm1cIik7XG5jb25zdCBvbkJlZm9yZVVwZGF0ZSA9IGNyZWF0ZUhvb2soXCJidVwiKTtcbmNvbnN0IG9uVXBkYXRlZCA9IGNyZWF0ZUhvb2soXCJ1XCIpO1xuY29uc3Qgb25CZWZvcmVVbm1vdW50ID0gY3JlYXRlSG9vayhcImJ1bVwiKTtcbmNvbnN0IG9uVW5tb3VudGVkID0gY3JlYXRlSG9vayhcInVtXCIpO1xuY29uc3Qgb25TZXJ2ZXJQcmVmZXRjaCA9IGNyZWF0ZUhvb2soXCJzcFwiKTtcbmNvbnN0IG9uUmVuZGVyVHJpZ2dlcmVkID0gY3JlYXRlSG9vayhcbiAgXCJydGdcIlxuKTtcbmNvbnN0IG9uUmVuZGVyVHJhY2tlZCA9IGNyZWF0ZUhvb2soXG4gIFwicnRjXCJcbik7XG5mdW5jdGlvbiBvbkVycm9yQ2FwdHVyZWQoaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGluamVjdEhvb2soXCJlY1wiLCBob29rLCB0YXJnZXQpO1xufVxuXG5mdW5jdGlvbiByZW5kZXJMaXN0KHNvdXJjZSwgcmVuZGVySXRlbSwgY2FjaGUsIGluZGV4KSB7XG4gIGxldCByZXQ7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlICYmIGNhY2hlW2luZGV4XTtcbiAgaWYgKGlzQXJyYXkoc291cmNlKSB8fCBpc1N0cmluZyhzb3VyY2UpKSB7XG4gICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gc291cmNlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2VbaV0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwibnVtYmVyXCIpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhTnVtYmVyLmlzSW50ZWdlcihzb3VyY2UpKSB7XG4gICAgICB3YXJuJDEoYFRoZSB2LWZvciByYW5nZSBleHBlY3QgYW4gaW50ZWdlciB2YWx1ZSBidXQgZ290ICR7c291cmNlfS5gKTtcbiAgICB9XG4gICAgcmV0ID0gbmV3IEFycmF5KHNvdXJjZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2U7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShpICsgMSwgaSwgdm9pZCAwLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSkge1xuICAgIGlmIChzb3VyY2VbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgICAgcmV0ID0gQXJyYXkuZnJvbShcbiAgICAgICAgc291cmNlLFxuICAgICAgICAoaXRlbSwgaSkgPT4gcmVuZGVySXRlbShpdGVtLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtpXSA9IHJlbmRlckl0ZW0oc291cmNlW2tleV0sIGtleSwgaSwgY2FjaGVkICYmIGNhY2hlZFtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlW2luZGV4XSA9IHJldDtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTbG90cyhzbG90cywgZHluYW1pY1Nsb3RzKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Nsb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc2xvdCA9IGR5bmFtaWNTbG90c1tpXTtcbiAgICBpZiAoaXNBcnJheShzbG90KSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzbG90Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHNsb3RzW3Nsb3Rbal0ubmFtZV0gPSBzbG90W2pdLmZuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2xvdCkge1xuICAgICAgc2xvdHNbc2xvdC5uYW1lXSA9IHNsb3Qua2V5ID8gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgcmVzID0gc2xvdC5mbiguLi5hcmdzKTtcbiAgICAgICAgaWYgKHJlcylcbiAgICAgICAgICByZXMua2V5ID0gc2xvdC5rZXk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IDogc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTbG90KHNsb3RzLCBuYW1lLCBwcm9wcyA9IHt9LCBmYWxsYmFjaywgbm9TbG90dGVkKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UuaXNDRSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50ICYmIGlzQXN5bmNXcmFwcGVyKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5wYXJlbnQuaXNDRSkge1xuICAgIGlmIChuYW1lICE9PSBcImRlZmF1bHRcIilcbiAgICAgIHByb3BzLm5hbWUgPSBuYW1lO1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShcInNsb3RcIiwgcHJvcHMsIGZhbGxiYWNrICYmIGZhbGxiYWNrKCkpO1xuICB9XG4gIGxldCBzbG90ID0gc2xvdHNbbmFtZV07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNsb3QgJiYgc2xvdC5sZW5ndGggPiAxKSB7XG4gICAgd2FybiQxKFxuICAgICAgYFNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuYFxuICAgICk7XG4gICAgc2xvdCA9ICgpID0+IFtdO1xuICB9XG4gIGlmIChzbG90ICYmIHNsb3QuX2MpIHtcbiAgICBzbG90Ll9kID0gZmFsc2U7XG4gIH1cbiAgb3BlbkJsb2NrKCk7XG4gIGNvbnN0IHZhbGlkU2xvdENvbnRlbnQgPSBzbG90ICYmIGVuc3VyZVZhbGlkVk5vZGUoc2xvdChwcm9wcykpO1xuICBjb25zdCByZW5kZXJlZCA9IGNyZWF0ZUJsb2NrKFxuICAgIEZyYWdtZW50LFxuICAgIHtcbiAgICAgIGtleTogcHJvcHMua2V5IHx8IC8vIHNsb3QgY29udGVudCBhcnJheSBvZiBhIGR5bmFtaWMgY29uZGl0aW9uYWwgc2xvdCBtYXkgaGF2ZSBhIGJyYW5jaFxuICAgICAgLy8ga2V5IGF0dGFjaGVkIGluIHRoZSBgY3JlYXRlU2xvdHNgIGhlbHBlciwgcmVzcGVjdCB0aGF0XG4gICAgICB2YWxpZFNsb3RDb250ZW50ICYmIHZhbGlkU2xvdENvbnRlbnQua2V5IHx8IGBfJHtuYW1lfWBcbiAgICB9LFxuICAgIHZhbGlkU2xvdENvbnRlbnQgfHwgKGZhbGxiYWNrID8gZmFsbGJhY2soKSA6IFtdKSxcbiAgICB2YWxpZFNsb3RDb250ZW50ICYmIHNsb3RzLl8gPT09IDEgPyA2NCA6IC0yXG4gICk7XG4gIGlmICghbm9TbG90dGVkICYmIHJlbmRlcmVkLnNjb3BlSWQpIHtcbiAgICByZW5kZXJlZC5zbG90U2NvcGVJZHMgPSBbcmVuZGVyZWQuc2NvcGVJZCArIFwiLXNcIl07XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZW5kZXJlZDtcbn1cbmZ1bmN0aW9uIGVuc3VyZVZhbGlkVk5vZGUodm5vZGVzKSB7XG4gIHJldHVybiB2bm9kZXMuc29tZSgoY2hpbGQpID0+IHtcbiAgICBpZiAoIWlzVk5vZGUoY2hpbGQpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IENvbW1lbnQpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50ICYmICFlbnN1cmVWYWxpZFZOb2RlKGNoaWxkLmNoaWxkcmVuKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkgPyB2bm9kZXMgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0b0hhbmRsZXJzKG9iaiwgcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkpIHtcbiAgY29uc3QgcmV0ID0ge307XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc09iamVjdChvYmopKSB7XG4gICAgd2FybiQxKGB2LW9uIHdpdGggbm8gYXJndW1lbnQgZXhwZWN0cyBhbiBvYmplY3QgdmFsdWUuYCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICByZXRbcHJlc2VydmVDYXNlSWZOZWNlc3NhcnkgJiYgL1tBLVpdLy50ZXN0KGtleSkgPyBgb246JHtrZXl9YCA6IHRvSGFuZGxlcktleShrZXkpXSA9IG9ialtrZXldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmNvbnN0IGdldFB1YmxpY0luc3RhbmNlID0gKGkpID0+IHtcbiAgaWYgKCFpKVxuICAgIHJldHVybiBudWxsO1xuICBpZiAoaXNTdGF0ZWZ1bENvbXBvbmVudChpKSlcbiAgICByZXR1cm4gZ2V0RXhwb3NlUHJveHkoaSkgfHwgaS5wcm94eTtcbiAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGkucGFyZW50KTtcbn07XG5jb25zdCBwdWJsaWNQcm9wZXJ0aWVzTWFwID0gKFxuICAvLyBNb3ZlIFBVUkUgbWFya2VyIHRvIG5ldyBsaW5lIHRvIHdvcmthcm91bmQgY29tcGlsZXIgZGlzY2FyZGluZyBpdFxuICAvLyBkdWUgdG8gdHlwZSBhbm5vdGF0aW9uXG4gIC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHtcbiAgICAkOiAoaSkgPT4gaSxcbiAgICAkZWw6IChpKSA9PiBpLnZub2RlLmVsLFxuICAgICRkYXRhOiAoaSkgPT4gaS5kYXRhLFxuICAgICRwcm9wczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5wcm9wcykgOiBpLnByb3BzLFxuICAgICRhdHRyczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5hdHRycykgOiBpLmF0dHJzLFxuICAgICRzbG90czogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5zbG90cykgOiBpLnNsb3RzLFxuICAgICRyZWZzOiAoaSkgPT4gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpLnJlZnMpIDogaS5yZWZzLFxuICAgICRwYXJlbnQ6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCksXG4gICAgJHJvb3Q6IChpKSA9PiBnZXRQdWJsaWNJbnN0YW5jZShpLnJvb3QpLFxuICAgICRlbWl0OiAoaSkgPT4gaS5lbWl0LFxuICAgICRvcHRpb25zOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IHJlc29sdmVNZXJnZWRPcHRpb25zKGkpIDogaS50eXBlLFxuICAgICRmb3JjZVVwZGF0ZTogKGkpID0+IGkuZiB8fCAoaS5mID0gKCkgPT4ge1xuICAgICAgaS5lZmZlY3QuZGlydHkgPSB0cnVlO1xuICAgICAgcXVldWVKb2IoaS51cGRhdGUpO1xuICAgIH0pLFxuICAgICRuZXh0VGljazogKGkpID0+IGkubiB8fCAoaS5uID0gbmV4dFRpY2suYmluZChpLnByb3h5KSksXG4gICAgJHdhdGNoOiAoaSkgPT4gX19WVUVfT1BUSU9OU19BUElfXyA/IGluc3RhbmNlV2F0Y2guYmluZChpKSA6IE5PT1BcbiAgfSlcbik7XG5jb25zdCBpc1Jlc2VydmVkUHJlZml4ID0gKGtleSkgPT4ga2V5ID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJFwiO1xuY29uc3QgaGFzU2V0dXBCaW5kaW5nID0gKHN0YXRlLCBrZXkpID0+IHN0YXRlICE9PSBFTVBUWV9PQkogJiYgIXN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc3RhdGUsIGtleSk7XG5jb25zdCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMgPSB7XG4gIGdldCh7IF86IGluc3RhbmNlIH0sIGtleSkge1xuICAgIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlLCBkYXRhLCBwcm9wcywgYWNjZXNzQ2FjaGUsIHR5cGUsIGFwcENvbnRleHQgfSA9IGluc3RhbmNlO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSA9PT0gXCJfX2lzVnVlXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbm9ybWFsaXplZFByb3BzO1xuICAgIGlmIChrZXlbMF0gIT09IFwiJFwiKSB7XG4gICAgICBjb25zdCBuID0gYWNjZXNzQ2FjaGVba2V5XTtcbiAgICAgIGlmIChuICE9PSB2b2lkIDApIHtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAxIC8qIFNFVFVQICovOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgICAgICBjYXNlIDIgLyogREFUQSAqLzpcbiAgICAgICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICAgICAgY2FzZSA0IC8qIENPTlRFWFQgKi86XG4gICAgICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICAgICAgY2FzZSAzIC8qIFBST1BTICovOlxuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaGFzU2V0dXBCaW5kaW5nKHNldHVwU3RhdGUsIGtleSkpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDEgLyogU0VUVVAgKi87XG4gICAgICAgIHJldHVybiBzZXR1cFN0YXRlW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMiAvKiBEQVRBICovO1xuICAgICAgICByZXR1cm4gZGF0YVtrZXldO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgLy8gb25seSBjYWNoZSBvdGhlciBwcm9wZXJ0aWVzIHdoZW4gaW5zdGFuY2UgaGFzIGRlY2xhcmVkICh0aHVzIHN0YWJsZSlcbiAgICAgICAgLy8gcHJvcHNcbiAgICAgICAgKG5vcm1hbGl6ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzT3B0aW9uc1swXSkgJiYgaGFzT3duKG5vcm1hbGl6ZWRQcm9wcywga2V5KVxuICAgICAgKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAzIC8qIFBST1BTICovO1xuICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoY3R4ICE9PSBFTVBUWV9PQkogJiYgaGFzT3duKGN0eCwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgICByZXR1cm4gY3R4W2tleV07XG4gICAgICB9IGVsc2UgaWYgKCFfX1ZVRV9PUFRJT05TX0FQSV9fIHx8IHNob3VsZENhY2hlQWNjZXNzKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAwIC8qIE9USEVSICovO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwdWJsaWNHZXR0ZXIgPSBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV07XG4gICAgbGV0IGNzc01vZHVsZSwgZ2xvYmFsUHJvcGVydGllcztcbiAgICBpZiAocHVibGljR2V0dGVyKSB7XG4gICAgICBpZiAoa2V5ID09PSBcIiRhdHRyc1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBrZXkpO1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIiRzbG90c1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHB1YmxpY0dldHRlcihpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGNzcyBtb2R1bGUgKGluamVjdGVkIGJ5IHZ1ZS1sb2FkZXIpXG4gICAgICAoY3NzTW9kdWxlID0gdHlwZS5fX2Nzc01vZHVsZXMpICYmIChjc3NNb2R1bGUgPSBjc3NNb2R1bGVba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBjc3NNb2R1bGU7XG4gICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgZ2xvYmFsUHJvcGVydGllcyA9IGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGhhc093bihnbG9iYWxQcm9wZXJ0aWVzLCBrZXkpXG4gICAgKSB7XG4gICAgICB7XG4gICAgICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSAmJiAoIWlzU3RyaW5nKGtleSkgfHwgLy8gIzEwOTEgYXZvaWQgaW50ZXJuYWwgaXNSZWYvaXNWTm9kZSBjaGVja3Mgb24gY29tcG9uZW50IGluc3RhbmNlIGxlYWRpbmdcbiAgICAvLyB0byBpbmZpbml0ZSB3YXJuaW5nIGxvb3BcbiAgICBrZXkuaW5kZXhPZihcIl9fdlwiKSAhPT0gMCkpIHtcbiAgICAgIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCBjaGFyYWN0ZXIgKFwiJFwiIG9yIFwiX1wiKSBhbmQgaXMgbm90IHByb3hpZWQgb24gdGhlIHJlbmRlciBjb250ZXh0LmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UgPT09IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHNldCh7IF86IGluc3RhbmNlIH0sIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICBzZXR1cFN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgd2FybiQxKGBDYW5ub3QgbXV0YXRlIDxzY3JpcHQgc2V0dXA+IGJpbmRpbmcgXCIke2tleX1cIiBmcm9tIE9wdGlvbnMgQVBJLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGluc3RhbmNlLnByb3BzLCBrZXkpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHJvcCBcIiR7a2V5fVwiLiBQcm9wcyBhcmUgcmVhZG9ubHkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChrZXlbMF0gPT09IFwiJFwiICYmIGtleS5zbGljZSgxKSBpbiBpbnN0YW5jZSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgXCIke2tleX1cIi4gUHJvcGVydGllcyBzdGFydGluZyB3aXRoICQgYXJlIHJlc2VydmVkIGFuZCByZWFkb25seS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBoYXMoe1xuICAgIF86IHsgZGF0YSwgc2V0dXBTdGF0ZSwgYWNjZXNzQ2FjaGUsIGN0eCwgYXBwQ29udGV4dCwgcHJvcHNPcHRpb25zIH1cbiAgfSwga2V5KSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICByZXR1cm4gISFhY2Nlc3NDYWNoZVtrZXldIHx8IGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSB8fCBoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSB8fCAobm9ybWFsaXplZFByb3BzID0gcHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpIHx8IGhhc093bihjdHgsIGtleSkgfHwgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHwgaGFzT3duKGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGtleSk7XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRhcmdldC5fLmFjY2Vzc0NhY2hlW2tleV0gPSAwO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgIHRoaXMuc2V0KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLnZhbHVlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMub3duS2V5cyA9ICh0YXJnZXQpID0+IHtcbiAgICB3YXJuJDEoXG4gICAgICBgQXZvaWQgYXBwIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIGVudW1lcmF0aW5nIGtleXMgb24gYSBjb21wb25lbnQgaW5zdGFuY2UuIFRoZSBrZXlzIHdpbGwgYmUgZW1wdHkgaW4gcHJvZHVjdGlvbiBtb2RlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLmBcbiAgICApO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgfTtcbn1cbmNvbnN0IFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoXG4gIHt9LFxuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMsXG4gIHtcbiAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09IFN5bWJvbC51bnNjb3BhYmxlcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmdldCh0YXJnZXQsIGtleSwgdGFyZ2V0KTtcbiAgICB9LFxuICAgIGhhcyhfLCBrZXkpIHtcbiAgICAgIGNvbnN0IGhhcyA9IGtleVswXSAhPT0gXCJfXCIgJiYgIWlzR2xvYmFsbHlBbGxvd2VkKGtleSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaGFzICYmIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5oYXMoXywga2V5KSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXyB3aGljaCBpcyBhIHJlc2VydmVkIHByZWZpeCBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzO1xuICAgIH1cbiAgfVxuKTtcbmZ1bmN0aW9uIGNyZWF0ZURldlJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0ge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBfYCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6ICgpID0+IGluc3RhbmNlXG4gIH0pO1xuICBPYmplY3Qua2V5cyhwdWJsaWNQcm9wZXJ0aWVzTWFwKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpLFxuICAgICAgLy8gaW50ZXJjZXB0ZWQgYnkgdGhlIHByb3h5IHNvIG5vIG5lZWQgZm9yIGltcGxlbWVudGF0aW9uLFxuICAgICAgLy8gYnV0IG5lZWRlZCB0byBwcmV2ZW50IHNldCBlcnJvcnNcbiAgICAgIHNldDogTk9PUFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICBjdHgsXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICB9ID0gaW5zdGFuY2U7XG4gIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wc09wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbnN0YW5jZS5wcm9wc1trZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBleHBvc2VTZXR1cFN0YXRlT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlIH0gPSBpbnN0YW5jZTtcbiAgT2JqZWN0LmtleXModG9SYXcoc2V0dXBTdGF0ZSkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICghc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXApIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJlZml4KGtleVswXSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIHdoaWNoIGFyZSByZXNlcnZlZCBwcmVmaXhlcyBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHdhcm5SdW50aW1lVXNhZ2UgPSAobWV0aG9kKSA9PiB3YXJuJDEoXG4gIGAke21ldGhvZH0oKSBpcyBhIGNvbXBpbGVyLWhpbnQgaGVscGVyIHRoYXQgaXMgb25seSB1c2FibGUgaW5zaWRlIDxzY3JpcHQgc2V0dXA+IG9mIGEgc2luZ2xlIGZpbGUgY29tcG9uZW50LiBJdHMgYXJndW1lbnRzIHNob3VsZCBiZSBjb21waWxlZCBhd2F5IGFuZCBwYXNzaW5nIGl0IGF0IHJ1bnRpbWUgaGFzIG5vIGVmZmVjdC5gXG4pO1xuZnVuY3Rpb24gZGVmaW5lUHJvcHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lUHJvcHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUVtaXRzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUVtaXRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFeHBvc2UoZXhwb3NlZCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUV4cG9zZWApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVPcHRpb25zYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZVNsb3RzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVNsb3RzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVNb2RlbCgpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKFwiZGVmaW5lTW9kZWxcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhwcm9wcywgZGVmYXVsdHMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGB3aXRoRGVmYXVsdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHVzZVNsb3RzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLnNsb3RzO1xufVxuZnVuY3Rpb24gdXNlQXR0cnMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KCkuYXR0cnM7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybiQxKGB1c2VDb250ZXh0KCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICB9XG4gIHJldHVybiBpLnNldHVwQ29udGV4dCB8fCAoaS5zZXR1cENvbnRleHQgPSBjcmVhdGVTZXR1cENvbnRleHQoaSkpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPckVtaXRzKHByb3BzKSB7XG4gIHJldHVybiBpc0FycmF5KHByb3BzKSA/IHByb3BzLnJlZHVjZShcbiAgICAobm9ybWFsaXplZCwgcCkgPT4gKG5vcm1hbGl6ZWRbcF0gPSBudWxsLCBub3JtYWxpemVkKSxcbiAgICB7fVxuICApIDogcHJvcHM7XG59XG5mdW5jdGlvbiBtZXJnZURlZmF1bHRzKHJhdywgZGVmYXVsdHMpIHtcbiAgY29uc3QgcHJvcHMgPSBub3JtYWxpemVQcm9wc09yRW1pdHMocmF3KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJfX3NraXBcIikpXG4gICAgICBjb250aW51ZTtcbiAgICBsZXQgb3B0ID0gcHJvcHNba2V5XTtcbiAgICBpZiAob3B0KSB7XG4gICAgICBpZiAoaXNBcnJheShvcHQpIHx8IGlzRnVuY3Rpb24ob3B0KSkge1xuICAgICAgICBvcHQgPSBwcm9wc1trZXldID0geyB0eXBlOiBvcHQsIGRlZmF1bHQ6IGRlZmF1bHRzW2tleV0gfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdC5kZWZhdWx0ID0gZGVmYXVsdHNba2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wdCA9PT0gbnVsbCkge1xuICAgICAgb3B0ID0gcHJvcHNba2V5XSA9IHsgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBwcm9wcyBkZWZhdWx0IGtleSBcIiR7a2V5fVwiIGhhcyBubyBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uLmApO1xuICAgIH1cbiAgICBpZiAob3B0ICYmIGRlZmF1bHRzW2BfX3NraXBfJHtrZXl9YF0pIHtcbiAgICAgIG9wdC5za2lwRmFjdG9yeSA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIG1lcmdlTW9kZWxzKGEsIGIpIHtcbiAgaWYgKCFhIHx8ICFiKVxuICAgIHJldHVybiBhIHx8IGI7XG4gIGlmIChpc0FycmF5KGEpICYmIGlzQXJyYXkoYikpXG4gICAgcmV0dXJuIGEuY29uY2F0KGIpO1xuICByZXR1cm4gZXh0ZW5kKHt9LCBub3JtYWxpemVQcm9wc09yRW1pdHMoYSksIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhiKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVQcm9wc1Jlc3RQcm94eShwcm9wcywgZXhjbHVkZWRLZXlzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgIGlmICghZXhjbHVkZWRLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXQsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHByb3BzW2tleV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gd2l0aEFzeW5jQ29udGV4dChnZXRBd2FpdGFibGUpIHtcbiAgY29uc3QgY3R4ID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjdHgpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgd2l0aEFzeW5jQ29udGV4dCBjYWxsZWQgd2l0aG91dCBhY3RpdmUgY3VycmVudCBpbnN0YW5jZS4gVGhpcyBpcyBsaWtlbHkgYSBidWcuYFxuICAgICk7XG4gIH1cbiAgbGV0IGF3YWl0YWJsZSA9IGdldEF3YWl0YWJsZSgpO1xuICB1bnNldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoaXNQcm9taXNlKGF3YWl0YWJsZSkpIHtcbiAgICBhd2FpdGFibGUgPSBhd2FpdGFibGUuY2F0Y2goKGUpID0+IHtcbiAgICAgIHNldEN1cnJlbnRJbnN0YW5jZShjdHgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gW2F3YWl0YWJsZSwgKCkgPT4gc2V0Q3VycmVudEluc3RhbmNlKGN0eCldO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEdXBsaWNhdGVDaGVja2VyKCkge1xuICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKHR5cGUsIGtleSkgPT4ge1xuICAgIGlmIChjYWNoZVtrZXldKSB7XG4gICAgICB3YXJuJDEoYCR7dHlwZX0gcHJvcGVydHkgXCIke2tleX1cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gJHtjYWNoZVtrZXldfS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FjaGVba2V5XSA9IHR5cGU7XG4gICAgfVxuICB9O1xufVxubGV0IHNob3VsZENhY2hlQWNjZXNzID0gdHJ1ZTtcbmZ1bmN0aW9uIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSkge1xuICBjb25zdCBvcHRpb25zID0gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpO1xuICBjb25zdCBwdWJsaWNUaGlzID0gaW5zdGFuY2UucHJveHk7XG4gIGNvbnN0IGN0eCA9IGluc3RhbmNlLmN0eDtcbiAgc2hvdWxkQ2FjaGVBY2Nlc3MgPSBmYWxzZTtcbiAgaWYgKG9wdGlvbnMuYmVmb3JlQ3JlYXRlKSB7XG4gICAgY2FsbEhvb2sob3B0aW9ucy5iZWZvcmVDcmVhdGUsIGluc3RhbmNlLCBcImJjXCIpO1xuICB9XG4gIGNvbnN0IHtcbiAgICAvLyBzdGF0ZVxuICAgIGRhdGE6IGRhdGFPcHRpb25zLFxuICAgIGNvbXB1dGVkOiBjb21wdXRlZE9wdGlvbnMsXG4gICAgbWV0aG9kcyxcbiAgICB3YXRjaDogd2F0Y2hPcHRpb25zLFxuICAgIHByb3ZpZGU6IHByb3ZpZGVPcHRpb25zLFxuICAgIGluamVjdDogaW5qZWN0T3B0aW9ucyxcbiAgICAvLyBsaWZlY3ljbGVcbiAgICBjcmVhdGVkLFxuICAgIGJlZm9yZU1vdW50LFxuICAgIG1vdW50ZWQsXG4gICAgYmVmb3JlVXBkYXRlLFxuICAgIHVwZGF0ZWQsXG4gICAgYWN0aXZhdGVkLFxuICAgIGRlYWN0aXZhdGVkLFxuICAgIGJlZm9yZURlc3Ryb3ksXG4gICAgYmVmb3JlVW5tb3VudCxcbiAgICBkZXN0cm95ZWQsXG4gICAgdW5tb3VudGVkLFxuICAgIHJlbmRlcixcbiAgICByZW5kZXJUcmFja2VkLFxuICAgIHJlbmRlclRyaWdnZXJlZCxcbiAgICBlcnJvckNhcHR1cmVkLFxuICAgIHNlcnZlclByZWZldGNoLFxuICAgIC8vIHB1YmxpYyBBUElcbiAgICBleHBvc2UsXG4gICAgaW5oZXJpdEF0dHJzLFxuICAgIC8vIGFzc2V0c1xuICAgIGNvbXBvbmVudHMsXG4gICAgZGlyZWN0aXZlcyxcbiAgICBmaWx0ZXJzXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlRHVwbGljYXRlQ2hlY2tlcigpIDogbnVsbDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBbcHJvcHNPcHRpb25zXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgICBpZiAocHJvcHNPcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wc09wdGlvbnMpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiUHJvcHNcIiAvKiBQUk9QUyAqLywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGluamVjdE9wdGlvbnMpIHtcbiAgICByZXNvbHZlSW5qZWN0aW9ucyhpbmplY3RPcHRpb25zLCBjdHgsIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyk7XG4gIH1cbiAgaWYgKG1ldGhvZHMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBjb25zdCBtZXRob2RIYW5kbGVyID0gbWV0aG9kc1trZXldO1xuICAgICAgaWYgKGlzRnVuY3Rpb24obWV0aG9kSGFuZGxlcikpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICAgIHZhbHVlOiBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyksXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdHhba2V5XSA9IG1ldGhvZEhhbmRsZXIuYmluZChwdWJsaWNUaGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIk1ldGhvZHNcIiAvKiBNRVRIT0RTICovLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBNZXRob2QgXCIke2tleX1cIiBoYXMgdHlwZSBcIiR7dHlwZW9mIG1ldGhvZEhhbmRsZXJ9XCIgaW4gdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLiBEaWQgeW91IHJlZmVyZW5jZSB0aGUgZnVuY3Rpb24gY29ycmVjdGx5P2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKGRhdGFPcHRpb25zKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRnVuY3Rpb24oZGF0YU9wdGlvbnMpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBUaGUgZGF0YSBvcHRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLiBQbGFpbiBvYmplY3QgdXNhZ2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gZGF0YU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1Byb21pc2UoZGF0YSkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYGRhdGEoKSByZXR1cm5lZCBhIFByb21pc2UgLSBub3RlIGRhdGEoKSBjYW5ub3QgYmUgYXN5bmM7IElmIHlvdSBpbnRlbmQgdG8gcGVyZm9ybSBkYXRhIGZldGNoaW5nIGJlZm9yZSBjb21wb25lbnQgcmVuZGVycywgdXNlIGFzeW5jIHNldHVwKCkgKyA8U3VzcGVuc2U+LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGBkYXRhKCkgc2hvdWxkIHJldHVybiBhbiBvYmplY3QuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLmRhdGEgPSByZWFjdGl2ZShkYXRhKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJEYXRhXCIgLyogREFUQSAqLywga2V5KTtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcmVmaXgoa2V5WzBdKSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZ2V0OiAoKSA9PiBkYXRhW2tleV0sXG4gICAgICAgICAgICAgIHNldDogTk9PUFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNob3VsZENhY2hlQWNjZXNzID0gdHJ1ZTtcbiAgaWYgKGNvbXB1dGVkT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXB1dGVkT3B0aW9ucykge1xuICAgICAgY29uc3Qgb3B0ID0gY29tcHV0ZWRPcHRpb25zW2tleV07XG4gICAgICBjb25zdCBnZXQgPSBpc0Z1bmN0aW9uKG9wdCkgPyBvcHQuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKSA6IGlzRnVuY3Rpb24ob3B0LmdldCkgPyBvcHQuZ2V0LmJpbmQocHVibGljVGhpcywgcHVibGljVGhpcykgOiBOT09QO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgZ2V0ID09PSBOT09QKSB7XG4gICAgICAgIHdhcm4kMShgQ29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBoYXMgbm8gZ2V0dGVyLmApO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2V0ID0gIWlzRnVuY3Rpb24ob3B0KSAmJiBpc0Z1bmN0aW9uKG9wdC5zZXQpID8gb3B0LnNldC5iaW5kKHB1YmxpY1RoaXMpIDogISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/ICgpID0+IHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBXcml0ZSBvcGVyYXRpb24gZmFpbGVkOiBjb21wdXRlZCBwcm9wZXJ0eSBcIiR7a2V5fVwiIGlzIHJlYWRvbmx5LmBcbiAgICAgICAgKTtcbiAgICAgIH0gOiBOT09QO1xuICAgICAgY29uc3QgYyA9IGNvbXB1dGVkKHtcbiAgICAgICAgZ2V0LFxuICAgICAgICBzZXRcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBjLnZhbHVlLFxuICAgICAgICBzZXQ6ICh2KSA9PiBjLnZhbHVlID0gdlxuICAgICAgfSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJDb21wdXRlZFwiIC8qIENPTVBVVEVEICovLCBrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAod2F0Y2hPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gd2F0Y2hPcHRpb25zKSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHdhdGNoT3B0aW9uc1trZXldLCBjdHgsIHB1YmxpY1RoaXMsIGtleSk7XG4gICAgfVxuICB9XG4gIGlmIChwcm92aWRlT3B0aW9ucykge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaXNGdW5jdGlvbihwcm92aWRlT3B0aW9ucykgPyBwcm92aWRlT3B0aW9ucy5jYWxsKHB1YmxpY1RoaXMpIDogcHJvdmlkZU9wdGlvbnM7XG4gICAgUmVmbGVjdC5vd25LZXlzKHByb3ZpZGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHByb3ZpZGUoa2V5LCBwcm92aWRlc1trZXldKTtcbiAgICB9KTtcbiAgfVxuICBpZiAoY3JlYXRlZCkge1xuICAgIGNhbGxIb29rKGNyZWF0ZWQsIGluc3RhbmNlLCBcImNcIik7XG4gIH1cbiAgZnVuY3Rpb24gcmVnaXN0ZXJMaWZlY3ljbGVIb29rKHJlZ2lzdGVyLCBob29rKSB7XG4gICAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICAgIGhvb2suZm9yRWFjaCgoX2hvb2spID0+IHJlZ2lzdGVyKF9ob29rLmJpbmQocHVibGljVGhpcykpKTtcbiAgICB9IGVsc2UgaWYgKGhvb2spIHtcbiAgICAgIHJlZ2lzdGVyKGhvb2suYmluZChwdWJsaWNUaGlzKSk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkJlZm9yZU1vdW50LCBiZWZvcmVNb3VudCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbk1vdW50ZWQsIG1vdW50ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVVcGRhdGUsIGJlZm9yZVVwZGF0ZSk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblVwZGF0ZWQsIHVwZGF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25BY3RpdmF0ZWQsIGFjdGl2YXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkRlYWN0aXZhdGVkLCBkZWFjdGl2YXRlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvbkVycm9yQ2FwdHVyZWQsIGVycm9yQ2FwdHVyZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25SZW5kZXJUcmFja2VkLCByZW5kZXJUcmFja2VkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uUmVuZGVyVHJpZ2dlcmVkLCByZW5kZXJUcmlnZ2VyZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVVbm1vdW50LCBiZWZvcmVVbm1vdW50KTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uVW5tb3VudGVkLCB1bm1vdW50ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25TZXJ2ZXJQcmVmZXRjaCwgc2VydmVyUHJlZmV0Y2gpO1xuICBpZiAoaXNBcnJheShleHBvc2UpKSB7XG4gICAgaWYgKGV4cG9zZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGV4cG9zZWQgPSBpbnN0YW5jZS5leHBvc2VkIHx8IChpbnN0YW5jZS5leHBvc2VkID0ge30pO1xuICAgICAgZXhwb3NlLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3NlZCwga2V5LCB7XG4gICAgICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNUaGlzW2tleV0sXG4gICAgICAgICAgc2V0OiAodmFsKSA9PiBwdWJsaWNUaGlzW2tleV0gPSB2YWxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKCFpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgICBpbnN0YW5jZS5leHBvc2VkID0ge307XG4gICAgfVxuICB9XG4gIGlmIChyZW5kZXIgJiYgaW5zdGFuY2UucmVuZGVyID09PSBOT09QKSB7XG4gICAgaW5zdGFuY2UucmVuZGVyID0gcmVuZGVyO1xuICB9XG4gIGlmIChpbmhlcml0QXR0cnMgIT0gbnVsbCkge1xuICAgIGluc3RhbmNlLmluaGVyaXRBdHRycyA9IGluaGVyaXRBdHRycztcbiAgfVxuICBpZiAoY29tcG9uZW50cylcbiAgICBpbnN0YW5jZS5jb21wb25lbnRzID0gY29tcG9uZW50cztcbiAgaWYgKGRpcmVjdGl2ZXMpXG4gICAgaW5zdGFuY2UuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG59XG5mdW5jdGlvbiByZXNvbHZlSW5qZWN0aW9ucyhpbmplY3RPcHRpb25zLCBjdHgsIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyA9IE5PT1ApIHtcbiAgaWYgKGlzQXJyYXkoaW5qZWN0T3B0aW9ucykpIHtcbiAgICBpbmplY3RPcHRpb25zID0gbm9ybWFsaXplSW5qZWN0KGluamVjdE9wdGlvbnMpO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGluamVjdE9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHQgPSBpbmplY3RPcHRpb25zW2tleV07XG4gICAgbGV0IGluamVjdGVkO1xuICAgIGlmIChpc09iamVjdChvcHQpKSB7XG4gICAgICBpZiAoXCJkZWZhdWx0XCIgaW4gb3B0KSB7XG4gICAgICAgIGluamVjdGVkID0gaW5qZWN0KFxuICAgICAgICAgIG9wdC5mcm9tIHx8IGtleSxcbiAgICAgICAgICBvcHQuZGVmYXVsdCxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChvcHQuZnJvbSB8fCBrZXkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmplY3RlZCA9IGluamVjdChvcHQpO1xuICAgIH1cbiAgICBpZiAoaXNSZWYoaW5qZWN0ZWQpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGluamVjdGVkLnZhbHVlLFxuICAgICAgICBzZXQ6ICh2KSA9PiBpbmplY3RlZC52YWx1ZSA9IHZcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdHhba2V5XSA9IGluamVjdGVkO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiSW5qZWN0XCIgLyogSU5KRUNUICovLCBrZXkpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2FsbEhvb2soaG9vaywgaW5zdGFuY2UsIHR5cGUpIHtcbiAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgaXNBcnJheShob29rKSA/IGhvb2subWFwKChoKSA9PiBoLmJpbmQoaW5zdGFuY2UucHJveHkpKSA6IGhvb2suYmluZChpbnN0YW5jZS5wcm94eSksXG4gICAgaW5zdGFuY2UsXG4gICAgdHlwZVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlV2F0Y2hlcihyYXcsIGN0eCwgcHVibGljVGhpcywga2V5KSB7XG4gIGNvbnN0IGdldHRlciA9IGtleS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIGtleSkgOiAoKSA9PiBwdWJsaWNUaGlzW2tleV07XG4gIGlmIChpc1N0cmluZyhyYXcpKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IGN0eFtyYXddO1xuICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICB3YXRjaChnZXR0ZXIsIGhhbmRsZXIpO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIHdhdGNoIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IGtleSBcIiR7cmF3fVwiYCwgaGFuZGxlcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocmF3KSkge1xuICAgIHdhdGNoKGdldHRlciwgcmF3LmJpbmQocHVibGljVGhpcykpO1xuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHJhdykpIHtcbiAgICBpZiAoaXNBcnJheShyYXcpKSB7XG4gICAgICByYXcuZm9yRWFjaCgocikgPT4gY3JlYXRlV2F0Y2hlcihyLCBjdHgsIHB1YmxpY1RoaXMsIGtleSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gaXNGdW5jdGlvbihyYXcuaGFuZGxlcikgPyByYXcuaGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpIDogY3R4W3Jhdy5oYW5kbGVyXTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgICAgIHdhdGNoKGdldHRlciwgaGFuZGxlciwgcmF3KTtcbiAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggaGFuZGxlciBzcGVjaWZpZWQgYnkga2V5IFwiJHtyYXcuaGFuZGxlcn1cImAsIGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBJbnZhbGlkIHdhdGNoIG9wdGlvbjogXCIke2tleX1cImAsIHJhdyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKSB7XG4gIGNvbnN0IGJhc2UgPSBpbnN0YW5jZS50eXBlO1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGJhc2U7XG4gIGNvbnN0IHtcbiAgICBtaXhpbnM6IGdsb2JhbE1peGlucyxcbiAgICBvcHRpb25zQ2FjaGU6IGNhY2hlLFxuICAgIGNvbmZpZzogeyBvcHRpb25NZXJnZVN0cmF0ZWdpZXMgfVxuICB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dDtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGJhc2UpO1xuICBsZXQgcmVzb2x2ZWQ7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXNvbHZlZCA9IGNhY2hlZDtcbiAgfSBlbHNlIGlmICghZ2xvYmFsTWl4aW5zLmxlbmd0aCAmJiAhbWl4aW5zICYmICFleHRlbmRzT3B0aW9ucykge1xuICAgIHtcbiAgICAgIHJlc29sdmVkID0gYmFzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVzb2x2ZWQgPSB7fTtcbiAgICBpZiAoZ2xvYmFsTWl4aW5zLmxlbmd0aCkge1xuICAgICAgZ2xvYmFsTWl4aW5zLmZvckVhY2goXG4gICAgICAgIChtKSA9PiBtZXJnZU9wdGlvbnMocmVzb2x2ZWQsIG0sIG9wdGlvbk1lcmdlU3RyYXRlZ2llcywgdHJ1ZSlcbiAgICAgICk7XG4gICAgfVxuICAgIG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgYmFzZSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoYmFzZSkpIHtcbiAgICBjYWNoZS5zZXQoYmFzZSwgcmVzb2x2ZWQpO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyh0bywgZnJvbSwgc3RyYXRzLCBhc01peGluID0gZmFsc2UpIHtcbiAgY29uc3QgeyBtaXhpbnMsIGV4dGVuZHM6IGV4dGVuZHNPcHRpb25zIH0gPSBmcm9tO1xuICBpZiAoZXh0ZW5kc09wdGlvbnMpIHtcbiAgICBtZXJnZU9wdGlvbnModG8sIGV4dGVuZHNPcHRpb25zLCBzdHJhdHMsIHRydWUpO1xuICB9XG4gIGlmIChtaXhpbnMpIHtcbiAgICBtaXhpbnMuZm9yRWFjaChcbiAgICAgIChtKSA9PiBtZXJnZU9wdGlvbnModG8sIG0sIHN0cmF0cywgdHJ1ZSlcbiAgICApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcbiAgICBpZiAoYXNNaXhpbiAmJiBrZXkgPT09IFwiZXhwb3NlXCIpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgXCJleHBvc2VcIiBvcHRpb24gaXMgaWdub3JlZCB3aGVuIGRlY2xhcmVkIGluIG1peGlucyBvciBleHRlbmRzLiBJdCBzaG91bGQgb25seSBiZSBkZWNsYXJlZCBpbiB0aGUgYmFzZSBjb21wb25lbnQgaXRzZWxmLmBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN0cmF0ID0gaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0c1trZXldIHx8IHN0cmF0cyAmJiBzdHJhdHNba2V5XTtcbiAgICAgIHRvW2tleV0gPSBzdHJhdCA/IHN0cmF0KHRvW2tleV0sIGZyb21ba2V5XSkgOiBmcm9tW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0bztcbn1cbmNvbnN0IGludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHMgPSB7XG4gIGRhdGE6IG1lcmdlRGF0YUZuLFxuICBwcm9wczogbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zLFxuICBlbWl0czogbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zLFxuICAvLyBvYmplY3RzXG4gIG1ldGhvZHM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgY29tcHV0ZWQ6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgLy8gbGlmZWN5Y2xlXG4gIGJlZm9yZUNyZWF0ZTogbWVyZ2VBc0FycmF5LFxuICBjcmVhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZU1vdW50OiBtZXJnZUFzQXJyYXksXG4gIG1vdW50ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlVXBkYXRlOiBtZXJnZUFzQXJyYXksXG4gIHVwZGF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlRGVzdHJveTogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVbm1vdW50OiBtZXJnZUFzQXJyYXksXG4gIGRlc3Ryb3llZDogbWVyZ2VBc0FycmF5LFxuICB1bm1vdW50ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYWN0aXZhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGRlYWN0aXZhdGVkOiBtZXJnZUFzQXJyYXksXG4gIGVycm9yQ2FwdHVyZWQ6IG1lcmdlQXNBcnJheSxcbiAgc2VydmVyUHJlZmV0Y2g6IG1lcmdlQXNBcnJheSxcbiAgLy8gYXNzZXRzXG4gIGNvbXBvbmVudHM6IG1lcmdlT2JqZWN0T3B0aW9ucyxcbiAgZGlyZWN0aXZlczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyB3YXRjaFxuICB3YXRjaDogbWVyZ2VXYXRjaE9wdGlvbnMsXG4gIC8vIHByb3ZpZGUgLyBpbmplY3RcbiAgcHJvdmlkZTogbWVyZ2VEYXRhRm4sXG4gIGluamVjdDogbWVyZ2VJbmplY3Rcbn07XG5mdW5jdGlvbiBtZXJnZURhdGFGbih0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHtcbiAgICByZXR1cm4gdG87XG4gIH1cbiAgaWYgKCF0bykge1xuICAgIHJldHVybiBmcm9tO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBtZXJnZWREYXRhRm4oKSB7XG4gICAgcmV0dXJuIChleHRlbmQpKFxuICAgICAgaXNGdW5jdGlvbih0bykgPyB0by5jYWxsKHRoaXMsIHRoaXMpIDogdG8sXG4gICAgICBpc0Z1bmN0aW9uKGZyb20pID8gZnJvbS5jYWxsKHRoaXMsIHRoaXMpIDogZnJvbVxuICAgICk7XG4gIH07XG59XG5mdW5jdGlvbiBtZXJnZUluamVjdCh0bywgZnJvbSkge1xuICByZXR1cm4gbWVyZ2VPYmplY3RPcHRpb25zKG5vcm1hbGl6ZUluamVjdCh0byksIG5vcm1hbGl6ZUluamVjdChmcm9tKSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QocmF3KSB7XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBjb25zdCByZXMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW3Jhd1tpXV0gPSByYXdbaV07XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgcmV0dXJuIHJhdztcbn1cbmZ1bmN0aW9uIG1lcmdlQXNBcnJheSh0bywgZnJvbSkge1xuICByZXR1cm4gdG8gPyBbLi4ubmV3IFNldChbXS5jb25jYXQodG8sIGZyb20pKV0gOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VPYmplY3RPcHRpb25zKHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8sIGZyb20pIDogZnJvbTtcbn1cbmZ1bmN0aW9uIG1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyh0bywgZnJvbSkge1xuICBpZiAodG8pIHtcbiAgICBpZiAoaXNBcnJheSh0bykgJiYgaXNBcnJheShmcm9tKSkge1xuICAgICAgcmV0dXJuIFsuLi4vKiBAX19QVVJFX18gKi8gbmV3IFNldChbLi4udG8sIC4uLmZyb21dKV07XG4gICAgfVxuICAgIHJldHVybiBleHRlbmQoXG4gICAgICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyh0byksXG4gICAgICBub3JtYWxpemVQcm9wc09yRW1pdHMoZnJvbSAhPSBudWxsID8gZnJvbSA6IHt9KVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbn1cbmZ1bmN0aW9uIG1lcmdlV2F0Y2hPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICghdG8pXG4gICAgcmV0dXJuIGZyb207XG4gIGlmICghZnJvbSlcbiAgICByZXR1cm4gdG87XG4gIGNvbnN0IG1lcmdlZCA9IGV4dGVuZCgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdG8pO1xuICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tKSB7XG4gICAgbWVyZ2VkW2tleV0gPSBtZXJnZUFzQXJyYXkodG9ba2V5XSwgZnJvbVtrZXldKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBcHBDb250ZXh0KCkge1xuICByZXR1cm4ge1xuICAgIGFwcDogbnVsbCxcbiAgICBjb25maWc6IHtcbiAgICAgIGlzTmF0aXZlVGFnOiBOTyxcbiAgICAgIHBlcmZvcm1hbmNlOiBmYWxzZSxcbiAgICAgIGdsb2JhbFByb3BlcnRpZXM6IHt9LFxuICAgICAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiB7fSxcbiAgICAgIGVycm9ySGFuZGxlcjogdm9pZCAwLFxuICAgICAgd2FybkhhbmRsZXI6IHZvaWQgMCxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge31cbiAgICB9LFxuICAgIG1peGluczogW10sXG4gICAgY29tcG9uZW50czoge30sXG4gICAgZGlyZWN0aXZlczoge30sXG4gICAgcHJvdmlkZXM6IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgIG9wdGlvbnNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgcHJvcHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksXG4gICAgZW1pdHNDYWNoZTogLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKClcbiAgfTtcbn1cbmxldCB1aWQkMSA9IDA7XG5mdW5jdGlvbiBjcmVhdGVBcHBBUEkocmVuZGVyLCBoeWRyYXRlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVBcHAocm9vdENvbXBvbmVudCwgcm9vdFByb3BzID0gbnVsbCkge1xuICAgIGlmICghaXNGdW5jdGlvbihyb290Q29tcG9uZW50KSkge1xuICAgICAgcm9vdENvbXBvbmVudCA9IGV4dGVuZCh7fSwgcm9vdENvbXBvbmVudCk7XG4gICAgfVxuICAgIGlmIChyb290UHJvcHMgIT0gbnVsbCAmJiAhaXNPYmplY3Qocm9vdFByb3BzKSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYHJvb3QgcHJvcHMgcGFzc2VkIHRvIGFwcC5tb3VudCgpIG11c3QgYmUgYW4gb2JqZWN0LmApO1xuICAgICAgcm9vdFByb3BzID0gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUFwcENvbnRleHQoKTtcbiAgICBjb25zdCBpbnN0YWxsZWRQbHVnaW5zID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG4gICAgbGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGFwcCA9IGNvbnRleHQuYXBwID0ge1xuICAgICAgX3VpZDogdWlkJDErKyxcbiAgICAgIF9jb21wb25lbnQ6IHJvb3RDb21wb25lbnQsXG4gICAgICBfcHJvcHM6IHJvb3RQcm9wcyxcbiAgICAgIF9jb250YWluZXI6IG51bGwsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9pbnN0YW5jZTogbnVsbCxcbiAgICAgIHZlcnNpb24sXG4gICAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4gY29udGV4dC5jb25maWc7XG4gICAgICB9LFxuICAgICAgc2V0IGNvbmZpZyh2KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGFwcC5jb25maWcgY2Fubm90IGJlIHJlcGxhY2VkLiBNb2RpZnkgaW5kaXZpZHVhbCBvcHRpb25zIGluc3RlYWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2UocGx1Z2luLCAuLi5vcHRpb25zKSB7XG4gICAgICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmhhcyhwbHVnaW4pKSB7XG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYFBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChwbHVnaW4gJiYgaXNGdW5jdGlvbihwbHVnaW4uaW5zdGFsbCkpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbi5pbnN0YWxsKGFwcCwgLi4ub3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihwbHVnaW4pKSB7XG4gICAgICAgICAgaW5zdGFsbGVkUGx1Z2lucy5hZGQocGx1Z2luKTtcbiAgICAgICAgICBwbHVnaW4oYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEEgcGx1Z2luIG11c3QgZWl0aGVyIGJlIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0IHdpdGggYW4gXCJpbnN0YWxsXCIgZnVuY3Rpb24uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBtaXhpbihtaXhpbikge1xuICAgICAgICBpZiAoX19WVUVfT1BUSU9OU19BUElfXykge1xuICAgICAgICAgIGlmICghY29udGV4dC5taXhpbnMuaW5jbHVkZXMobWl4aW4pKSB7XG4gICAgICAgICAgICBjb250ZXh0Lm1peGlucy5wdXNoKG1peGluKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgXCJNaXhpbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGFyZ2V0IGFwcFwiICsgKG1peGluLm5hbWUgPyBgOiAke21peGluLm5hbWV9YCA6IFwiXCIpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFwiTWl4aW5zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBidWlsZHMgc3VwcG9ydGluZyBPcHRpb25zIEFQSVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIGNvbXBvbmVudChuYW1lLCBjb21wb25lbnQpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUobmFtZSwgY29udGV4dC5jb25maWcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYENvbXBvbmVudCBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmNvbXBvbmVudHNbbmFtZV0gPSBjb21wb25lbnQ7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgZGlyZWN0aXZlKG5hbWUsIGRpcmVjdGl2ZSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdKSB7XG4gICAgICAgICAgd2FybiQxKGBEaXJlY3RpdmUgXCIke25hbWV9XCIgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGluIHRhcmdldCBhcHAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5kaXJlY3RpdmVzW25hbWVdID0gZGlyZWN0aXZlO1xuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1vdW50KHJvb3RDb250YWluZXIsIGlzSHlkcmF0ZSwgbmFtZXNwYWNlKSB7XG4gICAgICAgIGlmICghaXNNb3VudGVkKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcm9vdENvbnRhaW5lci5fX3Z1ZV9hcHBfXykge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgVGhlcmUgaXMgYWxyZWFkeSBhbiBhcHAgaW5zdGFuY2UgbW91bnRlZCBvbiB0aGUgaG9zdCBjb250YWluZXIuXG4gSWYgeW91IHdhbnQgdG8gbW91bnQgYW5vdGhlciBhcHAgb24gdGhlIHNhbWUgaG9zdCBjb250YWluZXIsIHlvdSBuZWVkIHRvIHVubW91bnQgdGhlIHByZXZpb3VzIGFwcCBieSBjYWxsaW5nIFxcYGFwcC51bm1vdW50KClcXGAgZmlyc3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIGNsb25lVk5vZGUodm5vZGUpLFxuICAgICAgICAgICAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgYXBwLl9jb250YWluZXIgPSByb290Q29udGFpbmVyO1xuICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnZXRFeHBvc2VQcm94eSh2bm9kZS5jb21wb25lbnQpIHx8IHZub2RlLmNvbXBvbmVudC5wcm94eTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEFwcCBoYXMgYWxyZWFkeSBiZWVuIG1vdW50ZWQuXG5JZiB5b3Ugd2FudCB0byByZW1vdW50IHRoZSBzYW1lIGFwcCwgbW92ZSB5b3VyIGFwcCBjcmVhdGlvbiBsb2dpYyBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbiBhbmQgY3JlYXRlIGZyZXNoIGFwcCBpbnN0YW5jZXMgZm9yIGVhY2ggbW91bnQgLSBlLmcuIFxcYGNvbnN0IGNyZWF0ZU15QXBwID0gKCkgPT4gY3JlYXRlQXBwKEFwcClcXGBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVubW91bnQoKSB7XG4gICAgICAgIGlmIChpc01vdW50ZWQpIHtcbiAgICAgICAgICByZW5kZXIobnVsbCwgYXBwLl9jb250YWluZXIpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBkZXZ0b29sc1VubW91bnRBcHAoYXBwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFwcC5fY29udGFpbmVyLl9fdnVlX2FwcF9fO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoYENhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLmApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBjb250ZXh0LnByb3ZpZGVzKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEFwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIi4gSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5wcm92aWRlc1trZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgcnVuV2l0aENvbnRleHQoZm4pIHtcbiAgICAgICAgY3VycmVudEFwcCA9IGFwcDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZm4oKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50QXBwID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGFwcDtcbiAgfTtcbn1cbmxldCBjdXJyZW50QXBwID0gbnVsbDtcblxuZnVuY3Rpb24gcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gIGlmICghY3VycmVudEluc3RhbmNlKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgcHJvdmlkZSgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkuYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcztcbiAgICBjb25zdCBwYXJlbnRQcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQgJiYgY3VycmVudEluc3RhbmNlLnBhcmVudC5wcm92aWRlcztcbiAgICBpZiAocGFyZW50UHJvdmlkZXMgPT09IHByb3ZpZGVzKSB7XG4gICAgICBwcm92aWRlcyA9IGN1cnJlbnRJbnN0YW5jZS5wcm92aWRlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50UHJvdmlkZXMpO1xuICAgIH1cbiAgICBwcm92aWRlc1trZXldID0gdmFsdWU7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdChrZXksIGRlZmF1bHRWYWx1ZSwgdHJlYXREZWZhdWx0QXNGYWN0b3J5ID0gZmFsc2UpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBpZiAoaW5zdGFuY2UgfHwgY3VycmVudEFwcCkge1xuICAgIGNvbnN0IHByb3ZpZGVzID0gaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IGN1cnJlbnRBcHAuX2NvbnRleHQucHJvdmlkZXM7XG4gICAgaWYgKHByb3ZpZGVzICYmIGtleSBpbiBwcm92aWRlcykge1xuICAgICAgcmV0dXJuIHByb3ZpZGVzW2tleV07XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSAmJiBpc0Z1bmN0aW9uKGRlZmF1bHRWYWx1ZSkgPyBkZWZhdWx0VmFsdWUuY2FsbChpbnN0YW5jZSAmJiBpbnN0YW5jZS5wcm94eSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYGluamVjdGlvbiBcIiR7U3RyaW5nKGtleSl9XCIgbm90IGZvdW5kLmApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBpbmplY3QoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpIG9yIGZ1bmN0aW9uYWwgY29tcG9uZW50cy5gKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzSW5qZWN0aW9uQ29udGV4dCgpIHtcbiAgcmV0dXJuICEhKGN1cnJlbnRJbnN0YW5jZSB8fCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfHwgY3VycmVudEFwcCk7XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIGlzU3RhdGVmdWwsIGlzU1NSID0gZmFsc2UpIHtcbiAgY29uc3QgcHJvcHMgPSB7fTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcbiAgZGVmKGF0dHJzLCBJbnRlcm5hbE9iamVjdEtleSwgMSk7XG4gIGluc3RhbmNlLnByb3BzRGVmYXVsdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSB7XG4gICAgaWYgKCEoa2V5IGluIHByb3BzKSkge1xuICAgICAgcHJvcHNba2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzIHx8IHt9LCBwcm9wcywgaW5zdGFuY2UpO1xuICB9XG4gIGlmIChpc1N0YXRlZnVsKSB7XG4gICAgaW5zdGFuY2UucHJvcHMgPSBpc1NTUiA/IHByb3BzIDogc2hhbGxvd1JlYWN0aXZlKHByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIWluc3RhbmNlLnR5cGUucHJvcHMpIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gYXR0cnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHJvcHM7XG4gICAgfVxuICB9XG4gIGluc3RhbmNlLmF0dHJzID0gYXR0cnM7XG59XG5mdW5jdGlvbiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkge1xuICB3aGlsZSAoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX2htcklkKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5wYXJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcmF3UHJldlByb3BzLCBvcHRpbWl6ZWQpIHtcbiAgY29uc3Qge1xuICAgIHByb3BzLFxuICAgIGF0dHJzLFxuICAgIHZub2RlOiB7IHBhdGNoRmxhZyB9XG4gIH0gPSBpbnN0YW5jZTtcbiAgY29uc3QgcmF3Q3VycmVudFByb3BzID0gdG9SYXcocHJvcHMpO1xuICBjb25zdCBbb3B0aW9uc10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gIGxldCBoYXNBdHRyc0NoYW5nZWQgPSBmYWxzZTtcbiAgaWYgKFxuICAgIC8vIGFsd2F5cyBmb3JjZSBmdWxsIGRpZmYgaW4gZGV2XG4gICAgLy8gLSAjMTk0MiBpZiBobXIgaXMgZW5hYmxlZCB3aXRoIHNmYyBjb21wb25lbnRcbiAgICAvLyAtIHZpdGUjODcyIG5vbi1zZmMgY29tcG9uZW50IHVzZWQgYnkgc2ZjIGNvbXBvbmVudFxuICAgICEoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0luSG1yQ29udGV4dChpbnN0YW5jZSkpICYmIChvcHRpbWl6ZWQgfHwgcGF0Y2hGbGFnID4gMCkgJiYgIShwYXRjaEZsYWcgJiAxNilcbiAgKSB7XG4gICAgaWYgKHBhdGNoRmxhZyAmIDgpIHtcbiAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBpbnN0YW5jZS52bm9kZS5keW5hbWljUHJvcHM7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzVG9VcGRhdGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGtleSA9IHByb3BzVG9VcGRhdGVbaV07XG4gICAgICAgIGlmIChpc0VtaXRMaXN0ZW5lcihpbnN0YW5jZS5lbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJhd1Byb3BzW2tleV07XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgaWYgKGhhc093bihhdHRycywga2V5KSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgICAgIHByb3BzW2NhbWVsaXplZEtleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgICAgICAgIGNhbWVsaXplZEtleSxcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBhdHRyc1trZXldKSB7XG4gICAgICAgICAgICBhdHRyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoc2V0RnVsbFByb3BzKGluc3RhbmNlLCByYXdQcm9wcywgcHJvcHMsIGF0dHJzKSkge1xuICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IGtlYmFiS2V5O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHJhd0N1cnJlbnRQcm9wcykge1xuICAgICAgaWYgKCFyYXdQcm9wcyB8fCAvLyBmb3IgY2FtZWxDYXNlXG4gICAgICAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmIC8vIGl0J3MgcG9zc2libGUgdGhlIG9yaWdpbmFsIHByb3BzIHdhcyBwYXNzZWQgaW4gYXMga2ViYWItY2FzZVxuICAgICAgLy8gYW5kIGNvbnZlcnRlZCB0byBjYW1lbENhc2UgKCM5NTUpXG4gICAgICAoKGtlYmFiS2V5ID0gaHlwaGVuYXRlKGtleSkpID09PSBrZXkgfHwgIWhhc093bihyYXdQcm9wcywga2ViYWJLZXkpKSkge1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgIGlmIChyYXdQcmV2UHJvcHMgJiYgLy8gZm9yIGNhbWVsQ2FzZVxuICAgICAgICAgIChyYXdQcmV2UHJvcHNba2V5XSAhPT0gdm9pZCAwIHx8IC8vIGZvciBrZWJhYi1jYXNlXG4gICAgICAgICAgcmF3UHJldlByb3BzW2tlYmFiS2V5XSAhPT0gdm9pZCAwKSkge1xuICAgICAgICAgICAgcHJvcHNba2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgcHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXR0cnMgIT09IHJhd0N1cnJlbnRQcm9wcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgaWYgKCFyYXdQcm9wcyB8fCAhaGFzT3duKHJhd1Byb3BzLCBrZXkpICYmIHRydWUpIHtcbiAgICAgICAgICBkZWxldGUgYXR0cnNba2V5XTtcbiAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChoYXNBdHRyc0NoYW5nZWQpIHtcbiAgICB0cmlnZ2VyKGluc3RhbmNlLCBcInNldFwiLCBcIiRhdHRyc1wiKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEZ1bGxQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIHByb3BzLCBhdHRycykge1xuICBjb25zdCBbb3B0aW9ucywgbmVlZENhc3RLZXlzXSA9IGluc3RhbmNlLnByb3BzT3B0aW9ucztcbiAgbGV0IGhhc0F0dHJzQ2hhbmdlZCA9IGZhbHNlO1xuICBsZXQgcmF3Q2FzdFZhbHVlcztcbiAgaWYgKHJhd1Byb3BzKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHJhd1Byb3BzKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gcmF3UHJvcHNba2V5XTtcbiAgICAgIGxldCBjYW1lbEtleTtcbiAgICAgIGlmIChvcHRpb25zICYmIGhhc093bihvcHRpb25zLCBjYW1lbEtleSA9IGNhbWVsaXplKGtleSkpKSB7XG4gICAgICAgIGlmICghbmVlZENhc3RLZXlzIHx8ICFuZWVkQ2FzdEtleXMuaW5jbHVkZXMoY2FtZWxLZXkpKSB7XG4gICAgICAgICAgcHJvcHNbY2FtZWxLZXldID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgKHJhd0Nhc3RWYWx1ZXMgfHwgKHJhd0Nhc3RWYWx1ZXMgPSB7fSkpW2NhbWVsS2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpc0VtaXRMaXN0ZW5lcihpbnN0YW5jZS5lbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIGF0dHJzKSB8fCB2YWx1ZSAhPT0gYXR0cnNba2V5XSkge1xuICAgICAgICAgIGF0dHJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICBoYXNBdHRyc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChuZWVkQ2FzdEtleXMpIHtcbiAgICBjb25zdCByYXdDdXJyZW50UHJvcHMgPSB0b1Jhdyhwcm9wcyk7XG4gICAgY29uc3QgY2FzdFZhbHVlcyA9IHJhd0Nhc3RWYWx1ZXMgfHwgRU1QVFlfT0JKO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVlZENhc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBuZWVkQ2FzdEtleXNbaV07XG4gICAgICBwcm9wc1trZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICBrZXksXG4gICAgICAgIGNhc3RWYWx1ZXNba2V5XSxcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICFoYXNPd24oY2FzdFZhbHVlcywga2V5KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhc0F0dHJzQ2hhbmdlZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQcm9wVmFsdWUob3B0aW9ucywgcHJvcHMsIGtleSwgdmFsdWUsIGluc3RhbmNlLCBpc0Fic2VudCkge1xuICBjb25zdCBvcHQgPSBvcHRpb25zW2tleV07XG4gIGlmIChvcHQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGhhc0RlZmF1bHQgPSBoYXNPd24ob3B0LCBcImRlZmF1bHRcIik7XG4gICAgaWYgKGhhc0RlZmF1bHQgJiYgdmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gb3B0LmRlZmF1bHQ7XG4gICAgICBpZiAob3B0LnR5cGUgIT09IEZ1bmN0aW9uICYmICFvcHQuc2tpcEZhY3RvcnkgJiYgaXNGdW5jdGlvbihkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHsgcHJvcHNEZWZhdWx0cyB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGlmIChrZXkgaW4gcHJvcHNEZWZhdWx0cykge1xuICAgICAgICAgIHZhbHVlID0gcHJvcHNEZWZhdWx0c1trZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XSA9IGRlZmF1bHRWYWx1ZS5jYWxsKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdFswIC8qIHNob3VsZENhc3QgKi9dKSB7XG4gICAgICBpZiAoaXNBYnNlbnQgJiYgIWhhc0RlZmF1bHQpIHtcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAob3B0WzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dICYmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpKSB7XG4gICAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQucHJvcHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLnByb3BzO1xuICBjb25zdCBub3JtYWxpemVkID0ge307XG4gIGNvbnN0IG5lZWRDYXN0S2V5cyA9IFtdO1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZFByb3BzID0gKHJhdzIpID0+IHtcbiAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgY29uc3QgW3Byb3BzLCBrZXlzXSA9IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGV4dGVuZChub3JtYWxpemVkLCBwcm9wcyk7XG4gICAgICBpZiAoa2V5cylcbiAgICAgICAgbmVlZENhc3RLZXlzLnB1c2goLi4ua2V5cyk7XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kUHJvcHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBFTVBUWV9BUlIpO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFlfQVJSO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzU3RyaW5nKHJhd1tpXSkpIHtcbiAgICAgICAgd2FybiQxKGBwcm9wcyBtdXN0IGJlIHN0cmluZ3Mgd2hlbiB1c2luZyBhcnJheSBzeW50YXguYCwgcmF3W2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShyYXdbaV0pO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkS2V5XSA9IEVNUFRZX09CSjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocmF3KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KHJhdykpIHtcbiAgICAgIHdhcm4kMShgaW52YWxpZCBwcm9wcyBvcHRpb25zYCwgcmF3KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJhd1trZXldO1xuICAgICAgICBjb25zdCBwcm9wID0gbm9ybWFsaXplZFtub3JtYWxpemVkS2V5XSA9IGlzQXJyYXkob3B0KSB8fCBpc0Z1bmN0aW9uKG9wdCkgPyB7IHR5cGU6IG9wdCB9IDogZXh0ZW5kKHt9LCBvcHQpO1xuICAgICAgICBpZiAocHJvcCkge1xuICAgICAgICAgIGNvbnN0IGJvb2xlYW5JbmRleCA9IGdldFR5cGVJbmRleChCb29sZWFuLCBwcm9wLnR5cGUpO1xuICAgICAgICAgIGNvbnN0IHN0cmluZ0luZGV4ID0gZ2V0VHlwZUluZGV4KFN0cmluZywgcHJvcC50eXBlKTtcbiAgICAgICAgICBwcm9wWzAgLyogc2hvdWxkQ2FzdCAqL10gPSBib29sZWFuSW5kZXggPiAtMTtcbiAgICAgICAgICBwcm9wWzEgLyogc2hvdWxkQ2FzdFRydWUgKi9dID0gc3RyaW5nSW5kZXggPCAwIHx8IGJvb2xlYW5JbmRleCA8IHN0cmluZ0luZGV4O1xuICAgICAgICAgIGlmIChib29sZWFuSW5kZXggPiAtMSB8fCBoYXNPd24ocHJvcCwgXCJkZWZhdWx0XCIpKSB7XG4gICAgICAgICAgICBuZWVkQ2FzdEtleXMucHVzaChub3JtYWxpemVkS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzID0gW25vcm1hbGl6ZWQsIG5lZWRDYXN0S2V5c107XG4gIGlmIChpc09iamVjdChjb21wKSkge1xuICAgIGNhY2hlLnNldChjb21wLCByZXMpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BOYW1lKGtleSkge1xuICBpZiAoa2V5WzBdICE9PSBcIiRcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgcHJvcCBuYW1lOiBcIiR7a2V5fVwiIGlzIGEgcmVzZXJ2ZWQgcHJvcGVydHkuYCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0VHlwZShjdG9yKSB7XG4gIGNvbnN0IG1hdGNoID0gY3RvciAmJiBjdG9yLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqKGZ1bmN0aW9ufGNsYXNzKSAoXFx3KykvKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiBjdG9yID09PSBudWxsID8gXCJudWxsXCIgOiBcIlwiO1xufVxuZnVuY3Rpb24gaXNTYW1lVHlwZShhLCBiKSB7XG4gIHJldHVybiBnZXRUeXBlKGEpID09PSBnZXRUeXBlKGIpO1xufVxuZnVuY3Rpb24gZ2V0VHlwZUluZGV4KHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKGlzQXJyYXkoZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlcy5maW5kSW5kZXgoKHQpID0+IGlzU2FtZVR5cGUodCwgdHlwZSkpO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwZWN0ZWRUeXBlcykpIHtcbiAgICByZXR1cm4gaXNTYW1lVHlwZShleHBlY3RlZFR5cGVzLCB0eXBlKSA/IDAgOiAtMTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzLCBwcm9wcywgaW5zdGFuY2UpIHtcbiAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0b1Jhdyhwcm9wcyk7XG4gIGNvbnN0IG9wdGlvbnMgPSBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF07XG4gIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcbiAgICBsZXQgb3B0ID0gb3B0aW9uc1trZXldO1xuICAgIGlmIChvcHQgPT0gbnVsbClcbiAgICAgIGNvbnRpbnVlO1xuICAgIHZhbGlkYXRlUHJvcChcbiAgICAgIGtleSxcbiAgICAgIHJlc29sdmVkVmFsdWVzW2tleV0sXG4gICAgICBvcHQsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHJlc29sdmVkVmFsdWVzKSA6IHJlc29sdmVkVmFsdWVzLFxuICAgICAgIWhhc093bihyYXdQcm9wcywga2V5KSAmJiAhaGFzT3duKHJhd1Byb3BzLCBoeXBoZW5hdGUoa2V5KSlcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AobmFtZSwgdmFsdWUsIHByb3AsIHByb3BzLCBpc0Fic2VudCkge1xuICBjb25zdCB7IHR5cGUsIHJlcXVpcmVkLCB2YWxpZGF0b3IsIHNraXBDaGVjayB9ID0gcHJvcDtcbiAgaWYgKHJlcXVpcmVkICYmIGlzQWJzZW50KSB7XG4gICAgd2FybiQxKCdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgJiYgIXJlcXVpcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSAhPT0gdHJ1ZSAmJiAhc2tpcENoZWNrKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBjb25zdCB0eXBlcyA9IGlzQXJyYXkodHlwZSkgPyB0eXBlIDogW3R5cGVdO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aCAmJiAhaXNWYWxpZDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbGlkLCBleHBlY3RlZFR5cGUgfSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVzW2ldKTtcbiAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChleHBlY3RlZFR5cGUgfHwgXCJcIik7XG4gICAgICBpc1ZhbGlkID0gdmFsaWQ7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgd2FybiQxKGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3IodmFsdWUsIHByb3BzKSkge1xuICAgIHdhcm4kMSgnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicpO1xuICB9XG59XG5jb25zdCBpc1NpbXBsZVR5cGUgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgXCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sLEJpZ0ludFwiXG4pO1xuZnVuY3Rpb24gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSkge1xuICBsZXQgdmFsaWQ7XG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChpc1NpbXBsZVR5cGUoZXhwZWN0ZWRUeXBlKSkge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICB2YWxpZCA9IGlzT2JqZWN0KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiQXJyYXlcIikge1xuICAgIHZhbGlkID0gaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBcIm51bGxcIikge1xuICAgIHZhbGlkID0gdmFsdWUgPT09IG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYFByb3AgdHlwZSBbXSBmb3IgcHJvcCBcIiR7bmFtZX1cIiB3b24ndCBtYXRjaCBhbnl0aGluZy4gRGlkIHlvdSBtZWFuIHRvIHVzZSB0eXBlIEFycmF5IGluc3RlYWQ/YDtcbiAgfVxuICBsZXQgbWVzc2FnZSA9IGBJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJHtuYW1lfVwiLiBFeHBlY3RlZCAke2V4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oXCIgfCBcIil9YDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlc1swXTtcbiAgY29uc3QgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCByZWNlaXZlZFR5cGUpO1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiYgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiYgIWlzQm9vbGVhbihleHBlY3RlZFR5cGUsIHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGAgd2l0aCB2YWx1ZSAke2V4cGVjdGVkVmFsdWV9YDtcbiAgfVxuICBtZXNzYWdlICs9IGAsIGdvdCAke3JlY2VpdmVkVHlwZX0gYDtcbiAgaWYgKGlzRXhwbGljYWJsZShyZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9LmA7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5mdW5jdGlvbiBzdHlsZVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSBcIlN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiTnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7TnVtYmVyKHZhbHVlKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5mdW5jdGlvbiBpc0V4cGxpY2FibGUodHlwZSkge1xuICBjb25zdCBleHBsaWNpdFR5cGVzID0gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZSgoZWxlbSkgPT4gdHlwZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtKTtcbn1cbmZ1bmN0aW9uIGlzQm9vbGVhbiguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGVsZW0pID0+IGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gXCJib29sZWFuXCIpO1xufVxuXG5jb25zdCBpc0ludGVybmFsS2V5ID0gKGtleSkgPT4ga2V5WzBdID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJHN0YWJsZVwiO1xuY29uc3Qgbm9ybWFsaXplU2xvdFZhbHVlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWTm9kZSkgOiBbbm9ybWFsaXplVk5vZGUodmFsdWUpXTtcbmNvbnN0IG5vcm1hbGl6ZVNsb3QgPSAoa2V5LCByYXdTbG90LCBjdHgpID0+IHtcbiAgaWYgKHJhd1Nsb3QuX24pIHtcbiAgICByZXR1cm4gcmF3U2xvdDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gd2l0aEN0eCgoLi4uYXJncykgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRJbnN0YW5jZSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgU2xvdCBcIiR7a2V5fVwiIGludm9rZWQgb3V0c2lkZSBvZiB0aGUgcmVuZGVyIGZ1bmN0aW9uOiB0aGlzIHdpbGwgbm90IHRyYWNrIGRlcGVuZGVuY2llcyB1c2VkIGluIHRoZSBzbG90LiBJbnZva2UgdGhlIHNsb3QgZnVuY3Rpb24gaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplU2xvdFZhbHVlKHJhd1Nsb3QoLi4uYXJncykpO1xuICB9LCBjdHgpO1xuICBub3JtYWxpemVkLl9jID0gZmFsc2U7XG4gIHJldHVybiBub3JtYWxpemVkO1xufTtcbmNvbnN0IG5vcm1hbGl6ZU9iamVjdFNsb3RzID0gKHJhd1Nsb3RzLCBzbG90cywgaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgY3R4ID0gcmF3U2xvdHMuX2N0eDtcbiAgZm9yIChjb25zdCBrZXkgaW4gcmF3U2xvdHMpIHtcbiAgICBpZiAoaXNJbnRlcm5hbEtleShrZXkpKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgdmFsdWUgPSByYXdTbG90c1trZXldO1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgc2xvdHNba2V5XSA9IG5vcm1hbGl6ZVNsb3Qoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHRydWUpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBOb24tZnVuY3Rpb24gdmFsdWUgZW5jb3VudGVyZWQgZm9yIHNsb3QgXCIke2tleX1cIi4gUHJlZmVyIGZ1bmN0aW9uIHNsb3RzIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVNsb3RWYWx1ZSh2YWx1ZSk7XG4gICAgICBzbG90c1trZXldID0gKCkgPT4gbm9ybWFsaXplZDtcbiAgICB9XG4gIH1cbn07XG5jb25zdCBub3JtYWxpemVWTm9kZVNsb3RzID0gKGluc3RhbmNlLCBjaGlsZHJlbikgPT4ge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNLZWVwQWxpdmUoaW5zdGFuY2Uudm5vZGUpICYmIHRydWUpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBkZWZhdWx0IHNsb3QuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUoY2hpbGRyZW4pO1xuICBpbnN0YW5jZS5zbG90cy5kZWZhdWx0ID0gKCkgPT4gbm9ybWFsaXplZDtcbn07XG5jb25zdCBpbml0U2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuKSA9PiB7XG4gIGlmIChpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpbnN0YW5jZS5zbG90cyA9IHRvUmF3KGNoaWxkcmVuKTtcbiAgICAgIGRlZihjaGlsZHJlbiwgXCJfXCIsIHR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVPYmplY3RTbG90cyhcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIGluc3RhbmNlLnNsb3RzID0ge30pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnN0YW5jZS5zbG90cyA9IHt9O1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIH1cbiAgfVxuICBkZWYoaW5zdGFuY2Uuc2xvdHMsIEludGVybmFsT2JqZWN0S2V5LCAxKTtcbn07XG5jb25zdCB1cGRhdGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCB7IHZub2RlLCBzbG90cyB9ID0gaW5zdGFuY2U7XG4gIGxldCBuZWVkRGVsZXRpb25DaGVjayA9IHRydWU7XG4gIGxldCBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXQgPSBFTVBUWV9PQko7XG4gIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAzMikge1xuICAgIGNvbnN0IHR5cGUgPSBjaGlsZHJlbi5fO1xuICAgIGlmICh0eXBlKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICB0cmlnZ2VyKGluc3RhbmNlLCBcInNldFwiLCBcIiRzbG90c1wiKTtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW1pemVkICYmIHR5cGUgPT09IDEpIHtcbiAgICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4dGVuZChzbG90cywgY2hpbGRyZW4pO1xuICAgICAgICBpZiAoIW9wdGltaXplZCAmJiB0eXBlID09PSAxKSB7XG4gICAgICAgICAgZGVsZXRlIHNsb3RzLl87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmVlZERlbGV0aW9uQ2hlY2sgPSAhY2hpbGRyZW4uJHN0YWJsZTtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICAgIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldCA9IHsgZGVmYXVsdDogMSB9O1xuICB9XG4gIGlmIChuZWVkRGVsZXRpb25DaGVjaykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNsb3RzKSB7XG4gICAgICBpZiAoIWlzSW50ZXJuYWxLZXkoa2V5KSAmJiBkZWxldGlvbkNvbXBhcmlzb25UYXJnZXRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSBzbG90c1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gc2V0UmVmKHJhd1JlZiwgb2xkUmF3UmVmLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIGlzVW5tb3VudCA9IGZhbHNlKSB7XG4gIGlmIChpc0FycmF5KHJhd1JlZikpIHtcbiAgICByYXdSZWYuZm9yRWFjaChcbiAgICAgIChyLCBpKSA9PiBzZXRSZWYoXG4gICAgICAgIHIsXG4gICAgICAgIG9sZFJhd1JlZiAmJiAoaXNBcnJheShvbGRSYXdSZWYpID8gb2xkUmF3UmVmW2ldIDogb2xkUmF3UmVmKSxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBpc1VubW91bnRcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaXNBc3luY1dyYXBwZXIodm5vZGUpICYmICFpc1VubW91bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVmVmFsdWUgPSB2bm9kZS5zaGFwZUZsYWcgJiA0ID8gZ2V0RXhwb3NlUHJveHkodm5vZGUuY29tcG9uZW50KSB8fCB2bm9kZS5jb21wb25lbnQucHJveHkgOiB2bm9kZS5lbDtcbiAgY29uc3QgdmFsdWUgPSBpc1VubW91bnQgPyBudWxsIDogcmVmVmFsdWU7XG4gIGNvbnN0IHsgaTogb3duZXIsIHI6IHJlZiB9ID0gcmF3UmVmO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhb3duZXIpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgTWlzc2luZyByZWYgb3duZXIgY29udGV4dC4gcmVmIGNhbm5vdCBiZSB1c2VkIG9uIGhvaXN0ZWQgdm5vZGVzLiBBIHZub2RlIHdpdGggcmVmIG11c3QgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbi5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2xkUmVmID0gb2xkUmF3UmVmICYmIG9sZFJhd1JlZi5yO1xuICBjb25zdCByZWZzID0gb3duZXIucmVmcyA9PT0gRU1QVFlfT0JKID8gb3duZXIucmVmcyA9IHt9IDogb3duZXIucmVmcztcbiAgY29uc3Qgc2V0dXBTdGF0ZSA9IG93bmVyLnNldHVwU3RhdGU7XG4gIGlmIChvbGRSZWYgIT0gbnVsbCAmJiBvbGRSZWYgIT09IHJlZikge1xuICAgIGlmIChpc1N0cmluZyhvbGRSZWYpKSB7XG4gICAgICByZWZzW29sZFJlZl0gPSBudWxsO1xuICAgICAgaWYgKGhhc093bihzZXR1cFN0YXRlLCBvbGRSZWYpKSB7XG4gICAgICAgIHNldHVwU3RhdGVbb2xkUmVmXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihyZWYpKSB7XG4gICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKHJlZiwgb3duZXIsIDEyLCBbdmFsdWUsIHJlZnNdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBfaXNTdHJpbmcgPSBpc1N0cmluZyhyZWYpO1xuICAgIGNvbnN0IF9pc1JlZiA9IGlzUmVmKHJlZik7XG4gICAgaWYgKF9pc1N0cmluZyB8fCBfaXNSZWYpIHtcbiAgICAgIGNvbnN0IGRvU2V0ID0gKCkgPT4ge1xuICAgICAgICBpZiAocmF3UmVmLmYpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IF9pc1N0cmluZyA/IGhhc093bihzZXR1cFN0YXRlLCByZWYpID8gc2V0dXBTdGF0ZVtyZWZdIDogcmVmc1tyZWZdIDogcmVmLnZhbHVlO1xuICAgICAgICAgIGlmIChpc1VubW91bnQpIHtcbiAgICAgICAgICAgIGlzQXJyYXkoZXhpc3RpbmcpICYmIHJlbW92ZShleGlzdGluZywgcmVmVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyYXkoZXhpc3RpbmcpKSB7XG4gICAgICAgICAgICAgIGlmIChfaXNTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICByZWZzW3JlZl0gPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSkge1xuICAgICAgICAgICAgICAgICAgc2V0dXBTdGF0ZVtyZWZdID0gcmVmc1tyZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWYudmFsdWUgPSBbcmVmVmFsdWVdO1xuICAgICAgICAgICAgICAgIGlmIChyYXdSZWYuaylcbiAgICAgICAgICAgICAgICAgIHJlZnNbcmF3UmVmLmtdID0gcmVmLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhyZWZWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaChyZWZWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgIHJlZnNbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChoYXNPd24oc2V0dXBTdGF0ZSwgcmVmKSkge1xuICAgICAgICAgICAgc2V0dXBTdGF0ZVtyZWZdID0gdmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9pc1JlZikge1xuICAgICAgICAgIHJlZi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChyYXdSZWYuaylcbiAgICAgICAgICAgIHJlZnNbcmF3UmVmLmtdID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRvU2V0LmlkID0gLTE7XG4gICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChkb1NldCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9TZXQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShcIkludmFsaWQgdGVtcGxhdGUgcmVmIHR5cGU6XCIsIHJlZiwgYCgke3R5cGVvZiByZWZ9KWApO1xuICAgIH1cbiAgfVxufVxuXG5sZXQgaGFzTWlzbWF0Y2ggPSBmYWxzZTtcbmNvbnN0IGlzU1ZHQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcInN2Z1wiKSAmJiBjb250YWluZXIudGFnTmFtZSAhPT0gXCJmb3JlaWduT2JqZWN0XCI7XG5jb25zdCBpc01hdGhNTENvbnRhaW5lciA9IChjb250YWluZXIpID0+IGNvbnRhaW5lci5uYW1lc3BhY2VVUkkuaW5jbHVkZXMoXCJNYXRoTUxcIik7XG5jb25zdCBnZXRDb250YWluZXJUeXBlID0gKGNvbnRhaW5lcikgPT4ge1xuICBpZiAoaXNTVkdDb250YWluZXIoY29udGFpbmVyKSlcbiAgICByZXR1cm4gXCJzdmdcIjtcbiAgaWYgKGlzTWF0aE1MQ29udGFpbmVyKGNvbnRhaW5lcikpXG4gICAgcmV0dXJuIFwibWF0aG1sXCI7XG4gIHJldHVybiB2b2lkIDA7XG59O1xuY29uc3QgaXNDb21tZW50ID0gKG5vZGUpID0+IG5vZGUubm9kZVR5cGUgPT09IDggLyogQ09NTUVOVCAqLztcbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvbkZ1bmN0aW9ucyhyZW5kZXJlckludGVybmFscykge1xuICBjb25zdCB7XG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIHA6IHBhdGNoLFxuICAgIG86IHtcbiAgICAgIHBhdGNoUHJvcCxcbiAgICAgIGNyZWF0ZVRleHQsXG4gICAgICBuZXh0U2libGluZyxcbiAgICAgIHBhcmVudE5vZGUsXG4gICAgICByZW1vdmUsXG4gICAgICBpbnNlcnQsXG4gICAgICBjcmVhdGVDb21tZW50XG4gICAgfVxuICB9ID0gcmVuZGVyZXJJbnRlcm5hbHM7XG4gIGNvbnN0IGh5ZHJhdGUgPSAodm5vZGUsIGNvbnRhaW5lcikgPT4ge1xuICAgIGlmICghY29udGFpbmVyLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIGh5ZHJhdGUgZXhpc3RpbmcgbWFya3VwIGJ1dCBjb250YWluZXIgaXMgZW1wdHkuIFBlcmZvcm1pbmcgZnVsbCBtb3VudCBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgICBwYXRjaChudWxsLCB2bm9kZSwgY29udGFpbmVyKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhhc01pc21hdGNoID0gZmFsc2U7XG4gICAgaHlkcmF0ZU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQsIHZub2RlLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICBpZiAoaGFzTWlzbWF0Y2ggJiYgdHJ1ZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgSHlkcmF0aW9uIGNvbXBsZXRlZCBidXQgY29udGFpbnMgbWlzbWF0Y2hlcy5gKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVOb2RlID0gKG5vZGUsIHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgaXNGcmFnbWVudFN0YXJ0ID0gaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJbXCI7XG4gICAgY29uc3Qgb25NaXNtYXRjaCA9ICgpID0+IGhhbmRsZU1pc21hdGNoKFxuICAgICAgbm9kZSxcbiAgICAgIHZub2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBpc0ZyYWdtZW50U3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcsIHBhdGNoRmxhZyB9ID0gdm5vZGU7XG4gICAgbGV0IGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgIHZub2RlLmVsID0gbm9kZTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGlmICghKFwiX192bm9kZVwiIGluIG5vZGUpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCBcIl9fdm5vZGVcIiwge1xuICAgICAgICAgIHZhbHVlOiB2bm9kZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghKFwiX192dWVQYXJlbnRDb21wb25lbnRcIiBpbiBub2RlKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9kZSwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCB7XG4gICAgICAgICAgdmFsdWU6IHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgbGV0IG5leHROb2RlID0gbnVsbDtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgaWYgKGRvbVR5cGUgIT09IDMgLyogVEVYVCAqLykge1xuICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgaW5zZXJ0KHZub2RlLmVsID0gY3JlYXRlVGV4dChcIlwiKSwgcGFyZW50Tm9kZShub2RlKSwgbm9kZSk7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5vZGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gb25NaXNtYXRjaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobm9kZS5kYXRhICE9PSB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiB3YXJuJDEoXG4gICAgICAgICAgICAgIGBIeWRyYXRpb24gdGV4dCBtaXNtYXRjaCBpbmAsXG4gICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBub2RlLmRhdGFcbiAgICAgICAgICAgICAgKX1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7SlNPTi5zdHJpbmdpZnkodm5vZGUuY2hpbGRyZW4pfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBub2RlLmRhdGEgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQ29tbWVudDpcbiAgICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgICByZXBsYWNlTm9kZShcbiAgICAgICAgICAgIHZub2RlLmVsID0gbm9kZS5jb250ZW50LmZpcnN0Q2hpbGQsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChkb21UeXBlICE9PSA4IC8qIENPTU1FTlQgKi8gfHwgaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RhdGljOlxuICAgICAgICBpZiAoaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICAgIGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21UeXBlID09PSAxIC8qIEVMRU1FTlQgKi8gfHwgZG9tVHlwZSA9PT0gMyAvKiBURVhUICovKSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIGNvbnN0IG5lZWRUb0Fkb3B0Q29udGVudCA9ICF2bm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2bm9kZS5zdGF0aWNDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAobmVlZFRvQWRvcHRDb250ZW50KVxuICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbiArPSBuZXh0Tm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBFTEVNRU5UICovID8gbmV4dE5vZGUub3V0ZXJIVE1MIDogbmV4dE5vZGUuZGF0YTtcbiAgICAgICAgICAgIGlmIChpID09PSB2bm9kZS5zdGF0aWNDb3VudCAtIDEpIHtcbiAgICAgICAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5leHROb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlzRnJhZ21lbnRTdGFydCA/IG5leHRTaWJsaW5nKG5leHROb2RlKSA6IG5leHROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgICAgIGlmICghaXNGcmFnbWVudFN0YXJ0KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSBoeWRyYXRlRnJhZ21lbnQoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMSkge1xuICAgICAgICAgIGlmICgoZG9tVHlwZSAhPT0gMSAvKiBFTEVNRU5UICovIHx8IHZub2RlLnR5cGUudG9Mb3dlckNhc2UoKSAhPT0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpICYmICFpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHZub2RlLnNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcztcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwidGVsZXBvcnQgc3RhcnRcIikge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUsIG5vZGUuZGF0YSwgXCJ0ZWxlcG9ydCBlbmRcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlcih2bm9kZSkpIHtcbiAgICAgICAgICAgIGxldCBzdWJUcmVlO1xuICAgICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gY3JlYXRlVk5vZGUoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICBzdWJUcmVlLmFuY2hvciA9IG5leHROb2RlID8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nIDogY29udGFpbmVyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBub2RlLm5vZGVUeXBlID09PSAzID8gY3JlYXRlVGV4dFZOb2RlKFwiXCIpIDogY3JlYXRlVk5vZGUoXCJkaXZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJUcmVlLmVsID0gbm9kZTtcbiAgICAgICAgICAgIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlID0gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gOCAvKiBDT01NRU5UICovKSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSB2bm9kZS50eXBlLmh5ZHJhdGUoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICAgIGh5ZHJhdGVDaGlsZHJlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgICAgICAgbmV4dE5vZGUgPSB2bm9kZS50eXBlLmh5ZHJhdGUoXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIGdldENvbnRhaW5lclR5cGUocGFyZW50Tm9kZShub2RlKSksXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICByZW5kZXJlckludGVybmFscyxcbiAgICAgICAgICAgIGh5ZHJhdGVOb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykge1xuICAgICAgICAgIHdhcm4kMShcIkludmFsaWQgSG9zdFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICBzZXRSZWYocmVmLCBudWxsLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dE5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVFbGVtZW50ID0gKGVsLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISF2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgeyB0eXBlLCBwcm9wcywgcGF0Y2hGbGFnLCBzaGFwZUZsYWcsIGRpcnMsIHRyYW5zaXRpb24gfSA9IHZub2RlO1xuICAgIGNvbnN0IGZvcmNlUGF0Y2ggPSB0eXBlID09PSBcImlucHV0XCIgfHwgdHlwZSA9PT0gXCJvcHRpb25cIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBmb3JjZVBhdGNoIHx8IHBhdGNoRmxhZyAhPT0gLTEpIHtcbiAgICAgIGlmIChkaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJjcmVhdGVkXCIpO1xuICAgICAgfVxuICAgICAgbGV0IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzID0gZmFsc2U7XG4gICAgICBpZiAoaXNUZW1wbGF0ZU5vZGUoZWwpKSB7XG4gICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzID0gbmVlZFRyYW5zaXRpb24ocGFyZW50U3VzcGVuc2UsIHRyYW5zaXRpb24pICYmIHBhcmVudENvbXBvbmVudCAmJiBwYXJlbnRDb21wb25lbnQudm5vZGUucHJvcHMgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzLmFwcGVhcjtcbiAgICAgICAgY29uc3QgY29udGVudCA9IGVsLmNvbnRlbnQuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXBsYWNlTm9kZShjb250ZW50LCBlbCwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgdm5vZGUuZWwgPSBlbCA9IGNvbnRlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoc2hhcGVGbGFnICYgMTYgJiYgLy8gc2tpcCBpZiBlbGVtZW50IGhhcyBpbm5lckhUTUwgLyB0ZXh0Q29udGVudFxuICAgICAgIShwcm9wcyAmJiAocHJvcHMuaW5uZXJIVE1MIHx8IHByb3BzLnRleHRDb250ZW50KSkpIHtcbiAgICAgICAgbGV0IG5leHQgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgZWwuZmlyc3RDaGlsZCxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICBsZXQgaGFzV2FybmVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBgXG5TZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhhc1dhcm5lZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGN1ciA9IG5leHQ7XG4gICAgICAgICAgbmV4dCA9IG5leHQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgcmVtb3ZlKGN1cik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgICBpZiAoZWwudGV4dENvbnRlbnQgIT09IHZub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgYEh5ZHJhdGlvbiB0ZXh0IGNvbnRlbnQgbWlzbWF0Y2ggb25gLFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2VsLnRleHRDb250ZW50fVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHt2bm9kZS5jaGlsZHJlbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZm9yY2VQYXRjaCB8fCAhb3B0aW1pemVkIHx8IHBhdGNoRmxhZyAmICgxNiB8IDMyKSkge1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBwcm9wSGFzTWlzbWF0Y2goZWwsIGtleSwgcHJvcHNba2V5XSwgdm5vZGUpKSB7XG4gICAgICAgICAgICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3JjZVBhdGNoICYmIChrZXkuZW5kc1dpdGgoXCJ2YWx1ZVwiKSB8fCBrZXkgPT09IFwiaW5kZXRlcm1pbmF0ZVwiKSB8fCBpc09uKGtleSkgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkgfHwgLy8gZm9yY2UgaHlkcmF0ZSB2LWJpbmQgd2l0aCAucHJvcCBtb2RpZmllcnNcbiAgICAgICAgICAgIGtleVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICAgICAgcGF0Y2hQcm9wKFxuICAgICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHByb3BzW2tleV0sXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMub25DbGljaykge1xuICAgICAgICAgIHBhdGNoUHJvcChcbiAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgXCJvbkNsaWNrXCIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcHJvcHMub25DbGljayxcbiAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCB2bm9kZUhvb2tzO1xuICAgICAgaWYgKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpIHtcbiAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgfVxuICAgICAgaWYgKGRpcnMpIHtcbiAgICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZU1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKCh2bm9kZUhvb2tzID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IGRpcnMgfHwgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MpIHtcbiAgICAgICAgcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoKCkgPT4ge1xuICAgICAgICAgIHZub2RlSG9va3MgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9va3MsIHBhcmVudENvbXBvbmVudCwgdm5vZGUpO1xuICAgICAgICAgIG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzICYmIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsLm5leHRTaWJsaW5nO1xuICB9O1xuICBjb25zdCBoeWRyYXRlQ2hpbGRyZW4gPSAobm9kZSwgcGFyZW50Vk5vZGUsIGNvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISFwYXJlbnRWTm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnRWTm9kZS5jaGlsZHJlbjtcbiAgICBjb25zdCBsID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgIGxldCBoYXNXYXJuZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgY29uc3Qgdm5vZGUgPSBvcHRpbWl6ZWQgPyBjaGlsZHJlbltpXSA6IGNoaWxkcmVuW2ldID0gbm9ybWFsaXplVk5vZGUoY2hpbGRyZW5baV0pO1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgbm9kZSA9IGh5ZHJhdGVOb2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodm5vZGUudHlwZSA9PT0gVGV4dCAmJiAhdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYXNNaXNtYXRjaCA9IHRydWU7XG4gICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIG9uYCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGBcblNlcnZlciByZW5kZXJlZCBlbGVtZW50IGNvbnRhaW5zIGZld2VyIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICk7XG4gICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRnJhZ21lbnQgPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgeyBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSB2bm9kZTtcbiAgICBpZiAoZnJhZ21lbnRTbG90U2NvcGVJZHMpIHtcbiAgICAgIHNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcyA/IHNsb3RTY29wZUlkcy5jb25jYXQoZnJhZ21lbnRTbG90U2NvcGVJZHMpIDogZnJhZ21lbnRTbG90U2NvcGVJZHM7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHBhcmVudE5vZGUobm9kZSk7XG4gICAgY29uc3QgbmV4dCA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgIG5leHRTaWJsaW5nKG5vZGUpLFxuICAgICAgdm5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgIG9wdGltaXplZFxuICAgICk7XG4gICAgaWYgKG5leHQgJiYgaXNDb21tZW50KG5leHQpICYmIG5leHQuZGF0YSA9PT0gXCJdXCIpIHtcbiAgICAgIHJldHVybiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IgPSBuZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzTWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgaW5zZXJ0KHZub2RlLmFuY2hvciA9IGNyZWF0ZUNvbW1lbnQoYF1gKSwgY29udGFpbmVyLCBuZXh0KTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlTWlzbWF0Y2ggPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgaXNGcmFnbWVudCkgPT4ge1xuICAgIGhhc01pc21hdGNoID0gdHJ1ZTtcbiAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgIGBIeWRyYXRpb24gbm9kZSBtaXNtYXRjaDpcbi0gcmVuZGVyZWQgb24gc2VydmVyOmAsXG4gICAgICBub2RlLFxuICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMyAvKiBURVhUICovID8gYCh0ZXh0KWAgOiBpc0NvbW1lbnQobm9kZSkgJiYgbm9kZS5kYXRhID09PSBcIltcIiA/IGAoc3RhcnQgb2YgZnJhZ21lbnQpYCA6IGBgLFxuICAgICAgYFxuLSBleHBlY3RlZCBvbiBjbGllbnQ6YCxcbiAgICAgIHZub2RlLnR5cGVcbiAgICApO1xuICAgIHZub2RlLmVsID0gbnVsbDtcbiAgICBpZiAoaXNGcmFnbWVudCkge1xuICAgICAgY29uc3QgZW5kID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5leHQyID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGlmIChuZXh0MiAmJiBuZXh0MiAhPT0gZW5kKSB7XG4gICAgICAgICAgcmVtb3ZlKG5leHQyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICByZW1vdmUobm9kZSk7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUsXG4gICAgICBjb250YWluZXIsXG4gICAgICBuZXh0LFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICBzbG90U2NvcGVJZHNcbiAgICApO1xuICAgIHJldHVybiBuZXh0O1xuICB9O1xuICBjb25zdCBsb2NhdGVDbG9zaW5nQW5jaG9yID0gKG5vZGUsIG9wZW4gPSBcIltcIiwgY2xvc2UgPSBcIl1cIikgPT4ge1xuICAgIGxldCBtYXRjaCA9IDA7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIG5vZGUgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgIGlmIChub2RlICYmIGlzQ29tbWVudChub2RlKSkge1xuICAgICAgICBpZiAobm9kZS5kYXRhID09PSBvcGVuKVxuICAgICAgICAgIG1hdGNoKys7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IGNsb3NlKSB7XG4gICAgICAgICAgaWYgKG1hdGNoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBjb25zdCByZXBsYWNlTm9kZSA9IChuZXdOb2RlLCBvbGROb2RlLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBjb25zdCBwYXJlbnROb2RlMiA9IG9sZE5vZGUucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZTIpIHtcbiAgICAgIHBhcmVudE5vZGUyLnJlcGxhY2VDaGlsZChuZXdOb2RlLCBvbGROb2RlKTtcbiAgICB9XG4gICAgbGV0IHBhcmVudCA9IHBhcmVudENvbXBvbmVudDtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LnZub2RlLmVsID09PSBvbGROb2RlKSB7XG4gICAgICAgIHBhcmVudC52bm9kZS5lbCA9IHBhcmVudC5zdWJUcmVlLmVsID0gbmV3Tm9kZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1RlbXBsYXRlTm9kZSA9IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgLyogRUxFTUVOVCAqLyAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZW1wbGF0ZVwiO1xuICB9O1xuICByZXR1cm4gW2h5ZHJhdGUsIGh5ZHJhdGVOb2RlXTtcbn1cbmZ1bmN0aW9uIHByb3BIYXNNaXNtYXRjaChlbCwga2V5LCBjbGllbnRWYWx1ZSwgdm5vZGUpIHtcbiAgbGV0IG1pc21hdGNoVHlwZTtcbiAgbGV0IG1pc21hdGNoS2V5O1xuICBsZXQgYWN0dWFsO1xuICBsZXQgZXhwZWN0ZWQ7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSBtaXNtYXRjaEtleSA9IGBjbGFzc2A7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgYWN0dWFsID0gZWwuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgZXhwZWN0ZWQgPSBpc1N0cmluZyhjbGllbnRWYWx1ZSkgPyBjbGllbnRWYWx1ZSA6IHN0cmluZ2lmeVN0eWxlKG5vcm1hbGl6ZVN0eWxlKGNsaWVudFZhbHVlKSk7XG4gICAgY29uc3QgYWN0dWFsTWFwID0gdG9TdHlsZU1hcChhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkTWFwID0gdG9TdHlsZU1hcChleHBlY3RlZCk7XG4gICAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICAgIGZvciAoY29uc3QgeyBkaXIsIHZhbHVlIH0gb2Ygdm5vZGUuZGlycykge1xuICAgICAgICBpZiAoZGlyLm5hbWUgPT09IFwic2hvd1wiICYmICF2YWx1ZSkge1xuICAgICAgICAgIGV4cGVjdGVkTWFwLnNldChcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNNYXBFcXVhbChhY3R1YWxNYXAsIGV4cGVjdGVkTWFwKSkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gbWlzbWF0Y2hLZXkgPSBcInN0eWxlXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGVsIGluc3RhbmNlb2YgU1ZHRWxlbWVudCAmJiBpc0tub3duU3ZnQXR0cihrZXkpIHx8IGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgKGlzQm9vbGVhbkF0dHIoa2V5KSB8fCBpc0tub3duSHRtbEF0dHIoa2V5KSkpIHtcbiAgICBpZiAoaXNCb29sZWFuQXR0cihrZXkpKSB7XG4gICAgICBhY3R1YWwgPSBlbC5oYXNBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGV4cGVjdGVkID0gaW5jbHVkZUJvb2xlYW5BdHRyKGNsaWVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsLmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VydmVyVmFsdWUgPSBlbFtrZXldO1xuICAgICAgICBhY3R1YWwgPSBpc09iamVjdChzZXJ2ZXJWYWx1ZSkgfHwgc2VydmVyVmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoc2VydmVyVmFsdWUpO1xuICAgICAgfVxuICAgICAgZXhwZWN0ZWQgPSBpc09iamVjdChjbGllbnRWYWx1ZSkgfHwgY2xpZW50VmFsdWUgPT0gbnVsbCA/IFwiXCIgOiBTdHJpbmcoY2xpZW50VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gYGF0dHJpYnV0ZWA7XG4gICAgICBtaXNtYXRjaEtleSA9IGtleTtcbiAgICB9XG4gIH1cbiAgaWYgKG1pc21hdGNoVHlwZSkge1xuICAgIGNvbnN0IGZvcm1hdCA9ICh2KSA9PiB2ID09PSBmYWxzZSA/IGAobm90IHJlbmRlcmVkKWAgOiBgJHttaXNtYXRjaEtleX09XCIke3Z9XCJgO1xuICAgIGNvbnN0IHByZVNlZ21lbnQgPSBgSHlkcmF0aW9uICR7bWlzbWF0Y2hUeXBlfSBtaXNtYXRjaCBvbmA7XG4gICAgY29uc3QgcG9zdFNlZ21lbnQgPSBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2Zvcm1hdChhY3R1YWwpfVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHtmb3JtYXQoZXhwZWN0ZWQpfVxuICBOb3RlOiB0aGlzIG1pc21hdGNoIGlzIGNoZWNrLW9ubHkuIFRoZSBET00gd2lsbCBub3QgYmUgcmVjdGlmaWVkIGluIHByb2R1Y3Rpb24gZHVlIHRvIHBlcmZvcm1hbmNlIG92ZXJoZWFkLlxuICBZb3Ugc2hvdWxkIGZpeCB0aGUgc291cmNlIG9mIHRoZSBtaXNtYXRjaC5gO1xuICAgIHtcbiAgICAgIHdhcm4kMShwcmVTZWdtZW50LCBlbCwgcG9zdFNlZ21lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB0b0NsYXNzU2V0KHN0cikge1xuICByZXR1cm4gbmV3IFNldChzdHIudHJpbSgpLnNwbGl0KC9cXHMrLykpO1xufVxuZnVuY3Rpb24gaXNTZXRFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IHMgb2YgYSkge1xuICAgIGlmICghYi5oYXMocykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB0b1N0eWxlTWFwKHN0cikge1xuICBjb25zdCBzdHlsZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBzdHIuc3BsaXQoXCI7XCIpKSB7XG4gICAgbGV0IFtrZXksIHZhbHVlXSA9IGl0ZW0uc3BsaXQoXCI6XCIpO1xuICAgIGtleSA9IGtleSA9PSBudWxsID8gdm9pZCAwIDoga2V5LnRyaW0oKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09IG51bGwgPyB2b2lkIDAgOiB2YWx1ZS50cmltKCk7XG4gICAgaWYgKGtleSAmJiB2YWx1ZSkge1xuICAgICAgc3R5bGVNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3R5bGVNYXA7XG59XG5mdW5jdGlvbiBpc01hcEVxdWFsKGEsIGIpIHtcbiAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGEpIHtcbiAgICBpZiAodmFsdWUgIT09IGIuZ2V0KGtleSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmxldCBzdXBwb3J0ZWQ7XG5sZXQgcGVyZjtcbmZ1bmN0aW9uIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgdHlwZSkge1xuICBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcucGVyZm9ybWFuY2UgJiYgaXNTdXBwb3J0ZWQoKSkge1xuICAgIHBlcmYubWFyayhgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YCk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNQZXJmU3RhcnQoaW5zdGFuY2UsIHR5cGUsIGlzU3VwcG9ydGVkKCkgPyBwZXJmLm5vdygpIDogRGF0ZS5ub3coKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVuZE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBjb25zdCBzdGFydFRhZyA9IGB2dWUtJHt0eXBlfS0ke2luc3RhbmNlLnVpZH1gO1xuICAgIGNvbnN0IGVuZFRhZyA9IHN0YXJ0VGFnICsgYDplbmRgO1xuICAgIHBlcmYubWFyayhlbmRUYWcpO1xuICAgIHBlcmYubWVhc3VyZShcbiAgICAgIGA8JHtmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBpbnN0YW5jZS50eXBlKX0+ICR7dHlwZX1gLFxuICAgICAgc3RhcnRUYWcsXG4gICAgICBlbmRUYWdcbiAgICApO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7XG4gICAgcGVyZi5jbGVhck1hcmtzKGVuZFRhZyk7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgZGV2dG9vbHNQZXJmRW5kKGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBpc1N1cHBvcnRlZCgpIHtcbiAgaWYgKHN1cHBvcnRlZCAhPT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuIHN1cHBvcnRlZDtcbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cucGVyZm9ybWFuY2UpIHtcbiAgICBzdXBwb3J0ZWQgPSB0cnVlO1xuICAgIHBlcmYgPSB3aW5kb3cucGVyZm9ybWFuY2U7XG4gIH0gZWxzZSB7XG4gICAgc3VwcG9ydGVkID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHN1cHBvcnRlZDtcbn1cblxuZnVuY3Rpb24gaW5pdEZlYXR1cmVGbGFncygpIHtcbiAgY29uc3QgbmVlZFdhcm4gPSBbXTtcbiAgaWYgKHR5cGVvZiBfX1ZVRV9PUFRJT05TX0FQSV9fICE9PSBcImJvb2xlYW5cIikge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ucHVzaChgX19WVUVfT1BUSU9OU19BUElfX2ApO1xuICAgIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9PUFRJT05TX0FQSV9fID0gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIF9fVlVFX1BST0RfREVWVE9PTFNfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX1BST0RfREVWVE9PTFNfX2ApO1xuICAgIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9QUk9EX0RFVlRPT0xTX18gPSBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfX2ApO1xuICAgIGdldEdsb2JhbFRoaXMoKS5fX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18gPSBmYWxzZTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5sZW5ndGgpIHtcbiAgICBjb25zdCBtdWx0aSA9IG5lZWRXYXJuLmxlbmd0aCA+IDE7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYEZlYXR1cmUgZmxhZyR7bXVsdGkgPyBgc2AgOiBgYH0gJHtuZWVkV2Fybi5qb2luKFwiLCBcIil9ICR7bXVsdGkgPyBgYXJlYCA6IGBpc2B9IG5vdCBleHBsaWNpdGx5IGRlZmluZWQuIFlvdSBhcmUgcnVubmluZyB0aGUgZXNtLWJ1bmRsZXIgYnVpbGQgb2YgVnVlLCB3aGljaCBleHBlY3RzIHRoZXNlIGNvbXBpbGUtdGltZSBmZWF0dXJlIGZsYWdzIHRvIGJlIGdsb2JhbGx5IGluamVjdGVkIHZpYSB0aGUgYnVuZGxlciBjb25maWcgaW4gb3JkZXIgdG8gZ2V0IGJldHRlciB0cmVlLXNoYWtpbmcgaW4gdGhlIHByb2R1Y3Rpb24gYnVuZGxlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9saW5rLnZ1ZWpzLm9yZy9mZWF0dXJlLWZsYWdzLmBcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHF1ZXVlUG9zdFJlbmRlckVmZmVjdCA9IHF1ZXVlRWZmZWN0V2l0aFN1c3BlbnNlIDtcbmZ1bmN0aW9uIGNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GdW5jdGlvbnMpO1xufVxuZnVuY3Rpb24gYmFzZUNyZWF0ZVJlbmRlcmVyKG9wdGlvbnMsIGNyZWF0ZUh5ZHJhdGlvbkZucykge1xuICB7XG4gICAgaW5pdEZlYXR1cmVGbGFncygpO1xuICB9XG4gIGNvbnN0IHRhcmdldCA9IGdldEdsb2JhbFRoaXMoKTtcbiAgdGFyZ2V0Ll9fVlVFX18gPSB0cnVlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICBzZXREZXZ0b29sc0hvb2skMSh0YXJnZXQuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXywgdGFyZ2V0KTtcbiAgfVxuICBjb25zdCB7XG4gICAgaW5zZXJ0OiBob3N0SW5zZXJ0LFxuICAgIHJlbW92ZTogaG9zdFJlbW92ZSxcbiAgICBwYXRjaFByb3A6IGhvc3RQYXRjaFByb3AsXG4gICAgY3JlYXRlRWxlbWVudDogaG9zdENyZWF0ZUVsZW1lbnQsXG4gICAgY3JlYXRlVGV4dDogaG9zdENyZWF0ZVRleHQsXG4gICAgY3JlYXRlQ29tbWVudDogaG9zdENyZWF0ZUNvbW1lbnQsXG4gICAgc2V0VGV4dDogaG9zdFNldFRleHQsXG4gICAgc2V0RWxlbWVudFRleHQ6IGhvc3RTZXRFbGVtZW50VGV4dCxcbiAgICBwYXJlbnROb2RlOiBob3N0UGFyZW50Tm9kZSxcbiAgICBuZXh0U2libGluZzogaG9zdE5leHRTaWJsaW5nLFxuICAgIHNldFNjb3BlSWQ6IGhvc3RTZXRTY29wZUlkID0gTk9PUCxcbiAgICBpbnNlcnRTdGF0aWNDb250ZW50OiBob3N0SW5zZXJ0U3RhdGljQ29udGVudFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcGF0Y2ggPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciA9IG51bGwsIHBhcmVudENvbXBvbmVudCA9IG51bGwsIHBhcmVudFN1c3BlbnNlID0gbnVsbCwgbmFtZXNwYWNlID0gdm9pZCAwLCBzbG90U2NvcGVJZHMgPSBudWxsLCBvcHRpbWl6ZWQgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcgPyBmYWxzZSA6ICEhbjIuZHluYW1pY0NoaWxkcmVuKSA9PiB7XG4gICAgaWYgKG4xID09PSBuMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobjEgJiYgIWlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICBhbmNob3IgPSBnZXROZXh0SG9zdE5vZGUobjEpO1xuICAgICAgdW5tb3VudChuMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICBuMSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMi5wYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIG4yLmR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUZXh0OlxuICAgICAgICBwcm9jZXNzVGV4dChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIHByb2Nlc3NDb21tZW50Tm9kZShuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0YXRpYzpcbiAgICAgICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgICAgICBtb3VudFN0YXRpY05vZGUobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwYXRjaFN0YXRpY05vZGUobjEsIG4yLCBjb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgICBwcm9jZXNzRnJhZ21lbnQoXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMSkge1xuICAgICAgICAgIHByb2Nlc3NFbGVtZW50KFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudChcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIHR5cGUucHJvY2VzcyhcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZCxcbiAgICAgICAgICAgIGludGVybmFsc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHdhcm4kMShcIkludmFsaWQgVk5vZGUgdHlwZTpcIiwgdHlwZSwgYCgke3R5cGVvZiB0eXBlfSlgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVmICE9IG51bGwgJiYgcGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBzZXRSZWYocmVmLCBuMSAmJiBuMS5yZWYsIHBhcmVudFN1c3BlbnNlLCBuMiB8fCBuMSwgIW4yKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NUZXh0ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlVGV4dChuMi5jaGlsZHJlbiksXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlbCA9IG4yLmVsID0gbjEuZWw7XG4gICAgICBpZiAobjIuY2hpbGRyZW4gIT09IG4xLmNoaWxkcmVuKSB7XG4gICAgICAgIGhvc3RTZXRUZXh0KGVsLCBuMi5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzQ29tbWVudE5vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcikgPT4ge1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBob3N0SW5zZXJ0KFxuICAgICAgICBuMi5lbCA9IGhvc3RDcmVhdGVDb21tZW50KG4yLmNoaWxkcmVuIHx8IFwiXCIpLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50U3RhdGljTm9kZSA9IChuMiwgY29udGFpbmVyLCBhbmNob3IsIG5hbWVzcGFjZSkgPT4ge1xuICAgIFtuMi5lbCwgbjIuYW5jaG9yXSA9IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50KFxuICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICBjb250YWluZXIsXG4gICAgICBhbmNob3IsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBuMi5lbCxcbiAgICAgIG4yLmFuY2hvclxuICAgICk7XG4gIH07XG4gIGNvbnN0IHBhdGNoU3RhdGljTm9kZSA9IChuMSwgbjIsIGNvbnRhaW5lciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgYW5jaG9yID0gaG9zdE5leHRTaWJsaW5nKG4xLmFuY2hvcik7XG4gICAgICByZW1vdmVTdGF0aWNOb2RlKG4xKTtcbiAgICAgIFtuMi5lbCwgbjIuYW5jaG9yXSA9IGhvc3RJbnNlcnRTdGF0aWNDb250ZW50KFxuICAgICAgICBuMi5jaGlsZHJlbixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIG5hbWVzcGFjZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIG4yLmFuY2hvciA9IG4xLmFuY2hvcjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdmVTdGF0aWNOb2RlID0gKHsgZWwsIGFuY2hvciB9LCBjb250YWluZXIsIG5leHRTaWJsaW5nKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGVsICYmIGVsICE9PSBhbmNob3IpIHtcbiAgICAgIG5leHQgPSBob3N0TmV4dFNpYmxpbmcoZWwpO1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gICAgICBlbCA9IG5leHQ7XG4gICAgfVxuICAgIGhvc3RJbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIG5leHRTaWJsaW5nKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSkgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGFuY2hvcik7XG4gIH07XG4gIGNvbnN0IHByb2Nlc3NFbGVtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBpZiAobjIudHlwZSA9PT0gXCJzdmdcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJzdmdcIjtcbiAgICB9IGVsc2UgaWYgKG4yLnR5cGUgPT09IFwibWF0aFwiKSB7XG4gICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgIH1cbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgbW91bnRFbGVtZW50KFxuICAgICAgICBuMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoRWxlbWVudChcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnRFbGVtZW50ID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGxldCBlbDtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGNvbnN0IHsgcHJvcHMsIHNoYXBlRmxhZywgdHJhbnNpdGlvbiwgZGlycyB9ID0gdm5vZGU7XG4gICAgZWwgPSB2bm9kZS5lbCA9IGhvc3RDcmVhdGVFbGVtZW50KFxuICAgICAgdm5vZGUudHlwZSxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICAgIHByb3BzICYmIHByb3BzLmlzLFxuICAgICAgcHJvcHNcbiAgICApO1xuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBob3N0U2V0RWxlbWVudFRleHQoZWwsIHZub2RlLmNoaWxkcmVuKTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh2bm9kZSwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICB9XG4gICAgc2V0U2NvcGVJZChlbCwgdm5vZGUsIHZub2RlLnNjb3BlSWQsIHNsb3RTY29wZUlkcywgcGFyZW50Q29tcG9uZW50KTtcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgICAgIGlmIChrZXkgIT09IFwidmFsdWVcIiAmJiAhaXNSZXNlcnZlZFByb3Aoa2V5KSkge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wc1trZXldLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcInZhbHVlXCIgaW4gcHJvcHMpIHtcbiAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJ2YWx1ZVwiLCBudWxsLCBwcm9wcy52YWx1ZSwgbmFtZXNwYWNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZUhvb2sgPSBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpIHtcbiAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsLCBcIl9fdm5vZGVcIiwge1xuICAgICAgICB2YWx1ZTogdm5vZGUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbCwgXCJfX3Z1ZVBhcmVudENvbXBvbmVudFwiLCB7XG4gICAgICAgIHZhbHVlOiBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTY29wZUlkID0gKGVsLCB2bm9kZSwgc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBpZiAoc2NvcGVJZCkge1xuICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNjb3BlSWQpO1xuICAgIH1cbiAgICBpZiAoc2xvdFNjb3BlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RTY29wZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgbGV0IHN1YlRyZWUgPSBwYXJlbnRDb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJiBzdWJUcmVlLnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgc3ViVHJlZSA9IGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSkge1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHBhcmVudENvbXBvbmVudC52bm9kZTtcbiAgICAgICAgc2V0U2NvcGVJZChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRWTm9kZSxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zY29wZUlkLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQucGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjaGlsZHJlbltpXSkgOiBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gKG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICBsZXQgeyBwYXRjaEZsYWcsIGR5bmFtaWNDaGlsZHJlbiwgZGlycyB9ID0gbjI7XG4gICAgcGF0Y2hGbGFnIHw9IG4xLnBhdGNoRmxhZyAmIDE2O1xuICAgIGNvbnN0IG9sZFByb3BzID0gbjEucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gbjIucHJvcHMgfHwgRU1QVFlfT0JKO1xuICAgIGxldCB2bm9kZUhvb2s7XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCBmYWxzZSk7XG4gICAgaWYgKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpIHtcbiAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlVXBkYXRlXCIpO1xuICAgIH1cbiAgICBwYXJlbnRDb21wb25lbnQgJiYgdG9nZ2xlUmVjdXJzZShwYXJlbnRDb21wb25lbnQsIHRydWUpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UobjIsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgICBwYXRjaFByb3BzKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIG9sZFByb3BzLFxuICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiAyKSB7XG4gICAgICAgICAgaWYgKG9sZFByb3BzLmNsYXNzICE9PSBuZXdQcm9wcy5jbGFzcykge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJjbGFzc1wiLCBudWxsLCBuZXdQcm9wcy5jbGFzcywgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDQpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInN0eWxlXCIsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBuMi5keW5hbWljUHJvcHM7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoXG4gICAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHByZXYsXG4gICAgICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgICAgbjEuY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEpIHtcbiAgICAgICAgaWYgKG4xLmNoaWxkcmVuICE9PSBuMi5jaGlsZHJlbikge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkICYmIGR5bmFtaWNDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICBwYXRjaFByb3BzKFxuICAgICAgICBlbCxcbiAgICAgICAgbjIsXG4gICAgICAgIG9sZFByb3BzLFxuICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoKHZub2RlSG9vayA9IG5ld1Byb3BzLm9uVm5vZGVVcGRhdGVkKSB8fCBkaXJzKSB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCBuMiwgbjEpO1xuICAgICAgICBkaXJzICYmIGludm9rZURpcmVjdGl2ZUhvb2sobjIsIG4xLCBwYXJlbnRDb21wb25lbnQsIFwidXBkYXRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoQmxvY2tDaGlsZHJlbiA9IChvbGRDaGlsZHJlbiwgbmV3Q2hpbGRyZW4sIGZhbGxiYWNrQ29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcykgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG4gICAgICBjb25zdCBuZXdWTm9kZSA9IG5ld0NoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gKFxuICAgICAgICAvLyBvbGRWTm9kZSBtYXkgYmUgYW4gZXJyb3JlZCBhc3luYyBzZXR1cCgpIGNvbXBvbmVudCBpbnNpZGUgU3VzcGVuc2VcbiAgICAgICAgLy8gd2hpY2ggd2lsbCBub3QgaGF2ZSBhIG1vdW50ZWQgZWxlbWVudFxuICAgICAgICBvbGRWTm9kZS5lbCAmJiAvLyAtIEluIHRoZSBjYXNlIG9mIGEgRnJhZ21lbnQsIHdlIG5lZWQgdG8gcHJvdmlkZSB0aGUgYWN0dWFsIHBhcmVudFxuICAgICAgICAvLyBvZiB0aGUgRnJhZ21lbnQgaXRzZWxmIHNvIGl0IGNhbiBtb3ZlIGl0cyBjaGlsZHJlbi5cbiAgICAgICAgKG9sZFZOb2RlLnR5cGUgPT09IEZyYWdtZW50IHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgZGlmZmVyZW50IG5vZGVzLCB0aGVyZSBpcyBnb2luZyB0byBiZSBhIHJlcGxhY2VtZW50XG4gICAgICAgIC8vIHdoaWNoIGFsc28gcmVxdWlyZXMgdGhlIGNvcnJlY3QgcGFyZW50IGNvbnRhaW5lclxuICAgICAgICAhaXNTYW1lVk5vZGVUeXBlKG9sZFZOb2RlLCBuZXdWTm9kZSkgfHwgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIGNvbXBvbmVudCwgaXQgY291bGQgY29udGFpbiBhbnl0aGluZy5cbiAgICAgICAgb2xkVk5vZGUuc2hhcGVGbGFnICYgKDYgfCA2NCkpID8gaG9zdFBhcmVudE5vZGUob2xkVk5vZGUuZWwpIDogKFxuICAgICAgICAgIC8vIEluIG90aGVyIGNhc2VzLCB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBub3QgYWN0dWFsbHkgdXNlZCBzbyB3ZVxuICAgICAgICAgIC8vIGp1c3QgcGFzcyB0aGUgYmxvY2sgZWxlbWVudCBoZXJlIHRvIGF2b2lkIGEgRE9NIHBhcmVudE5vZGUgY2FsbC5cbiAgICAgICAgICBmYWxsYmFja0NvbnRhaW5lclxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcGF0Y2goXG4gICAgICAgIG9sZFZOb2RlLFxuICAgICAgICBuZXdWTm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoUHJvcHMgPSAoZWwsIHZub2RlLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMpIHtcbiAgICAgIGlmIChvbGRQcm9wcyAhPT0gRU1QVFlfT0JKKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9sZFByb3BzKSB7XG4gICAgICAgICAgaWYgKCFpc1Jlc2VydmVkUHJvcChrZXkpICYmICEoa2V5IGluIG5ld1Byb3BzKSkge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgb2xkUHJvcHNba2V5XSxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgICB2bm9kZS5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgdW5tb3VudENoaWxkcmVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbmV3UHJvcHMpIHtcbiAgICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5leHQgPSBuZXdQcm9wc1trZXldO1xuICAgICAgICBjb25zdCBwcmV2ID0gb2xkUHJvcHNba2V5XTtcbiAgICAgICAgaWYgKG5leHQgIT09IHByZXYgJiYga2V5ICE9PSBcInZhbHVlXCIpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBwcmV2LFxuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHZub2RlLmNoaWxkcmVuLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICB1bm1vdW50Q2hpbGRyZW5cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgb2xkUHJvcHMudmFsdWUsIG5ld1Byb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBmcmFnbWVudFN0YXJ0QW5jaG9yID0gbjIuZWwgPSBuMSA/IG4xLmVsIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgY29uc3QgZnJhZ21lbnRFbmRBbmNob3IgPSBuMi5hbmNob3IgPSBuMSA/IG4xLmFuY2hvciA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAvLyAjNTUyMyBkZXYgcm9vdCBmcmFnbWVudCBtYXkgaW5oZXJpdCBkaXJlY3RpdmVzXG4gICAgKGlzSG1yVXBkYXRpbmcgfHwgcGF0Y2hGbGFnICYgMjA0OCkpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRTdGFydEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudEVuZEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgLy8gIzEwMDA3XG4gICAgICAgIC8vIHN1Y2ggZnJhZ21lbnQgbGlrZSBgPD48Lz5gIHdpbGwgYmUgY29tcGlsZWQgaW50b1xuICAgICAgICAvLyBhIGZyYWdtZW50IHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGNoaWxkcmVuLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZmFsbGJhY2sgdG8gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgbjIuY2hpbGRyZW4gfHwgW10sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0ICYmIGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMjcxNSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgY291bGQndmUgYmVlbiBhIEJBSUxlZCBvbmUgYXMgYSByZXN1bHRcbiAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vIHZhbGlkIGNoaWxkcmVuXG4gICAgICBuMS5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENvbXBvbmVudCA9IChpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCkge1xuICAgICAgcGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucmVnaXN0ZXJEZXAoaW5zdGFuY2UsIHNldHVwUmVuZGVyRWZmZWN0KTtcbiAgICAgIGlmICghaW5pdGlhbFZOb2RlLmVsKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gaW5zdGFuY2Uuc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobnVsbCwgcGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0dXBSZW5kZXJFZmZlY3QoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBpbml0aWFsVk5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnQgPSAobjEsIG4yLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG4yLmNvbXBvbmVudCA9IG4xLmNvbXBvbmVudDtcbiAgICBpZiAoc2hvdWxkVXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwICYmICFpbnN0YW5jZS5hc3luY1Jlc29sdmVkKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG4yKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG4yLCBvcHRpbWl6ZWQpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UubmV4dCA9IG4yO1xuICAgICAgICBpbnZhbGlkYXRlSm9iKGluc3RhbmNlLnVwZGF0ZSk7XG4gICAgICAgIGluc3RhbmNlLmVmZmVjdC5kaXJ0eSA9IHRydWU7XG4gICAgICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgaW5zdGFuY2Uudm5vZGUgPSBuMjtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHNldHVwUmVuZGVyRWZmZWN0ID0gKGluc3RhbmNlLCBpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBjb21wb25lbnRVcGRhdGVGbiA9ICgpID0+IHtcbiAgICAgIGlmICghaW5zdGFuY2UuaXNNb3VudGVkKSB7XG4gICAgICAgIGxldCB2bm9kZUhvb2s7XG4gICAgICAgIGNvbnN0IHsgZWwsIHByb3BzIH0gPSBpbml0aWFsVk5vZGU7XG4gICAgICAgIGNvbnN0IHsgYm0sIG0sIHBhcmVudCB9ID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGlzQXN5bmNXcmFwcGVyVk5vZGUgPSBpc0FzeW5jV3JhcHBlcihpbml0aWFsVk5vZGUpO1xuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChibSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJtKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXN5bmNXcmFwcGVyVk5vZGUgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkpIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIGluaXRpYWxWTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChlbCAmJiBoeWRyYXRlTm9kZSkge1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVTdWJUcmVlID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnN0YW5jZS5zdWJUcmVlID0gcmVuZGVyQ29tcG9uZW50Um9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoeWRyYXRlTm9kZShcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGluc3RhbmNlLnN1YlRyZWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBoeWRyYXRlYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaXNBc3luY1dyYXBwZXJWTm9kZSkge1xuICAgICAgICAgICAgaW5pdGlhbFZOb2RlLnR5cGUuX19hc3luY0xvYWRlcigpLnRoZW4oXG4gICAgICAgICAgICAgIC8vIG5vdGU6IHdlIGFyZSBtb3ZpbmcgdGhlIHJlbmRlciBjYWxsIGludG8gYW4gYXN5bmMgY2FsbGJhY2ssXG4gICAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvbid0IHRyYWNrIGRlcGVuZGVuY2llcyAtIGJ1dCBpdCdzIG9rIGJlY2F1c2VcbiAgICAgICAgICAgICAgLy8gYSBzZXJ2ZXItcmVuZGVyZWQgYXN5bmMgd3JhcHBlciBpcyBhbHJlYWR5IGluIHJlc29sdmVkIHN0YXRlXG4gICAgICAgICAgICAgIC8vIGFuZCBpdCB3aWxsIG5ldmVyIG5lZWQgdG8gY2hhbmdlLlxuICAgICAgICAgICAgICAoKSA9PiAhaW5zdGFuY2UuaXNVbm1vdW50ZWQgJiYgaHlkcmF0ZVN1YlRyZWUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHlkcmF0ZVN1YlRyZWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWJUcmVlID0gaW5zdGFuY2Uuc3ViVHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBzdWJUcmVlLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbml0aWFsVk5vZGUuZWwgPSBzdWJUcmVlLmVsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KG0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXN5bmNXcmFwcGVyVk5vZGUgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVNb3VudGVkKSkge1xuICAgICAgICAgIGNvbnN0IHNjb3BlZEluaXRpYWxWTm9kZSA9IGluaXRpYWxWTm9kZTtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIHNjb3BlZEluaXRpYWxWTm9kZSksXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluaXRpYWxWTm9kZS5zaGFwZUZsYWcgJiAyNTYgfHwgcGFyZW50ICYmIGlzQXN5bmNXcmFwcGVyKHBhcmVudC52bm9kZSkgJiYgcGFyZW50LnZub2RlLnNoYXBlRmxhZyAmIDI1Nikge1xuICAgICAgICAgIGluc3RhbmNlLmEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGluc3RhbmNlLmEsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZS5pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICBkZXZ0b29sc0NvbXBvbmVudEFkZGVkKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsVk5vZGUgPSBjb250YWluZXIgPSBhbmNob3IgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IHsgbmV4dCwgYnUsIHUsIHBhcmVudCwgdm5vZGUgfSA9IGluc3RhbmNlO1xuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qgbm9uSHlkcmF0ZWRBc3luY1Jvb3QgPSBsb2NhdGVOb25IeWRyYXRlZEFzeW5jUm9vdChpbnN0YW5jZSk7XG4gICAgICAgICAgaWYgKG5vbkh5ZHJhdGVkQXN5bmNSb290KSB7XG4gICAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgICBuZXh0LmVsID0gdm5vZGUuZWw7XG4gICAgICAgICAgICAgIHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlcihpbnN0YW5jZSwgbmV4dCwgb3B0aW1pemVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vbkh5ZHJhdGVkQXN5bmNSb290LmFzeW5jRGVwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlLmlzVW5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50VXBkYXRlRm4oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBvcmlnaW5OZXh0ID0gbmV4dDtcbiAgICAgICAgbGV0IHZub2RlSG9vaztcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwdXNoV2FybmluZ0NvbnRleHQobmV4dCB8fCBpbnN0YW5jZS52bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgZmFsc2UpO1xuICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgIG5leHQuZWwgPSB2bm9kZS5lbDtcbiAgICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG5leHQsIG9wdGltaXplZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dCA9IHZub2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGJ1KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodm5vZGVIb29rID0gbmV4dC5wcm9wcyAmJiBuZXh0LnByb3BzLm9uVm5vZGVCZWZvcmVVcGRhdGUpIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIG5leHQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0VHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2VHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICAgIGluc3RhbmNlLnN1YlRyZWUgPSBuZXh0VHJlZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIHByZXZUcmVlLFxuICAgICAgICAgIG5leHRUcmVlLFxuICAgICAgICAgIC8vIHBhcmVudCBtYXkgaGF2ZSBjaGFuZ2VkIGlmIGl0J3MgaW4gYSB0ZWxlcG9ydFxuICAgICAgICAgIGhvc3RQYXJlbnROb2RlKHByZXZUcmVlLmVsKSxcbiAgICAgICAgICAvLyBhbmNob3IgbWF5IGhhdmUgY2hhbmdlZCBpZiBpdCdzIGluIGEgZnJhZ21lbnRcbiAgICAgICAgICBnZXROZXh0SG9zdE5vZGUocHJldlRyZWUpLFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZVxuICAgICAgICApO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBwYXRjaGApO1xuICAgICAgICB9XG4gICAgICAgIG5leHQuZWwgPSBuZXh0VHJlZS5lbDtcbiAgICAgICAgaWYgKG9yaWdpbk5leHQgPT09IG51bGwpIHtcbiAgICAgICAgICB1cGRhdGVIT0NIb3N0RWwoaW5zdGFuY2UsIG5leHRUcmVlLmVsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodSkge1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZub2RlSG9vayA9IG5leHQucHJvcHMgJiYgbmV4dC5wcm9wcy5vblZub2RlVXBkYXRlZCkge1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChcbiAgICAgICAgICAgICgpID0+IGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudCwgbmV4dCwgdm5vZGUpLFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgIGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBlZmZlY3QgPSBpbnN0YW5jZS5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoXG4gICAgICBjb21wb25lbnRVcGRhdGVGbixcbiAgICAgIE5PT1AsXG4gICAgICAoKSA9PiBxdWV1ZUpvYih1cGRhdGUpLFxuICAgICAgaW5zdGFuY2Uuc2NvcGVcbiAgICAgIC8vIHRyYWNrIGl0IGluIGNvbXBvbmVudCdzIGVmZmVjdCBzY29wZVxuICAgICk7XG4gICAgY29uc3QgdXBkYXRlID0gaW5zdGFuY2UudXBkYXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVmZmVjdC5kaXJ0eSkge1xuICAgICAgICBlZmZlY3QucnVuKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB1cGRhdGUuaWQgPSBpbnN0YW5jZS51aWQ7XG4gICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGVmZmVjdC5vblRyYWNrID0gaW5zdGFuY2UucnRjID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0YywgZSkgOiB2b2lkIDA7XG4gICAgICBlZmZlY3Qub25UcmlnZ2VyID0gaW5zdGFuY2UucnRnID8gKGUpID0+IGludm9rZUFycmF5Rm5zKGluc3RhbmNlLnJ0ZywgZSkgOiB2b2lkIDA7XG4gICAgICB1cGRhdGUub3duZXJJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICB1cGRhdGUoKTtcbiAgfTtcbiAgY29uc3QgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyID0gKGluc3RhbmNlLCBuZXh0Vk5vZGUsIG9wdGltaXplZCkgPT4ge1xuICAgIG5leHRWTm9kZS5jb21wb25lbnQgPSBpbnN0YW5jZTtcbiAgICBjb25zdCBwcmV2UHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcztcbiAgICBpbnN0YW5jZS52bm9kZSA9IG5leHRWTm9kZTtcbiAgICBpbnN0YW5jZS5uZXh0ID0gbnVsbDtcbiAgICB1cGRhdGVQcm9wcyhpbnN0YW5jZSwgbmV4dFZOb2RlLnByb3BzLCBwcmV2UHJvcHMsIG9wdGltaXplZCk7XG4gICAgdXBkYXRlU2xvdHMoaW5zdGFuY2UsIG5leHRWTm9kZS5jaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSk7XG4gICAgcmVzZXRUcmFja2luZygpO1xuICB9O1xuICBjb25zdCBwYXRjaENoaWxkcmVuID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IGMxID0gbjEgJiYgbjEuY2hpbGRyZW47XG4gICAgY29uc3QgcHJldlNoYXBlRmxhZyA9IG4xID8gbjEuc2hhcGVGbGFnIDogMDtcbiAgICBjb25zdCBjMiA9IG4yLmNoaWxkcmVuO1xuICAgIGNvbnN0IHsgcGF0Y2hGbGFnLCBzaGFwZUZsYWcgfSA9IG4yO1xuICAgIGlmIChwYXRjaEZsYWcgPiAwKSB7XG4gICAgICBpZiAocGF0Y2hGbGFnICYgMTI4KSB7XG4gICAgICAgIHBhdGNoS2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDI1Nikge1xuICAgICAgICBwYXRjaFVua2V5ZWRDaGlsZHJlbihcbiAgICAgICAgICBjMSxcbiAgICAgICAgICBjMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA4KSB7XG4gICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9XG4gICAgICBpZiAoYzIgIT09IGMxKSB7XG4gICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIGMyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgICBjMSxcbiAgICAgICAgICAgIGMyLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVubW91bnRDaGlsZHJlbihjMSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgOCkge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChjb250YWluZXIsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICAgIG1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hVbmtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGMxID0gYzEgfHwgRU1QVFlfQVJSO1xuICAgIGMyID0gYzIgfHwgRU1QVFlfQVJSO1xuICAgIGNvbnN0IG9sZExlbmd0aCA9IGMxLmxlbmd0aDtcbiAgICBjb25zdCBuZXdMZW5ndGggPSBjMi5sZW5ndGg7XG4gICAgY29uc3QgY29tbW9uTGVuZ3RoID0gTWF0aC5taW4ob2xkTGVuZ3RoLCBuZXdMZW5ndGgpO1xuICAgIGxldCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb21tb25MZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgYzFbaV0sXG4gICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob2xkTGVuZ3RoID4gbmV3TGVuZ3RoKSB7XG4gICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgIGMxLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICB0cnVlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY29tbW9uTGVuZ3RoXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICBjMixcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgIGNvbW1vbkxlbmd0aFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoS2V5ZWRDaGlsZHJlbiA9IChjMSwgYzIsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IGwyID0gYzIubGVuZ3RoO1xuICAgIGxldCBlMSA9IGMxLmxlbmd0aCAtIDE7XG4gICAgbGV0IGUyID0gbDIgLSAxO1xuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbaV07XG4gICAgICBjb25zdCBuMiA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpKSB7XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHdoaWxlIChpIDw9IGUxICYmIGkgPD0gZTIpIHtcbiAgICAgIGNvbnN0IG4xID0gYzFbZTFdO1xuICAgICAgY29uc3QgbjIgPSBjMltlMl0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltlMl0pIDogbm9ybWFsaXplVk5vZGUoYzJbZTJdKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZTEtLTtcbiAgICAgIGUyLS07XG4gICAgfVxuICAgIGlmIChpID4gZTEpIHtcbiAgICAgIGlmIChpIDw9IGUyKSB7XG4gICAgICAgIGNvbnN0IG5leHRQb3MgPSBlMiArIDE7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IG5leHRQb3MgPCBsMiA/IGMyW25leHRQb3NdLmVsIDogcGFyZW50QW5jaG9yO1xuICAgICAgICB3aGlsZSAoaSA8PSBlMikge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaSA+IGUyKSB7XG4gICAgICB3aGlsZSAoaSA8PSBlMSkge1xuICAgICAgICB1bm1vdW50KGMxW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzMSA9IGk7XG4gICAgICBjb25zdCBzMiA9IGk7XG4gICAgICBjb25zdCBrZXlUb05ld0luZGV4TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIGZvciAoaSA9IHMyOyBpIDw9IGUyOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbaV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjMltpXSkgOiBub3JtYWxpemVWTm9kZShjMltpXSk7XG4gICAgICAgIGlmIChuZXh0Q2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXlUb05ld0luZGV4TWFwLmhhcyhuZXh0Q2hpbGQua2V5KSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIGtleXMgZm91bmQgZHVyaW5nIHVwZGF0ZTpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuZXh0Q2hpbGQua2V5KSxcbiAgICAgICAgICAgICAgYE1ha2Ugc3VyZSBrZXlzIGFyZSB1bmlxdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5VG9OZXdJbmRleE1hcC5zZXQobmV4dENoaWxkLmtleSwgaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBqO1xuICAgICAgbGV0IHBhdGNoZWQgPSAwO1xuICAgICAgY29uc3QgdG9CZVBhdGNoZWQgPSBlMiAtIHMyICsgMTtcbiAgICAgIGxldCBtb3ZlZCA9IGZhbHNlO1xuICAgICAgbGV0IG1heE5ld0luZGV4U29GYXIgPSAwO1xuICAgICAgY29uc3QgbmV3SW5kZXhUb09sZEluZGV4TWFwID0gbmV3IEFycmF5KHRvQmVQYXRjaGVkKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0b0JlUGF0Y2hlZDsgaSsrKVxuICAgICAgICBuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPSAwO1xuICAgICAgZm9yIChpID0gczE7IGkgPD0gZTE7IGkrKykge1xuICAgICAgICBjb25zdCBwcmV2Q2hpbGQgPSBjMVtpXTtcbiAgICAgICAgaWYgKHBhdGNoZWQgPj0gdG9CZVBhdGNoZWQpIHtcbiAgICAgICAgICB1bm1vdW50KHByZXZDaGlsZCwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld0luZGV4O1xuICAgICAgICBpZiAocHJldkNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBrZXlUb05ld0luZGV4TWFwLmdldChwcmV2Q2hpbGQua2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGogPSBzMjsgaiA8PSBlMjsgaisrKSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXhUb09sZEluZGV4TWFwW2ogLSBzMl0gPT09IDAgJiYgaXNTYW1lVk5vZGVUeXBlKHByZXZDaGlsZCwgYzJbal0pKSB7XG4gICAgICAgICAgICAgIG5ld0luZGV4ID0gajtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdJbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4VG9PbGRJbmRleE1hcFtuZXdJbmRleCAtIHMyXSA9IGkgKyAxO1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSBtYXhOZXdJbmRleFNvRmFyKSB7XG4gICAgICAgICAgICBtYXhOZXdJbmRleFNvRmFyID0gbmV3SW5kZXg7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBwcmV2Q2hpbGQsXG4gICAgICAgICAgICBjMltuZXdJbmRleF0sXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhdGNoZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UgPSBtb3ZlZCA/IGdldFNlcXVlbmNlKG5ld0luZGV4VG9PbGRJbmRleE1hcCkgOiBFTVBUWV9BUlI7XG4gICAgICBqID0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2UubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAoaSA9IHRvQmVQYXRjaGVkIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gczIgKyBpO1xuICAgICAgICBjb25zdCBuZXh0Q2hpbGQgPSBjMltuZXh0SW5kZXhdO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0SW5kZXggKyAxIDwgbDIgPyBjMltuZXh0SW5kZXggKyAxXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtpXSA9PT0gMCkge1xuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5leHRDaGlsZCxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb3ZlZCkge1xuICAgICAgICAgIGlmIChqIDwgMCB8fCBpICE9PSBpbmNyZWFzaW5nTmV3SW5kZXhTZXF1ZW5jZVtqXSkge1xuICAgICAgICAgICAgbW92ZShuZXh0Q2hpbGQsIGNvbnRhaW5lciwgYW5jaG9yLCAyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgai0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgbW92ZSA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwpID0+IHtcbiAgICBjb25zdCB7IGVsLCB0eXBlLCB0cmFuc2l0aW9uLCBjaGlsZHJlbiwgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgICBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgbW92ZSh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgdm5vZGUuc3VzcGVuc2UubW92ZShjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgIHR5cGUubW92ZSh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIGludGVybmFscyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBGcmFnbWVudCkge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBtb3ZlKGNoaWxkcmVuW2ldLCBjb250YWluZXIsIGFuY2hvciwgbW92ZVR5cGUpO1xuICAgICAgfVxuICAgICAgaG9zdEluc2VydCh2bm9kZS5hbmNob3IsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09IFN0YXRpYykge1xuICAgICAgbW92ZVN0YXRpY05vZGUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmVlZFRyYW5zaXRpb24yID0gbW92ZVR5cGUgIT09IDIgJiYgc2hhcGVGbGFnICYgMSAmJiB0cmFuc2l0aW9uO1xuICAgIGlmIChuZWVkVHJhbnNpdGlvbjIpIHtcbiAgICAgIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4gdHJhbnNpdGlvbi5lbnRlcihlbCksIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUsIGFmdGVyTGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICAgIGNvbnN0IHJlbW92ZTIgPSAoKSA9PiBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGNvbnN0IHBlcmZvcm1MZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICBsZWF2ZShlbCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVtb3ZlMigpO1xuICAgICAgICAgICAgYWZ0ZXJMZWF2ZSAmJiBhZnRlckxlYXZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWxheUxlYXZlKSB7XG4gICAgICAgICAgZGVsYXlMZWF2ZShlbCwgcmVtb3ZlMiwgcGVyZm9ybUxlYXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZXJmb3JtTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBob3N0SW5zZXJ0KGVsLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgfVxuICB9O1xuICBjb25zdCB1bm1vdW50ID0gKHZub2RlLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSA9IGZhbHNlLCBvcHRpbWl6ZWQgPSBmYWxzZSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHJlZixcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZGlyc1xuICAgIH0gPSB2bm9kZTtcbiAgICBpZiAocmVmICE9IG51bGwpIHtcbiAgICAgIHNldFJlZihyZWYsIG51bGwsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5jdHguZGVhY3RpdmF0ZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZEludm9rZURpcnMgPSBzaGFwZUZsYWcgJiAxICYmIGRpcnM7XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlVm5vZGVIb29rID0gIWlzQXN5bmNXcmFwcGVyKHZub2RlKTtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVVbm1vdW50KSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICB1bm1vdW50Q29tcG9uZW50KHZub2RlLmNvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICB2bm9kZS5zdXNwZW5zZS51bm1vdW50KHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVbm1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgIHZub2RlLnR5cGUucmVtb3ZlKFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgIGRvUmVtb3ZlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMTE1MzogZmFzdCBwYXRoIHNob3VsZCBub3QgYmUgdGFrZW4gZm9yIG5vbi1zdGFibGUgKHYtZm9yKSBmcmFnbWVudHNcbiAgICAgICh0eXBlICE9PSBGcmFnbWVudCB8fCBwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0KSkge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEZyYWdtZW50ICYmIHBhdGNoRmxhZyAmICgxMjggfCAyNTYpIHx8ICFvcHRpbWl6ZWQgJiYgc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgdW5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChkb1JlbW92ZSkge1xuICAgICAgICByZW1vdmUodm5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW52b2tlVm5vZGVIb29rICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlVW5tb3VudGVkKSB8fCBzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICB2bm9kZUhvb2sgJiYgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgIHNob3VsZEludm9rZURpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcInVubW91bnRlZFwiKTtcbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZSA9ICh2bm9kZSkgPT4ge1xuICAgIGNvbnN0IHsgdHlwZSwgZWwsIGFuY2hvciwgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gICAgaWYgKHR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB2bm9kZS5wYXRjaEZsYWcgPiAwICYmIHZub2RlLnBhdGNoRmxhZyAmIDIwNDggJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudCkge1xuICAgICAgICAgICAgaG9zdFJlbW92ZShjaGlsZC5lbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZShjaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUZyYWdtZW50KGVsLCBhbmNob3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gU3RhdGljKSB7XG4gICAgICByZW1vdmVTdGF0aWNOb2RlKHZub2RlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGVyZm9ybVJlbW92ZSA9ICgpID0+IHtcbiAgICAgIGhvc3RSZW1vdmUoZWwpO1xuICAgICAgaWYgKHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkICYmIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSkge1xuICAgICAgICB0cmFuc2l0aW9uLmFmdGVyTGVhdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiAxICYmIHRyYW5zaXRpb24gJiYgIXRyYW5zaXRpb24ucGVyc2lzdGVkKSB7XG4gICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgY29uc3QgcGVyZm9ybUxlYXZlID0gKCkgPT4gbGVhdmUoZWwsIHBlcmZvcm1SZW1vdmUpO1xuICAgICAgaWYgKGRlbGF5TGVhdmUpIHtcbiAgICAgICAgZGVsYXlMZWF2ZSh2bm9kZS5lbCwgcGVyZm9ybVJlbW92ZSwgcGVyZm9ybUxlYXZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcmZvcm1MZWF2ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZXJmb3JtUmVtb3ZlKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmVGcmFnbWVudCA9IChjdXIsIGVuZCkgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChjdXIgIT09IGVuZCkge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhjdXIpO1xuICAgICAgaG9zdFJlbW92ZShjdXIpO1xuICAgICAgY3VyID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShlbmQpO1xuICB9O1xuICBjb25zdCB1bm1vdW50Q29tcG9uZW50ID0gKGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpbnN0YW5jZS50eXBlLl9faG1ySWQpIHtcbiAgICAgIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBjb25zdCB7IGJ1bSwgc2NvcGUsIHVwZGF0ZSwgc3ViVHJlZSwgdW0gfSA9IGluc3RhbmNlO1xuICAgIGlmIChidW0pIHtcbiAgICAgIGludm9rZUFycmF5Rm5zKGJ1bSk7XG4gICAgfVxuICAgIHNjb3BlLnN0b3AoKTtcbiAgICBpZiAodXBkYXRlKSB7XG4gICAgICB1cGRhdGUuYWN0aXZlID0gZmFsc2U7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiYgaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgJiYgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldE5leHRIb3N0Tm9kZSA9ICh2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dEhvc3ROb2RlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgcmV0dXJuIHZub2RlLnN1c3BlbnNlLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhvc3ROZXh0U2libGluZyh2bm9kZS5hbmNob3IgfHwgdm5vZGUuZWwpO1xuICB9O1xuICBsZXQgaXNGbHVzaGluZyA9IGZhbHNlO1xuICBjb25zdCByZW5kZXIgPSAodm5vZGUsIGNvbnRhaW5lciwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKHZub2RlID09IG51bGwpIHtcbiAgICAgIGlmIChjb250YWluZXIuX3Zub2RlKSB7XG4gICAgICAgIHVubW91bnQoY29udGFpbmVyLl92bm9kZSwgbnVsbCwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBjb250YWluZXIuX3Zub2RlIHx8IG51bGwsXG4gICAgICAgIHZub2RlLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG5hbWVzcGFjZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgIGZsdXNoUHJlRmx1c2hDYnMoKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgfTtcbiAgY29uc3QgaW50ZXJuYWxzID0ge1xuICAgIHA6IHBhdGNoLFxuICAgIHVtOiB1bm1vdW50LFxuICAgIG06IG1vdmUsXG4gICAgcjogcmVtb3ZlLFxuICAgIG10OiBtb3VudENvbXBvbmVudCxcbiAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICBwYzogcGF0Y2hDaGlsZHJlbixcbiAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICBuOiBnZXROZXh0SG9zdE5vZGUsXG4gICAgbzogb3B0aW9uc1xuICB9O1xuICBsZXQgaHlkcmF0ZTtcbiAgbGV0IGh5ZHJhdGVOb2RlO1xuICBpZiAoY3JlYXRlSHlkcmF0aW9uRm5zKSB7XG4gICAgW2h5ZHJhdGUsIGh5ZHJhdGVOb2RlXSA9IGNyZWF0ZUh5ZHJhdGlvbkZucyhcbiAgICAgIGludGVybmFsc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW5kZXIsXG4gICAgaHlkcmF0ZSxcbiAgICBjcmVhdGVBcHA6IGNyZWF0ZUFwcEFQSShyZW5kZXIsIGh5ZHJhdGUpXG4gIH07XG59XG5mdW5jdGlvbiByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UoeyB0eXBlLCBwcm9wcyB9LCBjdXJyZW50TmFtZXNwYWNlKSB7XG4gIHJldHVybiBjdXJyZW50TmFtZXNwYWNlID09PSBcInN2Z1wiICYmIHR5cGUgPT09IFwiZm9yZWlnbk9iamVjdFwiIHx8IGN1cnJlbnROYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgJiYgdHlwZSA9PT0gXCJhbm5vdGF0aW9uLXhtbFwiICYmIHByb3BzICYmIHByb3BzLmVuY29kaW5nICYmIHByb3BzLmVuY29kaW5nLmluY2x1ZGVzKFwiaHRtbFwiKSA/IHZvaWQgMCA6IGN1cnJlbnROYW1lc3BhY2U7XG59XG5mdW5jdGlvbiB0b2dnbGVSZWN1cnNlKHsgZWZmZWN0LCB1cGRhdGUgfSwgYWxsb3dlZCkge1xuICBlZmZlY3QuYWxsb3dSZWN1cnNlID0gdXBkYXRlLmFsbG93UmVjdXJzZSA9IGFsbG93ZWQ7XG59XG5mdW5jdGlvbiBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbikge1xuICByZXR1cm4gKCFwYXJlbnRTdXNwZW5zZSB8fCBwYXJlbnRTdXNwZW5zZSAmJiAhcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQ7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMiwgc2hhbGxvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IGNoMSA9IG4xLmNoaWxkcmVuO1xuICBjb25zdCBjaDIgPSBuMi5jaGlsZHJlbjtcbiAgaWYgKGlzQXJyYXkoY2gxKSAmJiBpc0FycmF5KGNoMikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoMS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYzEgPSBjaDFbaV07XG4gICAgICBsZXQgYzIgPSBjaDJbaV07XG4gICAgICBpZiAoYzIuc2hhcGVGbGFnICYgMSAmJiAhYzIuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjMi5wYXRjaEZsYWcgPD0gMCB8fCBjMi5wYXRjaEZsYWcgPT09IDMyKSB7XG4gICAgICAgICAgYzIgPSBjaDJbaV0gPSBjbG9uZUlmTW91bnRlZChjaDJbaV0pO1xuICAgICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaGFsbG93KVxuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oYzEsIGMyKTtcbiAgICAgIH1cbiAgICAgIGlmIChjMi50eXBlID09PSBUZXh0KSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjMi50eXBlID09PSBDb21tZW50ICYmICFjMi5lbCkge1xuICAgICAgICBjMi5lbCA9IGMxLmVsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0U2VxdWVuY2UoYXJyKSB7XG4gIGNvbnN0IHAgPSBhcnIuc2xpY2UoKTtcbiAgY29uc3QgcmVzdWx0ID0gWzBdO1xuICBsZXQgaSwgaiwgdSwgdiwgYztcbiAgY29uc3QgbGVuID0gYXJyLmxlbmd0aDtcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgYXJySSA9IGFycltpXTtcbiAgICBpZiAoYXJySSAhPT0gMCkge1xuICAgICAgaiA9IHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV07XG4gICAgICBpZiAoYXJyW2pdIDwgYXJySSkge1xuICAgICAgICBwW2ldID0gajtcbiAgICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdSA9IDA7XG4gICAgICB2ID0gcmVzdWx0Lmxlbmd0aCAtIDE7XG4gICAgICB3aGlsZSAodSA8IHYpIHtcbiAgICAgICAgYyA9IHUgKyB2ID4+IDE7XG4gICAgICAgIGlmIChhcnJbcmVzdWx0W2NdXSA8IGFyckkpIHtcbiAgICAgICAgICB1ID0gYyArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdiA9IGM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChhcnJJIDwgYXJyW3Jlc3VsdFt1XV0pIHtcbiAgICAgICAgaWYgKHUgPiAwKSB7XG4gICAgICAgICAgcFtpXSA9IHJlc3VsdFt1IC0gMV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W3VdID0gaTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdSA9IHJlc3VsdC5sZW5ndGg7XG4gIHYgPSByZXN1bHRbdSAtIDFdO1xuICB3aGlsZSAodS0tID4gMCkge1xuICAgIHJlc3VsdFt1XSA9IHY7XG4gICAgdiA9IHBbdl07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KGluc3RhbmNlKSB7XG4gIGNvbnN0IHN1YkNvbXBvbmVudCA9IGluc3RhbmNlLnN1YlRyZWUuY29tcG9uZW50O1xuICBpZiAoc3ViQ29tcG9uZW50KSB7XG4gICAgaWYgKHN1YkNvbXBvbmVudC5hc3luY0RlcCAmJiAhc3ViQ29tcG9uZW50LmFzeW5jUmVzb2x2ZWQpIHtcbiAgICAgIHJldHVybiBzdWJDb21wb25lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2NhdGVOb25IeWRyYXRlZEFzeW5jUm9vdChzdWJDb21wb25lbnQpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBpc1RlbGVwb3J0ID0gKHR5cGUpID0+IHR5cGUuX19pc1RlbGVwb3J0O1xuY29uc3QgaXNUZWxlcG9ydERpc2FibGVkID0gKHByb3BzKSA9PiBwcm9wcyAmJiAocHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMuZGlzYWJsZWQgPT09IFwiXCIpO1xuY29uc3QgaXNUYXJnZXRTVkcgPSAodGFyZ2V0KSA9PiB0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50O1xuY29uc3QgaXNUYXJnZXRNYXRoTUwgPSAodGFyZ2V0KSA9PiB0eXBlb2YgTWF0aE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIHRhcmdldCBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQ7XG5jb25zdCByZXNvbHZlVGFyZ2V0ID0gKHByb3BzLCBzZWxlY3QpID0+IHtcbiAgY29uc3QgdGFyZ2V0U2VsZWN0b3IgPSBwcm9wcyAmJiBwcm9wcy50bztcbiAgaWYgKGlzU3RyaW5nKHRhcmdldFNlbGVjdG9yKSkge1xuICAgIGlmICghc2VsZWN0KSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShcbiAgICAgICAgYEN1cnJlbnQgcmVuZGVyZXIgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgdGFyZ2V0IGZvciBUZWxlcG9ydHMuIChtaXNzaW5nIHF1ZXJ5U2VsZWN0b3IgcmVuZGVyZXIgb3B0aW9uKWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0KHRhcmdldFNlbGVjdG9yKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9jYXRlIFRlbGVwb3J0IHRhcmdldCB3aXRoIHNlbGVjdG9yIFwiJHt0YXJnZXRTZWxlY3Rvcn1cIi4gTm90ZSB0aGUgdGFyZ2V0IGVsZW1lbnQgbXVzdCBleGlzdCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkIC0gaS5lLiB0aGUgdGFyZ2V0IGNhbm5vdCBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9uZW50IGl0c2VsZiwgYW5kIGlkZWFsbHkgc2hvdWxkIGJlIG91dHNpZGUgb2YgdGhlIGVudGlyZSBWdWUgY29tcG9uZW50IHRyZWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXRhcmdldFNlbGVjdG9yICYmICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgICB3YXJuJDEoYEludmFsaWQgVGVsZXBvcnQgdGFyZ2V0OiAke3RhcmdldFNlbGVjdG9yfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0U2VsZWN0b3I7XG4gIH1cbn07XG5jb25zdCBUZWxlcG9ydEltcGwgPSB7XG4gIG5hbWU6IFwiVGVsZXBvcnRcIixcbiAgX19pc1RlbGVwb3J0OiB0cnVlLFxuICBwcm9jZXNzKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIGludGVybmFscykge1xuICAgIGNvbnN0IHtcbiAgICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgICAgcGM6IHBhdGNoQ2hpbGRyZW4sXG4gICAgICBwYmM6IHBhdGNoQmxvY2tDaGlsZHJlbixcbiAgICAgIG86IHsgaW5zZXJ0LCBxdWVyeVNlbGVjdG9yLCBjcmVhdGVUZXh0LCBjcmVhdGVDb21tZW50IH1cbiAgICB9ID0gaW50ZXJuYWxzO1xuICAgIGNvbnN0IGRpc2FibGVkID0gaXNUZWxlcG9ydERpc2FibGVkKG4yLnByb3BzKTtcbiAgICBsZXQgeyBzaGFwZUZsYWcsIGNoaWxkcmVuLCBkeW5hbWljQ2hpbGRyZW4gfSA9IG4yO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGlzSG1yVXBkYXRpbmcpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gbjIuZWwgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlQ29tbWVudChcInRlbGVwb3J0IHN0YXJ0XCIpIDogY3JlYXRlVGV4dChcIlwiKTtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gY3JlYXRlQ29tbWVudChcInRlbGVwb3J0IGVuZFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBpbnNlcnQocGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGluc2VydChtYWluQW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KG4yLnByb3BzLCBxdWVyeVNlbGVjdG9yKTtcbiAgICAgIGNvbnN0IHRhcmdldEFuY2hvciA9IG4yLnRhcmdldEFuY2hvciA9IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGluc2VydCh0YXJnZXRBbmNob3IsIHRhcmdldCk7XG4gICAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwic3ZnXCIgfHwgaXNUYXJnZXRTVkcodGFyZ2V0KSkge1xuICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlID09PSBcIm1hdGhtbFwiIHx8IGlzVGFyZ2V0TWF0aE1MKHRhcmdldCkpIHtcbiAgICAgICAgICBuYW1lc3BhY2UgPSBcIm1hdGhtbFwiO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWRpc2FibGVkKSB7XG4gICAgICAgIHdhcm4kMShcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIG1vdW50OlwiLCB0YXJnZXQsIGAoJHt0eXBlb2YgdGFyZ2V0fSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdW50ID0gKGNvbnRhaW5lcjIsIGFuY2hvcjIpID0+IHtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgbW91bnQoY29udGFpbmVyLCBtYWluQW5jaG9yKTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIG1vdW50KHRhcmdldCwgdGFyZ2V0QW5jaG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiB8fCBpc1RhcmdldE1hdGhNTCh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICB9XG4gICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnRDb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKCF3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbWFpbkFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChuMi5wcm9wcyAmJiBuMS5wcm9wcyAmJiBuMi5wcm9wcy50byAhPT0gbjEucHJvcHMudG8pIHtcbiAgICAgICAgICAgIG4yLnByb3BzLnRvID0gbjEucHJvcHMudG87XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKG4yLnByb3BzICYmIG4yLnByb3BzLnRvKSAhPT0gKG4xLnByb3BzICYmIG4xLnByb3BzLnRvKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRUYXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgbjIucHJvcHMsXG4gICAgICAgICAgICBxdWVyeVNlbGVjdG9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobmV4dFRhcmdldCkge1xuICAgICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgICBuMixcbiAgICAgICAgICAgICAgbmV4dFRhcmdldCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICB9LFxuICByZW1vdmUodm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG9wdGltaXplZCwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgYW5jaG9yLCB0YXJnZXRBbmNob3IsIHRhcmdldCwgcHJvcHMgfSA9IHZub2RlO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gICAgZG9SZW1vdmUgJiYgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gZG9SZW1vdmUgfHwgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNob3VsZFJlbW92ZSxcbiAgICAgICAgICAhIWNoaWxkLmR5bmFtaWNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW92ZTogbW92ZVRlbGVwb3J0LFxuICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyKSB7XG4gIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgIGluc2VydCh2bm9kZS50YXJnZXRBbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNSZW9yZGVyID0gbW92ZVR5cGUgPT09IDI7XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBpZiAoIWlzUmVvcmRlciB8fCBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciB9XG59LCBoeWRyYXRlQ2hpbGRyZW4pIHtcbiAgY29uc3QgdGFyZ2V0ID0gdm5vZGUudGFyZ2V0ID0gcmVzb2x2ZVRhcmdldChcbiAgICB2bm9kZS5wcm9wcyxcbiAgICBxdWVyeVNlbGVjdG9yXG4gICk7XG4gIGlmICh0YXJnZXQpIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gdGFyZ2V0Ll9scGEgfHwgdGFyZ2V0LmZpcnN0Q2hpbGQ7XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBpZiAoaXNUZWxlcG9ydERpc2FibGVkKHZub2RlLnByb3BzKSkge1xuICAgICAgICB2bm9kZS5hbmNob3IgPSBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgcGFyZW50Tm9kZShub2RlKSxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgICB2bm9kZS50YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm5vZGUuYW5jaG9yID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIGxldCB0YXJnZXRBbmNob3IgPSB0YXJnZXROb2RlO1xuICAgICAgICB3aGlsZSAodGFyZ2V0QW5jaG9yKSB7XG4gICAgICAgICAgdGFyZ2V0QW5jaG9yID0gbmV4dFNpYmxpbmcodGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICBpZiAodGFyZ2V0QW5jaG9yICYmIHRhcmdldEFuY2hvci5ub2RlVHlwZSA9PT0gOCAmJiB0YXJnZXRBbmNob3IuZGF0YSA9PT0gXCJ0ZWxlcG9ydCBhbmNob3JcIikge1xuICAgICAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0QW5jaG9yO1xuICAgICAgICAgICAgdGFyZ2V0Ll9scGEgPSB2bm9kZS50YXJnZXRBbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUudGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBoeWRyYXRlQ2hpbGRyZW4oXG4gICAgICAgICAgdGFyZ2V0Tm9kZSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlQ3NzVmFycyh2bm9kZSk7XG4gIH1cbiAgcmV0dXJuIHZub2RlLmFuY2hvciAmJiBuZXh0U2libGluZyh2bm9kZS5hbmNob3IpO1xufVxuY29uc3QgVGVsZXBvcnQgPSBUZWxlcG9ydEltcGw7XG5mdW5jdGlvbiB1cGRhdGVDc3NWYXJzKHZub2RlKSB7XG4gIGNvbnN0IGN0eCA9IHZub2RlLmN0eDtcbiAgaWYgKGN0eCAmJiBjdHgudXQpIHtcbiAgICBsZXQgbm9kZSA9IHZub2RlLmNoaWxkcmVuWzBdLmVsO1xuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IHZub2RlLnRhcmdldEFuY2hvcikge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpXG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS12LW93bmVyXCIsIGN0eC51aWQpO1xuICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIGN0eC51dCgpO1xuICB9XG59XG5cbmNvbnN0IEZyYWdtZW50ID0gU3ltYm9sLmZvcihcInYtZmd0XCIpO1xuY29uc3QgVGV4dCA9IFN5bWJvbC5mb3IoXCJ2LXR4dFwiKTtcbmNvbnN0IENvbW1lbnQgPSBTeW1ib2wuZm9yKFwidi1jbXRcIik7XG5jb25zdCBTdGF0aWMgPSBTeW1ib2wuZm9yKFwidi1zdGNcIik7XG5jb25zdCBibG9ja1N0YWNrID0gW107XG5sZXQgY3VycmVudEJsb2NrID0gbnVsbDtcbmZ1bmN0aW9uIG9wZW5CbG9jayhkaXNhYmxlVHJhY2tpbmcgPSBmYWxzZSkge1xuICBibG9ja1N0YWNrLnB1c2goY3VycmVudEJsb2NrID0gZGlzYWJsZVRyYWNraW5nID8gbnVsbCA6IFtdKTtcbn1cbmZ1bmN0aW9uIGNsb3NlQmxvY2soKSB7XG4gIGJsb2NrU3RhY2sucG9wKCk7XG4gIGN1cnJlbnRCbG9jayA9IGJsb2NrU3RhY2tbYmxvY2tTdGFjay5sZW5ndGggLSAxXSB8fCBudWxsO1xufVxubGV0IGlzQmxvY2tUcmVlRW5hYmxlZCA9IDE7XG5mdW5jdGlvbiBzZXRCbG9ja1RyYWNraW5nKHZhbHVlKSB7XG4gIGlzQmxvY2tUcmVlRW5hYmxlZCArPSB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHNldHVwQmxvY2sodm5vZGUpIHtcbiAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gaXNCbG9ja1RyZWVFbmFibGVkID4gMCA/IGN1cnJlbnRCbG9jayB8fCBFTVBUWV9BUlIgOiBudWxsO1xuICBjbG9zZUJsb2NrKCk7XG4gIGlmIChpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50QmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcywgc2hhcGVGbGFnKSB7XG4gIHJldHVybiBzZXR1cEJsb2NrKFxuICAgIGNyZWF0ZUJhc2VWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgc2hhcGVGbGFnLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHR5cGUsIHByb3BzLCBjaGlsZHJlbiwgcGF0Y2hGbGFnLCBkeW5hbWljUHJvcHMpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlVk5vZGUoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGR5bmFtaWNQcm9wcyxcbiAgICAgIHRydWVcbiAgICApXG4gICk7XG59XG5mdW5jdGlvbiBpc1ZOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA/IHZhbHVlLl9fdl9pc1ZOb2RlID09PSB0cnVlIDogZmFsc2U7XG59XG5mdW5jdGlvbiBpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG4yLnNoYXBlRmxhZyAmIDYgJiYgaG1yRGlydHlDb21wb25lbnRzLmhhcyhuMi50eXBlKSkge1xuICAgIG4xLnNoYXBlRmxhZyAmPSB+MjU2O1xuICAgIG4yLnNoYXBlRmxhZyAmPSB+NTEyO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbjEudHlwZSA9PT0gbjIudHlwZSAmJiBuMS5rZXkgPT09IG4yLmtleTtcbn1cbmxldCB2bm9kZUFyZ3NUcmFuc2Zvcm1lcjtcbmZ1bmN0aW9uIHRyYW5zZm9ybVZOb2RlQXJncyh0cmFuc2Zvcm1lcikge1xuICB2bm9kZUFyZ3NUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyO1xufVxuY29uc3QgY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBfY3JlYXRlVk5vZGUoXG4gICAgLi4udm5vZGVBcmdzVHJhbnNmb3JtZXIgPyB2bm9kZUFyZ3NUcmFuc2Zvcm1lcihhcmdzLCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIDogYXJnc1xuICApO1xufTtcbmNvbnN0IEludGVybmFsT2JqZWN0S2V5ID0gYF9fdkludGVybmFsYDtcbmNvbnN0IG5vcm1hbGl6ZUtleSA9ICh7IGtleSB9KSA9PiBrZXkgIT0gbnVsbCA/IGtleSA6IG51bGw7XG5jb25zdCBub3JtYWxpemVSZWYgPSAoe1xuICByZWYsXG4gIHJlZl9rZXksXG4gIHJlZl9mb3Jcbn0pID0+IHtcbiAgaWYgKHR5cGVvZiByZWYgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZWYgPSBcIlwiICsgcmVmO1xuICB9XG4gIHJldHVybiByZWYgIT0gbnVsbCA/IGlzU3RyaW5nKHJlZikgfHwgaXNSZWYocmVmKSB8fCBpc0Z1bmN0aW9uKHJlZikgPyB7IGk6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSwgcjogcmVmLCBrOiByZWZfa2V5LCBmOiAhIXJlZl9mb3IgfSA6IHJlZiA6IG51bGw7XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBzaGFwZUZsYWcgPSB0eXBlID09PSBGcmFnbWVudCA/IDAgOiAxLCBpc0Jsb2NrTm9kZSA9IGZhbHNlLCBuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHZub2RlID0ge1xuICAgIF9fdl9pc1ZOb2RlOiB0cnVlLFxuICAgIF9fdl9za2lwOiB0cnVlLFxuICAgIHR5cGUsXG4gICAgcHJvcHMsXG4gICAga2V5OiBwcm9wcyAmJiBub3JtYWxpemVLZXkocHJvcHMpLFxuICAgIHJlZjogcHJvcHMgJiYgbm9ybWFsaXplUmVmKHByb3BzKSxcbiAgICBzY29wZUlkOiBjdXJyZW50U2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IG51bGwsXG4gICAgY2hpbGRyZW4sXG4gICAgY29tcG9uZW50OiBudWxsLFxuICAgIHN1c3BlbnNlOiBudWxsLFxuICAgIHNzQ29udGVudDogbnVsbCxcbiAgICBzc0ZhbGxiYWNrOiBudWxsLFxuICAgIGRpcnM6IG51bGwsXG4gICAgdHJhbnNpdGlvbjogbnVsbCxcbiAgICBlbDogbnVsbCxcbiAgICBhbmNob3I6IG51bGwsXG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHRhcmdldEFuY2hvcjogbnVsbCxcbiAgICBzdGF0aWNDb3VudDogMCxcbiAgICBzaGFwZUZsYWcsXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IG51bGwsXG4gICAgYXBwQ29udGV4dDogbnVsbCxcbiAgICBjdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZVxuICB9O1xuICBpZiAobmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24pIHtcbiAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHR5cGUubm9ybWFsaXplKHZub2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICB2bm9kZS5zaGFwZUZsYWcgfD0gaXNTdHJpbmcoY2hpbGRyZW4pID8gOCA6IDE2O1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLmtleSAhPT0gdm5vZGUua2V5KSB7XG4gICAgd2FybiQxKGBWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6YCwgdm5vZGUudHlwZSk7XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgLy8gYXZvaWQgYSBibG9jayBub2RlIGZyb20gdHJhY2tpbmcgaXRzZWxmXG4gICFpc0Jsb2NrTm9kZSAmJiAvLyBoYXMgY3VycmVudCBwYXJlbnQgYmxvY2tcbiAgY3VycmVudEJsb2NrICYmIC8vIHByZXNlbmNlIG9mIGEgcGF0Y2ggZmxhZyBpbmRpY2F0ZXMgdGhpcyBub2RlIG5lZWRzIHBhdGNoaW5nIG9uIHVwZGF0ZXMuXG4gIC8vIGNvbXBvbmVudCBub2RlcyBhbHNvIHNob3VsZCBhbHdheXMgYmUgcGF0Y2hlZCwgYmVjYXVzZSBldmVuIGlmIHRoZVxuICAvLyBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSwgaXQgbmVlZHMgdG8gcGVyc2lzdCB0aGUgaW5zdGFuY2Ugb24gdG9cbiAgLy8gdGhlIG5leHQgdm5vZGUgc28gdGhhdCBpdCBjYW4gYmUgcHJvcGVybHkgdW5tb3VudGVkIGxhdGVyLlxuICAodm5vZGUucGF0Y2hGbGFnID4gMCB8fCBzaGFwZUZsYWcgJiA2KSAmJiAvLyB0aGUgRVZFTlRTIGZsYWcgaXMgb25seSBmb3IgaHlkcmF0aW9uIGFuZCBpZiBpdCBpcyB0aGUgb25seSBmbGFnLCB0aGVcbiAgLy8gdm5vZGUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGR5bmFtaWMgZHVlIHRvIGhhbmRsZXIgY2FjaGluZy5cbiAgdm5vZGUucGF0Y2hGbGFnICE9PSAzMikge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlO1xuZnVuY3Rpb24gX2NyZWF0ZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBpc0Jsb2NrTm9kZSA9IGZhbHNlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXR5cGUpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB2bm9kZSB0eXBlIHdoZW4gY3JlYXRpbmcgdm5vZGU6ICR7dHlwZX0uYCk7XG4gICAgfVxuICAgIHR5cGUgPSBDb21tZW50O1xuICB9XG4gIGlmIChpc1ZOb2RlKHR5cGUpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHRydWVcbiAgICAgIC8qIG1lcmdlUmVmOiB0cnVlICovXG4gICAgKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIG5vcm1hbGl6ZUNoaWxkcmVuKGNsb25lZCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAhaXNCbG9ja05vZGUgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgICBpZiAoY2xvbmVkLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgY3VycmVudEJsb2NrW2N1cnJlbnRCbG9jay5pbmRleE9mKHR5cGUpXSA9IGNsb25lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRCbG9jay5wdXNoKGNsb25lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsb25lZC5wYXRjaEZsYWcgfD0gLTI7XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxuICBpZiAoaXNDbGFzc0NvbXBvbmVudCh0eXBlKSkge1xuICAgIHR5cGUgPSB0eXBlLl9fdmNjT3B0cztcbiAgfVxuICBpZiAocHJvcHMpIHtcbiAgICBwcm9wcyA9IGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcyk7XG4gICAgbGV0IHsgY2xhc3M6IGtsYXNzLCBzdHlsZSB9ID0gcHJvcHM7XG4gICAgaWYgKGtsYXNzICYmICFpc1N0cmluZyhrbGFzcykpIHtcbiAgICAgIHByb3BzLmNsYXNzID0gbm9ybWFsaXplQ2xhc3Moa2xhc3MpO1xuICAgIH1cbiAgICBpZiAoaXNPYmplY3Qoc3R5bGUpKSB7XG4gICAgICBpZiAoaXNQcm94eShzdHlsZSkgJiYgIWlzQXJyYXkoc3R5bGUpKSB7XG4gICAgICAgIHN0eWxlID0gZXh0ZW5kKHt9LCBzdHlsZSk7XG4gICAgICB9XG4gICAgICBwcm9wcy5zdHlsZSA9IG5vcm1hbGl6ZVN0eWxlKHN0eWxlKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2hhcGVGbGFnID0gaXNTdHJpbmcodHlwZSkgPyAxIDogaXNTdXNwZW5zZSh0eXBlKSA/IDEyOCA6IGlzVGVsZXBvcnQodHlwZSkgPyA2NCA6IGlzT2JqZWN0KHR5cGUpID8gNCA6IGlzRnVuY3Rpb24odHlwZSkgPyAyIDogMDtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2hhcGVGbGFnICYgNCAmJiBpc1Byb3h5KHR5cGUpKSB7XG4gICAgdHlwZSA9IHRvUmF3KHR5cGUpO1xuICAgIHdhcm4kMShcbiAgICAgIGBWdWUgcmVjZWl2ZWQgYSBDb21wb25lbnQgdGhhdCB3YXMgbWFkZSBhIHJlYWN0aXZlIG9iamVjdC4gVGhpcyBjYW4gbGVhZCB0byB1bm5lY2Vzc2FyeSBwZXJmb3JtYW5jZSBvdmVyaGVhZCBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgYnkgbWFya2luZyB0aGUgY29tcG9uZW50IHdpdGggXFxgbWFya1Jhd1xcYCBvciB1c2luZyBcXGBzaGFsbG93UmVmXFxgIGluc3RlYWQgb2YgXFxgcmVmXFxgLmAsXG4gICAgICBgXG5Db21wb25lbnQgdGhhdCB3YXMgbWFkZSByZWFjdGl2ZTogYCxcbiAgICAgIHR5cGVcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVCYXNlVk5vZGUoXG4gICAgdHlwZSxcbiAgICBwcm9wcyxcbiAgICBjaGlsZHJlbixcbiAgICBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzLFxuICAgIHNoYXBlRmxhZyxcbiAgICBpc0Jsb2NrTm9kZSxcbiAgICB0cnVlXG4gICk7XG59XG5mdW5jdGlvbiBndWFyZFJlYWN0aXZlUHJvcHMocHJvcHMpIHtcbiAgaWYgKCFwcm9wcylcbiAgICByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGlzUHJveHkocHJvcHMpIHx8IEludGVybmFsT2JqZWN0S2V5IGluIHByb3BzID8gZXh0ZW5kKHt9LCBwcm9wcykgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIGNsb25lVk5vZGUodm5vZGUsIGV4dHJhUHJvcHMsIG1lcmdlUmVmID0gZmFsc2UpIHtcbiAgY29uc3QgeyBwcm9wcywgcmVmLCBwYXRjaEZsYWcsIGNoaWxkcmVuIH0gPSB2bm9kZTtcbiAgY29uc3QgbWVyZ2VkUHJvcHMgPSBleHRyYVByb3BzID8gbWVyZ2VQcm9wcyhwcm9wcyB8fCB7fSwgZXh0cmFQcm9wcykgOiBwcm9wcztcbiAgY29uc3QgY2xvbmVkID0ge1xuICAgIF9fdl9pc1ZOb2RlOiB0cnVlLFxuICAgIF9fdl9za2lwOiB0cnVlLFxuICAgIHR5cGU6IHZub2RlLnR5cGUsXG4gICAgcHJvcHM6IG1lcmdlZFByb3BzLFxuICAgIGtleTogbWVyZ2VkUHJvcHMgJiYgbm9ybWFsaXplS2V5KG1lcmdlZFByb3BzKSxcbiAgICByZWY6IGV4dHJhUHJvcHMgJiYgZXh0cmFQcm9wcy5yZWYgPyAoXG4gICAgICAvLyAjMjA3OCBpbiB0aGUgY2FzZSBvZiA8Y29tcG9uZW50IDppcz1cInZub2RlXCIgcmVmPVwiZXh0cmFcIi8+XG4gICAgICAvLyBpZiB0aGUgdm5vZGUgaXRzZWxmIGFscmVhZHkgaGFzIGEgcmVmLCBjbG9uZVZOb2RlIHdpbGwgbmVlZCB0byBtZXJnZVxuICAgICAgLy8gdGhlIHJlZnMgc28gdGhlIHNpbmdsZSB2bm9kZSBjYW4gYmUgc2V0IG9uIG11bHRpcGxlIHJlZnNcbiAgICAgIG1lcmdlUmVmICYmIHJlZiA/IGlzQXJyYXkocmVmKSA/IHJlZi5jb25jYXQobm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpKSA6IFtyZWYsIG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKV0gOiBub3JtYWxpemVSZWYoZXh0cmFQcm9wcylcbiAgICApIDogcmVmLFxuICAgIHNjb3BlSWQ6IHZub2RlLnNjb3BlSWQsXG4gICAgc2xvdFNjb3BlSWRzOiB2bm9kZS5zbG90U2NvcGVJZHMsXG4gICAgY2hpbGRyZW46ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgcGF0Y2hGbGFnID09PSAtMSAmJiBpc0FycmF5KGNoaWxkcmVuKSA/IGNoaWxkcmVuLm1hcChkZWVwQ2xvbmVWTm9kZSkgOiBjaGlsZHJlbixcbiAgICB0YXJnZXQ6IHZub2RlLnRhcmdldCxcbiAgICB0YXJnZXRBbmNob3I6IHZub2RlLnRhcmdldEFuY2hvcixcbiAgICBzdGF0aWNDb3VudDogdm5vZGUuc3RhdGljQ291bnQsXG4gICAgc2hhcGVGbGFnOiB2bm9kZS5zaGFwZUZsYWcsXG4gICAgLy8gaWYgdGhlIHZub2RlIGlzIGNsb25lZCB3aXRoIGV4dHJhIHByb3BzLCB3ZSBjYW4gbm8gbG9uZ2VyIGFzc3VtZSBpdHNcbiAgICAvLyBleGlzdGluZyBwYXRjaCBmbGFnIHRvIGJlIHJlbGlhYmxlIGFuZCBuZWVkIHRvIGFkZCB0aGUgRlVMTF9QUk9QUyBmbGFnLlxuICAgIC8vIG5vdGU6IHByZXNlcnZlIGZsYWcgZm9yIGZyYWdtZW50cyBzaW5jZSB0aGV5IHVzZSB0aGUgZmxhZyBmb3IgY2hpbGRyZW5cbiAgICAvLyBmYXN0IHBhdGhzIG9ubHkuXG4gICAgcGF0Y2hGbGFnOiBleHRyYVByb3BzICYmIHZub2RlLnR5cGUgIT09IEZyYWdtZW50ID8gcGF0Y2hGbGFnID09PSAtMSA/IDE2IDogcGF0Y2hGbGFnIHwgMTYgOiBwYXRjaEZsYWcsXG4gICAgZHluYW1pY1Byb3BzOiB2bm9kZS5keW5hbWljUHJvcHMsXG4gICAgZHluYW1pY0NoaWxkcmVuOiB2bm9kZS5keW5hbWljQ2hpbGRyZW4sXG4gICAgYXBwQ29udGV4dDogdm5vZGUuYXBwQ29udGV4dCxcbiAgICBkaXJzOiB2bm9kZS5kaXJzLFxuICAgIHRyYW5zaXRpb246IHZub2RlLnRyYW5zaXRpb24sXG4gICAgLy8gVGhlc2Ugc2hvdWxkIHRlY2huaWNhbGx5IG9ubHkgYmUgbm9uLW51bGwgb24gbW91bnRlZCBWTm9kZXMuIEhvd2V2ZXIsXG4gICAgLy8gdGhleSAqc2hvdWxkKiBiZSBjb3BpZWQgZm9yIGtlcHQtYWxpdmUgdm5vZGVzLiBTbyB3ZSBqdXN0IGFsd2F5cyBjb3B5XG4gICAgLy8gdGhlbSBzaW5jZSB0aGVtIGJlaW5nIG5vbi1udWxsIGR1cmluZyBhIG1vdW50IGRvZXNuJ3QgYWZmZWN0IHRoZSBsb2dpYyBhc1xuICAgIC8vIHRoZXkgd2lsbCBzaW1wbHkgYmUgb3ZlcndyaXR0ZW4uXG4gICAgY29tcG9uZW50OiB2bm9kZS5jb21wb25lbnQsXG4gICAgc3VzcGVuc2U6IHZub2RlLnN1c3BlbnNlLFxuICAgIHNzQ29udGVudDogdm5vZGUuc3NDb250ZW50ICYmIGNsb25lVk5vZGUodm5vZGUuc3NDb250ZW50KSxcbiAgICBzc0ZhbGxiYWNrOiB2bm9kZS5zc0ZhbGxiYWNrICYmIGNsb25lVk5vZGUodm5vZGUuc3NGYWxsYmFjayksXG4gICAgZWw6IHZub2RlLmVsLFxuICAgIGFuY2hvcjogdm5vZGUuYW5jaG9yLFxuICAgIGN0eDogdm5vZGUuY3R4LFxuICAgIGNlOiB2bm9kZS5jZVxuICB9O1xuICByZXR1cm4gY2xvbmVkO1xufVxuZnVuY3Rpb24gZGVlcENsb25lVk5vZGUodm5vZGUpIHtcbiAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gIGlmIChpc0FycmF5KHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGNsb25lZC5jaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuLm1hcChkZWVwQ2xvbmVWTm9kZSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSh0ZXh0ID0gXCIgXCIsIGZsYWcgPSAwKSB7XG4gIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCB0ZXh0LCBmbGFnKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRpY1ZOb2RlKGNvbnRlbnQsIG51bWJlck9mTm9kZXMpIHtcbiAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShTdGF0aWMsIG51bGwsIGNvbnRlbnQpO1xuICB2bm9kZS5zdGF0aWNDb3VudCA9IG51bWJlck9mTm9kZXM7XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnRWTm9kZSh0ZXh0ID0gXCJcIiwgYXNCbG9jayA9IGZhbHNlKSB7XG4gIHJldHVybiBhc0Jsb2NrID8gKG9wZW5CbG9jaygpLCBjcmVhdGVCbG9jayhDb21tZW50LCBudWxsLCB0ZXh0KSkgOiBjcmVhdGVWTm9kZShDb21tZW50LCBudWxsLCB0ZXh0KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZOb2RlKGNoaWxkKSB7XG4gIGlmIChjaGlsZCA9PSBudWxsIHx8IHR5cGVvZiBjaGlsZCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShjaGlsZCkpIHtcbiAgICByZXR1cm4gY3JlYXRlVk5vZGUoXG4gICAgICBGcmFnbWVudCxcbiAgICAgIG51bGwsXG4gICAgICAvLyAjMzY2NiwgYXZvaWQgcmVmZXJlbmNlIHBvbGx1dGlvbiB3aGVuIHJldXNpbmcgdm5vZGVcbiAgICAgIGNoaWxkLnNsaWNlKClcbiAgICApO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBjbG9uZUlmTW91bnRlZChjaGlsZCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFRleHQsIG51bGwsIFN0cmluZyhjaGlsZCkpO1xuICB9XG59XG5mdW5jdGlvbiBjbG9uZUlmTW91bnRlZChjaGlsZCkge1xuICByZXR1cm4gY2hpbGQuZWwgPT09IG51bGwgJiYgY2hpbGQucGF0Y2hGbGFnICE9PSAtMSB8fCBjaGlsZC5tZW1vID8gY2hpbGQgOiBjbG9uZVZOb2RlKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbikge1xuICBsZXQgdHlwZSA9IDA7XG4gIGNvbnN0IHsgc2hhcGVGbGFnIH0gPSB2bm9kZTtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH0gZWxzZSBpZiAoaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICB0eXBlID0gMTY7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNoaWxkcmVuID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmICgxIHwgNjQpKSB7XG4gICAgICBjb25zdCBzbG90ID0gY2hpbGRyZW4uZGVmYXVsdDtcbiAgICAgIGlmIChzbG90KSB7XG4gICAgICAgIHNsb3QuX2MgJiYgKHNsb3QuX2QgPSBmYWxzZSk7XG4gICAgICAgIG5vcm1hbGl6ZUNoaWxkcmVuKHZub2RlLCBzbG90KCkpO1xuICAgICAgICBzbG90Ll9jICYmIChzbG90Ll9kID0gdHJ1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSAzMjtcbiAgICAgIGNvbnN0IHNsb3RGbGFnID0gY2hpbGRyZW4uXztcbiAgICAgIGlmICghc2xvdEZsYWcgJiYgIShJbnRlcm5hbE9iamVjdEtleSBpbiBjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4uX2N0eCA9IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSBpZiAoc2xvdEZsYWcgPT09IDMgJiYgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2Uuc2xvdHMuXyA9PT0gMSkge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoaWxkcmVuLl8gPSAyO1xuICAgICAgICAgIHZub2RlLnBhdGNoRmxhZyB8PSAxMDI0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2hpbGRyZW4pKSB7XG4gICAgY2hpbGRyZW4gPSB7IGRlZmF1bHQ6IGNoaWxkcmVuLCBfY3R4OiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgfTtcbiAgICB0eXBlID0gMzI7XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiA2NCkge1xuICAgICAgdHlwZSA9IDE2O1xuICAgICAgY2hpbGRyZW4gPSBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGUgPSA4O1xuICAgIH1cbiAgfVxuICB2bm9kZS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB2bm9kZS5zaGFwZUZsYWcgfD0gdHlwZTtcbn1cbmZ1bmN0aW9uIG1lcmdlUHJvcHMoLi4uYXJncykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG9NZXJnZSA9IGFyZ3NbaV07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdG9NZXJnZSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiKSB7XG4gICAgICAgIGlmIChyZXQuY2xhc3MgIT09IHRvTWVyZ2UuY2xhc3MpIHtcbiAgICAgICAgICByZXQuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhbcmV0LmNsYXNzLCB0b01lcmdlLmNsYXNzXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgcmV0LnN0eWxlID0gbm9ybWFsaXplU3R5bGUoW3JldC5zdHlsZSwgdG9NZXJnZS5zdHlsZV0pO1xuICAgICAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXRba2V5XTtcbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSB0b01lcmdlW2tleV07XG4gICAgICAgIGlmIChpbmNvbWluZyAmJiBleGlzdGluZyAhPT0gaW5jb21pbmcgJiYgIShpc0FycmF5KGV4aXN0aW5nKSAmJiBleGlzdGluZy5pbmNsdWRlcyhpbmNvbWluZykpKSB7XG4gICAgICAgICAgcmV0W2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChleGlzdGluZywgaW5jb21pbmcpIDogaW5jb21pbmc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBcIlwiKSB7XG4gICAgICAgIHJldFtrZXldID0gdG9NZXJnZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gaW52b2tlVk5vZGVIb29rKGhvb2ssIGluc3RhbmNlLCB2bm9kZSwgcHJldlZOb2RlID0gbnVsbCkge1xuICBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCBpbnN0YW5jZSwgNywgW1xuICAgIHZub2RlLFxuICAgIHByZXZWTm9kZVxuICBdKTtcbn1cblxuY29uc3QgZW1wdHlBcHBDb250ZXh0ID0gY3JlYXRlQXBwQ29udGV4dCgpO1xubGV0IHVpZCA9IDA7XG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSh2bm9kZSwgcGFyZW50LCBzdXNwZW5zZSkge1xuICBjb25zdCB0eXBlID0gdm5vZGUudHlwZTtcbiAgY29uc3QgYXBwQ29udGV4dCA9IChwYXJlbnQgPyBwYXJlbnQuYXBwQ29udGV4dCA6IHZub2RlLmFwcENvbnRleHQpIHx8IGVtcHR5QXBwQ29udGV4dDtcbiAgY29uc3QgaW5zdGFuY2UgPSB7XG4gICAgdWlkOiB1aWQrKyxcbiAgICB2bm9kZSxcbiAgICB0eXBlLFxuICAgIHBhcmVudCxcbiAgICBhcHBDb250ZXh0LFxuICAgIHJvb3Q6IG51bGwsXG4gICAgLy8gdG8gYmUgaW1tZWRpYXRlbHkgc2V0XG4gICAgbmV4dDogbnVsbCxcbiAgICBzdWJUcmVlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBlZmZlY3Q6IG51bGwsXG4gICAgdXBkYXRlOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHN5bmNocm9ub3VzbHkgcmlnaHQgYWZ0ZXIgY3JlYXRpb25cbiAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKFxuICAgICAgdHJ1ZVxuICAgICAgLyogZGV0YWNoZWQgKi9cbiAgICApLFxuICAgIHJlbmRlcjogbnVsbCxcbiAgICBwcm94eTogbnVsbCxcbiAgICBleHBvc2VkOiBudWxsLFxuICAgIGV4cG9zZVByb3h5OiBudWxsLFxuICAgIHdpdGhQcm94eTogbnVsbCxcbiAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICBhY2Nlc3NDYWNoZTogbnVsbCxcbiAgICByZW5kZXJDYWNoZTogW10sXG4gICAgLy8gbG9jYWwgcmVzb2x2ZWQgYXNzZXRzXG4gICAgY29tcG9uZW50czogbnVsbCxcbiAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgIC8vIHJlc29sdmVkIHByb3BzIGFuZCBlbWl0cyBvcHRpb25zXG4gICAgcHJvcHNPcHRpb25zOiBub3JtYWxpemVQcm9wc09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgZW1pdHNPcHRpb25zOiBub3JtYWxpemVFbWl0c09wdGlvbnModHlwZSwgYXBwQ29udGV4dCksXG4gICAgLy8gZW1pdFxuICAgIGVtaXQ6IG51bGwsXG4gICAgLy8gdG8gYmUgc2V0IGltbWVkaWF0ZWx5XG4gICAgZW1pdHRlZDogbnVsbCxcbiAgICAvLyBwcm9wcyBkZWZhdWx0IHZhbHVlXG4gICAgcHJvcHNEZWZhdWx0czogRU1QVFlfT0JKLFxuICAgIC8vIGluaGVyaXRBdHRyc1xuICAgIGluaGVyaXRBdHRyczogdHlwZS5pbmhlcml0QXR0cnMsXG4gICAgLy8gc3RhdGVcbiAgICBjdHg6IEVNUFRZX09CSixcbiAgICBkYXRhOiBFTVBUWV9PQkosXG4gICAgcHJvcHM6IEVNUFRZX09CSixcbiAgICBhdHRyczogRU1QVFlfT0JKLFxuICAgIHNsb3RzOiBFTVBUWV9PQkosXG4gICAgcmVmczogRU1QVFlfT0JKLFxuICAgIHNldHVwU3RhdGU6IEVNUFRZX09CSixcbiAgICBzZXR1cENvbnRleHQ6IG51bGwsXG4gICAgYXR0cnNQcm94eTogbnVsbCxcbiAgICBzbG90c1Byb3h5OiBudWxsLFxuICAgIC8vIHN1c3BlbnNlIHJlbGF0ZWRcbiAgICBzdXNwZW5zZSxcbiAgICBzdXNwZW5zZUlkOiBzdXNwZW5zZSA/IHN1c3BlbnNlLnBlbmRpbmdJZCA6IDAsXG4gICAgYXN5bmNEZXA6IG51bGwsXG4gICAgYXN5bmNSZXNvbHZlZDogZmFsc2UsXG4gICAgLy8gbGlmZWN5Y2xlIGhvb2tzXG4gICAgLy8gbm90IHVzaW5nIGVudW1zIGhlcmUgYmVjYXVzZSBpdCByZXN1bHRzIGluIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzVW5tb3VudGVkOiBmYWxzZSxcbiAgICBpc0RlYWN0aXZhdGVkOiBmYWxzZSxcbiAgICBiYzogbnVsbCxcbiAgICBjOiBudWxsLFxuICAgIGJtOiBudWxsLFxuICAgIG06IG51bGwsXG4gICAgYnU6IG51bGwsXG4gICAgdTogbnVsbCxcbiAgICB1bTogbnVsbCxcbiAgICBidW06IG51bGwsXG4gICAgZGE6IG51bGwsXG4gICAgYTogbnVsbCxcbiAgICBydGc6IG51bGwsXG4gICAgcnRjOiBudWxsLFxuICAgIGVjOiBudWxsLFxuICAgIHNwOiBudWxsXG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5zdGFuY2UuY3R4ID0gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY3R4ID0geyBfOiBpbnN0YW5jZSB9O1xuICB9XG4gIGluc3RhbmNlLnJvb3QgPSBwYXJlbnQgPyBwYXJlbnQucm9vdCA6IGluc3RhbmNlO1xuICBpbnN0YW5jZS5lbWl0ID0gZW1pdC5iaW5kKG51bGwsIGluc3RhbmNlKTtcbiAgaWYgKHZub2RlLmNlKSB7XG4gICAgdm5vZGUuY2UoaW5zdGFuY2UpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmxldCBjdXJyZW50SW5zdGFuY2UgPSBudWxsO1xuY29uc3QgZ2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4gY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbmxldCBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZTtcbmxldCBzZXRJblNTUlNldHVwU3RhdGU7XG57XG4gIGNvbnN0IGcgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIGNvbnN0IHJlZ2lzdGVyR2xvYmFsU2V0dGVyID0gKGtleSwgc2V0dGVyKSA9PiB7XG4gICAgbGV0IHNldHRlcnM7XG4gICAgaWYgKCEoc2V0dGVycyA9IGdba2V5XSkpXG4gICAgICBzZXR0ZXJzID0gZ1trZXldID0gW107XG4gICAgc2V0dGVycy5wdXNoKHNldHRlcik7XG4gICAgcmV0dXJuICh2KSA9PiB7XG4gICAgICBpZiAoc2V0dGVycy5sZW5ndGggPiAxKVxuICAgICAgICBzZXR0ZXJzLmZvckVhY2goKHNldCkgPT4gc2V0KHYpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgc2V0dGVyc1swXSh2KTtcbiAgICB9O1xuICB9O1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZSA9IHJlZ2lzdGVyR2xvYmFsU2V0dGVyKFxuICAgIGBfX1ZVRV9JTlNUQU5DRV9TRVRURVJTX19gLFxuICAgICh2KSA9PiBjdXJyZW50SW5zdGFuY2UgPSB2XG4gICk7XG4gIHNldEluU1NSU2V0dXBTdGF0ZSA9IHJlZ2lzdGVyR2xvYmFsU2V0dGVyKFxuICAgIGBfX1ZVRV9TU1JfU0VUVEVSU19fYCxcbiAgICAodikgPT4gaXNJblNTUkNvbXBvbmVudFNldHVwID0gdlxuICApO1xufVxuY29uc3Qgc2V0Q3VycmVudEluc3RhbmNlID0gKGluc3RhbmNlKSA9PiB7XG4gIGNvbnN0IHByZXYgPSBjdXJyZW50SW5zdGFuY2U7XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgaW5zdGFuY2Uuc2NvcGUub24oKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShwcmV2KTtcbiAgfTtcbn07XG5jb25zdCB1bnNldEN1cnJlbnRJbnN0YW5jZSA9ICgpID0+IHtcbiAgY3VycmVudEluc3RhbmNlICYmIGN1cnJlbnRJbnN0YW5jZS5zY29wZS5vZmYoKTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UobnVsbCk7XG59O1xuY29uc3QgaXNCdWlsdEluVGFnID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoXCJzbG90LGNvbXBvbmVudFwiKTtcbmZ1bmN0aW9uIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb25maWcpIHtcbiAgY29uc3QgYXBwSXNOYXRpdmVUYWcgPSBjb25maWcuaXNOYXRpdmVUYWcgfHwgTk87XG4gIGlmIChpc0J1aWx0SW5UYWcobmFtZSkgfHwgYXBwSXNOYXRpdmVUYWcobmFtZSkpIHtcbiAgICB3YXJuJDEoXG4gICAgICBcIkRvIG5vdCB1c2UgYnVpbHQtaW4gb3IgcmVzZXJ2ZWQgSFRNTCBlbGVtZW50cyBhcyBjb21wb25lbnQgaWQ6IFwiICsgbmFtZVxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDQ7XG59XG5sZXQgaXNJblNTUkNvbXBvbmVudFNldHVwID0gZmFsc2U7XG5mdW5jdGlvbiBzZXR1cENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IgPSBmYWxzZSkge1xuICBpc1NTUiAmJiBzZXRJblNTUlNldHVwU3RhdGUoaXNTU1IpO1xuICBjb25zdCB7IHByb3BzLCBjaGlsZHJlbiB9ID0gaW5zdGFuY2Uudm5vZGU7XG4gIGNvbnN0IGlzU3RhdGVmdWwgPSBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKTtcbiAgaW5pdFByb3BzKGluc3RhbmNlLCBwcm9wcywgaXNTdGF0ZWZ1bCwgaXNTU1IpO1xuICBpbml0U2xvdHMoaW5zdGFuY2UsIGNoaWxkcmVuKTtcbiAgY29uc3Qgc2V0dXBSZXN1bHQgPSBpc1N0YXRlZnVsID8gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIDogdm9pZCAwO1xuICBpc1NTUiAmJiBzZXRJblNTUlNldHVwU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gc2V0dXBSZXN1bHQ7XG59XG5mdW5jdGlvbiBzZXR1cFN0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlLCBpc1NTUikge1xuICB2YXIgX2E7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKENvbXBvbmVudC5uYW1lKSB7XG4gICAgICB2YWxpZGF0ZUNvbXBvbmVudE5hbWUoQ29tcG9uZW50Lm5hbWUsIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKENvbXBvbmVudC5jb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBuYW1lcyA9IE9iamVjdC5rZXlzKENvbXBvbmVudC5jb21wb25lbnRzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWVzW2ldLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuZGlyZWN0aXZlcykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuZGlyZWN0aXZlcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlRGlyZWN0aXZlTmFtZShuYW1lc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcGlsZXJPcHRpb25zICYmIGlzUnVudGltZU9ubHkoKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgXCJjb21waWxlck9wdGlvbnNcIiBpcyBvbmx5IHN1cHBvcnRlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIuIFNpbmNlIHlvdSBhcmUgdXNpbmcgYSBydW50aW1lLW9ubHkgYnVpbGQsIHRoZSBvcHRpb25zIHNob3VsZCBiZSBwYXNzZWQgdmlhIHlvdXIgYnVpbGQgdG9vbCBjb25maWcgaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpbnN0YW5jZS5hY2Nlc3NDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpbnN0YW5jZS5wcm94eSA9IG1hcmtSYXcobmV3IFByb3h5KGluc3RhbmNlLmN0eCwgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKSk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgZXhwb3NlUHJvcHNPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICB9XG4gIGNvbnN0IHsgc2V0dXAgfSA9IENvbXBvbmVudDtcbiAgaWYgKHNldHVwKSB7XG4gICAgY29uc3Qgc2V0dXBDb250ZXh0ID0gaW5zdGFuY2Uuc2V0dXBDb250ZXh0ID0gc2V0dXAubGVuZ3RoID4gMSA/IGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkgOiBudWxsO1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgY29uc3Qgc2V0dXBSZXN1bHQgPSBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBzZXR1cCxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMCxcbiAgICAgIFtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShpbnN0YW5jZS5wcm9wcykgOiBpbnN0YW5jZS5wcm9wcyxcbiAgICAgICAgc2V0dXBDb250ZXh0XG4gICAgICBdXG4gICAgKTtcbiAgICByZXNldFRyYWNraW5nKCk7XG4gICAgcmVzZXQoKTtcbiAgICBpZiAoaXNQcm9taXNlKHNldHVwUmVzdWx0KSkge1xuICAgICAgc2V0dXBSZXN1bHQudGhlbih1bnNldEN1cnJlbnRJbnN0YW5jZSwgdW5zZXRDdXJyZW50SW5zdGFuY2UpO1xuICAgICAgaWYgKGlzU1NSKSB7XG4gICAgICAgIHJldHVybiBzZXR1cFJlc3VsdC50aGVuKChyZXNvbHZlZFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCByZXNvbHZlZFJlc3VsdCwgaXNTU1IpO1xuICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGluc3RhbmNlLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5hc3luY0RlcCA9IHNldHVwUmVzdWx0O1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaW5zdGFuY2Uuc3VzcGVuc2UpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gKF9hID0gQ29tcG9uZW50Lm5hbWUpICE9IG51bGwgPyBfYSA6IFwiQW5vbnltb3VzXCI7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCA8JHtuYW1lfT46IHNldHVwIGZ1bmN0aW9uIHJldHVybmVkIGEgcHJvbWlzZSwgYnV0IG5vIDxTdXNwZW5zZT4gYm91bmRhcnkgd2FzIGZvdW5kIGluIHRoZSBwYXJlbnQgY29tcG9uZW50IHRyZWUuIEEgY29tcG9uZW50IHdpdGggYXN5bmMgc2V0dXAoKSBtdXN0IGJlIG5lc3RlZCBpbiBhIDxTdXNwZW5zZT4gaW4gb3JkZXIgdG8gYmUgcmVuZGVyZWQuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBzZXR1cFJlc3VsdCwgaXNTU1IpIHtcbiAgaWYgKGlzRnVuY3Rpb24oc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKGluc3RhbmNlLnR5cGUuX19zc3JJbmxpbmVSZW5kZXIpIHtcbiAgICAgIGluc3RhbmNlLnNzclJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5yZW5kZXIgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc2V0dXBSZXN1bHQpKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNWTm9kZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHNldHVwKCkgc2hvdWxkIG5vdCByZXR1cm4gVk5vZGVzIGRpcmVjdGx5IC0gcmV0dXJuIGEgcmVuZGVyIGZ1bmN0aW9uIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBpbnN0YW5jZS5kZXZ0b29sc1Jhd1NldHVwU3RhdGUgPSBzZXR1cFJlc3VsdDtcbiAgICB9XG4gICAgaW5zdGFuY2Uuc2V0dXBTdGF0ZSA9IHByb3h5UmVmcyhzZXR1cFJlc3VsdCk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGV4cG9zZVNldHVwU3RhdGVPblJlbmRlckNvbnRleHQoaW5zdGFuY2UpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNldHVwUmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICB3YXJuJDEoXG4gICAgICBgc2V0dXAoKSBzaG91bGQgcmV0dXJuIGFuIG9iamVjdC4gUmVjZWl2ZWQ6ICR7c2V0dXBSZXN1bHQgPT09IG51bGwgPyBcIm51bGxcIiA6IHR5cGVvZiBzZXR1cFJlc3VsdH1gXG4gICAgKTtcbiAgfVxuICBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IpO1xufVxubGV0IGNvbXBpbGU7XG5sZXQgaW5zdGFsbFdpdGhQcm94eTtcbmZ1bmN0aW9uIHJlZ2lzdGVyUnVudGltZUNvbXBpbGVyKF9jb21waWxlKSB7XG4gIGNvbXBpbGUgPSBfY29tcGlsZTtcbiAgaW5zdGFsbFdpdGhQcm94eSA9IChpKSA9PiB7XG4gICAgaWYgKGkucmVuZGVyLl9yYykge1xuICAgICAgaS53aXRoUHJveHkgPSBuZXcgUHJveHkoaS5jdHgsIFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyk7XG4gICAgfVxuICB9O1xufVxuY29uc3QgaXNSdW50aW1lT25seSA9ICgpID0+ICFjb21waWxlO1xuZnVuY3Rpb24gZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSLCBza2lwT3B0aW9ucykge1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoIWluc3RhbmNlLnJlbmRlcikge1xuICAgIGlmICghaXNTU1IgJiYgY29tcGlsZSAmJiAhQ29tcG9uZW50LnJlbmRlcikge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBDb21wb25lbnQudGVtcGxhdGUgfHwgcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpLnRlbXBsYXRlO1xuICAgICAgaWYgKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaXNDdXN0b21FbGVtZW50LCBjb21waWxlck9wdGlvbnMgfSA9IGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnO1xuICAgICAgICBjb25zdCB7IGRlbGltaXRlcnMsIGNvbXBpbGVyT3B0aW9uczogY29tcG9uZW50Q29tcGlsZXJPcHRpb25zIH0gPSBDb21wb25lbnQ7XG4gICAgICAgIGNvbnN0IGZpbmFsQ29tcGlsZXJPcHRpb25zID0gZXh0ZW5kKFxuICAgICAgICAgIGV4dGVuZChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50LFxuICAgICAgICAgICAgICBkZWxpbWl0ZXJzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcGlsZXJPcHRpb25zXG4gICAgICAgICAgKSxcbiAgICAgICAgICBjb21wb25lbnRDb21waWxlck9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgQ29tcG9uZW50LnJlbmRlciA9IGNvbXBpbGUodGVtcGxhdGUsIGZpbmFsQ29tcGlsZXJPcHRpb25zKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgY29tcGlsZWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLnJlbmRlciA9IENvbXBvbmVudC5yZW5kZXIgfHwgTk9PUDtcbiAgICBpZiAoaW5zdGFsbFdpdGhQcm94eSkge1xuICAgICAgaW5zdGFsbFdpdGhQcm94eShpbnN0YW5jZSk7XG4gICAgfVxuICB9XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmIHRydWUpIHtcbiAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIHRyeSB7XG4gICAgICBhcHBseU9wdGlvbnMoaW5zdGFuY2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXNldFRyYWNraW5nKCk7XG4gICAgICByZXNldCgpO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhQ29tcG9uZW50LnJlbmRlciAmJiBpbnN0YW5jZS5yZW5kZXIgPT09IE5PT1AgJiYgIWlzU1NSKSB7XG4gICAgaWYgKCFjb21waWxlICYmIENvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgQ29tcG9uZW50IHByb3ZpZGVkIHRlbXBsYXRlIG9wdGlvbiBidXQgcnVudGltZSBjb21waWxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQgb2YgVnVlLmAgKyAoYCBDb25maWd1cmUgeW91ciBidW5kbGVyIHRvIGFsaWFzIFwidnVlXCIgdG8gXCJ2dWUvZGlzdC92dWUuZXNtLWJ1bmRsZXIuanNcIi5gIClcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4kMShgQ29tcG9uZW50IGlzIG1pc3NpbmcgdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uLmApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gZ2V0QXR0cnNQcm94eShpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuYXR0cnNQcm94eSB8fCAoaW5zdGFuY2UuYXR0cnNQcm94eSA9IG5ldyBQcm94eShcbiAgICBpbnN0YW5jZS5hdHRycyxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRhdHRyc1wiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eSgpIHtcbiAgICAgICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IDoge1xuICAgICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBcIiRhdHRyc1wiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgKSk7XG59XG5mdW5jdGlvbiBnZXRTbG90c1Byb3h5KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS5zbG90c1Byb3h5IHx8IChpbnN0YW5jZS5zbG90c1Byb3h5ID0gbmV3IFByb3h5KGluc3RhbmNlLnNsb3RzLCB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwgXCIkc2xvdHNcIik7XG4gICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgfVxuICB9KSk7XG59XG5mdW5jdGlvbiBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgZXhwb3NlID0gKGV4cG9zZWQpID0+IHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmV4cG9zZWQpIHtcbiAgICAgICAgd2FybiQxKGBleHBvc2UoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZSBwZXIgc2V0dXAoKS5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChleHBvc2VkICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGV4cG9zZWRUeXBlID0gdHlwZW9mIGV4cG9zZWQ7XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmIChpc0FycmF5KGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwiYXJyYXlcIjtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVmKGV4cG9zZWQpKSB7XG4gICAgICAgICAgICBleHBvc2VkVHlwZSA9IFwicmVmXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBvc2VkVHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIGBleHBvc2UoKSBzaG91bGQgYmUgcGFzc2VkIGEgcGxhaW4gb2JqZWN0LCByZWNlaXZlZCAke2V4cG9zZWRUeXBlfS5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpbnN0YW5jZS5leHBvc2VkID0gZXhwb3NlZCB8fCB7fTtcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICBnZXQgYXR0cnMoKSB7XG4gICAgICAgIHJldHVybiBnZXRBdHRyc1Byb3h5KGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2xvdHMoKSB7XG4gICAgICAgIHJldHVybiBnZXRTbG90c1Byb3h5KGluc3RhbmNlKTtcbiAgICAgIH0sXG4gICAgICBnZXQgZW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIChldmVudCwgLi4uYXJncykgPT4gaW5zdGFuY2UuZW1pdChldmVudCwgLi4uYXJncyk7XG4gICAgICB9LFxuICAgICAgZXhwb3NlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGdldEF0dHJzUHJveHkoaW5zdGFuY2UpO1xuICAgICAgfSxcbiAgICAgIHNsb3RzOiBpbnN0YW5jZS5zbG90cyxcbiAgICAgIGVtaXQ6IGluc3RhbmNlLmVtaXQsXG4gICAgICBleHBvc2VcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBnZXRFeHBvc2VQcm94eShpbnN0YW5jZSkge1xuICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgIHJldHVybiBpbnN0YW5jZS5leHBvc2VQcm94eSB8fCAoaW5zdGFuY2UuZXhwb3NlUHJveHkgPSBuZXcgUHJveHkocHJveHlSZWZzKG1hcmtSYXcoaW5zdGFuY2UuZXhwb3NlZCkpLCB7XG4gICAgICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5IGluIHB1YmxpY1Byb3BlcnRpZXNNYXApIHtcbiAgICAgICAgICByZXR1cm4gcHVibGljUHJvcGVydGllc01hcFtrZXldKGluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhhcyh0YXJnZXQsIGtleSkge1xuICAgICAgICByZXR1cm4ga2V5IGluIHRhcmdldCB8fCBrZXkgaW4gcHVibGljUHJvcGVydGllc01hcDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbn1cbmNvbnN0IGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG5jb25zdCBjbGFzc2lmeSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKGNsYXNzaWZ5UkUsIChjKSA9PiBjLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1stX10vZywgXCJcIik7XG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCwgaW5jbHVkZUluZmVycmVkID0gdHJ1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihDb21wb25lbnQpID8gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIDogQ29tcG9uZW50Lm5hbWUgfHwgaW5jbHVkZUluZmVycmVkICYmIENvbXBvbmVudC5fX25hbWU7XG59XG5mdW5jdGlvbiBmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBDb21wb25lbnQsIGlzUm9vdCA9IGZhbHNlKSB7XG4gIGxldCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpO1xuICBpZiAoIW5hbWUgJiYgQ29tcG9uZW50Ll9fZmlsZSkge1xuICAgIGNvbnN0IG1hdGNoID0gQ29tcG9uZW50Ll9fZmlsZS5tYXRjaCgvKFteL1xcXFxdKylcXC5cXHcrJC8pO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbmFtZSA9IG1hdGNoWzFdO1xuICAgIH1cbiAgfVxuICBpZiAoIW5hbWUgJiYgaW5zdGFuY2UgJiYgaW5zdGFuY2UucGFyZW50KSB7XG4gICAgY29uc3QgaW5mZXJGcm9tUmVnaXN0cnkgPSAocmVnaXN0cnkpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgIGlmIChyZWdpc3RyeVtrZXldID09PSBDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBuYW1lID0gaW5mZXJGcm9tUmVnaXN0cnkoXG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRzIHx8IGluc3RhbmNlLnBhcmVudC50eXBlLmNvbXBvbmVudHNcbiAgICApIHx8IGluZmVyRnJvbVJlZ2lzdHJ5KGluc3RhbmNlLmFwcENvbnRleHQuY29tcG9uZW50cyk7XG4gIH1cbiAgcmV0dXJuIG5hbWUgPyBjbGFzc2lmeShuYW1lKSA6IGlzUm9vdCA/IGBBcHBgIDogYEFub255bW91c2A7XG59XG5mdW5jdGlvbiBpc0NsYXNzQ29tcG9uZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKSAmJiBcIl9fdmNjT3B0c1wiIGluIHZhbHVlO1xufVxuXG5jb25zdCBjb21wdXRlZCA9IChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcHV0ZWQkMShnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNJblNTUkNvbXBvbmVudFNldHVwKTtcbn07XG5cbmZ1bmN0aW9uIHVzZU1vZGVsKHByb3BzLCBuYW1lLCBvcHRpb25zID0gRU1QVFlfT0JKKSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWkpIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICAgIHJldHVybiByZWYoKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaS5wcm9wc09wdGlvbnNbMF1bbmFtZV0pIHtcbiAgICB3YXJuJDEoYHVzZU1vZGVsKCkgY2FsbGVkIHdpdGggcHJvcCBcIiR7bmFtZX1cIiB3aGljaCBpcyBub3QgZGVjbGFyZWQuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGNvbnN0IGNhbWVsaXplZE5hbWUgPSBjYW1lbGl6ZShuYW1lKTtcbiAgY29uc3QgaHlwaGVuYXRlZE5hbWUgPSBoeXBoZW5hdGUobmFtZSk7XG4gIGNvbnN0IHJlcyA9IGN1c3RvbVJlZigodHJhY2ssIHRyaWdnZXIpID0+IHtcbiAgICBsZXQgbG9jYWxWYWx1ZTtcbiAgICB3YXRjaFN5bmNFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcFZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBpZiAoaGFzQ2hhbmdlZChsb2NhbFZhbHVlLCBwcm9wVmFsdWUpKSB7XG4gICAgICAgIGxvY2FsVmFsdWUgPSBwcm9wVmFsdWU7XG4gICAgICAgIHRyaWdnZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB0cmFjaygpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXQgPyBvcHRpb25zLmdldChsb2NhbFZhbHVlKSA6IGxvY2FsVmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHJhd1Byb3BzID0gaS52bm9kZS5wcm9wcztcbiAgICAgICAgaWYgKCEocmF3UHJvcHMgJiYgLy8gY2hlY2sgaWYgcGFyZW50IGhhcyBwYXNzZWQgdi1tb2RlbFxuICAgICAgICAobmFtZSBpbiByYXdQcm9wcyB8fCBjYW1lbGl6ZWROYW1lIGluIHJhd1Byb3BzIHx8IGh5cGhlbmF0ZWROYW1lIGluIHJhd1Byb3BzKSAmJiAoYG9uVXBkYXRlOiR7bmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2NhbWVsaXplZE5hbWV9YCBpbiByYXdQcm9wcyB8fCBgb25VcGRhdGU6JHtoeXBoZW5hdGVkTmFtZX1gIGluIHJhd1Byb3BzKSkgJiYgaGFzQ2hhbmdlZCh2YWx1ZSwgbG9jYWxWYWx1ZSkpIHtcbiAgICAgICAgICBsb2NhbFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgdHJpZ2dlcigpO1xuICAgICAgICB9XG4gICAgICAgIGkuZW1pdChgdXBkYXRlOiR7bmFtZX1gLCBvcHRpb25zLnNldCA/IG9wdGlvbnMuc2V0KHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgY29uc3QgbW9kaWZpZXJLZXkgPSBuYW1lID09PSBcIm1vZGVsVmFsdWVcIiA/IFwibW9kZWxNb2RpZmllcnNcIiA6IGAke25hbWV9TW9kaWZpZXJzYDtcbiAgcmVzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB7XG4gICAgbGV0IGkyID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKGkyIDwgMikge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBpMisrID8gcHJvcHNbbW9kaWZpZXJLZXldIHx8IHt9IDogcmVzLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGgodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbikge1xuICBjb25zdCBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKGwgPT09IDIpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvcHNPckNoaWxkcmVuKSAmJiAhaXNBcnJheShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICBpZiAoaXNWTm9kZShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBbcHJvcHNPckNoaWxkcmVuXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChsID4gMykge1xuICAgICAgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIH0gZWxzZSBpZiAobCA9PT0gMyAmJiBpc1ZOb2RlKGNoaWxkcmVuKSkge1xuICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTaGFsbG93KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1NoYWxsb3dcIl0pO1xufVxuXG5mdW5jdGlvbiBpbml0Q3VzdG9tRm9ybWF0dGVyKCkge1xuICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgdHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB2dWVTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzNiYTc3NlwiIH07XG4gIGNvbnN0IG51bWJlclN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojMTY3N2ZmXCIgfTtcbiAgY29uc3Qgc3RyaW5nU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiNmNTIyMmRcIiB9O1xuICBjb25zdCBrZXl3b3JkU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiNlYjJmOTZcIiB9O1xuICBjb25zdCBmb3JtYXR0ZXIgPSB7XG4gICAgaGVhZGVyKG9iaikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXCJkaXZcIiwgdnVlU3R5bGUsIGBWdWVJbnN0YW5jZWBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBnZW5SZWZGbGFnKG9iaildLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iai52YWx1ZSksXG4gICAgICAgICAgYD5gXG4gICAgICAgIF07XG4gICAgICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgW1wic3BhblwiLCB2dWVTdHlsZSwgaXNTaGFsbG93KG9iaikgPyBcIlNoYWxsb3dSZWFjdGl2ZVwiIDogXCJSZWFjdGl2ZVwiXSxcbiAgICAgICAgICBcIjxcIixcbiAgICAgICAgICBmb3JtYXRWYWx1ZShvYmopLFxuICAgICAgICAgIGA+JHtpc1JlYWRvbmx5KG9iaikgPyBgIChyZWFkb25seSlgIDogYGB9YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWRvbmx5KG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhZG9ubHlcIiA6IFwiUmVhZG9ubHlcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBcIj5cIlxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICBoYXNCb2R5KG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19pc1Z1ZTtcbiAgICB9LFxuICAgIGJvZHkob2JqKSB7XG4gICAgICBpZiAob2JqICYmIG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICAuLi5mb3JtYXRJbnN0YW5jZShvYmouJClcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGZvcm1hdEluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgY29uc3QgYmxvY2tzID0gW107XG4gICAgaWYgKGluc3RhbmNlLnR5cGUucHJvcHMgJiYgaW5zdGFuY2UucHJvcHMpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJwcm9wc1wiLCB0b1JhdyhpbnN0YW5jZS5wcm9wcykpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLnNldHVwU3RhdGUgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcInNldHVwXCIsIGluc3RhbmNlLnNldHVwU3RhdGUpKTtcbiAgICB9XG4gICAgaWYgKGluc3RhbmNlLmRhdGEgIT09IEVNUFRZX09CSikge1xuICAgICAgYmxvY2tzLnB1c2goY3JlYXRlSW5zdGFuY2VCbG9jayhcImRhdGFcIiwgdG9SYXcoaW5zdGFuY2UuZGF0YSkpKTtcbiAgICB9XG4gICAgY29uc3QgY29tcHV0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJjb21wdXRlZFwiKTtcbiAgICBpZiAoY29tcHV0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJjb21wdXRlZFwiLCBjb21wdXRlZCkpO1xuICAgIH1cbiAgICBjb25zdCBpbmplY3RlZCA9IGV4dHJhY3RLZXlzKGluc3RhbmNlLCBcImluamVjdFwiKTtcbiAgICBpZiAoaW5qZWN0ZWQpIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJpbmplY3RlZFwiLCBpbmplY3RlZCkpO1xuICAgIH1cbiAgICBibG9ja3MucHVzaChbXG4gICAgICBcImRpdlwiLFxuICAgICAge30sXG4gICAgICBbXG4gICAgICAgIFwic3BhblwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IGtleXdvcmRTdHlsZS5zdHlsZSArIFwiO29wYWNpdHk6MC42NlwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiJCAoaW50ZXJuYWwpOiBcIlxuICAgICAgXSxcbiAgICAgIFtcIm9iamVjdFwiLCB7IG9iamVjdDogaW5zdGFuY2UgfV1cbiAgICBdKTtcbiAgICByZXR1cm4gYmxvY2tzO1xuICB9XG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlQmxvY2sodHlwZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0ID0gZXh0ZW5kKHt9LCB0YXJnZXQpO1xuICAgIGlmICghT2JqZWN0LmtleXModGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHt9XTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiZGl2XCIsXG4gICAgICB7IHN0eWxlOiBcImxpbmUtaGVpZ2h0OjEuMjVlbTttYXJnaW4tYm90dG9tOjAuNmVtXCIgfSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcImNvbG9yOiM0NzY1ODJcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBcImRpdlwiLFxuICAgICAgICB7XG4gICAgICAgICAgc3R5bGU6IFwicGFkZGluZy1sZWZ0OjEuMjVlbVwiXG4gICAgICAgIH0sXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKHRhcmdldCkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIGtleSArIFwiOiBcIl0sXG4gICAgICAgICAgICBmb3JtYXRWYWx1ZSh0YXJnZXRba2V5XSwgZmFsc2UpXG4gICAgICAgICAgXTtcbiAgICAgICAgfSlcbiAgICAgIF1cbiAgICBdO1xuICB9XG4gIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHYsIGFzUmF3ID0gdHJ1ZSkge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIFtcInNwYW5cIiwgbnVtYmVyU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBKU09OLnN0cmluZ2lmeSh2KV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIGtleXdvcmRTdHlsZSwgdl07XG4gICAgfSBlbHNlIGlmIChpc09iamVjdCh2KSkge1xuICAgICAgcmV0dXJuIFtcIm9iamVjdFwiLCB7IG9iamVjdDogYXNSYXcgPyB0b1Jhdyh2KSA6IHYgfV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIHN0cmluZ1N0eWxlLCBTdHJpbmcodildO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBleHRyYWN0S2V5cyhpbnN0YW5jZSwgdHlwZSkge1xuICAgIGNvbnN0IENvbXAgPSBpbnN0YW5jZS50eXBlO1xuICAgIGlmIChpc0Z1bmN0aW9uKENvbXApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dHJhY3RlZCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGluc3RhbmNlLmN0eCkge1xuICAgICAgaWYgKGlzS2V5T2ZUeXBlKENvbXAsIGtleSwgdHlwZSkpIHtcbiAgICAgICAgZXh0cmFjdGVkW2tleV0gPSBpbnN0YW5jZS5jdHhba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhY3RlZDtcbiAgfVxuICBmdW5jdGlvbiBpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpIHtcbiAgICBjb25zdCBvcHRzID0gQ29tcFt0eXBlXTtcbiAgICBpZiAoaXNBcnJheShvcHRzKSAmJiBvcHRzLmluY2x1ZGVzKGtleSkgfHwgaXNPYmplY3Qob3B0cykgJiYga2V5IGluIG9wdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5leHRlbmRzICYmIGlzS2V5T2ZUeXBlKENvbXAuZXh0ZW5kcywga2V5LCB0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDb21wLm1peGlucyAmJiBDb21wLm1peGlucy5zb21lKChtKSA9PiBpc0tleU9mVHlwZShtLCBrZXksIHR5cGUpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGdlblJlZkZsYWcodikge1xuICAgIGlmIChpc1NoYWxsb3codikpIHtcbiAgICAgIHJldHVybiBgU2hhbGxvd1JlZmA7XG4gICAgfVxuICAgIGlmICh2LmVmZmVjdCkge1xuICAgICAgcmV0dXJuIGBDb21wdXRlZFJlZmA7XG4gICAgfVxuICAgIHJldHVybiBgUmVmYDtcbiAgfVxuICBpZiAod2luZG93LmRldnRvb2xzRm9ybWF0dGVycykge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMucHVzaChmb3JtYXR0ZXIpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMgPSBbZm9ybWF0dGVyXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3aXRoTWVtbyhtZW1vLCByZW5kZXIsIGNhY2hlLCBpbmRleCkge1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZVtpbmRleF07XG4gIGlmIChjYWNoZWQgJiYgaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByZXQgPSByZW5kZXIoKTtcbiAgcmV0Lm1lbW8gPSBtZW1vLnNsaWNlKCk7XG4gIHJldHVybiBjYWNoZVtpbmRleF0gPSByZXQ7XG59XG5mdW5jdGlvbiBpc01lbW9TYW1lKGNhY2hlZCwgbWVtbykge1xuICBjb25zdCBwcmV2ID0gY2FjaGVkLm1lbW87XG4gIGlmIChwcmV2Lmxlbmd0aCAhPSBtZW1vLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXYubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaGFzQ2hhbmdlZChwcmV2W2ldLCBtZW1vW2ldKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiBjdXJyZW50QmxvY2spIHtcbiAgICBjdXJyZW50QmxvY2sucHVzaChjYWNoZWQpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5jb25zdCB2ZXJzaW9uID0gXCIzLjQuMTBcIjtcbmNvbnN0IHdhcm4gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gd2FybiQxIDogTk9PUDtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MgPSBFcnJvclR5cGVTdHJpbmdzJDEgO1xuY29uc3QgZGV2dG9vbHMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHRydWUgPyBkZXZ0b29scyQxIDogdm9pZCAwO1xuY29uc3Qgc2V0RGV2dG9vbHNIb29rID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gc2V0RGV2dG9vbHNIb29rJDEgOiBOT09QO1xuY29uc3QgX3NzclV0aWxzID0ge1xuICBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSxcbiAgc2V0dXBDb21wb25lbnQsXG4gIHJlbmRlckNvbXBvbmVudFJvb3QsXG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSxcbiAgaXNWTm9kZTogaXNWTm9kZSxcbiAgbm9ybWFsaXplVk5vZGVcbn07XG5jb25zdCBzc3JVdGlscyA9IF9zc3JVdGlscyA7XG5jb25zdCByZXNvbHZlRmlsdGVyID0gbnVsbDtcbmNvbnN0IGNvbXBhdFV0aWxzID0gbnVsbDtcbmNvbnN0IERlcHJlY2F0aW9uVHlwZXMgPSBudWxsO1xuXG5leHBvcnQgeyBCYXNlVHJhbnNpdGlvbiwgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIENvbW1lbnQsIERlcHJlY2F0aW9uVHlwZXMsIEVycm9yQ29kZXMsIEVycm9yVHlwZVN0cmluZ3MsIEZyYWdtZW50LCBLZWVwQWxpdmUsIFN0YXRpYywgU3VzcGVuc2UsIFRlbGVwb3J0LCBUZXh0LCBhc3NlcnROdW1iZXIsIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nLCBjYWxsV2l0aEVycm9ySGFuZGxpbmcsIGNsb25lVk5vZGUsIGNvbXBhdFV0aWxzLCBjb21wdXRlZCwgY3JlYXRlQmxvY2ssIGNyZWF0ZUNvbW1lbnRWTm9kZSwgY3JlYXRlRWxlbWVudEJsb2NrLCBjcmVhdGVCYXNlVk5vZGUgYXMgY3JlYXRlRWxlbWVudFZOb2RlLCBjcmVhdGVIeWRyYXRpb25SZW5kZXJlciwgY3JlYXRlUHJvcHNSZXN0UHJveHksIGNyZWF0ZVJlbmRlcmVyLCBjcmVhdGVTbG90cywgY3JlYXRlU3RhdGljVk5vZGUsIGNyZWF0ZVRleHRWTm9kZSwgY3JlYXRlVk5vZGUsIGRlZmluZUFzeW5jQ29tcG9uZW50LCBkZWZpbmVDb21wb25lbnQsIGRlZmluZUVtaXRzLCBkZWZpbmVFeHBvc2UsIGRlZmluZU1vZGVsLCBkZWZpbmVPcHRpb25zLCBkZWZpbmVQcm9wcywgZGVmaW5lU2xvdHMsIGRldnRvb2xzLCBnZXRDdXJyZW50SW5zdGFuY2UsIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiwgZ3VhcmRSZWFjdGl2ZVByb3BzLCBoLCBoYW5kbGVFcnJvciwgaGFzSW5qZWN0aW9uQ29udGV4dCwgaW5pdEN1c3RvbUZvcm1hdHRlciwgaW5qZWN0LCBpc01lbW9TYW1lLCBpc1J1bnRpbWVPbmx5LCBpc1ZOb2RlLCBtZXJnZURlZmF1bHRzLCBtZXJnZU1vZGVscywgbWVyZ2VQcm9wcywgbmV4dFRpY2ssIG9uQWN0aXZhdGVkLCBvbkJlZm9yZU1vdW50LCBvbkJlZm9yZVVubW91bnQsIG9uQmVmb3JlVXBkYXRlLCBvbkRlYWN0aXZhdGVkLCBvbkVycm9yQ2FwdHVyZWQsIG9uTW91bnRlZCwgb25SZW5kZXJUcmFja2VkLCBvblJlbmRlclRyaWdnZXJlZCwgb25TZXJ2ZXJQcmVmZXRjaCwgb25Vbm1vdW50ZWQsIG9uVXBkYXRlZCwgb3BlbkJsb2NrLCBwb3BTY29wZUlkLCBwcm92aWRlLCBwdXNoU2NvcGVJZCwgcXVldWVQb3N0Rmx1c2hDYiwgcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIsIHJlbmRlckxpc3QsIHJlbmRlclNsb3QsIHJlc29sdmVDb21wb25lbnQsIHJlc29sdmVEaXJlY3RpdmUsIHJlc29sdmVEeW5hbWljQ29tcG9uZW50LCByZXNvbHZlRmlsdGVyLCByZXNvbHZlVHJhbnNpdGlvbkhvb2tzLCBzZXRCbG9ja1RyYWNraW5nLCBzZXREZXZ0b29sc0hvb2ssIHNldFRyYW5zaXRpb25Ib29rcywgc3NyQ29udGV4dEtleSwgc3NyVXRpbHMsIHRvSGFuZGxlcnMsIHRyYW5zZm9ybVZOb2RlQXJncywgdXNlQXR0cnMsIHVzZU1vZGVsLCB1c2VTU1JDb250ZXh0LCB1c2VTbG90cywgdXNlVHJhbnNpdGlvblN0YXRlLCB2ZXJzaW9uLCB3YXJuLCB3YXRjaCwgd2F0Y2hFZmZlY3QsIHdhdGNoUG9zdEVmZmVjdCwgd2F0Y2hTeW5jRWZmZWN0LCB3aXRoQXN5bmNDb250ZXh0LCB3aXRoQ3R4LCB3aXRoRGVmYXVsdHMsIHdpdGhEaXJlY3RpdmVzLCB3aXRoTWVtbywgd2l0aFNjb3BlSWQgfTtcbiIsIi8qKlxuKiBAdnVlL3J1bnRpbWUtZG9tIHYzLjQuMTBcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IGgsIEJhc2VUcmFuc2l0aW9uLCBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywgYXNzZXJ0TnVtYmVyLCBnZXRDdXJyZW50SW5zdGFuY2UsIHdhcm4sIHdhdGNoUG9zdEVmZmVjdCwgb25Nb3VudGVkLCBvblVubW91bnRlZCwgRnJhZ21lbnQsIFN0YXRpYywgY2FtZWxpemUsIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCBjcmVhdGVWTm9kZSwgdXNlVHJhbnNpdGlvblN0YXRlLCBvblVwZGF0ZWQsIHRvUmF3LCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIHNldFRyYW5zaXRpb25Ib29rcywgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcywgaXNSdW50aW1lT25seSwgY3JlYXRlUmVuZGVyZXIsIGNyZWF0ZUh5ZHJhdGlvblJlbmRlcmVyIH0gZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWNvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpc09iamVjdCwgdG9OdW1iZXIsIGlzQXJyYXksIGlzU3RyaW5nLCBoeXBoZW5hdGUsIGNhcGl0YWxpemUsIGlzU3BlY2lhbEJvb2xlYW5BdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzT24sIGlzTW9kZWxMaXN0ZW5lciwgaXNGdW5jdGlvbiwgY2FtZWxpemUgYXMgY2FtZWxpemUkMSwgRU1QVFlfT0JKLCBsb29zZVRvTnVtYmVyLCBsb29zZUluZGV4T2YsIGlzU2V0LCBsb29zZUVxdWFsLCBpbnZva2VBcnJheUZucywgaXNIVE1MVGFnLCBpc1NWR1RhZywgaXNNYXRoTUxUYWcgfSBmcm9tICdAdnVlL3NoYXJlZCc7XG5cbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGRvYy5jcmVhdGVFbGVtZW50KHRhZywgaXMgPyB7IGlzIH0gOiB2b2lkIDApO1xuICAgIGlmICh0YWcgPT09IFwic2VsZWN0XCIgJiYgcHJvcHMgJiYgcHJvcHMubXVsdGlwbGUgIT0gbnVsbCkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIiwgcHJvcHMubXVsdGlwbGUpO1xuICAgIH1cbiAgICByZXR1cm4gZWw7XG4gIH0sXG4gIGNyZWF0ZVRleHQ6ICh0ZXh0KSA9PiBkb2MuY3JlYXRlVGV4dE5vZGUodGV4dCksXG4gIGNyZWF0ZUNvbW1lbnQ6ICh0ZXh0KSA9PiBkb2MuY3JlYXRlQ29tbWVudCh0ZXh0KSxcbiAgc2V0VGV4dDogKG5vZGUsIHRleHQpID0+IHtcbiAgICBub2RlLm5vZGVWYWx1ZSA9IHRleHQ7XG4gIH0sXG4gIHNldEVsZW1lbnRUZXh0OiAoZWwsIHRleHQpID0+IHtcbiAgICBlbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH0sXG4gIHBhcmVudE5vZGU6IChub2RlKSA9PiBub2RlLnBhcmVudE5vZGUsXG4gIG5leHRTaWJsaW5nOiAobm9kZSkgPT4gbm9kZS5uZXh0U2libGluZyxcbiAgcXVlcnlTZWxlY3RvcjogKHNlbGVjdG9yKSA9PiBkb2MucXVlcnlTZWxlY3RvcihzZWxlY3RvciksXG4gIHNldFNjb3BlSWQoZWwsIGlkKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKGlkLCBcIlwiKTtcbiAgfSxcbiAgLy8gX19VTlNBRkVfX1xuICAvLyBSZWFzb246IGlubmVySFRNTC5cbiAgLy8gU3RhdGljIGNvbnRlbnQgaGVyZSBjYW4gb25seSBjb21lIGZyb20gY29tcGlsZWQgdGVtcGxhdGVzLlxuICAvLyBBcyBsb25nIGFzIHRoZSB1c2VyIG9ubHkgdXNlcyB0cnVzdGVkIHRlbXBsYXRlcywgdGhpcyBpcyBzYWZlLlxuICBpbnNlcnRTdGF0aWNDb250ZW50KGNvbnRlbnQsIHBhcmVudCwgYW5jaG9yLCBuYW1lc3BhY2UsIHN0YXJ0LCBlbmQpIHtcbiAgICBjb25zdCBiZWZvcmUgPSBhbmNob3IgPyBhbmNob3IucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZDtcbiAgICBpZiAoc3RhcnQgJiYgKHN0YXJ0ID09PSBlbmQgfHwgc3RhcnQubmV4dFNpYmxpbmcpKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKHN0YXJ0LmNsb25lTm9kZSh0cnVlKSwgYW5jaG9yKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQgfHwgIShzdGFydCA9IHN0YXJ0Lm5leHRTaWJsaW5nKSlcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGVtcGxhdGVDb250YWluZXIuaW5uZXJIVE1MID0gbmFtZXNwYWNlID09PSBcInN2Z1wiID8gYDxzdmc+JHtjb250ZW50fTwvc3ZnPmAgOiBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIgPyBgPG1hdGg+JHtjb250ZW50fTwvbWF0aD5gIDogY29udGVudDtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGVtcGxhdGVDb250YWluZXIuY29udGVudDtcbiAgICAgIGlmIChuYW1lc3BhY2UgPT09IFwic3ZnXCIgfHwgbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0ZW1wbGF0ZS5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgdGVtcGxhdGUuYXBwZW5kQ2hpbGQod3JhcHBlci5maXJzdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICB0ZW1wbGF0ZS5yZW1vdmVDaGlsZCh3cmFwcGVyKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGVtcGxhdGUsIGFuY2hvcik7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICAvLyBmaXJzdFxuICAgICAgYmVmb3JlID8gYmVmb3JlLm5leHRTaWJsaW5nIDogcGFyZW50LmZpcnN0Q2hpbGQsXG4gICAgICAvLyBsYXN0XG4gICAgICBhbmNob3IgPyBhbmNob3IucHJldmlvdXNTaWJsaW5nIDogcGFyZW50Lmxhc3RDaGlsZFxuICAgIF07XG4gIH1cbn07XG5cbmNvbnN0IFRSQU5TSVRJT04gPSBcInRyYW5zaXRpb25cIjtcbmNvbnN0IEFOSU1BVElPTiA9IFwiYW5pbWF0aW9uXCI7XG5jb25zdCB2dGNLZXkgPSBTeW1ib2woXCJfdnRjXCIpO1xuY29uc3QgVHJhbnNpdGlvbiA9IChwcm9wcywgeyBzbG90cyB9KSA9PiBoKEJhc2VUcmFuc2l0aW9uLCByZXNvbHZlVHJhbnNpdGlvblByb3BzKHByb3BzKSwgc2xvdHMpO1xuVHJhbnNpdGlvbi5kaXNwbGF5TmFtZSA9IFwiVHJhbnNpdGlvblwiO1xuY29uc3QgRE9NVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IHtcbiAgbmFtZTogU3RyaW5nLFxuICB0eXBlOiBTdHJpbmcsXG4gIGNzczoge1xuICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgZGVmYXVsdDogdHJ1ZVxuICB9LFxuICBkdXJhdGlvbjogW1N0cmluZywgTnVtYmVyLCBPYmplY3RdLFxuICBlbnRlckZyb21DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyVG9DbGFzczogU3RyaW5nLFxuICBhcHBlYXJGcm9tQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBsZWF2ZUZyb21DbGFzczogU3RyaW5nLFxuICBsZWF2ZUFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nXG59O1xuY29uc3QgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyA9IFRyYW5zaXRpb24ucHJvcHMgPSAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKFxuICB7fSxcbiAgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsXG4gIERPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnNcbik7XG5jb25zdCBjYWxsSG9vayA9IChob29rLCBhcmdzID0gW10pID0+IHtcbiAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICBob29rLmZvckVhY2goKGgyKSA9PiBoMiguLi5hcmdzKSk7XG4gIH0gZWxzZSBpZiAoaG9vaykge1xuICAgIGhvb2soLi4uYXJncyk7XG4gIH1cbn07XG5jb25zdCBoYXNFeHBsaWNpdENhbGxiYWNrID0gKGhvb2spID0+IHtcbiAgcmV0dXJuIGhvb2sgPyBpc0FycmF5KGhvb2spID8gaG9vay5zb21lKChoMikgPT4gaDIubGVuZ3RoID4gMSkgOiBob29rLmxlbmd0aCA+IDEgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvblByb3BzKHJhd1Byb3BzKSB7XG4gIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghKGtleSBpbiBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzKSkge1xuICAgICAgYmFzZVByb3BzW2tleV0gPSByYXdQcm9wc1trZXldO1xuICAgIH1cbiAgfVxuICBpZiAocmF3UHJvcHMuY3NzID09PSBmYWxzZSkge1xuICAgIHJldHVybiBiYXNlUHJvcHM7XG4gIH1cbiAgY29uc3Qge1xuICAgIG5hbWUgPSBcInZcIixcbiAgICB0eXBlLFxuICAgIGR1cmF0aW9uLFxuICAgIGVudGVyRnJvbUNsYXNzID0gYCR7bmFtZX0tZW50ZXItZnJvbWAsXG4gICAgZW50ZXJBY3RpdmVDbGFzcyA9IGAke25hbWV9LWVudGVyLWFjdGl2ZWAsXG4gICAgZW50ZXJUb0NsYXNzID0gYCR7bmFtZX0tZW50ZXItdG9gLFxuICAgIGFwcGVhckZyb21DbGFzcyA9IGVudGVyRnJvbUNsYXNzLFxuICAgIGFwcGVhckFjdGl2ZUNsYXNzID0gZW50ZXJBY3RpdmVDbGFzcyxcbiAgICBhcHBlYXJUb0NsYXNzID0gZW50ZXJUb0NsYXNzLFxuICAgIGxlYXZlRnJvbUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtZnJvbWAsXG4gICAgbGVhdmVBY3RpdmVDbGFzcyA9IGAke25hbWV9LWxlYXZlLWFjdGl2ZWAsXG4gICAgbGVhdmVUb0NsYXNzID0gYCR7bmFtZX0tbGVhdmUtdG9gXG4gIH0gPSByYXdQcm9wcztcbiAgY29uc3QgZHVyYXRpb25zID0gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pO1xuICBjb25zdCBlbnRlckR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1swXTtcbiAgY29uc3QgbGVhdmVEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMV07XG4gIGNvbnN0IHtcbiAgICBvbkJlZm9yZUVudGVyLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIgPSBvbkJlZm9yZUVudGVyLFxuICAgIG9uQXBwZWFyID0gb25FbnRlcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZCA9IG9uRW50ZXJDYW5jZWxsZWRcbiAgfSA9IGJhc2VQcm9wcztcbiAgY29uc3QgZmluaXNoRW50ZXIgPSAoZWwsIGlzQXBwZWFyLCBkb25lKSA9PiB7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhclRvQ2xhc3MgOiBlbnRlclRvQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBmaW5pc2hMZWF2ZSA9IChlbCwgZG9uZSkgPT4ge1xuICAgIGVsLl9pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICBkb25lICYmIGRvbmUoKTtcbiAgfTtcbiAgY29uc3QgbWFrZUVudGVySG9vayA9IChpc0FwcGVhcikgPT4ge1xuICAgIHJldHVybiAoZWwsIGRvbmUpID0+IHtcbiAgICAgIGNvbnN0IGhvb2sgPSBpc0FwcGVhciA/IG9uQXBwZWFyIDogb25FbnRlcjtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hFbnRlcihlbCwgaXNBcHBlYXIsIGRvbmUpO1xuICAgICAgY2FsbEhvb2soaG9vaywgW2VsLCByZXNvbHZlXSk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyRnJvbUNsYXNzIDogZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhob29rKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgZW50ZXJEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG4gIHJldHVybiBleHRlbmQoYmFzZVByb3BzLCB7XG4gICAgb25CZWZvcmVFbnRlcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVFbnRlciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGVudGVyRnJvbUNsYXNzKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkJlZm9yZUFwcGVhcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVBcHBlYXIsIFtlbF0pO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkVudGVyOiBtYWtlRW50ZXJIb29rKGZhbHNlKSxcbiAgICBvbkFwcGVhcjogbWFrZUVudGVySG9vayh0cnVlKSxcbiAgICBvbkxlYXZlKGVsLCBkb25lKSB7XG4gICAgICBlbC5faXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hMZWF2ZShlbCwgZG9uZSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlQWN0aXZlQ2xhc3MpO1xuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKCFlbC5faXNMZWF2aW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhvbkxlYXZlKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgbGVhdmVEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZSwgW2VsLCByZXNvbHZlXSk7XG4gICAgfSxcbiAgICBvbkVudGVyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgZmFsc2UpO1xuICAgICAgY2FsbEhvb2sob25FbnRlckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkFwcGVhckNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoRW50ZXIoZWwsIHRydWUpO1xuICAgICAgY2FsbEhvb2sob25BcHBlYXJDYW5jZWxsZWQsIFtlbF0pO1xuICAgIH0sXG4gICAgb25MZWF2ZUNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoTGVhdmUoZWwpO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIFtOdW1iZXJPZihkdXJhdGlvbi5lbnRlciksIE51bWJlck9mKGR1cmF0aW9uLmxlYXZlKV07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbiA9IE51bWJlck9mKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gW24sIG5dO1xuICB9XG59XG5mdW5jdGlvbiBOdW1iZXJPZih2YWwpIHtcbiAgY29uc3QgcmVzID0gdG9OdW1iZXIodmFsKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhc3NlcnROdW1iZXIocmVzLCBcIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBkdXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBjbHMpIHtcbiAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBlbC5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgKGVsW3Z0Y0tleV0gfHwgKGVsW3Z0Y0tleV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSkuYWRkKGNscyk7XG59XG5mdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmRlbGV0ZShjbHMpO1xuICAgIGlmICghX3Z0Yy5zaXplKSB7XG4gICAgICBlbFt2dGNLZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbmV4dEZyYW1lKGNiKSB7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKTtcbiAgfSk7XG59XG5sZXQgZW5kSWQgPSAwO1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzKGVsLCBleHBlY3RlZFR5cGUsIGV4cGxpY2l0VGltZW91dCwgcmVzb2x2ZSkge1xuICBjb25zdCBpZCA9IGVsLl9lbmRJZCA9ICsrZW5kSWQ7XG4gIGNvbnN0IHJlc29sdmVJZk5vdFN0YWxlID0gKCkgPT4ge1xuICAgIGlmIChpZCA9PT0gZWwuX2VuZElkKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9O1xuICBpZiAoZXhwbGljaXRUaW1lb3V0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZUlmTm90U3RhbGUsIGV4cGxpY2l0VGltZW91dCk7XG4gIH1cbiAgY29uc3QgeyB0eXBlLCB0aW1lb3V0LCBwcm9wQ291bnQgfSA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpO1xuICBpZiAoIXR5cGUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGVuZEV2ZW50ID0gdHlwZSArIFwiZW5kXCI7XG4gIGxldCBlbmRlZCA9IDA7XG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG4gICAgcmVzb2x2ZUlmTm90U3RhbGUoKTtcbiAgfTtcbiAgY29uc3Qgb25FbmQgPSAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZWwgJiYgKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgb25FbmQpO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIGNvbnN0IGdldFN0eWxlUHJvcGVydGllcyA9IChrZXkpID0+IChzdHlsZXNba2V5XSB8fCBcIlwiKS5zcGxpdChcIiwgXCIpO1xuICBjb25zdCB0cmFuc2l0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RGVsYXlgKTtcbiAgY29uc3QgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTtcbiAgY29uc3QgYW5pbWF0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EZWxheWApO1xuICBjb25zdCBhbmltYXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IGFuaW1hdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KGFuaW1hdGlvbkRlbGF5cywgYW5pbWF0aW9uRHVyYXRpb25zKTtcbiAgbGV0IHR5cGUgPSBudWxsO1xuICBsZXQgdGltZW91dCA9IDA7XG4gIGxldCBwcm9wQ291bnQgPSAwO1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwID8gdHJhbnNpdGlvblRpbWVvdXQgPiBhbmltYXRpb25UaW1lb3V0ID8gVFJBTlNJVElPTiA6IEFOSU1BVElPTiA6IG51bGw7XG4gICAgcHJvcENvdW50ID0gdHlwZSA/IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aCA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIGNvbnN0IGhhc1RyYW5zZm9ybSA9IHR5cGUgPT09IFRSQU5TSVRJT04gJiYgL1xcYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KFxuICAgIGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfVByb3BlcnR5YCkudG9TdHJpbmcoKVxuICApO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdGltZW91dCxcbiAgICBwcm9wQ291bnQsXG4gICAgaGFzVHJhbnNmb3JtXG4gIH07XG59XG5mdW5jdGlvbiBnZXRUaW1lb3V0KGRlbGF5cywgZHVyYXRpb25zKSB7XG4gIHdoaWxlIChkZWxheXMubGVuZ3RoIDwgZHVyYXRpb25zLmxlbmd0aCkge1xuICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTtcbiAgfVxuICByZXR1cm4gTWF0aC5tYXgoLi4uZHVyYXRpb25zLm1hcCgoZCwgaSkgPT4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKSkpO1xufVxuZnVuY3Rpb24gdG9NcyhzKSB7XG4gIGlmIChzID09PSBcImF1dG9cIilcbiAgICByZXR1cm4gMDtcbiAgcmV0dXJuIE51bWJlcihzLnNsaWNlKDAsIC0xKS5yZXBsYWNlKFwiLFwiLCBcIi5cIikpICogMWUzO1xufVxuZnVuY3Rpb24gZm9yY2VSZWZsb3coKSB7XG4gIHJldHVybiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodDtcbn1cblxuZnVuY3Rpb24gcGF0Y2hDbGFzcyhlbCwgdmFsdWUsIGlzU1ZHKSB7XG4gIGNvbnN0IHRyYW5zaXRpb25DbGFzc2VzID0gZWxbdnRjS2V5XTtcbiAgaWYgKHRyYW5zaXRpb25DbGFzc2VzKSB7XG4gICAgdmFsdWUgPSAodmFsdWUgPyBbdmFsdWUsIC4uLnRyYW5zaXRpb25DbGFzc2VzXSA6IFsuLi50cmFuc2l0aW9uQ2xhc3Nlc10pLmpvaW4oXCIgXCIpO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIik7XG4gIH0gZWxzZSBpZiAoaXNTVkcpIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCB2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZWwuY2xhc3NOYW1lID0gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgdlNob3dPbGRLZXkgPSBTeW1ib2woXCJfdm9kXCIpO1xuY29uc3QgdlNob3cgPSB7XG4gIGJlZm9yZU1vdW50KGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgZWxbdlNob3dPbGRLZXldID0gZWwuc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgPyBcIlwiIDogZWwuc3R5bGUuZGlzcGxheTtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldERpc3BsYXkoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH0sXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBpZiAodHJhbnNpdGlvbiAmJiB2YWx1ZSkge1xuICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgfVxuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGlmICghdmFsdWUgPT09ICFvbGRWYWx1ZSlcbiAgICAgIHJldHVybjtcbiAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBzZXREaXNwbGF5KGVsLCB0cnVlKTtcbiAgICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2l0aW9uLmxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgc2V0RGlzcGxheShlbCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlVW5tb3VudChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgdlNob3cubmFtZSA9IFwic2hvd1wiO1xufVxuZnVuY3Rpb24gc2V0RGlzcGxheShlbCwgdmFsdWUpIHtcbiAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWxbdlNob3dPbGRLZXldIDogXCJub25lXCI7XG59XG5mdW5jdGlvbiBpbml0VlNob3dGb3JTU1IoKSB7XG4gIHZTaG93LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4ge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB7IHN0eWxlOiB7IGRpc3BsYXk6IFwibm9uZVwiIH0gfTtcbiAgICB9XG4gIH07XG59XG5cbmNvbnN0IENTU19WQVJfVEVYVCA9IFN5bWJvbCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJDU1NfVkFSX1RFWFRcIiA6IFwiXCIpO1xuZnVuY3Rpb24gdXNlQ3NzVmFycyhnZXR0ZXIpIHtcbiAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgdXNlQ3NzVmFycyBpcyBjYWxsZWQgd2l0aG91dCBjdXJyZW50IGFjdGl2ZSBjb21wb25lbnQgaW5zdGFuY2UuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVwZGF0ZVRlbGVwb3J0cyA9IGluc3RhbmNlLnV0ID0gKHZhcnMgPSBnZXR0ZXIoaW5zdGFuY2UucHJveHkpKSA9PiB7XG4gICAgQXJyYXkuZnJvbShcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLXYtb3duZXI9XCIke2luc3RhbmNlLnVpZH1cIl1gKVxuICAgICkuZm9yRWFjaCgobm9kZSkgPT4gc2V0VmFyc09uTm9kZShub2RlLCB2YXJzKSk7XG4gIH07XG4gIGNvbnN0IHNldFZhcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgdmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSk7XG4gICAgc2V0VmFyc09uVk5vZGUoaW5zdGFuY2Uuc3ViVHJlZSwgdmFycyk7XG4gICAgdXBkYXRlVGVsZXBvcnRzKHZhcnMpO1xuICB9O1xuICB3YXRjaFBvc3RFZmZlY3Qoc2V0VmFycyk7XG4gIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihzZXRWYXJzKTtcbiAgICBvYi5vYnNlcnZlKGluc3RhbmNlLnN1YlRyZWUuZWwucGFyZW50Tm9kZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgb25Vbm1vdW50ZWQoKCkgPT4gb2IuZGlzY29ubmVjdCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBzZXRWYXJzT25WTm9kZSh2bm9kZSwgdmFycykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZTtcbiAgICB2bm9kZSA9IHN1c3BlbnNlLmFjdGl2ZUJyYW5jaDtcbiAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCgoKSA9PiB7XG4gICAgICAgIHNldFZhcnNPblZOb2RlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgdmFycyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHZub2RlLmNvbXBvbmVudCkge1xuICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50LnN1YlRyZWU7XG4gIH1cbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdm5vZGUuZWwpIHtcbiAgICBzZXRWYXJzT25Ob2RlKHZub2RlLmVsLCB2YXJzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBGcmFnbWVudCkge1xuICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGMpID0+IHNldFZhcnNPblZOb2RlKGMsIHZhcnMpKTtcbiAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBTdGF0aWMpIHtcbiAgICBsZXQgeyBlbCwgYW5jaG9yIH0gPSB2bm9kZTtcbiAgICB3aGlsZSAoZWwpIHtcbiAgICAgIHNldFZhcnNPbk5vZGUoZWwsIHZhcnMpO1xuICAgICAgaWYgKGVsID09PSBhbmNob3IpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZWwgPSBlbC5uZXh0U2libGluZztcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFZhcnNPbk5vZGUoZWwsIHZhcnMpIHtcbiAgaWYgKGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICBsZXQgY3NzVGV4dCA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFycykge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFyc1trZXldKTtcbiAgICAgIGNzc1RleHQgKz0gYC0tJHtrZXl9OiAke3ZhcnNba2V5XX07YDtcbiAgICB9XG4gICAgc3R5bGVbQ1NTX1ZBUl9URVhUXSA9IGNzc1RleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2hTdHlsZShlbCwgcHJldiwgbmV4dCkge1xuICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICBjb25zdCBjdXJyZW50RGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG4gIGNvbnN0IGlzQ3NzU3RyaW5nID0gaXNTdHJpbmcobmV4dCk7XG4gIGlmIChuZXh0ICYmICFpc0Nzc1N0cmluZykge1xuICAgIGlmIChwcmV2ICYmICFpc1N0cmluZyhwcmV2KSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgICAgICBpZiAobmV4dFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBuZXh0W2tleV0pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNDc3NTdHJpbmcpIHtcbiAgICAgIGlmIChwcmV2ICE9PSBuZXh0KSB7XG4gICAgICAgIGNvbnN0IGNzc1ZhclRleHQgPSBzdHlsZVtDU1NfVkFSX1RFWFRdO1xuICAgICAgICBpZiAoY3NzVmFyVGV4dCkge1xuICAgICAgICAgIG5leHQgKz0gXCI7XCIgKyBjc3NWYXJUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLmNzc1RleHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldikge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgfVxuICB9XG4gIGlmICh2U2hvd09sZEtleSBpbiBlbCkge1xuICAgIHN0eWxlLmRpc3BsYXkgPSBjdXJyZW50RGlzcGxheTtcbiAgfVxufVxuY29uc3Qgc2VtaWNvbG9uUkUgPSAvW15cXFxcXTtcXHMqJC87XG5jb25zdCBpbXBvcnRhbnRSRSA9IC9cXHMqIWltcG9ydGFudCQvO1xuZnVuY3Rpb24gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHZhbCkge1xuICBpZiAoaXNBcnJheSh2YWwpKSB7XG4gICAgdmFsLmZvckVhY2goKHYpID0+IHNldFN0eWxlKHN0eWxlLCBuYW1lLCB2KSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKVxuICAgICAgdmFsID0gXCJcIjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgaWYgKHNlbWljb2xvblJFLnRlc3QodmFsKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHNlbWljb2xvbiBhdCB0aGUgZW5kIG9mICcke25hbWV9JyBzdHlsZSB2YWx1ZTogJyR7dmFsfSdgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJlZml4ZWQgPSBhdXRvUHJlZml4KHN0eWxlLCBuYW1lKTtcbiAgICAgIGlmIChpbXBvcnRhbnRSRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoXG4gICAgICAgICAgaHlwaGVuYXRlKHByZWZpeGVkKSxcbiAgICAgICAgICB2YWwucmVwbGFjZShpbXBvcnRhbnRSRSwgXCJcIiksXG4gICAgICAgICAgXCJpbXBvcnRhbnRcIlxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3R5bGVbcHJlZml4ZWRdID0gdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuY29uc3QgcHJlZml4ZXMgPSBbXCJXZWJraXRcIiwgXCJNb3pcIiwgXCJtc1wiXTtcbmNvbnN0IHByZWZpeENhY2hlID0ge307XG5mdW5jdGlvbiBhdXRvUHJlZml4KHN0eWxlLCByYXdOYW1lKSB7XG4gIGNvbnN0IGNhY2hlZCA9IHByZWZpeENhY2hlW3Jhd05hbWVdO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBsZXQgbmFtZSA9IGNhbWVsaXplKHJhd05hbWUpO1xuICBpZiAobmFtZSAhPT0gXCJmaWx0ZXJcIiAmJiBuYW1lIGluIHN0eWxlKSB7XG4gICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gbmFtZTtcbiAgfVxuICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXhlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeGVkID0gcHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgIGlmIChwcmVmaXhlZCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeENhY2hlW3Jhd05hbWVdID0gcHJlZml4ZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByYXdOYW1lO1xufVxuXG5jb25zdCB4bGlua05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI7XG5mdW5jdGlvbiBwYXRjaEF0dHIoZWwsIGtleSwgdmFsdWUsIGlzU1ZHLCBpbnN0YW5jZSkge1xuICBpZiAoaXNTVkcgJiYga2V5LnN0YXJ0c1dpdGgoXCJ4bGluazpcIikpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMoeGxpbmtOUywga2V5LnNsaWNlKDYsIGtleS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlTlMoeGxpbmtOUywga2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzQm9vbGVhbiA9IGlzU3BlY2lhbEJvb2xlYW5BdHRyKGtleSk7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgaXNCb29sZWFuICYmICFpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgaXNCb29sZWFuID8gXCJcIiA6IHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2hET01Qcm9wKGVsLCBrZXksIHZhbHVlLCBwcmV2Q2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHVubW91bnRDaGlsZHJlbikge1xuICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgaWYgKHByZXZDaGlsZHJlbikge1xuICAgICAgdW5tb3VudENoaWxkcmVuKHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICAgIGVsW2tleV0gPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICBpZiAoa2V5ID09PSBcInZhbHVlXCIgJiYgdGFnICE9PSBcIlBST0dSRVNTXCIgJiYgLy8gY3VzdG9tIGVsZW1lbnRzIG1heSB1c2UgX3ZhbHVlIGludGVybmFsbHlcbiAgIXRhZy5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICBlbC5fdmFsdWUgPSB2YWx1ZTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhZyA9PT0gXCJPUFRJT05cIiA/IGVsLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpIDogZWwudmFsdWU7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIGlmIChvbGRWYWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbFtrZXldO1xuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGVsW2tleV0gPSB2YWx1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFuZWVkUmVtb3ZlKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHNldHRpbmcgcHJvcCBcIiR7a2V5fVwiIG9uIDwke3RhZy50b0xvd2VyQ2FzZSgpfT46IHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmNvbnN0IHZlaUtleSA9IFN5bWJvbChcIl92ZWlcIik7XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGVsLCByYXdOYW1lLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5zdGFuY2UgPSBudWxsKSB7XG4gIGNvbnN0IGludm9rZXJzID0gZWxbdmVpS2V5XSB8fCAoZWxbdmVpS2V5XSA9IHt9KTtcbiAgY29uc3QgZXhpc3RpbmdJbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV07XG4gIGlmIChuZXh0VmFsdWUgJiYgZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgZXhpc3RpbmdJbnZva2VyLnZhbHVlID0gbmV4dFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtuYW1lLCBvcHRpb25zXSA9IHBhcnNlTmFtZShyYXdOYW1lKTtcbiAgICBpZiAobmV4dFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV0gPSBjcmVhdGVJbnZva2VyKG5leHRWYWx1ZSwgaW5zdGFuY2UpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgaW52b2tlciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0ludm9rZXIpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIG5hbWUsIGV4aXN0aW5nSW52b2tlciwgb3B0aW9ucyk7XG4gICAgICBpbnZva2Vyc1tyYXdOYW1lXSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IG9wdGlvbnNNb2RpZmllclJFID0gLyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO1xuZnVuY3Rpb24gcGFyc2VOYW1lKG5hbWUpIHtcbiAgbGV0IG9wdGlvbnM7XG4gIGlmIChvcHRpb25zTW9kaWZpZXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICAgIGxldCBtO1xuICAgIHdoaWxlIChtID0gbmFtZS5tYXRjaChvcHRpb25zTW9kaWZpZXJSRSkpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoIC0gbVswXS5sZW5ndGgpO1xuICAgICAgb3B0aW9uc1ttWzBdLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXZlbnQgPSBuYW1lWzJdID09PSBcIjpcIiA/IG5hbWUuc2xpY2UoMykgOiBoeXBoZW5hdGUobmFtZS5zbGljZSgyKSk7XG4gIHJldHVybiBbZXZlbnQsIG9wdGlvbnNdO1xufVxubGV0IGNhY2hlZE5vdyA9IDA7XG5jb25zdCBwID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgZ2V0Tm93ID0gKCkgPT4gY2FjaGVkTm93IHx8IChwLnRoZW4oKCkgPT4gY2FjaGVkTm93ID0gMCksIGNhY2hlZE5vdyA9IERhdGUubm93KCkpO1xuZnVuY3Rpb24gY3JlYXRlSW52b2tlcihpbml0aWFsVmFsdWUsIGluc3RhbmNlKSB7XG4gIGNvbnN0IGludm9rZXIgPSAoZSkgPT4ge1xuICAgIGlmICghZS5fdnRzKSB7XG4gICAgICBlLl92dHMgPSBEYXRlLm5vdygpO1xuICAgIH0gZWxzZSBpZiAoZS5fdnRzIDw9IGludm9rZXIuYXR0YWNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCBpbnZva2VyLnZhbHVlKSxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNSxcbiAgICAgIFtlXVxuICAgICk7XG4gIH07XG4gIGludm9rZXIudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGludm9rZXIuYXR0YWNoZWQgPSBnZXROb3coKTtcbiAgcmV0dXJuIGludm9rZXI7XG59XG5mdW5jdGlvbiBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCB2YWx1ZSkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBvcmlnaW5hbFN0b3AgPSBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsU3RvcC5jYWxsKGUpO1xuICAgICAgZS5fc3RvcHBlZCA9IHRydWU7XG4gICAgfTtcbiAgICByZXR1cm4gdmFsdWUubWFwKChmbikgPT4gKGUyKSA9PiAhZTIuX3N0b3BwZWQgJiYgZm4gJiYgZm4oZTIpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY29uc3QgaXNOYXRpdmVPbiA9IChrZXkpID0+IGtleS5jaGFyQ29kZUF0KDApID09PSAxMTEgJiYga2V5LmNoYXJDb2RlQXQoMSkgPT09IDExMCAmJiAvLyBsb3dlcmNhc2UgbGV0dGVyXG5rZXkuY2hhckNvZGVBdCgyKSA+IDk2ICYmIGtleS5jaGFyQ29kZUF0KDIpIDwgMTIzO1xuY29uc3QgcGF0Y2hQcm9wID0gKGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBuYW1lc3BhY2UsIHByZXZDaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdW5tb3VudENoaWxkcmVuKSA9PiB7XG4gIGNvbnN0IGlzU1ZHID0gbmFtZXNwYWNlID09PSBcInN2Z1wiO1xuICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICBwYXRjaENsYXNzKGVsLCBuZXh0VmFsdWUsIGlzU1ZHKTtcbiAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgIHBhdGNoU3R5bGUoZWwsIHByZXZWYWx1ZSwgbmV4dFZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc09uKGtleSkpIHtcbiAgICBpZiAoIWlzTW9kZWxMaXN0ZW5lcihrZXkpKSB7XG4gICAgICBwYXRjaEV2ZW50KGVsLCBrZXksIHByZXZWYWx1ZSwgbmV4dFZhbHVlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXlbMF0gPT09IFwiLlwiID8gKGtleSA9IGtleS5zbGljZSgxKSwgdHJ1ZSkgOiBrZXlbMF0gPT09IFwiXlwiID8gKGtleSA9IGtleS5zbGljZSgxKSwgZmFsc2UpIDogc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpKSB7XG4gICAgcGF0Y2hET01Qcm9wKFxuICAgICAgZWwsXG4gICAgICBrZXksXG4gICAgICBuZXh0VmFsdWUsXG4gICAgICBwcmV2Q2hpbGRyZW4sXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIHVubW91bnRDaGlsZHJlblxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleSA9PT0gXCJ0cnVlLXZhbHVlXCIpIHtcbiAgICAgIGVsLl90cnVlVmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiZmFsc2UtdmFsdWVcIikge1xuICAgICAgZWwuX2ZhbHNlVmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgfVxuICAgIHBhdGNoQXR0cihlbCwga2V5LCBuZXh0VmFsdWUsIGlzU1ZHKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNob3VsZFNldEFzUHJvcChlbCwga2V5LCB2YWx1ZSwgaXNTVkcpIHtcbiAgaWYgKGlzU1ZHKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpbm5lckhUTUxcIiB8fCBrZXkgPT09IFwidGV4dENvbnRlbnRcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChrZXkgaW4gZWwgJiYgaXNOYXRpdmVPbihrZXkpICYmIGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwic3BlbGxjaGVja1wiIHx8IGtleSA9PT0gXCJkcmFnZ2FibGVcIiB8fCBrZXkgPT09IFwidHJhbnNsYXRlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJmb3JtXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJsaXN0XCIgJiYgZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwidHlwZVwiICYmIGVsLnRhZ05hbWUgPT09IFwiVEVYVEFSRUFcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcIndpZHRoXCIgfHwga2V5ID09PSBcImhlaWdodFwiKSB7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZTtcbiAgICBpZiAodGFnID09PSBcIklNR1wiIHx8IHRhZyA9PT0gXCJWSURFT1wiIHx8IHRhZyA9PT0gXCJDQU5WQVNcIiB8fCB0YWcgPT09IFwiU09VUkNFXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzTmF0aXZlT24oa2V5KSAmJiBpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGtleSBpbiBlbDtcbn1cblxuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRWxlbWVudChvcHRpb25zLCBoeWRyYXRlMikge1xuICBjb25zdCBDb21wID0gZGVmaW5lQ29tcG9uZW50KG9wdGlvbnMpO1xuICBjbGFzcyBWdWVDdXN0b21FbGVtZW50IGV4dGVuZHMgVnVlRWxlbWVudCB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbFByb3BzKSB7XG4gICAgICBzdXBlcihDb21wLCBpbml0aWFsUHJvcHMsIGh5ZHJhdGUyKTtcbiAgICB9XG4gIH1cbiAgVnVlQ3VzdG9tRWxlbWVudC5kZWYgPSBDb21wO1xuICByZXR1cm4gVnVlQ3VzdG9tRWxlbWVudDtcbn1cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuY29uc3QgZGVmaW5lU1NSQ3VzdG9tRWxlbWVudCA9IC8qIEBfX05PX1NJREVfRUZGRUNUU19fICovIChvcHRpb25zKSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gZGVmaW5lQ3VzdG9tRWxlbWVudChvcHRpb25zLCBoeWRyYXRlKTtcbn07XG5jb25zdCBCYXNlQ2xhc3MgPSB0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgPyBIVE1MRWxlbWVudCA6IGNsYXNzIHtcbn07XG5jbGFzcyBWdWVFbGVtZW50IGV4dGVuZHMgQmFzZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoX2RlZiwgX3Byb3BzID0ge30sIGh5ZHJhdGUyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgIHRoaXMuX3Byb3BzID0gX3Byb3BzO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IGZhbHNlO1xuICAgIHRoaXMuX251bWJlclByb3BzID0gbnVsbDtcbiAgICB0aGlzLl9vYiA9IG51bGw7XG4gICAgaWYgKHRoaXMuc2hhZG93Um9vdCAmJiBoeWRyYXRlMikge1xuICAgICAgaHlkcmF0ZTIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gICAgICBpZiAoIXRoaXMuX2RlZi5fX2FzeW5jTG9hZGVyKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyh0aGlzLl9kZWYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgIGlmICghdGhpcy5faW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLl9yZXNvbHZlZCkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVEZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuX29iKSB7XG4gICAgICB0aGlzLl9vYi5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLl9vYiA9IG51bGw7XG4gICAgfVxuICAgIG5leHRUaWNrKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fY29ubmVjdGVkKSB7XG4gICAgICAgIHJlbmRlcihudWxsLCB0aGlzLnNoYWRvd1Jvb3QpO1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIHJlc29sdmUgaW5uZXIgY29tcG9uZW50IGRlZmluaXRpb24gKGhhbmRsZSBwb3NzaWJsZSBhc3luYyBjb21wb25lbnQpXG4gICAqL1xuICBfcmVzb2x2ZURlZigpIHtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IHRydWU7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX3NldEF0dHIodGhpcy5hdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgIH1cbiAgICB0aGlzLl9vYiA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbSBvZiBtdXRhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fc2V0QXR0cihtLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX29iLm9ic2VydmUodGhpcywgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IHJlc29sdmUgPSAoZGVmLCBpc0FzeW5jID0gZmFsc2UpID0+IHtcbiAgICAgIGNvbnN0IHsgcHJvcHMsIHN0eWxlcyB9ID0gZGVmO1xuICAgICAgbGV0IG51bWJlclByb3BzO1xuICAgICAgaWYgKHByb3BzICYmICFpc0FycmF5KHByb3BzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgIGNvbnN0IG9wdCA9IHByb3BzW2tleV07XG4gICAgICAgICAgaWYgKG9wdCA9PT0gTnVtYmVyIHx8IG9wdCAmJiBvcHQudHlwZSA9PT0gTnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIHRoaXMuX3Byb3BzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB0b051bWJlcih0aGlzLl9wcm9wc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChudW1iZXJQcm9wcyB8fCAobnVtYmVyUHJvcHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSkpW2NhbWVsaXplJDEoa2V5KV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudW1iZXJQcm9wcztcbiAgICAgIGlmIChpc0FzeW5jKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyhkZWYpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYXBwbHlTdHlsZXMoc3R5bGVzKTtcbiAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgIH07XG4gICAgY29uc3QgYXN5bmNEZWYgPSB0aGlzLl9kZWYuX19hc3luY0xvYWRlcjtcbiAgICBpZiAoYXN5bmNEZWYpIHtcbiAgICAgIGFzeW5jRGVmKCkudGhlbigoZGVmKSA9PiByZXNvbHZlKGRlZiwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKHRoaXMuX2RlZik7XG4gICAgfVxuICB9XG4gIF9yZXNvbHZlUHJvcHMoZGVmKSB7XG4gICAgY29uc3QgeyBwcm9wcyB9ID0gZGVmO1xuICAgIGNvbnN0IGRlY2xhcmVkUHJvcEtleXMgPSBpc0FycmF5KHByb3BzKSA/IHByb3BzIDogT2JqZWN0LmtleXMocHJvcHMgfHwge30pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMpKSB7XG4gICAgICBpZiAoa2V5WzBdICE9PSBcIl9cIiAmJiBkZWNsYXJlZFByb3BLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhpcy5fc2V0UHJvcChrZXksIHRoaXNba2V5XSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkZWNsYXJlZFByb3BLZXlzLm1hcChjYW1lbGl6ZSQxKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGtleSwge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3Aoa2V5KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHZhbCkge1xuICAgICAgICAgIHRoaXMuX3NldFByb3Aoa2V5LCB2YWwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgX3NldEF0dHIoa2V5KSB7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICBjb25zdCBjYW1lbEtleSA9IGNhbWVsaXplJDEoa2V5KTtcbiAgICBpZiAodGhpcy5fbnVtYmVyUHJvcHMgJiYgdGhpcy5fbnVtYmVyUHJvcHNbY2FtZWxLZXldKSB7XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0UHJvcChjYW1lbEtleSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZ2V0UHJvcChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHNba2V5XTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfc2V0UHJvcChrZXksIHZhbCwgc2hvdWxkUmVmbGVjdCA9IHRydWUsIHNob3VsZFVwZGF0ZSA9IHRydWUpIHtcbiAgICBpZiAodmFsICE9PSB0aGlzLl9wcm9wc1trZXldKSB7XG4gICAgICB0aGlzLl9wcm9wc1trZXldID0gdmFsO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiB0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZWZsZWN0KSB7XG4gICAgICAgIGlmICh2YWwgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSksIHZhbCArIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWwpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3VwZGF0ZSgpIHtcbiAgICByZW5kZXIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5zaGFkb3dSb290KTtcbiAgfVxuICBfY3JlYXRlVk5vZGUoKSB7XG4gICAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZSh0aGlzLl9kZWYsIGV4dGVuZCh7fSwgdGhpcy5fcHJvcHMpKTtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB2bm9kZS5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5pc0NFID0gdHJ1ZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBpbnN0YW5jZS5jZVJlbG9hZCA9IChuZXdTdHlsZXMpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdHlsZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fc3R5bGVzLmZvckVhY2goKHMpID0+IHRoaXMuc2hhZG93Um9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHlsZXMobmV3U3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoZXZlbnQsIHtcbiAgICAgICAgICAgICAgZGV0YWlsOiBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3RhbmNlLmVtaXQgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBkaXNwYXRjaChldmVudCwgYXJncyk7XG4gICAgICAgICAgaWYgKGh5cGhlbmF0ZShldmVudCkgIT09IGV2ZW50KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChoeXBoZW5hdGUoZXZlbnQpLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzO1xuICAgICAgICB3aGlsZSAocGFyZW50ID0gcGFyZW50ICYmIChwYXJlbnQucGFyZW50Tm9kZSB8fCBwYXJlbnQuaG9zdCkpIHtcbiAgICAgICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVnVlRWxlbWVudCkge1xuICAgICAgICAgICAgaW5zdGFuY2UucGFyZW50ID0gcGFyZW50Ll9pbnN0YW5jZTtcbiAgICAgICAgICAgIGluc3RhbmNlLnByb3ZpZGVzID0gcGFyZW50Ll9pbnN0YW5jZS5wcm92aWRlcztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIF9hcHBseVN0eWxlcyhzdHlsZXMpIHtcbiAgICBpZiAoc3R5bGVzKSB7XG4gICAgICBzdHlsZXMuZm9yRWFjaCgoY3NzKSA9PiB7XG4gICAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgIHMudGV4dENvbnRlbnQgPSBjc3M7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAodGhpcy5fc3R5bGVzIHx8ICh0aGlzLl9zdHlsZXMgPSBbXSkpLnB1c2gocyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1c2VDc3NNb2R1bGUobmFtZSA9IFwiJHN0eWxlXCIpIHtcbiAge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB1c2VDc3NNb2R1bGUgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIHNldHVwKClgKTtcbiAgICAgIHJldHVybiBFTVBUWV9PQko7XG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZXMgPSBpbnN0YW5jZS50eXBlLl9fY3NzTW9kdWxlcztcbiAgICBpZiAoIW1vZHVsZXMpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihgQ3VycmVudCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIENTUyBtb2R1bGVzIGluamVjdGVkLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kID0gbW9kdWxlc1tuYW1lXTtcbiAgICBpZiAoIW1vZCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZSBuYW1lZCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgIHJldHVybiBFTVBUWV9PQko7XG4gICAgfVxuICAgIHJldHVybiBtb2Q7XG4gIH1cbn1cblxuY29uc3QgcG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG5ld1Bvc2l0aW9uTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBtb3ZlQ2JLZXkgPSBTeW1ib2woXCJfbW92ZUNiXCIpO1xuY29uc3QgZW50ZXJDYktleSA9IFN5bWJvbChcIl9lbnRlckNiXCIpO1xuY29uc3QgVHJhbnNpdGlvbkdyb3VwSW1wbCA9IHtcbiAgbmFtZTogXCJUcmFuc2l0aW9uR3JvdXBcIixcbiAgcHJvcHM6IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoe30sIFRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMsIHtcbiAgICB0YWc6IFN0cmluZyxcbiAgICBtb3ZlQ2xhc3M6IFN0cmluZ1xuICB9KSxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICBsZXQgcHJldkNoaWxkcmVuO1xuICAgIGxldCBjaGlsZHJlbjtcbiAgICBvblVwZGF0ZWQoKCkgPT4ge1xuICAgICAgaWYgKCFwcmV2Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vdmVDbGFzcyA9IHByb3BzLm1vdmVDbGFzcyB8fCBgJHtwcm9wcy5uYW1lIHx8IFwidlwifS1tb3ZlYDtcbiAgICAgIGlmICghaGFzQ1NTVHJhbnNmb3JtKFxuICAgICAgICBwcmV2Q2hpbGRyZW5bMF0uZWwsXG4gICAgICAgIGluc3RhbmNlLnZub2RlLmVsLFxuICAgICAgICBtb3ZlQ2xhc3NcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goY2FsbFBlbmRpbmdDYnMpO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2gocmVjb3JkUG9zaXRpb24pO1xuICAgICAgY29uc3QgbW92ZWRDaGlsZHJlbiA9IHByZXZDaGlsZHJlbi5maWx0ZXIoYXBwbHlUcmFuc2xhdGlvbik7XG4gICAgICBmb3JjZVJlZmxvdygpO1xuICAgICAgbW92ZWRDaGlsZHJlbi5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gYy5lbDtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICBzdHlsZS50cmFuc2Zvcm0gPSBzdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBzdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBcIlwiO1xuICAgICAgICBjb25zdCBjYiA9IGVsW21vdmVDYktleV0gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlICYmIGUudGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWUgfHwgL3RyYW5zZm9ybSQvLnRlc3QoZS5wcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCBjYik7XG4gICAgICAgICAgICBlbFttb3ZlQ2JLZXldID0gbnVsbDtcbiAgICAgICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbW92ZUNsYXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IGNzc1RyYW5zaXRpb25Qcm9wcyA9IHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocmF3UHJvcHMpO1xuICAgICAgbGV0IHRhZyA9IHJhd1Byb3BzLnRhZyB8fCBGcmFnbWVudDtcbiAgICAgIHByZXZDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuKGA8VHJhbnNpdGlvbkdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldkNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2hpbGQgPSBwcmV2Q2hpbGRyZW5baV07XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChjaGlsZCwgY2hpbGQuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodGFnLCBudWxsLCBjaGlsZHJlbik7XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IHJlbW92ZU1vZGUgPSAocHJvcHMpID0+IGRlbGV0ZSBwcm9wcy5tb2RlO1xuLyogQF9fUFVSRV9fICovIHJlbW92ZU1vZGUoVHJhbnNpdGlvbkdyb3VwSW1wbC5wcm9wcyk7XG5jb25zdCBUcmFuc2l0aW9uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXBJbXBsO1xuZnVuY3Rpb24gY2FsbFBlbmRpbmdDYnMoYykge1xuICBjb25zdCBlbCA9IGMuZWw7XG4gIGlmIChlbFttb3ZlQ2JLZXldKSB7XG4gICAgZWxbbW92ZUNiS2V5XSgpO1xuICB9XG4gIGlmIChlbFtlbnRlckNiS2V5XSkge1xuICAgIGVsW2VudGVyQ2JLZXldKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlY29yZFBvc2l0aW9uKGMpIHtcbiAgbmV3UG9zaXRpb25NYXAuc2V0KGMsIGMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xufVxuZnVuY3Rpb24gYXBwbHlUcmFuc2xhdGlvbihjKSB7XG4gIGNvbnN0IG9sZFBvcyA9IHBvc2l0aW9uTWFwLmdldChjKTtcbiAgY29uc3QgbmV3UG9zID0gbmV3UG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBkeCA9IG9sZFBvcy5sZWZ0IC0gbmV3UG9zLmxlZnQ7XG4gIGNvbnN0IGR5ID0gb2xkUG9zLnRvcCAtIG5ld1Bvcy50b3A7XG4gIGlmIChkeCB8fCBkeSkge1xuICAgIGNvbnN0IHMgPSBjLmVsLnN0eWxlO1xuICAgIHMudHJhbnNmb3JtID0gcy53ZWJraXRUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZHh9cHgsJHtkeX1weClgO1xuICAgIHMudHJhbnNpdGlvbkR1cmF0aW9uID0gXCIwc1wiO1xuICAgIHJldHVybiBjO1xuICB9XG59XG5mdW5jdGlvbiBoYXNDU1NUcmFuc2Zvcm0oZWwsIHJvb3QsIG1vdmVDbGFzcykge1xuICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSgpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmZvckVhY2goKGNscykgPT4ge1xuICAgICAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBjbG9uZS5jbGFzc0xpc3QucmVtb3ZlKGMpKTtcbiAgICB9KTtcbiAgfVxuICBtb3ZlQ2xhc3Muc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5hZGQoYykpO1xuICBjbG9uZS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gIGNvbnN0IGNvbnRhaW5lciA9IHJvb3Qubm9kZVR5cGUgPT09IDEgPyByb290IDogcm9vdC5wYXJlbnROb2RlO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICBjb25zdCB7IGhhc1RyYW5zZm9ybSB9ID0gZ2V0VHJhbnNpdGlvbkluZm8oY2xvbmUpO1xuICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICByZXR1cm4gaGFzVHJhbnNmb3JtO1xufVxuXG5jb25zdCBnZXRNb2RlbEFzc2lnbmVyID0gKHZub2RlKSA9PiB7XG4gIGNvbnN0IGZuID0gdm5vZGUucHJvcHNbXCJvblVwZGF0ZTptb2RlbFZhbHVlXCJdIHx8IGZhbHNlO1xuICByZXR1cm4gaXNBcnJheShmbikgPyAodmFsdWUpID0+IGludm9rZUFycmF5Rm5zKGZuLCB2YWx1ZSkgOiBmbjtcbn07XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uU3RhcnQoZSkge1xuICBlLnRhcmdldC5jb21wb3NpbmcgPSB0cnVlO1xufVxuZnVuY3Rpb24gb25Db21wb3NpdGlvbkVuZChlKSB7XG4gIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0O1xuICBpZiAodGFyZ2V0LmNvbXBvc2luZykge1xuICAgIHRhcmdldC5jb21wb3NpbmcgPSBmYWxzZTtcbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gIH1cbn1cbmNvbnN0IGFzc2lnbktleSA9IFN5bWJvbChcIl9hc3NpZ25cIik7XG5jb25zdCB2TW9kZWxUZXh0ID0ge1xuICBjcmVhdGVkKGVsLCB7IG1vZGlmaWVyczogeyBsYXp5LCB0cmltLCBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBjb25zdCBjYXN0VG9OdW1iZXIgPSBudW1iZXIgfHwgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZSA9PT0gXCJudW1iZXJcIjtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBsYXp5ID8gXCJjaGFuZ2VcIiA6IFwiaW5wdXRcIiwgKGUpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldC5jb21wb3NpbmcpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBkb21WYWx1ZSA9IGVsLnZhbHVlO1xuICAgICAgaWYgKHRyaW0pIHtcbiAgICAgICAgZG9tVmFsdWUgPSBkb21WYWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FzdFRvTnVtYmVyKSB7XG4gICAgICAgIGRvbVZhbHVlID0gbG9vc2VUb051bWJlcihkb21WYWx1ZSk7XG4gICAgICB9XG4gICAgICBlbFthc3NpZ25LZXldKGRvbVZhbHVlKTtcbiAgICB9KTtcbiAgICBpZiAodHJpbSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgICBlbC52YWx1ZSA9IGVsLnZhbHVlLnRyaW0oKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIWxhenkpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY29tcG9zaXRpb25zdGFydFwiLCBvbkNvbXBvc2l0aW9uU3RhcnQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbmVuZFwiLCBvbkNvbXBvc2l0aW9uRW5kKTtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgIH1cbiAgfSxcbiAgLy8gc2V0IHZhbHVlIG9uIG1vdW50ZWQgc28gaXQncyBhZnRlciBtaW4vbWF4IGZvciB0eXBlPVwicmFuZ2VcIlxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0pIHtcbiAgICBlbC52YWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmIChlbC5jb21wb3NpbmcpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZWxWYWx1ZSA9IG51bWJlciB8fCBlbC50eXBlID09PSBcIm51bWJlclwiID8gbG9vc2VUb051bWJlcihlbC52YWx1ZSkgOiBlbC52YWx1ZTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWU7XG4gICAgaWYgKGVsVmFsdWUgPT09IG5ld1ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBlbCAmJiBlbC50eXBlICE9PSBcInJhbmdlXCIpIHtcbiAgICAgIGlmIChsYXp5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0cmltICYmIGVsLnZhbHVlLnRyaW0oKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBlbC52YWx1ZSA9IG5ld1ZhbHVlO1xuICB9XG59O1xuY29uc3Qgdk1vZGVsQ2hlY2tib3ggPSB7XG4gIC8vICM0MDk2IGFycmF5IGNoZWNrYm94ZXMgbmVlZCB0byBiZSBkZWVwIHRyYXZlcnNlZFxuICBkZWVwOiB0cnVlLFxuICBjcmVhdGVkKGVsLCBfLCB2bm9kZSkge1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbFZhbHVlID0gZWwuX21vZGVsVmFsdWU7XG4gICAgICBjb25zdCBlbGVtZW50VmFsdWUgPSBnZXRWYWx1ZShlbCk7XG4gICAgICBjb25zdCBjaGVja2VkID0gZWwuY2hlY2tlZDtcbiAgICAgIGNvbnN0IGFzc2lnbiA9IGVsW2Fzc2lnbktleV07XG4gICAgICBpZiAoaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IGxvb3NlSW5kZXhPZihtb2RlbFZhbHVlLCBlbGVtZW50VmFsdWUpO1xuICAgICAgICBjb25zdCBmb3VuZCA9IGluZGV4ICE9PSAtMTtcbiAgICAgICAgaWYgKGNoZWNrZWQgJiYgIWZvdW5kKSB7XG4gICAgICAgICAgYXNzaWduKG1vZGVsVmFsdWUuY29uY2F0KGVsZW1lbnRWYWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFjaGVja2VkICYmIGZvdW5kKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBbLi4ubW9kZWxWYWx1ZV07XG4gICAgICAgICAgZmlsdGVyZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICBhc3NpZ24oZmlsdGVyZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzU2V0KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGNsb25lZCA9IG5ldyBTZXQobW9kZWxWYWx1ZSk7XG4gICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgY2xvbmVkLmFkZChlbGVtZW50VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsb25lZC5kZWxldGUoZWxlbWVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NpZ24oY2xvbmVkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFzc2lnbihnZXRDaGVja2JveFZhbHVlKGVsLCBjaGVja2VkKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIC8vIHNldCBpbml0aWFsIGNoZWNrZWQgb24gbW91bnQgdG8gd2FpdCBmb3IgdHJ1ZS12YWx1ZS9mYWxzZS12YWx1ZVxuICBtb3VudGVkOiBzZXRDaGVja2VkLFxuICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIHNldENoZWNrZWQoZWwsIGJpbmRpbmcsIHZub2RlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNldENoZWNrZWQoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gIGVsLl9tb2RlbFZhbHVlID0gdmFsdWU7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKSA+IC0xO1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIGVsLmNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCBnZXRDaGVja2JveFZhbHVlKGVsLCB0cnVlKSk7XG4gIH1cbn1cbmNvbnN0IHZNb2RlbFJhZGlvID0ge1xuICBjcmVhdGVkKGVsLCB7IHZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgZWxbYXNzaWduS2V5XShnZXRWYWx1ZShlbCkpO1xuICAgIH0pO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIHsgdmFsdWUsIG9sZFZhbHVlIH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmICh2YWx1ZSAhPT0gb2xkVmFsdWUpIHtcbiAgICAgIGVsLmNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgdk1vZGVsU2VsZWN0ID0ge1xuICAvLyA8c2VsZWN0IG11bHRpcGxlPiB2YWx1ZSBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUsIG1vZGlmaWVyczogeyBudW1iZXIgfSB9LCB2bm9kZSkge1xuICAgIGNvbnN0IGlzU2V0TW9kZWwgPSBpc1NldCh2YWx1ZSk7XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZWwub3B0aW9ucywgKG8pID0+IG8uc2VsZWN0ZWQpLm1hcChcbiAgICAgICAgKG8pID0+IG51bWJlciA/IGxvb3NlVG9OdW1iZXIoZ2V0VmFsdWUobykpIDogZ2V0VmFsdWUobylcbiAgICAgICk7XG4gICAgICBlbFthc3NpZ25LZXldKFxuICAgICAgICBlbC5tdWx0aXBsZSA/IGlzU2V0TW9kZWwgPyBuZXcgU2V0KHNlbGVjdGVkVmFsKSA6IHNlbGVjdGVkVmFsIDogc2VsZWN0ZWRWYWxbMF1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICAvLyBzZXQgdmFsdWUgaW4gbW91bnRlZCAmIHVwZGF0ZWQgYmVjYXVzZSA8c2VsZWN0PiByZWxpZXMgb24gaXRzIGNoaWxkcmVuXG4gIC8vIDxvcHRpb24+cy5cbiAgbW91bnRlZChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCBfYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIHVwZGF0ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gIH1cbn07XG5mdW5jdGlvbiBzZXRTZWxlY3RlZChlbCwgdmFsdWUpIHtcbiAgY29uc3QgaXNNdWx0aXBsZSA9IGVsLm11bHRpcGxlO1xuICBpZiAoaXNNdWx0aXBsZSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgIWlzU2V0KHZhbHVlKSkge1xuICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybihcbiAgICAgIGA8c2VsZWN0IG11bHRpcGxlIHYtbW9kZWw+IGV4cGVjdHMgYW4gQXJyYXkgb3IgU2V0IHZhbHVlIGZvciBpdHMgYmluZGluZywgYnV0IGdvdCAke09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpfS5gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBlbC5vcHRpb25zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IG9wdGlvbiA9IGVsLm9wdGlvbnNbaV07XG4gICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnZXRWYWx1ZShvcHRpb24pO1xuICAgIGlmIChpc011bHRpcGxlKSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gbG9vc2VJbmRleE9mKHZhbHVlLCBvcHRpb25WYWx1ZSkgPiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9IHZhbHVlLmhhcyhvcHRpb25WYWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChsb29zZUVxdWFsKGdldFZhbHVlKG9wdGlvbiksIHZhbHVlKSkge1xuICAgICAgICBpZiAoZWwuc2VsZWN0ZWRJbmRleCAhPT0gaSlcbiAgICAgICAgICBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWlzTXVsdGlwbGUgJiYgZWwuc2VsZWN0ZWRJbmRleCAhPT0gLTEpIHtcbiAgICBlbC5zZWxlY3RlZEluZGV4ID0gLTE7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFZhbHVlKGVsKSB7XG4gIHJldHVybiBcIl92YWx1ZVwiIGluIGVsID8gZWwuX3ZhbHVlIDogZWwudmFsdWU7XG59XG5mdW5jdGlvbiBnZXRDaGVja2JveFZhbHVlKGVsLCBjaGVja2VkKSB7XG4gIGNvbnN0IGtleSA9IGNoZWNrZWQgPyBcIl90cnVlVmFsdWVcIiA6IFwiX2ZhbHNlVmFsdWVcIjtcbiAgcmV0dXJuIGtleSBpbiBlbCA/IGVsW2tleV0gOiBjaGVja2VkO1xufVxuY29uc3Qgdk1vZGVsRHluYW1pYyA9IHtcbiAgY3JlYXRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgbnVsbCwgXCJjcmVhdGVkXCIpO1xuICB9LFxuICBtb3VudGVkKGVsLCBiaW5kaW5nLCB2bm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBudWxsLCBcIm1vdW50ZWRcIik7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIFwiYmVmb3JlVXBkYXRlXCIpO1xuICB9LFxuICB1cGRhdGVkKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgXCJ1cGRhdGVkXCIpO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNNb2RlbCh0YWdOYW1lLCB0eXBlKSB7XG4gIHN3aXRjaCAodGFnTmFtZSkge1xuICAgIGNhc2UgXCJTRUxFQ1RcIjpcbiAgICAgIHJldHVybiB2TW9kZWxTZWxlY3Q7XG4gICAgY2FzZSBcIlRFWFRBUkVBXCI6XG4gICAgICByZXR1cm4gdk1vZGVsVGV4dDtcbiAgICBkZWZhdWx0OlxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgIHJldHVybiB2TW9kZWxDaGVja2JveDtcbiAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgcmV0dXJuIHZNb2RlbFJhZGlvO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB2TW9kZWxUZXh0O1xuICAgICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBob29rKSB7XG4gIGNvbnN0IG1vZGVsVG9Vc2UgPSByZXNvbHZlRHluYW1pY01vZGVsKFxuICAgIGVsLnRhZ05hbWUsXG4gICAgdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMudHlwZVxuICApO1xuICBjb25zdCBmbiA9IG1vZGVsVG9Vc2VbaG9va107XG4gIGZuICYmIGZuKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlKTtcbn1cbmZ1bmN0aW9uIGluaXRWTW9kZWxGb3JTU1IoKSB7XG4gIHZNb2RlbFRleHQuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiAoeyB2YWx1ZSB9KTtcbiAgdk1vZGVsUmFkaW8uZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9LCB2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5wcm9wcyAmJiBsb29zZUVxdWFsKHZub2RlLnByb3BzLnZhbHVlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICB9XG4gIH07XG4gIHZNb2RlbENoZWNrYm94LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSwgdm5vZGUpID0+IHtcbiAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGlmICh2bm9kZS5wcm9wcyAmJiBsb29zZUluZGV4T2YodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgaWYgKHZub2RlLnByb3BzICYmIHZhbHVlLmhhcyh2bm9kZS5wcm9wcy52YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHsgY2hlY2tlZDogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICB9XG4gIH07XG4gIHZNb2RlbER5bmFtaWMuZ2V0U1NSUHJvcHMgPSAoYmluZGluZywgdm5vZGUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZub2RlLnR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbW9kZWxUb1VzZSA9IHJlc29sdmVEeW5hbWljTW9kZWwoXG4gICAgICAvLyByZXNvbHZlRHluYW1pY01vZGVsIGV4cGVjdHMgYW4gdXBwZXJjYXNlIHRhZyBuYW1lLCBidXQgdm5vZGUudHlwZSBpcyBsb3dlcmNhc2VcbiAgICAgIHZub2RlLnR5cGUudG9VcHBlckNhc2UoKSxcbiAgICAgIHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGVcbiAgICApO1xuICAgIGlmIChtb2RlbFRvVXNlLmdldFNTUlByb3BzKSB7XG4gICAgICByZXR1cm4gbW9kZWxUb1VzZS5nZXRTU1JQcm9wcyhiaW5kaW5nLCB2bm9kZSk7XG4gICAgfVxuICB9O1xufVxuXG5jb25zdCBzeXN0ZW1Nb2RpZmllcnMgPSBbXCJjdHJsXCIsIFwic2hpZnRcIiwgXCJhbHRcIiwgXCJtZXRhXCJdO1xuY29uc3QgbW9kaWZpZXJHdWFyZHMgPSB7XG4gIHN0b3A6IChlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpLFxuICBwcmV2ZW50OiAoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpLFxuICBzZWxmOiAoZSkgPT4gZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCxcbiAgY3RybDogKGUpID0+ICFlLmN0cmxLZXksXG4gIHNoaWZ0OiAoZSkgPT4gIWUuc2hpZnRLZXksXG4gIGFsdDogKGUpID0+ICFlLmFsdEtleSxcbiAgbWV0YTogKGUpID0+ICFlLm1ldGFLZXksXG4gIGxlZnQ6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDAsXG4gIG1pZGRsZTogKGUpID0+IFwiYnV0dG9uXCIgaW4gZSAmJiBlLmJ1dHRvbiAhPT0gMSxcbiAgcmlnaHQ6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDIsXG4gIGV4YWN0OiAoZSwgbW9kaWZpZXJzKSA9PiBzeXN0ZW1Nb2RpZmllcnMuc29tZSgobSkgPT4gZVtgJHttfUtleWBdICYmICFtb2RpZmllcnMuaW5jbHVkZXMobSkpXG59O1xuY29uc3Qgd2l0aE1vZGlmaWVycyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gZm4uX3dpdGhNb2RzIHx8IChmbi5fd2l0aE1vZHMgPSB7fSk7XG4gIGNvbnN0IGNhY2hlS2V5ID0gbW9kaWZpZXJzLmpvaW4oXCIuXCIpO1xuICByZXR1cm4gY2FjaGVbY2FjaGVLZXldIHx8IChjYWNoZVtjYWNoZUtleV0gPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZ3VhcmQgPSBtb2RpZmllckd1YXJkc1ttb2RpZmllcnNbaV1dO1xuICAgICAgaWYgKGd1YXJkICYmIGd1YXJkKGV2ZW50LCBtb2RpZmllcnMpKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBmbihldmVudCwgLi4uYXJncyk7XG4gIH0pO1xufTtcbmNvbnN0IGtleU5hbWVzID0ge1xuICBlc2M6IFwiZXNjYXBlXCIsXG4gIHNwYWNlOiBcIiBcIixcbiAgdXA6IFwiYXJyb3ctdXBcIixcbiAgbGVmdDogXCJhcnJvdy1sZWZ0XCIsXG4gIHJpZ2h0OiBcImFycm93LXJpZ2h0XCIsXG4gIGRvd246IFwiYXJyb3ctZG93blwiLFxuICBkZWxldGU6IFwiYmFja3NwYWNlXCJcbn07XG5jb25zdCB3aXRoS2V5cyA9IChmbiwgbW9kaWZpZXJzKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gZm4uX3dpdGhLZXlzIHx8IChmbi5fd2l0aEtleXMgPSB7fSk7XG4gIGNvbnN0IGNhY2hlS2V5ID0gbW9kaWZpZXJzLmpvaW4oXCIuXCIpO1xuICByZXR1cm4gY2FjaGVbY2FjaGVLZXldIHx8IChjYWNoZVtjYWNoZUtleV0gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoIShcImtleVwiIGluIGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBldmVudEtleSA9IGh5cGhlbmF0ZShldmVudC5rZXkpO1xuICAgIGlmIChtb2RpZmllcnMuc29tZSgoaykgPT4gayA9PT0gZXZlbnRLZXkgfHwga2V5TmFtZXNba10gPT09IGV2ZW50S2V5KSkge1xuICAgICAgcmV0dXJuIGZuKGV2ZW50KTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyZXJPcHRpb25zID0gLyogQF9fUFVSRV9fICovIGV4dGVuZCh7IHBhdGNoUHJvcCB9LCBub2RlT3BzKTtcbmxldCByZW5kZXJlcjtcbmxldCBlbmFibGVkSHlkcmF0aW9uID0gZmFsc2U7XG5mdW5jdGlvbiBlbnN1cmVSZW5kZXJlcigpIHtcbiAgcmV0dXJuIHJlbmRlcmVyIHx8IChyZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucykpO1xufVxuZnVuY3Rpb24gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKSB7XG4gIHJlbmRlcmVyID0gZW5hYmxlZEh5ZHJhdGlvbiA/IHJlbmRlcmVyIDogY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKTtcbiAgZW5hYmxlZEh5ZHJhdGlvbiA9IHRydWU7XG4gIHJldHVybiByZW5kZXJlcjtcbn1cbmNvbnN0IHJlbmRlciA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZVJlbmRlcmVyKCkucmVuZGVyKC4uLmFyZ3MpO1xufTtcbmNvbnN0IGh5ZHJhdGUgPSAoLi4uYXJncykgPT4ge1xuICBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmh5ZHJhdGUoLi4uYXJncyk7XG59O1xuY29uc3QgY3JlYXRlQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKCFjb250YWluZXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgY29tcG9uZW50ID0gYXBwLl9jb21wb25lbnQ7XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGNvbXBvbmVudCkgJiYgIWNvbXBvbmVudC5yZW5kZXIgJiYgIWNvbXBvbmVudC50ZW1wbGF0ZSkge1xuICAgICAgY29tcG9uZW50LnRlbXBsYXRlID0gY29udGFpbmVyLmlubmVySFRNTDtcbiAgICB9XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgY29uc3QgcHJveHkgPSBtb3VudChjb250YWluZXIsIGZhbHNlLCByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpKTtcbiAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcInYtY2xvYWtcIik7XG4gICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKFwiZGF0YS12LWFwcFwiLCBcIlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmNvbnN0IGNyZWF0ZVNTUkFwcCA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGVuc3VyZUh5ZHJhdGlvblJlbmRlcmVyKCkuY3JlYXRlQXBwKC4uLmFyZ3MpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCk7XG4gICAgaW5qZWN0Q29tcGlsZXJPcHRpb25zQ2hlY2soYXBwKTtcbiAgfVxuICBjb25zdCB7IG1vdW50IH0gPSBhcHA7XG4gIGFwcC5tb3VudCA9IChjb250YWluZXJPclNlbGVjdG9yKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gbm9ybWFsaXplQ29udGFpbmVyKGNvbnRhaW5lck9yU2VsZWN0b3IpO1xuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHJldHVybiBtb3VudChjb250YWluZXIsIHRydWUsIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGFwcDtcbn07XG5mdW5jdGlvbiByZXNvbHZlUm9vdE5hbWVzcGFjZShjb250YWluZXIpIHtcbiAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJzdmdcIjtcbiAgfVxuICBpZiAodHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiBjb250YWluZXIgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIFwibWF0aG1sXCI7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdE5hdGl2ZVRhZ0NoZWNrKGFwcCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJpc05hdGl2ZVRhZ1wiLCB7XG4gICAgdmFsdWU6ICh0YWcpID0+IGlzSFRNTFRhZyh0YWcpIHx8IGlzU1ZHVGFnKHRhZykgfHwgaXNNYXRoTUxUYWcodGFnKSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSk7XG59XG5mdW5jdGlvbiBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApIHtcbiAgaWYgKGlzUnVudGltZU9ubHkoKSkge1xuICAgIGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IGFwcC5jb25maWcuaXNDdXN0b21FbGVtZW50O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzQ3VzdG9tRWxlbWVudFwiLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBpc0N1c3RvbUVsZW1lbnQ7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIGBUaGUgXFxgaXNDdXN0b21FbGVtZW50XFxgIGNvbmZpZyBvcHRpb24gaXMgZGVwcmVjYXRlZC4gVXNlIFxcYGNvbXBpbGVyT3B0aW9ucy5pc0N1c3RvbUVsZW1lbnRcXGAgaW5zdGVhZC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgY29tcGlsZXJPcHRpb25zID0gYXBwLmNvbmZpZy5jb21waWxlck9wdGlvbnM7XG4gICAgY29uc3QgbXNnID0gYFRoZSBcXGBjb21waWxlck9wdGlvbnNcXGAgY29uZmlnIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIGEgYnVpbGQgb2YgVnVlLmpzIHRoYXQgaW5jbHVkZXMgdGhlIHJ1bnRpbWUgY29tcGlsZXIgKGFrYSBcImZ1bGwgYnVpbGRcIikuIFNpbmNlIHlvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCwgXFxgY29tcGlsZXJPcHRpb25zXFxgIG11c3QgYmUgcGFzc2VkIHRvIFxcYEB2dWUvY29tcGlsZXItZG9tXFxgIGluIHRoZSBidWlsZCBzZXR1cCBpbnN0ZWFkLlxuLSBGb3IgdnVlLWxvYWRlcjogcGFzcyBpdCB2aWEgdnVlLWxvYWRlcidzIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBsb2FkZXIgb3B0aW9uLlxuLSBGb3IgdnVlLWNsaTogc2VlIGh0dHBzOi8vY2xpLnZ1ZWpzLm9yZy9ndWlkZS93ZWJwYWNrLmh0bWwjbW9kaWZ5aW5nLW9wdGlvbnMtb2YtYS1sb2FkZXJcbi0gRm9yIHZpdGU6IHBhc3MgaXQgdmlhIEB2aXRlanMvcGx1Z2luLXZ1ZSBvcHRpb25zLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVqcy92aXRlLXBsdWdpbi12dWUvdHJlZS9tYWluL3BhY2thZ2VzL3BsdWdpbi12dWUjZXhhbXBsZS1mb3ItcGFzc2luZy1vcHRpb25zLXRvLXZ1ZWNvbXBpbGVyLXNmY2A7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiY29tcGlsZXJPcHRpb25zXCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICByZXR1cm4gY29tcGlsZXJPcHRpb25zO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHtcbiAgICAgICAgd2Fybihtc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmIChpc1N0cmluZyhjb250YWluZXIpKSB7XG4gICAgY29uc3QgcmVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihjb250YWluZXIpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFyZXMpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gbW91bnQgYXBwOiBtb3VudCB0YXJnZXQgc2VsZWN0b3IgXCIke2NvbnRhaW5lcn1cIiByZXR1cm5lZCBudWxsLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QgJiYgY29udGFpbmVyLm1vZGUgPT09IFwiY2xvc2VkXCIpIHtcbiAgICB3YXJuKFxuICAgICAgYG1vdW50aW5nIG9uIGEgU2hhZG93Um9vdCB3aXRoIFxcYHttb2RlOiBcImNsb3NlZFwifVxcYCBtYXkgbGVhZCB0byB1bnByZWRpY3RhYmxlIGJ1Z3NgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY29udGFpbmVyO1xufVxubGV0IHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gZmFsc2U7XG5jb25zdCBpbml0RGlyZWN0aXZlc0ZvclNTUiA9ICgpID0+IHtcbiAgaWYgKCFzc3JEaXJlY3RpdmVJbml0aWFsaXplZCkge1xuICAgIHNzckRpcmVjdGl2ZUluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpbml0Vk1vZGVsRm9yU1NSKCk7XG4gICAgaW5pdFZTaG93Rm9yU1NSKCk7XG4gIH1cbn0gO1xuXG5leHBvcnQgeyBUcmFuc2l0aW9uLCBUcmFuc2l0aW9uR3JvdXAsIFZ1ZUVsZW1lbnQsIGNyZWF0ZUFwcCwgY3JlYXRlU1NSQXBwLCBkZWZpbmVDdXN0b21FbGVtZW50LCBkZWZpbmVTU1JDdXN0b21FbGVtZW50LCBoeWRyYXRlLCBpbml0RGlyZWN0aXZlc0ZvclNTUiwgcmVuZGVyLCB1c2VDc3NNb2R1bGUsIHVzZUNzc1ZhcnMsIHZNb2RlbENoZWNrYm94LCB2TW9kZWxEeW5hbWljLCB2TW9kZWxSYWRpbywgdk1vZGVsU2VsZWN0LCB2TW9kZWxUZXh0LCB2U2hvdywgd2l0aEtleXMsIHdpdGhNb2RpZmllcnMgfTtcbiIsIi8qKlxuKiB2dWUgdjMuNC4xMFxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaW5pdEN1c3RvbUZvcm1hdHRlciwgd2FybiB9IGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuZXhwb3J0ICogZnJvbSAnQHZ1ZS9ydW50aW1lLWRvbSc7XG5cbmZ1bmN0aW9uIGluaXREZXYoKSB7XG4gIHtcbiAgICBpbml0Q3VzdG9tRm9ybWF0dGVyKCk7XG4gIH1cbn1cblxuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgaW5pdERldigpO1xufVxuY29uc3QgY29tcGlsZSA9ICgpID0+IHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuKFxuICAgICAgYFJ1bnRpbWUgY29tcGlsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIFZ1ZS5gICsgKGAgQ29uZmlndXJlIHlvdXIgYnVuZGxlciB0byBhbGlhcyBcInZ1ZVwiIHRvIFwidnVlL2Rpc3QvdnVlLmVzbS1idW5kbGVyLmpzXCIuYCApXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgY29tcGlsZSB9O1xuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1jYWxlbmRhclxuICAuZGl0by1jYWxlbmRhci1wb3B1cFxuICAgIC5kaXRvLWNhbGVuZGFyLWlubmVyXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1pZj1cImN1cnJlbnRNb2RlID09PSAnZGF5J1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1tb250aChcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2V0TW9kZSgnbW9udGgnKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgbW9udGg6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC1tb250aChcbiAgICAgICAgICAgIEBjbGljaz1cInN0ZXBNb250aCgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQuZGl0by1jYWxlbmRhci1zdGVwLXllYXIoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItd2Vla2RheXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwid2Vla2RheSBpbiB3ZWVrZGF5TmFtZXNcIlxuICAgICAgICAgICAgKSB7eyB3ZWVrZGF5LnNob3J0IH19XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItZGF0ZXNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwiZGF0ZSBpbiBkYXRlUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJkYXRlLnN0YXRlICYmIGBkaXRvLWNhbGVuZGFyLWl0ZW0tJHtkYXRlLnN0YXRlfWBcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJkYXRlLnN0YXRlICE9PSAnZGlzYWJsZWQnICYmIHNlbGVjdERhdGUoZGF0ZS5kYXRlKVwiXG4gICAgICAgICAgICApIHt7IGRhdGUudGV4dCB9fVxuICAgICAgICAuZGl0by1jYWxlbmRhci1mb290ZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyhcbiAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgOnRpdGxlPVwiZGF0ZVRvU3RyaW5nKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdERhdGUobmV3IERhdGUoKSlcIlxuICAgICAgICAgIClcbiAgICAgIHRlbXBsYXRlKFxuICAgICAgICB2LWVsc2UtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuXG4gICAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc2VsZWN0LXllYXIoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ3llYXInKVwiXG4gICAgICAgICAgICApIHt7IGRhdGVUb1N0cmluZyhjdXJyZW50VmFsdWUsIHsgeWVhcjogdHJ1ZSB9KSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwWWVhcigxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXItbW9udGhzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIihtb250aCwgaW5kZXgpIGluIG1vbnRoTmFtZXNcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRNb250aENsYXNzKGluZGV4KVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdE1vbnRoKGluZGV4KVwiXG4gICAgICAgICAgICApIHt7IG1vbnRoLnNob3J0IH19XG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICd5ZWFyJ1wiXG4gICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWhlYWRlclxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLXByZXYoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKC0xKVwiXG4gICAgICAgICAgKVxuICAgICAgICAgIHNwYW4ge3sgZGVjYWRlVG9TdHJpbmcoY3VycmVudFZhbHVlKSB9fVxuICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zdGVwLW5leHQoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwRGVjYWRlKDEpXCJcbiAgICAgICAgICApXG4gICAgICAgIC5kaXRvLWNhbGVuZGFyLWJvZHlcbiAgICAgICAgICAuZGl0by1jYWxlbmRhci15ZWFyc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCJ5ZWFyIGluIHllYXJSYW5nZVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cImdldFllYXJDbGFzcyh5ZWFyKVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgKSB7eyB5ZWFyIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZGVzY3JpYmVEYXRlLCBhbHRlckRhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3NlbGVjdCddLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfSxcbiAgICBtb2RlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2RheScgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgY29uc3QgeyB3ZWVrZGF5TmFtZXMsIG1vbnRoTmFtZXMgfSA9IGdldExvY2FsZU5hbWVzKHRoaXMubG9jYWxlKVxuICAgIHJldHVybiB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzLFxuICAgICAgZGF0ZVJhbmdlOiBbXSxcbiAgICAgIHllYXJSYW5nZTogW10sXG4gICAgICBjdXJyZW50VmFsdWU6IChcbiAgICAgICAgdGhpcy5tb2RlbFZhbHVlIHx8XG4gICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB1c2UgY3VycmVudCBkYXRlIGJ1dCBjbGVhciB0aW1lIGZpZWxkczpcbiAgICAgICAgYWx0ZXJEYXRlKG5ldyBEYXRlKCksIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG1pbGxpc2Vjb25kOiAwIH0pXG4gICAgICApLFxuICAgICAgY3VycmVudE1vZGU6IHRoaXMubW9kZVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG8gfHwgbmV3IERhdGUoKVxuICAgICAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBkaXNhYmxlZERhdGU6ICd1cGRhdGVEYXRlUmFuZ2UnLFxuXG4gICAgbW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZ2V0TW9udGhDbGFzcyhtb250aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUnOiAoXG4gICAgICAgICAgdGhpcy5tb2RlbFZhbHVlICYmXG4gICAgICAgICAgbW9udGggPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRNb250aCgpICYmXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogbW9udGggPT09IHRoaXMuY3VycmVudFZhbHVlLmdldE1vbnRoKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0WWVhckNsYXNzKHllYXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJiB5ZWFyID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgICApLFxuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQnOiB5ZWFyID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNldERhdGUob3ZlcnJpZGVzLCB1cGRhdGUgPSBmYWxzZSkge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50VmFsdWUsIG92ZXJyaWRlcylcbiAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB0aGlzLmN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RlcERlY2FkZShzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIDEwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzZXRNb2RlKG1vZGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZGUgPSBtb2RlXG4gICAgfSxcblxuICAgIHN0ZXBNb250aChzdGVwKSB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeyB5ZWFyLCBtb250aCB9ID0gdGhpcy5nZXRZZWFyTW9udGgoXG4gICAgICAgIGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXBcbiAgICAgIClcbiAgICAgIHRoaXMuc2V0RGF0ZSh7XG4gICAgICAgIG1vbnRoLFxuICAgICAgICBkYXk6IE1hdGgubWluKFxuICAgICAgICAgIHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpLFxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldERhdGUoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzdGVwWWVhcihzdGVwKSB7XG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICB5ZWFyOiB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2VsZWN0RGF0ZShkYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoZGVzY3JpYmVEYXRlKGRhdGUpLCB0cnVlKVxuICAgICAgdGhpcy4kZW1pdCgnc2VsZWN0JylcbiAgICB9LFxuXG4gICAgc2VsZWN0TW9udGgobW9udGgpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgIC8vIFNldCBkYXkgdG8gMSB0byBhdm9pZCBzZWxlY3RpbmcgYSBkYXRlIHRoYXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGVcbiAgICAgIC8vIG5ldyBtb250aCwgZS5nLiBGZWIgMzEgLT4gTWFyIDMuXG4gICAgICB0aGlzLnNldERhdGUoeyBtb250aCwgZGF5OiAxIH0sIHRydWUpXG4gICAgfSxcblxuICAgIHNlbGVjdFllYXIoeWVhcikge1xuICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICB0aGlzLnNldERhdGUoeyB5ZWFyIH0sIHRydWUpXG4gICAgfSxcblxuICAgIGdldFllYXJNb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgaWYgKG1vbnRoID4gMTEpIHtcbiAgICAgICAgeWVhcisrXG4gICAgICAgIG1vbnRoID0gMFxuICAgICAgfSBlbHNlIGlmIChtb250aCA8IDApIHtcbiAgICAgICAgeWVhci0tXG4gICAgICAgIG1vbnRoID0gMTFcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHllYXIsIG1vbnRoIH1cbiAgICB9LFxuXG4gICAgZGF0ZVRvU3RyaW5nKFxuICAgICAgZGF0ZSxcbiAgICAgIHsgeWVhciwgbW9udGgsIGRheSB9ID0geyB5ZWFyOiB0cnVlLCBtb250aDogdHJ1ZSwgZGF5OiB0cnVlIH1cbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRlLnRvTG9jYWxlU3RyaW5nKHRoaXMubG9jYWxlLCB7XG4gICAgICAgIHllYXI6IHllYXIgJiYgJ251bWVyaWMnLFxuICAgICAgICBtb250aDogbW9udGggJiYgJ2xvbmcnLFxuICAgICAgICBkYXk6IGRheSAmJiAnbnVtZXJpYydcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGRlY2FkZVRvU3RyaW5nKGRhdGUpIHtcbiAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKGRhdGUuZ2V0RnVsbFllYXIoKSlcbiAgICAgIHJldHVybiBgJHt5ZWFyfSDigJMgJHt5ZWFyICsgOX1gXG4gICAgfSxcblxuICAgIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKClcbiAgICB9LFxuXG4gICAgZ2V0Rmlyc3RZZWFyT2ZEZWNhZGUoeWVhcikge1xuICAgICAgY29uc3QgeWVhclN0ciA9IHllYXIudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuICtgJHt5ZWFyU3RyLnNsaWNlKDAsIC0xKX0wYFxuICAgIH0sXG5cbiAgICBuYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlID0gdGhpcy5jdXJyZW50TW9kZSwgdXBkYXRlID0gZmFsc2UgfSkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNldERhdGUoeyBkYXk6IGN1cnJlbnRWYWx1ZS5nZXREYXRlKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGg6IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgeWVhcjogY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgKyBzdGVwIH0sIHVwZGF0ZSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmN1cnJlbnRNb2RlKSB7XG4gICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0ZShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0TW9kZSgnZGF5JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ21vbnRoJylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlRGF0ZVJhbmdlKCkge1xuICAgICAgdGhpcy5kYXRlUmFuZ2UgPSBbXVxuICAgICAgdGhpcy55ZWFyUmFuZ2UgPSBbXVxuXG4gICAgICBjb25zdCB7IGN1cnJlbnRWYWx1ZSB9ID0gdGhpc1xuICAgICAgY29uc3QgeWVhciA9IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICBjb25zdCBtb250aCA9IGN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICBjb25zdCBzdGFydFllYXIgPSB0aGlzLmdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICAgICAgdGhpcy55ZWFyUmFuZ2UucHVzaChzdGFydFllYXIgKyBpKVxuICAgICAgfVxuICAgICAgY29uc3QgY3Vyck1vbnRoRmlyc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgIGxldCBmaXJzdERheVdlZWsgPSBjdXJyTW9udGhGaXJzdERheS5nZXREYXkoKSArIDFcbiAgICAgIGlmIChmaXJzdERheVdlZWsgPT09IDApIHtcbiAgICAgICAgZmlyc3REYXlXZWVrID0gN1xuICAgICAgfVxuICAgICAgY29uc3QgbnVtRGF5cyA9IHRoaXMuZ2V0RGF5c0luTW9udGgoeWVhciwgbW9udGgpXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID4gMSkge1xuICAgICAgICBjb25zdCBwcmV2TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCAtIDEpXG4gICAgICAgIGNvbnN0IHByZXZNb250aE51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKFxuICAgICAgICAgIHByZXZNb250aC55ZWFyLFxuICAgICAgICAgIHByZXZNb250aC5tb250aFxuICAgICAgICApXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmlyc3REYXlXZWVrOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwcmV2TW9udGhOdW1EYXlzIC0gZmlyc3REYXlXZWVrICsgaSArIDFcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUocHJldk1vbnRoLnllYXIsIHByZXZNb250aC5tb250aCwgZGF5KVxuICAgICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgICAgdGV4dDogZGF5LFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKClcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG51bURheXM7IGkrKykge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGkpXG4gICAgICAgIGNvbnN0IGlzRGF5ID0gZGF0ZSA9PiAoXG4gICAgICAgICAgZGF0ZSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID09PSBpICYmXG4gICAgICAgICAgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB5ZWFyICYmXG4gICAgICAgICAgZGF0ZS5nZXRNb250aCgpID09PSBtb250aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHN0YXRlID0gaXNEYXkodGhpcy5tb2RlbFZhbHVlKVxuICAgICAgICAgID8gJ2FjdGl2ZSdcbiAgICAgICAgICA6IGlzRGF5KG5vdylcbiAgICAgICAgICAgID8gJ3RvZGF5J1xuICAgICAgICAgICAgOiB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKVxuICAgICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgICAgOiBpc0RheShjdXJyZW50VmFsdWUpXG4gICAgICAgICAgICAgICAgPyAnY3VycmVudCdcbiAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgdGV4dDogaSxcbiAgICAgICAgICBkYXRlLFxuICAgICAgICAgIHN0YXRlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRNb250aE5lZWQgPSA0MiAtIHRoaXMuZGF0ZVJhbmdlLmxlbmd0aFxuICAgICAgaWYgKG5leHRNb250aE5lZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHRNb250aCA9IHRoaXMuZ2V0WWVhck1vbnRoKHllYXIsIG1vbnRoICsgMSlcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbmV4dE1vbnRoTmVlZDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5leHRNb250aC55ZWFyLCBuZXh0TW9udGgubW9udGgsIGkpXG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRpc2FibGVkRGF0ZShkYXRlKSA/ICdkaXNhYmxlZCcgOiAnZ3JheSdcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGxvY2FsZU5hbWVzID0ge31cblxuLy8gQ2FsbGluZyBgdG9Mb2NhbGVTdHJpbmcoKWAgdGhpcyBtdWNoIGFwcGVhcnMgdG8gYmUgZXhwZW5zaXZlLCBzbyBjYWNoZSBpdDpcbmZ1bmN0aW9uIGdldExvY2FsZU5hbWVzKGxvY2FsZSkge1xuICBsZXQgbmFtZXMgPSBsb2NhbGVOYW1lc1tsb2NhbGVdXG4gIGlmICghbmFtZXMpIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoMCwgMCwgaSlcbiAgICAgIHdlZWtkYXlOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgd2Vla2RheTogJ3Nob3J0JyB9KVxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3QgbW9udGhOYW1lcyA9IFtdXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIGksIDApXG4gICAgICBtb250aE5hbWVzLnB1c2goe1xuICAgICAgICBsb25nOiBkYXRlLnRvTG9jYWxlU3RyaW5nKGxvY2FsZSwgeyBtb250aDogJ2xvbmcnIH0pLFxuICAgICAgICBzaG9ydDogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXSA9IHtcbiAgICAgIHdlZWtkYXlOYW1lcyxcbiAgICAgIG1vbnRoTmFtZXNcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5hbWVzXG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1jYWxlbmRhciB7XG4gIG1pbi13aWR0aDogMjQwcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG5cbi5kaXRvLWNhbGVuZGFyLXBvcHVwIHtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgei1pbmRleDogJHotaW5kZXgtcG9wdXA7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWJvZHkge1xuICBwYWRkaW5nOiAwIDAuNWVtO1xuXG4gIHNwYW4ge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNyk7XG4gICAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICAgIGxpbmUtaGVpZ2h0OiBjYWxjKCN7JGlucHV0LWhlaWdodH0gLSAycHgpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gICAgYm9yZGVyOiAkYm9yZGVyLXdpZHRoIHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tdG9kYXkge1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCAkY29sb3ItYWN0aXZlO1xuICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICB9XG5cbiAgLmRpdG8tY2FsZW5kYXItaXRlbS1hY3RpdmUge1xuICAgICYsXG4gICAgJjpob3ZlciB7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgY29sb3I6IHdoaXRlO1xuICAgIH1cbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQge1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZGlzYWJsZWQsXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tZ3JheSB7XG4gICAgY29sb3I6ICM5OTk5OTk7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItbW9udGhzLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMge1xuICBzcGFuIHtcbiAgICB3aWR0aDogY2FsYygxMDAlIC8gNCk7XG4gICAgbWFyZ2luOiAwLjVlbSAwO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW4ge1xuICB3aWR0aDogY2FsYygxMDAlIC8gNSk7XG59XG5cbi5kaXRvLWNhbGVuZGFyIGEsXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW4sXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIgc3BhbiB7XG4gIGN1cnNvcjogZGVmYXVsdDtcblxuICBhIHtcbiAgICBwYWRkaW5nOiAwIDAuMmVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLWRhdGVzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci1tb250aHMgc3Bhbjpob3Zlcixcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhcjpub3QoOmhvdmVyKSAuZGl0by1jYWxlbmRhci1pdGVtLWN1cnJlbnQge1xuICBiYWNrZ3JvdW5kOiAkY29sb3ItaGlnaGxpZ2h0O1xufVxuXG4uZGl0by1jYWxlbmRhci13ZWVrZGF5cyBzcGFuIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xufVxuXG4uZGl0by1jYWxlbmRhci1oZWFkZXIsXG4uZGl0by1jYWxlbmRhci1mb290ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICBsaW5lLWhlaWdodDogJGlucHV0LWhlaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogJGJvcmRlci1zdHlsZTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGJvcmRlci1ib3R0b206ICRib3JkZXItc3R5bGU7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgPiBzcGFuIHtcbiAgICBtYXJnaW46IGF1dG87XG4gICAgcGFkZGluZzogMCAwLjVlbTtcbiAgfVxuXG4gIGEge1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuXG4gICAgJjpob3ZlciB7XG4gICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LFxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB3aWR0aDogNSU7XG4gIG1pbi13aWR0aDogMmVtO1xuICBtYXgtd2lkdGg6IDNlbTtcblxuICAmOjphZnRlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgcmlnaHQ6IDA7XG4gICAgZm9udC1zaXplOiAxLjI1ZW07XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLknO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCqyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0IHtcbiAgJjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfigLonO1xuICB9XG5cbiAgJi5kaXRvLWNhbGVuZGFyLXN0ZXAteWVhcjo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6ICfCuyc7XG4gIH1cbn1cblxuLmRpdG8tY2FsZW5kYXItc2VsZWN0LW5vdyB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnTm93JztcbiAgfVxufVxuPC9zdHlsZT5cbiIsImltcG9ydCB7IGFzQXJyYXkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkRXZlbnRzKHRhcmdldHMsIGV2ZW50cykge1xuICB0YXJnZXRzID1cbiAgICB0YXJnZXRzIGluc3RhbmNlb2YgTm9kZUxpc3RcbiAgICAgID8gQXJyYXkuZnJvbSh0YXJnZXRzKVxuICAgICAgOiBhc0FycmF5KHRhcmdldHMpXG5cbiAgZm9yIChjb25zdCBbdHlwZSwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRzKSkge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgZm9yIChjb25zdCBbdHlwZSwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbWJpbmVFdmVudHMoLi4uZXZlbnRzKSB7XG4gIHJldHVybiB7XG4gICAgcmVtb3ZlKCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgICAgZXZlbnQucmVtb3ZlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleShldmVudCkge1xuICByZXR1cm4ge1xuICAgIDM3OiAnbGVmdCcsXG4gICAgMzg6ICd1cCcsXG4gICAgMzk6ICdyaWdodCcsXG4gICAgNDA6ICdkb3duJyxcbiAgICAxMzogJ2VudGVyJ1xuICB9W2V2ZW50Py5rZXlDb2RlXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5TmF2aWdhdGlvbihldmVudCkge1xuICBjb25zdCBrZXkgPSBnZXRLZXkoZXZlbnQpXG4gIHJldHVybiB7XG4gICAgaG9yOiB7IGxlZnQ6IC0xLCByaWdodDogMSB9W2tleV0gfHwgMCxcbiAgICB2ZXI6IHsgdXA6IC0xLCBkb3duOiAxIH1ba2V5XSB8fCAwLFxuICAgIGVudGVyOiBrZXkgPT09ICdlbnRlcidcbiAgfVxufVxuIiwiaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFyZ2V0KGNvbXBvbmVudCkge1xuICBjb25zdCB0YXJnZXQgPSBpc1N0cmluZyhjb21wb25lbnQudGFyZ2V0KVxuICAgID8gY29tcG9uZW50LiRyZWZzW2NvbXBvbmVudC50YXJnZXRdXG4gICAgOiBjb21wb25lbnQudGFyZ2V0XG4gIHJldHVybiB0YXJnZXQ/LiRlbCA/PyB0YXJnZXRcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tdHJpZ2dlci1jb250YWluZXJcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWlmPVwiYWx3YXlzU2hvd1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnY2xpY2snXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBjbGljaz1cIm9uQ2xpY2tcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICAuZGl0by10cmlnZ2VyKFxuICAgIHYtZWxzZS1pZj1cInRyaWdnZXIgPT09ICdob3ZlcidcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnZm9jdXMnIHx8IHRyaWdnZXIgPT09ICdhbHdheXMnXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICApXG4gICAgc2xvdChuYW1lPVwidHJpZ2dlclwiKVxuICBUcmFuc2l0aW9uKDpuYW1lPVwiYGRpdG8tJHt0cmFuc2l0aW9ufWBcIilcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICAgIHYtc2hvdz1cInNob3dQb3B1cFwiXG4gICAgICByZWY9XCJwb3B1cFwiXG4gICAgICA6Y2xhc3M9XCJwb3B1cENsYXNzXCJcbiAgICAgIDpzdHlsZT1cInBvcHVwU3R5bGVcIlxuICAgICAgQG1vdXNlZW50ZXI9XCJvbkhvdmVyKHRydWUpXCJcbiAgICAgIEBtb3VzZWxlYXZlPVwib25Ib3ZlcihmYWxzZSlcIlxuICAgIClcbiAgICAgIHNsb3QoXG4gICAgICAgIHYtaWY9XCJzaG93UG9wdXBcIlxuICAgICAgICBuYW1lPVwicG9wdXBcIlxuICAgICAgKVxuICAgIC5kaXRvLXBvcHVwKFxuICAgICAgdi1lbHNlXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBoeXBoZW5hdGUgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRzLCBjb21iaW5lRXZlbnRzIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTpzaG93J10sXG5cbiAgcHJvcHM6IHtcbiAgICB0cmlnZ2VyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2NsaWNrJyB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbScgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgY3VzdG9tQ2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgekluZGV4OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIGtlZXBJblZpZXc6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9LFxuICAgIGhpZGVXaGVuQ2xpY2tPdXRzaWRlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBhbHdheXNTaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgY292ZXI6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBoaWRlRGVsYXk6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIHBvcHVwUGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudCxcbiAgICAgIGZvY3VzRXZlbnRzOiBudWxsLFxuICAgICAgY2xvc2VFdmVudHM6IG51bGwsXG4gICAgICBwb3B1cEV2ZW50czogbnVsbCxcbiAgICAgIGJsdXJUaW1lcjogbnVsbCxcbiAgICAgIG1vdXNlTGVhdmVUaW1lcjogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIHRyaWdnZXJDbGFzcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLXRyaWdnZXItZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICB9XG4gICAgfSxcblxuICAgIHBvcHVwQ2xhc3MoKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICBbYGRpdG8tcG9wdXAtJHtoeXBoZW5hdGUodGhpcy5wbGFjZW1lbnQpfWBdOiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21DbGFzcykge1xuICAgICAgICBjbGFzc2VzW3RoaXMuY3VzdG9tQ2xhc3NdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgcG9wdXBTdHlsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnpJbmRleCA/IGB6LWluZGV4OiAke3RoaXMuekluZGV4fWAgOiAnJ1xuICAgIH0sXG5cbiAgICB0cmlnZ2VyVGFyZ2V0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93IHx8IHRoaXMuYWx3YXlzU2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gdGhpcy5vblNob3dQb3B1cCh0bykpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1vdW50ZWQoKSB7XG4gICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgIGlmICh0aGlzLnRyaWdnZXIgPT09ICdmb2N1cycpIHtcbiAgICAgIHRoaXMuZm9jdXNFdmVudHMgPSB0aGlzLmFkZEZvY3VzRXZlbnRzKHRoaXMudHJpZ2dlclRhcmdldCA/PyB0cmlnZ2VyKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhpZGVXaGVuQ2xpY2tPdXRzaWRlICYmICF0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIC8vIFVzZSAnbW91c2V1cCcgaW5zdGVhZCBvZiAnY2xpY2snLCBzaW5jZSBjbGljayBhcHBlYXJzIHRvIGhhcHBlbiBhZnRlclxuICAgICAgLy8gdGhlIERPTSBpbnNpZGUgb2YgcG9wdXBzIGNvdWxkIGNoYW5nZSBpbiBhIHdheSBzbyB0aGF0IHRoZSBjaGVja1xuICAgICAgLy8gYHBvcHVwLmNvbnRhaW5zKGV2ZW50LnRhcmdldClgIHdvdWxkIGZhaWw6XG4gICAgICB0aGlzLmNsb3NlRXZlbnRzID0gYWRkRXZlbnRzKHdpbmRvdywge1xuICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgJiZcbiAgICAgICAgICAgICFwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdHJpZ2dlci5jb250YWlucyhldmVudC50YXJnZXQpICYmXG4gICAgICAgICAgICAhdGhpcy50cmlnZ2VyVGFyZ2V0Py5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWx3YXlzU2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5zaG93UG9wdXAgPSB0aGlzLnNob3dcbiAgfSxcblxuICB1bm1vdW50ZWQoKSB7XG4gICAgdGhpcy5mb2N1c0V2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLmNsb3NlRXZlbnRzPy5yZW1vdmUoKVxuICAgIHRoaXMucG9wdXBFdmVudHM/LnJlbW92ZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIHVwZGF0ZVBvc2l0aW9uKCkge1xuICAgICAgY29uc3QgeyB0cmlnZ2VyLCBwb3B1cCB9ID0gdGhpcy4kcmVmc1xuICAgICAgaWYgKHRoaXMuc2hvdyAmJiBwb3B1cC5vZmZzZXRXaWR0aCA9PT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlUG9zaXRpb24oKSwgMClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMudHJpZ2dlclRhcmdldCA/PyB0cmlnZ2VyXG4gICAgICAvLyBBY3R1YWxseSByZXNpemUgdGhlIHBvcHVwJ3MgZmlyc3QgY2hpbGQsIHNvIHRoZXkgY2FuIHNldCBzaXplIGxpbWl0cy5cbiAgICAgIGNvbnN0IGVsID0gdGhpcy50YXJnZXQgPT09ICdwb3B1cCcgPyB0cmlnZ2VyIDogcG9wdXAuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zdHlsZS53aWR0aCA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KS53aWR0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBib3VuZHMgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgIGNvbnN0IHRyaWdnZXJMZWZ0ID0gYm91bmRzLmxlZnQgKyB3aW5kb3cuc2Nyb2xsWFxuICAgICAgY29uc3QgdHJpZ2dlclRvcCA9IGJvdW5kcy50b3AgKyB3aW5kb3cuc2Nyb2xsWVxuICAgICAgY29uc3QgdHJpZ2dlcldpZHRoID0gYm91bmRzLndpZHRoXG4gICAgICBjb25zdCB0cmlnZ2VySGVpZ2h0ID0gYm91bmRzLmhlaWdodFxuICAgICAgY29uc3QgcG9wdXBXaWR0aCA9IHBvcHVwLm9mZnNldFdpZHRoXG4gICAgICBjb25zdCBwb3B1cEhlaWdodCA9IHBvcHVwLm9mZnNldEhlaWdodFxuXG4gICAgICBsZXQgW3BhcnQxLCBwYXJ0Ml0gPSB0aGlzLnBvcHVwUGxhY2VtZW50LnNwbGl0KCctJykgfHwgW11cbiAgICAgIGlmICh0aGlzLmtlZXBJblZpZXcpIHtcbiAgICAgICAgY29uc3Qgd2luV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICBjb25zdCB3aW5IZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgLSB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh0cmlnZ2VyTGVmdCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ3JpZ2h0J1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IC0gdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDEgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydDIgPT09ICd0b3AnKSB7XG4gICAgICAgICAgaWYgKHdpbkhlaWdodCAtIHRyaWdnZXJUb3AgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAnYm90dG9tJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCArIHRyaWdnZXJIZWlnaHQgPCBwb3B1cEhlaWdodCkge1xuICAgICAgICAgICAgcGFydDIgPSAndG9wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXJ0MiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgaWYgKHdpbldpZHRoIC0gdHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgKyB0cmlnZ2VyV2lkdGggPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MiA9ICdsZWZ0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgbGVmdCA9IDBcbiAgICAgIGxldCB0b3AgPSAwXG4gICAgICBzd2l0Y2ggKHBhcnQxKSB7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgdG9wIC09IHBvcHVwSGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZnQgKz0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHBhcnQyKSB7XG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0IC09IHBvcHVwV2lkdGggLSB0cmlnZ2VyV2lkdGhcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodCAtIHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY292ZXIpIHtcbiAgICAgICAgaWYgKHBhcnQxID09PSAndG9wJykge1xuICAgICAgICAgIHRvcCArPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgdG9wIC09IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRhcmdldCAhPT0gdHJpZ2dlcikge1xuICAgICAgICBjb25zdCB0cmlnZ2VyQm91bmRzID0gdHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgICAgICBsZWZ0ICs9IHRyaWdnZXJMZWZ0IC0gdHJpZ2dlckJvdW5kcy5sZWZ0XG4gICAgICAgIHRvcCArPSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckJvdW5kcy50b3BcbiAgICAgIH1cbiAgICAgIHBvcHVwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YFxuICAgICAgcG9wdXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YFxuICAgIH0sXG5cbiAgICBhZGRGb2N1c0V2ZW50cyhwYXJlbnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBwYXJlbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHRleHRhcmVhJylcbiAgICAgIGxldCBpbnB1dFxuXG4gICAgICByZXR1cm4gY29tYmluZUV2ZW50cyhcbiAgICAgICAgYWRkRXZlbnRzKHRhcmdldHMsIHtcbiAgICAgICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5ibHVyVGltZXIpXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZSB0aW1lb3V0IHRvIGFsbG93IGNsaWNrZWQgaW5wdXRzIHRvIGdyYWIgZm9jdXNcbiAgICAgICAgICAgIHRoaXMuYmx1clRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy4kcmVmcy5wb3B1cC5tYXRjaGVzKCc6Zm9jdXMtd2l0aGluJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICBhZGRFdmVudHMocGFyZW50LCB7XG4gICAgICAgICAgbW91c2Vkb3duOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJy5kaXRvLWJ1dHRvbi1jbGVhcicpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdGhpcy4kcmVmcy50cmlnZ2VyXG4gICAgICAgICAgICAgIC8vIE1hcmsgdHJpZ2dlciBpbnB1dCBhcyByZWFkb25seSBzbyBpdCBjYW4ndCBsb29zZSBmb2N1cyB3aGlsZVxuICAgICAgICAgICAgICAvLyB1c2VyIGRvZXMgb3RoZXIgbW91c2UtYWN0aXZpdGllcyBpbiBwb3B1cC5cbiAgICAgICAgICAgICAgaW5wdXQgPSB0cmlnZ2VyLnF1ZXJ5U2VsZWN0b3IoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICAgICAgICAgIGlmIChpbnB1dCAmJiAhaW5wdXQuaGFzQXR0cmlidXRlKCdyZWFkb25seScpKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKCdyZWFkb25seScsICd0cnVlJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBtb3VzZXVwOiBldmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgLy8gR2l2ZSBzb21lIHRpbWUgZm9yIG90aGVyIGV2ZW50cyB0byB1cGRhdGUgaW5wdXQgYmVmb3JlIGl0XG4gICAgICAgICAgICAgIC8vIGJlY29tZXMgZWRpdGFibGUgYW5kIHN0aWxsIGZvY3VzZWQgYWdhaW4uXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlucHV0LnJlbW92ZUF0dHJpYnV0ZSgncmVhZG9ubHknKVxuICAgICAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoJ2lucHV0LCB0ZXh0YXJlYSwgYnV0dG9uJykpIHtcbiAgICAgICAgICAgICAgICAgIGlucHV0LmZvY3VzKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsXG4gICAgICAgICAgICAgIH0sIDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBvblNob3dQb3B1cChzaG93KSB7XG4gICAgICBpZiAoc2hvdykge1xuICAgICAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICAgICAgdGhpcy5wb3B1cEV2ZW50cyA9IHRoaXMuYWRkRm9jdXNFdmVudHModGhpcy4kcmVmcy5wb3B1cClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9wdXBFdmVudHM/LnJlbW92ZSgpXG4gICAgICAgIHRoaXMucG9wdXBFdmVudHMgPSBudWxsXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uQ2xpY2soKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uSG92ZXIoZW50ZXIpIHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5tb3VzZUxlYXZlVGltZXIpXG4gICAgICAgIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmhpZGVEZWxheSkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgfSwgdGhpcy5oaWRlRGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5AaW1wb3J0ICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMvaW5kZXguc2Nzcyc7XG5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uZGl0by10cmlnZ2VyLWRpc2FibGVkIHtcbiAgY29sb3I6ICRjb2xvci1kaXNhYmxlZDtcbiAgYm9yZGVyLWNvbG9yOiAkYm9yZGVyLWNvbG9yO1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgKiB7XG4gICAgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7XG4gICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAmOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLXBvcHVwIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1pbnB1dCg6Y2xhc3M9XCJjbGFzc2VzXCIpXG4gIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICBpbnB1dChcbiAgICA6aWQ9XCJpZFwiXG4gICAgcmVmPVwiaW5wdXRcIlxuICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgIDp0eXBlPVwidHlwZVwiXG4gICAgOm5hbWU9XCJuYW1lXCJcbiAgICA6dGl0bGU9XCJ0aXRsZVwiXG4gICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgIDpyZWFkb25seT1cInJlYWRvbmx5XCJcbiAgICA6YXV0b2ZvY3VzPVwiYXV0b2ZvY3VzXCJcbiAgICA6cGxhY2Vob2xkZXI9XCJwbGFjZWhvbGRlclwiXG4gICAgOmF1dG9jb21wbGV0ZT1cImF1dG9jb21wbGV0ZVwiXG4gICAgOmFyaWEtbGFiZWw9XCJ0aXRsZVwiXG4gICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gIClcbiAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IFtTdHJpbmcsIE51bWJlcl0sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3RleHQnIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0aXRsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgYXV0b2ZvY3VzOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgYXV0b2NvbXBsZXRlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ29mZicgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgaG92ZXJpbmc6IGZhbHNlLFxuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBjbGFzc2VzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuJGF0dHJzLmNsYXNzXG4gICAgfSxcblxuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IGNsYXNzOiBfLCAuLi5hdHRyaWJ1dGVzIH0gPSB0aGlzLiRhdHRyc1xuICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dFxuICAgIH0sXG5cbiAgICBzaXplKCkge1xuICAgICAgLy8gRGV0ZXJtaW5lIHNpemUgYmFzZWQgb24gbWluICYgbWF4IHNldHRpbmdzLCBpZiB0aGV5J3JlIHByb3ZpZGVkLlxuICAgICAgY29uc3QgeyBzaXplLCBtaW4sIG1heCB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIGNvbnN0IGdldExlbmd0aCA9IHZhbHVlID0+ICh2YWx1ZSAhPSBudWxsID8gYCR7dmFsdWV9YC5sZW5ndGggOiAwKVxuICAgICAgcmV0dXJuIHNpemUgfHwgZ2V0TGVuZ3RoKG1pbikgfHwgZ2V0TGVuZ3RoKG1heCkgfHwgdW5kZWZpbmVkXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKGN1cnJlbnRWYWx1ZSkge1xuICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgY3VycmVudFZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1pbnB1dCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcblxuICBAZXh0ZW5kICVpbnB1dDtcblxuICBpbnB1dCB7XG4gICAgLy8gSW5oZXJpdCBhbGwgc3R5bGluZyBmcm9tIC5kaXRvLWlucHV0XG4gICAgYWxsOiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuaS5kaXRvLWljb24oXG4gIDpjbGFzcz1ge1xuICAgIFsnZGl0by1pY29uLS0nICsgbmFtZV06IHRydWUsXG4gICAgJ2RpdG8taWNvbi0tZGlzYWJsZWQnOiBkaXNhYmxlZFxuICB9YFxuKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgcHJvcHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBkZWZhdWx0OiBmYWxzZVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLy8gYHlhcm4gYnVpbGQ6aWNvbnNgIGNvbnZlcnRzIHRoZSBpY29uIFNWRyBmaWxlcyB0byBzaWxlbnQgY2xhc3NlcyBpbnNpZGVcbi8vIGBzcmMvc3R5bGVzL21peGlucy9faWNvbnMuc2Nzc2AsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSB0byBhbGwgb3RoZXIgc2Fzc1xuLy8gY29kZSB0aHJvdWdoIGBfaW1wb3J0c2AuXG4vLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIGFzIG5vcm1hbCBDU1MgY2xhc3NlcywgY29udmVydCB0aGVtIGhlcmU6XG5AZWFjaCAkbmFtZSBpbiAkaWNvbnMge1xuICAuZGl0by1pY29uLS0jeyRuYW1lfSB7XG4gICAgJjo6YWZ0ZXIge1xuICAgICAgQGV4dGVuZCAlaWNvbi0jeyRuYW1lfTtcblxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1pY29uIHtcbiAgQGF0LXJvb3QgLmRpdG8taW5wdXQgJiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAkYm9yZGVyLXdpZHRoO1xuICAgIGxlZnQ6IHVuc2V0O1xuICAgIHdpZHRoOiAyZW07XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGNvbG9yOiAkY29sb3ItZ3JleTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG5cbiAgICAmLS1kaXNhYmxlZCB7XG4gICAgICBjb2xvcjogJGNvbG9yLWxpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIEBhdC1yb290IC5kaXRvLWlucHV0OmZvY3VzLXdpdGhpbiAmIHtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsImV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQsIGVuZCB9KSB7XG4gIGlmIChpbnB1dD8uc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICBpbnB1dC5mb2N1cygpXG4gICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIGVuZClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uKGlucHV0KSB7XG4gIHJldHVybiBpbnB1dCAmJiAnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0XG4gICAgPyB7IHN0YXJ0OiBpbnB1dC5zZWxlY3Rpb25TdGFydCwgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmQgfVxuICAgIDogbnVsbFxufVxuIiwiPCEtLSBEZXJpdmVkIGZyb20gQVRVSSwgYW5kIGZ1cnRoZXIgZXh0ZW5kZWQ6IGh0dHBzOi8vYWxpcWluLmdpdGh1Yi5pby9hdHVpLyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG5UcmlnZ2VyLmRpdG8tZGF0ZS1waWNrZXIoXG4gIHJlZj1cInRyaWdnZXJcIlxuICB2LW1vZGVsOnNob3c9XCJzaG93UG9wdXBcIlxuICB0cmlnZ2VyPVwiZm9jdXNcIlxuICB2LWJpbmQ9XCJ7IHRyYW5zaXRpb24sIHBsYWNlbWVudCwgZGlzYWJsZWQsIHRhcmdldCB9XCJcbilcbiAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgc2xvdChcbiAgICAgIHYtaWY9XCIkc2xvdHMudHJpZ2dlclwiXG4gICAgICBuYW1lPVwidHJpZ2dlclwiXG4gICAgKVxuICAgIElucHV0RmllbGQuZGl0by1kYXRlLXBpY2tlci1pbnB1dChcbiAgICAgIHYtZWxzZVxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRUZXh0XCJcbiAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgIDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIlxuICAgICAgdi1iaW5kPVwieyBwbGFjZWhvbGRlciwgZGlzYWJsZWQsIC4uLiRhdHRycyB9XCJcbiAgICAgIEBmb2N1cz1cIm9uRm9jdXModHJ1ZSlcIlxuICAgICAgQGJsdXI9XCJvbkZvY3VzKGZhbHNlKVwiXG4gICAgICBAa2V5ZG93bj1cIm9uS2V5RG93blwiXG4gICAgICBAbW91c2Vkb3duLnN0b3A9XCJvbk1vdXNlRG93bihmYWxzZSlcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCNiZWZvcmUpXG4gICAgICAgIHNsb3QobmFtZT1cImJlZm9yZVwiKVxuICAgICAgdGVtcGxhdGUoI2FmdGVyKVxuICAgICAgICBJY29uKFxuICAgICAgICAgIG5hbWU9XCJjYWxlbmRhclwiXG4gICAgICAgICAgOmRpc2FibGVkPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIEBtb3VzZWRvd24ucHJldmVudD1cIm9uTW91c2VEb3duKHRydWUpXCJcbiAgICAgICAgKVxuICAgICAgICBzbG90KG5hbWU9XCJhZnRlclwiKVxuICB0ZW1wbGF0ZSgjcG9wdXApXG4gICAgQ2FsZW5kYXIuZGl0by1kYXRlLXBpY2tlci1wb3B1cChcbiAgICAgIHJlZj1cImNhbGVuZGFyXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1iaW5kPVwieyBsb2NhbGUsIGRpc2FibGVkRGF0ZSB9XCJcbiAgICAgIEBzZWxlY3Q9XCJzaG93UG9wdXAgPSBmYWxzZVwiXG4gICAgKVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGZvcm1hdCwgZGVmYXVsdEZvcm1hdHMgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IFRyaWdnZXIgZnJvbSAnLi9UcmlnZ2VyLnZ1ZSdcbmltcG9ydCBDYWxlbmRhciBmcm9tICcuL0NhbGVuZGFyLnZ1ZSdcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgSWNvbiBmcm9tICcuL0ljb24udnVlJ1xuaW1wb3J0IHsgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgQ2FsZW5kYXIsIElucHV0RmllbGQsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIGRhdGU6IGRlZmF1bHRGb3JtYXRzLmRhdGUsXG4gICAgICAgIHRpbWU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWREYXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2VcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBmb2N1c2VkKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRGb2N1c2VkIHx8IHRoaXMuc2hvd1BvcHVwXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIGdldFRhcmdldCh0aGlzKT8ucXVlcnlTZWxlY3RvcignaW5wdXQnKVxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLmxvY2FsZSxcbiAgICAgICAgLi4udGhpcy5mb3JtYXRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQ6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdCh0aGlzLmN1cnJlbnRWYWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKSB8fCAnJ1xuICAgICAgfSxcblxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGUgPSBwYXJzZURhdGUodmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGRhdGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gdG9cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFZhbHVlKHZhbHVlKSB7XG4gICAgICBpZiAoK3ZhbHVlICE9PSArdGhpcy5tb2RlbFZhbHVlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIHZhbHVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gZm9jdXNcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IHZlcjogc3RlcCwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICBpZiAoc3RlcCB8fCBlbnRlcikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBnZXRTZWxlY3Rpb24odGhpcy5pbnB1dCk/LnN0YXJ0XG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCAmJiAhdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB7IGNhbGVuZGFyIH0gPSB0aGlzLiRyZWZzXG4gICAgICAgICAgaWYgKGNhbGVuZGFyKSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWU6IG1vZGUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChwb3NpdGlvbikgfHwge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbW9kZSAmJlxuICAgICAgICAgICAgICBjYWxlbmRhci5uYXZpZ2F0ZSh7IHN0ZXAsIGVudGVyLCBtb2RlLCB1cGRhdGU6IHRydWUgfSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24odGhpcy5pbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by1kYXRlLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1pbi13aWR0aDogOGVtO1xuICB9XG59XG5cbi5kaXRvLWRhdGUtcGlja2VyLXBvcHVwIHtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuPC9zdHlsZT5cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLXRpbWUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBJbnB1dEZpZWxkLmRpdG8tdGltZS1waWNrZXItaW5wdXQoXG4gICAgICB2LWVsc2VcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2xvY2tcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIC5kaXRvLXRpbWUtcGlja2VyLXBvcHVwXG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLWhvdXIocmVmPVwiaG91clwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiAyNFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRIb3VyKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBob3VyID09PSBpbmRleCAtIDEgfVwiXG4gICAgICAgICAgICAgIEBjbGljaz1cImhvdXIgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItbWludXRlKHJlZj1cIm1pbnV0ZVwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRNaW51dGUoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IG1pbnV0ZSA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJtaW51dGUgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbiAgICAgIC5kaXRvLXRpbWUtcGlja2VyLXBhbmVsXG4gICAgICAgIHVsLmRpdG8tdGltZS1waWNrZXItc2Vjb25kKHJlZj1cInNlY29uZFwiKVxuICAgICAgICAgIHRlbXBsYXRlKFxuICAgICAgICAgICAgdi1mb3I9XCJpbmRleCBpbiA2MFwiXG4gICAgICAgICAgKVxuICAgICAgICAgICAgbGkoXG4gICAgICAgICAgICAgIHYtaWY9XCIhZGlzYWJsZWRTZWNvbmQoaW5kZXggLSAxKVwiXG4gICAgICAgICAgICAgIDpjbGFzcz1cInsgc2VsZWN0ZWQ6IHNlY29uZCA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWNvbmQgPSBpbmRleCAtIDFcIlxuICAgICAgICAgICAgKSB7eyBsZWZ0UGFkKGluZGV4IC0gMSkgfX1cbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IGFsdGVyRGF0ZSwgcGFyc2VEYXRlLCBnZXREYXRlUGFydEF0UG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5pbXBvcnQgeyBnZXRUYXJnZXQgfSBmcm9tICcuLi91dGlscy90cmlnZ2VyLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGNvbXBvbmVudHM6IHsgVHJpZ2dlciwgSW5wdXRGaWVsZCwgSWNvbiB9LFxuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICd1cGRhdGU6c2hvdycsICdjaGFuZ2UnLCAnZm9jdXMnLCAnYmx1ciddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBEYXRlLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHJhbnNpdGlvbjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdzbGlkZScgfSxcbiAgICBwbGFjZW1lbnQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYm90dG9tLWxlZnQnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogJ3RyaWdnZXInIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDoge1xuICAgICAgdHlwZTogT2JqZWN0LFxuICAgICAgZGVmYXVsdDogKCkgPT4gKHtcbiAgICAgICAgdGltZTogZGVmYXVsdEZvcm1hdHMudGltZSxcbiAgICAgICAgZGF0ZTogZmFsc2VcbiAgICAgIH0pXG4gICAgfSxcbiAgICBkaXNhYmxlZEhvdXI6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRNaW51dGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgZGlzYWJsZWRTZWNvbmQ6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIHNob3dQb3B1cDogdGhpcy5zaG93LFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGlnbm9yZU5leHRDaGFuZ2U6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcyk/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgIC4uLnRoaXMuZm9ybWF0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudERhdGUoKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSB8fFxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRGF0ZSgpIG9iamVjdCB3aXRoIHRoZSB0aW1lIHNldCB0byAwLCB0byBiZSB1c2VkIHdoZW5cbiAgICAgICAgLy8gZmlyc3Qgc2V0dGluZyBhbnkgb2YgdGhlIHRpbWVzLCBmb3IgbWVhbmluZ2Z1bCBkYXRlcyBpbiBjYXNlIHRoZVxuICAgICAgICAvLyBvYmplY3QgaXMgc2hhcmVkIHdpdGggYSBEYXRlUGlja2VyLCBlLmcuIHRocm91Z2ggRGF0ZVRpbWVQaWNrZXIuXG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKVxuICAgIH0sXG5cbiAgICBob3VyOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldEhvdXJzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChob3VyKSB7XG4gICAgICAgIHRoaXMuc2V0VGltZSh7IGhvdXIgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbWludXRlOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldE1pbnV0ZXMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KG1pbnV0ZSkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBtaW51dGUgfSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2Vjb25kOiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnREYXRlLmdldFNlY29uZHMoKVxuICAgICAgfSxcblxuICAgICAgc2V0KHNlY29uZCkge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBzZWNvbmQgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy5zY3JvbGxBbGwodHJ1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudFRleHQoKSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZm9jdXNlZCAmJlxuICAgICAgICAhdGhpcy5pZ25vcmVOZXh0Q2hhbmdlICYmXG4gICAgICAgIHNlbGVjdGlvbi5zdGFydCA9PT0gc2VsZWN0aW9uLmVuZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKSlcbiAgICAgIH1cbiAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IGZhbHNlXG4gICAgfSxcblxuICAgIHNob3coc2hvdykge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSBzaG93XG4gICAgfSxcblxuICAgIHNob3dQb3B1cCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKGZhbHNlKVxuICAgICAgfVxuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6c2hvdycsIHRvKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1c2VkKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQodG8gPyAnZm9jdXMnIDogJ2JsdXInKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgbGVmdFBhZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuICgnMCcgKyB2YWx1ZSkuc2xpY2UoLTIpXG4gICAgfSxcblxuICAgIHNldFRpbWUob3ZlcnJpZGVzKSB7XG4gICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGFsdGVyRGF0ZSh0aGlzLmN1cnJlbnREYXRlLCB7XG4gICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgbWlsbGlzZWNvbmQ6IDBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNjcm9sbEFsbChzbW9vdGgpIHtcbiAgICAgIGNvbnN0IHNjcm9sbCA9IChyZWYsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJHJlZnNbcmVmXVxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgbGluZUhlaWdodCA9IChcbiAgICAgICAgICAgIHRhcmdldC5zY3JvbGxIZWlnaHQgL1xuICAgICAgICAgICAgLy8gRmlyc3QgYW5kIGxhc3Qgb25lIGFkZCAzIHRpbWVzIHRoZSBtYXJnaW4uXG4gICAgICAgICAgICAodGFyZ2V0LmNoaWxkRWxlbWVudENvdW50ICsgNilcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgdG9wID0gTWF0aC5yb3VuZCh2YWx1ZSAqIGxpbmVIZWlnaHQpXG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyh0YXJnZXQuc2Nyb2xsVG9wIC0gdG9wKVxuICAgICAgICAgIHRhcmdldC5zY3JvbGxUbyh7XG4gICAgICAgICAgICB0b3AsXG4gICAgICAgICAgICBiZWhhdmlvcjogc21vb3RoICYmIGRpc3RhbmNlIDwgMTAwID8gJ3Ntb290aCcgOiAnYXV0bydcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHNjcm9sbCgnaG91cicsIHRoaXMuaG91cilcbiAgICAgICAgc2Nyb2xsKCdtaW51dGUnLCB0aGlzLm1pbnV0ZSlcbiAgICAgICAgc2Nyb2xsKCdzZWNvbmQnLCB0aGlzLnNlY29uZClcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gZm9jdXNcbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCB7IGlucHV0IH0gPSB0aGlzXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oaW5wdXQpXG4gICAgICBjb25zdCB7IHZlcjogc3RlcCwgZW50ZXIgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICBpZiAoc3RlcCB8fCBlbnRlcikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgICAgY29uc3QgZ2V0RGF0ZVBhcnQgPSBwb3NpdGlvbiA9PlxuICAgICAgICAgIGdldERhdGVQYXJ0QXRQb3NpdGlvbih0aGlzLmN1cnJlbnRUZXh0LCBwb3NpdGlvbiwgdGhpcy5mb3JtYXRPcHRpb25zKVxuXG4gICAgICAgIGlmIChzdGVwKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgc3RhcnQgfSA9IGdldERhdGVQYXJ0KHNlbGVjdGlvbi5zdGFydCkgfHwge31cbiAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1tuYW1lXSArIHN0ZXBcbiAgICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLiRyZWZzW25hbWVdLmNoaWxkRWxlbWVudENvdW50XG4gICAgICAgICAgICAgIHRoaXNbbmFtZV0gPVxuICAgICAgICAgICAgICAgIHZhbHVlIDwgMFxuICAgICAgICAgICAgICAgICAgPyB2YWx1ZSArIGNvdW50XG4gICAgICAgICAgICAgICAgICA6IHZhbHVlID49IGNvdW50XG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUgLSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgIHRoaXMuaWdub3JlTmV4dENoYW5nZSA9IHRydWVcbiAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKGlucHV0LCBnZXREYXRlUGFydChzdGFydCkpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbnRlcikge1xuICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmQpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gaW5wdXRcbiAgICAgICAgbGV0IHBvcyA9IHNlbGVjdGlvbi5zdGFydFxuXG4gICAgICAgIGNvbnN0IGlzRGlnaXQgPSBjaGFyID0+ICFpc05hTihwYXJzZUludChjaGFyLCAxMCkpXG5cbiAgICAgICAgaWYgKGV2ZW50LmtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBpZiAoaXNEaWdpdChldmVudC5rZXkpICYmIHBvcyA8IHZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOicgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAxXSkgJiZcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgLSAyXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MrK1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIG5leHQgZGlnaXQgc28gdGhlIGV2ZW50IG92ZXJyaWRlcyBpdCBpbnN0ZWFkIG9mIGluc2VydGluZ1xuICAgICAgICAgICAgLy8gbmV3IGNoYXJzLlxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmIChcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyArIDFdKSB8fFxuICAgICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykubGVuZ3RoXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBsZW5ndGgpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgc2VsZWN0aW9uKVxuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwb3MgPT09IDEgfHxcbiAgICAgICAgICAgIFsnICcsICc6J10uaW5jbHVkZXModmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHBvcyA9PT0gdmFsdWUubGVuZ3RoIHx8XG4gICAgICAgICAgICAgIHZhbHVlW3Bvc10gPT09ICc6J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHBvcy0tXG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gKFxuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKDAsIHBvcykgK1xuICAgICAgICAgICAgICAgICgodmFsdWVbcG9zIC0gMV0gPz8gJycpICsgJzAwJykgK1xuICAgICAgICAgICAgICAgIHZhbHVlLnNsaWNlKHBvcyArIDEpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0OiBwb3MsIGVuZDogcG9zIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3Bvc10pICYmXG4gICAgICAgICAgICAgICFpc0RpZ2l0KCt2YWx1ZVtwb3MgKyAxXSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHJlbW92aW5nIHRoZSBmaXJzdCBvZiB0d28gZGlnaXRzLCByZXBsYWNlIHdpdGggMFxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHBvcykgKyAnMCcgKyB2YWx1ZS5zbGljZShwb3MpXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gIXRoaXMuZGlzYWJsZWQgJiYgKCF0b2dnbGUgfHwgIXRoaXMuc2hvd1BvcHVwKVxuICAgICAgaWYgKHRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1pbi13aWR0aDogNmVtO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbWF4LXdpZHRoOiAxNjBweDtcbiAgbWFyZ2luOiAkcG9wdXAtbWFyZ2luO1xufVxuXG4kdGltZS1waWNrZXItbGluZS1oZWlnaHQ6IDI0cHg7XG5cbi5kaXRvLXRpbWUtcGlja2VyIHtcbiAgLmRpdG8taW5wdXQge1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJveC1zaGFkb3c6ICRzaGFkb3ctd2luZG93O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCAuZGl0by10aW1lLXBpY2tlci1wYW5lbCB7XG4gIGZsb2F0OiBsZWZ0O1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci13aWR0aDogMCAxcHggMDtcbiAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLyAzICsgMXB4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcblxuICAmOmxhc3QtY2hpbGQge1xuICAgIGJvcmRlci1yaWdodDogMDtcbiAgfVxuXG4gIHVsIHtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG1hcmdpbjogMDtcbiAgICAvLyBIaWRlIHNjcm9sbGJhcjpcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBwYWRkaW5nOiAwIDE3cHggMCAwO1xuICAgIGhlaWdodDogNyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcblxuICAgICYgPiBsaSB7XG4gICAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG4gICAgICBsaW5lLWhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgQGluY2x1ZGUgdXNlci1zZWxlY3Qobm9uZSk7XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAzICogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbiAgICAgIH1cblxuICAgICAgJi5zZWxlY3RlZCxcbiAgICAgICYuc2VsZWN0ZWQ6aG92ZXIge1xuICAgICAgICBjb2xvcjogJGNvbG9yLXRleHQtaW52ZXJ0ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQge1xuICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgICYuZGlzYWJsZWQ6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlcihyZWY9XCJwaWNrZXJcIilcbiAgLmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5uZXIoOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiKVxuICAgIElucHV0RmllbGQuZGl0by1kYXRlLXRpbWUtcGlja2VyX19pbnB1dChcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2FsZW5kYXJcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgICBEYXRlUGlja2VyKFxuICAgICAgcmVmPVwiZGF0ZVwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtbW9kZWw6c2hvdz1cInNob3dEYXRlXCJcbiAgICAgIHBsYWNlbWVudD1cImJvdHRvbS1sZWZ0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG4gICAgVGltZVBpY2tlcihcbiAgICAgIHJlZj1cInRpbWVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93VGltZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIlxuICAgICAgOnRhcmdldD1cIiRyZWZzLnBpY2tlclwiXG4gICAgICB2LWJpbmQ9XCJhdHRyaWJ1dGVzXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICAgICAgLy8tIEludGVudGlvbmFsbHkgZW1wdHlcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzLCBhc3NpZ25EZWVwbHkgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gJy4vRGF0ZVBpY2tlci52dWUnXG5pbXBvcnQgVGltZVBpY2tlciBmcm9tICcuL1RpbWVQaWNrZXIudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSB9IGZyb20gJy4uL3V0aWxzL2RhdGUuanMnXG5pbXBvcnQgeyBnZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NlbGVjdGlvbi5qcydcbmltcG9ydCB7IGdldEtleU5hdmlnYXRpb24gfSBmcm9tICcuLi91dGlscy9ldmVudC5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IElucHV0RmllbGQsIERhdGVQaWNrZXIsIFRpbWVQaWNrZXIsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2Vob2xkZXI6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93RGF0ZTogZmFsc2UsXG4gICAgICBzaG93VGltZTogZmFsc2UsXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlLFxuICAgICAgZGF0ZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgdGltZUZvY3VzZWQ6IGZhbHNlLFxuICAgICAgY2xvc2VkTW9kZTogbnVsbFxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGF0dHJpYnV0ZXMoKSB7XG4gICAgICBjb25zdCB7IHRyYW5zaXRpb24sIGRpc2FibGVkLCBsb2NhbGUsIGZvcm1hdE9wdGlvbnM6IGZvcm1hdCB9ID0gdGhpc1xuICAgICAgcmV0dXJuIHsgdHJhbnNpdGlvbiwgZGlzYWJsZWQsIGxvY2FsZSwgZm9ybWF0IH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dEYXRlIHx8IHRoaXMuc2hvd1RpbWVcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy4kcmVmcy5pbnB1dC5pbnB1dFxuICAgIH0sXG5cbiAgICBmb3JtYXRPcHRpb25zKCkge1xuICAgICAgcmV0dXJuIGFzc2lnbkRlZXBseShcbiAgICAgICAge1xuICAgICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgICAgdGltZTogZGVmYXVsdEZvcm1hdHMudGltZSxcbiAgICAgICAgICBkYXRlOiBkZWZhdWx0Rm9ybWF0cy5kYXRlXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICAgIGZvcm1hdDogKHZhbHVlLCB0eXBlLCBvcHRpb25zKSA9PlxuICAgICAgICAgICAgICB0eXBlID09PSAnbGl0ZXJhbCcgJiYgL1xcYmF0XFxiLy50ZXN0KHZhbHVlKVxuICAgICAgICAgICAgICAgID8gJywgJ1xuICAgICAgICAgICAgICAgIDogdGhpcy5mb3JtYXQ/LmRhdGU/LmZvcm1hdD8uKHZhbHVlLCB0eXBlLCBvcHRpb25zKSA/PyB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy5mb3JtYXRcbiAgICAgIClcbiAgICB9LFxuXG4gICAgdGltZUluZGV4KCkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY3VycmVudFRleHRcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSB0ZXh0Lm1hdGNoKC8oW1xcU10rXFxzKikkLyk/LlsxXVxuICAgICAgICBpZiAodGltZSkge1xuICAgICAgICAgIHJldHVybiB0ZXh0Lmxlbmd0aCAtIHRpbWUubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsXG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpXG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIG9uRm9jdXMoZm9jdXMpIHtcbiAgICAgIHRoaXMuaW5wdXRGb2N1c2VkID0gZm9jdXNcbiAgICAgIGlmIChmb2N1cykge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwcygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNob3dEYXRlID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaG93VGltZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgaWYgKHRvZ2dsZSAmJiAodGhpcy5zaG93RGF0ZSB8fCB0aGlzLnNob3dUaW1lKSkge1xuICAgICAgICB0aGlzLnNob3dEYXRlID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaG93VGltZSA9IGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy51cGRhdGVQb3B1cHMoKSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5nZXRNb2RlKGV2ZW50KVxuICAgICAgdGhpcy4kcmVmc1ttb2RlXS5vbktleURvd24oZXZlbnQpXG4gICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB0aGlzLmNsb3NlZE1vZGUgPSBtb2RlXG4gICAgICB9IGVsc2UgaWYgKG1vZGUgIT09IHRoaXMuY2xvc2VkTW9kZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVBvcHVwcyhtb2RlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRNb2RlKGV2ZW50ID0gbnVsbCkge1xuICAgICAgY29uc3QgeyBzdGFydCB9ID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpXG4gICAgICBjb25zdCB7IGhvcjogc3RlcCB9ID0gZ2V0S2V5TmF2aWdhdGlvbihldmVudClcbiAgICAgIHJldHVybiB0aGlzLnRpbWVJbmRleCA9PT0gbnVsbCB8fCBzdGFydCArIHN0ZXAgPCB0aGlzLnRpbWVJbmRleFxuICAgICAgICA/ICdkYXRlJ1xuICAgICAgICA6ICd0aW1lJ1xuICAgIH0sXG5cbiAgICB1cGRhdGVQb3B1cHMobW9kZSA9IHRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICBpZiAobW9kZSkge1xuICAgICAgICB0aGlzLmNsb3NlZE1vZGUgPSBudWxsXG4gICAgICB9XG4gICAgICB0aGlzLnNob3dEYXRlID0gbW9kZSA9PT0gJ2RhdGUnXG4gICAgICB0aGlzLnNob3dUaW1lID0gbW9kZSA9PT0gJ3RpbWUnXG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS10aW1lLXBpY2tlciB7XG4gICZfX2lubmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgJl9faW5wdXQge1xuICAgIGZsZXg6IDE7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICBtaW4td2lkdGg6IDEyZW07XG4gIH1cblxuICAuZGl0by1kYXRlLXBpY2tlcixcbiAgLmRpdG8tdGltZS1waWNrZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgfVxufVxuPC9zdHlsZT5cbiIsIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlL25vLXRlbXBsYXRlLXNoYWRvdyAtLT5cbjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1wYWdpbmF0aW9uXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwoXG4gICAgdi1pZj1cInNob3dUb3RhbFwiXG4gIClcbiAgICB0ZW1wbGF0ZShcbiAgICAgIHYtaWY9XCJ0b3RhbCA+IDBcIlxuICAgICkge3sgZmlyc3QgfX0g4oCTIHt7IGxhc3QgfX0gLyB7eyB0b3RhbCB9fVxuICAuZGl0by1idXR0b25zLmRpdG8tYnV0dG9ucy1yb3VuZChcbiAgICB2LWlmPVwibnVtUGFnZXMgPiAxXCJcbiAgKVxuICAgIGJ1dHRvbi5kaXRvLWJ1dHRvbihcbiAgICAgIHYtZm9yPVwiYnV0dG9uIGluIGJ1dHRvbnNcIlxuICAgICAgOmNsYXNzPVwiZ2V0QnV0dG9uQ2xhc3NlcyhidXR0b24pXCJcbiAgICAgIDpkaXNhYmxlZD1cImJ1dHRvbi5kaXNhYmxlZFwiXG4gICAgICBAY2xpY2s9XCJvbkNsaWNrQnV0dG9uKGJ1dHRvbilcIlxuICAgIClcbiAgICAgIHNwYW4oXG4gICAgICAgIHYtaWY9XCJidXR0b24udGV4dFwiXG4gICAgICApIHt7IGJ1dHRvbi50ZXh0IH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6cGFnZSddLFxuXG4gIHByb3BzOiB7XG4gICAgdG90YWw6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAwIH0sXG4gICAgcGFnZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEgfSxcbiAgICBwYWdlU2l6ZTogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDEwIH0sXG4gICAgc2hvd1RvdGFsOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3dQcmV2OiB0cnVlLFxuICAgICAgc2hvd05leHQ6IHRydWUsXG4gICAgICBjdXJyZW50UGFnZTogdGhpcy5wYWdlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZmlyc3QoKSB7XG4gICAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUgKyAxXG4gICAgfSxcblxuICAgIGxhc3QoKSB7XG4gICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5maXJzdCArIHRoaXMucGFnZVNpemUgLSAxLCB0aGlzLnRvdGFsKVxuICAgIH0sXG5cbiAgICBudW1QYWdlcygpIHtcbiAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy50b3RhbCAvIHRoaXMucGFnZVNpemUpXG4gICAgfSxcblxuICAgIGJ1dHRvbnMoKSB7XG4gICAgICBjb25zdCB7IHNob3dQcmV2LCBzaG93TmV4dCwgY3VycmVudFBhZ2UsIG51bVBhZ2VzIH0gPSB0aGlzXG4gICAgICBjb25zdCBzaG93TGVuZ3RoID0gc2hvd1ByZXYgKyBzaG93TmV4dCArIDFcblxuICAgICAgbGV0IHN0YXJ0ID0gMVxuICAgICAgbGV0IGVuZCA9IDFcbiAgICAgIGlmIChudW1QYWdlcyA8PSBzaG93TGVuZ3RoKSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlIDw9IHNob3dQcmV2ICsgMSkge1xuICAgICAgICBlbmQgPSBzaG93TGVuZ3RoXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQYWdlID49IG51bVBhZ2VzIC0gc2hvd05leHQpIHtcbiAgICAgICAgZW5kID0gbnVtUGFnZXNcbiAgICAgICAgc3RhcnQgPSBudW1QYWdlcyAtIHNob3dMZW5ndGggKyAxXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydCA9IGN1cnJlbnRQYWdlIC0gc2hvd1ByZXZcbiAgICAgICAgZW5kID0gY3VycmVudFBhZ2UgKyBzaG93TmV4dFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25zID0gW11cbiAgICAgIGJ1dHRvbnMucHVzaCh7XG4gICAgICAgIGluZGV4OiBjdXJyZW50UGFnZSAtIDEsXG4gICAgICAgIHR5cGU6ICdwcmV2JyxcbiAgICAgICAgZGlzYWJsZWQ6IGN1cnJlbnRQYWdlIDw9IDFcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhcnQgPj0gMikge1xuICAgICAgICBidXR0b25zLnB1c2goeyBpbmRleDogMSwgdGV4dDogMSB9KVxuICAgICAgfVxuICAgICAgaWYgKHN0YXJ0ID4gMikge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1heCgxLCBjdXJyZW50UGFnZSAtIDEwKSxcbiAgICAgICAgICB0eXBlOiAnZWxsaXBzaXMtcHJldidcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgYWN0aXZlOiBpID09PSBjdXJyZW50UGFnZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICAgIGluZGV4OiBNYXRoLm1pbihudW1QYWdlcywgY3VycmVudFBhZ2UgKyAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLW5leHQnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZW5kIDw9IG51bVBhZ2VzIC0gMSkge1xuICAgICAgICBidXR0b25zLnB1c2goeyBpbmRleDogbnVtUGFnZXMsIHRleHQ6IG51bVBhZ2VzIH0pXG4gICAgICB9XG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgKyAxLFxuICAgICAgICB0eXBlOiAnbmV4dCcsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA+PSBudW1QYWdlc1xuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGJ1dHRvbnNcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBwYWdlKHBhZ2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBwYWdlXG4gICAgfSxcblxuICAgIHBhZ2VTaXplKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFBhZ2UgPiB0aGlzLm51bVBhZ2VzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSB0aGlzLm51bVBhZ2VzXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRQYWdlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gIT09IGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnBhZ2UnLCB0bylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY3JlYXRlZCgpIHtcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5wYWdlXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldEJ1dHRvbkNsYXNzZXMoYnV0dG9uKSB7XG4gICAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgICAnZGl0by1zZWxlY3RlZCc6IGJ1dHRvbi5hY3RpdmVcbiAgICAgIH1cbiAgICAgIGlmIChidXR0b24udHlwZSkge1xuICAgICAgICBjbGFzc2VzW2BkaXRvLWJ1dHRvbi0ke2J1dHRvbi50eXBlfWBdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsYXNzZXNcbiAgICB9LFxuXG4gICAgb25DbGlja0J1dHRvbihidXR0b24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgYnV0dG9uLmluZGV4ICYmXG4gICAgICAgICFidXR0b24uZGlzYWJsZWQgJiZcbiAgICAgICAgYnV0dG9uLmluZGV4ICE9PSB0aGlzLmN1cnJlbnRQYWdlXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IGJ1dHRvbi5pbmRleFxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tcGFnaW5hdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG5cbiAgLmRpdG8tcGFnaW5hdGlvbi10b3RhbCB7XG4gICAgQGluY2x1ZGUgZWxsaXBzaXM7XG5cbiAgICBtYXJnaW46IDAgMC41ZW07XG4gICAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG4gIH1cblxuICAuZGl0by1idXR0b24ge1xuICAgIHRyYW5zaXRpb246XG4gICAgICBhbGwgMC4zcyBlYXNlLFxuICAgICAgY29sb3IgMHMsXG4gICAgICBiYWNrZ3JvdW5kIDBzLFxuICAgICAgYm9yZGVyIDBzO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgcGFkZGluZzogMCAwLjVlbTtcblxuICAgICYtcHJldixcbiAgICAmLW5leHQge1xuICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgQGV4dGVuZCAlaWNvbi1hcnJvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLXByZXY6OmJlZm9yZSB7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2LFxuICAgICYtZWxsaXBzaXMtbmV4dCB7XG4gICAgICAmOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWVsbGlwc2lzO1xuICAgICAgfVxuXG4gICAgICAmOmhvdmVyOjpiZWZvcmUge1xuICAgICAgICBAZXh0ZW5kICVpY29uLWNoZXZyb25zO1xuICAgICAgfVxuXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgYm9yZGVyOiAwO1xuICAgICAgcGFkZGluZzogMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGNvbG9yOiAkY29sb3ItdGV4dDtcblxuICAgICAgJjpmb2N1cyB7XG4gICAgICAgIGNvbG9yOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmOmFjdGl2ZSB7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1lbGxpcHNpcy1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjx0ZW1wbGF0ZSBsYW5nPVwicHVnXCI+XG4uZGl0by1zd2l0Y2goXG4gIDpjbGFzcz1cImNsYXNzZXNcIlxuICA6c3R5bGU9XCJzdHlsZXNcIlxuKVxuICAuZGl0by1zd2l0Y2gtcGFuZVxuICAgIGlucHV0KFxuICAgICAgOmlkPVwiaWRcIlxuICAgICAgcmVmPVwiaW5wdXRcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgICB2LW1vZGVsPVwiY2hlY2tlZFwiXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgOm5hbWU9XCJuYW1lXCJcbiAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICApXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvblxuICAgIHNwYW4uZGl0by1zd2l0Y2gtbGFiZWwoXG4gICAgICB2LWlmPVwibGFiZWxzXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwiY2hlY2tlZFwiXG4gICAgICAgIG5hbWU9XCJjaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLmNoZWNrZWQgfHwgJ29uJyB9fVxuICAgICAgc2xvdChcbiAgICAgICAgdi1lbHNlXG4gICAgICAgIG5hbWU9XCJ1bmNoZWNrZWRcIlxuICAgICAgKSB7eyBsYWJlbHMudW5jaGVja2VkIHx8ICdvZmYnIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdjaGFuZ2UnXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBpZDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbGFiZWxzOiB7IHR5cGU6IFtPYmplY3QsIEJvb2xlYW5dLCBkZWZhdWx0OiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tlZDogdGhpcy5tb2RlbFZhbHVlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHRoaXMuJGF0dHJzLmNsYXNzLFxuICAgICAgICB7XG4gICAgICAgICAgJ2RpdG8tY2hlY2tlZCc6IHRoaXMuY2hlY2tlZCxcbiAgICAgICAgICAnZGl0by1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWRcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0sXG5cbiAgICBzdHlsZXMoKSB7XG4gICAgICBjb25zdCB7IGxhYmVsczogeyBjaGVja2VkLCB1bmNoZWNrZWQgfSA9IHt9IH0gPSB0aGlzXG4gICAgICAvLyBDYWxjdWxhdGUgYC0tc3dpdGNoLXdpZHRoYCBpbiBgcmVtYCwgYmFzZWQgb24gbGFiZWwgbGVuZ3RoLlxuICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoMCwgY2hlY2tlZD8ubGVuZ3RoLCB1bmNoZWNrZWQ/Lmxlbmd0aClcbiAgICAgIHJldHVybiB7XG4gICAgICAgICctLXN3aXRjaC13aWR0aCc6IGxlbmd0aCA/IGAke2xlbmd0aCAqIDEuNX1yZW1gIDogbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZShtb2RlbFZhbHVlKSB7XG4gICAgICB0aGlzLmNoZWNrZWQgPSBtb2RlbFZhbHVlXG4gICAgfSxcblxuICAgIGNoZWNrZWQoY2hlY2tlZCkge1xuICAgICAgaWYgKGNoZWNrZWQgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGNoZWNrZWQpXG4gICAgICAgIHRoaXMuJGVtaXQoJ2NoYW5nZScsIGNoZWNrZWQpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuJHJlZnMuaW5wdXQuZm9jdXMoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tc3dpdGNoIHtcbiAgLy8gVXNlIHdob2xlIG11bHRpcGxlcyBvZiBgcmVtYCBmb3Igc2l6ZXMgYW5kIGBweGAgbWFyZ2lucy9wYWRkaW5nIGFsb25nXG4gIC8vIHdpdGggYGNhbGMoKWAgdG8gZW5kIHVwIHdpdGggZXZlbiBwaXhlbCBzaXplcy5cbiAgLS1zd2l0Y2gtd2lkdGg6IDRlbTtcbiAgLS1zd2l0Y2gtaGVpZ2h0OiAyZW07XG4gIC0tc3dpdGNoLW1hcmdpbjogMnB4O1xuICAtLXN3aXRjaC1wYWRkaW5nOiAzcHg7XG4gIC0tc3dpdGNoLXNwZWVkOiAzMDBtcztcbiAgLS1sYWJlbC1tYXJnaW46IDAuNWVtO1xuICAtLXdpZHRoOiBjYWxjKHZhcigtLXN3aXRjaC13aWR0aCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLWhlaWdodDogY2FsYyh2YXIoLS1zd2l0Y2gtaGVpZ2h0KSAtIDIgKiB2YXIoLS1zd2l0Y2gtbWFyZ2luKSk7XG4gIC0tb2Zmc2V0OiBjYWxjKHZhcigtLXdpZHRoKSAtIHZhcigtLWhlaWdodCkpO1xuXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBoZWlnaHQ6IHZhcigtLXN3aXRjaC1oZWlnaHQpO1xuICAvLyBUbyBtYWtlIGlubGluZSBsYWJlbHMgYXBwZWFyIG9uIGNvbnNpc3RlbnQgYmFzZWxpbmU6XG4gIHZlcnRpY2FsLWFsaWduOiBib3R0b207XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIC5kaXRvLXN3aXRjaC1wYW5lIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IHZhcigtLXdpZHRoKTtcbiAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtcGFuZSxcbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICB0b3A6IDUwJTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIH1cblxuICBpbnB1dCB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJvcmRlci1yYWRpdXM6IDFlbTtcbiAgICBiYWNrZ3JvdW5kOiAkY29sb3ItbGlnaHQ7XG4gICAgdHJhbnNpdGlvbjpcbiAgICAgIGJvcmRlci1jb2xvciAwLjNzLFxuICAgICAgYmFja2dyb3VuZC1jb2xvciAwLjNzO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgLS1zaXplOiBjYWxjKHZhcigtLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLXBhZGRpbmcpKTtcblxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0b3A6IHZhcigtLXN3aXRjaC1wYWRkaW5nKTtcbiAgICBsZWZ0OiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgd2lkdGg6IHZhcigtLXNpemUpO1xuICAgIGhlaWdodDogdmFyKC0tc2l6ZSk7XG4gICAgYm9yZGVyLXJhZGl1czogY2FsYyh2YXIoLS1zaXplKSAvIDIpO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSB2YXIoLS1zd2l0Y2gtc3BlZWQpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24sXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICByaWdodDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGNvbG9yOiAkY29sb3Itd2hpdGU7XG4gIH1cblxuICAmLmRpdG8tY2hlY2tlZCB7XG4gICAgaW5wdXQge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCh2YXIoLS1vZmZzZXQpKTtcbiAgICB9XG5cbiAgICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgICAgbGVmdDogdmFyKC0tbGFiZWwtbWFyZ2luKTtcbiAgICAgIHJpZ2h0OiB1bnNldDtcbiAgICB9XG4gIH1cblxuICAmLmRpdG8tZGlzYWJsZWQge1xuICAgIEBleHRlbmQgJWJ1dHRvbi1kaXNhYmxlZDtcbiAgfVxuXG4gICY6Zm9jdXMtd2l0aGluOm5vdCg6aG92ZXIpIHtcbiAgICAuZGl0by1zd2l0Y2gtYnV0dG9uIHtcbiAgICAgIGJveC1zaGFkb3c6ICRzaGFkb3ctZm9jdXM7XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHNjcmlwdD5cbmltcG9ydCB7IGggYXMgY3JlYXRlRWxlbWVudCwgVHJhbnNpdGlvbiB9IGZyb20gJ3Z1ZSdcblxuLy8gQHZ1ZS9jb21wb25lbnRcbmZ1bmN0aW9uIFRyYW5zaXRpb25IZWlnaHQoeyBlbmFibGVkIH0sIHsgc2xvdHMgfSkge1xuICByZXR1cm4gZW5hYmxlZFxuICAgID8gY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCBwcm9wcywgc2xvdHMpXG4gICAgOiBzbG90cy5kZWZhdWx0KClcbn1cblxuVHJhbnNpdGlvbkhlaWdodC5wcm9wcyA9IHtcbiAgZW5hYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhbnNpdGlvbkhlaWdodFxuXG5jb25zdCBzZXRTdHlsZSA9IChlbGVtZW50LCBzdHlsZSkgPT4gT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSlcblxuY29uc3QgbmV4dFRpbWVvdXQgPSBjYWxsYmFjayA9PiBzZXRUaW1lb3V0KGNhbGxiYWNrLCAwKVxuXG4vLyBGb3JjZSByZXBhaW50IHRvIG1ha2Ugc3VyZSB0aGUgYW5pbWF0aW9uIGlzIHRyaWdnZXJlZCBjb3JyZWN0bHkuXG5jb25zdCBmb3JjZVJlcGFpbnQgPSBlbGVtZW50ID0+IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuaGVpZ2h0XG5cbmNvbnN0IHByb3BzID0ge1xuICBuYW1lOiAnZGl0by1oZWlnaHQnLFxuXG4gIG9uQWZ0ZXJFbnRlcihlbGVtZW50KSB7XG4gICAgLy8gQSB0aW1lb3V0IGJlZm9yZSBzZXR0aW5nIHN0eWxlIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCBhZnRlciBjYWxscyB0b1xuICAgIC8vIGBmb3JjZVJlcGFpbnQoKWAsIGJ1dCB1c2luZyBvbmUgaGVyZSB0b28gcHJlc2VydmVzIGV4ZWN1dGlvbiBzZXF1ZW5jZSBzb1xuICAgIC8vIHRoYXQgdGhlIGNhbGwgZnJvbSBgZW50ZXIoKWAgY2FuIG5ldmVyIG91dHJ1biB0aGUgb25lIGZyb20gYGFmdGVyRW50ZXIoKWBcbiAgICBuZXh0VGltZW91dCgoKSA9PiBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodDogbnVsbCB9KSlcbiAgfSxcblxuICBvbkVudGVyKGVsZW1lbnQpIHtcbiAgICAvLyBGb3Igc29tZSByZWFzb24gd2UncmUgZ2V0dGluZyB0d28gYG9uRW50ZXIoKWAgY2FsbHMgcGVyIHRyYW5zaXRpb24sXG4gICAgLy8gc28gd2UgbmVlZCB0byBpZ25vcmUgdGhlIHNlY29uZCBvbmUuIFRoaXMgbWlnaHQgYmUgbGlua2VkIHRvIHRoZSB1c2VcbiAgICAvLyBvZiBgbmV4dFRpbWVvdXQoKWAsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZSBmb3JcbiAgICAvLyBgaGVpZ2h0YCwgYmFzZWQgb24gYCYtLWxhYmVsLXZlcnRpY2FsYCBjYWxjdWxhdGlvbnMuXG4gICAgY29uc3QgeyB3aWR0aCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfSlcbiAgICBuZXh0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgICAgc2V0U3R5bGUoZWxlbWVudCwge1xuICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICAgIHZpc2liaWxpdHk6IG51bGwsXG4gICAgICAgIGhlaWdodDogMFxuICAgICAgfSlcbiAgICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQgfSkpXG4gICAgfSlcbiAgfSxcblxuICBvbkxlYXZlKGVsZW1lbnQpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVxuICAgIHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pXG4gICAgZm9yY2VSZXBhaW50KGVsZW1lbnQpXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IDAgfSkpXG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbiRkdXJhdGlvbjogMC4xNXM7XG5cbi5kaXRvLWhlaWdodC1lbnRlci1hY3RpdmUsXG4uZGl0by1oZWlnaHQtbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNpdGlvbjogaGVpZ2h0ICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5kaXRvLWhlaWdodC1lbnRlci1hY3RpdmUge1xuICBhbmltYXRpb246IGRpdG8tc2xpZGUtZW50ZXIgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmRpdG8taGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIGFuaW1hdGlvbjogZGl0by1zbGlkZS1sZWF2ZSAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xufVxuXG4uZGl0by1oZWlnaHQtZW50ZXItZnJvbSxcbi5kaXRvLWhlaWdodC1sZWF2ZS10byB7XG4gIGhlaWdodDogMDtcbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBtYXJrUmF3LCB1c2VTbG90cywgQ29tbWVudCB9IGZyb20gJ3Z1ZSdcbmltcG9ydCB7IGlzU3RyaW5nLCBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZOb2RlQ29udGVudCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUgJiYgYXNBcnJheSh2bm9kZSkuc29tZSh2bm9kZSA9PiB2bm9kZS50eXBlICE9PSBDb21tZW50KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzU2xvdENvbnRlbnQoc2xvdCwgcHJvcHMgPSB7fSkge1xuICBzbG90ID0gaXNTdHJpbmcoc2xvdCkgPyB1c2VTbG90cygpW3Nsb3RdIDogc2xvdFxuICByZXR1cm4gaGFzVk5vZGVDb250ZW50KHNsb3Q/Lihwcm9wcykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXcodmFsdWUpIHtcbiAgcmV0dXJuIG1hcmtSYXcoeyB2YWx1ZSB9KVxufVxuIl0sIm5hbWVzIjpbImRlc2NyaWJlRGF0ZSIsImRhdGUiLCJhbHRlckRhdGUiLCJvdmVycmlkZXMiLCJwYXJzZURhdGUiLCJzdHJpbmciLCJsb2NhbGUiLCJ0aW1lIiwidGltZURlZmF1bHQiLCJkYXkiLCJzZXAxIiwibW9udGgiLCJzZXAyIiwieWVhciIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldERhdGVQYXJ0cyIsImdldE1vbnRoSW5kZXgiLCJpc1ZhbGlkVGltZVBhcnQiLCJwYXJ0IiwiZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIiwicG9zaXRpb24iLCJwYXJ0cyIsImdldFBvc2l0aW9uIiwibGVuZ3RoIiwicG9zIiwiaW5kZXgiLCJfYSIsIm9mZnNldCIsImlzVVMiLCJ2YWx1ZXMiLCJzdGFydCIsImVuZCIsInZhbHVlIiwibWF0Y2giLCJzaG9ydEZvcm1hdCIsImxvbmdGb3JtYXQiLCJpIiwid2FybiIsIm1zZyIsImFyZ3MiLCJhY3RpdmVFZmZlY3RTY29wZSIsInJlY29yZEVmZmVjdFNjb3BlIiwiZWZmZWN0Iiwic2NvcGUiLCJhY3RpdmVFZmZlY3QiLCJSZWFjdGl2ZUVmZmVjdCIsImZuIiwidHJpZ2dlciIsInNjaGVkdWxlciIsInBhdXNlVHJhY2tpbmciLCJkZXAiLCJ0cmlnZ2VyQ29tcHV0ZWQiLCJyZXNldFRyYWNraW5nIiwidiIsImxhc3RTaG91bGRUcmFjayIsInNob3VsZFRyYWNrIiwibGFzdEVmZmVjdCIsInByZUNsZWFudXBFZmZlY3QiLCJwb3N0Q2xlYW51cEVmZmVjdCIsImNvbXB1dGVkIiwiZWZmZWN0MiIsImNsZWFudXBEZXBFZmZlY3QiLCJ0cmFja0lkIiwicGF1c2VTY2hlZHVsZVN0YWNrIiwidHJhY2tTdGFjayIsImxhc3QiLCJwYXVzZVNjaGVkdWxpbmciLCJyZXNldFNjaGVkdWxpbmciLCJxdWV1ZUVmZmVjdFNjaGVkdWxlcnMiLCJ0cmFja0VmZmVjdCIsImRlYnVnZ2VyRXZlbnRFeHRyYUluZm8iLCJvbGREZXAiLCJleHRlbmQiLCJ0cmlnZ2VyRWZmZWN0cyIsImRpcnR5TGV2ZWwiLCJsYXN0RGlydHlMZXZlbCIsImNyZWF0ZURlcCIsImNsZWFudXAiLCJ0YXJnZXRNYXAiLCJJVEVSQVRFX0tFWSIsIk1BUF9LRVlfSVRFUkFURV9LRVkiLCJ0cmFjayIsInRhcmdldCIsInR5cGUiLCJrZXkiLCJkZXBzTWFwIiwibmV3VmFsdWUiLCJvbGRWYWx1ZSIsIm9sZFRhcmdldCIsImRlcHMiLCJpc0FycmF5IiwibmV3TGVuZ3RoIiwia2V5MiIsImlzU3ltYm9sIiwiaXNJbnRlZ2VyS2V5IiwiaXNNYXAiLCJpc05vblRyYWNrYWJsZUtleXMiLCJtYWtlTWFwIiwiYnVpbHRJblN5bWJvbHMiLCJhcnJheUluc3RydW1lbnRhdGlvbnMiLCJjcmVhdGVBcnJheUluc3RydW1lbnRhdGlvbnMiLCJpbnN0cnVtZW50YXRpb25zIiwiYXJyIiwidG9SYXciLCJsIiwicmVzIiwiaGFzT3duUHJvcGVydHkiLCJvYmoiLCJCYXNlUmVhY3RpdmVIYW5kbGVyIiwiX2lzUmVhZG9ubHkiLCJfc2hhbGxvdyIsInJlY2VpdmVyIiwiaXNSZWFkb25seTIiLCJzaGFsbG93Iiwic2hhbGxvd1JlYWRvbmx5TWFwIiwicmVhZG9ubHlNYXAiLCJzaGFsbG93UmVhY3RpdmVNYXAiLCJyZWFjdGl2ZU1hcCIsInRhcmdldElzQXJyYXkiLCJoYXNPd24iLCJpc1JlZiIsImlzT2JqZWN0IiwicmVhZG9ubHkiLCJyZWFjdGl2ZSIsIk11dGFibGVSZWFjdGl2ZUhhbmRsZXIiLCJpc09sZFZhbHVlUmVhZG9ubHkiLCJpc1JlYWRvbmx5IiwiaXNTaGFsbG93IiwiaGFkS2V5IiwicmVzdWx0IiwiaGFzQ2hhbmdlZCIsIlJlYWRvbmx5UmVhY3RpdmVIYW5kbGVyIiwibXV0YWJsZUhhbmRsZXJzIiwicmVhZG9ubHlIYW5kbGVycyIsInNoYWxsb3dSZWFkb25seUhhbmRsZXJzIiwidG9TaGFsbG93IiwiZ2V0UHJvdG8iLCJnZXQiLCJyYXdUYXJnZXQiLCJyYXdLZXkiLCJoYXMyIiwid3JhcCIsInRvUmVhZG9ubHkiLCJ0b1JlYWN0aXZlIiwiaGFzIiwic2l6ZSIsImFkZCIsInNldCIsImdldDIiLCJjaGVja0lkZW50aXR5S2V5cyIsImRlbGV0ZUVudHJ5IiwiY2xlYXIiLCJoYWRJdGVtcyIsImNyZWF0ZUZvckVhY2giLCJjYWxsYmFjayIsInRoaXNBcmciLCJvYnNlcnZlZCIsImNyZWF0ZUl0ZXJhYmxlTWV0aG9kIiwibWV0aG9kIiwidGFyZ2V0SXNNYXAiLCJpc1BhaXIiLCJpc0tleU9ubHkiLCJpbm5lckl0ZXJhdG9yIiwiZG9uZSIsImNyZWF0ZVJlYWRvbmx5TWV0aG9kIiwiY2FwaXRhbGl6ZSIsImNyZWF0ZUluc3RydW1lbnRhdGlvbnMiLCJtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczIiLCJzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIiLCJyZWFkb25seUluc3RydW1lbnRhdGlvbnMyIiwic2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIiLCJtdXRhYmxlSW5zdHJ1bWVudGF0aW9ucyIsInJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyIsInNoYWxsb3dJbnN0cnVtZW50YXRpb25zIiwic2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyIsImNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlciIsIm11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMiLCJyZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyIsInNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyIsInRvUmF3VHlwZSIsInRhcmdldFR5cGVNYXAiLCJyYXdUeXBlIiwiZ2V0VGFyZ2V0VHlwZSIsImNyZWF0ZVJlYWN0aXZlT2JqZWN0Iiwic2hhbGxvd1JlYWRvbmx5IiwiYmFzZUhhbmRsZXJzIiwiY29sbGVjdGlvbkhhbmRsZXJzIiwicHJveHlNYXAiLCJleGlzdGluZ1Byb3h5IiwidGFyZ2V0VHlwZSIsInByb3h5IiwiaXNSZWFjdGl2ZSIsImlzUHJveHkiLCJyYXciLCJtYXJrUmF3IiwiZGVmIiwiciIsInVucmVmIiwicmVmMiIsInNoYWxsb3dVbndyYXBIYW5kbGVycyIsInByb3h5UmVmcyIsIm9iamVjdFdpdGhSZWZzIiwic3RhY2siLCJwdXNoV2FybmluZ0NvbnRleHQiLCJ2bm9kZSIsInBvcFdhcm5pbmdDb250ZXh0Iiwid2FybiQxIiwiaW5zdGFuY2UiLCJhcHBXYXJuSGFuZGxlciIsInRyYWNlIiwiZ2V0Q29tcG9uZW50VHJhY2UiLCJjYWxsV2l0aEVycm9ySGFuZGxpbmciLCJmb3JtYXRDb21wb25lbnROYW1lIiwid2FybkFyZ3MiLCJmb3JtYXRUcmFjZSIsImN1cnJlbnRWTm9kZSIsIm5vcm1hbGl6ZWRTdGFjayIsInBhcmVudEluc3RhbmNlIiwibG9ncyIsImVudHJ5IiwiZm9ybWF0VHJhY2VFbnRyeSIsInJlY3Vyc2VDb3VudCIsInBvc3RmaXgiLCJpc1Jvb3QiLCJvcGVuIiwiY2xvc2UiLCJmb3JtYXRQcm9wcyIsInByb3BzIiwia2V5cyIsImZvcm1hdFByb3AiLCJpc1N0cmluZyIsImlzRnVuY3Rpb24iLCJhc3NlcnROdW1iZXIiLCJ2YWwiLCJFcnJvclR5cGVTdHJpbmdzJDEiLCJlcnIiLCJoYW5kbGVFcnJvciIsImNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nIiwiaXNQcm9taXNlIiwidGhyb3dJbkRldiIsImNvbnRleHRWTm9kZSIsImN1ciIsImV4cG9zZWRJbnN0YW5jZSIsImVycm9ySW5mbyIsImVycm9yQ2FwdHVyZWRIb29rcyIsImFwcEVycm9ySGFuZGxlciIsImxvZ0Vycm9yIiwiaW5mbyIsImlzRmx1c2hpbmciLCJpc0ZsdXNoUGVuZGluZyIsInF1ZXVlIiwiZmx1c2hJbmRleCIsInBlbmRpbmdQb3N0Rmx1c2hDYnMiLCJhY3RpdmVQb3N0Rmx1c2hDYnMiLCJwb3N0Rmx1c2hJbmRleCIsInJlc29sdmVkUHJvbWlzZSIsImN1cnJlbnRGbHVzaFByb21pc2UiLCJSRUNVUlNJT05fTElNSVQiLCJuZXh0VGljayIsInAiLCJmaW5kSW5zZXJ0aW9uSW5kZXgiLCJpZCIsIm1pZGRsZSIsIm1pZGRsZUpvYiIsIm1pZGRsZUpvYklkIiwiZ2V0SWQiLCJxdWV1ZUpvYiIsImpvYiIsInF1ZXVlRmx1c2giLCJmbHVzaEpvYnMiLCJxdWV1ZVBvc3RGbHVzaENiIiwiY2IiLCJmbHVzaFBvc3RGbHVzaENicyIsInNlZW4iLCJkZWR1cGVkIiwiYSIsImIiLCJjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMiLCJjb21wYXJhdG9yIiwiZGlmZiIsImNoZWNrIiwiTk9PUCIsImNvdW50IiwiY29tcG9uZW50TmFtZSIsImdldENvbXBvbmVudE5hbWUiLCJobXJEaXJ0eUNvbXBvbmVudHMiLCJnZXRHbG9iYWxUaGlzIiwidHJ5V3JhcCIsImNyZWF0ZVJlY29yZCIsInJlcmVuZGVyIiwicmVsb2FkIiwibWFwIiwiaW5pdGlhbERlZiIsIm5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50IiwiY29tcG9uZW50IiwiaXNDbGFzc0NvbXBvbmVudCIsIm5ld1JlbmRlciIsInJlY29yZCIsIm5ld0NvbXAiLCJ1cGRhdGVDb21wb25lbnREZWYiLCJpbnN0YW5jZXMiLCJvbGRDb21wIiwiYXJnIiwiZSIsImRldnRvb2xzJDEiLCJidWZmZXIiLCJkZXZ0b29sc05vdEluc3RhbGxlZCIsImVtaXQkMSIsImV2ZW50Iiwic2V0RGV2dG9vbHNIb29rJDEiLCJob29rIiwiX2IiLCJuZXdIb29rIiwiZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkIiwiY3JlYXRlRGV2dG9vbHNDb21wb25lbnRIb29rIiwiY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwiY3VycmVudFNjb3BlSWQiLCJzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UiLCJwcmV2Iiwid2l0aEN0eCIsImN0eCIsImlzTm9uU2NvcGVkU2xvdCIsInJlbmRlckZuV2l0aENvbnRleHQiLCJzZXRCbG9ja1RyYWNraW5nIiwicHJldkluc3RhbmNlIiwibWFya0F0dHJzQWNjZXNzZWQiLCJDT01QT05FTlRTIiwicmVzb2x2ZUNvbXBvbmVudCIsIm5hbWUiLCJtYXliZVNlbGZSZWZlcmVuY2UiLCJyZXNvbHZlQXNzZXQiLCJOVUxMX0RZTkFNSUNfQ09NUE9ORU5UIiwid2Fybk1pc3NpbmciLCJjdXJyZW50SW5zdGFuY2UiLCJDb21wb25lbnQiLCJzZWxmTmFtZSIsImNhbWVsaXplIiwicmVzb2x2ZSIsImV4dHJhIiwicmVnaXN0cnkiLCJpc1N1c3BlbnNlIiwicXVldWVFZmZlY3RXaXRoU3VzcGVuc2UiLCJzdXNwZW5zZSIsInNzckNvbnRleHRLZXkiLCJ1c2VTU1JDb250ZXh0IiwiaW5qZWN0IiwiSU5JVElBTF9XQVRDSEVSX1ZBTFVFIiwiZG9XYXRjaCIsInNvdXJjZSIsImltbWVkaWF0ZSIsImRlZXAiLCJmbHVzaCIsIm9uY2UiLCJvblRyYWNrIiwib25UcmlnZ2VyIiwiRU1QVFlfT0JKIiwiX2NiIiwidW53YXRjaCIsIndhcm5JbnZhbGlkU291cmNlIiwicyIsInJlYWN0aXZlR2V0dGVyIiwic291cmNlMiIsInRyYXZlcnNlIiwiZ2V0dGVyIiwiZm9yY2VUcmlnZ2VyIiwiaXNNdWx0aVNvdXJjZSIsImlzU2hhbGxvdyQxIiwib25DbGVhbnVwIiwiYmFzZUdldHRlciIsInNzckNsZWFudXAiLCJpc0luU1NSQ29tcG9uZW50U2V0dXAiLCJxdWV1ZVBvc3RSZW5kZXJFZmZlY3QiLCJpbnN0YW5jZVdhdGNoIiwib3B0aW9ucyIsInB1YmxpY1RoaXMiLCJjcmVhdGVQYXRoR2V0dGVyIiwicmVzZXQiLCJzZXRDdXJyZW50SW5zdGFuY2UiLCJwYXRoIiwic2VnbWVudHMiLCJkZXB0aCIsImN1cnJlbnREZXB0aCIsImlzU2V0IiwiaXNQbGFpbk9iamVjdCIsIndpdGhEaXJlY3RpdmVzIiwiZGlyZWN0aXZlcyIsImdldEV4cG9zZVByb3h5IiwiYmluZGluZ3MiLCJkaXIiLCJtb2RpZmllcnMiLCJsZWF2ZUNiS2V5IiwiZW50ZXJDYktleSIsInVzZVRyYW5zaXRpb25TdGF0ZSIsInN0YXRlIiwib25Nb3VudGVkIiwib25CZWZvcmVVbm1vdW50IiwiVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IiLCJCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyIsIkJhc2VUcmFuc2l0aW9uIiwic2xvdHMiLCJnZXRDdXJyZW50SW5zdGFuY2UiLCJwcmV2VHJhbnNpdGlvbktleSIsImNoaWxkcmVuIiwiZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuIiwiY2hpbGQiLCJoYXNGb3VuZCIsImMiLCJDb21tZW50IiwicmF3UHJvcHMiLCJtb2RlIiwiZW1wdHlQbGFjZWhvbGRlciIsImlubmVyQ2hpbGQiLCJnZXRLZWVwQWxpdmVDaGlsZCIsImVudGVySG9va3MiLCJyZXNvbHZlVHJhbnNpdGlvbkhvb2tzIiwic2V0VHJhbnNpdGlvbkhvb2tzIiwib2xkQ2hpbGQiLCJvbGRJbm5lckNoaWxkIiwidHJhbnNpdGlvbktleUNoYW5nZWQiLCJnZXRUcmFuc2l0aW9uS2V5IiwiaXNTYW1lVk5vZGVUeXBlIiwibGVhdmluZ0hvb2tzIiwiZWwiLCJlYXJseVJlbW92ZSIsImRlbGF5ZWRMZWF2ZSIsImxlYXZpbmdWTm9kZXNDYWNoZSIsImdldExlYXZpbmdOb2Rlc0ZvclR5cGUiLCJsZWF2aW5nVk5vZGVzIiwiYXBwZWFyIiwicGVyc2lzdGVkIiwib25CZWZvcmVFbnRlciIsIm9uRW50ZXIiLCJvbkFmdGVyRW50ZXIiLCJvbkVudGVyQ2FuY2VsbGVkIiwib25CZWZvcmVMZWF2ZSIsIm9uTGVhdmUiLCJvbkFmdGVyTGVhdmUiLCJvbkxlYXZlQ2FuY2VsbGVkIiwib25CZWZvcmVBcHBlYXIiLCJvbkFwcGVhciIsIm9uQWZ0ZXJBcHBlYXIiLCJvbkFwcGVhckNhbmNlbGxlZCIsImNhbGxIb29rIiwiY2FsbEFzeW5jSG9vayIsImhvb2syIiwiaG9va3MiLCJsZWF2aW5nVk5vZGUiLCJhZnRlckhvb2siLCJjYW5jZWxIb29rIiwiY2FsbGVkIiwiY2FuY2VsbGVkIiwicmVtb3ZlIiwidm5vZGUyIiwiaXNLZWVwQWxpdmUiLCJjbG9uZVZOb2RlIiwia2VlcENvbW1lbnQiLCJwYXJlbnRLZXkiLCJyZXQiLCJrZXllZEZyYWdtZW50Q291bnQiLCJGcmFnbWVudCIsImlzQXN5bmNXcmFwcGVyIiwiaW5qZWN0SG9vayIsInByZXBlbmQiLCJ3cmFwcGVkSG9vayIsImFwaU5hbWUiLCJ0b0hhbmRsZXJLZXkiLCJjcmVhdGVIb29rIiwibGlmZWN5Y2xlIiwicmVuZGVyTGlzdCIsInJlbmRlckl0ZW0iLCJjYWNoZSIsImNhY2hlZCIsIml0ZW0iLCJyZW5kZXJTbG90IiwiZmFsbGJhY2siLCJub1Nsb3R0ZWQiLCJjcmVhdGVWTm9kZSIsInNsb3QiLCJvcGVuQmxvY2siLCJ2YWxpZFNsb3RDb250ZW50IiwiZW5zdXJlVmFsaWRWTm9kZSIsInJlbmRlcmVkIiwiY3JlYXRlQmxvY2siLCJ2bm9kZXMiLCJpc1ZOb2RlIiwiZ2V0UHVibGljSW5zdGFuY2UiLCJpc1N0YXRlZnVsQ29tcG9uZW50IiwicHVibGljUHJvcGVydGllc01hcCIsInJlc29sdmVNZXJnZWRPcHRpb25zIiwiaXNSZXNlcnZlZFByZWZpeCIsImhhc1NldHVwQmluZGluZyIsIlB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyIsInNldHVwU3RhdGUiLCJkYXRhIiwiYWNjZXNzQ2FjaGUiLCJhcHBDb250ZXh0Iiwibm9ybWFsaXplZFByb3BzIiwibiIsInB1YmxpY0dldHRlciIsImNzc01vZHVsZSIsImdsb2JhbFByb3BlcnRpZXMiLCJwcm9wc09wdGlvbnMiLCJkZXNjcmlwdG9yIiwidXNlU2xvdHMiLCJnZXRDb250ZXh0IiwiY3JlYXRlU2V0dXBDb250ZXh0Iiwibm9ybWFsaXplUHJvcHNPckVtaXRzIiwibm9ybWFsaXplZCIsImJhc2UiLCJtaXhpbnMiLCJleHRlbmRzT3B0aW9ucyIsImdsb2JhbE1peGlucyIsIm9wdGlvbk1lcmdlU3RyYXRlZ2llcyIsInJlc29sdmVkIiwibSIsIm1lcmdlT3B0aW9ucyIsInRvIiwiZnJvbSIsInN0cmF0cyIsImFzTWl4aW4iLCJzdHJhdCIsImludGVybmFsT3B0aW9uTWVyZ2VTdHJhdHMiLCJtZXJnZURhdGFGbiIsIm1lcmdlRW1pdHNPclByb3BzT3B0aW9ucyIsIm1lcmdlT2JqZWN0T3B0aW9ucyIsIm1lcmdlQXNBcnJheSIsIm1lcmdlV2F0Y2hPcHRpb25zIiwibWVyZ2VJbmplY3QiLCJub3JtYWxpemVJbmplY3QiLCJtZXJnZWQiLCJjdXJyZW50QXBwIiwiZGVmYXVsdFZhbHVlIiwidHJlYXREZWZhdWx0QXNGYWN0b3J5IiwicHJvdmlkZXMiLCJpc1RlbGVwb3J0IiwiVGV4dCIsImJsb2NrU3RhY2siLCJjdXJyZW50QmxvY2siLCJkaXNhYmxlVHJhY2tpbmciLCJjbG9zZUJsb2NrIiwiaXNCbG9ja1RyZWVFbmFibGVkIiwic2V0dXBCbG9jayIsIkVNUFRZX0FSUiIsImNyZWF0ZUVsZW1lbnRCbG9jayIsInBhdGNoRmxhZyIsImR5bmFtaWNQcm9wcyIsInNoYXBlRmxhZyIsImNyZWF0ZUJhc2VWTm9kZSIsIm4xIiwibjIiLCJjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIiwiX2NyZWF0ZVZOb2RlIiwiSW50ZXJuYWxPYmplY3RLZXkiLCJub3JtYWxpemVLZXkiLCJub3JtYWxpemVSZWYiLCJyZWYiLCJyZWZfa2V5IiwicmVmX2ZvciIsImlzQmxvY2tOb2RlIiwibmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24iLCJub3JtYWxpemVDaGlsZHJlbiIsImNsb25lZCIsImd1YXJkUmVhY3RpdmVQcm9wcyIsImtsYXNzIiwic3R5bGUiLCJub3JtYWxpemVDbGFzcyIsIm5vcm1hbGl6ZVN0eWxlIiwiZXh0cmFQcm9wcyIsIm1lcmdlUmVmIiwibWVyZ2VkUHJvcHMiLCJtZXJnZVByb3BzIiwiZGVlcENsb25lVk5vZGUiLCJjcmVhdGVUZXh0Vk5vZGUiLCJ0ZXh0IiwiZmxhZyIsImNyZWF0ZUNvbW1lbnRWTm9kZSIsImFzQmxvY2siLCJzbG90RmxhZyIsInRvTWVyZ2UiLCJpc09uIiwiZXhpc3RpbmciLCJpbmNvbWluZyIsImludGVybmFsU2V0Q3VycmVudEluc3RhbmNlIiwiZyIsInJlZ2lzdGVyR2xvYmFsU2V0dGVyIiwic2V0dGVyIiwic2V0dGVycyIsImdldEF0dHJzUHJveHkiLCJnZXRTbG90c1Byb3h5IiwiZXhwb3NlIiwiZXhwb3NlZCIsImV4cG9zZWRUeXBlIiwiY2xhc3NpZnlSRSIsImNsYXNzaWZ5Iiwic3RyIiwiaW5jbHVkZUluZmVycmVkIiwiaW5mZXJGcm9tUmVnaXN0cnkiLCJoIiwicHJvcHNPckNoaWxkcmVuIiwiaW5pdEN1c3RvbUZvcm1hdHRlciIsInZ1ZVN0eWxlIiwibnVtYmVyU3R5bGUiLCJzdHJpbmdTdHlsZSIsImtleXdvcmRTdHlsZSIsImZvcm1hdHRlciIsImdlblJlZkZsYWciLCJmb3JtYXRWYWx1ZSIsImZvcm1hdEluc3RhbmNlIiwiYmxvY2tzIiwiY3JlYXRlSW5zdGFuY2VCbG9jayIsImV4dHJhY3RLZXlzIiwiaW5qZWN0ZWQiLCJhc1JhdyIsIkNvbXAiLCJleHRyYWN0ZWQiLCJpc0tleU9mVHlwZSIsIm9wdHMiLCJUUkFOU0lUSU9OIiwiQU5JTUFUSU9OIiwidnRjS2V5IiwiVHJhbnNpdGlvbiIsInJlc29sdmVUcmFuc2l0aW9uUHJvcHMiLCJET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiaDIiLCJoYXNFeHBsaWNpdENhbGxiYWNrIiwiYmFzZVByb3BzIiwiZHVyYXRpb24iLCJlbnRlckZyb21DbGFzcyIsImVudGVyQWN0aXZlQ2xhc3MiLCJlbnRlclRvQ2xhc3MiLCJhcHBlYXJGcm9tQ2xhc3MiLCJhcHBlYXJBY3RpdmVDbGFzcyIsImFwcGVhclRvQ2xhc3MiLCJsZWF2ZUZyb21DbGFzcyIsImxlYXZlQWN0aXZlQ2xhc3MiLCJsZWF2ZVRvQ2xhc3MiLCJkdXJhdGlvbnMiLCJub3JtYWxpemVEdXJhdGlvbiIsImVudGVyRHVyYXRpb24iLCJsZWF2ZUR1cmF0aW9uIiwiZmluaXNoRW50ZXIiLCJpc0FwcGVhciIsInJlbW92ZVRyYW5zaXRpb25DbGFzcyIsImZpbmlzaExlYXZlIiwibWFrZUVudGVySG9vayIsIm5leHRGcmFtZSIsImFkZFRyYW5zaXRpb25DbGFzcyIsIndoZW5UcmFuc2l0aW9uRW5kcyIsImZvcmNlUmVmbG93IiwiTnVtYmVyT2YiLCJ0b051bWJlciIsImNscyIsIl92dGMiLCJlbmRJZCIsImV4cGVjdGVkVHlwZSIsImV4cGxpY2l0VGltZW91dCIsInJlc29sdmVJZk5vdFN0YWxlIiwidGltZW91dCIsInByb3BDb3VudCIsImdldFRyYW5zaXRpb25JbmZvIiwiZW5kRXZlbnQiLCJlbmRlZCIsIm9uRW5kIiwic3R5bGVzIiwiZ2V0U3R5bGVQcm9wZXJ0aWVzIiwidHJhbnNpdGlvbkRlbGF5cyIsInRyYW5zaXRpb25EdXJhdGlvbnMiLCJ0cmFuc2l0aW9uVGltZW91dCIsImdldFRpbWVvdXQiLCJhbmltYXRpb25EZWxheXMiLCJhbmltYXRpb25EdXJhdGlvbnMiLCJhbmltYXRpb25UaW1lb3V0IiwiaGFzVHJhbnNmb3JtIiwiZGVsYXlzIiwiZCIsInRvTXMiLCJ2U2hvd09sZEtleSIsInZTaG93IiwidHJhbnNpdGlvbiIsInNldERpc3BsYXkiLCJhZGRFdmVudExpc3RlbmVyIiwiaGFuZGxlciIsImdldE1vZGVsQXNzaWduZXIiLCJpbnZva2VBcnJheUZucyIsIm9uQ29tcG9zaXRpb25TdGFydCIsIm9uQ29tcG9zaXRpb25FbmQiLCJhc3NpZ25LZXkiLCJ2TW9kZWxUZXh0IiwibGF6eSIsInRyaW0iLCJudW1iZXIiLCJjYXN0VG9OdW1iZXIiLCJkb21WYWx1ZSIsImxvb3NlVG9OdW1iZXIiLCJlbFZhbHVlIiwidk1vZGVsQ2hlY2tib3giLCJfIiwibW9kZWxWYWx1ZSIsImVsZW1lbnRWYWx1ZSIsImdldFZhbHVlIiwiY2hlY2tlZCIsImFzc2lnbiIsImxvb3NlSW5kZXhPZiIsImZvdW5kIiwiZmlsdGVyZWQiLCJnZXRDaGVja2JveFZhbHVlIiwic2V0Q2hlY2tlZCIsImJpbmRpbmciLCJsb29zZUVxdWFsIiwidk1vZGVsUmFkaW8iLCJ2TW9kZWxTZWxlY3QiLCJpc1NldE1vZGVsIiwic2VsZWN0ZWRWYWwiLCJvIiwic2V0U2VsZWN0ZWQiLCJfYmluZGluZyIsImlzTXVsdGlwbGUiLCJvcHRpb24iLCJvcHRpb25WYWx1ZSIsInZNb2RlbER5bmFtaWMiLCJjYWxsTW9kZWxIb29rIiwicHJldlZOb2RlIiwicmVzb2x2ZUR5bmFtaWNNb2RlbCIsInRhZ05hbWUiLCJzeXN0ZW1Nb2RpZmllcnMiLCJtb2RpZmllckd1YXJkcyIsIndpdGhNb2RpZmllcnMiLCJjYWNoZUtleSIsImd1YXJkIiwiaW5pdERldiIsIl9zZmNfbWFpbiIsIndlZWtkYXlOYW1lcyIsIm1vbnRoTmFtZXMiLCJnZXRMb2NhbGVOYW1lcyIsInVwZGF0ZSIsInN0ZXAiLCJjdXJyZW50VmFsdWUiLCJlbnRlciIsInN0YXJ0WWVhciIsImZpcnN0RGF5V2VlayIsIm51bURheXMiLCJwcmV2TW9udGgiLCJwcmV2TW9udGhOdW1EYXlzIiwibm93IiwiaXNEYXkiLCJuZXh0TW9udGhOZWVkIiwibmV4dE1vbnRoIiwibG9jYWxlTmFtZXMiLCJuYW1lcyIsImFkZEV2ZW50cyIsInRhcmdldHMiLCJldmVudHMiLCJhc0FycmF5IiwiY29tYmluZUV2ZW50cyIsImdldEtleSIsImdldEtleU5hdmlnYXRpb24iLCJnZXRUYXJnZXQiLCJjbGFzc2VzIiwiaHlwaGVuYXRlIiwic2hvdyIsInBvcHVwIiwiX2MiLCJib3VuZHMiLCJ0cmlnZ2VyTGVmdCIsInRyaWdnZXJUb3AiLCJ0cmlnZ2VyV2lkdGgiLCJ0cmlnZ2VySGVpZ2h0IiwicG9wdXBXaWR0aCIsInBvcHVwSGVpZ2h0IiwicGFydDEiLCJwYXJ0MiIsIndpbldpZHRoIiwid2luSGVpZ2h0IiwibGVmdCIsInRvcCIsInRyaWdnZXJCb3VuZHMiLCJwYXJlbnQiLCJpbnB1dCIsImF0dHJpYnV0ZXMiLCJtaW4iLCJtYXgiLCJnZXRMZW5ndGgiLCJfb3BlbkJsb2NrIiwiX2NyZWF0ZUVsZW1lbnRCbG9jayIsInNldFNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsIlRyaWdnZXIiLCJDYWxlbmRhciIsIklucHV0RmllbGQiLCJJY29uIiwiZGVmYXVsdEZvcm1hdHMiLCJmb3JtYXQiLCJmb2N1cyIsImdldERhdGVQYXJ0IiwiY2FsZW5kYXIiLCJ0b2dnbGUiLCJzZWxlY3Rpb24iLCJzbW9vdGgiLCJzY3JvbGwiLCJsaW5lSGVpZ2h0IiwiZGlzdGFuY2UiLCJpc0RpZ2l0IiwiY2hhciIsIkRhdGVQaWNrZXIiLCJUaW1lUGlja2VyIiwiZGlzYWJsZWQiLCJhc3NpZ25EZWVwbHkiLCJzaG93UHJldiIsInNob3dOZXh0IiwiY3VycmVudFBhZ2UiLCJudW1QYWdlcyIsInNob3dMZW5ndGgiLCJidXR0b25zIiwicGFnZSIsImJ1dHRvbiIsInVuY2hlY2tlZCIsIlRyYW5zaXRpb25IZWlnaHQiLCJlbmFibGVkIiwiY3JlYXRlRWxlbWVudCIsInNldFN0eWxlIiwiZWxlbWVudCIsIm5leHRUaW1lb3V0IiwiZm9yY2VSZXBhaW50Iiwid2lkdGgiLCJoZWlnaHQiLCJoYXNWTm9kZUNvbnRlbnQiLCJoYXNTbG90Q29udGVudCJdLCJtYXBwaW5ncyI6IndWQUFPLFNBQVNBLEdBQWFDLEVBQU0sQ0FDakMsTUFBTyxDQUNMLE1BQU1BLEdBQUEsWUFBQUEsRUFBTSxnQkFBaUIsRUFDN0IsT0FBT0EsR0FBQSxZQUFBQSxFQUFNLGFBQWMsRUFDM0IsS0FBS0EsR0FBQSxZQUFBQSxFQUFNLFlBQWEsRUFDeEIsTUFBTUEsR0FBQSxZQUFBQSxFQUFNLGFBQWMsRUFDMUIsUUFBUUEsR0FBQSxZQUFBQSxFQUFNLGVBQWdCLEVBQzlCLFFBQVFBLEdBQUEsWUFBQUEsRUFBTSxlQUFnQixFQUM5QixhQUFhQSxHQUFBLFlBQUFBLEVBQU0sb0JBQXFCLENBQ3pDLENBQ0gsQ0FFTyxTQUFTQyxHQUFVRCxFQUFNRSxFQUFZLEdBQUksQ0FDOUMsT0FBTyxJQUFJLEtBQUssR0FBRyxPQUFPLE9BQU8sQ0FBRSxHQUFHSCxHQUFhQyxDQUFJLEVBQUcsR0FBR0UsQ0FBUyxDQUFFLENBQUMsQ0FDM0UsQ0FFTyxTQUFTQyxHQUFVQyxFQUFRLENBQ2hDLE9BQUFDLEVBQVMsUUFDVCxLQUFBTCxFQUFPLEdBQ1AsS0FBQU0sRUFBTyxFQUNULEVBQUksR0FBSSxDQUNOLE1BQU1DLEVBQWNELEVBQU8sS0FBTyxFQUNsQyxHQUFJLENBQ0ZFLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0osQ0FDSUMsRUFBT04sRUFDWCxDQUNJTyxFQUFTUCxFQUNiLENBQ0lRLEVBQVNSLEVBQ2IsQ0FDSVMsRUFBY1QsQ0FDZixFQUFHVSxHQUFhYixFQUFRLENBQUUsS0FBQUosRUFBTSxLQUFBTSxDQUFJLENBQUUsRUFDdkMsR0FBSU0sR0FBUUEsRUFBSyxRQUFVLEVBQUcsQ0FDeEJQLElBQVcsU0FBV0ksSUFBUyxLQUFPRSxJQUFTLE1BRWhELENBQUNILEVBQUtFLENBQUssRUFBSSxDQUFDQSxFQUFPRixDQUFHLEdBRTdCRSxFQUFRUSxHQUFjUixFQUFPLENBQUUsT0FBQUwsQ0FBTSxDQUFFLEVBQ3ZDLE1BQU1jLEVBQWtCQyxHQUFRQSxJQUFTLE1BQVFBLEVBQUssU0FBVyxFQUNqRSxHQUNFVixJQUFVLE9BQ1IsQ0FBQ0osR0FDQ2EsRUFBZ0JOLENBQUksR0FDcEJNLEVBQWdCTCxDQUFNLEdBQ3RCSyxFQUFnQkosQ0FBTSxHQUkxQixPQUFPLElBQUksS0FDVCxDQUFDSCxFQUNELENBQUNGLEVBQ0QsQ0FBQ0YsRUFDRCxDQUFDSyxFQUNELENBQUNDLEVBQ0QsQ0FBQ0MsRUFDRCxDQUFDQyxDQUNGLENBRUosQ0FDRCxPQUFPLElBQ1QsQ0FFTyxTQUFTSyxHQUFzQmpCLEVBQVFrQixFQUFVLENBQ3RELE9BQUFqQixFQUFTLFFBQ1QsS0FBQUwsRUFBTyxHQUNQLEtBQUFNLEVBQU8sRUFDVCxFQUFJLEdBQUksQ0FDTixNQUFNaUIsRUFBUU4sR0FBYWIsRUFBUSxDQUFFLEtBQUFKLEVBQU0sS0FBQU0sQ0FBSSxDQUFFLEVBRTNDa0IsRUFBYyxDQUFDRixFQUFVRyxFQUFTRixFQUFNLFNBQVcsT0FDdkQsSUFBSUcsRUFBTSxFQUNOQyxFQUFRLEVBRVosTUFBUUwsSUFBYSxNQUFRSSxHQUFPSixJQUFhSyxFQUFRRixHQUN2REMsS0FBT0UsRUFBQUwsRUFBTUksR0FBTyxJQUFiLFlBQUFDLEVBQWdCLFNBQVUsRUFFbkMsTUFBTyxDQUFFLFNBQVVGLEVBQUssTUFBQUMsQ0FBTyxDQUNoQyxFQUdLRSxFQUFVN0IsRUFBdUMsRUFBaEN3QixFQUFZLEtBQU0sQ0FBQyxFQUFFLFNBQzVDRixHQUFZTyxFQUVaLEdBQUksQ0FBRSxNQUFBRixDQUFLLEVBQUtILEVBQVlGLENBQVEsRUFFcEMsTUFBTVEsRUFBT3pCLElBQVcsUUFDbEIwQixFQUFTLENBQ2JELEVBQU8sUUFBVSxNQUNqQixLQUNBQSxFQUFPLE1BQVEsUUFDZixLQUNBLE9BQ0EsS0FDQSxPQUNBLEtBQ0EsU0FDQSxLQUNBLFNBQ0EsS0FDQSxhQUNELEVBQ0QsS0FBT0gsS0FDTCxHQUFJSSxFQUFPSixDQUFLLEVBQUcsQ0FDakIsTUFBTUssRUFBUVIsRUFBWSxLQUFNRyxDQUFLLEVBQUUsU0FBV0UsRUFDNUNJLEVBQU1ELEVBQVFULEVBQU1JLENBQUssRUFBRSxPQUNqQyxNQUFPLENBQUUsS0FBTUksRUFBT0osQ0FBSyxFQUFHLE1BQUFLLEVBQU8sSUFBQUMsQ0FBSyxDQUMzQyxDQUVILE9BQU8sSUFDVCxDQUVBLFNBQVNoQixHQUFhYixFQUFRLENBQUUsS0FBQUosRUFBTyxHQUFNLEtBQUFNLEVBQU8sRUFBTSxFQUFHLEdBQUksQ0FDL0QsTUFBTWlCLEdBQVFuQixHQUFBLFlBQUFBLEVBQVEsTUFBTSxpQkFBa0IsQ0FBRSxFQUNoRCxPQUFLSixHQUVIdUIsRUFBTSxRQUFRLElBQUssSUFBSyxJQUFLLElBQUssT0FBUSxHQUFHLEVBRTNDLENBQUNqQixHQUFRaUIsRUFBTSxPQUFTLElBQzFCQSxFQUFNLE9BQVMsR0FFVkEsQ0FDVCxDQUVBLFNBQVNMLEdBQWNSLEVBQU8sQ0FBRSxPQUFBTCxFQUFTLE9BQU8sRUFBSyxDQUFBLEVBQUksQ0FDdkQsTUFBTTZCLEVBQVEsQ0FBQ3hCLEVBQ2YsR0FBSSxDQUFDLE1BQU13QixDQUFLLEVBQ2QsT0FBT0EsRUFBUSxFQUVqQixNQUFNQyxFQUFRekIsRUFBTSxLQUFJLEVBQUcsWUFBYSxFQUN4QyxHQUFJeUIsRUFBTSxPQUFTLEVBQUcsT0FBTyxLQUM3QixNQUFNQyxFQUFjLElBQUksS0FBSyxlQUFlL0IsRUFBUSxDQUFFLE1BQU8sUUFBUyxFQUNoRWdDLEVBQWEsSUFBSSxLQUFLLGVBQWVoQyxFQUFRLENBQUUsTUFBTyxPQUFRLEVBQ3BFLFFBQVNpQyxFQUFJLEVBQUdBLEVBQUksR0FBSUEsSUFBSyxDQUMzQixNQUFNdEMsRUFBTyxJQUFJLEtBQUssSUFBTXNDLEVBQUcsQ0FBQyxFQUNoQyxHQUNFRixFQUFZLE9BQU9wQyxDQUFJLEVBQUUsWUFBYSxFQUFDLFdBQVdtQyxDQUFLLEdBQ3ZERSxFQUFXLE9BQU9yQyxDQUFJLEVBQUUsWUFBYSxFQUFDLFdBQVdtQyxDQUFLLEVBRXRELE9BQU9HLENBRVYsQ0FDRCxPQUFPLElBQ1QsQ0NuSkE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQU9BLFNBQVNDLEdBQUtDLEtBQVFDLEVBQU0sQ0FDMUIsUUFBUSxLQUFLLGNBQWNELENBQUcsR0FBSSxHQUFHQyxDQUFJLENBQzNDLENBRUEsSUFBSUMsR0FrRkosU0FBU0MsR0FBa0JDLEVBQVFDLEVBQVFILEdBQW1CLENBQ3hERyxHQUFTQSxFQUFNLFFBQ2pCQSxFQUFNLFFBQVEsS0FBS0QsQ0FBTSxDQUU3QixDQWNBLElBQUlFLEdBQ0osTUFBTUMsRUFBZSxDQUNuQixZQUFZQyxFQUFJQyxFQUFTQyxFQUFXTCxFQUFPLENBQ3pDLEtBQUssR0FBS0csRUFDVixLQUFLLFFBQVVDLEVBQ2YsS0FBSyxVQUFZQyxFQUNqQixLQUFLLE9BQVMsR0FDZCxLQUFLLEtBQU8sR0FJWixLQUFLLFlBQWMsRUFJbkIsS0FBSyxTQUFXLEVBSWhCLEtBQUssVUFBWSxFQUlqQixLQUFLLFdBQWEsRUFJbEIsS0FBSyxZQUFjLEVBQ25CUCxHQUFrQixLQUFNRSxDQUFLLENBQzlCLENBQ0QsSUFBSSxPQUFRLENBQ1YsR0FBSSxLQUFLLGNBQWdCLEVBQUcsQ0FDMUIsS0FBSyxZQUFjLEVBQ25CLEtBQUssYUFDTE0sS0FDQSxVQUFXQyxLQUFPLEtBQUssS0FDckIsR0FBSUEsRUFBSSxXQUNOQyxHQUFnQkQsRUFBSSxRQUFRLEVBQ3hCLEtBQUssYUFBZSxHQUN0QixNQUlORSxLQUNBLEtBQUssWUFDTixDQUNELE9BQU8sS0FBSyxhQUFlLENBQzVCLENBQ0QsSUFBSSxNQUFNQyxFQUFHLENBQ1gsS0FBSyxZQUFjQSxFQUFJLEVBQUksQ0FDNUIsQ0FDRCxLQUFNLENBRUosR0FEQSxLQUFLLFlBQWMsRUFDZixDQUFDLEtBQUssT0FDUixPQUFPLEtBQUssS0FFZCxJQUFJQyxFQUFrQkMsR0FDbEJDLEVBQWFaLEdBQ2pCLEdBQUksQ0FDRixPQUFBVyxHQUFjLEdBQ2RYLEdBQWUsS0FDZixLQUFLLFlBQ0xhLEdBQWlCLElBQUksRUFDZCxLQUFLLElBQ2xCLFFBQWMsQ0FDUkMsR0FBa0IsSUFBSSxFQUN0QixLQUFLLFlBQ0xkLEdBQWVZLEVBQ2ZELEdBQWNELENBQ2YsQ0FDRixDQUNELE1BQU8sQ0FDTCxJQUFJNUIsRUFDQSxLQUFLLFNBQ1ArQixHQUFpQixJQUFJLEVBQ3JCQyxHQUFrQixJQUFJLEdBQ3JCaEMsRUFBSyxLQUFLLFNBQVcsTUFBZ0JBLEVBQUcsS0FBSyxJQUFJLEVBQ2xELEtBQUssT0FBUyxHQUVqQixDQUNILENBQ0EsU0FBU3lCLEdBQWdCUSxFQUFVLENBQ2pDLE9BQU9BLEVBQVMsS0FDbEIsQ0FDQSxTQUFTRixHQUFpQkcsRUFBUyxDQUNqQ0EsRUFBUSxXQUNSQSxFQUFRLFlBQWMsQ0FDeEIsQ0FDQSxTQUFTRixHQUFrQkUsRUFBUyxDQUNsQyxHQUFJQSxFQUFRLE1BQVFBLEVBQVEsS0FBSyxPQUFTQSxFQUFRLFlBQWEsQ0FDN0QsUUFBU3hCLEVBQUl3QixFQUFRLFlBQWF4QixFQUFJd0IsRUFBUSxLQUFLLE9BQVF4QixJQUN6RHlCLEdBQWlCRCxFQUFRLEtBQUt4QixDQUFDLEVBQUd3QixDQUFPLEVBRTNDQSxFQUFRLEtBQUssT0FBU0EsRUFBUSxXQUMvQixDQUNILENBQ0EsU0FBU0MsR0FBaUJYLEVBQUtVLEVBQVMsQ0FDdEMsTUFBTUUsRUFBVVosRUFBSSxJQUFJVSxDQUFPLEVBQzNCRSxJQUFZLFFBQVVGLEVBQVEsV0FBYUUsSUFDN0NaLEVBQUksT0FBT1UsQ0FBTyxFQUNkVixFQUFJLE9BQVMsR0FDZkEsRUFBSSxRQUFPLEVBR2pCLENBeUJBLElBQUlLLEdBQWMsR0FDZFEsR0FBcUIsRUFDekIsTUFBTUMsR0FBYSxDQUFBLEVBQ25CLFNBQVNmLElBQWdCLENBQ3ZCZSxHQUFXLEtBQUtULEVBQVcsRUFDM0JBLEdBQWMsRUFDaEIsQ0FLQSxTQUFTSCxJQUFnQixDQUN2QixNQUFNYSxFQUFPRCxHQUFXLE1BQ3hCVCxHQUFjVSxJQUFTLE9BQVMsR0FBT0EsQ0FDekMsQ0FDQSxTQUFTQyxJQUFrQixDQUN6QkgsSUFDRixDQUNBLFNBQVNJLElBQWtCLENBRXpCLElBREFKLEtBQ08sQ0FBQ0EsSUFBc0JLLEdBQXNCLFFBQ2xEQSxHQUFzQixNQUFLLEdBRS9CLENBQ0EsU0FBU0MsR0FBWVQsRUFBU1YsRUFBS29CLEVBQXdCLENBQ3pELElBQUk1QyxFQUNKLEdBQUl3QixFQUFJLElBQUlVLENBQU8sSUFBTUEsRUFBUSxTQUFVLENBQ3pDVixFQUFJLElBQUlVLEVBQVNBLEVBQVEsUUFBUSxFQUNqQyxNQUFNVyxFQUFTWCxFQUFRLEtBQUtBLEVBQVEsV0FBVyxFQUMzQ1csSUFBV3JCLEdBQ1RxQixHQUNGVixHQUFpQlUsRUFBUVgsQ0FBTyxFQUVsQ0EsRUFBUSxLQUFLQSxFQUFRLGFBQWEsRUFBSVYsR0FFdENVLEVBQVEsY0FFSCxRQUFRLElBQUksV0FBYSxnQkFDN0JsQyxFQUFLa0MsRUFBUSxVQUFZLE1BQWdCbEMsRUFBRyxLQUFLa0MsRUFBU1ksRUFBTSxPQUFDLENBQUUsT0FBUVosQ0FBUyxFQUFFVSxDQUFzQixDQUFDLEVBRWpILENBQ0gsQ0FDQSxNQUFNRixHQUF3QixDQUFBLEVBQzlCLFNBQVNLLEdBQWV2QixFQUFLd0IsRUFBWUosRUFBd0IsQ0FDL0QsSUFBSTVDLEVBQ0p3QyxLQUNBLFVBQVdOLEtBQVdWLEVBQUksT0FDeEIsR0FBSSxHQUFDVSxFQUFRLGNBQWdCQSxFQUFRLFlBR2pDQSxFQUFRLFlBQWNjLElBQWUsQ0FBQ2QsRUFBUSxXQUFhYyxJQUFlLEdBQUksQ0FDaEYsTUFBTUMsRUFBaUJmLEVBQVEsWUFDL0JBLEVBQVEsWUFBY2MsRUFDbEJDLElBQW1CLElBQU0sQ0FBQ2YsRUFBUSxZQUFjYyxJQUFlLEtBQzFELFFBQVEsSUFBSSxXQUFhLGdCQUM3QmhELEVBQUtrQyxFQUFRLFlBQWMsTUFBZ0JsQyxFQUFHLEtBQUtrQyxFQUFTWSxFQUFNLE9BQUMsQ0FBRSxPQUFRWixDQUFTLEVBQUVVLENBQXNCLENBQUMsR0FFbEhWLEVBQVEsUUFBTyxFQUNYQSxFQUFRLFdBQ1ZRLEdBQXNCLEtBQUtSLEVBQVEsU0FBUyxFQUdqRCxDQUVITyxJQUNGLENBRUEsTUFBTVMsR0FBWSxDQUFDQyxFQUFTbEIsSUFBYSxDQUN2QyxNQUFNVCxFQUFzQixJQUFJLElBQ2hDLE9BQUFBLEVBQUksUUFBVTJCLEVBQ2QzQixFQUFJLFNBQVdTLEVBQ1JULENBQ1QsRUFFTTRCLEdBQTRCLElBQUksUUFDaENDLEdBQWMsT0FBVSxRQUFRLElBQUksV0FBYSxhQUFnQixVQUFZLEVBQUUsRUFDL0VDLEdBQXNCLE9BQVUsUUFBUSxJQUFJLFdBQWEsYUFBZ0Isa0JBQW9CLEVBQUUsRUFDckcsU0FBU0MsRUFBTUMsRUFBUUMsRUFBTUMsRUFBSyxDQUNoQyxHQUFJN0IsSUFBZVgsR0FBYyxDQUMvQixJQUFJeUMsRUFBVVAsR0FBVSxJQUFJSSxDQUFNLEVBQzdCRyxHQUNIUCxHQUFVLElBQUlJLEVBQVFHLEVBQTBCLElBQUksR0FBSyxFQUUzRCxJQUFJbkMsRUFBTW1DLEVBQVEsSUFBSUQsQ0FBRyxFQUNwQmxDLEdBQ0htQyxFQUFRLElBQUlELEVBQUtsQyxFQUFNMEIsR0FBVSxJQUFNUyxFQUFRLE9BQU9ELENBQUcsQ0FBQyxDQUFDLEVBRTdEZixHQUNFekIsR0FDQU0sRUFDRyxRQUFRLElBQUksV0FBYSxhQUFnQixDQUMxQyxPQUFBZ0MsRUFDQSxLQUFBQyxFQUNBLElBQUFDLENBQ0QsRUFBRyxNQUNWLENBQ0csQ0FDSCxDQUNBLFNBQVNyQyxHQUFRbUMsRUFBUUMsRUFBTUMsRUFBS0UsRUFBVUMsRUFBVUMsRUFBVyxDQUNqRSxNQUFNSCxFQUFVUCxHQUFVLElBQUlJLENBQU0sRUFDcEMsR0FBSSxDQUFDRyxFQUNILE9BRUYsSUFBSUksRUFBTyxDQUFBLEVBQ1gsR0FBSU4sSUFBUyxRQUNYTSxFQUFPLENBQUMsR0FBR0osRUFBUSxPQUFRLENBQUEsVUFDbEJELElBQVEsVUFBWU0sRUFBTyxRQUFDUixDQUFNLEVBQUcsQ0FDOUMsTUFBTVMsRUFBWSxPQUFPTCxDQUFRLEVBQ2pDRCxFQUFRLFFBQVEsQ0FBQ25DLEVBQUswQyxJQUFTLEVBQ3pCQSxJQUFTLFVBQVksQ0FBQ0MsRUFBQUEsU0FBU0QsQ0FBSSxHQUFLQSxHQUFRRCxJQUNsREYsRUFBSyxLQUFLdkMsQ0FBRyxDQUVyQixDQUFLLENBQ0wsS0FJSSxRQUhJa0MsSUFBUSxRQUNWSyxFQUFLLEtBQUtKLEVBQVEsSUFBSUQsQ0FBRyxDQUFDLEVBRXBCRCxFQUFJLENBQ1YsSUFBSyxNQUNFTyxFQUFBQSxRQUFRUixDQUFNLEVBS1JZLEVBQUFBLGFBQWFWLENBQUcsR0FDekJLLEVBQUssS0FBS0osRUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUwvQkksRUFBSyxLQUFLSixFQUFRLElBQUlOLEVBQVcsQ0FBQyxFQUM5QmdCLEVBQUFBLE1BQU1iLENBQU0sR0FDZE8sRUFBSyxLQUFLSixFQUFRLElBQUlMLEVBQW1CLENBQUMsR0FLOUMsTUFDRixJQUFLLFNBQ0VVLEVBQUFBLFFBQVFSLENBQU0sSUFDakJPLEVBQUssS0FBS0osRUFBUSxJQUFJTixFQUFXLENBQUMsRUFDOUJnQixFQUFBQSxNQUFNYixDQUFNLEdBQ2RPLEVBQUssS0FBS0osRUFBUSxJQUFJTCxFQUFtQixDQUFDLEdBRzlDLE1BQ0YsSUFBSyxNQUNDZSxFQUFBQSxNQUFNYixDQUFNLEdBQ2RPLEVBQUssS0FBS0osRUFBUSxJQUFJTixFQUFXLENBQUMsRUFFcEMsS0FDSCxDQUVIYixLQUNBLFVBQVdoQixLQUFPdUMsRUFDWnZDLEdBQ0Z1QixHQUNFdkIsRUFDQSxFQUNHLFFBQVEsSUFBSSxXQUFhLGFBQWdCLENBQzFDLE9BQUFnQyxFQUNBLEtBQUFDLEVBQ0EsSUFBQUMsRUFDQSxTQUFBRSxFQUNBLFNBQUFDLEVBQ0EsVUFBQUMsQ0FDRCxFQUFHLE1BQ1osRUFHRXJCLElBQ0YsQ0FNQSxNQUFNNkIsR0FBcUNDLEVBQU8sUUFBQyw2QkFBNkIsRUFDMUVDLEdBQWlCLElBQUksSUFDVCxPQUFPLG9CQUFvQixNQUFNLEVBQUUsT0FBUWQsR0FBUUEsSUFBUSxhQUFlQSxJQUFRLFFBQVEsRUFBRSxJQUFLQSxHQUFRLE9BQU9BLENBQUcsQ0FBQyxFQUFFLE9BQU9TLFVBQVEsQ0FDdkosRUFDTU0sR0FBd0NDLEdBQTJCLEVBQ3pFLFNBQVNBLElBQThCLENBQ3JDLE1BQU1DLEVBQW1CLENBQUEsRUFDekIsT0FBQyxXQUFZLFVBQVcsYUFBYSxFQUFFLFFBQVNqQixHQUFRLENBQ3REaUIsRUFBaUJqQixDQUFHLEVBQUksWUFBWTdDLEVBQU0sQ0FDeEMsTUFBTStELEVBQU1DLEVBQU0sSUFBSSxFQUN0QixRQUFTbkUsRUFBSSxFQUFHb0UsRUFBSSxLQUFLLE9BQVFwRSxFQUFJb0UsRUFBR3BFLElBQ3RDNkMsRUFBTXFCLEVBQUssTUFBT2xFLEVBQUksRUFBRSxFQUUxQixNQUFNcUUsRUFBTUgsRUFBSWxCLENBQUcsRUFBRSxHQUFHN0MsQ0FBSSxFQUM1QixPQUFJa0UsSUFBUSxJQUFNQSxJQUFRLEdBQ2pCSCxFQUFJbEIsQ0FBRyxFQUFFLEdBQUc3QyxFQUFLLElBQUlnRSxDQUFLLENBQUMsRUFFM0JFLENBRWYsQ0FDQSxDQUFHLEVBQ0QsQ0FBQyxPQUFRLE1BQU8sUUFBUyxVQUFXLFFBQVEsRUFBRSxRQUFTckIsR0FBUSxDQUM3RGlCLEVBQWlCakIsQ0FBRyxFQUFJLFlBQVk3QyxFQUFNLENBQ3hDVSxLQUNBaUIsS0FDQSxNQUFNdUMsRUFBTUYsRUFBTSxJQUFJLEVBQUVuQixDQUFHLEVBQUUsTUFBTSxLQUFNN0MsQ0FBSSxFQUM3QyxPQUFBNEIsS0FDQWYsS0FDT3FELENBQ2IsQ0FDQSxDQUFHLEVBQ01KLENBQ1QsQ0FDQSxTQUFTSyxHQUFldEIsRUFBSyxDQUMzQixNQUFNdUIsRUFBTUosRUFBTSxJQUFJLEVBQ3RCLE9BQUF0QixFQUFNMEIsRUFBSyxNQUFPdkIsQ0FBRyxFQUNkdUIsRUFBSSxlQUFldkIsQ0FBRyxDQUMvQixDQUNBLE1BQU13QixFQUFvQixDQUN4QixZQUFZQyxFQUFjLEdBQU9DLEVBQVcsR0FBTyxDQUNqRCxLQUFLLFlBQWNELEVBQ25CLEtBQUssU0FBV0MsQ0FDakIsQ0FDRCxJQUFJNUIsRUFBUUUsRUFBSzJCLEVBQVUsQ0FDekIsTUFBTUMsRUFBYyxLQUFLLFlBQWFDLEVBQVUsS0FBSyxTQUNyRCxHQUFJN0IsSUFBUSxpQkFDVixNQUFPLENBQUM0QixFQUNILEdBQUk1QixJQUFRLGlCQUNqQixPQUFPNEIsRUFDRixHQUFJNUIsSUFBUSxnQkFDakIsT0FBTzZCLEVBQ0YsR0FBSTdCLElBQVEsVUFDakIsT0FBSTJCLEtBQWNDLEVBQWNDLEVBQVVDLEdBQXFCQyxHQUFjRixFQUFVRyxHQUFxQkMsSUFBYSxJQUFJbkMsQ0FBTSxHQUVuSSxPQUFPLGVBQWVBLENBQU0sSUFBTSxPQUFPLGVBQWU2QixDQUFRLEVBQ3ZEN0IsRUFFVCxPQUVGLE1BQU1vQyxFQUFnQjVCLFVBQVFSLENBQU0sRUFDcEMsR0FBSSxDQUFDOEIsRUFBYSxDQUNoQixHQUFJTSxHQUFpQkMsRUFBQUEsT0FBT3BCLEdBQXVCZixDQUFHLEVBQ3BELE9BQU8sUUFBUSxJQUFJZSxHQUF1QmYsRUFBSzJCLENBQVEsRUFFekQsR0FBSTNCLElBQVEsaUJBQ1YsT0FBT3NCLEVBRVYsQ0FDRCxNQUFNRCxFQUFNLFFBQVEsSUFBSXZCLEVBQVFFLEVBQUsyQixDQUFRLEVBTzdDLE9BTklsQixFQUFRLFNBQUNULENBQUcsRUFBSWMsR0FBZSxJQUFJZCxDQUFHLEVBQUlZLEdBQW1CWixDQUFHLEtBRy9ENEIsR0FDSC9CLEVBQU1DLEVBQVEsTUFBT0UsQ0FBRyxFQUV0QjZCLEdBQ0tSLEVBRUxlLEVBQU1mLENBQUcsRUFDSmEsR0FBaUJ4QixFQUFBQSxhQUFhVixDQUFHLEVBQUlxQixFQUFNQSxFQUFJLE1BRXBEZ0IsRUFBQUEsU0FBU2hCLENBQUcsRUFDUE8sRUFBY1UsR0FBU2pCLENBQUcsRUFBSWtCLEdBQVNsQixDQUFHLEVBRTVDQSxDQUNSLENBQ0gsQ0FDQSxNQUFNbUIsV0FBK0JoQixFQUFvQixDQUN2RCxZQUFZSyxFQUFVLEdBQU8sQ0FDM0IsTUFBTSxHQUFPQSxDQUFPLENBQ3JCLENBQ0QsSUFBSS9CLEVBQVFFLEVBQUtwRCxFQUFPK0UsRUFBVSxDQUNoQyxJQUFJeEIsRUFBV0wsRUFBT0UsQ0FBRyxFQUN6QixHQUFJLENBQUMsS0FBSyxTQUFVLENBQ2xCLE1BQU15QyxFQUFxQkMsR0FBV3ZDLENBQVEsRUFLOUMsR0FKSSxDQUFDd0MsR0FBVS9GLENBQUssR0FBSyxDQUFDOEYsR0FBVzlGLENBQUssSUFDeEN1RCxFQUFXZ0IsRUFBTWhCLENBQVEsRUFDekJ2RCxFQUFRdUUsRUFBTXZFLENBQUssR0FFakIsQ0FBQzBELEVBQUFBLFFBQVFSLENBQU0sR0FBS3NDLEVBQU1qQyxDQUFRLEdBQUssQ0FBQ2lDLEVBQU14RixDQUFLLEVBQ3JELE9BQUk2RixFQUNLLElBRVB0QyxFQUFTLE1BQVF2RCxFQUNWLEdBR1osQ0FDRCxNQUFNZ0csRUFBU3RDLEVBQUFBLFFBQVFSLENBQU0sR0FBS1ksRUFBWSxhQUFDVixDQUFHLEVBQUksT0FBT0EsQ0FBRyxFQUFJRixFQUFPLE9BQVNxQyxFQUFNLE9BQUNyQyxFQUFRRSxDQUFHLEVBQ2hHNkMsRUFBUyxRQUFRLElBQUkvQyxFQUFRRSxFQUFLcEQsRUFBTytFLENBQVEsRUFDdkQsT0FBSTdCLElBQVdxQixFQUFNUSxDQUFRLElBQ3RCaUIsRUFFTUUsRUFBVSxXQUFDbEcsRUFBT3VELENBQVEsR0FDbkN4QyxHQUFRbUMsRUFBUSxNQUFPRSxFQUFLcEQsRUFBT3VELENBQVEsRUFGM0N4QyxHQUFRbUMsRUFBUSxNQUFPRSxFQUFLcEQsQ0FBSyxHQUs5QmlHLENBQ1IsQ0FDRCxlQUFlL0MsRUFBUUUsRUFBSyxDQUMxQixNQUFNNEMsRUFBU1QsRUFBQUEsT0FBT3JDLEVBQVFFLENBQUcsRUFDM0JHLEVBQVdMLEVBQU9FLENBQUcsRUFDckI2QyxFQUFTLFFBQVEsZUFBZS9DLEVBQVFFLENBQUcsRUFDakQsT0FBSTZDLEdBQVVELEdBQ1pqRixHQUFRbUMsRUFBUSxTQUFVRSxFQUFLLE9BQVFHLENBQVEsRUFFMUMwQyxDQUNSLENBQ0QsSUFBSS9DLEVBQVFFLEVBQUssQ0FDZixNQUFNNkMsRUFBUyxRQUFRLElBQUkvQyxFQUFRRSxDQUFHLEVBQ3RDLE9BQUksQ0FBQ1MsRUFBUSxTQUFDVCxDQUFHLEdBQUssQ0FBQ2MsR0FBZSxJQUFJZCxDQUFHLElBQzNDSCxFQUFNQyxFQUFRLE1BQU9FLENBQUcsRUFFbkI2QyxDQUNSLENBQ0QsUUFBUS9DLEVBQVEsQ0FDZCxPQUFBRCxFQUNFQyxFQUNBLFVBQ0FRLFVBQVFSLENBQU0sRUFBSSxTQUFXSCxFQUNuQyxFQUNXLFFBQVEsUUFBUUcsQ0FBTSxDQUM5QixDQUNILENBQ0EsTUFBTWlELFdBQWdDdkIsRUFBb0IsQ0FDeEQsWUFBWUssRUFBVSxHQUFPLENBQzNCLE1BQU0sR0FBTUEsQ0FBTyxDQUNwQixDQUNELElBQUkvQixFQUFRRSxFQUFLLENBQ2YsT0FBTyxRQUFRLElBQUksV0FBYSxjQUM5Qi9DLEdBQ0UseUJBQXlCLE9BQU8rQyxDQUFHLENBQUMsZ0NBQ3BDRixDQUNSLEVBRVcsRUFDUixDQUNELGVBQWVBLEVBQVFFLEVBQUssQ0FDMUIsT0FBTyxRQUFRLElBQUksV0FBYSxjQUM5Qi9DLEdBQ0UsNEJBQTRCLE9BQU8rQyxDQUFHLENBQUMsZ0NBQ3ZDRixDQUNSLEVBRVcsRUFDUixDQUNILENBQ0EsTUFBTWtELEdBQWtDLElBQUlSLEdBQ3RDUyxHQUFtQyxJQUFJRixHQUl2Q0csR0FBMEMsSUFBSUgsR0FBd0IsRUFBSSxFQUUxRUksR0FBYXZHLEdBQVVBLEVBQ3ZCd0csR0FBWW5GLEdBQU0sUUFBUSxlQUFlQSxDQUFDLEVBQ2hELFNBQVNvRixHQUFJdkQsRUFBUUUsRUFBSzBDLEVBQWEsR0FBT0MsRUFBWSxHQUFPLENBQy9EN0MsRUFBU0EsRUFBTyxRQUNoQixNQUFNd0QsRUFBWW5DLEVBQU1yQixDQUFNLEVBQ3hCeUQsRUFBU3BDLEVBQU1uQixDQUFHLEVBQ25CMEMsSUFDQ0ksRUFBVSxXQUFDOUMsRUFBS3VELENBQU0sR0FDeEIxRCxFQUFNeUQsRUFBVyxNQUFPdEQsQ0FBRyxFQUU3QkgsRUFBTXlELEVBQVcsTUFBT0MsQ0FBTSxHQUVoQyxLQUFNLENBQUUsSUFBS0MsQ0FBTSxFQUFHSixHQUFTRSxDQUFTLEVBQ2xDRyxFQUFPZCxFQUFZUSxHQUFZVCxFQUFhZ0IsR0FBYUMsR0FDL0QsR0FBSUgsRUFBSyxLQUFLRixFQUFXdEQsQ0FBRyxFQUMxQixPQUFPeUQsRUFBSzNELEVBQU8sSUFBSUUsQ0FBRyxDQUFDLEVBQ3RCLEdBQUl3RCxFQUFLLEtBQUtGLEVBQVdDLENBQU0sRUFDcEMsT0FBT0UsRUFBSzNELEVBQU8sSUFBSXlELENBQU0sQ0FBQyxFQUNyQnpELElBQVd3RCxHQUNwQnhELEVBQU8sSUFBSUUsQ0FBRyxDQUVsQixDQUNBLFNBQVM0RCxHQUFJNUQsRUFBSzBDLEVBQWEsR0FBTyxDQUNwQyxNQUFNNUMsRUFBUyxLQUFLLFFBQ2R3RCxFQUFZbkMsRUFBTXJCLENBQU0sRUFDeEJ5RCxFQUFTcEMsRUFBTW5CLENBQUcsRUFDeEIsT0FBSzBDLElBQ0NJLEVBQVUsV0FBQzlDLEVBQUt1RCxDQUFNLEdBQ3hCMUQsRUFBTXlELEVBQVcsTUFBT3RELENBQUcsRUFFN0JILEVBQU15RCxFQUFXLE1BQU9DLENBQU0sR0FFekJ2RCxJQUFRdUQsRUFBU3pELEVBQU8sSUFBSUUsQ0FBRyxFQUFJRixFQUFPLElBQUlFLENBQUcsR0FBS0YsRUFBTyxJQUFJeUQsQ0FBTSxDQUNoRixDQUNBLFNBQVNNLEdBQUsvRCxFQUFRNEMsRUFBYSxHQUFPLENBQ3hDLE9BQUE1QyxFQUFTQSxFQUFPLFFBQ2hCLENBQUM0QyxHQUFjN0MsRUFBTXNCLEVBQU1yQixDQUFNLEVBQUcsVUFBV0gsRUFBVyxFQUNuRCxRQUFRLElBQUlHLEVBQVEsT0FBUUEsQ0FBTSxDQUMzQyxDQUNBLFNBQVNnRSxHQUFJbEgsRUFBTyxDQUNsQkEsRUFBUXVFLEVBQU12RSxDQUFLLEVBQ25CLE1BQU1rRCxFQUFTcUIsRUFBTSxJQUFJLEVBR3pCLE9BRmNpQyxHQUFTdEQsQ0FBTSxFQUNSLElBQUksS0FBS0EsRUFBUWxELENBQUssSUFFekNrRCxFQUFPLElBQUlsRCxDQUFLLEVBQ2hCZSxHQUFRbUMsRUFBUSxNQUFPbEQsRUFBT0EsQ0FBSyxHQUU5QixJQUNULENBQ0EsU0FBU21ILEdBQUkvRCxFQUFLcEQsRUFBTyxDQUN2QkEsRUFBUXVFLEVBQU12RSxDQUFLLEVBQ25CLE1BQU1rRCxFQUFTcUIsRUFBTSxJQUFJLEVBQ25CLENBQUUsSUFBS3FDLEVBQU0sSUFBS1EsR0FBU1osR0FBU3RELENBQU0sRUFDaEQsSUFBSThDLEVBQVNZLEVBQUssS0FBSzFELEVBQVFFLENBQUcsRUFDN0I0QyxFQUdTLFFBQVEsSUFBSSxXQUFhLGNBQ3JDcUIsR0FBa0JuRSxFQUFRMEQsRUFBTXhELENBQUcsR0FIbkNBLEVBQU1tQixFQUFNbkIsQ0FBRyxFQUNmNEMsRUFBU1ksRUFBSyxLQUFLMUQsRUFBUUUsQ0FBRyxHQUloQyxNQUFNRyxFQUFXNkQsRUFBSyxLQUFLbEUsRUFBUUUsQ0FBRyxFQUN0QyxPQUFBRixFQUFPLElBQUlFLEVBQUtwRCxDQUFLLEVBQ2hCZ0csRUFFTUUsRUFBVSxXQUFDbEcsRUFBT3VELENBQVEsR0FDbkN4QyxHQUFRbUMsRUFBUSxNQUFPRSxFQUFLcEQsRUFBT3VELENBQVEsRUFGM0N4QyxHQUFRbUMsRUFBUSxNQUFPRSxFQUFLcEQsQ0FBSyxFQUk1QixJQUNULENBQ0EsU0FBU3NILEdBQVlsRSxFQUFLLENBQ3hCLE1BQU1GLEVBQVNxQixFQUFNLElBQUksRUFDbkIsQ0FBRSxJQUFLcUMsRUFBTSxJQUFLUSxHQUFTWixHQUFTdEQsQ0FBTSxFQUNoRCxJQUFJOEMsRUFBU1ksRUFBSyxLQUFLMUQsRUFBUUUsQ0FBRyxFQUM3QjRDLEVBR1MsUUFBUSxJQUFJLFdBQWEsY0FDckNxQixHQUFrQm5FLEVBQVEwRCxFQUFNeEQsQ0FBRyxHQUhuQ0EsRUFBTW1CLEVBQU1uQixDQUFHLEVBQ2Y0QyxFQUFTWSxFQUFLLEtBQUsxRCxFQUFRRSxDQUFHLEdBSWhDLE1BQU1HLEVBQVc2RCxFQUFPQSxFQUFLLEtBQUtsRSxFQUFRRSxDQUFHLEVBQUksT0FDM0M2QyxFQUFTL0MsRUFBTyxPQUFPRSxDQUFHLEVBQ2hDLE9BQUk0QyxHQUNGakYsR0FBUW1DLEVBQVEsU0FBVUUsRUFBSyxPQUFRRyxDQUFRLEVBRTFDMEMsQ0FDVCxDQUNBLFNBQVNzQixJQUFRLENBQ2YsTUFBTXJFLEVBQVNxQixFQUFNLElBQUksRUFDbkJpRCxFQUFXdEUsRUFBTyxPQUFTLEVBQzNCTSxFQUFlLFFBQVEsSUFBSSxXQUFhLGFBQWdCTyxFQUFLLE1BQUNiLENBQU0sRUFBSSxJQUFJLElBQUlBLENBQU0sRUFBSSxJQUFJLElBQUlBLENBQU0sRUFBSSxPQUM1RytDLEVBQVMvQyxFQUFPLFFBQ3RCLE9BQUlzRSxHQUNGekcsR0FBUW1DLEVBQVEsUUFBUyxPQUFRLE9BQVFNLENBQVMsRUFFN0N5QyxDQUNULENBQ0EsU0FBU3dCLEdBQWMzQixFQUFZQyxFQUFXLENBQzVDLE9BQU8sU0FBaUIyQixFQUFVQyxFQUFTLENBQ3pDLE1BQU1DLEVBQVcsS0FDWDFFLEVBQVMwRSxFQUFTLFFBQ2xCbEIsRUFBWW5DLEVBQU1yQixDQUFNLEVBQ3hCMkQsRUFBT2QsRUFBWVEsR0FBWVQsRUFBYWdCLEdBQWFDLEdBQy9ELE9BQUNqQixHQUFjN0MsRUFBTXlELEVBQVcsVUFBVzNELEVBQVcsRUFDL0NHLEVBQU8sUUFBUSxDQUFDbEQsRUFBT29ELElBQ3JCc0UsRUFBUyxLQUFLQyxFQUFTZCxFQUFLN0csQ0FBSyxFQUFHNkcsRUFBS3pELENBQUcsRUFBR3dFLENBQVEsQ0FDL0QsQ0FDTCxDQUNBLENBQ0EsU0FBU0MsR0FBcUJDLEVBQVFoQyxFQUFZQyxFQUFXLENBQzNELE9BQU8sWUFBWXhGLEVBQU0sQ0FDdkIsTUFBTTJDLEVBQVMsS0FBSyxRQUNkd0QsRUFBWW5DLEVBQU1yQixDQUFNLEVBQ3hCNkUsRUFBY2hFLFFBQU0yQyxDQUFTLEVBQzdCc0IsRUFBU0YsSUFBVyxXQUFhQSxJQUFXLE9BQU8sVUFBWUMsRUFDL0RFLEVBQVlILElBQVcsUUFBVUMsRUFDakNHLEVBQWdCaEYsRUFBTzRFLENBQU0sRUFBRSxHQUFHdkgsQ0FBSSxFQUN0Q3NHLEVBQU9kLEVBQVlRLEdBQVlULEVBQWFnQixHQUFhQyxHQUMvRCxPQUFDakIsR0FBYzdDLEVBQ2J5RCxFQUNBLFVBQ0F1QixFQUFZakYsR0FBc0JELEVBQ3hDLEVBQ1csQ0FFTCxNQUFPLENBQ0wsS0FBTSxDQUFFLE1BQUEvQyxFQUFPLEtBQUFtSSxDQUFNLEVBQUdELEVBQWMsS0FBSSxFQUMxQyxPQUFPQyxFQUFPLENBQUUsTUFBQW5JLEVBQU8sS0FBQW1JLEdBQVMsQ0FDOUIsTUFBT0gsRUFBUyxDQUFDbkIsRUFBSzdHLEVBQU0sQ0FBQyxDQUFDLEVBQUc2RyxFQUFLN0csRUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFJNkcsRUFBSzdHLENBQUssRUFDN0QsS0FBQW1JLENBQ1YsQ0FDTyxFQUVELENBQUMsT0FBTyxRQUFRLEdBQUksQ0FDbEIsT0FBTyxJQUNSLENBQ1AsQ0FDQSxDQUNBLENBQ0EsU0FBU0MsR0FBcUJqRixFQUFNLENBQ2xDLE9BQU8sWUFBWTVDLEVBQU0sQ0FDdkIsR0FBTyxRQUFRLElBQUksV0FBYSxhQUFlLENBQzdDLE1BQU02QyxFQUFNN0MsRUFBSyxDQUFDLEVBQUksV0FBV0EsRUFBSyxDQUFDLENBQUMsS0FBTyxHQUMvQyxRQUFRLEtBQ04sR0FBRzhILEVBQVUsV0FBQ2xGLENBQUksQ0FBQyxjQUFjQyxDQUFHLDhCQUNwQ21CLEVBQU0sSUFBSSxDQUNsQixDQUNLLENBQ0QsT0FBT3BCLElBQVMsU0FBVyxHQUFRQSxJQUFTLFFBQVUsT0FBUyxJQUNuRSxDQUNBLENBQ0EsU0FBU21GLElBQXlCLENBQ2hDLE1BQU1DLEVBQTJCLENBQy9CLElBQUluRixFQUFLLENBQ1AsT0FBT3FELEdBQUksS0FBTXJELENBQUcsQ0FDckIsRUFDRCxJQUFJLE1BQU8sQ0FDVCxPQUFPNkQsR0FBSyxJQUFJLENBQ2pCLEVBQ0QsSUFBQUQsR0FDQSxJQUFBRSxHQUNBLElBQUFDLEdBQ0EsT0FBUUcsR0FDUixNQUFBQyxHQUNBLFFBQVNFLEdBQWMsR0FBTyxFQUFLLENBQ3ZDLEVBQ1FlLEVBQTJCLENBQy9CLElBQUlwRixFQUFLLENBQ1AsT0FBT3FELEdBQUksS0FBTXJELEVBQUssR0FBTyxFQUFJLENBQ2xDLEVBQ0QsSUFBSSxNQUFPLENBQ1QsT0FBTzZELEdBQUssSUFBSSxDQUNqQixFQUNELElBQUFELEdBQ0EsSUFBQUUsR0FDQSxJQUFBQyxHQUNBLE9BQVFHLEdBQ1IsTUFBQUMsR0FDQSxRQUFTRSxHQUFjLEdBQU8sRUFBSSxDQUN0QyxFQUNRZ0IsRUFBNEIsQ0FDaEMsSUFBSXJGLEVBQUssQ0FDUCxPQUFPcUQsR0FBSSxLQUFNckQsRUFBSyxFQUFJLENBQzNCLEVBQ0QsSUFBSSxNQUFPLENBQ1QsT0FBTzZELEdBQUssS0FBTSxFQUFJLENBQ3ZCLEVBQ0QsSUFBSTdELEVBQUssQ0FDUCxPQUFPNEQsR0FBSSxLQUFLLEtBQU01RCxFQUFLLEVBQUksQ0FDaEMsRUFDRCxJQUFLZ0YsR0FBcUIsS0FBSyxFQUMvQixJQUFLQSxHQUFxQixLQUFLLEVBQy9CLE9BQVFBLEdBQXFCLFFBQVEsRUFDckMsTUFBT0EsR0FBcUIsT0FBTyxFQUNuQyxRQUFTWCxHQUFjLEdBQU0sRUFBSyxDQUN0QyxFQUNRaUIsRUFBbUMsQ0FDdkMsSUFBSXRGLEVBQUssQ0FDUCxPQUFPcUQsR0FBSSxLQUFNckQsRUFBSyxHQUFNLEVBQUksQ0FDakMsRUFDRCxJQUFJLE1BQU8sQ0FDVCxPQUFPNkQsR0FBSyxLQUFNLEVBQUksQ0FDdkIsRUFDRCxJQUFJN0QsRUFBSyxDQUNQLE9BQU80RCxHQUFJLEtBQUssS0FBTTVELEVBQUssRUFBSSxDQUNoQyxFQUNELElBQUtnRixHQUFxQixLQUFLLEVBQy9CLElBQUtBLEdBQXFCLEtBQUssRUFDL0IsT0FBUUEsR0FBcUIsUUFBUSxFQUNyQyxNQUFPQSxHQUFxQixPQUFPLEVBQ25DLFFBQVNYLEdBQWMsR0FBTSxFQUFJLENBQ3JDLEVBRUUsTUFEd0IsQ0FBQyxPQUFRLFNBQVUsVUFBVyxPQUFPLFFBQVEsRUFDckQsUUFBU0ssR0FBVyxDQUNsQ1MsRUFBeUJULENBQU0sRUFBSUQsR0FDakNDLEVBQ0EsR0FDQSxFQUNOLEVBQ0lXLEVBQTBCWCxDQUFNLEVBQUlELEdBQ2xDQyxFQUNBLEdBQ0EsRUFDTixFQUNJVSxFQUF5QlYsQ0FBTSxFQUFJRCxHQUNqQ0MsRUFDQSxHQUNBLEVBQ04sRUFDSVksRUFBaUNaLENBQU0sRUFBSUQsR0FDekNDLEVBQ0EsR0FDQSxFQUNOLENBQ0EsQ0FBRyxFQUNNLENBQ0xTLEVBQ0FFLEVBQ0FELEVBQ0FFLENBQ0osQ0FDQSxDQUNBLEtBQU0sQ0FDSkMsR0FDQUMsR0FDQUMsR0FDQUMsRUFDRixFQUFvQlIsR0FBc0IsRUFDMUMsU0FBU1MsR0FBNEJqRCxFQUFZYixFQUFTLENBQ3hELE1BQU1aLEVBQW1CWSxFQUFVYSxFQUFhZ0QsR0FBa0NELEdBQTBCL0MsRUFBYThDLEdBQTJCRCxHQUNwSixNQUFPLENBQUN6RixFQUFRRSxFQUFLMkIsSUFDZjNCLElBQVEsaUJBQ0gsQ0FBQzBDLEVBQ0MxQyxJQUFRLGlCQUNWMEMsRUFDRTFDLElBQVEsVUFDVkYsRUFFRixRQUFRLElBQ2JxQyxFQUFNLE9BQUNsQixFQUFrQmpCLENBQUcsR0FBS0EsS0FBT0YsRUFBU21CLEVBQW1CbkIsRUFDcEVFLEVBQ0EyQixDQUNOLENBRUEsQ0FDQSxNQUFNaUUsR0FBNEIsQ0FDaEMsSUFBcUJELEdBQTRCLEdBQU8sRUFBSyxDQUMvRCxFQUlNRSxHQUE2QixDQUNqQyxJQUFxQkYsR0FBNEIsR0FBTSxFQUFLLENBQzlELEVBQ01HLEdBQW9DLENBQ3hDLElBQXFCSCxHQUE0QixHQUFNLEVBQUksQ0FDN0QsRUFDQSxTQUFTMUIsR0FBa0JuRSxFQUFRMEQsRUFBTXhELEVBQUssQ0FDNUMsTUFBTXVELEVBQVNwQyxFQUFNbkIsQ0FBRyxFQUN4QixHQUFJdUQsSUFBV3ZELEdBQU93RCxFQUFLLEtBQUsxRCxFQUFReUQsQ0FBTSxFQUFHLENBQy9DLE1BQU14RCxFQUFPZ0csWUFBVWpHLENBQU0sRUFDN0IsUUFBUSxLQUNOLFlBQVlDLENBQUksa0VBQWtFQSxJQUFTLE1BQVEsV0FBYSxFQUFFLDhKQUN4SCxDQUNHLENBQ0gsQ0FFQSxNQUFNa0MsR0FBOEIsSUFBSSxRQUNsQ0QsR0FBcUMsSUFBSSxRQUN6Q0QsR0FBOEIsSUFBSSxRQUNsQ0QsR0FBcUMsSUFBSSxRQUMvQyxTQUFTa0UsR0FBY0MsRUFBUyxDQUM5QixPQUFRQSxFQUFPLENBQ2IsSUFBSyxTQUNMLElBQUssUUFDSCxNQUFPLEdBQ1QsSUFBSyxNQUNMLElBQUssTUFDTCxJQUFLLFVBQ0wsSUFBSyxVQUNILE1BQU8sR0FDVCxRQUNFLE1BQU8sRUFDVixDQUNILENBQ0EsU0FBU0MsR0FBY3RKLEVBQU8sQ0FDNUIsT0FBT0EsRUFBTSxVQUFlLENBQUMsT0FBTyxhQUFhQSxDQUFLLEVBQUksRUFBa0JvSixHQUFjRCxZQUFVbkosQ0FBSyxDQUFDLENBQzVHLENBQ0EsU0FBUzJGLEdBQVN6QyxFQUFRLENBQ3hCLE9BQUk0QyxHQUFXNUMsQ0FBTSxFQUNaQSxFQUVGcUcsR0FDTHJHLEVBQ0EsR0FDQWtELEdBQ0E0QyxHQUNBM0QsRUFDSixDQUNBLENBVUEsU0FBU0ssR0FBU3hDLEVBQVEsQ0FDeEIsT0FBT3FHLEdBQ0xyRyxFQUNBLEdBQ0FtRCxHQUNBNEMsR0FDQTlELEVBQ0osQ0FDQSxDQUNBLFNBQVNxRSxHQUFnQnRHLEVBQVEsQ0FDL0IsT0FBT3FHLEdBQ0xyRyxFQUNBLEdBQ0FvRCxHQUNBNEMsR0FDQWhFLEVBQ0osQ0FDQSxDQUNBLFNBQVNxRSxHQUFxQnJHLEVBQVE4QixFQUFheUUsRUFBY0MsRUFBb0JDLEVBQVUsQ0FDN0YsR0FBSSxDQUFDbEUsRUFBQUEsU0FBU3ZDLENBQU0sRUFDbEIsT0FBTyxRQUFRLElBQUksV0FBYSxjQUM5QixRQUFRLEtBQUssa0NBQWtDLE9BQU9BLENBQU0sQ0FBQyxFQUFFLEVBRTFEQSxFQUVULEdBQUlBLEVBQU8sU0FBYyxFQUFFOEIsR0FBZTlCLEVBQU8sZ0JBQy9DLE9BQU9BLEVBRVQsTUFBTTBHLEVBQWdCRCxFQUFTLElBQUl6RyxDQUFNLEVBQ3pDLEdBQUkwRyxFQUNGLE9BQU9BLEVBRVQsTUFBTUMsRUFBYVAsR0FBY3BHLENBQU0sRUFDdkMsR0FBSTJHLElBQWUsRUFDakIsT0FBTzNHLEVBRVQsTUFBTTRHLEVBQVEsSUFBSSxNQUNoQjVHLEVBQ0EyRyxJQUFlLEVBQXFCSCxFQUFxQkQsQ0FDN0QsRUFDRSxPQUFBRSxFQUFTLElBQUl6RyxFQUFRNEcsQ0FBSyxFQUNuQkEsQ0FDVCxDQUNBLFNBQVNDLEdBQVcvSixFQUFPLENBQ3pCLE9BQUk4RixHQUFXOUYsQ0FBSyxFQUNYK0osR0FBVy9KLEVBQU0sT0FBVSxFQUU3QixDQUFDLEVBQUVBLEdBQVNBLEVBQU0sZUFDM0IsQ0FDQSxTQUFTOEYsR0FBVzlGLEVBQU8sQ0FDekIsTUFBTyxDQUFDLEVBQUVBLEdBQVNBLEVBQU0sZUFDM0IsQ0FDQSxTQUFTK0YsR0FBVS9GLEVBQU8sQ0FDeEIsTUFBTyxDQUFDLEVBQUVBLEdBQVNBLEVBQU0sY0FDM0IsQ0FDQSxTQUFTZ0ssR0FBUWhLLEVBQU8sQ0FDdEIsT0FBTytKLEdBQVcvSixDQUFLLEdBQUs4RixHQUFXOUYsQ0FBSyxDQUM5QyxDQUNBLFNBQVN1RSxFQUFNcUQsRUFBVSxDQUN2QixNQUFNcUMsRUFBTXJDLEdBQVlBLEVBQVMsUUFDakMsT0FBT3FDLEVBQU0xRixFQUFNMEYsQ0FBRyxFQUFJckMsQ0FDNUIsQ0FDQSxTQUFTc0MsR0FBUWxLLEVBQU8sQ0FDdEJtSyxPQUFBQSxFQUFBQSxJQUFJbkssRUFBTyxXQUFZLEVBQUksRUFDcEJBLENBQ1QsQ0FDQSxNQUFNK0csR0FBYy9HLEdBQVV5RixXQUFTekYsQ0FBSyxFQUFJMkYsR0FBUzNGLENBQUssRUFBSUEsRUFDNUQ4RyxHQUFjOUcsR0FBVXlGLFdBQVN6RixDQUFLLEVBQUkwRixHQUFTMUYsQ0FBSyxFQUFJQSxFQTRGbEUsU0FBU3dGLEVBQU00RSxFQUFHLENBQ2hCLE1BQU8sQ0FBQyxFQUFFQSxHQUFLQSxFQUFFLFlBQWMsR0FDakMsQ0FzQ0EsU0FBU0MsR0FBTUMsRUFBTSxDQUNuQixPQUFPOUUsRUFBTThFLENBQUksRUFBSUEsRUFBSyxNQUFRQSxDQUNwQyxDQUlBLE1BQU1DLEdBQXdCLENBQzVCLElBQUssQ0FBQ3JILEVBQVFFLEVBQUsyQixJQUFhc0YsR0FBTSxRQUFRLElBQUluSCxFQUFRRSxFQUFLMkIsQ0FBUSxDQUFDLEVBQ3hFLElBQUssQ0FBQzdCLEVBQVFFLEVBQUtwRCxFQUFPK0UsSUFBYSxDQUNyQyxNQUFNeEIsRUFBV0wsRUFBT0UsQ0FBRyxFQUMzQixPQUFJb0MsRUFBTWpDLENBQVEsR0FBSyxDQUFDaUMsRUFBTXhGLENBQUssR0FDakN1RCxFQUFTLE1BQVF2RCxFQUNWLElBRUEsUUFBUSxJQUFJa0QsRUFBUUUsRUFBS3BELEVBQU8rRSxDQUFRLENBRWxELENBQ0gsRUFDQSxTQUFTeUYsR0FBVUMsRUFBZ0IsQ0FDakMsT0FBT1YsR0FBV1UsQ0FBYyxFQUFJQSxFQUFpQixJQUFJLE1BQU1BLEVBQWdCRixFQUFxQixDQUN0RyxDQ3ptQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQVVBLE1BQU1HLEdBQVEsQ0FBQSxFQUNkLFNBQVNDLEdBQW1CQyxFQUFPLENBQ2pDRixHQUFNLEtBQUtFLENBQUssQ0FDbEIsQ0FDQSxTQUFTQyxJQUFvQixDQUMzQkgsR0FBTSxJQUFJLENBQ1osQ0FDQSxTQUFTSSxFQUFPeEssS0FBUUMsRUFBTSxDQUNkVSxLQUNSLE1BQUE4SixFQUFXTCxHQUFNLE9BQVNBLEdBQU1BLEdBQU0sT0FBUyxDQUFDLEVBQUUsVUFBWSxLQUM5RE0sRUFBaUJELEdBQVlBLEVBQVMsV0FBVyxPQUFPLFlBQ3hERSxFQUFRQyxLQUNkLEdBQUlGLEVBQ0ZHLEdBQ0VILEVBQ0FELEVBQ0EsR0FDQSxDQUNFekssRUFBTUMsRUFBSyxLQUFLLEVBQUUsRUFDbEJ3SyxHQUFZQSxFQUFTLE1BQ3JCRSxFQUFNLElBQ0osQ0FBQyxDQUFFLE1BQUFMLEtBQVksT0FBT1EsR0FBb0JMLEVBQVVILEVBQU0sSUFBSSxDQUFDLEdBQUEsRUFDL0QsS0FBSztBQUFBLENBQUksRUFDWEssQ0FDRixDQUFBLE1BRUcsQ0FDTCxNQUFNSSxFQUFXLENBQUMsZUFBZS9LLENBQUcsR0FBSSxHQUFHQyxDQUFJLEVBQzNDMEssRUFBTSxRQUVSSSxFQUFTLEtBQUs7QUFBQSxFQUNqQixHQUFHQyxHQUFZTCxDQUFLLENBQUMsRUFFWixRQUFBLEtBQUssR0FBR0ksQ0FBUSxDQUMxQixDQUNjakssSUFDaEIsQ0FDQSxTQUFTOEosSUFBb0IsQ0FDM0IsSUFBSUssRUFBZWIsR0FBTUEsR0FBTSxPQUFTLENBQUMsRUFDekMsR0FBSSxDQUFDYSxFQUNILE1BQU8sR0FFVCxNQUFNQyxFQUFrQixDQUFBLEVBQ3hCLEtBQU9ELEdBQWMsQ0FDYixNQUFBdEosRUFBT3VKLEVBQWdCLENBQUMsRUFDMUJ2SixHQUFRQSxFQUFLLFFBQVVzSixFQUNwQnRKLEVBQUEsZUFFTHVKLEVBQWdCLEtBQUssQ0FDbkIsTUFBT0QsRUFDUCxhQUFjLENBQUEsQ0FDZixFQUVILE1BQU1FLEVBQWlCRixFQUFhLFdBQWFBLEVBQWEsVUFBVSxPQUN4RUEsRUFBZUUsR0FBa0JBLEVBQWUsS0FDbEQsQ0FDTyxPQUFBRCxDQUNULENBQ0EsU0FBU0YsR0FBWUwsRUFBTyxDQUMxQixNQUFNUyxFQUFPLENBQUEsRUFDUCxPQUFBVCxFQUFBLFFBQVEsQ0FBQ1UsRUFBT3ZMLElBQU0sQ0FDMUJzTCxFQUFLLEtBQUssR0FBR3RMLElBQU0sRUFBSSxDQUFBLEVBQUssQ0FBQztBQUFBLENBQ2hDLEVBQUcsR0FBR3dMLEdBQWlCRCxDQUFLLENBQUMsQ0FBQSxDQUMzQixFQUNNRCxDQUNULENBQ0EsU0FBU0UsR0FBaUIsQ0FBRSxNQUFBaEIsRUFBTyxhQUFBaUIsR0FBZ0IsQ0FDakQsTUFBTUMsRUFBVUQsRUFBZSxFQUFJLFFBQVFBLENBQVksb0JBQXNCLEdBQ3ZFRSxFQUFTbkIsRUFBTSxVQUFZQSxFQUFNLFVBQVUsUUFBVSxLQUFPLEdBQzVEb0IsRUFBTyxRQUFRWixHQUNuQlIsRUFBTSxVQUNOQSxFQUFNLEtBQ05tQixDQUNELENBQUEsR0FDS0UsRUFBUSxJQUFNSCxFQUNwQixPQUFPbEIsRUFBTSxNQUFRLENBQUNvQixFQUFNLEdBQUdFLEdBQVl0QixFQUFNLEtBQUssRUFBR3FCLENBQUssRUFBSSxDQUFDRCxFQUFPQyxDQUFLLENBQ2pGLENBQ0EsU0FBU0MsR0FBWUMsRUFBTyxDQUMxQixNQUFNMUgsRUFBTSxDQUFBLEVBQ04ySCxFQUFPLE9BQU8sS0FBS0QsQ0FBSyxFQUM5QixPQUFBQyxFQUFLLE1BQU0sRUFBRyxDQUFDLEVBQUUsUUFBU2hKLEdBQVEsQ0FDaENxQixFQUFJLEtBQUssR0FBRzRILEdBQVdqSixFQUFLK0ksRUFBTS9JLENBQUcsQ0FBQyxDQUFDLENBQUEsQ0FDeEMsRUFDR2dKLEVBQUssT0FBUyxHQUNoQjNILEVBQUksS0FBSyxNQUFNLEVBRVZBLENBQ1QsQ0FDQSxTQUFTNEgsR0FBV2pKLEVBQUtwRCxFQUFPaUssRUFBSyxDQUMvQixPQUFBcUMsRUFBQUEsU0FBU3RNLENBQUssR0FDUkEsRUFBQSxLQUFLLFVBQVVBLENBQUssRUFDckJpSyxFQUFNakssRUFBUSxDQUFDLEdBQUdvRCxDQUFHLElBQUlwRCxDQUFLLEVBQUUsR0FDOUIsT0FBT0EsR0FBVSxVQUFZLE9BQU9BLEdBQVUsV0FBYUEsR0FBUyxLQUN0RWlLLEVBQU1qSyxFQUFRLENBQUMsR0FBR29ELENBQUcsSUFBSXBELENBQUssRUFBRSxFQUM5QndGLEVBQU14RixDQUFLLEdBQ3BCQSxFQUFRcU0sR0FBV2pKLEVBQUttQixFQUFNdkUsRUFBTSxLQUFLLEVBQUcsRUFBSSxFQUN6Q2lLLEVBQU1qSyxFQUFRLENBQUMsR0FBR29ELENBQUcsUUFBU3BELEVBQU8sR0FBRyxHQUN0Q3VNLEVBQUFBLFdBQVd2TSxDQUFLLEVBQ2xCLENBQUMsR0FBR29ELENBQUcsTUFBTXBELEVBQU0sS0FBTyxJQUFJQSxFQUFNLElBQUksSUFBTSxFQUFFLEVBQUUsR0FFekRBLEVBQVF1RSxFQUFNdkUsQ0FBSyxFQUNaaUssRUFBTWpLLEVBQVEsQ0FBQyxHQUFHb0QsQ0FBRyxJQUFLcEQsQ0FBSyxFQUUxQyxDQUNBLFNBQVN3TSxHQUFhQyxFQUFLdEosRUFBTSxDQUN2QixRQUFRLElBQUksV0FBYSxjQUU3QnNKLElBQVEsU0FFRCxPQUFPQSxHQUFRLFNBQ3hCM0IsRUFBTyxHQUFHM0gsQ0FBSSxnQ0FBZ0MsS0FBSyxVQUFVc0osQ0FBRyxDQUFDLEdBQUcsRUFDM0QsTUFBTUEsQ0FBRyxHQUNYM0IsRUFBQSxHQUFHM0gsQ0FBSSx1REFBdUQsRUFFekUsQ0FrQ0EsTUFBTXVKLEdBQXFCLENBQ3hCLEdBQU8sc0JBQ1AsR0FBTyxvQkFDUCxFQUFNLGVBQ04sR0FBTyxtQkFDUCxFQUFNLGVBQ04sR0FBTyxvQkFDUCxFQUFNLFVBQ04sSUFBUSxxQkFDUixHQUFPLGlCQUNQLEVBQU0saUJBQ04sR0FBTyxtQkFDUCxHQUFPLHFCQUNQLElBQVEscUJBQ1IsSUFBUSx1QkFDUixFQUFJLGlCQUNKLEVBQUksa0JBQ0osRUFBSSxpQkFDSixFQUFJLG1CQUNKLEVBQUksMkJBQ0osRUFBSSx1QkFDSixFQUFJLDBCQUNKLEVBQUksYUFDSixFQUFJLGlCQUNKLEVBQUksa0JBQ0osR0FBSyxtQkFDTCxHQUFLLGtCQUNMLEdBQUssZUFDTCxHQUFLLHlCQUNMLEdBQUssOEdBQ1IsRUFDQSxTQUFTdkIsR0FBc0JySyxFQUFJaUssRUFBVTVILEVBQU01QyxFQUFNLENBQ25ELElBQUFrRSxFQUNBLEdBQUEsQ0FDRkEsRUFBTWxFLEVBQU9PLEVBQUcsR0FBR1AsQ0FBSSxFQUFJTyxFQUFHLFFBQ3ZCNkwsRUFBSyxDQUNBQyxHQUFBRCxFQUFLNUIsRUFBVTVILENBQUksQ0FDakMsQ0FDTyxPQUFBc0IsQ0FDVCxDQUNBLFNBQVNvSSxHQUEyQi9MLEVBQUlpSyxFQUFVNUgsRUFBTTVDLEVBQU0sQ0FDeEQsR0FBQWdNLEVBQUFBLFdBQVd6TCxDQUFFLEVBQUcsQ0FDbEIsTUFBTTJELEVBQU0wRyxHQUFzQnJLLEVBQUlpSyxFQUFVNUgsRUFBTTVDLENBQUksRUFDdEQsT0FBQWtFLEdBQU9xSSxZQUFVckksQ0FBRyxHQUNsQkEsRUFBQSxNQUFPa0ksR0FBUSxDQUNMQyxHQUFBRCxFQUFLNUIsRUFBVTVILENBQUksQ0FBQSxDQUNoQyxFQUVJc0IsQ0FDVCxDQUNBLE1BQU01RSxFQUFTLENBQUEsRUFDZixRQUFTTyxFQUFJLEVBQUdBLEVBQUlVLEVBQUcsT0FBUVYsSUFDdEJQLEVBQUEsS0FBS2dOLEdBQTJCL0wsRUFBR1YsQ0FBQyxFQUFHMkssRUFBVTVILEVBQU01QyxDQUFJLENBQUMsRUFFOUQsT0FBQVYsQ0FDVCxDQUNBLFNBQVMrTSxHQUFZRCxFQUFLNUIsRUFBVTVILEVBQU00SixFQUFhLEdBQU0sQ0FDckQsTUFBQUMsRUFBZWpDLEVBQVdBLEVBQVMsTUFBUSxLQUNqRCxHQUFJQSxFQUFVLENBQ1osSUFBSWtDLEVBQU1sQyxFQUFTLE9BQ25CLE1BQU1tQyxFQUFrQm5DLEVBQVMsTUFDM0JvQyxFQUFlLFFBQVEsSUFBSSxXQUFhLGFBQWdCVCxHQUFtQnZKLENBQUksRUFBSSxxQ0FBcUNBLENBQUksR0FDbEksS0FBTzhKLEdBQUssQ0FDVixNQUFNRyxFQUFxQkgsRUFBSSxHQUMvQixHQUFJRyxHQUNGLFFBQVNoTixFQUFJLEVBQUdBLEVBQUlnTixFQUFtQixPQUFRaE4sSUFDN0MsR0FBSWdOLEVBQW1CaE4sQ0FBQyxFQUFFdU0sRUFBS08sRUFBaUJDLENBQVMsSUFBTSxHQUM3RCxPQUlORixFQUFNQSxFQUFJLE1BQ1osQ0FDTSxNQUFBSSxFQUFrQnRDLEVBQVMsV0FBVyxPQUFPLGFBQ25ELEdBQUlzQyxFQUFpQixDQUNuQmxDLEdBQ0VrQyxFQUNBLEtBQ0EsR0FDQSxDQUFDVixFQUFLTyxFQUFpQkMsQ0FBUyxDQUFBLEVBRWxDLE1BQ0YsQ0FDRixDQUNTRyxHQUFBWCxFQUFLeEosRUFBTTZKLEVBQWNELENBQVUsQ0FDOUMsQ0FDQSxTQUFTTyxHQUFTWCxFQUFLeEosRUFBTTZKLEVBQWNELEVBQWEsR0FBTSxDQUM1RCxHQUFPLFFBQVEsSUFBSSxXQUFhLGFBQWUsQ0FDdkMsTUFBQVEsRUFBT2IsR0FBbUJ2SixDQUFJLEVBUXBDLEdBUEk2SixHQUNGckMsR0FBbUJxQyxDQUFZLEVBRWpDbEMsRUFBTyxrQkFBa0J5QyxFQUFPLHdCQUF3QkEsQ0FBSSxHQUFLLEVBQUUsRUFBRSxFQUNqRVAsR0FDZ0JuQyxLQUVoQmtDLEVBQ0ksTUFBQUosRUFFTixRQUFRLE1BQU1BLENBQUcsQ0FDbkIsTUFFQSxRQUFRLE1BQU1BLENBQUcsQ0FFckIsQ0FFQSxJQUFJYSxHQUFhLEdBQ2JDLEdBQWlCLEdBQ3JCLE1BQU1DLEVBQVEsQ0FBQSxFQUNkLElBQUlDLEdBQWEsRUFDakIsTUFBTUMsR0FBc0IsQ0FBQSxFQUM1QixJQUFJQyxFQUFxQixLQUNyQkMsR0FBaUIsRUFDckIsTUFBTUMsV0FBMEMsVUFDaEQsSUFBSUMsR0FBc0IsS0FDMUIsTUFBTUMsR0FBa0IsSUFDeEIsU0FBU0MsR0FBU3BOLEVBQUksQ0FDcEIsTUFBTXFOLEVBQUlILElBQXVCRCxHQUMxQixPQUFBak4sRUFBS3FOLEVBQUUsS0FBSyxLQUFPck4sRUFBRyxLQUFLLElBQUksRUFBSUEsQ0FBRSxFQUFJcU4sQ0FDbEQsQ0FDQSxTQUFTQyxHQUFtQkMsRUFBSSxDQUM5QixJQUFJdk8sRUFBUTZOLEdBQWEsRUFDckI1TixFQUFNMk4sRUFBTSxPQUNoQixLQUFPNU4sRUFBUUMsR0FBSyxDQUNaLE1BQUF1TyxFQUFTeE8sRUFBUUMsSUFBUSxFQUN6QndPLEVBQVliLEVBQU1ZLENBQU0sRUFDeEJFLEVBQWNDLEdBQU1GLENBQVMsRUFDL0JDLEVBQWNILEdBQU1HLElBQWdCSCxHQUFNRSxFQUFVLElBQ3REek8sRUFBUXdPLEVBQVMsRUFFWHZPLEVBQUF1TyxDQUVWLENBQ08sT0FBQXhPLENBQ1QsQ0FDQSxTQUFTNE8sR0FBU0MsRUFBSyxFQUNqQixDQUFDakIsRUFBTSxRQUFVLENBQUNBLEVBQU0sU0FDMUJpQixFQUNBbkIsSUFBY21CLEVBQUksYUFBZWhCLEdBQWEsRUFBSUEsRUFBQSxLQUU5Q2dCLEVBQUksSUFBTSxLQUNaakIsRUFBTSxLQUFLaUIsQ0FBRyxFQUVkakIsRUFBTSxPQUFPVSxHQUFtQk8sRUFBSSxFQUFFLEVBQUcsRUFBR0EsQ0FBRyxFQUV0Q0MsS0FFZixDQUNBLFNBQVNBLElBQWEsQ0FDaEIsQ0FBQ3BCLElBQWMsQ0FBQ0MsS0FDREEsR0FBQSxHQUNLTyxHQUFBRCxHQUFnQixLQUFLYyxFQUFTLEVBRXhELENBT0EsU0FBU0MsR0FBaUJDLEVBQUksQ0FDdkJyTCxFQUFBQSxRQUFRcUwsQ0FBRSxFQVFPbkIsR0FBQSxLQUFLLEdBQUdtQixDQUFFLEdBUDFCLENBQUNsQixHQUFzQixDQUFDQSxFQUFtQixTQUM3Q2tCLEVBQ0FBLEVBQUcsYUFBZWpCLEdBQWlCLEVBQUlBLEVBQUEsSUFFdkNGLEdBQW9CLEtBQUttQixDQUFFLEVBS3BCSCxJQUNiLENBb0JBLFNBQVNJLEdBQWtCQyxFQUFNLENBQy9CLEdBQUlyQixHQUFvQixPQUFRLENBQzlCLE1BQU1zQixFQUFVLENBQUMsR0FBRyxJQUFJLElBQUl0QixFQUFtQixDQUFDLEVBQUUsS0FDaEQsQ0FBQ3VCLEVBQUdDLElBQU1YLEdBQU1VLENBQUMsRUFBSVYsR0FBTVcsQ0FBQyxDQUFBLEVBRzlCLEdBREF4QixHQUFvQixPQUFTLEVBQ3pCQyxFQUFvQixDQUNIQSxFQUFBLEtBQUssR0FBR3FCLENBQU8sRUFDbEMsTUFDRixDQUtBLElBSnFCckIsRUFBQXFCLEVBQ2QsUUFBUSxJQUFJLFdBQWEsZUFDdkJELEVBQUFBLE9BQTRCLEtBRWhDbkIsR0FBaUIsRUFBR0EsR0FBaUJELEVBQW1CLE9BQVFDLEtBQzVELFFBQVEsSUFBSSxXQUFhLGNBQWlCdUIsR0FBc0JKLEVBQU1wQixFQUFtQkMsRUFBYyxDQUFDLEdBRy9HRCxFQUFtQkMsRUFBYyxJQUVkRCxFQUFBLEtBQ0pDLEdBQUEsQ0FDbkIsQ0FDRixDQUNBLE1BQU1XLEdBQVNFLEdBQVFBLEVBQUksSUFBTSxLQUFPLElBQVdBLEVBQUksR0FDakRXLEdBQWEsQ0FBQ0gsRUFBR0MsSUFBTSxDQUMzQixNQUFNRyxFQUFPZCxHQUFNVSxDQUFDLEVBQUlWLEdBQU1XLENBQUMsRUFDL0IsR0FBSUcsSUFBUyxFQUFHLENBQ1YsR0FBQUosRUFBRSxLQUFPLENBQUNDLEVBQUUsSUFDUCxNQUFBLEdBQ0wsR0FBQUEsRUFBRSxLQUFPLENBQUNELEVBQUUsSUFDUCxNQUFBLEVBQ1gsQ0FDTyxPQUFBSSxDQUNULEVBQ0EsU0FBU1YsR0FBVUksRUFBTSxDQUNOeEIsR0FBQSxHQUNKRCxHQUFBLEdBQ04sUUFBUSxJQUFJLFdBQWEsZUFDdkJ5QixFQUFBQSxPQUE0QixLQUVyQ3ZCLEVBQU0sS0FBSzRCLEVBQVUsRUFDckIsTUFBTUUsRUFBVyxRQUFRLElBQUksV0FBYSxhQUFpQmIsR0FBUVUsR0FBc0JKLEVBQU1OLENBQUcsRUFBSWMsRUFBQUEsS0FDbEcsR0FBQSxDQUNGLElBQUs5QixHQUFhLEVBQUdBLEdBQWFELEVBQU0sT0FBUUMsS0FBYyxDQUN0RCxNQUFBZ0IsRUFBTWpCLEVBQU1DLEVBQVUsRUFDeEIsR0FBQWdCLEdBQU9BLEVBQUksU0FBVyxHQUFPLENBQzNCLEdBQUcsUUFBUSxJQUFJLFdBQWEsY0FBaUJhLEVBQU1iLENBQUcsRUFDeEQsU0FFb0J4RCxHQUFBd0QsRUFBSyxLQUFNLEVBQUUsQ0FDckMsQ0FDRixDQUFBLFFBQ0EsQ0FDYWhCLEdBQUEsRUFDYkQsRUFBTSxPQUFTLEVBQ2ZzQixHQUFrQkMsQ0FBSSxFQUNUekIsR0FBQSxHQUNTUSxHQUFBLE1BQ2xCTixFQUFNLFFBQVVFLEdBQW9CLFNBQ3RDaUIsR0FBVUksQ0FBSSxDQUVsQixDQUNGLENBQ0EsU0FBU0ksR0FBc0JKLEVBQU1uTyxFQUFJLENBQ3ZDLEdBQUksQ0FBQ21PLEVBQUssSUFBSW5PLENBQUUsRUFDVG1PLEVBQUEsSUFBSW5PLEVBQUksQ0FBQyxNQUNULENBQ0MsTUFBQTRPLEVBQVFULEVBQUssSUFBSW5PLENBQUUsRUFDekIsR0FBSTRPLEVBQVF6QixHQUFpQixDQUMzQixNQUFNbEQsRUFBV2pLLEVBQUcsY0FDZDZPLEVBQWdCNUUsR0FBWTZFLEdBQWlCN0UsRUFBUyxJQUFJLEVBQ2hFLE9BQUE2QixHQUNFLHFDQUFxQytDLEVBQWdCLGtCQUFrQkEsQ0FBYSxJQUFNLEVBQUUsK05BQzVGLEtBQ0EsRUFBQSxFQUVLLEVBQUEsTUFFRlYsRUFBQSxJQUFJbk8sRUFBSTRPLEVBQVEsQ0FBQyxDQUUxQixDQUNGLENBR0EsTUFBTUcsT0FBeUMsSUFDeEMsUUFBUSxJQUFJLFdBQWEsZUFDOUJDLEVBQUEsY0FBQSxFQUFnQixvQkFBc0IsQ0FDcEMsYUFBY0MsR0FBUUMsRUFBWSxFQUNsQyxTQUFVRCxHQUFRRSxFQUFRLEVBQzFCLE9BQVFGLEdBQVFHLEVBQU0sQ0FBQSxHQUcxQixNQUFNQyxPQUEwQixJQWFoQyxTQUFTSCxHQUFhM0IsRUFBSStCLEVBQVksQ0FDaEMsT0FBQUQsR0FBSSxJQUFJOUIsQ0FBRSxFQUNMLElBRVQ4QixHQUFJLElBQUk5QixFQUFJLENBQ1YsV0FBWWdDLEdBQXdCRCxDQUFVLEVBQzlDLGNBQStCLEdBQUksQ0FDcEMsRUFDTSxHQUNULENBQ0EsU0FBU0MsR0FBd0JDLEVBQVcsQ0FDMUMsT0FBT0MsR0FBaUJELENBQVMsRUFBSUEsRUFBVSxVQUFZQSxDQUM3RCxDQUNBLFNBQVNMLEdBQVM1QixFQUFJbUMsRUFBVyxDQUN6QixNQUFBQyxFQUFTTixHQUFJLElBQUk5QixDQUFFLEVBQ3BCb0MsSUFHTEEsRUFBTyxXQUFXLE9BQVNELEVBQzNCLENBQUMsR0FBR0MsRUFBTyxTQUFTLEVBQUUsUUFBUzFGLEdBQWEsQ0FDdEN5RixJQUNGekYsRUFBUyxPQUFTeUYsRUFDTUgsR0FBQXRGLEVBQVMsSUFBSSxFQUFFLE9BQVN5RixHQUVsRHpGLEVBQVMsWUFBYyxHQUV2QkEsRUFBUyxPQUFPLE1BQVEsR0FDeEJBLEVBQVMsT0FBTyxDQUNBLENBQ2pCLEVBQ0gsQ0FDQSxTQUFTbUYsR0FBTzdCLEVBQUlxQyxFQUFTLENBQ3JCLE1BQUFELEVBQVNOLEdBQUksSUFBSTlCLENBQUUsRUFDekIsR0FBSSxDQUFDb0MsRUFDSCxPQUNGQyxFQUFVTCxHQUF3QkssQ0FBTyxFQUN0QkMsR0FBQUYsRUFBTyxXQUFZQyxDQUFPLEVBQzdDLE1BQU1FLEVBQVksQ0FBQyxHQUFHSCxFQUFPLFNBQVMsRUFDdEMsVUFBVzFGLEtBQVk2RixFQUFXLENBQzFCLE1BQUFDLEVBQVVSLEdBQXdCdEYsRUFBUyxJQUFJLEVBQ2hEOEUsR0FBbUIsSUFBSWdCLENBQU8sSUFDN0JBLElBQVlKLEVBQU8sWUFDckJFLEdBQW1CRSxFQUFTSCxDQUFPLEVBRXJDYixHQUFtQixJQUFJZ0IsQ0FBTyxHQUVoQzlGLEVBQVMsV0FBVyxXQUFXLE9BQU9BLEVBQVMsSUFBSSxFQUNuREEsRUFBUyxXQUFXLFdBQVcsT0FBT0EsRUFBUyxJQUFJLEVBQ25EQSxFQUFTLFdBQVcsYUFBYSxPQUFPQSxFQUFTLElBQUksRUFDakRBLEVBQVMsVUFDWDhFLEdBQW1CLElBQUlnQixDQUFPLEVBQ3JCOUYsRUFBQSxTQUFTMkYsRUFBUSxNQUFNLEVBQ2hDYixHQUFtQixPQUFPZ0IsQ0FBTyxHQUN4QjlGLEVBQVMsUUFDVEEsRUFBQSxPQUFPLE9BQU8sTUFBUSxHQUN0QjJELEdBQUEzRCxFQUFTLE9BQU8sTUFBTSxHQUN0QkEsRUFBUyxXQUFXLE9BQzdCQSxFQUFTLFdBQVcsU0FDWCxPQUFPLE9BQVcsSUFDM0IsT0FBTyxTQUFTLFNBRVIsUUFBQSxLQUNOLHlFQUFBLENBR04sQ0FDQStELEdBQWlCLElBQU0sQ0FDckIsVUFBVy9ELEtBQVk2RixFQUNGZixHQUFBLE9BQ2pCUSxHQUF3QnRGLEVBQVMsSUFBSSxDQUFBLENBRXpDLENBQ0QsQ0FDSCxDQUNBLFNBQVM0RixHQUFtQkUsRUFBU0gsRUFBUyxDQUM1Q2xPLFNBQU9xTyxFQUFTSCxDQUFPLEVBQ3ZCLFVBQVd0TixLQUFPeU4sRUFDWnpOLElBQVEsVUFBWSxFQUFFQSxLQUFPc04sSUFDL0IsT0FBT0csRUFBUXpOLENBQUcsQ0FHeEIsQ0FDQSxTQUFTMk0sR0FBUWpQLEVBQUksQ0FDWixNQUFBLENBQUN1TixFQUFJeUMsSUFBUSxDQUNkLEdBQUEsQ0FDSyxPQUFBaFEsRUFBR3VOLEVBQUl5QyxDQUFHLFFBQ1ZDLEVBQUcsQ0FDVixRQUFRLE1BQU1BLENBQUMsRUFDUCxRQUFBLEtBQ04sbUZBQUEsQ0FFSixDQUFBLENBRUosQ0FFQSxJQUFJQyxHQUNBQyxHQUFTLENBQUEsRUFDVEMsR0FBdUIsR0FDM0IsU0FBU0MsR0FBT0MsS0FBVTdRLEVBQU0sQ0FDMUJ5USxHQUNTQSxHQUFBLEtBQUtJLEVBQU8sR0FBRzdRLENBQUksRUFDcEIyUSxJQUNWRCxHQUFPLEtBQUssQ0FBRSxNQUFBRyxFQUFPLEtBQUE3USxDQUFNLENBQUEsQ0FFL0IsQ0FDQSxTQUFTOFEsR0FBa0JDLEVBQU1wTyxFQUFRLENBQ3ZDLElBQUl4RCxFQUFJNlIsRUFDS1AsR0FBQU0sRUFDVE4sSUFDRkEsR0FBVyxRQUFVLEdBQ2RDLEdBQUEsUUFBUSxDQUFDLENBQUUsTUFBQUcsRUFBTyxLQUFBN1EsQ0FBQSxJQUFXeVEsR0FBVyxLQUFLSSxFQUFPLEdBQUc3USxDQUFJLENBQUMsRUFDbkUwUSxHQUFTLENBQUEsR0FLVCxPQUFPLE9BQVcsS0FDbEIsT0FBTyxhQUNQLEdBQUdNLEdBQU03UixFQUFLLE9BQU8sWUFBYyxLQUFPLE9BQVNBLEVBQUcsWUFBYyxNQUFnQjZSLEVBQUcsU0FBUyxPQUFPLEtBRXhGck8sRUFBTyw2QkFBK0JBLEVBQU8sOEJBQWdDLENBQUEsR0FDckYsS0FBTXNPLEdBQVksQ0FDdkJILEdBQWtCRyxFQUFTdE8sQ0FBTSxDQUFBLENBQ2xDLEVBQ0QsV0FBVyxJQUFNLENBQ1Y4TixLQUNIOU4sRUFBTyw2QkFBK0IsS0FDZmdPLEdBQUEsR0FDdkJELEdBQVMsQ0FBQSxJQUVWLEdBQUcsSUFFaUJDLEdBQUEsR0FDdkJELEdBQVMsQ0FBQSxFQUViLENBZUEsTUFBTVEsR0FBMkNDLEdBQTRCLG1CQUEyQyxFQVV4SCxTQUFTQSxHQUE0QkosRUFBTSxDQUN6QyxPQUFRaEIsR0FBYyxDQUNwQmEsR0FDRUcsRUFDQWhCLEVBQVUsV0FBVyxJQUNyQkEsRUFBVSxJQUNWQSxFQUFVLE9BQVNBLEVBQVUsT0FBTyxJQUFNLE9BQzFDQSxDQUFBLENBQ0YsQ0FFSixDQWlLQSxJQUFJcUIsRUFBMkIsS0FDM0JDLEdBQWlCLEtBQ3JCLFNBQVNDLEdBQTRCOUcsRUFBVSxDQUM3QyxNQUFNK0csRUFBT0gsRUFDYyxPQUFBQSxFQUFBNUcsRUFDVjZHLEdBQUE3RyxHQUFZQSxFQUFTLEtBQUssV0FBYSxLQUNqRCtHLENBQ1QsQ0FRQSxTQUFTQyxFQUFRalIsRUFBSWtSLEVBQU1MLEVBQTBCTSxFQUFpQixDQUdwRSxHQUZJLENBQUNELEdBRURsUixFQUFHLEdBQ0UsT0FBQUEsRUFFSCxNQUFBb1IsRUFBc0IsSUFBSTNSLElBQVMsQ0FDbkMyUixFQUFvQixJQUN0QkMsR0FBaUIsRUFBRSxFQUVmLE1BQUFDLEVBQWVQLEdBQTRCRyxDQUFHLEVBQ2hELElBQUF2TixFQUNBLEdBQUEsQ0FDSUEsRUFBQTNELEVBQUcsR0FBR1AsQ0FBSSxDQUFBLFFBQ2hCLENBQ0FzUixHQUE0Qk8sQ0FBWSxFQUNwQ0YsRUFBb0IsSUFDdEJDLEdBQWlCLENBQUMsQ0FFdEIsQ0FDQSxPQUFPLFFBQVEsSUFBSSxXQUFhLGNBQzlCVixHQUF5Qk8sQ0FBRyxFQUV2QnZOLENBQUEsRUFFVCxPQUFBeU4sRUFBb0IsR0FBSyxHQUN6QkEsRUFBb0IsR0FBSyxHQUN6QkEsRUFBb0IsR0FBSyxHQUNsQkEsQ0FDVCxDQUdBLFNBQVNHLElBQW9CLENBRTdCLENBMlJBLE1BQU1DLEdBQWEsYUFFbkIsU0FBU0MsRUFBaUJDLEVBQU1DLEVBQW9CLENBQ2xELE9BQU9DLEdBQWFKLEdBQVlFLEVBQU0sR0FBTUMsQ0FBa0IsR0FBS0QsQ0FDckUsQ0FDQSxNQUFNRyxHQUF5QixPQUFPLElBQUksT0FBTyxFQVdqRCxTQUFTRCxHQUFhdlAsRUFBTXFQLEVBQU1JLEVBQWMsR0FBTUgsRUFBcUIsR0FBTyxDQUNoRixNQUFNMUgsRUFBVzRHLEdBQTRCa0IsR0FDN0MsR0FBSTlILEVBQVUsQ0FDWixNQUFNK0gsRUFBWS9ILEVBQVMsS0FDM0IsR0FBSTVILElBQVNtUCxHQUFZLENBQ3ZCLE1BQU1TLEVBQVduRCxHQUNma0QsRUFDQSxFQUFBLEVBRUYsR0FBSUMsSUFBYUEsSUFBYVAsR0FBUU8sSUFBYUMsRUFBQUEsU0FBU1IsQ0FBSSxHQUFLTyxJQUFhMUssRUFBQUEsV0FBVzJLLEVBQUFBLFNBQVNSLENBQUksQ0FBQyxHQUNsRyxPQUFBTSxDQUVYLENBQ00sTUFBQXJPLEVBR0p3TyxHQUFRbEksRUFBUzVILENBQUksR0FBSzJQLEVBQVUzUCxDQUFJLEVBQUdxUCxDQUFJLEdBQy9DUyxHQUFRbEksRUFBUyxXQUFXNUgsQ0FBSSxFQUFHcVAsQ0FBSSxFQUVyQyxHQUFBLENBQUMvTixHQUFPZ08sRUFDSCxPQUFBSyxFQUVMLEdBQUcsUUFBUSxJQUFJLFdBQWEsY0FBaUJGLEdBQWUsQ0FBQ25PLEVBQUssQ0FDOUQsTUFBQXlPLEVBQVEvUCxJQUFTbVAsR0FBYTtBQUFBLDRIQUNvRixHQUNqSHhILEVBQUEscUJBQXFCM0gsRUFBSyxNQUFNLEVBQUcsRUFBRSxDQUFDLEtBQUtxUCxDQUFJLEdBQUdVLENBQUssRUFBRSxDQUNsRSxDQUNPLE9BQUF6TyxDQUFBLE1BQ0ssUUFBUSxJQUFJLFdBQWEsY0FDckNxRyxFQUNFLFVBQVV6QyxFQUFXLFdBQUFsRixFQUFLLE1BQU0sRUFBRyxFQUFFLENBQUMsQ0FBQywyQ0FBQSxDQUc3QyxDQUNBLFNBQVM4UCxHQUFRRSxFQUFVWCxFQUFNLENBQy9CLE9BQU9XLElBQWFBLEVBQVNYLENBQUksR0FBS1csRUFBU0gsRUFBQUEsU0FBU1IsQ0FBSSxDQUFDLEdBQUtXLEVBQVM5SyxFQUFBQSxXQUFXMkssRUFBQUEsU0FBU1IsQ0FBSSxDQUFDLENBQUMsRUFDdkcsQ0FFQSxNQUFNWSxHQUFjalEsR0FBU0EsRUFBSyxhQWtqQmxDLFNBQVNrUSxHQUF3QnZTLEVBQUl3UyxFQUFVLENBQ3pDQSxHQUFZQSxFQUFTLGNBQ25CNVAsRUFBQUEsUUFBUTVDLENBQUUsRUFDSHdTLEVBQUEsUUFBUSxLQUFLLEdBQUd4UyxDQUFFLEVBRWxCd1MsRUFBQSxRQUFRLEtBQUt4UyxDQUFFLEVBRzFCZ08sR0FBaUJoTyxDQUFFLENBRXZCLENBb0JBLE1BQU15UyxHQUFnQixPQUFPLElBQUksT0FBTyxFQUNsQ0MsR0FBZ0IsSUFBTSxDQUMxQixDQUNRLE1BQUF4QixFQUFNeUIsR0FBT0YsRUFBYSxFQUNoQyxPQUFLdkIsR0FDQSxRQUFRLElBQUksV0FBYSxjQUFpQmxILEVBQzNDLGtIQUFBLEVBR0drSCxDQUNULENBQ0YsRUFtQk0wQixHQUF3QixDQUFBLEVBUzlCLFNBQVNDLEdBQVFDLEVBQVE3RSxFQUFJLENBQzNCLFVBQUE4RSxFQUNBLEtBQUFDLEVBQ0EsTUFBQUMsRUFDQSxLQUFBQyxFQUNBLFFBQUFDLEVBQ0EsVUFBQUMsQ0FDRixFQUFJQyxZQUFXLENBQ2IsR0FBSXBGLEdBQU1pRixFQUFNLENBQ2QsTUFBTUksRUFBTXJGLEVBQ1pBLEVBQUssSUFBSXhPLEtBQVMsQ0FDaEI2VCxFQUFJLEdBQUc3VCxFQUFJLEVBQ0g4VCxHQUFBLENBRVosQ0FDTyxRQUFRLElBQUksV0FBYSxjQUFpQlAsSUFBUyxRQUFVLE9BQU9BLEdBQVMsVUFDbEZoSixFQUNFLG1KQUFBLEVBR0csUUFBUSxJQUFJLFdBQWEsY0FBaUIsQ0FBQ2lFLElBQzVDOEUsSUFBYyxRQUNoQi9JLEVBQ0UsMEdBQUEsRUFHQWdKLElBQVMsUUFDWGhKLEVBQ0UscUdBQUEsRUFHQWtKLElBQVMsUUFDWGxKLEVBQ0UscUdBQUEsR0FJQSxNQUFBd0osRUFBcUJDLEdBQU0sQ0FDL0J6SixFQUNFLHlCQUNBeUosRUFDQSw0R0FBQSxDQUNGLEVBRUl4SixFQUFXOEgsR0FDWDJCLEVBQWtCQyxHQUFZWCxJQUFTLEdBQU9XLEVBRWxEQyxHQUFTRCxFQUFTWCxJQUFTLEdBQVEsRUFBSSxNQUFNLEVBRTNDLElBQUFhLEVBQ0FDLEVBQWUsR0FDZkMsRUFBZ0IsR0F5Q3BCLEdBeENJclAsRUFBTW9PLENBQU0sR0FDZGUsRUFBUyxJQUFNZixFQUFPLE1BQ3RCZ0IsRUFBZUUsR0FBWWxCLENBQU0sR0FDeEI3SixHQUFXNkosQ0FBTSxHQUNqQmUsRUFBQSxJQUFNSCxFQUFlWixDQUFNLEVBQ3JCZ0IsRUFBQSxJQUNObFIsRUFBQUEsUUFBUWtRLENBQU0sR0FDUGlCLEVBQUEsR0FDREQsRUFBQWhCLEVBQU8sS0FBTVcsR0FBTXhLLEdBQVd3SyxDQUFDLEdBQUtPLEdBQVlQLENBQUMsQ0FBQyxFQUNqRUksRUFBUyxJQUFNZixFQUFPLElBQUtXLEdBQU0sQ0FDM0IsR0FBQS9PLEVBQU0rTyxDQUFDLEVBQ1QsT0FBT0EsRUFBRSxNQUNYLEdBQVd4SyxHQUFXd0ssQ0FBQyxFQUNyQixPQUFPQyxFQUFlRCxDQUFDLEVBQ3pCLEdBQVdoSSxFQUFBQSxXQUFXZ0ksQ0FBQyxFQUNkLE9BQUFwSixHQUFzQm9KLEVBQUd4SixFQUFVLENBQUMsRUFFeEMsUUFBUSxJQUFJLFdBQWEsY0FBaUJ1SixFQUFrQkMsQ0FBQyxDQUNsRSxDQUNELEdBQ1FoSSxFQUFBQSxXQUFXcUgsQ0FBTSxFQUN0QjdFLEVBQ0Y0RixFQUFTLElBQU14SixHQUFzQnlJLEVBQVE3SSxFQUFVLENBQUMsRUFFeEQ0SixFQUFTLEtBQ0g5UixHQUNNQSxJQUVIZ0ssR0FDTCtHLEVBQ0E3SSxFQUNBLEVBQ0EsQ0FBQ2dLLENBQVMsQ0FBQSxJQUtQSixFQUFBbEYsRUFBQUEsS0FDTixRQUFRLElBQUksV0FBYSxjQUFpQjZFLEVBQWtCVixDQUFNLEdBRW5FN0UsR0FBTStFLEVBQU0sQ0FDZCxNQUFNa0IsRUFBYUwsRUFDVkEsRUFBQSxJQUFNRCxHQUFTTSxFQUFBLENBQVksQ0FDdEMsQ0FDSSxJQUFBblMsRUFDQWtTLEVBQWFqVSxHQUFPLENBQ1pKLEVBQUFBLEVBQU8sT0FBUyxJQUFNLENBQ1J5SyxHQUFBckssRUFBSWlLLEVBQVUsQ0FBQyxFQUNyQ2xJLEVBQVVuQyxFQUFPLE9BQVMsTUFBQSxDQUM1QixFQUVFdVUsRUFDSixHQUFJQyxHQVdGLEdBVllILEVBQUF0RixFQUFBQSxLQUNQVixFQUVNOEUsR0FDa0JoSCxHQUFBa0MsRUFBSWhFLEVBQVUsRUFBRyxDQUMxQzRKLEVBQU8sRUFDUEUsRUFBZ0IsQ0FBSyxFQUFBLE9BQ3JCRSxDQUFBLENBQ0QsRUFOTUosSUFRTFosSUFBVSxPQUFRLENBQ3BCLE1BQU0vQixFQUFNd0IsS0FDWnlCLEVBQWFqRCxFQUFJLG1CQUFxQkEsRUFBSSxpQkFBbUIsQ0FBQyxFQUFBLEtBRXZELFFBQUF2QyxPQUdQLElBQUFsTSxFQUFXc1IsRUFBZ0IsSUFBSSxNQUFNakIsRUFBTyxNQUFNLEVBQUUsS0FBS0YsRUFBcUIsRUFBSUEsR0FDdEYsTUFBTS9FLEVBQU0sSUFBTSxDQUNoQixHQUFJLEdBQUNqTyxFQUFPLFFBQVUsQ0FBQ0EsRUFBTyxPQUc5QixHQUFJcU8sRUFBSSxDQUNBLE1BQUF6TCxFQUFXNUMsRUFBTyxPQUNwQm9ULEdBQVFjLElBQWlCQyxFQUFnQnZSLEVBQVMsS0FBSyxDQUFDakMsR0FBR2pCLElBQU04RixFQUFBLFdBQVc3RSxHQUFHa0MsRUFBU25ELENBQUMsQ0FBQyxDQUFDLEVBQUk4RixFQUFBQSxXQUFXNUMsRUFBVUMsQ0FBUSxNQUMxSFYsR0FDTUEsSUFFaUJnSyxHQUFBa0MsRUFBSWhFLEVBQVUsRUFBRyxDQUMxQ3pILEVBRUFDLElBQWFtUSxHQUF3QixPQUFTbUIsR0FBaUJ0UixFQUFTLENBQUMsSUFBTW1RLEdBQXdCLENBQUEsRUFBS25RLEVBQzVHd1IsQ0FBQSxDQUNELEVBQ1V4UixFQUFBRCxFQUNiLE1BRUE1QyxFQUFPLElBQUksQ0FDYixFQUVFaU8sRUFBQSxhQUFlLENBQUMsQ0FBQ0ksRUFDakIsSUFBQS9OLEVBQ0ErUyxJQUFVLE9BQ0EvUyxFQUFBMk4sRUFDSG9GLElBQVUsT0FDbkIvUyxFQUFZLElBQU1tVSxHQUFzQnhHLEVBQUs1RCxHQUFZQSxFQUFTLFFBQVEsR0FFMUU0RCxFQUFJLElBQU0sR0FDTjVELElBQ0Y0RCxFQUFJLEdBQUs1RCxFQUFTLEtBQ1IvSixFQUFBLElBQU0wTixHQUFTQyxDQUFHLEdBRWhDLE1BQU1qTyxFQUFTLElBQUlHLEdBQWU4VCxFQUFRbEYsT0FBTXpPLENBQVMsRUFFbkRxVCxFQUFVLElBQU0sQ0FDcEIzVCxFQUFPLEtBQUssQ0FHWixFQUVGLE9BQU8sUUFBUSxJQUFJLFdBQWEsZUFDOUJBLEVBQU8sUUFBVXVULEVBQ2pCdlQsRUFBTyxVQUFZd1QsR0FFakJuRixFQUNFOEUsRUFDRWxGLElBRUpwTCxFQUFXN0MsRUFBTyxNQUVYcVQsSUFBVSxPQUNuQm9CLEdBQ0V6VSxFQUFPLElBQUksS0FBS0EsQ0FBTSxFQUN0QnFLLEdBQVlBLEVBQVMsUUFBQSxFQUd2QnJLLEVBQU8sSUFBSSxFQUVUdVUsR0FDRkEsRUFBVyxLQUFLWixDQUFPLEVBQ2xCQSxDQUNULENBQ0EsU0FBU2UsR0FBY3hCLEVBQVE1VCxFQUFPcVYsRUFBUyxDQUM3QyxNQUFNQyxFQUFhLEtBQUssTUFDbEJYLEVBQVNySSxFQUFTLFNBQUFzSCxDQUFNLEVBQUlBLEVBQU8sU0FBUyxHQUFHLEVBQUkyQixHQUFpQkQsRUFBWTFCLENBQU0sRUFBSSxJQUFNMEIsRUFBVzFCLENBQU0sRUFBSUEsRUFBTyxLQUFLMEIsRUFBWUEsQ0FBVSxFQUN6SixJQUFBdkcsRUFDQXhDLEVBQUFBLFdBQVd2TSxDQUFLLEVBQ2IrTyxFQUFBL08sR0FFTCtPLEVBQUsvTyxFQUFNLFFBQ0RxVixFQUFBclYsR0FFTixNQUFBd1YsRUFBUUMsR0FBbUIsSUFBSSxFQUMvQmhSLEVBQU1rUCxHQUFRZ0IsRUFBUTVGLEVBQUcsS0FBS3VHLENBQVUsRUFBR0QsQ0FBTyxFQUNsRCxPQUFBRyxJQUNDL1EsQ0FDVCxDQUNBLFNBQVM4USxHQUFpQnZELEVBQUswRCxFQUFNLENBQzdCLE1BQUFDLEVBQVdELEVBQUssTUFBTSxHQUFHLEVBQy9CLE1BQU8sSUFBTSxDQUNYLElBQUl6SSxFQUFNK0UsRUFDVixRQUFTLEVBQUksRUFBRyxFQUFJMkQsRUFBUyxRQUFVMUksRUFBSyxJQUNwQ0EsRUFBQUEsRUFBSTBJLEVBQVMsQ0FBQyxDQUFDLEVBRWhCLE9BQUExSSxDQUFBLENBRVgsQ0FDQSxTQUFTeUgsR0FBUzFVLEVBQU80VixFQUFPQyxFQUFlLEVBQUc1RyxFQUFNLENBQ3RELEdBQUksQ0FBQ3hKLEVBQUFBLFNBQVN6RixDQUFLLEdBQUtBLEVBQU0sU0FDckIsT0FBQUEsRUFFTCxHQUFBNFYsR0FBU0EsRUFBUSxFQUFHLENBQ3RCLEdBQUlDLEdBQWdCRCxFQUNYLE9BQUE1VixFQUVUNlYsR0FDRixDQUVJLEdBREc1RyxFQUFBQSxPQUE0QixJQUMvQkEsRUFBSyxJQUFJalAsQ0FBSyxFQUNULE9BQUFBLEVBR0wsR0FESmlQLEVBQUssSUFBSWpQLENBQUssRUFDVndGLEVBQU14RixDQUFLLEVBQ2IwVSxHQUFTMVUsRUFBTSxNQUFPNFYsRUFBT0MsRUFBYzVHLENBQUksVUFDdEN2TCxFQUFBQSxRQUFRMUQsQ0FBSyxFQUN0QixRQUFTLEVBQUksRUFBRyxFQUFJQSxFQUFNLE9BQVEsSUFDaEMwVSxHQUFTMVUsRUFBTSxDQUFDLEVBQUc0VixFQUFPQyxFQUFjNUcsQ0FBSSxVQUVyQzZHLEVBQUFBLE1BQU05VixDQUFLLEdBQUsrRCxFQUFBLE1BQU0vRCxDQUFLLEVBQzlCQSxFQUFBLFFBQVNxQixHQUFNLENBQ1ZxVCxHQUFBclQsRUFBR3VVLEVBQU9DLEVBQWM1RyxDQUFJLENBQUEsQ0FDdEMsVUFDUThHLEVBQUFBLGNBQWMvVixDQUFLLEVBQzVCLFVBQVdvRCxLQUFPcEQsRUFDaEIwVSxHQUFTMVUsRUFBTW9ELENBQUcsRUFBR3dTLEVBQU9DLEVBQWM1RyxDQUFJLEVBRzNDLE9BQUFqUCxDQUNULENBT0EsU0FBU2dXLEdBQWVwTCxFQUFPcUwsRUFBWSxDQUN6QyxHQUFJdEUsSUFBNkIsS0FDL0IsT0FBRyxRQUFRLElBQUksV0FBYSxjQUFpQjdHLEVBQU8sMERBQTBELEVBQ3ZHRixFQUVULE1BQU1HLEVBQVdtTCxHQUFldkUsQ0FBd0IsR0FBS0EsRUFBeUIsTUFDaEZ3RSxFQUFXdkwsRUFBTSxPQUFTQSxFQUFNLEtBQU8sQ0FBQSxHQUM3QyxRQUFTLEVBQUksRUFBRyxFQUFJcUwsRUFBVyxPQUFRLElBQUssQ0FDdEMsR0FBQSxDQUFDRyxFQUFLcFcsRUFBTzhRLEVBQUt1RixFQUFZbEMsV0FBUyxFQUFJOEIsRUFBVyxDQUFDLEVBQ3ZERyxJQUNFN0osRUFBQUEsV0FBVzZKLENBQUcsSUFDVkEsRUFBQSxDQUNKLFFBQVNBLEVBQ1QsUUFBU0EsQ0FBQSxHQUdUQSxFQUFJLE1BQ04xQixHQUFTMVUsQ0FBSyxFQUVoQm1XLEVBQVMsS0FBSyxDQUNaLElBQUFDLEVBQ0EsU0FBQXJMLEVBQ0EsTUFBQS9LLEVBQ0EsU0FBVSxPQUNWLElBQUE4USxFQUNBLFVBQUF1RixDQUFBLENBQ0QsRUFFTCxDQUNPLE9BQUF6TCxDQUNULENBdUJBLE1BQU0wTCxHQUFhLE9BQU8sVUFBVSxFQUM5QkMsR0FBYSxPQUFPLFVBQVUsRUFDcEMsU0FBU0MsSUFBcUIsQ0FDNUIsTUFBTUMsRUFBUSxDQUNaLFVBQVcsR0FDWCxVQUFXLEdBQ1gsYUFBYyxHQUNkLGtCQUFtQyxHQUFJLEVBRXpDLE9BQUFDLEdBQVUsSUFBTSxDQUNkRCxFQUFNLFVBQVksRUFBQSxDQUNuQixFQUNERSxHQUFnQixJQUFNLENBQ3BCRixFQUFNLGFBQWUsRUFBQSxDQUN0QixFQUNNQSxDQUNULENBQ0EsTUFBTUcsRUFBMEIsQ0FBQyxTQUFVLEtBQUssRUFDMUNDLEdBQWdDLENBQ3BDLEtBQU0sT0FDTixPQUFRLFFBQ1IsVUFBVyxRQUVYLGNBQWVELEVBQ2YsUUFBU0EsRUFDVCxhQUFjQSxFQUNkLGlCQUFrQkEsRUFFbEIsY0FBZUEsRUFDZixRQUFTQSxFQUNULGFBQWNBLEVBQ2QsaUJBQWtCQSxFQUVsQixlQUFnQkEsRUFDaEIsU0FBVUEsRUFDVixjQUFlQSxFQUNmLGtCQUFtQkEsQ0FDckIsRUFxR01FLEdBcEdxQixDQUN6QixLQUFNLGlCQUNOLE1BQU9ELEdBQ1AsTUFBTTFLLEVBQU8sQ0FBRSxNQUFBNEssR0FBUyxDQUN0QixNQUFNaE0sRUFBV2lNLEtBQ1hQLEVBQVFELEtBQ1YsSUFBQVMsRUFDSixNQUFPLElBQU0sQ0FDWCxNQUFNQyxFQUFXSCxFQUFNLFNBQVdJLEdBQXlCSixFQUFNLFFBQUEsRUFBVyxFQUFJLEVBQ2hGLEdBQUksQ0FBQ0csR0FBWSxDQUFDQSxFQUFTLE9BQ3pCLE9BRUUsSUFBQUUsRUFBUUYsRUFBUyxDQUFDLEVBQ2xCLEdBQUFBLEVBQVMsT0FBUyxFQUFHLENBQ3ZCLElBQUlHLEVBQVcsR0FDZixVQUFXQyxLQUFLSixFQUNWLEdBQUFJLEVBQUUsT0FBU0MsRUFBUyxDQUN0QixHQUFPLFFBQVEsSUFBSSxXQUFhLGNBQWlCRixFQUFVLENBQ3pEdk0sRUFDRSxtR0FBQSxFQUVGLEtBQ0YsQ0FHQSxHQUZRc00sRUFBQUUsRUFDR0QsRUFBQSxHQUNILFFBQVEsSUFBSSxXQUFhLGFBQy9CLEtBQ0osQ0FFSixDQUNNLE1BQUFHLEVBQVdqVCxFQUFNNEgsQ0FBSyxFQUN0QixDQUFFLEtBQUFzTCxDQUFTLEVBQUFELEVBSWpCLEdBSE8sUUFBUSxJQUFJLFdBQWEsY0FBaUJDLEdBQVFBLElBQVMsVUFBWUEsSUFBUyxVQUFZQSxJQUFTLFdBQ25HM00sRUFBQSw4QkFBOEIyTSxDQUFJLEVBQUUsRUFFekNoQixFQUFNLFVBQ1IsT0FBT2lCLEdBQWlCTixDQUFLLEVBRXpCLE1BQUFPLEVBQWFDLEdBQWtCUixDQUFLLEVBQzFDLEdBQUksQ0FBQ08sRUFDSCxPQUFPRCxHQUFpQk4sQ0FBSyxFQUUvQixNQUFNUyxFQUFhQyxHQUNqQkgsRUFDQUgsRUFDQWYsRUFDQTFMLENBQUEsRUFFRmdOLEdBQW1CSixFQUFZRSxDQUFVLEVBQ3pDLE1BQU1HLEVBQVdqTixFQUFTLFFBQ3BCa04sRUFBZ0JELEdBQVlKLEdBQWtCSSxDQUFRLEVBQzVELElBQUlFLEVBQXVCLEdBQ3JCLEtBQUEsQ0FBRSxpQkFBQUMsQ0FBaUIsRUFBSVIsRUFBVyxLQUN4QyxHQUFJUSxFQUFrQixDQUNwQixNQUFNL1UsRUFBTStVLElBQ1JsQixJQUFzQixPQUNKQSxFQUFBN1QsRUFDWEEsSUFBUTZULElBQ0dBLEVBQUE3VCxFQUNHOFUsRUFBQSxHQUUzQixDQUNJLEdBQUFELEdBQWlCQSxFQUFjLE9BQVNWLElBQVksQ0FBQ2EsR0FBZ0JULEVBQVlNLENBQWEsR0FBS0MsR0FBdUIsQ0FDNUgsTUFBTUcsRUFBZVAsR0FDbkJHLEVBQ0FULEVBQ0FmLEVBQ0ExTCxDQUFBLEVBR0YsR0FEQWdOLEdBQW1CRSxFQUFlSSxDQUFZLEVBQzFDWixJQUFTLFNBQ1gsT0FBQWhCLEVBQU0sVUFBWSxHQUNsQjRCLEVBQWEsV0FBYSxJQUFNLENBQzlCNUIsRUFBTSxVQUFZLEdBQ2QxTCxFQUFTLE9BQU8sU0FBVyxLQUM3QkEsRUFBUyxPQUFPLE1BQVEsR0FDeEJBLEVBQVMsT0FBTyxFQUNsQixFQUVLMk0sR0FBaUJOLENBQUssRUFDcEJLLElBQVMsVUFBWUUsRUFBVyxPQUFTSixJQUNsRGMsRUFBYSxXQUFhLENBQUNDLEVBQUlDLEVBQWFDLElBQWlCLENBQzNELE1BQU1DLEVBQXFCQyxHQUN6QmpDLEVBQ0F3QixDQUFBLEVBRUZRLEVBQW1CLE9BQU9SLEVBQWMsR0FBRyxDQUFDLEVBQUlBLEVBQzdDSyxFQUFBaEMsRUFBVSxFQUFJLElBQU0sQ0FDVGlDLElBQ1pELEVBQUdoQyxFQUFVLEVBQUksT0FDakIsT0FBT3VCLEVBQVcsWUFBQSxFQUVwQkEsRUFBVyxhQUFlVyxDQUFBLEVBR2hDLENBQ08sT0FBQXBCLENBQUEsQ0FFWCxDQUNGLEVBRUEsU0FBU3NCLEdBQXVCakMsRUFBTzdMLEVBQU8sQ0FDdEMsS0FBQSxDQUFFLGNBQUErTixDQUFrQixFQUFBbEMsRUFDMUIsSUFBSWdDLEVBQXFCRSxFQUFjLElBQUkvTixFQUFNLElBQUksRUFDckQsT0FBSzZOLElBQ2tDQSxFQUFBLE9BQU8sT0FBTyxJQUFJLEVBQ3pDRSxFQUFBLElBQUkvTixFQUFNLEtBQU02TixDQUFrQixHQUUzQ0EsQ0FDVCxDQUNBLFNBQVNYLEdBQXVCbE4sRUFBT3VCLEVBQU9zSyxFQUFPMUwsRUFBVSxDQUN2RCxLQUFBLENBQ0osT0FBQTZOLEVBQ0EsS0FBQW5CLEVBQ0EsVUFBQW9CLEVBQVksR0FDWixjQUFBQyxFQUNBLFFBQUFDLEVBQ0EsYUFBQUMsRUFDQSxpQkFBQUMsRUFDQSxjQUFBQyxFQUNBLFFBQUFDLEVBQ0EsYUFBQUMsRUFDQSxpQkFBQUMsRUFDQSxlQUFBQyxFQUNBLFNBQUFDLEVBQ0EsY0FBQUMsRUFDQSxrQkFBQUMsQ0FDRSxFQUFBdE4sRUFDRS9JLEVBQU0sT0FBT3dILEVBQU0sR0FBRyxFQUN0QjZOLEVBQXFCQyxHQUF1QmpDLEVBQU83TCxDQUFLLEVBQ3hEOE8sRUFBVyxDQUFDcEksRUFBTS9RLElBQVMsQ0FDdkIrUSxHQUFBekUsR0FDTnlFLEVBQ0F2RyxFQUNBLEVBQ0F4SyxDQUFBLENBQ0YsRUFFSW9aLEVBQWdCLENBQUNySSxFQUFNL1EsSUFBUyxDQUM5QixNQUFBNEgsRUFBTzVILEVBQUssQ0FBQyxFQUNuQm1aLEVBQVNwSSxFQUFNL1EsQ0FBSSxFQUNmbUQsRUFBQUEsUUFBUTROLENBQUksRUFDVkEsRUFBSyxNQUFPc0ksR0FBVUEsRUFBTSxRQUFVLENBQUMsR0FDcEN6UixJQUNFbUosRUFBSyxRQUFVLEdBQ25CbkosR0FDUCxFQUVJMFIsR0FBUSxDQUNaLEtBQUFwQyxFQUNBLFVBQUFvQixFQUNBLFlBQVlQLEVBQUksQ0FDZCxJQUFJaEgsRUFBT3dILEVBQ1AsR0FBQSxDQUFDckMsRUFBTSxVQUNULEdBQUltQyxFQUNGdEgsRUFBT2dJLEdBQWtCUixNQUV6QixRQUdBUixFQUFHaEMsRUFBVSxHQUNmZ0MsRUFBR2hDLEVBQVUsRUFDWCxFQUFBLEVBSUUsTUFBQXdELEVBQWVyQixFQUFtQnJWLENBQUcsRUFDdkMwVyxHQUFnQjFCLEdBQWdCeE4sRUFBT2tQLENBQVksR0FBS0EsRUFBYSxHQUFHeEQsRUFBVSxHQUN2RXdELEVBQUEsR0FBR3hELEVBQVUsSUFFNUJvRCxFQUFTcEksRUFBTSxDQUFDZ0gsQ0FBRSxDQUFDLENBQ3JCLEVBQ0EsTUFBTUEsRUFBSSxDQUNSLElBQUloSCxFQUFPeUgsRUFDUGdCLEVBQVlmLEVBQ1pnQixFQUFhZixFQUNiLEdBQUEsQ0FBQ3hDLEVBQU0sVUFDVCxHQUFJbUMsRUFDRnRILEVBQU9pSSxHQUFZUixFQUNuQmdCLEVBQVlQLEdBQWlCUixFQUM3QmdCLEVBQWFQLEdBQXFCUixNQUVsQyxRQUdKLElBQUlnQixFQUFTLEdBQ2IsTUFBTTlSLEVBQU9tUSxFQUFHL0IsRUFBVSxFQUFLMkQsSUFBYyxDQUN2Q0QsSUFFS0EsRUFBQSxHQUNMQyxHQUNGUixFQUFTTSxFQUFZLENBQUMxQixDQUFFLENBQUMsRUFFekJvQixFQUFTSyxFQUFXLENBQUN6QixDQUFFLENBQUMsRUFFdEJ1QixHQUFNLGNBQ1JBLEdBQU0sYUFBYSxFQUVyQnZCLEVBQUcvQixFQUFVLEVBQUksT0FBQSxFQUVmakYsRUFDRnFJLEVBQWNySSxFQUFNLENBQUNnSCxFQUFJblEsQ0FBSSxDQUFDLEVBRXpCQSxHQUVULEVBQ0EsTUFBTW1RLEVBQUk2QixFQUFRLENBQ1YsTUFBQXZXLEVBQU8sT0FBT2dILEVBQU0sR0FBRyxFQU83QixHQU5JME4sRUFBRy9CLEVBQVUsR0FDZitCLEVBQUcvQixFQUFVLEVBQ1gsRUFBQSxFQUlBRSxFQUFNLGFBQ1IsT0FBTzBELEVBQU8sRUFFaEJULEVBQVNSLEVBQWUsQ0FBQ1osQ0FBRSxDQUFDLEVBQzVCLElBQUkyQixFQUFTLEdBQ2IsTUFBTTlSLEVBQU9tUSxFQUFHaEMsRUFBVSxFQUFLNEQsR0FBYyxDQUN2Q0QsSUFFS0EsRUFBQSxHQUNURSxJQUNJRCxFQUNGUixFQUFTTCxFQUFrQixDQUFDZixDQUFFLENBQUMsRUFFL0JvQixFQUFTTixFQUFjLENBQUNkLENBQUUsQ0FBQyxFQUU3QkEsRUFBR2hDLEVBQVUsRUFBSSxPQUNibUMsRUFBbUI3VSxDQUFJLElBQU1nSCxHQUMvQixPQUFPNk4sRUFBbUI3VSxDQUFJLEVBQ2hDLEVBRUY2VSxFQUFtQjdVLENBQUksRUFBSWdILEVBQ3ZCdU8sRUFDRlEsRUFBY1IsRUFBUyxDQUFDYixFQUFJblEsQ0FBSSxDQUFDLEVBRTVCQSxHQUVULEVBQ0EsTUFBTWlTLEVBQVEsQ0FDWixPQUFPdEMsR0FBdUJzQyxFQUFRak8sRUFBT3NLLEVBQU8xTCxDQUFRLENBQzlELENBQUEsRUFFSyxPQUFBOE8sRUFDVCxDQUNBLFNBQVNuQyxHQUFpQjlNLEVBQU8sQ0FDM0IsR0FBQXlQLEdBQVl6UCxDQUFLLEVBQ25CLE9BQUFBLEVBQVEwUCxHQUFXMVAsQ0FBSyxFQUN4QkEsRUFBTSxTQUFXLEtBQ1ZBLENBRVgsQ0FDQSxTQUFTZ04sR0FBa0JoTixFQUFPLENBQ2hDLE9BQU95UCxHQUFZelAsQ0FBSyxFQUduQixRQUFRLElBQUksV0FBYSxjQUFpQkEsRUFBTSxVQUFZQSxFQUFNLFVBQVUsUUFBVUEsRUFBTSxTQUFXQSxFQUFNLFNBQVMsQ0FBQyxFQUFJLE9BQzVIQSxDQUNOLENBQ0EsU0FBU21OLEdBQW1Cbk4sRUFBT2lQLEVBQU8sQ0FDcENqUCxFQUFNLFVBQVksR0FBS0EsRUFBTSxVQUNabU4sR0FBQW5OLEVBQU0sVUFBVSxRQUFTaVAsQ0FBSyxFQUN4Q2pQLEVBQU0sVUFBWSxLQUMzQkEsRUFBTSxVQUFVLFdBQWFpUCxFQUFNLE1BQU1qUCxFQUFNLFNBQVMsRUFDeERBLEVBQU0sV0FBVyxXQUFhaVAsRUFBTSxNQUFNalAsRUFBTSxVQUFVLEdBRTFEQSxFQUFNLFdBQWFpUCxDQUV2QixDQUNBLFNBQVMxQyxHQUF5QkQsRUFBVXFELEVBQWMsR0FBT0MsRUFBVyxDQUMxRSxJQUFJQyxFQUFNLENBQUEsRUFDTkMsRUFBcUIsRUFDekIsUUFBU3RhLEVBQUksRUFBR0EsRUFBSThXLEVBQVMsT0FBUTlXLElBQUssQ0FDcEMsSUFBQWdYLEVBQVFGLEVBQVM5VyxDQUFDLEVBQ3RCLE1BQU1nRCxFQUFNb1gsR0FBYSxLQUFPcEQsRUFBTSxJQUFNLE9BQU9vRCxDQUFTLEVBQUksT0FBT3BELEVBQU0sS0FBTyxLQUFPQSxFQUFNLElBQU1oWCxDQUFDLEVBQ3BHZ1gsRUFBTSxPQUFTdUQsR0FDYnZELEVBQU0sVUFBWSxLQUNwQnNELElBQ0ZELEVBQU1BLEVBQUksT0FDUnRELEdBQXlCQyxFQUFNLFNBQVVtRCxFQUFhblgsQ0FBRyxDQUFBLElBRWxEbVgsR0FBZW5ELEVBQU0sT0FBU0csSUFDbkNrRCxFQUFBLEtBQUtyWCxHQUFPLEtBQU9rWCxHQUFXbEQsRUFBTyxDQUFFLElBQUFoVSxDQUFBLENBQUssRUFBSWdVLENBQUssQ0FFN0QsQ0FDQSxHQUFJc0QsRUFBcUIsRUFDdkIsUUFBU3RhLEVBQUksRUFBR0EsRUFBSXFhLEVBQUksT0FBUXJhLElBQzFCcWEsRUFBQXJhLENBQUMsRUFBRSxVQUFZLEdBR2hCLE9BQUFxYSxDQUNULENBWUEsTUFBTUcsR0FBa0J4YSxHQUFNLENBQUMsQ0FBQ0EsRUFBRSxLQUFLLGNBMklqQ2lhLEdBQWV6UCxHQUFVQSxFQUFNLEtBQUssY0EwUDFDLFNBQVNpUSxHQUFXMVgsRUFBTW1PLEVBQU1wTyxFQUFTMlAsR0FBaUJpSSxFQUFVLEdBQU8sQ0FDekUsR0FBSTVYLEVBQVEsQ0FDVixNQUFNMlcsRUFBUTNXLEVBQU9DLENBQUksSUFBTUQsRUFBT0MsQ0FBSSxFQUFJLENBQUEsR0FDeEM0WCxFQUFjekosRUFBSyxRQUFVQSxFQUFLLE1BQVEsSUFBSS9RLElBQVMsQ0FDM0QsR0FBSTJDLEVBQU8sWUFDVCxPQUVZakMsS0FDUixNQUFBdVUsRUFBUUMsR0FBbUJ2UyxDQUFNLEVBQ2pDdUIsRUFBTW9JLEdBQTJCeUUsRUFBTXBPLEVBQVFDLEVBQU01QyxDQUFJLEVBQ3pELE9BQUFpVixJQUNRcFUsS0FDUHFELENBQUEsR0FFVCxPQUFJcVcsRUFDRmpCLEVBQU0sUUFBUWtCLENBQVcsRUFFekJsQixFQUFNLEtBQUtrQixDQUFXLEVBRWpCQSxDQUFBLFNBQ0ssUUFBUSxJQUFJLFdBQWEsYUFBZSxDQUM5QyxNQUFBQyxFQUFVQyxlQUFhdk8sR0FBbUJ2SixDQUFJLEVBQUUsUUFBUSxTQUFVLEVBQUUsQ0FBQyxFQUMzRTJILEVBQ0UsR0FBR2tRLENBQU8sNlBBQUEsQ0FFZCxDQUNGLENBQ0EsTUFBTUUsR0FBY0MsR0FBYyxDQUFDN0osRUFBTXBPLEVBQVMyUCxNQUUvQyxDQUFDcUMsSUFBeUJpRyxJQUFjLE9BQVNOLEdBQVdNLEVBQVcsSUFBSTVhLElBQVMrUSxFQUFLLEdBQUcvUSxDQUFJLEVBQUcyQyxDQUFNLEVBR3RHd1QsR0FBWXdFLEdBQVcsR0FBRyxFQUcxQnZFLEdBQWtCdUUsR0FBVyxLQUFLLEVBYXhDLFNBQVNFLEdBQVd4SCxFQUFReUgsRUFBWUMsRUFBTzdiLEVBQU8sQ0FDaEQsSUFBQWdiLEVBQ0UsTUFBQWMsRUFBU0QsR0FBU0EsRUFBTTdiLENBQUssRUFDbkMsR0FBSWlFLEVBQVEsUUFBQWtRLENBQU0sR0FBS3RILEVBQUEsU0FBU3NILENBQU0sRUFBRyxDQUNqQzZHLEVBQUEsSUFBSSxNQUFNN0csRUFBTyxNQUFNLEVBQzdCLFFBQVN4VCxFQUFJLEVBQUdvRSxFQUFJb1AsRUFBTyxPQUFReFQsRUFBSW9FLEVBQUdwRSxJQUNwQ3FhLEVBQUFyYSxDQUFDLEVBQUlpYixFQUFXekgsRUFBT3hULENBQUMsRUFBR0EsRUFBRyxPQUFRbWIsR0FBVUEsRUFBT25iLENBQUMsQ0FBQyxDQUMvRCxTQUNTLE9BQU93VCxHQUFXLFNBQVUsQ0FDOUIsUUFBUSxJQUFJLFdBQWEsY0FBaUIsQ0FBQyxPQUFPLFVBQVVBLENBQU0sR0FDaEU5SSxFQUFBLG1EQUFtRDhJLENBQU0sR0FBRyxFQUUvRDZHLEVBQUEsSUFBSSxNQUFNN0csQ0FBTSxFQUN0QixRQUFTeFQsRUFBSSxFQUFHQSxFQUFJd1QsRUFBUXhULElBQ3RCcWEsRUFBQXJhLENBQUMsRUFBSWliLEVBQVdqYixFQUFJLEVBQUdBLEVBQUcsT0FBUW1iLEdBQVVBLEVBQU9uYixDQUFDLENBQUMsQ0FDM0QsU0FDU3FGLEVBQUFBLFNBQVNtTyxDQUFNLEVBQ3BCLEdBQUFBLEVBQU8sT0FBTyxRQUFRLEVBQ3hCNkcsRUFBTSxNQUFNLEtBQ1Y3RyxFQUNBLENBQUM0SCxFQUFNcGIsSUFBTWliLEVBQVdHLEVBQU1wYixFQUFHLE9BQVFtYixHQUFVQSxFQUFPbmIsQ0FBQyxDQUFDLENBQUEsTUFFekQsQ0FDQyxNQUFBZ00sRUFBTyxPQUFPLEtBQUt3SCxDQUFNLEVBQ3pCNkcsRUFBQSxJQUFJLE1BQU1yTyxFQUFLLE1BQU0sRUFDM0IsUUFBU2hNLEVBQUksRUFBR29FLEVBQUk0SCxFQUFLLE9BQVFoTSxFQUFJb0UsRUFBR3BFLElBQUssQ0FDckMsTUFBQWdELEVBQU1nSixFQUFLaE0sQ0FBQyxFQUNkcWEsRUFBQXJhLENBQUMsRUFBSWliLEVBQVd6SCxFQUFPeFEsQ0FBRyxFQUFHQSxFQUFLaEQsRUFBR21iLEdBQVVBLEVBQU9uYixDQUFDLENBQUMsQ0FDOUQsQ0FDRixNQUVBcWEsRUFBTSxDQUFBLEVBRVIsT0FBSWEsSUFDRkEsRUFBTTdiLENBQUssRUFBSWdiLEdBRVZBLENBQ1QsQ0FxQkEsU0FBU2dCLEVBQVcxRSxFQUFPdkUsRUFBTXJHLEVBQVEsQ0FBQyxFQUFHdVAsRUFBVUMsRUFBVyxDQUM1RCxHQUFBaEssRUFBeUIsTUFBUUEsRUFBeUIsUUFBVWlKLEdBQWVqSixFQUF5QixNQUFNLEdBQUtBLEVBQXlCLE9BQU8sS0FDekosT0FBSWEsSUFBUyxZQUNYckcsRUFBTSxLQUFPcUcsR0FDUm9KLEVBQVksT0FBUXpQLEVBQU91UCxHQUFZQSxFQUFVLENBQUEsRUFFdEQsSUFBQUcsRUFBTzlFLEVBQU12RSxDQUFJLEVBQ2QsUUFBUSxJQUFJLFdBQWEsY0FBaUJxSixHQUFRQSxFQUFLLE9BQVMsSUFDckUvUSxFQUNFLDBKQUFBLEVBRUYrUSxFQUFPLElBQU0sQ0FBQSxHQUVYQSxHQUFRQSxFQUFLLEtBQ2ZBLEVBQUssR0FBSyxJQUVGQyxJQUNWLE1BQU1DLEVBQW1CRixHQUFRRyxHQUFpQkgsRUFBSzFQLENBQUssQ0FBQyxFQUN2RDhQLEVBQVdDLEdBQ2Z2QixFQUNBLENBQ0UsSUFBS3hPLEVBQU0sS0FFWDRQLEdBQW9CQSxFQUFpQixLQUFPLElBQUl2SixDQUFJLEVBQ3RELEVBQ0F1SixJQUFxQkwsRUFBV0EsRUFBUyxFQUFJLElBQzdDSyxHQUFvQmhGLEVBQU0sSUFBTSxFQUFJLEdBQUssRUFBQSxFQUV2QyxNQUFBLENBQUM0RSxHQUFhTSxFQUFTLFVBQ3pCQSxFQUFTLGFBQWUsQ0FBQ0EsRUFBUyxRQUFVLElBQUksR0FFOUNKLEdBQVFBLEVBQUssS0FDZkEsRUFBSyxHQUFLLElBRUxJLENBQ1QsQ0FDQSxTQUFTRCxHQUFpQkcsRUFBUSxDQUN6QixPQUFBQSxFQUFPLEtBQU0vRSxHQUNiZ0YsR0FBUWhGLENBQUssRUFFZCxFQUFBQSxFQUFNLE9BQVNHLEdBRWZILEVBQU0sT0FBU3VELEdBQVksQ0FBQ3FCLEdBQWlCNUUsRUFBTSxRQUFRLEdBSHRELEVBTVYsRUFBSStFLEVBQVMsSUFDaEIsQ0FjQSxNQUFNRSxHQUFxQmpjLEdBQ3BCQSxFQUVEa2MsR0FBb0JsYyxDQUFDLEVBQ2hCOFYsR0FBZTlWLENBQUMsR0FBS0EsRUFBRSxNQUN6QmljLEdBQWtCamMsRUFBRSxNQUFNLEVBSHhCLEtBS0xtYyxHQUdtQy9aLEVBQUFBLE9BQUEsT0FBTyxPQUFPLElBQUksRUFBRyxDQUMxRCxFQUFJcEMsR0FBTUEsRUFDVixJQUFNQSxHQUFNQSxFQUFFLE1BQU0sR0FDcEIsTUFBUUEsR0FBTUEsRUFBRSxLQUNoQixPQUFTQSxHQUFTLFFBQVEsSUFBSSxXQUFhLGFBQWdCb0osR0FBZ0JwSixFQUFFLEtBQUssRUFBSUEsRUFBRSxNQUN4RixPQUFTQSxHQUFTLFFBQVEsSUFBSSxXQUFhLGFBQWdCb0osR0FBZ0JwSixFQUFFLEtBQUssRUFBSUEsRUFBRSxNQUN4RixPQUFTQSxHQUFTLFFBQVEsSUFBSSxXQUFhLGFBQWdCb0osR0FBZ0JwSixFQUFFLEtBQUssRUFBSUEsRUFBRSxNQUN4RixNQUFRQSxHQUFTLFFBQVEsSUFBSSxXQUFhLGFBQWdCb0osR0FBZ0JwSixFQUFFLElBQUksRUFBSUEsRUFBRSxLQUN0RixRQUFVQSxHQUFNaWMsR0FBa0JqYyxFQUFFLE1BQU0sRUFDMUMsTUFBUUEsR0FBTWljLEdBQWtCamMsRUFBRSxJQUFJLEVBQ3RDLE1BQVFBLEdBQU1BLEVBQUUsS0FDaEIsU0FBV0EsR0FBNEJvYyxHQUFxQnBjLENBQUMsRUFDN0QsYUFBZUEsR0FBTUEsRUFBRSxJQUFNQSxFQUFFLEVBQUksSUFBTSxDQUN2Q0EsRUFBRSxPQUFPLE1BQVEsR0FDakJzTyxHQUFTdE8sRUFBRSxNQUFNLENBQUEsR0FFbkIsVUFBWUEsR0FBTUEsRUFBRSxJQUFNQSxFQUFFLEVBQUk4TixHQUFTLEtBQUs5TixFQUFFLEtBQUssR0FDckQsT0FBU0EsR0FBNEJnVixHQUFjLEtBQUtoVixDQUFDLENBQUksQ0FDOUQsRUFFR3FjLEdBQW9CclosR0FBUUEsSUFBUSxLQUFPQSxJQUFRLElBQ25Ec1osR0FBa0IsQ0FBQ2pHLEVBQU9yVCxJQUFRcVQsSUFBVXRDLEVBQWEsV0FBQSxDQUFDc0MsRUFBTSxpQkFBbUJsUixFQUFBQSxPQUFPa1IsRUFBT3JULENBQUcsRUFDcEd1WixHQUE4QixDQUNsQyxJQUFJLENBQUUsRUFBRzVSLENBQUEsRUFBWTNILEVBQUssQ0FDbEIsS0FBQSxDQUFFLElBQUE0TyxFQUFLLFdBQUE0SyxFQUFZLEtBQUFDLEVBQU0sTUFBQTFRLEVBQU8sWUFBQTJRLEVBQWEsS0FBQTNaLEVBQU0sV0FBQTRaLENBQWUsRUFBQWhTLEVBQ3hFLEdBQU8sUUFBUSxJQUFJLFdBQWEsY0FBaUIzSCxJQUFRLFVBQ2hELE1BQUEsR0FFTCxJQUFBNFosRUFDQSxHQUFBNVosRUFBSSxDQUFDLElBQU0sSUFBSyxDQUNaLE1BQUE2WixFQUFJSCxFQUFZMVosQ0FBRyxFQUN6QixHQUFJNlosSUFBTSxPQUNSLE9BQVFBLEVBQUcsQ0FDVCxJQUFLLEdBQ0gsT0FBT0wsRUFBV3haLENBQUcsRUFDdkIsSUFBSyxHQUNILE9BQU95WixFQUFLelosQ0FBRyxFQUNqQixJQUFLLEdBQ0gsT0FBTzRPLEVBQUk1TyxDQUFHLEVBQ2hCLElBQUssR0FDSCxPQUFPK0ksRUFBTS9JLENBQUcsQ0FDcEIsS0FDUyxJQUFBc1osR0FBZ0JFLEVBQVl4WixDQUFHLEVBQ3hDLE9BQUEwWixFQUFZMVosQ0FBRyxFQUFJLEVBQ1p3WixFQUFXeFosQ0FBRyxLQUNaeVosSUFBUzFJLEVBQUEsV0FBYTVPLEVBQU8sT0FBQXNYLEVBQU16WixDQUFHLEVBQy9DLE9BQUEwWixFQUFZMVosQ0FBRyxFQUFJLEVBQ1p5WixFQUFLelosQ0FBRyxFQUNqQixJQUdHNFosRUFBa0JqUyxFQUFTLGFBQWEsQ0FBQyxJQUFNeEYsRUFBQSxPQUFPeVgsRUFBaUI1WixDQUFHLEVBRTNFLE9BQUEwWixFQUFZMVosQ0FBRyxFQUFJLEVBQ1orSSxFQUFNL0ksQ0FBRyxLQUNQNE8sSUFBUW1DLEVBQUEsV0FBYTVPLEVBQU8sT0FBQXlNLEVBQUs1TyxDQUFHLEVBQzdDLE9BQUEwWixFQUFZMVosQ0FBRyxFQUFJLEVBQ1o0TyxFQUFJNU8sQ0FBRyxFQUVkMFosRUFBWTFaLENBQUcsRUFBSSxFQUV2QixDQUNNLE1BQUE4WixFQUFlWCxHQUFvQm5aLENBQUcsRUFDNUMsSUFBSStaLEVBQVdDLEVBQ2YsR0FBSUYsRUFDRixPQUFJOVosSUFBUSxVQUNKSCxFQUFBOEgsRUFBVSxNQUFPM0gsQ0FBRyxFQUN2QixRQUFRLElBQUksV0FBYSxjQUFpQixRQUNqQyxRQUFRLElBQUksV0FBYSxjQUFpQkEsSUFBUSxVQUN4REgsRUFBQThILEVBQVUsTUFBTzNILENBQUcsRUFFckI4WixFQUFhblMsQ0FBUSxFQUM5QixJQUVHb1MsRUFBWWhhLEVBQUssZ0JBQWtCZ2EsRUFBWUEsRUFBVS9aLENBQUcsR0FFdEQsT0FBQStaLEtBQ0VuTCxJQUFRbUMsRUFBQSxXQUFhNU8sRUFBTyxPQUFBeU0sRUFBSzVPLENBQUcsRUFDN0MsT0FBQTBaLEVBQVkxWixDQUFHLEVBQUksRUFDWjRPLEVBQUk1TyxDQUFHLEVBQ2hCLEdBRUVnYSxFQUFtQkwsRUFBVyxPQUFPLGlCQUFrQnhYLEVBQUEsT0FBTzZYLEVBQWtCaGEsQ0FBRyxFQUdqRixPQUFPZ2EsRUFBaUJoYSxDQUFHLEVBRWpCLFFBQVEsSUFBSSxXQUFhLGNBQWlCdU8sSUFBNkIsQ0FBQ3JGLEVBQUEsU0FBU2xKLENBQUcsR0FFbEdBLEVBQUksUUFBUSxLQUFLLElBQU0sS0FDakJ5WixJQUFTMUksYUFBYXNJLEdBQWlCclosRUFBSSxDQUFDLENBQUMsR0FBS21DLEVBQUEsT0FBT3NYLEVBQU16WixDQUFHLEVBQ3BFMEgsRUFDRSxZQUFZLEtBQUssVUFDZjFILENBQ0QsQ0FBQSxnSUFBQSxFQUVNMkgsSUFBYTRHLEdBQ3RCN0csRUFDRSxZQUFZLEtBQUssVUFBVTFILENBQUcsQ0FBQyw2REFBQSxFQUl2QyxFQUNBLElBQUksQ0FBRSxFQUFHMkgsQ0FBUyxFQUFHM0gsRUFBS3BELEVBQU8sQ0FDL0IsS0FBTSxDQUFFLEtBQUE2YyxFQUFNLFdBQUFELEVBQVksSUFBQTVLLENBQUEsRUFBUWpILEVBQzlCLE9BQUEyUixHQUFnQkUsRUFBWXhaLENBQUcsR0FDakN3WixFQUFXeFosQ0FBRyxFQUFJcEQsRUFDWCxJQUNLLFFBQVEsSUFBSSxXQUFhLGNBQWlCNGMsRUFBVyxpQkFBbUJyWCxFQUFBQSxPQUFPcVgsRUFBWXhaLENBQUcsR0FDbkcwSCxFQUFBLHlDQUF5QzFILENBQUcscUJBQXFCLEVBQ2pFLElBQ0V5WixJQUFTMUksRUFBQSxXQUFhNU8sRUFBTyxPQUFBc1gsRUFBTXpaLENBQUcsR0FDL0N5WixFQUFLelosQ0FBRyxFQUFJcEQsRUFDTCxJQUNFdUYsRUFBQUEsT0FBT3dGLEVBQVMsTUFBTzNILENBQUcsR0FDaEMsUUFBUSxJQUFJLFdBQWEsY0FBaUIwSCxFQUFPLDhCQUE4QjFILENBQUcsd0JBQXdCLEVBQ3RHLElBRUxBLEVBQUksQ0FBQyxJQUFNLEtBQU9BLEVBQUksTUFBTSxDQUFDLElBQUsySCxHQUNqQyxRQUFRLElBQUksV0FBYSxjQUFpQkQsRUFDM0MseUNBQXlDMUgsQ0FBRywwREFBQSxFQUV2QyxLQUVBLFFBQVEsSUFBSSxXQUFhLGNBQWlCQSxLQUFPMkgsRUFBUyxXQUFXLE9BQU8saUJBQzFFLE9BQUEsZUFBZWlILEVBQUs1TyxFQUFLLENBQzlCLFdBQVksR0FDWixhQUFjLEdBQ2QsTUFBQXBELENBQUEsQ0FDRCxFQUVEZ1MsRUFBSTVPLENBQUcsRUFBSXBELEVBR1IsR0FDVCxFQUNBLElBQUksQ0FDRixFQUFHLENBQUUsS0FBQTZjLEVBQU0sV0FBQUQsRUFBWSxZQUFBRSxFQUFhLElBQUE5SyxFQUFLLFdBQUErSyxFQUFZLGFBQUFNLENBQWEsR0FDakVqYSxFQUFLLENBQ0YsSUFBQTRaLEVBQ0osTUFBTyxDQUFDLENBQUNGLEVBQVkxWixDQUFHLEdBQUt5WixJQUFTMUksRUFBQSxXQUFhNU8sU0FBT3NYLEVBQU16WixDQUFHLEdBQUtzWixHQUFnQkUsRUFBWXhaLENBQUcsSUFBTTRaLEVBQWtCSyxFQUFhLENBQUMsSUFBTTlYLFNBQU95WCxFQUFpQjVaLENBQUcsR0FBS21DLEVBQUFBLE9BQU95TSxFQUFLNU8sQ0FBRyxHQUFLbUMsRUFBQUEsT0FBT2dYLEdBQXFCblosQ0FBRyxHQUFLbUMsU0FBT3dYLEVBQVcsT0FBTyxpQkFBa0IzWixDQUFHLENBQzNSLEVBQ0EsZUFBZUYsRUFBUUUsRUFBS2thLEVBQVksQ0FDbEMsT0FBQUEsRUFBVyxLQUFPLEtBQ2JwYSxFQUFBLEVBQUUsWUFBWUUsQ0FBRyxFQUFJLEVBQ25CbUMsRUFBQSxPQUFPK1gsRUFBWSxPQUFPLEdBQ25DLEtBQUssSUFBSXBhLEVBQVFFLEVBQUtrYSxFQUFXLE1BQU8sSUFBSSxFQUV2QyxRQUFRLGVBQWVwYSxFQUFRRSxFQUFLa2EsQ0FBVSxDQUN2RCxDQUNGLEVBQ08sUUFBUSxJQUFJLFdBQWEsZUFDRlgsR0FBQSxRQUFXelosSUFDckM0SCxFQUNFLG1KQUFBLEVBRUssUUFBUSxRQUFRNUgsQ0FBTSxJQTZIakMsU0FBU3FhLElBQVcsQ0FDbEIsT0FBT0MsR0FBYSxFQUFBLEtBQ3RCLENBSUEsU0FBU0EsSUFBYSxDQUNwQixNQUFNcGQsRUFBSTRXLEtBQ1YsT0FBTyxRQUFRLElBQUksV0FBYSxjQUFpQixDQUFDNVcsR0FDaEQwSyxFQUFPLDhDQUE4QyxFQUVoRDFLLEVBQUUsZUFBaUJBLEVBQUUsYUFBZXFkLEdBQW1CcmQsQ0FBQyxFQUNqRSxDQUNBLFNBQVNzZCxHQUFzQnZSLEVBQU8sQ0FDN0IsT0FBQXpJLFVBQVF5SSxDQUFLLEVBQUlBLEVBQU0sT0FDNUIsQ0FBQ3dSLEVBQVl4UCxLQUFPd1AsRUFBV3hQLENBQUMsRUFBSSxLQUFNd1AsR0FDMUMsQ0FBQyxDQUNDLEVBQUF4UixDQUNOLENBNlVBLFNBQVNxUSxHQUFxQnpSLEVBQVUsQ0FDdEMsTUFBTTZTLEVBQU83UyxFQUFTLEtBQ2hCLENBQUUsT0FBQThTLEVBQVEsUUFBU0MsQ0FBQSxFQUFtQkYsRUFDdEMsQ0FDSixPQUFRRyxFQUNSLGFBQWN6QyxFQUNkLE9BQVEsQ0FBRSxzQkFBQTBDLENBQXNCLENBQUEsRUFDOUJqVCxFQUFTLFdBQ1B3USxFQUFTRCxFQUFNLElBQUlzQyxDQUFJLEVBQ3pCLElBQUFLLEVBQ0osT0FBSTFDLEVBQ1MwQyxFQUFBMUMsRUFDRixDQUFDd0MsRUFBYSxRQUFVLENBQUNGLEdBQVUsQ0FBQ0MsRUFFaENHLEVBQUFMLEdBR2JLLEVBQVcsQ0FBQSxFQUNQRixFQUFhLFFBQ0ZBLEVBQUEsUUFDVkcsR0FBTUMsR0FBYUYsRUFBVUMsRUFBR0YsRUFBdUIsRUFBSSxDQUFBLEVBR25ERyxHQUFBRixFQUFVTCxFQUFNSSxDQUFxQixHQUVoRHZZLEVBQUFBLFNBQVNtWSxDQUFJLEdBQ1R0QyxFQUFBLElBQUlzQyxFQUFNSyxDQUFRLEVBRW5CQSxDQUNULENBQ0EsU0FBU0UsR0FBYUMsRUFBSUMsRUFBTUMsRUFBUUMsRUFBVSxHQUFPLENBQ3ZELEtBQU0sQ0FBRSxPQUFBVixFQUFRLFFBQVNDLENBQUEsRUFBbUJPLEVBQ3hDUCxHQUNXSyxHQUFBQyxFQUFJTixFQUFnQlEsRUFBUSxFQUFJLEVBRTNDVCxHQUNLQSxFQUFBLFFBQ0pLLEdBQU1DLEdBQWFDLEVBQUlGLEVBQUdJLEVBQVEsRUFBSSxDQUFBLEVBRzNDLFVBQVdsYixLQUFPaWIsRUFDWixHQUFBRSxHQUFXbmIsSUFBUSxTQUNsQixRQUFRLElBQUksV0FBYSxjQUFpQjBILEVBQzNDLHlIQUFBLE1BRUcsQ0FDTCxNQUFNMFQsRUFBUUMsR0FBMEJyYixDQUFHLEdBQUtrYixHQUFVQSxFQUFPbGIsQ0FBRyxFQUNwRWdiLEVBQUdoYixDQUFHLEVBQUlvYixFQUFRQSxFQUFNSixFQUFHaGIsQ0FBRyxFQUFHaWIsRUFBS2piLENBQUcsQ0FBQyxFQUFJaWIsRUFBS2piLENBQUcsQ0FDeEQsQ0FFSyxPQUFBZ2IsQ0FDVCxDQUNBLE1BQU1LLEdBQTRCLENBQ2hDLEtBQU1DLEdBQ04sTUFBT0MsR0FDUCxNQUFPQSxHQUVQLFFBQVNDLEdBQ1QsU0FBVUEsR0FFVixhQUFjQyxFQUNkLFFBQVNBLEVBQ1QsWUFBYUEsRUFDYixRQUFTQSxFQUNULGFBQWNBLEVBQ2QsUUFBU0EsRUFDVCxjQUFlQSxFQUNmLGNBQWVBLEVBQ2YsVUFBV0EsRUFDWCxVQUFXQSxFQUNYLFVBQVdBLEVBQ1gsWUFBYUEsRUFDYixjQUFlQSxFQUNmLGVBQWdCQSxFQUVoQixXQUFZRCxHQUNaLFdBQVlBLEdBRVosTUFBT0UsR0FFUCxRQUFTSixHQUNULE9BQVFLLEVBQ1YsRUFDQSxTQUFTTCxHQUFZTixFQUFJQyxFQUFNLENBQzdCLE9BQUtBLEVBR0FELEVBR0UsVUFBd0IsQ0FDckIsT0FBQTViLEVBQUEsT0FDTitKLGFBQVc2UixDQUFFLEVBQUlBLEVBQUcsS0FBSyxLQUFNLElBQUksRUFBSUEsRUFDdkM3UixhQUFXOFIsQ0FBSSxFQUFJQSxFQUFLLEtBQUssS0FBTSxJQUFJLEVBQUlBLENBQUEsQ0FDN0MsRUFOT0EsRUFIQUQsQ0FXWCxDQUNBLFNBQVNXLEdBQVlYLEVBQUlDLEVBQU0sQ0FDN0IsT0FBT08sR0FBbUJJLEdBQWdCWixDQUFFLEVBQUdZLEdBQWdCWCxDQUFJLENBQUMsQ0FDdEUsQ0FDQSxTQUFTVyxHQUFnQi9VLEVBQUssQ0FDeEIsR0FBQXZHLEVBQUFBLFFBQVF1RyxDQUFHLEVBQUcsQ0FDaEIsTUFBTXhGLEVBQU0sQ0FBQSxFQUNaLFFBQVNyRSxFQUFJLEVBQUdBLEVBQUk2SixFQUFJLE9BQVE3SixJQUM5QnFFLEVBQUl3RixFQUFJN0osQ0FBQyxDQUFDLEVBQUk2SixFQUFJN0osQ0FBQyxFQUVkLE9BQUFxRSxDQUNULENBQ08sT0FBQXdGLENBQ1QsQ0FDQSxTQUFTNFUsRUFBYVQsRUFBSUMsRUFBTSxDQUM5QixPQUFPRCxFQUFLLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBRyxFQUFBLE9BQU9BLEVBQUlDLENBQUksQ0FBQyxDQUFDLEVBQUlBLENBQ2xELENBQ0EsU0FBU08sR0FBbUJSLEVBQUlDLEVBQU0sQ0FDN0IsT0FBQUQsRUFBSzViLFNBQThCLE9BQUEsT0FBTyxJQUFJLEVBQUc0YixFQUFJQyxDQUFJLEVBQUlBLENBQ3RFLENBQ0EsU0FBU00sR0FBeUJQLEVBQUlDLEVBQU0sQ0FDMUMsT0FBSUQsRUFDRTFhLEVBQVEsUUFBQTBhLENBQUUsR0FBSzFhLEVBQUEsUUFBUTJhLENBQUksRUFDdEIsQ0FBQyxHQUFtQixJQUFJLElBQUksQ0FBQyxHQUFHRCxFQUFJLEdBQUdDLENBQUksQ0FBQyxDQUFDLEVBRS9DN2IsRUFBQSxPQUNXLE9BQU8sT0FBTyxJQUFJLEVBQ2xDa2IsR0FBc0JVLENBQUUsRUFDeEJWLEdBQXNCVyxHQUFzQixDQUFBLENBQUUsQ0FBQSxFQUd6Q0EsQ0FFWCxDQUNBLFNBQVNTLEdBQWtCVixFQUFJQyxFQUFNLENBQ25DLEdBQUksQ0FBQ0QsRUFDSSxPQUFBQyxFQUNULEdBQUksQ0FBQ0EsRUFDSSxPQUFBRCxFQUNULE1BQU1hLEVBQVN6YyxFQUFBQSxPQUF1QixPQUFPLE9BQU8sSUFBSSxFQUFHNGIsQ0FBRSxFQUM3RCxVQUFXaGIsS0FBT2liLEVBQ1RZLEVBQUE3YixDQUFHLEVBQUl5YixFQUFhVCxFQUFHaGIsQ0FBRyxFQUFHaWIsRUFBS2piLENBQUcsQ0FBQyxFQUV4QyxPQUFBNmIsQ0FDVCxDQTJMQSxJQUFJQyxHQUFhLEtBZ0JqQixTQUFTekwsR0FBT3JRLEVBQUsrYixFQUFjQyxFQUF3QixHQUFPLENBQ2hFLE1BQU1yVSxFQUFXOEgsSUFBbUJsQixFQUNwQyxHQUFJNUcsR0FBWW1VLEdBQVksQ0FDMUIsTUFBTUcsRUFBV3RVLEVBQVdBLEVBQVMsUUFBVSxLQUFPQSxFQUFTLE1BQU0sWUFBY0EsRUFBUyxNQUFNLFdBQVcsU0FBV0EsRUFBUyxPQUFPLFNBQVdtVSxHQUFXLFNBQVMsU0FDbkssR0FBQUcsR0FBWWpjLEtBQU9pYyxFQUNyQixPQUFPQSxFQUFTamMsQ0FBRyxFQUNyQixHQUFXLFVBQVUsT0FBUyxFQUNyQixPQUFBZ2MsR0FBeUI3UyxFQUFBQSxXQUFXNFMsQ0FBWSxFQUFJQSxFQUFhLEtBQUtwVSxHQUFZQSxFQUFTLEtBQUssRUFBSW9VLEVBQy9GLFFBQVEsSUFBSSxXQUFhLGNBQ3JDclUsRUFBTyxjQUFjLE9BQU8xSCxDQUFHLENBQUMsY0FBYyxDQUNoRCxNQUNZLFFBQVEsSUFBSSxXQUFhLGNBQ3JDMEgsRUFBTyxvRUFBb0UsQ0FFL0UsQ0E0c0NBLE1BQU1xSyxHQUF3QjlCLEdBNi9DeEJpTSxHQUFjbmMsR0FBU0EsRUFBSyxhQWtSNUJ3WCxFQUFXLE9BQU8sSUFBSSxPQUFPLEVBQzdCNEUsR0FBTyxPQUFPLElBQUksT0FBTyxFQUN6QmhJLEVBQVUsT0FBTyxJQUFJLE9BQU8sRUFFNUJpSSxHQUFhLENBQUEsRUFDbkIsSUFBSUMsRUFBZSxLQUNuQixTQUFTM0QsRUFBVTRELEVBQWtCLEdBQU8sQ0FDMUNGLEdBQVcsS0FBS0MsRUFBZUMsRUFBa0IsS0FBTyxDQUFFLENBQUEsQ0FDNUQsQ0FDQSxTQUFTQyxJQUFhLENBQ3BCSCxHQUFXLElBQUksRUFDZkMsRUFBZUQsR0FBV0EsR0FBVyxPQUFTLENBQUMsR0FBSyxJQUN0RCxDQUNBLElBQUlJLEdBQXFCLEVBQ3pCLFNBQVN6TixHQUFpQm5TLEVBQU8sQ0FDVDRmLElBQUE1ZixDQUN4QixDQUNBLFNBQVM2ZixHQUFXalYsRUFBTyxDQUN6QixPQUFBQSxFQUFNLGdCQUFrQmdWLEdBQXFCLEVBQUlILEdBQWdCSyxFQUFZLFVBQUEsS0FDbEVILEtBQ1BDLEdBQXFCLEdBQUtILEdBQzVCQSxFQUFhLEtBQUs3VSxDQUFLLEVBRWxCQSxDQUNULENBQ0EsU0FBU21WLEVBQW1CNWMsRUFBTWdKLEVBQU8rSyxFQUFVOEksRUFBV0MsRUFBY0MsRUFBVyxDQUM5RSxPQUFBTCxHQUNMTSxFQUNFaGQsRUFDQWdKLEVBQ0ErSyxFQUNBOEksRUFDQUMsRUFDQUMsRUFDQSxFQUNGLENBQUEsQ0FFSixDQUNBLFNBQVNoRSxHQUFZL1ksRUFBTWdKLEVBQU8rSyxFQUFVOEksRUFBV0MsRUFBYyxDQUM1RCxPQUFBSixHQUNMakUsRUFDRXpZLEVBQ0FnSixFQUNBK0ssRUFDQThJLEVBQ0FDLEVBQ0EsRUFDRixDQUFBLENBRUosQ0FDQSxTQUFTN0QsR0FBUXBjLEVBQU8sQ0FDZixPQUFBQSxFQUFRQSxFQUFNLGNBQWdCLEdBQU8sRUFDOUMsQ0FDQSxTQUFTb1ksR0FBZ0JnSSxFQUFJQyxFQUFJLENBQy9CLE9BQU8sUUFBUSxJQUFJLFdBQWEsY0FBaUJBLEVBQUcsVUFBWSxHQUFLeFEsR0FBbUIsSUFBSXdRLEVBQUcsSUFBSSxHQUNqR0QsRUFBRyxXQUFhLEtBQ2hCQyxFQUFHLFdBQWEsS0FDVCxJQUVGRCxFQUFHLE9BQVNDLEVBQUcsTUFBUUQsRUFBRyxNQUFRQyxFQUFHLEdBQzlDLENBS0EsTUFBTUMsR0FBK0IsSUFBSS9mLElBQ2hDZ2dCLEdBQ0wsR0FBaUZoZ0IsQ0FBQSxFQUcvRWlnQixHQUFvQixjQUNwQkMsR0FBZSxDQUFDLENBQUUsSUFBQXJkLENBQVUsSUFBQUEsR0FBb0IsS0FDaERzZCxHQUFlLENBQUMsQ0FDcEIsSUFBQUMsRUFDQSxRQUFBQyxFQUNBLFFBQUFDLENBQ0YsS0FDTSxPQUFPRixHQUFRLFdBQ2pCQSxFQUFNLEdBQUtBLEdBRU5BLEdBQU8sS0FBT3JVLEVBQUFBLFNBQVNxVSxDQUFHLEdBQUtuYixFQUFNbWIsQ0FBRyxHQUFLcFUsYUFBV29VLENBQUcsRUFBSSxDQUFFLEVBQUdoUCxFQUEwQixFQUFHZ1AsRUFBSyxFQUFHQyxFQUFTLEVBQUcsQ0FBQyxDQUFDQyxDQUFRLEVBQUlGLEVBQU0sTUFFbEosU0FBU1IsRUFBZ0JoZCxFQUFNZ0osRUFBUSxLQUFNK0ssRUFBVyxLQUFNOEksRUFBWSxFQUFHQyxFQUFlLEtBQU1DLEVBQVkvYyxJQUFTd1gsRUFBVyxFQUFJLEVBQUdtRyxFQUFjLEdBQU9DLEVBQWdDLEdBQU8sQ0FDbk0sTUFBTW5XLEVBQVEsQ0FDWixZQUFhLEdBQ2IsU0FBVSxHQUNWLEtBQUF6SCxFQUNBLE1BQUFnSixFQUNBLElBQUtBLEdBQVNzVSxHQUFhdFUsQ0FBSyxFQUNoQyxJQUFLQSxHQUFTdVUsR0FBYXZVLENBQUssRUFDaEMsUUFBU3lGLEdBQ1QsYUFBYyxLQUNkLFNBQUFzRixFQUNBLFVBQVcsS0FDWCxTQUFVLEtBQ1YsVUFBVyxLQUNYLFdBQVksS0FDWixLQUFNLEtBQ04sV0FBWSxLQUNaLEdBQUksS0FDSixPQUFRLEtBQ1IsT0FBUSxLQUNSLGFBQWMsS0FDZCxZQUFhLEVBQ2IsVUFBQWdKLEVBQ0EsVUFBQUYsRUFDQSxhQUFBQyxFQUNBLGdCQUFpQixLQUNqQixXQUFZLEtBQ1osSUFBS3RPLENBQUEsRUFFUCxPQUFJb1AsR0FDRkMsR0FBa0JwVyxFQUFPc00sQ0FBUSxFQUM3QmdKLEVBQVksS0FDZC9jLEVBQUssVUFBVXlILENBQUssR0FFYnNNLElBQ1R0TSxFQUFNLFdBQWEwQixFQUFBLFNBQVM0SyxDQUFRLEVBQUksRUFBSSxJQUV2QyxRQUFRLElBQUksV0FBYSxjQUFpQnRNLEVBQU0sTUFBUUEsRUFBTSxLQUM1REUsRUFBQSxvREFBcURGLEVBQU0sSUFBSSxFQUVwRWdWLEdBQXFCLEdBQ3pCLENBQUNrQixHQUNEckIsSUFJQzdVLEVBQU0sVUFBWSxHQUFLc1YsRUFBWSxJQUVwQ3RWLEVBQU0sWUFBYyxJQUNsQjZVLEVBQWEsS0FBSzdVLENBQUssRUFFbEJBLENBQ1QsQ0FDQSxNQUFNZ1IsRUFBaUIsUUFBUSxJQUFJLFdBQWEsYUFBZ0IwRSxHQUErQkMsR0FDL0YsU0FBU0EsR0FBYXBkLEVBQU1nSixFQUFRLEtBQU0rSyxFQUFXLEtBQU04SSxFQUFZLEVBQUdDLEVBQWUsS0FBTWEsRUFBYyxHQUFPLENBTzlHLElBTkEsQ0FBQzNkLEdBQVFBLElBQVN3UCxNQUNiLFFBQVEsSUFBSSxXQUFhLGNBQWlCLENBQUN4UCxHQUN6QzJILEVBQUEsMkNBQTJDM0gsQ0FBSSxHQUFHLEVBRXBEQSxFQUFBb1UsR0FFTDZFLEdBQVFqWixDQUFJLEVBQUcsQ0FDakIsTUFBTThkLEVBQVMzRyxHQUNiblgsRUFDQWdKLEVBQ0EsRUFBQSxFQUdGLE9BQUkrSyxHQUNGOEosR0FBa0JDLEVBQVEvSixDQUFRLEVBRWhDMEksR0FBcUIsR0FBSyxDQUFDa0IsR0FBZXJCLElBQ3hDd0IsRUFBTyxVQUFZLEVBQ3JCeEIsRUFBYUEsRUFBYSxRQUFRdGMsQ0FBSSxDQUFDLEVBQUk4ZCxFQUUzQ3hCLEVBQWEsS0FBS3dCLENBQU0sR0FHNUJBLEVBQU8sV0FBYSxHQUNiQSxDQUNULENBSUEsR0FISTFRLEdBQWlCcE4sQ0FBSSxJQUN2QkEsRUFBT0EsRUFBSyxXQUVWZ0osRUFBTyxDQUNUQSxFQUFRK1UsR0FBbUIvVSxDQUFLLEVBQ2hDLEdBQUksQ0FBRSxNQUFPZ1YsRUFBTyxNQUFBQyxDQUFBLEVBQVVqVixFQUMxQmdWLEdBQVMsQ0FBQzdVLFdBQVM2VSxDQUFLLElBQ3BCaFYsRUFBQSxNQUFRa1YsaUJBQWVGLENBQUssR0FFaEMxYixFQUFBQSxTQUFTMmIsQ0FBSyxJQUNacFgsR0FBUW9YLENBQUssR0FBSyxDQUFDMWQsRUFBQSxRQUFRMGQsQ0FBSyxJQUMxQkEsRUFBQTVlLEVBQUEsT0FBTyxHQUFJNGUsQ0FBSyxHQUVwQmpWLEVBQUEsTUFBUW1WLGlCQUFlRixDQUFLLEVBRXRDLENBQ00sTUFBQWxCLEVBQVk1VCxXQUFTbkosQ0FBSSxFQUFJLEVBQUlpUSxHQUFXalEsQ0FBSSxFQUFJLElBQU1tYyxHQUFXbmMsQ0FBSSxFQUFJLEdBQUtzQyxXQUFTdEMsQ0FBSSxFQUFJLEVBQUlvSixFQUFBQSxXQUFXcEosQ0FBSSxFQUFJLEVBQUksRUFDaEksT0FBRyxRQUFRLElBQUksV0FBYSxjQUFpQitjLEVBQVksR0FBS2xXLEdBQVE3RyxDQUFJLElBQzVFQSxFQUFPb0IsRUFBTXBCLENBQUksRUFDakIySCxFQUNFLG9OQUNBO0FBQUEsb0NBRUEzSCxDQUFBLEdBR0dnZCxFQUNMaGQsRUFDQWdKLEVBQ0ErSyxFQUNBOEksRUFDQUMsRUFDQUMsRUFDQVksRUFDQSxFQUFBLENBRUosQ0FDQSxTQUFTSSxHQUFtQi9VLEVBQU8sQ0FDakMsT0FBS0EsRUFFRW5DLEdBQVFtQyxDQUFLLEdBQUtxVSxNQUFxQnJVLEVBQVEzSixFQUFBQSxPQUFPLENBQUksRUFBQTJKLENBQUssRUFBSUEsRUFEakUsSUFFWCxDQUNBLFNBQVNtTyxHQUFXMVAsRUFBTzJXLEVBQVlDLEVBQVcsR0FBTyxDQUN2RCxLQUFNLENBQUUsTUFBQXJWLEVBQU8sSUFBQXdVLEVBQUssVUFBQVgsRUFBVyxTQUFBOUksQ0FBYSxFQUFBdE0sRUFDdEM2VyxFQUFjRixFQUFhRyxFQUFXdlYsR0FBUyxHQUFJb1YsQ0FBVSxFQUFJcFYsRUEyQ2hFLE1BMUNRLENBQ2IsWUFBYSxHQUNiLFNBQVUsR0FDVixLQUFNdkIsRUFBTSxLQUNaLE1BQU82VyxFQUNQLElBQUtBLEdBQWVoQixHQUFhZ0IsQ0FBVyxFQUM1QyxJQUFLRixHQUFjQSxFQUFXLElBSTVCQyxHQUFZYixFQUFNamQsRUFBQSxRQUFRaWQsQ0FBRyxFQUFJQSxFQUFJLE9BQU9ELEdBQWFhLENBQVUsQ0FBQyxFQUFJLENBQUNaLEVBQUtELEdBQWFhLENBQVUsQ0FBQyxFQUFJYixHQUFhYSxDQUFVLEVBQy9IWixFQUNKLFFBQVMvVixFQUFNLFFBQ2YsYUFBY0EsRUFBTSxhQUNwQixTQUFhLFFBQVEsSUFBSSxXQUFhLGNBQWlCb1YsSUFBYyxJQUFNdGMsRUFBQUEsUUFBUXdULENBQVEsRUFBSUEsRUFBUyxJQUFJeUssRUFBYyxFQUFJekssRUFDOUgsT0FBUXRNLEVBQU0sT0FDZCxhQUFjQSxFQUFNLGFBQ3BCLFlBQWFBLEVBQU0sWUFDbkIsVUFBV0EsRUFBTSxVQUtqQixVQUFXMlcsR0FBYzNXLEVBQU0sT0FBUytQLEVBQVdxRixJQUFjLEdBQUssR0FBS0EsRUFBWSxHQUFLQSxFQUM1RixhQUFjcFYsRUFBTSxhQUNwQixnQkFBaUJBLEVBQU0sZ0JBQ3ZCLFdBQVlBLEVBQU0sV0FDbEIsS0FBTUEsRUFBTSxLQUNaLFdBQVlBLEVBQU0sV0FLbEIsVUFBV0EsRUFBTSxVQUNqQixTQUFVQSxFQUFNLFNBQ2hCLFVBQVdBLEVBQU0sV0FBYTBQLEdBQVcxUCxFQUFNLFNBQVMsRUFDeEQsV0FBWUEsRUFBTSxZQUFjMFAsR0FBVzFQLEVBQU0sVUFBVSxFQUMzRCxHQUFJQSxFQUFNLEdBQ1YsT0FBUUEsRUFBTSxPQUNkLElBQUtBLEVBQU0sSUFDWCxHQUFJQSxFQUFNLEVBQUEsQ0FHZCxDQUNBLFNBQVMrVyxHQUFlL1csRUFBTyxDQUN2QixNQUFBcVcsRUFBUzNHLEdBQVcxUCxDQUFLLEVBQzNCLE9BQUFsSCxFQUFBLFFBQVFrSCxFQUFNLFFBQVEsSUFDeEJxVyxFQUFPLFNBQVdyVyxFQUFNLFNBQVMsSUFBSStXLEVBQWMsR0FFOUNWLENBQ1QsQ0FDQSxTQUFTVyxHQUFnQkMsRUFBTyxJQUFLQyxFQUFPLEVBQUcsQ0FDN0MsT0FBT2xHLEVBQVkyRCxHQUFNLEtBQU1zQyxFQUFNQyxDQUFJLENBQzNDLENBTUEsU0FBU0MsRUFBbUJGLEVBQU8sR0FBSUcsRUFBVSxHQUFPLENBQy9DLE9BQUFBLEdBQVdsRyxJQUFhSSxHQUFZM0UsRUFBUyxLQUFNc0ssQ0FBSSxHQUFLakcsRUFBWXJFLEVBQVMsS0FBTXNLLENBQUksQ0FDcEcsQ0FvQkEsU0FBU2IsR0FBa0JwVyxFQUFPc00sRUFBVSxDQUMxQyxJQUFJL1QsRUFBTyxFQUNMLEtBQUEsQ0FBRSxVQUFBK2MsQ0FBYyxFQUFBdFYsRUFDdEIsR0FBSXNNLEdBQVksS0FDSEEsRUFBQSxhQUNGeFQsRUFBQUEsUUFBUXdULENBQVEsRUFDbEIvVCxFQUFBLFdBQ0UsT0FBTytULEdBQWEsU0FDekIsR0FBQWdKLEVBQWEsR0FBUyxDQUN4QixNQUFNckUsRUFBTzNFLEVBQVMsUUFDbEIyRSxJQUNHQSxFQUFBLEtBQU9BLEVBQUssR0FBSyxJQUNKbUYsR0FBQXBXLEVBQU9pUixHQUFNLEVBQzFCQSxFQUFBLEtBQU9BLEVBQUssR0FBSyxLQUV4QixNQUFBLEtBQ0ssQ0FDRTFZLEVBQUEsR0FDUCxNQUFNOGUsRUFBVy9LLEVBQVMsRUFDdEIsQ0FBQytLLEdBQVksRUFBRXpCLE1BQXFCdEosR0FDdENBLEVBQVMsS0FBT3ZGLEVBQ1BzUSxJQUFhLEdBQUt0USxJQUN2QkEsRUFBeUIsTUFBTSxJQUFNLEVBQ3ZDdUYsRUFBUyxFQUFJLEdBRWJBLEVBQVMsRUFBSSxFQUNidE0sRUFBTSxXQUFhLE1BR3pCLE1BQ1MyQixFQUFBQSxXQUFXMkssQ0FBUSxHQUM1QkEsRUFBVyxDQUFFLFFBQVNBLEVBQVUsS0FBTXZGLENBQXlCLEVBQ3hEeE8sRUFBQSxLQUVQK1QsRUFBVyxPQUFPQSxDQUFRLEVBQ3RCZ0osRUFBWSxJQUNQL2MsRUFBQSxHQUNJK1QsRUFBQSxDQUFDMEssR0FBZ0IxSyxDQUFRLENBQUMsR0FFOUIvVCxFQUFBLEdBR1h5SCxFQUFNLFNBQVdzTSxFQUNqQnRNLEVBQU0sV0FBYXpILENBQ3JCLENBQ0EsU0FBU3VlLEtBQWNuaEIsRUFBTSxDQUMzQixNQUFNa2EsRUFBTSxDQUFBLEVBQ1osUUFBU3JhLEVBQUksRUFBR0EsRUFBSUcsRUFBSyxPQUFRSCxJQUFLLENBQzlCLE1BQUE4aEIsRUFBVTNoQixFQUFLSCxDQUFDLEVBQ3RCLFVBQVdnRCxLQUFPOGUsRUFDaEIsR0FBSTllLElBQVEsUUFDTnFYLEVBQUksUUFBVXlILEVBQVEsUUFDeEJ6SCxFQUFJLE1BQVE0RyxFQUFBQSxlQUFlLENBQUM1RyxFQUFJLE1BQU95SCxFQUFRLEtBQUssQ0FBQyxXQUU5QzllLElBQVEsUUFDakJxWCxFQUFJLE1BQVE2RyxFQUFBQSxlQUFlLENBQUM3RyxFQUFJLE1BQU95SCxFQUFRLEtBQUssQ0FBQyxVQUM1Q0MsRUFBQUEsS0FBSy9lLENBQUcsRUFBRyxDQUNkLE1BQUFnZixFQUFXM0gsRUFBSXJYLENBQUcsRUFDbEJpZixFQUFXSCxFQUFROWUsQ0FBRyxFQUN4QmlmLEdBQVlELElBQWFDLEdBQVksRUFBRTNlLEVBQUEsUUFBUTBlLENBQVEsR0FBS0EsRUFBUyxTQUFTQyxDQUFRLEtBQ3BGNUgsRUFBQXJYLENBQUcsRUFBSWdmLEVBQVcsQ0FBQSxFQUFHLE9BQU9BLEVBQVVDLENBQVEsRUFBSUEsRUFDeEQsTUFDU2pmLElBQVEsS0FDYnFYLEVBQUFyWCxDQUFHLEVBQUk4ZSxFQUFROWUsQ0FBRyxFQUc1QixDQUNPLE9BQUFxWCxDQUNULENBcUdBLElBQUk1SCxHQUFrQixLQUN0QixNQUFNbUUsR0FBcUIsSUFBTW5FLElBQW1CbEIsRUFDcEQsSUFBSTJRLEdBRUosQ0FDRSxNQUFNQyxFQUFJelMsRUFBQUEsZ0JBQ0owUyxFQUF1QixDQUFDcGYsRUFBS3FmLElBQVcsQ0FDeEMsSUFBQUMsRUFDQSxPQUFFQSxFQUFVSCxFQUFFbmYsQ0FBRyxLQUNUc2YsRUFBQUgsRUFBRW5mLENBQUcsRUFBSSxJQUNyQnNmLEVBQVEsS0FBS0QsQ0FBTSxFQUNYcGhCLEdBQU0sQ0FDUnFoQixFQUFRLE9BQVMsRUFDbkJBLEVBQVEsUUFBU3ZiLEdBQVFBLEVBQUk5RixDQUFDLENBQUMsRUFFdkJxaEIsRUFBQSxDQUFDLEVBQUVyaEIsQ0FBQyxDQUFBLENBQ2hCLEVBRTJCaWhCLEdBQUFFLEVBQzNCLDJCQUNDbmhCLEdBQU13UixHQUFrQnhSLENBQUEsRUFFTm1oQixFQUNuQixzQkFDQ25oQixHQUFNNlQsR0FBd0I3VCxDQUFBLENBRW5DLENBQ0EsTUFBTW9VLEdBQXNCMUssR0FBYSxDQUN2QyxNQUFNK0csRUFBT2UsR0FDYixPQUFBeVAsR0FBMkJ2WCxDQUFRLEVBQ25DQSxFQUFTLE1BQU0sS0FDUixJQUFNLENBQ1hBLEVBQVMsTUFBTSxNQUNmdVgsR0FBMkJ4USxDQUFJLENBQUEsQ0FFbkMsRUFjQSxTQUFTd0ssR0FBb0J2UixFQUFVLENBQzlCLE9BQUFBLEVBQVMsTUFBTSxVQUFZLENBQ3BDLENBQ0EsSUFBSW1LLEdBQXdCLEdBMks1QixTQUFTeU4sR0FBYzVYLEVBQVUsQ0FDL0IsT0FBT0EsRUFBUyxhQUFlQSxFQUFTLFdBQWEsSUFBSSxNQUN2REEsRUFBUyxNQUNOLFFBQVEsSUFBSSxXQUFhLGFBQWdCLENBQzFDLElBQUk3SCxFQUFRRSxFQUFLLENBRVQsT0FBQUgsRUFBQThILEVBQVUsTUFBTyxRQUFRLEVBQ3hCN0gsRUFBT0UsQ0FBRyxDQUNuQixFQUNBLEtBQU0sQ0FDSixPQUFBMEgsRUFBTyxpQ0FBaUMsRUFDakMsRUFDVCxFQUNBLGdCQUFpQixDQUNmLE9BQUFBLEVBQU8saUNBQWlDLEVBQ2pDLEVBQ1QsQ0FBQSxFQUNFLENBQ0YsSUFBSTVILEVBQVFFLEVBQUssQ0FDVCxPQUFBSCxFQUFBOEgsRUFBVSxNQUFPLFFBQVEsRUFDeEI3SCxFQUFPRSxDQUFHLENBQ25CLENBQ0YsQ0FBQSxFQUVKLENBQ0EsU0FBU3dmLEdBQWM3WCxFQUFVLENBQy9CLE9BQU9BLEVBQVMsYUFBZUEsRUFBUyxXQUFhLElBQUksTUFBTUEsRUFBUyxNQUFPLENBQzdFLElBQUk3SCxFQUFRRSxFQUFLLENBQ1QsT0FBQUgsRUFBQThILEVBQVUsTUFBTyxRQUFRLEVBQ3hCN0gsRUFBT0UsQ0FBRyxDQUNuQixDQUNELENBQUEsRUFDSCxDQUNBLFNBQVNxYSxHQUFtQjFTLEVBQVUsQ0FDOUIsTUFBQThYLEVBQVVDLEdBQVksQ0FDMUIsR0FBTyxRQUFRLElBQUksV0FBYSxlQUMxQi9YLEVBQVMsU0FDWEQsRUFBTyxrREFBa0QsRUFFdkRnWSxHQUFXLE1BQU0sQ0FDbkIsSUFBSUMsRUFBYyxPQUFPRCxFQUNyQkMsSUFBZ0IsV0FDZHJmLEVBQUFBLFFBQVFvZixDQUFPLEVBQ0hDLEVBQUEsUUFDTHZkLEVBQU1zZCxDQUFPLElBQ1JDLEVBQUEsUUFHZEEsSUFBZ0IsVUFDbEJqWSxFQUNFLHNEQUFzRGlZLENBQVcsR0FBQSxDQUd2RSxDQUVPaFksRUFBQSxRQUFVK1gsR0FBVyxFQUFDLEVBRWpDLE9BQU8sUUFBUSxJQUFJLFdBQWEsYUFDdkIsT0FBTyxPQUFPLENBQ25CLElBQUksT0FBUSxDQUNWLE9BQU9ILEdBQWM1WCxDQUFRLENBQy9CLEVBQ0EsSUFBSSxPQUFRLENBQ1YsT0FBTzZYLEdBQWM3WCxDQUFRLENBQy9CLEVBQ0EsSUFBSSxNQUFPLENBQ1QsTUFBTyxDQUFDcUcsS0FBVTdRLElBQVN3SyxFQUFTLEtBQUtxRyxFQUFPLEdBQUc3USxDQUFJLENBQ3pELEVBQ0EsT0FBQXNpQixDQUFBLENBQ0QsRUFFTSxDQUNMLElBQUksT0FBUSxDQUNWLE9BQU9GLEdBQWM1WCxDQUFRLENBQy9CLEVBQ0EsTUFBT0EsRUFBUyxNQUNoQixLQUFNQSxFQUFTLEtBQ2YsT0FBQThYLENBQUEsQ0FHTixDQUNBLFNBQVMzTSxHQUFlbkwsRUFBVSxDQUNoQyxHQUFJQSxFQUFTLFFBQ0osT0FBQUEsRUFBUyxjQUFnQkEsRUFBUyxZQUFjLElBQUksTUFBTVAsR0FBVU4sR0FBUWEsRUFBUyxPQUFPLENBQUMsRUFBRyxDQUNyRyxJQUFJN0gsRUFBUUUsRUFBSyxDQUNmLEdBQUlBLEtBQU9GLEVBQ1QsT0FBT0EsRUFBT0UsQ0FBRyxFQUNuQixHQUFXQSxLQUFPbVosR0FDVCxPQUFBQSxHQUFvQm5aLENBQUcsRUFBRTJILENBQVEsQ0FFNUMsRUFDQSxJQUFJN0gsRUFBUUUsRUFBSyxDQUNSLE9BQUFBLEtBQU9GLEdBQVVFLEtBQU9tWixFQUNqQyxDQUNELENBQUEsRUFFTCxDQUNBLE1BQU15RyxHQUFhLGtCQUNiQyxHQUFZQyxHQUFRQSxFQUFJLFFBQVFGLEdBQWExTCxHQUFNQSxFQUFFLFlBQVksQ0FBQyxFQUFFLFFBQVEsUUFBUyxFQUFFLEVBQzdGLFNBQVMxSCxHQUFpQmtELEVBQVdxUSxFQUFrQixHQUFNLENBQ3BELE9BQUE1VyxhQUFXdUcsQ0FBUyxFQUFJQSxFQUFVLGFBQWVBLEVBQVUsS0FBT0EsRUFBVSxNQUFRcVEsR0FBbUJyUSxFQUFVLE1BQzFILENBQ0EsU0FBUzFILEdBQW9CTCxFQUFVK0gsRUFBVy9HLEVBQVMsR0FBTyxDQUM1RCxJQUFBeUcsRUFBTzVDLEdBQWlCa0QsQ0FBUyxFQUNqQyxHQUFBLENBQUNOLEdBQVFNLEVBQVUsT0FBUSxDQUM3QixNQUFNN1MsRUFBUTZTLEVBQVUsT0FBTyxNQUFNLGlCQUFpQixFQUNsRDdTLElBQ0Z1UyxFQUFPdlMsRUFBTSxDQUFDLEVBRWxCLENBQ0EsR0FBSSxDQUFDdVMsR0FBUXpILEdBQVlBLEVBQVMsT0FBUSxDQUNsQyxNQUFBcVksRUFBcUJqUSxHQUFhLENBQ3RDLFVBQVcvUCxLQUFPK1AsRUFDWixHQUFBQSxFQUFTL1AsQ0FBRyxJQUFNMFAsRUFDYixPQUFBMVAsQ0FFWCxFQUVLb1AsRUFBQTRRLEVBQ0xyWSxFQUFTLFlBQWNBLEVBQVMsT0FBTyxLQUFLLFVBQ3pDLEdBQUFxWSxFQUFrQnJZLEVBQVMsV0FBVyxVQUFVLENBQ3ZELENBQ0EsT0FBT3lILEVBQU95USxHQUFTelEsQ0FBSSxFQUFJekcsRUFBUyxNQUFRLFdBQ2xELENBQ0EsU0FBU3dFLEdBQWlCdlEsRUFBTyxDQUN4QixPQUFBdU0sYUFBV3ZNLENBQUssR0FBSyxjQUFlQSxDQUM3QyxDQTJEQSxTQUFTcWpCLEdBQUVsZ0IsRUFBTW1nQixFQUFpQnBNLEVBQVUsQ0FDMUMsTUFBTTFTLEVBQUksVUFBVSxPQUNwQixPQUFJQSxJQUFNLEVBQ0ppQixXQUFTNmQsQ0FBZSxHQUFLLENBQUM1ZixFQUFBLFFBQVE0ZixDQUFlLEVBQ25EbEgsR0FBUWtILENBQWUsRUFDbEIxSCxFQUFZelksRUFBTSxLQUFNLENBQUNtZ0IsQ0FBZSxDQUFDLEVBRTNDMUgsRUFBWXpZLEVBQU1tZ0IsQ0FBZSxFQUVqQzFILEVBQVl6WSxFQUFNLEtBQU1tZ0IsQ0FBZSxHQUc1QzllLEVBQUksRUFDTjBTLEVBQVcsTUFBTSxVQUFVLE1BQU0sS0FBSyxVQUFXLENBQUMsRUFDekMxUyxJQUFNLEdBQUs0WCxHQUFRbEYsQ0FBUSxJQUNwQ0EsRUFBVyxDQUFDQSxDQUFRLEdBRWYwRSxFQUFZelksRUFBTW1nQixFQUFpQnBNLENBQVEsRUFFdEQsQ0FFQSxTQUFTblIsR0FBVS9GLEVBQU8sQ0FDeEIsTUFBTyxDQUFDLEVBQUVBLEdBQVNBLEVBQU0sY0FDM0IsQ0FFQSxTQUFTdWpCLElBQXNCLENBQ3pCLEdBQUksUUFBUSxJQUFJLFdBQWEsY0FBaUIsT0FBTyxPQUFXLElBQ2xFLE9BRUksTUFBQUMsRUFBVyxDQUFFLE1BQU8saUJBQ3BCQyxFQUFjLENBQUUsTUFBTyxpQkFDdkJDLEVBQWMsQ0FBRSxNQUFPLGlCQUN2QkMsRUFBZSxDQUFFLE1BQU8saUJBQ3hCQyxFQUFZLENBQ2hCLE9BQU9qZixFQUFLLENBQ04sT0FBQ2MsRUFBQUEsU0FBU2QsQ0FBRyxFQUdiQSxFQUFJLFFBQ0MsQ0FBQyxNQUFPNmUsRUFBVSxhQUFhLEVBQzdCaGUsRUFBTWIsQ0FBRyxFQUNYLENBQ0wsTUFDQSxDQUFDLEVBQ0QsQ0FBQyxPQUFRNmUsRUFBVUssRUFBV2xmLENBQUcsQ0FBQyxFQUNsQyxJQUNBbWYsRUFBWW5mLEVBQUksS0FBSyxFQUNyQixHQUFBLEVBRU9vRixHQUFXcEYsQ0FBRyxFQUNoQixDQUNMLE1BQ0EsQ0FBQyxFQUNELENBQUMsT0FBUTZlLEVBQVV6ZCxHQUFVcEIsQ0FBRyxFQUFJLGtCQUFvQixVQUFVLEVBQ2xFLElBQ0FtZixFQUFZbmYsQ0FBRyxFQUNmLElBQUltQixHQUFXbkIsQ0FBRyxFQUFJLGNBQWdCLEVBQUUsRUFBQSxFQUVqQ21CLEdBQVduQixDQUFHLEVBQ2hCLENBQ0wsTUFDQSxDQUFDLEVBQ0QsQ0FBQyxPQUFRNmUsRUFBVXpkLEdBQVVwQixDQUFHLEVBQUksa0JBQW9CLFVBQVUsRUFDbEUsSUFDQW1mLEVBQVluZixDQUFHLEVBQ2YsR0FBQSxFQUdHLEtBaENFLElBaUNYLEVBQ0EsUUFBUUEsRUFBSyxDQUNYLE9BQU9BLEdBQU9BLEVBQUksT0FDcEIsRUFDQSxLQUFLQSxFQUFLLENBQ0osR0FBQUEsR0FBT0EsRUFBSSxRQUNOLE1BQUEsQ0FDTCxNQUNBLENBQUMsRUFDRCxHQUFHb2YsRUFBZXBmLEVBQUksQ0FBQyxDQUFBLENBRzdCLENBQUEsRUFFRixTQUFTb2YsRUFBZWhaLEVBQVUsQ0FDaEMsTUFBTWlaLEVBQVMsQ0FBQSxFQUNYalosRUFBUyxLQUFLLE9BQVNBLEVBQVMsT0FDbENpWixFQUFPLEtBQUtDLEVBQW9CLFFBQVMxZixFQUFNd0csRUFBUyxLQUFLLENBQUMsQ0FBQyxFQUU3REEsRUFBUyxhQUFlb0osYUFDMUI2UCxFQUFPLEtBQUtDLEVBQW9CLFFBQVNsWixFQUFTLFVBQVUsQ0FBQyxFQUUzREEsRUFBUyxPQUFTb0osYUFDcEI2UCxFQUFPLEtBQUtDLEVBQW9CLE9BQVExZixFQUFNd0csRUFBUyxJQUFJLENBQUMsQ0FBQyxFQUV6RHBKLE1BQUFBLEVBQVd1aUIsRUFBWW5aLEVBQVUsVUFBVSxFQUM3Q3BKLEdBQ0ZxaUIsRUFBTyxLQUFLQyxFQUFvQixXQUFZdGlCLENBQVEsQ0FBQyxFQUVqRCxNQUFBd2lCLEVBQVdELEVBQVluWixFQUFVLFFBQVEsRUFDL0MsT0FBSW9aLEdBQ0ZILEVBQU8sS0FBS0MsRUFBb0IsV0FBWUUsQ0FBUSxDQUFDLEVBRXZESCxFQUFPLEtBQUssQ0FDVixNQUNBLENBQUMsRUFDRCxDQUNFLE9BQ0EsQ0FDRSxNQUFPTCxFQUFhLE1BQVEsZUFDOUIsRUFDQSxnQkFDRixFQUNBLENBQUMsU0FBVSxDQUFFLE9BQVE1WSxFQUFVLENBQUEsQ0FDaEMsRUFDTWlaLENBQ1QsQ0FDUyxTQUFBQyxFQUFvQjlnQixFQUFNRCxFQUFRLENBRXpDLE9BRFNBLEVBQUFWLEVBQUEsT0FBTyxHQUFJVSxDQUFNLEVBQ3JCLE9BQU8sS0FBS0EsQ0FBTSxFQUFFLE9BR2xCLENBQ0wsTUFDQSxDQUFFLE1BQU8sd0NBQXlDLEVBQ2xELENBQ0UsTUFDQSxDQUNFLE1BQU8sZUFDVCxFQUNBQyxDQUNGLEVBQ0EsQ0FDRSxNQUNBLENBQ0UsTUFBTyxxQkFDVCxFQUNBLEdBQUcsT0FBTyxLQUFLRCxDQUFNLEVBQUUsSUFBS0UsR0FDbkIsQ0FDTCxNQUNBLENBQUMsRUFDRCxDQUFDLE9BQVF1Z0IsRUFBY3ZnQixFQUFNLElBQUksRUFDakMwZ0IsRUFBWTVnQixFQUFPRSxDQUFHLEVBQUcsRUFBSyxDQUFBLENBRWpDLENBQ0gsQ0FBQSxFQXpCTyxDQUFDLE9BQVEsQ0FBQSxDQUFFLENBMkJ0QixDQUNTLFNBQUEwZ0IsRUFBWXppQixFQUFHK2lCLEVBQVEsR0FBTSxDQUNoQyxPQUFBLE9BQU8vaUIsR0FBTSxTQUNSLENBQUMsT0FBUW9pQixFQUFhcGlCLENBQUMsRUFDckIsT0FBT0EsR0FBTSxTQUNmLENBQUMsT0FBUXFpQixFQUFhLEtBQUssVUFBVXJpQixDQUFDLENBQUMsRUFDckMsT0FBT0EsR0FBTSxVQUNmLENBQUMsT0FBUXNpQixFQUFjdGlCLENBQUMsRUFDdEJvRSxFQUFBQSxTQUFTcEUsQ0FBQyxFQUNaLENBQUMsU0FBVSxDQUFFLE9BQVEraUIsRUFBUTdmLEVBQU1sRCxDQUFDLEVBQUlBLENBQUEsQ0FBRyxFQUUzQyxDQUFDLE9BQVFxaUIsRUFBYSxPQUFPcmlCLENBQUMsQ0FBQyxDQUUxQyxDQUNTLFNBQUE2aUIsRUFBWW5aLEVBQVU1SCxFQUFNLENBQ25DLE1BQU1raEIsRUFBT3RaLEVBQVMsS0FDbEIsR0FBQXdCLEVBQUFBLFdBQVc4WCxDQUFJLEVBQ2pCLE9BRUYsTUFBTUMsRUFBWSxDQUFBLEVBQ1AsVUFBQWxoQixLQUFPMkgsRUFBUyxJQUNyQndaLEVBQVlGLEVBQU1qaEIsRUFBS0QsQ0FBSSxJQUM3Qm1oQixFQUFVbGhCLENBQUcsRUFBSTJILEVBQVMsSUFBSTNILENBQUcsR0FHOUIsT0FBQWtoQixDQUNULENBQ1MsU0FBQUMsRUFBWUYsRUFBTWpoQixFQUFLRCxFQUFNLENBQzlCLE1BQUFxaEIsRUFBT0gsRUFBS2xoQixDQUFJLEVBT3RCLEdBTklPLFVBQVE4Z0IsQ0FBSSxHQUFLQSxFQUFLLFNBQVNwaEIsQ0FBRyxHQUFLcUMsV0FBUytlLENBQUksR0FBS3BoQixLQUFPb2hCLEdBR2hFSCxFQUFLLFNBQVdFLEVBQVlGLEVBQUssUUFBU2poQixFQUFLRCxDQUFJLEdBR25Ea2hCLEVBQUssUUFBVUEsRUFBSyxPQUFPLEtBQU1uRyxHQUFNcUcsRUFBWXJHLEVBQUc5YSxFQUFLRCxDQUFJLENBQUMsRUFDM0QsTUFBQSxFQUVYLENBQ0EsU0FBUzBnQixFQUFXeGlCLEVBQUcsQ0FDakIwRSxPQUFBQSxHQUFVMUUsQ0FBQyxFQUNOLGFBRUxBLEVBQUUsT0FDRyxjQUVGLEtBQ1QsQ0FDSSxPQUFPLG1CQUNGLE9BQUEsbUJBQW1CLEtBQUt1aUIsQ0FBUyxFQUVqQyxPQUFBLG1CQUFxQixDQUFDQSxDQUFTLENBRTFDLENBNEJBLE1BQU12akIsR0FBVSxRQUFRLElBQUksV0FBYSxhQUFnQnlLLEVBQVMyRSxPQUU5QyxRQUFRLElBQUksU0FDTCxRQUFRLElBQUksU0N2OFB2QztBQUFBO0FBQUE7QUFBQTtBQUFBLEdBNkVBLE1BQU1nVixHQUFhLGFBQ2JDLEdBQVksWUFDWkMsR0FBUyxPQUFPLE1BQU0sRUFDdEJDLEdBQWEsQ0FBQ3pZLEVBQU8sQ0FBRSxNQUFBNEssS0FBWXNNLEdBQUV2TSxHQUFnQitOLEdBQXVCMVksQ0FBSyxFQUFHNEssQ0FBSyxFQUMvRjZOLEdBQVcsWUFBYyxhQUN6QixNQUFNRSxHQUErQixDQUNuQyxLQUFNLE9BQ04sS0FBTSxPQUNOLElBQUssQ0FDSCxLQUFNLFFBQ04sUUFBUyxFQUNWLEVBQ0QsU0FBVSxDQUFDLE9BQVEsT0FBUSxNQUFNLEVBQ2pDLGVBQWdCLE9BQ2hCLGlCQUFrQixPQUNsQixhQUFjLE9BQ2QsZ0JBQWlCLE9BQ2pCLGtCQUFtQixPQUNuQixjQUFlLE9BQ2YsZUFBZ0IsT0FDaEIsaUJBQWtCLE9BQ2xCLGFBQWMsTUFDaEIsRUFDa0NGLEdBQVcsTUFBd0JwaUIsRUFBTSxPQUN6RSxDQUFFLEVBQ0ZxVSxHQUNBaU8sRUFDRixFQUNBLE1BQU1wTCxHQUFXLENBQUNwSSxFQUFNL1EsRUFBTyxLQUFPLENBQ2hDbUQsRUFBQUEsUUFBUTROLENBQUksRUFDZEEsRUFBSyxRQUFTeVQsR0FBT0EsRUFBRyxHQUFHeGtCLENBQUksQ0FBQyxFQUN2QitRLEdBQ1RBLEVBQUssR0FBRy9RLENBQUksQ0FFaEIsRUFDTXlrQixHQUF1QjFULEdBQ3BCQSxFQUFPNU4sRUFBQUEsUUFBUTROLENBQUksRUFBSUEsRUFBSyxLQUFNeVQsR0FBT0EsRUFBRyxPQUFTLENBQUMsRUFBSXpULEVBQUssT0FBUyxFQUFJLEdBRXJGLFNBQVN1VCxHQUF1QnJOLEVBQVUsQ0FDeEMsTUFBTXlOLEVBQVksQ0FBQSxFQUNsQixVQUFXN2hCLEtBQU9vVSxFQUNWcFUsS0FBTzBoQixLQUNYRyxFQUFVN2hCLENBQUcsRUFBSW9VLEVBQVNwVSxDQUFHLEdBR2pDLEdBQUlvVSxFQUFTLE1BQVEsR0FDbkIsT0FBT3lOLEVBRVQsS0FBTSxDQUNKLEtBQUF6UyxFQUFPLElBQ1AsS0FBQXJQLEVBQ0EsU0FBQStoQixFQUNBLGVBQUFDLEVBQWlCLEdBQUczUyxDQUFJLGNBQ3hCLGlCQUFBNFMsRUFBbUIsR0FBRzVTLENBQUksZ0JBQzFCLGFBQUE2UyxFQUFlLEdBQUc3UyxDQUFJLFlBQ3RCLGdCQUFBOFMsRUFBa0JILEVBQ2xCLGtCQUFBSSxFQUFvQkgsRUFDcEIsY0FBQUksRUFBZ0JILEVBQ2hCLGVBQUFJLEVBQWlCLEdBQUdqVCxDQUFJLGNBQ3hCLGlCQUFBa1QsRUFBbUIsR0FBR2xULENBQUksZ0JBQzFCLGFBQUFtVCxFQUFlLEdBQUduVCxDQUFJLFdBQ3ZCLEVBQUdnRixFQUNFb08sRUFBWUMsR0FBa0JYLENBQVEsRUFDdENZLEVBQWdCRixHQUFhQSxFQUFVLENBQUMsRUFDeENHLEVBQWdCSCxHQUFhQSxFQUFVLENBQUMsRUFDeEMsQ0FDSixjQUFBOU0sRUFDQSxRQUFBQyxFQUNBLGlCQUFBRSxFQUNBLFFBQUFFLEVBQ0EsaUJBQUFFLEVBQ0EsZUFBQUMsRUFBaUJSLEVBQ2pCLFNBQUFTLEdBQVdSLEVBQ1gsa0JBQUFVLEVBQW9CUixDQUNyQixFQUFHZ00sRUFDRWUsRUFBYyxDQUFDMU4sRUFBSTJOLEVBQVU5ZCxLQUFTLENBQzFDK2QsR0FBc0I1TixFQUFJMk4sRUFBV1QsRUFBZ0JILENBQVksRUFDakVhLEdBQXNCNU4sRUFBSTJOLEVBQVdWLEVBQW9CSCxDQUFnQixFQUN6RWpkLElBQVFBLEdBQUksQ0FDaEIsRUFDUWdlLEVBQWMsQ0FBQzdOLEVBQUluUSxJQUFTLENBQ2hDbVEsRUFBRyxXQUFhLEdBQ2hCNE4sR0FBc0I1TixFQUFJbU4sQ0FBYyxFQUN4Q1MsR0FBc0I1TixFQUFJcU4sQ0FBWSxFQUN0Q08sR0FBc0I1TixFQUFJb04sQ0FBZ0IsRUFDMUN2ZCxHQUFRQSxFQUFJLENBQ2hCLEVBQ1FpZSxFQUFpQkgsR0FDZCxDQUFDM04sRUFBSW5RLEtBQVMsQ0FDbkIsTUFBTW1KLEdBQU8yVSxFQUFXMU0sR0FBV1IsRUFDN0I5RixHQUFVLElBQU0rUyxFQUFZMU4sRUFBSTJOLEVBQVU5ZCxFQUFJLEVBQ3BEdVIsR0FBU3BJLEdBQU0sQ0FBQ2dILEVBQUlyRixFQUFPLENBQUMsRUFDNUJvVCxHQUFVLElBQU0sQ0FDZEgsR0FBc0I1TixFQUFJMk4sRUFBV1gsRUFBa0JILENBQWMsRUFDckVtQixHQUFtQmhPLEVBQUkyTixFQUFXVCxFQUFnQkgsQ0FBWSxFQUN6REwsR0FBb0IxVCxFQUFJLEdBQzNCaVYsR0FBbUJqTyxFQUFJblYsRUFBTTJpQixFQUFlN1MsRUFBTyxDQUU3RCxDQUFPLENBQ1AsRUFFRSxPQUFPelEsRUFBQUEsT0FBT3lpQixFQUFXLENBQ3ZCLGNBQWMzTSxFQUFJLENBQ2hCb0IsR0FBU1osRUFBZSxDQUFDUixDQUFFLENBQUMsRUFDNUJnTyxHQUFtQmhPLEVBQUk2TSxDQUFjLEVBQ3JDbUIsR0FBbUJoTyxFQUFJOE0sQ0FBZ0IsQ0FDeEMsRUFDRCxlQUFlOU0sRUFBSSxDQUNqQm9CLEdBQVNKLEVBQWdCLENBQUNoQixDQUFFLENBQUMsRUFDN0JnTyxHQUFtQmhPLEVBQUlnTixDQUFlLEVBQ3RDZ0IsR0FBbUJoTyxFQUFJaU4sQ0FBaUIsQ0FDekMsRUFDRCxRQUFTYSxFQUFjLEVBQUssRUFDNUIsU0FBVUEsRUFBYyxFQUFJLEVBQzVCLFFBQVE5TixFQUFJblEsRUFBTSxDQUNoQm1RLEVBQUcsV0FBYSxHQUNoQixNQUFNckYsR0FBVSxJQUFNa1QsRUFBWTdOLEVBQUluUSxDQUFJLEVBQzFDbWUsR0FBbUJoTyxFQUFJbU4sQ0FBYyxFQUNyQ2UsS0FDQUYsR0FBbUJoTyxFQUFJb04sQ0FBZ0IsRUFDdkNXLEdBQVUsSUFBTSxDQUNUL04sRUFBRyxhQUdSNE4sR0FBc0I1TixFQUFJbU4sQ0FBYyxFQUN4Q2EsR0FBbUJoTyxFQUFJcU4sQ0FBWSxFQUM5QlgsR0FBb0I3TCxDQUFPLEdBQzlCb04sR0FBbUJqTyxFQUFJblYsRUFBTTRpQixFQUFlOVMsRUFBTyxFQUU3RCxDQUFPLEVBQ0R5RyxHQUFTUCxFQUFTLENBQUNiLEVBQUlyRixFQUFPLENBQUMsQ0FDaEMsRUFDRCxpQkFBaUJxRixFQUFJLENBQ25CME4sRUFBWTFOLEVBQUksRUFBSyxFQUNyQm9CLEdBQVNULEVBQWtCLENBQUNYLENBQUUsQ0FBQyxDQUNoQyxFQUNELGtCQUFrQkEsRUFBSSxDQUNwQjBOLEVBQVkxTixFQUFJLEVBQUksRUFDcEJvQixHQUFTRCxFQUFtQixDQUFDbkIsQ0FBRSxDQUFDLENBQ2pDLEVBQ0QsaUJBQWlCQSxFQUFJLENBQ25CNk4sRUFBWTdOLENBQUUsRUFDZG9CLEdBQVNMLEVBQWtCLENBQUNmLENBQUUsQ0FBQyxDQUNoQyxDQUNMLENBQUcsQ0FDSCxDQUNBLFNBQVN1TixHQUFrQlgsRUFBVSxDQUNuQyxHQUFJQSxHQUFZLEtBQ2QsT0FBTyxLQUNGLEdBQUl6ZixFQUFBQSxTQUFTeWYsQ0FBUSxFQUMxQixNQUFPLENBQUN1QixHQUFTdkIsRUFBUyxLQUFLLEVBQUd1QixHQUFTdkIsRUFBUyxLQUFLLENBQUMsRUFDckQsQ0FDTCxNQUFNakksRUFBSXdKLEdBQVN2QixDQUFRLEVBQzNCLE1BQU8sQ0FBQ2pJLEVBQUdBLENBQUMsQ0FDYixDQUNILENBQ0EsU0FBU3dKLEdBQVNoYSxFQUFLLENBQ3JCLE1BQU1oSSxFQUFNaWlCLFdBQVNqYSxDQUFHLEVBQ3hCLE9BQU8sUUFBUSxJQUFJLFdBQWEsY0FDOUJELEdBQWEvSCxFQUFLLGdDQUFnQyxFQUU3Q0EsQ0FDVCxDQUNBLFNBQVM2aEIsR0FBbUJoTyxFQUFJcU8sRUFBSyxDQUNuQ0EsRUFBSSxNQUFNLEtBQUssRUFBRSxRQUFTclAsR0FBTUEsR0FBS2dCLEVBQUcsVUFBVSxJQUFJaEIsQ0FBQyxDQUFDLEdBQ3ZEZ0IsRUFBR3FNLEVBQU0sSUFBTXJNLEVBQUdxTSxFQUFNLEVBQW9CLElBQUksTUFBUSxJQUFJZ0MsQ0FBRyxDQUNsRSxDQUNBLFNBQVNULEdBQXNCNU4sRUFBSXFPLEVBQUssQ0FDdENBLEVBQUksTUFBTSxLQUFLLEVBQUUsUUFBU3JQLEdBQU1BLEdBQUtnQixFQUFHLFVBQVUsT0FBT2hCLENBQUMsQ0FBQyxFQUMzRCxNQUFNc1AsRUFBT3RPLEVBQUdxTSxFQUFNLEVBQ2xCaUMsSUFDRkEsRUFBSyxPQUFPRCxDQUFHLEVBQ1ZDLEVBQUssT0FDUnRPLEVBQUdxTSxFQUFNLEVBQUksUUFHbkIsQ0FDQSxTQUFTMEIsR0FBVXRYLEVBQUksQ0FDckIsc0JBQXNCLElBQU0sQ0FDMUIsc0JBQXNCQSxDQUFFLENBQzVCLENBQUcsQ0FDSCxDQUNBLElBQUk4WCxHQUFRLEVBQ1osU0FBU04sR0FBbUJqTyxFQUFJd08sRUFBY0MsRUFBaUI5VCxFQUFTLENBQ3RFLE1BQU01RSxFQUFLaUssRUFBRyxPQUFTLEVBQUV1TyxHQUNuQkcsRUFBb0IsSUFBTSxDQUMxQjNZLElBQU9pSyxFQUFHLFFBQ1pyRixHQUVOLEVBQ0UsR0FBSThULEVBQ0YsT0FBTyxXQUFXQyxFQUFtQkQsQ0FBZSxFQUV0RCxLQUFNLENBQUUsS0FBQTVqQixFQUFNLFFBQUE4akIsRUFBUyxVQUFBQyxDQUFXLEVBQUdDLEdBQWtCN08sRUFBSXdPLENBQVksRUFDdkUsR0FBSSxDQUFDM2pCLEVBQ0gsT0FBTzhQLEVBQU8sRUFFaEIsTUFBTW1VLEVBQVdqa0IsRUFBTyxNQUN4QixJQUFJa2tCLEVBQVEsRUFDWixNQUFNdG5CLEVBQU0sSUFBTSxDQUNoQnVZLEVBQUcsb0JBQW9COE8sRUFBVUUsQ0FBSyxFQUN0Q04sR0FDSixFQUNRTSxFQUFTdlcsR0FBTSxDQUNmQSxFQUFFLFNBQVd1SCxHQUFNLEVBQUUrTyxHQUFTSCxHQUNoQ25uQixHQUVOLEVBQ0UsV0FBVyxJQUFNLENBQ1hzbkIsRUFBUUgsR0FDVm5uQixHQUVOLEVBQUtrbkIsRUFBVSxDQUFDLEVBQ2QzTyxFQUFHLGlCQUFpQjhPLEVBQVVFLENBQUssQ0FDckMsQ0FDQSxTQUFTSCxHQUFrQjdPLEVBQUl3TyxFQUFjLENBQzNDLE1BQU1TLEVBQVMsT0FBTyxpQkFBaUJqUCxDQUFFLEVBQ25Da1AsRUFBc0Jwa0IsSUFBU21rQixFQUFPbmtCLENBQUcsR0FBSyxJQUFJLE1BQU0sSUFBSSxFQUM1RHFrQixFQUFtQkQsRUFBbUIsR0FBRy9DLEVBQVUsT0FBTyxFQUMxRGlELEVBQXNCRixFQUFtQixHQUFHL0MsRUFBVSxVQUFVLEVBQ2hFa0QsRUFBb0JDLEdBQVdILEVBQWtCQyxDQUFtQixFQUNwRUcsRUFBa0JMLEVBQW1CLEdBQUc5QyxFQUFTLE9BQU8sRUFDeERvRCxFQUFxQk4sRUFBbUIsR0FBRzlDLEVBQVMsVUFBVSxFQUM5RHFELEVBQW1CSCxHQUFXQyxFQUFpQkMsQ0FBa0IsRUFDdkUsSUFBSTNrQixFQUFPLEtBQ1A4akIsRUFBVSxFQUNWQyxFQUFZLEVBQ1pKLElBQWlCckMsR0FDZmtELEVBQW9CLElBQ3RCeGtCLEVBQU9zaEIsR0FDUHdDLEVBQVVVLEVBQ1ZULEVBQVlRLEVBQW9CLFFBRXpCWixJQUFpQnBDLEdBQ3RCcUQsRUFBbUIsSUFDckI1a0IsRUFBT3VoQixHQUNQdUMsRUFBVWMsRUFDVmIsRUFBWVksRUFBbUIsU0FHakNiLEVBQVUsS0FBSyxJQUFJVSxFQUFtQkksQ0FBZ0IsRUFDdEQ1a0IsRUFBTzhqQixFQUFVLEVBQUlVLEVBQW9CSSxFQUFtQnRELEdBQWFDLEdBQVksS0FDckZ3QyxFQUFZL2pCLEVBQU9BLElBQVNzaEIsR0FBYWlELEVBQW9CLE9BQVNJLEVBQW1CLE9BQVMsR0FFcEcsTUFBTUUsRUFBZTdrQixJQUFTc2hCLElBQWMseUJBQXlCLEtBQ25FK0MsRUFBbUIsR0FBRy9DLEVBQVUsVUFBVSxFQUFFLFNBQVUsQ0FDMUQsRUFDRSxNQUFPLENBQ0wsS0FBQXRoQixFQUNBLFFBQUE4akIsRUFDQSxVQUFBQyxFQUNBLGFBQUFjLENBQ0osQ0FDQSxDQUNBLFNBQVNKLEdBQVdLLEVBQVFyQyxFQUFXLENBQ3JDLEtBQU9xQyxFQUFPLE9BQVNyQyxFQUFVLFFBQy9CcUMsRUFBU0EsRUFBTyxPQUFPQSxDQUFNLEVBRS9CLE9BQU8sS0FBSyxJQUFJLEdBQUdyQyxFQUFVLElBQUksQ0FBQ3NDLEVBQUc5bkIsSUFBTStuQixHQUFLRCxDQUFDLEVBQUlDLEdBQUtGLEVBQU83bkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUN2RSxDQUNBLFNBQVMrbkIsR0FBSzVULEVBQUcsQ0FDZixPQUFJQSxJQUFNLE9BQ0QsRUFDRixPQUFPQSxFQUFFLE1BQU0sRUFBRyxFQUFFLEVBQUUsUUFBUSxJQUFLLEdBQUcsQ0FBQyxFQUFJLEdBQ3BELENBQ0EsU0FBU2lTLElBQWMsQ0FDckIsT0FBTyxTQUFTLEtBQUssWUFDdkIsQ0FnQkEsTUFBTTRCLEdBQWMsT0FBTyxNQUFNLEVBQzNCQyxHQUFRLENBQ1osWUFBWS9QLEVBQUksQ0FBRSxNQUFBdFksQ0FBSyxFQUFJLENBQUUsV0FBQXNvQixDQUFVLEVBQUksQ0FDekNoUSxFQUFHOFAsRUFBVyxFQUFJOVAsRUFBRyxNQUFNLFVBQVksT0FBUyxHQUFLQSxFQUFHLE1BQU0sUUFDMURnUSxHQUFjdG9CLEVBQ2hCc29CLEVBQVcsWUFBWWhRLENBQUUsRUFFekJpUSxHQUFXalEsRUFBSXRZLENBQUssQ0FFdkIsRUFDRCxRQUFRc1ksRUFBSSxDQUFFLE1BQUF0WSxDQUFLLEVBQUksQ0FBRSxXQUFBc29CLENBQVUsRUFBSSxDQUNqQ0EsR0FBY3RvQixHQUNoQnNvQixFQUFXLE1BQU1oUSxDQUFFLENBRXRCLEVBQ0QsUUFBUUEsRUFBSSxDQUFFLE1BQUF0WSxFQUFPLFNBQUF1RCxDQUFVLEVBQUUsQ0FBRSxXQUFBK2tCLEdBQWMsQ0FDM0MsQ0FBQ3RvQixHQUFVLENBQUN1RCxJQUVaK2tCLEVBQ0V0b0IsR0FDRnNvQixFQUFXLFlBQVloUSxDQUFFLEVBQ3pCaVEsR0FBV2pRLEVBQUksRUFBSSxFQUNuQmdRLEVBQVcsTUFBTWhRLENBQUUsR0FFbkJnUSxFQUFXLE1BQU1oUSxFQUFJLElBQU0sQ0FDekJpUSxHQUFXalEsRUFBSSxFQUFLLENBQzlCLENBQVMsRUFHSGlRLEdBQVdqUSxFQUFJdFksQ0FBSyxFQUV2QixFQUNELGNBQWNzWSxFQUFJLENBQUUsTUFBQXRZLEdBQVMsQ0FDM0J1b0IsR0FBV2pRLEVBQUl0WSxDQUFLLENBQ3JCLENBQ0gsRUFDTyxRQUFRLElBQUksV0FBYSxlQUM5QnFvQixHQUFNLEtBQU8sUUFFZixTQUFTRSxHQUFXalEsRUFBSXRZLEVBQU8sQ0FDN0JzWSxFQUFHLE1BQU0sUUFBVXRZLEVBQVFzWSxFQUFHOFAsRUFBVyxFQUFJLE1BQy9DLENBU3FCLE9BQVUsUUFBUSxJQUFJLFdBQWEsYUFBZ0IsZUFBaUIsRUFBRSxFQXFOM0YsU0FBU0ksR0FBaUJsUSxFQUFJbEgsRUFBT3FYLEVBQVNwVCxFQUFTLENBQ3JEaUQsRUFBRyxpQkFBaUJsSCxFQUFPcVgsRUFBU3BULENBQU8sQ0FDN0MsQ0FxZkEsTUFBTXFULEdBQW9COWQsR0FBVSxDQUNsQyxNQUFNOUosRUFBSzhKLEVBQU0sTUFBTSxxQkFBcUIsR0FBSyxHQUNqRCxPQUFPbEgsRUFBTyxRQUFDNUMsQ0FBRSxFQUFLZCxHQUFVMm9CLEVBQUFBLGVBQWU3bkIsRUFBSWQsQ0FBSyxFQUFJYyxDQUM5RCxFQUNBLFNBQVM4bkIsR0FBbUIsRUFBRyxDQUM3QixFQUFFLE9BQU8sVUFBWSxFQUN2QixDQUNBLFNBQVNDLEdBQWlCLEVBQUcsQ0FDM0IsTUFBTTNsQixFQUFTLEVBQUUsT0FDYkEsRUFBTyxZQUNUQSxFQUFPLFVBQVksR0FDbkJBLEVBQU8sY0FBYyxJQUFJLE1BQU0sT0FBTyxDQUFDLEVBRTNDLENBQ0EsTUFBTTRsQixFQUFZLE9BQU8sU0FBUyxFQUM1QkMsR0FBYSxDQUNqQixRQUFRelEsRUFBSSxDQUFFLFVBQVcsQ0FBRSxLQUFBMFEsRUFBTSxLQUFBQyxFQUFNLE9BQUFDLEVBQVUsRUFBRXRlLEVBQU8sQ0FDeEQwTixFQUFHd1EsQ0FBUyxFQUFJSixHQUFpQjlkLENBQUssRUFDdEMsTUFBTXVlLEVBQWVELEdBQVV0ZSxFQUFNLE9BQVNBLEVBQU0sTUFBTSxPQUFTLFNBQ25FNGQsR0FBaUJsUSxFQUFJMFEsRUFBTyxTQUFXLFFBQVVqWSxHQUFNLENBQ3JELEdBQUlBLEVBQUUsT0FBTyxVQUNYLE9BQ0YsSUFBSXFZLEVBQVc5USxFQUFHLE1BQ2QyUSxJQUNGRyxFQUFXQSxFQUFTLFFBRWxCRCxJQUNGQyxFQUFXQyxFQUFBQSxjQUFjRCxDQUFRLEdBRW5DOVEsRUFBR3dRLENBQVMsRUFBRU0sQ0FBUSxDQUM1QixDQUFLLEVBQ0dILEdBQ0ZULEdBQWlCbFEsRUFBSSxTQUFVLElBQU0sQ0FDbkNBLEVBQUcsTUFBUUEsRUFBRyxNQUFNLEtBQUksQ0FDaEMsQ0FBTyxFQUVFMFEsSUFDSFIsR0FBaUJsUSxFQUFJLG1CQUFvQnNRLEVBQWtCLEVBQzNESixHQUFpQmxRLEVBQUksaUJBQWtCdVEsRUFBZ0IsRUFDdkRMLEdBQWlCbFEsRUFBSSxTQUFVdVEsRUFBZ0IsRUFFbEQsRUFFRCxRQUFRdlEsRUFBSSxDQUFFLE1BQUF0WSxHQUFTLENBQ3JCc1ksRUFBRyxNQUFRdFksR0FBZ0IsRUFDNUIsRUFDRCxhQUFhc1ksRUFBSSxDQUFFLE1BQUF0WSxFQUFPLFVBQVcsQ0FBRSxLQUFBZ3BCLEVBQU0sS0FBQUMsRUFBTSxPQUFBQyxFQUFVLEVBQUV0ZSxFQUFPLENBRXBFLEdBREEwTixFQUFHd1EsQ0FBUyxFQUFJSixHQUFpQjlkLENBQUssRUFDbEMwTixFQUFHLFVBQ0wsT0FDRixNQUFNZ1IsRUFBVUosR0FBVTVRLEVBQUcsT0FBUyxTQUFXK1EsRUFBYSxjQUFDL1EsRUFBRyxLQUFLLEVBQUlBLEVBQUcsTUFDeEVoVixFQUFXdEQsR0FBZ0IsR0FDN0JzcEIsSUFBWWhtQixJQUdaLFNBQVMsZ0JBQWtCZ1YsR0FBTUEsRUFBRyxPQUFTLFVBQzNDMFEsR0FHQUMsR0FBUTNRLEVBQUcsTUFBTSxLQUFJLElBQU9oVixLQUlsQ2dWLEVBQUcsTUFBUWhWLEdBQ1osQ0FDSCxFQUNNaW1CLEdBQWlCLENBRXJCLEtBQU0sR0FDTixRQUFRalIsRUFBSWtSLEVBQUc1ZSxFQUFPLENBQ3BCME4sRUFBR3dRLENBQVMsRUFBSUosR0FBaUI5ZCxDQUFLLEVBQ3RDNGQsR0FBaUJsUSxFQUFJLFNBQVUsSUFBTSxDQUNuQyxNQUFNbVIsRUFBYW5SLEVBQUcsWUFDaEJvUixFQUFlQyxHQUFTclIsQ0FBRSxFQUMxQnNSLEVBQVV0UixFQUFHLFFBQ2J1UixFQUFTdlIsRUFBR3dRLENBQVMsRUFDM0IsR0FBSXBsQixFQUFBQSxRQUFRK2xCLENBQVUsRUFBRyxDQUN2QixNQUFNaHFCLEVBQVFxcUIsRUFBQUEsYUFBYUwsRUFBWUMsQ0FBWSxFQUM3Q0ssRUFBUXRxQixJQUFVLEdBQ3hCLEdBQUltcUIsR0FBVyxDQUFDRyxFQUNkRixFQUFPSixFQUFXLE9BQU9DLENBQVksQ0FBQyxVQUM3QixDQUFDRSxHQUFXRyxFQUFPLENBQzVCLE1BQU1DLEVBQVcsQ0FBQyxHQUFHUCxDQUFVLEVBQy9CTyxFQUFTLE9BQU92cUIsRUFBTyxDQUFDLEVBQ3hCb3FCLEVBQU9HLENBQVEsQ0FDaEIsQ0FDVCxTQUFpQmxVLEVBQUFBLE1BQU0yVCxDQUFVLEVBQUcsQ0FDNUIsTUFBTXhJLEVBQVMsSUFBSSxJQUFJd0ksQ0FBVSxFQUM3QkcsRUFDRjNJLEVBQU8sSUFBSXlJLENBQVksRUFFdkJ6SSxFQUFPLE9BQU95SSxDQUFZLEVBRTVCRyxFQUFPNUksQ0FBTSxDQUNyQixNQUNRNEksRUFBT0ksR0FBaUIzUixFQUFJc1IsQ0FBTyxDQUFDLENBRTVDLENBQUssQ0FDRixFQUVELFFBQVNNLEdBQ1QsYUFBYTVSLEVBQUk2UixFQUFTdmYsRUFBTyxDQUMvQjBOLEVBQUd3USxDQUFTLEVBQUlKLEdBQWlCOWQsQ0FBSyxFQUN0Q3NmLEdBQVc1UixFQUFJNlIsRUFBU3ZmLENBQUssQ0FDOUIsQ0FDSCxFQUNBLFNBQVNzZixHQUFXNVIsRUFBSSxDQUFFLE1BQUF0WSxFQUFPLFNBQUF1RCxDQUFRLEVBQUlxSCxFQUFPLENBQ2xEME4sRUFBRyxZQUFjdFksRUFDYjBELEVBQUFBLFFBQVExRCxDQUFLLEVBQ2ZzWSxFQUFHLFFBQVV3UixFQUFBQSxhQUFhOXBCLEVBQU80SyxFQUFNLE1BQU0sS0FBSyxFQUFJLEdBQzdDa0wsRUFBQUEsTUFBTTlWLENBQUssRUFDcEJzWSxFQUFHLFFBQVV0WSxFQUFNLElBQUk0SyxFQUFNLE1BQU0sS0FBSyxFQUMvQjVLLElBQVV1RCxJQUNuQitVLEVBQUcsUUFBVThSLGFBQVdwcUIsRUFBT2lxQixHQUFpQjNSLEVBQUksRUFBSSxDQUFDLEVBRTdELENBQ0EsTUFBTStSLEdBQWMsQ0FDbEIsUUFBUS9SLEVBQUksQ0FBRSxNQUFBdFksQ0FBSyxFQUFJNEssRUFBTyxDQUM1QjBOLEVBQUcsUUFBVThSLGFBQVdwcUIsRUFBTzRLLEVBQU0sTUFBTSxLQUFLLEVBQ2hEME4sRUFBR3dRLENBQVMsRUFBSUosR0FBaUI5ZCxDQUFLLEVBQ3RDNGQsR0FBaUJsUSxFQUFJLFNBQVUsSUFBTSxDQUNuQ0EsRUFBR3dRLENBQVMsRUFBRWEsR0FBU3JSLENBQUUsQ0FBQyxDQUNoQyxDQUFLLENBQ0YsRUFDRCxhQUFhQSxFQUFJLENBQUUsTUFBQXRZLEVBQU8sU0FBQXVELENBQVEsRUFBSXFILEVBQU8sQ0FDM0MwTixFQUFHd1EsQ0FBUyxFQUFJSixHQUFpQjlkLENBQUssRUFDbEM1SyxJQUFVdUQsSUFDWitVLEVBQUcsUUFBVThSLGFBQVdwcUIsRUFBTzRLLEVBQU0sTUFBTSxLQUFLLEVBRW5ELENBQ0gsRUFDTTBmLEdBQWUsQ0FFbkIsS0FBTSxHQUNOLFFBQVFoUyxFQUFJLENBQUUsTUFBQXRZLEVBQU8sVUFBVyxDQUFFLE9BQUFrcEIsQ0FBTSxDQUFJLEVBQUV0ZSxFQUFPLENBQ25ELE1BQU0yZixFQUFhelUsUUFBTTlWLENBQUssRUFDOUJ3b0IsR0FBaUJsUSxFQUFJLFNBQVUsSUFBTSxDQUNuQyxNQUFNa1MsRUFBYyxNQUFNLFVBQVUsT0FBTyxLQUFLbFMsRUFBRyxRQUFVbVMsR0FBTUEsRUFBRSxRQUFRLEVBQUUsSUFDNUVBLEdBQU12QixFQUFTRyxnQkFBY00sR0FBU2MsQ0FBQyxDQUFDLEVBQUlkLEdBQVNjLENBQUMsQ0FDL0QsRUFDTW5TLEVBQUd3USxDQUFTLEVBQ1Z4USxFQUFHLFNBQVdpUyxFQUFhLElBQUksSUFBSUMsQ0FBVyxFQUFJQSxFQUFjQSxFQUFZLENBQUMsQ0FDckYsQ0FDQSxDQUFLLEVBQ0RsUyxFQUFHd1EsQ0FBUyxFQUFJSixHQUFpQjlkLENBQUssQ0FDdkMsRUFHRCxRQUFRME4sRUFBSSxDQUFFLE1BQUF0WSxHQUFTLENBQ3JCMHFCLEdBQVlwUyxFQUFJdFksQ0FBSyxDQUN0QixFQUNELGFBQWFzWSxFQUFJcVMsRUFBVS9mLEVBQU8sQ0FDaEMwTixFQUFHd1EsQ0FBUyxFQUFJSixHQUFpQjlkLENBQUssQ0FDdkMsRUFDRCxRQUFRME4sRUFBSSxDQUFFLE1BQUF0WSxHQUFTLENBQ3JCMHFCLEdBQVlwUyxFQUFJdFksQ0FBSyxDQUN0QixDQUNILEVBQ0EsU0FBUzBxQixHQUFZcFMsRUFBSXRZLEVBQU8sQ0FDOUIsTUFBTTRxQixFQUFhdFMsRUFBRyxTQUN0QixHQUFJc1MsR0FBYyxDQUFDbG5CLFVBQVExRCxDQUFLLEdBQUssQ0FBQzhWLEVBQUFBLE1BQU05VixDQUFLLEVBQUcsQ0FDL0MsUUFBUSxJQUFJLFdBQWEsY0FBaUJLLEdBQzNDLG9GQUFvRixPQUFPLFVBQVUsU0FBUyxLQUFLTCxDQUFLLEVBQUUsTUFBTSxFQUFHLEVBQUUsQ0FBQyxHQUM1SSxFQUNJLE1BQ0QsQ0FDRCxRQUFTSSxFQUFJLEVBQUdvRSxFQUFJOFQsRUFBRyxRQUFRLE9BQVFsWSxFQUFJb0UsRUFBR3BFLElBQUssQ0FDakQsTUFBTXlxQixFQUFTdlMsRUFBRyxRQUFRbFksQ0FBQyxFQUNyQjBxQixFQUFjbkIsR0FBU2tCLENBQU0sRUFDbkMsR0FBSUQsRUFDRWxuQixFQUFBQSxRQUFRMUQsQ0FBSyxFQUNmNnFCLEVBQU8sU0FBV2YsRUFBWSxhQUFDOXBCLEVBQU84cUIsQ0FBVyxFQUFJLEdBRXJERCxFQUFPLFNBQVc3cUIsRUFBTSxJQUFJOHFCLENBQVcsVUFHckNWLEVBQVUsV0FBQ1QsR0FBU2tCLENBQU0sRUFBRzdxQixDQUFLLEVBQUcsQ0FDbkNzWSxFQUFHLGdCQUFrQmxZLElBQ3ZCa1ksRUFBRyxjQUFnQmxZLEdBQ3JCLE1BQ0QsQ0FFSixDQUNHLENBQUN3cUIsR0FBY3RTLEVBQUcsZ0JBQWtCLEtBQ3RDQSxFQUFHLGNBQWdCLEdBRXZCLENBQ0EsU0FBU3FSLEdBQVNyUixFQUFJLENBQ3BCLE1BQU8sV0FBWUEsRUFBS0EsRUFBRyxPQUFTQSxFQUFHLEtBQ3pDLENBQ0EsU0FBUzJSLEdBQWlCM1IsRUFBSXNSLEVBQVMsQ0FDckMsTUFBTXhtQixFQUFNd21CLEVBQVUsYUFBZSxjQUNyQyxPQUFPeG1CLEtBQU9rVixFQUFLQSxFQUFHbFYsQ0FBRyxFQUFJd21CLENBQy9CLENBQ0EsTUFBTW1CLEdBQWdCLENBQ3BCLFFBQVF6UyxFQUFJNlIsRUFBU3ZmLEVBQU8sQ0FDMUJvZ0IsR0FBYzFTLEVBQUk2UixFQUFTdmYsRUFBTyxLQUFNLFNBQVMsQ0FDbEQsRUFDRCxRQUFRME4sRUFBSTZSLEVBQVN2ZixFQUFPLENBQzFCb2dCLEdBQWMxUyxFQUFJNlIsRUFBU3ZmLEVBQU8sS0FBTSxTQUFTLENBQ2xELEVBQ0QsYUFBYTBOLEVBQUk2UixFQUFTdmYsRUFBT3FnQixFQUFXLENBQzFDRCxHQUFjMVMsRUFBSTZSLEVBQVN2ZixFQUFPcWdCLEVBQVcsY0FBYyxDQUM1RCxFQUNELFFBQVEzUyxFQUFJNlIsRUFBU3ZmLEVBQU9xZ0IsRUFBVyxDQUNyQ0QsR0FBYzFTLEVBQUk2UixFQUFTdmYsRUFBT3FnQixFQUFXLFNBQVMsQ0FDdkQsQ0FDSCxFQUNBLFNBQVNDLEdBQW9CQyxFQUFTaG9CLEVBQU0sQ0FDMUMsT0FBUWdvQixFQUFPLENBQ2IsSUFBSyxTQUNILE9BQU9iLEdBQ1QsSUFBSyxXQUNILE9BQU92QixHQUNULFFBQ0UsT0FBUTVsQixFQUFJLENBQ1YsSUFBSyxXQUNILE9BQU9vbUIsR0FDVCxJQUFLLFFBQ0gsT0FBT2MsR0FDVCxRQUNFLE9BQU90QixFQUNWLENBQ0osQ0FDSCxDQUNBLFNBQVNpQyxHQUFjMVMsRUFBSTZSLEVBQVN2ZixFQUFPcWdCLEVBQVczWixFQUFNLENBSzFELE1BQU14USxFQUphb3FCLEdBQ2pCNVMsRUFBRyxRQUNIMU4sRUFBTSxPQUFTQSxFQUFNLE1BQU0sSUFDL0IsRUFDd0IwRyxDQUFJLEVBQzFCeFEsR0FBTUEsRUFBR3dYLEVBQUk2UixFQUFTdmYsRUFBT3FnQixDQUFTLENBQ3hDLENBb0NBLE1BQU1HLEdBQWtCLENBQUMsT0FBUSxRQUFTLE1BQU8sTUFBTSxFQUNqREMsR0FBaUIsQ0FDckIsS0FBTyxHQUFNLEVBQUUsZ0JBQWlCLEVBQ2hDLFFBQVUsR0FBTSxFQUFFLGVBQWdCLEVBQ2xDLEtBQU8sR0FBTSxFQUFFLFNBQVcsRUFBRSxjQUM1QixLQUFPLEdBQU0sQ0FBQyxFQUFFLFFBQ2hCLE1BQVEsR0FBTSxDQUFDLEVBQUUsU0FDakIsSUFBTSxHQUFNLENBQUMsRUFBRSxPQUNmLEtBQU8sR0FBTSxDQUFDLEVBQUUsUUFDaEIsS0FBTyxHQUFNLFdBQVksR0FBSyxFQUFFLFNBQVcsRUFDM0MsT0FBUyxHQUFNLFdBQVksR0FBSyxFQUFFLFNBQVcsRUFDN0MsTUFBUSxHQUFNLFdBQVksR0FBSyxFQUFFLFNBQVcsRUFDNUMsTUFBTyxDQUFDLEVBQUdoVixJQUFjK1UsR0FBZ0IsS0FBTWxOLEdBQU0sRUFBRSxHQUFHQSxDQUFDLEtBQUssR0FBSyxDQUFDN0gsRUFBVSxTQUFTNkgsQ0FBQyxDQUFDLENBQzdGLEVBQ01vTixHQUFnQixDQUFDeHFCLEVBQUl1VixJQUFjLENBQ3ZDLE1BQU1pRixFQUFReGEsRUFBRyxZQUFjQSxFQUFHLFVBQVksQ0FBQSxHQUN4Q3lxQixFQUFXbFYsRUFBVSxLQUFLLEdBQUcsRUFDbkMsT0FBT2lGLEVBQU1pUSxDQUFRLElBQU1qUSxFQUFNaVEsQ0FBUSxFQUFJLENBQUNuYSxLQUFVN1EsSUFBUyxDQUMvRCxRQUFTSCxFQUFJLEVBQUdBLEVBQUlpVyxFQUFVLE9BQVFqVyxJQUFLLENBQ3pDLE1BQU1vckIsRUFBUUgsR0FBZWhWLEVBQVVqVyxDQUFDLENBQUMsRUFDekMsR0FBSW9yQixHQUFTQSxFQUFNcGEsRUFBT2lGLENBQVMsRUFDakMsTUFDSCxDQUNELE9BQU92VixFQUFHc1EsRUFBTyxHQUFHN1EsQ0FBSSxDQUM1QixFQUNBLEVDMzRDQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBUUEsU0FBU2tyQixJQUFVLENBRWZsSSxJQUVKLENBRU8sUUFBUSxJQUFJLFdBQWEsY0FDOUJrSSwwK0ZDMEVHQyxHQUFVLENBQ2IsTUFBTyxDQUFDLG9CQUFxQixRQUFRLEVBRXJDLE1BQU8sQ0FDTCxXQUFZLENBQUUsS0FBTSxLQUFNLFFBQVMsSUFBTSxFQUN6QyxPQUFRLENBQUUsS0FBTSxPQUFRLFFBQVMsT0FBUyxFQUMxQyxhQUFjLENBQUUsS0FBTSxTQUFVLFFBQVMsSUFBTSxFQUFPLEVBQ3RELEtBQU0sQ0FBRSxLQUFNLE9BQVEsUUFBUyxLQUFNLENBQ3RDLEVBRUQsTUFBTyxDQUNMLEtBQU0sQ0FBRSxhQUFBQyxFQUFjLFdBQUFDLEdBQWVDLEdBQWUsS0FBSyxNQUFNLEVBQy9ELE1BQU8sQ0FDTCxhQUFBRixFQUNBLFdBQUFDLEVBQ0EsVUFBVyxDQUFFLEVBQ2IsVUFBVyxDQUFFLEVBQ2IsYUFDRSxLQUFLLFlBRUw3dEIsR0FBVSxJQUFJLEtBQVEsQ0FBRSxLQUFNLEVBQUcsT0FBUSxFQUFHLE9BQVEsRUFBRyxZQUFhLENBQUEsQ0FBRyxFQUV6RSxZQUFhLEtBQUssSUFDcEIsQ0FDRCxFQUVELE1BQU8sQ0FDTCxXQUFXcWdCLEVBQUlDLEVBQU0sQ0FDZixDQUFDRCxHQUFPLENBQUNDLElBQ1gsS0FBSyxhQUFlRCxHQUFNLElBQUksS0FDOUIsS0FBSyxnQkFBZ0IsRUFFeEIsRUFFRCxhQUFhQSxFQUFJQyxFQUFNLENBQ2pCLENBQUNELEdBQU8sQ0FBQ0MsR0FDWCxLQUFLLGdCQUFnQixDQUV4QixFQUVELGFBQWMsa0JBRWQsS0FBSzVHLEVBQU0sQ0FDVCxLQUFLLFlBQWNBLENBQ3JCLENBQ0QsRUFFRCxTQUFVLENBQ1IsS0FBSyxnQkFBZ0IsQ0FDdEIsRUFFRCxRQUFTLENBQ1AsY0FBY2paLEVBQU8sQ0FDbkIsTUFBTyxDQUNMLDRCQUNFLEtBQUssWUFDTEEsSUFBVSxLQUFLLFdBQVcsWUFDMUIsS0FBSyxhQUFhLFlBQVcsSUFBTyxLQUFLLFdBQVcsWUFBWSxFQUVsRSw2QkFBOEJBLElBQVUsS0FBSyxhQUFhLFNBQVMsQ0FDckUsQ0FDRCxFQUVELGFBQWFFLEVBQU0sQ0FDakIsTUFBTyxDQUNMLDRCQUNFLEtBQUssWUFBY0EsSUFBUyxLQUFLLFdBQVcsWUFBWSxFQUUxRCw2QkFBOEJBLElBQVMsS0FBSyxhQUFhLFlBQVksQ0FDdkUsQ0FDRCxFQUVELFFBQVFWLEVBQVc4dEIsRUFBUyxHQUFPLENBQ2pDLEtBQUssYUFBZS90QixHQUFVLEtBQUssYUFBY0MsQ0FBUyxFQUN0RDh0QixHQUNGLEtBQUssTUFBTSxvQkFBcUIsS0FBSyxZQUFZLENBRXBELEVBRUQsV0FBV0MsRUFBTSxDQUNmLEtBQUssUUFBUSxDQUNYLEtBQU0sS0FBSyxhQUFhLGNBQWdCQSxFQUFPLEdBQ2hELENBQ0YsRUFFRCxRQUFRdFUsRUFBTSxDQUNaLEtBQUssWUFBY0EsQ0FDcEIsRUFFRCxVQUFVc1UsRUFBTSxDQUNkLEtBQU0sQ0FBRSxhQUFBQyxHQUFpQixLQUNuQixDQUFFLEtBQUF0dEIsRUFBTSxNQUFBRixDQUFNLEVBQUksS0FBSyxhQUMzQnd0QixFQUFhLFlBQWEsRUFDMUJBLEVBQWEsU0FBUSxFQUFLRCxDQUM1QixFQUNBLEtBQUssUUFBUSxDQUNYLE1BQUF2dEIsRUFDQSxJQUFLLEtBQUssSUFDUixLQUFLLGVBQWVFLEVBQU1GLENBQUssRUFDL0IsS0FBSyxhQUFhLFFBQVEsQ0FDNUIsRUFDRCxDQUNGLEVBRUQsU0FBU3V0QixFQUFNLENBQ2IsS0FBSyxRQUFRLENBQ1gsS0FBTSxLQUFLLGFBQWEsY0FBZ0JBLEVBQ3pDLENBQ0YsRUFFRCxXQUFXanVCLEVBQU0sQ0FDZixLQUFLLFFBQVFELEdBQWFDLENBQUksRUFBRyxFQUFJLEVBQ3JDLEtBQUssTUFBTSxRQUFRLENBQ3BCLEVBRUQsWUFBWVUsRUFBTyxDQUNqQixLQUFLLFFBQVEsS0FBSyxFQUdsQixLQUFLLFFBQVEsQ0FBRSxNQUFBQSxFQUFPLElBQUssQ0FBRyxFQUFFLEVBQUksQ0FDckMsRUFFRCxXQUFXRSxFQUFNLENBQ2YsS0FBSyxRQUFRLE9BQU8sRUFDcEIsS0FBSyxRQUFRLENBQUUsS0FBQUEsQ0FBRyxFQUFLLEVBQUksQ0FDNUIsRUFFRCxhQUFhQSxFQUFNRixFQUFPLENBQ3hCLE9BQUlBLEVBQVEsSUFDVkUsSUFDQUYsRUFBUSxHQUNDQSxFQUFRLElBQ2pCRSxJQUNBRixFQUFRLElBRUgsQ0FBRSxLQUFBRSxFQUFNLE1BQUFGLENBQU0sQ0FDdEIsRUFFRCxhQUNFVixFQUNBLENBQUUsS0FBQVksRUFBTSxNQUFBRixFQUFPLElBQUFGLEdBQVEsQ0FBRSxLQUFNLEdBQU0sTUFBTyxHQUFNLElBQUssRUFBSyxFQUM1RCxDQUNBLE9BQU9SLEVBQUssZUFBZSxLQUFLLE9BQVEsQ0FDdEMsS0FBTVksR0FBUSxVQUNkLE1BQU9GLEdBQVMsT0FDaEIsSUFBS0YsR0FBTyxVQUNiLENBQ0YsRUFFRCxlQUFlUixFQUFNLENBQ25CLE1BQU1ZLEVBQU8sS0FBSyxxQkFBcUJaLEVBQUssWUFBVyxDQUFFLEVBQ3pELE1BQU8sR0FBR1ksQ0FBSSxNQUFNQSxFQUFPLENBQUMsRUFDN0IsRUFFRCxlQUFlQSxFQUFNRixFQUFPLENBQzFCLE9BQU8sSUFBSSxLQUFLRSxFQUFNRixFQUFRLEVBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FDN0MsRUFFRCxxQkFBcUJFLEVBQU0sQ0FFekIsTUFBTyxDQUFDLEdBRFFBLEVBQUssU0FBUyxFQUNYLE1BQU0sRUFBRyxFQUFFLENBQUMsR0FDaEMsRUFFRCxTQUFTLENBQUUsS0FBQXF0QixFQUFNLE1BQUFFLEVBQU8sS0FBQXhVLEVBQU8sS0FBSyxZQUFhLE9BQUFxVSxFQUFTLElBQVMsQ0FDakUsS0FBTSxDQUFFLGFBQUFFLEdBQWlCLEtBQ3pCLEdBQUlELEVBQU0sQ0FDUixPQUFRdFUsRUFBSSxDQUNWLElBQUssTUFDSCxLQUFLLFFBQVEsQ0FBRSxJQUFLdVUsRUFBYSxVQUFZRCxDQUFNLEVBQUVELENBQU0sRUFDM0QsTUFDRixJQUFLLFFBQ0gsS0FBSyxRQUFRLENBQUUsTUFBT0UsRUFBYSxXQUFhRCxDQUFNLEVBQUVELENBQU0sRUFDOUQsTUFDRixJQUFLLE9BQ0gsS0FBSyxRQUFRLENBQUUsS0FBTUUsRUFBYSxjQUFnQkQsQ0FBTSxFQUFFRCxDQUFNLEVBQ2hFLEtBQ0osQ0FDQSxNQUFPLEVBQ1QsU0FBV0csRUFBTyxDQUNoQixPQUFRLEtBQUssWUFBVyxDQUN0QixJQUFLLE1BQ0gsS0FBSyxXQUFXRCxDQUFZLEVBQzVCLE1BQ0YsSUFBSyxRQUNILEtBQUssUUFBUSxLQUFLLEVBQ2xCLE1BQ0YsSUFBSyxPQUNILEtBQUssUUFBUSxPQUFPLEVBQ3BCLEtBQ0osQ0FDQSxNQUFPLEVBQ1QsQ0FDRCxFQUVELGlCQUFrQixDQUNoQixLQUFLLFVBQVksQ0FBQyxFQUNsQixLQUFLLFVBQVksQ0FBQyxFQUVsQixLQUFNLENBQUUsYUFBQUEsR0FBaUIsS0FDbkJ0dEIsRUFBT3N0QixFQUFhLFlBQVksRUFDaEN4dEIsRUFBUXd0QixFQUFhLFNBQVMsRUFDOUJFLEVBQVksS0FBSyxxQkFBcUJ4dEIsQ0FBSSxFQUNoRCxRQUFTMEIsRUFBSSxFQUFHQSxFQUFJLEdBQUlBLElBQ3RCLEtBQUssVUFBVSxLQUFLOHJCLEVBQVk5ckIsQ0FBQyxFQUduQyxJQUFJK3JCLEVBRHNCLElBQUksS0FBS3p0QixFQUFNRixFQUFPLENBQUMsRUFDWixPQUFNLEVBQUssRUFDNUMydEIsSUFBaUIsSUFDbkJBLEVBQWUsR0FFakIsTUFBTUMsRUFBVSxLQUFLLGVBQWUxdEIsRUFBTUYsQ0FBSyxFQUMvQyxHQUFJMnRCLEVBQWUsRUFBRyxDQUNwQixNQUFNRSxFQUFZLEtBQUssYUFBYTN0QixFQUFNRixFQUFRLENBQUMsRUFDN0M4dEIsRUFBbUIsS0FBSyxlQUM1QkQsRUFBVSxLQUNWQSxFQUFVLEtBQ1osRUFDQSxRQUFTanNCLEVBQUksRUFBR0EsRUFBSStyQixFQUFjL3JCLElBQUssQ0FDckMsTUFBTTlCLEVBQU1ndUIsRUFBbUJILEVBQWUvckIsRUFBSSxFQUM1Q3RDLEVBQU8sSUFBSSxLQUFLdXVCLEVBQVUsS0FBTUEsRUFBVSxNQUFPL3RCLENBQUcsRUFDMUQsS0FBSyxVQUFVLEtBQUssQ0FDbEIsS0FBTUEsRUFDTixLQUFBUixFQUNBLE1BQU8sS0FBSyxhQUFhQSxDQUFJLEVBQUksV0FBYSxPQUMvQyxDQUNILENBQ0YsQ0FFQSxNQUFNeXVCLEVBQU0sSUFBSSxLQUNoQixRQUFTbnNCLEVBQUksRUFBR0EsR0FBS2dzQixFQUFTaHNCLElBQUssQ0FDakMsTUFBTXRDLEVBQU8sSUFBSSxLQUFLWSxFQUFNRixFQUFPNEIsQ0FBQyxFQUM5Qm9zQixFQUFRMXVCLEdBQ1pBLEdBQ0FBLEVBQUssUUFBTyxJQUFPc0MsR0FDbkJ0QyxFQUFLLFlBQVcsSUFBT1ksR0FDdkJaLEVBQUssU0FBUSxJQUFPVSxFQUVoQmlZLEVBQVErVixFQUFNLEtBQUssVUFBVSxFQUMvQixTQUNBQSxFQUFNRCxDQUFHLEVBQ1AsUUFDQSxLQUFLLGFBQWF6dUIsQ0FBSSxFQUNwQixXQUNBMHVCLEVBQU1SLENBQVksRUFDaEIsVUFDQSxLQUNWLEtBQUssVUFBVSxLQUFLLENBQ2xCLEtBQU01ckIsRUFDTixLQUFBdEMsRUFDQSxNQUFBMlksRUFDRCxDQUNILENBRUEsTUFBTWdXLEVBQWdCLEdBQUssS0FBSyxVQUFVLE9BQzFDLEdBQUlBLEVBQWdCLEVBQUcsQ0FDckIsTUFBTUMsRUFBWSxLQUFLLGFBQWFodUIsRUFBTUYsRUFBUSxDQUFDLEVBQ25ELFFBQVM0QixFQUFJLEVBQUdBLEdBQUtxc0IsRUFBZXJzQixJQUFLLENBQ3ZDLE1BQU10QyxFQUFPLElBQUksS0FBSzR1QixFQUFVLEtBQU1BLEVBQVUsTUFBT3RzQixDQUFDLEVBQ2xEcVcsRUFBUSxLQUFLLGFBQWEzWSxDQUFJLEVBQUksV0FBYSxPQUNyRCxLQUFLLFVBQVUsS0FBSyxDQUNsQixLQUFNc0MsRUFDTixLQUFBdEMsRUFDQSxNQUFBMlksRUFDRCxDQUNILENBQ0YsQ0FDRixDQUNGLENBQ0YsRUFFTWtXLEdBQWMsQ0FBQyxFQUdyQixTQUFTZCxHQUFlMXRCLEVBQVEsQ0FDOUIsSUFBSXl1QixFQUFRRCxHQUFZeHVCLENBQU0sRUFDOUIsR0FBSSxDQUFDeXVCLEVBQU8sQ0FDVixNQUFNakIsRUFBZSxDQUFDLEVBQ3RCLFFBQVMsRUFBSSxFQUFHLEVBQUksRUFBRyxJQUFLLENBQzFCLE1BQU03dEIsRUFBTyxJQUFJLEtBQUssRUFBRyxFQUFHLENBQUMsRUFDN0I2dEIsRUFBYSxLQUFLLENBQ2hCLEtBQU03dEIsRUFBSyxlQUFlSyxFQUFRLENBQUUsUUFBUyxPQUFRLEVBQ3JELE1BQU9MLEVBQUssZUFBZUssRUFBUSxDQUFFLFFBQVMsUUFBUyxFQUN4RCxDQUNILENBQ0EsTUFBTXl0QixFQUFhLENBQUMsRUFDcEIsUUFBUyxFQUFJLEVBQUcsR0FBSyxHQUFJLElBQUssQ0FDNUIsTUFBTTl0QixFQUFPLElBQUksS0FBSyxFQUFHLEVBQUcsQ0FBQyxFQUM3Qjh0QixFQUFXLEtBQUssQ0FDZCxLQUFNOXRCLEVBQUssZUFBZUssRUFBUSxDQUFFLE1BQU8sT0FBUSxFQUNuRCxNQUFPTCxFQUFLLGVBQWVLLEVBQVEsQ0FBRSxNQUFPLFFBQVMsRUFDdEQsQ0FDSCxDQUNBeXVCLEVBQVFELEdBQVl4dUIsQ0FBTSxFQUFJLENBQzVCLGFBQUF3dEIsRUFDQSxXQUFBQyxDQUNGLENBQ0YsQ0FDQSxPQUFPZ0IsQ0FDVCxpQ0NqWU8sU0FBU0MsR0FBVUMsRUFBU0MsRUFBUSxDQUN6Q0QsRUFDRUEsYUFBbUIsU0FDZixNQUFNLEtBQUtBLENBQU8sRUFDbEJFLEVBQUFBLFFBQVFGLENBQU8sRUFFckIsU0FBVyxDQUFDM3BCLEVBQU1zbEIsQ0FBTyxJQUFLLE9BQU8sUUFBUXNFLENBQU0sRUFDakQsVUFBVzdwQixLQUFVNHBCLEVBQ25CNXBCLEVBQU8saUJBQWlCQyxFQUFNc2xCLEVBQVMsRUFBSyxFQUloRCxNQUFPLENBQ0wsUUFBUyxDQUNQLFNBQVcsQ0FBQ3RsQixFQUFNc2xCLENBQU8sSUFBSyxPQUFPLFFBQVFzRSxDQUFNLEVBQ2pELFVBQVc3cEIsS0FBVTRwQixFQUNuQjVwQixFQUFPLG9CQUFvQkMsRUFBTXNsQixFQUFTLEVBQUssQ0FHcEQsQ0FDRixDQUNILENBRU8sU0FBU3dFLE1BQWlCRixFQUFRLENBQ3ZDLE1BQU8sQ0FDTCxRQUFTLENBQ1AsVUFBVzNiLEtBQVMyYixFQUNsQjNiLEVBQU0sT0FBUSxDQUVqQixDQUNGLENBQ0gsQ0FFTyxTQUFTOGIsR0FBTzliLEVBQU8sQ0FDNUIsTUFBTyxDQUNMLEdBQUksT0FDSixHQUFJLEtBQ0osR0FBSSxRQUNKLEdBQUksT0FDSixHQUFJLE9BQ1IsRUFBSUEsR0FBQSxZQUFBQSxFQUFPLE9BQU8sQ0FDbEIsQ0FFTyxTQUFTK2IsR0FBaUIvYixFQUFPLENBQ3RDLE1BQU1oTyxFQUFNOHBCLEdBQU85YixDQUFLLEVBQ3hCLE1BQU8sQ0FDTCxJQUFLLENBQUUsS0FBTSxHQUFJLE1BQU8sQ0FBRyxFQUFDaE8sQ0FBRyxHQUFLLEVBQ3BDLElBQUssQ0FBRSxHQUFJLEdBQUksS0FBTSxDQUFHLEVBQUNBLENBQUcsR0FBSyxFQUNqQyxNQUFPQSxJQUFRLE9BQ2hCLENBQ0gsQ0NsRE8sU0FBU2dxQixHQUFVOWMsRUFBVyxDQUNuQyxNQUFNcE4sRUFBU29KLEVBQUFBLFNBQVNnRSxFQUFVLE1BQU0sRUFDcENBLEVBQVUsTUFBTUEsRUFBVSxNQUFNLEVBQ2hDQSxFQUFVLE9BQ2QsT0FBT3BOLEdBQUEsWUFBQUEsRUFBUSxNQUFPQSxDQUN4Qiw2M0NDdURlLENBQ2IsTUFBTyxDQUFDLGFBQWEsRUFFckIsTUFBTyxDQUNMLFFBQVMsQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzNDLFdBQVksQ0FBRSxLQUFNLE9BQVEsUUFBUyxPQUFTLEVBQzlDLFVBQVcsQ0FBRSxLQUFNLE9BQVEsUUFBUyxRQUFVLEVBQzlDLEtBQU0sQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQ3ZDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLE9BQVEsQ0FBRSxLQUFNLENBQUMsT0FBUSxXQUFXLEVBQUcsUUFBUyxJQUFNLEVBQ3RELFlBQWEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQzVDLE9BQVEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxDQUFHLEVBQ3BDLFdBQVksQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFNLEVBQzVDLHFCQUFzQixDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU0sRUFDdEQsV0FBWSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDN0MsTUFBTyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDeEMsVUFBVyxDQUFFLEtBQU0sT0FBUSxRQUFTLENBQUUsQ0FDdkMsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLFVBQVcsS0FBSyxLQUNoQixlQUFnQixLQUFLLFVBQ3JCLFlBQWEsS0FDYixZQUFhLEtBQ2IsWUFBYSxLQUNiLFVBQVcsS0FDWCxnQkFBaUIsSUFDbkIsQ0FDRCxFQUVELFNBQVUsQ0FDUixjQUFlLENBQ2IsTUFBTyxDQUNMLHdCQUF5QixLQUFLLFFBQ2hDLENBQ0QsRUFFRCxZQUFhLENBQ1gsTUFBTW1xQixFQUFVLENBQ2QsQ0FBQyxjQUFjQyxFQUFTLFVBQUMsS0FBSyxTQUFTLENBQUMsRUFBRSxFQUFHLEVBQy9DLEVBQ0EsT0FBSSxLQUFLLGNBQ1BELEVBQVEsS0FBSyxXQUFXLEVBQUksSUFFdkJBLENBQ1IsRUFFRCxZQUFhLENBQ1gsT0FBTyxLQUFLLE9BQVMsWUFBWSxLQUFLLE1BQU0sR0FBSyxFQUNsRCxFQUVELGVBQWdCLENBQ2QsT0FBT0QsR0FBVSxJQUFJLENBQ3ZCLENBQ0QsRUFFRCxNQUFPLENBQ0wsS0FBS0csRUFBTSxDQUNULEtBQUssVUFBWUEsR0FBUSxLQUFLLFVBQy9CLEVBRUQsVUFBVW5QLEVBQUlDLEVBQU0sQ0FDZEQsRUFBS0MsSUFDUCxLQUFLLE1BQU0sY0FBZUQsQ0FBRSxFQUM1QixLQUFLLFVBQVUsSUFBTSxLQUFLLFlBQVlBLENBQUUsQ0FBQyxFQUU3QyxDQUNELEVBRUQsU0FBVSxDQUNSLEtBQU0sQ0FBRSxRQUFBcmQsRUFBUyxNQUFBeXNCLENBQVEsRUFBRSxLQUFLLE1BQzVCLEtBQUssVUFBWSxVQUNuQixLQUFLLFlBQWMsS0FBSyxlQUFlLEtBQUssZUFBaUJ6c0IsQ0FBTyxHQUdsRSxLQUFLLHNCQUF3QixDQUFDLEtBQUssYUFJckMsS0FBSyxZQUFjOHJCLEdBQVUsT0FBUSxDQUNuQyxRQUFTemIsR0FBUyxPQUVkLEtBQUssV0FDTCxDQUFDb2MsRUFBTSxTQUFTcGMsRUFBTSxNQUFNLEdBQzVCLENBQUNyUSxFQUFRLFNBQVNxUSxFQUFNLE1BQU0sR0FDOUIsR0FBQzFSLEVBQUEsS0FBSyxnQkFBTCxNQUFBQSxFQUFvQixTQUFTMFIsRUFBTSxXQUVwQyxLQUFLLFVBQVksR0FFcEIsRUFFRCxLQUFNLElBQU0sQ0FDVixLQUFLLFVBQVksRUFDbkIsRUFDRCxHQUdDLEtBQUssYUFDUCxLQUFLLFVBQVksR0FFcEIsRUFFRCxTQUFVLENBQ1IsS0FBSyxVQUFZLEtBQUssSUFDdkIsRUFFRCxXQUFZLFlBQ1YxUixFQUFBLEtBQUssY0FBTCxNQUFBQSxFQUFrQixVQUNsQjZSLEVBQUEsS0FBSyxjQUFMLE1BQUFBLEVBQWtCLFVBQ2xCa2MsRUFBQSxLQUFLLGNBQUwsTUFBQUEsRUFBa0IsUUFDbkIsRUFFRCxRQUFTLENBQ1AsZ0JBQWlCLENBQ2YsS0FBTSxDQUFFLFFBQUExc0IsRUFBUyxNQUFBeXNCLENBQVEsRUFBRSxLQUFLLE1BQ2hDLEdBQUksS0FBSyxNQUFRQSxFQUFNLGNBQWdCLEVBQUcsQ0FDeEMsV0FBVyxJQUFNLEtBQUssZUFBYyxFQUFJLENBQUMsRUFDekMsTUFDRixDQUVBLE1BQU10cUIsRUFBUyxLQUFLLGVBQWlCbkMsRUFFL0J1WCxFQUFLLEtBQUssU0FBVyxRQUFVdlgsRUFBVXlzQixFQUFNLGtCQUNqRGxWLElBQ0ZBLEVBQUcsTUFBTSxNQUFRLGlCQUFpQnBWLENBQU0sRUFBRSxPQUc1QyxNQUFNd3FCLEVBQVN4cUIsRUFBTyxzQkFBc0IsRUFDdEN5cUIsRUFBY0QsRUFBTyxLQUFPLE9BQU8sUUFDbkNFLEVBQWFGLEVBQU8sSUFBTSxPQUFPLFFBQ2pDRyxFQUFlSCxFQUFPLE1BQ3RCSSxFQUFnQkosRUFBTyxPQUN2QkssRUFBYVAsRUFBTSxZQUNuQlEsRUFBY1IsRUFBTSxhQUUxQixHQUFJLENBQUNTLEVBQU9DLENBQUssRUFBSSxLQUFLLGVBQWUsTUFBTSxHQUFHLEdBQUssQ0FBQyxFQUN4RCxHQUFJLEtBQUssV0FBWSxDQUNuQixNQUFNQyxFQUFXLE9BQU8sV0FDbEJDLEVBQVksT0FBTyxZQUNyQkgsSUFBVSxNQUNSTCxFQUFhSSxJQUNmQyxFQUFRLFVBRURBLElBQVUsU0FDZkcsRUFBWVIsRUFBYUUsRUFBZ0JFLElBQzNDQyxFQUFRLE9BRURBLElBQVUsT0FDZk4sRUFBY0ksSUFDaEJFLEVBQVEsU0FFREEsSUFBVSxTQUNmRSxFQUFXUixFQUFjRSxFQUFlRSxJQUMxQ0UsRUFBUSxRQUlSQyxJQUFVLE1BQ1JFLEVBQVlSLEVBQWFJLElBQzNCRSxFQUFRLFVBRURBLElBQVUsU0FDZk4sRUFBYUUsRUFBZ0JFLElBQy9CRSxFQUFRLE9BRURBLElBQVUsT0FDZkMsRUFBV1IsRUFBY0ksSUFDM0JHLEVBQVEsU0FFREEsSUFBVSxTQUNmUCxFQUFjRSxFQUFlRSxJQUMvQkcsRUFBUSxPQUdkLENBRUEsSUFBSUcsRUFBTyxFQUNQQyxFQUFNLEVBQ1YsT0FBUUwsRUFBSyxDQUNYLElBQUssTUFDSEssR0FBT04sRUFDUCxNQUNGLElBQUssT0FDSEssR0FBUU4sRUFDUixNQUNGLElBQUssUUFDSE0sR0FBUVIsRUFDUixNQUNGLElBQUssU0FDSFMsR0FBT1IsRUFDUCxLQUNKLENBQ0EsT0FBUUksRUFBSyxDQUNYLElBQUssUUFDSEcsR0FBUU4sRUFBYUYsRUFDckIsTUFDRixJQUFLLFNBQ0hTLEdBQU9OLEVBQWNGLEVBQ3JCLEtBQ0osQ0FRQSxHQVBJLEtBQUssUUFDSEcsSUFBVSxNQUNaSyxHQUFPUixFQUNFRyxJQUFVLFdBQ25CSyxHQUFPUixJQUdQNXFCLElBQVduQyxFQUFTLENBQ3RCLE1BQU13dEIsRUFBZ0J4dEIsRUFBUSxzQkFBc0IsRUFDcERzdEIsR0FBUVYsRUFBY1ksRUFBYyxLQUNwQ0QsR0FBT1YsRUFBYVcsRUFBYyxHQUNwQyxDQUNBZixFQUFNLE1BQU0sS0FBTyxHQUFHYSxDQUFJLEtBQzFCYixFQUFNLE1BQU0sSUFBTSxHQUFHYyxDQUFHLElBQ3pCLEVBRUQsZUFBZUUsRUFBUSxDQUNyQixNQUFNMUIsRUFBVTBCLEVBQU8saUJBQWlCLGlCQUFpQixFQUN6RCxJQUFJQyxFQUVKLE9BQU94QixHQUNMSixHQUFVQyxFQUFTLENBQ2pCLE1BQU8sSUFBTSxDQUNYLEtBQUssVUFBWSxHQUNqQixhQUFhLEtBQUssU0FBUyxDQUM1QixFQUVELEtBQU0sSUFBTSxDQUVWLEtBQUssVUFBWSxXQUFXLElBQU0sQ0FDM0IsS0FBSyxNQUFNLE1BQU0sUUFBUSxlQUFlLElBQzNDLEtBQUssVUFBWSxHQUVwQixFQUFFLENBQUMsQ0FDTixDQUNGLENBQUMsRUFFREQsR0FBVTJCLEVBQVEsQ0FDaEIsVUFBV3BkLEdBQVMsQ0FDYkEsRUFBTSxPQUFPLFFBQVEseUJBQXlCLElBQ2pEQSxFQUFNLGVBQWUsRUFDckJBLEVBQU0sZ0JBQWdCLEdBRW5CQSxFQUFNLE9BQU8sUUFBUSxvQkFBb0IsSUFJNUNxZCxHQUhnQixLQUFLLGVBQWlCLEtBQUssTUFBTSxTQUdqQyxjQUFjLGlCQUFpQixFQUMzQ0EsR0FBUyxDQUFDQSxFQUFNLGFBQWEsVUFBVSxFQUN6Q0EsRUFBTSxhQUFhLFdBQVksTUFBTSxFQUVyQ0EsRUFBUSxLQUdiLEVBRUQsUUFBU3JkLEdBQVMsQ0FDWnFkLEdBR0YsV0FBVyxJQUFNLENBQ2ZBLEVBQU0sZ0JBQWdCLFVBQVUsRUFDM0JyZCxFQUFNLE9BQU8sUUFBUSx5QkFBeUIsR0FDakRxZCxFQUFNLE1BQU0sRUFFZEEsRUFBUSxJQUNULEVBQUUsQ0FBQyxDQUVSLEVBQ0QsQ0FDSCxDQUNELEVBRUQsWUFBWWxCLEVBQU0sT0FDWkEsR0FDRSxLQUFLLFVBQVksVUFDbkIsS0FBSyxZQUFjLEtBQUssZUFBZSxLQUFLLE1BQU0sS0FBSyxHQUV6RCxLQUFLLGVBQWUsS0FFcEI3dEIsRUFBQSxLQUFLLGNBQUwsTUFBQUEsRUFBa0IsU0FDbEIsS0FBSyxZQUFjLEtBRXRCLEVBRUQsU0FBVSxDQUNILEtBQUssV0FDUixLQUFLLFVBQVksR0FFcEIsRUFFRCxRQUFRdXNCLEVBQU8sQ0FDUixLQUFLLFdBQ1IsYUFBYSxLQUFLLGVBQWUsRUFDN0JBLEVBQ0YsS0FBSyxVQUFZLEdBRWIsS0FBSyxVQUNQLEtBQUssZ0JBQWtCLFdBQVcsSUFBTSxDQUN0QyxLQUFLLFVBQVksRUFDbkIsRUFBRyxLQUFLLFNBQVMsRUFFakIsS0FBSyxVQUFZLEdBSXpCLENBQ0YsQ0FDRixvbEJDN1ZlLENBQ2IsTUFBTyxDQUFDLG1CQUFtQixFQUMzQixhQUFjLEdBRWQsTUFBTyxDQUNMLFdBQVksQ0FBRSxLQUFNLENBQUMsT0FBUSxNQUFNLEVBQUcsUUFBUyxJQUFNLEVBQ3JELEtBQU0sQ0FBRSxLQUFNLE9BQVEsUUFBUyxNQUFRLEVBQ3ZDLEdBQUksQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ25DLEtBQU0sQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3JDLE1BQU8sQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3RDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLFVBQVcsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzVDLFlBQWEsQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQzVDLGFBQWMsQ0FBRSxLQUFNLE9BQVEsUUFBUyxLQUFNLENBQzlDLEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxhQUFjLEtBQUssV0FDbkIsU0FBVSxHQUNWLFFBQVMsRUFDWCxDQUNELEVBRUQsU0FBVSxDQUNSLFNBQVUsQ0FDUixPQUFPLEtBQUssT0FBTyxLQUNwQixFQUVELFlBQWEsQ0FDWCxLQUFNLENBQUUsTUFBT3pDLEVBQUcsR0FBR2tGLENBQWEsRUFBRSxLQUFLLE9BQ3pDLE9BQU9BLENBQ1IsRUFFRCxPQUFRLENBQ04sT0FBTyxLQUFLLE1BQU0sS0FDbkIsRUFFRCxNQUFPLENBRUwsS0FBTSxDQUFFLEtBQUF6bkIsRUFBTSxJQUFBMG5CLEVBQUssSUFBQUMsQ0FBSSxFQUFJLEtBQUssT0FDMUJDLEVBQVk3dUIsR0FBVUEsR0FBUyxLQUFPLEdBQUdBLENBQUssR0FBRyxPQUFTLEVBQ2hFLE9BQU9pSCxHQUFRNG5CLEVBQVVGLENBQUcsR0FBS0UsRUFBVUQsQ0FBRyxHQUFLLE1BQ3JELENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBV3hRLEVBQUlDLEVBQU0sQ0FDZkQsSUFBT0MsSUFDVCxLQUFLLGFBQWVELEVBRXZCLEVBRUQsYUFBYTROLEVBQWMsQ0FDckJBLElBQWlCLEtBQUssWUFDeEIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBWSxDQUVoRCxDQUNELEVBRUQsUUFBUyxDQUNQLE9BQVEsQ0FDTixLQUFLLE1BQU0sTUFBTSxDQUNsQixFQUVELE1BQU8sQ0FDTCxLQUFLLE1BQU0sS0FBSyxDQUNsQixDQUNGLENBQ0YsNENDekZTLE9BQUE4QyxFQUFBLEVBQUFDLEVBQUEsSUFBQSx5SEFPTSxDQUNiLE1BQU8sQ0FDTCxLQUFNLENBQ0osS0FBTSxPQUNOLFNBQVUsRUFDWCxFQUNELFNBQVUsQ0FDUixLQUFNLFFBQ04sUUFBUyxFQUNYLENBQ0YsQ0FDRixtQkNyQk8sU0FBU0MsR0FBYVAsRUFBTyxDQUFFLE1BQUEzdUIsRUFBTyxJQUFBQyxDQUFHLEVBQUksQ0FDOUMwdUIsR0FBQSxNQUFBQSxFQUFPLG9CQUNUQSxFQUFNLE1BQU8sRUFDYkEsRUFBTSxrQkFBa0IzdUIsRUFBT0MsQ0FBRyxFQUV0QyxDQUVPLFNBQVNrdkIsR0FBYVIsRUFBTyxDQUNsQyxPQUFPQSxHQUFTLG1CQUFvQkEsRUFDaEMsQ0FBRSxNQUFPQSxFQUFNLGVBQWdCLElBQUtBLEVBQU0sWUFBYyxFQUN4RCxJQUNOLHF5Q0MyQ2UsQ0FDYixXQUFZLENBQUUsUUFBQVMsR0FBUyxTQUFBQyxHQUFVLFdBQUFDLEdBQVksS0FBQUMsRUFBTSxFQUNuRCxNQUFPLENBQUMsb0JBQXFCLGNBQWUsU0FBVSxRQUFTLE1BQU0sRUFDckUsYUFBYyxHQUVkLE1BQU8sQ0FDTCxXQUFZLENBQUUsS0FBTSxLQUFNLFFBQVMsSUFBTSxFQUN6QyxXQUFZLENBQUUsS0FBTSxPQUFRLFFBQVMsT0FBUyxFQUM5QyxVQUFXLENBQUUsS0FBTSxPQUFRLFFBQVMsYUFBZSxFQUNuRCxZQUFhLENBQUUsS0FBTSxPQUFRLFFBQVMsSUFBTSxFQUM1QyxLQUFNLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUN2QyxTQUFVLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBTyxFQUMzQyxPQUFRLENBQUUsS0FBTSxDQUFDLE9BQVEsV0FBVyxFQUFHLFFBQVMsU0FBVyxFQUMzRCxPQUFRLENBQUUsS0FBTSxPQUFRLFFBQVMsT0FBUyxFQUMxQyxPQUFRLENBQ04sS0FBTSxPQUNOLFFBQVMsS0FBTyxDQUNkLEtBQU1DLEVBQWMsZUFBQyxLQUNyQixLQUFNLElBRVQsRUFDRCxhQUFjLENBQUUsS0FBTSxTQUFVLFFBQVMsSUFBTSxFQUFNLENBQ3RELEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxhQUFjLEtBQUssV0FDbkIsVUFBVyxLQUFLLEtBQ2hCLGFBQWMsRUFDaEIsQ0FDRCxFQUVELFNBQVUsQ0FDUixTQUFVLENBQ1IsT0FBTyxLQUFLLGNBQWdCLEtBQUssU0FDbEMsRUFFRCxPQUFRLE9BQ04sT0FBTzV2QixFQUFBMHRCLEdBQVUsSUFBSSxJQUFkLFlBQUExdEIsRUFBaUIsY0FBYyxRQUN2QyxFQUVELGVBQWdCLENBQ2QsTUFBTyxDQUNMLE9BQVEsS0FBSyxPQUNiLEdBQUcsS0FBSyxNQUNWLENBQ0QsRUFFRCxZQUFhLENBQ1gsS0FBTSxDQUNKLE9BQU82dkIsRUFBQUEsT0FBTyxLQUFLLGFBQWMsS0FBSyxhQUFhLEdBQUssRUFDekQsRUFFRCxJQUFJdnZCLEVBQU8sQ0FDVCxNQUFNbEMsRUFBT0csR0FBVStCLEVBQU8sS0FBSyxhQUFhLEVBQzVDbEMsSUFDRixLQUFLLGFBQWVBLEVBRXhCLENBQ0YsQ0FDRCxFQUVELE1BQU8sQ0FDTCxXQUFXc2dCLEVBQUlDLEVBQU0sQ0FDZixDQUFDRCxHQUFPLENBQUNDLElBQ1gsS0FBSyxhQUFlRCxFQUV2QixFQUVELGFBQWFwZSxFQUFPLENBQ2QsQ0FBQ0EsR0FBVSxDQUFDLEtBQUssYUFDbkIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBSyxFQUNyQyxLQUFLLE1BQU0sU0FBVUEsQ0FBSyxFQUU3QixFQUVELEtBQUt1dEIsRUFBTSxDQUNULEtBQUssVUFBWUEsQ0FDbEIsRUFFRCxVQUFVblAsRUFBSUMsRUFBTSxDQUNkRCxFQUFLQyxHQUNQLEtBQUssTUFBTSxjQUFlRCxDQUFFLENBRS9CLEVBRUQsUUFBUUEsRUFBSUMsRUFBTSxDQUNaRCxFQUFLQyxHQUNQLEtBQUssTUFBTUQsRUFBSyxRQUFVLE1BQU0sQ0FFcEMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxRQUFRb1IsRUFBTyxDQUNiLEtBQUssYUFBZUEsRUFDcEIsS0FBSyxVQUFZQSxDQUNsQixFQUVELFVBQVVwZSxFQUFPLE9BQ2YsS0FBTSxDQUFFLElBQUsyYSxFQUFNLE1BQUFFLEdBQVVrQixHQUFpQi9iLENBQUssRUFDbkQsR0FBSTJhLEdBQVFFLEVBQU8sQ0FDakI3YSxFQUFNLGVBQWUsRUFFckIsTUFBTWhTLEdBQVdNLEVBQUF1dkIsR0FBYSxLQUFLLEtBQUssSUFBdkIsWUFBQXZ2QixFQUEwQixNQUNyQyt2QixFQUFjcndCLEdBQ2xCRCxHQUFzQixLQUFLLFlBQWFDLEVBQVUsS0FBSyxhQUFhLEVBRXRFLEdBQUkyc0IsR0FBUSxDQUFDLEtBQUssVUFDaEIsS0FBSyxVQUFZLE9BQ1osQ0FDTCxLQUFNLENBQUUsU0FBQTJELEdBQWEsS0FBSyxNQUMxQixHQUFJQSxFQUFVLENBQ1osS0FBTSxDQUFFLEtBQU1qWSxFQUFNLE1BQUEzWCxDQUFRLEVBQUUydkIsRUFBWXJ3QixDQUFRLEdBQUssQ0FBQyxFQUV0RHFZLEdBQ0FpWSxFQUFTLFNBQVMsQ0FBRSxLQUFBM0QsRUFBTSxNQUFBRSxFQUFPLEtBQUF4VSxFQUFNLE9BQVEsR0FBTSxHQUVyRCxLQUFLLFVBQVUsSUFBTXVYLEdBQWEsS0FBSyxNQUFPUyxFQUFZM3ZCLENBQUssQ0FBQyxDQUFDLENBRXJFLENBQ0YsQ0FDRixDQUNELEVBRUQsWUFBWTZ2QixFQUFRLENBQ2xCLEtBQUssVUFBWSxDQUFDLEtBQUssV0FBYSxDQUFDQSxHQUFVLENBQUMsS0FBSyxXQUNqRCxLQUFLLFdBQ1AsS0FBSyxNQUFNLENBRWQsRUFFRCxPQUFRLENBQ04sS0FBSyxNQUFNLE1BQU0sQ0FDbEIsRUFFRCxNQUFPLENBQ0wsS0FBSyxNQUFNLEtBQUssQ0FDbEIsQ0FDRixDQUNGLDJtRUNwSGUsQ0FDYixXQUFZLENBQUUsUUFBQVQsR0FBUyxXQUFBRSxHQUFZLEtBQUFDLEVBQU0sRUFDekMsTUFBTyxDQUFDLG9CQUFxQixjQUFlLFNBQVUsUUFBUyxNQUFNLEVBQ3JFLGFBQWMsR0FFZCxNQUFPLENBQ0wsV0FBWSxDQUFFLEtBQU0sS0FBTSxRQUFTLElBQU0sRUFDekMsV0FBWSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDOUMsVUFBVyxDQUFFLEtBQU0sT0FBUSxRQUFTLGFBQWUsRUFDbkQsWUFBYSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDNUMsS0FBTSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDdkMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsT0FBUSxDQUFFLEtBQU0sQ0FBQyxPQUFRLFdBQVcsRUFBRyxRQUFTLFNBQVcsRUFDM0QsT0FBUSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDMUMsT0FBUSxDQUNOLEtBQU0sT0FDTixRQUFTLEtBQU8sQ0FDZCxLQUFNQyxFQUFjLGVBQUMsS0FDckIsS0FBTSxJQUVULEVBQ0QsYUFBYyxDQUFFLEtBQU0sU0FBVSxRQUFTLElBQU0sRUFBTyxFQUN0RCxlQUFnQixDQUFFLEtBQU0sU0FBVSxRQUFTLElBQU0sRUFBTyxFQUN4RCxlQUFnQixDQUFFLEtBQU0sU0FBVSxRQUFTLElBQU0sRUFBTSxDQUN4RCxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsYUFBYyxLQUFLLFdBQ25CLFVBQVcsS0FBSyxLQUNoQixhQUFjLEdBQ2QsaUJBQWtCLEVBQ3BCLENBQ0QsRUFFRCxTQUFVLENBQ1IsU0FBVSxDQUNSLE9BQU8sS0FBSyxjQUFnQixLQUFLLFNBQ2xDLEVBRUQsT0FBUSxPQUNOLE9BQU81dkIsRUFBQTB0QixHQUFVLElBQUksSUFBZCxZQUFBMXRCLEVBQWlCLGNBQWMsUUFDdkMsRUFFRCxlQUFnQixDQUNkLE1BQU8sQ0FDTCxPQUFRLEtBQUssT0FDYixHQUFHLEtBQUssTUFDVixDQUNELEVBRUQsWUFBYSxDQUNYLEtBQU0sQ0FDSixPQUFPNnZCLEVBQUFBLE9BQU8sS0FBSyxhQUFjLEtBQUssYUFBYSxHQUFLLEVBQ3pELEVBRUQsSUFBSXZ2QixFQUFPLENBQ1QsTUFBTWxDLEVBQU9HLEdBQVUrQixFQUFPLEtBQUssYUFBYSxFQUM1Q2xDLElBQ0YsS0FBSyxhQUFlQSxFQUV4QixDQUNELEVBRUQsYUFBYyxDQUNaLE9BQ0UsS0FBSyxjQUlMQyxHQUFVLElBQUksS0FBUSxDQUFFLEtBQU0sRUFBRyxPQUFRLEVBQUcsT0FBUSxFQUFHLFlBQWEsQ0FBQSxDQUFHLENBRTFFLEVBRUQsS0FBTSxDQUNKLEtBQU0sQ0FDSixPQUFPLEtBQUssWUFBWSxTQUFTLENBQ2xDLEVBRUQsSUFBSVksRUFBTSxDQUNSLEtBQUssUUFBUSxDQUFFLEtBQUFBLEVBQU0sQ0FDdkIsQ0FDRCxFQUVELE9BQVEsQ0FDTixLQUFNLENBQ0osT0FBTyxLQUFLLFlBQVksV0FBVyxDQUNwQyxFQUVELElBQUlDLEVBQVEsQ0FDVixLQUFLLFFBQVEsQ0FBRSxPQUFBQSxFQUFRLENBQ3pCLENBQ0QsRUFFRCxPQUFRLENBQ04sS0FBTSxDQUNKLE9BQU8sS0FBSyxZQUFZLFdBQVcsQ0FDcEMsRUFFRCxJQUFJQyxFQUFRLENBQ1YsS0FBSyxRQUFRLENBQUUsT0FBQUEsRUFBUSxDQUN6QixDQUNGLENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBV3VmLEVBQUlDLEVBQU0sQ0FDZixDQUFDRCxHQUFPLENBQUNDLElBQ1gsS0FBSyxhQUFlRCxFQUNwQixLQUFLLFVBQVUsRUFBSSxFQUV0QixFQUVELGFBQWFwZSxFQUFPLENBQ2QsQ0FBQ0EsR0FBVSxDQUFDLEtBQUssYUFDbkIsS0FBSyxNQUFNLG9CQUFxQkEsQ0FBSyxFQUNyQyxLQUFLLE1BQU0sU0FBVUEsQ0FBSyxFQUMxQixLQUFLLFVBQVUsRUFBSSxFQUV0QixFQUVELGFBQWMsQ0FDWixLQUFNLENBQUUsTUFBQXl1QixDQUFNLEVBQUksS0FDWm1CLEVBQVlYLEdBQWFSLENBQUssRUFFbEMsS0FBSyxTQUNMLENBQUMsS0FBSyxrQkFDTm1CLEVBQVUsUUFBVUEsRUFBVSxLQUU5QixLQUFLLFVBQVUsSUFBTVosR0FBYVAsRUFBT21CLENBQVMsQ0FBQyxFQUVyRCxLQUFLLGlCQUFtQixFQUN6QixFQUVELEtBQUtyQyxFQUFNLENBQ1QsS0FBSyxVQUFZQSxDQUNsQixFQUVELFVBQVVuUCxFQUFJQyxFQUFNLENBQ2RELEdBQ0YsS0FBSyxVQUFVLEVBQUssRUFFbEJBLEVBQUtDLEdBQ1AsS0FBSyxNQUFNLGNBQWVELENBQUUsQ0FFL0IsRUFFRCxRQUFRQSxFQUFJQyxFQUFNLENBQ1pELEVBQUtDLEdBQ1AsS0FBSyxNQUFNRCxFQUFLLFFBQVUsTUFBTSxDQUVwQyxDQUNELEVBRUQsUUFBUyxDQUNQLFFBQVFwZSxFQUFPLENBQ2IsT0FBUSxJQUFNQSxHQUFPLE1BQU0sRUFBRSxDQUM5QixFQUVELFFBQVFoQyxFQUFXLENBQ2pCLEtBQUssYUFBZUQsR0FBVSxLQUFLLFlBQWEsQ0FDOUMsR0FBR0MsRUFDSCxZQUFhLEVBQ2QsQ0FDRixFQUVELFVBQVU2eEIsRUFBUSxDQUNoQixNQUFNQyxFQUFTLENBQUNuUCxFQUFLM2dCLElBQVUsQ0FDN0IsTUFBTWtELEVBQVMsS0FBSyxNQUFNeWQsQ0FBRyxFQUM3QixHQUFJemQsRUFBUSxDQUNWLE1BQU02c0IsRUFDSjdzQixFQUFPLGNBRU5BLEVBQU8sa0JBQW9CLEdBRXhCb3JCLEVBQU0sS0FBSyxNQUFNdHVCLEVBQVErdkIsQ0FBVSxFQUNuQ0MsRUFBVyxLQUFLLElBQUk5c0IsRUFBTyxVQUFZb3JCLENBQUcsRUFDaERwckIsRUFBTyxTQUFTLENBQ2QsSUFBQW9yQixFQUNBLFNBQVV1QixHQUFVRyxFQUFXLElBQU0sU0FBVyxPQUNqRCxDQUNILENBQ0YsRUFDQSxLQUFLLFVBQVUsSUFBTSxDQUNuQkYsRUFBTyxPQUFRLEtBQUssSUFBSSxFQUN4QkEsRUFBTyxTQUFVLEtBQUssTUFBTSxFQUM1QkEsRUFBTyxTQUFVLEtBQUssTUFBTSxFQUM3QixDQUNGLEVBRUQsUUFBUU4sRUFBTyxDQUNiLEtBQUssYUFBZUEsRUFDcEIsS0FBSyxVQUFZQSxDQUNsQixFQUVELFVBQVVwZSxFQUFPLENBQ2YsS0FBTSxDQUFFLE1BQUFxZCxDQUFNLEVBQUksS0FDWm1CLEVBQVlYLEdBQWFSLENBQUssRUFDOUIsQ0FBRSxJQUFLMUMsRUFBTSxNQUFBRSxHQUFVa0IsR0FBaUIvYixDQUFLLEVBQ25ELEdBQUkyYSxHQUFRRSxFQUFPLENBQ2pCN2EsRUFBTSxlQUFlLEVBRXJCLE1BQU1xZSxFQUFjcndCLEdBQ2xCRCxHQUFzQixLQUFLLFlBQWFDLEVBQVUsS0FBSyxhQUFhLEVBRXRFLEdBQUkyc0IsRUFDRixHQUFJLENBQUMsS0FBSyxVQUNSLEtBQUssVUFBWSxPQUNaLENBQ0wsS0FBTSxDQUFFLEtBQUF2WixFQUFNLE1BQUExUyxDQUFNLEVBQUkydkIsRUFBWUcsRUFBVSxLQUFLLEdBQUssQ0FBQyxFQUN6RCxHQUFJcGQsRUFBTSxDQUNSLE1BQU14UyxFQUFRLEtBQUt3UyxDQUFJLEVBQUl1WixFQUNyQnJjLEVBQVEsS0FBSyxNQUFNOEMsQ0FBSSxFQUFFLGtCQUMvQixLQUFLQSxDQUFJLEVBQ1B4UyxFQUFRLEVBQ0pBLEVBQVEwUCxFQUNSMVAsR0FBUzBQLEVBQ1AxUCxFQUFRMFAsRUFDUjFQLEVBQ1IsS0FBSyxpQkFBbUIsR0FDeEIsS0FBSyxVQUFVLElBQU1ndkIsR0FBYVAsRUFBT2dCLEVBQVkzdkIsQ0FBSyxDQUFDLENBQUMsQ0FDOUQsQ0FDRixNQUNTbXNCLElBQ1QsS0FBSyxVQUFZLEdBRXJCLFNBQVcyRCxFQUFVLFFBQVVBLEVBQVUsSUFBSyxDQUM1QyxLQUFNLENBQUUsTUFBQTV2QixHQUFVeXVCLEVBQ2xCLElBQUlqdkIsRUFBTW93QixFQUFVLE1BRXBCLE1BQU1LLEVBQVVDLEdBQVEsQ0FBQyxNQUFNLFNBQVNBLEVBQU0sRUFBRSxDQUFDLEVBRWpELEdBQUk5ZSxFQUFNLElBQUksU0FBVyxFQUN2QixHQUFJNmUsRUFBUTdlLEVBQU0sR0FBRyxHQUFLNVIsRUFBTVEsRUFBTSxPQUVsQ0EsRUFBTVIsQ0FBRyxJQUFNLEtBQ2Z5d0IsRUFBUWp3QixFQUFNUixFQUFNLENBQUMsQ0FBQyxHQUN0Qnl3QixFQUFRandCLEVBQU1SLEVBQU0sQ0FBQyxDQUFDLEdBRXRCQSxJQUtBeXdCLEVBQVFqd0IsRUFBTVIsQ0FBRyxDQUFDLElBQ2hCeXdCLEVBQVFqd0IsRUFBTVIsRUFBTSxDQUFDLENBQUMsR0FDdEJ5d0IsRUFBUWp3QixFQUFNUixFQUFNLENBQUMsQ0FBQyxLQUd4Qml2QixFQUFNLE1BQ0p6dUIsRUFBTSxNQUFNLEVBQUdSLENBQUcsRUFDbEJRLEVBQU0sTUFBTVIsRUFBTSxDQUFDLEVBRXJCd3ZCLEdBQWFQLEVBQU8sQ0FBRSxNQUFPanZCLEVBQUssSUFBS0EsRUFBSyxPQUV6QyxDQUNMLE1BQU1ELEVBQVNnd0IsRUFBQUEsT0FBTyxLQUFLLGFBQWMsS0FBSyxhQUFhLEVBQUUsT0FDekR2dkIsRUFBTSxTQUFXVCxFQUNuQjZSLEVBQU0sZUFBZSxFQUNacFIsRUFBTSxPQUFTVCxJQUN4Qmt2QixFQUFNLE1BQVF6dUIsRUFBTSxNQUFNLEVBQUdULENBQU0sRUFDbkN5dkIsR0FBYVAsRUFBT21CLENBQVMsRUFDN0J4ZSxFQUFNLGVBQWUsRUFFekIsTUFDU0EsRUFBTSxNQUFRLGNBRXJCNVIsSUFBUSxHQUNSLENBQUMsSUFBSyxHQUFHLEVBQUUsU0FBU1EsRUFBTVIsRUFBTSxDQUFDLENBQUMsS0FHaENBLElBQVFRLEVBQU0sUUFDZEEsRUFBTVIsQ0FBRyxJQUFNLEtBRWZBLElBQ0FpdkIsRUFBTSxNQUNKenVCLEVBQU0sTUFBTSxFQUFHUixDQUFHLElBQ2hCUSxFQUFNUixFQUFNLENBQUMsR0FBSyxJQUFNLE1BQzFCUSxFQUFNLE1BQU1SLEVBQU0sQ0FBQyxFQUVyQnd2QixHQUFhUCxFQUFPLENBQUUsTUFBT2p2QixFQUFLLElBQUtBLEVBQUssR0FFNUN5d0IsRUFBUWp3QixFQUFNUixDQUFHLENBQUMsR0FDbEIsQ0FBQ3l3QixFQUFRLENBQUNqd0IsRUFBTVIsRUFBTSxDQUFDLENBQUMsSUFHeEJpdkIsRUFBTSxNQUFRenVCLEVBQU0sTUFBTSxFQUFHUixDQUFHLEVBQUksSUFBTVEsRUFBTSxNQUFNUixDQUFHLEVBQ3pEd3ZCLEdBQWFQLEVBQU8sQ0FBRSxNQUFPanZCLEVBQUssSUFBS0EsRUFBSyxHQUlwRCxDQUNELEVBRUQsWUFBWW13QixFQUFRLENBQ2xCLEtBQUssVUFBWSxDQUFDLEtBQUssV0FBYSxDQUFDQSxHQUFVLENBQUMsS0FBSyxXQUNqRCxLQUFLLFdBQ1AsS0FBSyxNQUFNLENBRWQsRUFFRCxPQUFRLENBQ04sS0FBSyxNQUFNLE1BQU0sQ0FDbEIsRUFFRCxNQUFPLENBQ0wsS0FBSyxNQUFNLEtBQUssQ0FDbEIsQ0FDRixDQUNGLDI5Q0M1VWUsQ0FDYixXQUFZLENBQUUsV0FBQVAsR0FBWSxXQUFBZSxHQUFZLFdBQUFDLEdBQVksS0FBQWYsRUFBTSxFQUN4RCxNQUFPLENBQUMsb0JBQXFCLFNBQVUsUUFBUyxNQUFNLEVBQ3RELGFBQWMsR0FFZCxNQUFPLENBQ0wsV0FBWSxDQUFFLEtBQU0sS0FBTSxRQUFTLElBQU0sRUFDekMsV0FBWSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDOUMsWUFBYSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQU0sRUFDNUMsU0FBVSxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQU8sRUFDM0MsT0FBUSxDQUFFLEtBQU0sT0FBUSxRQUFTLE9BQVMsRUFDMUMsT0FBUSxDQUFFLEtBQU0sT0FBUSxRQUFTLElBQUssQ0FDdkMsRUFFRCxNQUFPLENBQ0wsTUFBTyxDQUNMLGFBQWMsS0FBSyxXQUNuQixTQUFVLEdBQ1YsU0FBVSxHQUNWLGFBQWMsR0FDZCxZQUFhLEdBQ2IsWUFBYSxHQUNiLFdBQVksSUFDZCxDQUNELEVBRUQsU0FBVSxDQUNSLFlBQWEsQ0FDWCxLQUFNLENBQUUsV0FBQS9HLEVBQVksU0FBQStILEVBQVUsT0FBQWx5QixFQUFRLGNBQWVveEIsQ0FBSyxFQUFNLEtBQ2hFLE1BQU8sQ0FBRSxXQUFBakgsRUFBWSxTQUFBK0gsRUFBVSxPQUFBbHlCLEVBQVEsT0FBQW94QixDQUFPLENBQy9DLEVBRUQsU0FBVSxDQUNSLE9BQU8sS0FBSyxjQUFnQixLQUFLLFVBQVksS0FBSyxRQUNuRCxFQUVELE9BQVEsQ0FDTixPQUFPLEtBQUssTUFBTSxNQUFNLEtBQ3pCLEVBRUQsZUFBZ0IsQ0FDZCxPQUFPZSxFQUFZLGFBQ2pCLENBQ0UsT0FBUSxLQUFLLE9BQ2IsS0FBTWhCLEVBQWMsZUFBQyxLQUNyQixLQUFNQSxFQUFjLGVBQUMsSUFDdEIsRUFDRCxDQUNFLEtBQU0sQ0FDSixNQUFPLFFBQ1AsT0FBUSxDQUFDdHZCLEVBQU9tRCxFQUFNa1MsSUFBTyxXQUMzQixPQUFBbFMsSUFBUyxXQUFhLFNBQVMsS0FBS25ELENBQUssRUFDckMsT0FDQXl0QixHQUFBbGMsR0FBQTdSLEVBQUEsS0FBSyxTQUFMLFlBQUFBLEVBQWEsT0FBYixZQUFBNlIsRUFBbUIsU0FBbkIsWUFBQWtjLEVBQUEsS0FBQWxjLEVBQTRCdlIsRUFBT21ELEVBQU1rUyxLQUFZclYsRUFDN0QsQ0FDRCxFQUNELEtBQUssTUFDUCxDQUNELEVBRUQsV0FBWSxPQUNWLE1BQU02aEIsRUFBTyxLQUFLLFlBQ2xCLEdBQUlBLEVBQU0sQ0FDUixNQUFNempCLEdBQU9zQixFQUFBbWlCLEVBQUssTUFBTSxhQUFhLElBQXhCLFlBQUFuaUIsRUFBNEIsR0FDekMsR0FBSXRCLEVBQ0YsT0FBT3lqQixFQUFLLE9BQVN6akIsRUFBSyxNQUU5QixDQUNBLE9BQU8sSUFDUixFQUVELFlBQWEsQ0FDWCxLQUFNLENBQ0osT0FBT214QixFQUFBQSxPQUFPLEtBQUssYUFBYyxLQUFLLGFBQWEsR0FBSyxFQUN6RCxFQUVELElBQUl2dkIsRUFBTyxDQUNULE1BQU1sQyxFQUFPRyxHQUFVK0IsRUFBTyxLQUFLLGFBQWEsRUFDaEQsR0FBSWxDLEVBQU0sQ0FDUixNQUFNOHhCLEVBQVlYLEdBQWEsS0FBSyxLQUFLLEVBQ3pDLEtBQUssYUFBZW54QixFQUNwQixLQUFLLFVBQVUsSUFBTWt4QixHQUFhLEtBQUssTUFBT1ksQ0FBUyxDQUFDLENBQzFELENBQ0YsQ0FDRixDQUNELEVBRUQsTUFBTyxDQUNMLFdBQVd4UixFQUFJQyxFQUFNLENBQ2YsQ0FBQ0QsR0FBTyxDQUFDQyxJQUNYLEtBQUssYUFBZUQsRUFFdkIsRUFFRCxhQUFhcGUsRUFBTyxDQUNkLENBQUNBLEdBQVUsQ0FBQyxLQUFLLGFBQ25CLEtBQUssTUFBTSxvQkFBcUJBLENBQUssRUFDckMsS0FBSyxNQUFNLFNBQVVBLENBQUssRUFFN0IsRUFFRCxRQUFRb2UsRUFBSUMsRUFBTSxDQUNaRCxFQUFLQyxHQUNQLEtBQUssTUFBTUQsRUFBSyxRQUFVLE1BQU0sQ0FFcEMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxRQUFRb1IsRUFBTyxDQUNiLEtBQUssYUFBZUEsRUFDaEJBLEVBQ0YsS0FBSyxhQUFhLEdBRWxCLEtBQUssU0FBVyxHQUNoQixLQUFLLFNBQVcsR0FFbkIsRUFFRCxZQUFZRyxFQUFRLENBQ2RBLElBQVcsS0FBSyxVQUFZLEtBQUssV0FDbkMsS0FBSyxTQUFXLEdBQ2hCLEtBQUssU0FBVyxJQUNOLEtBQUssV0FDZixLQUFLLE1BQU0sRUFDWCxzQkFBc0IsSUFBTSxLQUFLLGNBQWMsRUFFbEQsRUFFRCxVQUFVdmUsRUFBTyxDQUNmLE1BQU1xRyxFQUFPLEtBQUssUUFBUXJHLENBQUssRUFDL0IsS0FBSyxNQUFNcUcsQ0FBSSxFQUFFLFVBQVVyRyxDQUFLLEVBQzVCQSxFQUFNLGlCQUNSLEtBQUssV0FBYXFHLEVBQ1RBLElBQVMsS0FBSyxZQUN2QixLQUFLLGFBQWFBLENBQUksQ0FFekIsRUFFRCxRQUFRckcsRUFBUSxLQUFNLENBQ3BCLEtBQU0sQ0FBRSxNQUFBdFIsQ0FBUSxFQUFFbXZCLEdBQWEsS0FBSyxLQUFLLEVBQ25DLENBQUUsSUFBS2xELEdBQVNvQixHQUFpQi9iLENBQUssRUFDNUMsT0FBTyxLQUFLLFlBQWMsTUFBUXRSLEVBQVFpc0IsRUFBTyxLQUFLLFVBQ2xELE9BQ0EsTUFDTCxFQUVELGFBQWF0VSxFQUFPLEtBQUssVUFBVyxDQUM5QkEsSUFDRixLQUFLLFdBQWEsTUFFcEIsS0FBSyxTQUFXQSxJQUFTLE9BQ3pCLEtBQUssU0FBV0EsSUFBUyxNQUMxQixFQUVELE9BQVEsQ0FDTixLQUFLLE1BQU0sTUFBTSxDQUNsQixFQUVELE1BQU8sQ0FDTCxLQUFLLE1BQU0sS0FBSyxDQUNsQixDQUNGLENBQ0YsaXNCQ2xNZSxDQUNiLE1BQU8sQ0FBQyxhQUFhLEVBRXJCLE1BQU8sQ0FDTCxNQUFPLENBQUUsS0FBTSxPQUFRLFFBQVMsQ0FBRyxFQUNuQyxLQUFNLENBQUUsS0FBTSxPQUFRLFFBQVMsQ0FBRyxFQUNsQyxTQUFVLENBQUUsS0FBTSxPQUFRLFFBQVMsRUFBSSxFQUN2QyxVQUFXLENBQUUsS0FBTSxRQUFTLFFBQVMsRUFBSyxDQUMzQyxFQUVELE1BQU8sQ0FDTCxNQUFPLENBQ0wsU0FBVSxHQUNWLFNBQVUsR0FDVixZQUFhLEtBQUssSUFDcEIsQ0FDRCxFQUVELFNBQVUsQ0FDUixPQUFRLENBQ04sT0FBUSxLQUFLLFlBQWMsR0FBSyxLQUFLLFNBQVcsQ0FDakQsRUFFRCxNQUFPLENBQ0wsT0FBTyxLQUFLLElBQUksS0FBSyxNQUFRLEtBQUssU0FBVyxFQUFHLEtBQUssS0FBSyxDQUMzRCxFQUVELFVBQVcsQ0FDVCxPQUFPLEtBQUssS0FBSyxLQUFLLE1BQVEsS0FBSyxRQUFRLENBQzVDLEVBRUQsU0FBVSxDQUNSLEtBQU0sQ0FBRSxTQUFBOFksRUFBVSxTQUFBQyxFQUFVLFlBQUFDLEVBQWEsU0FBQUMsQ0FBVyxFQUFFLEtBQ2hEQyxFQUFhSixFQUFXQyxFQUFXLEVBRXpDLElBQUkxd0IsRUFBUSxFQUNSQyxFQUFNLEVBQ04yd0IsR0FBWUMsRUFDZDV3QixFQUFNMndCLEVBQ0dELEdBQWVGLEVBQVcsRUFDbkN4d0IsRUFBTTR3QixFQUNHRixHQUFlQyxFQUFXRixHQUNuQ3p3QixFQUFNMndCLEVBQ041d0IsRUFBUTR3QixFQUFXQyxFQUFhLElBRWhDN3dCLEVBQVEyd0IsRUFBY0YsRUFDdEJ4d0IsRUFBTTB3QixFQUFjRCxHQUd0QixNQUFNSSxFQUFVLENBQUMsRUFDakJBLEVBQVEsS0FBSyxDQUNYLE1BQU9ILEVBQWMsRUFDckIsS0FBTSxPQUNOLFNBQVVBLEdBQWUsRUFDMUIsRUFDRzN3QixHQUFTLEdBQ1g4d0IsRUFBUSxLQUFLLENBQUUsTUFBTyxFQUFHLEtBQU0sRUFBRyxFQUVoQzl3QixFQUFRLEdBQ1Y4d0IsRUFBUSxLQUFLLENBQ1gsTUFBTyxLQUFLLElBQUksRUFBR0gsRUFBYyxFQUFFLEVBQ25DLEtBQU0sZ0JBQ1AsRUFFSCxRQUFTcndCLEVBQUlOLEVBQU9NLEdBQUtMLEVBQUtLLElBQzVCd3dCLEVBQVEsS0FBSyxDQUNYLE1BQU94d0IsRUFDUCxLQUFNQSxFQUNOLE9BQVFBLElBQU1xd0IsRUFDZixFQUVILE9BQUkxd0IsRUFBTTJ3QixFQUFXLEdBQ25CRSxFQUFRLEtBQUssQ0FDWCxNQUFPLEtBQUssSUFBSUYsRUFBVUQsRUFBYyxFQUFFLEVBQzFDLEtBQU0sZ0JBQ1AsRUFFQzF3QixHQUFPMndCLEVBQVcsR0FDcEJFLEVBQVEsS0FBSyxDQUFFLE1BQU9GLEVBQVUsS0FBTUEsRUFBVSxFQUVsREUsRUFBUSxLQUFLLENBQ1gsTUFBT0gsRUFBYyxFQUNyQixLQUFNLE9BQ04sU0FBVUEsR0FBZUMsRUFDMUIsRUFFTUUsQ0FDVCxDQUNELEVBRUQsTUFBTyxDQUNMLEtBQUtDLEVBQU0sQ0FDVCxLQUFLLFlBQWNBLENBQ3BCLEVBRUQsVUFBVyxDQUNMLEtBQUssWUFBYyxLQUFLLFdBQzFCLEtBQUssWUFBYyxLQUFLLFNBRTNCLEVBRUQsWUFBWXpTLEVBQUlDLEVBQU0sQ0FDaEJELElBQU9DLEdBQ1QsS0FBSyxNQUFNLGNBQWVELENBQUUsQ0FFaEMsQ0FDRCxFQUVELFNBQVUsQ0FDUixLQUFLLFlBQWMsS0FBSyxJQUN6QixFQUVELFFBQVMsQ0FDUCxpQkFBaUIwUyxFQUFRLENBQ3ZCLE1BQU16RCxFQUFVLENBQ2QsZ0JBQWlCeUQsRUFBTyxNQUMxQixFQUNBLE9BQUlBLEVBQU8sT0FDVHpELEVBQVEsZUFBZXlELEVBQU8sSUFBSSxFQUFFLEVBQUksSUFFbkN6RCxDQUNSLEVBRUQsY0FBY3lELEVBQVEsQ0FFbEJBLEVBQU8sT0FDUCxDQUFDQSxFQUFPLFVBQ1JBLEVBQU8sUUFBVSxLQUFLLGNBRXRCLEtBQUssWUFBY0EsRUFBTyxNQUU5QixDQUNGLENBQ0YseXRCQy9IZSxDQUNiLE1BQU8sQ0FBQyxvQkFBcUIsUUFBUSxFQUNyQyxhQUFjLEdBRWQsTUFBTyxDQUNMLFdBQVksQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzdDLEdBQUksQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ25DLEtBQU0sQ0FBRSxLQUFNLE9BQVEsUUFBUyxJQUFNLEVBQ3JDLFNBQVUsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFPLEVBQzNDLE9BQVEsQ0FBRSxLQUFNLENBQUMsT0FBUSxPQUFPLEVBQUcsUUFBUyxFQUFNLENBQ25ELEVBRUQsTUFBTyxDQUNMLE1BQU8sQ0FDTCxRQUFTLEtBQUssVUFDaEIsQ0FDRCxFQUVELFNBQVUsQ0FDUixTQUFVLENBQ1IsTUFBTyxDQUNMLEtBQUssT0FBTyxNQUNaLENBQ0UsZUFBZ0IsS0FBSyxRQUNyQixnQkFBaUIsS0FBSyxRQUN4QixDQUNGLENBQ0QsRUFFRCxRQUFTLENBQ1AsS0FBTSxDQUFFLE9BQVEsQ0FBRSxRQUFBbEgsRUFBUyxVQUFBbUgsQ0FBVSxFQUFJLENBQUMsQ0FBQSxFQUFNLEtBRTFDeHhCLEVBQVMsS0FBSyxJQUFJLEVBQUdxcUIsR0FBQSxZQUFBQSxFQUFTLE9BQVFtSCxHQUFBLFlBQUFBLEVBQVcsTUFBTSxFQUM3RCxNQUFPLENBQ0wsaUJBQWtCeHhCLEVBQVMsR0FBR0EsRUFBUyxHQUFHLE1BQVEsSUFDcEQsQ0FDRCxFQUVELFlBQWEsQ0FDWCxLQUFNLENBQUUsTUFBT2lxQixFQUFHLEdBQUdrRixDQUFhLEVBQUUsS0FBSyxPQUN6QyxPQUFPQSxDQUNULENBQ0QsRUFFRCxNQUFPLENBQ0wsV0FBV2pGLEVBQVksQ0FDckIsS0FBSyxRQUFVQSxDQUNoQixFQUVELFFBQVFHLEVBQVMsQ0FDWEEsSUFBWSxLQUFLLGFBQ25CLEtBQUssTUFBTSxvQkFBcUJBLENBQU8sRUFDdkMsS0FBSyxNQUFNLFNBQVVBLENBQU8sRUFFaEMsQ0FDRCxFQUVELFFBQVMsQ0FDUCxPQUFRLENBQ04sS0FBSyxNQUFNLE1BQU0sTUFBTSxDQUN6QixDQUNGLENBQ0YsbUJDeEZBLFNBQVNvSCxHQUFpQixDQUFFLFFBQUFDLEdBQVcsQ0FBRSxNQUFBbGEsQ0FBSSxFQUFLLENBQ2hELE9BQU9rYSxFQUNIQyxHQUFjdE0sR0FBWXpZLEdBQU80SyxDQUFLLEVBQ3RDQSxFQUFNLFFBQVEsQ0FDcEIsQ0FFQWlhLEdBQWlCLE1BQVEsQ0FDdkIsUUFBUyxDQUFFLEtBQU0sUUFBUyxRQUFTLEVBQUssQ0FDMUMsRUFFSyxNQUFBdEYsR0FBYXNGLEdBRVpHLEdBQVcsQ0FBQ0MsRUFBU2hRLElBQVUsT0FBTyxPQUFPZ1EsRUFBUSxNQUFPaFEsQ0FBSyxFQUVqRWlRLEdBQWMzcEIsR0FBWSxXQUFXQSxFQUFVLENBQUMsRUFHaEQ0cEIsR0FBZUYsR0FBVyxpQkFBaUJBLENBQU8sRUFBRSxPQUVwRGpsQixHQUFRLENBQ1osS0FBTSxjQUVOLGFBQWFpbEIsRUFBUyxDQUlwQkMsR0FBWSxJQUFNRixHQUFTQyxFQUFTLENBQUUsT0FBUSxJQUFLLENBQUMsQ0FBQyxDQUN0RCxFQUVELFFBQVFBLEVBQVMsQ0FLZixLQUFNLENBQUUsTUFBQUcsR0FBVSxpQkFBaUJILENBQU8sRUFDMUNELEdBQVNDLEVBQVMsQ0FDaEIsTUFBQUcsRUFDQSxTQUFVLFdBQ1YsV0FBWSxTQUNaLE9BQVEsT0FDVCxFQUNERixHQUFZLElBQU0sQ0FDaEIsS0FBTSxDQUFFLE9BQUFHLEdBQVcsaUJBQWlCSixDQUFPLEVBQzNDRCxHQUFTQyxFQUFTLENBQ2hCLE1BQU8sS0FDUCxTQUFVLEtBQ1YsV0FBWSxLQUNaLE9BQVEsRUFDVCxFQUNERSxHQUFhRixDQUFPLEVBQ3BCQyxHQUFZLElBQU1GLEdBQVNDLEVBQVMsQ0FBRSxPQUFBSSxDQUFRLENBQUEsQ0FBQyxFQUNoRCxDQUNGLEVBRUQsUUFBUUosRUFBUyxDQUNmLEtBQU0sQ0FBRSxPQUFBSSxHQUFXLGlCQUFpQkosQ0FBTyxFQUMzQ0QsR0FBU0MsRUFBUyxDQUFFLE9BQUFJLEVBQVEsRUFDNUJGLEdBQWFGLENBQU8sRUFDcEJDLEdBQVksSUFBTUYsR0FBU0MsRUFBUyxDQUFFLE9BQVEsQ0FBQSxDQUFHLENBQUMsQ0FDcEQsQ0FDRixFQzdETyxTQUFTSyxHQUFnQjdtQixFQUFPLENBQ3JDLE9BQU9BLEdBQVNvaUIsRUFBTyxRQUFDcGlCLENBQUssRUFBRSxLQUFLQSxHQUFTQSxFQUFNLE9BQVMyTSxDQUFPLENBQ3JFLENBRU8sU0FBU21hLEdBQWU3VixFQUFNMVAsRUFBUSxHQUFJLENBQy9DLE9BQUEwUCxFQUFPdlAsRUFBUSxTQUFDdVAsQ0FBSSxFQUFJMEIsR0FBVSxFQUFDMUIsQ0FBSSxFQUFJQSxFQUNwQzRWLEdBQWdCNVYsR0FBQSxZQUFBQSxFQUFPMVAsRUFBTSxDQUN0QyxDQUVPLFNBQVNsQyxHQUFJakssRUFBTyxDQUN6QixPQUFPa0ssR0FBUSxDQUFFLE1BQUFsSyxFQUFPLENBQzFCIiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzEsMiwzLDRdfQ==
22
+ **/function jo(){Oo()}process.env.NODE_ENV!=="production"&&jo();const Ko={class:"dito-calendar"},Uo={class:"dito-calendar-popup"},Yo={class:"dito-calendar-inner"},Wo={class:"dito-calendar-header"},Jo={class:"dito-calendar-body"},qo={class:"dito-calendar-weekdays"},Go={class:"dito-calendar-dates"},Xo=["onClick"],Qo={class:"dito-calendar-footer"},Zo=["title"],er={class:"dito-calendar-header"},tr={class:"dito-calendar-body"},nr={class:"dito-calendar-months"},sr=["onClick"],ir={class:"dito-calendar-header"},or={class:"dito-calendar-body"},rr={class:"dito-calendar-years"},lr=["onClick"];function ar(e,t,n,s,o,i){return m(),w("div",Ko,[v("div",Uo,[v("div",Yo,[o.currentMode==="day"?(m(),w(O,{key:0},[v("div",Wo,[v("a",{class:"dito-calendar-step-prev dito-calendar-step-year",onClick:t[0]||(t[0]=r=>i.stepYear(-1))}),v("a",{class:"dito-calendar-step-prev dito-calendar-step-month",onClick:t[1]||(t[1]=r=>i.stepMonth(-1))}),v("span",null,[v("a",{class:"dito-calendar-select-year",onClick:t[2]||(t[2]=r=>i.setMode("year"))},a.toDisplayString(i.dateToString(o.currentValue,{year:!0})),1),v("a",{class:"dito-calendar-select-month",onClick:t[3]||(t[3]=r=>i.setMode("month"))},a.toDisplayString(i.dateToString(o.currentValue,{month:!0})),1)]),v("a",{class:"dito-calendar-step-next dito-calendar-step-month",onClick:t[4]||(t[4]=r=>i.stepMonth(1))}),v("a",{class:"dito-calendar-step-next dito-calendar-step-year",onClick:t[5]||(t[5]=r=>i.stepYear(1))})]),v("div",Jo,[v("div",qo,[(m(!0),w(O,null,me(o.weekdayNames,r=>(m(),w("span",null,a.toDisplayString(r.short),1))),256))]),v("div",Go,[(m(!0),w(O,null,me(o.dateRange,r=>(m(),w("span",{class:a.normalizeClass(r.state&&`dito-calendar-item-${r.state}`),onClick:l=>r.state!=="disabled"&&i.selectDate(r.date)},a.toDisplayString(r.text),11,Xo))),256))])]),v("div",Qo,[v("a",{class:"dito-calendar-select-now",role:"button",title:i.dateToString(new Date),onClick:t[6]||(t[6]=r=>i.selectDate(new Date))},null,8,Zo)])],64)):o.currentMode==="month"?(m(),w(O,{key:1},[v("div",er,[v("a",{class:"dito-calendar-step-prev",onClick:t[7]||(t[7]=r=>i.stepYear(-1))}),v("span",null,[v("a",{class:"dito-calendar-select-year",onClick:t[8]||(t[8]=r=>i.setMode("year"))},a.toDisplayString(i.dateToString(o.currentValue,{year:!0})),1)]),v("a",{class:"dito-calendar-step-next",onClick:t[9]||(t[9]=r=>i.stepYear(1))})]),v("div",tr,[v("div",nr,[(m(!0),w(O,null,me(o.monthNames,(r,l)=>(m(),w("span",{class:a.normalizeClass(i.getMonthClass(l)),onClick:u=>i.selectMonth(l)},a.toDisplayString(r.short),11,sr))),256))])])],64)):o.currentMode==="year"?(m(),w(O,{key:2},[v("div",ir,[v("a",{class:"dito-calendar-step-prev",onClick:t[10]||(t[10]=r=>i.stepDecade(-1))}),v("span",null,a.toDisplayString(i.decadeToString(o.currentValue)),1),v("a",{class:"dito-calendar-step-next",onClick:t[11]||(t[11]=r=>i.stepDecade(1))})]),v("div",or,[v("div",rr,[(m(!0),w(O,null,me(o.yearRange,r=>(m(),w("span",{class:a.normalizeClass(i.getYearClass(r)),onClick:l=>i.selectYear(r)},a.toDisplayString(r),11,lr))),256))])])],64)):J("",!0)])])])}const re=(e,t)=>{const n=e.__vccOpts||e;for(const[s,o]of t)n[s]=o;return n},ur={emits:["update:modelValue","select"],props:{modelValue:{type:Date,default:null},locale:{type:String,default:"en-US"},disabledDate:{type:Function,default:()=>!1},mode:{type:String,default:"day"}},data(){const{weekdayNames:e,monthNames:t}=cr(this.locale);return{weekdayNames:e,monthNames:t,dateRange:[],yearRange:[],currentValue:this.modelValue||$e(new Date,{hour:0,minute:0,second:0,millisecond:0}),currentMode:this.mode}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e||new Date,this.updateDateRange())},currentValue(e,t){+e!=+t&&this.updateDateRange()},disabledDate:"updateDateRange",mode(e){this.currentMode=e}},mounted(){this.updateDateRange()},methods:{getMonthClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getMonth()&&this.currentValue.getFullYear()===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getMonth()}},getYearClass(e){return{"dito-calendar-item-active":this.modelValue&&e===this.modelValue.getFullYear(),"dito-calendar-item-current":e===this.currentValue.getFullYear()}},setDate(e,t=!1){this.currentValue=$e(this.currentValue,e),t&&this.$emit("update:modelValue",this.currentValue)},stepDecade(e){this.setDate({year:this.currentValue.getFullYear()+e*10})},setMode(e){this.currentMode=e},stepMonth(e){const{currentValue:t}=this,{year:n,month:s}=this.getYearMonth(t.getFullYear(),t.getMonth()+e);this.setDate({month:s,day:Math.min(this.getDaysInMonth(n,s),this.currentValue.getDate())})},stepYear(e){this.setDate({year:this.currentValue.getFullYear()+e})},selectDate(e){this.setDate(Mt(e),!0),this.$emit("select")},selectMonth(e){this.setMode("day"),this.setDate({month:e,day:1},!0)},selectYear(e){this.setMode("month"),this.setDate({year:e},!0)},getYearMonth(e,t){return t>11?(e++,t=0):t<0&&(e--,t=11),{year:e,month:t}},dateToString(e,{year:t,month:n,day:s}={year:!0,month:!0,day:!0}){return e.toLocaleString(this.locale,{year:t&&"numeric",month:n&&"long",day:s&&"numeric"})},decadeToString(e){const t=this.getFirstYearOfDecade(e.getFullYear());return`${t} – ${t+9}`},getDaysInMonth(e,t){return new Date(e,t+1,0).getDate()},getFirstYearOfDecade(e){return+`${e.toString().slice(0,-1)}0`},navigate({step:e,enter:t,mode:n=this.currentMode,update:s=!1}){const{currentValue:o}=this;if(e){switch(n){case"day":this.setDate({day:o.getDate()+e},s);break;case"month":this.setDate({month:o.getMonth()+e},s);break;case"year":this.setDate({year:o.getFullYear()+e},s);break}return!0}else if(t){switch(this.currentMode){case"day":this.selectDate(o);break;case"month":this.setMode("day");break;case"year":this.setMode("month");break}return!0}},updateDateRange(){this.dateRange=[],this.yearRange=[];const{currentValue:e}=this,t=e.getFullYear(),n=e.getMonth(),s=this.getFirstYearOfDecade(t);for(let f=0;f<10;f++)this.yearRange.push(s+f);let i=new Date(t,n,1).getDay()+1;i===0&&(i=7);const r=this.getDaysInMonth(t,n);if(i>1){const f=this.getYearMonth(t,n-1),p=this.getDaysInMonth(f.year,f.month);for(let c=1;c<i;c++){const d=p-i+c+1,h=new Date(f.year,f.month,d);this.dateRange.push({text:d,date:h,state:this.disabledDate(h)?"disabled":"gray"})}}const l=new Date;for(let f=1;f<=r;f++){const p=new Date(t,n,f),c=h=>h&&h.getDate()===f&&h.getFullYear()===t&&h.getMonth()===n,d=c(this.modelValue)?"active":c(l)?"today":this.disabledDate(p)?"disabled":c(e)?"current":null;this.dateRange.push({text:f,date:p,state:d})}const u=42-this.dateRange.length;if(u>0){const f=this.getYearMonth(t,n+1);for(let p=1;p<=u;p++){const c=new Date(f.year,f.month,p),d=this.disabledDate(c)?"disabled":"gray";this.dateRange.push({text:p,date:c,state:d})}}}}},Ls={};function cr(e){let t=Ls[e];if(!t){const n=[];for(let o=0;o<7;o++){const i=new Date(0,0,o);n.push({long:i.toLocaleString(e,{weekday:"long"}),short:i.toLocaleString(e,{weekday:"short"})})}const s=[];for(let o=1;o<=12;o++){const i=new Date(0,o,0);s.push({long:i.toLocaleString(e,{month:"long"}),short:i.toLocaleString(e,{month:"short"})})}t=Ls[e]={weekdayNames:n,monthNames:s}}return t}const Hs=re(ur,[["render",ar]]);function Vt(e,t){e=e instanceof NodeList?Array.from(e):R.asArray(e);for(const[n,s]of Object.entries(t))for(const o of e)o.addEventListener(n,s,!1);return{remove(){for(const[n,s]of Object.entries(t))for(const o of e)o.removeEventListener(n,s,!1)}}}function Bs(...e){return{remove(){for(const t of e)t.remove()}}}function zs(e){return{37:"left",38:"up",39:"right",40:"down",13:"enter"}[e==null?void 0:e.keyCode]}function Ot(e){const t=zs(e);return{hor:{left:-1,right:1}[t]||0,ver:{up:-1,down:1}[t]||0,enter:t==="enter"}}function pn(e){const t=R.isString(e.target)?e.$refs[e.target]:e.target;return(t==null?void 0:t.$el)??t}const fr={class:"dito-trigger-container"};function dr(e,t,n,s,o,i){return m(),w("div",fr,[n.alwaysShow?(m(),w("div",{key:0,class:a.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[M(e.$slots,"trigger")],2)):n.trigger==="click"?(m(),w("div",{key:1,class:a.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onClick:t[0]||(t[0]=(...r)=>i.onClick&&i.onClick(...r))},[M(e.$slots,"trigger")],2)):n.trigger==="hover"?(m(),w("div",{key:2,class:a.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger",onMouseenter:t[1]||(t[1]=r=>i.onHover(!0)),onMouseleave:t[2]||(t[2]=r=>i.onHover(!1))},[M(e.$slots,"trigger")],34)):n.trigger==="focus"||n.trigger==="always"?(m(),w("div",{key:3,class:a.normalizeClass(["dito-trigger",i.triggerClass]),ref:"trigger"},[M(e.$slots,"trigger")],2)):J("",!0),I(Vs,{name:`dito-${n.transition}`},{default:B(()=>[n.trigger==="hover"?mt((m(),w("div",{key:0,class:a.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:a.normalizeStyle(i.popupStyle),onMouseenter:t[3]||(t[3]=r=>i.onHover(!0)),onMouseleave:t[4]||(t[4]=r=>i.onHover(!1))},[o.showPopup?M(e.$slots,"popup",{key:0}):J("",!0)],38)),[[dn,o.showPopup]]):mt((m(),w("div",{key:1,class:a.normalizeClass(["dito-popup",i.popupClass]),ref:"popup",style:a.normalizeStyle(i.popupStyle)},[o.showPopup?M(e.$slots,"popup",{key:0}):J("",!0)],6)),[[dn,o.showPopup]])]),_:3},8,["name"])])}const hn=re({emits:["update:show"],props:{trigger:{type:String,default:"click"},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom"},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:null},customClass:{type:String,default:null},zIndex:{type:Number,default:0},keepInView:{type:Boolean,default:!0},hideWhenClickOutside:{type:Boolean,default:!0},alwaysShow:{type:Boolean,default:!1},cover:{type:Boolean,default:!1},hideDelay:{type:Number,default:0}},data(){return{showPopup:this.show,popupPlacement:this.placement,focusEvents:null,closeEvents:null,popupEvents:null,blurTimer:null,mouseLeaveTimer:null}},computed:{triggerClass(){return{"dito-trigger-disabled":this.disabled}},popupClass(){const e={[`dito-popup-${R.hyphenate(this.placement)}`]:!0};return this.customClass&&(e[this.customClass]=!0),e},popupStyle(){return this.zIndex?`z-index: ${this.zIndex}`:""},triggerTarget(){return pn(this)}},watch:{show(e){this.showPopup=e||this.alwaysShow},showPopup(e,t){e^t&&(this.$emit("update:show",e),this.$nextTick(()=>this.onShowPopup(e)))}},mounted(){const{trigger:e,popup:t}=this.$refs;this.trigger==="focus"&&(this.focusEvents=this.addFocusEvents(this.triggerTarget??e)),this.hideWhenClickOutside&&!this.alwaysShow&&(this.closeEvents=Vt(window,{mouseup:n=>{var s;this.showPopup&&!t.contains(n.target)&&!e.contains(n.target)&&!((s=this.triggerTarget)!=null&&s.contains(n.target))&&(this.showPopup=!1)},blur:()=>{this.showPopup=!1}})),this.alwaysShow&&(this.showPopup=!0)},created(){this.showPopup=this.show},unmounted(){var e,t,n;(e=this.focusEvents)==null||e.remove(),(t=this.closeEvents)==null||t.remove(),(n=this.popupEvents)==null||n.remove()},methods:{updatePosition(){const{trigger:e,popup:t}=this.$refs;if(this.show&&t.offsetWidth===0){setTimeout(()=>this.updatePosition(),0);return}const n=this.triggerTarget??e,s=this.target==="popup"?e:t.firstElementChild;s&&(s.style.width=getComputedStyle(n).width);const o=n.getBoundingClientRect(),i=o.left+window.scrollX,r=o.top+window.scrollY,l=o.width,u=o.height,f=t.offsetWidth,p=t.offsetHeight;let[c,d]=this.popupPlacement.split("-")||[];if(this.keepInView){const V=window.innerWidth,j=window.innerHeight;c==="top"?r<p&&(c="bottom"):c==="bottom"?j-r-u<p&&(c="top"):c==="left"?i<f&&(c="right"):c==="right"&&V-i-l<f&&(c="left"),d==="top"?j-r<p&&(d="bottom"):d==="bottom"?r+u<p&&(d="top"):d==="left"?V-i<f&&(d="right"):d==="right"&&i+l<f&&(d="left")}let h=0,y=0;switch(c){case"top":y-=p;break;case"left":h-=f;break;case"right":h+=l;break;case"bottom":y+=u;break}switch(d){case"right":h-=f-l;break;case"bottom":y-=p-u;break}if(this.cover&&(c==="top"?y+=u:c==="bottom"&&(y-=u)),n!==e){const V=e.getBoundingClientRect();h+=i-V.left,y+=r-V.top}t.style.left=`${h}px`,t.style.top=`${y}px`},addFocusEvents(e){const t=e.querySelectorAll("input, textarea");let n;return Bs(Vt(t,{focus:()=>{this.showPopup=!0,clearTimeout(this.blurTimer)},blur:()=>{this.blurTimer=setTimeout(()=>{this.$refs.popup.matches(":focus-within")||(this.showPopup=!1)},0)}}),Vt(e,{mousedown:s=>{s.target.matches("input, textarea, button")||(s.preventDefault(),s.stopPropagation()),s.target.matches(".dito-button-clear")||(n=(this.triggerTarget??this.$refs.trigger).querySelector("input, textarea"),n&&!n.hasAttribute("readonly")?n.setAttribute("readonly","true"):n=null)},mouseup:s=>{n&&setTimeout(()=>{n.removeAttribute("readonly"),s.target.matches("input, textarea, button")||n.focus(),n=null},0)}}))},onShowPopup(e){var t;e?(this.trigger==="focus"&&(this.popupEvents=this.addFocusEvents(this.$refs.popup)),this.updatePosition()):((t=this.popupEvents)==null||t.remove(),this.popupEvents=null)},onClick(){this.disabled||(this.showPopup=!0)},onHover(e){this.disabled||(clearTimeout(this.mouseLeaveTimer),e?this.showPopup=!0:this.hideDelay?this.mouseLeaveTimer=setTimeout(()=>{this.showPopup=!1},this.hideDelay):this.showPopup=!1)}}},[["render",dr]]),pr=["id","type","name","title","disabled","readonly","autofocus","placeholder","autocomplete","aria-label"];function hr(e,t,n,s,o,i){return m(),w("div",{class:a.normalizeClass(["dito-input",i.classes])},[M(e.$slots,"before"),mt(v("input",ee({id:n.id,ref:"input","onUpdate:modelValue":t[0]||(t[0]=r=>o.currentValue=r),type:n.type,name:n.name,title:n.title,disabled:n.disabled,readonly:n.readonly,autofocus:n.autofocus,placeholder:n.placeholder,autocomplete:n.autocomplete,"aria-label":n.title},i.attributes),null,16,pr),[[Lo,o.currentValue]]),M(e.$slots,"after")],2)}const Ct=re({emits:["update:modelValue"],inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:null},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},title:{type:String,default:null},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},placeholder:{type:String,default:null},autocomplete:{type:String,default:"off"}},data(){return{currentValue:this.modelValue,hovering:!1,focused:!1}},computed:{classes(){return this.$attrs.class},attributes(){const{class:e,...t}=this.$attrs;return t},input(){return this.$refs.input},size(){const{size:e,min:t,max:n}=this.$attrs,s=o=>o!=null?`${o}`.length:0;return e||s(t)||s(n)||void 0}},watch:{modelValue(e,t){e!==t&&(this.currentValue=e)},currentValue(e){e!==this.modelValue&&this.$emit("update:modelValue",e)}},methods:{focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",hr]]);function gr(e,t,n,s,o,i){return m(),w("i",{class:a.normalizeClass(["dito-icon",{["dito-icon--"+n.name]:!0,"dito-icon--disabled":n.disabled}])},null,2)}const Tt=re({props:{name:{type:String,required:!0},disabled:{type:Boolean,default:!1}}},[["render",gr]]);function le(e,{start:t,end:n}){e!=null&&e.setSelectionRange&&(e.focus(),e.setSelectionRange(t,n))}function Ie(e){return e&&"selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:null}function mr(e,t,n,s,o,i){const r=Z("Icon"),l=Z("InputField"),u=Z("Calendar"),f=Z("Trigger");return m(),Ve(f,ee({class:"dito-date-picker",ref:"trigger",show:o.showPopup,"onUpdate:show":t[7]||(t[7]=p=>o.showPopup=p),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:B(()=>[e.$slots.trigger?M(e.$slots,"trigger",{key:0}):(m(),Ve(l,ee({key:1,class:["dito-date-picker-input",{"dito-focus":i.focused}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[1]||(t[1]=p=>i.currentText=p),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=p=>i.onFocus(!0)),onBlur:t[3]||(t[3]=p=>i.onFocus(!1)),onKeydown:i.onKeyDown,onMousedown:t[4]||(t[4]=Ae(p=>i.onMouseDown(!1),["stop"]))}),{before:B(()=>[M(e.$slots,"before")]),after:B(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Ae(p=>i.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),M(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:B(()=>[I(u,ee({class:"dito-date-picker-popup",ref:"calendar",modelValue:o.currentValue,"onUpdate:modelValue":t[5]||(t[5]=p=>o.currentValue=p)},{locale:n.locale,disabledDate:n.disabledDate},{onSelect:t[6]||(t[6]=p=>o.showPopup=!1)}),null,16,["modelValue"])]),_:3},16,["show"])}const js=re({components:{Trigger:hn,Calendar:Hs,InputField:Ct,Icon:Tt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({date:R.defaultFormats.date,time:!1})},disabledDate:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=pn(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=Xe(e,this.formatOptions);t&&(this.currentValue=t)}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},show(e){this.showPopup=e},showPopup(e,t){e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){var s;const{ver:t,enter:n}=Ot(e);if(t||n){e.preventDefault();const o=(s=Ie(this.input))==null?void 0:s.start,i=r=>kt(this.currentText,r,this.formatOptions);if(t&&!this.showPopup)this.showPopup=!0;else{const{calendar:r}=this.$refs;if(r){const{name:l,start:u}=i(o)||{};l&&r.navigate({step:t,enter:n,mode:l,update:!0})&&this.$nextTick(()=>le(this.input,i(u)))}}}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",mr]]),yr={class:"dito-time-picker-popup"},vr={class:"dito-time-picker-panel"},wr={class:"dito-time-picker-hour",ref:"hour"},_r=["onClick"],br={class:"dito-time-picker-panel"},Sr={class:"dito-time-picker-minute",ref:"minute"},Er=["onClick"],Dr={class:"dito-time-picker-panel"},Nr={class:"dito-time-picker-second",ref:"second"},Vr=["onClick"];function Or(e,t,n,s,o,i){const r=Z("Icon"),l=Z("InputField"),u=Z("Trigger");return m(),Ve(u,ee({class:"dito-time-picker",ref:"trigger",show:o.showPopup,"onUpdate:show":t[5]||(t[5]=f=>o.showPopup=f),trigger:"focus"},{transition:n.transition,placement:n.placement,disabled:n.disabled,target:n.target}),{trigger:B(()=>[e.$slots.trigger?M(e.$slots,"trigger",{key:0}):(m(),Ve(l,ee({key:1,class:["dito-time-picker-input",{"dito-focus":i.focused}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[1]||(t[1]=f=>i.currentText=f),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=f=>i.onFocus(!0)),onBlur:t[3]||(t[3]=f=>i.onFocus(!1)),onKeydown:i.onKeyDown,onMousedown:t[4]||(t[4]=Ae(f=>i.onMouseDown(!1),["stop"]))}),{before:B(()=>[M(e.$slots,"before")]),after:B(()=>[I(r,{name:"clock",disabled:n.disabled,onMousedown:t[0]||(t[0]=Ae(f=>i.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),M(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]))]),popup:B(()=>[v("div",yr,[v("div",vr,[v("ul",wr,[(m(),w(O,null,me(24,f=>(m(),w(O,null,[n.disabledHour(f-1)?J("",!0):(m(),w("li",{key:0,class:a.normalizeClass({selected:i.hour===f-1}),onClick:p=>i.hour=f-1},a.toDisplayString(i.leftPad(f-1)),11,_r))],64))),64))],512)]),v("div",br,[v("ul",Sr,[(m(),w(O,null,me(60,f=>(m(),w(O,null,[n.disabledMinute(f-1)?J("",!0):(m(),w("li",{key:0,class:a.normalizeClass({selected:i.minute===f-1}),onClick:p=>i.minute=f-1},a.toDisplayString(i.leftPad(f-1)),11,Er))],64))),64))],512)]),v("div",Dr,[v("ul",Nr,[(m(),w(O,null,me(60,f=>(m(),w(O,null,[n.disabledSecond(f-1)?J("",!0):(m(),w("li",{key:0,class:a.normalizeClass({selected:i.second===f-1}),onClick:p=>i.second=f-1},a.toDisplayString(i.leftPad(f-1)),11,Vr))],64))),64))],512)])])]),_:3},16,["show"])}const Ks=re({components:{Trigger:hn,InputField:Ct,Icon:Tt},emits:["update:modelValue","update:show","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placement:{type:String,default:"bottom-left"},placeholder:{type:String,default:null},show:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},target:{type:[String,HTMLElement],default:"trigger"},locale:{type:String,default:"en-US"},format:{type:Object,default:()=>({time:R.defaultFormats.time,date:!1})},disabledHour:{type:Function,default:()=>!1},disabledMinute:{type:Function,default:()=>!1},disabledSecond:{type:Function,default:()=>!1}},data(){return{currentValue:this.modelValue,showPopup:this.show,inputFocused:!1,ignoreNextChange:!1}},computed:{focused(){return this.inputFocused||this.showPopup},input(){var e;return(e=pn(this))==null?void 0:e.querySelector("input")},formatOptions(){return{locale:this.locale,...this.format}},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=Xe(e,this.formatOptions);t&&(this.currentValue=t)}},currentDate(){return this.currentValue||$e(new Date,{hour:0,minute:0,second:0,millisecond:0})},hour:{get(){return this.currentDate.getHours()},set(e){this.setTime({hour:e})}},minute:{get(){return this.currentDate.getMinutes()},set(e){this.setTime({minute:e})}},second:{get(){return this.currentDate.getSeconds()},set(e){this.setTime({second:e})}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e,this.scrollAll(!0))},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e),this.scrollAll(!0))},currentText(){const{input:e}=this,t=Ie(e);this.focused&&!this.ignoreNextChange&&t.start===t.end&&this.$nextTick(()=>le(e,t)),this.ignoreNextChange=!1},show(e){this.showPopup=e},showPopup(e,t){e&&this.scrollAll(!1),e^t&&this.$emit("update:show",e)},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{leftPad(e){return("0"+e).slice(-2)},setTime(e){this.currentValue=$e(this.currentDate,{...e,millisecond:0})},scrollAll(e){const t=(n,s)=>{const o=this.$refs[n];if(o){const i=o.scrollHeight/(o.childElementCount+6),r=Math.round(s*i),l=Math.abs(o.scrollTop-r);o.scrollTo({top:r,behavior:e&&l<100?"smooth":"auto"})}};this.$nextTick(()=>{t("hour",this.hour),t("minute",this.minute),t("second",this.second)})},onFocus(e){this.inputFocused=e,this.showPopup=e},onKeyDown(e){const{input:t}=this,n=Ie(t),{ver:s,enter:o}=Ot(e);if(s||o){e.preventDefault();const i=r=>kt(this.currentText,r,this.formatOptions);if(s)if(!this.showPopup)this.showPopup=!0;else{const{name:r,start:l}=i(n.start)||{};if(r){const u=this[r]+s,f=this.$refs[r].childElementCount;this[r]=u<0?u+f:u>=f?u-f:u,this.ignoreNextChange=!0,this.$nextTick(()=>le(t,i(l)))}}else o&&(this.showPopup=!1)}else if(n.start===n.end){const{value:i}=t;let r=n.start;const l=u=>!isNaN(parseInt(u,10));if(e.key.length===1)if(l(e.key)&&r<i.length)i[r]===":"&&l(i[r-1])&&l(i[r-2])&&r++,l(i[r])&&(l(i[r+1])||l(i[r-1]))&&(t.value=i.slice(0,r)+i.slice(r+1),le(t,{start:r,end:r}));else{const u=R.format(this.currentValue,this.formatOptions).length;i.length===u?e.preventDefault():i.length>u&&(t.value=i.slice(0,u),le(t,n),e.preventDefault())}else e.key==="Backspace"&&(r===1||[" ",":"].includes(i[r-2]))&&(r===i.length||i[r]===":"?(r--,t.value=i.slice(0,r)+((i[r-1]??"")+"00")+i.slice(r+1),le(t,{start:r,end:r})):l(i[r])&&!l(+i[r+1])&&(t.value=i.slice(0,r)+"0"+i.slice(r),le(t,{start:r,end:r})))}},onMouseDown(e){this.showPopup=!this.disabled&&(!e||!this.showPopup),this.showPopup&&this.focus()},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Or]]),Cr={class:"dito-date-time-picker",ref:"picker"};function Tr(e,t,n,s,o,i){const r=Z("Icon"),l=Z("InputField"),u=Z("DatePicker"),f=Z("TimePicker");return m(),w("div",Cr,[v("div",{class:a.normalizeClass(["dito-date-time-picker__inner",{"dito-focus":i.focused}])},[I(l,ee({class:["dito-date-time-picker__input",{"dito-focus":i.focused}],ref:"input",modelValue:i.currentText,"onUpdate:modelValue":t[1]||(t[1]=p=>i.currentText=p),type:"text"},{placeholder:n.placeholder,disabled:n.disabled,...e.$attrs},{onFocus:t[2]||(t[2]=p=>i.onFocus(!0)),onBlur:t[3]||(t[3]=p=>i.onFocus(!1)),onKeydown:i.onKeyDown,onMousedown:t[4]||(t[4]=Ae(p=>i.onMouseDown(!1),["stop"]))}),{before:B(()=>[M(e.$slots,"before")]),after:B(()=>[I(r,{name:"calendar",disabled:n.disabled,onMousedown:t[0]||(t[0]=Ae(p=>i.onMouseDown(!0),["prevent"]))},null,8,["disabled"]),M(e.$slots,"after")]),_:3},16,["modelValue","class","onKeydown"]),I(u,ee({ref:"date",modelValue:o.currentValue,"onUpdate:modelValue":t[5]||(t[5]=p=>o.currentValue=p),show:o.showDate,"onUpdate:show":t[6]||(t[6]=p=>o.showDate=p),placement:"bottom-left",target:e.$refs.picker},i.attributes),{trigger:B(()=>t[9]||(t[9]=[])),_:1},16,["modelValue","show","target"]),I(f,ee({ref:"time",modelValue:o.currentValue,"onUpdate:modelValue":t[7]||(t[7]=p=>o.currentValue=p),show:o.showTime,"onUpdate:show":t[8]||(t[8]=p=>o.showTime=p),placement:"bottom-right",target:e.$refs.picker},i.attributes),{trigger:B(()=>t[10]||(t[10]=[])),_:1},16,["modelValue","show","target"])],2)],512)}const xr=re({components:{InputField:Ct,DatePicker:js,TimePicker:Ks,Icon:Tt},emits:["update:modelValue","change","focus","blur"],inheritAttrs:!1,props:{modelValue:{type:Date,default:null},transition:{type:String,default:"slide"},placeholder:{type:String,default:null},disabled:{type:Boolean,default:!1},locale:{type:String,default:"en-US"},format:{type:Object,default:null}},data(){return{currentValue:this.modelValue,showDate:!1,showTime:!1,inputFocused:!1,dateFocused:!1,timeFocused:!1,closedMode:null}},computed:{attributes(){const{transition:e,disabled:t,locale:n,formatOptions:s}=this;return{transition:e,disabled:t,locale:n,format:s}},focused(){return this.inputFocused||this.showDate||this.showTime},input(){return this.$refs.input.input},formatOptions(){return R.assignDeeply({locale:this.locale,time:R.defaultFormats.time,date:R.defaultFormats.date},{date:{month:"short",format:(e,t,n)=>{var s,o,i;return t==="literal"&&/\bat\b/.test(e)?", ":((i=(o=(s=this.format)==null?void 0:s.date)==null?void 0:o.format)==null?void 0:i.call(o,e,t,n))??e}}},this.format)},timeIndex(){var t;const e=this.currentText;if(e){const n=(t=e.match(/([\S]+\s*)$/))==null?void 0:t[1];if(n)return e.length-n.length}return null},currentText:{get(){return R.format(this.currentValue,this.formatOptions)||""},set(e){const t=Xe(e,this.formatOptions);if(t){const n=Ie(this.input);this.currentValue=t,this.$nextTick(()=>le(this.input,n))}}}},watch:{modelValue(e,t){+e!=+t&&(this.currentValue=e)},currentValue(e){+e!=+this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))},focused(e,t){e^t&&this.$emit(e?"focus":"blur")}},methods:{onFocus(e){this.inputFocused=e,e?this.updatePopups():(this.showDate=!1,this.showTime=!1)},onMouseDown(e){e&&(this.showDate||this.showTime)?(this.showDate=!1,this.showTime=!1):this.disabled||(this.focus(),requestAnimationFrame(()=>this.updatePopups()))},onKeyDown(e){const t=this.getMode(e);this.$refs[t].onKeyDown(e),e.defaultPrevented?this.closedMode=t:t!==this.closedMode&&this.updatePopups(t)},getMode(e=null){const{start:t}=Ie(this.input),{hor:n}=Ot(e);return this.timeIndex===null||t+n<this.timeIndex?"date":"time"},updatePopups(e=this.getMode()){e&&(this.closedMode=null),this.showDate=e==="date",this.showTime=e==="time"},focus(){this.input.focus()},blur(){this.input.blur()}}},[["render",Tr]]),Pr={class:"dito-pagination"},Mr={key:0,class:"dito-pagination-total"},kr={key:1,class:"dito-buttons dito-buttons-round"},Ar=["disabled","onClick"],Ir={key:0};function Fr(e,t,n,s,o,i){return m(),w("div",Pr,[n.showTotal?(m(),w("div",Mr,[n.total>0?(m(),w(O,{key:0},[Et(a.toDisplayString(i.first)+" – "+a.toDisplayString(i.last)+" / "+a.toDisplayString(n.total),1)],64)):J("",!0)])):J("",!0),i.numPages>1?(m(),w("div",kr,[(m(!0),w(O,null,me(i.buttons,r=>(m(),w("button",{class:a.normalizeClass(["dito-button",i.getButtonClasses(r)]),disabled:r.disabled,onClick:l=>i.onClickButton(r)},[r.text?(m(),w("span",Ir,a.toDisplayString(r.text),1)):J("",!0)],10,Ar))),256))])):J("",!0)])}const $r=re({emits:["update:page"],props:{total:{type:Number,default:0},page:{type:Number,default:1},pageSize:{type:Number,default:10},showTotal:{type:Boolean,default:!0}},data(){return{showPrev:!0,showNext:!0,currentPage:this.page}},computed:{first(){return(this.currentPage-1)*this.pageSize+1},last(){return Math.min(this.first+this.pageSize-1,this.total)},numPages(){return Math.ceil(this.total/this.pageSize)},buttons(){const{showPrev:e,showNext:t,currentPage:n,numPages:s}=this,o=e+t+1;let i=1,r=1;s<=o?r=s:n<=e+1?r=o:n>=s-t?(r=s,i=s-o+1):(i=n-e,r=n+t);const l=[];l.push({index:n-1,type:"prev",disabled:n<=1}),i>=2&&l.push({index:1,text:1}),i>2&&l.push({index:Math.max(1,n-10),type:"ellipsis-prev"});for(let u=i;u<=r;u++)l.push({index:u,text:u,active:u===n});return r<s-1&&l.push({index:Math.min(s,n+10),type:"ellipsis-next"}),r<=s-1&&l.push({index:s,text:s}),l.push({index:n+1,type:"next",disabled:n>=s}),l}},watch:{page(e){this.currentPage=e},pageSize(){this.currentPage>this.numPages&&(this.currentPage=this.numPages)},currentPage(e,t){e!==t&&this.$emit("update:page",e)}},created(){this.currentPage=this.page},methods:{getButtonClasses(e){const t={"dito-selected":e.active};return e.type&&(t[`dito-button-${e.type}`]=!0),t},onClickButton(e){e.index&&!e.disabled&&e.index!==this.currentPage&&(this.currentPage=e.index)}}},[["render",Fr]]),Rr={class:"dito-switch-pane"},Lr=["id","name","disabled"],Hr={key:0,class:"dito-switch-label"};function Br(e,t,n,s,o,i){return m(),w("div",{class:a.normalizeClass(["dito-switch",i.classes]),style:a.normalizeStyle(i.styles)},[v("div",Rr,[mt(v("input",ee({id:n.id,ref:"input"},i.attributes,{"onUpdate:modelValue":t[0]||(t[0]=r=>o.checked=r),type:"checkbox",name:n.name,disabled:n.disabled}),null,16,Lr),[[Is,o.checked]]),t[1]||(t[1]=v("div",{class:"dito-switch-button"},null,-1)),n.labels?(m(),w("span",Hr,[o.checked?M(e.$slots,"checked",{key:0},()=>[Et(a.toDisplayString(n.labels.checked||"on"),1)]):M(e.$slots,"unchecked",{key:1},()=>[Et(a.toDisplayString(n.labels.unchecked||"off"),1)])])):J("",!0)])],6)}const zr=re({emits:["update:modelValue","change"],inheritAttrs:!1,props:{modelValue:{type:Boolean,default:!1},id:{type:String,default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},labels:{type:[Object,Boolean],default:!1}},data(){return{checked:this.modelValue}},computed:{classes(){return[this.$attrs.class,{"dito-checked":this.checked,"dito-disabled":this.disabled}]},styles(){const{labels:{checked:e,unchecked:t}={}}=this,n=Math.max(0,e==null?void 0:e.length,t==null?void 0:t.length);return{"--switch-width":n?`${n*1.5}rem`:null}},attributes(){const{class:e,...t}=this.$attrs;return t}},watch:{modelValue(e){this.checked=e},checked(e){e!==this.modelValue&&(this.$emit("update:modelValue",e),this.$emit("change",e))}},methods:{focus(){this.$refs.input.focus()}}},[["render",Br]]);function Us({enabled:e},{slots:t}){return e?Ss(Vs,Kr,t):t.default()}Us.props={enabled:{type:Boolean,default:!0}};const jr=Us,Fe=(e,t)=>Object.assign(e.style,t),xt=e=>setTimeout(e,0),Ys=e=>getComputedStyle(e).height,Kr={name:"dito-height",onAfterEnter(e){xt(()=>Fe(e,{height:null}))},onEnter(e){const{width:t}=getComputedStyle(e);Fe(e,{width:t,position:"absolute",visibility:"hidden",height:"auto"}),xt(()=>{const{height:n}=getComputedStyle(e);Fe(e,{width:null,position:null,visibility:null,height:0}),Ys(e),xt(()=>Fe(e,{height:n}))})},onLeave(e){const{height:t}=getComputedStyle(e);Fe(e,{height:t}),Ys(e),xt(()=>Fe(e,{height:0}))}};function Ws(e){return e&&R.asArray(e).some(t=>t.type!==W)}function Ur(e,t={}){return e=R.isString(e)?eo()[e]:e,Ws(e==null?void 0:e(t))}function Yr(e){return Fn({value:e})}D.Calendar=Hs,D.DatePicker=js,D.DateTimePicker=xr,D.Icon=Tt,D.InputField=Ct,D.Pagination=$r,D.SwitchButton=zr,D.TimePicker=Ks,D.TransitionHeight=jr,D.Trigger=hn,D.addEvents=Vt,D.alterDate=$e,D.combineEvents=Bs,D.describeDate=Mt,D.getDatePartAtPosition=kt,D.getKey=zs,D.getKeyNavigation=Ot,D.getSelection=Ie,D.hasSlotContent=Ur,D.hasVNodeContent=Ws,D.parseDate=Xe,D.raw=Yr,D.setSelection=le,Object.defineProperty(D,Symbol.toStringTag,{value:"Module"})});
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl0by11aS51bWQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlscy9kYXRlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B2dWUvcmVhY3Rpdml0eS9kaXN0L3JlYWN0aXZpdHkuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWNvcmUvZGlzdC9ydW50aW1lLWNvcmUuZXNtLWJ1bmRsZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvQHZ1ZS9ydW50aW1lLWRvbS9kaXN0L3J1bnRpbWUtZG9tLmVzbS1idW5kbGVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS9kaXN0L3Z1ZS5ydW50aW1lLmVzbS1idW5kbGVyLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvQ2FsZW5kYXIudnVlIiwiLi4vc3JjL3V0aWxzL2V2ZW50LmpzIiwiLi4vc3JjL3V0aWxzL3RyaWdnZXIuanMiLCIuLi9zcmMvY29tcG9uZW50cy9UcmlnZ2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0lucHV0RmllbGQudnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvSWNvbi52dWUiLCIuLi9zcmMvdXRpbHMvc2VsZWN0aW9uLmpzIiwiLi4vc3JjL2NvbXBvbmVudHMvRGF0ZVBpY2tlci52dWUiLCIuLi9zcmMvY29tcG9uZW50cy9UaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL0RhdGVUaW1lUGlja2VyLnZ1ZSIsIi4uL3NyYy9jb21wb25lbnRzL1BhZ2luYXRpb24udnVlIiwiLi4vc3JjL2NvbXBvbmVudHMvU3dpdGNoQnV0dG9uLnZ1ZSIsIi4uL3NyYy90cmFuc2l0aW9ucy9UcmFuc2l0aW9uSGVpZ2h0LnZ1ZSIsIi4uL3NyYy91dGlscy92dWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGF0ZShkYXRlKSB7XG4gIHJldHVybiB7XG4gICAgeWVhcjogZGF0ZT8uZ2V0RnVsbFllYXIoKSA/PyAwLFxuICAgIG1vbnRoOiBkYXRlPy5nZXRNb250aCgpID8/IDAsXG4gICAgZGF5OiBkYXRlPy5nZXREYXRlKCkgPz8gMCxcbiAgICBob3VyOiBkYXRlPy5nZXRIb3VycygpID8/IDAsXG4gICAgbWludXRlOiBkYXRlPy5nZXRNaW51dGVzKCkgPz8gMCxcbiAgICBzZWNvbmQ6IGRhdGU/LmdldFNlY29uZHMoKSA/PyAwLFxuICAgIG1pbGxpc2Vjb25kOiBkYXRlPy5nZXRNaWxsaXNlY29uZHMoKSA/PyAwXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsdGVyRGF0ZShkYXRlLCBvdmVycmlkZXMgPSB7fSkge1xuICByZXR1cm4gbmV3IERhdGUoLi4uT2JqZWN0LnZhbHVlcyh7IC4uLmRlc2NyaWJlRGF0ZShkYXRlKSwgLi4ub3ZlcnJpZGVzIH0pKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKHN0cmluZywge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCB0aW1lRGVmYXVsdCA9IHRpbWUgPyBudWxsIDogMFxuICBsZXQgW1xuICAgIGRheSxcbiAgICBzZXAxLFxuICAgIG1vbnRoLFxuICAgIHNlcDIsXG4gICAgeWVhcixcbiAgICAsXG4gICAgaG91ciA9IHRpbWVEZWZhdWx0LFxuICAgICxcbiAgICBtaW51dGUgPSB0aW1lRGVmYXVsdCxcbiAgICAsXG4gICAgc2Vjb25kID0gdGltZURlZmF1bHQsXG4gICAgLFxuICAgIG1pbGxpc2Vjb25kID0gdGltZURlZmF1bHRcbiAgXSA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuICBpZiAoeWVhciAmJiB5ZWFyLmxlbmd0aCA+PSA0KSB7XG4gICAgaWYgKGxvY2FsZSA9PT0gJ2VuLVVTJyAmJiBzZXAxID09PSAnLycgJiYgc2VwMiA9PT0gJy8nKSB7XG4gICAgICAvLyBBbWVyaWNhbiBmb3JtYXQ6IE1NL0REL1lZWVlcbiAgICAgIDtbZGF5LCBtb250aF0gPSBbbW9udGgsIGRheV1cbiAgICB9XG4gICAgbW9udGggPSBnZXRNb250aEluZGV4KG1vbnRoLCB7IGxvY2FsZSB9KVxuICAgIGNvbnN0IGlzVmFsaWRUaW1lUGFydCA9IHBhcnQgPT4gcGFydCA9PT0gbnVsbCB8fCBwYXJ0Lmxlbmd0aCA9PT0gMlxuICAgIGlmIChcbiAgICAgIG1vbnRoICE9PSBudWxsICYmIChcbiAgICAgICAgIXRpbWUgfHwgKFxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChob3VyKSAmJlxuICAgICAgICAgIGlzVmFsaWRUaW1lUGFydChtaW51dGUpICYmXG4gICAgICAgICAgaXNWYWxpZFRpbWVQYXJ0KHNlY29uZClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKFxuICAgICAgICAreWVhcixcbiAgICAgICAgK21vbnRoLFxuICAgICAgICArZGF5LFxuICAgICAgICAraG91cixcbiAgICAgICAgK21pbnV0ZSxcbiAgICAgICAgK3NlY29uZCxcbiAgICAgICAgK21pbGxpc2Vjb25kXG4gICAgICApXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRlUGFydEF0UG9zaXRpb24oc3RyaW5nLCBwb3NpdGlvbiwge1xuICBsb2NhbGUgPSAnZW4tVVMnLFxuICBkYXRlID0gdHJ1ZSxcbiAgdGltZSA9IHRydWVcbn0gPSB7fSkge1xuICBjb25zdCBwYXJ0cyA9IGdldERhdGVQYXJ0cyhzdHJpbmcsIHsgZGF0ZSwgdGltZSB9KVxuXG4gIGNvbnN0IGdldFBvc2l0aW9uID0gKHBvc2l0aW9uLCBsZW5ndGggPSBwYXJ0cy5sZW5ndGgpID0+IHtcbiAgICBsZXQgcG9zID0gMFxuICAgIGxldCBpbmRleCA9IDBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5tb2RpZmllZC1sb29wLWNvbmRpdGlvblxuICAgIHdoaWxlICgocG9zaXRpb24gPT09IG51bGwgfHwgcG9zIDw9IHBvc2l0aW9uKSAmJiBpbmRleCA8IGxlbmd0aCkge1xuICAgICAgcG9zICs9IHBhcnRzW2luZGV4KytdPy5sZW5ndGggPz8gMFxuICAgIH1cbiAgICByZXR1cm4geyBwb3NpdGlvbjogcG9zLCBpbmRleCB9XG4gIH1cblxuICAvLyBUaW1lIHN0YXJ0cyBhdCBpbmRleCA2LCBkdWUgdG8gdGhlIHNlcGFyYXRvciBhZnRlciB0aGUgZGF0ZS5cbiAgY29uc3Qgb2Zmc2V0ID0gIWRhdGUgPyBnZXRQb3NpdGlvbihudWxsLCA2KS5wb3NpdGlvbiA6IDBcbiAgcG9zaXRpb24gKz0gb2Zmc2V0XG5cbiAgbGV0IHsgaW5kZXggfSA9IGdldFBvc2l0aW9uKHBvc2l0aW9uKVxuXG4gIGNvbnN0IGlzVVMgPSBsb2NhbGUgPT09ICdlbi1VUydcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIGlzVVMgPyAnbW9udGgnIDogJ2RheScsXG4gICAgbnVsbCxcbiAgICBpc1VTID8gJ2RheScgOiAnbW9udGgnLFxuICAgIG51bGwsXG4gICAgJ3llYXInLFxuICAgIG51bGwsXG4gICAgJ2hvdXInLFxuICAgIG51bGwsXG4gICAgJ21pbnV0ZScsXG4gICAgbnVsbCxcbiAgICAnc2Vjb25kJyxcbiAgICBudWxsLFxuICAgICdtaWxsaXNlY29uZCdcbiAgXVxuICB3aGlsZSAoaW5kZXgtLSkge1xuICAgIGlmICh2YWx1ZXNbaW5kZXhdKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGdldFBvc2l0aW9uKG51bGwsIGluZGV4KS5wb3NpdGlvbiAtIG9mZnNldFxuICAgICAgY29uc3QgZW5kID0gc3RhcnQgKyBwYXJ0c1tpbmRleF0ubGVuZ3RoXG4gICAgICByZXR1cm4geyBuYW1lOiB2YWx1ZXNbaW5kZXhdLCBzdGFydCwgZW5kIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZVBhcnRzKHN0cmluZywgeyBkYXRlID0gdHJ1ZSwgdGltZSA9IHRydWUgfSA9IHt9KSB7XG4gIGNvbnN0IHBhcnRzID0gc3RyaW5nPy5zcGxpdCgvKFtcXHMuLDovXSspLykgfHwgW11cbiAgaWYgKCFkYXRlKSB7XG4gICAgLy8gQWRkIGR1bW15IGRhdGUgcGFydHMgdG8gbWFrZSBzdXJlIHdlIGdldCBhIHRpbWUtb25seSBkYXRlLlxuICAgIHBhcnRzLnVuc2hpZnQoJzEnLCAnLicsICcxJywgJy4nLCAnMjAwMCcsICcgJylcbiAgfVxuICBpZiAoIXRpbWUgJiYgcGFydHMubGVuZ3RoID4gNSkge1xuICAgIHBhcnRzLmxlbmd0aCA9IDVcbiAgfVxuICByZXR1cm4gcGFydHNcbn1cblxuZnVuY3Rpb24gZ2V0TW9udGhJbmRleChtb250aCwgeyBsb2NhbGUgPSAnZW4tVVMnIH0gPSB7fSkge1xuICBjb25zdCB2YWx1ZSA9ICttb250aFxuICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZSAtIDFcbiAgfVxuICBjb25zdCBtYXRjaCA9IG1vbnRoLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChtYXRjaC5sZW5ndGggPCAzKSByZXR1cm4gbnVsbFxuICBjb25zdCBzaG9ydEZvcm1hdCA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JyB9KVxuICBjb25zdCBsb25nRm9ybWF0ID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCB7IG1vbnRoOiAnbG9uZycgfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDIwMDAsIGksIDEpXG4gICAgaWYgKFxuICAgICAgc2hvcnRGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaCkgfHxcbiAgICAgIGxvbmdGb3JtYXQuZm9ybWF0KGRhdGUpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaClcbiAgICApIHtcbiAgICAgIHJldHVybiBpXG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsXG59XG4iLCIvKipcbiogQHZ1ZS9yZWFjdGl2aXR5IHYzLjUuNlxuKiAoYykgMjAxOC1wcmVzZW50IFl1eGkgKEV2YW4pIFlvdSBhbmQgVnVlIGNvbnRyaWJ1dG9yc1xuKiBAbGljZW5zZSBNSVRcbioqL1xuaW1wb3J0IHsgaGFzQ2hhbmdlZCwgZXh0ZW5kLCBpc0FycmF5LCBpc0ludGVnZXJLZXksIGlzU3ltYm9sLCBpc01hcCwgaGFzT3duLCBpc09iamVjdCwgbWFrZU1hcCwgY2FwaXRhbGl6ZSwgdG9SYXdUeXBlLCBkZWYsIGlzRnVuY3Rpb24sIEVNUFRZX09CSiwgaXNTZXQsIGlzUGxhaW5PYmplY3QsIE5PT1AsIHJlbW92ZSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuZnVuY3Rpb24gd2Fybihtc2csIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKGBbVnVlIHdhcm5dICR7bXNnfWAsIC4uLmFyZ3MpO1xufVxuXG5sZXQgYWN0aXZlRWZmZWN0U2NvcGU7XG5jbGFzcyBFZmZlY3RTY29wZSB7XG4gIGNvbnN0cnVjdG9yKGRldGFjaGVkID0gZmFsc2UpIHtcbiAgICB0aGlzLmRldGFjaGVkID0gZGV0YWNoZWQ7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmNsZWFudXBzID0gW107XG4gICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnBhcmVudCA9IGFjdGl2ZUVmZmVjdFNjb3BlO1xuICAgIGlmICghZGV0YWNoZWQgJiYgYWN0aXZlRWZmZWN0U2NvcGUpIHtcbiAgICAgIHRoaXMuaW5kZXggPSAoYWN0aXZlRWZmZWN0U2NvcGUuc2NvcGVzIHx8IChhY3RpdmVFZmZlY3RTY29wZS5zY29wZXMgPSBbXSkpLnB1c2goXG4gICAgICAgIHRoaXNcbiAgICAgICkgLSAxO1xuICAgIH1cbiAgfVxuICBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgdGhpcy5faXNQYXVzZWQgPSB0cnVlO1xuICAgICAgbGV0IGksIGw7XG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuc2NvcGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuc2NvcGVzW2ldLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmVmZmVjdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWZmZWN0c1tpXS5wYXVzZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVzdW1lcyB0aGUgZWZmZWN0IHNjb3BlLCBpbmNsdWRpbmcgYWxsIGNoaWxkIHNjb3BlcyBhbmQgZWZmZWN0cy5cbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBpZiAodGhpcy5faXNQYXVzZWQpIHtcbiAgICAgICAgdGhpcy5faXNQYXVzZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGksIGw7XG4gICAgICAgIGlmICh0aGlzLnNjb3Blcykge1xuICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLnNjb3Blcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuc2NvcGVzW2ldLnJlc3VtZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5lZmZlY3RzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuZWZmZWN0c1tpXS5yZXN1bWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBydW4oZm4pIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlKSB7XG4gICAgICBjb25zdCBjdXJyZW50RWZmZWN0U2NvcGUgPSBhY3RpdmVFZmZlY3RTY29wZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhY3RpdmVFZmZlY3RTY29wZSA9IGN1cnJlbnRFZmZlY3RTY29wZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oYGNhbm5vdCBydW4gYW4gaW5hY3RpdmUgZWZmZWN0IHNjb3BlLmApO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9uKCkge1xuICAgIGFjdGl2ZUVmZmVjdFNjb3BlID0gdGhpcztcbiAgfVxuICAvKipcbiAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gbm9uLWRldGFjaGVkIHNjb3Blc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG9mZigpIHtcbiAgICBhY3RpdmVFZmZlY3RTY29wZSA9IHRoaXMucGFyZW50O1xuICB9XG4gIHN0b3AoZnJvbVBhcmVudCkge1xuICAgIGlmICh0aGlzLl9hY3RpdmUpIHtcbiAgICAgIGxldCBpLCBsO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuZWZmZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcy5lZmZlY3RzW2ldLnN0b3AoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDAsIGwgPSB0aGlzLmNsZWFudXBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB0aGlzLmNsZWFudXBzW2ldKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zY29wZXMpIHtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IHRoaXMuc2NvcGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgIHRoaXMuc2NvcGVzW2ldLnN0b3AodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5kZXRhY2hlZCAmJiB0aGlzLnBhcmVudCAmJiAhZnJvbVBhcmVudCkge1xuICAgICAgICBjb25zdCBsYXN0ID0gdGhpcy5wYXJlbnQuc2NvcGVzLnBvcCgpO1xuICAgICAgICBpZiAobGFzdCAmJiBsYXN0ICE9PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuc2NvcGVzW3RoaXMuaW5kZXhdID0gbGFzdDtcbiAgICAgICAgICBsYXN0LmluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wYXJlbnQgPSB2b2lkIDA7XG4gICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdFNjb3BlKGRldGFjaGVkKSB7XG4gIHJldHVybiBuZXcgRWZmZWN0U2NvcGUoZGV0YWNoZWQpO1xufVxuZnVuY3Rpb24gZ2V0Q3VycmVudFNjb3BlKCkge1xuICByZXR1cm4gYWN0aXZlRWZmZWN0U2NvcGU7XG59XG5mdW5jdGlvbiBvblNjb3BlRGlzcG9zZShmbiwgZmFpbFNpbGVudGx5ID0gZmFsc2UpIHtcbiAgaWYgKGFjdGl2ZUVmZmVjdFNjb3BlKSB7XG4gICAgYWN0aXZlRWZmZWN0U2NvcGUuY2xlYW51cHMucHVzaChmbik7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhZmFpbFNpbGVudGx5KSB7XG4gICAgd2FybihcbiAgICAgIGBvblNjb3BlRGlzcG9zZSgpIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBlZmZlY3Qgc2NvcGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoLmBcbiAgICApO1xuICB9XG59XG5cbmxldCBhY3RpdmVTdWI7XG5jb25zdCBFZmZlY3RGbGFncyA9IHtcbiAgXCJBQ1RJVkVcIjogMSxcbiAgXCIxXCI6IFwiQUNUSVZFXCIsXG4gIFwiUlVOTklOR1wiOiAyLFxuICBcIjJcIjogXCJSVU5OSU5HXCIsXG4gIFwiVFJBQ0tJTkdcIjogNCxcbiAgXCI0XCI6IFwiVFJBQ0tJTkdcIixcbiAgXCJOT1RJRklFRFwiOiA4LFxuICBcIjhcIjogXCJOT1RJRklFRFwiLFxuICBcIkRJUlRZXCI6IDE2LFxuICBcIjE2XCI6IFwiRElSVFlcIixcbiAgXCJBTExPV19SRUNVUlNFXCI6IDMyLFxuICBcIjMyXCI6IFwiQUxMT1dfUkVDVVJTRVwiLFxuICBcIlBBVVNFRFwiOiA2NCxcbiAgXCI2NFwiOiBcIlBBVVNFRFwiXG59O1xuY29uc3QgcGF1c2VkUXVldWVFZmZlY3RzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG5jbGFzcyBSZWFjdGl2ZUVmZmVjdCB7XG4gIGNvbnN0cnVjdG9yKGZuKSB7XG4gICAgdGhpcy5mbiA9IGZuO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZGVwcyA9IHZvaWQgMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmRlcHNUYWlsID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZmxhZ3MgPSAxIHwgNDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLm5leHQgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5jbGVhbnVwID0gdm9pZCAwO1xuICAgIHRoaXMuc2NoZWR1bGVyID0gdm9pZCAwO1xuICAgIGlmIChhY3RpdmVFZmZlY3RTY29wZSAmJiBhY3RpdmVFZmZlY3RTY29wZS5hY3RpdmUpIHtcbiAgICAgIGFjdGl2ZUVmZmVjdFNjb3BlLmVmZmVjdHMucHVzaCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5mbGFncyB8PSA2NDtcbiAgfVxuICByZXN1bWUoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgJiA2NCkge1xuICAgICAgdGhpcy5mbGFncyAmPSB+NjQ7XG4gICAgICBpZiAocGF1c2VkUXVldWVFZmZlY3RzLmhhcyh0aGlzKSkge1xuICAgICAgICBwYXVzZWRRdWV1ZUVmZmVjdHMuZGVsZXRlKHRoaXMpO1xuICAgICAgICB0aGlzLnRyaWdnZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbm90aWZ5KCkge1xuICAgIGlmICh0aGlzLmZsYWdzICYgMiAmJiAhKHRoaXMuZmxhZ3MgJiAzMikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEodGhpcy5mbGFncyAmIDgpKSB7XG4gICAgICBiYXRjaCh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcnVuKCkge1xuICAgIGlmICghKHRoaXMuZmxhZ3MgJiAxKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICB9XG4gICAgdGhpcy5mbGFncyB8PSAyO1xuICAgIGNsZWFudXBFZmZlY3QodGhpcyk7XG4gICAgcHJlcGFyZURlcHModGhpcyk7XG4gICAgY29uc3QgcHJldkVmZmVjdCA9IGFjdGl2ZVN1YjtcbiAgICBjb25zdCBwcmV2U2hvdWxkVHJhY2sgPSBzaG91bGRUcmFjaztcbiAgICBhY3RpdmVTdWIgPSB0aGlzO1xuICAgIHNob3VsZFRyYWNrID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuZm4oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYWN0aXZlU3ViICE9PSB0aGlzKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJBY3RpdmUgZWZmZWN0IHdhcyBub3QgcmVzdG9yZWQgY29ycmVjdGx5IC0gdGhpcyBpcyBsaWtlbHkgYSBWdWUgaW50ZXJuYWwgYnVnLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjbGVhbnVwRGVwcyh0aGlzKTtcbiAgICAgIGFjdGl2ZVN1YiA9IHByZXZFZmZlY3Q7XG4gICAgICBzaG91bGRUcmFjayA9IHByZXZTaG91bGRUcmFjaztcbiAgICAgIHRoaXMuZmxhZ3MgJj0gfjI7XG4gICAgfVxuICB9XG4gIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgJiAxKSB7XG4gICAgICBmb3IgKGxldCBsaW5rID0gdGhpcy5kZXBzOyBsaW5rOyBsaW5rID0gbGluay5uZXh0RGVwKSB7XG4gICAgICAgIHJlbW92ZVN1YihsaW5rKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVwcyA9IHRoaXMuZGVwc1RhaWwgPSB2b2lkIDA7XG4gICAgICBjbGVhbnVwRWZmZWN0KHRoaXMpO1xuICAgICAgdGhpcy5vblN0b3AgJiYgdGhpcy5vblN0b3AoKTtcbiAgICAgIHRoaXMuZmxhZ3MgJj0gfjE7XG4gICAgfVxuICB9XG4gIHRyaWdnZXIoKSB7XG4gICAgaWYgKHRoaXMuZmxhZ3MgJiA2NCkge1xuICAgICAgcGF1c2VkUXVldWVFZmZlY3RzLmFkZCh0aGlzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NoZWR1bGVyKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJ1bklmRGlydHkoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcnVuSWZEaXJ0eSgpIHtcbiAgICBpZiAoaXNEaXJ0eSh0aGlzKSkge1xuICAgICAgdGhpcy5ydW4oKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGRpcnR5KCkge1xuICAgIHJldHVybiBpc0RpcnR5KHRoaXMpO1xuICB9XG59XG5sZXQgYmF0Y2hEZXB0aCA9IDA7XG5sZXQgYmF0Y2hlZFN1YjtcbmZ1bmN0aW9uIGJhdGNoKHN1Yikge1xuICBzdWIuZmxhZ3MgfD0gODtcbiAgc3ViLm5leHQgPSBiYXRjaGVkU3ViO1xuICBiYXRjaGVkU3ViID0gc3ViO1xufVxuZnVuY3Rpb24gc3RhcnRCYXRjaCgpIHtcbiAgYmF0Y2hEZXB0aCsrO1xufVxuZnVuY3Rpb24gZW5kQmF0Y2goKSB7XG4gIGlmICgtLWJhdGNoRGVwdGggPiAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlcnJvcjtcbiAgd2hpbGUgKGJhdGNoZWRTdWIpIHtcbiAgICBsZXQgZSA9IGJhdGNoZWRTdWI7XG4gICAgYmF0Y2hlZFN1YiA9IHZvaWQgMDtcbiAgICB3aGlsZSAoZSkge1xuICAgICAgY29uc3QgbmV4dCA9IGUubmV4dDtcbiAgICAgIGUubmV4dCA9IHZvaWQgMDtcbiAgICAgIGUuZmxhZ3MgJj0gfjg7XG4gICAgICBpZiAoZS5mbGFncyAmIDEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICA7XG4gICAgICAgICAgZS50cmlnZ2VyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlID0gbmV4dDtcbiAgICB9XG4gIH1cbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcbn1cbmZ1bmN0aW9uIHByZXBhcmVEZXBzKHN1Yikge1xuICBmb3IgKGxldCBsaW5rID0gc3ViLmRlcHM7IGxpbms7IGxpbmsgPSBsaW5rLm5leHREZXApIHtcbiAgICBsaW5rLnZlcnNpb24gPSAtMTtcbiAgICBsaW5rLnByZXZBY3RpdmVMaW5rID0gbGluay5kZXAuYWN0aXZlTGluaztcbiAgICBsaW5rLmRlcC5hY3RpdmVMaW5rID0gbGluaztcbiAgfVxufVxuZnVuY3Rpb24gY2xlYW51cERlcHMoc3ViKSB7XG4gIGxldCBoZWFkO1xuICBsZXQgdGFpbCA9IHN1Yi5kZXBzVGFpbDtcbiAgbGV0IGxpbmsgPSB0YWlsO1xuICB3aGlsZSAobGluaykge1xuICAgIGNvbnN0IHByZXYgPSBsaW5rLnByZXZEZXA7XG4gICAgaWYgKGxpbmsudmVyc2lvbiA9PT0gLTEpIHtcbiAgICAgIGlmIChsaW5rID09PSB0YWlsKSB0YWlsID0gcHJldjtcbiAgICAgIHJlbW92ZVN1YihsaW5rKTtcbiAgICAgIHJlbW92ZURlcChsaW5rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGVhZCA9IGxpbms7XG4gICAgfVxuICAgIGxpbmsuZGVwLmFjdGl2ZUxpbmsgPSBsaW5rLnByZXZBY3RpdmVMaW5rO1xuICAgIGxpbmsucHJldkFjdGl2ZUxpbmsgPSB2b2lkIDA7XG4gICAgbGluayA9IHByZXY7XG4gIH1cbiAgc3ViLmRlcHMgPSBoZWFkO1xuICBzdWIuZGVwc1RhaWwgPSB0YWlsO1xufVxuZnVuY3Rpb24gaXNEaXJ0eShzdWIpIHtcbiAgZm9yIChsZXQgbGluayA9IHN1Yi5kZXBzOyBsaW5rOyBsaW5rID0gbGluay5uZXh0RGVwKSB7XG4gICAgaWYgKGxpbmsuZGVwLnZlcnNpb24gIT09IGxpbmsudmVyc2lvbiB8fCBsaW5rLmRlcC5jb21wdXRlZCAmJiAocmVmcmVzaENvbXB1dGVkKGxpbmsuZGVwLmNvbXB1dGVkKSB8fCBsaW5rLmRlcC52ZXJzaW9uICE9PSBsaW5rLnZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKHN1Yi5fZGlydHkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiByZWZyZXNoQ29tcHV0ZWQoY29tcHV0ZWQpIHtcbiAgaWYgKGNvbXB1dGVkLmZsYWdzICYgNCAmJiAhKGNvbXB1dGVkLmZsYWdzICYgMTYpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbXB1dGVkLmZsYWdzICY9IH4xNjtcbiAgaWYgKGNvbXB1dGVkLmdsb2JhbFZlcnNpb24gPT09IGdsb2JhbFZlcnNpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29tcHV0ZWQuZ2xvYmFsVmVyc2lvbiA9IGdsb2JhbFZlcnNpb247XG4gIGNvbnN0IGRlcCA9IGNvbXB1dGVkLmRlcDtcbiAgY29tcHV0ZWQuZmxhZ3MgfD0gMjtcbiAgaWYgKGRlcC52ZXJzaW9uID4gMCAmJiAhY29tcHV0ZWQuaXNTU1IgJiYgY29tcHV0ZWQuZGVwcyAmJiAhaXNEaXJ0eShjb21wdXRlZCkpIHtcbiAgICBjb21wdXRlZC5mbGFncyAmPSB+MjtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcHJldlN1YiA9IGFjdGl2ZVN1YjtcbiAgY29uc3QgcHJldlNob3VsZFRyYWNrID0gc2hvdWxkVHJhY2s7XG4gIGFjdGl2ZVN1YiA9IGNvbXB1dGVkO1xuICBzaG91bGRUcmFjayA9IHRydWU7XG4gIHRyeSB7XG4gICAgcHJlcGFyZURlcHMoY29tcHV0ZWQpO1xuICAgIGNvbnN0IHZhbHVlID0gY29tcHV0ZWQuZm4oY29tcHV0ZWQuX3ZhbHVlKTtcbiAgICBpZiAoZGVwLnZlcnNpb24gPT09IDAgfHwgaGFzQ2hhbmdlZCh2YWx1ZSwgY29tcHV0ZWQuX3ZhbHVlKSkge1xuICAgICAgY29tcHV0ZWQuX3ZhbHVlID0gdmFsdWU7XG4gICAgICBkZXAudmVyc2lvbisrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVwLnZlcnNpb24rKztcbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU3ViID0gcHJldlN1YjtcbiAgICBzaG91bGRUcmFjayA9IHByZXZTaG91bGRUcmFjaztcbiAgICBjbGVhbnVwRGVwcyhjb21wdXRlZCk7XG4gICAgY29tcHV0ZWQuZmxhZ3MgJj0gfjI7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbW92ZVN1YihsaW5rKSB7XG4gIGNvbnN0IHsgZGVwLCBwcmV2U3ViLCBuZXh0U3ViIH0gPSBsaW5rO1xuICBpZiAocHJldlN1Yikge1xuICAgIHByZXZTdWIubmV4dFN1YiA9IG5leHRTdWI7XG4gICAgbGluay5wcmV2U3ViID0gdm9pZCAwO1xuICB9XG4gIGlmIChuZXh0U3ViKSB7XG4gICAgbmV4dFN1Yi5wcmV2U3ViID0gcHJldlN1YjtcbiAgICBsaW5rLm5leHRTdWIgPSB2b2lkIDA7XG4gIH1cbiAgaWYgKGRlcC5zdWJzID09PSBsaW5rKSB7XG4gICAgZGVwLnN1YnMgPSBwcmV2U3ViO1xuICB9XG4gIGlmICghZGVwLnN1YnMgJiYgZGVwLmNvbXB1dGVkKSB7XG4gICAgZGVwLmNvbXB1dGVkLmZsYWdzICY9IH40O1xuICAgIGZvciAobGV0IGwgPSBkZXAuY29tcHV0ZWQuZGVwczsgbDsgbCA9IGwubmV4dERlcCkge1xuICAgICAgcmVtb3ZlU3ViKGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVtb3ZlRGVwKGxpbmspIHtcbiAgY29uc3QgeyBwcmV2RGVwLCBuZXh0RGVwIH0gPSBsaW5rO1xuICBpZiAocHJldkRlcCkge1xuICAgIHByZXZEZXAubmV4dERlcCA9IG5leHREZXA7XG4gICAgbGluay5wcmV2RGVwID0gdm9pZCAwO1xuICB9XG4gIGlmIChuZXh0RGVwKSB7XG4gICAgbmV4dERlcC5wcmV2RGVwID0gcHJldkRlcDtcbiAgICBsaW5rLm5leHREZXAgPSB2b2lkIDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGVmZmVjdChmbiwgb3B0aW9ucykge1xuICBpZiAoZm4uZWZmZWN0IGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBmbiA9IGZuLmVmZmVjdC5mbjtcbiAgfVxuICBjb25zdCBlID0gbmV3IFJlYWN0aXZlRWZmZWN0KGZuKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBleHRlbmQoZSwgb3B0aW9ucyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBlLnJ1bigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlLnN0b3AoKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbiAgY29uc3QgcnVubmVyID0gZS5ydW4uYmluZChlKTtcbiAgcnVubmVyLmVmZmVjdCA9IGU7XG4gIHJldHVybiBydW5uZXI7XG59XG5mdW5jdGlvbiBzdG9wKHJ1bm5lcikge1xuICBydW5uZXIuZWZmZWN0LnN0b3AoKTtcbn1cbmxldCBzaG91bGRUcmFjayA9IHRydWU7XG5jb25zdCB0cmFja1N0YWNrID0gW107XG5mdW5jdGlvbiBwYXVzZVRyYWNraW5nKCkge1xuICB0cmFja1N0YWNrLnB1c2goc2hvdWxkVHJhY2spO1xuICBzaG91bGRUcmFjayA9IGZhbHNlO1xufVxuZnVuY3Rpb24gZW5hYmxlVHJhY2tpbmcoKSB7XG4gIHRyYWNrU3RhY2sucHVzaChzaG91bGRUcmFjayk7XG4gIHNob3VsZFRyYWNrID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlc2V0VHJhY2tpbmcoKSB7XG4gIGNvbnN0IGxhc3QgPSB0cmFja1N0YWNrLnBvcCgpO1xuICBzaG91bGRUcmFjayA9IGxhc3QgPT09IHZvaWQgMCA/IHRydWUgOiBsYXN0O1xufVxuZnVuY3Rpb24gb25FZmZlY3RDbGVhbnVwKGZuLCBmYWlsU2lsZW50bHkgPSBmYWxzZSkge1xuICBpZiAoYWN0aXZlU3ViIGluc3RhbmNlb2YgUmVhY3RpdmVFZmZlY3QpIHtcbiAgICBhY3RpdmVTdWIuY2xlYW51cCA9IGZuO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWZhaWxTaWxlbnRseSkge1xuICAgIHdhcm4oXG4gICAgICBgb25FZmZlY3RDbGVhbnVwKCkgd2FzIGNhbGxlZCB3aGVuIHRoZXJlIHdhcyBubyBhY3RpdmUgZWZmZWN0IHRvIGFzc29jaWF0ZSB3aXRoLmBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBjbGVhbnVwRWZmZWN0KGUpIHtcbiAgY29uc3QgeyBjbGVhbnVwIH0gPSBlO1xuICBlLmNsZWFudXAgPSB2b2lkIDA7XG4gIGlmIChjbGVhbnVwKSB7XG4gICAgY29uc3QgcHJldlN1YiA9IGFjdGl2ZVN1YjtcbiAgICBhY3RpdmVTdWIgPSB2b2lkIDA7XG4gICAgdHJ5IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYWN0aXZlU3ViID0gcHJldlN1YjtcbiAgICB9XG4gIH1cbn1cblxubGV0IGdsb2JhbFZlcnNpb24gPSAwO1xuY2xhc3MgTGluayB7XG4gIGNvbnN0cnVjdG9yKHN1YiwgZGVwKSB7XG4gICAgdGhpcy5zdWIgPSBzdWI7XG4gICAgdGhpcy5kZXAgPSBkZXA7XG4gICAgdGhpcy52ZXJzaW9uID0gZGVwLnZlcnNpb247XG4gICAgdGhpcy5uZXh0RGVwID0gdGhpcy5wcmV2RGVwID0gdGhpcy5uZXh0U3ViID0gdGhpcy5wcmV2U3ViID0gdGhpcy5wcmV2QWN0aXZlTGluayA9IHZvaWQgMDtcbiAgfVxufVxuY2xhc3MgRGVwIHtcbiAgY29uc3RydWN0b3IoY29tcHV0ZWQpIHtcbiAgICB0aGlzLmNvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgdGhpcy52ZXJzaW9uID0gMDtcbiAgICAvKipcbiAgICAgKiBMaW5rIGJldHdlZW4gdGhpcyBkZXAgYW5kIHRoZSBjdXJyZW50IGFjdGl2ZSBlZmZlY3RcbiAgICAgKi9cbiAgICB0aGlzLmFjdGl2ZUxpbmsgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogRG91Ymx5IGxpbmtlZCBsaXN0IHJlcHJlc2VudGluZyB0aGUgc3Vic2NyaWJpbmcgZWZmZWN0cyAodGFpbClcbiAgICAgKi9cbiAgICB0aGlzLnN1YnMgPSB2b2lkIDA7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHRoaXMuc3Vic0hlYWQgPSB2b2lkIDA7XG4gICAgfVxuICB9XG4gIHRyYWNrKGRlYnVnSW5mbykge1xuICAgIGlmICghYWN0aXZlU3ViIHx8ICFzaG91bGRUcmFjayB8fCBhY3RpdmVTdWIgPT09IHRoaXMuY29tcHV0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGxpbmsgPSB0aGlzLmFjdGl2ZUxpbms7XG4gICAgaWYgKGxpbmsgPT09IHZvaWQgMCB8fCBsaW5rLnN1YiAhPT0gYWN0aXZlU3ViKSB7XG4gICAgICBsaW5rID0gdGhpcy5hY3RpdmVMaW5rID0gbmV3IExpbmsoYWN0aXZlU3ViLCB0aGlzKTtcbiAgICAgIGlmICghYWN0aXZlU3ViLmRlcHMpIHtcbiAgICAgICAgYWN0aXZlU3ViLmRlcHMgPSBhY3RpdmVTdWIuZGVwc1RhaWwgPSBsaW5rO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluay5wcmV2RGVwID0gYWN0aXZlU3ViLmRlcHNUYWlsO1xuICAgICAgICBhY3RpdmVTdWIuZGVwc1RhaWwubmV4dERlcCA9IGxpbms7XG4gICAgICAgIGFjdGl2ZVN1Yi5kZXBzVGFpbCA9IGxpbms7XG4gICAgICB9XG4gICAgICBpZiAoYWN0aXZlU3ViLmZsYWdzICYgNCkge1xuICAgICAgICBhZGRTdWIobGluayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsaW5rLnZlcnNpb24gPT09IC0xKSB7XG4gICAgICBsaW5rLnZlcnNpb24gPSB0aGlzLnZlcnNpb247XG4gICAgICBpZiAobGluay5uZXh0RGVwKSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBsaW5rLm5leHREZXA7XG4gICAgICAgIG5leHQucHJldkRlcCA9IGxpbmsucHJldkRlcDtcbiAgICAgICAgaWYgKGxpbmsucHJldkRlcCkge1xuICAgICAgICAgIGxpbmsucHJldkRlcC5uZXh0RGVwID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBsaW5rLnByZXZEZXAgPSBhY3RpdmVTdWIuZGVwc1RhaWw7XG4gICAgICAgIGxpbmsubmV4dERlcCA9IHZvaWQgMDtcbiAgICAgICAgYWN0aXZlU3ViLmRlcHNUYWlsLm5leHREZXAgPSBsaW5rO1xuICAgICAgICBhY3RpdmVTdWIuZGVwc1RhaWwgPSBsaW5rO1xuICAgICAgICBpZiAoYWN0aXZlU3ViLmRlcHMgPT09IGxpbmspIHtcbiAgICAgICAgICBhY3RpdmVTdWIuZGVwcyA9IG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgYWN0aXZlU3ViLm9uVHJhY2spIHtcbiAgICAgIGFjdGl2ZVN1Yi5vblRyYWNrKFxuICAgICAgICBleHRlbmQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWZmZWN0OiBhY3RpdmVTdWJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlYnVnSW5mb1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbGluaztcbiAgfVxuICB0cmlnZ2VyKGRlYnVnSW5mbykge1xuICAgIHRoaXMudmVyc2lvbisrO1xuICAgIGdsb2JhbFZlcnNpb24rKztcbiAgICB0aGlzLm5vdGlmeShkZWJ1Z0luZm8pO1xuICB9XG4gIG5vdGlmeShkZWJ1Z0luZm8pIHtcbiAgICBzdGFydEJhdGNoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGZvciAobGV0IGhlYWQgPSB0aGlzLnN1YnNIZWFkOyBoZWFkOyBoZWFkID0gaGVhZC5uZXh0U3ViKSB7XG4gICAgICAgICAgaWYgKGhlYWQuc3ViLm9uVHJpZ2dlciAmJiAhKGhlYWQuc3ViLmZsYWdzICYgOCkpIHtcbiAgICAgICAgICAgIGhlYWQuc3ViLm9uVHJpZ2dlcihcbiAgICAgICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVmZmVjdDogaGVhZC5zdWJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlYnVnSW5mb1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgbGluayA9IHRoaXMuc3ViczsgbGluazsgbGluayA9IGxpbmsucHJldlN1Yikge1xuICAgICAgICBpZiAobGluay5zdWIubm90aWZ5KCkpIHtcbiAgICAgICAgICA7XG4gICAgICAgICAgbGluay5zdWIuZGVwLm5vdGlmeSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVuZEJhdGNoKCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBhZGRTdWIobGluaykge1xuICBjb25zdCBjb21wdXRlZCA9IGxpbmsuZGVwLmNvbXB1dGVkO1xuICBpZiAoY29tcHV0ZWQgJiYgIWxpbmsuZGVwLnN1YnMpIHtcbiAgICBjb21wdXRlZC5mbGFncyB8PSA0IHwgMTY7XG4gICAgZm9yIChsZXQgbCA9IGNvbXB1dGVkLmRlcHM7IGw7IGwgPSBsLm5leHREZXApIHtcbiAgICAgIGFkZFN1YihsKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY3VycmVudFRhaWwgPSBsaW5rLmRlcC5zdWJzO1xuICBpZiAoY3VycmVudFRhaWwgIT09IGxpbmspIHtcbiAgICBsaW5rLnByZXZTdWIgPSBjdXJyZW50VGFpbDtcbiAgICBpZiAoY3VycmVudFRhaWwpIGN1cnJlbnRUYWlsLm5leHRTdWIgPSBsaW5rO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGxpbmsuZGVwLnN1YnNIZWFkID09PSB2b2lkIDApIHtcbiAgICBsaW5rLmRlcC5zdWJzSGVhZCA9IGxpbms7XG4gIH1cbiAgbGluay5kZXAuc3VicyA9IGxpbms7XG59XG5jb25zdCB0YXJnZXRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IElURVJBVEVfS0VZID0gU3ltYm9sKFxuICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gXCJPYmplY3QgaXRlcmF0ZVwiIDogXCJcIlxuKTtcbmNvbnN0IE1BUF9LRVlfSVRFUkFURV9LRVkgPSBTeW1ib2woXG4gICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIk1hcCBrZXlzIGl0ZXJhdGVcIiA6IFwiXCJcbik7XG5jb25zdCBBUlJBWV9JVEVSQVRFX0tFWSA9IFN5bWJvbChcbiAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IFwiQXJyYXkgaXRlcmF0ZVwiIDogXCJcIlxuKTtcbmZ1bmN0aW9uIHRyYWNrKHRhcmdldCwgdHlwZSwga2V5KSB7XG4gIGlmIChzaG91bGRUcmFjayAmJiBhY3RpdmVTdWIpIHtcbiAgICBsZXQgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgICBpZiAoIWRlcHNNYXApIHtcbiAgICAgIHRhcmdldE1hcC5zZXQodGFyZ2V0LCBkZXBzTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSk7XG4gICAgfVxuICAgIGxldCBkZXAgPSBkZXBzTWFwLmdldChrZXkpO1xuICAgIGlmICghZGVwKSB7XG4gICAgICBkZXBzTWFwLnNldChrZXksIGRlcCA9IG5ldyBEZXAoKSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBkZXAudHJhY2soe1xuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGtleVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlcC50cmFjaygpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlcih0YXJnZXQsIHR5cGUsIGtleSwgbmV3VmFsdWUsIG9sZFZhbHVlLCBvbGRUYXJnZXQpIHtcbiAgY29uc3QgZGVwc01hcCA9IHRhcmdldE1hcC5nZXQodGFyZ2V0KTtcbiAgaWYgKCFkZXBzTWFwKSB7XG4gICAgZ2xvYmFsVmVyc2lvbisrO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBydW4gPSAoZGVwKSA9PiB7XG4gICAgaWYgKGRlcCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgZGVwLnRyaWdnZXIoe1xuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgICBvbGRUYXJnZXRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXAudHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgc3RhcnRCYXRjaCgpO1xuICBpZiAodHlwZSA9PT0gXCJjbGVhclwiKSB7XG4gICAgZGVwc01hcC5mb3JFYWNoKHJ1bik7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFyZ2V0SXNBcnJheSA9IGlzQXJyYXkodGFyZ2V0KTtcbiAgICBjb25zdCBpc0FycmF5SW5kZXggPSB0YXJnZXRJc0FycmF5ICYmIGlzSW50ZWdlcktleShrZXkpO1xuICAgIGlmICh0YXJnZXRJc0FycmF5ICYmIGtleSA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgY29uc3QgbmV3TGVuZ3RoID0gTnVtYmVyKG5ld1ZhbHVlKTtcbiAgICAgIGRlcHNNYXAuZm9yRWFjaCgoZGVwLCBrZXkyKSA9PiB7XG4gICAgICAgIGlmIChrZXkyID09PSBcImxlbmd0aFwiIHx8IGtleTIgPT09IEFSUkFZX0lURVJBVEVfS0VZIHx8ICFpc1N5bWJvbChrZXkyKSAmJiBrZXkyID49IG5ld0xlbmd0aCkge1xuICAgICAgICAgIHJ1bihkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGtleSAhPT0gdm9pZCAwKSB7XG4gICAgICAgIHJ1bihkZXBzTWFwLmdldChrZXkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5SW5kZXgpIHtcbiAgICAgICAgcnVuKGRlcHNNYXAuZ2V0KEFSUkFZX0lURVJBVEVfS0VZKSk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImFkZFwiOlxuICAgICAgICAgIGlmICghdGFyZ2V0SXNBcnJheSkge1xuICAgICAgICAgICAgcnVuKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheUluZGV4KSB7XG4gICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoXCJsZW5ndGhcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxuICAgICAgICAgIGlmICghdGFyZ2V0SXNBcnJheSkge1xuICAgICAgICAgICAgcnVuKGRlcHNNYXAuZ2V0KElURVJBVEVfS0VZKSk7XG4gICAgICAgICAgICBpZiAoaXNNYXAodGFyZ2V0KSkge1xuICAgICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoTUFQX0tFWV9JVEVSQVRFX0tFWSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNldFwiOlxuICAgICAgICAgIGlmIChpc01hcCh0YXJnZXQpKSB7XG4gICAgICAgICAgICBydW4oZGVwc01hcC5nZXQoSVRFUkFURV9LRVkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVuZEJhdGNoKCk7XG59XG5mdW5jdGlvbiBnZXREZXBGcm9tUmVhY3RpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIF9hO1xuICByZXR1cm4gKF9hID0gdGFyZ2V0TWFwLmdldChvYmplY3QpKSA9PSBudWxsID8gdm9pZCAwIDogX2EuZ2V0KGtleSk7XG59XG5cbmZ1bmN0aW9uIHJlYWN0aXZlUmVhZEFycmF5KGFycmF5KSB7XG4gIGNvbnN0IHJhdyA9IHRvUmF3KGFycmF5KTtcbiAgaWYgKHJhdyA9PT0gYXJyYXkpIHJldHVybiByYXc7XG4gIHRyYWNrKHJhdywgXCJpdGVyYXRlXCIsIEFSUkFZX0lURVJBVEVfS0VZKTtcbiAgcmV0dXJuIGlzU2hhbGxvdyhhcnJheSkgPyByYXcgOiByYXcubWFwKHRvUmVhY3RpdmUpO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWRBcnJheShhcnIpIHtcbiAgdHJhY2soYXJyID0gdG9SYXcoYXJyKSwgXCJpdGVyYXRlXCIsIEFSUkFZX0lURVJBVEVfS0VZKTtcbiAgcmV0dXJuIGFycjtcbn1cbmNvbnN0IGFycmF5SW5zdHJ1bWVudGF0aW9ucyA9IHtcbiAgX19wcm90b19fOiBudWxsLFxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgU3ltYm9sLml0ZXJhdG9yLCB0b1JlYWN0aXZlKTtcbiAgfSxcbiAgY29uY2F0KC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gcmVhY3RpdmVSZWFkQXJyYXkodGhpcykuY29uY2F0KFxuICAgICAgLi4uYXJncy5tYXAoKHgpID0+IGlzQXJyYXkoeCkgPyByZWFjdGl2ZVJlYWRBcnJheSh4KSA6IHgpXG4gICAgKTtcbiAgfSxcbiAgZW50cmllcygpIHtcbiAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgXCJlbnRyaWVzXCIsICh2YWx1ZSkgPT4ge1xuICAgICAgdmFsdWVbMV0gPSB0b1JlYWN0aXZlKHZhbHVlWzFdKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfSxcbiAgZXZlcnkoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJldmVyeVwiLCBmbiwgdGhpc0FyZywgdm9pZCAwLCBhcmd1bWVudHMpO1xuICB9LFxuICBmaWx0ZXIoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJmaWx0ZXJcIiwgZm4sIHRoaXNBcmcsICh2KSA9PiB2Lm1hcCh0b1JlYWN0aXZlKSwgYXJndW1lbnRzKTtcbiAgfSxcbiAgZmluZChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcImZpbmRcIiwgZm4sIHRoaXNBcmcsIHRvUmVhY3RpdmUsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIGZpbmRJbmRleChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcImZpbmRJbmRleFwiLCBmbiwgdGhpc0FyZywgdm9pZCAwLCBhcmd1bWVudHMpO1xuICB9LFxuICBmaW5kTGFzdChmbiwgdGhpc0FyZykge1xuICAgIHJldHVybiBhcHBseSh0aGlzLCBcImZpbmRMYXN0XCIsIGZuLCB0aGlzQXJnLCB0b1JlYWN0aXZlLCBhcmd1bWVudHMpO1xuICB9LFxuICBmaW5kTGFzdEluZGV4KGZuLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIGFwcGx5KHRoaXMsIFwiZmluZExhc3RJbmRleFwiLCBmbiwgdGhpc0FyZywgdm9pZCAwLCBhcmd1bWVudHMpO1xuICB9LFxuICAvLyBmbGF0LCBmbGF0TWFwIGNvdWxkIGJlbmVmaXQgZnJvbSBBUlJBWV9JVEVSQVRFIGJ1dCBhcmUgbm90IHN0cmFpZ2h0LWZvcndhcmQgdG8gaW1wbGVtZW50XG4gIGZvckVhY2goZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJmb3JFYWNoXCIsIGZuLCB0aGlzQXJnLCB2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIGluY2x1ZGVzKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc2VhcmNoUHJveHkodGhpcywgXCJpbmNsdWRlc1wiLCBhcmdzKTtcbiAgfSxcbiAgaW5kZXhPZiguLi5hcmdzKSB7XG4gICAgcmV0dXJuIHNlYXJjaFByb3h5KHRoaXMsIFwiaW5kZXhPZlwiLCBhcmdzKTtcbiAgfSxcbiAgam9pbihzZXBhcmF0b3IpIHtcbiAgICByZXR1cm4gcmVhY3RpdmVSZWFkQXJyYXkodGhpcykuam9pbihzZXBhcmF0b3IpO1xuICB9LFxuICAvLyBrZXlzKCkgaXRlcmF0b3Igb25seSByZWFkcyBgbGVuZ3RoYCwgbm8gb3B0aW1pc2F0aW9uIHJlcXVpcmVkXG4gIGxhc3RJbmRleE9mKC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gc2VhcmNoUHJveHkodGhpcywgXCJsYXN0SW5kZXhPZlwiLCBhcmdzKTtcbiAgfSxcbiAgbWFwKGZuLCB0aGlzQXJnKSB7XG4gICAgcmV0dXJuIGFwcGx5KHRoaXMsIFwibWFwXCIsIGZuLCB0aGlzQXJnLCB2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIHBvcCgpIHtcbiAgICByZXR1cm4gbm9UcmFja2luZyh0aGlzLCBcInBvcFwiKTtcbiAgfSxcbiAgcHVzaCguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG5vVHJhY2tpbmcodGhpcywgXCJwdXNoXCIsIGFyZ3MpO1xuICB9LFxuICByZWR1Y2UoZm4sIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gcmVkdWNlKHRoaXMsIFwicmVkdWNlXCIsIGZuLCBhcmdzKTtcbiAgfSxcbiAgcmVkdWNlUmlnaHQoZm4sIC4uLmFyZ3MpIHtcbiAgICByZXR1cm4gcmVkdWNlKHRoaXMsIFwicmVkdWNlUmlnaHRcIiwgZm4sIGFyZ3MpO1xuICB9LFxuICBzaGlmdCgpIHtcbiAgICByZXR1cm4gbm9UcmFja2luZyh0aGlzLCBcInNoaWZ0XCIpO1xuICB9LFxuICAvLyBzbGljZSBjb3VsZCB1c2UgQVJSQVlfSVRFUkFURSBidXQgYWxzbyBzZWVtcyB0byBiZWcgZm9yIHJhbmdlIHRyYWNraW5nXG4gIHNvbWUoZm4sIHRoaXNBcmcpIHtcbiAgICByZXR1cm4gYXBwbHkodGhpcywgXCJzb21lXCIsIGZuLCB0aGlzQXJnLCB2b2lkIDAsIGFyZ3VtZW50cyk7XG4gIH0sXG4gIHNwbGljZSguLi5hcmdzKSB7XG4gICAgcmV0dXJuIG5vVHJhY2tpbmcodGhpcywgXCJzcGxpY2VcIiwgYXJncyk7XG4gIH0sXG4gIHRvUmV2ZXJzZWQoKSB7XG4gICAgcmV0dXJuIHJlYWN0aXZlUmVhZEFycmF5KHRoaXMpLnRvUmV2ZXJzZWQoKTtcbiAgfSxcbiAgdG9Tb3J0ZWQoY29tcGFyZXIpIHtcbiAgICByZXR1cm4gcmVhY3RpdmVSZWFkQXJyYXkodGhpcykudG9Tb3J0ZWQoY29tcGFyZXIpO1xuICB9LFxuICB0b1NwbGljZWQoLi4uYXJncykge1xuICAgIHJldHVybiByZWFjdGl2ZVJlYWRBcnJheSh0aGlzKS50b1NwbGljZWQoLi4uYXJncyk7XG4gIH0sXG4gIHVuc2hpZnQoLi4uYXJncykge1xuICAgIHJldHVybiBub1RyYWNraW5nKHRoaXMsIFwidW5zaGlmdFwiLCBhcmdzKTtcbiAgfSxcbiAgdmFsdWVzKCkge1xuICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBcInZhbHVlc1wiLCB0b1JlYWN0aXZlKTtcbiAgfVxufTtcbmZ1bmN0aW9uIGl0ZXJhdG9yKHNlbGYsIG1ldGhvZCwgd3JhcFZhbHVlKSB7XG4gIGNvbnN0IGFyciA9IHNoYWxsb3dSZWFkQXJyYXkoc2VsZik7XG4gIGNvbnN0IGl0ZXIgPSBhcnJbbWV0aG9kXSgpO1xuICBpZiAoYXJyICE9PSBzZWxmICYmICFpc1NoYWxsb3coc2VsZikpIHtcbiAgICBpdGVyLl9uZXh0ID0gaXRlci5uZXh0O1xuICAgIGl0ZXIubmV4dCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXIuX25leHQoKTtcbiAgICAgIGlmIChyZXN1bHQudmFsdWUpIHtcbiAgICAgICAgcmVzdWx0LnZhbHVlID0gd3JhcFZhbHVlKHJlc3VsdC52YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGl0ZXI7XG59XG5jb25zdCBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuZnVuY3Rpb24gYXBwbHkoc2VsZiwgbWV0aG9kLCBmbiwgdGhpc0FyZywgd3JhcHBlZFJldEZuLCBhcmdzKSB7XG4gIGNvbnN0IGFyciA9IHNoYWxsb3dSZWFkQXJyYXkoc2VsZik7XG4gIGNvbnN0IG5lZWRzV3JhcCA9IGFyciAhPT0gc2VsZiAmJiAhaXNTaGFsbG93KHNlbGYpO1xuICBjb25zdCBtZXRob2RGbiA9IGFyclttZXRob2RdO1xuICBpZiAobWV0aG9kRm4gIT09IGFycmF5UHJvdG9bbWV0aG9kXSkge1xuICAgIGNvbnN0IHJlc3VsdDIgPSBtZXRob2RGbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICByZXR1cm4gbmVlZHNXcmFwID8gdG9SZWFjdGl2ZShyZXN1bHQyKSA6IHJlc3VsdDI7XG4gIH1cbiAgbGV0IHdyYXBwZWRGbiA9IGZuO1xuICBpZiAoYXJyICE9PSBzZWxmKSB7XG4gICAgaWYgKG5lZWRzV3JhcCkge1xuICAgICAgd3JhcHBlZEZuID0gZnVuY3Rpb24oaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdG9SZWFjdGl2ZShpdGVtKSwgaW5kZXgsIHNlbGYpO1xuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGZuLmxlbmd0aCA+IDIpIHtcbiAgICAgIHdyYXBwZWRGbiA9IGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBmbi5jYWxsKHRoaXMsIGl0ZW0sIGluZGV4LCBzZWxmKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG1ldGhvZEZuLmNhbGwoYXJyLCB3cmFwcGVkRm4sIHRoaXNBcmcpO1xuICByZXR1cm4gbmVlZHNXcmFwICYmIHdyYXBwZWRSZXRGbiA/IHdyYXBwZWRSZXRGbihyZXN1bHQpIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gcmVkdWNlKHNlbGYsIG1ldGhvZCwgZm4sIGFyZ3MpIHtcbiAgY29uc3QgYXJyID0gc2hhbGxvd1JlYWRBcnJheShzZWxmKTtcbiAgbGV0IHdyYXBwZWRGbiA9IGZuO1xuICBpZiAoYXJyICE9PSBzZWxmKSB7XG4gICAgaWYgKCFpc1NoYWxsb3coc2VsZikpIHtcbiAgICAgIHdyYXBwZWRGbiA9IGZ1bmN0aW9uKGFjYywgaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgYWNjLCB0b1JlYWN0aXZlKGl0ZW0pLCBpbmRleCwgc2VsZik7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZm4ubGVuZ3RoID4gMykge1xuICAgICAgd3JhcHBlZEZuID0gZnVuY3Rpb24oYWNjLCBpdGVtLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBhY2MsIGl0ZW0sIGluZGV4LCBzZWxmKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBhcnJbbWV0aG9kXSh3cmFwcGVkRm4sIC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gc2VhcmNoUHJveHkoc2VsZiwgbWV0aG9kLCBhcmdzKSB7XG4gIGNvbnN0IGFyciA9IHRvUmF3KHNlbGYpO1xuICB0cmFjayhhcnIsIFwiaXRlcmF0ZVwiLCBBUlJBWV9JVEVSQVRFX0tFWSk7XG4gIGNvbnN0IHJlcyA9IGFyclttZXRob2RdKC4uLmFyZ3MpO1xuICBpZiAoKHJlcyA9PT0gLTEgfHwgcmVzID09PSBmYWxzZSkgJiYgaXNQcm94eShhcmdzWzBdKSkge1xuICAgIGFyZ3NbMF0gPSB0b1JhdyhhcmdzWzBdKTtcbiAgICByZXR1cm4gYXJyW21ldGhvZF0oLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIG5vVHJhY2tpbmcoc2VsZiwgbWV0aG9kLCBhcmdzID0gW10pIHtcbiAgcGF1c2VUcmFja2luZygpO1xuICBzdGFydEJhdGNoKCk7XG4gIGNvbnN0IHJlcyA9IHRvUmF3KHNlbGYpW21ldGhvZF0uYXBwbHkoc2VsZiwgYXJncyk7XG4gIGVuZEJhdGNoKCk7XG4gIHJlc2V0VHJhY2tpbmcoKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuY29uc3QgaXNOb25UcmFja2FibGVLZXlzID0gLyogQF9fUFVSRV9fICovIG1ha2VNYXAoYF9fcHJvdG9fXyxfX3ZfaXNSZWYsX19pc1Z1ZWApO1xuY29uc3QgYnVpbHRJblN5bWJvbHMgPSBuZXcgU2V0KFxuICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoU3ltYm9sKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcImFyZ3VtZW50c1wiICYmIGtleSAhPT0gXCJjYWxsZXJcIikubWFwKChrZXkpID0+IFN5bWJvbFtrZXldKS5maWx0ZXIoaXNTeW1ib2wpXG4pO1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkoa2V5KSB7XG4gIGlmICghaXNTeW1ib2woa2V5KSkga2V5ID0gU3RyaW5nKGtleSk7XG4gIGNvbnN0IG9iaiA9IHRvUmF3KHRoaXMpO1xuICB0cmFjayhvYmosIFwiaGFzXCIsIGtleSk7XG4gIHJldHVybiBvYmouaGFzT3duUHJvcGVydHkoa2V5KTtcbn1cbmNsYXNzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihfaXNSZWFkb25seSA9IGZhbHNlLCBfaXNTaGFsbG93ID0gZmFsc2UpIHtcbiAgICB0aGlzLl9pc1JlYWRvbmx5ID0gX2lzUmVhZG9ubHk7XG4gICAgdGhpcy5faXNTaGFsbG93ID0gX2lzU2hhbGxvdztcbiAgfVxuICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgY29uc3QgaXNSZWFkb25seTIgPSB0aGlzLl9pc1JlYWRvbmx5LCBpc1NoYWxsb3cyID0gdGhpcy5faXNTaGFsbG93O1xuICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIikge1xuICAgICAgcmV0dXJuICFpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFkb25seVwiKSB7XG4gICAgICByZXR1cm4gaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X2lzU2hhbGxvd1wiKSB7XG4gICAgICByZXR1cm4gaXNTaGFsbG93MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfcmF3XCIpIHtcbiAgICAgIGlmIChyZWNlaXZlciA9PT0gKGlzUmVhZG9ubHkyID8gaXNTaGFsbG93MiA/IHNoYWxsb3dSZWFkb25seU1hcCA6IHJlYWRvbmx5TWFwIDogaXNTaGFsbG93MiA/IHNoYWxsb3dSZWFjdGl2ZU1hcCA6IHJlYWN0aXZlTWFwKS5nZXQodGFyZ2V0KSB8fCAvLyByZWNlaXZlciBpcyBub3QgdGhlIHJlYWN0aXZlIHByb3h5LCBidXQgaGFzIHRoZSBzYW1lIHByb3RvdHlwZVxuICAgICAgLy8gdGhpcyBtZWFucyB0aGUgcmVjZWl2ZXIgaXMgYSB1c2VyIHByb3h5IG9mIHRoZSByZWFjdGl2ZSBwcm94eVxuICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCkgPT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWNlaXZlcikpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0SXNBcnJheSA9IGlzQXJyYXkodGFyZ2V0KTtcbiAgICBpZiAoIWlzUmVhZG9ubHkyKSB7XG4gICAgICBsZXQgZm47XG4gICAgICBpZiAodGFyZ2V0SXNBcnJheSAmJiAoZm4gPSBhcnJheUluc3RydW1lbnRhdGlvbnNba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gXCJoYXNPd25Qcm9wZXJ0eVwiKSB7XG4gICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzID0gUmVmbGVjdC5nZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBrZXksXG4gICAgICAvLyBpZiB0aGlzIGlzIGEgcHJveHkgd3JhcHBpbmcgYSByZWYsIHJldHVybiBtZXRob2RzIHVzaW5nIHRoZSByYXcgcmVmXG4gICAgICAvLyBhcyByZWNlaXZlciBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2FsbCBgdG9SYXdgIG9uIHRoZSByZWYgaW4gYWxsXG4gICAgICAvLyBpdHMgY2xhc3MgbWV0aG9kc1xuICAgICAgaXNSZWYodGFyZ2V0KSA/IHRhcmdldCA6IHJlY2VpdmVyXG4gICAgKTtcbiAgICBpZiAoaXNTeW1ib2woa2V5KSA/IGJ1aWx0SW5TeW1ib2xzLmhhcyhrZXkpIDogaXNOb25UcmFja2FibGVLZXlzKGtleSkpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmICghaXNSZWFkb25seTIpIHtcbiAgICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwga2V5KTtcbiAgICB9XG4gICAgaWYgKGlzU2hhbGxvdzIpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIGlmIChpc1JlZihyZXMpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0SXNBcnJheSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IHJlcyA6IHJlcy52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzT2JqZWN0KHJlcykpIHtcbiAgICAgIHJldHVybiBpc1JlYWRvbmx5MiA/IHJlYWRvbmx5KHJlcykgOiByZWFjdGl2ZShyZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5jbGFzcyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyIGV4dGVuZHMgQmFzZVJlYWN0aXZlSGFuZGxlciB7XG4gIGNvbnN0cnVjdG9yKGlzU2hhbGxvdzIgPSBmYWxzZSkge1xuICAgIHN1cGVyKGZhbHNlLCBpc1NoYWxsb3cyKTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikge1xuICAgIGxldCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGlmICghdGhpcy5faXNTaGFsbG93KSB7XG4gICAgICBjb25zdCBpc09sZFZhbHVlUmVhZG9ubHkgPSBpc1JlYWRvbmx5KG9sZFZhbHVlKTtcbiAgICAgIGlmICghaXNTaGFsbG93KHZhbHVlKSAmJiAhaXNSZWFkb25seSh2YWx1ZSkpIHtcbiAgICAgICAgb2xkVmFsdWUgPSB0b1JhdyhvbGRWYWx1ZSk7XG4gICAgICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KHRhcmdldCkgJiYgaXNSZWYob2xkVmFsdWUpICYmICFpc1JlZih2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGlzT2xkVmFsdWVSZWFkb25seSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGhhZEtleSA9IGlzQXJyYXkodGFyZ2V0KSAmJiBpc0ludGVnZXJLZXkoa2V5KSA/IE51bWJlcihrZXkpIDwgdGFyZ2V0Lmxlbmd0aCA6IGhhc093bih0YXJnZXQsIGtleSk7XG4gICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBrZXksXG4gICAgICB2YWx1ZSxcbiAgICAgIGlzUmVmKHRhcmdldCkgPyB0YXJnZXQgOiByZWNlaXZlclxuICAgICk7XG4gICAgaWYgKHRhcmdldCA9PT0gdG9SYXcocmVjZWl2ZXIpKSB7XG4gICAgICBpZiAoIWhhZEtleSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwga2V5LCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc0NoYW5nZWQodmFsdWUsIG9sZFZhbHVlKSkge1xuICAgICAgICB0cmlnZ2VyKHRhcmdldCwgXCJzZXRcIiwga2V5LCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgY29uc3QgaGFkS2V5ID0gaGFzT3duKHRhcmdldCwga2V5KTtcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHRhcmdldFtrZXldO1xuICAgIGNvbnN0IHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBrZXkpO1xuICAgIGlmIChyZXN1bHQgJiYgaGFkS2V5KSB7XG4gICAgICB0cmlnZ2VyKHRhcmdldCwgXCJkZWxldGVcIiwga2V5LCB2b2lkIDAsIG9sZFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBoYXModGFyZ2V0LCBrZXkpIHtcbiAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0Lmhhcyh0YXJnZXQsIGtleSk7XG4gICAgaWYgKCFpc1N5bWJvbChrZXkpIHx8ICFidWlsdEluU3ltYm9scy5oYXMoa2V5KSkge1xuICAgICAgdHJhY2sodGFyZ2V0LCBcImhhc1wiLCBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIG93bktleXModGFyZ2V0KSB7XG4gICAgdHJhY2soXG4gICAgICB0YXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzQXJyYXkodGFyZ2V0KSA/IFwibGVuZ3RoXCIgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyh0YXJnZXQpO1xuICB9XG59XG5jbGFzcyBSZWFkb25seVJlYWN0aXZlSGFuZGxlciBleHRlbmRzIEJhc2VSZWFjdGl2ZUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihpc1NoYWxsb3cyID0gZmFsc2UpIHtcbiAgICBzdXBlcih0cnVlLCBpc1NoYWxsb3cyKTtcbiAgfVxuICBzZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYFNldCBvcGVyYXRpb24gb24ga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBmYWlsZWQ6IHRhcmdldCBpcyByZWFkb25seS5gLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwga2V5KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBEZWxldGUgb3BlcmF0aW9uIG9uIGtleSBcIiR7U3RyaW5nKGtleSl9XCIgZmFpbGVkOiB0YXJnZXQgaXMgcmVhZG9ubHkuYCxcbiAgICAgICAgdGFyZ2V0XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuY29uc3QgbXV0YWJsZUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBNdXRhYmxlUmVhY3RpdmVIYW5kbGVyKCk7XG5jb25zdCByZWFkb25seUhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBSZWFkb25seVJlYWN0aXZlSGFuZGxlcigpO1xuY29uc3Qgc2hhbGxvd1JlYWN0aXZlSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE11dGFibGVSZWFjdGl2ZUhhbmRsZXIodHJ1ZSk7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgUmVhZG9ubHlSZWFjdGl2ZUhhbmRsZXIodHJ1ZSk7XG5cbmNvbnN0IHRvU2hhbGxvdyA9ICh2YWx1ZSkgPT4gdmFsdWU7XG5jb25zdCBnZXRQcm90byA9ICh2KSA9PiBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHYpO1xuZnVuY3Rpb24gZ2V0KHRhcmdldCwga2V5LCBpc1JlYWRvbmx5MiA9IGZhbHNlLCBpc1NoYWxsb3cyID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgY29uc3QgcmF3S2V5ID0gdG9SYXcoa2V5KTtcbiAgaWYgKCFpc1JlYWRvbmx5Mikge1xuICAgIGlmIChoYXNDaGFuZ2VkKGtleSwgcmF3S2V5KSkge1xuICAgICAgdHJhY2socmF3VGFyZ2V0LCBcImdldFwiLCBrZXkpO1xuICAgIH1cbiAgICB0cmFjayhyYXdUYXJnZXQsIFwiZ2V0XCIsIHJhd0tleSk7XG4gIH1cbiAgY29uc3QgeyBoYXM6IGhhczIgfSA9IGdldFByb3RvKHJhd1RhcmdldCk7XG4gIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cyID8gdG9TaGFsbG93IDogaXNSZWFkb25seTIgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIGtleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KGtleSkpO1xuICB9IGVsc2UgaWYgKGhhczIuY2FsbChyYXdUYXJnZXQsIHJhd0tleSkpIHtcbiAgICByZXR1cm4gd3JhcCh0YXJnZXQuZ2V0KHJhd0tleSkpO1xuICB9IGVsc2UgaWYgKHRhcmdldCAhPT0gcmF3VGFyZ2V0KSB7XG4gICAgdGFyZ2V0LmdldChrZXkpO1xuICB9XG59XG5mdW5jdGlvbiBoYXMoa2V5LCBpc1JlYWRvbmx5MiA9IGZhbHNlKSB7XG4gIGNvbnN0IHRhcmdldCA9IHRoaXNbXCJfX3ZfcmF3XCJdO1xuICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAoIWlzUmVhZG9ubHkyKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQoa2V5LCByYXdLZXkpKSB7XG4gICAgICB0cmFjayhyYXdUYXJnZXQsIFwiaGFzXCIsIGtleSk7XG4gICAgfVxuICAgIHRyYWNrKHJhd1RhcmdldCwgXCJoYXNcIiwgcmF3S2V5KTtcbiAgfVxuICByZXR1cm4ga2V5ID09PSByYXdLZXkgPyB0YXJnZXQuaGFzKGtleSkgOiB0YXJnZXQuaGFzKGtleSkgfHwgdGFyZ2V0LmhhcyhyYXdLZXkpO1xufVxuZnVuY3Rpb24gc2l6ZSh0YXJnZXQsIGlzUmVhZG9ubHkyID0gZmFsc2UpIHtcbiAgdGFyZ2V0ID0gdGFyZ2V0W1wiX192X3Jhd1wiXTtcbiAgIWlzUmVhZG9ubHkyICYmIHRyYWNrKHRvUmF3KHRhcmdldCksIFwiaXRlcmF0ZVwiLCBJVEVSQVRFX0tFWSk7XG4gIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIFwic2l6ZVwiLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gYWRkKHZhbHVlLCBfaXNTaGFsbG93ID0gZmFsc2UpIHtcbiAgaWYgKCFfaXNTaGFsbG93ICYmICFpc1NoYWxsb3codmFsdWUpICYmICFpc1JlYWRvbmx5KHZhbHVlKSkge1xuICAgIHZhbHVlID0gdG9SYXcodmFsdWUpO1xuICB9XG4gIGNvbnN0IHRhcmdldCA9IHRvUmF3KHRoaXMpO1xuICBjb25zdCBwcm90byA9IGdldFByb3RvKHRhcmdldCk7XG4gIGNvbnN0IGhhZEtleSA9IHByb3RvLmhhcy5jYWxsKHRhcmdldCwgdmFsdWUpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIHRhcmdldC5hZGQodmFsdWUpO1xuICAgIHRyaWdnZXIodGFyZ2V0LCBcImFkZFwiLCB2YWx1ZSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUsIF9pc1NoYWxsb3cgPSBmYWxzZSkge1xuICBpZiAoIV9pc1NoYWxsb3cgJiYgIWlzU2hhbGxvdyh2YWx1ZSkgJiYgIWlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgdmFsdWUgPSB0b1Jhdyh2YWx1ZSk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0ID0gdG9SYXcodGhpcyk7XG4gIGNvbnN0IHsgaGFzOiBoYXMyLCBnZXQ6IGdldDIgfSA9IGdldFByb3RvKHRhcmdldCk7XG4gIGxldCBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICBpZiAoIWhhZEtleSkge1xuICAgIGtleSA9IHRvUmF3KGtleSk7XG4gICAgaGFkS2V5ID0gaGFzMi5jYWxsKHRhcmdldCwga2V5KTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY2hlY2tJZGVudGl0eUtleXModGFyZ2V0LCBoYXMyLCBrZXkpO1xuICB9XG4gIGNvbnN0IG9sZFZhbHVlID0gZ2V0Mi5jYWxsKHRhcmdldCwga2V5KTtcbiAgdGFyZ2V0LnNldChrZXksIHZhbHVlKTtcbiAgaWYgKCFoYWRLZXkpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJhZGRcIiwga2V5LCB2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoaGFzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpKSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwic2V0XCIsIGtleSwgdmFsdWUsIG9sZFZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cbmZ1bmN0aW9uIGRlbGV0ZUVudHJ5KGtleSkge1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgeyBoYXM6IGhhczIsIGdldDogZ2V0MiB9ID0gZ2V0UHJvdG8odGFyZ2V0KTtcbiAgbGV0IGhhZEtleSA9IGhhczIuY2FsbCh0YXJnZXQsIGtleSk7XG4gIGlmICghaGFkS2V5KSB7XG4gICAga2V5ID0gdG9SYXcoa2V5KTtcbiAgICBoYWRLZXkgPSBoYXMyLmNhbGwodGFyZ2V0LCBrZXkpO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSk7XG4gIH1cbiAgY29uc3Qgb2xkVmFsdWUgPSBnZXQyID8gZ2V0Mi5jYWxsKHRhcmdldCwga2V5KSA6IHZvaWQgMDtcbiAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0LmRlbGV0ZShrZXkpO1xuICBpZiAoaGFkS2V5KSB7XG4gICAgdHJpZ2dlcih0YXJnZXQsIFwiZGVsZXRlXCIsIGtleSwgdm9pZCAwLCBvbGRWYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICBjb25zdCB0YXJnZXQgPSB0b1Jhdyh0aGlzKTtcbiAgY29uc3QgaGFkSXRlbXMgPSB0YXJnZXQuc2l6ZSAhPT0gMDtcbiAgY29uc3Qgb2xkVGFyZ2V0ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGlzTWFwKHRhcmdldCkgPyBuZXcgTWFwKHRhcmdldCkgOiBuZXcgU2V0KHRhcmdldCkgOiB2b2lkIDA7XG4gIGNvbnN0IHJlc3VsdCA9IHRhcmdldC5jbGVhcigpO1xuICBpZiAoaGFkSXRlbXMpIHtcbiAgICB0cmlnZ2VyKHRhcmdldCwgXCJjbGVhclwiLCB2b2lkIDAsIHZvaWQgMCwgb2xkVGFyZ2V0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlRm9yRWFjaChpc1JlYWRvbmx5MiwgaXNTaGFsbG93Mikge1xuICByZXR1cm4gZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgIGNvbnN0IG9ic2VydmVkID0gdGhpcztcbiAgICBjb25zdCB0YXJnZXQgPSBvYnNlcnZlZFtcIl9fdl9yYXdcIl07XG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdG9SYXcodGFyZ2V0KTtcbiAgICBjb25zdCB3cmFwID0gaXNTaGFsbG93MiA/IHRvU2hhbGxvdyA6IGlzUmVhZG9ubHkyID8gdG9SZWFkb25seSA6IHRvUmVhY3RpdmU7XG4gICAgIWlzUmVhZG9ubHkyICYmIHRyYWNrKHJhd1RhcmdldCwgXCJpdGVyYXRlXCIsIElURVJBVEVfS0VZKTtcbiAgICByZXR1cm4gdGFyZ2V0LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHdyYXAodmFsdWUpLCB3cmFwKGtleSksIG9ic2VydmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgaXNSZWFkb25seTIsIGlzU2hhbGxvdzIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzW1wiX192X3Jhd1wiXTtcbiAgICBjb25zdCByYXdUYXJnZXQgPSB0b1Jhdyh0YXJnZXQpO1xuICAgIGNvbnN0IHRhcmdldElzTWFwID0gaXNNYXAocmF3VGFyZ2V0KTtcbiAgICBjb25zdCBpc1BhaXIgPSBtZXRob2QgPT09IFwiZW50cmllc1wiIHx8IG1ldGhvZCA9PT0gU3ltYm9sLml0ZXJhdG9yICYmIHRhcmdldElzTWFwO1xuICAgIGNvbnN0IGlzS2V5T25seSA9IG1ldGhvZCA9PT0gXCJrZXlzXCIgJiYgdGFyZ2V0SXNNYXA7XG4gICAgY29uc3QgaW5uZXJJdGVyYXRvciA9IHRhcmdldFttZXRob2RdKC4uLmFyZ3MpO1xuICAgIGNvbnN0IHdyYXAgPSBpc1NoYWxsb3cyID8gdG9TaGFsbG93IDogaXNSZWFkb25seTIgPyB0b1JlYWRvbmx5IDogdG9SZWFjdGl2ZTtcbiAgICAhaXNSZWFkb25seTIgJiYgdHJhY2soXG4gICAgICByYXdUYXJnZXQsXG4gICAgICBcIml0ZXJhdGVcIixcbiAgICAgIGlzS2V5T25seSA/IE1BUF9LRVlfSVRFUkFURV9LRVkgOiBJVEVSQVRFX0tFWVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIGl0ZXJhdG9yIHByb3RvY29sXG4gICAgICBuZXh0KCkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBpbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUgPyB7IHZhbHVlLCBkb25lIH0gOiB7XG4gICAgICAgICAgdmFsdWU6IGlzUGFpciA/IFt3cmFwKHZhbHVlWzBdKSwgd3JhcCh2YWx1ZVsxXSldIDogd3JhcCh2YWx1ZSksXG4gICAgICAgICAgZG9uZVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIC8vIGl0ZXJhYmxlIHByb3RvY29sXG4gICAgICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWRvbmx5TWV0aG9kKHR5cGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnc1swXSA/IGBvbiBrZXkgXCIke2FyZ3NbMF19XCIgYCA6IGBgO1xuICAgICAgd2FybihcbiAgICAgICAgYCR7Y2FwaXRhbGl6ZSh0eXBlKX0gb3BlcmF0aW9uICR7a2V5fWZhaWxlZDogdGFyZ2V0IGlzIHJlYWRvbmx5LmAsXG4gICAgICAgIHRvUmF3KHRoaXMpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZSA9PT0gXCJkZWxldGVcIiA/IGZhbHNlIDogdHlwZSA9PT0gXCJjbGVhclwiID8gdm9pZCAwIDogdGhpcztcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvbnMoKSB7XG4gIGNvbnN0IG11dGFibGVJbnN0cnVtZW50YXRpb25zMiA9IHtcbiAgICBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIGtleSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCxcbiAgICBzZXQsXG4gICAgZGVsZXRlOiBkZWxldGVFbnRyeSxcbiAgICBjbGVhcixcbiAgICBmb3JFYWNoOiBjcmVhdGVGb3JFYWNoKGZhbHNlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMyID0ge1xuICAgIGdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywga2V5LCBmYWxzZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgIHJldHVybiBzaXplKHRoaXMpO1xuICAgIH0sXG4gICAgaGFzLFxuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGFkZC5jYWxsKHRoaXMsIHZhbHVlLCB0cnVlKTtcbiAgICB9LFxuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gc2V0LmNhbGwodGhpcywga2V5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIGNsZWFyLFxuICAgIGZvckVhY2g6IGNyZWF0ZUZvckVhY2goZmFsc2UsIHRydWUpXG4gIH07XG4gIGNvbnN0IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCBmYWxzZSlcbiAgfTtcbiAgY29uc3Qgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIgPSB7XG4gICAgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCBrZXksIHRydWUsIHRydWUpO1xuICAgIH0sXG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICByZXR1cm4gc2l6ZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuICAgIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBoYXMuY2FsbCh0aGlzLCBrZXksIHRydWUpO1xuICAgIH0sXG4gICAgYWRkOiBjcmVhdGVSZWFkb25seU1ldGhvZChcImFkZFwiKSxcbiAgICBzZXQ6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwic2V0XCIpLFxuICAgIGRlbGV0ZTogY3JlYXRlUmVhZG9ubHlNZXRob2QoXCJkZWxldGVcIiksXG4gICAgY2xlYXI6IGNyZWF0ZVJlYWRvbmx5TWV0aG9kKFwiY2xlYXJcIiksXG4gICAgZm9yRWFjaDogY3JlYXRlRm9yRWFjaCh0cnVlLCB0cnVlKVxuICB9O1xuICBjb25zdCBpdGVyYXRvck1ldGhvZHMgPSBbXG4gICAgXCJrZXlzXCIsXG4gICAgXCJ2YWx1ZXNcIixcbiAgICBcImVudHJpZXNcIixcbiAgICBTeW1ib2wuaXRlcmF0b3JcbiAgXTtcbiAgaXRlcmF0b3JNZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgIG11dGFibGVJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBmYWxzZSwgZmFsc2UpO1xuICAgIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKG1ldGhvZCwgdHJ1ZSwgZmFsc2UpO1xuICAgIHNoYWxsb3dJbnN0cnVtZW50YXRpb25zMlttZXRob2RdID0gY3JlYXRlSXRlcmFibGVNZXRob2QobWV0aG9kLCBmYWxzZSwgdHJ1ZSk7XG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJbbWV0aG9kXSA9IGNyZWF0ZUl0ZXJhYmxlTWV0aG9kKFxuICAgICAgbWV0aG9kLFxuICAgICAgdHJ1ZSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9KTtcbiAgcmV0dXJuIFtcbiAgICBtdXRhYmxlSW5zdHJ1bWVudGF0aW9uczIsXG4gICAgcmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMixcbiAgICBzaGFsbG93SW5zdHJ1bWVudGF0aW9uczIsXG4gICAgc2hhbGxvd1JlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczJcbiAgXTtcbn1cbmNvbnN0IFtcbiAgbXV0YWJsZUluc3RydW1lbnRhdGlvbnMsXG4gIHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyxcbiAgc2hhbGxvd0luc3RydW1lbnRhdGlvbnMsXG4gIHNoYWxsb3dSZWFkb25seUluc3RydW1lbnRhdGlvbnNcbl0gPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9ucygpO1xuZnVuY3Rpb24gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGlzUmVhZG9ubHkyLCBzaGFsbG93KSB7XG4gIGNvbnN0IGluc3RydW1lbnRhdGlvbnMgPSBzaGFsbG93ID8gaXNSZWFkb25seTIgPyBzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIDogc2hhbGxvd0luc3RydW1lbnRhdGlvbnMgOiBpc1JlYWRvbmx5MiA/IHJlYWRvbmx5SW5zdHJ1bWVudGF0aW9ucyA6IG11dGFibGVJbnN0cnVtZW50YXRpb25zO1xuICByZXR1cm4gKHRhcmdldCwga2V5LCByZWNlaXZlcikgPT4ge1xuICAgIGlmIChrZXkgPT09IFwiX192X2lzUmVhY3RpdmVcIikge1xuICAgICAgcmV0dXJuICFpc1JlYWRvbmx5MjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJfX3ZfaXNSZWFkb25seVwiKSB7XG4gICAgICByZXR1cm4gaXNSZWFkb25seTI7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09IFwiX192X3Jhd1wiKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbiAgICByZXR1cm4gUmVmbGVjdC5nZXQoXG4gICAgICBoYXNPd24oaW5zdHJ1bWVudGF0aW9ucywga2V5KSAmJiBrZXkgaW4gdGFyZ2V0ID8gaW5zdHJ1bWVudGF0aW9ucyA6IHRhcmdldCxcbiAgICAgIGtleSxcbiAgICAgIHJlY2VpdmVyXG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IG11dGFibGVDb2xsZWN0aW9uSGFuZGxlcnMgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIGNyZWF0ZUluc3RydW1lbnRhdGlvbkdldHRlcihmYWxzZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd0NvbGxlY3Rpb25IYW5kbGVycyA9IHtcbiAgZ2V0OiAvKiBAX19QVVJFX18gKi8gY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyKGZhbHNlLCB0cnVlKVxufTtcbmNvbnN0IHJlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgZmFsc2UpXG59O1xuY29uc3Qgc2hhbGxvd1JlYWRvbmx5Q29sbGVjdGlvbkhhbmRsZXJzID0ge1xuICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVJbnN0cnVtZW50YXRpb25HZXR0ZXIodHJ1ZSwgdHJ1ZSlcbn07XG5mdW5jdGlvbiBjaGVja0lkZW50aXR5S2V5cyh0YXJnZXQsIGhhczIsIGtleSkge1xuICBjb25zdCByYXdLZXkgPSB0b1JhdyhrZXkpO1xuICBpZiAocmF3S2V5ICE9PSBrZXkgJiYgaGFzMi5jYWxsKHRhcmdldCwgcmF3S2V5KSkge1xuICAgIGNvbnN0IHR5cGUgPSB0b1Jhd1R5cGUodGFyZ2V0KTtcbiAgICB3YXJuKFxuICAgICAgYFJlYWN0aXZlICR7dHlwZX0gY29udGFpbnMgYm90aCB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBvYmplY3Qke3R5cGUgPT09IGBNYXBgID8gYCBhcyBrZXlzYCA6IGBgfSwgd2hpY2ggY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzLiBBdm9pZCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiB0aGUgcmF3IGFuZCByZWFjdGl2ZSB2ZXJzaW9ucyBvZiBhbiBvYmplY3QgYW5kIG9ubHkgdXNlIHRoZSByZWFjdGl2ZSB2ZXJzaW9uIGlmIHBvc3NpYmxlLmBcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHJlYWN0aXZlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhY3RpdmVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJlYWRvbmx5TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzaGFsbG93UmVhZG9ubHlNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHRhcmdldFR5cGVNYXAocmF3VHlwZSkge1xuICBzd2l0Y2ggKHJhd1R5cGUpIHtcbiAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICByZXR1cm4gMSAvKiBDT01NT04gKi87XG4gICAgY2FzZSBcIk1hcFwiOlxuICAgIGNhc2UgXCJTZXRcIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gMiAvKiBDT0xMRUNUSU9OICovO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMCAvKiBJTlZBTElEICovO1xuICB9XG59XG5mdW5jdGlvbiBnZXRUYXJnZXRUeXBlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVtcIl9fdl9za2lwXCJdIHx8ICFPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSA/IDAgLyogSU5WQUxJRCAqLyA6IHRhcmdldFR5cGVNYXAodG9SYXdUeXBlKHZhbHVlKSk7XG59XG5mdW5jdGlvbiByZWFjdGl2ZSh0YXJnZXQpIHtcbiAgaWYgKGlzUmVhZG9ubHkodGFyZ2V0KSkge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICBmYWxzZSxcbiAgICBtdXRhYmxlSGFuZGxlcnMsXG4gICAgbXV0YWJsZUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICByZWFjdGl2ZU1hcFxuICApO1xufVxuZnVuY3Rpb24gc2hhbGxvd1JlYWN0aXZlKHRhcmdldCkge1xuICByZXR1cm4gY3JlYXRlUmVhY3RpdmVPYmplY3QoXG4gICAgdGFyZ2V0LFxuICAgIGZhbHNlLFxuICAgIHNoYWxsb3dSZWFjdGl2ZUhhbmRsZXJzLFxuICAgIHNoYWxsb3dDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgc2hhbGxvd1JlYWN0aXZlTWFwXG4gICk7XG59XG5mdW5jdGlvbiByZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHJlYWRvbmx5SGFuZGxlcnMsXG4gICAgcmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMsXG4gICAgcmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIHNoYWxsb3dSZWFkb25seSh0YXJnZXQpIHtcbiAgcmV0dXJuIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KFxuICAgIHRhcmdldCxcbiAgICB0cnVlLFxuICAgIHNoYWxsb3dSZWFkb25seUhhbmRsZXJzLFxuICAgIHNoYWxsb3dSZWFkb25seUNvbGxlY3Rpb25IYW5kbGVycyxcbiAgICBzaGFsbG93UmVhZG9ubHlNYXBcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlT2JqZWN0KHRhcmdldCwgaXNSZWFkb25seTIsIGJhc2VIYW5kbGVycywgY29sbGVjdGlvbkhhbmRsZXJzLCBwcm94eU1hcCkge1xuICBpZiAoIWlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgd2FybihcbiAgICAgICAgYHZhbHVlIGNhbm5vdCBiZSBtYWRlICR7aXNSZWFkb25seTIgPyBcInJlYWRvbmx5XCIgOiBcInJlYWN0aXZlXCJ9OiAke1N0cmluZyhcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG4gIGlmICh0YXJnZXRbXCJfX3ZfcmF3XCJdICYmICEoaXNSZWFkb25seTIgJiYgdGFyZ2V0W1wiX192X2lzUmVhY3RpdmVcIl0pKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuICBjb25zdCBleGlzdGluZ1Byb3h5ID0gcHJveHlNYXAuZ2V0KHRhcmdldCk7XG4gIGlmIChleGlzdGluZ1Byb3h5KSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nUHJveHk7XG4gIH1cbiAgY29uc3QgdGFyZ2V0VHlwZSA9IGdldFRhcmdldFR5cGUodGFyZ2V0KTtcbiAgaWYgKHRhcmdldFR5cGUgPT09IDAgLyogSU5WQUxJRCAqLykge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cbiAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkoXG4gICAgdGFyZ2V0LFxuICAgIHRhcmdldFR5cGUgPT09IDIgLyogQ09MTEVDVElPTiAqLyA/IGNvbGxlY3Rpb25IYW5kbGVycyA6IGJhc2VIYW5kbGVyc1xuICApO1xuICBwcm94eU1hcC5zZXQodGFyZ2V0LCBwcm94eSk7XG4gIHJldHVybiBwcm94eTtcbn1cbmZ1bmN0aW9uIGlzUmVhY3RpdmUodmFsdWUpIHtcbiAgaWYgKGlzUmVhZG9ubHkodmFsdWUpKSB7XG4gICAgcmV0dXJuIGlzUmVhY3RpdmUodmFsdWVbXCJfX3ZfcmF3XCJdKTtcbiAgfVxuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNSZWFjdGl2ZVwiXSk7XG59XG5mdW5jdGlvbiBpc1JlYWRvbmx5KHZhbHVlKSB7XG4gIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZVtcIl9fdl9pc1JlYWRvbmx5XCJdKTtcbn1cbmZ1bmN0aW9uIGlzU2hhbGxvdyh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWVbXCJfX3ZfaXNTaGFsbG93XCJdKTtcbn1cbmZ1bmN0aW9uIGlzUHJveHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gISF2YWx1ZVtcIl9fdl9yYXdcIl0gOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHRvUmF3KG9ic2VydmVkKSB7XG4gIGNvbnN0IHJhdyA9IG9ic2VydmVkICYmIG9ic2VydmVkW1wiX192X3Jhd1wiXTtcbiAgcmV0dXJuIHJhdyA/IHRvUmF3KHJhdykgOiBvYnNlcnZlZDtcbn1cbmZ1bmN0aW9uIG1hcmtSYXcodmFsdWUpIHtcbiAgaWYgKCFoYXNPd24odmFsdWUsIFwiX192X3NraXBcIikgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkpIHtcbiAgICBkZWYodmFsdWUsIFwiX192X3NraXBcIiwgdHJ1ZSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuY29uc3QgdG9SZWFjdGl2ZSA9ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpID8gcmVhY3RpdmUodmFsdWUpIDogdmFsdWU7XG5jb25zdCB0b1JlYWRvbmx5ID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgPyByZWFkb25seSh2YWx1ZSkgOiB2YWx1ZTtcblxuZnVuY3Rpb24gaXNSZWYocikge1xuICByZXR1cm4gciA/IHJbXCJfX3ZfaXNSZWZcIl0gPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHJlZih2YWx1ZSkge1xuICByZXR1cm4gY3JlYXRlUmVmKHZhbHVlLCBmYWxzZSk7XG59XG5mdW5jdGlvbiBzaGFsbG93UmVmKHZhbHVlKSB7XG4gIHJldHVybiBjcmVhdGVSZWYodmFsdWUsIHRydWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVmKHJhd1ZhbHVlLCBzaGFsbG93KSB7XG4gIGlmIChpc1JlZihyYXdWYWx1ZSkpIHtcbiAgICByZXR1cm4gcmF3VmFsdWU7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZWZJbXBsKHJhd1ZhbHVlLCBzaGFsbG93KTtcbn1cbmNsYXNzIFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSwgaXNTaGFsbG93Mikge1xuICAgIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWZcIl0gPSB0cnVlO1xuICAgIHRoaXNbXCJfX3ZfaXNTaGFsbG93XCJdID0gZmFsc2U7XG4gICAgdGhpcy5fcmF3VmFsdWUgPSBpc1NoYWxsb3cyID8gdmFsdWUgOiB0b1Jhdyh2YWx1ZSk7XG4gICAgdGhpcy5fdmFsdWUgPSBpc1NoYWxsb3cyID8gdmFsdWUgOiB0b1JlYWN0aXZlKHZhbHVlKTtcbiAgICB0aGlzW1wiX192X2lzU2hhbGxvd1wiXSA9IGlzU2hhbGxvdzI7XG4gIH1cbiAgZ2V0IHZhbHVlKCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0aGlzLmRlcC50cmFjayh7XG4gICAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgICAgdHlwZTogXCJnZXRcIixcbiAgICAgICAga2V5OiBcInZhbHVlXCJcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlcC50cmFjaygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9yYXdWYWx1ZTtcbiAgICBjb25zdCB1c2VEaXJlY3RWYWx1ZSA9IHRoaXNbXCJfX3ZfaXNTaGFsbG93XCJdIHx8IGlzU2hhbGxvdyhuZXdWYWx1ZSkgfHwgaXNSZWFkb25seShuZXdWYWx1ZSk7XG4gICAgbmV3VmFsdWUgPSB1c2VEaXJlY3RWYWx1ZSA/IG5ld1ZhbHVlIDogdG9SYXcobmV3VmFsdWUpO1xuICAgIGlmIChoYXNDaGFuZ2VkKG5ld1ZhbHVlLCBvbGRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLl92YWx1ZSA9IHVzZURpcmVjdFZhbHVlID8gbmV3VmFsdWUgOiB0b1JlYWN0aXZlKG5ld1ZhbHVlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRoaXMuZGVwLnRyaWdnZXIoe1xuICAgICAgICAgIHRhcmdldDogdGhpcyxcbiAgICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICAgIGtleTogXCJ2YWx1ZVwiLFxuICAgICAgICAgIG5ld1ZhbHVlLFxuICAgICAgICAgIG9sZFZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZXAudHJpZ2dlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdHJpZ2dlclJlZihyZWYyKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgcmVmMi5kZXAudHJpZ2dlcih7XG4gICAgICB0YXJnZXQ6IHJlZjIsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAga2V5OiBcInZhbHVlXCIsXG4gICAgICBuZXdWYWx1ZTogcmVmMi5fdmFsdWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZWYyLmRlcC50cmlnZ2VyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVucmVmKHJlZjIpIHtcbiAgcmV0dXJuIGlzUmVmKHJlZjIpID8gcmVmMi52YWx1ZSA6IHJlZjI7XG59XG5mdW5jdGlvbiB0b1ZhbHVlKHNvdXJjZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihzb3VyY2UpID8gc291cmNlKCkgOiB1bnJlZihzb3VyY2UpO1xufVxuY29uc3Qgc2hhbGxvd1Vud3JhcEhhbmRsZXJzID0ge1xuICBnZXQ6ICh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpID0+IGtleSA9PT0gXCJfX3ZfcmF3XCIgPyB0YXJnZXQgOiB1bnJlZihSZWZsZWN0LmdldCh0YXJnZXQsIGtleSwgcmVjZWl2ZXIpKSxcbiAgc2V0OiAodGFyZ2V0LCBrZXksIHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFyZ2V0W2tleV07XG4gICAgaWYgKGlzUmVmKG9sZFZhbHVlKSAmJiAhaXNSZWYodmFsdWUpKSB7XG4gICAgICBvbGRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBSZWZsZWN0LnNldCh0YXJnZXQsIGtleSwgdmFsdWUsIHJlY2VpdmVyKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBwcm94eVJlZnMob2JqZWN0V2l0aFJlZnMpIHtcbiAgcmV0dXJuIGlzUmVhY3RpdmUob2JqZWN0V2l0aFJlZnMpID8gb2JqZWN0V2l0aFJlZnMgOiBuZXcgUHJveHkob2JqZWN0V2l0aFJlZnMsIHNoYWxsb3dVbndyYXBIYW5kbGVycyk7XG59XG5jbGFzcyBDdXN0b21SZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoZmFjdG9yeSkge1xuICAgIHRoaXNbXCJfX3ZfaXNSZWZcIl0gPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICAgIGNvbnN0IGRlcCA9IHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICAgIGNvbnN0IHsgZ2V0LCBzZXQgfSA9IGZhY3RvcnkoZGVwLnRyYWNrLmJpbmQoZGVwKSwgZGVwLnRyaWdnZXIuYmluZChkZXApKTtcbiAgICB0aGlzLl9nZXQgPSBnZXQ7XG4gICAgdGhpcy5fc2V0ID0gc2V0O1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPSB0aGlzLl9nZXQoKTtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fc2V0KG5ld1ZhbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGN1c3RvbVJlZihmYWN0b3J5KSB7XG4gIHJldHVybiBuZXcgQ3VzdG9tUmVmSW1wbChmYWN0b3J5KTtcbn1cbmZ1bmN0aW9uIHRvUmVmcyhvYmplY3QpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzUHJveHkob2JqZWN0KSkge1xuICAgIHdhcm4oYHRvUmVmcygpIGV4cGVjdHMgYSByZWFjdGl2ZSBvYmplY3QgYnV0IHJlY2VpdmVkIGEgcGxhaW4gb25lLmApO1xuICB9XG4gIGNvbnN0IHJldCA9IGlzQXJyYXkob2JqZWN0KSA/IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKSA6IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICByZXRba2V5XSA9IHByb3BlcnR5VG9SZWYob2JqZWN0LCBrZXkpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5jbGFzcyBPYmplY3RSZWZJbXBsIHtcbiAgY29uc3RydWN0b3IoX29iamVjdCwgX2tleSwgX2RlZmF1bHRWYWx1ZSkge1xuICAgIHRoaXMuX29iamVjdCA9IF9vYmplY3Q7XG4gICAgdGhpcy5fa2V5ID0gX2tleTtcbiAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBfZGVmYXVsdFZhbHVlO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWZcIl0gPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9vYmplY3RbdGhpcy5fa2V5XTtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPSB2YWwgPT09IHZvaWQgMCA/IHRoaXMuX2RlZmF1bHRWYWx1ZSA6IHZhbDtcbiAgfVxuICBzZXQgdmFsdWUobmV3VmFsKSB7XG4gICAgdGhpcy5fb2JqZWN0W3RoaXMuX2tleV0gPSBuZXdWYWw7XG4gIH1cbiAgZ2V0IGRlcCgpIHtcbiAgICByZXR1cm4gZ2V0RGVwRnJvbVJlYWN0aXZlKHRvUmF3KHRoaXMuX29iamVjdCksIHRoaXMuX2tleSk7XG4gIH1cbn1cbmNsYXNzIEdldHRlclJlZkltcGwge1xuICBjb25zdHJ1Y3RvcihfZ2V0dGVyKSB7XG4gICAgdGhpcy5fZ2V0dGVyID0gX2dldHRlcjtcbiAgICB0aGlzW1wiX192X2lzUmVmXCJdID0gdHJ1ZTtcbiAgICB0aGlzW1wiX192X2lzUmVhZG9ubHlcIl0gPSB0cnVlO1xuICAgIHRoaXMuX3ZhbHVlID0gdm9pZCAwO1xuICB9XG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgPSB0aGlzLl9nZXR0ZXIoKTtcbiAgfVxufVxuZnVuY3Rpb24gdG9SZWYoc291cmNlLCBrZXksIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAoaXNSZWYoc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihzb3VyY2UpKSB7XG4gICAgcmV0dXJuIG5ldyBHZXR0ZXJSZWZJbXBsKHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3Qoc291cmNlKSAmJiBhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBwcm9wZXJ0eVRvUmVmKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWYoc291cmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJvcGVydHlUb1JlZihzb3VyY2UsIGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gIGNvbnN0IHZhbCA9IHNvdXJjZVtrZXldO1xuICByZXR1cm4gaXNSZWYodmFsKSA/IHZhbCA6IG5ldyBPYmplY3RSZWZJbXBsKHNvdXJjZSwga2V5LCBkZWZhdWx0VmFsdWUpO1xufVxuXG5jbGFzcyBDb21wdXRlZFJlZkltcGwge1xuICBjb25zdHJ1Y3Rvcihmbiwgc2V0dGVyLCBpc1NTUikge1xuICAgIHRoaXMuZm4gPSBmbjtcbiAgICB0aGlzLnNldHRlciA9IHNldHRlcjtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLl92YWx1ZSA9IHZvaWQgMDtcbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB0aGlzLmRlcCA9IG5ldyBEZXAodGhpcyk7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fX3ZfaXNSZWYgPSB0cnVlO1xuICAgIC8vIFRPRE8gaXNvbGF0ZWREZWNsYXJhdGlvbnMgXCJfX3ZfaXNSZWFkb25seVwiXG4gICAgLy8gQSBjb21wdXRlZCBpcyBhbHNvIGEgc3Vic2NyaWJlciB0aGF0IHRyYWNrcyBvdGhlciBkZXBzXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5kZXBzID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZGVwc1RhaWwgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5mbGFncyA9IDE2O1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuZ2xvYmFsVmVyc2lvbiA9IGdsb2JhbFZlcnNpb24gLSAxO1xuICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgdGhpcy5lZmZlY3QgPSB0aGlzO1xuICAgIHRoaXNbXCJfX3ZfaXNSZWFkb25seVwiXSA9ICFzZXR0ZXI7XG4gICAgdGhpcy5pc1NTUiA9IGlzU1NSO1xuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG5vdGlmeSgpIHtcbiAgICB0aGlzLmZsYWdzIHw9IDE2O1xuICAgIGlmICghKHRoaXMuZmxhZ3MgJiA4KSAmJiAvLyBhdm9pZCBpbmZpbml0ZSBzZWxmIHJlY3Vyc2lvblxuICAgIGFjdGl2ZVN1YiAhPT0gdGhpcykge1xuICAgICAgYmF0Y2godGhpcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIDtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgY29uc3QgbGluayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB0aGlzLmRlcC50cmFjayh7XG4gICAgICB0YXJnZXQ6IHRoaXMsXG4gICAgICB0eXBlOiBcImdldFwiLFxuICAgICAga2V5OiBcInZhbHVlXCJcbiAgICB9KSA6IHRoaXMuZGVwLnRyYWNrKCk7XG4gICAgcmVmcmVzaENvbXB1dGVkKHRoaXMpO1xuICAgIGlmIChsaW5rKSB7XG4gICAgICBsaW5rLnZlcnNpb24gPSB0aGlzLmRlcC52ZXJzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7XG4gICAgaWYgKHRoaXMuc2V0dGVyKSB7XG4gICAgICB0aGlzLnNldHRlcihuZXdWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuKFwiV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgdmFsdWUgaXMgcmVhZG9ubHlcIik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjb21wdXRlZChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNTU1IgPSBmYWxzZSkge1xuICBsZXQgZ2V0dGVyO1xuICBsZXQgc2V0dGVyO1xuICBpZiAoaXNGdW5jdGlvbihnZXR0ZXJPck9wdGlvbnMpKSB7XG4gICAgZ2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGdldHRlciA9IGdldHRlck9yT3B0aW9ucy5nZXQ7XG4gICAgc2V0dGVyID0gZ2V0dGVyT3JPcHRpb25zLnNldDtcbiAgfVxuICBjb25zdCBjUmVmID0gbmV3IENvbXB1dGVkUmVmSW1wbChnZXR0ZXIsIHNldHRlciwgaXNTU1IpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBkZWJ1Z09wdGlvbnMgJiYgIWlzU1NSKSB7XG4gICAgY1JlZi5vblRyYWNrID0gZGVidWdPcHRpb25zLm9uVHJhY2s7XG4gICAgY1JlZi5vblRyaWdnZXIgPSBkZWJ1Z09wdGlvbnMub25UcmlnZ2VyO1xuICB9XG4gIHJldHVybiBjUmVmO1xufVxuXG5jb25zdCBUcmFja09wVHlwZXMgPSB7XG4gIFwiR0VUXCI6IFwiZ2V0XCIsXG4gIFwiSEFTXCI6IFwiaGFzXCIsXG4gIFwiSVRFUkFURVwiOiBcIml0ZXJhdGVcIlxufTtcbmNvbnN0IFRyaWdnZXJPcFR5cGVzID0ge1xuICBcIlNFVFwiOiBcInNldFwiLFxuICBcIkFERFwiOiBcImFkZFwiLFxuICBcIkRFTEVURVwiOiBcImRlbGV0ZVwiLFxuICBcIkNMRUFSXCI6IFwiY2xlYXJcIlxufTtcbmNvbnN0IFJlYWN0aXZlRmxhZ3MgPSB7XG4gIFwiU0tJUFwiOiBcIl9fdl9za2lwXCIsXG4gIFwiSVNfUkVBQ1RJVkVcIjogXCJfX3ZfaXNSZWFjdGl2ZVwiLFxuICBcIklTX1JFQURPTkxZXCI6IFwiX192X2lzUmVhZG9ubHlcIixcbiAgXCJJU19TSEFMTE9XXCI6IFwiX192X2lzU2hhbGxvd1wiLFxuICBcIlJBV1wiOiBcIl9fdl9yYXdcIixcbiAgXCJJU19SRUZcIjogXCJfX3ZfaXNSZWZcIlxufTtcblxuY29uc3QgV2F0Y2hFcnJvckNvZGVzID0ge1xuICBcIldBVENIX0dFVFRFUlwiOiAyLFxuICBcIjJcIjogXCJXQVRDSF9HRVRURVJcIixcbiAgXCJXQVRDSF9DQUxMQkFDS1wiOiAzLFxuICBcIjNcIjogXCJXQVRDSF9DQUxMQkFDS1wiLFxuICBcIldBVENIX0NMRUFOVVBcIjogNCxcbiAgXCI0XCI6IFwiV0FUQ0hfQ0xFQU5VUFwiXG59O1xuY29uc3QgSU5JVElBTF9XQVRDSEVSX1ZBTFVFID0ge307XG5jb25zdCBjbGVhbnVwTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5sZXQgYWN0aXZlV2F0Y2hlciA9IHZvaWQgMDtcbmZ1bmN0aW9uIGdldEN1cnJlbnRXYXRjaGVyKCkge1xuICByZXR1cm4gYWN0aXZlV2F0Y2hlcjtcbn1cbmZ1bmN0aW9uIG9uV2F0Y2hlckNsZWFudXAoY2xlYW51cEZuLCBmYWlsU2lsZW50bHkgPSBmYWxzZSwgb3duZXIgPSBhY3RpdmVXYXRjaGVyKSB7XG4gIGlmIChvd25lcikge1xuICAgIGxldCBjbGVhbnVwcyA9IGNsZWFudXBNYXAuZ2V0KG93bmVyKTtcbiAgICBpZiAoIWNsZWFudXBzKSBjbGVhbnVwTWFwLnNldChvd25lciwgY2xlYW51cHMgPSBbXSk7XG4gICAgY2xlYW51cHMucHVzaChjbGVhbnVwRm4pO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWZhaWxTaWxlbnRseSkge1xuICAgIHdhcm4oXG4gICAgICBgb25XYXRjaGVyQ2xlYW51cCgpIHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgbm8gYWN0aXZlIHdhdGNoZXIgdG8gYXNzb2NpYXRlIHdpdGguYFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhdGNoKHNvdXJjZSwgY2IsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgeyBpbW1lZGlhdGUsIGRlZXAsIG9uY2UsIHNjaGVkdWxlciwgYXVnbWVudEpvYiwgY2FsbCB9ID0gb3B0aW9ucztcbiAgY29uc3Qgd2FybkludmFsaWRTb3VyY2UgPSAocykgPT4ge1xuICAgIChvcHRpb25zLm9uV2FybiB8fCB3YXJuKShcbiAgICAgIGBJbnZhbGlkIHdhdGNoIHNvdXJjZTogYCxcbiAgICAgIHMsXG4gICAgICBgQSB3YXRjaCBzb3VyY2UgY2FuIG9ubHkgYmUgYSBnZXR0ZXIvZWZmZWN0IGZ1bmN0aW9uLCBhIHJlZiwgYSByZWFjdGl2ZSBvYmplY3QsIG9yIGFuIGFycmF5IG9mIHRoZXNlIHR5cGVzLmBcbiAgICApO1xuICB9O1xuICBjb25zdCByZWFjdGl2ZUdldHRlciA9IChzb3VyY2UyKSA9PiB7XG4gICAgaWYgKGRlZXApIHJldHVybiBzb3VyY2UyO1xuICAgIGlmIChpc1NoYWxsb3coc291cmNlMikgfHwgZGVlcCA9PT0gZmFsc2UgfHwgZGVlcCA9PT0gMClcbiAgICAgIHJldHVybiB0cmF2ZXJzZShzb3VyY2UyLCAxKTtcbiAgICByZXR1cm4gdHJhdmVyc2Uoc291cmNlMik7XG4gIH07XG4gIGxldCBlZmZlY3Q7XG4gIGxldCBnZXR0ZXI7XG4gIGxldCBjbGVhbnVwO1xuICBsZXQgYm91bmRDbGVhbnVwO1xuICBsZXQgZm9yY2VUcmlnZ2VyID0gZmFsc2U7XG4gIGxldCBpc011bHRpU291cmNlID0gZmFsc2U7XG4gIGlmIChpc1JlZihzb3VyY2UpKSB7XG4gICAgZ2V0dGVyID0gKCkgPT4gc291cmNlLnZhbHVlO1xuICAgIGZvcmNlVHJpZ2dlciA9IGlzU2hhbGxvdyhzb3VyY2UpO1xuICB9IGVsc2UgaWYgKGlzUmVhY3RpdmUoc291cmNlKSkge1xuICAgIGdldHRlciA9ICgpID0+IHJlYWN0aXZlR2V0dGVyKHNvdXJjZSk7XG4gICAgZm9yY2VUcmlnZ2VyID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHNvdXJjZSkpIHtcbiAgICBpc011bHRpU291cmNlID0gdHJ1ZTtcbiAgICBmb3JjZVRyaWdnZXIgPSBzb3VyY2Uuc29tZSgocykgPT4gaXNSZWFjdGl2ZShzKSB8fCBpc1NoYWxsb3cocykpO1xuICAgIGdldHRlciA9ICgpID0+IHNvdXJjZS5tYXAoKHMpID0+IHtcbiAgICAgIGlmIChpc1JlZihzKSkge1xuICAgICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFjdGl2ZShzKSkge1xuICAgICAgICByZXR1cm4gcmVhY3RpdmVHZXR0ZXIocyk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24ocykpIHtcbiAgICAgICAgcmV0dXJuIGNhbGwgPyBjYWxsKHMsIDIpIDogcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuSW52YWxpZFNvdXJjZShzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGdldHRlciA9IGNhbGwgPyAoKSA9PiBjYWxsKHNvdXJjZSwgMikgOiBzb3VyY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldHRlciA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50RWZmZWN0ID0gYWN0aXZlV2F0Y2hlcjtcbiAgICAgICAgYWN0aXZlV2F0Y2hlciA9IGVmZmVjdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gY2FsbCA/IGNhbGwoc291cmNlLCAzLCBbYm91bmRDbGVhbnVwXSkgOiBzb3VyY2UoYm91bmRDbGVhbnVwKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhY3RpdmVXYXRjaGVyID0gY3VycmVudEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZ2V0dGVyID0gTk9PUDtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm5JbnZhbGlkU291cmNlKHNvdXJjZSk7XG4gIH1cbiAgaWYgKGNiICYmIGRlZXApIHtcbiAgICBjb25zdCBiYXNlR2V0dGVyID0gZ2V0dGVyO1xuICAgIGNvbnN0IGRlcHRoID0gZGVlcCA9PT0gdHJ1ZSA/IEluZmluaXR5IDogZGVlcDtcbiAgICBnZXR0ZXIgPSAoKSA9PiB0cmF2ZXJzZShiYXNlR2V0dGVyKCksIGRlcHRoKTtcbiAgfVxuICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRTY29wZSgpO1xuICBjb25zdCB3YXRjaEhhbmRsZSA9ICgpID0+IHtcbiAgICBlZmZlY3Quc3RvcCgpO1xuICAgIGlmIChzY29wZSkge1xuICAgICAgcmVtb3ZlKHNjb3BlLmVmZmVjdHMsIGVmZmVjdCk7XG4gICAgfVxuICB9O1xuICBpZiAob25jZSAmJiBjYikge1xuICAgIGNvbnN0IF9jYiA9IGNiO1xuICAgIGNiID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIF9jYiguLi5hcmdzKTtcbiAgICAgIHdhdGNoSGFuZGxlKCk7XG4gICAgfTtcbiAgfVxuICBsZXQgb2xkVmFsdWUgPSBpc011bHRpU291cmNlID8gbmV3IEFycmF5KHNvdXJjZS5sZW5ndGgpLmZpbGwoSU5JVElBTF9XQVRDSEVSX1ZBTFVFKSA6IElOSVRJQUxfV0FUQ0hFUl9WQUxVRTtcbiAgY29uc3Qgam9iID0gKGltbWVkaWF0ZUZpcnN0UnVuKSA9PiB7XG4gICAgaWYgKCEoZWZmZWN0LmZsYWdzICYgMSkgfHwgIWVmZmVjdC5kaXJ0eSAmJiAhaW1tZWRpYXRlRmlyc3RSdW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNiKSB7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICAgIGlmIChkZWVwIHx8IGZvcmNlVHJpZ2dlciB8fCAoaXNNdWx0aVNvdXJjZSA/IG5ld1ZhbHVlLnNvbWUoKHYsIGkpID0+IGhhc0NoYW5nZWQodiwgb2xkVmFsdWVbaV0pKSA6IGhhc0NoYW5nZWQobmV3VmFsdWUsIG9sZFZhbHVlKSkpIHtcbiAgICAgICAgaWYgKGNsZWFudXApIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3VycmVudFdhdGNoZXIgPSBhY3RpdmVXYXRjaGVyO1xuICAgICAgICBhY3RpdmVXYXRjaGVyID0gZWZmZWN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICAgICBuZXdWYWx1ZSxcbiAgICAgICAgICAgIC8vIHBhc3MgdW5kZWZpbmVkIGFzIHRoZSBvbGQgdmFsdWUgd2hlbiBpdCdzIGNoYW5nZWQgZm9yIHRoZSBmaXJzdCB0aW1lXG4gICAgICAgICAgICBvbGRWYWx1ZSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gdm9pZCAwIDogaXNNdWx0aVNvdXJjZSAmJiBvbGRWYWx1ZVswXSA9PT0gSU5JVElBTF9XQVRDSEVSX1ZBTFVFID8gW10gOiBvbGRWYWx1ZSxcbiAgICAgICAgICAgIGJvdW5kQ2xlYW51cFxuICAgICAgICAgIF07XG4gICAgICAgICAgY2FsbCA/IGNhbGwoY2IsIDMsIGFyZ3MpIDogKFxuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgY2IoLi4uYXJncylcbiAgICAgICAgICApO1xuICAgICAgICAgIG9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlV2F0Y2hlciA9IGN1cnJlbnRXYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH07XG4gIGlmIChhdWdtZW50Sm9iKSB7XG4gICAgYXVnbWVudEpvYihqb2IpO1xuICB9XG4gIGVmZmVjdCA9IG5ldyBSZWFjdGl2ZUVmZmVjdChnZXR0ZXIpO1xuICBlZmZlY3Quc2NoZWR1bGVyID0gc2NoZWR1bGVyID8gKCkgPT4gc2NoZWR1bGVyKGpvYiwgZmFsc2UpIDogam9iO1xuICBib3VuZENsZWFudXAgPSAoZm4pID0+IG9uV2F0Y2hlckNsZWFudXAoZm4sIGZhbHNlLCBlZmZlY3QpO1xuICBjbGVhbnVwID0gZWZmZWN0Lm9uU3RvcCA9ICgpID0+IHtcbiAgICBjb25zdCBjbGVhbnVwcyA9IGNsZWFudXBNYXAuZ2V0KGVmZmVjdCk7XG4gICAgaWYgKGNsZWFudXBzKSB7XG4gICAgICBpZiAoY2FsbCkge1xuICAgICAgICBjYWxsKGNsZWFudXBzLCA0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgY2xlYW51cDIgb2YgY2xlYW51cHMpIGNsZWFudXAyKCk7XG4gICAgICB9XG4gICAgICBjbGVhbnVwTWFwLmRlbGV0ZShlZmZlY3QpO1xuICAgIH1cbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBlZmZlY3Qub25UcmFjayA9IG9wdGlvbnMub25UcmFjaztcbiAgICBlZmZlY3Qub25UcmlnZ2VyID0gb3B0aW9ucy5vblRyaWdnZXI7XG4gIH1cbiAgaWYgKGNiKSB7XG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgam9iKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvbGRWYWx1ZSA9IGVmZmVjdC5ydW4oKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2NoZWR1bGVyKSB7XG4gICAgc2NoZWR1bGVyKGpvYi5iaW5kKG51bGwsIHRydWUpLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBlZmZlY3QucnVuKCk7XG4gIH1cbiAgd2F0Y2hIYW5kbGUucGF1c2UgPSBlZmZlY3QucGF1c2UuYmluZChlZmZlY3QpO1xuICB3YXRjaEhhbmRsZS5yZXN1bWUgPSBlZmZlY3QucmVzdW1lLmJpbmQoZWZmZWN0KTtcbiAgd2F0Y2hIYW5kbGUuc3RvcCA9IHdhdGNoSGFuZGxlO1xuICByZXR1cm4gd2F0Y2hIYW5kbGU7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZSh2YWx1ZSwgZGVwdGggPSBJbmZpbml0eSwgc2Vlbikge1xuICBpZiAoZGVwdGggPD0gMCB8fCAhaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlW1wiX192X3NraXBcIl0pIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgaWYgKHNlZW4uaGFzKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBzZWVuLmFkZCh2YWx1ZSk7XG4gIGRlcHRoLS07XG4gIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZS52YWx1ZSwgZGVwdGgsIHNlZW4pO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdHJhdmVyc2UodmFsdWVbaV0sIGRlcHRoLCBzZWVuKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZXQodmFsdWUpIHx8IGlzTWFwKHZhbHVlKSkge1xuICAgIHZhbHVlLmZvckVhY2goKHYpID0+IHtcbiAgICAgIHRyYXZlcnNlKHYsIGRlcHRoLCBzZWVuKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZVtrZXldLCBkZXB0aCwgc2Vlbik7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModmFsdWUpKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIHRyYXZlcnNlKHZhbHVlW2tleV0sIGRlcHRoLCBzZWVuKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgeyBBUlJBWV9JVEVSQVRFX0tFWSwgRWZmZWN0RmxhZ3MsIEVmZmVjdFNjb3BlLCBJVEVSQVRFX0tFWSwgTUFQX0tFWV9JVEVSQVRFX0tFWSwgUmVhY3RpdmVFZmZlY3QsIFJlYWN0aXZlRmxhZ3MsIFRyYWNrT3BUeXBlcywgVHJpZ2dlck9wVHlwZXMsIFdhdGNoRXJyb3JDb2RlcywgY29tcHV0ZWQsIGN1c3RvbVJlZiwgZWZmZWN0LCBlZmZlY3RTY29wZSwgZW5hYmxlVHJhY2tpbmcsIGdldEN1cnJlbnRTY29wZSwgZ2V0Q3VycmVudFdhdGNoZXIsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uRWZmZWN0Q2xlYW51cCwgb25TY29wZURpc3Bvc2UsIG9uV2F0Y2hlckNsZWFudXAsIHBhdXNlVHJhY2tpbmcsIHByb3h5UmVmcywgcmVhY3RpdmUsIHJlYWN0aXZlUmVhZEFycmF5LCByZWFkb25seSwgcmVmLCByZXNldFRyYWNraW5nLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkQXJyYXksIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVhY3RpdmUsIHRvUmVhZG9ubHksIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyYWNrLCB0cmF2ZXJzZSwgdHJpZ2dlciwgdHJpZ2dlclJlZiwgdW5yZWYsIHdhdGNoIH07XG4iLCIvKipcbiogQHZ1ZS9ydW50aW1lLWNvcmUgdjMuNS42XG4qIChjKSAyMDE4LXByZXNlbnQgWXV4aSAoRXZhbikgWW91IGFuZCBWdWUgY29udHJpYnV0b3JzXG4qIEBsaWNlbnNlIE1JVFxuKiovXG5pbXBvcnQgeyBwYXVzZVRyYWNraW5nLCByZXNldFRyYWNraW5nLCBpc1JlZiwgdG9SYXcsIHRyYXZlcnNlLCBzaGFsbG93UmVmLCByZWFkb25seSwgaXNSZWFjdGl2ZSwgcmVmLCBpc1NoYWxsb3csIHNoYWxsb3dSZWFkQXJyYXksIHRvUmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgdHJhY2ssIHJlYWN0aXZlLCBzaGFsbG93UmVhY3RpdmUsIHRyaWdnZXIsIFJlYWN0aXZlRWZmZWN0LCB3YXRjaCBhcyB3YXRjaCQxLCBjdXN0b21SZWYsIGlzUHJveHksIHByb3h5UmVmcywgbWFya1JhdywgRWZmZWN0U2NvcGUsIGNvbXB1dGVkIGFzIGNvbXB1dGVkJDEsIGlzUmVhZG9ubHkgfSBmcm9tICdAdnVlL3JlYWN0aXZpdHknO1xuZXhwb3J0IHsgRWZmZWN0U2NvcGUsIFJlYWN0aXZlRWZmZWN0LCBUcmFja09wVHlwZXMsIFRyaWdnZXJPcFR5cGVzLCBjdXN0b21SZWYsIGVmZmVjdCwgZWZmZWN0U2NvcGUsIGdldEN1cnJlbnRTY29wZSwgZ2V0Q3VycmVudFdhdGNoZXIsIGlzUHJveHksIGlzUmVhY3RpdmUsIGlzUmVhZG9ubHksIGlzUmVmLCBpc1NoYWxsb3csIG1hcmtSYXcsIG9uU2NvcGVEaXNwb3NlLCBvbldhdGNoZXJDbGVhbnVwLCBwcm94eVJlZnMsIHJlYWN0aXZlLCByZWFkb25seSwgcmVmLCBzaGFsbG93UmVhY3RpdmUsIHNoYWxsb3dSZWFkb25seSwgc2hhbGxvd1JlZiwgc3RvcCwgdG9SYXcsIHRvUmVmLCB0b1JlZnMsIHRvVmFsdWUsIHRyaWdnZXJSZWYsIHVucmVmIH0gZnJvbSAnQHZ1ZS9yZWFjdGl2aXR5JztcbmltcG9ydCB7IGlzU3RyaW5nLCBpc0Z1bmN0aW9uLCBpc1Byb21pc2UsIGlzQXJyYXksIEVNUFRZX09CSiwgTk9PUCwgZ2V0R2xvYmFsVGhpcywgZXh0ZW5kLCBpc0J1aWx0SW5EaXJlY3RpdmUsIGhhc093biwgcmVtb3ZlLCBkZWYsIGlzT24sIGlzUmVzZXJ2ZWRQcm9wLCBub3JtYWxpemVDbGFzcywgc3RyaW5naWZ5U3R5bGUsIG5vcm1hbGl6ZVN0eWxlLCBpc0tub3duU3ZnQXR0ciwgaXNCb29sZWFuQXR0ciwgaXNLbm93bkh0bWxBdHRyLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzUmVuZGVyYWJsZUF0dHJWYWx1ZSwgZ2V0RXNjYXBlZENzc1Zhck5hbWUsIGlzT2JqZWN0LCBpc1JlZ0V4cCwgaW52b2tlQXJyYXlGbnMsIHRvSGFuZGxlcktleSwgY2FwaXRhbGl6ZSwgY2FtZWxpemUsIGlzR2xvYmFsbHlBbGxvd2VkLCBOTywgaHlwaGVuYXRlLCBFTVBUWV9BUlIsIHRvUmF3VHlwZSwgbWFrZU1hcCwgaGFzQ2hhbmdlZCwgbG9vc2VUb051bWJlciwgaXNNb2RlbExpc3RlbmVyLCB0b051bWJlciB9IGZyb20gJ0B2dWUvc2hhcmVkJztcbmV4cG9ydCB7IGNhbWVsaXplLCBjYXBpdGFsaXplLCBub3JtYWxpemVDbGFzcywgbm9ybWFsaXplUHJvcHMsIG5vcm1hbGl6ZVN0eWxlLCB0b0Rpc3BsYXlTdHJpbmcsIHRvSGFuZGxlcktleSB9IGZyb20gJ0B2dWUvc2hhcmVkJztcblxuY29uc3Qgc3RhY2sgPSBbXTtcbmZ1bmN0aW9uIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZSkge1xuICBzdGFjay5wdXNoKHZub2RlKTtcbn1cbmZ1bmN0aW9uIHBvcFdhcm5pbmdDb250ZXh0KCkge1xuICBzdGFjay5wb3AoKTtcbn1cbmxldCBpc1dhcm5pbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIHdhcm4kMShtc2csIC4uLmFyZ3MpIHtcbiAgaWYgKGlzV2FybmluZykgcmV0dXJuO1xuICBpc1dhcm5pbmcgPSB0cnVlO1xuICBwYXVzZVRyYWNraW5nKCk7XG4gIGNvbnN0IGluc3RhbmNlID0gc3RhY2subGVuZ3RoID8gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0uY29tcG9uZW50IDogbnVsbDtcbiAgY29uc3QgYXBwV2FybkhhbmRsZXIgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy53YXJuSGFuZGxlcjtcbiAgY29uc3QgdHJhY2UgPSBnZXRDb21wb25lbnRUcmFjZSgpO1xuICBpZiAoYXBwV2FybkhhbmRsZXIpIHtcbiAgICBjYWxsV2l0aEVycm9ySGFuZGxpbmcoXG4gICAgICBhcHBXYXJuSGFuZGxlcixcbiAgICAgIGluc3RhbmNlLFxuICAgICAgMTEsXG4gICAgICBbXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICBtc2cgKyBhcmdzLm1hcCgoYSkgPT4ge1xuICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgcmV0dXJuIChfYiA9IChfYSA9IGEudG9TdHJpbmcpID09IG51bGwgPyB2b2lkIDAgOiBfYS5jYWxsKGEpKSAhPSBudWxsID8gX2IgOiBKU09OLnN0cmluZ2lmeShhKTtcbiAgICAgICAgfSkuam9pbihcIlwiKSxcbiAgICAgICAgaW5zdGFuY2UgJiYgaW5zdGFuY2UucHJveHksXG4gICAgICAgIHRyYWNlLm1hcChcbiAgICAgICAgICAoeyB2bm9kZSB9KSA9PiBgYXQgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgdm5vZGUudHlwZSl9PmBcbiAgICAgICAgKS5qb2luKFwiXFxuXCIpLFxuICAgICAgICB0cmFjZVxuICAgICAgXVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgd2FybkFyZ3MgPSBbYFtWdWUgd2Fybl06ICR7bXNnfWAsIC4uLmFyZ3NdO1xuICAgIGlmICh0cmFjZS5sZW5ndGggJiYgLy8gYXZvaWQgc3BhbW1pbmcgY29uc29sZSBkdXJpbmcgdGVzdHNcbiAgICB0cnVlKSB7XG4gICAgICB3YXJuQXJncy5wdXNoKGBcbmAsIC4uLmZvcm1hdFRyYWNlKHRyYWNlKSk7XG4gICAgfVxuICAgIGNvbnNvbGUud2FybiguLi53YXJuQXJncyk7XG4gIH1cbiAgcmVzZXRUcmFja2luZygpO1xuICBpc1dhcm5pbmcgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFRyYWNlKCkge1xuICBsZXQgY3VycmVudFZOb2RlID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gIGlmICghY3VycmVudFZOb2RlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9IFtdO1xuICB3aGlsZSAoY3VycmVudFZOb2RlKSB7XG4gICAgY29uc3QgbGFzdCA9IG5vcm1hbGl6ZWRTdGFja1swXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LnZub2RlID09PSBjdXJyZW50Vk5vZGUpIHtcbiAgICAgIGxhc3QucmVjdXJzZUNvdW50Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZWRTdGFjay5wdXNoKHtcbiAgICAgICAgdm5vZGU6IGN1cnJlbnRWTm9kZSxcbiAgICAgICAgcmVjdXJzZUNvdW50OiAwXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50SW5zdGFuY2UgPSBjdXJyZW50Vk5vZGUuY29tcG9uZW50ICYmIGN1cnJlbnRWTm9kZS5jb21wb25lbnQucGFyZW50O1xuICAgIGN1cnJlbnRWTm9kZSA9IHBhcmVudEluc3RhbmNlICYmIHBhcmVudEluc3RhbmNlLnZub2RlO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkU3RhY2s7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZSh0cmFjZSkge1xuICBjb25zdCBsb2dzID0gW107XG4gIHRyYWNlLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgbG9ncy5wdXNoKC4uLmkgPT09IDAgPyBbXSA6IFtgXG5gXSwgLi4uZm9ybWF0VHJhY2VFbnRyeShlbnRyeSkpO1xuICB9KTtcbiAgcmV0dXJuIGxvZ3M7XG59XG5mdW5jdGlvbiBmb3JtYXRUcmFjZUVudHJ5KHsgdm5vZGUsIHJlY3Vyc2VDb3VudCB9KSB7XG4gIGNvbnN0IHBvc3RmaXggPSByZWN1cnNlQ291bnQgPiAwID8gYC4uLiAoJHtyZWN1cnNlQ291bnR9IHJlY3Vyc2l2ZSBjYWxscylgIDogYGA7XG4gIGNvbnN0IGlzUm9vdCA9IHZub2RlLmNvbXBvbmVudCA/IHZub2RlLmNvbXBvbmVudC5wYXJlbnQgPT0gbnVsbCA6IGZhbHNlO1xuICBjb25zdCBvcGVuID0gYCBhdCA8JHtmb3JtYXRDb21wb25lbnROYW1lKFxuICAgIHZub2RlLmNvbXBvbmVudCxcbiAgICB2bm9kZS50eXBlLFxuICAgIGlzUm9vdFxuICApfWA7XG4gIGNvbnN0IGNsb3NlID0gYD5gICsgcG9zdGZpeDtcbiAgcmV0dXJuIHZub2RlLnByb3BzID8gW29wZW4sIC4uLmZvcm1hdFByb3BzKHZub2RlLnByb3BzKSwgY2xvc2VdIDogW29wZW4gKyBjbG9zZV07XG59XG5mdW5jdGlvbiBmb3JtYXRQcm9wcyhwcm9wcykge1xuICBjb25zdCByZXMgPSBbXTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAga2V5cy5zbGljZSgwLCAzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICByZXMucHVzaCguLi5mb3JtYXRQcm9wKGtleSwgcHJvcHNba2V5XSkpO1xuICB9KTtcbiAgaWYgKGtleXMubGVuZ3RoID4gMykge1xuICAgIHJlcy5wdXNoKGAgLi4uYCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGZvcm1hdFByb3Aoa2V5LCB2YWx1ZSwgcmF3KSB7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT0ke3ZhbHVlfWBdO1xuICB9IGVsc2UgaWYgKGlzUmVmKHZhbHVlKSkge1xuICAgIHZhbHVlID0gZm9ybWF0UHJvcChrZXksIHRvUmF3KHZhbHVlLnZhbHVlKSwgdHJ1ZSk7XG4gICAgcmV0dXJuIHJhdyA/IHZhbHVlIDogW2Ake2tleX09UmVmPGAsIHZhbHVlLCBgPmBdO1xuICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgcmV0dXJuIFtgJHtrZXl9PWZuJHt2YWx1ZS5uYW1lID8gYDwke3ZhbHVlLm5hbWV9PmAgOiBgYH1gXTtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IHRvUmF3KHZhbHVlKTtcbiAgICByZXR1cm4gcmF3ID8gdmFsdWUgOiBbYCR7a2V5fT1gLCB2YWx1ZV07XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydE51bWJlcih2YWwsIHR5cGUpIHtcbiAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSByZXR1cm47XG4gIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsICE9PSBcIm51bWJlclwiKSB7XG4gICAgd2FybiQxKGAke3R5cGV9IGlzIG5vdCBhIHZhbGlkIG51bWJlciAtIGdvdCAke0pTT04uc3RyaW5naWZ5KHZhbCl9LmApO1xuICB9IGVsc2UgaWYgKGlzTmFOKHZhbCkpIHtcbiAgICB3YXJuJDEoYCR7dHlwZX0gaXMgTmFOIC0gdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24gbWlnaHQgYmUgaW5jb3JyZWN0LmApO1xuICB9XG59XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIFwiU0VUVVBfRlVOQ1RJT05cIjogMCxcbiAgXCIwXCI6IFwiU0VUVVBfRlVOQ1RJT05cIixcbiAgXCJSRU5ERVJfRlVOQ1RJT05cIjogMSxcbiAgXCIxXCI6IFwiUkVOREVSX0ZVTkNUSU9OXCIsXG4gIFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIjogNSxcbiAgXCI1XCI6IFwiTkFUSVZFX0VWRU5UX0hBTkRMRVJcIixcbiAgXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiOiA2LFxuICBcIjZcIjogXCJDT01QT05FTlRfRVZFTlRfSEFORExFUlwiLFxuICBcIlZOT0RFX0hPT0tcIjogNyxcbiAgXCI3XCI6IFwiVk5PREVfSE9PS1wiLFxuICBcIkRJUkVDVElWRV9IT09LXCI6IDgsXG4gIFwiOFwiOiBcIkRJUkVDVElWRV9IT09LXCIsXG4gIFwiVFJBTlNJVElPTl9IT09LXCI6IDksXG4gIFwiOVwiOiBcIlRSQU5TSVRJT05fSE9PS1wiLFxuICBcIkFQUF9FUlJPUl9IQU5ETEVSXCI6IDEwLFxuICBcIjEwXCI6IFwiQVBQX0VSUk9SX0hBTkRMRVJcIixcbiAgXCJBUFBfV0FSTl9IQU5ETEVSXCI6IDExLFxuICBcIjExXCI6IFwiQVBQX1dBUk5fSEFORExFUlwiLFxuICBcIkZVTkNUSU9OX1JFRlwiOiAxMixcbiAgXCIxMlwiOiBcIkZVTkNUSU9OX1JFRlwiLFxuICBcIkFTWU5DX0NPTVBPTkVOVF9MT0FERVJcIjogMTMsXG4gIFwiMTNcIjogXCJBU1lOQ19DT01QT05FTlRfTE9BREVSXCIsXG4gIFwiU0NIRURVTEVSXCI6IDE0LFxuICBcIjE0XCI6IFwiU0NIRURVTEVSXCIsXG4gIFwiQ09NUE9ORU5UX1VQREFURVwiOiAxNSxcbiAgXCIxNVwiOiBcIkNPTVBPTkVOVF9VUERBVEVcIixcbiAgXCJBUFBfVU5NT1VOVF9DTEVBTlVQXCI6IDE2LFxuICBcIjE2XCI6IFwiQVBQX1VOTU9VTlRfQ0xFQU5VUFwiXG59O1xuY29uc3QgRXJyb3JUeXBlU3RyaW5ncyQxID0ge1xuICBbXCJzcFwiXTogXCJzZXJ2ZXJQcmVmZXRjaCBob29rXCIsXG4gIFtcImJjXCJdOiBcImJlZm9yZUNyZWF0ZSBob29rXCIsXG4gIFtcImNcIl06IFwiY3JlYXRlZCBob29rXCIsXG4gIFtcImJtXCJdOiBcImJlZm9yZU1vdW50IGhvb2tcIixcbiAgW1wibVwiXTogXCJtb3VudGVkIGhvb2tcIixcbiAgW1wiYnVcIl06IFwiYmVmb3JlVXBkYXRlIGhvb2tcIixcbiAgW1widVwiXTogXCJ1cGRhdGVkXCIsXG4gIFtcImJ1bVwiXTogXCJiZWZvcmVVbm1vdW50IGhvb2tcIixcbiAgW1widW1cIl06IFwidW5tb3VudGVkIGhvb2tcIixcbiAgW1wiYVwiXTogXCJhY3RpdmF0ZWQgaG9va1wiLFxuICBbXCJkYVwiXTogXCJkZWFjdGl2YXRlZCBob29rXCIsXG4gIFtcImVjXCJdOiBcImVycm9yQ2FwdHVyZWQgaG9va1wiLFxuICBbXCJydGNcIl06IFwicmVuZGVyVHJhY2tlZCBob29rXCIsXG4gIFtcInJ0Z1wiXTogXCJyZW5kZXJUcmlnZ2VyZWQgaG9va1wiLFxuICBbMF06IFwic2V0dXAgZnVuY3Rpb25cIixcbiAgWzFdOiBcInJlbmRlciBmdW5jdGlvblwiLFxuICBbMl06IFwid2F0Y2hlciBnZXR0ZXJcIixcbiAgWzNdOiBcIndhdGNoZXIgY2FsbGJhY2tcIixcbiAgWzRdOiBcIndhdGNoZXIgY2xlYW51cCBmdW5jdGlvblwiLFxuICBbNV06IFwibmF0aXZlIGV2ZW50IGhhbmRsZXJcIixcbiAgWzZdOiBcImNvbXBvbmVudCBldmVudCBoYW5kbGVyXCIsXG4gIFs3XTogXCJ2bm9kZSBob29rXCIsXG4gIFs4XTogXCJkaXJlY3RpdmUgaG9va1wiLFxuICBbOV06IFwidHJhbnNpdGlvbiBob29rXCIsXG4gIFsxMF06IFwiYXBwIGVycm9ySGFuZGxlclwiLFxuICBbMTFdOiBcImFwcCB3YXJuSGFuZGxlclwiLFxuICBbMTJdOiBcInJlZiBmdW5jdGlvblwiLFxuICBbMTNdOiBcImFzeW5jIGNvbXBvbmVudCBsb2FkZXJcIixcbiAgWzE0XTogXCJzY2hlZHVsZXIgZmx1c2hcIixcbiAgWzE1XTogXCJjb21wb25lbnQgdXBkYXRlXCIsXG4gIFsxNl06IFwiYXBwIHVubW91bnQgY2xlYW51cCBmdW5jdGlvblwiXG59O1xuZnVuY3Rpb24gY2FsbFdpdGhFcnJvckhhbmRsaW5nKGZuLCBpbnN0YW5jZSwgdHlwZSwgYXJncykge1xuICB0cnkge1xuICAgIHJldHVybiBhcmdzID8gZm4oLi4uYXJncykgOiBmbigpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlKTtcbiAgfVxufVxuZnVuY3Rpb24gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSB7XG4gIGlmIChpc0Z1bmN0aW9uKGZuKSkge1xuICAgIGNvbnN0IHJlcyA9IGNhbGxXaXRoRXJyb3JIYW5kbGluZyhmbiwgaW5zdGFuY2UsIHR5cGUsIGFyZ3MpO1xuICAgIGlmIChyZXMgJiYgaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcy5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIHR5cGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzLnB1c2goY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm5baV0sIGluc3RhbmNlLCB0eXBlLCBhcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBJbnZhbGlkIHZhbHVlIHR5cGUgcGFzc2VkIHRvIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKCk6ICR7dHlwZW9mIGZufWBcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFcnJvcihlcnIsIGluc3RhbmNlLCB0eXBlLCB0aHJvd0luRGV2ID0gdHJ1ZSkge1xuICBjb25zdCBjb250ZXh0Vk5vZGUgPSBpbnN0YW5jZSA/IGluc3RhbmNlLnZub2RlIDogbnVsbDtcbiAgY29uc3QgeyBlcnJvckhhbmRsZXIsIHRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb24gfSA9IGluc3RhbmNlICYmIGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnIHx8IEVNUFRZX09CSjtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgbGV0IGN1ciA9IGluc3RhbmNlLnBhcmVudDtcbiAgICBjb25zdCBleHBvc2VkSW5zdGFuY2UgPSBpbnN0YW5jZS5wcm94eTtcbiAgICBjb25zdCBlcnJvckluZm8gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdIDogYGh0dHBzOi8vdnVlanMub3JnL2Vycm9yLXJlZmVyZW5jZS8jcnVudGltZS0ke3R5cGV9YDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBjb25zdCBlcnJvckNhcHR1cmVkSG9va3MgPSBjdXIuZWM7XG4gICAgICBpZiAoZXJyb3JDYXB0dXJlZEhvb2tzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXJyb3JDYXB0dXJlZEhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGVycm9yQ2FwdHVyZWRIb29rc1tpXShlcnIsIGV4cG9zZWRJbnN0YW5jZSwgZXJyb3JJbmZvKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN1ciA9IGN1ci5wYXJlbnQ7XG4gICAgfVxuICAgIGlmIChlcnJvckhhbmRsZXIpIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNhbGxXaXRoRXJyb3JIYW5kbGluZyhlcnJvckhhbmRsZXIsIG51bGwsIDEwLCBbXG4gICAgICAgIGVycixcbiAgICAgICAgZXhwb3NlZEluc3RhbmNlLFxuICAgICAgICBlcnJvckluZm9cbiAgICAgIF0pO1xuICAgICAgcmVzZXRUcmFja2luZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBsb2dFcnJvcihlcnIsIHR5cGUsIGNvbnRleHRWTm9kZSwgdGhyb3dJbkRldiwgdGhyb3dVbmhhbmRsZWRFcnJvckluUHJvZHVjdGlvbik7XG59XG5mdW5jdGlvbiBsb2dFcnJvcihlcnIsIHR5cGUsIGNvbnRleHRWTm9kZSwgdGhyb3dJbkRldiA9IHRydWUsIHRocm93SW5Qcm9kID0gZmFsc2UpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBpbmZvID0gRXJyb3JUeXBlU3RyaW5ncyQxW3R5cGVdO1xuICAgIGlmIChjb250ZXh0Vk5vZGUpIHtcbiAgICAgIHB1c2hXYXJuaW5nQ29udGV4dChjb250ZXh0Vk5vZGUpO1xuICAgIH1cbiAgICB3YXJuJDEoYFVuaGFuZGxlZCBlcnJvciR7aW5mbyA/IGAgZHVyaW5nIGV4ZWN1dGlvbiBvZiAke2luZm99YCA6IGBgfWApO1xuICAgIGlmIChjb250ZXh0Vk5vZGUpIHtcbiAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgfVxuICAgIGlmICh0aHJvd0luRGV2KSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodGhyb3dJblByb2QpIHtcbiAgICB0aHJvdyBlcnI7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG5sZXQgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTtcbmNvbnN0IHF1ZXVlID0gW107XG5sZXQgZmx1c2hJbmRleCA9IDA7XG5jb25zdCBwZW5kaW5nUG9zdEZsdXNoQ2JzID0gW107XG5sZXQgYWN0aXZlUG9zdEZsdXNoQ2JzID0gbnVsbDtcbmxldCBwb3N0Rmx1c2hJbmRleCA9IDA7XG5jb25zdCByZXNvbHZlZFByb21pc2UgPSAvKiBAX19QVVJFX18gKi8gUHJvbWlzZS5yZXNvbHZlKCk7XG5sZXQgY3VycmVudEZsdXNoUHJvbWlzZSA9IG51bGw7XG5jb25zdCBSRUNVUlNJT05fTElNSVQgPSAxMDA7XG5mdW5jdGlvbiBuZXh0VGljayhmbikge1xuICBjb25zdCBwID0gY3VycmVudEZsdXNoUHJvbWlzZSB8fCByZXNvbHZlZFByb21pc2U7XG4gIHJldHVybiBmbiA/IHAudGhlbih0aGlzID8gZm4uYmluZCh0aGlzKSA6IGZuKSA6IHA7XG59XG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9uSW5kZXgoaWQpIHtcbiAgbGV0IHN0YXJ0ID0gaXNGbHVzaGluZyA/IGZsdXNoSW5kZXggKyAxIDogMDtcbiAgbGV0IGVuZCA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyBlbmQgPj4+IDE7XG4gICAgY29uc3QgbWlkZGxlSm9iID0gcXVldWVbbWlkZGxlXTtcbiAgICBjb25zdCBtaWRkbGVKb2JJZCA9IGdldElkKG1pZGRsZUpvYik7XG4gICAgaWYgKG1pZGRsZUpvYklkIDwgaWQgfHwgbWlkZGxlSm9iSWQgPT09IGlkICYmIG1pZGRsZUpvYi5mbGFncyAmIDIpIHtcbiAgICAgIHN0YXJ0ID0gbWlkZGxlICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gbWlkZGxlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RhcnQ7XG59XG5mdW5jdGlvbiBxdWV1ZUpvYihqb2IpIHtcbiAgaWYgKCEoam9iLmZsYWdzICYgMSkpIHtcbiAgICBjb25zdCBqb2JJZCA9IGdldElkKGpvYik7XG4gICAgY29uc3QgbGFzdEpvYiA9IHF1ZXVlW3F1ZXVlLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdEpvYiB8fCAvLyBmYXN0IHBhdGggd2hlbiB0aGUgam9iIGlkIGlzIGxhcmdlciB0aGFuIHRoZSB0YWlsXG4gICAgIShqb2IuZmxhZ3MgJiAyKSAmJiBqb2JJZCA+PSBnZXRJZChsYXN0Sm9iKSkge1xuICAgICAgcXVldWUucHVzaChqb2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWV1ZS5zcGxpY2UoZmluZEluc2VydGlvbkluZGV4KGpvYklkKSwgMCwgam9iKTtcbiAgICB9XG4gICAgam9iLmZsYWdzIHw9IDE7XG4gICAgcXVldWVGbHVzaCgpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZUZsdXNoKCkge1xuICBpZiAoIWlzRmx1c2hpbmcgJiYgIWlzRmx1c2hQZW5kaW5nKSB7XG4gICAgaXNGbHVzaFBlbmRpbmcgPSB0cnVlO1xuICAgIGN1cnJlbnRGbHVzaFByb21pc2UgPSByZXNvbHZlZFByb21pc2UudGhlbihmbHVzaEpvYnMpO1xuICB9XG59XG5mdW5jdGlvbiBxdWV1ZVBvc3RGbHVzaENiKGNiKSB7XG4gIGlmICghaXNBcnJheShjYikpIHtcbiAgICBpZiAoYWN0aXZlUG9zdEZsdXNoQ2JzICYmIGNiLmlkID09PSAtMSkge1xuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnNwbGljZShwb3N0Rmx1c2hJbmRleCArIDEsIDAsIGNiKTtcbiAgICB9IGVsc2UgaWYgKCEoY2IuZmxhZ3MgJiAxKSkge1xuICAgICAgcGVuZGluZ1Bvc3RGbHVzaENicy5wdXNoKGNiKTtcbiAgICAgIGNiLmZsYWdzIHw9IDE7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHBlbmRpbmdQb3N0Rmx1c2hDYnMucHVzaCguLi5jYik7XG4gIH1cbiAgcXVldWVGbHVzaCgpO1xufVxuZnVuY3Rpb24gZmx1c2hQcmVGbHVzaENicyhpbnN0YW5jZSwgc2VlbiwgaSA9IGlzRmx1c2hpbmcgPyBmbHVzaEluZGV4ICsgMSA6IDApIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBzZWVuID0gc2VlbiB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB9XG4gIGZvciAoOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjYiA9IHF1ZXVlW2ldO1xuICAgIGlmIChjYiAmJiBjYi5mbGFncyAmIDIpIHtcbiAgICAgIGlmIChpbnN0YW5jZSAmJiBjYi5pZCAhPT0gaW5zdGFuY2UudWlkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hlY2tSZWN1cnNpdmVVcGRhdGVzKHNlZW4sIGNiKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpLCAxKTtcbiAgICAgIGktLTtcbiAgICAgIGlmIChjYi5mbGFncyAmIDQpIHtcbiAgICAgICAgY2IuZmxhZ3MgJj0gfjE7XG4gICAgICB9XG4gICAgICBjYigpO1xuICAgICAgY2IuZmxhZ3MgJj0gfjE7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBmbHVzaFBvc3RGbHVzaENicyhzZWVuKSB7XG4gIGlmIChwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCkge1xuICAgIGNvbnN0IGRlZHVwZWQgPSBbLi4ubmV3IFNldChwZW5kaW5nUG9zdEZsdXNoQ2JzKV0uc29ydChcbiAgICAgIChhLCBiKSA9PiBnZXRJZChhKSAtIGdldElkKGIpXG4gICAgKTtcbiAgICBwZW5kaW5nUG9zdEZsdXNoQ2JzLmxlbmd0aCA9IDA7XG4gICAgaWYgKGFjdGl2ZVBvc3RGbHVzaENicykge1xuICAgICAgYWN0aXZlUG9zdEZsdXNoQ2JzLnB1c2goLi4uZGVkdXBlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFjdGl2ZVBvc3RGbHVzaENicyA9IGRlZHVwZWQ7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHNlZW4gPSBzZWVuIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGZvciAocG9zdEZsdXNoSW5kZXggPSAwOyBwb3N0Rmx1c2hJbmRleCA8IGFjdGl2ZVBvc3RGbHVzaENicy5sZW5ndGg7IHBvc3RGbHVzaEluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNiID0gYWN0aXZlUG9zdEZsdXNoQ2JzW3Bvc3RGbHVzaEluZGV4XTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNoZWNrUmVjdXJzaXZlVXBkYXRlcyhzZWVuLCBjYikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2IuZmxhZ3MgJiA0KSB7XG4gICAgICAgIGNiLmZsYWdzICY9IH4xO1xuICAgICAgfVxuICAgICAgaWYgKCEoY2IuZmxhZ3MgJiA4KSkgY2IoKTtcbiAgICAgIGNiLmZsYWdzICY9IH4xO1xuICAgIH1cbiAgICBhY3RpdmVQb3N0Rmx1c2hDYnMgPSBudWxsO1xuICAgIHBvc3RGbHVzaEluZGV4ID0gMDtcbiAgfVxufVxuY29uc3QgZ2V0SWQgPSAoam9iKSA9PiBqb2IuaWQgPT0gbnVsbCA/IGpvYi5mbGFncyAmIDIgPyAtMSA6IEluZmluaXR5IDogam9iLmlkO1xuZnVuY3Rpb24gZmx1c2hKb2JzKHNlZW4pIHtcbiAgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTtcbiAgaXNGbHVzaGluZyA9IHRydWU7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgc2VlbiA9IHNlZW4gfHwgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgfVxuICBjb25zdCBjaGVjayA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoam9iKSA9PiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2Vlbiwgam9iKSA6IE5PT1A7XG4gIHRyeSB7XG4gICAgZm9yIChmbHVzaEluZGV4ID0gMDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgIGlmIChqb2IgJiYgIShqb2IuZmxhZ3MgJiA4KSkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjaGVjayhqb2IpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpvYi5mbGFncyAmIDQpIHtcbiAgICAgICAgICBqb2IuZmxhZ3MgJj0gfjE7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgICAgIGpvYixcbiAgICAgICAgICBqb2IuaSxcbiAgICAgICAgICBqb2IuaSA/IDE1IDogMTRcbiAgICAgICAgKTtcbiAgICAgICAgam9iLmZsYWdzICY9IH4xO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBmb3IgKDsgZmx1c2hJbmRleCA8IHF1ZXVlLmxlbmd0aDsgZmx1c2hJbmRleCsrKSB7XG4gICAgICBjb25zdCBqb2IgPSBxdWV1ZVtmbHVzaEluZGV4XTtcbiAgICAgIGlmIChqb2IpIHtcbiAgICAgICAgam9iLmZsYWdzICY9IH4xO1xuICAgICAgfVxuICAgIH1cbiAgICBmbHVzaEluZGV4ID0gMDtcbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGZsdXNoUG9zdEZsdXNoQ2JzKHNlZW4pO1xuICAgIGlzRmx1c2hpbmcgPSBmYWxzZTtcbiAgICBjdXJyZW50Rmx1c2hQcm9taXNlID0gbnVsbDtcbiAgICBpZiAocXVldWUubGVuZ3RoIHx8IHBlbmRpbmdQb3N0Rmx1c2hDYnMubGVuZ3RoKSB7XG4gICAgICBmbHVzaEpvYnMoc2Vlbik7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZVVwZGF0ZXMoc2VlbiwgZm4pIHtcbiAgY29uc3QgY291bnQgPSBzZWVuLmdldChmbikgfHwgMDtcbiAgaWYgKGNvdW50ID4gUkVDVVJTSU9OX0xJTUlUKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBmbi5pO1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBpbnN0YW5jZSAmJiBnZXRDb21wb25lbnROYW1lKGluc3RhbmNlLnR5cGUpO1xuICAgIGhhbmRsZUVycm9yKFxuICAgICAgYE1heGltdW0gcmVjdXJzaXZlIHVwZGF0ZXMgZXhjZWVkZWQke2NvbXBvbmVudE5hbWUgPyBgIGluIGNvbXBvbmVudCA8JHtjb21wb25lbnROYW1lfT5gIDogYGB9LiBUaGlzIG1lYW5zIHlvdSBoYXZlIGEgcmVhY3RpdmUgZWZmZWN0IHRoYXQgaXMgbXV0YXRpbmcgaXRzIG93biBkZXBlbmRlbmNpZXMgYW5kIHRodXMgcmVjdXJzaXZlbHkgdHJpZ2dlcmluZyBpdHNlbGYuIFBvc3NpYmxlIHNvdXJjZXMgaW5jbHVkZSBjb21wb25lbnQgdGVtcGxhdGUsIHJlbmRlciBmdW5jdGlvbiwgdXBkYXRlZCBob29rIG9yIHdhdGNoZXIgc291cmNlIGZ1bmN0aW9uLmAsXG4gICAgICBudWxsLFxuICAgICAgMTBcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNlZW4uc2V0KGZuLCBjb3VudCArIDEpO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbmxldCBpc0htclVwZGF0aW5nID0gZmFsc2U7XG5jb25zdCBobXJEaXJ0eUNvbXBvbmVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgZ2V0R2xvYmFsVGhpcygpLl9fVlVFX0hNUl9SVU5USU1FX18gPSB7XG4gICAgY3JlYXRlUmVjb3JkOiB0cnlXcmFwKGNyZWF0ZVJlY29yZCksXG4gICAgcmVyZW5kZXI6IHRyeVdyYXAocmVyZW5kZXIpLFxuICAgIHJlbG9hZDogdHJ5V3JhcChyZWxvYWQpXG4gIH07XG59XG5jb25zdCBtYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZnVuY3Rpb24gcmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgY29uc3QgaWQgPSBpbnN0YW5jZS50eXBlLl9faG1ySWQ7XG4gIGxldCByZWNvcmQgPSBtYXAuZ2V0KGlkKTtcbiAgaWYgKCFyZWNvcmQpIHtcbiAgICBjcmVhdGVSZWNvcmQoaWQsIGluc3RhbmNlLnR5cGUpO1xuICAgIHJlY29yZCA9IG1hcC5nZXQoaWQpO1xuICB9XG4gIHJlY29yZC5pbnN0YW5jZXMuYWRkKGluc3RhbmNlKTtcbn1cbmZ1bmN0aW9uIHVucmVnaXN0ZXJITVIoaW5zdGFuY2UpIHtcbiAgbWFwLmdldChpbnN0YW5jZS50eXBlLl9faG1ySWQpLmluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gY3JlYXRlUmVjb3JkKGlkLCBpbml0aWFsRGVmKSB7XG4gIGlmIChtYXAuaGFzKGlkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBtYXAuc2V0KGlkLCB7XG4gICAgaW5pdGlhbERlZjogbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5pdGlhbERlZiksXG4gICAgaW5zdGFuY2VzOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNsYXNzQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICByZXR1cm4gaXNDbGFzc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50Ll9fdmNjT3B0cyA6IGNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIHJlcmVuZGVyKGlkLCBuZXdSZW5kZXIpIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJlY29yZC5pbml0aWFsRGVmLnJlbmRlciA9IG5ld1JlbmRlcjtcbiAgWy4uLnJlY29yZC5pbnN0YW5jZXNdLmZvckVhY2goKGluc3RhbmNlKSA9PiB7XG4gICAgaWYgKG5ld1JlbmRlcikge1xuICAgICAgaW5zdGFuY2UucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgICAgbm9ybWFsaXplQ2xhc3NDb21wb25lbnQoaW5zdGFuY2UudHlwZSkucmVuZGVyID0gbmV3UmVuZGVyO1xuICAgIH1cbiAgICBpbnN0YW5jZS5yZW5kZXJDYWNoZSA9IFtdO1xuICAgIGlzSG1yVXBkYXRpbmcgPSB0cnVlO1xuICAgIGluc3RhbmNlLnVwZGF0ZSgpO1xuICAgIGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbiAgfSk7XG59XG5mdW5jdGlvbiByZWxvYWQoaWQsIG5ld0NvbXApIHtcbiAgY29uc3QgcmVjb3JkID0gbWFwLmdldChpZCk7XG4gIGlmICghcmVjb3JkKSByZXR1cm47XG4gIG5ld0NvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChuZXdDb21wKTtcbiAgdXBkYXRlQ29tcG9uZW50RGVmKHJlY29yZC5pbml0aWFsRGVmLCBuZXdDb21wKTtcbiAgY29uc3QgaW5zdGFuY2VzID0gWy4uLnJlY29yZC5pbnN0YW5jZXNdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgIGNvbnN0IG9sZENvbXAgPSBub3JtYWxpemVDbGFzc0NvbXBvbmVudChpbnN0YW5jZS50eXBlKTtcbiAgICBsZXQgZGlydHlJbnN0YW5jZXMgPSBobXJEaXJ0eUNvbXBvbmVudHMuZ2V0KG9sZENvbXApO1xuICAgIGlmICghZGlydHlJbnN0YW5jZXMpIHtcbiAgICAgIGlmIChvbGRDb21wICE9PSByZWNvcmQuaW5pdGlhbERlZikge1xuICAgICAgICB1cGRhdGVDb21wb25lbnREZWYob2xkQ29tcCwgbmV3Q29tcCk7XG4gICAgICB9XG4gICAgICBobXJEaXJ0eUNvbXBvbmVudHMuc2V0KG9sZENvbXAsIGRpcnR5SW5zdGFuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSk7XG4gICAgfVxuICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgaW5zdGFuY2UuYXBwQ29udGV4dC5wcm9wc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpbnN0YW5jZS5hcHBDb250ZXh0LmVtaXRzQ2FjaGUuZGVsZXRlKGluc3RhbmNlLnR5cGUpO1xuICAgIGluc3RhbmNlLmFwcENvbnRleHQub3B0aW9uc0NhY2hlLmRlbGV0ZShpbnN0YW5jZS50eXBlKTtcbiAgICBpZiAoaW5zdGFuY2UuY2VSZWxvYWQpIHtcbiAgICAgIGRpcnR5SW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gICAgICBpbnN0YW5jZS5jZVJlbG9hZChuZXdDb21wLnN0eWxlcyk7XG4gICAgICBkaXJ0eUluc3RhbmNlcy5kZWxldGUoaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UucGFyZW50KSB7XG4gICAgICBxdWV1ZUpvYigoKSA9PiB7XG4gICAgICAgIGlzSG1yVXBkYXRpbmcgPSB0cnVlO1xuICAgICAgICBpbnN0YW5jZS5wYXJlbnQudXBkYXRlKCk7XG4gICAgICAgIGlzSG1yVXBkYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgZGlydHlJbnN0YW5jZXMuZGVsZXRlKGluc3RhbmNlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuYXBwQ29udGV4dC5yZWxvYWQpIHtcbiAgICAgIGluc3RhbmNlLmFwcENvbnRleHQucmVsb2FkKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbSE1SXSBSb290IG9yIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UgbW9kaWZpZWQuIEZ1bGwgcmVsb2FkIHJlcXVpcmVkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoaW5zdGFuY2Uucm9vdC5jZSAmJiBpbnN0YW5jZSAhPT0gaW5zdGFuY2Uucm9vdCkge1xuICAgICAgaW5zdGFuY2Uucm9vdC5jZS5fcmVtb3ZlQ2hpbGRTdHlsZShvbGRDb21wKTtcbiAgICB9XG4gIH1cbiAgcXVldWVQb3N0Rmx1c2hDYigoKSA9PiB7XG4gICAgaG1yRGlydHlDb21wb25lbnRzLmNsZWFyKCk7XG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50RGVmKG9sZENvbXAsIG5ld0NvbXApIHtcbiAgZXh0ZW5kKG9sZENvbXAsIG5ld0NvbXApO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDb21wKSB7XG4gICAgaWYgKGtleSAhPT0gXCJfX2ZpbGVcIiAmJiAhKGtleSBpbiBuZXdDb21wKSkge1xuICAgICAgZGVsZXRlIG9sZENvbXBba2V5XTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHRyeVdyYXAoZm4pIHtcbiAgcmV0dXJuIChpZCwgYXJnKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmbihpZCwgYXJnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW0hNUl0gU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIFZ1ZSBjb21wb25lbnQgaG90LXJlbG9hZC4gRnVsbCByZWxvYWQgcmVxdWlyZWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmxldCBkZXZ0b29scyQxO1xubGV0IGJ1ZmZlciA9IFtdO1xubGV0IGRldnRvb2xzTm90SW5zdGFsbGVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbWl0JDEoZXZlbnQsIC4uLmFyZ3MpIHtcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICB9IGVsc2UgaWYgKCFkZXZ0b29sc05vdEluc3RhbGxlZCkge1xuICAgIGJ1ZmZlci5wdXNoKHsgZXZlbnQsIGFyZ3MgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldERldnRvb2xzSG9vayQxKGhvb2ssIHRhcmdldCkge1xuICB2YXIgX2EsIF9iO1xuICBkZXZ0b29scyQxID0gaG9vaztcbiAgaWYgKGRldnRvb2xzJDEpIHtcbiAgICBkZXZ0b29scyQxLmVuYWJsZWQgPSB0cnVlO1xuICAgIGJ1ZmZlci5mb3JFYWNoKCh7IGV2ZW50LCBhcmdzIH0pID0+IGRldnRvb2xzJDEuZW1pdChldmVudCwgLi4uYXJncykpO1xuICAgIGJ1ZmZlciA9IFtdO1xuICB9IGVsc2UgaWYgKFxuICAgIC8vIGhhbmRsZSBsYXRlIGRldnRvb2xzIGluamVjdGlvbiAtIG9ubHkgZG8gdGhpcyBpZiB3ZSBhcmUgaW4gYW4gYWN0dWFsXG4gICAgLy8gYnJvd3NlciBlbnZpcm9ubWVudCB0byBhdm9pZCB0aGUgdGltZXIgaGFuZGxlIHN0YWxsaW5nIHRlc3QgcnVubmVyIGV4aXRcbiAgICAvLyAoIzQ4MTUpXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiAvLyBzb21lIGVudnMgbW9jayB3aW5kb3cgYnV0IG5vdCBmdWxseVxuICAgIHdpbmRvdy5IVE1MRWxlbWVudCAmJiAvLyBhbHNvIGV4Y2x1ZGUganNkb21cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAhKChfYiA9IChfYSA9IHdpbmRvdy5uYXZpZ2F0b3IpID09IG51bGwgPyB2b2lkIDAgOiBfYS51c2VyQWdlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcyhcImpzZG9tXCIpKVxuICApIHtcbiAgICBjb25zdCByZXBsYXkgPSB0YXJnZXQuX19WVUVfREVWVE9PTFNfSE9PS19SRVBMQVlfXyA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fIHx8IFtdO1xuICAgIHJlcGxheS5wdXNoKChuZXdIb29rKSA9PiB7XG4gICAgICBzZXREZXZ0b29sc0hvb2skMShuZXdIb29rLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCFkZXZ0b29scyQxKSB7XG4gICAgICAgIHRhcmdldC5fX1ZVRV9ERVZUT09MU19IT09LX1JFUExBWV9fID0gbnVsbDtcbiAgICAgICAgZGV2dG9vbHNOb3RJbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgICBidWZmZXIgPSBbXTtcbiAgICAgIH1cbiAgICB9LCAzZTMpO1xuICB9IGVsc2Uge1xuICAgIGRldnRvb2xzTm90SW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBidWZmZXIgPSBbXTtcbiAgfVxufVxuZnVuY3Rpb24gZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbikge1xuICBlbWl0JDEoXCJhcHA6aW5pdFwiIC8qIEFQUF9JTklUICovLCBhcHAsIHZlcnNpb24sIHtcbiAgICBGcmFnbWVudCxcbiAgICBUZXh0LFxuICAgIENvbW1lbnQsXG4gICAgU3RhdGljXG4gIH0pO1xufVxuZnVuY3Rpb24gZGV2dG9vbHNVbm1vdW50QXBwKGFwcCkge1xuICBlbWl0JDEoXCJhcHA6dW5tb3VudFwiIC8qIEFQUF9VTk1PVU5UICovLCBhcHApO1xufVxuY29uc3QgZGV2dG9vbHNDb21wb25lbnRBZGRlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXCJjb21wb25lbnQ6YWRkZWRcIiAvKiBDT01QT05FTlRfQURERUQgKi8pO1xuY29uc3QgZGV2dG9vbHNDb21wb25lbnRVcGRhdGVkID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayhcImNvbXBvbmVudDp1cGRhdGVkXCIgLyogQ09NUE9ORU5UX1VQREFURUQgKi8pO1xuY29uc3QgX2RldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soXG4gIFwiY29tcG9uZW50OnJlbW92ZWRcIiAvKiBDT01QT05FTlRfUkVNT1ZFRCAqL1xuKTtcbmNvbnN0IGRldnRvb2xzQ29tcG9uZW50UmVtb3ZlZCA9IChjb21wb25lbnQpID0+IHtcbiAgaWYgKGRldnRvb2xzJDEgJiYgdHlwZW9mIGRldnRvb2xzJDEuY2xlYW51cEJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIC8vIHJlbW92ZSB0aGUgY29tcG9uZW50IGlmIGl0IHdhc24ndCBidWZmZXJlZFxuICAhZGV2dG9vbHMkMS5jbGVhbnVwQnVmZmVyKGNvbXBvbmVudCkpIHtcbiAgICBfZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGNvbXBvbmVudCk7XG4gIH1cbn07XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbi8vIEBfX05PX1NJREVfRUZGRUNUU19fXG5mdW5jdGlvbiBjcmVhdGVEZXZ0b29sc0NvbXBvbmVudEhvb2soaG9vaykge1xuICByZXR1cm4gKGNvbXBvbmVudCkgPT4ge1xuICAgIGVtaXQkMShcbiAgICAgIGhvb2ssXG4gICAgICBjb21wb25lbnQuYXBwQ29udGV4dC5hcHAsXG4gICAgICBjb21wb25lbnQudWlkLFxuICAgICAgY29tcG9uZW50LnBhcmVudCA/IGNvbXBvbmVudC5wYXJlbnQudWlkIDogdm9pZCAwLFxuICAgICAgY29tcG9uZW50XG4gICAgKTtcbiAgfTtcbn1cbmNvbnN0IGRldnRvb2xzUGVyZlN0YXJ0ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKFwicGVyZjpzdGFydFwiIC8qIFBFUkZPUk1BTkNFX1NUQVJUICovKTtcbmNvbnN0IGRldnRvb2xzUGVyZkVuZCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVEZXZ0b29sc1BlcmZvcm1hbmNlSG9vayhcInBlcmY6ZW5kXCIgLyogUEVSRk9STUFOQ0VfRU5EICovKTtcbmZ1bmN0aW9uIGNyZWF0ZURldnRvb2xzUGVyZm9ybWFuY2VIb29rKGhvb2spIHtcbiAgcmV0dXJuIChjb21wb25lbnQsIHR5cGUsIHRpbWUpID0+IHtcbiAgICBlbWl0JDEoaG9vaywgY29tcG9uZW50LmFwcENvbnRleHQuYXBwLCBjb21wb25lbnQudWlkLCBjb21wb25lbnQsIHR5cGUsIHRpbWUpO1xuICB9O1xufVxuZnVuY3Rpb24gZGV2dG9vbHNDb21wb25lbnRFbWl0KGNvbXBvbmVudCwgZXZlbnQsIHBhcmFtcykge1xuICBlbWl0JDEoXG4gICAgXCJjb21wb25lbnQ6ZW1pdFwiIC8qIENPTVBPTkVOVF9FTUlUICovLFxuICAgIGNvbXBvbmVudC5hcHBDb250ZXh0LmFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgZXZlbnQsXG4gICAgcGFyYW1zXG4gICk7XG59XG5cbmxldCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xubGV0IGN1cnJlbnRTY29wZUlkID0gbnVsbDtcbmZ1bmN0aW9uIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShpbnN0YW5jZSkge1xuICBjb25zdCBwcmV2ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgY3VycmVudFNjb3BlSWQgPSBpbnN0YW5jZSAmJiBpbnN0YW5jZS50eXBlLl9fc2NvcGVJZCB8fCBudWxsO1xuICByZXR1cm4gcHJldjtcbn1cbmZ1bmN0aW9uIHB1c2hTY29wZUlkKGlkKSB7XG4gIGN1cnJlbnRTY29wZUlkID0gaWQ7XG59XG5mdW5jdGlvbiBwb3BTY29wZUlkKCkge1xuICBjdXJyZW50U2NvcGVJZCA9IG51bGw7XG59XG5jb25zdCB3aXRoU2NvcGVJZCA9IChfaWQpID0+IHdpdGhDdHg7XG5mdW5jdGlvbiB3aXRoQ3R4KGZuLCBjdHggPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UsIGlzTm9uU2NvcGVkU2xvdCkge1xuICBpZiAoIWN0eCkgcmV0dXJuIGZuO1xuICBpZiAoZm4uX24pIHtcbiAgICByZXR1cm4gZm47XG4gIH1cbiAgY29uc3QgcmVuZGVyRm5XaXRoQ29udGV4dCA9ICguLi5hcmdzKSA9PiB7XG4gICAgaWYgKHJlbmRlckZuV2l0aENvbnRleHQuX2QpIHtcbiAgICAgIHNldEJsb2NrVHJhY2tpbmcoLTEpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2SW5zdGFuY2UgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoY3R4KTtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBmbiguLi5hcmdzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlKHByZXZJbnN0YW5jZSk7XG4gICAgICBpZiAocmVuZGVyRm5XaXRoQ29udGV4dC5fZCkge1xuICAgICAgICBzZXRCbG9ja1RyYWNraW5nKDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRldnRvb2xzQ29tcG9uZW50VXBkYXRlZChjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuICByZW5kZXJGbldpdGhDb250ZXh0Ll9uID0gdHJ1ZTtcbiAgcmVuZGVyRm5XaXRoQ29udGV4dC5fYyA9IHRydWU7XG4gIHJlbmRlckZuV2l0aENvbnRleHQuX2QgPSB0cnVlO1xuICByZXR1cm4gcmVuZGVyRm5XaXRoQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpIHtcbiAgaWYgKGlzQnVpbHRJbkRpcmVjdGl2ZShuYW1lKSkge1xuICAgIHdhcm4kMShcIkRvIG5vdCB1c2UgYnVpbHQtaW4gZGlyZWN0aXZlIGlkcyBhcyBjdXN0b20gZGlyZWN0aXZlIGlkOiBcIiArIG5hbWUpO1xuICB9XG59XG5mdW5jdGlvbiB3aXRoRGlyZWN0aXZlcyh2bm9kZSwgZGlyZWN0aXZlcykge1xuICBpZiAoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID09PSBudWxsKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoYHdpdGhEaXJlY3RpdmVzIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHJlbmRlciBmdW5jdGlvbnMuYCk7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2UoY3VycmVudFJlbmRlcmluZ0luc3RhbmNlKTtcbiAgY29uc3QgYmluZGluZ3MgPSB2bm9kZS5kaXJzIHx8ICh2bm9kZS5kaXJzID0gW10pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgW2RpciwgdmFsdWUsIGFyZywgbW9kaWZpZXJzID0gRU1QVFlfT0JKXSA9IGRpcmVjdGl2ZXNbaV07XG4gICAgaWYgKGRpcikge1xuICAgICAgaWYgKGlzRnVuY3Rpb24oZGlyKSkge1xuICAgICAgICBkaXIgPSB7XG4gICAgICAgICAgbW91bnRlZDogZGlyLFxuICAgICAgICAgIHVwZGF0ZWQ6IGRpclxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGRpci5kZWVwKSB7XG4gICAgICAgIHRyYXZlcnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGJpbmRpbmdzLnB1c2goe1xuICAgICAgICBkaXIsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgb2xkVmFsdWU6IHZvaWQgMCxcbiAgICAgICAgYXJnLFxuICAgICAgICBtb2RpZmllcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBwcmV2Vk5vZGUsIGluc3RhbmNlLCBuYW1lKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gdm5vZGUuZGlycztcbiAgY29uc3Qgb2xkQmluZGluZ3MgPSBwcmV2Vk5vZGUgJiYgcHJldlZOb2RlLmRpcnM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbaV07XG4gICAgaWYgKG9sZEJpbmRpbmdzKSB7XG4gICAgICBiaW5kaW5nLm9sZFZhbHVlID0gb2xkQmluZGluZ3NbaV0udmFsdWU7XG4gICAgfVxuICAgIGxldCBob29rID0gYmluZGluZy5kaXJbbmFtZV07XG4gICAgaWYgKGhvb2spIHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA4LCBbXG4gICAgICAgIHZub2RlLmVsLFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgcHJldlZOb2RlXG4gICAgICBdKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgVGVsZXBvcnRFbmRLZXkgPSBTeW1ib2woXCJfdnRlXCIpO1xuY29uc3QgaXNUZWxlcG9ydCA9ICh0eXBlKSA9PiB0eXBlLl9faXNUZWxlcG9ydDtcbmNvbnN0IGlzVGVsZXBvcnREaXNhYmxlZCA9IChwcm9wcykgPT4gcHJvcHMgJiYgKHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmRpc2FibGVkID09PSBcIlwiKTtcbmNvbnN0IGlzVGVsZXBvcnREZWZlcnJlZCA9IChwcm9wcykgPT4gcHJvcHMgJiYgKHByb3BzLmRlZmVyIHx8IHByb3BzLmRlZmVyID09PSBcIlwiKTtcbmNvbnN0IGlzVGFyZ2V0U1ZHID0gKHRhcmdldCkgPT4gdHlwZW9mIFNWR0VsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIgJiYgdGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudDtcbmNvbnN0IGlzVGFyZ2V0TWF0aE1MID0gKHRhcmdldCkgPT4gdHlwZW9mIE1hdGhNTEVsZW1lbnQgPT09IFwiZnVuY3Rpb25cIiAmJiB0YXJnZXQgaW5zdGFuY2VvZiBNYXRoTUxFbGVtZW50O1xuY29uc3QgcmVzb2x2ZVRhcmdldCA9IChwcm9wcywgc2VsZWN0KSA9PiB7XG4gIGNvbnN0IHRhcmdldFNlbGVjdG9yID0gcHJvcHMgJiYgcHJvcHMudG87XG4gIGlmIChpc1N0cmluZyh0YXJnZXRTZWxlY3RvcikpIHtcbiAgICBpZiAoIXNlbGVjdCkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBDdXJyZW50IHJlbmRlcmVyIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIHRhcmdldCBmb3IgVGVsZXBvcnRzLiAobWlzc2luZyBxdWVyeVNlbGVjdG9yIHJlbmRlcmVyIG9wdGlvbilgXG4gICAgICApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdCh0YXJnZXRTZWxlY3Rvcik7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhdGFyZ2V0ICYmICFpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvY2F0ZSBUZWxlcG9ydCB0YXJnZXQgd2l0aCBzZWxlY3RvciBcIiR7dGFyZ2V0U2VsZWN0b3J9XCIuIE5vdGUgdGhlIHRhcmdldCBlbGVtZW50IG11c3QgZXhpc3QgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZCAtIGkuZS4gdGhlIHRhcmdldCBjYW5ub3QgYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvbmVudCBpdHNlbGYsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBvdXRzaWRlIG9mIHRoZSBlbnRpcmUgVnVlIGNvbXBvbmVudCB0cmVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICF0YXJnZXRTZWxlY3RvciAmJiAhaXNUZWxlcG9ydERpc2FibGVkKHByb3BzKSkge1xuICAgICAgd2FybiQxKGBJbnZhbGlkIFRlbGVwb3J0IHRhcmdldDogJHt0YXJnZXRTZWxlY3Rvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldFNlbGVjdG9yO1xuICB9XG59O1xuY29uc3QgVGVsZXBvcnRJbXBsID0ge1xuICBuYW1lOiBcIlRlbGVwb3J0XCIsXG4gIF9faXNUZWxlcG9ydDogdHJ1ZSxcbiAgcHJvY2VzcyhuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCBpbnRlcm5hbHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYzogbW91bnRDaGlsZHJlbixcbiAgICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgICAgcGJjOiBwYXRjaEJsb2NrQ2hpbGRyZW4sXG4gICAgICBvOiB7IGluc2VydCwgcXVlcnlTZWxlY3RvciwgY3JlYXRlVGV4dCwgY3JlYXRlQ29tbWVudCB9XG4gICAgfSA9IGludGVybmFscztcbiAgICBjb25zdCBkaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMi5wcm9wcyk7XG4gICAgbGV0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiwgZHluYW1pY0NoaWxkcmVuIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlciA9IG4yLmVsID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBzdGFydFwiKSA6IGNyZWF0ZVRleHQoXCJcIik7XG4gICAgICBjb25zdCBtYWluQW5jaG9yID0gbjIuYW5jaG9yID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUNvbW1lbnQoXCJ0ZWxlcG9ydCBlbmRcIikgOiBjcmVhdGVUZXh0KFwiXCIpO1xuICAgICAgaW5zZXJ0KHBsYWNlaG9sZGVyLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICBpbnNlcnQobWFpbkFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgY29uc3QgbW91bnQgPSAoY29udGFpbmVyMiwgYW5jaG9yMikgPT4ge1xuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBpZiAocGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC5pc0NFKSB7XG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQuY2UuX3RlbGVwb3J0VGFyZ2V0ID0gY29udGFpbmVyMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBtb3VudFRvVGFyZ2V0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KG4yLnByb3BzLCBxdWVyeVNlbGVjdG9yKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0QW5jaG9yID0gcHJlcGFyZUFuY2hvcih0YXJnZXQsIG4yLCBjcmVhdGVUZXh0LCBpbnNlcnQpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPT0gXCJzdmdcIiAmJiBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSBcInN2Z1wiO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmFtZXNwYWNlICE9PSBcIm1hdGhtbFwiICYmIGlzVGFyZ2V0TWF0aE1MKHRhcmdldCkpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIG1vdW50KHRhcmdldCwgdGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICAgIHVwZGF0ZUNzc1ZhcnMobjIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFkaXNhYmxlZCkge1xuICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgIFwiSW52YWxpZCBUZWxlcG9ydCB0YXJnZXQgb24gbW91bnQ6XCIsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgbW91bnQoY29udGFpbmVyLCBtYWluQW5jaG9yKTtcbiAgICAgICAgdXBkYXRlQ3NzVmFycyhuMik7XG4gICAgICB9XG4gICAgICBpZiAoaXNUZWxlcG9ydERlZmVycmVkKG4yLnByb3BzKSkge1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QobW91bnRUb1RhcmdldCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW91bnRUb1RhcmdldCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuMi5lbCA9IG4xLmVsO1xuICAgICAgbjIudGFyZ2V0U3RhcnQgPSBuMS50YXJnZXRTdGFydDtcbiAgICAgIGNvbnN0IG1haW5BbmNob3IgPSBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgICBjb25zdCB0YXJnZXQgPSBuMi50YXJnZXQgPSBuMS50YXJnZXQ7XG4gICAgICBjb25zdCB0YXJnZXRBbmNob3IgPSBuMi50YXJnZXRBbmNob3IgPSBuMS50YXJnZXRBbmNob3I7XG4gICAgICBjb25zdCB3YXNEaXNhYmxlZCA9IGlzVGVsZXBvcnREaXNhYmxlZChuMS5wcm9wcyk7XG4gICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gd2FzRGlzYWJsZWQgPyBjb250YWluZXIgOiB0YXJnZXQ7XG4gICAgICBjb25zdCBjdXJyZW50QW5jaG9yID0gd2FzRGlzYWJsZWQgPyBtYWluQW5jaG9yIDogdGFyZ2V0QW5jaG9yO1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBpc1RhcmdldFNWRyh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiB8fCBpc1RhcmdldE1hdGhNTCh0YXJnZXQpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IFwibWF0aG1sXCI7XG4gICAgICB9XG4gICAgICBpZiAoZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgICBuMS5keW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICAgIGN1cnJlbnRDb250YWluZXIsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghb3B0aW1pemVkKSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY3VycmVudENvbnRhaW5lcixcbiAgICAgICAgICBjdXJyZW50QW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgaWYgKCF3YXNEaXNhYmxlZCkge1xuICAgICAgICAgIG1vdmVUZWxlcG9ydChcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbWFpbkFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChuMi5wcm9wcyAmJiBuMS5wcm9wcyAmJiBuMi5wcm9wcy50byAhPT0gbjEucHJvcHMudG8pIHtcbiAgICAgICAgICAgIG4yLnByb3BzLnRvID0gbjEucHJvcHMudG87XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKG4yLnByb3BzICYmIG4yLnByb3BzLnRvKSAhPT0gKG4xLnByb3BzICYmIG4xLnByb3BzLnRvKSkge1xuICAgICAgICAgIGNvbnN0IG5leHRUYXJnZXQgPSBuMi50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgICAgICAgICAgbjIucHJvcHMsXG4gICAgICAgICAgICBxdWVyeVNlbGVjdG9yXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobmV4dFRhcmdldCkge1xuICAgICAgICAgICAgbW92ZVRlbGVwb3J0KFxuICAgICAgICAgICAgICBuMixcbiAgICAgICAgICAgICAgbmV4dFRhcmdldCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgaW50ZXJuYWxzLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIkludmFsaWQgVGVsZXBvcnQgdGFyZ2V0IG9uIHVwZGF0ZTpcIixcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBgKCR7dHlwZW9mIHRhcmdldH0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FzRGlzYWJsZWQpIHtcbiAgICAgICAgICBtb3ZlVGVsZXBvcnQoXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICAgIHRhcmdldEFuY2hvcixcbiAgICAgICAgICAgIGludGVybmFscyxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB1cGRhdGVDc3NWYXJzKG4yKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZSh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgeyB1bTogdW5tb3VudCwgbzogeyByZW1vdmU6IGhvc3RSZW1vdmUgfSB9LCBkb1JlbW92ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNoYXBlRmxhZyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgYW5jaG9yLFxuICAgICAgdGFyZ2V0U3RhcnQsXG4gICAgICB0YXJnZXRBbmNob3IsXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wc1xuICAgIH0gPSB2bm9kZTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICBob3N0UmVtb3ZlKHRhcmdldFN0YXJ0KTtcbiAgICAgIGhvc3RSZW1vdmUodGFyZ2V0QW5jaG9yKTtcbiAgICB9XG4gICAgZG9SZW1vdmUgJiYgaG9zdFJlbW92ZShhbmNob3IpO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgY29uc3Qgc2hvdWxkUmVtb3ZlID0gZG9SZW1vdmUgfHwgIWlzVGVsZXBvcnREaXNhYmxlZChwcm9wcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIHVubW91bnQoXG4gICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNob3VsZFJlbW92ZSxcbiAgICAgICAgICAhIWNoaWxkLmR5bmFtaWNDaGlsZHJlblxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgbW92ZTogbW92ZVRlbGVwb3J0LFxuICBoeWRyYXRlOiBoeWRyYXRlVGVsZXBvcnRcbn07XG5mdW5jdGlvbiBtb3ZlVGVsZXBvcnQodm5vZGUsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yLCB7IG86IHsgaW5zZXJ0IH0sIG06IG1vdmUgfSwgbW92ZVR5cGUgPSAyKSB7XG4gIGlmIChtb3ZlVHlwZSA9PT0gMCkge1xuICAgIGluc2VydCh2bm9kZS50YXJnZXRBbmNob3IsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBjb25zdCB7IGVsLCBhbmNob3IsIHNoYXBlRmxhZywgY2hpbGRyZW4sIHByb3BzIH0gPSB2bm9kZTtcbiAgY29uc3QgaXNSZW9yZGVyID0gbW92ZVR5cGUgPT09IDI7XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoZWwsIGNvbnRhaW5lciwgcGFyZW50QW5jaG9yKTtcbiAgfVxuICBpZiAoIWlzUmVvcmRlciB8fCBpc1RlbGVwb3J0RGlzYWJsZWQocHJvcHMpKSB7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1vdmUoXG4gICAgICAgICAgY2hpbGRyZW5baV0sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudEFuY2hvcixcbiAgICAgICAgICAyXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpc1Jlb3JkZXIpIHtcbiAgICBpbnNlcnQoYW5jaG9yLCBjb250YWluZXIsIHBhcmVudEFuY2hvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGVUZWxlcG9ydChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQsIHtcbiAgbzogeyBuZXh0U2libGluZywgcGFyZW50Tm9kZSwgcXVlcnlTZWxlY3RvciwgaW5zZXJ0LCBjcmVhdGVUZXh0IH1cbn0sIGh5ZHJhdGVDaGlsZHJlbikge1xuICBjb25zdCB0YXJnZXQgPSB2bm9kZS50YXJnZXQgPSByZXNvbHZlVGFyZ2V0KFxuICAgIHZub2RlLnByb3BzLFxuICAgIHF1ZXJ5U2VsZWN0b3JcbiAgKTtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IHRhcmdldE5vZGUgPSB0YXJnZXQuX2xwYSB8fCB0YXJnZXQuZmlyc3RDaGlsZDtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgIGlmIChpc1RlbGVwb3J0RGlzYWJsZWQodm5vZGUucHJvcHMpKSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IGh5ZHJhdGVDaGlsZHJlbihcbiAgICAgICAgICBuZXh0U2libGluZyhub2RlKSxcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBwYXJlbnROb2RlKG5vZGUpLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHZub2RlLnRhcmdldFN0YXJ0ID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgdm5vZGUudGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZSAmJiBuZXh0U2libGluZyh0YXJnZXROb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmFuY2hvciA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICBsZXQgdGFyZ2V0QW5jaG9yID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgd2hpbGUgKHRhcmdldEFuY2hvcikge1xuICAgICAgICAgIGlmICh0YXJnZXRBbmNob3IgJiYgdGFyZ2V0QW5jaG9yLm5vZGVUeXBlID09PSA4KSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0QW5jaG9yLmRhdGEgPT09IFwidGVsZXBvcnQgc3RhcnQgYW5jaG9yXCIpIHtcbiAgICAgICAgICAgICAgdm5vZGUudGFyZ2V0U3RhcnQgPSB0YXJnZXRBbmNob3I7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldEFuY2hvci5kYXRhID09PSBcInRlbGVwb3J0IGFuY2hvclwiKSB7XG4gICAgICAgICAgICAgIHZub2RlLnRhcmdldEFuY2hvciA9IHRhcmdldEFuY2hvcjtcbiAgICAgICAgICAgICAgdGFyZ2V0Ll9scGEgPSB2bm9kZS50YXJnZXRBbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUudGFyZ2V0QW5jaG9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhcmdldEFuY2hvciA9IG5leHRTaWJsaW5nKHRhcmdldEFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF2bm9kZS50YXJnZXRBbmNob3IpIHtcbiAgICAgICAgICBwcmVwYXJlQW5jaG9yKHRhcmdldCwgdm5vZGUsIGNyZWF0ZVRleHQsIGluc2VydCk7XG4gICAgICAgIH1cbiAgICAgICAgaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIHRhcmdldE5vZGUgJiYgbmV4dFNpYmxpbmcodGFyZ2V0Tm9kZSksXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZUNzc1ZhcnModm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZS5hbmNob3IgJiYgbmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yKTtcbn1cbmNvbnN0IFRlbGVwb3J0ID0gVGVsZXBvcnRJbXBsO1xuZnVuY3Rpb24gdXBkYXRlQ3NzVmFycyh2bm9kZSkge1xuICBjb25zdCBjdHggPSB2bm9kZS5jdHg7XG4gIGlmIChjdHggJiYgY3R4LnV0KSB7XG4gICAgbGV0IG5vZGUgPSB2bm9kZS50YXJnZXRTdGFydDtcbiAgICB3aGlsZSAobm9kZSAmJiBub2RlICE9PSB2bm9kZS50YXJnZXRBbmNob3IpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSBub2RlLnNldEF0dHJpYnV0ZShcImRhdGEtdi1vd25lclwiLCBjdHgudWlkKTtcbiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIH1cbiAgICBjdHgudXQoKTtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZUFuY2hvcih0YXJnZXQsIHZub2RlLCBjcmVhdGVUZXh0LCBpbnNlcnQpIHtcbiAgY29uc3QgdGFyZ2V0U3RhcnQgPSB2bm9kZS50YXJnZXRTdGFydCA9IGNyZWF0ZVRleHQoXCJcIik7XG4gIGNvbnN0IHRhcmdldEFuY2hvciA9IHZub2RlLnRhcmdldEFuY2hvciA9IGNyZWF0ZVRleHQoXCJcIik7XG4gIHRhcmdldFN0YXJ0W1RlbGVwb3J0RW5kS2V5XSA9IHRhcmdldEFuY2hvcjtcbiAgaWYgKHRhcmdldCkge1xuICAgIGluc2VydCh0YXJnZXRTdGFydCwgdGFyZ2V0KTtcbiAgICBpbnNlcnQodGFyZ2V0QW5jaG9yLCB0YXJnZXQpO1xuICB9XG4gIHJldHVybiB0YXJnZXRBbmNob3I7XG59XG5cbmNvbnN0IGxlYXZlQ2JLZXkgPSBTeW1ib2woXCJfbGVhdmVDYlwiKTtcbmNvbnN0IGVudGVyQ2JLZXkgPSBTeW1ib2woXCJfZW50ZXJDYlwiKTtcbmZ1bmN0aW9uIHVzZVRyYW5zaXRpb25TdGF0ZSgpIHtcbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICBpc0xlYXZpbmc6IGZhbHNlLFxuICAgIGlzVW5tb3VudGluZzogZmFsc2UsXG4gICAgbGVhdmluZ1ZOb2RlczogLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKVxuICB9O1xuICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgIHN0YXRlLmlzTW91bnRlZCA9IHRydWU7XG4gIH0pO1xuICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgIHN0YXRlLmlzVW5tb3VudGluZyA9IHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RhdGU7XG59XG5jb25zdCBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvciA9IFtGdW5jdGlvbiwgQXJyYXldO1xuY29uc3QgQmFzZVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMgPSB7XG4gIG1vZGU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBwZXJzaXN0ZWQ6IEJvb2xlYW4sXG4gIC8vIGVudGVyXG4gIG9uQmVmb3JlRW50ZXI6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckVudGVyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25FbnRlckNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGxlYXZlXG4gIG9uQmVmb3JlTGVhdmU6IFRyYW5zaXRpb25Ib29rVmFsaWRhdG9yLFxuICBvbkxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckxlYXZlOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25MZWF2ZUNhbmNlbGxlZDogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIC8vIGFwcGVhclxuICBvbkJlZm9yZUFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvcixcbiAgb25BZnRlckFwcGVhcjogVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IsXG4gIG9uQXBwZWFyQ2FuY2VsbGVkOiBUcmFuc2l0aW9uSG9va1ZhbGlkYXRvclxufTtcbmNvbnN0IHJlY3Vyc2l2ZUdldFN1YnRyZWUgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3Qgc3ViVHJlZSA9IGluc3RhbmNlLnN1YlRyZWU7XG4gIHJldHVybiBzdWJUcmVlLmNvbXBvbmVudCA/IHJlY3Vyc2l2ZUdldFN1YnRyZWUoc3ViVHJlZS5jb21wb25lbnQpIDogc3ViVHJlZTtcbn07XG5jb25zdCBCYXNlVHJhbnNpdGlvbkltcGwgPSB7XG4gIG5hbWU6IGBCYXNlVHJhbnNpdGlvbmAsXG4gIHByb3BzOiBCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyxcbiAgc2V0dXAocHJvcHMsIHsgc2xvdHMgfSkge1xuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgY29uc3Qgc3RhdGUgPSB1c2VUcmFuc2l0aW9uU3RhdGUoKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihzbG90cy5kZWZhdWx0KCksIHRydWUpO1xuICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkID0gZmluZE5vbkNvbW1lbnRDaGlsZChjaGlsZHJlbik7XG4gICAgICBjb25zdCByYXdQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgICAgIGNvbnN0IHsgbW9kZSB9ID0gcmF3UHJvcHM7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBtb2RlICYmIG1vZGUgIT09IFwiaW4tb3V0XCIgJiYgbW9kZSAhPT0gXCJvdXQtaW5cIiAmJiBtb2RlICE9PSBcImRlZmF1bHRcIikge1xuICAgICAgICB3YXJuJDEoYGludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICR7bW9kZX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc0xlYXZpbmcpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5uZXJDaGlsZCA9IGdldElubmVyQ2hpbGQkMShjaGlsZCk7XG4gICAgICBpZiAoIWlubmVyQ2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5UGxhY2Vob2xkZXIoY2hpbGQpO1xuICAgICAgfVxuICAgICAgbGV0IGVudGVySG9va3MgPSByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICBpbm5lckNoaWxkLFxuICAgICAgICByYXdQcm9wcyxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICAvLyAjMTEwNjEsIGVuc3VyZSBlbnRlckhvb2tzIGlzIGZyZXNoIGFmdGVyIGNsb25lXG4gICAgICAgIChob29rcykgPT4gZW50ZXJIb29rcyA9IGhvb2tzXG4gICAgICApO1xuICAgICAgaWYgKGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3MoaW5uZXJDaGlsZCwgZW50ZXJIb29rcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvbGRDaGlsZCA9IGluc3RhbmNlLnN1YlRyZWU7XG4gICAgICBjb25zdCBvbGRJbm5lckNoaWxkID0gb2xkQ2hpbGQgJiYgZ2V0SW5uZXJDaGlsZCQxKG9sZENoaWxkKTtcbiAgICAgIGlmIChvbGRJbm5lckNoaWxkICYmIG9sZElubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCAmJiAhaXNTYW1lVk5vZGVUeXBlKGlubmVyQ2hpbGQsIG9sZElubmVyQ2hpbGQpICYmIHJlY3Vyc2l2ZUdldFN1YnRyZWUoaW5zdGFuY2UpLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgY29uc3QgbGVhdmluZ0hvb2tzID0gcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICBvbGRJbm5lckNoaWxkLFxuICAgICAgICAgIHJhd1Byb3BzLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICk7XG4gICAgICAgIHNldFRyYW5zaXRpb25Ib29rcyhvbGRJbm5lckNoaWxkLCBsZWF2aW5nSG9va3MpO1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJvdXQtaW5cIiAmJiBpbm5lckNoaWxkLnR5cGUgIT09IENvbW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5pc0xlYXZpbmcgPSB0cnVlO1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5hZnRlckxlYXZlID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RhdGUuaXNMZWF2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIShpbnN0YW5jZS5qb2IuZmxhZ3MgJiA4KSkge1xuICAgICAgICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nSG9va3MuYWZ0ZXJMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBlbXB0eVBsYWNlaG9sZGVyKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSBcImluLW91dFwiICYmIGlubmVyQ2hpbGQudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICAgIGxlYXZpbmdIb29rcy5kZWxheUxlYXZlID0gKGVsLCBlYXJseVJlbW92ZSwgZGVsYXllZExlYXZlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgb2xkSW5uZXJDaGlsZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxlYXZpbmdWTm9kZXNDYWNoZVtTdHJpbmcob2xkSW5uZXJDaGlsZC5rZXkpXSA9IG9sZElubmVyQ2hpbGQ7XG4gICAgICAgICAgICBlbFtsZWF2ZUNiS2V5XSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgZWFybHlSZW1vdmUoKTtcbiAgICAgICAgICAgICAgZWxbbGVhdmVDYktleV0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGRlbGV0ZSBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBlbnRlckhvb2tzLmRlbGF5ZWRMZWF2ZSA9IGRlbGF5ZWRMZWF2ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIGZpbmROb25Db21tZW50Q2hpbGQoY2hpbGRyZW4pIHtcbiAgbGV0IGNoaWxkID0gY2hpbGRyZW5bMF07XG4gIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgbGV0IGhhc0ZvdW5kID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoYy50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGhhc0ZvdW5kKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgXCI8dHJhbnNpdGlvbj4gY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHNpbmdsZSBlbGVtZW50IG9yIGNvbXBvbmVudC4gVXNlIDx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuXCJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkID0gYztcbiAgICAgICAgaGFzRm91bmQgPSB0cnVlO1xuICAgICAgICBpZiAoISEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2hpbGQ7XG59XG5jb25zdCBCYXNlVHJhbnNpdGlvbiA9IEJhc2VUcmFuc2l0aW9uSW1wbDtcbmZ1bmN0aW9uIGdldExlYXZpbmdOb2Rlc0ZvclR5cGUoc3RhdGUsIHZub2RlKSB7XG4gIGNvbnN0IHsgbGVhdmluZ1ZOb2RlcyB9ID0gc3RhdGU7XG4gIGxldCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBsZWF2aW5nVk5vZGVzLmdldCh2bm9kZS50eXBlKTtcbiAgaWYgKCFsZWF2aW5nVk5vZGVzQ2FjaGUpIHtcbiAgICBsZWF2aW5nVk5vZGVzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBsZWF2aW5nVk5vZGVzLnNldCh2bm9kZS50eXBlLCBsZWF2aW5nVk5vZGVzQ2FjaGUpO1xuICB9XG4gIHJldHVybiBsZWF2aW5nVk5vZGVzQ2FjaGU7XG59XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKHZub2RlLCBwcm9wcywgc3RhdGUsIGluc3RhbmNlLCBwb3N0Q2xvbmUpIHtcbiAgY29uc3Qge1xuICAgIGFwcGVhcixcbiAgICBtb2RlLFxuICAgIHBlcnNpc3RlZCA9IGZhbHNlLFxuICAgIG9uQmVmb3JlRW50ZXIsXG4gICAgb25FbnRlcixcbiAgICBvbkFmdGVyRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkJlZm9yZUxlYXZlLFxuICAgIG9uTGVhdmUsXG4gICAgb25BZnRlckxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIsXG4gICAgb25BcHBlYXIsXG4gICAgb25BZnRlckFwcGVhcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGtleSA9IFN0cmluZyh2bm9kZS5rZXkpO1xuICBjb25zdCBsZWF2aW5nVk5vZGVzQ2FjaGUgPSBnZXRMZWF2aW5nTm9kZXNGb3JUeXBlKHN0YXRlLCB2bm9kZSk7XG4gIGNvbnN0IGNhbGxIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBob29rICYmIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgaG9vayxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgOSxcbiAgICAgIGFyZ3NcbiAgICApO1xuICB9O1xuICBjb25zdCBjYWxsQXN5bmNIb29rID0gKGhvb2ssIGFyZ3MpID0+IHtcbiAgICBjb25zdCBkb25lID0gYXJnc1sxXTtcbiAgICBjYWxsSG9vayhob29rLCBhcmdzKTtcbiAgICBpZiAoaXNBcnJheShob29rKSkge1xuICAgICAgaWYgKGhvb2suZXZlcnkoKGhvb2syKSA9PiBob29rMi5sZW5ndGggPD0gMSkpIGRvbmUoKTtcbiAgICB9IGVsc2UgaWYgKGhvb2subGVuZ3RoIDw9IDEpIHtcbiAgICAgIGRvbmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhvb2tzID0ge1xuICAgIG1vZGUsXG4gICAgcGVyc2lzdGVkLFxuICAgIGJlZm9yZUVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uQmVmb3JlRW50ZXI7XG4gICAgICBpZiAoIXN0YXRlLmlzTW91bnRlZCkge1xuICAgICAgICBpZiAoYXBwZWFyKSB7XG4gICAgICAgICAgaG9vayA9IG9uQmVmb3JlQXBwZWFyIHx8IG9uQmVmb3JlRW50ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgZWxbbGVhdmVDYktleV0oXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICAgIC8qIGNhbmNlbGxlZCAqL1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVhdmluZ1ZOb2RlID0gbGVhdmluZ1ZOb2Rlc0NhY2hlW2tleV07XG4gICAgICBpZiAobGVhdmluZ1ZOb2RlICYmIGlzU2FtZVZOb2RlVHlwZSh2bm9kZSwgbGVhdmluZ1ZOb2RlKSAmJiBsZWF2aW5nVk5vZGUuZWxbbGVhdmVDYktleV0pIHtcbiAgICAgICAgbGVhdmluZ1ZOb2RlLmVsW2xlYXZlQ2JLZXldKCk7XG4gICAgICB9XG4gICAgICBjYWxsSG9vayhob29rLCBbZWxdKTtcbiAgICB9LFxuICAgIGVudGVyKGVsKSB7XG4gICAgICBsZXQgaG9vayA9IG9uRW50ZXI7XG4gICAgICBsZXQgYWZ0ZXJIb29rID0gb25BZnRlckVudGVyO1xuICAgICAgbGV0IGNhbmNlbEhvb2sgPSBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgaWYgKCFzdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgaWYgKGFwcGVhcikge1xuICAgICAgICAgIGhvb2sgPSBvbkFwcGVhciB8fCBvbkVudGVyO1xuICAgICAgICAgIGFmdGVySG9vayA9IG9uQWZ0ZXJBcHBlYXIgfHwgb25BZnRlckVudGVyO1xuICAgICAgICAgIGNhbmNlbEhvb2sgPSBvbkFwcGVhckNhbmNlbGxlZCB8fCBvbkVudGVyQ2FuY2VsbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgZG9uZSA9IGVsW2VudGVyQ2JLZXldID0gKGNhbmNlbGxlZCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGVkKSByZXR1cm47XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhjYW5jZWxIb29rLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhhZnRlckhvb2ssIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChob29rcy5kZWxheWVkTGVhdmUpIHtcbiAgICAgICAgICBob29rcy5kZWxheWVkTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbFtlbnRlckNiS2V5XSA9IHZvaWQgMDtcbiAgICAgIH07XG4gICAgICBpZiAoaG9vaykge1xuICAgICAgICBjYWxsQXN5bmNIb29rKGhvb2ssIFtlbCwgZG9uZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbGVhdmUoZWwsIHJlbW92ZSkge1xuICAgICAgY29uc3Qga2V5MiA9IFN0cmluZyh2bm9kZS5rZXkpO1xuICAgICAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgICAgIGVsW2VudGVyQ2JLZXldKFxuICAgICAgICAgIHRydWVcbiAgICAgICAgICAvKiBjYW5jZWxsZWQgKi9cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5pc1VubW91bnRpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgY2FsbEhvb2sob25CZWZvcmVMZWF2ZSwgW2VsXSk7XG4gICAgICBsZXQgY2FsbGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBkb25lID0gZWxbbGVhdmVDYktleV0gPSAoY2FuY2VsbGVkKSA9PiB7XG4gICAgICAgIGlmIChjYWxsZWQpIHJldHVybjtcbiAgICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkxlYXZlQ2FuY2VsbGVkLCBbZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsSG9vayhvbkFmdGVyTGVhdmUsIFtlbF0pO1xuICAgICAgICB9XG4gICAgICAgIGVsW2xlYXZlQ2JLZXldID0gdm9pZCAwO1xuICAgICAgICBpZiAobGVhdmluZ1ZOb2Rlc0NhY2hlW2tleTJdID09PSB2bm9kZSkge1xuICAgICAgICAgIGRlbGV0ZSBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBsZWF2aW5nVk5vZGVzQ2FjaGVba2V5Ml0gPSB2bm9kZTtcbiAgICAgIGlmIChvbkxlYXZlKSB7XG4gICAgICAgIGNhbGxBc3luY0hvb2sob25MZWF2ZSwgW2VsLCBkb25lXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjbG9uZSh2bm9kZTIpIHtcbiAgICAgIGNvbnN0IGhvb2tzMiA9IHJlc29sdmVUcmFuc2l0aW9uSG9va3MoXG4gICAgICAgIHZub2RlMixcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgcG9zdENsb25lXG4gICAgICApO1xuICAgICAgaWYgKHBvc3RDbG9uZSkgcG9zdENsb25lKGhvb2tzMik7XG4gICAgICByZXR1cm4gaG9va3MyO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhvb2tzO1xufVxuZnVuY3Rpb24gZW1wdHlQbGFjZWhvbGRlcih2bm9kZSkge1xuICBpZiAoaXNLZWVwQWxpdmUodm5vZGUpKSB7XG4gICAgdm5vZGUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgICB2bm9kZS5jaGlsZHJlbiA9IG51bGw7XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG59XG5mdW5jdGlvbiBnZXRJbm5lckNoaWxkJDEodm5vZGUpIHtcbiAgaWYgKCFpc0tlZXBBbGl2ZSh2bm9kZSkpIHtcbiAgICBpZiAoaXNUZWxlcG9ydCh2bm9kZS50eXBlKSAmJiB2bm9kZS5jaGlsZHJlbikge1xuICAgICAgcmV0dXJuIGZpbmROb25Db21tZW50Q2hpbGQodm5vZGUuY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGU7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlO1xuICB9XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuWzBdO1xuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgMzIgJiYgaXNGdW5jdGlvbihjaGlsZHJlbi5kZWZhdWx0KSkge1xuICAgICAgcmV0dXJuIGNoaWxkcmVuLmRlZmF1bHQoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZSwgaG9va3MpIHtcbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDYgJiYgdm5vZGUuY29tcG9uZW50KSB7XG4gICAgdm5vZGUudHJhbnNpdGlvbiA9IGhvb2tzO1xuICAgIHNldFRyYW5zaXRpb25Ib29rcyh2bm9kZS5jb21wb25lbnQuc3ViVHJlZSwgaG9va3MpO1xuICB9IGVsc2UgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgIHZub2RlLnNzQ29udGVudC50cmFuc2l0aW9uID0gaG9va3MuY2xvbmUodm5vZGUuc3NDb250ZW50KTtcbiAgICB2bm9kZS5zc0ZhbGxiYWNrLnRyYW5zaXRpb24gPSBob29rcy5jbG9uZSh2bm9kZS5zc0ZhbGxiYWNrKTtcbiAgfSBlbHNlIHtcbiAgICB2bm9kZS50cmFuc2l0aW9uID0gaG9va3M7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZHJlbiwga2VlcENvbW1lbnQgPSBmYWxzZSwgcGFyZW50S2V5KSB7XG4gIGxldCByZXQgPSBbXTtcbiAgbGV0IGtleWVkRnJhZ21lbnRDb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICBjb25zdCBrZXkgPSBwYXJlbnRLZXkgPT0gbnVsbCA/IGNoaWxkLmtleSA6IFN0cmluZyhwYXJlbnRLZXkpICsgU3RyaW5nKGNoaWxkLmtleSAhPSBudWxsID8gY2hpbGQua2V5IDogaSk7XG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IEZyYWdtZW50KSB7XG4gICAgICBpZiAoY2hpbGQucGF0Y2hGbGFnICYgMTI4KSBrZXllZEZyYWdtZW50Q291bnQrKztcbiAgICAgIHJldCA9IHJldC5jb25jYXQoXG4gICAgICAgIGdldFRyYW5zaXRpb25SYXdDaGlsZHJlbihjaGlsZC5jaGlsZHJlbiwga2VlcENvbW1lbnQsIGtleSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChrZWVwQ29tbWVudCB8fCBjaGlsZC50eXBlICE9PSBDb21tZW50KSB7XG4gICAgICByZXQucHVzaChrZXkgIT0gbnVsbCA/IGNsb25lVk5vZGUoY2hpbGQsIHsga2V5IH0pIDogY2hpbGQpO1xuICAgIH1cbiAgfVxuICBpZiAoa2V5ZWRGcmFnbWVudENvdW50ID4gMSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXRbaV0ucGF0Y2hGbGFnID0gLTI7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qISAjX19OT19TSURFX0VGRkVDVFNfXyAqL1xuLy8gQF9fTk9fU0lERV9FRkZFQ1RTX19cbmZ1bmN0aW9uIGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzRnVuY3Rpb24ob3B0aW9ucykgPyAoXG4gICAgLy8gIzgyMzY6IGV4dGVuZCBjYWxsIGFuZCBvcHRpb25zLm5hbWUgYWNjZXNzIGFyZSBjb25zaWRlcmVkIHNpZGUtZWZmZWN0c1xuICAgIC8vIGJ5IFJvbGx1cCwgc28gd2UgaGF2ZSB0byB3cmFwIGl0IGluIGEgcHVyZS1hbm5vdGF0ZWQgSUlGRS5cbiAgICAvKiBAX19QVVJFX18gKi8gKCgpID0+IGV4dGVuZCh7IG5hbWU6IG9wdGlvbnMubmFtZSB9LCBleHRyYU9wdGlvbnMsIHsgc2V0dXA6IG9wdGlvbnMgfSkpKClcbiAgKSA6IG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIHVzZUlkKCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmIChpKSB7XG4gICAgcmV0dXJuIChpLmFwcENvbnRleHQuY29uZmlnLmlkUHJlZml4IHx8IFwidlwiKSArIFwiLVwiICsgaS5pZHNbMF0gKyBpLmlkc1sxXSsrO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoXG4gICAgICBgdXNlSWQoKSBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBubyBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aC5gXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0FzeW5jQm91bmRhcnkoaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UuaWRzID0gW2luc3RhbmNlLmlkc1swXSArIGluc3RhbmNlLmlkc1syXSsrICsgXCItXCIsIDAsIDBdO1xufVxuXG5jb25zdCBrbm93blRlbXBsYXRlUmVmcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuZnVuY3Rpb24gdXNlVGVtcGxhdGVSZWYoa2V5KSB7XG4gIGNvbnN0IGkgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgY29uc3QgciA9IHNoYWxsb3dSZWYobnVsbCk7XG4gIGlmIChpKSB7XG4gICAgY29uc3QgcmVmcyA9IGkucmVmcyA9PT0gRU1QVFlfT0JKID8gaS5yZWZzID0ge30gOiBpLnJlZnM7XG4gICAgbGV0IGRlc2M7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgKGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlZnMsIGtleSkpICYmICFkZXNjLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgd2FybiQxKGB1c2VUZW1wbGF0ZVJlZignJHtrZXl9JykgYWxyZWFkeSBleGlzdHMuYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWZzLCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiByLnZhbHVlLFxuICAgICAgICBzZXQ6ICh2YWwpID0+IHIudmFsdWUgPSB2YWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHVzZVRlbXBsYXRlUmVmKCkgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguYFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmV0ID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHJlYWRvbmx5KHIpIDogcjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBrbm93blRlbXBsYXRlUmVmcy5hZGQocmV0KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBzZXRSZWYocmF3UmVmLCBvbGRSYXdSZWYsIHBhcmVudFN1c3BlbnNlLCB2bm9kZSwgaXNVbm1vdW50ID0gZmFsc2UpIHtcbiAgaWYgKGlzQXJyYXkocmF3UmVmKSkge1xuICAgIHJhd1JlZi5mb3JFYWNoKFxuICAgICAgKHIsIGkpID0+IHNldFJlZihcbiAgICAgICAgcixcbiAgICAgICAgb2xkUmF3UmVmICYmIChpc0FycmF5KG9sZFJhd1JlZikgPyBvbGRSYXdSZWZbaV0gOiBvbGRSYXdSZWYpLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGlzVW5tb3VudFxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0FzeW5jV3JhcHBlcih2bm9kZSkgJiYgIWlzVW5tb3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWZWYWx1ZSA9IHZub2RlLnNoYXBlRmxhZyAmIDQgPyBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSh2bm9kZS5jb21wb25lbnQpIDogdm5vZGUuZWw7XG4gIGNvbnN0IHZhbHVlID0gaXNVbm1vdW50ID8gbnVsbCA6IHJlZlZhbHVlO1xuICBjb25zdCB7IGk6IG93bmVyLCByOiByZWYgfSA9IHJhd1JlZjtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIW93bmVyKSB7XG4gICAgd2FybiQxKFxuICAgICAgYE1pc3NpbmcgcmVmIG93bmVyIGNvbnRleHQuIHJlZiBjYW5ub3QgYmUgdXNlZCBvbiBob2lzdGVkIHZub2Rlcy4gQSB2bm9kZSB3aXRoIHJlZiBtdXN0IGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSByZW5kZXIgZnVuY3Rpb24uYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9sZFJlZiA9IG9sZFJhd1JlZiAmJiBvbGRSYXdSZWYucjtcbiAgY29uc3QgcmVmcyA9IG93bmVyLnJlZnMgPT09IEVNUFRZX09CSiA/IG93bmVyLnJlZnMgPSB7fSA6IG93bmVyLnJlZnM7XG4gIGNvbnN0IHNldHVwU3RhdGUgPSBvd25lci5zZXR1cFN0YXRlO1xuICBjb25zdCByYXdTZXR1cFN0YXRlID0gdG9SYXcoc2V0dXBTdGF0ZSk7XG4gIGNvbnN0IGNhblNldFNldHVwUmVmID0gc2V0dXBTdGF0ZSA9PT0gRU1QVFlfT0JKID8gKCkgPT4gZmFsc2UgOiAoa2V5KSA9PiB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga25vd25UZW1wbGF0ZVJlZnMuaGFzKHJhd1NldHVwU3RhdGVba2V5XSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc093bihyYXdTZXR1cFN0YXRlLCBrZXkpO1xuICB9O1xuICBpZiAob2xkUmVmICE9IG51bGwgJiYgb2xkUmVmICE9PSByZWYpIHtcbiAgICBpZiAoaXNTdHJpbmcob2xkUmVmKSkge1xuICAgICAgcmVmc1tvbGRSZWZdID0gbnVsbDtcbiAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihvbGRSZWYpKSB7XG4gICAgICAgIHNldHVwU3RhdGVbb2xkUmVmXSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1JlZihvbGRSZWYpKSB7XG4gICAgICBvbGRSZWYudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBpZiAoaXNGdW5jdGlvbihyZWYpKSB7XG4gICAgY2FsbFdpdGhFcnJvckhhbmRsaW5nKHJlZiwgb3duZXIsIDEyLCBbdmFsdWUsIHJlZnNdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBfaXNTdHJpbmcgPSBpc1N0cmluZyhyZWYpO1xuICAgIGNvbnN0IF9pc1JlZiA9IGlzUmVmKHJlZik7XG4gICAgaWYgKF9pc1N0cmluZyB8fCBfaXNSZWYpIHtcbiAgICAgIGNvbnN0IGRvU2V0ID0gKCkgPT4ge1xuICAgICAgICBpZiAocmF3UmVmLmYpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IF9pc1N0cmluZyA/IGNhblNldFNldHVwUmVmKHJlZikgPyBzZXR1cFN0YXRlW3JlZl0gOiByZWZzW3JlZl0gOiByZWYudmFsdWU7XG4gICAgICAgICAgaWYgKGlzVW5tb3VudCkge1xuICAgICAgICAgICAgaXNBcnJheShleGlzdGluZykgJiYgcmVtb3ZlKGV4aXN0aW5nLCByZWZWYWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgICAgICAgICAgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgICAgICAgIHJlZnNbcmVmXSA9IFtyZWZWYWx1ZV07XG4gICAgICAgICAgICAgICAgaWYgKGNhblNldFNldHVwUmVmKHJlZikpIHtcbiAgICAgICAgICAgICAgICAgIHNldHVwU3RhdGVbcmVmXSA9IHJlZnNbcmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVmLnZhbHVlID0gW3JlZlZhbHVlXTtcbiAgICAgICAgICAgICAgICBpZiAocmF3UmVmLmspIHJlZnNbcmF3UmVmLmtdID0gcmVmLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhyZWZWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaChyZWZWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKF9pc1N0cmluZykge1xuICAgICAgICAgIHJlZnNbcmVmXSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjYW5TZXRTZXR1cFJlZihyZWYpKSB7XG4gICAgICAgICAgICBzZXR1cFN0YXRlW3JlZl0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX2lzUmVmKSB7XG4gICAgICAgICAgcmVmLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgaWYgKHJhd1JlZi5rKSByZWZzW3Jhd1JlZi5rXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkb1NldC5pZCA9IC0xO1xuICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoZG9TZXQsIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoXCJJbnZhbGlkIHRlbXBsYXRlIHJlZiB0eXBlOlwiLCByZWYsIGAoJHt0eXBlb2YgcmVmfSlgKTtcbiAgICB9XG4gIH1cbn1cblxubGV0IGhhc0xvZ2dlZE1pc21hdGNoRXJyb3IgPSBmYWxzZTtcbmNvbnN0IGxvZ01pc21hdGNoRXJyb3IgPSAoKSA9PiB7XG4gIGlmIChoYXNMb2dnZWRNaXNtYXRjaEVycm9yKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoXCJIeWRyYXRpb24gY29tcGxldGVkIGJ1dCBjb250YWlucyBtaXNtYXRjaGVzLlwiKTtcbiAgaGFzTG9nZ2VkTWlzbWF0Y2hFcnJvciA9IHRydWU7XG59O1xuY29uc3QgaXNTVkdDb250YWluZXIgPSAoY29udGFpbmVyKSA9PiBjb250YWluZXIubmFtZXNwYWNlVVJJLmluY2x1ZGVzKFwic3ZnXCIpICYmIGNvbnRhaW5lci50YWdOYW1lICE9PSBcImZvcmVpZ25PYmplY3RcIjtcbmNvbnN0IGlzTWF0aE1MQ29udGFpbmVyID0gKGNvbnRhaW5lcikgPT4gY29udGFpbmVyLm5hbWVzcGFjZVVSSS5pbmNsdWRlcyhcIk1hdGhNTFwiKTtcbmNvbnN0IGdldENvbnRhaW5lclR5cGUgPSAoY29udGFpbmVyKSA9PiB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IDEpIHJldHVybiB2b2lkIDA7XG4gIGlmIChpc1NWR0NvbnRhaW5lcihjb250YWluZXIpKSByZXR1cm4gXCJzdmdcIjtcbiAgaWYgKGlzTWF0aE1MQ29udGFpbmVyKGNvbnRhaW5lcikpIHJldHVybiBcIm1hdGhtbFwiO1xuICByZXR1cm4gdm9pZCAwO1xufTtcbmNvbnN0IGlzQ29tbWVudCA9IChub2RlKSA9PiBub2RlLm5vZGVUeXBlID09PSA4O1xuZnVuY3Rpb24gY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKHJlbmRlcmVySW50ZXJuYWxzKSB7XG4gIGNvbnN0IHtcbiAgICBtdDogbW91bnRDb21wb25lbnQsXG4gICAgcDogcGF0Y2gsXG4gICAgbzoge1xuICAgICAgcGF0Y2hQcm9wLFxuICAgICAgY3JlYXRlVGV4dCxcbiAgICAgIG5leHRTaWJsaW5nLFxuICAgICAgcGFyZW50Tm9kZSxcbiAgICAgIHJlbW92ZSxcbiAgICAgIGluc2VydCxcbiAgICAgIGNyZWF0ZUNvbW1lbnRcbiAgICB9XG4gIH0gPSByZW5kZXJlckludGVybmFscztcbiAgY29uc3QgaHlkcmF0ZSA9ICh2bm9kZSwgY29udGFpbmVyKSA9PiB7XG4gICAgaWYgKCFjb250YWluZXIuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgYEF0dGVtcHRpbmcgdG8gaHlkcmF0ZSBleGlzdGluZyBtYXJrdXAgYnV0IGNvbnRhaW5lciBpcyBlbXB0eS4gUGVyZm9ybWluZyBmdWxsIG1vdW50IGluc3RlYWQuYFxuICAgICAgKTtcbiAgICAgIHBhdGNoKG51bGwsIHZub2RlLCBjb250YWluZXIpO1xuICAgICAgZmx1c2hQb3N0Rmx1c2hDYnMoKTtcbiAgICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaHlkcmF0ZU5vZGUoY29udGFpbmVyLmZpcnN0Q2hpbGQsIHZub2RlLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICBmbHVzaFBvc3RGbHVzaENicygpO1xuICAgIGNvbnRhaW5lci5fdm5vZGUgPSB2bm9kZTtcbiAgfTtcbiAgY29uc3QgaHlkcmF0ZU5vZGUgPSAobm9kZSwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBvcHRpbWl6ZWQgPSBvcHRpbWl6ZWQgfHwgISF2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gICAgY29uc3QgaXNGcmFnbWVudFN0YXJ0ID0gaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJbXCI7XG4gICAgY29uc3Qgb25NaXNtYXRjaCA9ICgpID0+IGhhbmRsZU1pc21hdGNoKFxuICAgICAgbm9kZSxcbiAgICAgIHZub2RlLFxuICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICBzbG90U2NvcGVJZHMsXG4gICAgICBpc0ZyYWdtZW50U3RhcnRcbiAgICApO1xuICAgIGNvbnN0IHsgdHlwZSwgcmVmLCBzaGFwZUZsYWcsIHBhdGNoRmxhZyB9ID0gdm5vZGU7XG4gICAgbGV0IGRvbVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgIHZub2RlLmVsID0gbm9kZTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGRlZihub2RlLCBcIl9fdm5vZGVcIiwgdm5vZGUsIHRydWUpO1xuICAgICAgZGVmKG5vZGUsIFwiX192dWVQYXJlbnRDb21wb25lbnRcIiwgcGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA9PT0gLTIpIHtcbiAgICAgIG9wdGltaXplZCA9IGZhbHNlO1xuICAgICAgdm5vZGUuZHluYW1pY0NoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gICAgbGV0IG5leHROb2RlID0gbnVsbDtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgaWYgKGRvbVR5cGUgIT09IDMpIHtcbiAgICAgICAgICBpZiAodm5vZGUuY2hpbGRyZW4gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIGluc2VydCh2bm9kZS5lbCA9IGNyZWF0ZVRleHQoXCJcIiksIHBhcmVudE5vZGUobm9kZSksIG5vZGUpO1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBub2RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5vZGUuZGF0YSAhPT0gdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgbWlzbWF0Y2ggaW5gLFxuICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgIGBcbiAgLSByZW5kZXJlZCBvbiBzZXJ2ZXI6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgbm9kZS5kYXRhXG4gICAgICAgICAgICAgICl9XG4gIC0gZXhwZWN0ZWQgb24gY2xpZW50OiAke0pTT04uc3RyaW5naWZ5KHZub2RlLmNoaWxkcmVuKX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIENvbW1lbnQ6XG4gICAgICAgIGlmIChpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgcmVwbGFjZU5vZGUoXG4gICAgICAgICAgICB2bm9kZS5lbCA9IG5vZGUuY29udGVudC5maXJzdENoaWxkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tVHlwZSAhPT0gOCB8fCBpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBub2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgZG9tVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbVR5cGUgPT09IDEgfHwgZG9tVHlwZSA9PT0gMykge1xuICAgICAgICAgIG5leHROb2RlID0gbm9kZTtcbiAgICAgICAgICBjb25zdCBuZWVkVG9BZG9wdENvbnRlbnQgPSAhdm5vZGUuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuc3RhdGljQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5lZWRUb0Fkb3B0Q29udGVudClcbiAgICAgICAgICAgICAgdm5vZGUuY2hpbGRyZW4gKz0gbmV4dE5vZGUubm9kZVR5cGUgPT09IDEgPyBuZXh0Tm9kZS5vdXRlckhUTUwgOiBuZXh0Tm9kZS5kYXRhO1xuICAgICAgICAgICAgaWYgKGkgPT09IHZub2RlLnN0YXRpY0NvdW50IC0gMSkge1xuICAgICAgICAgICAgICB2bm9kZS5hbmNob3IgPSBuZXh0Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobmV4dE5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNGcmFnbWVudFN0YXJ0ID8gbmV4dFNpYmxpbmcobmV4dE5vZGUpIDogbmV4dE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb25NaXNtYXRjaCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgaWYgKCFpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG9uTWlzbWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0Tm9kZSA9IGh5ZHJhdGVGcmFnbWVudChcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChzaGFwZUZsYWcgJiAxKSB7XG4gICAgICAgICAgaWYgKChkb21UeXBlICE9PSAxIHx8IHZub2RlLnR5cGUudG9Mb3dlckNhc2UoKSAhPT0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpICYmICFpc1RlbXBsYXRlTm9kZShub2RlKSkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gaHlkcmF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHZub2RlLnNsb3RTY29wZUlkcyA9IHNsb3RTY29wZUlkcztcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgICAgICAgIGlmIChpc0ZyYWdtZW50U3RhcnQpIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbG9jYXRlQ2xvc2luZ0FuY2hvcihub2RlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwidGVsZXBvcnQgc3RhcnRcIikge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUsIG5vZGUuZGF0YSwgXCJ0ZWxlcG9ydCBlbmRcIik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vdW50Q29tcG9uZW50KFxuICAgICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKGNvbnRhaW5lciksXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc0FzeW5jV3JhcHBlcih2bm9kZSkpIHtcbiAgICAgICAgICAgIGxldCBzdWJUcmVlO1xuICAgICAgICAgICAgaWYgKGlzRnJhZ21lbnRTdGFydCkge1xuICAgICAgICAgICAgICBzdWJUcmVlID0gY3JlYXRlVk5vZGUoRnJhZ21lbnQpO1xuICAgICAgICAgICAgICBzdWJUcmVlLmFuY2hvciA9IG5leHROb2RlID8gbmV4dE5vZGUucHJldmlvdXNTaWJsaW5nIDogY29udGFpbmVyLmxhc3RDaGlsZDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN1YlRyZWUgPSBub2RlLm5vZGVUeXBlID09PSAzID8gY3JlYXRlVGV4dFZOb2RlKFwiXCIpIDogY3JlYXRlVk5vZGUoXCJkaXZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWJUcmVlLmVsID0gbm9kZTtcbiAgICAgICAgICAgIHZub2RlLmNvbXBvbmVudC5zdWJUcmVlID0gc3ViVHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNjQpIHtcbiAgICAgICAgICBpZiAoZG9tVHlwZSAhPT0gOCkge1xuICAgICAgICAgICAgbmV4dE5vZGUgPSBvbk1pc21hdGNoKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICAgIHJlbmRlcmVySW50ZXJuYWxzLFxuICAgICAgICAgICAgICBoeWRyYXRlQ2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICAgIG5leHROb2RlID0gdm5vZGUudHlwZS5oeWRyYXRlKFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHZub2RlLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBnZXRDb250YWluZXJUeXBlKHBhcmVudE5vZGUobm9kZSkpLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgcmVuZGVyZXJJbnRlcm5hbHMsXG4gICAgICAgICAgICBoeWRyYXRlTm9kZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIEhvc3RWTm9kZSB0eXBlOlwiLCB0eXBlLCBgKCR7dHlwZW9mIHR5cGV9KWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChyZWYgIT0gbnVsbCkge1xuICAgICAgc2V0UmVmKHJlZiwgbnVsbCwgcGFyZW50U3VzcGVuc2UsIHZub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5leHROb2RlO1xuICB9O1xuICBjb25zdCBoeWRyYXRlRWxlbWVudCA9IChlbCwgdm5vZGUsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgb3B0aW1pemVkID0gb3B0aW1pemVkIHx8ICEhdm5vZGUuZHluYW1pY0NoaWxkcmVuO1xuICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMsIHBhdGNoRmxhZywgc2hhcGVGbGFnLCBkaXJzLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBjb25zdCBmb3JjZVBhdGNoID0gdHlwZSA9PT0gXCJpbnB1dFwiIHx8IHR5cGUgPT09IFwib3B0aW9uXCI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgZm9yY2VQYXRjaCB8fCBwYXRjaEZsYWcgIT09IC0xKSB7XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiY3JlYXRlZFwiKTtcbiAgICAgIH1cbiAgICAgIGxldCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IGZhbHNlO1xuICAgICAgaWYgKGlzVGVtcGxhdGVOb2RlKGVsKSkge1xuICAgICAgICBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcyA9IG5lZWRUcmFuc2l0aW9uKHBhcmVudFN1c3BlbnNlLCB0cmFuc2l0aW9uKSAmJiBwYXJlbnRDb21wb25lbnQgJiYgcGFyZW50Q29tcG9uZW50LnZub2RlLnByb3BzICYmIHBhcmVudENvbXBvbmVudC52bm9kZS5wcm9wcy5hcHBlYXI7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbC5jb250ZW50LmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmIChuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZU5vZGUoY29udGVudCwgZWwsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgIHZub2RlLmVsID0gZWwgPSBjb250ZW50O1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2ICYmIC8vIHNraXAgaWYgZWxlbWVudCBoYXMgaW5uZXJIVE1MIC8gdGV4dENvbnRlbnRcbiAgICAgICEocHJvcHMgJiYgKHByb3BzLmlubmVySFRNTCB8fCBwcm9wcy50ZXh0Q29udGVudCkpKSB7XG4gICAgICAgIGxldCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgICAgIGVsLmZpcnN0Q2hpbGQsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAobmV4dCkge1xuICAgICAgICAgIGlmICghaXNNaXNtYXRjaEFsbG93ZWQoZWwsIDEgLyogQ0hJTERSRU4gKi8pKSB7XG4gICAgICAgICAgICBpZiAoKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fKSAmJiAhaGFzV2FybmVkKSB7XG4gICAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgICBgSHlkcmF0aW9uIGNoaWxkcmVuIG1pc21hdGNoIG9uYCxcbiAgICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAgICBgXG5TZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudCBjb250YWlucyBtb3JlIGNoaWxkIG5vZGVzIHRoYW4gY2xpZW50IHZkb20uYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjdXIgPSBuZXh0O1xuICAgICAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgICAgICAgIHJlbW92ZShjdXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgbGV0IGNsaWVudFRleHQgPSB2bm9kZS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNsaWVudFRleHRbMF0gPT09IFwiXFxuXCIgJiYgKGVsLnRhZ05hbWUgPT09IFwiUFJFXCIgfHwgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSkge1xuICAgICAgICAgIGNsaWVudFRleHQgPSBjbGllbnRUZXh0LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gY2xpZW50VGV4dCkge1xuICAgICAgICAgIGlmICghaXNNaXNtYXRjaEFsbG93ZWQoZWwsIDAgLyogVEVYVCAqLykpIHtcbiAgICAgICAgICAgICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgd2FybiQxKFxuICAgICAgICAgICAgICBgSHlkcmF0aW9uIHRleHQgY29udGVudCBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBgXG4gIC0gcmVuZGVyZWQgb24gc2VydmVyOiAke2VsLnRleHRDb250ZW50fVxuICAtIGV4cGVjdGVkIG9uIGNsaWVudDogJHt2bm9kZS5jaGlsZHJlbn1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbC50ZXh0Q29udGVudCA9IHZub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fIHx8IGZvcmNlUGF0Y2ggfHwgIW9wdGltaXplZCB8fCBwYXRjaEZsYWcgJiAoMTYgfCAzMikpIHtcbiAgICAgICAgICBjb25zdCBpc0N1c3RvbUVsZW1lbnQgPSBlbC50YWdOYW1lLmluY2x1ZGVzKFwiLVwiKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgICAgaWYgKCghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfSFlEUkFUSU9OX01JU01BVENIX0RFVEFJTFNfXykgJiYgLy8gIzExMTg5IHNraXAgaWYgdGhpcyBub2RlIGhhcyBkaXJlY3RpdmVzIHRoYXQgaGF2ZSBjcmVhdGVkIGhvb2tzXG4gICAgICAgICAgICAvLyBhcyBpdCBjb3VsZCBoYXZlIG11dGF0ZWQgdGhlIERPTSBpbiBhbnkgcG9zc2libGUgd2F5XG4gICAgICAgICAgICAhKGRpcnMgJiYgZGlycy5zb21lKChkKSA9PiBkLmRpci5jcmVhdGVkKSkgJiYgcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIHByb3BzW2tleV0sIHZub2RlLCBwYXJlbnRDb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3JjZVBhdGNoICYmIChrZXkuZW5kc1dpdGgoXCJ2YWx1ZVwiKSB8fCBrZXkgPT09IFwiaW5kZXRlcm1pbmF0ZVwiKSB8fCBpc09uKGtleSkgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkgfHwgLy8gZm9yY2UgaHlkcmF0ZSB2LWJpbmQgd2l0aCAucHJvcCBtb2RpZmllcnNcbiAgICAgICAgICAgIGtleVswXSA9PT0gXCIuXCIgfHwgaXNDdXN0b21FbGVtZW50KSB7XG4gICAgICAgICAgICAgIHBhdGNoUHJvcChlbCwga2V5LCBudWxsLCBwcm9wc1trZXldLCB2b2lkIDAsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLm9uQ2xpY2spIHtcbiAgICAgICAgICBwYXRjaFByb3AoXG4gICAgICAgICAgICBlbCxcbiAgICAgICAgICAgIFwib25DbGlja1wiLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHByb3BzLm9uQ2xpY2ssXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHBhdGNoRmxhZyAmIDQgJiYgaXNSZWFjdGl2ZShwcm9wcy5zdHlsZSkpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcy5zdHlsZSkgcHJvcHMuc3R5bGVba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHZub2RlSG9va3M7XG4gICAgICBpZiAodm5vZGVIb29rcyA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICB9XG4gICAgICBpZiAoZGlycykge1xuICAgICAgICBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwiYmVmb3JlTW91bnRcIik7XG4gICAgICB9XG4gICAgICBpZiAoKHZub2RlSG9va3MgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkgfHwgZGlycyB8fCBuZWVkQ2FsbFRyYW5zaXRpb25Ib29rcykge1xuICAgICAgICBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSgoKSA9PiB7XG4gICAgICAgICAgdm5vZGVIb29rcyAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rcywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwibW91bnRlZFwiKTtcbiAgICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWwubmV4dFNpYmxpbmc7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVDaGlsZHJlbiA9IChub2RlLCBwYXJlbnRWTm9kZSwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIG9wdGltaXplZCA9IG9wdGltaXplZCB8fCAhIXBhcmVudFZOb2RlLmR5bmFtaWNDaGlsZHJlbjtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudFZOb2RlLmNoaWxkcmVuO1xuICAgIGNvbnN0IGwgPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgbGV0IGhhc1dhcm5lZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjb25zdCB2bm9kZSA9IG9wdGltaXplZCA/IGNoaWxkcmVuW2ldIDogY2hpbGRyZW5baV0gPSBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBjb25zdCBpc1RleHQgPSB2bm9kZS50eXBlID09PSBUZXh0O1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgaWYgKGlzVGV4dCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgaWYgKGkgKyAxIDwgbCAmJiBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpICsgMV0pLnR5cGUgPT09IFRleHQpIHtcbiAgICAgICAgICAgIGluc2VydChcbiAgICAgICAgICAgICAgY3JlYXRlVGV4dChcbiAgICAgICAgICAgICAgICBub2RlLmRhdGEuc2xpY2Uodm5vZGUuY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIG5leHRTaWJsaW5nKG5vZGUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbm9kZS5kYXRhID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBoeWRyYXRlTm9kZShcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGlzVGV4dCAmJiAhdm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgaW5zZXJ0KHZub2RlLmVsID0gY3JlYXRlVGV4dChcIlwiKSwgY29udGFpbmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghaXNNaXNtYXRjaEFsbG93ZWQoY29udGFpbmVyLCAxIC8qIENISUxEUkVOICovKSkge1xuICAgICAgICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmICFoYXNXYXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYEh5ZHJhdGlvbiBjaGlsZHJlbiBtaXNtYXRjaCBvbmAsXG4gICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgYFxuU2VydmVyIHJlbmRlcmVkIGVsZW1lbnQgY29udGFpbnMgZmV3ZXIgY2hpbGQgbm9kZXMgdGhhbiBjbGllbnQgdmRvbS5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHBhdGNoKFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgdm5vZGUsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgICAgICBzbG90U2NvcGVJZHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH07XG4gIGNvbnN0IGh5ZHJhdGVGcmFnbWVudCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCB7IHNsb3RTY29wZUlkczogZnJhZ21lbnRTbG90U2NvcGVJZHMgfSA9IHZub2RlO1xuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50Tm9kZShub2RlKTtcbiAgICBjb25zdCBuZXh0ID0gaHlkcmF0ZUNoaWxkcmVuKFxuICAgICAgbmV4dFNpYmxpbmcobm9kZSksXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgb3B0aW1pemVkXG4gICAgKTtcbiAgICBpZiAobmV4dCAmJiBpc0NvbW1lbnQobmV4dCkgJiYgbmV4dC5kYXRhID09PSBcIl1cIikge1xuICAgICAgcmV0dXJuIG5leHRTaWJsaW5nKHZub2RlLmFuY2hvciA9IG5leHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dNaXNtYXRjaEVycm9yKCk7XG4gICAgICBpbnNlcnQodm5vZGUuYW5jaG9yID0gY3JlYXRlQ29tbWVudChgXWApLCBjb250YWluZXIsIG5leHQpO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVNaXNtYXRjaCA9IChub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgc2xvdFNjb3BlSWRzLCBpc0ZyYWdtZW50KSA9PiB7XG4gICAgaWYgKCFpc01pc21hdGNoQWxsb3dlZChub2RlLnBhcmVudEVsZW1lbnQsIDEgLyogQ0hJTERSRU4gKi8pKSB7XG4gICAgICAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18pICYmIHdhcm4kMShcbiAgICAgICAgYEh5ZHJhdGlvbiBub2RlIG1pc21hdGNoOlxuLSByZW5kZXJlZCBvbiBzZXJ2ZXI6YCxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbm9kZS5ub2RlVHlwZSA9PT0gMyA/IGAodGV4dClgIDogaXNDb21tZW50KG5vZGUpICYmIG5vZGUuZGF0YSA9PT0gXCJbXCIgPyBgKHN0YXJ0IG9mIGZyYWdtZW50KWAgOiBgYCxcbiAgICAgICAgYFxuLSBleHBlY3RlZCBvbiBjbGllbnQ6YCxcbiAgICAgICAgdm5vZGUudHlwZVxuICAgICAgKTtcbiAgICAgIGxvZ01pc21hdGNoRXJyb3IoKTtcbiAgICB9XG4gICAgdm5vZGUuZWwgPSBudWxsO1xuICAgIGlmIChpc0ZyYWdtZW50KSB7XG4gICAgICBjb25zdCBlbmQgPSBsb2NhdGVDbG9zaW5nQW5jaG9yKG5vZGUpO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV4dDIgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICAgICAgaWYgKG5leHQyICYmIG5leHQyICE9PSBlbmQpIHtcbiAgICAgICAgICByZW1vdmUobmV4dDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSBuZXh0U2libGluZyhub2RlKTtcbiAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnROb2RlKG5vZGUpO1xuICAgIHJlbW92ZShub2RlKTtcbiAgICBwYXRjaChcbiAgICAgIG51bGwsXG4gICAgICB2bm9kZSxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG5leHQsXG4gICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgIGdldENvbnRhaW5lclR5cGUoY29udGFpbmVyKSxcbiAgICAgIHNsb3RTY29wZUlkc1xuICAgICk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH07XG4gIGNvbnN0IGxvY2F0ZUNsb3NpbmdBbmNob3IgPSAobm9kZSwgb3BlbiA9IFwiW1wiLCBjbG9zZSA9IFwiXVwiKSA9PiB7XG4gICAgbGV0IG1hdGNoID0gMDtcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgbm9kZSA9IG5leHRTaWJsaW5nKG5vZGUpO1xuICAgICAgaWYgKG5vZGUgJiYgaXNDb21tZW50KG5vZGUpKSB7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IG9wZW4pIG1hdGNoKys7XG4gICAgICAgIGlmIChub2RlLmRhdGEgPT09IGNsb3NlKSB7XG4gICAgICAgICAgaWYgKG1hdGNoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV4dFNpYmxpbmcobm9kZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9O1xuICBjb25zdCByZXBsYWNlTm9kZSA9IChuZXdOb2RlLCBvbGROb2RlLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBjb25zdCBwYXJlbnROb2RlMiA9IG9sZE5vZGUucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZTIpIHtcbiAgICAgIHBhcmVudE5vZGUyLnJlcGxhY2VDaGlsZChuZXdOb2RlLCBvbGROb2RlKTtcbiAgICB9XG4gICAgbGV0IHBhcmVudCA9IHBhcmVudENvbXBvbmVudDtcbiAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LnZub2RlLmVsID09PSBvbGROb2RlKSB7XG4gICAgICAgIHBhcmVudC52bm9kZS5lbCA9IHBhcmVudC5zdWJUcmVlLmVsID0gbmV3Tm9kZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1RlbXBsYXRlTm9kZSA9IChub2RlKSA9PiB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS50YWdOYW1lID09PSBcIlRFTVBMQVRFXCI7XG4gIH07XG4gIHJldHVybiBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdO1xufVxuZnVuY3Rpb24gcHJvcEhhc01pc21hdGNoKGVsLCBrZXksIGNsaWVudFZhbHVlLCB2bm9kZSwgaW5zdGFuY2UpIHtcbiAgbGV0IG1pc21hdGNoVHlwZTtcbiAgbGV0IG1pc21hdGNoS2V5O1xuICBsZXQgYWN0dWFsO1xuICBsZXQgZXhwZWN0ZWQ7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgIGV4cGVjdGVkID0gbm9ybWFsaXplQ2xhc3MoY2xpZW50VmFsdWUpO1xuICAgIGlmICghaXNTZXRFcXVhbCh0b0NsYXNzU2V0KGFjdHVhbCB8fCBcIlwiKSwgdG9DbGFzc1NldChleHBlY3RlZCkpKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSAyIC8qIENMQVNTICovO1xuICAgICAgbWlzbWF0Y2hLZXkgPSBgY2xhc3NgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgIGFjdHVhbCA9IGVsLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpIHx8IFwiXCI7XG4gICAgZXhwZWN0ZWQgPSBpc1N0cmluZyhjbGllbnRWYWx1ZSkgPyBjbGllbnRWYWx1ZSA6IHN0cmluZ2lmeVN0eWxlKG5vcm1hbGl6ZVN0eWxlKGNsaWVudFZhbHVlKSk7XG4gICAgY29uc3QgYWN0dWFsTWFwID0gdG9TdHlsZU1hcChhY3R1YWwpO1xuICAgIGNvbnN0IGV4cGVjdGVkTWFwID0gdG9TdHlsZU1hcChleHBlY3RlZCk7XG4gICAgaWYgKHZub2RlLmRpcnMpIHtcbiAgICAgIGZvciAoY29uc3QgeyBkaXIsIHZhbHVlIH0gb2Ygdm5vZGUuZGlycykge1xuICAgICAgICBpZiAoZGlyLm5hbWUgPT09IFwic2hvd1wiICYmICF2YWx1ZSkge1xuICAgICAgICAgIGV4cGVjdGVkTWFwLnNldChcImRpc3BsYXlcIiwgXCJub25lXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UsIHZub2RlLCBleHBlY3RlZE1hcCk7XG4gICAgfVxuICAgIGlmICghaXNNYXBFcXVhbChhY3R1YWxNYXAsIGV4cGVjdGVkTWFwKSkge1xuICAgICAgbWlzbWF0Y2hUeXBlID0gMyAvKiBTVFlMRSAqLztcbiAgICAgIG1pc21hdGNoS2V5ID0gXCJzdHlsZVwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChlbCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgJiYgaXNLbm93blN2Z0F0dHIoa2V5KSB8fCBlbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIChpc0Jvb2xlYW5BdHRyKGtleSkgfHwgaXNLbm93bkh0bWxBdHRyKGtleSkpKSB7XG4gICAgaWYgKGlzQm9vbGVhbkF0dHIoa2V5KSkge1xuICAgICAgYWN0dWFsID0gZWwuaGFzQXR0cmlidXRlKGtleSk7XG4gICAgICBleHBlY3RlZCA9IGluY2x1ZGVCb29sZWFuQXR0cihjbGllbnRWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChjbGllbnRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICBhY3R1YWwgPSBlbC5oYXNBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIGV4cGVjdGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoa2V5KSkge1xuICAgICAgICBhY3R1YWwgPSBlbC5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInZhbHVlXCIgJiYgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgICAgIGFjdHVhbCA9IGVsLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0dWFsID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBleHBlY3RlZCA9IGlzUmVuZGVyYWJsZUF0dHJWYWx1ZShjbGllbnRWYWx1ZSkgPyBTdHJpbmcoY2xpZW50VmFsdWUpIDogZmFsc2U7XG4gICAgfVxuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICBtaXNtYXRjaFR5cGUgPSA0IC8qIEFUVFJJQlVURSAqLztcbiAgICAgIG1pc21hdGNoS2V5ID0ga2V5O1xuICAgIH1cbiAgfVxuICBpZiAobWlzbWF0Y2hUeXBlICE9IG51bGwgJiYgIWlzTWlzbWF0Y2hBbGxvd2VkKGVsLCBtaXNtYXRjaFR5cGUpKSB7XG4gICAgY29uc3QgZm9ybWF0ID0gKHYpID0+IHYgPT09IGZhbHNlID8gYChub3QgcmVuZGVyZWQpYCA6IGAke21pc21hdGNoS2V5fT1cIiR7dn1cImA7XG4gICAgY29uc3QgcHJlU2VnbWVudCA9IGBIeWRyYXRpb24gJHtNaXNtYXRjaFR5cGVTdHJpbmdbbWlzbWF0Y2hUeXBlXX0gbWlzbWF0Y2ggb25gO1xuICAgIGNvbnN0IHBvc3RTZWdtZW50ID0gYFxuICAtIHJlbmRlcmVkIG9uIHNlcnZlcjogJHtmb3JtYXQoYWN0dWFsKX1cbiAgLSBleHBlY3RlZCBvbiBjbGllbnQ6ICR7Zm9ybWF0KGV4cGVjdGVkKX1cbiAgTm90ZTogdGhpcyBtaXNtYXRjaCBpcyBjaGVjay1vbmx5LiBUaGUgRE9NIHdpbGwgbm90IGJlIHJlY3RpZmllZCBpbiBwcm9kdWN0aW9uIGR1ZSB0byBwZXJmb3JtYW5jZSBvdmVyaGVhZC5cbiAgWW91IHNob3VsZCBmaXggdGhlIHNvdXJjZSBvZiB0aGUgbWlzbWF0Y2guYDtcbiAgICB7XG4gICAgICB3YXJuJDEocHJlU2VnbWVudCwgZWwsIHBvc3RTZWdtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gdG9DbGFzc1NldChzdHIpIHtcbiAgcmV0dXJuIG5ldyBTZXQoc3RyLnRyaW0oKS5zcGxpdCgvXFxzKy8pKTtcbn1cbmZ1bmN0aW9uIGlzU2V0RXF1YWwoYSwgYikge1xuICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChjb25zdCBzIG9mIGEpIHtcbiAgICBpZiAoIWIuaGFzKHMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gdG9TdHlsZU1hcChzdHIpIHtcbiAgY29uc3Qgc3R5bGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3RyLnNwbGl0KFwiO1wiKSkge1xuICAgIGxldCBba2V5LCB2YWx1ZV0gPSBpdGVtLnNwbGl0KFwiOlwiKTtcbiAgICBrZXkgPSBrZXkudHJpbSgpO1xuICAgIHZhbHVlID0gdmFsdWUgJiYgdmFsdWUudHJpbSgpO1xuICAgIGlmIChrZXkgJiYgdmFsdWUpIHtcbiAgICAgIHN0eWxlTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0eWxlTWFwO1xufVxuZnVuY3Rpb24gaXNNYXBFcXVhbChhLCBiKSB7XG4gIGlmIChhLnNpemUgIT09IGIuc2l6ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhKSB7XG4gICAgaWYgKHZhbHVlICE9PSBiLmdldChrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUNzc1ZhcnMoaW5zdGFuY2UsIHZub2RlLCBleHBlY3RlZE1hcCkge1xuICBjb25zdCByb290ID0gaW5zdGFuY2Uuc3ViVHJlZTtcbiAgaWYgKGluc3RhbmNlLmdldENzc1ZhcnMgJiYgKHZub2RlID09PSByb290IHx8IHJvb3QgJiYgcm9vdC50eXBlID09PSBGcmFnbWVudCAmJiByb290LmNoaWxkcmVuLmluY2x1ZGVzKHZub2RlKSkpIHtcbiAgICBjb25zdCBjc3NWYXJzID0gaW5zdGFuY2UuZ2V0Q3NzVmFycygpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGNzc1ZhcnMpIHtcbiAgICAgIGV4cGVjdGVkTWFwLnNldChcbiAgICAgICAgYC0tJHtnZXRFc2NhcGVkQ3NzVmFyTmFtZShrZXksIGZhbHNlKX1gLFxuICAgICAgICBTdHJpbmcoY3NzVmFyc1trZXldKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZub2RlID09PSByb290ICYmIGluc3RhbmNlLnBhcmVudCkge1xuICAgIHJlc29sdmVDc3NWYXJzKGluc3RhbmNlLnBhcmVudCwgaW5zdGFuY2Uudm5vZGUsIGV4cGVjdGVkTWFwKTtcbiAgfVxufVxuY29uc3QgYWxsb3dNaXNtYXRjaEF0dHIgPSBcImRhdGEtYWxsb3ctbWlzbWF0Y2hcIjtcbmNvbnN0IE1pc21hdGNoVHlwZVN0cmluZyA9IHtcbiAgWzAgLyogVEVYVCAqL106IFwidGV4dFwiLFxuICBbMSAvKiBDSElMRFJFTiAqL106IFwiY2hpbGRyZW5cIixcbiAgWzIgLyogQ0xBU1MgKi9dOiBcImNsYXNzXCIsXG4gIFszIC8qIFNUWUxFICovXTogXCJzdHlsZVwiLFxuICBbNCAvKiBBVFRSSUJVVEUgKi9dOiBcImF0dHJpYnV0ZVwiXG59O1xuZnVuY3Rpb24gaXNNaXNtYXRjaEFsbG93ZWQoZWwsIGFsbG93ZWRUeXBlKSB7XG4gIGlmIChhbGxvd2VkVHlwZSA9PT0gMCAvKiBURVhUICovIHx8IGFsbG93ZWRUeXBlID09PSAxIC8qIENISUxEUkVOICovKSB7XG4gICAgd2hpbGUgKGVsICYmICFlbC5oYXNBdHRyaWJ1dGUoYWxsb3dNaXNtYXRjaEF0dHIpKSB7XG4gICAgICBlbCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuICB9XG4gIGNvbnN0IGFsbG93ZWRBdHRyID0gZWwgJiYgZWwuZ2V0QXR0cmlidXRlKGFsbG93TWlzbWF0Y2hBdHRyKTtcbiAgaWYgKGFsbG93ZWRBdHRyID09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoYWxsb3dlZEF0dHIgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaXN0ID0gYWxsb3dlZEF0dHIuc3BsaXQoXCIsXCIpO1xuICAgIGlmIChhbGxvd2VkVHlwZSA9PT0gMCAvKiBURVhUICovICYmIGxpc3QuaW5jbHVkZXMoXCJjaGlsZHJlblwiKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd2VkQXR0ci5zcGxpdChcIixcIikuaW5jbHVkZXMoTWlzbWF0Y2hUeXBlU3RyaW5nW2FsbG93ZWRUeXBlXSk7XG4gIH1cbn1cblxuY29uc3QgaHlkcmF0ZU9uSWRsZSA9ICh0aW1lb3V0ID0gMWU0KSA9PiAoaHlkcmF0ZSkgPT4ge1xuICBjb25zdCBpZCA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soaHlkcmF0ZSwgeyB0aW1lb3V0IH0pO1xuICByZXR1cm4gKCkgPT4gY2FuY2VsSWRsZUNhbGxiYWNrKGlkKTtcbn07XG5jb25zdCBoeWRyYXRlT25WaXNpYmxlID0gKG9wdHMpID0+IChoeWRyYXRlLCBmb3JFYWNoKSA9PiB7XG4gIGNvbnN0IG9iID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZS5pc0ludGVyc2VjdGluZykgY29udGludWU7XG4gICAgICBvYi5kaXNjb25uZWN0KCk7XG4gICAgICBoeWRyYXRlKCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0sIG9wdHMpO1xuICBmb3JFYWNoKChlbCkgPT4gb2Iub2JzZXJ2ZShlbCkpO1xuICByZXR1cm4gKCkgPT4gb2IuZGlzY29ubmVjdCgpO1xufTtcbmNvbnN0IGh5ZHJhdGVPbk1lZGlhUXVlcnkgPSAocXVlcnkpID0+IChoeWRyYXRlKSA9PiB7XG4gIGlmIChxdWVyeSkge1xuICAgIGNvbnN0IG1xbCA9IG1hdGNoTWVkaWEocXVlcnkpO1xuICAgIGlmIChtcWwubWF0Y2hlcykge1xuICAgICAgaHlkcmF0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBoeWRyYXRlLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgaHlkcmF0ZSk7XG4gICAgfVxuICB9XG59O1xuY29uc3QgaHlkcmF0ZU9uSW50ZXJhY3Rpb24gPSAoaW50ZXJhY3Rpb25zID0gW10pID0+IChoeWRyYXRlLCBmb3JFYWNoKSA9PiB7XG4gIGlmIChpc1N0cmluZyhpbnRlcmFjdGlvbnMpKSBpbnRlcmFjdGlvbnMgPSBbaW50ZXJhY3Rpb25zXTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGRvSHlkcmF0ZSA9IChlKSA9PiB7XG4gICAgaWYgKCFoYXNIeWRyYXRlZCkge1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgdGVhcmRvd24oKTtcbiAgICAgIGh5ZHJhdGUoKTtcbiAgICAgIGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IGUuY29uc3RydWN0b3IoZS50eXBlLCBlKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCB0ZWFyZG93biA9ICgpID0+IHtcbiAgICBmb3JFYWNoKChlbCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGksIGRvSHlkcmF0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGZvckVhY2goKGVsKSA9PiB7XG4gICAgZm9yIChjb25zdCBpIG9mIGludGVyYWN0aW9ucykge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihpLCBkb0h5ZHJhdGUsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGVhcmRvd247XG59O1xuZnVuY3Rpb24gZm9yRWFjaEVsZW1lbnQobm9kZSwgY2IpIHtcbiAgaWYgKGlzQ29tbWVudChub2RlKSAmJiBub2RlLmRhdGEgPT09IFwiW1wiKSB7XG4gICAgbGV0IGRlcHRoID0gMTtcbiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNiKG5leHQpO1xuICAgICAgfSBlbHNlIGlmIChpc0NvbW1lbnQobmV4dCkpIHtcbiAgICAgICAgaWYgKG5leHQuZGF0YSA9PT0gXCJdXCIpIHtcbiAgICAgICAgICBpZiAoLS1kZXB0aCA9PT0gMCkgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAobmV4dC5kYXRhID09PSBcIltcIikge1xuICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHQgPSBuZXh0Lm5leHRTaWJsaW5nO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjYihub2RlKTtcbiAgfVxufVxuXG5jb25zdCBpc0FzeW5jV3JhcHBlciA9IChpKSA9PiAhIWkudHlwZS5fX2FzeW5jTG9hZGVyO1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQXN5bmNDb21wb25lbnQoc291cmNlKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHNvdXJjZSkpIHtcbiAgICBzb3VyY2UgPSB7IGxvYWRlcjogc291cmNlIH07XG4gIH1cbiAgY29uc3Qge1xuICAgIGxvYWRlcixcbiAgICBsb2FkaW5nQ29tcG9uZW50LFxuICAgIGVycm9yQ29tcG9uZW50LFxuICAgIGRlbGF5ID0gMjAwLFxuICAgIGh5ZHJhdGU6IGh5ZHJhdGVTdHJhdGVneSxcbiAgICB0aW1lb3V0LFxuICAgIC8vIHVuZGVmaW5lZCA9IG5ldmVyIHRpbWVzIG91dFxuICAgIHN1c3BlbnNpYmxlID0gdHJ1ZSxcbiAgICBvbkVycm9yOiB1c2VyT25FcnJvclxuICB9ID0gc291cmNlO1xuICBsZXQgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICBsZXQgcmVzb2x2ZWRDb21wO1xuICBsZXQgcmV0cmllcyA9IDA7XG4gIGNvbnN0IHJldHJ5ID0gKCkgPT4ge1xuICAgIHJldHJpZXMrKztcbiAgICBwZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgcmV0dXJuIGxvYWQoKTtcbiAgfTtcbiAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICBsZXQgdGhpc1JlcXVlc3Q7XG4gICAgcmV0dXJuIHBlbmRpbmdSZXF1ZXN0IHx8ICh0aGlzUmVxdWVzdCA9IHBlbmRpbmdSZXF1ZXN0ID0gbG9hZGVyKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoU3RyaW5nKGVycikpO1xuICAgICAgaWYgKHVzZXJPbkVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXNlclJldHJ5ID0gKCkgPT4gcmVzb2x2ZShyZXRyeSgpKTtcbiAgICAgICAgICBjb25zdCB1c2VyRmFpbCA9ICgpID0+IHJlamVjdChlcnIpO1xuICAgICAgICAgIHVzZXJPbkVycm9yKGVyciwgdXNlclJldHJ5LCB1c2VyRmFpbCwgcmV0cmllcyArIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KS50aGVuKChjb21wKSA9PiB7XG4gICAgICBpZiAodGhpc1JlcXVlc3QgIT09IHBlbmRpbmdSZXF1ZXN0ICYmIHBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBwZW5kaW5nUmVxdWVzdDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjb21wKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IGxvYWRlciByZXNvbHZlZCB0byB1bmRlZmluZWQuIElmIHlvdSBhcmUgdXNpbmcgcmV0cnkoKSwgbWFrZSBzdXJlIHRvIHJldHVybiBpdHMgcmV0dXJuIHZhbHVlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wICYmIChjb21wLl9fZXNNb2R1bGUgfHwgY29tcFtTeW1ib2wudG9TdHJpbmdUYWddID09PSBcIk1vZHVsZVwiKSkge1xuICAgICAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICAgICAgfVxuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY29tcCAmJiAhaXNPYmplY3QoY29tcCkgJiYgIWlzRnVuY3Rpb24oY29tcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzeW5jIGNvbXBvbmVudCBsb2FkIHJlc3VsdDogJHtjb21wfWApO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZWRDb21wID0gY29tcDtcbiAgICAgIHJldHVybiBjb21wO1xuICAgIH0pKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmluZUNvbXBvbmVudCh7XG4gICAgbmFtZTogXCJBc3luY0NvbXBvbmVudFdyYXBwZXJcIixcbiAgICBfX2FzeW5jTG9hZGVyOiBsb2FkLFxuICAgIF9fYXN5bmNIeWRyYXRlKGVsLCBpbnN0YW5jZSwgaHlkcmF0ZSkge1xuICAgICAgY29uc3QgZG9IeWRyYXRlID0gaHlkcmF0ZVN0cmF0ZWd5ID8gKCkgPT4ge1xuICAgICAgICBjb25zdCB0ZWFyZG93biA9IGh5ZHJhdGVTdHJhdGVneShcbiAgICAgICAgICBoeWRyYXRlLFxuICAgICAgICAgIChjYikgPT4gZm9yRWFjaEVsZW1lbnQoZWwsIGNiKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGVhcmRvd24pIHtcbiAgICAgICAgICAoaW5zdGFuY2UuYnVtIHx8IChpbnN0YW5jZS5idW0gPSBbXSkpLnB1c2godGVhcmRvd24pO1xuICAgICAgICB9XG4gICAgICB9IDogaHlkcmF0ZTtcbiAgICAgIGlmIChyZXNvbHZlZENvbXApIHtcbiAgICAgICAgZG9IeWRyYXRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkKCkudGhlbigoKSA9PiAhaW5zdGFuY2UuaXNVbm1vdW50ZWQgJiYgZG9IeWRyYXRlKCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0IF9fYXN5bmNSZXNvbHZlZCgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZENvbXA7XG4gICAgfSxcbiAgICBzZXR1cCgpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlO1xuICAgICAgbWFya0FzeW5jQm91bmRhcnkoaW5zdGFuY2UpO1xuICAgICAgaWYgKHJlc29sdmVkQ29tcCkge1xuICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKHJlc29sdmVkQ29tcCwgaW5zdGFuY2UpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgcGVuZGluZ1JlcXVlc3QgPSBudWxsO1xuICAgICAgICBoYW5kbGVFcnJvcihcbiAgICAgICAgICBlcnIsXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgMTMsXG4gICAgICAgICAgIWVycm9yQ29tcG9uZW50XG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgaWYgKHN1c3BlbnNpYmxlICYmIGluc3RhbmNlLnN1c3BlbnNlIHx8IGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgICAgICByZXR1cm4gbG9hZCgpLnRoZW4oKGNvbXApID0+IHtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gY3JlYXRlSW5uZXJDb21wKGNvbXAsIGluc3RhbmNlKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICByZXR1cm4gKCkgPT4gZXJyb3JDb21wb25lbnQgPyBjcmVhdGVWTm9kZShlcnJvckNvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyb3I6IGVyclxuICAgICAgICAgIH0pIDogbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2FkZWQgPSByZWYoZmFsc2UpO1xuICAgICAgY29uc3QgZXJyb3IgPSByZWYoKTtcbiAgICAgIGNvbnN0IGRlbGF5ZWQgPSByZWYoISFkZWxheSk7XG4gICAgICBpZiAoZGVsYXkpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgZGVsYXllZC52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9LCBkZWxheSk7XG4gICAgICB9XG4gICAgICBpZiAodGltZW91dCAhPSBudWxsKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghbG9hZGVkLnZhbHVlICYmICFlcnJvci52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgQXN5bmMgY29tcG9uZW50IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXMuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG9uRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICB9XG4gICAgICBsb2FkKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxvYWRlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgIGlmIChpbnN0YW5jZS5wYXJlbnQgJiYgaXNLZWVwQWxpdmUoaW5zdGFuY2UucGFyZW50LnZub2RlKSkge1xuICAgICAgICAgIGluc3RhbmNlLnBhcmVudC51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIGVycm9yLnZhbHVlID0gZXJyO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAobG9hZGVkLnZhbHVlICYmIHJlc29sdmVkQ29tcCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbm5lckNvbXAocmVzb2x2ZWRDb21wLCBpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IudmFsdWUgJiYgZXJyb3JDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUoZXJyb3JDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci52YWx1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxvYWRpbmdDb21wb25lbnQgJiYgIWRlbGF5ZWQudmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlVk5vZGUobG9hZGluZ0NvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUlubmVyQ29tcChjb21wLCBwYXJlbnQpIHtcbiAgY29uc3QgeyByZWY6IHJlZjIsIHByb3BzLCBjaGlsZHJlbiwgY2UgfSA9IHBhcmVudC52bm9kZTtcbiAgY29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShjb21wLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5yZWYgPSByZWYyO1xuICB2bm9kZS5jZSA9IGNlO1xuICBkZWxldGUgcGFyZW50LnZub2RlLmNlO1xuICByZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IGlzS2VlcEFsaXZlID0gKHZub2RlKSA9PiB2bm9kZS50eXBlLl9faXNLZWVwQWxpdmU7XG5jb25zdCBLZWVwQWxpdmVJbXBsID0ge1xuICBuYW1lOiBgS2VlcEFsaXZlYCxcbiAgLy8gTWFya2VyIGZvciBzcGVjaWFsIGhhbmRsaW5nIGluc2lkZSB0aGUgcmVuZGVyZXIuIFdlIGFyZSBub3QgdXNpbmcgYSA9PT1cbiAgLy8gY2hlY2sgZGlyZWN0bHkgb24gS2VlcEFsaXZlIGluIHRoZSByZW5kZXJlciwgYmVjYXVzZSBpbXBvcnRpbmcgaXQgZGlyZWN0bHlcbiAgLy8gd291bGQgcHJldmVudCBpdCBmcm9tIGJlaW5nIHRyZWUtc2hha2VuLlxuICBfX2lzS2VlcEFsaXZlOiB0cnVlLFxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIGV4Y2x1ZGU6IFtTdHJpbmcsIFJlZ0V4cCwgQXJyYXldLFxuICAgIG1heDogW1N0cmluZywgTnVtYmVyXVxuICB9LFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzaGFyZWRDb250ZXh0ID0gaW5zdGFuY2UuY3R4O1xuICAgIGlmICghc2hhcmVkQ29udGV4dC5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ICYmIHNsb3RzLmRlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA9PT0gMSA/IGNoaWxkcmVuWzBdIDogY2hpbGRyZW47XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgY29uc3Qga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgbGV0IGN1cnJlbnQgPSBudWxsO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgaW5zdGFuY2UuX192X2NhY2hlID0gY2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudFN1c3BlbnNlID0gaW5zdGFuY2Uuc3VzcGVuc2U7XG4gICAgY29uc3Qge1xuICAgICAgcmVuZGVyZXI6IHtcbiAgICAgICAgcDogcGF0Y2gsXG4gICAgICAgIG06IG1vdmUsXG4gICAgICAgIHVtOiBfdW5tb3VudCxcbiAgICAgICAgbzogeyBjcmVhdGVFbGVtZW50IH1cbiAgICAgIH1cbiAgICB9ID0gc2hhcmVkQ29udGV4dDtcbiAgICBjb25zdCBzdG9yYWdlQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBzaGFyZWRDb250ZXh0LmFjdGl2YXRlID0gKHZub2RlLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIG1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCAwLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgaW5zdGFuY2UyLnZub2RlLFxuICAgICAgICB2bm9kZSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIGluc3RhbmNlMixcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoaW5zdGFuY2UyLmEpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhpbnN0YW5jZTIuYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZU1vdW50ZWQ7XG4gICAgICAgIGlmICh2bm9kZUhvb2spIHtcbiAgICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBpbnN0YW5jZTIucGFyZW50LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICBkZXZ0b29sc0NvbXBvbmVudEFkZGVkKGluc3RhbmNlMik7XG4gICAgICB9XG4gICAgfTtcbiAgICBzaGFyZWRDb250ZXh0LmRlYWN0aXZhdGUgPSAodm5vZGUpID0+IHtcbiAgICAgIGNvbnN0IGluc3RhbmNlMiA9IHZub2RlLmNvbXBvbmVudDtcbiAgICAgIGludmFsaWRhdGVNb3VudChpbnN0YW5jZTIubSk7XG4gICAgICBpbnZhbGlkYXRlTW91bnQoaW5zdGFuY2UyLmEpO1xuICAgICAgbW92ZSh2bm9kZSwgc3RvcmFnZUNvbnRhaW5lciwgbnVsbCwgMSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGluc3RhbmNlMi5kYSkge1xuICAgICAgICAgIGludm9rZUFycmF5Rm5zKGluc3RhbmNlMi5kYSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgdm5vZGVIb29rID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMub25Wbm9kZVVubW91bnRlZDtcbiAgICAgICAgaWYgKHZub2RlSG9vaykge1xuICAgICAgICAgIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIGluc3RhbmNlMi5wYXJlbnQsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnN0YW5jZTIuaXNEZWFjdGl2YXRlZCA9IHRydWU7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZTIpO1xuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSkge1xuICAgICAgcmVzZXRTaGFwZUZsYWcodm5vZGUpO1xuICAgICAgX3VubW91bnQodm5vZGUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBydW5lQ2FjaGUoZmlsdGVyKSB7XG4gICAgICBjYWNoZS5mb3JFYWNoKCh2bm9kZSwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHZub2RlLnR5cGUpO1xuICAgICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkoa2V5KSB7XG4gICAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoa2V5KTtcbiAgICAgIGlmIChjYWNoZWQgJiYgKCFjdXJyZW50IHx8ICFpc1NhbWVWTm9kZVR5cGUoY2FjaGVkLCBjdXJyZW50KSkpIHtcbiAgICAgICAgdW5tb3VudChjYWNoZWQpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICAgIHJlc2V0U2hhcGVGbGFnKGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICBrZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICB3YXRjaChcbiAgICAgICgpID0+IFtwcm9wcy5pbmNsdWRlLCBwcm9wcy5leGNsdWRlXSxcbiAgICAgIChbaW5jbHVkZSwgZXhjbHVkZV0pID0+IHtcbiAgICAgICAgaW5jbHVkZSAmJiBwcnVuZUNhY2hlKChuYW1lKSA9PiBtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKTtcbiAgICAgICAgZXhjbHVkZSAmJiBwcnVuZUNhY2hlKChuYW1lKSA9PiAhbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSk7XG4gICAgICB9LFxuICAgICAgLy8gcHJ1bmUgcG9zdC1yZW5kZXIgYWZ0ZXIgYGN1cnJlbnRgIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgIHsgZmx1c2g6IFwicG9zdFwiLCBkZWVwOiB0cnVlIH1cbiAgICApO1xuICAgIGxldCBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgIGNvbnN0IGNhY2hlU3VidHJlZSA9ICgpID0+IHtcbiAgICAgIGlmIChwZW5kaW5nQ2FjaGVLZXkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNTdXNwZW5zZShpbnN0YW5jZS5zdWJUcmVlLnR5cGUpKSB7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSkpO1xuICAgICAgICAgIH0sIGluc3RhbmNlLnN1YlRyZWUuc3VzcGVuc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhY2hlLnNldChwZW5kaW5nQ2FjaGVLZXksIGdldElubmVyQ2hpbGQoaW5zdGFuY2Uuc3ViVHJlZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBvbk1vdW50ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvblVwZGF0ZWQoY2FjaGVTdWJ0cmVlKTtcbiAgICBvbkJlZm9yZVVubW91bnQoKCkgPT4ge1xuICAgICAgY2FjaGUuZm9yRWFjaCgoY2FjaGVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3ViVHJlZSwgc3VzcGVuc2UgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCB2bm9kZSA9IGdldElubmVyQ2hpbGQoc3ViVHJlZSk7XG4gICAgICAgIGlmIChjYWNoZWQudHlwZSA9PT0gdm5vZGUudHlwZSAmJiBjYWNoZWQua2V5ID09PSB2bm9kZS5rZXkpIHtcbiAgICAgICAgICByZXNldFNoYXBlRmxhZyh2bm9kZSk7XG4gICAgICAgICAgY29uc3QgZGEgPSB2bm9kZS5jb21wb25lbnQuZGE7XG4gICAgICAgICAgZGEgJiYgcXVldWVQb3N0UmVuZGVyRWZmZWN0KGRhLCBzdXNwZW5zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHVubW91bnQoY2FjaGVkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBwZW5kaW5nQ2FjaGVLZXkgPSBudWxsO1xuICAgICAgaWYgKCFzbG90cy5kZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gc2xvdHMuZGVmYXVsdCgpO1xuICAgICAgY29uc3QgcmF3Vk5vZGUgPSBjaGlsZHJlblswXTtcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgd2FybiQxKGBLZWVwQWxpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgY29tcG9uZW50IGNoaWxkLmApO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHJhd1ZOb2RlKSB8fCAhKHJhd1ZOb2RlLnNoYXBlRmxhZyAmIDQpICYmICEocmF3Vk5vZGUuc2hhcGVGbGFnICYgMTI4KSkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHJhd1ZOb2RlO1xuICAgICAgfVxuICAgICAgbGV0IHZub2RlID0gZ2V0SW5uZXJDaGlsZChyYXdWTm9kZSk7XG4gICAgICBpZiAodm5vZGUudHlwZSA9PT0gQ29tbWVudCkge1xuICAgICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHZub2RlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29tcCA9IHZub2RlLnR5cGU7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgaXNBc3luY1dyYXBwZXIodm5vZGUpID8gdm5vZGUudHlwZS5fX2FzeW5jUmVzb2x2ZWQgfHwge30gOiBjb21wXG4gICAgICApO1xuICAgICAgY29uc3QgeyBpbmNsdWRlLCBleGNsdWRlLCBtYXggfSA9IHByb3BzO1xuICAgICAgaWYgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSB8fCBleGNsdWRlICYmIG5hbWUgJiYgbWF0Y2hlcyhleGNsdWRlLCBuYW1lKSkge1xuICAgICAgICB2bm9kZS5zaGFwZUZsYWcgJj0gfjI1NjtcbiAgICAgICAgY3VycmVudCA9IHZub2RlO1xuICAgICAgICByZXR1cm4gcmF3Vk5vZGU7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSB2bm9kZS5rZXkgPT0gbnVsbCA/IGNvbXAgOiB2bm9kZS5rZXk7XG4gICAgICBjb25zdCBjYWNoZWRWTm9kZSA9IGNhY2hlLmdldChrZXkpO1xuICAgICAgaWYgKHZub2RlLmVsKSB7XG4gICAgICAgIHZub2RlID0gY2xvbmVWTm9kZSh2bm9kZSk7XG4gICAgICAgIGlmIChyYXdWTm9kZS5zaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICByYXdWTm9kZS5zc0NvbnRlbnQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0NhY2hlS2V5ID0ga2V5O1xuICAgICAgaWYgKGNhY2hlZFZOb2RlKSB7XG4gICAgICAgIHZub2RlLmVsID0gY2FjaGVkVk5vZGUuZWw7XG4gICAgICAgIHZub2RlLmNvbXBvbmVudCA9IGNhY2hlZFZOb2RlLmNvbXBvbmVudDtcbiAgICAgICAgaWYgKHZub2RlLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uSG9va3Modm5vZGUsIHZub2RlLnRyYW5zaXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHZub2RlLnNoYXBlRmxhZyB8PSA1MTI7XG4gICAgICAgIGtleXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGtleXMuYWRkKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBrZXlzLmFkZChrZXkpO1xuICAgICAgICBpZiAobWF4ICYmIGtleXMuc2l6ZSA+IHBhcnNlSW50KG1heCwgMTApKSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGtleXMudmFsdWVzKCkubmV4dCgpLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm5vZGUuc2hhcGVGbGFnIHw9IDI1NjtcbiAgICAgIGN1cnJlbnQgPSB2bm9kZTtcbiAgICAgIHJldHVybiBpc1N1c3BlbnNlKHJhd1ZOb2RlLnR5cGUpID8gcmF3Vk5vZGUgOiB2bm9kZTtcbiAgICB9O1xuICB9XG59O1xuY29uc3QgS2VlcEFsaXZlID0gS2VlcEFsaXZlSW1wbDtcbmZ1bmN0aW9uIG1hdGNoZXMocGF0dGVybiwgbmFtZSkge1xuICBpZiAoaXNBcnJheShwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnNvbWUoKHApID0+IG1hdGNoZXMocCwgbmFtZSkpO1xuICB9IGVsc2UgaWYgKGlzU3RyaW5nKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoXCIsXCIpLmluY2x1ZGVzKG5hbWUpO1xuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gb25BY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImFcIiwgdGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIG9uRGVhY3RpdmF0ZWQoaG9vaywgdGFyZ2V0KSB7XG4gIHJlZ2lzdGVyS2VlcEFsaXZlSG9vayhob29rLCBcImRhXCIsIHRhcmdldCk7XG59XG5mdW5jdGlvbiByZWdpc3RlcktlZXBBbGl2ZUhvb2soaG9vaywgdHlwZSwgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSB7XG4gIGNvbnN0IHdyYXBwZWRIb29rID0gaG9vay5fX3dkYyB8fCAoaG9vay5fX3dkYyA9ICgpID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHRhcmdldDtcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgaWYgKGN1cnJlbnQuaXNEZWFjdGl2YXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBob29rKCk7XG4gIH0pO1xuICBpbmplY3RIb29rKHR5cGUsIHdyYXBwZWRIb29rLCB0YXJnZXQpO1xuICBpZiAodGFyZ2V0KSB7XG4gICAgbGV0IGN1cnJlbnQgPSB0YXJnZXQucGFyZW50O1xuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQucGFyZW50KSB7XG4gICAgICBpZiAoaXNLZWVwQWxpdmUoY3VycmVudC5wYXJlbnQudm5vZGUpKSB7XG4gICAgICAgIGluamVjdFRvS2VlcEFsaXZlUm9vdCh3cmFwcGVkSG9vaywgdHlwZSwgdGFyZ2V0LCBjdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdFRvS2VlcEFsaXZlUm9vdChob29rLCB0eXBlLCB0YXJnZXQsIGtlZXBBbGl2ZVJvb3QpIHtcbiAgY29uc3QgaW5qZWN0ZWQgPSBpbmplY3RIb29rKFxuICAgIHR5cGUsXG4gICAgaG9vayxcbiAgICBrZWVwQWxpdmVSb290LFxuICAgIHRydWVcbiAgICAvKiBwcmVwZW5kICovXG4gICk7XG4gIG9uVW5tb3VudGVkKCgpID0+IHtcbiAgICByZW1vdmUoa2VlcEFsaXZlUm9vdFt0eXBlXSwgaW5qZWN0ZWQpO1xuICB9LCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gcmVzZXRTaGFwZUZsYWcodm5vZGUpIHtcbiAgdm5vZGUuc2hhcGVGbGFnICY9IH4yNTY7XG4gIHZub2RlLnNoYXBlRmxhZyAmPSB+NTEyO1xufVxuZnVuY3Rpb24gZ2V0SW5uZXJDaGlsZCh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuc2hhcGVGbGFnICYgMTI4ID8gdm5vZGUuc3NDb250ZW50IDogdm5vZGU7XG59XG5cbmZ1bmN0aW9uIGluamVjdEhvb2sodHlwZSwgaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlLCBwcmVwZW5kID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldCkge1xuICAgIGNvbnN0IGhvb2tzID0gdGFyZ2V0W3R5cGVdIHx8ICh0YXJnZXRbdHlwZV0gPSBbXSk7XG4gICAgY29uc3Qgd3JhcHBlZEhvb2sgPSBob29rLl9fd2VoIHx8IChob29rLl9fd2VoID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHBhdXNlVHJhY2tpbmcoKTtcbiAgICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKHRhcmdldCk7XG4gICAgICBjb25zdCByZXMgPSBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZyhob29rLCB0YXJnZXQsIHR5cGUsIGFyZ3MpO1xuICAgICAgcmVzZXQoKTtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG4gICAgaWYgKHByZXBlbmQpIHtcbiAgICAgIGhvb2tzLnVuc2hpZnQod3JhcHBlZEhvb2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBob29rcy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9XG4gICAgcmV0dXJuIHdyYXBwZWRIb29rO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBhcGlOYW1lID0gdG9IYW5kbGVyS2V5KEVycm9yVHlwZVN0cmluZ3MkMVt0eXBlXS5yZXBsYWNlKC8gaG9vayQvLCBcIlwiKSk7XG4gICAgd2FybiQxKFxuICAgICAgYCR7YXBpTmFtZX0gaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBiZSBhc3NvY2lhdGVkIHdpdGguIExpZmVjeWNsZSBpbmplY3Rpb24gQVBJcyBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBleGVjdXRpb24gb2Ygc2V0dXAoKS5gICsgKGAgSWYgeW91IGFyZSB1c2luZyBhc3luYyBzZXR1cCgpLCBtYWtlIHN1cmUgdG8gcmVnaXN0ZXIgbGlmZWN5Y2xlIGhvb2tzIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQgc3RhdGVtZW50LmAgKVxuICAgICk7XG4gIH1cbn1cbmNvbnN0IGNyZWF0ZUhvb2sgPSAobGlmZWN5Y2xlKSA9PiAoaG9vaywgdGFyZ2V0ID0gY3VycmVudEluc3RhbmNlKSA9PiB7XG4gIGlmICghaXNJblNTUkNvbXBvbmVudFNldHVwIHx8IGxpZmVjeWNsZSA9PT0gXCJzcFwiKSB7XG4gICAgaW5qZWN0SG9vayhsaWZlY3ljbGUsICguLi5hcmdzKSA9PiBob29rKC4uLmFyZ3MpLCB0YXJnZXQpO1xuICB9XG59O1xuY29uc3Qgb25CZWZvcmVNb3VudCA9IGNyZWF0ZUhvb2soXCJibVwiKTtcbmNvbnN0IG9uTW91bnRlZCA9IGNyZWF0ZUhvb2soXCJtXCIpO1xuY29uc3Qgb25CZWZvcmVVcGRhdGUgPSBjcmVhdGVIb29rKFxuICBcImJ1XCJcbik7XG5jb25zdCBvblVwZGF0ZWQgPSBjcmVhdGVIb29rKFwidVwiKTtcbmNvbnN0IG9uQmVmb3JlVW5tb3VudCA9IGNyZWF0ZUhvb2soXG4gIFwiYnVtXCJcbik7XG5jb25zdCBvblVubW91bnRlZCA9IGNyZWF0ZUhvb2soXCJ1bVwiKTtcbmNvbnN0IG9uU2VydmVyUHJlZmV0Y2ggPSBjcmVhdGVIb29rKFxuICBcInNwXCJcbik7XG5jb25zdCBvblJlbmRlclRyaWdnZXJlZCA9IGNyZWF0ZUhvb2soXCJydGdcIik7XG5jb25zdCBvblJlbmRlclRyYWNrZWQgPSBjcmVhdGVIb29rKFwicnRjXCIpO1xuZnVuY3Rpb24gb25FcnJvckNhcHR1cmVkKGhvb2ssIHRhcmdldCA9IGN1cnJlbnRJbnN0YW5jZSkge1xuICBpbmplY3RIb29rKFwiZWNcIiwgaG9vaywgdGFyZ2V0KTtcbn1cblxuY29uc3QgQ09NUE9ORU5UUyA9IFwiY29tcG9uZW50c1wiO1xuY29uc3QgRElSRUNUSVZFUyA9IFwiZGlyZWN0aXZlc1wiO1xuZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudChuYW1lLCBtYXliZVNlbGZSZWZlcmVuY2UpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBuYW1lLCB0cnVlLCBtYXliZVNlbGZSZWZlcmVuY2UpIHx8IG5hbWU7XG59XG5jb25zdCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UID0gU3ltYm9sLmZvcihcInYtbmRjXCIpO1xuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIGlmIChpc1N0cmluZyhjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVBc3NldChDT01QT05FTlRTLCBjb21wb25lbnQsIGZhbHNlKSB8fCBjb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudCB8fCBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UO1xuICB9XG59XG5mdW5jdGlvbiByZXNvbHZlRGlyZWN0aXZlKG5hbWUpIHtcbiAgcmV0dXJuIHJlc29sdmVBc3NldChESVJFQ1RJVkVTLCBuYW1lKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVBc3NldCh0eXBlLCBuYW1lLCB3YXJuTWlzc2luZyA9IHRydWUsIG1heWJlU2VsZlJlZmVyZW5jZSA9IGZhbHNlKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlIHx8IGN1cnJlbnRJbnN0YW5jZTtcbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgY29uc3QgQ29tcG9uZW50ID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAodHlwZSA9PT0gQ09NUE9ORU5UUykge1xuICAgICAgY29uc3Qgc2VsZk5hbWUgPSBnZXRDb21wb25lbnROYW1lKFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIGZhbHNlXG4gICAgICApO1xuICAgICAgaWYgKHNlbGZOYW1lICYmIChzZWxmTmFtZSA9PT0gbmFtZSB8fCBzZWxmTmFtZSA9PT0gY2FtZWxpemUobmFtZSkgfHwgc2VsZk5hbWUgPT09IGNhcGl0YWxpemUoY2FtZWxpemUobmFtZSkpKSkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXMgPSAoXG4gICAgICAvLyBsb2NhbCByZWdpc3RyYXRpb25cbiAgICAgIC8vIGNoZWNrIGluc3RhbmNlW3R5cGVdIGZpcnN0IHdoaWNoIGlzIHJlc29sdmVkIGZvciBvcHRpb25zIEFQSVxuICAgICAgcmVzb2x2ZShpbnN0YW5jZVt0eXBlXSB8fCBDb21wb25lbnRbdHlwZV0sIG5hbWUpIHx8IC8vIGdsb2JhbCByZWdpc3RyYXRpb25cbiAgICAgIHJlc29sdmUoaW5zdGFuY2UuYXBwQ29udGV4dFt0eXBlXSwgbmFtZSlcbiAgICApO1xuICAgIGlmICghcmVzICYmIG1heWJlU2VsZlJlZmVyZW5jZSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgICAgY29uc3QgZXh0cmEgPSB0eXBlID09PSBDT01QT05FTlRTID8gYFxuSWYgdGhpcyBpcyBhIG5hdGl2ZSBjdXN0b20gZWxlbWVudCwgbWFrZSBzdXJlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBjb21wb25lbnQgcmVzb2x1dGlvbiB2aWEgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudC5gIDogYGA7XG4gICAgICB3YXJuJDEoYEZhaWxlZCB0byByZXNvbHZlICR7dHlwZS5zbGljZSgwLCAtMSl9OiAke25hbWV9JHtleHRyYX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKFxuICAgICAgYHJlc29sdmUke2NhcGl0YWxpemUodHlwZS5zbGljZSgwLCAtMSkpfSBjYW4gb25seSBiZSB1c2VkIGluIHJlbmRlcigpIG9yIHNldHVwKCkuYFxuICAgICk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmUocmVnaXN0cnksIG5hbWUpIHtcbiAgcmV0dXJuIHJlZ2lzdHJ5ICYmIChyZWdpc3RyeVtuYW1lXSB8fCByZWdpc3RyeVtjYW1lbGl6ZShuYW1lKV0gfHwgcmVnaXN0cnlbY2FwaXRhbGl6ZShjYW1lbGl6ZShuYW1lKSldKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyTGlzdChzb3VyY2UsIHJlbmRlckl0ZW0sIGNhY2hlLCBpbmRleCkge1xuICBsZXQgcmV0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZSAmJiBjYWNoZVtpbmRleF07XG4gIGNvbnN0IHNvdXJjZUlzQXJyYXkgPSBpc0FycmF5KHNvdXJjZSk7XG4gIGlmIChzb3VyY2VJc0FycmF5IHx8IGlzU3RyaW5nKHNvdXJjZSkpIHtcbiAgICBjb25zdCBzb3VyY2VJc1JlYWN0aXZlQXJyYXkgPSBzb3VyY2VJc0FycmF5ICYmIGlzUmVhY3RpdmUoc291cmNlKTtcbiAgICBsZXQgbmVlZHNXcmFwID0gZmFsc2U7XG4gICAgaWYgKHNvdXJjZUlzUmVhY3RpdmVBcnJheSkge1xuICAgICAgbmVlZHNXcmFwID0gIWlzU2hhbGxvdyhzb3VyY2UpO1xuICAgICAgc291cmNlID0gc2hhbGxvd1JlYWRBcnJheShzb3VyY2UpO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzb3VyY2UubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKFxuICAgICAgICBuZWVkc1dyYXAgPyB0b1JlYWN0aXZlKHNvdXJjZVtpXSkgOiBzb3VyY2VbaV0sXG4gICAgICAgIGksXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgY2FjaGVkICYmIGNhY2hlZFtpXVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJudW1iZXJcIikge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFOdW1iZXIuaXNJbnRlZ2VyKHNvdXJjZSkpIHtcbiAgICAgIHdhcm4kMShgVGhlIHYtZm9yIHJhbmdlIGV4cGVjdCBhbiBpbnRlZ2VyIHZhbHVlIGJ1dCBnb3QgJHtzb3VyY2V9LmApO1xuICAgIH1cbiAgICByZXQgPSBuZXcgQXJyYXkoc291cmNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZTsgaSsrKSB7XG4gICAgICByZXRbaV0gPSByZW5kZXJJdGVtKGkgKyAxLCBpLCB2b2lkIDAsIGNhY2hlZCAmJiBjYWNoZWRbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgaWYgKHNvdXJjZVtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBBcnJheS5mcm9tKFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIChpdGVtLCBpKSA9PiByZW5kZXJJdGVtKGl0ZW0sIGksIHZvaWQgMCwgY2FjaGVkICYmIGNhY2hlZFtpXSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICAgICAgcmV0ID0gbmV3IEFycmF5KGtleXMubGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgcmV0W2ldID0gcmVuZGVySXRlbShzb3VyY2Vba2V5XSwga2V5LCBpLCBjYWNoZWQgJiYgY2FjaGVkW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0ID0gW107XG4gIH1cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGVbaW5kZXhdID0gcmV0O1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNsb3RzKHNsb3RzLCBkeW5hbWljU2xvdHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeW5hbWljU2xvdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzbG90ID0gZHluYW1pY1Nsb3RzW2ldO1xuICAgIGlmIChpc0FycmF5KHNsb3QpKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsb3QubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc2xvdHNbc2xvdFtqXS5uYW1lXSA9IHNsb3Rbal0uZm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzbG90KSB7XG4gICAgICBzbG90c1tzbG90Lm5hbWVdID0gc2xvdC5rZXkgPyAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCByZXMgPSBzbG90LmZuKC4uLmFyZ3MpO1xuICAgICAgICBpZiAocmVzKSByZXMua2V5ID0gc2xvdC5rZXk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9IDogc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNsb3RzO1xufVxuXG5mdW5jdGlvbiByZW5kZXJTbG90KHNsb3RzLCBuYW1lLCBwcm9wcyA9IHt9LCBmYWxsYmFjaywgbm9TbG90dGVkKSB7XG4gIGlmIChjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UuY2UgfHwgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlLnBhcmVudCAmJiBpc0FzeW5jV3JhcHBlcihjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50KSAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UucGFyZW50LmNlKSB7XG4gICAgaWYgKG5hbWUgIT09IFwiZGVmYXVsdFwiKSBwcm9wcy5uYW1lID0gbmFtZTtcbiAgICByZXR1cm4gb3BlbkJsb2NrKCksIGNyZWF0ZUJsb2NrKFxuICAgICAgRnJhZ21lbnQsXG4gICAgICBudWxsLFxuICAgICAgW2NyZWF0ZVZOb2RlKFwic2xvdFwiLCBwcm9wcywgZmFsbGJhY2sgJiYgZmFsbGJhY2soKSldLFxuICAgICAgNjRcbiAgICApO1xuICB9XG4gIGxldCBzbG90ID0gc2xvdHNbbmFtZV07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHNsb3QgJiYgc2xvdC5sZW5ndGggPiAxKSB7XG4gICAgd2FybiQxKFxuICAgICAgYFNTUi1vcHRpbWl6ZWQgc2xvdCBmdW5jdGlvbiBkZXRlY3RlZCBpbiBhIG5vbi1TU1Itb3B0aW1pemVkIHJlbmRlciBmdW5jdGlvbi4gWW91IG5lZWQgdG8gbWFyayB0aGlzIGNvbXBvbmVudCB3aXRoICRkeW5hbWljLXNsb3RzIGluIHRoZSBwYXJlbnQgdGVtcGxhdGUuYFxuICAgICk7XG4gICAgc2xvdCA9ICgpID0+IFtdO1xuICB9XG4gIGlmIChzbG90ICYmIHNsb3QuX2MpIHtcbiAgICBzbG90Ll9kID0gZmFsc2U7XG4gIH1cbiAgb3BlbkJsb2NrKCk7XG4gIGNvbnN0IHZhbGlkU2xvdENvbnRlbnQgPSBzbG90ICYmIGVuc3VyZVZhbGlkVk5vZGUoc2xvdChwcm9wcykpO1xuICBjb25zdCByZW5kZXJlZCA9IGNyZWF0ZUJsb2NrKFxuICAgIEZyYWdtZW50LFxuICAgIHtcbiAgICAgIGtleTogKHByb3BzLmtleSB8fCAvLyBzbG90IGNvbnRlbnQgYXJyYXkgb2YgYSBkeW5hbWljIGNvbmRpdGlvbmFsIHNsb3QgbWF5IGhhdmUgYSBicmFuY2hcbiAgICAgIC8vIGtleSBhdHRhY2hlZCBpbiB0aGUgYGNyZWF0ZVNsb3RzYCBoZWxwZXIsIHJlc3BlY3QgdGhhdFxuICAgICAgdmFsaWRTbG90Q29udGVudCAmJiB2YWxpZFNsb3RDb250ZW50LmtleSB8fCBgXyR7bmFtZX1gKSArIC8vICM3MjU2IGZvcmNlIGRpZmZlcmVudGlhdGUgZmFsbGJhY2sgY29udGVudCBmcm9tIGFjdHVhbCBjb250ZW50XG4gICAgICAoIXZhbGlkU2xvdENvbnRlbnQgJiYgZmFsbGJhY2sgPyBcIl9mYlwiIDogXCJcIilcbiAgICB9LFxuICAgIHZhbGlkU2xvdENvbnRlbnQgfHwgKGZhbGxiYWNrID8gZmFsbGJhY2soKSA6IFtdKSxcbiAgICB2YWxpZFNsb3RDb250ZW50ICYmIHNsb3RzLl8gPT09IDEgPyA2NCA6IC0yXG4gICk7XG4gIGlmICghbm9TbG90dGVkICYmIHJlbmRlcmVkLnNjb3BlSWQpIHtcbiAgICByZW5kZXJlZC5zbG90U2NvcGVJZHMgPSBbcmVuZGVyZWQuc2NvcGVJZCArIFwiLXNcIl07XG4gIH1cbiAgaWYgKHNsb3QgJiYgc2xvdC5fYykge1xuICAgIHNsb3QuX2QgPSB0cnVlO1xuICB9XG4gIHJldHVybiByZW5kZXJlZDtcbn1cbmZ1bmN0aW9uIGVuc3VyZVZhbGlkVk5vZGUodm5vZGVzKSB7XG4gIHJldHVybiB2bm9kZXMuc29tZSgoY2hpbGQpID0+IHtcbiAgICBpZiAoIWlzVk5vZGUoY2hpbGQpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gQ29tbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChjaGlsZC50eXBlID09PSBGcmFnbWVudCAmJiAhZW5zdXJlVmFsaWRWTm9kZShjaGlsZC5jaGlsZHJlbikpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pID8gdm5vZGVzIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9IYW5kbGVycyhvYmosIHByZXNlcnZlQ2FzZUlmTmVjZXNzYXJ5KSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaXNPYmplY3Qob2JqKSkge1xuICAgIHdhcm4kMShgdi1vbiB3aXRoIG5vIGFyZ3VtZW50IGV4cGVjdHMgYW4gb2JqZWN0IHZhbHVlLmApO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgcmV0W3ByZXNlcnZlQ2FzZUlmTmVjZXNzYXJ5ICYmIC9bQS1aXS8udGVzdChrZXkpID8gYG9uOiR7a2V5fWAgOiB0b0hhbmRsZXJLZXkoa2V5KV0gPSBvYmpba2V5XTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5jb25zdCBnZXRQdWJsaWNJbnN0YW5jZSA9IChpKSA9PiB7XG4gIGlmICghaSkgcmV0dXJuIG51bGw7XG4gIGlmIChpc1N0YXRlZnVsQ29tcG9uZW50KGkpKSByZXR1cm4gZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2UoaSk7XG4gIHJldHVybiBnZXRQdWJsaWNJbnN0YW5jZShpLnBhcmVudCk7XG59O1xuY29uc3QgcHVibGljUHJvcGVydGllc01hcCA9IChcbiAgLy8gTW92ZSBQVVJFIG1hcmtlciB0byBuZXcgbGluZSB0byB3b3JrYXJvdW5kIGNvbXBpbGVyIGRpc2NhcmRpbmcgaXRcbiAgLy8gZHVlIHRvIHR5cGUgYW5ub3RhdGlvblxuICAvKiBAX19QVVJFX18gKi8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB7XG4gICAgJDogKGkpID0+IGksXG4gICAgJGVsOiAoaSkgPT4gaS52bm9kZS5lbCxcbiAgICAkZGF0YTogKGkpID0+IGkuZGF0YSxcbiAgICAkcHJvcHM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkucHJvcHMpIDogaS5wcm9wcyxcbiAgICAkYXR0cnM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkuYXR0cnMpIDogaS5hdHRycyxcbiAgICAkc2xvdHM6IChpKSA9PiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KGkuc2xvdHMpIDogaS5zbG90cyxcbiAgICAkcmVmczogKGkpID0+ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaS5yZWZzKSA6IGkucmVmcyxcbiAgICAkcGFyZW50OiAoaSkgPT4gZ2V0UHVibGljSW5zdGFuY2UoaS5wYXJlbnQpLFxuICAgICRyb290OiAoaSkgPT4gZ2V0UHVibGljSW5zdGFuY2UoaS5yb290KSxcbiAgICAkaG9zdDogKGkpID0+IGkuY2UsXG4gICAgJGVtaXQ6IChpKSA9PiBpLmVtaXQsXG4gICAgJG9wdGlvbnM6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaSkgOiBpLnR5cGUsXG4gICAgJGZvcmNlVXBkYXRlOiAoaSkgPT4gaS5mIHx8IChpLmYgPSAoKSA9PiB7XG4gICAgICBxdWV1ZUpvYihpLnVwZGF0ZSk7XG4gICAgfSksXG4gICAgJG5leHRUaWNrOiAoaSkgPT4gaS5uIHx8IChpLm4gPSBuZXh0VGljay5iaW5kKGkucHJveHkpKSxcbiAgICAkd2F0Y2g6IChpKSA9PiBfX1ZVRV9PUFRJT05TX0FQSV9fID8gaW5zdGFuY2VXYXRjaC5iaW5kKGkpIDogTk9PUFxuICB9KVxuKTtcbmNvbnN0IGlzUmVzZXJ2ZWRQcmVmaXggPSAoa2V5KSA9PiBrZXkgPT09IFwiX1wiIHx8IGtleSA9PT0gXCIkXCI7XG5jb25zdCBoYXNTZXR1cEJpbmRpbmcgPSAoc3RhdGUsIGtleSkgPT4gc3RhdGUgIT09IEVNUFRZX09CSiAmJiAhc3RhdGUuX19pc1NjcmlwdFNldHVwICYmIGhhc093bihzdGF0ZSwga2V5KTtcbmNvbnN0IFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IHtcbiAgZ2V0KHsgXzogaW5zdGFuY2UgfSwga2V5KSB7XG4gICAgaWYgKGtleSA9PT0gXCJfX3Zfc2tpcFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgeyBjdHgsIHNldHVwU3RhdGUsIGRhdGEsIHByb3BzLCBhY2Nlc3NDYWNoZSwgdHlwZSwgYXBwQ29udGV4dCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIl9faXNWdWVcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGxldCBub3JtYWxpemVkUHJvcHM7XG4gICAgaWYgKGtleVswXSAhPT0gXCIkXCIpIHtcbiAgICAgIGNvbnN0IG4gPSBhY2Nlc3NDYWNoZVtrZXldO1xuICAgICAgaWYgKG4gIT09IHZvaWQgMCkge1xuICAgICAgICBzd2l0Y2ggKG4pIHtcbiAgICAgICAgICBjYXNlIDEgLyogU0VUVVAgKi86XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBTdGF0ZVtrZXldO1xuICAgICAgICAgIGNhc2UgMiAvKiBEQVRBICovOlxuICAgICAgICAgICAgcmV0dXJuIGRhdGFba2V5XTtcbiAgICAgICAgICBjYXNlIDQgLyogQ09OVEVYVCAqLzpcbiAgICAgICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgICAgICBjYXNlIDMgLyogUFJPUFMgKi86XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgICBhY2Nlc3NDYWNoZVtrZXldID0gMSAvKiBTRVRVUCAqLztcbiAgICAgICAgcmV0dXJuIHNldHVwU3RhdGVba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSAyIC8qIERBVEEgKi87XG4gICAgICAgIHJldHVybiBkYXRhW2tleV07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAvLyBvbmx5IGNhY2hlIG90aGVyIHByb3BlcnRpZXMgd2hlbiBpbnN0YW5jZSBoYXMgZGVjbGFyZWQgKHRodXMgc3RhYmxlKVxuICAgICAgICAvLyBwcm9wc1xuICAgICAgICAobm9ybWFsaXplZFByb3BzID0gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpXG4gICAgICApIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDMgLyogUFJPUFMgKi87XG4gICAgICAgIHJldHVybiBwcm9wc1trZXldO1xuICAgICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICAgIGFjY2Vzc0NhY2hlW2tleV0gPSA0IC8qIENPTlRFWFQgKi87XG4gICAgICAgIHJldHVybiBjdHhba2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoIV9fVlVFX09QVElPTlNfQVBJX18gfHwgc2hvdWxkQ2FjaGVBY2Nlc3MpIHtcbiAgICAgICAgYWNjZXNzQ2FjaGVba2V5XSA9IDAgLyogT1RIRVIgKi87XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHB1YmxpY0dldHRlciA9IHB1YmxpY1Byb3BlcnRpZXNNYXBba2V5XTtcbiAgICBsZXQgY3NzTW9kdWxlLCBnbG9iYWxQcm9wZXJ0aWVzO1xuICAgIGlmIChwdWJsaWNHZXR0ZXIpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiJGF0dHJzXCIpIHtcbiAgICAgICAgdHJhY2soaW5zdGFuY2UuYXR0cnMsIFwiZ2V0XCIsIFwiXCIpO1xuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG1hcmtBdHRyc0FjY2Vzc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5ID09PSBcIiRzbG90c1wiKSB7XG4gICAgICAgIHRyYWNrKGluc3RhbmNlLCBcImdldFwiLCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHB1YmxpY0dldHRlcihpbnN0YW5jZSk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIC8vIGNzcyBtb2R1bGUgKGluamVjdGVkIGJ5IHZ1ZS1sb2FkZXIpXG4gICAgICAoY3NzTW9kdWxlID0gdHlwZS5fX2Nzc01vZHVsZXMpICYmIChjc3NNb2R1bGUgPSBjc3NNb2R1bGVba2V5XSlcbiAgICApIHtcbiAgICAgIHJldHVybiBjc3NNb2R1bGU7XG4gICAgfSBlbHNlIGlmIChjdHggIT09IEVNUFRZX09CSiAmJiBoYXNPd24oY3R4LCBrZXkpKSB7XG4gICAgICBhY2Nlc3NDYWNoZVtrZXldID0gNCAvKiBDT05URVhUICovO1xuICAgICAgcmV0dXJuIGN0eFtrZXldO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgZ2xvYmFsUHJvcGVydGllcyA9IGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGhhc093bihnbG9iYWxQcm9wZXJ0aWVzLCBrZXkpXG4gICAgKSB7XG4gICAgICB7XG4gICAgICAgIHJldHVybiBnbG9iYWxQcm9wZXJ0aWVzW2tleV07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSAmJiAoIWlzU3RyaW5nKGtleSkgfHwgLy8gIzEwOTEgYXZvaWQgaW50ZXJuYWwgaXNSZWYvaXNWTm9kZSBjaGVja3Mgb24gY29tcG9uZW50IGluc3RhbmNlIGxlYWRpbmdcbiAgICAvLyB0byBpbmZpbml0ZSB3YXJuaW5nIGxvb3BcbiAgICBrZXkuaW5kZXhPZihcIl9fdlwiKSAhPT0gMCkpIHtcbiAgICAgIGlmIChkYXRhICE9PSBFTVBUWV9PQkogJiYgaXNSZXNlcnZlZFByZWZpeChrZXlbMF0pICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgUHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICl9IG11c3QgYmUgYWNjZXNzZWQgdmlhICRkYXRhIGJlY2F1c2UgaXQgc3RhcnRzIHdpdGggYSByZXNlcnZlZCBjaGFyYWN0ZXIgKFwiJFwiIG9yIFwiX1wiKSBhbmQgaXMgbm90IHByb3hpZWQgb24gdGhlIHJlbmRlciBjb250ZXh0LmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UgPT09IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSkge1xuICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgYFByb3BlcnR5ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0gd2FzIGFjY2Vzc2VkIGR1cmluZyByZW5kZXIgYnV0IGlzIG5vdCBkZWZpbmVkIG9uIGluc3RhbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHNldCh7IF86IGluc3RhbmNlIH0sIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCB7IGRhdGEsIHNldHVwU3RhdGUsIGN0eCB9ID0gaW5zdGFuY2U7XG4gICAgaWYgKGhhc1NldHVwQmluZGluZyhzZXR1cFN0YXRlLCBrZXkpKSB7XG4gICAgICBzZXR1cFN0YXRlW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXR1cFN0YXRlLl9faXNTY3JpcHRTZXR1cCAmJiBoYXNPd24oc2V0dXBTdGF0ZSwga2V5KSkge1xuICAgICAgd2FybiQxKGBDYW5ub3QgbXV0YXRlIDxzY3JpcHQgc2V0dXA+IGJpbmRpbmcgXCIke2tleX1cIiBmcm9tIE9wdGlvbnMgQVBJLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoZGF0YSAhPT0gRU1QVFlfT0JKICYmIGhhc093bihkYXRhLCBrZXkpKSB7XG4gICAgICBkYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGluc3RhbmNlLnByb3BzLCBrZXkpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgQXR0ZW1wdGluZyB0byBtdXRhdGUgcHJvcCBcIiR7a2V5fVwiLiBQcm9wcyBhcmUgcmVhZG9ubHkuYCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChrZXlbMF0gPT09IFwiJFwiICYmIGtleS5zbGljZSgxKSBpbiBpbnN0YW5jZSkge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBBdHRlbXB0aW5nIHRvIG11dGF0ZSBwdWJsaWMgcHJvcGVydHkgXCIke2tleX1cIi4gUHJvcGVydGllcyBzdGFydGluZyB3aXRoICQgYXJlIHJlc2VydmVkIGFuZCByZWFkb25seS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBrZXkgaW4gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcuZ2xvYmFsUHJvcGVydGllcykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN0eFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICBoYXMoe1xuICAgIF86IHsgZGF0YSwgc2V0dXBTdGF0ZSwgYWNjZXNzQ2FjaGUsIGN0eCwgYXBwQ29udGV4dCwgcHJvcHNPcHRpb25zIH1cbiAgfSwga2V5KSB7XG4gICAgbGV0IG5vcm1hbGl6ZWRQcm9wcztcbiAgICByZXR1cm4gISFhY2Nlc3NDYWNoZVtrZXldIHx8IGRhdGEgIT09IEVNUFRZX09CSiAmJiBoYXNPd24oZGF0YSwga2V5KSB8fCBoYXNTZXR1cEJpbmRpbmcoc2V0dXBTdGF0ZSwga2V5KSB8fCAobm9ybWFsaXplZFByb3BzID0gcHJvcHNPcHRpb25zWzBdKSAmJiBoYXNPd24obm9ybWFsaXplZFByb3BzLCBrZXkpIHx8IGhhc093bihjdHgsIGtleSkgfHwgaGFzT3duKHB1YmxpY1Byb3BlcnRpZXNNYXAsIGtleSkgfHwgaGFzT3duKGFwcENvbnRleHQuY29uZmlnLmdsb2JhbFByb3BlcnRpZXMsIGtleSk7XG4gIH0sXG4gIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IuZ2V0ICE9IG51bGwpIHtcbiAgICAgIHRhcmdldC5fLmFjY2Vzc0NhY2hlW2tleV0gPSAwO1xuICAgIH0gZWxzZSBpZiAoaGFzT3duKGRlc2NyaXB0b3IsIFwidmFsdWVcIikpIHtcbiAgICAgIHRoaXMuc2V0KHRhcmdldCwga2V5LCBkZXNjcmlwdG9yLnZhbHVlLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGRlc2NyaXB0b3IpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdHJ1ZSkge1xuICBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMub3duS2V5cyA9ICh0YXJnZXQpID0+IHtcbiAgICB3YXJuJDEoXG4gICAgICBgQXZvaWQgYXBwIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIGVudW1lcmF0aW5nIGtleXMgb24gYSBjb21wb25lbnQgaW5zdGFuY2UuIFRoZSBrZXlzIHdpbGwgYmUgZW1wdHkgaW4gcHJvZHVjdGlvbiBtb2RlIHRvIGF2b2lkIHBlcmZvcm1hbmNlIG92ZXJoZWFkLmBcbiAgICApO1xuICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModGFyZ2V0KTtcbiAgfTtcbn1cbmNvbnN0IFJ1bnRpbWVDb21waWxlZFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBleHRlbmQoe30sIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycywge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBpZiAoa2V5ID09PSBTeW1ib2wudW5zY29wYWJsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIFB1YmxpY0luc3RhbmNlUHJveHlIYW5kbGVycy5nZXQodGFyZ2V0LCBrZXksIHRhcmdldCk7XG4gIH0sXG4gIGhhcyhfLCBrZXkpIHtcbiAgICBjb25zdCBoYXMgPSBrZXlbMF0gIT09IFwiX1wiICYmICFpc0dsb2JhbGx5QWxsb3dlZChrZXkpO1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFoYXMgJiYgUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzLmhhcyhfLCBrZXkpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBQcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGtleVxuICAgICAgICApfSBzaG91bGQgbm90IHN0YXJ0IHdpdGggXyB3aGljaCBpcyBhIHJlc2VydmVkIHByZWZpeCBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaGFzO1xuICB9XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZURldlJlbmRlckNvbnRleHQoaW5zdGFuY2UpIHtcbiAgY29uc3QgdGFyZ2V0ID0ge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGBfYCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBnZXQ6ICgpID0+IGluc3RhbmNlXG4gIH0pO1xuICBPYmplY3Qua2V5cyhwdWJsaWNQcm9wZXJ0aWVzTWFwKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiAoKSA9PiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpLFxuICAgICAgLy8gaW50ZXJjZXB0ZWQgYnkgdGhlIHByb3h5IHNvIG5vIG5lZWQgZm9yIGltcGxlbWVudGF0aW9uLFxuICAgICAgLy8gYnV0IG5lZWRlZCB0byBwcmV2ZW50IHNldCBlcnJvcnNcbiAgICAgIHNldDogTk9PUFxuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHtcbiAgICBjdHgsXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICB9ID0gaW5zdGFuY2U7XG4gIGlmIChwcm9wc09wdGlvbnMpIHtcbiAgICBPYmplY3Qua2V5cyhwcm9wc09wdGlvbnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbnN0YW5jZS5wcm9wc1trZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBleHBvc2VTZXR1cFN0YXRlT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIGNvbnN0IHsgY3R4LCBzZXR1cFN0YXRlIH0gPSBpbnN0YW5jZTtcbiAgT2JqZWN0LmtleXModG9SYXcoc2V0dXBTdGF0ZSkpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGlmICghc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXApIHtcbiAgICAgIGlmIChpc1Jlc2VydmVkUHJlZml4KGtleVswXSkpIHtcbiAgICAgICAgd2FybiQxKFxuICAgICAgICAgIGBzZXR1cCgpIHJldHVybiBwcm9wZXJ0eSAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgKX0gc2hvdWxkIG5vdCBzdGFydCB3aXRoIFwiJFwiIG9yIFwiX1wiIHdoaWNoIGFyZSByZXNlcnZlZCBwcmVmaXhlcyBmb3IgVnVlIGludGVybmFscy5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gc2V0dXBTdGF0ZVtrZXldLFxuICAgICAgICBzZXQ6IE5PT1BcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IHdhcm5SdW50aW1lVXNhZ2UgPSAobWV0aG9kKSA9PiB3YXJuJDEoXG4gIGAke21ldGhvZH0oKSBpcyBhIGNvbXBpbGVyLWhpbnQgaGVscGVyIHRoYXQgaXMgb25seSB1c2FibGUgaW5zaWRlIDxzY3JpcHQgc2V0dXA+IG9mIGEgc2luZ2xlIGZpbGUgY29tcG9uZW50LiBJdHMgYXJndW1lbnRzIHNob3VsZCBiZSBjb21waWxlZCBhd2F5IGFuZCBwYXNzaW5nIGl0IGF0IHJ1bnRpbWUgaGFzIG5vIGVmZmVjdC5gXG4pO1xuZnVuY3Rpb24gZGVmaW5lUHJvcHMoKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FyblJ1bnRpbWVVc2FnZShgZGVmaW5lUHJvcHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRlZmluZUVtaXRzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUVtaXRzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVFeHBvc2UoZXhwb3NlZCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZUV4cG9zZWApO1xuICB9XG59XG5mdW5jdGlvbiBkZWZpbmVPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGBkZWZpbmVPcHRpb25zYCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRlZmluZVNsb3RzKCkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHdhcm5SdW50aW1lVXNhZ2UoYGRlZmluZVNsb3RzYCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBkZWZpbmVNb2RlbCgpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKFwiZGVmaW5lTW9kZWxcIik7XG4gIH1cbn1cbmZ1bmN0aW9uIHdpdGhEZWZhdWx0cyhwcm9wcywgZGVmYXVsdHMpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuUnVudGltZVVzYWdlKGB3aXRoRGVmYXVsdHNgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHVzZVNsb3RzKCkge1xuICByZXR1cm4gZ2V0Q29udGV4dCgpLnNsb3RzO1xufVxuZnVuY3Rpb24gdXNlQXR0cnMoKSB7XG4gIHJldHVybiBnZXRDb250ZXh0KCkuYXR0cnM7XG59XG5mdW5jdGlvbiBnZXRDb250ZXh0KCkge1xuICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpKSB7XG4gICAgd2FybiQxKGB1c2VDb250ZXh0KCkgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGluc3RhbmNlLmApO1xuICB9XG4gIHJldHVybiBpLnNldHVwQ29udGV4dCB8fCAoaS5zZXR1cENvbnRleHQgPSBjcmVhdGVTZXR1cENvbnRleHQoaSkpO1xufVxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPckVtaXRzKHByb3BzKSB7XG4gIHJldHVybiBpc0FycmF5KHByb3BzKSA/IHByb3BzLnJlZHVjZShcbiAgICAobm9ybWFsaXplZCwgcCkgPT4gKG5vcm1hbGl6ZWRbcF0gPSBudWxsLCBub3JtYWxpemVkKSxcbiAgICB7fVxuICApIDogcHJvcHM7XG59XG5mdW5jdGlvbiBtZXJnZURlZmF1bHRzKHJhdywgZGVmYXVsdHMpIHtcbiAgY29uc3QgcHJvcHMgPSBub3JtYWxpemVQcm9wc09yRW1pdHMocmF3KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJfX3NraXBcIikpIGNvbnRpbnVlO1xuICAgIGxldCBvcHQgPSBwcm9wc1trZXldO1xuICAgIGlmIChvcHQpIHtcbiAgICAgIGlmIChpc0FycmF5KG9wdCkgfHwgaXNGdW5jdGlvbihvcHQpKSB7XG4gICAgICAgIG9wdCA9IHByb3BzW2tleV0gPSB7IHR5cGU6IG9wdCwgZGVmYXVsdDogZGVmYXVsdHNba2V5XSB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0LmRlZmF1bHQgPSBkZWZhdWx0c1trZXldO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0ID09PSBudWxsKSB7XG4gICAgICBvcHQgPSBwcm9wc1trZXldID0geyBkZWZhdWx0OiBkZWZhdWx0c1trZXldIH07XG4gICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYHByb3BzIGRlZmF1bHQga2V5IFwiJHtrZXl9XCIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24uYCk7XG4gICAgfVxuICAgIGlmIChvcHQgJiYgZGVmYXVsdHNbYF9fc2tpcF8ke2tleX1gXSkge1xuICAgICAgb3B0LnNraXBGYWN0b3J5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb3BzO1xufVxuZnVuY3Rpb24gbWVyZ2VNb2RlbHMoYSwgYikge1xuICBpZiAoIWEgfHwgIWIpIHJldHVybiBhIHx8IGI7XG4gIGlmIChpc0FycmF5KGEpICYmIGlzQXJyYXkoYikpIHJldHVybiBhLmNvbmNhdChiKTtcbiAgcmV0dXJuIGV4dGVuZCh7fSwgbm9ybWFsaXplUHJvcHNPckVtaXRzKGEpLCBub3JtYWxpemVQcm9wc09yRW1pdHMoYikpO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvcHNSZXN0UHJveHkocHJvcHMsIGV4Y2x1ZGVkS2V5cykge1xuICBjb25zdCByZXQgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICBpZiAoIWV4Y2x1ZGVkS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmV0LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBwcm9wc1trZXldXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbmZ1bmN0aW9uIHdpdGhBc3luY0NvbnRleHQoZ2V0QXdhaXRhYmxlKSB7XG4gIGNvbnN0IGN0eCA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhY3R4KSB7XG4gICAgd2FybiQxKFxuICAgICAgYHdpdGhBc3luY0NvbnRleHQgY2FsbGVkIHdpdGhvdXQgYWN0aXZlIGN1cnJlbnQgaW5zdGFuY2UuIFRoaXMgaXMgbGlrZWx5IGEgYnVnLmBcbiAgICApO1xuICB9XG4gIGxldCBhd2FpdGFibGUgPSBnZXRBd2FpdGFibGUoKTtcbiAgdW5zZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgaWYgKGlzUHJvbWlzZShhd2FpdGFibGUpKSB7XG4gICAgYXdhaXRhYmxlID0gYXdhaXRhYmxlLmNhdGNoKChlKSA9PiB7XG4gICAgICBzZXRDdXJyZW50SW5zdGFuY2UoY3R4KTtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFthd2FpdGFibGUsICgpID0+IHNldEN1cnJlbnRJbnN0YW5jZShjdHgpXTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRHVwbGljYXRlQ2hlY2tlcigpIHtcbiAgY29uc3QgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuICh0eXBlLCBrZXkpID0+IHtcbiAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgd2FybiQxKGAke3R5cGV9IHByb3BlcnR5IFwiJHtrZXl9XCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluICR7Y2FjaGVba2V5XX0uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhY2hlW2tleV0gPSB0eXBlO1xuICAgIH1cbiAgfTtcbn1cbmxldCBzaG91bGRDYWNoZUFjY2VzcyA9IHRydWU7XG5mdW5jdGlvbiBhcHBseU9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHJlc29sdmVNZXJnZWRPcHRpb25zKGluc3RhbmNlKTtcbiAgY29uc3QgcHVibGljVGhpcyA9IGluc3RhbmNlLnByb3h5O1xuICBjb25zdCBjdHggPSBpbnN0YW5jZS5jdHg7XG4gIHNob3VsZENhY2hlQWNjZXNzID0gZmFsc2U7XG4gIGlmIChvcHRpb25zLmJlZm9yZUNyZWF0ZSkge1xuICAgIGNhbGxIb29rKG9wdGlvbnMuYmVmb3JlQ3JlYXRlLCBpbnN0YW5jZSwgXCJiY1wiKTtcbiAgfVxuICBjb25zdCB7XG4gICAgLy8gc3RhdGVcbiAgICBkYXRhOiBkYXRhT3B0aW9ucyxcbiAgICBjb21wdXRlZDogY29tcHV0ZWRPcHRpb25zLFxuICAgIG1ldGhvZHMsXG4gICAgd2F0Y2g6IHdhdGNoT3B0aW9ucyxcbiAgICBwcm92aWRlOiBwcm92aWRlT3B0aW9ucyxcbiAgICBpbmplY3Q6IGluamVjdE9wdGlvbnMsXG4gICAgLy8gbGlmZWN5Y2xlXG4gICAgY3JlYXRlZCxcbiAgICBiZWZvcmVNb3VudCxcbiAgICBtb3VudGVkLFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICB1cGRhdGVkLFxuICAgIGFjdGl2YXRlZCxcbiAgICBkZWFjdGl2YXRlZCxcbiAgICBiZWZvcmVEZXN0cm95LFxuICAgIGJlZm9yZVVubW91bnQsXG4gICAgZGVzdHJveWVkLFxuICAgIHVubW91bnRlZCxcbiAgICByZW5kZXIsXG4gICAgcmVuZGVyVHJhY2tlZCxcbiAgICByZW5kZXJUcmlnZ2VyZWQsXG4gICAgZXJyb3JDYXB0dXJlZCxcbiAgICBzZXJ2ZXJQcmVmZXRjaCxcbiAgICAvLyBwdWJsaWMgQVBJXG4gICAgZXhwb3NlLFxuICAgIGluaGVyaXRBdHRycyxcbiAgICAvLyBhc3NldHNcbiAgICBjb21wb25lbnRzLFxuICAgIGRpcmVjdGl2ZXMsXG4gICAgZmlsdGVyc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGNyZWF0ZUR1cGxpY2F0ZUNoZWNrZXIoKSA6IG51bGw7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgW3Byb3BzT3B0aW9uc10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gICAgaWYgKHByb3BzT3B0aW9ucykge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHNPcHRpb25zKSB7XG4gICAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIlByb3BzXCIgLyogUFJPUFMgKi8sIGtleSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3RPcHRpb25zKSB7XG4gICAgcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMpO1xuICB9XG4gIGlmIChtZXRob2RzKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgY29uc3QgbWV0aG9kSGFuZGxlciA9IG1ldGhvZHNba2V5XTtcbiAgICAgIGlmIChpc0Z1bmN0aW9uKG1ldGhvZEhhbmRsZXIpKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgICAgICB2YWx1ZTogbWV0aG9kSGFuZGxlci5iaW5kKHB1YmxpY1RoaXMpLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3R4W2tleV0gPSBtZXRob2RIYW5kbGVyLmJpbmQocHVibGljVGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMoXCJNZXRob2RzXCIgLyogTUVUSE9EUyAqLywga2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgTWV0aG9kIFwiJHtrZXl9XCIgaGFzIHR5cGUgXCIke3R5cGVvZiBtZXRob2RIYW5kbGVyfVwiIGluIHRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi4gRGlkIHlvdSByZWZlcmVuY2UgdGhlIGZ1bmN0aW9uIGNvcnJlY3RseT9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChkYXRhT3B0aW9ucykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGRhdGFPcHRpb25zKSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgVGhlIGRhdGEgb3B0aW9uIG11c3QgYmUgYSBmdW5jdGlvbi4gUGxhaW4gb2JqZWN0IHVzYWdlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGRhdGFPcHRpb25zLmNhbGwocHVibGljVGhpcywgcHVibGljVGhpcyk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNQcm9taXNlKGRhdGEpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBkYXRhKCkgcmV0dXJuZWQgYSBQcm9taXNlIC0gbm90ZSBkYXRhKCkgY2Fubm90IGJlIGFzeW5jOyBJZiB5b3UgaW50ZW5kIHRvIHBlcmZvcm0gZGF0YSBmZXRjaGluZyBiZWZvcmUgY29tcG9uZW50IHJlbmRlcnMsIHVzZSBhc3luYyBzZXR1cCgpICsgPFN1c3BlbnNlPi5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgZGF0YSgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5kYXRhID0gcmVhY3RpdmUoZGF0YSk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiRGF0YVwiIC8qIERBVEEgKi8sIGtleSk7XG4gICAgICAgICAgaWYgKCFpc1Jlc2VydmVkUHJlZml4KGtleVswXSkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGdldDogKCkgPT4gZGF0YVtrZXldLFxuICAgICAgICAgICAgICBzZXQ6IE5PT1BcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBzaG91bGRDYWNoZUFjY2VzcyA9IHRydWU7XG4gIGlmIChjb21wdXRlZE9wdGlvbnMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjb21wdXRlZE9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9wdCA9IGNvbXB1dGVkT3B0aW9uc1trZXldO1xuICAgICAgY29uc3QgZ2V0ID0gaXNGdW5jdGlvbihvcHQpID8gb3B0LmJpbmQocHVibGljVGhpcywgcHVibGljVGhpcykgOiBpc0Z1bmN0aW9uKG9wdC5nZXQpID8gb3B0LmdldC5iaW5kKHB1YmxpY1RoaXMsIHB1YmxpY1RoaXMpIDogTk9PUDtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGdldCA9PT0gTk9PUCkge1xuICAgICAgICB3YXJuJDEoYENvbXB1dGVkIHByb3BlcnR5IFwiJHtrZXl9XCIgaGFzIG5vIGdldHRlci5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldCA9ICFpc0Z1bmN0aW9uKG9wdCkgJiYgaXNGdW5jdGlvbihvcHQuc2V0KSA/IG9wdC5zZXQuYmluZChwdWJsaWNUaGlzKSA6ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyAoKSA9PiB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgV3JpdGUgb3BlcmF0aW9uIGZhaWxlZDogY29tcHV0ZWQgcHJvcGVydHkgXCIke2tleX1cIiBpcyByZWFkb25seS5gXG4gICAgICAgICk7XG4gICAgICB9IDogTk9PUDtcbiAgICAgIGNvbnN0IGMgPSBjb21wdXRlZCh7XG4gICAgICAgIGdldCxcbiAgICAgICAgc2V0XG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gYy52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gYy52YWx1ZSA9IHZcbiAgICAgIH0pO1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgY2hlY2tEdXBsaWNhdGVQcm9wZXJ0aWVzKFwiQ29tcHV0ZWRcIiAvKiBDT01QVVRFRCAqLywga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHdhdGNoT3B0aW9ucykge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHdhdGNoT3B0aW9ucykge1xuICAgICAgY3JlYXRlV2F0Y2hlcih3YXRjaE9wdGlvbnNba2V5XSwgY3R4LCBwdWJsaWNUaGlzLCBrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAocHJvdmlkZU9wdGlvbnMpIHtcbiAgICBjb25zdCBwcm92aWRlcyA9IGlzRnVuY3Rpb24ocHJvdmlkZU9wdGlvbnMpID8gcHJvdmlkZU9wdGlvbnMuY2FsbChwdWJsaWNUaGlzKSA6IHByb3ZpZGVPcHRpb25zO1xuICAgIFJlZmxlY3Qub3duS2V5cyhwcm92aWRlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBwcm92aWRlKGtleSwgcHJvdmlkZXNba2V5XSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKGNyZWF0ZWQpIHtcbiAgICBjYWxsSG9vayhjcmVhdGVkLCBpbnN0YW5jZSwgXCJjXCIpO1xuICB9XG4gIGZ1bmN0aW9uIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhyZWdpc3RlciwgaG9vaykge1xuICAgIGlmIChpc0FycmF5KGhvb2spKSB7XG4gICAgICBob29rLmZvckVhY2goKF9ob29rKSA9PiByZWdpc3RlcihfaG9vay5iaW5kKHB1YmxpY1RoaXMpKSk7XG4gICAgfSBlbHNlIGlmIChob29rKSB7XG4gICAgICByZWdpc3Rlcihob29rLmJpbmQocHVibGljVGhpcykpO1xuICAgIH1cbiAgfVxuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25CZWZvcmVNb3VudCwgYmVmb3JlTW91bnQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25Nb3VudGVkLCBtb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVXBkYXRlLCBiZWZvcmVVcGRhdGUpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25VcGRhdGVkLCB1cGRhdGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQWN0aXZhdGVkLCBhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25EZWFjdGl2YXRlZCwgZGVhY3RpdmF0ZWQpO1xuICByZWdpc3RlckxpZmVjeWNsZUhvb2sob25FcnJvckNhcHR1cmVkLCBlcnJvckNhcHR1cmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uUmVuZGVyVHJhY2tlZCwgcmVuZGVyVHJhY2tlZCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblJlbmRlclRyaWdnZXJlZCwgcmVuZGVyVHJpZ2dlcmVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uQmVmb3JlVW5tb3VudCwgYmVmb3JlVW5tb3VudCk7XG4gIHJlZ2lzdGVyTGlmZWN5Y2xlSG9vayhvblVubW91bnRlZCwgdW5tb3VudGVkKTtcbiAgcmVnaXN0ZXJMaWZlY3ljbGVIb29rKG9uU2VydmVyUHJlZmV0Y2gsIHNlcnZlclByZWZldGNoKTtcbiAgaWYgKGlzQXJyYXkoZXhwb3NlKSkge1xuICAgIGlmIChleHBvc2UubGVuZ3RoKSB7XG4gICAgICBjb25zdCBleHBvc2VkID0gaW5zdGFuY2UuZXhwb3NlZCB8fCAoaW5zdGFuY2UuZXhwb3NlZCA9IHt9KTtcbiAgICAgIGV4cG9zZS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9zZWQsIGtleSwge1xuICAgICAgICAgIGdldDogKCkgPT4gcHVibGljVGhpc1trZXldLFxuICAgICAgICAgIHNldDogKHZhbCkgPT4gcHVibGljVGhpc1trZXldID0gdmFsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICghaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgaW5zdGFuY2UuZXhwb3NlZCA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAocmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCkge1xuICAgIGluc3RhbmNlLnJlbmRlciA9IHJlbmRlcjtcbiAgfVxuICBpZiAoaW5oZXJpdEF0dHJzICE9IG51bGwpIHtcbiAgICBpbnN0YW5jZS5pbmhlcml0QXR0cnMgPSBpbmhlcml0QXR0cnM7XG4gIH1cbiAgaWYgKGNvbXBvbmVudHMpIGluc3RhbmNlLmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICBpZiAoZGlyZWN0aXZlcykgaW5zdGFuY2UuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gIGlmIChzZXJ2ZXJQcmVmZXRjaCkge1xuICAgIG1hcmtBc3luY0JvdW5kYXJ5KGluc3RhbmNlKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdGlvbnMoaW5qZWN0T3B0aW9ucywgY3R4LCBjaGVja0R1cGxpY2F0ZVByb3BlcnRpZXMgPSBOT09QKSB7XG4gIGlmIChpc0FycmF5KGluamVjdE9wdGlvbnMpKSB7XG4gICAgaW5qZWN0T3B0aW9ucyA9IG5vcm1hbGl6ZUluamVjdChpbmplY3RPcHRpb25zKTtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBpbmplY3RPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0ID0gaW5qZWN0T3B0aW9uc1trZXldO1xuICAgIGxldCBpbmplY3RlZDtcbiAgICBpZiAoaXNPYmplY3Qob3B0KSkge1xuICAgICAgaWYgKFwiZGVmYXVsdFwiIGluIG9wdCkge1xuICAgICAgICBpbmplY3RlZCA9IGluamVjdChcbiAgICAgICAgICBvcHQuZnJvbSB8fCBrZXksXG4gICAgICAgICAgb3B0LmRlZmF1bHQsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0LmZyb20gfHwga2V5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaW5qZWN0ZWQgPSBpbmplY3Qob3B0KTtcbiAgICB9XG4gICAgaWYgKGlzUmVmKGluamVjdGVkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwga2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBpbmplY3RlZC52YWx1ZSxcbiAgICAgICAgc2V0OiAodikgPT4gaW5qZWN0ZWQudmFsdWUgPSB2XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3R4W2tleV0gPSBpbmplY3RlZDtcbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGNoZWNrRHVwbGljYXRlUHJvcGVydGllcyhcIkluamVjdFwiIC8qIElOSkVDVCAqLywga2V5KTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGxIb29rKGhvb2ssIGluc3RhbmNlLCB0eXBlKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgIGlzQXJyYXkoaG9vaykgPyBob29rLm1hcCgoaCkgPT4gaC5iaW5kKGluc3RhbmNlLnByb3h5KSkgOiBob29rLmJpbmQoaW5zdGFuY2UucHJveHkpLFxuICAgIGluc3RhbmNlLFxuICAgIHR5cGVcbiAgKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVdhdGNoZXIocmF3LCBjdHgsIHB1YmxpY1RoaXMsIGtleSkge1xuICBsZXQgZ2V0dGVyID0ga2V5LmluY2x1ZGVzKFwiLlwiKSA/IGNyZWF0ZVBhdGhHZXR0ZXIocHVibGljVGhpcywga2V5KSA6ICgpID0+IHB1YmxpY1RoaXNba2V5XTtcbiAgaWYgKGlzU3RyaW5nKHJhdykpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gY3R4W3Jhd107XG4gICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhd31cImAsIGhhbmRsZXIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHJhdykpIHtcbiAgICB7XG4gICAgICB3YXRjaChnZXR0ZXIsIHJhdy5iaW5kKHB1YmxpY1RoaXMpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QocmF3KSkge1xuICAgIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICAgIHJhdy5mb3JFYWNoKChyKSA9PiBjcmVhdGVXYXRjaGVyKHIsIGN0eCwgcHVibGljVGhpcywga2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBpc0Z1bmN0aW9uKHJhdy5oYW5kbGVyKSA/IHJhdy5oYW5kbGVyLmJpbmQocHVibGljVGhpcykgOiBjdHhbcmF3LmhhbmRsZXJdO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICAgICAgd2F0Y2goZ2V0dGVyLCBoYW5kbGVyLCByYXcpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4kMShgSW52YWxpZCB3YXRjaCBoYW5kbGVyIHNwZWNpZmllZCBieSBrZXkgXCIke3Jhdy5oYW5kbGVyfVwiYCwgaGFuZGxlcik7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYEludmFsaWQgd2F0Y2ggb3B0aW9uOiBcIiR7a2V5fVwiYCwgcmF3KTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZU1lcmdlZE9wdGlvbnMoaW5zdGFuY2UpIHtcbiAgY29uc3QgYmFzZSA9IGluc3RhbmNlLnR5cGU7XG4gIGNvbnN0IHsgbWl4aW5zLCBleHRlbmRzOiBleHRlbmRzT3B0aW9ucyB9ID0gYmFzZTtcbiAgY29uc3Qge1xuICAgIG1peGluczogZ2xvYmFsTWl4aW5zLFxuICAgIG9wdGlvbnNDYWNoZTogY2FjaGUsXG4gICAgY29uZmlnOiB7IG9wdGlvbk1lcmdlU3RyYXRlZ2llcyB9XG4gIH0gPSBpbnN0YW5jZS5hcHBDb250ZXh0O1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQoYmFzZSk7XG4gIGxldCByZXNvbHZlZDtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJlc29sdmVkID0gY2FjaGVkO1xuICB9IGVsc2UgaWYgKCFnbG9iYWxNaXhpbnMubGVuZ3RoICYmICFtaXhpbnMgJiYgIWV4dGVuZHNPcHRpb25zKSB7XG4gICAge1xuICAgICAgcmVzb2x2ZWQgPSBiYXNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXNvbHZlZCA9IHt9O1xuICAgIGlmIChnbG9iYWxNaXhpbnMubGVuZ3RoKSB7XG4gICAgICBnbG9iYWxNaXhpbnMuZm9yRWFjaChcbiAgICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyhyZXNvbHZlZCwgbSwgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzLCB0cnVlKVxuICAgICAgKTtcbiAgICB9XG4gICAgbWVyZ2VPcHRpb25zKHJlc29sdmVkLCBiYXNlLCBvcHRpb25NZXJnZVN0cmF0ZWdpZXMpO1xuICB9XG4gIGlmIChpc09iamVjdChiYXNlKSkge1xuICAgIGNhY2hlLnNldChiYXNlLCByZXNvbHZlZCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuZnVuY3Rpb24gbWVyZ2VPcHRpb25zKHRvLCBmcm9tLCBzdHJhdHMsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCB7IG1peGlucywgZXh0ZW5kczogZXh0ZW5kc09wdGlvbnMgfSA9IGZyb207XG4gIGlmIChleHRlbmRzT3B0aW9ucykge1xuICAgIG1lcmdlT3B0aW9ucyh0bywgZXh0ZW5kc09wdGlvbnMsIHN0cmF0cywgdHJ1ZSk7XG4gIH1cbiAgaWYgKG1peGlucykge1xuICAgIG1peGlucy5mb3JFYWNoKFxuICAgICAgKG0pID0+IG1lcmdlT3B0aW9ucyh0bywgbSwgc3RyYXRzLCB0cnVlKVxuICAgICk7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIGlmIChhc01peGluICYmIGtleSA9PT0gXCJleHBvc2VcIikge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuJDEoXG4gICAgICAgIGBcImV4cG9zZVwiIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gZGVjbGFyZWQgaW4gbWl4aW5zIG9yIGV4dGVuZHMuIEl0IHNob3VsZCBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBiYXNlIGNvbXBvbmVudCBpdHNlbGYuYFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3RyYXQgPSBpbnRlcm5hbE9wdGlvbk1lcmdlU3RyYXRzW2tleV0gfHwgc3RyYXRzICYmIHN0cmF0c1trZXldO1xuICAgICAgdG9ba2V5XSA9IHN0cmF0ID8gc3RyYXQodG9ba2V5XSwgZnJvbVtrZXldKSA6IGZyb21ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvO1xufVxuY29uc3QgaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyA9IHtcbiAgZGF0YTogbWVyZ2VEYXRhRm4sXG4gIHByb3BzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIGVtaXRzOiBtZXJnZUVtaXRzT3JQcm9wc09wdGlvbnMsXG4gIC8vIG9iamVjdHNcbiAgbWV0aG9kczogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBjb21wdXRlZDogbWVyZ2VPYmplY3RPcHRpb25zLFxuICAvLyBsaWZlY3ljbGVcbiAgYmVmb3JlQ3JlYXRlOiBtZXJnZUFzQXJyYXksXG4gIGNyZWF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgYmVmb3JlTW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgbW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVVcGRhdGU6IG1lcmdlQXNBcnJheSxcbiAgdXBkYXRlZDogbWVyZ2VBc0FycmF5LFxuICBiZWZvcmVEZXN0cm95OiBtZXJnZUFzQXJyYXksXG4gIGJlZm9yZVVubW91bnQ6IG1lcmdlQXNBcnJheSxcbiAgZGVzdHJveWVkOiBtZXJnZUFzQXJyYXksXG4gIHVubW91bnRlZDogbWVyZ2VBc0FycmF5LFxuICBhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZGVhY3RpdmF0ZWQ6IG1lcmdlQXNBcnJheSxcbiAgZXJyb3JDYXB0dXJlZDogbWVyZ2VBc0FycmF5LFxuICBzZXJ2ZXJQcmVmZXRjaDogbWVyZ2VBc0FycmF5LFxuICAvLyBhc3NldHNcbiAgY29tcG9uZW50czogbWVyZ2VPYmplY3RPcHRpb25zLFxuICBkaXJlY3RpdmVzOiBtZXJnZU9iamVjdE9wdGlvbnMsXG4gIC8vIHdhdGNoXG4gIHdhdGNoOiBtZXJnZVdhdGNoT3B0aW9ucyxcbiAgLy8gcHJvdmlkZSAvIGluamVjdFxuICBwcm92aWRlOiBtZXJnZURhdGFGbixcbiAgaW5qZWN0OiBtZXJnZUluamVjdFxufTtcbmZ1bmN0aW9uIG1lcmdlRGF0YUZuKHRvLCBmcm9tKSB7XG4gIGlmICghZnJvbSkge1xuICAgIHJldHVybiB0bztcbiAgfVxuICBpZiAoIXRvKSB7XG4gICAgcmV0dXJuIGZyb207XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZERhdGFGbigpIHtcbiAgICByZXR1cm4gKGV4dGVuZCkoXG4gICAgICBpc0Z1bmN0aW9uKHRvKSA/IHRvLmNhbGwodGhpcywgdGhpcykgOiB0byxcbiAgICAgIGlzRnVuY3Rpb24oZnJvbSkgPyBmcm9tLmNhbGwodGhpcywgdGhpcykgOiBmcm9tXG4gICAgKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlSW5qZWN0KHRvLCBmcm9tKSB7XG4gIHJldHVybiBtZXJnZU9iamVjdE9wdGlvbnMobm9ybWFsaXplSW5qZWN0KHRvKSwgbm9ybWFsaXplSW5qZWN0KGZyb20pKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdChyYXcpIHtcbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXNbcmF3W2ldXSA9IHJhd1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICByZXR1cm4gcmF3O1xufVxuZnVuY3Rpb24gbWVyZ2VBc0FycmF5KHRvLCBmcm9tKSB7XG4gIHJldHVybiB0byA/IFsuLi5uZXcgU2V0KFtdLmNvbmNhdCh0bywgZnJvbSkpXSA6IGZyb207XG59XG5mdW5jdGlvbiBtZXJnZU9iamVjdE9wdGlvbnModG8sIGZyb20pIHtcbiAgcmV0dXJuIHRvID8gZXh0ZW5kKC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0bywgZnJvbSkgOiBmcm9tO1xufVxuZnVuY3Rpb24gbWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zKHRvLCBmcm9tKSB7XG4gIGlmICh0bykge1xuICAgIGlmIChpc0FycmF5KHRvKSAmJiBpc0FycmF5KGZyb20pKSB7XG4gICAgICByZXR1cm4gWy4uLi8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFsuLi50bywgLi4uZnJvbV0pXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuZChcbiAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgbm9ybWFsaXplUHJvcHNPckVtaXRzKHRvKSxcbiAgICAgIG5vcm1hbGl6ZVByb3BzT3JFbWl0cyhmcm9tICE9IG51bGwgPyBmcm9tIDoge30pXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZnJvbTtcbiAgfVxufVxuZnVuY3Rpb24gbWVyZ2VXYXRjaE9wdGlvbnModG8sIGZyb20pIHtcbiAgaWYgKCF0bykgcmV0dXJuIGZyb207XG4gIGlmICghZnJvbSkgcmV0dXJuIHRvO1xuICBjb25zdCBtZXJnZWQgPSBleHRlbmQoLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRvKTtcbiAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuICAgIG1lcmdlZFtrZXldID0gbWVyZ2VBc0FycmF5KHRvW2tleV0sIGZyb21ba2V5XSk7XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXBwQ29udGV4dCgpIHtcbiAgcmV0dXJuIHtcbiAgICBhcHA6IG51bGwsXG4gICAgY29uZmlnOiB7XG4gICAgICBpc05hdGl2ZVRhZzogTk8sXG4gICAgICBwZXJmb3JtYW5jZTogZmFsc2UsXG4gICAgICBnbG9iYWxQcm9wZXJ0aWVzOiB7fSxcbiAgICAgIG9wdGlvbk1lcmdlU3RyYXRlZ2llczoge30sXG4gICAgICBlcnJvckhhbmRsZXI6IHZvaWQgMCxcbiAgICAgIHdhcm5IYW5kbGVyOiB2b2lkIDAsXG4gICAgICBjb21waWxlck9wdGlvbnM6IHt9XG4gICAgfSxcbiAgICBtaXhpbnM6IFtdLFxuICAgIGNvbXBvbmVudHM6IHt9LFxuICAgIGRpcmVjdGl2ZXM6IHt9LFxuICAgIHByb3ZpZGVzOiAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICBvcHRpb25zQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIHByb3BzQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLFxuICAgIGVtaXRzQ2FjaGU6IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpXG4gIH07XG59XG5sZXQgdWlkJDEgPSAwO1xuZnVuY3Rpb24gY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSkge1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXBwKHJvb3RDb21wb25lbnQsIHJvb3RQcm9wcyA9IG51bGwpIHtcbiAgICBpZiAoIWlzRnVuY3Rpb24ocm9vdENvbXBvbmVudCkpIHtcbiAgICAgIHJvb3RDb21wb25lbnQgPSBleHRlbmQoe30sIHJvb3RDb21wb25lbnQpO1xuICAgIH1cbiAgICBpZiAocm9vdFByb3BzICE9IG51bGwgJiYgIWlzT2JqZWN0KHJvb3RQcm9wcykpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKGByb290IHByb3BzIHBhc3NlZCB0byBhcHAubW91bnQoKSBtdXN0IGJlIGFuIG9iamVjdC5gKTtcbiAgICAgIHJvb3RQcm9wcyA9IG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2lucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICAgIGNvbnN0IHBsdWdpbkNsZWFudXBGbnMgPSBbXTtcbiAgICBsZXQgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXBwID0gY29udGV4dC5hcHAgPSB7XG4gICAgICBfdWlkOiB1aWQkMSsrLFxuICAgICAgX2NvbXBvbmVudDogcm9vdENvbXBvbmVudCxcbiAgICAgIF9wcm9wczogcm9vdFByb3BzLFxuICAgICAgX2NvbnRhaW5lcjogbnVsbCxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2luc3RhbmNlOiBudWxsLFxuICAgICAgdmVyc2lvbixcbiAgICAgIGdldCBjb25maWcoKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmNvbmZpZztcbiAgICAgIH0sXG4gICAgICBzZXQgY29uZmlnKHYpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgYXBwLmNvbmZpZyBjYW5ub3QgYmUgcmVwbGFjZWQuIE1vZGlmeSBpbmRpdmlkdWFsIG9wdGlvbnMgaW5zdGVhZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZShwbHVnaW4sIC4uLm9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGluc3RhbGxlZFBsdWdpbnMuaGFzKHBsdWdpbikpIHtcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4kMShgUGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9IGVsc2UgaWYgKHBsdWdpbiAmJiBpc0Z1bmN0aW9uKHBsdWdpbi5pbnN0YWxsKSkge1xuICAgICAgICAgIGluc3RhbGxlZFBsdWdpbnMuYWRkKHBsdWdpbik7XG4gICAgICAgICAgcGx1Z2luLmluc3RhbGwoYXBwLCAuLi5vcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uKHBsdWdpbikpIHtcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLmFkZChwbHVnaW4pO1xuICAgICAgICAgIHBsdWdpbihhcHAsIC4uLm9wdGlvbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQSBwbHVnaW4gbXVzdCBlaXRoZXIgYmUgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhbiBcImluc3RhbGxcIiBmdW5jdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgfSxcbiAgICAgIG1peGluKG1peGluKSB7XG4gICAgICAgIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fKSB7XG4gICAgICAgICAgaWYgKCFjb250ZXh0Lm1peGlucy5pbmNsdWRlcyhtaXhpbikpIHtcbiAgICAgICAgICAgIGNvbnRleHQubWl4aW5zLnB1c2gobWl4aW4pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgICBcIk1peGluIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0YXJnZXQgYXBwXCIgKyAobWl4aW4ubmFtZSA/IGA6ICR7bWl4aW4ubmFtZX1gIDogXCJcIilcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJNaXhpbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIGJ1aWxkcyBzdXBwb3J0aW5nIE9wdGlvbnMgQVBJXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgY29tcG9uZW50KG5hbWUsIGNvbXBvbmVudCkge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lLCBjb250ZXh0LmNvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5jb21wb25lbnRzW25hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSkge1xuICAgICAgICAgIHdhcm4kMShgQ29tcG9uZW50IFwiJHtuYW1lfVwiIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBpbiB0YXJnZXQgYXBwLmApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRleHQuY29tcG9uZW50c1tuYW1lXSA9IGNvbXBvbmVudDtcbiAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgIH0sXG4gICAgICBkaXJlY3RpdmUobmFtZSwgZGlyZWN0aXZlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdmFsaWRhdGVEaXJlY3RpdmVOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGlyZWN0aXZlKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlc1tuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0pIHtcbiAgICAgICAgICB3YXJuJDEoYERpcmVjdGl2ZSBcIiR7bmFtZX1cIiBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgaW4gdGFyZ2V0IGFwcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBjb250ZXh0LmRpcmVjdGl2ZXNbbmFtZV0gPSBkaXJlY3RpdmU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgbW91bnQocm9vdENvbnRhaW5lciwgaXNIeWRyYXRlLCBuYW1lc3BhY2UpIHtcbiAgICAgICAgaWYgKCFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByb290Q29udGFpbmVyLl9fdnVlX2FwcF9fKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBUaGVyZSBpcyBhbHJlYWR5IGFuIGFwcCBpbnN0YW5jZSBtb3VudGVkIG9uIHRoZSBob3N0IGNvbnRhaW5lci5cbiBJZiB5b3Ugd2FudCB0byBtb3VudCBhbm90aGVyIGFwcCBvbiB0aGUgc2FtZSBob3N0IGNvbnRhaW5lciwgeW91IG5lZWQgdG8gdW5tb3VudCB0aGUgcHJldmlvdXMgYXBwIGJ5IGNhbGxpbmcgXFxgYXBwLnVubW91bnQoKVxcYCBmaXJzdC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2bm9kZSA9IGFwcC5fY2VWTm9kZSB8fCBjcmVhdGVWTm9kZShyb290Q29tcG9uZW50LCByb290UHJvcHMpO1xuICAgICAgICAgIHZub2RlLmFwcENvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgICAgICAgfSBlbHNlIGlmIChuYW1lc3BhY2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBuYW1lc3BhY2UgPSB2b2lkIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnJlbG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgICAgIGNsb25lVk5vZGUodm5vZGUpLFxuICAgICAgICAgICAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNIeWRyYXRlICYmIGh5ZHJhdGUpIHtcbiAgICAgICAgICAgIGh5ZHJhdGUodm5vZGUsIHJvb3RDb250YWluZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXIodm5vZGUsIHJvb3RDb250YWluZXIsIG5hbWVzcGFjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlzTW91bnRlZCA9IHRydWU7XG4gICAgICAgICAgYXBwLl9jb250YWluZXIgPSByb290Q29udGFpbmVyO1xuICAgICAgICAgIHJvb3RDb250YWluZXIuX192dWVfYXBwX18gPSBhcHA7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgICBhcHAuX2luc3RhbmNlID0gdm5vZGUuY29tcG9uZW50O1xuICAgICAgICAgICAgZGV2dG9vbHNJbml0QXBwKGFwcCwgdmVyc2lvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnRQdWJsaWNJbnN0YW5jZSh2bm9kZS5jb21wb25lbnQpO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQXBwIGhhcyBhbHJlYWR5IGJlZW4gbW91bnRlZC5cbklmIHlvdSB3YW50IHRvIHJlbW91bnQgdGhlIHNhbWUgYXBwLCBtb3ZlIHlvdXIgYXBwIGNyZWF0aW9uIGxvZ2ljIGludG8gYSBmYWN0b3J5IGZ1bmN0aW9uIGFuZCBjcmVhdGUgZnJlc2ggYXBwIGluc3RhbmNlcyBmb3IgZWFjaCBtb3VudCAtIGUuZy4gXFxgY29uc3QgY3JlYXRlTXlBcHAgPSAoKSA9PiBjcmVhdGVBcHAoQXBwKVxcYGBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Vbm1vdW50KGNsZWFudXBGbikge1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0eXBlb2YgY2xlYW51cEZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgZnVuY3Rpb24gYXMgZmlyc3QgYXJndW1lbnQgdG8gYXBwLm9uVW5tb3VudCgpLCBidXQgZ290ICR7dHlwZW9mIGNsZWFudXBGbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwbHVnaW5DbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuKTtcbiAgICAgIH0sXG4gICAgICB1bm1vdW50KCkge1xuICAgICAgICBpZiAoaXNNb3VudGVkKSB7XG4gICAgICAgICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICAgICAgICBwbHVnaW5DbGVhbnVwRm5zLFxuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSxcbiAgICAgICAgICAgIDE2XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZW5kZXIobnVsbCwgYXBwLl9jb250YWluZXIpO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgICAgICAgYXBwLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICBkZXZ0b29sc1VubW91bnRBcHAoYXBwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFwcC5fY29udGFpbmVyLl9fdnVlX2FwcF9fO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoYENhbm5vdCB1bm1vdW50IGFuIGFwcCB0aGF0IGlzIG5vdCBtb3VudGVkLmApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvdmlkZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGtleSBpbiBjb250ZXh0LnByb3ZpZGVzKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEFwcCBhbHJlYWR5IHByb3ZpZGVzIHByb3BlcnR5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIi4gSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXcgdmFsdWUuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5wcm92aWRlc1trZXldID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBhcHA7XG4gICAgICB9LFxuICAgICAgcnVuV2l0aENvbnRleHQoZm4pIHtcbiAgICAgICAgY29uc3QgbGFzdEFwcCA9IGN1cnJlbnRBcHA7XG4gICAgICAgIGN1cnJlbnRBcHAgPSBhcHA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgY3VycmVudEFwcCA9IGxhc3RBcHA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBhcHA7XG4gIH07XG59XG5sZXQgY3VycmVudEFwcCA9IG51bGw7XG5cbmZ1bmN0aW9uIHByb3ZpZGUoa2V5LCB2YWx1ZSkge1xuICBpZiAoIWN1cnJlbnRJbnN0YW5jZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB3YXJuJDEoYHByb3ZpZGUoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBzZXR1cCgpLmApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgcHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucHJvdmlkZXM7XG4gICAgY29uc3QgcGFyZW50UHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucGFyZW50ICYmIGN1cnJlbnRJbnN0YW5jZS5wYXJlbnQucHJvdmlkZXM7XG4gICAgaWYgKHBhcmVudFByb3ZpZGVzID09PSBwcm92aWRlcykge1xuICAgICAgcHJvdmlkZXMgPSBjdXJyZW50SW5zdGFuY2UucHJvdmlkZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFByb3ZpZGVzKTtcbiAgICB9XG4gICAgcHJvdmlkZXNba2V5XSA9IHZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBpbmplY3Qoa2V5LCBkZWZhdWx0VmFsdWUsIHRyZWF0RGVmYXVsdEFzRmFjdG9yeSA9IGZhbHNlKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbiAgaWYgKGluc3RhbmNlIHx8IGN1cnJlbnRBcHApIHtcbiAgICBjb25zdCBwcm92aWRlcyA9IGN1cnJlbnRBcHAgPyBjdXJyZW50QXBwLl9jb250ZXh0LnByb3ZpZGVzIDogaW5zdGFuY2UgPyBpbnN0YW5jZS5wYXJlbnQgPT0gbnVsbCA/IGluc3RhbmNlLnZub2RlLmFwcENvbnRleHQgJiYgaW5zdGFuY2Uudm5vZGUuYXBwQ29udGV4dC5wcm92aWRlcyA6IGluc3RhbmNlLnBhcmVudC5wcm92aWRlcyA6IHZvaWQgMDtcbiAgICBpZiAocHJvdmlkZXMgJiYga2V5IGluIHByb3ZpZGVzKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZXNba2V5XTtcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gdHJlYXREZWZhdWx0QXNGYWN0b3J5ICYmIGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZS5jYWxsKGluc3RhbmNlICYmIGluc3RhbmNlLnByb3h5KSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIHdhcm4kMShgaW5qZWN0aW9uIFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQuYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB3YXJuJDEoYGluamVjdCgpIGNhbiBvbmx5IGJlIHVzZWQgaW5zaWRlIHNldHVwKCkgb3IgZnVuY3Rpb25hbCBjb21wb25lbnRzLmApO1xuICB9XG59XG5mdW5jdGlvbiBoYXNJbmplY3Rpb25Db250ZXh0KCkge1xuICByZXR1cm4gISEoY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB8fCBjdXJyZW50QXBwKTtcbn1cblxuY29uc3QgaW50ZXJuYWxPYmplY3RQcm90byA9IHt9O1xuY29uc3QgY3JlYXRlSW50ZXJuYWxPYmplY3QgPSAoKSA9PiBPYmplY3QuY3JlYXRlKGludGVybmFsT2JqZWN0UHJvdG8pO1xuY29uc3QgaXNJbnRlcm5hbE9iamVjdCA9IChvYmopID0+IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBpbnRlcm5hbE9iamVjdFByb3RvO1xuXG5mdW5jdGlvbiBpbml0UHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBpc1N0YXRlZnVsLCBpc1NTUiA9IGZhbHNlKSB7XG4gIGNvbnN0IHByb3BzID0ge307XG4gIGNvbnN0IGF0dHJzID0gY3JlYXRlSW50ZXJuYWxPYmplY3QoKTtcbiAgaW5zdGFuY2UucHJvcHNEZWZhdWx0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5wcm9wc09wdGlvbnNbMF0pIHtcbiAgICBpZiAoIShrZXkgaW4gcHJvcHMpKSB7XG4gICAgICBwcm9wc1trZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIHZhbGlkYXRlUHJvcHMocmF3UHJvcHMgfHwge30sIHByb3BzLCBpbnN0YW5jZSk7XG4gIH1cbiAgaWYgKGlzU3RhdGVmdWwpIHtcbiAgICBpbnN0YW5jZS5wcm9wcyA9IGlzU1NSID8gcHJvcHMgOiBzaGFsbG93UmVhY3RpdmUocHJvcHMpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW5zdGFuY2UudHlwZS5wcm9wcykge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSBwcm9wcztcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYXR0cnMgPSBhdHRycztcbn1cbmZ1bmN0aW9uIGlzSW5IbXJDb250ZXh0KGluc3RhbmNlKSB7XG4gIHdoaWxlIChpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZS50eXBlLl9faG1ySWQpIHJldHVybiB0cnVlO1xuICAgIGluc3RhbmNlID0gaW5zdGFuY2UucGFyZW50O1xuICB9XG59XG5mdW5jdGlvbiB1cGRhdGVQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIHJhd1ByZXZQcm9wcywgb3B0aW1pemVkKSB7XG4gIGNvbnN0IHtcbiAgICBwcm9wcyxcbiAgICBhdHRycyxcbiAgICB2bm9kZTogeyBwYXRjaEZsYWcgfVxuICB9ID0gaW5zdGFuY2U7XG4gIGNvbnN0IHJhd0N1cnJlbnRQcm9wcyA9IHRvUmF3KHByb3BzKTtcbiAgY29uc3QgW29wdGlvbnNdID0gaW5zdGFuY2UucHJvcHNPcHRpb25zO1xuICBsZXQgaGFzQXR0cnNDaGFuZ2VkID0gZmFsc2U7XG4gIGlmIChcbiAgICAvLyBhbHdheXMgZm9yY2UgZnVsbCBkaWZmIGluIGRldlxuICAgIC8vIC0gIzE5NDIgaWYgaG1yIGlzIGVuYWJsZWQgd2l0aCBzZmMgY29tcG9uZW50XG4gICAgLy8gLSB2aXRlIzg3MiBub24tc2ZjIGNvbXBvbmVudCB1c2VkIGJ5IHNmYyBjb21wb25lbnRcbiAgICAhKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNJbkhtckNvbnRleHQoaW5zdGFuY2UpKSAmJiAob3B0aW1pemVkIHx8IHBhdGNoRmxhZyA+IDApICYmICEocGF0Y2hGbGFnICYgMTYpXG4gICkge1xuICAgIGlmIChwYXRjaEZsYWcgJiA4KSB7XG4gICAgICBjb25zdCBwcm9wc1RvVXBkYXRlID0gaW5zdGFuY2Uudm5vZGUuZHluYW1pY1Byb3BzO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICBpZiAoaXNFbWl0TGlzdGVuZXIoaW5zdGFuY2UuZW1pdHNPcHRpb25zLCBrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSByYXdQcm9wc1trZXldO1xuICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgIGlmIChoYXNPd24oYXR0cnMsIGtleSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gYXR0cnNba2V5XSkge1xuICAgICAgICAgICAgICBhdHRyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbWVsaXplZEtleSA9IGNhbWVsaXplKGtleSk7XG4gICAgICAgICAgICBwcm9wc1tjYW1lbGl6ZWRLZXldID0gcmVzb2x2ZVByb3BWYWx1ZShcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgcmF3Q3VycmVudFByb3BzLFxuICAgICAgICAgICAgICBjYW1lbGl6ZWRLZXksXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gYXR0cnNba2V5XSkge1xuICAgICAgICAgICAgYXR0cnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNldEZ1bGxQcm9wcyhpbnN0YW5jZSwgcmF3UHJvcHMsIHByb3BzLCBhdHRycykpIHtcbiAgICAgIGhhc0F0dHJzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGxldCBrZWJhYktleTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByYXdDdXJyZW50UHJvcHMpIHtcbiAgICAgIGlmICghcmF3UHJvcHMgfHwgLy8gZm9yIGNhbWVsQ2FzZVxuICAgICAgIWhhc093bihyYXdQcm9wcywga2V5KSAmJiAvLyBpdCdzIHBvc3NpYmxlIHRoZSBvcmlnaW5hbCBwcm9wcyB3YXMgcGFzc2VkIGluIGFzIGtlYmFiLWNhc2VcbiAgICAgIC8vIGFuZCBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlICgjOTU1KVxuICAgICAgKChrZWJhYktleSA9IGh5cGhlbmF0ZShrZXkpKSA9PT0ga2V5IHx8ICFoYXNPd24ocmF3UHJvcHMsIGtlYmFiS2V5KSkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICBpZiAocmF3UHJldlByb3BzICYmIC8vIGZvciBjYW1lbENhc2VcbiAgICAgICAgICAocmF3UHJldlByb3BzW2tleV0gIT09IHZvaWQgMCB8fCAvLyBmb3Iga2ViYWItY2FzZVxuICAgICAgICAgIHJhd1ByZXZQcm9wc1trZWJhYktleV0gIT09IHZvaWQgMCkpIHtcbiAgICAgICAgICAgIHByb3BzW2tleV0gPSByZXNvbHZlUHJvcFZhbHVlKFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICByYXdDdXJyZW50UHJvcHMsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHByb3BzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGF0dHJzICE9PSByYXdDdXJyZW50UHJvcHMpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgICAgIGlmICghcmF3UHJvcHMgfHwgIWhhc093bihyYXdQcm9wcywga2V5KSAmJiB0cnVlKSB7XG4gICAgICAgICAgZGVsZXRlIGF0dHJzW2tleV07XG4gICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoaGFzQXR0cnNDaGFuZ2VkKSB7XG4gICAgdHJpZ2dlcihpbnN0YW5jZS5hdHRycywgXCJzZXRcIiwgXCJcIik7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICB2YWxpZGF0ZVByb3BzKHJhd1Byb3BzIHx8IHt9LCBwcm9wcywgaW5zdGFuY2UpO1xuICB9XG59XG5mdW5jdGlvbiBzZXRGdWxsUHJvcHMoaW5zdGFuY2UsIHJhd1Byb3BzLCBwcm9wcywgYXR0cnMpIHtcbiAgY29uc3QgW29wdGlvbnMsIG5lZWRDYXN0S2V5c10gPSBpbnN0YW5jZS5wcm9wc09wdGlvbnM7XG4gIGxldCBoYXNBdHRyc0NoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IHJhd0Nhc3RWYWx1ZXM7XG4gIGlmIChyYXdQcm9wcykge1xuICAgIGZvciAobGV0IGtleSBpbiByYXdQcm9wcykge1xuICAgICAgaWYgKGlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHJhd1Byb3BzW2tleV07XG4gICAgICBsZXQgY2FtZWxLZXk7XG4gICAgICBpZiAob3B0aW9ucyAmJiBoYXNPd24ob3B0aW9ucywgY2FtZWxLZXkgPSBjYW1lbGl6ZShrZXkpKSkge1xuICAgICAgICBpZiAoIW5lZWRDYXN0S2V5cyB8fCAhbmVlZENhc3RLZXlzLmluY2x1ZGVzKGNhbWVsS2V5KSkge1xuICAgICAgICAgIHByb3BzW2NhbWVsS2V5XSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIChyYXdDYXN0VmFsdWVzIHx8IChyYXdDYXN0VmFsdWVzID0ge30pKVtjYW1lbEtleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghaXNFbWl0TGlzdGVuZXIoaW5zdGFuY2UuZW1pdHNPcHRpb25zLCBrZXkpKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBhdHRycykgfHwgdmFsdWUgIT09IGF0dHJzW2tleV0pIHtcbiAgICAgICAgICBhdHRyc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgaGFzQXR0cnNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobmVlZENhc3RLZXlzKSB7XG4gICAgY29uc3QgcmF3Q3VycmVudFByb3BzID0gdG9SYXcocHJvcHMpO1xuICAgIGNvbnN0IGNhc3RWYWx1ZXMgPSByYXdDYXN0VmFsdWVzIHx8IEVNUFRZX09CSjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5lZWRDYXN0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gbmVlZENhc3RLZXlzW2ldO1xuICAgICAgcHJvcHNba2V5XSA9IHJlc29sdmVQcm9wVmFsdWUoXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0N1cnJlbnRQcm9wcyxcbiAgICAgICAga2V5LFxuICAgICAgICBjYXN0VmFsdWVzW2tleV0sXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICAhaGFzT3duKGNhc3RWYWx1ZXMsIGtleSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNBdHRyc0NoYW5nZWQ7XG59XG5mdW5jdGlvbiByZXNvbHZlUHJvcFZhbHVlKG9wdGlvbnMsIHByb3BzLCBrZXksIHZhbHVlLCBpbnN0YW5jZSwgaXNBYnNlbnQpIHtcbiAgY29uc3Qgb3B0ID0gb3B0aW9uc1trZXldO1xuICBpZiAob3B0ICE9IG51bGwpIHtcbiAgICBjb25zdCBoYXNEZWZhdWx0ID0gaGFzT3duKG9wdCwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChoYXNEZWZhdWx0ICYmIHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IG9wdC5kZWZhdWx0O1xuICAgICAgaWYgKG9wdC50eXBlICE9PSBGdW5jdGlvbiAmJiAhb3B0LnNraXBGYWN0b3J5ICYmIGlzRnVuY3Rpb24oZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBjb25zdCB7IHByb3BzRGVmYXVsdHMgfSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoa2V5IGluIHByb3BzRGVmYXVsdHMpIHtcbiAgICAgICAgICB2YWx1ZSA9IHByb3BzRGVmYXVsdHNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgICAgdmFsdWUgPSBwcm9wc0RlZmF1bHRzW2tleV0gPSBkZWZhdWx0VmFsdWUuY2FsbChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBwcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdGFuY2UuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UuY2UuX3NldFByb3Aoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRbMCAvKiBzaG91bGRDYXN0ICovXSkge1xuICAgICAgaWYgKGlzQWJzZW50ICYmICFoYXNEZWZhdWx0KSB7XG4gICAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKG9wdFsxIC8qIHNob3VsZENhc3RUcnVlICovXSAmJiAodmFsdWUgPT09IFwiXCIgfHwgdmFsdWUgPT09IGh5cGhlbmF0ZShrZXkpKSkge1xuICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbmNvbnN0IG1peGluUHJvcHNDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gbm9ybWFsaXplUHJvcHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IF9fVlVFX09QVElPTlNfQVBJX18gJiYgYXNNaXhpbiA/IG1peGluUHJvcHNDYWNoZSA6IGFwcENvbnRleHQucHJvcHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBjb25zdCByYXcgPSBjb21wLnByb3BzO1xuICBjb25zdCBub3JtYWxpemVkID0ge307XG4gIGNvbnN0IG5lZWRDYXN0S2V5cyA9IFtdO1xuICBsZXQgaGFzRXh0ZW5kcyA9IGZhbHNlO1xuICBpZiAoX19WVUVfT1BUSU9OU19BUElfXyAmJiAhaXNGdW5jdGlvbihjb21wKSkge1xuICAgIGNvbnN0IGV4dGVuZFByb3BzID0gKHJhdzIpID0+IHtcbiAgICAgIGhhc0V4dGVuZHMgPSB0cnVlO1xuICAgICAgY29uc3QgW3Byb3BzLCBrZXlzXSA9IG5vcm1hbGl6ZVByb3BzT3B0aW9ucyhyYXcyLCBhcHBDb250ZXh0LCB0cnVlKTtcbiAgICAgIGV4dGVuZChub3JtYWxpemVkLCBwcm9wcyk7XG4gICAgICBpZiAoa2V5cykgbmVlZENhc3RLZXlzLnB1c2goLi4ua2V5cyk7XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kUHJvcHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZFByb3BzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBFTVBUWV9BUlIpO1xuICAgIH1cbiAgICByZXR1cm4gRU1QVFlfQVJSO1xuICB9XG4gIGlmIChpc0FycmF5KHJhdykpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhdy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzU3RyaW5nKHJhd1tpXSkpIHtcbiAgICAgICAgd2FybiQxKGBwcm9wcyBtdXN0IGJlIHN0cmluZ3Mgd2hlbiB1c2luZyBhcnJheSBzeW50YXguYCwgcmF3W2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXkgPSBjYW1lbGl6ZShyYXdbaV0pO1xuICAgICAgaWYgKHZhbGlkYXRlUHJvcE5hbWUobm9ybWFsaXplZEtleSkpIHtcbiAgICAgICAgbm9ybWFsaXplZFtub3JtYWxpemVkS2V5XSA9IEVNUFRZX09CSjtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocmF3KSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzT2JqZWN0KHJhdykpIHtcbiAgICAgIHdhcm4kMShgaW52YWxpZCBwcm9wcyBvcHRpb25zYCwgcmF3KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmF3KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgIGlmICh2YWxpZGF0ZVByb3BOYW1lKG5vcm1hbGl6ZWRLZXkpKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IHJhd1trZXldO1xuICAgICAgICBjb25zdCBwcm9wID0gbm9ybWFsaXplZFtub3JtYWxpemVkS2V5XSA9IGlzQXJyYXkob3B0KSB8fCBpc0Z1bmN0aW9uKG9wdCkgPyB7IHR5cGU6IG9wdCB9IDogZXh0ZW5kKHt9LCBvcHQpO1xuICAgICAgICBjb25zdCBwcm9wVHlwZSA9IHByb3AudHlwZTtcbiAgICAgICAgbGV0IHNob3VsZENhc3QgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNob3VsZENhc3RUcnVlID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzQXJyYXkocHJvcFR5cGUpKSB7XG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb3BUeXBlLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHByb3BUeXBlW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gaXNGdW5jdGlvbih0eXBlKSAmJiB0eXBlLm5hbWU7XG4gICAgICAgICAgICBpZiAodHlwZU5hbWUgPT09IFwiQm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgIHNob3VsZENhc3QgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZU5hbWUgPT09IFwiU3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgc2hvdWxkQ2FzdFRydWUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvdWxkQ2FzdCA9IGlzRnVuY3Rpb24ocHJvcFR5cGUpICYmIHByb3BUeXBlLm5hbWUgPT09IFwiQm9vbGVhblwiO1xuICAgICAgICB9XG4gICAgICAgIHByb3BbMCAvKiBzaG91bGRDYXN0ICovXSA9IHNob3VsZENhc3Q7XG4gICAgICAgIHByb3BbMSAvKiBzaG91bGRDYXN0VHJ1ZSAqL10gPSBzaG91bGRDYXN0VHJ1ZTtcbiAgICAgICAgaWYgKHNob3VsZENhc3QgfHwgaGFzT3duKHByb3AsIFwiZGVmYXVsdFwiKSkge1xuICAgICAgICAgIG5lZWRDYXN0S2V5cy5wdXNoKG5vcm1hbGl6ZWRLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlcyA9IFtub3JtYWxpemVkLCBuZWVkQ2FzdEtleXNdO1xuICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICBjYWNoZS5zZXQoY29tcCwgcmVzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wTmFtZShrZXkpIHtcbiAgaWYgKGtleVswXSAhPT0gXCIkXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybiQxKGBJbnZhbGlkIHByb3AgbmFtZTogXCIke2tleX1cIiBpcyBhIHJlc2VydmVkIHByb3BlcnR5LmApO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGdldFR5cGUoY3Rvcikge1xuICBpZiAoY3RvciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBpZiAodHlwZW9mIGN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBjdG9yLm5hbWUgfHwgXCJcIjtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY3RvciA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG5hbWUgPSBjdG9yLmNvbnN0cnVjdG9yICYmIGN0b3IuY29uc3RydWN0b3IubmFtZTtcbiAgICByZXR1cm4gbmFtZSB8fCBcIlwiO1xuICB9XG4gIHJldHVybiBcIlwiO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhyYXdQcm9wcywgcHJvcHMsIGluc3RhbmNlKSB7XG4gIGNvbnN0IHJlc29sdmVkVmFsdWVzID0gdG9SYXcocHJvcHMpO1xuICBjb25zdCBvcHRpb25zID0gaW5zdGFuY2UucHJvcHNPcHRpb25zWzBdO1xuICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgbGV0IG9wdCA9IG9wdGlvbnNba2V5XTtcbiAgICBpZiAob3B0ID09IG51bGwpIGNvbnRpbnVlO1xuICAgIHZhbGlkYXRlUHJvcChcbiAgICAgIGtleSxcbiAgICAgIHJlc29sdmVkVmFsdWVzW2tleV0sXG4gICAgICBvcHQsXG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHJlc29sdmVkVmFsdWVzKSA6IHJlc29sdmVkVmFsdWVzLFxuICAgICAgIWhhc093bihyYXdQcm9wcywga2V5KSAmJiAhaGFzT3duKHJhd1Byb3BzLCBoeXBoZW5hdGUoa2V5KSlcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AobmFtZSwgdmFsdWUsIHByb3AsIHByb3BzLCBpc0Fic2VudCkge1xuICBjb25zdCB7IHR5cGUsIHJlcXVpcmVkLCB2YWxpZGF0b3IsIHNraXBDaGVjayB9ID0gcHJvcDtcbiAgaWYgKHJlcXVpcmVkICYmIGlzQWJzZW50KSB7XG4gICAgd2FybiQxKCdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlID09IG51bGwgJiYgIXJlcXVpcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZSAhPT0gdHJ1ZSAmJiAhc2tpcENoZWNrKSB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBjb25zdCB0eXBlcyA9IGlzQXJyYXkodHlwZSkgPyB0eXBlIDogW3R5cGVdO1xuICAgIGNvbnN0IGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aCAmJiAhaXNWYWxpZDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbGlkLCBleHBlY3RlZFR5cGUgfSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVzW2ldKTtcbiAgICAgIGV4cGVjdGVkVHlwZXMucHVzaChleHBlY3RlZFR5cGUgfHwgXCJcIik7XG4gICAgICBpc1ZhbGlkID0gdmFsaWQ7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgd2FybiQxKGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3IodmFsdWUsIHByb3BzKSkge1xuICAgIHdhcm4kMSgnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicpO1xuICB9XG59XG5jb25zdCBpc1NpbXBsZVR5cGUgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcbiAgXCJTdHJpbmcsTnVtYmVyLEJvb2xlYW4sRnVuY3Rpb24sU3ltYm9sLEJpZ0ludFwiXG4pO1xuZnVuY3Rpb24gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZSkge1xuICBsZXQgdmFsaWQ7XG4gIGNvbnN0IGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChleHBlY3RlZFR5cGUgPT09IFwibnVsbFwiKSB7XG4gICAgdmFsaWQgPSB2YWx1ZSA9PT0gbnVsbDtcbiAgfSBlbHNlIGlmIChpc1NpbXBsZVR5cGUoZXhwZWN0ZWRUeXBlKSkge1xuICAgIGNvbnN0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgdmFsaWQgPSB0ID09PSBleHBlY3RlZFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiB0eXBlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiT2JqZWN0XCIpIHtcbiAgICB2YWxpZCA9IGlzT2JqZWN0KHZhbHVlKTtcbiAgfSBlbHNlIGlmIChleHBlY3RlZFR5cGUgPT09IFwiQXJyYXlcIikge1xuICAgIHZhbGlkID0gaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGVcbiAgfTtcbn1cbmZ1bmN0aW9uIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYFByb3AgdHlwZSBbXSBmb3IgcHJvcCBcIiR7bmFtZX1cIiB3b24ndCBtYXRjaCBhbnl0aGluZy4gRGlkIHlvdSBtZWFuIHRvIHVzZSB0eXBlIEFycmF5IGluc3RlYWQ/YDtcbiAgfVxuICBsZXQgbWVzc2FnZSA9IGBJbnZhbGlkIHByb3A6IHR5cGUgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJHtuYW1lfVwiLiBFeHBlY3RlZCAke2V4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oXCIgfCBcIil9YDtcbiAgY29uc3QgZXhwZWN0ZWRUeXBlID0gZXhwZWN0ZWRUeXBlc1swXTtcbiAgY29uc3QgcmVjZWl2ZWRUeXBlID0gdG9SYXdUeXBlKHZhbHVlKTtcbiAgY29uc3QgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIGNvbnN0IHJlY2VpdmVkVmFsdWUgPSBzdHlsZVZhbHVlKHZhbHVlLCByZWNlaXZlZFR5cGUpO1xuICBpZiAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPT09IDEgJiYgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiYgIWlzQm9vbGVhbihleHBlY3RlZFR5cGUsIHJlY2VpdmVkVHlwZSkpIHtcbiAgICBtZXNzYWdlICs9IGAgd2l0aCB2YWx1ZSAke2V4cGVjdGVkVmFsdWV9YDtcbiAgfVxuICBtZXNzYWdlICs9IGAsIGdvdCAke3JlY2VpdmVkVHlwZX0gYDtcbiAgaWYgKGlzRXhwbGljYWJsZShyZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBgd2l0aCB2YWx1ZSAke3JlY2VpdmVkVmFsdWV9LmA7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG5mdW5jdGlvbiBzdHlsZVZhbHVlKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSBcIlN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiTnVtYmVyXCIpIHtcbiAgICByZXR1cm4gYCR7TnVtYmVyKHZhbHVlKX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5mdW5jdGlvbiBpc0V4cGxpY2FibGUodHlwZSkge1xuICBjb25zdCBleHBsaWNpdFR5cGVzID0gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiXTtcbiAgcmV0dXJuIGV4cGxpY2l0VHlwZXMuc29tZSgoZWxlbSkgPT4gdHlwZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtKTtcbn1cbmZ1bmN0aW9uIGlzQm9vbGVhbiguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGVsZW0pID0+IGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gXCJib29sZWFuXCIpO1xufVxuXG5jb25zdCBpc0ludGVybmFsS2V5ID0gKGtleSkgPT4ga2V5WzBdID09PSBcIl9cIiB8fCBrZXkgPT09IFwiJHN0YWJsZVwiO1xuY29uc3Qgbm9ybWFsaXplU2xvdFZhbHVlID0gKHZhbHVlKSA9PiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWTm9kZSkgOiBbbm9ybWFsaXplVk5vZGUodmFsdWUpXTtcbmNvbnN0IG5vcm1hbGl6ZVNsb3QgPSAoa2V5LCByYXdTbG90LCBjdHgpID0+IHtcbiAgaWYgKHJhd1Nsb3QuX24pIHtcbiAgICByZXR1cm4gcmF3U2xvdDtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gd2l0aEN0eCgoLi4uYXJncykgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGN1cnJlbnRJbnN0YW5jZSAmJiAoIWN0eCB8fCBjdHgucm9vdCA9PT0gY3VycmVudEluc3RhbmNlLnJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBTbG90IFwiJHtrZXl9XCIgaW52b2tlZCBvdXRzaWRlIG9mIHRoZSByZW5kZXIgZnVuY3Rpb246IHRoaXMgd2lsbCBub3QgdHJhY2sgZGVwZW5kZW5jaWVzIHVzZWQgaW4gdGhlIHNsb3QuIEludm9rZSB0aGUgc2xvdCBmdW5jdGlvbiBpbnNpZGUgdGhlIHJlbmRlciBmdW5jdGlvbiBpbnN0ZWFkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVTbG90VmFsdWUocmF3U2xvdCguLi5hcmdzKSk7XG4gIH0sIGN0eCk7XG4gIG5vcm1hbGl6ZWQuX2MgPSBmYWxzZTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59O1xuY29uc3Qgbm9ybWFsaXplT2JqZWN0U2xvdHMgPSAocmF3U2xvdHMsIHNsb3RzLCBpbnN0YW5jZSkgPT4ge1xuICBjb25zdCBjdHggPSByYXdTbG90cy5fY3R4O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdTbG90cykge1xuICAgIGlmIChpc0ludGVybmFsS2V5KGtleSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHZhbHVlID0gcmF3U2xvdHNba2V5XTtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBub3JtYWxpemVTbG90KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlKSB7XG4gICAgICAgIHdhcm4kMShcbiAgICAgICAgICBgTm9uLWZ1bmN0aW9uIHZhbHVlIGVuY291bnRlcmVkIGZvciBzbG90IFwiJHtrZXl9XCIuIFByZWZlciBmdW5jdGlvbiBzbG90cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVTbG90VmFsdWUodmFsdWUpO1xuICAgICAgc2xvdHNba2V5XSA9ICgpID0+IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICB9XG59O1xuY29uc3Qgbm9ybWFsaXplVk5vZGVTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4pID0+IHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzS2VlcEFsaXZlKGluc3RhbmNlLnZub2RlKSAmJiB0cnVlKSB7XG4gICAgd2FybiQxKFxuICAgICAgYE5vbi1mdW5jdGlvbiB2YWx1ZSBlbmNvdW50ZXJlZCBmb3IgZGVmYXVsdCBzbG90LiBQcmVmZXIgZnVuY3Rpb24gc2xvdHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5gXG4gICAgKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplU2xvdFZhbHVlKGNoaWxkcmVuKTtcbiAgaW5zdGFuY2Uuc2xvdHMuZGVmYXVsdCA9ICgpID0+IG5vcm1hbGl6ZWQ7XG59O1xuY29uc3QgYXNzaWduU2xvdHMgPSAoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgZm9yIChjb25zdCBrZXkgaW4gY2hpbGRyZW4pIHtcbiAgICBpZiAob3B0aW1pemVkIHx8IGtleSAhPT0gXCJfXCIpIHtcbiAgICAgIHNsb3RzW2tleV0gPSBjaGlsZHJlbltrZXldO1xuICAgIH1cbiAgfVxufTtcbmNvbnN0IGluaXRTbG90cyA9IChpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCkgPT4ge1xuICBjb25zdCBzbG90cyA9IGluc3RhbmNlLnNsb3RzID0gY3JlYXRlSW50ZXJuYWxPYmplY3QoKTtcbiAgaWYgKGluc3RhbmNlLnZub2RlLnNoYXBlRmxhZyAmIDMyKSB7XG4gICAgY29uc3QgdHlwZSA9IGNoaWxkcmVuLl87XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGFzc2lnblNsb3RzKHNsb3RzLCBjaGlsZHJlbiwgb3B0aW1pemVkKTtcbiAgICAgIGlmIChvcHRpbWl6ZWQpIHtcbiAgICAgICAgZGVmKHNsb3RzLCBcIl9cIiwgdHlwZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vcm1hbGl6ZU9iamVjdFNsb3RzKGNoaWxkcmVuLCBzbG90cyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgbm9ybWFsaXplVk5vZGVTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4pO1xuICB9XG59O1xuY29uc3QgdXBkYXRlU2xvdHMgPSAoaW5zdGFuY2UsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpID0+IHtcbiAgY29uc3QgeyB2bm9kZSwgc2xvdHMgfSA9IGluc3RhbmNlO1xuICBsZXQgbmVlZERlbGV0aW9uQ2hlY2sgPSB0cnVlO1xuICBsZXQgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gRU1QVFlfT0JKO1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMzIpIHtcbiAgICBjb25zdCB0eXBlID0gY2hpbGRyZW4uXztcbiAgICBpZiAodHlwZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgICAgICBhc3NpZ25TbG90cyhzbG90cywgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgICAgIHRyaWdnZXIoaW5zdGFuY2UsIFwic2V0XCIsIFwiJHNsb3RzXCIpO1xuICAgICAgfSBlbHNlIGlmIChvcHRpbWl6ZWQgJiYgdHlwZSA9PT0gMSkge1xuICAgICAgICBuZWVkRGVsZXRpb25DaGVjayA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduU2xvdHMoc2xvdHMsIGNoaWxkcmVuLCBvcHRpbWl6ZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZWVkRGVsZXRpb25DaGVjayA9ICFjaGlsZHJlbi4kc3RhYmxlO1xuICAgICAgbm9ybWFsaXplT2JqZWN0U2xvdHMoY2hpbGRyZW4sIHNsb3RzKTtcbiAgICB9XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBub3JtYWxpemVWTm9kZVNsb3RzKGluc3RhbmNlLCBjaGlsZHJlbik7XG4gICAgZGVsZXRpb25Db21wYXJpc29uVGFyZ2V0ID0geyBkZWZhdWx0OiAxIH07XG4gIH1cbiAgaWYgKG5lZWREZWxldGlvbkNoZWNrKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2xvdHMpIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbEtleShrZXkpICYmIGRlbGV0aW9uQ29tcGFyaXNvblRhcmdldFtrZXldID09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHNsb3RzW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5sZXQgc3VwcG9ydGVkO1xubGV0IHBlcmY7XG5mdW5jdGlvbiBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIHR5cGUpIHtcbiAgaWYgKGluc3RhbmNlLmFwcENvbnRleHQuY29uZmlnLnBlcmZvcm1hbmNlICYmIGlzU3VwcG9ydGVkKCkpIHtcbiAgICBwZXJmLm1hcmsoYHZ1ZS0ke3R5cGV9LSR7aW5zdGFuY2UudWlkfWApO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZlN0YXJ0KGluc3RhbmNlLCB0eXBlLCBpc1N1cHBvcnRlZCgpID8gcGVyZi5ub3coKSA6IERhdGUubm93KCkpO1xuICB9XG59XG5mdW5jdGlvbiBlbmRNZWFzdXJlKGluc3RhbmNlLCB0eXBlKSB7XG4gIGlmIChpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZy5wZXJmb3JtYW5jZSAmJiBpc1N1cHBvcnRlZCgpKSB7XG4gICAgY29uc3Qgc3RhcnRUYWcgPSBgdnVlLSR7dHlwZX0tJHtpbnN0YW5jZS51aWR9YDtcbiAgICBjb25zdCBlbmRUYWcgPSBzdGFydFRhZyArIGA6ZW5kYDtcbiAgICBwZXJmLm1hcmsoZW5kVGFnKTtcbiAgICBwZXJmLm1lYXN1cmUoXG4gICAgICBgPCR7Zm9ybWF0Q29tcG9uZW50TmFtZShpbnN0YW5jZSwgaW5zdGFuY2UudHlwZSl9PiAke3R5cGV9YCxcbiAgICAgIHN0YXJ0VGFnLFxuICAgICAgZW5kVGFnXG4gICAgKTtcbiAgICBwZXJmLmNsZWFyTWFya3Moc3RhcnRUYWcpO1xuICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzUGVyZkVuZChpbnN0YW5jZSwgdHlwZSwgaXNTdXBwb3J0ZWQoKSA/IHBlcmYubm93KCkgOiBEYXRlLm5vdygpKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNTdXBwb3J0ZWQoKSB7XG4gIGlmIChzdXBwb3J0ZWQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiBzdXBwb3J0ZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LnBlcmZvcm1hbmNlKSB7XG4gICAgc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICBwZXJmID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICB9IGVsc2Uge1xuICAgIHN1cHBvcnRlZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiBzdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIGluaXRGZWF0dXJlRmxhZ3MoKSB7XG4gIGNvbnN0IG5lZWRXYXJuID0gW107XG4gIGlmICh0eXBlb2YgX19WVUVfT1BUSU9OU19BUElfXyAhPT0gXCJib29sZWFuXCIpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIG5lZWRXYXJuLnB1c2goYF9fVlVFX09QVElPTlNfQVBJX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfT1BUSU9OU19BUElfXyA9IHRydWU7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0RFVlRPT0xTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0RFVlRPT0xTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9ERVZUT09MU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX18gIT09IFwiYm9vbGVhblwiKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBuZWVkV2Fybi5wdXNoKGBfX1ZVRV9QUk9EX0hZRFJBVElPTl9NSVNNQVRDSF9ERVRBSUxTX19gKTtcbiAgICBnZXRHbG9iYWxUaGlzKCkuX19WVUVfUFJPRF9IWURSQVRJT05fTUlTTUFUQ0hfREVUQUlMU19fID0gZmFsc2U7XG4gIH1cbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbmVlZFdhcm4ubGVuZ3RoKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZWVkV2Fybi5sZW5ndGggPiAxO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBGZWF0dXJlIGZsYWcke211bHRpID8gYHNgIDogYGB9ICR7bmVlZFdhcm4uam9pbihcIiwgXCIpfSAke211bHRpID8gYGFyZWAgOiBgaXNgfSBub3QgZXhwbGljaXRseSBkZWZpbmVkLiBZb3UgYXJlIHJ1bm5pbmcgdGhlIGVzbS1idW5kbGVyIGJ1aWxkIG9mIFZ1ZSwgd2hpY2ggZXhwZWN0cyB0aGVzZSBjb21waWxlLXRpbWUgZmVhdHVyZSBmbGFncyB0byBiZSBnbG9iYWxseSBpbmplY3RlZCB2aWEgdGhlIGJ1bmRsZXIgY29uZmlnIGluIG9yZGVyIHRvIGdldCBiZXR0ZXIgdHJlZS1zaGFraW5nIGluIHRoZSBwcm9kdWN0aW9uIGJ1bmRsZS5cblxuRm9yIG1vcmUgZGV0YWlscywgc2VlIGh0dHBzOi8vbGluay52dWVqcy5vcmcvZmVhdHVyZS1mbGFncy5gXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QgPSBxdWV1ZUVmZmVjdFdpdGhTdXNwZW5zZSA7XG5mdW5jdGlvbiBjcmVhdGVSZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucyk7XG59XG5mdW5jdGlvbiBjcmVhdGVIeWRyYXRpb25SZW5kZXJlcihvcHRpb25zKSB7XG4gIHJldHVybiBiYXNlQ3JlYXRlUmVuZGVyZXIob3B0aW9ucywgY3JlYXRlSHlkcmF0aW9uRnVuY3Rpb25zKTtcbn1cbmZ1bmN0aW9uIGJhc2VDcmVhdGVSZW5kZXJlcihvcHRpb25zLCBjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAge1xuICAgIGluaXRGZWF0dXJlRmxhZ3MoKTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIHRhcmdldC5fX1ZVRV9fID0gdHJ1ZTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgc2V0RGV2dG9vbHNIb29rJDEodGFyZ2V0Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sIHRhcmdldCk7XG4gIH1cbiAgY29uc3Qge1xuICAgIGluc2VydDogaG9zdEluc2VydCxcbiAgICByZW1vdmU6IGhvc3RSZW1vdmUsXG4gICAgcGF0Y2hQcm9wOiBob3N0UGF0Y2hQcm9wLFxuICAgIGNyZWF0ZUVsZW1lbnQ6IGhvc3RDcmVhdGVFbGVtZW50LFxuICAgIGNyZWF0ZVRleHQ6IGhvc3RDcmVhdGVUZXh0LFxuICAgIGNyZWF0ZUNvbW1lbnQ6IGhvc3RDcmVhdGVDb21tZW50LFxuICAgIHNldFRleHQ6IGhvc3RTZXRUZXh0LFxuICAgIHNldEVsZW1lbnRUZXh0OiBob3N0U2V0RWxlbWVudFRleHQsXG4gICAgcGFyZW50Tm9kZTogaG9zdFBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IGhvc3ROZXh0U2libGluZyxcbiAgICBzZXRTY29wZUlkOiBob3N0U2V0U2NvcGVJZCA9IE5PT1AsXG4gICAgaW5zZXJ0U3RhdGljQ29udGVudDogaG9zdEluc2VydFN0YXRpY0NvbnRlbnRcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHBhdGNoID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IgPSBudWxsLCBwYXJlbnRDb21wb25lbnQgPSBudWxsLCBwYXJlbnRTdXNwZW5zZSA9IG51bGwsIG5hbWVzcGFjZSA9IHZvaWQgMCwgc2xvdFNjb3BlSWRzID0gbnVsbCwgb3B0aW1pemVkID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nID8gZmFsc2UgOiAhIW4yLmR5bmFtaWNDaGlsZHJlbikgPT4ge1xuICAgIGlmIChuMSA9PT0gbjIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG4xICYmICFpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgYW5jaG9yID0gZ2V0TmV4dEhvc3ROb2RlKG4xKTtcbiAgICAgIHVubW91bnQobjEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgbjEgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobjIucGF0Y2hGbGFnID09PSAtMikge1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBuMi5keW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHR5cGUsIHJlZiwgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVGV4dDpcbiAgICAgICAgcHJvY2Vzc1RleHQobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb21tZW50OlxuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobjEsIG4yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGF0aWM6XG4gICAgICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICAgICAgbW91bnRTdGF0aWNOb2RlKG4yLCBjb250YWluZXIsIGFuY2hvciwgbmFtZXNwYWNlKTtcbiAgICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcGF0Y2hTdGF0aWNOb2RlKG4xLCBuMiwgY29udGFpbmVyLCBuYW1lc3BhY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgcHJvY2Vzc0ZyYWdtZW50KFxuICAgICAgICAgIG4xLFxuICAgICAgICAgIG4yLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDEpIHtcbiAgICAgICAgICBwcm9jZXNzRWxlbWVudChcbiAgICAgICAgICAgIG4xLFxuICAgICAgICAgICAgbjIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2hhcGVGbGFnICYgNikge1xuICAgICAgICAgIHByb2Nlc3NDb21wb25lbnQoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgICAgdHlwZS5wcm9jZXNzKFxuICAgICAgICAgICAgbjEsXG4gICAgICAgICAgICBuMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICAgICAgaW50ZXJuYWxzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgICAgICB0eXBlLnByb2Nlc3MoXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWQsXG4gICAgICAgICAgICBpbnRlcm5hbHNcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICB3YXJuJDEoXCJJbnZhbGlkIFZOb2RlIHR5cGU6XCIsIHR5cGUsIGAoJHt0eXBlb2YgdHlwZX0pYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsICYmIHBhcmVudENvbXBvbmVudCkge1xuICAgICAgc2V0UmVmKHJlZiwgbjEgJiYgbjEucmVmLCBwYXJlbnRTdXNwZW5zZSwgbjIgfHwgbjEsICFuMik7XG4gICAgfVxuICB9O1xuICBjb25zdCBwcm9jZXNzVGV4dCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yKSA9PiB7XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoXG4gICAgICAgIG4yLmVsID0gaG9zdENyZWF0ZVRleHQobjIuY2hpbGRyZW4pLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvclxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZWwgPSBuMi5lbCA9IG4xLmVsO1xuICAgICAgaWYgKG4yLmNoaWxkcmVuICE9PSBuMS5jaGlsZHJlbikge1xuICAgICAgICBob3N0U2V0VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbW1lbnROb2RlID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IpID0+IHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgaG9zdEluc2VydChcbiAgICAgICAgbjIuZWwgPSBob3N0Q3JlYXRlQ29tbWVudChuMi5jaGlsZHJlbiB8fCBcIlwiKSxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3JcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudFN0YXRpY05vZGUgPSAobjIsIGNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UpID0+IHtcbiAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgIG4yLmNoaWxkcmVuLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYW5jaG9yLFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgbjIuZWwsXG4gICAgICBuMi5hbmNob3JcbiAgICApO1xuICB9O1xuICBjb25zdCBwYXRjaFN0YXRpY05vZGUgPSAobjEsIG4yLCBjb250YWluZXIsIG5hbWVzcGFjZSkgPT4ge1xuICAgIGlmIChuMi5jaGlsZHJlbiAhPT0gbjEuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGhvc3ROZXh0U2libGluZyhuMS5hbmNob3IpO1xuICAgICAgcmVtb3ZlU3RhdGljTm9kZShuMSk7XG4gICAgICBbbjIuZWwsIG4yLmFuY2hvcl0gPSBob3N0SW5zZXJ0U3RhdGljQ29udGVudChcbiAgICAgICAgbjIuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBuYW1lc3BhY2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG4yLmVsID0gbjEuZWw7XG4gICAgICBuMi5hbmNob3IgPSBuMS5hbmNob3I7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3ZlU3RhdGljTm9kZSA9ICh7IGVsLCBhbmNob3IgfSwgY29udGFpbmVyLCBuZXh0U2libGluZykgPT4ge1xuICAgIGxldCBuZXh0O1xuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gYW5jaG9yKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGVsKTtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgbmV4dFNpYmxpbmcpO1xuICAgICAgZWwgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0SW5zZXJ0KGFuY2hvciwgY29udGFpbmVyLCBuZXh0U2libGluZyk7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVN0YXRpY05vZGUgPSAoeyBlbCwgYW5jaG9yIH0pID0+IHtcbiAgICBsZXQgbmV4dDtcbiAgICB3aGlsZSAoZWwgJiYgZWwgIT09IGFuY2hvcikge1xuICAgICAgbmV4dCA9IGhvc3ROZXh0U2libGluZyhlbCk7XG4gICAgICBob3N0UmVtb3ZlKGVsKTtcbiAgICAgIGVsID0gbmV4dDtcbiAgICB9XG4gICAgaG9zdFJlbW92ZShhbmNob3IpO1xuICB9O1xuICBjb25zdCBwcm9jZXNzRWxlbWVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgaWYgKG4yLnR5cGUgPT09IFwic3ZnXCIpIHtcbiAgICAgIG5hbWVzcGFjZSA9IFwic3ZnXCI7XG4gICAgfSBlbHNlIGlmIChuMi50eXBlID09PSBcIm1hdGhcIikge1xuICAgICAgbmFtZXNwYWNlID0gXCJtYXRobWxcIjtcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIG1vdW50RWxlbWVudChcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXRjaEVsZW1lbnQoXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdW50RWxlbWVudCA9ICh2bm9kZSwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBsZXQgZWw7XG4gICAgbGV0IHZub2RlSG9vaztcbiAgICBjb25zdCB7IHByb3BzLCBzaGFwZUZsYWcsIHRyYW5zaXRpb24sIGRpcnMgfSA9IHZub2RlO1xuICAgIGVsID0gdm5vZGUuZWwgPSBob3N0Q3JlYXRlRWxlbWVudChcbiAgICAgIHZub2RlLnR5cGUsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgICBwcm9wcyAmJiBwcm9wcy5pcyxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaG9zdFNldEVsZW1lbnRUZXh0KGVsLCB2bm9kZS5jaGlsZHJlbik7XG4gICAgfSBlbHNlIGlmIChzaGFwZUZsYWcgJiAxNikge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2Uodm5vZGUsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZGlycykge1xuICAgICAgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcImNyZWF0ZWRcIik7XG4gICAgfVxuICAgIHNldFNjb3BlSWQoZWwsIHZub2RlLCB2bm9kZS5zY29wZUlkLCBzbG90U2NvcGVJZHMsIHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoa2V5ICE9PSBcInZhbHVlXCIgJiYgIWlzUmVzZXJ2ZWRQcm9wKGtleSkpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBrZXksIG51bGwsIHByb3BzW2tleV0sIG5hbWVzcGFjZSwgcGFyZW50Q29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFwidmFsdWVcIiBpbiBwcm9wcykge1xuICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInZhbHVlXCIsIG51bGwsIHByb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgICAgaWYgKHZub2RlSG9vayA9IHByb3BzLm9uVm5vZGVCZWZvcmVNb3VudCkge1xuICAgICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICBkZWYoZWwsIFwiX192bm9kZVwiLCB2bm9kZSwgdHJ1ZSk7XG4gICAgICBkZWYoZWwsIFwiX192dWVQYXJlbnRDb21wb25lbnRcIiwgcGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKGRpcnMpIHtcbiAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVNb3VudFwiKTtcbiAgICB9XG4gICAgY29uc3QgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgPSBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbik7XG4gICAgaWYgKG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzKSB7XG4gICAgICB0cmFuc2l0aW9uLmJlZm9yZUVudGVyKGVsKTtcbiAgICB9XG4gICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIGlmICgodm5vZGVIb29rID0gcHJvcHMgJiYgcHJvcHMub25Wbm9kZU1vdW50ZWQpIHx8IG5lZWRDYWxsVHJhbnNpdGlvbkhvb2tzIHx8IGRpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgbmVlZENhbGxUcmFuc2l0aW9uSG9va3MgJiYgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICAgIGRpcnMgJiYgaW52b2tlRGlyZWN0aXZlSG9vayh2bm9kZSwgbnVsbCwgcGFyZW50Q29tcG9uZW50LCBcIm1vdW50ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTY29wZUlkID0gKGVsLCB2bm9kZSwgc2NvcGVJZCwgc2xvdFNjb3BlSWRzLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgICBpZiAoc2NvcGVJZCkge1xuICAgICAgaG9zdFNldFNjb3BlSWQoZWwsIHNjb3BlSWQpO1xuICAgIH1cbiAgICBpZiAoc2xvdFNjb3BlSWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RTY29wZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBob3N0U2V0U2NvcGVJZChlbCwgc2xvdFNjb3BlSWRzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhcmVudENvbXBvbmVudCkge1xuICAgICAgbGV0IHN1YlRyZWUgPSBwYXJlbnRDb21wb25lbnQuc3ViVHJlZTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN1YlRyZWUucGF0Y2hGbGFnID4gMCAmJiBzdWJUcmVlLnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgc3ViVHJlZSA9IGZpbHRlclNpbmdsZVJvb3Qoc3ViVHJlZS5jaGlsZHJlbikgfHwgc3ViVHJlZTtcbiAgICAgIH1cbiAgICAgIGlmICh2bm9kZSA9PT0gc3ViVHJlZSB8fCBpc1N1c3BlbnNlKHN1YlRyZWUudHlwZSkgJiYgKHN1YlRyZWUuc3NDb250ZW50ID09PSB2bm9kZSB8fCBzdWJUcmVlLnNzRmFsbGJhY2sgPT09IHZub2RlKSkge1xuICAgICAgICBjb25zdCBwYXJlbnRWTm9kZSA9IHBhcmVudENvbXBvbmVudC52bm9kZTtcbiAgICAgICAgc2V0U2NvcGVJZChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBwYXJlbnRWTm9kZSxcbiAgICAgICAgICBwYXJlbnRWTm9kZS5zY29wZUlkLFxuICAgICAgICAgIHBhcmVudFZOb2RlLnNsb3RTY29wZUlkcyxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQucGFyZW50XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENoaWxkcmVuID0gKGNoaWxkcmVuLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgc3RhcnQgPSAwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV0gPSBvcHRpbWl6ZWQgPyBjbG9uZUlmTW91bnRlZChjaGlsZHJlbltpXSkgOiBub3JtYWxpemVWTm9kZShjaGlsZHJlbltpXSk7XG4gICAgICBwYXRjaChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcGF0Y2hFbGVtZW50ID0gKG4xLCBuMiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGVsID0gbjIuZWwgPSBuMS5lbDtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGVsLl9fdm5vZGUgPSBuMjtcbiAgICB9XG4gICAgbGV0IHsgcGF0Y2hGbGFnLCBkeW5hbWljQ2hpbGRyZW4sIGRpcnMgfSA9IG4yO1xuICAgIHBhdGNoRmxhZyB8PSBuMS5wYXRjaEZsYWcgJiAxNjtcbiAgICBjb25zdCBvbGRQcm9wcyA9IG4xLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBjb25zdCBuZXdQcm9wcyA9IG4yLnByb3BzIHx8IEVNUFRZX09CSjtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIHBhcmVudENvbXBvbmVudCAmJiB0b2dnbGVSZWN1cnNlKHBhcmVudENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGlmICh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSB7XG4gICAgICBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIG4yLCBuMSk7XG4gICAgfVxuICAgIGlmIChkaXJzKSB7XG4gICAgICBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcImJlZm9yZVVwZGF0ZVwiKTtcbiAgICB9XG4gICAgcGFyZW50Q29tcG9uZW50ICYmIHRvZ2dsZVJlY3Vyc2UocGFyZW50Q29tcG9uZW50LCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc0htclVwZGF0aW5nKSB7XG4gICAgICBwYXRjaEZsYWcgPSAwO1xuICAgICAgb3B0aW1pemVkID0gZmFsc2U7XG4gICAgICBkeW5hbWljQ2hpbGRyZW4gPSBudWxsO1xuICAgIH1cbiAgICBpZiAob2xkUHJvcHMuaW5uZXJIVE1MICYmIG5ld1Byb3BzLmlubmVySFRNTCA9PSBudWxsIHx8IG9sZFByb3BzLnRleHRDb250ZW50ICYmIG5ld1Byb3BzLnRleHRDb250ZW50ID09IG51bGwpIHtcbiAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgXCJcIik7XG4gICAgfVxuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIHBhdGNoQmxvY2tDaGlsZHJlbihcbiAgICAgICAgbjEuZHluYW1pY0NoaWxkcmVuLFxuICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgIGVsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICByZXNvbHZlQ2hpbGRyZW5OYW1lc3BhY2UobjIsIG5hbWVzcGFjZSksXG4gICAgICAgIHNsb3RTY29wZUlkc1xuICAgICAgKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4objEsIG4yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFvcHRpbWl6ZWQpIHtcbiAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgIG4xLFxuICAgICAgICBuMixcbiAgICAgICAgZWwsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZShuMiwgbmFtZXNwYWNlKSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGNoRmxhZyA+IDApIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwYXRjaEZsYWcgJiAyKSB7XG4gICAgICAgICAgaWYgKG9sZFByb3BzLmNsYXNzICE9PSBuZXdQcm9wcy5jbGFzcykge1xuICAgICAgICAgICAgaG9zdFBhdGNoUHJvcChlbCwgXCJjbGFzc1wiLCBudWxsLCBuZXdQcm9wcy5jbGFzcywgbmFtZXNwYWNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoRmxhZyAmIDQpIHtcbiAgICAgICAgICBob3N0UGF0Y2hQcm9wKGVsLCBcInN0eWxlXCIsIG9sZFByb3BzLnN0eWxlLCBuZXdQcm9wcy5zdHlsZSwgbmFtZXNwYWNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgICAgIGNvbnN0IHByb3BzVG9VcGRhdGUgPSBuMi5keW5hbWljUHJvcHM7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wc1RvVXBkYXRlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwcm9wc1RvVXBkYXRlW2ldO1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IG9sZFByb3BzW2tleV07XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gbmV3UHJvcHNba2V5XTtcbiAgICAgICAgICAgIGlmIChuZXh0ICE9PSBwcmV2IHx8IGtleSA9PT0gXCJ2YWx1ZVwiKSB7XG4gICAgICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEpIHtcbiAgICAgICAgaWYgKG4xLmNoaWxkcmVuICE9PSBuMi5jaGlsZHJlbikge1xuICAgICAgICAgIGhvc3RTZXRFbGVtZW50VGV4dChlbCwgbjIuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghb3B0aW1pemVkICYmIGR5bmFtaWNDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICBwYXRjaFByb3BzKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKTtcbiAgICB9XG4gICAgaWYgKCh2bm9kZUhvb2sgPSBuZXdQcm9wcy5vblZub2RlVXBkYXRlZCkgfHwgZGlycykge1xuICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHtcbiAgICAgICAgdm5vZGVIb29rICYmIGludm9rZVZOb2RlSG9vayh2bm9kZUhvb2ssIHBhcmVudENvbXBvbmVudCwgbjIsIG4xKTtcbiAgICAgICAgZGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKG4yLCBuMSwgcGFyZW50Q29tcG9uZW50LCBcInVwZGF0ZWRcIik7XG4gICAgICB9LCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEJsb2NrQ2hpbGRyZW4gPSAob2xkQ2hpbGRyZW4sIG5ld0NoaWxkcmVuLCBmYWxsYmFja0NvbnRhaW5lciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMpID0+IHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvbGRWTm9kZSA9IG9sZENoaWxkcmVuW2ldO1xuICAgICAgY29uc3QgbmV3Vk5vZGUgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IChcbiAgICAgICAgLy8gb2xkVk5vZGUgbWF5IGJlIGFuIGVycm9yZWQgYXN5bmMgc2V0dXAoKSBjb21wb25lbnQgaW5zaWRlIFN1c3BlbnNlXG4gICAgICAgIC8vIHdoaWNoIHdpbGwgbm90IGhhdmUgYSBtb3VudGVkIGVsZW1lbnRcbiAgICAgICAgb2xkVk5vZGUuZWwgJiYgLy8gLSBJbiB0aGUgY2FzZSBvZiBhIEZyYWdtZW50LCB3ZSBuZWVkIHRvIHByb3ZpZGUgdGhlIGFjdHVhbCBwYXJlbnRcbiAgICAgICAgLy8gb2YgdGhlIEZyYWdtZW50IGl0c2VsZiBzbyBpdCBjYW4gbW92ZSBpdHMgY2hpbGRyZW4uXG4gICAgICAgIChvbGRWTm9kZS50eXBlID09PSBGcmFnbWVudCB8fCAvLyAtIEluIHRoZSBjYXNlIG9mIGRpZmZlcmVudCBub2RlcywgdGhlcmUgaXMgZ29pbmcgdG8gYmUgYSByZXBsYWNlbWVudFxuICAgICAgICAvLyB3aGljaCBhbHNvIHJlcXVpcmVzIHRoZSBjb3JyZWN0IHBhcmVudCBjb250YWluZXJcbiAgICAgICAgIWlzU2FtZVZOb2RlVHlwZShvbGRWTm9kZSwgbmV3Vk5vZGUpIHx8IC8vIC0gSW4gdGhlIGNhc2Ugb2YgYSBjb21wb25lbnQsIGl0IGNvdWxkIGNvbnRhaW4gYW55dGhpbmcuXG4gICAgICAgIG9sZFZOb2RlLnNoYXBlRmxhZyAmICg2IHwgNjQpKSA/IGhvc3RQYXJlbnROb2RlKG9sZFZOb2RlLmVsKSA6IChcbiAgICAgICAgICAvLyBJbiBvdGhlciBjYXNlcywgdGhlIHBhcmVudCBjb250YWluZXIgaXMgbm90IGFjdHVhbGx5IHVzZWQgc28gd2VcbiAgICAgICAgICAvLyBqdXN0IHBhc3MgdGhlIGJsb2NrIGVsZW1lbnQgaGVyZSB0byBhdm9pZCBhIERPTSBwYXJlbnROb2RlIGNhbGwuXG4gICAgICAgICAgZmFsbGJhY2tDb250YWluZXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHBhdGNoKFxuICAgICAgICBvbGRWTm9kZSxcbiAgICAgICAgbmV3Vk5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaFByb3BzID0gKGVsLCBvbGRQcm9wcywgbmV3UHJvcHMsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlKSA9PiB7XG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcykge1xuICAgICAgaWYgKG9sZFByb3BzICE9PSBFTVBUWV9PQkopIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2xkUHJvcHMpIHtcbiAgICAgICAgICBpZiAoIWlzUmVzZXJ2ZWRQcm9wKGtleSkgJiYgIShrZXkgaW4gbmV3UHJvcHMpKSB7XG4gICAgICAgICAgICBob3N0UGF0Y2hQcm9wKFxuICAgICAgICAgICAgICBlbCxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICBvbGRQcm9wc1trZXldLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIHBhcmVudENvbXBvbmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGlmIChpc1Jlc2VydmVkUHJvcChrZXkpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5ld1Byb3BzW2tleV07XG4gICAgICAgIGNvbnN0IHByZXYgPSBvbGRQcm9wc1trZXldO1xuICAgICAgICBpZiAobmV4dCAhPT0gcHJldiAmJiBrZXkgIT09IFwidmFsdWVcIikge1xuICAgICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIGtleSwgcHJldiwgbmV4dCwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIG5ld1Byb3BzKSB7XG4gICAgICAgIGhvc3RQYXRjaFByb3AoZWwsIFwidmFsdWVcIiwgb2xkUHJvcHMudmFsdWUsIG5ld1Byb3BzLnZhbHVlLCBuYW1lc3BhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0ZyYWdtZW50ID0gKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBmcmFnbWVudFN0YXJ0QW5jaG9yID0gbjIuZWwgPSBuMSA/IG4xLmVsIDogaG9zdENyZWF0ZVRleHQoXCJcIik7XG4gICAgY29uc3QgZnJhZ21lbnRFbmRBbmNob3IgPSBuMi5hbmNob3IgPSBuMSA/IG4xLmFuY2hvciA6IGhvc3RDcmVhdGVUZXh0KFwiXCIpO1xuICAgIGxldCB7IHBhdGNoRmxhZywgZHluYW1pY0NoaWxkcmVuLCBzbG90U2NvcGVJZHM6IGZyYWdtZW50U2xvdFNjb3BlSWRzIH0gPSBuMjtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAvLyAjNTUyMyBkZXYgcm9vdCBmcmFnbWVudCBtYXkgaW5oZXJpdCBkaXJlY3RpdmVzXG4gICAgKGlzSG1yVXBkYXRpbmcgfHwgcGF0Y2hGbGFnICYgMjA0OCkpIHtcbiAgICAgIHBhdGNoRmxhZyA9IDA7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICAgIGR5bmFtaWNDaGlsZHJlbiA9IG51bGw7XG4gICAgfVxuICAgIGlmIChmcmFnbWVudFNsb3RTY29wZUlkcykge1xuICAgICAgc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzID8gc2xvdFNjb3BlSWRzLmNvbmNhdChmcmFnbWVudFNsb3RTY29wZUlkcykgOiBmcmFnbWVudFNsb3RTY29wZUlkcztcbiAgICB9XG4gICAgaWYgKG4xID09IG51bGwpIHtcbiAgICAgIGhvc3RJbnNlcnQoZnJhZ21lbnRTdGFydEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgaG9zdEluc2VydChmcmFnbWVudEVuZEFuY2hvciwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgLy8gIzEwMDA3XG4gICAgICAgIC8vIHN1Y2ggZnJhZ21lbnQgbGlrZSBgPD48Lz5gIHdpbGwgYmUgY29tcGlsZWQgaW50b1xuICAgICAgICAvLyBhIGZyYWdtZW50IHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIGNoaWxkcmVuLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UgZmFsbGJhY2sgdG8gYW4gZW1wdHkgYXJyYXlcbiAgICAgICAgbjIuY2hpbGRyZW4gfHwgW10sXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZnJhZ21lbnRFbmRBbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXRjaEZsYWcgPiAwICYmIHBhdGNoRmxhZyAmIDY0ICYmIGR5bmFtaWNDaGlsZHJlbiAmJiAvLyAjMjcxNSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgY291bGQndmUgYmVlbiBhIEJBSUxlZCBvbmUgYXMgYSByZXN1bHRcbiAgICAgIC8vIG9mIHJlbmRlclNsb3QoKSB3aXRoIG5vIHZhbGlkIGNoaWxkcmVuXG4gICAgICBuMS5keW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgICAgcGF0Y2hCbG9ja0NoaWxkcmVuKFxuICAgICAgICAgIG4xLmR5bmFtaWNDaGlsZHJlbixcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzXG4gICAgICAgICk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihuMSwgbjIpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vICMyMDgwIGlmIHRoZSBzdGFibGUgZnJhZ21lbnQgaGFzIGEga2V5LCBpdCdzIGEgPHRlbXBsYXRlIHYtZm9yPiB0aGF0IG1heVxuICAgICAgICAgIC8vICBnZXQgbW92ZWQgYXJvdW5kLiBNYWtlIHN1cmUgYWxsIHJvb3QgbGV2ZWwgdm5vZGVzIGluaGVyaXQgZWwuXG4gICAgICAgICAgLy8gIzIxMzQgb3IgaWYgaXQncyBhIGNvbXBvbmVudCByb290LCBpdCBtYXkgYWxzbyBnZXQgbW92ZWQgYXJvdW5kXG4gICAgICAgICAgLy8gYXMgdGhlIGNvbXBvbmVudCBpcyBiZWluZyBtb3ZlZC5cbiAgICAgICAgICBuMi5rZXkgIT0gbnVsbCB8fCBwYXJlbnRDb21wb25lbnQgJiYgbjIgPT09IHBhcmVudENvbXBvbmVudC5zdWJUcmVlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYXZlcnNlU3RhdGljQ2hpbGRyZW4oXG4gICAgICAgICAgICBuMSxcbiAgICAgICAgICAgIG4yLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgLyogc2hhbGxvdyAqL1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoQ2hpbGRyZW4oXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGZyYWdtZW50RW5kQW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudCA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkKSA9PiB7XG4gICAgbjIuc2xvdFNjb3BlSWRzID0gc2xvdFNjb3BlSWRzO1xuICAgIGlmIChuMSA9PSBudWxsKSB7XG4gICAgICBpZiAobjIuc2hhcGVGbGFnICYgNTEyKSB7XG4gICAgICAgIHBhcmVudENvbXBvbmVudC5jdHguYWN0aXZhdGUoXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb3VudENvbXBvbmVudChcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwZGF0ZUNvbXBvbmVudChuMSwgbjIsIG9wdGltaXplZCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudENvbXBvbmVudCA9IChpbml0aWFsVk5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIG9wdGltaXplZCkgPT4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gKGluaXRpYWxWTm9kZS5jb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnRJbnN0YW5jZShcbiAgICAgIGluaXRpYWxWTm9kZSxcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgKSk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaW5zdGFuY2UudHlwZS5fX2htcklkKSB7XG4gICAgICByZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwdXNoV2FybmluZ0NvbnRleHQoaW5pdGlhbFZOb2RlKTtcbiAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICAgIGlmIChpc0tlZXBBbGl2ZShpbml0aWFsVk5vZGUpKSB7XG4gICAgICBpbnN0YW5jZS5jdHgucmVuZGVyZXIgPSBpbnRlcm5hbHM7XG4gICAgfVxuICAgIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYGluaXRgKTtcbiAgICAgIH1cbiAgICAgIHNldHVwQ29tcG9uZW50KGluc3RhbmNlLCBmYWxzZSwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBpbml0YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5hc3luY0RlcCkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgaXNIbXJVcGRhdGluZykgaW5pdGlhbFZOb2RlLmVsID0gbnVsbDtcbiAgICAgIHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnJlZ2lzdGVyRGVwKGluc3RhbmNlLCBzZXR1cFJlbmRlckVmZmVjdCwgb3B0aW1pemVkKTtcbiAgICAgIGlmICghaW5pdGlhbFZOb2RlLmVsKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gaW5zdGFuY2Uuc3ViVHJlZSA9IGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudE5vZGUobnVsbCwgcGxhY2Vob2xkZXIsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0dXBSZW5kZXJFZmZlY3QoXG4gICAgICAgIGluc3RhbmNlLFxuICAgICAgICBpbml0aWFsVk5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYG1vdW50YCk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1cGRhdGVDb21wb25lbnQgPSAobjEsIG4yLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG4yLmNvbXBvbmVudCA9IG4xLmNvbXBvbmVudDtcbiAgICBpZiAoc2hvdWxkVXBkYXRlQ29tcG9uZW50KG4xLCBuMiwgb3B0aW1pemVkKSkge1xuICAgICAgaWYgKGluc3RhbmNlLmFzeW5jRGVwICYmICFpbnN0YW5jZS5hc3luY1Jlc29sdmVkKSB7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG4yKTtcbiAgICAgICAgfVxuICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG4yLCBvcHRpbWl6ZWQpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHBvcFdhcm5pbmdDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdGFuY2UubmV4dCA9IG4yO1xuICAgICAgICBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgIGluc3RhbmNlLnZub2RlID0gbjI7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXR1cFJlbmRlckVmZmVjdCA9IChpbnN0YW5jZSwgaW5pdGlhbFZOb2RlLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgb3B0aW1pemVkKSA9PiB7XG4gICAgY29uc3QgY29tcG9uZW50VXBkYXRlRm4gPSAoKSA9PiB7XG4gICAgICBpZiAoIWluc3RhbmNlLmlzTW91bnRlZCkge1xuICAgICAgICBsZXQgdm5vZGVIb29rO1xuICAgICAgICBjb25zdCB7IGVsLCBwcm9wcyB9ID0gaW5pdGlhbFZOb2RlO1xuICAgICAgICBjb25zdCB7IGJtLCBtLCBwYXJlbnQsIHJvb3QsIHR5cGUgfSA9IGluc3RhbmNlO1xuICAgICAgICBjb25zdCBpc0FzeW5jV3JhcHBlclZOb2RlID0gaXNBc3luY1dyYXBwZXIoaW5pdGlhbFZOb2RlKTtcbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgZmFsc2UpO1xuICAgICAgICBpZiAoYm0pIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhibSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FzeW5jV3JhcHBlclZOb2RlICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlQmVmb3JlTW91bnQpKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBpbml0aWFsVk5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIHRydWUpO1xuICAgICAgICBpZiAoZWwgJiYgaHlkcmF0ZU5vZGUpIHtcbiAgICAgICAgICBjb25zdCBoeWRyYXRlU3ViVHJlZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICAgIHN0YXJ0TWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5zdGFuY2Uuc3ViVHJlZSA9IHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpO1xuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgaHlkcmF0ZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHlkcmF0ZU5vZGUoXG4gICAgICAgICAgICAgIGVsLFxuICAgICAgICAgICAgICBpbnN0YW5jZS5zdWJUcmVlLFxuICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgaHlkcmF0ZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGlzQXN5bmNXcmFwcGVyVk5vZGUgJiYgdHlwZS5fX2FzeW5jSHlkcmF0ZSkge1xuICAgICAgICAgICAgdHlwZS5fX2FzeW5jSHlkcmF0ZShcbiAgICAgICAgICAgICAgZWwsXG4gICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICBoeWRyYXRlU3ViVHJlZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHlkcmF0ZVN1YlRyZWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJvb3QuY2UpIHtcbiAgICAgICAgICAgIHJvb3QuY2UuX2luamVjdENoaWxkU3R5bGUodHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGByZW5kZXJgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3ViVHJlZSA9IGluc3RhbmNlLnN1YlRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgZW5kTWVhc3VyZShpbnN0YW5jZSwgYHJlbmRlcmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgc3ViVHJlZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW5pdGlhbFZOb2RlLmVsID0gc3ViVHJlZS5lbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChtLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0FzeW5jV3JhcHBlclZOb2RlICYmICh2bm9kZUhvb2sgPSBwcm9wcyAmJiBwcm9wcy5vblZub2RlTW91bnRlZCkpIHtcbiAgICAgICAgICBjb25zdCBzY29wZWRJbml0aWFsVk5vZGUgPSBpbml0aWFsVk5vZGU7XG4gICAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4gaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBzY29wZWRJbml0aWFsVk5vZGUpLFxuICAgICAgICAgICAgcGFyZW50U3VzcGVuc2VcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbml0aWFsVk5vZGUuc2hhcGVGbGFnICYgMjU2IHx8IHBhcmVudCAmJiBpc0FzeW5jV3JhcHBlcihwYXJlbnQudm5vZGUpICYmIHBhcmVudC52bm9kZS5zaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgICAgICBpbnN0YW5jZS5hICYmIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChpbnN0YW5jZS5hLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5zdGFuY2UuaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgfHwgX19WVUVfUFJPRF9ERVZUT09MU19fKSB7XG4gICAgICAgICAgZGV2dG9vbHNDb21wb25lbnRBZGRlZChpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbFZOb2RlID0gY29udGFpbmVyID0gYW5jaG9yID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB7IG5leHQsIGJ1LCB1LCBwYXJlbnQsIHZub2RlIH0gPSBpbnN0YW5jZTtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IG5vbkh5ZHJhdGVkQXN5bmNSb290ID0gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpO1xuICAgICAgICAgIGlmIChub25IeWRyYXRlZEFzeW5jUm9vdCkge1xuICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgbmV4dC5lbCA9IHZub2RlLmVsO1xuICAgICAgICAgICAgICB1cGRhdGVDb21wb25lbnRQcmVSZW5kZXIoaW5zdGFuY2UsIG5leHQsIG9wdGltaXplZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub25IeWRyYXRlZEFzeW5jUm9vdC5hc3luY0RlcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5pc1VubW91bnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudFVwZGF0ZUZuKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgb3JpZ2luTmV4dCA9IG5leHQ7XG4gICAgICAgIGxldCB2bm9kZUhvb2s7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcHVzaFdhcm5pbmdDb250ZXh0KG5leHQgfHwgaW5zdGFuY2Uudm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZVJlY3Vyc2UoaW5zdGFuY2UsIGZhbHNlKTtcbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICBuZXh0LmVsID0gdm5vZGUuZWw7XG4gICAgICAgICAgdXBkYXRlQ29tcG9uZW50UHJlUmVuZGVyKGluc3RhbmNlLCBuZXh0LCBvcHRpbWl6ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQgPSB2bm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnUpIHtcbiAgICAgICAgICBpbnZva2VBcnJheUZucyhidSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZub2RlSG9vayA9IG5leHQucHJvcHMgJiYgbmV4dC5wcm9wcy5vblZub2RlQmVmb3JlVXBkYXRlKSB7XG4gICAgICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50LCBuZXh0LCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlUmVjdXJzZShpbnN0YW5jZSwgdHJ1ZSk7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dFRyZWUgPSByZW5kZXJDb21wb25lbnRSb290KGluc3RhbmNlKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcmVuZGVyYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldlRyZWUgPSBpbnN0YW5jZS5zdWJUcmVlO1xuICAgICAgICBpbnN0YW5jZS5zdWJUcmVlID0gbmV4dFRyZWU7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgc3RhcnRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXRjaChcbiAgICAgICAgICBwcmV2VHJlZSxcbiAgICAgICAgICBuZXh0VHJlZSxcbiAgICAgICAgICAvLyBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBpZiBpdCdzIGluIGEgdGVsZXBvcnRcbiAgICAgICAgICBob3N0UGFyZW50Tm9kZShwcmV2VHJlZS5lbCksXG4gICAgICAgICAgLy8gYW5jaG9yIG1heSBoYXZlIGNoYW5nZWQgaWYgaXQncyBpbiBhIGZyYWdtZW50XG4gICAgICAgICAgZ2V0TmV4dEhvc3ROb2RlKHByZXZUcmVlKSxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBlbmRNZWFzdXJlKGluc3RhbmNlLCBgcGF0Y2hgKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0LmVsID0gbmV4dFRyZWUuZWw7XG4gICAgICAgIGlmIChvcmlnaW5OZXh0ID09PSBudWxsKSB7XG4gICAgICAgICAgdXBkYXRlSE9DSG9zdEVsKGluc3RhbmNlLCBuZXh0VHJlZS5lbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHUpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QodSwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2bm9kZUhvb2sgPSBuZXh0LnByb3BzICYmIG5leHQucHJvcHMub25Wbm9kZVVwZGF0ZWQpIHtcbiAgICAgICAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnQsIG5leHQsIHZub2RlKSxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgICAgICBkZXZ0b29sc0NvbXBvbmVudFVwZGF0ZWQoaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgICAgcG9wV2FybmluZ0NvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgaW5zdGFuY2Uuc2NvcGUub24oKTtcbiAgICBjb25zdCBlZmZlY3QgPSBpbnN0YW5jZS5lZmZlY3QgPSBuZXcgUmVhY3RpdmVFZmZlY3QoY29tcG9uZW50VXBkYXRlRm4pO1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGNvbnN0IHVwZGF0ZSA9IGluc3RhbmNlLnVwZGF0ZSA9IGVmZmVjdC5ydW4uYmluZChlZmZlY3QpO1xuICAgIGNvbnN0IGpvYiA9IGluc3RhbmNlLmpvYiA9IGVmZmVjdC5ydW5JZkRpcnR5LmJpbmQoZWZmZWN0KTtcbiAgICBqb2IuaSA9IGluc3RhbmNlO1xuICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICBlZmZlY3Quc2NoZWR1bGVyID0gKCkgPT4gcXVldWVKb2Ioam9iKTtcbiAgICB0b2dnbGVSZWN1cnNlKGluc3RhbmNlLCB0cnVlKTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZWZmZWN0Lm9uVHJhY2sgPSBpbnN0YW5jZS5ydGMgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRjLCBlKSA6IHZvaWQgMDtcbiAgICAgIGVmZmVjdC5vblRyaWdnZXIgPSBpbnN0YW5jZS5ydGcgPyAoZSkgPT4gaW52b2tlQXJyYXlGbnMoaW5zdGFuY2UucnRnLCBlKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgdXBkYXRlKCk7XG4gIH07XG4gIGNvbnN0IHVwZGF0ZUNvbXBvbmVudFByZVJlbmRlciA9IChpbnN0YW5jZSwgbmV4dFZOb2RlLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBuZXh0Vk5vZGUuY29tcG9uZW50ID0gaW5zdGFuY2U7XG4gICAgY29uc3QgcHJldlByb3BzID0gaW5zdGFuY2Uudm5vZGUucHJvcHM7XG4gICAgaW5zdGFuY2Uudm5vZGUgPSBuZXh0Vk5vZGU7XG4gICAgaW5zdGFuY2UubmV4dCA9IG51bGw7XG4gICAgdXBkYXRlUHJvcHMoaW5zdGFuY2UsIG5leHRWTm9kZS5wcm9wcywgcHJldlByb3BzLCBvcHRpbWl6ZWQpO1xuICAgIHVwZGF0ZVNsb3RzKGluc3RhbmNlLCBuZXh0Vk5vZGUuY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIGZsdXNoUHJlRmx1c2hDYnMoaW5zdGFuY2UpO1xuICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgfTtcbiAgY29uc3QgcGF0Y2hDaGlsZHJlbiA9IChuMSwgbjIsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBjMSA9IG4xICYmIG4xLmNoaWxkcmVuO1xuICAgIGNvbnN0IHByZXZTaGFwZUZsYWcgPSBuMSA/IG4xLnNoYXBlRmxhZyA6IDA7XG4gICAgY29uc3QgYzIgPSBuMi5jaGlsZHJlbjtcbiAgICBjb25zdCB7IHBhdGNoRmxhZywgc2hhcGVGbGFnIH0gPSBuMjtcbiAgICBpZiAocGF0Y2hGbGFnID4gMCkge1xuICAgICAgaWYgKHBhdGNoRmxhZyAmIDEyOCkge1xuICAgICAgICBwYXRjaEtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgYzEsXG4gICAgICAgICAgYzIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChwYXRjaEZsYWcgJiAyNTYpIHtcbiAgICAgICAgcGF0Y2hVbmtleWVkQ2hpbGRyZW4oXG4gICAgICAgICAgYzEsXG4gICAgICAgICAgYzIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2hhcGVGbGFnICYgOCkge1xuICAgICAgaWYgKHByZXZTaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGMyICE9PSBjMSkge1xuICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoY29udGFpbmVyLCBjMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcmV2U2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgaWYgKHNoYXBlRmxhZyAmIDE2KSB7XG4gICAgICAgICAgcGF0Y2hLZXllZENoaWxkcmVuKFxuICAgICAgICAgICAgYzEsXG4gICAgICAgICAgICBjMixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bm1vdW50Q2hpbGRyZW4oYzEsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJldlNoYXBlRmxhZyAmIDgpIHtcbiAgICAgICAgICBob3N0U2V0RWxlbWVudFRleHQoY29udGFpbmVyLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hhcGVGbGFnICYgMTYpIHtcbiAgICAgICAgICBtb3VudENoaWxkcmVuKFxuICAgICAgICAgICAgYzIsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHBhdGNoVW5rZXllZENoaWxkcmVuID0gKGMxLCBjMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIG5hbWVzcGFjZSwgc2xvdFNjb3BlSWRzLCBvcHRpbWl6ZWQpID0+IHtcbiAgICBjMSA9IGMxIHx8IEVNUFRZX0FSUjtcbiAgICBjMiA9IGMyIHx8IEVNUFRZX0FSUjtcbiAgICBjb25zdCBvbGRMZW5ndGggPSBjMS5sZW5ndGg7XG4gICAgY29uc3QgbmV3TGVuZ3RoID0gYzIubGVuZ3RoO1xuICAgIGNvbnN0IGNvbW1vbkxlbmd0aCA9IE1hdGgubWluKG9sZExlbmd0aCwgbmV3TGVuZ3RoKTtcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29tbW9uTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgcGF0Y2goXG4gICAgICAgIGMxW2ldLFxuICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgIG9wdGltaXplZFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9sZExlbmd0aCA+IG5ld0xlbmd0aCkge1xuICAgICAgdW5tb3VudENoaWxkcmVuKFxuICAgICAgICBjMSxcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGNvbW1vbkxlbmd0aFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW91bnRDaGlsZHJlbihcbiAgICAgICAgYzIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICBjb21tb25MZW5ndGhcbiAgICAgICk7XG4gICAgfVxuICB9O1xuICBjb25zdCBwYXRjaEtleWVkQ2hpbGRyZW4gPSAoYzEsIGMyLCBjb250YWluZXIsIHBhcmVudEFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBsMiA9IGMyLmxlbmd0aDtcbiAgICBsZXQgZTEgPSBjMS5sZW5ndGggLSAxO1xuICAgIGxldCBlMiA9IGwyIC0gMTtcbiAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICBjb25zdCBuMSA9IGMxW2ldO1xuICAgICAgY29uc3QgbjIgPSBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKTtcbiAgICAgIGlmIChpc1NhbWVWTm9kZVR5cGUobjEsIG4yKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBuMSxcbiAgICAgICAgICBuMixcbiAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICB3aGlsZSAoaSA8PSBlMSAmJiBpIDw9IGUyKSB7XG4gICAgICBjb25zdCBuMSA9IGMxW2UxXTtcbiAgICAgIGNvbnN0IG4yID0gYzJbZTJdID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbZTJdKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2UyXSk7XG4gICAgICBpZiAoaXNTYW1lVk5vZGVUeXBlKG4xLCBuMikpIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbjEsXG4gICAgICAgICAgbjIsXG4gICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGUxLS07XG4gICAgICBlMi0tO1xuICAgIH1cbiAgICBpZiAoaSA+IGUxKSB7XG4gICAgICBpZiAoaSA8PSBlMikge1xuICAgICAgICBjb25zdCBuZXh0UG9zID0gZTIgKyAxO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBuZXh0UG9zIDwgbDIgPyBjMltuZXh0UG9zXS5lbCA6IHBhcmVudEFuY2hvcjtcbiAgICAgICAgd2hpbGUgKGkgPD0gZTIpIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBjMltpXSA9IG9wdGltaXplZCA/IGNsb25lSWZNb3VudGVkKGMyW2ldKSA6IG5vcm1hbGl6ZVZOb2RlKGMyW2ldKSxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGkgPiBlMikge1xuICAgICAgd2hpbGUgKGkgPD0gZTEpIHtcbiAgICAgICAgdW5tb3VudChjMVtpXSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgdHJ1ZSk7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgczEgPSBpO1xuICAgICAgY29uc3QgczIgPSBpO1xuICAgICAgY29uc3Qga2V5VG9OZXdJbmRleE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICBmb3IgKGkgPSBzMjsgaSA8PSBlMjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5leHRDaGlsZCA9IGMyW2ldID0gb3B0aW1pemVkID8gY2xvbmVJZk1vdW50ZWQoYzJbaV0pIDogbm9ybWFsaXplVk5vZGUoYzJbaV0pO1xuICAgICAgICBpZiAobmV4dENoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYga2V5VG9OZXdJbmRleE1hcC5oYXMobmV4dENoaWxkLmtleSkpIHtcbiAgICAgICAgICAgIHdhcm4kMShcbiAgICAgICAgICAgICAgYER1cGxpY2F0ZSBrZXlzIGZvdW5kIGR1cmluZyB1cGRhdGU6YCxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmV4dENoaWxkLmtleSksXG4gICAgICAgICAgICAgIGBNYWtlIHN1cmUga2V5cyBhcmUgdW5pcXVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleVRvTmV3SW5kZXhNYXAuc2V0KG5leHRDaGlsZC5rZXksIGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgajtcbiAgICAgIGxldCBwYXRjaGVkID0gMDtcbiAgICAgIGNvbnN0IHRvQmVQYXRjaGVkID0gZTIgLSBzMiArIDE7XG4gICAgICBsZXQgbW92ZWQgPSBmYWxzZTtcbiAgICAgIGxldCBtYXhOZXdJbmRleFNvRmFyID0gMDtcbiAgICAgIGNvbnN0IG5ld0luZGV4VG9PbGRJbmRleE1hcCA9IG5ldyBBcnJheSh0b0JlUGF0Y2hlZCk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdG9CZVBhdGNoZWQ7IGkrKykgbmV3SW5kZXhUb09sZEluZGV4TWFwW2ldID0gMDtcbiAgICAgIGZvciAoaSA9IHMxOyBpIDw9IGUxOyBpKyspIHtcbiAgICAgICAgY29uc3QgcHJldkNoaWxkID0gYzFbaV07XG4gICAgICAgIGlmIChwYXRjaGVkID49IHRvQmVQYXRjaGVkKSB7XG4gICAgICAgICAgdW5tb3VudChwcmV2Q2hpbGQsIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIHRydWUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdJbmRleDtcbiAgICAgICAgaWYgKHByZXZDaGlsZC5rZXkgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld0luZGV4ID0ga2V5VG9OZXdJbmRleE1hcC5nZXQocHJldkNoaWxkLmtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChqID0gczI7IGogPD0gZTI7IGorKykge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4VG9PbGRJbmRleE1hcFtqIC0gczJdID09PSAwICYmIGlzU2FtZVZOb2RlVHlwZShwcmV2Q2hpbGQsIGMyW2pdKSkge1xuICAgICAgICAgICAgICBuZXdJbmRleCA9IGo7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3SW5kZXggPT09IHZvaWQgMCkge1xuICAgICAgICAgIHVubW91bnQocHJldkNoaWxkLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdJbmRleFRvT2xkSW5kZXhNYXBbbmV3SW5kZXggLSBzMl0gPSBpICsgMTtcbiAgICAgICAgICBpZiAobmV3SW5kZXggPj0gbWF4TmV3SW5kZXhTb0Zhcikge1xuICAgICAgICAgICAgbWF4TmV3SW5kZXhTb0ZhciA9IG5ld0luZGV4O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhdGNoKFxuICAgICAgICAgICAgcHJldkNoaWxkLFxuICAgICAgICAgICAgYzJbbmV3SW5kZXhdLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXRjaGVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlID0gbW92ZWQgPyBnZXRTZXF1ZW5jZShuZXdJbmRleFRvT2xkSW5kZXhNYXApIDogRU1QVFlfQVJSO1xuICAgICAgaiA9IGluY3JlYXNpbmdOZXdJbmRleFNlcXVlbmNlLmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKGkgPSB0b0JlUGF0Y2hlZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHMyICsgaTtcbiAgICAgICAgY29uc3QgbmV4dENoaWxkID0gYzJbbmV4dEluZGV4XTtcbiAgICAgICAgY29uc3QgYW5jaG9yID0gbmV4dEluZGV4ICsgMSA8IGwyID8gYzJbbmV4dEluZGV4ICsgMV0uZWwgOiBwYXJlbnRBbmNob3I7XG4gICAgICAgIGlmIChuZXdJbmRleFRvT2xkSW5kZXhNYXBbaV0gPT09IDApIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBuZXh0Q2hpbGQsXG4gICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICAgIG9wdGltaXplZFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAobW92ZWQpIHtcbiAgICAgICAgICBpZiAoaiA8IDAgfHwgaSAhPT0gaW5jcmVhc2luZ05ld0luZGV4U2VxdWVuY2Vbal0pIHtcbiAgICAgICAgICAgIG1vdmUobmV4dENoaWxkLCBjb250YWluZXIsIGFuY2hvciwgMik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGotLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IG1vdmUgPSAodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSwgcGFyZW50U3VzcGVuc2UgPSBudWxsKSA9PiB7XG4gICAgY29uc3QgeyBlbCwgdHlwZSwgdHJhbnNpdGlvbiwgY2hpbGRyZW4sIHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDYpIHtcbiAgICAgIG1vdmUodm5vZGUuY29tcG9uZW50LnN1YlRyZWUsIGNvbnRhaW5lciwgYW5jaG9yLCBtb3ZlVHlwZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHZub2RlLnN1c3BlbnNlLm1vdmUoY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlLm1vdmUodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBpbnRlcm5hbHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbW92ZShjaGlsZHJlbltpXSwgY29udGFpbmVyLCBhbmNob3IsIG1vdmVUeXBlKTtcbiAgICAgIH1cbiAgICAgIGhvc3RJbnNlcnQodm5vZGUuYW5jaG9yLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIG1vdmVTdGF0aWNOb2RlKHZub2RlLCBjb250YWluZXIsIGFuY2hvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5lZWRUcmFuc2l0aW9uMiA9IG1vdmVUeXBlICE9PSAyICYmIHNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbjtcbiAgICBpZiAobmVlZFRyYW5zaXRpb24yKSB7XG4gICAgICBpZiAobW92ZVR5cGUgPT09IDApIHtcbiAgICAgICAgdHJhbnNpdGlvbi5iZWZvcmVFbnRlcihlbCk7XG4gICAgICAgIGhvc3RJbnNlcnQoZWwsIGNvbnRhaW5lciwgYW5jaG9yKTtcbiAgICAgICAgcXVldWVQb3N0UmVuZGVyRWZmZWN0KCgpID0+IHRyYW5zaXRpb24uZW50ZXIoZWwpLCBwYXJlbnRTdXNwZW5zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IGxlYXZlLCBkZWxheUxlYXZlLCBhZnRlckxlYXZlIH0gPSB0cmFuc2l0aW9uO1xuICAgICAgICBjb25zdCByZW1vdmUyID0gKCkgPT4gaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgICAgbGVhdmUoZWwsICgpID0+IHtcbiAgICAgICAgICAgIHJlbW92ZTIoKTtcbiAgICAgICAgICAgIGFmdGVyTGVhdmUgJiYgYWZ0ZXJMZWF2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICAgIGRlbGF5TGVhdmUoZWwsIHJlbW92ZTIsIHBlcmZvcm1MZWF2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaG9zdEluc2VydChlbCwgY29udGFpbmVyLCBhbmNob3IpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgdW5tb3VudCA9ICh2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByZWYsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIGR5bmFtaWNDaGlsZHJlbixcbiAgICAgIHNoYXBlRmxhZyxcbiAgICAgIHBhdGNoRmxhZyxcbiAgICAgIGRpcnMsXG4gICAgICBjYWNoZUluZGV4XG4gICAgfSA9IHZub2RlO1xuICAgIGlmIChwYXRjaEZsYWcgPT09IC0yKSB7XG4gICAgICBvcHRpbWl6ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICBzZXRSZWYocmVmLCBudWxsLCBwYXJlbnRTdXNwZW5zZSwgdm5vZGUsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVJbmRleCAhPSBudWxsKSB7XG4gICAgICBwYXJlbnRDb21wb25lbnQucmVuZGVyQ2FjaGVbY2FjaGVJbmRleF0gPSB2b2lkIDA7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiAyNTYpIHtcbiAgICAgIHBhcmVudENvbXBvbmVudC5jdHguZGVhY3RpdmF0ZSh2bm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZEludm9rZURpcnMgPSBzaGFwZUZsYWcgJiAxICYmIGRpcnM7XG4gICAgY29uc3Qgc2hvdWxkSW52b2tlVm5vZGVIb29rID0gIWlzQXN5bmNXcmFwcGVyKHZub2RlKTtcbiAgICBsZXQgdm5vZGVIb29rO1xuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVCZWZvcmVVbm1vdW50KSkge1xuICAgICAgaW52b2tlVk5vZGVIb29rKHZub2RlSG9vaywgcGFyZW50Q29tcG9uZW50LCB2bm9kZSk7XG4gICAgfVxuICAgIGlmIChzaGFwZUZsYWcgJiA2KSB7XG4gICAgICB1bm1vdW50Q29tcG9uZW50KHZub2RlLmNvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UsIGRvUmVtb3ZlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgICB2bm9kZS5zdXNwZW5zZS51bm1vdW50KHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRJbnZva2VEaXJzKSB7XG4gICAgICAgIGludm9rZURpcmVjdGl2ZUhvb2sodm5vZGUsIG51bGwsIHBhcmVudENvbXBvbmVudCwgXCJiZWZvcmVVbm1vdW50XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICAgIHZub2RlLnR5cGUucmVtb3ZlKFxuICAgICAgICAgIHZub2RlLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICAgICAgICBpbnRlcm5hbHMsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZHluYW1pY0NoaWxkcmVuICYmIC8vICM1MTU0XG4gICAgICAvLyB3aGVuIHYtb25jZSBpcyB1c2VkIGluc2lkZSBhIGJsb2NrLCBzZXRCbG9ja1RyYWNraW5nKC0xKSBtYXJrcyB0aGVcbiAgICAgIC8vIHBhcmVudCBibG9jayB3aXRoIGhhc09uY2U6IHRydWVcbiAgICAgIC8vIHNvIHRoYXQgaXQgZG9lc24ndCB0YWtlIHRoZSBmYXN0IHBhdGggZHVyaW5nIHVubW91bnQgLSBvdGhlcndpc2VcbiAgICAgIC8vIGNvbXBvbmVudHMgbmVzdGVkIGluIHYtb25jZSBhcmUgbmV2ZXIgdW5tb3VudGVkLlxuICAgICAgIWR5bmFtaWNDaGlsZHJlbi5oYXNPbmNlICYmIC8vICMxMTUzOiBmYXN0IHBhdGggc2hvdWxkIG5vdCBiZSB0YWtlbiBmb3Igbm9uLXN0YWJsZSAodi1mb3IpIGZyYWdtZW50c1xuICAgICAgKHR5cGUgIT09IEZyYWdtZW50IHx8IHBhdGNoRmxhZyA+IDAgJiYgcGF0Y2hGbGFnICYgNjQpKSB7XG4gICAgICAgIHVubW91bnRDaGlsZHJlbihcbiAgICAgICAgICBkeW5hbWljQ2hpbGRyZW4sXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRnJhZ21lbnQgJiYgcGF0Y2hGbGFnICYgKDEyOCB8IDI1NikgfHwgIW9wdGltaXplZCAmJiBzaGFwZUZsYWcgJiAxNikge1xuICAgICAgICB1bm1vdW50Q2hpbGRyZW4oY2hpbGRyZW4sIHBhcmVudENvbXBvbmVudCwgcGFyZW50U3VzcGVuc2UpO1xuICAgICAgfVxuICAgICAgaWYgKGRvUmVtb3ZlKSB7XG4gICAgICAgIHJlbW92ZSh2bm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzaG91bGRJbnZva2VWbm9kZUhvb2sgJiYgKHZub2RlSG9vayA9IHByb3BzICYmIHByb3BzLm9uVm5vZGVVbm1vdW50ZWQpIHx8IHNob3VsZEludm9rZURpcnMpIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHZub2RlSG9vayAmJiBpbnZva2VWTm9kZUhvb2sodm5vZGVIb29rLCBwYXJlbnRDb21wb25lbnQsIHZub2RlKTtcbiAgICAgICAgc2hvdWxkSW52b2tlRGlycyAmJiBpbnZva2VEaXJlY3RpdmVIb29rKHZub2RlLCBudWxsLCBwYXJlbnRDb21wb25lbnQsIFwidW5tb3VudGVkXCIpO1xuICAgICAgfSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlID0gKHZub2RlKSA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBlbCwgYW5jaG9yLCB0cmFuc2l0aW9uIH0gPSB2bm9kZTtcbiAgICBpZiAodHlwZSA9PT0gRnJhZ21lbnQpIHtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLnBhdGNoRmxhZyA+IDAgJiYgdm5vZGUucGF0Y2hGbGFnICYgMjA0OCAmJiB0cmFuc2l0aW9uICYmICF0cmFuc2l0aW9uLnBlcnNpc3RlZCkge1xuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBDb21tZW50KSB7XG4gICAgICAgICAgICBob3N0UmVtb3ZlKGNoaWxkLmVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtb3ZlKGNoaWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlRnJhZ21lbnQoZWwsIGFuY2hvcik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBTdGF0aWMpIHtcbiAgICAgIHJlbW92ZVN0YXRpY05vZGUodm5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwZXJmb3JtUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgaG9zdFJlbW92ZShlbCk7XG4gICAgICBpZiAodHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQgJiYgdHJhbnNpdGlvbi5hZnRlckxlYXZlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQpIHtcbiAgICAgIGNvbnN0IHsgbGVhdmUsIGRlbGF5TGVhdmUgfSA9IHRyYW5zaXRpb247XG4gICAgICBjb25zdCBwZXJmb3JtTGVhdmUgPSAoKSA9PiBsZWF2ZShlbCwgcGVyZm9ybVJlbW92ZSk7XG4gICAgICBpZiAoZGVsYXlMZWF2ZSkge1xuICAgICAgICBkZWxheUxlYXZlKHZub2RlLmVsLCBwZXJmb3JtUmVtb3ZlLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVyZm9ybUxlYXZlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlcmZvcm1SZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlbW92ZUZyYWdtZW50ID0gKGN1ciwgZW5kKSA9PiB7XG4gICAgbGV0IG5leHQ7XG4gICAgd2hpbGUgKGN1ciAhPT0gZW5kKSB7XG4gICAgICBuZXh0ID0gaG9zdE5leHRTaWJsaW5nKGN1cik7XG4gICAgICBob3N0UmVtb3ZlKGN1cik7XG4gICAgICBjdXIgPSBuZXh0O1xuICAgIH1cbiAgICBob3N0UmVtb3ZlKGVuZCk7XG4gIH07XG4gIGNvbnN0IHVubW91bnRDb21wb25lbnQgPSAoaW5zdGFuY2UsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGluc3RhbmNlLnR5cGUuX19obXJJZCkge1xuICAgICAgdW5yZWdpc3RlckhNUihpbnN0YW5jZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgYnVtLCBzY29wZSwgam9iLCBzdWJUcmVlLCB1bSwgbSwgYSB9ID0gaW5zdGFuY2U7XG4gICAgaW52YWxpZGF0ZU1vdW50KG0pO1xuICAgIGludmFsaWRhdGVNb3VudChhKTtcbiAgICBpZiAoYnVtKSB7XG4gICAgICBpbnZva2VBcnJheUZucyhidW0pO1xuICAgIH1cbiAgICBzY29wZS5zdG9wKCk7XG4gICAgaWYgKGpvYikge1xuICAgICAgam9iLmZsYWdzIHw9IDg7XG4gICAgICB1bm1vdW50KHN1YlRyZWUsIGluc3RhbmNlLCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUpO1xuICAgIH1cbiAgICBpZiAodW0pIHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdCh1bSwgcGFyZW50U3VzcGVuc2UpO1xuICAgIH1cbiAgICBxdWV1ZVBvc3RSZW5kZXJFZmZlY3QoKCkgPT4ge1xuICAgICAgaW5zdGFuY2UuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICAgIH0sIHBhcmVudFN1c3BlbnNlKTtcbiAgICBpZiAocGFyZW50U3VzcGVuc2UgJiYgcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhcGFyZW50U3VzcGVuc2UuaXNVbm1vdW50ZWQgJiYgaW5zdGFuY2UuYXN5bmNEZXAgJiYgIWluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgJiYgaW5zdGFuY2Uuc3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzLS07XG4gICAgICBpZiAocGFyZW50U3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgICAgZGV2dG9vbHNDb21wb25lbnRSZW1vdmVkKGluc3RhbmNlKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHVubW91bnRDaGlsZHJlbiA9IChjaGlsZHJlbiwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgZG9SZW1vdmUgPSBmYWxzZSwgb3B0aW1pemVkID0gZmFsc2UsIHN0YXJ0ID0gMCkgPT4ge1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB1bm1vdW50KGNoaWxkcmVuW2ldLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBkb1JlbW92ZSwgb3B0aW1pemVkKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldE5leHRIb3N0Tm9kZSA9ICh2bm9kZSkgPT4ge1xuICAgIGlmICh2bm9kZS5zaGFwZUZsYWcgJiA2KSB7XG4gICAgICByZXR1cm4gZ2V0TmV4dEhvc3ROb2RlKHZub2RlLmNvbXBvbmVudC5zdWJUcmVlKTtcbiAgICB9XG4gICAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEyOCkge1xuICAgICAgcmV0dXJuIHZub2RlLnN1c3BlbnNlLm5leHQoKTtcbiAgICB9XG4gICAgY29uc3QgZWwgPSBob3N0TmV4dFNpYmxpbmcodm5vZGUuYW5jaG9yIHx8IHZub2RlLmVsKTtcbiAgICBjb25zdCB0ZWxlcG9ydEVuZCA9IGVsICYmIGVsW1RlbGVwb3J0RW5kS2V5XTtcbiAgICByZXR1cm4gdGVsZXBvcnRFbmQgPyBob3N0TmV4dFNpYmxpbmcodGVsZXBvcnRFbmQpIDogZWw7XG4gIH07XG4gIGxldCBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gIGNvbnN0IHJlbmRlciA9ICh2bm9kZSwgY29udGFpbmVyLCBuYW1lc3BhY2UpID0+IHtcbiAgICBpZiAodm5vZGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGNvbnRhaW5lci5fdm5vZGUpIHtcbiAgICAgICAgdW5tb3VudChjb250YWluZXIuX3Zub2RlLCBudWxsLCBudWxsLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGF0Y2goXG4gICAgICAgIGNvbnRhaW5lci5fdm5vZGUgfHwgbnVsbCxcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgbmFtZXNwYWNlXG4gICAgICApO1xuICAgIH1cbiAgICBjb250YWluZXIuX3Zub2RlID0gdm5vZGU7XG4gICAgaWYgKCFpc0ZsdXNoaW5nKSB7XG4gICAgICBpc0ZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgIGZsdXNoUHJlRmx1c2hDYnMoKTtcbiAgICAgIGZsdXNoUG9zdEZsdXNoQ2JzKCk7XG4gICAgICBpc0ZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICBjb25zdCBpbnRlcm5hbHMgPSB7XG4gICAgcDogcGF0Y2gsXG4gICAgdW06IHVubW91bnQsXG4gICAgbTogbW92ZSxcbiAgICByOiByZW1vdmUsXG4gICAgbXQ6IG1vdW50Q29tcG9uZW50LFxuICAgIG1jOiBtb3VudENoaWxkcmVuLFxuICAgIHBjOiBwYXRjaENoaWxkcmVuLFxuICAgIHBiYzogcGF0Y2hCbG9ja0NoaWxkcmVuLFxuICAgIG46IGdldE5leHRIb3N0Tm9kZSxcbiAgICBvOiBvcHRpb25zXG4gIH07XG4gIGxldCBoeWRyYXRlO1xuICBsZXQgaHlkcmF0ZU5vZGU7XG4gIGlmIChjcmVhdGVIeWRyYXRpb25GbnMpIHtcbiAgICBbaHlkcmF0ZSwgaHlkcmF0ZU5vZGVdID0gY3JlYXRlSHlkcmF0aW9uRm5zKFxuICAgICAgaW50ZXJuYWxzXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlbmRlcixcbiAgICBoeWRyYXRlLFxuICAgIGNyZWF0ZUFwcDogY3JlYXRlQXBwQVBJKHJlbmRlciwgaHlkcmF0ZSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVDaGlsZHJlbk5hbWVzcGFjZSh7IHR5cGUsIHByb3BzIH0sIGN1cnJlbnROYW1lc3BhY2UpIHtcbiAgcmV0dXJuIGN1cnJlbnROYW1lc3BhY2UgPT09IFwic3ZnXCIgJiYgdHlwZSA9PT0gXCJmb3JlaWduT2JqZWN0XCIgfHwgY3VycmVudE5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiAmJiB0eXBlID09PSBcImFubm90YXRpb24teG1sXCIgJiYgcHJvcHMgJiYgcHJvcHMuZW5jb2RpbmcgJiYgcHJvcHMuZW5jb2RpbmcuaW5jbHVkZXMoXCJodG1sXCIpID8gdm9pZCAwIDogY3VycmVudE5hbWVzcGFjZTtcbn1cbmZ1bmN0aW9uIHRvZ2dsZVJlY3Vyc2UoeyBlZmZlY3QsIGpvYiB9LCBhbGxvd2VkKSB7XG4gIGlmIChhbGxvd2VkKSB7XG4gICAgZWZmZWN0LmZsYWdzIHw9IDMyO1xuICAgIGpvYi5mbGFncyB8PSA0O1xuICB9IGVsc2Uge1xuICAgIGVmZmVjdC5mbGFncyAmPSB+MzI7XG4gICAgam9iLmZsYWdzICY9IH40O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkVHJhbnNpdGlvbihwYXJlbnRTdXNwZW5zZSwgdHJhbnNpdGlvbikge1xuICByZXR1cm4gKCFwYXJlbnRTdXNwZW5zZSB8fCBwYXJlbnRTdXNwZW5zZSAmJiAhcGFyZW50U3VzcGVuc2UucGVuZGluZ0JyYW5jaCkgJiYgdHJhbnNpdGlvbiAmJiAhdHJhbnNpdGlvbi5wZXJzaXN0ZWQ7XG59XG5mdW5jdGlvbiB0cmF2ZXJzZVN0YXRpY0NoaWxkcmVuKG4xLCBuMiwgc2hhbGxvdyA9IGZhbHNlKSB7XG4gIGNvbnN0IGNoMSA9IG4xLmNoaWxkcmVuO1xuICBjb25zdCBjaDIgPSBuMi5jaGlsZHJlbjtcbiAgaWYgKGlzQXJyYXkoY2gxKSAmJiBpc0FycmF5KGNoMikpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoMS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYzEgPSBjaDFbaV07XG4gICAgICBsZXQgYzIgPSBjaDJbaV07XG4gICAgICBpZiAoYzIuc2hhcGVGbGFnICYgMSAmJiAhYzIuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjMi5wYXRjaEZsYWcgPD0gMCB8fCBjMi5wYXRjaEZsYWcgPT09IDMyKSB7XG4gICAgICAgICAgYzIgPSBjaDJbaV0gPSBjbG9uZUlmTW91bnRlZChjaDJbaV0pO1xuICAgICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzaGFsbG93ICYmIGMyLnBhdGNoRmxhZyAhPT0gLTIpXG4gICAgICAgICAgdHJhdmVyc2VTdGF0aWNDaGlsZHJlbihjMSwgYzIpO1xuICAgICAgfVxuICAgICAgaWYgKGMyLnR5cGUgPT09IFRleHQpIHtcbiAgICAgICAgYzIuZWwgPSBjMS5lbDtcbiAgICAgIH1cbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGMyLnR5cGUgPT09IENvbW1lbnQgJiYgIWMyLmVsKSB7XG4gICAgICAgIGMyLmVsID0gYzEuZWw7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRTZXF1ZW5jZShhcnIpIHtcbiAgY29uc3QgcCA9IGFyci5zbGljZSgpO1xuICBjb25zdCByZXN1bHQgPSBbMF07XG4gIGxldCBpLCBqLCB1LCB2LCBjO1xuICBjb25zdCBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBhcnJJID0gYXJyW2ldO1xuICAgIGlmIChhcnJJICE9PSAwKSB7XG4gICAgICBqID0gcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChhcnJbal0gPCBhcnJJKSB7XG4gICAgICAgIHBbaV0gPSBqO1xuICAgICAgICByZXN1bHQucHVzaChpKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB1ID0gMDtcbiAgICAgIHYgPSByZXN1bHQubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlICh1IDwgdikge1xuICAgICAgICBjID0gdSArIHYgPj4gMTtcbiAgICAgICAgaWYgKGFycltyZXN1bHRbY11dIDwgYXJySSkge1xuICAgICAgICAgIHUgPSBjICsgMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGFyckkgPCBhcnJbcmVzdWx0W3VdXSkge1xuICAgICAgICBpZiAodSA+IDApIHtcbiAgICAgICAgICBwW2ldID0gcmVzdWx0W3UgLSAxXTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbdV0gPSBpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB1ID0gcmVzdWx0Lmxlbmd0aDtcbiAgdiA9IHJlc3VsdFt1IC0gMV07XG4gIHdoaWxlICh1LS0gPiAwKSB7XG4gICAgcmVzdWx0W3VdID0gdjtcbiAgICB2ID0gcFt2XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gbG9jYXRlTm9uSHlkcmF0ZWRBc3luY1Jvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qgc3ViQ29tcG9uZW50ID0gaW5zdGFuY2Uuc3ViVHJlZS5jb21wb25lbnQ7XG4gIGlmIChzdWJDb21wb25lbnQpIHtcbiAgICBpZiAoc3ViQ29tcG9uZW50LmFzeW5jRGVwICYmICFzdWJDb21wb25lbnQuYXN5bmNSZXNvbHZlZCkge1xuICAgICAgcmV0dXJuIHN1YkNvbXBvbmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvY2F0ZU5vbkh5ZHJhdGVkQXN5bmNSb290KHN1YkNvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBpbnZhbGlkYXRlTW91bnQoaG9va3MpIHtcbiAgaWYgKGhvb2tzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKylcbiAgICAgIGhvb2tzW2ldLmZsYWdzIHw9IDg7XG4gIH1cbn1cblxuY29uc3Qgc3NyQ29udGV4dEtleSA9IFN5bWJvbC5mb3IoXCJ2LXNjeFwiKTtcbmNvbnN0IHVzZVNTUkNvbnRleHQgPSAoKSA9PiB7XG4gIHtcbiAgICBjb25zdCBjdHggPSBpbmplY3Qoc3NyQ29udGV4dEtleSk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2FybiQxKFxuICAgICAgICBgU2VydmVyIHJlbmRlcmluZyBjb250ZXh0IG5vdCBwcm92aWRlZC4gTWFrZSBzdXJlIHRvIG9ubHkgY2FsbCB1c2VTU1JDb250ZXh0KCkgY29uZGl0aW9uYWxseSBpbiB0aGUgc2VydmVyIGJ1aWxkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjdHg7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHdhdGNoRWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChlZmZlY3QsIG51bGwsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gd2F0Y2hQb3N0RWZmZWN0KGVmZmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gZG9XYXRjaChcbiAgICBlZmZlY3QsXG4gICAgbnVsbCxcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gZXh0ZW5kKHt9LCBvcHRpb25zLCB7IGZsdXNoOiBcInBvc3RcIiB9KSA6IHsgZmx1c2g6IFwicG9zdFwiIH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHdhdGNoU3luY0VmZmVjdChlZmZlY3QsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGRvV2F0Y2goXG4gICAgZWZmZWN0LFxuICAgIG51bGwsXG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IGV4dGVuZCh7fSwgb3B0aW9ucywgeyBmbHVzaDogXCJzeW5jXCIgfSkgOiB7IGZsdXNoOiBcInN5bmNcIiB9XG4gICk7XG59XG5mdW5jdGlvbiB3YXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKSB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0Z1bmN0aW9uKGNiKSkge1xuICAgIHdhcm4kMShcbiAgICAgIGBcXGB3YXRjaChmbiwgb3B0aW9ucz8pXFxgIHNpZ25hdHVyZSBoYXMgYmVlbiBtb3ZlZCB0byBhIHNlcGFyYXRlIEFQSS4gVXNlIFxcYHdhdGNoRWZmZWN0KGZuLCBvcHRpb25zPylcXGAgaW5zdGVhZC4gXFxgd2F0Y2hcXGAgbm93IG9ubHkgc3VwcG9ydHMgXFxgd2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZG9XYXRjaChzb3VyY2UsIGNiLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIGRvV2F0Y2goc291cmNlLCBjYiwgb3B0aW9ucyA9IEVNUFRZX09CSikge1xuICBjb25zdCB7IGltbWVkaWF0ZSwgZGVlcCwgZmx1c2gsIG9uY2UgfSA9IG9wdGlvbnM7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFjYikge1xuICAgIGlmIChpbW1lZGlhdGUgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcImltbWVkaWF0ZVwiIG9wdGlvbiBpcyBvbmx5IHJlc3BlY3RlZCB3aGVuIHVzaW5nIHRoZSB3YXRjaChzb3VyY2UsIGNhbGxiYWNrLCBvcHRpb25zPykgc2lnbmF0dXJlLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZWVwICE9PSB2b2lkIDApIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYHdhdGNoKCkgXCJkZWVwXCIgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgdGhlIHdhdGNoKHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnM/KSBzaWduYXR1cmUuYFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9uY2UgIT09IHZvaWQgMCkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgd2F0Y2goKSBcIm9uY2VcIiBvcHRpb24gaXMgb25seSByZXNwZWN0ZWQgd2hlbiB1c2luZyB0aGUgd2F0Y2goc291cmNlLCBjYWxsYmFjaywgb3B0aW9ucz8pIHNpZ25hdHVyZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBjb25zdCBiYXNlV2F0Y2hPcHRpb25zID0gZXh0ZW5kKHt9LCBvcHRpb25zKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIGJhc2VXYXRjaE9wdGlvbnMub25XYXJuID0gd2FybiQxO1xuICBsZXQgc3NyQ2xlYW51cDtcbiAgaWYgKGlzSW5TU1JDb21wb25lbnRTZXR1cCkge1xuICAgIGlmIChmbHVzaCA9PT0gXCJzeW5jXCIpIHtcbiAgICAgIGNvbnN0IGN0eCA9IHVzZVNTUkNvbnRleHQoKTtcbiAgICAgIHNzckNsZWFudXAgPSBjdHguX193YXRjaGVySGFuZGxlcyB8fCAoY3R4Ll9fd2F0Y2hlckhhbmRsZXMgPSBbXSk7XG4gICAgfSBlbHNlIGlmICghY2IgfHwgaW1tZWRpYXRlKSB7XG4gICAgICBiYXNlV2F0Y2hPcHRpb25zLm9uY2UgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB3YXRjaFN0b3BIYW5kbGUgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgd2F0Y2hTdG9wSGFuZGxlLnN0b3AgPSBOT09QO1xuICAgICAgd2F0Y2hTdG9wSGFuZGxlLnJlc3VtZSA9IE5PT1A7XG4gICAgICB3YXRjaFN0b3BIYW5kbGUucGF1c2UgPSBOT09QO1xuICAgICAgcmV0dXJuIHdhdGNoU3RvcEhhbmRsZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaW5zdGFuY2UgPSBjdXJyZW50SW5zdGFuY2U7XG4gIGJhc2VXYXRjaE9wdGlvbnMuY2FsbCA9IChmbiwgdHlwZSwgYXJncykgPT4gY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoZm4sIGluc3RhbmNlLCB0eXBlLCBhcmdzKTtcbiAgbGV0IGlzUHJlID0gZmFsc2U7XG4gIGlmIChmbHVzaCA9PT0gXCJwb3N0XCIpIHtcbiAgICBiYXNlV2F0Y2hPcHRpb25zLnNjaGVkdWxlciA9IChqb2IpID0+IHtcbiAgICAgIHF1ZXVlUG9zdFJlbmRlckVmZmVjdChqb2IsIGluc3RhbmNlICYmIGluc3RhbmNlLnN1c3BlbnNlKTtcbiAgICB9O1xuICB9IGVsc2UgaWYgKGZsdXNoICE9PSBcInN5bmNcIikge1xuICAgIGlzUHJlID0gdHJ1ZTtcbiAgICBiYXNlV2F0Y2hPcHRpb25zLnNjaGVkdWxlciA9IChqb2IsIGlzRmlyc3RSdW4pID0+IHtcbiAgICAgIGlmIChpc0ZpcnN0UnVuKSB7XG4gICAgICAgIGpvYigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVKb2Ioam9iKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGJhc2VXYXRjaE9wdGlvbnMuYXVnbWVudEpvYiA9IChqb2IpID0+IHtcbiAgICBpZiAoY2IpIHtcbiAgICAgIGpvYi5mbGFncyB8PSA0O1xuICAgIH1cbiAgICBpZiAoaXNQcmUpIHtcbiAgICAgIGpvYi5mbGFncyB8PSAyO1xuICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgIGpvYi5pZCA9IGluc3RhbmNlLnVpZDtcbiAgICAgICAgam9iLmkgPSBpbnN0YW5jZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IHdhdGNoSGFuZGxlID0gd2F0Y2gkMShzb3VyY2UsIGNiLCBiYXNlV2F0Y2hPcHRpb25zKTtcbiAgaWYgKHNzckNsZWFudXApIHNzckNsZWFudXAucHVzaCh3YXRjaEhhbmRsZSk7XG4gIHJldHVybiB3YXRjaEhhbmRsZTtcbn1cbmZ1bmN0aW9uIGluc3RhbmNlV2F0Y2goc291cmNlLCB2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBwdWJsaWNUaGlzID0gdGhpcy5wcm94eTtcbiAgY29uc3QgZ2V0dGVyID0gaXNTdHJpbmcoc291cmNlKSA/IHNvdXJjZS5pbmNsdWRlcyhcIi5cIikgPyBjcmVhdGVQYXRoR2V0dGVyKHB1YmxpY1RoaXMsIHNvdXJjZSkgOiAoKSA9PiBwdWJsaWNUaGlzW3NvdXJjZV0gOiBzb3VyY2UuYmluZChwdWJsaWNUaGlzLCBwdWJsaWNUaGlzKTtcbiAgbGV0IGNiO1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICBjYiA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNiID0gdmFsdWUuaGFuZGxlcjtcbiAgICBvcHRpb25zID0gdmFsdWU7XG4gIH1cbiAgY29uc3QgcmVzZXQgPSBzZXRDdXJyZW50SW5zdGFuY2UodGhpcyk7XG4gIGNvbnN0IHJlcyA9IGRvV2F0Y2goZ2V0dGVyLCBjYi5iaW5kKHB1YmxpY1RoaXMpLCBvcHRpb25zKTtcbiAgcmVzZXQoKTtcbiAgcmV0dXJuIHJlcztcbn1cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhHZXR0ZXIoY3R4LCBwYXRoKSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgbGV0IGN1ciA9IGN0eDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAmJiBjdXI7IGkrKykge1xuICAgICAgY3VyID0gY3VyW3NlZ21lbnRzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXNlTW9kZWwocHJvcHMsIG5hbWUsIG9wdGlvbnMgPSBFTVBUWV9PQkopIHtcbiAgY29uc3QgaSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAhaSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aG91dCBhY3RpdmUgaW5zdGFuY2UuYCk7XG4gICAgcmV0dXJuIHJlZigpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpLnByb3BzT3B0aW9uc1swXVtuYW1lXSkge1xuICAgIHdhcm4kMShgdXNlTW9kZWwoKSBjYWxsZWQgd2l0aCBwcm9wIFwiJHtuYW1lfVwiIHdoaWNoIGlzIG5vdCBkZWNsYXJlZC5gKTtcbiAgICByZXR1cm4gcmVmKCk7XG4gIH1cbiAgY29uc3QgY2FtZWxpemVkTmFtZSA9IGNhbWVsaXplKG5hbWUpO1xuICBjb25zdCBoeXBoZW5hdGVkTmFtZSA9IGh5cGhlbmF0ZShuYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kZWxNb2RpZmllcnMocHJvcHMsIG5hbWUpO1xuICBjb25zdCByZXMgPSBjdXN0b21SZWYoKHRyYWNrLCB0cmlnZ2VyKSA9PiB7XG4gICAgbGV0IGxvY2FsVmFsdWU7XG4gICAgbGV0IHByZXZTZXRWYWx1ZSA9IEVNUFRZX09CSjtcbiAgICBsZXQgcHJldkVtaXR0ZWRWYWx1ZTtcbiAgICB3YXRjaFN5bmNFZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcFZhbHVlID0gcHJvcHNbbmFtZV07XG4gICAgICBpZiAoaGFzQ2hhbmdlZChsb2NhbFZhbHVlLCBwcm9wVmFsdWUpKSB7XG4gICAgICAgIGxvY2FsVmFsdWUgPSBwcm9wVmFsdWU7XG4gICAgICAgIHRyaWdnZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB0cmFjaygpO1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5nZXQgPyBvcHRpb25zLmdldChsb2NhbFZhbHVlKSA6IGxvY2FsVmFsdWU7XG4gICAgICB9LFxuICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGVtaXR0ZWRWYWx1ZSA9IG9wdGlvbnMuc2V0ID8gb3B0aW9ucy5zZXQodmFsdWUpIDogdmFsdWU7XG4gICAgICAgIGlmICghaGFzQ2hhbmdlZChlbWl0dGVkVmFsdWUsIGxvY2FsVmFsdWUpICYmICEocHJldlNldFZhbHVlICE9PSBFTVBUWV9PQkogJiYgaGFzQ2hhbmdlZCh2YWx1ZSwgcHJldlNldFZhbHVlKSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3UHJvcHMgPSBpLnZub2RlLnByb3BzO1xuICAgICAgICBpZiAoIShyYXdQcm9wcyAmJiAvLyBjaGVjayBpZiBwYXJlbnQgaGFzIHBhc3NlZCB2LW1vZGVsXG4gICAgICAgIChuYW1lIGluIHJhd1Byb3BzIHx8IGNhbWVsaXplZE5hbWUgaW4gcmF3UHJvcHMgfHwgaHlwaGVuYXRlZE5hbWUgaW4gcmF3UHJvcHMpICYmIChgb25VcGRhdGU6JHtuYW1lfWAgaW4gcmF3UHJvcHMgfHwgYG9uVXBkYXRlOiR7Y2FtZWxpemVkTmFtZX1gIGluIHJhd1Byb3BzIHx8IGBvblVwZGF0ZToke2h5cGhlbmF0ZWROYW1lfWAgaW4gcmF3UHJvcHMpKSkge1xuICAgICAgICAgIGxvY2FsVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0cmlnZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaS5lbWl0KGB1cGRhdGU6JHtuYW1lfWAsIGVtaXR0ZWRWYWx1ZSk7XG4gICAgICAgIGlmIChoYXNDaGFuZ2VkKHZhbHVlLCBlbWl0dGVkVmFsdWUpICYmIGhhc0NoYW5nZWQodmFsdWUsIHByZXZTZXRWYWx1ZSkgJiYgIWhhc0NoYW5nZWQoZW1pdHRlZFZhbHVlLCBwcmV2RW1pdHRlZFZhbHVlKSkge1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2U2V0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgcHJldkVtaXR0ZWRWYWx1ZSA9IGVtaXR0ZWRWYWx1ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbiAgcmVzW1N5bWJvbC5pdGVyYXRvcl0gPSAoKSA9PiB7XG4gICAgbGV0IGkyID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dCgpIHtcbiAgICAgICAgaWYgKGkyIDwgMikge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBpMisrID8gbW9kaWZpZXJzIHx8IEVNUFRZX09CSiA6IHJlcywgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICByZXR1cm4gcmVzO1xufVxuY29uc3QgZ2V0TW9kZWxNb2RpZmllcnMgPSAocHJvcHMsIG1vZGVsTmFtZSkgPT4ge1xuICByZXR1cm4gbW9kZWxOYW1lID09PSBcIm1vZGVsVmFsdWVcIiB8fCBtb2RlbE5hbWUgPT09IFwibW9kZWwtdmFsdWVcIiA/IHByb3BzLm1vZGVsTW9kaWZpZXJzIDogcHJvcHNbYCR7bW9kZWxOYW1lfU1vZGlmaWVyc2BdIHx8IHByb3BzW2Ake2NhbWVsaXplKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF0gfHwgcHJvcHNbYCR7aHlwaGVuYXRlKG1vZGVsTmFtZSl9TW9kaWZpZXJzYF07XG59O1xuXG5mdW5jdGlvbiBlbWl0KGluc3RhbmNlLCBldmVudCwgLi4ucmF3QXJncykge1xuICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQpIHJldHVybjtcbiAgY29uc3QgcHJvcHMgPSBpbnN0YW5jZS52bm9kZS5wcm9wcyB8fCBFTVBUWV9PQko7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3Qge1xuICAgICAgZW1pdHNPcHRpb25zLFxuICAgICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXVxuICAgIH0gPSBpbnN0YW5jZTtcbiAgICBpZiAoZW1pdHNPcHRpb25zKSB7XG4gICAgICBpZiAoIShldmVudCBpbiBlbWl0c09wdGlvbnMpICYmIHRydWUpIHtcbiAgICAgICAgaWYgKCFwcm9wc09wdGlvbnMgfHwgISh0b0hhbmRsZXJLZXkoY2FtZWxpemUoZXZlbnQpKSBpbiBwcm9wc09wdGlvbnMpKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYENvbXBvbmVudCBlbWl0dGVkIGV2ZW50IFwiJHtldmVudH1cIiBidXQgaXQgaXMgbmVpdGhlciBkZWNsYXJlZCBpbiB0aGUgZW1pdHMgb3B0aW9uIG5vciBhcyBhbiBcIiR7dG9IYW5kbGVyS2V5KGNhbWVsaXplKGV2ZW50KSl9XCIgcHJvcC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gZW1pdHNPcHRpb25zW2V2ZW50XTtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdG9yKSkge1xuICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0b3IoLi4ucmF3QXJncyk7XG4gICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICAgIGBJbnZhbGlkIGV2ZW50IGFyZ3VtZW50czogZXZlbnQgdmFsaWRhdGlvbiBmYWlsZWQgZm9yIGV2ZW50IFwiJHtldmVudH1cIi5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBsZXQgYXJncyA9IHJhd0FyZ3M7XG4gIGNvbnN0IGlzTW9kZWxMaXN0ZW5lciA9IGV2ZW50LnN0YXJ0c1dpdGgoXCJ1cGRhdGU6XCIpO1xuICBjb25zdCBtb2RpZmllcnMgPSBpc01vZGVsTGlzdGVuZXIgJiYgZ2V0TW9kZWxNb2RpZmllcnMocHJvcHMsIGV2ZW50LnNsaWNlKDcpKTtcbiAgaWYgKG1vZGlmaWVycykge1xuICAgIGlmIChtb2RpZmllcnMudHJpbSkge1xuICAgICAgYXJncyA9IHJhd0FyZ3MubWFwKChhKSA9PiBpc1N0cmluZyhhKSA/IGEudHJpbSgpIDogYSk7XG4gICAgfVxuICAgIGlmIChtb2RpZmllcnMubnVtYmVyKSB7XG4gICAgICBhcmdzID0gcmF3QXJncy5tYXAobG9vc2VUb051bWJlcik7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IF9fVlVFX1BST0RfREVWVE9PTFNfXykge1xuICAgIGRldnRvb2xzQ29tcG9uZW50RW1pdChpbnN0YW5jZSwgZXZlbnQsIGFyZ3MpO1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgY29uc3QgbG93ZXJDYXNlRXZlbnQgPSBldmVudC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgcHJvcHNbdG9IYW5kbGVyS2V5KGxvd2VyQ2FzZUV2ZW50KV0pIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYEV2ZW50IFwiJHtsb3dlckNhc2VFdmVudH1cIiBpcyBlbWl0dGVkIGluIGNvbXBvbmVudCAke2Zvcm1hdENvbXBvbmVudE5hbWUoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgaW5zdGFuY2UudHlwZVxuICAgICAgICApfSBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXCIke2V2ZW50fVwiLiBOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSB2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXCIke2h5cGhlbmF0ZShcbiAgICAgICAgICBldmVudFxuICAgICAgICApfVwiIGluc3RlYWQgb2YgXCIke2V2ZW50fVwiLmBcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGxldCBoYW5kbGVyTmFtZTtcbiAgbGV0IGhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSA9IHRvSGFuZGxlcktleShldmVudCldIHx8IC8vIGFsc28gdHJ5IGNhbWVsQ2FzZSBldmVudCBoYW5kbGVyICgjMjI0OSlcbiAgcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoY2FtZWxpemUoZXZlbnQpKV07XG4gIGlmICghaGFuZGxlciAmJiBpc01vZGVsTGlzdGVuZXIpIHtcbiAgICBoYW5kbGVyID0gcHJvcHNbaGFuZGxlck5hbWUgPSB0b0hhbmRsZXJLZXkoaHlwaGVuYXRlKGV2ZW50KSldO1xuICB9XG4gIGlmIChoYW5kbGVyKSB7XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBoYW5kbGVyLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICA2LFxuICAgICAgYXJnc1xuICAgICk7XG4gIH1cbiAgY29uc3Qgb25jZUhhbmRsZXIgPSBwcm9wc1toYW5kbGVyTmFtZSArIGBPbmNlYF07XG4gIGlmIChvbmNlSGFuZGxlcikge1xuICAgIGlmICghaW5zdGFuY2UuZW1pdHRlZCkge1xuICAgICAgaW5zdGFuY2UuZW1pdHRlZCA9IHt9O1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuZW1pdHRlZFtoYW5kbGVyTmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdGFuY2UuZW1pdHRlZFtoYW5kbGVyTmFtZV0gPSB0cnVlO1xuICAgIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKFxuICAgICAgb25jZUhhbmRsZXIsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDYsXG4gICAgICBhcmdzXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gbm9ybWFsaXplRW1pdHNPcHRpb25zKGNvbXAsIGFwcENvbnRleHQsIGFzTWl4aW4gPSBmYWxzZSkge1xuICBjb25zdCBjYWNoZSA9IGFwcENvbnRleHQuZW1pdHNDYWNoZTtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KGNvbXApO1xuICBpZiAoY2FjaGVkICE9PSB2b2lkIDApIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJhdyA9IGNvbXAuZW1pdHM7XG4gIGxldCBub3JtYWxpemVkID0ge307XG4gIGxldCBoYXNFeHRlbmRzID0gZmFsc2U7XG4gIGlmIChfX1ZVRV9PUFRJT05TX0FQSV9fICYmICFpc0Z1bmN0aW9uKGNvbXApKSB7XG4gICAgY29uc3QgZXh0ZW5kRW1pdHMgPSAocmF3MikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZyb21FeHRlbmQgPSBub3JtYWxpemVFbWl0c09wdGlvbnMocmF3MiwgYXBwQ29udGV4dCwgdHJ1ZSk7XG4gICAgICBpZiAobm9ybWFsaXplZEZyb21FeHRlbmQpIHtcbiAgICAgICAgaGFzRXh0ZW5kcyA9IHRydWU7XG4gICAgICAgIGV4dGVuZChub3JtYWxpemVkLCBub3JtYWxpemVkRnJvbUV4dGVuZCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoIWFzTWl4aW4gJiYgYXBwQ29udGV4dC5taXhpbnMubGVuZ3RoKSB7XG4gICAgICBhcHBDb250ZXh0Lm1peGlucy5mb3JFYWNoKGV4dGVuZEVtaXRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAuZXh0ZW5kcykge1xuICAgICAgZXh0ZW5kRW1pdHMoY29tcC5leHRlbmRzKTtcbiAgICB9XG4gICAgaWYgKGNvbXAubWl4aW5zKSB7XG4gICAgICBjb21wLm1peGlucy5mb3JFYWNoKGV4dGVuZEVtaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyYXcgJiYgIWhhc0V4dGVuZHMpIHtcbiAgICBpZiAoaXNPYmplY3QoY29tcCkpIHtcbiAgICAgIGNhY2hlLnNldChjb21wLCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGlzQXJyYXkocmF3KSkge1xuICAgIHJhdy5mb3JFYWNoKChrZXkpID0+IG5vcm1hbGl6ZWRba2V5XSA9IG51bGwpO1xuICB9IGVsc2Uge1xuICAgIGV4dGVuZChub3JtYWxpemVkLCByYXcpO1xuICB9XG4gIGlmIChpc09iamVjdChjb21wKSkge1xuICAgIGNhY2hlLnNldChjb21wLCBub3JtYWxpemVkKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbmZ1bmN0aW9uIGlzRW1pdExpc3RlbmVyKG9wdGlvbnMsIGtleSkge1xuICBpZiAoIW9wdGlvbnMgfHwgIWlzT24oa2V5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBrZXkgPSBrZXkuc2xpY2UoMikucmVwbGFjZSgvT25jZSQvLCBcIlwiKTtcbiAgcmV0dXJuIGhhc093bihvcHRpb25zLCBrZXlbMF0udG9Mb3dlckNhc2UoKSArIGtleS5zbGljZSgxKSkgfHwgaGFzT3duKG9wdGlvbnMsIGh5cGhlbmF0ZShrZXkpKSB8fCBoYXNPd24ob3B0aW9ucywga2V5KTtcbn1cblxubGV0IGFjY2Vzc2VkQXR0cnMgPSBmYWxzZTtcbmZ1bmN0aW9uIG1hcmtBdHRyc0FjY2Vzc2VkKCkge1xuICBhY2Nlc3NlZEF0dHJzID0gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckNvbXBvbmVudFJvb3QoaW5zdGFuY2UpIHtcbiAgY29uc3Qge1xuICAgIHR5cGU6IENvbXBvbmVudCxcbiAgICB2bm9kZSxcbiAgICBwcm94eSxcbiAgICB3aXRoUHJveHksXG4gICAgcHJvcHNPcHRpb25zOiBbcHJvcHNPcHRpb25zXSxcbiAgICBzbG90cyxcbiAgICBhdHRycyxcbiAgICBlbWl0LFxuICAgIHJlbmRlcixcbiAgICByZW5kZXJDYWNoZSxcbiAgICBwcm9wcyxcbiAgICBkYXRhLFxuICAgIHNldHVwU3RhdGUsXG4gICAgY3R4LFxuICAgIGluaGVyaXRBdHRyc1xuICB9ID0gaW5zdGFuY2U7XG4gIGNvbnN0IHByZXYgPSBzZXRDdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UoaW5zdGFuY2UpO1xuICBsZXQgcmVzdWx0O1xuICBsZXQgZmFsbHRocm91Z2hBdHRycztcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhY2Nlc3NlZEF0dHJzID0gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAodm5vZGUuc2hhcGVGbGFnICYgNCkge1xuICAgICAgY29uc3QgcHJveHlUb1VzZSA9IHdpdGhQcm94eSB8fCBwcm94eTtcbiAgICAgIGNvbnN0IHRoaXNQcm94eSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBTdGF0ZS5fX2lzU2NyaXB0U2V0dXAgPyBuZXcgUHJveHkocHJveHlUb1VzZSwge1xuICAgICAgICBnZXQodGFyZ2V0LCBrZXksIHJlY2VpdmVyKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYFByb3BlcnR5ICcke1N0cmluZyhcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApfScgd2FzIGFjY2Vzc2VkIHZpYSAndGhpcycuIEF2b2lkIHVzaW5nICd0aGlzJyBpbiB0ZW1wbGF0ZXMuYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwga2V5LCByZWNlaXZlcik7XG4gICAgICAgIH1cbiAgICAgIH0pIDogcHJveHlUb1VzZTtcbiAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVZOb2RlKFxuICAgICAgICByZW5kZXIuY2FsbChcbiAgICAgICAgICB0aGlzUHJveHksXG4gICAgICAgICAgcHJveHlUb1VzZSxcbiAgICAgICAgICByZW5kZXJDYWNoZSxcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHByb3BzKSA6IHByb3BzLFxuICAgICAgICAgIHNldHVwU3RhdGUsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBhdHRycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVuZGVyMiA9IENvbXBvbmVudDtcbiAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIGF0dHJzID09PSBwcm9wcykge1xuICAgICAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gbm9ybWFsaXplVk5vZGUoXG4gICAgICAgIHJlbmRlcjIubGVuZ3RoID4gMSA/IHJlbmRlcjIoXG4gICAgICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNoYWxsb3dSZWFkb25seShwcm9wcykgOiBwcm9wcyxcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICAgICAgICAgICAgZ2V0IGF0dHJzKCkge1xuICAgICAgICAgICAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgICAgICAgICAgICByZXR1cm4gc2hhbGxvd1JlYWRvbmx5KGF0dHJzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbG90cyxcbiAgICAgICAgICAgIGVtaXRcbiAgICAgICAgICB9IDogeyBhdHRycywgc2xvdHMsIGVtaXQgfVxuICAgICAgICApIDogcmVuZGVyMihcbiAgICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2hhbGxvd1JlYWRvbmx5KHByb3BzKSA6IHByb3BzLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZhbGx0aHJvdWdoQXR0cnMgPSBDb21wb25lbnQucHJvcHMgPyBhdHRycyA6IGdldEZ1bmN0aW9uYWxGYWxsdGhyb3VnaChhdHRycyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBibG9ja1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgaGFuZGxlRXJyb3IoZXJyLCBpbnN0YW5jZSwgMSk7XG4gICAgcmVzdWx0ID0gY3JlYXRlVk5vZGUoQ29tbWVudCk7XG4gIH1cbiAgbGV0IHJvb3QgPSByZXN1bHQ7XG4gIGxldCBzZXRSb290ID0gdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZXN1bHQucGF0Y2hGbGFnID4gMCAmJiByZXN1bHQucGF0Y2hGbGFnICYgMjA0OCkge1xuICAgIFtyb290LCBzZXRSb290XSA9IGdldENoaWxkUm9vdChyZXN1bHQpO1xuICB9XG4gIGlmIChmYWxsdGhyb3VnaEF0dHJzICYmIGluaGVyaXRBdHRycyAhPT0gZmFsc2UpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmFsbHRocm91Z2hBdHRycyk7XG4gICAgY29uc3QgeyBzaGFwZUZsYWcgfSA9IHJvb3Q7XG4gICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2hhcGVGbGFnICYgKDEgfCA2KSkge1xuICAgICAgICBpZiAocHJvcHNPcHRpb25zICYmIGtleXMuc29tZShpc01vZGVsTGlzdGVuZXIpKSB7XG4gICAgICAgICAgZmFsbHRocm91Z2hBdHRycyA9IGZpbHRlck1vZGVsTGlzdGVuZXJzKFxuICAgICAgICAgICAgZmFsbHRocm91Z2hBdHRycyxcbiAgICAgICAgICAgIHByb3BzT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgZmFsbHRocm91Z2hBdHRycywgZmFsc2UsIHRydWUpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFhY2Nlc3NlZEF0dHJzICYmIHJvb3QudHlwZSAhPT0gQ29tbWVudCkge1xuICAgICAgICBjb25zdCBhbGxBdHRycyA9IE9iamVjdC5rZXlzKGF0dHJzKTtcbiAgICAgICAgY29uc3QgZXZlbnRBdHRycyA9IFtdO1xuICAgICAgICBjb25zdCBleHRyYUF0dHJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gYWxsQXR0cnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYWxsQXR0cnNbaV07XG4gICAgICAgICAgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICAgICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSkge1xuICAgICAgICAgICAgICBldmVudEF0dHJzLnB1c2goa2V5WzJdLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBleHRyYUF0dHJzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dHJhQXR0cnMubGVuZ3RoKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYEV4dHJhbmVvdXMgbm9uLXByb3BzIGF0dHJpYnV0ZXMgKCR7ZXh0cmFBdHRycy5qb2luKFwiLCBcIil9KSB3ZXJlIHBhc3NlZCB0byBjb21wb25lbnQgYnV0IGNvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBiZWNhdXNlIGNvbXBvbmVudCByZW5kZXJzIGZyYWdtZW50IG9yIHRleHQgcm9vdCBub2Rlcy5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnRBdHRycy5sZW5ndGgpIHtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgRXh0cmFuZW91cyBub24tZW1pdHMgZXZlbnQgbGlzdGVuZXJzICgke2V2ZW50QXR0cnMuam9pbihcIiwgXCIpfSkgd2VyZSBwYXNzZWQgdG8gY29tcG9uZW50IGJ1dCBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgYmVjYXVzZSBjb21wb25lbnQgcmVuZGVycyBmcmFnbWVudCBvciB0ZXh0IHJvb3Qgbm9kZXMuIElmIHRoZSBsaXN0ZW5lciBpcyBpbnRlbmRlZCB0byBiZSBhIGNvbXBvbmVudCBjdXN0b20gZXZlbnQgbGlzdGVuZXIgb25seSwgZGVjbGFyZSBpdCB1c2luZyB0aGUgXCJlbWl0c1wiIG9wdGlvbi5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodm5vZGUuZGlycykge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpc0VsZW1lbnRSb290KHJvb3QpKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBSdW50aW1lIGRpcmVjdGl2ZSB1c2VkIG9uIGNvbXBvbmVudCB3aXRoIG5vbi1lbGVtZW50IHJvb3Qgbm9kZS4gVGhlIGRpcmVjdGl2ZXMgd2lsbCBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcm9vdCA9IGNsb25lVk5vZGUocm9vdCwgbnVsbCwgZmFsc2UsIHRydWUpO1xuICAgIHJvb3QuZGlycyA9IHJvb3QuZGlycyA/IHJvb3QuZGlycy5jb25jYXQodm5vZGUuZGlycykgOiB2bm9kZS5kaXJzO1xuICB9XG4gIGlmICh2bm9kZS50cmFuc2l0aW9uKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIWlzRWxlbWVudFJvb3Qocm9vdCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYENvbXBvbmVudCBpbnNpZGUgPFRyYW5zaXRpb24+IHJlbmRlcnMgbm9uLWVsZW1lbnQgcm9vdCBub2RlIHRoYXQgY2Fubm90IGJlIGFuaW1hdGVkLmBcbiAgICAgICk7XG4gICAgfVxuICAgIHNldFRyYW5zaXRpb25Ib29rcyhyb290LCB2bm9kZS50cmFuc2l0aW9uKTtcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzZXRSb290KSB7XG4gICAgc2V0Um9vdChyb290KTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSByb290O1xuICB9XG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZShwcmV2KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IGdldENoaWxkUm9vdCA9ICh2bm9kZSkgPT4ge1xuICBjb25zdCByYXdDaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuO1xuICBjb25zdCBkeW5hbWljQ2hpbGRyZW4gPSB2bm9kZS5keW5hbWljQ2hpbGRyZW47XG4gIGNvbnN0IGNoaWxkUm9vdCA9IGZpbHRlclNpbmdsZVJvb3QocmF3Q2hpbGRyZW4sIGZhbHNlKTtcbiAgaWYgKCFjaGlsZFJvb3QpIHtcbiAgICByZXR1cm4gW3Zub2RlLCB2b2lkIDBdO1xuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hpbGRSb290LnBhdGNoRmxhZyA+IDAgJiYgY2hpbGRSb290LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICByZXR1cm4gZ2V0Q2hpbGRSb290KGNoaWxkUm9vdCk7XG4gIH1cbiAgY29uc3QgaW5kZXggPSByYXdDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCk7XG4gIGNvbnN0IGR5bmFtaWNJbmRleCA9IGR5bmFtaWNDaGlsZHJlbiA/IGR5bmFtaWNDaGlsZHJlbi5pbmRleE9mKGNoaWxkUm9vdCkgOiAtMTtcbiAgY29uc3Qgc2V0Um9vdCA9ICh1cGRhdGVkUm9vdCkgPT4ge1xuICAgIHJhd0NoaWxkcmVuW2luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgIGlmIChkeW5hbWljQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChkeW5hbWljSW5kZXggPiAtMSkge1xuICAgICAgICBkeW5hbWljQ2hpbGRyZW5bZHluYW1pY0luZGV4XSA9IHVwZGF0ZWRSb290O1xuICAgICAgfSBlbHNlIGlmICh1cGRhdGVkUm9vdC5wYXRjaEZsYWcgPiAwKSB7XG4gICAgICAgIHZub2RlLmR5bmFtaWNDaGlsZHJlbiA9IFsuLi5keW5hbWljQ2hpbGRyZW4sIHVwZGF0ZWRSb290XTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBbbm9ybWFsaXplVk5vZGUoY2hpbGRSb290KSwgc2V0Um9vdF07XG59O1xuZnVuY3Rpb24gZmlsdGVyU2luZ2xlUm9vdChjaGlsZHJlbiwgcmVjdXJzZSA9IHRydWUpIHtcbiAgbGV0IHNpbmdsZVJvb3Q7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmIChpc1ZOb2RlKGNoaWxkKSkge1xuICAgICAgaWYgKGNoaWxkLnR5cGUgIT09IENvbW1lbnQgfHwgY2hpbGQuY2hpbGRyZW4gPT09IFwidi1pZlwiKSB7XG4gICAgICAgIGlmIChzaW5nbGVSb290KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNpbmdsZVJvb3QgPSBjaGlsZDtcbiAgICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiByZWN1cnNlICYmIHNpbmdsZVJvb3QucGF0Y2hGbGFnID4gMCAmJiBzaW5nbGVSb290LnBhdGNoRmxhZyAmIDIwNDgpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJTaW5nbGVSb290KHNpbmdsZVJvb3QuY2hpbGRyZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzaW5nbGVSb290O1xufVxuY29uc3QgZ2V0RnVuY3Rpb25hbEZhbGx0aHJvdWdoID0gKGF0dHJzKSA9PiB7XG4gIGxldCByZXM7XG4gIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgaWYgKGtleSA9PT0gXCJjbGFzc1wiIHx8IGtleSA9PT0gXCJzdHlsZVwiIHx8IGlzT24oa2V5KSkge1xuICAgICAgKHJlcyB8fCAocmVzID0ge30pKVtrZXldID0gYXR0cnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5jb25zdCBmaWx0ZXJNb2RlbExpc3RlbmVycyA9IChhdHRycywgcHJvcHMpID0+IHtcbiAgY29uc3QgcmVzID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIGF0dHJzKSB7XG4gICAgaWYgKCFpc01vZGVsTGlzdGVuZXIoa2V5KSB8fCAhKGtleS5zbGljZSg5KSBpbiBwcm9wcykpIHtcbiAgICAgIHJlc1trZXldID0gYXR0cnNba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG5jb25zdCBpc0VsZW1lbnRSb290ID0gKHZub2RlKSA9PiB7XG4gIHJldHVybiB2bm9kZS5zaGFwZUZsYWcgJiAoNiB8IDEpIHx8IHZub2RlLnR5cGUgPT09IENvbW1lbnQ7XG59O1xuZnVuY3Rpb24gc2hvdWxkVXBkYXRlQ29tcG9uZW50KHByZXZWTm9kZSwgbmV4dFZOb2RlLCBvcHRpbWl6ZWQpIHtcbiAgY29uc3QgeyBwcm9wczogcHJldlByb3BzLCBjaGlsZHJlbjogcHJldkNoaWxkcmVuLCBjb21wb25lbnQgfSA9IHByZXZWTm9kZTtcbiAgY29uc3QgeyBwcm9wczogbmV4dFByb3BzLCBjaGlsZHJlbjogbmV4dENoaWxkcmVuLCBwYXRjaEZsYWcgfSA9IG5leHRWTm9kZTtcbiAgY29uc3QgZW1pdHMgPSBjb21wb25lbnQuZW1pdHNPcHRpb25zO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiAocHJldkNoaWxkcmVuIHx8IG5leHRDaGlsZHJlbikgJiYgaXNIbXJVcGRhdGluZykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChuZXh0Vk5vZGUuZGlycyB8fCBuZXh0Vk5vZGUudHJhbnNpdGlvbikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChvcHRpbWl6ZWQgJiYgcGF0Y2hGbGFnID49IDApIHtcbiAgICBpZiAocGF0Y2hGbGFnICYgMTAyNCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwYXRjaEZsYWcgJiAxNikge1xuICAgICAgaWYgKCFwcmV2UHJvcHMpIHtcbiAgICAgICAgcmV0dXJuICEhbmV4dFByb3BzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc1Byb3BzQ2hhbmdlZChwcmV2UHJvcHMsIG5leHRQcm9wcywgZW1pdHMpO1xuICAgIH0gZWxzZSBpZiAocGF0Y2hGbGFnICYgOCkge1xuICAgICAgY29uc3QgZHluYW1pY1Byb3BzID0gbmV4dFZOb2RlLmR5bmFtaWNQcm9wcztcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHluYW1pY1Byb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGR5bmFtaWNQcm9wc1tpXTtcbiAgICAgICAgaWYgKG5leHRQcm9wc1trZXldICE9PSBwcmV2UHJvcHNba2V5XSAmJiAhaXNFbWl0TGlzdGVuZXIoZW1pdHMsIGtleSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAocHJldkNoaWxkcmVuIHx8IG5leHRDaGlsZHJlbikge1xuICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4gfHwgIW5leHRDaGlsZHJlbi4kc3RhYmxlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJldlByb3BzID09PSBuZXh0UHJvcHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFwcmV2UHJvcHMpIHtcbiAgICAgIHJldHVybiAhIW5leHRQcm9wcztcbiAgICB9XG4gICAgaWYgKCFuZXh0UHJvcHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0cyk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaGFzUHJvcHNDaGFuZ2VkKHByZXZQcm9wcywgbmV4dFByb3BzLCBlbWl0c09wdGlvbnMpIHtcbiAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpO1xuICBpZiAobmV4dEtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhwcmV2UHJvcHMpLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV4dEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBuZXh0S2V5c1tpXTtcbiAgICBpZiAobmV4dFByb3BzW2tleV0gIT09IHByZXZQcm9wc1trZXldICYmICFpc0VtaXRMaXN0ZW5lcihlbWl0c09wdGlvbnMsIGtleSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiB1cGRhdGVIT0NIb3N0RWwoeyB2bm9kZSwgcGFyZW50IH0sIGVsKSB7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBjb25zdCByb290ID0gcGFyZW50LnN1YlRyZWU7XG4gICAgaWYgKHJvb3Quc3VzcGVuc2UgJiYgcm9vdC5zdXNwZW5zZS5hY3RpdmVCcmFuY2ggPT09IHZub2RlKSB7XG4gICAgICByb290LmVsID0gdm5vZGUuZWw7XG4gICAgfVxuICAgIGlmIChyb290ID09PSB2bm9kZSkge1xuICAgICAgKHZub2RlID0gcGFyZW50LnZub2RlKS5lbCA9IGVsO1xuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzU3VzcGVuc2UgPSAodHlwZSkgPT4gdHlwZS5fX2lzU3VzcGVuc2U7XG5sZXQgc3VzcGVuc2VJZCA9IDA7XG5jb25zdCBTdXNwZW5zZUltcGwgPSB7XG4gIG5hbWU6IFwiU3VzcGVuc2VcIixcbiAgLy8gSW4gb3JkZXIgdG8gbWFrZSBTdXNwZW5zZSB0cmVlLXNoYWthYmxlLCB3ZSBuZWVkIHRvIGF2b2lkIGltcG9ydGluZyBpdFxuICAvLyBkaXJlY3RseSBpbiB0aGUgcmVuZGVyZXIuIFRoZSByZW5kZXJlciBjaGVja3MgZm9yIHRoZSBfX2lzU3VzcGVuc2UgZmxhZ1xuICAvLyBvbiBhIHZub2RlJ3MgdHlwZSBhbmQgY2FsbHMgdGhlIGBwcm9jZXNzYCBtZXRob2QsIHBhc3NpbmcgaW4gcmVuZGVyZXJcbiAgLy8gaW50ZXJuYWxzLlxuICBfX2lzU3VzcGVuc2U6IHRydWUsXG4gIHByb2Nlc3MobjEsIG4yLCBjb250YWluZXIsIGFuY2hvciwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMpIHtcbiAgICBpZiAobjEgPT0gbnVsbCkge1xuICAgICAgbW91bnRTdXNwZW5zZShcbiAgICAgICAgbjIsXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgYW5jaG9yLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHBhcmVudFN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICByZW5kZXJlckludGVybmFsc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLmRlcHMgPiAwICYmICFuMS5zdXNwZW5zZS5pc0luRmFsbGJhY2spIHtcbiAgICAgICAgbjIuc3VzcGVuc2UgPSBuMS5zdXNwZW5zZTtcbiAgICAgICAgbjIuc3VzcGVuc2Uudm5vZGUgPSBuMjtcbiAgICAgICAgbjIuZWwgPSBuMS5lbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcGF0Y2hTdXNwZW5zZShcbiAgICAgICAgbjEsXG4gICAgICAgIG4yLFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIGFuY2hvcixcbiAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkLFxuICAgICAgICByZW5kZXJlckludGVybmFsc1xuICAgICAgKTtcbiAgICB9XG4gIH0sXG4gIGh5ZHJhdGU6IGh5ZHJhdGVTdXNwZW5zZSxcbiAgbm9ybWFsaXplOiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuXG59O1xuY29uc3QgU3VzcGVuc2UgPSBTdXNwZW5zZUltcGwgO1xuZnVuY3Rpb24gdHJpZ2dlckV2ZW50KHZub2RlLCBuYW1lKSB7XG4gIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wc1tuYW1lXTtcbiAgaWYgKGlzRnVuY3Rpb24oZXZlbnRMaXN0ZW5lcikpIHtcbiAgICBldmVudExpc3RlbmVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1vdW50U3VzcGVuc2Uodm5vZGUsIGNvbnRhaW5lciwgYW5jaG9yLCBwYXJlbnRDb21wb25lbnQsIHBhcmVudFN1c3BlbnNlLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscykge1xuICBjb25zdCB7XG4gICAgcDogcGF0Y2gsXG4gICAgbzogeyBjcmVhdGVFbGVtZW50IH1cbiAgfSA9IHJlbmRlcmVySW50ZXJuYWxzO1xuICBjb25zdCBoaWRkZW5Db250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzdXNwZW5zZSA9IHZub2RlLnN1c3BlbnNlID0gY3JlYXRlU3VzcGVuc2VCb3VuZGFyeShcbiAgICB2bm9kZSxcbiAgICBwYXJlbnRTdXNwZW5zZSxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgY29udGFpbmVyLFxuICAgIGhpZGRlbkNvbnRhaW5lcixcbiAgICBhbmNob3IsXG4gICAgbmFtZXNwYWNlLFxuICAgIHNsb3RTY29wZUlkcyxcbiAgICBvcHRpbWl6ZWQsXG4gICAgcmVuZGVyZXJJbnRlcm5hbHNcbiAgKTtcbiAgcGF0Y2goXG4gICAgbnVsbCxcbiAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gdm5vZGUuc3NDb250ZW50LFxuICAgIGhpZGRlbkNvbnRhaW5lcixcbiAgICBudWxsLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBzdXNwZW5zZSxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzXG4gICk7XG4gIGlmIChzdXNwZW5zZS5kZXBzID4gMCkge1xuICAgIHRyaWdnZXJFdmVudCh2bm9kZSwgXCJvblBlbmRpbmdcIik7XG4gICAgdHJpZ2dlckV2ZW50KHZub2RlLCBcIm9uRmFsbGJhY2tcIik7XG4gICAgcGF0Y2goXG4gICAgICBudWxsLFxuICAgICAgdm5vZGUuc3NGYWxsYmFjayxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGFuY2hvcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIG51bGwsXG4gICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgbmFtZXNwYWNlLFxuICAgICAgc2xvdFNjb3BlSWRzXG4gICAgKTtcbiAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIHZub2RlLnNzRmFsbGJhY2spO1xuICB9IGVsc2Uge1xuICAgIHN1c3BlbnNlLnJlc29sdmUoZmFsc2UsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwYXRjaFN1c3BlbnNlKG4xLCBuMiwgY29udGFpbmVyLCBhbmNob3IsIHBhcmVudENvbXBvbmVudCwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgeyBwOiBwYXRjaCwgdW06IHVubW91bnQsIG86IHsgY3JlYXRlRWxlbWVudCB9IH0pIHtcbiAgY29uc3Qgc3VzcGVuc2UgPSBuMi5zdXNwZW5zZSA9IG4xLnN1c3BlbnNlO1xuICBzdXNwZW5zZS52bm9kZSA9IG4yO1xuICBuMi5lbCA9IG4xLmVsO1xuICBjb25zdCBuZXdCcmFuY2ggPSBuMi5zc0NvbnRlbnQ7XG4gIGNvbnN0IG5ld0ZhbGxiYWNrID0gbjIuc3NGYWxsYmFjaztcbiAgY29uc3QgeyBhY3RpdmVCcmFuY2gsIHBlbmRpbmdCcmFuY2gsIGlzSW5GYWxsYmFjaywgaXNIeWRyYXRpbmcgfSA9IHN1c3BlbnNlO1xuICBpZiAocGVuZGluZ0JyYW5jaCkge1xuICAgIHN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggPSBuZXdCcmFuY2g7XG4gICAgaWYgKGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIHBlbmRpbmdCcmFuY2gpKSB7XG4gICAgICBwYXRjaChcbiAgICAgICAgcGVuZGluZ0JyYW5jaCxcbiAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgIG51bGwsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBpZiAoc3VzcGVuc2UuZGVwcyA8PSAwKSB7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNJbkZhbGxiYWNrKSB7XG4gICAgICAgIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICBwYXRjaChcbiAgICAgICAgICAgIGFjdGl2ZUJyYW5jaCxcbiAgICAgICAgICAgIG5ld0ZhbGxiYWNrLFxuICAgICAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRyZWUgd2lsbCBub3QgaGF2ZSBzdXNwZW5zZSBjb250ZXh0XG4gICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgbmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1c3BlbnNlLnBlbmRpbmdJZCA9IHN1c3BlbnNlSWQrKztcbiAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICBzdXNwZW5zZS5pc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2ggPSBwZW5kaW5nQnJhbmNoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5tb3VudChwZW5kaW5nQnJhbmNoLCBwYXJlbnRDb21wb25lbnQsIHN1c3BlbnNlKTtcbiAgICAgIH1cbiAgICAgIHN1c3BlbnNlLmRlcHMgPSAwO1xuICAgICAgc3VzcGVuc2UuZWZmZWN0cy5sZW5ndGggPSAwO1xuICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGlmIChpc0luRmFsbGJhY2spIHtcbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXdCcmFuY2gsXG4gICAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIGlmIChzdXNwZW5zZS5kZXBzIDw9IDApIHtcbiAgICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0Y2goXG4gICAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgICBuZXdGYWxsYmFjayxcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAvLyBmYWxsYmFjayB0cmVlIHdpbGwgbm90IGhhdmUgc3VzcGVuc2UgY29udGV4dFxuICAgICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhY3RpdmVCcmFuY2ggJiYgaXNTYW1lVk5vZGVUeXBlKG5ld0JyYW5jaCwgYWN0aXZlQnJhbmNoKSkge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgICAgbmV3QnJhbmNoLFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHN1c3BlbnNlLFxuICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICBzbG90U2NvcGVJZHMsXG4gICAgICAgICAgb3B0aW1pemVkXG4gICAgICAgICk7XG4gICAgICAgIHN1c3BlbnNlLnJlc29sdmUodHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXRjaChcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgICBzdXNwZW5zZS5oaWRkZW5Db250YWluZXIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgICAgbmFtZXNwYWNlLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYWN0aXZlQnJhbmNoICYmIGlzU2FtZVZOb2RlVHlwZShuZXdCcmFuY2gsIGFjdGl2ZUJyYW5jaCkpIHtcbiAgICAgIHBhdGNoKFxuICAgICAgICBhY3RpdmVCcmFuY2gsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgc3VzcGVuc2UsXG4gICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgc2xvdFNjb3BlSWRzLFxuICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICk7XG4gICAgICBzZXRBY3RpdmVCcmFuY2goc3VzcGVuc2UsIG5ld0JyYW5jaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFdmVudChuMiwgXCJvblBlbmRpbmdcIik7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbmV3QnJhbmNoO1xuICAgICAgaWYgKG5ld0JyYW5jaC5zaGFwZUZsYWcgJiA1MTIpIHtcbiAgICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gbmV3QnJhbmNoLmNvbXBvbmVudC5zdXNwZW5zZUlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3VzcGVuc2UucGVuZGluZ0lkID0gc3VzcGVuc2VJZCsrO1xuICAgICAgfVxuICAgICAgcGF0Y2goXG4gICAgICAgIG51bGwsXG4gICAgICAgIG5ld0JyYW5jaCxcbiAgICAgICAgc3VzcGVuc2UuaGlkZGVuQ29udGFpbmVyLFxuICAgICAgICBudWxsLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgICAgIHN1c3BlbnNlLFxuICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgb3B0aW1pemVkXG4gICAgICApO1xuICAgICAgaWYgKHN1c3BlbnNlLmRlcHMgPD0gMCkge1xuICAgICAgICBzdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHRpbWVvdXQsIHBlbmRpbmdJZCB9ID0gc3VzcGVuc2U7XG4gICAgICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdJZCA9PT0gcGVuZGluZ0lkKSB7XG4gICAgICAgICAgICAgIHN1c3BlbnNlLmZhbGxiYWNrKG5ld0ZhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aW1lb3V0ID09PSAwKSB7XG4gICAgICAgICAgc3VzcGVuc2UuZmFsbGJhY2sobmV3RmFsbGJhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgaGFzV2FybmVkID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KHZub2RlLCBwYXJlbnRTdXNwZW5zZSwgcGFyZW50Q29tcG9uZW50LCBjb250YWluZXIsIGhpZGRlbkNvbnRhaW5lciwgYW5jaG9yLCBuYW1lc3BhY2UsIHNsb3RTY29wZUlkcywgb3B0aW1pemVkLCByZW5kZXJlckludGVybmFscywgaXNIeWRyYXRpbmcgPSBmYWxzZSkge1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB0cnVlICYmICFoYXNXYXJuZWQpIHtcbiAgICBoYXNXYXJuZWQgPSB0cnVlO1xuICAgIGNvbnNvbGVbY29uc29sZS5pbmZvID8gXCJpbmZvXCIgOiBcImxvZ1wiXShcbiAgICAgIGA8U3VzcGVuc2U+IGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCBpdHMgQVBJIHdpbGwgbGlrZWx5IGNoYW5nZS5gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7XG4gICAgcDogcGF0Y2gsXG4gICAgbTogbW92ZSxcbiAgICB1bTogdW5tb3VudCxcbiAgICBuOiBuZXh0LFxuICAgIG86IHsgcGFyZW50Tm9kZSwgcmVtb3ZlIH1cbiAgfSA9IHJlbmRlcmVySW50ZXJuYWxzO1xuICBsZXQgcGFyZW50U3VzcGVuc2VJZDtcbiAgY29uc3QgaXNTdXNwZW5zaWJsZSA9IGlzVk5vZGVTdXNwZW5zaWJsZSh2bm9kZSk7XG4gIGlmIChpc1N1c3BlbnNpYmxlKSB7XG4gICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgIHBhcmVudFN1c3BlbnNlSWQgPSBwYXJlbnRTdXNwZW5zZS5wZW5kaW5nSWQ7XG4gICAgICBwYXJlbnRTdXNwZW5zZS5kZXBzKys7XG4gICAgfVxuICB9XG4gIGNvbnN0IHRpbWVvdXQgPSB2bm9kZS5wcm9wcyA/IHRvTnVtYmVyKHZub2RlLnByb3BzLnRpbWVvdXQpIDogdm9pZCAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGFzc2VydE51bWJlcih0aW1lb3V0LCBgU3VzcGVuc2UgdGltZW91dGApO1xuICB9XG4gIGNvbnN0IGluaXRpYWxBbmNob3IgPSBhbmNob3I7XG4gIGNvbnN0IHN1c3BlbnNlID0ge1xuICAgIHZub2RlLFxuICAgIHBhcmVudDogcGFyZW50U3VzcGVuc2UsXG4gICAgcGFyZW50Q29tcG9uZW50LFxuICAgIG5hbWVzcGFjZSxcbiAgICBjb250YWluZXIsXG4gICAgaGlkZGVuQ29udGFpbmVyLFxuICAgIGRlcHM6IDAsXG4gICAgcGVuZGluZ0lkOiBzdXNwZW5zZUlkKyssXG4gICAgdGltZW91dDogdHlwZW9mIHRpbWVvdXQgPT09IFwibnVtYmVyXCIgPyB0aW1lb3V0IDogLTEsXG4gICAgYWN0aXZlQnJhbmNoOiBudWxsLFxuICAgIHBlbmRpbmdCcmFuY2g6IG51bGwsXG4gICAgaXNJbkZhbGxiYWNrOiAhaXNIeWRyYXRpbmcsXG4gICAgaXNIeWRyYXRpbmcsXG4gICAgaXNVbm1vdW50ZWQ6IGZhbHNlLFxuICAgIGVmZmVjdHM6IFtdLFxuICAgIHJlc29sdmUocmVzdW1lID0gZmFsc2UsIHN5bmMgPSBmYWxzZSkge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgaWYgKCFyZXN1bWUgJiYgIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc3VzcGVuc2UucmVzb2x2ZSgpIGlzIGNhbGxlZCB3aXRob3V0IGEgcGVuZGluZyBicmFuY2guYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1c3BlbnNlLmlzVW5tb3VudGVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHN1c3BlbnNlLnJlc29sdmUoKSBpcyBjYWxsZWQgb24gYW4gYWxyZWFkeSB1bm1vdW50ZWQgc3VzcGVuc2UgYm91bmRhcnkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdm5vZGU6IHZub2RlMixcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwZW5kaW5nQnJhbmNoLFxuICAgICAgICBwZW5kaW5nSWQsXG4gICAgICAgIGVmZmVjdHMsXG4gICAgICAgIHBhcmVudENvbXBvbmVudDogcGFyZW50Q29tcG9uZW50MixcbiAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIyXG4gICAgICB9ID0gc3VzcGVuc2U7XG4gICAgICBsZXQgZGVsYXlFbnRlciA9IGZhbHNlO1xuICAgICAgaWYgKHN1c3BlbnNlLmlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHN1c3BlbnNlLmlzSHlkcmF0aW5nID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKCFyZXN1bWUpIHtcbiAgICAgICAgZGVsYXlFbnRlciA9IGFjdGl2ZUJyYW5jaCAmJiBwZW5kaW5nQnJhbmNoLnRyYW5zaXRpb24gJiYgcGVuZGluZ0JyYW5jaC50cmFuc2l0aW9uLm1vZGUgPT09IFwib3V0LWluXCI7XG4gICAgICAgIGlmIChkZWxheUVudGVyKSB7XG4gICAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nSWQgPT09IHN1c3BlbnNlLnBlbmRpbmdJZCkge1xuICAgICAgICAgICAgICBtb3ZlKFxuICAgICAgICAgICAgICAgIHBlbmRpbmdCcmFuY2gsXG4gICAgICAgICAgICAgICAgY29udGFpbmVyMixcbiAgICAgICAgICAgICAgICBhbmNob3IgPT09IGluaXRpYWxBbmNob3IgPyBuZXh0KGFjdGl2ZUJyYW5jaCkgOiBhbmNob3IsXG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGl2ZUJyYW5jaCkge1xuICAgICAgICAgIGlmIChwYXJlbnROb2RlKGFjdGl2ZUJyYW5jaC5lbCkgPT09IGNvbnRhaW5lcjIpIHtcbiAgICAgICAgICAgIGFuY2hvciA9IG5leHQoYWN0aXZlQnJhbmNoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdW5tb3VudChhY3RpdmVCcmFuY2gsIHBhcmVudENvbXBvbmVudDIsIHN1c3BlbnNlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlbGF5RW50ZXIpIHtcbiAgICAgICAgICBtb3ZlKHBlbmRpbmdCcmFuY2gsIGNvbnRhaW5lcjIsIGFuY2hvciwgMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldEFjdGl2ZUJyYW5jaChzdXNwZW5zZSwgcGVuZGluZ0JyYW5jaCk7XG4gICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoID0gbnVsbDtcbiAgICAgIHN1c3BlbnNlLmlzSW5GYWxsYmFjayA9IGZhbHNlO1xuICAgICAgbGV0IHBhcmVudCA9IHN1c3BlbnNlLnBhcmVudDtcbiAgICAgIGxldCBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5wZW5kaW5nQnJhbmNoKSB7XG4gICAgICAgICAgcGFyZW50LmVmZmVjdHMucHVzaCguLi5lZmZlY3RzKTtcbiAgICAgICAgICBoYXNVbnJlc29sdmVkQW5jZXN0b3IgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc1VucmVzb2x2ZWRBbmNlc3RvciAmJiAhZGVsYXlFbnRlcikge1xuICAgICAgICBxdWV1ZVBvc3RGbHVzaENiKGVmZmVjdHMpO1xuICAgICAgfVxuICAgICAgc3VzcGVuc2UuZWZmZWN0cyA9IFtdO1xuICAgICAgaWYgKGlzU3VzcGVuc2libGUpIHtcbiAgICAgICAgaWYgKHBhcmVudFN1c3BlbnNlICYmIHBhcmVudFN1c3BlbnNlLnBlbmRpbmdCcmFuY2ggJiYgcGFyZW50U3VzcGVuc2VJZCA9PT0gcGFyZW50U3VzcGVuc2UucGVuZGluZ0lkKSB7XG4gICAgICAgICAgcGFyZW50U3VzcGVuc2UuZGVwcy0tO1xuICAgICAgICAgIGlmIChwYXJlbnRTdXNwZW5zZS5kZXBzID09PSAwICYmICFzeW5jKSB7XG4gICAgICAgICAgICBwYXJlbnRTdXNwZW5zZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQodm5vZGUyLCBcIm9uUmVzb2x2ZVwiKTtcbiAgICB9LFxuICAgIGZhbGxiYWNrKGZhbGxiYWNrVk5vZGUpIHtcbiAgICAgIGlmICghc3VzcGVuc2UucGVuZGluZ0JyYW5jaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIsIGFjdGl2ZUJyYW5jaCwgcGFyZW50Q29tcG9uZW50OiBwYXJlbnRDb21wb25lbnQyLCBjb250YWluZXI6IGNvbnRhaW5lcjIsIG5hbWVzcGFjZTogbmFtZXNwYWNlMiB9ID0gc3VzcGVuc2U7XG4gICAgICB0cmlnZ2VyRXZlbnQodm5vZGUyLCBcIm9uRmFsbGJhY2tcIik7XG4gICAgICBjb25zdCBhbmNob3IyID0gbmV4dChhY3RpdmVCcmFuY2gpO1xuICAgICAgY29uc3QgbW91bnRGYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFzdXNwZW5zZS5pc0luRmFsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2goXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBmYWxsYmFja1ZOb2RlLFxuICAgICAgICAgIGNvbnRhaW5lcjIsXG4gICAgICAgICAgYW5jaG9yMixcbiAgICAgICAgICBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgLy8gZmFsbGJhY2sgdHJlZSB3aWxsIG5vdCBoYXZlIHN1c3BlbnNlIGNvbnRleHRcbiAgICAgICAgICBuYW1lc3BhY2UyLFxuICAgICAgICAgIHNsb3RTY29wZUlkcyxcbiAgICAgICAgICBvcHRpbWl6ZWRcbiAgICAgICAgKTtcbiAgICAgICAgc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBmYWxsYmFja1ZOb2RlKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWxheUVudGVyID0gZmFsbGJhY2tWTm9kZS50cmFuc2l0aW9uICYmIGZhbGxiYWNrVk5vZGUudHJhbnNpdGlvbi5tb2RlID09PSBcIm91dC1pblwiO1xuICAgICAgaWYgKGRlbGF5RW50ZXIpIHtcbiAgICAgICAgYWN0aXZlQnJhbmNoLnRyYW5zaXRpb24uYWZ0ZXJMZWF2ZSA9IG1vdW50RmFsbGJhY2s7XG4gICAgICB9XG4gICAgICBzdXNwZW5zZS5pc0luRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgdW5tb3VudChcbiAgICAgICAgYWN0aXZlQnJhbmNoLFxuICAgICAgICBwYXJlbnRDb21wb25lbnQyLFxuICAgICAgICBudWxsLFxuICAgICAgICAvLyBubyBzdXNwZW5zZSBzbyB1bm1vdW50IGhvb2tzIGZpcmUgbm93XG4gICAgICAgIHRydWVcbiAgICAgICAgLy8gc2hvdWxkUmVtb3ZlXG4gICAgICApO1xuICAgICAgaWYgKCFkZWxheUVudGVyKSB7XG4gICAgICAgIG1vdW50RmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1vdmUoY29udGFpbmVyMiwgYW5jaG9yMiwgdHlwZSkge1xuICAgICAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoICYmIG1vdmUoc3VzcGVuc2UuYWN0aXZlQnJhbmNoLCBjb250YWluZXIyLCBhbmNob3IyLCB0eXBlKTtcbiAgICAgIHN1c3BlbnNlLmNvbnRhaW5lciA9IGNvbnRhaW5lcjI7XG4gICAgfSxcbiAgICBuZXh0KCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCAmJiBuZXh0KHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCk7XG4gICAgfSxcbiAgICByZWdpc3RlckRlcChpbnN0YW5jZSwgc2V0dXBSZW5kZXJFZmZlY3QsIG9wdGltaXplZDIpIHtcbiAgICAgIGNvbnN0IGlzSW5QZW5kaW5nU3VzcGVuc2UgPSAhIXN1c3BlbnNlLnBlbmRpbmdCcmFuY2g7XG4gICAgICBpZiAoaXNJblBlbmRpbmdTdXNwZW5zZSkge1xuICAgICAgICBzdXNwZW5zZS5kZXBzKys7XG4gICAgICB9XG4gICAgICBjb25zdCBoeWRyYXRlZEVsID0gaW5zdGFuY2Uudm5vZGUuZWw7XG4gICAgICBpbnN0YW5jZS5hc3luY0RlcC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVyciwgaW5zdGFuY2UsIDApO1xuICAgICAgfSkudGhlbigoYXN5bmNTZXR1cFJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoaW5zdGFuY2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UuaXNVbm1vdW50ZWQgfHwgc3VzcGVuc2UucGVuZGluZ0lkICE9PSBpbnN0YW5jZS5zdXNwZW5zZUlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlLmFzeW5jUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IHZub2RlOiB2bm9kZTIgfSA9IGluc3RhbmNlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIHB1c2hXYXJuaW5nQ29udGV4dCh2bm9kZTIpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZVNldHVwUmVzdWx0KGluc3RhbmNlLCBhc3luY1NldHVwUmVzdWx0LCBmYWxzZSk7XG4gICAgICAgIGlmIChoeWRyYXRlZEVsKSB7XG4gICAgICAgICAgdm5vZGUyLmVsID0gaHlkcmF0ZWRFbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICFoeWRyYXRlZEVsICYmIGluc3RhbmNlLnN1YlRyZWUuZWw7XG4gICAgICAgIHNldHVwUmVuZGVyRWZmZWN0KFxuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIHZub2RlMixcbiAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGhhdmUgYmVlbiBtb3ZlZCBiZWZvcmUgcmVzb2x2ZS5cbiAgICAgICAgICAvLyBpZiB0aGlzIGlzIG5vdCBhIGh5ZHJhdGlvbiwgaW5zdGFuY2Uuc3ViVHJlZSB3aWxsIGJlIHRoZSBjb21tZW50XG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIuXG4gICAgICAgICAgcGFyZW50Tm9kZShoeWRyYXRlZEVsIHx8IGluc3RhbmNlLnN1YlRyZWUuZWwpLFxuICAgICAgICAgIC8vIGFuY2hvciB3aWxsIG5vdCBiZSB1c2VkIGlmIHRoaXMgaXMgaHlkcmF0aW9uLCBzbyBvbmx5IG5lZWQgdG9cbiAgICAgICAgICAvLyBjb25zaWRlciB0aGUgY29tbWVudCBwbGFjZWhvbGRlciBjYXNlLlxuICAgICAgICAgIGh5ZHJhdGVkRWwgPyBudWxsIDogbmV4dChpbnN0YW5jZS5zdWJUcmVlKSxcbiAgICAgICAgICBzdXNwZW5zZSxcbiAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgb3B0aW1pemVkMlxuICAgICAgICApO1xuICAgICAgICBpZiAocGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICByZW1vdmUocGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHVwZGF0ZUhPQ0hvc3RFbChpbnN0YW5jZSwgdm5vZGUyLmVsKTtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBwb3BXYXJuaW5nQ29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luUGVuZGluZ1N1c3BlbnNlICYmIC0tc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgICAgICAgIHN1c3BlbnNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB1bm1vdW50KHBhcmVudFN1c3BlbnNlMiwgZG9SZW1vdmUpIHtcbiAgICAgIHN1c3BlbnNlLmlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzdXNwZW5zZS5hY3RpdmVCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5hY3RpdmVCcmFuY2gsXG4gICAgICAgICAgcGFyZW50Q29tcG9uZW50LFxuICAgICAgICAgIHBhcmVudFN1c3BlbnNlMixcbiAgICAgICAgICBkb1JlbW92ZVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN1c3BlbnNlLnBlbmRpbmdCcmFuY2gpIHtcbiAgICAgICAgdW5tb3VudChcbiAgICAgICAgICBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoLFxuICAgICAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgICAgICBwYXJlbnRTdXNwZW5zZTIsXG4gICAgICAgICAgZG9SZW1vdmVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBzdXNwZW5zZTtcbn1cbmZ1bmN0aW9uIGh5ZHJhdGVTdXNwZW5zZShub2RlLCB2bm9kZSwgcGFyZW50Q29tcG9uZW50LCBwYXJlbnRTdXNwZW5zZSwgbmFtZXNwYWNlLCBzbG90U2NvcGVJZHMsIG9wdGltaXplZCwgcmVuZGVyZXJJbnRlcm5hbHMsIGh5ZHJhdGVOb2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNlID0gdm5vZGUuc3VzcGVuc2UgPSBjcmVhdGVTdXNwZW5zZUJvdW5kYXJ5KFxuICAgIHZub2RlLFxuICAgIHBhcmVudFN1c3BlbnNlLFxuICAgIHBhcmVudENvbXBvbmVudCxcbiAgICBub2RlLnBhcmVudE5vZGUsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgbnVsbCxcbiAgICBuYW1lc3BhY2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZCxcbiAgICByZW5kZXJlckludGVybmFscyxcbiAgICB0cnVlXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IGh5ZHJhdGVOb2RlKFxuICAgIG5vZGUsXG4gICAgc3VzcGVuc2UucGVuZGluZ0JyYW5jaCA9IHZub2RlLnNzQ29udGVudCxcbiAgICBwYXJlbnRDb21wb25lbnQsXG4gICAgc3VzcGVuc2UsXG4gICAgc2xvdFNjb3BlSWRzLFxuICAgIG9wdGltaXplZFxuICApO1xuICBpZiAoc3VzcGVuc2UuZGVwcyA9PT0gMCkge1xuICAgIHN1c3BlbnNlLnJlc29sdmUoZmFsc2UsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZUNoaWxkcmVuKHZub2RlKSB7XG4gIGNvbnN0IHsgc2hhcGVGbGFnLCBjaGlsZHJlbiB9ID0gdm5vZGU7XG4gIGNvbnN0IGlzU2xvdENoaWxkcmVuID0gc2hhcGVGbGFnICYgMzI7XG4gIHZub2RlLnNzQ29udGVudCA9IG5vcm1hbGl6ZVN1c3BlbnNlU2xvdChcbiAgICBpc1Nsb3RDaGlsZHJlbiA/IGNoaWxkcmVuLmRlZmF1bHQgOiBjaGlsZHJlblxuICApO1xuICB2bm9kZS5zc0ZhbGxiYWNrID0gaXNTbG90Q2hpbGRyZW4gPyBub3JtYWxpemVTdXNwZW5zZVNsb3QoY2hpbGRyZW4uZmFsbGJhY2spIDogY3JlYXRlVk5vZGUoQ29tbWVudCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVTdXNwZW5zZVNsb3Qocykge1xuICBsZXQgYmxvY2s7XG4gIGlmIChpc0Z1bmN0aW9uKHMpKSB7XG4gICAgY29uc3QgdHJhY2tCbG9jayA9IGlzQmxvY2tUcmVlRW5hYmxlZCAmJiBzLl9jO1xuICAgIGlmICh0cmFja0Jsb2NrKSB7XG4gICAgICBzLl9kID0gZmFsc2U7XG4gICAgICBvcGVuQmxvY2soKTtcbiAgICB9XG4gICAgcyA9IHMoKTtcbiAgICBpZiAodHJhY2tCbG9jaykge1xuICAgICAgcy5fZCA9IHRydWU7XG4gICAgICBibG9jayA9IGN1cnJlbnRCbG9jaztcbiAgICAgIGNsb3NlQmxvY2soKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQXJyYXkocykpIHtcbiAgICBjb25zdCBzaW5nbGVDaGlsZCA9IGZpbHRlclNpbmdsZVJvb3Qocyk7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXNpbmdsZUNoaWxkICYmIHMuZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQgIT09IE5VTExfRFlOQU1JQ19DT01QT05FTlQpLmxlbmd0aCA+IDApIHtcbiAgICAgIHdhcm4kMShgPFN1c3BlbnNlPiBzbG90cyBleHBlY3QgYSBzaW5nbGUgcm9vdCBub2RlLmApO1xuICAgIH1cbiAgICBzID0gc2luZ2xlQ2hpbGQ7XG4gIH1cbiAgcyA9IG5vcm1hbGl6ZVZOb2RlKHMpO1xuICBpZiAoYmxvY2sgJiYgIXMuZHluYW1pY0NoaWxkcmVuKSB7XG4gICAgcy5keW5hbWljQ2hpbGRyZW4gPSBibG9jay5maWx0ZXIoKGMpID0+IGMgIT09IHMpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gcXVldWVFZmZlY3RXaXRoU3VzcGVuc2UoZm4sIHN1c3BlbnNlKSB7XG4gIGlmIChzdXNwZW5zZSAmJiBzdXNwZW5zZS5wZW5kaW5nQnJhbmNoKSB7XG4gICAgaWYgKGlzQXJyYXkoZm4pKSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goLi4uZm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXNwZW5zZS5lZmZlY3RzLnB1c2goZm4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBxdWV1ZVBvc3RGbHVzaENiKGZuKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0QWN0aXZlQnJhbmNoKHN1c3BlbnNlLCBicmFuY2gpIHtcbiAgc3VzcGVuc2UuYWN0aXZlQnJhbmNoID0gYnJhbmNoO1xuICBjb25zdCB7IHZub2RlLCBwYXJlbnRDb21wb25lbnQgfSA9IHN1c3BlbnNlO1xuICBsZXQgZWwgPSBicmFuY2guZWw7XG4gIHdoaWxlICghZWwgJiYgYnJhbmNoLmNvbXBvbmVudCkge1xuICAgIGJyYW5jaCA9IGJyYW5jaC5jb21wb25lbnQuc3ViVHJlZTtcbiAgICBlbCA9IGJyYW5jaC5lbDtcbiAgfVxuICB2bm9kZS5lbCA9IGVsO1xuICBpZiAocGFyZW50Q29tcG9uZW50ICYmIHBhcmVudENvbXBvbmVudC5zdWJUcmVlID09PSB2bm9kZSkge1xuICAgIHBhcmVudENvbXBvbmVudC52bm9kZS5lbCA9IGVsO1xuICAgIHVwZGF0ZUhPQ0hvc3RFbChwYXJlbnRDb21wb25lbnQsIGVsKTtcbiAgfVxufVxuZnVuY3Rpb24gaXNWTm9kZVN1c3BlbnNpYmxlKHZub2RlKSB7XG4gIGNvbnN0IHN1c3BlbnNpYmxlID0gdm5vZGUucHJvcHMgJiYgdm5vZGUucHJvcHMuc3VzcGVuc2libGU7XG4gIHJldHVybiBzdXNwZW5zaWJsZSAhPSBudWxsICYmIHN1c3BlbnNpYmxlICE9PSBmYWxzZTtcbn1cblxuY29uc3QgRnJhZ21lbnQgPSBTeW1ib2wuZm9yKFwidi1mZ3RcIik7XG5jb25zdCBUZXh0ID0gU3ltYm9sLmZvcihcInYtdHh0XCIpO1xuY29uc3QgQ29tbWVudCA9IFN5bWJvbC5mb3IoXCJ2LWNtdFwiKTtcbmNvbnN0IFN0YXRpYyA9IFN5bWJvbC5mb3IoXCJ2LXN0Y1wiKTtcbmNvbnN0IGJsb2NrU3RhY2sgPSBbXTtcbmxldCBjdXJyZW50QmxvY2sgPSBudWxsO1xuZnVuY3Rpb24gb3BlbkJsb2NrKGRpc2FibGVUcmFja2luZyA9IGZhbHNlKSB7XG4gIGJsb2NrU3RhY2sucHVzaChjdXJyZW50QmxvY2sgPSBkaXNhYmxlVHJhY2tpbmcgPyBudWxsIDogW10pO1xufVxuZnVuY3Rpb24gY2xvc2VCbG9jaygpIHtcbiAgYmxvY2tTdGFjay5wb3AoKTtcbiAgY3VycmVudEJsb2NrID0gYmxvY2tTdGFja1tibG9ja1N0YWNrLmxlbmd0aCAtIDFdIHx8IG51bGw7XG59XG5sZXQgaXNCbG9ja1RyZWVFbmFibGVkID0gMTtcbmZ1bmN0aW9uIHNldEJsb2NrVHJhY2tpbmcodmFsdWUpIHtcbiAgaXNCbG9ja1RyZWVFbmFibGVkICs9IHZhbHVlO1xuICBpZiAodmFsdWUgPCAwICYmIGN1cnJlbnRCbG9jaykge1xuICAgIGN1cnJlbnRCbG9jay5oYXNPbmNlID0gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0dXBCbG9jayh2bm9kZSkge1xuICB2bm9kZS5keW5hbWljQ2hpbGRyZW4gPSBpc0Jsb2NrVHJlZUVuYWJsZWQgPiAwID8gY3VycmVudEJsb2NrIHx8IEVNUFRZX0FSUiA6IG51bGw7XG4gIGNsb3NlQmxvY2soKTtcbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2godm5vZGUpO1xuICB9XG4gIHJldHVybiB2bm9kZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRCbG9jayh0eXBlLCBwcm9wcywgY2hpbGRyZW4sIHBhdGNoRmxhZywgZHluYW1pY1Byb3BzLCBzaGFwZUZsYWcpIHtcbiAgcmV0dXJuIHNldHVwQmxvY2soXG4gICAgY3JlYXRlQmFzZVZOb2RlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgY2hpbGRyZW4sXG4gICAgICBwYXRjaEZsYWcsXG4gICAgICBkeW5hbWljUHJvcHMsXG4gICAgICBzaGFwZUZsYWcsXG4gICAgICB0cnVlXG4gICAgKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlQmxvY2sodHlwZSwgcHJvcHMsIGNoaWxkcmVuLCBwYXRjaEZsYWcsIGR5bmFtaWNQcm9wcykge1xuICByZXR1cm4gc2V0dXBCbG9jayhcbiAgICBjcmVhdGVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgcGF0Y2hGbGFnLFxuICAgICAgZHluYW1pY1Byb3BzLFxuICAgICAgdHJ1ZVxuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzVk5vZGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID8gdmFsdWUuX192X2lzVk5vZGUgPT09IHRydWUgOiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2FtZVZOb2RlVHlwZShuMSwgbjIpIHtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgbjIuc2hhcGVGbGFnICYgNiAmJiBuMS5jb21wb25lbnQpIHtcbiAgICBjb25zdCBkaXJ0eUluc3RhbmNlcyA9IGhtckRpcnR5Q29tcG9uZW50cy5nZXQobjIudHlwZSk7XG4gICAgaWYgKGRpcnR5SW5zdGFuY2VzICYmIGRpcnR5SW5zdGFuY2VzLmhhcyhuMS5jb21wb25lbnQpKSB7XG4gICAgICBuMS5zaGFwZUZsYWcgJj0gfjI1NjtcbiAgICAgIG4yLnNoYXBlRmxhZyAmPSB+NTEyO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbjEudHlwZSA9PT0gbjIudHlwZSAmJiBuMS5rZXkgPT09IG4yLmtleTtcbn1cbmxldCB2bm9kZUFyZ3NUcmFuc2Zvcm1lcjtcbmZ1bmN0aW9uIHRyYW5zZm9ybVZOb2RlQXJncyh0cmFuc2Zvcm1lcikge1xuICB2bm9kZUFyZ3NUcmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyO1xufVxuY29uc3QgY3JlYXRlVk5vZGVXaXRoQXJnc1RyYW5zZm9ybSA9ICguLi5hcmdzKSA9PiB7XG4gIHJldHVybiBfY3JlYXRlVk5vZGUoXG4gICAgLi4udm5vZGVBcmdzVHJhbnNmb3JtZXIgPyB2bm9kZUFyZ3NUcmFuc2Zvcm1lcihhcmdzLCBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIDogYXJnc1xuICApO1xufTtcbmNvbnN0IG5vcm1hbGl6ZUtleSA9ICh7IGtleSB9KSA9PiBrZXkgIT0gbnVsbCA/IGtleSA6IG51bGw7XG5jb25zdCBub3JtYWxpemVSZWYgPSAoe1xuICByZWYsXG4gIHJlZl9rZXksXG4gIHJlZl9mb3Jcbn0pID0+IHtcbiAgaWYgKHR5cGVvZiByZWYgPT09IFwibnVtYmVyXCIpIHtcbiAgICByZWYgPSBcIlwiICsgcmVmO1xuICB9XG4gIHJldHVybiByZWYgIT0gbnVsbCA/IGlzU3RyaW5nKHJlZikgfHwgaXNSZWYocmVmKSB8fCBpc0Z1bmN0aW9uKHJlZikgPyB7IGk6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSwgcjogcmVmLCBrOiByZWZfa2V5LCBmOiAhIXJlZl9mb3IgfSA6IHJlZiA6IG51bGw7XG59O1xuZnVuY3Rpb24gY3JlYXRlQmFzZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBzaGFwZUZsYWcgPSB0eXBlID09PSBGcmFnbWVudCA/IDAgOiAxLCBpc0Jsb2NrTm9kZSA9IGZhbHNlLCBuZWVkRnVsbENoaWxkcmVuTm9ybWFsaXphdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHZub2RlID0ge1xuICAgIF9fdl9pc1ZOb2RlOiB0cnVlLFxuICAgIF9fdl9za2lwOiB0cnVlLFxuICAgIHR5cGUsXG4gICAgcHJvcHMsXG4gICAga2V5OiBwcm9wcyAmJiBub3JtYWxpemVLZXkocHJvcHMpLFxuICAgIHJlZjogcHJvcHMgJiYgbm9ybWFsaXplUmVmKHByb3BzKSxcbiAgICBzY29wZUlkOiBjdXJyZW50U2NvcGVJZCxcbiAgICBzbG90U2NvcGVJZHM6IG51bGwsXG4gICAgY2hpbGRyZW4sXG4gICAgY29tcG9uZW50OiBudWxsLFxuICAgIHN1c3BlbnNlOiBudWxsLFxuICAgIHNzQ29udGVudDogbnVsbCxcbiAgICBzc0ZhbGxiYWNrOiBudWxsLFxuICAgIGRpcnM6IG51bGwsXG4gICAgdHJhbnNpdGlvbjogbnVsbCxcbiAgICBlbDogbnVsbCxcbiAgICBhbmNob3I6IG51bGwsXG4gICAgdGFyZ2V0OiBudWxsLFxuICAgIHRhcmdldFN0YXJ0OiBudWxsLFxuICAgIHRhcmdldEFuY2hvcjogbnVsbCxcbiAgICBzdGF0aWNDb3VudDogMCxcbiAgICBzaGFwZUZsYWcsXG4gICAgcGF0Y2hGbGFnLFxuICAgIGR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IG51bGwsXG4gICAgYXBwQ29udGV4dDogbnVsbCxcbiAgICBjdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZVxuICB9O1xuICBpZiAobmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24pIHtcbiAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pO1xuICAgIGlmIChzaGFwZUZsYWcgJiAxMjgpIHtcbiAgICAgIHR5cGUubm9ybWFsaXplKHZub2RlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICB2bm9kZS5zaGFwZUZsYWcgfD0gaXNTdHJpbmcoY2hpbGRyZW4pID8gOCA6IDE2O1xuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHZub2RlLmtleSAhPT0gdm5vZGUua2V5KSB7XG4gICAgd2FybiQxKGBWTm9kZSBjcmVhdGVkIHdpdGggaW52YWxpZCBrZXkgKE5hTikuIFZOb2RlIHR5cGU6YCwgdm5vZGUudHlwZSk7XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgLy8gYXZvaWQgYSBibG9jayBub2RlIGZyb20gdHJhY2tpbmcgaXRzZWxmXG4gICFpc0Jsb2NrTm9kZSAmJiAvLyBoYXMgY3VycmVudCBwYXJlbnQgYmxvY2tcbiAgY3VycmVudEJsb2NrICYmIC8vIHByZXNlbmNlIG9mIGEgcGF0Y2ggZmxhZyBpbmRpY2F0ZXMgdGhpcyBub2RlIG5lZWRzIHBhdGNoaW5nIG9uIHVwZGF0ZXMuXG4gIC8vIGNvbXBvbmVudCBub2RlcyBhbHNvIHNob3VsZCBhbHdheXMgYmUgcGF0Y2hlZCwgYmVjYXVzZSBldmVuIGlmIHRoZVxuICAvLyBjb21wb25lbnQgZG9lc24ndCBuZWVkIHRvIHVwZGF0ZSwgaXQgbmVlZHMgdG8gcGVyc2lzdCB0aGUgaW5zdGFuY2Ugb24gdG9cbiAgLy8gdGhlIG5leHQgdm5vZGUgc28gdGhhdCBpdCBjYW4gYmUgcHJvcGVybHkgdW5tb3VudGVkIGxhdGVyLlxuICAodm5vZGUucGF0Y2hGbGFnID4gMCB8fCBzaGFwZUZsYWcgJiA2KSAmJiAvLyB0aGUgRVZFTlRTIGZsYWcgaXMgb25seSBmb3IgaHlkcmF0aW9uIGFuZCBpZiBpdCBpcyB0aGUgb25seSBmbGFnLCB0aGVcbiAgLy8gdm5vZGUgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGR5bmFtaWMgZHVlIHRvIGhhbmRsZXIgY2FjaGluZy5cbiAgdm5vZGUucGF0Y2hGbGFnICE9PSAzMikge1xuICAgIGN1cnJlbnRCbG9jay5wdXNoKHZub2RlKTtcbiAgfVxuICByZXR1cm4gdm5vZGU7XG59XG5jb25zdCBjcmVhdGVWTm9kZSA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBjcmVhdGVWTm9kZVdpdGhBcmdzVHJhbnNmb3JtIDogX2NyZWF0ZVZOb2RlO1xuZnVuY3Rpb24gX2NyZWF0ZVZOb2RlKHR5cGUsIHByb3BzID0gbnVsbCwgY2hpbGRyZW4gPSBudWxsLCBwYXRjaEZsYWcgPSAwLCBkeW5hbWljUHJvcHMgPSBudWxsLCBpc0Jsb2NrTm9kZSA9IGZhbHNlKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlID09PSBOVUxMX0RZTkFNSUNfQ09NUE9ORU5UKSB7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXR5cGUpIHtcbiAgICAgIHdhcm4kMShgSW52YWxpZCB2bm9kZSB0eXBlIHdoZW4gY3JlYXRpbmcgdm5vZGU6ICR7dHlwZX0uYCk7XG4gICAgfVxuICAgIHR5cGUgPSBDb21tZW50O1xuICB9XG4gIGlmIChpc1ZOb2RlKHR5cGUpKSB7XG4gICAgY29uc3QgY2xvbmVkID0gY2xvbmVWTm9kZShcbiAgICAgIHR5cGUsXG4gICAgICBwcm9wcyxcbiAgICAgIHRydWVcbiAgICAgIC8qIG1lcmdlUmVmOiB0cnVlICovXG4gICAgKTtcbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIG5vcm1hbGl6ZUNoaWxkcmVuKGNsb25lZCwgY2hpbGRyZW4pO1xuICAgIH1cbiAgICBpZiAoaXNCbG9ja1RyZWVFbmFibGVkID4gMCAmJiAhaXNCbG9ja05vZGUgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgICBpZiAoY2xvbmVkLnNoYXBlRmxhZyAmIDYpIHtcbiAgICAgICAgY3VycmVudEJsb2NrW2N1cnJlbnRCbG9jay5pbmRleE9mKHR5cGUpXSA9IGNsb25lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRCbG9jay5wdXNoKGNsb25lZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNsb25lZC5wYXRjaEZsYWcgPSAtMjtcbiAgICByZXR1cm4gY2xvbmVkO1xuICB9XG4gIGlmIChpc0NsYXNzQ29tcG9uZW50KHR5cGUpKSB7XG4gICAgdHlwZSA9IHR5cGUuX192Y2NPcHRzO1xuICB9XG4gIGlmIChwcm9wcykge1xuICAgIHByb3BzID0gZ3VhcmRSZWFjdGl2ZVByb3BzKHByb3BzKTtcbiAgICBsZXQgeyBjbGFzczoga2xhc3MsIHN0eWxlIH0gPSBwcm9wcztcbiAgICBpZiAoa2xhc3MgJiYgIWlzU3RyaW5nKGtsYXNzKSkge1xuICAgICAgcHJvcHMuY2xhc3MgPSBub3JtYWxpemVDbGFzcyhrbGFzcyk7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChzdHlsZSkpIHtcbiAgICAgIGlmIChpc1Byb3h5KHN0eWxlKSAmJiAhaXNBcnJheShzdHlsZSkpIHtcbiAgICAgICAgc3R5bGUgPSBleHRlbmQoe30sIHN0eWxlKTtcbiAgICAgIH1cbiAgICAgIHByb3BzLnN0eWxlID0gbm9ybWFsaXplU3R5bGUoc3R5bGUpO1xuICAgIH1cbiAgfVxuICBjb25zdCBzaGFwZUZsYWcgPSBpc1N0cmluZyh0eXBlKSA/IDEgOiBpc1N1c3BlbnNlKHR5cGUpID8gMTI4IDogaXNUZWxlcG9ydCh0eXBlKSA/IDY0IDogaXNPYmplY3QodHlwZSkgPyA0IDogaXNGdW5jdGlvbih0eXBlKSA/IDIgOiAwO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBzaGFwZUZsYWcgJiA0ICYmIGlzUHJveHkodHlwZSkpIHtcbiAgICB0eXBlID0gdG9SYXcodHlwZSk7XG4gICAgd2FybiQxKFxuICAgICAgYFZ1ZSByZWNlaXZlZCBhIENvbXBvbmVudCB0aGF0IHdhcyBtYWRlIGEgcmVhY3RpdmUgb2JqZWN0LiBUaGlzIGNhbiBsZWFkIHRvIHVubmVjZXNzYXJ5IHBlcmZvcm1hbmNlIG92ZXJoZWFkIGFuZCBzaG91bGQgYmUgYXZvaWRlZCBieSBtYXJraW5nIHRoZSBjb21wb25lbnQgd2l0aCBcXGBtYXJrUmF3XFxgIG9yIHVzaW5nIFxcYHNoYWxsb3dSZWZcXGAgaW5zdGVhZCBvZiBcXGByZWZcXGAuYCxcbiAgICAgIGBcbkNvbXBvbmVudCB0aGF0IHdhcyBtYWRlIHJlYWN0aXZlOiBgLFxuICAgICAgdHlwZVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJhc2VWTm9kZShcbiAgICB0eXBlLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHMsXG4gICAgc2hhcGVGbGFnLFxuICAgIGlzQmxvY2tOb2RlLFxuICAgIHRydWVcbiAgKTtcbn1cbmZ1bmN0aW9uIGd1YXJkUmVhY3RpdmVQcm9wcyhwcm9wcykge1xuICBpZiAoIXByb3BzKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGlzUHJveHkocHJvcHMpIHx8IGlzSW50ZXJuYWxPYmplY3QocHJvcHMpID8gZXh0ZW5kKHt9LCBwcm9wcykgOiBwcm9wcztcbn1cbmZ1bmN0aW9uIGNsb25lVk5vZGUodm5vZGUsIGV4dHJhUHJvcHMsIG1lcmdlUmVmID0gZmFsc2UsIGNsb25lVHJhbnNpdGlvbiA9IGZhbHNlKSB7XG4gIGNvbnN0IHsgcHJvcHMsIHJlZiwgcGF0Y2hGbGFnLCBjaGlsZHJlbiwgdHJhbnNpdGlvbiB9ID0gdm5vZGU7XG4gIGNvbnN0IG1lcmdlZFByb3BzID0gZXh0cmFQcm9wcyA/IG1lcmdlUHJvcHMocHJvcHMgfHwge30sIGV4dHJhUHJvcHMpIDogcHJvcHM7XG4gIGNvbnN0IGNsb25lZCA9IHtcbiAgICBfX3ZfaXNWTm9kZTogdHJ1ZSxcbiAgICBfX3Zfc2tpcDogdHJ1ZSxcbiAgICB0eXBlOiB2bm9kZS50eXBlLFxuICAgIHByb3BzOiBtZXJnZWRQcm9wcyxcbiAgICBrZXk6IG1lcmdlZFByb3BzICYmIG5vcm1hbGl6ZUtleShtZXJnZWRQcm9wcyksXG4gICAgcmVmOiBleHRyYVByb3BzICYmIGV4dHJhUHJvcHMucmVmID8gKFxuICAgICAgLy8gIzIwNzggaW4gdGhlIGNhc2Ugb2YgPGNvbXBvbmVudCA6aXM9XCJ2bm9kZVwiIHJlZj1cImV4dHJhXCIvPlxuICAgICAgLy8gaWYgdGhlIHZub2RlIGl0c2VsZiBhbHJlYWR5IGhhcyBhIHJlZiwgY2xvbmVWTm9kZSB3aWxsIG5lZWQgdG8gbWVyZ2VcbiAgICAgIC8vIHRoZSByZWZzIHNvIHRoZSBzaW5nbGUgdm5vZGUgY2FuIGJlIHNldCBvbiBtdWx0aXBsZSByZWZzXG4gICAgICBtZXJnZVJlZiAmJiByZWYgPyBpc0FycmF5KHJlZikgPyByZWYuY29uY2F0KG5vcm1hbGl6ZVJlZihleHRyYVByb3BzKSkgOiBbcmVmLCBub3JtYWxpemVSZWYoZXh0cmFQcm9wcyldIDogbm9ybWFsaXplUmVmKGV4dHJhUHJvcHMpXG4gICAgKSA6IHJlZixcbiAgICBzY29wZUlkOiB2bm9kZS5zY29wZUlkLFxuICAgIHNsb3RTY29wZUlkczogdm5vZGUuc2xvdFNjb3BlSWRzLFxuICAgIGNoaWxkcmVuOiAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHBhdGNoRmxhZyA9PT0gLTEgJiYgaXNBcnJheShjaGlsZHJlbikgPyBjaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpIDogY2hpbGRyZW4sXG4gICAgdGFyZ2V0OiB2bm9kZS50YXJnZXQsXG4gICAgdGFyZ2V0U3RhcnQ6IHZub2RlLnRhcmdldFN0YXJ0LFxuICAgIHRhcmdldEFuY2hvcjogdm5vZGUudGFyZ2V0QW5jaG9yLFxuICAgIHN0YXRpY0NvdW50OiB2bm9kZS5zdGF0aWNDb3VudCxcbiAgICBzaGFwZUZsYWc6IHZub2RlLnNoYXBlRmxhZyxcbiAgICAvLyBpZiB0aGUgdm5vZGUgaXMgY2xvbmVkIHdpdGggZXh0cmEgcHJvcHMsIHdlIGNhbiBubyBsb25nZXIgYXNzdW1lIGl0c1xuICAgIC8vIGV4aXN0aW5nIHBhdGNoIGZsYWcgdG8gYmUgcmVsaWFibGUgYW5kIG5lZWQgdG8gYWRkIHRoZSBGVUxMX1BST1BTIGZsYWcuXG4gICAgLy8gbm90ZTogcHJlc2VydmUgZmxhZyBmb3IgZnJhZ21lbnRzIHNpbmNlIHRoZXkgdXNlIHRoZSBmbGFnIGZvciBjaGlsZHJlblxuICAgIC8vIGZhc3QgcGF0aHMgb25seS5cbiAgICBwYXRjaEZsYWc6IGV4dHJhUHJvcHMgJiYgdm5vZGUudHlwZSAhPT0gRnJhZ21lbnQgPyBwYXRjaEZsYWcgPT09IC0xID8gMTYgOiBwYXRjaEZsYWcgfCAxNiA6IHBhdGNoRmxhZyxcbiAgICBkeW5hbWljUHJvcHM6IHZub2RlLmR5bmFtaWNQcm9wcyxcbiAgICBkeW5hbWljQ2hpbGRyZW46IHZub2RlLmR5bmFtaWNDaGlsZHJlbixcbiAgICBhcHBDb250ZXh0OiB2bm9kZS5hcHBDb250ZXh0LFxuICAgIGRpcnM6IHZub2RlLmRpcnMsXG4gICAgdHJhbnNpdGlvbixcbiAgICAvLyBUaGVzZSBzaG91bGQgdGVjaG5pY2FsbHkgb25seSBiZSBub24tbnVsbCBvbiBtb3VudGVkIFZOb2Rlcy4gSG93ZXZlcixcbiAgICAvLyB0aGV5ICpzaG91bGQqIGJlIGNvcGllZCBmb3Iga2VwdC1hbGl2ZSB2bm9kZXMuIFNvIHdlIGp1c3QgYWx3YXlzIGNvcHlcbiAgICAvLyB0aGVtIHNpbmNlIHRoZW0gYmVpbmcgbm9uLW51bGwgZHVyaW5nIGEgbW91bnQgZG9lc24ndCBhZmZlY3QgdGhlIGxvZ2ljIGFzXG4gICAgLy8gdGhleSB3aWxsIHNpbXBseSBiZSBvdmVyd3JpdHRlbi5cbiAgICBjb21wb25lbnQ6IHZub2RlLmNvbXBvbmVudCxcbiAgICBzdXNwZW5zZTogdm5vZGUuc3VzcGVuc2UsXG4gICAgc3NDb250ZW50OiB2bm9kZS5zc0NvbnRlbnQgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0NvbnRlbnQpLFxuICAgIHNzRmFsbGJhY2s6IHZub2RlLnNzRmFsbGJhY2sgJiYgY2xvbmVWTm9kZSh2bm9kZS5zc0ZhbGxiYWNrKSxcbiAgICBlbDogdm5vZGUuZWwsXG4gICAgYW5jaG9yOiB2bm9kZS5hbmNob3IsXG4gICAgY3R4OiB2bm9kZS5jdHgsXG4gICAgY2U6IHZub2RlLmNlXG4gIH07XG4gIGlmICh0cmFuc2l0aW9uICYmIGNsb25lVHJhbnNpdGlvbikge1xuICAgIHNldFRyYW5zaXRpb25Ib29rcyhcbiAgICAgIGNsb25lZCxcbiAgICAgIHRyYW5zaXRpb24uY2xvbmUoY2xvbmVkKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGNsb25lZDtcbn1cbmZ1bmN0aW9uIGRlZXBDbG9uZVZOb2RlKHZub2RlKSB7XG4gIGNvbnN0IGNsb25lZCA9IGNsb25lVk5vZGUodm5vZGUpO1xuICBpZiAoaXNBcnJheSh2bm9kZS5jaGlsZHJlbikpIHtcbiAgICBjbG9uZWQuY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbi5tYXAoZGVlcENsb25lVk5vZGUpO1xuICB9XG4gIHJldHVybiBjbG9uZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUodGV4dCA9IFwiIFwiLCBmbGFnID0gMCkge1xuICByZXR1cm4gY3JlYXRlVk5vZGUoVGV4dCwgbnVsbCwgdGV4dCwgZmxhZyk7XG59XG5mdW5jdGlvbiBjcmVhdGVTdGF0aWNWTm9kZShjb250ZW50LCBudW1iZXJPZk5vZGVzKSB7XG4gIGNvbnN0IHZub2RlID0gY3JlYXRlVk5vZGUoU3RhdGljLCBudWxsLCBjb250ZW50KTtcbiAgdm5vZGUuc3RhdGljQ291bnQgPSBudW1iZXJPZk5vZGVzO1xuICByZXR1cm4gdm5vZGU7XG59XG5mdW5jdGlvbiBjcmVhdGVDb21tZW50Vk5vZGUodGV4dCA9IFwiXCIsIGFzQmxvY2sgPSBmYWxzZSkge1xuICByZXR1cm4gYXNCbG9jayA/IChvcGVuQmxvY2soKSwgY3JlYXRlQmxvY2soQ29tbWVudCwgbnVsbCwgdGV4dCkpIDogY3JlYXRlVk5vZGUoQ29tbWVudCwgbnVsbCwgdGV4dCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVWTm9kZShjaGlsZCkge1xuICBpZiAoY2hpbGQgPT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKENvbW1lbnQpO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGQpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVZOb2RlKFxuICAgICAgRnJhZ21lbnQsXG4gICAgICBudWxsLFxuICAgICAgLy8gIzM2NjYsIGF2b2lkIHJlZmVyZW5jZSBwb2xsdXRpb24gd2hlbiByZXVzaW5nIHZub2RlXG4gICAgICBjaGlsZC5zbGljZSgpXG4gICAgKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gY2xvbmVJZk1vdW50ZWQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVWTm9kZShUZXh0LCBudWxsLCBTdHJpbmcoY2hpbGQpKTtcbiAgfVxufVxuZnVuY3Rpb24gY2xvbmVJZk1vdW50ZWQoY2hpbGQpIHtcbiAgcmV0dXJuIGNoaWxkLmVsID09PSBudWxsICYmIGNoaWxkLnBhdGNoRmxhZyAhPT0gLTEgfHwgY2hpbGQubWVtbyA/IGNoaWxkIDogY2xvbmVWTm9kZShjaGlsZCk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4pIHtcbiAgbGV0IHR5cGUgPSAwO1xuICBjb25zdCB7IHNoYXBlRmxhZyB9ID0gdm5vZGU7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgdHlwZSA9IDE2O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChzaGFwZUZsYWcgJiAoMSB8IDY0KSkge1xuICAgICAgY29uc3Qgc2xvdCA9IGNoaWxkcmVuLmRlZmF1bHQ7XG4gICAgICBpZiAoc2xvdCkge1xuICAgICAgICBzbG90Ll9jICYmIChzbG90Ll9kID0gZmFsc2UpO1xuICAgICAgICBub3JtYWxpemVDaGlsZHJlbih2bm9kZSwgc2xvdCgpKTtcbiAgICAgICAgc2xvdC5fYyAmJiAoc2xvdC5fZCA9IHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlID0gMzI7XG4gICAgICBjb25zdCBzbG90RmxhZyA9IGNoaWxkcmVuLl87XG4gICAgICBpZiAoIXNsb3RGbGFnICYmICFpc0ludGVybmFsT2JqZWN0KGNoaWxkcmVuKSkge1xuICAgICAgICBjaGlsZHJlbi5fY3R4ID0gY3VycmVudFJlbmRlcmluZ0luc3RhbmNlO1xuICAgICAgfSBlbHNlIGlmIChzbG90RmxhZyA9PT0gMyAmJiBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZS5zbG90cy5fID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hpbGRyZW4uXyA9IDI7XG4gICAgICAgICAgdm5vZGUucGF0Y2hGbGFnIHw9IDEwMjQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjaGlsZHJlbikpIHtcbiAgICBjaGlsZHJlbiA9IHsgZGVmYXVsdDogY2hpbGRyZW4sIF9jdHg6IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSB9O1xuICAgIHR5cGUgPSAzMjtcbiAgfSBlbHNlIHtcbiAgICBjaGlsZHJlbiA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgaWYgKHNoYXBlRmxhZyAmIDY0KSB7XG4gICAgICB0eXBlID0gMTY7XG4gICAgICBjaGlsZHJlbiA9IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZSA9IDg7XG4gICAgfVxuICB9XG4gIHZub2RlLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIHZub2RlLnNoYXBlRmxhZyB8PSB0eXBlO1xufVxuZnVuY3Rpb24gbWVyZ2VQcm9wcyguLi5hcmdzKSB7XG4gIGNvbnN0IHJldCA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b01lcmdlID0gYXJnc1tpXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0b01lcmdlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImNsYXNzXCIpIHtcbiAgICAgICAgaWYgKHJldC5jbGFzcyAhPT0gdG9NZXJnZS5jbGFzcykge1xuICAgICAgICAgIHJldC5jbGFzcyA9IG5vcm1hbGl6ZUNsYXNzKFtyZXQuY2xhc3MsIHRvTWVyZ2UuY2xhc3NdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3R5bGVcIikge1xuICAgICAgICByZXQuc3R5bGUgPSBub3JtYWxpemVTdHlsZShbcmV0LnN0eWxlLCB0b01lcmdlLnN0eWxlXSk7XG4gICAgICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHJldFtrZXldO1xuICAgICAgICBjb25zdCBpbmNvbWluZyA9IHRvTWVyZ2Vba2V5XTtcbiAgICAgICAgaWYgKGluY29taW5nICYmIGV4aXN0aW5nICE9PSBpbmNvbWluZyAmJiAhKGlzQXJyYXkoZXhpc3RpbmcpICYmIGV4aXN0aW5nLmluY2x1ZGVzKGluY29taW5nKSkpIHtcbiAgICAgICAgICByZXRba2V5XSA9IGV4aXN0aW5nID8gW10uY29uY2F0KGV4aXN0aW5nLCBpbmNvbWluZykgOiBpbmNvbWluZztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgIT09IFwiXCIpIHtcbiAgICAgICAgcmV0W2tleV0gPSB0b01lcmdlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBpbnZva2VWTm9kZUhvb2soaG9vaywgaW5zdGFuY2UsIHZub2RlLCBwcmV2Vk5vZGUgPSBudWxsKSB7XG4gIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nKGhvb2ssIGluc3RhbmNlLCA3LCBbXG4gICAgdm5vZGUsXG4gICAgcHJldlZOb2RlXG4gIF0pO1xufVxuXG5jb25zdCBlbXB0eUFwcENvbnRleHQgPSBjcmVhdGVBcHBDb250ZXh0KCk7XG5sZXQgdWlkID0gMDtcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKHZub2RlLCBwYXJlbnQsIHN1c3BlbnNlKSB7XG4gIGNvbnN0IHR5cGUgPSB2bm9kZS50eXBlO1xuICBjb25zdCBhcHBDb250ZXh0ID0gKHBhcmVudCA/IHBhcmVudC5hcHBDb250ZXh0IDogdm5vZGUuYXBwQ29udGV4dCkgfHwgZW1wdHlBcHBDb250ZXh0O1xuICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICB1aWQ6IHVpZCsrLFxuICAgIHZub2RlLFxuICAgIHR5cGUsXG4gICAgcGFyZW50LFxuICAgIGFwcENvbnRleHQsXG4gICAgcm9vdDogbnVsbCxcbiAgICAvLyB0byBiZSBpbW1lZGlhdGVseSBzZXRcbiAgICBuZXh0OiBudWxsLFxuICAgIHN1YlRyZWU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGVmZmVjdDogbnVsbCxcbiAgICB1cGRhdGU6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgc3luY2hyb25vdXNseSByaWdodCBhZnRlciBjcmVhdGlvblxuICAgIGpvYjogbnVsbCxcbiAgICBzY29wZTogbmV3IEVmZmVjdFNjb3BlKFxuICAgICAgdHJ1ZVxuICAgICAgLyogZGV0YWNoZWQgKi9cbiAgICApLFxuICAgIHJlbmRlcjogbnVsbCxcbiAgICBwcm94eTogbnVsbCxcbiAgICBleHBvc2VkOiBudWxsLFxuICAgIGV4cG9zZVByb3h5OiBudWxsLFxuICAgIHdpdGhQcm94eTogbnVsbCxcbiAgICBwcm92aWRlczogcGFyZW50ID8gcGFyZW50LnByb3ZpZGVzIDogT2JqZWN0LmNyZWF0ZShhcHBDb250ZXh0LnByb3ZpZGVzKSxcbiAgICBpZHM6IHBhcmVudCA/IHBhcmVudC5pZHMgOiBbXCJcIiwgMCwgMF0sXG4gICAgYWNjZXNzQ2FjaGU6IG51bGwsXG4gICAgcmVuZGVyQ2FjaGU6IFtdLFxuICAgIC8vIGxvY2FsIHJlc29sdmVkIGFzc2V0c1xuICAgIGNvbXBvbmVudHM6IG51bGwsXG4gICAgZGlyZWN0aXZlczogbnVsbCxcbiAgICAvLyByZXNvbHZlZCBwcm9wcyBhbmQgZW1pdHMgb3B0aW9uc1xuICAgIHByb3BzT3B0aW9uczogbm9ybWFsaXplUHJvcHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIGVtaXRzT3B0aW9uczogbm9ybWFsaXplRW1pdHNPcHRpb25zKHR5cGUsIGFwcENvbnRleHQpLFxuICAgIC8vIGVtaXRcbiAgICBlbWl0OiBudWxsLFxuICAgIC8vIHRvIGJlIHNldCBpbW1lZGlhdGVseVxuICAgIGVtaXR0ZWQ6IG51bGwsXG4gICAgLy8gcHJvcHMgZGVmYXVsdCB2YWx1ZVxuICAgIHByb3BzRGVmYXVsdHM6IEVNUFRZX09CSixcbiAgICAvLyBpbmhlcml0QXR0cnNcbiAgICBpbmhlcml0QXR0cnM6IHR5cGUuaW5oZXJpdEF0dHJzLFxuICAgIC8vIHN0YXRlXG4gICAgY3R4OiBFTVBUWV9PQkosXG4gICAgZGF0YTogRU1QVFlfT0JKLFxuICAgIHByb3BzOiBFTVBUWV9PQkosXG4gICAgYXR0cnM6IEVNUFRZX09CSixcbiAgICBzbG90czogRU1QVFlfT0JKLFxuICAgIHJlZnM6IEVNUFRZX09CSixcbiAgICBzZXR1cFN0YXRlOiBFTVBUWV9PQkosXG4gICAgc2V0dXBDb250ZXh0OiBudWxsLFxuICAgIC8vIHN1c3BlbnNlIHJlbGF0ZWRcbiAgICBzdXNwZW5zZSxcbiAgICBzdXNwZW5zZUlkOiBzdXNwZW5zZSA/IHN1c3BlbnNlLnBlbmRpbmdJZCA6IDAsXG4gICAgYXN5bmNEZXA6IG51bGwsXG4gICAgYXN5bmNSZXNvbHZlZDogZmFsc2UsXG4gICAgLy8gbGlmZWN5Y2xlIGhvb2tzXG4gICAgLy8gbm90IHVzaW5nIGVudW1zIGhlcmUgYmVjYXVzZSBpdCByZXN1bHRzIGluIGNvbXB1dGVkIHByb3BlcnRpZXNcbiAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgIGlzVW5tb3VudGVkOiBmYWxzZSxcbiAgICBpc0RlYWN0aXZhdGVkOiBmYWxzZSxcbiAgICBiYzogbnVsbCxcbiAgICBjOiBudWxsLFxuICAgIGJtOiBudWxsLFxuICAgIG06IG51bGwsXG4gICAgYnU6IG51bGwsXG4gICAgdTogbnVsbCxcbiAgICB1bTogbnVsbCxcbiAgICBidW06IG51bGwsXG4gICAgZGE6IG51bGwsXG4gICAgYTogbnVsbCxcbiAgICBydGc6IG51bGwsXG4gICAgcnRjOiBudWxsLFxuICAgIGVjOiBudWxsLFxuICAgIHNwOiBudWxsXG4gIH07XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5zdGFuY2UuY3R4ID0gY3JlYXRlRGV2UmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gIH0gZWxzZSB7XG4gICAgaW5zdGFuY2UuY3R4ID0geyBfOiBpbnN0YW5jZSB9O1xuICB9XG4gIGluc3RhbmNlLnJvb3QgPSBwYXJlbnQgPyBwYXJlbnQucm9vdCA6IGluc3RhbmNlO1xuICBpbnN0YW5jZS5lbWl0ID0gZW1pdC5iaW5kKG51bGwsIGluc3RhbmNlKTtcbiAgaWYgKHZub2RlLmNlKSB7XG4gICAgdm5vZGUuY2UoaW5zdGFuY2UpO1xuICB9XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmxldCBjdXJyZW50SW5zdGFuY2UgPSBudWxsO1xuY29uc3QgZ2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4gY3VycmVudEluc3RhbmNlIHx8IGN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZTtcbmxldCBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZTtcbmxldCBzZXRJblNTUlNldHVwU3RhdGU7XG57XG4gIGNvbnN0IGcgPSBnZXRHbG9iYWxUaGlzKCk7XG4gIGNvbnN0IHJlZ2lzdGVyR2xvYmFsU2V0dGVyID0gKGtleSwgc2V0dGVyKSA9PiB7XG4gICAgbGV0IHNldHRlcnM7XG4gICAgaWYgKCEoc2V0dGVycyA9IGdba2V5XSkpIHNldHRlcnMgPSBnW2tleV0gPSBbXTtcbiAgICBzZXR0ZXJzLnB1c2goc2V0dGVyKTtcbiAgICByZXR1cm4gKHYpID0+IHtcbiAgICAgIGlmIChzZXR0ZXJzLmxlbmd0aCA+IDEpIHNldHRlcnMuZm9yRWFjaCgoc2V0KSA9PiBzZXQodikpO1xuICAgICAgZWxzZSBzZXR0ZXJzWzBdKHYpO1xuICAgIH07XG4gIH07XG4gIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX0lOU1RBTkNFX1NFVFRFUlNfX2AsXG4gICAgKHYpID0+IGN1cnJlbnRJbnN0YW5jZSA9IHZcbiAgKTtcbiAgc2V0SW5TU1JTZXR1cFN0YXRlID0gcmVnaXN0ZXJHbG9iYWxTZXR0ZXIoXG4gICAgYF9fVlVFX1NTUl9TRVRURVJTX19gLFxuICAgICh2KSA9PiBpc0luU1NSQ29tcG9uZW50U2V0dXAgPSB2XG4gICk7XG59XG5jb25zdCBzZXRDdXJyZW50SW5zdGFuY2UgPSAoaW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcHJldiA9IGN1cnJlbnRJbnN0YW5jZTtcbiAgaW50ZXJuYWxTZXRDdXJyZW50SW5zdGFuY2UoaW5zdGFuY2UpO1xuICBpbnN0YW5jZS5zY29wZS5vbigpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGluc3RhbmNlLnNjb3BlLm9mZigpO1xuICAgIGludGVybmFsU2V0Q3VycmVudEluc3RhbmNlKHByZXYpO1xuICB9O1xufTtcbmNvbnN0IHVuc2V0Q3VycmVudEluc3RhbmNlID0gKCkgPT4ge1xuICBjdXJyZW50SW5zdGFuY2UgJiYgY3VycmVudEluc3RhbmNlLnNjb3BlLm9mZigpO1xuICBpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZShudWxsKTtcbn07XG5jb25zdCBpc0J1aWx0SW5UYWcgPSAvKiBAX19QVVJFX18gKi8gbWFrZU1hcChcInNsb3QsY29tcG9uZW50XCIpO1xuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUsIHsgaXNOYXRpdmVUYWcgfSkge1xuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGlzTmF0aXZlVGFnKG5hbWUpKSB7XG4gICAgd2FybiQxKFxuICAgICAgXCJEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50IGlkOiBcIiArIG5hbWVcbiAgICApO1xuICB9XG59XG5mdW5jdGlvbiBpc1N0YXRlZnVsQ29tcG9uZW50KGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZS52bm9kZS5zaGFwZUZsYWcgJiA0O1xufVxubGV0IGlzSW5TU1JDb21wb25lbnRTZXR1cCA9IGZhbHNlO1xuZnVuY3Rpb24gc2V0dXBDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSID0gZmFsc2UsIG9wdGltaXplZCA9IGZhbHNlKSB7XG4gIGlzU1NSICYmIHNldEluU1NSU2V0dXBTdGF0ZShpc1NTUik7XG4gIGNvbnN0IHsgcHJvcHMsIGNoaWxkcmVuIH0gPSBpbnN0YW5jZS52bm9kZTtcbiAgY29uc3QgaXNTdGF0ZWZ1bCA9IGlzU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UpO1xuICBpbml0UHJvcHMoaW5zdGFuY2UsIHByb3BzLCBpc1N0YXRlZnVsLCBpc1NTUik7XG4gIGluaXRTbG90cyhpbnN0YW5jZSwgY2hpbGRyZW4sIG9wdGltaXplZCk7XG4gIGNvbnN0IHNldHVwUmVzdWx0ID0gaXNTdGF0ZWZ1bCA/IHNldHVwU3RhdGVmdWxDb21wb25lbnQoaW5zdGFuY2UsIGlzU1NSKSA6IHZvaWQgMDtcbiAgaXNTU1IgJiYgc2V0SW5TU1JTZXR1cFN0YXRlKGZhbHNlKTtcbiAgcmV0dXJuIHNldHVwUmVzdWx0O1xufVxuZnVuY3Rpb24gc2V0dXBTdGF0ZWZ1bENvbXBvbmVudChpbnN0YW5jZSwgaXNTU1IpIHtcbiAgdmFyIF9hO1xuICBjb25zdCBDb21wb25lbnQgPSBpbnN0YW5jZS50eXBlO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGlmIChDb21wb25lbnQubmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKENvbXBvbmVudC5uYW1lLCBpbnN0YW5jZS5hcHBDb250ZXh0LmNvbmZpZyk7XG4gICAgfVxuICAgIGlmIChDb21wb25lbnQuY29tcG9uZW50cykge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhDb21wb25lbnQuY29tcG9uZW50cyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlQ29tcG9uZW50TmFtZShuYW1lc1tpXSwgaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmRpcmVjdGl2ZXMpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoQ29tcG9uZW50LmRpcmVjdGl2ZXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YWxpZGF0ZURpcmVjdGl2ZU5hbWUobmFtZXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoQ29tcG9uZW50LmNvbXBpbGVyT3B0aW9ucyAmJiBpc1J1bnRpbWVPbmx5KCkpIHtcbiAgICAgIHdhcm4kMShcbiAgICAgICAgYFwiY29tcGlsZXJPcHRpb25zXCIgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBhIGJ1aWxkIG9mIFZ1ZSB0aGF0IGluY2x1ZGVzIHRoZSBydW50aW1lIGNvbXBpbGVyLiBTaW5jZSB5b3UgYXJlIHVzaW5nIGEgcnVudGltZS1vbmx5IGJ1aWxkLCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgcGFzc2VkIHZpYSB5b3VyIGJ1aWxkIHRvb2wgY29uZmlnIGluc3RlYWQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgaW5zdGFuY2UuYWNjZXNzQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgaW5zdGFuY2UucHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2UuY3R4LCBQdWJsaWNJbnN0YW5jZVByb3h5SGFuZGxlcnMpO1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGV4cG9zZVByb3BzT25SZW5kZXJDb250ZXh0KGluc3RhbmNlKTtcbiAgfVxuICBjb25zdCB7IHNldHVwIH0gPSBDb21wb25lbnQ7XG4gIGlmIChzZXR1cCkge1xuICAgIGNvbnN0IHNldHVwQ29udGV4dCA9IGluc3RhbmNlLnNldHVwQ29udGV4dCA9IHNldHVwLmxlbmd0aCA+IDEgPyBjcmVhdGVTZXR1cENvbnRleHQoaW5zdGFuY2UpIDogbnVsbDtcbiAgICBjb25zdCByZXNldCA9IHNldEN1cnJlbnRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgcGF1c2VUcmFja2luZygpO1xuICAgIGNvbnN0IHNldHVwUmVzdWx0ID0gY2FsbFdpdGhFcnJvckhhbmRsaW5nKFxuICAgICAgc2V0dXAsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIDAsXG4gICAgICBbXG4gICAgICAgICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBzaGFsbG93UmVhZG9ubHkoaW5zdGFuY2UucHJvcHMpIDogaW5zdGFuY2UucHJvcHMsXG4gICAgICAgIHNldHVwQ29udGV4dFxuICAgICAgXVxuICAgICk7XG4gICAgcmVzZXRUcmFja2luZygpO1xuICAgIHJlc2V0KCk7XG4gICAgaWYgKGlzUHJvbWlzZShzZXR1cFJlc3VsdCkpIHtcbiAgICAgIGlmICghaXNBc3luY1dyYXBwZXIoaW5zdGFuY2UpKSBtYXJrQXN5bmNCb3VuZGFyeShpbnN0YW5jZSk7XG4gICAgICBzZXR1cFJlc3VsdC50aGVuKHVuc2V0Q3VycmVudEluc3RhbmNlLCB1bnNldEN1cnJlbnRJbnN0YW5jZSk7XG4gICAgICBpZiAoaXNTU1IpIHtcbiAgICAgICAgcmV0dXJuIHNldHVwUmVzdWx0LnRoZW4oKHJlc29sdmVkUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHJlc29sdmVkUmVzdWx0LCBpc1NTUik7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgaW5zdGFuY2UsIDApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3RhbmNlLmFzeW5jRGVwID0gc2V0dXBSZXN1bHQ7XG4gICAgICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFpbnN0YW5jZS5zdXNwZW5zZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSAoX2EgPSBDb21wb25lbnQubmFtZSkgIT0gbnVsbCA/IF9hIDogXCJBbm9ueW1vdXNcIjtcbiAgICAgICAgICB3YXJuJDEoXG4gICAgICAgICAgICBgQ29tcG9uZW50IDwke25hbWV9Pjogc2V0dXAgZnVuY3Rpb24gcmV0dXJuZWQgYSBwcm9taXNlLCBidXQgbm8gPFN1c3BlbnNlPiBib3VuZGFyeSB3YXMgZm91bmQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQgdHJlZS4gQSBjb21wb25lbnQgd2l0aCBhc3luYyBzZXR1cCgpIG11c3QgYmUgbmVzdGVkIGluIGEgPFN1c3BlbnNlPiBpbiBvcmRlciB0byBiZSByZW5kZXJlZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYW5kbGVTZXR1cFJlc3VsdChpbnN0YW5jZSwgc2V0dXBSZXN1bHQsIGlzU1NSKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZmluaXNoQ29tcG9uZW50U2V0dXAoaW5zdGFuY2UsIGlzU1NSKTtcbiAgfVxufVxuZnVuY3Rpb24gaGFuZGxlU2V0dXBSZXN1bHQoaW5zdGFuY2UsIHNldHVwUmVzdWx0LCBpc1NTUikge1xuICBpZiAoaXNGdW5jdGlvbihzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoaW5zdGFuY2UudHlwZS5fX3NzcklubGluZVJlbmRlcikge1xuICAgICAgaW5zdGFuY2Uuc3NyUmVuZGVyID0gc2V0dXBSZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnJlbmRlciA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChzZXR1cFJlc3VsdCkpIHtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiBpc1ZOb2RlKHNldHVwUmVzdWx0KSkge1xuICAgICAgd2FybiQxKFxuICAgICAgICBgc2V0dXAoKSBzaG91bGQgbm90IHJldHVybiBWTm9kZXMgZGlyZWN0bHkgLSByZXR1cm4gYSByZW5kZXIgZnVuY3Rpb24gaW5zdGVhZC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pIHtcbiAgICAgIGluc3RhbmNlLmRldnRvb2xzUmF3U2V0dXBTdGF0ZSA9IHNldHVwUmVzdWx0O1xuICAgIH1cbiAgICBpbnN0YW5jZS5zZXR1cFN0YXRlID0gcHJveHlSZWZzKHNldHVwUmVzdWx0KTtcbiAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgZXhwb3NlU2V0dXBTdGF0ZU9uUmVuZGVyQ29udGV4dChpbnN0YW5jZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgc2V0dXBSZXN1bHQgIT09IHZvaWQgMCkge1xuICAgIHdhcm4kMShcbiAgICAgIGBzZXR1cCgpIHNob3VsZCByZXR1cm4gYW4gb2JqZWN0LiBSZWNlaXZlZDogJHtzZXR1cFJlc3VsdCA9PT0gbnVsbCA/IFwibnVsbFwiIDogdHlwZW9mIHNldHVwUmVzdWx0fWBcbiAgICApO1xuICB9XG4gIGZpbmlzaENvbXBvbmVudFNldHVwKGluc3RhbmNlLCBpc1NTUik7XG59XG5sZXQgY29tcGlsZTtcbmxldCBpbnN0YWxsV2l0aFByb3h5O1xuZnVuY3Rpb24gcmVnaXN0ZXJSdW50aW1lQ29tcGlsZXIoX2NvbXBpbGUpIHtcbiAgY29tcGlsZSA9IF9jb21waWxlO1xuICBpbnN0YWxsV2l0aFByb3h5ID0gKGkpID0+IHtcbiAgICBpZiAoaS5yZW5kZXIuX3JjKSB7XG4gICAgICBpLndpdGhQcm94eSA9IG5ldyBQcm94eShpLmN0eCwgUnVudGltZUNvbXBpbGVkUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzKTtcbiAgICB9XG4gIH07XG59XG5jb25zdCBpc1J1bnRpbWVPbmx5ID0gKCkgPT4gIWNvbXBpbGU7XG5mdW5jdGlvbiBmaW5pc2hDb21wb25lbnRTZXR1cChpbnN0YW5jZSwgaXNTU1IsIHNraXBPcHRpb25zKSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IGluc3RhbmNlLnR5cGU7XG4gIGlmICghaW5zdGFuY2UucmVuZGVyKSB7XG4gICAgaWYgKCFpc1NTUiAmJiBjb21waWxlICYmICFDb21wb25lbnQucmVuZGVyKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IENvbXBvbmVudC50ZW1wbGF0ZSB8fCByZXNvbHZlTWVyZ2VkT3B0aW9ucyhpbnN0YW5jZSkudGVtcGxhdGU7XG4gICAgICBpZiAodGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgICAgICBzdGFydE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpc0N1c3RvbUVsZW1lbnQsIGNvbXBpbGVyT3B0aW9ucyB9ID0gaW5zdGFuY2UuYXBwQ29udGV4dC5jb25maWc7XG4gICAgICAgIGNvbnN0IHsgZGVsaW1pdGVycywgY29tcGlsZXJPcHRpb25zOiBjb21wb25lbnRDb21waWxlck9wdGlvbnMgfSA9IENvbXBvbmVudDtcbiAgICAgICAgY29uc3QgZmluYWxDb21waWxlck9wdGlvbnMgPSBleHRlbmQoXG4gICAgICAgICAgZXh0ZW5kKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpc0N1c3RvbUVsZW1lbnQsXG4gICAgICAgICAgICAgIGRlbGltaXRlcnNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21waWxlck9wdGlvbnNcbiAgICAgICAgICApLFxuICAgICAgICAgIGNvbXBvbmVudENvbXBpbGVyT3B0aW9uc1xuICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQucmVuZGVyID0gY29tcGlsZSh0ZW1wbGF0ZSwgZmluYWxDb21waWxlck9wdGlvbnMpO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGVuZE1lYXN1cmUoaW5zdGFuY2UsIGBjb21waWxlYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaW5zdGFuY2UucmVuZGVyID0gQ29tcG9uZW50LnJlbmRlciB8fCBOT09QO1xuICAgIGlmIChpbnN0YWxsV2l0aFByb3h5KSB7XG4gICAgICBpbnN0YWxsV2l0aFByb3h5KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cbiAgaWYgKF9fVlVFX09QVElPTlNfQVBJX18gJiYgdHJ1ZSkge1xuICAgIGNvbnN0IHJlc2V0ID0gc2V0Q3VycmVudEluc3RhbmNlKGluc3RhbmNlKTtcbiAgICBwYXVzZVRyYWNraW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIGFwcGx5T3B0aW9ucyhpbnN0YW5jZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc2V0VHJhY2tpbmcoKTtcbiAgICAgIHJlc2V0KCk7XG4gICAgfVxuICB9XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFDb21wb25lbnQucmVuZGVyICYmIGluc3RhbmNlLnJlbmRlciA9PT0gTk9PUCAmJiAhaXNTU1IpIHtcbiAgICBpZiAoIWNvbXBpbGUgJiYgQ29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICB3YXJuJDEoXG4gICAgICAgIGBDb21wb25lbnQgcHJvdmlkZWQgdGVtcGxhdGUgb3B0aW9uIGJ1dCBydW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2FybiQxKGBDb21wb25lbnQgaXMgbWlzc2luZyB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb246IGAsIENvbXBvbmVudCk7XG4gICAgfVxuICB9XG59XG5jb25zdCBhdHRyc1Byb3h5SGFuZGxlcnMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8ge1xuICBnZXQodGFyZ2V0LCBrZXkpIHtcbiAgICBtYXJrQXR0cnNBY2Nlc3NlZCgpO1xuICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwgXCJcIik7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICB9LFxuICBzZXQoKSB7XG4gICAgd2FybiQxKGBzZXR1cENvbnRleHQuYXR0cnMgaXMgcmVhZG9ubHkuYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eSgpIHtcbiAgICB3YXJuJDEoYHNldHVwQ29udGV4dC5hdHRycyBpcyByZWFkb25seS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn0gOiB7XG4gIGdldCh0YXJnZXQsIGtleSkge1xuICAgIHRyYWNrKHRhcmdldCwgXCJnZXRcIiwgXCJcIik7XG4gICAgcmV0dXJuIHRhcmdldFtrZXldO1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0U2xvdHNQcm94eShpbnN0YW5jZSkge1xuICByZXR1cm4gbmV3IFByb3h5KGluc3RhbmNlLnNsb3RzLCB7XG4gICAgZ2V0KHRhcmdldCwga2V5KSB7XG4gICAgICB0cmFjayhpbnN0YW5jZSwgXCJnZXRcIiwgXCIkc2xvdHNcIik7XG4gICAgICByZXR1cm4gdGFyZ2V0W2tleV07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNldHVwQ29udGV4dChpbnN0YW5jZSkge1xuICBjb25zdCBleHBvc2UgPSAoZXhwb3NlZCkgPT4ge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICBpZiAoaW5zdGFuY2UuZXhwb3NlZCkge1xuICAgICAgICB3YXJuJDEoYGV4cG9zZSgpIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBzZXR1cCgpLmApO1xuICAgICAgfVxuICAgICAgaWYgKGV4cG9zZWQgIT0gbnVsbCkge1xuICAgICAgICBsZXQgZXhwb3NlZFR5cGUgPSB0eXBlb2YgZXhwb3NlZDtcbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJhcnJheVwiO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZWYoZXhwb3NlZCkpIHtcbiAgICAgICAgICAgIGV4cG9zZWRUeXBlID0gXCJyZWZcIjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cG9zZWRUeXBlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgd2FybiQxKFxuICAgICAgICAgICAgYGV4cG9zZSgpIHNob3VsZCBiZSBwYXNzZWQgYSBwbGFpbiBvYmplY3QsIHJlY2VpdmVkICR7ZXhwb3NlZFR5cGV9LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGluc3RhbmNlLmV4cG9zZWQgPSBleHBvc2VkIHx8IHt9O1xuICB9O1xuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgIGxldCBhdHRyc1Byb3h5O1xuICAgIGxldCBzbG90c1Byb3h5O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdldCBhdHRycygpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJzUHJveHkgfHwgKGF0dHJzUHJveHkgPSBuZXcgUHJveHkoaW5zdGFuY2UuYXR0cnMsIGF0dHJzUHJveHlIYW5kbGVycykpO1xuICAgICAgfSxcbiAgICAgIGdldCBzbG90cygpIHtcbiAgICAgICAgcmV0dXJuIHNsb3RzUHJveHkgfHwgKHNsb3RzUHJveHkgPSBnZXRTbG90c1Byb3h5KGluc3RhbmNlKSk7XG4gICAgICB9LFxuICAgICAgZ2V0IGVtaXQoKSB7XG4gICAgICAgIHJldHVybiAoZXZlbnQsIC4uLmFyZ3MpID0+IGluc3RhbmNlLmVtaXQoZXZlbnQsIC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGV4cG9zZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyczogbmV3IFByb3h5KGluc3RhbmNlLmF0dHJzLCBhdHRyc1Byb3h5SGFuZGxlcnMpLFxuICAgICAgc2xvdHM6IGluc3RhbmNlLnNsb3RzLFxuICAgICAgZW1pdDogaW5zdGFuY2UuZW1pdCxcbiAgICAgIGV4cG9zZVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIGlmIChpbnN0YW5jZS5leHBvc2VkKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmV4cG9zZVByb3h5IHx8IChpbnN0YW5jZS5leHBvc2VQcm94eSA9IG5ldyBQcm94eShwcm94eVJlZnMobWFya1JhdyhpbnN0YW5jZS5leHBvc2VkKSksIHtcbiAgICAgIGdldCh0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldCkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgaW4gcHVibGljUHJvcGVydGllc01hcCkge1xuICAgICAgICAgIHJldHVybiBwdWJsaWNQcm9wZXJ0aWVzTWFwW2tleV0oaW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFzKHRhcmdldCwga2V5KSB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gdGFyZ2V0IHx8IGtleSBpbiBwdWJsaWNQcm9wZXJ0aWVzTWFwO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaW5zdGFuY2UucHJveHk7XG4gIH1cbn1cbmNvbnN0IGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG5jb25zdCBjbGFzc2lmeSA9IChzdHIpID0+IHN0ci5yZXBsYWNlKGNsYXNzaWZ5UkUsIChjKSA9PiBjLnRvVXBwZXJDYXNlKCkpLnJlcGxhY2UoL1stX10vZywgXCJcIik7XG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCwgaW5jbHVkZUluZmVycmVkID0gdHJ1ZSkge1xuICByZXR1cm4gaXNGdW5jdGlvbihDb21wb25lbnQpID8gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIDogQ29tcG9uZW50Lm5hbWUgfHwgaW5jbHVkZUluZmVycmVkICYmIENvbXBvbmVudC5fX25hbWU7XG59XG5mdW5jdGlvbiBmb3JtYXRDb21wb25lbnROYW1lKGluc3RhbmNlLCBDb21wb25lbnQsIGlzUm9vdCA9IGZhbHNlKSB7XG4gIGxldCBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpO1xuICBpZiAoIW5hbWUgJiYgQ29tcG9uZW50Ll9fZmlsZSkge1xuICAgIGNvbnN0IG1hdGNoID0gQ29tcG9uZW50Ll9fZmlsZS5tYXRjaCgvKFteL1xcXFxdKylcXC5cXHcrJC8pO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgbmFtZSA9IG1hdGNoWzFdO1xuICAgIH1cbiAgfVxuICBpZiAoIW5hbWUgJiYgaW5zdGFuY2UgJiYgaW5zdGFuY2UucGFyZW50KSB7XG4gICAgY29uc3QgaW5mZXJGcm9tUmVnaXN0cnkgPSAocmVnaXN0cnkpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgIGlmIChyZWdpc3RyeVtrZXldID09PSBDb21wb25lbnQpIHtcbiAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBuYW1lID0gaW5mZXJGcm9tUmVnaXN0cnkoXG4gICAgICBpbnN0YW5jZS5jb21wb25lbnRzIHx8IGluc3RhbmNlLnBhcmVudC50eXBlLmNvbXBvbmVudHNcbiAgICApIHx8IGluZmVyRnJvbVJlZ2lzdHJ5KGluc3RhbmNlLmFwcENvbnRleHQuY29tcG9uZW50cyk7XG4gIH1cbiAgcmV0dXJuIG5hbWUgPyBjbGFzc2lmeShuYW1lKSA6IGlzUm9vdCA/IGBBcHBgIDogYEFub255bW91c2A7XG59XG5mdW5jdGlvbiBpc0NsYXNzQ29tcG9uZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc0Z1bmN0aW9uKHZhbHVlKSAmJiBcIl9fdmNjT3B0c1wiIGluIHZhbHVlO1xufVxuXG5jb25zdCBjb21wdXRlZCA9IChnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucykgPT4ge1xuICBjb25zdCBjID0gY29tcHV0ZWQkMShnZXR0ZXJPck9wdGlvbnMsIGRlYnVnT3B0aW9ucywgaXNJblNTUkNvbXBvbmVudFNldHVwKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBjb25zdCBpID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gICAgaWYgKGkgJiYgaS5hcHBDb250ZXh0LmNvbmZpZy53YXJuUmVjdXJzaXZlQ29tcHV0ZWQpIHtcbiAgICAgIGMuX3dhcm5SZWN1cnNpdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYztcbn07XG5cbmZ1bmN0aW9uIGgodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbikge1xuICBjb25zdCBsID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKGwgPT09IDIpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvcHNPckNoaWxkcmVuKSAmJiAhaXNBcnJheShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICBpZiAoaXNWTm9kZShwcm9wc09yQ2hpbGRyZW4pKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0eXBlLCBudWxsLCBbcHJvcHNPckNoaWxkcmVuXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNyZWF0ZVZOb2RlKHR5cGUsIG51bGwsIHByb3BzT3JDaGlsZHJlbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChsID4gMykge1xuICAgICAgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIH0gZWxzZSBpZiAobCA9PT0gMyAmJiBpc1ZOb2RlKGNoaWxkcmVuKSkge1xuICAgICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgcHJvcHNPckNoaWxkcmVuLCBjaGlsZHJlbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdEN1c3RvbUZvcm1hdHRlcigpIHtcbiAgaWYgKCEhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdnVlU3R5bGUgPSB7IHN0eWxlOiBcImNvbG9yOiMzYmE3NzZcIiB9O1xuICBjb25zdCBudW1iZXJTdHlsZSA9IHsgc3R5bGU6IFwiY29sb3I6IzE2NzdmZlwiIH07XG4gIGNvbnN0IHN0cmluZ1N0eWxlID0geyBzdHlsZTogXCJjb2xvcjojZjUyMjJkXCIgfTtcbiAgY29uc3Qga2V5d29yZFN0eWxlID0geyBzdHlsZTogXCJjb2xvcjojZWIyZjk2XCIgfTtcbiAgY29uc3QgZm9ybWF0dGVyID0ge1xuICAgIF9fdnVlX2N1c3RvbV9mb3JtYXR0ZXI6IHRydWUsXG4gICAgaGVhZGVyKG9iaikge1xuICAgICAgaWYgKCFpc09iamVjdChvYmopKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKG9iai5fX2lzVnVlKSB7XG4gICAgICAgIHJldHVybiBbXCJkaXZcIiwgdnVlU3R5bGUsIGBWdWVJbnN0YW5jZWBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlZihvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBnZW5SZWZGbGFnKG9iaildLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIC8vIGF2b2lkIGRlYnVnZ2VyIGFjY2Vzc2luZyB2YWx1ZSBhZmZlY3RpbmcgYmVoYXZpb3JcbiAgICAgICAgICBmb3JtYXRWYWx1ZShcIl92YWx1ZVwiIGluIG9iaiA/IG9iai5fdmFsdWUgOiBvYmopLFxuICAgICAgICAgIGA+YFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIGlmIChpc1JlYWN0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBcImRpdlwiLFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIFtcInNwYW5cIiwgdnVlU3R5bGUsIGlzU2hhbGxvdyhvYmopID8gXCJTaGFsbG93UmVhY3RpdmVcIiA6IFwiUmVhY3RpdmVcIl0sXG4gICAgICAgICAgXCI8XCIsXG4gICAgICAgICAgZm9ybWF0VmFsdWUob2JqKSxcbiAgICAgICAgICBgPiR7aXNSZWFkb25seShvYmopID8gYCAocmVhZG9ubHkpYCA6IGBgfWBcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWFkb25seShvYmopKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgXCJkaXZcIixcbiAgICAgICAgICB7fSxcbiAgICAgICAgICBbXCJzcGFuXCIsIHZ1ZVN0eWxlLCBpc1NoYWxsb3cob2JqKSA/IFwiU2hhbGxvd1JlYWRvbmx5XCIgOiBcIlJlYWRvbmx5XCJdLFxuICAgICAgICAgIFwiPFwiLFxuICAgICAgICAgIGZvcm1hdFZhbHVlKG9iaiksXG4gICAgICAgICAgXCI+XCJcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgaGFzQm9keShvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqLl9faXNWdWU7XG4gICAgfSxcbiAgICBib2R5KG9iaikge1xuICAgICAgaWYgKG9iaiAmJiBvYmouX19pc1Z1ZSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAge30sXG4gICAgICAgICAgLi4uZm9ybWF0SW5zdGFuY2Uob2JqLiQpXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IGJsb2NrcyA9IFtdO1xuICAgIGlmIChpbnN0YW5jZS50eXBlLnByb3BzICYmIGluc3RhbmNlLnByb3BzKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwicHJvcHNcIiwgdG9SYXcoaW5zdGFuY2UucHJvcHMpKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5zZXR1cFN0YXRlICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJzZXR1cFwiLCBpbnN0YW5jZS5zZXR1cFN0YXRlKSk7XG4gICAgfVxuICAgIGlmIChpbnN0YW5jZS5kYXRhICE9PSBFTVBUWV9PQkopIHtcbiAgICAgIGJsb2Nrcy5wdXNoKGNyZWF0ZUluc3RhbmNlQmxvY2soXCJkYXRhXCIsIHRvUmF3KGluc3RhbmNlLmRhdGEpKSk7XG4gICAgfVxuICAgIGNvbnN0IGNvbXB1dGVkID0gZXh0cmFjdEtleXMoaW5zdGFuY2UsIFwiY29tcHV0ZWRcIik7XG4gICAgaWYgKGNvbXB1dGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiY29tcHV0ZWRcIiwgY29tcHV0ZWQpKTtcbiAgICB9XG4gICAgY29uc3QgaW5qZWN0ZWQgPSBleHRyYWN0S2V5cyhpbnN0YW5jZSwgXCJpbmplY3RcIik7XG4gICAgaWYgKGluamVjdGVkKSB7XG4gICAgICBibG9ja3MucHVzaChjcmVhdGVJbnN0YW5jZUJsb2NrKFwiaW5qZWN0ZWRcIiwgaW5qZWN0ZWQpKTtcbiAgICB9XG4gICAgYmxvY2tzLnB1c2goW1xuICAgICAgXCJkaXZcIixcbiAgICAgIHt9LFxuICAgICAgW1xuICAgICAgICBcInNwYW5cIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBrZXl3b3JkU3R5bGUuc3R5bGUgKyBcIjtvcGFjaXR5OjAuNjZcIlxuICAgICAgICB9LFxuICAgICAgICBcIiQgKGludGVybmFsKTogXCJcbiAgICAgIF0sXG4gICAgICBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGluc3RhbmNlIH1dXG4gICAgXSk7XG4gICAgcmV0dXJuIGJsb2NrcztcbiAgfVxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUJsb2NrKHR5cGUsIHRhcmdldCkge1xuICAgIHRhcmdldCA9IGV4dGVuZCh7fSwgdGFyZ2V0KTtcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRhcmdldCkubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCB7fV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBcImRpdlwiLFxuICAgICAgeyBzdHlsZTogXCJsaW5lLWhlaWdodDoxLjI1ZW07bWFyZ2luLWJvdHRvbTowLjZlbVwiIH0sXG4gICAgICBbXG4gICAgICAgIFwiZGl2XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBzdHlsZTogXCJjb2xvcjojNDc2NTgyXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgXCJkaXZcIixcbiAgICAgICAge1xuICAgICAgICAgIHN0eWxlOiBcInBhZGRpbmctbGVmdDoxLjI1ZW1cIlxuICAgICAgICB9LFxuICAgICAgICAuLi5PYmplY3Qua2V5cyh0YXJnZXQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIFwiZGl2XCIsXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgICAgIFtcInNwYW5cIiwga2V5d29yZFN0eWxlLCBrZXkgKyBcIjogXCJdLFxuICAgICAgICAgICAgZm9ybWF0VmFsdWUodGFyZ2V0W2tleV0sIGZhbHNlKVxuICAgICAgICAgIF07XG4gICAgICAgIH0pXG4gICAgICBdXG4gICAgXTtcbiAgfVxuICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh2LCBhc1JhdyA9IHRydWUpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBbXCJzcGFuXCIsIG51bWJlclN0eWxlLCB2XTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgSlNPTi5zdHJpbmdpZnkodildO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBrZXl3b3JkU3R5bGUsIHZdO1xuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodikpIHtcbiAgICAgIHJldHVybiBbXCJvYmplY3RcIiwgeyBvYmplY3Q6IGFzUmF3ID8gdG9SYXcodikgOiB2IH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW1wic3BhblwiLCBzdHJpbmdTdHlsZSwgU3RyaW5nKHYpXTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZXh0cmFjdEtleXMoaW5zdGFuY2UsIHR5cGUpIHtcbiAgICBjb25zdCBDb21wID0gaW5zdGFuY2UudHlwZTtcbiAgICBpZiAoaXNGdW5jdGlvbihDb21wKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHRyYWN0ZWQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBpbnN0YW5jZS5jdHgpIHtcbiAgICAgIGlmIChpc0tleU9mVHlwZShDb21wLCBrZXksIHR5cGUpKSB7XG4gICAgICAgIGV4dHJhY3RlZFtrZXldID0gaW5zdGFuY2UuY3R4W2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHRyYWN0ZWQ7XG4gIH1cbiAgZnVuY3Rpb24gaXNLZXlPZlR5cGUoQ29tcCwga2V5LCB0eXBlKSB7XG4gICAgY29uc3Qgb3B0cyA9IENvbXBbdHlwZV07XG4gICAgaWYgKGlzQXJyYXkob3B0cykgJiYgb3B0cy5pbmNsdWRlcyhrZXkpIHx8IGlzT2JqZWN0KG9wdHMpICYmIGtleSBpbiBvcHRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENvbXAuZXh0ZW5kcyAmJiBpc0tleU9mVHlwZShDb21wLmV4dGVuZHMsIGtleSwgdHlwZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQ29tcC5taXhpbnMgJiYgQ29tcC5taXhpbnMuc29tZSgobSkgPT4gaXNLZXlPZlR5cGUobSwga2V5LCB0eXBlKSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBnZW5SZWZGbGFnKHYpIHtcbiAgICBpZiAoaXNTaGFsbG93KHYpKSB7XG4gICAgICByZXR1cm4gYFNoYWxsb3dSZWZgO1xuICAgIH1cbiAgICBpZiAodi5lZmZlY3QpIHtcbiAgICAgIHJldHVybiBgQ29tcHV0ZWRSZWZgO1xuICAgIH1cbiAgICByZXR1cm4gYFJlZmA7XG4gIH1cbiAgaWYgKHdpbmRvdy5kZXZ0b29sc0Zvcm1hdHRlcnMpIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzLnB1c2goZm9ybWF0dGVyKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuZGV2dG9vbHNGb3JtYXR0ZXJzID0gW2Zvcm1hdHRlcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gd2l0aE1lbW8obWVtbywgcmVuZGVyLCBjYWNoZSwgaW5kZXgpIHtcbiAgY29uc3QgY2FjaGVkID0gY2FjaGVbaW5kZXhdO1xuICBpZiAoY2FjaGVkICYmIGlzTWVtb1NhbWUoY2FjaGVkLCBtZW1vKSkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgY29uc3QgcmV0ID0gcmVuZGVyKCk7XG4gIHJldC5tZW1vID0gbWVtby5zbGljZSgpO1xuICByZXQuY2FjaGVJbmRleCA9IGluZGV4O1xuICByZXR1cm4gY2FjaGVbaW5kZXhdID0gcmV0O1xufVxuZnVuY3Rpb24gaXNNZW1vU2FtZShjYWNoZWQsIG1lbW8pIHtcbiAgY29uc3QgcHJldiA9IGNhY2hlZC5tZW1vO1xuICBpZiAocHJldi5sZW5ndGggIT0gbWVtby5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGhhc0NoYW5nZWQocHJldltpXSwgbWVtb1tpXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxvY2tUcmVlRW5hYmxlZCA+IDAgJiYgY3VycmVudEJsb2NrKSB7XG4gICAgY3VycmVudEJsb2NrLnB1c2goY2FjaGVkKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgdmVyc2lvbiA9IFwiMy41LjZcIjtcbmNvbnN0IHdhcm4gPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gd2FybiQxIDogTk9PUDtcbmNvbnN0IEVycm9yVHlwZVN0cmluZ3MgPSBFcnJvclR5cGVTdHJpbmdzJDEgO1xuY29uc3QgZGV2dG9vbHMgPSAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHx8IHRydWUgPyBkZXZ0b29scyQxIDogdm9pZCAwO1xuY29uc3Qgc2V0RGV2dG9vbHNIb29rID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCB0cnVlID8gc2V0RGV2dG9vbHNIb29rJDEgOiBOT09QO1xuY29uc3QgX3NzclV0aWxzID0ge1xuICBjcmVhdGVDb21wb25lbnRJbnN0YW5jZSxcbiAgc2V0dXBDb21wb25lbnQsXG4gIHJlbmRlckNvbXBvbmVudFJvb3QsXG4gIHNldEN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSxcbiAgaXNWTm9kZTogaXNWTm9kZSxcbiAgbm9ybWFsaXplVk5vZGUsXG4gIGdldENvbXBvbmVudFB1YmxpY0luc3RhbmNlLFxuICBlbnN1cmVWYWxpZFZOb2RlLFxuICBwdXNoV2FybmluZ0NvbnRleHQsXG4gIHBvcFdhcm5pbmdDb250ZXh0XG59O1xuY29uc3Qgc3NyVXRpbHMgPSBfc3NyVXRpbHMgO1xuY29uc3QgcmVzb2x2ZUZpbHRlciA9IG51bGw7XG5jb25zdCBjb21wYXRVdGlscyA9IG51bGw7XG5jb25zdCBEZXByZWNhdGlvblR5cGVzID0gbnVsbDtcblxuZXhwb3J0IHsgQmFzZVRyYW5zaXRpb24sIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBDb21tZW50LCBEZXByZWNhdGlvblR5cGVzLCBFcnJvckNvZGVzLCBFcnJvclR5cGVTdHJpbmdzLCBGcmFnbWVudCwgS2VlcEFsaXZlLCBTdGF0aWMsIFN1c3BlbnNlLCBUZWxlcG9ydCwgVGV4dCwgYXNzZXJ0TnVtYmVyLCBjYWxsV2l0aEFzeW5jRXJyb3JIYW5kbGluZywgY2FsbFdpdGhFcnJvckhhbmRsaW5nLCBjbG9uZVZOb2RlLCBjb21wYXRVdGlscywgY29tcHV0ZWQsIGNyZWF0ZUJsb2NrLCBjcmVhdGVDb21tZW50Vk5vZGUsIGNyZWF0ZUVsZW1lbnRCbG9jaywgY3JlYXRlQmFzZVZOb2RlIGFzIGNyZWF0ZUVsZW1lbnRWTm9kZSwgY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIsIGNyZWF0ZVByb3BzUmVzdFByb3h5LCBjcmVhdGVSZW5kZXJlciwgY3JlYXRlU2xvdHMsIGNyZWF0ZVN0YXRpY1ZOb2RlLCBjcmVhdGVUZXh0Vk5vZGUsIGNyZWF0ZVZOb2RlLCBkZWZpbmVBc3luY0NvbXBvbmVudCwgZGVmaW5lQ29tcG9uZW50LCBkZWZpbmVFbWl0cywgZGVmaW5lRXhwb3NlLCBkZWZpbmVNb2RlbCwgZGVmaW5lT3B0aW9ucywgZGVmaW5lUHJvcHMsIGRlZmluZVNsb3RzLCBkZXZ0b29scywgZ2V0Q3VycmVudEluc3RhbmNlLCBnZXRUcmFuc2l0aW9uUmF3Q2hpbGRyZW4sIGd1YXJkUmVhY3RpdmVQcm9wcywgaCwgaGFuZGxlRXJyb3IsIGhhc0luamVjdGlvbkNvbnRleHQsIGh5ZHJhdGVPbklkbGUsIGh5ZHJhdGVPbkludGVyYWN0aW9uLCBoeWRyYXRlT25NZWRpYVF1ZXJ5LCBoeWRyYXRlT25WaXNpYmxlLCBpbml0Q3VzdG9tRm9ybWF0dGVyLCBpbmplY3QsIGlzTWVtb1NhbWUsIGlzUnVudGltZU9ubHksIGlzVk5vZGUsIG1lcmdlRGVmYXVsdHMsIG1lcmdlTW9kZWxzLCBtZXJnZVByb3BzLCBuZXh0VGljaywgb25BY3RpdmF0ZWQsIG9uQmVmb3JlTW91bnQsIG9uQmVmb3JlVW5tb3VudCwgb25CZWZvcmVVcGRhdGUsIG9uRGVhY3RpdmF0ZWQsIG9uRXJyb3JDYXB0dXJlZCwgb25Nb3VudGVkLCBvblJlbmRlclRyYWNrZWQsIG9uUmVuZGVyVHJpZ2dlcmVkLCBvblNlcnZlclByZWZldGNoLCBvblVubW91bnRlZCwgb25VcGRhdGVkLCBvcGVuQmxvY2ssIHBvcFNjb3BlSWQsIHByb3ZpZGUsIHB1c2hTY29wZUlkLCBxdWV1ZVBvc3RGbHVzaENiLCByZWdpc3RlclJ1bnRpbWVDb21waWxlciwgcmVuZGVyTGlzdCwgcmVuZGVyU2xvdCwgcmVzb2x2ZUNvbXBvbmVudCwgcmVzb2x2ZURpcmVjdGl2ZSwgcmVzb2x2ZUR5bmFtaWNDb21wb25lbnQsIHJlc29sdmVGaWx0ZXIsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIHNldEJsb2NrVHJhY2tpbmcsIHNldERldnRvb2xzSG9vaywgc2V0VHJhbnNpdGlvbkhvb2tzLCBzc3JDb250ZXh0S2V5LCBzc3JVdGlscywgdG9IYW5kbGVycywgdHJhbnNmb3JtVk5vZGVBcmdzLCB1c2VBdHRycywgdXNlSWQsIHVzZU1vZGVsLCB1c2VTU1JDb250ZXh0LCB1c2VTbG90cywgdXNlVGVtcGxhdGVSZWYsIHVzZVRyYW5zaXRpb25TdGF0ZSwgdmVyc2lvbiwgd2Fybiwgd2F0Y2gsIHdhdGNoRWZmZWN0LCB3YXRjaFBvc3RFZmZlY3QsIHdhdGNoU3luY0VmZmVjdCwgd2l0aEFzeW5jQ29udGV4dCwgd2l0aEN0eCwgd2l0aERlZmF1bHRzLCB3aXRoRGlyZWN0aXZlcywgd2l0aE1lbW8sIHdpdGhTY29wZUlkIH07XG4iLCIvKipcbiogQHZ1ZS9ydW50aW1lLWRvbSB2My41LjZcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IHdhcm4sIGgsIEJhc2VUcmFuc2l0aW9uLCBhc3NlcnROdW1iZXIsIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLCBnZXRDdXJyZW50SW5zdGFuY2UsIG9uQmVmb3JlTW91bnQsIHdhdGNoUG9zdEVmZmVjdCwgb25Nb3VudGVkLCBvblVubW91bnRlZCwgRnJhZ21lbnQsIFN0YXRpYywgY2FtZWxpemUsIGNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nLCBkZWZpbmVDb21wb25lbnQsIG5leHRUaWNrLCB1bnJlZiwgY3JlYXRlVk5vZGUsIHVzZVRyYW5zaXRpb25TdGF0ZSwgb25VcGRhdGVkLCB0b1JhdywgZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuLCBzZXRUcmFuc2l0aW9uSG9va3MsIHJlc29sdmVUcmFuc2l0aW9uSG9va3MsIFRleHQsIGlzUnVudGltZU9ubHksIGNyZWF0ZVJlbmRlcmVyLCBjcmVhdGVIeWRyYXRpb25SZW5kZXJlciB9IGZyb20gJ0B2dWUvcnVudGltZS1jb3JlJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvcnVudGltZS1jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaXNPYmplY3QsIHRvTnVtYmVyLCBpc0FycmF5LCBpc1N0cmluZywgaHlwaGVuYXRlLCBjYXBpdGFsaXplLCBpbmNsdWRlQm9vbGVhbkF0dHIsIGlzU3ltYm9sLCBpc1NwZWNpYWxCb29sZWFuQXR0ciwgaXNGdW5jdGlvbiwgTk9PUCwgaXNPbiwgaXNNb2RlbExpc3RlbmVyLCBpc1BsYWluT2JqZWN0LCBoYXNPd24sIGNhbWVsaXplIGFzIGNhbWVsaXplJDEsIEVNUFRZX09CSiwgbG9vc2VUb051bWJlciwgbG9vc2VJbmRleE9mLCBpc1NldCwgbG9vc2VFcXVhbCwgaW52b2tlQXJyYXlGbnMsIGlzSFRNTFRhZywgaXNTVkdUYWcsIGlzTWF0aE1MVGFnIH0gZnJvbSAnQHZ1ZS9zaGFyZWQnO1xuXG5sZXQgcG9saWN5ID0gdm9pZCAwO1xuY29uc3QgdHQgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy50cnVzdGVkVHlwZXM7XG5pZiAodHQpIHtcbiAgdHJ5IHtcbiAgICBwb2xpY3kgPSAvKiBAX19QVVJFX18gKi8gdHQuY3JlYXRlUG9saWN5KFwidnVlXCIsIHtcbiAgICAgIGNyZWF0ZUhUTUw6ICh2YWwpID0+IHZhbFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBFcnJvciBjcmVhdGluZyB0cnVzdGVkIHR5cGVzIHBvbGljeTogJHtlfWApO1xuICB9XG59XG5jb25zdCB1bnNhZmVUb1RydXN0ZWRIVE1MID0gcG9saWN5ID8gKHZhbCkgPT4gcG9saWN5LmNyZWF0ZUhUTUwodmFsKSA6ICh2YWwpID0+IHZhbDtcbmNvbnN0IHN2Z05TID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO1xuY29uc3QgbWF0aG1sTlMgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtcbmNvbnN0IGRvYyA9IHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IGRvY3VtZW50IDogbnVsbDtcbmNvbnN0IHRlbXBsYXRlQ29udGFpbmVyID0gZG9jICYmIC8qIEBfX1BVUkVfXyAqLyBkb2MuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuY29uc3Qgbm9kZU9wcyA9IHtcbiAgaW5zZXJ0OiAoY2hpbGQsIHBhcmVudCwgYW5jaG9yKSA9PiB7XG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYW5jaG9yIHx8IG51bGwpO1xuICB9LFxuICByZW1vdmU6IChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGNoaWxkLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6ICh0YWcsIG5hbWVzcGFjZSwgaXMsIHByb3BzKSA9PiB7XG4gICAgY29uc3QgZWwgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBkb2MuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCB0YWcpIDogbmFtZXNwYWNlID09PSBcIm1hdGhtbFwiID8gZG9jLmNyZWF0ZUVsZW1lbnROUyhtYXRobWxOUywgdGFnKSA6IGlzID8gZG9jLmNyZWF0ZUVsZW1lbnQodGFnLCB7IGlzIH0pIDogZG9jLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICBpZiAodGFnID09PSBcInNlbGVjdFwiICYmIHByb3BzICYmIHByb3BzLm11bHRpcGxlICE9IG51bGwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIsIHByb3BzLm11bHRpcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsO1xuICB9LFxuICBjcmVhdGVUZXh0OiAodGV4dCkgPT4gZG9jLmNyZWF0ZVRleHROb2RlKHRleHQpLFxuICBjcmVhdGVDb21tZW50OiAodGV4dCkgPT4gZG9jLmNyZWF0ZUNvbW1lbnQodGV4dCksXG4gIHNldFRleHQ6IChub2RlLCB0ZXh0KSA9PiB7XG4gICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICB9LFxuICBzZXRFbGVtZW50VGV4dDogKGVsLCB0ZXh0KSA9PiB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9LFxuICBwYXJlbnROb2RlOiAobm9kZSkgPT4gbm9kZS5wYXJlbnROb2RlLFxuICBuZXh0U2libGluZzogKG5vZGUpID0+IG5vZGUubmV4dFNpYmxpbmcsXG4gIHF1ZXJ5U2VsZWN0b3I6IChzZWxlY3RvcikgPT4gZG9jLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpLFxuICBzZXRTY29wZUlkKGVsLCBpZCkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gIH0sXG4gIC8vIF9fVU5TQUZFX19cbiAgLy8gUmVhc29uOiBpbm5lckhUTUwuXG4gIC8vIFN0YXRpYyBjb250ZW50IGhlcmUgY2FuIG9ubHkgY29tZSBmcm9tIGNvbXBpbGVkIHRlbXBsYXRlcy5cbiAgLy8gQXMgbG9uZyBhcyB0aGUgdXNlciBvbmx5IHVzZXMgdHJ1c3RlZCB0ZW1wbGF0ZXMsIHRoaXMgaXMgc2FmZS5cbiAgaW5zZXJ0U3RhdGljQ29udGVudChjb250ZW50LCBwYXJlbnQsIGFuY2hvciwgbmFtZXNwYWNlLCBzdGFydCwgZW5kKSB7XG4gICAgY29uc3QgYmVmb3JlID0gYW5jaG9yID8gYW5jaG9yLnByZXZpb3VzU2libGluZyA6IHBhcmVudC5sYXN0Q2hpbGQ7XG4gICAgaWYgKHN0YXJ0ICYmIChzdGFydCA9PT0gZW5kIHx8IHN0YXJ0Lm5leHRTaWJsaW5nKSkge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShzdGFydC5jbG9uZU5vZGUodHJ1ZSksIGFuY2hvcik7XG4gICAgICAgIGlmIChzdGFydCA9PT0gZW5kIHx8ICEoc3RhcnQgPSBzdGFydC5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ZW1wbGF0ZUNvbnRhaW5lci5pbm5lckhUTUwgPSB1bnNhZmVUb1RydXN0ZWRIVE1MKFxuICAgICAgICBuYW1lc3BhY2UgPT09IFwic3ZnXCIgPyBgPHN2Zz4ke2NvbnRlbnR9PC9zdmc+YCA6IG5hbWVzcGFjZSA9PT0gXCJtYXRobWxcIiA/IGA8bWF0aD4ke2NvbnRlbnR9PC9tYXRoPmAgOiBjb250ZW50XG4gICAgICApO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZUNvbnRhaW5lci5jb250ZW50O1xuICAgICAgaWYgKG5hbWVzcGFjZSA9PT0gXCJzdmdcIiB8fCBuYW1lc3BhY2UgPT09IFwibWF0aG1sXCIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRlbXBsYXRlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlICh3cmFwcGVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmRDaGlsZCh3cmFwcGVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIHRlbXBsYXRlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgfVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0ZW1wbGF0ZSwgYW5jaG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGZpcnN0XG4gICAgICBiZWZvcmUgPyBiZWZvcmUubmV4dFNpYmxpbmcgOiBwYXJlbnQuZmlyc3RDaGlsZCxcbiAgICAgIC8vIGxhc3RcbiAgICAgIGFuY2hvciA/IGFuY2hvci5wcmV2aW91c1NpYmxpbmcgOiBwYXJlbnQubGFzdENoaWxkXG4gICAgXTtcbiAgfVxufTtcblxuY29uc3QgVFJBTlNJVElPTiA9IFwidHJhbnNpdGlvblwiO1xuY29uc3QgQU5JTUFUSU9OID0gXCJhbmltYXRpb25cIjtcbmNvbnN0IHZ0Y0tleSA9IFN5bWJvbChcIl92dGNcIik7XG5jb25zdCBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0ge1xuICBuYW1lOiBTdHJpbmcsXG4gIHR5cGU6IFN0cmluZyxcbiAgY3NzOiB7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBkZWZhdWx0OiB0cnVlXG4gIH0sXG4gIGR1cmF0aW9uOiBbU3RyaW5nLCBOdW1iZXIsIE9iamVjdF0sXG4gIGVudGVyRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGVudGVyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGFwcGVhckZyb21DbGFzczogU3RyaW5nLFxuICBhcHBlYXJBY3RpdmVDbGFzczogU3RyaW5nLFxuICBhcHBlYXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlRnJvbUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgbGVhdmVUb0NsYXNzOiBTdHJpbmdcbn07XG5jb25zdCBUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzID0gLyogQF9fUFVSRV9fICovIGV4dGVuZChcbiAge30sXG4gIEJhc2VUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzLFxuICBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzXG4pO1xuY29uc3QgZGVjb3JhdGUkMSA9ICh0KSA9PiB7XG4gIHQuZGlzcGxheU5hbWUgPSBcIlRyYW5zaXRpb25cIjtcbiAgdC5wcm9wcyA9IFRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnM7XG4gIHJldHVybiB0O1xufTtcbmNvbnN0IFRyYW5zaXRpb24gPSAvKiBAX19QVVJFX18gKi8gZGVjb3JhdGUkMShcbiAgKHByb3BzLCB7IHNsb3RzIH0pID0+IGgoQmFzZVRyYW5zaXRpb24sIHJlc29sdmVUcmFuc2l0aW9uUHJvcHMocHJvcHMpLCBzbG90cylcbik7XG5jb25zdCBjYWxsSG9vayA9IChob29rLCBhcmdzID0gW10pID0+IHtcbiAgaWYgKGlzQXJyYXkoaG9vaykpIHtcbiAgICBob29rLmZvckVhY2goKGgyKSA9PiBoMiguLi5hcmdzKSk7XG4gIH0gZWxzZSBpZiAoaG9vaykge1xuICAgIGhvb2soLi4uYXJncyk7XG4gIH1cbn07XG5jb25zdCBoYXNFeHBsaWNpdENhbGxiYWNrID0gKGhvb2spID0+IHtcbiAgcmV0dXJuIGhvb2sgPyBpc0FycmF5KGhvb2spID8gaG9vay5zb21lKChoMikgPT4gaDIubGVuZ3RoID4gMSkgOiBob29rLmxlbmd0aCA+IDEgOiBmYWxzZTtcbn07XG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGlvblByb3BzKHJhd1Byb3BzKSB7XG4gIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiByYXdQcm9wcykge1xuICAgIGlmICghKGtleSBpbiBET01UcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzKSkge1xuICAgICAgYmFzZVByb3BzW2tleV0gPSByYXdQcm9wc1trZXldO1xuICAgIH1cbiAgfVxuICBpZiAocmF3UHJvcHMuY3NzID09PSBmYWxzZSkge1xuICAgIHJldHVybiBiYXNlUHJvcHM7XG4gIH1cbiAgY29uc3Qge1xuICAgIG5hbWUgPSBcInZcIixcbiAgICB0eXBlLFxuICAgIGR1cmF0aW9uLFxuICAgIGVudGVyRnJvbUNsYXNzID0gYCR7bmFtZX0tZW50ZXItZnJvbWAsXG4gICAgZW50ZXJBY3RpdmVDbGFzcyA9IGAke25hbWV9LWVudGVyLWFjdGl2ZWAsXG4gICAgZW50ZXJUb0NsYXNzID0gYCR7bmFtZX0tZW50ZXItdG9gLFxuICAgIGFwcGVhckZyb21DbGFzcyA9IGVudGVyRnJvbUNsYXNzLFxuICAgIGFwcGVhckFjdGl2ZUNsYXNzID0gZW50ZXJBY3RpdmVDbGFzcyxcbiAgICBhcHBlYXJUb0NsYXNzID0gZW50ZXJUb0NsYXNzLFxuICAgIGxlYXZlRnJvbUNsYXNzID0gYCR7bmFtZX0tbGVhdmUtZnJvbWAsXG4gICAgbGVhdmVBY3RpdmVDbGFzcyA9IGAke25hbWV9LWxlYXZlLWFjdGl2ZWAsXG4gICAgbGVhdmVUb0NsYXNzID0gYCR7bmFtZX0tbGVhdmUtdG9gXG4gIH0gPSByYXdQcm9wcztcbiAgY29uc3QgZHVyYXRpb25zID0gbm9ybWFsaXplRHVyYXRpb24oZHVyYXRpb24pO1xuICBjb25zdCBlbnRlckR1cmF0aW9uID0gZHVyYXRpb25zICYmIGR1cmF0aW9uc1swXTtcbiAgY29uc3QgbGVhdmVEdXJhdGlvbiA9IGR1cmF0aW9ucyAmJiBkdXJhdGlvbnNbMV07XG4gIGNvbnN0IHtcbiAgICBvbkJlZm9yZUVudGVyLFxuICAgIG9uRW50ZXIsXG4gICAgb25FbnRlckNhbmNlbGxlZCxcbiAgICBvbkxlYXZlLFxuICAgIG9uTGVhdmVDYW5jZWxsZWQsXG4gICAgb25CZWZvcmVBcHBlYXIgPSBvbkJlZm9yZUVudGVyLFxuICAgIG9uQXBwZWFyID0gb25FbnRlcixcbiAgICBvbkFwcGVhckNhbmNlbGxlZCA9IG9uRW50ZXJDYW5jZWxsZWRcbiAgfSA9IGJhc2VQcm9wcztcbiAgY29uc3QgZmluaXNoRW50ZXIgPSAoZWwsIGlzQXBwZWFyLCBkb25lKSA9PiB7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBpc0FwcGVhciA/IGFwcGVhclRvQ2xhc3MgOiBlbnRlclRvQ2xhc3MpO1xuICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3MpO1xuICAgIGRvbmUgJiYgZG9uZSgpO1xuICB9O1xuICBjb25zdCBmaW5pc2hMZWF2ZSA9IChlbCwgZG9uZSkgPT4ge1xuICAgIGVsLl9pc0xlYXZpbmcgPSBmYWxzZTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBsZWF2ZUFjdGl2ZUNsYXNzKTtcbiAgICBkb25lICYmIGRvbmUoKTtcbiAgfTtcbiAgY29uc3QgbWFrZUVudGVySG9vayA9IChpc0FwcGVhcikgPT4ge1xuICAgIHJldHVybiAoZWwsIGRvbmUpID0+IHtcbiAgICAgIGNvbnN0IGhvb2sgPSBpc0FwcGVhciA/IG9uQXBwZWFyIDogb25FbnRlcjtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hFbnRlcihlbCwgaXNBcHBlYXIsIGRvbmUpO1xuICAgICAgY2FsbEhvb2soaG9vaywgW2VsLCByZXNvbHZlXSk7XG4gICAgICBuZXh0RnJhbWUoKCkgPT4ge1xuICAgICAgICByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyRnJvbUNsYXNzIDogZW50ZXJGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhob29rKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgZW50ZXJEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG4gIHJldHVybiBleHRlbmQoYmFzZVByb3BzLCB7XG4gICAgb25CZWZvcmVFbnRlcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVFbnRlciwgW2VsXSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGVudGVyRnJvbUNsYXNzKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgZW50ZXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkJlZm9yZUFwcGVhcihlbCkge1xuICAgICAgY2FsbEhvb2sob25CZWZvcmVBcHBlYXIsIFtlbF0pO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJGcm9tQ2xhc3MpO1xuICAgICAgYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBhcHBlYXJBY3RpdmVDbGFzcyk7XG4gICAgfSxcbiAgICBvbkVudGVyOiBtYWtlRW50ZXJIb29rKGZhbHNlKSxcbiAgICBvbkFwcGVhcjogbWFrZUVudGVySG9vayh0cnVlKSxcbiAgICBvbkxlYXZlKGVsLCBkb25lKSB7XG4gICAgICBlbC5faXNMZWF2aW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHJlc29sdmUgPSAoKSA9PiBmaW5pc2hMZWF2ZShlbCwgZG9uZSk7XG4gICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlRnJvbUNsYXNzKTtcbiAgICAgIGFkZFRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVBY3RpdmVDbGFzcyk7XG4gICAgICBmb3JjZVJlZmxvdygpO1xuICAgICAgbmV4dEZyYW1lKCgpID0+IHtcbiAgICAgICAgaWYgKCFlbC5faXNMZWF2aW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlbW92ZVRyYW5zaXRpb25DbGFzcyhlbCwgbGVhdmVGcm9tQ2xhc3MpO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIGxlYXZlVG9DbGFzcyk7XG4gICAgICAgIGlmICghaGFzRXhwbGljaXRDYWxsYmFjayhvbkxlYXZlKSkge1xuICAgICAgICAgIHdoZW5UcmFuc2l0aW9uRW5kcyhlbCwgdHlwZSwgbGVhdmVEdXJhdGlvbiwgcmVzb2x2ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZSwgW2VsLCByZXNvbHZlXSk7XG4gICAgfSxcbiAgICBvbkVudGVyQ2FuY2VsbGVkKGVsKSB7XG4gICAgICBmaW5pc2hFbnRlcihlbCwgZmFsc2UpO1xuICAgICAgY2FsbEhvb2sob25FbnRlckNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfSxcbiAgICBvbkFwcGVhckNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoRW50ZXIoZWwsIHRydWUpO1xuICAgICAgY2FsbEhvb2sob25BcHBlYXJDYW5jZWxsZWQsIFtlbF0pO1xuICAgIH0sXG4gICAgb25MZWF2ZUNhbmNlbGxlZChlbCkge1xuICAgICAgZmluaXNoTGVhdmUoZWwpO1xuICAgICAgY2FsbEhvb2sob25MZWF2ZUNhbmNlbGxlZCwgW2VsXSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUR1cmF0aW9uKGR1cmF0aW9uKSB7XG4gIGlmIChkdXJhdGlvbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoZHVyYXRpb24pKSB7XG4gICAgcmV0dXJuIFtOdW1iZXJPZihkdXJhdGlvbi5lbnRlciksIE51bWJlck9mKGR1cmF0aW9uLmxlYXZlKV07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbiA9IE51bWJlck9mKGR1cmF0aW9uKTtcbiAgICByZXR1cm4gW24sIG5dO1xuICB9XG59XG5mdW5jdGlvbiBOdW1iZXJPZih2YWwpIHtcbiAgY29uc3QgcmVzID0gdG9OdW1iZXIodmFsKTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBhc3NlcnROdW1iZXIocmVzLCBcIjx0cmFuc2l0aW9uPiBleHBsaWNpdCBkdXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZnVuY3Rpb24gYWRkVHJhbnNpdGlvbkNsYXNzKGVsLCBjbHMpIHtcbiAgY2xzLnNwbGl0KC9cXHMrLykuZm9yRWFjaCgoYykgPT4gYyAmJiBlbC5jbGFzc0xpc3QuYWRkKGMpKTtcbiAgKGVsW3Z0Y0tleV0gfHwgKGVsW3Z0Y0tleV0gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpKSkuYWRkKGNscyk7XG59XG5mdW5jdGlvbiByZW1vdmVUcmFuc2l0aW9uQ2xhc3MoZWwsIGNscykge1xuICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGVsLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICBjb25zdCBfdnRjID0gZWxbdnRjS2V5XTtcbiAgaWYgKF92dGMpIHtcbiAgICBfdnRjLmRlbGV0ZShjbHMpO1xuICAgIGlmICghX3Z0Yy5zaXplKSB7XG4gICAgICBlbFt2dGNLZXldID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbmV4dEZyYW1lKGNiKSB7XG4gIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNiKTtcbiAgfSk7XG59XG5sZXQgZW5kSWQgPSAwO1xuZnVuY3Rpb24gd2hlblRyYW5zaXRpb25FbmRzKGVsLCBleHBlY3RlZFR5cGUsIGV4cGxpY2l0VGltZW91dCwgcmVzb2x2ZSkge1xuICBjb25zdCBpZCA9IGVsLl9lbmRJZCA9ICsrZW5kSWQ7XG4gIGNvbnN0IHJlc29sdmVJZk5vdFN0YWxlID0gKCkgPT4ge1xuICAgIGlmIChpZCA9PT0gZWwuX2VuZElkKSB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfVxuICB9O1xuICBpZiAoZXhwbGljaXRUaW1lb3V0KSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZUlmTm90U3RhbGUsIGV4cGxpY2l0VGltZW91dCk7XG4gIH1cbiAgY29uc3QgeyB0eXBlLCB0aW1lb3V0LCBwcm9wQ291bnQgfSA9IGdldFRyYW5zaXRpb25JbmZvKGVsLCBleHBlY3RlZFR5cGUpO1xuICBpZiAoIXR5cGUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGVuZEV2ZW50ID0gdHlwZSArIFwiZW5kXCI7XG4gIGxldCBlbmRlZCA9IDA7XG4gIGNvbnN0IGVuZCA9ICgpID0+IHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGVuZEV2ZW50LCBvbkVuZCk7XG4gICAgcmVzb2x2ZUlmTm90U3RhbGUoKTtcbiAgfTtcbiAgY29uc3Qgb25FbmQgPSAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gZWwgJiYgKytlbmRlZCA+PSBwcm9wQ291bnQpIHtcbiAgICAgIGVuZCgpO1xuICAgIH1cbiAgfTtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgaWYgKGVuZGVkIDwgcHJvcENvdW50KSB7XG4gICAgICBlbmQoKTtcbiAgICB9XG4gIH0sIHRpbWVvdXQgKyAxKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihlbmRFdmVudCwgb25FbmQpO1xufVxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkluZm8oZWwsIGV4cGVjdGVkVHlwZSkge1xuICBjb25zdCBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCk7XG4gIGNvbnN0IGdldFN0eWxlUHJvcGVydGllcyA9IChrZXkpID0+IChzdHlsZXNba2V5XSB8fCBcIlwiKS5zcGxpdChcIiwgXCIpO1xuICBjb25zdCB0cmFuc2l0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke1RSQU5TSVRJT059RGVsYXlgKTtcbiAgY29uc3QgdHJhbnNpdGlvbkR1cmF0aW9ucyA9IGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IHRyYW5zaXRpb25UaW1lb3V0ID0gZ2V0VGltZW91dCh0cmFuc2l0aW9uRGVsYXlzLCB0cmFuc2l0aW9uRHVyYXRpb25zKTtcbiAgY29uc3QgYW5pbWF0aW9uRGVsYXlzID0gZ2V0U3R5bGVQcm9wZXJ0aWVzKGAke0FOSU1BVElPTn1EZWxheWApO1xuICBjb25zdCBhbmltYXRpb25EdXJhdGlvbnMgPSBnZXRTdHlsZVByb3BlcnRpZXMoYCR7QU5JTUFUSU9OfUR1cmF0aW9uYCk7XG4gIGNvbnN0IGFuaW1hdGlvblRpbWVvdXQgPSBnZXRUaW1lb3V0KGFuaW1hdGlvbkRlbGF5cywgYW5pbWF0aW9uRHVyYXRpb25zKTtcbiAgbGV0IHR5cGUgPSBudWxsO1xuICBsZXQgdGltZW91dCA9IDA7XG4gIGxldCBwcm9wQ291bnQgPSAwO1xuICBpZiAoZXhwZWN0ZWRUeXBlID09PSBUUkFOU0lUSU9OKSB7XG4gICAgaWYgKHRyYW5zaXRpb25UaW1lb3V0ID4gMCkge1xuICAgICAgdHlwZSA9IFRSQU5TSVRJT047XG4gICAgICB0aW1lb3V0ID0gdHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICBwcm9wQ291bnQgPSB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSBBTklNQVRJT04pIHtcbiAgICBpZiAoYW5pbWF0aW9uVGltZW91dCA+IDApIHtcbiAgICAgIHR5cGUgPSBBTklNQVRJT047XG4gICAgICB0aW1lb3V0ID0gYW5pbWF0aW9uVGltZW91dDtcbiAgICAgIHByb3BDb3VudCA9IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRpbWVvdXQgPSBNYXRoLm1heCh0cmFuc2l0aW9uVGltZW91dCwgYW5pbWF0aW9uVGltZW91dCk7XG4gICAgdHlwZSA9IHRpbWVvdXQgPiAwID8gdHJhbnNpdGlvblRpbWVvdXQgPiBhbmltYXRpb25UaW1lb3V0ID8gVFJBTlNJVElPTiA6IEFOSU1BVElPTiA6IG51bGw7XG4gICAgcHJvcENvdW50ID0gdHlwZSA/IHR5cGUgPT09IFRSQU5TSVRJT04gPyB0cmFuc2l0aW9uRHVyYXRpb25zLmxlbmd0aCA6IGFuaW1hdGlvbkR1cmF0aW9ucy5sZW5ndGggOiAwO1xuICB9XG4gIGNvbnN0IGhhc1RyYW5zZm9ybSA9IHR5cGUgPT09IFRSQU5TSVRJT04gJiYgL1xcYih0cmFuc2Zvcm18YWxsKSgsfCQpLy50ZXN0KFxuICAgIGdldFN0eWxlUHJvcGVydGllcyhgJHtUUkFOU0lUSU9OfVByb3BlcnR5YCkudG9TdHJpbmcoKVxuICApO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgdGltZW91dCxcbiAgICBwcm9wQ291bnQsXG4gICAgaGFzVHJhbnNmb3JtXG4gIH07XG59XG5mdW5jdGlvbiBnZXRUaW1lb3V0KGRlbGF5cywgZHVyYXRpb25zKSB7XG4gIHdoaWxlIChkZWxheXMubGVuZ3RoIDwgZHVyYXRpb25zLmxlbmd0aCkge1xuICAgIGRlbGF5cyA9IGRlbGF5cy5jb25jYXQoZGVsYXlzKTtcbiAgfVxuICByZXR1cm4gTWF0aC5tYXgoLi4uZHVyYXRpb25zLm1hcCgoZCwgaSkgPT4gdG9NcyhkKSArIHRvTXMoZGVsYXlzW2ldKSkpO1xufVxuZnVuY3Rpb24gdG9NcyhzKSB7XG4gIGlmIChzID09PSBcImF1dG9cIikgcmV0dXJuIDA7XG4gIHJldHVybiBOdW1iZXIocy5zbGljZSgwLCAtMSkucmVwbGFjZShcIixcIiwgXCIuXCIpKSAqIDFlMztcbn1cbmZ1bmN0aW9uIGZvcmNlUmVmbG93KCkge1xuICByZXR1cm4gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIHBhdGNoQ2xhc3MoZWwsIHZhbHVlLCBpc1NWRykge1xuICBjb25zdCB0cmFuc2l0aW9uQ2xhc3NlcyA9IGVsW3Z0Y0tleV07XG4gIGlmICh0cmFuc2l0aW9uQ2xhc3Nlcykge1xuICAgIHZhbHVlID0gKHZhbHVlID8gW3ZhbHVlLCAuLi50cmFuc2l0aW9uQ2xhc3Nlc10gOiBbLi4udHJhbnNpdGlvbkNsYXNzZXNdKS5qb2luKFwiIFwiKTtcbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICB9IGVsc2UgaWYgKGlzU1ZHKSB7XG4gICAgZWwuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGVsLmNsYXNzTmFtZSA9IHZhbHVlO1xuICB9XG59XG5cbmNvbnN0IHZTaG93T3JpZ2luYWxEaXNwbGF5ID0gU3ltYm9sKFwiX3ZvZFwiKTtcbmNvbnN0IHZTaG93SGlkZGVuID0gU3ltYm9sKFwiX3ZzaFwiKTtcbmNvbnN0IHZTaG93ID0ge1xuICBiZWZvcmVNb3VudChlbCwgeyB2YWx1ZSB9LCB7IHRyYW5zaXRpb24gfSkge1xuICAgIGVsW3ZTaG93T3JpZ2luYWxEaXNwbGF5XSA9IGVsLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGVsLnN0eWxlLmRpc3BsYXk7XG4gICAgaWYgKHRyYW5zaXRpb24gJiYgdmFsdWUpIHtcbiAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXREaXNwbGF5KGVsLCB2YWx1ZSk7XG4gICAgfVxuICB9LFxuICBtb3VudGVkKGVsLCB7IHZhbHVlIH0sIHsgdHJhbnNpdGlvbiB9KSB7XG4gICAgaWYgKHRyYW5zaXRpb24gJiYgdmFsdWUpIHtcbiAgICAgIHRyYW5zaXRpb24uZW50ZXIoZWwpO1xuICAgIH1cbiAgfSxcbiAgdXBkYXRlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgeyB0cmFuc2l0aW9uIH0pIHtcbiAgICBpZiAoIXZhbHVlID09PSAhb2xkVmFsdWUpIHJldHVybjtcbiAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRyYW5zaXRpb24uYmVmb3JlRW50ZXIoZWwpO1xuICAgICAgICBzZXREaXNwbGF5KGVsLCB0cnVlKTtcbiAgICAgICAgdHJhbnNpdGlvbi5lbnRlcihlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFuc2l0aW9uLmxlYXZlKGVsLCAoKSA9PiB7XG4gICAgICAgICAgc2V0RGlzcGxheShlbCwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlVW5tb3VudChlbCwgeyB2YWx1ZSB9KSB7XG4gICAgc2V0RGlzcGxheShlbCwgdmFsdWUpO1xuICB9XG59O1xuaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgdlNob3cubmFtZSA9IFwic2hvd1wiO1xufVxuZnVuY3Rpb24gc2V0RGlzcGxheShlbCwgdmFsdWUpIHtcbiAgZWwuc3R5bGUuZGlzcGxheSA9IHZhbHVlID8gZWxbdlNob3dPcmlnaW5hbERpc3BsYXldIDogXCJub25lXCI7XG4gIGVsW3ZTaG93SGlkZGVuXSA9ICF2YWx1ZTtcbn1cbmZ1bmN0aW9uIGluaXRWU2hvd0ZvclNTUigpIHtcbiAgdlNob3cuZ2V0U1NSUHJvcHMgPSAoeyB2YWx1ZSB9KSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgc3R5bGU6IHsgZGlzcGxheTogXCJub25lXCIgfSB9O1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3QgQ1NTX1ZBUl9URVhUID0gU3ltYm9sKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyBcIkNTU19WQVJfVEVYVFwiIDogXCJcIik7XG5mdW5jdGlvbiB1c2VDc3NWYXJzKGdldHRlcikge1xuICBjb25zdCBpbnN0YW5jZSA9IGdldEN1cnJlbnRJbnN0YW5jZSgpO1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGB1c2VDc3NWYXJzIGlzIGNhbGxlZCB3aXRob3V0IGN1cnJlbnQgYWN0aXZlIGNvbXBvbmVudCBpbnN0YW5jZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgdXBkYXRlVGVsZXBvcnRzID0gaW5zdGFuY2UudXQgPSAodmFycyA9IGdldHRlcihpbnN0YW5jZS5wcm94eSkpID0+IHtcbiAgICBBcnJheS5mcm9tKFxuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtdi1vd25lcj1cIiR7aW5zdGFuY2UudWlkfVwiXWApXG4gICAgKS5mb3JFYWNoKChub2RlKSA9PiBzZXRWYXJzT25Ob2RlKG5vZGUsIHZhcnMpKTtcbiAgfTtcbiAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICBpbnN0YW5jZS5nZXRDc3NWYXJzID0gKCkgPT4gZ2V0dGVyKGluc3RhbmNlLnByb3h5KTtcbiAgfVxuICBjb25zdCBzZXRWYXJzID0gKCkgPT4ge1xuICAgIGNvbnN0IHZhcnMgPSBnZXR0ZXIoaW5zdGFuY2UucHJveHkpO1xuICAgIGlmIChpbnN0YW5jZS5jZSkge1xuICAgICAgc2V0VmFyc09uTm9kZShpbnN0YW5jZS5jZSwgdmFycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFZhcnNPblZOb2RlKGluc3RhbmNlLnN1YlRyZWUsIHZhcnMpO1xuICAgIH1cbiAgICB1cGRhdGVUZWxlcG9ydHModmFycyk7XG4gIH07XG4gIG9uQmVmb3JlTW91bnQoKCkgPT4ge1xuICAgIHdhdGNoUG9zdEVmZmVjdChzZXRWYXJzKTtcbiAgfSk7XG4gIG9uTW91bnRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihzZXRWYXJzKTtcbiAgICBvYi5vYnNlcnZlKGluc3RhbmNlLnN1YlRyZWUuZWwucGFyZW50Tm9kZSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgb25Vbm1vdW50ZWQoKCkgPT4gb2IuZGlzY29ubmVjdCgpKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBzZXRWYXJzT25WTm9kZSh2bm9kZSwgdmFycykge1xuICBpZiAodm5vZGUuc2hhcGVGbGFnICYgMTI4KSB7XG4gICAgY29uc3Qgc3VzcGVuc2UgPSB2bm9kZS5zdXNwZW5zZTtcbiAgICB2bm9kZSA9IHN1c3BlbnNlLmFjdGl2ZUJyYW5jaDtcbiAgICBpZiAoc3VzcGVuc2UucGVuZGluZ0JyYW5jaCAmJiAhc3VzcGVuc2UuaXNIeWRyYXRpbmcpIHtcbiAgICAgIHN1c3BlbnNlLmVmZmVjdHMucHVzaCgoKSA9PiB7XG4gICAgICAgIHNldFZhcnNPblZOb2RlKHN1c3BlbnNlLmFjdGl2ZUJyYW5jaCwgdmFycyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKHZub2RlLmNvbXBvbmVudCkge1xuICAgIHZub2RlID0gdm5vZGUuY29tcG9uZW50LnN1YlRyZWU7XG4gIH1cbiAgaWYgKHZub2RlLnNoYXBlRmxhZyAmIDEgJiYgdm5vZGUuZWwpIHtcbiAgICBzZXRWYXJzT25Ob2RlKHZub2RlLmVsLCB2YXJzKTtcbiAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBGcmFnbWVudCkge1xuICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGMpID0+IHNldFZhcnNPblZOb2RlKGMsIHZhcnMpKTtcbiAgfSBlbHNlIGlmICh2bm9kZS50eXBlID09PSBTdGF0aWMpIHtcbiAgICBsZXQgeyBlbCwgYW5jaG9yIH0gPSB2bm9kZTtcbiAgICB3aGlsZSAoZWwpIHtcbiAgICAgIHNldFZhcnNPbk5vZGUoZWwsIHZhcnMpO1xuICAgICAgaWYgKGVsID09PSBhbmNob3IpIGJyZWFrO1xuICAgICAgZWwgPSBlbC5uZXh0U2libGluZztcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFZhcnNPbk5vZGUoZWwsIHZhcnMpIHtcbiAgaWYgKGVsLm5vZGVUeXBlID09PSAxKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBlbC5zdHlsZTtcbiAgICBsZXQgY3NzVGV4dCA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFycykge1xuICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0tJHtrZXl9YCwgdmFyc1trZXldKTtcbiAgICAgIGNzc1RleHQgKz0gYC0tJHtrZXl9OiAke3ZhcnNba2V5XX07YDtcbiAgICB9XG4gICAgc3R5bGVbQ1NTX1ZBUl9URVhUXSA9IGNzc1RleHQ7XG4gIH1cbn1cblxuY29uc3QgZGlzcGxheVJFID0gLyhefDspXFxzKmRpc3BsYXlcXHMqOi87XG5mdW5jdGlvbiBwYXRjaFN0eWxlKGVsLCBwcmV2LCBuZXh0KSB7XG4gIGNvbnN0IHN0eWxlID0gZWwuc3R5bGU7XG4gIGNvbnN0IGlzQ3NzU3RyaW5nID0gaXNTdHJpbmcobmV4dCk7XG4gIGxldCBoYXNDb250cm9sbGVkRGlzcGxheSA9IGZhbHNlO1xuICBpZiAobmV4dCAmJiAhaXNDc3NTdHJpbmcpIHtcbiAgICBpZiAocHJldikge1xuICAgICAgaWYgKCFpc1N0cmluZyhwcmV2KSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcmV2KSB7XG4gICAgICAgICAgaWYgKG5leHRba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwga2V5LCBcIlwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgcHJldlN0eWxlIG9mIHByZXYuc3BsaXQoXCI7XCIpKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gcHJldlN0eWxlLnNsaWNlKDAsIHByZXZTdHlsZS5pbmRleE9mKFwiOlwiKSkudHJpbSgpO1xuICAgICAgICAgIGlmIChuZXh0W2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0U3R5bGUoc3R5bGUsIGtleSwgXCJcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IGluIG5leHQpIHtcbiAgICAgIGlmIChrZXkgPT09IFwiZGlzcGxheVwiKSB7XG4gICAgICAgIGhhc0NvbnRyb2xsZWREaXNwbGF5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHNldFN0eWxlKHN0eWxlLCBrZXksIG5leHRba2V5XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc0Nzc1N0cmluZykge1xuICAgICAgaWYgKHByZXYgIT09IG5leHQpIHtcbiAgICAgICAgY29uc3QgY3NzVmFyVGV4dCA9IHN0eWxlW0NTU19WQVJfVEVYVF07XG4gICAgICAgIGlmIChjc3NWYXJUZXh0KSB7XG4gICAgICAgICAgbmV4dCArPSBcIjtcIiArIGNzc1ZhclRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuY3NzVGV4dCA9IG5leHQ7XG4gICAgICAgIGhhc0NvbnRyb2xsZWREaXNwbGF5ID0gZGlzcGxheVJFLnRlc3QobmV4dCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcmV2KSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZTaG93T3JpZ2luYWxEaXNwbGF5IGluIGVsKSB7XG4gICAgZWxbdlNob3dPcmlnaW5hbERpc3BsYXldID0gaGFzQ29udHJvbGxlZERpc3BsYXkgPyBzdHlsZS5kaXNwbGF5IDogXCJcIjtcbiAgICBpZiAoZWxbdlNob3dIaWRkZW5dKSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgfVxuICB9XG59XG5jb25zdCBzZW1pY29sb25SRSA9IC9bXlxcXFxdO1xccyokLztcbmNvbnN0IGltcG9ydGFudFJFID0gL1xccyohaW1wb3J0YW50JC87XG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwgbmFtZSwgdmFsKSB7XG4gIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICB2YWwuZm9yRWFjaCgodikgPT4gc2V0U3R5bGUoc3R5bGUsIG5hbWUsIHYpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsID09IG51bGwpIHZhbCA9IFwiXCI7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikpIHtcbiAgICAgIGlmIChzZW1pY29sb25SRS50ZXN0KHZhbCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBgVW5leHBlY3RlZCBzZW1pY29sb24gYXQgdGhlIGVuZCBvZiAnJHtuYW1lfScgc3R5bGUgdmFsdWU6ICcke3ZhbH0nYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZWZpeGVkID0gYXV0b1ByZWZpeChzdHlsZSwgbmFtZSk7XG4gICAgICBpZiAoaW1wb3J0YW50UkUudGVzdCh2YWwpKSB7XG4gICAgICAgIHN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgIGh5cGhlbmF0ZShwcmVmaXhlZCksXG4gICAgICAgICAgdmFsLnJlcGxhY2UoaW1wb3J0YW50UkUsIFwiXCIpLFxuICAgICAgICAgIFwiaW1wb3J0YW50XCJcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlW3ByZWZpeGVkXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmNvbnN0IHByZWZpeGVzID0gW1wiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIl07XG5jb25zdCBwcmVmaXhDYWNoZSA9IHt9O1xuZnVuY3Rpb24gYXV0b1ByZWZpeChzdHlsZSwgcmF3TmFtZSkge1xuICBjb25zdCBjYWNoZWQgPSBwcmVmaXhDYWNoZVtyYXdOYW1lXTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgbGV0IG5hbWUgPSBjYW1lbGl6ZShyYXdOYW1lKTtcbiAgaWYgKG5hbWUgIT09IFwiZmlsdGVyXCIgJiYgbmFtZSBpbiBzdHlsZSkge1xuICAgIHJldHVybiBwcmVmaXhDYWNoZVtyYXdOYW1lXSA9IG5hbWU7XG4gIH1cbiAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwcmVmaXhlZCA9IHByZWZpeGVzW2ldICsgbmFtZTtcbiAgICBpZiAocHJlZml4ZWQgaW4gc3R5bGUpIHtcbiAgICAgIHJldHVybiBwcmVmaXhDYWNoZVtyYXdOYW1lXSA9IHByZWZpeGVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmF3TmFtZTtcbn1cblxuY29uc3QgeGxpbmtOUyA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiO1xuZnVuY3Rpb24gcGF0Y2hBdHRyKGVsLCBrZXksIHZhbHVlLCBpc1NWRywgaW5zdGFuY2UsIGlzQm9vbGVhbiA9IGlzU3BlY2lhbEJvb2xlYW5BdHRyKGtleSkpIHtcbiAgaWYgKGlzU1ZHICYmIGtleS5zdGFydHNXaXRoKFwieGxpbms6XCIpKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleS5zbGljZSg2LCBrZXkubGVuZ3RoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZU5TKHhsaW5rTlMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBpc0Jvb2xlYW4gJiYgIWluY2x1ZGVCb29sZWFuQXR0cih2YWx1ZSkpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIGtleSxcbiAgICAgICAgaXNCb29sZWFuID8gXCJcIiA6IGlzU3ltYm9sKHZhbHVlKSA/IFN0cmluZyh2YWx1ZSkgOiB2YWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2hET01Qcm9wKGVsLCBrZXksIHZhbHVlLCBwYXJlbnRDb21wb25lbnQpIHtcbiAgaWYgKGtleSA9PT0gXCJpbm5lckhUTUxcIiB8fCBrZXkgPT09IFwidGV4dENvbnRlbnRcIikge1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBlbFtrZXldID0ga2V5ID09PSBcImlubmVySFRNTFwiID8gdW5zYWZlVG9UcnVzdGVkSFRNTCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWU7XG4gIGlmIChrZXkgPT09IFwidmFsdWVcIiAmJiB0YWcgIT09IFwiUFJPR1JFU1NcIiAmJiAvLyBjdXN0b20gZWxlbWVudHMgbWF5IHVzZSBfdmFsdWUgaW50ZXJuYWxseVxuICAhdGFnLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgIGNvbnN0IG9sZFZhbHVlID0gdGFnID09PSBcIk9QVElPTlwiID8gZWwuZ2V0QXR0cmlidXRlKFwidmFsdWVcIikgfHwgXCJcIiA6IGVsLnZhbHVlO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IChcbiAgICAgIC8vICMxMTY0NzogdmFsdWUgc2hvdWxkIGJlIHNldCBhcyBlbXB0eSBzdHJpbmcgZm9yIG51bGwgYW5kIHVuZGVmaW5lZCxcbiAgICAgIC8vIGJ1dCA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCI+IHNob3VsZCBiZSBzZXQgYXMgJ29uJy5cbiAgICAgIGVsLnR5cGUgPT09IFwiY2hlY2tib3hcIiA/IFwib25cIiA6IFwiXCJcbiAgICApIDogU3RyaW5nKHZhbHVlKTtcbiAgICBpZiAob2xkVmFsdWUgIT09IG5ld1ZhbHVlIHx8ICEoXCJfdmFsdWVcIiBpbiBlbCkpIHtcbiAgICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICB9XG4gICAgZWwuX3ZhbHVlID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBuZWVkUmVtb3ZlID0gZmFsc2U7XG4gIGlmICh2YWx1ZSA9PT0gXCJcIiB8fCB2YWx1ZSA9PSBudWxsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbFtrZXldO1xuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgdmFsdWUgPSBpbmNsdWRlQm9vbGVhbkF0dHIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCAmJiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWx1ZSA9IFwiXCI7XG4gICAgICBuZWVkUmVtb3ZlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICAgIG5lZWRSZW1vdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGVsW2tleV0gPSB2YWx1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmICFuZWVkUmVtb3ZlKSB7XG4gICAgICB3YXJuKFxuICAgICAgICBgRmFpbGVkIHNldHRpbmcgcHJvcCBcIiR7a2V5fVwiIG9uIDwke3RhZy50b0xvd2VyQ2FzZSgpfT46IHZhbHVlICR7dmFsdWV9IGlzIGludmFsaWQuYCxcbiAgICAgICAgZVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmVlZFJlbW92ZSAmJiBlbC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbn1cblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgb3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKGVsLCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcbn1cbmNvbnN0IHZlaUtleSA9IFN5bWJvbChcIl92ZWlcIik7XG5mdW5jdGlvbiBwYXRjaEV2ZW50KGVsLCByYXdOYW1lLCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgaW5zdGFuY2UgPSBudWxsKSB7XG4gIGNvbnN0IGludm9rZXJzID0gZWxbdmVpS2V5XSB8fCAoZWxbdmVpS2V5XSA9IHt9KTtcbiAgY29uc3QgZXhpc3RpbmdJbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV07XG4gIGlmIChuZXh0VmFsdWUgJiYgZXhpc3RpbmdJbnZva2VyKSB7XG4gICAgZXhpc3RpbmdJbnZva2VyLnZhbHVlID0gISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSA/IHNhbml0aXplRXZlbnRWYWx1ZShuZXh0VmFsdWUsIHJhd05hbWUpIDogbmV4dFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtuYW1lLCBvcHRpb25zXSA9IHBhcnNlTmFtZShyYXdOYW1lKTtcbiAgICBpZiAobmV4dFZhbHVlKSB7XG4gICAgICBjb25zdCBpbnZva2VyID0gaW52b2tlcnNbcmF3TmFtZV0gPSBjcmVhdGVJbnZva2VyKFxuICAgICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpID8gc2FuaXRpemVFdmVudFZhbHVlKG5leHRWYWx1ZSwgcmF3TmFtZSkgOiBuZXh0VmFsdWUsXG4gICAgICAgIGluc3RhbmNlXG4gICAgICApO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgbmFtZSwgaW52b2tlciwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0ludm9rZXIpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoZWwsIG5hbWUsIGV4aXN0aW5nSW52b2tlciwgb3B0aW9ucyk7XG4gICAgICBpbnZva2Vyc1tyYXdOYW1lXSA9IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cbmNvbnN0IG9wdGlvbnNNb2RpZmllclJFID0gLyg/Ok9uY2V8UGFzc2l2ZXxDYXB0dXJlKSQvO1xuZnVuY3Rpb24gcGFyc2VOYW1lKG5hbWUpIHtcbiAgbGV0IG9wdGlvbnM7XG4gIGlmIChvcHRpb25zTW9kaWZpZXJSRS50ZXN0KG5hbWUpKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICAgIGxldCBtO1xuICAgIHdoaWxlIChtID0gbmFtZS5tYXRjaChvcHRpb25zTW9kaWZpZXJSRSkpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoIC0gbVswXS5sZW5ndGgpO1xuICAgICAgb3B0aW9uc1ttWzBdLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgY29uc3QgZXZlbnQgPSBuYW1lWzJdID09PSBcIjpcIiA/IG5hbWUuc2xpY2UoMykgOiBoeXBoZW5hdGUobmFtZS5zbGljZSgyKSk7XG4gIHJldHVybiBbZXZlbnQsIG9wdGlvbnNdO1xufVxubGV0IGNhY2hlZE5vdyA9IDA7XG5jb25zdCBwID0gLyogQF9fUFVSRV9fICovIFByb21pc2UucmVzb2x2ZSgpO1xuY29uc3QgZ2V0Tm93ID0gKCkgPT4gY2FjaGVkTm93IHx8IChwLnRoZW4oKCkgPT4gY2FjaGVkTm93ID0gMCksIGNhY2hlZE5vdyA9IERhdGUubm93KCkpO1xuZnVuY3Rpb24gY3JlYXRlSW52b2tlcihpbml0aWFsVmFsdWUsIGluc3RhbmNlKSB7XG4gIGNvbnN0IGludm9rZXIgPSAoZSkgPT4ge1xuICAgIGlmICghZS5fdnRzKSB7XG4gICAgICBlLl92dHMgPSBEYXRlLm5vdygpO1xuICAgIH0gZWxzZSBpZiAoZS5fdnRzIDw9IGludm9rZXIuYXR0YWNoZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2FsbFdpdGhBc3luY0Vycm9ySGFuZGxpbmcoXG4gICAgICBwYXRjaFN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbihlLCBpbnZva2VyLnZhbHVlKSxcbiAgICAgIGluc3RhbmNlLFxuICAgICAgNSxcbiAgICAgIFtlXVxuICAgICk7XG4gIH07XG4gIGludm9rZXIudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gIGludm9rZXIuYXR0YWNoZWQgPSBnZXROb3coKTtcbiAgcmV0dXJuIGludm9rZXI7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZUV2ZW50VmFsdWUodmFsdWUsIHByb3BOYW1lKSB7XG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSB8fCBpc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB3YXJuKFxuICAgIGBXcm9uZyB0eXBlIHBhc3NlZCBhcyBldmVudCBoYW5kbGVyIHRvICR7cHJvcE5hbWV9IC0gZGlkIHlvdSBmb3JnZXQgQCBvciA6IGluIGZyb250IG9mIHlvdXIgcHJvcD9cbkV4cGVjdGVkIGZ1bmN0aW9uIG9yIGFycmF5IG9mIGZ1bmN0aW9ucywgcmVjZWl2ZWQgdHlwZSAke3R5cGVvZiB2YWx1ZX0uYFxuICApO1xuICByZXR1cm4gTk9PUDtcbn1cbmZ1bmN0aW9uIHBhdGNoU3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKGUsIHZhbHVlKSB7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IG9yaWdpbmFsU3RvcCA9IGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4ge1xuICAgICAgb3JpZ2luYWxTdG9wLmNhbGwoZSk7XG4gICAgICBlLl9zdG9wcGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiB2YWx1ZS5tYXAoXG4gICAgICAoZm4pID0+IChlMikgPT4gIWUyLl9zdG9wcGVkICYmIGZuICYmIGZuKGUyKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmNvbnN0IGlzTmF0aXZlT24gPSAoa2V5KSA9PiBrZXkuY2hhckNvZGVBdCgwKSA9PT0gMTExICYmIGtleS5jaGFyQ29kZUF0KDEpID09PSAxMTAgJiYgLy8gbG93ZXJjYXNlIGxldHRlclxua2V5LmNoYXJDb2RlQXQoMikgPiA5NiAmJiBrZXkuY2hhckNvZGVBdCgyKSA8IDEyMztcbmNvbnN0IHBhdGNoUHJvcCA9IChlbCwga2V5LCBwcmV2VmFsdWUsIG5leHRWYWx1ZSwgbmFtZXNwYWNlLCBwYXJlbnRDb21wb25lbnQpID0+IHtcbiAgY29uc3QgaXNTVkcgPSBuYW1lc3BhY2UgPT09IFwic3ZnXCI7XG4gIGlmIChrZXkgPT09IFwiY2xhc3NcIikge1xuICAgIHBhdGNoQ2xhc3MoZWwsIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9IGVsc2UgaWYgKGtleSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgcGF0Y2hTdHlsZShlbCwgcHJldlZhbHVlLCBuZXh0VmFsdWUpO1xuICB9IGVsc2UgaWYgKGlzT24oa2V5KSkge1xuICAgIGlmICghaXNNb2RlbExpc3RlbmVyKGtleSkpIHtcbiAgICAgIHBhdGNoRXZlbnQoZWwsIGtleSwgcHJldlZhbHVlLCBuZXh0VmFsdWUsIHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGtleVswXSA9PT0gXCIuXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCB0cnVlKSA6IGtleVswXSA9PT0gXCJeXCIgPyAoa2V5ID0ga2V5LnNsaWNlKDEpLCBmYWxzZSkgOiBzaG91bGRTZXRBc1Byb3AoZWwsIGtleSwgbmV4dFZhbHVlLCBpc1NWRykpIHtcbiAgICBwYXRjaERPTVByb3AoZWwsIGtleSwgbmV4dFZhbHVlKTtcbiAgICBpZiAoIWVsLnRhZ05hbWUuaW5jbHVkZXMoXCItXCIpICYmIChrZXkgPT09IFwidmFsdWVcIiB8fCBrZXkgPT09IFwiY2hlY2tlZFwiIHx8IGtleSA9PT0gXCJzZWxlY3RlZFwiKSkge1xuICAgICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcsIHBhcmVudENvbXBvbmVudCwga2V5ICE9PSBcInZhbHVlXCIpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoa2V5ID09PSBcInRydWUtdmFsdWVcIikge1xuICAgICAgZWwuX3RydWVWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJmYWxzZS12YWx1ZVwiKSB7XG4gICAgICBlbC5fZmFsc2VWYWx1ZSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gICAgcGF0Y2hBdHRyKGVsLCBrZXksIG5leHRWYWx1ZSwgaXNTVkcpO1xuICB9XG59O1xuZnVuY3Rpb24gc2hvdWxkU2V0QXNQcm9wKGVsLCBrZXksIHZhbHVlLCBpc1NWRykge1xuICBpZiAoaXNTVkcpIHtcbiAgICBpZiAoa2V5ID09PSBcImlubmVySFRNTFwiIHx8IGtleSA9PT0gXCJ0ZXh0Q29udGVudFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGtleSBpbiBlbCAmJiBpc05hdGl2ZU9uKGtleSkgJiYgaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJzcGVsbGNoZWNrXCIgfHwga2V5ID09PSBcImRyYWdnYWJsZVwiIHx8IGtleSA9PT0gXCJ0cmFuc2xhdGVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImZvcm1cIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSBcImxpc3RcIiAmJiBlbC50YWdOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGtleSA9PT0gXCJ0eXBlXCIgJiYgZWwudGFnTmFtZSA9PT0gXCJURVhUQVJFQVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09IFwid2lkdGhcIiB8fCBrZXkgPT09IFwiaGVpZ2h0XCIpIHtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lO1xuICAgIGlmICh0YWcgPT09IFwiSU1HXCIgfHwgdGFnID09PSBcIlZJREVPXCIgfHwgdGFnID09PSBcIkNBTlZBU1wiIHx8IHRhZyA9PT0gXCJTT1VSQ0VcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOYXRpdmVPbihrZXkpICYmIGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5IGluIGVsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGVsLl9pc1Z1ZUNFICYmICgvW0EtWl0vLnRlc3Qoa2V5KSB8fCAhaXNTdHJpbmcodmFsdWUpKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuY29uc3QgUkVNT1ZBTCA9IHt9O1xuLyohICNfX05PX1NJREVfRUZGRUNUU19fICovXG4vLyBAX19OT19TSURFX0VGRkVDVFNfX1xuZnVuY3Rpb24gZGVmaW5lQ3VzdG9tRWxlbWVudChvcHRpb25zLCBleHRyYU9wdGlvbnMsIF9jcmVhdGVBcHApIHtcbiAgY29uc3QgQ29tcCA9IGRlZmluZUNvbXBvbmVudChvcHRpb25zLCBleHRyYU9wdGlvbnMpO1xuICBpZiAoaXNQbGFpbk9iamVjdChDb21wKSkgZXh0ZW5kKENvbXAsIGV4dHJhT3B0aW9ucyk7XG4gIGNsYXNzIFZ1ZUN1c3RvbUVsZW1lbnQgZXh0ZW5kcyBWdWVFbGVtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihpbml0aWFsUHJvcHMpIHtcbiAgICAgIHN1cGVyKENvbXAsIGluaXRpYWxQcm9wcywgX2NyZWF0ZUFwcCk7XG4gICAgfVxuICB9XG4gIFZ1ZUN1c3RvbUVsZW1lbnQuZGVmID0gQ29tcDtcbiAgcmV0dXJuIFZ1ZUN1c3RvbUVsZW1lbnQ7XG59XG4vKiEgI19fTk9fU0lERV9FRkZFQ1RTX18gKi9cbmNvbnN0IGRlZmluZVNTUkN1c3RvbUVsZW1lbnQgPSAvKiBAX19OT19TSURFX0VGRkVDVFNfXyAqLyAob3B0aW9ucywgZXh0cmFPcHRpb25zKSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gZGVmaW5lQ3VzdG9tRWxlbWVudChvcHRpb25zLCBleHRyYU9wdGlvbnMsIGNyZWF0ZVNTUkFwcCk7XG59O1xuY29uc3QgQmFzZUNsYXNzID0gdHlwZW9mIEhUTUxFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gSFRNTEVsZW1lbnQgOiBjbGFzcyB7XG59O1xuY2xhc3MgVnVlRWxlbWVudCBleHRlbmRzIEJhc2VDbGFzcyB7XG4gIGNvbnN0cnVjdG9yKF9kZWYsIF9wcm9wcyA9IHt9LCBfY3JlYXRlQXBwID0gY3JlYXRlQXBwKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9kZWYgPSBfZGVmO1xuICAgIHRoaXMuX3Byb3BzID0gX3Byb3BzO1xuICAgIHRoaXMuX2NyZWF0ZUFwcCA9IF9jcmVhdGVBcHA7XG4gICAgdGhpcy5faXNWdWVDRSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX2FwcCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fbm9uY2UgPSB0aGlzLl9kZWYubm9uY2U7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcmVzb2x2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9udW1iZXJQcm9wcyA9IG51bGw7XG4gICAgdGhpcy5fc3R5bGVDaGlsZHJlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290ICYmIF9jcmVhdGVBcHAgIT09IGNyZWF0ZUFwcCkge1xuICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuc2hhZG93Um9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYEN1c3RvbSBlbGVtZW50IGhhcyBwcmUtcmVuZGVyZWQgZGVjbGFyYXRpdmUgc2hhZG93IHJvb3QgYnV0IGlzIG5vdCBkZWZpbmVkIGFzIGh5ZHJhdGFibGUuIFVzZSBcXGBkZWZpbmVTU1JDdXN0b21FbGVtZW50XFxgLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChfZGVmLnNoYWRvd1Jvb3QgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHsgbW9kZTogXCJvcGVuXCIgfSk7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSB0aGlzLnNoYWRvd1Jvb3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yb290ID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLl9kZWYuX19hc3luY0xvYWRlcikge1xuICAgICAgdGhpcy5fcmVzb2x2ZVByb3BzKHRoaXMuX2RlZik7XG4gICAgfVxuICB9XG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICB0aGlzLl9wYXJzZVNsb3RzKCk7XG4gICAgfVxuICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgbGV0IHBhcmVudCA9IHRoaXM7XG4gICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudCAmJiAocGFyZW50LnBhcmVudE5vZGUgfHwgcGFyZW50Lmhvc3QpKSB7XG4gICAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgVnVlRWxlbWVudCkge1xuICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgICAgdGhpcy5fc2V0UGFyZW50KCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmdSZXNvbHZlKSB7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmUgPSBwYXJlbnQuX3BlbmRpbmdSZXNvbHZlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1Jlc29sdmUgPSB2b2lkIDA7XG4gICAgICAgICAgICB0aGlzLl9yZXNvbHZlRGVmKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcmVzb2x2ZURlZigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIF9zZXRQYXJlbnQocGFyZW50ID0gdGhpcy5fcGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgdGhpcy5faW5zdGFuY2UucGFyZW50ID0gcGFyZW50Ll9pbnN0YW5jZTtcbiAgICAgIHRoaXMuX2luc3RhbmNlLnByb3ZpZGVzID0gcGFyZW50Ll9pbnN0YW5jZS5wcm92aWRlcztcbiAgICB9XG4gIH1cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25uZWN0ZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuX29iKSB7XG4gICAgICAgICAgdGhpcy5fb2IuZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHRoaXMuX29iID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcHAgJiYgdGhpcy5fYXBwLnVubW91bnQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2luc3RhbmNlKSB0aGlzLl9pbnN0YW5jZS5jZSA9IHZvaWQgMDtcbiAgICAgICAgdGhpcy5fYXBwID0gdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiByZXNvbHZlIGlubmVyIGNvbXBvbmVudCBkZWZpbml0aW9uIChoYW5kbGUgcG9zc2libGUgYXN5bmMgY29tcG9uZW50KVxuICAgKi9cbiAgX3Jlc29sdmVEZWYoKSB7XG4gICAgaWYgKHRoaXMuX3BlbmRpbmdSZXNvbHZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9zZXRBdHRyKHRoaXMuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgdGhpcy5fb2IgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG0gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX3NldEF0dHIobS5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vYi5vYnNlcnZlKHRoaXMsIHsgYXR0cmlidXRlczogdHJ1ZSB9KTtcbiAgICBjb25zdCByZXNvbHZlID0gKGRlZiwgaXNBc3luYyA9IGZhbHNlKSA9PiB7XG4gICAgICB0aGlzLl9yZXNvbHZlZCA9IHRydWU7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVzb2x2ZSA9IHZvaWQgMDtcbiAgICAgIGNvbnN0IHsgcHJvcHMsIHN0eWxlcyB9ID0gZGVmO1xuICAgICAgbGV0IG51bWJlclByb3BzO1xuICAgICAgaWYgKHByb3BzICYmICFpc0FycmF5KHByb3BzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICAgIGNvbnN0IG9wdCA9IHByb3BzW2tleV07XG4gICAgICAgICAgaWYgKG9wdCA9PT0gTnVtYmVyIHx8IG9wdCAmJiBvcHQudHlwZSA9PT0gTnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAoa2V5IGluIHRoaXMuX3Byb3BzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB0b051bWJlcih0aGlzLl9wcm9wc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChudW1iZXJQcm9wcyB8fCAobnVtYmVyUHJvcHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSkpW2NhbWVsaXplJDEoa2V5KV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fbnVtYmVyUHJvcHMgPSBudW1iZXJQcm9wcztcbiAgICAgIGlmIChpc0FzeW5jKSB7XG4gICAgICAgIHRoaXMuX3Jlc29sdmVQcm9wcyhkZWYpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2hhZG93Um9vdCkge1xuICAgICAgICB0aGlzLl9hcHBseVN0eWxlcyhzdHlsZXMpO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHN0eWxlcykge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwiQ3VzdG9tIGVsZW1lbnQgc3R5bGUgaW5qZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiB1c2luZyBzaGFkb3dSb290OiBmYWxzZVwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9tb3VudChkZWYpO1xuICAgIH07XG4gICAgY29uc3QgYXN5bmNEZWYgPSB0aGlzLl9kZWYuX19hc3luY0xvYWRlcjtcbiAgICBpZiAoYXN5bmNEZWYpIHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZXNvbHZlID0gYXN5bmNEZWYoKS50aGVuKFxuICAgICAgICAoZGVmKSA9PiByZXNvbHZlKHRoaXMuX2RlZiA9IGRlZiwgdHJ1ZSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmUodGhpcy5fZGVmKTtcbiAgICB9XG4gIH1cbiAgX21vdW50KGRlZikge1xuICAgIGlmICgoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB8fCBfX1ZVRV9QUk9EX0RFVlRPT0xTX18pICYmICFkZWYubmFtZSkge1xuICAgICAgZGVmLm5hbWUgPSBcIlZ1ZUVsZW1lbnRcIjtcbiAgICB9XG4gICAgdGhpcy5fYXBwID0gdGhpcy5fY3JlYXRlQXBwKGRlZik7XG4gICAgaWYgKGRlZi5jb25maWd1cmVBcHApIHtcbiAgICAgIGRlZi5jb25maWd1cmVBcHAodGhpcy5fYXBwKTtcbiAgICB9XG4gICAgdGhpcy5fYXBwLl9jZVZOb2RlID0gdGhpcy5fY3JlYXRlVk5vZGUoKTtcbiAgICB0aGlzLl9hcHAubW91bnQodGhpcy5fcm9vdCk7XG4gICAgY29uc3QgZXhwb3NlZCA9IHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2luc3RhbmNlLmV4cG9zZWQ7XG4gICAgaWYgKCFleHBvc2VkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZXhwb3NlZCkge1xuICAgICAgaWYgKCFoYXNPd24odGhpcywga2V5KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCB7XG4gICAgICAgICAgLy8gdW53cmFwIHJlZiB0byBiZSBjb25zaXN0ZW50IHdpdGggcHVibGljIGluc3RhbmNlIGJlaGF2aW9yXG4gICAgICAgICAgZ2V0OiAoKSA9PiB1bnJlZihleHBvc2VkW2tleV0pXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICAgIHdhcm4oYEV4cG9zZWQgcHJvcGVydHkgXCIke2tleX1cIiBhbHJlYWR5IGV4aXN0cyBvbiBjdXN0b20gZWxlbWVudC5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3Jlc29sdmVQcm9wcyhkZWYpIHtcbiAgICBjb25zdCB7IHByb3BzIH0gPSBkZWY7XG4gICAgY29uc3QgZGVjbGFyZWRQcm9wS2V5cyA9IGlzQXJyYXkocHJvcHMpID8gcHJvcHMgOiBPYmplY3Qua2V5cyhwcm9wcyB8fCB7fSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcykpIHtcbiAgICAgIGlmIChrZXlbMF0gIT09IFwiX1wiICYmIGRlY2xhcmVkUHJvcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdGhpc1trZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZGVjbGFyZWRQcm9wS2V5cy5tYXAoY2FtZWxpemUkMSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrZXksIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcm9wKGtleSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWwpIHtcbiAgICAgICAgICB0aGlzLl9zZXRQcm9wKGtleSwgdmFsLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIF9zZXRBdHRyKGtleSkge1xuICAgIGlmIChrZXkuc3RhcnRzV2l0aChcImRhdGEtdi1cIikpIHJldHVybjtcbiAgICBjb25zdCBoYXMgPSB0aGlzLmhhc0F0dHJpYnV0ZShrZXkpO1xuICAgIGxldCB2YWx1ZSA9IGhhcyA/IHRoaXMuZ2V0QXR0cmlidXRlKGtleSkgOiBSRU1PVkFMO1xuICAgIGNvbnN0IGNhbWVsS2V5ID0gY2FtZWxpemUkMShrZXkpO1xuICAgIGlmIChoYXMgJiYgdGhpcy5fbnVtYmVyUHJvcHMgJiYgdGhpcy5fbnVtYmVyUHJvcHNbY2FtZWxLZXldKSB7XG4gICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fc2V0UHJvcChjYW1lbEtleSwgdmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZ2V0UHJvcChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJvcHNba2V5XTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfc2V0UHJvcChrZXksIHZhbCwgc2hvdWxkUmVmbGVjdCA9IHRydWUsIHNob3VsZFVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHZhbCAhPT0gdGhpcy5fcHJvcHNba2V5XSkge1xuICAgICAgaWYgKHZhbCA9PT0gUkVNT1ZBTCkge1xuICAgICAgICBkZWxldGUgdGhpcy5fcHJvcHNba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3Byb3BzW2tleV0gPSB2YWw7XG4gICAgICAgIGlmIChrZXkgPT09IFwia2V5XCIgJiYgdGhpcy5fYXBwKSB7XG4gICAgICAgICAgdGhpcy5fYXBwLl9jZVZOb2RlLmtleSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNob3VsZFVwZGF0ZSAmJiB0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgICB0aGlzLl91cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG91bGRSZWZsZWN0KSB7XG4gICAgICAgIGlmICh2YWwgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSwgXCJcIik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoaHlwaGVuYXRlKGtleSksIHZhbCArIFwiXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCF2YWwpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShoeXBoZW5hdGUoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX3VwZGF0ZSgpIHtcbiAgICByZW5kZXIodGhpcy5fY3JlYXRlVk5vZGUoKSwgdGhpcy5fcm9vdCk7XG4gIH1cbiAgX2NyZWF0ZVZOb2RlKCkge1xuICAgIGNvbnN0IGJhc2VQcm9wcyA9IHt9O1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290KSB7XG4gICAgICBiYXNlUHJvcHMub25Wbm9kZU1vdW50ZWQgPSBiYXNlUHJvcHMub25Wbm9kZVVwZGF0ZWQgPSB0aGlzLl9yZW5kZXJTbG90cy5iaW5kKHRoaXMpO1xuICAgIH1cbiAgICBjb25zdCB2bm9kZSA9IGNyZWF0ZVZOb2RlKHRoaXMuX2RlZiwgZXh0ZW5kKGJhc2VQcm9wcywgdGhpcy5fcHJvcHMpKTtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB2bm9kZS5jZSA9IChpbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICBpbnN0YW5jZS5jZSA9IHRoaXM7XG4gICAgICAgIGluc3RhbmNlLmlzQ0UgPSB0cnVlO1xuICAgICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICAgIGluc3RhbmNlLmNlUmVsb2FkID0gKG5ld1N0eWxlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0eWxlcykge1xuICAgICAgICAgICAgICB0aGlzLl9zdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5fcm9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N0eWxlcy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHlsZXMobmV3U3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzcGF0Y2ggPSAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICBpc1BsYWluT2JqZWN0KGFyZ3NbMF0pID8gZXh0ZW5kKHsgZGV0YWlsOiBhcmdzIH0sIGFyZ3NbMF0pIDogeyBkZXRhaWw6IGFyZ3MgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIGluc3RhbmNlLmVtaXQgPSAoZXZlbnQsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICBkaXNwYXRjaChldmVudCwgYXJncyk7XG4gICAgICAgICAgaWYgKGh5cGhlbmF0ZShldmVudCkgIT09IGV2ZW50KSB7XG4gICAgICAgICAgICBkaXNwYXRjaChoeXBoZW5hdGUoZXZlbnQpLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3NldFBhcmVudCgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlO1xuICB9XG4gIF9hcHBseVN0eWxlcyhzdHlsZXMsIG93bmVyKSB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybjtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIGlmIChvd25lciA9PT0gdGhpcy5fZGVmIHx8IHRoaXMuX3N0eWxlQ2hpbGRyZW4uaGFzKG93bmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9zdHlsZUNoaWxkcmVuLmFkZChvd25lcik7XG4gICAgfVxuICAgIGNvbnN0IG5vbmNlID0gdGhpcy5fbm9uY2U7XG4gICAgZm9yIChsZXQgaSA9IHN0eWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgICAgIGlmIChub25jZSkgcy5zZXRBdHRyaWJ1dGUoXCJub25jZVwiLCBub25jZSk7XG4gICAgICBzLnRleHRDb250ZW50ID0gc3R5bGVzW2ldO1xuICAgICAgdGhpcy5zaGFkb3dSb290LnByZXBlbmQocyk7XG4gICAgICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgICBpZiAob3duZXIpIHtcbiAgICAgICAgICBpZiAob3duZXIuX19obXJJZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFN0eWxlcykgdGhpcy5fY2hpbGRTdHlsZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gdGhpcy5fY2hpbGRTdHlsZXMuZ2V0KG93bmVyLl9faG1ySWQpO1xuICAgICAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgICB0aGlzLl9jaGlsZFN0eWxlcy5zZXQob3duZXIuX19obXJJZCwgZW50cnkgPSBbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbnRyeS5wdXNoKHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAodGhpcy5fc3R5bGVzIHx8ICh0aGlzLl9zdHlsZXMgPSBbXSkpLnB1c2gocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIE9ubHkgY2FsbGVkIHdoZW4gc2hhZG93Um9vdCBpcyBmYWxzZVxuICAgKi9cbiAgX3BhcnNlU2xvdHMoKSB7XG4gICAgY29uc3Qgc2xvdHMgPSB0aGlzLl9zbG90cyA9IHt9O1xuICAgIGxldCBuO1xuICAgIHdoaWxlIChuID0gdGhpcy5maXJzdENoaWxkKSB7XG4gICAgICBjb25zdCBzbG90TmFtZSA9IG4ubm9kZVR5cGUgPT09IDEgJiYgbi5nZXRBdHRyaWJ1dGUoXCJzbG90XCIpIHx8IFwiZGVmYXVsdFwiO1xuICAgICAgKHNsb3RzW3Nsb3ROYW1lXSB8fCAoc2xvdHNbc2xvdE5hbWVdID0gW10pKS5wdXNoKG4pO1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChuKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIE9ubHkgY2FsbGVkIHdoZW4gc2hhZG93Um9vdCBpcyBmYWxzZVxuICAgKi9cbiAgX3JlbmRlclNsb3RzKCkge1xuICAgIGNvbnN0IG91dGxldHMgPSAodGhpcy5fdGVsZXBvcnRUYXJnZXQgfHwgdGhpcykucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG4gICAgY29uc3Qgc2NvcGVJZCA9IHRoaXMuX2luc3RhbmNlLnR5cGUuX19zY29wZUlkO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0bGV0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbyA9IG91dGxldHNbaV07XG4gICAgICBjb25zdCBzbG90TmFtZSA9IG8uZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcImRlZmF1bHRcIjtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9zbG90c1tzbG90TmFtZV07XG4gICAgICBjb25zdCBwYXJlbnQgPSBvLnBhcmVudE5vZGU7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICBmb3IgKGNvbnN0IG4gb2YgY29udGVudCkge1xuICAgICAgICAgIGlmIChzY29wZUlkICYmIG4ubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2NvcGVJZCArIFwiLXNcIjtcbiAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IGRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIobiwgMSk7XG4gICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShpZCwgXCJcIik7XG4gICAgICAgICAgICBsZXQgY2hpbGQ7XG4gICAgICAgICAgICB3aGlsZSAoY2hpbGQgPSB3YWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoaWQsIFwiXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG4sIG8pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAoby5maXJzdENoaWxkKSBwYXJlbnQuaW5zZXJ0QmVmb3JlKG8uZmlyc3RDaGlsZCwgbyk7XG4gICAgICB9XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pbmplY3RDaGlsZFN0eWxlKGNvbXApIHtcbiAgICB0aGlzLl9hcHBseVN0eWxlcyhjb21wLnN0eWxlcywgY29tcCk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3JlbW92ZUNoaWxkU3R5bGUoY29tcCkge1xuICAgIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgICB0aGlzLl9zdHlsZUNoaWxkcmVuLmRlbGV0ZShjb21wKTtcbiAgICAgIGlmICh0aGlzLl9jaGlsZFN0eWxlcyAmJiBjb21wLl9faG1ySWQpIHtcbiAgICAgICAgY29uc3Qgb2xkU3R5bGVzID0gdGhpcy5fY2hpbGRTdHlsZXMuZ2V0KGNvbXAuX19obXJJZCk7XG4gICAgICAgIGlmIChvbGRTdHlsZXMpIHtcbiAgICAgICAgICBvbGRTdHlsZXMuZm9yRWFjaCgocykgPT4gdGhpcy5fcm9vdC5yZW1vdmVDaGlsZChzKSk7XG4gICAgICAgICAgb2xkU3R5bGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHVzZUhvc3QoY2FsbGVyKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gZ2V0Q3VycmVudEluc3RhbmNlKCk7XG4gIGNvbnN0IGVsID0gaW5zdGFuY2UgJiYgaW5zdGFuY2UuY2U7XG4gIGlmIChlbCkge1xuICAgIHJldHVybiBlbDtcbiAgfSBlbHNlIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgd2FybihcbiAgICAgICAgYCR7Y2FsbGVyIHx8IFwidXNlSG9zdFwifSBjYWxsZWQgd2l0aG91dCBhbiBhY3RpdmUgY29tcG9uZW50IGluc3RhbmNlLmBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGAke2NhbGxlciB8fCBcInVzZUhvc3RcIn0gY2FuIG9ubHkgYmUgdXNlZCBpbiBjb21wb25lbnRzIGRlZmluZWQgdmlhIGRlZmluZUN1c3RvbUVsZW1lbnQuYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB1c2VTaGFkb3dSb290KCkge1xuICBjb25zdCBlbCA9ICEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgPyB1c2VIb3N0KFwidXNlU2hhZG93Um9vdFwiKSA6IHVzZUhvc3QoKTtcbiAgcmV0dXJuIGVsICYmIGVsLnNoYWRvd1Jvb3Q7XG59XG5cbmZ1bmN0aW9uIHVzZUNzc01vZHVsZShuYW1lID0gXCIkc3R5bGVcIikge1xuICB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYHVzZUNzc01vZHVsZSBtdXN0IGJlIGNhbGxlZCBpbnNpZGUgc2V0dXAoKWApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgY29uc3QgbW9kdWxlcyA9IGluc3RhbmNlLnR5cGUuX19jc3NNb2R1bGVzO1xuICAgIGlmICghbW9kdWxlcykge1xuICAgICAgISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3YXJuKGBDdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGhhdmUgQ1NTIG1vZHVsZXMgaW5qZWN0ZWQuYCk7XG4gICAgICByZXR1cm4gRU1QVFlfT0JKO1xuICAgIH1cbiAgICBjb25zdCBtb2QgPSBtb2R1bGVzW25hbWVdO1xuICAgIGlmICghbW9kKSB7XG4gICAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oYEN1cnJlbnQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBDU1MgbW9kdWxlIG5hbWVkIFwiJHtuYW1lfVwiLmApO1xuICAgICAgcmV0dXJuIEVNUFRZX09CSjtcbiAgICB9XG4gICAgcmV0dXJuIG1vZDtcbiAgfVxufVxuXG5jb25zdCBwb3NpdGlvbk1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgbmV3UG9zaXRpb25NYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IG1vdmVDYktleSA9IFN5bWJvbChcIl9tb3ZlQ2JcIik7XG5jb25zdCBlbnRlckNiS2V5ID0gU3ltYm9sKFwiX2VudGVyQ2JcIik7XG5jb25zdCBkZWNvcmF0ZSA9ICh0KSA9PiB7XG4gIGRlbGV0ZSB0LnByb3BzLm1vZGU7XG4gIHJldHVybiB0O1xufTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cEltcGwgPSAvKiBAX19QVVJFX18gKi8gZGVjb3JhdGUoe1xuICBuYW1lOiBcIlRyYW5zaXRpb25Hcm91cFwiLFxuICBwcm9wczogLyogQF9fUFVSRV9fICovIGV4dGVuZCh7fSwgVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycywge1xuICAgIHRhZzogU3RyaW5nLFxuICAgIG1vdmVDbGFzczogU3RyaW5nXG4gIH0pLFxuICBzZXR1cChwcm9wcywgeyBzbG90cyB9KSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcbiAgICBjb25zdCBzdGF0ZSA9IHVzZVRyYW5zaXRpb25TdGF0ZSgpO1xuICAgIGxldCBwcmV2Q2hpbGRyZW47XG4gICAgbGV0IGNoaWxkcmVuO1xuICAgIG9uVXBkYXRlZCgoKSA9PiB7XG4gICAgICBpZiAoIXByZXZDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW92ZUNsYXNzID0gcHJvcHMubW92ZUNsYXNzIHx8IGAke3Byb3BzLm5hbWUgfHwgXCJ2XCJ9LW1vdmVgO1xuICAgICAgaWYgKCFoYXNDU1NUcmFuc2Zvcm0oXG4gICAgICAgIHByZXZDaGlsZHJlblswXS5lbCxcbiAgICAgICAgaW5zdGFuY2Uudm5vZGUuZWwsXG4gICAgICAgIG1vdmVDbGFzc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChjYWxsUGVuZGluZ0Nicyk7XG4gICAgICBwcmV2Q2hpbGRyZW4uZm9yRWFjaChyZWNvcmRQb3NpdGlvbik7XG4gICAgICBjb25zdCBtb3ZlZENoaWxkcmVuID0gcHJldkNoaWxkcmVuLmZpbHRlcihhcHBseVRyYW5zbGF0aW9uKTtcbiAgICAgIGZvcmNlUmVmbG93KCk7XG4gICAgICBtb3ZlZENoaWxkcmVuLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZWwgPSBjLmVsO1xuICAgICAgICBjb25zdCBzdHlsZSA9IGVsLnN0eWxlO1xuICAgICAgICBhZGRUcmFuc2l0aW9uQ2xhc3MoZWwsIG1vdmVDbGFzcyk7XG4gICAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IHN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IFwiXCI7XG4gICAgICAgIGNvbnN0IGNiID0gZWxbbW92ZUNiS2V5XSA9IChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZSB8fCAvdHJhbnNmb3JtJC8udGVzdChlLnByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsIGNiKTtcbiAgICAgICAgICAgIGVsW21vdmVDYktleV0gPSBudWxsO1xuICAgICAgICAgICAgcmVtb3ZlVHJhbnNpdGlvbkNsYXNzKGVsLCBtb3ZlQ2xhc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcihcInRyYW5zaXRpb25lbmRcIiwgY2IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IHJhd1Byb3BzID0gdG9SYXcocHJvcHMpO1xuICAgICAgY29uc3QgY3NzVHJhbnNpdGlvblByb3BzID0gcmVzb2x2ZVRyYW5zaXRpb25Qcm9wcyhyYXdQcm9wcyk7XG4gICAgICBsZXQgdGFnID0gcmF3UHJvcHMudGFnIHx8IEZyYWdtZW50O1xuICAgICAgcHJldkNoaWxkcmVuID0gW107XG4gICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgICAgaWYgKGNoaWxkLmVsICYmIGNoaWxkLmVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgcHJldkNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgcmVzb2x2ZVRyYW5zaXRpb25Ib29rcyhcbiAgICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgICBjc3NUcmFuc2l0aW9uUHJvcHMsXG4gICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvc2l0aW9uTWFwLnNldChcbiAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgIGNoaWxkLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hpbGRyZW4gPSBzbG90cy5kZWZhdWx0ID8gZ2V0VHJhbnNpdGlvblJhd0NoaWxkcmVuKHNsb3RzLmRlZmF1bHQoKSkgOiBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgaWYgKGNoaWxkLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkhvb2tzKFxuICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICByZXNvbHZlVHJhbnNpdGlvbkhvb2tzKGNoaWxkLCBjc3NUcmFuc2l0aW9uUHJvcHMsIHN0YXRlLCBpbnN0YW5jZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgY2hpbGQudHlwZSAhPT0gVGV4dCkge1xuICAgICAgICAgIHdhcm4oYDxUcmFuc2l0aW9uR3JvdXA+IGNoaWxkcmVuIG11c3QgYmUga2V5ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVWTm9kZSh0YWcsIG51bGwsIGNoaWxkcmVuKTtcbiAgICB9O1xuICB9XG59KTtcbmNvbnN0IFRyYW5zaXRpb25Hcm91cCA9IFRyYW5zaXRpb25Hcm91cEltcGw7XG5mdW5jdGlvbiBjYWxsUGVuZGluZ0NicyhjKSB7XG4gIGNvbnN0IGVsID0gYy5lbDtcbiAgaWYgKGVsW21vdmVDYktleV0pIHtcbiAgICBlbFttb3ZlQ2JLZXldKCk7XG4gIH1cbiAgaWYgKGVsW2VudGVyQ2JLZXldKSB7XG4gICAgZWxbZW50ZXJDYktleV0oKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVjb3JkUG9zaXRpb24oYykge1xuICBuZXdQb3NpdGlvbk1hcC5zZXQoYywgYy5lbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG59XG5mdW5jdGlvbiBhcHBseVRyYW5zbGF0aW9uKGMpIHtcbiAgY29uc3Qgb2xkUG9zID0gcG9zaXRpb25NYXAuZ2V0KGMpO1xuICBjb25zdCBuZXdQb3MgPSBuZXdQb3NpdGlvbk1hcC5nZXQoYyk7XG4gIGNvbnN0IGR4ID0gb2xkUG9zLmxlZnQgLSBuZXdQb3MubGVmdDtcbiAgY29uc3QgZHkgPSBvbGRQb3MudG9wIC0gbmV3UG9zLnRvcDtcbiAgaWYgKGR4IHx8IGR5KSB7XG4gICAgY29uc3QgcyA9IGMuZWwuc3R5bGU7XG4gICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWA7XG4gICAgcy50cmFuc2l0aW9uRHVyYXRpb24gPSBcIjBzXCI7XG4gICAgcmV0dXJuIGM7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhc0NTU1RyYW5zZm9ybShlbCwgcm9vdCwgbW92ZUNsYXNzKSB7XG4gIGNvbnN0IGNsb25lID0gZWwuY2xvbmVOb2RlKCk7XG4gIGNvbnN0IF92dGMgPSBlbFt2dGNLZXldO1xuICBpZiAoX3Z0Yykge1xuICAgIF92dGMuZm9yRWFjaCgoY2xzKSA9PiB7XG4gICAgICBjbHMuc3BsaXQoL1xccysvKS5mb3JFYWNoKChjKSA9PiBjICYmIGNsb25lLmNsYXNzTGlzdC5yZW1vdmUoYykpO1xuICAgIH0pO1xuICB9XG4gIG1vdmVDbGFzcy5zcGxpdCgvXFxzKy8pLmZvckVhY2goKGMpID0+IGMgJiYgY2xvbmUuY2xhc3NMaXN0LmFkZChjKSk7XG4gIGNsb25lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgY29uc3QgY29udGFpbmVyID0gcm9vdC5ub2RlVHlwZSA9PT0gMSA/IHJvb3QgOiByb290LnBhcmVudE5vZGU7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZSk7XG4gIGNvbnN0IHsgaGFzVHJhbnNmb3JtIH0gPSBnZXRUcmFuc2l0aW9uSW5mbyhjbG9uZSk7XG4gIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjbG9uZSk7XG4gIHJldHVybiBoYXNUcmFuc2Zvcm07XG59XG5cbmNvbnN0IGdldE1vZGVsQXNzaWduZXIgPSAodm5vZGUpID0+IHtcbiAgY29uc3QgZm4gPSB2bm9kZS5wcm9wc1tcIm9uVXBkYXRlOm1vZGVsVmFsdWVcIl0gfHwgZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KGZuKSA/ICh2YWx1ZSkgPT4gaW52b2tlQXJyYXlGbnMoZm4sIHZhbHVlKSA6IGZuO1xufTtcbmZ1bmN0aW9uIG9uQ29tcG9zaXRpb25TdGFydChlKSB7XG4gIGUudGFyZ2V0LmNvbXBvc2luZyA9IHRydWU7XG59XG5mdW5jdGlvbiBvbkNvbXBvc2l0aW9uRW5kKGUpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gIGlmICh0YXJnZXQuY29tcG9zaW5nKSB7XG4gICAgdGFyZ2V0LmNvbXBvc2luZyA9IGZhbHNlO1xuICAgIHRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgfVxufVxuY29uc3QgYXNzaWduS2V5ID0gU3ltYm9sKFwiX2Fzc2lnblwiKTtcbmNvbnN0IHZNb2RlbFRleHQgPSB7XG4gIGNyZWF0ZWQoZWwsIHsgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGNvbnN0IGNhc3RUb051bWJlciA9IG51bWJlciB8fCB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlID09PSBcIm51bWJlclwiO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIGxhenkgPyBcImNoYW5nZVwiIDogXCJpbnB1dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0LmNvbXBvc2luZykgcmV0dXJuO1xuICAgICAgbGV0IGRvbVZhbHVlID0gZWwudmFsdWU7XG4gICAgICBpZiAodHJpbSkge1xuICAgICAgICBkb21WYWx1ZSA9IGRvbVZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChjYXN0VG9OdW1iZXIpIHtcbiAgICAgICAgZG9tVmFsdWUgPSBsb29zZVRvTnVtYmVyKGRvbVZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGVsW2Fzc2lnbktleV0oZG9tVmFsdWUpO1xuICAgIH0pO1xuICAgIGlmICh0cmltKSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAgIGVsLnZhbHVlID0gZWwudmFsdWUudHJpbSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghbGF6eSkge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjb21wb3NpdGlvbnN0YXJ0XCIsIG9uQ29tcG9zaXRpb25TdGFydCk7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNvbXBvc2l0aW9uZW5kXCIsIG9uQ29tcG9zaXRpb25FbmQpO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbCwgXCJjaGFuZ2VcIiwgb25Db21wb3NpdGlvbkVuZCk7XG4gICAgfVxuICB9LFxuICAvLyBzZXQgdmFsdWUgb24gbW91bnRlZCBzbyBpdCdzIGFmdGVyIG1pbi9tYXggZm9yIHR5cGU9XCJyYW5nZVwiXG4gIG1vdW50ZWQoZWwsIHsgdmFsdWUgfSkge1xuICAgIGVsLnZhbHVlID0gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTtcbiAgfSxcbiAgYmVmb3JlVXBkYXRlKGVsLCB7IHZhbHVlLCBvbGRWYWx1ZSwgbW9kaWZpZXJzOiB7IGxhenksIHRyaW0sIG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGlmIChlbC5jb21wb3NpbmcpIHJldHVybjtcbiAgICBjb25zdCBlbFZhbHVlID0gKG51bWJlciB8fCBlbC50eXBlID09PSBcIm51bWJlclwiKSAmJiAhL14wXFxkLy50ZXN0KGVsLnZhbHVlKSA/IGxvb3NlVG9OdW1iZXIoZWwudmFsdWUpIDogZWwudmFsdWU7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlO1xuICAgIGlmIChlbFZhbHVlID09PSBuZXdWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWwgJiYgZWwudHlwZSAhPT0gXCJyYW5nZVwiKSB7XG4gICAgICBpZiAobGF6eSAmJiB2YWx1ZSA9PT0gb2xkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRyaW0gJiYgZWwudmFsdWUudHJpbSgpID09PSBuZXdWYWx1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIGVsLnZhbHVlID0gbmV3VmFsdWU7XG4gIH1cbn07XG5jb25zdCB2TW9kZWxDaGVja2JveCA9IHtcbiAgLy8gIzQwOTYgYXJyYXkgY2hlY2tib3hlcyBuZWVkIHRvIGJlIGRlZXAgdHJhdmVyc2VkXG4gIGRlZXA6IHRydWUsXG4gIGNyZWF0ZWQoZWwsIF8sIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSBlbC5fbW9kZWxWYWx1ZTtcbiAgICAgIGNvbnN0IGVsZW1lbnRWYWx1ZSA9IGdldFZhbHVlKGVsKTtcbiAgICAgIGNvbnN0IGNoZWNrZWQgPSBlbC5jaGVja2VkO1xuICAgICAgY29uc3QgYXNzaWduID0gZWxbYXNzaWduS2V5XTtcbiAgICAgIGlmIChpc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbG9vc2VJbmRleE9mKG1vZGVsVmFsdWUsIGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgICAgICBpZiAoY2hlY2tlZCAmJiAhZm91bmQpIHtcbiAgICAgICAgICBhc3NpZ24obW9kZWxWYWx1ZS5jb25jYXQoZWxlbWVudFZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrZWQgJiYgZm91bmQpIHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IFsuLi5tb2RlbFZhbHVlXTtcbiAgICAgICAgICBmaWx0ZXJlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIGFzc2lnbihmaWx0ZXJlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNTZXQobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgY2xvbmVkID0gbmV3IFNldChtb2RlbFZhbHVlKTtcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICBjbG9uZWQuYWRkKGVsZW1lbnRWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvbmVkLmRlbGV0ZShlbGVtZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGFzc2lnbihjbG9uZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzaWduKGdldENoZWNrYm94VmFsdWUoZWwsIGNoZWNrZWQpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgLy8gc2V0IGluaXRpYWwgY2hlY2tlZCBvbiBtb3VudCB0byB3YWl0IGZvciB0cnVlLXZhbHVlL2ZhbHNlLXZhbHVlXG4gIG1vdW50ZWQ6IHNldENoZWNrZWQsXG4gIGJlZm9yZVVwZGF0ZShlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgc2V0Q2hlY2tlZChlbCwgYmluZGluZywgdm5vZGUpO1xuICB9XG59O1xuZnVuY3Rpb24gc2V0Q2hlY2tlZChlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgZWwuX21vZGVsVmFsdWUgPSB2YWx1ZTtcbiAgbGV0IGNoZWNrZWQ7XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGNoZWNrZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKSA+IC0xO1xuICB9IGVsc2UgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgIGNoZWNrZWQgPSB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrZWQgPSBsb29zZUVxdWFsKHZhbHVlLCBnZXRDaGVja2JveFZhbHVlKGVsLCB0cnVlKSk7XG4gIH1cbiAgaWYgKGVsLmNoZWNrZWQgIT09IGNoZWNrZWQpIHtcbiAgICBlbC5jaGVja2VkID0gY2hlY2tlZDtcbiAgfVxufVxuY29uc3Qgdk1vZGVsUmFkaW8gPSB7XG4gIGNyZWF0ZWQoZWwsIHsgdmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbC5jaGVja2VkID0gbG9vc2VFcXVhbCh2YWx1ZSwgdm5vZGUucHJvcHMudmFsdWUpO1xuICAgIGVsW2Fzc2lnbktleV0gPSBnZXRNb2RlbEFzc2lnbmVyKHZub2RlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBlbFthc3NpZ25LZXldKGdldFZhbHVlKGVsKSk7XG4gICAgfSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgeyB2YWx1ZSwgb2xkVmFsdWUgfSwgdm5vZGUpIHtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gICAgaWYgKHZhbHVlICE9PSBvbGRWYWx1ZSkge1xuICAgICAgZWwuY2hlY2tlZCA9IGxvb3NlRXF1YWwodmFsdWUsIHZub2RlLnByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5jb25zdCB2TW9kZWxTZWxlY3QgPSB7XG4gIC8vIDxzZWxlY3QgbXVsdGlwbGU+IHZhbHVlIG5lZWQgdG8gYmUgZGVlcCB0cmF2ZXJzZWRcbiAgZGVlcDogdHJ1ZSxcbiAgY3JlYXRlZChlbCwgeyB2YWx1ZSwgbW9kaWZpZXJzOiB7IG51bWJlciB9IH0sIHZub2RlKSB7XG4gICAgY29uc3QgaXNTZXRNb2RlbCA9IGlzU2V0KHZhbHVlKTtcbiAgICBhZGRFdmVudExpc3RlbmVyKGVsLCBcImNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbCA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChlbC5vcHRpb25zLCAobykgPT4gby5zZWxlY3RlZCkubWFwKFxuICAgICAgICAobykgPT4gbnVtYmVyID8gbG9vc2VUb051bWJlcihnZXRWYWx1ZShvKSkgOiBnZXRWYWx1ZShvKVxuICAgICAgKTtcbiAgICAgIGVsW2Fzc2lnbktleV0oXG4gICAgICAgIGVsLm11bHRpcGxlID8gaXNTZXRNb2RlbCA/IG5ldyBTZXQoc2VsZWN0ZWRWYWwpIDogc2VsZWN0ZWRWYWwgOiBzZWxlY3RlZFZhbFswXVxuICAgICAgKTtcbiAgICAgIGVsLl9hc3NpZ25pbmcgPSB0cnVlO1xuICAgICAgbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBlbC5fYXNzaWduaW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBlbFthc3NpZ25LZXldID0gZ2V0TW9kZWxBc3NpZ25lcih2bm9kZSk7XG4gIH0sXG4gIC8vIHNldCB2YWx1ZSBpbiBtb3VudGVkICYgdXBkYXRlZCBiZWNhdXNlIDxzZWxlY3Q+IHJlbGllcyBvbiBpdHMgY2hpbGRyZW5cbiAgLy8gPG9wdGlvbj5zLlxuICBtb3VudGVkKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgbnVtYmVyIH0gfSkge1xuICAgIHNldFNlbGVjdGVkKGVsLCB2YWx1ZSk7XG4gIH0sXG4gIGJlZm9yZVVwZGF0ZShlbCwgX2JpbmRpbmcsIHZub2RlKSB7XG4gICAgZWxbYXNzaWduS2V5XSA9IGdldE1vZGVsQXNzaWduZXIodm5vZGUpO1xuICB9LFxuICB1cGRhdGVkKGVsLCB7IHZhbHVlLCBtb2RpZmllcnM6IHsgbnVtYmVyIH0gfSkge1xuICAgIGlmICghZWwuX2Fzc2lnbmluZykge1xuICAgICAgc2V0U2VsZWN0ZWQoZWwsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn07XG5mdW5jdGlvbiBzZXRTZWxlY3RlZChlbCwgdmFsdWUsIG51bWJlcikge1xuICBjb25zdCBpc011bHRpcGxlID0gZWwubXVsdGlwbGU7XG4gIGNvbnN0IGlzQXJyYXlWYWx1ZSA9IGlzQXJyYXkodmFsdWUpO1xuICBpZiAoaXNNdWx0aXBsZSAmJiAhaXNBcnJheVZhbHVlICYmICFpc1NldCh2YWx1ZSkpIHtcbiAgICAhIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpICYmIHdhcm4oXG4gICAgICBgPHNlbGVjdCBtdWx0aXBsZSB2LW1vZGVsPiBleHBlY3RzIGFuIEFycmF5IG9yIFNldCB2YWx1ZSBmb3IgaXRzIGJpbmRpbmcsIGJ1dCBnb3QgJHtPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKX0uYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAobGV0IGkgPSAwLCBsID0gZWwub3B0aW9ucy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBvcHRpb24gPSBlbC5vcHRpb25zW2ldO1xuICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2V0VmFsdWUob3B0aW9uKTtcbiAgICBpZiAoaXNNdWx0aXBsZSkge1xuICAgICAgaWYgKGlzQXJyYXlWYWx1ZSkge1xuICAgICAgICBjb25zdCBvcHRpb25UeXBlID0gdHlwZW9mIG9wdGlvblZhbHVlO1xuICAgICAgICBpZiAob3B0aW9uVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBvcHRpb25UeXBlID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gdmFsdWUuc29tZSgodikgPT4gU3RyaW5nKHYpID09PSBTdHJpbmcob3B0aW9uVmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBsb29zZUluZGV4T2YodmFsdWUsIG9wdGlvblZhbHVlKSA+IC0xO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSB2YWx1ZS5oYXMob3B0aW9uVmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobG9vc2VFcXVhbChnZXRWYWx1ZShvcHRpb24pLCB2YWx1ZSkpIHtcbiAgICAgIGlmIChlbC5zZWxlY3RlZEluZGV4ICE9PSBpKSBlbC5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc011bHRpcGxlICYmIGVsLnNlbGVjdGVkSW5kZXggIT09IC0xKSB7XG4gICAgZWwuc2VsZWN0ZWRJbmRleCA9IC0xO1xuICB9XG59XG5mdW5jdGlvbiBnZXRWYWx1ZShlbCkge1xuICByZXR1cm4gXCJfdmFsdWVcIiBpbiBlbCA/IGVsLl92YWx1ZSA6IGVsLnZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Q2hlY2tib3hWYWx1ZShlbCwgY2hlY2tlZCkge1xuICBjb25zdCBrZXkgPSBjaGVja2VkID8gXCJfdHJ1ZVZhbHVlXCIgOiBcIl9mYWxzZVZhbHVlXCI7XG4gIHJldHVybiBrZXkgaW4gZWwgPyBlbFtrZXldIDogY2hlY2tlZDtcbn1cbmNvbnN0IHZNb2RlbER5bmFtaWMgPSB7XG4gIGNyZWF0ZWQoZWwsIGJpbmRpbmcsIHZub2RlKSB7XG4gICAgY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIG51bGwsIFwiY3JlYXRlZFwiKTtcbiAgfSxcbiAgbW91bnRlZChlbCwgYmluZGluZywgdm5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgbnVsbCwgXCJtb3VudGVkXCIpO1xuICB9LFxuICBiZWZvcmVVcGRhdGUoZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUpIHtcbiAgICBjYWxsTW9kZWxIb29rKGVsLCBiaW5kaW5nLCB2bm9kZSwgcHJldlZOb2RlLCBcImJlZm9yZVVwZGF0ZVwiKTtcbiAgfSxcbiAgdXBkYXRlZChlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSkge1xuICAgIGNhbGxNb2RlbEhvb2soZWwsIGJpbmRpbmcsIHZub2RlLCBwcmV2Vk5vZGUsIFwidXBkYXRlZFwiKTtcbiAgfVxufTtcbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljTW9kZWwodGFnTmFtZSwgdHlwZSkge1xuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICBjYXNlIFwiU0VMRUNUXCI6XG4gICAgICByZXR1cm4gdk1vZGVsU2VsZWN0O1xuICAgIGNhc2UgXCJURVhUQVJFQVwiOlxuICAgICAgcmV0dXJuIHZNb2RlbFRleHQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsQ2hlY2tib3g7XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOlxuICAgICAgICAgIHJldHVybiB2TW9kZWxSYWRpbztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gdk1vZGVsVGV4dDtcbiAgICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY2FsbE1vZGVsSG9vayhlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSwgaG9vaykge1xuICBjb25zdCBtb2RlbFRvVXNlID0gcmVzb2x2ZUR5bmFtaWNNb2RlbChcbiAgICBlbC50YWdOYW1lLFxuICAgIHZub2RlLnByb3BzICYmIHZub2RlLnByb3BzLnR5cGVcbiAgKTtcbiAgY29uc3QgZm4gPSBtb2RlbFRvVXNlW2hvb2tdO1xuICBmbiAmJiBmbihlbCwgYmluZGluZywgdm5vZGUsIHByZXZWTm9kZSk7XG59XG5mdW5jdGlvbiBpbml0Vk1vZGVsRm9yU1NSKCkge1xuICB2TW9kZWxUZXh0LmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSkgPT4gKHsgdmFsdWUgfSk7XG4gIHZNb2RlbFJhZGlvLmdldFNTUlByb3BzID0gKHsgdmFsdWUgfSwgdm5vZGUpID0+IHtcbiAgICBpZiAodm5vZGUucHJvcHMgJiYgbG9vc2VFcXVhbCh2bm9kZS5wcm9wcy52YWx1ZSwgdmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgfVxuICB9O1xuICB2TW9kZWxDaGVja2JveC5nZXRTU1JQcm9wcyA9ICh7IHZhbHVlIH0sIHZub2RlKSA9PiB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBpZiAodm5vZGUucHJvcHMgJiYgbG9vc2VJbmRleE9mKHZhbHVlLCB2bm9kZS5wcm9wcy52YWx1ZSkgPiAtMSkge1xuICAgICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1NldCh2YWx1ZSkpIHtcbiAgICAgIGlmICh2bm9kZS5wcm9wcyAmJiB2YWx1ZS5oYXModm5vZGUucHJvcHMudmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB7IGNoZWNrZWQ6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4geyBjaGVja2VkOiB0cnVlIH07XG4gICAgfVxuICB9O1xuICB2TW9kZWxEeW5hbWljLmdldFNTUlByb3BzID0gKGJpbmRpbmcsIHZub2RlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2bm9kZS50eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1vZGVsVG9Vc2UgPSByZXNvbHZlRHluYW1pY01vZGVsKFxuICAgICAgLy8gcmVzb2x2ZUR5bmFtaWNNb2RlbCBleHBlY3RzIGFuIHVwcGVyY2FzZSB0YWcgbmFtZSwgYnV0IHZub2RlLnR5cGUgaXMgbG93ZXJjYXNlXG4gICAgICB2bm9kZS50eXBlLnRvVXBwZXJDYXNlKCksXG4gICAgICB2bm9kZS5wcm9wcyAmJiB2bm9kZS5wcm9wcy50eXBlXG4gICAgKTtcbiAgICBpZiAobW9kZWxUb1VzZS5nZXRTU1JQcm9wcykge1xuICAgICAgcmV0dXJuIG1vZGVsVG9Vc2UuZ2V0U1NSUHJvcHMoYmluZGluZywgdm5vZGUpO1xuICAgIH1cbiAgfTtcbn1cblxuY29uc3Qgc3lzdGVtTW9kaWZpZXJzID0gW1wiY3RybFwiLCBcInNoaWZ0XCIsIFwiYWx0XCIsIFwibWV0YVwiXTtcbmNvbnN0IG1vZGlmaWVyR3VhcmRzID0ge1xuICBzdG9wOiAoZSkgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgcHJldmVudDogKGUpID0+IGUucHJldmVudERlZmF1bHQoKSxcbiAgc2VsZjogKGUpID0+IGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQsXG4gIGN0cmw6IChlKSA9PiAhZS5jdHJsS2V5LFxuICBzaGlmdDogKGUpID0+ICFlLnNoaWZ0S2V5LFxuICBhbHQ6IChlKSA9PiAhZS5hbHRLZXksXG4gIG1ldGE6IChlKSA9PiAhZS5tZXRhS2V5LFxuICBsZWZ0OiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAwLFxuICBtaWRkbGU6IChlKSA9PiBcImJ1dHRvblwiIGluIGUgJiYgZS5idXR0b24gIT09IDEsXG4gIHJpZ2h0OiAoZSkgPT4gXCJidXR0b25cIiBpbiBlICYmIGUuYnV0dG9uICE9PSAyLFxuICBleGFjdDogKGUsIG1vZGlmaWVycykgPT4gc3lzdGVtTW9kaWZpZXJzLnNvbWUoKG0pID0+IGVbYCR7bX1LZXlgXSAmJiAhbW9kaWZpZXJzLmluY2x1ZGVzKG0pKVxufTtcbmNvbnN0IHdpdGhNb2RpZmllcnMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGZuLl93aXRoTW9kcyB8fCAoZm4uX3dpdGhNb2RzID0ge30pO1xuICBjb25zdCBjYWNoZUtleSA9IG1vZGlmaWVycy5qb2luKFwiLlwiKTtcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSB8fCAoY2FjaGVbY2FjaGVLZXldID0gKGV2ZW50LCAuLi5hcmdzKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RpZmllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGd1YXJkID0gbW9kaWZpZXJHdWFyZHNbbW9kaWZpZXJzW2ldXTtcbiAgICAgIGlmIChndWFyZCAmJiBndWFyZChldmVudCwgbW9kaWZpZXJzKSkgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZm4oZXZlbnQsIC4uLmFyZ3MpO1xuICB9KTtcbn07XG5jb25zdCBrZXlOYW1lcyA9IHtcbiAgZXNjOiBcImVzY2FwZVwiLFxuICBzcGFjZTogXCIgXCIsXG4gIHVwOiBcImFycm93LXVwXCIsXG4gIGxlZnQ6IFwiYXJyb3ctbGVmdFwiLFxuICByaWdodDogXCJhcnJvdy1yaWdodFwiLFxuICBkb3duOiBcImFycm93LWRvd25cIixcbiAgZGVsZXRlOiBcImJhY2tzcGFjZVwiXG59O1xuY29uc3Qgd2l0aEtleXMgPSAoZm4sIG1vZGlmaWVycykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGZuLl93aXRoS2V5cyB8fCAoZm4uX3dpdGhLZXlzID0ge30pO1xuICBjb25zdCBjYWNoZUtleSA9IG1vZGlmaWVycy5qb2luKFwiLlwiKTtcbiAgcmV0dXJuIGNhY2hlW2NhY2hlS2V5XSB8fCAoY2FjaGVbY2FjaGVLZXldID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCEoXCJrZXlcIiBpbiBldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRLZXkgPSBoeXBoZW5hdGUoZXZlbnQua2V5KTtcbiAgICBpZiAobW9kaWZpZXJzLnNvbWUoXG4gICAgICAoaykgPT4gayA9PT0gZXZlbnRLZXkgfHwga2V5TmFtZXNba10gPT09IGV2ZW50S2V5XG4gICAgKSkge1xuICAgICAgcmV0dXJuIGZuKGV2ZW50KTtcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgcmVuZGVyZXJPcHRpb25zID0gLyogQF9fUFVSRV9fICovIGV4dGVuZCh7IHBhdGNoUHJvcCB9LCBub2RlT3BzKTtcbmxldCByZW5kZXJlcjtcbmxldCBlbmFibGVkSHlkcmF0aW9uID0gZmFsc2U7XG5mdW5jdGlvbiBlbnN1cmVSZW5kZXJlcigpIHtcbiAgcmV0dXJuIHJlbmRlcmVyIHx8IChyZW5kZXJlciA9IGNyZWF0ZVJlbmRlcmVyKHJlbmRlcmVyT3B0aW9ucykpO1xufVxuZnVuY3Rpb24gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKSB7XG4gIHJlbmRlcmVyID0gZW5hYmxlZEh5ZHJhdGlvbiA/IHJlbmRlcmVyIDogY3JlYXRlSHlkcmF0aW9uUmVuZGVyZXIocmVuZGVyZXJPcHRpb25zKTtcbiAgZW5hYmxlZEh5ZHJhdGlvbiA9IHRydWU7XG4gIHJldHVybiByZW5kZXJlcjtcbn1cbmNvbnN0IHJlbmRlciA9ICguLi5hcmdzKSA9PiB7XG4gIGVuc3VyZVJlbmRlcmVyKCkucmVuZGVyKC4uLmFyZ3MpO1xufTtcbmNvbnN0IGh5ZHJhdGUgPSAoLi4uYXJncykgPT4ge1xuICBlbnN1cmVIeWRyYXRpb25SZW5kZXJlcigpLmh5ZHJhdGUoLi4uYXJncyk7XG59O1xuY29uc3QgY3JlYXRlQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcbiAgICBjb25zdCBjb21wb25lbnQgPSBhcHAuX2NvbXBvbmVudDtcbiAgICBpZiAoIWlzRnVuY3Rpb24oY29tcG9uZW50KSAmJiAhY29tcG9uZW50LnJlbmRlciAmJiAhY29tcG9uZW50LnRlbXBsYXRlKSB7XG4gICAgICBjb21wb25lbnQudGVtcGxhdGUgPSBjb250YWluZXIuaW5uZXJIVE1MO1xuICAgIH1cbiAgICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBwcm94eSA9IG1vdW50KGNvbnRhaW5lciwgZmFsc2UsIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikpO1xuICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250YWluZXIucmVtb3ZlQXR0cmlidXRlKFwidi1jbG9ha1wiKTtcbiAgICAgIGNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLXYtYXBwXCIsIFwiXCIpO1xuICAgIH1cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG4gIHJldHVybiBhcHA7XG59O1xuY29uc3QgY3JlYXRlU1NSQXBwID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgYXBwID0gZW5zdXJlSHlkcmF0aW9uUmVuZGVyZXIoKS5jcmVhdGVBcHAoLi4uYXJncyk7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKTtcbiAgICBpbmplY3RDb21waWxlck9wdGlvbnNDaGVjayhhcHApO1xuICB9XG4gIGNvbnN0IHsgbW91bnQgfSA9IGFwcDtcbiAgYXBwLm1vdW50ID0gKGNvbnRhaW5lck9yU2VsZWN0b3IpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBub3JtYWxpemVDb250YWluZXIoY29udGFpbmVyT3JTZWxlY3Rvcik7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuIG1vdW50KGNvbnRhaW5lciwgdHJ1ZSwgcmVzb2x2ZVJvb3ROYW1lc3BhY2UoY29udGFpbmVyKSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBwO1xufTtcbmZ1bmN0aW9uIHJlc29sdmVSb290TmFtZXNwYWNlKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgIHJldHVybiBcInN2Z1wiO1xuICB9XG4gIGlmICh0eXBlb2YgTWF0aE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIE1hdGhNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gXCJtYXRobWxcIjtcbiAgfVxufVxuZnVuY3Rpb24gaW5qZWN0TmF0aXZlVGFnQ2hlY2soYXBwKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHAuY29uZmlnLCBcImlzTmF0aXZlVGFnXCIsIHtcbiAgICB2YWx1ZTogKHRhZykgPT4gaXNIVE1MVGFnKHRhZykgfHwgaXNTVkdUYWcodGFnKSB8fCBpc01hdGhNTFRhZyh0YWcpLFxuICAgIHdyaXRhYmxlOiBmYWxzZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluamVjdENvbXBpbGVyT3B0aW9uc0NoZWNrKGFwcCkge1xuICBpZiAoaXNSdW50aW1lT25seSgpKSB7XG4gICAgY29uc3QgaXNDdXN0b21FbGVtZW50ID0gYXBwLmNvbmZpZy5pc0N1c3RvbUVsZW1lbnQ7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFwcC5jb25maWcsIFwiaXNDdXN0b21FbGVtZW50XCIsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGlzQ3VzdG9tRWxlbWVudDtcbiAgICAgIH0sXG4gICAgICBzZXQoKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFRoZSBcXGBpc0N1c3RvbUVsZW1lbnRcXGAgY29uZmlnIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgXFxgY29tcGlsZXJPcHRpb25zLmlzQ3VzdG9tRWxlbWVudFxcYCBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBhcHAuY29uZmlnLmNvbXBpbGVyT3B0aW9ucztcbiAgICBjb25zdCBtc2cgPSBgVGhlIFxcYGNvbXBpbGVyT3B0aW9uc1xcYCBjb25maWcgb3B0aW9uIGlzIG9ubHkgcmVzcGVjdGVkIHdoZW4gdXNpbmcgYSBidWlsZCBvZiBWdWUuanMgdGhhdCBpbmNsdWRlcyB0aGUgcnVudGltZSBjb21waWxlciAoYWthIFwiZnVsbCBidWlsZFwiKS4gU2luY2UgeW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkLCBcXGBjb21waWxlck9wdGlvbnNcXGAgbXVzdCBiZSBwYXNzZWQgdG8gXFxgQHZ1ZS9jb21waWxlci1kb21cXGAgaW4gdGhlIGJ1aWxkIHNldHVwIGluc3RlYWQuXG4tIEZvciB2dWUtbG9hZGVyOiBwYXNzIGl0IHZpYSB2dWUtbG9hZGVyJ3MgXFxgY29tcGlsZXJPcHRpb25zXFxgIGxvYWRlciBvcHRpb24uXG4tIEZvciB2dWUtY2xpOiBzZWUgaHR0cHM6Ly9jbGkudnVlanMub3JnL2d1aWRlL3dlYnBhY2suaHRtbCNtb2RpZnlpbmctb3B0aW9ucy1vZi1hLWxvYWRlclxuLSBGb3Igdml0ZTogcGFzcyBpdCB2aWEgQHZpdGVqcy9wbHVnaW4tdnVlIG9wdGlvbnMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdml0ZWpzL3ZpdGUtcGx1Z2luLXZ1ZS90cmVlL21haW4vcGFja2FnZXMvcGx1Z2luLXZ1ZSNleGFtcGxlLWZvci1wYXNzaW5nLW9wdGlvbnMtdG8tdnVlY29tcGlsZXItc2ZjYDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwLmNvbmZpZywgXCJjb21waWxlck9wdGlvbnNcIiwge1xuICAgICAgZ2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICAgIHJldHVybiBjb21waWxlck9wdGlvbnM7XG4gICAgICB9LFxuICAgICAgc2V0KCkge1xuICAgICAgICB3YXJuKG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgaWYgKGlzU3RyaW5nKGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCByZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgaWYgKCEhKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikgJiYgIXJlcykge1xuICAgICAgd2FybihcbiAgICAgICAgYEZhaWxlZCB0byBtb3VudCBhcHA6IG1vdW50IHRhcmdldCBzZWxlY3RvciBcIiR7Y29udGFpbmVyfVwiIHJldHVybmVkIG51bGwuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoISEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCAmJiBjb250YWluZXIubW9kZSA9PT0gXCJjbG9zZWRcIikge1xuICAgIHdhcm4oXG4gICAgICBgbW91bnRpbmcgb24gYSBTaGFkb3dSb290IHdpdGggXFxge21vZGU6IFwiY2xvc2VkXCJ9XFxgIG1heSBsZWFkIHRvIHVucHJlZGljdGFibGUgYnVnc2BcbiAgICApO1xuICB9XG4gIHJldHVybiBjb250YWluZXI7XG59XG5sZXQgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbmNvbnN0IGluaXREaXJlY3RpdmVzRm9yU1NSID0gKCkgPT4ge1xuICBpZiAoIXNzckRpcmVjdGl2ZUluaXRpYWxpemVkKSB7XG4gICAgc3NyRGlyZWN0aXZlSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIGluaXRWTW9kZWxGb3JTU1IoKTtcbiAgICBpbml0VlNob3dGb3JTU1IoKTtcbiAgfVxufSA7XG5cbmV4cG9ydCB7IFRyYW5zaXRpb24sIFRyYW5zaXRpb25Hcm91cCwgVnVlRWxlbWVudCwgY3JlYXRlQXBwLCBjcmVhdGVTU1JBcHAsIGRlZmluZUN1c3RvbUVsZW1lbnQsIGRlZmluZVNTUkN1c3RvbUVsZW1lbnQsIGh5ZHJhdGUsIGluaXREaXJlY3RpdmVzRm9yU1NSLCByZW5kZXIsIHVzZUNzc01vZHVsZSwgdXNlQ3NzVmFycywgdXNlSG9zdCwgdXNlU2hhZG93Um9vdCwgdk1vZGVsQ2hlY2tib3gsIHZNb2RlbER5bmFtaWMsIHZNb2RlbFJhZGlvLCB2TW9kZWxTZWxlY3QsIHZNb2RlbFRleHQsIHZTaG93LCB3aXRoS2V5cywgd2l0aE1vZGlmaWVycyB9O1xuIiwiLyoqXG4qIHZ1ZSB2My41LjZcbiogKGMpIDIwMTgtcHJlc2VudCBZdXhpIChFdmFuKSBZb3UgYW5kIFZ1ZSBjb250cmlidXRvcnNcbiogQGxpY2Vuc2UgTUlUXG4qKi9cbmltcG9ydCB7IGluaXRDdXN0b21Gb3JtYXR0ZXIsIHdhcm4gfSBmcm9tICdAdnVlL3J1bnRpbWUtZG9tJztcbmV4cG9ydCAqIGZyb20gJ0B2dWUvcnVudGltZS1kb20nO1xuXG5mdW5jdGlvbiBpbml0RGV2KCkge1xuICB7XG4gICAgaW5pdEN1c3RvbUZvcm1hdHRlcigpO1xuICB9XG59XG5cbmlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gIGluaXREZXYoKTtcbn1cbmNvbnN0IGNvbXBpbGUgPSAoKSA9PiB7XG4gIGlmICghIShwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpKSB7XG4gICAgd2FybihcbiAgICAgIGBSdW50aW1lIGNvbXBpbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBWdWUuYCArIChgIENvbmZpZ3VyZSB5b3VyIGJ1bmRsZXIgdG8gYWxpYXMgXCJ2dWVcIiB0byBcInZ1ZS9kaXN0L3Z1ZS5lc20tYnVuZGxlci5qc1wiLmAgKVxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCB7IGNvbXBpbGUgfTtcbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tY2FsZW5kYXJcbiAgLmRpdG8tY2FsZW5kYXItcG9wdXBcbiAgICAuZGl0by1jYWxlbmRhci1pbm5lclxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtaWY9XCJjdXJyZW50TW9kZSA9PT0gJ2RheSdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldi5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICAgIGEuZGl0by1jYWxlbmRhci1zZWxlY3QtbW9udGgoXG4gICAgICAgICAgICAgIEBjbGljaz1cInNldE1vZGUoJ21vbnRoJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IG1vbnRoOiB0cnVlIH0pIH19XG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dC5kaXRvLWNhbGVuZGFyLXN0ZXAtbW9udGgoXG4gICAgICAgICAgICBAY2xpY2s9XCJzdGVwTW9udGgoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0LmRpdG8tY2FsZW5kYXItc3RlcC15ZWFyKFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLXdlZWtkYXlzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cIndlZWtkYXkgaW4gd2Vla2RheU5hbWVzXCJcbiAgICAgICAgICAgICkge3sgd2Vla2RheS5zaG9ydCB9fVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLWRhdGVzXG4gICAgICAgICAgICBzcGFuKFxuICAgICAgICAgICAgICB2LWZvcj1cImRhdGUgaW4gZGF0ZVJhbmdlXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZGF0ZS5zdGF0ZSAmJiBgZGl0by1jYWxlbmRhci1pdGVtLSR7ZGF0ZS5zdGF0ZX1gXCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwiZGF0ZS5zdGF0ZSAhPT0gJ2Rpc2FibGVkJyAmJiBzZWxlY3REYXRlKGRhdGUuZGF0ZSlcIlxuICAgICAgICAgICAgKSB7eyBkYXRlLnRleHQgfX1cbiAgICAgICAgLmRpdG8tY2FsZW5kYXItZm9vdGVyXG4gICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC1ub3coXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIDp0aXRsZT1cImRhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKVwiXG4gICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3REYXRlKG5ldyBEYXRlKCkpXCJcbiAgICAgICAgICApXG4gICAgICB0ZW1wbGF0ZShcbiAgICAgICAgdi1lbHNlLWlmPVwiY3VycmVudE1vZGUgPT09ICdtb250aCdcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoLTEpXCJcbiAgICAgICAgICApXG4gICAgICAgICAgc3BhblxuICAgICAgICAgICAgYS5kaXRvLWNhbGVuZGFyLXNlbGVjdC15ZWFyKFxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZXRNb2RlKCd5ZWFyJylcIlxuICAgICAgICAgICAgKSB7eyBkYXRlVG9TdHJpbmcoY3VycmVudFZhbHVlLCB7IHllYXI6IHRydWUgfSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcFllYXIoMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgLmRpdG8tY2FsZW5kYXItYm9keVxuICAgICAgICAgIC5kaXRvLWNhbGVuZGFyLW1vbnRoc1xuICAgICAgICAgICAgc3BhbihcbiAgICAgICAgICAgICAgdi1mb3I9XCIobW9udGgsIGluZGV4KSBpbiBtb250aE5hbWVzXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwiZ2V0TW9udGhDbGFzcyhpbmRleClcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RNb250aChpbmRleClcIlxuICAgICAgICAgICAgKSB7eyBtb250aC5zaG9ydCB9fVxuICAgICAgdGVtcGxhdGUoXG4gICAgICAgIHYtZWxzZS1pZj1cImN1cnJlbnRNb2RlID09PSAneWVhcidcIlxuICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1wcmV2KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgtMSlcIlxuICAgICAgICAgIClcbiAgICAgICAgICBzcGFuIHt7IGRlY2FkZVRvU3RyaW5nKGN1cnJlbnRWYWx1ZSkgfX1cbiAgICAgICAgICBhLmRpdG8tY2FsZW5kYXItc3RlcC1uZXh0KFxuICAgICAgICAgICAgQGNsaWNrPVwic3RlcERlY2FkZSgxKVwiXG4gICAgICAgICAgKVxuICAgICAgICAuZGl0by1jYWxlbmRhci1ib2R5XG4gICAgICAgICAgLmRpdG8tY2FsZW5kYXIteWVhcnNcbiAgICAgICAgICAgIHNwYW4oXG4gICAgICAgICAgICAgIHYtZm9yPVwieWVhciBpbiB5ZWFyUmFuZ2VcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJnZXRZZWFyQ2xhc3MoeWVhcilcIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJzZWxlY3RZZWFyKHllYXIpXCJcbiAgICAgICAgICAgICkge3sgeWVhciB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmltcG9ydCB7IGRlc2NyaWJlRGF0ZSwgYWx0ZXJEYXRlIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZScsICdzZWxlY3QnXSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBkaXNhYmxlZERhdGU6IHsgdHlwZTogRnVuY3Rpb24sIGRlZmF1bHQ6ICgpID0+IGZhbHNlIH0sXG4gICAgbW9kZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdkYXknIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIGNvbnN0IHsgd2Vla2RheU5hbWVzLCBtb250aE5hbWVzIH0gPSBnZXRMb2NhbGVOYW1lcyh0aGlzLmxvY2FsZSlcbiAgICByZXR1cm4ge1xuICAgICAgd2Vla2RheU5hbWVzLFxuICAgICAgbW9udGhOYW1lcyxcbiAgICAgIGRhdGVSYW5nZTogW10sXG4gICAgICB5ZWFyUmFuZ2U6IFtdLFxuICAgICAgY3VycmVudFZhbHVlOiAoXG4gICAgICAgIHRoaXMubW9kZWxWYWx1ZSB8fFxuICAgICAgICAvLyBJZiBubyB2YWx1ZSBpcyBwcm92aWRlZCwgdXNlIGN1cnJlbnQgZGF0ZSBidXQgY2xlYXIgdGltZSBmaWVsZHM6XG4gICAgICAgIGFsdGVyRGF0ZShuZXcgRGF0ZSgpLCB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBtaWxsaXNlY29uZDogMCB9KVxuICAgICAgKSxcbiAgICAgIGN1cnJlbnRNb2RlOiB0aGlzLm1vZGVcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvIHx8IG5ldyBEYXRlKClcbiAgICAgICAgdGhpcy51cGRhdGVEYXRlUmFuZ2UoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICgrdG8gIT09ICtmcm9tKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZGlzYWJsZWREYXRlOiAndXBkYXRlRGF0ZVJhbmdlJyxcblxuICAgIG1vZGUobW9kZSkge1xuICAgICAgdGhpcy5jdXJyZW50TW9kZSA9IG1vZGVcbiAgICB9XG4gIH0sXG5cbiAgbW91bnRlZCgpIHtcbiAgICB0aGlzLnVwZGF0ZURhdGVSYW5nZSgpXG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGdldE1vbnRoQ2xhc3MobW9udGgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlJzogKFxuICAgICAgICAgIHRoaXMubW9kZWxWYWx1ZSAmJlxuICAgICAgICAgIG1vbnRoID09PSB0aGlzLm1vZGVsVmFsdWUuZ2V0TW9udGgoKSAmJlxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMubW9kZWxWYWx1ZS5nZXRGdWxsWWVhcigpXG4gICAgICAgICksXG4gICAgICAgICdkaXRvLWNhbGVuZGFyLWl0ZW0tY3VycmVudCc6IG1vbnRoID09PSB0aGlzLmN1cnJlbnRWYWx1ZS5nZXRNb250aCgpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGdldFllYXJDbGFzcyh5ZWFyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by1jYWxlbmRhci1pdGVtLWFjdGl2ZSc6IChcbiAgICAgICAgICB0aGlzLm1vZGVsVmFsdWUgJiYgeWVhciA9PT0gdGhpcy5tb2RlbFZhbHVlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgKSxcbiAgICAgICAgJ2RpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50JzogeWVhciA9PT0gdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXREYXRlKG92ZXJyaWRlcywgdXBkYXRlID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gYWx0ZXJEYXRlKHRoaXMuY3VycmVudFZhbHVlLCBvdmVycmlkZXMpXG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTptb2RlbFZhbHVlJywgdGhpcy5jdXJyZW50VmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0ZXBEZWNhZGUoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiAxMFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc2V0TW9kZShtb2RlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2RlID0gbW9kZVxuICAgIH0sXG5cbiAgICBzdGVwTW9udGgoc3RlcCkge1xuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHsgeWVhciwgbW9udGggfSA9IHRoaXMuZ2V0WWVhck1vbnRoKFxuICAgICAgICBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgY3VycmVudFZhbHVlLmdldE1vbnRoKCkgKyBzdGVwXG4gICAgICApXG4gICAgICB0aGlzLnNldERhdGUoe1xuICAgICAgICBtb250aCxcbiAgICAgICAgZGF5OiBNYXRoLm1pbihcbiAgICAgICAgICB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZS5nZXREYXRlKClcbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgc3RlcFllYXIoc3RlcCkge1xuICAgICAgdGhpcy5zZXREYXRlKHtcbiAgICAgICAgeWVhcjogdGhpcy5jdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKSArIHN0ZXBcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIHNlbGVjdERhdGUoZGF0ZSkge1xuICAgICAgdGhpcy5zZXREYXRlKGRlc2NyaWJlRGF0ZShkYXRlKSwgdHJ1ZSlcbiAgICAgIHRoaXMuJGVtaXQoJ3NlbGVjdCcpXG4gICAgfSxcblxuICAgIHNlbGVjdE1vbnRoKG1vbnRoKSB7XG4gICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAvLyBTZXQgZGF5IHRvIDEgdG8gYXZvaWQgc2VsZWN0aW5nIGEgZGF0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlXG4gICAgICAvLyBuZXcgbW9udGgsIGUuZy4gRmViIDMxIC0+IE1hciAzLlxuICAgICAgdGhpcy5zZXREYXRlKHsgbW9udGgsIGRheTogMSB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBzZWxlY3RZZWFyKHllYXIpIHtcbiAgICAgIHRoaXMuc2V0TW9kZSgnbW9udGgnKVxuICAgICAgdGhpcy5zZXREYXRlKHsgeWVhciB9LCB0cnVlKVxuICAgIH0sXG5cbiAgICBnZXRZZWFyTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgIHllYXIrK1xuICAgICAgICBtb250aCA9IDBcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAwKSB7XG4gICAgICAgIHllYXItLVxuICAgICAgICBtb250aCA9IDExXG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyLCBtb250aCB9XG4gICAgfSxcblxuICAgIGRhdGVUb1N0cmluZyhcbiAgICAgIGRhdGUsXG4gICAgICB7IHllYXIsIG1vbnRoLCBkYXkgfSA9IHsgeWVhcjogdHJ1ZSwgbW9udGg6IHRydWUsIGRheTogdHJ1ZSB9XG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVN0cmluZyh0aGlzLmxvY2FsZSwge1xuICAgICAgICB5ZWFyOiB5ZWFyICYmICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6IG1vbnRoICYmICdsb25nJyxcbiAgICAgICAgZGF5OiBkYXkgJiYgJ251bWVyaWMnXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBkZWNhZGVUb1N0cmluZyhkYXRlKSB7XG4gICAgICBjb25zdCB5ZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZShkYXRlLmdldEZ1bGxZZWFyKCkpXG4gICAgICByZXR1cm4gYCR7eWVhcn0g4oCTICR7eWVhciArIDl9YFxuICAgIH0sXG5cbiAgICBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoICsgMSwgMCkuZ2V0RGF0ZSgpXG4gICAgfSxcblxuICAgIGdldEZpcnN0WWVhck9mRGVjYWRlKHllYXIpIHtcbiAgICAgIGNvbnN0IHllYXJTdHIgPSB5ZWFyLnRvU3RyaW5nKClcbiAgICAgIHJldHVybiArYCR7eWVhclN0ci5zbGljZSgwLCAtMSl9MGBcbiAgICB9LFxuXG4gICAgbmF2aWdhdGUoeyBzdGVwLCBlbnRlciwgbW9kZSA9IHRoaXMuY3VycmVudE1vZGUsIHVwZGF0ZSA9IGZhbHNlIH0pIHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFZhbHVlIH0gPSB0aGlzXG4gICAgICBpZiAoc3RlcCkge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgdGhpcy5zZXREYXRlKHsgZGF5OiBjdXJyZW50VmFsdWUuZ2V0RGF0ZSgpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IG1vbnRoOiBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKSArIHN0ZXAgfSwgdXBkYXRlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0ZSh7IHllYXI6IGN1cnJlbnRWYWx1ZS5nZXRGdWxsWWVhcigpICsgc3RlcCB9LCB1cGRhdGUpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGVudGVyKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TW9kZSkge1xuICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICB0aGlzLnNlbGVjdERhdGUoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2RheScpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdtb250aCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSxcblxuICAgIHVwZGF0ZURhdGVSYW5nZSgpIHtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlID0gW11cbiAgICAgIHRoaXMueWVhclJhbmdlID0gW11cblxuICAgICAgY29uc3QgeyBjdXJyZW50VmFsdWUgfSA9IHRoaXNcbiAgICAgIGNvbnN0IHllYXIgPSBjdXJyZW50VmFsdWUuZ2V0RnVsbFllYXIoKVxuICAgICAgY29uc3QgbW9udGggPSBjdXJyZW50VmFsdWUuZ2V0TW9udGgoKVxuICAgICAgY29uc3Qgc3RhcnRZZWFyID0gdGhpcy5nZXRGaXJzdFllYXJPZkRlY2FkZSh5ZWFyKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICAgIHRoaXMueWVhclJhbmdlLnB1c2goc3RhcnRZZWFyICsgaSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJNb250aEZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpXG4gICAgICBsZXQgZmlyc3REYXlXZWVrID0gY3Vyck1vbnRoRmlyc3REYXkuZ2V0RGF5KCkgKyAxXG4gICAgICBpZiAoZmlyc3REYXlXZWVrID09PSAwKSB7XG4gICAgICAgIGZpcnN0RGF5V2VlayA9IDdcbiAgICAgIH1cbiAgICAgIGNvbnN0IG51bURheXMgPSB0aGlzLmdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKVxuICAgICAgaWYgKGZpcnN0RGF5V2VlayA+IDEpIHtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoID0gdGhpcy5nZXRZZWFyTW9udGgoeWVhciwgbW9udGggLSAxKVxuICAgICAgICBjb25zdCBwcmV2TW9udGhOdW1EYXlzID0gdGhpcy5nZXREYXlzSW5Nb250aChcbiAgICAgICAgICBwcmV2TW9udGgueWVhcixcbiAgICAgICAgICBwcmV2TW9udGgubW9udGhcbiAgICAgICAgKVxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZpcnN0RGF5V2VlazsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcHJldk1vbnRoTnVtRGF5cyAtIGZpcnN0RGF5V2VlayArIGkgKyAxXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHByZXZNb250aC55ZWFyLCBwcmV2TW9udGgubW9udGgsIGRheSlcbiAgICAgICAgICB0aGlzLmRhdGVSYW5nZS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGRheSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICBzdGF0ZTogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBudW1EYXlzOyBpKyspIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpKVxuICAgICAgICBjb25zdCBpc0RheSA9IGRhdGUgPT4gKFxuICAgICAgICAgIGRhdGUgJiZcbiAgICAgICAgICBkYXRlLmdldERhdGUoKSA9PT0gaSAmJlxuICAgICAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0geWVhciAmJlxuICAgICAgICAgIGRhdGUuZ2V0TW9udGgoKSA9PT0gbW9udGhcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGlzRGF5KHRoaXMubW9kZWxWYWx1ZSlcbiAgICAgICAgICA/ICdhY3RpdmUnXG4gICAgICAgICAgOiBpc0RheShub3cpXG4gICAgICAgICAgICA/ICd0b2RheSdcbiAgICAgICAgICAgIDogdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSlcbiAgICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICAgIDogaXNEYXkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgICAgID8gJ2N1cnJlbnQnXG4gICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgIHRoaXMuZGF0ZVJhbmdlLnB1c2goe1xuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBzdGF0ZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0TW9udGhOZWVkID0gNDIgLSB0aGlzLmRhdGVSYW5nZS5sZW5ndGhcbiAgICAgIGlmIChuZXh0TW9udGhOZWVkID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0TW9udGggPSB0aGlzLmdldFllYXJNb250aCh5ZWFyLCBtb250aCArIDEpXG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG5leHRNb250aE5lZWQ7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShuZXh0TW9udGgueWVhciwgbmV4dE1vbnRoLm1vbnRoLCBpKVxuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kaXNhYmxlZERhdGUoZGF0ZSkgPyAnZGlzYWJsZWQnIDogJ2dyYXknXG4gICAgICAgICAgdGhpcy5kYXRlUmFuZ2UucHVzaCh7XG4gICAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2NhbGVOYW1lcyA9IHt9XG5cbi8vIENhbGxpbmcgYHRvTG9jYWxlU3RyaW5nKClgIHRoaXMgbXVjaCBhcHBlYXJzIHRvIGJlIGV4cGVuc2l2ZSwgc28gY2FjaGUgaXQ6XG5mdW5jdGlvbiBnZXRMb2NhbGVOYW1lcyhsb2NhbGUpIHtcbiAgbGV0IG5hbWVzID0gbG9jYWxlTmFtZXNbbG9jYWxlXVxuICBpZiAoIW5hbWVzKSB7XG4gICAgY29uc3Qgd2Vla2RheU5hbWVzID0gW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDAsIDAsIGkpXG4gICAgICB3ZWVrZGF5TmFtZXMucHVzaCh7XG4gICAgICAgIGxvbmc6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGNvbnN0IG1vbnRoTmFtZXMgPSBbXVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDEyOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwLCBpLCAwKVxuICAgICAgbW9udGhOYW1lcy5wdXNoKHtcbiAgICAgICAgbG9uZzogZGF0ZS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdsb25nJyB9KSxcbiAgICAgICAgc2hvcnQ6IGRhdGUudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IG1vbnRoOiAnc2hvcnQnIH0pXG4gICAgICB9KVxuICAgIH1cbiAgICBuYW1lcyA9IGxvY2FsZU5hbWVzW2xvY2FsZV0gPSB7XG4gICAgICB3ZWVrZGF5TmFtZXMsXG4gICAgICBtb250aE5hbWVzXG4gICAgfVxuICB9XG4gIHJldHVybiBuYW1lc1xufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tY2FsZW5kYXIge1xuICBtaW4td2lkdGg6IDI0MHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG4uZGl0by1jYWxlbmRhci1wb3B1cCB7XG4gIGJvcmRlcjogJGJvcmRlci1zdHlsZTtcbiAgYm9yZGVyLXJhZGl1czogJGJvcmRlci1yYWRpdXM7XG4gIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgYm94LXNoYWRvdzogJHNoYWRvdy13aW5kb3c7XG4gIHotaW5kZXg6ICR6LWluZGV4LXBvcHVwO1xufVxuXG4uZGl0by1jYWxlbmRhci1ib2R5IHtcbiAgcGFkZGluZzogMCAwLjVlbTtcblxuICBzcGFuIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDcpO1xuICAgIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgICBsaW5lLWhlaWdodDogY2FsYygjeyRpbnB1dC1oZWlnaHR9IC0gMnB4KTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICAgIGJvcmRlcjogJGJvcmRlci13aWR0aCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLXRvZGF5IHtcbiAgICBib3JkZXI6ICRib3JkZXItd2lkdGggc29saWQgJGNvbG9yLWFjdGl2ZTtcbiAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgfVxuXG4gIC5kaXRvLWNhbGVuZGFyLWl0ZW0tYWN0aXZlIHtcbiAgICAmLFxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZDogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICB9XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkIHtcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gIH1cblxuICAuZGl0by1jYWxlbmRhci1pdGVtLWRpc2FibGVkLFxuICAuZGl0by1jYWxlbmRhci1pdGVtLWdyYXkge1xuICAgIGNvbG9yOiAjOTk5OTk5O1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLW1vbnRocyxcbi5kaXRvLWNhbGVuZGFyLXllYXJzIHtcbiAgc3BhbiB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAvIDQpO1xuICAgIG1hcmdpbjogMC41ZW0gMDtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuIHtcbiAgd2lkdGg6IGNhbGMoMTAwJSAvIDUpO1xufVxuXG4uZGl0by1jYWxlbmRhciBhLFxuLmRpdG8tY2FsZW5kYXItZGF0ZXMgc3Bhbixcbi5kaXRvLWNhbGVuZGFyLW1vbnRocyBzcGFuLFxuLmRpdG8tY2FsZW5kYXIteWVhcnMgc3BhbiB7XG4gIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyIHNwYW4ge1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgYSB7XG4gICAgcGFkZGluZzogMCAwLjJlbTtcbiAgfVxufVxuXG4uZGl0by1jYWxlbmRhci1kYXRlcyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXItbW9udGhzIHNwYW46aG92ZXIsXG4uZGl0by1jYWxlbmRhci15ZWFycyBzcGFuOmhvdmVyLFxuLmRpdG8tY2FsZW5kYXI6bm90KDpob3ZlcikgLmRpdG8tY2FsZW5kYXItaXRlbS1jdXJyZW50IHtcbiAgYmFja2dyb3VuZDogJGNvbG9yLWhpZ2hsaWdodDtcbn1cblxuLmRpdG8tY2FsZW5kYXItd2Vla2RheXMgc3BhbiB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcbn1cblxuLmRpdG8tY2FsZW5kYXItaGVhZGVyLFxuLmRpdG8tY2FsZW5kYXItZm9vdGVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGhlaWdodDogJGlucHV0LWhlaWdodDtcbiAgbGluZS1oZWlnaHQ6ICRpbnB1dC1oZWlnaHQ7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWZvb3RlciB7XG4gIGJvcmRlci10b3A6ICRib3JkZXItc3R5bGU7XG59XG5cbi5kaXRvLWNhbGVuZGFyLWhlYWRlciB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBib3JkZXItYm90dG9tOiAkYm9yZGVyLXN0eWxlO1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gID4gc3BhbiB7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG4gIH1cblxuICBhIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcblxuICAgICY6aG92ZXIge1xuICAgICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldixcbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDUlO1xuICBtaW4td2lkdGg6IDJlbTtcbiAgbWF4LXdpZHRoOiAzZW07XG5cbiAgJjo6YWZ0ZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHJpZ2h0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4yNWVtO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtcHJldiB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC5JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwqsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXN0ZXAtbmV4dCB7XG4gICY6OmFmdGVyIHtcbiAgICBjb250ZW50OiAn4oC6JztcbiAgfVxuXG4gICYuZGl0by1jYWxlbmRhci1zdGVwLXllYXI6OmFmdGVyIHtcbiAgICBjb250ZW50OiAnwrsnO1xuICB9XG59XG5cbi5kaXRvLWNhbGVuZGFyLXNlbGVjdC1ub3cge1xuICAmOjphZnRlciB7XG4gICAgY29udGVudDogJ05vdyc7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJpbXBvcnQgeyBhc0FycmF5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEV2ZW50cyh0YXJnZXRzLCBldmVudHMpIHtcbiAgdGFyZ2V0cyA9XG4gICAgdGFyZ2V0cyBpbnN0YW5jZW9mIE5vZGVMaXN0XG4gICAgICA/IEFycmF5LmZyb20odGFyZ2V0cylcbiAgICAgIDogYXNBcnJheSh0YXJnZXRzKVxuXG4gIGZvciAoY29uc3QgW3R5cGUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBmYWxzZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgW3R5cGUsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGV2ZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lRXZlbnRzKC4uLmV2ZW50cykge1xuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgIGV2ZW50LnJlbW92ZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXkoZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICAzNzogJ2xlZnQnLFxuICAgIDM4OiAndXAnLFxuICAgIDM5OiAncmlnaHQnLFxuICAgIDQwOiAnZG93bicsXG4gICAgMTM6ICdlbnRlcidcbiAgfVtldmVudD8ua2V5Q29kZV1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleU5hdmlnYXRpb24oZXZlbnQpIHtcbiAgY29uc3Qga2V5ID0gZ2V0S2V5KGV2ZW50KVxuICByZXR1cm4ge1xuICAgIGhvcjogeyBsZWZ0OiAtMSwgcmlnaHQ6IDEgfVtrZXldIHx8IDAsXG4gICAgdmVyOiB7IHVwOiAtMSwgZG93bjogMSB9W2tleV0gfHwgMCxcbiAgICBlbnRlcjoga2V5ID09PSAnZW50ZXInXG4gIH1cbn1cbiIsImltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldChjb21wb25lbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gaXNTdHJpbmcoY29tcG9uZW50LnRhcmdldClcbiAgICA/IGNvbXBvbmVudC4kcmVmc1tjb21wb25lbnQudGFyZ2V0XVxuICAgIDogY29tcG9uZW50LnRhcmdldFxuICByZXR1cm4gdGFyZ2V0Py4kZWwgPz8gdGFyZ2V0XG59XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLXRyaWdnZXItY29udGFpbmVyXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1pZj1cImFsd2F5c1Nob3dcIlxuICAgIHJlZj1cInRyaWdnZXJcIlxuICAgIDpjbGFzcz1cInRyaWdnZXJDbGFzc1wiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2NsaWNrJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgICBAY2xpY2s9XCJvbkNsaWNrXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgLmRpdG8tdHJpZ2dlcihcbiAgICB2LWVsc2UtaWY9XCJ0cmlnZ2VyID09PSAnaG92ZXInXCJcbiAgICByZWY9XCJ0cmlnZ2VyXCJcbiAgICA6Y2xhc3M9XCJ0cmlnZ2VyQ2xhc3NcIlxuICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgQG1vdXNlbGVhdmU9XCJvbkhvdmVyKGZhbHNlKVwiXG4gIClcbiAgICBzbG90KG5hbWU9XCJ0cmlnZ2VyXCIpXG4gIC5kaXRvLXRyaWdnZXIoXG4gICAgdi1lbHNlLWlmPVwidHJpZ2dlciA9PT0gJ2ZvY3VzJyB8fCB0cmlnZ2VyID09PSAnYWx3YXlzJ1wiXG4gICAgcmVmPVwidHJpZ2dlclwiXG4gICAgOmNsYXNzPVwidHJpZ2dlckNsYXNzXCJcbiAgKVxuICAgIHNsb3QobmFtZT1cInRyaWdnZXJcIilcbiAgVHJhbnNpdGlvbig6bmFtZT1cImBkaXRvLSR7dHJhbnNpdGlvbn1gXCIpXG4gICAgLmRpdG8tcG9wdXAoXG4gICAgICB2LWlmPVwidHJpZ2dlciA9PT0gJ2hvdmVyJ1wiXG4gICAgICB2LXNob3c9XCJzaG93UG9wdXBcIlxuICAgICAgcmVmPVwicG9wdXBcIlxuICAgICAgOmNsYXNzPVwicG9wdXBDbGFzc1wiXG4gICAgICA6c3R5bGU9XCJwb3B1cFN0eWxlXCJcbiAgICAgIEBtb3VzZWVudGVyPVwib25Ib3Zlcih0cnVlKVwiXG4gICAgICBAbW91c2VsZWF2ZT1cIm9uSG92ZXIoZmFsc2UpXCJcbiAgICApXG4gICAgICBzbG90KFxuICAgICAgICB2LWlmPVwic2hvd1BvcHVwXCJcbiAgICAgICAgbmFtZT1cInBvcHVwXCJcbiAgICAgIClcbiAgICAuZGl0by1wb3B1cChcbiAgICAgIHYtZWxzZVxuICAgICAgdi1zaG93PVwic2hvd1BvcHVwXCJcbiAgICAgIHJlZj1cInBvcHVwXCJcbiAgICAgIDpjbGFzcz1cInBvcHVwQ2xhc3NcIlxuICAgICAgOnN0eWxlPVwicG9wdXBTdHlsZVwiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cInNob3dQb3B1cFwiXG4gICAgICAgIG5hbWU9XCJwb3B1cFwiXG4gICAgICApXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgaHlwaGVuYXRlIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCB7IGFkZEV2ZW50cywgY29tYmluZUV2ZW50cyB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlcidcblxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6c2hvdyddLFxuXG4gIHByb3BzOiB7XG4gICAgdHJpZ2dlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdjbGljaycgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20nIH0sXG4gICAgc2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgdGFyZ2V0OiB7IHR5cGU6IFtTdHJpbmcsIEhUTUxFbGVtZW50XSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIGN1c3RvbUNsYXNzOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHpJbmRleDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDAgfSxcbiAgICBrZWVwSW5WaWV3OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHRydWUgfSxcbiAgICBoaWRlV2hlbkNsaWNrT3V0c2lkZTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgYWx3YXlzU2hvdzogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGNvdmVyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaGlkZURlbGF5OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBwb3B1cFBsYWNlbWVudDogdGhpcy5wbGFjZW1lbnQsXG4gICAgICBmb2N1c0V2ZW50czogbnVsbCxcbiAgICAgIGNsb3NlRXZlbnRzOiBudWxsLFxuICAgICAgcG9wdXBFdmVudHM6IG51bGwsXG4gICAgICBibHVyVGltZXI6IG51bGwsXG4gICAgICBtb3VzZUxlYXZlVGltZXI6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICB0cmlnZ2VyQ2xhc3MoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnZGl0by10cmlnZ2VyLWRpc2FibGVkJzogdGhpcy5kaXNhYmxlZFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwb3B1cENsYXNzKCkge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgW2BkaXRvLXBvcHVwLSR7aHlwaGVuYXRlKHRoaXMucGxhY2VtZW50KX1gXTogdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY3VzdG9tQ2xhc3MpIHtcbiAgICAgICAgY2xhc3Nlc1t0aGlzLmN1c3RvbUNsYXNzXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIHBvcHVwU3R5bGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy56SW5kZXggPyBgei1pbmRleDogJHt0aGlzLnpJbmRleH1gIDogJydcbiAgICB9LFxuXG4gICAgdHJpZ2dlclRhcmdldCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcylcbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvdyB8fCB0aGlzLmFsd2F5c1Nob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHRoaXMub25TaG93UG9wdXAodG8pKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtb3VudGVkKCkge1xuICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnZm9jdXMnKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnRzID0gdGhpcy5hZGRGb2N1c0V2ZW50cyh0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oaWRlV2hlbkNsaWNrT3V0c2lkZSAmJiAhdGhpcy5hbHdheXNTaG93KSB7XG4gICAgICAvLyBVc2UgJ21vdXNldXAnIGluc3RlYWQgb2YgJ2NsaWNrJywgc2luY2UgY2xpY2sgYXBwZWFycyB0byBoYXBwZW4gYWZ0ZXJcbiAgICAgIC8vIHRoZSBET00gaW5zaWRlIG9mIHBvcHVwcyBjb3VsZCBjaGFuZ2UgaW4gYSB3YXkgc28gdGhhdCB0aGUgY2hlY2tcbiAgICAgIC8vIGBwb3B1cC5jb250YWlucyhldmVudC50YXJnZXQpYCB3b3VsZCBmYWlsOlxuICAgICAgdGhpcy5jbG9zZUV2ZW50cyA9IGFkZEV2ZW50cyh3aW5kb3csIHtcbiAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwICYmXG4gICAgICAgICAgICAhcG9wdXAuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRyaWdnZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMudHJpZ2dlclRhcmdldD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFsd2F5c1Nob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgIH1cbiAgfSxcblxuICBjcmVhdGVkKCkge1xuICAgIHRoaXMuc2hvd1BvcHVwID0gdGhpcy5zaG93XG4gIH0sXG5cbiAgdW5tb3VudGVkKCkge1xuICAgIHRoaXMuZm9jdXNFdmVudHM/LnJlbW92ZSgpXG4gICAgdGhpcy5jbG9zZUV2ZW50cz8ucmVtb3ZlKClcbiAgICB0aGlzLnBvcHVwRXZlbnRzPy5yZW1vdmUoKVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICAgIGNvbnN0IHsgdHJpZ2dlciwgcG9wdXAgfSA9IHRoaXMuJHJlZnNcbiAgICAgIGlmICh0aGlzLnNob3cgJiYgcG9wdXAub2Zmc2V0V2lkdGggPT09IDApIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVBvc2l0aW9uKCksIDApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnRyaWdnZXJUYXJnZXQgPz8gdHJpZ2dlclxuICAgICAgLy8gQWN0dWFsbHkgcmVzaXplIHRoZSBwb3B1cCdzIGZpcnN0IGNoaWxkLCBzbyB0aGV5IGNhbiBzZXQgc2l6ZSBsaW1pdHMuXG4gICAgICBjb25zdCBlbCA9IHRoaXMudGFyZ2V0ID09PSAncG9wdXAnID8gdHJpZ2dlciA6IHBvcHVwLmZpcnN0RWxlbWVudENoaWxkXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuc3R5bGUud2lkdGggPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCkud2lkdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm91bmRzID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCB0cmlnZ2VyTGVmdCA9IGJvdW5kcy5sZWZ0ICsgd2luZG93LnNjcm9sbFhcbiAgICAgIGNvbnN0IHRyaWdnZXJUb3AgPSBib3VuZHMudG9wICsgd2luZG93LnNjcm9sbFlcbiAgICAgIGNvbnN0IHRyaWdnZXJXaWR0aCA9IGJvdW5kcy53aWR0aFxuICAgICAgY29uc3QgdHJpZ2dlckhlaWdodCA9IGJvdW5kcy5oZWlnaHRcbiAgICAgIGNvbnN0IHBvcHVwV2lkdGggPSBwb3B1cC5vZmZzZXRXaWR0aFxuICAgICAgY29uc3QgcG9wdXBIZWlnaHQgPSBwb3B1cC5vZmZzZXRIZWlnaHRcblxuICAgICAgbGV0IFtwYXJ0MSwgcGFydDJdID0gdGhpcy5wb3B1cFBsYWNlbWVudC5zcGxpdCgnLScpIHx8IFtdXG4gICAgICBpZiAodGhpcy5rZWVwSW5WaWV3KSB7XG4gICAgICAgIGNvbnN0IHdpbldpZHRoID0gd2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgY29uc3Qgd2luSGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlclRvcCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdib3R0b20nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIC0gdHJpZ2dlckhlaWdodCA8IHBvcHVwSGVpZ2h0KSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICd0b3AnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnbGVmdCcpIHtcbiAgICAgICAgICBpZiAodHJpZ2dlckxlZnQgPCBwb3B1cFdpZHRoKSB7XG4gICAgICAgICAgICBwYXJ0MSA9ICdyaWdodCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDEgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICBpZiAod2luV2lkdGggLSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJXaWR0aCA8IHBvcHVwV2lkdGgpIHtcbiAgICAgICAgICAgIHBhcnQxID0gJ2xlZnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnQyID09PSAndG9wJykge1xuICAgICAgICAgIGlmICh3aW5IZWlnaHQgLSB0cmlnZ2VyVG9wIDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ2JvdHRvbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdib3R0b20nKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJUb3AgKyB0cmlnZ2VySGVpZ2h0IDwgcG9wdXBIZWlnaHQpIHtcbiAgICAgICAgICAgIHBhcnQyID0gJ3RvcCdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFydDIgPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmICh3aW5XaWR0aCAtIHRyaWdnZXJMZWZ0IDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAncmlnaHQnXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQyID09PSAncmlnaHQnKSB7XG4gICAgICAgICAgaWYgKHRyaWdnZXJMZWZ0ICsgdHJpZ2dlcldpZHRoIDwgcG9wdXBXaWR0aCkge1xuICAgICAgICAgICAgcGFydDIgPSAnbGVmdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGxlZnQgPSAwXG4gICAgICBsZXQgdG9wID0gMFxuICAgICAgc3dpdGNoIChwYXJ0MSkge1xuICAgICAgICBjYXNlICd0b3AnOlxuICAgICAgICAgIHRvcCAtPSBwb3B1cEhlaWdodFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICAgIGxlZnQgLT0gcG9wdXBXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0ICs9IHRyaWdnZXJXaWR0aFxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgdG9wICs9IHRyaWdnZXJIZWlnaHRcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgc3dpdGNoIChwYXJ0Mikge1xuICAgICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgICAgbGVmdCAtPSBwb3B1cFdpZHRoIC0gdHJpZ2dlcldpZHRoXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICB0b3AgLT0gcG9wdXBIZWlnaHQgLSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvdmVyKSB7XG4gICAgICAgIGlmIChwYXJ0MSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgICB0b3AgKz0gdHJpZ2dlckhlaWdodFxuICAgICAgICB9IGVsc2UgaWYgKHBhcnQxID09PSAnYm90dG9tJykge1xuICAgICAgICAgIHRvcCAtPSB0cmlnZ2VySGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0YXJnZXQgIT09IHRyaWdnZXIpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlckJvdW5kcyA9IHRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAgICAgbGVmdCArPSB0cmlnZ2VyTGVmdCAtIHRyaWdnZXJCb3VuZHMubGVmdFxuICAgICAgICB0b3AgKz0gdHJpZ2dlclRvcCAtIHRyaWdnZXJCb3VuZHMudG9wXG4gICAgICB9XG4gICAgICBwb3B1cC5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGBcbiAgICAgIHBvcHVwLnN0eWxlLnRvcCA9IGAke3RvcH1weGBcbiAgICB9LFxuXG4gICAgYWRkRm9jdXNFdmVudHMocGFyZW50KSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCB0ZXh0YXJlYScpXG4gICAgICBsZXQgaW5wdXRcblxuICAgICAgcmV0dXJuIGNvbWJpbmVFdmVudHMoXG4gICAgICAgIGFkZEV2ZW50cyh0YXJnZXRzLCB7XG4gICAgICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYmx1clRpbWVyKVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2UgdGltZW91dCB0byBhbGxvdyBjbGlja2VkIGlucHV0cyB0byBncmFiIGZvY3VzXG4gICAgICAgICAgICB0aGlzLmJsdXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuJHJlZnMucG9wdXAubWF0Y2hlcygnOmZvY3VzLXdpdGhpbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSksXG5cbiAgICAgICAgYWRkRXZlbnRzKHBhcmVudCwge1xuICAgICAgICAgIG1vdXNlZG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKCFldmVudC50YXJnZXQubWF0Y2hlcygnaW5wdXQsIHRleHRhcmVhLCBidXR0b24nKSkge1xuICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCcuZGl0by1idXR0b24tY2xlYXInKSkge1xuICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy50cmlnZ2VyVGFyZ2V0ID8/IHRoaXMuJHJlZnMudHJpZ2dlclxuICAgICAgICAgICAgICAvLyBNYXJrIHRyaWdnZXIgaW5wdXQgYXMgcmVhZG9ubHkgc28gaXQgY2FuJ3QgbG9vc2UgZm9jdXMgd2hpbGVcbiAgICAgICAgICAgICAgLy8gdXNlciBkb2VzIG90aGVyIG1vdXNlLWFjdGl2aXRpZXMgaW4gcG9wdXAuXG4gICAgICAgICAgICAgIGlucHV0ID0gdHJpZ2dlci5xdWVyeVNlbGVjdG9yKCdpbnB1dCwgdGV4dGFyZWEnKVxuICAgICAgICAgICAgICBpZiAoaW5wdXQgJiYgIWlucHV0Lmhhc0F0dHJpYnV0ZSgncmVhZG9ubHknKSkge1xuICAgICAgICAgICAgICAgIGlucHV0LnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAndHJ1ZScpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBudWxsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgbW91c2V1cDogZXZlbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0aW1lIGZvciBvdGhlciBldmVudHMgdG8gdXBkYXRlIGlucHV0IGJlZm9yZSBpdFxuICAgICAgICAgICAgICAvLyBiZWNvbWVzIGVkaXRhYmxlIGFuZCBzdGlsbCBmb2N1c2VkIGFnYWluLlxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpbnB1dC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5JylcbiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50LnRhcmdldC5tYXRjaGVzKCdpbnB1dCwgdGV4dGFyZWEsIGJ1dHRvbicpKSB7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5mb2N1cygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlucHV0ID0gbnVsbFxuICAgICAgICAgICAgICB9LCAwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgb25TaG93UG9wdXAoc2hvdykge1xuICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlciA9PT0gJ2ZvY3VzJykge1xuICAgICAgICAgIHRoaXMucG9wdXBFdmVudHMgPSB0aGlzLmFkZEZvY3VzRXZlbnRzKHRoaXMuJHJlZnMucG9wdXApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvcHVwRXZlbnRzPy5yZW1vdmUoKVxuICAgICAgICB0aGlzLnBvcHVwRXZlbnRzID0gbnVsbFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkNsaWNrKCkge1xuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbkhvdmVyKGVudGVyKSB7XG4gICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VMZWF2ZVRpbWVyKVxuICAgICAgICBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5oaWRlRGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMubW91c2VMZWF2ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gZmFsc2VcbiAgICAgICAgICAgIH0sIHRoaXMuaGlkZURlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuQGltcG9ydCAnLi4vc3R5bGVzL3RyYW5zaXRpb25zL2luZGV4LnNjc3MnO1xuXG4uZGl0by10cmlnZ2VyLWNvbnRhaW5lciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmRpdG8tdHJpZ2dlci1kaXNhYmxlZCB7XG4gIGNvbG9yOiAkY29sb3ItZGlzYWJsZWQ7XG4gIGJvcmRlci1jb2xvcjogJGJvcmRlci1jb2xvcjtcbiAgY3Vyc29yOiBkZWZhdWx0O1xuXG4gICoge1xuICAgIGN1cnNvcjogZGVmYXVsdCAhaW1wb3J0YW50O1xuICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgJjpmb2N1cyB7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4uZGl0by1wb3B1cCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAkei1pbmRleC1wb3B1cDtcbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8taW5wdXQoOmNsYXNzPVwiY2xhc3Nlc1wiKVxuICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgaW5wdXQoXG4gICAgOmlkPVwiaWRcIlxuICAgIHJlZj1cImlucHV0XCJcbiAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICA6dHlwZT1cInR5cGVcIlxuICAgIDpuYW1lPVwibmFtZVwiXG4gICAgOnRpdGxlPVwidGl0bGVcIlxuICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICA6cmVhZG9ubHk9XCJyZWFkb25seVwiXG4gICAgOmF1dG9mb2N1cz1cImF1dG9mb2N1c1wiXG4gICAgOnBsYWNlaG9sZGVyPVwicGxhY2Vob2xkZXJcIlxuICAgIDphdXRvY29tcGxldGU9XCJhdXRvY29tcGxldGVcIlxuICAgIDphcmlhLWxhYmVsPVwidGl0bGVcIlxuICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICApXG4gIHNsb3QobmFtZT1cImFmdGVyXCIpXG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBlbWl0czogWyd1cGRhdGU6bW9kZWxWYWx1ZSddLFxuICBpbmhlcml0QXR0cnM6IGZhbHNlLFxuXG4gIHByb3BzOiB7XG4gICAgbW9kZWxWYWx1ZTogeyB0eXBlOiBbU3RyaW5nLCBOdW1iZXJdLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdHlwZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICd0ZXh0JyB9LFxuICAgIGlkOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgdGl0bGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGF1dG9mb2N1czogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGF1dG9jb21wbGV0ZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdvZmYnIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VmFsdWU6IHRoaXMubW9kZWxWYWx1ZSxcbiAgICAgIGhvdmVyaW5nOiBmYWxzZSxcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgY2xhc3NlcygpIHtcbiAgICAgIHJldHVybiB0aGlzLiRhdHRycy5jbGFzc1xuICAgIH0sXG5cbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyBjbGFzczogXywgLi4uYXR0cmlidXRlcyB9ID0gdGhpcy4kYXR0cnNcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXRcbiAgICB9LFxuXG4gICAgc2l6ZSgpIHtcbiAgICAgIC8vIERldGVybWluZSBzaXplIGJhc2VkIG9uIG1pbiAmIG1heCBzZXR0aW5ncywgaWYgdGhleSdyZSBwcm92aWRlZC5cbiAgICAgIGNvbnN0IHsgc2l6ZSwgbWluLCBtYXggfSA9IHRoaXMuJGF0dHJzXG4gICAgICBjb25zdCBnZXRMZW5ndGggPSB2YWx1ZSA9PiAodmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAubGVuZ3RoIDogMClcbiAgICAgIHJldHVybiBzaXplIHx8IGdldExlbmd0aChtaW4pIHx8IGdldExlbmd0aChtYXgpIHx8IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byAhPT0gZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZShjdXJyZW50VmFsdWUpIHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHRoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIGN1cnJlbnRWYWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8taW5wdXQge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgQGV4dGVuZCAlaW5wdXQ7XG5cbiAgaW5wdXQge1xuICAgIC8vIEluaGVyaXQgYWxsIHN0eWxpbmcgZnJvbSAuZGl0by1pbnB1dFxuICAgIGFsbDogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbmkuZGl0by1pY29uKFxuICA6Y2xhc3M9YHtcbiAgICBbJ2RpdG8taWNvbi0tJyArIG5hbWVdOiB0cnVlLFxuICAgICdkaXRvLWljb24tLWRpc2FibGVkJzogZGlzYWJsZWRcbiAgfWBcbilcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5leHBvcnQgZGVmYXVsdCB7XG4gIHByb3BzOiB7XG4gICAgbmFtZToge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9LFxuICAgIGRpc2FibGVkOiB7XG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgZGVmYXVsdDogZmFsc2VcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi8vIGB5YXJuIGJ1aWxkOmljb25zYCBjb252ZXJ0cyB0aGUgaWNvbiBTVkcgZmlsZXMgdG8gc2lsZW50IGNsYXNzZXMgaW5zaWRlXG4vLyBgc3JjL3N0eWxlcy9taXhpbnMvX2ljb25zLnNjc3NgLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gYWxsIG90aGVyIHNhc3Ncbi8vIGNvZGUgdGhyb3VnaCBgX2ltcG9ydHNgLlxuLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byB1c2UgdGhlbSBhcyBub3JtYWwgQ1NTIGNsYXNzZXMsIGNvbnZlcnQgdGhlbSBoZXJlOlxuQGVhY2ggJG5hbWUgaW4gJGljb25zIHtcbiAgLmRpdG8taWNvbi0tI3skbmFtZX0ge1xuICAgICY6OmFmdGVyIHtcbiAgICAgIEBleHRlbmQgJWljb24tI3skbmFtZX07XG5cbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIH1cbn1cblxuLmRpdG8taWNvbiB7XG4gIEBhdC1yb290IC5kaXRvLWlucHV0ICYge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBpbnNldDogJGJvcmRlci13aWR0aDtcbiAgICBsZWZ0OiB1bnNldDtcbiAgICB3aWR0aDogMmVtO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBib3JkZXItcmFkaXVzOiAkYm9yZGVyLXJhZGl1cztcbiAgICBjb2xvcjogJGNvbG9yLWdyZXk7XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuXG4gICAgJi0tZGlzYWJsZWQge1xuICAgICAgY29sb3I6ICRjb2xvci1saWdodDtcbiAgICB9XG4gIH1cblxuICBAYXQtcm9vdCAuZGl0by1pbnB1dDpmb2N1cy13aXRoaW4gJiB7XG4gICAgY29sb3I6ICRjb2xvci1hY3RpdmU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCJleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGlucHV0LCB7IHN0YXJ0LCBlbmQgfSkge1xuICBpZiAoaW5wdXQ/LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgaW5wdXQuZm9jdXMoKVxuICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBlbmQpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdGlvbihpbnB1dCkge1xuICByZXR1cm4gaW5wdXQgJiYgJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dFxuICAgID8geyBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kIH1cbiAgICA6IG51bGxcbn1cbiIsIjwhLS0gRGVyaXZlZCBmcm9tIEFUVUksIGFuZCBmdXJ0aGVyIGV4dGVuZGVkOiBodHRwczovL2FsaXFpbi5naXRodWIuaW8vYXR1aS8gLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuVHJpZ2dlci5kaXRvLWRhdGUtcGlja2VyKFxuICByZWY9XCJ0cmlnZ2VyXCJcbiAgdi1tb2RlbDpzaG93PVwic2hvd1BvcHVwXCJcbiAgdHJpZ2dlcj1cImZvY3VzXCJcbiAgdi1iaW5kPVwieyB0cmFuc2l0aW9uLCBwbGFjZW1lbnQsIGRpc2FibGVkLCB0YXJnZXQgfVwiXG4pXG4gIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgIHNsb3QoXG4gICAgICB2LWlmPVwiJHNsb3RzLnRyaWdnZXJcIlxuICAgICAgbmFtZT1cInRyaWdnZXJcIlxuICAgIClcbiAgICBJbnB1dEZpZWxkLmRpdG8tZGF0ZS1waWNrZXItaW5wdXQoXG4gICAgICB2LWVsc2VcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VGV4dFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICA6Y2xhc3M9XCJ7ICdkaXRvLWZvY3VzJzogZm9jdXNlZCB9XCJcbiAgICAgIHYtYmluZD1cInsgcGxhY2Vob2xkZXIsIGRpc2FibGVkLCAuLi4kYXR0cnMgfVwiXG4gICAgICBAZm9jdXM9XCJvbkZvY3VzKHRydWUpXCJcbiAgICAgIEBibHVyPVwib25Gb2N1cyhmYWxzZSlcIlxuICAgICAgQGtleWRvd249XCJvbktleURvd25cIlxuICAgICAgQG1vdXNlZG93bi5zdG9wPVwib25Nb3VzZURvd24oZmFsc2UpXCJcbiAgICApXG4gICAgICB0ZW1wbGF0ZSgjYmVmb3JlKVxuICAgICAgICBzbG90KG5hbWU9XCJiZWZvcmVcIilcbiAgICAgIHRlbXBsYXRlKCNhZnRlcilcbiAgICAgICAgSWNvbihcbiAgICAgICAgICBuYW1lPVwiY2FsZW5kYXJcIlxuICAgICAgICAgIDpkaXNhYmxlZD1cImRpc2FibGVkXCJcbiAgICAgICAgICBAbW91c2Vkb3duLnByZXZlbnQ9XCJvbk1vdXNlRG93bih0cnVlKVwiXG4gICAgICAgIClcbiAgICAgICAgc2xvdChuYW1lPVwiYWZ0ZXJcIilcbiAgdGVtcGxhdGUoI3BvcHVwKVxuICAgIENhbGVuZGFyLmRpdG8tZGF0ZS1waWNrZXItcG9wdXAoXG4gICAgICByZWY9XCJjYWxlbmRhclwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFZhbHVlXCJcbiAgICAgIHYtYmluZD1cInsgbG9jYWxlLCBkaXNhYmxlZERhdGUgfVwiXG4gICAgICBAc2VsZWN0PVwic2hvd1BvcHVwID0gZmFsc2VcIlxuICAgIClcbjwvdGVtcGxhdGU+XG5cbjxzY3JpcHQ+XG5pbXBvcnQgeyBmb3JtYXQsIGRlZmF1bHRGb3JtYXRzIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBUcmlnZ2VyIGZyb20gJy4vVHJpZ2dlci52dWUnXG5pbXBvcnQgQ2FsZW5kYXIgZnJvbSAnLi9DYWxlbmRhci52dWUnXG5pbXBvcnQgSW5wdXRGaWVsZCBmcm9tICcuL0lucHV0RmllbGQudnVlJ1xuaW1wb3J0IEljb24gZnJvbSAnLi9JY29uLnZ1ZSdcbmltcG9ydCB7IHBhcnNlRGF0ZSwgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlci5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIENhbGVuZGFyLCBJbnB1dEZpZWxkLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ3VwZGF0ZTpzaG93JywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlbWVudDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdib3R0b20tbGVmdCcgfSxcbiAgICBwbGFjZWhvbGRlcjogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBzaG93OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgZGlzYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICB0YXJnZXQ6IHsgdHlwZTogW1N0cmluZywgSFRNTEVsZW1lbnRdLCBkZWZhdWx0OiAndHJpZ2dlcicgfSxcbiAgICBsb2NhbGU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnZW4tVVMnIH0sXG4gICAgZm9ybWF0OiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiAoKSA9PiAoe1xuICAgICAgICBkYXRlOiBkZWZhdWx0Rm9ybWF0cy5kYXRlLFxuICAgICAgICB0aW1lOiBmYWxzZVxuICAgICAgfSlcbiAgICB9LFxuICAgIGRpc2FibGVkRGF0ZTogeyB0eXBlOiBGdW5jdGlvbiwgZGVmYXVsdDogKCkgPT4gZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd1BvcHVwOiB0aGlzLnNob3csXG4gICAgICBpbnB1dEZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuICB9LFxuXG4gIGNvbXB1dGVkOiB7XG4gICAgZm9jdXNlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0Rm9jdXNlZCB8fCB0aGlzLnNob3dQb3B1cFxuICAgIH0sXG5cbiAgICBpbnB1dCgpIHtcbiAgICAgIHJldHVybiBnZXRUYXJnZXQodGhpcyk/LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JylcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvY2FsZTogdGhpcy5sb2NhbGUsXG4gICAgICAgIC4uLnRoaXMuZm9ybWF0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQodGhpcy5jdXJyZW50VmFsdWUsIHRoaXMuZm9ybWF0T3B0aW9ucykgfHwgJydcbiAgICAgIH0sXG5cbiAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICBjb25zdCBkYXRlID0gcGFyc2VEYXRlKHZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIGlmIChkYXRlKSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBkYXRlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2F0Y2g6IHtcbiAgICBtb2RlbFZhbHVlKHRvLCBmcm9tKSB7XG4gICAgICBpZiAoK3RvICE9PSArZnJvbSkge1xuICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IHRvXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgaWYgKCt2YWx1ZSAhPT0gK3RoaXMubW9kZWxWYWx1ZSkge1xuICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc2hvdyhzaG93KSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9IHNob3dcbiAgICB9LFxuXG4gICAgc2hvd1BvcHVwKHRvLCBmcm9tKSB7XG4gICAgICBpZiAodG8gXiBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpzaG93JywgdG8pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gZ2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQpPy5zdGFydFxuICAgICAgICBjb25zdCBnZXREYXRlUGFydCA9IHBvc2l0aW9uID0+XG4gICAgICAgICAgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uKHRoaXMuY3VycmVudFRleHQsIHBvc2l0aW9uLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG5cbiAgICAgICAgaWYgKHN0ZXAgJiYgIXRoaXMuc2hvd1BvcHVwKSB7XG4gICAgICAgICAgdGhpcy5zaG93UG9wdXAgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBjYWxlbmRhciB9ID0gdGhpcy4kcmVmc1xuICAgICAgICAgIGlmIChjYWxlbmRhcikge1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lOiBtb2RlLCBzdGFydCB9ID0gZ2V0RGF0ZVBhcnQocG9zaXRpb24pIHx8IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG1vZGUgJiZcbiAgICAgICAgICAgICAgY2FsZW5kYXIubmF2aWdhdGUoeyBzdGVwLCBlbnRlciwgbW9kZSwgdXBkYXRlOiB0cnVlIH0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gc2V0U2VsZWN0aW9uKHRoaXMuaW5wdXQsIGdldERhdGVQYXJ0KHN0YXJ0KSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uTW91c2VEb3duKHRvZ2dsZSkge1xuICAgICAgdGhpcy5zaG93UG9wdXAgPSAhdGhpcy5kaXNhYmxlZCAmJiAoIXRvZ2dsZSB8fCAhdGhpcy5zaG93UG9wdXApXG4gICAgICBpZiAodGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgdGhpcy5mb2N1cygpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzKCkge1xuICAgICAgdGhpcy5pbnB1dC5mb2N1cygpXG4gICAgfSxcblxuICAgIGJsdXIoKSB7XG4gICAgICB0aGlzLmlucHV0LmJsdXIoKVxuICAgIH1cbiAgfVxufVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBsYW5nPVwic2Nzc1wiPlxuQGltcG9ydCAnLi4vc3R5bGVzL19pbXBvcnRzJztcblxuLmRpdG8tZGF0ZS1waWNrZXIge1xuICAuZGl0by1pbnB1dCB7XG4gICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDhlbTtcbiAgfVxufVxuXG4uZGl0by1kYXRlLXBpY2tlci1wb3B1cCB7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cbjwvc3R5bGU+XG4iLCI8IS0tIERlcml2ZWQgZnJvbSBBVFVJLCBhbmQgZnVydGhlciBleHRlbmRlZDogaHR0cHM6Ly9hbGlxaW4uZ2l0aHViLmlvL2F0dWkvIC0tPlxuPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cblRyaWdnZXIuZGl0by10aW1lLXBpY2tlcihcbiAgcmVmPVwidHJpZ2dlclwiXG4gIHYtbW9kZWw6c2hvdz1cInNob3dQb3B1cFwiXG4gIHRyaWdnZXI9XCJmb2N1c1wiXG4gIHYtYmluZD1cInsgdHJhbnNpdGlvbiwgcGxhY2VtZW50LCBkaXNhYmxlZCwgdGFyZ2V0IH1cIlxuKVxuICB0ZW1wbGF0ZSgjdHJpZ2dlcilcbiAgICBzbG90KFxuICAgICAgdi1pZj1cIiRzbG90cy50cmlnZ2VyXCJcbiAgICAgIG5hbWU9XCJ0cmlnZ2VyXCJcbiAgICApXG4gICAgSW5wdXRGaWVsZC5kaXRvLXRpbWUtcGlja2VyLWlucHV0KFxuICAgICAgdi1lbHNlXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNsb2NrXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gIHRlbXBsYXRlKCNwb3B1cClcbiAgICAuZGl0by10aW1lLXBpY2tlci1wb3B1cFxuICAgICAgLmRpdG8tdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgdWwuZGl0by10aW1lLXBpY2tlci1ob3VyKHJlZj1cImhvdXJcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gMjRcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkSG91cihpbmRleCAtIDEpXCJcbiAgICAgICAgICAgICAgOmNsYXNzPVwieyBzZWxlY3RlZDogaG91ciA9PT0gaW5kZXggLSAxIH1cIlxuICAgICAgICAgICAgICBAY2xpY2s9XCJob3VyID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLW1pbnV0ZShyZWY9XCJtaW51dGVcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkTWludXRlKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBtaW51dGUgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwibWludXRlID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG4gICAgICAuZGl0by10aW1lLXBpY2tlci1wYW5lbFxuICAgICAgICB1bC5kaXRvLXRpbWUtcGlja2VyLXNlY29uZChyZWY9XCJzZWNvbmRcIilcbiAgICAgICAgICB0ZW1wbGF0ZShcbiAgICAgICAgICAgIHYtZm9yPVwiaW5kZXggaW4gNjBcIlxuICAgICAgICAgIClcbiAgICAgICAgICAgIGxpKFxuICAgICAgICAgICAgICB2LWlmPVwiIWRpc2FibGVkU2Vjb25kKGluZGV4IC0gMSlcIlxuICAgICAgICAgICAgICA6Y2xhc3M9XCJ7IHNlbGVjdGVkOiBzZWNvbmQgPT09IGluZGV4IC0gMSB9XCJcbiAgICAgICAgICAgICAgQGNsaWNrPVwic2Vjb25kID0gaW5kZXggLSAxXCJcbiAgICAgICAgICAgICkge3sgbGVmdFBhZChpbmRleCAtIDEpIH19XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cyB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5pbXBvcnQgVHJpZ2dlciBmcm9tICcuL1RyaWdnZXIudnVlJ1xuaW1wb3J0IElucHV0RmllbGQgZnJvbSAnLi9JbnB1dEZpZWxkLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBhbHRlckRhdGUsIHBhcnNlRGF0ZSwgZ2V0RGF0ZVBhcnRBdFBvc2l0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZGF0ZS5qcydcbmltcG9ydCB7IGdldFNlbGVjdGlvbiwgc2V0U2VsZWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2VsZWN0aW9uLmpzJ1xuaW1wb3J0IHsgZ2V0S2V5TmF2aWdhdGlvbiB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LmpzJ1xuaW1wb3J0IHsgZ2V0VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvdHJpZ2dlci5qcydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjb21wb25lbnRzOiB7IFRyaWdnZXIsIElucHV0RmllbGQsIEljb24gfSxcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAndXBkYXRlOnNob3cnLCAnY2hhbmdlJywgJ2ZvY3VzJywgJ2JsdXInXSxcbiAgaW5oZXJpdEF0dHJzOiBmYWxzZSxcblxuICBwcm9wczoge1xuICAgIG1vZGVsVmFsdWU6IHsgdHlwZTogRGF0ZSwgZGVmYXVsdDogbnVsbCB9LFxuICAgIHRyYW5zaXRpb246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnc2xpZGUnIH0sXG4gICAgcGxhY2VtZW50OiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2JvdHRvbS1sZWZ0JyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIHNob3c6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHRhcmdldDogeyB0eXBlOiBbU3RyaW5nLCBIVE1MRWxlbWVudF0sIGRlZmF1bHQ6ICd0cmlnZ2VyJyB9LFxuICAgIGxvY2FsZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdlbi1VUycgfSxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7XG4gICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgIGRhdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGlzYWJsZWRIb3VyOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkTWludXRlOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9LFxuICAgIGRpc2FibGVkU2Vjb25kOiB7IHR5cGU6IEZ1bmN0aW9uLCBkZWZhdWx0OiAoKSA9PiBmYWxzZSB9XG4gIH0sXG5cbiAgZGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLm1vZGVsVmFsdWUsXG4gICAgICBzaG93UG9wdXA6IHRoaXMuc2hvdyxcbiAgICAgIGlucHV0Rm9jdXNlZDogZmFsc2UsXG4gICAgICBpZ25vcmVOZXh0Q2hhbmdlOiBmYWxzZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93UG9wdXBcbiAgICB9LFxuXG4gICAgaW5wdXQoKSB7XG4gICAgICByZXR1cm4gZ2V0VGFyZ2V0KHRoaXMpPy5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpXG4gICAgfSxcblxuICAgIGZvcm1hdE9wdGlvbnMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAuLi50aGlzLmZvcm1hdFxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnREYXRlKCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgfHxcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IERhdGUoKSBvYmplY3Qgd2l0aCB0aGUgdGltZSBzZXQgdG8gMCwgdG8gYmUgdXNlZCB3aGVuXG4gICAgICAgIC8vIGZpcnN0IHNldHRpbmcgYW55IG9mIHRoZSB0aW1lcywgZm9yIG1lYW5pbmdmdWwgZGF0ZXMgaW4gY2FzZSB0aGVcbiAgICAgICAgLy8gb2JqZWN0IGlzIHNoYXJlZCB3aXRoIGEgRGF0ZVBpY2tlciwgZS5nLiB0aHJvdWdoIERhdGVUaW1lUGlja2VyLlxuICAgICAgICBhbHRlckRhdGUobmV3IERhdGUoKSwgeyBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbWlsbGlzZWNvbmQ6IDAgfSlcbiAgICAgIClcbiAgICB9LFxuXG4gICAgaG91cjoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRIb3VycygpXG4gICAgICB9LFxuXG4gICAgICBzZXQoaG91cikge1xuICAgICAgICB0aGlzLnNldFRpbWUoeyBob3VyIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIG1pbnV0ZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRNaW51dGVzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChtaW51dGUpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgbWludXRlIH0pXG4gICAgICB9XG4gICAgfSxcblxuICAgIHNlY29uZDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50RGF0ZS5nZXRTZWNvbmRzKClcbiAgICAgIH0sXG5cbiAgICAgIHNldChzZWNvbmQpIHtcbiAgICAgICAgdGhpcy5zZXRUaW1lKHsgc2Vjb25kIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgICB0aGlzLnNjcm9sbEFsbCh0cnVlKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICAgIHRoaXMuc2Nyb2xsQWxsKHRydWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGN1cnJlbnRUZXh0KCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmZvY3VzZWQgJiZcbiAgICAgICAgIXRoaXMuaWdub3JlTmV4dENoYW5nZSAmJlxuICAgICAgICBzZWxlY3Rpb24uc3RhcnQgPT09IHNlbGVjdGlvbi5lbmRcbiAgICAgICkge1xuICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbikpXG4gICAgICB9XG4gICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSBmYWxzZVxuICAgIH0sXG5cbiAgICBzaG93KHNob3cpIHtcbiAgICAgIHRoaXMuc2hvd1BvcHVwID0gc2hvd1xuICAgIH0sXG5cbiAgICBzaG93UG9wdXAodG8sIGZyb20pIHtcbiAgICAgIGlmICh0bykge1xuICAgICAgICB0aGlzLnNjcm9sbEFsbChmYWxzZSlcbiAgICAgIH1cbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOnNob3cnLCB0bylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXNlZCh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvIF4gZnJvbSkge1xuICAgICAgICB0aGlzLiRlbWl0KHRvID8gJ2ZvY3VzJyA6ICdibHVyJylcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWV0aG9kczoge1xuICAgIGxlZnRQYWQodmFsdWUpIHtcbiAgICAgIHJldHVybiAoJzAnICsgdmFsdWUpLnNsaWNlKC0yKVxuICAgIH0sXG5cbiAgICBzZXRUaW1lKG92ZXJyaWRlcykge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBhbHRlckRhdGUodGhpcy5jdXJyZW50RGF0ZSwge1xuICAgICAgICAuLi5vdmVycmlkZXMsXG4gICAgICAgIG1pbGxpc2Vjb25kOiAwXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBzY3JvbGxBbGwoc21vb3RoKSB7XG4gICAgICBjb25zdCBzY3JvbGwgPSAocmVmLCB2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRyZWZzW3JlZl1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAoXG4gICAgICAgICAgICB0YXJnZXQuc2Nyb2xsSGVpZ2h0IC9cbiAgICAgICAgICAgIC8vIEZpcnN0IGFuZCBsYXN0IG9uZSBhZGQgMyB0aW1lcyB0aGUgbWFyZ2luLlxuICAgICAgICAgICAgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCArIDYpXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnN0IHRvcCA9IE1hdGgucm91bmQodmFsdWUgKiBsaW5lSGVpZ2h0KVxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0LnNjcm9sbFRvcCAtIHRvcClcbiAgICAgICAgICB0YXJnZXQuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYmVoYXZpb3I6IHNtb290aCAmJiBkaXN0YW5jZSA8IDEwMCA/ICdzbW9vdGgnIDogJ2F1dG8nXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBzY3JvbGwoJ2hvdXInLCB0aGlzLmhvdXIpXG4gICAgICAgIHNjcm9sbCgnbWludXRlJywgdGhpcy5taW51dGUpXG4gICAgICAgIHNjcm9sbCgnc2Vjb25kJywgdGhpcy5zZWNvbmQpXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICB0aGlzLnNob3dQb3B1cCA9IGZvY3VzXG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGlucHV0KVxuICAgICAgY29uc3QgeyB2ZXI6IHN0ZXAsIGVudGVyIH0gPSBnZXRLZXlOYXZpZ2F0aW9uKGV2ZW50KVxuICAgICAgaWYgKHN0ZXAgfHwgZW50ZXIpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gICAgICAgIGNvbnN0IGdldERhdGVQYXJ0ID0gcG9zaXRpb24gPT5cbiAgICAgICAgICBnZXREYXRlUGFydEF0UG9zaXRpb24odGhpcy5jdXJyZW50VGV4dCwgcG9zaXRpb24sIHRoaXMuZm9ybWF0T3B0aW9ucylcblxuICAgICAgICBpZiAoc3RlcCkge1xuICAgICAgICAgIGlmICghdGhpcy5zaG93UG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd1BvcHVwID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHN0YXJ0IH0gPSBnZXREYXRlUGFydChzZWxlY3Rpb24uc3RhcnQpIHx8IHt9XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbbmFtZV0gKyBzdGVwXG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy4kcmVmc1tuYW1lXS5jaGlsZEVsZW1lbnRDb3VudFxuICAgICAgICAgICAgICB0aGlzW25hbWVdID1cbiAgICAgICAgICAgICAgICB2YWx1ZSA8IDBcbiAgICAgICAgICAgICAgICAgID8gdmFsdWUgKyBjb3VudFxuICAgICAgICAgICAgICAgICAgOiB2YWx1ZSA+PSBjb3VudFxuICAgICAgICAgICAgICAgICAgICA/IHZhbHVlIC0gY291bnRcbiAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLmlnbm9yZU5leHRDaGFuZ2UgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbihpbnB1dCwgZ2V0RGF0ZVBhcnQoc3RhcnQpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZW50ZXIpIHtcbiAgICAgICAgICB0aGlzLnNob3dQb3B1cCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLnN0YXJ0ID09PSBzZWxlY3Rpb24uZW5kKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGlucHV0XG4gICAgICAgIGxldCBwb3MgPSBzZWxlY3Rpb24uc3RhcnRcblxuICAgICAgICBjb25zdCBpc0RpZ2l0ID0gY2hhciA9PiAhaXNOYU4ocGFyc2VJbnQoY2hhciwgMTApKVxuXG4gICAgICAgIGlmIChldmVudC5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKGlzRGlnaXQoZXZlbnQua2V5KSAmJiBwb3MgPCB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdmFsdWVbcG9zXSA9PT0gJzonICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMV0pICYmXG4gICAgICAgICAgICAgIGlzRGlnaXQodmFsdWVbcG9zIC0gMl0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcG9zKytcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBuZXh0IGRpZ2l0IHNvIHRoZSBldmVudCBvdmVycmlkZXMgaXQgaW5zdGVhZCBvZiBpbnNlcnRpbmdcbiAgICAgICAgICAgIC8vIG5ldyBjaGFycy5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJiAoXG4gICAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3MgKyAxXSkgfHxcbiAgICAgICAgICAgICAgICBpc0RpZ2l0KHZhbHVlW3BvcyAtIDFdKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAoXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICAgICAgdmFsdWUuc2xpY2UocG9zICsgMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpLmxlbmd0aFxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdmFsdWUuc2xpY2UoMCwgbGVuZ3RoKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHNlbGVjdGlvbilcbiAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcG9zID09PSAxIHx8XG4gICAgICAgICAgICBbJyAnLCAnOiddLmluY2x1ZGVzKHZhbHVlW3BvcyAtIDJdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwb3MgPT09IHZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgICB2YWx1ZVtwb3NdID09PSAnOidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBwb3MtLVxuICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IChcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgwLCBwb3MpICtcbiAgICAgICAgICAgICAgICAoKHZhbHVlW3BvcyAtIDFdID8/ICcnKSArICcwMCcpICtcbiAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZShwb3MgKyAxKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNldFNlbGVjdGlvbihpbnB1dCwgeyBzdGFydDogcG9zLCBlbmQ6IHBvcyB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgaXNEaWdpdCh2YWx1ZVtwb3NdKSAmJlxuICAgICAgICAgICAgICAhaXNEaWdpdCgrdmFsdWVbcG9zICsgMV0pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gV2hlbiByZW1vdmluZyB0aGUgZmlyc3Qgb2YgdHdvIGRpZ2l0cywgcmVwbGFjZSB3aXRoIDBcbiAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBwb3MpICsgJzAnICsgdmFsdWUuc2xpY2UocG9zKVxuICAgICAgICAgICAgICBzZXRTZWxlY3Rpb24oaW5wdXQsIHsgc3RhcnQ6IHBvcywgZW5kOiBwb3MgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgb25Nb3VzZURvd24odG9nZ2xlKSB7XG4gICAgICB0aGlzLnNob3dQb3B1cCA9ICF0aGlzLmRpc2FibGVkICYmICghdG9nZ2xlIHx8ICF0aGlzLnNob3dQb3B1cClcbiAgICAgIGlmICh0aGlzLnNob3dQb3B1cCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLmlucHV0LmZvY3VzKClcbiAgICB9LFxuXG4gICAgYmx1cigpIHtcbiAgICAgIHRoaXMuaW5wdXQuYmx1cigpXG4gICAgfVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtaW4td2lkdGg6IDZlbTtcbiAgfVxufVxuXG4uZGl0by10aW1lLXBpY2tlci1wb3B1cCB7XG4gIG1heC13aWR0aDogMTYwcHg7XG4gIG1hcmdpbjogJHBvcHVwLW1hcmdpbjtcbn1cblxuJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0OiAyNHB4O1xuXG4uZGl0by10aW1lLXBpY2tlciB7XG4gIC5kaXRvLWlucHV0IHtcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5kaXRvLXRpbWUtcGlja2VyLXBvcHVwIHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgYmFja2dyb3VuZDogJGNvbG9yLXdoaXRlO1xuICBib3JkZXI6ICRib3JkZXItc3R5bGU7XG4gIGJvcmRlci1yYWRpdXM6ICRib3JkZXItcmFkaXVzO1xuICBib3gtc2hhZG93OiAkc2hhZG93LXdpbmRvdztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLmRpdG8tdGltZS1waWNrZXItcG9wdXAgLmRpdG8tdGltZS1waWNrZXItcGFuZWwge1xuICBmbG9hdDogbGVmdDtcbiAgYm9yZGVyOiAkYm9yZGVyLXN0eWxlO1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDA7XG4gIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB3aWR0aDogY2FsYygxMDAlIC8gMyArIDFweCk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgJjpsYXN0LWNoaWxkIHtcbiAgICBib3JkZXItcmlnaHQ6IDA7XG4gIH1cblxuICB1bCB7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBtYXJnaW46IDA7XG4gICAgLy8gSGlkZSBzY3JvbGxiYXI6XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgcGFkZGluZzogMCAxN3B4IDAgMDtcbiAgICBoZWlnaHQ6IDcgKiAkdGltZS1waWNrZXItbGluZS1oZWlnaHQ7XG5cbiAgICAmID4gbGkge1xuICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICBiYWNrZ3JvdW5kOiAkY29sb3Itd2hpdGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogJHRpbWUtcGlja2VyLWxpbmUtaGVpZ2h0O1xuICAgICAgbGluZS1oZWlnaHQ6ICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIEBpbmNsdWRlIHVzZXItc2VsZWN0KG5vbmUpO1xuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyAqICR0aW1lLXBpY2tlci1saW5lLWhlaWdodDtcbiAgICAgIH1cblxuICAgICAgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1oaWdobGlnaHQ7XG4gICAgICB9XG5cbiAgICAgICYuc2VsZWN0ZWQsXG4gICAgICAmLnNlbGVjdGVkOmhvdmVyIHtcbiAgICAgICAgY29sb3I6ICRjb2xvci10ZXh0LWludmVydGVkO1xuICAgICAgICBiYWNrZ3JvdW5kOiAkY29sb3ItYWN0aXZlO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkIHtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgICBjb2xvcjogJGNvbG9yLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICAmLmRpc2FibGVkOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG48L3N0eWxlPlxuIiwiPHRlbXBsYXRlIGxhbmc9XCJwdWdcIj5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIocmVmPVwicGlja2VyXCIpXG4gIC5kaXRvLWRhdGUtdGltZS1waWNrZXJfX2lubmVyKDpjbGFzcz1cInsgJ2RpdG8tZm9jdXMnOiBmb2N1c2VkIH1cIilcbiAgICBJbnB1dEZpZWxkLmRpdG8tZGF0ZS10aW1lLXBpY2tlcl9faW5wdXQoXG4gICAgICByZWY9XCJpbnB1dFwiXG4gICAgICB2LW1vZGVsPVwiY3VycmVudFRleHRcIlxuICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgOmNsYXNzPVwieyAnZGl0by1mb2N1cyc6IGZvY3VzZWQgfVwiXG4gICAgICB2LWJpbmQ9XCJ7IHBsYWNlaG9sZGVyLCBkaXNhYmxlZCwgLi4uJGF0dHJzIH1cIlxuICAgICAgQGZvY3VzPVwib25Gb2N1cyh0cnVlKVwiXG4gICAgICBAYmx1cj1cIm9uRm9jdXMoZmFsc2UpXCJcbiAgICAgIEBrZXlkb3duPVwib25LZXlEb3duXCJcbiAgICAgIEBtb3VzZWRvd24uc3RvcD1cIm9uTW91c2VEb3duKGZhbHNlKVwiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI2JlZm9yZSlcbiAgICAgICAgc2xvdChuYW1lPVwiYmVmb3JlXCIpXG4gICAgICB0ZW1wbGF0ZSgjYWZ0ZXIpXG4gICAgICAgIEljb24oXG4gICAgICAgICAgbmFtZT1cImNhbGVuZGFyXCJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgICAgICAgQG1vdXNlZG93bi5wcmV2ZW50PVwib25Nb3VzZURvd24odHJ1ZSlcIlxuICAgICAgICApXG4gICAgICAgIHNsb3QobmFtZT1cImFmdGVyXCIpXG4gICAgRGF0ZVBpY2tlcihcbiAgICAgIHJlZj1cImRhdGVcIlxuICAgICAgdi1tb2RlbD1cImN1cnJlbnRWYWx1ZVwiXG4gICAgICB2LW1vZGVsOnNob3c9XCJzaG93RGF0ZVwiXG4gICAgICBwbGFjZW1lbnQ9XCJib3R0b20tbGVmdFwiXG4gICAgICA6dGFyZ2V0PVwiJHJlZnMucGlja2VyXCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgIClcbiAgICAgIHRlbXBsYXRlKCN0cmlnZ2VyKVxuICAgICAgICAvLy0gSW50ZW50aW9uYWxseSBlbXB0eVxuICAgIFRpbWVQaWNrZXIoXG4gICAgICByZWY9XCJ0aW1lXCJcbiAgICAgIHYtbW9kZWw9XCJjdXJyZW50VmFsdWVcIlxuICAgICAgdi1tb2RlbDpzaG93PVwic2hvd1RpbWVcIlxuICAgICAgcGxhY2VtZW50PVwiYm90dG9tLXJpZ2h0XCJcbiAgICAgIDp0YXJnZXQ9XCIkcmVmcy5waWNrZXJcIlxuICAgICAgdi1iaW5kPVwiYXR0cmlidXRlc1wiXG4gICAgKVxuICAgICAgdGVtcGxhdGUoI3RyaWdnZXIpXG4gICAgICAgIC8vLSBJbnRlbnRpb25hbGx5IGVtcHR5XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuaW1wb3J0IHsgZm9ybWF0LCBkZWZhdWx0Rm9ybWF0cywgYXNzaWduRGVlcGx5IH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCBJbnB1dEZpZWxkIGZyb20gJy4vSW5wdXRGaWVsZC52dWUnXG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tICcuL0RhdGVQaWNrZXIudnVlJ1xuaW1wb3J0IFRpbWVQaWNrZXIgZnJvbSAnLi9UaW1lUGlja2VyLnZ1ZSdcbmltcG9ydCBJY29uIGZyb20gJy4vSWNvbi52dWUnXG5pbXBvcnQgeyBwYXJzZURhdGUgfSBmcm9tICcuLi91dGlscy9kYXRlLmpzJ1xuaW1wb3J0IHsgZ2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb24gfSBmcm9tICcuLi91dGlscy9zZWxlY3Rpb24uanMnXG5pbXBvcnQgeyBnZXRLZXlOYXZpZ2F0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQuanMnXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgY29tcG9uZW50czogeyBJbnB1dEZpZWxkLCBEYXRlUGlja2VyLCBUaW1lUGlja2VyLCBJY29uIH0sXG4gIGVtaXRzOiBbJ3VwZGF0ZTptb2RlbFZhbHVlJywgJ2NoYW5nZScsICdmb2N1cycsICdibHVyJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IERhdGUsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0cmFuc2l0aW9uOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ3NsaWRlJyB9LFxuICAgIHBsYWNlaG9sZGVyOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgbG9jYWxlOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogJ2VuLVVTJyB9LFxuICAgIGZvcm1hdDogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5tb2RlbFZhbHVlLFxuICAgICAgc2hvd0RhdGU6IGZhbHNlLFxuICAgICAgc2hvd1RpbWU6IGZhbHNlLFxuICAgICAgaW5wdXRGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGRhdGVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIHRpbWVGb2N1c2VkOiBmYWxzZSxcbiAgICAgIGNsb3NlZE1vZGU6IG51bGxcbiAgICB9XG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBhdHRyaWJ1dGVzKCkge1xuICAgICAgY29uc3QgeyB0cmFuc2l0aW9uLCBkaXNhYmxlZCwgbG9jYWxlLCBmb3JtYXRPcHRpb25zOiBmb3JtYXQgfSA9IHRoaXNcbiAgICAgIHJldHVybiB7IHRyYW5zaXRpb24sIGRpc2FibGVkLCBsb2NhbGUsIGZvcm1hdCB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnB1dEZvY3VzZWQgfHwgdGhpcy5zaG93RGF0ZSB8fCB0aGlzLnNob3dUaW1lXG4gICAgfSxcblxuICAgIGlucHV0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuJHJlZnMuaW5wdXQuaW5wdXRcbiAgICB9LFxuXG4gICAgZm9ybWF0T3B0aW9ucygpIHtcbiAgICAgIHJldHVybiBhc3NpZ25EZWVwbHkoXG4gICAgICAgIHtcbiAgICAgICAgICBsb2NhbGU6IHRoaXMubG9jYWxlLFxuICAgICAgICAgIHRpbWU6IGRlZmF1bHRGb3JtYXRzLnRpbWUsXG4gICAgICAgICAgZGF0ZTogZGVmYXVsdEZvcm1hdHMuZGF0ZVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgICAgICBmb3JtYXQ6ICh2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPT5cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ2xpdGVyYWwnICYmIC9cXGJhdFxcYi8udGVzdCh2YWx1ZSlcbiAgICAgICAgICAgICAgICA/ICcsICdcbiAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybWF0Py5kYXRlPy5mb3JtYXQ/Lih2YWx1ZSwgdHlwZSwgb3B0aW9ucykgPz8gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuZm9ybWF0XG4gICAgICApXG4gICAgfSxcblxuICAgIHRpbWVJbmRleCgpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmN1cnJlbnRUZXh0XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBjb25zdCB0aW1lID0gdGV4dC5tYXRjaCgvKFtcXFNdK1xccyopJC8pPy5bMV1cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICByZXR1cm4gdGV4dC5sZW5ndGggLSB0aW1lLmxlbmd0aFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0sXG5cbiAgICBjdXJyZW50VGV4dDoge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0KHRoaXMuY3VycmVudFZhbHVlLCB0aGlzLmZvcm1hdE9wdGlvbnMpIHx8ICcnXG4gICAgICB9LFxuXG4gICAgICBzZXQodmFsdWUpIHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IHBhcnNlRGF0ZSh2YWx1ZSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICBpZiAoZGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gZGF0ZVxuICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHNldFNlbGVjdGlvbih0aGlzLmlucHV0LCBzZWxlY3Rpb24pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgbW9kZWxWYWx1ZSh0bywgZnJvbSkge1xuICAgICAgaWYgKCt0byAhPT0gK2Zyb20pIHtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0b1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50VmFsdWUodmFsdWUpIHtcbiAgICAgIGlmICgrdmFsdWUgIT09ICt0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWx1ZSlcbiAgICAgICAgdGhpcy4kZW1pdCgnY2hhbmdlJywgdmFsdWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGZvY3VzZWQodG8sIGZyb20pIHtcbiAgICAgIGlmICh0byBeIGZyb20pIHtcbiAgICAgICAgdGhpcy4kZW1pdCh0byA/ICdmb2N1cycgOiAnYmx1cicpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBvbkZvY3VzKGZvY3VzKSB7XG4gICAgICB0aGlzLmlucHV0Rm9jdXNlZCA9IGZvY3VzXG4gICAgICBpZiAoZm9jdXMpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBvbk1vdXNlRG93bih0b2dnbGUpIHtcbiAgICAgIGlmICh0b2dnbGUgJiYgKHRoaXMuc2hvd0RhdGUgfHwgdGhpcy5zaG93VGltZSkpIHtcbiAgICAgICAgdGhpcy5zaG93RGF0ZSA9IGZhbHNlXG4gICAgICAgIHRoaXMuc2hvd1RpbWUgPSBmYWxzZVxuICAgICAgfSBlbHNlIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLmZvY3VzKClcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMudXBkYXRlUG9wdXBzKCkpXG4gICAgICB9XG4gICAgfSxcblxuICAgIG9uS2V5RG93bihldmVudCkge1xuICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZShldmVudClcbiAgICAgIHRoaXMuJHJlZnNbbW9kZV0ub25LZXlEb3duKGV2ZW50KVxuICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbW9kZVxuICAgICAgfSBlbHNlIGlmIChtb2RlICE9PSB0aGlzLmNsb3NlZE1vZGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3B1cHMobW9kZSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TW9kZShldmVudCA9IG51bGwpIHtcbiAgICAgIGNvbnN0IHsgc3RhcnQgfSA9IGdldFNlbGVjdGlvbih0aGlzLmlucHV0KVxuICAgICAgY29uc3QgeyBob3I6IHN0ZXAgfSA9IGdldEtleU5hdmlnYXRpb24oZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy50aW1lSW5kZXggPT09IG51bGwgfHwgc3RhcnQgKyBzdGVwIDwgdGhpcy50aW1lSW5kZXhcbiAgICAgICAgPyAnZGF0ZSdcbiAgICAgICAgOiAndGltZSdcbiAgICB9LFxuXG4gICAgdXBkYXRlUG9wdXBzKG1vZGUgPSB0aGlzLmdldE1vZGUoKSkge1xuICAgICAgaWYgKG1vZGUpIHtcbiAgICAgICAgdGhpcy5jbG9zZWRNb2RlID0gbnVsbFxuICAgICAgfVxuICAgICAgdGhpcy5zaG93RGF0ZSA9IG1vZGUgPT09ICdkYXRlJ1xuICAgICAgdGhpcy5zaG93VGltZSA9IG1vZGUgPT09ICd0aW1lJ1xuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgIHRoaXMuaW5wdXQuZm9jdXMoKVxuICAgIH0sXG5cbiAgICBibHVyKCkge1xuICAgICAgdGhpcy5pbnB1dC5ibHVyKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLWRhdGUtdGltZS1waWNrZXIge1xuICAmX19pbm5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gICZfX2lucHV0IHtcbiAgICBmbGV4OiAxO1xuICAgIGZvbnQtdmFyaWFudC1udW1lcmljOiB0YWJ1bGFyLW51bXM7XG4gICAgbWluLXdpZHRoOiAxMmVtO1xuICB9XG5cbiAgLmRpdG8tZGF0ZS1waWNrZXIsXG4gIC5kaXRvLXRpbWUtcGlja2VyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZS9uby10ZW1wbGF0ZS1zaGFkb3cgLS0+XG48dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tcGFnaW5hdGlvblxuICAuZGl0by1wYWdpbmF0aW9uLXRvdGFsKFxuICAgIHYtaWY9XCJzaG93VG90YWxcIlxuICApXG4gICAgdGVtcGxhdGUoXG4gICAgICB2LWlmPVwidG90YWwgPiAwXCJcbiAgICApIHt7IGZpcnN0IH19IOKAkyB7eyBsYXN0IH19IC8ge3sgdG90YWwgfX1cbiAgLmRpdG8tYnV0dG9ucy5kaXRvLWJ1dHRvbnMtcm91bmQoXG4gICAgdi1pZj1cIm51bVBhZ2VzID4gMVwiXG4gIClcbiAgICBidXR0b24uZGl0by1idXR0b24oXG4gICAgICB2LWZvcj1cImJ1dHRvbiBpbiBidXR0b25zXCJcbiAgICAgIDpjbGFzcz1cImdldEJ1dHRvbkNsYXNzZXMoYnV0dG9uKVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJidXR0b24uZGlzYWJsZWRcIlxuICAgICAgQGNsaWNrPVwib25DbGlja0J1dHRvbihidXR0b24pXCJcbiAgICApXG4gICAgICBzcGFuKFxuICAgICAgICB2LWlmPVwiYnV0dG9uLnRleHRcIlxuICAgICAgKSB7eyBidXR0b24udGV4dCB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOnBhZ2UnXSxcblxuICBwcm9wczoge1xuICAgIHRvdGFsOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgIHBhZ2U6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxIH0sXG4gICAgcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBkZWZhdWx0OiAxMCB9LFxuICAgIHNob3dUb3RhbDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH1cbiAgfSxcblxuICBkYXRhKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzaG93UHJldjogdHJ1ZSxcbiAgICAgIHNob3dOZXh0OiB0cnVlLFxuICAgICAgY3VycmVudFBhZ2U6IHRoaXMucGFnZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGZpcnN0KCkge1xuICAgICAgcmV0dXJuICh0aGlzLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLnBhZ2VTaXplICsgMVxuICAgIH0sXG5cbiAgICBsYXN0KCkge1xuICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuZmlyc3QgKyB0aGlzLnBhZ2VTaXplIC0gMSwgdGhpcy50b3RhbClcbiAgICB9LFxuXG4gICAgbnVtUGFnZXMoKSB7XG4gICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnBhZ2VTaXplKVxuICAgIH0sXG5cbiAgICBidXR0b25zKCkge1xuICAgICAgY29uc3QgeyBzaG93UHJldiwgc2hvd05leHQsIGN1cnJlbnRQYWdlLCBudW1QYWdlcyB9ID0gdGhpc1xuICAgICAgY29uc3Qgc2hvd0xlbmd0aCA9IHNob3dQcmV2ICsgc2hvd05leHQgKyAxXG5cbiAgICAgIGxldCBzdGFydCA9IDFcbiAgICAgIGxldCBlbmQgPSAxXG4gICAgICBpZiAobnVtUGFnZXMgPD0gc2hvd0xlbmd0aCkge1xuICAgICAgICBlbmQgPSBudW1QYWdlc1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA8PSBzaG93UHJldiArIDEpIHtcbiAgICAgICAgZW5kID0gc2hvd0xlbmd0aFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGFnZSA+PSBudW1QYWdlcyAtIHNob3dOZXh0KSB7XG4gICAgICAgIGVuZCA9IG51bVBhZ2VzXG4gICAgICAgIHN0YXJ0ID0gbnVtUGFnZXMgLSBzaG93TGVuZ3RoICsgMVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBjdXJyZW50UGFnZSAtIHNob3dQcmV2XG4gICAgICAgIGVuZCA9IGN1cnJlbnRQYWdlICsgc2hvd05leHRcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9ucyA9IFtdXG4gICAgICBidXR0b25zLnB1c2goe1xuICAgICAgICBpbmRleDogY3VycmVudFBhZ2UgLSAxLFxuICAgICAgICB0eXBlOiAncHJldicsXG4gICAgICAgIGRpc2FibGVkOiBjdXJyZW50UGFnZSA8PSAxXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXJ0ID49IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IDEsIHRleHQ6IDEgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA+IDIpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5tYXgoMSwgY3VycmVudFBhZ2UgLSAxMCksXG4gICAgICAgICAgdHlwZTogJ2VsbGlwc2lzLXByZXYnXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIGFjdGl2ZTogaSA9PT0gY3VycmVudFBhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgICBpbmRleDogTWF0aC5taW4obnVtUGFnZXMsIGN1cnJlbnRQYWdlICsgMTApLFxuICAgICAgICAgIHR5cGU6ICdlbGxpcHNpcy1uZXh0J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGVuZCA8PSBudW1QYWdlcyAtIDEpIHtcbiAgICAgICAgYnV0dG9ucy5wdXNoKHsgaW5kZXg6IG51bVBhZ2VzLCB0ZXh0OiBudW1QYWdlcyB9KVxuICAgICAgfVxuICAgICAgYnV0dG9ucy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGN1cnJlbnRQYWdlICsgMSxcbiAgICAgICAgdHlwZTogJ25leHQnLFxuICAgICAgICBkaXNhYmxlZDogY3VycmVudFBhZ2UgPj0gbnVtUGFnZXNcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBidXR0b25zXG4gICAgfVxuICB9LFxuXG4gIHdhdGNoOiB7XG4gICAgcGFnZShwYWdlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gcGFnZVxuICAgIH0sXG5cbiAgICBwYWdlU2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy5udW1QYWdlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gdGhpcy5udW1QYWdlc1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50UGFnZSh0bywgZnJvbSkge1xuICAgICAgaWYgKHRvICE9PSBmcm9tKSB7XG4gICAgICAgIHRoaXMuJGVtaXQoJ3VwZGF0ZTpwYWdlJywgdG8pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNyZWF0ZWQoKSB7XG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHRoaXMucGFnZVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRCdXR0b25DbGFzc2VzKGJ1dHRvbikge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHtcbiAgICAgICAgJ2RpdG8tc2VsZWN0ZWQnOiBidXR0b24uYWN0aXZlXG4gICAgICB9XG4gICAgICBpZiAoYnV0dG9uLnR5cGUpIHtcbiAgICAgICAgY2xhc3Nlc1tgZGl0by1idXR0b24tJHtidXR0b24udHlwZX1gXSA9IHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBjbGFzc2VzXG4gICAgfSxcblxuICAgIG9uQ2xpY2tCdXR0b24oYnV0dG9uKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGJ1dHRvbi5pbmRleCAmJlxuICAgICAgICAhYnV0dG9uLmRpc2FibGVkICYmXG4gICAgICAgIGJ1dHRvbi5pbmRleCAhPT0gdGhpcy5jdXJyZW50UGFnZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSBidXR0b24uaW5kZXhcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXBhZ2luYXRpb24ge1xuICBkaXNwbGF5OiBmbGV4O1xuXG4gIC5kaXRvLXBhZ2luYXRpb24tdG90YWwge1xuICAgIEBpbmNsdWRlIGVsbGlwc2lzO1xuXG4gICAgbWFyZ2luOiAwIDAuNWVtO1xuICAgIGxpbmUtaGVpZ2h0OiAkaW5wdXQtaGVpZ2h0O1xuICB9XG5cbiAgLmRpdG8tYnV0dG9uIHtcbiAgICB0cmFuc2l0aW9uOlxuICAgICAgYWxsIDAuM3MgZWFzZSxcbiAgICAgIGNvbG9yIDBzLFxuICAgICAgYmFja2dyb3VuZCAwcyxcbiAgICAgIGJvcmRlciAwcztcbiAgICBmb250LXZhcmlhbnQtbnVtZXJpYzogdGFidWxhci1udW1zO1xuICAgIHBhZGRpbmc6IDAgMC41ZW07XG5cbiAgICAmLXByZXYsXG4gICAgJi1uZXh0IHtcbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tYXJyb3c7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi1wcmV2OjpiZWZvcmUge1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpO1xuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldixcbiAgICAmLWVsbGlwc2lzLW5leHQge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMDtcbiAgICAgIHBhZGRpbmc6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBjb2xvcjogJGNvbG9yLXRleHQ7XG5cbiAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgICY6aG92ZXI6OmJlZm9yZSB7XG4gICAgICAgIEBleHRlbmQgJWljb24tY2hldnJvbnM7XG4gICAgICB9XG5cbiAgICAgICY6Zm9jdXMge1xuICAgICAgICBjb2xvcjogJGNvbG9yLWFjdGl2ZTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgICYtZWxsaXBzaXMtcHJldjo6YmVmb3JlIHtcbiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTtcbiAgICB9XG4gIH1cbn1cbjwvc3R5bGU+XG4iLCI8dGVtcGxhdGUgbGFuZz1cInB1Z1wiPlxuLmRpdG8tc3dpdGNoKFxuICA6Y2xhc3M9XCJjbGFzc2VzXCJcbiAgOnN0eWxlPVwic3R5bGVzXCJcbilcbiAgLmRpdG8tc3dpdGNoLXBhbmVcbiAgICBpbnB1dChcbiAgICAgIDppZD1cImlkXCJcbiAgICAgIHJlZj1cImlucHV0XCJcbiAgICAgIHYtYmluZD1cImF0dHJpYnV0ZXNcIlxuICAgICAgdi1tb2RlbD1cImNoZWNrZWRcIlxuICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgIDpuYW1lPVwibmFtZVwiXG4gICAgICA6ZGlzYWJsZWQ9XCJkaXNhYmxlZFwiXG4gICAgKVxuICAgIC5kaXRvLXN3aXRjaC1idXR0b25cbiAgICBzcGFuLmRpdG8tc3dpdGNoLWxhYmVsKFxuICAgICAgdi1pZj1cImxhYmVsc1wiXG4gICAgKVxuICAgICAgc2xvdChcbiAgICAgICAgdi1pZj1cImNoZWNrZWRcIlxuICAgICAgICBuYW1lPVwiY2hlY2tlZFwiXG4gICAgICApIHt7IGxhYmVscy5jaGVja2VkIHx8ICdvbicgfX1cbiAgICAgIHNsb3QoXG4gICAgICAgIHYtZWxzZVxuICAgICAgICBuYW1lPVwidW5jaGVja2VkXCJcbiAgICAgICkge3sgbGFiZWxzLnVuY2hlY2tlZCB8fCAnb2ZmJyB9fVxuPC90ZW1wbGF0ZT5cblxuPHNjcmlwdD5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZW1pdHM6IFsndXBkYXRlOm1vZGVsVmFsdWUnLCAnY2hhbmdlJ10sXG4gIGluaGVyaXRBdHRyczogZmFsc2UsXG5cbiAgcHJvcHM6IHtcbiAgICBtb2RlbFZhbHVlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgaWQ6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBudWxsIH0sXG4gICAgbmFtZTogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIGxhYmVsczogeyB0eXBlOiBbT2JqZWN0LCBCb29sZWFuXSwgZGVmYXVsdDogZmFsc2UgfVxuICB9LFxuXG4gIGRhdGEoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrZWQ6IHRoaXMubW9kZWxWYWx1ZVxuICAgIH1cbiAgfSxcblxuICBjb21wdXRlZDoge1xuICAgIGNsYXNzZXMoKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLiRhdHRycy5jbGFzcyxcbiAgICAgICAge1xuICAgICAgICAgICdkaXRvLWNoZWNrZWQnOiB0aGlzLmNoZWNrZWQsXG4gICAgICAgICAgJ2RpdG8tZGlzYWJsZWQnOiB0aGlzLmRpc2FibGVkXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LFxuXG4gICAgc3R5bGVzKCkge1xuICAgICAgY29uc3QgeyBsYWJlbHM6IHsgY2hlY2tlZCwgdW5jaGVja2VkIH0gPSB7fSB9ID0gdGhpc1xuICAgICAgLy8gQ2FsY3VsYXRlIGAtLXN3aXRjaC13aWR0aGAgaW4gYHJlbWAsIGJhc2VkIG9uIGxhYmVsIGxlbmd0aC5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWF4KDAsIGNoZWNrZWQ/Lmxlbmd0aCwgdW5jaGVja2VkPy5sZW5ndGgpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAnLS1zd2l0Y2gtd2lkdGgnOiBsZW5ndGggPyBgJHtsZW5ndGggKiAxLjV9cmVtYCA6IG51bGxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXR0cmlidXRlcygpIHtcbiAgICAgIGNvbnN0IHsgY2xhc3M6IF8sIC4uLmF0dHJpYnV0ZXMgfSA9IHRoaXMuJGF0dHJzXG4gICAgICByZXR1cm4gYXR0cmlidXRlc1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIG1vZGVsVmFsdWUobW9kZWxWYWx1ZSkge1xuICAgICAgdGhpcy5jaGVja2VkID0gbW9kZWxWYWx1ZVxuICAgIH0sXG5cbiAgICBjaGVja2VkKGNoZWNrZWQpIHtcbiAgICAgIGlmIChjaGVja2VkICE9PSB0aGlzLm1vZGVsVmFsdWUpIHtcbiAgICAgICAgdGhpcy4kZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCBjaGVja2VkKVxuICAgICAgICB0aGlzLiRlbWl0KCdjaGFuZ2UnLCBjaGVja2VkKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBtZXRob2RzOiB7XG4gICAgZm9jdXMoKSB7XG4gICAgICB0aGlzLiRyZWZzLmlucHV0LmZvY3VzKClcbiAgICB9XG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGUgbGFuZz1cInNjc3NcIj5cbkBpbXBvcnQgJy4uL3N0eWxlcy9faW1wb3J0cyc7XG5cbi5kaXRvLXN3aXRjaCB7XG4gIC8vIFVzZSB3aG9sZSBtdWx0aXBsZXMgb2YgYHJlbWAgZm9yIHNpemVzIGFuZCBgcHhgIG1hcmdpbnMvcGFkZGluZyBhbG9uZ1xuICAvLyB3aXRoIGBjYWxjKClgIHRvIGVuZCB1cCB3aXRoIGV2ZW4gcGl4ZWwgc2l6ZXMuXG4gIC0tc3dpdGNoLXdpZHRoOiA0ZW07XG4gIC0tc3dpdGNoLWhlaWdodDogMmVtO1xuICAtLXN3aXRjaC1tYXJnaW46IDJweDtcbiAgLS1zd2l0Y2gtcGFkZGluZzogM3B4O1xuICAtLXN3aXRjaC1zcGVlZDogMzAwbXM7XG4gIC0tbGFiZWwtbWFyZ2luOiAwLjVlbTtcbiAgLS13aWR0aDogY2FsYyh2YXIoLS1zd2l0Y2gtd2lkdGgpIC0gMiAqIHZhcigtLXN3aXRjaC1tYXJnaW4pKTtcbiAgLS1oZWlnaHQ6IGNhbGModmFyKC0tc3dpdGNoLWhlaWdodCkgLSAyICogdmFyKC0tc3dpdGNoLW1hcmdpbikpO1xuICAtLW9mZnNldDogY2FsYyh2YXIoLS13aWR0aCkgLSB2YXIoLS1oZWlnaHQpKTtcblxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgaGVpZ2h0OiB2YXIoLS1zd2l0Y2gtaGVpZ2h0KTtcbiAgLy8gVG8gbWFrZSBpbmxpbmUgbGFiZWxzIGFwcGVhciBvbiBjb25zaXN0ZW50IGJhc2VsaW5lOlxuICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO1xuICBAaW5jbHVkZSB1c2VyLXNlbGVjdChub25lKTtcblxuICAuZGl0by1zd2l0Y2gtcGFuZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiB2YXIoLS13aWR0aCk7XG4gICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLXBhbmUsXG4gIC5kaXRvLXN3aXRjaC1sYWJlbCB7XG4gICAgdG9wOiA1MCU7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB9XG5cbiAgaW5wdXQge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3JkZXItcmFkaXVzOiAxZW07XG4gICAgYmFja2dyb3VuZDogJGNvbG9yLWxpZ2h0O1xuICAgIHRyYW5zaXRpb246XG4gICAgICBib3JkZXItY29sb3IgMC4zcyxcbiAgICAgIGJhY2tncm91bmQtY29sb3IgMC4zcztcbiAgfVxuXG4gIC5kaXRvLXN3aXRjaC1idXR0b24ge1xuICAgIC0tc2l6ZTogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMiAqIHZhcigtLXN3aXRjaC1wYWRkaW5nKSk7XG5cbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zd2l0Y2gtcGFkZGluZyk7XG4gICAgbGVmdDogdmFyKC0tc3dpdGNoLXBhZGRpbmcpO1xuICAgIHdpZHRoOiB2YXIoLS1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUpO1xuICAgIGJvcmRlci1yYWRpdXM6IGNhbGModmFyKC0tc2l6ZSkgLyAyKTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJhY2tncm91bmQ6ICRjb2xvci13aGl0ZTtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gdmFyKC0tc3dpdGNoLXNwZWVkKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gIH1cblxuICAuZGl0by1zd2l0Y2gtYnV0dG9uLFxuICAuZGl0by1zd2l0Y2gtbGFiZWwge1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBjb2xvcjogJGNvbG9yLXdoaXRlO1xuICB9XG5cbiAgJi5kaXRvLWNoZWNrZWQge1xuICAgIGlucHV0IHtcbiAgICAgIGJhY2tncm91bmQ6ICRjb2xvci1hY3RpdmU7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgodmFyKC0tb2Zmc2V0KSk7XG4gICAgfVxuXG4gICAgLmRpdG8tc3dpdGNoLWxhYmVsIHtcbiAgICAgIGxlZnQ6IHZhcigtLWxhYmVsLW1hcmdpbik7XG4gICAgICByaWdodDogdW5zZXQ7XG4gICAgfVxuICB9XG5cbiAgJi5kaXRvLWRpc2FibGVkIHtcbiAgICBAZXh0ZW5kICVidXR0b24tZGlzYWJsZWQ7XG4gIH1cblxuICAmOmZvY3VzLXdpdGhpbjpub3QoOmhvdmVyKSB7XG4gICAgLmRpdG8tc3dpdGNoLWJ1dHRvbiB7XG4gICAgICBib3gtc2hhZG93OiAkc2hhZG93LWZvY3VzO1xuICAgIH1cbiAgfVxufVxuPC9zdHlsZT5cbiIsIjxzY3JpcHQ+XG5pbXBvcnQgeyBoIGFzIGNyZWF0ZUVsZW1lbnQsIFRyYW5zaXRpb24gfSBmcm9tICd2dWUnXG5cbi8vIEB2dWUvY29tcG9uZW50XG5mdW5jdGlvbiBUcmFuc2l0aW9uSGVpZ2h0KHsgZW5hYmxlZCB9LCB7IHNsb3RzIH0pIHtcbiAgcmV0dXJuIGVuYWJsZWRcbiAgICA/IGNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwgcHJvcHMsIHNsb3RzKVxuICAgIDogc2xvdHMuZGVmYXVsdCgpXG59XG5cblRyYW5zaXRpb25IZWlnaHQucHJvcHMgPSB7XG4gIGVuYWJsZWQ6IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogdHJ1ZSB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zaXRpb25IZWlnaHRcblxuY29uc3Qgc2V0U3R5bGUgPSAoZWxlbWVudCwgc3R5bGUpID0+IE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpXG5cbmNvbnN0IG5leHRUaW1lb3V0ID0gY2FsbGJhY2sgPT4gc2V0VGltZW91dChjYWxsYmFjaywgMClcblxuLy8gRm9yY2UgcmVwYWludCB0byBtYWtlIHN1cmUgdGhlIGFuaW1hdGlvbiBpcyB0cmlnZ2VyZWQgY29ycmVjdGx5LlxuY29uc3QgZm9yY2VSZXBhaW50ID0gZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodFxuXG5jb25zdCBwcm9wcyA9IHtcbiAgbmFtZTogJ2RpdG8taGVpZ2h0JyxcblxuICBvbkFmdGVyRW50ZXIoZWxlbWVudCkge1xuICAgIC8vIEEgdGltZW91dCBiZWZvcmUgc2V0dGluZyBzdHlsZSBpcyBvbmx5IHJlYWxseSBuZWVkZWQgYWZ0ZXIgY2FsbHMgdG9cbiAgICAvLyBgZm9yY2VSZXBhaW50KClgLCBidXQgdXNpbmcgb25lIGhlcmUgdG9vIHByZXNlcnZlcyBleGVjdXRpb24gc2VxdWVuY2Ugc29cbiAgICAvLyB0aGF0IHRoZSBjYWxsIGZyb20gYGVudGVyKClgIGNhbiBuZXZlciBvdXRydW4gdGhlIG9uZSBmcm9tIGBhZnRlckVudGVyKClgXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4gc2V0U3R5bGUoZWxlbWVudCwgeyBoZWlnaHQ6IG51bGwgfSkpXG4gIH0sXG5cbiAgb25FbnRlcihlbGVtZW50KSB7XG4gICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlJ3JlIGdldHRpbmcgdHdvIGBvbkVudGVyKClgIGNhbGxzIHBlciB0cmFuc2l0aW9uLFxuICAgIC8vIHNvIHdlIG5lZWQgdG8gaWdub3JlIHRoZSBzZWNvbmQgb25lLiBUaGlzIG1pZ2h0IGJlIGxpbmtlZCB0byB0aGUgdXNlXG4gICAgLy8gb2YgYG5leHRUaW1lb3V0KClgLCB3aGljaCBpcyByZXF1aXJlZCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUgZm9yXG4gICAgLy8gYGhlaWdodGAsIGJhc2VkIG9uIGAmLS1sYWJlbC12ZXJ0aWNhbGAgY2FsY3VsYXRpb25zLlxuICAgIGNvbnN0IHsgd2lkdGggfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7XG4gICAgICB3aWR0aCxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICBoZWlnaHQ6ICdhdXRvJ1xuICAgIH0pXG4gICAgbmV4dFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICAgIHNldFN0eWxlKGVsZW1lbnQsIHtcbiAgICAgICAgd2lkdGg6IG51bGwsXG4gICAgICAgIHBvc2l0aW9uOiBudWxsLFxuICAgICAgICB2aXNpYmlsaXR5OiBudWxsLFxuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH0pXG4gICAgICBmb3JjZVJlcGFpbnQoZWxlbWVudClcbiAgICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0IH0pKVxuICAgIH0pXG4gIH0sXG5cbiAgb25MZWF2ZShlbGVtZW50KSB7XG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudClcbiAgICBzZXRTdHlsZShlbGVtZW50LCB7IGhlaWdodCB9KVxuICAgIGZvcmNlUmVwYWludChlbGVtZW50KVxuICAgIG5leHRUaW1lb3V0KCgpID0+IHNldFN0eWxlKGVsZW1lbnQsIHsgaGVpZ2h0OiAwIH0pKVxuICB9XG59XG48L3NjcmlwdD5cblxuPHN0eWxlIGxhbmc9XCJzY3NzXCI+XG5AaW1wb3J0ICcuLi9zdHlsZXMvX2ltcG9ydHMnO1xuXG4kZHVyYXRpb246IDAuMTVzO1xuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlLFxuLmRpdG8taGVpZ2h0LWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zaXRpb246IGhlaWdodCAkZHVyYXRpb24gJGVhc2Utb3V0LXF1YXJ0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4uZGl0by1oZWlnaHQtZW50ZXItYWN0aXZlIHtcbiAgYW5pbWF0aW9uOiBkaXRvLXNsaWRlLWVudGVyICRkdXJhdGlvbiAkZWFzZS1vdXQtcXVhcnQ7XG59XG5cbi5kaXRvLWhlaWdodC1sZWF2ZS1hY3RpdmUge1xuICBhbmltYXRpb246IGRpdG8tc2xpZGUtbGVhdmUgJGR1cmF0aW9uICRlYXNlLW91dC1xdWFydDtcbn1cblxuLmRpdG8taGVpZ2h0LWVudGVyLWZyb20sXG4uZGl0by1oZWlnaHQtbGVhdmUtdG8ge1xuICBoZWlnaHQ6IDA7XG59XG48L3N0eWxlPlxuIiwiaW1wb3J0IHsgbWFya1JhdywgdXNlU2xvdHMsIENvbW1lbnQgfSBmcm9tICd2dWUnXG5pbXBvcnQgeyBpc1N0cmluZywgYXNBcnJheSB9IGZyb20gJ0BkaXRvanMvdXRpbHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNWTm9kZUNvbnRlbnQodm5vZGUpIHtcbiAgcmV0dXJuIHZub2RlICYmIGFzQXJyYXkodm5vZGUpLnNvbWUodm5vZGUgPT4gdm5vZGUudHlwZSAhPT0gQ29tbWVudClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Nsb3RDb250ZW50KHNsb3QsIHByb3BzID0ge30pIHtcbiAgc2xvdCA9IGlzU3RyaW5nKHNsb3QpID8gdXNlU2xvdHMoKVtzbG90XSA6IHNsb3RcbiAgcmV0dXJuIGhhc1ZOb2RlQ29udGVudChzbG90Py4ocHJvcHMpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmF3KHZhbHVlKSB7XG4gIHJldHVybiBtYXJrUmF3KHsgdmFsdWUgfSlcbn1cbiJdLCJuYW1lcyI6WyJkZXNjcmliZURhdGUiLCJkYXRlIiwiYWx0ZXJEYXRlIiwib3ZlcnJpZGVzIiwicGFyc2VEYXRlIiwic3RyaW5nIiwibG9jYWxlIiwidGltZSIsInRpbWVEZWZhdWx0IiwiZGF5Iiwic2VwMSIsIm1vbnRoIiwic2VwMiIsInllYXIiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlzZWNvbmQiLCJnZXREYXRlUGFydHMiLCJnZXRNb250aEluZGV4IiwiaXNWYWxpZFRpbWVQYXJ0IiwicGFydCIsImdldERhdGVQYXJ0QXRQb3NpdGlvbiIsInBvc2l0aW9uIiwicGFydHMiLCJnZXRQb3NpdGlvbiIsImxlbmd0aCIsInBvcyIsImluZGV4IiwiX2EiLCJvZmZzZXQiLCJpc1VTIiwidmFsdWVzIiwic3RhcnQiLCJlbmQiLCJ2YWx1ZSIsIm1hdGNoIiwic2hvcnRGb3JtYXQiLCJsb25nRm9ybWF0IiwiaSIsIndhcm4iLCJtc2ciLCJhcmdzIiwiYWN0aXZlU3ViIiwicGF1c2VkUXVldWVFZmZlY3RzIiwiUmVhY3RpdmVFZmZlY3QiLCJmbiIsImJhdGNoIiwiY2xlYW51cEVmZmVjdCIsInByZXBhcmVEZXBzIiwicHJldkVmZmVjdCIsInByZXZTaG91bGRUcmFjayIsInNob3VsZFRyYWNrIiwiY2xlYW51cERlcHMiLCJsaW5rIiwicmVtb3ZlU3ViIiwiaXNEaXJ0eSIsImJhdGNoRGVwdGgiLCJiYXRjaGVkU3ViIiwic3ViIiwic3RhcnRCYXRjaCIsImVuZEJhdGNoIiwiZXJyb3IiLCJlIiwibmV4dCIsImVyciIsImhlYWQiLCJ0YWlsIiwicHJldiIsInJlbW92ZURlcCIsInJlZnJlc2hDb21wdXRlZCIsImNvbXB1dGVkIiwiZ2xvYmFsVmVyc2lvbiIsImRlcCIsInByZXZTdWIiLCJoYXNDaGFuZ2VkIiwibmV4dFN1YiIsImwiLCJwcmV2RGVwIiwibmV4dERlcCIsInRyYWNrU3RhY2siLCJwYXVzZVRyYWNraW5nIiwicmVzZXRUcmFja2luZyIsImxhc3QiLCJjbGVhbnVwIiwiTGluayIsIkRlcCIsImRlYnVnSW5mbyIsImFkZFN1YiIsImV4dGVuZCIsImN1cnJlbnRUYWlsIiwidGFyZ2V0TWFwIiwiSVRFUkFURV9LRVkiLCJNQVBfS0VZX0lURVJBVEVfS0VZIiwiQVJSQVlfSVRFUkFURV9LRVkiLCJ0cmFjayIsInRhcmdldCIsInR5cGUiLCJrZXkiLCJkZXBzTWFwIiwidHJpZ2dlciIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJvbGRUYXJnZXQiLCJydW4iLCJ0YXJnZXRJc0FycmF5IiwiaXNBcnJheSIsImlzQXJyYXlJbmRleCIsImlzSW50ZWdlcktleSIsIm5ld0xlbmd0aCIsImtleTIiLCJpc1N5bWJvbCIsImlzTWFwIiwicmVhY3RpdmVSZWFkQXJyYXkiLCJhcnJheSIsInJhdyIsInRvUmF3IiwiaXNTaGFsbG93IiwidG9SZWFjdGl2ZSIsInNoYWxsb3dSZWFkQXJyYXkiLCJhcnIiLCJhcnJheUluc3RydW1lbnRhdGlvbnMiLCJpdGVyYXRvciIsIngiLCJ0aGlzQXJnIiwiYXBwbHkiLCJ2Iiwic2VhcmNoUHJveHkiLCJzZXBhcmF0b3IiLCJub1RyYWNraW5nIiwicmVkdWNlIiwiY29tcGFyZXIiLCJzZWxmIiwibWV0aG9kIiwid3JhcFZhbHVlIiwiaXRlciIsInJlc3VsdCIsImFycmF5UHJvdG8iLCJ3cmFwcGVkUmV0Rm4iLCJuZWVkc1dyYXAiLCJtZXRob2RGbiIsInJlc3VsdDIiLCJ3cmFwcGVkRm4iLCJpdGVtIiwiYWNjIiwicmVzIiwiaXNQcm94eSIsImlzTm9uVHJhY2thYmxlS2V5cyIsIm1ha2VNYXAiLCJidWlsdEluU3ltYm9scyIsImhhc093blByb3BlcnR5Iiwib2JqIiwiQmFzZVJlYWN0aXZlSGFuZGxlciIsIl9pc1JlYWRvbmx5IiwiX2lzU2hhbGxvdyIsInJlY2VpdmVyIiwiaXNSZWFkb25seTIiLCJpc1NoYWxsb3cyIiwic2hhbGxvd1JlYWRvbmx5TWFwIiwicmVhZG9ubHlNYXAiLCJzaGFsbG93UmVhY3RpdmVNYXAiLCJyZWFjdGl2ZU1hcCIsImlzUmVmIiwiaXNPYmplY3QiLCJyZWFkb25seSIsInJlYWN0aXZlIiwiTXV0YWJsZVJlYWN0aXZlSGFuZGxlciIsImlzT2xkVmFsdWVSZWFkb25seSIsImlzUmVhZG9ubHkiLCJoYWRLZXkiLCJoYXNPd24iLCJSZWFkb25seVJlYWN0aXZlSGFuZGxlciIsIm11dGFibGVIYW5kbGVycyIsInJlYWRvbmx5SGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlIYW5kbGVycyIsInRvU2hhbGxvdyIsImdldFByb3RvIiwiZ2V0IiwicmF3VGFyZ2V0IiwicmF3S2V5IiwiaGFzMiIsIndyYXAiLCJ0b1JlYWRvbmx5IiwiaGFzIiwic2l6ZSIsImFkZCIsInNldCIsImdldDIiLCJjaGVja0lkZW50aXR5S2V5cyIsImRlbGV0ZUVudHJ5IiwiY2xlYXIiLCJoYWRJdGVtcyIsImNyZWF0ZUZvckVhY2giLCJjYWxsYmFjayIsIm9ic2VydmVkIiwiY3JlYXRlSXRlcmFibGVNZXRob2QiLCJ0YXJnZXRJc01hcCIsImlzUGFpciIsImlzS2V5T25seSIsImlubmVySXRlcmF0b3IiLCJkb25lIiwiY3JlYXRlUmVhZG9ubHlNZXRob2QiLCJjYXBpdGFsaXplIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9ucyIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zMiIsInNoYWxsb3dJbnN0cnVtZW50YXRpb25zMiIsInJlYWRvbmx5SW5zdHJ1bWVudGF0aW9uczIiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zMiIsIm11dGFibGVJbnN0cnVtZW50YXRpb25zIiwicmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwic2hhbGxvd0luc3RydW1lbnRhdGlvbnMiLCJzaGFsbG93UmVhZG9ubHlJbnN0cnVtZW50YXRpb25zIiwiY3JlYXRlSW5zdHJ1bWVudGF0aW9uR2V0dGVyIiwic2hhbGxvdyIsImluc3RydW1lbnRhdGlvbnMiLCJtdXRhYmxlQ29sbGVjdGlvbkhhbmRsZXJzIiwicmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJzaGFsbG93UmVhZG9ubHlDb2xsZWN0aW9uSGFuZGxlcnMiLCJ0b1Jhd1R5cGUiLCJ0YXJnZXRUeXBlTWFwIiwicmF3VHlwZSIsImdldFRhcmdldFR5cGUiLCJjcmVhdGVSZWFjdGl2ZU9iamVjdCIsInNoYWxsb3dSZWFkb25seSIsImJhc2VIYW5kbGVycyIsImNvbGxlY3Rpb25IYW5kbGVycyIsInByb3h5TWFwIiwiZXhpc3RpbmdQcm94eSIsInRhcmdldFR5cGUiLCJwcm94eSIsImlzUmVhY3RpdmUiLCJtYXJrUmF3IiwiZGVmIiwiciIsInVucmVmIiwicmVmMiIsInNoYWxsb3dVbndyYXBIYW5kbGVycyIsInByb3h5UmVmcyIsIm9iamVjdFdpdGhSZWZzIiwiSU5JVElBTF9XQVRDSEVSX1ZBTFVFIiwiY2xlYW51cE1hcCIsImFjdGl2ZVdhdGNoZXIiLCJvbldhdGNoZXJDbGVhbnVwIiwiY2xlYW51cEZuIiwiZmFpbFNpbGVudGx5Iiwib3duZXIiLCJjbGVhbnVwcyIsIndhdGNoIiwic291cmNlIiwiY2IiLCJvcHRpb25zIiwiRU1QVFlfT0JKIiwiaW1tZWRpYXRlIiwiZGVlcCIsIm9uY2UiLCJzY2hlZHVsZXIiLCJhdWdtZW50Sm9iIiwiY2FsbCIsIndhcm5JbnZhbGlkU291cmNlIiwicyIsInJlYWN0aXZlR2V0dGVyIiwic291cmNlMiIsInRyYXZlcnNlIiwiZWZmZWN0IiwiZ2V0dGVyIiwiYm91bmRDbGVhbnVwIiwiZm9yY2VUcmlnZ2VyIiwiaXNNdWx0aVNvdXJjZSIsImlzRnVuY3Rpb24iLCJjdXJyZW50RWZmZWN0IiwiTk9PUCIsImJhc2VHZXR0ZXIiLCJkZXB0aCIsIndhdGNoSGFuZGxlIiwiX2NiIiwiam9iIiwiaW1tZWRpYXRlRmlyc3RSdW4iLCJjdXJyZW50V2F0Y2hlciIsImNsZWFudXAyIiwic2VlbiIsImlzU2V0IiwiaXNQbGFpbk9iamVjdCIsInN0YWNrIiwicHVzaFdhcm5pbmdDb250ZXh0Iiwidm5vZGUiLCJwb3BXYXJuaW5nQ29udGV4dCIsImlzV2FybmluZyIsIndhcm4kMSIsImluc3RhbmNlIiwiYXBwV2FybkhhbmRsZXIiLCJ0cmFjZSIsImdldENvbXBvbmVudFRyYWNlIiwiY2FsbFdpdGhFcnJvckhhbmRsaW5nIiwiYSIsIl9iIiwiZm9ybWF0Q29tcG9uZW50TmFtZSIsIndhcm5BcmdzIiwiZm9ybWF0VHJhY2UiLCJjdXJyZW50Vk5vZGUiLCJub3JtYWxpemVkU3RhY2siLCJwYXJlbnRJbnN0YW5jZSIsImxvZ3MiLCJlbnRyeSIsImZvcm1hdFRyYWNlRW50cnkiLCJyZWN1cnNlQ291bnQiLCJwb3N0Zml4IiwiaXNSb290Iiwib3BlbiIsImNsb3NlIiwiZm9ybWF0UHJvcHMiLCJwcm9wcyIsImtleXMiLCJmb3JtYXRQcm9wIiwiaXNTdHJpbmciLCJhc3NlcnROdW1iZXIiLCJ2YWwiLCJFcnJvclR5cGVTdHJpbmdzJDEiLCJoYW5kbGVFcnJvciIsImNhbGxXaXRoQXN5bmNFcnJvckhhbmRsaW5nIiwiaXNQcm9taXNlIiwidGhyb3dJbkRldiIsImNvbnRleHRWTm9kZSIsImVycm9ySGFuZGxlciIsInRocm93VW5oYW5kbGVkRXJyb3JJblByb2R1Y3Rpb24iLCJjdXIiLCJleHBvc2VkSW5zdGFuY2UiLCJlcnJvckluZm8iLCJlcnJvckNhcHR1cmVkSG9va3MiLCJsb2dFcnJvciIsInRocm93SW5Qcm9kIiwiaW5mbyIsImlzRmx1c2hpbmciLCJpc0ZsdXNoUGVuZGluZyIsInF1ZXVlIiwiZmx1c2hJbmRleCIsInBlbmRpbmdQb3N0Rmx1c2hDYnMiLCJhY3RpdmVQb3N0Rmx1c2hDYnMiLCJwb3N0Rmx1c2hJbmRleCIsInJlc29sdmVkUHJvbWlzZSIsImN1cnJlbnRGbHVzaFByb21pc2UiLCJSRUNVUlNJT05fTElNSVQiLCJuZXh0VGljayIsInAiLCJmaW5kSW5zZXJ0aW9uSW5kZXgiLCJpZCIsIm1pZGRsZSIsIm1pZGRsZUpvYiIsIm1pZGRsZUpvYklkIiwiZ2V0SWQiLCJxdWV1ZUpvYiIsImpvYklkIiwibGFzdEpvYiIsInF1ZXVlRmx1c2giLCJmbHVzaEpvYnMiLCJxdWV1ZVBvc3RGbHVzaENiIiwiZmx1c2hQb3N0Rmx1c2hDYnMiLCJkZWR1cGVkIiwiYiIsImNoZWNrUmVjdXJzaXZlVXBkYXRlcyIsImNoZWNrIiwiY291bnQiLCJjb21wb25lbnROYW1lIiwiZ2V0Q29tcG9uZW50TmFtZSIsImhtckRpcnR5Q29tcG9uZW50cyIsImdldEdsb2JhbFRoaXMiLCJ0cnlXcmFwIiwiY3JlYXRlUmVjb3JkIiwicmVyZW5kZXIiLCJyZWxvYWQiLCJtYXAiLCJpbml0aWFsRGVmIiwibm9ybWFsaXplQ2xhc3NDb21wb25lbnQiLCJjb21wb25lbnQiLCJpc0NsYXNzQ29tcG9uZW50IiwibmV3UmVuZGVyIiwicmVjb3JkIiwibmV3Q29tcCIsInVwZGF0ZUNvbXBvbmVudERlZiIsImluc3RhbmNlcyIsIm9sZENvbXAiLCJkaXJ0eUluc3RhbmNlcyIsImFyZyIsImRldnRvb2xzJDEiLCJidWZmZXIiLCJkZXZ0b29sc05vdEluc3RhbGxlZCIsImVtaXQkMSIsImV2ZW50Iiwic2V0RGV2dG9vbHNIb29rJDEiLCJob29rIiwibmV3SG9vayIsImRldnRvb2xzQ29tcG9uZW50VXBkYXRlZCIsImNyZWF0ZURldnRvb2xzQ29tcG9uZW50SG9vayIsImN1cnJlbnRSZW5kZXJpbmdJbnN0YW5jZSIsImN1cnJlbnRTY29wZUlkIiwic2V0Q3VycmVudFJlbmRlcmluZ0luc3RhbmNlIiwid2l0aEN0eCIsImN0eCIsImlzTm9uU2NvcGVkU2xvdCIsInJlbmRlckZuV2l0aENvbnRleHQiLCJzZXRCbG9ja1RyYWNraW5nIiwicHJldkluc3RhbmNlIiwid2l0aERpcmVjdGl2ZXMiLCJkaXJlY3RpdmVzIiwiZ2V0Q29tcG9uZW50UHVibGljSW5zdGFuY2UiLCJiaW5kaW5ncyIsImRpciIsIm1vZGlmaWVycyIsImlzVGVsZXBvcnQiLCJsZWF2ZUNiS2V5IiwiZW50ZXJDYktleSIsInVzZVRyYW5zaXRpb25TdGF0ZSIsInN0YXRlIiwib25Nb3VudGVkIiwib25CZWZvcmVVbm1vdW50IiwiVHJhbnNpdGlvbkhvb2tWYWxpZGF0b3IiLCJCYXNlVHJhbnNpdGlvblByb3BzVmFsaWRhdG9ycyIsInJlY3Vyc2l2ZUdldFN1YnRyZWUiLCJzdWJUcmVlIiwiQmFzZVRyYW5zaXRpb25JbXBsIiwic2xvdHMiLCJnZXRDdXJyZW50SW5zdGFuY2UiLCJjaGlsZHJlbiIsImdldFRyYW5zaXRpb25SYXdDaGlsZHJlbiIsImNoaWxkIiwiZmluZE5vbkNvbW1lbnRDaGlsZCIsInJhd1Byb3BzIiwibW9kZSIsImVtcHR5UGxhY2Vob2xkZXIiLCJpbm5lckNoaWxkIiwiZ2V0SW5uZXJDaGlsZCQxIiwiZW50ZXJIb29rcyIsInJlc29sdmVUcmFuc2l0aW9uSG9va3MiLCJob29rcyIsIkNvbW1lbnQiLCJzZXRUcmFuc2l0aW9uSG9va3MiLCJvbGRDaGlsZCIsIm9sZElubmVyQ2hpbGQiLCJpc1NhbWVWTm9kZVR5cGUiLCJsZWF2aW5nSG9va3MiLCJlbCIsImVhcmx5UmVtb3ZlIiwiZGVsYXllZExlYXZlIiwibGVhdmluZ1ZOb2Rlc0NhY2hlIiwiZ2V0TGVhdmluZ05vZGVzRm9yVHlwZSIsImhhc0ZvdW5kIiwiYyIsIkJhc2VUcmFuc2l0aW9uIiwibGVhdmluZ1ZOb2RlcyIsInBvc3RDbG9uZSIsImFwcGVhciIsInBlcnNpc3RlZCIsIm9uQmVmb3JlRW50ZXIiLCJvbkVudGVyIiwib25BZnRlckVudGVyIiwib25FbnRlckNhbmNlbGxlZCIsIm9uQmVmb3JlTGVhdmUiLCJvbkxlYXZlIiwib25BZnRlckxlYXZlIiwib25MZWF2ZUNhbmNlbGxlZCIsIm9uQmVmb3JlQXBwZWFyIiwib25BcHBlYXIiLCJvbkFmdGVyQXBwZWFyIiwib25BcHBlYXJDYW5jZWxsZWQiLCJjYWxsSG9vayIsImNhbGxBc3luY0hvb2siLCJob29rMiIsImxlYXZpbmdWTm9kZSIsImFmdGVySG9vayIsImNhbmNlbEhvb2siLCJjYWxsZWQiLCJjYW5jZWxsZWQiLCJyZW1vdmUiLCJ2bm9kZTIiLCJob29rczIiLCJpc0tlZXBBbGl2ZSIsImNsb25lVk5vZGUiLCJzaGFwZUZsYWciLCJrZWVwQ29tbWVudCIsInBhcmVudEtleSIsInJldCIsImtleWVkRnJhZ21lbnRDb3VudCIsIkZyYWdtZW50IiwiaXNBc3luY1dyYXBwZXIiLCJpbmplY3RIb29rIiwiY3VycmVudEluc3RhbmNlIiwicHJlcGVuZCIsIndyYXBwZWRIb29rIiwicmVzZXQiLCJzZXRDdXJyZW50SW5zdGFuY2UiLCJhcGlOYW1lIiwidG9IYW5kbGVyS2V5IiwiY3JlYXRlSG9vayIsImxpZmVjeWNsZSIsImlzSW5TU1JDb21wb25lbnRTZXR1cCIsIkNPTVBPTkVOVFMiLCJyZXNvbHZlQ29tcG9uZW50IiwibmFtZSIsIm1heWJlU2VsZlJlZmVyZW5jZSIsInJlc29sdmVBc3NldCIsIk5VTExfRFlOQU1JQ19DT01QT05FTlQiLCJ3YXJuTWlzc2luZyIsIkNvbXBvbmVudCIsInNlbGZOYW1lIiwiY2FtZWxpemUiLCJyZXNvbHZlIiwiZXh0cmEiLCJyZWdpc3RyeSIsInJlbmRlckxpc3QiLCJyZW5kZXJJdGVtIiwiY2FjaGUiLCJjYWNoZWQiLCJzb3VyY2VJc0FycmF5Iiwic291cmNlSXNSZWFjdGl2ZUFycmF5IiwicmVuZGVyU2xvdCIsImZhbGxiYWNrIiwibm9TbG90dGVkIiwib3BlbkJsb2NrIiwiY3JlYXRlQmxvY2siLCJjcmVhdGVWTm9kZSIsInNsb3QiLCJ2YWxpZFNsb3RDb250ZW50IiwiZW5zdXJlVmFsaWRWTm9kZSIsInJlbmRlcmVkIiwidm5vZGVzIiwiaXNWTm9kZSIsImdldFB1YmxpY0luc3RhbmNlIiwiaXNTdGF0ZWZ1bENvbXBvbmVudCIsInB1YmxpY1Byb3BlcnRpZXNNYXAiLCJyZXNvbHZlTWVyZ2VkT3B0aW9ucyIsImluc3RhbmNlV2F0Y2giLCJpc1Jlc2VydmVkUHJlZml4IiwiaGFzU2V0dXBCaW5kaW5nIiwiUHVibGljSW5zdGFuY2VQcm94eUhhbmRsZXJzIiwic2V0dXBTdGF0ZSIsImRhdGEiLCJhY2Nlc3NDYWNoZSIsImFwcENvbnRleHQiLCJub3JtYWxpemVkUHJvcHMiLCJuIiwicHVibGljR2V0dGVyIiwiY3NzTW9kdWxlIiwiZ2xvYmFsUHJvcGVydGllcyIsInByb3BzT3B0aW9ucyIsImRlc2NyaXB0b3IiLCJ1c2VTbG90cyIsImdldENvbnRleHQiLCJjcmVhdGVTZXR1cENvbnRleHQiLCJub3JtYWxpemVQcm9wc09yRW1pdHMiLCJub3JtYWxpemVkIiwiYmFzZSIsIm1peGlucyIsImV4dGVuZHNPcHRpb25zIiwiZ2xvYmFsTWl4aW5zIiwib3B0aW9uTWVyZ2VTdHJhdGVnaWVzIiwicmVzb2x2ZWQiLCJtIiwibWVyZ2VPcHRpb25zIiwidG8iLCJmcm9tIiwic3RyYXRzIiwiYXNNaXhpbiIsInN0cmF0IiwiaW50ZXJuYWxPcHRpb25NZXJnZVN0cmF0cyIsIm1lcmdlRGF0YUZuIiwibWVyZ2VFbWl0c09yUHJvcHNPcHRpb25zIiwibWVyZ2VPYmplY3RPcHRpb25zIiwibWVyZ2VBc0FycmF5IiwibWVyZ2VXYXRjaE9wdGlvbnMiLCJtZXJnZUluamVjdCIsIm5vcm1hbGl6ZUluamVjdCIsIm1lcmdlZCIsImN1cnJlbnRBcHAiLCJpbmplY3QiLCJkZWZhdWx0VmFsdWUiLCJ0cmVhdERlZmF1bHRBc0ZhY3RvcnkiLCJwcm92aWRlcyIsImludGVybmFsT2JqZWN0UHJvdG8iLCJpc0ludGVybmFsT2JqZWN0IiwicXVldWVQb3N0UmVuZGVyRWZmZWN0IiwicXVldWVFZmZlY3RXaXRoU3VzcGVuc2UiLCJzc3JDb250ZXh0S2V5IiwidXNlU1NSQ29udGV4dCIsImRvV2F0Y2giLCJmbHVzaCIsImJhc2VXYXRjaE9wdGlvbnMiLCJzc3JDbGVhbnVwIiwid2F0Y2hTdG9wSGFuZGxlIiwiaXNQcmUiLCJpc0ZpcnN0UnVuIiwid2F0Y2gkMSIsInB1YmxpY1RoaXMiLCJjcmVhdGVQYXRoR2V0dGVyIiwicGF0aCIsInNlZ21lbnRzIiwibWFya0F0dHJzQWNjZXNzZWQiLCJpc1N1c3BlbnNlIiwic3VzcGVuc2UiLCJUZXh0IiwiYmxvY2tTdGFjayIsImN1cnJlbnRCbG9jayIsImRpc2FibGVUcmFja2luZyIsImNsb3NlQmxvY2siLCJpc0Jsb2NrVHJlZUVuYWJsZWQiLCJzZXR1cEJsb2NrIiwiRU1QVFlfQVJSIiwiY3JlYXRlRWxlbWVudEJsb2NrIiwicGF0Y2hGbGFnIiwiZHluYW1pY1Byb3BzIiwiY3JlYXRlQmFzZVZOb2RlIiwibjEiLCJuMiIsImNyZWF0ZVZOb2RlV2l0aEFyZ3NUcmFuc2Zvcm0iLCJfY3JlYXRlVk5vZGUiLCJub3JtYWxpemVLZXkiLCJub3JtYWxpemVSZWYiLCJyZWYiLCJyZWZfa2V5IiwicmVmX2ZvciIsImlzQmxvY2tOb2RlIiwibmVlZEZ1bGxDaGlsZHJlbk5vcm1hbGl6YXRpb24iLCJub3JtYWxpemVDaGlsZHJlbiIsImNsb25lZCIsImd1YXJkUmVhY3RpdmVQcm9wcyIsImtsYXNzIiwic3R5bGUiLCJub3JtYWxpemVDbGFzcyIsIm5vcm1hbGl6ZVN0eWxlIiwiZXh0cmFQcm9wcyIsIm1lcmdlUmVmIiwiY2xvbmVUcmFuc2l0aW9uIiwidHJhbnNpdGlvbiIsIm1lcmdlZFByb3BzIiwibWVyZ2VQcm9wcyIsImRlZXBDbG9uZVZOb2RlIiwiY3JlYXRlVGV4dFZOb2RlIiwidGV4dCIsImZsYWciLCJjcmVhdGVDb21tZW50Vk5vZGUiLCJhc0Jsb2NrIiwic2xvdEZsYWciLCJ0b01lcmdlIiwiaXNPbiIsImV4aXN0aW5nIiwiaW5jb21pbmciLCJpbnRlcm5hbFNldEN1cnJlbnRJbnN0YW5jZSIsImciLCJyZWdpc3Rlckdsb2JhbFNldHRlciIsInNldHRlciIsInNldHRlcnMiLCJhdHRyc1Byb3h5SGFuZGxlcnMiLCJnZXRTbG90c1Byb3h5IiwiZXhwb3NlIiwiZXhwb3NlZCIsImV4cG9zZWRUeXBlIiwiYXR0cnNQcm94eSIsInNsb3RzUHJveHkiLCJjbGFzc2lmeVJFIiwiY2xhc3NpZnkiLCJzdHIiLCJpbmNsdWRlSW5mZXJyZWQiLCJpbmZlckZyb21SZWdpc3RyeSIsImgiLCJwcm9wc09yQ2hpbGRyZW4iLCJpbml0Q3VzdG9tRm9ybWF0dGVyIiwidnVlU3R5bGUiLCJudW1iZXJTdHlsZSIsInN0cmluZ1N0eWxlIiwia2V5d29yZFN0eWxlIiwiZm9ybWF0dGVyIiwiZ2VuUmVmRmxhZyIsImZvcm1hdFZhbHVlIiwiZm9ybWF0SW5zdGFuY2UiLCJibG9ja3MiLCJjcmVhdGVJbnN0YW5jZUJsb2NrIiwiZXh0cmFjdEtleXMiLCJpbmplY3RlZCIsImFzUmF3IiwiQ29tcCIsImV4dHJhY3RlZCIsImlzS2V5T2ZUeXBlIiwib3B0cyIsInBvbGljeSIsInR0IiwiVFJBTlNJVElPTiIsIkFOSU1BVElPTiIsInZ0Y0tleSIsIkRPTVRyYW5zaXRpb25Qcm9wc1ZhbGlkYXRvcnMiLCJUcmFuc2l0aW9uUHJvcHNWYWxpZGF0b3JzIiwiVHJhbnNpdGlvbiIsInQiLCJyZXNvbHZlVHJhbnNpdGlvblByb3BzIiwiaDIiLCJoYXNFeHBsaWNpdENhbGxiYWNrIiwiYmFzZVByb3BzIiwiZHVyYXRpb24iLCJlbnRlckZyb21DbGFzcyIsImVudGVyQWN0aXZlQ2xhc3MiLCJlbnRlclRvQ2xhc3MiLCJhcHBlYXJGcm9tQ2xhc3MiLCJhcHBlYXJBY3RpdmVDbGFzcyIsImFwcGVhclRvQ2xhc3MiLCJsZWF2ZUZyb21DbGFzcyIsImxlYXZlQWN0aXZlQ2xhc3MiLCJsZWF2ZVRvQ2xhc3MiLCJkdXJhdGlvbnMiLCJub3JtYWxpemVEdXJhdGlvbiIsImVudGVyRHVyYXRpb24iLCJsZWF2ZUR1cmF0aW9uIiwiZmluaXNoRW50ZXIiLCJpc0FwcGVhciIsInJlbW92ZVRyYW5zaXRpb25DbGFzcyIsImZpbmlzaExlYXZlIiwibWFrZUVudGVySG9vayIsIm5leHRGcmFtZSIsImFkZFRyYW5zaXRpb25DbGFzcyIsIndoZW5UcmFuc2l0aW9uRW5kcyIsImZvcmNlUmVmbG93IiwiTnVtYmVyT2YiLCJ0b051bWJlciIsImNscyIsIl92dGMiLCJlbmRJZCIsImV4cGVjdGVkVHlwZSIsImV4cGxpY2l0VGltZW91dCIsInJlc29sdmVJZk5vdFN0YWxlIiwidGltZW91dCIsInByb3BDb3VudCIsImdldFRyYW5zaXRpb25JbmZvIiwiZW5kRXZlbnQiLCJlbmRlZCIsIm9uRW5kIiwic3R5bGVzIiwiZ2V0U3R5bGVQcm9wZXJ0aWVzIiwidHJhbnNpdGlvbkRlbGF5cyIsInRyYW5zaXRpb25EdXJhdGlvbnMiLCJ0cmFuc2l0aW9uVGltZW91dCIsImdldFRpbWVvdXQiLCJhbmltYXRpb25EZWxheXMiLCJhbmltYXRpb25EdXJhdGlvbnMiLCJhbmltYXRpb25UaW1lb3V0IiwiaGFzVHJhbnNmb3JtIiwiZGVsYXlzIiwiZCIsInRvTXMiLCJ2U2hvd09yaWdpbmFsRGlzcGxheSIsInZTaG93SGlkZGVuIiwidlNob3ciLCJzZXREaXNwbGF5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZXIiLCJnZXRNb2RlbEFzc2lnbmVyIiwiaW52b2tlQXJyYXlGbnMiLCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJvbkNvbXBvc2l0aW9uRW5kIiwiYXNzaWduS2V5Iiwidk1vZGVsVGV4dCIsImxhenkiLCJ0cmltIiwibnVtYmVyIiwiY2FzdFRvTnVtYmVyIiwiZG9tVmFsdWUiLCJsb29zZVRvTnVtYmVyIiwiZWxWYWx1ZSIsInZNb2RlbENoZWNrYm94IiwiXyIsIm1vZGVsVmFsdWUiLCJlbGVtZW50VmFsdWUiLCJnZXRWYWx1ZSIsImNoZWNrZWQiLCJhc3NpZ24iLCJsb29zZUluZGV4T2YiLCJmb3VuZCIsImZpbHRlcmVkIiwiZ2V0Q2hlY2tib3hWYWx1ZSIsInNldENoZWNrZWQiLCJiaW5kaW5nIiwibG9vc2VFcXVhbCIsInZNb2RlbFJhZGlvIiwidk1vZGVsU2VsZWN0IiwiaXNTZXRNb2RlbCIsInNlbGVjdGVkVmFsIiwibyIsInNldFNlbGVjdGVkIiwiX2JpbmRpbmciLCJpc011bHRpcGxlIiwiaXNBcnJheVZhbHVlIiwib3B0aW9uIiwib3B0aW9uVmFsdWUiLCJvcHRpb25UeXBlIiwidk1vZGVsRHluYW1pYyIsImNhbGxNb2RlbEhvb2siLCJwcmV2Vk5vZGUiLCJyZXNvbHZlRHluYW1pY01vZGVsIiwidGFnTmFtZSIsInN5c3RlbU1vZGlmaWVycyIsIm1vZGlmaWVyR3VhcmRzIiwid2l0aE1vZGlmaWVycyIsImNhY2hlS2V5IiwiZ3VhcmQiLCJpbml0RGV2IiwiX3NmY19tYWluIiwid2Vla2RheU5hbWVzIiwibW9udGhOYW1lcyIsImdldExvY2FsZU5hbWVzIiwidXBkYXRlIiwic3RlcCIsImN1cnJlbnRWYWx1ZSIsImVudGVyIiwic3RhcnRZZWFyIiwiZmlyc3REYXlXZWVrIiwibnVtRGF5cyIsInByZXZNb250aCIsInByZXZNb250aE51bURheXMiLCJub3ciLCJpc0RheSIsIm5leHRNb250aE5lZWQiLCJuZXh0TW9udGgiLCJsb2NhbGVOYW1lcyIsIm5hbWVzIiwiYWRkRXZlbnRzIiwidGFyZ2V0cyIsImV2ZW50cyIsImFzQXJyYXkiLCJjb21iaW5lRXZlbnRzIiwiZ2V0S2V5IiwiZ2V0S2V5TmF2aWdhdGlvbiIsImdldFRhcmdldCIsImNsYXNzZXMiLCJoeXBoZW5hdGUiLCJzaG93IiwicG9wdXAiLCJfYyIsImJvdW5kcyIsInRyaWdnZXJMZWZ0IiwidHJpZ2dlclRvcCIsInRyaWdnZXJXaWR0aCIsInRyaWdnZXJIZWlnaHQiLCJwb3B1cFdpZHRoIiwicG9wdXBIZWlnaHQiLCJwYXJ0MSIsInBhcnQyIiwid2luV2lkdGgiLCJ3aW5IZWlnaHQiLCJsZWZ0IiwidG9wIiwidHJpZ2dlckJvdW5kcyIsInBhcmVudCIsImlucHV0IiwiYXR0cmlidXRlcyIsIm1pbiIsIm1heCIsImdldExlbmd0aCIsIl9vcGVuQmxvY2siLCJfY3JlYXRlRWxlbWVudEJsb2NrIiwic2V0U2VsZWN0aW9uIiwiZ2V0U2VsZWN0aW9uIiwiVHJpZ2dlciIsIkNhbGVuZGFyIiwiSW5wdXRGaWVsZCIsIkljb24iLCJkZWZhdWx0Rm9ybWF0cyIsImZvcm1hdCIsImZvY3VzIiwiZ2V0RGF0ZVBhcnQiLCJjYWxlbmRhciIsInRvZ2dsZSIsInNlbGVjdGlvbiIsInNtb290aCIsInNjcm9sbCIsImxpbmVIZWlnaHQiLCJkaXN0YW5jZSIsImlzRGlnaXQiLCJjaGFyIiwiRGF0ZVBpY2tlciIsIlRpbWVQaWNrZXIiLCJkaXNhYmxlZCIsImFzc2lnbkRlZXBseSIsInNob3dQcmV2Iiwic2hvd05leHQiLCJjdXJyZW50UGFnZSIsIm51bVBhZ2VzIiwic2hvd0xlbmd0aCIsImJ1dHRvbnMiLCJwYWdlIiwiYnV0dG9uIiwidW5jaGVja2VkIiwiVHJhbnNpdGlvbkhlaWdodCIsImVuYWJsZWQiLCJjcmVhdGVFbGVtZW50Iiwic2V0U3R5bGUiLCJlbGVtZW50IiwibmV4dFRpbWVvdXQiLCJmb3JjZVJlcGFpbnQiLCJ3aWR0aCIsImhlaWdodCIsImhhc1ZOb2RlQ29udGVudCIsImhhc1Nsb3RDb250ZW50Il0sIm1hcHBpbmdzIjoid1ZBQU8sU0FBU0EsR0FBYUMsRUFBTSxDQUNqQyxNQUFPLENBQ0wsTUFBTUEsR0FBQSxZQUFBQSxFQUFNLGdCQUFpQixFQUM3QixPQUFPQSxHQUFBLFlBQUFBLEVBQU0sYUFBYyxFQUMzQixLQUFLQSxHQUFBLFlBQUFBLEVBQU0sWUFBYSxFQUN4QixNQUFNQSxHQUFBLFlBQUFBLEVBQU0sYUFBYyxFQUMxQixRQUFRQSxHQUFBLFlBQUFBLEVBQU0sZUFBZ0IsRUFDOUIsUUFBUUEsR0FBQSxZQUFBQSxFQUFNLGVBQWdCLEVBQzlCLGFBQWFBLEdBQUEsWUFBQUEsRUFBTSxvQkFBcUIsQ0FDekMsQ0FDSCxDQUVPLFNBQVNDLEdBQVVELEVB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LENBRUFtZCxHQUFpQixNQUFRLENBQ3ZCLFFBQVMsQ0FBRSxLQUFNLFFBQVMsUUFBUyxFQUFLLENBQzFDLEVBRUssTUFBQXRGLEdBQWFzRixHQUVaRyxHQUFXLENBQUNDLEVBQVMxUSxJQUFVLE9BQU8sT0FBTzBRLEVBQVEsTUFBTzFRLENBQUssRUFFakUyUSxHQUFjMXJCLEdBQVksV0FBV0EsRUFBVSxDQUFDLEVBR2hEMnJCLEdBQWVGLEdBQVcsaUJBQWlCQSxDQUFPLEVBQUUsT0FFcERwa0IsR0FBUSxDQUNaLEtBQU0sY0FFTixhQUFhb2tCLEVBQVMsQ0FJcEJDLEdBQVksSUFBTUYsR0FBU0MsRUFBUyxDQUFFLE9BQVEsSUFBSyxDQUFDLENBQUMsQ0FDdEQsRUFFRCxRQUFRQSxFQUFTLENBS2YsS0FBTSxDQUFFLE1BQUFHLEdBQVUsaUJBQWlCSCxDQUFPLEVBQzFDRCxHQUFTQyxFQUFTLENBQ2hCLE1BQUFHLEVBQ0EsU0FBVSxXQUNWLFdBQVksU0FDWixPQUFRLE9BQ1QsRUFDREYsR0FBWSxJQUFNLENBQ2hCLEtBQU0sQ0FBRSxPQUFBRyxHQUFXLGlCQUFpQkosQ0FBTyxFQUMzQ0QsR0FBU0MsRUFBUyxDQUNoQixNQUFPLEtBQ1AsU0FBVSxLQUNWLFdBQVksS0FDWixPQUFRLEVBQ1QsRUFDREUsR0FBYUYsQ0FBTyxFQUNwQkMsR0FBWSxJQUFNRixHQUFTQyxFQUFTLENBQUUsT0FBQUksQ0FBUSxDQUFBLENBQUMsRUFDaEQsQ0FDRixFQUVELFFBQVFKLEVBQVMsQ0FDZixLQUFNLENBQUUsT0FBQUksR0FBVyxpQkFBaUJKLENBQU8sRUFDM0NELEdBQVNDLEVBQVMsQ0FBRSxPQUFBSSxFQUFRLEVBQzVCRixHQUFhRixDQUFPLEVBQ3BCQyxHQUFZLElBQU1GLEdBQVNDLEVBQVMsQ0FBRSxPQUFRLENBQUEsQ0FBRyxDQUFDLENBQ3BELENBQ0YsRUM3RE8sU0FBU0ssR0FBZ0JubUIsRUFBTyxDQUNyQyxPQUFPQSxHQUFTMGhCLEVBQU8sUUFBQzFoQixDQUFLLEVBQUUsS0FBS0EsR0FBU0EsRUFBTSxPQUFTcUosQ0FBTyxDQUNyRSxDQUVPLFNBQVMrYyxHQUFlelgsRUFBTWpOLEVBQVEsR0FBSSxDQUMvQyxPQUFBaU4sRUFBTzlNLEVBQVEsU0FBQzhNLENBQUksRUFBSXlCLEdBQVUsRUFBQ3pCLENBQUksRUFBSUEsRUFDcEN3WCxHQUFnQnhYLEdBQUEsWUFBQUEsRUFBT2pOLEVBQU0sQ0FDdEMsQ0FFTyxTQUFTbk0sR0FBSWhGLEVBQU8sQ0FDekIsT0FBT29NLEdBQVEsQ0FBRSxNQUFBcE0sRUFBTyxDQUMxQiIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlsxLDIsMyw0XX0=