@worktif/runtime 0.3.0-edge.7 → 0.3.0-edge.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/dist/bin/templates/runtime-web/basic/package.json +1 -1
- package/out/dist/lambda/bundle.js +9 -9
- package/out/dist/lib/index.js +1 -1
- package/out/dist/lib/lib/runtime-web/pureweb.d.ts +1 -1
- package/out/dist/src/core/services/runtime-extensions/runtime-extensions.service.d.ts +2 -7
- package/out/dist/src/core/services/runtime-extensions/runtime-extensions.service.d.ts.map +1 -1
- package/out/dist/src/lib/runtime-web/pureweb.d.ts +1 -1
- package/package.json +2 -2
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
"use strict";var qn=Object.create;var we=Object.defineProperty;var Dt=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Kn=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty;var Zn=(n,e)=>()=>(n&&(e=n(n=0)),e);var Jn=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ke=(n,e)=>{for(var t in e)we(n,t,{get:e[t],enumerable:!0})},xe=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Gn(e))!Xn.call(n,r)&&r!==t&&we(n,r,{get:()=>e[r],enumerable:!(i=Dt(e,r))||i.enumerable});return n},k=(n,e,t)=>(xe(n,e,"default"),t&&xe(t,e,"default")),Z=(n,e,t)=>(t=n!=null?qn(Kn(n)):{},xe(e||!n||!n.__esModule?we(t,"default",{value:n,enumerable:!0}):t,n)),Bt=n=>xe(we({},"__esModule",{value:!0}),n),_=(n,e,t,i)=>{for(var r=i>1?void 0:i?Dt(e,t):e,a=n.length-1,d;a>=0;a--)(d=n[a])&&(r=(i?d(e,t,r):d(r))||r);return i&&r&&we(e,t,r),r};var H=Jn(()=>{var Tt;(function(n){(function(e){var t=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:f(),i=r(n);typeof t.Reflect<"u"&&(i=r(t.Reflect,i)),e(i,t),typeof t.Reflect>"u"&&(t.Reflect=n);function r(y,m){return function(w,I){Object.defineProperty(y,w,{configurable:!0,writable:!0,value:I}),m&&m(w,I)}}function a(){try{return Function("return this;")()}catch{}}function d(){try{return(0,eval)("(function() { return this; })()")}catch{}}function f(){return a()||d()}})(function(e,t){var i=Object.prototype.hasOwnProperty,r=typeof Symbol=="function",a=r&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",d=r&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",f=typeof Object.create=="function",y={__proto__:[]}instanceof Array,m=!f&&!y,w={create:f?function(){return ze(Object.create(null))}:y?function(){return ze({__proto__:null})}:function(){return ze({})},has:m?function(o,s){return i.call(o,s)}:function(o,s){return s in o},get:m?function(o,s){return i.call(o,s)?o[s]:void 0}:function(o,s){return o[s]}},I=Object.getPrototypeOf(Function),A=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Un(),x=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:zn(),j=typeof WeakMap=="function"?WeakMap:Vn(),E=r?Symbol.for("@reflect-metadata:registry"):void 0,J=Ln(),M=Fn(J);function K(o,s,c,u){if(S(c)){if(!It(o))throw new TypeError;if(!Ct(s))throw new TypeError;return Dn(o,s)}else{if(!It(o))throw new TypeError;if(!B(s))throw new TypeError;if(!B(u)&&!S(u)&&!le(u))throw new TypeError;return le(u)&&(u=void 0),c=Q(c),Bn(o,s,c,u)}}e("decorate",K);function de(o,s){function c(u,p){if(!B(u))throw new TypeError;if(!S(p)&&!Nn(p))throw new TypeError;pt(o,s,u,p)}return c}e("metadata",de);function me(o,s,c,u){if(!B(c))throw new TypeError;return S(u)||(u=Q(u)),pt(o,s,c,u)}e("defineMetadata",me);function pe(o,s,c){if(!B(s))throw new TypeError;return S(c)||(c=Q(c)),gt(o,s,c)}e("hasMetadata",pe);function Mn(o,s,c){if(!B(s))throw new TypeError;return S(c)||(c=Q(c)),Fe(o,s,c)}e("hasOwnMetadata",Mn);function Rn(o,s,c){if(!B(s))throw new TypeError;return S(c)||(c=Q(c)),vt(o,s,c)}e("getMetadata",Rn);function xn(o,s,c){if(!B(s))throw new TypeError;return S(c)||(c=Q(c)),mt(o,s,c)}e("getOwnMetadata",xn);function kn(o,s){if(!B(o))throw new TypeError;return S(s)||(s=Q(s)),yt(o,s)}e("getMetadataKeys",kn);function An(o,s){if(!B(o))throw new TypeError;return S(s)||(s=Q(s)),wt(o,s)}e("getOwnMetadataKeys",An);function En(o,s,c){if(!B(s))throw new TypeError;if(S(c)||(c=Q(c)),!B(s))throw new TypeError;S(c)||(c=Q(c));var u=ye(s,c,!1);return S(u)?!1:u.OrdinaryDeleteMetadata(o,s,c)}e("deleteMetadata",En);function Dn(o,s){for(var c=o.length-1;c>=0;--c){var u=o[c],p=u(s);if(!S(p)&&!le(p)){if(!Ct(p))throw new TypeError;s=p}}return s}function Bn(o,s,c,u){for(var p=o.length-1;p>=0;--p){var T=o[p],L=T(s,c,u);if(!S(L)&&!le(L)){if(!B(L))throw new TypeError;u=L}}return u}function gt(o,s,c){var u=Fe(o,s,c);if(u)return!0;var p=Ue(s);return le(p)?!1:gt(o,p,c)}function Fe(o,s,c){var u=ye(s,c,!1);return S(u)?!1:St(u.OrdinaryHasOwnMetadata(o,s,c))}function vt(o,s,c){var u=Fe(o,s,c);if(u)return mt(o,s,c);var p=Ue(s);if(!le(p))return vt(o,p,c)}function mt(o,s,c){var u=ye(s,c,!1);if(!S(u))return u.OrdinaryGetOwnMetadata(o,s,c)}function pt(o,s,c,u){var p=ye(c,u,!0);p.OrdinaryDefineOwnMetadata(o,s,c,u)}function yt(o,s){var c=wt(o,s),u=Ue(o);if(u===null)return c;var p=yt(u,s);if(p.length<=0)return c;if(c.length<=0)return p;for(var T=new x,L=[],C=0,l=c;C<l.length;C++){var h=l[C],g=T.has(h);g||(T.add(h),L.push(h))}for(var v=0,R=p;v<R.length;v++){var h=R[v],g=T.has(h);g||(T.add(h),L.push(h))}return L}function wt(o,s){var c=ye(o,s,!1);return c?c.OrdinaryOwnMetadataKeys(o,s):[]}function bt(o){if(o===null)return 1;switch(typeof o){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return o===null?1:6;default:return 6}}function S(o){return o===void 0}function le(o){return o===null}function Tn(o){return typeof o=="symbol"}function B(o){return typeof o=="object"?o!==null:typeof o=="function"}function On(o,s){switch(bt(o)){case 0:return o;case 1:return o;case 2:return o;case 3:return o;case 4:return o;case 5:return o}var c=s===3?"string":s===5?"number":"default",u=Mt(o,a);if(u!==void 0){var p=u.call(o,c);if(B(p))throw new TypeError;return p}return _n(o,c==="default"?"number":c)}function _n(o,s){if(s==="string"){var c=o.toString;if(fe(c)){var u=c.call(o);if(!B(u))return u}var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!B(u))return u}}else{var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!B(u))return u}var T=o.toString;if(fe(T)){var u=T.call(o);if(!B(u))return u}}throw new TypeError}function St(o){return!!o}function Pn(o){return""+o}function Q(o){var s=On(o,3);return Tn(s)?s:Pn(s)}function It(o){return Array.isArray?Array.isArray(o):o instanceof Object?o instanceof Array:Object.prototype.toString.call(o)==="[object Array]"}function fe(o){return typeof o=="function"}function Ct(o){return typeof o=="function"}function Nn(o){switch(bt(o)){case 3:return!0;case 4:return!0;default:return!1}}function $e(o,s){return o===s||o!==o&&s!==s}function Mt(o,s){var c=o[s];if(c!=null){if(!fe(c))throw new TypeError;return c}}function Rt(o){var s=Mt(o,d);if(!fe(s))throw new TypeError;var c=s.call(o);if(!B(c))throw new TypeError;return c}function xt(o){return o.value}function kt(o){var s=o.next();return s.done?!1:s}function At(o){var s=o.return;s&&s.call(o)}function Ue(o){var s=Object.getPrototypeOf(o);if(typeof o!="function"||o===I||s!==I)return s;var c=o.prototype,u=c&&Object.getPrototypeOf(c);if(u==null||u===Object.prototype)return s;var p=u.constructor;return typeof p!="function"||p===o?s:p}function jn(){var o;!S(E)&&typeof t.Reflect<"u"&&!(E in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(o=$n(t.Reflect));var s,c,u,p=new j,T={registerProvider:L,getProvider:l,setProvider:g};return T;function L(v){if(!Object.isExtensible(T))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case o===v:break;case S(s):s=v;break;case s===v:break;case S(c):c=v;break;case c===v:break;default:u===void 0&&(u=new x),u.add(v);break}}function C(v,R){if(!S(s)){if(s.isProviderFor(v,R))return s;if(!S(c)){if(c.isProviderFor(v,R))return s;if(!S(u))for(var D=Rt(u);;){var O=kt(D);if(!O)return;var X=xt(O);if(X.isProviderFor(v,R))return At(D),X}}}if(!S(o)&&o.isProviderFor(v,R))return o}function l(v,R){var D=p.get(v),O;return S(D)||(O=D.get(R)),S(O)&&(O=C(v,R),S(O)||(S(D)&&(D=new A,p.set(v,D)),D.set(R,O))),O}function h(v){if(S(v))throw new TypeError;return s===v||c===v||!S(u)&&u.has(v)}function g(v,R,D){if(!h(D))throw new Error("Metadata provider not registered.");var O=l(v,R);if(O!==D){if(!S(O))return!1;var X=p.get(v);S(X)&&(X=new A,p.set(v,X)),X.set(R,D)}return!0}}function Ln(){var o;return!S(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&(o=t.Reflect[E]),S(o)&&(o=jn()),!S(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,E,{enumerable:!1,configurable:!1,writable:!1,value:o}),o}function Fn(o){var s=new j,c={isProviderFor:function(h,g){var v=s.get(h);return S(v)?!1:v.has(g)},OrdinaryDefineOwnMetadata:L,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:T,OrdinaryOwnMetadataKeys:C,OrdinaryDeleteMetadata:l};return J.registerProvider(c),c;function u(h,g,v){var R=s.get(h),D=!1;if(S(R)){if(!v)return;R=new A,s.set(h,R),D=!0}var O=R.get(g);if(S(O)){if(!v)return;if(O=new A,R.set(g,O),!o.setProvider(h,g,c))throw R.delete(g),D&&s.delete(h),new Error("Wrong provider for target.")}return O}function p(h,g,v){var R=u(g,v,!1);return S(R)?!1:St(R.has(h))}function T(h,g,v){var R=u(g,v,!1);if(!S(R))return R.get(h)}function L(h,g,v,R){var D=u(v,R,!0);D.set(h,g)}function C(h,g){var v=[],R=u(h,g,!1);if(S(R))return v;for(var D=R.keys(),O=Rt(D),X=0;;){var Et=kt(O);if(!Et)return v.length=X,v;var Wn=xt(Et);try{v[X]=Wn}catch(Hn){try{At(O)}finally{throw Hn}}X++}}function l(h,g,v){var R=u(g,v,!1);if(S(R)||!R.delete(h))return!1;if(R.size===0){var D=s.get(g);S(D)||(D.delete(v),D.size===0&&s.delete(D))}return!0}}function $n(o){var s=o.defineMetadata,c=o.hasOwnMetadata,u=o.getOwnMetadata,p=o.getOwnMetadataKeys,T=o.deleteMetadata,L=new j,C={isProviderFor:function(l,h){var g=L.get(l);return!S(g)&&g.has(h)?!0:p(l,h).length?(S(g)&&(g=new x,L.set(l,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:s,OrdinaryHasOwnMetadata:c,OrdinaryGetOwnMetadata:u,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:T};return C}function ye(o,s,c){var u=J.getProvider(o,s);if(!S(u))return u;if(c){if(J.setProvider(o,s,M))return M;throw new Error("Illegal state.")}}function Un(){var o={},s=[],c=(function(){function C(l,h,g){this._index=0,this._keys=l,this._values=h,this._selector=g}return C.prototype["@@iterator"]=function(){return this},C.prototype[d]=function(){return this},C.prototype.next=function(){var l=this._index;if(l>=0&&l<this._keys.length){var h=this._selector(this._keys[l],this._values[l]);return l+1>=this._keys.length?(this._index=-1,this._keys=s,this._values=s):this._index++,{value:h,done:!1}}return{value:void 0,done:!0}},C.prototype.throw=function(l){throw this._index>=0&&(this._index=-1,this._keys=s,this._values=s),l},C.prototype.return=function(l){return this._index>=0&&(this._index=-1,this._keys=s,this._values=s),{value:l,done:!0}},C})(),u=(function(){function C(){this._keys=[],this._values=[],this._cacheKey=o,this._cacheIndex=-2}return Object.defineProperty(C.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),C.prototype.has=function(l){return this._find(l,!1)>=0},C.prototype.get=function(l){var h=this._find(l,!1);return h>=0?this._values[h]:void 0},C.prototype.set=function(l,h){var g=this._find(l,!0);return this._values[g]=h,this},C.prototype.delete=function(l){var h=this._find(l,!1);if(h>=0){for(var g=this._keys.length,v=h+1;v<g;v++)this._keys[v-1]=this._keys[v],this._values[v-1]=this._values[v];return this._keys.length--,this._values.length--,$e(l,this._cacheKey)&&(this._cacheKey=o,this._cacheIndex=-2),!0}return!1},C.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=o,this._cacheIndex=-2},C.prototype.keys=function(){return new c(this._keys,this._values,p)},C.prototype.values=function(){return new c(this._keys,this._values,T)},C.prototype.entries=function(){return new c(this._keys,this._values,L)},C.prototype["@@iterator"]=function(){return this.entries()},C.prototype[d]=function(){return this.entries()},C.prototype._find=function(l,h){if(!$e(this._cacheKey,l)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if($e(this._keys[g],l)){this._cacheIndex=g;break}}return this._cacheIndex<0&&h&&(this._cacheIndex=this._keys.length,this._keys.push(l),this._values.push(void 0)),this._cacheIndex},C})();return u;function p(C,l){return C}function T(C,l){return l}function L(C,l){return[C,l]}}function zn(){var o=(function(){function s(){this._map=new A}return Object.defineProperty(s.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),s.prototype.has=function(c){return this._map.has(c)},s.prototype.add=function(c){return this._map.set(c,c),this},s.prototype.delete=function(c){return this._map.delete(c)},s.prototype.clear=function(){this._map.clear()},s.prototype.keys=function(){return this._map.keys()},s.prototype.values=function(){return this._map.keys()},s.prototype.entries=function(){return this._map.entries()},s.prototype["@@iterator"]=function(){return this.keys()},s.prototype[d]=function(){return this.keys()},s})();return o}function Vn(){var o=16,s=w.create(),c=u();return(function(){function l(){this._key=u()}return l.prototype.has=function(h){var g=p(h,!1);return g!==void 0?w.has(g,this._key):!1},l.prototype.get=function(h){var g=p(h,!1);return g!==void 0?w.get(g,this._key):void 0},l.prototype.set=function(h,g){var v=p(h,!0);return v[this._key]=g,this},l.prototype.delete=function(h){var g=p(h,!1);return g!==void 0?delete g[this._key]:!1},l.prototype.clear=function(){this._key=u()},l})();function u(){var l;do l="@@WeakMap@@"+C();while(w.has(s,l));return s[l]=!0,l}function p(l,h){if(!i.call(l,c)){if(!h)return;Object.defineProperty(l,c,{value:w.create()})}return l[c]}function T(l,h){for(var g=0;g<h;++g)l[g]=Math.random()*255|0;return l}function L(l){if(typeof Uint8Array=="function"){var h=new Uint8Array(l);return typeof crypto<"u"?crypto.getRandomValues(h):typeof msCrypto<"u"?msCrypto.getRandomValues(h):T(h,l),h}return T(new Array(l),l)}function C(){var l=L(o);l[6]=l[6]&79|64,l[8]=l[8]&191|128;for(var h="",g=0;g<o;++g){var v=l[g];(g===4||g===6||g===8)&&(h+="-"),v<16&&(h+="0"),h+=v.toString(16).toLowerCase()}return h}}function ze(o){return o.__=void 0,delete o.__,o}})})(Tt||(Tt={}))});var Ft={};ke(Ft,{RuntimeWebLambdaHandler:()=>Se});var jt,Lt,Se,Ge=Zn(()=>{"use strict";jt=require("@worktif/utils"),Lt=require("@worktif/purews"),Se=class extends Lt.LambdaApi{constructor(t,i,r){super();this.definition=t;this.container=i;this.factory=r;this.logger=(0,jt.logger)({serviceName:"@core/runtime-web/factory/runtime-web-lambda-handler",persistentLogAttributes:{lambdaId:t.id,service:t.service}}),this.userHandler=this.createUserHandler(),this.logger.info("RuntimeWebLambdaHandler initialized",{lambdaId:t.id,service:t.service,dependencyCount:t.ties.length})}async handler(t,i){try{this.logger.debug("Handler invocation started",{eventType:typeof t,contextType:typeof i});let r=await this.userHandler(t,i);return this.logger.debug("Handler invocation completed successfully",{resultType:typeof r}),r}catch(r){throw this.logger.error("Handler invocation failed",{error:r instanceof Error?r.message:String(r),stack:r instanceof Error?r.stack:void 0}),r}}createUserHandler(){try{let t=this.factory.injectDependencies(this.definition.ties,this.container);this.logger.debug("Dependencies resolved for user handler",{dependencyKeys:Object.keys(t)});let i=this.definition.handler(t),r=this.factory.wrapHandler(i,{id:this.definition.id||"unknown",service:this.definition.service||"unknown"});return this.logger.info("User handler created and wrapped successfully"),r}catch(t){throw this.logger.error("Failed to create user handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),new Error(`Failed to create user handler for Lambda '${this.definition.id}': ${t instanceof Error?t.message:String(t)}`)}}getDefinition(){return this.definition}getContainer(){return this.container}isReady(){return this.userHandler!==void 0}}});var F={};ke(F,{ContainerRegistry:()=>ae,DIContainerError:()=>Y,LambdaHandlerFactory:()=>re,LambdaPipeline:()=>ft,MicroserviceRegistrar:()=>ce,MissingServiceError:()=>ee,PureContainerFactory:()=>ie,RuntimeContainer:()=>ve,RuntimeDetector:()=>Be,RuntimeDi:()=>ht,RuntimeExtensions:()=>z,RuntimeWebLambdaHandler:()=>Se,TiesRegistrar:()=>ne,TiesRegistrationError:()=>te,errorWrapper:()=>We,fullWrapper:()=>Oe,getBrowserMetadata:()=>Ae,getCDKMetadata:()=>De,getLambdaMetadata:()=>Ee,loggingWrapper:()=>Ve,timingWrapper:()=>He});module.exports=Bt(F);k(F,require("@worktif/purenow/lambda"),module.exports);var so=Z(H());function Ae(){try{if(typeof window>"u"||typeof navigator>"u")throw new Error("Browser APIs not available - window or navigator is undefined");return{userAgent:navigator.userAgent,url:window.location.href,viewport:{width:window.innerWidth,height:window.innerHeight}}}catch(n){throw new Error(`Failed to collect browser metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}function Ee(){try{let n=process.env.AWS_LAMBDA_FUNCTION_NAME;if(!n)throw new Error("AWS_LAMBDA_FUNCTION_NAME environment variable is required");let e=parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE||"128",10);return{functionName:n,version:process.env.AWS_LAMBDA_FUNCTION_VERSION||"$LATEST",region:process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"us-east-1",memoryLimit:isNaN(e)?128:e,requestId:process.env.AWS_LAMBDA_LOG_STREAM_NAME}}catch(n){throw new Error(`Failed to collect Lambda metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}function De(){try{return{account:process.env.CDK_DEFAULT_ACCOUNT||"unknown",region:process.env.CDK_DEFAULT_REGION||"us-east-1",cdkVersion:process.env.CDK_VERSION,nodeVersion:process.version}}catch(n){throw new Error(`Failed to collect CDK metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}var Be=class{detect(){if(this.isBrowser())return{type:"browser",metadata:Ae()};if(this.isLambda())return{type:"lambda",metadata:Ee()};if(this.isCDK())return{type:"cdk",metadata:De()};throw new Error("Unable to detect runtime environment. Expected browser (window object), Lambda (AWS_LAMBDA_FUNCTION_NAME), or CDK (PURENOW_MODE=cdk or CDK environment variables).")}isBrowser(){return typeof window<"u"}isLambda(){return!!process.env.AWS_LAMBDA_FUNCTION_NAME}isCDK(){return process.env.PURENOW_MODE==="cdk"||process.env.CDK_DEFAULT_ACCOUNT||process.env.CDK_DEFAULT_REGION?!0:process.argv.some(e=>e.includes("cdk")||e.includes("synth"))}};var Ot=require("@worktif/utils");var Y=class extends Error{constructor(e,t){super(`DI Container '${e}': ${t}`),this.name="DIContainerError",Error.captureStackTrace(this,this.constructor)}},te=class extends Error{constructor(e,t){super(`Ties registration failed for '${e}': ${t}`),this.name="TiesRegistrationError",Error.captureStackTrace(this,this.constructor)}},ee=class extends Error{constructor(e,t){super(`Service '${e}' not found in container '${t}'`),this.name="MissingServiceError",Error.captureStackTrace(this,this.constructor)}};var ne=class{registerTies(e,t){for(let i of t)try{let r=new i;if(typeof r.register!="function")throw new te(i.name,"Ties class must implement register(container: PureContainer<string>) method");r.register(e)}catch(r){throw r instanceof te?r:new te(i.name,`Failed to instantiate or register Ties class: ${r instanceof Error?r.message:String(r)}`)}}validateContainer(e,t){let i=[];for(let r of t)try{e.run(r)}catch{i.push(r)}if(i.length>0)throw new Error(`Required services are not registered in container: ${i.join(", ")}`)}extractServiceNames(e){let t=[];for(let i of e)try{let r=new i;if(typeof r.getServiceNames=="function"){let a=r.getServiceNames();Array.isArray(a)&&t.push(...a)}}catch{}return t}};ne=_([(0,Ot.purable)()],ne);var be=require("@worktif/utils");var ie=class{constructor(){this.tiesRegistrar=new ne}createMicroserviceContainer(e){try{let t=new be.PureContainer({defaultScope:"Singleton"});return this.tiesRegistrar.registerTies(t,e),t}catch(t){throw new Y("microservice",`Failed to create microservice container: ${t instanceof Error?t.message:String(t)}`)}}createCustomContainer(e,t={}){try{let i=new be.PureContainer(t);return this.tiesRegistrar.registerTies(i,e),i}catch(i){throw new Y("custom",`Failed to create custom container: ${i instanceof Error?i.message:String(i)}`)}}validateContainer(e,t){this.tiesRegistrar.validateContainer(e,t)}createValidatedContainer(e,t=[]){let i=this.createMicroserviceContainer(e),a=[...this.tiesRegistrar.extractServiceNames(e),...t];return a.length>0&&this.validateContainer(i,a),i}};ie=_([(0,be.purable)()],ie);var _e=require("@worktif/utils");var Te=require("@worktif/utils");function Ve(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{let a=Date.now(),d=qe(r);t.info("Lambda invocation started",{timestamp:new Date().toISOString(),awsRequestId:d.awsRequestId,functionName:d.functionName,functionVersion:d.functionVersion,memoryLimit:d.memoryLimitInMB,remainingTime:d.getRemainingTimeInMillis?.(),eventType:Nt(i)});try{let f=await n(i,r),y=_t(a,d);return t.info("Lambda invocation completed successfully",{timestamp:new Date().toISOString(),duration:y.duration,remainingTime:y.remainingTime,awsRequestId:d.awsRequestId,resultType:typeof f}),f}catch(f){let y=_t(a,d);throw t.error("Lambda invocation failed",{timestamp:new Date().toISOString(),duration:y.duration,remainingTime:y.remainingTime,awsRequestId:d.awsRequestId,error:f instanceof Error?f.message:String(f),errorType:f instanceof Error?f.constructor.name:"Unknown"}),f}}}function We(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}/error-handler`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{try{return await n(i,r)}catch(a){let d=qe(r),f=Qn(a);if(t.error("Unhandled error in Lambda handler",{timestamp:new Date().toISOString(),awsRequestId:d.awsRequestId,functionName:d.functionName,error:f.message,errorType:f.type,stack:f.stack,eventType:Nt(i)}),Yn(i))return{statusCode:500,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type,Authorization","Access-Control-Allow-Methods":"GET,POST,PUT,DELETE,OPTIONS"},body:JSON.stringify({error:"Internal Server Error",message:process.env.NODE_ENV==="development"?f.message:"An unexpected error occurred",requestId:d.awsRequestId,timestamp:new Date().toISOString()})};throw a}}}function He(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}/timing`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{let a=Date.now(),d=process.memoryUsage(),f=qe(r);try{let y=await n(i,r),m=Pt(a,d,f);return t.info("Handler execution metrics",{timestamp:new Date().toISOString(),awsRequestId:f.awsRequestId,duration:m.duration,memoryUsed:m.memoryUsed,remainingTime:m.remainingTime,memoryLimit:f.memoryLimitInMB,heapUsed:m.heapUsed,heapTotal:m.heapTotal,external:m.external}),y}catch(y){let m=Pt(a,d,f);throw t.warn("Handler execution failed with metrics",{timestamp:new Date().toISOString(),awsRequestId:f.awsRequestId,duration:m.duration,memoryUsed:m.memoryUsed,remainingTime:m.remainingTime,error:y instanceof Error?y.message:String(y)}),y}}}function Oe(n,e){return Ve(We(He(n,e),e),e)}function qe(n){if(!n||typeof n!="object")return{};let e=n;return{functionName:typeof e.functionName=="string"?e.functionName:void 0,functionVersion:typeof e.functionVersion=="string"?e.functionVersion:void 0,awsRequestId:typeof e.awsRequestId=="string"?e.awsRequestId:void 0,getRemainingTimeInMillis:typeof e.getRemainingTimeInMillis=="function"?e.getRemainingTimeInMillis:void 0,memoryLimitInMB:typeof e.memoryLimitInMB=="string"?e.memoryLimitInMB:void 0,logGroupName:typeof e.logGroupName=="string"?e.logGroupName:void 0,logStreamName:typeof e.logStreamName=="string"?e.logStreamName:void 0}}function _t(n,e){let t=Date.now();return{startTime:n,endTime:t,duration:t-n,remainingTime:e.getRemainingTimeInMillis?.()}}function Pt(n,e,t){let i=Date.now(),r=process.memoryUsage();return{startTime:n,endTime:i,duration:i-n,memoryUsed:r.heapUsed-e.heapUsed,remainingTime:t.getRemainingTimeInMillis?.(),heapUsed:r.heapUsed,heapTotal:r.heapTotal,external:r.external}}function Qn(n){return n instanceof Error?{message:n.message,type:n.constructor.name,stack:n.stack}:{message:String(n),type:"Unknown"}}function Nt(n){if(!n||typeof n!="object")return"unknown";let e=n;return e.Records&&Array.isArray(e.Records)?"aws-event":e.httpMethod||e.requestContext?"api-gateway":e.source==="aws.events"?"eventbridge":e.eventSource==="aws:s3"?"s3":"custom"}function Yn(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.httpMethod||e.requestContext)}var re=class{constructor(){this.logger=(0,_e.logger)({serviceName:"@core/runtime-web/factory/lambda-handler-factory"})}create(e,t){this.logger.info("Creating Lambda handler",{lambdaId:e.id,service:e.service,dependencyCount:e.ties.length});let{RuntimeWebLambdaHandler:i}=(Ge(),Bt(Ft));return new i(e,t,this)}injectDependencies(e,t){let i={};for(let r of e)try{let a=r.name,d=t.run(a),f=this.toCamelCase(r.name);i[f]=d,this.logger.debug("Dependency injected",{className:r.name,key:f,token:a})}catch(a){throw this.logger.error("Failed to inject dependency",{className:r.name,error:a instanceof Error?a.message:String(a)}),new Error(`Failed to inject dependency '${r.name}': ${a instanceof Error?a.message:String(a)}`)}return this.logger.info("Dependencies injected successfully",{dependencyCount:Object.keys(i).length,dependencies:Object.keys(i)}),i}wrapHandler(e,t){return Oe(e,t)}toCamelCase(e){return e.charAt(0).toLowerCase()+e.slice(1)}};re=_([(0,_e.purable)()],re);Ge();var eo=Z(H());var In=require("@worktif/utils");var jr=Z(H(),1);function $(n){return(typeof n=="object"&&n!==null||typeof n=="function")&&typeof n.then=="function"}function q(n){switch(typeof n){case"string":case"symbol":return n.toString();case"function":return n.name;default:throw new Error(`Unexpected ${typeof n} service id type`)}}var Ke=Symbol.for("@inversifyjs/common/islazyServiceIdentifier"),oe=class{[Ke];#e;constructor(e){this.#e=e,this[Ke]=!0}static is(e){return typeof e=="object"&&e!==null&&e[Ke]===!0}unwrap(){return this.#e()}};var pr=Z(H(),1);function se(n,e,t){return Reflect.getOwnMetadata(e,n,t)}function Pe(n,e,t,i){Reflect.defineMetadata(e,t,n,i)}function Ie(n,e,t,i,r){let a=i(se(n,e,r)??t());Reflect.defineMetadata(e,a,n,r)}var Xe="@inversifyjs/container/bindingId";function en(){let n=se(Object,Xe)??0;return n===Number.MAX_SAFE_INTEGER?Pe(Object,Xe,Number.MIN_SAFE_INTEGER):Ie(Object,Xe,()=>n,e=>e+1),n}var he={Request:"Request",Singleton:"Singleton",Transient:"Transient"},U={ConstantValue:"ConstantValue",DynamicValue:"DynamicValue",Factory:"Factory",Instance:"Instance",Provider:"Provider",ResolvedValue:"ResolvedValue",ServiceRedirection:"ServiceRedirection"};var $t;(function(n){n.moduleId="moduleId",n.serviceId="serviceId"})($t||($t={}));var rt="@inversifyjs/core/classMetadataReflectKey";function ot(){return{constructorArguments:[],lifecycle:{postConstructMethodName:void 0,preDestroyMethodName:void 0},properties:new Map,scope:void 0}}var ei="@inversifyjs/core/pendingClassMetadataCountReflectKey",Ze=Symbol.for("@inversifyjs/core/InversifyCoreError"),P=class n extends Error{[Ze];kind;constructor(e,t,i){super(t,i),this[Ze]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[Ze]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},N,Ce,Ut,zt,V;function tn(n){let e=se(n,rt)??ot();if(!(function(t){let i=se(t,ei);return i!==void 0&&i!==0})(n))return(function(t,i){let r=[];if(i.length<t.length)throw new P(N.missingInjectionDecorator,`Found unexpected missing metadata on type "${t.name}". "${t.name}" constructor requires at least ${t.length.toString()} arguments, found ${i.length.toString()} instead.
|
|
1
|
+
"use strict";var qn=Object.create;var be=Object.defineProperty;var Dt=Object.getOwnPropertyDescriptor;var Gn=Object.getOwnPropertyNames;var Kn=Object.getPrototypeOf,Xn=Object.prototype.hasOwnProperty;var Zn=(n,e)=>()=>(n&&(e=n(n=0)),e);var Jn=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ke=(n,e)=>{for(var t in e)be(n,t,{get:e[t],enumerable:!0})},xe=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Gn(e))!Xn.call(n,r)&&r!==t&&be(n,r,{get:()=>e[r],enumerable:!(i=Dt(e,r))||i.enumerable});return n},k=(n,e,t)=>(xe(n,e,"default"),t&&xe(t,e,"default")),Z=(n,e,t)=>(t=n!=null?qn(Kn(n)):{},xe(e||!n||!n.__esModule?be(t,"default",{value:n,enumerable:!0}):t,n)),Bt=n=>xe(be({},"__esModule",{value:!0}),n),_=(n,e,t,i)=>{for(var r=i>1?void 0:i?Dt(e,t):e,a=n.length-1,d;a>=0;a--)(d=n[a])&&(r=(i?d(e,t,r):d(r))||r);return i&&r&&be(e,t,r),r};var H=Jn(()=>{var Tt;(function(n){(function(e){var t=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:f(),i=r(n);typeof t.Reflect<"u"&&(i=r(t.Reflect,i)),e(i,t),typeof t.Reflect>"u"&&(t.Reflect=n);function r(y,m){return function(b,I){Object.defineProperty(y,b,{configurable:!0,writable:!0,value:I}),m&&m(b,I)}}function a(){try{return Function("return this;")()}catch{}}function d(){try{return(0,eval)("(function() { return this; })()")}catch{}}function f(){return a()||d()}})(function(e,t){var i=Object.prototype.hasOwnProperty,r=typeof Symbol=="function",a=r&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",d=r&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",f=typeof Object.create=="function",y={__proto__:[]}instanceof Array,m=!f&&!y,b={create:f?function(){return ze(Object.create(null))}:y?function(){return ze({__proto__:null})}:function(){return ze({})},has:m?function(o,s){return i.call(o,s)}:function(o,s){return s in o},get:m?function(o,s){return i.call(o,s)?o[s]:void 0}:function(o,s){return o[s]}},I=Object.getPrototypeOf(Function),A=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:Un(),x=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:zn(),j=typeof WeakMap=="function"?WeakMap:Vn(),E=r?Symbol.for("@reflect-metadata:registry"):void 0,J=Ln(),M=Fn(J);function K(o,s,c,u){if(w(c)){if(!It(o))throw new TypeError;if(!Ct(s))throw new TypeError;return Dn(o,s)}else{if(!It(o))throw new TypeError;if(!B(s))throw new TypeError;if(!B(u)&&!w(u)&&!le(u))throw new TypeError;return le(u)&&(u=void 0),c=Q(c),Bn(o,s,c,u)}}e("decorate",K);function de(o,s){function c(u,p){if(!B(u))throw new TypeError;if(!w(p)&&!Pn(p))throw new TypeError;pt(o,s,u,p)}return c}e("metadata",de);function me(o,s,c,u){if(!B(c))throw new TypeError;return w(u)||(u=Q(u)),pt(o,s,c,u)}e("defineMetadata",me);function pe(o,s,c){if(!B(s))throw new TypeError;return w(c)||(c=Q(c)),gt(o,s,c)}e("hasMetadata",pe);function Mn(o,s,c){if(!B(s))throw new TypeError;return w(c)||(c=Q(c)),Fe(o,s,c)}e("hasOwnMetadata",Mn);function Rn(o,s,c){if(!B(s))throw new TypeError;return w(c)||(c=Q(c)),vt(o,s,c)}e("getMetadata",Rn);function xn(o,s,c){if(!B(s))throw new TypeError;return w(c)||(c=Q(c)),mt(o,s,c)}e("getOwnMetadata",xn);function kn(o,s){if(!B(o))throw new TypeError;return w(s)||(s=Q(s)),yt(o,s)}e("getMetadataKeys",kn);function An(o,s){if(!B(o))throw new TypeError;return w(s)||(s=Q(s)),bt(o,s)}e("getOwnMetadataKeys",An);function En(o,s,c){if(!B(s))throw new TypeError;if(w(c)||(c=Q(c)),!B(s))throw new TypeError;w(c)||(c=Q(c));var u=ye(s,c,!1);return w(u)?!1:u.OrdinaryDeleteMetadata(o,s,c)}e("deleteMetadata",En);function Dn(o,s){for(var c=o.length-1;c>=0;--c){var u=o[c],p=u(s);if(!w(p)&&!le(p)){if(!Ct(p))throw new TypeError;s=p}}return s}function Bn(o,s,c,u){for(var p=o.length-1;p>=0;--p){var T=o[p],L=T(s,c,u);if(!w(L)&&!le(L)){if(!B(L))throw new TypeError;u=L}}return u}function gt(o,s,c){var u=Fe(o,s,c);if(u)return!0;var p=Ue(s);return le(p)?!1:gt(o,p,c)}function Fe(o,s,c){var u=ye(s,c,!1);return w(u)?!1:St(u.OrdinaryHasOwnMetadata(o,s,c))}function vt(o,s,c){var u=Fe(o,s,c);if(u)return mt(o,s,c);var p=Ue(s);if(!le(p))return vt(o,p,c)}function mt(o,s,c){var u=ye(s,c,!1);if(!w(u))return u.OrdinaryGetOwnMetadata(o,s,c)}function pt(o,s,c,u){var p=ye(c,u,!0);p.OrdinaryDefineOwnMetadata(o,s,c,u)}function yt(o,s){var c=bt(o,s),u=Ue(o);if(u===null)return c;var p=yt(u,s);if(p.length<=0)return c;if(c.length<=0)return p;for(var T=new x,L=[],C=0,l=c;C<l.length;C++){var h=l[C],g=T.has(h);g||(T.add(h),L.push(h))}for(var v=0,R=p;v<R.length;v++){var h=R[v],g=T.has(h);g||(T.add(h),L.push(h))}return L}function bt(o,s){var c=ye(o,s,!1);return c?c.OrdinaryOwnMetadataKeys(o,s):[]}function wt(o){if(o===null)return 1;switch(typeof o){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return o===null?1:6;default:return 6}}function w(o){return o===void 0}function le(o){return o===null}function Tn(o){return typeof o=="symbol"}function B(o){return typeof o=="object"?o!==null:typeof o=="function"}function On(o,s){switch(wt(o)){case 0:return o;case 1:return o;case 2:return o;case 3:return o;case 4:return o;case 5:return o}var c=s===3?"string":s===5?"number":"default",u=Mt(o,a);if(u!==void 0){var p=u.call(o,c);if(B(p))throw new TypeError;return p}return _n(o,c==="default"?"number":c)}function _n(o,s){if(s==="string"){var c=o.toString;if(fe(c)){var u=c.call(o);if(!B(u))return u}var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!B(u))return u}}else{var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!B(u))return u}var T=o.toString;if(fe(T)){var u=T.call(o);if(!B(u))return u}}throw new TypeError}function St(o){return!!o}function Nn(o){return""+o}function Q(o){var s=On(o,3);return Tn(s)?s:Nn(s)}function It(o){return Array.isArray?Array.isArray(o):o instanceof Object?o instanceof Array:Object.prototype.toString.call(o)==="[object Array]"}function fe(o){return typeof o=="function"}function Ct(o){return typeof o=="function"}function Pn(o){switch(wt(o)){case 3:return!0;case 4:return!0;default:return!1}}function $e(o,s){return o===s||o!==o&&s!==s}function Mt(o,s){var c=o[s];if(c!=null){if(!fe(c))throw new TypeError;return c}}function Rt(o){var s=Mt(o,d);if(!fe(s))throw new TypeError;var c=s.call(o);if(!B(c))throw new TypeError;return c}function xt(o){return o.value}function kt(o){var s=o.next();return s.done?!1:s}function At(o){var s=o.return;s&&s.call(o)}function Ue(o){var s=Object.getPrototypeOf(o);if(typeof o!="function"||o===I||s!==I)return s;var c=o.prototype,u=c&&Object.getPrototypeOf(c);if(u==null||u===Object.prototype)return s;var p=u.constructor;return typeof p!="function"||p===o?s:p}function jn(){var o;!w(E)&&typeof t.Reflect<"u"&&!(E in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(o=$n(t.Reflect));var s,c,u,p=new j,T={registerProvider:L,getProvider:l,setProvider:g};return T;function L(v){if(!Object.isExtensible(T))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case o===v:break;case w(s):s=v;break;case s===v:break;case w(c):c=v;break;case c===v:break;default:u===void 0&&(u=new x),u.add(v);break}}function C(v,R){if(!w(s)){if(s.isProviderFor(v,R))return s;if(!w(c)){if(c.isProviderFor(v,R))return s;if(!w(u))for(var D=Rt(u);;){var O=kt(D);if(!O)return;var X=xt(O);if(X.isProviderFor(v,R))return At(D),X}}}if(!w(o)&&o.isProviderFor(v,R))return o}function l(v,R){var D=p.get(v),O;return w(D)||(O=D.get(R)),w(O)&&(O=C(v,R),w(O)||(w(D)&&(D=new A,p.set(v,D)),D.set(R,O))),O}function h(v){if(w(v))throw new TypeError;return s===v||c===v||!w(u)&&u.has(v)}function g(v,R,D){if(!h(D))throw new Error("Metadata provider not registered.");var O=l(v,R);if(O!==D){if(!w(O))return!1;var X=p.get(v);w(X)&&(X=new A,p.set(v,X)),X.set(R,D)}return!0}}function Ln(){var o;return!w(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&(o=t.Reflect[E]),w(o)&&(o=jn()),!w(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,E,{enumerable:!1,configurable:!1,writable:!1,value:o}),o}function Fn(o){var s=new j,c={isProviderFor:function(h,g){var v=s.get(h);return w(v)?!1:v.has(g)},OrdinaryDefineOwnMetadata:L,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:T,OrdinaryOwnMetadataKeys:C,OrdinaryDeleteMetadata:l};return J.registerProvider(c),c;function u(h,g,v){var R=s.get(h),D=!1;if(w(R)){if(!v)return;R=new A,s.set(h,R),D=!0}var O=R.get(g);if(w(O)){if(!v)return;if(O=new A,R.set(g,O),!o.setProvider(h,g,c))throw R.delete(g),D&&s.delete(h),new Error("Wrong provider for target.")}return O}function p(h,g,v){var R=u(g,v,!1);return w(R)?!1:St(R.has(h))}function T(h,g,v){var R=u(g,v,!1);if(!w(R))return R.get(h)}function L(h,g,v,R){var D=u(v,R,!0);D.set(h,g)}function C(h,g){var v=[],R=u(h,g,!1);if(w(R))return v;for(var D=R.keys(),O=Rt(D),X=0;;){var Et=kt(O);if(!Et)return v.length=X,v;var Wn=xt(Et);try{v[X]=Wn}catch(Hn){try{At(O)}finally{throw Hn}}X++}}function l(h,g,v){var R=u(g,v,!1);if(w(R)||!R.delete(h))return!1;if(R.size===0){var D=s.get(g);w(D)||(D.delete(v),D.size===0&&s.delete(D))}return!0}}function $n(o){var s=o.defineMetadata,c=o.hasOwnMetadata,u=o.getOwnMetadata,p=o.getOwnMetadataKeys,T=o.deleteMetadata,L=new j,C={isProviderFor:function(l,h){var g=L.get(l);return!w(g)&&g.has(h)?!0:p(l,h).length?(w(g)&&(g=new x,L.set(l,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:s,OrdinaryHasOwnMetadata:c,OrdinaryGetOwnMetadata:u,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:T};return C}function ye(o,s,c){var u=J.getProvider(o,s);if(!w(u))return u;if(c){if(J.setProvider(o,s,M))return M;throw new Error("Illegal state.")}}function Un(){var o={},s=[],c=(function(){function C(l,h,g){this._index=0,this._keys=l,this._values=h,this._selector=g}return C.prototype["@@iterator"]=function(){return this},C.prototype[d]=function(){return this},C.prototype.next=function(){var l=this._index;if(l>=0&&l<this._keys.length){var h=this._selector(this._keys[l],this._values[l]);return l+1>=this._keys.length?(this._index=-1,this._keys=s,this._values=s):this._index++,{value:h,done:!1}}return{value:void 0,done:!0}},C.prototype.throw=function(l){throw this._index>=0&&(this._index=-1,this._keys=s,this._values=s),l},C.prototype.return=function(l){return this._index>=0&&(this._index=-1,this._keys=s,this._values=s),{value:l,done:!0}},C})(),u=(function(){function C(){this._keys=[],this._values=[],this._cacheKey=o,this._cacheIndex=-2}return Object.defineProperty(C.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),C.prototype.has=function(l){return this._find(l,!1)>=0},C.prototype.get=function(l){var h=this._find(l,!1);return h>=0?this._values[h]:void 0},C.prototype.set=function(l,h){var g=this._find(l,!0);return this._values[g]=h,this},C.prototype.delete=function(l){var h=this._find(l,!1);if(h>=0){for(var g=this._keys.length,v=h+1;v<g;v++)this._keys[v-1]=this._keys[v],this._values[v-1]=this._values[v];return this._keys.length--,this._values.length--,$e(l,this._cacheKey)&&(this._cacheKey=o,this._cacheIndex=-2),!0}return!1},C.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=o,this._cacheIndex=-2},C.prototype.keys=function(){return new c(this._keys,this._values,p)},C.prototype.values=function(){return new c(this._keys,this._values,T)},C.prototype.entries=function(){return new c(this._keys,this._values,L)},C.prototype["@@iterator"]=function(){return this.entries()},C.prototype[d]=function(){return this.entries()},C.prototype._find=function(l,h){if(!$e(this._cacheKey,l)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if($e(this._keys[g],l)){this._cacheIndex=g;break}}return this._cacheIndex<0&&h&&(this._cacheIndex=this._keys.length,this._keys.push(l),this._values.push(void 0)),this._cacheIndex},C})();return u;function p(C,l){return C}function T(C,l){return l}function L(C,l){return[C,l]}}function zn(){var o=(function(){function s(){this._map=new A}return Object.defineProperty(s.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),s.prototype.has=function(c){return this._map.has(c)},s.prototype.add=function(c){return this._map.set(c,c),this},s.prototype.delete=function(c){return this._map.delete(c)},s.prototype.clear=function(){this._map.clear()},s.prototype.keys=function(){return this._map.keys()},s.prototype.values=function(){return this._map.keys()},s.prototype.entries=function(){return this._map.entries()},s.prototype["@@iterator"]=function(){return this.keys()},s.prototype[d]=function(){return this.keys()},s})();return o}function Vn(){var o=16,s=b.create(),c=u();return(function(){function l(){this._key=u()}return l.prototype.has=function(h){var g=p(h,!1);return g!==void 0?b.has(g,this._key):!1},l.prototype.get=function(h){var g=p(h,!1);return g!==void 0?b.get(g,this._key):void 0},l.prototype.set=function(h,g){var v=p(h,!0);return v[this._key]=g,this},l.prototype.delete=function(h){var g=p(h,!1);return g!==void 0?delete g[this._key]:!1},l.prototype.clear=function(){this._key=u()},l})();function u(){var l;do l="@@WeakMap@@"+C();while(b.has(s,l));return s[l]=!0,l}function p(l,h){if(!i.call(l,c)){if(!h)return;Object.defineProperty(l,c,{value:b.create()})}return l[c]}function T(l,h){for(var g=0;g<h;++g)l[g]=Math.random()*255|0;return l}function L(l){if(typeof Uint8Array=="function"){var h=new Uint8Array(l);return typeof crypto<"u"?crypto.getRandomValues(h):typeof msCrypto<"u"?msCrypto.getRandomValues(h):T(h,l),h}return T(new Array(l),l)}function C(){var l=L(o);l[6]=l[6]&79|64,l[8]=l[8]&191|128;for(var h="",g=0;g<o;++g){var v=l[g];(g===4||g===6||g===8)&&(h+="-"),v<16&&(h+="0"),h+=v.toString(16).toLowerCase()}return h}}function ze(o){return o.__=void 0,delete o.__,o}})})(Tt||(Tt={}))});var Ft={};ke(Ft,{RuntimeWebLambdaHandler:()=>Se});var jt,Lt,Se,Ge=Zn(()=>{"use strict";jt=require("@worktif/utils"),Lt=require("@worktif/purews"),Se=class extends Lt.LambdaApi{constructor(t,i,r){super();this.definition=t;this.container=i;this.factory=r;this.logger=(0,jt.logger)({serviceName:"@core/runtime-web/factory/runtime-web-lambda-handler",persistentLogAttributes:{lambdaId:t.id,service:t.service}}),this.userHandler=this.createUserHandler(),this.logger.info("RuntimeWebLambdaHandler initialized",{lambdaId:t.id,service:t.service,dependencyCount:t.ties.length})}async handler(t,i){try{this.logger.debug("Handler invocation started",{eventType:typeof t,contextType:typeof i});let r=await this.userHandler(t,i);return this.logger.debug("Handler invocation completed successfully",{resultType:typeof r}),r}catch(r){throw this.logger.error("Handler invocation failed",{error:r instanceof Error?r.message:String(r),stack:r instanceof Error?r.stack:void 0}),r}}createUserHandler(){try{let t=this.factory.injectDependencies(this.definition.ties,this.container);this.logger.debug("Dependencies resolved for user handler",{dependencyKeys:Object.keys(t)});let i=this.definition.handler(t),r=this.factory.wrapHandler(i,{id:this.definition.id||"unknown",service:this.definition.service||"unknown"});return this.logger.info("User handler created and wrapped successfully"),r}catch(t){throw this.logger.error("Failed to create user handler",{error:t instanceof Error?t.message:String(t),stack:t instanceof Error?t.stack:void 0}),new Error(`Failed to create user handler for Lambda '${this.definition.id}': ${t instanceof Error?t.message:String(t)}`)}}getDefinition(){return this.definition}getContainer(){return this.container}isReady(){return this.userHandler!==void 0}}});var F={};ke(F,{ContainerRegistry:()=>ae,DIContainerError:()=>Y,LambdaHandlerFactory:()=>re,LambdaPipeline:()=>ft,MicroserviceRegistrar:()=>ce,MissingServiceError:()=>ee,PureContainerFactory:()=>ie,RuntimeContainer:()=>ve,RuntimeDetector:()=>Be,RuntimeDi:()=>ht,RuntimeExtensions:()=>z,RuntimeWebLambdaHandler:()=>Se,TiesRegistrar:()=>ne,TiesRegistrationError:()=>te,errorWrapper:()=>We,fullWrapper:()=>Oe,getBrowserMetadata:()=>Ae,getCDKMetadata:()=>De,getLambdaMetadata:()=>Ee,loggingWrapper:()=>Ve,timingWrapper:()=>He});module.exports=Bt(F);k(F,require("@worktif/purenow/lambda"),module.exports);var so=Z(H());function Ae(){try{if(typeof window>"u"||typeof navigator>"u")throw new Error("Browser APIs not available - window or navigator is undefined");return{userAgent:navigator.userAgent,url:window.location.href,viewport:{width:window.innerWidth,height:window.innerHeight}}}catch(n){throw new Error(`Failed to collect browser metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}function Ee(){try{let n=process.env.AWS_LAMBDA_FUNCTION_NAME;if(!n)throw new Error("AWS_LAMBDA_FUNCTION_NAME environment variable is required");let e=parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE||"128",10);return{functionName:n,version:process.env.AWS_LAMBDA_FUNCTION_VERSION||"$LATEST",region:process.env.AWS_REGION||process.env.AWS_DEFAULT_REGION||"us-east-1",memoryLimit:isNaN(e)?128:e,requestId:process.env.AWS_LAMBDA_LOG_STREAM_NAME}}catch(n){throw new Error(`Failed to collect Lambda metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}function De(){try{return{account:process.env.CDK_DEFAULT_ACCOUNT||"unknown",region:process.env.CDK_DEFAULT_REGION||"us-east-1",cdkVersion:process.env.CDK_VERSION,nodeVersion:process.version}}catch(n){throw new Error(`Failed to collect CDK metadata: ${n instanceof Error?n.message:"Unknown error"}`)}}var Be=class{detect(){if(this.isBrowser())return{type:"browser",metadata:Ae()};if(this.isLambda())return{type:"lambda",metadata:Ee()};if(this.isCDK())return{type:"cdk",metadata:De()};throw new Error("Unable to detect runtime environment. Expected browser (window object), Lambda (AWS_LAMBDA_FUNCTION_NAME), or CDK (PURENOW_MODE=cdk or CDK environment variables).")}isBrowser(){return typeof window<"u"}isLambda(){return!!process.env.AWS_LAMBDA_FUNCTION_NAME}isCDK(){return process.env.PURENOW_MODE==="cdk"||process.env.CDK_DEFAULT_ACCOUNT||process.env.CDK_DEFAULT_REGION?!0:process.argv.some(e=>e.includes("cdk")||e.includes("synth"))}};var Ot=require("@worktif/utils");var Y=class extends Error{constructor(e,t){super(`DI Container '${e}': ${t}`),this.name="DIContainerError",Error.captureStackTrace(this,this.constructor)}},te=class extends Error{constructor(e,t){super(`Ties registration failed for '${e}': ${t}`),this.name="TiesRegistrationError",Error.captureStackTrace(this,this.constructor)}},ee=class extends Error{constructor(e,t){super(`Service '${e}' not found in container '${t}'`),this.name="MissingServiceError",Error.captureStackTrace(this,this.constructor)}};var ne=class{registerTies(e,t){for(let i of t)try{let r=new i;if(typeof r.register!="function")throw new te(i.name,"Ties class must implement register(container: PureContainer<string>) method");r.register(e)}catch(r){throw r instanceof te?r:new te(i.name,`Failed to instantiate or register Ties class: ${r instanceof Error?r.message:String(r)}`)}}validateContainer(e,t){let i=[];for(let r of t)try{e.run(r)}catch{i.push(r)}if(i.length>0)throw new Error(`Required services are not registered in container: ${i.join(", ")}`)}extractServiceNames(e){let t=[];for(let i of e)try{let r=new i;if(typeof r.getServiceNames=="function"){let a=r.getServiceNames();Array.isArray(a)&&t.push(...a)}}catch{}return t}};ne=_([(0,Ot.purable)()],ne);var we=require("@worktif/utils");var ie=class{constructor(){this.tiesRegistrar=new ne}createMicroserviceContainer(e){try{let t=new we.PureContainer({defaultScope:"Singleton"});return this.tiesRegistrar.registerTies(t,e),t}catch(t){throw new Y("microservice",`Failed to create microservice container: ${t instanceof Error?t.message:String(t)}`)}}createCustomContainer(e,t={}){try{let i=new we.PureContainer(t);return this.tiesRegistrar.registerTies(i,e),i}catch(i){throw new Y("custom",`Failed to create custom container: ${i instanceof Error?i.message:String(i)}`)}}validateContainer(e,t){this.tiesRegistrar.validateContainer(e,t)}createValidatedContainer(e,t=[]){let i=this.createMicroserviceContainer(e),a=[...this.tiesRegistrar.extractServiceNames(e),...t];return a.length>0&&this.validateContainer(i,a),i}};ie=_([(0,we.purable)()],ie);var _e=require("@worktif/utils");var Te=require("@worktif/utils");function Ve(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{let a=Date.now(),d=qe(r);t.info("Lambda invocation started",{timestamp:new Date().toISOString(),awsRequestId:d.awsRequestId,functionName:d.functionName,functionVersion:d.functionVersion,memoryLimit:d.memoryLimitInMB,remainingTime:d.getRemainingTimeInMillis?.(),eventType:Pt(i)});try{let f=await n(i,r),y=_t(a,d);return t.info("Lambda invocation completed successfully",{timestamp:new Date().toISOString(),duration:y.duration,remainingTime:y.remainingTime,awsRequestId:d.awsRequestId,resultType:typeof f}),f}catch(f){let y=_t(a,d);throw t.error("Lambda invocation failed",{timestamp:new Date().toISOString(),duration:y.duration,remainingTime:y.remainingTime,awsRequestId:d.awsRequestId,error:f instanceof Error?f.message:String(f),errorType:f instanceof Error?f.constructor.name:"Unknown"}),f}}}function We(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}/error-handler`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{try{return await n(i,r)}catch(a){let d=qe(r),f=Qn(a);if(t.error("Unhandled error in Lambda handler",{timestamp:new Date().toISOString(),awsRequestId:d.awsRequestId,functionName:d.functionName,error:f.message,errorType:f.type,stack:f.stack,eventType:Pt(i)}),Yn(i))return{statusCode:500,headers:{"Content-Type":"application/json","Access-Control-Allow-Origin":"*","Access-Control-Allow-Headers":"Content-Type,Authorization","Access-Control-Allow-Methods":"GET,POST,PUT,DELETE,OPTIONS"},body:JSON.stringify({error:"Internal Server Error",message:process.env.NODE_ENV==="development"?f.message:"An unexpected error occurred",requestId:d.awsRequestId,timestamp:new Date().toISOString()})};throw a}}}function He(n,e){let t=(0,Te.logger)({serviceName:`@lambda/${e.service}/${e.id}/timing`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{let a=Date.now(),d=process.memoryUsage(),f=qe(r);try{let y=await n(i,r),m=Nt(a,d,f);return t.info("Handler execution metrics",{timestamp:new Date().toISOString(),awsRequestId:f.awsRequestId,duration:m.duration,memoryUsed:m.memoryUsed,remainingTime:m.remainingTime,memoryLimit:f.memoryLimitInMB,heapUsed:m.heapUsed,heapTotal:m.heapTotal,external:m.external}),y}catch(y){let m=Nt(a,d,f);throw t.warn("Handler execution failed with metrics",{timestamp:new Date().toISOString(),awsRequestId:f.awsRequestId,duration:m.duration,memoryUsed:m.memoryUsed,remainingTime:m.remainingTime,error:y instanceof Error?y.message:String(y)}),y}}}function Oe(n,e){return Ve(We(He(n,e),e),e)}function qe(n){if(!n||typeof n!="object")return{};let e=n;return{functionName:typeof e.functionName=="string"?e.functionName:void 0,functionVersion:typeof e.functionVersion=="string"?e.functionVersion:void 0,awsRequestId:typeof e.awsRequestId=="string"?e.awsRequestId:void 0,getRemainingTimeInMillis:typeof e.getRemainingTimeInMillis=="function"?e.getRemainingTimeInMillis:void 0,memoryLimitInMB:typeof e.memoryLimitInMB=="string"?e.memoryLimitInMB:void 0,logGroupName:typeof e.logGroupName=="string"?e.logGroupName:void 0,logStreamName:typeof e.logStreamName=="string"?e.logStreamName:void 0}}function _t(n,e){let t=Date.now();return{startTime:n,endTime:t,duration:t-n,remainingTime:e.getRemainingTimeInMillis?.()}}function Nt(n,e,t){let i=Date.now(),r=process.memoryUsage();return{startTime:n,endTime:i,duration:i-n,memoryUsed:r.heapUsed-e.heapUsed,remainingTime:t.getRemainingTimeInMillis?.(),heapUsed:r.heapUsed,heapTotal:r.heapTotal,external:r.external}}function Qn(n){return n instanceof Error?{message:n.message,type:n.constructor.name,stack:n.stack}:{message:String(n),type:"Unknown"}}function Pt(n){if(!n||typeof n!="object")return"unknown";let e=n;return e.Records&&Array.isArray(e.Records)?"aws-event":e.httpMethod||e.requestContext?"api-gateway":e.source==="aws.events"?"eventbridge":e.eventSource==="aws:s3"?"s3":"custom"}function Yn(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.httpMethod||e.requestContext)}var re=class{constructor(){this.logger=(0,_e.logger)({serviceName:"@core/runtime-web/factory/lambda-handler-factory"})}create(e,t){this.logger.info("Creating Lambda handler",{lambdaId:e.id,service:e.service,dependencyCount:e.ties.length});let{RuntimeWebLambdaHandler:i}=(Ge(),Bt(Ft));return new i(e,t,this)}injectDependencies(e,t){let i={};for(let r of e)try{let a=r.name,d=t.run(a),f=this.toCamelCase(r.name);i[f]=d,this.logger.debug("Dependency injected",{className:r.name,key:f,token:a})}catch(a){throw this.logger.error("Failed to inject dependency",{className:r.name,error:a instanceof Error?a.message:String(a)}),new Error(`Failed to inject dependency '${r.name}': ${a instanceof Error?a.message:String(a)}`)}return this.logger.info("Dependencies injected successfully",{dependencyCount:Object.keys(i).length,dependencies:Object.keys(i)}),i}wrapHandler(e,t){return Oe(e,t)}toCamelCase(e){return e.charAt(0).toLowerCase()+e.slice(1)}};re=_([(0,_e.purable)()],re);Ge();var eo=Z(H());var In=require("@worktif/utils");var jr=Z(H(),1);function $(n){return(typeof n=="object"&&n!==null||typeof n=="function")&&typeof n.then=="function"}function q(n){switch(typeof n){case"string":case"symbol":return n.toString();case"function":return n.name;default:throw new Error(`Unexpected ${typeof n} service id type`)}}var Ke=Symbol.for("@inversifyjs/common/islazyServiceIdentifier"),oe=class{[Ke];#e;constructor(e){this.#e=e,this[Ke]=!0}static is(e){return typeof e=="object"&&e!==null&&e[Ke]===!0}unwrap(){return this.#e()}};var pr=Z(H(),1);function se(n,e,t){return Reflect.getOwnMetadata(e,n,t)}function Ne(n,e,t,i){Reflect.defineMetadata(e,t,n,i)}function Ie(n,e,t,i,r){let a=i(se(n,e,r)??t());Reflect.defineMetadata(e,a,n,r)}var Xe="@inversifyjs/container/bindingId";function en(){let n=se(Object,Xe)??0;return n===Number.MAX_SAFE_INTEGER?Ne(Object,Xe,Number.MIN_SAFE_INTEGER):Ie(Object,Xe,()=>n,e=>e+1),n}var he={Request:"Request",Singleton:"Singleton",Transient:"Transient"},U={ConstantValue:"ConstantValue",DynamicValue:"DynamicValue",Factory:"Factory",Instance:"Instance",Provider:"Provider",ResolvedValue:"ResolvedValue",ServiceRedirection:"ServiceRedirection"};var $t;(function(n){n.moduleId="moduleId",n.serviceId="serviceId"})($t||($t={}));var rt="@inversifyjs/core/classMetadataReflectKey";function ot(){return{constructorArguments:[],lifecycle:{postConstructMethodName:void 0,preDestroyMethodName:void 0},properties:new Map,scope:void 0}}var ei="@inversifyjs/core/pendingClassMetadataCountReflectKey",Ze=Symbol.for("@inversifyjs/core/InversifyCoreError"),N=class n extends Error{[Ze];kind;constructor(e,t,i){super(t,i),this[Ze]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[Ze]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},P,Ce,Ut,zt,V;function tn(n){let e=se(n,rt)??ot();if(!(function(t){let i=se(t,ei);return i!==void 0&&i!==0})(n))return(function(t,i){let r=[];if(i.length<t.length)throw new N(P.missingInjectionDecorator,`Found unexpected missing metadata on type "${t.name}". "${t.name}" constructor requires at least ${t.length.toString()} arguments, found ${i.length.toString()} instead.
|
|
2
2
|
Are you using @inject, @multiInject or @unmanaged decorators in every non optional constructor argument?
|
|
3
3
|
|
|
4
|
-
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`);for(let a=0;a<i.length;++a)i[a]===void 0&&r.push(a);if(r.length>0)throw new P
|
|
4
|
+
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`);for(let a=0;a<i.length;++a)i[a]===void 0&&r.push(a);if(r.length>0)throw new N(P.missingInjectionDecorator,`Found unexpected missing metadata on type "${t.name}" at constructor indexes "${r.join('", "')}".
|
|
5
5
|
|
|
6
6
|
Are you using @inject, @multiInject or @unmanaged decorators at those indexes?
|
|
7
7
|
|
|
8
8
|
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`)})(n,e.constructorArguments),e;(function(t,i){let r=[];for(let a=0;a<i.constructorArguments.length;++a){let d=i.constructorArguments[a];d!==void 0&&d.kind!==Ce.unknown||r.push(` - Missing or incomplete metadata for type "${t.name}" at constructor argument with index ${a.toString()}.
|
|
9
9
|
Every constructor parameter must be decorated either with @inject, @multiInject or @unmanaged decorator.`)}for(let[a,d]of i.properties)d.kind===Ce.unknown&&r.push(` - Missing or incomplete metadata for type "${t.name}" at property "${a.toString()}".
|
|
10
|
-
This property must be decorated either with @inject or @multiInject decorator.`);throw r.length===0?new P
|
|
10
|
+
This property must be decorated either with @inject or @multiInject decorator.`);throw r.length===0?new N(P.unknown,`Unexpected class metadata for type "${t.name}" with uncompletion traces.
|
|
11
11
|
This might be caused by one of the following reasons:
|
|
12
12
|
|
|
13
13
|
1. A third party library is targeting inversify reflection metadata.
|
|
14
|
-
2. A bug is causing the issue. Consider submiting an issue to fix it.`):new P
|
|
14
|
+
2. A bug is causing the issue. Consider submiting an issue to fix it.`):new N(P.missingInjectionDecorator,`Invalid class metadata at type ${t.name}:
|
|
15
15
|
|
|
16
16
|
${r.join(`
|
|
17
17
|
|
|
18
|
-
`)}`)})(n,e)}function ti(n,e){let t=tn(e).scope??n.scope;return{cache:{isRight:!1,value:void 0},id:en(),implementationType:e,isSatisfiedBy:()=>!0,moduleId:void 0,onActivation:void 0,onDeactivation:void 0,scope:t,serviceIdentifier:e,type:U.Instance}}(function(n){n[n.injectionDecoratorConflict=0]="injectionDecoratorConflict",n[n.missingInjectionDecorator=1]="missingInjectionDecorator",n[n.planning=2]="planning",n[n.resolution=3]="resolution",n[n.unknown=4]="unknown"})(
|
|
18
|
+
`)}`)})(n,e)}function ti(n,e){let t=tn(e).scope??n.scope;return{cache:{isRight:!1,value:void 0},id:en(),implementationType:e,isSatisfiedBy:()=>!0,moduleId:void 0,onActivation:void 0,onDeactivation:void 0,scope:t,serviceIdentifier:e,type:U.Instance}}(function(n){n[n.injectionDecoratorConflict=0]="injectionDecoratorConflict",n[n.missingInjectionDecorator=1]="missingInjectionDecorator",n[n.planning=2]="planning",n[n.resolution=3]="resolution",n[n.unknown=4]="unknown"})(P||(P={})),(function(n){n[n.unknown=32]="unknown"})(Ce||(Ce={})),(function(n){n.id="id",n.moduleId="moduleId",n.serviceId="serviceId"})(Ut||(Ut={}));(function(n){n.moduleId="moduleId",n.serviceId="serviceId"})(zt||(zt={}));function nn(n,e){return(...t)=>i=>{if(i===void 0)return n(...t);if(i.kind===V.unmanaged)throw new N(P.injectionDecoratorConflict,"Unexpected injection found. Multiple @inject, @multiInject or @unmanaged decorators found");return e(i,...t)}}function rn(n){if(n.kind!==Ce.unknown&&n.isFromTypescriptParamType!==!0)throw new N(P.injectionDecoratorConflict,"Unexpected injection found. Multiple @inject, @multiInject or @unmanaged decorators found")}(function(n){n[n.multipleInjection=0]="multipleInjection",n[n.singleInjection=1]="singleInjection",n[n.unmanaged=2]="unmanaged"})(V||(V={}));var rr=nn(function(n,e,t){return n===V.multipleInjection?{chained:t?.chained??!1,kind:n,name:void 0,optional:!1,tags:new Map,value:e}:{kind:n,name:void 0,optional:!1,tags:new Map,value:e}},function(n,e,t,i){return rn(n),e===V.multipleInjection?{...n,chained:i?.chained??!1,kind:e,value:t}:{...n,kind:e,value:t}});var Vt;(function(n){n[n.method=0]="method",n[n.parameter=1]="parameter",n[n.property=2]="property"})(Vt||(Vt={}));var Wt="@inversifyjs/core/classIsInjectableFlagReflectKey",ni=[Array,BigInt,Boolean,Function,Number,Object,String];function ii(n){let e=se(n,"design:paramtypes");e!==void 0&&Ie(n,rt,ot,(function(t){return i=>(t.forEach((r,a)=>{var d;i.constructorArguments[a]!==void 0||(d=r,ni.includes(d))||(i.constructorArguments[a]=(function(f){return{isFromTypescriptParamType:!0,kind:V.singleInjection,name:void 0,optional:!1,tags:new Map,value:f}})(r))}),i)})(e))}function st(n){return e=>{(function(t){if(se(t,Wt)!==void 0)throw new N(P.injectionDecoratorConflict,`Cannot apply @injectable decorator multiple times at class "${t.name}"`);Ne(t,Wt,!0)})(e),ii(e),n!==void 0&&Ie(e,rt,ot,t=>({...t,scope:n}))}}function Ht(){return{kind:V.unmanaged}}var or=nn(Ht,function(n){if(rn(n),(function(e){return e.name!==void 0||e.optional||e.tags.size>0})(n))throw new N(P.injectionDecoratorConflict,"Unexpected injection found. Found @unmanaged injection with additional @named, @optional, @tagged or @targetName injections");return Ht()});var ue;(function(n){n[n.multipleInjection=0]="multipleInjection",n[n.singleInjection=1]="singleInjection"})(ue||(ue={}));var Je=Symbol.for("@inversifyjs/core/LazyPlanServiceNode"),Me=class{[Je];_serviceIdentifier;_serviceNode;constructor(e,t){this[Je]=!0,this._serviceNode=e,this._serviceIdentifier=t}get bindings(){return this._getNode().bindings}get isContextFree(){return this._getNode().isContextFree}get serviceIdentifier(){return this._serviceIdentifier}set bindings(e){this._getNode().bindings=e}set isContextFree(e){this._getNode().isContextFree=e}static is(e){return typeof e=="object"&&e!==null&&e[Je]===!0}invalidate(){this._serviceNode=void 0}isExpanded(){return this._serviceNode!==void 0}_getNode(){return this._serviceNode===void 0&&(this._serviceNode=this._buildPlanServiceNode()),this._serviceNode}},Re=class n{#e;constructor(e){this.#e=e}get name(){return this.#e.elem.name}get serviceIdentifier(){return this.#e.elem.serviceIdentifier}get tags(){return this.#e.elem.tags}getAncestor(){if(this.#e.elem.getAncestorsCalled=!0,this.#e.previous!==void 0)return new n(this.#e.previous)}};function at(n,e,t){let i=t?.customServiceIdentifier??e.serviceIdentifier,r=(t?.chained===!0?[...n.operations.getBindingsChained(i)]:[...n.operations.getBindings(i)??[]]).filter(a=>a.isSatisfiedBy(e));if(r.length===0&&n.autobindOptions!==void 0&&typeof i=="function"){let a=ti(n.autobindOptions,i);n.operations.setBinding(a),a.isSatisfiedBy(e)&&r.push(a)}return r}function ge(n){return n.redirections!==void 0}function on(n,e,t,i){let r=t.elem.serviceIdentifier,a=t.previous?.elem.serviceIdentifier;Array.isArray(n)?(function(d,f,y,m,b,I){if(d.length!==0){let A=I[I.length-1]??y,x=`Ambiguous bindings found for service: "${q(A)}".${cn(I)}
|
|
19
19
|
|
|
20
20
|
Registered bindings:
|
|
21
21
|
|
|
22
22
|
${d.map(j=>(function(E){switch(E.type){case U.Instance:return`[ type: "${E.type}", serviceIdentifier: "${q(E.serviceIdentifier)}", scope: "${E.scope}", implementationType: "${E.implementationType.name}" ]`;case U.ServiceRedirection:return`[ type: "${E.type}", serviceIdentifier: "${q(E.serviceIdentifier)}", redirection: "${q(E.targetServiceIdentifier)}" ]`;default:return`[ type: "${E.type}", serviceIdentifier: "${q(E.serviceIdentifier)}", scope: "${E.scope}" ]`}})(j.binding)).join(`
|
|
23
23
|
`)}
|
|
24
24
|
|
|
25
|
-
Trying to resolve bindings for "${sn(y,m)}".${an(
|
|
25
|
+
Trying to resolve bindings for "${sn(y,m)}".${an(b)}`;throw new N(P.planning,x)}f||qt(y,m,b,I)})(n,e,r,a,t.elem,i):(function(d,f,y,m,b,I){d!==void 0||f||qt(y,m,b,I)})(n,e,r,a,t.elem,i)}function qt(n,e,t,i){let r=i[i.length-1]??n,a=`No bindings found for service: "${q(r)}".
|
|
26
26
|
|
|
27
|
-
Trying to resolve bindings for "${sn(n,e)}".${cn(i)}${an(t)}`;throw new P
|
|
27
|
+
Trying to resolve bindings for "${sn(n,e)}".${cn(i)}${an(t)}`;throw new N(P.planning,a)}function sn(n,e){return e===void 0?`${q(n)} (Root service)`:q(e)}function an(n){let e=n.tags.size===0?"":`
|
|
28
28
|
- tags:
|
|
29
29
|
- ${[...n.tags.keys()].map(t=>t.toString()).join(`
|
|
30
30
|
- `)}`;return`
|
|
@@ -35,7 +35,7 @@ Binding constraints:
|
|
|
35
35
|
|
|
36
36
|
- service redirections:
|
|
37
37
|
- ${n.map(e=>q(e)).join(`
|
|
38
|
-
- `)}`}function dn(n,e,t,i){if(n.redirections.length===1){let[r]=n.redirections;return void(ge(r)&&dn(r,e,t,[...i,r.binding.targetServiceIdentifier]))}on(n.redirections,e,t,i)}function un(n,e,t){if(Array.isArray(n.bindings)&&n.bindings.length===1){let[i]=n.bindings;return void(ge(i)&&dn(i,e,t,[i.binding.targetServiceIdentifier]))}on(n.bindings,e,t,[])}function je(n){return oe.is(n)?n.unwrap():n}function ln(n){return(e,t,i)=>{let r=je(i.value),a=t.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Re(a.last),f=i.kind===V.multipleInjection&&i.chained,y=at(e,d,{chained:f}),m=[],w={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...n(e,a,y,w,f)),w.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===V.singleInjection){un(w,i.optional,a.last);let[I]=m;w.bindings=I}return w}}function fn(n){return(e,t,i)=>{let r=je(i.value),a=t.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Re(a.last),f=i.kind===ue.multipleInjection&&i.chained,y=at(e,d,{chained:f}),m=[],w={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...n(e,a,y,w,f)),w.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===ue.singleInjection){un(w,i.optional,a.last);let[I]=m;w.bindings=I}return w}}function hn(n){let e=(function(a){return(d,f,y)=>{let m={binding:f,classMetadata:d.operations.getClassMetadata(f.implementationType),constructorParams:[],propertyParams:new Map},w={autobindOptions:d.autobindOptions,node:m,operations:d.operations,servicesBranch:d.servicesBranch};return a(w,y)}})(n),t=(function(a){return(d,f,y)=>{let m={binding:f,params:[]},w={autobindOptions:d.autobindOptions,node:m,operations:d.operations,servicesBranch:d.servicesBranch};return a(w,y)}})(n),i=(a,d,f,y,m)=>{let w=ge(y)?y.binding.targetServiceIdentifier:y.serviceIdentifier;a.servicesBranch.push(w);let I=[];for(let A of f)switch(A.type){case U.Instance:I.push(e(a,A,d));break;case U.ResolvedValue:I.push(t(a,A,d));break;case U.ServiceRedirection:{let x=r(a,d,A,m);I.push(x);break}default:I.push({binding:A})}return a.servicesBranch.pop(),I},r=(function(a){return(d,f,y,m)=>{let w={binding:y,redirections:[]},I=at(d,new Re(f.last),{chained:m,customServiceIdentifier:y.targetServiceIdentifier});return w.redirections.push(...a(d,f,I,w,m)),w}})(i);return i}function Gt(n,e,t,i){if(n!==void 0&&(Me.is(t)&&!t.isExpanded()||t.isContextFree)){let r={tree:{root:t}};e.setPlan(n,r)}else e.setNonCachedServiceNode(t,i)}var Qe=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,je(r.value)),this.#t=t,this.#e=e,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}},Ye=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,je(r.value)),this.#e=e,this.#t=t,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}};function gn(n,e,t,i){let r=(function(d,f){let y=(function(m,w){return(I,A,x)=>{if(x.kind===V.unmanaged)return;let j=(function(M){let K;if(M.tags.size===0)K=void 0;else{if(M.tags.size!==1)return;{let[me,pe]=M.tags.entries().next().value;K={key:me,value:pe}}}let de=oe.is(M.value)?M.value.unwrap():M.value;return M.kind===V.multipleInjection?{chained:M.chained,isMultiple:!0,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}})(x);if(j!==void 0){let M=I.operations.getPlan(j);if(M!==void 0&&M.tree.root.isContextFree)return M.tree.root}let E=w(I,A,x),J=new Qe(I,m,A,x,E);return Gt(j,I.operations,J,{bindingConstraintsList:A,chainedBindings:x.kind===V.multipleInjection&&x.chained,optionalBindings:x.optional}),J}})(d,f);return(m,w,I)=>{let A=w.classMetadata;for(let[x,j]of A.constructorArguments.entries())w.constructorParams[x]=y(m,I,j);for(let[x,j]of A.properties){let E=y(m,I,j);E!==void 0&&w.propertyParams.set(x,E)}return m.node}})(n,t),a=(function(d,f){let y=(function(m,w){return(I,A,x)=>{let j=(function(M){let K;if(M.tags.size===0)K=void 0;else{if(M.tags.size!==1)return;{let[me,pe]=M.tags.entries().next().value;K={key:me,value:pe}}}let de=oe.is(M.value)?M.value.unwrap():M.value;return M.kind===ue.multipleInjection?{chained:M.chained,isMultiple:!0,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}})(x);if(j!==void 0){let M=I.operations.getPlan(j);if(M!==void 0&&M.tree.root.isContextFree)return M.tree.root}let E=w(I,A,x),J=new Ye(I,m,A,x,E);return Gt(j,I.operations,J,{bindingConstraintsList:A,chainedBindings:x.kind===ue.multipleInjection&&x.chained,optionalBindings:x.optional}),J}})(d,f);return(m,w,I)=>{let A=w.binding.metadata;for(let[x,j]of A.arguments.entries())w.params[x]=y(m,I,j);return m.node}})(e,i);return(d,f)=>d.node.binding.type===U.Instance?r(d,d.node,f):a(d,d.node,f)}var et=ln(vn),tt=fn(vn),ri=hn(gn(et,tt,et,tt));function vn(n,e,t,i,r){return ri(n,e,t,i,r)}var nt;(function(n){n.bindingAdded="bindingAdded",n.bindingRemoved="bindingRemoved"})(nt||(nt={}));var mn=hn(gn(et,tt,function(n,e,t){return oi(n,e,t)},function(n,e,t){return si(n,e,t)})),oi=(function(n){let e=ln(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(P.isErrorOfKind(a,N.planning))return;throw a}}})(mn),si=(function(n){let e=fn(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(P.isErrorOfKind(a,N.planning))return;throw a}}})(mn);function pn(n,e){return $(e)?(n.cache={isRight:!0,value:e},e.then(t=>Kt(n,t))):Kt(n,e)}function Kt(n,e){return n.cache={isRight:!0,value:e},e}function ai(n,e,t){let i=n.getActivations(e);return i===void 0?t:$(t)?Xt(n,t,i[Symbol.iterator]()):(function(r,a,d){let f=a,y=d.next();for(;y.done!==!0;){let m=y.value(r.context,f);if($(m))return Xt(r,m,d);f=m,y=d.next()}return f})(n,t,i[Symbol.iterator]())}async function Xt(n,e,t){let i=await e,r=t.next();for(;r.done!==!0;)i=await r.value(n.context,i),r=t.next();return i}function Ne(n,e,t){let i=t;if(e.onActivation!==void 0){let r=e.onActivation;i=$(i)?i.then(a=>r(n.context,a)):r(n.context,i)}return ai(n,e.serviceIdentifier,i)}function ct(n){return(e,t)=>t.cache.isRight?t.cache.value:pn(t,Ne(e,t,n(e,t)))}var ci=ct(function(n,e){return e.value});function di(n){return n}function dt(n,e){return(t,i)=>{let r=n(i);switch(r.scope){case he.Singleton:return r.cache.isRight?r.cache.value:pn(r,Ne(t,r,e(t,i)));case he.Request:{if(t.requestScopeCache.has(r.id))return t.requestScopeCache.get(r.id);let a=Ne(t,r,e(t,i));return t.requestScopeCache.set(r.id,a),a}case he.Transient:return Ne(t,r,e(t,i))}}}var ui=(n=>dt(di,n))(function(n,e){return e.value(n.context)}),li=ct(function(n,e){return e.factory(n.context)});function Zt(n,e,t){let i=(function(r,a,d){if(d!==void 0){if(!(d in r))throw new P(N.resolution,`Expecting a "${d.toString()}" property when resolving "${a.implementationType.name}" class @postConstruct decorated method, none found.`);if(typeof r[d]!="function")throw new P(N.resolution,`Expecting a "${d.toString()}" method when resolving "${a.implementationType.name}" class @postConstruct decorated method, a non function property was found instead.`);{let f;try{f=r[d]()}catch(y){throw new P(N.resolution,`Unexpected error found when calling "${d.toString()}" @postConstruct decorated method on class "${a.implementationType.name}"`,{cause:y})}if($(f))return(async function(y,m,w){try{await w}catch(I){throw new P(N.resolution,`Unexpected error found when calling "${m.toString()}" @postConstruct decorated method on class "${y.implementationType.name}"`,{cause:I})}})(a,d,f)}}})(n,e,t);return $(i)?i.then(()=>n):n}function Jt(n){return(e,t,i)=>{let r=new i.binding.implementationType(...e),a=n(t,r,i);return $(a)?a.then(()=>Zt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)):Zt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)}}var fi=ct(function(n,e){return e.provider(n.context)});function hi(n){return n.binding}function gi(n){return n.binding}var Qt=(function(n){return(e,t,i)=>{let r=[];for(let[a,d]of i.propertyParams){let f=i.classMetadata.properties.get(a);if(f===void 0)throw new P(N.resolution,`Expecting metadata at property "${a.toString()}", none found`);f.kind!==V.unmanaged&&d.bindings!==void 0&&(t[a]=n(e,d),$(t[a])&&r.push((async()=>{t[a]=await t[a]})()))}if(r.length>0)return Promise.all(r).then(()=>{})}})(ut),Yt=(function(n){return function e(t,i){let r=[];for(let a of i.redirections)ge(a)?r.push(...e(t,a)):r.push(n(t,a));return r}})(it),vi=(function(n,e,t){return(i,r)=>{let a=n(i,r);return $(a)?e(a,i,r):t(a,i,r)}})((function(n){return(e,t)=>{let i=[];for(let r of t.constructorParams)r===void 0?i.push(void 0):i.push(n(e,r));return i.some($)?Promise.all(i):i}})(ut),(function(n){return async(e,t,i)=>{let r=await e;return n(r,t,i)}})(Jt(Qt)),Jt(Qt)),mi=(function(n){return(e,t)=>{let i=n(e,t);return $(i)?i.then(r=>t.binding.factory(...r)):t.binding.factory(...i)}})((function(n){return(e,t)=>{let i=[];for(let r of t.params)i.push(n(e,r));return i.some($)?Promise.all(i):i}})(ut)),pi=(n=>dt(hi,n))(vi),yi=(n=>dt(gi,n))(mi);function it(n,e){switch(e.binding.type){case U.ConstantValue:return ci(n,e.binding);case U.DynamicValue:return ui(n,e.binding);case U.Factory:return li(n,e.binding);case U.Instance:return pi(n,e);case U.Provider:return fi(n,e.binding);case U.ResolvedValue:return yi(n,e)}}function ut(n,e){if(e.bindings!==void 0)return Array.isArray(e.bindings)?(function(t,i){let r=[];for(let a of i)ge(a)?r.push(...Yt(t,a)):r.push(it(t,a));return r.some($)?Promise.all(r):r})(n,e.bindings):(function(t,i){if(ge(i)){let r=Yt(t,i);if(r.length===1)return r[0];throw new P(N.resolution,"Unexpected multiple resolved values on single injection")}return it(t,i)})(n,e.bindings)}var wn=Symbol.for("@inversifyjs/plugin/isPlugin"),yn=class{[wn]=!0;_container;_context;constructor(e,t){this._container=e,this._context=t}};var lt=Symbol.for("@inversifyjs/container/InversifyContainerError"),bn=class n extends Error{[lt];kind;constructor(e,t,i){super(t,i),this[lt]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[lt]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},Sn;(function(n){n[n.invalidOperation=0]="invalidOperation"})(Sn||(Sn={}));var Ir=he.Transient;var ae=class{constructor(){this.containers=new Map;this.lambdaToService=new Map;this.lambdaDefinitions=new Map}registerService(e,t){if(this.containers.has(e))throw new Y(e,`Service '${e}' is already registered. Use a different service name or clear the registry first.`);this.containers.set(e,t)}registerLambda(e,t,i){if(!this.containers.has(t))throw new ee(t,"service containers");if(this.lambdaToService.has(e)){let r=this.lambdaToService.get(e);throw new Y(e,`Lambda '${e}' is already registered to service '${r}'. Use a different Lambda ID.`)}this.lambdaToService.set(e,t),this.lambdaDefinitions.set(e,i)}getContainer(e){let t=this.containers.get(e);if(!t)throw new ee(e,"service containers");return t}getContainerForLambda(e){let t=this.getLambdaService(e);return this.getContainer(t)}getLambdaService(e){let t=this.lambdaToService.get(e);if(!t)throw new ee(e,"lambda-to-service mapping");return t}getLambdaDefinition(e){let t=this.lambdaDefinitions.get(e);if(!t)throw new ee(e,"lambda definitions");return t}hasService(e){return this.containers.has(e)}hasLambda(e){return this.lambdaToService.has(e)}getServiceNames(){return Array.from(this.containers.keys())}getLambdaIds(){return Array.from(this.lambdaToService.keys())}getLambdasForService(e){let t=[];for(let[i,r]of this.lambdaToService.entries())r===e&&t.push(i);return t}removeService(e){let t=this.containers.delete(e);if(t){let i=[];for(let[r,a]of this.lambdaToService.entries())a===e&&i.push(r);for(let r of i)this.lambdaToService.delete(r)}return t}removeLambda(e){return this.lambdaToService.delete(e)}clear(){this.containers.clear(),this.lambdaToService.clear(),this.lambdaDefinitions.clear()}getStats(){return{services:this.containers.size,lambdas:this.lambdaToService.size}}};ae=_([st()],ae);var ce=class{constructor(){this.containerFactory=new ie,this.registry=new ae}processService(e,t){try{let i=this.containerFactory.createMicroserviceContainer(t.ties);this.registry.registerService(e,i);for(let r of t.lambdas){r.service=e;let a=this.generateLambdaId(e,r);this.registry.registerLambda(a,e,r)}}catch(i){throw new Error(`Failed to process microservice '${e}': ${i instanceof Error?i.message:String(i)}`)}}getContainerForLambda(e){return this.registry.getContainerForLambda(e)}generateLambdaId(e,t){if(t.id)return`${e}.${t.id}`;let i=t.handler.name||"handler";return`${e}.${i}`}getServiceNames(){return this.registry.getServiceNames()}getLambdaIds(){return this.registry.getLambdaIds()}getServiceForLambda(e){try{return this.registry.getLambdaService(e)}catch{return}}hasService(e){return this.registry.hasService(e)}hasLambda(e){return this.registry.hasLambda(e)}getLambdasForService(e){return this.registry.getLambdasForService(e)}clear(){this.registry.clear()}getLambdaDefinition(e){return this.registry.getLambdaDefinition(e)}getRegistry(){return this.registry}validateContainer(e,t){let i=new Set;for(let r of t.lambdas)for(let a of r.ties)i.add(a.name);this.containerFactory.validateContainer(e,Array.from(i))}};ce=_([(0,In.purable)()],ce);var Cn=require("@worktif/utils"),ft=class{constructor(){this.logger=(0,Cn.logger)({serviceName:"@core/runtime-web/pipelines/lambda-pipeline"})}async execute(e,t){try{this.logger.info("Starting Lambda pipeline execution",{serviceName:e.serviceName,stage:e.stage,functionName:t.metadata.functionName,version:t.metadata.version,region:t.metadata.region,memoryLimit:t.metadata.memoryLimit,requestId:t.metadata.requestId}),this.initializeRegistrar(e);let i=this.resolveLambdaId(),r=this.getContainerForLambda(i),a=this.createHandlerWithDI(i,r);return this.logger.info("Lambda pipeline setup completed successfully",{lambdaId:i,serviceName:e.serviceName,stage:e.stage}),a}catch(i){throw this.logger.error("Lambda pipeline execution failed",{serviceName:e.serviceName,stage:e.stage,functionName:t.metadata.functionName,error:i instanceof Error?i.message:String(i),stack:i instanceof Error?i.stack:void 0}),i}}initializeRegistrar(e){this.logger.debug("Initializing microservice registrar");try{this.registrar=new ce;for(let[t,i]of Object.entries(e.register))this.logger.debug("Processing microservice",{serviceName:t,tiesCount:i.ties.length,lambdasCount:i.lambdas.length}),this.registrar.processService(t,i);this.logger.info("Microservice registrar initialized successfully",{serviceCount:Object.keys(e.register).length,totalLambdas:this.registrar.getLambdaIds().length})}catch(t){throw this.logger.error("Failed to initialize microservice registrar",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to initialize microservice registrar: ${t instanceof Error?t.message:String(t)}`)}}resolveLambdaId(){let e=process.env.LAMBDA_ID;if(!e)throw new Error("LAMBDA_ID environment variable not found. This should be set by the CDK stack during deployment.");return this.logger.debug("Lambda ID resolved from environment",{lambdaId:e}),e}getContainerForLambda(e){if(!this.registrar)throw new Error("Microservice registrar not initialized");try{let t=this.registrar.getContainerForLambda(e);return this.logger.debug("DI container retrieved successfully",{lambdaId:e,serviceName:this.registrar.getServiceForLambda(e)}),t}catch(t){throw this.logger.error("Failed to get DI container for Lambda",{lambdaId:e,error:t instanceof Error?t.message:String(t)}),new Error(`Failed to get DI container for Lambda '${e}': ${t instanceof Error?t.message:String(t)}`)}}createHandlerWithDI(e,t){this.logger.debug("Creating Lambda handler with DI",{lambdaId:e});try{this.handlerFactory||(this.handlerFactory=new re);let i=this.findLambdaDefinition(e),r=this.handlerFactory.create(i,t);return this.logger.info("Lambda handler created successfully",{lambdaId:e,dependencyCount:i.ties.length}),r}catch(i){throw this.logger.error("Failed to create Lambda handler",{lambdaId:e,error:i instanceof Error?i.message:String(i)}),new Error(`Failed to create Lambda handler for '${e}': ${i instanceof Error?i.message:String(i)}`)}}findLambdaDefinition(e){if(!this.registrar)throw new Error("Microservice registrar not initialized");try{return this.registrar.getLambdaDefinition(e)}catch(t){throw new Error(`Lambda definition not found for ID '${e}': ${t instanceof Error?t.message:String(t)}`)}}};var G={};ke(G,{RuntimeExtensions:()=>z});var Ro=Z(H());k(G,require("@worktif/purenow/lambda"));var So=Z(H());var go=Z(H()),b=require("@worktif/utils");var z=class{constructor(){this.loggerInstance=(0,b.logger)({serviceName:"Runtime | Extensions Service",logFormatter:new b.PurenowLoggerFormatter({logsProvider:b.PurenowLogFormatterProvider.Aws})});this.runtimeConfig={enableRuntimeCoreStack:!1,runtimeWebMode:"development",additionalFeatures:[],devServerEnhancements:{hotReload:!0,debugMode:!1,performanceMonitoring:!1},buildOptimizations:{bundleAnalysis:!1,treeshaking:!0,codeMinification:!0}};this.initializeRuntimeExtensions()}async initializeRuntimeExtensions(e){e?.log.now(this.runtimeConfig,{message:"Initializing runtime extensions",level:b.LoggerLevel.Info}),e?.log.now(null,{message:"Runtime extensions initialized successfully",level:b.LoggerLevel.Info})}async enhanceDevServer(e,t){let i=this.runtimeConfig.devServerEnhancements;t?.log.now({serverConfig:e,enhancements:i},{message:"Enhancing development server with runtime features",level:b.LoggerLevel.Debug});let r={...e,runtime:{hotReload:i?.hotReload??!0,debugMode:i?.debugMode??!1,performanceMonitoring:i?.performanceMonitoring??!1}};return t?.log.now(r,{message:"Development server Runtime Core with runtime features",level:b.LoggerLevel.Info}),r}async optimizeBuild(e,t){let i=this.runtimeConfig.buildOptimizations;t?.log.now({buildConfig:e,optimizations:i},{message:"Applying runtime-specific build optimizations",level:b.LoggerLevel.Debug});let r={...e,runtime:{bundleAnalysis:i?.bundleAnalysis??!1,treeshaking:i?.treeshaking??!0,codeMinification:i?.codeMinification??!0}};return t?.log.now(r,{message:"Build configuration optimized with runtime features",level:b.LoggerLevel.Info}),r}async configureRuntimeCoreStack(e,t){if(!this.runtimeConfig.enableRuntimeCoreStack){t?.log.now(null,{message:"Runtime Core stack deployment is disabled",level:b.LoggerLevel.Debug});return}t?.log.now(e,{message:"Configuring Runtime Core stack for runtime deployment",level:b.LoggerLevel.Debug});let i={stackName:`${e.stackName||"purenow"}-runtime`,resources:[{type:"Lambda",name:"RuntimeWebHandler",config:{runtime:"nodejs18.x",timeout:30,memorySize:512}}],dependencies:[`${e.stackName||"purenow"}-infrastructure`,`${e.stackName||"purenow"}-runtime-base`],outputs:{RuntimeStackArn:"runtime-stack-arn",RuntimeWebEndpoint:"runtime-web-endpoint"}};return t?.log.now(i,{message:"Runtime Core stack configuration created",level:b.LoggerLevel.Info}),i}async updateConfiguration(e,t){t?.log.now({oldConfig:this.runtimeConfig,newConfig:e},{message:"Updating runtime configuration",level:b.LoggerLevel.Debug}),this.runtimeConfig={...this.runtimeConfig,...e,devServerEnhancements:{...this.runtimeConfig.devServerEnhancements,...e.devServerEnhancements},buildOptimizations:{...this.runtimeConfig.buildOptimizations,...e.buildOptimizations}},t?.log.now(this.runtimeConfig,{message:"Runtime configuration updated",level:b.LoggerLevel.Info})}getConfiguration(){return{...this.runtimeConfig}}isFeatureEnabled(e){return this.runtimeConfig.additionalFeatures?.includes(e)??!1}async enableFeature(e,t){this.isFeatureEnabled(e)?t?.log.now({feature:e},{message:`Runtime feature '${e}' is already enabled`,level:b.LoggerLevel.Debug}):(this.runtimeConfig.additionalFeatures=[...this.runtimeConfig.additionalFeatures||[],e],t?.log.now({feature:e,enabledFeatures:this.runtimeConfig.additionalFeatures},{message:`Runtime feature '${e}' enabled`,level:b.LoggerLevel.Info}))}async disableFeature(e,t){this.isFeatureEnabled(e)?(this.runtimeConfig.additionalFeatures=(this.runtimeConfig.additionalFeatures||[]).filter(i=>i!==e),t?.log.now({feature:e,enabledFeatures:this.runtimeConfig.additionalFeatures},{message:`Runtime feature '${e}' disabled`,level:b.LoggerLevel.Info})):t?.log.now({feature:e},{message:`Runtime feature '${e}' is already disabled`,level:b.LoggerLevel.Debug})}};_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Initialize"),(0,b.catchInjector)("Runtime | Extensions | Initialize | Exception (error)"))],z.prototype,"initializeRuntimeExtensions",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Enhance Dev Server"),(0,b.catchInjector)("Runtime | Extensions | Enhance Dev Server | Exception (error)"))],z.prototype,"enhanceDevServer",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Optimize Build"),(0,b.catchInjector)("Runtime | Extensions | Optimize Build | Exception (error)"))],z.prototype,"optimizeBuild",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Configure Runtime Core stack"),(0,b.catchInjector)("Runtime | Extensions | Configure Runtime Core stack | Exception (error)"))],z.prototype,"configureRuntimeCoreStack",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Update Configuration"),(0,b.catchInjector)("Runtime | Extensions | Update Configuration | Exception (error)"))],z.prototype,"updateConfiguration",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Enable Feature"),(0,b.catchInjector)("Runtime | Extensions | Enable Feature | Exception (error)"))],z.prototype,"enableFeature",1),_([(0,b.injectBefore)((0,b.loggerInjector)("Runtime | Extensions | Disable Feature"),(0,b.catchInjector)("Runtime | Extensions | Disable Feature | Exception (error)"))],z.prototype,"disableFeature",1),z=_([(0,b.purable)()],z);var bo=Z(H());k(F,G,module.exports);var W={};ke(W,{RuntimeContainer:()=>ve,RuntimeDi:()=>ht});var _o=Z(H());k(W,require("@worktif/purenow/lambda"));var Ao=Z(H()),Le=require("@worktif/utils");var ve=class{constructor(){this.container=new Le.PureContainer({defaultScope:"Singleton"}),this.initializeRuntimeBindings()}initializeRuntimeBindings(){this.container.tieSingleton({RuntimeExtensions:{instance:z,dependencies:[]}})}getContainer(){return this.container}resolve(e){return this.container.run(e)}isRegistered(e){try{return this.container.run(e),!0}catch{return!1}}};ve=_([(0,Le.purable)()],ve);var To=Z(H()),ht=(d=>(d.RuntimeExtensionsServiceBind="runtime_extensions_service_bind",d.RuntimeConfigBind="runtime_config_bind",d.RuntimeDeploymentStrategyBind="runtime_deployment_strategy_bind",d.RuntimeCliBind="runtime_cli_bind",d.RuntimeStackConfigBind="runtime_stack_config_bind",d.RuntimeWebHandlerFactoryBind="runtime_web_handler_factory_bind",d))(ht||{});k(F,W,module.exports);0&&(module.exports={ContainerRegistry,DIContainerError,LambdaHandlerFactory,LambdaPipeline,MicroserviceRegistrar,MissingServiceError,PureContainerFactory,RuntimeContainer,RuntimeDetector,RuntimeDi,RuntimeExtensions,RuntimeWebLambdaHandler,TiesRegistrar,TiesRegistrationError,errorWrapper,fullWrapper,getBrowserMetadata,getCDKMetadata,getLambdaMetadata,loggingWrapper,timingWrapper,...require("@worktif/purenow/lambda")});
|
|
38
|
+
- `)}`}function dn(n,e,t,i){if(n.redirections.length===1){let[r]=n.redirections;return void(ge(r)&&dn(r,e,t,[...i,r.binding.targetServiceIdentifier]))}on(n.redirections,e,t,i)}function un(n,e,t){if(Array.isArray(n.bindings)&&n.bindings.length===1){let[i]=n.bindings;return void(ge(i)&&dn(i,e,t,[i.binding.targetServiceIdentifier]))}on(n.bindings,e,t,[])}function je(n){return oe.is(n)?n.unwrap():n}function ln(n){return(e,t,i)=>{let r=je(i.value),a=t.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Re(a.last),f=i.kind===V.multipleInjection&&i.chained,y=at(e,d,{chained:f}),m=[],b={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...n(e,a,y,b,f)),b.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===V.singleInjection){un(b,i.optional,a.last);let[I]=m;b.bindings=I}return b}}function fn(n){return(e,t,i)=>{let r=je(i.value),a=t.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Re(a.last),f=i.kind===ue.multipleInjection&&i.chained,y=at(e,d,{chained:f}),m=[],b={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...n(e,a,y,b,f)),b.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===ue.singleInjection){un(b,i.optional,a.last);let[I]=m;b.bindings=I}return b}}function hn(n){let e=(function(a){return(d,f,y)=>{let m={binding:f,classMetadata:d.operations.getClassMetadata(f.implementationType),constructorParams:[],propertyParams:new Map},b={autobindOptions:d.autobindOptions,node:m,operations:d.operations,servicesBranch:d.servicesBranch};return a(b,y)}})(n),t=(function(a){return(d,f,y)=>{let m={binding:f,params:[]},b={autobindOptions:d.autobindOptions,node:m,operations:d.operations,servicesBranch:d.servicesBranch};return a(b,y)}})(n),i=(a,d,f,y,m)=>{let b=ge(y)?y.binding.targetServiceIdentifier:y.serviceIdentifier;a.servicesBranch.push(b);let I=[];for(let A of f)switch(A.type){case U.Instance:I.push(e(a,A,d));break;case U.ResolvedValue:I.push(t(a,A,d));break;case U.ServiceRedirection:{let x=r(a,d,A,m);I.push(x);break}default:I.push({binding:A})}return a.servicesBranch.pop(),I},r=(function(a){return(d,f,y,m)=>{let b={binding:y,redirections:[]},I=at(d,new Re(f.last),{chained:m,customServiceIdentifier:y.targetServiceIdentifier});return b.redirections.push(...a(d,f,I,b,m)),b}})(i);return i}function Gt(n,e,t,i){if(n!==void 0&&(Me.is(t)&&!t.isExpanded()||t.isContextFree)){let r={tree:{root:t}};e.setPlan(n,r)}else e.setNonCachedServiceNode(t,i)}var Qe=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,je(r.value)),this.#t=t,this.#e=e,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}},Ye=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,je(r.value)),this.#e=e,this.#t=t,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}};function gn(n,e,t,i){let r=(function(d,f){let y=(function(m,b){return(I,A,x)=>{if(x.kind===V.unmanaged)return;let j=(function(M){let K;if(M.tags.size===0)K=void 0;else{if(M.tags.size!==1)return;{let[me,pe]=M.tags.entries().next().value;K={key:me,value:pe}}}let de=oe.is(M.value)?M.value.unwrap():M.value;return M.kind===V.multipleInjection?{chained:M.chained,isMultiple:!0,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}})(x);if(j!==void 0){let M=I.operations.getPlan(j);if(M!==void 0&&M.tree.root.isContextFree)return M.tree.root}let E=b(I,A,x),J=new Qe(I,m,A,x,E);return Gt(j,I.operations,J,{bindingConstraintsList:A,chainedBindings:x.kind===V.multipleInjection&&x.chained,optionalBindings:x.optional}),J}})(d,f);return(m,b,I)=>{let A=b.classMetadata;for(let[x,j]of A.constructorArguments.entries())b.constructorParams[x]=y(m,I,j);for(let[x,j]of A.properties){let E=y(m,I,j);E!==void 0&&b.propertyParams.set(x,E)}return m.node}})(n,t),a=(function(d,f){let y=(function(m,b){return(I,A,x)=>{let j=(function(M){let K;if(M.tags.size===0)K=void 0;else{if(M.tags.size!==1)return;{let[me,pe]=M.tags.entries().next().value;K={key:me,value:pe}}}let de=oe.is(M.value)?M.value.unwrap():M.value;return M.kind===ue.multipleInjection?{chained:M.chained,isMultiple:!0,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:de,tag:K}})(x);if(j!==void 0){let M=I.operations.getPlan(j);if(M!==void 0&&M.tree.root.isContextFree)return M.tree.root}let E=b(I,A,x),J=new Ye(I,m,A,x,E);return Gt(j,I.operations,J,{bindingConstraintsList:A,chainedBindings:x.kind===ue.multipleInjection&&x.chained,optionalBindings:x.optional}),J}})(d,f);return(m,b,I)=>{let A=b.binding.metadata;for(let[x,j]of A.arguments.entries())b.params[x]=y(m,I,j);return m.node}})(e,i);return(d,f)=>d.node.binding.type===U.Instance?r(d,d.node,f):a(d,d.node,f)}var et=ln(vn),tt=fn(vn),ri=hn(gn(et,tt,et,tt));function vn(n,e,t,i,r){return ri(n,e,t,i,r)}var nt;(function(n){n.bindingAdded="bindingAdded",n.bindingRemoved="bindingRemoved"})(nt||(nt={}));var mn=hn(gn(et,tt,function(n,e,t){return oi(n,e,t)},function(n,e,t){return si(n,e,t)})),oi=(function(n){let e=ln(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(N.isErrorOfKind(a,P.planning))return;throw a}}})(mn),si=(function(n){let e=fn(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(N.isErrorOfKind(a,P.planning))return;throw a}}})(mn);function pn(n,e){return $(e)?(n.cache={isRight:!0,value:e},e.then(t=>Kt(n,t))):Kt(n,e)}function Kt(n,e){return n.cache={isRight:!0,value:e},e}function ai(n,e,t){let i=n.getActivations(e);return i===void 0?t:$(t)?Xt(n,t,i[Symbol.iterator]()):(function(r,a,d){let f=a,y=d.next();for(;y.done!==!0;){let m=y.value(r.context,f);if($(m))return Xt(r,m,d);f=m,y=d.next()}return f})(n,t,i[Symbol.iterator]())}async function Xt(n,e,t){let i=await e,r=t.next();for(;r.done!==!0;)i=await r.value(n.context,i),r=t.next();return i}function Pe(n,e,t){let i=t;if(e.onActivation!==void 0){let r=e.onActivation;i=$(i)?i.then(a=>r(n.context,a)):r(n.context,i)}return ai(n,e.serviceIdentifier,i)}function ct(n){return(e,t)=>t.cache.isRight?t.cache.value:pn(t,Pe(e,t,n(e,t)))}var ci=ct(function(n,e){return e.value});function di(n){return n}function dt(n,e){return(t,i)=>{let r=n(i);switch(r.scope){case he.Singleton:return r.cache.isRight?r.cache.value:pn(r,Pe(t,r,e(t,i)));case he.Request:{if(t.requestScopeCache.has(r.id))return t.requestScopeCache.get(r.id);let a=Pe(t,r,e(t,i));return t.requestScopeCache.set(r.id,a),a}case he.Transient:return Pe(t,r,e(t,i))}}}var ui=(n=>dt(di,n))(function(n,e){return e.value(n.context)}),li=ct(function(n,e){return e.factory(n.context)});function Zt(n,e,t){let i=(function(r,a,d){if(d!==void 0){if(!(d in r))throw new N(P.resolution,`Expecting a "${d.toString()}" property when resolving "${a.implementationType.name}" class @postConstruct decorated method, none found.`);if(typeof r[d]!="function")throw new N(P.resolution,`Expecting a "${d.toString()}" method when resolving "${a.implementationType.name}" class @postConstruct decorated method, a non function property was found instead.`);{let f;try{f=r[d]()}catch(y){throw new N(P.resolution,`Unexpected error found when calling "${d.toString()}" @postConstruct decorated method on class "${a.implementationType.name}"`,{cause:y})}if($(f))return(async function(y,m,b){try{await b}catch(I){throw new N(P.resolution,`Unexpected error found when calling "${m.toString()}" @postConstruct decorated method on class "${y.implementationType.name}"`,{cause:I})}})(a,d,f)}}})(n,e,t);return $(i)?i.then(()=>n):n}function Jt(n){return(e,t,i)=>{let r=new i.binding.implementationType(...e),a=n(t,r,i);return $(a)?a.then(()=>Zt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)):Zt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)}}var fi=ct(function(n,e){return e.provider(n.context)});function hi(n){return n.binding}function gi(n){return n.binding}var Qt=(function(n){return(e,t,i)=>{let r=[];for(let[a,d]of i.propertyParams){let f=i.classMetadata.properties.get(a);if(f===void 0)throw new N(P.resolution,`Expecting metadata at property "${a.toString()}", none found`);f.kind!==V.unmanaged&&d.bindings!==void 0&&(t[a]=n(e,d),$(t[a])&&r.push((async()=>{t[a]=await t[a]})()))}if(r.length>0)return Promise.all(r).then(()=>{})}})(ut),Yt=(function(n){return function e(t,i){let r=[];for(let a of i.redirections)ge(a)?r.push(...e(t,a)):r.push(n(t,a));return r}})(it),vi=(function(n,e,t){return(i,r)=>{let a=n(i,r);return $(a)?e(a,i,r):t(a,i,r)}})((function(n){return(e,t)=>{let i=[];for(let r of t.constructorParams)r===void 0?i.push(void 0):i.push(n(e,r));return i.some($)?Promise.all(i):i}})(ut),(function(n){return async(e,t,i)=>{let r=await e;return n(r,t,i)}})(Jt(Qt)),Jt(Qt)),mi=(function(n){return(e,t)=>{let i=n(e,t);return $(i)?i.then(r=>t.binding.factory(...r)):t.binding.factory(...i)}})((function(n){return(e,t)=>{let i=[];for(let r of t.params)i.push(n(e,r));return i.some($)?Promise.all(i):i}})(ut)),pi=(n=>dt(hi,n))(vi),yi=(n=>dt(gi,n))(mi);function it(n,e){switch(e.binding.type){case U.ConstantValue:return ci(n,e.binding);case U.DynamicValue:return ui(n,e.binding);case U.Factory:return li(n,e.binding);case U.Instance:return pi(n,e);case U.Provider:return fi(n,e.binding);case U.ResolvedValue:return yi(n,e)}}function ut(n,e){if(e.bindings!==void 0)return Array.isArray(e.bindings)?(function(t,i){let r=[];for(let a of i)ge(a)?r.push(...Yt(t,a)):r.push(it(t,a));return r.some($)?Promise.all(r):r})(n,e.bindings):(function(t,i){if(ge(i)){let r=Yt(t,i);if(r.length===1)return r[0];throw new N(P.resolution,"Unexpected multiple resolved values on single injection")}return it(t,i)})(n,e.bindings)}var bn=Symbol.for("@inversifyjs/plugin/isPlugin"),yn=class{[bn]=!0;_container;_context;constructor(e,t){this._container=e,this._context=t}};var lt=Symbol.for("@inversifyjs/container/InversifyContainerError"),wn=class n extends Error{[lt];kind;constructor(e,t,i){super(t,i),this[lt]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[lt]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},Sn;(function(n){n[n.invalidOperation=0]="invalidOperation"})(Sn||(Sn={}));var Ir=he.Transient;var ae=class{constructor(){this.containers=new Map;this.lambdaToService=new Map;this.lambdaDefinitions=new Map}registerService(e,t){if(this.containers.has(e))throw new Y(e,`Service '${e}' is already registered. Use a different service name or clear the registry first.`);this.containers.set(e,t)}registerLambda(e,t,i){if(!this.containers.has(t))throw new ee(t,"service containers");if(this.lambdaToService.has(e)){let r=this.lambdaToService.get(e);throw new Y(e,`Lambda '${e}' is already registered to service '${r}'. Use a different Lambda ID.`)}this.lambdaToService.set(e,t),this.lambdaDefinitions.set(e,i)}getContainer(e){let t=this.containers.get(e);if(!t)throw new ee(e,"service containers");return t}getContainerForLambda(e){let t=this.getLambdaService(e);return this.getContainer(t)}getLambdaService(e){let t=this.lambdaToService.get(e);if(!t)throw new ee(e,"lambda-to-service mapping");return t}getLambdaDefinition(e){let t=this.lambdaDefinitions.get(e);if(!t)throw new ee(e,"lambda definitions");return t}hasService(e){return this.containers.has(e)}hasLambda(e){return this.lambdaToService.has(e)}getServiceNames(){return Array.from(this.containers.keys())}getLambdaIds(){return Array.from(this.lambdaToService.keys())}getLambdasForService(e){let t=[];for(let[i,r]of this.lambdaToService.entries())r===e&&t.push(i);return t}removeService(e){let t=this.containers.delete(e);if(t){let i=[];for(let[r,a]of this.lambdaToService.entries())a===e&&i.push(r);for(let r of i)this.lambdaToService.delete(r)}return t}removeLambda(e){return this.lambdaToService.delete(e)}clear(){this.containers.clear(),this.lambdaToService.clear(),this.lambdaDefinitions.clear()}getStats(){return{services:this.containers.size,lambdas:this.lambdaToService.size}}};ae=_([st()],ae);var ce=class{constructor(){this.containerFactory=new ie,this.registry=new ae}processService(e,t){try{let i=this.containerFactory.createMicroserviceContainer(t.ties);this.registry.registerService(e,i);for(let r of t.lambdas){r.service=e;let a=this.generateLambdaId(e,r);this.registry.registerLambda(a,e,r)}}catch(i){throw new Error(`Failed to process microservice '${e}': ${i instanceof Error?i.message:String(i)}`)}}getContainerForLambda(e){return this.registry.getContainerForLambda(e)}generateLambdaId(e,t){if(t.id)return`${e}.${t.id}`;let i=t.handler.name||"handler";return`${e}.${i}`}getServiceNames(){return this.registry.getServiceNames()}getLambdaIds(){return this.registry.getLambdaIds()}getServiceForLambda(e){try{return this.registry.getLambdaService(e)}catch{return}}hasService(e){return this.registry.hasService(e)}hasLambda(e){return this.registry.hasLambda(e)}getLambdasForService(e){return this.registry.getLambdasForService(e)}clear(){this.registry.clear()}getLambdaDefinition(e){return this.registry.getLambdaDefinition(e)}getRegistry(){return this.registry}validateContainer(e,t){let i=new Set;for(let r of t.lambdas)for(let a of r.ties)i.add(a.name);this.containerFactory.validateContainer(e,Array.from(i))}};ce=_([(0,In.purable)()],ce);var Cn=require("@worktif/utils"),ft=class{constructor(){this.logger=(0,Cn.logger)({serviceName:"@core/runtime-web/pipelines/lambda-pipeline"})}async execute(e,t){try{this.logger.info("Starting Lambda pipeline execution",{serviceName:e.serviceName,stage:e.stage,functionName:t.metadata.functionName,version:t.metadata.version,region:t.metadata.region,memoryLimit:t.metadata.memoryLimit,requestId:t.metadata.requestId}),this.initializeRegistrar(e);let i=this.resolveLambdaId(),r=this.getContainerForLambda(i),a=this.createHandlerWithDI(i,r);return this.logger.info("Lambda pipeline setup completed successfully",{lambdaId:i,serviceName:e.serviceName,stage:e.stage}),a}catch(i){throw this.logger.error("Lambda pipeline execution failed",{serviceName:e.serviceName,stage:e.stage,functionName:t.metadata.functionName,error:i instanceof Error?i.message:String(i),stack:i instanceof Error?i.stack:void 0}),i}}initializeRegistrar(e){this.logger.debug("Initializing microservice registrar");try{this.registrar=new ce;for(let[t,i]of Object.entries(e.register))this.logger.debug("Processing microservice",{serviceName:t,tiesCount:i.ties.length,lambdasCount:i.lambdas.length}),this.registrar.processService(t,i);this.logger.info("Microservice registrar initialized successfully",{serviceCount:Object.keys(e.register).length,totalLambdas:this.registrar.getLambdaIds().length})}catch(t){throw this.logger.error("Failed to initialize microservice registrar",{error:t instanceof Error?t.message:String(t)}),new Error(`Failed to initialize microservice registrar: ${t instanceof Error?t.message:String(t)}`)}}resolveLambdaId(){let e=process.env.LAMBDA_ID;if(!e)throw new Error("LAMBDA_ID environment variable not found. This should be set by the CDK stack during deployment.");return this.logger.debug("Lambda ID resolved from environment",{lambdaId:e}),e}getContainerForLambda(e){if(!this.registrar)throw new Error("Microservice registrar not initialized");try{let t=this.registrar.getContainerForLambda(e);return this.logger.debug("DI container retrieved successfully",{lambdaId:e,serviceName:this.registrar.getServiceForLambda(e)}),t}catch(t){throw this.logger.error("Failed to get DI container for Lambda",{lambdaId:e,error:t instanceof Error?t.message:String(t)}),new Error(`Failed to get DI container for Lambda '${e}': ${t instanceof Error?t.message:String(t)}`)}}createHandlerWithDI(e,t){this.logger.debug("Creating Lambda handler with DI",{lambdaId:e});try{this.handlerFactory||(this.handlerFactory=new re);let i=this.findLambdaDefinition(e),r=this.handlerFactory.create(i,t);return this.logger.info("Lambda handler created successfully",{lambdaId:e,dependencyCount:i.ties.length}),r}catch(i){throw this.logger.error("Failed to create Lambda handler",{lambdaId:e,error:i instanceof Error?i.message:String(i)}),new Error(`Failed to create Lambda handler for '${e}': ${i instanceof Error?i.message:String(i)}`)}}findLambdaDefinition(e){if(!this.registrar)throw new Error("Microservice registrar not initialized");try{return this.registrar.getLambdaDefinition(e)}catch(t){throw new Error(`Lambda definition not found for ID '${e}': ${t instanceof Error?t.message:String(t)}`)}}};var G={};ke(G,{RuntimeExtensions:()=>z});var Mo=Z(H());k(G,require("@worktif/purenow/lambda"));var wo=Z(H());var go=Z(H()),S=require("@worktif/utils");var z=class{constructor(){this.runtimeConfig={enableRuntimeCoreStack:!1,runtimeWebMode:"development",additionalFeatures:[],devServerEnhancements:{hotReload:!0,debugMode:!1,performanceMonitoring:!1},buildOptimizations:{bundleAnalysis:!1,treeshaking:!0,codeMinification:!0}};this.initializeRuntimeExtensions()}async initializeRuntimeExtensions(e){e?.log.now(this.runtimeConfig,{message:"Initializing runtime extensions",level:S.LoggerLevel.Info}),e?.log.now(null,{message:"Runtime extensions initialized successfully",level:S.LoggerLevel.Info})}async enhanceDevServer(e,t){let i=this.runtimeConfig.devServerEnhancements;t?.log.now({serverConfig:e,enhancements:i},{message:"Enhancing development server with runtime features",level:S.LoggerLevel.Debug});let r={...e,runtime:{hotReload:i?.hotReload??!0,debugMode:i?.debugMode??!1,performanceMonitoring:i?.performanceMonitoring??!1}};return t?.log.now(r,{message:"Development server Runtime Core with runtime features",level:S.LoggerLevel.Info}),r}async optimizeBuild(e,t){let i=this.runtimeConfig.buildOptimizations;t?.log.now({buildConfig:e,optimizations:i},{message:"Applying runtime-specific build optimizations",level:S.LoggerLevel.Debug});let r={...e,runtime:{bundleAnalysis:i?.bundleAnalysis??!1,treeshaking:i?.treeshaking??!0,codeMinification:i?.codeMinification??!0}};return t?.log.now(r,{message:"Build configuration optimized with runtime features",level:S.LoggerLevel.Info}),r}async configureRuntimeCoreStack(e,t){if(!this.runtimeConfig.enableRuntimeCoreStack){t?.log.now(null,{message:"Runtime Core stack deployment is disabled",level:S.LoggerLevel.Debug});return}t?.log.now(e,{message:"Configuring Runtime Core stack for runtime deployment",level:S.LoggerLevel.Debug});let i={stackName:`${e.stackName||"purenow"}-runtime`,resources:[{type:"Lambda",name:"RuntimeWebHandler",config:{runtime:"nodejs18.x",timeout:30,memorySize:512}}],dependencies:[`${e.stackName||"purenow"}-infrastructure`,`${e.stackName||"purenow"}-runtime-base`],outputs:{RuntimeStackArn:"runtime-stack-arn",RuntimeWebEndpoint:"runtime-web-endpoint"}};return t?.log.now(i,{message:"Runtime Core stack configuration created",level:S.LoggerLevel.Info}),i}async updateConfiguration(e,t){t?.log.now({oldConfig:this.runtimeConfig,newConfig:e},{message:"Updating runtime configuration",level:S.LoggerLevel.Debug}),this.runtimeConfig={...this.runtimeConfig,...e,devServerEnhancements:{...this.runtimeConfig.devServerEnhancements,...e.devServerEnhancements},buildOptimizations:{...this.runtimeConfig.buildOptimizations,...e.buildOptimizations}},t?.log.now(this.runtimeConfig,{message:"Runtime configuration updated",level:S.LoggerLevel.Info})}getConfiguration(){return{...this.runtimeConfig}}isFeatureEnabled(e){return this.runtimeConfig.additionalFeatures?.includes(e)??!1}async enableFeature(e,t){this.isFeatureEnabled(e)?t?.log.now({feature:e},{message:`Runtime feature '${e}' is already enabled`,level:S.LoggerLevel.Debug}):(this.runtimeConfig.additionalFeatures=[...this.runtimeConfig.additionalFeatures||[],e],t?.log.now({feature:e,enabledFeatures:this.runtimeConfig.additionalFeatures},{message:`Runtime feature '${e}' enabled`,level:S.LoggerLevel.Info}))}async disableFeature(e,t){this.isFeatureEnabled(e)?(this.runtimeConfig.additionalFeatures=(this.runtimeConfig.additionalFeatures||[]).filter(i=>i!==e),t?.log.now({feature:e,enabledFeatures:this.runtimeConfig.additionalFeatures},{message:`Runtime feature '${e}' disabled`,level:S.LoggerLevel.Info})):t?.log.now({feature:e},{message:`Runtime feature '${e}' is already disabled`,level:S.LoggerLevel.Debug})}};_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Initialize"),(0,S.catchInjector)("Runtime | Extensions | Initialize | Exception (error)"))],z.prototype,"initializeRuntimeExtensions",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Enhance Dev Server"),(0,S.catchInjector)("Runtime | Extensions | Enhance Dev Server | Exception (error)"))],z.prototype,"enhanceDevServer",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Optimize Build"),(0,S.catchInjector)("Runtime | Extensions | Optimize Build | Exception (error)"))],z.prototype,"optimizeBuild",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Configure Runtime Core stack"),(0,S.catchInjector)("Runtime | Extensions | Configure Runtime Core stack | Exception (error)"))],z.prototype,"configureRuntimeCoreStack",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Update Configuration"),(0,S.catchInjector)("Runtime | Extensions | Update Configuration | Exception (error)"))],z.prototype,"updateConfiguration",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Enable Feature"),(0,S.catchInjector)("Runtime | Extensions | Enable Feature | Exception (error)"))],z.prototype,"enableFeature",1),_([(0,S.injectBefore)((0,S.loggerInjector)("Runtime | Extensions | Disable Feature"),(0,S.catchInjector)("Runtime | Extensions | Disable Feature | Exception (error)"))],z.prototype,"disableFeature",1),z=_([(0,S.purable)()],z);var bo=Z(H());k(F,G,module.exports);var W={};ke(W,{RuntimeContainer:()=>ve,RuntimeDi:()=>ht});var Oo=Z(H());k(W,require("@worktif/purenow/lambda"));var ko=Z(H()),Le=require("@worktif/utils");var ve=class{constructor(){this.container=new Le.PureContainer({defaultScope:"Singleton"}),this.initializeRuntimeBindings()}initializeRuntimeBindings(){this.container.tieSingleton({RuntimeExtensions:{instance:z,dependencies:[]}})}getContainer(){return this.container}resolve(e){return this.container.run(e)}isRegistered(e){try{return this.container.run(e),!0}catch{return!1}}};ve=_([(0,Le.purable)()],ve);var Bo=Z(H()),ht=(d=>(d.RuntimeExtensionsServiceBind="runtime_extensions_service_bind",d.RuntimeConfigBind="runtime_config_bind",d.RuntimeDeploymentStrategyBind="runtime_deployment_strategy_bind",d.RuntimeCliBind="runtime_cli_bind",d.RuntimeStackConfigBind="runtime_stack_config_bind",d.RuntimeWebHandlerFactoryBind="runtime_web_handler_factory_bind",d))(ht||{});k(F,W,module.exports);0&&(module.exports={ContainerRegistry,DIContainerError,LambdaHandlerFactory,LambdaPipeline,MicroserviceRegistrar,MissingServiceError,PureContainerFactory,RuntimeContainer,RuntimeDetector,RuntimeDi,RuntimeExtensions,RuntimeWebLambdaHandler,TiesRegistrar,TiesRegistrationError,errorWrapper,fullWrapper,getBrowserMetadata,getCDKMetadata,getLambdaMetadata,loggingWrapper,timingWrapper,...require("@worktif/purenow/lambda")});
|
|
39
39
|
/*! Bundled license information:
|
|
40
40
|
|
|
41
41
|
reflect-metadata/Reflect.js:
|
|
@@ -54,4 +54,4 @@ reflect-metadata/Reflect.js:
|
|
|
54
54
|
and limitations under the License.
|
|
55
55
|
***************************************************************************** *)
|
|
56
56
|
*/
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L3J1bnRpbWUtd2ViLWxhbWJkYS1oYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2RldGVjdG9yL21ldGFkYXRhLWNvbGxlY3RvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGV0ZWN0b3IvcnVudGltZS1kZXRlY3Rvci50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kaS90aWVzLXJlZ2lzdHJhci50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kaS9kaS1lcnJvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvcHVyZS1jb250YWluZXItZmFjdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9oYW5kbGVyLXdyYXBwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcGlwZWxpbmVzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9taWNyb3NlcnZpY2UtcmVnaXN0cmFyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbnZlcnNpZnkvbGliL2VzbS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9pc1Byb21pc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb21tb24vc3JjL3NlcnZpY2VzL2NhbGN1bGF0aW9ucy9zdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvc2VydmljZXMvbW9kZWxzL0xhenlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9idWlsZEFycmF5TWV0YWRhdGFXaXRoQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEVsZW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEluZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlBcnJheU1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlNYXBNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9nZXRPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvZ2V0UmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL3NldFJlZmxlY3RNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy91cGRhdGVPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvdXBkYXRlUmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9hY3Rpb25zL2dldEJpbmRpbmdJZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdTY29wZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9jaGFpbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2NvbW1vbi9tb2RlbHMvT25lVG9NYW55TWFwU3Rhci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVmbGVjdE1ldGFkYXRhL2RhdGEvY2xhc3NNZXRhZGF0YVJlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvZ2V0RGVmYXVsdENsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZWZsZWN0TWV0YWRhdGEvZGF0YS9wZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50UmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb3JlRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9lcnJvci9tb2RlbHMvSW52ZXJzaWZ5Q29yZUVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQmluZGluZ1NlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL3NlcnZpY2VzL0RlYWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvbW9kZWxzL0NsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2lzUGVuZGluZ0NsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdmFsaWRhdGVDb25zdHJ1Y3Rvck1ldGFkYXRhQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdGhyb3dBdEludmFsaWRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRJbnN0YW5jZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUJpbmRpbmdDYWNoZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRHluYW1pY1ZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRmFjdG9yeUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUluc3RhbmNlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lUHJvdmlkZXJCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVSZXNvbHZlZFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lU2VydmljZVJlZGlyZWN0aW9uQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9hY3Rpb25zL2RlY29yYXRlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldERlZmF1bHRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9kZWNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkQ2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9hc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0TWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlTWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQcm9wZXJ0eS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9tb2RlbHMvRGVjb3JhdG9ySW5mb0tpbmQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaGFuZGxlSW5qZWN0aW9uRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL2dldERlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL3N0cmluZ2lmeURlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YUNvbnN0cnVjdG9yQXJndW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL2NsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaXNVc2VybGFuZEVtaXR0ZWRUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVDbGFzc01ldGFkYXRhV2l0aFR5cGVzY3JpcHRQYXJhbWV0ZXJUeXBlcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL3R5cGVzY3JpcHREZXNpZ25QYXJhbWV0ZXJUeXBlc1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0UGFyYW1ldGVyVHlwZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0YWJsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvc2V0SXNJbmplY3RhYmxlRmxhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRFeHRlbmRlZENvbnN0cnVjdG9yQXJndW1lbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldEV4dGVuZGVkUHJvcGVydGllcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbUJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEZyb21IaWVyYXJjaHkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL211bHRpSW5qZWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9pbmNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkRGVmYXVsdE1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL25hbWVkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNZXRhZGF0YU5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1ldGFkYXRhT3B0aW9uYWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL29wdGlvbmFsLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9wb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQb3N0Q29uc3RydWN0b3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3ByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YVByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3RhZ2dlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWV0YWRhdGFUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0VW5tYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRVbm1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkVW5tYW5hZ2VkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3VubWFuYWdlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL2NhbGN1bGF0aW9ucy9pc1N0YWNrT3ZlcmZsb3dFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9oYW5kbGVQbGFuRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9tb2RlbHMvTGF6eVBsYW5TZXJ2aWNlTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vbW9kZWxzL1NpbmdsZUltbXV0YWJsZUxpbmtlZExpc3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvYnVpbGRQbGFuQmluZGluZ0NvbnN0cmFpbnRzTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9pc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90aHJvd0Vycm9yV2hlblVuZXhwZWN0ZWRCaW5kaW5nc0Ftb3VudEZvdW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvc3RyaW5naWZ5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9jaGVja1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZVNpbmdsZUluamVjdGlvbkJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2NoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9nZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jYWNoZU5vblJvb3RQbGFuU2VydmljZU5vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5U3VicGxhbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbU1hbmFnZWRDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaXNJbnN0YW5jZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9wbGFuLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkR2V0UGxhbk9wdGlvbnNGcm9tUGxhblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL21vZGVscy9DYWNoZUJpbmRpbmdJbnZhbGlkYXRpb25LaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL21vZGVscy9XZWFrTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvYWRkU2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlMYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5TGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL3JlbW92ZVNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9zZXJ2aWNlcy9QbGFuUmVzdWx0Q2FjaGVTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9hZGRSb290U2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvcmVtb3ZlUm9vdFNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaGFuZGxlUmVzb2x2ZUVycm9yLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL2NhY2hlUmVzb2x2ZWRWYWx1ZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ0FjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTaW5nbGV0b25TY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9nZXRTZWxmLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTY29wZWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNjb3BlZEJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlRHluYW1pY1ZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQcm92aWRlckJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlUHJvdmlkZXJCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9nZXRJbnN0YW5jZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9jYWxjdWxhdGlvbnMvZ2V0UmVzb2x2ZWRWYWx1ZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvc2V0SW5zdGFuY2VQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVSZXNvbHZlZFZhbHVlQmluZGluZ1BhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNTY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nUHJlRGVzdHJveS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ3NEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVNb2R1bGVEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3BsdWdpbi9zcmMvcGx1Z2luL21vZGVscy9QbHVnaW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9hY3Rpb25zL2dldENvbnRhaW5lck1vZHVsZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvbW9kZWxzL0NvbnRhaW5lck1vZHVsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9iaW5kaW5nL3V0aWxzL0JpbmRpbmdDb25zdHJhaW50VXRpbHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb250YWluZXJFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvZXJyb3IvbW9kZWxzL0ludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRCaW5kaW5nSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNBbnlBbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0JpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5vTmFtZU5vclRhZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb3RQYXJlbnRCaW5kaW5nQ29uc3RyYWludHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUGFyZW50QmluZGluZ0NvbnN0cmFpbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL21vZGVscy9CaW5kaW5nRmx1ZW50U3ludGF4SW1wbGVtZW50YXRpb24udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUmVzb2x2ZWRWYWx1ZU1ldGFkYXRhSW5qZWN0T3B0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNNdWx0aXBsZVJlc29sdmVkVmFsdWVNZXRhZGF0YUluamVjdE9wdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0FueUFuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vdFBhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aFRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNQYXJlbnRCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vQW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvQmluZGluZ01hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbW1vbi9jYWxjdWxhdGlvbnMvZ2V0Rmlyc3RJdGVyYWJsZVJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29tbW9uL2FjdGlvbnMvZ2V0Rmlyc3RJdGVyYXRvclJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL0NvbnRhaW5lck1vZHVsZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9EZWFjdGl2YXRpb25QYXJhbXNNYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvY2FsY3VsYXRpb25zL2J1aWxkRGVhY3RpdmF0aW9uUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvYWN0aW9ucy9yZXNldERlYWN0aXZhdGlvblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5QYXJhbXNPcGVyYXRpb25zTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5SZXN1bHRDYWNoZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9QbHVnaW5NYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvU2VydmljZVJlZmVyZW5jZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TZXJ2aWNlUmVzb2x1dGlvbk1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TbmFwc2hvdE1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9Db250YWluZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL2NvbnRhaW5lci1yZWdpc3RyeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3J1bnRpbWUtZXh0ZW5zaW9ucy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9zZXJ2aWNlcy9ydW50aW1lLWV4dGVuc2lvbnMvcnVudGltZS1leHRlbnNpb25zLnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zL3J1bnRpbWUtZXh0ZW5zaW9ucy50eXBlcy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9idW5kbGUvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvYnVuZGxlL3J1bnRpbWUuY29udGFpbmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2J1bmRsZS9ydW50aW1lLmNvbnRhaW5lci50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BweU1vZGVUaGlzKCk7XG4gICAgICAgIHZhciBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihSZWZsZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIsIHJvb3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmdW5jdGlvblRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGluZGlyZWN0RXZhbFRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAwLCBldmFsKShcIihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pKClcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvcHB5TW9kZVRoaXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UaGlzKCkgfHwgaW5kaXJlY3RFdmFsVGhpcygpO1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyLCByb290KSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgX01hcCA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9IHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgcmVnaXN0cnlTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCA/IFN5bWJvbC5mb3IoXCJAcmVmbGVjdC1tZXRhZGF0YTpyZWdpc3RyeVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnkgPSBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhUHJvdmlkZXIgPSBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKG1ldGFkYXRhUmVnaXN0cnkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlEZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihwcm92aWRlci5PcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjMuMSBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICBwcm92aWRlci5PcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHkgfHwgeCAhPT0geCAmJiB5ICE9PSB5O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG1ldGFkYXRhIHJlZ2lzdHJ5XG4gICAgICAgIC8vIC0gQWxsb3dzIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCJgIGFuZCBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YS9uby1jb25mbGljdFwiYCB0byBpbnRlcm9wZXJhdGUuXG4gICAgICAgIC8vIC0gVXNlcyBpc29sYXRlZCBtZXRhZGF0YSBpZiBgUmVmbGVjdGAgaXMgZnJvemVuIGJlZm9yZSB0aGUgcmVnaXN0cnkgY2FuIGJlIGluc3RhbGxlZC5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSByZWdpc3RyeSB1c2VkIHRvIGFsbG93IG11bHRpcGxlIGByZWZsZWN0LW1ldGFkYXRhYCBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIGZhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgIShyZWdpc3RyeVN5bWJvbCBpbiByb290LlJlZmxlY3QpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBgcmVmbGVjdC1tZXRhZGF0YWAgdGhhdCBkaWQgbm90IHN1cHBvcnQgYSByZWdpc3RyeS5cbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocm9vdC5SZWZsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaXJzdDtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ7XG4gICAgICAgICAgICB2YXIgcmVzdDtcbiAgICAgICAgICAgIHZhciB0YXJnZXRQcm92aWRlck1hcCA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvdmlkZXI6IHJlZ2lzdGVyUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyOiBzZXRQcm92aWRlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGEgZnJvemVuIHJlZ2lzdHJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsbGJhY2sgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChmaXJzdCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3QgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChzZWNvbmQpOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWNvbmQgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0LmFkZChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmQuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3IocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXIoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoUCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBoYXNQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgPT09IHByb3ZpZGVyIHx8IHNlY29uZCA9PT0gcHJvdmlkZXIgfHwgIUlzVW5kZWZpbmVkKHJlc3QpICYmIHJlc3QuaGFzKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgcHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IGdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyICE9PSBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGV4aXN0aW5nUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNoYXJlZCByZWdpc3RyeSBvZiBtZXRhZGF0YSBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IHJvb3QuUmVmbGVjdFtyZWdpc3RyeVN5bWJvbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFSZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdC5SZWZsZWN0LCByZWdpc3RyeVN5bWJvbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YWRhdGFSZWdpc3RyeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihyZWdpc3RyeSkge1xuICAgICAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0YWRhdGEuaGFzKFApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBPcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IE9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeS5yZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkVGFyZ2V0TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUoTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBwcm92aWRlciBmb3IgdGFyZ2V0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5c1trXSA9IG5leHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhTWFwLmRlbGV0ZShNZXRhZGF0YUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyZWZsZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lTWV0YWRhdGEgPSByZWZsZWN0LmRlZmluZU1ldGFkYXRhLCBoYXNPd25NZXRhZGF0YSA9IHJlZmxlY3QuaGFzT3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGFLZXlzID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMsIGRlbGV0ZU1ldGFkYXRhID0gcmVmbGVjdC5kZWxldGVNZXRhZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU93bmVyID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBtZXRhZGF0YU93bmVyLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSAmJiBtZXRhZGF0YVByb3BlcnR5U2V0LmhhcyhQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE93bk1ldGFkYXRhS2V5cyhPLCBQKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhT3duZXIuc2V0KE8sIG1ldGFkYXRhUHJvcGVydHlTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldC5hZGQoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBkZWZpbmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBoYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBnZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogZ2V0T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IGRlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgcHJvdmlkZXIgZm9yIGFuIG9iamVjdC4gSWYgdGhlIG9iamVjdCBoYXMgbm8gbWV0YWRhdGEgcHJvdmlkZXIgYW5kIHRoaXMgaXMgZm9yIGEgY3JlYXRlIG9wZXJhdGlvbixcbiAgICAgICAgICogdGhlbiB0aGlzIG1vZHVsZSdzIG1ldGFkYXRhIHByb3ZpZGVyIGlzIGFzc2lnbmVkIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRQcm92aWRlciA9IG1ldGFkYXRhUmVnaXN0cnkuZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdGVyZWRQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YVJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIG1ldGFkYXRhUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgdmFyIE1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8oa2V5LCB0aGlzLl9jYWNoZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNhbWVWYWx1ZVplcm8odGhpcy5fY2FjaGVLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKHRoaXMuX2tleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVJbmRleCA8IDAgJiYgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBVVUlEX1NJWkUgPSAxNjtcbiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciByb290S2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5oYXModGFibGUsIHRoaXMuX2tleSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVbdGhpcy5fa2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVbmlxdWVLZXkoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBcIkBAV2Vha01hcEBAXCIgKyBDcmVhdGVVVUlEKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKEhhc2hNYXAuaGFzKGtleXMsIGtleSkpO1xuICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh0YXJnZXQsIHJvb3RLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcm9vdEtleSwgeyB2YWx1ZTogSGFzaE1hcC5jcmVhdGUoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEZpbGxSYW5kb21CeXRlcyhidWZmZXIsIHNpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gTWF0aC5yYW5kb20oKSAqIDB4ZmYgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZW5SYW5kb21CeXRlcyhzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxsUmFuZG9tQnl0ZXMoYXJyYXksIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiBcdTAwQTcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IGxvZ2dlciwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IExhbWJkYUFwaSB9IGZyb20gJ0B3b3JrdGlmL3B1cmV3cyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAYXdzLWxhbWJkYS1wb3dlcnRvb2xzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IExhbWJkYUludGVyZmFjZSB9IGZyb20gJ0Bhd3MtbGFtYmRhLXBvd2VydG9vbHMvY29tbW9ucy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhSGFuZGxlckZhY3RvcnkgfSBmcm9tICcuL2xhbWJkYS1oYW5kbGVyLWZhY3RvcnknO1xuXG4vKipcbiAqIFJ1bnRpbWUgV2ViIExhbWJkYSBoYW5kbGVyIHRoYXQgZXh0ZW5kcyBMYW1iZGFBcGkgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBUaGlzIGNsYXNzIGJyaWRnZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBleGlzdGluZyBQdXJlbm93IENvcmUgTGFtYmRhQXBpXG4gKiBpbmZyYXN0cnVjdHVyZSBhbmQgdGhlIG5ldyBSdW50aW1lIFdlYiBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEl0IGV4dGVuZHMgTGFtYmRhQXBpIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2hpbGUgYWRkaW5nIGF1dG9tYXRpY1xuICogREkgcmVzb2x1dGlvbiBhbmQgdXNlciBoYW5kbGVyIGludm9jYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhhbmRsZXIgPSBuZXcgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIoZGVmaW5pdGlvbiwgY29udGFpbmVyLCBmYWN0b3J5KTtcbiAqXG4gKiAvLyBBV1MgTGFtYmRhIHJ1bnRpbWUgY2FsbHMgdGhpcyBtZXRob2RcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIGV4dGVuZHMgTGFtYmRhQXBpIGltcGxlbWVudHMgTGFtYmRhSW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VySGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBSdW50aW1lIFdlYiBMYW1iZGEgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHBhcmFtIGZhY3RvcnkgLSBGYWN0b3J5IGluc3RhbmNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgd3JhcHBpbmdcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmaW5pdGlvbjogTGFtYmRhRGVmaW5pdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeTogTGFtYmRhSGFuZGxlckZhY3RvcnksXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcih7XG4gICAgICBzZXJ2aWNlTmFtZTogJ0Bjb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInLFxuICAgICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGFtYmRhSWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICAgIHNlcnZpY2U6IGRlZmluaXRpb24uc2VydmljZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBQcmUtcmVzb2x2ZSB0aGUgdXNlciBoYW5kbGVyIHdpdGggZGVwZW5kZW5jaWVzXG4gICAgdGhpcy51c2VySGFuZGxlciA9IHRoaXMuY3JlYXRlVXNlckhhbmRsZXIoKTtcblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ1J1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIGluaXRpYWxpemVkJywge1xuICAgICAgbGFtYmRhSWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICBzZXJ2aWNlOiBkZWZpbml0aW9uLnNlcnZpY2UsXG4gICAgICBkZXBlbmRlbmN5Q291bnQ6IGRlZmluaXRpb24udGllcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBMYW1iZGEgaGFuZGxlciBtZXRob2QgY2FsbGVkIGJ5IEFXUyBMYW1iZGEgcnVudGltZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBBV1MgTGFtYmRhIHJ1bnRpbWUgZm9yIGVhY2ggaW52b2NhdGlvbi5cbiAgICogSXQgaW5qZWN0cyBkZXBlbmRlbmNpZXMsIGNhbGxzIHRoZSB1c2VyJ3MgaGFuZGxlciBmdW5jdGlvbiwgYW5kIHJldHVybnNcbiAgICogdGhlIHJlc3VsdC4gRXh0ZW5kcyB0aGUgZXhpc3RpbmcgTGFtYmRhQXBpLmhhbmRsZXIoKSBtZXRob2QgdG8gYWRkXG4gICAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN1cHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCAtIExhbWJkYSBldmVudCBvYmplY3RcbiAgICogQHBhcmFtIGNvbnRleHQgLSBMYW1iZGEgY29udGV4dCBvYmplY3RcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGhhbmRsZXIgcmVzdWx0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQVdTIExhbWJkYSBydW50aW1lIGNhbGxzIHRoaXMgYXV0b21hdGljYWxseVxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZXIoYXBpR2F0ZXdheUV2ZW50LCBsYW1iZGFDb250ZXh0KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYW5kbGVyKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdIYW5kbGVyIGludm9jYXRpb24gc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiB0eXBlb2YgZXZlbnQsXG4gICAgICAgIGNvbnRleHRUeXBlOiB0eXBlb2YgY29udGV4dCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDYWxsIHRoZSBwcmUtcmVzb2x2ZWQgdXNlciBoYW5kbGVyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnVzZXJIYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0hhbmRsZXIgaW52b2NhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICByZXN1bHRUeXBlOiB0eXBlb2YgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0hhbmRsZXIgaW52b2NhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdGhyb3cgdG8gbWFpbnRhaW4gTGFtYmRhIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSB1c2VyIGhhbmRsZXIgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgd3JhcHBpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXNcbiAgICogYW5kIGNyZWF0ZSB0aGUgd3JhcHBlZCB1c2VyIGhhbmRsZXIuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGZvciByZXVzZVxuICAgKiBhY3Jvc3MgTGFtYmRhIGludm9jYXRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERJIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFdyYXBwZWQgdXNlciBoYW5kbGVyIHdpdGggZGVwZW5kZW5jaWVzIGluamVjdGVkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVVzZXJIYW5kbGVyKCk6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEluamVjdCBkZXBlbmRlbmNpZXMgdXNpbmcgdGhlIGZhY3RvcnlcbiAgICAgIGNvbnN0IGRlcHMgPSB0aGlzLmZhY3RvcnkuaW5qZWN0RGVwZW5kZW5jaWVzKHRoaXMuZGVmaW5pdGlvbi50aWVzLCB0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdEZXBlbmRlbmNpZXMgcmVzb2x2ZWQgZm9yIHVzZXIgaGFuZGxlcicsIHtcbiAgICAgICAgZGVwZW5kZW5jeUtleXM6IE9iamVjdC5rZXlzKGRlcHMpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdXNlciBoYW5kbGVyIGZyb20gdGhlIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IHJhd1VzZXJIYW5kbGVyID0gdGhpcy5kZWZpbml0aW9uLmhhbmRsZXIoZGVwcyk7XG5cbiAgICAgIC8vIFdyYXAgdGhlIGhhbmRsZXIgd2l0aCBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZ1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSB0aGlzLmZhY3Rvcnkud3JhcEhhbmRsZXIocmF3VXNlckhhbmRsZXIsIHtcbiAgICAgICAgaWQ6IHRoaXMuZGVmaW5pdGlvbi5pZCB8fCAndW5rbm93bicsXG4gICAgICAgIHNlcnZpY2U6IHRoaXMuZGVmaW5pdGlvbi5zZXJ2aWNlIHx8ICd1bmtub3duJyxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdVc2VyIGhhbmRsZXIgY3JlYXRlZCBhbmQgd3JhcHBlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgICAgcmV0dXJuIHdyYXBwZWRIYW5kbGVyO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIgaGFuZGxlcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHVzZXIgaGFuZGxlciBmb3IgTGFtYmRhICcke3RoaXMuZGVmaW5pdGlvbi5pZH0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTGFtYmRhIGRlZmluaXRpb24gdXNlZCBieSB0aGlzIGhhbmRsZXIuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgTGFtYmRhIGRlZmluaXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgKiBvciBpbnRyb3NwZWN0aW9uIHB1cnBvc2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgTGFtYmRhIGRlZmluaXRpb25cbiAgICovXG4gIGdldERlZmluaXRpb24oKTogTGFtYmRhRGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFB1cmVDb250YWluZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgREkgY29udGFpbmVyIGZvciBkZWJ1Z2dpbmcgb3IgYWR2YW5jZWRcbiAgICogdXNlIGNhc2VzLiBHZW5lcmFsbHkgbm90IG5lZWRlZCBpbiBub3JtYWwgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgUHVyZUNvbnRhaW5lciBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q29udGFpbmVyKCk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBoYW5kbGVyIGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIGhhbmRsZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHlcbiAgICogYW5kIGlzIHJlYWR5IGZvciBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGhhbmRsZXIgaXMgcmVhZHksIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VySGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBSZS1leHBvcnQgYmFzZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZnJvbSBQdXJlbm93XG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93L2xhbWJkYSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXdlYiBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtd2ViJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgc2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBidW5kbGVcbmV4cG9ydCAqIGZyb20gJy4vYnVuZGxlJztcblxuLy8gQG5vdGU6IHJ1bnRpbWUtd2ViIGlzIE5PVCBleHBvcnRlZCBmcm9tIExhbWJkYSBidW5kbGUgKGNvbnRhaW5zIENESyBjb25zdHJ1Y3RzKVxuLy8gSXQncyBvbmx5IHVzZWQgZm9yIGJ1aWxkLXRpbWUgQ0RLIHN5bnRoZXNpcywgbm90IExhbWJkYSBydW50aW1lXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RldGVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZGknO1xuZXhwb3J0ICogZnJvbSAnLi9mYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVnaXN0cmFyJztcblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJNZXRhZGF0YSwgQ0RLTWV0YWRhdGEsIExhbWJkYU1ldGFkYXRhIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5cbi8qKlxuICogQ29sbGVjdCBicm93c2VyIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQgaW5jbHVkaW5nXG4gKiB1c2VyIGFnZW50LCBjdXJyZW50IFVSTCwgYW5kIHZpZXdwb3J0IGRpbWVuc2lvbnMuIFRoaXMgbWV0YWRhdGEgaXNcbiAqIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgYW5hbHl0aWNzIHB1cnBvc2VzLlxuICpcbiAqIEByZXR1cm5zIEJyb3dzZXIgbWV0YWRhdGEgb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIGJyb3dzZXIgQVBJcyBhcmUgbm90IGF2YWlsYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhZGF0YSA9IGdldEJyb3dzZXJNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYFVzZXIgaXMgb24gJHttZXRhZGF0YS51cmx9IHdpdGggJHttZXRhZGF0YS52aWV3cG9ydC53aWR0aH14JHttZXRhZGF0YS52aWV3cG9ydC5oZWlnaHR9IHZpZXdwb3J0YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJNZXRhZGF0YSgpOiBCcm93c2VyTWV0YWRhdGEge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIEFQSXMgbm90IGF2YWlsYWJsZSAtIHdpbmRvdyBvciBuYXZpZ2F0b3IgaXMgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICB2aWV3cG9ydDoge1xuICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgfSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgYnJvd3NlciBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgTGFtYmRhIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIEFXUyBMYW1iZGEgcnVudGltZSBlbnZpcm9ubWVudFxuICogaW5jbHVkaW5nIGZ1bmN0aW9uIGRldGFpbHMsIHJlZ2lvbiwgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGFuZCByZXF1ZXN0IGNvbnRleHQuXG4gKiBVc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUuXG4gKlxuICogQHJldHVybnMgTGFtYmRhIG1ldGFkYXRhIG9iamVjdFxuICogQHRocm93cyBFcnJvciBpZiByZXF1aXJlZCBMYW1iZGEgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBtaXNzaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0TGFtYmRhTWV0YWRhdGEoKTtcbiAqIGNvbnNvbGUubG9nKGBMYW1iZGEgJHttZXRhZGF0YS5mdW5jdGlvbk5hbWV9IGluICR7bWV0YWRhdGEucmVnaW9ufSB3aXRoICR7bWV0YWRhdGEubWVtb3J5TGltaXR9TUJgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhTWV0YWRhdGEoKTogTGFtYmRhTWV0YWRhdGEge1xuICB0cnkge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcbiAgICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZW1vcnlTaXplID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9NRU1PUllfU0laRSB8fCAnMTI4JywgMTApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIHZlcnNpb246IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTiB8fCAnJExBVEVTVCcsXG4gICAgICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OIHx8ICd1cy1lYXN0LTEnLFxuICAgICAgbWVtb3J5TGltaXQ6IGlzTmFOKG1lbW9yeVNpemUpID8gMTI4IDogbWVtb3J5U2l6ZSxcbiAgICAgIHJlcXVlc3RJZDogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9MT0dfU1RSRUFNX05BTUUsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb2xsZWN0IExhbWJkYSBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgQ0RLIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIENESyBlbnZpcm9ubWVudCBpbmNsdWRpbmdcbiAqIEFXUyBhY2NvdW50LCByZWdpb24sIENESyB2ZXJzaW9uLCBhbmQgTm9kZS5qcyB2ZXJzaW9uLiBUaGlzIG1ldGFkYXRhXG4gKiBpcyB1c2VkIGZvciBkZXBsb3ltZW50IGNvbnRleHQgYW5kIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmV0dXJucyBDREsgbWV0YWRhdGEgb2JqZWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0Q0RLTWV0YWRhdGEoKTtcbiAqIGNvbnNvbGUubG9nKGBEZXBsb3lpbmcgdG8gYWNjb3VudCAke21ldGFkYXRhLmFjY291bnR9IGluICR7bWV0YWRhdGEucmVnaW9ufWApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDREtNZXRhZGF0YSgpOiBDREtNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgJ3Vua25vd24nLFxuICAgICAgcmVnaW9uOiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04gfHwgJ3VzLWVhc3QtMScsXG4gICAgICBjZGtWZXJzaW9uOiBwcm9jZXNzLmVudi5DREtfVkVSU0lPTixcbiAgICAgIG5vZGVWZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb2xsZWN0IENESyBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENvbnRleHQgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IGdldEJyb3dzZXJNZXRhZGF0YSwgZ2V0Q0RLTWV0YWRhdGEsIGdldExhbWJkYU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS1jb2xsZWN0b3JzJztcblxuLyoqXG4gKiBSdW50aW1lIGVudmlyb25tZW50IGRldGVjdG9yIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IChicm93c2VyLCBMYW1iZGEsIG9yIENESylcbiAqIGFuZCBwcm92aWRlcyBhcHByb3ByaWF0ZSBtZXRhZGF0YSBmb3IgZWFjaCBjb250ZXh0LiBUaGlzIGVuYWJsZXMgdGhlXG4gKiB1bmlmaWVkIHB1cmVub3coKSBlbnRyeSBwb2ludCB0byByb3V0ZSBleGVjdXRpb24gdG8gdGhlIGNvcnJlY3QgcGlwZWxpbmUuXG4gKlxuICogKipEZXRlY3Rpb24gUHJpb3JpdHkqKjpcbiAqIDEuIEJyb3dzZXI6IENoZWNrIGZvciBgd2luZG93YCBvYmplY3RcbiAqIDIuIExhbWJkYTogQ2hlY2sgZm9yIGBBV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUVgIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKiAzLiBDREs6IENoZWNrIGZvciBleHBsaWNpdCBtb2RlLCBDREsgZW52IHZhcnMsIG9yIHByb2Nlc3MgYXJndW1lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRldGVjdG9yID0gbmV3IFJ1bnRpbWVEZXRlY3RvcigpO1xuICogY29uc3QgY29udGV4dCA9IGRldGVjdG9yLmRldGVjdCgpO1xuICpcbiAqIHN3aXRjaCAoY29udGV4dC50eXBlKSB7XG4gKiAgIGNhc2UgJ2Jyb3dzZXInOlxuICogICAgIC8vIEV4ZWN1dGUgYnJvd3NlciBwaXBlbGluZVxuICogICAgIGJyZWFrO1xuICogICBjYXNlICdsYW1iZGEnOlxuICogICAgIC8vIEV4ZWN1dGUgTGFtYmRhIHBpcGVsaW5lXG4gKiAgICAgYnJlYWs7XG4gKiAgIGNhc2UgJ2Nkayc6XG4gKiAgICAgLy8gRXhlY3V0ZSBDREsgcGlwZWxpbmVcbiAqICAgICBicmVhaztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZURldGVjdG9yIHtcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBVc2VzIGEgc2VyaWVzIG9mIGNoZWNrcyB0byBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiBjb250ZXh0OlxuICAgKiAtIEJyb3dzZXI6IFByZXNlbmNlIG9mIGB3aW5kb3dgIG9iamVjdFxuICAgKiAtIExhbWJkYTogQVdTIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogLSBDREs6IEV4cGxpY2l0IG1vZGUgb3IgQ0RLLXNwZWNpZmljIGluZGljYXRvcnNcbiAgICpcbiAgICogQHJldHVybnMgRW52aXJvbm1lbnQgY29udGV4dCB3aXRoIHR5cGUgYW5kIG1ldGFkYXRhXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZW52aXJvbm1lbnQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIGRldGVjdCgpOiBFbnZpcm9ubWVudENvbnRleHQge1xuICAgIGlmICh0aGlzLmlzQnJvd3NlcigpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnYnJvd3NlcicsXG4gICAgICAgIG1ldGFkYXRhOiBnZXRCcm93c2VyTWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNMYW1iZGEoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2xhbWJkYScsXG4gICAgICAgIG1ldGFkYXRhOiBnZXRMYW1iZGFNZXRhZGF0YSgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NESygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnY2RrJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldENES01ldGFkYXRhKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdVbmFibGUgdG8gZGV0ZWN0IHJ1bnRpbWUgZW52aXJvbm1lbnQuICcgK1xuICAgICAgJ0V4cGVjdGVkIGJyb3dzZXIgKHdpbmRvdyBvYmplY3QpLCBMYW1iZGEgKEFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSksICcgK1xuICAgICAgJ29yIENESyAoUFVSRU5PV19NT0RFPWNkayBvciBDREsgZW52aXJvbm1lbnQgdmFyaWFibGVzKS4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcnVubmluZyBpbiBicm93c2VyIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGB3aW5kb3dgIG9iamVjdCBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIEFXUyBMYW1iZGEgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgQVdTIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwcmVzZW50XG4gICAqL1xuICBwcml2YXRlIGlzTGFtYmRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIENESyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogVXNlcyBtdWx0aXBsZSBkZXRlY3Rpb24gbWV0aG9kcyBpbiBwcmlvcml0eSBvcmRlcjpcbiAgICogMS4gRXhwbGljaXQgbW9kZTogUFVSRU5PV19NT0RFPWNkayAocmVjb21tZW5kZWQpXG4gICAqIDIuIENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IENES19ERUZBVUxUX0FDQ09VTlQgb3IgQ0RLX0RFRkFVTFRfUkVHSU9OXG4gICAqIDMuIFByb2Nlc3MgYXJndW1lbnRzOiBjb250YWlucyAnY2RrJyBvciAnc3ludGgnXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgQ0RLIGVudmlyb25tZW50IGlzIGRldGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGlzQ0RLKCk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yaXR5IDE6IEV4cGxpY2l0IG1vZGUgKHJlY29tbWVuZGVkKVxuICAgIGlmIChwcm9jZXNzLmVudi5QVVJFTk9XX01PREUgPT09ICdjZGsnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQcmlvcml0eSAyOiBDREsgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgaWYgKHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQcmlvcml0eSAzOiBQcm9jZXNzIGFyZ3VtZW50c1xuICAgIHJldHVybiBwcm9jZXNzLmFyZ3Yuc29tZShhcmcgPT5cbiAgICAgIGFyZy5pbmNsdWRlcygnY2RrJykgfHwgYXJnLmluY2x1ZGVzKCdzeW50aCcpLFxuICAgICk7XG4gIH1cblxuXG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBwdXJhYmxlLCBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaWVzSW5zdGFuY2UgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IFRpZXNSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gJy4vZGktZXJyb3JzJztcblxuLyoqXG4gKiBUaWVzIHJlZ2lzdHJhdGlvbiBoZWxwZXIgZm9yIFB1cmVDb250YWluZXIgaW50ZWdyYXRpb24uXG4gKlxuICogUHJvY2Vzc2VzIFRpZXMgY2xhc3NlcyBhbmQgcmVnaXN0ZXJzIHRoZWlyIHNlcnZpY2VzIHdpdGggYSBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICogRWFjaCBUaWVzIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgcmVnaXN0ZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pIG1ldGhvZFxuICogdGhhdCB1c2VzIGNvbnRhaW5lci50aWUoKSwgY29udGFpbmVyLnRpZUNvbnN0KCksIG9yIGNvbnRhaW5lci50aWVTaW5nbGV0b24oKSB0b1xuICogcmVnaXN0ZXIgc2VydmljZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBUaWVzUmVnaXN0cmFyKCk7XG4gKiBjb25zdCBjb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KHsgZGVmYXVsdFNjb3BlOiAnU2luZ2xldG9uJyB9KTtcbiAqXG4gKiByZWdpc3RyYXIucmVnaXN0ZXJUaWVzKGNvbnRhaW5lciwgW1BheW1lbnRzVGllcywgQmlsbGluZ1RpZXNdKTtcbiAqXG4gKiAvLyBOb3cgY29udGFpbmVyIGhhcyBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSB0aGUgVGllcyBjbGFzc2VzXG4gKiBjb25zdCBwYXltZW50c1NlcnZpY2UgPSBjb250YWluZXIucnVuKCdQYXltZW50c1NlcnZpY2UnKTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgVGllc1JlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgVGllcyBjbGFzc2VzIHdpdGggdGhlIHByb3ZpZGVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogQ2FsbHMgdGhlIHJlZ2lzdGVyKGNvbnRhaW5lcikgbWV0aG9kIG9uIGVhY2ggVGllcyBjbGFzcyBpbnN0YW5jZS5cbiAgICogVGhlIFRpZXMgY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgY29udGFpbmVyLnRpZSgpLFxuICAgKiBjb250YWluZXIudGllQ29uc3QoKSwgb3IgY29udGFpbmVyLnRpZVNpbmdsZXRvbigpIHRvIHJlZ2lzdGVyIHRoZWlyIHNlcnZpY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSB0byByZWdpc3RlciBzZXJ2aWNlcyB3aXRoXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzXG4gICAqIEB0aHJvd3MgVGllc1JlZ2lzdHJhdGlvbkVycm9yIGlmIGEgVGllcyBjbGFzcyBkb2Vzbid0IGltcGxlbWVudCByZWdpc3RlcigpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVGllcyBjbGFzcyBleGFtcGxlXG4gICAqIGNsYXNzIFBheW1lbnRzVGllcyB7XG4gICAqICAgcmVnaXN0ZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pOiB2b2lkIHtcbiAgICogICAgIGNvbnRhaW5lci50aWVTaW5nbGV0b24oe1xuICAgKiAgICAgICBQYXltZW50c1NlcnZpY2U6IHtcbiAgICogICAgICAgICBpbnN0YW5jZTogUGF5bWVudHNTZXJ2aWNlLFxuICAgKiAgICAgICAgIGFyZ3M6IFtdXG4gICAqICAgICAgIH1cbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiByZWdpc3RyYXIucmVnaXN0ZXJUaWVzKGNvbnRhaW5lciwgW1BheW1lbnRzVGllc10pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyVGllcyhjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBUaWVzQ2xhc3Mgb2YgdGllc0NsYXNzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRpZXNJbnN0YW5jZSA9IG5ldyBUaWVzQ2xhc3MoKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgVGllcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByZWdpc3RlciBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiB0aWVzSW5zdGFuY2UucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGllc1JlZ2lzdHJhdGlvbkVycm9yKFxuICAgICAgICAgICAgVGllc0NsYXNzLm5hbWUsXG4gICAgICAgICAgICAnVGllcyBjbGFzcyBtdXN0IGltcGxlbWVudCByZWdpc3Rlcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPikgbWV0aG9kJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgcmVnaXN0ZXIgbWV0aG9kIHRvIGxldCB0aGUgVGllcyBjbGFzcyByZWdpc3RlciBpdHMgc2VydmljZXNcbiAgICAgICAgdGllc0luc3RhbmNlLnJlZ2lzdGVyKGNvbnRhaW5lcik7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRpZXNSZWdpc3RyYXRpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFRpZXNSZWdpc3RyYXRpb25FcnJvcihcbiAgICAgICAgICBUaWVzQ2xhc3MubmFtZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIG9yIHJlZ2lzdGVyIFRpZXMgY2xhc3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIGFyZSByZWdpc3RlcmVkIGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgZWFjaCBzZXJ2aWNlIG5hbWUgdG8gZW5zdXJlIGl0J3MgcHJvcGVybHkgcmVnaXN0ZXJlZC5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIG1pc3Npbmcgc2VydmljZSByZWdpc3RyYXRpb25zIGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gcmVxdWlyZWRTZXJ2aWNlcyAtIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBtdXN0IGJlIHJlZ2lzdGVyZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhbnkgcmVxdWlyZWQgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdHJhci52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIFsnUGF5bWVudHNTZXJ2aWNlJywgJ0JpbGxpbmdTZXJ2aWNlJ10pO1xuICAgKiBgYGBcbiAgICovXG4gIHZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCByZXF1aXJlZFNlcnZpY2VzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VydmljZU5hbWUgb2YgcmVxdWlyZWRTZXJ2aWNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzZXJ2aWNlICh0aGlzIHdpbGwgdGhyb3cgaWYgbm90IHJlZ2lzdGVyZWQpXG4gICAgICAgIGNvbnRhaW5lci5ydW4oc2VydmljZU5hbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbWlzc2luZ1NlcnZpY2VzLnB1c2goc2VydmljZU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVxdWlyZWQgc2VydmljZXMgYXJlIG5vdCByZWdpc3RlcmVkIGluIGNvbnRhaW5lcjogJHttaXNzaW5nU2VydmljZXMuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBzZXJ2aWNlIG5hbWVzIGZyb20gVGllcyBjbGFzc2VzIGZvciB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lXG4gICAqIHdoaWNoIHNlcnZpY2VzIHNob3VsZCBiZSByZWdpc3RlcmVkIGJ5IGEgc2V0IG9mIFRpZXMgY2xhc3Nlcy5cbiAgICogTm90ZTogVGhpcyByZXF1aXJlcyB0aGUgVGllcyBjbGFzc2VzIHRvIGV4cG9zZSB0aGVpciBzZXJ2aWNlIG5hbWVzLFxuICAgKiB3aGljaCBpcyBvcHRpb25hbCBidXQgcmVjb21tZW5kZWQgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4cGVjdGVkU2VydmljZXMgPSByZWdpc3RyYXIuZXh0cmFjdFNlcnZpY2VOYW1lcyhbUGF5bWVudHNUaWVzXSk7XG4gICAqIHJlZ2lzdHJhci52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIGV4cGVjdGVkU2VydmljZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4dHJhY3RTZXJ2aWNlTmFtZXModGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgVGllc0NsYXNzIG9mIHRpZXNDbGFzc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0aWVzSW5zdGFuY2UgPSBuZXcgVGllc0NsYXNzKCkgYXMgYW55O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBUaWVzIGNsYXNzIGV4cG9zZXMgaXRzIHNlcnZpY2UgbmFtZXNcbiAgICAgICAgaWYgKHR5cGVvZiB0aWVzSW5zdGFuY2UuZ2V0U2VydmljZU5hbWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgbmFtZXMgPSB0aWVzSW5zdGFuY2UuZ2V0U2VydmljZU5hbWVzKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXMpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlTmFtZXMucHVzaCguLi5uYW1lcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGR1cmluZyBzZXJ2aWNlIG5hbWUgZXh0cmFjdGlvblxuICAgICAgICAvLyBUaGlzIGlzIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmljZU5hbWVzO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgREkgY29udGFpbmVyIG9wZXJhdGlvbiBmYWlscy5cbiAqXG4gKiBVc2VkIGZvciBjb250YWluZXIgY3JlYXRpb24sIHNlcnZpY2UgcmVzb2x1dGlvbiwgYW5kIHZhbGlkYXRpb24gZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgRElDb250YWluZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBESSBjb250YWluZXIgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJOYW1lIC0gTmFtZSBvciBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXJcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBEZXRhaWxlZCBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJOYW1lOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBESSBDb250YWluZXIgJyR7Y29udGFpbmVyTmFtZX0nOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0RJQ29udGFpbmVyRXJyb3InO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gVGllcyBjbGFzcyByZWdpc3RyYXRpb24gZmFpbHMuXG4gKlxuICogVXNlZCB3aGVuIGEgVGllcyBjbGFzcyBkb2Vzbid0IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgcmVnaXN0ZXIoKSBtZXRob2RcbiAqIG9yIHdoZW4gcmVnaXN0cmF0aW9uIGZhaWxzIGZvciBvdGhlciByZWFzb25zLlxuICovXG5leHBvcnQgY2xhc3MgVGllc1JlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFRpZXMgcmVnaXN0cmF0aW9uIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzTmFtZSAtIE5hbWUgb2YgdGhlIFRpZXMgY2xhc3MgdGhhdCBmYWlsZWRcbiAgICogQHBhcmFtIHJlYXNvbiAtIFJlYXNvbiBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBmYWlsdXJlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0aWVzQ2xhc3NOYW1lOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRpZXMgcmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgJyR7dGllc0NsYXNzTmFtZX0nOiAke3JlYXNvbn1gKTtcbiAgICB0aGlzLm5hbWUgPSAnVGllc1JlZ2lzdHJhdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgcmVxdWlyZWQgc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byByZXNvbHZlIGEgc2VydmljZSB0aGF0IGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaW5nU2VydmljZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG1pc3Npbmcgc2VydmljZSBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWlzc2luZyBzZXJ2aWNlXG4gICAqIEBwYXJhbSBjb250YWluZXJOYW1lIC0gTmFtZSBvciBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgbm90IGZvdW5kIGluIGNvbnRhaW5lciAnJHtjb250YWluZXJOYW1lfSdgKTtcbiAgICB0aGlzLm5hbWUgPSAnTWlzc2luZ1NlcnZpY2VFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFRpZXNJbnN0YW5jZSB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgVGllc1JlZ2lzdHJhciB9IGZyb20gJy4vdGllcy1yZWdpc3RyYXInO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciB9IGZyb20gJy4vZGktZXJyb3JzJztcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBhbmQgY29uZmlndXJpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgZm9yIG1pY3Jvc2VydmljZXMuXG4gKlxuICogQ3JlYXRlcyBQdXJlQ29udGFpbmVyPHN0cmluZz4gaW5zdGFuY2VzIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQgYW5kXG4gKiByZWdpc3RlcnMgYWxsIHNlcnZpY2VzIGZyb20gdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy4gVGhpcyBwcm92aWRlcyBhXG4gKiBjb25zaXN0ZW50IHdheSB0byBidWlsZCBESSBjb250YWluZXJzIGZvciBtaWNyb3NlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmYWN0b3J5ID0gbmV3IFB1cmVDb250YWluZXJGYWN0b3J5KCk7XG4gKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10pO1xuICpcbiAqIC8vIENvbnRhaW5lciBub3cgaGFzIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoZSBUaWVzIGNsYXNzZXNcbiAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBQdXJlQ29udGFpbmVyRmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGllc1JlZ2lzdHJhcjogVGllc1JlZ2lzdHJhcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIgPSBuZXcgVGllc1JlZ2lzdHJhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFB1cmVDb250YWluZXIgZm9yIGEgbWljcm9zZXJ2aWNlIHdpdGggcmVnaXN0ZXJlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQsXG4gICAqIHRoZW4gcmVnaXN0ZXJzIGFsbCBzZXJ2aWNlcyBmcm9tIHRoZSBwcm92aWRlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzIHRvIHJlZ2lzdGVyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyZWQgUHVyZUNvbnRhaW5lciB3aXRoIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBjb250YWluZXIgY3JlYXRpb24gb3IgcmVnaXN0cmF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIoW1xuICAgKiAgIFBheW1lbnRzVGllcyxcbiAgICogICBCaWxsaW5nVGllcyxcbiAgICogICBDb25maWdUaWVzXG4gICAqIF0pO1xuICAgKlxuICAgKiAvLyBVc2UgdGhlIGNvbnRhaW5lciB0byByZXNvbHZlIHNlcnZpY2VzXG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBjb25zdCBjb25maWcgPSBjb250YWluZXIucnVuQ29uc3RhbnQoJ1BheW1lbnRzQ29uZmlnJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBQdXJlQ29udGFpbmVyIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHRcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oe1xuICAgICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFsbCBUaWVzIGNsYXNzZXNcbiAgICAgIHRoaXMudGllc1JlZ2lzdHJhci5yZWdpc3RlclRpZXMoY29udGFpbmVyLCB0aWVzQ2xhc3Nlcyk7XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdtaWNyb3NlcnZpY2UnLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBtaWNyb3NlcnZpY2UgY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUHVyZUNvbnRhaW5lciB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBBbGxvd3MgY3JlYXRpbmcgY29udGFpbmVycyB3aXRoIGN1c3RvbSBzY29wZSBzZXR0aW5ncyBvciBvdGhlciBvcHRpb25zLlxuICAgKiBTdGlsbCByZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnMgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQdXJlQ29udGFpbmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDb25maWd1cmVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIG9yIHJlZ2lzdHJhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgKiAgIFtQYXltZW50c1RpZXNdLFxuICAgKiAgIHsgZGVmYXVsdFNjb3BlOiAnVHJhbnNpZW50JyB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgIHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSxcbiAgICBvcHRpb25zOiB7IGRlZmF1bHRTY29wZT86ICdTaW5nbGV0b24nIHwgJ1RyYW5zaWVudCcgfSA9IHt9LFxuICApOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KG9wdGlvbnMpO1xuICAgICAgdGhpcy50aWVzUmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIHRpZXNDbGFzc2VzKTtcbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdjdXN0b20nLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBjdXN0b20gY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIGNvbnRhaW5lciBoYXMgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byBUaWVzUmVnaXN0cmFyLnZhbGlkYXRlQ29udGFpbmVyKCkuXG4gICAqIFVzZWZ1bCBmb3IgZW5zdXJpbmcgY29udGFpbmVyIGludGVncml0eSBhZnRlciBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHJlcXVpcmVkU2VydmljZXMgLSBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHJlcXVpcmVkIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzXSk7XG4gICAqIGZhY3RvcnkudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBbJ1BheW1lbnRzU2VydmljZScsICdQYXltZW50c0NvbmZpZyddKTtcbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgcmVxdWlyZWRTZXJ2aWNlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCByZXF1aXJlZFNlcnZpY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250YWluZXIgYW5kIHZhbGlkYXRlIGl0IGhhcyBhbGwgZXhwZWN0ZWQgc2VydmljZXMuXG4gICAqXG4gICAqIENvbWJpbmVzIGNvbnRhaW5lciBjcmVhdGlvbiB3aXRoIHZhbGlkYXRpb24gaW4gYSBzaW5nbGUgc3RlcC5cbiAgICogQXV0b21hdGljYWxseSBleHRyYWN0cyBleHBlY3RlZCBzZXJ2aWNlIG5hbWVzIGZyb20gVGllcyBjbGFzc2VzIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9ycyB0byByZWdpc3RlclxuICAgKiBAcGFyYW0gYWRkaXRpb25hbFNlcnZpY2VzIC0gQWRkaXRpb25hbCBzZXJ2aWNlIG5hbWVzIHRvIHZhbGlkYXRlIChvcHRpb25hbClcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlVmFsaWRhdGVkQ29udGFpbmVyKFtQYXltZW50c1RpZXNdKTtcbiAgICogLy8gQ29udGFpbmVyIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSBQYXltZW50c1RpZXNcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVWYWxpZGF0ZWRDb250YWluZXIoXG4gICAgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdLFxuICAgIGFkZGl0aW9uYWxTZXJ2aWNlczogc3RyaW5nW10gPSBbXSxcbiAgKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcih0aWVzQ2xhc3Nlcyk7XG5cbiAgICAvLyBFeHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSBUaWVzIGNsYXNzZXMgaWYgcG9zc2libGVcbiAgICBjb25zdCBleHBlY3RlZFNlcnZpY2VzID0gdGhpcy50aWVzUmVnaXN0cmFyLmV4dHJhY3RTZXJ2aWNlTmFtZXModGllc0NsYXNzZXMpO1xuICAgIGNvbnN0IGFsbFJlcXVpcmVkU2VydmljZXMgPSBbLi4uZXhwZWN0ZWRTZXJ2aWNlcywgLi4uYWRkaXRpb25hbFNlcnZpY2VzXTtcblxuICAgIGlmIChhbGxSZXF1aXJlZFNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBhbGxSZXF1aXJlZFNlcnZpY2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIsIHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAYXdzLWxhbWJkYS1wb3dlcnRvb2xzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IGZ1bGxXcmFwcGVyIH0gZnJvbSAnLi9oYW5kbGVyLXdyYXBwZXJzJztcbi8vIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0XG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIH0gZnJvbSAnLi9ydW50aW1lLXdlYi1sYW1iZGEtaGFuZGxlcic7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgTGFtYmRhIGhhbmRsZXJzIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogVHJhbnNmb3JtcyB1c2VyLXByb3ZpZGVkIExhbWJkYSBkZWZpbml0aW9ucyBpbnRvIGZ1bGwgTGFtYmRhIGhhbmRsZXIgY2xhc3Nlc1xuICogdGhhdCBleHRlbmQgTGFtYmRhQXBpIGFuZCBpbmNsdWRlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGluamVjdGlvbiB1c2luZ1xuICogUHVyZUNvbnRhaW5lci4gSGFuZGxlcyB0aGUgY29tcGxleGl0eSBvZiBESSByZXNvbHV0aW9uIGFuZCBlcnJvciB3cmFwcGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmFjdG9yeSA9IG5ldyBMYW1iZGFIYW5kbGVyRmFjdG9yeSgpO1xuICogY29uc3QgaGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlKGxhbWJkYURlZmluaXRpb24sIGNvbnRhaW5lcik7XG4gKlxuICogLy8gSGFuZGxlciBpcyByZWFkeSB0byBiZSBpbnZva2VkIGJ5IEFXUyBMYW1iZGEgcnVudGltZVxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgTGFtYmRhSGFuZGxlckZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiAnQGNvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9sYW1iZGEtaGFuZGxlci1mYWN0b3J5JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMYW1iZGEgaGFuZGxlciBjbGFzcyBpbnN0YW5jZSBmcm9tIGEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQ3JlYXRlcyBhIFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIHRoYXQgZXh0ZW5kcyBMYW1iZGFBcGkgYW5kIGluY2x1ZGVzXG4gICAqIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGluamVjdGlvbi4gVGhlIGhhbmRsZXIgd2lsbCByZXNvbHZlIGRlcGVuZGVuY2llc1xuICAgKiBmcm9tIHRoZSBwcm92aWRlZCBjb250YWluZXIgYW5kIGluamVjdCB0aGVtIGludG8gdGhlIHVzZXIncyBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIHdpdGggcmVnaXN0ZXJlZCBzZXJ2aWNlc1xuICAgKiBAcmV0dXJucyBMYW1iZGEgaGFuZGxlciBjbGFzcyBpbnN0YW5jZSByZWFkeSBmb3IgQVdTIExhbWJkYSBydW50aW1lXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbGFtYmRhRGVmOiBMYW1iZGFEZWZpbml0aW9uID0ge1xuICAgKiAgIGlkOiAnY2hhcmdlJyxcbiAgICogICB0aWVzOiBbUGF5bWVudHNTZXJ2aWNlLCBCaWxsaW5nU2VydmljZV0sXG4gICAqICAgaGFuZGxlcjogKGRlcHMpID0+IGFzeW5jIChldmVudCwgY29udGV4dCkgPT4ge1xuICAgKiAgICAgcmV0dXJuIGF3YWl0IGRlcHMucGF5bWVudHNTZXJ2aWNlLnByb2Nlc3NDaGFyZ2UoZXZlbnQuYm9keSk7XG4gICAqICAgfVxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBoYW5kbGVyID0gZmFjdG9yeS5jcmVhdGUobGFtYmRhRGVmLCBjb250YWluZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uLCBjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPik6IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdDcmVhdGluZyBMYW1iZGEgaGFuZGxlcicsIHtcbiAgICAgIGxhbWJkYUlkOiBkZWZpbml0aW9uLmlkLFxuICAgICAgc2VydmljZTogZGVmaW5pdGlvbi5zZXJ2aWNlLFxuICAgICAgZGVwZW5kZW5jeUNvdW50OiBkZWZpbml0aW9uLnRpZXMubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgIGNvbnN0IHsgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgfSA9IHJlcXVpcmUoJy4vcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInKTtcbiAgICByZXR1cm4gbmV3IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyKGRlZmluaXRpb24sIGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGRlcGVuZGVuY2llcyBmcm9tIFB1cmVDb250YWluZXIgdXNpbmcgY2xhc3MgcmVmZXJlbmNlcy5cbiAgICpcbiAgICogUmVzb2x2ZXMgY2xhc3MgcmVmZXJlbmNlcyB0byBzZXJ2aWNlIGluc3RhbmNlcyB1c2luZyBQdXJlQ29udGFpbmVyLnJ1bigpXG4gICAqIHdpdGggY2xhc3MgbmFtZXMgYXMga2V5cy4gQ29udmVydHMgY2xhc3MgbmFtZXMgdG8gY2FtZWxDYXNlIGZvciB0aGVcbiAgICogZGVwZW5kZW5jeSBvYmplY3Qga2V5cyAoZS5nLiwgUGF5bWVudHNTZXJ2aWNlIFx1MjE5MiBwYXltZW50c1NlcnZpY2UpLlxuICAgKlxuICAgKiBAcGFyYW0gdGllcyAtIEFycmF5IG9mIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNhbWVsQ2FzZSBrZXlzIGNvbnRhaW5pbmcgcmVzb2x2ZWQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IGRlcGVuZGVuY3kgY2Fubm90IGJlIHJlc29sdmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGllcyA9IFtQYXltZW50c1NlcnZpY2UsIEJpbGxpbmdTZXJ2aWNlXTtcbiAgICogY29uc3QgZGVwcyA9IGZhY3RvcnkuaW5qZWN0RGVwZW5kZW5jaWVzKHRpZXMsIGNvbnRhaW5lcik7XG4gICAqIC8vIFJlc3VsdDogeyBwYXltZW50c1NlcnZpY2U6IFBheW1lbnRzU2VydmljZSwgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmplY3REZXBlbmRlbmNpZXMoXG4gICAgdGllczogQXJyYXk8bmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+LFxuICAgIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgZGVwczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY2xhc3NSZWYgb2YgdGllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXNlIGNsYXNzIG5hbWUgYXMgdGhlIERJIHRva2VuIChQdXJlQ29udGFpbmVyIHVzZXMgc3RyaW5nIGtleXMpXG4gICAgICAgIGNvbnN0IHRva2VuID0gY2xhc3NSZWYubmFtZTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb250YWluZXIucnVuKHRva2VuKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50b0NhbWVsQ2FzZShjbGFzc1JlZi5uYW1lKTtcbiAgICAgICAgZGVwc1trZXldID0gaW5zdGFuY2U7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RlcGVuZGVuY3kgaW5qZWN0ZWQnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1JlZi5uYW1lLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5qZWN0IGRlcGVuZGVuY3knLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1JlZi5uYW1lLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBpbmplY3QgZGVwZW5kZW5jeSAnJHtjbGFzc1JlZi5uYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnRGVwZW5kZW5jaWVzIGluamVjdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIGRlcGVuZGVuY3lDb3VudDogT2JqZWN0LmtleXMoZGVwcykubGVuZ3RoLFxuICAgICAgZGVwZW5kZW5jaWVzOiBPYmplY3Qua2V5cyhkZXBzKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgYSBoYW5kbGVyIGZ1bmN0aW9uIHdpdGggbG9nZ2luZyBhbmQgZXJyb3IgaGFuZGxpbmcuXG4gICAqXG4gICAqIEFkZHMgc3RydWN0dXJlZCBsb2dnaW5nIGZvciBMYW1iZGEgaW52b2NhdGlvbiBzdGFydC9lbmQsIGVycm9yIGhhbmRsaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhbmQgbG9ncyBleGNlcHRpb25zLCBhbmQgdGltaW5nIGluZm9ybWF0aW9uLiBSZXR1cm5zIGFcbiAgICogd3JhcHBlZCBoYW5kbGVyIHRoYXQgbWFpbnRhaW5zIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgb3JpZ2luYWwuXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTGFtYmRhIG1ldGFkYXRhIGZvciBsb2dnaW5nIGNvbnRleHRcbiAgICogQHJldHVybnMgV3JhcHBlZCBoYW5kbGVyIHdpdGggbG9nZ2luZyBhbmQgZXJyb3IgaGFuZGxpbmdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGZhY3Rvcnkud3JhcEhhbmRsZXIoXG4gICAqICAgYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7IHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTsgfSxcbiAgICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgd3JhcEhhbmRsZXIoXG4gICAgaGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+LFxuICAgIG1ldGFkYXRhOiB7IGlkOiBzdHJpbmc7IHNlcnZpY2U6IHN0cmluZyB9LFxuICApOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBmdWxsV3JhcHBlcihoYW5kbGVyLCBtZXRhZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjbGFzcyBuYW1lIHRvIGNhbWVsQ2FzZSBmb3IgZGVwZW5kZW5jeSBvYmplY3Qga2V5cy5cbiAgICpcbiAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBjbGFzcyBuYW1lcyB0byBjYW1lbENhc2UgcHJvcGVydHkgbmFtZXMgZm9yIHRoZVxuICAgKiBkZXBlbmRlbmN5IGluamVjdGlvbiBvYmplY3QuIFRoaXMgcHJvdmlkZXMgYSBjb25zaXN0ZW50IG5hbWluZyBjb252ZW50aW9uXG4gICAqIGZvciBpbmplY3RlZCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBQYXNjYWxDYXNlIGNsYXNzIG5hbWVcbiAgICogQHJldHVybnMgY2FtZWxDYXNlIHByb3BlcnR5IG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBmYWN0b3J5LnRvQ2FtZWxDYXNlKCdQYXltZW50c1NlcnZpY2UnKTsgLy8gJ3BheW1lbnRzU2VydmljZSdcbiAgICogZmFjdG9yeS50b0NhbWVsQ2FzZSgnQmlsbGluZ1NlcnZpY2UnKTsgIC8vICdiaWxsaW5nU2VydmljZSdcbiAgICogZmFjdG9yeS50b0NhbWVsQ2FzZSgnQ29uZmlnU2VydmljZScpOyAgIC8vICdjb25maWdTZXJ2aWNlJ1xuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgdG9DYW1lbENhc2UoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjbGFzc05hbWUuc2xpY2UoMSk7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcblxuLyoqXG4gKiBMYW1iZGEgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgbG9nZ2luZyBhbmQgbW9uaXRvcmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFDb250ZXh0SW5mbyB7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gbmFtZSAqL1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gdmVyc2lvbiAqL1xuICBmdW5jdGlvblZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBBV1MgcmVxdWVzdCBJRCAqL1xuICBhd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKiBSZW1haW5pbmcgdGltZSBpbiBtaWxsaXNlY29uZHMgKi9cbiAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzPzogKCkgPT4gbnVtYmVyO1xuICAvKiogTWVtb3J5IGxpbWl0IGluIE1CICovXG4gIG1lbW9yeUxpbWl0SW5NQj86IHN0cmluZztcbiAgLyoqIExvZyBncm91cCBuYW1lICovXG4gIGxvZ0dyb3VwTmFtZT86IHN0cmluZztcbiAgLyoqIExvZyBzdHJlYW0gbmFtZSAqL1xuICBsb2dTdHJlYW1OYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGxvZ2dpbmcgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyTWV0YWRhdGEge1xuICAvKiogTGFtYmRhIGlkZW50aWZpZXIgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogU2VydmljZSBuYW1lIChlLmcuLCAncGF5bWVudHMnKSAqL1xuICBzZXJ2aWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIG1ldHJpY3MgY29sbGVjdGVkIGR1cmluZyBoYW5kbGVyIGludm9jYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uTWV0cmljcyB7XG4gIC8qKiBTdGFydCB0aW1lc3RhbXAgKi9cbiAgc3RhcnRUaW1lOiBudW1iZXI7XG4gIC8qKiBFbmQgdGltZXN0YW1wICovXG4gIGVuZFRpbWU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKiogTWVtb3J5IHVzYWdlIGluZm9ybWF0aW9uIChpZiBhdmFpbGFibGUpICovXG4gIG1lbW9yeVVzZWQ/OiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgdGltZSB3aGVuIGhhbmRsZXIgY29tcGxldGVkICovXG4gIHJlbWFpbmluZ1RpbWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9nZ2luZyB3cmFwcGVyIGZvciBMYW1iZGEgaW52b2NhdGlvbiBsaWZlY3ljbGUuXG4gKlxuICogUHJvdmlkZXMgc3RydWN0dXJlZCBsb2dnaW5nIGZvciBMYW1iZGEgaW52b2NhdGlvbiBzdGFydC9lbmQgd2l0aFxuICogY29udGV4dHVhbCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGltaW5nLCBtZW1vcnkgdXNhZ2UsIGFuZCBBV1NcbiAqIExhbWJkYSBjb250ZXh0IGRldGFpbHMuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgbG9nZ2luZyBjb250ZXh0XG4gKiBAcmV0dXJucyBXcmFwcGVkIGhhbmRsZXIgd2l0aCBsb2dnaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gbG9nZ2luZ1dyYXBwZXIoXG4gKiAgIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4geyByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07IH0sXG4gKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dpbmdXcmFwcGVyKFxuICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gIG1ldGFkYXRhOiBIYW5kbGVyTWV0YWRhdGEsXG4pOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBoYW5kbGVyTG9nZ2VyID0gbG9nZ2VyKHtcbiAgICBzZXJ2aWNlTmFtZTogYEBsYW1iZGEvJHttZXRhZGF0YS5zZXJ2aWNlfS8ke21ldGFkYXRhLmlkfWAsXG4gICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgIGxhbWJkYUlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIHNlcnZpY2U6IG1ldGFkYXRhLnNlcnZpY2UsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgY29udGV4dEluZm8gPSBleHRyYWN0TGFtYmRhQ29udGV4dChjb250ZXh0KTtcblxuICAgIGhhbmRsZXJMb2dnZXIuaW5mbygnTGFtYmRhIGludm9jYXRpb24gc3RhcnRlZCcsIHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHRJbmZvLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogY29udGV4dEluZm8uZnVuY3Rpb25WZXJzaW9uLFxuICAgICAgbWVtb3J5TGltaXQ6IGNvbnRleHRJbmZvLm1lbW9yeUxpbWl0SW5NQixcbiAgICAgIHJlbWFpbmluZ1RpbWU6IGNvbnRleHRJbmZvLmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcz8uKCksXG4gICAgICBldmVudFR5cGU6IGdldEV2ZW50VHlwZShldmVudCksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY2FsY3VsYXRlTWV0cmljcyhzdGFydFRpbWUsIGNvbnRleHRJbmZvKTtcblxuICAgICAgaGFuZGxlckxvZ2dlci5pbmZvKCdMYW1iZGEgaW52b2NhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZHVyYXRpb246IG1ldHJpY3MuZHVyYXRpb24sXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY2FsY3VsYXRlTWV0cmljcyhzdGFydFRpbWUsIGNvbnRleHRJbmZvKTtcblxuICAgICAgaGFuZGxlckxvZ2dlci5lcnJvcignTGFtYmRhIGludm9jYXRpb24gZmFpbGVkJywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZHVyYXRpb246IG1ldHJpY3MuZHVyYXRpb24sXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bicsXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEVycm9yIHdyYXBwZXIgZm9yIExhbWJkYSBoYW5kbGVyIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIENhdGNoZXMgYW5kIGxvZ3MgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBpbmZvcm1hdGlvbiwgdGhlbiByZXR1cm5zXG4gKiBhcHByb3ByaWF0ZSBlcnJvciByZXNwb25zZXMuIEhhbmRsZXMgYm90aCB0aHJvd24gZXJyb3JzIGFuZCByZWplY3RlZFxuICogcHJvbWlzZXMgY29uc2lzdGVudGx5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBtZXRhZGF0YSAtIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGVycm9yIGNvbnRleHRcbiAqIEByZXR1cm5zIFdyYXBwZWQgaGFuZGxlciB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gZXJyb3JXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcldyYXBwZXIoXG4gIGhhbmRsZXI6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgbWV0YWRhdGE6IEhhbmRsZXJNZXRhZGF0YSxcbik6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGVycm9yTG9nZ2VyID0gbG9nZ2VyKHtcbiAgICBzZXJ2aWNlTmFtZTogYEBsYW1iZGEvJHttZXRhZGF0YS5zZXJ2aWNlfS8ke21ldGFkYXRhLmlkfS9lcnJvci1oYW5kbGVyYCxcbiAgICBwZXJzaXN0ZW50TG9nQXR0cmlidXRlczoge1xuICAgICAgbGFtYmRhSWQ6IG1ldGFkYXRhLmlkLFxuICAgICAgc2VydmljZTogbWV0YWRhdGEuc2VydmljZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb250ZXh0SW5mbyA9IGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQpO1xuICAgICAgY29uc3QgZXJyb3JEZXRhaWxzID0gZXh0cmFjdEVycm9yRGV0YWlscyhlcnJvcik7XG5cbiAgICAgIGVycm9yTG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgZXJyb3IgaW4gTGFtYmRhIGhhbmRsZXInLCB7XG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBhd3NSZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBjb250ZXh0SW5mby5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvckRldGFpbHMubWVzc2FnZSxcbiAgICAgICAgZXJyb3JUeXBlOiBlcnJvckRldGFpbHMudHlwZSxcbiAgICAgICAgc3RhY2s6IGVycm9yRGV0YWlscy5zdGFjayxcbiAgICAgICAgZXZlbnRUeXBlOiBnZXRFdmVudFR5cGUoZXZlbnQpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvciBBUEkgR2F0ZXdheSBldmVudHMsIHJldHVybiBzdHJ1Y3R1cmVkIGVycm9yIHJlc3BvbnNlXG4gICAgICBpZiAoaXNBcGlHYXRld2F5RXZlbnQoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiAnQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiAnR0VULFBPU1QsUFVULERFTEVURSxPUFRJT05TJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnID8gZXJyb3JEZXRhaWxzLm1lc3NhZ2UgOiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCcsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBGb3Igb3RoZXIgZXZlbnQgdHlwZXMsIHJlLXRocm93IHRoZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFRpbWluZyB3cmFwcGVyIGZvciBMYW1iZGEgaGFuZGxlciBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLlxuICpcbiAqIE1lYXN1cmVzIGhhbmRsZXIgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZSwgcHJvdmlkaW5nXG4gKiBkZXRhaWxlZCBwZXJmb3JtYW5jZSBtZXRyaWNzIGZvciBtb25pdG9yaW5nIGFuZCBvcHRpbWl6YXRpb24uXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgdGltaW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFdyYXBwZWQgaGFuZGxlciB3aXRoIHRpbWluZyBtZWFzdXJlbWVudHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSB0aW1pbmdXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1pbmdXcmFwcGVyKFxuICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gIG1ldGFkYXRhOiBIYW5kbGVyTWV0YWRhdGEsXG4pOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB0aW1pbmdMb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiBgQGxhbWJkYS8ke21ldGFkYXRhLnNlcnZpY2V9LyR7bWV0YWRhdGEuaWR9L3RpbWluZ2AsXG4gICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgIGxhbWJkYUlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIHNlcnZpY2U6IG1ldGFkYXRhLnNlcnZpY2UsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RhcnRNZW1vcnkgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgY29uc3QgY29udGV4dEluZm8gPSBleHRyYWN0TGFtYmRhQ29udGV4dChjb250ZXh0KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3Moc3RhcnRUaW1lLCBzdGFydE1lbW9yeSwgY29udGV4dEluZm8pO1xuXG4gICAgICB0aW1pbmdMb2dnZXIuaW5mbygnSGFuZGxlciBleGVjdXRpb24gbWV0cmljcycsIHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGF3c1JlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgbWVtb3J5VXNlZDogbWV0cmljcy5tZW1vcnlVc2VkLFxuICAgICAgICByZW1haW5pbmdUaW1lOiBtZXRyaWNzLnJlbWFpbmluZ1RpbWUsXG4gICAgICAgIG1lbW9yeUxpbWl0OiBjb250ZXh0SW5mby5tZW1vcnlMaW1pdEluTUIsXG4gICAgICAgIGhlYXBVc2VkOiBtZXRyaWNzLmhlYXBVc2VkLFxuICAgICAgICBoZWFwVG90YWw6IG1ldHJpY3MuaGVhcFRvdGFsLFxuICAgICAgICBleHRlcm5hbDogbWV0cmljcy5leHRlcm5hbCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3Moc3RhcnRUaW1lLCBzdGFydE1lbW9yeSwgY29udGV4dEluZm8pO1xuXG4gICAgICB0aW1pbmdMb2dnZXIud2FybignSGFuZGxlciBleGVjdXRpb24gZmFpbGVkIHdpdGggbWV0cmljcycsIHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGF3c1JlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgbWVtb3J5VXNlZDogbWV0cmljcy5tZW1vcnlVc2VkLFxuICAgICAgICByZW1haW5pbmdUaW1lOiBtZXRyaWNzLnJlbWFpbmluZ1RpbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHdyYXBwZXIgdGhhdCBhcHBsaWVzIGxvZ2dpbmcsIGVycm9yIGhhbmRsaW5nLCBhbmQgdGltaW5nLlxuICpcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgdGhyZWUgd3JhcHBlcnMgaW4gdGhlIGNvcnJlY3RcbiAqIG9yZGVyOiB0aW1pbmcgKGlubmVybW9zdCkgXHUyMTkyIGVycm9yIGhhbmRsaW5nIFx1MjE5MiBsb2dnaW5nIChvdXRlcm1vc3QpLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBtZXRhZGF0YSAtIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGFsbCB3cmFwcGVyc1xuICogQHJldHVybnMgRnVsbHkgd3JhcHBlZCBoYW5kbGVyIHdpdGggYWxsIGVuaGFuY2VtZW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGZ1bGxXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdWxsV3JhcHBlcihcbiAgaGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+LFxuICBtZXRhZGF0YTogSGFuZGxlck1ldGFkYXRhLFxuKTogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgLy8gQXBwbHkgd3JhcHBlcnMgaW4gb3JkZXI6IHRpbWluZyBcdTIxOTIgZXJyb3IgXHUyMTkyIGxvZ2dpbmdcbiAgcmV0dXJuIGxvZ2dpbmdXcmFwcGVyKFxuICAgIGVycm9yV3JhcHBlcihcbiAgICAgIHRpbWluZ1dyYXBwZXIoaGFuZGxlciwgbWV0YWRhdGEpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgKSxcbiAgICBtZXRhZGF0YSxcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IExhbWJkYSBjb250ZXh0IGluZm9ybWF0aW9uIHNhZmVseS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIExhbWJkYSBjb250ZXh0IG9iamVjdFxuICogQHJldHVybnMgRXh0cmFjdGVkIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQ6IHVua25vd24pOiBMYW1iZGFDb250ZXh0SW5mbyB7XG4gIGlmICghY29udGV4dCB8fCB0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBjdHggPSBjb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZTogdHlwZW9mIGN0eC5mdW5jdGlvbk5hbWUgPT09ICdzdHJpbmcnID8gY3R4LmZ1bmN0aW9uTmFtZSA6IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvblZlcnNpb246IHR5cGVvZiBjdHguZnVuY3Rpb25WZXJzaW9uID09PSAnc3RyaW5nJyA/IGN0eC5mdW5jdGlvblZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgYXdzUmVxdWVzdElkOiB0eXBlb2YgY3R4LmF3c1JlcXVlc3RJZCA9PT0gJ3N0cmluZycgPyBjdHguYXdzUmVxdWVzdElkIDogdW5kZWZpbmVkLFxuICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogdHlwZW9mIGN0eC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gY3R4LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyBhcyAoKSA9PiBudW1iZXJcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIG1lbW9yeUxpbWl0SW5NQjogdHlwZW9mIGN0eC5tZW1vcnlMaW1pdEluTUIgPT09ICdzdHJpbmcnID8gY3R4Lm1lbW9yeUxpbWl0SW5NQiA6IHVuZGVmaW5lZCxcbiAgICBsb2dHcm91cE5hbWU6IHR5cGVvZiBjdHgubG9nR3JvdXBOYW1lID09PSAnc3RyaW5nJyA/IGN0eC5sb2dHcm91cE5hbWUgOiB1bmRlZmluZWQsXG4gICAgbG9nU3RyZWFtTmFtZTogdHlwZW9mIGN0eC5sb2dTdHJlYW1OYW1lID09PSAnc3RyaW5nJyA/IGN0eC5sb2dTdHJlYW1OYW1lIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBiYXNpYyBleGVjdXRpb24gbWV0cmljcy5cbiAqXG4gKiBAcGFyYW0gc3RhcnRUaW1lIC0gSGFuZGxlciBzdGFydCB0aW1lXG4gKiBAcGFyYW0gY29udGV4dEluZm8gLSBMYW1iZGEgY29udGV4dCBpbmZvcm1hdGlvblxuICogQHJldHVybnMgQmFzaWMgZXhlY3V0aW9uIG1ldHJpY3NcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1ldHJpY3Moc3RhcnRUaW1lOiBudW1iZXIsIGNvbnRleHRJbmZvOiBMYW1iZGFDb250ZXh0SW5mbyk6IEV4ZWN1dGlvbk1ldHJpY3Mge1xuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXJ0VGltZSxcbiAgICByZW1haW5pbmdUaW1lOiBjb250ZXh0SW5mby5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM/LigpLFxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBkZXRhaWxlZCBleGVjdXRpb24gbWV0cmljcyBpbmNsdWRpbmcgbWVtb3J5IHVzYWdlLlxuICpcbiAqIEBwYXJhbSBzdGFydFRpbWUgLSBIYW5kbGVyIHN0YXJ0IHRpbWVcbiAqIEBwYXJhbSBzdGFydE1lbW9yeSAtIE1lbW9yeSB1c2FnZSBhdCBzdGFydFxuICogQHBhcmFtIGNvbnRleHRJbmZvIC0gTGFtYmRhIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIERldGFpbGVkIGV4ZWN1dGlvbiBtZXRyaWNzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3MoXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBzdGFydE1lbW9yeTogTm9kZUpTLk1lbW9yeVVzYWdlLFxuICBjb250ZXh0SW5mbzogTGFtYmRhQ29udGV4dEluZm8sXG4pOiBFeGVjdXRpb25NZXRyaWNzICYgeyBoZWFwVXNlZDogbnVtYmVyOyBoZWFwVG90YWw6IG51bWJlcjsgZXh0ZXJuYWw6IG51bWJlciB9IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVuZE1lbW9yeSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhcnRUaW1lLFxuICAgIG1lbW9yeVVzZWQ6IGVuZE1lbW9yeS5oZWFwVXNlZCAtIHN0YXJ0TWVtb3J5LmhlYXBVc2VkLFxuICAgIHJlbWFpbmluZ1RpbWU6IGNvbnRleHRJbmZvLmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcz8uKCksXG4gICAgaGVhcFVzZWQ6IGVuZE1lbW9yeS5oZWFwVXNlZCxcbiAgICBoZWFwVG90YWw6IGVuZE1lbW9yeS5oZWFwVG90YWwsXG4gICAgZXh0ZXJuYWw6IGVuZE1lbW9yeS5leHRlcm5hbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGVycm9yIGRldGFpbHMgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG9iamVjdCBvciB1bmtub3duIHZhbHVlXG4gKiBAcmV0dXJucyBTdHJ1Y3R1cmVkIGVycm9yIGRldGFpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFcnJvckRldGFpbHMoZXJyb3I6IHVua25vd24pOiB7IG1lc3NhZ2U6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIHR5cGU6IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB0eXBlOiAnVW5rbm93bicsXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIExhbWJkYSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBMYW1iZGEgZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyBFdmVudCB0eXBlIHN0cmluZ1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRUeXBlKGV2ZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIGNvbnN0IGV2dCA9IGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGlmIChldnQuUmVjb3JkcyAmJiBBcnJheS5pc0FycmF5KGV2dC5SZWNvcmRzKSkge1xuICAgIHJldHVybiAnYXdzLWV2ZW50JztcbiAgfVxuXG4gIGlmIChldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpIHtcbiAgICByZXR1cm4gJ2FwaS1nYXRld2F5JztcbiAgfVxuXG4gIGlmIChldnQuc291cmNlID09PSAnYXdzLmV2ZW50cycpIHtcbiAgICByZXR1cm4gJ2V2ZW50YnJpZGdlJztcbiAgfVxuXG4gIGlmIChldnQuZXZlbnRTb3VyY2UgPT09ICdhd3M6czMnKSB7XG4gICAgcmV0dXJuICdzMyc7XG4gIH1cblxuICByZXR1cm4gJ2N1c3RvbSc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgZXZlbnQgaXMgYW4gQVBJIEdhdGV3YXkgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gTGFtYmRhIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMgVHJ1ZSBpZiBBUEkgR2F0ZXdheSBldmVudFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNBcGlHYXRld2F5RXZlbnQoZXZlbnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXZ0ID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAhIShldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBMYW1iZGEgSGFuZGxlciBGYWN0b3J5IE1vZHVsZVxuICpcbiAqIFByb3ZpZGVzIGZhY3RvcnkgY2xhc3NlcyBhbmQgdXRpbGl0aWVzIGZvciBjcmVhdGluZyBMYW1iZGEgaGFuZGxlcnMgd2l0aFxuICogZGVwZW5kZW5jeSBpbmplY3Rpb24gc3VwcG9ydC4gVGhpcyBtb2R1bGUgYnJpZGdlcyB0aGUgZ2FwIGJldHdlZW4gdGhlXG4gKiBleGlzdGluZyBQdXJlbm93IENvcmUgTGFtYmRhQXBpIGluZnJhc3RydWN0dXJlIGFuZCB0aGUgbmV3IFJ1bnRpbWUgV2ViXG4gKiBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqL1xuXG5leHBvcnQgeyBMYW1iZGFIYW5kbGVyRmFjdG9yeSB9IGZyb20gJy4vbGFtYmRhLWhhbmRsZXItZmFjdG9yeSc7XG5leHBvcnQgeyBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciB9IGZyb20gJy4vcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInO1xuZXhwb3J0IHtcbiAgbG9nZ2luZ1dyYXBwZXIsXG4gIGVycm9yV3JhcHBlcixcbiAgdGltaW5nV3JhcHBlcixcbiAgZnVsbFdyYXBwZXIsXG4gIHR5cGUgSGFuZGxlck1ldGFkYXRhLFxuICB0eXBlIExhbWJkYUNvbnRleHRJbmZvLFxuICB0eXBlIEV4ZWN1dGlvbk1ldHJpY3MsXG59IGZyb20gJy4vaGFuZGxlci13cmFwcGVycyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBMYW1iZGEgUGlwZWxpbmUgLSBTZXJ2ZXItc2lkZSBleGVjdXRpb24gKExhbWJkYSBydW50aW1lIG9ubHkpXG4vLyBDREsgUGlwZWxpbmUgbW92ZWQgdG86IHNyYy9pbmZyYS9ydW50aW1lLXdlYi9waXBlbGluZXMvY2RrLXBpcGVsaW5lLnRzXG4vLyBCcm93c2VyIFBpcGVsaW5lIG1vdmVkIHRvOiBzcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzXG5leHBvcnQgKiBmcm9tICcuL2xhbWJkYS1waXBlbGluZSc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBwdXJhYmxlLCBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFEZWZpbml0aW9uLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyRmFjdG9yeSB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL2RpL3B1cmUtY29udGFpbmVyLWZhY3RvcnknO1xuaW1wb3J0IHsgQ29udGFpbmVyUmVnaXN0cnkgfSBmcm9tICdAY29yZS9ydW50aW1lLXdlYi9yZWdpc3RyYXIvY29udGFpbmVyLXJlZ2lzdHJ5JztcblxuLyoqXG4gKiBNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGZvciBtYW5hZ2luZyBESSBjb250YWluZXJzIGFuZCBMYW1iZGEgbWFwcGluZ3MuXG4gKlxuICogUHJvY2Vzc2VzIG1pY3Jvc2VydmljZSBkZWZpbml0aW9ucyB0byBjcmVhdGUgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgYW5kXG4gKiBtYWludGFpbnMgbWFwcGluZ3MgYmV0d2VlbiBMYW1iZGEgZnVuY3Rpb25zIGFuZCB0aGVpciBwYXJlbnQgc2VydmljZXMuXG4gKiBUaGlzIGVuYWJsZXMgdGhlIGZyYW1ld29yayB0byByZXNvbHZlIHRoZSBjb3JyZWN0IERJIGNvbnRhaW5lciBmb3IgZWFjaFxuICogTGFtYmRhIGludm9jYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIoKTtcbiAqXG4gKiAvLyBQcm9jZXNzIGEgbWljcm9zZXJ2aWNlIGRlZmluaXRpb25cbiAqIHJlZ2lzdHJhci5wcm9jZXNzU2VydmljZSgncGF5bWVudHMnLCB7XG4gKiAgIHRpZXM6IFtQYXltZW50c1RpZXNdLFxuICogICBsYW1iZGFzOiBbY2hhcmdlSGFuZGxlciwgcmVmdW5kSGFuZGxlcl1cbiAqIH0pO1xuICpcbiAqIC8vIEdldCBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgTGFtYmRhXG4gKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyYXIuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJGYWN0b3J5OiBQdXJlQ29udGFpbmVyRmFjdG9yeTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogQ29udGFpbmVyUmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXJGYWN0b3J5ID0gbmV3IFB1cmVDb250YWluZXJGYWN0b3J5KCk7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBDb250YWluZXJSZWdpc3RyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYSBtaWNyb3NlcnZpY2UgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGl0cyBESSBjb250YWluZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBQdXJlQ29udGFpbmVyIGZyb20gdGhlIFRpZXMgY2xhc3NlcyBhbmQgcHJvY2Vzc2VzIGFsbCBMYW1iZGFcbiAgICogZGVmaW5pdGlvbnMgdG8gZXN0YWJsaXNoIHNlcnZpY2UgbWFwcGluZ3MuIEF1dG8tc2V0cyB0aGUgc2VydmljZSBwcm9wZXJ0eVxuICAgKiBvbiBlYWNoIExhbWJkYSBkZWZpbml0aW9uIGFuZCBnZW5lcmF0ZXMgTGFtYmRhIElEcy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTWljcm9zZXJ2aWNlIGRlZmluaXRpb24gd2l0aCBUaWVzIGFuZCBMYW1iZGFzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgc2VydmljZSBwcm9jZXNzaW5nIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogcmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKCdwYXltZW50cycsIHtcbiAgICogICB0aWVzOiBbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10sXG4gICAqICAgbGFtYmRhczogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBpZDogJ2NoYXJnZScsXG4gICAqICAgICAgIHRpZXM6IFtQYXltZW50c1NlcnZpY2VdLFxuICAgKiAgICAgICBoYW5kbGVyOiAoZGVwcykgPT4gYXN5bmMgKGV2ZW50KSA9PiB7IC4uLiB9XG4gICAqICAgICB9XG4gICAqICAgXVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwcm9jZXNzU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nLCBkZWZpbml0aW9uOiBNaWNyb3NlcnZpY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIEJ1aWxkIFB1cmVDb250YWluZXIgZnJvbSBUaWVzIGNsYXNzZXNcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyRmFjdG9yeS5jcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIoZGVmaW5pdGlvbi50aWVzKTtcbiAgICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2VOYW1lLCBjb250YWluZXIpO1xuXG4gICAgICAvLyAyLiBQcm9jZXNzIGVhY2ggTGFtYmRhIGRlZmluaXRpb25cbiAgICAgIGZvciAoY29uc3QgbGFtYmRhRGVmIG9mIGRlZmluaXRpb24ubGFtYmRhcykge1xuICAgICAgICAvLyBBdXRvLXNldCBzZXJ2aWNlIHJlZmVyZW5jZVxuICAgICAgICBsYW1iZGFEZWYuc2VydmljZSA9IHNlcnZpY2VOYW1lO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIExhbWJkYSBJRCBhbmQgY3JlYXRlIG1hcHBpbmdcbiAgICAgICAgY29uc3QgbGFtYmRhSWQgPSB0aGlzLmdlbmVyYXRlTGFtYmRhSWQoc2VydmljZU5hbWUsIGxhbWJkYURlZik7XG4gICAgICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJMYW1iZGEobGFtYmRhSWQsIHNlcnZpY2VOYW1lLCBsYW1iZGFEZWYpO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBjb250YWluZXIgKG9wdGlvbmFsIC0gY2FuIGJlIGVuYWJsZWQgZm9yIGRlYnVnZ2luZylcbiAgICAgIC8vIHRoaXMudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBkZWZpbml0aW9uKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBtaWNyb3NlcnZpY2UgJyR7c2VydmljZU5hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogTG9va3MgdXAgdGhlIHNlcnZpY2UgbmFtZSBmb3IgdGhlIExhbWJkYSBJRCBhbmQgcmV0dXJucyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBvciBzZXJ2aWNlIG5vdCBmb3VuZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zdCBwYXltZW50c1NlcnZpY2UgPSBjb250YWluZXIucnVuKCdQYXltZW50c1NlcnZpY2UnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIExhbWJkYSBJRCBmcm9tIHNlcnZpY2UgbmFtZSBhbmQgTGFtYmRhIGRlZmluaXRpb24uXG4gICAqXG4gICAqIFVzZXMgZXhwbGljaXQgSUQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBleHRyYWN0cyBmcm9tIGhhbmRsZXIgZnVuY3Rpb24gbmFtZS5cbiAgICogVGhlIGZpbmFsIElEIGZvcm1hdCBpcyBhbHdheXMgJ3tzZXJ2aWNlTmFtZX0ue2xhbWJkYUlkfScuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHBhcmVudCBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvblxuICAgKiBAcmV0dXJucyBGdWxsIExhbWJkYSBJRFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFdpdGggZXhwbGljaXQgSURcbiAgICogZ2VuZXJhdGVMYW1iZGFJZCgncGF5bWVudHMnLCB7IGlkOiAnY2hhcmdlJywgLi4uIH0pIC8vIFx1MjE5MiAncGF5bWVudHMuY2hhcmdlJ1xuICAgKlxuICAgKiAvLyBXaXRob3V0IGV4cGxpY2l0IElEIChleHRyYWN0cyBmcm9tIGhhbmRsZXIgbmFtZSlcbiAgICogZ2VuZXJhdGVMYW1iZGFJZCgncGF5bWVudHMnLCB7IGhhbmRsZXI6IGZ1bmN0aW9uIHByb2Nlc3NQYXltZW50KCkgey4uLn0gfSkgLy8gXHUyMTkyICdwYXltZW50cy5wcm9jZXNzUGF5bWVudCdcbiAgICogYGBgXG4gICAqL1xuICBnZW5lcmF0ZUxhbWJkYUlkKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IExhbWJkYURlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChkZWZpbml0aW9uLmlkKSB7XG4gICAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LiR7ZGVmaW5pdGlvbi5pZH1gO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgZnJvbSBoYW5kbGVyIGZ1bmN0aW9uIG5hbWVcbiAgICBjb25zdCBoYW5kbGVyTmFtZSA9IGRlZmluaXRpb24uaGFuZGxlci5uYW1lIHx8ICdoYW5kbGVyJztcbiAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LiR7aGFuZGxlck5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgc2VydmljZSBuYW1lcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc2VydmljZSBuYW1lcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICovXG4gIGdldFNlcnZpY2VOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0U2VydmljZU5hbWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIExhbWJkYSBJRHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIExhbWJkYSBJRHMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkXG4gICAqL1xuICBnZXRMYW1iZGFJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYUlkcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VydmljZSBuYW1lIGZvciBhIExhbWJkYSBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSURcbiAgICogQHJldHVybnMgU2VydmljZSBuYW1lIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldFNlcnZpY2VGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYVNlcnZpY2UobGFtYmRhSWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1NlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5Lmhhc1NlcnZpY2Uoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgTGFtYmRhIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgTGFtYmRhIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc0xhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzTGFtYmRhKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIExhbWJkYSBkZWZpbml0aW9ucyBmb3IgYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIExhbWJkYSBJRHMgZm9yIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBnZXRMYW1iZGFzRm9yU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYXNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhbmQgY29udGFpbmVycy5cbiAgICpcbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcmVpbml0aWFsaXppbmcgdGhlIHJlZ2lzdHJhci5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTGFtYmRhIGRlZmluaXRpb24gYnkgSUQuXG4gICAqXG4gICAqIFJldHJpZXZlcyB0aGUgTGFtYmRhIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgTGFtYmRhIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTGFtYmRhIGRlZmluaXRpb24gbm90IGZvdW5kXG4gICAqL1xuICBnZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkOiBzdHJpbmcpOiBMYW1iZGFEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsIENvbnRhaW5lclJlZ2lzdHJ5IGZvciBhZHZhbmNlZCB1c2UgY2FzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIENvbnRhaW5lclJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqL1xuICBnZXRSZWdpc3RyeSgpOiBDb250YWluZXJSZWdpc3RyeSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBjb250YWluZXIgaGFzIGFsbCByZXF1aXJlZCBzZXJ2aWNlcyAocHJpdmF0ZSBoZWxwZXIpLlxuICAgKlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBidXQgY2FuIGJlIGVuYWJsZWQgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIENvbnRhaW5lciB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIE1pY3Jvc2VydmljZSBkZWZpbml0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCBkZWZpbml0aW9uOiBNaWNyb3NlcnZpY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gRXh0cmFjdCBhbGwgc2VydmljZSBkZXBlbmRlbmNpZXMgZnJvbSBMYW1iZGEgZGVmaW5pdGlvbnNcbiAgICBjb25zdCByZXF1aXJlZFNlcnZpY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGxhbWJkYURlZiBvZiBkZWZpbml0aW9uLmxhbWJkYXMpIHtcbiAgICAgIGZvciAoY29uc3QgdGllQ2xhc3Mgb2YgbGFtYmRhRGVmLnRpZXMpIHtcbiAgICAgICAgcmVxdWlyZWRTZXJ2aWNlcy5hZGQodGllQ2xhc3MubmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBhbGwgcmVxdWlyZWQgc2VydmljZXMgYXJlIHJlZ2lzdGVyZWRcbiAgICB0aGlzLmNvbnRhaW5lckZhY3RvcnkudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBBcnJheS5mcm9tKHJlcXVpcmVkU2VydmljZXMpKTtcbiAgfVxufVxuIiwgImltcG9ydFwicmVmbGVjdC1tZXRhZGF0YVwiO2V4cG9ydHtMYXp5U2VydmljZUlkZW50aWZpZXJ9ZnJvbVwiQGludmVyc2lmeWpzL2NvbW1vblwiO2V4cG9ydHtDb250YWluZXIsQ29udGFpbmVyTW9kdWxlfWZyb21cIkBpbnZlcnNpZnlqcy9jb250YWluZXJcIjtleHBvcnR7YmluZGluZ1Njb3BlVmFsdWVzLGJpbmRpbmdUeXBlVmFsdWVzLGRlY29yYXRlLGluamVjdCxpbmplY3RGcm9tQmFzZSxpbmplY3RGcm9tSGllcmFyY2h5LGluamVjdGFibGUsbXVsdGlJbmplY3QsbmFtZWQsb3B0aW9uYWwscG9zdENvbnN0cnVjdCxwcmVEZXN0cm95LHRhZ2dlZCx1bm1hbmFnZWR9ZnJvbVwiQGludmVyc2lmeWpzL2NvcmVcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciwgTWlzc2luZ1NlcnZpY2VFcnJvciB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL2RpL2RpLWVycm9ycyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBSZWdpc3RyeSBmb3IgbWFuYWdpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgYW5kIExhbWJkYS10by1zZXJ2aWNlIG1hcHBpbmdzLlxuICpcbiAqIFByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcmVnaXN0cnkgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgREkgY29udGFpbmVyc1xuICogZm9yIG1pY3Jvc2VydmljZXMsIGFsb25nIHdpdGggbWFwcGluZ3MgYmV0d2VlbiBMYW1iZGEgZnVuY3Rpb25zIGFuZCB0aGVpclxuICogcGFyZW50IHNlcnZpY2VzLiBUaGlzIGVuYWJsZXMgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgbWFrZXMgdGhlXG4gKiBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgbW9yZSBmb2N1c2VkIG9uIHByb2Nlc3NpbmcgbG9naWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIGNvbnRhaW5lclxuICogcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKCdwYXltZW50cycsIHBheW1lbnRzQ29udGFpbmVyKTtcbiAqXG4gKiAvLyBNYXAgTGFtYmRhIHRvIHNlcnZpY2VcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnLCAncGF5bWVudHMnKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBjb250YWluZXIgZm9yIExhbWJkYVxuICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAqIGBgYFxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcnM6IE1hcDxzdHJpbmcsIFB1cmVDb250YWluZXI8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhVG9TZXJ2aWNlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYURlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBMYW1iZGFEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogU3RvcmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc2VydmljZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gcHJldmVudFxuICAgKiBhY2NpZGVudGFsIG92ZXJ3cml0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBESUNvbnRhaW5lckVycm9yIGlmIHNlcnZpY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF5bWVudHNDb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KCk7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyU2VydmljZSgncGF5bWVudHMnLCBwYXltZW50c0NvbnRhaW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVycy5oYXMoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgYSBkaWZmZXJlbnQgc2VydmljZSBuYW1lIG9yIGNsZWFyIHRoZSByZWdpc3RyeSBmaXJzdC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lcnMuc2V0KHNlcnZpY2VOYW1lLCBjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgTGFtYmRhIGZ1bmN0aW9uIHdpdGggaXRzIHBhcmVudCBzZXJ2aWNlIGFuZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBMYW1iZGEgSUQgYW5kIGl0cyBwYXJlbnQgc2VydmljZSBuYW1lLFxuICAgKiBhbmQgc3RvcmVzIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgcnVudGltZSBsb29rdXAuXG4gICAqIFRoaXMgZW5hYmxlcyBsb29raW5nIHVwIHRoZSBjb3JyZWN0IERJIGNvbnRhaW5lciBmb3IgTGFtYmRhIGludm9jYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHBhcmVudCBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgTGFtYmRhIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgcGFyZW50IHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5yZWdpc3RlckxhbWJkYSgncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzJywgY2hhcmdlRGVmaW5pdGlvbik7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5yZWZ1bmQnLCAncGF5bWVudHMnLCByZWZ1bmREZWZpbml0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlckxhbWJkYShsYW1iZGFJZDogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGFyZW50IHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcnMuaGFzKHNlcnZpY2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBMYW1iZGEgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLmxhbWJkYVRvU2VydmljZS5oYXMobGFtYmRhSWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NlcnZpY2UgPSB0aGlzLmxhbWJkYVRvU2VydmljZS5nZXQobGFtYmRhSWQpO1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBgTGFtYmRhICcke2xhbWJkYUlkfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIHNlcnZpY2UgJyR7ZXhpc3RpbmdTZXJ2aWNlfScuIFVzZSBhIGRpZmZlcmVudCBMYW1iZGEgSUQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGFUb1NlcnZpY2Uuc2V0KGxhbWJkYUlkLCBzZXJ2aWNlTmFtZSk7XG4gICAgdGhpcy5sYW1iZGFEZWZpbml0aW9ucy5zZXQobGFtYmRhSWQsIGRlZmluaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIHNlcnZpY2UgYnkgbmFtZS5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2VcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENvbnRhaW5lcihzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcnMuZ2V0KHNlcnZpY2VOYW1lKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIERJIGNvbnRhaW5lciBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBwYXJlbnQgc2VydmljZSBmb3IgdGhlIExhbWJkYSBJRCBhbmQgcmV0dXJucyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBvciBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5nZXRMYW1iZGFTZXJ2aWNlKGxhbWJkYUlkKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250YWluZXIoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGFyZW50IHNlcnZpY2UgbmFtZSBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBzZXJ2aWNlIG5hbWUgdGhhdCBvd25zIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2VydmljZU5hbWUgPSByZWdpc3RyeS5nZXRMYW1iZGFTZXJ2aWNlKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coc2VydmljZU5hbWUpOyAvLyAncGF5bWVudHMnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhU2VydmljZShsYW1iZGFJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubGFtYmRhVG9TZXJ2aWNlLmdldChsYW1iZGFJZCk7XG4gICAgaWYgKCFzZXJ2aWNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3IobGFtYmRhSWQsICdsYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBzdG9yZWQgTGFtYmRhIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRlZmluaXRpb24gPSByZWdpc3RyeS5nZXRMYW1iZGFEZWZpbml0aW9uKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coZGVmaW5pdGlvbi50aWVzKTsgLy8gW1BheW1lbnRzU2VydmljZSwgQmlsbGluZ1NlcnZpY2VdXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhRGVmaW5pdGlvbihsYW1iZGFJZDogc3RyaW5nKTogTGFtYmRhRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuZ2V0KGxhbWJkYUlkKTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nU2VydmljZUVycm9yKGxhbWJkYUlkLCAnbGFtYmRhIGRlZmluaXRpb25zJyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2VydmljZSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2VydmljZSBpcyByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKHJlZ2lzdHJ5Lmhhc1NlcnZpY2UoJ3BheW1lbnRzJykpIHtcbiAgICogICBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBoYXNTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJzLmhhcyhzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBMYW1iZGEgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgaXMgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChyZWdpc3RyeS5oYXNMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpKSB7XG4gICAqICAgY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGhhc0xhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmhhcyhsYW1iZGFJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlcnZpY2VzID0gcmVnaXN0cnkuZ2V0U2VydmljZU5hbWVzKCk7XG4gICAqIGNvbnNvbGUubG9nKHNlcnZpY2VzKTsgLy8gWydwYXltZW50cycsICd1c2VycycsICdub3RpZmljYXRpb25zJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRTZXJ2aWNlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29udGFpbmVycy5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBMYW1iZGEgSURzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBMYW1iZGEgSURzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBsYW1iZGFzID0gcmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCk7XG4gICAqIGNvbnNvbGUubG9nKGxhbWJkYXMpOyAvLyBbJ3BheW1lbnRzLmNoYXJnZScsICdwYXltZW50cy5yZWZ1bmQnLCAndXNlcnMuY3JlYXRlJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubGFtYmRhVG9TZXJ2aWNlLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBMYW1iZGEgSURzIGZvciBhIHNwZWNpZmljIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyBiZWxvbmdpbmcgdG8gdGhlIHNlcnZpY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwYXltZW50TGFtYmRhcyA9IHJlZ2lzdHJ5LmdldExhbWJkYXNGb3JTZXJ2aWNlKCdwYXltZW50cycpO1xuICAgKiBjb25zb2xlLmxvZyhwYXltZW50TGFtYmRhcyk7IC8vIFsncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzLnJlZnVuZCddXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhc0ZvclNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsYW1iZGFzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbGFtYmRhSWQsIHNlcnZpY2VdIG9mIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHNlcnZpY2UgPT09IHNlcnZpY2VOYW1lKSB7XG4gICAgICAgIGxhbWJkYXMucHVzaChsYW1iZGFJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbWJkYXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2VydmljZSBhbmQgYWxsIGl0cyBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgdGhlIHNlcnZpY2UgY29udGFpbmVyIGFuZCBhbGwgTGFtYmRhLXRvLXNlcnZpY2UgbWFwcGluZ3NcbiAgICogZm9yIExhbWJkYXMgYmVsb25naW5nIHRvIHRoaXMgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byByZW1vdmVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlU2VydmljZSgncGF5bWVudHMnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzJyB3YXMgcmVnaXN0ZXJlZFxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZVNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0ZWQgPSB0aGlzLmNvbnRhaW5lcnMuZGVsZXRlKHNlcnZpY2VOYW1lKTtcblxuICAgIGlmIChleGlzdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIExhbWJkYSBtYXBwaW5ncyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICBjb25zdCBsYW1iZGFzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtsYW1iZGFJZCwgc2VydmljZV0gb2YgdGhpcy5sYW1iZGFUb1NlcnZpY2UuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlID09PSBzZXJ2aWNlTmFtZSkge1xuICAgICAgICAgIGxhbWJkYXNUb1JlbW92ZS5wdXNoKGxhbWJkYUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxhbWJkYUlkIG9mIGxhbWJkYXNUb1JlbW92ZSkge1xuICAgICAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIExhbWJkYSBtYXBwaW5nLlxuICAgKlxuICAgKiBSZW1vdmVzIHRoZSBMYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gTGFtYmRhIElELlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIHBhcmVudCBzZXJ2aWNlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIFRydWUgaWYgTGFtYmRhIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzLmNoYXJnZScgd2FzIHJlZ2lzdGVyZWRcbiAgICogYGBgXG4gICAqL1xuICByZW1vdmVMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFuZCBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgYWxsIGNvbnRhaW5lcnMsIG1hcHBpbmdzLCBhbmQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHJlaW5pdGlhbGl6aW5nIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5jbGVhcigpO1xuICAgKiBjb25zb2xlLmxvZyhyZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKSk7IC8vIFtdXG4gICAqIGNvbnNvbGUubG9nKHJlZ2lzdHJ5LmdldExhbWJkYUlkcygpKTsgLy8gW11cbiAgICogYGBgXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVnaXN0cnkgc3RhdGlzdGljcy5cbiAgICpcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHNlcnZpY2UgYW5kIExhbWJkYSBjb3VudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHJlZ2lzdHJ5LmdldFN0YXRzKCk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRzKTsgLy8geyBzZXJ2aWNlczogMywgbGFtYmRhczogOCB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdHMoKTogeyBzZXJ2aWNlczogbnVtYmVyOyBsYW1iZGFzOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiB0aGlzLmNvbnRhaW5lcnMuc2l6ZSxcbiAgICAgIGxhbWJkYXM6IHRoaXMubGFtYmRhVG9TZXJ2aWNlLnNpemUsXG4gICAgfTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2luZyB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB0eXBlIHsgTGFtYmRhTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZ2lzdHJhciB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9taWNyb3NlcnZpY2UtcmVnaXN0cmFyJztcbmltcG9ydCB7IExhbWJkYUhhbmRsZXJGYWN0b3J5IH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9sYW1iZGEtaGFuZGxlci1mYWN0b3J5JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcblxuLyoqXG4gKiBMYW1iZGEgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEhhbmRsZXMgTGFtYmRhIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogUmVzb2x2ZXMgdGhlIExhbWJkYSBJRCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcywgZ2V0cyB0aGUgYXBwcm9wcmlhdGVcbiAqIERJIGNvbnRhaW5lciwgY3JlYXRlcyB0aGUgaGFuZGxlciB3aXRoIGluamVjdGVkIGRlcGVuZGVuY2llcywgYW5kIGV4ZWN1dGVzXG4gKiB0aGUgYnVzaW5lc3MgbG9naWMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gUmVzb2x2ZSBMYW1iZGEgSUQgZnJvbSBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDIuIFVzZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gZ2V0IGNvbnRhaW5lciBmb3IgTGFtYmRhXG4gKiAzLiBVc2UgTGFtYmRhSGFuZGxlckZhY3RvcnkgdG8gY3JlYXRlIGhhbmRsZXIgd2l0aCBESVxuICogNC4gRXhlY3V0ZSBoYW5kbGVyIGFuZCByZXR1cm4gcmVzdWx0XG4gKlxuICogKipSZXF1aXJlbWVudHMqKjogUkVRLTA2LCBSRVEtMDhcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYVBpcGVsaW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiAnQGNvcmUvcnVudGltZS13ZWIvcGlwZWxpbmVzL2xhbWJkYS1waXBlbGluZScsXG4gIH0pO1xuXG4gIHByaXZhdGUgcmVnaXN0cmFyPzogTWljcm9zZXJ2aWNlUmVnaXN0cmFyO1xuICBwcml2YXRlIGhhbmRsZXJGYWN0b3J5PzogTGFtYmRhSGFuZGxlckZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgTGFtYmRhIHBpcGVsaW5lIGZvciBzZXJ2ZXItc2lkZSBmdW5jdGlvbiBleGVjdXRpb24uXG4gICAqXG4gICAqIFByb2Nlc3NlcyB0aGUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJ5LCByZXNvbHZlcyB0aGUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGVzLCBnZXRzIHRoZSBhcHByb3ByaWF0ZSBESSBjb250YWluZXIsIGNyZWF0ZXMgdGhlIGhhbmRsZXIgd2l0aFxuICAgKiBkZXBlbmRlbmN5IGluamVjdGlvbiwgYW5kIGV4ZWN1dGVzIHRoZSBidXNpbmVzcyBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvbiB3aXRoIG1pY3Jvc2VydmljZSByZWdpc3RyeVxuICAgKiBAcGFyYW0gY29udGV4dCAtIExhbWJkYSBlbnZpcm9ubWVudCBjb250ZXh0IHdpdGggbWV0YWRhdGFcbiAgICogQHJldHVybnMgUmVzdWx0IGZyb20gTGFtYmRhIGhhbmRsZXIgZXhlY3V0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGlwZWxpbmUgPSBuZXcgTGFtYmRhUGlwZWxpbmUoKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGlwZWxpbmUuZXhlY3V0ZShjb25maWcsIHtcbiAgICogICB0eXBlOiAnbGFtYmRhJyxcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgZnVuY3Rpb25OYW1lOiAnbXktYXBwLXBheW1lbnRzLWNoYXJnZS1kZXYnLFxuICAgKiAgICAgdmVyc2lvbjogJyRMQVRFU1QnLFxuICAgKiAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICogICAgIG1lbW9yeUxpbWl0OiAxMDI0LFxuICAgKiAgICAgcmVxdWVzdElkOiAnYWJjLTEyMydcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnLCBjb250ZXh0OiB7IHR5cGU6ICdsYW1iZGEnOyBtZXRhZGF0YTogTGFtYmRhTWV0YWRhdGEgfSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTdGFydGluZyBMYW1iZGEgcGlwZWxpbmUgZXhlY3V0aW9uJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHQubWV0YWRhdGEuZnVuY3Rpb25OYW1lLFxuICAgICAgICB2ZXJzaW9uOiBjb250ZXh0Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIHJlZ2lvbjogY29udGV4dC5tZXRhZGF0YS5yZWdpb24sXG4gICAgICAgIG1lbW9yeUxpbWl0OiBjb250ZXh0Lm1ldGFkYXRhLm1lbW9yeUxpbWl0LFxuICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHQubWV0YWRhdGEucmVxdWVzdElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIDEuIEluaXRpYWxpemUgcmVnaXN0cmFyIGFuZCBwcm9jZXNzIG1pY3Jvc2VydmljZXNcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJlZ2lzdHJhcihjb25maWcpO1xuXG4gICAgICAvLyAyLiBSZXNvbHZlIExhbWJkYSBJRCBmcm9tIGVudmlyb25tZW50XG4gICAgICBjb25zdCBsYW1iZGFJZCA9IHRoaXMucmVzb2x2ZUxhbWJkYUlkKCk7XG5cbiAgICAgIC8vIDMuIEdldCBESSBjb250YWluZXIgZm9yIHRoaXMgTGFtYmRhXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZCk7XG5cbiAgICAgIC8vIDQuIENyZWF0ZSBoYW5kbGVyIHdpdGggRElcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmNyZWF0ZUhhbmRsZXJXaXRoREkobGFtYmRhSWQsIGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIDUuIEV4ZWN1dGUgaGFuZGxlciAodGhpcyB3aWxsIGJlIGNhbGxlZCBieSBBV1MgTGFtYmRhIHJ1bnRpbWUpXG4gICAgICAvLyBOb3RlOiBJbiBhY3R1YWwgTGFtYmRhIGV4ZWN1dGlvbiwgdGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgaGFuZGxlclxuICAgICAgLy8gVGhlIEFXUyBMYW1iZGEgcnVudGltZSB3aWxsIGNhbGwgaGFuZGxlci5oYW5kbGVyKGV2ZW50LCBjb250ZXh0KVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTGFtYmRhIHBpcGVsaW5lIHNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaGFuZGxlciBmb3IgQVdTIExhbWJkYSBydW50aW1lIHRvIGludm9rZVxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0xhbWJkYSBwaXBlbGluZSBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHQubWV0YWRhdGEuZnVuY3Rpb25OYW1lLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBhbmQgcHJvY2VzcyBhbGwgc2VydmljZXMuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBuZXcgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIGFuZCBwcm9jZXNzZXMgYWxsIG1pY3Jvc2VydmljZVxuICAgKiBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIERJIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVJlZ2lzdHJhcihjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSW5pdGlhbGl6aW5nIG1pY3Jvc2VydmljZSByZWdpc3RyYXInKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2lzdHJhciA9IG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIoKTtcblxuICAgICAgLy8gUHJvY2VzcyBhbGwgbWljcm9zZXJ2aWNlcyBmcm9tIHRoZSByZWdpc3RlclxuICAgICAgZm9yIChjb25zdCBbc2VydmljZU5hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5yZWdpc3RlcikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgbWljcm9zZXJ2aWNlJywge1xuICAgICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICAgIHRpZXNDb3VudDogZGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICAgICAgICBsYW1iZGFzQ291bnQ6IGRlZmluaXRpb24ubGFtYmRhcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKHNlcnZpY2VOYW1lLCBkZWZpbml0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlcnZpY2VDb3VudDogT2JqZWN0LmtleXMoY29uZmlnLnJlZ2lzdGVyKS5sZW5ndGgsXG4gICAgICAgIHRvdGFsTGFtYmRhczogdGhpcy5yZWdpc3RyYXIuZ2V0TGFtYmRhSWRzKCkubGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIG1pY3Jvc2VydmljZSByZWdpc3RyYXInLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKlxuICAgKiBHZXRzIHRoZSBMYW1iZGEgSUQgZnJvbSB0aGUgTEFNQkRBX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXRcbiAgICogaXMgc2V0IGJ5IHRoZSBDREsgc3RhY2sgZHVyaW5nIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTEFNQkRBX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxhbWJkYUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFtYmRhSWQgPSBwcm9jZXNzLmVudi5MQU1CREFfSUQ7XG5cbiAgICBpZiAoIWxhbWJkYUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IGZvdW5kLiAnICtcbiAgICAgICAgJ1RoaXMgc2hvdWxkIGJlIHNldCBieSB0aGUgQ0RLIHN0YWNrIGR1cmluZyBkZXBsb3ltZW50LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMYW1iZGEgSUQgcmVzb2x2ZWQgZnJvbSBlbnZpcm9ubWVudCcsIHsgbGFtYmRhSWQgfSk7XG4gICAgcmV0dXJuIGxhbWJkYUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBESSBjb250YWluZXIgZm9yIHRoZSBzcGVjaWZpZWQgTGFtYmRhLlxuICAgKlxuICAgKiBVc2VzIHRoZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gbG9vayB1cCB0aGUgYXBwcm9wcmlhdGUgREkgY29udGFpbmVyXG4gICAqIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKVxuICAgKiBAcmV0dXJucyBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgTGFtYmRhJ3MgbWljcm9zZXJ2aWNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29udGFpbmVyIG5vdCBmb3VuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5yZWdpc3RyYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5yZWdpc3RyYXIuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RJIGNvbnRhaW5lciByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBsYW1iZGFJZCxcbiAgICAgICAgc2VydmljZU5hbWU6IHRoaXMucmVnaXN0cmFyLmdldFNlcnZpY2VGb3JMYW1iZGEobGFtYmRhSWQpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgREkgY29udGFpbmVyIGZvciBMYW1iZGEnLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgREkgY29udGFpbmVyIGZvciBMYW1iZGEgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgaGFuZGxlciB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKlxuICAgKiBVc2VzIHRoZSBMYW1iZGFIYW5kbGVyRmFjdG9yeSB0byBjcmVhdGUgYSBoYW5kbGVyIGluc3RhbmNlIHdpdGhcbiAgICogYXV0b21hdGljIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZyb20gdGhlIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSURcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIExhbWJkYSBoYW5kbGVyIGluc3RhbmNlIHJlYWR5IGZvciBleGVjdXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSGFuZGxlcldpdGhESShsYW1iZGFJZDogc3RyaW5nLCBjb250YWluZXI6IGFueSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBMYW1iZGEgaGFuZGxlciB3aXRoIERJJywgeyBsYW1iZGFJZCB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgZmFjdG9yeSBpZiBub3QgYWxyZWFkeSBkb25lXG4gICAgICBpZiAoIXRoaXMuaGFuZGxlckZhY3RvcnkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IG5ldyBMYW1iZGFIYW5kbGVyRmFjdG9yeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgdGhpcyBJRFxuICAgICAgY29uc3QgbGFtYmRhRGVmaW5pdGlvbiA9IHRoaXMuZmluZExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuXG4gICAgICAvLyBDcmVhdGUgaGFuZGxlciB3aXRoIERJXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyRmFjdG9yeS5jcmVhdGUobGFtYmRhRGVmaW5pdGlvbiwgY29udGFpbmVyKTtcblxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTGFtYmRhIGhhbmRsZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBkZXBlbmRlbmN5Q291bnQ6IGxhbWJkYURlZmluaXRpb24udGllcy5sZW5ndGgsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgTGFtYmRhIGhhbmRsZXInLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgTGFtYmRhIGhhbmRsZXIgZm9yICcke2xhbWJkYUlkfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIExhbWJkYSBkZWZpbml0aW9uIGJ5IElEIGZyb20gdGhlIHByb2Nlc3NlZCBtaWNyb3NlcnZpY2VzLlxuICAgKlxuICAgKiBVc2VzIHRoZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gcmV0cmlldmUgdGhlIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCB0byBmaW5kXG4gICAqIEByZXR1cm5zIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTGFtYmRhIGRlZmluaXRpb24gbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZpbmRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucmVnaXN0cmFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pY3Jvc2VydmljZSByZWdpc3RyYXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJhci5nZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmQgZm9yIElEICcke2xhbWJkYUlkfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuLy8gUmUtZXhwb3J0IGJhc2Ugc2VydmljZXMgZnJvbSBQdXJlbm93XG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93L2xhbWJkYSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzXG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtZXh0ZW5zaW9ucyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLWV4dGVuc2lvbnMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtZXh0ZW5zaW9ucy50eXBlcyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7XG4gICAgQmVmb3JlSW5zdGFuY2UsXG4gICAgY2F0Y2hJbmplY3RvcixcbiAgICBpbmplY3RCZWZvcmUsXG4gICAgbG9nZ2VyLFxuICAgIGxvZ2dlckluamVjdG9yLFxuICAgIExvZ2dlckludGVyZmFjZSxcbiAgICBMb2dnZXJMZXZlbCxcbiAgICBNYXliZSxcbiAgICBwdXJhYmxlLFxuICAgIFB1cmVub3dMb2dGb3JtYXR0ZXJQcm92aWRlcixcbiAgICBQdXJlbm93TG9nZ2VyRm9ybWF0dGVyLFxufSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgUnVudGltZUNvbmZpZywgUnVudGltZVN0YWNrQ29uZmlnIH0gZnJvbSAnLi9ydW50aW1lLWV4dGVuc2lvbnMudHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWVFeHRlbnNpb25zIHNlcnZpY2UgcHJvdmlkZXMgcnVudGltZS1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRoYXQgZXh0ZW5kc1xuICogcHVyZW5vdydzIGJhc2UgY2FwYWJpbGl0aWVzLiBUaGlzIHNlcnZpY2UgZm9sbG93cyBwdXJlbm93J3MgYXJjaGl0ZWN0dXJhbCBwYXR0ZXJuc1xuICogZm9yIEFXUyBpbnRlZ3JhdGlvbnMgYW5kIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEtleSByZXNwb25zaWJpbGl0aWVzOlxuICogLSBFbmhhbmNlIGRldmVsb3BtZW50IHNlcnZlciB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXNcbiAqIC0gUHJvdmlkZSBydW50aW1lLXNwZWNpZmljIGJ1aWxkIG9wdGltaXphdGlvbnNcbiAqIC0gQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjayBkZXBsb3ltZW50XG4gKiAtIEV4dGVuZCBwdXJlbm93IGZ1bmN0aW9uYWxpdHkgd2l0aG91dCByZXBsYWNpbmcgaXRcbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVFeHRlbnNpb25zIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIExvZ2dlciBpbnN0YW5jZSBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgICogVXNlcyBwdXJlbm93J3MgbG9nZ2luZyBwYXR0ZXJucyB3aXRoIEFXUyBwcm92aWRlci5cbiAgICovXG4gIGxvZ2dlckluc3RhbmNlID0gbG9nZ2VyKHtcbiAgICBzZXJ2aWNlTmFtZTogJ1J1bnRpbWUgfCBFeHRlbnNpb25zIFNlcnZpY2UnLFxuICAgIGxvZ0Zvcm1hdHRlcjogbmV3IFB1cmVub3dMb2dnZXJGb3JtYXR0ZXIoe1xuICAgICAgbG9nc1Byb3ZpZGVyOiBQdXJlbm93TG9nRm9ybWF0dGVyUHJvdmlkZXIuQXdzLFxuICAgIH0pIGFzIGFueSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJ1bnRpbWVDb25maWc6IFJ1bnRpbWVDb25maWcgPSB7XG4gICAgZW5hYmxlUnVudGltZUNvcmVTdGFjazogZmFsc2UsIC8vIEBub3RlOiBjcml0aWNhbCBOT1QgRVhQRUNURUQgdmFsdWUsIGNhbiBiZSByZW1vdmVkIHRvIGNsZWFuIHVwIHJlcG9cbiAgICBydW50aW1lV2ViTW9kZTogJ2RldmVsb3BtZW50JyxcbiAgICBhZGRpdGlvbmFsRmVhdHVyZXM6IFtdLFxuICAgIGRldlNlcnZlckVuaGFuY2VtZW50czoge1xuICAgICAgaG90UmVsb2FkOiB0cnVlLFxuICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZzogZmFsc2UsXG4gICAgfSxcbiAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgIGJ1bmRsZUFuYWx5c2lzOiBmYWxzZSxcbiAgICAgIHRyZWVzaGFraW5nOiB0cnVlLFxuICAgICAgY29kZU1pbmlmaWNhdGlvbjogdHJ1ZSxcbiAgICB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgICogVXNlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBwYXR0ZXJuIGNvbnNpc3RlbnQgd2l0aCBwdXJlbm93IHNlcnZpY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBydW50aW1lIGV4dGVuc2lvbnNcbiAgICB0aGlzLmluaXRpYWxpemVSdW50aW1lRXh0ZW5zaW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZSBleHRlbnNpb25zIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICAgKiBTZXRzIHVwIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMgdGhhdCBleHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5LlxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBJbml0aWFsaXplJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBJbml0aWFsaXplIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSdW50aW1lRXh0ZW5zaW9ucyhiZWZvcmVJbnN0YW5jZT86IEJlZm9yZUluc3RhbmNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3codGhpcy5ydW50aW1lQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnSW5pdGlhbGl6aW5nIHJ1bnRpbWUgZXh0ZW5zaW9ucycsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcblxuICAgIC8vIFJ1bnRpbWUgZXh0ZW5zaW9ucyBhcmUgbm93IHJlYWR5XG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3cobnVsbCwge1xuICAgICAgbWVzc2FnZTogJ1J1bnRpbWUgZXh0ZW5zaW9ucyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lLXNwZWNpZmljIGZlYXR1cmVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cncyBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2ZXJDb25maWcgLSBCYXNlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gcHVyZW5vd1xuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqIEByZXR1cm5zIFJ1bnRpbWUgQ29yZSBzZXJ2ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBFbmhhbmNlIERldiBTZXJ2ZXInKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEVuaGFuY2UgRGV2IFNlcnZlciB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIGVuaGFuY2VEZXZTZXJ2ZXIoXG4gICAgc2VydmVyQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGVuaGFuY2VtZW50cyA9IHRoaXMucnVudGltZUNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHM7XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IHNlcnZlckNvbmZpZywgZW5oYW5jZW1lbnRzIH0sIHtcbiAgICAgIG1lc3NhZ2U6ICdFbmhhbmNpbmcgZGV2ZWxvcG1lbnQgc2VydmVyIHdpdGggcnVudGltZSBmZWF0dXJlcycsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuRGVidWcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBydW50aW1lQ29yZUNvbmZpZyA9IHtcbiAgICAgIC4uLnNlcnZlckNvbmZpZyxcbiAgICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGVuaGFuY2VtZW50c1xuICAgICAgcnVudGltZToge1xuICAgICAgICBob3RSZWxvYWQ6IGVuaGFuY2VtZW50cz8uaG90UmVsb2FkID8/IHRydWUsXG4gICAgICAgIGRlYnVnTW9kZTogZW5oYW5jZW1lbnRzPy5kZWJ1Z01vZGUgPz8gZmFsc2UsXG4gICAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZzogZW5oYW5jZW1lbnRzPy5wZXJmb3JtYW5jZU1vbml0b3JpbmcgPz8gZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhydW50aW1lQ29yZUNvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ0RldmVsb3BtZW50IHNlcnZlciBSdW50aW1lIENvcmUgd2l0aCBydW50aW1lIGZlYXR1cmVzJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWVDb3JlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplIGJ1aWxkIHByb2Nlc3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIG9wdGltaXphdGlvbnMuXG4gICAqIEV4dGVuZHMgcHVyZW5vdydzIGJ1aWxkIHByb2Nlc3Mgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZENvbmZpZyAtIEJhc2UgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tIHB1cmVub3dcbiAgICogQHBhcmFtIGJlZm9yZUluc3RhbmNlIC0gTG9nZ2VyIGluc3RhbmNlIGZvciB0cmFja2luZ1xuICAgKiBAcmV0dXJucyBPcHRpbWl6ZWQgYnVpbGQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBPcHRpbWl6ZSBCdWlsZCcpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgT3B0aW1pemUgQnVpbGQgfCBFeGNlcHRpb24gKGVycm9yKScpLFxuICApXG4gIHB1YmxpYyBhc3luYyBvcHRpbWl6ZUJ1aWxkKFxuICAgIGJ1aWxkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG9wdGltaXphdGlvbnMgPSB0aGlzLnJ1bnRpbWVDb25maWcuYnVpbGRPcHRpbWl6YXRpb25zO1xuXG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBidWlsZENvbmZpZywgb3B0aW1pemF0aW9ucyB9LCB7XG4gICAgICBtZXNzYWdlOiAnQXBwbHlpbmcgcnVudGltZS1zcGVjaWZpYyBidWlsZCBvcHRpbWl6YXRpb25zJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGltaXplZENvbmZpZyA9IHtcbiAgICAgIC4uLmJ1aWxkQ29uZmlnLFxuICAgICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgb3B0aW1pemF0aW9uc1xuICAgICAgcnVudGltZToge1xuICAgICAgICBidW5kbGVBbmFseXNpczogb3B0aW1pemF0aW9ucz8uYnVuZGxlQW5hbHlzaXMgPz8gZmFsc2UsXG4gICAgICAgIHRyZWVzaGFraW5nOiBvcHRpbWl6YXRpb25zPy50cmVlc2hha2luZyA/PyB0cnVlLFxuICAgICAgICBjb2RlTWluaWZpY2F0aW9uOiBvcHRpbWl6YXRpb25zPy5jb2RlTWluaWZpY2F0aW9uID8/IHRydWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhvcHRpbWl6ZWRDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdCdWlsZCBjb25maWd1cmF0aW9uIG9wdGltaXplZCB3aXRoIHJ1bnRpbWUgZmVhdHVyZXMnLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW1pemVkQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBSdW50aW1lIENvcmUgc3RhY2sgZm9yIHJ1bnRpbWUgZGVwbG95bWVudC5cbiAgICogRXh0ZW5kcyBwdXJlbm93J3MgdHdvLXN0YWNrIGFyY2hpdGVjdHVyZSB0byB0aHJlZSBzdGFja3MuXG4gICAqXG4gICAqIEBwYXJhbSBiYXNlU3RhY2tDb25maWcgLSBCYXNlIHN0YWNrIGNvbmZpZ3VyYXRpb24gZnJvbSBwdXJlbm93XG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICogQHJldHVybnMgUnVudGltZSBzdGFjayBjb25maWd1cmF0aW9uIGZvciBSdW50aW1lIENvcmUgc3RhY2tcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjaycpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjayB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIGNvbmZpZ3VyZVJ1bnRpbWVDb3JlU3RhY2soXG4gICAgYmFzZVN0YWNrQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8TWF5YmU8UnVudGltZVN0YWNrQ29uZmlnPj4ge1xuICAgIGlmICghdGhpcy5ydW50aW1lQ29uZmlnLmVuYWJsZVJ1bnRpbWVDb3JlU3RhY2spIHtcbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KG51bGwsIHtcbiAgICAgICAgbWVzc2FnZTogJ1J1bnRpbWUgQ29yZSBzdGFjayBkZXBsb3ltZW50IGlzIGRpc2FibGVkJyxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KGJhc2VTdGFja0NvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ0NvbmZpZ3VyaW5nIFJ1bnRpbWUgQ29yZSBzdGFjayBmb3IgcnVudGltZSBkZXBsb3ltZW50JyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJ1bnRpbWVTdGFja0NvbmZpZzogUnVudGltZVN0YWNrQ29uZmlnID0ge1xuICAgICAgc3RhY2tOYW1lOiBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30tcnVudGltZWAsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdMYW1iZGEnLFxuICAgICAgICAgIG5hbWU6ICdSdW50aW1lV2ViSGFuZGxlcicsXG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICBydW50aW1lOiAnbm9kZWpzMTgueCcsXG4gICAgICAgICAgICB0aW1lb3V0OiAzMCxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGRlcGVuZGVuY2llczogW1xuICAgICAgICBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30taW5mcmFzdHJ1Y3R1cmVgLFxuICAgICAgICBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30tcnVudGltZS1iYXNlYCxcbiAgICAgIF0sXG4gICAgICBvdXRwdXRzOiB7XG4gICAgICAgIFJ1bnRpbWVTdGFja0FybjogJ3J1bnRpbWUtc3RhY2stYXJuJyxcbiAgICAgICAgUnVudGltZVdlYkVuZHBvaW50OiAncnVudGltZS13ZWItZW5kcG9pbnQnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3cocnVudGltZVN0YWNrQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnUnVudGltZSBDb3JlIHN0YWNrIGNvbmZpZ3VyYXRpb24gY3JlYXRlZCcsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcblxuICAgIHJldHVybiBydW50aW1lU3RhY2tDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi5cbiAgICogQWxsb3dzIGR5bmFtaWMgY29uZmlndXJhdGlvbiBvZiBydW50aW1lIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gTmV3IHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IFVwZGF0ZSBDb25maWd1cmF0aW9uJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBVcGRhdGUgQ29uZmlndXJhdGlvbiB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIHVwZGF0ZUNvbmZpZ3VyYXRpb24oXG4gICAgY29uZmlnOiBQYXJ0aWFsPFJ1bnRpbWVDb25maWc+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgb2xkQ29uZmlnOiB0aGlzLnJ1bnRpbWVDb25maWcsIG5ld0NvbmZpZzogY29uZmlnIH0sIHtcbiAgICAgIG1lc3NhZ2U6ICdVcGRhdGluZyBydW50aW1lIGNvbmZpZ3VyYXRpb24nLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgIH0pO1xuXG4gICAgLy8gTWVyZ2UgbmV3IGNvbmZpZ3VyYXRpb24gd2l0aCBleGlzdGluZyBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5ydW50aW1lQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzOiB7XG4gICAgICAgIC4uLnRoaXMucnVudGltZUNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHMsXG4gICAgICAgIC4uLmNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHMsXG4gICAgICB9LFxuICAgICAgYnVpbGRPcHRpbWl6YXRpb25zOiB7XG4gICAgICAgIC4uLnRoaXMucnVudGltZUNvbmZpZy5idWlsZE9wdGltaXphdGlvbnMsXG4gICAgICAgIC4uLmNvbmZpZy5idWlsZE9wdGltaXphdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh0aGlzLnJ1bnRpbWVDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdSdW50aW1lIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCcsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAqIFByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgdG8gcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZ3VyYXRpb24oKTogUmVhZG9ubHk8UnVudGltZUNvbmZpZz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMucnVudGltZUNvbmZpZyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bnRpbWUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2hlY2tpbmcgZmVhdHVyZSBmbGFncy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBmZWF0dXJlIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0ZlYXR1cmVFbmFibGVkKGZlYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzPy5pbmNsdWRlcyhmZWF0dXJlKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcnVudGltZSBmZWF0dXJlLlxuICAgKiBBZGRzIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gZW5hYmxlXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRW5hYmxlIEZlYXR1cmUnKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEVuYWJsZSBGZWF0dXJlIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgZW5hYmxlRmVhdHVyZShcbiAgICBmZWF0dXJlOiBzdHJpbmcsXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZSkpIHtcbiAgICAgIHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgPSBbXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIHx8IFtdKSxcbiAgICAgICAgZmVhdHVyZSxcbiAgICAgIF07XG5cbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgZmVhdHVyZSwgZW5hYmxlZEZlYXR1cmVzOiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgZW5hYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgZmVhdHVyZSB9LCB7XG4gICAgICAgIG1lc3NhZ2U6IGBSdW50aW1lIGZlYXR1cmUgJyR7ZmVhdHVyZX0nIGlzIGFscmVhZHkgZW5hYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHJ1bnRpbWUgZmVhdHVyZS5cbiAgICogUmVtb3ZlcyBmZWF0dXJlIGZyb20gdGhlIGxpc3Qgb2YgZW5hYmxlZCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gZGlzYWJsZVxuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IERpc2FibGUgRmVhdHVyZScpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRGlzYWJsZSBGZWF0dXJlIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgZGlzYWJsZUZlYXR1cmUoXG4gICAgZmVhdHVyZTogc3RyaW5nLFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZSkpIHtcbiAgICAgIHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgPSAodGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcihmID0+IGYgIT09IGZlYXR1cmUpO1xuXG4gICAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IGZlYXR1cmUsIGVuYWJsZWRGZWF0dXJlczogdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyB9LCB7XG4gICAgICAgIG1lc3NhZ2U6IGBSdW50aW1lIGZlYXR1cmUgJyR7ZmVhdHVyZX0nIGRpc2FibGVkYCxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBmZWF0dXJlIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgaXMgYWxyZWFkeSBkaXNhYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZUNvbmZpZyB7XG4gIC8qKiBFbmFibGUgUnVudGltZSBDb3JlIHN0YWNrIGRlcGxveW1lbnQgKi9cbiAgZW5hYmxlUnVudGltZUNvcmVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBSdW50aW1lIHdlYiBtb2RlIGNvbmZpZ3VyYXRpb24gKi9cbiAgcnVudGltZVdlYk1vZGU/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICAvKiogQWRkaXRpb25hbCBydW50aW1lIGZlYXR1cmVzIHRvIGVuYWJsZSAqL1xuICBhZGRpdGlvbmFsRmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgLyoqIERldmVsb3BtZW50IHNlcnZlciBlbmhhbmNlbWVudHMgKi9cbiAgZGV2U2VydmVyRW5oYW5jZW1lbnRzPzoge1xuICAgIGhvdFJlbG9hZD86IGJvb2xlYW47XG4gICAgZGVidWdNb2RlPzogYm9vbGVhbjtcbiAgICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc/OiBib29sZWFuO1xuICB9O1xuICAvKiogQnVpbGQgb3B0aW1pemF0aW9ucyAqL1xuICBidWlsZE9wdGltaXphdGlvbnM/OiB7XG4gICAgYnVuZGxlQW5hbHlzaXM/OiBib29sZWFuO1xuICAgIHRyZWVzaGFraW5nPzogYm9vbGVhbjtcbiAgICBjb2RlTWluaWZpY2F0aW9uPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW50aW1lIHN0YWNrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBSdW50aW1lIENvcmUgc3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVN0YWNrQ29uZmlnIHtcbiAgLyoqIE5hbWUgb2YgdGhlIHJ1bnRpbWUgc3RhY2sgKi9cbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKiBBV1MgcmVzb3VyY2VzIHRvIGluY2x1ZGUgaW4gdGhlIHN0YWNrICovXG4gIHJlc291cmNlczogUnVudGltZVJlc291cmNlW107XG4gIC8qKiBEZXBlbmRlbmNpZXMgb24gb3RoZXIgc3RhY2tzICovXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIC8qKiBTdGFjayBvdXRwdXRzIHRvIGV4cG9ydCAqL1xuICBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgQVdTIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlc291cmNlIHtcbiAgLyoqIFJlc291cmNlIHR5cGUgKGUuZy4sICdMYW1iZGEnLCAnRHluYW1vREInLCAnUzMnKSAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBSZXNvdXJjZSBuYW1lICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFJlc291cmNlIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIERldmVsb3BtZW50IHNlcnZlciBlbmhhbmNlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldlNlcnZlckVuaGFuY2VtZW50cyB7XG4gIC8qKiBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCAqL1xuICBob3RSZWxvYWQ6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgZGVidWcgbW9kZSB3aXRoIGFkZGl0aW9uYWwgbG9nZ2luZyAqL1xuICBkZWJ1Z01vZGU6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqL1xuICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQnVpbGQgb3B0aW1pemF0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpbWl6YXRpb25zIHtcbiAgLyoqIEVuYWJsZSBidW5kbGUgYW5hbHlzaXMgKi9cbiAgYnVuZGxlQW5hbHlzaXM6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgdHJlZSBzaGFraW5nICovXG4gIHRyZWVzaGFraW5nOiBib29sZWFuO1xuICAvKiogRW5hYmxlIGNvZGUgbWluaWZpY2F0aW9uICovXG4gIGNvZGVNaW5pZmljYXRpb246IGJvb2xlYW47XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBSZS1leHBvcnQgYmFzZSBidW5kbGUgZnVuY3Rpb25hbGl0eSBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgYnVuZGxlIGNvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS5jb250YWluZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLmNvbnRhaW5lci50eXBlcyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuaW1wb3J0IHsgcHVyYWJsZSwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IFJ1bnRpbWVFeHRlbnNpb25zIH0gZnJvbSAnQGNvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zJztcblxuLyoqXG4gKiBSdW50aW1lQ29udGFpbmVyIHByb3ZpZGVzIHJ1bnRpbWUtc3BlY2lmaWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gYmluZGluZ3NcbiAqIHVzaW5nIFB1cmVDb250YWluZXIgZnJvbSBAd29ya3RpZi91dGlscy4gVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm5cbiAqIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZSB3b3Jrc3BhY2UuXG4gKlxuICogVGhlIGNvbnRhaW5lciBhZGRzIHJ1bnRpbWUgc2VydmljZXMgd2hpbGUgYmVpbmcgY29tcGF0aWJsZSB3aXRoXG4gKiBwdXJlbm93J3MgYXJjaGl0ZWN0dXJhbCBwYXR0ZXJucy5cbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb250YWluZXIge1xuICBwcml2YXRlIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFB1cmVDb250YWluZXI8c3RyaW5nPih7XG4gICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgIH0pO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bnRpbWVCaW5kaW5ncygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlIGJpbmRpbmdzLlxuICAgKiBSZWdpc3RlcnMgcnVudGltZSBzZXJ2aWNlcyB3aXRoIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVSdW50aW1lQmluZGluZ3MoKTogdm9pZCB7XG4gICAgLy8gUmVnaXN0ZXIgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZSBhcyBzaW5nbGV0b25cbiAgICB0aGlzLmNvbnRhaW5lci50aWVTaW5nbGV0b24oe1xuICAgICAgJ1J1bnRpbWVFeHRlbnNpb25zJzoge1xuICAgICAgICBpbnN0YW5jZTogUnVudGltZUV4dGVuc2lvbnMsXG4gICAgICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBjb250YWluZXIgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRDb250YWluZXIoKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHNlcnZpY2UgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQ+KHNlcnZpY2VJZDogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqIFV0aWxpdHkgbWV0aG9kIGZvciBzZXJ2aWNlIHZhbGlkYXRpb24uXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKHNlcnZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGZvciBSdW50aW1lLXNwZWNpZmljIERlcGVuZGVuY3kgSW5qZWN0aW9uIGJpbmRpbmdzLlxuICogRXh0ZW5kcyBwdXJlbm93J3MgREkgYmluZGluZ3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUnVudGltZURpIHtcbiAgLy8gUnVudGltZSBFeHRlbnNpb25zIFNlcnZpY2VcbiAgUnVudGltZUV4dGVuc2lvbnNTZXJ2aWNlQmluZCA9ICdydW50aW1lX2V4dGVuc2lvbnNfc2VydmljZV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENvbmZpZ3VyYXRpb25cbiAgUnVudGltZUNvbmZpZ0JpbmQgPSAncnVudGltZV9jb25maWdfYmluZCcsXG5cbiAgLy8gUnVudGltZSBEZXBsb3ltZW50IFN0cmF0ZWd5XG4gIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3lCaW5kID0gJ3J1bnRpbWVfZGVwbG95bWVudF9zdHJhdGVneV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENMSSBFeHRlbnNpb25zXG4gIFJ1bnRpbWVDbGlCaW5kID0gJ3J1bnRpbWVfY2xpX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgU3RhY2sgQ29uZmlndXJhdGlvblxuICBSdW50aW1lU3RhY2tDb25maWdCaW5kID0gJ3J1bnRpbWVfc3RhY2tfY29uZmlnX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgV2ViIEhhbmRsZXIgRmFjdG9yeVxuICBSdW50aW1lV2ViSGFuZGxlckZhY3RvcnlCaW5kID0gJ3J1bnRpbWVfd2ViX2hhbmRsZXJfZmFjdG9yeV9iaW5kJyxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJpMkJBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFI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QixtQ0FqQmZBLFFBQUEsSWpPR2xCQyxFQUFBQyxFQUFjQyxFQTFCZCIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX1JlZmxlY3QiLCAiX19jb21tb25KU01pbiIsICJSZWZsZWN0IiwgImZhY3RvcnkiLCAicm9vdCIsICJzbG9wcHlNb2RlVGhpcyIsICJleHBvcnRlciIsICJtYWtlRXhwb3J0ZXIiLCAidGFyZ2V0IiwgInByZXZpb3VzIiwgImtleSIsICJ2YWx1ZSIsICJmdW5jdGlvblRoaXMiLCAiaW5kaXJlY3RFdmFsVGhpcyIsICJoYXNPd24iLCAic3VwcG9ydHNTeW1ib2wiLCAidG9QcmltaXRpdmVTeW1ib2wiLCAiaXRlcmF0b3JTeW1ib2wiLCAic3VwcG9ydHNDcmVhdGUiLCAic3VwcG9ydHNQcm90byIsICJkb3duTGV2ZWwiLCAiSGFzaE1hcCIsICJNYWtlRGljdGlvbmFyeSIsICJtYXAiLCAiZnVuY3Rpb25Qcm90b3R5cGUiLCAiX01hcCIsICJDcmVhdGVNYXBQb2x5ZmlsbCIsICJfU2V0IiwgIkNyZWF0ZVNldFBvbHlmaWxsIiwgIl9XZWFrTWFwIiwgIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsICJyZWdpc3RyeVN5bWJvbCIsICJtZXRhZGF0YVJlZ2lzdHJ5IiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJtZXRhZGF0YVByb3ZpZGVyIiwgIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCAiZGVjb3JhdGUiLCAiZGVjb3JhdG9ycyIsICJwcm9wZXJ0eUtleSIsICJhdHRyaWJ1dGVzIiwgIklzVW5kZWZpbmVkIiwgIklzQXJyYXkiLCAiSXNDb25zdHJ1Y3RvciIsICJEZWNvcmF0ZUNvbnN0cnVjdG9yIiwgIklzT2JqZWN0IiwgIklzTnVsbCIsICJUb1Byb3BlcnR5S2V5IiwgIkRlY29yYXRlUHJvcGVydHkiLCAibWV0YWRhdGEiLCAibWV0YWRhdGFLZXkiLCAibWV0YWRhdGFWYWx1ZSIsICJkZWNvcmF0b3IiLCAiSXNQcm9wZXJ0eUtleSIsICJPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImhhc01ldGFkYXRhIiwgIk9yZGluYXJ5SGFzTWV0YWRhdGEiLCAiaGFzT3duTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeUdldE1ldGFkYXRhIiwgImdldE93bk1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5TWV0YWRhdGFLZXlzIiwgImdldE93bk1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyIsICJkZWxldGVNZXRhZGF0YSIsICJwcm92aWRlciIsICJHZXRNZXRhZGF0YVByb3ZpZGVyIiwgImkiLCAiZGVjb3JhdGVkIiwgImRlc2NyaXB0b3IiLCAiTWV0YWRhdGFLZXkiLCAiTyIsICJQIiwgInBhcmVudCIsICJPcmRpbmFyeUdldFByb3RvdHlwZU9mIiwgIlRvQm9vbGVhbiIsICJNZXRhZGF0YVZhbHVlIiwgIm93bktleXMiLCAicGFyZW50S2V5cyIsICJzZXQiLCAia2V5cyIsICJfaSIsICJvd25LZXlzXzEiLCAiaGFzS2V5IiwgIl9hIiwgInBhcmVudEtleXNfMSIsICJUeXBlIiwgIngiLCAiSXNTeW1ib2wiLCAiVG9QcmltaXRpdmUiLCAiaW5wdXQiLCAiUHJlZmVycmVkVHlwZSIsICJoaW50IiwgImV4b3RpY1RvUHJpbSIsICJHZXRNZXRob2QiLCAicmVzdWx0IiwgIk9yZGluYXJ5VG9QcmltaXRpdmUiLCAidG9TdHJpbmdfMSIsICJJc0NhbGxhYmxlIiwgInZhbHVlT2YiLCAidG9TdHJpbmdfMiIsICJhcmd1bWVudCIsICJUb1N0cmluZyIsICJTYW1lVmFsdWVaZXJvIiwgInkiLCAiViIsICJmdW5jIiwgIkdldEl0ZXJhdG9yIiwgIm9iaiIsICJtZXRob2QiLCAiaXRlcmF0b3IiLCAiSXRlcmF0b3JWYWx1ZSIsICJpdGVyUmVzdWx0IiwgIkl0ZXJhdG9yU3RlcCIsICJJdGVyYXRvckNsb3NlIiwgImYiLCAicHJvdG8iLCAicHJvdG90eXBlIiwgInByb3RvdHlwZVByb3RvIiwgImNvbnN0cnVjdG9yIiwgIkNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAiZmFsbGJhY2siLCAiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsICJmaXJzdCIsICJzZWNvbmQiLCAicmVzdCIsICJ0YXJnZXRQcm92aWRlck1hcCIsICJyZWdpc3RyeSIsICJyZWdpc3RlclByb3ZpZGVyIiwgImdldFByb3ZpZGVyIiwgInNldFByb3ZpZGVyIiwgImdldFByb3ZpZGVyTm9DYWNoZSIsICJuZXh0IiwgInByb3ZpZGVyTWFwIiwgImhhc1Byb3ZpZGVyIiwgImV4aXN0aW5nUHJvdmlkZXIiLCAidGFyZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlEZWxldGVNZXRhZGF0YSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwgIkNyZWF0ZSIsICJjcmVhdGVkVGFyZ2V0TWV0YWRhdGEiLCAibWV0YWRhdGFNYXAiLCAia2V5c09iaiIsICJrIiwgIm5leHRWYWx1ZSIsICJlIiwgInJlZmxlY3QiLCAibWV0YWRhdGFPd25lciIsICJtZXRhZGF0YVByb3BlcnR5U2V0IiwgInJlZ2lzdGVyZWRQcm92aWRlciIsICJjYWNoZVNlbnRpbmVsIiwgImFycmF5U2VudGluZWwiLCAiTWFwSXRlcmF0b3IiLCAidmFsdWVzIiwgInNlbGVjdG9yIiwgImluZGV4IiwgImVycm9yIiwgIk1hcCIsICJzaXplIiwgImdldEtleSIsICJnZXRWYWx1ZSIsICJnZXRFbnRyeSIsICJpbnNlcnQiLCAiXyIsICJTZXQiLCAiVVVJRF9TSVpFIiwgInJvb3RLZXkiLCAiQ3JlYXRlVW5pcXVlS2V5IiwgIldlYWtNYXAiLCAidGFibGUiLCAiR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUiLCAiQ3JlYXRlVVVJRCIsICJjcmVhdGUiLCAiRmlsbFJhbmRvbUJ5dGVzIiwgImJ1ZmZlciIsICJHZW5SYW5kb21CeXRlcyIsICJhcnJheSIsICJkYXRhIiwgIm9mZnNldCIsICJieXRlIiwgInJ1bnRpbWVfd2ViX2xhbWJkYV9oYW5kbGVyX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUnVudGltZVdlYkxhbWJkYUhhbmRsZXIiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9wdXJld3MiLCAiaW5pdF9ydW50aW1lX3dlYl9sYW1iZGFfaGFuZGxlciIsICJfX2VzbU1pbiIsICJkZWZpbml0aW9uIiwgImNvbnRhaW5lciIsICJmYWN0b3J5IiwgImV2ZW50IiwgImNvbnRleHQiLCAicmVzdWx0IiwgImVycm9yIiwgImRlcHMiLCAicmF3VXNlckhhbmRsZXIiLCAid3JhcHBlZEhhbmRsZXIiLCAiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJDb250YWluZXJSZWdpc3RyeSIsICJESUNvbnRhaW5lckVycm9yIiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgIkxhbWJkYVBpcGVsaW5lIiwgIk1pY3Jvc2VydmljZVJlZ2lzdHJhciIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIlJ1bnRpbWVDb250YWluZXIiLCAiUnVudGltZURldGVjdG9yIiwgIlJ1bnRpbWVEaSIsICJSdW50aW1lRXh0ZW5zaW9ucyIsICJSdW50aW1lV2ViTGFtYmRhSGFuZGxlciIsICJUaWVzUmVnaXN0cmFyIiwgIlRpZXNSZWdpc3RyYXRpb25FcnJvciIsICJlcnJvcldyYXBwZXIiLCAiZnVsbFdyYXBwZXIiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImdldENES01ldGFkYXRhIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImxvZ2dpbmdXcmFwcGVyIiwgInRpbWluZ1dyYXBwZXIiLCAiX190b0NvbW1vbkpTIiwgIl9fcmVFeHBvcnQiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImVycm9yIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImZ1bmN0aW9uTmFtZSIsICJtZW1vcnlTaXplIiwgImdldENES01ldGFkYXRhIiwgIlJ1bnRpbWVEZXRlY3RvciIsICJnZXRCcm93c2VyTWV0YWRhdGEiLCAiZ2V0TGFtYmRhTWV0YWRhdGEiLCAiZ2V0Q0RLTWV0YWRhdGEiLCAiYXJnIiwgImltcG9ydF91dGlscyIsICJESUNvbnRhaW5lckVycm9yIiwgImNvbnRhaW5lck5hbWUiLCAibWVzc2FnZSIsICJUaWVzUmVnaXN0cmF0aW9uRXJyb3IiLCAidGllc0NsYXNzTmFtZSIsICJyZWFzb24iLCAiTWlzc2luZ1NlcnZpY2VFcnJvciIsICJzZXJ2aWNlTmFtZSIsICJUaWVzUmVnaXN0cmFyIiwgImNvbnRhaW5lciIsICJ0aWVzQ2xhc3NlcyIsICJUaWVzQ2xhc3MiLCAidGllc0luc3RhbmNlIiwgIlRpZXNSZWdpc3RyYXRpb25FcnJvciIsICJlcnJvciIsICJyZXF1aXJlZFNlcnZpY2VzIiwgIm1pc3NpbmdTZXJ2aWNlcyIsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZXMiLCAibmFtZXMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImltcG9ydF91dGlscyIsICJQdXJlQ29udGFpbmVyRmFjdG9yeSIsICJUaWVzUmVnaXN0cmFyIiwgInRpZXNDbGFzc2VzIiwgImNvbnRhaW5lciIsICJlcnJvciIsICJESUNvbnRhaW5lckVycm9yIiwgIm9wdGlvbnMiLCAicmVxdWlyZWRTZXJ2aWNlcyIsICJhZGRpdGlvbmFsU2VydmljZXMiLCAiYWxsUmVxdWlyZWRTZXJ2aWNlcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJsb2dnaW5nV3JhcHBlciIsICJoYW5kbGVyIiwgIm1ldGFkYXRhIiwgImhhbmRsZXJMb2dnZXIiLCAiZXZlbnQiLCAiY29udGV4dCIsICJzdGFydFRpbWUiLCAiY29udGV4dEluZm8iLCAiZXh0cmFjdExhbWJkYUNvbnRleHQiLCAiZ2V0RXZlbnRUeXBlIiwgInJlc3VsdCIsICJtZXRyaWNzIiwgImNhbGN1bGF0ZU1ldHJpY3MiLCAiZXJyb3IiLCAiZXJyb3JXcmFwcGVyIiwgImVycm9yTG9nZ2VyIiwgImVycm9yRGV0YWlscyIsICJleHRyYWN0RXJyb3JEZXRhaWxzIiwgImlzQXBpR2F0ZXdheUV2ZW50IiwgInRpbWluZ1dyYXBwZXIiLCAidGltaW5nTG9nZ2VyIiwgInN0YXJ0TWVtb3J5IiwgImNhbGN1bGF0ZURldGFpbGVkTWV0cmljcyIsICJmdWxsV3JhcHBlciIsICJjdHgiLCAiZW5kVGltZSIsICJlbmRNZW1vcnkiLCAiZXZ0IiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgIlJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIiwgInRpZXMiLCAiZGVwcyIsICJjbGFzc1JlZiIsICJ0b2tlbiIsICJpbnN0YW5jZSIsICJrZXkiLCAiZXJyb3IiLCAiaGFuZGxlciIsICJtZXRhZGF0YSIsICJmdWxsV3JhcHBlciIsICJjbGFzc05hbWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImluaXRfcnVudGltZV93ZWJfbGFtYmRhX2hhbmRsZXIiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImlzUHJvbWlzZSIsICJvYmplY3QiLCAidGhlbiIsICJzdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllciIsICJzZXJ2aWNlSWRlbnRpZmllciIsICJ0b1N0cmluZyIsICJuYW1lIiwgIkVycm9yIiwgImlzbGF6eVNlcnZpY2VJZGVudGlmaWVyU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgImJ1aWxkU2VydmljZUlkIiwgInRoaXMiLCAidmFsdWUiLCAidW53cmFwIiwgImdldE93blJlZmxlY3RNZXRhZGF0YSIsICJ0YXJnZXQiLCAibWV0YWRhdGFLZXkiLCAicHJvcGVydHlLZXkiLCAiUmVmbGVjdCIsICJnZXRPd25NZXRhZGF0YSIsICJzZXRSZWZsZWN0TWV0YWRhdGEiLCAidGFyZ2V0IiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhIiwgInByb3BlcnR5S2V5IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAidXBkYXRlT3duUmVmbGVjdE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFZhbHVlIiwgImNhbGxiYWNrIiwgInVwZGF0ZWRNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiSURfTUVUQURBVEEiLCAiZ2V0QmluZGluZ0lkIiwgImJpbmRpbmdJZCIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiT2JqZWN0IiwgIk51bWJlciIsICJNQVhfU0FGRV9JTlRFR0VSIiwgInNldFJlZmxlY3RNZXRhZGF0YSIsICJNSU5fU0FGRV9JTlRFR0VSIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJpZCIsICJiaW5kaW5nU2NvcGVWYWx1ZXMiLCAiUmVxdWVzdCIsICJTaW5nbGV0b24iLCAiVHJhbnNpZW50IiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkNvbnN0YW50VmFsdWUiLCAiRHluYW1pY1ZhbHVlIiwgIkZhY3RvcnkiLCAiSW5zdGFuY2UiLCAiUHJvdmlkZXIiLCAiUmVzb2x2ZWRWYWx1ZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAiQWN0aXZhdGlvblJlbGF0aW9uS2luZCIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJsaWZlY3ljbGUiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicHJlRGVzdHJveU1ldGhvZE5hbWUiLCAidW5kZWZpbmVkIiwgInByb3BlcnRpZXMiLCAiTWFwIiwgInNjb3BlIiwgInBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnRSZWZsZWN0S2V5IiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiRXJyb3IiLCAia2luZCIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAic3VwZXIiLCAidGhpcyIsICJ2YWx1ZSIsICJpcyIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIkJpbmRpbmdSZWxhdGlvbktpbmQiLCAiRGVhY3RpdmF0aW9uUmVsYXRpb25LaW5kIiwgIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZCIsICJnZXRDbGFzc01ldGFkYXRhIiwgInR5cGUiLCAiY2xhc3NNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAicGVuZGluZ0NsYXNzTWV0YWRhdGFDb3VudCIsICJ1bmRlZmluZWRJbmRleGVzIiwgImxlbmd0aCIsICJtaXNzaW5nSW5qZWN0aW9uRGVjb3JhdG9yIiwgIm5hbWUiLCAidG9TdHJpbmciLCAiaSIsICJwdXNoIiwgImpvaW4iLCAiZXJyb3JzIiwgImNvbnN0cnVjdG9yQXJndW1lbnQiLCAidW5rbm93biIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0eSIsICJidWlsZEluc3RhbmNlQmluZGluZyIsICJhdXRvYmluZE9wdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGUiLCAiaXNSaWdodCIsICJpZCIsICJnZXRCaW5kaW5nSWQiLCAiaW1wbGVtZW50YXRpb25UeXBlIiwgImlzU2F0aXNmaWVkQnkiLCAibW9kdWxlSWQiLCAib25BY3RpdmF0aW9uIiwgIm9uRGVhY3RpdmF0aW9uIiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkluc3RhbmNlIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQiLCAiQmluZGluZ1JlbGF0aW9uS2luZCIsICJEZWFjdGl2YXRpb25SZWxhdGlvbktpbmQiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdE1ldGFkYXRhIiwgImJ1aWxkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEiLCAicGFyYW1zIiwgIm1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJpbmplY3Rpb25EZWNvcmF0b3JDb25mbGljdCIsICJhc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVua25vd24iLCAiaXNGcm9tVHlwZXNjcmlwdFBhcmFtVHlwZSIsICJidWlsZE1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAibXVsdGlwbGVJbmplY3Rpb24iLCAiY2hhaW5lZCIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgIkRlY29yYXRvckluZm9LaW5kIiwgIkRlY29yYXRvckluZm9LaW5kIiwgImNsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkiLCAiTk9OX1VTRVJMQU5EX1RZUEVTIiwgIkFycmF5IiwgIkJpZ0ludCIsICJCb29sZWFuIiwgIkZ1bmN0aW9uIiwgIk51bWJlciIsICJPYmplY3QiLCAiU3RyaW5nIiwgInVwZGF0ZUNsYXNzTWV0YWRhdGFXaXRoVHlwZXNjcmlwdFBhcmFtZXRlclR5cGVzIiwgInRhcmdldCIsICJ0eXBlc2NyaXB0Q29uc3RydWN0b3JBcmd1bWVudHMiLCAiZ2V0T3duUmVmbGVjdE1ldGFkYXRhIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhIiwgImZvckVhY2giLCAiY29uc3RydWN0b3JBcmd1bWVudFR5cGUiLCAiaW5kZXgiLCAidHlwZSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJpbmNsdWRlcyIsICJpc0Zyb21UeXBlc2NyaXB0UGFyYW1UeXBlIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInNpbmdsZUluamVjdGlvbiIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgImluamVjdGFibGUiLCAic2NvcGUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAic2V0UmVmbGVjdE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFVubWFuYWdlZE1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJidWlsZFVubWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFzc2VydE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRJZk1hbmFnZWQiLCAibmFtZSIsICJvcHRpb25hbCIsICJ0YWdzIiwgInNpemUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiaXNMYXp5UGxhblNlcnZpY2VOb2RlU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVBsYW5TZXJ2aWNlTm9kZSIsICJfc2VydmljZUlkZW50aWZpZXIiLCAiX3NlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgInRoaXMiLCAiYmluZGluZ3MiLCAiX2dldE5vZGUiLCAiaXNDb250ZXh0RnJlZSIsICJ2YWx1ZSIsICJpbnZhbGlkYXRlIiwgImlzRXhwYW5kZWQiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkJpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uIiwgIm5vZGUiLCAibmFtZSIsICJlbGVtIiwgInRhZ3MiLCAiZ2V0QW5jZXN0b3IiLCAiZ2V0QW5jZXN0b3JzQ2FsbGVkIiwgInByZXZpb3VzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJvcHRpb25zIiwgImN1c3RvbVNlcnZpY2VJZGVudGlmaWVyIiwgImZpbHRlcmVkQmluZGluZ3MiLCAiY2hhaW5lZCIsICJvcGVyYXRpb25zIiwgImdldEJpbmRpbmdzQ2hhaW5lZCIsICJnZXRCaW5kaW5ncyIsICJmaWx0ZXIiLCAiYmluZGluZyIsICJpc1NhdGlzZmllZEJ5IiwgImxlbmd0aCIsICJhdXRvYmluZE9wdGlvbnMiLCAiYnVpbGRJbnN0YW5jZUJpbmRpbmciLCAic2V0QmluZGluZyIsICJwdXNoIiwgImlzUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgIm5vZGUiLCAicmVkaXJlY3Rpb25zIiwgInRocm93RXJyb3JXaGVuVW5leHBlY3RlZEJpbmRpbmdzQW1vdW50Rm91bmQiLCAiYmluZGluZ05vZGVzIiwgImlzT3B0aW9uYWwiLCAiYmluZGluZ0NvbnN0cmFpbnROb2RlIiwgInNlcnZpY2VSZWRpcmVjdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiZWxlbSIsICJwYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJwcmV2aW91cyIsICJBcnJheSIsICJpc0FycmF5IiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJsZW5ndGgiLCAibGFzdFJlc29sdmVkU2VydmljZUlkZW50aWZpZXIiLCAiZXJyb3JNZXNzYWdlIiwgInN0cmluZ2lmeVNlcnZpY2VJZGVudGlmaWVyIiwgInN0cmluZ2lmeVNlcnZpY2VSZWRpcmVjdGlvbnMiLCAibWFwIiwgImJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJJbnN0YW5jZSIsICJzY29wZSIsICJpbXBsZW1lbnRhdGlvblR5cGUiLCAibmFtZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAidGFyZ2V0U2VydmljZUlkZW50aWZpZXIiLCAiam9pbiIsICJzdHJpbmdpZnlQYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJzdHJpbmdpZnlCaW5kaW5nQ29uc3RyYWludHMiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAicGxhbm5pbmciLCAidGhyb3dCaW5kaW5nTm90Rm91bmRFcnJvciIsICJzdHJpbmdpZmllZFRhZ3MiLCAidGFncyIsICJzaXplIiwgImtleXMiLCAia2V5IiwgInRvU3RyaW5nIiwgImNoZWNrUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlU2luZ2xlSW5qZWN0aW9uQmluZGluZ3MiLCAic2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicGxhbkJpbmRpbmdOb2RlIiwgImNoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncyIsICJzZXJ2aWNlTm9kZSIsICJiaW5kaW5ncyIsICJnZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJpcyIsICJ1bndyYXAiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFNlcnZpY2VOb2RlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAiZWxlbWVudE1ldGFkYXRhIiwgInZhbHVlIiwgInVwZGF0ZWRCaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImNvbmNhdCIsICJnZXRBbmNlc3RvcnNDYWxsZWQiLCAiQmluZGluZ0NvbnN0cmFpbnRzSW1wbGVtZW50YXRpb24iLCAibGFzdCIsICJjaGFpbmVkIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIm11bHRpcGxlSW5qZWN0aW9uIiwgImZpbHRlcmVkU2VydmljZUJpbmRpbmdzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAic2VydmljZU5vZGVCaW5kaW5ncyIsICJpc0NvbnRleHRGcmVlIiwgInB1c2giLCAic2luZ2xlSW5qZWN0aW9uIiwgIm9wdGlvbmFsIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJSZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZCIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJzdWJwbGFuIiwgImJ1aWxkSW5zdGFuY2VQbGFuQmluZGluZ05vZGUiLCAiY2hpbGROb2RlIiwgImNsYXNzTWV0YWRhdGEiLCAib3BlcmF0aW9ucyIsICJnZXRDbGFzc01ldGFkYXRhIiwgImNvbnN0cnVjdG9yUGFyYW1zIiwgInByb3BlcnR5UGFyYW1zIiwgIk1hcCIsICJzdWJwbGFuUGFyYW1zIiwgImF1dG9iaW5kT3B0aW9ucyIsICJzZXJ2aWNlc0JyYW5jaCIsICJidWlsZFJlc29sdmVkVmFsdWVQbGFuQmluZGluZ05vZGUiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgInBsYW5CaW5kaW5nTm9kZXMiLCAiUmVzb2x2ZWRWYWx1ZSIsICJidWlsZFNlcnZpY2VSZWRpcmVjdGlvblBsYW5CaW5kaW5nTm9kZSIsICJwb3AiLCAiY3VzdG9tU2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGVOb25Sb290UGxhblNlcnZpY2VOb2RlIiwgImdldFBsYW5PcHRpb25zIiwgInBsYW5TZXJ2aWNlTm9kZSIsICJjb250ZXh0IiwgIkxhenlQbGFuU2VydmljZU5vZGUiLCAiaXNFeHBhbmRlZCIsICJwbGFuUmVzdWx0IiwgInRyZWUiLCAicm9vdCIsICJzZXRQbGFuIiwgInNldE5vbkNhY2hlZFNlcnZpY2VOb2RlIiwgIkxhenlNYW5hZ2VkQ2xhc3NNZXRhZGF0YVBsYW5TZXJ2aWNlTm9kZSIsICJidWlsZExhenlQbGFuU2VydmljZU5vZGVOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInN1cGVyIiwgInRoaXMiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkxhenlSZXNvbHZlZFZhbHVlTWV0YWRhdGFQbGFuU2VydmljZU5vZGUiLCAiYnVpbGRMYXp5UGxhblNlcnZpY2VOb2RlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlTdWJwbGFuIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAic3VicGxhbkluc3RhbmNlQmluZGluZ05vZGUiLCAiaGFuZGxlUGxhblNlcnZpY2VOb2RlQnVpbGRGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAidW5tYW5hZ2VkIiwgInRhZyIsICJlbnRyaWVzIiwgIm5leHQiLCAiaXNNdWx0aXBsZSIsICJnZXRQbGFuIiwgImxhenlQbGFuU2VydmljZU5vZGUiLCAib3B0aW9uYWxCaW5kaW5ncyIsICJpbmRleCIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0aWVzIiwgInNldCIsICJzdWJwbGFuUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgImhhbmRsZVBsYW5TZXJ2aWNlTm9kZUJ1aWxkRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAicmVzb2x2ZWRWYWx1ZU1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFyZ3VtZW50cyIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJjdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImNpcmN1bGFyQnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeVN1YnBsYW4iLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgIkNhY2hlQmluZGluZ0ludmFsaWRhdGlvbktpbmQiLCAiYnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5U3VicGxhbiIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInBhcmFtcyIsICJiaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImVsZW1lbnRNZXRhZGF0YSIsICJsYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAibGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJlcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiaXNFcnJvck9mS2luZCIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInBsYW5uaW5nIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJjYWNoZVJlc29sdmVkVmFsdWUiLCAiYmluZGluZyIsICJyZXNvbHZlZFZhbHVlIiwgImlzUHJvbWlzZSIsICJjYWNoZSIsICJpc1JpZ2h0IiwgInZhbHVlIiwgInRoZW4iLCAic3luY1Jlc29sdmVkVmFsdWUiLCAiY2FjaGVTeW5jUmVzb2x2ZWRWYWx1ZSIsICJyZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucyIsICJwYXJhbXMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiYWN0aXZhdGlvbnMiLCAiZ2V0QWN0aXZhdGlvbnMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9uc0Zyb21JdGVyYXRvckFzeW5jIiwgIlN5bWJvbCIsICJpdGVyYXRvciIsICJhY3RpdmF0aW9uc0l0ZXJhdG9yIiwgImFjdGl2YXRlZFZhbHVlIiwgImFjdGl2YXRpb25JdGVyYXRvclJlc3VsdCIsICJuZXh0IiwgImRvbmUiLCAibmV4dEFjdGl2YXRlZFZhbHVlIiwgImNvbnRleHQiLCAiYXN5bmMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9ucyIsICJhY3RpdmF0aW9uUmVzdWx0IiwgIm9uQWN0aXZhdGlvbiIsICJyZXNvbHZlZCIsICJyZXNvbHZlU2luZ2xldG9uU2NvcGVkQmluZGluZyIsICJyZXNvbHZlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJfcGFyYW1zIiwgImdldFNlbGYiLCAic2VsZiIsICJyZXNvbHZlU2NvcGVkIiwgImdldEJpbmRpbmciLCAiYXJnIiwgInNjb3BlIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJTaW5nbGV0b24iLCAiUmVxdWVzdCIsICJyZXF1ZXN0U2NvcGVDYWNoZSIsICJoYXMiLCAiaWQiLCAiZ2V0IiwgInNldCIsICJUcmFuc2llbnQiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAicmVzb2x2ZUZhY3RvcnlCaW5kaW5nIiwgImZhY3RvcnkiLCAicmVzb2x2ZVBvc3RDb25zdHJ1Y3QiLCAiaW5zdGFuY2UiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicG9zdENvbnN0cnVjdFJlc3VsdCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJyZXNvbHV0aW9uIiwgInRvU3RyaW5nIiwgImltcGxlbWVudGF0aW9uVHlwZSIsICJuYW1lIiwgImVycm9yIiwgImNhdXNlIiwgInJlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zIiwgInNldEluc3RhbmNlUHJvcGVydGllcyIsICJjb25zdHJ1Y3RvclZhbHVlcyIsICJub2RlIiwgInByb3BlcnRpZXNBc3NpZ25tZW50UmVzdWx0IiwgImNsYXNzTWV0YWRhdGEiLCAibGlmZWN5Y2xlIiwgInJlc29sdmVQcm92aWRlckJpbmRpbmciLCAicHJvdmlkZXIiLCAiZ2V0SW5zdGFuY2VOb2RlQmluZGluZyIsICJnZXRSZXNvbHZlZFZhbHVlTm9kZUJpbmRpbmciLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInByb3BlcnR5QXNzaWdubWVudFByb21pc2VzIiwgInByb3BlcnR5S2V5IiwgInByb3BlcnR5Tm9kZSIsICJwcm9wZXJ0eVBhcmFtcyIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJiaW5kaW5ncyIsICJwdXNoIiwgImxlbmd0aCIsICJQcm9taXNlIiwgImFsbCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicmVzb2x2ZUJpbmRpbmdOb2RlIiwgImlubmVyUmVzb2x2ZVNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgInJlc29sdmVkVmFsdWVzIiwgInJlZGlyZWN0aW9uIiwgInJlZGlyZWN0aW9ucyIsICJpc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMiLCAicmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcyIsICJjb25zdHJ1Y3RvclJlc29sdmVkVmFsdWVzIiwgImNvbnN0cnVjdG9yUGFyYW0iLCAiY29uc3RydWN0b3JQYXJhbXMiLCAidW5kZWZpbmVkIiwgInNvbWUiLCAicmVzb2x2ZVJlc29sdmVkVmFsdWVCaW5kaW5nTm9kZSIsICJyZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdQYXJhbXMiLCAicGFyYW1WYWx1ZXMiLCAicmVzb2x2ZWRQYXJhbVZhbHVlcyIsICJwYXJhbXNSZXNvbHZlZFZhbHVlcyIsICJwYXJhbSIsICJyZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgInJlc29sdmVCaW5kaW5nTm9kZSIsICJwYXJhbXMiLCAicGxhbkJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJDb25zdGFudFZhbHVlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJEeW5hbWljVmFsdWUiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAiRmFjdG9yeSIsICJyZXNvbHZlRmFjdG9yeUJpbmRpbmciLCAiSW5zdGFuY2UiLCAicmVzb2x2ZVNjb3BlZEluc3RhbmNlQmluZGluZ05vZGUiLCAiUHJvdmlkZXIiLCAicmVzb2x2ZVByb3ZpZGVyQmluZGluZyIsICJSZXNvbHZlZFZhbHVlIiwgInJlc29sdmVTY29wZWRSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUiLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgImJpbmRpbmdzIiwgIkFycmF5IiwgImlzQXJyYXkiLCAicmVzb2x2ZWRWYWx1ZXMiLCAiaXNQbGFuU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicHVzaCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAic29tZSIsICJpc1Byb21pc2UiLCAiUHJvbWlzZSIsICJhbGwiLCAibGVuZ3RoIiwgIkludmVyc2lmeUNvcmVFcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInJlc29sdXRpb24iLCAiaXNQbHVnaW4iLCAiU3ltYm9sIiwgImZvciIsICJQbHVnaW4iLCAiX2NvbnRhaW5lciIsICJfY29udGV4dCIsICJjb250YWluZXIiLCAiY29udGV4dCIsICJ0aGlzIiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvciIsICJFcnJvciIsICJraW5kIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJzdXBlciIsICJ0aGlzIiwgInZhbHVlIiwgImlzIiwgIkludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZCIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvcktpbmQiLCAiREVGQVVMVF9ERUZBVUxUX1NDT1BFIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJUcmFuc2llbnQiLCAiQ29udGFpbmVyUmVnaXN0cnkiLCAic2VydmljZU5hbWUiLCAiY29udGFpbmVyIiwgIkRJQ29udGFpbmVyRXJyb3IiLCAibGFtYmRhSWQiLCAiZGVmaW5pdGlvbiIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgImV4aXN0aW5nU2VydmljZSIsICJsYW1iZGFzIiwgInNlcnZpY2UiLCAiZXhpc3RlZCIsICJsYW1iZGFzVG9SZW1vdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgIlciLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIkNvbnRhaW5lclJlZ2lzdHJ5IiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgImxhbWJkYURlZiIsICJsYW1iZGFJZCIsICJlcnJvciIsICJoYW5kbGVyTmFtZSIsICJyZXF1aXJlZFNlcnZpY2VzIiwgInRpZUNsYXNzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfdXRpbHMiLCAiTGFtYmRhUGlwZWxpbmUiLCAiY29uZmlnIiwgImNvbnRleHQiLCAibGFtYmRhSWQiLCAiY29udGFpbmVyIiwgImhhbmRsZXIiLCAiZXJyb3IiLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiTGFtYmRhSGFuZGxlckZhY3RvcnkiLCAibGFtYmRhRGVmaW5pdGlvbiIsICJzZXJ2aWNlc19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgIl9fcmVFeHBvcnQiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3V0aWxzIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImJlZm9yZUluc3RhbmNlIiwgInNlcnZlckNvbmZpZyIsICJlbmhhbmNlbWVudHMiLCAicnVudGltZUNvcmVDb25maWciLCAiYnVpbGRDb25maWciLCAib3B0aW1pemF0aW9ucyIsICJvcHRpbWl6ZWRDb25maWciLCAiYmFzZVN0YWNrQ29uZmlnIiwgInJ1bnRpbWVTdGFja0NvbmZpZyIsICJjb25maWciLCAiZmVhdHVyZSIsICJmIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImluZGV4X2V4cG9ydHMiLCAic2VydmljZXNfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVEaSIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF91dGlscyIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgInNlcnZpY2VJZCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiUnVudGltZURpIiwgIl9fcmVFeHBvcnQiLCAiaW5kZXhfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyJdCn0K
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L3J1bnRpbWUtd2ViLWxhbWJkYS1oYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2RldGVjdG9yL21ldGFkYXRhLWNvbGxlY3RvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGV0ZWN0b3IvcnVudGltZS1kZXRlY3Rvci50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kaS90aWVzLXJlZ2lzdHJhci50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kaS9kaS1lcnJvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvcHVyZS1jb250YWluZXItZmFjdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9oYW5kbGVyLXdyYXBwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcGlwZWxpbmVzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9taWNyb3NlcnZpY2UtcmVnaXN0cmFyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbnZlcnNpZnkvbGliL2VzbS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9pc1Byb21pc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb21tb24vc3JjL3NlcnZpY2VzL2NhbGN1bGF0aW9ucy9zdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvc2VydmljZXMvbW9kZWxzL0xhenlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9idWlsZEFycmF5TWV0YWRhdGFXaXRoQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEVsZW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEluZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlBcnJheU1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlNYXBNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9nZXRPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvZ2V0UmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL3NldFJlZmxlY3RNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy91cGRhdGVPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvdXBkYXRlUmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9hY3Rpb25zL2dldEJpbmRpbmdJZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdTY29wZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9jaGFpbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2NvbW1vbi9tb2RlbHMvT25lVG9NYW55TWFwU3Rhci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVmbGVjdE1ldGFkYXRhL2RhdGEvY2xhc3NNZXRhZGF0YVJlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvZ2V0RGVmYXVsdENsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZWZsZWN0TWV0YWRhdGEvZGF0YS9wZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50UmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb3JlRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9lcnJvci9tb2RlbHMvSW52ZXJzaWZ5Q29yZUVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQmluZGluZ1NlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL3NlcnZpY2VzL0RlYWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvbW9kZWxzL0NsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2lzUGVuZGluZ0NsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdmFsaWRhdGVDb25zdHJ1Y3Rvck1ldGFkYXRhQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdGhyb3dBdEludmFsaWRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRJbnN0YW5jZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUJpbmRpbmdDYWNoZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRHluYW1pY1ZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRmFjdG9yeUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUluc3RhbmNlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lUHJvdmlkZXJCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVSZXNvbHZlZFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lU2VydmljZVJlZGlyZWN0aW9uQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9hY3Rpb25zL2RlY29yYXRlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldERlZmF1bHRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9kZWNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkQ2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9hc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0TWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlTWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQcm9wZXJ0eS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9tb2RlbHMvRGVjb3JhdG9ySW5mb0tpbmQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaGFuZGxlSW5qZWN0aW9uRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL2dldERlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL3N0cmluZ2lmeURlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YUNvbnN0cnVjdG9yQXJndW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL2NsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaXNVc2VybGFuZEVtaXR0ZWRUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVDbGFzc01ldGFkYXRhV2l0aFR5cGVzY3JpcHRQYXJhbWV0ZXJUeXBlcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL3R5cGVzY3JpcHREZXNpZ25QYXJhbWV0ZXJUeXBlc1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0UGFyYW1ldGVyVHlwZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0YWJsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvc2V0SXNJbmplY3RhYmxlRmxhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRFeHRlbmRlZENvbnN0cnVjdG9yQXJndW1lbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldEV4dGVuZGVkUHJvcGVydGllcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbUJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEZyb21IaWVyYXJjaHkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL211bHRpSW5qZWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9pbmNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkRGVmYXVsdE1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL25hbWVkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNZXRhZGF0YU5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1ldGFkYXRhT3B0aW9uYWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL29wdGlvbmFsLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9wb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQb3N0Q29uc3RydWN0b3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3ByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YVByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3RhZ2dlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWV0YWRhdGFUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0VW5tYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRVbm1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkVW5tYW5hZ2VkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3VubWFuYWdlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL2NhbGN1bGF0aW9ucy9pc1N0YWNrT3ZlcmZsb3dFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9oYW5kbGVQbGFuRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9tb2RlbHMvTGF6eVBsYW5TZXJ2aWNlTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vbW9kZWxzL1NpbmdsZUltbXV0YWJsZUxpbmtlZExpc3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvYnVpbGRQbGFuQmluZGluZ0NvbnN0cmFpbnRzTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9pc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90aHJvd0Vycm9yV2hlblVuZXhwZWN0ZWRCaW5kaW5nc0Ftb3VudEZvdW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvc3RyaW5naWZ5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9jaGVja1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZVNpbmdsZUluamVjdGlvbkJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2NoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9nZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jYWNoZU5vblJvb3RQbGFuU2VydmljZU5vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5U3VicGxhbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbU1hbmFnZWRDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaXNJbnN0YW5jZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9wbGFuLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkR2V0UGxhbk9wdGlvbnNGcm9tUGxhblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL21vZGVscy9DYWNoZUJpbmRpbmdJbnZhbGlkYXRpb25LaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL21vZGVscy9XZWFrTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvYWRkU2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlMYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5TGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL3JlbW92ZVNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9zZXJ2aWNlcy9QbGFuUmVzdWx0Q2FjaGVTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9hZGRSb290U2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvcmVtb3ZlUm9vdFNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaGFuZGxlUmVzb2x2ZUVycm9yLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL2NhY2hlUmVzb2x2ZWRWYWx1ZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ0FjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTaW5nbGV0b25TY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9nZXRTZWxmLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTY29wZWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNjb3BlZEJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlRHluYW1pY1ZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQcm92aWRlckJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlUHJvdmlkZXJCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9nZXRJbnN0YW5jZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9jYWxjdWxhdGlvbnMvZ2V0UmVzb2x2ZWRWYWx1ZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvc2V0SW5zdGFuY2VQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVSZXNvbHZlZFZhbHVlQmluZGluZ1BhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNTY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nUHJlRGVzdHJveS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ3NEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVNb2R1bGVEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3BsdWdpbi9zcmMvcGx1Z2luL21vZGVscy9QbHVnaW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9hY3Rpb25zL2dldENvbnRhaW5lck1vZHVsZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvbW9kZWxzL0NvbnRhaW5lck1vZHVsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9iaW5kaW5nL3V0aWxzL0JpbmRpbmdDb25zdHJhaW50VXRpbHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb250YWluZXJFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvZXJyb3IvbW9kZWxzL0ludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRCaW5kaW5nSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNBbnlBbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0JpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5vTmFtZU5vclRhZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb3RQYXJlbnRCaW5kaW5nQ29uc3RyYWludHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUGFyZW50QmluZGluZ0NvbnN0cmFpbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL21vZGVscy9CaW5kaW5nRmx1ZW50U3ludGF4SW1wbGVtZW50YXRpb24udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUmVzb2x2ZWRWYWx1ZU1ldGFkYXRhSW5qZWN0T3B0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNNdWx0aXBsZVJlc29sdmVkVmFsdWVNZXRhZGF0YUluamVjdE9wdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0FueUFuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vdFBhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aFRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNQYXJlbnRCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vQW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvQmluZGluZ01hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbW1vbi9jYWxjdWxhdGlvbnMvZ2V0Rmlyc3RJdGVyYWJsZVJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29tbW9uL2FjdGlvbnMvZ2V0Rmlyc3RJdGVyYXRvclJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL0NvbnRhaW5lck1vZHVsZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9EZWFjdGl2YXRpb25QYXJhbXNNYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvY2FsY3VsYXRpb25zL2J1aWxkRGVhY3RpdmF0aW9uUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvYWN0aW9ucy9yZXNldERlYWN0aXZhdGlvblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5QYXJhbXNPcGVyYXRpb25zTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5SZXN1bHRDYWNoZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9QbHVnaW5NYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvU2VydmljZVJlZmVyZW5jZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TZXJ2aWNlUmVzb2x1dGlvbk1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TbmFwc2hvdE1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9Db250YWluZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL2NvbnRhaW5lci1yZWdpc3RyeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3J1bnRpbWUtZXh0ZW5zaW9ucy9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9zZXJ2aWNlcy9ydW50aW1lLWV4dGVuc2lvbnMvcnVudGltZS1leHRlbnNpb25zLnNlcnZpY2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zL3J1bnRpbWUtZXh0ZW5zaW9ucy50eXBlcy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9idW5kbGUvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvYnVuZGxlL3J1bnRpbWUuY29udGFpbmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2J1bmRsZS9ydW50aW1lLmNvbnRhaW5lci50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BweU1vZGVUaGlzKCk7XG4gICAgICAgIHZhciBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihSZWZsZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIsIHJvb3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmdW5jdGlvblRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGluZGlyZWN0RXZhbFRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAwLCBldmFsKShcIihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pKClcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvcHB5TW9kZVRoaXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UaGlzKCkgfHwgaW5kaXJlY3RFdmFsVGhpcygpO1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyLCByb290KSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgX01hcCA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9IHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgcmVnaXN0cnlTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCA/IFN5bWJvbC5mb3IoXCJAcmVmbGVjdC1tZXRhZGF0YTpyZWdpc3RyeVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnkgPSBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhUHJvdmlkZXIgPSBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKG1ldGFkYXRhUmVnaXN0cnkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlEZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihwcm92aWRlci5PcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjMuMSBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICBwcm92aWRlci5PcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHkgfHwgeCAhPT0geCAmJiB5ICE9PSB5O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG1ldGFkYXRhIHJlZ2lzdHJ5XG4gICAgICAgIC8vIC0gQWxsb3dzIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCJgIGFuZCBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YS9uby1jb25mbGljdFwiYCB0byBpbnRlcm9wZXJhdGUuXG4gICAgICAgIC8vIC0gVXNlcyBpc29sYXRlZCBtZXRhZGF0YSBpZiBgUmVmbGVjdGAgaXMgZnJvemVuIGJlZm9yZSB0aGUgcmVnaXN0cnkgY2FuIGJlIGluc3RhbGxlZC5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSByZWdpc3RyeSB1c2VkIHRvIGFsbG93IG11bHRpcGxlIGByZWZsZWN0LW1ldGFkYXRhYCBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIGZhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgIShyZWdpc3RyeVN5bWJvbCBpbiByb290LlJlZmxlY3QpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBgcmVmbGVjdC1tZXRhZGF0YWAgdGhhdCBkaWQgbm90IHN1cHBvcnQgYSByZWdpc3RyeS5cbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocm9vdC5SZWZsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaXJzdDtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ7XG4gICAgICAgICAgICB2YXIgcmVzdDtcbiAgICAgICAgICAgIHZhciB0YXJnZXRQcm92aWRlck1hcCA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvdmlkZXI6IHJlZ2lzdGVyUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyOiBzZXRQcm92aWRlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGEgZnJvemVuIHJlZ2lzdHJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsbGJhY2sgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChmaXJzdCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3QgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChzZWNvbmQpOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWNvbmQgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0LmFkZChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmQuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3IocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXIoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoUCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBoYXNQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgPT09IHByb3ZpZGVyIHx8IHNlY29uZCA9PT0gcHJvdmlkZXIgfHwgIUlzVW5kZWZpbmVkKHJlc3QpICYmIHJlc3QuaGFzKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgcHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IGdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyICE9PSBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGV4aXN0aW5nUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNoYXJlZCByZWdpc3RyeSBvZiBtZXRhZGF0YSBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IHJvb3QuUmVmbGVjdFtyZWdpc3RyeVN5bWJvbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFSZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdC5SZWZsZWN0LCByZWdpc3RyeVN5bWJvbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YWRhdGFSZWdpc3RyeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihyZWdpc3RyeSkge1xuICAgICAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0YWRhdGEuaGFzKFApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBPcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IE9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeS5yZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkVGFyZ2V0TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUoTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBwcm92aWRlciBmb3IgdGFyZ2V0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5c1trXSA9IG5leHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhTWFwLmRlbGV0ZShNZXRhZGF0YUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyZWZsZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lTWV0YWRhdGEgPSByZWZsZWN0LmRlZmluZU1ldGFkYXRhLCBoYXNPd25NZXRhZGF0YSA9IHJlZmxlY3QuaGFzT3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGFLZXlzID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMsIGRlbGV0ZU1ldGFkYXRhID0gcmVmbGVjdC5kZWxldGVNZXRhZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU93bmVyID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBtZXRhZGF0YU93bmVyLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSAmJiBtZXRhZGF0YVByb3BlcnR5U2V0LmhhcyhQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE93bk1ldGFkYXRhS2V5cyhPLCBQKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhT3duZXIuc2V0KE8sIG1ldGFkYXRhUHJvcGVydHlTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldC5hZGQoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBkZWZpbmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBoYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBnZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogZ2V0T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IGRlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgcHJvdmlkZXIgZm9yIGFuIG9iamVjdC4gSWYgdGhlIG9iamVjdCBoYXMgbm8gbWV0YWRhdGEgcHJvdmlkZXIgYW5kIHRoaXMgaXMgZm9yIGEgY3JlYXRlIG9wZXJhdGlvbixcbiAgICAgICAgICogdGhlbiB0aGlzIG1vZHVsZSdzIG1ldGFkYXRhIHByb3ZpZGVyIGlzIGFzc2lnbmVkIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRQcm92aWRlciA9IG1ldGFkYXRhUmVnaXN0cnkuZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdGVyZWRQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YVJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIG1ldGFkYXRhUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgdmFyIE1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8oa2V5LCB0aGlzLl9jYWNoZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNhbWVWYWx1ZVplcm8odGhpcy5fY2FjaGVLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKHRoaXMuX2tleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVJbmRleCA8IDAgJiYgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBVVUlEX1NJWkUgPSAxNjtcbiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciByb290S2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5oYXModGFibGUsIHRoaXMuX2tleSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVbdGhpcy5fa2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVbmlxdWVLZXkoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBcIkBAV2Vha01hcEBAXCIgKyBDcmVhdGVVVUlEKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKEhhc2hNYXAuaGFzKGtleXMsIGtleSkpO1xuICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh0YXJnZXQsIHJvb3RLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcm9vdEtleSwgeyB2YWx1ZTogSGFzaE1hcC5jcmVhdGUoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEZpbGxSYW5kb21CeXRlcyhidWZmZXIsIHNpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gTWF0aC5yYW5kb20oKSAqIDB4ZmYgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZW5SYW5kb21CeXRlcyhzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxsUmFuZG9tQnl0ZXMoYXJyYXksIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiBcdTAwQTcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IGxvZ2dlciwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IExhbWJkYUFwaSB9IGZyb20gJ0B3b3JrdGlmL3B1cmV3cyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAYXdzLWxhbWJkYS1wb3dlcnRvb2xzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IExhbWJkYUludGVyZmFjZSB9IGZyb20gJ0Bhd3MtbGFtYmRhLXBvd2VydG9vbHMvY29tbW9ucy90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhSGFuZGxlckZhY3RvcnkgfSBmcm9tICcuL2xhbWJkYS1oYW5kbGVyLWZhY3RvcnknO1xuXG4vKipcbiAqIFJ1bnRpbWUgV2ViIExhbWJkYSBoYW5kbGVyIHRoYXQgZXh0ZW5kcyBMYW1iZGFBcGkgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBUaGlzIGNsYXNzIGJyaWRnZXMgdGhlIGdhcCBiZXR3ZWVuIHRoZSBleGlzdGluZyBQdXJlbm93IENvcmUgTGFtYmRhQXBpXG4gKiBpbmZyYXN0cnVjdHVyZSBhbmQgdGhlIG5ldyBSdW50aW1lIFdlYiBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEl0IGV4dGVuZHMgTGFtYmRhQXBpIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2hpbGUgYWRkaW5nIGF1dG9tYXRpY1xuICogREkgcmVzb2x1dGlvbiBhbmQgdXNlciBoYW5kbGVyIGludm9jYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGhhbmRsZXIgPSBuZXcgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIoZGVmaW5pdGlvbiwgY29udGFpbmVyLCBmYWN0b3J5KTtcbiAqXG4gKiAvLyBBV1MgTGFtYmRhIHJ1bnRpbWUgY2FsbHMgdGhpcyBtZXRob2RcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIGV4dGVuZHMgTGFtYmRhQXBpIGltcGxlbWVudHMgTGFtYmRhSW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VySGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBSdW50aW1lIFdlYiBMYW1iZGEgaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHBhcmFtIGZhY3RvcnkgLSBGYWN0b3J5IGluc3RhbmNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgd3JhcHBpbmdcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmaW5pdGlvbjogTGFtYmRhRGVmaW5pdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeTogTGFtYmRhSGFuZGxlckZhY3RvcnksXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcih7XG4gICAgICBzZXJ2aWNlTmFtZTogJ0Bjb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInLFxuICAgICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgICAgbGFtYmRhSWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICAgIHNlcnZpY2U6IGRlZmluaXRpb24uc2VydmljZSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBQcmUtcmVzb2x2ZSB0aGUgdXNlciBoYW5kbGVyIHdpdGggZGVwZW5kZW5jaWVzXG4gICAgdGhpcy51c2VySGFuZGxlciA9IHRoaXMuY3JlYXRlVXNlckhhbmRsZXIoKTtcblxuICAgIHRoaXMubG9nZ2VyLmluZm8oJ1J1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIGluaXRpYWxpemVkJywge1xuICAgICAgbGFtYmRhSWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICBzZXJ2aWNlOiBkZWZpbml0aW9uLnNlcnZpY2UsXG4gICAgICBkZXBlbmRlbmN5Q291bnQ6IGRlZmluaXRpb24udGllcy5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBMYW1iZGEgaGFuZGxlciBtZXRob2QgY2FsbGVkIGJ5IEFXUyBMYW1iZGEgcnVudGltZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBBV1MgTGFtYmRhIHJ1bnRpbWUgZm9yIGVhY2ggaW52b2NhdGlvbi5cbiAgICogSXQgaW5qZWN0cyBkZXBlbmRlbmNpZXMsIGNhbGxzIHRoZSB1c2VyJ3MgaGFuZGxlciBmdW5jdGlvbiwgYW5kIHJldHVybnNcbiAgICogdGhlIHJlc3VsdC4gRXh0ZW5kcyB0aGUgZXhpc3RpbmcgTGFtYmRhQXBpLmhhbmRsZXIoKSBtZXRob2QgdG8gYWRkXG4gICAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN1cHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCAtIExhbWJkYSBldmVudCBvYmplY3RcbiAgICogQHBhcmFtIGNvbnRleHQgLSBMYW1iZGEgY29udGV4dCBvYmplY3RcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGhhbmRsZXIgcmVzdWx0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQVdTIExhbWJkYSBydW50aW1lIGNhbGxzIHRoaXMgYXV0b21hdGljYWxseVxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZXIoYXBpR2F0ZXdheUV2ZW50LCBsYW1iZGFDb250ZXh0KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBoYW5kbGVyKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdIYW5kbGVyIGludm9jYXRpb24gc3RhcnRlZCcsIHtcbiAgICAgICAgZXZlbnRUeXBlOiB0eXBlb2YgZXZlbnQsXG4gICAgICAgIGNvbnRleHRUeXBlOiB0eXBlb2YgY29udGV4dCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDYWxsIHRoZSBwcmUtcmVzb2x2ZWQgdXNlciBoYW5kbGVyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnVzZXJIYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0hhbmRsZXIgaW52b2NhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICByZXN1bHRUeXBlOiB0eXBlb2YgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0hhbmRsZXIgaW52b2NhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmUtdGhyb3cgdG8gbWFpbnRhaW4gTGFtYmRhIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSB1c2VyIGhhbmRsZXIgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgd3JhcHBpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXNcbiAgICogYW5kIGNyZWF0ZSB0aGUgd3JhcHBlZCB1c2VyIGhhbmRsZXIuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGZvciByZXVzZVxuICAgKiBhY3Jvc3MgTGFtYmRhIGludm9jYXRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIERJIHJlc29sdXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFdyYXBwZWQgdXNlciBoYW5kbGVyIHdpdGggZGVwZW5kZW5jaWVzIGluamVjdGVkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVVzZXJIYW5kbGVyKCk6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEluamVjdCBkZXBlbmRlbmNpZXMgdXNpbmcgdGhlIGZhY3RvcnlcbiAgICAgIGNvbnN0IGRlcHMgPSB0aGlzLmZhY3RvcnkuaW5qZWN0RGVwZW5kZW5jaWVzKHRoaXMuZGVmaW5pdGlvbi50aWVzLCB0aGlzLmNvbnRhaW5lcik7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdEZXBlbmRlbmNpZXMgcmVzb2x2ZWQgZm9yIHVzZXIgaGFuZGxlcicsIHtcbiAgICAgICAgZGVwZW5kZW5jeUtleXM6IE9iamVjdC5rZXlzKGRlcHMpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgdXNlciBoYW5kbGVyIGZyb20gdGhlIGRlZmluaXRpb25cbiAgICAgIGNvbnN0IHJhd1VzZXJIYW5kbGVyID0gdGhpcy5kZWZpbml0aW9uLmhhbmRsZXIoZGVwcyk7XG5cbiAgICAgIC8vIFdyYXAgdGhlIGhhbmRsZXIgd2l0aCBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZ1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSB0aGlzLmZhY3Rvcnkud3JhcEhhbmRsZXIocmF3VXNlckhhbmRsZXIsIHtcbiAgICAgICAgaWQ6IHRoaXMuZGVmaW5pdGlvbi5pZCB8fCAndW5rbm93bicsXG4gICAgICAgIHNlcnZpY2U6IHRoaXMuZGVmaW5pdGlvbi5zZXJ2aWNlIHx8ICd1bmtub3duJyxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdVc2VyIGhhbmRsZXIgY3JlYXRlZCBhbmQgd3JhcHBlZCBzdWNjZXNzZnVsbHknKTtcblxuICAgICAgcmV0dXJuIHdyYXBwZWRIYW5kbGVyO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHVzZXIgaGFuZGxlcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHVzZXIgaGFuZGxlciBmb3IgTGFtYmRhICcke3RoaXMuZGVmaW5pdGlvbi5pZH0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTGFtYmRhIGRlZmluaXRpb24gdXNlZCBieSB0aGlzIGhhbmRsZXIuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgTGFtYmRhIGRlZmluaXRpb24gZm9yIGRlYnVnZ2luZ1xuICAgKiBvciBpbnRyb3NwZWN0aW9uIHB1cnBvc2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgTGFtYmRhIGRlZmluaXRpb25cbiAgICovXG4gIGdldERlZmluaXRpb24oKTogTGFtYmRhRGVmaW5pdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuZGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFB1cmVDb250YWluZXIgdXNlZCBieSB0aGlzIGhhbmRsZXIuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgREkgY29udGFpbmVyIGZvciBkZWJ1Z2dpbmcgb3IgYWR2YW5jZWRcbiAgICogdXNlIGNhc2VzLiBHZW5lcmFsbHkgbm90IG5lZWRlZCBpbiBub3JtYWwgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgUHVyZUNvbnRhaW5lciBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0Q29udGFpbmVyKCk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBoYW5kbGVyIGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB1c2VyIGhhbmRsZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHlcbiAgICogYW5kIGlzIHJlYWR5IGZvciBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGhhbmRsZXIgaXMgcmVhZHksIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2VySGFuZGxlciAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vLyBSZS1leHBvcnQgYmFzZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZnJvbSBQdXJlbm93XG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93L2xhbWJkYSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXdlYiBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtd2ViJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgc2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBidW5kbGVcbmV4cG9ydCAqIGZyb20gJy4vYnVuZGxlJztcblxuLy8gQG5vdGU6IHJ1bnRpbWUtd2ViIGlzIE5PVCBleHBvcnRlZCBmcm9tIExhbWJkYSBidW5kbGUgKGNvbnRhaW5zIENESyBjb25zdHJ1Y3RzKVxuLy8gSXQncyBvbmx5IHVzZWQgZm9yIGJ1aWxkLXRpbWUgQ0RLIHN5bnRoZXNpcywgbm90IExhbWJkYSBydW50aW1lXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5leHBvcnQgKiBmcm9tICcuL2RldGVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZGknO1xuZXhwb3J0ICogZnJvbSAnLi9mYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmVzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVnaXN0cmFyJztcblxuXG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJyb3dzZXJNZXRhZGF0YSwgQ0RLTWV0YWRhdGEsIExhbWJkYU1ldGFkYXRhIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5cbi8qKlxuICogQ29sbGVjdCBicm93c2VyIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQgaW5jbHVkaW5nXG4gKiB1c2VyIGFnZW50LCBjdXJyZW50IFVSTCwgYW5kIHZpZXdwb3J0IGRpbWVuc2lvbnMuIFRoaXMgbWV0YWRhdGEgaXNcbiAqIHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgYW5hbHl0aWNzIHB1cnBvc2VzLlxuICpcbiAqIEByZXR1cm5zIEJyb3dzZXIgbWV0YWRhdGEgb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIGJyb3dzZXIgQVBJcyBhcmUgbm90IGF2YWlsYWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhZGF0YSA9IGdldEJyb3dzZXJNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYFVzZXIgaXMgb24gJHttZXRhZGF0YS51cmx9IHdpdGggJHttZXRhZGF0YS52aWV3cG9ydC53aWR0aH14JHttZXRhZGF0YS52aWV3cG9ydC5oZWlnaHR9IHZpZXdwb3J0YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJyb3dzZXJNZXRhZGF0YSgpOiBCcm93c2VyTWV0YWRhdGEge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCcm93c2VyIEFQSXMgbm90IGF2YWlsYWJsZSAtIHdpbmRvdyBvciBuYXZpZ2F0b3IgaXMgdW5kZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICB2aWV3cG9ydDoge1xuICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgfSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgYnJvd3NlciBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgTGFtYmRhIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIEFXUyBMYW1iZGEgcnVudGltZSBlbnZpcm9ubWVudFxuICogaW5jbHVkaW5nIGZ1bmN0aW9uIGRldGFpbHMsIHJlZ2lvbiwgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGFuZCByZXF1ZXN0IGNvbnRleHQuXG4gKiBVc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUuXG4gKlxuICogQHJldHVybnMgTGFtYmRhIG1ldGFkYXRhIG9iamVjdFxuICogQHRocm93cyBFcnJvciBpZiByZXF1aXJlZCBMYW1iZGEgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBtaXNzaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0TGFtYmRhTWV0YWRhdGEoKTtcbiAqIGNvbnNvbGUubG9nKGBMYW1iZGEgJHttZXRhZGF0YS5mdW5jdGlvbk5hbWV9IGluICR7bWV0YWRhdGEucmVnaW9ufSB3aXRoICR7bWV0YWRhdGEubWVtb3J5TGltaXR9TUJgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhTWV0YWRhdGEoKTogTGFtYmRhTWV0YWRhdGEge1xuICB0cnkge1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcbiAgICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZW1vcnlTaXplID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9NRU1PUllfU0laRSB8fCAnMTI4JywgMTApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgIHZlcnNpb246IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fVkVSU0lPTiB8fCAnJExBVEVTVCcsXG4gICAgICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX0RFRkFVTFRfUkVHSU9OIHx8ICd1cy1lYXN0LTEnLFxuICAgICAgbWVtb3J5TGltaXQ6IGlzTmFOKG1lbW9yeVNpemUpID8gMTI4IDogbWVtb3J5U2l6ZSxcbiAgICAgIHJlcXVlc3RJZDogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9MT0dfU1RSRUFNX05BTUUsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb2xsZWN0IExhbWJkYSBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgQ0RLIGVudmlyb25tZW50IG1ldGFkYXRhLlxuICpcbiAqIEV4dHJhY3RzIHJlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlIENESyBlbnZpcm9ubWVudCBpbmNsdWRpbmdcbiAqIEFXUyBhY2NvdW50LCByZWdpb24sIENESyB2ZXJzaW9uLCBhbmQgTm9kZS5qcyB2ZXJzaW9uLiBUaGlzIG1ldGFkYXRhXG4gKiBpcyB1c2VkIGZvciBkZXBsb3ltZW50IGNvbnRleHQgYW5kIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmV0dXJucyBDREsgbWV0YWRhdGEgb2JqZWN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0Q0RLTWV0YWRhdGEoKTtcbiAqIGNvbnNvbGUubG9nKGBEZXBsb3lpbmcgdG8gYWNjb3VudCAke21ldGFkYXRhLmFjY291bnR9IGluICR7bWV0YWRhdGEucmVnaW9ufWApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDREtNZXRhZGF0YSgpOiBDREtNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnQ6IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgJ3Vua25vd24nLFxuICAgICAgcmVnaW9uOiBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04gfHwgJ3VzLWVhc3QtMScsXG4gICAgICBjZGtWZXJzaW9uOiBwcm9jZXNzLmVudi5DREtfVkVSU0lPTixcbiAgICAgIG5vZGVWZXJzaW9uOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjb2xsZWN0IENESyBtZXRhZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbnZpcm9ubWVudENvbnRleHQgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IGdldEJyb3dzZXJNZXRhZGF0YSwgZ2V0Q0RLTWV0YWRhdGEsIGdldExhbWJkYU1ldGFkYXRhIH0gZnJvbSAnLi9tZXRhZGF0YS1jb2xsZWN0b3JzJztcblxuLyoqXG4gKiBSdW50aW1lIGVudmlyb25tZW50IGRldGVjdG9yIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgZGV0ZWN0cyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IChicm93c2VyLCBMYW1iZGEsIG9yIENESylcbiAqIGFuZCBwcm92aWRlcyBhcHByb3ByaWF0ZSBtZXRhZGF0YSBmb3IgZWFjaCBjb250ZXh0LiBUaGlzIGVuYWJsZXMgdGhlXG4gKiB1bmlmaWVkIHB1cmVub3coKSBlbnRyeSBwb2ludCB0byByb3V0ZSBleGVjdXRpb24gdG8gdGhlIGNvcnJlY3QgcGlwZWxpbmUuXG4gKlxuICogKipEZXRlY3Rpb24gUHJpb3JpdHkqKjpcbiAqIDEuIEJyb3dzZXI6IENoZWNrIGZvciBgd2luZG93YCBvYmplY3RcbiAqIDIuIExhbWJkYTogQ2hlY2sgZm9yIGBBV1NfTEFNQkRBX0ZVTkNUSU9OX05BTUVgIGVudmlyb25tZW50IHZhcmlhYmxlXG4gKiAzLiBDREs6IENoZWNrIGZvciBleHBsaWNpdCBtb2RlLCBDREsgZW52IHZhcnMsIG9yIHByb2Nlc3MgYXJndW1lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRldGVjdG9yID0gbmV3IFJ1bnRpbWVEZXRlY3RvcigpO1xuICogY29uc3QgY29udGV4dCA9IGRldGVjdG9yLmRldGVjdCgpO1xuICpcbiAqIHN3aXRjaCAoY29udGV4dC50eXBlKSB7XG4gKiAgIGNhc2UgJ2Jyb3dzZXInOlxuICogICAgIC8vIEV4ZWN1dGUgYnJvd3NlciBwaXBlbGluZVxuICogICAgIGJyZWFrO1xuICogICBjYXNlICdsYW1iZGEnOlxuICogICAgIC8vIEV4ZWN1dGUgTGFtYmRhIHBpcGVsaW5lXG4gKiAgICAgYnJlYWs7XG4gKiAgIGNhc2UgJ2Nkayc6XG4gKiAgICAgLy8gRXhlY3V0ZSBDREsgcGlwZWxpbmVcbiAqICAgICBicmVhaztcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZURldGVjdG9yIHtcbiAgLyoqXG4gICAqIERldGVjdCB0aGUgY3VycmVudCBydW50aW1lIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBVc2VzIGEgc2VyaWVzIG9mIGNoZWNrcyB0byBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiBjb250ZXh0OlxuICAgKiAtIEJyb3dzZXI6IFByZXNlbmNlIG9mIGB3aW5kb3dgIG9iamVjdFxuICAgKiAtIExhbWJkYTogQVdTIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogLSBDREs6IEV4cGxpY2l0IG1vZGUgb3IgQ0RLLXNwZWNpZmljIGluZGljYXRvcnNcbiAgICpcbiAgICogQHJldHVybnMgRW52aXJvbm1lbnQgY29udGV4dCB3aXRoIHR5cGUgYW5kIG1ldGFkYXRhXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgZW52aXJvbm1lbnQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIGRldGVjdCgpOiBFbnZpcm9ubWVudENvbnRleHQge1xuICAgIGlmICh0aGlzLmlzQnJvd3NlcigpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnYnJvd3NlcicsXG4gICAgICAgIG1ldGFkYXRhOiBnZXRCcm93c2VyTWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNMYW1iZGEoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2xhbWJkYScsXG4gICAgICAgIG1ldGFkYXRhOiBnZXRMYW1iZGFNZXRhZGF0YSgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0NESygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnY2RrJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldENES01ldGFkYXRhKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdVbmFibGUgdG8gZGV0ZWN0IHJ1bnRpbWUgZW52aXJvbm1lbnQuICcgK1xuICAgICAgJ0V4cGVjdGVkIGJyb3dzZXIgKHdpbmRvdyBvYmplY3QpLCBMYW1iZGEgKEFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSksICcgK1xuICAgICAgJ29yIENESyAoUFVSRU5PV19NT0RFPWNkayBvciBDREsgZW52aXJvbm1lbnQgdmFyaWFibGVzKS4nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcnVubmluZyBpbiBicm93c2VyIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGB3aW5kb3dgIG9iamVjdCBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIEFXUyBMYW1iZGEgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgQVdTIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwcmVzZW50XG4gICAqL1xuICBwcml2YXRlIGlzTGFtYmRhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIENESyBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogVXNlcyBtdWx0aXBsZSBkZXRlY3Rpb24gbWV0aG9kcyBpbiBwcmlvcml0eSBvcmRlcjpcbiAgICogMS4gRXhwbGljaXQgbW9kZTogUFVSRU5PV19NT0RFPWNkayAocmVjb21tZW5kZWQpXG4gICAqIDIuIENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IENES19ERUZBVUxUX0FDQ09VTlQgb3IgQ0RLX0RFRkFVTFRfUkVHSU9OXG4gICAqIDMuIFByb2Nlc3MgYXJndW1lbnRzOiBjb250YWlucyAnY2RrJyBvciAnc3ludGgnXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgQ0RLIGVudmlyb25tZW50IGlzIGRldGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGlzQ0RLKCk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yaXR5IDE6IEV4cGxpY2l0IG1vZGUgKHJlY29tbWVuZGVkKVxuICAgIGlmIChwcm9jZXNzLmVudi5QVVJFTk9XX01PREUgPT09ICdjZGsnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQcmlvcml0eSAyOiBDREsgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgaWYgKHByb2Nlc3MuZW52LkNES19ERUZBVUxUX0FDQ09VTlQgfHwgcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfUkVHSU9OKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBQcmlvcml0eSAzOiBQcm9jZXNzIGFyZ3VtZW50c1xuICAgIHJldHVybiBwcm9jZXNzLmFyZ3Yuc29tZShhcmcgPT5cbiAgICAgIGFyZy5pbmNsdWRlcygnY2RrJykgfHwgYXJnLmluY2x1ZGVzKCdzeW50aCcpLFxuICAgICk7XG4gIH1cblxuXG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBwdXJhYmxlLCBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBUaWVzSW5zdGFuY2UgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IFRpZXNSZWdpc3RyYXRpb25FcnJvciB9IGZyb20gJy4vZGktZXJyb3JzJztcblxuLyoqXG4gKiBUaWVzIHJlZ2lzdHJhdGlvbiBoZWxwZXIgZm9yIFB1cmVDb250YWluZXIgaW50ZWdyYXRpb24uXG4gKlxuICogUHJvY2Vzc2VzIFRpZXMgY2xhc3NlcyBhbmQgcmVnaXN0ZXJzIHRoZWlyIHNlcnZpY2VzIHdpdGggYSBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICogRWFjaCBUaWVzIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgcmVnaXN0ZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pIG1ldGhvZFxuICogdGhhdCB1c2VzIGNvbnRhaW5lci50aWUoKSwgY29udGFpbmVyLnRpZUNvbnN0KCksIG9yIGNvbnRhaW5lci50aWVTaW5nbGV0b24oKSB0b1xuICogcmVnaXN0ZXIgc2VydmljZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBUaWVzUmVnaXN0cmFyKCk7XG4gKiBjb25zdCBjb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KHsgZGVmYXVsdFNjb3BlOiAnU2luZ2xldG9uJyB9KTtcbiAqXG4gKiByZWdpc3RyYXIucmVnaXN0ZXJUaWVzKGNvbnRhaW5lciwgW1BheW1lbnRzVGllcywgQmlsbGluZ1RpZXNdKTtcbiAqXG4gKiAvLyBOb3cgY29udGFpbmVyIGhhcyBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSB0aGUgVGllcyBjbGFzc2VzXG4gKiBjb25zdCBwYXltZW50c1NlcnZpY2UgPSBjb250YWluZXIucnVuKCdQYXltZW50c1NlcnZpY2UnKTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgVGllc1JlZ2lzdHJhciB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbGwgVGllcyBjbGFzc2VzIHdpdGggdGhlIHByb3ZpZGVkIGNvbnRhaW5lci5cbiAgICpcbiAgICogQ2FsbHMgdGhlIHJlZ2lzdGVyKGNvbnRhaW5lcikgbWV0aG9kIG9uIGVhY2ggVGllcyBjbGFzcyBpbnN0YW5jZS5cbiAgICogVGhlIFRpZXMgY2xhc3NlcyBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgY29udGFpbmVyLnRpZSgpLFxuICAgKiBjb250YWluZXIudGllQ29uc3QoKSwgb3IgY29udGFpbmVyLnRpZVNpbmdsZXRvbigpIHRvIHJlZ2lzdGVyIHRoZWlyIHNlcnZpY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSB0byByZWdpc3RlciBzZXJ2aWNlcyB3aXRoXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzXG4gICAqIEB0aHJvd3MgVGllc1JlZ2lzdHJhdGlvbkVycm9yIGlmIGEgVGllcyBjbGFzcyBkb2Vzbid0IGltcGxlbWVudCByZWdpc3RlcigpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVGllcyBjbGFzcyBleGFtcGxlXG4gICAqIGNsYXNzIFBheW1lbnRzVGllcyB7XG4gICAqICAgcmVnaXN0ZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pOiB2b2lkIHtcbiAgICogICAgIGNvbnRhaW5lci50aWVTaW5nbGV0b24oe1xuICAgKiAgICAgICBQYXltZW50c1NlcnZpY2U6IHtcbiAgICogICAgICAgICBpbnN0YW5jZTogUGF5bWVudHNTZXJ2aWNlLFxuICAgKiAgICAgICAgIGFyZ3M6IFtdXG4gICAqICAgICAgIH1cbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiByZWdpc3RyYXIucmVnaXN0ZXJUaWVzKGNvbnRhaW5lciwgW1BheW1lbnRzVGllc10pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyVGllcyhjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBUaWVzQ2xhc3Mgb2YgdGllc0NsYXNzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRpZXNJbnN0YW5jZSA9IG5ldyBUaWVzQ2xhc3MoKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgVGllcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByZWdpc3RlciBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiB0aWVzSW5zdGFuY2UucmVnaXN0ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGllc1JlZ2lzdHJhdGlvbkVycm9yKFxuICAgICAgICAgICAgVGllc0NsYXNzLm5hbWUsXG4gICAgICAgICAgICAnVGllcyBjbGFzcyBtdXN0IGltcGxlbWVudCByZWdpc3Rlcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPikgbWV0aG9kJyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FsbCB0aGUgcmVnaXN0ZXIgbWV0aG9kIHRvIGxldCB0aGUgVGllcyBjbGFzcyByZWdpc3RlciBpdHMgc2VydmljZXNcbiAgICAgICAgdGllc0luc3RhbmNlLnJlZ2lzdGVyKGNvbnRhaW5lcik7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRpZXNSZWdpc3RyYXRpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFRpZXNSZWdpc3RyYXRpb25FcnJvcihcbiAgICAgICAgICBUaWVzQ2xhc3MubmFtZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGluc3RhbnRpYXRlIG9yIHJlZ2lzdGVyIFRpZXMgY2xhc3M6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIGFyZSByZWdpc3RlcmVkIGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgZWFjaCBzZXJ2aWNlIG5hbWUgdG8gZW5zdXJlIGl0J3MgcHJvcGVybHkgcmVnaXN0ZXJlZC5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNhdGNoaW5nIG1pc3Npbmcgc2VydmljZSByZWdpc3RyYXRpb25zIGVhcmx5LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gcmVxdWlyZWRTZXJ2aWNlcyAtIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBtdXN0IGJlIHJlZ2lzdGVyZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhbnkgcmVxdWlyZWQgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdHJhci52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIFsnUGF5bWVudHNTZXJ2aWNlJywgJ0JpbGxpbmdTZXJ2aWNlJ10pO1xuICAgKiBgYGBcbiAgICovXG4gIHZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCByZXF1aXJlZFNlcnZpY2VzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VydmljZU5hbWUgb2YgcmVxdWlyZWRTZXJ2aWNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzZXJ2aWNlICh0aGlzIHdpbGwgdGhyb3cgaWYgbm90IHJlZ2lzdGVyZWQpXG4gICAgICAgIGNvbnRhaW5lci5ydW4oc2VydmljZU5hbWUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbWlzc2luZ1NlcnZpY2VzLnB1c2goc2VydmljZU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVxdWlyZWQgc2VydmljZXMgYXJlIG5vdCByZWdpc3RlcmVkIGluIGNvbnRhaW5lcjogJHttaXNzaW5nU2VydmljZXMuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBzZXJ2aWNlIG5hbWVzIGZyb20gVGllcyBjbGFzc2VzIGZvciB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lXG4gICAqIHdoaWNoIHNlcnZpY2VzIHNob3VsZCBiZSByZWdpc3RlcmVkIGJ5IGEgc2V0IG9mIFRpZXMgY2xhc3Nlcy5cbiAgICogTm90ZTogVGhpcyByZXF1aXJlcyB0aGUgVGllcyBjbGFzc2VzIHRvIGV4cG9zZSB0aGVpciBzZXJ2aWNlIG5hbWVzLFxuICAgKiB3aGljaCBpcyBvcHRpb25hbCBidXQgcmVjb21tZW5kZWQgZm9yIGJldHRlciBlcnJvciByZXBvcnRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGV4cGVjdGVkU2VydmljZXMgPSByZWdpc3RyYXIuZXh0cmFjdFNlcnZpY2VOYW1lcyhbUGF5bWVudHNUaWVzXSk7XG4gICAqIHJlZ2lzdHJhci52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIGV4cGVjdGVkU2VydmljZXMpO1xuICAgKiBgYGBcbiAgICovXG4gIGV4dHJhY3RTZXJ2aWNlTmFtZXModGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgVGllc0NsYXNzIG9mIHRpZXNDbGFzc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0aWVzSW5zdGFuY2UgPSBuZXcgVGllc0NsYXNzKCkgYXMgYW55O1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBUaWVzIGNsYXNzIGV4cG9zZXMgaXRzIHNlcnZpY2UgbmFtZXNcbiAgICAgICAgaWYgKHR5cGVvZiB0aWVzSW5zdGFuY2UuZ2V0U2VydmljZU5hbWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY29uc3QgbmFtZXMgPSB0aWVzSW5zdGFuY2UuZ2V0U2VydmljZU5hbWVzKCk7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXMpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlTmFtZXMucHVzaCguLi5uYW1lcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZ25vcmUgZXJyb3JzIGR1cmluZyBzZXJ2aWNlIG5hbWUgZXh0cmFjdGlvblxuICAgICAgICAvLyBUaGlzIGlzIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VydmljZU5hbWVzO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgREkgY29udGFpbmVyIG9wZXJhdGlvbiBmYWlscy5cbiAqXG4gKiBVc2VkIGZvciBjb250YWluZXIgY3JlYXRpb24sIHNlcnZpY2UgcmVzb2x1dGlvbiwgYW5kIHZhbGlkYXRpb24gZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgRElDb250YWluZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBESSBjb250YWluZXIgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJOYW1lIC0gTmFtZSBvciBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXJcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBEZXRhaWxlZCBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb250YWluZXJOYW1lOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGBESSBDb250YWluZXIgJyR7Y29udGFpbmVyTmFtZX0nOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0RJQ29udGFpbmVyRXJyb3InO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gVGllcyBjbGFzcyByZWdpc3RyYXRpb24gZmFpbHMuXG4gKlxuICogVXNlZCB3aGVuIGEgVGllcyBjbGFzcyBkb2Vzbid0IGltcGxlbWVudCB0aGUgcmVxdWlyZWQgcmVnaXN0ZXIoKSBtZXRob2RcbiAqIG9yIHdoZW4gcmVnaXN0cmF0aW9uIGZhaWxzIGZvciBvdGhlciByZWFzb25zLlxuICovXG5leHBvcnQgY2xhc3MgVGllc1JlZ2lzdHJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFRpZXMgcmVnaXN0cmF0aW9uIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzTmFtZSAtIE5hbWUgb2YgdGhlIFRpZXMgY2xhc3MgdGhhdCBmYWlsZWRcbiAgICogQHBhcmFtIHJlYXNvbiAtIFJlYXNvbiBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBmYWlsdXJlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0aWVzQ2xhc3NOYW1lOiBzdHJpbmcsIHJlYXNvbjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFRpZXMgcmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgJyR7dGllc0NsYXNzTmFtZX0nOiAke3JlYXNvbn1gKTtcbiAgICB0aGlzLm5hbWUgPSAnVGllc1JlZ2lzdHJhdGlvbkVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgcmVxdWlyZWQgc2VydmljZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byByZXNvbHZlIGEgc2VydmljZSB0aGF0IGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNzaW5nU2VydmljZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG1pc3Npbmcgc2VydmljZSBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWlzc2luZyBzZXJ2aWNlXG4gICAqIEBwYXJhbSBjb250YWluZXJOYW1lIC0gTmFtZSBvciBpZGVudGlmaWVyIG9mIHRoZSBjb250YWluZXJcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbnRhaW5lck5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgbm90IGZvdW5kIGluIGNvbnRhaW5lciAnJHtjb250YWluZXJOYW1lfSdgKTtcbiAgICB0aGlzLm5hbWUgPSAnTWlzc2luZ1NlcnZpY2VFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFRpZXNJbnN0YW5jZSB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgVGllc1JlZ2lzdHJhciB9IGZyb20gJy4vdGllcy1yZWdpc3RyYXInO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciB9IGZyb20gJy4vZGktZXJyb3JzJztcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBhbmQgY29uZmlndXJpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgZm9yIG1pY3Jvc2VydmljZXMuXG4gKlxuICogQ3JlYXRlcyBQdXJlQ29udGFpbmVyPHN0cmluZz4gaW5zdGFuY2VzIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQgYW5kXG4gKiByZWdpc3RlcnMgYWxsIHNlcnZpY2VzIGZyb20gdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy4gVGhpcyBwcm92aWRlcyBhXG4gKiBjb25zaXN0ZW50IHdheSB0byBidWlsZCBESSBjb250YWluZXJzIGZvciBtaWNyb3NlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmYWN0b3J5ID0gbmV3IFB1cmVDb250YWluZXJGYWN0b3J5KCk7XG4gKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10pO1xuICpcbiAqIC8vIENvbnRhaW5lciBub3cgaGFzIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoZSBUaWVzIGNsYXNzZXNcbiAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBQdXJlQ29udGFpbmVyRmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGllc1JlZ2lzdHJhcjogVGllc1JlZ2lzdHJhcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIgPSBuZXcgVGllc1JlZ2lzdHJhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFB1cmVDb250YWluZXIgZm9yIGEgbWljcm9zZXJ2aWNlIHdpdGggcmVnaXN0ZXJlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQsXG4gICAqIHRoZW4gcmVnaXN0ZXJzIGFsbCBzZXJ2aWNlcyBmcm9tIHRoZSBwcm92aWRlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzIHRvIHJlZ2lzdGVyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyZWQgUHVyZUNvbnRhaW5lciB3aXRoIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBjb250YWluZXIgY3JlYXRpb24gb3IgcmVnaXN0cmF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIoW1xuICAgKiAgIFBheW1lbnRzVGllcyxcbiAgICogICBCaWxsaW5nVGllcyxcbiAgICogICBDb25maWdUaWVzXG4gICAqIF0pO1xuICAgKlxuICAgKiAvLyBVc2UgdGhlIGNvbnRhaW5lciB0byByZXNvbHZlIHNlcnZpY2VzXG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBjb25zdCBjb25maWcgPSBjb250YWluZXIucnVuQ29uc3RhbnQoJ1BheW1lbnRzQ29uZmlnJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBQdXJlQ29udGFpbmVyIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHRcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oe1xuICAgICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFsbCBUaWVzIGNsYXNzZXNcbiAgICAgIHRoaXMudGllc1JlZ2lzdHJhci5yZWdpc3RlclRpZXMoY29udGFpbmVyLCB0aWVzQ2xhc3Nlcyk7XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdtaWNyb3NlcnZpY2UnLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBtaWNyb3NlcnZpY2UgY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUHVyZUNvbnRhaW5lciB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBBbGxvd3MgY3JlYXRpbmcgY29udGFpbmVycyB3aXRoIGN1c3RvbSBzY29wZSBzZXR0aW5ncyBvciBvdGhlciBvcHRpb25zLlxuICAgKiBTdGlsbCByZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnMgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQdXJlQ29udGFpbmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDb25maWd1cmVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIG9yIHJlZ2lzdHJhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgKiAgIFtQYXltZW50c1RpZXNdLFxuICAgKiAgIHsgZGVmYXVsdFNjb3BlOiAnVHJhbnNpZW50JyB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgIHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSxcbiAgICBvcHRpb25zOiB7IGRlZmF1bHRTY29wZT86ICdTaW5nbGV0b24nIHwgJ1RyYW5zaWVudCcgfSA9IHt9LFxuICApOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KG9wdGlvbnMpO1xuICAgICAgdGhpcy50aWVzUmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIHRpZXNDbGFzc2VzKTtcbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdjdXN0b20nLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBjdXN0b20gY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIGNvbnRhaW5lciBoYXMgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byBUaWVzUmVnaXN0cmFyLnZhbGlkYXRlQ29udGFpbmVyKCkuXG4gICAqIFVzZWZ1bCBmb3IgZW5zdXJpbmcgY29udGFpbmVyIGludGVncml0eSBhZnRlciBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHJlcXVpcmVkU2VydmljZXMgLSBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHJlcXVpcmVkIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzXSk7XG4gICAqIGZhY3RvcnkudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBbJ1BheW1lbnRzU2VydmljZScsICdQYXltZW50c0NvbmZpZyddKTtcbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgcmVxdWlyZWRTZXJ2aWNlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCByZXF1aXJlZFNlcnZpY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250YWluZXIgYW5kIHZhbGlkYXRlIGl0IGhhcyBhbGwgZXhwZWN0ZWQgc2VydmljZXMuXG4gICAqXG4gICAqIENvbWJpbmVzIGNvbnRhaW5lciBjcmVhdGlvbiB3aXRoIHZhbGlkYXRpb24gaW4gYSBzaW5nbGUgc3RlcC5cbiAgICogQXV0b21hdGljYWxseSBleHRyYWN0cyBleHBlY3RlZCBzZXJ2aWNlIG5hbWVzIGZyb20gVGllcyBjbGFzc2VzIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9ycyB0byByZWdpc3RlclxuICAgKiBAcGFyYW0gYWRkaXRpb25hbFNlcnZpY2VzIC0gQWRkaXRpb25hbCBzZXJ2aWNlIG5hbWVzIHRvIHZhbGlkYXRlIChvcHRpb25hbClcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlVmFsaWRhdGVkQ29udGFpbmVyKFtQYXltZW50c1RpZXNdKTtcbiAgICogLy8gQ29udGFpbmVyIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSBQYXltZW50c1RpZXNcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVWYWxpZGF0ZWRDb250YWluZXIoXG4gICAgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdLFxuICAgIGFkZGl0aW9uYWxTZXJ2aWNlczogc3RyaW5nW10gPSBbXSxcbiAgKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcih0aWVzQ2xhc3Nlcyk7XG5cbiAgICAvLyBFeHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSBUaWVzIGNsYXNzZXMgaWYgcG9zc2libGVcbiAgICBjb25zdCBleHBlY3RlZFNlcnZpY2VzID0gdGhpcy50aWVzUmVnaXN0cmFyLmV4dHJhY3RTZXJ2aWNlTmFtZXModGllc0NsYXNzZXMpO1xuICAgIGNvbnN0IGFsbFJlcXVpcmVkU2VydmljZXMgPSBbLi4uZXhwZWN0ZWRTZXJ2aWNlcywgLi4uYWRkaXRpb25hbFNlcnZpY2VzXTtcblxuICAgIGlmIChhbGxSZXF1aXJlZFNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBhbGxSZXF1aXJlZFNlcnZpY2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIsIHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAYXdzLWxhbWJkYS1wb3dlcnRvb2xzL2xvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IGZ1bGxXcmFwcGVyIH0gZnJvbSAnLi9oYW5kbGVyLXdyYXBwZXJzJztcbi8vIEZvcndhcmQgZGVjbGFyYXRpb24gdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0XG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIH0gZnJvbSAnLi9ydW50aW1lLXdlYi1sYW1iZGEtaGFuZGxlcic7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgTGFtYmRhIGhhbmRsZXJzIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogVHJhbnNmb3JtcyB1c2VyLXByb3ZpZGVkIExhbWJkYSBkZWZpbml0aW9ucyBpbnRvIGZ1bGwgTGFtYmRhIGhhbmRsZXIgY2xhc3Nlc1xuICogdGhhdCBleHRlbmQgTGFtYmRhQXBpIGFuZCBpbmNsdWRlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGluamVjdGlvbiB1c2luZ1xuICogUHVyZUNvbnRhaW5lci4gSGFuZGxlcyB0aGUgY29tcGxleGl0eSBvZiBESSByZXNvbHV0aW9uIGFuZCBlcnJvciB3cmFwcGluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmFjdG9yeSA9IG5ldyBMYW1iZGFIYW5kbGVyRmFjdG9yeSgpO1xuICogY29uc3QgaGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlKGxhbWJkYURlZmluaXRpb24sIGNvbnRhaW5lcik7XG4gKlxuICogLy8gSGFuZGxlciBpcyByZWFkeSB0byBiZSBpbnZva2VkIGJ5IEFXUyBMYW1iZGEgcnVudGltZVxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgTGFtYmRhSGFuZGxlckZhY3Rvcnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiAnQGNvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9sYW1iZGEtaGFuZGxlci1mYWN0b3J5JyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBMYW1iZGEgaGFuZGxlciBjbGFzcyBpbnN0YW5jZSBmcm9tIGEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQ3JlYXRlcyBhIFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIHRoYXQgZXh0ZW5kcyBMYW1iZGFBcGkgYW5kIGluY2x1ZGVzXG4gICAqIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGluamVjdGlvbi4gVGhlIGhhbmRsZXIgd2lsbCByZXNvbHZlIGRlcGVuZGVuY2llc1xuICAgKiBmcm9tIHRoZSBwcm92aWRlZCBjb250YWluZXIgYW5kIGluamVjdCB0aGVtIGludG8gdGhlIHVzZXIncyBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIHdpdGggcmVnaXN0ZXJlZCBzZXJ2aWNlc1xuICAgKiBAcmV0dXJucyBMYW1iZGEgaGFuZGxlciBjbGFzcyBpbnN0YW5jZSByZWFkeSBmb3IgQVdTIExhbWJkYSBydW50aW1lXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbGFtYmRhRGVmOiBMYW1iZGFEZWZpbml0aW9uID0ge1xuICAgKiAgIGlkOiAnY2hhcmdlJyxcbiAgICogICB0aWVzOiBbUGF5bWVudHNTZXJ2aWNlLCBCaWxsaW5nU2VydmljZV0sXG4gICAqICAgaGFuZGxlcjogKGRlcHMpID0+IGFzeW5jIChldmVudCwgY29udGV4dCkgPT4ge1xuICAgKiAgICAgcmV0dXJuIGF3YWl0IGRlcHMucGF5bWVudHNTZXJ2aWNlLnByb2Nlc3NDaGFyZ2UoZXZlbnQuYm9keSk7XG4gICAqICAgfVxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBoYW5kbGVyID0gZmFjdG9yeS5jcmVhdGUobGFtYmRhRGVmLCBjb250YWluZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGNyZWF0ZShkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uLCBjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPik6IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdDcmVhdGluZyBMYW1iZGEgaGFuZGxlcicsIHtcbiAgICAgIGxhbWJkYUlkOiBkZWZpbml0aW9uLmlkLFxuICAgICAgc2VydmljZTogZGVmaW5pdGlvbi5zZXJ2aWNlLFxuICAgICAgZGVwZW5kZW5jeUNvdW50OiBkZWZpbml0aW9uLnRpZXMubGVuZ3RoLFxuICAgIH0pO1xuXG4gICAgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgIGNvbnN0IHsgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgfSA9IHJlcXVpcmUoJy4vcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInKTtcbiAgICByZXR1cm4gbmV3IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyKGRlZmluaXRpb24sIGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGRlcGVuZGVuY2llcyBmcm9tIFB1cmVDb250YWluZXIgdXNpbmcgY2xhc3MgcmVmZXJlbmNlcy5cbiAgICpcbiAgICogUmVzb2x2ZXMgY2xhc3MgcmVmZXJlbmNlcyB0byBzZXJ2aWNlIGluc3RhbmNlcyB1c2luZyBQdXJlQ29udGFpbmVyLnJ1bigpXG4gICAqIHdpdGggY2xhc3MgbmFtZXMgYXMga2V5cy4gQ29udmVydHMgY2xhc3MgbmFtZXMgdG8gY2FtZWxDYXNlIGZvciB0aGVcbiAgICogZGVwZW5kZW5jeSBvYmplY3Qga2V5cyAoZS5nLiwgUGF5bWVudHNTZXJ2aWNlIFx1MjE5MiBwYXltZW50c1NlcnZpY2UpLlxuICAgKlxuICAgKiBAcGFyYW0gdGllcyAtIEFycmF5IG9mIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNhbWVsQ2FzZSBrZXlzIGNvbnRhaW5pbmcgcmVzb2x2ZWQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IGRlcGVuZGVuY3kgY2Fubm90IGJlIHJlc29sdmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGllcyA9IFtQYXltZW50c1NlcnZpY2UsIEJpbGxpbmdTZXJ2aWNlXTtcbiAgICogY29uc3QgZGVwcyA9IGZhY3RvcnkuaW5qZWN0RGVwZW5kZW5jaWVzKHRpZXMsIGNvbnRhaW5lcik7XG4gICAqIC8vIFJlc3VsdDogeyBwYXltZW50c1NlcnZpY2U6IFBheW1lbnRzU2VydmljZSwgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmplY3REZXBlbmRlbmNpZXMoXG4gICAgdGllczogQXJyYXk8bmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+LFxuICAgIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgZGVwczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgY2xhc3NSZWYgb2YgdGllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVXNlIGNsYXNzIG5hbWUgYXMgdGhlIERJIHRva2VuIChQdXJlQ29udGFpbmVyIHVzZXMgc3RyaW5nIGtleXMpXG4gICAgICAgIGNvbnN0IHRva2VuID0gY2xhc3NSZWYubmFtZTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBjb250YWluZXIucnVuKHRva2VuKTtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50b0NhbWVsQ2FzZShjbGFzc1JlZi5uYW1lKTtcbiAgICAgICAgZGVwc1trZXldID0gaW5zdGFuY2U7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RlcGVuZGVuY3kgaW5qZWN0ZWQnLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1JlZi5uYW1lLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gaW5qZWN0IGRlcGVuZGVuY3knLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc1JlZi5uYW1lLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBpbmplY3QgZGVwZW5kZW5jeSAnJHtjbGFzc1JlZi5uYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnRGVwZW5kZW5jaWVzIGluamVjdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgIGRlcGVuZGVuY3lDb3VudDogT2JqZWN0LmtleXMoZGVwcykubGVuZ3RoLFxuICAgICAgZGVwZW5kZW5jaWVzOiBPYmplY3Qua2V5cyhkZXBzKSxcbiAgICB9KTtcblxuICAgIHJldHVybiBkZXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgYSBoYW5kbGVyIGZ1bmN0aW9uIHdpdGggbG9nZ2luZyBhbmQgZXJyb3IgaGFuZGxpbmcuXG4gICAqXG4gICAqIEFkZHMgc3RydWN0dXJlZCBsb2dnaW5nIGZvciBMYW1iZGEgaW52b2NhdGlvbiBzdGFydC9lbmQsIGVycm9yIGhhbmRsaW5nXG4gICAqIHRoYXQgY2F0Y2hlcyBhbmQgbG9ncyBleGNlcHRpb25zLCBhbmQgdGltaW5nIGluZm9ybWF0aW9uLiBSZXR1cm5zIGFcbiAgICogd3JhcHBlZCBoYW5kbGVyIHRoYXQgbWFpbnRhaW5zIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGUgb3JpZ2luYWwuXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTGFtYmRhIG1ldGFkYXRhIGZvciBsb2dnaW5nIGNvbnRleHRcbiAgICogQHJldHVybnMgV3JhcHBlZCBoYW5kbGVyIHdpdGggbG9nZ2luZyBhbmQgZXJyb3IgaGFuZGxpbmdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGZhY3Rvcnkud3JhcEhhbmRsZXIoXG4gICAqICAgYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7IHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTsgfSxcbiAgICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgd3JhcEhhbmRsZXIoXG4gICAgaGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+LFxuICAgIG1ldGFkYXRhOiB7IGlkOiBzdHJpbmc7IHNlcnZpY2U6IHN0cmluZyB9LFxuICApOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBmdWxsV3JhcHBlcihoYW5kbGVyLCBtZXRhZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBjbGFzcyBuYW1lIHRvIGNhbWVsQ2FzZSBmb3IgZGVwZW5kZW5jeSBvYmplY3Qga2V5cy5cbiAgICpcbiAgICogQ29udmVydHMgUGFzY2FsQ2FzZSBjbGFzcyBuYW1lcyB0byBjYW1lbENhc2UgcHJvcGVydHkgbmFtZXMgZm9yIHRoZVxuICAgKiBkZXBlbmRlbmN5IGluamVjdGlvbiBvYmplY3QuIFRoaXMgcHJvdmlkZXMgYSBjb25zaXN0ZW50IG5hbWluZyBjb252ZW50aW9uXG4gICAqIGZvciBpbmplY3RlZCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBQYXNjYWxDYXNlIGNsYXNzIG5hbWVcbiAgICogQHJldHVybnMgY2FtZWxDYXNlIHByb3BlcnR5IG5hbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBmYWN0b3J5LnRvQ2FtZWxDYXNlKCdQYXltZW50c1NlcnZpY2UnKTsgLy8gJ3BheW1lbnRzU2VydmljZSdcbiAgICogZmFjdG9yeS50b0NhbWVsQ2FzZSgnQmlsbGluZ1NlcnZpY2UnKTsgIC8vICdiaWxsaW5nU2VydmljZSdcbiAgICogZmFjdG9yeS50b0NhbWVsQ2FzZSgnQ29uZmlnU2VydmljZScpOyAgIC8vICdjb25maWdTZXJ2aWNlJ1xuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgdG9DYW1lbENhc2UoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjbGFzc05hbWUuc2xpY2UoMSk7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcblxuLyoqXG4gKiBMYW1iZGEgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgbG9nZ2luZyBhbmQgbW9uaXRvcmluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFDb250ZXh0SW5mbyB7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gbmFtZSAqL1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBMYW1iZGEgZnVuY3Rpb24gdmVyc2lvbiAqL1xuICBmdW5jdGlvblZlcnNpb24/OiBzdHJpbmc7XG4gIC8qKiBBV1MgcmVxdWVzdCBJRCAqL1xuICBhd3NSZXF1ZXN0SWQ/OiBzdHJpbmc7XG4gIC8qKiBSZW1haW5pbmcgdGltZSBpbiBtaWxsaXNlY29uZHMgKi9cbiAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzPzogKCkgPT4gbnVtYmVyO1xuICAvKiogTWVtb3J5IGxpbWl0IGluIE1CICovXG4gIG1lbW9yeUxpbWl0SW5NQj86IHN0cmluZztcbiAgLyoqIExvZyBncm91cCBuYW1lICovXG4gIGxvZ0dyb3VwTmFtZT86IHN0cmluZztcbiAgLyoqIExvZyBzdHJlYW0gbmFtZSAqL1xuICBsb2dTdHJlYW1OYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGxvZ2dpbmcgY29udGV4dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyTWV0YWRhdGEge1xuICAvKiogTGFtYmRhIGlkZW50aWZpZXIgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogU2VydmljZSBuYW1lIChlLmcuLCAncGF5bWVudHMnKSAqL1xuICBzZXJ2aWNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIG1ldHJpY3MgY29sbGVjdGVkIGR1cmluZyBoYW5kbGVyIGludm9jYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uTWV0cmljcyB7XG4gIC8qKiBTdGFydCB0aW1lc3RhbXAgKi9cbiAgc3RhcnRUaW1lOiBudW1iZXI7XG4gIC8qKiBFbmQgdGltZXN0YW1wICovXG4gIGVuZFRpbWU6IG51bWJlcjtcbiAgLyoqIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuICAvKiogTWVtb3J5IHVzYWdlIGluZm9ybWF0aW9uIChpZiBhdmFpbGFibGUpICovXG4gIG1lbW9yeVVzZWQ/OiBudW1iZXI7XG4gIC8qKiBSZW1haW5pbmcgdGltZSB3aGVuIGhhbmRsZXIgY29tcGxldGVkICovXG4gIHJlbWFpbmluZ1RpbWU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogTG9nZ2luZyB3cmFwcGVyIGZvciBMYW1iZGEgaW52b2NhdGlvbiBsaWZlY3ljbGUuXG4gKlxuICogUHJvdmlkZXMgc3RydWN0dXJlZCBsb2dnaW5nIGZvciBMYW1iZGEgaW52b2NhdGlvbiBzdGFydC9lbmQgd2l0aFxuICogY29udGV4dHVhbCBpbmZvcm1hdGlvbiBpbmNsdWRpbmcgdGltaW5nLCBtZW1vcnkgdXNhZ2UsIGFuZCBBV1NcbiAqIExhbWJkYSBjb250ZXh0IGRldGFpbHMuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgbG9nZ2luZyBjb250ZXh0XG4gKiBAcmV0dXJucyBXcmFwcGVkIGhhbmRsZXIgd2l0aCBsb2dnaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gbG9nZ2luZ1dyYXBwZXIoXG4gKiAgIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4geyByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07IH0sXG4gKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dpbmdXcmFwcGVyKFxuICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gIG1ldGFkYXRhOiBIYW5kbGVyTWV0YWRhdGEsXG4pOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBoYW5kbGVyTG9nZ2VyID0gbG9nZ2VyKHtcbiAgICBzZXJ2aWNlTmFtZTogYEBsYW1iZGEvJHttZXRhZGF0YS5zZXJ2aWNlfS8ke21ldGFkYXRhLmlkfWAsXG4gICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgIGxhbWJkYUlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIHNlcnZpY2U6IG1ldGFkYXRhLnNlcnZpY2UsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgY29udGV4dEluZm8gPSBleHRyYWN0TGFtYmRhQ29udGV4dChjb250ZXh0KTtcblxuICAgIGhhbmRsZXJMb2dnZXIuaW5mbygnTGFtYmRhIGludm9jYXRpb24gc3RhcnRlZCcsIHtcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHRJbmZvLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uVmVyc2lvbjogY29udGV4dEluZm8uZnVuY3Rpb25WZXJzaW9uLFxuICAgICAgbWVtb3J5TGltaXQ6IGNvbnRleHRJbmZvLm1lbW9yeUxpbWl0SW5NQixcbiAgICAgIHJlbWFpbmluZ1RpbWU6IGNvbnRleHRJbmZvLmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcz8uKCksXG4gICAgICBldmVudFR5cGU6IGdldEV2ZW50VHlwZShldmVudCksXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY2FsY3VsYXRlTWV0cmljcyhzdGFydFRpbWUsIGNvbnRleHRJbmZvKTtcblxuICAgICAgaGFuZGxlckxvZ2dlci5pbmZvKCdMYW1iZGEgaW52b2NhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZHVyYXRpb246IG1ldHJpY3MuZHVyYXRpb24sXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXRyaWNzID0gY2FsY3VsYXRlTWV0cmljcyhzdGFydFRpbWUsIGNvbnRleHRJbmZvKTtcblxuICAgICAgaGFuZGxlckxvZ2dlci5lcnJvcignTGFtYmRhIGludm9jYXRpb24gZmFpbGVkJywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgZHVyYXRpb246IG1ldHJpY3MuZHVyYXRpb24sXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIGVycm9yVHlwZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bicsXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIEVycm9yIHdyYXBwZXIgZm9yIExhbWJkYSBoYW5kbGVyIGVycm9yIGhhbmRsaW5nLlxuICpcbiAqIENhdGNoZXMgYW5kIGxvZ3MgZXJyb3JzIHdpdGggc3RydWN0dXJlZCBpbmZvcm1hdGlvbiwgdGhlbiByZXR1cm5zXG4gKiBhcHByb3ByaWF0ZSBlcnJvciByZXNwb25zZXMuIEhhbmRsZXMgYm90aCB0aHJvd24gZXJyb3JzIGFuZCByZWplY3RlZFxuICogcHJvbWlzZXMgY29uc2lzdGVudGx5LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBtZXRhZGF0YSAtIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGVycm9yIGNvbnRleHRcbiAqIEByZXR1cm5zIFdyYXBwZWQgaGFuZGxlciB3aXRoIGVycm9yIGhhbmRsaW5nXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gZXJyb3JXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvcldyYXBwZXIoXG4gIGhhbmRsZXI6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgbWV0YWRhdGE6IEhhbmRsZXJNZXRhZGF0YSxcbik6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGVycm9yTG9nZ2VyID0gbG9nZ2VyKHtcbiAgICBzZXJ2aWNlTmFtZTogYEBsYW1iZGEvJHttZXRhZGF0YS5zZXJ2aWNlfS8ke21ldGFkYXRhLmlkfS9lcnJvci1oYW5kbGVyYCxcbiAgICBwZXJzaXN0ZW50TG9nQXR0cmlidXRlczoge1xuICAgICAgbGFtYmRhSWQ6IG1ldGFkYXRhLmlkLFxuICAgICAgc2VydmljZTogbWV0YWRhdGEuc2VydmljZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBjb250ZXh0SW5mbyA9IGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQpO1xuICAgICAgY29uc3QgZXJyb3JEZXRhaWxzID0gZXh0cmFjdEVycm9yRGV0YWlscyhlcnJvcik7XG5cbiAgICAgIGVycm9yTG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgZXJyb3IgaW4gTGFtYmRhIGhhbmRsZXInLCB7XG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBhd3NSZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBjb250ZXh0SW5mby5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvckRldGFpbHMubWVzc2FnZSxcbiAgICAgICAgZXJyb3JUeXBlOiBlcnJvckRldGFpbHMudHlwZSxcbiAgICAgICAgc3RhY2s6IGVycm9yRGV0YWlscy5zdGFjayxcbiAgICAgICAgZXZlbnRUeXBlOiBnZXRFdmVudFR5cGUoZXZlbnQpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvciBBUEkgR2F0ZXdheSBldmVudHMsIHJldHVybiBzdHJ1Y3R1cmVkIGVycm9yIHJlc3BvbnNlXG4gICAgICBpZiAoaXNBcGlHYXRld2F5RXZlbnQoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiAnQ29udGVudC1UeXBlLEF1dGhvcml6YXRpb24nLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiAnR0VULFBPU1QsUFVULERFTEVURSxPUFRJT05TJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnID8gZXJyb3JEZXRhaWxzLm1lc3NhZ2UgOiAnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCcsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBGb3Igb3RoZXIgZXZlbnQgdHlwZXMsIHJlLXRocm93IHRoZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFRpbWluZyB3cmFwcGVyIGZvciBMYW1iZGEgaGFuZGxlciBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLlxuICpcbiAqIE1lYXN1cmVzIGhhbmRsZXIgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZSwgcHJvdmlkaW5nXG4gKiBkZXRhaWxlZCBwZXJmb3JtYW5jZSBtZXRyaWNzIGZvciBtb25pdG9yaW5nIGFuZCBvcHRpbWl6YXRpb24uXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgdGltaW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFdyYXBwZWQgaGFuZGxlciB3aXRoIHRpbWluZyBtZWFzdXJlbWVudHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSB0aW1pbmdXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1pbmdXcmFwcGVyKFxuICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gIG1ldGFkYXRhOiBIYW5kbGVyTWV0YWRhdGEsXG4pOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB0aW1pbmdMb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiBgQGxhbWJkYS8ke21ldGFkYXRhLnNlcnZpY2V9LyR7bWV0YWRhdGEuaWR9L3RpbWluZ2AsXG4gICAgcGVyc2lzdGVudExvZ0F0dHJpYnV0ZXM6IHtcbiAgICAgIGxhbWJkYUlkOiBtZXRhZGF0YS5pZCxcbiAgICAgIHNlcnZpY2U6IG1ldGFkYXRhLnNlcnZpY2UsXG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGFzeW5jIChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgc3RhcnRNZW1vcnkgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgY29uc3QgY29udGV4dEluZm8gPSBleHRyYWN0TGFtYmRhQ29udGV4dChjb250ZXh0KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3Moc3RhcnRUaW1lLCBzdGFydE1lbW9yeSwgY29udGV4dEluZm8pO1xuXG4gICAgICB0aW1pbmdMb2dnZXIuaW5mbygnSGFuZGxlciBleGVjdXRpb24gbWV0cmljcycsIHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGF3c1JlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgbWVtb3J5VXNlZDogbWV0cmljcy5tZW1vcnlVc2VkLFxuICAgICAgICByZW1haW5pbmdUaW1lOiBtZXRyaWNzLnJlbWFpbmluZ1RpbWUsXG4gICAgICAgIG1lbW9yeUxpbWl0OiBjb250ZXh0SW5mby5tZW1vcnlMaW1pdEluTUIsXG4gICAgICAgIGhlYXBVc2VkOiBtZXRyaWNzLmhlYXBVc2VkLFxuICAgICAgICBoZWFwVG90YWw6IG1ldHJpY3MuaGVhcFRvdGFsLFxuICAgICAgICBleHRlcm5hbDogbWV0cmljcy5leHRlcm5hbCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3Moc3RhcnRUaW1lLCBzdGFydE1lbW9yeSwgY29udGV4dEluZm8pO1xuXG4gICAgICB0aW1pbmdMb2dnZXIud2FybignSGFuZGxlciBleGVjdXRpb24gZmFpbGVkIHdpdGggbWV0cmljcycsIHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGF3c1JlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgbWVtb3J5VXNlZDogbWV0cmljcy5tZW1vcnlVc2VkLFxuICAgICAgICByZW1haW5pbmdUaW1lOiBtZXRyaWNzLnJlbWFpbmluZ1RpbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENvbWJpbmVkIHdyYXBwZXIgdGhhdCBhcHBsaWVzIGxvZ2dpbmcsIGVycm9yIGhhbmRsaW5nLCBhbmQgdGltaW5nLlxuICpcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgYXBwbGllcyBhbGwgdGhyZWUgd3JhcHBlcnMgaW4gdGhlIGNvcnJlY3RcbiAqIG9yZGVyOiB0aW1pbmcgKGlubmVybW9zdCkgXHUyMTkyIGVycm9yIGhhbmRsaW5nIFx1MjE5MiBsb2dnaW5nIChvdXRlcm1vc3QpLlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIC0gT3JpZ2luYWwgTGFtYmRhIGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBtZXRhZGF0YSAtIEhhbmRsZXIgbWV0YWRhdGEgZm9yIGFsbCB3cmFwcGVyc1xuICogQHJldHVybnMgRnVsbHkgd3JhcHBlZCBoYW5kbGVyIHdpdGggYWxsIGVuaGFuY2VtZW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGZ1bGxXcmFwcGVyKFxuICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICogICB7IGlkOiAncGF5bWVudHMuY2hhcmdlJywgc2VydmljZTogJ3BheW1lbnRzJyB9XG4gKiApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdWxsV3JhcHBlcihcbiAgaGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+LFxuICBtZXRhZGF0YTogSGFuZGxlck1ldGFkYXRhLFxuKTogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgLy8gQXBwbHkgd3JhcHBlcnMgaW4gb3JkZXI6IHRpbWluZyBcdTIxOTIgZXJyb3IgXHUyMTkyIGxvZ2dpbmdcbiAgcmV0dXJuIGxvZ2dpbmdXcmFwcGVyKFxuICAgIGVycm9yV3JhcHBlcihcbiAgICAgIHRpbWluZ1dyYXBwZXIoaGFuZGxlciwgbWV0YWRhdGEpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgKSxcbiAgICBtZXRhZGF0YSxcbiAgKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IExhbWJkYSBjb250ZXh0IGluZm9ybWF0aW9uIHNhZmVseS5cbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIExhbWJkYSBjb250ZXh0IG9iamVjdFxuICogQHJldHVybnMgRXh0cmFjdGVkIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQ6IHVua25vd24pOiBMYW1iZGFDb250ZXh0SW5mbyB7XG4gIGlmICghY29udGV4dCB8fCB0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBjdHggPSBjb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4ge1xuICAgIGZ1bmN0aW9uTmFtZTogdHlwZW9mIGN0eC5mdW5jdGlvbk5hbWUgPT09ICdzdHJpbmcnID8gY3R4LmZ1bmN0aW9uTmFtZSA6IHVuZGVmaW5lZCxcbiAgICBmdW5jdGlvblZlcnNpb246IHR5cGVvZiBjdHguZnVuY3Rpb25WZXJzaW9uID09PSAnc3RyaW5nJyA/IGN0eC5mdW5jdGlvblZlcnNpb24gOiB1bmRlZmluZWQsXG4gICAgYXdzUmVxdWVzdElkOiB0eXBlb2YgY3R4LmF3c1JlcXVlc3RJZCA9PT0gJ3N0cmluZycgPyBjdHguYXdzUmVxdWVzdElkIDogdW5kZWZpbmVkLFxuICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogdHlwZW9mIGN0eC5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gY3R4LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyBhcyAoKSA9PiBudW1iZXJcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIG1lbW9yeUxpbWl0SW5NQjogdHlwZW9mIGN0eC5tZW1vcnlMaW1pdEluTUIgPT09ICdzdHJpbmcnID8gY3R4Lm1lbW9yeUxpbWl0SW5NQiA6IHVuZGVmaW5lZCxcbiAgICBsb2dHcm91cE5hbWU6IHR5cGVvZiBjdHgubG9nR3JvdXBOYW1lID09PSAnc3RyaW5nJyA/IGN0eC5sb2dHcm91cE5hbWUgOiB1bmRlZmluZWQsXG4gICAgbG9nU3RyZWFtTmFtZTogdHlwZW9mIGN0eC5sb2dTdHJlYW1OYW1lID09PSAnc3RyaW5nJyA/IGN0eC5sb2dTdHJlYW1OYW1lIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBiYXNpYyBleGVjdXRpb24gbWV0cmljcy5cbiAqXG4gKiBAcGFyYW0gc3RhcnRUaW1lIC0gSGFuZGxlciBzdGFydCB0aW1lXG4gKiBAcGFyYW0gY29udGV4dEluZm8gLSBMYW1iZGEgY29udGV4dCBpbmZvcm1hdGlvblxuICogQHJldHVybnMgQmFzaWMgZXhlY3V0aW9uIG1ldHJpY3NcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1ldHJpY3Moc3RhcnRUaW1lOiBudW1iZXIsIGNvbnRleHRJbmZvOiBMYW1iZGFDb250ZXh0SW5mbyk6IEV4ZWN1dGlvbk1ldHJpY3Mge1xuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXJ0VGltZSxcbiAgICByZW1haW5pbmdUaW1lOiBjb250ZXh0SW5mby5nZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM/LigpLFxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBkZXRhaWxlZCBleGVjdXRpb24gbWV0cmljcyBpbmNsdWRpbmcgbWVtb3J5IHVzYWdlLlxuICpcbiAqIEBwYXJhbSBzdGFydFRpbWUgLSBIYW5kbGVyIHN0YXJ0IHRpbWVcbiAqIEBwYXJhbSBzdGFydE1lbW9yeSAtIE1lbW9yeSB1c2FnZSBhdCBzdGFydFxuICogQHBhcmFtIGNvbnRleHRJbmZvIC0gTGFtYmRhIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIERldGFpbGVkIGV4ZWN1dGlvbiBtZXRyaWNzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3MoXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBzdGFydE1lbW9yeTogTm9kZUpTLk1lbW9yeVVzYWdlLFxuICBjb250ZXh0SW5mbzogTGFtYmRhQ29udGV4dEluZm8sXG4pOiBFeGVjdXRpb25NZXRyaWNzICYgeyBoZWFwVXNlZDogbnVtYmVyOyBoZWFwVG90YWw6IG51bWJlcjsgZXh0ZXJuYWw6IG51bWJlciB9IHtcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVuZE1lbW9yeSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKTtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhcnRUaW1lLFxuICAgIG1lbW9yeVVzZWQ6IGVuZE1lbW9yeS5oZWFwVXNlZCAtIHN0YXJ0TWVtb3J5LmhlYXBVc2VkLFxuICAgIHJlbWFpbmluZ1RpbWU6IGNvbnRleHRJbmZvLmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcz8uKCksXG4gICAgaGVhcFVzZWQ6IGVuZE1lbW9yeS5oZWFwVXNlZCxcbiAgICBoZWFwVG90YWw6IGVuZE1lbW9yeS5oZWFwVG90YWwsXG4gICAgZXh0ZXJuYWw6IGVuZE1lbW9yeS5leHRlcm5hbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGVycm9yIGRldGFpbHMgc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG9iamVjdCBvciB1bmtub3duIHZhbHVlXG4gKiBAcmV0dXJucyBTdHJ1Y3R1cmVkIGVycm9yIGRldGFpbHNcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFcnJvckRldGFpbHMoZXJyb3I6IHVua25vd24pOiB7IG1lc3NhZ2U6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzdGFjaz86IHN0cmluZyB9IHtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgIHR5cGU6IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB0eXBlOiAnVW5rbm93bicsXG4gIH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIExhbWJkYSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBMYW1iZGEgZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyBFdmVudCB0eXBlIHN0cmluZ1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRUeXBlKGV2ZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICd1bmtub3duJztcbiAgfVxuXG4gIGNvbnN0IGV2dCA9IGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGlmIChldnQuUmVjb3JkcyAmJiBBcnJheS5pc0FycmF5KGV2dC5SZWNvcmRzKSkge1xuICAgIHJldHVybiAnYXdzLWV2ZW50JztcbiAgfVxuXG4gIGlmIChldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpIHtcbiAgICByZXR1cm4gJ2FwaS1nYXRld2F5JztcbiAgfVxuXG4gIGlmIChldnQuc291cmNlID09PSAnYXdzLmV2ZW50cycpIHtcbiAgICByZXR1cm4gJ2V2ZW50YnJpZGdlJztcbiAgfVxuXG4gIGlmIChldnQuZXZlbnRTb3VyY2UgPT09ICdhd3M6czMnKSB7XG4gICAgcmV0dXJuICdzMyc7XG4gIH1cblxuICByZXR1cm4gJ2N1c3RvbSc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgZXZlbnQgaXMgYW4gQVBJIEdhdGV3YXkgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gTGFtYmRhIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMgVHJ1ZSBpZiBBUEkgR2F0ZXdheSBldmVudFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNBcGlHYXRld2F5RXZlbnQoZXZlbnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXZ0ID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAhIShldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBMYW1iZGEgSGFuZGxlciBGYWN0b3J5IE1vZHVsZVxuICpcbiAqIFByb3ZpZGVzIGZhY3RvcnkgY2xhc3NlcyBhbmQgdXRpbGl0aWVzIGZvciBjcmVhdGluZyBMYW1iZGEgaGFuZGxlcnMgd2l0aFxuICogZGVwZW5kZW5jeSBpbmplY3Rpb24gc3VwcG9ydC4gVGhpcyBtb2R1bGUgYnJpZGdlcyB0aGUgZ2FwIGJldHdlZW4gdGhlXG4gKiBleGlzdGluZyBQdXJlbm93IENvcmUgTGFtYmRhQXBpIGluZnJhc3RydWN0dXJlIGFuZCB0aGUgbmV3IFJ1bnRpbWUgV2ViXG4gKiBDb3JlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqL1xuXG5leHBvcnQgeyBMYW1iZGFIYW5kbGVyRmFjdG9yeSB9IGZyb20gJy4vbGFtYmRhLWhhbmRsZXItZmFjdG9yeSc7XG5leHBvcnQgeyBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciB9IGZyb20gJy4vcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInO1xuZXhwb3J0IHtcbiAgbG9nZ2luZ1dyYXBwZXIsXG4gIGVycm9yV3JhcHBlcixcbiAgdGltaW5nV3JhcHBlcixcbiAgZnVsbFdyYXBwZXIsXG4gIHR5cGUgSGFuZGxlck1ldGFkYXRhLFxuICB0eXBlIExhbWJkYUNvbnRleHRJbmZvLFxuICB0eXBlIEV4ZWN1dGlvbk1ldHJpY3MsXG59IGZyb20gJy4vaGFuZGxlci13cmFwcGVycyc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IFJlYWN0IFNlcnZlcmxlc3MgPHJlYWN0LXNlcnZlcmxlc3M+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBMYW1iZGEgUGlwZWxpbmUgLSBTZXJ2ZXItc2lkZSBleGVjdXRpb24gKExhbWJkYSBydW50aW1lIG9ubHkpXG4vLyBDREsgUGlwZWxpbmUgbW92ZWQgdG86IHNyYy9pbmZyYS9ydW50aW1lLXdlYi9waXBlbGluZXMvY2RrLXBpcGVsaW5lLnRzXG4vLyBCcm93c2VyIFBpcGVsaW5lIG1vdmVkIHRvOiBzcmMvbGliL3J1bnRpbWUtd2ViL3BpcGVsaW5lcy9icm93c2VyLXBpcGVsaW5lLnRzXG5leHBvcnQgKiBmcm9tICcuL2xhbWJkYS1waXBlbGluZSc7XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBwdXJhYmxlLCBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFEZWZpbml0aW9uLCBNaWNyb3NlcnZpY2VEZWZpbml0aW9uIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyRmFjdG9yeSB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL2RpL3B1cmUtY29udGFpbmVyLWZhY3RvcnknO1xuaW1wb3J0IHsgQ29udGFpbmVyUmVnaXN0cnkgfSBmcm9tICdAY29yZS9ydW50aW1lLXdlYi9yZWdpc3RyYXIvY29udGFpbmVyLXJlZ2lzdHJ5JztcblxuLyoqXG4gKiBNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGZvciBtYW5hZ2luZyBESSBjb250YWluZXJzIGFuZCBMYW1iZGEgbWFwcGluZ3MuXG4gKlxuICogUHJvY2Vzc2VzIG1pY3Jvc2VydmljZSBkZWZpbml0aW9ucyB0byBjcmVhdGUgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgYW5kXG4gKiBtYWludGFpbnMgbWFwcGluZ3MgYmV0d2VlbiBMYW1iZGEgZnVuY3Rpb25zIGFuZCB0aGVpciBwYXJlbnQgc2VydmljZXMuXG4gKiBUaGlzIGVuYWJsZXMgdGhlIGZyYW1ld29yayB0byByZXNvbHZlIHRoZSBjb3JyZWN0IERJIGNvbnRhaW5lciBmb3IgZWFjaFxuICogTGFtYmRhIGludm9jYXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJhciA9IG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIoKTtcbiAqXG4gKiAvLyBQcm9jZXNzIGEgbWljcm9zZXJ2aWNlIGRlZmluaXRpb25cbiAqIHJlZ2lzdHJhci5wcm9jZXNzU2VydmljZSgncGF5bWVudHMnLCB7XG4gKiAgIHRpZXM6IFtQYXltZW50c1RpZXNdLFxuICogICBsYW1iZGFzOiBbY2hhcmdlSGFuZGxlciwgcmVmdW5kSGFuZGxlcl1cbiAqIH0pO1xuICpcbiAqIC8vIEdldCBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgTGFtYmRhXG4gKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyYXIuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAqIGBgYFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJGYWN0b3J5OiBQdXJlQ29udGFpbmVyRmFjdG9yeTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeTogQ29udGFpbmVyUmVnaXN0cnk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb250YWluZXJGYWN0b3J5ID0gbmV3IFB1cmVDb250YWluZXJGYWN0b3J5KCk7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBDb250YWluZXJSZWdpc3RyeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYSBtaWNyb3NlcnZpY2UgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGl0cyBESSBjb250YWluZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBQdXJlQ29udGFpbmVyIGZyb20gdGhlIFRpZXMgY2xhc3NlcyBhbmQgcHJvY2Vzc2VzIGFsbCBMYW1iZGFcbiAgICogZGVmaW5pdGlvbnMgdG8gZXN0YWJsaXNoIHNlcnZpY2UgbWFwcGluZ3MuIEF1dG8tc2V0cyB0aGUgc2VydmljZSBwcm9wZXJ0eVxuICAgKiBvbiBlYWNoIExhbWJkYSBkZWZpbml0aW9uIGFuZCBnZW5lcmF0ZXMgTGFtYmRhIElEcy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTWljcm9zZXJ2aWNlIGRlZmluaXRpb24gd2l0aCBUaWVzIGFuZCBMYW1iZGFzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgc2VydmljZSBwcm9jZXNzaW5nIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogcmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKCdwYXltZW50cycsIHtcbiAgICogICB0aWVzOiBbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10sXG4gICAqICAgbGFtYmRhczogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBpZDogJ2NoYXJnZScsXG4gICAqICAgICAgIHRpZXM6IFtQYXltZW50c1NlcnZpY2VdLFxuICAgKiAgICAgICBoYW5kbGVyOiAoZGVwcykgPT4gYXN5bmMgKGV2ZW50KSA9PiB7IC4uLiB9XG4gICAqICAgICB9XG4gICAqICAgXVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwcm9jZXNzU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nLCBkZWZpbml0aW9uOiBNaWNyb3NlcnZpY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIDEuIEJ1aWxkIFB1cmVDb250YWluZXIgZnJvbSBUaWVzIGNsYXNzZXNcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyRmFjdG9yeS5jcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIoZGVmaW5pdGlvbi50aWVzKTtcbiAgICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2VOYW1lLCBjb250YWluZXIpO1xuXG4gICAgICAvLyAyLiBQcm9jZXNzIGVhY2ggTGFtYmRhIGRlZmluaXRpb25cbiAgICAgIGZvciAoY29uc3QgbGFtYmRhRGVmIG9mIGRlZmluaXRpb24ubGFtYmRhcykge1xuICAgICAgICAvLyBBdXRvLXNldCBzZXJ2aWNlIHJlZmVyZW5jZVxuICAgICAgICBsYW1iZGFEZWYuc2VydmljZSA9IHNlcnZpY2VOYW1lO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIExhbWJkYSBJRCBhbmQgY3JlYXRlIG1hcHBpbmdcbiAgICAgICAgY29uc3QgbGFtYmRhSWQgPSB0aGlzLmdlbmVyYXRlTGFtYmRhSWQoc2VydmljZU5hbWUsIGxhbWJkYURlZik7XG4gICAgICAgIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJMYW1iZGEobGFtYmRhSWQsIHNlcnZpY2VOYW1lLCBsYW1iZGFEZWYpO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBWYWxpZGF0ZSBjb250YWluZXIgKG9wdGlvbmFsIC0gY2FuIGJlIGVuYWJsZWQgZm9yIGRlYnVnZ2luZylcbiAgICAgIC8vIHRoaXMudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBkZWZpbml0aW9uKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcHJvY2VzcyBtaWNyb3NlcnZpY2UgJyR7c2VydmljZU5hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogTG9va3MgdXAgdGhlIHNlcnZpY2UgbmFtZSBmb3IgdGhlIExhbWJkYSBJRCBhbmQgcmV0dXJucyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBvciBzZXJ2aWNlIG5vdCBmb3VuZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zdCBwYXltZW50c1NlcnZpY2UgPSBjb250YWluZXIucnVuKCdQYXltZW50c1NlcnZpY2UnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIExhbWJkYSBJRCBmcm9tIHNlcnZpY2UgbmFtZSBhbmQgTGFtYmRhIGRlZmluaXRpb24uXG4gICAqXG4gICAqIFVzZXMgZXhwbGljaXQgSUQgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBleHRyYWN0cyBmcm9tIGhhbmRsZXIgZnVuY3Rpb24gbmFtZS5cbiAgICogVGhlIGZpbmFsIElEIGZvcm1hdCBpcyBhbHdheXMgJ3tzZXJ2aWNlTmFtZX0ue2xhbWJkYUlkfScuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHBhcmVudCBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvblxuICAgKiBAcmV0dXJucyBGdWxsIExhbWJkYSBJRFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFdpdGggZXhwbGljaXQgSURcbiAgICogZ2VuZXJhdGVMYW1iZGFJZCgncGF5bWVudHMnLCB7IGlkOiAnY2hhcmdlJywgLi4uIH0pIC8vIFx1MjE5MiAncGF5bWVudHMuY2hhcmdlJ1xuICAgKlxuICAgKiAvLyBXaXRob3V0IGV4cGxpY2l0IElEIChleHRyYWN0cyBmcm9tIGhhbmRsZXIgbmFtZSlcbiAgICogZ2VuZXJhdGVMYW1iZGFJZCgncGF5bWVudHMnLCB7IGhhbmRsZXI6IGZ1bmN0aW9uIHByb2Nlc3NQYXltZW50KCkgey4uLn0gfSkgLy8gXHUyMTkyICdwYXltZW50cy5wcm9jZXNzUGF5bWVudCdcbiAgICogYGBgXG4gICAqL1xuICBnZW5lcmF0ZUxhbWJkYUlkKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IExhbWJkYURlZmluaXRpb24pOiBzdHJpbmcge1xuICAgIGlmIChkZWZpbml0aW9uLmlkKSB7XG4gICAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LiR7ZGVmaW5pdGlvbi5pZH1gO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgZnJvbSBoYW5kbGVyIGZ1bmN0aW9uIG5hbWVcbiAgICBjb25zdCBoYW5kbGVyTmFtZSA9IGRlZmluaXRpb24uaGFuZGxlci5uYW1lIHx8ICdoYW5kbGVyJztcbiAgICByZXR1cm4gYCR7c2VydmljZU5hbWV9LiR7aGFuZGxlck5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgc2VydmljZSBuYW1lcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc2VydmljZSBuYW1lcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICovXG4gIGdldFNlcnZpY2VOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0U2VydmljZU5hbWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIExhbWJkYSBJRHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIExhbWJkYSBJRHMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkXG4gICAqL1xuICBnZXRMYW1iZGFJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYUlkcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VydmljZSBuYW1lIGZvciBhIExhbWJkYSBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSURcbiAgICogQHJldHVybnMgU2VydmljZSBuYW1lIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldFNlcnZpY2VGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYVNlcnZpY2UobGFtYmRhSWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1NlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5Lmhhc1NlcnZpY2Uoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgTGFtYmRhIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgTGFtYmRhIGlzIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc0xhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzTGFtYmRhKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIExhbWJkYSBkZWZpbml0aW9ucyBmb3IgYSBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIExhbWJkYSBJRHMgZm9yIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBnZXRMYW1iZGFzRm9yU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYXNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlcyBhbmQgY29udGFpbmVycy5cbiAgICpcbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcmVpbml0aWFsaXppbmcgdGhlIHJlZ2lzdHJhci5cbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0cnkuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTGFtYmRhIGRlZmluaXRpb24gYnkgSUQuXG4gICAqXG4gICAqIFJldHJpZXZlcyB0aGUgTGFtYmRhIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgTGFtYmRhIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTGFtYmRhIGRlZmluaXRpb24gbm90IGZvdW5kXG4gICAqL1xuICBnZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkOiBzdHJpbmcpOiBMYW1iZGFEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsIENvbnRhaW5lclJlZ2lzdHJ5IGZvciBhZHZhbmNlZCB1c2UgY2FzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIENvbnRhaW5lclJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqL1xuICBnZXRSZWdpc3RyeSgpOiBDb250YWluZXJSZWdpc3RyeSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBjb250YWluZXIgaGFzIGFsbCByZXF1aXJlZCBzZXJ2aWNlcyAocHJpdmF0ZSBoZWxwZXIpLlxuICAgKlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBidXQgY2FuIGJlIGVuYWJsZWQgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIENvbnRhaW5lciB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIE1pY3Jvc2VydmljZSBkZWZpbml0aW9uXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCBkZWZpbml0aW9uOiBNaWNyb3NlcnZpY2VEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gRXh0cmFjdCBhbGwgc2VydmljZSBkZXBlbmRlbmNpZXMgZnJvbSBMYW1iZGEgZGVmaW5pdGlvbnNcbiAgICBjb25zdCByZXF1aXJlZFNlcnZpY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGxhbWJkYURlZiBvZiBkZWZpbml0aW9uLmxhbWJkYXMpIHtcbiAgICAgIGZvciAoY29uc3QgdGllQ2xhc3Mgb2YgbGFtYmRhRGVmLnRpZXMpIHtcbiAgICAgICAgcmVxdWlyZWRTZXJ2aWNlcy5hZGQodGllQ2xhc3MubmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdGhhdCBhbGwgcmVxdWlyZWQgc2VydmljZXMgYXJlIHJlZ2lzdGVyZWRcbiAgICB0aGlzLmNvbnRhaW5lckZhY3RvcnkudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBBcnJheS5mcm9tKHJlcXVpcmVkU2VydmljZXMpKTtcbiAgfVxufVxuIiwgImltcG9ydFwicmVmbGVjdC1tZXRhZGF0YVwiO2V4cG9ydHtMYXp5U2VydmljZUlkZW50aWZpZXJ9ZnJvbVwiQGludmVyc2lmeWpzL2NvbW1vblwiO2V4cG9ydHtDb250YWluZXIsQ29udGFpbmVyTW9kdWxlfWZyb21cIkBpbnZlcnNpZnlqcy9jb250YWluZXJcIjtleHBvcnR7YmluZGluZ1Njb3BlVmFsdWVzLGJpbmRpbmdUeXBlVmFsdWVzLGRlY29yYXRlLGluamVjdCxpbmplY3RGcm9tQmFzZSxpbmplY3RGcm9tSGllcmFyY2h5LGluamVjdGFibGUsbXVsdGlJbmplY3QsbmFtZWQsb3B0aW9uYWwscG9zdENvbnN0cnVjdCxwcmVEZXN0cm95LHRhZ2dlZCx1bm1hbmFnZWR9ZnJvbVwiQGludmVyc2lmeWpzL2NvcmVcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciwgTWlzc2luZ1NlcnZpY2VFcnJvciB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL2RpL2RpLWVycm9ycyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBSZWdpc3RyeSBmb3IgbWFuYWdpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgYW5kIExhbWJkYS10by1zZXJ2aWNlIG1hcHBpbmdzLlxuICpcbiAqIFByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcmVnaXN0cnkgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgREkgY29udGFpbmVyc1xuICogZm9yIG1pY3Jvc2VydmljZXMsIGFsb25nIHdpdGggbWFwcGluZ3MgYmV0d2VlbiBMYW1iZGEgZnVuY3Rpb25zIGFuZCB0aGVpclxuICogcGFyZW50IHNlcnZpY2VzLiBUaGlzIGVuYWJsZXMgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgbWFrZXMgdGhlXG4gKiBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgbW9yZSBmb2N1c2VkIG9uIHByb2Nlc3NpbmcgbG9naWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIGNvbnRhaW5lclxuICogcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKCdwYXltZW50cycsIHBheW1lbnRzQ29udGFpbmVyKTtcbiAqXG4gKiAvLyBNYXAgTGFtYmRhIHRvIHNlcnZpY2VcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnLCAncGF5bWVudHMnKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBjb250YWluZXIgZm9yIExhbWJkYVxuICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAqIGBgYFxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcnM6IE1hcDxzdHJpbmcsIFB1cmVDb250YWluZXI8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhVG9TZXJ2aWNlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYURlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBMYW1iZGFEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogU3RvcmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc2VydmljZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gcHJldmVudFxuICAgKiBhY2NpZGVudGFsIG92ZXJ3cml0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBESUNvbnRhaW5lckVycm9yIGlmIHNlcnZpY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF5bWVudHNDb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KCk7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyU2VydmljZSgncGF5bWVudHMnLCBwYXltZW50c0NvbnRhaW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVycy5oYXMoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgYSBkaWZmZXJlbnQgc2VydmljZSBuYW1lIG9yIGNsZWFyIHRoZSByZWdpc3RyeSBmaXJzdC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lcnMuc2V0KHNlcnZpY2VOYW1lLCBjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgTGFtYmRhIGZ1bmN0aW9uIHdpdGggaXRzIHBhcmVudCBzZXJ2aWNlIGFuZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBMYW1iZGEgSUQgYW5kIGl0cyBwYXJlbnQgc2VydmljZSBuYW1lLFxuICAgKiBhbmQgc3RvcmVzIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgcnVudGltZSBsb29rdXAuXG4gICAqIFRoaXMgZW5hYmxlcyBsb29raW5nIHVwIHRoZSBjb3JyZWN0IERJIGNvbnRhaW5lciBmb3IgTGFtYmRhIGludm9jYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHBhcmVudCBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgTGFtYmRhIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgcGFyZW50IHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5yZWdpc3RlckxhbWJkYSgncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzJywgY2hhcmdlRGVmaW5pdGlvbik7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5yZWZ1bmQnLCAncGF5bWVudHMnLCByZWZ1bmREZWZpbml0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlckxhbWJkYShsYW1iZGFJZDogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGFyZW50IHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcnMuaGFzKHNlcnZpY2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBMYW1iZGEgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLmxhbWJkYVRvU2VydmljZS5oYXMobGFtYmRhSWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NlcnZpY2UgPSB0aGlzLmxhbWJkYVRvU2VydmljZS5nZXQobGFtYmRhSWQpO1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBgTGFtYmRhICcke2xhbWJkYUlkfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIHNlcnZpY2UgJyR7ZXhpc3RpbmdTZXJ2aWNlfScuIFVzZSBhIGRpZmZlcmVudCBMYW1iZGEgSUQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGFUb1NlcnZpY2Uuc2V0KGxhbWJkYUlkLCBzZXJ2aWNlTmFtZSk7XG4gICAgdGhpcy5sYW1iZGFEZWZpbml0aW9ucy5zZXQobGFtYmRhSWQsIGRlZmluaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIHNlcnZpY2UgYnkgbmFtZS5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2VcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENvbnRhaW5lcihzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcnMuZ2V0KHNlcnZpY2VOYW1lKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIERJIGNvbnRhaW5lciBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBwYXJlbnQgc2VydmljZSBmb3IgdGhlIExhbWJkYSBJRCBhbmQgcmV0dXJucyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBvciBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5nZXRMYW1iZGFTZXJ2aWNlKGxhbWJkYUlkKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250YWluZXIoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGFyZW50IHNlcnZpY2UgbmFtZSBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBzZXJ2aWNlIG5hbWUgdGhhdCBvd25zIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2VydmljZU5hbWUgPSByZWdpc3RyeS5nZXRMYW1iZGFTZXJ2aWNlKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coc2VydmljZU5hbWUpOyAvLyAncGF5bWVudHMnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhU2VydmljZShsYW1iZGFJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubGFtYmRhVG9TZXJ2aWNlLmdldChsYW1iZGFJZCk7XG4gICAgaWYgKCFzZXJ2aWNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3IobGFtYmRhSWQsICdsYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBzdG9yZWQgTGFtYmRhIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRlZmluaXRpb24gPSByZWdpc3RyeS5nZXRMYW1iZGFEZWZpbml0aW9uKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coZGVmaW5pdGlvbi50aWVzKTsgLy8gW1BheW1lbnRzU2VydmljZSwgQmlsbGluZ1NlcnZpY2VdXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhRGVmaW5pdGlvbihsYW1iZGFJZDogc3RyaW5nKTogTGFtYmRhRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuZ2V0KGxhbWJkYUlkKTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nU2VydmljZUVycm9yKGxhbWJkYUlkLCAnbGFtYmRhIGRlZmluaXRpb25zJyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2VydmljZSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2VydmljZSBpcyByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKHJlZ2lzdHJ5Lmhhc1NlcnZpY2UoJ3BheW1lbnRzJykpIHtcbiAgICogICBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBoYXNTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJzLmhhcyhzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBMYW1iZGEgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgaXMgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChyZWdpc3RyeS5oYXNMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpKSB7XG4gICAqICAgY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGhhc0xhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmhhcyhsYW1iZGFJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlcnZpY2VzID0gcmVnaXN0cnkuZ2V0U2VydmljZU5hbWVzKCk7XG4gICAqIGNvbnNvbGUubG9nKHNlcnZpY2VzKTsgLy8gWydwYXltZW50cycsICd1c2VycycsICdub3RpZmljYXRpb25zJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRTZXJ2aWNlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29udGFpbmVycy5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBMYW1iZGEgSURzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBMYW1iZGEgSURzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBsYW1iZGFzID0gcmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCk7XG4gICAqIGNvbnNvbGUubG9nKGxhbWJkYXMpOyAvLyBbJ3BheW1lbnRzLmNoYXJnZScsICdwYXltZW50cy5yZWZ1bmQnLCAndXNlcnMuY3JlYXRlJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubGFtYmRhVG9TZXJ2aWNlLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBMYW1iZGEgSURzIGZvciBhIHNwZWNpZmljIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyBiZWxvbmdpbmcgdG8gdGhlIHNlcnZpY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwYXltZW50TGFtYmRhcyA9IHJlZ2lzdHJ5LmdldExhbWJkYXNGb3JTZXJ2aWNlKCdwYXltZW50cycpO1xuICAgKiBjb25zb2xlLmxvZyhwYXltZW50TGFtYmRhcyk7IC8vIFsncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzLnJlZnVuZCddXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhc0ZvclNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsYW1iZGFzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbGFtYmRhSWQsIHNlcnZpY2VdIG9mIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHNlcnZpY2UgPT09IHNlcnZpY2VOYW1lKSB7XG4gICAgICAgIGxhbWJkYXMucHVzaChsYW1iZGFJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbWJkYXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2VydmljZSBhbmQgYWxsIGl0cyBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgdGhlIHNlcnZpY2UgY29udGFpbmVyIGFuZCBhbGwgTGFtYmRhLXRvLXNlcnZpY2UgbWFwcGluZ3NcbiAgICogZm9yIExhbWJkYXMgYmVsb25naW5nIHRvIHRoaXMgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byByZW1vdmVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlU2VydmljZSgncGF5bWVudHMnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzJyB3YXMgcmVnaXN0ZXJlZFxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZVNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0ZWQgPSB0aGlzLmNvbnRhaW5lcnMuZGVsZXRlKHNlcnZpY2VOYW1lKTtcblxuICAgIGlmIChleGlzdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIExhbWJkYSBtYXBwaW5ncyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICBjb25zdCBsYW1iZGFzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtsYW1iZGFJZCwgc2VydmljZV0gb2YgdGhpcy5sYW1iZGFUb1NlcnZpY2UuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlID09PSBzZXJ2aWNlTmFtZSkge1xuICAgICAgICAgIGxhbWJkYXNUb1JlbW92ZS5wdXNoKGxhbWJkYUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxhbWJkYUlkIG9mIGxhbWJkYXNUb1JlbW92ZSkge1xuICAgICAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIExhbWJkYSBtYXBwaW5nLlxuICAgKlxuICAgKiBSZW1vdmVzIHRoZSBMYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gTGFtYmRhIElELlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIHBhcmVudCBzZXJ2aWNlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIFRydWUgaWYgTGFtYmRhIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzLmNoYXJnZScgd2FzIHJlZ2lzdGVyZWRcbiAgICogYGBgXG4gICAqL1xuICByZW1vdmVMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFuZCBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgYWxsIGNvbnRhaW5lcnMsIG1hcHBpbmdzLCBhbmQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHJlaW5pdGlhbGl6aW5nIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5jbGVhcigpO1xuICAgKiBjb25zb2xlLmxvZyhyZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKSk7IC8vIFtdXG4gICAqIGNvbnNvbGUubG9nKHJlZ2lzdHJ5LmdldExhbWJkYUlkcygpKTsgLy8gW11cbiAgICogYGBgXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVnaXN0cnkgc3RhdGlzdGljcy5cbiAgICpcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHNlcnZpY2UgYW5kIExhbWJkYSBjb3VudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHJlZ2lzdHJ5LmdldFN0YXRzKCk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRzKTsgLy8geyBzZXJ2aWNlczogMywgbGFtYmRhczogOCB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdHMoKTogeyBzZXJ2aWNlczogbnVtYmVyOyBsYW1iZGFzOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiB0aGlzLmNvbnRhaW5lcnMuc2l6ZSxcbiAgICAgIGxhbWJkYXM6IHRoaXMubGFtYmRhVG9TZXJ2aWNlLnNpemUsXG4gICAgfTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2luZyB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB0eXBlIHsgTGFtYmRhTWV0YWRhdGEsIFJ1bnRpbWVXZWJDb25maWcgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IE1pY3Jvc2VydmljZVJlZ2lzdHJhciB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9taWNyb3NlcnZpY2UtcmVnaXN0cmFyJztcbmltcG9ydCB7IExhbWJkYUhhbmRsZXJGYWN0b3J5IH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9sYW1iZGEtaGFuZGxlci1mYWN0b3J5JztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcblxuLyoqXG4gKiBMYW1iZGEgZXhlY3V0aW9uIHBpcGVsaW5lIGZvciBSdW50aW1lIFRhcmdldCBDb3JlLlxuICpcbiAqIEhhbmRsZXMgTGFtYmRhIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogUmVzb2x2ZXMgdGhlIExhbWJkYSBJRCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcywgZ2V0cyB0aGUgYXBwcm9wcmlhdGVcbiAqIERJIGNvbnRhaW5lciwgY3JlYXRlcyB0aGUgaGFuZGxlciB3aXRoIGluamVjdGVkIGRlcGVuZGVuY2llcywgYW5kIGV4ZWN1dGVzXG4gKiB0aGUgYnVzaW5lc3MgbG9naWMuXG4gKlxuICogKipFeGVjdXRpb24gRmxvdyoqOlxuICogMS4gUmVzb2x2ZSBMYW1iZGEgSUQgZnJvbSBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDIuIFVzZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gZ2V0IGNvbnRhaW5lciBmb3IgTGFtYmRhXG4gKiAzLiBVc2UgTGFtYmRhSGFuZGxlckZhY3RvcnkgdG8gY3JlYXRlIGhhbmRsZXIgd2l0aCBESVxuICogNC4gRXhlY3V0ZSBoYW5kbGVyIGFuZCByZXR1cm4gcmVzdWx0XG4gKlxuICogKipSZXF1aXJlbWVudHMqKjogUkVRLTA2LCBSRVEtMDhcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYVBpcGVsaW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiAnQGNvcmUvcnVudGltZS13ZWIvcGlwZWxpbmVzL2xhbWJkYS1waXBlbGluZScsXG4gIH0pO1xuXG4gIHByaXZhdGUgcmVnaXN0cmFyPzogTWljcm9zZXJ2aWNlUmVnaXN0cmFyO1xuICBwcml2YXRlIGhhbmRsZXJGYWN0b3J5PzogTGFtYmRhSGFuZGxlckZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgTGFtYmRhIHBpcGVsaW5lIGZvciBzZXJ2ZXItc2lkZSBmdW5jdGlvbiBleGVjdXRpb24uXG4gICAqXG4gICAqIFByb2Nlc3NlcyB0aGUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJ5LCByZXNvbHZlcyB0aGUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGVzLCBnZXRzIHRoZSBhcHByb3ByaWF0ZSBESSBjb250YWluZXIsIGNyZWF0ZXMgdGhlIGhhbmRsZXIgd2l0aFxuICAgKiBkZXBlbmRlbmN5IGluamVjdGlvbiwgYW5kIGV4ZWN1dGVzIHRoZSBidXNpbmVzcyBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvbiB3aXRoIG1pY3Jvc2VydmljZSByZWdpc3RyeVxuICAgKiBAcGFyYW0gY29udGV4dCAtIExhbWJkYSBlbnZpcm9ubWVudCBjb250ZXh0IHdpdGggbWV0YWRhdGFcbiAgICogQHJldHVybnMgUmVzdWx0IGZyb20gTGFtYmRhIGhhbmRsZXIgZXhlY3V0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGlwZWxpbmUgPSBuZXcgTGFtYmRhUGlwZWxpbmUoKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgcGlwZWxpbmUuZXhlY3V0ZShjb25maWcsIHtcbiAgICogICB0eXBlOiAnbGFtYmRhJyxcbiAgICogICBtZXRhZGF0YToge1xuICAgKiAgICAgZnVuY3Rpb25OYW1lOiAnbXktYXBwLXBheW1lbnRzLWNoYXJnZS1kZXYnLFxuICAgKiAgICAgdmVyc2lvbjogJyRMQVRFU1QnLFxuICAgKiAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICogICAgIG1lbW9yeUxpbWl0OiAxMDI0LFxuICAgKiAgICAgcmVxdWVzdElkOiAnYWJjLTEyMydcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoY29uZmlnOiBSdW50aW1lV2ViQ29uZmlnLCBjb250ZXh0OiB7IHR5cGU6ICdsYW1iZGEnOyBtZXRhZGF0YTogTGFtYmRhTWV0YWRhdGEgfSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdTdGFydGluZyBMYW1iZGEgcGlwZWxpbmUgZXhlY3V0aW9uJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHQubWV0YWRhdGEuZnVuY3Rpb25OYW1lLFxuICAgICAgICB2ZXJzaW9uOiBjb250ZXh0Lm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIHJlZ2lvbjogY29udGV4dC5tZXRhZGF0YS5yZWdpb24sXG4gICAgICAgIG1lbW9yeUxpbWl0OiBjb250ZXh0Lm1ldGFkYXRhLm1lbW9yeUxpbWl0LFxuICAgICAgICByZXF1ZXN0SWQ6IGNvbnRleHQubWV0YWRhdGEucmVxdWVzdElkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIDEuIEluaXRpYWxpemUgcmVnaXN0cmFyIGFuZCBwcm9jZXNzIG1pY3Jvc2VydmljZXNcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJlZ2lzdHJhcihjb25maWcpO1xuXG4gICAgICAvLyAyLiBSZXNvbHZlIExhbWJkYSBJRCBmcm9tIGVudmlyb25tZW50XG4gICAgICBjb25zdCBsYW1iZGFJZCA9IHRoaXMucmVzb2x2ZUxhbWJkYUlkKCk7XG5cbiAgICAgIC8vIDMuIEdldCBESSBjb250YWluZXIgZm9yIHRoaXMgTGFtYmRhXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZCk7XG5cbiAgICAgIC8vIDQuIENyZWF0ZSBoYW5kbGVyIHdpdGggRElcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmNyZWF0ZUhhbmRsZXJXaXRoREkobGFtYmRhSWQsIGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIDUuIEV4ZWN1dGUgaGFuZGxlciAodGhpcyB3aWxsIGJlIGNhbGxlZCBieSBBV1MgTGFtYmRhIHJ1bnRpbWUpXG4gICAgICAvLyBOb3RlOiBJbiBhY3R1YWwgTGFtYmRhIGV4ZWN1dGlvbiwgdGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgaGFuZGxlclxuICAgICAgLy8gVGhlIEFXUyBMYW1iZGEgcnVudGltZSB3aWxsIGNhbGwgaGFuZGxlci5oYW5kbGVyKGV2ZW50LCBjb250ZXh0KVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTGFtYmRhIHBpcGVsaW5lIHNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaGFuZGxlciBmb3IgQVdTIExhbWJkYSBydW50aW1lIHRvIGludm9rZVxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0xhbWJkYSBwaXBlbGluZSBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICBzZXJ2aWNlTmFtZTogY29uZmlnLnNlcnZpY2VOYW1lLFxuICAgICAgICBzdGFnZTogY29uZmlnLnN0YWdlLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHQubWV0YWRhdGEuZnVuY3Rpb25OYW1lLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBhbmQgcHJvY2VzcyBhbGwgc2VydmljZXMuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBuZXcgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIGFuZCBwcm9jZXNzZXMgYWxsIG1pY3Jvc2VydmljZVxuICAgKiBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIHRvIGJ1aWxkIERJIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBQdXJlbm93IGNvbmZpZ3VyYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVJlZ2lzdHJhcihjb25maWc6IFJ1bnRpbWVXZWJDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSW5pdGlhbGl6aW5nIG1pY3Jvc2VydmljZSByZWdpc3RyYXInKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2lzdHJhciA9IG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIoKTtcblxuICAgICAgLy8gUHJvY2VzcyBhbGwgbWljcm9zZXJ2aWNlcyBmcm9tIHRoZSByZWdpc3RlclxuICAgICAgZm9yIChjb25zdCBbc2VydmljZU5hbWUsIGRlZmluaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5yZWdpc3RlcikpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ1Byb2Nlc3NpbmcgbWljcm9zZXJ2aWNlJywge1xuICAgICAgICAgIHNlcnZpY2VOYW1lLFxuICAgICAgICAgIHRpZXNDb3VudDogZGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICAgICAgICBsYW1iZGFzQ291bnQ6IGRlZmluaXRpb24ubGFtYmRhcy5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKHNlcnZpY2VOYW1lLCBkZWZpbml0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHNlcnZpY2VDb3VudDogT2JqZWN0LmtleXMoY29uZmlnLnJlZ2lzdGVyKS5sZW5ndGgsXG4gICAgICAgIHRvdGFsTGFtYmRhczogdGhpcy5yZWdpc3RyYXIuZ2V0TGFtYmRhSWRzKCkubGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIG1pY3Jvc2VydmljZSByZWdpc3RyYXInLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKlxuICAgKiBHZXRzIHRoZSBMYW1iZGEgSUQgZnJvbSB0aGUgTEFNQkRBX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXRcbiAgICogaXMgc2V0IGJ5IHRoZSBDREsgc3RhY2sgZHVyaW5nIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTEFNQkRBX0lEIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxhbWJkYUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbGFtYmRhSWQgPSBwcm9jZXNzLmVudi5MQU1CREFfSUQ7XG5cbiAgICBpZiAoIWxhbWJkYUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IGZvdW5kLiAnICtcbiAgICAgICAgJ1RoaXMgc2hvdWxkIGJlIHNldCBieSB0aGUgQ0RLIHN0YWNrIGR1cmluZyBkZXBsb3ltZW50LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdMYW1iZGEgSUQgcmVzb2x2ZWQgZnJvbSBlbnZpcm9ubWVudCcsIHsgbGFtYmRhSWQgfSk7XG4gICAgcmV0dXJuIGxhbWJkYUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBESSBjb250YWluZXIgZm9yIHRoZSBzcGVjaWZpZWQgTGFtYmRhLlxuICAgKlxuICAgKiBVc2VzIHRoZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gbG9vayB1cCB0aGUgYXBwcm9wcmlhdGUgREkgY29udGFpbmVyXG4gICAqIGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uIGJhc2VkIG9uIGl0cyBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKVxuICAgKiBAcmV0dXJucyBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgTGFtYmRhJ3MgbWljcm9zZXJ2aWNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29udGFpbmVyIG5vdCBmb3VuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5yZWdpc3RyYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5yZWdpc3RyYXIuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RJIGNvbnRhaW5lciByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICBsYW1iZGFJZCxcbiAgICAgICAgc2VydmljZU5hbWU6IHRoaXMucmVnaXN0cmFyLmdldFNlcnZpY2VGb3JMYW1iZGEobGFtYmRhSWQpLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgREkgY29udGFpbmVyIGZvciBMYW1iZGEnLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgREkgY29udGFpbmVyIGZvciBMYW1iZGEgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBMYW1iZGEgaGFuZGxlciB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKlxuICAgKiBVc2VzIHRoZSBMYW1iZGFIYW5kbGVyRmFjdG9yeSB0byBjcmVhdGUgYSBoYW5kbGVyIGluc3RhbmNlIHdpdGhcbiAgICogYXV0b21hdGljIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGZyb20gdGhlIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSURcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIExhbWJkYSBoYW5kbGVyIGluc3RhbmNlIHJlYWR5IGZvciBleGVjdXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSGFuZGxlcldpdGhESShsYW1iZGFJZDogc3RyaW5nLCBjb250YWluZXI6IGFueSkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBMYW1iZGEgaGFuZGxlciB3aXRoIERJJywgeyBsYW1iZGFJZCB9KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBJbml0aWFsaXplIGhhbmRsZXIgZmFjdG9yeSBpZiBub3QgYWxyZWFkeSBkb25lXG4gICAgICBpZiAoIXRoaXMuaGFuZGxlckZhY3RvcnkpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyRmFjdG9yeSA9IG5ldyBMYW1iZGFIYW5kbGVyRmFjdG9yeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5kIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgdGhpcyBJRFxuICAgICAgY29uc3QgbGFtYmRhRGVmaW5pdGlvbiA9IHRoaXMuZmluZExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuXG4gICAgICAvLyBDcmVhdGUgaGFuZGxlciB3aXRoIERJXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyRmFjdG9yeS5jcmVhdGUobGFtYmRhRGVmaW5pdGlvbiwgY29udGFpbmVyKTtcblxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnTGFtYmRhIGhhbmRsZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBkZXBlbmRlbmN5Q291bnQ6IGxhbWJkYURlZmluaXRpb24udGllcy5sZW5ndGgsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGhhbmRsZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgTGFtYmRhIGhhbmRsZXInLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgTGFtYmRhIGhhbmRsZXIgZm9yICcke2xhbWJkYUlkfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIExhbWJkYSBkZWZpbml0aW9uIGJ5IElEIGZyb20gdGhlIHByb2Nlc3NlZCBtaWNyb3NlcnZpY2VzLlxuICAgKlxuICAgKiBVc2VzIHRoZSBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgdG8gcmV0cmlldmUgdGhlIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCB0byBmaW5kXG4gICAqIEByZXR1cm5zIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgTGFtYmRhIGRlZmluaXRpb24gbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZpbmRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucmVnaXN0cmFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pY3Jvc2VydmljZSByZWdpc3RyYXIgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJhci5nZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmQgZm9yIElEICcke2xhbWJkYUlkfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuLy8gUmUtZXhwb3J0IGJhc2Ugc2VydmljZXMgZnJvbSBQdXJlbm93XG5leHBvcnQgKiBmcm9tICdAd29ya3RpZi9wdXJlbm93L2xhbWJkYSc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzXG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtZXh0ZW5zaW9ucyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLWV4dGVuc2lvbnMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUtZXh0ZW5zaW9ucy50eXBlcyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcbmltcG9ydCB7XG4gIEJlZm9yZUluc3RhbmNlLFxuICBjYXRjaEluamVjdG9yLFxuICBpbmplY3RCZWZvcmUsXG4gIGxvZ2dlckluamVjdG9yLFxuICBMb2dnZXJMZXZlbCxcbiAgTWF5YmUsXG4gIHB1cmFibGUsXG59IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcblxuaW1wb3J0IHR5cGUgeyBSdW50aW1lQ29uZmlnLCBSdW50aW1lU3RhY2tDb25maWcgfSBmcm9tICcuL3J1bnRpbWUtZXh0ZW5zaW9ucy50eXBlcyc7XG5cbi8qKlxuICogUnVudGltZUV4dGVuc2lvbnMgc2VydmljZSBwcm92aWRlcyBydW50aW1lLXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdGhhdCBleHRlbmRzXG4gKiBwdXJlbm93J3MgYmFzZSBjYXBhYmlsaXRpZXMuIFRoaXMgc2VydmljZSBmb2xsb3dzIHB1cmVub3cncyBhcmNoaXRlY3R1cmFsIHBhdHRlcm5zXG4gKiBmb3IgQVdTIGludGVncmF0aW9ucyBhbmQgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogS2V5IHJlc3BvbnNpYmlsaXRpZXM6XG4gKiAtIEVuaGFuY2UgZGV2ZWxvcG1lbnQgc2VydmVyIHdpdGggcnVudGltZS1zcGVjaWZpYyBmZWF0dXJlc1xuICogLSBQcm92aWRlIHJ1bnRpbWUtc3BlY2lmaWMgYnVpbGQgb3B0aW1pemF0aW9uc1xuICogLSBDb25maWd1cmUgUnVudGltZSBDb3JlIHN0YWNrIGRlcGxveW1lbnRcbiAqIC0gRXh0ZW5kIHB1cmVub3cgZnVuY3Rpb25hbGl0eSB3aXRob3V0IHJlcGxhY2luZyBpdFxuICovXG5AcHVyYWJsZSgpXG5leHBvcnQgY2xhc3MgUnVudGltZUV4dGVuc2lvbnMgLyppbXBsZW1lbnRzIExvZ2dlckludGVyZmFjZSAqL3tcbiAgLy8gLyoqXG4gIC8vICAqIExvZ2dlciBpbnN0YW5jZSBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgLy8gICogVXNlcyBwdXJlbm93J3MgbG9nZ2luZyBwYXR0ZXJucyB3aXRoIEFXUyBwcm92aWRlci5cbiAgLy8gICovXG4gIC8vIGxvZ2dlckluc3RhbmNlID0gbG9nZ2VyKHtcbiAgLy8gICBzZXJ2aWNlTmFtZTogJ1J1bnRpbWUgfCBFeHRlbnNpb25zIFNlcnZpY2UnLFxuICAvLyAgIGxvZ0Zvcm1hdHRlcjogbmV3IFB1cmVub3dMb2dnZXJGb3JtYXR0ZXIoe1xuICAvLyAgICAgbG9nc1Byb3ZpZGVyOiBQdXJlbm93TG9nRm9ybWF0dGVyUHJvdmlkZXIuQXdzLFxuICAvLyAgIH0pIGFzIGFueSxcbiAgLy8gfSk7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJ1bnRpbWVDb25maWc6IFJ1bnRpbWVDb25maWcgPSB7XG4gICAgZW5hYmxlUnVudGltZUNvcmVTdGFjazogZmFsc2UsIC8vIEBub3RlOiBjcml0aWNhbCBOT1QgRVhQRUNURUQgdmFsdWUsIGNhbiBiZSByZW1vdmVkIHRvIGNsZWFuIHVwIHJlcG9cbiAgICBydW50aW1lV2ViTW9kZTogJ2RldmVsb3BtZW50JyxcbiAgICBhZGRpdGlvbmFsRmVhdHVyZXM6IFtdLFxuICAgIGRldlNlcnZlckVuaGFuY2VtZW50czoge1xuICAgICAgaG90UmVsb2FkOiB0cnVlLFxuICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZzogZmFsc2UsXG4gICAgfSxcbiAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgIGJ1bmRsZUFuYWx5c2lzOiBmYWxzZSxcbiAgICAgIHRyZWVzaGFraW5nOiB0cnVlLFxuICAgICAgY29kZU1pbmlmaWNhdGlvbjogdHJ1ZSxcbiAgICB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgICogVXNlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBwYXR0ZXJuIGNvbnNpc3RlbnQgd2l0aCBwdXJlbm93IHNlcnZpY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBydW50aW1lIGV4dGVuc2lvbnNcbiAgICB0aGlzLmluaXRpYWxpemVSdW50aW1lRXh0ZW5zaW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZSBleHRlbnNpb25zIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICAgKiBTZXRzIHVwIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMgdGhhdCBleHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5LlxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBJbml0aWFsaXplJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBJbml0aWFsaXplIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSdW50aW1lRXh0ZW5zaW9ucyhiZWZvcmVJbnN0YW5jZT86IEJlZm9yZUluc3RhbmNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3codGhpcy5ydW50aW1lQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnSW5pdGlhbGl6aW5nIHJ1bnRpbWUgZXh0ZW5zaW9ucycsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcblxuICAgIC8vIFJ1bnRpbWUgZXh0ZW5zaW9ucyBhcmUgbm93IHJlYWR5XG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3cobnVsbCwge1xuICAgICAgbWVzc2FnZTogJ1J1bnRpbWUgZXh0ZW5zaW9ucyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lLXNwZWNpZmljIGZlYXR1cmVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cncyBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2ZXJDb25maWcgLSBCYXNlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gcHVyZW5vd1xuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqIEByZXR1cm5zIFJ1bnRpbWUgQ29yZSBzZXJ2ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBFbmhhbmNlIERldiBTZXJ2ZXInKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEVuaGFuY2UgRGV2IFNlcnZlciB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIGVuaGFuY2VEZXZTZXJ2ZXIoXG4gICAgc2VydmVyQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGVuaGFuY2VtZW50cyA9IHRoaXMucnVudGltZUNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHM7XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IHNlcnZlckNvbmZpZywgZW5oYW5jZW1lbnRzIH0sIHtcbiAgICAgIG1lc3NhZ2U6ICdFbmhhbmNpbmcgZGV2ZWxvcG1lbnQgc2VydmVyIHdpdGggcnVudGltZSBmZWF0dXJlcycsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuRGVidWcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBydW50aW1lQ29yZUNvbmZpZyA9IHtcbiAgICAgIC4uLnNlcnZlckNvbmZpZyxcbiAgICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIGVuaGFuY2VtZW50c1xuICAgICAgcnVudGltZToge1xuICAgICAgICBob3RSZWxvYWQ6IGVuaGFuY2VtZW50cz8uaG90UmVsb2FkID8/IHRydWUsXG4gICAgICAgIGRlYnVnTW9kZTogZW5oYW5jZW1lbnRzPy5kZWJ1Z01vZGUgPz8gZmFsc2UsXG4gICAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZzogZW5oYW5jZW1lbnRzPy5wZXJmb3JtYW5jZU1vbml0b3JpbmcgPz8gZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhydW50aW1lQ29yZUNvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ0RldmVsb3BtZW50IHNlcnZlciBSdW50aW1lIENvcmUgd2l0aCBydW50aW1lIGZlYXR1cmVzJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWVDb3JlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplIGJ1aWxkIHByb2Nlc3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIG9wdGltaXphdGlvbnMuXG4gICAqIEV4dGVuZHMgcHVyZW5vdydzIGJ1aWxkIHByb2Nlc3Mgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZENvbmZpZyAtIEJhc2UgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tIHB1cmVub3dcbiAgICogQHBhcmFtIGJlZm9yZUluc3RhbmNlIC0gTG9nZ2VyIGluc3RhbmNlIGZvciB0cmFja2luZ1xuICAgKiBAcmV0dXJucyBPcHRpbWl6ZWQgYnVpbGQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBPcHRpbWl6ZSBCdWlsZCcpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgT3B0aW1pemUgQnVpbGQgfCBFeGNlcHRpb24gKGVycm9yKScpLFxuICApXG4gIHB1YmxpYyBhc3luYyBvcHRpbWl6ZUJ1aWxkKFxuICAgIGJ1aWxkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG9wdGltaXphdGlvbnMgPSB0aGlzLnJ1bnRpbWVDb25maWcuYnVpbGRPcHRpbWl6YXRpb25zO1xuXG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBidWlsZENvbmZpZywgb3B0aW1pemF0aW9ucyB9LCB7XG4gICAgICBtZXNzYWdlOiAnQXBwbHlpbmcgcnVudGltZS1zcGVjaWZpYyBidWlsZCBvcHRpbWl6YXRpb25zJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdGltaXplZENvbmZpZyA9IHtcbiAgICAgIC4uLmJ1aWxkQ29uZmlnLFxuICAgICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgb3B0aW1pemF0aW9uc1xuICAgICAgcnVudGltZToge1xuICAgICAgICBidW5kbGVBbmFseXNpczogb3B0aW1pemF0aW9ucz8uYnVuZGxlQW5hbHlzaXMgPz8gZmFsc2UsXG4gICAgICAgIHRyZWVzaGFraW5nOiBvcHRpbWl6YXRpb25zPy50cmVlc2hha2luZyA/PyB0cnVlLFxuICAgICAgICBjb2RlTWluaWZpY2F0aW9uOiBvcHRpbWl6YXRpb25zPy5jb2RlTWluaWZpY2F0aW9uID8/IHRydWUsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhvcHRpbWl6ZWRDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdCdWlsZCBjb25maWd1cmF0aW9uIG9wdGltaXplZCB3aXRoIHJ1bnRpbWUgZmVhdHVyZXMnLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0aW1pemVkQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBSdW50aW1lIENvcmUgc3RhY2sgZm9yIHJ1bnRpbWUgZGVwbG95bWVudC5cbiAgICogRXh0ZW5kcyBwdXJlbm93J3MgdHdvLXN0YWNrIGFyY2hpdGVjdHVyZSB0byB0aHJlZSBzdGFja3MuXG4gICAqXG4gICAqIEBwYXJhbSBiYXNlU3RhY2tDb25maWcgLSBCYXNlIHN0YWNrIGNvbmZpZ3VyYXRpb24gZnJvbSBwdXJlbm93XG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICogQHJldHVybnMgUnVudGltZSBzdGFjayBjb25maWd1cmF0aW9uIGZvciBSdW50aW1lIENvcmUgc3RhY2tcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjaycpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjayB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIGNvbmZpZ3VyZVJ1bnRpbWVDb3JlU3RhY2soXG4gICAgYmFzZVN0YWNrQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8TWF5YmU8UnVudGltZVN0YWNrQ29uZmlnPj4ge1xuICAgIGlmICghdGhpcy5ydW50aW1lQ29uZmlnLmVuYWJsZVJ1bnRpbWVDb3JlU3RhY2spIHtcbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KG51bGwsIHtcbiAgICAgICAgbWVzc2FnZTogJ1J1bnRpbWUgQ29yZSBzdGFjayBkZXBsb3ltZW50IGlzIGRpc2FibGVkJyxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KGJhc2VTdGFja0NvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ0NvbmZpZ3VyaW5nIFJ1bnRpbWUgQ29yZSBzdGFjayBmb3IgcnVudGltZSBkZXBsb3ltZW50JyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJ1bnRpbWVTdGFja0NvbmZpZzogUnVudGltZVN0YWNrQ29uZmlnID0ge1xuICAgICAgc3RhY2tOYW1lOiBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30tcnVudGltZWAsXG4gICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdMYW1iZGEnLFxuICAgICAgICAgIG5hbWU6ICdSdW50aW1lV2ViSGFuZGxlcicsXG4gICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICBydW50aW1lOiAnbm9kZWpzMTgueCcsXG4gICAgICAgICAgICB0aW1lb3V0OiAzMCxcbiAgICAgICAgICAgIG1lbW9yeVNpemU6IDUxMixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGRlcGVuZGVuY2llczogW1xuICAgICAgICBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30taW5mcmFzdHJ1Y3R1cmVgLFxuICAgICAgICBgJHtiYXNlU3RhY2tDb25maWcuc3RhY2tOYW1lIHx8ICdwdXJlbm93J30tcnVudGltZS1iYXNlYCxcbiAgICAgIF0sXG4gICAgICBvdXRwdXRzOiB7XG4gICAgICAgIFJ1bnRpbWVTdGFja0FybjogJ3J1bnRpbWUtc3RhY2stYXJuJyxcbiAgICAgICAgUnVudGltZVdlYkVuZHBvaW50OiAncnVudGltZS13ZWItZW5kcG9pbnQnLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3cocnVudGltZVN0YWNrQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnUnVudGltZSBDb3JlIHN0YWNrIGNvbmZpZ3VyYXRpb24gY3JlYXRlZCcsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcblxuICAgIHJldHVybiBydW50aW1lU3RhY2tDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbi5cbiAgICogQWxsb3dzIGR5bmFtaWMgY29uZmlndXJhdGlvbiBvZiBydW50aW1lIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gTmV3IHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IFVwZGF0ZSBDb25maWd1cmF0aW9uJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBVcGRhdGUgQ29uZmlndXJhdGlvbiB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIHVwZGF0ZUNvbmZpZ3VyYXRpb24oXG4gICAgY29uZmlnOiBQYXJ0aWFsPFJ1bnRpbWVDb25maWc+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgb2xkQ29uZmlnOiB0aGlzLnJ1bnRpbWVDb25maWcsIG5ld0NvbmZpZzogY29uZmlnIH0sIHtcbiAgICAgIG1lc3NhZ2U6ICdVcGRhdGluZyBydW50aW1lIGNvbmZpZ3VyYXRpb24nLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgIH0pO1xuXG4gICAgLy8gTWVyZ2UgbmV3IGNvbmZpZ3VyYXRpb24gd2l0aCBleGlzdGluZyBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5ydW50aW1lQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzOiB7XG4gICAgICAgIC4uLnRoaXMucnVudGltZUNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHMsXG4gICAgICAgIC4uLmNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHMsXG4gICAgICB9LFxuICAgICAgYnVpbGRPcHRpbWl6YXRpb25zOiB7XG4gICAgICAgIC4uLnRoaXMucnVudGltZUNvbmZpZy5idWlsZE9wdGltaXphdGlvbnMsXG4gICAgICAgIC4uLmNvbmZpZy5idWlsZE9wdGltaXphdGlvbnMsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh0aGlzLnJ1bnRpbWVDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdSdW50aW1lIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCcsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAqIFByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgdG8gcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZ3VyYXRpb24oKTogUmVhZG9ubHk8UnVudGltZUNvbmZpZz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMucnVudGltZUNvbmZpZyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bnRpbWUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2hlY2tpbmcgZmVhdHVyZSBmbGFncy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBmZWF0dXJlIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0ZlYXR1cmVFbmFibGVkKGZlYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzPy5pbmNsdWRlcyhmZWF0dXJlKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcnVudGltZSBmZWF0dXJlLlxuICAgKiBBZGRzIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gZW5hYmxlXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRW5hYmxlIEZlYXR1cmUnKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEVuYWJsZSBGZWF0dXJlIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgZW5hYmxlRmVhdHVyZShcbiAgICBmZWF0dXJlOiBzdHJpbmcsXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZSkpIHtcbiAgICAgIHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgPSBbXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIHx8IFtdKSxcbiAgICAgICAgZmVhdHVyZSxcbiAgICAgIF07XG5cbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgZmVhdHVyZSwgZW5hYmxlZEZlYXR1cmVzOiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgZW5hYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgZmVhdHVyZSB9LCB7XG4gICAgICAgIG1lc3NhZ2U6IGBSdW50aW1lIGZlYXR1cmUgJyR7ZmVhdHVyZX0nIGlzIGFscmVhZHkgZW5hYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHJ1bnRpbWUgZmVhdHVyZS5cbiAgICogUmVtb3ZlcyBmZWF0dXJlIGZyb20gdGhlIGxpc3Qgb2YgZW5hYmxlZCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gZGlzYWJsZVxuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IERpc2FibGUgRmVhdHVyZScpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRGlzYWJsZSBGZWF0dXJlIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgZGlzYWJsZUZlYXR1cmUoXG4gICAgZmVhdHVyZTogc3RyaW5nLFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZSkpIHtcbiAgICAgIHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgPSAodGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyB8fCBbXSlcbiAgICAgICAgLmZpbHRlcihmID0+IGYgIT09IGZlYXR1cmUpO1xuXG4gICAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IGZlYXR1cmUsIGVuYWJsZWRGZWF0dXJlczogdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyB9LCB7XG4gICAgICAgIG1lc3NhZ2U6IGBSdW50aW1lIGZlYXR1cmUgJyR7ZmVhdHVyZX0nIGRpc2FibGVkYCxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBmZWF0dXJlIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgaXMgYWxyZWFkeSBkaXNhYmxlZGAsXG4gICAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZUNvbmZpZyB7XG4gIC8qKiBFbmFibGUgUnVudGltZSBDb3JlIHN0YWNrIGRlcGxveW1lbnQgKi9cbiAgZW5hYmxlUnVudGltZUNvcmVTdGFjaz86IGJvb2xlYW47XG4gIC8qKiBSdW50aW1lIHdlYiBtb2RlIGNvbmZpZ3VyYXRpb24gKi9cbiAgcnVudGltZVdlYk1vZGU/OiAnZGV2ZWxvcG1lbnQnIHwgJ3Byb2R1Y3Rpb24nO1xuICAvKiogQWRkaXRpb25hbCBydW50aW1lIGZlYXR1cmVzIHRvIGVuYWJsZSAqL1xuICBhZGRpdGlvbmFsRmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgLyoqIERldmVsb3BtZW50IHNlcnZlciBlbmhhbmNlbWVudHMgKi9cbiAgZGV2U2VydmVyRW5oYW5jZW1lbnRzPzoge1xuICAgIGhvdFJlbG9hZD86IGJvb2xlYW47XG4gICAgZGVidWdNb2RlPzogYm9vbGVhbjtcbiAgICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc/OiBib29sZWFuO1xuICB9O1xuICAvKiogQnVpbGQgb3B0aW1pemF0aW9ucyAqL1xuICBidWlsZE9wdGltaXphdGlvbnM/OiB7XG4gICAgYnVuZGxlQW5hbHlzaXM/OiBib29sZWFuO1xuICAgIHRyZWVzaGFraW5nPzogYm9vbGVhbjtcbiAgICBjb2RlTWluaWZpY2F0aW9uPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuLyoqXG4gKiBSdW50aW1lIHN0YWNrIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBSdW50aW1lIENvcmUgc3RhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVN0YWNrQ29uZmlnIHtcbiAgLyoqIE5hbWUgb2YgdGhlIHJ1bnRpbWUgc3RhY2sgKi9cbiAgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIC8qKiBBV1MgcmVzb3VyY2VzIHRvIGluY2x1ZGUgaW4gdGhlIHN0YWNrICovXG4gIHJlc291cmNlczogUnVudGltZVJlc291cmNlW107XG4gIC8qKiBEZXBlbmRlbmNpZXMgb24gb3RoZXIgc3RhY2tzICovXG4gIGRlcGVuZGVuY2llczogc3RyaW5nW107XG4gIC8qKiBTdGFjayBvdXRwdXRzIHRvIGV4cG9ydCAqL1xuICBvdXRwdXRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJ1bnRpbWUtc3BlY2lmaWMgQVdTIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVJlc291cmNlIHtcbiAgLyoqIFJlc291cmNlIHR5cGUgKGUuZy4sICdMYW1iZGEnLCAnRHluYW1vREInLCAnUzMnKSAqL1xuICB0eXBlOiBzdHJpbmc7XG4gIC8qKiBSZXNvdXJjZSBuYW1lICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFJlc291cmNlIGNvbmZpZ3VyYXRpb24gKi9cbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIERldmVsb3BtZW50IHNlcnZlciBlbmhhbmNlbWVudCBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldlNlcnZlckVuaGFuY2VtZW50cyB7XG4gIC8qKiBFbmFibGUgaG90IG1vZHVsZSByZXBsYWNlbWVudCAqL1xuICBob3RSZWxvYWQ6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgZGVidWcgbW9kZSB3aXRoIGFkZGl0aW9uYWwgbG9nZ2luZyAqL1xuICBkZWJ1Z01vZGU6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqL1xuICBwZXJmb3JtYW5jZU1vbml0b3Jpbmc6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQnVpbGQgb3B0aW1pemF0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPcHRpbWl6YXRpb25zIHtcbiAgLyoqIEVuYWJsZSBidW5kbGUgYW5hbHlzaXMgKi9cbiAgYnVuZGxlQW5hbHlzaXM6IGJvb2xlYW47XG4gIC8qKiBFbmFibGUgdHJlZSBzaGFraW5nICovXG4gIHRyZWVzaGFraW5nOiBib29sZWFuO1xuICAvKiogRW5hYmxlIGNvZGUgbWluaWZpY2F0aW9uICovXG4gIGNvZGVNaW5pZmljYXRpb246IGJvb2xlYW47XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBSZS1leHBvcnQgYmFzZSBidW5kbGUgZnVuY3Rpb25hbGl0eSBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgYnVuZGxlIGNvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS5jb250YWluZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLmNvbnRhaW5lci50eXBlcyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuaW1wb3J0IHsgcHVyYWJsZSwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IFJ1bnRpbWVFeHRlbnNpb25zIH0gZnJvbSAnQGNvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zJztcblxuLyoqXG4gKiBSdW50aW1lQ29udGFpbmVyIHByb3ZpZGVzIHJ1bnRpbWUtc3BlY2lmaWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gYmluZGluZ3NcbiAqIHVzaW5nIFB1cmVDb250YWluZXIgZnJvbSBAd29ya3RpZi91dGlscy4gVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm5cbiAqIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZSB3b3Jrc3BhY2UuXG4gKlxuICogVGhlIGNvbnRhaW5lciBhZGRzIHJ1bnRpbWUgc2VydmljZXMgd2hpbGUgYmVpbmcgY29tcGF0aWJsZSB3aXRoXG4gKiBwdXJlbm93J3MgYXJjaGl0ZWN0dXJhbCBwYXR0ZXJucy5cbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb250YWluZXIge1xuICBwcml2YXRlIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFB1cmVDb250YWluZXI8c3RyaW5nPih7XG4gICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgIH0pO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bnRpbWVCaW5kaW5ncygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlIGJpbmRpbmdzLlxuICAgKiBSZWdpc3RlcnMgcnVudGltZSBzZXJ2aWNlcyB3aXRoIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVSdW50aW1lQmluZGluZ3MoKTogdm9pZCB7XG4gICAgLy8gUmVnaXN0ZXIgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZSBhcyBzaW5nbGV0b25cbiAgICB0aGlzLmNvbnRhaW5lci50aWVTaW5nbGV0b24oe1xuICAgICAgJ1J1bnRpbWVFeHRlbnNpb25zJzoge1xuICAgICAgICBpbnN0YW5jZTogUnVudGltZUV4dGVuc2lvbnMsXG4gICAgICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBjb250YWluZXIgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRDb250YWluZXIoKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHNlcnZpY2UgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQ+KHNlcnZpY2VJZDogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqIFV0aWxpdHkgbWV0aG9kIGZvciBzZXJ2aWNlIHZhbGlkYXRpb24uXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKHNlcnZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGZvciBSdW50aW1lLXNwZWNpZmljIERlcGVuZGVuY3kgSW5qZWN0aW9uIGJpbmRpbmdzLlxuICogRXh0ZW5kcyBwdXJlbm93J3MgREkgYmluZGluZ3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUnVudGltZURpIHtcbiAgLy8gUnVudGltZSBFeHRlbnNpb25zIFNlcnZpY2VcbiAgUnVudGltZUV4dGVuc2lvbnNTZXJ2aWNlQmluZCA9ICdydW50aW1lX2V4dGVuc2lvbnNfc2VydmljZV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENvbmZpZ3VyYXRpb25cbiAgUnVudGltZUNvbmZpZ0JpbmQgPSAncnVudGltZV9jb25maWdfYmluZCcsXG5cbiAgLy8gUnVudGltZSBEZXBsb3ltZW50IFN0cmF0ZWd5XG4gIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3lCaW5kID0gJ3J1bnRpbWVfZGVwbG95bWVudF9zdHJhdGVneV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENMSSBFeHRlbnNpb25zXG4gIFJ1bnRpbWVDbGlCaW5kID0gJ3J1bnRpbWVfY2xpX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgU3RhY2sgQ29uZmlndXJhdGlvblxuICBSdW50aW1lU3RhY2tDb25maWdCaW5kID0gJ3J1bnRpbWVfc3RhY2tfY29uZmlnX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgV2ViIEhhbmRsZXIgRmFjdG9yeVxuICBSdW50aW1lV2ViSGFuZGxlckZhY3RvcnlCaW5kID0gJ3J1bnRpbWVfd2ViX2hhbmRsZXJfZmFjdG9yeV9iaW5kJyxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJpMkJBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFILEVBQUssUUFBU0UsQ0FBUSxHQUVsREgsRUFBUUcsRUFBVUYsQ0FBSSxFQUNsQixPQUFPQSxFQUFLLFFBQVksTUFDeEJBLEVBQUssUUFB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QUEsSUFETixXQUFRLEdBQ0liLEdDekJiLElBQUFjLEdBQU8sTzlOT1BDLEVBQUFDLEVBQWNDLEVBdkJkLGdCK05BQSxJQUFBQyxFQUFBLEdBQUFDLEdBQUFELEVBQUEsc0JBQUFFLEdBQUEsY0FBQUMsS0FnQkEsSUFBQUMsR0FBTyxPQUdQQyxFQUFBTCxFQUFjLG9DQ0hkLElBQUFNLEdBQU8sT0FFUEMsR0FBdUMsMEJBWWhDLElBQU1DLEdBQU4sS0FBdUIsQ0FHNUIsYUFBYyxDQUNaLEtBQUssVUFBWSxJQUFJLGlCQUFzQixDQUN6QyxhQUFjLFdBQ2hCLENBQUMsRUFDRCxLQUFLLDBCQUEwQixDQUNqQyxDQU1RLDJCQUFrQyxDQUV4QyxLQUFLLFVBQVUsYUFBYSxDQUMxQixrQkFBcUIsQ0FDbkIsU0FBVUMsRUFDVixhQUFjLENBQUMsQ0FDakIsQ0FDRixDQUFDLENBQ0gsQ0FNTyxjQUFzQyxDQUMzQyxPQUFPLEtBQUssU0FDZCxDQU1PLFFBQVdDLEVBQXNCLENBQ3RDLE9BQU8sS0FBSyxVQUFVLElBQUlBLENBQVMsQ0FDckMsQ0FNTyxhQUFhQSxFQUE0QixDQUM5QyxHQUFJLENBQ0YsWUFBSyxVQUFVLElBQUlBLENBQVMsRUFDckIsRUFDVCxNQUFRLENBQ04sTUFBTyxFQUNULENBQ0YsQ0FDRixFQXBEYUYsR0FBTkcsRUFBQSxJQUROLFlBQVEsR0FDSUgsSUNkYixJQUFBSSxHQUFPLE9BT1dDLFFBRWhCQSxFQUFBLDZCQUErQixrQ0FHL0JBLEVBQUEsa0JBQW9CLHNCQUdwQkEsRUFBQSw4QkFBZ0MsbUNBR2hDQSxFQUFBLGVBQWlCLG1CQUdqQkEsRUFBQSx1QkFBeUIsNEJBR3pCQSxFQUFBLDZCQUErQixtQ0FqQmZBLFFBQUEsSWpPR2xCQyxFQUFBQyxFQUFjQyxFQTFCZCIsCiAgIm5hbWVzIjogWyJyZXF1aXJlX1JlZmxlY3QiLCAiX19jb21tb25KU01pbiIsICJSZWZsZWN0IiwgImZhY3RvcnkiLCAicm9vdCIsICJzbG9wcHlNb2RlVGhpcyIsICJleHBvcnRlciIsICJtYWtlRXhwb3J0ZXIiLCAidGFyZ2V0IiwgInByZXZpb3VzIiwgImtleSIsICJ2YWx1ZSIsICJmdW5jdGlvblRoaXMiLCAiaW5kaXJlY3RFdmFsVGhpcyIsICJoYXNPd24iLCAic3VwcG9ydHNTeW1ib2wiLCAidG9QcmltaXRpdmVTeW1ib2wiLCAiaXRlcmF0b3JTeW1ib2wiLCAic3VwcG9ydHNDcmVhdGUiLCAic3VwcG9ydHNQcm90byIsICJkb3duTGV2ZWwiLCAiSGFzaE1hcCIsICJNYWtlRGljdGlvbmFyeSIsICJtYXAiLCAiZnVuY3Rpb25Qcm90b3R5cGUiLCAiX01hcCIsICJDcmVhdGVNYXBQb2x5ZmlsbCIsICJfU2V0IiwgIkNyZWF0ZVNldFBvbHlmaWxsIiwgIl9XZWFrTWFwIiwgIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsICJyZWdpc3RyeVN5bWJvbCIsICJtZXRhZGF0YVJlZ2lzdHJ5IiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJtZXRhZGF0YVByb3ZpZGVyIiwgIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCAiZGVjb3JhdGUiLCAiZGVjb3JhdG9ycyIsICJwcm9wZXJ0eUtleSIsICJhdHRyaWJ1dGVzIiwgIklzVW5kZWZpbmVkIiwgIklzQXJyYXkiLCAiSXNDb25zdHJ1Y3RvciIsICJEZWNvcmF0ZUNvbnN0cnVjdG9yIiwgIklzT2JqZWN0IiwgIklzTnVsbCIsICJUb1Byb3BlcnR5S2V5IiwgIkRlY29yYXRlUHJvcGVydHkiLCAibWV0YWRhdGEiLCAibWV0YWRhdGFLZXkiLCAibWV0YWRhdGFWYWx1ZSIsICJkZWNvcmF0b3IiLCAiSXNQcm9wZXJ0eUtleSIsICJPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImhhc01ldGFkYXRhIiwgIk9yZGluYXJ5SGFzTWV0YWRhdGEiLCAiaGFzT3duTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeUdldE1ldGFkYXRhIiwgImdldE93bk1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5TWV0YWRhdGFLZXlzIiwgImdldE93bk1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyIsICJkZWxldGVNZXRhZGF0YSIsICJwcm92aWRlciIsICJHZXRNZXRhZGF0YVByb3ZpZGVyIiwgImkiLCAiZGVjb3JhdGVkIiwgImRlc2NyaXB0b3IiLCAiTWV0YWRhdGFLZXkiLCAiTyIsICJQIiwgInBhcmVudCIsICJPcmRpbmFyeUdldFByb3RvdHlwZU9mIiwgIlRvQm9vbGVhbiIsICJNZXRhZGF0YVZhbHVlIiwgIm93bktleXMiLCAicGFyZW50S2V5cyIsICJzZXQiLCAia2V5cyIsICJfaSIsICJvd25LZXlzXzEiLCAiaGFzS2V5IiwgIl9hIiwgInBhcmVudEtleXNfMSIsICJUeXBlIiwgIngiLCAiSXNTeW1ib2wiLCAiVG9QcmltaXRpdmUiLCAiaW5wdXQiLCAiUHJlZmVycmVkVHlwZSIsICJoaW50IiwgImV4b3RpY1RvUHJpbSIsICJHZXRNZXRob2QiLCAicmVzdWx0IiwgIk9yZGluYXJ5VG9QcmltaXRpdmUiLCAidG9TdHJpbmdfMSIsICJJc0NhbGxhYmxlIiwgInZhbHVlT2YiLCAidG9TdHJpbmdfMiIsICJhcmd1bWVudCIsICJUb1N0cmluZyIsICJTYW1lVmFsdWVaZXJvIiwgInkiLCAiViIsICJmdW5jIiwgIkdldEl0ZXJhdG9yIiwgIm9iaiIsICJtZXRob2QiLCAiaXRlcmF0b3IiLCAiSXRlcmF0b3JWYWx1ZSIsICJpdGVyUmVzdWx0IiwgIkl0ZXJhdG9yU3RlcCIsICJJdGVyYXRvckNsb3NlIiwgImYiLCAicHJvdG8iLCAicHJvdG90eXBlIiwgInByb3RvdHlwZVByb3RvIiwgImNvbnN0cnVjdG9yIiwgIkNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAiZmFsbGJhY2siLCAiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsICJmaXJzdCIsICJzZWNvbmQiLCAicmVzdCIsICJ0YXJnZXRQcm92aWRlck1hcCIsICJyZWdpc3RyeSIsICJyZWdpc3RlclByb3ZpZGVyIiwgImdldFByb3ZpZGVyIiwgInNldFByb3ZpZGVyIiwgImdldFByb3ZpZGVyTm9DYWNoZSIsICJuZXh0IiwgInByb3ZpZGVyTWFwIiwgImhhc1Byb3ZpZGVyIiwgImV4aXN0aW5nUHJvdmlkZXIiLCAidGFyZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlEZWxldGVNZXRhZGF0YSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwgIkNyZWF0ZSIsICJjcmVhdGVkVGFyZ2V0TWV0YWRhdGEiLCAibWV0YWRhdGFNYXAiLCAia2V5c09iaiIsICJrIiwgIm5leHRWYWx1ZSIsICJlIiwgInJlZmxlY3QiLCAibWV0YWRhdGFPd25lciIsICJtZXRhZGF0YVByb3BlcnR5U2V0IiwgInJlZ2lzdGVyZWRQcm92aWRlciIsICJjYWNoZVNlbnRpbmVsIiwgImFycmF5U2VudGluZWwiLCAiTWFwSXRlcmF0b3IiLCAidmFsdWVzIiwgInNlbGVjdG9yIiwgImluZGV4IiwgImVycm9yIiwgIk1hcCIsICJzaXplIiwgImdldEtleSIsICJnZXRWYWx1ZSIsICJnZXRFbnRyeSIsICJpbnNlcnQiLCAiXyIsICJTZXQiLCAiVVVJRF9TSVpFIiwgInJvb3RLZXkiLCAiQ3JlYXRlVW5pcXVlS2V5IiwgIldlYWtNYXAiLCAidGFibGUiLCAiR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUiLCAiQ3JlYXRlVVVJRCIsICJjcmVhdGUiLCAiRmlsbFJhbmRvbUJ5dGVzIiwgImJ1ZmZlciIsICJHZW5SYW5kb21CeXRlcyIsICJhcnJheSIsICJkYXRhIiwgIm9mZnNldCIsICJieXRlIiwgInJ1bnRpbWVfd2ViX2xhbWJkYV9oYW5kbGVyX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUnVudGltZVdlYkxhbWJkYUhhbmRsZXIiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9wdXJld3MiLCAiaW5pdF9ydW50aW1lX3dlYl9sYW1iZGFfaGFuZGxlciIsICJfX2VzbU1pbiIsICJkZWZpbml0aW9uIiwgImNvbnRhaW5lciIsICJmYWN0b3J5IiwgImV2ZW50IiwgImNvbnRleHQiLCAicmVzdWx0IiwgImVycm9yIiwgImRlcHMiLCAicmF3VXNlckhhbmRsZXIiLCAid3JhcHBlZEhhbmRsZXIiLCAiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJDb250YWluZXJSZWdpc3RyeSIsICJESUNvbnRhaW5lckVycm9yIiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgIkxhbWJkYVBpcGVsaW5lIiwgIk1pY3Jvc2VydmljZVJlZ2lzdHJhciIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIlJ1bnRpbWVDb250YWluZXIiLCAiUnVudGltZURldGVjdG9yIiwgIlJ1bnRpbWVEaSIsICJSdW50aW1lRXh0ZW5zaW9ucyIsICJSdW50aW1lV2ViTGFtYmRhSGFuZGxlciIsICJUaWVzUmVnaXN0cmFyIiwgIlRpZXNSZWdpc3RyYXRpb25FcnJvciIsICJlcnJvcldyYXBwZXIiLCAiZnVsbFdyYXBwZXIiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImdldENES01ldGFkYXRhIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImxvZ2dpbmdXcmFwcGVyIiwgInRpbWluZ1dyYXBwZXIiLCAiX190b0NvbW1vbkpTIiwgIl9fcmVFeHBvcnQiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImVycm9yIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImZ1bmN0aW9uTmFtZSIsICJtZW1vcnlTaXplIiwgImdldENES01ldGFkYXRhIiwgIlJ1bnRpbWVEZXRlY3RvciIsICJnZXRCcm93c2VyTWV0YWRhdGEiLCAiZ2V0TGFtYmRhTWV0YWRhdGEiLCAiZ2V0Q0RLTWV0YWRhdGEiLCAiYXJnIiwgImltcG9ydF91dGlscyIsICJESUNvbnRhaW5lckVycm9yIiwgImNvbnRhaW5lck5hbWUiLCAibWVzc2FnZSIsICJUaWVzUmVnaXN0cmF0aW9uRXJyb3IiLCAidGllc0NsYXNzTmFtZSIsICJyZWFzb24iLCAiTWlzc2luZ1NlcnZpY2VFcnJvciIsICJzZXJ2aWNlTmFtZSIsICJUaWVzUmVnaXN0cmFyIiwgImNvbnRhaW5lciIsICJ0aWVzQ2xhc3NlcyIsICJUaWVzQ2xhc3MiLCAidGllc0luc3RhbmNlIiwgIlRpZXNSZWdpc3RyYXRpb25FcnJvciIsICJlcnJvciIsICJyZXF1aXJlZFNlcnZpY2VzIiwgIm1pc3NpbmdTZXJ2aWNlcyIsICJzZXJ2aWNlTmFtZSIsICJzZXJ2aWNlTmFtZXMiLCAibmFtZXMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImltcG9ydF91dGlscyIsICJQdXJlQ29udGFpbmVyRmFjdG9yeSIsICJUaWVzUmVnaXN0cmFyIiwgInRpZXNDbGFzc2VzIiwgImNvbnRhaW5lciIsICJlcnJvciIsICJESUNvbnRhaW5lckVycm9yIiwgIm9wdGlvbnMiLCAicmVxdWlyZWRTZXJ2aWNlcyIsICJhZGRpdGlvbmFsU2VydmljZXMiLCAiYWxsUmVxdWlyZWRTZXJ2aWNlcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF91dGlscyIsICJsb2dnaW5nV3JhcHBlciIsICJoYW5kbGVyIiwgIm1ldGFkYXRhIiwgImhhbmRsZXJMb2dnZXIiLCAiZXZlbnQiLCAiY29udGV4dCIsICJzdGFydFRpbWUiLCAiY29udGV4dEluZm8iLCAiZXh0cmFjdExhbWJkYUNvbnRleHQiLCAiZ2V0RXZlbnRUeXBlIiwgInJlc3VsdCIsICJtZXRyaWNzIiwgImNhbGN1bGF0ZU1ldHJpY3MiLCAiZXJyb3IiLCAiZXJyb3JXcmFwcGVyIiwgImVycm9yTG9nZ2VyIiwgImVycm9yRGV0YWlscyIsICJleHRyYWN0RXJyb3JEZXRhaWxzIiwgImlzQXBpR2F0ZXdheUV2ZW50IiwgInRpbWluZ1dyYXBwZXIiLCAidGltaW5nTG9nZ2VyIiwgInN0YXJ0TWVtb3J5IiwgImNhbGN1bGF0ZURldGFpbGVkTWV0cmljcyIsICJmdWxsV3JhcHBlciIsICJjdHgiLCAiZW5kVGltZSIsICJlbmRNZW1vcnkiLCAiZXZ0IiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgIlJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIiwgInRpZXMiLCAiZGVwcyIsICJjbGFzc1JlZiIsICJ0b2tlbiIsICJpbnN0YW5jZSIsICJrZXkiLCAiZXJyb3IiLCAiaGFuZGxlciIsICJtZXRhZGF0YSIsICJmdWxsV3JhcHBlciIsICJjbGFzc05hbWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImluaXRfcnVudGltZV93ZWJfbGFtYmRhX2hhbmRsZXIiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImlzUHJvbWlzZSIsICJvYmplY3QiLCAidGhlbiIsICJzdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllciIsICJzZXJ2aWNlSWRlbnRpZmllciIsICJ0b1N0cmluZyIsICJuYW1lIiwgIkVycm9yIiwgImlzbGF6eVNlcnZpY2VJZGVudGlmaWVyU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgImJ1aWxkU2VydmljZUlkIiwgInRoaXMiLCAidmFsdWUiLCAidW53cmFwIiwgImdldE93blJlZmxlY3RNZXRhZGF0YSIsICJ0YXJnZXQiLCAibWV0YWRhdGFLZXkiLCAicHJvcGVydHlLZXkiLCAiUmVmbGVjdCIsICJnZXRPd25NZXRhZGF0YSIsICJzZXRSZWZsZWN0TWV0YWRhdGEiLCAidGFyZ2V0IiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhIiwgInByb3BlcnR5S2V5IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAidXBkYXRlT3duUmVmbGVjdE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFZhbHVlIiwgImNhbGxiYWNrIiwgInVwZGF0ZWRNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiSURfTUVUQURBVEEiLCAiZ2V0QmluZGluZ0lkIiwgImJpbmRpbmdJZCIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiT2JqZWN0IiwgIk51bWJlciIsICJNQVhfU0FGRV9JTlRFR0VSIiwgInNldFJlZmxlY3RNZXRhZGF0YSIsICJNSU5fU0FGRV9JTlRFR0VSIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJpZCIsICJiaW5kaW5nU2NvcGVWYWx1ZXMiLCAiUmVxdWVzdCIsICJTaW5nbGV0b24iLCAiVHJhbnNpZW50IiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkNvbnN0YW50VmFsdWUiLCAiRHluYW1pY1ZhbHVlIiwgIkZhY3RvcnkiLCAiSW5zdGFuY2UiLCAiUHJvdmlkZXIiLCAiUmVzb2x2ZWRWYWx1ZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAiQWN0aXZhdGlvblJlbGF0aW9uS2luZCIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJsaWZlY3ljbGUiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicHJlRGVzdHJveU1ldGhvZE5hbWUiLCAidW5kZWZpbmVkIiwgInByb3BlcnRpZXMiLCAiTWFwIiwgInNjb3BlIiwgInBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnRSZWZsZWN0S2V5IiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiRXJyb3IiLCAia2luZCIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAic3VwZXIiLCAidGhpcyIsICJ2YWx1ZSIsICJpcyIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIkJpbmRpbmdSZWxhdGlvbktpbmQiLCAiRGVhY3RpdmF0aW9uUmVsYXRpb25LaW5kIiwgIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZCIsICJnZXRDbGFzc01ldGFkYXRhIiwgInR5cGUiLCAiY2xhc3NNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAicGVuZGluZ0NsYXNzTWV0YWRhdGFDb3VudCIsICJ1bmRlZmluZWRJbmRleGVzIiwgImxlbmd0aCIsICJtaXNzaW5nSW5qZWN0aW9uRGVjb3JhdG9yIiwgIm5hbWUiLCAidG9TdHJpbmciLCAiaSIsICJwdXNoIiwgImpvaW4iLCAiZXJyb3JzIiwgImNvbnN0cnVjdG9yQXJndW1lbnQiLCAidW5rbm93biIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0eSIsICJidWlsZEluc3RhbmNlQmluZGluZyIsICJhdXRvYmluZE9wdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGUiLCAiaXNSaWdodCIsICJpZCIsICJnZXRCaW5kaW5nSWQiLCAiaW1wbGVtZW50YXRpb25UeXBlIiwgImlzU2F0aXNmaWVkQnkiLCAibW9kdWxlSWQiLCAib25BY3RpdmF0aW9uIiwgIm9uRGVhY3RpdmF0aW9uIiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkluc3RhbmNlIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQiLCAiQmluZGluZ1JlbGF0aW9uS2luZCIsICJEZWFjdGl2YXRpb25SZWxhdGlvbktpbmQiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdE1ldGFkYXRhIiwgImJ1aWxkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEiLCAicGFyYW1zIiwgIm1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJpbmplY3Rpb25EZWNvcmF0b3JDb25mbGljdCIsICJhc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVua25vd24iLCAiaXNGcm9tVHlwZXNjcmlwdFBhcmFtVHlwZSIsICJidWlsZE1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAibXVsdGlwbGVJbmplY3Rpb24iLCAiY2hhaW5lZCIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgIkRlY29yYXRvckluZm9LaW5kIiwgIkRlY29yYXRvckluZm9LaW5kIiwgImNsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkiLCAiTk9OX1VTRVJMQU5EX1RZUEVTIiwgIkFycmF5IiwgIkJpZ0ludCIsICJCb29sZWFuIiwgIkZ1bmN0aW9uIiwgIk51bWJlciIsICJPYmplY3QiLCAiU3RyaW5nIiwgInVwZGF0ZUNsYXNzTWV0YWRhdGFXaXRoVHlwZXNjcmlwdFBhcmFtZXRlclR5cGVzIiwgInRhcmdldCIsICJ0eXBlc2NyaXB0Q29uc3RydWN0b3JBcmd1bWVudHMiLCAiZ2V0T3duUmVmbGVjdE1ldGFkYXRhIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhIiwgImZvckVhY2giLCAiY29uc3RydWN0b3JBcmd1bWVudFR5cGUiLCAiaW5kZXgiLCAidHlwZSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJpbmNsdWRlcyIsICJpc0Zyb21UeXBlc2NyaXB0UGFyYW1UeXBlIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInNpbmdsZUluamVjdGlvbiIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgImluamVjdGFibGUiLCAic2NvcGUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAic2V0UmVmbGVjdE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFVubWFuYWdlZE1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJidWlsZFVubWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFzc2VydE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRJZk1hbmFnZWQiLCAibmFtZSIsICJvcHRpb25hbCIsICJ0YWdzIiwgInNpemUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiaXNMYXp5UGxhblNlcnZpY2VOb2RlU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVBsYW5TZXJ2aWNlTm9kZSIsICJfc2VydmljZUlkZW50aWZpZXIiLCAiX3NlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgInRoaXMiLCAiYmluZGluZ3MiLCAiX2dldE5vZGUiLCAiaXNDb250ZXh0RnJlZSIsICJ2YWx1ZSIsICJpbnZhbGlkYXRlIiwgImlzRXhwYW5kZWQiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkJpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uIiwgIm5vZGUiLCAibmFtZSIsICJlbGVtIiwgInRhZ3MiLCAiZ2V0QW5jZXN0b3IiLCAiZ2V0QW5jZXN0b3JzQ2FsbGVkIiwgInByZXZpb3VzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJvcHRpb25zIiwgImN1c3RvbVNlcnZpY2VJZGVudGlmaWVyIiwgImZpbHRlcmVkQmluZGluZ3MiLCAiY2hhaW5lZCIsICJvcGVyYXRpb25zIiwgImdldEJpbmRpbmdzQ2hhaW5lZCIsICJnZXRCaW5kaW5ncyIsICJmaWx0ZXIiLCAiYmluZGluZyIsICJpc1NhdGlzZmllZEJ5IiwgImxlbmd0aCIsICJhdXRvYmluZE9wdGlvbnMiLCAiYnVpbGRJbnN0YW5jZUJpbmRpbmciLCAic2V0QmluZGluZyIsICJwdXNoIiwgImlzUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgIm5vZGUiLCAicmVkaXJlY3Rpb25zIiwgInRocm93RXJyb3JXaGVuVW5leHBlY3RlZEJpbmRpbmdzQW1vdW50Rm91bmQiLCAiYmluZGluZ05vZGVzIiwgImlzT3B0aW9uYWwiLCAiYmluZGluZ0NvbnN0cmFpbnROb2RlIiwgInNlcnZpY2VSZWRpcmVjdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiZWxlbSIsICJwYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJwcmV2aW91cyIsICJBcnJheSIsICJpc0FycmF5IiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJsZW5ndGgiLCAibGFzdFJlc29sdmVkU2VydmljZUlkZW50aWZpZXIiLCAiZXJyb3JNZXNzYWdlIiwgInN0cmluZ2lmeVNlcnZpY2VJZGVudGlmaWVyIiwgInN0cmluZ2lmeVNlcnZpY2VSZWRpcmVjdGlvbnMiLCAibWFwIiwgImJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJJbnN0YW5jZSIsICJzY29wZSIsICJpbXBsZW1lbnRhdGlvblR5cGUiLCAibmFtZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAidGFyZ2V0U2VydmljZUlkZW50aWZpZXIiLCAiam9pbiIsICJzdHJpbmdpZnlQYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJzdHJpbmdpZnlCaW5kaW5nQ29uc3RyYWludHMiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAicGxhbm5pbmciLCAidGhyb3dCaW5kaW5nTm90Rm91bmRFcnJvciIsICJzdHJpbmdpZmllZFRhZ3MiLCAidGFncyIsICJzaXplIiwgImtleXMiLCAia2V5IiwgInRvU3RyaW5nIiwgImNoZWNrUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlU2luZ2xlSW5qZWN0aW9uQmluZGluZ3MiLCAic2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicGxhbkJpbmRpbmdOb2RlIiwgImNoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncyIsICJzZXJ2aWNlTm9kZSIsICJiaW5kaW5ncyIsICJnZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJpcyIsICJ1bndyYXAiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFNlcnZpY2VOb2RlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAiZWxlbWVudE1ldGFkYXRhIiwgInZhbHVlIiwgInVwZGF0ZWRCaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImNvbmNhdCIsICJnZXRBbmNlc3RvcnNDYWxsZWQiLCAiQmluZGluZ0NvbnN0cmFpbnRzSW1wbGVtZW50YXRpb24iLCAibGFzdCIsICJjaGFpbmVkIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIm11bHRpcGxlSW5qZWN0aW9uIiwgImZpbHRlcmVkU2VydmljZUJpbmRpbmdzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAic2VydmljZU5vZGVCaW5kaW5ncyIsICJpc0NvbnRleHRGcmVlIiwgInB1c2giLCAic2luZ2xlSW5qZWN0aW9uIiwgIm9wdGlvbmFsIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJSZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZCIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJzdWJwbGFuIiwgImJ1aWxkSW5zdGFuY2VQbGFuQmluZGluZ05vZGUiLCAiY2hpbGROb2RlIiwgImNsYXNzTWV0YWRhdGEiLCAib3BlcmF0aW9ucyIsICJnZXRDbGFzc01ldGFkYXRhIiwgImNvbnN0cnVjdG9yUGFyYW1zIiwgInByb3BlcnR5UGFyYW1zIiwgIk1hcCIsICJzdWJwbGFuUGFyYW1zIiwgImF1dG9iaW5kT3B0aW9ucyIsICJzZXJ2aWNlc0JyYW5jaCIsICJidWlsZFJlc29sdmVkVmFsdWVQbGFuQmluZGluZ05vZGUiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgInBsYW5CaW5kaW5nTm9kZXMiLCAiUmVzb2x2ZWRWYWx1ZSIsICJidWlsZFNlcnZpY2VSZWRpcmVjdGlvblBsYW5CaW5kaW5nTm9kZSIsICJwb3AiLCAiY3VzdG9tU2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGVOb25Sb290UGxhblNlcnZpY2VOb2RlIiwgImdldFBsYW5PcHRpb25zIiwgInBsYW5TZXJ2aWNlTm9kZSIsICJjb250ZXh0IiwgIkxhenlQbGFuU2VydmljZU5vZGUiLCAiaXNFeHBhbmRlZCIsICJwbGFuUmVzdWx0IiwgInRyZWUiLCAicm9vdCIsICJzZXRQbGFuIiwgInNldE5vbkNhY2hlZFNlcnZpY2VOb2RlIiwgIkxhenlNYW5hZ2VkQ2xhc3NNZXRhZGF0YVBsYW5TZXJ2aWNlTm9kZSIsICJidWlsZExhenlQbGFuU2VydmljZU5vZGVOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInN1cGVyIiwgInRoaXMiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkxhenlSZXNvbHZlZFZhbHVlTWV0YWRhdGFQbGFuU2VydmljZU5vZGUiLCAiYnVpbGRMYXp5UGxhblNlcnZpY2VOb2RlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlTdWJwbGFuIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAic3VicGxhbkluc3RhbmNlQmluZGluZ05vZGUiLCAiaGFuZGxlUGxhblNlcnZpY2VOb2RlQnVpbGRGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAidW5tYW5hZ2VkIiwgInRhZyIsICJlbnRyaWVzIiwgIm5leHQiLCAiaXNNdWx0aXBsZSIsICJnZXRQbGFuIiwgImxhenlQbGFuU2VydmljZU5vZGUiLCAib3B0aW9uYWxCaW5kaW5ncyIsICJpbmRleCIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0aWVzIiwgInNldCIsICJzdWJwbGFuUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgImhhbmRsZVBsYW5TZXJ2aWNlTm9kZUJ1aWxkRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAicmVzb2x2ZWRWYWx1ZU1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFyZ3VtZW50cyIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJjdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImNpcmN1bGFyQnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeVN1YnBsYW4iLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgIkNhY2hlQmluZGluZ0ludmFsaWRhdGlvbktpbmQiLCAiYnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5U3VicGxhbiIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInBhcmFtcyIsICJiaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImVsZW1lbnRNZXRhZGF0YSIsICJsYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAibGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJlcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiaXNFcnJvck9mS2luZCIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInBsYW5uaW5nIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJjYWNoZVJlc29sdmVkVmFsdWUiLCAiYmluZGluZyIsICJyZXNvbHZlZFZhbHVlIiwgImlzUHJvbWlzZSIsICJjYWNoZSIsICJpc1JpZ2h0IiwgInZhbHVlIiwgInRoZW4iLCAic3luY1Jlc29sdmVkVmFsdWUiLCAiY2FjaGVTeW5jUmVzb2x2ZWRWYWx1ZSIsICJyZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucyIsICJwYXJhbXMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiYWN0aXZhdGlvbnMiLCAiZ2V0QWN0aXZhdGlvbnMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9uc0Zyb21JdGVyYXRvckFzeW5jIiwgIlN5bWJvbCIsICJpdGVyYXRvciIsICJhY3RpdmF0aW9uc0l0ZXJhdG9yIiwgImFjdGl2YXRlZFZhbHVlIiwgImFjdGl2YXRpb25JdGVyYXRvclJlc3VsdCIsICJuZXh0IiwgImRvbmUiLCAibmV4dEFjdGl2YXRlZFZhbHVlIiwgImNvbnRleHQiLCAiYXN5bmMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9ucyIsICJhY3RpdmF0aW9uUmVzdWx0IiwgIm9uQWN0aXZhdGlvbiIsICJyZXNvbHZlZCIsICJyZXNvbHZlU2luZ2xldG9uU2NvcGVkQmluZGluZyIsICJyZXNvbHZlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJfcGFyYW1zIiwgImdldFNlbGYiLCAic2VsZiIsICJyZXNvbHZlU2NvcGVkIiwgImdldEJpbmRpbmciLCAiYXJnIiwgInNjb3BlIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJTaW5nbGV0b24iLCAiUmVxdWVzdCIsICJyZXF1ZXN0U2NvcGVDYWNoZSIsICJoYXMiLCAiaWQiLCAiZ2V0IiwgInNldCIsICJUcmFuc2llbnQiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAicmVzb2x2ZUZhY3RvcnlCaW5kaW5nIiwgImZhY3RvcnkiLCAicmVzb2x2ZVBvc3RDb25zdHJ1Y3QiLCAiaW5zdGFuY2UiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicG9zdENvbnN0cnVjdFJlc3VsdCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJyZXNvbHV0aW9uIiwgInRvU3RyaW5nIiwgImltcGxlbWVudGF0aW9uVHlwZSIsICJuYW1lIiwgImVycm9yIiwgImNhdXNlIiwgInJlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zIiwgInNldEluc3RhbmNlUHJvcGVydGllcyIsICJjb25zdHJ1Y3RvclZhbHVlcyIsICJub2RlIiwgInByb3BlcnRpZXNBc3NpZ25tZW50UmVzdWx0IiwgImNsYXNzTWV0YWRhdGEiLCAibGlmZWN5Y2xlIiwgInJlc29sdmVQcm92aWRlckJpbmRpbmciLCAicHJvdmlkZXIiLCAiZ2V0SW5zdGFuY2VOb2RlQmluZGluZyIsICJnZXRSZXNvbHZlZFZhbHVlTm9kZUJpbmRpbmciLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInByb3BlcnR5QXNzaWdubWVudFByb21pc2VzIiwgInByb3BlcnR5S2V5IiwgInByb3BlcnR5Tm9kZSIsICJwcm9wZXJ0eVBhcmFtcyIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJiaW5kaW5ncyIsICJwdXNoIiwgImxlbmd0aCIsICJQcm9taXNlIiwgImFsbCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicmVzb2x2ZUJpbmRpbmdOb2RlIiwgImlubmVyUmVzb2x2ZVNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgInJlc29sdmVkVmFsdWVzIiwgInJlZGlyZWN0aW9uIiwgInJlZGlyZWN0aW9ucyIsICJpc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMiLCAicmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcyIsICJjb25zdHJ1Y3RvclJlc29sdmVkVmFsdWVzIiwgImNvbnN0cnVjdG9yUGFyYW0iLCAiY29uc3RydWN0b3JQYXJhbXMiLCAidW5kZWZpbmVkIiwgInNvbWUiLCAicmVzb2x2ZVJlc29sdmVkVmFsdWVCaW5kaW5nTm9kZSIsICJyZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdQYXJhbXMiLCAicGFyYW1WYWx1ZXMiLCAicmVzb2x2ZWRQYXJhbVZhbHVlcyIsICJwYXJhbXNSZXNvbHZlZFZhbHVlcyIsICJwYXJhbSIsICJyZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgInJlc29sdmVCaW5kaW5nTm9kZSIsICJwYXJhbXMiLCAicGxhbkJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJDb25zdGFudFZhbHVlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJEeW5hbWljVmFsdWUiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAiRmFjdG9yeSIsICJyZXNvbHZlRmFjdG9yeUJpbmRpbmciLCAiSW5zdGFuY2UiLCAicmVzb2x2ZVNjb3BlZEluc3RhbmNlQmluZGluZ05vZGUiLCAiUHJvdmlkZXIiLCAicmVzb2x2ZVByb3ZpZGVyQmluZGluZyIsICJSZXNvbHZlZFZhbHVlIiwgInJlc29sdmVTY29wZWRSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUiLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgImJpbmRpbmdzIiwgIkFycmF5IiwgImlzQXJyYXkiLCAicmVzb2x2ZWRWYWx1ZXMiLCAiaXNQbGFuU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicHVzaCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAic29tZSIsICJpc1Byb21pc2UiLCAiUHJvbWlzZSIsICJhbGwiLCAibGVuZ3RoIiwgIkludmVyc2lmeUNvcmVFcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInJlc29sdXRpb24iLCAiaXNQbHVnaW4iLCAiU3ltYm9sIiwgImZvciIsICJQbHVnaW4iLCAiX2NvbnRhaW5lciIsICJfY29udGV4dCIsICJjb250YWluZXIiLCAiY29udGV4dCIsICJ0aGlzIiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvciIsICJFcnJvciIsICJraW5kIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJzdXBlciIsICJ0aGlzIiwgInZhbHVlIiwgImlzIiwgIkludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZCIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvcktpbmQiLCAiREVGQVVMVF9ERUZBVUxUX1NDT1BFIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJUcmFuc2llbnQiLCAiQ29udGFpbmVyUmVnaXN0cnkiLCAic2VydmljZU5hbWUiLCAiY29udGFpbmVyIiwgIkRJQ29udGFpbmVyRXJyb3IiLCAibGFtYmRhSWQiLCAiZGVmaW5pdGlvbiIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgImV4aXN0aW5nU2VydmljZSIsICJsYW1iZGFzIiwgInNlcnZpY2UiLCAiZXhpc3RlZCIsICJsYW1iZGFzVG9SZW1vdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgIlciLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIkNvbnRhaW5lclJlZ2lzdHJ5IiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgImxhbWJkYURlZiIsICJsYW1iZGFJZCIsICJlcnJvciIsICJoYW5kbGVyTmFtZSIsICJyZXF1aXJlZFNlcnZpY2VzIiwgInRpZUNsYXNzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfdXRpbHMiLCAiTGFtYmRhUGlwZWxpbmUiLCAiY29uZmlnIiwgImNvbnRleHQiLCAibGFtYmRhSWQiLCAiY29udGFpbmVyIiwgImhhbmRsZXIiLCAiZXJyb3IiLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiTGFtYmRhSGFuZGxlckZhY3RvcnkiLCAibGFtYmRhRGVmaW5pdGlvbiIsICJzZXJ2aWNlc19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgIl9fcmVFeHBvcnQiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3V0aWxzIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImJlZm9yZUluc3RhbmNlIiwgInNlcnZlckNvbmZpZyIsICJlbmhhbmNlbWVudHMiLCAicnVudGltZUNvcmVDb25maWciLCAiYnVpbGRDb25maWciLCAib3B0aW1pemF0aW9ucyIsICJvcHRpbWl6ZWRDb25maWciLCAiYmFzZVN0YWNrQ29uZmlnIiwgInJ1bnRpbWVTdGFja0NvbmZpZyIsICJjb25maWciLCAiZmVhdHVyZSIsICJmIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImluZGV4X2V4cG9ydHMiLCAic2VydmljZXNfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVEaSIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF91dGlscyIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgInNlcnZpY2VJZCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiUnVudGltZURpIiwgIl9fcmVFeHBvcnQiLCAiaW5kZXhfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyJdCn0K
|