@worktif/runtime 0.3.0-edge.10 → 0.3.0-edge.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/dist/bin/index.js +22 -22
- package/out/dist/bin/purenow.js +7 -196
- package/out/dist/bin/templates/runtime-web/basic/package.json +1 -1
- package/out/dist/infra/index.js +26 -26
- package/out/dist/lambda/bundle.js +10 -10
- package/out/dist/lib/index.js +4 -4
- package/out/dist/lib/index.mjs +4 -0
- package/out/dist/src/bin/commands/build.command.d.ts +14 -0
- package/out/dist/src/bin/commands/index.d.ts +1 -0
- package/out/dist/src/bin/runtime-web-cli.d.ts +4 -0
- package/out/dist/src/core/runtime-web/factory/lambda-handler-factory.d.ts +1 -1
- package/out/dist/src/core/runtime-web/factory/lambda-handler-factory.d.ts.map +1 -1
- package/out/dist/src/infra/runtime-web/constructs/lambda-builder.d.ts +3 -0
- package/package.json +42 -20
|
@@ -1,4 +1,4 @@
|
|
|
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.
|
|
1
|
+
"use strict";var Vn=Object.create;var be=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var Wn=Object.getOwnPropertyNames;var Hn=Object.getPrototypeOf,qn=Object.prototype.hasOwnProperty;var Gn=(n,e)=>()=>(e||n((e={exports:{}}).exports,e),e.exports),ze=(n,e)=>{for(var t in e)be(n,t,{get:e[t],enumerable:!0})},ke=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Wn(e))!qn.call(n,r)&&r!==t&&be(n,r,{get:()=>e[r],enumerable:!(i=Et(e,r))||i.enumerable});return n},x=(n,e,t)=>(ke(n,e,"default"),t&&ke(t,e,"default")),de=(n,e,t)=>(t=n!=null?Vn(Hn(n)):{},ke(e||!n||!n.__esModule?be(t,"default",{value:n,enumerable:!0}):t,n)),Kn=n=>ke(be({},"__esModule",{value:!0}),n),_=(n,e,t,i)=>{for(var r=i>1?void 0:i?Et(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 Y=Gn(()=>{var Dt;(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 Ue(Object.create(null))}:y?function(){return Ue({__proto__:null})}:function(){return Ue({})},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:Ln(),k=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:Fn(),j=typeof WeakMap=="function"?WeakMap:$n(),E=r?Symbol.for("@reflect-metadata:registry"):void 0,X=Nn(),M=Pn(X);function G(o,s,c,u){if(b(c)){if(!St(o))throw new TypeError;if(!It(s))throw new TypeError;return xn(o,s)}else{if(!St(o))throw new TypeError;if(!B(s))throw new TypeError;if(!B(u)&&!b(u)&&!le(u))throw new TypeError;return le(u)&&(u=void 0),c=Z(c),An(o,s,c,u)}}e("decorate",G);function ce(o,s){function c(u,p){if(!B(u))throw new TypeError;if(!b(p)&&!On(p))throw new TypeError;mt(o,s,u,p)}return c}e("metadata",ce);function pe(o,s,c,u){if(!B(c))throw new TypeError;return b(u)||(u=Z(u)),mt(o,s,c,u)}e("defineMetadata",pe);function ye(o,s,c){if(!B(s))throw new TypeError;return b(c)||(c=Z(c)),ht(o,s,c)}e("hasMetadata",ye);function Sn(o,s,c){if(!B(s))throw new TypeError;return b(c)||(c=Z(c)),Le(o,s,c)}e("hasOwnMetadata",Sn);function In(o,s,c){if(!B(s))throw new TypeError;return b(c)||(c=Z(c)),gt(o,s,c)}e("getMetadata",In);function Cn(o,s,c){if(!B(s))throw new TypeError;return b(c)||(c=Z(c)),vt(o,s,c)}e("getOwnMetadata",Cn);function Mn(o,s){if(!B(o))throw new TypeError;return b(s)||(s=Z(s)),pt(o,s)}e("getMetadataKeys",Mn);function Rn(o,s){if(!B(o))throw new TypeError;return b(s)||(s=Z(s)),yt(o,s)}e("getOwnMetadataKeys",Rn);function kn(o,s,c){if(!B(s))throw new TypeError;if(b(c)||(c=Z(c)),!B(s))throw new TypeError;b(c)||(c=Z(c));var u=we(s,c,!1);return b(u)?!1:u.OrdinaryDeleteMetadata(o,s,c)}e("deleteMetadata",kn);function xn(o,s){for(var c=o.length-1;c>=0;--c){var u=o[c],p=u(s);if(!b(p)&&!le(p)){if(!It(p))throw new TypeError;s=p}}return s}function An(o,s,c,u){for(var p=o.length-1;p>=0;--p){var T=o[p],L=T(s,c,u);if(!b(L)&&!le(L)){if(!B(L))throw new TypeError;u=L}}return u}function ht(o,s,c){var u=Le(o,s,c);if(u)return!0;var p=$e(s);return le(p)?!1:ht(o,p,c)}function Le(o,s,c){var u=we(s,c,!1);return b(u)?!1:bt(u.OrdinaryHasOwnMetadata(o,s,c))}function gt(o,s,c){var u=Le(o,s,c);if(u)return vt(o,s,c);var p=$e(s);if(!le(p))return gt(o,p,c)}function vt(o,s,c){var u=we(s,c,!1);if(!b(u))return u.OrdinaryGetOwnMetadata(o,s,c)}function mt(o,s,c,u){var p=we(c,u,!0);p.OrdinaryDefineOwnMetadata(o,s,c,u)}function pt(o,s){var c=yt(o,s),u=$e(o);if(u===null)return c;var p=pt(u,s);if(p.length<=0)return c;if(c.length<=0)return p;for(var T=new k,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 yt(o,s){var c=we(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 b(o){return o===void 0}function le(o){return o===null}function En(o){return typeof o=="symbol"}function B(o){return typeof o=="object"?o!==null:typeof o=="function"}function Dn(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=Ct(o,a);if(u!==void 0){var p=u.call(o,c);if(B(p))throw new TypeError;return p}return Bn(o,c==="default"?"number":c)}function Bn(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 bt(o){return!!o}function Tn(o){return""+o}function Z(o){var s=Dn(o,3);return En(s)?s:Tn(s)}function St(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 It(o){return typeof o=="function"}function On(o){switch(wt(o)){case 3:return!0;case 4:return!0;default:return!1}}function Fe(o,s){return o===s||o!==o&&s!==s}function Ct(o,s){var c=o[s];if(c!=null){if(!fe(c))throw new TypeError;return c}}function Mt(o){var s=Ct(o,d);if(!fe(s))throw new TypeError;var c=s.call(o);if(!B(c))throw new TypeError;return c}function Rt(o){return o.value}function kt(o){var s=o.next();return s.done?!1:s}function xt(o){var s=o.return;s&&s.call(o)}function $e(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 _n(){var o;!b(E)&&typeof t.Reflect<"u"&&!(E in t.Reflect)&&typeof t.Reflect.defineMetadata=="function"&&(o=jn(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 b(s):s=v;break;case s===v:break;case b(c):c=v;break;case c===v:break;default:u===void 0&&(u=new k),u.add(v);break}}function C(v,R){if(!b(s)){if(s.isProviderFor(v,R))return s;if(!b(c)){if(c.isProviderFor(v,R))return s;if(!b(u))for(var D=Mt(u);;){var O=kt(D);if(!O)return;var K=Rt(O);if(K.isProviderFor(v,R))return xt(D),K}}}if(!b(o)&&o.isProviderFor(v,R))return o}function l(v,R){var D=p.get(v),O;return b(D)||(O=D.get(R)),b(O)&&(O=C(v,R),b(O)||(b(D)&&(D=new A,p.set(v,D)),D.set(R,O))),O}function h(v){if(b(v))throw new TypeError;return s===v||c===v||!b(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(!b(O))return!1;var K=p.get(v);b(K)&&(K=new A,p.set(v,K)),K.set(R,D)}return!0}}function Nn(){var o;return!b(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&(o=t.Reflect[E]),b(o)&&(o=_n()),!b(E)&&B(t.Reflect)&&Object.isExtensible(t.Reflect)&&Object.defineProperty(t.Reflect,E,{enumerable:!1,configurable:!1,writable:!1,value:o}),o}function Pn(o){var s=new j,c={isProviderFor:function(h,g){var v=s.get(h);return b(v)?!1:v.has(g)},OrdinaryDefineOwnMetadata:L,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:T,OrdinaryOwnMetadataKeys:C,OrdinaryDeleteMetadata:l};return X.registerProvider(c),c;function u(h,g,v){var R=s.get(h),D=!1;if(b(R)){if(!v)return;R=new A,s.set(h,R),D=!0}var O=R.get(g);if(b(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 b(R)?!1:bt(R.has(h))}function T(h,g,v){var R=u(g,v,!1);if(!b(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(b(R))return v;for(var D=R.keys(),O=Mt(D),K=0;;){var At=kt(O);if(!At)return v.length=K,v;var Un=Rt(At);try{v[K]=Un}catch(zn){try{xt(O)}finally{throw zn}}K++}}function l(h,g,v){var R=u(g,v,!1);if(b(R)||!R.delete(h))return!1;if(R.size===0){var D=s.get(g);b(D)||(D.delete(v),D.size===0&&s.delete(D))}return!0}}function jn(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!b(g)&&g.has(h)?!0:p(l,h).length?(b(g)&&(g=new k,L.set(l,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:s,OrdinaryHasOwnMetadata:c,OrdinaryGetOwnMetadata:u,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:T};return C}function we(o,s,c){var u=X.getProvider(o,s);if(!b(u))return u;if(c){if(X.setProvider(o,s,M))return M;throw new Error("Illegal state.")}}function Ln(){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--,Fe(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(!Fe(this._cacheKey,l)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if(Fe(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 Fn(){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 $n(){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 Ue(o){return o.__=void 0,delete o.__,o}})})(Dt||(Dt={}))});var F={};ze(F,{ContainerRegistry:()=>se,DIContainerError:()=>J,LambdaHandlerFactory:()=>ie,LambdaPipeline:()=>lt,MicroserviceRegistrar:()=>ae,MissingServiceError:()=>Q,PureContainerFactory:()=>ne,RuntimeContainer:()=>me,RuntimeDetector:()=>De,RuntimeDi:()=>ft,RuntimeExtensions:()=>z,RuntimeWebLambdaHandler:()=>he,TiesRegistrar:()=>te,TiesRegistrationError:()=>ee,errorWrapper:()=>We,fullWrapper:()=>Te,getBrowserMetadata:()=>xe,getCDKMetadata:()=>Ee,getLambdaMetadata:()=>Ae,loggingWrapper:()=>Ve,timingWrapper:()=>He});module.exports=Kn(F);x(F,require("@worktif/purenow/lambda"),module.exports);function xe(){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 Ae(){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 Ee(){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 De=class{detect(){if(this.isBrowser())return{type:"browser",metadata:xe()};if(this.isLambda())return{type:"lambda",metadata:Ae()};if(this.isCDK())return{type:"cdk",metadata:Ee()};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 Bt=require("@worktif/utils");var J=class extends Error{constructor(e,t){super(`DI Container '${e}': ${t}`),this.name="DIContainerError",Error.captureStackTrace(this,this.constructor)}},ee=class extends Error{constructor(e,t){super(`Ties registration failed for '${e}': ${t}`),this.name="TiesRegistrationError",Error.captureStackTrace(this,this.constructor)}},Q=class extends Error{constructor(e,t){super(`Service '${e}' not found in container '${t}'`),this.name="MissingServiceError",Error.captureStackTrace(this,this.constructor)}};var te=class{registerTies(e,t){for(let i of t)try{let r=new i;if(typeof r.register!="function")throw new ee(i.name,"Ties class must implement register(container: PureContainer<string>) method");r.register(e)}catch(r){throw r instanceof ee?r:new ee(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}};te=_([(0,Bt.purable)()],te);var Se=require("@worktif/utils");var ne=class{constructor(){this.tiesRegistrar=new te}createMicroserviceContainer(e){try{let t=new Se.PureContainer({defaultScope:"Singleton"});return this.tiesRegistrar.registerTies(t,e),t}catch(t){throw new J("microservice",`Failed to create microservice container: ${t instanceof Error?t.message:String(t)}`)}}createCustomContainer(e,t={}){try{let i=new Se.PureContainer(t);return this.tiesRegistrar.registerTies(i,e),i}catch(i){throw new J("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}};ne=_([(0,Se.purable)()],ne);var Oe=require("@worktif/utils");var Be=require("@worktif/utils");function Ve(n,e){let t=(0,Be.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:_t(i)});try{let f=await n(i,r),y=Tt(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=Tt(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,Be.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=Xn(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:_t(i)}),Zn(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,Be.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=Ot(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=Ot(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 Te(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 Tt(n,e){let t=Date.now();return{startTime:n,endTime:t,duration:t-n,remainingTime:e.getRemainingTimeInMillis?.()}}function Ot(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 Xn(n){return n instanceof Error?{message:n.message,type:n.constructor.name,stack:n.stack}:{message:String(n),type:"Unknown"}}function _t(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 Zn(n){if(!n||typeof n!="object")return!1;let e=n;return!!(e.httpMethod||e.requestContext)}var Nt=require("@worktif/utils"),Pt=require("@worktif/purews"),he=class extends Pt.LambdaApi{constructor(t,i,r){super();this.definition=t;this.container=i;this.factory=r;this.logger=(0,Nt.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 ie=class{constructor(){this.logger=(0,Oe.logger)({serviceName:"@core/runtime-web/factory/lambda-handler-factory"})}create(e,t){return this.logger.info("Creating Lambda handler",{lambdaId:e.id,service:e.service,dependencyCount:e.ties.length}),new he(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 Te(e,t)}toCamelCase(e){return e.charAt(0).toLowerCase()+e.slice(1)}};ie=_([(0,Oe.purable)()],ie);var wn=require("@worktif/utils");var Pr=de(Y(),1);function $(n){return(typeof n=="object"&&n!==null||typeof n=="function")&&typeof n.then=="function"}function H(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 Ge=Symbol.for("@inversifyjs/common/islazyServiceIdentifier"),re=class{[Ge];#e;constructor(e){this.#e=e,this[Ge]=!0}static is(e){return typeof e=="object"&&e!==null&&e[Ge]===!0}unwrap(){return this.#e()}};var mr=de(Y(),1);function oe(n,e,t){return Reflect.getOwnMetadata(e,n,t)}function _e(n,e,t,i){Reflect.defineMetadata(e,t,n,i)}function Ie(n,e,t,i,r){let a=i(oe(n,e,r)??t());Reflect.defineMetadata(e,a,n,r)}var Ke="@inversifyjs/container/bindingId";function Jt(){let n=oe(Object,Ke)??0;return n===Number.MAX_SAFE_INTEGER?_e(Object,Ke,Number.MIN_SAFE_INTEGER):Ie(Object,Ke,()=>n,e=>e+1),n}var ge={Request:"Request",Singleton:"Singleton",Transient:"Transient"},U={ConstantValue:"ConstantValue",DynamicValue:"DynamicValue",Factory:"Factory",Instance:"Instance",Provider:"Provider",ResolvedValue:"ResolvedValue",ServiceRedirection:"ServiceRedirection"};var jt;(function(n){n.moduleId="moduleId",n.serviceId="serviceId"})(jt||(jt={}));var it="@inversifyjs/core/classMetadataReflectKey";function rt(){return{constructorArguments:[],lifecycle:{postConstructMethodName:void 0,preDestroyMethodName:void 0},properties:new Map,scope:void 0}}var Jn="@inversifyjs/core/pendingClassMetadataCountReflectKey",Xe=Symbol.for("@inversifyjs/core/InversifyCoreError"),N=class n extends Error{[Xe];kind;constructor(e,t,i){super(t,i),this[Xe]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[Xe]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},P,Ce,Lt,Ft,V;function Qt(n){let e=oe(n,it)??rt();if(!(function(t){let i=oe(t,Jn);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
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('", "')}".
|
|
@@ -15,27 +15,27 @@ This might be caused by one of the following reasons:
|
|
|
15
15
|
|
|
16
16
|
${r.join(`
|
|
17
17
|
|
|
18
|
-
`)}`)})(n,e)}function
|
|
18
|
+
`)}`)})(n,e)}function Qn(n,e){let t=Qt(e).scope??n.scope;return{cache:{isRight:!1,value:void 0},id:Jt(),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"})(Lt||(Lt={}));(function(n){n.moduleId="moduleId",n.serviceId="serviceId"})(Ft||(Ft={}));function Yt(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 en(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 ir=Yt(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 en(n),e===V.multipleInjection?{...n,chained:i?.chained??!1,kind:e,value:t}:{...n,kind:e,value:t}});var $t;(function(n){n[n.method=0]="method",n[n.parameter=1]="parameter",n[n.property=2]="property"})($t||($t={}));var Ut="@inversifyjs/core/classIsInjectableFlagReflectKey",Yn=[Array,BigInt,Boolean,Function,Number,Object,String];function ei(n){let e=oe(n,"design:paramtypes");e!==void 0&&Ie(n,it,rt,(function(t){return i=>(t.forEach((r,a)=>{var d;i.constructorArguments[a]!==void 0||(d=r,Yn.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 ot(n){return e=>{(function(t){if(oe(t,Ut)!==void 0)throw new N(P.injectionDecoratorConflict,`Cannot apply @injectable decorator multiple times at class "${t.name}"`);_e(t,Ut,!0)})(e),ei(e),n!==void 0&&Ie(e,it,rt,t=>({...t,scope:n}))}}function zt(){return{kind:V.unmanaged}}var rr=Yt(zt,function(n){if(en(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 zt()});var ue;(function(n){n[n.multipleInjection=0]="multipleInjection",n[n.singleInjection=1]="singleInjection"})(ue||(ue={}));var Ze=Symbol.for("@inversifyjs/core/LazyPlanServiceNode"),Me=class{[Ze];_serviceIdentifier;_serviceNode;constructor(e,t){this[Ze]=!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[Ze]===!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 st(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=Qn(n.autobindOptions,i);n.operations.setBinding(a),a.isSatisfiedBy(e)&&r.push(a)}return r}function ve(n){return n.redirections!==void 0}function tn(n,e,t,i){let r=t.elem.serviceIdentifier,a=t.previous?.elem.serviceIdentifier;Array.isArray(n)?(function(d,f,y,m,w,I){if(d.length!==0){let A=I[I.length-1]??y,k=`Ambiguous bindings found for service: "${H(A)}".${on(I)}
|
|
19
19
|
|
|
20
20
|
Registered bindings:
|
|
21
21
|
|
|
22
|
-
${d.map(j=>(function(E){switch(E.type){case U.Instance:return`[ type: "${E.type}", serviceIdentifier: "${
|
|
22
|
+
${d.map(j=>(function(E){switch(E.type){case U.Instance:return`[ type: "${E.type}", serviceIdentifier: "${H(E.serviceIdentifier)}", scope: "${E.scope}", implementationType: "${E.implementationType.name}" ]`;case U.ServiceRedirection:return`[ type: "${E.type}", serviceIdentifier: "${H(E.serviceIdentifier)}", redirection: "${H(E.targetServiceIdentifier)}" ]`;default:return`[ type: "${E.type}", serviceIdentifier: "${H(E.serviceIdentifier)}", scope: "${E.scope}" ]`}})(j.binding)).join(`
|
|
23
23
|
`)}
|
|
24
24
|
|
|
25
|
-
Trying to resolve bindings for "${
|
|
25
|
+
Trying to resolve bindings for "${nn(y,m)}".${rn(w)}`;throw new N(P.planning,k)}f||Vt(y,m,w,I)})(n,e,r,a,t.elem,i):(function(d,f,y,m,w,I){d!==void 0||f||Vt(y,m,w,I)})(n,e,r,a,t.elem,i)}function Vt(n,e,t,i){let r=i[i.length-1]??n,a=`No bindings found for service: "${H(r)}".
|
|
26
26
|
|
|
27
|
-
Trying to resolve bindings for "${
|
|
27
|
+
Trying to resolve bindings for "${nn(n,e)}".${on(i)}${rn(t)}`;throw new N(P.planning,a)}function nn(n,e){return e===void 0?`${H(n)} (Root service)`:H(e)}function rn(n){let e=n.tags.size===0?"":`
|
|
28
28
|
- tags:
|
|
29
29
|
- ${[...n.tags.keys()].map(t=>t.toString()).join(`
|
|
30
30
|
- `)}`;return`
|
|
31
31
|
|
|
32
32
|
Binding constraints:
|
|
33
|
-
- service identifier: ${
|
|
34
|
-
- name: ${n.name?.toString()??"-"}${e}`}function
|
|
33
|
+
- service identifier: ${H(n.serviceIdentifier)}
|
|
34
|
+
- name: ${n.name?.toString()??"-"}${e}`}function on(n){return n.length===0?"":`
|
|
35
35
|
|
|
36
36
|
- service redirections:
|
|
37
|
-
- ${n.map(e=>
|
|
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")});
|
|
37
|
+
- ${n.map(e=>H(e)).join(`
|
|
38
|
+
- `)}`}function sn(n,e,t,i){if(n.redirections.length===1){let[r]=n.redirections;return void(ve(r)&&sn(r,e,t,[...i,r.binding.targetServiceIdentifier]))}tn(n.redirections,e,t,i)}function an(n,e,t){if(Array.isArray(n.bindings)&&n.bindings.length===1){let[i]=n.bindings;return void(ve(i)&&sn(i,e,t,[i.binding.targetServiceIdentifier]))}tn(n.bindings,e,t,[])}function Pe(n){return re.is(n)?n.unwrap():n}function cn(n){return(e,t,i)=>{let r=Pe(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=st(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){an(w,i.optional,a.last);let[I]=m;w.bindings=I}return w}}function dn(n){return(e,t,i)=>{let r=Pe(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=st(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){an(w,i.optional,a.last);let[I]=m;w.bindings=I}return w}}function un(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=ve(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 k=r(a,d,A,m);I.push(k);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=st(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 Wt(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 Je=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,Pe(r.value)),this.#t=t,this.#e=e,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}},Qe=class extends Me{#e;#t;#n;#i;constructor(e,t,i,r,a){super(a,Pe(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 ln(n,e,t,i){let r=(function(d,f){let y=(function(m,w){return(I,A,k)=>{if(k.kind===V.unmanaged)return;let j=(function(M){let G;if(M.tags.size===0)G=void 0;else{if(M.tags.size!==1)return;{let[pe,ye]=M.tags.entries().next().value;G={key:pe,value:ye}}}let ce=re.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:ce,tag:G}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:ce,tag:G}})(k);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,k),X=new Je(I,m,A,k,E);return Wt(j,I.operations,X,{bindingConstraintsList:A,chainedBindings:k.kind===V.multipleInjection&&k.chained,optionalBindings:k.optional}),X}})(d,f);return(m,w,I)=>{let A=w.classMetadata;for(let[k,j]of A.constructorArguments.entries())w.constructorParams[k]=y(m,I,j);for(let[k,j]of A.properties){let E=y(m,I,j);E!==void 0&&w.propertyParams.set(k,E)}return m.node}})(n,t),a=(function(d,f){let y=(function(m,w){return(I,A,k)=>{let j=(function(M){let G;if(M.tags.size===0)G=void 0;else{if(M.tags.size!==1)return;{let[pe,ye]=M.tags.entries().next().value;G={key:pe,value:ye}}}let ce=re.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:ce,tag:G}:{isMultiple:!1,name:M.name,optional:M.optional,serviceIdentifier:ce,tag:G}})(k);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,k),X=new Qe(I,m,A,k,E);return Wt(j,I.operations,X,{bindingConstraintsList:A,chainedBindings:k.kind===ue.multipleInjection&&k.chained,optionalBindings:k.optional}),X}})(d,f);return(m,w,I)=>{let A=w.binding.metadata;for(let[k,j]of A.arguments.entries())w.params[k]=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 Ye=cn(fn),et=dn(fn),ti=un(ln(Ye,et,Ye,et));function fn(n,e,t,i,r){return ti(n,e,t,i,r)}var tt;(function(n){n.bindingAdded="bindingAdded",n.bindingRemoved="bindingRemoved"})(tt||(tt={}));var hn=un(ln(Ye,et,function(n,e,t){return ni(n,e,t)},function(n,e,t){return ii(n,e,t)})),ni=(function(n){let e=cn(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(N.isErrorOfKind(a,P.planning))return;throw a}}})(hn),ii=(function(n){let e=dn(n);return(t,i,r)=>{try{return e(t,i,r)}catch(a){if(N.isErrorOfKind(a,P.planning))return;throw a}}})(hn);function gn(n,e){return $(e)?(n.cache={isRight:!0,value:e},e.then(t=>Ht(n,t))):Ht(n,e)}function Ht(n,e){return n.cache={isRight:!0,value:e},e}function ri(n,e,t){let i=n.getActivations(e);return i===void 0?t:$(t)?qt(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 qt(r,m,d);f=m,y=d.next()}return f})(n,t,i[Symbol.iterator]())}async function qt(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 ri(n,e.serviceIdentifier,i)}function at(n){return(e,t)=>t.cache.isRight?t.cache.value:gn(t,Ne(e,t,n(e,t)))}var oi=at(function(n,e){return e.value});function si(n){return n}function ct(n,e){return(t,i)=>{let r=n(i);switch(r.scope){case ge.Singleton:return r.cache.isRight?r.cache.value:gn(r,Ne(t,r,e(t,i)));case ge.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 ge.Transient:return Ne(t,r,e(t,i))}}}var ai=(n=>ct(si,n))(function(n,e){return e.value(n.context)}),ci=at(function(n,e){return e.factory(n.context)});function Gt(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,w){try{await w}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 Kt(n){return(e,t,i)=>{let r=new i.binding.implementationType(...e),a=n(t,r,i);return $(a)?a.then(()=>Gt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)):Gt(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)}}var di=at(function(n,e){return e.provider(n.context)});function ui(n){return n.binding}function li(n){return n.binding}var Xt=(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(()=>{})}})(dt),Zt=(function(n){return function e(t,i){let r=[];for(let a of i.redirections)ve(a)?r.push(...e(t,a)):r.push(n(t,a));return r}})(nt),fi=(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}})(dt),(function(n){return async(e,t,i)=>{let r=await e;return n(r,t,i)}})(Kt(Xt)),Kt(Xt)),hi=(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}})(dt)),gi=(n=>ct(ui,n))(fi),vi=(n=>ct(li,n))(hi);function nt(n,e){switch(e.binding.type){case U.ConstantValue:return oi(n,e.binding);case U.DynamicValue:return ai(n,e.binding);case U.Factory:return ci(n,e.binding);case U.Instance:return gi(n,e);case U.Provider:return di(n,e.binding);case U.ResolvedValue:return vi(n,e)}}function dt(n,e){if(e.bindings!==void 0)return Array.isArray(e.bindings)?(function(t,i){let r=[];for(let a of i)ve(a)?r.push(...Zt(t,a)):r.push(nt(t,a));return r.some($)?Promise.all(r):r})(n,e.bindings):(function(t,i){if(ve(i)){let r=Zt(t,i);if(r.length===1)return r[0];throw new N(P.resolution,"Unexpected multiple resolved values on single injection")}return nt(t,i)})(n,e.bindings)}var mn=Symbol.for("@inversifyjs/plugin/isPlugin"),vn=class{[mn]=!0;_container;_context;constructor(e,t){this._container=e,this._context=t}};var ut=Symbol.for("@inversifyjs/container/InversifyContainerError"),pn=class n extends Error{[ut];kind;constructor(e,t,i){super(t,i),this[ut]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[ut]===!0}static isErrorOfKind(e,t){return n.is(e)&&e.kind===t}},yn;(function(n){n[n.invalidOperation=0]="invalidOperation"})(yn||(yn={}));var Sr=ge.Transient;var se=class{constructor(){this.containers=new Map;this.lambdaToService=new Map;this.lambdaDefinitions=new Map}registerService(e,t){if(this.containers.has(e))throw new J(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 Q(t,"service containers");if(this.lambdaToService.has(e)){let r=this.lambdaToService.get(e);throw new J(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 Q(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 Q(e,"lambda-to-service mapping");return t}getLambdaDefinition(e){let t=this.lambdaDefinitions.get(e);if(!t)throw new Q(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}}};se=_([ot()],se);var ae=class{constructor(){this.containerFactory=new ne,this.registry=new se}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))}};ae=_([(0,wn.purable)()],ae);var bn=require("@worktif/utils"),lt=class{constructor(){this.logger=(0,bn.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 ae;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 ie);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 q={};ze(q,{RuntimeExtensions:()=>z});var ao=de(Y());x(q,require("@worktif/purenow/lambda"));var no=de(Y()),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);x(F,q,module.exports);var W={};ze(W,{RuntimeContainer:()=>me,RuntimeDi:()=>ft});var po=de(Y());x(W,require("@worktif/purenow/lambda"));var lo=de(Y()),je=require("@worktif/utils");var me=class{constructor(){this.container=new je.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}}};me=_([(0,je.purable)()],me);var vo=de(Y()),ft=(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))(ft||{});x(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/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
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kZXRlY3Rvci9tZXRhZGF0YS1jb2xsZWN0b3JzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2RldGVjdG9yL3J1bnRpbWUtZGV0ZWN0b3IudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvdGllcy1yZWdpc3RyYXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvZGktZXJyb3JzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2RpL3B1cmUtY29udGFpbmVyLWZhY3RvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9sYW1iZGEtaGFuZGxlci1mYWN0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvaGFuZGxlci13cmFwcGVycy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L3J1bnRpbWUtd2ViLWxhbWJkYS1oYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9taWNyb3NlcnZpY2UtcmVnaXN0cmFyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9pbnZlcnNpZnkvbGliL2VzbS9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9pc1Byb21pc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb21tb24vc3JjL3NlcnZpY2VzL2NhbGN1bGF0aW9ucy9zdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvc2VydmljZXMvbW9kZWxzL0xhenlTZXJ2aWNlSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9idWlsZEFycmF5TWV0YWRhdGFXaXRoQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEVsZW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRBcnJheU1ldGFkYXRhV2l0aEluZGV4LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlBcnJheU1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkRW1wdHlNYXBNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9nZXRPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvZ2V0UmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL3NldFJlZmxlY3RNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy91cGRhdGVPd25SZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvdXBkYXRlUmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9hY3Rpb25zL2dldEJpbmRpbmdJZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdTY29wZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9jaGFpbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2NvbW1vbi9tb2RlbHMvT25lVG9NYW55TWFwU3Rhci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVmbGVjdE1ldGFkYXRhL2RhdGEvY2xhc3NNZXRhZGF0YVJlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvZ2V0RGVmYXVsdENsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZWZsZWN0TWV0YWRhdGEvZGF0YS9wZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50UmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb3JlRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9lcnJvci9tb2RlbHMvSW52ZXJzaWZ5Q29yZUVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvQmluZGluZ1NlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL3NlcnZpY2VzL0RlYWN0aXZhdGlvbnNTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvbW9kZWxzL0NsYXNzRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2lzUGVuZGluZ0NsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdmFsaWRhdGVDb25zdHJ1Y3Rvck1ldGFkYXRhQXJyYXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvdGhyb3dBdEludmFsaWRDbGFzc01ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRJbnN0YW5jZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUJpbmRpbmdDYWNoZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRHluYW1pY1ZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lRmFjdG9yeUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZUluc3RhbmNlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lUHJvdmlkZXJCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVSZXNvbHZlZFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lU2VydmljZVJlZGlyZWN0aW9uQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9hY3Rpb25zL2RlY29yYXRlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldERlZmF1bHRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9kZWNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkQ2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9hc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0TWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlTWFuYWdlZE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQcm9wZXJ0eS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9tb2RlbHMvRGVjb3JhdG9ySW5mb0tpbmQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaGFuZGxlSW5qZWN0aW9uRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL2dldERlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9kZWNvcmF0b3IvY2FsY3VsYXRpb25zL3N0cmluZ2lmeURlY29yYXRvckluZm8udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YUNvbnN0cnVjdG9yQXJndW1lbnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL2NsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaXNVc2VybGFuZEVtaXR0ZWRUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVDbGFzc01ldGFkYXRhV2l0aFR5cGVzY3JpcHRQYXJhbWV0ZXJUeXBlcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL3R5cGVzY3JpcHREZXNpZ25QYXJhbWV0ZXJUeXBlc1JlZmxlY3RLZXkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0UGFyYW1ldGVyVHlwZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0YWJsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvc2V0SXNJbmplY3RhYmxlRmxhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXRFeHRlbmRlZENvbnN0cnVjdG9yQXJndW1lbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldEV4dGVuZGVkUHJvcGVydGllcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbUJhc2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL2luamVjdEZyb21IaWVyYXJjaHkudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL211bHRpSW5qZWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9pbmNyZW1lbnRQZW5kaW5nQ2xhc3NNZXRhZGF0YUNvdW50LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkRGVmYXVsdE1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL25hbWVkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNZXRhZGF0YU5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1ldGFkYXRhT3B0aW9uYWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL29wdGlvbmFsLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9wb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNYXliZUNsYXNzTWV0YWRhdGFQb3N0Q29uc3RydWN0b3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3ByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YVByZURlc3Ryb3kudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3RhZ2dlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWV0YWRhdGFUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0VW5tYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRVbm1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2J1aWxkVW5tYW5hZ2VkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3VubWFuYWdlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL21vZGVscy9SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL2NhbGN1bGF0aW9ucy9pc1N0YWNrT3ZlcmZsb3dFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9oYW5kbGVQbGFuRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9tb2RlbHMvTGF6eVBsYW5TZXJ2aWNlTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vbW9kZWxzL1NpbmdsZUltbXV0YWJsZUxpbmtlZExpc3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvYnVpbGRQbGFuQmluZGluZ0NvbnN0cmFpbnRzTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9pc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90aHJvd0Vycm9yV2hlblVuZXhwZWN0ZWRCaW5kaW5nc0Ftb3VudEZvdW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvc3RyaW5naWZ5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9jaGVja1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZVNpbmdsZUluamVjdGlvbkJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2NoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9nZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jYWNoZU5vblJvb3RQbGFuU2VydmljZU5vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5U3VicGxhbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbU1hbmFnZWRDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy90cnlCdWlsZEdldFBsYW5PcHRpb25zRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaXNJbnN0YW5jZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9wbGFuLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2J1aWxkR2V0UGxhbk9wdGlvbnNGcm9tUGxhblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL21vZGVscy9DYWNoZUJpbmRpbmdJbnZhbGlkYXRpb25LaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL21vZGVscy9XZWFrTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvYWRkU2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlMYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5TGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL3JlbW92ZVNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9zZXJ2aWNlcy9QbGFuUmVzdWx0Q2FjaGVTZXJ2aWNlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9hZGRSb290U2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvcmVtb3ZlUm9vdFNlcnZpY2VOb2RlQmluZGluZ0lmQ29udGV4dEZyZWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvaGFuZGxlUmVzb2x2ZUVycm9yLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL2NhY2hlUmVzb2x2ZWRWYWx1ZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ0FjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTaW5nbGV0b25TY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVDb25zdGFudFZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9nZXRTZWxmLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTY29wZWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNjb3BlZEJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlRHluYW1pY1ZhbHVlQmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVGYWN0b3J5QmluZGluZ0NhbGxiYWNrLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQb3N0Q29uc3RydWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVQcm92aWRlckJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9yZXNvbHZlUHJvdmlkZXJCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9nZXRJbnN0YW5jZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9jYWxjdWxhdGlvbnMvZ2V0UmVzb2x2ZWRWYWx1ZU5vZGVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvc2V0SW5zdGFuY2VQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVSZXNvbHZlZFZhbHVlQmluZGluZ1BhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNTY29wZWRCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nUHJlRGVzdHJveS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ1NlcnZpY2VEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlQmluZGluZ3NEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVNb2R1bGVEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTZXJ2aWNlRGVhY3RpdmF0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3BsdWdpbi9zcmMvcGx1Z2luL21vZGVscy9QbHVnaW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9hY3Rpb25zL2dldENvbnRhaW5lck1vZHVsZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvbW9kZWxzL0NvbnRhaW5lck1vZHVsZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0lkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9iaW5kaW5nL3V0aWxzL0JpbmRpbmdDb25zdHJhaW50VXRpbHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb250YWluZXJFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvZXJyb3IvbW9kZWxzL0ludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvYnVpbGRCaW5kaW5nSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNBbnlBbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0JpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5vTmFtZU5vclRhZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb3RQYXJlbnRCaW5kaW5nQ29uc3RyYWludHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUGFyZW50QmluZGluZ0NvbnN0cmFpbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL21vZGVscy9CaW5kaW5nRmx1ZW50U3ludGF4SW1wbGVtZW50YXRpb24udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUmVzb2x2ZWRWYWx1ZU1ldGFkYXRhSW5qZWN0T3B0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNNdWx0aXBsZVJlc29sdmVkVmFsdWVNZXRhZGF0YUluamVjdE9wdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0FueUFuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vdFBhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aFRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNQYXJlbnRCaW5kaW5nQ29uc3RyYWludHNXaXRoU2VydmljZUlkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vQW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvQmluZGluZ01hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbW1vbi9jYWxjdWxhdGlvbnMvZ2V0Rmlyc3RJdGVyYWJsZVJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29tbW9uL2FjdGlvbnMvZ2V0Rmlyc3RJdGVyYXRvclJlc3VsdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL0NvbnRhaW5lck1vZHVsZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9EZWFjdGl2YXRpb25QYXJhbXNNYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvY2FsY3VsYXRpb25zL2J1aWxkRGVhY3RpdmF0aW9uUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvYWN0aW9ucy9yZXNldERlYWN0aXZhdGlvblBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5QYXJhbXNPcGVyYXRpb25zTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsYW5SZXN1bHRDYWNoZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9QbHVnaW5NYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvU2VydmljZVJlZmVyZW5jZU1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TZXJ2aWNlUmVzb2x1dGlvbk1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TbmFwc2hvdE1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9Db250YWluZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL2NvbnRhaW5lci1yZWdpc3RyeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3J1bnRpbWUtZXh0ZW5zaW9ucy9ydW50aW1lLWV4dGVuc2lvbnMuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9idW5kbGUvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvYnVuZGxlL3J1bnRpbWUuY29udGFpbmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2J1bmRsZS9ydW50aW1lLmNvbnRhaW5lci50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BweU1vZGVUaGlzKCk7XG4gICAgICAgIHZhciBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihSZWZsZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIsIHJvb3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmdW5jdGlvblRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGluZGlyZWN0RXZhbFRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAwLCBldmFsKShcIihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pKClcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvcHB5TW9kZVRoaXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UaGlzKCkgfHwgaW5kaXJlY3RFdmFsVGhpcygpO1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyLCByb290KSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgX01hcCA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9IHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgcmVnaXN0cnlTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCA/IFN5bWJvbC5mb3IoXCJAcmVmbGVjdC1tZXRhZGF0YTpyZWdpc3RyeVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnkgPSBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhUHJvdmlkZXIgPSBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKG1ldGFkYXRhUmVnaXN0cnkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlEZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihwcm92aWRlci5PcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjMuMSBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICBwcm92aWRlci5PcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHkgfHwgeCAhPT0geCAmJiB5ICE9PSB5O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG1ldGFkYXRhIHJlZ2lzdHJ5XG4gICAgICAgIC8vIC0gQWxsb3dzIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCJgIGFuZCBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YS9uby1jb25mbGljdFwiYCB0byBpbnRlcm9wZXJhdGUuXG4gICAgICAgIC8vIC0gVXNlcyBpc29sYXRlZCBtZXRhZGF0YSBpZiBgUmVmbGVjdGAgaXMgZnJvemVuIGJlZm9yZSB0aGUgcmVnaXN0cnkgY2FuIGJlIGluc3RhbGxlZC5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSByZWdpc3RyeSB1c2VkIHRvIGFsbG93IG11bHRpcGxlIGByZWZsZWN0LW1ldGFkYXRhYCBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIGZhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgIShyZWdpc3RyeVN5bWJvbCBpbiByb290LlJlZmxlY3QpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBgcmVmbGVjdC1tZXRhZGF0YWAgdGhhdCBkaWQgbm90IHN1cHBvcnQgYSByZWdpc3RyeS5cbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocm9vdC5SZWZsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaXJzdDtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ7XG4gICAgICAgICAgICB2YXIgcmVzdDtcbiAgICAgICAgICAgIHZhciB0YXJnZXRQcm92aWRlck1hcCA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvdmlkZXI6IHJlZ2lzdGVyUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyOiBzZXRQcm92aWRlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGEgZnJvemVuIHJlZ2lzdHJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsbGJhY2sgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChmaXJzdCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3QgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChzZWNvbmQpOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWNvbmQgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0LmFkZChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmQuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3IocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXIoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoUCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBoYXNQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgPT09IHByb3ZpZGVyIHx8IHNlY29uZCA9PT0gcHJvdmlkZXIgfHwgIUlzVW5kZWZpbmVkKHJlc3QpICYmIHJlc3QuaGFzKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgcHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IGdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyICE9PSBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGV4aXN0aW5nUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNoYXJlZCByZWdpc3RyeSBvZiBtZXRhZGF0YSBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IHJvb3QuUmVmbGVjdFtyZWdpc3RyeVN5bWJvbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFSZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdC5SZWZsZWN0LCByZWdpc3RyeVN5bWJvbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YWRhdGFSZWdpc3RyeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihyZWdpc3RyeSkge1xuICAgICAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0YWRhdGEuaGFzKFApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBPcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IE9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeS5yZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkVGFyZ2V0TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUoTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBwcm92aWRlciBmb3IgdGFyZ2V0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5c1trXSA9IG5leHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhTWFwLmRlbGV0ZShNZXRhZGF0YUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyZWZsZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lTWV0YWRhdGEgPSByZWZsZWN0LmRlZmluZU1ldGFkYXRhLCBoYXNPd25NZXRhZGF0YSA9IHJlZmxlY3QuaGFzT3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGFLZXlzID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMsIGRlbGV0ZU1ldGFkYXRhID0gcmVmbGVjdC5kZWxldGVNZXRhZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU93bmVyID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBtZXRhZGF0YU93bmVyLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSAmJiBtZXRhZGF0YVByb3BlcnR5U2V0LmhhcyhQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE93bk1ldGFkYXRhS2V5cyhPLCBQKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhT3duZXIuc2V0KE8sIG1ldGFkYXRhUHJvcGVydHlTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldC5hZGQoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBkZWZpbmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBoYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBnZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogZ2V0T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IGRlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgcHJvdmlkZXIgZm9yIGFuIG9iamVjdC4gSWYgdGhlIG9iamVjdCBoYXMgbm8gbWV0YWRhdGEgcHJvdmlkZXIgYW5kIHRoaXMgaXMgZm9yIGEgY3JlYXRlIG9wZXJhdGlvbixcbiAgICAgICAgICogdGhlbiB0aGlzIG1vZHVsZSdzIG1ldGFkYXRhIHByb3ZpZGVyIGlzIGFzc2lnbmVkIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRQcm92aWRlciA9IG1ldGFkYXRhUmVnaXN0cnkuZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdGVyZWRQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YVJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIG1ldGFkYXRhUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgdmFyIE1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8oa2V5LCB0aGlzLl9jYWNoZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNhbWVWYWx1ZVplcm8odGhpcy5fY2FjaGVLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKHRoaXMuX2tleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVJbmRleCA8IDAgJiYgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBVVUlEX1NJWkUgPSAxNjtcbiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciByb290S2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5oYXModGFibGUsIHRoaXMuX2tleSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVbdGhpcy5fa2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVbmlxdWVLZXkoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBcIkBAV2Vha01hcEBAXCIgKyBDcmVhdGVVVUlEKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKEhhc2hNYXAuaGFzKGtleXMsIGtleSkpO1xuICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh0YXJnZXQsIHJvb3RLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcm9vdEtleSwgeyB2YWx1ZTogSGFzaE1hcC5jcmVhdGUoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEZpbGxSYW5kb21CeXRlcyhidWZmZXIsIHNpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gTWF0aC5yYW5kb20oKSAqIDB4ZmYgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZW5SYW5kb21CeXRlcyhzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxsUmFuZG9tQnl0ZXMoYXJyYXksIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiBcdTAwQTcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbi8vIFJlLWV4cG9ydCBiYXNlIGNvcmUgZnVuY3Rpb25hbGl0eSBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtd2ViIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS13ZWInO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcyc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIGJ1bmRsZVxuZXhwb3J0ICogZnJvbSAnLi9idW5kbGUnO1xuXG4vLyBAbm90ZTogcnVudGltZS13ZWIgaXMgTk9UIGV4cG9ydGVkIGZyb20gTGFtYmRhIGJ1bmRsZSAoY29udGFpbnMgQ0RLIGNvbnN0cnVjdHMpXG4vLyBJdCdzIG9ubHkgdXNlZCBmb3IgYnVpbGQtdGltZSBDREsgc3ludGhlc2lzLCBub3QgTGFtYmRhIHJ1bnRpbWVcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB0eXBlIHsgQnJvd3Nlck1ldGFkYXRhLCBDREtNZXRhZGF0YSwgTGFtYmRhTWV0YWRhdGEgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBDb2xsZWN0IGJyb3dzZXIgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCBpbmNsdWRpbmdcbiAqIHVzZXIgYWdlbnQsIGN1cnJlbnQgVVJMLCBhbmQgdmlld3BvcnQgZGltZW5zaW9ucy4gVGhpcyBtZXRhZGF0YSBpc1xuICogdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBhbmFseXRpY3MgcHVycG9zZXMuXG4gKlxuICogQHJldHVybnMgQnJvd3NlciBtZXRhZGF0YSBvYmplY3RcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYnJvd3NlciBBUElzIGFyZSBub3QgYXZhaWxhYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0QnJvd3Nlck1ldGFkYXRhKCk7XG4gKiBjb25zb2xlLmxvZyhgVXNlciBpcyBvbiAke21ldGFkYXRhLnVybH0gd2l0aCAke21ldGFkYXRhLnZpZXdwb3J0LndpZHRofXgke21ldGFkYXRhLnZpZXdwb3J0LmhlaWdodH0gdmlld3BvcnRgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3Nlck1ldGFkYXRhKCk6IEJyb3dzZXJNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgQVBJcyBub3QgYXZhaWxhYmxlIC0gd2luZG93IG9yIG5hdmlnYXRvciBpcyB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29sbGVjdCBicm93c2VyIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBMYW1iZGEgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVdTIExhbWJkYSBydW50aW1lIGVudmlyb25tZW50XG4gKiBpbmNsdWRpbmcgZnVuY3Rpb24gZGV0YWlscywgcmVnaW9uLCBtZW1vcnkgY29uZmlndXJhdGlvbiwgYW5kIHJlcXVlc3QgY29udGV4dC5cbiAqIFVzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHByb3ZpZGVkIGJ5IHRoZSBMYW1iZGEgcnVudGltZS5cbiAqXG4gKiBAcmV0dXJucyBMYW1iZGEgbWV0YWRhdGEgb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIHJlcXVpcmVkIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG1pc3NpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGEgPSBnZXRMYW1iZGFNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYExhbWJkYSAke21ldGFkYXRhLmZ1bmN0aW9uTmFtZX0gaW4gJHttZXRhZGF0YS5yZWdpb259IHdpdGggJHttZXRhZGF0YS5tZW1vcnlMaW1pdH1NQmApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYW1iZGFNZXRhZGF0YSgpOiBMYW1iZGFNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FO1xuICAgIGlmICghZnVuY3Rpb25OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXU19MQU1CREFfRlVOQ1RJT05fTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbW9yeVNpemUgPSBwYXJzZUludChwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFIHx8ICcxMjgnLCAxMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgdmVyc2lvbjogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9WRVJTSU9OIHx8ICckTEFURVNUJyxcbiAgICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gfHwgJ3VzLWVhc3QtMScsXG4gICAgICBtZW1vcnlMaW1pdDogaXNOYU4obWVtb3J5U2l6ZSkgPyAxMjggOiBtZW1vcnlTaXplLFxuICAgICAgcmVxdWVzdElkOiBwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0xPR19TVFJFQU1fTkFNRSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgTGFtYmRhIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBDREsgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQ0RLIGVudmlyb25tZW50IGluY2x1ZGluZ1xuICogQVdTIGFjY291bnQsIHJlZ2lvbiwgQ0RLIHZlcnNpb24sIGFuZCBOb2RlLmpzIHZlcnNpb24uIFRoaXMgbWV0YWRhdGFcbiAqIGlzIHVzZWQgZm9yIGRlcGxveW1lbnQgY29udGV4dCBhbmQgZGVidWdnaW5nLlxuICpcbiAqIEByZXR1cm5zIENESyBtZXRhZGF0YSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGEgPSBnZXRDREtNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYERlcGxveWluZyB0byBhY2NvdW50ICR7bWV0YWRhdGEuYWNjb3VudH0gaW4gJHttZXRhZGF0YS5yZWdpb259YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENES01ldGFkYXRhKCk6IENES01ldGFkYXRhIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCB8fCAndW5rbm93bicsXG4gICAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCAndXMtZWFzdC0xJyxcbiAgICAgIGNka1ZlcnNpb246IHByb2Nlc3MuZW52LkNES19WRVJTSU9OLFxuICAgICAgbm9kZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgQ0RLIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50Q29udGV4dCB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QnJvd3Nlck1ldGFkYXRhLCBnZXRDREtNZXRhZGF0YSwgZ2V0TGFtYmRhTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhLWNvbGxlY3RvcnMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgZW52aXJvbm1lbnQgZGV0ZWN0b3IgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogQXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgKGJyb3dzZXIsIExhbWJkYSwgb3IgQ0RLKVxuICogYW5kIHByb3ZpZGVzIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGZvciBlYWNoIGNvbnRleHQuIFRoaXMgZW5hYmxlcyB0aGVcbiAqIHVuaWZpZWQgcHVyZW5vdygpIGVudHJ5IHBvaW50IHRvIHJvdXRlIGV4ZWN1dGlvbiB0byB0aGUgY29ycmVjdCBwaXBlbGluZS5cbiAqXG4gKiAqKkRldGVjdGlvbiBQcmlvcml0eSoqOlxuICogMS4gQnJvd3NlcjogQ2hlY2sgZm9yIGB3aW5kb3dgIG9iamVjdFxuICogMi4gTGFtYmRhOiBDaGVjayBmb3IgYEFXU19MQU1CREFfRlVOQ1RJT05fTkFNRWAgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDMuIENESzogQ2hlY2sgZm9yIGV4cGxpY2l0IG1vZGUsIENESyBlbnYgdmFycywgb3IgcHJvY2VzcyBhcmd1bWVudHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGV0ZWN0b3IgPSBuZXcgUnVudGltZURldGVjdG9yKCk7XG4gKiBjb25zdCBjb250ZXh0ID0gZGV0ZWN0b3IuZGV0ZWN0KCk7XG4gKlxuICogc3dpdGNoIChjb250ZXh0LnR5cGUpIHtcbiAqICAgY2FzZSAnYnJvd3Nlcic6XG4gKiAgICAgLy8gRXhlY3V0ZSBicm93c2VyIHBpcGVsaW5lXG4gKiAgICAgYnJlYWs7XG4gKiAgIGNhc2UgJ2xhbWJkYSc6XG4gKiAgICAgLy8gRXhlY3V0ZSBMYW1iZGEgcGlwZWxpbmVcbiAqICAgICBicmVhaztcbiAqICAgY2FzZSAnY2RrJzpcbiAqICAgICAvLyBFeGVjdXRlIENESyBwaXBlbGluZVxuICogICAgIGJyZWFrO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGV0ZWN0b3Ige1xuICAvKipcbiAgICogRGV0ZWN0IHRoZSBjdXJyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIFVzZXMgYSBzZXJpZXMgb2YgY2hlY2tzIHRvIGRldGVybWluZSB0aGUgZXhlY3V0aW9uIGNvbnRleHQ6XG4gICAqIC0gQnJvd3NlcjogUHJlc2VuY2Ugb2YgYHdpbmRvd2Agb2JqZWN0XG4gICAqIC0gTGFtYmRhOiBBV1MgTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAtIENESzogRXhwbGljaXQgbW9kZSBvciBDREstc3BlY2lmaWMgaW5kaWNhdG9yc1xuICAgKlxuICAgKiBAcmV0dXJucyBFbnZpcm9ubWVudCBjb250ZXh0IHdpdGggdHlwZSBhbmQgbWV0YWRhdGFcbiAgICogQHRocm93cyBFcnJvciBpZiBlbnZpcm9ubWVudCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgZGV0ZWN0KCk6IEVudmlyb25tZW50Q29udGV4dCB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdicm93c2VyJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldEJyb3dzZXJNZXRhZGF0YSgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0xhbWJkYSgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGFtYmRhJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldExhbWJkYU1ldGFkYXRhKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ0RLKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjZGsnLFxuICAgICAgICBtZXRhZGF0YTogZ2V0Q0RLTWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1VuYWJsZSB0byBkZXRlY3QgcnVudGltZSBlbnZpcm9ubWVudC4gJyArXG4gICAgICAnRXhwZWN0ZWQgYnJvd3NlciAod2luZG93IG9iamVjdCksIExhbWJkYSAoQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FKSwgJyArXG4gICAgICAnb3IgQ0RLIChQVVJFTk9XX01PREU9Y2RrIG9yIENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYHdpbmRvd2Agb2JqZWN0IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bm5pbmcgaW4gQVdTIExhbWJkYSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBBV1MgTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHByZXNlbnRcbiAgICovXG4gIHByaXZhdGUgaXNMYW1iZGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bm5pbmcgaW4gQ0RLIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBVc2VzIG11bHRpcGxlIGRldGVjdGlvbiBtZXRob2RzIGluIHByaW9yaXR5IG9yZGVyOlxuICAgKiAxLiBFeHBsaWNpdCBtb2RlOiBQVVJFTk9XX01PREU9Y2RrIChyZWNvbW1lbmRlZClcbiAgICogMi4gQ0RLIGVudmlyb25tZW50IHZhcmlhYmxlczogQ0RLX0RFRkFVTFRfQUNDT1VOVCBvciBDREtfREVGQVVMVF9SRUdJT05cbiAgICogMy4gUHJvY2VzcyBhcmd1bWVudHM6IGNvbnRhaW5zICdjZGsnIG9yICdzeW50aCdcbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBDREsgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgaXNDREsoKTogYm9vbGVhbiB7XG4gICAgLy8gUHJpb3JpdHkgMTogRXhwbGljaXQgbW9kZSAocmVjb21tZW5kZWQpXG4gICAgaWYgKHByb2Nlc3MuZW52LlBVUkVOT1dfTU9ERSA9PT0gJ2NkaycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFByaW9yaXR5IDI6IENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCB8fCBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFByaW9yaXR5IDM6IFByb2Nlc3MgYXJndW1lbnRzXG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndi5zb21lKGFyZyA9PlxuICAgICAgYXJnLmluY2x1ZGVzKCdjZGsnKSB8fCBhcmcuaW5jbHVkZXMoJ3N5bnRoJyksXG4gICAgKTtcbiAgfVxuXG5cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFRpZXNJbnN0YW5jZSB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgVGllc1JlZ2lzdHJhdGlvbkVycm9yIH0gZnJvbSAnLi9kaS1lcnJvcnMnO1xuXG4vKipcbiAqIFRpZXMgcmVnaXN0cmF0aW9uIGhlbHBlciBmb3IgUHVyZUNvbnRhaW5lciBpbnRlZ3JhdGlvbi5cbiAqXG4gKiBQcm9jZXNzZXMgVGllcyBjbGFzc2VzIGFuZCByZWdpc3RlcnMgdGhlaXIgc2VydmljZXMgd2l0aCBhIFB1cmVDb250YWluZXIgaW5zdGFuY2UuXG4gKiBFYWNoIFRpZXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgYSByZWdpc3Rlcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPikgbWV0aG9kXG4gKiB0aGF0IHVzZXMgY29udGFpbmVyLnRpZSgpLCBjb250YWluZXIudGllQ29uc3QoKSwgb3IgY29udGFpbmVyLnRpZVNpbmdsZXRvbigpIHRvXG4gKiByZWdpc3RlciBzZXJ2aWNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVnaXN0cmFyID0gbmV3IFRpZXNSZWdpc3RyYXIoKTtcbiAqIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oeyBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nIH0pO1xuICpcbiAqIHJlZ2lzdHJhci5yZWdpc3RlclRpZXMoY29udGFpbmVyLCBbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10pO1xuICpcbiAqIC8vIE5vdyBjb250YWluZXIgaGFzIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoZSBUaWVzIGNsYXNzZXNcbiAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBUaWVzUmVnaXN0cmFyIHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFsbCBUaWVzIGNsYXNzZXMgd2l0aCB0aGUgcHJvdmlkZWQgY29udGFpbmVyLlxuICAgKlxuICAgKiBDYWxscyB0aGUgcmVnaXN0ZXIoY29udGFpbmVyKSBtZXRob2Qgb24gZWFjaCBUaWVzIGNsYXNzIGluc3RhbmNlLlxuICAgKiBUaGUgVGllcyBjbGFzc2VzIGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBjb250YWluZXIudGllKCksXG4gICAqIGNvbnRhaW5lci50aWVDb25zdCgpLCBvciBjb250YWluZXIudGllU2luZ2xldG9uKCkgdG8gcmVnaXN0ZXIgdGhlaXIgc2VydmljZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIHRvIHJlZ2lzdGVyIHNlcnZpY2VzIHdpdGhcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnNcbiAgICogQHRocm93cyBUaWVzUmVnaXN0cmF0aW9uRXJyb3IgaWYgYSBUaWVzIGNsYXNzIGRvZXNuJ3QgaW1wbGVtZW50IHJlZ2lzdGVyKClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBUaWVzIGNsYXNzIGV4YW1wbGVcbiAgICogY2xhc3MgUGF5bWVudHNUaWVzIHtcbiAgICogICByZWdpc3Rlcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPik6IHZvaWQge1xuICAgKiAgICAgY29udGFpbmVyLnRpZVNpbmdsZXRvbih7XG4gICAqICAgICAgIFBheW1lbnRzU2VydmljZToge1xuICAgKiAgICAgICAgIGluc3RhbmNlOiBQYXltZW50c1NlcnZpY2UsXG4gICAqICAgICAgICAgYXJnczogW11cbiAgICogICAgICAgfVxuICAgKiAgICAgfSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHJlZ2lzdHJhci5yZWdpc3RlclRpZXMoY29udGFpbmVyLCBbUGF5bWVudHNUaWVzXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXJUaWVzKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCB0aWVzQ2xhc3NlczogVGllc0luc3RhbmNlW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFRpZXNDbGFzcyBvZiB0aWVzQ2xhc3Nlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGllc0luc3RhbmNlID0gbmV3IFRpZXNDbGFzcygpIGFzIGFueTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBUaWVzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJlZ2lzdGVyIG1ldGhvZFxuICAgICAgICBpZiAodHlwZW9mIHRpZXNJbnN0YW5jZS5yZWdpc3RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUaWVzUmVnaXN0cmF0aW9uRXJyb3IoXG4gICAgICAgICAgICBUaWVzQ2xhc3MubmFtZSxcbiAgICAgICAgICAgICdUaWVzIGNsYXNzIG11c3QgaW1wbGVtZW50IHJlZ2lzdGVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KSBtZXRob2QnLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIHRoZSByZWdpc3RlciBtZXRob2QgdG8gbGV0IHRoZSBUaWVzIGNsYXNzIHJlZ2lzdGVyIGl0cyBzZXJ2aWNlc1xuICAgICAgICB0aWVzSW5zdGFuY2UucmVnaXN0ZXIoY29udGFpbmVyKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGllc1JlZ2lzdHJhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgVGllc1JlZ2lzdHJhdGlvbkVycm9yKFxuICAgICAgICAgIFRpZXNDbGFzcy5uYW1lLFxuICAgICAgICAgIGBGYWlsZWQgdG8gaW5zdGFudGlhdGUgb3IgcmVnaXN0ZXIgVGllcyBjbGFzczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhbGwgcmVxdWlyZWQgc2VydmljZXMgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQXR0ZW1wdHMgdG8gcmVzb2x2ZSBlYWNoIHNlcnZpY2UgbmFtZSB0byBlbnN1cmUgaXQncyBwcm9wZXJseSByZWdpc3RlcmVkLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgbWlzc2luZyBzZXJ2aWNlIHJlZ2lzdHJhdGlvbnMgZWFybHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSByZXF1aXJlZFNlcnZpY2VzIC0gQXJyYXkgb2Ygc2VydmljZSBuYW1lcyB0aGF0IG11c3QgYmUgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGFueSByZXF1aXJlZCBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogcmVnaXN0cmFyLnZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgWydQYXltZW50c1NlcnZpY2UnLCAnQmlsbGluZ1NlcnZpY2UnXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sIHJlcXVpcmVkU2VydmljZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgbWlzc2luZ1NlcnZpY2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlTmFtZSBvZiByZXF1aXJlZFNlcnZpY2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIHNlcnZpY2UgKHRoaXMgd2lsbCB0aHJvdyBpZiBub3QgcmVnaXN0ZXJlZClcbiAgICAgICAgY29udGFpbmVyLnJ1bihzZXJ2aWNlTmFtZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtaXNzaW5nU2VydmljZXMucHVzaChzZXJ2aWNlTmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZXF1aXJlZCBzZXJ2aWNlcyBhcmUgbm90IHJlZ2lzdGVyZWQgaW4gY29udGFpbmVyOiAke21pc3NpbmdTZXJ2aWNlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSBUaWVzIGNsYXNzZXMgZm9yIHZhbGlkYXRpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmVcbiAgICogd2hpY2ggc2VydmljZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgYSBzZXQgb2YgVGllcyBjbGFzc2VzLlxuICAgKiBOb3RlOiBUaGlzIHJlcXVpcmVzIHRoZSBUaWVzIGNsYXNzZXMgdG8gZXhwb3NlIHRoZWlyIHNlcnZpY2UgbmFtZXMsXG4gICAqIHdoaWNoIGlzIG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZCBmb3IgYmV0dGVyIGVycm9yIHJlcG9ydGluZy5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc2VydmljZSBuYW1lcyB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZXhwZWN0ZWRTZXJ2aWNlcyA9IHJlZ2lzdHJhci5leHRyYWN0U2VydmljZU5hbWVzKFtQYXltZW50c1RpZXNdKTtcbiAgICogcmVnaXN0cmFyLnZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgZXhwZWN0ZWRTZXJ2aWNlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZXh0cmFjdFNlcnZpY2VOYW1lcyh0aWVzQ2xhc3NlczogVGllc0luc3RhbmNlW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VydmljZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBUaWVzQ2xhc3Mgb2YgdGllc0NsYXNzZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRpZXNJbnN0YW5jZSA9IG5ldyBUaWVzQ2xhc3MoKSBhcyBhbnk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFRpZXMgY2xhc3MgZXhwb3NlcyBpdHMgc2VydmljZSBuYW1lc1xuICAgICAgICBpZiAodHlwZW9mIHRpZXNJbnN0YW5jZS5nZXRTZXJ2aWNlTmFtZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zdCBuYW1lcyA9IHRpZXNJbnN0YW5jZS5nZXRTZXJ2aWNlTmFtZXMoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lcykpIHtcbiAgICAgICAgICAgIHNlcnZpY2VOYW1lcy5wdXNoKC4uLm5hbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnMgZHVyaW5nIHNlcnZpY2UgbmFtZSBleHRyYWN0aW9uXG4gICAgICAgIC8vIFRoaXMgaXMgb3B0aW9uYWwgZnVuY3Rpb25hbGl0eVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZXJ2aWNlTmFtZXM7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSBESSBjb250YWluZXIgb3BlcmF0aW9uIGZhaWxzLlxuICpcbiAqIFVzZWQgZm9yIGNvbnRhaW5lciBjcmVhdGlvbiwgc2VydmljZSByZXNvbHV0aW9uLCBhbmQgdmFsaWRhdGlvbiBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBESUNvbnRhaW5lckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IERJIGNvbnRhaW5lciBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBOYW1lIG9yIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lclxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIERldGFpbGVkIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lck5hbWU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYERJIENvbnRhaW5lciAnJHtjb250YWluZXJOYW1lfSc6ICR7bWVzc2FnZX1gKTtcbiAgICB0aGlzLm5hbWUgPSAnRElDb250YWluZXJFcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBUaWVzIGNsYXNzIHJlZ2lzdHJhdGlvbiBmYWlscy5cbiAqXG4gKiBVc2VkIHdoZW4gYSBUaWVzIGNsYXNzIGRvZXNuJ3QgaW1wbGVtZW50IHRoZSByZXF1aXJlZCByZWdpc3RlcigpIG1ldGhvZFxuICogb3Igd2hlbiByZWdpc3RyYXRpb24gZmFpbHMgZm9yIG90aGVyIHJlYXNvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaWVzUmVnaXN0cmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgVGllcyByZWdpc3RyYXRpb24gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NOYW1lIC0gTmFtZSBvZiB0aGUgVGllcyBjbGFzcyB0aGF0IGZhaWxlZFxuICAgKiBAcGFyYW0gcmVhc29uIC0gUmVhc29uIGZvciB0aGUgcmVnaXN0cmF0aW9uIGZhaWx1cmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRpZXNDbGFzc05hbWU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgVGllcyByZWdpc3RyYXRpb24gZmFpbGVkIGZvciAnJHt0aWVzQ2xhc3NOYW1lfSc6ICR7cmVhc29ufWApO1xuICAgIHRoaXMubmFtZSA9ICdUaWVzUmVnaXN0cmF0aW9uRXJyb3InO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG59XG5cbi8qKlxuICogRXJyb3IgdGhyb3duIHdoZW4gYSByZXF1aXJlZCBzZXJ2aWNlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY29udGFpbmVyLlxuICpcbiAqIFVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlc29sdmUgYSBzZXJ2aWNlIHRoYXQgaGFzbid0IGJlZW4gcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbWlzc2luZyBzZXJ2aWNlIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaXNzaW5nIHNlcnZpY2VcbiAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgLSBOYW1lIG9yIGlkZW50aWZpZXIgb2YgdGhlIGNvbnRhaW5lclxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2VydmljZU5hbWU6IHN0cmluZywgY29udGFpbmVyTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYFNlcnZpY2UgJyR7c2VydmljZU5hbWV9JyBub3QgZm91bmQgaW4gY29udGFpbmVyICcke2NvbnRhaW5lck5hbWV9J2ApO1xuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nU2VydmljZUVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgcHVyYWJsZSwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgVGllc0luc3RhbmNlIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgeyBUaWVzUmVnaXN0cmFyIH0gZnJvbSAnLi90aWVzLXJlZ2lzdHJhcic7XG5pbXBvcnQgeyBESUNvbnRhaW5lckVycm9yIH0gZnJvbSAnLi9kaS1lcnJvcnMnO1xuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGFuZCBjb25maWd1cmluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlcyBmb3IgbWljcm9zZXJ2aWNlcy5cbiAqXG4gKiBDcmVhdGVzIFB1cmVDb250YWluZXI8c3RyaW5nPiBpbnN0YW5jZXMgd2l0aCBzaW5nbGV0b24gc2NvcGUgYnkgZGVmYXVsdCBhbmRcbiAqIHJlZ2lzdGVycyBhbGwgc2VydmljZXMgZnJvbSB0aGUgcHJvdmlkZWQgVGllcyBjbGFzc2VzLiBUaGlzIHByb3ZpZGVzIGFcbiAqIGNvbnNpc3RlbnQgd2F5IHRvIGJ1aWxkIERJIGNvbnRhaW5lcnMgZm9yIG1pY3Jvc2VydmljZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZhY3RvcnkgPSBuZXcgUHVyZUNvbnRhaW5lckZhY3RvcnkoKTtcbiAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSk7XG4gKlxuICogLy8gQ29udGFpbmVyIG5vdyBoYXMgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgYnkgdGhlIFRpZXMgY2xhc3Nlc1xuICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gKiBgYGBcbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFB1cmVDb250YWluZXJGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSB0aWVzUmVnaXN0cmFyOiBUaWVzUmVnaXN0cmFyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudGllc1JlZ2lzdHJhciA9IG5ldyBUaWVzUmVnaXN0cmFyKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUHVyZUNvbnRhaW5lciBmb3IgYSBtaWNyb3NlcnZpY2Ugd2l0aCByZWdpc3RlcmVkIFRpZXMgY2xhc3Nlcy5cbiAgICpcbiAgICogQ3JlYXRlcyBhIG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4gd2l0aCBzaW5nbGV0b24gc2NvcGUgYnkgZGVmYXVsdCxcbiAgICogdGhlbiByZWdpc3RlcnMgYWxsIHNlcnZpY2VzIGZyb20gdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnMgdG8gcmVnaXN0ZXJcbiAgICogQHJldHVybnMgQ29uZmlndXJlZCBQdXJlQ29udGFpbmVyIHdpdGggYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWRcbiAgICogQHRocm93cyBESUNvbnRhaW5lckVycm9yIGlmIGNvbnRhaW5lciBjcmVhdGlvbiBvciByZWdpc3RyYXRpb24gZmFpbHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbXG4gICAqICAgUGF5bWVudHNUaWVzLFxuICAgKiAgIEJpbGxpbmdUaWVzLFxuICAgKiAgIENvbmZpZ1RpZXNcbiAgICogXSk7XG4gICAqXG4gICAqIC8vIFVzZSB0aGUgY29udGFpbmVyIHRvIHJlc29sdmUgc2VydmljZXNcbiAgICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gICAqIGNvbnN0IGNvbmZpZyA9IGNvbnRhaW5lci5ydW5Db25zdGFudCgnUGF5bWVudHNDb25maWcnKTtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIodGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIFB1cmVDb250YWluZXIgd2l0aCBzaW5nbGV0b24gc2NvcGUgYnkgZGVmYXVsdFxuICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IFB1cmVDb250YWluZXI8c3RyaW5nPih7XG4gICAgICAgIGRlZmF1bHRTY29wZTogJ1NpbmdsZXRvbicsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmVnaXN0ZXIgYWxsIFRpZXMgY2xhc3Nlc1xuICAgICAgdGhpcy50aWVzUmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIHRpZXNDbGFzc2VzKTtcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgJ21pY3Jvc2VydmljZScsXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIG1pY3Jvc2VydmljZSBjb250YWluZXI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBQdXJlQ29udGFpbmVyIHdpdGggY3VzdG9tIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEFsbG93cyBjcmVhdGluZyBjb250YWluZXJzIHdpdGggY3VzdG9tIHNjb3BlIHNldHRpbmdzIG9yIG90aGVyIG9wdGlvbnMuXG4gICAqIFN0aWxsIHJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgVGllcyBjbGFzc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9ycyB0byByZWdpc3RlclxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFB1cmVDb250YWluZXIgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyZWQgUHVyZUNvbnRhaW5lciB3aXRoIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBjb250YWluZXIgY3JlYXRpb24gb3IgcmVnaXN0cmF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVDdXN0b21Db250YWluZXIoXG4gICAqICAgW1BheW1lbnRzVGllc10sXG4gICAqICAgeyBkZWZhdWx0U2NvcGU6ICdUcmFuc2llbnQnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVDdXN0b21Db250YWluZXIoXG4gICAgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdLFxuICAgIG9wdGlvbnM6IHsgZGVmYXVsdFNjb3BlPzogJ1NpbmdsZXRvbicgfCAnVHJhbnNpZW50JyB9ID0ge30sXG4gICk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4ob3B0aW9ucyk7XG4gICAgICB0aGlzLnRpZXNSZWdpc3RyYXIucmVnaXN0ZXJUaWVzKGNvbnRhaW5lciwgdGllc0NsYXNzZXMpO1xuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgJ2N1c3RvbScsXG4gICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIGN1c3RvbSBjb250YWluZXI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IGEgY29udGFpbmVyIGhhcyBhbGwgcmVxdWlyZWQgc2VydmljZXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgZGVsZWdhdGVzIHRvIFRpZXNSZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoKS5cbiAgICogVXNlZnVsIGZvciBlbnN1cmluZyBjb250YWluZXIgaW50ZWdyaXR5IGFmdGVyIGNyZWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gcmVxdWlyZWRTZXJ2aWNlcyAtIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBtdXN0IGJlIHJlZ2lzdGVyZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBhbnkgcmVxdWlyZWQgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKFtQYXltZW50c1RpZXNdKTtcbiAgICogZmFjdG9yeS52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIFsnUGF5bWVudHNTZXJ2aWNlJywgJ1BheW1lbnRzQ29uZmlnJ10pO1xuICAgKiBgYGBcbiAgICovXG4gIHZhbGlkYXRlQ29udGFpbmVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+LCByZXF1aXJlZFNlcnZpY2VzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMudGllc1JlZ2lzdHJhci52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIHJlcXVpcmVkU2VydmljZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNvbnRhaW5lciBhbmQgdmFsaWRhdGUgaXQgaGFzIGFsbCBleHBlY3RlZCBzZXJ2aWNlcy5cbiAgICpcbiAgICogQ29tYmluZXMgY29udGFpbmVyIGNyZWF0aW9uIHdpdGggdmFsaWRhdGlvbiBpbiBhIHNpbmdsZSBzdGVwLlxuICAgKiBBdXRvbWF0aWNhbGx5IGV4dHJhY3RzIGV4cGVjdGVkIHNlcnZpY2UgbmFtZXMgZnJvbSBUaWVzIGNsYXNzZXMgaWYgcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBhZGRpdGlvbmFsU2VydmljZXMgLSBBZGRpdGlvbmFsIHNlcnZpY2UgbmFtZXMgdG8gdmFsaWRhdGUgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyBWYWxpZGF0ZWQgUHVyZUNvbnRhaW5lciB3aXRoIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBjb250YWluZXIgY3JlYXRpb24gZmFpbHNcbiAgICogQHRocm93cyBFcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVWYWxpZGF0ZWRDb250YWluZXIoW1BheW1lbnRzVGllc10pO1xuICAgKiAvLyBDb250YWluZXIgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IFBheW1lbnRzVGllc1xuICAgKiBgYGBcbiAgICovXG4gIGNyZWF0ZVZhbGlkYXRlZENvbnRhaW5lcihcbiAgICB0aWVzQ2xhc3NlczogVGllc0luc3RhbmNlW10sXG4gICAgYWRkaXRpb25hbFNlcnZpY2VzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKHRpZXNDbGFzc2VzKTtcblxuICAgIC8vIEV4dHJhY3Qgc2VydmljZSBuYW1lcyBmcm9tIFRpZXMgY2xhc3NlcyBpZiBwb3NzaWJsZVxuICAgIGNvbnN0IGV4cGVjdGVkU2VydmljZXMgPSB0aGlzLnRpZXNSZWdpc3RyYXIuZXh0cmFjdFNlcnZpY2VOYW1lcyh0aWVzQ2xhc3Nlcyk7XG4gICAgY29uc3QgYWxsUmVxdWlyZWRTZXJ2aWNlcyA9IFsuLi5leHBlY3RlZFNlcnZpY2VzLCAuLi5hZGRpdGlvbmFsU2VydmljZXNdO1xuXG4gICAgaWYgKGFsbFJlcXVpcmVkU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIGFsbFJlcXVpcmVkU2VydmljZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IGxvZ2dlciwgcHVyYWJsZSwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0Bhd3MtbGFtYmRhLXBvd2VydG9vbHMvbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhRGVmaW5pdGlvbiB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgZnVsbFdyYXBwZXIgfSBmcm9tICcuL2hhbmRsZXItd3JhcHBlcnMnO1xuaW1wb3J0IHsgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgfSBmcm9tICcuL3J1bnRpbWUtd2ViLWxhbWJkYS1oYW5kbGVyJztcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBMYW1iZGEgaGFuZGxlcnMgd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBUcmFuc2Zvcm1zIHVzZXItcHJvdmlkZWQgTGFtYmRhIGRlZmluaXRpb25zIGludG8gZnVsbCBMYW1iZGEgaGFuZGxlciBjbGFzc2VzXG4gKiB0aGF0IGV4dGVuZCBMYW1iZGFBcGkgYW5kIGluY2x1ZGUgYXV0b21hdGljIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHVzaW5nXG4gKiBQdXJlQ29udGFpbmVyLiBIYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIERJIHJlc29sdXRpb24gYW5kIGVycm9yIHdyYXBwaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmYWN0b3J5ID0gbmV3IExhbWJkYUhhbmRsZXJGYWN0b3J5KCk7XG4gKiBjb25zdCBoYW5kbGVyID0gZmFjdG9yeS5jcmVhdGUobGFtYmRhRGVmaW5pdGlvbiwgY29udGFpbmVyKTtcbiAqXG4gKiAvLyBIYW5kbGVyIGlzIHJlYWR5IHRvIGJlIGludm9rZWQgYnkgQVdTIExhbWJkYSBydW50aW1lXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBMYW1iZGFIYW5kbGVyRmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIoe1xuICAgICAgc2VydmljZU5hbWU6ICdAY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnknLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIExhbWJkYSBoYW5kbGVyIGNsYXNzIGluc3RhbmNlIGZyb20gYSBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgdGhhdCBleHRlbmRzIExhbWJkYUFwaSBhbmQgaW5jbHVkZXNcbiAgICogYXV0b21hdGljIGRlcGVuZGVuY3kgaW5qZWN0aW9uLiBUaGUgaGFuZGxlciB3aWxsIHJlc29sdmUgZGVwZW5kZW5jaWVzXG4gICAqIGZyb20gdGhlIHByb3ZpZGVkIGNvbnRhaW5lciBhbmQgaW5qZWN0IHRoZW0gaW50byB0aGUgdXNlcidzIGhhbmRsZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIExhbWJkYSBoYW5kbGVyIGNsYXNzIGluc3RhbmNlIHJlYWR5IGZvciBBV1MgTGFtYmRhIHJ1bnRpbWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBsYW1iZGFEZWY6IExhbWJkYURlZmluaXRpb24gPSB7XG4gICAqICAgaWQ6ICdjaGFyZ2UnLFxuICAgKiAgIHRpZXM6IFtQYXltZW50c1NlcnZpY2UsIEJpbGxpbmdTZXJ2aWNlXSxcbiAgICogICBoYW5kbGVyOiAoZGVwcykgPT4gYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7XG4gICAqICAgICByZXR1cm4gYXdhaXQgZGVwcy5wYXltZW50c1NlcnZpY2UucHJvY2Vzc0NoYXJnZShldmVudC5ib2R5KTtcbiAgICogICB9XG4gICAqIH07XG4gICAqXG4gICAqIGNvbnN0IGhhbmRsZXIgPSBmYWN0b3J5LmNyZWF0ZShsYW1iZGFEZWYsIGNvbnRhaW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlKGRlZmluaXRpb246IExhbWJkYURlZmluaXRpb24sIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KTogUnVudGltZVdlYkxhbWJkYUhhbmRsZXIge1xuICAgIHRoaXMubG9nZ2VyLmluZm8oJ0NyZWF0aW5nIExhbWJkYSBoYW5kbGVyJywge1xuICAgICAgbGFtYmRhSWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICBzZXJ2aWNlOiBkZWZpbml0aW9uLnNlcnZpY2UsXG4gICAgICBkZXBlbmRlbmN5Q291bnQ6IGRlZmluaXRpb24udGllcy5sZW5ndGgsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyKGRlZmluaXRpb24sIGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0IGRlcGVuZGVuY2llcyBmcm9tIFB1cmVDb250YWluZXIgdXNpbmcgY2xhc3MgcmVmZXJlbmNlcy5cbiAgICpcbiAgICogUmVzb2x2ZXMgY2xhc3MgcmVmZXJlbmNlcyB0byBzZXJ2aWNlIGluc3RhbmNlcyB1c2luZyBQdXJlQ29udGFpbmVyLnJ1bigpXG4gICAqIHdpdGggY2xhc3MgbmFtZXMgYXMga2V5cy4gQ29udmVydHMgY2xhc3MgbmFtZXMgdG8gY2FtZWxDYXNlIGZvciB0aGVcbiAgICogZGVwZW5kZW5jeSBvYmplY3Qga2V5cyAoZS5nLiwgUGF5bWVudHNTZXJ2aWNlIFx1MjE5MiBwYXltZW50c1NlcnZpY2UpLlxuICAgKlxuICAgKiBAcGFyYW0gdGllcyAtIEFycmF5IG9mIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNhbWVsQ2FzZSBrZXlzIGNvbnRhaW5pbmcgcmVzb2x2ZWQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IGRlcGVuZGVuY3kgY2Fubm90IGJlIHJlc29sdmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGllcyA9IFtQYXltZW50c1NlcnZpY2UsIEJpbGxpbmdTZXJ2aWNlXTtcbiAgICogY29uc3QgZGVwcyA9IGZhY3RvcnkuaW5qZWN0RGVwZW5kZW5jaWVzKHRpZXMsIGNvbnRhaW5lcik7XG4gICAqIC8vIFJlc3VsdDogeyBwYXltZW50c1NlcnZpY2U6IFBheW1lbnRzU2VydmljZSwgYmlsbGluZ1NlcnZpY2U6IEJpbGxpbmdTZXJ2aWNlIH1cbiAgICogYGBgXG4gICAqL1xuICBpbmplY3REZXBlbmRlbmNpZXMoXG4gICAgdGllczogQXJyYXk8bmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+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+O1xuXG4gIGlmIChldnQuUmVjb3JkcyAmJiBBcnJheS5pc0FycmF5KGV2dC5SZWNvcmRzKSkge1xuICAgIHJldHVybiAnYXdzLWV2ZW50JztcbiAgfVxuXG4gIGlmIChldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpIHtcbiAgICByZXR1cm4gJ2FwaS1nYXRld2F5JztcbiAgfVxuXG4gIGlmIChldnQuc291cmNlID09PSAnYXdzLmV2ZW50cycpIHtcbiAgICByZXR1cm4gJ2V2ZW50YnJpZGdlJztcbiAgfVxuXG4gIGlmIChldnQuZXZlbnRTb3VyY2UgPT09ICdhd3M6czMnKSB7XG4gICAgcmV0dXJuICdzMyc7XG4gIH1cblxuICByZXR1cm4gJ2N1c3RvbSc7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgZXZlbnQgaXMgYW4gQVBJIEdhdGV3YXkgZXZlbnQuXG4gKlxuICogQHBhcmFtIGV2ZW50IC0gTGFtYmRhIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMgVHJ1ZSBpZiBBUEkgR2F0ZXdheSBldmVudFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNBcGlHYXRld2F5RXZlbnQoZXZlbnQ6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFldmVudCB8fCB0eXBlb2YgZXZlbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXZ0ID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAhIShldnQuaHR0cE1ldGhvZCB8fCBldnQucmVxdWVzdENvbnRleHQpO1xufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyLCBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHsgTGFtYmRhQXBpIH0gZnJvbSAnQHdvcmt0aWYvcHVyZXdzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0Bhd3MtbGFtYmRhLXBvd2VydG9vbHMvbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhSW50ZXJmYWNlIH0gZnJvbSAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9jb21tb25zL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhRGVmaW5pdGlvbiB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFIYW5kbGVyRmFjdG9yeSB9IGZyb20gJy4vbGFtYmRhLWhhbmRsZXItZmFjdG9yeSc7XG5cbi8qKlxuICogUnVudGltZSBXZWIgTGFtYmRhIGhhbmRsZXIgdGhhdCBleHRlbmRzIExhbWJkYUFwaSB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgYnJpZGdlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIGV4aXN0aW5nIFB1cmVub3cgQ29yZSBMYW1iZGFBcGlcbiAqIGluZnJhc3RydWN0dXJlIGFuZCB0aGUgbmV3IFJ1bnRpbWUgV2ViIENvcmUgZGVwZW5kZW5jeSBpbmplY3Rpb24gc3lzdGVtLlxuICogSXQgZXh0ZW5kcyBMYW1iZGFBcGkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aGlsZSBhZGRpbmcgYXV0b21hdGljXG4gKiBESSByZXNvbHV0aW9uIGFuZCB1c2VyIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaGFuZGxlciA9IG5ldyBSdW50aW1lV2ViTGFtYmRhSGFuZGxlcihkZWZpbml0aW9uLCBjb250YWluZXIsIGZhY3RvcnkpO1xuICpcbiAqIC8vIEFXUyBMYW1iZGEgcnVudGltZSBjYWxscyB0aGlzIG1ldGhvZFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgZXh0ZW5kcyBMYW1iZGFBcGkgaW1wbGVtZW50cyBMYW1iZGFJbnRlcmZhY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJIYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJ1bnRpbWUgV2ViIExhbWJkYSBoYW5kbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIHdpdGggcmVnaXN0ZXJlZCBzZXJ2aWNlc1xuICAgKiBAcGFyYW0gZmFjdG9yeSAtIEZhY3RvcnkgaW5zdGFuY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCB3cmFwcGluZ1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3J5OiBMYW1iZGFIYW5kbGVyRmFjdG9yeSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyKHtcbiAgICAgIHNlcnZpY2VOYW1lOiAnQGNvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9ydW50aW1lLXdlYi1sYW1iZGEtaGFuZGxlcicsXG4gICAgICBwZXJzaXN0ZW50TG9nQXR0cmlidXRlczoge1xuICAgICAgICBsYW1iZGFJZDogZGVmaW5pdGlvbi5pZCxcbiAgICAgICAgc2VydmljZTogZGVmaW5pdGlvbi5zZXJ2aWNlLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFByZS1yZXNvbHZlIHRoZSB1c2VyIGhhbmRsZXIgd2l0aCBkZXBlbmRlbmNpZXNcbiAgICB0aGlzLnVzZXJIYW5kbGVyID0gdGhpcy5jcmVhdGVVc2VySGFuZGxlcigpO1xuXG4gICAgdGhpcy5sb2dnZXIuaW5mbygnUnVudGltZVdlYkxhbWJkYUhhbmRsZXIgaW5pdGlhbGl6ZWQnLCB7XG4gICAgICBsYW1iZGFJZDogZGVmaW5pdGlvbi5pZCxcbiAgICAgIHNlcnZpY2U6IGRlZmluaXRpb24uc2VydmljZSxcbiAgICAgIGRlcGVuZGVuY3lDb3VudDogZGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWluIExhbWJkYSBoYW5kbGVyIG1ldGhvZCBjYWxsZWQgYnkgQVdTIExhbWJkYSBydW50aW1lLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIEFXUyBMYW1iZGEgcnVudGltZSBmb3IgZWFjaCBpbnZvY2F0aW9uLlxuICAgKiBJdCBpbmplY3RzIGRlcGVuZGVuY2llcywgY2FsbHMgdGhlIHVzZXIncyBoYW5kbGVyIGZ1bmN0aW9uLCBhbmQgcmV0dXJuc1xuICAgKiB0aGUgcmVzdWx0LiBFeHRlbmRzIHRoZSBleGlzdGluZyBMYW1iZGFBcGkuaGFuZGxlcigpIG1ldGhvZCB0byBhZGRcbiAgICogZGVwZW5kZW5jeSBpbmplY3Rpb24gc3VwcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gTGFtYmRhIGV2ZW50IG9iamVjdFxuICAgKiBAcGFyYW0gY29udGV4dCAtIExhbWJkYSBjb250ZXh0IG9iamVjdFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaGFuZGxlciByZXN1bHRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBV1MgTGFtYmRhIHJ1bnRpbWUgY2FsbHMgdGhpcyBhdXRvbWF0aWNhbGx5XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlcihhcGlHYXRld2F5RXZlbnQsIGxhbWJkYUNvbnRleHQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGhhbmRsZXIoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0hhbmRsZXIgaW52b2NhdGlvbiBzdGFydGVkJywge1xuICAgICAgICBldmVudFR5cGU6IHR5cGVvZiBldmVudCxcbiAgICAgICAgY29udGV4dFR5cGU6IHR5cGVvZiBjb250ZXh0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENhbGwgdGhlIHByZS1yZXNvbHZlZCB1c2VyIGhhbmRsZXJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXNlckhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSGFuZGxlciBpbnZvY2F0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignSGFuZGxlciBpbnZvY2F0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZS10aHJvdyB0byBtYWludGFpbiBMYW1iZGEgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3JcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHVzZXIgaGFuZGxlciB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCB3cmFwcGluZy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byByZXNvbHZlIGRlcGVuZGVuY2llc1xuICAgKiBhbmQgY3JlYXRlIHRoZSB3cmFwcGVkIHVzZXIgaGFuZGxlci4gVGhlIHJlc3VsdCBpcyBjYWNoZWQgZm9yIHJldXNlXG4gICAqIGFjcm9zcyBMYW1iZGEgaW52b2NhdGlvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgREkgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgV3JhcHBlZCB1c2VyIGhhbmRsZXIgd2l0aCBkZXBlbmRlbmNpZXMgaW5qZWN0ZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVXNlckhhbmRsZXIoKTogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICB0cnkge1xuICAgICAgLy8gSW5qZWN0IGRlcGVuZGVuY2llcyB1c2luZyB0aGUgZmFjdG9yeVxuICAgICAgY29uc3QgZGVwcyA9IHRoaXMuZmFjdG9yeS5pbmplY3REZXBlbmRlbmNpZXModGhpcy5kZWZpbml0aW9uLnRpZXMsIHRoaXMuY29udGFpbmVyKTtcblxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0RlcGVuZGVuY2llcyByZXNvbHZlZCBmb3IgdXNlciBoYW5kbGVyJywge1xuICAgICAgICBkZXBlbmRlbmN5S2V5czogT2JqZWN0LmtleXMoZGVwcyksXG4gICAgICB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB1c2VyIGhhbmRsZXIgZnJvbSB0aGUgZGVmaW5pdGlvblxuICAgICAgY29uc3QgcmF3VXNlckhhbmRsZXIgPSB0aGlzLmRlZmluaXRpb24uaGFuZGxlcihkZXBzKTtcblxuICAgICAgLy8gV3JhcCB0aGUgaGFuZGxlciB3aXRoIGxvZ2dpbmcgYW5kIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IHRoaXMuZmFjdG9yeS53cmFwSGFuZGxlcihyYXdVc2VySGFuZGxlciwge1xuICAgICAgICBpZDogdGhpcy5kZWZpbml0aW9uLmlkIHx8ICd1bmtub3duJyxcbiAgICAgICAgc2VydmljZTogdGhpcy5kZWZpbml0aW9uLnNlcnZpY2UgfHwgJ3Vua25vd24nLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1VzZXIgaGFuZGxlciBjcmVhdGVkIGFuZCB3cmFwcGVkIHN1Y2Nlc3NmdWxseScpO1xuXG4gICAgICByZXR1cm4gd3JhcHBlZEhhbmRsZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgdXNlciBoYW5kbGVyJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBjcmVhdGUgdXNlciBoYW5kbGVyIGZvciBMYW1iZGEgJyR7dGhpcy5kZWZpbml0aW9uLmlkfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBMYW1iZGEgZGVmaW5pdGlvbiB1c2VkIGJ5IHRoaXMgaGFuZGxlci5cbiAgICpcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgZGVidWdnaW5nXG4gICAqIG9yIGludHJvc3BlY3Rpb24gcHVycG9zZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBMYW1iZGEgZGVmaW5pdGlvblxuICAgKi9cbiAgZ2V0RGVmaW5pdGlvbigpOiBMYW1iZGFEZWZpbml0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5kZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgUHVyZUNvbnRhaW5lciB1c2VkIGJ5IHRoaXMgaGFuZGxlci5cbiAgICpcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBESSBjb250YWluZXIgZm9yIGRlYnVnZ2luZyBvciBhZHZhbmNlZFxuICAgKiB1c2UgY2FzZXMuIEdlbmVyYWxseSBub3QgbmVlZGVkIGluIG5vcm1hbCBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlXG4gICAqL1xuICBnZXRDb250YWluZXIoKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGhhbmRsZXIgaGFzIGJlZW4gcHJvcGVybHkgaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHVzZXIgaGFuZGxlciBoYXMgYmVlbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseVxuICAgKiBhbmQgaXMgcmVhZHkgZm9yIGludm9jYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgaGFuZGxlciBpcyByZWFkeSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVzZXJIYW5kbGVyICE9PSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB7IHB1cmFibGUsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24sIE1pY3Jvc2VydmljZURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IFB1cmVDb250YWluZXJGYWN0b3J5IH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvZGkvcHVyZS1jb250YWluZXItZmFjdG9yeSc7XG5pbXBvcnQgeyBDb250YWluZXJSZWdpc3RyeSB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9jb250YWluZXItcmVnaXN0cnknO1xuXG4vKipcbiAqIE1pY3Jvc2VydmljZSByZWdpc3RyYXIgZm9yIG1hbmFnaW5nIERJIGNvbnRhaW5lcnMgYW5kIExhbWJkYSBtYXBwaW5ncy5cbiAqXG4gKiBQcm9jZXNzZXMgbWljcm9zZXJ2aWNlIGRlZmluaXRpb25zIHRvIGNyZWF0ZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlcyBhbmRcbiAqIG1haW50YWlucyBtYXBwaW5ncyBiZXR3ZWVuIExhbWJkYSBmdW5jdGlvbnMgYW5kIHRoZWlyIHBhcmVudCBzZXJ2aWNlcy5cbiAqIFRoaXMgZW5hYmxlcyB0aGUgZnJhbWV3b3JrIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgREkgY29udGFpbmVyIGZvciBlYWNoXG4gKiBMYW1iZGEgaW52b2NhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVnaXN0cmFyID0gbmV3IE1pY3Jvc2VydmljZVJlZ2lzdHJhcigpO1xuICpcbiAqIC8vIFByb2Nlc3MgYSBtaWNyb3NlcnZpY2UgZGVmaW5pdGlvblxuICogcmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKCdwYXltZW50cycsIHtcbiAqICAgdGllczogW1BheW1lbnRzVGllc10sXG4gKiAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyXVxuICogfSk7XG4gKlxuICogLy8gR2V0IGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBMYW1iZGFcbiAqIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lckZhY3Rvcnk6IFB1cmVDb250YWluZXJGYWN0b3J5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBDb250YWluZXJSZWdpc3RyeTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lckZhY3RvcnkgPSBuZXcgUHVyZUNvbnRhaW5lckZhY3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIG1pY3Jvc2VydmljZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgaXRzIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogQ3JlYXRlcyBhIFB1cmVDb250YWluZXIgZnJvbSB0aGUgVGllcyBjbGFzc2VzIGFuZCBwcm9jZXNzZXMgYWxsIExhbWJkYVxuICAgKiBkZWZpbml0aW9ucyB0byBlc3RhYmxpc2ggc2VydmljZSBtYXBwaW5ncy4gQXV0by1zZXRzIHRoZSBzZXJ2aWNlIHByb3BlcnR5XG4gICAqIG9uIGVhY2ggTGFtYmRhIGRlZmluaXRpb24gYW5kIGdlbmVyYXRlcyBMYW1iZGEgSURzLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBNaWNyb3NlcnZpY2UgZGVmaW5pdGlvbiB3aXRoIFRpZXMgYW5kIExhbWJkYXNcbiAgICogQHRocm93cyBFcnJvciBpZiBzZXJ2aWNlIHByb2Nlc3NpbmcgZmFpbHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyYXIucHJvY2Vzc1NlcnZpY2UoJ3BheW1lbnRzJywge1xuICAgKiAgIHRpZXM6IFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSxcbiAgICogICBsYW1iZGFzOiBbXG4gICAqICAgICB7XG4gICAqICAgICAgIGlkOiAnY2hhcmdlJyxcbiAgICogICAgICAgdGllczogW1BheW1lbnRzU2VydmljZV0sXG4gICAqICAgICAgIGhhbmRsZXI6IChkZXBzKSA9PiBhc3luYyAoZXZlbnQpID0+IHsgLi4uIH1cbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHByb2Nlc3NTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IE1pY3Jvc2VydmljZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgLy8gMS4gQnVpbGQgUHVyZUNvbnRhaW5lciBmcm9tIFRpZXMgY2xhc3Nlc1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJGYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihkZWZpbml0aW9uLnRpZXMpO1xuICAgICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlclNlcnZpY2Uoc2VydmljZU5hbWUsIGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIDIuIFByb2Nlc3MgZWFjaCBMYW1iZGEgZGVmaW5pdGlvblxuICAgICAgZm9yIChjb25zdCBsYW1iZGFEZWYgb2YgZGVmaW5pdGlvbi5sYW1iZGFzKSB7XG4gICAgICAgIC8vIEF1dG8tc2V0IHNlcnZpY2UgcmVmZXJlbmNlXG4gICAgICAgIGxhbWJkYURlZi5zZXJ2aWNlID0gc2VydmljZU5hbWU7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgTGFtYmRhIElEIGFuZCBjcmVhdGUgbWFwcGluZ1xuICAgICAgICBjb25zdCBsYW1iZGFJZCA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFJZChzZXJ2aWNlTmFtZSwgbGFtYmRhRGVmKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlckxhbWJkYShsYW1iZGFJZCwgc2VydmljZU5hbWUsIGxhbWJkYURlZik7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFZhbGlkYXRlIGNvbnRhaW5lciAob3B0aW9uYWwgLSBjYW4gYmUgZW5hYmxlZCBmb3IgZGVidWdnaW5nKVxuICAgICAgLy8gdGhpcy52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIGRlZmluaXRpb24pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwcm9jZXNzIG1pY3Jvc2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBESSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBMb29rcyB1cCB0aGUgc2VydmljZSBuYW1lIGZvciB0aGUgTGFtYmRhIElEIGFuZCByZXR1cm5zIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIFB1cmVDb250YWluZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIExhbWJkYSdzIG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIG9yIHNlcnZpY2Ugbm90IGZvdW5kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cmFyLmdldENvbnRhaW5lckZvckxhbWJkYSgncGF5bWVudHMuY2hhcmdlJyk7XG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgTGFtYmRhIElEIGZyb20gc2VydmljZSBuYW1lIGFuZCBMYW1iZGEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogVXNlcyBleHBsaWNpdCBJRCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGV4dHJhY3RzIGZyb20gaGFuZGxlciBmdW5jdGlvbiBuYW1lLlxuICAgKiBUaGUgZmluYWwgSUQgZm9ybWF0IGlzIGFsd2F5cyAne3NlcnZpY2VOYW1lfS57bGFtYmRhSWR9Jy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIEByZXR1cm5zIEZ1bGwgTGFtYmRhIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBleHBsaWNpdCBJRFxuICAgKiBnZW5lcmF0ZUxhbWJkYUlkKCdwYXltZW50cycsIHsgaWQ6ICdjaGFyZ2UnLCAuLi4gfSkgLy8gXHUyMTkyICdwYXltZW50cy5jaGFyZ2UnXG4gICAqXG4gICAqIC8vIFdpdGhvdXQgZXhwbGljaXQgSUQgKGV4dHJhY3RzIGZyb20gaGFuZGxlciBuYW1lKVxuICAgKiBnZW5lcmF0ZUxhbWJkYUlkKCdwYXltZW50cycsIHsgaGFuZGxlcjogZnVuY3Rpb24gcHJvY2Vzc1BheW1lbnQoKSB7Li4ufSB9KSAvLyBcdTIxOTIgJ3BheW1lbnRzLnByb2Nlc3NQYXltZW50J1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlTGFtYmRhSWQoc2VydmljZU5hbWU6IHN0cmluZywgZGVmaW5pdGlvbjogTGFtYmRhRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKGRlZmluaXRpb24uaWQpIHtcbiAgICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0uJHtkZWZpbml0aW9uLmlkfWA7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBmcm9tIGhhbmRsZXIgZnVuY3Rpb24gbmFtZVxuICAgIGNvbnN0IGhhbmRsZXJOYW1lID0gZGVmaW5pdGlvbi5oYW5kbGVyLm5hbWUgfHwgJ2hhbmRsZXInO1xuICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0uJHtoYW5kbGVyTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZFxuICAgKi9cbiAgZ2V0U2VydmljZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgTGFtYmRhIElEcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICovXG4gIGdldExhbWJkYUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZXJ2aWNlIG5hbWUgZm9yIGEgTGFtYmRhIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRFxuICAgKiBAcmV0dXJucyBTZXJ2aWNlIG5hbWUgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0U2VydmljZUZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhU2VydmljZShsYW1iZGFJZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzU2VydmljZShzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBMYW1iZGEgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXNMYW1iZGEobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgTGFtYmRhIGRlZmluaXRpb25zIGZvciBhIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyBmb3IgdGhlIHNlcnZpY2VcbiAgICovXG4gIGdldExhbWJkYXNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFuZCBjb250YWluZXJzLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiByZWluaXRpYWxpemluZyB0aGUgcmVnaXN0cmFyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBMYW1iZGEgZGVmaW5pdGlvbiBieSBJRC5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBFcnJvciBpZiBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmRcbiAgICovXG4gIGdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQ6IHN0cmluZyk6IExhbWJkYURlZmluaXRpb24ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBjb250YWluZXIgcmVnaXN0cnkuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgQ29udGFpbmVyUmVnaXN0cnkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICpcbiAgICogQHJldHVybnMgQ29udGFpbmVyUmVnaXN0cnkgaW5zdGFuY2VcbiAgICovXG4gIGdldFJlZ2lzdHJ5KCk6IENvbnRhaW5lclJlZ2lzdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGNvbnRhaW5lciBoYXMgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIChwcml2YXRlIGhlbHBlcikuXG4gICAqXG4gICAqIFRoaXMgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ1dCBjYW4gYmUgZW5hYmxlZCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQ29udGFpbmVyIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTWljcm9zZXJ2aWNlIGRlZmluaXRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sIGRlZmluaXRpb246IE1pY3Jvc2VydmljZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICAvLyBFeHRyYWN0IGFsbCBzZXJ2aWNlIGRlcGVuZGVuY2llcyBmcm9tIExhbWJkYSBkZWZpbml0aW9uc1xuICAgIGNvbnN0IHJlcXVpcmVkU2VydmljZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgbGFtYmRhRGVmIG9mIGRlZmluaXRpb24ubGFtYmRhcykge1xuICAgICAgZm9yIChjb25zdCB0aWVDbGFzcyBvZiBsYW1iZGFEZWYudGllcykge1xuICAgICAgICByZXF1aXJlZFNlcnZpY2VzLmFkZCh0aWVDbGFzcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGFsbCByZXF1aXJlZCBzZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZFxuICAgIHRoaXMuY29udGFpbmVyRmFjdG9yeS52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIEFycmF5LmZyb20ocmVxdWlyZWRTZXJ2aWNlcykpO1xuICB9XG59XG4iLCAiaW1wb3J0XCJyZWZsZWN0LW1ldGFkYXRhXCI7ZXhwb3J0e0xhenlTZXJ2aWNlSWRlbnRpZmllcn1mcm9tXCJAaW52ZXJzaWZ5anMvY29tbW9uXCI7ZXhwb3J0e0NvbnRhaW5lcixDb250YWluZXJNb2R1bGV9ZnJvbVwiQGludmVyc2lmeWpzL2NvbnRhaW5lclwiO2V4cG9ydHtiaW5kaW5nU2NvcGVWYWx1ZXMsYmluZGluZ1R5cGVWYWx1ZXMsZGVjb3JhdGUsaW5qZWN0LGluamVjdEZyb21CYXNlLGluamVjdEZyb21IaWVyYXJjaHksaW5qZWN0YWJsZSxtdWx0aUluamVjdCxuYW1lZCxvcHRpb25hbCxwb3N0Q29uc3RydWN0LHByZURlc3Ryb3ksdGFnZ2VkLHVubWFuYWdlZH1mcm9tXCJAaW52ZXJzaWZ5anMvY29yZVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcbmltcG9ydCB7IFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgeyBESUNvbnRhaW5lckVycm9yLCBNaXNzaW5nU2VydmljZUVycm9yIH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvZGkvZGktZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgTGFtYmRhRGVmaW5pdGlvbiB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuXG4vKipcbiAqIFJlZ2lzdHJ5IGZvciBtYW5hZ2luZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlcyBhbmQgTGFtYmRhLXRvLXNlcnZpY2UgbWFwcGluZ3MuXG4gKlxuICogUHJvdmlkZXMgYSBjZW50cmFsaXplZCByZWdpc3RyeSBmb3Igc3RvcmluZyBhbmQgcmV0cmlldmluZyBESSBjb250YWluZXJzXG4gKiBmb3IgbWljcm9zZXJ2aWNlcywgYWxvbmcgd2l0aCBtYXBwaW5ncyBiZXR3ZWVuIExhbWJkYSBmdW5jdGlvbnMgYW5kIHRoZWlyXG4gKiBwYXJlbnQgc2VydmljZXMuIFRoaXMgZW5hYmxlcyBjbGVhbiBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGFuZCBtYWtlcyB0aGVcbiAqIE1pY3Jvc2VydmljZVJlZ2lzdHJhciBtb3JlIGZvY3VzZWQgb24gcHJvY2Vzc2luZyBsb2dpYy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgQ29udGFpbmVyUmVnaXN0cnkoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCBpdHMgY29udGFpbmVyXG4gKiByZWdpc3RyeS5yZWdpc3RlclNlcnZpY2UoJ3BheW1lbnRzJywgcGF5bWVudHNDb250YWluZXIpO1xuICpcbiAqIC8vIE1hcCBMYW1iZGEgdG8gc2VydmljZVxuICogcmVnaXN0cnkucmVnaXN0ZXJMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScsICdwYXltZW50cycpO1xuICpcbiAqIC8vIFJldHJpZXZlIGNvbnRhaW5lciBmb3IgTGFtYmRhXG4gKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzLmNoYXJnZScpO1xuICogYGBgXG4gKi9cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb250YWluZXJSZWdpc3RyeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyczogTWFwPHN0cmluZywgUHVyZUNvbnRhaW5lcjxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYW1iZGFUb1NlcnZpY2U6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhRGVmaW5pdGlvbnM6IE1hcDxzdHJpbmcsIExhbWJkYURlZmluaXRpb24+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCBpdHMgREkgY29udGFpbmVyLlxuICAgKlxuICAgKiBTdG9yZXMgdGhlIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIG5hbWUuXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBzZXJ2aWNlIG5hbWUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZCB0byBwcmV2ZW50XG4gICAqIGFjY2lkZW50YWwgb3ZlcndyaXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgc2VydmljZVxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgc2VydmljZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwYXltZW50c0NvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oKTtcbiAgICogcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKCdwYXltZW50cycsIHBheW1lbnRzQ29udGFpbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlclNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZywgY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250YWluZXJzLmhhcyhzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBESUNvbnRhaW5lckVycm9yKFxuICAgICAgICBzZXJ2aWNlTmFtZSxcbiAgICAgICAgYFNlcnZpY2UgJyR7c2VydmljZU5hbWV9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuIFVzZSBhIGRpZmZlcmVudCBzZXJ2aWNlIG5hbWUgb3IgY2xlYXIgdGhlIHJlZ2lzdHJ5IGZpcnN0LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY29udGFpbmVycy5zZXQoc2VydmljZU5hbWUsIGNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBMYW1iZGEgZnVuY3Rpb24gd2l0aCBpdHMgcGFyZW50IHNlcnZpY2UgYW5kIGRlZmluaXRpb24uXG4gICAqXG4gICAqIENyZWF0ZXMgYSBtYXBwaW5nIGJldHdlZW4gdGhlIExhbWJkYSBJRCBhbmQgaXRzIHBhcmVudCBzZXJ2aWNlIG5hbWUsXG4gICAqIGFuZCBzdG9yZXMgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciBydW50aW1lIGxvb2t1cC5cbiAgICogVGhpcyBlbmFibGVzIGxvb2tpbmcgdXAgdGhlIGNvcnJlY3QgREkgY29udGFpbmVyIGZvciBMYW1iZGEgaW52b2NhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uIHdpdGggaGFuZGxlciBhbmQgZGVwZW5kZW5jaWVzXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBMYW1iZGEgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgTWlzc2luZ1NlcnZpY2VFcnJvciBpZiBwYXJlbnQgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnLCAncGF5bWVudHMnLCBjaGFyZ2VEZWZpbml0aW9uKTtcbiAgICogcmVnaXN0cnkucmVnaXN0ZXJMYW1iZGEoJ3BheW1lbnRzLnJlZnVuZCcsICdwYXltZW50cycsIHJlZnVuZERlZmluaXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcsIHNlcnZpY2VOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IExhbWJkYURlZmluaXRpb24pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBwYXJlbnQgc2VydmljZSBleGlzdHNcbiAgICBpZiAoIXRoaXMuY29udGFpbmVycy5oYXMoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ1NlcnZpY2VFcnJvcihzZXJ2aWNlTmFtZSwgJ3NlcnZpY2UgY29udGFpbmVycycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIExhbWJkYSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgaWYgKHRoaXMubGFtYmRhVG9TZXJ2aWNlLmhhcyhsYW1iZGFJZCkpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nU2VydmljZSA9IHRoaXMubGFtYmRhVG9TZXJ2aWNlLmdldChsYW1iZGFJZCk7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGBMYW1iZGEgJyR7bGFtYmRhSWR9JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gc2VydmljZSAnJHtleGlzdGluZ1NlcnZpY2V9Jy4gVXNlIGEgZGlmZmVyZW50IExhbWJkYSBJRC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5zZXQobGFtYmRhSWQsIHNlcnZpY2VOYW1lKTtcbiAgICB0aGlzLmxhbWJkYURlZmluaXRpb25zLnNldChsYW1iZGFJZCwgZGVmaW5pdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBESSBjb250YWluZXIgZm9yIGEgc2VydmljZSBieSBuYW1lLlxuICAgKlxuICAgKiBSZXRyaWV2ZXMgdGhlIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIG1pY3Jvc2VydmljZVxuICAgKiBAcmV0dXJucyBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJ5LmdldENvbnRhaW5lcigncGF5bWVudHMnKTtcbiAgICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29udGFpbmVyKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVycy5nZXQoc2VydmljZU5hbWUpO1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ1NlcnZpY2VFcnJvcihzZXJ2aWNlTmFtZSwgJ3NlcnZpY2UgY29udGFpbmVycycpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogTG9va3MgdXAgdGhlIHBhcmVudCBzZXJ2aWNlIGZvciB0aGUgTGFtYmRhIElEIGFuZCByZXR1cm5zIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIFB1cmVDb250YWluZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIExhbWJkYSdzIG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIG9yIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zdCBwYXltZW50c1NlcnZpY2UgPSBjb250YWluZXIucnVuKCdQYXltZW50c1NlcnZpY2UnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgY29uc3Qgc2VydmljZU5hbWUgPSB0aGlzLmdldExhbWJkYVNlcnZpY2UobGFtYmRhSWQpO1xuICAgIHJldHVybiB0aGlzLmdldENvbnRhaW5lcihzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwYXJlbnQgc2VydmljZSBuYW1lIGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogTG9va3MgdXAgdGhlIHNlcnZpY2UgbmFtZSB0aGF0IG93bnMgdGhlIGdpdmVuIExhbWJkYSBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKVxuICAgKiBAcmV0dXJucyBOYW1lIG9mIHRoZSBwYXJlbnQgbWljcm9zZXJ2aWNlXG4gICAqIEB0aHJvd3MgTWlzc2luZ1NlcnZpY2VFcnJvciBpZiBMYW1iZGEgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXJ2aWNlTmFtZSA9IHJlZ2lzdHJ5LmdldExhbWJkYVNlcnZpY2UoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zb2xlLmxvZyhzZXJ2aWNlTmFtZSk7IC8vICdwYXltZW50cydcbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFTZXJ2aWNlKGxhbWJkYUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5sYW1iZGFUb1NlcnZpY2UuZ2V0KGxhbWJkYUlkKTtcbiAgICBpZiAoIXNlcnZpY2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgTWlzc2luZ1NlcnZpY2VFcnJvcihsYW1iZGFJZCwgJ2xhbWJkYS10by1zZXJ2aWNlIG1hcHBpbmcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcnZpY2VOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgTGFtYmRhIGRlZmluaXRpb24gZm9yIGEgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHN0b3JlZCBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIExhbWJkYSBJRC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgKGUuZy4sICdwYXltZW50cy5jaGFyZ2UnKVxuICAgKiBAcmV0dXJucyBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZGVmaW5pdGlvbiA9IHJlZ2lzdHJ5LmdldExhbWJkYURlZmluaXRpb24oJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zb2xlLmxvZyhkZWZpbml0aW9uLnRpZXMpOyAvLyBbUGF5bWVudHNTZXJ2aWNlLCBCaWxsaW5nU2VydmljZV1cbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFEZWZpbml0aW9uKGxhbWJkYUlkOiBzdHJpbmcpOiBMYW1iZGFEZWZpbml0aW9uIHtcbiAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5sYW1iZGFEZWZpbml0aW9ucy5nZXQobGFtYmRhSWQpO1xuICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3IobGFtYmRhSWQsICdsYW1iZGEgZGVmaW5pdGlvbnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpZiAocmVnaXN0cnkuaGFzU2VydmljZSgncGF5bWVudHMnKSkge1xuICAgKiAgIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJ5LmdldENvbnRhaW5lcigncGF5bWVudHMnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGhhc1NlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcnMuaGFzKHNlcnZpY2VOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIExhbWJkYSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIExhbWJkYSBpcyByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKHJlZ2lzdHJ5Lmhhc0xhbWJkYSgncGF5bWVudHMuY2hhcmdlJykpIHtcbiAgICogICBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaGFzTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYW1iZGFUb1NlcnZpY2UuaGFzKGxhbWJkYUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgc2VydmljZSBuYW1lcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc2VydmljZSBuYW1lcyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2VydmljZXMgPSByZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKTtcbiAgICogY29uc29sZS5sb2coc2VydmljZXMpOyAvLyBbJ3BheW1lbnRzJywgJ3VzZXJzJywgJ25vdGlmaWNhdGlvbnMnXVxuICAgKiBgYGBcbiAgICovXG4gIGdldFNlcnZpY2VOYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5jb250YWluZXJzLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIExhbWJkYSBJRHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIExhbWJkYSBJRHMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxhbWJkYXMgPSByZWdpc3RyeS5nZXRMYW1iZGFJZHMoKTtcbiAgICogY29uc29sZS5sb2cobGFtYmRhcyk7IC8vIFsncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzLnJlZnVuZCcsICd1c2Vycy5jcmVhdGUnXVxuICAgKiBgYGBcbiAgICovXG4gIGdldExhbWJkYUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5sYW1iZGFUb1NlcnZpY2Uua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIExhbWJkYSBJRHMgZm9yIGEgc3BlY2lmaWMgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBMYW1iZGEgSURzIGJlbG9uZ2luZyB0byB0aGUgc2VydmljZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBheW1lbnRMYW1iZGFzID0gcmVnaXN0cnkuZ2V0TGFtYmRhc0ZvclNlcnZpY2UoJ3BheW1lbnRzJyk7XG4gICAqIGNvbnNvbGUubG9nKHBheW1lbnRMYW1iZGFzKTsgLy8gWydwYXltZW50cy5jaGFyZ2UnLCAncGF5bWVudHMucmVmdW5kJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFzRm9yU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGxhbWJkYXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtsYW1iZGFJZCwgc2VydmljZV0gb2YgdGhpcy5sYW1iZGFUb1NlcnZpY2UuZW50cmllcygpKSB7XG4gICAgICBpZiAoc2VydmljZSA9PT0gc2VydmljZU5hbWUpIHtcbiAgICAgICAgbGFtYmRhcy5wdXNoKGxhbWJkYUlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFtYmRhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzZXJ2aWNlIGFuZCBhbGwgaXRzIExhbWJkYSBtYXBwaW5ncy5cbiAgICpcbiAgICogUmVtb3ZlcyB0aGUgc2VydmljZSBjb250YWluZXIgYW5kIGFsbCBMYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nc1xuICAgKiBmb3IgTGFtYmRhcyBiZWxvbmdpbmcgdG8gdGhpcyBzZXJ2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHNlcnZpY2Ugd2FzIHJlbW92ZWQsIGZhbHNlIGlmIGl0IGRpZG4ndCBleGlzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlbW92ZWQgPSByZWdpc3RyeS5yZW1vdmVTZXJ2aWNlKCdwYXltZW50cycpO1xuICAgKiBjb25zb2xlLmxvZyhyZW1vdmVkKTsgLy8gdHJ1ZSBpZiAncGF5bWVudHMnIHdhcyByZWdpc3RlcmVkXG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXhpc3RlZCA9IHRoaXMuY29udGFpbmVycy5kZWxldGUoc2VydmljZU5hbWUpO1xuXG4gICAgaWYgKGV4aXN0ZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBhbGwgTGFtYmRhIG1hcHBpbmdzIGZvciB0aGlzIHNlcnZpY2VcbiAgICAgIGNvbnN0IGxhbWJkYXNUb1JlbW92ZTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgW2xhbWJkYUlkLCBzZXJ2aWNlXSBvZiB0aGlzLmxhbWJkYVRvU2VydmljZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKHNlcnZpY2UgPT09IHNlcnZpY2VOYW1lKSB7XG4gICAgICAgICAgbGFtYmRhc1RvUmVtb3ZlLnB1c2gobGFtYmRhSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgbGFtYmRhSWQgb2YgbGFtYmRhc1RvUmVtb3ZlKSB7XG4gICAgICAgIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmRlbGV0ZShsYW1iZGFJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgTGFtYmRhIG1hcHBpbmcuXG4gICAqXG4gICAqIFJlbW92ZXMgdGhlIExhbWJkYS10by1zZXJ2aWNlIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqIERvZXMgbm90IGFmZmVjdCB0aGUgcGFyZW50IHNlcnZpY2UgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCB0byByZW1vdmVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIGl0IGRpZG4ndCBleGlzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlbW92ZWQgPSByZWdpc3RyeS5yZW1vdmVMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICAgKiBjb25zb2xlLmxvZyhyZW1vdmVkKTsgLy8gdHJ1ZSBpZiAncGF5bWVudHMuY2hhcmdlJyB3YXMgcmVnaXN0ZXJlZFxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZUxhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmRlbGV0ZShsYW1iZGFJZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIHJlZ2lzdGVyZWQgc2VydmljZXMgYW5kIExhbWJkYSBtYXBwaW5ncy5cbiAgICpcbiAgICogUmVtb3ZlcyBhbGwgY29udGFpbmVycywgbWFwcGluZ3MsIGFuZCBkZWZpbml0aW9ucyBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcmVpbml0aWFsaXppbmcgdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHJlZ2lzdHJ5LmNsZWFyKCk7XG4gICAqIGNvbnNvbGUubG9nKHJlZ2lzdHJ5LmdldFNlcnZpY2VOYW1lcygpKTsgLy8gW11cbiAgICogY29uc29sZS5sb2cocmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCkpOyAvLyBbXVxuICAgKiBgYGBcbiAgICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVycy5jbGVhcigpO1xuICAgIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmNsZWFyKCk7XG4gICAgdGhpcy5sYW1iZGFEZWZpbml0aW9ucy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWdpc3RyeSBzdGF0aXN0aWNzLlxuICAgKlxuICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggc2VydmljZSBhbmQgTGFtYmRhIGNvdW50c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRzID0gcmVnaXN0cnkuZ2V0U3RhdHMoKTtcbiAgICogY29uc29sZS5sb2coc3RhdHMpOyAvLyB7IHNlcnZpY2VzOiAzLCBsYW1iZGFzOiA4IH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRTdGF0cygpOiB7IHNlcnZpY2VzOiBudW1iZXI7IGxhbWJkYXM6IG51bWJlciB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmljZXM6IHRoaXMuY29udGFpbmVycy5zaXplLFxuICAgICAgbGFtYmRhczogdGhpcy5sYW1iZGFUb1NlcnZpY2Uuc2l6ZSxcbiAgICB9O1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYW1iZGFNZXRhZGF0YSwgUnVudGltZVdlYkNvbmZpZyB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL21pY3Jvc2VydmljZS1yZWdpc3RyYXInO1xuaW1wb3J0IHsgTGFtYmRhSGFuZGxlckZhY3RvcnkgfSBmcm9tICdAY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIExhbWJkYSBleGVjdXRpb24gcGlwZWxpbmUgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogSGFuZGxlcyBMYW1iZGEgZnVuY3Rpb24gZXhlY3V0aW9uIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBSZXNvbHZlcyB0aGUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLCBnZXRzIHRoZSBhcHByb3ByaWF0ZVxuICogREkgY29udGFpbmVyLCBjcmVhdGVzIHRoZSBoYW5kbGVyIHdpdGggaW5qZWN0ZWQgZGVwZW5kZW5jaWVzLCBhbmQgZXhlY3V0ZXNcbiAqIHRoZSBidXNpbmVzcyBsb2dpYy5cbiAqXG4gKiAqKkV4ZWN1dGlvbiBGbG93Kio6XG4gKiAxLiBSZXNvbHZlIExhbWJkYSBJRCBmcm9tIExBTUJEQV9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogMi4gVXNlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byBnZXQgY29udGFpbmVyIGZvciBMYW1iZGFcbiAqIDMuIFVzZSBMYW1iZGFIYW5kbGVyRmFjdG9yeSB0byBjcmVhdGUgaGFuZGxlciB3aXRoIERJXG4gKiA0LiBFeGVjdXRlIGhhbmRsZXIgYW5kIHJldHVybiByZXN1bHRcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0wOFxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhUGlwZWxpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGxvZ2dlcih7XG4gICAgc2VydmljZU5hbWU6ICdAY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lJyxcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWdpc3RyYXI/OiBNaWNyb3NlcnZpY2VSZWdpc3RyYXI7XG4gIHByaXZhdGUgaGFuZGxlckZhY3Rvcnk/OiBMYW1iZGFIYW5kbGVyRmFjdG9yeTtcblxuICAvKipcbiAgICogRXhlY3V0ZSBMYW1iZGEgcGlwZWxpbmUgZm9yIHNlcnZlci1zaWRlIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogUHJvY2Vzc2VzIHRoZSBtaWNyb3NlcnZpY2UgcmVnaXN0cnksIHJlc29sdmVzIHRoZSBMYW1iZGEgSUQgZnJvbSBlbnZpcm9ubWVudFxuICAgKiB2YXJpYWJsZXMsIGdldHMgdGhlIGFwcHJvcHJpYXRlIERJIGNvbnRhaW5lciwgY3JlYXRlcyB0aGUgaGFuZGxlciB3aXRoXG4gICAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBhbmQgZXhlY3V0ZXMgdGhlIGJ1c2luZXNzIGxvZ2ljLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gUHVyZW5vdyBjb25maWd1cmF0aW9uIHdpdGggbWljcm9zZXJ2aWNlIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSBjb250ZXh0IC0gTGFtYmRhIGVudmlyb25tZW50IGNvbnRleHQgd2l0aCBtZXRhZGF0YVxuICAgKiBAcmV0dXJucyBSZXN1bHQgZnJvbSBMYW1iZGEgaGFuZGxlciBleGVjdXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwaXBlbGluZSA9IG5ldyBMYW1iZGFQaXBlbGluZSgpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwaXBlbGluZS5leGVjdXRlKGNvbmZpZywge1xuICAgKiAgIHR5cGU6ICdsYW1iZGEnLFxuICAgKiAgIG1ldGFkYXRhOiB7XG4gICAqICAgICBmdW5jdGlvbk5hbWU6ICdteS1hcHAtcGF5bWVudHMtY2hhcmdlLWRldicsXG4gICAqICAgICB2ZXJzaW9uOiAnJExBVEVTVCcsXG4gICAqICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgKiAgICAgbWVtb3J5TGltaXQ6IDEwMjQsXG4gICAqICAgICByZXF1ZXN0SWQ6ICdhYmMtMTIzJ1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShjb25maWc6IFJ1bnRpbWVXZWJDb25maWcsIGNvbnRleHQ6IHsgdHlwZTogJ2xhbWJkYSc7IG1ldGFkYXRhOiBMYW1iZGFNZXRhZGF0YSB9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIExhbWJkYSBwaXBlbGluZSBleGVjdXRpb24nLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dC5tZXRhZGF0YS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIHZlcnNpb246IGNvbnRleHQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgcmVnaW9uOiBjb250ZXh0Lm1ldGFkYXRhLnJlZ2lvbixcbiAgICAgICAgbWVtb3J5TGltaXQ6IGNvbnRleHQubWV0YWRhdGEubWVtb3J5TGltaXQsXG4gICAgICAgIHJlcXVlc3RJZDogY29udGV4dC5tZXRhZGF0YS5yZXF1ZXN0SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gMS4gSW5pdGlhbGl6ZSByZWdpc3RyYXIgYW5kIHByb2Nlc3MgbWljcm9zZXJ2aWNlc1xuICAgICAgdGhpcy5pbml0aWFsaXplUmVnaXN0cmFyKGNvbmZpZyk7XG5cbiAgICAgIC8vIDIuIFJlc29sdmUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnRcbiAgICAgIGNvbnN0IGxhbWJkYUlkID0gdGhpcy5yZXNvbHZlTGFtYmRhSWQoKTtcblxuICAgICAgLy8gMy4gR2V0IERJIGNvbnRhaW5lciBmb3IgdGhpcyBMYW1iZGFcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcblxuICAgICAgLy8gNC4gQ3JlYXRlIGhhbmRsZXIgd2l0aCBESVxuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuY3JlYXRlSGFuZGxlcldpdGhESShsYW1iZGFJZCwgY29udGFpbmVyKTtcblxuICAgICAgLy8gNS4gRXhlY3V0ZSBoYW5kbGVyICh0aGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEFXUyBMYW1iZGEgcnVudGltZSlcbiAgICAgIC8vIE5vdGU6IEluIGFjdHVhbCBMYW1iZGEgZXhlY3V0aW9uLCB0aGlzIG1ldGhvZCBzZXRzIHVwIHRoZSBoYW5kbGVyXG4gICAgICAvLyBUaGUgQVdTIExhbWJkYSBydW50aW1lIHdpbGwgY2FsbCBoYW5kbGVyLmhhbmRsZXIoZXZlbnQsIGNvbnRleHQpXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdMYW1iZGEgcGlwZWxpbmUgc2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBoYW5kbGVyIGZvciBBV1MgTGFtYmRhIHJ1bnRpbWUgdG8gaW52b2tlXG4gICAgICByZXR1cm4gaGFuZGxlcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignTGFtYmRhIHBpcGVsaW5lIGV4ZWN1dGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dC5tZXRhZGF0YS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBtaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGFuZCBwcm9jZXNzIGFsbCBzZXJ2aWNlcy5cbiAgICpcbiAgICogQ3JlYXRlcyBhIG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgYW5kIHByb2Nlc3NlcyBhbGwgbWljcm9zZXJ2aWNlXG4gICAqIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdG8gYnVpbGQgREkgY29udGFpbmVycy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVnaXN0cmFyKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdJbml0aWFsaXppbmcgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnaXN0cmFyID0gbmV3IE1pY3Jvc2VydmljZVJlZ2lzdHJhcigpO1xuXG4gICAgICAvLyBQcm9jZXNzIGFsbCBtaWNyb3NlcnZpY2VzIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLnJlZ2lzdGVyKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUHJvY2Vzc2luZyBtaWNyb3NlcnZpY2UnLCB7XG4gICAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgICAgdGllc0NvdW50OiBkZWZpbml0aW9uLnRpZXMubGVuZ3RoLFxuICAgICAgICAgIGxhbWJkYXNDb3VudDogZGVmaW5pdGlvbi5sYW1iZGFzLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RyYXIucHJvY2Vzc1NlcnZpY2Uoc2VydmljZU5hbWUsIGRlZmluaXRpb24pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgc2VydmljZUNvdW50OiBPYmplY3Qua2V5cyhjb25maWcucmVnaXN0ZXIpLmxlbmd0aCxcbiAgICAgICAgdG90YWxMYW1iZGFzOiB0aGlzLnJlZ2lzdHJhci5nZXRMYW1iZGFJZHMoKS5sZW5ndGgsXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtaWNyb3NlcnZpY2UgcmVnaXN0cmFyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBMYW1iZGEgSUQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEdldHMgdGhlIExhbWJkYSBJRCBmcm9tIHRoZSBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdFxuICAgKiBpcyBzZXQgYnkgdGhlIENESyBzdGFjayBkdXJpbmcgZGVwbG95bWVudC5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHRocm93cyBFcnJvciBpZiBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTGFtYmRhSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYW1iZGFJZCA9IHByb2Nlc3MuZW52LkxBTUJEQV9JRDtcblxuICAgIGlmICghbGFtYmRhSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0xBTUJEQV9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3QgZm91bmQuICcgK1xuICAgICAgICAnVGhpcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBDREsgc3RhY2sgZHVyaW5nIGRlcGxveW1lbnQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xhbWJkYSBJRCByZXNvbHZlZCBmcm9tIGVudmlyb25tZW50JywgeyBsYW1iZGFJZCB9KTtcbiAgICByZXR1cm4gbGFtYmRhSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IERJIGNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBMYW1iZGEuXG4gICAqXG4gICAqIFVzZXMgdGhlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byBsb29rIHVwIHRoZSBhcHByb3ByaWF0ZSBESSBjb250YWluZXJcbiAgICogZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24gYmFzZWQgb24gaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBFcnJvciBpZiBjb250YWluZXIgbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lzdHJhcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnREkgY29udGFpbmVyIHJldHJpZXZlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZTogdGhpcy5yZWdpc3RyYXIuZ2V0U2VydmljZUZvckxhbWJkYShsYW1iZGFJZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBESSBjb250YWluZXIgZm9yIExhbWJkYScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBESSBjb250YWluZXIgZm9yIExhbWJkYSAnJHtsYW1iZGFJZH0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIExhbWJkYSBoYW5kbGVyIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqXG4gICAqIFVzZXMgdGhlIExhbWJkYUhhbmRsZXJGYWN0b3J5IHRvIGNyZWF0ZSBhIGhhbmRsZXIgaW5zdGFuY2Ugd2l0aFxuICAgKiBhdXRvbWF0aWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJvbSB0aGUgREkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRFxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHJldHVybnMgTGFtYmRhIGhhbmRsZXIgaW5zdGFuY2UgcmVhZHkgZm9yIGV4ZWN1dGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVIYW5kbGVyV2l0aERJKGxhbWJkYUlkOiBzdHJpbmcsIGNvbnRhaW5lcjogYW55KSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIExhbWJkYSBoYW5kbGVyIHdpdGggREknLCB7IGxhbWJkYUlkIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBmYWN0b3J5IGlmIG5vdCBhbHJlYWR5IGRvbmVcbiAgICAgIGlmICghdGhpcy5oYW5kbGVyRmFjdG9yeSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gbmV3IExhbWJkYUhhbmRsZXJGYWN0b3J5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciB0aGlzIElEXG4gICAgICBjb25zdCBsYW1iZGFEZWZpbml0aW9uID0gdGhpcy5maW5kTGFtYmRhRGVmaW5pdGlvbihsYW1iZGFJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBoYW5kbGVyIHdpdGggRElcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJGYWN0b3J5LmNyZWF0ZShsYW1iZGFEZWZpbml0aW9uLCBjb250YWluZXIpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdMYW1iZGEgaGFuZGxlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGRlcGVuZGVuY3lDb3VudDogbGFtYmRhRGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBMYW1iZGEgaGFuZGxlcicsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBMYW1iZGEgaGFuZGxlciBmb3IgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgTGFtYmRhIGRlZmluaXRpb24gYnkgSUQgZnJvbSB0aGUgcHJvY2Vzc2VkIG1pY3Jvc2VydmljZXMuXG4gICAqXG4gICAqIFVzZXMgdGhlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byByZXRyaWV2ZSB0aGUgTGFtYmRhIGRlZmluaXRpb25cbiAgICogdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIHRvIGZpbmRcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZmluZExhbWJkYURlZmluaXRpb24obGFtYmRhSWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5yZWdpc3RyYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cmFyLmdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExhbWJkYSBkZWZpbml0aW9uIG5vdCBmb3VuZCBmb3IgSUQgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBSZS1leHBvcnQgYmFzZSBzZXJ2aWNlcyBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgc2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS1leHRlbnNpb25zJzsiLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgQmVmb3JlSW5zdGFuY2UsXG4gIGNhdGNoSW5qZWN0b3IsXG4gIGluamVjdEJlZm9yZSxcbiAgbG9nZ2VySW5qZWN0b3IsXG4gIExvZ2dlckxldmVsLFxuICBNYXliZSxcbiAgcHVyYWJsZSxcbn0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVDb25maWcsIFJ1bnRpbWVTdGFja0NvbmZpZyB9IGZyb20gJy4vcnVudGltZS1leHRlbnNpb25zLnR5cGVzJztcblxuLyoqXG4gKiBSdW50aW1lRXh0ZW5zaW9ucyBzZXJ2aWNlIHByb3ZpZGVzIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0aGF0IGV4dGVuZHNcbiAqIHB1cmVub3cncyBiYXNlIGNhcGFiaWxpdGllcy4gVGhpcyBzZXJ2aWNlIGZvbGxvd3MgcHVyZW5vdydzIGFyY2hpdGVjdHVyYWwgcGF0dGVybnNcbiAqIGZvciBBV1MgaW50ZWdyYXRpb25zIGFuZCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBLZXkgcmVzcG9uc2liaWxpdGllczpcbiAqIC0gRW5oYW5jZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lLXNwZWNpZmljIGZlYXR1cmVzXG4gKiAtIFByb3ZpZGUgcnVudGltZS1zcGVjaWZpYyBidWlsZCBvcHRpbWl6YXRpb25zXG4gKiAtIENvbmZpZ3VyZSBSdW50aW1lIENvcmUgc3RhY2sgZGVwbG95bWVudFxuICogLSBFeHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgcmVwbGFjaW5nIGl0XG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBSdW50aW1lRXh0ZW5zaW9ucyAvKmltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlICove1xuICAvLyAvKipcbiAgLy8gICogTG9nZ2VyIGluc3RhbmNlIGZvciBSdW50aW1lRXh0ZW5zaW9ucyBzZXJ2aWNlLlxuICAvLyAgKiBVc2VzIHB1cmVub3cncyBsb2dnaW5nIHBhdHRlcm5zIHdpdGggQVdTIHByb3ZpZGVyLlxuICAvLyAgKi9cbiAgLy8gbG9nZ2VySW5zdGFuY2UgPSBsb2dnZXIoe1xuICAvLyAgIHNlcnZpY2VOYW1lOiAnUnVudGltZSB8IEV4dGVuc2lvbnMgU2VydmljZScsXG4gIC8vICAgbG9nRm9ybWF0dGVyOiBuZXcgUHVyZW5vd0xvZ2dlckZvcm1hdHRlcih7XG4gIC8vICAgICBsb2dzUHJvdmlkZXI6IFB1cmVub3dMb2dGb3JtYXR0ZXJQcm92aWRlci5Bd3MsXG4gIC8vICAgfSkgYXMgYW55LFxuICAvLyB9KTtcblxuICAvKipcbiAgICogUnVudGltZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdCB2YWx1ZXMuXG4gICAqIEV4dGVuZHMgcHVyZW5vdyBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHJlcGxhY2luZyBpdC5cbiAgICovXG4gIHByaXZhdGUgcnVudGltZUNvbmZpZzogUnVudGltZUNvbmZpZyA9IHtcbiAgICBlbmFibGVSdW50aW1lQ29yZVN0YWNrOiBmYWxzZSwgLy8gQG5vdGU6IGNyaXRpY2FsIE5PVCBFWFBFQ1RFRCB2YWx1ZSwgY2FuIGJlIHJlbW92ZWQgdG8gY2xlYW4gdXAgcmVwb1xuICAgIHJ1bnRpbWVXZWJNb2RlOiAnZGV2ZWxvcG1lbnQnLFxuICAgIGFkZGl0aW9uYWxGZWF0dXJlczogW10sXG4gICAgZGV2U2VydmVyRW5oYW5jZW1lbnRzOiB7XG4gICAgICBob3RSZWxvYWQ6IHRydWUsXG4gICAgICBkZWJ1Z01vZGU6IGZhbHNlLFxuICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nOiBmYWxzZSxcbiAgICB9LFxuICAgIGJ1aWxkT3B0aW1pemF0aW9uczoge1xuICAgICAgYnVuZGxlQW5hbHlzaXM6IGZhbHNlLFxuICAgICAgdHJlZXNoYWtpbmc6IHRydWUsXG4gICAgICBjb2RlTWluaWZpY2F0aW9uOiB0cnVlLFxuICAgIH0sXG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBSdW50aW1lRXh0ZW5zaW9ucyBzZXJ2aWNlLlxuICAgKiBVc2VzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHBhdHRlcm4gY29uc2lzdGVudCB3aXRoIHB1cmVub3cgc2VydmljZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBJbml0aWFsaXplIHJ1bnRpbWUgZXh0ZW5zaW9uc1xuICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bnRpbWVFeHRlbnNpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBydW50aW1lIGV4dGVuc2lvbnMgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFNldHMgdXAgcnVudGltZS1zcGVjaWZpYyBmZWF0dXJlcyB0aGF0IGV4dGVuZCBwdXJlbm93IGZ1bmN0aW9uYWxpdHkuXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEluaXRpYWxpemUnKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEluaXRpYWxpemUgfCBFeGNlcHRpb24gKGVycm9yKScpLFxuICApXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVJ1bnRpbWVFeHRlbnNpb25zKGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh0aGlzLnJ1bnRpbWVDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdJbml0aWFsaXppbmcgcnVudGltZSBleHRlbnNpb25zJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgIH0pO1xuXG4gICAgLy8gUnVudGltZSBleHRlbnNpb25zIGFyZSBub3cgcmVhZHlcbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhudWxsLCB7XG4gICAgICBtZXNzYWdlOiAnUnVudGltZSBleHRlbnNpb25zIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlIGRldmVsb3BtZW50IHNlcnZlciB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMuXG4gICAqIEV4dGVuZHMgcHVyZW5vdydzIGRldmVsb3BtZW50IHNlcnZlciB3aXRob3V0IHJlcGxhY2luZyBpdC5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZlckNvbmZpZyAtIEJhc2Ugc2VydmVyIGNvbmZpZ3VyYXRpb24gZnJvbSBwdXJlbm93XG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICogQHJldHVybnMgUnVudGltZSBDb3JlIHNlcnZlciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IEVuaGFuY2UgRGV2IFNlcnZlcicpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRW5oYW5jZSBEZXYgU2VydmVyIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgZW5oYW5jZURldlNlcnZlcihcbiAgICBzZXJ2ZXJDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgZW5oYW5jZW1lbnRzID0gdGhpcy5ydW50aW1lQ29uZmlnLmRldlNlcnZlckVuaGFuY2VtZW50cztcblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgc2VydmVyQ29uZmlnLCBlbmhhbmNlbWVudHMgfSwge1xuICAgICAgbWVzc2FnZTogJ0VuaGFuY2luZyBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lIGZlYXR1cmVzJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5EZWJ1ZyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJ1bnRpbWVDb3JlQ29uZmlnID0ge1xuICAgICAgLi4uc2VydmVyQ29uZmlnLFxuICAgICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzXG4gICAgICBydW50aW1lOiB7XG4gICAgICAgIGhvdFJlbG9hZDogZW5oYW5jZW1lbnRzPy5ob3RSZWxvYWQgPz8gdHJ1ZSxcbiAgICAgICAgZGVidWdNb2RlOiBlbmhhbmNlbWVudHM/LmRlYnVnTW9kZSA/PyBmYWxzZSxcbiAgICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nOiBlbmhhbmNlbWVudHM/LnBlcmZvcm1hbmNlTW9uaXRvcmluZyA/PyBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHJ1bnRpbWVDb3JlQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnRGV2ZWxvcG1lbnQgc2VydmVyIFJ1bnRpbWUgQ29yZSB3aXRoIHJ1bnRpbWUgZmVhdHVyZXMnLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcnVudGltZUNvcmVDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemUgYnVpbGQgcHJvY2VzcyB3aXRoIHJ1bnRpbWUtc3BlY2lmaWMgb3B0aW1pemF0aW9ucy5cbiAgICogRXh0ZW5kcyBwdXJlbm93J3MgYnVpbGQgcHJvY2VzcyB3aXRob3V0IHJlcGxhY2luZyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGJ1aWxkQ29uZmlnIC0gQmFzZSBidWlsZCBjb25maWd1cmF0aW9uIGZyb20gcHVyZW5vd1xuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqIEByZXR1cm5zIE9wdGltaXplZCBidWlsZCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBAaW5qZWN0QmVmb3JlKFxuICAgIGxvZ2dlckluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IE9wdGltaXplIEJ1aWxkJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBPcHRpbWl6ZSBCdWlsZCB8IEV4Y2VwdGlvbiAoZXJyb3IpJyksXG4gIClcbiAgcHVibGljIGFzeW5jIG9wdGltaXplQnVpbGQoXG4gICAgYnVpbGRDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3Qgb3B0aW1pemF0aW9ucyA9IHRoaXMucnVudGltZUNvbmZpZy5idWlsZE9wdGltaXphdGlvbnM7XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IGJ1aWxkQ29uZmlnLCBvcHRpbWl6YXRpb25zIH0sIHtcbiAgICAgIG1lc3NhZ2U6ICdBcHBseWluZyBydW50aW1lLXNwZWNpZmljIGJ1aWxkIG9wdGltaXphdGlvbnMnLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3B0aW1pemVkQ29uZmlnID0ge1xuICAgICAgLi4uYnVpbGRDb25maWcsXG4gICAgICAvLyBBZGQgcnVudGltZS1zcGVjaWZpYyBvcHRpbWl6YXRpb25zXG4gICAgICBydW50aW1lOiB7XG4gICAgICAgIGJ1bmRsZUFuYWx5c2lzOiBvcHRpbWl6YXRpb25zPy5idW5kbGVBbmFseXNpcyA/PyBmYWxzZSxcbiAgICAgICAgdHJlZXNoYWtpbmc6IG9wdGltaXphdGlvbnM/LnRyZWVzaGFraW5nID8/IHRydWUsXG4gICAgICAgIGNvZGVNaW5pZmljYXRpb246IG9wdGltaXphdGlvbnM/LmNvZGVNaW5pZmljYXRpb24gPz8gdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KG9wdGltaXplZENvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ0J1aWxkIGNvbmZpZ3VyYXRpb24gb3B0aW1pemVkIHdpdGggcnVudGltZSBmZWF0dXJlcycsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICB9KTtcblxuICAgIHJldHVybiBvcHRpbWl6ZWRDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIFJ1bnRpbWUgQ29yZSBzdGFjayBmb3IgcnVudGltZSBkZXBsb3ltZW50LlxuICAgKiBFeHRlbmRzIHB1cmVub3cncyB0d28tc3RhY2sgYXJjaGl0ZWN0dXJlIHRvIHRocmVlIHN0YWNrcy5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VTdGFja0NvbmZpZyAtIEJhc2Ugc3RhY2sgY29uZmlndXJhdGlvbiBmcm9tIHB1cmVub3dcbiAgICogQHBhcmFtIGJlZm9yZUluc3RhbmNlIC0gTG9nZ2VyIGluc3RhbmNlIGZvciB0cmFja2luZ1xuICAgKiBAcmV0dXJucyBSdW50aW1lIHN0YWNrIGNvbmZpZ3VyYXRpb24gZm9yIFJ1bnRpbWUgQ29yZSBzdGFja1xuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBDb25maWd1cmUgUnVudGltZSBDb3JlIHN0YWNrJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBDb25maWd1cmUgUnVudGltZSBDb3JlIHN0YWNrIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgY29uZmlndXJlUnVudGltZUNvcmVTdGFjayhcbiAgICBiYXNlU3RhY2tDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTxNYXliZTxSdW50aW1lU3RhY2tDb25maWc+PiB7XG4gICAgaWYgKCF0aGlzLnJ1bnRpbWVDb25maWcuZW5hYmxlUnVudGltZUNvcmVTdGFjaykge1xuICAgICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3cobnVsbCwge1xuICAgICAgICBtZXNzYWdlOiAnUnVudGltZSBDb3JlIHN0YWNrIGRlcGxveW1lbnQgaXMgZGlzYWJsZWQnLFxuICAgICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuRGVidWcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coYmFzZVN0YWNrQ29uZmlnLCB7XG4gICAgICBtZXNzYWdlOiAnQ29uZmlndXJpbmcgUnVudGltZSBDb3JlIHN0YWNrIGZvciBydW50aW1lIGRlcGxveW1lbnQnLFxuICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcnVudGltZVN0YWNrQ29uZmlnOiBSdW50aW1lU3RhY2tDb25maWcgPSB7XG4gICAgICBzdGFja05hbWU6IGAke2Jhc2VTdGFja0NvbmZpZy5zdGFja05hbWUgfHwgJ3B1cmVub3cnfS1ydW50aW1lYCxcbiAgICAgIHJlc291cmNlczogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ0xhbWJkYScsXG4gICAgICAgICAgbmFtZTogJ1J1bnRpbWVXZWJIYW5kbGVyJyxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHJ1bnRpbWU6ICdub2RlanMxOC54JyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDMwLFxuICAgICAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZGVwZW5kZW5jaWVzOiBbXG4gICAgICAgIGAke2Jhc2VTdGFja0NvbmZpZy5zdGFja05hbWUgfHwgJ3B1cmVub3cnfS1pbmZyYXN0cnVjdHVyZWAsXG4gICAgICAgIGAke2Jhc2VTdGFja0NvbmZpZy5zdGFja05hbWUgfHwgJ3B1cmVub3cnfS1ydW50aW1lLWJhc2VgLFxuICAgICAgXSxcbiAgICAgIG91dHB1dHM6IHtcbiAgICAgICAgUnVudGltZVN0YWNrQXJuOiAncnVudGltZS1zdGFjay1hcm4nLFxuICAgICAgICBSdW50aW1lV2ViRW5kcG9pbnQ6ICdydW50aW1lLXdlYi1lbmRwb2ludCcsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyhydW50aW1lU3RhY2tDb25maWcsIHtcbiAgICAgIG1lc3NhZ2U6ICdSdW50aW1lIENvcmUgc3RhY2sgY29uZmlndXJhdGlvbiBjcmVhdGVkJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWVTdGFja0NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgKiBBbGxvd3MgZHluYW1pYyBjb25maWd1cmF0aW9uIG9mIHJ1bnRpbWUgZmVhdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBOZXcgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgVXBkYXRlIENvbmZpZ3VyYXRpb24nKSxcbiAgICBjYXRjaEluamVjdG9yKCdSdW50aW1lIHwgRXh0ZW5zaW9ucyB8IFVwZGF0ZSBDb25maWd1cmF0aW9uIHwgRXhjZXB0aW9uIChlcnJvciknKSxcbiAgKVxuICBwdWJsaWMgYXN5bmMgdXBkYXRlQ29uZmlndXJhdGlvbihcbiAgICBjb25maWc6IFBhcnRpYWw8UnVudGltZUNvbmZpZz4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBvbGRDb25maWc6IHRoaXMucnVudGltZUNvbmZpZywgbmV3Q29uZmlnOiBjb25maWcgfSwge1xuICAgICAgbWVzc2FnZTogJ1VwZGF0aW5nIHJ1bnRpbWUgY29uZmlndXJhdGlvbicsXG4gICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuRGVidWcsXG4gICAgfSk7XG5cbiAgICAvLyBNZXJnZSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJ1bnRpbWVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnJ1bnRpbWVDb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgICBkZXZTZXJ2ZXJFbmhhbmNlbWVudHM6IHtcbiAgICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLmRldlNlcnZlckVuaGFuY2VtZW50cyxcbiAgICAgICAgLi4uY29uZmlnLmRldlNlcnZlckVuaGFuY2VtZW50cyxcbiAgICAgIH0sXG4gICAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLmJ1aWxkT3B0aW1pemF0aW9ucyxcbiAgICAgICAgLi4uY29uZmlnLmJ1aWxkT3B0aW1pemF0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHRoaXMucnVudGltZUNvbmZpZywge1xuICAgICAgbWVzc2FnZTogJ1J1bnRpbWUgY29uZmlndXJhdGlvbiB1cGRhdGVkJyxcbiAgICAgIGxldmVsOiBMb2dnZXJMZXZlbC5JbmZvLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvbi5cbiAgICogUHJvdmlkZXMgcmVhZC1vbmx5IGFjY2VzcyB0byBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29uZmlndXJhdGlvbigpOiBSZWFkb25seTxSdW50aW1lQ29uZmlnPiB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy5ydW50aW1lQ29uZmlnIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcnVudGltZSBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gICAqIFV0aWxpdHkgbWV0aG9kIGZvciBjaGVja2luZyBmZWF0dXJlIGZsYWdzLlxuICAgKlxuICAgKiBAcGFyYW0gZmVhdHVyZSAtIEZlYXR1cmUgbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIGZlYXR1cmUgaXMgZW5hYmxlZFxuICAgKi9cbiAgcHVibGljIGlzRmVhdHVyZUVuYWJsZWQoZmVhdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXM/LmluY2x1ZGVzKGZlYXR1cmUpID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBydW50aW1lIGZlYXR1cmUuXG4gICAqIEFkZHMgZmVhdHVyZSB0byB0aGUgbGlzdCBvZiBlbmFibGVkIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZmVhdHVyZSAtIEZlYXR1cmUgbmFtZSB0byBlbmFibGVcbiAgICogQHBhcmFtIGJlZm9yZUluc3RhbmNlIC0gTG9nZ2VyIGluc3RhbmNlIGZvciB0cmFja2luZ1xuICAgKi9cbiAgQGluamVjdEJlZm9yZShcbiAgICBsb2dnZXJJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBFbmFibGUgRmVhdHVyZScpLFxuICAgIGNhdGNoSW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRW5hYmxlIEZlYXR1cmUgfCBFeGNlcHRpb24gKGVycm9yKScpLFxuICApXG4gIHB1YmxpYyBhc3luYyBlbmFibGVGZWF0dXJlKFxuICAgIGZlYXR1cmU6IHN0cmluZyxcbiAgICBiZWZvcmVJbnN0YW5jZT86IEJlZm9yZUluc3RhbmNlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNGZWF0dXJlRW5hYmxlZChmZWF0dXJlKSkge1xuICAgICAgdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyA9IFtcbiAgICAgICAgLi4uKHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgfHwgW10pLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgXTtcblxuICAgICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBmZWF0dXJlLCBlbmFibGVkRmVhdHVyZXM6IHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgfSwge1xuICAgICAgICBtZXNzYWdlOiBgUnVudGltZSBmZWF0dXJlICcke2ZlYXR1cmV9JyBlbmFibGVkYCxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkluZm8sXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmVmb3JlSW5zdGFuY2U/LmxvZy5ub3coeyBmZWF0dXJlIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgaXMgYWxyZWFkeSBlbmFibGVkYCxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgcnVudGltZSBmZWF0dXJlLlxuICAgKiBSZW1vdmVzIGZlYXR1cmUgZnJvbSB0aGUgbGlzdCBvZiBlbmFibGVkIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZmVhdHVyZSAtIEZlYXR1cmUgbmFtZSB0byBkaXNhYmxlXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIEBpbmplY3RCZWZvcmUoXG4gICAgbG9nZ2VySW5qZWN0b3IoJ1J1bnRpbWUgfCBFeHRlbnNpb25zIHwgRGlzYWJsZSBGZWF0dXJlJyksXG4gICAgY2F0Y2hJbmplY3RvcignUnVudGltZSB8IEV4dGVuc2lvbnMgfCBEaXNhYmxlIEZlYXR1cmUgfCBFeGNlcHRpb24gKGVycm9yKScpLFxuICApXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlRmVhdHVyZShcbiAgICBmZWF0dXJlOiBzdHJpbmcsXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNGZWF0dXJlRW5hYmxlZChmZWF0dXJlKSkge1xuICAgICAgdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyA9ICh0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKGYgPT4gZiAhPT0gZmVhdHVyZSk7XG5cbiAgICAgIGJlZm9yZUluc3RhbmNlPy5sb2cubm93KHsgZmVhdHVyZSwgZW5hYmxlZEZlYXR1cmVzOiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIH0sIHtcbiAgICAgICAgbWVzc2FnZTogYFJ1bnRpbWUgZmVhdHVyZSAnJHtmZWF0dXJlfScgZGlzYWJsZWRgLFxuICAgICAgICBsZXZlbDogTG9nZ2VyTGV2ZWwuSW5mbyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBiZWZvcmVJbnN0YW5jZT8ubG9nLm5vdyh7IGZlYXR1cmUgfSwge1xuICAgICAgICBtZXNzYWdlOiBgUnVudGltZSBmZWF0dXJlICcke2ZlYXR1cmV9JyBpcyBhbHJlYWR5IGRpc2FibGVkYCxcbiAgICAgICAgbGV2ZWw6IExvZ2dlckxldmVsLkRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBSZS1leHBvcnQgYmFzZSBidW5kbGUgZnVuY3Rpb25hbGl0eSBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgYnVuZGxlIGNvbXBvbmVudHNcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS5jb250YWluZXInO1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLmNvbnRhaW5lci50eXBlcyc7IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0ICdyZWZsZWN0LW1ldGFkYXRhJztcblxuaW1wb3J0IHsgcHVyYWJsZSwgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IFJ1bnRpbWVFeHRlbnNpb25zIH0gZnJvbSAnQGNvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zJztcblxuLyoqXG4gKiBSdW50aW1lQ29udGFpbmVyIHByb3ZpZGVzIHJ1bnRpbWUtc3BlY2lmaWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gYmluZGluZ3NcbiAqIHVzaW5nIFB1cmVDb250YWluZXIgZnJvbSBAd29ya3RpZi91dGlscy4gVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm5cbiAqIHVzZWQgdGhyb3VnaG91dCB0aGUgcnVudGltZSB3b3Jrc3BhY2UuXG4gKlxuICogVGhlIGNvbnRhaW5lciBhZGRzIHJ1bnRpbWUgc2VydmljZXMgd2hpbGUgYmVpbmcgY29tcGF0aWJsZSB3aXRoXG4gKiBwdXJlbm93J3MgYXJjaGl0ZWN0dXJhbCBwYXR0ZXJucy5cbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb250YWluZXIge1xuICBwcml2YXRlIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gbmV3IFB1cmVDb250YWluZXI8c3RyaW5nPih7XG4gICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgIH0pO1xuICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bnRpbWVCaW5kaW5ncygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlIGJpbmRpbmdzLlxuICAgKiBSZWdpc3RlcnMgcnVudGltZSBzZXJ2aWNlcyB3aXRoIHRoZSBjb250YWluZXIuXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVSdW50aW1lQmluZGluZ3MoKTogdm9pZCB7XG4gICAgLy8gUmVnaXN0ZXIgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZSBhcyBzaW5nbGV0b25cbiAgICB0aGlzLmNvbnRhaW5lci50aWVTaW5nbGV0b24oe1xuICAgICAgJ1J1bnRpbWVFeHRlbnNpb25zJzoge1xuICAgICAgICBpbnN0YW5jZTogUnVudGltZUV4dGVuc2lvbnMsXG4gICAgICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKiBBbGxvd3MgYWNjZXNzIHRvIHRoZSBjb250YWluZXIgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRDb250YWluZXIoKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHNlcnZpY2UgZnJvbSB0aGUgY29udGFpbmVyLlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIHNlcnZpY2UgcmVzb2x1dGlvbi5cbiAgICovXG4gIHB1YmxpYyByZXNvbHZlPFQ+KHNlcnZpY2VJZDogc3RyaW5nKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuXG4gICAqIFV0aWxpdHkgbWV0aG9kIGZvciBzZXJ2aWNlIHZhbGlkYXRpb24uXG4gICAqL1xuICBwdWJsaWMgaXNSZWdpc3RlcmVkKHNlcnZpY2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29udGFpbmVyLnJ1bihzZXJ2aWNlSWQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGZvciBSdW50aW1lLXNwZWNpZmljIERlcGVuZGVuY3kgSW5qZWN0aW9uIGJpbmRpbmdzLlxuICogRXh0ZW5kcyBwdXJlbm93J3MgREkgYmluZGluZ3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUnVudGltZURpIHtcbiAgLy8gUnVudGltZSBFeHRlbnNpb25zIFNlcnZpY2VcbiAgUnVudGltZUV4dGVuc2lvbnNTZXJ2aWNlQmluZCA9ICdydW50aW1lX2V4dGVuc2lvbnNfc2VydmljZV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENvbmZpZ3VyYXRpb25cbiAgUnVudGltZUNvbmZpZ0JpbmQgPSAncnVudGltZV9jb25maWdfYmluZCcsXG5cbiAgLy8gUnVudGltZSBEZXBsb3ltZW50IFN0cmF0ZWd5XG4gIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3lCaW5kID0gJ3J1bnRpbWVfZGVwbG95bWVudF9zdHJhdGVneV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENMSSBFeHRlbnNpb25zXG4gIFJ1bnRpbWVDbGlCaW5kID0gJ3J1bnRpbWVfY2xpX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgU3RhY2sgQ29uZmlndXJhdGlvblxuICBSdW50aW1lU3RhY2tDb25maWdCaW5kID0gJ3J1bnRpbWVfc3RhY2tfY29uZmlnX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgV2ViIEhhbmRsZXIgRmFjdG9yeVxuICBSdW50aW1lV2ViSGFuZGxlckZhY3RvcnlCaW5kID0gJ3J1bnRpbWVfd2ViX2hhbmRsZXJfZmFjdG9yeV9iaW5kJyxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI4ekJBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlD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X19jb21tb25KU01pbiIsICJSZWZsZWN0IiwgImZhY3RvcnkiLCAicm9vdCIsICJzbG9wcHlNb2RlVGhpcyIsICJleHBvcnRlciIsICJtYWtlRXhwb3J0ZXIiLCAidGFyZ2V0IiwgInByZXZpb3VzIiwgImtleSIsICJ2YWx1ZSIsICJmdW5jdGlvblRoaXMiLCAiaW5kaXJlY3RFdmFsVGhpcyIsICJoYXNPd24iLCAic3VwcG9ydHNTeW1ib2wiLCAidG9QcmltaXRpdmVTeW1ib2wiLCAiaXRlcmF0b3JTeW1ib2wiLCAic3VwcG9ydHNDcmVhdGUiLCAic3VwcG9ydHNQcm90byIsICJkb3duTGV2ZWwiLCAiSGFzaE1hcCIsICJNYWtlRGljdGlvbmFyeSIsICJtYXAiLCAiZnVuY3Rpb25Qcm90b3R5cGUiLCAiX01hcCIsICJDcmVhdGVNYXBQb2x5ZmlsbCIsICJfU2V0IiwgIkNyZWF0ZVNldFBvbHlmaWxsIiwgIl9XZWFrTWFwIiwgIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsICJyZWdpc3RyeVN5bWJvbCIsICJtZXRhZGF0YVJlZ2lzdHJ5IiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJtZXRhZGF0YVByb3ZpZGVyIiwgIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCAiZGVjb3JhdGUiLCAiZGVjb3JhdG9ycyIsICJwcm9wZXJ0eUtleSIsICJhdHRyaWJ1dGVzIiwgIklzVW5kZWZpbmVkIiwgIklzQXJyYXkiLCAiSXNDb25zdHJ1Y3RvciIsICJEZWNvcmF0ZUNvbnN0cnVjdG9yIiwgIklzT2JqZWN0IiwgIklzTnVsbCIsICJUb1Byb3BlcnR5S2V5IiwgIkRlY29yYXRlUHJvcGVydHkiLCAibWV0YWRhdGEiLCAibWV0YWRhdGFLZXkiLCAibWV0YWRhdGFWYWx1ZSIsICJkZWNvcmF0b3IiLCAiSXNQcm9wZXJ0eUtleSIsICJPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhIiwgImRlZmluZU1ldGFkYXRhIiwgImhhc01ldGFkYXRhIiwgIk9yZGluYXJ5SGFzTWV0YWRhdGEiLCAiaGFzT3duTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeUdldE1ldGFkYXRhIiwgImdldE93bk1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0T3duTWV0YWRhdGEiLCAiZ2V0TWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5TWV0YWRhdGFLZXlzIiwgImdldE93bk1ldGFkYXRhS2V5cyIsICJPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyIsICJkZWxldGVNZXRhZGF0YSIsICJwcm92aWRlciIsICJHZXRNZXRhZGF0YVByb3ZpZGVyIiwgImkiLCAiZGVjb3JhdGVkIiwgImRlc2NyaXB0b3IiLCAiTWV0YWRhdGFLZXkiLCAiTyIsICJQIiwgInBhcmVudCIsICJPcmRpbmFyeUdldFByb3RvdHlwZU9mIiwgIlRvQm9vbGVhbiIsICJNZXRhZGF0YVZhbHVlIiwgIm93bktleXMiLCAicGFyZW50S2V5cyIsICJzZXQiLCAia2V5cyIsICJfaSIsICJvd25LZXlzXzEiLCAiaGFzS2V5IiwgIl9hIiwgInBhcmVudEtleXNfMSIsICJUeXBlIiwgIngiLCAiSXNTeW1ib2wiLCAiVG9QcmltaXRpdmUiLCAiaW5wdXQiLCAiUHJlZmVycmVkVHlwZSIsICJoaW50IiwgImV4b3RpY1RvUHJpbSIsICJHZXRNZXRob2QiLCAicmVzdWx0IiwgIk9yZGluYXJ5VG9QcmltaXRpdmUiLCAidG9TdHJpbmdfMSIsICJJc0NhbGxhYmxlIiwgInZhbHVlT2YiLCAidG9TdHJpbmdfMiIsICJhcmd1bWVudCIsICJUb1N0cmluZyIsICJTYW1lVmFsdWVaZXJvIiwgInkiLCAiViIsICJmdW5jIiwgIkdldEl0ZXJhdG9yIiwgIm9iaiIsICJtZXRob2QiLCAiaXRlcmF0b3IiLCAiSXRlcmF0b3JWYWx1ZSIsICJpdGVyUmVzdWx0IiwgIkl0ZXJhdG9yU3RlcCIsICJJdGVyYXRvckNsb3NlIiwgImYiLCAicHJvdG8iLCAicHJvdG90eXBlIiwgInByb3RvdHlwZVByb3RvIiwgImNvbnN0cnVjdG9yIiwgIkNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkiLCAiZmFsbGJhY2siLCAiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsICJmaXJzdCIsICJzZWNvbmQiLCAicmVzdCIsICJ0YXJnZXRQcm92aWRlck1hcCIsICJyZWdpc3RyeSIsICJyZWdpc3RlclByb3ZpZGVyIiwgImdldFByb3ZpZGVyIiwgInNldFByb3ZpZGVyIiwgImdldFByb3ZpZGVyTm9DYWNoZSIsICJuZXh0IiwgInByb3ZpZGVyTWFwIiwgImhhc1Byb3ZpZGVyIiwgImV4aXN0aW5nUHJvdmlkZXIiLCAidGFyZ2V0TWV0YWRhdGEiLCAiT3JkaW5hcnlEZWxldGVNZXRhZGF0YSIsICJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwgIkNyZWF0ZSIsICJjcmVhdGVkVGFyZ2V0TWV0YWRhdGEiLCAibWV0YWRhdGFNYXAiLCAia2V5c09iaiIsICJrIiwgIm5leHRWYWx1ZSIsICJlIiwgInJlZmxlY3QiLCAibWV0YWRhdGFPd25lciIsICJtZXRhZGF0YVByb3BlcnR5U2V0IiwgInJlZ2lzdGVyZWRQcm92aWRlciIsICJjYWNoZVNlbnRpbmVsIiwgImFycmF5U2VudGluZWwiLCAiTWFwSXRlcmF0b3IiLCAidmFsdWVzIiwgInNlbGVjdG9yIiwgImluZGV4IiwgImVycm9yIiwgIk1hcCIsICJzaXplIiwgImdldEtleSIsICJnZXRWYWx1ZSIsICJnZXRFbnRyeSIsICJpbnNlcnQiLCAiXyIsICJTZXQiLCAiVVVJRF9TSVpFIiwgInJvb3RLZXkiLCAiQ3JlYXRlVW5pcXVlS2V5IiwgIldlYWtNYXAiLCAidGFibGUiLCAiR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUiLCAiQ3JlYXRlVVVJRCIsICJjcmVhdGUiLCAiRmlsbFJhbmRvbUJ5dGVzIiwgImJ1ZmZlciIsICJHZW5SYW5kb21CeXRlcyIsICJhcnJheSIsICJkYXRhIiwgIm9mZnNldCIsICJieXRlIiwgImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQ29udGFpbmVyUmVnaXN0cnkiLCAiRElDb250YWluZXJFcnJvciIsICJMYW1iZGFIYW5kbGVyRmFjdG9yeSIsICJMYW1iZGFQaXBlbGluZSIsICJNaWNyb3NlcnZpY2VSZWdpc3RyYXIiLCAiTWlzc2luZ1NlcnZpY2VFcnJvciIsICJQdXJlQ29udGFpbmVyRmFjdG9yeSIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVEZXRlY3RvciIsICJSdW50aW1lRGkiLCAiUnVudGltZUV4dGVuc2lvbnMiLCAiUnVudGltZVdlYkxhbWJkYUhhbmRsZXIiLCAiVGllc1JlZ2lzdHJhciIsICJUaWVzUmVnaXN0cmF0aW9uRXJyb3IiLCAiZXJyb3JXcmFwcGVyIiwgImZ1bGxXcmFwcGVyIiwgImdldEJyb3dzZXJNZXRhZGF0YSIsICJnZXRDREtNZXRhZGF0YSIsICJnZXRMYW1iZGFNZXRhZGF0YSIsICJsb2dnaW5nV3JhcHBlciIsICJ0aW1pbmdXcmFwcGVyIiwgIl9fdG9Db21tb25KUyIsICJfX3JlRXhwb3J0IiwgImdldEJyb3dzZXJNZXRhZGF0YSIsICJlcnJvciIsICJnZXRMYW1iZGFNZXRhZGF0YSIsICJmdW5jdGlvbk5hbWUiLCAibWVtb3J5U2l6ZSIsICJnZXRDREtNZXRhZGF0YSIsICJSdW50aW1lRGV0ZWN0b3IiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImdldENES01ldGFkYXRhIiwgImFyZyIsICJpbXBvcnRfdXRpbHMiLCAiRElDb250YWluZXJFcnJvciIsICJjb250YWluZXJOYW1lIiwgIm1lc3NhZ2UiLCAiVGllc1JlZ2lzdHJhdGlvbkVycm9yIiwgInRpZXNDbGFzc05hbWUiLCAicmVhc29uIiwgIk1pc3NpbmdTZXJ2aWNlRXJyb3IiLCAic2VydmljZU5hbWUiLCAiVGllc1JlZ2lzdHJhciIsICJjb250YWluZXIiLCAidGllc0NsYXNzZXMiLCAiVGllc0NsYXNzIiwgInRpZXNJbnN0YW5jZSIsICJUaWVzUmVnaXN0cmF0aW9uRXJyb3IiLCAiZXJyb3IiLCAicmVxdWlyZWRTZXJ2aWNlcyIsICJtaXNzaW5nU2VydmljZXMiLCAic2VydmljZU5hbWUiLCAic2VydmljZU5hbWVzIiwgIm5hbWVzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfdXRpbHMiLCAiUHVyZUNvbnRhaW5lckZhY3RvcnkiLCAiVGllc1JlZ2lzdHJhciIsICJ0aWVzQ2xhc3NlcyIsICJjb250YWluZXIiLCAiZXJyb3IiLCAiRElDb250YWluZXJFcnJvciIsICJvcHRpb25zIiwgInJlcXVpcmVkU2VydmljZXMiLCAiYWRkaXRpb25hbFNlcnZpY2VzIiwgImFsbFJlcXVpcmVkU2VydmljZXMiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfdXRpbHMiLCAibG9nZ2luZ1dyYXBwZXIiLCAiaGFuZGxlciIsICJtZXRhZGF0YSIsICJoYW5kbGVyTG9nZ2VyIiwgImV2ZW50IiwgImNvbnRleHQiLCAic3RhcnRUaW1lIiwgImNvbnRleHRJbmZvIiwgImV4dHJhY3RMYW1iZGFDb250ZXh0IiwgImdldEV2ZW50VHlwZSIsICJyZXN1bHQiLCAibWV0cmljcyIsICJjYWxjdWxhdGVNZXRyaWNzIiwgImVycm9yIiwgImVycm9yV3JhcHBlciIsICJlcnJvckxvZ2dlciIsICJlcnJvckRldGFpbHMiLCAiZXh0cmFjdEVycm9yRGV0YWlscyIsICJpc0FwaUdhdGV3YXlFdmVudCIsICJ0aW1pbmdXcmFwcGVyIiwgInRpbWluZ0xvZ2dlciIsICJzdGFydE1lbW9yeSIsICJjYWxjdWxhdGVEZXRhaWxlZE1ldHJpY3MiLCAiZnVsbFdyYXBwZXIiLCAiY3R4IiwgImVuZFRpbWUiLCAiZW5kTWVtb3J5IiwgImV2dCIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3B1cmV3cyIsICJSdW50aW1lV2ViTGFtYmRhSGFuZGxlciIsICJkZWZpbml0aW9uIiwgImNvbnRhaW5lciIsICJmYWN0b3J5IiwgImV2ZW50IiwgImNvbnRleHQiLCAicmVzdWx0IiwgImVycm9yIiwgImRlcHMiLCAicmF3VXNlckhhbmRsZXIiLCAid3JhcHBlZEhhbmRsZXIiLCAiTGFtYmRhSGFuZGxlckZhY3RvcnkiLCAiZGVmaW5pdGlvbiIsICJjb250YWluZXIiLCAiUnVudGltZVdlYkxhbWJkYUhhbmRsZXIiLCAidGllcyIsICJkZXBzIiwgImNsYXNzUmVmIiwgInRva2VuIiwgImluc3RhbmNlIiwgImtleSIsICJlcnJvciIsICJoYW5kbGVyIiwgIm1ldGFkYXRhIiwgImZ1bGxXcmFwcGVyIiwgImNsYXNzTmFtZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImlzUHJvbWlzZSIsICJvYmplY3QiLCAidGhlbiIsICJzdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllciIsICJzZXJ2aWNlSWRlbnRpZmllciIsICJ0b1N0cmluZyIsICJuYW1lIiwgIkVycm9yIiwgImlzbGF6eVNlcnZpY2VJZGVudGlmaWVyU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgImJ1aWxkU2VydmljZUlkIiwgInRoaXMiLCAidmFsdWUiLCAidW53cmFwIiwgImdldE93blJlZmxlY3RNZXRhZGF0YSIsICJ0YXJnZXQiLCAibWV0YWRhdGFLZXkiLCAicHJvcGVydHlLZXkiLCAiUmVmbGVjdCIsICJnZXRPd25NZXRhZGF0YSIsICJzZXRSZWZsZWN0TWV0YWRhdGEiLCAidGFyZ2V0IiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhIiwgInByb3BlcnR5S2V5IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAidXBkYXRlT3duUmVmbGVjdE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFZhbHVlIiwgImNhbGxiYWNrIiwgInVwZGF0ZWRNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiSURfTUVUQURBVEEiLCAiZ2V0QmluZGluZ0lkIiwgImJpbmRpbmdJZCIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiT2JqZWN0IiwgIk51bWJlciIsICJNQVhfU0FGRV9JTlRFR0VSIiwgInNldFJlZmxlY3RNZXRhZGF0YSIsICJNSU5fU0FGRV9JTlRFR0VSIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJpZCIsICJiaW5kaW5nU2NvcGVWYWx1ZXMiLCAiUmVxdWVzdCIsICJTaW5nbGV0b24iLCAiVHJhbnNpZW50IiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkNvbnN0YW50VmFsdWUiLCAiRHluYW1pY1ZhbHVlIiwgIkZhY3RvcnkiLCAiSW5zdGFuY2UiLCAiUHJvdmlkZXIiLCAiUmVzb2x2ZWRWYWx1ZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAiQWN0aXZhdGlvblJlbGF0aW9uS2luZCIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJsaWZlY3ljbGUiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicHJlRGVzdHJveU1ldGhvZE5hbWUiLCAidW5kZWZpbmVkIiwgInByb3BlcnRpZXMiLCAiTWFwIiwgInNjb3BlIiwgInBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnRSZWZsZWN0S2V5IiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiRXJyb3IiLCAia2luZCIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAic3VwZXIiLCAidGhpcyIsICJ2YWx1ZSIsICJpcyIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIkJpbmRpbmdSZWxhdGlvbktpbmQiLCAiRGVhY3RpdmF0aW9uUmVsYXRpb25LaW5kIiwgIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZCIsICJnZXRDbGFzc01ldGFkYXRhIiwgInR5cGUiLCAiY2xhc3NNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAicGVuZGluZ0NsYXNzTWV0YWRhdGFDb3VudCIsICJ1bmRlZmluZWRJbmRleGVzIiwgImxlbmd0aCIsICJtaXNzaW5nSW5qZWN0aW9uRGVjb3JhdG9yIiwgIm5hbWUiLCAidG9TdHJpbmciLCAiaSIsICJwdXNoIiwgImpvaW4iLCAiZXJyb3JzIiwgImNvbnN0cnVjdG9yQXJndW1lbnQiLCAidW5rbm93biIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0eSIsICJidWlsZEluc3RhbmNlQmluZGluZyIsICJhdXRvYmluZE9wdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGUiLCAiaXNSaWdodCIsICJpZCIsICJnZXRCaW5kaW5nSWQiLCAiaW1wbGVtZW50YXRpb25UeXBlIiwgImlzU2F0aXNmaWVkQnkiLCAibW9kdWxlSWQiLCAib25BY3RpdmF0aW9uIiwgIm9uRGVhY3RpdmF0aW9uIiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkluc3RhbmNlIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQiLCAiQmluZGluZ1JlbGF0aW9uS2luZCIsICJEZWFjdGl2YXRpb25SZWxhdGlvbktpbmQiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdE1ldGFkYXRhIiwgImJ1aWxkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEiLCAicGFyYW1zIiwgIm1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJpbmplY3Rpb25EZWNvcmF0b3JDb25mbGljdCIsICJhc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVua25vd24iLCAiaXNGcm9tVHlwZXNjcmlwdFBhcmFtVHlwZSIsICJidWlsZE1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAibXVsdGlwbGVJbmplY3Rpb24iLCAiY2hhaW5lZCIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgIkRlY29yYXRvckluZm9LaW5kIiwgIkRlY29yYXRvckluZm9LaW5kIiwgImNsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkiLCAiTk9OX1VTRVJMQU5EX1RZUEVTIiwgIkFycmF5IiwgIkJpZ0ludCIsICJCb29sZWFuIiwgIkZ1bmN0aW9uIiwgIk51bWJlciIsICJPYmplY3QiLCAiU3RyaW5nIiwgInVwZGF0ZUNsYXNzTWV0YWRhdGFXaXRoVHlwZXNjcmlwdFBhcmFtZXRlclR5cGVzIiwgInRhcmdldCIsICJ0eXBlc2NyaXB0Q29uc3RydWN0b3JBcmd1bWVudHMiLCAiZ2V0T3duUmVmbGVjdE1ldGFkYXRhIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhIiwgImZvckVhY2giLCAiY29uc3RydWN0b3JBcmd1bWVudFR5cGUiLCAiaW5kZXgiLCAidHlwZSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJpbmNsdWRlcyIsICJpc0Zyb21UeXBlc2NyaXB0UGFyYW1UeXBlIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInNpbmdsZUluamVjdGlvbiIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgImluamVjdGFibGUiLCAic2NvcGUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAic2V0UmVmbGVjdE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFVubWFuYWdlZE1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJidWlsZFVubWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFzc2VydE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRJZk1hbmFnZWQiLCAibmFtZSIsICJvcHRpb25hbCIsICJ0YWdzIiwgInNpemUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiaXNMYXp5UGxhblNlcnZpY2VOb2RlU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVBsYW5TZXJ2aWNlTm9kZSIsICJfc2VydmljZUlkZW50aWZpZXIiLCAiX3NlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgInRoaXMiLCAiYmluZGluZ3MiLCAiX2dldE5vZGUiLCAiaXNDb250ZXh0RnJlZSIsICJ2YWx1ZSIsICJpbnZhbGlkYXRlIiwgImlzRXhwYW5kZWQiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkJpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uIiwgIm5vZGUiLCAibmFtZSIsICJlbGVtIiwgInRhZ3MiLCAiZ2V0QW5jZXN0b3IiLCAiZ2V0QW5jZXN0b3JzQ2FsbGVkIiwgInByZXZpb3VzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJvcHRpb25zIiwgImN1c3RvbVNlcnZpY2VJZGVudGlmaWVyIiwgImZpbHRlcmVkQmluZGluZ3MiLCAiY2hhaW5lZCIsICJvcGVyYXRpb25zIiwgImdldEJpbmRpbmdzQ2hhaW5lZCIsICJnZXRCaW5kaW5ncyIsICJmaWx0ZXIiLCAiYmluZGluZyIsICJpc1NhdGlzZmllZEJ5IiwgImxlbmd0aCIsICJhdXRvYmluZE9wdGlvbnMiLCAiYnVpbGRJbnN0YW5jZUJpbmRpbmciLCAic2V0QmluZGluZyIsICJwdXNoIiwgImlzUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgIm5vZGUiLCAicmVkaXJlY3Rpb25zIiwgInRocm93RXJyb3JXaGVuVW5leHBlY3RlZEJpbmRpbmdzQW1vdW50Rm91bmQiLCAiYmluZGluZ05vZGVzIiwgImlzT3B0aW9uYWwiLCAiYmluZGluZ0NvbnN0cmFpbnROb2RlIiwgInNlcnZpY2VSZWRpcmVjdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiZWxlbSIsICJwYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJwcmV2aW91cyIsICJBcnJheSIsICJpc0FycmF5IiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJsZW5ndGgiLCAibGFzdFJlc29sdmVkU2VydmljZUlkZW50aWZpZXIiLCAiZXJyb3JNZXNzYWdlIiwgInN0cmluZ2lmeVNlcnZpY2VJZGVudGlmaWVyIiwgInN0cmluZ2lmeVNlcnZpY2VSZWRpcmVjdGlvbnMiLCAibWFwIiwgImJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJJbnN0YW5jZSIsICJzY29wZSIsICJpbXBsZW1lbnRhdGlvblR5cGUiLCAibmFtZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAidGFyZ2V0U2VydmljZUlkZW50aWZpZXIiLCAiam9pbiIsICJzdHJpbmdpZnlQYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJzdHJpbmdpZnlCaW5kaW5nQ29uc3RyYWludHMiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAicGxhbm5pbmciLCAidGhyb3dCaW5kaW5nTm90Rm91bmRFcnJvciIsICJzdHJpbmdpZmllZFRhZ3MiLCAidGFncyIsICJzaXplIiwgImtleXMiLCAia2V5IiwgInRvU3RyaW5nIiwgImNoZWNrUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlU2luZ2xlSW5qZWN0aW9uQmluZGluZ3MiLCAic2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicGxhbkJpbmRpbmdOb2RlIiwgImNoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncyIsICJzZXJ2aWNlTm9kZSIsICJiaW5kaW5ncyIsICJnZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJpcyIsICJ1bndyYXAiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFNlcnZpY2VOb2RlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAiZWxlbWVudE1ldGFkYXRhIiwgInZhbHVlIiwgInVwZGF0ZWRCaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImNvbmNhdCIsICJnZXRBbmNlc3RvcnNDYWxsZWQiLCAiQmluZGluZ0NvbnN0cmFpbnRzSW1wbGVtZW50YXRpb24iLCAibGFzdCIsICJjaGFpbmVkIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIm11bHRpcGxlSW5qZWN0aW9uIiwgImZpbHRlcmVkU2VydmljZUJpbmRpbmdzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAic2VydmljZU5vZGVCaW5kaW5ncyIsICJpc0NvbnRleHRGcmVlIiwgInB1c2giLCAic2luZ2xlSW5qZWN0aW9uIiwgIm9wdGlvbmFsIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJSZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZCIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJzdWJwbGFuIiwgImJ1aWxkSW5zdGFuY2VQbGFuQmluZGluZ05vZGUiLCAiY2hpbGROb2RlIiwgImNsYXNzTWV0YWRhdGEiLCAib3BlcmF0aW9ucyIsICJnZXRDbGFzc01ldGFkYXRhIiwgImNvbnN0cnVjdG9yUGFyYW1zIiwgInByb3BlcnR5UGFyYW1zIiwgIk1hcCIsICJzdWJwbGFuUGFyYW1zIiwgImF1dG9iaW5kT3B0aW9ucyIsICJzZXJ2aWNlc0JyYW5jaCIsICJidWlsZFJlc29sdmVkVmFsdWVQbGFuQmluZGluZ05vZGUiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgInBsYW5CaW5kaW5nTm9kZXMiLCAiUmVzb2x2ZWRWYWx1ZSIsICJidWlsZFNlcnZpY2VSZWRpcmVjdGlvblBsYW5CaW5kaW5nTm9kZSIsICJwb3AiLCAiY3VzdG9tU2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGVOb25Sb290UGxhblNlcnZpY2VOb2RlIiwgImdldFBsYW5PcHRpb25zIiwgInBsYW5TZXJ2aWNlTm9kZSIsICJjb250ZXh0IiwgIkxhenlQbGFuU2VydmljZU5vZGUiLCAiaXNFeHBhbmRlZCIsICJwbGFuUmVzdWx0IiwgInRyZWUiLCAicm9vdCIsICJzZXRQbGFuIiwgInNldE5vbkNhY2hlZFNlcnZpY2VOb2RlIiwgIkxhenlNYW5hZ2VkQ2xhc3NNZXRhZGF0YVBsYW5TZXJ2aWNlTm9kZSIsICJidWlsZExhenlQbGFuU2VydmljZU5vZGVOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInN1cGVyIiwgInRoaXMiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkxhenlSZXNvbHZlZFZhbHVlTWV0YWRhdGFQbGFuU2VydmljZU5vZGUiLCAiYnVpbGRMYXp5UGxhblNlcnZpY2VOb2RlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlTdWJwbGFuIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAic3VicGxhbkluc3RhbmNlQmluZGluZ05vZGUiLCAiaGFuZGxlUGxhblNlcnZpY2VOb2RlQnVpbGRGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAidW5tYW5hZ2VkIiwgInRhZyIsICJlbnRyaWVzIiwgIm5leHQiLCAiaXNNdWx0aXBsZSIsICJnZXRQbGFuIiwgImxhenlQbGFuU2VydmljZU5vZGUiLCAib3B0aW9uYWxCaW5kaW5ncyIsICJpbmRleCIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0aWVzIiwgInNldCIsICJzdWJwbGFuUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgImhhbmRsZVBsYW5TZXJ2aWNlTm9kZUJ1aWxkRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAicmVzb2x2ZWRWYWx1ZU1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFyZ3VtZW50cyIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJjdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImNpcmN1bGFyQnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeVN1YnBsYW4iLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgIkNhY2hlQmluZGluZ0ludmFsaWRhdGlvbktpbmQiLCAiYnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5U3VicGxhbiIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInBhcmFtcyIsICJiaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImVsZW1lbnRNZXRhZGF0YSIsICJsYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAibGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJlcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiaXNFcnJvck9mS2luZCIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInBsYW5uaW5nIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJjYWNoZVJlc29sdmVkVmFsdWUiLCAiYmluZGluZyIsICJyZXNvbHZlZFZhbHVlIiwgImlzUHJvbWlzZSIsICJjYWNoZSIsICJpc1JpZ2h0IiwgInZhbHVlIiwgInRoZW4iLCAic3luY1Jlc29sdmVkVmFsdWUiLCAiY2FjaGVTeW5jUmVzb2x2ZWRWYWx1ZSIsICJyZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucyIsICJwYXJhbXMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiYWN0aXZhdGlvbnMiLCAiZ2V0QWN0aXZhdGlvbnMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9uc0Zyb21JdGVyYXRvckFzeW5jIiwgIlN5bWJvbCIsICJpdGVyYXRvciIsICJhY3RpdmF0aW9uc0l0ZXJhdG9yIiwgImFjdGl2YXRlZFZhbHVlIiwgImFjdGl2YXRpb25JdGVyYXRvclJlc3VsdCIsICJuZXh0IiwgImRvbmUiLCAibmV4dEFjdGl2YXRlZFZhbHVlIiwgImNvbnRleHQiLCAiYXN5bmMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9ucyIsICJhY3RpdmF0aW9uUmVzdWx0IiwgIm9uQWN0aXZhdGlvbiIsICJyZXNvbHZlZCIsICJyZXNvbHZlU2luZ2xldG9uU2NvcGVkQmluZGluZyIsICJyZXNvbHZlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJfcGFyYW1zIiwgImdldFNlbGYiLCAic2VsZiIsICJyZXNvbHZlU2NvcGVkIiwgImdldEJpbmRpbmciLCAiYXJnIiwgInNjb3BlIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJTaW5nbGV0b24iLCAiUmVxdWVzdCIsICJyZXF1ZXN0U2NvcGVDYWNoZSIsICJoYXMiLCAiaWQiLCAiZ2V0IiwgInNldCIsICJUcmFuc2llbnQiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAicmVzb2x2ZUZhY3RvcnlCaW5kaW5nIiwgImZhY3RvcnkiLCAicmVzb2x2ZVBvc3RDb25zdHJ1Y3QiLCAiaW5zdGFuY2UiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicG9zdENvbnN0cnVjdFJlc3VsdCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJyZXNvbHV0aW9uIiwgInRvU3RyaW5nIiwgImltcGxlbWVudGF0aW9uVHlwZSIsICJuYW1lIiwgImVycm9yIiwgImNhdXNlIiwgInJlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zIiwgInNldEluc3RhbmNlUHJvcGVydGllcyIsICJjb25zdHJ1Y3RvclZhbHVlcyIsICJub2RlIiwgInByb3BlcnRpZXNBc3NpZ25tZW50UmVzdWx0IiwgImNsYXNzTWV0YWRhdGEiLCAibGlmZWN5Y2xlIiwgInJlc29sdmVQcm92aWRlckJpbmRpbmciLCAicHJvdmlkZXIiLCAiZ2V0SW5zdGFuY2VOb2RlQmluZGluZyIsICJnZXRSZXNvbHZlZFZhbHVlTm9kZUJpbmRpbmciLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInByb3BlcnR5QXNzaWdubWVudFByb21pc2VzIiwgInByb3BlcnR5S2V5IiwgInByb3BlcnR5Tm9kZSIsICJwcm9wZXJ0eVBhcmFtcyIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJiaW5kaW5ncyIsICJwdXNoIiwgImxlbmd0aCIsICJQcm9taXNlIiwgImFsbCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicmVzb2x2ZUJpbmRpbmdOb2RlIiwgImlubmVyUmVzb2x2ZVNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgInJlc29sdmVkVmFsdWVzIiwgInJlZGlyZWN0aW9uIiwgInJlZGlyZWN0aW9ucyIsICJpc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMiLCAicmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcyIsICJjb25zdHJ1Y3RvclJlc29sdmVkVmFsdWVzIiwgImNvbnN0cnVjdG9yUGFyYW0iLCAiY29uc3RydWN0b3JQYXJhbXMiLCAidW5kZWZpbmVkIiwgInNvbWUiLCAicmVzb2x2ZVJlc29sdmVkVmFsdWVCaW5kaW5nTm9kZSIsICJyZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdQYXJhbXMiLCAicGFyYW1WYWx1ZXMiLCAicmVzb2x2ZWRQYXJhbVZhbHVlcyIsICJwYXJhbXNSZXNvbHZlZFZhbHVlcyIsICJwYXJhbSIsICJyZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgInJlc29sdmVCaW5kaW5nTm9kZSIsICJwYXJhbXMiLCAicGxhbkJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJDb25zdGFudFZhbHVlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJEeW5hbWljVmFsdWUiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAiRmFjdG9yeSIsICJyZXNvbHZlRmFjdG9yeUJpbmRpbmciLCAiSW5zdGFuY2UiLCAicmVzb2x2ZVNjb3BlZEluc3RhbmNlQmluZGluZ05vZGUiLCAiUHJvdmlkZXIiLCAicmVzb2x2ZVByb3ZpZGVyQmluZGluZyIsICJSZXNvbHZlZFZhbHVlIiwgInJlc29sdmVTY29wZWRSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUiLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgImJpbmRpbmdzIiwgIkFycmF5IiwgImlzQXJyYXkiLCAicmVzb2x2ZWRWYWx1ZXMiLCAiaXNQbGFuU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicHVzaCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAic29tZSIsICJpc1Byb21pc2UiLCAiUHJvbWlzZSIsICJhbGwiLCAibGVuZ3RoIiwgIkludmVyc2lmeUNvcmVFcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInJlc29sdXRpb24iLCAiaXNQbHVnaW4iLCAiU3ltYm9sIiwgImZvciIsICJQbHVnaW4iLCAiX2NvbnRhaW5lciIsICJfY29udGV4dCIsICJjb250YWluZXIiLCAiY29udGV4dCIsICJ0aGlzIiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvciIsICJFcnJvciIsICJraW5kIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJzdXBlciIsICJ0aGlzIiwgInZhbHVlIiwgImlzIiwgIkludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZCIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvcktpbmQiLCAiREVGQVVMVF9ERUZBVUxUX1NDT1BFIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJUcmFuc2llbnQiLCAiQ29udGFpbmVyUmVnaXN0cnkiLCAic2VydmljZU5hbWUiLCAiY29udGFpbmVyIiwgIkRJQ29udGFpbmVyRXJyb3IiLCAibGFtYmRhSWQiLCAiZGVmaW5pdGlvbiIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgImV4aXN0aW5nU2VydmljZSIsICJsYW1iZGFzIiwgInNlcnZpY2UiLCAiZXhpc3RlZCIsICJsYW1iZGFzVG9SZW1vdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgIlciLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIkNvbnRhaW5lclJlZ2lzdHJ5IiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgImxhbWJkYURlZiIsICJsYW1iZGFJZCIsICJlcnJvciIsICJoYW5kbGVyTmFtZSIsICJyZXF1aXJlZFNlcnZpY2VzIiwgInRpZUNsYXNzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJpbXBvcnRfdXRpbHMiLCAiTGFtYmRhUGlwZWxpbmUiLCAiY29uZmlnIiwgImNvbnRleHQiLCAibGFtYmRhSWQiLCAiY29udGFpbmVyIiwgImhhbmRsZXIiLCAiZXJyb3IiLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiTGFtYmRhSGFuZGxlckZhY3RvcnkiLCAibGFtYmRhRGVmaW5pdGlvbiIsICJzZXJ2aWNlc19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgIl9fcmVFeHBvcnQiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiaW1wb3J0X3V0aWxzIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgImJlZm9yZUluc3RhbmNlIiwgInNlcnZlckNvbmZpZyIsICJlbmhhbmNlbWVudHMiLCAicnVudGltZUNvcmVDb25maWciLCAiYnVpbGRDb25maWciLCAib3B0aW1pemF0aW9ucyIsICJvcHRpbWl6ZWRDb25maWciLCAiYmFzZVN0YWNrQ29uZmlnIiwgInJ1bnRpbWVTdGFja0NvbmZpZyIsICJjb25maWciLCAiZmVhdHVyZSIsICJmIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJfX3JlRXhwb3J0IiwgImluZGV4X2V4cG9ydHMiLCAic2VydmljZXNfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVEaSIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF91dGlscyIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVFeHRlbnNpb25zIiwgInNlcnZpY2VJZCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiUnVudGltZURpIiwgIl9fcmVFeHBvcnQiLCAiaW5kZXhfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyJdCn0K
|