@worktif/runtime 0.3.0-edge.12 → 0.3.0-edge.15
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 +32 -79
- package/out/dist/bin/purenow.js +12 -10
- package/out/dist/bin/templates/runtime-web/basic/package.json +1 -1
- package/out/dist/infra/index.js +43 -43
- package/out/dist/lambda/bundle.js +16 -16
- package/out/dist/lib/utils/decorators.d.ts +9 -0
- package/out/dist/lib/utils/index.d.ts +1 -0
- package/out/dist/src/bin/cli.d.ts +18 -0
- package/out/dist/src/bin/commands/dev-validation.service.d.ts +1 -0
- package/out/dist/src/bin/commands/index.d.ts +1 -0
- package/out/dist/src/bin/commands/init.d.ts +25 -0
- package/out/dist/src/bin/index.d.ts +1 -1
- package/out/dist/src/bin/runtime-web-cli.d.ts +4 -0
- package/out/dist/src/bin/services/runtime-web-cli-extensions.d.ts +18 -0
- package/out/dist/src/bin/services/template.service.d.ts +79 -33
- package/out/dist/src/bin/utils/command-metadata.d.ts +63 -0
- package/out/dist/src/bin/utils/errors.d.ts +35 -0
- package/out/dist/src/core/bundle/runtime.container.d.ts.map +1 -1
- package/out/dist/src/core/runtime-web/di/pure-container-factory.d.ts.map +1 -1
- package/out/dist/src/core/runtime-web/di/ties-registrar.d.ts.map +1 -1
- package/out/dist/src/core/runtime-web/factory/lambda-handler-factory.d.ts.map +1 -1
- package/out/dist/src/core/runtime-web/registrar/microservice-registrar.d.ts.map +1 -1
- package/out/dist/src/core/services/runtime-extensions/runtime-extensions.service.d.ts.map +1 -1
- package/out/dist/src/infra/purenow-infra-stack.d.ts +10 -0
- package/out/dist/src/infra/utils/infra-outputs-resolver.d.ts +17 -0
- package/out/dist/src/infra/utils/stack-existence-detector.d.ts +17 -0
- package/out/dist/src/infra/utils/stack-name-sanitizer.d.ts +9 -0
- package/out/dist/src/utils/decorators.d.ts +9 -0
- package/out/dist/src/utils/decorators.d.ts.map +1 -0
- package/out/dist/src/utils/index.d.ts +1 -0
- package/out/dist/src/utils/index.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1,41 +1,41 @@
|
|
|
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.
|
|
1
|
+
"use strict";var Vn=Object.create;var we=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var zn=Object.getOwnPropertyNames;var Wn=Object.getPrototypeOf,Hn=Object.prototype.hasOwnProperty;var qn=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),$e=(t,e)=>{for(var n in e)we(t,n,{get:e[n],enumerable:!0})},Ae=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of zn(e))!Hn.call(t,r)&&r!==n&&we(t,r,{get:()=>e[r],enumerable:!(i=Rt(e,r))||i.enumerable});return t},A=(t,e,n)=>(Ae(t,e,"default"),n&&Ae(n,e,"default")),de=(t,e,n)=>(n=t!=null?Vn(Wn(t)):{},Ae(e||!t||!t.__esModule?we(n,"default",{value:t,enumerable:!0}):n,t)),Gn=t=>Ae(we({},"__esModule",{value:!0}),t),$=(t,e,n,i)=>{for(var r=i>1?void 0:i?Rt(e,n):e,a=t.length-1,d;a>=0;a--)(d=t[a])&&(r=(i?d(e,n,r):d(r))||r);return i&&r&&we(e,n,r),r};var Q=qn(()=>{var xt;(function(t){(function(e){var n=typeof globalThis=="object"?globalThis:typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:f(),i=r(t);typeof n.Reflect<"u"&&(i=r(n.Reflect,i)),e(i,n),typeof n.Reflect>"u"&&(n.Reflect=t);function r(y,m){return function(b,S){Object.defineProperty(y,b,{configurable:!0,writable:!0,value:S}),m&&m(b,S)}}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,n){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 Fe(Object.create(null))}:y?function(){return Fe({__proto__:null})}:function(){return Fe({})},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]}},S=Object.getPrototypeOf(Function),R=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:jn(),k=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:Ln(),N=typeof WeakMap=="function"?WeakMap:Fn(),x=r?Symbol.for("@reflect-metadata:registry"):void 0,G=On(),C=Nn(G);function H(o,s,c,u){if(w(c)){if(!bt(o))throw new TypeError;if(!wt(s))throw new TypeError;return An(o,s)}else{if(!bt(o))throw new TypeError;if(!D(s))throw new TypeError;if(!D(u)&&!w(u)&&!le(u))throw new TypeError;return le(u)&&(u=void 0),c=K(c),Rn(o,s,c,u)}}e("decorate",H);function ce(o,s){function c(u,p){if(!D(u))throw new TypeError;if(!w(p)&&!Bn(p))throw new TypeError;gt(o,s,u,p)}return c}e("metadata",ce);function pe(o,s,c,u){if(!D(c))throw new TypeError;return w(u)||(u=K(u)),gt(o,s,c,u)}e("defineMetadata",pe);function ye(o,s,c){if(!D(s))throw new TypeError;return w(c)||(c=K(c)),lt(o,s,c)}e("hasMetadata",ye);function wn(o,s,c){if(!D(s))throw new TypeError;return w(c)||(c=K(c)),Pe(o,s,c)}e("hasOwnMetadata",wn);function Sn(o,s,c){if(!D(s))throw new TypeError;return w(c)||(c=K(c)),ft(o,s,c)}e("getMetadata",Sn);function In(o,s,c){if(!D(s))throw new TypeError;return w(c)||(c=K(c)),ht(o,s,c)}e("getOwnMetadata",In);function Cn(o,s){if(!D(o))throw new TypeError;return w(s)||(s=K(s)),vt(o,s)}e("getMetadataKeys",Cn);function Mn(o,s){if(!D(o))throw new TypeError;return w(s)||(s=K(s)),mt(o,s)}e("getOwnMetadataKeys",Mn);function kn(o,s,c){if(!D(s))throw new TypeError;if(w(c)||(c=K(c)),!D(s))throw new TypeError;w(c)||(c=K(c));var u=be(s,c,!1);return w(u)?!1:u.OrdinaryDeleteMetadata(o,s,c)}e("deleteMetadata",kn);function An(o,s){for(var c=o.length-1;c>=0;--c){var u=o[c],p=u(s);if(!w(p)&&!le(p)){if(!wt(p))throw new TypeError;s=p}}return s}function Rn(o,s,c,u){for(var p=o.length-1;p>=0;--p){var T=o[p],P=T(s,c,u);if(!w(P)&&!le(P)){if(!D(P))throw new TypeError;u=P}}return u}function lt(o,s,c){var u=Pe(o,s,c);if(u)return!0;var p=Le(s);return le(p)?!1:lt(o,p,c)}function Pe(o,s,c){var u=be(s,c,!1);return w(u)?!1:yt(u.OrdinaryHasOwnMetadata(o,s,c))}function ft(o,s,c){var u=Pe(o,s,c);if(u)return ht(o,s,c);var p=Le(s);if(!le(p))return ft(o,p,c)}function ht(o,s,c){var u=be(s,c,!1);if(!w(u))return u.OrdinaryGetOwnMetadata(o,s,c)}function gt(o,s,c,u){var p=be(c,u,!0);p.OrdinaryDefineOwnMetadata(o,s,c,u)}function vt(o,s){var c=mt(o,s),u=Le(o);if(u===null)return c;var p=vt(u,s);if(p.length<=0)return c;if(c.length<=0)return p;for(var T=new k,P=[],I=0,l=c;I<l.length;I++){var h=l[I],g=T.has(h);g||(T.add(h),P.push(h))}for(var v=0,M=p;v<M.length;v++){var h=M[v],g=T.has(h);g||(T.add(h),P.push(h))}return P}function mt(o,s){var c=be(o,s,!1);return c?c.OrdinaryOwnMetadataKeys(o,s):[]}function pt(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 xn(o){return typeof o=="symbol"}function D(o){return typeof o=="object"?o!==null:typeof o=="function"}function En(o,s){switch(pt(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=St(o,a);if(u!==void 0){var p=u.call(o,c);if(D(p))throw new TypeError;return p}return Dn(o,c==="default"?"number":c)}function Dn(o,s){if(s==="string"){var c=o.toString;if(fe(c)){var u=c.call(o);if(!D(u))return u}var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!D(u))return u}}else{var p=o.valueOf;if(fe(p)){var u=p.call(o);if(!D(u))return u}var T=o.toString;if(fe(T)){var u=T.call(o);if(!D(u))return u}}throw new TypeError}function yt(o){return!!o}function Tn(o){return""+o}function K(o){var s=En(o,3);return xn(s)?s:Tn(s)}function bt(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 wt(o){return typeof o=="function"}function Bn(o){switch(pt(o)){case 3:return!0;case 4:return!0;default:return!1}}function je(o,s){return o===s||o!==o&&s!==s}function St(o,s){var c=o[s];if(c!=null){if(!fe(c))throw new TypeError;return c}}function It(o){var s=St(o,d);if(!fe(s))throw new TypeError;var c=s.call(o);if(!D(c))throw new TypeError;return c}function Ct(o){return o.value}function Mt(o){var s=o.next();return s.done?!1:s}function kt(o){var s=o.return;s&&s.call(o)}function Le(o){var s=Object.getPrototypeOf(o);if(typeof o!="function"||o===S||s!==S)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;!w(x)&&typeof n.Reflect<"u"&&!(x in n.Reflect)&&typeof n.Reflect.defineMetadata=="function"&&(o=Pn(n.Reflect));var s,c,u,p=new N,T={registerProvider:P,getProvider:l,setProvider:g};return T;function P(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 k),u.add(v);break}}function I(v,M){if(!w(s)){if(s.isProviderFor(v,M))return s;if(!w(c)){if(c.isProviderFor(v,M))return s;if(!w(u))for(var E=It(u);;){var B=Mt(E);if(!B)return;var q=Ct(B);if(q.isProviderFor(v,M))return kt(E),q}}}if(!w(o)&&o.isProviderFor(v,M))return o}function l(v,M){var E=p.get(v),B;return w(E)||(B=E.get(M)),w(B)&&(B=I(v,M),w(B)||(w(E)&&(E=new R,p.set(v,E)),E.set(M,B))),B}function h(v){if(w(v))throw new TypeError;return s===v||c===v||!w(u)&&u.has(v)}function g(v,M,E){if(!h(E))throw new Error("Metadata provider not registered.");var B=l(v,M);if(B!==E){if(!w(B))return!1;var q=p.get(v);w(q)&&(q=new R,p.set(v,q)),q.set(M,E)}return!0}}function On(){var o;return!w(x)&&D(n.Reflect)&&Object.isExtensible(n.Reflect)&&(o=n.Reflect[x]),w(o)&&(o=_n()),!w(x)&&D(n.Reflect)&&Object.isExtensible(n.Reflect)&&Object.defineProperty(n.Reflect,x,{enumerable:!1,configurable:!1,writable:!1,value:o}),o}function Nn(o){var s=new N,c={isProviderFor:function(h,g){var v=s.get(h);return w(v)?!1:v.has(g)},OrdinaryDefineOwnMetadata:P,OrdinaryHasOwnMetadata:p,OrdinaryGetOwnMetadata:T,OrdinaryOwnMetadataKeys:I,OrdinaryDeleteMetadata:l};return G.registerProvider(c),c;function u(h,g,v){var M=s.get(h),E=!1;if(w(M)){if(!v)return;M=new R,s.set(h,M),E=!0}var B=M.get(g);if(w(B)){if(!v)return;if(B=new R,M.set(g,B),!o.setProvider(h,g,c))throw M.delete(g),E&&s.delete(h),new Error("Wrong provider for target.")}return B}function p(h,g,v){var M=u(g,v,!1);return w(M)?!1:yt(M.has(h))}function T(h,g,v){var M=u(g,v,!1);if(!w(M))return M.get(h)}function P(h,g,v,M){var E=u(v,M,!0);E.set(h,g)}function I(h,g){var v=[],M=u(h,g,!1);if(w(M))return v;for(var E=M.keys(),B=It(E),q=0;;){var At=Mt(B);if(!At)return v.length=q,v;var $n=Ct(At);try{v[q]=$n}catch(Un){try{kt(B)}finally{throw Un}}q++}}function l(h,g,v){var M=u(g,v,!1);if(w(M)||!M.delete(h))return!1;if(M.size===0){var E=s.get(g);w(E)||(E.delete(v),E.size===0&&s.delete(E))}return!0}}function Pn(o){var s=o.defineMetadata,c=o.hasOwnMetadata,u=o.getOwnMetadata,p=o.getOwnMetadataKeys,T=o.deleteMetadata,P=new N,I={isProviderFor:function(l,h){var g=P.get(l);return!w(g)&&g.has(h)?!0:p(l,h).length?(w(g)&&(g=new k,P.set(l,g)),g.add(h),!0):!1},OrdinaryDefineOwnMetadata:s,OrdinaryHasOwnMetadata:c,OrdinaryGetOwnMetadata:u,OrdinaryOwnMetadataKeys:p,OrdinaryDeleteMetadata:T};return I}function be(o,s,c){var u=G.getProvider(o,s);if(!w(u))return u;if(c){if(G.setProvider(o,s,C))return C;throw new Error("Illegal state.")}}function jn(){var o={},s=[],c=(function(){function I(l,h,g){this._index=0,this._keys=l,this._values=h,this._selector=g}return I.prototype["@@iterator"]=function(){return this},I.prototype[d]=function(){return this},I.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}},I.prototype.throw=function(l){throw this._index>=0&&(this._index=-1,this._keys=s,this._values=s),l},I.prototype.return=function(l){return this._index>=0&&(this._index=-1,this._keys=s,this._values=s),{value:l,done:!0}},I})(),u=(function(){function I(){this._keys=[],this._values=[],this._cacheKey=o,this._cacheIndex=-2}return Object.defineProperty(I.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),I.prototype.has=function(l){return this._find(l,!1)>=0},I.prototype.get=function(l){var h=this._find(l,!1);return h>=0?this._values[h]:void 0},I.prototype.set=function(l,h){var g=this._find(l,!0);return this._values[g]=h,this},I.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--,je(l,this._cacheKey)&&(this._cacheKey=o,this._cacheIndex=-2),!0}return!1},I.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=o,this._cacheIndex=-2},I.prototype.keys=function(){return new c(this._keys,this._values,p)},I.prototype.values=function(){return new c(this._keys,this._values,T)},I.prototype.entries=function(){return new c(this._keys,this._values,P)},I.prototype["@@iterator"]=function(){return this.entries()},I.prototype[d]=function(){return this.entries()},I.prototype._find=function(l,h){if(!je(this._cacheKey,l)){this._cacheIndex=-1;for(var g=0;g<this._keys.length;g++)if(je(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},I})();return u;function p(I,l){return I}function T(I,l){return l}function P(I,l){return[I,l]}}function Ln(){var o=(function(){function s(){this._map=new R}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 Fn(){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@@"+I();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 P(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 I(){var l=P(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 Fe(o){return o.__=void 0,delete o.__,o}})})(xt||(xt={}))});var j={};$e(j,{ContainerRegistry:()=>oe,DIContainerError:()=>Z,LambdaHandlerFactory:()=>re,LambdaPipeline:()=>dt,MicroserviceRegistrar:()=>se,MissingServiceError:()=>J,PureContainerFactory:()=>ie,RuntimeContainer:()=>me,RuntimeDetector:()=>De,RuntimeDi:()=>ut,RuntimeExtensions:()=>ae,RuntimeWebLambdaHandler:()=>ve,TiesRegistrar:()=>ne,TiesRegistrationError:()=>te,errorWrapper:()=>st,fullWrapper:()=>Ne,getBrowserMetadata:()=>Re,getCDKMetadata:()=>Ee,getLambdaMetadata:()=>xe,loggingWrapper:()=>ot,timingWrapper:()=>at});module.exports=Gn(j);A(j,require("@worktif/purenow/lambda"),module.exports);function Re(){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(t){throw new Error(`Failed to collect browser metadata: ${t instanceof Error?t.message:"Unknown error"}`)}}function xe(){try{let t=process.env.AWS_LAMBDA_FUNCTION_NAME;if(!t)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:t,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(t){throw new Error(`Failed to collect Lambda metadata: ${t instanceof Error?t.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(t){throw new Error(`Failed to collect CDK metadata: ${t instanceof Error?t.message:"Unknown error"}`)}}var De=class{detect(){if(this.isBrowser())return{type:"browser",metadata:Re()};if(this.isLambda())return{type:"lambda",metadata:xe()};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 ur=de(Q(),1);function L(t){return(typeof t=="object"&&t!==null||typeof t=="function")&&typeof t.then=="function"}function z(t){switch(typeof t){case"string":case"symbol":return t.toString();case"function":return t.name;default:throw new Error(`Unexpected ${typeof t} service id type`)}}var Ue=Symbol.for("@inversifyjs/common/islazyServiceIdentifier"),Y=class{[Ue];#e;constructor(e){this.#e=e,this[Ue]=!0}static is(e){return typeof e=="object"&&e!==null&&e[Ue]===!0}unwrap(){return this.#e()}};var Wi=de(Q(),1);function ee(t,e,n){return Reflect.getOwnMetadata(e,t,n)}function Te(t,e,n,i){Reflect.defineMetadata(e,n,t,i)}function Se(t,e,n,i,r){let a=i(ee(t,e,r)??n());Reflect.defineMetadata(e,a,t,r)}var Ve="@inversifyjs/container/bindingId";function zt(){let t=ee(Object,Ve)??0;return t===Number.MAX_SAFE_INTEGER?Te(Object,Ve,Number.MIN_SAFE_INTEGER):Se(Object,Ve,()=>t,e=>e+1),t}var he={Request:"Request",Singleton:"Singleton",Transient:"Transient"},F={ConstantValue:"ConstantValue",DynamicValue:"DynamicValue",Factory:"Factory",Instance:"Instance",Provider:"Provider",ResolvedValue:"ResolvedValue",ServiceRedirection:"ServiceRedirection"};var Et;(function(t){t.moduleId="moduleId",t.serviceId="serviceId"})(Et||(Et={}));var Je="@inversifyjs/core/classMetadataReflectKey";function Qe(){return{constructorArguments:[],lifecycle:{postConstructMethodName:void 0,preDestroyMethodName:void 0},properties:new Map,scope:void 0}}var Kn="@inversifyjs/core/pendingClassMetadataCountReflectKey",ze=Symbol.for("@inversifyjs/core/InversifyCoreError"),_=class t extends Error{[ze];kind;constructor(e,n,i){super(n,i),this[ze]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[ze]===!0}static isErrorOfKind(e,n){return t.is(e)&&e.kind===n}},O,Ie,Dt,Tt,U;function Wt(t){let e=ee(t,Je)??Qe();if(!(function(n){let i=ee(n,Kn);return i!==void 0&&i!==0})(t))return(function(n,i){let r=[];if(i.length<n.length)throw new _(O.missingInjectionDecorator,`Found unexpected missing metadata on type "${n.name}". "${n.name}" constructor requires at least ${n.length.toString()} arguments, found ${i.length.toString()} instead.
|
|
2
2
|
Are you using @inject, @multiInject or @unmanaged decorators in every non optional constructor argument?
|
|
3
3
|
|
|
4
|
-
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`);for(let a=0;a<i.length;++a)i[a]===void 0&&r.push(a);if(r.length>0)throw new
|
|
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 _(O.missingInjectionDecorator,`Found unexpected missing metadata on type "${n.name}" at constructor indexes "${r.join('", "')}".
|
|
5
5
|
|
|
6
6
|
Are you using @inject, @multiInject or @unmanaged decorators at those indexes?
|
|
7
7
|
|
|
8
|
-
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`)})(
|
|
9
|
-
Every constructor parameter must be decorated either with @inject, @multiInject or @unmanaged decorator.`)}for(let[a,d]of i.properties)d.kind===
|
|
10
|
-
This property must be decorated either with @inject or @multiInject decorator.`);throw r.length===0?new
|
|
8
|
+
If you're using typescript and want to rely on auto injection, set "emitDecoratorMetadata" compiler option to true`)})(t,e.constructorArguments),e;(function(n,i){let r=[];for(let a=0;a<i.constructorArguments.length;++a){let d=i.constructorArguments[a];d!==void 0&&d.kind!==Ie.unknown||r.push(` - Missing or incomplete metadata for type "${n.name}" at constructor argument with index ${a.toString()}.
|
|
9
|
+
Every constructor parameter must be decorated either with @inject, @multiInject or @unmanaged decorator.`)}for(let[a,d]of i.properties)d.kind===Ie.unknown&&r.push(` - Missing or incomplete metadata for type "${n.name}" at property "${a.toString()}".
|
|
10
|
+
This property must be decorated either with @inject or @multiInject decorator.`);throw r.length===0?new _(O.unknown,`Unexpected class metadata for type "${n.name}" with uncompletion traces.
|
|
11
11
|
This might be caused by one of the following reasons:
|
|
12
12
|
|
|
13
13
|
1. A third party library is targeting inversify reflection metadata.
|
|
14
|
-
2. A bug is causing the issue. Consider submiting an issue to fix it.`):new
|
|
14
|
+
2. A bug is causing the issue. Consider submiting an issue to fix it.`):new _(O.missingInjectionDecorator,`Invalid class metadata at type ${n.name}:
|
|
15
15
|
|
|
16
16
|
${r.join(`
|
|
17
17
|
|
|
18
|
-
`)}`)})(
|
|
18
|
+
`)}`)})(t,e)}function Xn(t,e){let n=Wt(e).scope??t.scope;return{cache:{isRight:!1,value:void 0},id:zt(),implementationType:e,isSatisfiedBy:()=>!0,moduleId:void 0,onActivation:void 0,onDeactivation:void 0,scope:n,serviceIdentifier:e,type:F.Instance}}(function(t){t[t.injectionDecoratorConflict=0]="injectionDecoratorConflict",t[t.missingInjectionDecorator=1]="missingInjectionDecorator",t[t.planning=2]="planning",t[t.resolution=3]="resolution",t[t.unknown=4]="unknown"})(O||(O={})),(function(t){t[t.unknown=32]="unknown"})(Ie||(Ie={})),(function(t){t.id="id",t.moduleId="moduleId",t.serviceId="serviceId"})(Dt||(Dt={}));(function(t){t.moduleId="moduleId",t.serviceId="serviceId"})(Tt||(Tt={}));function Ht(t,e){return(...n)=>i=>{if(i===void 0)return t(...n);if(i.kind===U.unmanaged)throw new _(O.injectionDecoratorConflict,"Unexpected injection found. Multiple @inject, @multiInject or @unmanaged decorators found");return e(i,...n)}}function qt(t){if(t.kind!==Ie.unknown&&t.isFromTypescriptParamType!==!0)throw new _(O.injectionDecoratorConflict,"Unexpected injection found. Multiple @inject, @multiInject or @unmanaged decorators found")}(function(t){t[t.multipleInjection=0]="multipleInjection",t[t.singleInjection=1]="singleInjection",t[t.unmanaged=2]="unmanaged"})(U||(U={}));var Ti=Ht(function(t,e,n){return t===U.multipleInjection?{chained:n?.chained??!1,kind:t,name:void 0,optional:!1,tags:new Map,value:e}:{kind:t,name:void 0,optional:!1,tags:new Map,value:e}},function(t,e,n,i){return qt(t),e===U.multipleInjection?{...t,chained:i?.chained??!1,kind:e,value:n}:{...t,kind:e,value:n}});var Bt;(function(t){t[t.method=0]="method",t[t.parameter=1]="parameter",t[t.property=2]="property"})(Bt||(Bt={}));var _t="@inversifyjs/core/classIsInjectableFlagReflectKey",Zn=[Array,BigInt,Boolean,Function,Number,Object,String];function Jn(t){let e=ee(t,"design:paramtypes");e!==void 0&&Se(t,Je,Qe,(function(n){return i=>(n.forEach((r,a)=>{var d;i.constructorArguments[a]!==void 0||(d=r,Zn.includes(d))||(i.constructorArguments[a]=(function(f){return{isFromTypescriptParamType:!0,kind:U.singleInjection,name:void 0,optional:!1,tags:new Map,value:f}})(r))}),i)})(e))}function ke(t){return e=>{(function(n){if(ee(n,_t)!==void 0)throw new _(O.injectionDecoratorConflict,`Cannot apply @injectable decorator multiple times at class "${n.name}"`);Te(n,_t,!0)})(e),Jn(e),t!==void 0&&Se(e,Je,Qe,n=>({...n,scope:t}))}}function Ot(){return{kind:U.unmanaged}}var Bi=Ht(Ot,function(t){if(qt(t),(function(e){return e.name!==void 0||e.optional||e.tags.size>0})(t))throw new _(O.injectionDecoratorConflict,"Unexpected injection found. Found @unmanaged injection with additional @named, @optional, @tagged or @targetName injections");return Ot()});var ue;(function(t){t[t.multipleInjection=0]="multipleInjection",t[t.singleInjection=1]="singleInjection"})(ue||(ue={}));var We=Symbol.for("@inversifyjs/core/LazyPlanServiceNode"),Ce=class{[We];_serviceIdentifier;_serviceNode;constructor(e,n){this[We]=!0,this._serviceNode=e,this._serviceIdentifier=n}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[We]===!0}invalidate(){this._serviceNode=void 0}isExpanded(){return this._serviceNode!==void 0}_getNode(){return this._serviceNode===void 0&&(this._serviceNode=this._buildPlanServiceNode()),this._serviceNode}},Me=class t{#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 t(this.#e.previous)}};function Ye(t,e,n){let i=n?.customServiceIdentifier??e.serviceIdentifier,r=(n?.chained===!0?[...t.operations.getBindingsChained(i)]:[...t.operations.getBindings(i)??[]]).filter(a=>a.isSatisfiedBy(e));if(r.length===0&&t.autobindOptions!==void 0&&typeof i=="function"){let a=Xn(t.autobindOptions,i);t.operations.setBinding(a),a.isSatisfiedBy(e)&&r.push(a)}return r}function ge(t){return t.redirections!==void 0}function Gt(t,e,n,i){let r=n.elem.serviceIdentifier,a=n.previous?.elem.serviceIdentifier;Array.isArray(t)?(function(d,f,y,m,b,S){if(d.length!==0){let R=S[S.length-1]??y,k=`Ambiguous bindings found for service: "${z(R)}".${Zt(S)}
|
|
19
19
|
|
|
20
20
|
Registered bindings:
|
|
21
21
|
|
|
22
|
-
${d.map(
|
|
22
|
+
${d.map(N=>(function(x){switch(x.type){case F.Instance:return`[ type: "${x.type}", serviceIdentifier: "${z(x.serviceIdentifier)}", scope: "${x.scope}", implementationType: "${x.implementationType.name}" ]`;case F.ServiceRedirection:return`[ type: "${x.type}", serviceIdentifier: "${z(x.serviceIdentifier)}", redirection: "${z(x.targetServiceIdentifier)}" ]`;default:return`[ type: "${x.type}", serviceIdentifier: "${z(x.serviceIdentifier)}", scope: "${x.scope}" ]`}})(N.binding)).join(`
|
|
23
23
|
`)}
|
|
24
24
|
|
|
25
|
-
Trying to resolve bindings for "${
|
|
25
|
+
Trying to resolve bindings for "${Kt(y,m)}".${Xt(b)}`;throw new _(O.planning,k)}f||Nt(y,m,b,S)})(t,e,r,a,n.elem,i):(function(d,f,y,m,b,S){d!==void 0||f||Nt(y,m,b,S)})(t,e,r,a,n.elem,i)}function Nt(t,e,n,i){let r=i[i.length-1]??t,a=`No bindings found for service: "${z(r)}".
|
|
26
26
|
|
|
27
|
-
Trying to resolve bindings for "${
|
|
27
|
+
Trying to resolve bindings for "${Kt(t,e)}".${Zt(i)}${Xt(n)}`;throw new _(O.planning,a)}function Kt(t,e){return e===void 0?`${z(t)} (Root service)`:z(e)}function Xt(t){let e=t.tags.size===0?"":`
|
|
28
28
|
- tags:
|
|
29
|
-
- ${[...
|
|
29
|
+
- ${[...t.tags.keys()].map(n=>n.toString()).join(`
|
|
30
30
|
- `)}`;return`
|
|
31
31
|
|
|
32
32
|
Binding constraints:
|
|
33
|
-
- service identifier: ${
|
|
34
|
-
- name: ${
|
|
33
|
+
- service identifier: ${z(t.serviceIdentifier)}
|
|
34
|
+
- name: ${t.name?.toString()??"-"}${e}`}function Zt(t){return t.length===0?"":`
|
|
35
35
|
|
|
36
36
|
- service redirections:
|
|
37
|
-
- ${
|
|
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")});
|
|
37
|
+
- ${t.map(e=>z(e)).join(`
|
|
38
|
+
- `)}`}function Jt(t,e,n,i){if(t.redirections.length===1){let[r]=t.redirections;return void(ge(r)&&Jt(r,e,n,[...i,r.binding.targetServiceIdentifier]))}Gt(t.redirections,e,n,i)}function Qt(t,e,n){if(Array.isArray(t.bindings)&&t.bindings.length===1){let[i]=t.bindings;return void(ge(i)&&Jt(i,e,n,[i.binding.targetServiceIdentifier]))}Gt(t.bindings,e,n,[])}function _e(t){return Y.is(t)?t.unwrap():t}function Yt(t){return(e,n,i)=>{let r=_e(i.value),a=n.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Me(a.last),f=i.kind===U.multipleInjection&&i.chained,y=Ye(e,d,{chained:f}),m=[],b={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...t(e,a,y,b,f)),b.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===U.singleInjection){Qt(b,i.optional,a.last);let[S]=m;b.bindings=S}return b}}function en(t){return(e,n,i)=>{let r=_e(i.value),a=n.concat({getAncestorsCalled:!1,name:i.name,serviceIdentifier:r,tags:i.tags}),d=new Me(a.last),f=i.kind===ue.multipleInjection&&i.chained,y=Ye(e,d,{chained:f}),m=[],b={bindings:m,isContextFree:!0,serviceIdentifier:r};if(m.push(...t(e,a,y,b,f)),b.isContextFree=!a.last.elem.getAncestorsCalled,i.kind===ue.singleInjection){Qt(b,i.optional,a.last);let[S]=m;b.bindings=S}return b}}function tn(t){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)}})(t),n=(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)}})(t),i=(a,d,f,y,m)=>{let b=ge(y)?y.binding.targetServiceIdentifier:y.serviceIdentifier;a.servicesBranch.push(b);let S=[];for(let R of f)switch(R.type){case F.Instance:S.push(e(a,R,d));break;case F.ResolvedValue:S.push(n(a,R,d));break;case F.ServiceRedirection:{let k=r(a,d,R,m);S.push(k);break}default:S.push({binding:R})}return a.servicesBranch.pop(),S},r=(function(a){return(d,f,y,m)=>{let b={binding:y,redirections:[]},S=Ye(d,new Me(f.last),{chained:m,customServiceIdentifier:y.targetServiceIdentifier});return b.redirections.push(...a(d,f,S,b,m)),b}})(i);return i}function Pt(t,e,n,i){if(t!==void 0&&(Ce.is(n)&&!n.isExpanded()||n.isContextFree)){let r={tree:{root:n}};e.setPlan(t,r)}else e.setNonCachedServiceNode(n,i)}var He=class extends Ce{#e;#t;#n;#i;constructor(e,n,i,r,a){super(a,_e(r.value)),this.#t=n,this.#e=e,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}},qe=class extends Ce{#e;#t;#n;#i;constructor(e,n,i,r,a){super(a,_e(r.value)),this.#e=e,this.#t=n,this.#n=i,this.#i=r}_buildPlanServiceNode(){return this.#t(this.#e,this.#n,this.#i)}};function nn(t,e,n,i){let r=(function(d,f){let y=(function(m,b){return(S,R,k)=>{if(k.kind===U.unmanaged)return;let N=(function(C){let H;if(C.tags.size===0)H=void 0;else{if(C.tags.size!==1)return;{let[pe,ye]=C.tags.entries().next().value;H={key:pe,value:ye}}}let ce=Y.is(C.value)?C.value.unwrap():C.value;return C.kind===U.multipleInjection?{chained:C.chained,isMultiple:!0,name:C.name,optional:C.optional,serviceIdentifier:ce,tag:H}:{isMultiple:!1,name:C.name,optional:C.optional,serviceIdentifier:ce,tag:H}})(k);if(N!==void 0){let C=S.operations.getPlan(N);if(C!==void 0&&C.tree.root.isContextFree)return C.tree.root}let x=b(S,R,k),G=new He(S,m,R,k,x);return Pt(N,S.operations,G,{bindingConstraintsList:R,chainedBindings:k.kind===U.multipleInjection&&k.chained,optionalBindings:k.optional}),G}})(d,f);return(m,b,S)=>{let R=b.classMetadata;for(let[k,N]of R.constructorArguments.entries())b.constructorParams[k]=y(m,S,N);for(let[k,N]of R.properties){let x=y(m,S,N);x!==void 0&&b.propertyParams.set(k,x)}return m.node}})(t,n),a=(function(d,f){let y=(function(m,b){return(S,R,k)=>{let N=(function(C){let H;if(C.tags.size===0)H=void 0;else{if(C.tags.size!==1)return;{let[pe,ye]=C.tags.entries().next().value;H={key:pe,value:ye}}}let ce=Y.is(C.value)?C.value.unwrap():C.value;return C.kind===ue.multipleInjection?{chained:C.chained,isMultiple:!0,name:C.name,optional:C.optional,serviceIdentifier:ce,tag:H}:{isMultiple:!1,name:C.name,optional:C.optional,serviceIdentifier:ce,tag:H}})(k);if(N!==void 0){let C=S.operations.getPlan(N);if(C!==void 0&&C.tree.root.isContextFree)return C.tree.root}let x=b(S,R,k),G=new qe(S,m,R,k,x);return Pt(N,S.operations,G,{bindingConstraintsList:R,chainedBindings:k.kind===ue.multipleInjection&&k.chained,optionalBindings:k.optional}),G}})(d,f);return(m,b,S)=>{let R=b.binding.metadata;for(let[k,N]of R.arguments.entries())b.params[k]=y(m,S,N);return m.node}})(e,i);return(d,f)=>d.node.binding.type===F.Instance?r(d,d.node,f):a(d,d.node,f)}var Ge=Yt(rn),Ke=en(rn),Qn=tn(nn(Ge,Ke,Ge,Ke));function rn(t,e,n,i,r){return Qn(t,e,n,i,r)}var Xe;(function(t){t.bindingAdded="bindingAdded",t.bindingRemoved="bindingRemoved"})(Xe||(Xe={}));var on=tn(nn(Ge,Ke,function(t,e,n){return Yn(t,e,n)},function(t,e,n){return ei(t,e,n)})),Yn=(function(t){let e=Yt(t);return(n,i,r)=>{try{return e(n,i,r)}catch(a){if(_.isErrorOfKind(a,O.planning))return;throw a}}})(on),ei=(function(t){let e=en(t);return(n,i,r)=>{try{return e(n,i,r)}catch(a){if(_.isErrorOfKind(a,O.planning))return;throw a}}})(on);function sn(t,e){return L(e)?(t.cache={isRight:!0,value:e},e.then(n=>jt(t,n))):jt(t,e)}function jt(t,e){return t.cache={isRight:!0,value:e},e}function ti(t,e,n){let i=t.getActivations(e);return i===void 0?n:L(n)?Lt(t,n,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(L(m))return Lt(r,m,d);f=m,y=d.next()}return f})(t,n,i[Symbol.iterator]())}async function Lt(t,e,n){let i=await e,r=n.next();for(;r.done!==!0;)i=await r.value(t.context,i),r=n.next();return i}function Be(t,e,n){let i=n;if(e.onActivation!==void 0){let r=e.onActivation;i=L(i)?i.then(a=>r(t.context,a)):r(t.context,i)}return ti(t,e.serviceIdentifier,i)}function et(t){return(e,n)=>n.cache.isRight?n.cache.value:sn(n,Be(e,n,t(e,n)))}var ni=et(function(t,e){return e.value});function ii(t){return t}function tt(t,e){return(n,i)=>{let r=t(i);switch(r.scope){case he.Singleton:return r.cache.isRight?r.cache.value:sn(r,Be(n,r,e(n,i)));case he.Request:{if(n.requestScopeCache.has(r.id))return n.requestScopeCache.get(r.id);let a=Be(n,r,e(n,i));return n.requestScopeCache.set(r.id,a),a}case he.Transient:return Be(n,r,e(n,i))}}}var ri=(t=>tt(ii,t))(function(t,e){return e.value(t.context)}),oi=et(function(t,e){return e.factory(t.context)});function Ft(t,e,n){let i=(function(r,a,d){if(d!==void 0){if(!(d in r))throw new _(O.resolution,`Expecting a "${d.toString()}" property when resolving "${a.implementationType.name}" class @postConstruct decorated method, none found.`);if(typeof r[d]!="function")throw new _(O.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 _(O.resolution,`Unexpected error found when calling "${d.toString()}" @postConstruct decorated method on class "${a.implementationType.name}"`,{cause:y})}if(L(f))return(async function(y,m,b){try{await b}catch(S){throw new _(O.resolution,`Unexpected error found when calling "${m.toString()}" @postConstruct decorated method on class "${y.implementationType.name}"`,{cause:S})}})(a,d,f)}}})(t,e,n);return L(i)?i.then(()=>t):t}function $t(t){return(e,n,i)=>{let r=new i.binding.implementationType(...e),a=t(n,r,i);return L(a)?a.then(()=>Ft(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)):Ft(r,i.binding,i.classMetadata.lifecycle.postConstructMethodName)}}var si=et(function(t,e){return e.provider(t.context)});function ai(t){return t.binding}function ci(t){return t.binding}var Ut=(function(t){return(e,n,i)=>{let r=[];for(let[a,d]of i.propertyParams){let f=i.classMetadata.properties.get(a);if(f===void 0)throw new _(O.resolution,`Expecting metadata at property "${a.toString()}", none found`);f.kind!==U.unmanaged&&d.bindings!==void 0&&(n[a]=t(e,d),L(n[a])&&r.push((async()=>{n[a]=await n[a]})()))}if(r.length>0)return Promise.all(r).then(()=>{})}})(nt),Vt=(function(t){return function e(n,i){let r=[];for(let a of i.redirections)ge(a)?r.push(...e(n,a)):r.push(t(n,a));return r}})(Ze),di=(function(t,e,n){return(i,r)=>{let a=t(i,r);return L(a)?e(a,i,r):n(a,i,r)}})((function(t){return(e,n)=>{let i=[];for(let r of n.constructorParams)r===void 0?i.push(void 0):i.push(t(e,r));return i.some(L)?Promise.all(i):i}})(nt),(function(t){return async(e,n,i)=>{let r=await e;return t(r,n,i)}})($t(Ut)),$t(Ut)),ui=(function(t){return(e,n)=>{let i=t(e,n);return L(i)?i.then(r=>n.binding.factory(...r)):n.binding.factory(...i)}})((function(t){return(e,n)=>{let i=[];for(let r of n.params)i.push(t(e,r));return i.some(L)?Promise.all(i):i}})(nt)),li=(t=>tt(ai,t))(di),fi=(t=>tt(ci,t))(ui);function Ze(t,e){switch(e.binding.type){case F.ConstantValue:return ni(t,e.binding);case F.DynamicValue:return ri(t,e.binding);case F.Factory:return oi(t,e.binding);case F.Instance:return li(t,e);case F.Provider:return si(t,e.binding);case F.ResolvedValue:return fi(t,e)}}function nt(t,e){if(e.bindings!==void 0)return Array.isArray(e.bindings)?(function(n,i){let r=[];for(let a of i)ge(a)?r.push(...Vt(n,a)):r.push(Ze(n,a));return r.some(L)?Promise.all(r):r})(t,e.bindings):(function(n,i){if(ge(i)){let r=Vt(n,i);if(r.length===1)return r[0];throw new _(O.resolution,"Unexpected multiple resolved values on single injection")}return Ze(n,i)})(t,e.bindings)}var cn=Symbol.for("@inversifyjs/plugin/isPlugin"),an=class{[cn]=!0;_container;_context;constructor(e,n){this._container=e,this._context=n}};var it=Symbol.for("@inversifyjs/container/InversifyContainerError"),dn=class t extends Error{[it];kind;constructor(e,n,i){super(n,i),this[it]=!0,this.kind=e}static is(e){return typeof e=="object"&&e!==null&&e[it]===!0}static isErrorOfKind(e,n){return t.is(e)&&e.kind===n}},un;(function(t){t[t.invalidOperation=0]="invalidOperation"})(un||(un={}));var Xi=he.Transient;function X(t){return function(e){return ke()(e),Reflect.defineMetadata("runtime:purable",!0,e),t?.singleton&&Reflect.defineMetadata("runtime:singleton",!0,e),t?.scope&&Reflect.defineMetadata("runtime:scope",t.scope,e),e}}var Z=class extends Error{constructor(e,n){super(`DI Container '${e}': ${n}`),this.name="DIContainerError",Error.captureStackTrace(this,this.constructor)}},te=class extends Error{constructor(e,n){super(`Ties registration failed for '${e}': ${n}`),this.name="TiesRegistrationError",Error.captureStackTrace(this,this.constructor)}},J=class extends Error{constructor(e,n){super(`Service '${e}' not found in container '${n}'`),this.name="MissingServiceError",Error.captureStackTrace(this,this.constructor)}};var ne=class{registerTies(e,n){for(let i of n)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,n){let i=[];for(let r of n)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 n=[];for(let i of e)try{let r=new i;if(typeof r.getServiceNames=="function"){let a=r.getServiceNames();Array.isArray(a)&&n.push(...a)}}catch{}return n}};ne=$([X()],ne);var rt=require("@worktif/utils");var ie=class{constructor(){this.tiesRegistrar=new ne}createMicroserviceContainer(e){try{let n=new rt.PureContainer({defaultScope:"Singleton"});return this.tiesRegistrar.registerTies(n,e),n}catch(n){throw new Z("microservice",`Failed to create microservice container: ${n instanceof Error?n.message:String(n)}`)}}createCustomContainer(e,n={}){try{let i=new rt.PureContainer(n);return this.tiesRegistrar.registerTies(i,e),i}catch(i){throw new Z("custom",`Failed to create custom container: ${i instanceof Error?i.message:String(i)}`)}}validateContainer(e,n){this.tiesRegistrar.validateContainer(e,n)}createValidatedContainer(e,n=[]){let i=this.createMicroserviceContainer(e),a=[...this.tiesRegistrar.extractServiceNames(e),...n];return a.length>0&&this.validateContainer(i,a),i}};ie=$([X()],ie);var mn=require("@worktif/utils");var Oe=require("@worktif/utils");function ot(t,e){let n=(0,Oe.logger)({serviceName:`@lambda/${e.service}/${e.id}`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{let a=Date.now(),d=ct(r);n.info("Lambda invocation started",{timestamp:new Date().toISOString(),awsRequestId:d.awsRequestId,functionName:d.functionName,functionVersion:d.functionVersion,memoryLimit:d.memoryLimitInMB,remainingTime:d.getRemainingTimeInMillis?.(),eventType:hn(i)});try{let f=await t(i,r),y=ln(a,d);return n.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=ln(a,d);throw n.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 st(t,e){let n=(0,Oe.logger)({serviceName:`@lambda/${e.service}/${e.id}/error-handler`,persistentLogAttributes:{lambdaId:e.id,service:e.service}});return async(i,r)=>{try{return await t(i,r)}catch(a){let d=ct(r),f=hi(a);if(n.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:hn(i)}),gi(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 at(t,e){let n=(0,Oe.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=ct(r);try{let y=await t(i,r),m=fn(a,d,f);return n.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=fn(a,d,f);throw n.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 Ne(t,e){return ot(st(at(t,e),e),e)}function ct(t){if(!t||typeof t!="object")return{};let e=t;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 ln(t,e){let n=Date.now();return{startTime:t,endTime:n,duration:n-t,remainingTime:e.getRemainingTimeInMillis?.()}}function fn(t,e,n){let i=Date.now(),r=process.memoryUsage();return{startTime:t,endTime:i,duration:i-t,memoryUsed:r.heapUsed-e.heapUsed,remainingTime:n.getRemainingTimeInMillis?.(),heapUsed:r.heapUsed,heapTotal:r.heapTotal,external:r.external}}function hi(t){return t instanceof Error?{message:t.message,type:t.constructor.name,stack:t.stack}:{message:String(t),type:"Unknown"}}function hn(t){if(!t||typeof t!="object")return"unknown";let e=t;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 gi(t){if(!t||typeof t!="object")return!1;let e=t;return!!(e.httpMethod||e.requestContext)}var gn=require("@worktif/utils"),vn=require("@worktif/purews"),ve=class extends vn.LambdaApi{constructor(n,i,r){super();this.definition=n;this.container=i;this.factory=r;this.logger=(0,gn.logger)({serviceName:"@core/runtime-web/factory/runtime-web-lambda-handler",persistentLogAttributes:{lambdaId:n.id,service:n.service}}),this.userHandler=this.createUserHandler(),this.logger.info("RuntimeWebLambdaHandler initialized",{lambdaId:n.id,service:n.service,dependencyCount:n.ties.length})}async handler(n,i){try{this.logger.debug("Handler invocation started",{eventType:typeof n,contextType:typeof i});let r=await this.userHandler(n,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 n=this.factory.injectDependencies(this.definition.ties,this.container);this.logger.debug("Dependencies resolved for user handler",{dependencyKeys:Object.keys(n)});let i=this.definition.handler(n),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(n){throw this.logger.error("Failed to create user handler",{error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),new Error(`Failed to create user handler for Lambda '${this.definition.id}': ${n instanceof Error?n.message:String(n)}`)}}getDefinition(){return this.definition}getContainer(){return this.container}isReady(){return this.userHandler!==void 0}};var re=class{constructor(){this.logger=(0,mn.logger)({serviceName:"@core/runtime-web/factory/lambda-handler-factory"})}create(e,n){return this.logger.info("Creating Lambda handler",{lambdaId:e.id,service:e.service,dependencyCount:e.ties.length}),new ve(e,n,this)}injectDependencies(e,n){let i={};for(let r of e)try{let a=r.name,d=n.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,n){return Ne(e,n)}toCamelCase(e){return e.charAt(0).toLowerCase()+e.slice(1)}};re=$([X()],re);var oe=class{constructor(){this.containers=new Map;this.lambdaToService=new Map;this.lambdaDefinitions=new Map}registerService(e,n){if(this.containers.has(e))throw new Z(e,`Service '${e}' is already registered. Use a different service name or clear the registry first.`);this.containers.set(e,n)}registerLambda(e,n,i){if(!this.containers.has(n))throw new J(n,"service containers");if(this.lambdaToService.has(e)){let r=this.lambdaToService.get(e);throw new Z(e,`Lambda '${e}' is already registered to service '${r}'. Use a different Lambda ID.`)}this.lambdaToService.set(e,n),this.lambdaDefinitions.set(e,i)}getContainer(e){let n=this.containers.get(e);if(!n)throw new J(e,"service containers");return n}getContainerForLambda(e){let n=this.getLambdaService(e);return this.getContainer(n)}getLambdaService(e){let n=this.lambdaToService.get(e);if(!n)throw new J(e,"lambda-to-service mapping");return n}getLambdaDefinition(e){let n=this.lambdaDefinitions.get(e);if(!n)throw new J(e,"lambda definitions");return n}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 n=[];for(let[i,r]of this.lambdaToService.entries())r===e&&n.push(i);return n}removeService(e){let n=this.containers.delete(e);if(n){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 n}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}}};oe=$([ke()],oe);var se=class{constructor(){this.containerFactory=new ie,this.registry=new oe}processService(e,n){try{let i=this.containerFactory.createMicroserviceContainer(n.ties);this.registry.registerService(e,i);for(let r of n.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,n){if(n.id)return`${e}.${n.id}`;let i=n.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,n){let i=new Set;for(let r of n.lambdas)for(let a of r.ties)i.add(a.name);this.containerFactory.validateContainer(e,Array.from(i))}};se=$([X()],se);var pn=require("@worktif/utils"),dt=class{constructor(){this.logger=(0,pn.logger)({serviceName:"@core/runtime-web/pipelines/lambda-pipeline"})}async execute(e,n){try{this.logger.info("Starting Lambda pipeline execution",{serviceName:e.serviceName,stage:e.stage,functionName:n.metadata.functionName,version:n.metadata.version,region:n.metadata.region,memoryLimit:n.metadata.memoryLimit,requestId:n.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:n.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 se;for(let[n,i]of Object.entries(e.register))this.logger.debug("Processing microservice",{serviceName:n,tiesCount:i.ties.length,lambdasCount:i.lambdas.length}),this.registrar.processService(n,i);this.logger.info("Microservice registrar initialized successfully",{serviceCount:Object.keys(e.register).length,totalLambdas:this.registrar.getLambdaIds().length})}catch(n){throw this.logger.error("Failed to initialize microservice registrar",{error:n instanceof Error?n.message:String(n)}),new Error(`Failed to initialize microservice registrar: ${n instanceof Error?n.message:String(n)}`)}}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 n=this.registrar.getContainerForLambda(e);return this.logger.debug("DI container retrieved successfully",{lambdaId:e,serviceName:this.registrar.getServiceForLambda(e)}),n}catch(n){throw this.logger.error("Failed to get DI container for Lambda",{lambdaId:e,error:n instanceof Error?n.message:String(n)}),new Error(`Failed to get DI container for Lambda '${e}': ${n instanceof Error?n.message:String(n)}`)}}createHandlerWithDI(e,n){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,n);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(n){throw new Error(`Lambda definition not found for ID '${e}': ${n instanceof Error?n.message:String(n)}`)}}};var W={};$e(W,{RuntimeExtensions:()=>ae});var fo=de(Q());A(W,require("@worktif/purenow/lambda"));var oo=de(Q()),yn=require("@worktif/utils");var ae=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){}async enhanceDevServer(e,n){let i=this.runtimeConfig.devServerEnhancements;return{...e,runtime:{hotReload:i?.hotReload??!0,debugMode:i?.debugMode??!1,performanceMonitoring:i?.performanceMonitoring??!1}}}async optimizeBuild(e,n){let i=this.runtimeConfig.buildOptimizations;return{...e,runtime:{bundleAnalysis:i?.bundleAnalysis??!1,treeshaking:i?.treeshaking??!0,codeMinification:i?.codeMinification??!0}}}async configureRuntimeCoreStack(e,n){return this.runtimeConfig.enableRuntimeCoreStack?{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"}}:void 0}async updateConfiguration(e,n){this.runtimeConfig={...this.runtimeConfig,...e,devServerEnhancements:{...this.runtimeConfig.devServerEnhancements,...e.devServerEnhancements},buildOptimizations:{...this.runtimeConfig.buildOptimizations,...e.buildOptimizations}}}getConfiguration(){return{...this.runtimeConfig}}isFeatureEnabled(e){return this.runtimeConfig.additionalFeatures?.includes(e)??!1}async enableFeature(e,n){this.isFeatureEnabled(e)||(this.runtimeConfig.additionalFeatures=[...this.runtimeConfig.additionalFeatures||[],e])}async disableFeature(e,n){this.isFeatureEnabled(e)&&(this.runtimeConfig.additionalFeatures=(this.runtimeConfig.additionalFeatures||[]).filter(i=>i!==e))}};ae=$([(0,yn.purable)()],ae);A(j,W,module.exports);var V={};$e(V,{RuntimeContainer:()=>me,RuntimeDi:()=>ut});var Io=de(Q());A(V,require("@worktif/purenow/lambda"));var po=de(Q()),bn=require("@worktif/utils");var vo=de(Q()),ut=(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))(ut||{});var me=class{constructor(){this.container=new bn.PureContainer({defaultScope:"Singleton"}),this.initializeRuntimeBindings()}initializeRuntimeBindings(){this.container.tie({runtime_extensions_service_bind:{instance:ae,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=$([X()],me);A(j,V,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,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
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3JlZmxlY3QtbWV0YWRhdGEvUmVmbGVjdC5qcyIsICIuLi8uLi8uLi9zcmMvY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kZXRlY3Rvci9tZXRhZGF0YS1jb2xsZWN0b3JzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2RldGVjdG9yL3J1bnRpbWUtZGV0ZWN0b3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2ludmVyc2lmeS9saWIvZXNtL2luZGV4LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29tbW9uL3NyYy9jb21tb24vY2FsY3VsYXRpb25zL2lzUHJvbWlzZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbW1vbi9zcmMvc2VydmljZXMvY2FsY3VsYXRpb25zL3N0cmluZ2lmeVNlcnZpY2VJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29tbW9uL3NyYy9zZXJ2aWNlcy9tb2RlbHMvTGF6eVNlcnZpY2VJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2J1aWxkQXJyYXlNZXRhZGF0YVdpdGhBcnJheS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9idWlsZEFycmF5TWV0YWRhdGFXaXRoRWxlbWVudC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9idWlsZEFycmF5TWV0YWRhdGFXaXRoSW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRFbXB0eUFycmF5TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvYnVpbGRFbXB0eU1hcE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL2dldE93blJlZmxlY3RNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy9nZXRSZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9yZWZsZWN0LW1ldGFkYXRhLXV0aWxzL3NyYy9yZWZsZWN0TWV0YWRhdGEvdXRpbHMvc2V0UmVmbGVjdE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcmVmbGVjdC1tZXRhZGF0YS11dGlscy9zcmMvcmVmbGVjdE1ldGFkYXRhL3V0aWxzL3VwZGF0ZU93blJlZmxlY3RNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL3JlZmxlY3QtbWV0YWRhdGEtdXRpbHMvc3JjL3JlZmxlY3RNZXRhZGF0YS91dGlscy91cGRhdGVSZWZsZWN0TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2FjdGlvbnMvZ2V0QmluZGluZ0lkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ1Njb3BlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ1R5cGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vY2FsY3VsYXRpb25zL2NoYWluLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvY29tbW9uL21vZGVscy9PbmVUb01hbnlNYXBTdGFyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9zZXJ2aWNlcy9BY3RpdmF0aW9uc1NlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZWZsZWN0TWV0YWRhdGEvZGF0YS9jbGFzc01ldGFkYXRhUmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9nZXREZWZhdWx0Q2xhc3NNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3JlZmxlY3RNZXRhZGF0YS9kYXRhL3BlbmRpbmdDbGFzc01ldGFkYXRhQ291bnRSZWZsZWN0S2V5LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvZXJyb3IvbW9kZWxzL0ludmVyc2lmeUNvcmVFcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2Vycm9yL21vZGVscy9JbnZlcnNpZnlDb3JlRXJyb3JLaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvbW9kZWxzL01heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9zZXJ2aWNlcy9CaW5kaW5nU2VydmljZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvc2VydmljZXMvRGVhY3RpdmF0aW9uc1NlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9tb2RlbHMvQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldENsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvaXNQZW5kaW5nQ2xhc3NNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy92YWxpZGF0ZUNvbnN0cnVjdG9yTWV0YWRhdGFBcnJheS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy90aHJvd0F0SW52YWxpZENsYXNzTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9idWlsZEluc3RhbmNlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lQmluZGluZ0NhY2hlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVEeW5hbWljVmFsdWVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVGYWN0b3J5QmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2Nsb25lSW5zdGFuY2VCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVQcm92aWRlckJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9jbG9uZVJlc29sdmVkVmFsdWVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvY2xvbmVTZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvZGVjb3JhdG9yL2FjdGlvbnMvZGVjb3JhdGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvZ2V0RGVmYXVsdFBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL2RlY3JlbWVudFBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2Fzc2VydE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRJZk1hbmFnZWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRNYW5hZ2VkTWV0YWRhdGFGcm9tTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9idWlsZERlZmF1bHRNYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRNYW5hZ2VkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YVByb3BlcnR5LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvZGVjb3JhdG9yL21vZGVscy9EZWNvcmF0b3JJbmZvS2luZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9oYW5kbGVJbmplY3Rpb25FcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9jYWxjdWxhdGlvbnMvZ2V0RGVjb3JhdG9ySW5mby50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2RlY29yYXRvci9jYWxjdWxhdGlvbnMvc3RyaW5naWZ5RGVjb3JhdG9ySW5mby50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0QmFzZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWF5YmVDbGFzc01ldGFkYXRhQ29uc3RydWN0b3JBcmd1bWVudC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVmbGVjdE1ldGFkYXRhL2RhdGEvY2xhc3NJc0luamVjdGFibGVGbGFnUmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9pc1VzZXJsYW5kRW1pdHRlZFR5cGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZUNsYXNzTWV0YWRhdGFXaXRoVHlwZXNjcmlwdFBhcmFtZXRlclR5cGVzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVmbGVjdE1ldGFkYXRhL2RhdGEvdHlwZXNjcmlwdERlc2lnblBhcmFtZXRlclR5cGVzUmVmbGVjdEtleS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9idWlsZENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRQYXJhbWV0ZXJUeXBlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9pbmplY3RhYmxlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy9zZXRJc0luamVjdGFibGVGbGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvY2FsY3VsYXRpb25zL2dldEV4dGVuZGVkQ29uc3RydWN0b3JBcmd1bWVudHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvZ2V0RXh0ZW5kZWRQcm9wZXJ0aWVzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9pbmplY3RGcm9tLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvZGVjb3JhdG9ycy9pbmplY3RGcm9tQmFzZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvaW5qZWN0RnJvbUhpZXJhcmNoeS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvbXVsdGlJbmplY3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL2luY3JlbWVudFBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRNYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGREZWZhdWx0TWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvbmFtZWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1ldGFkYXRhTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWV0YWRhdGFPcHRpb25hbC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvb3B0aW9uYWwudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9kZWNvcmF0b3JzL3Bvc3RDb25zdHJ1Y3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9hY3Rpb25zL3VwZGF0ZU1heWJlQ2xhc3NNZXRhZGF0YVBvc3RDb25zdHJ1Y3Rvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvcHJlRGVzdHJveS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2FjdGlvbnMvdXBkYXRlTWF5YmVDbGFzc01ldGFkYXRhUHJlRGVzdHJveS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvdGFnZ2VkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvYWN0aW9ucy91cGRhdGVNZXRhZGF0YVRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9idWlsZERlZmF1bHRVbm1hbmFnZWRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2NhbGN1bGF0aW9ucy9idWlsZFVubWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9tZXRhZGF0YS9jYWxjdWxhdGlvbnMvYnVpbGRVbm1hbmFnZWRNZXRhZGF0YUZyb21NYXliZU1hbmFnZWRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL21ldGFkYXRhL2RlY29yYXRvcnMvdW5tYW5hZ2VkLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvbWV0YWRhdGEvbW9kZWxzL1Jlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGFLaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvZXJyb3IvY2FsY3VsYXRpb25zL2lzU3RhY2tPdmVyZmxvd0Vycm9yLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2hhbmRsZVBsYW5FcnJvci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL21vZGVscy9MYXp5UGxhblNlcnZpY2VOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvYmluZGluZy9tb2RlbHMvQmluZGluZ0NvbnN0cmFpbnRzSW1wbGVtZW50YXRpb24udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvYnVpbGRGaWx0ZXJlZFNlcnZpY2VCaW5kaW5ncy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL2NvbW1vbi9tb2RlbHMvU2luZ2xlSW1tdXRhYmxlTGlua2VkTGlzdC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9idWlsZFBsYW5CaW5kaW5nQ29uc3RyYWludHNMaXN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2lzUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL3Rocm93RXJyb3JXaGVuVW5leHBlY3RlZEJpbmRpbmdzQW1vdW50Rm91bmQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9zdHJpbmdpZnlCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2NoZWNrUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlU2luZ2xlSW5qZWN0aW9uQmluZGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvY2hlY2tTZXJ2aWNlTm9kZVNpbmdsZUluamVjdGlvbkJpbmRpbmdzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL2dldFNlcnZpY2VGcm9tTWF5YmVMYXp5U2VydmljZUlkZW50aWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlCdWlsZFNlcnZpY2VOb2RlQmluZGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2NhY2hlTm9uUm9vdFBsYW5TZXJ2aWNlTm9kZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlTdWJwbGFuLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL3RyeUJ1aWxkR2V0UGxhbk9wdGlvbnNGcm9tTWFuYWdlZENsYXNzRWxlbWVudE1ldGFkYXRhLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvY2FsY3VsYXRpb25zL3RyeUJ1aWxkR2V0UGxhbk9wdGlvbnNGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9pc0luc3RhbmNlQmluZGluZ05vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL3BsYW4udHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2N1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9jYWxjdWxhdGlvbnMvYnVpbGRHZXRQbGFuT3B0aW9uc0Zyb21QbGFuUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvbW9kZWxzL0NhY2hlQmluZGluZ0ludmFsaWRhdGlvbktpbmQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vbW9kZWxzL1dlYWtMaXN0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9hZGRTZXJ2aWNlTm9kZUJpbmRpbmdJZkNvbnRleHRGcmVlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9jdXJyeUxhenlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvY3VycnlMYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2FjdGlvbnMvcmVtb3ZlU2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL3NlcnZpY2VzL1BsYW5SZXN1bHRDYWNoZVNlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9wbGFubmluZy9hY3Rpb25zL2FkZFJvb3RTZXJ2aWNlTm9kZUJpbmRpbmdJZkNvbnRleHRGcmVlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcGxhbm5pbmcvYWN0aW9ucy9yZW1vdmVSb290U2VydmljZU5vZGVCaW5kaW5nSWZDb250ZXh0RnJlZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3BsYW5uaW5nL2NhbGN1bGF0aW9ucy9oYW5kbGVSZXNvbHZlRXJyb3IudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvY2FjaGVSZXNvbHZlZFZhbHVlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nU2VydmljZUFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nQWN0aXZhdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNpbmdsZXRvblNjb3BlZEJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUNvbnN0YW50VmFsdWVCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9jYWxjdWxhdGlvbnMvcmVzb2x2ZUNvbnN0YW50VmFsdWVCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9jb21tb24vY2FsY3VsYXRpb25zL2dldFNlbGYudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNjb3BlZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlU2NvcGVkQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlRHluYW1pY1ZhbHVlQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVEeW5hbWljVmFsdWVCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUZhY3RvcnlCaW5kaW5nLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9jYWxjdWxhdGlvbnMvcmVzb2x2ZUZhY3RvcnlCaW5kaW5nQ2FsbGJhY2sudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVBvc3RDb25zdHJ1Y3QudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVGcm9tQ29uc3RydWN0b3JQYXJhbXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVByb3ZpZGVyQmluZGluZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL3Jlc29sdmVQcm92aWRlckJpbmRpbmdDYWxsYmFjay50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vY2FsY3VsYXRpb25zL2dldEluc3RhbmNlTm9kZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2NhbGN1bGF0aW9ucy9nZXRSZXNvbHZlZFZhbHVlTm9kZUJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9zZXRJbnN0YW5jZVByb3BlcnRpZXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVJbnN0YW5jZUJpbmRpbmdDb25zdHJ1Y3RvclBhcmFtcy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvcmUvc3JjL3Jlc29sdXRpb24vYWN0aW9ucy9yZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZUFzeW5jRnJvbUNvbnN0cnVjdG9yUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVJlc29sdmVkVmFsdWVCaW5kaW5nUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTY29wZWRJbnN0YW5jZUJpbmRpbmdOb2RlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVTY29wZWRSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1Njb3BlZEJpbmRpbmcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUJpbmRpbmdQcmVEZXN0cm95LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nU2VydmljZURlYWN0aXZhdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZUJpbmRpbmdEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29yZS9zcmMvcmVzb2x1dGlvbi9hY3Rpb25zL3Jlc29sdmVCaW5kaW5nc0RlYWN0aXZhdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZU1vZHVsZURlYWN0aXZhdGlvbnMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb3JlL3NyYy9yZXNvbHV0aW9uL2FjdGlvbnMvcmVzb2x2ZVNlcnZpY2VEZWFjdGl2YXRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvcGx1Z2luL3NyYy9wbHVnaW4vbW9kZWxzL1BsdWdpbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL2FjdGlvbnMvZ2V0Q29udGFpbmVyTW9kdWxlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9tb2RlbHMvQ29udGFpbmVyTW9kdWxlLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL21vZGVscy9CaW5kaW5nSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nSWRlbnRpZmllci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL2JpbmRpbmcvdXRpbHMvQmluZGluZ0NvbnN0cmFpbnRVdGlscy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvZXJyb3IvbW9kZWxzL0ludmVyc2lmeUNvbnRhaW5lckVycm9yLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9lcnJvci9tb2RlbHMvSW52ZXJzaWZ5Q29udGFpbmVyRXJyb3JLaW5kLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9idWlsZEJpbmRpbmdJZGVudGlmaWVyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0FueUFuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0JpbmRpbmdDb25zdHJhaW50c1dpdGhOYW1lLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc0JpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQmluZGluZ0NvbnN0cmFpbnRzV2l0aFRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNCaW5kaW5nQ29uc3RyYWludHNXaXRoTm9OYW1lTm9yVGFncy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb0FuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc05vdFBhcmVudEJpbmRpbmdDb25zdHJhaW50cy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNQYXJlbnRCaW5kaW5nQ29uc3RyYWludHMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvbW9kZWxzL0JpbmRpbmdGbHVlbnRTeW50YXhJbXBsZW1lbnRhdGlvbi50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNSZXNvbHZlZFZhbHVlTWV0YWRhdGFJbmplY3RPcHRpb25zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc011bHRpcGxlUmVzb2x2ZWRWYWx1ZU1ldGFkYXRhSW5qZWN0T3B0aW9ucy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNBbnlBbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzQW55QW5jZXN0b3JCaW5kaW5nQ29uc3RyYWludHNXaXRoTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNBbnlBbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm90UGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aFNlcnZpY2VJZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb3RQYXJlbnRCaW5kaW5nQ29uc3RyYWludHNXaXRoTmFtZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb3RQYXJlbnRCaW5kaW5nQ29uc3RyYWludHNXaXRoVGFnLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9iaW5kaW5nL2NhbGN1bGF0aW9ucy9pc1BhcmVudEJpbmRpbmdDb25zdHJhaW50c1dpdGhTZXJ2aWNlSWQudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzUGFyZW50QmluZGluZ0NvbnN0cmFpbnRzV2l0aFRhZy50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb0FuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzV2l0aFNlcnZpY2VJZC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvYmluZGluZy9jYWxjdWxhdGlvbnMvaXNOb0FuY2VzdG9yQmluZGluZ0NvbnN0cmFpbnRzV2l0aE5hbWUudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2JpbmRpbmcvY2FsY3VsYXRpb25zL2lzTm9BbmNlc3RvckJpbmRpbmdDb25zdHJhaW50c1dpdGhUYWcudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9CaW5kaW5nTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29tbW9uL2NhbGN1bGF0aW9ucy9nZXRGaXJzdEl0ZXJhYmxlUmVzdWx0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb21tb24vYWN0aW9ucy9nZXRGaXJzdEl0ZXJhdG9yUmVzdWx0LnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvQ29udGFpbmVyTW9kdWxlTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL0RlYWN0aXZhdGlvblBhcmFtc01hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9jYWxjdWxhdGlvbnMvYnVpbGREZWFjdGl2YXRpb25QYXJhbXMudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9hY3Rpb25zL3Jlc2V0RGVhY3RpdmF0aW9uUGFyYW1zLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvUGxhblBhcmFtc09wZXJhdGlvbnNNYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AaW52ZXJzaWZ5anMvY29udGFpbmVyL3NyYy9jb250YWluZXIvc2VydmljZXMvUGxhblJlc3VsdENhY2hlTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1BsdWdpbk1hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BpbnZlcnNpZnlqcy9jb250YWluZXIvc3JjL2NvbnRhaW5lci9zZXJ2aWNlcy9TZXJ2aWNlUmVmZXJlbmNlTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1NlcnZpY2VSZXNvbHV0aW9uTWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL1NuYXBzaG90TWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvQGludmVyc2lmeWpzL2NvbnRhaW5lci9zcmMvY29udGFpbmVyL3NlcnZpY2VzL0NvbnRhaW5lci50cyIsICIuLi8uLi8uLi9zcmMvdXRpbHMvZGVjb3JhdG9ycy50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9kaS9kaS1lcnJvcnMudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvdGllcy1yZWdpc3RyYXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZGkvcHVyZS1jb250YWluZXItZmFjdG9yeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnkudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvZmFjdG9yeS9oYW5kbGVyLXdyYXBwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL2NvbnRhaW5lci1yZWdpc3RyeS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9yZWdpc3RyYXIvbWljcm9zZXJ2aWNlLXJlZ2lzdHJhci50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL3NlcnZpY2VzL3J1bnRpbWUtZXh0ZW5zaW9ucy9ydW50aW1lLWV4dGVuc2lvbnMuc2VydmljZS50cyIsICIuLi8uLi8uLi9zcmMvY29yZS9idW5kbGUvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL2NvcmUvYnVuZGxlL3J1bnRpbWUuY29udGFpbmVyLnRzIiwgIi4uLy4uLy4uL3NyYy9jb3JlL2J1bmRsZS9ydW50aW1lLmNvbnRhaW5lci50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKEMpIE1pY3Jvc29mdC4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZVxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcbkxpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbktJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRURcbldBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxuXG5TZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG52YXIgUmVmbGVjdDtcbihmdW5jdGlvbiAoUmVmbGVjdCkge1xuICAgIC8vIE1ldGFkYXRhIFByb3Bvc2FsXG4gICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS9cbiAgICAoZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbFRoaXMgOlxuICAgICAgICAgICAgdHlwZW9mIGdsb2JhbCA9PT0gXCJvYmplY3RcIiA/IGdsb2JhbCA6XG4gICAgICAgICAgICAgICAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDpcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BweU1vZGVUaGlzKCk7XG4gICAgICAgIHZhciBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihSZWZsZWN0KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGV4cG9ydGVyID0gbWFrZUV4cG9ydGVyKHJvb3QuUmVmbGVjdCwgZXhwb3J0ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGZhY3RvcnkoZXhwb3J0ZXIsIHJvb3QpO1xuICAgICAgICBpZiAodHlwZW9mIHJvb3QuUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgcm9vdC5SZWZsZWN0ID0gUmVmbGVjdDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlRXhwb3J0ZXIodGFyZ2V0LCBwcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBmdW5jdGlvblRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihcInJldHVybiB0aGlzO1wiKSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGluZGlyZWN0RXZhbFRoaXMoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAwLCBldmFsKShcIihmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pKClcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoXykgeyB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc2xvcHB5TW9kZVRoaXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25UaGlzKCkgfHwgaW5kaXJlY3RFdmFsVGhpcygpO1xuICAgICAgICB9XG4gICAgfSkoZnVuY3Rpb24gKGV4cG9ydGVyLCByb290KSB7XG4gICAgICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICAgICAgICAvLyBmZWF0dXJlIHRlc3QgZm9yIFN5bWJvbCBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1N5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgdmFyIHRvUHJpbWl0aXZlU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC50b1ByaW1pdGl2ZSAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC50b1ByaW1pdGl2ZSA6IFwiQEB0b1ByaW1pdGl2ZVwiO1xuICAgICAgICB2YXIgaXRlcmF0b3JTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yICE9PSBcInVuZGVmaW5lZFwiID8gU3ltYm9sLml0ZXJhdG9yIDogXCJAQGl0ZXJhdG9yXCI7XG4gICAgICAgIHZhciBzdXBwb3J0c0NyZWF0ZSA9IHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCI7IC8vIGZlYXR1cmUgdGVzdCBmb3IgT2JqZWN0LmNyZWF0ZSBzdXBwb3J0XG4gICAgICAgIHZhciBzdXBwb3J0c1Byb3RvID0geyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheTsgLy8gZmVhdHVyZSB0ZXN0IGZvciBfX3Byb3RvX18gc3VwcG9ydFxuICAgICAgICB2YXIgZG93bkxldmVsID0gIXN1cHBvcnRzQ3JlYXRlICYmICFzdXBwb3J0c1Byb3RvO1xuICAgICAgICB2YXIgSGFzaE1hcCA9IHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvYmplY3QgaW4gZGljdGlvbmFyeSBtb2RlIChhLmsuYS4gXCJzbG93XCIgbW9kZSBpbiB2OClcbiAgICAgICAgICAgIGNyZWF0ZTogc3VwcG9ydHNDcmVhdGVcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KE9iamVjdC5jcmVhdGUobnVsbCkpOyB9XG4gICAgICAgICAgICAgICAgOiBzdXBwb3J0c1Byb3RvXG4gICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoeyBfX3Byb3RvX186IG51bGwgfSk7IH1cbiAgICAgICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeSh7fSk7IH0sXG4gICAgICAgICAgICBoYXM6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSk7IH1cbiAgICAgICAgICAgICAgICA6IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4ga2V5IGluIG1hcDsgfSxcbiAgICAgICAgICAgIGdldDogZG93bkxldmVsXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGhhc093bi5jYWxsKG1hcCwga2V5KSA/IG1hcFtrZXldIDogdW5kZWZpbmVkOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIG1hcFtrZXldOyB9LFxuICAgICAgICB9O1xuICAgICAgICAvLyBMb2FkIGdsb2JhbCBvciBzaGltIHZlcnNpb25zIG9mIE1hcCwgU2V0LCBhbmQgV2Vha01hcFxuICAgICAgICB2YXIgZnVuY3Rpb25Qcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb24pO1xuICAgICAgICB2YXIgX01hcCA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgTWFwLnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBNYXAgOiBDcmVhdGVNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1NldCA9IHR5cGVvZiBTZXQgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSBcImZ1bmN0aW9uXCIgPyBTZXQgOiBDcmVhdGVTZXRQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgX1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gXCJmdW5jdGlvblwiID8gV2Vha01hcCA6IENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpO1xuICAgICAgICB2YXIgcmVnaXN0cnlTeW1ib2wgPSBzdXBwb3J0c1N5bWJvbCA/IFN5bWJvbC5mb3IoXCJAcmVmbGVjdC1tZXRhZGF0YTpyZWdpc3RyeVwiKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnkgPSBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgdmFyIG1ldGFkYXRhUHJvdmlkZXIgPSBDcmVhdGVNZXRhZGF0YVByb3ZpZGVyKG1ldGFkYXRhUmVnaXN0cnkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQXBwbGllcyBhIHNldCBvZiBkZWNvcmF0b3JzIHRvIGEgcHJvcGVydHkgb2YgYSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBBbiBhcnJheSBvZiBkZWNvcmF0b3JzLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IHRvIGRlY29yYXRlLlxuICAgICAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGtleS5cbiAgICAgICAgICogQHJlbWFya3MgRGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiByZXZlcnNlIG9yZGVyLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBFeGFtcGxlID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpKSk7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNBcnJheShkZWNvcmF0b3JzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoYXR0cmlidXRlcykgJiYgIUlzVW5kZWZpbmVkKGF0dHJpYnV0ZXMpICYmICFJc051bGwoYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIERlY29yYXRlUHJvcGVydHkoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWNvcmF0ZVwiLCBkZWNvcmF0ZSk7XG4gICAgICAgIC8vIDQuMS4yIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI3JlZmxlY3QubWV0YWRhdGFcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgZGVmYXVsdCBtZXRhZGF0YSBkZWNvcmF0b3IgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIG9uIGEgY2xhc3MsIGNsYXNzIG1lbWJlciwgb3IgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIGVudHJ5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBUaGUgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHJldHVybnMgQSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gICAgICAgICAqIEByZW1hcmtzXG4gICAgICAgICAqIElmIGBtZXRhZGF0YUtleWAgaXMgYWxyZWFkeSBkZWZpbmVkIGZvciB0aGUgdGFyZ2V0IGFuZCB0YXJnZXQga2V5LCB0aGVcbiAgICAgICAgICogbWV0YWRhdGFWYWx1ZSBmb3IgdGhhdCBrZXkgd2lsbCBiZSBvdmVyd3JpdHRlbi5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSwgVHlwZVNjcmlwdCBvbmx5KVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBwcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBtZXRob2QoKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIG1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpICYmICFJc1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlZmluZSBhIHVuaXF1ZSBtZXRhZGF0YSBlbnRyeSBvbiB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YVZhbHVlIEEgdmFsdWUgdGhhdCBjb250YWlucyBhdHRhY2hlZCBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0byBkZWZpbmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBkZWNvcmF0b3IgZmFjdG9yeSBhcyBtZXRhZGF0YS1wcm9kdWNpbmcgYW5ub3RhdGlvbi5cbiAgICAgICAgICogICAgIGZ1bmN0aW9uIE15QW5ub3RhdGlvbihvcHRpb25zKTogRGVjb3JhdG9yIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKHRhcmdldCwga2V5PykgPT4gUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIHRhcmdldCwga2V5KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImRlZmluZU1ldGFkYXRhXCIsIGRlZmluZU1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbiBoYXMgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEga2V5IHdhcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW47IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc01ldGFkYXRhXCIsIGhhc01ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRhcmdldCBvYmplY3QgaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc093bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gaGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiaGFzT3duTWV0YWRhdGFcIiwgaGFzT3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRNZXRhZGF0YVwiLCBnZXRNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGtleSBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBtZXRhZGF0YSBrZXkgaWYgZm91bmQ7IG90aGVyd2lzZSwgYHVuZGVmaW5lZGAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YVwiLCBnZXRPd25NZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBrZXlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Qgb3IgaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5TWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFLZXlzXCIsIGdldE1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0LlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bmlxdWUgbWV0YWRhdGEga2V5cy5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBnZXRPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlPd25NZXRhZGF0YUtleXModGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJnZXRPd25NZXRhZGF0YUtleXNcIiwgZ2V0T3duTWV0YWRhdGFLZXlzKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIERlbGV0ZXMgdGhlIG1ldGFkYXRhIGVudHJ5IGZyb20gdGhlIHRhcmdldCBvYmplY3Qgd2l0aCB0aGUgcHJvdmlkZWQga2V5LlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFLZXkgQSBrZXkgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbWV0YWRhdGEgZW50cnkgd2FzIGZvdW5kIGFuZCBkZWxldGVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmRlbGV0ZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKHRhcmdldCwgcHJvcGVydHlLZXksIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlEZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWxldGVNZXRhZGF0YVwiLCBkZWxldGVNZXRhZGF0YSk7XG4gICAgICAgIGZ1bmN0aW9uIERlY29yYXRlQ29uc3RydWN0b3IoZGVjb3JhdG9ycywgdGFyZ2V0KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNDb25zdHJ1Y3RvcihkZWNvcmF0ZWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRvciA9IGRlY29yYXRvcnNbaV07XG4gICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZCA9IGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGRlY29yYXRlZCkgJiYgIUlzTnVsbChkZWNvcmF0ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRlY29yYXRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMS4xIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzbWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIGhhc093biA9IE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgaWYgKGhhc093bilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5aGFzb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihwcm92aWRlci5PcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjMuMSBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0TWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAoIUlzTnVsbChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS41LjEgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qQ3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICBwcm92aWRlci5PcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNi4xIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5bWV0YWRhdGFrZXlzXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5TWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgIHZhciBvd25LZXlzID0gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICB2YXIgcGFyZW50S2V5cyA9IE9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gICAgICAgICAgICBpZiAocGFyZW50S2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gb3duS2V5cztcbiAgICAgICAgICAgIGlmIChvd25LZXlzLmxlbmd0aCA8PSAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRLZXlzO1xuICAgICAgICAgICAgdmFyIHNldCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBvd25LZXlzXzEgPSBvd25LZXlzOyBfaSA8IG93bktleXNfMS5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gb3duS2V5c18xW19pXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgX2EgPSAwLCBwYXJlbnRLZXlzXzEgPSBwYXJlbnRLZXlzOyBfYSA8IHBhcmVudEtleXNfMS5sZW5ndGg7IF9hKyspIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gcGFyZW50S2V5c18xW19hXTtcbiAgICAgICAgICAgICAgICB2YXIgaGFzS2V5ID0gc2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA2IEVDTUFTY3JpcHQgRGF0YSBUeXBlcyBhbmQgVmFsdWVzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtZGF0YS10eXBlcy1hbmQtdmFsdWVzXG4gICAgICAgIGZ1bmN0aW9uIFR5cGUoeCkge1xuICAgICAgICAgICAgaWYgKHggPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEgLyogTnVsbCAqLztcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6IHJldHVybiAwIC8qIFVuZGVmaW5lZCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOiByZXR1cm4gMiAvKiBCb29sZWFuICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIDMgLyogU3RyaW5nICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjogcmV0dXJuIDQgLyogU3ltYm9sICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJudW1iZXJcIjogcmV0dXJuIDUgLyogTnVtYmVyICovO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjogcmV0dXJuIHggPT09IG51bGwgPyAxIC8qIE51bGwgKi8gOiA2IC8qIE9iamVjdCAqLztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjEgVGhlIFVuZGVmaW5lZCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtdW5kZWZpbmVkLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNVbmRlZmluZWQoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuMiBUaGUgTnVsbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtbnVsbC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzTnVsbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA9PT0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyA2LjEuNSBUaGUgU3ltYm9sIFR5cGVcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcy1zeW1ib2wtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc1N5bWJvbCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjcgVGhlIE9iamVjdCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzT2JqZWN0KHgpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiA/IHggIT09IG51bGwgOiB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMSBUeXBlIENvbnZlcnNpb25cbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdHlwZS1jb252ZXJzaW9uXG4gICAgICAgIC8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3ByaW1pdGl2ZVxuICAgICAgICBmdW5jdGlvbiBUb1ByaW1pdGl2ZShpbnB1dCwgUHJlZmVycmVkVHlwZSkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBVbmRlZmluZWQgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDEgLyogTnVsbCAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBCb29sZWFuICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDUgLyogTnVtYmVyICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaGludCA9IFByZWZlcnJlZFR5cGUgPT09IDMgLyogU3RyaW5nICovID8gXCJzdHJpbmdcIiA6IFByZWZlcnJlZFR5cGUgPT09IDUgLyogTnVtYmVyICovID8gXCJudW1iZXJcIiA6IFwiZGVmYXVsdFwiO1xuICAgICAgICAgICAgdmFyIGV4b3RpY1RvUHJpbSA9IEdldE1ldGhvZChpbnB1dCwgdG9QcmltaXRpdmVTeW1ib2wpO1xuICAgICAgICAgICAgaWYgKGV4b3RpY1RvUHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGV4b3RpY1RvUHJpbS5jYWxsKGlucHV0LCBoaW50KTtcbiAgICAgICAgICAgICAgICBpZiAoSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlUb1ByaW1pdGl2ZShpbnB1dCwgaGludCA9PT0gXCJkZWZhdWx0XCIgPyBcIm51bWJlclwiIDogaGludCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEuMSBPcmRpbmFyeVRvUHJpbWl0aXZlKE8sIGhpbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5dG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KSB7XG4gICAgICAgICAgICBpZiAoaGludCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18xID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18xKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMS5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZU9mID0gTy52YWx1ZU9mO1xuICAgICAgICAgICAgICAgIGlmIChJc0NhbGxhYmxlKHZhbHVlT2YpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZU9mLmNhbGwoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZ18yID0gTy50b1N0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh0b1N0cmluZ18yKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdG9TdHJpbmdfMi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMiBUb0Jvb2xlYW4oYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtdG9ib29sZWFuXG4gICAgICAgIGZ1bmN0aW9uIFRvQm9vbGVhbihhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuICEhYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjEyIFRvU3RyaW5nKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b3N0cmluZ1xuICAgICAgICBmdW5jdGlvbiBUb1N0cmluZyhhcmd1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCIgKyBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEuMTQgVG9Qcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBUb1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gVG9QcmltaXRpdmUoYXJndW1lbnQsIDMgLyogU3RyaW5nICovKTtcbiAgICAgICAgICAgIGlmIChJc1N5bWJvbChrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICByZXR1cm4gVG9TdHJpbmcoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIgVGVzdGluZyBhbmQgQ29tcGFyaXNvbiBPcGVyYXRpb25zXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRlc3RpbmctYW5kLWNvbXBhcmlzb24tb3BlcmF0aW9uc1xuICAgICAgICAvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2FycmF5XG4gICAgICAgIGZ1bmN0aW9uIElzQXJyYXkoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5XG4gICAgICAgICAgICAgICAgPyBBcnJheS5pc0FycmF5KGFyZ3VtZW50KVxuICAgICAgICAgICAgICAgIDogYXJndW1lbnQgaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICAgICAgICAgPyBhcmd1bWVudCBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZ3VtZW50KSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi4zIElzQ2FsbGFibGUoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY2FsbGFibGVcbiAgICAgICAgZnVuY3Rpb24gSXNDYWxsYWJsZShhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi40IElzQ29uc3RydWN0b3IoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzY29uc3RydWN0b3JcbiAgICAgICAgZnVuY3Rpb24gSXNDb25zdHJ1Y3Rvcihhcmd1bWVudCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBpcyBhbiBhcHByb3hpbWF0aW9uIGFzIHdlIGNhbm5vdCBjaGVjayBmb3IgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2QuXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFyZ3VtZW50ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yLjcgSXNQcm9wZXJ0eUtleShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNwcm9wZXJ0eWtleVxuICAgICAgICBmdW5jdGlvbiBJc1Byb3BlcnR5S2V5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKFR5cGUoYXJndW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzIC8qIFN0cmluZyAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgY2FzZSA0IC8qIFN5bWJvbCAqLzogcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oeCwgeSkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IHkgfHwgeCAhPT0geCAmJiB5ICE9PSB5O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMyBPcGVyYXRpb25zIG9uIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1vYmplY3RzXG4gICAgICAgIC8vIDcuMy45IEdldE1ldGhvZChWLCBQKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRtZXRob2RcbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0aG9kKFYsIFApIHtcbiAgICAgICAgICAgIHZhciBmdW5jID0gVltQXTtcbiAgICAgICAgICAgIGlmIChmdW5jID09PSB1bmRlZmluZWQgfHwgZnVuYyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKCFJc0NhbGxhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNCBPcGVyYXRpb25zIG9uIEl0ZXJhdG9yIE9iamVjdHNcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3BlcmF0aW9ucy1vbi1pdGVyYXRvci1vYmplY3RzXG4gICAgICAgIGZ1bmN0aW9uIEdldEl0ZXJhdG9yKG9iaikge1xuICAgICAgICAgICAgdmFyIG1ldGhvZCA9IEdldE1ldGhvZChvYmosIGl0ZXJhdG9yU3ltYm9sKTtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShtZXRob2QpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTsgLy8gZnJvbSBDYWxsXG4gICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBtZXRob2QuY2FsbChvYmopO1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdChpdGVyYXRvcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC40IEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLzIwMTYvI3NlYy1pdGVyYXRvcnZhbHVlXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yVmFsdWUoaXRlclJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjUgSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcnN0ZXBcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gZmFsc2UgOiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JjbG9zZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGl0ZXJhdG9yW1wicmV0dXJuXCJdO1xuICAgICAgICAgICAgaWYgKGYpXG4gICAgICAgICAgICAgICAgZi5jYWxsKGl0ZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyA5LjEgT3JkaW5hcnkgT2JqZWN0IEludGVybmFsIE1ldGhvZHMgYW5kIEludGVybmFsIFNsb3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAvLyA5LjEuMS4xIE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTylcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtb3JkaW5hcnlnZXRwcm90b3R5cGVvZlxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pIHtcbiAgICAgICAgICAgIHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgTyAhPT0gXCJmdW5jdGlvblwiIHx8IE8gPT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCBzZXQgX19wcm90b19fIGluIEVTNSwgYXMgaXQncyBub24tc3RhbmRhcmQuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLiBDb21wYXRpYmxlIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAgICAgLy8gbXVzdCBlaXRoZXIgc2V0IF9fcHJvdG9fXyBvbiBhIHN1YmNsYXNzIGNvbnN0cnVjdG9yIHRvIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgLy8gb3IgZW5zdXJlIGVhY2ggY2xhc3MgaGFzIGEgdmFsaWQgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSBvbiBpdHMgcHJvdG90eXBlIHRoYXRcbiAgICAgICAgICAgIC8vIHBvaW50cyBiYWNrIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEZ1bmN0aW9uLltbUHJvdG90eXBlXV0sIHRoZW4gdGhpcyBpcyBkZWZpbmF0ZWx5IGluaGVyaXRlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBpbiBFUzYgb3Igd2hlbiB1c2luZyBfX3Byb3RvX18gaW4gYSBjb21wYXRpYmxlIGJyb3dzZXIuXG4gICAgICAgICAgICBpZiAocHJvdG8gIT09IGZ1bmN0aW9uUHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBzdXBlciBwcm90b3R5cGUgaXMgT2JqZWN0LnByb3RvdHlwZSwgbnVsbCwgb3IgdW5kZWZpbmVkLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgdmFyIHByb3RvdHlwZSA9IE8ucHJvdG90eXBlO1xuICAgICAgICAgICAgdmFyIHByb3RvdHlwZVByb3RvID0gcHJvdG90eXBlICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpO1xuICAgICAgICAgICAgaWYgKHByb3RvdHlwZVByb3RvID09IG51bGwgfHwgcHJvdG90eXBlUHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnN0cnVjdG9yIHdhcyBub3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBjb25zdHJ1Y3RvciA9IHByb3RvdHlwZVByb3RvLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zdHJ1Y3RvciAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc29tZSBraW5kIG9mIHNlbGYtcmVmZXJlbmNlLCB0aGVuIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09PSBPKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIHdlIGhhdmUgYSBwcmV0dHkgZ29vZCBndWVzcyBhdCB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG1ldGFkYXRhIHJlZ2lzdHJ5XG4gICAgICAgIC8vIC0gQWxsb3dzIGBpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCJgIGFuZCBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YS9uby1jb25mbGljdFwiYCB0byBpbnRlcm9wZXJhdGUuXG4gICAgICAgIC8vIC0gVXNlcyBpc29sYXRlZCBtZXRhZGF0YSBpZiBgUmVmbGVjdGAgaXMgZnJvemVuIGJlZm9yZSB0aGUgcmVnaXN0cnkgY2FuIGJlIGluc3RhbGxlZC5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZXMgYSByZWdpc3RyeSB1c2VkIHRvIGFsbG93IG11bHRpcGxlIGByZWZsZWN0LW1ldGFkYXRhYCBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIGZhbGxiYWNrO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgICAgICAgICAgICAgIShyZWdpc3RyeVN5bWJvbCBpbiByb290LlJlZmxlY3QpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZXJvcGVyYXRlIHdpdGggb2xkZXIgdmVyc2lvbiBvZiBgcmVmbGVjdC1tZXRhZGF0YWAgdGhhdCBkaWQgbm90IHN1cHBvcnQgYSByZWdpc3RyeS5cbiAgICAgICAgICAgICAgICBmYWxsYmFjayA9IENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocm9vdC5SZWZsZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmaXJzdDtcbiAgICAgICAgICAgIHZhciBzZWNvbmQ7XG4gICAgICAgICAgICB2YXIgcmVzdDtcbiAgICAgICAgICAgIHZhciB0YXJnZXRQcm92aWRlck1hcCA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvdmlkZXI6IHJlZ2lzdGVyUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIHNldFByb3ZpZGVyOiBzZXRQcm92aWRlcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcmVnaXN0cnk7XG4gICAgICAgICAgICBmdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuaXNFeHRlbnNpYmxlKHJlZ2lzdHJ5KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIHByb3ZpZGVyIHRvIGEgZnJvemVuIHJlZ2lzdHJ5LlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmFsbGJhY2sgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChmaXJzdCk6XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgZmlyc3QgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJc1VuZGVmaW5lZChzZWNvbmQpOlxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBzZWNvbmQgPT09IHByb3ZpZGVyOiBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0ID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCA9IG5ldyBfU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0LmFkZChwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCkge1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdC5pc1Byb3ZpZGVyRm9yKE8sIFApKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHNlY29uZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWNvbmQuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3IocmVzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQoZmFsbGJhY2spICYmIGZhbGxiYWNrLmlzUHJvdmlkZXJGb3IoTywgUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXIoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBwcm92aWRlck1hcC5nZXQoUCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvdmlkZXIgPSBnZXRQcm92aWRlck5vQ2FjaGUoTywgUCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBoYXNQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgPT09IHByb3ZpZGVyIHx8IHNlY29uZCA9PT0gcHJvdmlkZXIgfHwgIUlzVW5kZWZpbmVkKHJlc3QpICYmIHJlc3QuaGFzKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIHNldFByb3ZpZGVyKE8sIFAsIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0YWRhdGEgcHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQuXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IGdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyICE9PSBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGV4aXN0aW5nUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyTWFwID0gdGFyZ2V0UHJvdmlkZXJNYXAuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm92aWRlck1hcC5zZXQoTywgcHJvdmlkZXJNYXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwLnNldChQLCBwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIG9yIGNyZWF0ZXMgdGhlIHNoYXJlZCByZWdpc3RyeSBvZiBtZXRhZGF0YSBwcm92aWRlcnMuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKSB7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFSZWdpc3RyeTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IHJvb3QuUmVmbGVjdFtyZWdpc3RyeVN5bWJvbF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFSZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YVJlZ2lzdHJ5ID0gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RyeVN5bWJvbCkgJiYgSXNPYmplY3Qocm9vdC5SZWZsZWN0KSAmJiBPYmplY3QuaXNFeHRlbnNpYmxlKHJvb3QuUmVmbGVjdCkpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocm9vdC5SZWZsZWN0LCByZWdpc3RyeVN5bWJvbCwge1xuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbWV0YWRhdGFSZWdpc3RyeVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihyZWdpc3RyeSkge1xuICAgICAgICAgICAgLy8gW1tNZXRhZGF0YV1dIGludGVybmFsIHNsb3RcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5LW9iamVjdC1pbnRlcm5hbC1tZXRob2RzLWFuZC1pbnRlcm5hbC1zbG90c1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TWV0YWRhdGEuaGFzKFApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBPcmRpbmFyeUhhc093bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5R2V0T3duTWV0YWRhdGE6IE9yZGluYXJ5R2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeS5yZWdpc3RlclByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgIHZhciBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghQ3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5zZXQoTywgdGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVkVGFyZ2V0TWV0YWRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSB0YXJnZXRNZXRhZGF0YS5nZXQoUCk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuc2V0KFAsIG1ldGFkYXRhTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLmRlbGV0ZShQKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkVGFyZ2V0TWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUoTyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJXcm9uZyBwcm92aWRlciBmb3IgdGFyZ2V0LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuMi4xIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRvQm9vbGVhbihtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuMS40LjEgT3JkaW5hcnlHZXRPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5Z2V0b3dubWV0YWRhdGFcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWRlZmluZW93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhTWFwLnNldChNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNy4xIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW93bm1ldGFkYXRha2V5c1xuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICB2YXIga2V5c09iaiA9IG1ldGFkYXRhTWFwLmtleXMoKTtcbiAgICAgICAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBHZXRJdGVyYXRvcihrZXlzT2JqKTtcbiAgICAgICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSBJdGVyYXRvclN0ZXAoaXRlcmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMubGVuZ3RoID0gaztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0VmFsdWUgPSBJdGVyYXRvclZhbHVlKG5leHQpO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5c1trXSA9IG5leHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgbWV0YWRhdGFNYXAgPSBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIC8qQ3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoIW1ldGFkYXRhTWFwLmRlbGV0ZShNZXRhZGF0YUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQodGFyZ2V0TWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0TWV0YWRhdGEuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmRlbGV0ZSh0YXJnZXRNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlRmFsbGJhY2tQcm92aWRlcihyZWZsZWN0KSB7XG4gICAgICAgICAgICB2YXIgZGVmaW5lTWV0YWRhdGEgPSByZWZsZWN0LmRlZmluZU1ldGFkYXRhLCBoYXNPd25NZXRhZGF0YSA9IHJlZmxlY3QuaGFzT3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YSwgZ2V0T3duTWV0YWRhdGFLZXlzID0gcmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMsIGRlbGV0ZU1ldGFkYXRhID0gcmVmbGVjdC5kZWxldGVNZXRhZGF0YTtcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YU93bmVyID0gbmV3IF9XZWFrTWFwKCk7XG4gICAgICAgICAgICB2YXIgcHJvdmlkZXIgPSB7XG4gICAgICAgICAgICAgICAgaXNQcm92aWRlckZvcjogZnVuY3Rpb24gKE8sIFApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBtZXRhZGF0YU93bmVyLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSAmJiBtZXRhZGF0YVByb3BlcnR5U2V0LmhhcyhQKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGdldE93bk1ldGFkYXRhS2V5cyhPLCBQKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YVByb3BlcnR5U2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhT3duZXIuc2V0KE8sIG1ldGFkYXRhUHJvcGVydHlTZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFQcm9wZXJ0eVNldC5hZGQoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhOiBkZWZpbmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUhhc093bk1ldGFkYXRhOiBoYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBnZXRPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeU93bk1ldGFkYXRhS2V5czogZ2V0T3duTWV0YWRhdGFLZXlzLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVsZXRlTWV0YWRhdGE6IGRlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgcHJvdmlkZXIgZm9yIGFuIG9iamVjdC4gSWYgdGhlIG9iamVjdCBoYXMgbm8gbWV0YWRhdGEgcHJvdmlkZXIgYW5kIHRoaXMgaXMgZm9yIGEgY3JlYXRlIG9wZXJhdGlvbixcbiAgICAgICAgICogdGhlbiB0aGlzIG1vZHVsZSdzIG1ldGFkYXRhIHByb3ZpZGVyIGlzIGFzc2lnbmVkIHRvIHRoZSBvYmplY3QuXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBHZXRNZXRhZGF0YVByb3ZpZGVyKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRQcm92aWRlciA9IG1ldGFkYXRhUmVnaXN0cnkuZ2V0UHJvdmlkZXIoTywgUCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdGVyZWRQcm92aWRlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJlZFByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YVJlZ2lzdHJ5LnNldFByb3ZpZGVyKE8sIFAsIG1ldGFkYXRhUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIHN0YXRlLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgTWFwIHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgY2FjaGVTZW50aW5lbCA9IHt9O1xuICAgICAgICAgICAgdmFyIGFycmF5U2VudGluZWwgPSBbXTtcbiAgICAgICAgICAgIHZhciBNYXBJdGVyYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihrZXlzLCB2YWx1ZXMsIHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG4gICAgICAgICAgICAgICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuX2tleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc2VsZWN0b3IodGhpcy5fa2V5c1tpbmRleF0sIHRoaXMuX3ZhbHVlc1tpbmRleF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogcmVzdWx0LCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS50aHJvdyA9IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwSXRlcmF0b3I7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgdmFyIE1hcCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLnByb3RvdHlwZSwgXCJzaXplXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9rZXlzLmxlbmd0aDsgfSxcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7IHJldHVybiB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSkgPj0gMDsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IHRoaXMuX3ZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXplID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gaW5kZXggKyAxOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5c1tpIC0gMV0gPSB0aGlzLl9rZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlc1tpIC0gMV0gPSB0aGlzLl92YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNhbWVWYWx1ZVplcm8oa2V5LCB0aGlzLl9jYWNoZUtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTI7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRLZXkpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0VmFsdWUpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldEVudHJ5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5lbnRyaWVzKCk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5fZmluZCA9IGZ1bmN0aW9uIChrZXksIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVNhbWVWYWx1ZVplcm8odGhpcy5fY2FjaGVLZXksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKHRoaXMuX2tleXNbaV0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVJbmRleCA8IDAgJiYgaW5zZXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gdGhpcy5fa2V5cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlSW5kZXg7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBNYXA7XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRLZXkoa2V5LCBfKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKF8sIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RW50cnkoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgU2V0IHNoaW1cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlU2V0UG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgU2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLnNpemU7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLnNldCh2YWx1ZSwgdmFsdWUpLCB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgeyB0aGlzLl9tYXAuY2xlYXIoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tYXAuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbXCJAQGl0ZXJhdG9yXCJdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHJldHVybiBTZXQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbmFpdmUgV2Vha01hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVdlYWtNYXBQb2x5ZmlsbCgpIHtcbiAgICAgICAgICAgIHZhciBVVUlEX1NJWkUgPSAxNjtcbiAgICAgICAgICAgIHZhciBrZXlzID0gSGFzaE1hcC5jcmVhdGUoKTtcbiAgICAgICAgICAgIHZhciByb290S2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5oYXModGFibGUsIHRoaXMuX2tleSkgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBIYXNoTWFwLmdldCh0YWJsZSwgdGhpcy5fa2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0YXJnZXQsIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGFibGVbdGhpcy5fa2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxlID0gR2V0T3JDcmVhdGVXZWFrTWFwVGFibGUodGFyZ2V0LCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxlICE9PSB1bmRlZmluZWQgPyBkZWxldGUgdGFibGVbdGhpcy5fa2V5XSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG5vdCBhIHJlYWwgY2xlYXIsIGp1c3QgbWFrZXMgdGhlIHByZXZpb3VzIGRhdGEgdW5yZWFjaGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5ID0gQ3JlYXRlVW5pcXVlS2V5KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gV2Vha01hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmdW5jdGlvbiBDcmVhdGVVbmlxdWVLZXkoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleTtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBcIkBAV2Vha01hcEBAXCIgKyBDcmVhdGVVVUlEKCk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKEhhc2hNYXAuaGFzKGtleXMsIGtleSkpO1xuICAgICAgICAgICAgICAgIGtleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPd24uY2FsbCh0YXJnZXQsIHJvb3RLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3JlYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcm9vdEtleSwgeyB2YWx1ZTogSGFzaE1hcC5jcmVhdGUoKSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtyb290S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIEZpbGxSYW5kb21CeXRlcyhidWZmZXIsIHNpemUpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7ICsraSlcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gTWF0aC5yYW5kb20oKSAqIDB4ZmYgfCAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZW5SYW5kb21CeXRlcyhzaXplKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBVaW50OEFycmF5ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxsUmFuZG9tQnl0ZXMoYXJyYXksIHNpemUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGxSYW5kb21CeXRlcyhuZXcgQXJyYXkoc2l6ZSksIHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVVVJRCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IEdlblJhbmRvbUJ5dGVzKFVVSURfU0laRSk7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyByYW5kb20gLSBSRkMgNDEyMiBcdTAwQTcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbi8vIFJlLWV4cG9ydCBiYXNlIGNvcmUgZnVuY3Rpb25hbGl0eSBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtd2ViIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHlcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS13ZWInO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBzZXJ2aWNlc1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcyc7XG5cbi8vIEV4cG9ydCBydW50aW1lLXNwZWNpZmljIGJ1bmRsZVxuZXhwb3J0ICogZnJvbSAnLi9idW5kbGUnO1xuXG4vLyBAbm90ZTogcnVudGltZS13ZWIgaXMgTk9UIGV4cG9ydGVkIGZyb20gTGFtYmRhIGJ1bmRsZSAoY29udGFpbnMgQ0RLIGNvbnN0cnVjdHMpXG4vLyBJdCdzIG9ubHkgdXNlZCBmb3IgYnVpbGQtdGltZSBDREsgc3ludGhlc2lzLCBub3QgTGFtYmRhIHJ1bnRpbWVcbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCB0eXBlIHsgQnJvd3Nlck1ldGFkYXRhLCBDREtNZXRhZGF0YSwgTGFtYmRhTWV0YWRhdGEgfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBDb2xsZWN0IGJyb3dzZXIgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgYnJvd3NlciBlbnZpcm9ubWVudCBpbmNsdWRpbmdcbiAqIHVzZXIgYWdlbnQsIGN1cnJlbnQgVVJMLCBhbmQgdmlld3BvcnQgZGltZW5zaW9ucy4gVGhpcyBtZXRhZGF0YSBpc1xuICogdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBhbmFseXRpY3MgcHVycG9zZXMuXG4gKlxuICogQHJldHVybnMgQnJvd3NlciBtZXRhZGF0YSBvYmplY3RcbiAqIEB0aHJvd3MgRXJyb3IgaWYgYnJvd3NlciBBUElzIGFyZSBub3QgYXZhaWxhYmxlXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IG1ldGFkYXRhID0gZ2V0QnJvd3Nlck1ldGFkYXRhKCk7XG4gKiBjb25zb2xlLmxvZyhgVXNlciBpcyBvbiAke21ldGFkYXRhLnVybH0gd2l0aCAke21ldGFkYXRhLnZpZXdwb3J0LndpZHRofXgke21ldGFkYXRhLnZpZXdwb3J0LmhlaWdodH0gdmlld3BvcnRgKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvd3Nlck1ldGFkYXRhKCk6IEJyb3dzZXJNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgQVBJcyBub3QgYXZhaWxhYmxlIC0gd2luZG93IG9yIG5hdmlnYXRvciBpcyB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIHZpZXdwb3J0OiB7XG4gICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY29sbGVjdCBicm93c2VyIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBMYW1iZGEgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQVdTIExhbWJkYSBydW50aW1lIGVudmlyb25tZW50XG4gKiBpbmNsdWRpbmcgZnVuY3Rpb24gZGV0YWlscywgcmVnaW9uLCBtZW1vcnkgY29uZmlndXJhdGlvbiwgYW5kIHJlcXVlc3QgY29udGV4dC5cbiAqIFVzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHByb3ZpZGVkIGJ5IHRoZSBMYW1iZGEgcnVudGltZS5cbiAqXG4gKiBAcmV0dXJucyBMYW1iZGEgbWV0YWRhdGEgb2JqZWN0XG4gKiBAdGhyb3dzIEVycm9yIGlmIHJlcXVpcmVkIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG1pc3NpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGEgPSBnZXRMYW1iZGFNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYExhbWJkYSAke21ldGFkYXRhLmZ1bmN0aW9uTmFtZX0gaW4gJHttZXRhZGF0YS5yZWdpb259IHdpdGggJHttZXRhZGF0YS5tZW1vcnlMaW1pdH1NQmApO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYW1iZGFNZXRhZGF0YSgpOiBMYW1iZGFNZXRhZGF0YSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FO1xuICAgIGlmICghZnVuY3Rpb25OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXU19MQU1CREFfRlVOQ1RJT05fTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbW9yeVNpemUgPSBwYXJzZUludChwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0ZVTkNUSU9OX01FTU9SWV9TSVpFIHx8ICcxMjgnLCAxMCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgdmVyc2lvbjogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9WRVJTSU9OIHx8ICckTEFURVNUJyxcbiAgICAgIHJlZ2lvbjogcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gfHwgJ3VzLWVhc3QtMScsXG4gICAgICBtZW1vcnlMaW1pdDogaXNOYU4obWVtb3J5U2l6ZSkgPyAxMjggOiBtZW1vcnlTaXplLFxuICAgICAgcmVxdWVzdElkOiBwcm9jZXNzLmVudi5BV1NfTEFNQkRBX0xPR19TVFJFQU1fTkFNRSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgTGFtYmRhIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdCBDREsgZW52aXJvbm1lbnQgbWV0YWRhdGEuXG4gKlxuICogRXh0cmFjdHMgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQ0RLIGVudmlyb25tZW50IGluY2x1ZGluZ1xuICogQVdTIGFjY291bnQsIHJlZ2lvbiwgQ0RLIHZlcnNpb24sIGFuZCBOb2RlLmpzIHZlcnNpb24uIFRoaXMgbWV0YWRhdGFcbiAqIGlzIHVzZWQgZm9yIGRlcGxveW1lbnQgY29udGV4dCBhbmQgZGVidWdnaW5nLlxuICpcbiAqIEByZXR1cm5zIENESyBtZXRhZGF0YSBvYmplY3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGEgPSBnZXRDREtNZXRhZGF0YSgpO1xuICogY29uc29sZS5sb2coYERlcGxveWluZyB0byBhY2NvdW50ICR7bWV0YWRhdGEuYWNjb3VudH0gaW4gJHttZXRhZGF0YS5yZWdpb259YCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENES01ldGFkYXRhKCk6IENES01ldGFkYXRhIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudDogcHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCB8fCAndW5rbm93bicsXG4gICAgICByZWdpb246IHByb2Nlc3MuZW52LkNES19ERUZBVUxUX1JFR0lPTiB8fCAndXMtZWFzdC0xJyxcbiAgICAgIGNka1ZlcnNpb246IHByb2Nlc3MuZW52LkNES19WRVJTSU9OLFxuICAgICAgbm9kZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbGxlY3QgQ0RLIG1ldGFkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50Q29udGV4dCB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QnJvd3Nlck1ldGFkYXRhLCBnZXRDREtNZXRhZGF0YSwgZ2V0TGFtYmRhTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhLWNvbGxlY3RvcnMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgZW52aXJvbm1lbnQgZGV0ZWN0b3IgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogQXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgKGJyb3dzZXIsIExhbWJkYSwgb3IgQ0RLKVxuICogYW5kIHByb3ZpZGVzIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGZvciBlYWNoIGNvbnRleHQuIFRoaXMgZW5hYmxlcyB0aGVcbiAqIHVuaWZpZWQgcHVyZW5vdygpIGVudHJ5IHBvaW50IHRvIHJvdXRlIGV4ZWN1dGlvbiB0byB0aGUgY29ycmVjdCBwaXBlbGluZS5cbiAqXG4gKiAqKkRldGVjdGlvbiBQcmlvcml0eSoqOlxuICogMS4gQnJvd3NlcjogQ2hlY2sgZm9yIGB3aW5kb3dgIG9iamVjdFxuICogMi4gTGFtYmRhOiBDaGVjayBmb3IgYEFXU19MQU1CREFfRlVOQ1RJT05fTkFNRWAgZW52aXJvbm1lbnQgdmFyaWFibGVcbiAqIDMuIENESzogQ2hlY2sgZm9yIGV4cGxpY2l0IG1vZGUsIENESyBlbnYgdmFycywgb3IgcHJvY2VzcyBhcmd1bWVudHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGV0ZWN0b3IgPSBuZXcgUnVudGltZURldGVjdG9yKCk7XG4gKiBjb25zdCBjb250ZXh0ID0gZGV0ZWN0b3IuZGV0ZWN0KCk7XG4gKlxuICogc3dpdGNoIChjb250ZXh0LnR5cGUpIHtcbiAqICAgY2FzZSAnYnJvd3Nlcic6XG4gKiAgICAgLy8gRXhlY3V0ZSBicm93c2VyIHBpcGVsaW5lXG4gKiAgICAgYnJlYWs7XG4gKiAgIGNhc2UgJ2xhbWJkYSc6XG4gKiAgICAgLy8gRXhlY3V0ZSBMYW1iZGEgcGlwZWxpbmVcbiAqICAgICBicmVhaztcbiAqICAgY2FzZSAnY2RrJzpcbiAqICAgICAvLyBFeGVjdXRlIENESyBwaXBlbGluZVxuICogICAgIGJyZWFrO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRGV0ZWN0b3Ige1xuICAvKipcbiAgICogRGV0ZWN0IHRoZSBjdXJyZW50IHJ1bnRpbWUgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIFVzZXMgYSBzZXJpZXMgb2YgY2hlY2tzIHRvIGRldGVybWluZSB0aGUgZXhlY3V0aW9uIGNvbnRleHQ6XG4gICAqIC0gQnJvd3NlcjogUHJlc2VuY2Ugb2YgYHdpbmRvd2Agb2JqZWN0XG4gICAqIC0gTGFtYmRhOiBBV1MgTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKiAtIENESzogRXhwbGljaXQgbW9kZSBvciBDREstc3BlY2lmaWMgaW5kaWNhdG9yc1xuICAgKlxuICAgKiBAcmV0dXJucyBFbnZpcm9ubWVudCBjb250ZXh0IHdpdGggdHlwZSBhbmQgbWV0YWRhdGFcbiAgICogQHRocm93cyBFcnJvciBpZiBlbnZpcm9ubWVudCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgZGV0ZWN0KCk6IEVudmlyb25tZW50Q29udGV4dCB7XG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdicm93c2VyJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldEJyb3dzZXJNZXRhZGF0YSgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0xhbWJkYSgpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbGFtYmRhJyxcbiAgICAgICAgbWV0YWRhdGE6IGdldExhbWJkYU1ldGFkYXRhKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQ0RLKCkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdjZGsnLFxuICAgICAgICBtZXRhZGF0YTogZ2V0Q0RLTWV0YWRhdGEoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1VuYWJsZSB0byBkZXRlY3QgcnVudGltZSBlbnZpcm9ubWVudC4gJyArXG4gICAgICAnRXhwZWN0ZWQgYnJvd3NlciAod2luZG93IG9iamVjdCksIExhbWJkYSAoQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FKSwgJyArXG4gICAgICAnb3IgQ0RLIChQVVJFTk9XX01PREU9Y2RrIG9yIENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBydW5uaW5nIGluIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYHdpbmRvd2Agb2JqZWN0IGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBpc0Jyb3dzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bm5pbmcgaW4gQVdTIExhbWJkYSBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBBV1MgTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHByZXNlbnRcbiAgICovXG4gIHByaXZhdGUgaXNMYW1iZGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bm5pbmcgaW4gQ0RLIGVudmlyb25tZW50LlxuICAgKlxuICAgKiBVc2VzIG11bHRpcGxlIGRldGVjdGlvbiBtZXRob2RzIGluIHByaW9yaXR5IG9yZGVyOlxuICAgKiAxLiBFeHBsaWNpdCBtb2RlOiBQVVJFTk9XX01PREU9Y2RrIChyZWNvbW1lbmRlZClcbiAgICogMi4gQ0RLIGVudmlyb25tZW50IHZhcmlhYmxlczogQ0RLX0RFRkFVTFRfQUNDT1VOVCBvciBDREtfREVGQVVMVF9SRUdJT05cbiAgICogMy4gUHJvY2VzcyBhcmd1bWVudHM6IGNvbnRhaW5zICdjZGsnIG9yICdzeW50aCdcbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBDREsgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgaXNDREsoKTogYm9vbGVhbiB7XG4gICAgLy8gUHJpb3JpdHkgMTogRXhwbGljaXQgbW9kZSAocmVjb21tZW5kZWQpXG4gICAgaWYgKHByb2Nlc3MuZW52LlBVUkVOT1dfTU9ERSA9PT0gJ2NkaycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFByaW9yaXR5IDI6IENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0RLX0RFRkFVTFRfQUNDT1VOVCB8fCBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT04pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFByaW9yaXR5IDM6IFByb2Nlc3MgYXJndW1lbnRzXG4gICAgcmV0dXJuIHByb2Nlc3MuYXJndi5zb21lKGFyZyA9PlxuICAgICAgYXJnLmluY2x1ZGVzKCdjZGsnKSB8fCBhcmcuaW5jbHVkZXMoJ3N5bnRoJyksXG4gICAgKTtcbiAgfVxuXG5cbn1cbiIsICJpbXBvcnRcInJlZmxlY3QtbWV0YWRhdGFcIjtleHBvcnR7TGF6eVNlcnZpY2VJZGVudGlmaWVyfWZyb21cIkBpbnZlcnNpZnlqcy9jb21tb25cIjtleHBvcnR7Q29udGFpbmVyLENvbnRhaW5lck1vZHVsZX1mcm9tXCJAaW52ZXJzaWZ5anMvY29udGFpbmVyXCI7ZXhwb3J0e2JpbmRpbmdTY29wZVZhbHVlcyxiaW5kaW5nVHlwZVZhbHVlcyxkZWNvcmF0ZSxpbmplY3QsaW5qZWN0RnJvbUJhc2UsaW5qZWN0RnJvbUhpZXJhcmNoeSxpbmplY3RhYmxlLG11bHRpSW5qZWN0LG5hbWVkLG9wdGlvbmFsLHBvc3RDb25zdHJ1Y3QscHJlRGVzdHJveSx0YWdnZWQsdW5tYW5hZ2VkfWZyb21cIkBpbnZlcnNpZnlqcy9jb3JlXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXBcbiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogQXMgb2YgMjAyNS0wOS0xNSwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSAnaW52ZXJzaWZ5JztcblxuLyoqXG4gKiBQdXJhYmxlIGRlY29yYXRvciAtIGNvbWJpbmVzIGluamVjdGFibGUgd2l0aCBhZGRpdGlvbmFsIHJ1bnRpbWUgbWV0YWRhdGFcbiAqIFRoaXMgaXMgYSBydW50aW1lLXNwZWNpZmljIGRlY29yYXRvciB0aGF0IGV4dGVuZHMgSW52ZXJzaWZ5J3MgaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVyYWJsZShvcHRpb25zPzogeyBzaW5nbGV0b24/OiBib29sZWFuOyBzY29wZT86IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pihjb25zdHJ1Y3RvcjogVCk6IFQge1xuICAgICAgICAvLyBBcHBseSBpbmplY3RhYmxlIGRlY29yYXRvclxuICAgICAgICBpbmplY3RhYmxlKCkoY29uc3RydWN0b3IpO1xuXG4gICAgICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIG1ldGFkYXRhXG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ3J1bnRpbWU6cHVyYWJsZScsIHRydWUsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnNpbmdsZXRvbikge1xuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgncnVudGltZTpzaW5nbGV0b24nLCB0cnVlLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNjb3BlKSB7XG4gICAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdydW50aW1lOnNjb3BlJywgb3B0aW9ucy5zY29wZSwgY29uc3RydWN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgIH07XG59IiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIERJIGNvbnRhaW5lciBvcGVyYXRpb24gZmFpbHMuXG4gKlxuICogVXNlZCBmb3IgY29udGFpbmVyIGNyZWF0aW9uLCBzZXJ2aWNlIHJlc29sdXRpb24sIGFuZCB2YWxpZGF0aW9uIGVycm9ycy5cbiAqL1xuZXhwb3J0IGNsYXNzIERJQ29udGFpbmVyRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgREkgY29udGFpbmVyIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIE5hbWUgb3IgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gRGV0YWlsZWQgZXJyb3IgbWVzc2FnZVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGFpbmVyTmFtZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgREkgQ29udGFpbmVyICcke2NvbnRhaW5lck5hbWV9JzogJHttZXNzYWdlfWApO1xuICAgIHRoaXMubmFtZSA9ICdESUNvbnRhaW5lckVycm9yJztcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIFRpZXMgY2xhc3MgcmVnaXN0cmF0aW9uIGZhaWxzLlxuICpcbiAqIFVzZWQgd2hlbiBhIFRpZXMgY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHJlcXVpcmVkIHJlZ2lzdGVyKCkgbWV0aG9kXG4gKiBvciB3aGVuIHJlZ2lzdHJhdGlvbiBmYWlscyBmb3Igb3RoZXIgcmVhc29ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpZXNSZWdpc3RyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBUaWVzIHJlZ2lzdHJhdGlvbiBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc05hbWUgLSBOYW1lIG9mIHRoZSBUaWVzIGNsYXNzIHRoYXQgZmFpbGVkXG4gICAqIEBwYXJhbSByZWFzb24gLSBSZWFzb24gZm9yIHRoZSByZWdpc3RyYXRpb24gZmFpbHVyZVxuICAgKi9cbiAgY29uc3RydWN0b3IodGllc0NsYXNzTmFtZTogc3RyaW5nLCByZWFzb246IHN0cmluZykge1xuICAgIHN1cGVyKGBUaWVzIHJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yICcke3RpZXNDbGFzc05hbWV9JzogJHtyZWFzb259YCk7XG4gICAgdGhpcy5uYW1lID0gJ1RpZXNSZWdpc3RyYXRpb25FcnJvcic7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIHJlcXVpcmVkIHNlcnZpY2UgaXMgbm90IGZvdW5kIGluIHRoZSBjb250YWluZXIuXG4gKlxuICogVXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBhIHNlcnZpY2UgdGhhdCBoYXNuJ3QgYmVlbiByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgY2xhc3MgTWlzc2luZ1NlcnZpY2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBtaXNzaW5nIHNlcnZpY2UgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIG1pc3Npbmcgc2VydmljZVxuICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSAtIE5hbWUgb3IgaWRlbnRpZmllciBvZiB0aGUgY29udGFpbmVyXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXJ2aWNlTmFtZTogc3RyaW5nLCBjb250YWluZXJOYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgU2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nIG5vdCBmb3VuZCBpbiBjb250YWluZXIgJyR7Y29udGFpbmVyTmFtZX0nYCk7XG4gICAgdGhpcy5uYW1lID0gJ01pc3NpbmdTZXJ2aWNlRXJyb3InO1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBwdXJhYmxlIH0gZnJvbSAnQHV0aWxzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgVGllc0luc3RhbmNlIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgeyBUaWVzUmVnaXN0cmF0aW9uRXJyb3IgfSBmcm9tICcuL2RpLWVycm9ycyc7XG5cbi8qKlxuICogVGllcyByZWdpc3RyYXRpb24gaGVscGVyIGZvciBQdXJlQ29udGFpbmVyIGludGVncmF0aW9uLlxuICpcbiAqIFByb2Nlc3NlcyBUaWVzIGNsYXNzZXMgYW5kIHJlZ2lzdGVycyB0aGVpciBzZXJ2aWNlcyB3aXRoIGEgUHVyZUNvbnRhaW5lciBpbnN0YW5jZS5cbiAqIEVhY2ggVGllcyBjbGFzcyBtdXN0IGltcGxlbWVudCBhIHJlZ2lzdGVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KSBtZXRob2RcbiAqIHRoYXQgdXNlcyBjb250YWluZXIudGllKCksIGNvbnRhaW5lci50aWVDb25zdCgpLCBvciBjb250YWluZXIudGllU2luZ2xldG9uKCkgdG9cbiAqIHJlZ2lzdGVyIHNlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZWdpc3RyYXIgPSBuZXcgVGllc1JlZ2lzdHJhcigpO1xuICogY29uc3QgY29udGFpbmVyID0gbmV3IFB1cmVDb250YWluZXI8c3RyaW5nPih7IGRlZmF1bHRTY29wZTogJ1NpbmdsZXRvbicgfSk7XG4gKlxuICogcmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSk7XG4gKlxuICogLy8gTm93IGNvbnRhaW5lciBoYXMgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgYnkgdGhlIFRpZXMgY2xhc3Nlc1xuICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gKiBgYGBcbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIFRpZXNSZWdpc3RyYXIge1xuICAvKipcbiAgICogUmVnaXN0ZXIgYWxsIFRpZXMgY2xhc3NlcyB3aXRoIHRoZSBwcm92aWRlZCBjb250YWluZXIuXG4gICAqXG4gICAqIENhbGxzIHRoZSByZWdpc3Rlcihjb250YWluZXIpIG1ldGhvZCBvbiBlYWNoIFRpZXMgY2xhc3MgaW5zdGFuY2UuXG4gICAqIFRoZSBUaWVzIGNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGNvbnRhaW5lci50aWUoKSxcbiAgICogY29udGFpbmVyLnRpZUNvbnN0KCksIG9yIGNvbnRhaW5lci50aWVTaW5nbGV0b24oKSB0byByZWdpc3RlciB0aGVpciBzZXJ2aWNlcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgaW5zdGFuY2UgdG8gcmVnaXN0ZXIgc2VydmljZXMgd2l0aFxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9yc1xuICAgKiBAdGhyb3dzIFRpZXNSZWdpc3RyYXRpb25FcnJvciBpZiBhIFRpZXMgY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQgcmVnaXN0ZXIoKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFRpZXMgY2xhc3MgZXhhbXBsZVxuICAgKiBjbGFzcyBQYXltZW50c1RpZXMge1xuICAgKiAgIHJlZ2lzdGVyKGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KTogdm9pZCB7XG4gICAqICAgICBjb250YWluZXIudGllU2luZ2xldG9uKHtcbiAgICogICAgICAgUGF5bWVudHNTZXJ2aWNlOiB7XG4gICAqICAgICAgICAgaW5zdGFuY2U6IFBheW1lbnRzU2VydmljZSxcbiAgICogICAgICAgICBhcmdzOiBbXVxuICAgKiAgICAgICB9XG4gICAqICAgICB9KTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogcmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIFtQYXltZW50c1RpZXNdKTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlclRpZXMoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sIHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgVGllc0NsYXNzIG9mIHRpZXNDbGFzc2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0aWVzSW5zdGFuY2UgPSBuZXcgVGllc0NsYXNzKCkgYXMgYW55O1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIFRpZXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcmVnaXN0ZXIgbWV0aG9kXG4gICAgICAgIGlmICh0eXBlb2YgdGllc0luc3RhbmNlLnJlZ2lzdGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRpZXNSZWdpc3RyYXRpb25FcnJvcihcbiAgICAgICAgICAgIFRpZXNDbGFzcy5uYW1lLFxuICAgICAgICAgICAgJ1RpZXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQgcmVnaXN0ZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pIG1ldGhvZCcsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgdGhlIHJlZ2lzdGVyIG1ldGhvZCB0byBsZXQgdGhlIFRpZXMgY2xhc3MgcmVnaXN0ZXIgaXRzIHNlcnZpY2VzXG4gICAgICAgIHRpZXNJbnN0YW5jZS5yZWdpc3Rlcihjb250YWluZXIpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUaWVzUmVnaXN0cmF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBUaWVzUmVnaXN0cmF0aW9uRXJyb3IoXG4gICAgICAgICAgVGllc0NsYXNzLm5hbWUsXG4gICAgICAgICAgYEZhaWxlZCB0byBpbnN0YW50aWF0ZSBvciByZWdpc3RlciBUaWVzIGNsYXNzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IGFsbCByZXF1aXJlZCBzZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgY29udGFpbmVyLlxuICAgKlxuICAgKiBBdHRlbXB0cyB0byByZXNvbHZlIGVhY2ggc2VydmljZSBuYW1lIHRvIGVuc3VyZSBpdCdzIHByb3Blcmx5IHJlZ2lzdGVyZWQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBjYXRjaGluZyBtaXNzaW5nIHNlcnZpY2UgcmVnaXN0cmF0aW9ucyBlYXJseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHJlcXVpcmVkU2VydmljZXMgLSBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHJlcXVpcmVkIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBbJ1BheW1lbnRzU2VydmljZScsICdCaWxsaW5nU2VydmljZSddKTtcbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgcmVxdWlyZWRTZXJ2aWNlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBtaXNzaW5nU2VydmljZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHNlcnZpY2VOYW1lIG9mIHJlcXVpcmVkU2VydmljZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgc2VydmljZSAodGhpcyB3aWxsIHRocm93IGlmIG5vdCByZWdpc3RlcmVkKVxuICAgICAgICBjb250YWluZXIucnVuKHNlcnZpY2VOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5wdXNoKHNlcnZpY2VOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWlzc2luZ1NlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFJlcXVpcmVkIHNlcnZpY2VzIGFyZSBub3QgcmVnaXN0ZXJlZCBpbiBjb250YWluZXI6ICR7bWlzc2luZ1NlcnZpY2VzLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3Qgc2VydmljZSBuYW1lcyBmcm9tIFRpZXMgY2xhc3NlcyBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgKiB3aGljaCBzZXJ2aWNlcyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBieSBhIHNldCBvZiBUaWVzIGNsYXNzZXMuXG4gICAqIE5vdGU6IFRoaXMgcmVxdWlyZXMgdGhlIFRpZXMgY2xhc3NlcyB0byBleHBvc2UgdGhlaXIgc2VydmljZSBuYW1lcyxcbiAgICogd2hpY2ggaXMgb3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9yc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBleHBlY3RlZFNlcnZpY2VzID0gcmVnaXN0cmFyLmV4dHJhY3RTZXJ2aWNlTmFtZXMoW1BheW1lbnRzVGllc10pO1xuICAgKiByZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBleHBlY3RlZFNlcnZpY2VzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHRyYWN0U2VydmljZU5hbWVzKHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFRpZXNDbGFzcyBvZiB0aWVzQ2xhc3Nlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGllc0luc3RhbmNlID0gbmV3IFRpZXNDbGFzcygpIGFzIGFueTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgVGllcyBjbGFzcyBleHBvc2VzIGl0cyBzZXJ2aWNlIG5hbWVzXG4gICAgICAgIGlmICh0eXBlb2YgdGllc0luc3RhbmNlLmdldFNlcnZpY2VOYW1lcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IG5hbWVzID0gdGllc0luc3RhbmNlLmdldFNlcnZpY2VOYW1lcygpO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5hbWVzKSkge1xuICAgICAgICAgICAgc2VydmljZU5hbWVzLnB1c2goLi4ubmFtZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWdub3JlIGVycm9ycyBkdXJpbmcgc2VydmljZSBuYW1lIGV4dHJhY3Rpb25cbiAgICAgICAgLy8gVGhpcyBpcyBvcHRpb25hbCBmdW5jdGlvbmFsaXR5XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcnZpY2VOYW1lcztcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IHB1cmFibGUgfSBmcm9tICdAdXRpbHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgdHlwZSB7IFRpZXNJbnN0YW5jZSB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgVGllc1JlZ2lzdHJhciB9IGZyb20gJy4vdGllcy1yZWdpc3RyYXInO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciB9IGZyb20gJy4vZGktZXJyb3JzJztcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBhbmQgY29uZmlndXJpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgZm9yIG1pY3Jvc2VydmljZXMuXG4gKlxuICogQ3JlYXRlcyBQdXJlQ29udGFpbmVyPHN0cmluZz4gaW5zdGFuY2VzIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQgYW5kXG4gKiByZWdpc3RlcnMgYWxsIHNlcnZpY2VzIGZyb20gdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy4gVGhpcyBwcm92aWRlcyBhXG4gKiBjb25zaXN0ZW50IHdheSB0byBidWlsZCBESSBjb250YWluZXJzIGZvciBtaWNyb3NlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmYWN0b3J5ID0gbmV3IFB1cmVDb250YWluZXJGYWN0b3J5KCk7XG4gKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzLCBCaWxsaW5nVGllc10pO1xuICpcbiAqIC8vIENvbnRhaW5lciBub3cgaGFzIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoZSBUaWVzIGNsYXNzZXNcbiAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBQdXJlQ29udGFpbmVyRmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGllc1JlZ2lzdHJhcjogVGllc1JlZ2lzdHJhcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIgPSBuZXcgVGllc1JlZ2lzdHJhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFB1cmVDb250YWluZXIgZm9yIGEgbWljcm9zZXJ2aWNlIHdpdGggcmVnaXN0ZXJlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHQsXG4gICAqIHRoZW4gcmVnaXN0ZXJzIGFsbCBzZXJ2aWNlcyBmcm9tIHRoZSBwcm92aWRlZCBUaWVzIGNsYXNzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzQ2xhc3NlcyAtIEFycmF5IG9mIFRpZXMgY2xhc3MgY29uc3RydWN0b3JzIHRvIHJlZ2lzdGVyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyZWQgUHVyZUNvbnRhaW5lciB3aXRoIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRElDb250YWluZXJFcnJvciBpZiBjb250YWluZXIgY3JlYXRpb24gb3IgcmVnaXN0cmF0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVNaWNyb3NlcnZpY2VDb250YWluZXIoW1xuICAgKiAgIFBheW1lbnRzVGllcyxcbiAgICogICBCaWxsaW5nVGllcyxcbiAgICogICBDb25maWdUaWVzXG4gICAqIF0pO1xuICAgKlxuICAgKiAvLyBVc2UgdGhlIGNvbnRhaW5lciB0byByZXNvbHZlIHNlcnZpY2VzXG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBjb25zdCBjb25maWcgPSBjb250YWluZXIucnVuQ29uc3RhbnQoJ1BheW1lbnRzQ29uZmlnJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlTWljcm9zZXJ2aWNlQ29udGFpbmVyKHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBQdXJlQ29udGFpbmVyIHdpdGggc2luZ2xldG9uIHNjb3BlIGJ5IGRlZmF1bHRcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oe1xuICAgICAgICBkZWZhdWx0U2NvcGU6ICdTaW5nbGV0b24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGFsbCBUaWVzIGNsYXNzZXNcbiAgICAgIHRoaXMudGllc1JlZ2lzdHJhci5yZWdpc3RlclRpZXMoY29udGFpbmVyLCB0aWVzQ2xhc3Nlcyk7XG5cbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdtaWNyb3NlcnZpY2UnLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBtaWNyb3NlcnZpY2UgY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgUHVyZUNvbnRhaW5lciB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBBbGxvd3MgY3JlYXRpbmcgY29udGFpbmVycyB3aXRoIGN1c3RvbSBzY29wZSBzZXR0aW5ncyBvciBvdGhlciBvcHRpb25zLlxuICAgKiBTdGlsbCByZWdpc3RlcnMgdGhlIHByb3ZpZGVkIFRpZXMgY2xhc3Nlcy5cbiAgICpcbiAgICogQHBhcmFtIHRpZXNDbGFzc2VzIC0gQXJyYXkgb2YgVGllcyBjbGFzcyBjb25zdHJ1Y3RvcnMgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQdXJlQ29udGFpbmVyIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJucyBDb25maWd1cmVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIG9yIHJlZ2lzdHJhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgKiAgIFtQYXltZW50c1RpZXNdLFxuICAgKiAgIHsgZGVmYXVsdFNjb3BlOiAnVHJhbnNpZW50JyB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlQ3VzdG9tQ29udGFpbmVyKFxuICAgIHRpZXNDbGFzc2VzOiBUaWVzSW5zdGFuY2VbXSxcbiAgICBvcHRpb25zOiB7IGRlZmF1bHRTY29wZT86ICdTaW5nbGV0b24nIHwgJ1RyYW5zaWVudCcgfSA9IHt9LFxuICApOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KG9wdGlvbnMpO1xuICAgICAgdGhpcy50aWVzUmVnaXN0cmFyLnJlZ2lzdGVyVGllcyhjb250YWluZXIsIHRpZXNDbGFzc2VzKTtcbiAgICAgIHJldHVybiBjb250YWluZXI7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgICdjdXN0b20nLFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBjdXN0b20gY29udGFpbmVyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBhIGNvbnRhaW5lciBoYXMgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGRlbGVnYXRlcyB0byBUaWVzUmVnaXN0cmFyLnZhbGlkYXRlQ29udGFpbmVyKCkuXG4gICAqIFVzZWZ1bCBmb3IgZW5zdXJpbmcgY29udGFpbmVyIGludGVncml0eSBhZnRlciBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIHJlcXVpcmVkU2VydmljZXMgLSBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgbXVzdCBiZSByZWdpc3RlcmVkXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgYW55IHJlcXVpcmVkIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihbUGF5bWVudHNUaWVzXSk7XG4gICAqIGZhY3RvcnkudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBbJ1BheW1lbnRzU2VydmljZScsICdQYXltZW50c0NvbmZpZyddKTtcbiAgICogYGBgXG4gICAqL1xuICB2YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPiwgcmVxdWlyZWRTZXJ2aWNlczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLnRpZXNSZWdpc3RyYXIudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCByZXF1aXJlZFNlcnZpY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250YWluZXIgYW5kIHZhbGlkYXRlIGl0IGhhcyBhbGwgZXhwZWN0ZWQgc2VydmljZXMuXG4gICAqXG4gICAqIENvbWJpbmVzIGNvbnRhaW5lciBjcmVhdGlvbiB3aXRoIHZhbGlkYXRpb24gaW4gYSBzaW5nbGUgc3RlcC5cbiAgICogQXV0b21hdGljYWxseSBleHRyYWN0cyBleHBlY3RlZCBzZXJ2aWNlIG5hbWVzIGZyb20gVGllcyBjbGFzc2VzIGlmIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdGllc0NsYXNzZXMgLSBBcnJheSBvZiBUaWVzIGNsYXNzIGNvbnN0cnVjdG9ycyB0byByZWdpc3RlclxuICAgKiBAcGFyYW0gYWRkaXRpb25hbFNlcnZpY2VzIC0gQWRkaXRpb25hbCBzZXJ2aWNlIG5hbWVzIHRvIHZhbGlkYXRlIChvcHRpb25hbClcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIFB1cmVDb250YWluZXIgd2l0aCBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgY29udGFpbmVyIGNyZWF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlVmFsaWRhdGVkQ29udGFpbmVyKFtQYXltZW50c1RpZXNdKTtcbiAgICogLy8gQ29udGFpbmVyIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSBQYXltZW50c1RpZXNcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGVWYWxpZGF0ZWRDb250YWluZXIoXG4gICAgdGllc0NsYXNzZXM6IFRpZXNJbnN0YW5jZVtdLFxuICAgIGFkZGl0aW9uYWxTZXJ2aWNlczogc3RyaW5nW10gPSBbXSxcbiAgKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcih0aWVzQ2xhc3Nlcyk7XG5cbiAgICAvLyBFeHRyYWN0IHNlcnZpY2UgbmFtZXMgZnJvbSBUaWVzIGNsYXNzZXMgaWYgcG9zc2libGVcbiAgICBjb25zdCBleHBlY3RlZFNlcnZpY2VzID0gdGhpcy50aWVzUmVnaXN0cmFyLmV4dHJhY3RTZXJ2aWNlTmFtZXModGllc0NsYXNzZXMpO1xuICAgIGNvbnN0IGFsbFJlcXVpcmVkU2VydmljZXMgPSBbLi4uZXhwZWN0ZWRTZXJ2aWNlcywgLi4uYWRkaXRpb25hbFNlcnZpY2VzXTtcblxuICAgIGlmIChhbGxSZXF1aXJlZFNlcnZpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyLCBhbGxSZXF1aXJlZFNlcnZpY2VzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgeyBwdXJhYmxlIH0gZnJvbSAnQHV0aWxzL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFEZWZpbml0aW9uIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgeyBmdWxsV3JhcHBlciB9IGZyb20gJy4vaGFuZGxlci13cmFwcGVycyc7XG5pbXBvcnQgeyBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciB9IGZyb20gJy4vcnVudGltZS13ZWItbGFtYmRhLWhhbmRsZXInO1xuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIExhbWJkYSBoYW5kbGVycyB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIFRyYW5zZm9ybXMgdXNlci1wcm92aWRlZCBMYW1iZGEgZGVmaW5pdGlvbnMgaW50byBmdWxsIExhbWJkYSBoYW5kbGVyIGNsYXNzZXNcbiAqIHRoYXQgZXh0ZW5kIExhbWJkYUFwaSBhbmQgaW5jbHVkZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gdXNpbmdcbiAqIFB1cmVDb250YWluZXIuIEhhbmRsZXMgdGhlIGNvbXBsZXhpdHkgb2YgREkgcmVzb2x1dGlvbiBhbmQgZXJyb3Igd3JhcHBpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGZhY3RvcnkgPSBuZXcgTGFtYmRhSGFuZGxlckZhY3RvcnkoKTtcbiAqIGNvbnN0IGhhbmRsZXIgPSBmYWN0b3J5LmNyZWF0ZShsYW1iZGFEZWZpbml0aW9uLCBjb250YWluZXIpO1xuICpcbiAqIC8vIEhhbmRsZXIgaXMgcmVhZHkgdG8gYmUgaW52b2tlZCBieSBBV1MgTGFtYmRhIHJ1bnRpbWVcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIuaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gKiBgYGBcbiAqL1xuQHB1cmFibGUoKVxuZXhwb3J0IGNsYXNzIExhbWJkYUhhbmRsZXJGYWN0b3J5IHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcih7XG4gICAgICBzZXJ2aWNlTmFtZTogJ0Bjb3JlL3J1bnRpbWUtd2ViL2ZhY3RvcnkvbGFtYmRhLWhhbmRsZXItZmFjdG9yeScsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgTGFtYmRhIGhhbmRsZXIgY2xhc3MgaW5zdGFuY2UgZnJvbSBhIGRlZmluaXRpb24uXG4gICAqXG4gICAqIENyZWF0ZXMgYSBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciB0aGF0IGV4dGVuZHMgTGFtYmRhQXBpIGFuZCBpbmNsdWRlc1xuICAgKiBhdXRvbWF0aWMgZGVwZW5kZW5jeSBpbmplY3Rpb24uIFRoZSBoYW5kbGVyIHdpbGwgcmVzb2x2ZSBkZXBlbmRlbmNpZXNcbiAgICogZnJvbSB0aGUgcHJvdmlkZWQgY29udGFpbmVyIGFuZCBpbmplY3QgdGhlbSBpbnRvIHRoZSB1c2VyJ3MgaGFuZGxlciBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHJldHVybnMgTGFtYmRhIGhhbmRsZXIgY2xhc3MgaW5zdGFuY2UgcmVhZHkgZm9yIEFXUyBMYW1iZGEgcnVudGltZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxhbWJkYURlZjogTGFtYmRhRGVmaW5pdGlvbiA9IHtcbiAgICogICBpZDogJ2NoYXJnZScsXG4gICAqICAgdGllczogW1BheW1lbnRzU2VydmljZSwgQmlsbGluZ1NlcnZpY2VdLFxuICAgKiAgIGhhbmRsZXI6IChkZXBzKSA9PiBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHtcbiAgICogICAgIHJldHVybiBhd2FpdCBkZXBzLnBheW1lbnRzU2VydmljZS5wcm9jZXNzQ2hhcmdlKGV2ZW50LmJvZHkpO1xuICAgKiAgIH1cbiAgICogfTtcbiAgICpcbiAgICogY29uc3QgaGFuZGxlciA9IGZhY3RvcnkuY3JlYXRlKGxhbWJkYURlZiwgY29udGFpbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICBjcmVhdGUoZGVmaW5pdGlvbjogTGFtYmRhRGVmaW5pdGlvbiwgY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4pOiBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciB7XG4gICAgdGhpcy5sb2dnZXIuaW5mbygnQ3JlYXRpbmcgTGFtYmRhIGhhbmRsZXInLCB7XG4gICAgICBsYW1iZGFJZDogZGVmaW5pdGlvbi5pZCxcbiAgICAgIHNlcnZpY2U6IGRlZmluaXRpb24uc2VydmljZSxcbiAgICAgIGRlcGVuZGVuY3lDb3VudDogZGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUnVudGltZVdlYkxhbWJkYUhhbmRsZXIoZGVmaW5pdGlvbiwgY29udGFpbmVyLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmplY3QgZGVwZW5kZW5jaWVzIGZyb20gUHVyZUNvbnRhaW5lciB1c2luZyBjbGFzcyByZWZlcmVuY2VzLlxuICAgKlxuICAgKiBSZXNvbHZlcyBjbGFzcyByZWZlcmVuY2VzIHRvIHNlcnZpY2UgaW5zdGFuY2VzIHVzaW5nIFB1cmVDb250YWluZXIucnVuKClcbiAgICogd2l0aCBjbGFzcyBuYW1lcyBhcyBrZXlzLiBDb252ZXJ0cyBjbGFzcyBuYW1lcyB0byBjYW1lbENhc2UgZm9yIHRoZVxuICAgKiBkZXBlbmRlbmN5IG9iamVjdCBrZXlzIChlLmcuLCBQYXltZW50c1NlcnZpY2UgXHUyMTkyIHBheW1lbnRzU2VydmljZSkuXG4gICAqXG4gICAqIEBwYXJhbSB0aWVzIC0gQXJyYXkgb2YgY2xhc3MgY29uc3RydWN0b3JzIGZvciBkZXBlbmRlbmN5IGluamVjdGlvblxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2FtZWxDYXNlIGtleXMgY29udGFpbmluZyByZXNvbHZlZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBFcnJvciBpZiBhbnkgZGVwZW5kZW5jeSBjYW5ub3QgYmUgcmVzb2x2ZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0aWVzID0gW1BheW1lbnRzU2VydmljZSwgQmlsbGluZ1NlcnZpY2VdO1xuICAgKiBjb25zdCBkZXBzID0gZmFjdG9yeS5pbmplY3REZXBlbmRlbmNpZXModGllcywgY29udGFpbmVyKTtcbiAgICogLy8gUmVzdWx0OiB7IHBheW1lbnRzU2VydmljZTogUGF5bWVudHNTZXJ2aWNlLCBiaWxsaW5nU2VydmljZTogQmlsbGluZ1NlcnZpY2UgfVxuICAgKiBgYGBcbiAgICovXG4gIGluamVjdERlcGVuZGVuY2llcyhcbiAgICB0aWVzOiBBcnJheTxuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bj4sXG4gICAgY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBkZXBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBjbGFzc1JlZiBvZiB0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBVc2UgY2xhc3MgbmFtZSBhcyB0aGUgREkgdG9rZW4gKFB1cmVDb250YWluZXIgdXNlcyBzdHJpbmcga2V5cylcbiAgICAgICAgY29uc3QgdG9rZW4gPSBjbGFzc1JlZi5uYW1lO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGNvbnRhaW5lci5ydW4odG9rZW4pO1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnRvQ2FtZWxDYXNlKGNsYXNzUmVmLm5hbWUpO1xuICAgICAgICBkZXBzW2tleV0gPSBpbnN0YW5jZTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRGVwZW5kZW5jeSBpbmplY3RlZCcsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzUmVmLm5hbWUsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHRva2VuLFxuICAgICAgICB9KTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBpbmplY3QgZGVwZW5kZW5jeScsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzUmVmLm5hbWUsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGluamVjdCBkZXBlbmRlbmN5ICcke2NsYXNzUmVmLm5hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdEZXBlbmRlbmNpZXMgaW5qZWN0ZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgZGVwZW5kZW5jeUNvdW50OiBPYmplY3Qua2V5cyhkZXBzKS5sZW5ndGgsXG4gICAgICBkZXBlbmRlbmNpZXM6IE9iamVjdC5rZXlzKGRlcHMpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGRlcHM7XG4gIH1cblxuICAvKipcbiAgICogV3JhcCBhIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZy5cbiAgICpcbiAgICogQWRkcyBzdHJ1Y3R1cmVkIGxvZ2dpbmcgZm9yIExhbWJkYSBpbnZvY2F0aW9uIHN0YXJ0L2VuZCwgZXJyb3IgaGFuZGxpbmdcbiAgICogdGhhdCBjYXRjaGVzIGFuZCBsb2dzIGV4Y2VwdGlvbnMsIGFuZCB0aW1pbmcgaW5mb3JtYXRpb24uIFJldHVybnMgYVxuICAgKiB3cmFwcGVkIGhhbmRsZXIgdGhhdCBtYWludGFpbnMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBvcmlnaW5hbC5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBMYW1iZGEgbWV0YWRhdGEgZm9yIGxvZ2dpbmcgY29udGV4dFxuICAgKiBAcmV0dXJucyBXcmFwcGVkIGhhbmRsZXIgd2l0aCBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gZmFjdG9yeS53cmFwSGFuZGxlcihcbiAgICogICBhc3luYyAoZXZlbnQsIGNvbnRleHQpID0+IHsgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9OyB9LFxuICAgKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICB3cmFwSGFuZGxlcihcbiAgICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gICAgbWV0YWRhdGE6IHsgaWQ6IHN0cmluZzsgc2VydmljZTogc3RyaW5nIH0sXG4gICk6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGZ1bGxXcmFwcGVyKGhhbmRsZXIsIG1ldGFkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGNsYXNzIG5hbWUgdG8gY2FtZWxDYXNlIGZvciBkZXBlbmRlbmN5IG9iamVjdCBrZXlzLlxuICAgKlxuICAgKiBDb252ZXJ0cyBQYXNjYWxDYXNlIGNsYXNzIG5hbWVzIHRvIGNhbWVsQ2FzZSBwcm9wZXJ0eSBuYW1lcyBmb3IgdGhlXG4gICAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9iamVjdC4gVGhpcyBwcm92aWRlcyBhIGNvbnNpc3RlbnQgbmFtaW5nIGNvbnZlbnRpb25cbiAgICogZm9yIGluamVjdGVkIGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFBhc2NhbENhc2UgY2xhc3MgbmFtZVxuICAgKiBAcmV0dXJucyBjYW1lbENhc2UgcHJvcGVydHkgbmFtZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGZhY3RvcnkudG9DYW1lbENhc2UoJ1BheW1lbnRzU2VydmljZScpOyAvLyAncGF5bWVudHNTZXJ2aWNlJ1xuICAgKiBmYWN0b3J5LnRvQ2FtZWxDYXNlKCdCaWxsaW5nU2VydmljZScpOyAgLy8gJ2JpbGxpbmdTZXJ2aWNlJ1xuICAgKiBmYWN0b3J5LnRvQ2FtZWxDYXNlKCdDb25maWdTZXJ2aWNlJyk7ICAgLy8gJ2NvbmZpZ1NlcnZpY2UnXG4gICAqIGBgYFxuICAgKi9cbiAgcHJpdmF0ZSB0b0NhbWVsQ2FzZShjbGFzc05hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGNsYXNzTmFtZS5zbGljZSgxKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIExhbWJkYSBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBsb2dnaW5nIGFuZCBtb25pdG9yaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUNvbnRleHRJbmZvIHtcbiAgLyoqIExhbWJkYSBmdW5jdGlvbiBuYW1lICovXG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIExhbWJkYSBmdW5jdGlvbiB2ZXJzaW9uICovXG4gIGZ1bmN0aW9uVmVyc2lvbj86IHN0cmluZztcbiAgLyoqIEFXUyByZXF1ZXN0IElEICovXG4gIGF3c1JlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIFJlbWFpbmluZyB0aW1lIGluIG1pbGxpc2Vjb25kcyAqL1xuICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM/OiAoKSA9PiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgbGltaXQgaW4gTUIgKi9cbiAgbWVtb3J5TGltaXRJbk1CPzogc3RyaW5nO1xuICAvKiogTG9nIGdyb3VwIG5hbWUgKi9cbiAgbG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuICAvKiogTG9nIHN0cmVhbSBuYW1lICovXG4gIGxvZ1N0cmVhbU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGFuZGxlciBtZXRhZGF0YSBmb3IgbG9nZ2luZyBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJNZXRhZGF0YSB7XG4gIC8qKiBMYW1iZGEgaWRlbnRpZmllciAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBTZXJ2aWNlIG5hbWUgKGUuZy4sICdwYXltZW50cycpICovXG4gIHNlcnZpY2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFeGVjdXRpb24gbWV0cmljcyBjb2xsZWN0ZWQgZHVyaW5nIGhhbmRsZXIgaW52b2NhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25NZXRyaWNzIHtcbiAgLyoqIFN0YXJ0IHRpbWVzdGFtcCAqL1xuICBzdGFydFRpbWU6IG51bWJlcjtcbiAgLyoqIEVuZCB0aW1lc3RhbXAgKi9cbiAgZW5kVGltZTogbnVtYmVyO1xuICAvKiogRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzICovXG4gIGR1cmF0aW9uOiBudW1iZXI7XG4gIC8qKiBNZW1vcnkgdXNhZ2UgaW5mb3JtYXRpb24gKGlmIGF2YWlsYWJsZSkgKi9cbiAgbWVtb3J5VXNlZD86IG51bWJlcjtcbiAgLyoqIFJlbWFpbmluZyB0aW1lIHdoZW4gaGFuZGxlciBjb21wbGV0ZWQgKi9cbiAgcmVtYWluaW5nVGltZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMb2dnaW5nIHdyYXBwZXIgZm9yIExhbWJkYSBpbnZvY2F0aW9uIGxpZmVjeWNsZS5cbiAqXG4gKiBQcm92aWRlcyBzdHJ1Y3R1cmVkIGxvZ2dpbmcgZm9yIExhbWJkYSBpbnZvY2F0aW9uIHN0YXJ0L2VuZCB3aXRoXG4gKiBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGluY2x1ZGluZyB0aW1pbmcsIG1lbW9yeSB1c2FnZSwgYW5kIEFXU1xuICogTGFtYmRhIGNvbnRleHQgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciAtIE9yaWdpbmFsIExhbWJkYSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBIYW5kbGVyIG1ldGFkYXRhIGZvciBsb2dnaW5nIGNvbnRleHRcbiAqIEByZXR1cm5zIFdyYXBwZWQgaGFuZGxlciB3aXRoIGxvZ2dpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBsb2dnaW5nV3JhcHBlcihcbiAqICAgYXN5bmMgKGV2ZW50LCBjb250ZXh0KSA9PiB7IHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTsgfSxcbiAqICAgeyBpZDogJ3BheW1lbnRzLmNoYXJnZScsIHNlcnZpY2U6ICdwYXltZW50cycgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2luZ1dyYXBwZXIoXG4gIGhhbmRsZXI6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgbWV0YWRhdGE6IEhhbmRsZXJNZXRhZGF0YSxcbik6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGhhbmRsZXJMb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiBgQGxhbWJkYS8ke21ldGFkYXRhLnNlcnZpY2V9LyR7bWV0YWRhdGEuaWR9YCxcbiAgICBwZXJzaXN0ZW50TG9nQXR0cmlidXRlczoge1xuICAgICAgbGFtYmRhSWQ6IG1ldGFkYXRhLmlkLFxuICAgICAgc2VydmljZTogbWV0YWRhdGEuc2VydmljZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBjb250ZXh0SW5mbyA9IGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgaGFuZGxlckxvZ2dlci5pbmZvKCdMYW1iZGEgaW52b2NhdGlvbiBzdGFydGVkJywge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBhd3NSZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dEluZm8uZnVuY3Rpb25OYW1lLFxuICAgICAgZnVuY3Rpb25WZXJzaW9uOiBjb250ZXh0SW5mby5mdW5jdGlvblZlcnNpb24sXG4gICAgICBtZW1vcnlMaW1pdDogY29udGV4dEluZm8ubWVtb3J5TGltaXRJbk1CLFxuICAgICAgcmVtYWluaW5nVGltZTogY29udGV4dEluZm8uZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzPy4oKSxcbiAgICAgIGV2ZW50VHlwZTogZ2V0RXZlbnRUeXBlKGV2ZW50KSxcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVNZXRyaWNzKHN0YXJ0VGltZSwgY29udGV4dEluZm8pO1xuXG4gICAgICBoYW5kbGVyTG9nZ2VyLmluZm8oJ0xhbWJkYSBpbnZvY2F0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgcmVtYWluaW5nVGltZTogbWV0cmljcy5yZW1haW5pbmdUaW1lLFxuICAgICAgICBhd3NSZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgcmVzdWx0VHlwZTogdHlwZW9mIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBjYWxjdWxhdGVNZXRyaWNzKHN0YXJ0VGltZSwgY29udGV4dEluZm8pO1xuXG4gICAgICBoYW5kbGVyTG9nZ2VyLmVycm9yKCdMYW1iZGEgaW52b2NhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBkdXJhdGlvbjogbWV0cmljcy5kdXJhdGlvbixcbiAgICAgICAgcmVtYWluaW5nVGltZTogbWV0cmljcy5yZW1haW5pbmdUaW1lLFxuICAgICAgICBhd3NSZXF1ZXN0SWQ6IGNvbnRleHRJbmZvLmF3c1JlcXVlc3RJZCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IuY29uc3RydWN0b3IubmFtZSA6ICdVbmtub3duJyxcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogRXJyb3Igd3JhcHBlciBmb3IgTGFtYmRhIGhhbmRsZXIgZXJyb3IgaGFuZGxpbmcuXG4gKlxuICogQ2F0Y2hlcyBhbmQgbG9ncyBlcnJvcnMgd2l0aCBzdHJ1Y3R1cmVkIGluZm9ybWF0aW9uLCB0aGVuIHJldHVybnNcbiAqIGFwcHJvcHJpYXRlIGVycm9yIHJlc3BvbnNlcy4gSGFuZGxlcyBib3RoIHRocm93biBlcnJvcnMgYW5kIHJlamVjdGVkXG4gKiBwcm9taXNlcyBjb25zaXN0ZW50bHkuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgZXJyb3IgY29udGV4dFxuICogQHJldHVybnMgV3JhcHBlZCBoYW5kbGVyIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSBlcnJvcldyYXBwZXIoXG4gKiAgIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4geyByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07IH0sXG4gKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yV3JhcHBlcihcbiAgaGFuZGxlcjogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+LFxuICBtZXRhZGF0YTogSGFuZGxlck1ldGFkYXRhLFxuKTogKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgZXJyb3JMb2dnZXIgPSBsb2dnZXIoe1xuICAgIHNlcnZpY2VOYW1lOiBgQGxhbWJkYS8ke21ldGFkYXRhLnNlcnZpY2V9LyR7bWV0YWRhdGEuaWR9L2Vycm9yLWhhbmRsZXJgLFxuICAgIHBlcnNpc3RlbnRMb2dBdHRyaWJ1dGVzOiB7XG4gICAgICBsYW1iZGFJZDogbWV0YWRhdGEuaWQsXG4gICAgICBzZXJ2aWNlOiBtZXRhZGF0YS5zZXJ2aWNlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRJbmZvID0gZXh0cmFjdExhbWJkYUNvbnRleHQoY29udGV4dCk7XG4gICAgICBjb25zdCBlcnJvckRldGFpbHMgPSBleHRyYWN0RXJyb3JEZXRhaWxzKGVycm9yKTtcblxuICAgICAgZXJyb3JMb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCBlcnJvciBpbiBMYW1iZGEgaGFuZGxlcicsIHtcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGF3c1JlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICBmdW5jdGlvbk5hbWU6IGNvbnRleHRJbmZvLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgZXJyb3I6IGVycm9yRGV0YWlscy5tZXNzYWdlLFxuICAgICAgICBlcnJvclR5cGU6IGVycm9yRGV0YWlscy50eXBlLFxuICAgICAgICBzdGFjazogZXJyb3JEZXRhaWxzLnN0YWNrLFxuICAgICAgICBldmVudFR5cGU6IGdldEV2ZW50VHlwZShldmVudCksXG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yIEFQSSBHYXRld2F5IGV2ZW50cywgcmV0dXJuIHN0cnVjdHVyZWQgZXJyb3IgcmVzcG9uc2VcbiAgICAgIGlmIChpc0FwaUdhdGV3YXlFdmVudChldmVudCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnKicsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6ICdDb250ZW50LVR5cGUsQXV0aG9yaXphdGlvbicsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcyc6ICdHRVQsUE9TVCxQVVQsREVMRVRFLE9QVElPTlMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXJyb3I6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcgPyBlcnJvckRldGFpbHMubWVzc2FnZSA6ICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJyxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogY29udGV4dEluZm8uYXdzUmVxdWVzdElkLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciBldmVudCB0eXBlcywgcmUtdGhyb3cgdGhlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogVGltaW5nIHdyYXBwZXIgZm9yIExhbWJkYSBoYW5kbGVyIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuXG4gKlxuICogTWVhc3VyZXMgaGFuZGxlciBleGVjdXRpb24gdGltZSBhbmQgbWVtb3J5IHVzYWdlLCBwcm92aWRpbmdcbiAqIGRldGFpbGVkIHBlcmZvcm1hbmNlIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcgYW5kIG9wdGltaXphdGlvbi5cbiAqXG4gKiBAcGFyYW0gaGFuZGxlciAtIE9yaWdpbmFsIExhbWJkYSBoYW5kbGVyIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBIYW5kbGVyIG1ldGFkYXRhIGZvciB0aW1pbmcgY29udGV4dFxuICogQHJldHVybnMgV3JhcHBlZCBoYW5kbGVyIHdpdGggdGltaW5nIG1lYXN1cmVtZW50c1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB3cmFwcGVkSGFuZGxlciA9IHRpbWluZ1dyYXBwZXIoXG4gKiAgIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4geyByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07IH0sXG4gKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWluZ1dyYXBwZXIoXG4gIGhhbmRsZXI6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgbWV0YWRhdGE6IEhhbmRsZXJNZXRhZGF0YSxcbik6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHRpbWluZ0xvZ2dlciA9IGxvZ2dlcih7XG4gICAgc2VydmljZU5hbWU6IGBAbGFtYmRhLyR7bWV0YWRhdGEuc2VydmljZX0vJHttZXRhZGF0YS5pZH0vdGltaW5nYCxcbiAgICBwZXJzaXN0ZW50TG9nQXR0cmlidXRlczoge1xuICAgICAgbGFtYmRhSWQ6IG1ldGFkYXRhLmlkLFxuICAgICAgc2VydmljZTogbWV0YWRhdGEuc2VydmljZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gYXN5bmMgKGV2ZW50OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdGFydE1lbW9yeSA9IHByb2Nlc3MubWVtb3J5VXNhZ2UoKTtcbiAgICBjb25zdCBjb250ZXh0SW5mbyA9IGV4dHJhY3RMYW1iZGFDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgY29uc3QgbWV0cmljcyA9IGNhbGN1bGF0ZURldGFpbGVkTWV0cmljcyhzdGFydFRpbWUsIHN0YXJ0TWVtb3J5LCBjb250ZXh0SW5mbyk7XG5cbiAgICAgIHRpbWluZ0xvZ2dlci5pbmZvKCdIYW5kbGVyIGV4ZWN1dGlvbiBtZXRyaWNzJywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIGR1cmF0aW9uOiBtZXRyaWNzLmR1cmF0aW9uLFxuICAgICAgICBtZW1vcnlVc2VkOiBtZXRyaWNzLm1lbW9yeVVzZWQsXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgbWVtb3J5TGltaXQ6IGNvbnRleHRJbmZvLm1lbW9yeUxpbWl0SW5NQixcbiAgICAgICAgaGVhcFVzZWQ6IG1ldHJpY3MuaGVhcFVzZWQsXG4gICAgICAgIGhlYXBUb3RhbDogbWV0cmljcy5oZWFwVG90YWwsXG4gICAgICAgIGV4dGVybmFsOiBtZXRyaWNzLmV4dGVybmFsLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgbWV0cmljcyA9IGNhbGN1bGF0ZURldGFpbGVkTWV0cmljcyhzdGFydFRpbWUsIHN0YXJ0TWVtb3J5LCBjb250ZXh0SW5mbyk7XG5cbiAgICAgIHRpbWluZ0xvZ2dlci53YXJuKCdIYW5kbGVyIGV4ZWN1dGlvbiBmYWlsZWQgd2l0aCBtZXRyaWNzJywge1xuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgYXdzUmVxdWVzdElkOiBjb250ZXh0SW5mby5hd3NSZXF1ZXN0SWQsXG4gICAgICAgIGR1cmF0aW9uOiBtZXRyaWNzLmR1cmF0aW9uLFxuICAgICAgICBtZW1vcnlVc2VkOiBtZXRyaWNzLm1lbW9yeVVzZWQsXG4gICAgICAgIHJlbWFpbmluZ1RpbWU6IG1ldHJpY3MucmVtYWluaW5nVGltZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ29tYmluZWQgd3JhcHBlciB0aGF0IGFwcGxpZXMgbG9nZ2luZywgZXJyb3IgaGFuZGxpbmcsIGFuZCB0aW1pbmcuXG4gKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBhcHBsaWVzIGFsbCB0aHJlZSB3cmFwcGVycyBpbiB0aGUgY29ycmVjdFxuICogb3JkZXI6IHRpbWluZyAoaW5uZXJtb3N0KSBcdTIxOTIgZXJyb3IgaGFuZGxpbmcgXHUyMTkyIGxvZ2dpbmcgKG91dGVybW9zdCkuXG4gKlxuICogQHBhcmFtIGhhbmRsZXIgLSBPcmlnaW5hbCBMYW1iZGEgaGFuZGxlciBmdW5jdGlvblxuICogQHBhcmFtIG1ldGFkYXRhIC0gSGFuZGxlciBtZXRhZGF0YSBmb3IgYWxsIHdyYXBwZXJzXG4gKiBAcmV0dXJucyBGdWxseSB3cmFwcGVkIGhhbmRsZXIgd2l0aCBhbGwgZW5oYW5jZW1lbnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gZnVsbFdyYXBwZXIoXG4gKiAgIGFzeW5jIChldmVudCwgY29udGV4dCkgPT4geyByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07IH0sXG4gKiAgIHsgaWQ6ICdwYXltZW50cy5jaGFyZ2UnLCBzZXJ2aWNlOiAncGF5bWVudHMnIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZ1bGxXcmFwcGVyKFxuICBoYW5kbGVyOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4sXG4gIG1ldGFkYXRhOiBIYW5kbGVyTWV0YWRhdGEsXG4pOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAvLyBBcHBseSB3cmFwcGVycyBpbiBvcmRlcjogdGltaW5nIFx1MjE5MiBlcnJvciBcdTIxOTIgbG9nZ2luZ1xuICByZXR1cm4gbG9nZ2luZ1dyYXBwZXIoXG4gICAgZXJyb3JXcmFwcGVyKFxuICAgICAgdGltaW5nV3JhcHBlcihoYW5kbGVyLCBtZXRhZGF0YSksXG4gICAgICBtZXRhZGF0YSxcbiAgICApLFxuICAgIG1ldGFkYXRhLFxuICApO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgTGFtYmRhIGNvbnRleHQgaW5mb3JtYXRpb24gc2FmZWx5LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gTGFtYmRhIGNvbnRleHQgb2JqZWN0XG4gKiBAcmV0dXJucyBFeHRyYWN0ZWQgY29udGV4dCBpbmZvcm1hdGlvblxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdExhbWJkYUNvbnRleHQoY29udGV4dDogdW5rbm93bik6IExhbWJkYUNvbnRleHRJbmZvIHtcbiAgaWYgKCFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IGN0eCA9IGNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lOiB0eXBlb2YgY3R4LmZ1bmN0aW9uTmFtZSA9PT0gJ3N0cmluZycgPyBjdHguZnVuY3Rpb25OYW1lIDogdW5kZWZpbmVkLFxuICAgIGZ1bmN0aW9uVmVyc2lvbjogdHlwZW9mIGN0eC5mdW5jdGlvblZlcnNpb24gPT09ICdzdHJpbmcnID8gY3R4LmZ1bmN0aW9uVmVyc2lvbiA6IHVuZGVmaW5lZCxcbiAgICBhd3NSZXF1ZXN0SWQ6IHR5cGVvZiBjdHguYXdzUmVxdWVzdElkID09PSAnc3RyaW5nJyA/IGN0eC5hd3NSZXF1ZXN0SWQgOiB1bmRlZmluZWQsXG4gICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiB0eXBlb2YgY3R4LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBjdHguZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzIGFzICgpID0+IG51bWJlclxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgbWVtb3J5TGltaXRJbk1COiB0eXBlb2YgY3R4Lm1lbW9yeUxpbWl0SW5NQiA9PT0gJ3N0cmluZycgPyBjdHgubWVtb3J5TGltaXRJbk1CIDogdW5kZWZpbmVkLFxuICAgIGxvZ0dyb3VwTmFtZTogdHlwZW9mIGN0eC5sb2dHcm91cE5hbWUgPT09ICdzdHJpbmcnID8gY3R4LmxvZ0dyb3VwTmFtZSA6IHVuZGVmaW5lZCxcbiAgICBsb2dTdHJlYW1OYW1lOiB0eXBlb2YgY3R4LmxvZ1N0cmVhbU5hbWUgPT09ICdzdHJpbmcnID8gY3R4LmxvZ1N0cmVhbU5hbWUgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGJhc2ljIGV4ZWN1dGlvbiBtZXRyaWNzLlxuICpcbiAqIEBwYXJhbSBzdGFydFRpbWUgLSBIYW5kbGVyIHN0YXJ0IHRpbWVcbiAqIEBwYXJhbSBjb250ZXh0SW5mbyAtIExhbWJkYSBjb250ZXh0IGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyBCYXNpYyBleGVjdXRpb24gbWV0cmljc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlTWV0cmljcyhzdGFydFRpbWU6IG51bWJlciwgY29udGV4dEluZm86IExhbWJkYUNvbnRleHRJbmZvKTogRXhlY3V0aW9uTWV0cmljcyB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICByZXR1cm4ge1xuICAgIHN0YXJ0VGltZSxcbiAgICBlbmRUaW1lLFxuICAgIGR1cmF0aW9uOiBlbmRUaW1lIC0gc3RhcnRUaW1lLFxuICAgIHJlbWFpbmluZ1RpbWU6IGNvbnRleHRJbmZvLmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcz8uKCksXG4gIH07XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRldGFpbGVkIGV4ZWN1dGlvbiBtZXRyaWNzIGluY2x1ZGluZyBtZW1vcnkgdXNhZ2UuXG4gKlxuICogQHBhcmFtIHN0YXJ0VGltZSAtIEhhbmRsZXIgc3RhcnQgdGltZVxuICogQHBhcmFtIHN0YXJ0TWVtb3J5IC0gTWVtb3J5IHVzYWdlIGF0IHN0YXJ0XG4gKiBAcGFyYW0gY29udGV4dEluZm8gLSBMYW1iZGEgY29udGV4dCBpbmZvcm1hdGlvblxuICogQHJldHVybnMgRGV0YWlsZWQgZXhlY3V0aW9uIG1ldHJpY3NcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZURldGFpbGVkTWV0cmljcyhcbiAgc3RhcnRUaW1lOiBudW1iZXIsXG4gIHN0YXJ0TWVtb3J5OiBOb2RlSlMuTWVtb3J5VXNhZ2UsXG4gIGNvbnRleHRJbmZvOiBMYW1iZGFDb250ZXh0SW5mbyxcbik6IEV4ZWN1dGlvbk1ldHJpY3MgJiB7IGhlYXBVc2VkOiBudW1iZXI7IGhlYXBUb3RhbDogbnVtYmVyOyBleHRlcm5hbDogbnVtYmVyIH0ge1xuICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgZW5kTWVtb3J5ID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnRUaW1lLFxuICAgIGVuZFRpbWUsXG4gICAgZHVyYXRpb246IGVuZFRpbWUgLSBzdGFydFRpbWUsXG4gICAgbWVtb3J5VXNlZDogZW5kTWVtb3J5LmhlYXBVc2VkIC0gc3RhcnRNZW1vcnkuaGVhcFVzZWQsXG4gICAgcmVtYWluaW5nVGltZTogY29udGV4dEluZm8uZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzPy4oKSxcbiAgICBoZWFwVXNlZDogZW5kTWVtb3J5LmhlYXBVc2VkLFxuICAgIGhlYXBUb3RhbDogZW5kTWVtb3J5LmhlYXBUb3RhbCxcbiAgICBleHRlcm5hbDogZW5kTWVtb3J5LmV4dGVybmFsLFxuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgZXJyb3IgZGV0YWlscyBzYWZlbHkuXG4gKlxuICogQHBhcmFtIGVycm9yIC0gRXJyb3Igb2JqZWN0IG9yIHVua25vd24gdmFsdWVcbiAqIEByZXR1cm5zIFN0cnVjdHVyZWQgZXJyb3IgZGV0YWlsc1xuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEVycm9yRGV0YWlscyhlcnJvcjogdW5rbm93bik6IHsgbWVzc2FnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0YWNrPzogc3RyaW5nIH0ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgdHlwZTogZXJyb3IuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBTdHJpbmcoZXJyb3IpLFxuICAgIHR5cGU6ICdVbmtub3duJyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgTGFtYmRhIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBldmVudCAtIExhbWJkYSBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIEV2ZW50IHR5cGUgc3RyaW5nXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRFdmVudFR5cGUoZXZlbnQ6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoIWV2ZW50IHx8IHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9XG5cbiAgY29uc3QgZXZ0ID0gZXZlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaWYgKGV2dC5SZWNvcmRzICYmIEFycmF5LmlzQXJyYXkoZXZ0LlJlY29yZHMpKSB7XG4gICAgcmV0dXJuICdhd3MtZXZlbnQnO1xuICB9XG5cbiAgaWYgKGV2dC5odHRwTWV0aG9kIHx8IGV2dC5yZXF1ZXN0Q29udGV4dCkge1xuICAgIHJldHVybiAnYXBpLWdhdGV3YXknO1xuICB9XG5cbiAgaWYgKGV2dC5zb3VyY2UgPT09ICdhd3MuZXZlbnRzJykge1xuICAgIHJldHVybiAnZXZlbnRicmlkZ2UnO1xuICB9XG5cbiAgaWYgKGV2dC5ldmVudFNvdXJjZSA9PT0gJ2F3czpzMycpIHtcbiAgICByZXR1cm4gJ3MzJztcbiAgfVxuXG4gIHJldHVybiAnY3VzdG9tJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBldmVudCBpcyBhbiBBUEkgR2F0ZXdheSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBMYW1iZGEgZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyBUcnVlIGlmIEFQSSBHYXRld2F5IGV2ZW50XG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBpc0FwaUdhdGV3YXlFdmVudChldmVudDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWV2ZW50IHx8IHR5cGVvZiBldmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBldnQgPSBldmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuICEhKGV2dC5odHRwTWV0aG9kIHx8IGV2dC5yZXF1ZXN0Q29udGV4dCk7XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIsIFB1cmVDb250YWluZXIgfSBmcm9tICdAd29ya3RpZi91dGlscyc7XG5pbXBvcnQgeyBMYW1iZGFBcGkgfSBmcm9tICdAd29ya3RpZi9wdXJld3MnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGF3cy1sYW1iZGEtcG93ZXJ0b29scy9sb2dnZXInO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFJbnRlcmZhY2UgfSBmcm9tICdAYXdzLWxhbWJkYS1wb3dlcnRvb2xzL2NvbW1vbnMvdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMYW1iZGFEZWZpbml0aW9uIH0gZnJvbSAnQGxpYi9ydW50aW1lLXdlYi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYUhhbmRsZXJGYWN0b3J5IH0gZnJvbSAnLi9sYW1iZGEtaGFuZGxlci1mYWN0b3J5JztcblxuLyoqXG4gKiBSdW50aW1lIFdlYiBMYW1iZGEgaGFuZGxlciB0aGF0IGV4dGVuZHMgTGFtYmRhQXBpIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogVGhpcyBjbGFzcyBicmlkZ2VzIHRoZSBnYXAgYmV0d2VlbiB0aGUgZXhpc3RpbmcgUHVyZW5vdyBDb3JlIExhbWJkYUFwaVxuICogaW5mcmFzdHJ1Y3R1cmUgYW5kIHRoZSBuZXcgUnVudGltZSBXZWIgQ29yZSBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0uXG4gKiBJdCBleHRlbmRzIExhbWJkYUFwaSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdoaWxlIGFkZGluZyBhdXRvbWF0aWNcbiAqIERJIHJlc29sdXRpb24gYW5kIHVzZXIgaGFuZGxlciBpbnZvY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBoYW5kbGVyID0gbmV3IFJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyKGRlZmluaXRpb24sIGNvbnRhaW5lciwgZmFjdG9yeSk7XG4gKlxuICogLy8gQVdTIExhbWJkYSBydW50aW1lIGNhbGxzIHRoaXMgbWV0aG9kXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyLmhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lV2ViTGFtYmRhSGFuZGxlciBleHRlbmRzIExhbWJkYUFwaSBpbXBsZW1lbnRzIExhbWJkYUludGVyZmFjZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckhhbmRsZXI6IChldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgUnVudGltZSBXZWIgTGFtYmRhIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHBhcmFtIGNvbnRhaW5lciAtIFB1cmVDb250YWluZXIgd2l0aCByZWdpc3RlcmVkIHNlcnZpY2VzXG4gICAqIEBwYXJhbSBmYWN0b3J5IC0gRmFjdG9yeSBpbnN0YW5jZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIHdyYXBwaW5nXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlZmluaXRpb246IExhbWJkYURlZmluaXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZhY3Rvcnk6IExhbWJkYUhhbmRsZXJGYWN0b3J5LFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIoe1xuICAgICAgc2VydmljZU5hbWU6ICdAY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L3J1bnRpbWUtd2ViLWxhbWJkYS1oYW5kbGVyJyxcbiAgICAgIHBlcnNpc3RlbnRMb2dBdHRyaWJ1dGVzOiB7XG4gICAgICAgIGxhbWJkYUlkOiBkZWZpbml0aW9uLmlkLFxuICAgICAgICBzZXJ2aWNlOiBkZWZpbml0aW9uLnNlcnZpY2UsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gUHJlLXJlc29sdmUgdGhlIHVzZXIgaGFuZGxlciB3aXRoIGRlcGVuZGVuY2llc1xuICAgIHRoaXMudXNlckhhbmRsZXIgPSB0aGlzLmNyZWF0ZVVzZXJIYW5kbGVyKCk7XG5cbiAgICB0aGlzLmxvZ2dlci5pbmZvKCdSdW50aW1lV2ViTGFtYmRhSGFuZGxlciBpbml0aWFsaXplZCcsIHtcbiAgICAgIGxhbWJkYUlkOiBkZWZpbml0aW9uLmlkLFxuICAgICAgc2VydmljZTogZGVmaW5pdGlvbi5zZXJ2aWNlLFxuICAgICAgZGVwZW5kZW5jeUNvdW50OiBkZWZpbml0aW9uLnRpZXMubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gTGFtYmRhIGhhbmRsZXIgbWV0aG9kIGNhbGxlZCBieSBBV1MgTGFtYmRhIHJ1bnRpbWUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgQVdTIExhbWJkYSBydW50aW1lIGZvciBlYWNoIGludm9jYXRpb24uXG4gICAqIEl0IGluamVjdHMgZGVwZW5kZW5jaWVzLCBjYWxscyB0aGUgdXNlcidzIGhhbmRsZXIgZnVuY3Rpb24sIGFuZCByZXR1cm5zXG4gICAqIHRoZSByZXN1bHQuIEV4dGVuZHMgdGhlIGV4aXN0aW5nIExhbWJkYUFwaS5oYW5kbGVyKCkgbWV0aG9kIHRvIGFkZFxuICAgKiBkZXBlbmRlbmN5IGluamVjdGlvbiBzdXBwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBMYW1iZGEgZXZlbnQgb2JqZWN0XG4gICAqIEBwYXJhbSBjb250ZXh0IC0gTGFtYmRhIGNvbnRleHQgb2JqZWN0XG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBoYW5kbGVyIHJlc3VsdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFXUyBMYW1iZGEgcnVudGltZSBjYWxscyB0aGlzIGF1dG9tYXRpY2FsbHlcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgaGFuZGxlci5oYW5kbGVyKGFwaUdhdGV3YXlFdmVudCwgbGFtYmRhQ29udGV4dCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgaGFuZGxlcihldmVudDogdW5rbm93biwgY29udGV4dDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnSGFuZGxlciBpbnZvY2F0aW9uIHN0YXJ0ZWQnLCB7XG4gICAgICAgIGV2ZW50VHlwZTogdHlwZW9mIGV2ZW50LFxuICAgICAgICBjb250ZXh0VHlwZTogdHlwZW9mIGNvbnRleHQsXG4gICAgICB9KTtcblxuICAgICAgLy8gQ2FsbCB0aGUgcHJlLXJlc29sdmVkIHVzZXIgaGFuZGxlclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy51c2VySGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdIYW5kbGVyIGludm9jYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgcmVzdWx0VHlwZTogdHlwZW9mIHJlc3VsdCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdIYW5kbGVyIGludm9jYXRpb24gZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlLXRocm93IHRvIG1haW50YWluIExhbWJkYSBlcnJvciBoYW5kbGluZyBiZWhhdmlvclxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgdXNlciBoYW5kbGVyIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24gYW5kIHdyYXBwaW5nLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzXG4gICAqIGFuZCBjcmVhdGUgdGhlIHdyYXBwZWQgdXNlciBoYW5kbGVyLiBUaGUgcmVzdWx0IGlzIGNhY2hlZCBmb3IgcmV1c2VcbiAgICogYWNyb3NzIExhbWJkYSBpbnZvY2F0aW9ucyB0byBhdm9pZCByZXBlYXRlZCBESSByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBXcmFwcGVkIHVzZXIgaGFuZGxlciB3aXRoIGRlcGVuZGVuY2llcyBpbmplY3RlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVVc2VySGFuZGxlcigpOiAoZXZlbnQ6IHVua25vd24sIGNvbnRleHQ6IHVua25vd24pID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJbmplY3QgZGVwZW5kZW5jaWVzIHVzaW5nIHRoZSBmYWN0b3J5XG4gICAgICBjb25zdCBkZXBzID0gdGhpcy5mYWN0b3J5LmluamVjdERlcGVuZGVuY2llcyh0aGlzLmRlZmluaXRpb24udGllcywgdGhpcy5jb250YWluZXIpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRGVwZW5kZW5jaWVzIHJlc29sdmVkIGZvciB1c2VyIGhhbmRsZXInLCB7XG4gICAgICAgIGRlcGVuZGVuY3lLZXlzOiBPYmplY3Qua2V5cyhkZXBzKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHVzZXIgaGFuZGxlciBmcm9tIHRoZSBkZWZpbml0aW9uXG4gICAgICBjb25zdCByYXdVc2VySGFuZGxlciA9IHRoaXMuZGVmaW5pdGlvbi5oYW5kbGVyKGRlcHMpO1xuXG4gICAgICAvLyBXcmFwIHRoZSBoYW5kbGVyIHdpdGggbG9nZ2luZyBhbmQgZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gdGhpcy5mYWN0b3J5LndyYXBIYW5kbGVyKHJhd1VzZXJIYW5kbGVyLCB7XG4gICAgICAgIGlkOiB0aGlzLmRlZmluaXRpb24uaWQgfHwgJ3Vua25vd24nLFxuICAgICAgICBzZXJ2aWNlOiB0aGlzLmRlZmluaXRpb24uc2VydmljZSB8fCAndW5rbm93bicsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5sb2dnZXIuaW5mbygnVXNlciBoYW5kbGVyIGNyZWF0ZWQgYW5kIHdyYXBwZWQgc3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgIHJldHVybiB3cmFwcGVkSGFuZGxlcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGhhbmRsZXInLCB7XG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSB1c2VyIGhhbmRsZXIgZm9yIExhbWJkYSAnJHt0aGlzLmRlZmluaXRpb24uaWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExhbWJkYSBkZWZpbml0aW9uIHVzZWQgYnkgdGhpcyBoYW5kbGVyLlxuICAgKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIExhbWJkYSBkZWZpbml0aW9uIGZvciBkZWJ1Z2dpbmdcbiAgICogb3IgaW50cm9zcGVjdGlvbiBwdXJwb3Nlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIExhbWJkYSBkZWZpbml0aW9uXG4gICAqL1xuICBnZXREZWZpbml0aW9uKCk6IExhbWJkYURlZmluaXRpb24ge1xuICAgIHJldHVybiB0aGlzLmRlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBQdXJlQ29udGFpbmVyIHVzZWQgYnkgdGhpcyBoYW5kbGVyLlxuICAgKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIERJIGNvbnRhaW5lciBmb3IgZGVidWdnaW5nIG9yIGFkdmFuY2VkXG4gICAqIHVzZSBjYXNlcy4gR2VuZXJhbGx5IG5vdCBuZWVkZWQgaW4gbm9ybWFsIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIFB1cmVDb250YWluZXIgaW5zdGFuY2VcbiAgICovXG4gIGdldENvbnRhaW5lcigpOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgaGFuZGxlciBoYXMgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC5cbiAgICpcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgdXNlciBoYW5kbGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAqIGFuZCBpcyByZWFkeSBmb3IgaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBoYW5kbGVyIGlzIHJlYWR5LCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXNlckhhbmRsZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJ2ludmVyc2lmeSc7XG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHsgRElDb250YWluZXJFcnJvciwgTWlzc2luZ1NlcnZpY2VFcnJvciB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL2RpL2RpLWVycm9ycyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcblxuLyoqXG4gKiBSZWdpc3RyeSBmb3IgbWFuYWdpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZXMgYW5kIExhbWJkYS10by1zZXJ2aWNlIG1hcHBpbmdzLlxuICpcbiAqIFByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgcmVnaXN0cnkgZm9yIHN0b3JpbmcgYW5kIHJldHJpZXZpbmcgREkgY29udGFpbmVyc1xuICogZm9yIG1pY3Jvc2VydmljZXMsIGFsb25nIHdpdGggbWFwcGluZ3MgYmV0d2VlbiBMYW1iZGEgZnVuY3Rpb25zIGFuZCB0aGVpclxuICogcGFyZW50IHNlcnZpY2VzLiBUaGlzIGVuYWJsZXMgY2xlYW4gc2VwYXJhdGlvbiBvZiBjb25jZXJucyBhbmQgbWFrZXMgdGhlXG4gKiBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgbW9yZSBmb2N1c2VkIG9uIHByb2Nlc3NpbmcgbG9naWMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIGNvbnRhaW5lclxuICogcmVnaXN0cnkucmVnaXN0ZXJTZXJ2aWNlKCdwYXltZW50cycsIHBheW1lbnRzQ29udGFpbmVyKTtcbiAqXG4gKiAvLyBNYXAgTGFtYmRhIHRvIHNlcnZpY2VcbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnLCAncGF5bWVudHMnKTtcbiAqXG4gKiAvLyBSZXRyaWV2ZSBjb250YWluZXIgZm9yIExhbWJkYVxuICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAqIGBgYFxuICovXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGFpbmVyUmVnaXN0cnkge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcnM6IE1hcDxzdHJpbmcsIFB1cmVDb250YWluZXI8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGFtYmRhVG9TZXJ2aWNlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYURlZmluaXRpb25zOiBNYXA8c3RyaW5nLCBMYW1iZGFEZWZpbml0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHdpdGggaXRzIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogU3RvcmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc2VydmljZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgdG8gcHJldmVudFxuICAgKiBhY2NpZGVudGFsIG92ZXJ3cml0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBESUNvbnRhaW5lckVycm9yIGlmIHNlcnZpY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF5bWVudHNDb250YWluZXIgPSBuZXcgUHVyZUNvbnRhaW5lcjxzdHJpbmc+KCk7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyU2VydmljZSgncGF5bWVudHMnLCBwYXltZW50c0NvbnRhaW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVnaXN0ZXJTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbnRhaW5lcjogUHVyZUNvbnRhaW5lcjxzdHJpbmc+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29udGFpbmVycy5oYXMoc2VydmljZU5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRElDb250YWluZXJFcnJvcihcbiAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgIGBTZXJ2aWNlICcke3NlcnZpY2VOYW1lfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBVc2UgYSBkaWZmZXJlbnQgc2VydmljZSBuYW1lIG9yIGNsZWFyIHRoZSByZWdpc3RyeSBmaXJzdC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRhaW5lcnMuc2V0KHNlcnZpY2VOYW1lLCBjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgTGFtYmRhIGZ1bmN0aW9uIHdpdGggaXRzIHBhcmVudCBzZXJ2aWNlIGFuZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBMYW1iZGEgSUQgYW5kIGl0cyBwYXJlbnQgc2VydmljZSBuYW1lLFxuICAgKiBhbmQgc3RvcmVzIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgcnVudGltZSBsb29rdXAuXG4gICAqIFRoaXMgZW5hYmxlcyBsb29raW5nIHVwIHRoZSBjb3JyZWN0IERJIGNvbnRhaW5lciBmb3IgTGFtYmRhIGludm9jYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHBhcmVudCBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBMYW1iZGEgZGVmaW5pdGlvbiB3aXRoIGhhbmRsZXIgYW5kIGRlcGVuZGVuY2llc1xuICAgKiBAdGhyb3dzIERJQ29udGFpbmVyRXJyb3IgaWYgTGFtYmRhIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgcGFyZW50IHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5yZWdpc3RlckxhbWJkYSgncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzJywgY2hhcmdlRGVmaW5pdGlvbik7XG4gICAqIHJlZ2lzdHJ5LnJlZ2lzdGVyTGFtYmRhKCdwYXltZW50cy5yZWZ1bmQnLCAncGF5bWVudHMnLCByZWZ1bmREZWZpbml0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3RlckxhbWJkYShsYW1iZGFJZDogc3RyaW5nLCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBkZWZpbml0aW9uOiBMYW1iZGFEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcGFyZW50IHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lcnMuaGFzKHNlcnZpY2VOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBMYW1iZGEgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZFxuICAgIGlmICh0aGlzLmxhbWJkYVRvU2VydmljZS5oYXMobGFtYmRhSWQpKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1NlcnZpY2UgPSB0aGlzLmxhbWJkYVRvU2VydmljZS5nZXQobGFtYmRhSWQpO1xuICAgICAgdGhyb3cgbmV3IERJQ29udGFpbmVyRXJyb3IoXG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBgTGFtYmRhICcke2xhbWJkYUlkfScgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHRvIHNlcnZpY2UgJyR7ZXhpc3RpbmdTZXJ2aWNlfScuIFVzZSBhIGRpZmZlcmVudCBMYW1iZGEgSUQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGFUb1NlcnZpY2Uuc2V0KGxhbWJkYUlkLCBzZXJ2aWNlTmFtZSk7XG4gICAgdGhpcy5sYW1iZGFEZWZpbml0aW9ucy5zZXQobGFtYmRhSWQsIGRlZmluaXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgREkgY29udGFpbmVyIGZvciBhIHNlcnZpY2UgYnkgbmFtZS5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2VcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHNlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENvbnRhaW5lcihzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcnMuZ2V0KHNlcnZpY2VOYW1lKTtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3Ioc2VydmljZU5hbWUsICdzZXJ2aWNlIGNvbnRhaW5lcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIERJIGNvbnRhaW5lciBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBwYXJlbnQgc2VydmljZSBmb3IgdGhlIExhbWJkYSBJRCBhbmQgcmV0dXJucyB0aGVcbiAgICogY29ycmVzcG9uZGluZyBQdXJlQ29udGFpbmVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBvciBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc3QgcGF5bWVudHNTZXJ2aWNlID0gY29udGFpbmVyLnJ1bignUGF5bWVudHNTZXJ2aWNlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBQdXJlQ29udGFpbmVyPHN0cmluZz4ge1xuICAgIGNvbnN0IHNlcnZpY2VOYW1lID0gdGhpcy5nZXRMYW1iZGFTZXJ2aWNlKGxhbWJkYUlkKTtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250YWluZXIoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGFyZW50IHNlcnZpY2UgbmFtZSBmb3IgYSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIExvb2tzIHVwIHRoZSBzZXJ2aWNlIG5hbWUgdGhhdCBvd25zIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIGlzIG5vdCByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2VydmljZU5hbWUgPSByZWdpc3RyeS5nZXRMYW1iZGFTZXJ2aWNlKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coc2VydmljZU5hbWUpOyAvLyAncGF5bWVudHMnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhU2VydmljZShsYW1iZGFJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZXJ2aWNlTmFtZSA9IHRoaXMubGFtYmRhVG9TZXJ2aWNlLmdldChsYW1iZGFJZCk7XG4gICAgaWYgKCFzZXJ2aWNlTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IE1pc3NpbmdTZXJ2aWNlRXJyb3IobGFtYmRhSWQsICdsYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiBzZXJ2aWNlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciBhIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBzdG9yZWQgTGFtYmRhIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBNaXNzaW5nU2VydmljZUVycm9yIGlmIExhbWJkYSBpcyBub3QgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRlZmluaXRpb24gPSByZWdpc3RyeS5nZXRMYW1iZGFEZWZpbml0aW9uKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2coZGVmaW5pdGlvbi50aWVzKTsgLy8gW1BheW1lbnRzU2VydmljZSwgQmlsbGluZ1NlcnZpY2VdXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhRGVmaW5pdGlvbihsYW1iZGFJZDogc3RyaW5nKTogTGFtYmRhRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgZGVmaW5pdGlvbiA9IHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuZ2V0KGxhbWJkYUlkKTtcbiAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBNaXNzaW5nU2VydmljZUVycm9yKGxhbWJkYUlkLCAnbGFtYmRhIGRlZmluaXRpb25zJyk7XG4gICAgfVxuICAgIHJldHVybiBkZWZpbml0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2VydmljZSBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2VydmljZSBpcyByZWdpc3RlcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKHJlZ2lzdHJ5Lmhhc1NlcnZpY2UoJ3BheW1lbnRzJykpIHtcbiAgICogICBjb25zdCBjb250YWluZXIgPSByZWdpc3RyeS5nZXRDb250YWluZXIoJ3BheW1lbnRzJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBoYXNTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb250YWluZXJzLmhhcyhzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBMYW1iZGEgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgaXMgcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChyZWdpc3RyeS5oYXNMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpKSB7XG4gICAqICAgY29uc3QgY29udGFpbmVyID0gcmVnaXN0cnkuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGhhc0xhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmhhcyhsYW1iZGFJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIHNlcnZpY2UgbmFtZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNlcnZpY2UgbmFtZXMgdGhhdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNlcnZpY2VzID0gcmVnaXN0cnkuZ2V0U2VydmljZU5hbWVzKCk7XG4gICAqIGNvbnNvbGUubG9nKHNlcnZpY2VzKTsgLy8gWydwYXltZW50cycsICd1c2VycycsICdub3RpZmljYXRpb25zJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRTZXJ2aWNlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY29udGFpbmVycy5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBMYW1iZGEgSURzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBMYW1iZGEgSURzIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBsYW1iZGFzID0gcmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCk7XG4gICAqIGNvbnNvbGUubG9nKGxhbWJkYXMpOyAvLyBbJ3BheW1lbnRzLmNoYXJnZScsICdwYXltZW50cy5yZWZ1bmQnLCAndXNlcnMuY3JlYXRlJ11cbiAgICogYGBgXG4gICAqL1xuICBnZXRMYW1iZGFJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubGFtYmRhVG9TZXJ2aWNlLmtleXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBMYW1iZGEgSURzIGZvciBhIHNwZWNpZmljIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyBiZWxvbmdpbmcgdG8gdGhlIHNlcnZpY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwYXltZW50TGFtYmRhcyA9IHJlZ2lzdHJ5LmdldExhbWJkYXNGb3JTZXJ2aWNlKCdwYXltZW50cycpO1xuICAgKiBjb25zb2xlLmxvZyhwYXltZW50TGFtYmRhcyk7IC8vIFsncGF5bWVudHMuY2hhcmdlJywgJ3BheW1lbnRzLnJlZnVuZCddXG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TGFtYmRhc0ZvclNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsYW1iZGFzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbGFtYmRhSWQsIHNlcnZpY2VdIG9mIHRoaXMubGFtYmRhVG9TZXJ2aWNlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHNlcnZpY2UgPT09IHNlcnZpY2VOYW1lKSB7XG4gICAgICAgIGxhbWJkYXMucHVzaChsYW1iZGFJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbWJkYXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2VydmljZSBhbmQgYWxsIGl0cyBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgdGhlIHNlcnZpY2UgY29udGFpbmVyIGFuZCBhbGwgTGFtYmRhLXRvLXNlcnZpY2UgbWFwcGluZ3NcbiAgICogZm9yIExhbWJkYXMgYmVsb25naW5nIHRvIHRoaXMgc2VydmljZS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byByZW1vdmVcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzZXJ2aWNlIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlU2VydmljZSgncGF5bWVudHMnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzJyB3YXMgcmVnaXN0ZXJlZFxuICAgKiBgYGBcbiAgICovXG4gIHJlbW92ZVNlcnZpY2Uoc2VydmljZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV4aXN0ZWQgPSB0aGlzLmNvbnRhaW5lcnMuZGVsZXRlKHNlcnZpY2VOYW1lKTtcblxuICAgIGlmIChleGlzdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgYWxsIExhbWJkYSBtYXBwaW5ncyBmb3IgdGhpcyBzZXJ2aWNlXG4gICAgICBjb25zdCBsYW1iZGFzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtsYW1iZGFJZCwgc2VydmljZV0gb2YgdGhpcy5sYW1iZGFUb1NlcnZpY2UuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChzZXJ2aWNlID09PSBzZXJ2aWNlTmFtZSkge1xuICAgICAgICAgIGxhbWJkYXNUb1JlbW92ZS5wdXNoKGxhbWJkYUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxhbWJkYUlkIG9mIGxhbWJkYXNUb1JlbW92ZSkge1xuICAgICAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleGlzdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIExhbWJkYSBtYXBwaW5nLlxuICAgKlxuICAgKiBSZW1vdmVzIHRoZSBMYW1iZGEtdG8tc2VydmljZSBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gTGFtYmRhIElELlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIHBhcmVudCBzZXJ2aWNlIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIFRydWUgaWYgTGFtYmRhIHdhcyByZW1vdmVkLCBmYWxzZSBpZiBpdCBkaWRuJ3QgZXhpc3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdmVkID0gcmVnaXN0cnkucmVtb3ZlTGFtYmRhKCdwYXltZW50cy5jaGFyZ2UnKTtcbiAgICogY29uc29sZS5sb2cocmVtb3ZlZCk7IC8vIHRydWUgaWYgJ3BheW1lbnRzLmNoYXJnZScgd2FzIHJlZ2lzdGVyZWRcbiAgICogYGBgXG4gICAqL1xuICByZW1vdmVMYW1iZGEobGFtYmRhSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhbWJkYVRvU2VydmljZS5kZWxldGUobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFuZCBMYW1iZGEgbWFwcGluZ3MuXG4gICAqXG4gICAqIFJlbW92ZXMgYWxsIGNvbnRhaW5lcnMsIG1hcHBpbmdzLCBhbmQgZGVmaW5pdGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIHJlaW5pdGlhbGl6aW5nIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyeS5jbGVhcigpO1xuICAgKiBjb25zb2xlLmxvZyhyZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKSk7IC8vIFtdXG4gICAqIGNvbnNvbGUubG9nKHJlZ2lzdHJ5LmdldExhbWJkYUlkcygpKTsgLy8gW11cbiAgICogYGBgXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRhaW5lcnMuY2xlYXIoKTtcbiAgICB0aGlzLmxhbWJkYVRvU2VydmljZS5jbGVhcigpO1xuICAgIHRoaXMubGFtYmRhRGVmaW5pdGlvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVnaXN0cnkgc3RhdGlzdGljcy5cbiAgICpcbiAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHNlcnZpY2UgYW5kIExhbWJkYSBjb3VudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0cyA9IHJlZ2lzdHJ5LmdldFN0YXRzKCk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRzKTsgLy8geyBzZXJ2aWNlczogMywgbGFtYmRhczogOCB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdHMoKTogeyBzZXJ2aWNlczogbnVtYmVyOyBsYW1iZGFzOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiB0aGlzLmNvbnRhaW5lcnMuc2l6ZSxcbiAgICAgIGxhbWJkYXM6IHRoaXMubGFtYmRhVG9TZXJ2aWNlLnNpemUsXG4gICAgfTtcbiAgfVxufVxuIiwgIi8qXG4gKiBFbGFzdGljIExpY2Vuc2UgMi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjVcdTIwMTNwcmVzZW50IFJhbWFuIE1hcm96YXUsIFdvcmsgVGFyZ2V0IEluc2lnaHQgRnVuY3Rpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb250YWN0OiByYW1hbkB3b3JrdGlmLmNvbVxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaWNlbnNlZCBXb3JrOiB3b3JrdGlmLnB1cmVub3cuY2RrIDx3b3JrdGlmX3B1cmVub3dfY2RrPi5cbiAqIFVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdvdmVybmVkIGJ5IHRoZSBFbGFzdGljIExpY2Vuc2UgMi4wOyBzZWUgdGhlIExJQ0VOU0UgZmlsZVxuICogb3IgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9saWNlbnNpbmcvZWxhc3RpYy1saWNlbnNlIGZvciBkZXRhaWxzLlxuICpcbiAqIFJlLWxpY2Vuc2luZyBub3RpY2U6XG4gKiAgIFRoaXMgZmlsZSB3YXMgcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgQnVzaW5lc3MgU291cmNlIExpY2Vuc2UgMS4xIChCVVNMLTEuMSkuXG4gKiAgIEFzIG9mIDIwMjUtMDktMjIsIGl0IGlzIHJlLWxpY2Vuc2VkIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHsgUHVyZUNvbnRhaW5lciB9IGZyb20gJ0B3b3JrdGlmL3V0aWxzJztcbmltcG9ydCB7IHB1cmFibGUgfSBmcm9tICdAdXRpbHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgdHlwZSB7IExhbWJkYURlZmluaXRpb24sIE1pY3Jvc2VydmljZURlZmluaXRpb24gfSBmcm9tICdAbGliL3J1bnRpbWUtd2ViL3R5cGVzJztcbmltcG9ydCB7IFB1cmVDb250YWluZXJGYWN0b3J5IH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvZGkvcHVyZS1jb250YWluZXItZmFjdG9yeSc7XG5pbXBvcnQgeyBDb250YWluZXJSZWdpc3RyeSB9IGZyb20gJ0Bjb3JlL3J1bnRpbWUtd2ViL3JlZ2lzdHJhci9jb250YWluZXItcmVnaXN0cnknO1xuXG4vKipcbiAqIE1pY3Jvc2VydmljZSByZWdpc3RyYXIgZm9yIG1hbmFnaW5nIERJIGNvbnRhaW5lcnMgYW5kIExhbWJkYSBtYXBwaW5ncy5cbiAqXG4gKiBQcm9jZXNzZXMgbWljcm9zZXJ2aWNlIGRlZmluaXRpb25zIHRvIGNyZWF0ZSBQdXJlQ29udGFpbmVyIGluc3RhbmNlcyBhbmRcbiAqIG1haW50YWlucyBtYXBwaW5ncyBiZXR3ZWVuIExhbWJkYSBmdW5jdGlvbnMgYW5kIHRoZWlyIHBhcmVudCBzZXJ2aWNlcy5cbiAqIFRoaXMgZW5hYmxlcyB0aGUgZnJhbWV3b3JrIHRvIHJlc29sdmUgdGhlIGNvcnJlY3QgREkgY29udGFpbmVyIGZvciBlYWNoXG4gKiBMYW1iZGEgaW52b2NhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVnaXN0cmFyID0gbmV3IE1pY3Jvc2VydmljZVJlZ2lzdHJhcigpO1xuICpcbiAqIC8vIFByb2Nlc3MgYSBtaWNyb3NlcnZpY2UgZGVmaW5pdGlvblxuICogcmVnaXN0cmFyLnByb2Nlc3NTZXJ2aWNlKCdwYXltZW50cycsIHtcbiAqICAgdGllczogW1BheW1lbnRzVGllc10sXG4gKiAgIGxhbWJkYXM6IFtjaGFyZ2VIYW5kbGVyLCByZWZ1bmRIYW5kbGVyXVxuICogfSk7XG4gKlxuICogLy8gR2V0IGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBMYW1iZGFcbiAqIGNvbnN0IGNvbnRhaW5lciA9IHJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEoJ3BheW1lbnRzLmNoYXJnZScpO1xuICogYGBgXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lckZhY3Rvcnk6IFB1cmVDb250YWluZXJGYWN0b3J5O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5OiBDb250YWluZXJSZWdpc3RyeTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lckZhY3RvcnkgPSBuZXcgUHVyZUNvbnRhaW5lckZhY3RvcnkoKTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IENvbnRhaW5lclJlZ2lzdHJ5KCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhIG1pY3Jvc2VydmljZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgaXRzIERJIGNvbnRhaW5lci5cbiAgICpcbiAgICogQ3JlYXRlcyBhIFB1cmVDb250YWluZXIgZnJvbSB0aGUgVGllcyBjbGFzc2VzIGFuZCBwcm9jZXNzZXMgYWxsIExhbWJkYVxuICAgKiBkZWZpbml0aW9ucyB0byBlc3RhYmxpc2ggc2VydmljZSBtYXBwaW5ncy4gQXV0by1zZXRzIHRoZSBzZXJ2aWNlIHByb3BlcnR5XG4gICAqIG9uIGVhY2ggTGFtYmRhIGRlZmluaXRpb24gYW5kIGdlbmVyYXRlcyBMYW1iZGEgSURzLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2VcbiAgICogQHBhcmFtIGRlZmluaXRpb24gLSBNaWNyb3NlcnZpY2UgZGVmaW5pdGlvbiB3aXRoIFRpZXMgYW5kIExhbWJkYXNcbiAgICogQHRocm93cyBFcnJvciBpZiBzZXJ2aWNlIHByb2Nlc3NpbmcgZmFpbHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiByZWdpc3RyYXIucHJvY2Vzc1NlcnZpY2UoJ3BheW1lbnRzJywge1xuICAgKiAgIHRpZXM6IFtQYXltZW50c1RpZXMsIEJpbGxpbmdUaWVzXSxcbiAgICogICBsYW1iZGFzOiBbXG4gICAqICAgICB7XG4gICAqICAgICAgIGlkOiAnY2hhcmdlJyxcbiAgICogICAgICAgdGllczogW1BheW1lbnRzU2VydmljZV0sXG4gICAqICAgICAgIGhhbmRsZXI6IChkZXBzKSA9PiBhc3luYyAoZXZlbnQpID0+IHsgLi4uIH1cbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHByb2Nlc3NTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGRlZmluaXRpb246IE1pY3Jvc2VydmljZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgLy8gMS4gQnVpbGQgUHVyZUNvbnRhaW5lciBmcm9tIFRpZXMgY2xhc3Nlc1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb250YWluZXJGYWN0b3J5LmNyZWF0ZU1pY3Jvc2VydmljZUNvbnRhaW5lcihkZWZpbml0aW9uLnRpZXMpO1xuICAgICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlclNlcnZpY2Uoc2VydmljZU5hbWUsIGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIDIuIFByb2Nlc3MgZWFjaCBMYW1iZGEgZGVmaW5pdGlvblxuICAgICAgZm9yIChjb25zdCBsYW1iZGFEZWYgb2YgZGVmaW5pdGlvbi5sYW1iZGFzKSB7XG4gICAgICAgIC8vIEF1dG8tc2V0IHNlcnZpY2UgcmVmZXJlbmNlXG4gICAgICAgIGxhbWJkYURlZi5zZXJ2aWNlID0gc2VydmljZU5hbWU7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgTGFtYmRhIElEIGFuZCBjcmVhdGUgbWFwcGluZ1xuICAgICAgICBjb25zdCBsYW1iZGFJZCA9IHRoaXMuZ2VuZXJhdGVMYW1iZGFJZChzZXJ2aWNlTmFtZSwgbGFtYmRhRGVmKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5yZWdpc3RlckxhbWJkYShsYW1iZGFJZCwgc2VydmljZU5hbWUsIGxhbWJkYURlZik7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFZhbGlkYXRlIGNvbnRhaW5lciAob3B0aW9uYWwgLSBjYW4gYmUgZW5hYmxlZCBmb3IgZGVidWdnaW5nKVxuICAgICAgLy8gdGhpcy52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIGRlZmluaXRpb24pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBwcm9jZXNzIG1pY3Jvc2VydmljZSAnJHtzZXJ2aWNlTmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBESSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgTGFtYmRhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBMb29rcyB1cCB0aGUgc2VydmljZSBuYW1lIGZvciB0aGUgTGFtYmRhIElEIGFuZCByZXR1cm5zIHRoZVxuICAgKiBjb3JyZXNwb25kaW5nIFB1cmVDb250YWluZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgUHVyZUNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIExhbWJkYSdzIG1pY3Jvc2VydmljZVxuICAgKiBAdGhyb3dzIE1pc3NpbmdTZXJ2aWNlRXJyb3IgaWYgTGFtYmRhIG9yIHNlcnZpY2Ugbm90IGZvdW5kXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29udGFpbmVyID0gcmVnaXN0cmFyLmdldENvbnRhaW5lckZvckxhbWJkYSgncGF5bWVudHMuY2hhcmdlJyk7XG4gICAqIGNvbnN0IHBheW1lbnRzU2VydmljZSA9IGNvbnRhaW5lci5ydW4oJ1BheW1lbnRzU2VydmljZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogUHVyZUNvbnRhaW5lcjxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgTGFtYmRhIElEIGZyb20gc2VydmljZSBuYW1lIGFuZCBMYW1iZGEgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogVXNlcyBleHBsaWNpdCBJRCBpZiBwcm92aWRlZCwgb3RoZXJ3aXNlIGV4dHJhY3RzIGZyb20gaGFuZGxlciBmdW5jdGlvbiBuYW1lLlxuICAgKiBUaGUgZmluYWwgSUQgZm9ybWF0IGlzIGFsd2F5cyAne3NlcnZpY2VOYW1lfS57bGFtYmRhSWR9Jy5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgcGFyZW50IG1pY3Jvc2VydmljZVxuICAgKiBAcGFyYW0gZGVmaW5pdGlvbiAtIExhbWJkYSBkZWZpbml0aW9uXG4gICAqIEByZXR1cm5zIEZ1bGwgTGFtYmRhIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBleHBsaWNpdCBJRFxuICAgKiBnZW5lcmF0ZUxhbWJkYUlkKCdwYXltZW50cycsIHsgaWQ6ICdjaGFyZ2UnLCAuLi4gfSkgLy8gXHUyMTkyICdwYXltZW50cy5jaGFyZ2UnXG4gICAqXG4gICAqIC8vIFdpdGhvdXQgZXhwbGljaXQgSUQgKGV4dHJhY3RzIGZyb20gaGFuZGxlciBuYW1lKVxuICAgKiBnZW5lcmF0ZUxhbWJkYUlkKCdwYXltZW50cycsIHsgaGFuZGxlcjogZnVuY3Rpb24gcHJvY2Vzc1BheW1lbnQoKSB7Li4ufSB9KSAvLyBcdTIxOTIgJ3BheW1lbnRzLnByb2Nlc3NQYXltZW50J1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlTGFtYmRhSWQoc2VydmljZU5hbWU6IHN0cmluZywgZGVmaW5pdGlvbjogTGFtYmRhRGVmaW5pdGlvbik6IHN0cmluZyB7XG4gICAgaWYgKGRlZmluaXRpb24uaWQpIHtcbiAgICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0uJHtkZWZpbml0aW9uLmlkfWA7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBmcm9tIGhhbmRsZXIgZnVuY3Rpb24gbmFtZVxuICAgIGNvbnN0IGhhbmRsZXJOYW1lID0gZGVmaW5pdGlvbi5oYW5kbGVyLm5hbWUgfHwgJ2hhbmRsZXInO1xuICAgIHJldHVybiBgJHtzZXJ2aWNlTmFtZX0uJHtoYW5kbGVyTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBzZXJ2aWNlIG5hbWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBzZXJ2aWNlIG5hbWVzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3NlZFxuICAgKi9cbiAgZ2V0U2VydmljZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRTZXJ2aWNlTmFtZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgTGFtYmRhIElEcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyB0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWRcbiAgICovXG4gIGdldExhbWJkYUlkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhSWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZXJ2aWNlIG5hbWUgZm9yIGEgTGFtYmRhIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRFxuICAgKiBAcmV0dXJucyBTZXJ2aWNlIG5hbWUgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0U2VydmljZUZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhU2VydmljZShsYW1iZGFJZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgc2VydmljZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBUcnVlIGlmIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzU2VydmljZShzZXJ2aWNlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuaGFzU2VydmljZShzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBMYW1iZGEgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxhbWJkYUlkIC0gRnVsbCBMYW1iZGEgSUQgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBMYW1iZGEgaXMgcmVnaXN0ZXJlZFxuICAgKi9cbiAgaGFzTGFtYmRhKGxhbWJkYUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5oYXNMYW1iZGEobGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgTGFtYmRhIGRlZmluaXRpb25zIGZvciBhIHNlcnZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIE5hbWUgb2YgdGhlIHNlcnZpY2VcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTGFtYmRhIElEcyBmb3IgdGhlIHNlcnZpY2VcbiAgICovXG4gIGdldExhbWJkYXNGb3JTZXJ2aWNlKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0TGFtYmRhc0ZvclNlcnZpY2Uoc2VydmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIHNlcnZpY2VzIGFuZCBjb250YWluZXJzLlxuICAgKlxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiByZWluaXRpYWxpemluZyB0aGUgcmVnaXN0cmFyLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3RyeS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBMYW1iZGEgZGVmaW5pdGlvbiBieSBJRC5cbiAgICpcbiAgICogUmV0cmlldmVzIHRoZSBMYW1iZGEgZGVmaW5pdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBMYW1iZGEgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb24gd2l0aCBoYW5kbGVyIGFuZCBkZXBlbmRlbmNpZXNcbiAgICogQHRocm93cyBFcnJvciBpZiBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmRcbiAgICovXG4gIGdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQ6IHN0cmluZyk6IExhbWJkYURlZmluaXRpb24ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBjb250YWluZXIgcmVnaXN0cnkuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgQ29udGFpbmVyUmVnaXN0cnkgZm9yIGFkdmFuY2VkIHVzZSBjYXNlcy5cbiAgICpcbiAgICogQHJldHVybnMgQ29udGFpbmVyUmVnaXN0cnkgaW5zdGFuY2VcbiAgICovXG4gIGdldFJlZ2lzdHJ5KCk6IENvbnRhaW5lclJlZ2lzdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGNvbnRhaW5lciBoYXMgYWxsIHJlcXVpcmVkIHNlcnZpY2VzIChwcml2YXRlIGhlbHBlcikuXG4gICAqXG4gICAqIFRoaXMgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ1dCBjYW4gYmUgZW5hYmxlZCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQ29udGFpbmVyIHRvIHZhbGlkYXRlXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIC0gTWljcm9zZXJ2aWNlIGRlZmluaXRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVDb250YWluZXIoY29udGFpbmVyOiBQdXJlQ29udGFpbmVyPHN0cmluZz4sIGRlZmluaXRpb246IE1pY3Jvc2VydmljZURlZmluaXRpb24pOiB2b2lkIHtcbiAgICAvLyBFeHRyYWN0IGFsbCBzZXJ2aWNlIGRlcGVuZGVuY2llcyBmcm9tIExhbWJkYSBkZWZpbml0aW9uc1xuICAgIGNvbnN0IHJlcXVpcmVkU2VydmljZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgbGFtYmRhRGVmIG9mIGRlZmluaXRpb24ubGFtYmRhcykge1xuICAgICAgZm9yIChjb25zdCB0aWVDbGFzcyBvZiBsYW1iZGFEZWYudGllcykge1xuICAgICAgICByZXF1aXJlZFNlcnZpY2VzLmFkZCh0aWVDbGFzcy5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IGFsbCByZXF1aXJlZCBzZXJ2aWNlcyBhcmUgcmVnaXN0ZXJlZFxuICAgIHRoaXMuY29udGFpbmVyRmFjdG9yeS52YWxpZGF0ZUNvbnRhaW5lcihjb250YWluZXIsIEFycmF5LmZyb20ocmVxdWlyZWRTZXJ2aWNlcykpO1xuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zaW5nIHVuZGVyIEVsYXN0aWMgTGljZW5zZSAyLjAuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVsYXN0aWMtMi4wXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMYW1iZGFNZXRhZGF0YSwgUnVudGltZVdlYkNvbmZpZyB9IGZyb20gJ0BsaWIvcnVudGltZS13ZWIvdHlwZXMnO1xuaW1wb3J0IHsgTWljcm9zZXJ2aWNlUmVnaXN0cmFyIH0gZnJvbSAnQGNvcmUvcnVudGltZS13ZWIvcmVnaXN0cmFyL21pY3Jvc2VydmljZS1yZWdpc3RyYXInO1xuaW1wb3J0IHsgTGFtYmRhSGFuZGxlckZhY3RvcnkgfSBmcm9tICdAY29yZS9ydW50aW1lLXdlYi9mYWN0b3J5L2xhbWJkYS1oYW5kbGVyLWZhY3RvcnknO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG4vKipcbiAqIExhbWJkYSBleGVjdXRpb24gcGlwZWxpbmUgZm9yIFJ1bnRpbWUgVGFyZ2V0IENvcmUuXG4gKlxuICogSGFuZGxlcyBMYW1iZGEgZnVuY3Rpb24gZXhlY3V0aW9uIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBSZXNvbHZlcyB0aGUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLCBnZXRzIHRoZSBhcHByb3ByaWF0ZVxuICogREkgY29udGFpbmVyLCBjcmVhdGVzIHRoZSBoYW5kbGVyIHdpdGggaW5qZWN0ZWQgZGVwZW5kZW5jaWVzLCBhbmQgZXhlY3V0ZXNcbiAqIHRoZSBidXNpbmVzcyBsb2dpYy5cbiAqXG4gKiAqKkV4ZWN1dGlvbiBGbG93Kio6XG4gKiAxLiBSZXNvbHZlIExhbWJkYSBJRCBmcm9tIExBTUJEQV9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogMi4gVXNlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byBnZXQgY29udGFpbmVyIGZvciBMYW1iZGFcbiAqIDMuIFVzZSBMYW1iZGFIYW5kbGVyRmFjdG9yeSB0byBjcmVhdGUgaGFuZGxlciB3aXRoIERJXG4gKiA0LiBFeGVjdXRlIGhhbmRsZXIgYW5kIHJldHVybiByZXN1bHRcbiAqXG4gKiAqKlJlcXVpcmVtZW50cyoqOiBSRVEtMDYsIFJFUS0wOFxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhUGlwZWxpbmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IGxvZ2dlcih7XG4gICAgc2VydmljZU5hbWU6ICdAY29yZS9ydW50aW1lLXdlYi9waXBlbGluZXMvbGFtYmRhLXBpcGVsaW5lJyxcbiAgfSk7XG5cbiAgcHJpdmF0ZSByZWdpc3RyYXI/OiBNaWNyb3NlcnZpY2VSZWdpc3RyYXI7XG4gIHByaXZhdGUgaGFuZGxlckZhY3Rvcnk/OiBMYW1iZGFIYW5kbGVyRmFjdG9yeTtcblxuICAvKipcbiAgICogRXhlY3V0ZSBMYW1iZGEgcGlwZWxpbmUgZm9yIHNlcnZlci1zaWRlIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogUHJvY2Vzc2VzIHRoZSBtaWNyb3NlcnZpY2UgcmVnaXN0cnksIHJlc29sdmVzIHRoZSBMYW1iZGEgSUQgZnJvbSBlbnZpcm9ubWVudFxuICAgKiB2YXJpYWJsZXMsIGdldHMgdGhlIGFwcHJvcHJpYXRlIERJIGNvbnRhaW5lciwgY3JlYXRlcyB0aGUgaGFuZGxlciB3aXRoXG4gICAqIGRlcGVuZGVuY3kgaW5qZWN0aW9uLCBhbmQgZXhlY3V0ZXMgdGhlIGJ1c2luZXNzIGxvZ2ljLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gUHVyZW5vdyBjb25maWd1cmF0aW9uIHdpdGggbWljcm9zZXJ2aWNlIHJlZ2lzdHJ5XG4gICAqIEBwYXJhbSBjb250ZXh0IC0gTGFtYmRhIGVudmlyb25tZW50IGNvbnRleHQgd2l0aCBtZXRhZGF0YVxuICAgKiBAcmV0dXJucyBSZXN1bHQgZnJvbSBMYW1iZGEgaGFuZGxlciBleGVjdXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwaXBlbGluZSA9IG5ldyBMYW1iZGFQaXBlbGluZSgpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBwaXBlbGluZS5leGVjdXRlKGNvbmZpZywge1xuICAgKiAgIHR5cGU6ICdsYW1iZGEnLFxuICAgKiAgIG1ldGFkYXRhOiB7XG4gICAqICAgICBmdW5jdGlvbk5hbWU6ICdteS1hcHAtcGF5bWVudHMtY2hhcmdlLWRldicsXG4gICAqICAgICB2ZXJzaW9uOiAnJExBVEVTVCcsXG4gICAqICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgKiAgICAgbWVtb3J5TGltaXQ6IDEwMjQsXG4gICAqICAgICByZXF1ZXN0SWQ6ICdhYmMtMTIzJ1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShjb25maWc6IFJ1bnRpbWVXZWJDb25maWcsIGNvbnRleHQ6IHsgdHlwZTogJ2xhbWJkYSc7IG1ldGFkYXRhOiBMYW1iZGFNZXRhZGF0YSB9KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ1N0YXJ0aW5nIExhbWJkYSBwaXBlbGluZSBleGVjdXRpb24nLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dC5tZXRhZGF0YS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIHZlcnNpb246IGNvbnRleHQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgcmVnaW9uOiBjb250ZXh0Lm1ldGFkYXRhLnJlZ2lvbixcbiAgICAgICAgbWVtb3J5TGltaXQ6IGNvbnRleHQubWV0YWRhdGEubWVtb3J5TGltaXQsXG4gICAgICAgIHJlcXVlc3RJZDogY29udGV4dC5tZXRhZGF0YS5yZXF1ZXN0SWQsXG4gICAgICB9KTtcblxuICAgICAgLy8gMS4gSW5pdGlhbGl6ZSByZWdpc3RyYXIgYW5kIHByb2Nlc3MgbWljcm9zZXJ2aWNlc1xuICAgICAgdGhpcy5pbml0aWFsaXplUmVnaXN0cmFyKGNvbmZpZyk7XG5cbiAgICAgIC8vIDIuIFJlc29sdmUgTGFtYmRhIElEIGZyb20gZW52aXJvbm1lbnRcbiAgICAgIGNvbnN0IGxhbWJkYUlkID0gdGhpcy5yZXNvbHZlTGFtYmRhSWQoKTtcblxuICAgICAgLy8gMy4gR2V0IERJIGNvbnRhaW5lciBmb3IgdGhpcyBMYW1iZGFcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyRm9yTGFtYmRhKGxhbWJkYUlkKTtcblxuICAgICAgLy8gNC4gQ3JlYXRlIGhhbmRsZXIgd2l0aCBESVxuICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuY3JlYXRlSGFuZGxlcldpdGhESShsYW1iZGFJZCwgY29udGFpbmVyKTtcblxuICAgICAgLy8gNS4gRXhlY3V0ZSBoYW5kbGVyICh0aGlzIHdpbGwgYmUgY2FsbGVkIGJ5IEFXUyBMYW1iZGEgcnVudGltZSlcbiAgICAgIC8vIE5vdGU6IEluIGFjdHVhbCBMYW1iZGEgZXhlY3V0aW9uLCB0aGlzIG1ldGhvZCBzZXRzIHVwIHRoZSBoYW5kbGVyXG4gICAgICAvLyBUaGUgQVdTIExhbWJkYSBydW50aW1lIHdpbGwgY2FsbCBoYW5kbGVyLmhhbmRsZXIoZXZlbnQsIGNvbnRleHQpXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdMYW1iZGEgcGlwZWxpbmUgc2V0dXAgY29tcGxldGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBoYW5kbGVyIGZvciBBV1MgTGFtYmRhIHJ1bnRpbWUgdG8gaW52b2tlXG4gICAgICByZXR1cm4gaGFuZGxlcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignTGFtYmRhIHBpcGVsaW5lIGV4ZWN1dGlvbiBmYWlsZWQnLCB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBjb25maWcuc2VydmljZU5hbWUsXG4gICAgICAgIHN0YWdlOiBjb25maWcuc3RhZ2UsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29udGV4dC5tZXRhZGF0YS5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgIHN0YWNrOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBtaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGFuZCBwcm9jZXNzIGFsbCBzZXJ2aWNlcy5cbiAgICpcbiAgICogQ3JlYXRlcyBhIG5ldyBNaWNyb3NlcnZpY2VSZWdpc3RyYXIgYW5kIHByb2Nlc3NlcyBhbGwgbWljcm9zZXJ2aWNlXG4gICAqIGRlZmluaXRpb25zIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdG8gYnVpbGQgREkgY29udGFpbmVycy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFB1cmVub3cgY29uZmlndXJhdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplUmVnaXN0cmFyKGNvbmZpZzogUnVudGltZVdlYkNvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdJbml0aWFsaXppbmcgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnaXN0cmFyID0gbmV3IE1pY3Jvc2VydmljZVJlZ2lzdHJhcigpO1xuXG4gICAgICAvLyBQcm9jZXNzIGFsbCBtaWNyb3NlcnZpY2VzIGZyb20gdGhlIHJlZ2lzdGVyXG4gICAgICBmb3IgKGNvbnN0IFtzZXJ2aWNlTmFtZSwgZGVmaW5pdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLnJlZ2lzdGVyKSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnUHJvY2Vzc2luZyBtaWNyb3NlcnZpY2UnLCB7XG4gICAgICAgICAgc2VydmljZU5hbWUsXG4gICAgICAgICAgdGllc0NvdW50OiBkZWZpbml0aW9uLnRpZXMubGVuZ3RoLFxuICAgICAgICAgIGxhbWJkYXNDb3VudDogZGVmaW5pdGlvbi5sYW1iZGFzLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWdpc3RyYXIucHJvY2Vzc1NlcnZpY2Uoc2VydmljZU5hbWUsIGRlZmluaXRpb24pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgc2VydmljZUNvdW50OiBPYmplY3Qua2V5cyhjb25maWcucmVnaXN0ZXIpLmxlbmd0aCxcbiAgICAgICAgdG90YWxMYW1iZGFzOiB0aGlzLnJlZ2lzdHJhci5nZXRMYW1iZGFJZHMoKS5sZW5ndGgsXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgbWljcm9zZXJ2aWNlIHJlZ2lzdHJhcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBtaWNyb3NlcnZpY2UgcmVnaXN0cmFyOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBMYW1iZGEgSUQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEdldHMgdGhlIExhbWJkYSBJRCBmcm9tIHRoZSBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdFxuICAgKiBpcyBzZXQgYnkgdGhlIENESyBzdGFjayBkdXJpbmcgZGVwbG95bWVudC5cbiAgICpcbiAgICogQHJldHVybnMgTGFtYmRhIElEIChlLmcuLCAncGF5bWVudHMuY2hhcmdlJylcbiAgICogQHRocm93cyBFcnJvciBpZiBMQU1CREFfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTGFtYmRhSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYW1iZGFJZCA9IHByb2Nlc3MuZW52LkxBTUJEQV9JRDtcblxuICAgIGlmICghbGFtYmRhSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0xBTUJEQV9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3QgZm91bmQuICcgK1xuICAgICAgICAnVGhpcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBDREsgc3RhY2sgZHVyaW5nIGRlcGxveW1lbnQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xhbWJkYSBJRCByZXNvbHZlZCBmcm9tIGVudmlyb25tZW50JywgeyBsYW1iZGFJZCB9KTtcbiAgICByZXR1cm4gbGFtYmRhSWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IERJIGNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBMYW1iZGEuXG4gICAqXG4gICAqIFVzZXMgdGhlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byBsb29rIHVwIHRoZSBhcHByb3ByaWF0ZSBESSBjb250YWluZXJcbiAgICogZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24gYmFzZWQgb24gaXRzIElELlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRCAoZS5nLiwgJ3BheW1lbnRzLmNoYXJnZScpXG4gICAqIEByZXR1cm5zIFB1cmVDb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZSBMYW1iZGEncyBtaWNyb3NlcnZpY2VcbiAgICogQHRocm93cyBFcnJvciBpZiBjb250YWluZXIgbm90IGZvdW5kXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldENvbnRhaW5lckZvckxhbWJkYShsYW1iZGFJZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnJlZ2lzdHJhcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaWNyb3NlcnZpY2UgcmVnaXN0cmFyIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnJlZ2lzdHJhci5nZXRDb250YWluZXJGb3JMYW1iZGEobGFtYmRhSWQpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnREkgY29udGFpbmVyIHJldHJpZXZlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIGxhbWJkYUlkLFxuICAgICAgICBzZXJ2aWNlTmFtZTogdGhpcy5yZWdpc3RyYXIuZ2V0U2VydmljZUZvckxhbWJkYShsYW1iZGFJZCksXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBESSBjb250YWluZXIgZm9yIExhbWJkYScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGdldCBESSBjb250YWluZXIgZm9yIExhbWJkYSAnJHtsYW1iZGFJZH0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIExhbWJkYSBoYW5kbGVyIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqXG4gICAqIFVzZXMgdGhlIExhbWJkYUhhbmRsZXJGYWN0b3J5IHRvIGNyZWF0ZSBhIGhhbmRsZXIgaW5zdGFuY2Ugd2l0aFxuICAgKiBhdXRvbWF0aWMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJvbSB0aGUgREkgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gbGFtYmRhSWQgLSBGdWxsIExhbWJkYSBJRFxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gUHVyZUNvbnRhaW5lciB3aXRoIHJlZ2lzdGVyZWQgc2VydmljZXNcbiAgICogQHJldHVybnMgTGFtYmRhIGhhbmRsZXIgaW5zdGFuY2UgcmVhZHkgZm9yIGV4ZWN1dGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVIYW5kbGVyV2l0aERJKGxhbWJkYUlkOiBzdHJpbmcsIGNvbnRhaW5lcjogYW55KSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIExhbWJkYSBoYW5kbGVyIHdpdGggREknLCB7IGxhbWJkYUlkIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEluaXRpYWxpemUgaGFuZGxlciBmYWN0b3J5IGlmIG5vdCBhbHJlYWR5IGRvbmVcbiAgICAgIGlmICghdGhpcy5oYW5kbGVyRmFjdG9yeSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJGYWN0b3J5ID0gbmV3IExhbWJkYUhhbmRsZXJGYWN0b3J5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmQgdGhlIExhbWJkYSBkZWZpbml0aW9uIGZvciB0aGlzIElEXG4gICAgICBjb25zdCBsYW1iZGFEZWZpbml0aW9uID0gdGhpcy5maW5kTGFtYmRhRGVmaW5pdGlvbihsYW1iZGFJZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBoYW5kbGVyIHdpdGggRElcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJGYWN0b3J5LmNyZWF0ZShsYW1iZGFEZWZpbml0aW9uLCBjb250YWluZXIpO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKCdMYW1iZGEgaGFuZGxlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGRlcGVuZGVuY3lDb3VudDogbGFtYmRhRGVmaW5pdGlvbi50aWVzLmxlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaGFuZGxlcjtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBMYW1iZGEgaGFuZGxlcicsIHtcbiAgICAgICAgbGFtYmRhSWQsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBMYW1iZGEgaGFuZGxlciBmb3IgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgTGFtYmRhIGRlZmluaXRpb24gYnkgSUQgZnJvbSB0aGUgcHJvY2Vzc2VkIG1pY3Jvc2VydmljZXMuXG4gICAqXG4gICAqIFVzZXMgdGhlIE1pY3Jvc2VydmljZVJlZ2lzdHJhciB0byByZXRyaWV2ZSB0aGUgTGFtYmRhIGRlZmluaXRpb25cbiAgICogdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFJZCAtIEZ1bGwgTGFtYmRhIElEIHRvIGZpbmRcbiAgICogQHJldHVybnMgTGFtYmRhIGRlZmluaXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBMYW1iZGEgZGVmaW5pdGlvbiBub3QgZm91bmRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZmluZExhbWJkYURlZmluaXRpb24obGFtYmRhSWQ6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5yZWdpc3RyYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWljcm9zZXJ2aWNlIHJlZ2lzdHJhciBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cmFyLmdldExhbWJkYURlZmluaXRpb24obGFtYmRhSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExhbWJkYSBkZWZpbml0aW9uIG5vdCBmb3VuZCBmb3IgSUQgJyR7bGFtYmRhSWR9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vLyBSZS1leHBvcnQgYmFzZSBzZXJ2aWNlcyBmcm9tIFB1cmVub3dcbmV4cG9ydCAqIGZyb20gJ0B3b3JrdGlmL3B1cmVub3cvbGFtYmRhJztcblxuLy8gRXhwb3J0IHJ1bnRpbWUtc3BlY2lmaWMgc2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vcnVudGltZS1leHRlbnNpb25zJzsiLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgQmVmb3JlSW5zdGFuY2UsXG4gIExvZ2dlckxldmVsLFxuICBNYXliZSxcbiAgcHVyYWJsZSxcbn0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVDb25maWcsIFJ1bnRpbWVTdGFja0NvbmZpZyB9IGZyb20gJy4vcnVudGltZS1leHRlbnNpb25zLnR5cGVzJztcblxuLyoqXG4gKiBSdW50aW1lRXh0ZW5zaW9ucyBzZXJ2aWNlIHByb3ZpZGVzIHJ1bnRpbWUtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0aGF0IGV4dGVuZHNcbiAqIHB1cmVub3cncyBiYXNlIGNhcGFiaWxpdGllcy4gVGhpcyBzZXJ2aWNlIGZvbGxvd3MgcHVyZW5vdydzIGFyY2hpdGVjdHVyYWwgcGF0dGVybnNcbiAqIGZvciBBV1MgaW50ZWdyYXRpb25zIGFuZCBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBLZXkgcmVzcG9uc2liaWxpdGllczpcbiAqIC0gRW5oYW5jZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lLXNwZWNpZmljIGZlYXR1cmVzXG4gKiAtIFByb3ZpZGUgcnVudGltZS1zcGVjaWZpYyBidWlsZCBvcHRpbWl6YXRpb25zXG4gKiAtIENvbmZpZ3VyZSBSdW50aW1lIENvcmUgc3RhY2sgZGVwbG95bWVudFxuICogLSBFeHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgcmVwbGFjaW5nIGl0XG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBSdW50aW1lRXh0ZW5zaW9ucyAvKmltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlICovIHtcbiAgLy8gLyoqXG4gIC8vICAqIExvZ2dlciBpbnN0YW5jZSBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgLy8gICogVXNlcyBwdXJlbm93J3MgbG9nZ2luZyBwYXR0ZXJucyB3aXRoIEFXUyBwcm92aWRlci5cbiAgLy8gICovXG4gIC8vIGxvZ2dlckluc3RhbmNlID0gbG9nZ2VyKHtcbiAgLy8gICBzZXJ2aWNlTmFtZTogJ1J1bnRpbWUgfCBFeHRlbnNpb25zIFNlcnZpY2UnLFxuICAvLyAgIGxvZ0Zvcm1hdHRlcjogbmV3IFB1cmVub3dMb2dnZXJGb3JtYXR0ZXIoe1xuICAvLyAgICAgbG9nc1Byb3ZpZGVyOiBQdXJlbm93TG9nRm9ybWF0dGVyUHJvdmlkZXIuQXdzLFxuICAvLyAgIH0pIGFzIGFueSxcbiAgLy8gfSk7XG5cbiAgLyoqXG4gICAqIFJ1bnRpbWUgY29uZmlndXJhdGlvbiB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiByZXBsYWNpbmcgaXQuXG4gICAqL1xuICBwcml2YXRlIHJ1bnRpbWVDb25maWc6IFJ1bnRpbWVDb25maWcgPSB7XG4gICAgZW5hYmxlUnVudGltZUNvcmVTdGFjazogZmFsc2UsIC8vIEBub3RlOiBjcml0aWNhbCBOT1QgRVhQRUNURUQgdmFsdWUsIGNhbiBiZSByZW1vdmVkIHRvIGNsZWFuIHVwIHJlcG9cbiAgICBydW50aW1lV2ViTW9kZTogJ2RldmVsb3BtZW50JyxcbiAgICBhZGRpdGlvbmFsRmVhdHVyZXM6IFtdLFxuICAgIGRldlNlcnZlckVuaGFuY2VtZW50czoge1xuICAgICAgaG90UmVsb2FkOiB0cnVlLFxuICAgICAgZGVidWdNb2RlOiBmYWxzZSxcbiAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZzogZmFsc2UsXG4gICAgfSxcbiAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgIGJ1bmRsZUFuYWx5c2lzOiBmYWxzZSxcbiAgICAgIHRyZWVzaGFraW5nOiB0cnVlLFxuICAgICAgY29kZU1pbmlmaWNhdGlvbjogdHJ1ZSxcbiAgICB9LFxuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgUnVudGltZUV4dGVuc2lvbnMgc2VydmljZS5cbiAgICogVXNlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBwYXR0ZXJuIGNvbnNpc3RlbnQgd2l0aCBwdXJlbm93IHNlcnZpY2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBydW50aW1lIGV4dGVuc2lvbnNcbiAgICB0aGlzLmluaXRpYWxpemVSdW50aW1lRXh0ZW5zaW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgcnVudGltZSBleHRlbnNpb25zIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICAgKiBTZXRzIHVwIHJ1bnRpbWUtc3BlY2lmaWMgZmVhdHVyZXMgdGhhdCBleHRlbmQgcHVyZW5vdyBmdW5jdGlvbmFsaXR5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUnVudGltZUV4dGVuc2lvbnMoYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJ1bnRpbWUgZXh0ZW5zaW9ucyBhcmUgbm93IHJlYWR5XG4gICAgLy8gTG9nZ2luZyByZW1vdmVkIGZvciBzaW1wbGljaXR5XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZSBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aCBydW50aW1lLXNwZWNpZmljIGZlYXR1cmVzLlxuICAgKiBFeHRlbmRzIHB1cmVub3cncyBkZXZlbG9wbWVudCBzZXJ2ZXIgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2ZXJDb25maWcgLSBCYXNlIHNlcnZlciBjb25maWd1cmF0aW9uIGZyb20gcHVyZW5vd1xuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqIEByZXR1cm5zIFJ1bnRpbWUgQ29yZSBzZXJ2ZXIgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuaGFuY2VEZXZTZXJ2ZXIoXG4gICAgc2VydmVyQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGJlZm9yZUluc3RhbmNlPzogQmVmb3JlSW5zdGFuY2UsXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGVuaGFuY2VtZW50cyA9IHRoaXMucnVudGltZUNvbmZpZy5kZXZTZXJ2ZXJFbmhhbmNlbWVudHM7XG5cbiAgICAvLyBMb2dnaW5nIHJlbW92ZWQgZm9yIHNpbXBsaWNpdHlcblxuICAgIGNvbnN0IHJ1bnRpbWVDb3JlQ29uZmlnID0ge1xuICAgICAgLi4uc2VydmVyQ29uZmlnLFxuICAgICAgLy8gQWRkIHJ1bnRpbWUtc3BlY2lmaWMgZW5oYW5jZW1lbnRzXG4gICAgICBydW50aW1lOiB7XG4gICAgICAgIGhvdFJlbG9hZDogZW5oYW5jZW1lbnRzPy5ob3RSZWxvYWQgPz8gdHJ1ZSxcbiAgICAgICAgZGVidWdNb2RlOiBlbmhhbmNlbWVudHM/LmRlYnVnTW9kZSA/PyBmYWxzZSxcbiAgICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nOiBlbmhhbmNlbWVudHM/LnBlcmZvcm1hbmNlTW9uaXRvcmluZyA/PyBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIExvZ2dpbmcgcmVtb3ZlZCBmb3Igc2ltcGxpY2l0eVxuXG4gICAgcmV0dXJuIHJ1bnRpbWVDb3JlQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplIGJ1aWxkIHByb2Nlc3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIG9wdGltaXphdGlvbnMuXG4gICAqIEV4dGVuZHMgcHVyZW5vdydzIGJ1aWxkIHByb2Nlc3Mgd2l0aG91dCByZXBsYWNpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBidWlsZENvbmZpZyAtIEJhc2UgYnVpbGQgY29uZmlndXJhdGlvbiBmcm9tIHB1cmVub3dcbiAgICogQHBhcmFtIGJlZm9yZUluc3RhbmNlIC0gTG9nZ2VyIGluc3RhbmNlIGZvciB0cmFja2luZ1xuICAgKiBAcmV0dXJucyBPcHRpbWl6ZWQgYnVpbGQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9wdGltaXplQnVpbGQoXG4gICAgYnVpbGRDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3Qgb3B0aW1pemF0aW9ucyA9IHRoaXMucnVudGltZUNvbmZpZy5idWlsZE9wdGltaXphdGlvbnM7XG5cbiAgICBjb25zdCBvcHRpbWl6ZWRDb25maWcgPSB7XG4gICAgICAuLi5idWlsZENvbmZpZyxcbiAgICAgIC8vIEFkZCBydW50aW1lLXNwZWNpZmljIG9wdGltaXphdGlvbnNcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgYnVuZGxlQW5hbHlzaXM6IG9wdGltaXphdGlvbnM/LmJ1bmRsZUFuYWx5c2lzID8/IGZhbHNlLFxuICAgICAgICB0cmVlc2hha2luZzogb3B0aW1pemF0aW9ucz8udHJlZXNoYWtpbmcgPz8gdHJ1ZSxcbiAgICAgICAgY29kZU1pbmlmaWNhdGlvbjogb3B0aW1pemF0aW9ucz8uY29kZU1pbmlmaWNhdGlvbiA/PyB0cnVlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG9wdGltaXplZENvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgUnVudGltZSBDb3JlIHN0YWNrIGZvciBydW50aW1lIGRlcGxveW1lbnQuXG4gICAqIEV4dGVuZHMgcHVyZW5vdydzIHR3by1zdGFjayBhcmNoaXRlY3R1cmUgdG8gdGhyZWUgc3RhY2tzLlxuICAgKlxuICAgKiBAcGFyYW0gYmFzZVN0YWNrQ29uZmlnIC0gQmFzZSBzdGFjayBjb25maWd1cmF0aW9uIGZyb20gcHVyZW5vd1xuICAgKiBAcGFyYW0gYmVmb3JlSW5zdGFuY2UgLSBMb2dnZXIgaW5zdGFuY2UgZm9yIHRyYWNraW5nXG4gICAqIEByZXR1cm5zIFJ1bnRpbWUgc3RhY2sgY29uZmlndXJhdGlvbiBmb3IgUnVudGltZSBDb3JlIHN0YWNrXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29uZmlndXJlUnVudGltZUNvcmVTdGFjayhcbiAgICBiYXNlU3RhY2tDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTxNYXliZTxSdW50aW1lU3RhY2tDb25maWc+PiB7XG4gICAgaWYgKCF0aGlzLnJ1bnRpbWVDb25maWcuZW5hYmxlUnVudGltZUNvcmVTdGFjaykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBydW50aW1lU3RhY2tDb25maWc6IFJ1bnRpbWVTdGFja0NvbmZpZyA9IHtcbiAgICAgIHN0YWNrTmFtZTogYCR7YmFzZVN0YWNrQ29uZmlnLnN0YWNrTmFtZSB8fCAncHVyZW5vdyd9LXJ1bnRpbWVgLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnTGFtYmRhJyxcbiAgICAgICAgICBuYW1lOiAnUnVudGltZVdlYkhhbmRsZXInLFxuICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgcnVudGltZTogJ25vZGVqczE4LngnLFxuICAgICAgICAgICAgdGltZW91dDogMzAsXG4gICAgICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBkZXBlbmRlbmNpZXM6IFtcbiAgICAgICAgYCR7YmFzZVN0YWNrQ29uZmlnLnN0YWNrTmFtZSB8fCAncHVyZW5vdyd9LWluZnJhc3RydWN0dXJlYCxcbiAgICAgICAgYCR7YmFzZVN0YWNrQ29uZmlnLnN0YWNrTmFtZSB8fCAncHVyZW5vdyd9LXJ1bnRpbWUtYmFzZWAsXG4gICAgICBdLFxuICAgICAgb3V0cHV0czoge1xuICAgICAgICBSdW50aW1lU3RhY2tBcm46ICdydW50aW1lLXN0YWNrLWFybicsXG4gICAgICAgIFJ1bnRpbWVXZWJFbmRwb2ludDogJ3J1bnRpbWUtd2ViLWVuZHBvaW50JyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIExvZ2dpbmcgcmVtb3ZlZCBmb3Igc2ltcGxpY2l0eVxuXG4gICAgcmV0dXJuIHJ1bnRpbWVTdGFja0NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgKiBBbGxvd3MgZHluYW1pYyBjb25maWd1cmF0aW9uIG9mIHJ1bnRpbWUgZmVhdHVyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBOZXcgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVDb25maWd1cmF0aW9uKFxuICAgIGNvbmZpZzogUGFydGlhbDxSdW50aW1lQ29uZmlnPixcbiAgICBiZWZvcmVJbnN0YW5jZT86IEJlZm9yZUluc3RhbmNlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBNZXJnZSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLnJ1bnRpbWVDb25maWcgPSB7XG4gICAgICAuLi50aGlzLnJ1bnRpbWVDb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgICBkZXZTZXJ2ZXJFbmhhbmNlbWVudHM6IHtcbiAgICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLmRldlNlcnZlckVuaGFuY2VtZW50cyxcbiAgICAgICAgLi4uY29uZmlnLmRldlNlcnZlckVuaGFuY2VtZW50cyxcbiAgICAgIH0sXG4gICAgICBidWlsZE9wdGltaXphdGlvbnM6IHtcbiAgICAgICAgLi4udGhpcy5ydW50aW1lQ29uZmlnLmJ1aWxkT3B0aW1pemF0aW9ucyxcbiAgICAgICAgLi4uY29uZmlnLmJ1aWxkT3B0aW1pemF0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBydW50aW1lIGNvbmZpZ3VyYXRpb24uXG4gICAqIFByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgdG8gcnVudGltZSBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHVibGljIGdldENvbmZpZ3VyYXRpb24oKTogUmVhZG9ubHk8UnVudGltZUNvbmZpZz4ge1xuICAgIHJldHVybiB7IC4uLnRoaXMucnVudGltZUNvbmZpZyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJ1bnRpbWUgZmVhdHVyZSBpcyBlbmFibGVkLlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3IgY2hlY2tpbmcgZmVhdHVyZSBmbGFncy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBmZWF0dXJlIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBpc0ZlYXR1cmVFbmFibGVkKGZlYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzPy5pbmNsdWRlcyhmZWF0dXJlKSA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgcnVudGltZSBmZWF0dXJlLlxuICAgKiBBZGRzIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgZW5hYmxlZCBmZWF0dXJlcy5cbiAgICpcbiAgICogQHBhcmFtIGZlYXR1cmUgLSBGZWF0dXJlIG5hbWUgdG8gZW5hYmxlXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbmFibGVGZWF0dXJlKFxuICAgIGZlYXR1cmU6IHN0cmluZyxcbiAgICBiZWZvcmVJbnN0YW5jZT86IEJlZm9yZUluc3RhbmNlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNGZWF0dXJlRW5hYmxlZChmZWF0dXJlKSkge1xuICAgICAgdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyA9IFtcbiAgICAgICAgLi4uKHRoaXMucnVudGltZUNvbmZpZy5hZGRpdGlvbmFsRmVhdHVyZXMgfHwgW10pLFxuICAgICAgICBmZWF0dXJlLFxuICAgICAgXTtcblxuICAgICAgLy8gRmVhdHVyZSBlbmFibGVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgcnVudGltZSBmZWF0dXJlLlxuICAgKiBSZW1vdmVzIGZlYXR1cmUgZnJvbSB0aGUgbGlzdCBvZiBlbmFibGVkIGZlYXR1cmVzLlxuICAgKlxuICAgKiBAcGFyYW0gZmVhdHVyZSAtIEZlYXR1cmUgbmFtZSB0byBkaXNhYmxlXG4gICAqIEBwYXJhbSBiZWZvcmVJbnN0YW5jZSAtIExvZ2dlciBpbnN0YW5jZSBmb3IgdHJhY2tpbmdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNhYmxlRmVhdHVyZShcbiAgICBmZWF0dXJlOiBzdHJpbmcsXG4gICAgYmVmb3JlSW5zdGFuY2U/OiBCZWZvcmVJbnN0YW5jZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNGZWF0dXJlRW5hYmxlZChmZWF0dXJlKSkge1xuICAgICAgdGhpcy5ydW50aW1lQ29uZmlnLmFkZGl0aW9uYWxGZWF0dXJlcyA9ICh0aGlzLnJ1bnRpbWVDb25maWcuYWRkaXRpb25hbEZlYXR1cmVzIHx8IFtdKVxuICAgICAgICAuZmlsdGVyKGYgPT4gZiAhPT0gZmVhdHVyZSk7XG5cbiAgICAgIC8vIEZlYXR1cmUgZGlzYWJsZWRcbiAgICB9XG4gIH1cbn1cbiIsICIvKlxuICogRWxhc3RpYyBMaWNlbnNlIDIuMFxuICogQ29weXJpZ2h0IChDKSAyMDI1XHUyMDEzcHJlc2VudCBSYW1hbiBNYXJvemF1LCBXb3JrIFRhcmdldCBJbnNpZ2h0IEZ1bmN0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29udGFjdDogcmFtYW5Ad29ya3RpZi5jb21cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGljZW5zZWQgV29yazogd29ya3RpZi5wdXJlbm93LmNkayA8d29ya3RpZl9wdXJlbm93X2Nkaz4uXG4gKiBVc2Ugb2YgdGhpcyBzb2Z0d2FyZSBpcyBnb3Zlcm5lZCBieSB0aGUgRWxhc3RpYyBMaWNlbnNlIDIuMDsgc2VlIHRoZSBMSUNFTlNFIGZpbGVcbiAqIG9yIGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vbGljZW5zaW5nL2VsYXN0aWMtbGljZW5zZSBmb3IgZGV0YWlscy5cbiAqXG4gKiBSZS1saWNlbnNpbmcgbm90aWNlOlxuICogICBUaGlzIGZpbGUgd2FzIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSAoQlVTTC0xLjEpLlxuICogICBBcyBvZiAyMDI1LTA5LTIyLCBpdCBpcyByZS1saWNlbnNlZCB1bmRlciBFbGFzdGljIExpY2Vuc2UgMi4wLlxuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFbGFzdGljLTIuMFxuICovXG5cbmltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5cbi8vIFJlLWV4cG9ydCBiYXNlIGJ1bmRsZSBmdW5jdGlvbmFsaXR5IGZyb20gUHVyZW5vd1xuZXhwb3J0ICogZnJvbSAnQHdvcmt0aWYvcHVyZW5vdy9sYW1iZGEnO1xuXG4vLyBFeHBvcnQgcnVudGltZS1zcGVjaWZpYyBidW5kbGUgY29tcG9uZW50c1xuZXhwb3J0ICogZnJvbSAnLi9ydW50aW1lLmNvbnRhaW5lcic7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUuY29udGFpbmVyLnR5cGVzJzsiLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG5pbXBvcnQgeyBQdXJlQ29udGFpbmVyIH0gZnJvbSAnQHdvcmt0aWYvdXRpbHMnO1xuaW1wb3J0IHsgcHVyYWJsZSB9IGZyb20gJ0B1dGlscy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IFJ1bnRpbWVFeHRlbnNpb25zIH0gZnJvbSAnQGNvcmUvc2VydmljZXMvcnVudGltZS1leHRlbnNpb25zJztcbmltcG9ydCB7IFJ1bnRpbWVEaSB9IGZyb20gJ0Bjb3JlL2J1bmRsZS9ydW50aW1lLmNvbnRhaW5lci50eXBlcyc7XG5cbi8qKlxuICogUnVudGltZUNvbnRhaW5lciBwcm92aWRlcyBydW50aW1lLXNwZWNpZmljIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGJpbmRpbmdzXG4gKiB1c2luZyBQdXJlQ29udGFpbmVyIGZyb20gQHdvcmt0aWYvdXRpbHMuIFRoaXMgZm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuXG4gKiB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUgd29ya3NwYWNlLlxuICpcbiAqIFRoZSBjb250YWluZXIgYWRkcyBydW50aW1lIHNlcnZpY2VzIHdoaWxlIGJlaW5nIGNvbXBhdGlibGUgd2l0aFxuICogcHVyZW5vdydzIGFyY2hpdGVjdHVyYWwgcGF0dGVybnMuXG4gKi9cbkBwdXJhYmxlKClcbmV4cG9ydCBjbGFzcyBSdW50aW1lQ29udGFpbmVyIHtcbiAgcHJpdmF0ZSBjb250YWluZXI6IFB1cmVDb250YWluZXI8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IG5ldyBQdXJlQ29udGFpbmVyPHN0cmluZz4oe1xuICAgICAgZGVmYXVsdFNjb3BlOiAnU2luZ2xldG9uJyxcbiAgICB9KTtcbiAgICB0aGlzLmluaXRpYWxpemVSdW50aW1lQmluZGluZ3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHJ1bnRpbWUtc3BlY2lmaWMgc2VydmljZSBiaW5kaW5ncy5cbiAgICogUmVnaXN0ZXJzIHJ1bnRpbWUgc2VydmljZXMgd2l0aCB0aGUgY29udGFpbmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplUnVudGltZUJpbmRpbmdzKCk6IHZvaWQge1xuICAgIC8vIFJlZ2lzdGVyIFJ1bnRpbWVFeHRlbnNpb25zIHNlcnZpY2UgYXMgc2luZ2xldG9uXG4gICAgLy8gVXNlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHByb3BlciBpbnN0YW50aWF0aW9uXG4gICAgdGhpcy5jb250YWluZXIudGllKHtcbiAgICAgIFtSdW50aW1lRGkuUnVudGltZUV4dGVuc2lvbnNTZXJ2aWNlQmluZF06IHtcbiAgICAgICAgaW5zdGFuY2U6IFJ1bnRpbWVFeHRlbnNpb25zLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgUHVyZUNvbnRhaW5lciBpbnN0YW5jZS5cbiAgICogQWxsb3dzIGFjY2VzcyB0byB0aGUgY29udGFpbmVyIGZvciBzZXJ2aWNlIHJlc29sdXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29udGFpbmVyKCk6IFB1cmVDb250YWluZXI8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBzZXJ2aWNlIGZyb20gdGhlIGNvbnRhaW5lci5cbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXJ2aWNlIHJlc29sdXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUPihzZXJ2aWNlSWQ6IHN0cmluZyk6IFQge1xuICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5ydW4oc2VydmljZUlkKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc2VydmljZSBpcyByZWdpc3RlcmVkLlxuICAgKiBVdGlsaXR5IG1ldGhvZCBmb3Igc2VydmljZSB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIGlzUmVnaXN0ZXJlZChzZXJ2aWNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5ydW4oc2VydmljZUlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iLCAiLypcbiAqIEVsYXN0aWMgTGljZW5zZSAyLjBcbiAqIENvcHlyaWdodCAoQykgMjAyNVx1MjAxM3ByZXNlbnQgUmFtYW4gTWFyb3phdSwgV29yayBUYXJnZXQgSW5zaWdodCBGdW5jdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvbnRhY3Q6IHJhbWFuQHdvcmt0aWYuY29tXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpY2Vuc2VkIFdvcms6IHdvcmt0aWYucHVyZW5vdy5jZGsgPHdvcmt0aWZfcHVyZW5vd19jZGs+LlxuICogVXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ292ZXJuZWQgYnkgdGhlIEVsYXN0aWMgTGljZW5zZSAyLjA7IHNlZSB0aGUgTElDRU5TRSBmaWxlXG4gKiBvciBodHRwczovL3d3dy5lbGFzdGljLmNvL2xpY2Vuc2luZy9lbGFzdGljLWxpY2Vuc2UgZm9yIGRldGFpbHMuXG4gKlxuICogUmUtbGljZW5zaW5nIG5vdGljZTpcbiAqICAgVGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCdXNpbmVzcyBTb3VyY2UgTGljZW5zZSAxLjEgKEJVU0wtMS4xKS5cbiAqICAgQXMgb2YgMjAyNS0wOS0yMiwgaXQgaXMgcmUtbGljZW5zZWQgdW5kZXIgRWxhc3RpYyBMaWNlbnNlIDIuMC5cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRWxhc3RpYy0yLjBcbiAqL1xuXG5pbXBvcnQgJ3JlZmxlY3QtbWV0YWRhdGEnO1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIGZvciBSdW50aW1lLXNwZWNpZmljIERlcGVuZGVuY3kgSW5qZWN0aW9uIGJpbmRpbmdzLlxuICogRXh0ZW5kcyBwdXJlbm93J3MgREkgYmluZGluZ3Mgd2l0aCBydW50aW1lLXNwZWNpZmljIHNlcnZpY2VzLlxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gUnVudGltZURpIHtcbiAgLy8gUnVudGltZSBFeHRlbnNpb25zIFNlcnZpY2VcbiAgUnVudGltZUV4dGVuc2lvbnNTZXJ2aWNlQmluZCA9ICdydW50aW1lX2V4dGVuc2lvbnNfc2VydmljZV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENvbmZpZ3VyYXRpb25cbiAgUnVudGltZUNvbmZpZ0JpbmQgPSAncnVudGltZV9jb25maWdfYmluZCcsXG5cbiAgLy8gUnVudGltZSBEZXBsb3ltZW50IFN0cmF0ZWd5XG4gIFJ1bnRpbWVEZXBsb3ltZW50U3RyYXRlZ3lCaW5kID0gJ3J1bnRpbWVfZGVwbG95bWVudF9zdHJhdGVneV9iaW5kJyxcblxuICAvLyBSdW50aW1lIENMSSBFeHRlbnNpb25zXG4gIFJ1bnRpbWVDbGlCaW5kID0gJ3J1bnRpbWVfY2xpX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgU3RhY2sgQ29uZmlndXJhdGlvblxuICBSdW50aW1lU3RhY2tDb25maWdCaW5kID0gJ3J1bnRpbWVfc3RhY2tfY29uZmlnX2JpbmQnLFxuXG4gIC8vIFJ1bnRpbWUgV2ViIEhhbmRsZXIgRmFjdG9yeVxuICBSdW50aW1lV2ViSGFuZGxlckZhY3RvcnlCaW5kID0gJ3J1bnRpbWVfd2ViX2hhbmRsZXJfZmFjdG9yeV9iaW5kJyxcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI4ekJBQUEsSUFBQUEsRUFBQUMsR0FBQSxLQWNBLElBQUlDLElBQ0gsU0FBVUEsRUFBUyxFQUdmLFNBQVVDLEVBQVMsQ0FDaEIsSUFBSUMsRUFBTyxPQUFPLFlBQWUsU0FBVyxXQUN4QyxPQUFPLFFBQVcsU0FBVyxPQUN6QixPQUFPLE1BQVMsU0FBVyxLQUN2QixPQUFPLE1BQVMsU0FBVyxLQUN2QkMsRUFBZSxFQUMzQkMsRUFBV0MsRUFBYUwsQ0FBTyxFQUMvQixPQUFPRSxFQUFLLFFBQVksTUFDeEJFLEVBQVdDLEVBQWFILEVBQUssUUFBU0UsQ0FBUSxHQUVsREgsRUFBUUcsRUFBVUYsQ0FBSSxFQUNsQixPQUFPQSxFQUFLLFFBQVksTUFDeEJBLEVBQUssUUFBVUYsR0FFbkIsU0FBU0ssRUFBYUMsRUFBUUMsRUFBVSxDQUNwQyxPQUFPLFNBQVVDLEVBQUtDLEVBQU8sQ0FDekIsT0FBTyxlQUFlSCxFQUFRRSxFQUFLLENBQUUsYUFBYyxHQUFNLFNBQVUsR0FBTSxNQUFPQyxDQUFNLENBQUMsRUFDbkZGLEdBQ0FBLEVBQVNDLEVBQUtDLENBQUssQ0FDM0IsQ0FDSixDQUNBLFNBQVNDLEdBQWUsQ0FDcEIsR0FBSSxDQUNBLE9BQU8sU0FBUyxjQUFjLEVBQUUsQ0FDcEMsTUFDVSxDQUFFLENBQ2hCLENBQ0EsU0FBU0MsR0FBbUIsQ0FDeEIsR0FBSSxDQUNBLFNBQWdCLE1BQU0saUNBQWlDLENBQzNELE1BQ1UsQ0FBRSxDQUNoQixDQUNBLFNBQVNSLEdBQWlCLENBQ3RCLE9BQU9PLEVBQWEsR0FBS0MsRUFBaUIsQ0FDOUMsQ0FDSixHQUFHLFNBQVVQLEVBQVVGLEVBQU0sQ0FDekIsSUFBSVUsRUFBUyxPQUFPLFVBQVUsZUFFMUJDLEVBQWlCLE9BQU8sUUFBVyxXQUNuQ0MsRUFBb0JELEdBQWtCLE9BQU8sT0FBTyxZQUFnQixJQUFjLE9BQU8sWUFBYyxnQkFDdkdFLEVBQWlCRixHQUFr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Q2QsQ0FNTyxRQUFXQyxFQUFzQixDQUN0QyxPQUFPLEtBQUssVUFBVSxJQUFJQSxDQUFTLENBQ3JDLENBTU8sYUFBYUEsRUFBNEIsQ0FDOUMsR0FBSSxDQUNGLFlBQUssVUFBVSxJQUFJQSxDQUFTLEVBQ3JCLEVBQ1QsTUFBZ0IsQ0FDZCxNQUFPLEVBQ1QsQ0FDRixDQUNGLEVBckRhRixHQUFORyxFQUFBLENBRE5DLEVBQVEsR0FDSUosSTdOTmJLLEVBQUFDLEVBQWNDLEVBMUJkIiwKICAibmFtZXMiOiBbInJlcXVpcmVfUmVmbGVjdCIsICJfX2NvbW1vbkpTTWluIiwgIlJlZmxlY3QiLCAiZmFjdG9yeSIsICJyb290IiwgInNsb3BweU1vZGVUaGlzIiwgImV4cG9ydGVyIiwgIm1ha2VFeHBvcnRlciIsICJ0YXJnZXQiLCAicHJldmlvdXMiLCAia2V5IiwgInZhbHVlIiwgImZ1bmN0aW9uVGhpcyIsICJpbmRpcmVjdEV2YWxUaGlzIiwgImhhc093biIsICJzdXBwb3J0c1N5bWJvbCIsICJ0b1ByaW1pdGl2ZVN5bWJvbCIsICJpdGVyYXRvclN5bWJvbCIsICJzdXBwb3J0c0NyZWF0ZSIsICJzdXBwb3J0c1Byb3RvIiwgImRvd25MZXZlbCIsICJIYXNoTWFwIiwgIk1ha2VEaWN0aW9uYXJ5IiwgIm1hcCIsICJmdW5jdGlvblByb3RvdHlwZSIsICJfTWFwIiwgIkNyZWF0ZU1hcFBvbHlmaWxsIiwgIl9TZXQiLCAiQ3JlYXRlU2V0UG9seWZpbGwiLCAiX1dlYWtNYXAiLCAiQ3JlYXRlV2Vha01hcFBvbHlmaWxsIiwgInJlZ2lzdHJ5U3ltYm9sIiwgIm1ldGFkYXRhUmVnaXN0cnkiLCAiR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwgIm1ldGFkYXRhUHJvdmlkZXIiLCAiQ3JlYXRlTWV0YWRhdGFQcm92aWRlciIsICJkZWNvcmF0ZSIsICJkZWNvcmF0b3JzIiwgInByb3BlcnR5S2V5IiwgImF0dHJpYnV0ZXMiLCAiSXNVbmRlZmluZWQiLCAiSXNBcnJheSIsICJJc0NvbnN0cnVjdG9yIiwgIkRlY29yYXRlQ29uc3RydWN0b3IiLCAiSXNPYmplY3QiLCAiSXNOdWxsIiwgIlRvUHJvcGVydHlLZXkiLCAiRGVjb3JhdGVQcm9wZXJ0eSIsICJtZXRhZGF0YSIsICJtZXRhZGF0YUtleSIsICJtZXRhZGF0YVZhbHVlIiwgImRlY29yYXRvciIsICJJc1Byb3BlcnR5S2V5IiwgIk9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEiLCAiZGVmaW5lTWV0YWRhdGEiLCAiaGFzTWV0YWRhdGEiLCAiT3JkaW5hcnlIYXNNZXRhZGF0YSIsICJoYXNPd25NZXRhZGF0YSIsICJPcmRpbmFyeUhhc093bk1ldGFkYXRhIiwgImdldE1ldGFkYXRhIiwgIk9yZGluYXJ5R2V0TWV0YWRhdGEiLCAiZ2V0T3duTWV0YWRhdGEiLCAiT3JkaW5hcnlHZXRPd25NZXRhZGF0YSIsICJnZXRNZXRhZGF0YUtleXMiLCAiT3JkaW5hcnlNZXRhZGF0YUtleXMiLCAiZ2V0T3duTWV0YWRhdGFLZXlzIiwgIk9yZGluYXJ5T3duTWV0YWRhdGFLZXlzIiwgImRlbGV0ZU1ldGFkYXRhIiwgInByb3ZpZGVyIiwgIkdldE1ldGFkYXRhUHJvdmlkZXIiLCAiaSIsICJkZWNvcmF0ZWQiLCAiZGVzY3JpcHRvciIsICJNZXRhZGF0YUtleSIsICJPIiwgIlAiLCAicGFyZW50IiwgIk9yZGluYXJ5R2V0UHJvdG90eXBlT2YiLCAiVG9Cb29sZWFuIiwgIk1ldGFkYXRhVmFsdWUiLCAib3duS2V5cyIsICJwYXJlbnRLZXlzIiwgInNldCIsICJrZXlzIiwgIl9pIiwgIm93bktleXNfMSIsICJoYXNLZXkiLCAiX2EiLCAicGFyZW50S2V5c18xIiwgIlR5cGUiLCAieCIsICJJc1N5bWJvbCIsICJUb1ByaW1pdGl2ZSIsICJpbnB1dCIsICJQcmVmZXJyZWRUeXBlIiwgImhpbnQiLCAiZXhvdGljVG9QcmltIiwgIkdldE1ldGhvZCIsICJyZXN1bHQiLCAiT3JkaW5hcnlUb1ByaW1pdGl2ZSIsICJ0b1N0cmluZ18xIiwgIklzQ2FsbGFibGUiLCAidmFsdWVPZiIsICJ0b1N0cmluZ18yIiwgImFyZ3VtZW50IiwgIlRvU3RyaW5nIiwgIlNhbWVWYWx1ZVplcm8iLCAieSIsICJWIiwgImZ1bmMiLCAiR2V0SXRlcmF0b3IiLCAib2JqIiwgIm1ldGhvZCIsICJpdGVyYXRvciIsICJJdGVyYXRvclZhbHVlIiwgIml0ZXJSZXN1bHQiLCAiSXRlcmF0b3JTdGVwIiwgIkl0ZXJhdG9yQ2xvc2UiLCAiZiIsICJwcm90byIsICJwcm90b3R5cGUiLCAicHJvdG90eXBlUHJvdG8iLCAiY29uc3RydWN0b3IiLCAiQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSIsICJmYWxsYmFjayIsICJDcmVhdGVGYWxsYmFja1Byb3ZpZGVyIiwgImZpcnN0IiwgInNlY29uZCIsICJyZXN0IiwgInRhcmdldFByb3ZpZGVyTWFwIiwgInJlZ2lzdHJ5IiwgInJlZ2lzdGVyUHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXIiLCAic2V0UHJvdmlkZXIiLCAiZ2V0UHJvdmlkZXJOb0NhY2hlIiwgIm5leHQiLCAicHJvdmlkZXJNYXAiLCAiaGFzUHJvdmlkZXIiLCAiZXhpc3RpbmdQcm92aWRlciIsICJ0YXJnZXRNZXRhZGF0YSIsICJPcmRpbmFyeURlbGV0ZU1ldGFkYXRhIiwgIkdldE9yQ3JlYXRlTWV0YWRhdGFNYXAiLCAiQ3JlYXRlIiwgImNyZWF0ZWRUYXJnZXRNZXRhZGF0YSIsICJtZXRhZGF0YU1hcCIsICJrZXlzT2JqIiwgImsiLCAibmV4dFZhbHVlIiwgImUiLCAicmVmbGVjdCIsICJtZXRhZGF0YU93bmVyIiwgIm1ldGFkYXRhUHJvcGVydHlTZXQiLCAicmVnaXN0ZXJlZFByb3ZpZGVyIiwgImNhY2hlU2VudGluZWwiLCAiYXJyYXlTZW50aW5lbCIsICJNYXBJdGVyYXRvciIsICJ2YWx1ZXMiLCAic2VsZWN0b3IiLCAiaW5kZXgiLCAiZXJyb3IiLCAiTWFwIiwgInNpemUiLCAiZ2V0S2V5IiwgImdldFZhbHVlIiwgImdldEVudHJ5IiwgImluc2VydCIsICJfIiwgIlNldCIsICJVVUlEX1NJWkUiLCAicm9vdEtleSIsICJDcmVhdGVVbmlxdWVLZXkiLCAiV2Vha01hcCIsICJ0YWJsZSIsICJHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSIsICJDcmVhdGVVVUlEIiwgImNyZWF0ZSIsICJGaWxsUmFuZG9tQnl0ZXMiLCAiYnVmZmVyIiwgIkdlblJhbmRvbUJ5dGVzIiwgImFycmF5IiwgImRhdGEiLCAib2Zmc2V0IiwgImJ5dGUiLCAiaW5kZXhfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJDb250YWluZXJSZWdpc3RyeSIsICJESUNvbnRhaW5lckVycm9yIiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgIkxhbWJkYVBpcGVsaW5lIiwgIk1pY3Jvc2VydmljZVJlZ2lzdHJhciIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIlJ1bnRpbWVDb250YWluZXIiLCAiUnVudGltZURldGVjdG9yIiwgIlJ1bnRpbWVEaSIsICJSdW50aW1lRXh0ZW5zaW9ucyIsICJSdW50aW1lV2ViTGFtYmRhSGFuZGxlciIsICJUaWVzUmVnaXN0cmFyIiwgIlRpZXNSZWdpc3RyYXRpb25FcnJvciIsICJlcnJvcldyYXBwZXIiLCAiZnVsbFdyYXBwZXIiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImdldENES01ldGFkYXRhIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImxvZ2dpbmdXcmFwcGVyIiwgInRpbWluZ1dyYXBwZXIiLCAiX190b0NvbW1vbkpTIiwgIl9fcmVFeHBvcnQiLCAiZ2V0QnJvd3Nlck1ldGFkYXRhIiwgImVycm9yIiwgImdldExhbWJkYU1ldGFkYXRhIiwgImZ1bmN0aW9uTmFtZSIsICJtZW1vcnlTaXplIiwgImdldENES01ldGFkYXRhIiwgIlJ1bnRpbWVEZXRlY3RvciIsICJnZXRCcm93c2VyTWV0YWRhdGEiLCAiZ2V0TGFtYmRhTWV0YWRhdGEiLCAiZ2V0Q0RLTWV0YWRhdGEiLCAiYXJnIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImlzUHJvbWlzZSIsICJvYmplY3QiLCAidGhlbiIsICJzdHJpbmdpZnlTZXJ2aWNlSWRlbnRpZmllciIsICJzZXJ2aWNlSWRlbnRpZmllciIsICJ0b1N0cmluZyIsICJuYW1lIiwgIkVycm9yIiwgImlzbGF6eVNlcnZpY2VJZGVudGlmaWVyU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgImJ1aWxkU2VydmljZUlkIiwgInRoaXMiLCAidmFsdWUiLCAidW53cmFwIiwgImdldE93blJlZmxlY3RNZXRhZGF0YSIsICJ0YXJnZXQiLCAibWV0YWRhdGFLZXkiLCAicHJvcGVydHlLZXkiLCAiUmVmbGVjdCIsICJnZXRPd25NZXRhZGF0YSIsICJzZXRSZWZsZWN0TWV0YWRhdGEiLCAidGFyZ2V0IiwgIm1ldGFkYXRhS2V5IiwgIm1ldGFkYXRhIiwgInByb3BlcnR5S2V5IiwgIlJlZmxlY3QiLCAiZGVmaW5lTWV0YWRhdGEiLCAidXBkYXRlT3duUmVmbGVjdE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFZhbHVlIiwgImNhbGxiYWNrIiwgInVwZGF0ZWRNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiSURfTUVUQURBVEEiLCAiZ2V0QmluZGluZ0lkIiwgImJpbmRpbmdJZCIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAiT2JqZWN0IiwgIk51bWJlciIsICJNQVhfU0FGRV9JTlRFR0VSIiwgInNldFJlZmxlY3RNZXRhZGF0YSIsICJNSU5fU0FGRV9JTlRFR0VSIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJpZCIsICJiaW5kaW5nU2NvcGVWYWx1ZXMiLCAiUmVxdWVzdCIsICJTaW5nbGV0b24iLCAiVHJhbnNpZW50IiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkNvbnN0YW50VmFsdWUiLCAiRHluYW1pY1ZhbHVlIiwgIkZhY3RvcnkiLCAiSW5zdGFuY2UiLCAiUHJvdmlkZXIiLCAiUmVzb2x2ZWRWYWx1ZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAiQWN0aXZhdGlvblJlbGF0aW9uS2luZCIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJsaWZlY3ljbGUiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicHJlRGVzdHJveU1ldGhvZE5hbWUiLCAidW5kZWZpbmVkIiwgInByb3BlcnRpZXMiLCAiTWFwIiwgInNjb3BlIiwgInBlbmRpbmdDbGFzc01ldGFkYXRhQ291bnRSZWZsZWN0S2V5IiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiRXJyb3IiLCAia2luZCIsICJtZXNzYWdlIiwgIm9wdGlvbnMiLCAic3VwZXIiLCAidGhpcyIsICJ2YWx1ZSIsICJpcyIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIkJpbmRpbmdSZWxhdGlvbktpbmQiLCAiRGVhY3RpdmF0aW9uUmVsYXRpb25LaW5kIiwgIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZCIsICJnZXRDbGFzc01ldGFkYXRhIiwgInR5cGUiLCAiY2xhc3NNZXRhZGF0YSIsICJnZXRPd25SZWZsZWN0TWV0YWRhdGEiLCAicGVuZGluZ0NsYXNzTWV0YWRhdGFDb3VudCIsICJ1bmRlZmluZWRJbmRleGVzIiwgImxlbmd0aCIsICJtaXNzaW5nSW5qZWN0aW9uRGVjb3JhdG9yIiwgIm5hbWUiLCAidG9TdHJpbmciLCAiaSIsICJwdXNoIiwgImpvaW4iLCAiZXJyb3JzIiwgImNvbnN0cnVjdG9yQXJndW1lbnQiLCAidW5rbm93biIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0eSIsICJidWlsZEluc3RhbmNlQmluZGluZyIsICJhdXRvYmluZE9wdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGUiLCAiaXNSaWdodCIsICJpZCIsICJnZXRCaW5kaW5nSWQiLCAiaW1wbGVtZW50YXRpb25UeXBlIiwgImlzU2F0aXNmaWVkQnkiLCAibW9kdWxlSWQiLCAib25BY3RpdmF0aW9uIiwgIm9uRGVhY3RpdmF0aW9uIiwgImJpbmRpbmdUeXBlVmFsdWVzIiwgIkluc3RhbmNlIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiTWF5YmVDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQiLCAiQmluZGluZ1JlbGF0aW9uS2luZCIsICJEZWFjdGl2YXRpb25SZWxhdGlvbktpbmQiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdE1ldGFkYXRhIiwgImJ1aWxkTWV0YWRhdGFGcm9tTWF5YmVNYW5hZ2VkTWV0YWRhdGEiLCAicGFyYW1zIiwgIm1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJpbmplY3Rpb25EZWNvcmF0b3JDb25mbGljdCIsICJhc3NlcnRNZXRhZGF0YUZyb21UeXBlc2NyaXB0SWZNYW5hZ2VkIiwgIk1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVua25vd24iLCAiaXNGcm9tVHlwZXNjcmlwdFBhcmFtVHlwZSIsICJidWlsZE1hbmFnZWRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgIm9wdGlvbnMiLCAibXVsdGlwbGVJbmplY3Rpb24iLCAiY2hhaW5lZCIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgIkRlY29yYXRvckluZm9LaW5kIiwgIkRlY29yYXRvckluZm9LaW5kIiwgImNsYXNzSXNJbmplY3RhYmxlRmxhZ1JlZmxlY3RLZXkiLCAiTk9OX1VTRVJMQU5EX1RZUEVTIiwgIkFycmF5IiwgIkJpZ0ludCIsICJCb29sZWFuIiwgIkZ1bmN0aW9uIiwgIk51bWJlciIsICJPYmplY3QiLCAiU3RyaW5nIiwgInVwZGF0ZUNsYXNzTWV0YWRhdGFXaXRoVHlwZXNjcmlwdFBhcmFtZXRlclR5cGVzIiwgInRhcmdldCIsICJ0eXBlc2NyaXB0Q29uc3RydWN0b3JBcmd1bWVudHMiLCAiZ2V0T3duUmVmbGVjdE1ldGFkYXRhIiwgInVwZGF0ZU93blJlZmxlY3RNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhUmVmbGVjdEtleSIsICJnZXREZWZhdWx0Q2xhc3NNZXRhZGF0YSIsICJjbGFzc01ldGFkYXRhIiwgImZvckVhY2giLCAiY29uc3RydWN0b3JBcmd1bWVudFR5cGUiLCAiaW5kZXgiLCAidHlwZSIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJpbmNsdWRlcyIsICJpc0Zyb21UeXBlc2NyaXB0UGFyYW1UeXBlIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInNpbmdsZUluamVjdGlvbiIsICJuYW1lIiwgIm9wdGlvbmFsIiwgInRhZ3MiLCAiTWFwIiwgInZhbHVlIiwgImluamVjdGFibGUiLCAic2NvcGUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAic2V0UmVmbGVjdE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImJ1aWxkRGVmYXVsdFVubWFuYWdlZE1ldGFkYXRhIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJidWlsZFVubWFuYWdlZE1ldGFkYXRhRnJvbU1heWJlQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAiYnVpbGRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21NYXliZUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFzc2VydE1ldGFkYXRhRnJvbVR5cGVzY3JpcHRJZk1hbmFnZWQiLCAibmFtZSIsICJvcHRpb25hbCIsICJ0YWdzIiwgInNpemUiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAiaW5qZWN0aW9uRGVjb3JhdG9yQ29uZmxpY3QiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YUtpbmQiLCAiaXNMYXp5UGxhblNlcnZpY2VOb2RlU3ltYm9sIiwgIlN5bWJvbCIsICJmb3IiLCAiTGF6eVBsYW5TZXJ2aWNlTm9kZSIsICJfc2VydmljZUlkZW50aWZpZXIiLCAiX3NlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgInNlcnZpY2VJZGVudGlmaWVyIiwgInRoaXMiLCAiYmluZGluZ3MiLCAiX2dldE5vZGUiLCAiaXNDb250ZXh0RnJlZSIsICJ2YWx1ZSIsICJpbnZhbGlkYXRlIiwgImlzRXhwYW5kZWQiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkJpbmRpbmdDb25zdHJhaW50c0ltcGxlbWVudGF0aW9uIiwgIm5vZGUiLCAibmFtZSIsICJlbGVtIiwgInRhZ3MiLCAiZ2V0QW5jZXN0b3IiLCAiZ2V0QW5jZXN0b3JzQ2FsbGVkIiwgInByZXZpb3VzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJvcHRpb25zIiwgImN1c3RvbVNlcnZpY2VJZGVudGlmaWVyIiwgImZpbHRlcmVkQmluZGluZ3MiLCAiY2hhaW5lZCIsICJvcGVyYXRpb25zIiwgImdldEJpbmRpbmdzQ2hhaW5lZCIsICJnZXRCaW5kaW5ncyIsICJmaWx0ZXIiLCAiYmluZGluZyIsICJpc1NhdGlzZmllZEJ5IiwgImxlbmd0aCIsICJhdXRvYmluZE9wdGlvbnMiLCAiYnVpbGRJbnN0YW5jZUJpbmRpbmciLCAic2V0QmluZGluZyIsICJwdXNoIiwgImlzUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgIm5vZGUiLCAicmVkaXJlY3Rpb25zIiwgInRocm93RXJyb3JXaGVuVW5leHBlY3RlZEJpbmRpbmdzQW1vdW50Rm91bmQiLCAiYmluZGluZ05vZGVzIiwgImlzT3B0aW9uYWwiLCAiYmluZGluZ0NvbnN0cmFpbnROb2RlIiwgInNlcnZpY2VSZWRpcmVjdGlvbnMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiZWxlbSIsICJwYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJwcmV2aW91cyIsICJBcnJheSIsICJpc0FycmF5IiwgImJpbmRpbmdDb25zdHJhaW50cyIsICJsZW5ndGgiLCAibGFzdFJlc29sdmVkU2VydmljZUlkZW50aWZpZXIiLCAiZXJyb3JNZXNzYWdlIiwgInN0cmluZ2lmeVNlcnZpY2VJZGVudGlmaWVyIiwgInN0cmluZ2lmeVNlcnZpY2VSZWRpcmVjdGlvbnMiLCAibWFwIiwgImJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJJbnN0YW5jZSIsICJzY29wZSIsICJpbXBsZW1lbnRhdGlvblR5cGUiLCAibmFtZSIsICJTZXJ2aWNlUmVkaXJlY3Rpb24iLCAidGFyZ2V0U2VydmljZUlkZW50aWZpZXIiLCAiam9pbiIsICJzdHJpbmdpZnlQYXJlbnRTZXJ2aWNlSWRlbnRpZmllciIsICJzdHJpbmdpZnlCaW5kaW5nQ29uc3RyYWludHMiLCAiSW52ZXJzaWZ5Q29yZUVycm9yIiwgIkludmVyc2lmeUNvcmVFcnJvcktpbmQiLCAicGxhbm5pbmciLCAidGhyb3dCaW5kaW5nTm90Rm91bmRFcnJvciIsICJzdHJpbmdpZmllZFRhZ3MiLCAidGFncyIsICJzaXplIiwgImtleXMiLCAia2V5IiwgInRvU3RyaW5nIiwgImNoZWNrUGxhblNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlU2luZ2xlSW5qZWN0aW9uQmluZGluZ3MiLCAic2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicGxhbkJpbmRpbmdOb2RlIiwgImNoZWNrU2VydmljZU5vZGVTaW5nbGVJbmplY3Rpb25CaW5kaW5ncyIsICJzZXJ2aWNlTm9kZSIsICJiaW5kaW5ncyIsICJnZXRTZXJ2aWNlRnJvbU1heWJlTGF6eVNlcnZpY2VJZGVudGlmaWVyIiwgIkxhenlTZXJ2aWNlSWRlbnRpZmllciIsICJpcyIsICJ1bndyYXAiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFNlcnZpY2VOb2RlQmluZGluZ3MiLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAiZWxlbWVudE1ldGFkYXRhIiwgInZhbHVlIiwgInVwZGF0ZWRCaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImNvbmNhdCIsICJnZXRBbmNlc3RvcnNDYWxsZWQiLCAiQmluZGluZ0NvbnN0cmFpbnRzSW1wbGVtZW50YXRpb24iLCAibGFzdCIsICJjaGFpbmVkIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgIm11bHRpcGxlSW5qZWN0aW9uIiwgImZpbHRlcmVkU2VydmljZUJpbmRpbmdzIiwgImJ1aWxkRmlsdGVyZWRTZXJ2aWNlQmluZGluZ3MiLCAic2VydmljZU5vZGVCaW5kaW5ncyIsICJpc0NvbnRleHRGcmVlIiwgInB1c2giLCAic2luZ2xlSW5qZWN0aW9uIiwgIm9wdGlvbmFsIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJSZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhS2luZCIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJzdWJwbGFuIiwgImJ1aWxkSW5zdGFuY2VQbGFuQmluZGluZ05vZGUiLCAiY2hpbGROb2RlIiwgImNsYXNzTWV0YWRhdGEiLCAib3BlcmF0aW9ucyIsICJnZXRDbGFzc01ldGFkYXRhIiwgImNvbnN0cnVjdG9yUGFyYW1zIiwgInByb3BlcnR5UGFyYW1zIiwgIk1hcCIsICJzdWJwbGFuUGFyYW1zIiwgImF1dG9iaW5kT3B0aW9ucyIsICJzZXJ2aWNlc0JyYW5jaCIsICJidWlsZFJlc29sdmVkVmFsdWVQbGFuQmluZGluZ05vZGUiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgInBsYW5CaW5kaW5nTm9kZXMiLCAiUmVzb2x2ZWRWYWx1ZSIsICJidWlsZFNlcnZpY2VSZWRpcmVjdGlvblBsYW5CaW5kaW5nTm9kZSIsICJwb3AiLCAiY3VzdG9tU2VydmljZUlkZW50aWZpZXIiLCAiY2FjaGVOb25Sb290UGxhblNlcnZpY2VOb2RlIiwgImdldFBsYW5PcHRpb25zIiwgInBsYW5TZXJ2aWNlTm9kZSIsICJjb250ZXh0IiwgIkxhenlQbGFuU2VydmljZU5vZGUiLCAiaXNFeHBhbmRlZCIsICJwbGFuUmVzdWx0IiwgInRyZWUiLCAicm9vdCIsICJzZXRQbGFuIiwgInNldE5vbkNhY2hlZFNlcnZpY2VOb2RlIiwgIkxhenlNYW5hZ2VkQ2xhc3NNZXRhZGF0YVBsYW5TZXJ2aWNlTm9kZSIsICJidWlsZExhenlQbGFuU2VydmljZU5vZGVOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgInN1cGVyIiwgInRoaXMiLCAiX2J1aWxkUGxhblNlcnZpY2VOb2RlIiwgIkxhenlSZXNvbHZlZFZhbHVlTWV0YWRhdGFQbGFuU2VydmljZU5vZGUiLCAiYnVpbGRMYXp5UGxhblNlcnZpY2VOb2RlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlTdWJwbGFuIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAic3VicGxhbkluc3RhbmNlQmluZGluZ05vZGUiLCAiaGFuZGxlUGxhblNlcnZpY2VOb2RlQnVpbGRGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAidW5tYW5hZ2VkIiwgInRhZyIsICJlbnRyaWVzIiwgIm5leHQiLCAiaXNNdWx0aXBsZSIsICJnZXRQbGFuIiwgImxhenlQbGFuU2VydmljZU5vZGUiLCAib3B0aW9uYWxCaW5kaW5ncyIsICJpbmRleCIsICJjb25zdHJ1Y3RvckFyZ3VtZW50cyIsICJwcm9wZXJ0eUtleSIsICJwcm9wZXJ0aWVzIiwgInNldCIsICJzdWJwbGFuUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgImhhbmRsZVBsYW5TZXJ2aWNlTm9kZUJ1aWxkRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAicmVzb2x2ZWRWYWx1ZU1ldGFkYXRhIiwgIm1ldGFkYXRhIiwgImFyZ3VtZW50cyIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJjdXJyeUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbUNsYXNzRWxlbWVudE1ldGFkYXRhIiwgImNpcmN1bGFyQnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgImJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeUJ1aWxkU2VydmljZU5vZGVCaW5kaW5ncyIsICJjdXJyeVN1YnBsYW4iLCAicGFyYW1zIiwgImJpbmRpbmdDb25zdHJhaW50c0xpc3QiLCAic2VydmljZUJpbmRpbmdzIiwgInBhcmVudE5vZGUiLCAiY2hhaW5lZEJpbmRpbmdzIiwgIkNhY2hlQmluZGluZ0ludmFsaWRhdGlvbktpbmQiLCAiYnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5QnVpbGRTZXJ2aWNlTm9kZUJpbmRpbmdzIiwgImN1cnJ5U3VicGxhbiIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJidWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21SZXNvbHZlZFZhbHVlRWxlbWVudE1ldGFkYXRhIiwgInBhcmFtcyIsICJiaW5kaW5nQ29uc3RyYWludHNMaXN0IiwgImVsZW1lbnRNZXRhZGF0YSIsICJsYXp5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tQ2xhc3NFbGVtZW50TWV0YWRhdGEiLCAibGF6eUJ1aWxkUGxhblNlcnZpY2VOb2RlRnJvbVJlc29sdmVkVmFsdWVFbGVtZW50TWV0YWRhdGEiLCAiY3VycnlCdWlsZFBsYW5TZXJ2aWNlTm9kZUZyb21DbGFzc0VsZW1lbnRNZXRhZGF0YSIsICJlcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiaXNFcnJvck9mS2luZCIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInBsYW5uaW5nIiwgImN1cnJ5QnVpbGRQbGFuU2VydmljZU5vZGVGcm9tUmVzb2x2ZWRWYWx1ZUVsZW1lbnRNZXRhZGF0YSIsICJjYWNoZVJlc29sdmVkVmFsdWUiLCAiYmluZGluZyIsICJyZXNvbHZlZFZhbHVlIiwgImlzUHJvbWlzZSIsICJjYWNoZSIsICJpc1JpZ2h0IiwgInZhbHVlIiwgInRoZW4iLCAic3luY1Jlc29sdmVkVmFsdWUiLCAiY2FjaGVTeW5jUmVzb2x2ZWRWYWx1ZSIsICJyZXNvbHZlQmluZGluZ1NlcnZpY2VBY3RpdmF0aW9ucyIsICJwYXJhbXMiLCAic2VydmljZUlkZW50aWZpZXIiLCAiYWN0aXZhdGlvbnMiLCAiZ2V0QWN0aXZhdGlvbnMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9uc0Zyb21JdGVyYXRvckFzeW5jIiwgIlN5bWJvbCIsICJpdGVyYXRvciIsICJhY3RpdmF0aW9uc0l0ZXJhdG9yIiwgImFjdGl2YXRlZFZhbHVlIiwgImFjdGl2YXRpb25JdGVyYXRvclJlc3VsdCIsICJuZXh0IiwgImRvbmUiLCAibmV4dEFjdGl2YXRlZFZhbHVlIiwgImNvbnRleHQiLCAiYXN5bmMiLCAicmVzb2x2ZUJpbmRpbmdBY3RpdmF0aW9ucyIsICJhY3RpdmF0aW9uUmVzdWx0IiwgIm9uQWN0aXZhdGlvbiIsICJyZXNvbHZlZCIsICJyZXNvbHZlU2luZ2xldG9uU2NvcGVkQmluZGluZyIsICJyZXNvbHZlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJfcGFyYW1zIiwgImdldFNlbGYiLCAic2VsZiIsICJyZXNvbHZlU2NvcGVkIiwgImdldEJpbmRpbmciLCAiYXJnIiwgInNjb3BlIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJTaW5nbGV0b24iLCAiUmVxdWVzdCIsICJyZXF1ZXN0U2NvcGVDYWNoZSIsICJoYXMiLCAiaWQiLCAiZ2V0IiwgInNldCIsICJUcmFuc2llbnQiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAicmVzb2x2ZUZhY3RvcnlCaW5kaW5nIiwgImZhY3RvcnkiLCAicmVzb2x2ZVBvc3RDb25zdHJ1Y3QiLCAiaW5zdGFuY2UiLCAicG9zdENvbnN0cnVjdE1ldGhvZE5hbWUiLCAicG9zdENvbnN0cnVjdFJlc3VsdCIsICJJbnZlcnNpZnlDb3JlRXJyb3IiLCAiSW52ZXJzaWZ5Q29yZUVycm9yS2luZCIsICJyZXNvbHV0aW9uIiwgInRvU3RyaW5nIiwgImltcGxlbWVudGF0aW9uVHlwZSIsICJuYW1lIiwgImVycm9yIiwgImNhdXNlIiwgInJlc29sdmVJbnN0YW5jZUJpbmRpbmdOb2RlRnJvbUNvbnN0cnVjdG9yUGFyYW1zIiwgInNldEluc3RhbmNlUHJvcGVydGllcyIsICJjb25zdHJ1Y3RvclZhbHVlcyIsICJub2RlIiwgInByb3BlcnRpZXNBc3NpZ25tZW50UmVzdWx0IiwgImNsYXNzTWV0YWRhdGEiLCAibGlmZWN5Y2xlIiwgInJlc29sdmVQcm92aWRlckJpbmRpbmciLCAicHJvdmlkZXIiLCAiZ2V0SW5zdGFuY2VOb2RlQmluZGluZyIsICJnZXRSZXNvbHZlZFZhbHVlTm9kZUJpbmRpbmciLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInByb3BlcnR5QXNzaWdubWVudFByb21pc2VzIiwgInByb3BlcnR5S2V5IiwgInByb3BlcnR5Tm9kZSIsICJwcm9wZXJ0eVBhcmFtcyIsICJtZXRhZGF0YSIsICJwcm9wZXJ0aWVzIiwgImtpbmQiLCAiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwgInVubWFuYWdlZCIsICJiaW5kaW5ncyIsICJwdXNoIiwgImxlbmd0aCIsICJQcm9taXNlIiwgImFsbCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicmVzb2x2ZUJpbmRpbmdOb2RlIiwgImlubmVyUmVzb2x2ZVNlcnZpY2VSZWRpcmVjdGlvbkJpbmRpbmdOb2RlIiwgInJlc29sdmVkVmFsdWVzIiwgInJlZGlyZWN0aW9uIiwgInJlZGlyZWN0aW9ucyIsICJpc1BsYW5TZXJ2aWNlUmVkaXJlY3Rpb25CaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlSW5zdGFuY2VCaW5kaW5nQ29uc3RydWN0b3JQYXJhbXMiLCAicmVzb2x2ZUluc3RhbmNlQmluZGluZ05vZGVBc3luY0Zyb21Db25zdHJ1Y3RvclBhcmFtcyIsICJjb25zdHJ1Y3RvclJlc29sdmVkVmFsdWVzIiwgImNvbnN0cnVjdG9yUGFyYW0iLCAiY29uc3RydWN0b3JQYXJhbXMiLCAidW5kZWZpbmVkIiwgInNvbWUiLCAicmVzb2x2ZVJlc29sdmVkVmFsdWVCaW5kaW5nTm9kZSIsICJyZXNvbHZlUmVzb2x2ZWRWYWx1ZUJpbmRpbmdQYXJhbXMiLCAicGFyYW1WYWx1ZXMiLCAicmVzb2x2ZWRQYXJhbVZhbHVlcyIsICJwYXJhbXNSZXNvbHZlZFZhbHVlcyIsICJwYXJhbSIsICJyZXNvbHZlU2NvcGVkSW5zdGFuY2VCaW5kaW5nTm9kZSIsICJyZXNvbHZlU2NvcGVkUmVzb2x2ZWRWYWx1ZUJpbmRpbmdOb2RlIiwgInJlc29sdmVCaW5kaW5nTm9kZSIsICJwYXJhbXMiLCAicGxhbkJpbmRpbmdOb2RlIiwgImJpbmRpbmciLCAidHlwZSIsICJiaW5kaW5nVHlwZVZhbHVlcyIsICJDb25zdGFudFZhbHVlIiwgInJlc29sdmVDb25zdGFudFZhbHVlQmluZGluZyIsICJEeW5hbWljVmFsdWUiLCAicmVzb2x2ZUR5bmFtaWNWYWx1ZUJpbmRpbmciLCAiRmFjdG9yeSIsICJyZXNvbHZlRmFjdG9yeUJpbmRpbmciLCAiSW5zdGFuY2UiLCAicmVzb2x2ZVNjb3BlZEluc3RhbmNlQmluZGluZ05vZGUiLCAiUHJvdmlkZXIiLCAicmVzb2x2ZVByb3ZpZGVyQmluZGluZyIsICJSZXNvbHZlZFZhbHVlIiwgInJlc29sdmVTY29wZWRSZXNvbHZlZFZhbHVlQmluZGluZ05vZGUiLCAicmVzb2x2ZVNlcnZpY2VOb2RlIiwgInNlcnZpY2VOb2RlIiwgImJpbmRpbmdzIiwgIkFycmF5IiwgImlzQXJyYXkiLCAicmVzb2x2ZWRWYWx1ZXMiLCAiaXNQbGFuU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAicHVzaCIsICJyZXNvbHZlU2VydmljZVJlZGlyZWN0aW9uQmluZGluZ05vZGUiLCAic29tZSIsICJpc1Byb21pc2UiLCAiUHJvbWlzZSIsICJhbGwiLCAibGVuZ3RoIiwgIkludmVyc2lmeUNvcmVFcnJvciIsICJJbnZlcnNpZnlDb3JlRXJyb3JLaW5kIiwgInJlc29sdXRpb24iLCAiaXNQbHVnaW4iLCAiU3ltYm9sIiwgImZvciIsICJQbHVnaW4iLCAiX2NvbnRhaW5lciIsICJfY29udGV4dCIsICJjb250YWluZXIiLCAiY29udGV4dCIsICJ0aGlzIiwgImlzQXBwRXJyb3JTeW1ib2wiLCAiU3ltYm9sIiwgImZvciIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvciIsICJFcnJvciIsICJraW5kIiwgIm1lc3NhZ2UiLCAib3B0aW9ucyIsICJzdXBlciIsICJ0aGlzIiwgInZhbHVlIiwgImlzIiwgIkludmVyc2lmeUNvbnRhaW5lckVycm9yS2luZCIsICJJbnZlcnNpZnlDb250YWluZXJFcnJvcktpbmQiLCAiREVGQVVMVF9ERUZBVUxUX1NDT1BFIiwgImJpbmRpbmdTY29wZVZhbHVlcyIsICJUcmFuc2llbnQiLCAicHVyYWJsZSIsICJvcHRpb25zIiwgImNvbnN0cnVjdG9yIiwgIlciLCAiRElDb250YWluZXJFcnJvciIsICJjb250YWluZXJOYW1lIiwgIm1lc3NhZ2UiLCAiVGllc1JlZ2lzdHJhdGlvbkVycm9yIiwgInRpZXNDbGFzc05hbWUiLCAicmVhc29uIiwgIk1pc3NpbmdTZXJ2aWNlRXJyb3IiLCAic2VydmljZU5hbWUiLCAiVGllc1JlZ2lzdHJhciIsICJjb250YWluZXIiLCAidGllc0NsYXNzZXMiLCAiVGllc0NsYXNzIiwgInRpZXNJbnN0YW5jZSIsICJUaWVzUmVnaXN0cmF0aW9uRXJyb3IiLCAiZXJyb3IiLCAicmVxdWlyZWRTZXJ2aWNlcyIsICJtaXNzaW5nU2VydmljZXMiLCAic2VydmljZU5hbWUiLCAic2VydmljZU5hbWVzIiwgIm5hbWVzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwdXJhYmxlIiwgImltcG9ydF91dGlscyIsICJQdXJlQ29udGFpbmVyRmFjdG9yeSIsICJUaWVzUmVnaXN0cmFyIiwgInRpZXNDbGFzc2VzIiwgImNvbnRhaW5lciIsICJlcnJvciIsICJESUNvbnRhaW5lckVycm9yIiwgIm9wdGlvbnMiLCAicmVxdWlyZWRTZXJ2aWNlcyIsICJhZGRpdGlvbmFsU2VydmljZXMiLCAiYWxsUmVxdWlyZWRTZXJ2aWNlcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHVyYWJsZSIsICJpbXBvcnRfdXRpbHMiLCAiaW1wb3J0X3V0aWxzIiwgImxvZ2dpbmdXcmFwcGVyIiwgImhhbmRsZXIiLCAibWV0YWRhdGEiLCAiaGFuZGxlckxvZ2dlciIsICJldmVudCIsICJjb250ZXh0IiwgInN0YXJ0VGltZSIsICJjb250ZXh0SW5mbyIsICJleHRyYWN0TGFtYmRhQ29udGV4dCIsICJnZXRFdmVudFR5cGUiLCAicmVzdWx0IiwgIm1ldHJpY3MiLCAiY2FsY3VsYXRlTWV0cmljcyIsICJlcnJvciIsICJlcnJvcldyYXBwZXIiLCAiZXJyb3JMb2dnZXIiLCAiZXJyb3JEZXRhaWxzIiwgImV4dHJhY3RFcnJvckRldGFpbHMiLCAiaXNBcGlHYXRld2F5RXZlbnQiLCAidGltaW5nV3JhcHBlciIsICJ0aW1pbmdMb2dnZXIiLCAic3RhcnRNZW1vcnkiLCAiY2FsY3VsYXRlRGV0YWlsZWRNZXRyaWNzIiwgImZ1bGxXcmFwcGVyIiwgImN0eCIsICJlbmRUaW1lIiwgImVuZE1lbW9yeSIsICJldnQiLCAiaW1wb3J0X3V0aWxzIiwgImltcG9ydF9wdXJld3MiLCAiUnVudGltZVdlYkxhbWJkYUhhbmRsZXIiLCAiZGVmaW5pdGlvbiIsICJjb250YWluZXIiLCAiZmFjdG9yeSIsICJldmVudCIsICJjb250ZXh0IiwgInJlc3VsdCIsICJlcnJvciIsICJkZXBzIiwgInJhd1VzZXJIYW5kbGVyIiwgIndyYXBwZWRIYW5kbGVyIiwgIkxhbWJkYUhhbmRsZXJGYWN0b3J5IiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgIlJ1bnRpbWVXZWJMYW1iZGFIYW5kbGVyIiwgInRpZXMiLCAiZGVwcyIsICJjbGFzc1JlZiIsICJ0b2tlbiIsICJpbnN0YW5jZSIsICJrZXkiLCAiZXJyb3IiLCAiaGFuZGxlciIsICJtZXRhZGF0YSIsICJmdWxsV3JhcHBlciIsICJjbGFzc05hbWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInB1cmFibGUiLCAiQ29udGFpbmVyUmVnaXN0cnkiLCAic2VydmljZU5hbWUiLCAiY29udGFpbmVyIiwgIkRJQ29udGFpbmVyRXJyb3IiLCAibGFtYmRhSWQiLCAiZGVmaW5pdGlvbiIsICJNaXNzaW5nU2VydmljZUVycm9yIiwgImV4aXN0aW5nU2VydmljZSIsICJsYW1iZGFzIiwgInNlcnZpY2UiLCAiZXhpc3RlZCIsICJsYW1iZGFzVG9SZW1vdmUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgIlciLCAiTWljcm9zZXJ2aWNlUmVnaXN0cmFyIiwgIlB1cmVDb250YWluZXJGYWN0b3J5IiwgIkNvbnRhaW5lclJlZ2lzdHJ5IiwgInNlcnZpY2VOYW1lIiwgImRlZmluaXRpb24iLCAiY29udGFpbmVyIiwgImxhbWJkYURlZiIsICJsYW1iZGFJZCIsICJlcnJvciIsICJoYW5kbGVyTmFtZSIsICJyZXF1aXJlZFNlcnZpY2VzIiwgInRpZUNsYXNzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwdXJhYmxlIiwgImltcG9ydF91dGlscyIsICJMYW1iZGFQaXBlbGluZSIsICJjb25maWciLCAiY29udGV4dCIsICJsYW1iZGFJZCIsICJjb250YWluZXIiLCAiaGFuZGxlciIsICJlcnJvciIsICJNaWNyb3NlcnZpY2VSZWdpc3RyYXIiLCAic2VydmljZU5hbWUiLCAiZGVmaW5pdGlvbiIsICJMYW1iZGFIYW5kbGVyRmFjdG9yeSIsICJsYW1iZGFEZWZpbml0aW9uIiwgInNlcnZpY2VzX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUnVudGltZUV4dGVuc2lvbnMiLCAiaW1wb3J0X3JlZmxlY3RfbWV0YWRhdGEiLCAiX19yZUV4cG9ydCIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJpbXBvcnRfdXRpbHMiLCAiUnVudGltZUV4dGVuc2lvbnMiLCAiYmVmb3JlSW5zdGFuY2UiLCAic2VydmVyQ29uZmlnIiwgImVuaGFuY2VtZW50cyIsICJidWlsZENvbmZpZyIsICJvcHRpbWl6YXRpb25zIiwgImJhc2VTdGFja0NvbmZpZyIsICJjb25maWciLCAiZmVhdHVyZSIsICJmIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJfX3JlRXhwb3J0IiwgImluZGV4X2V4cG9ydHMiLCAic2VydmljZXNfZXhwb3J0cyIsICJidW5kbGVfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSdW50aW1lQ29udGFpbmVyIiwgIlJ1bnRpbWVEaSIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJfX3JlRXhwb3J0IiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF91dGlscyIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJSdW50aW1lRGkiLCAiUnVudGltZUNvbnRhaW5lciIsICJSdW50aW1lRXh0ZW5zaW9ucyIsICJzZXJ2aWNlSWQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInB1cmFibGUiLCAiX19yZUV4cG9ydCIsICJpbmRleF9leHBvcnRzIiwgImJ1bmRsZV9leHBvcnRzIl0KfQo=
|