@serenityjs/plugins 0.8.17 → 0.8.18-beta-20260205000321

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/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var Z=Object.defineProperty;var d=(a,e)=>Z(a,"name",{value:e,configurable:!0}),v=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as w,mkdirSync as B,readdirSync as O,readFileSync as P,unlinkSync as z,writeFileSync as F}from"node:fs";import{relative as y,resolve as o}from"node:path";import{deflateSync as D,inflateSync as U}from"node:zlib";import{Logger as ie,LoggerColors as re}from"@serenityjs/logger";import{ServerEvent as M,WorldEvent as q}from"@serenityjs/core";import{BinaryStream as j}from"@serenityjs/binarystream";import{relative as G}from"path";import{CustomEnum as N}from"@serenityjs/core";var b=class extends N{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},E=class extends N{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var Q=d((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:E},({action:s})=>{if(s.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],r=[];for(let i of n)r.push(`\xA7u${i.identifier} v${i.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),t.overload({action:E,plugin:b},({action:s,plugin:n})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=e.plugins.get(n.result);if(!r)throw new Error(`Plugin ${n.result} is not found.`);if(s.result==="reload")return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${G(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=Q;var m=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(m||{});var R=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(R||{});var k=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(k||{});import{existsSync as f,readFileSync as X,mkdirSync as $,writeFileSync as Y,rmSync as H,readdirSync as ee}from"fs";import{resolve as x,sep as _,isAbsolute as te}from"path";var I=class{static{d(this,"PluginFileSystem")}dataPath;logger;constructor(e,t){this.dataPath=e,this.logger=t}validatePath(e,t){if(!te(e))return this.logger.warn(`Attempted to access invalid path: ${e}. Path must be absolute.`),!1;if(!e.startsWith(this.dataPath+_))return this.logger.warn(`Invalid path: ${e}. Path must be within the plugin's data directory.`),!1;let n=/.*\..+/.test(e);return t==="file"&&!n||t==="directory"&&n?(this.logger.warn(`Invalid path: ${e}. Path is not a valid ${t}.`),!1):!0}readFile(e,t){if(!f(this.dataPath))return null;let s=x(this.dataPath,e);return!this.validatePath(s,"file")||!f(s)?null:X(s,t)}writeFile(e,t){f(this.dataPath)||$(this.dataPath,{recursive:!0});let s=x(this.dataPath,e);if(!this.validatePath(s,"file"))return;let r=s.substring(0,s.lastIndexOf(_));return f(r)||$(r,{recursive:!0}),Y(s,t)}removeFile(e){if(!f(this.dataPath))return;let t=x(this.dataPath,e);if(this.validatePath(t,"file")&&f(t))return H(t)}mkdir(e){f(this.dataPath)||$(this.dataPath,{recursive:!0});let t=x(this.dataPath,e);if(this.validatePath(t))return $(t,{recursive:!0})}rmdir(e,t={recursive:!1,force:!1}){if(!f(this.dataPath))return;let s=x(this.dataPath,e);if(this.validatePath(s,"directory")&&f(s))return H(s,t)}readDir(e){if(!f(this.dataPath))return null;let t=x(this.dataPath,e);return!this.validatePath(t,"directory")||!f(t)?null:ee(t)}exists(e){if(!f(this.dataPath))return!1;let t=x(this.dataPath,e);return this.validatePath(t)?f(t):!1}};var se={path:"./plugins",commands:!0,initialize:!0},Ue=class{static{d(this,"Pipeline")}serenity;properties;logger=new ie("Plugins",re.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...se,...t},e.on(M.Start,this.start.bind(this)),e.on(M.Stop,this.stop.bind(this)),e.on(q.WorldInitialize,({world:s})=>{this.properties.commands&&L(s,this);for(let[,n]of this.plugins)s.blockPalette.registerType(...n.blocks.types).registerTrait(...n.blocks.traits),s.itemPalette.registerType(...n.items.types).registerTrait(...n.items.traits),s.entityPalette.registerType(...n.entities.types).registerTrait(...n.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){w(o(this.path))||B(o(this.path),{recursive:!0}),w(o(this.path,"data"))||B(o(this.path,"data"),{recursive:!0}),w(o(this.path,"configs"))||B(o(this.path,"configs"),{recursive:!0});let t=O(o(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory()?r.name!=="data"&&r.name!=="configs":!0).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of t)try{let i=o(this.path,r.name),c=U(P(i)),u=new j(c);switch(u.readByte()){case m.HasNoResources:{let l=u.readVarInt(),p=u.readBuffer(l).toString("utf-8"),h=this.loadFromTextSource(i,p,!0);h&&s.push(h);break}case m.HasResources:{let l=u.readVarInt(),p=u.readBuffer(l).toString("utf-8"),h=this.loadFromTextSource(i,p,!0);if(!h)break;s.push(h);let g=u.readVarInt();for(let A=0;A<g;A++)try{let T=u.readVarInt(),K=u.readBuffer(T),V=this.serenity.resources.loadFromZip(K);h.logger.success(`Loaded resource pack \xA7u${V.name}\xA7r (\xA78${V.uuid}\xA7r).`),h.resources.add(V)}catch(T){this.logger.error(`Failed to load resource pack \xA78${y(process.cwd(),o(this.path,r.name))}\xA7r for plugin \xA71${h.identifier}\xA7r.`,T)}break}case k.Addon:{this.logger.warn(`The plugin \xA71${y(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let l=u.readRemainingBuffer().toString("utf-8"),p=this.loadFromTextSource(i,l,!0);p&&s.push(p);break}case k.Api:this.logger.error(`The plugin \xA71${y(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${y(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}let n=O(o(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of n)try{let i=o(this.path,r.name);if(!w(o(i,"package.json")))continue;let c=JSON.parse(P(o(i,"package.json"),"utf-8")),u=o(i,c.main);if(!w(o(i,u))){this.logger.warn(`Unable to load plugin \xA7u${c.name??"unknown-plugin"}\xA78@\xA7u${c.version??"unknown-version"}\xA7r, the main entry path "\xA78${y(process.cwd(),o(i,u))}\xA7r" was not found in the directory.`);continue}let S=v(o(i,u)),l=S.default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA7u${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=i,l.isBundled=!1,l.fileSystem=new I(o(l.path,"../data",l.identifier),l.logger),this.linkModule(l.identifier,S),this.plugins.set(l.identifier,l),b.options.push(l.identifier),s.push(l),w(o(i,"resource_packs"))||B(o(i,"resource_packs"));let p=O(o(i,"resource_packs"),{withFileTypes:!0}).filter(h=>h.isDirectory());for(let h of p)try{let g=this.serenity.resources.loadFromPath(o(i,"resource_packs",h.name));l.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),l.resources.add(g)}catch(g){this.logger.error(`Failed to load resource pack \xA78${y(process.cwd(),o(i,"resource_packs",h.name))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,g)}}catch(i){this.logger.error(`Failed to load plugin from "${y(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}s.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of s){if(Object.keys(r.config).length>0){let i=o(this.path,"configs",`${r.identifier}.json`);if(!w(i))F(i,JSON.stringify(r.config,null,2));else{let c=JSON.parse(P(i,"utf-8"));Object.assign(r.config,c)}}if(r.onInitialize(r),this.bindEvents(r),r.isBundled){let i=o(r.path.slice(0,-7).replace(/\./g,"_"));w(i)&&process.nextTick(()=>z(i))}}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e)}loadFromTextSource(e,t,s=!1){let n=o(e.slice(0,-7).replace(/\./g,"_"));F(o(n),t);try{let r=v(o(n)),i=r.default;return this.plugins.has(i.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${i.identifier}\xA7r, the plugin is already loaded in the pipeline.`),z(o(n)),null):(i.pipeline=this,i.serenity=this.serenity,i.path=o(e),i.isBundled=s,i.fileSystem=new I(o(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),b.options.push(i.identifier),i)}catch(r){this.logger.error(`Failed to load plugin from \xA78${y(process.cwd(),e)}\xA7r, skipping the plugin.`,r),z(o(n))}return null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete v.cache[v.resolve(t)],this.serenity.removePath(t);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=U(P(t)),n=new j(s);switch(n.readByte()){case m.HasNoResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case m.HasResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let S=n.readVarInt();for(let l=0;l<S;l++)try{let p=n.readVarInt(),h=n.readBuffer(p),g=this.serenity.resources.loadFromZip(h);u.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),u.resources.add(g)}catch(p){this.logger.error(`Failed to load resource pack \xA78${y(process.cwd(),o(this.path,t))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,p)}}}}else{let s=JSON.parse(P(o(t,"package.json"),"utf-8")),n=o(t,s.main);if(!w(o(t,n))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${y(process.cwd(),o(t,n))}\xA7r" was not found in the directory.`);return}let r=v(o(t,n)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,i.fileSystem=new I(o(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),b.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new j,s=e.resources.size>0?m.HasResources:m.HasNoResources;switch(t.writeByte(s),s){case m.HasNoResources:{let n=o(e.path,"dist","index.js"),r=P(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),F(o(this.path,`${e.identifier}-v${e.version}.plugin`),D(t.getBuffer()));break}case m.HasResources:{let n=o(e.path,"dist","index.js"),r=P(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let c=i.compress();t.writeVarInt(c.byteLength),t.writeBuffer(c)}F(o(this.path,`${e.identifier}-v${e.version}.plugin`),D(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(t),n=Object.keys(q);n=n.slice(n.length/2);for(let r of n){let i=n.indexOf(r);if(s.includes("on"+r)){let c=e["on"+r];typeof c=="function"&&this.serenity.on(i,c.bind(e))}if(s.includes("before"+r)){let c=e["before"+r];typeof c=="function"&&this.serenity.before(i,c.bind(e))}if(s.includes("after"+r)){let c=e["after"+r];typeof c=="function"&&this.serenity.after(i,c.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(n){n.module(e,()=>({exports:t,loader:"object"}))}})}};import{Logger as ne,LoggerColors as oe}from"@serenityjs/logger";import{Emitter as ae}from"@serenityjs/emitter";var C=class{static{d(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var J=class{static{d(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var W=class{static{d(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var lt=class extends ae{static{d(this,"Plugin")}identifier;version;logger;priority=R.Normal;blocks=new C;items=new J;entities=new W;resources=new Set;config={};fileSystem;path;isBundled;pipeline;serenity;constructor(e,t,s){super(s?.maxListeners),this.identifier=e,this.version=t,this.logger=s?.logger??new ne(`${e}@${t}`,oe.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}defineConfig(e){return Object.assign(this.config,e),this.config}};export{se as DefaultPipelineProperties,Ue as Pipeline,lt as Plugin,I as PluginFileSystem,m as PluginHeader,R as PluginPriority,k as PluginType};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIiwgIi4uL3NyYy9lbnVtcy9oZWFkZXIudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9maWxlLXN5c3RlbS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlLCBQbHVnaW5IZWFkZXIgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9IGZyb20gXCIuL2ZpbGUtc3lzdGVtXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSB3b3JsZCBpbml0aWFsaXplIGV2ZW50XG4gICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIENvbW1hbmQod29ybGQsIHRoaXMpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2tzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5ibG9ja3MudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLml0ZW1zLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmVudGl0eVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBwbHVnaW5zIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJkYXRhXCIpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRhdGEgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwiZGF0YVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBhIHBsdWdpbnMgY29uZmlncyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImNvbmZpZ3NcIikpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgY29uZmlncyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJjb25maWdzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIC8vIEFuZCBmaWx0ZXIgb3V0IHRoZSBkYXRhIGFuZCBjb25maWdzIGRpcmVjdG9yaWVzXG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRGlyZWN0b3J5KClcbiAgICAgICAgPyBkaXJlbnQubmFtZSAhPT0gXCJkYXRhXCIgJiYgZGlyZW50Lm5hbWUgIT09IFwiY29uZmlnc1wiXG4gICAgICAgIDogdHJ1ZVxuICAgICk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZmlsZXMgdGhhdCBoYXZlIGEgLnBsdWdpbiBleHRlbnNpb25cbiAgICBjb25zdCBidW5kbGVzID0gZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBhIGZpbGUsIGFuZCBpZiBpdCBoYXMgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICBpZiAoIXBsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQWRkb246IHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGFuZGxlIGFkZG9uIHBsdWdpbnMsIGJ1dCBtZW50aW9uIHRoYXQgdGhleSBhcmUgZGVwcmVjYXRlZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBZGRvbikuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIGlmIChwbHVnaW4pIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQXBpOiB7XG4gICAgICAgICAgICAvLyBXZSBubyBsb25nZXIgc3VwcG9ydCBBUEkgcGx1Z2luc1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgcGx1Z2luIMKnMSR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGlzIHVzaW5nIGEgZGVwcmVjYXRlZCBwbHVnaW4gdHlwZSAoQVBJKS4gQVBJIHBsdWdpbnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5maWxlU3lzdGVtID0gbmV3IFBsdWdpbkZpbGVTeXN0ZW0oXG4gICAgICAgICAgcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCIuLi9kYXRhXCIsIHBsdWdpbi5pZGVudGlmaWVyKSxcbiAgICAgICAgICBwbHVnaW4ubG9nZ2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgICB0aGlzLmxpbmtNb2R1bGUocGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIFwicmVzb3VyY2VfcGFja3NcIiBkaXJlY3RvcnkgZXhpc3RzIGluIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSkpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc291cmNlX3BhY2tzIGRpcmVjdG9yeVxuICAgICAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlX3BhY2sgZGlyZWN0b3J5LCBvbmx5IGluY2x1ZGluZyBkaXJlY3Rvcmllc1xuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiksIHtcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2UgcGFjayBkaXJlY3RvcmllcywgYW5kIGF0dGVtcHQgdG8gbG9hZCB0aGVtXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIHBhY2ssIGFuZCBhZGQgaXQgdG8gdGhlIHNlcmVuaXR5IHJlc291cmNlc1xuICAgICAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tUGF0aChcbiAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIsIHJlc291cmNlLm5hbWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICBgTG9hZGVkIHJlc291cmNlIHBhY2sgwqd1JHtwYWNrLm5hbWV9wqdyICjCpzgke3BhY2sudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHBhY2spO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgcGx1Z2lucyBieSB0aGVpciBwcmlvcml0eVxuICAgIG9yZGVyZWRQbHVnaW5zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIFNvcnQgYnkgcHJpb3JpdHkgZmlyc3RcbiAgICAgIGlmIChhLnByaW9yaXR5ICE9PSBiLnByaW9yaXR5KSB7XG4gICAgICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTsgLy8gSGlnaGVyIHByaW9yaXR5IGNvbWVzIGZpcnN0XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHByaW9yaXR5IGlzIHRoZSBzYW1lLCBzb3J0IGJ5IGlkZW50aWZpZXIgYWxwaGFiZXRpY2FsbHlcbiAgICAgIGlmIChhLmlkZW50aWZpZXIgPCBiLmlkZW50aWZpZXIpIHJldHVybiAtMTtcbiAgICAgIGlmIChhLmlkZW50aWZpZXIgPiBiLmlkZW50aWZpZXIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2Ygb3JkZXJlZFBsdWdpbnMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGNvbmZpZyBkZWZpbmVkXG4gICAgICBpZiAoT2JqZWN0LmtleXMocGx1Z2luLmNvbmZpZyBhcyBvYmplY3QpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4gY29uZmlnIGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBcImNvbmZpZ3NcIiwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9Lmpzb25gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIGNvbmZpZyBmaWxlIGV4aXN0cyBmb3IgdGhlIHBsdWdpblxuICAgICAgICBpZiAoIWV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgICAgICAvLyBXcml0ZSB0aGUgZGVmYXVsdCBjb25maWcgdG8gdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeShwbHVnaW4uY29uZmlnLCBudWxsLCAyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgY29uZmlnIGZpbGVcbiAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGYtOFwiKSk7XG5cbiAgICAgICAgICAvLyBBc3NpZ24gdGhlIGNvbmZpZyBkYXRhIHRvIHRoZSBwbHVnaW4gY29uZmlnXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihwbHVnaW4uY29uZmlnIGFzIG9iamVjdCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luLCBhbmQgYmluZCB0aGUgZXZlbnRzXG4gICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICB0aGlzLmJpbmRFdmVudHMocGx1Z2luKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBidW5kbGVkXG4gICAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwbHVnaW4ucGF0aC5zbGljZSgwLCAtNykucmVwbGFjZSgvXFwuL2csIFwiX1wiKSk7XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpZiBpdCBleGlzdHNcbiAgICAgICAgaWYgKGV4aXN0c1N5bmModGVtcCkpIHByb2Nlc3MubmV4dFRpY2soKCkgPT4gdW5saW5rU3luYyh0ZW1wKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHBsdWdpbiBmcm9tIGEgdGV4dCBzb3VyY2UuXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBpc0J1bmRsZWQgV2hldGhlciB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQgb3Igbm90LlxuICAgKi9cbiAgcHVibGljIGxvYWRGcm9tVGV4dFNvdXJjZShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgaXNCdW5kbGVkID0gZmFsc2VcbiAgKTogUGx1Z2luIHwgbnVsbCB7XG4gICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICBjb25zdCB0ZW1wID0gcmVzb2x2ZShwYXRoLnNsaWNlKDAsIC03KS5yZXBsYWNlKC9cXC4vZywgXCJfXCIpKTtcblxuICAgIC8vIFdyaXRlIHRoZSBzb3VyY2UgdG8gdGhlIHRlbXBvcmFyeSBwYXRoXG4gICAgd3JpdGVGaWxlU3luYyhyZXNvbHZlKHRlbXApLCBzb3VyY2UpO1xuXG4gICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICB0cnkge1xuICAgICAgLy8gQXR0ZW1wdCB0byBpbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcbiAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUocmVzb2x2ZSh0ZW1wKSk7XG5cbiAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkXG4gICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgLy8gTG9nIHRoZSB3YXJuaW5nIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IsIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIHBpcGVsaW5lLmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgIHVubGlua1N5bmMocmVzb2x2ZSh0ZW1wKSk7XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgIHBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgcGx1Z2luLnBhdGggPSByZXNvbHZlKHBhdGgpO1xuICAgICAgcGx1Z2luLmlzQnVuZGxlZCA9IGlzQnVuZGxlZDtcblxuICAgICAgLy8gU2V0IHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIHBsdWdpblxuICAgICAgcGx1Z2luLmZpbGVTeXN0ZW0gPSBuZXcgUGx1Z2luRmlsZVN5c3RlbShcbiAgICAgICAgcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCIuLi9kYXRhXCIsIHBsdWdpbi5pZGVudGlmaWVyKSxcbiAgICAgICAgcGx1Z2luLmxvZ2dlclxuICAgICAgKTtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKHBsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgICByZXR1cm4gcGx1Z2luO1xuICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZSh0ZW1wKSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG51bGwgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHJlbG9hZChwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biB0aGUgcGx1Z2luXG4gICAgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHBsdWdpbnMgbWFwXG4gICAgdGhpcy5wbHVnaW5zLmRlbGV0ZShwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBwYXRoXG4gICAgY29uc3QgcGF0aCA9IHBsdWdpbi5wYXRoO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZXF1aXJlIGNhY2hlIGZvciB0aGUgcGx1Z2luXG4gICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKHBhdGgpXTtcblxuICAgIC8vIFJlbW92ZSB0aGUgcGx1Z2luIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgdGhpcy5zZXJlbml0eS5yZW1vdmVQYXRoKHBhdGgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSBwbHVnaW4sIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBzZXJlbml0eSBpbnN0YW5jZVxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcGx1Z2luLnJlc291cmNlcykge1xuICAgICAgLy8gUmVtb3ZlIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgICB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5wYWNrcy5kZWxldGUocmVzb3VyY2UudXVpZCk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbi5pc0J1bmRsZWQpIHtcbiAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICBjb25zdCBidWZmZXIgPSBpbmZsYXRlU3luYyhyZWFkRmlsZVN5bmMocGF0aCkpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgYmluYXJ5IHN0cmVhbSBmcm9tIHRoZSBidWZmZXJcbiAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgLy8gUmVhZCB0aGUgcGx1Z2luIGhlYWRlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgIGNvbnN0IHR5cGUgPSBzdHJlYW0ucmVhZEJ5dGUoKSBhcyBQbHVnaW5UeXBlIHwgUGx1Z2luSGVhZGVyO1xuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM6IHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICBpZiAoIW5ld1BsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICAgICAgbmV3UGx1Z2luLm9uU3RhcnRVcChuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCkudG9TdHJpbmcoXCJ1dGYtOFwiKTtcblxuICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgICBpZiAoIW5ld1BsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgICAgICBuZXdQbHVnaW4ub25Jbml0aWFsaXplKG5ld1BsdWdpbik7XG4gICAgICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICAgICAgbmV3UGx1Z2luLm9uU3RhcnRVcChuZXdQbHVnaW4pO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgYW1vdW50IG9mIHJlc291cmNlcyBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2VzLCBhbmQgcmVhZCB0aGVtIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb3VyY2VzOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHN0cmVhbS5yZWFkQnVmZmVyKGxlbmd0aCk7XG5cbiAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnNlcmVuaXR5LnJlc291cmNlcy5sb2FkRnJvbVppcChidWZmZXIpO1xuXG4gICAgICAgICAgICAgIC8vIExvZyB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICAgIG5ld1BsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICBgTG9hZGVkIHJlc291cmNlIHBhY2sgwqd1JHtyZXNvdXJjZS5uYW1lfcKnciAowqc4JHtyZXNvdXJjZS51dWlkfcKncikuYFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLnJlc291cmNlcy5hZGQocmVzb3VyY2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHJlc291cmNlIHBhY2sgwqc4JHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgcGF0aClcbiAgICAgICAgICAgICAgICApfcKnciBmb3IgcGx1Z2luIMKnMSR7bmV3UGx1Z2luLmlkZW50aWZpZXJ9wqdyLmAsXG4gICAgICAgICAgICAgICAgcmVhc29uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlYWQgdGhlIHBhY2thZ2UuanNvbiBmaWxlXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgIHJlYWRGaWxlU3luYyhyZXNvbHZlKHBhdGgsIFwicGFja2FnZS5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgICApIGFzIFBsdWdpblBhY2thZ2U7XG5cbiAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgY29uc3QgbWFpbiA9IHJlc29sdmUocGF0aCwgbWFuaWZlc3QubWFpbik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwcm92aWRlZCBlbnRyeSBwb2ludCBpcyB2YWxpZFxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIMKndSR7bWFuaWZlc3QubmFtZSA/PyBcInVua25vd24tcGx1Z2luXCJ9wqc4QMKndSR7bWFuaWZlc3QudmVyc2lvbiA/PyBcInVua25vd24tdmVyc2lvblwifcKnciwgdGhlIG1haW4gZW50cnkgcGF0aCBcIsKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZShwYXRoLCBtYWluKSl9wqdyXCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LmBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHBhdGgsIG1haW4pKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBuZXdQbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgbmV3UGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIG5ld1BsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICBuZXdQbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICBuZXdQbHVnaW4uaXNCdW5kbGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFNldCB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBwbHVnaW5cbiAgICAgIG5ld1BsdWdpbi5maWxlU3lzdGVtID0gbmV3IFBsdWdpbkZpbGVTeXN0ZW0oXG4gICAgICAgIHJlc29sdmUobmV3UGx1Z2luLnBhdGgsIFwiLi4vZGF0YVwiLCBuZXdQbHVnaW4uaWRlbnRpZmllciksXG4gICAgICAgIG5ld1BsdWdpbi5sb2dnZXJcbiAgICAgICk7XG5cbiAgICAgIC8vIExpbmsgdGhlIG1vZHVsZSB0byB0aGUgcGlwZWxpbmVcbiAgICAgIHRoaXMubGlua01vZHVsZShuZXdQbHVnaW4uaWRlbnRpZmllciwgbW9kdWxlKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICB0aGlzLnBsdWdpbnMuc2V0KG5ld1BsdWdpbi5pZGVudGlmaWVyLCBuZXdQbHVnaW4pO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gobmV3UGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW4sIGFuZCBiaW5kIHRoZSBldmVudHNcbiAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgIHRoaXMuYmluZEV2ZW50cyhuZXdQbHVnaW4pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBidW5kbGUocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQmluYXJ5U3RyZWFtIGluc3RhbmNlXG4gICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBwbHVnaW4gaGVhZGVyIGJhc2VkIG9uIHRoZSByZXNvdXJjZXNcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgcGx1Z2luLnJlc291cmNlcy5zaXplID4gMFxuICAgICAgICA/IFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXNcbiAgICAgICAgOiBQbHVnaW5IZWFkZXIuSGFzTm9SZXNvdXJjZXM7XG5cbiAgICAvLyBXcml0ZSB0aGUgcGx1Z2luIHR5cGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbS53cml0ZUJ5dGUoaGVhZGVyKTtcblxuICAgIC8vIFN3aXRjaCBiYXNlZCBvbiB0aGUgcGx1Z2luIGhlYWRlclxuICAgIHN3aXRjaCAoaGVhZGVyKSB7XG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAvLyBHZXQgdGhlIHBhdGggdG8gdGhlIHBsdWdpbidzIGNvbXBpbGVkIGluZGV4IGZpbGVcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiLCBcImluZGV4LmpzXCIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIGluZGV4IGZpbGUgZnJvbSB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcmVhZEZpbGVTeW5jKHBhdGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoaW5kZXguYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGluZGV4IGZpbGUgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVCdWZmZXIoaW5kZXgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS12JHtwbHVnaW4udmVyc2lvbn0ucGx1Z2luYCksXG4gICAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEJyZWFrIG91dCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudFxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBQbHVnaW5IZWFkZXIuSGFzUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgdG8gdGhlIHN0cmVhbVxuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQocGx1Z2luLnJlc291cmNlcy5zaXplKTtcblxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAgICAgLy8gQ29tcHJlc3MgdGhlIHJlc291cmNlIHBhY2sgaW50byBhIGJ1ZmZlclxuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlc291cmNlLmNvbXByZXNzKCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQoYnVmZmVyLmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBiaW5kRXZlbnRzKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBwcm90b3R5cGUgb2YgdGhlIHBsdWdpblxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwbHVnaW4pO1xuXG4gICAgLy8gR2V0IHRoZSBvYmplY3Qga2V5cyBmcm9tIHRoZSBwbHVnaW5cbiAgICBjb25zdCBwbHVnaW5LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG90eXBlKTtcblxuICAgIC8vIEdldCB0aGUgd29ybGQgZXZlbnQga2V5cywgYW5kIHNsaWNlIHRoZW0gaW4gaGFsZlxuICAgIGxldCBldmVudEtleXMgPSBPYmplY3Qua2V5cyhXb3JsZEV2ZW50KTtcbiAgICBldmVudEtleXMgPSBldmVudEtleXMuc2xpY2UoZXZlbnRLZXlzLmxlbmd0aCAvIDIpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgZXZlbnQga2V5c1xuICAgIGZvciAoY29uc3QgZXZlbnRLZXkgb2YgZXZlbnRLZXlzKSB7XG4gICAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBldmVudCBrZXlcbiAgICAgIGNvbnN0IGluZGV4ID0gZXZlbnRLZXlzLmluZGV4T2YoZXZlbnRLZXkpIGFzIFdvcmxkRXZlbnQ7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcIm9uXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJvblwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJvblwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5Lm9uKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImJlZm9yZVwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYmVmb3JlXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcImJlZm9yZVwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmJlZm9yZShpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IGJvb2xlYW4pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGhhcyBhbnkgXCJhZnRlclwiIGV2ZW50IGtleXNcbiAgICAgIGlmIChwbHVnaW5LZXlzLmluY2x1ZGVzKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYWZ0ZXJcIiArIGV2ZW50S2V5KSBhcyBrZXlvZiBQbHVnaW5dO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAvLyBCaW5kIHRoZSBldmVudCB0byB0aGUgcGx1Z2luXG4gICAgICAgICAgdGhpcy5zZXJlbml0eS5hZnRlcihpbmRleCwgdmFsdWUuYmluZChwbHVnaW4pIGFzICgpID0+IHZvaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIGEgbW9kdWxlIHRvIHRoZSBwaXBlbGluZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKiBAcGFyYW0gbW9kdWxlIFRoZSBtb2R1bGUgdG8gbGluay5cbiAgICovXG4gIHB1YmxpYyBsaW5rTW9kdWxlKG5hbWU6IHN0cmluZywgbW9kdWxlOiB1bmtub3duKTogdm9pZCB7XG4gICAgLy8gR2V0IHRoZSBydW50aW1lIG9mIHRoZSBzZXJ2ZXJcbiAgICBjb25zdCBpc0J1biA9IHByb2Nlc3MudmVyc2lvbnMuYnVuID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAvLyBNb2R1bGUgbGlua2luZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBCdW5cbiAgICBpZiAoIWlzQnVuKSByZXR1cm47XG5cbiAgICAvLyBJbmplY3QgdGhlIG1vZHVsZSBpbnRvIHRoZSBCdW4gcGx1Z2luIHN5c3RlbVxuICAgIEJ1bi5wbHVnaW4oe1xuICAgICAgbmFtZTogYHNlcmVuaXR5anMucGx1Z2luLiR7bmFtZX1gLFxuICAgICAgc2V0dXAoYnVpbGRlcikge1xuICAgICAgICBidWlsZGVyLm1vZHVsZShuYW1lLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cG9ydHM6IG1vZHVsZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIGxvYWRlcjogXCJvYmplY3RcIlxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBpcGVsaW5lLCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIH07XG4iLCAiaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgeyBXb3JsZCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4uL3BpcGVsaW5lXCI7XG5cbmltcG9ydCB7IFBsdWdpbkFjdGlvbnNFbnVtLCBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2VudW1cIjtcblxuY29uc3QgcmVnaXN0ZXIgPSAod29ybGQ6IFdvcmxkLCBwaXBlbGluZTogUGlwZWxpbmUpID0+IHtcbiAgd29ybGQuY29tbWFuZFBhbGV0dGUucmVnaXN0ZXIoXG4gICAgXCJwbHVnaW5zXCIsXG4gICAgXCJJbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIG9mIHRoZSBzZXJ2ZXJcIixcbiAgICAocmVnaXN0cnkpID0+IHtcbiAgICAgIC8vIFNldCB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25zID0gW1wic2VyZW5pdHkub3BlcmF0b3JcIl07XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xuIiwgImVudW0gUGx1Z2luSGVhZGVyIHtcbiAgSGFzTm9SZXNvdXJjZXMgPSAyLFxuICBIYXNSZXNvdXJjZXMgPSAzXG59XG5cbmV4cG9ydCB7IFBsdWdpbkhlYWRlciB9O1xuIiwgIi8qKlxuICogVGhlIHByaW9yaXR5IG9mIGEgcGx1Z2luIGRldGVybWluZXMgd2hlbiBpdCB3aWxsIGJlIGxvYWRlZCBpbiByZWxhdGlvbiB0byBvdGhlciBwbHVnaW5zLlxuICogQSBwbHVnaW4gd2l0aCBhIGhpZ2hlciBwcmlvcml0eSB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgYSBwbHVnaW4gd2l0aCBhIGxvd2VyIHByaW9yaXR5LlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgb3IgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAqIEZvciBleGFtcGxlLCBhIGxpYnJhcnkgcGx1Z2luIG1heSBuZWVkIHRvIGJlIGxvYWRlZCBiZWZvcmUgYSBwbHVnaW4gdGhhdCB1c2VzIGl0LFxuICogb3IgYSBwbHVnaW4gdGhhdCBtb2RpZmllcyB0aGUgYmVoYXZpb3Igb2Ygc2VyZW5pdHkncyBBUElzIG1heSBuZWVkIHRvIGJlIGxvYWRlZCBhZnRlciBpdC5cbiAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGlzIE5vcm1hbC5cbiAqL1xuZW51bSBQbHVnaW5Qcmlvcml0eSB7XG4gIC8qKlxuICAgKiBBIGxvdyBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYWZ0ZXIgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciByZWFjdGluZyB0byBjaGFuZ2VzIG9yIGZpbmFsIGFkanVzdG1lbnRzLlxuICAgKi9cbiAgTG93LFxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgYSBwbHVnaW4uXG4gICAqIFN1aXRhYmxlIGZvciBzdGFuZGFyZCBwbHVnaW4gYmVoYXZpb3IuXG4gICAqL1xuICBOb3JtYWwsXG5cbiAgLyoqXG4gICAqIEEgaGlnaCBwcmlvcml0eSBwbHVnaW4gd2lsbCBiZSBsb2FkZWQgYmVmb3JlIG90aGVyIHBsdWdpbnMuXG4gICAqIFVzZWZ1bCBmb3IgZWFybHkgc2V0dXAgb3Igb3ZlcnJpZGluZyBiZWhhdmlvci5cbiAgICovXG4gIEhpZ2hcbn1cblxuZXhwb3J0IHsgUGx1Z2luUHJpb3JpdHkgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIG1rZGlyU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbiAgcm1TeW5jLFxuICByZWFkZGlyU3luY1xufSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlc29sdmUsIHNlcCwgaXNBYnNvbHV0ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuY2xhc3MgUGx1Z2luRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFBsdWdpbkZpbGVTeXN0ZW0gY2xhc3MuXG4gICAqIEBwYXJhbSBkYXRhUGF0aCBUaGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZGF0YVBhdGg6IHN0cmluZywgbG9nZ2VyOiBMb2dnZXIpIHtcbiAgICB0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGg7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBwYXRoLlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB2YWxpZGF0ZS5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgcGF0aCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhdGgoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGV4cGVjdGVkVHlwZT86IFwiZmlsZVwiIHwgXCJkaXJlY3RvcnlcIlxuICApOiBib29sZWFuIHtcbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgYWJzb2x1dGVcbiAgICBpZiAoIWlzQWJzb2x1dGUocGF0aCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBBdHRlbXB0ZWQgdG8gYWNjZXNzIGludmFsaWQgcGF0aDogJHtwYXRofS4gUGF0aCBtdXN0IGJlIGFic29sdXRlLmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIHdpdGhpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnlcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCh0aGlzLmRhdGFQYXRoICsgc2VwKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEludmFsaWQgcGF0aDogJHtwYXRofS4gUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIHBhdGggaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlIG9yIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZpbGVSZWdleCA9IC8uKlxcLi4rLzsgLy8gTWF0Y2hlcyBwYXRocyB3aXRoIGEgZG90IGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGNoYXJhY3RlcnNcbiAgICBjb25zdCBoYXNFeHRlbnNpb24gPSBmaWxlUmVnZXgudGVzdChwYXRoKTtcbiAgICBpZiAoXG4gICAgICAoZXhwZWN0ZWRUeXBlID09PSBcImZpbGVcIiAmJiAhaGFzRXh0ZW5zaW9uKSB8fFxuICAgICAgKGV4cGVjdGVkVHlwZSA9PT0gXCJkaXJlY3RvcnlcIiAmJiBoYXNFeHRlbnNpb24pXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgSW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIGlzIG5vdCBhIHZhbGlkICR7ZXhwZWN0ZWRUeXBlfS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgZmlsZSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGZpbGUgdG8gcmVhZC5cbiAgICogQHBhcmFtIGVuY29kaW5nIE9wdGlvbmFsIGVuY29kaW5nLiBJZiBwcm92aWRlZCwgcmV0dXJucyBhIHN0cmluZzsgb3RoZXJ3aXNlLCByZXR1cm5zIGEgQnVmZmVyLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBkYXRhIGlmIGl0IGV4aXN0cyBhbmQgaXMgdmFsaWQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IEJ1ZmZlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkRmlsZShwYXRoOiBzdHJpbmcsIGVuY29kaW5nOiBCdWZmZXJFbmNvZGluZyk6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyByZWFkRmlsZShcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZ1xuICApOiBCdWZmZXIgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBFbnN1cmUgdGhlIHBsdWdpbiBkYXRhIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZmlsZVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZWFkIGFuZCByZXR1cm4gdGhlIGZpbGUgZGF0YVxuICAgIHJldHVybiByZWFkRmlsZVN5bmMoZnVsbFBhdGgsIGVuY29kaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgZGF0YSB0byBhIGZpbGUgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0byB3cml0ZS5cbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIGZpbGUuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKVxuICAgICAgLy8gSWYgaXQgZG9lc24ndCwgbWFrZSB0aGUgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmModGhpcy5kYXRhUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJmaWxlXCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gRW5zdXJlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlIGV4aXN0c1xuICAgIGNvbnN0IGRpclBhdGggPSBmdWxsUGF0aC5zdWJzdHJpbmcoMCwgZnVsbFBhdGgubGFzdEluZGV4T2Yoc2VwKSk7XG4gICAgaWYgKCFleGlzdHNTeW5jKGRpclBhdGgpKSBta2RpclN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgZmlsZSBkYXRhXG4gICAgcmV0dXJuIHdyaXRlRmlsZVN5bmMoZnVsbFBhdGgsIGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBmaWxlIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRmlsZShwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImZpbGVcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZW1vdmUgdGhlIGZpbGVcbiAgICByZXR1cm4gcm1TeW5jKGZ1bGxQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlyZWN0b3J5IGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUuXG4gICAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBjcmVhdGVkIGRpcmVjdG9yeSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICAgKi9cbiAgcHVibGljIG1rZGlyKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKVxuICAgICAgLy8gSWYgaXQgZG9lc24ndCwgbWFrZSB0aGUgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmModGhpcy5kYXRhUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIE1ha2UgdGhlIGRpcmVjdG9yeVxuICAgIHJldHVybiBta2RpclN5bmMoZnVsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkaXJlY3RvcnkgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0gZm9yY2UgV2hldGhlciB0byBmb3JjZWZ1bGx5IHJlbW92ZSB0aGUgZGlyZWN0b3J5IGFuZCBpdHMgY29udGVudHMuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIHJtZGlyKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7IHJlY3Vyc2l2ZTogYm9vbGVhbjsgZm9yY2U6IGJvb2xlYW4gfSA9IHtcbiAgICAgIHJlY3Vyc2l2ZTogZmFsc2UsXG4gICAgICBmb3JjZTogZmFsc2VcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJkaXJlY3RvcnlcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgZGlyZWN0b3J5XG4gICAgcmV0dXJuIHJtU3luYyhmdWxsUGF0aCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZWFkLlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIG9yIG51bGwgaWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBvciBpcyBpbnZhbGlkLlxuICAgKi9cbiAgcHVibGljIHJlYWREaXIocGF0aDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB8IG51bGwge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImRpcmVjdG9yeVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlYWQgYW5kIHJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzXG4gICAgcmV0dXJuIHJlYWRkaXJTeW5jKGZ1bGxQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBmaWxlIG9yIGRpcmVjdG9yeSBleGlzdHMgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0cywgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBFbnN1cmUgdGhlIHBsdWdpbiBkYXRhIGRpcmVjdG9yeSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCk7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzXG4gICAgcmV0dXJuIGV4aXN0c1N5bmMoZnVsbFBhdGgpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkZpbGVTeXN0ZW0gfTtcbiIsICJpbXBvcnQgeyBSZXNvdXJjZVBhY2ssIFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5cbmltcG9ydCB7IFBpcGVsaW5lIH0gZnJvbSBcIi4vcGlwZWxpbmVcIjtcbmltcG9ydCB7IFBsdWdpbkV2ZW50cyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBQbHVnaW5CbG9ja1JlZ2lzdHJ5LFxuICBQbHVnaW5FbnRpdHlSZWdpc3RyeSxcbiAgUGx1Z2luSXRlbVJlZ2lzdHJ5XG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9IGZyb20gXCIuL2VudW1zL3ByaW9yaXR5XCI7XG5pbXBvcnQgeyBQbHVnaW5GaWxlU3lzdGVtIH0gZnJvbSBcIi4vZmlsZS1zeXN0ZW1cIjtcblxuaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBsdWdpbkV2ZW50cz4ge1xuICAvKipcbiAgICogVGhlIGxvZ2dlciBpbnN0YW5jZSBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWF4TGlzdGVuZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogIyBJbnRyb2R1Y3Rpb25cbiAqIFBsdWdpbnMgYXJlIHRoZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3Mgb2YgU2VyZW5pdHlKUy5cbiAqIFRoZXkgYXJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0byB0aGUgc2VydmVyLCB3aGljaCBhbGxvd3MgdG90YWwgY29udHJvbCBvdmVyIHRoZSBzZXJ2ZXIuXG4gKlxuICogVGhlcmUgYXJlIDIgdHlwZXMgb2YgcGx1Z2lucyB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBgUGx1Z2luVHlwZWAgZW51bTogYEFkZG9uYCAmIGBBcGlgXG4gKlxuICogQWRkb24gcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW5ub3QgZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKiBBcGkgcGx1Z2lucyBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLiBUaGlzIG1lYW5zIGV4dGVybmFsIHBsdWdpbnMgY2FuIGRpcmVjdGx5IGludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgQVBJLlxuICpcbiAqICMjIENsYXNzIEV4dGVuZGluZyBQbHVnaW5cbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBQbHVnaW4sIFBsdWdpblR5cGUsIFBsdWdpbkV2ZW50cyB9IGZyb20gXCJAc2VyZW5pdHlqcy9wbHVnaW5zXCI7XG4gKlxuICogY2xhc3MgU2FtcGxlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAqICAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSBQbHVnaW5UeXBlLkFkZG9uO1xuICpcbiAqICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHN1cGVyKFwic2FtcGxlLXBsdWdpblwiLCBcIjEuMC4wXCIpO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgb25Jbml0aWFsaXplKCk6IHZvaWQge31cbiAqXG4gKiAgIHB1YmxpYyBvblN0YXJ0VXAoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU2h1dERvd24oKTogdm9pZCB7fVxuICogfVxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IG5ldyBTYW1wbGVQbHVnaW4oKTtcbiAqIGBgYFxuICovXG5jbGFzcyBQbHVnaW48VCA9IHVua25vd24+IGV4dGVuZHMgRW1pdHRlcjxUPiBpbXBsZW1lbnRzIFBsdWdpbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJpb3JpdHkgb2YgdGhlIHBsdWdpbi5cbiAgICogQG5vdGUgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggcGx1Z2lucyBhcmUgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaW9yaXR5OiBQbHVnaW5Qcmlvcml0eSA9IFBsdWdpblByaW9yaXR5Lk5vcm1hbDtcblxuICAvKipcbiAgICogVGhlIGJsb2NrIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBQbHVnaW5CbG9ja1JlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGl0ZW1zID0gbmV3IFBsdWdpbkl0ZW1SZWdpc3RyeSgpO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHJlZ2lzdHJ5IGZvciB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzL3RyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudGl0aWVzID0gbmV3IFBsdWdpbkVudGl0eVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwYWNrcyBwcm92aWRlZCBieSB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlc291cmNlcyA9IG5ldyBTZXQ8UmVzb3VyY2VQYWNrPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZmlnIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiB1bmtub3duID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGZpbGVTeXN0ZW0hOiBQbHVnaW5GaWxlU3lzdGVtO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHBsdWdpbiBpcyBidW5kbGVkLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNCdW5kbGVkITogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwaXBlbGluZSB0aGUgcGx1Z2luIGlzIGluLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcGlwZWxpbmUhOiBQaXBlbGluZTtcblxuICAvKipcbiAgICogVGhlIHNlcmVuaXR5IGluc3RhbmNlIG9mIHRoZSBzZXJ2ZXIuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBzZXJlbml0eSE6IFNlcmVuaXR5O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcGx1Z2luIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgcGx1Z2luLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICB2ZXJzaW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8UGx1Z2luT3B0aW9ucz5cbiAgKSB7XG4gICAgLy8gQ2FsbCB0aGUgc3VwZXIgbWV0aG9kIHdpdGggdGhlIG1heCBsaXN0ZW5lcnNcbiAgICBzdXBlcihvcHRpb25zPy5tYXhMaXN0ZW5lcnMpO1xuXG4gICAgLy8gU2V0IHRoZSBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uIG9mIHRoZSBwbHVnaW5cbiAgICB0aGlzLmlkZW50aWZpZXIgPSBpZGVudGlmaWVyO1xuICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICAvLyBTZXQgdGhlIGxvZ2dlciBmb3IgdGhlIHBsdWdpblxuICAgIHRoaXMubG9nZ2VyID1cbiAgICAgIG9wdGlvbnM/LmxvZ2dlciA/P1xuICAgICAgbmV3IExvZ2dlcihgJHtpZGVudGlmaWVyfUAke3ZlcnNpb259YCwgTG9nZ2VyQ29sb3JzLkJsdWUpO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBvcHRpb25zLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAob3B0aW9ucz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IG9wdGlvbnMub25TdGFydFVwO1xuICAgIGlmIChvcHRpb25zPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBvcHRpb25zLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIHBsdWdpbiBieSBpdHMgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luIHRvIHJlc29sdmUuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSBudWxsLlxuICAgKi9cbiAgcHVibGljIHJlc29sdmU8VCBleHRlbmRzIFBsdWdpbj4oaWRlbnRpZmllcjogc3RyaW5nKTogVCB8IG51bGwge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBpcyBkZWZpbmVkLlxuICAgIGlmICghdGhpcy5waXBlbGluZSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMucGlwZWxpbmUucGx1Z2lucy5nZXQoaWRlbnRpZmllcik7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGRlZmluZWRcbiAgICBpZiAoIXBsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXR1cm4gdGhlIHBsdWdpblxuICAgIHJldHVybiBwbHVnaW4gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgaW5pdGlhbGl6ZWQuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uSW5pdGlhbGl6ZShfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBjb25maWcgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBkZWZpbml0aW9uIFRoZSBjb25maWcgZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGNvbmZpZyBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgZGVmaW5lQ29uZmlnPFQ+KGRlZmluaXRpb246IFQpOiBUIHtcbiAgICAvLyBBc3NpZ24gdGhlIHZhbHVlcyB0byB0aGUgY29uZmlnIG9iamVjdFxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcgYXMgb2JqZWN0LCBkZWZpbml0aW9uKTtcblxuICAgIC8vIFJldHVybiB0aGUgY29uZmlnIG9iamVjdFxuICAgIHJldHVybiB0aGlzLmNvbmZpZyBhcyBUO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luT3B0aW9ucyB9O1xuIiwgImltcG9ydCB7IHR5cGUgQmxvY2tUcmFpdCwgQ3VzdG9tQmxvY2tUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luQmxvY2tSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gYmxvY2sgdHJhaXRzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tQmxvY2tUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGJsb2NrIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBibG9jayByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21CbG9ja1R5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgQmxvY2tUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBibG9jayB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEJsb2NrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luQmxvY2tSZWdpc3RyeSB9O1xuIiwgImltcG9ydCB7IHR5cGUgSXRlbVN0YWNrVHJhaXQsIEN1c3RvbUl0ZW1UeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luSXRlbVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHR5cGVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZXM6IEFycmF5PEN1c3RvbUl0ZW1UeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gaXRlbSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBJdGVtU3RhY2tUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBpdGVtIHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUl0ZW1UeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGl0ZW0gdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGl0ZW0gdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgSXRlbVN0YWNrVHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luSXRlbVJlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBFbnRpdHlUcmFpdCwgQ3VzdG9tRW50aXR5VHlwZSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5cbmNsYXNzIFBsdWdpbkVudGl0eVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBlbnRpdHkgdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4gPSBbXTtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGVudGl0eSB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0eXBlcyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHlwZSguLi50eXBlczogQXJyYXk8Q3VzdG9tRW50aXR5VHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tRW50aXR5VHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGVudGl0eSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBFbnRpdHlUcmFpdD4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0cmFpdCB0byB0aGUgdHJhaXRzIGFycmF5LlxuICAgIHRoaXMudHJhaXRzLnB1c2goLi4udHJhaXRzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUcmFpdCh0cmFpdDogdHlwZW9mIEVudGl0eVRyYWl0KTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHRyYWl0IGluIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnRyYWl0cy5pbmRleE9mKHRyYWl0KTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHJhaXQgZnJvbSB0aGUgdHJhaXRzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50cmFpdHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbkVudGl0eVJlZ2lzdHJ5IH07XG4iXSwKICAibWFwcGluZ3MiOiAib1VBQ0EsT0FDRUEsY0FBQUEsRUFDQUMsYUFBQUEsRUFDQUMsZUFBQUEsRUFDQUMsZ0JBQUFBLEVB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QW1CLEVBQ0EsQ0FFQSxNQUFNQSxHQUFTQyxZQUFBQSxFQUdmLEtBQUtyQixXQUFhQSxFQUNsQixLQUFLQyxRQUFVQSxFQUdmLEtBQUtDLE9BQ0hrQixHQUFTbEIsUUFDVCxJQUFJb0IsR0FBTyxHQUFHdEIsQ0FBQUEsSUFBY0MsQ0FBQUEsR0FBV3NCLEdBQWFDLElBQUksRUFHdERKLEdBQVNLLGVBQWMsS0FBS0EsYUFBZUwsRUFBUUssY0FDbkRMLEdBQVNNLFlBQVcsS0FBS0EsVUFBWU4sRUFBUU0sV0FDN0NOLEdBQVNPLGFBQVksS0FBS0EsV0FBYVAsRUFBUU8sV0FDckQsQ0FPT0MsUUFBMEI1QixFQUE4QixDQUU3RCxHQUFJLENBQUMsS0FBS2tCLFNBQVUsT0FBTyxLQUczQixJQUFNVyxFQUFTLEtBQUtYLFNBQVNZLFFBQVFDLElBQUkvQixDQUFBQSxFQUd6QyxPQUFLNkIsR0FBZSxJQUl0QixDQU1PSixhQUFhTyxFQUF1QixDQUUzQyxDQU1PTixVQUFVTSxFQUF1QixDQUV4QyxDQU1PTCxXQUFXSyxFQUF1QixDQUV6QyxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJyZWxhdGl2ZSIsICJDdXN0b21FbnVtIiwgIlBsdWdpbnNFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJwaXBlbGluZSIsICJjb21tYW5kUGFsZXR0ZSIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9ucyIsICJvdmVybG9hZCIsICJhY3Rpb24iLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVzdWx0IiwgInBsdWdpbnMiLCAic2l6ZSIsICJtZXNzYWdlIiwgInZhbHVlcyIsICJwbHVnaW4iLCAicHVzaCIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibGVuZ3RoIiwgImpvaW4iLCAiUGx1Z2luc0VudW0iLCAicGx1Z2luSW5zdGFuY2UiLCAiZ2V0IiwgIkVycm9yIiwgInJlbG9hZCIsICJpc0J1bmRsZWQiLCAiYnVuZGxlIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgInBhdGgiLCAiY29tbWFuZF9kZWZhdWx0IiwgIlBsdWdpbkhlYWRlciIsICJQbHVnaW5Qcmlvcml0eSIsICJQbHVnaW5UeXBlIiwgImV4aXN0c1N5bmMiLCAicmVhZEZpbGVTeW5jIiwgIm1rZGlyU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJtU3luYyIsICJyZWFkZGlyU3luYyIsICJyZXNvbHZlIiwgInNlcCIsICJpc0Fic29sdXRlIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkVtaXR0ZXIiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInJlc291cmNlcyIsICJTZXQiLCAiY29uZmlnIiwgImZpbGVTeXN0ZW0iLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIiwgImRlZmluZUNvbmZpZyIsICJkZWZpbml0aW9uIiwgIk9iamVjdCIsICJhc3NpZ24iXQp9Cg==
1
+ var Z=Object.defineProperty;var d=(a,e)=>Z(a,"name",{value:e,configurable:!0}),v=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as w,mkdirSync as B,readdirSync as O,readFileSync as P,unlinkSync as z,writeFileSync as F}from"node:fs";import{relative as m,resolve as o}from"node:path";import{deflateSync as D,inflateSync as U}from"node:zlib";import{Logger as ie,LoggerColors as re}from"@serenityjs/logger";import{ServerEvent as M,WorldEvent as q}from"@serenityjs/core";import{BinaryStream as j}from"@serenityjs/binarystream";import{relative as G}from"path";import{CustomEnum as N}from"@serenityjs/core";var b=class extends N{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},E=class extends N{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var Q=d((a,e)=>{a.commandPalette.register("plugins","Interact with the plugins of the server",t=>{t.permissions=["serenity.operator"],t.overload({action:E},({action:s})=>{if(s.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],r=[];for(let i of n)r.push(`\xA7u${i.identifier} v${i.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${r.join("\xA77,\xA7r ")}`}}),t.overload({action:E,plugin:b},({action:s,plugin:n})=>{if(s.result!=="reload"&&s.result!=="bundle")return;let r=e.plugins.get(n.result);if(!r)throw new Error(`Plugin ${n.result} is not found.`);if(s.result==="reload")return e.reload(r),{message:`\xA7aSuccessfully reloaded \xA72${r.identifier}\xA7a.`};if(r.isBundled)throw new Error(`Plugin ${r.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(r),{message:`\xA7aSuccessfully bundled \xA72${r.identifier}\xA7a, output file was placed at \xA77${G(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),L=Q;var y=function(a){return a[a.HasNoResources=2]="HasNoResources",a[a.HasResources=3]="HasResources",a}(y||{});var R=function(a){return a[a.Low=0]="Low",a[a.Normal=1]="Normal",a[a.High=2]="High",a}(R||{});var k=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(k||{});import{existsSync as p,readFileSync as X,mkdirSync as $,writeFileSync as Y,rmSync as H,readdirSync as ee}from"fs";import{resolve as x,sep as _,isAbsolute as te}from"path";var I=class{static{d(this,"PluginFileSystem")}dataPath;logger;constructor(e,t){this.dataPath=e,this.logger=t}validatePath(e,t){if(!te(e))return this.logger.warn(`Attempted to access invalid path: ${e}. Path must be absolute.`),!1;if(!e.startsWith(this.dataPath+_))return this.logger.warn(`Invalid path: ${e}. Path must be within the plugin's data directory.`),!1;let n=/.*\..+/.test(e);return t==="file"&&!n||t==="directory"&&n?(this.logger.warn(`Invalid path: ${e}. Path is not a valid ${t}.`),!1):!0}readFile(e,t){if(!p(this.dataPath))return null;let s=x(this.dataPath,e);return!this.validatePath(s,"file")||!p(s)?null:X(s,t)}writeFile(e,t){p(this.dataPath)||$(this.dataPath,{recursive:!0});let s=x(this.dataPath,e);if(!this.validatePath(s,"file"))return;let r=s.substring(0,s.lastIndexOf(_));return p(r)||$(r,{recursive:!0}),Y(s,t)}removeFile(e){if(!p(this.dataPath))return;let t=x(this.dataPath,e);if(this.validatePath(t,"file")&&p(t))return H(t)}mkdir(e){p(this.dataPath)||$(this.dataPath,{recursive:!0});let t=x(this.dataPath,e);if(this.validatePath(t))return $(t,{recursive:!0})}rmdir(e,t={recursive:!1,force:!1}){if(!p(this.dataPath))return;let s=x(this.dataPath,e);if(this.validatePath(s,"directory")&&p(s))return H(s,t)}readDir(e){if(!p(this.dataPath))return null;let t=x(this.dataPath,e);return!this.validatePath(t,"directory")||!p(t)?null:ee(t)}exists(e){if(!p(this.dataPath))return!1;let t=x(this.dataPath,e);return this.validatePath(t)?p(t):!1}};var se={path:"./plugins",commands:!0,initialize:!0},Ue=class{static{d(this,"Pipeline")}serenity;properties;logger=new ie("Plugins",re.MaterialLapis);plugins=new Map;esm=typeof module<"u"&&module?.exports!==exports;get path(){return this.properties.path}set path(e){throw new Error("The path property is read-only.")}constructor(e,t){this.serenity=e,this.properties={...se,...t},e.on(M.Start,this.start.bind(this)),e.on(M.Stop,this.stop.bind(this)),e.on(q.WorldInitialize,({world:s})=>{this.properties.commands&&L(s,this);for(let[,n]of this.plugins)s.blockPalette.registerType(...n.blocks.types).registerTrait(...n.blocks.traits),s.itemPalette.registerType(...n.items.types).registerTrait(...n.items.traits),s.entityPalette.registerType(...n.entities.types).registerTrait(...n.entities.traits)}),this.properties.initialize&&this.initialize()}initialize(){w(o(this.path))||B(o(this.path),{recursive:!0}),w(o(this.path,"data"))||B(o(this.path,"data"),{recursive:!0}),w(o(this.path,"configs"))||B(o(this.path,"configs"),{recursive:!0});let t=O(o(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory()?r.name!=="data"&&r.name!=="configs":!0).filter(r=>r.isFile()?r.name.endsWith(".plugin"):!1),s=[];for(let r of t)try{let i=o(this.path,r.name),c=U(P(i)),u=new j(c);switch(u.readByte()){case y.HasNoResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),h=this.loadFromTextSource(i,f,!0);h&&s.push(h);break}case y.HasResources:{let l=u.readVarInt(),f=u.readBuffer(l).toString("utf-8"),h=this.loadFromTextSource(i,f,!0);if(!h)break;s.push(h);let g=u.readVarInt();for(let A=0;A<g;A++)try{let T=u.readVarInt(),K=u.readBuffer(T),V=this.serenity.resources.loadFromZip(K);h.logger.success(`Loaded resource pack \xA7u${V.name}\xA7r (\xA78${V.uuid}\xA7r).`),h.resources.add(V)}catch(T){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,r.name))}\xA7r for plugin \xA71${h.identifier}\xA7r.`,T)}break}case k.Addon:{this.logger.warn(`The plugin \xA71${m(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (Addon). Please update the plugin to use the new plugin system.`);let l=u.readRemainingBuffer().toString("utf-8"),f=this.loadFromTextSource(i,l,!0);f&&s.push(f);break}case k.Api:this.logger.error(`The plugin \xA71${m(process.cwd(),o(this.path,r.name))}\xA7r is using a deprecated plugin type (API). API plugins are no longer supported. Please update the plugin to use the new plugin system.`)}}catch(i){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}let n=O(o(this.path),{withFileTypes:!0}).filter(r=>r.isDirectory());for(let r of n)try{let i=o(this.path,r.name);if(!w(o(i,"package.json")))continue;let c=JSON.parse(P(o(i,"package.json"),"utf-8")),u=o(i,c.main);if(!w(o(i,u))){this.logger.warn(`Unable to load plugin \xA7u${c.name??"unknown-plugin"}\xA78@\xA7u${c.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(i,u))}\xA7r" was not found in the directory.`);continue}let S=v(o(i,u)),l=S.default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA7u${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=i,l.isBundled=!1,l.fileSystem=new I(o(l.path,"../data",l.identifier),l.logger),this.linkModule(l.identifier,S),this.plugins.set(l.identifier,l),b.options.push(l.identifier),s.push(l),w(o(i,"resource_packs"))||B(o(i,"resource_packs"));let f=O(o(i,"resource_packs"),{withFileTypes:!0}).filter(h=>h.isDirectory());for(let h of f)try{let g=this.serenity.resources.loadFromPath(o(i,"resource_packs",h.name));l.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),l.resources.add(g)}catch(g){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(i,"resource_packs",h.name))}\xA7r for plugin \xA71${l.identifier}\xA7r.`,g)}}catch(i){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(this.path,r.name))}", skipping the plugin.`,i)}s.sort((r,i)=>r.priority!==i.priority?i.priority-r.priority:r.identifier<i.identifier?-1:r.identifier>i.identifier?1:0);for(let r of s)try{if(Object.keys(r.config).length>0){let i=o(this.path,"configs",`${r.identifier}.json`);if(!w(i))F(i,JSON.stringify(r.config,null,2));else{let c=JSON.parse(P(i,"utf-8"));Object.assign(r.config,c)}}if(r.onInitialize(r),this.bindEvents(r),r.isBundled){let i=o(r.path.slice(0,-7).replace(/\./g,"_"));w(i)&&process.nextTick(()=>z(i))}}catch(i){this.logger.error(`Failed to load plugin from "${m(process.cwd(),o(r.path))}", skipping the plugin.`,i)}}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e)}loadFromTextSource(e,t,s=!1){let n=o(e.slice(0,-7).replace(/\./g,"_"));F(o(n),t);try{let r=v(o(n)),i=r.default;return this.plugins.has(i.identifier)?(this.logger.warn(`Unable to load plugin \xA7u${i.identifier}\xA7r, the plugin is already loaded in the pipeline.`),z(o(n)),null):(i.pipeline=this,i.serenity=this.serenity,i.path=o(e),i.isBundled=s,i.fileSystem=new I(o(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),b.options.push(i.identifier),i)}catch(r){this.logger.error(`Failed to load plugin from \xA78${m(process.cwd(),e)}\xA7r, skipping the plugin.`,r),z(o(n))}return null}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let t=e.path;delete v.cache[v.resolve(t)],this.serenity.removePath(t);for(let s of e.resources)this.serenity.resources.packs.delete(s.uuid);if(e.isBundled){let s=U(P(t)),n=new j(s);switch(n.readByte()){case y.HasNoResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);break}case y.HasResources:{let i=n.readVarInt(),c=n.readBuffer(i).toString("utf-8"),u=this.loadFromTextSource(t,c,!0);if(!u)break;u.onInitialize(u),this.bindEvents(u),u.onStartUp(u);let S=n.readVarInt();for(let l=0;l<S;l++)try{let f=n.readVarInt(),h=n.readBuffer(f),g=this.serenity.resources.loadFromZip(h);u.logger.success(`Loaded resource pack \xA7u${g.name}\xA7r (\xA78${g.uuid}\xA7r).`),u.resources.add(g)}catch(f){this.logger.error(`Failed to load resource pack \xA78${m(process.cwd(),o(this.path,t))}\xA7r for plugin \xA71${u.identifier}\xA7r.`,f)}}}}else{let s=JSON.parse(P(o(t,"package.json"),"utf-8")),n=o(t,s.main);if(!w(o(t,n))){this.logger.warn(`Unable to reload plugin \xA7u${s.name??"unknown-plugin"}\xA78@\xA7u${s.version??"unknown-version"}\xA7r, the main entry path "\xA78${m(process.cwd(),o(t,n))}\xA7r" was not found in the directory.`);return}let r=v(o(t,n)),i=r.default;i.pipeline=this,i.serenity=this.serenity,i.path=t,i.isBundled=!1,i.fileSystem=new I(o(i.path,"../data",i.identifier),i.logger),this.linkModule(i.identifier,r),this.plugins.set(i.identifier,i),b.options.push(i.identifier),i.onInitialize(i),this.bindEvents(i)}}bundle(e){let t=new j,s=e.resources.size>0?y.HasResources:y.HasNoResources;switch(t.writeByte(s),s){case y.HasNoResources:{let n=o(e.path,"dist","index.js"),r=P(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),F(o(this.path,`${e.identifier}-v${e.version}.plugin`),D(t.getBuffer()));break}case y.HasResources:{let n=o(e.path,"dist","index.js"),r=P(n);t.writeVarInt(r.byteLength),t.writeBuffer(r),t.writeVarInt(e.resources.size);for(let i of e.resources){let c=i.compress();t.writeVarInt(c.byteLength),t.writeBuffer(c)}F(o(this.path,`${e.identifier}-v${e.version}.plugin`),D(t.getBuffer()));break}}}bindEvents(e){let t=Object.getPrototypeOf(e),s=Object.getOwnPropertyNames(t),n=Object.keys(q);n=n.slice(n.length/2);for(let r of n){let i=n.indexOf(r);if(s.includes("on"+r)){let c=e["on"+r];typeof c=="function"&&this.serenity.on(i,c.bind(e))}if(s.includes("before"+r)){let c=e["before"+r];typeof c=="function"&&this.serenity.before(i,c.bind(e))}if(s.includes("after"+r)){let c=e["after"+r];typeof c=="function"&&this.serenity.after(i,c.bind(e))}}}linkModule(e,t){process.versions.bun!==void 0&&Bun.plugin({name:`serenityjs.plugin.${e}`,setup(n){n.module(e,()=>({exports:t,loader:"object"}))}})}};import{Logger as ne,LoggerColors as oe}from"@serenityjs/logger";import{Emitter as ae}from"@serenityjs/emitter";var C=class{static{d(this,"PluginBlockRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var J=class{static{d(this,"PluginItemRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var W=class{static{d(this,"PluginEntityRegistry")}types=[];traits=[];registerType(...e){return this.types.push(...e),this}unregisterType(e){let t=this.types.indexOf(e);return t!==-1&&this.types.splice(t,1),this}registerTrait(...e){return this.traits.push(...e),this}unregisterTrait(e){let t=this.traits.indexOf(e);return t!==-1&&this.traits.splice(t,1),this}};var lt=class extends ae{static{d(this,"Plugin")}identifier;version;logger;priority=R.Normal;blocks=new C;items=new J;entities=new W;resources=new Set;config={};fileSystem;path;isBundled;pipeline;serenity;constructor(e,t,s){super(s?.maxListeners),this.identifier=e,this.version=t,this.logger=s?.logger??new ne(`${e}@${t}`,oe.Blue),s?.onInitialize&&(this.onInitialize=s.onInitialize),s?.onStartUp&&(this.onStartUp=s.onStartUp),s?.onShutDown&&(this.onShutDown=s.onShutDown)}resolve(e){if(!this.pipeline)return null;let t=this.pipeline.plugins.get(e);return t||null}onInitialize(e){}onStartUp(e){}onShutDown(e){}defineConfig(e){return Object.assign(this.config,e),this.config}};export{se as DefaultPipelineProperties,Ue as Pipeline,lt as Plugin,I as PluginFileSystem,y as PluginHeader,R as PluginPriority,k as PluginType};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIiwgIi4uL3NyYy9lbnVtcy9oZWFkZXIudHMiLCAiLi4vc3JjL2VudW1zL3ByaW9yaXR5LnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9maWxlLXN5c3RlbS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9yZWdpc3RyeS9ibG9jay50cyIsICIuLi9zcmMvcmVnaXN0cnkvaXRlbS50cyIsICIuLi9zcmMvcmVnaXN0cnkvZW50aXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHVubGlua1N5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZGVmbGF0ZVN5bmMsIGluZmxhdGVTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiO1xuXG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcbmltcG9ydCB7IFNlcmVuaXR5LCBTZXJ2ZXJFdmVudCwgV29ybGRFdmVudCB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFBsdWdpblBhY2thZ2UgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSBcIi4vcGx1Z2luXCI7XG5pbXBvcnQgQ29tbWFuZCBmcm9tIFwiLi9jb21tYW5kcy9jb21tYW5kXCI7XG5pbXBvcnQgeyBQbHVnaW5zRW51bSB9IGZyb20gXCIuL2NvbW1hbmRzXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlLCBQbHVnaW5IZWFkZXIgfSBmcm9tIFwiLi9lbnVtc1wiO1xuaW1wb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9IGZyb20gXCIuL2ZpbGUtc3lzdGVtXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xuICBpbml0aWFsaXplOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlLFxuICBpbml0aWFsaXplOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5NYXRlcmlhbExhcGlzKTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSB3b3JsZCBpbml0aWFsaXplIGV2ZW50XG4gICAgc2VyZW5pdHkub24oV29ybGRFdmVudC5Xb3JsZEluaXRpYWxpemUsICh7IHdvcmxkIH0pID0+IHtcbiAgICAgIC8vIFJlZ2lzdGVyIHRoZSBjb21tYW5kcyBmb3IgdGhlIHBsdWdpbnNcbiAgICAgIGlmICh0aGlzLnByb3BlcnRpZXMuY29tbWFuZHMpIENvbW1hbmQod29ybGQsIHRoaXMpO1xuXG4gICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgcmVnaXN0ZXIgdGhlIGJsb2NrcywgaXRlbXMsIGFuZCBlbnRpdGllc1xuICAgICAgZm9yIChjb25zdCBbLCBwbHVnaW5dIG9mIHRoaXMucGx1Z2lucykge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgYmxvY2tzIGZvciB0aGUgd29ybGRcbiAgICAgICAgd29ybGQuYmxvY2tQYWxldHRlXG4gICAgICAgICAgLnJlZ2lzdGVyVHlwZSguLi5wbHVnaW4uYmxvY2tzLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5ibG9ja3MudHJhaXRzKTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgaXRlbXMgZm9yIHRoZSB3b3JsZFxuICAgICAgICB3b3JsZC5pdGVtUGFsZXR0ZVxuICAgICAgICAgIC5yZWdpc3RlclR5cGUoLi4ucGx1Z2luLml0ZW1zLnR5cGVzKVxuICAgICAgICAgIC5yZWdpc3RlclRyYWl0KC4uLnBsdWdpbi5pdGVtcy50cmFpdHMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBlbnRpdGllcyBmb3IgdGhlIHdvcmxkXG4gICAgICAgIHdvcmxkLmVudGl0eVBhbGV0dGVcbiAgICAgICAgICAucmVnaXN0ZXJUeXBlKC4uLnBsdWdpbi5lbnRpdGllcy50eXBlcylcbiAgICAgICAgICAucmVnaXN0ZXJUcmFpdCguLi5wbHVnaW4uZW50aXRpZXMudHJhaXRzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW5zIHNob3VsZCBiZSBpbml0aWFsaXplZFxuICAgIGlmICh0aGlzLnByb3BlcnRpZXMuaW5pdGlhbGl6ZSkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHBsdWdpbnMgcGlwZWxpbmUuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZSgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2lucyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoKSkpXG4gICAgICAvLyBJZiBub3QsIGNyZWF0ZSB0aGUgcGx1Z2lucyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ2hlY2sgaWYgYSBwbHVnaW5zIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJkYXRhXCIpKSlcbiAgICAgIC8vIElmIG5vdCwgY3JlYXRlIHRoZSBwbHVnaW5zIGRhdGEgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgsIFwiZGF0YVwiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAvLyBDaGVjayBpZiBhIHBsdWdpbnMgY29uZmlncyBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUodGhpcy5wYXRoLCBcImNvbmZpZ3NcIikpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgY29uZmlncyBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCwgXCJjb25maWdzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIC8vIEFuZCBmaWx0ZXIgb3V0IHRoZSBkYXRhIGFuZCBjb25maWdzIGRpcmVjdG9yaWVzXG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRGlyZWN0b3J5KClcbiAgICAgICAgPyBkaXJlbnQubmFtZSAhPT0gXCJkYXRhXCIgJiYgZGlyZW50Lm5hbWUgIT09IFwiY29uZmlnc1wiXG4gICAgICAgIDogdHJ1ZVxuICAgICk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGFsbCB0aGUgZmlsZXMgdGhhdCBoYXZlIGEgLnBsdWdpbiBleHRlbnNpb25cbiAgICBjb25zdCBidW5kbGVzID0gZW50cmllcy5maWx0ZXIoKGRpcmVudCkgPT5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBlbnRyeSBpcyBhIGZpbGUsIGFuZCBpZiBpdCBoYXMgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gQXJyYXkgdG8gaG9sZCB0aGUgb3JkZXJlZCBwbHVnaW5zXG4gICAgY29uc3Qgb3JkZXJlZFBsdWdpbnM6IEFycmF5PFBsdWdpbj4gPSBbXTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGJ1bmRsZWQgcGx1Z2lucywgYW5kIGltcG9ydCB0aGVtXG4gICAgZm9yIChjb25zdCBidW5kbGUgb2YgYnVuZGxlcykge1xuICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBwbHVnaW5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIC5wbHVnaW4gZmlsZSBhbmQgaW5mbGF0ZSBpdCwgYW5kIGNyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oYnVmZmVyKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCkgYXMgUGx1Z2luVHlwZSB8IFBsdWdpbkhlYWRlcjtcblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSBwbHVnaW4gdG8gdGhlIG9yZGVyZWQgcGx1Z2lucyBhcnJheVxuICAgICAgICAgICAgaWYgKHBsdWdpbikgb3JkZXJlZFBsdWdpbnMucHVzaChwbHVnaW4pO1xuXG4gICAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcblxuICAgICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpLnRvU3RyaW5nKFwidXRmLThcIik7XG5cbiAgICAgICAgICAgIC8vIExvYWQgdGhlIHBsdWdpbiBmcm9tIHRoZSB0ZXh0IHNvdXJjZVxuICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgICAgICBpZiAoIXBsdWdpbikgYnJlYWs7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgICAgICBvcmRlcmVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc291cmNlczsgaSsrKSB7XG4gICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gcmVhZCB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZEJ1ZmZlcihsZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgLy8gTG9hZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBidWZmZXJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgICAgIHBsdWdpbi5sb2dnZXIuc3VjY2VzcyhcbiAgICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgICAgICBwbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgICAgIC8vIExvZyB0aGUgZXJyb3IgaWYgdGhlIHJlc291cmNlIHBhY2sgZmFpbGVkIHRvIGxvYWRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtwbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICAgIHJlYXNvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQWRkb246IHtcbiAgICAgICAgICAgIC8vIFdlIHdpbGwgaGFuZGxlIGFkZG9uIHBsdWdpbnMsIGJ1dCBtZW50aW9uIHRoYXQgdGhleSBhcmUgZGVwcmVjYXRlZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gwqcxJHtyZWxhdGl2ZShcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgaXMgdXNpbmcgYSBkZXByZWNhdGVkIHBsdWdpbiB0eXBlIChBZGRvbikuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIG1vZHVsZSBlbnRyeSBwb2ludCBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgICAvLyBMb2FkIHRoZSBwbHVnaW4gZnJvbSB0aGUgdGV4dCBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMubG9hZEZyb21UZXh0U291cmNlKHBhdGgsIGluZGV4LCB0cnVlKTtcblxuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIHRvIHRoZSBvcmRlcmVkIHBsdWdpbnMgYXJyYXlcbiAgICAgICAgICAgIGlmIChwbHVnaW4pIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBERVBSRUNBVEVEOiBFdmVudHVhbGx5IHJlbW92ZSBzdXBwb3J0IGZvciB0aGVzZSBwbHVnaW4gdHlwZXNcbiAgICAgICAgICBjYXNlIFBsdWdpblR5cGUuQXBpOiB7XG4gICAgICAgICAgICAvLyBXZSBubyBsb25nZXIgc3VwcG9ydCBBUEkgcGx1Z2luc1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBUaGUgcGx1Z2luIMKnMSR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYnVuZGxlLm5hbWUpXG4gICAgICAgICAgICAgICl9wqdyIGlzIHVzaW5nIGEgZGVwcmVjYXRlZCBwbHVnaW4gdHlwZSAoQVBJKS4gQVBJIHBsdWdpbnMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFBsZWFzZSB1cGRhdGUgdGhlIHBsdWdpbiB0byB1c2UgdGhlIG5ldyBwbHVnaW4gc3lzdGVtLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5maWxlU3lzdGVtID0gbmV3IFBsdWdpbkZpbGVTeXN0ZW0oXG4gICAgICAgICAgcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCIuLi9kYXRhXCIsIHBsdWdpbi5pZGVudGlmaWVyKSxcbiAgICAgICAgICBwbHVnaW4ubG9nZ2VyXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgICB0aGlzLmxpbmtNb2R1bGUocGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgIHRoaXMucGx1Z2lucy5zZXQocGx1Z2luLmlkZW50aWZpZXIsIHBsdWdpbik7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiB0byB0aGUgb3JkZXJlZCBwbHVnaW5zIGFycmF5XG4gICAgICAgIG9yZGVyZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBhIFwicmVzb3VyY2VfcGFja3NcIiBkaXJlY3RvcnkgZXhpc3RzIGluIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJyZXNvdXJjZV9wYWNrc1wiKSkpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHJlc291cmNlX3BhY2tzIGRpcmVjdG9yeVxuICAgICAgICAgIG1rZGlyU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlX3BhY2sgZGlyZWN0b3J5LCBvbmx5IGluY2x1ZGluZyBkaXJlY3Rvcmllc1xuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiksIHtcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlXG4gICAgICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVzb3VyY2UgcGFjayBkaXJlY3RvcmllcywgYW5kIGF0dGVtcHQgdG8gbG9hZCB0aGVtXG4gICAgICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG4gICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc291cmNlIHBhY2ssIGFuZCBhZGQgaXQgdG8gdGhlIHNlcmVuaXR5IHJlc291cmNlc1xuICAgICAgICAgICAgY29uc3QgcGFjayA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tUGF0aChcbiAgICAgICAgICAgICAgcmVzb2x2ZShwYXRoLCBcInJlc291cmNlX3BhY2tzXCIsIHJlc291cmNlLm5hbWUpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBMb2cgdGhlIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgcmVzb3VyY2UgcGFja1xuICAgICAgICAgICAgcGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICBgTG9hZGVkIHJlc291cmNlIHBhY2sgwqd1JHtwYWNrLm5hbWV9wqdyICjCpzgke3BhY2sudXVpZH3Cp3IpLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgcGx1Z2luIHJlc291cmNlcyBzZXRcbiAgICAgICAgICAgIHBsdWdpbi5yZXNvdXJjZXMuYWRkKHBhY2spO1xuICAgICAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBwYWNrIMKnOCR7cmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICByZXNvbHZlKHBhdGgsIFwicmVzb3VyY2VfcGFja3NcIiwgcmVzb3VyY2UubmFtZSlcbiAgICAgICAgICAgICAgKX3Cp3IgZm9yIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnci5gLFxuICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgcGx1Z2lucyBieSB0aGVpciBwcmlvcml0eVxuICAgIG9yZGVyZWRQbHVnaW5zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIFNvcnQgYnkgcHJpb3JpdHkgZmlyc3RcbiAgICAgIGlmIChhLnByaW9yaXR5ICE9PSBiLnByaW9yaXR5KSB7XG4gICAgICAgIHJldHVybiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eTsgLy8gSGlnaGVyIHByaW9yaXR5IGNvbWVzIGZpcnN0XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHByaW9yaXR5IGlzIHRoZSBzYW1lLCBzb3J0IGJ5IGlkZW50aWZpZXIgYWxwaGFiZXRpY2FsbHlcbiAgICAgIGlmIChhLmlkZW50aWZpZXIgPCBiLmlkZW50aWZpZXIpIHJldHVybiAtMTtcbiAgICAgIGlmIChhLmlkZW50aWZpZXIgPiBiLmlkZW50aWZpZXIpIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBwbHVnaW5zLCBhbmQgaW5pdGlhbGl6ZSB0aGVtXG4gICAgZm9yIChjb25zdCBwbHVnaW4gb2Ygb3JkZXJlZFBsdWdpbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGNvbmZpZyBkZWZpbmVkXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhwbHVnaW4uY29uZmlnIGFzIG9iamVjdCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcGF0aCB0byB0aGUgcGx1Z2luIGNvbmZpZyBmaWxlXG4gICAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUoXG4gICAgICAgICAgICB0aGlzLnBhdGgsXG4gICAgICAgICAgICBcImNvbmZpZ3NcIixcbiAgICAgICAgICAgIGAke3BsdWdpbi5pZGVudGlmaWVyfS5qc29uYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBhIGNvbmZpZyBmaWxlIGV4aXN0cyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGlmICghZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGRlZmF1bHQgY29uZmlnIHRvIHRoZSBjb25maWcgZmlsZVxuICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhwYXRoLCBKU09OLnN0cmluZ2lmeShwbHVnaW4uY29uZmlnLCBudWxsLCAyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNvbmZpZyBmaWxlXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGYtOFwiKSk7XG5cbiAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgY29uZmlnIGRhdGEgdG8gdGhlIHBsdWdpbiBjb25maWdcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luLmNvbmZpZyBhcyBvYmplY3QsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICBwbHVnaW4ub25Jbml0aWFsaXplKHBsdWdpbik7XG4gICAgICAgIHRoaXMuYmluZEV2ZW50cyhwbHVnaW4pO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYnVuZGxlZFxuICAgICAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICAgICAgY29uc3QgdGVtcCA9IHJlc29sdmUocGx1Z2luLnBhdGguc2xpY2UoMCwgLTcpLnJlcGxhY2UoL1xcLi9nLCBcIl9cIikpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpZiBpdCBleGlzdHNcbiAgICAgICAgICBpZiAoZXhpc3RzU3luYyh0ZW1wKSkgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB1bmxpbmtTeW5jKHRlbXApKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIFwiJHtyZWxhdGl2ZShcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICByZXNvbHZlKHBsdWdpbi5wYXRoKVxuICAgICAgICAgICl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHVwIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU3RhcnRVcChwbHVnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHN0b3AoKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIGFsbCB0aGUgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMucGx1Z2lucy52YWx1ZXMoKSkgcGx1Z2luLm9uU2h1dERvd24ocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgcGx1Z2luIGZyb20gYSB0ZXh0IHNvdXJjZS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGlzQnVuZGxlZCBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgYnVuZGxlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgbG9hZEZyb21UZXh0U291cmNlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBpc0J1bmRsZWQgPSBmYWxzZVxuICApOiBQbHVnaW4gfCBudWxsIHtcbiAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgIGNvbnN0IHRlbXAgPSByZXNvbHZlKHBhdGguc2xpY2UoMCwgLTcpLnJlcGxhY2UoL1xcLi9nLCBcIl9cIikpO1xuXG4gICAgLy8gV3JpdGUgdGhlIHNvdXJjZSB0byB0aGUgdGVtcG9yYXJ5IHBhdGhcbiAgICB3cml0ZUZpbGVTeW5jKHJlc29sdmUodGVtcCksIHNvdXJjZSk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShyZXNvbHZlKHRlbXApKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAvLyBMb2cgdGhlIHdhcm5pbmcgdGhhdCB0aGUgcGx1Z2luIGlzIGFscmVhZHkgbG9hZGVkXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCp3Uke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcblxuICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgcGx1Z2luLnBpcGVsaW5lID0gdGhpcztcbiAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICBwbHVnaW4ucGF0aCA9IHJlc29sdmUocGF0aCk7XG4gICAgICBwbHVnaW4uaXNCdW5kbGVkID0gaXNCdW5kbGVkO1xuXG4gICAgICAvLyBTZXQgdGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luXG4gICAgICBwbHVnaW4uZmlsZVN5c3RlbSA9IG5ldyBQbHVnaW5GaWxlU3lzdGVtKFxuICAgICAgICByZXNvbHZlKHBsdWdpbi5wYXRoLCBcIi4uL2RhdGFcIiwgcGx1Z2luLmlkZW50aWZpZXIpLFxuICAgICAgICBwbHVnaW4ubG9nZ2VyXG4gICAgICApO1xuXG4gICAgICAvLyBMaW5rIHRoZSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lXG4gICAgICB0aGlzLmxpbmtNb2R1bGUocGx1Z2luLmlkZW50aWZpZXIsIG1vZHVsZSk7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgZW51bVxuICAgICAgUGx1Z2luc0VudW0ub3B0aW9ucy5wdXNoKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgICAgLy8gUmV0dXJuIHRoZSBwbHVnaW5cbiAgICAgIHJldHVybiBwbHVnaW47XG4gICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgdW5saW5rU3luYyhyZXNvbHZlKHRlbXApKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiB0aGUgcGx1Z2luIGZhaWxlZCB0byBsb2FkXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMgaW4gdGhlIHBsdWdpbiwgYW5kIHJlbW92ZSB0aGVtIGZyb20gdGhlIHNlcmVuaXR5IGluc3RhbmNlXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiBwbHVnaW4ucmVzb3VyY2VzKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICAgIHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLnBhY2tzLmRlbGV0ZShyZXNvdXJjZS51dWlkKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2luLmlzQnVuZGxlZCkge1xuICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGluZmxhdGVTeW5jKHJlYWRGaWxlU3luYyhwYXRoKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBwbHVnaW4gaGVhZGVyIGZyb20gdGhlIHN0cmVhbVxuICAgICAgY29uc3QgdHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpIGFzIFBsdWdpblR5cGUgfCBQbHVnaW5IZWFkZXI7XG5cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlczoge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBsZW5ndGggPSBzdHJlYW0ucmVhZFZhckludCgpO1xuXG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgcGx1Z2luIGZyb20gdGhlIHRleHQgc291cmNlXG4gICAgICAgICAgY29uc3QgbmV3UGx1Z2luID0gdGhpcy5sb2FkRnJvbVRleHRTb3VyY2UocGF0aCwgaW5kZXgsIHRydWUpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB3YXMgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICAgICAgICAgIGlmICghbmV3UGx1Z2luKSBicmVhaztcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgICAgIG5ld1BsdWdpbi5vbkluaXRpYWxpemUobmV3UGx1Z2luKTtcbiAgICAgICAgICB0aGlzLmJpbmRFdmVudHMobmV3UGx1Z2luKTtcblxuICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSBwbHVnaW5cbiAgICAgICAgICBuZXdQbHVnaW4ub25TdGFydFVwKG5ld1BsdWdpbik7XG5cbiAgICAgICAgICAvLyBSZWFkIHRoZSBhbW91bnQgb2YgcmVzb3VyY2VzIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IHJlc291cmNlcyA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZXNvdXJjZXMsIGFuZCByZWFkIHRoZW0gZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvdXJjZXM7IGkrKykge1xuICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBwYWNrXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgZnJvbSB0aGUgc3RyZWFtXG4gICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzb3VyY2UgcGFjayBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSBwYWNrIGZyb20gdGhlIGJ1ZmZlclxuICAgICAgICAgICAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuc2VyZW5pdHkucmVzb3VyY2VzLmxvYWRGcm9tWmlwKGJ1ZmZlcik7XG5cbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIGxvYWQgb2YgdGhlIHJlc291cmNlIHBhY2tcbiAgICAgICAgICAgICAgbmV3UGx1Z2luLmxvZ2dlci5zdWNjZXNzKFxuICAgICAgICAgICAgICAgIGBMb2FkZWQgcmVzb3VyY2UgcGFjayDCp3Uke3Jlc291cmNlLm5hbWV9wqdyICjCpzgke3Jlc291cmNlLnV1aWR9wqdyKS5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSByZXNvdXJjZSBwYWNrIHRvIHRoZSBwbHVnaW4gcmVzb3VyY2VzIHNldFxuICAgICAgICAgICAgICBuZXdQbHVnaW4ucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBpZiB0aGUgcmVzb3VyY2UgcGFjayBmYWlsZWQgdG8gbG9hZFxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2UgcGFjayDCpzgke3JlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBwYXRoKVxuICAgICAgICAgICAgICAgICl9wqdyIGZvciBwbHVnaW4gwqcxJHtuZXdQbHVnaW4uaWRlbnRpZmllcn3Cp3IuYCxcbiAgICAgICAgICAgICAgICByZWFzb25cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVhZCB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShcbiAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICkgYXMgUGx1Z2luUGFja2FnZTtcblxuICAgICAgLy8gR2V0IHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgcGx1Z2luXG4gICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVkIGVudHJ5IHBvaW50IGlzIHZhbGlkXG4gICAgICBpZiAoIWV4aXN0c1N5bmMocmVzb2x2ZShwYXRoLCBtYWluKSkpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgVW5hYmxlIHRvIHJlbG9hZCBwbHVnaW4gwqd1JHttYW5pZmVzdC5uYW1lID8/IFwidW5rbm93bi1wbHVnaW5cIn3CpzhAwqd1JHttYW5pZmVzdC52ZXJzaW9uID8/IFwidW5rbm93bi12ZXJzaW9uXCJ9wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEF0dGVtcHQgdG8gaW1wb3J0IHRoZSBwbHVnaW4gbW9kdWxlXG4gICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAvLyBHZXQgdGhlIHBsdWdpbiBjbGFzcyBmcm9tIHRoZSBtb2R1bGVcbiAgICAgIGNvbnN0IG5ld1BsdWdpbiA9IG1vZHVsZS5kZWZhdWx0IGFzIFBsdWdpbjtcblxuICAgICAgLy8gU2V0IHRoZSBwaXBlbGluZSwgc2VyZW5pdHksIGFuZCBwYXRoIGZvciB0aGUgcGx1Z2luXG4gICAgICBuZXdQbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgbmV3UGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIG5ld1BsdWdpbi5wYXRoID0gcGF0aDtcbiAgICAgIG5ld1BsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgLy8gU2V0IHRoZSBmaWxlIHN5c3RlbSBmb3IgdGhlIHBsdWdpblxuICAgICAgbmV3UGx1Z2luLmZpbGVTeXN0ZW0gPSBuZXcgUGx1Z2luRmlsZVN5c3RlbShcbiAgICAgICAgcmVzb2x2ZShuZXdQbHVnaW4ucGF0aCwgXCIuLi9kYXRhXCIsIG5ld1BsdWdpbi5pZGVudGlmaWVyKSxcbiAgICAgICAgbmV3UGx1Z2luLmxvZ2dlclxuICAgICAgKTtcblxuICAgICAgLy8gTGluayB0aGUgbW9kdWxlIHRvIHRoZSBwaXBlbGluZVxuICAgICAgdGhpcy5saW5rTW9kdWxlKG5ld1BsdWdpbi5pZGVudGlmaWVyLCBtb2R1bGUpO1xuXG4gICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgIHRoaXMucGx1Z2lucy5zZXQobmV3UGx1Z2luLmlkZW50aWZpZXIsIG5ld1BsdWdpbik7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChuZXdQbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpbiwgYW5kIGJpbmQgdGhlIGV2ZW50c1xuICAgICAgbmV3UGx1Z2luLm9uSW5pdGlhbGl6ZShuZXdQbHVnaW4pO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKG5ld1BsdWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdGhlIHBsdWdpbiBoZWFkZXIgYmFzZWQgb24gdGhlIHJlc291cmNlc1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICBwbHVnaW4ucmVzb3VyY2VzLnNpemUgPiAwXG4gICAgICAgID8gUGx1Z2luSGVhZGVyLkhhc1Jlc291cmNlc1xuICAgICAgICA6IFBsdWdpbkhlYWRlci5IYXNOb1Jlc291cmNlcztcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShoZWFkZXIpO1xuXG4gICAgLy8gU3dpdGNoIGJhc2VkIG9uIHRoZSBwbHVnaW4gaGVhZGVyXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGNhc2UgUGx1Z2luSGVhZGVyLkhhc05vUmVzb3VyY2VzOiB7XG4gICAgICAgIC8vIEdldCB0aGUgcGF0aCB0byB0aGUgcGx1Z2luJ3MgY29tcGlsZWQgaW5kZXggZmlsZVxuICAgICAgICBjb25zdCBwYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIsIFwiaW5kZXguanNcIik7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZSBmcm9tIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocGF0aCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChpbmRleC5ieXRlTGVuZ3RoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXggZmlsZSB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LXYke3BsdWdpbi52ZXJzaW9ufS5wbHVnaW5gKSxcbiAgICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQnJlYWsgb3V0IG9mIHRoZSBzd2l0Y2ggc3RhdGVtZW50XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBsdWdpbkhlYWRlci5IYXNSZXNvdXJjZXM6IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBjb21waWxlZCBpbmRleCBmaWxlXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXNvbHZlKHBsdWdpbi5wYXRoLCBcImRpc3RcIiwgXCJpbmRleC5qc1wiKTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlIGZyb20gdGhlIHBsdWdpblxuICAgICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhwYXRoKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KGluZGV4LmJ5dGVMZW5ndGgpO1xuXG4gICAgICAgIC8vIFdyaXRlIHRoZSBpbmRleCBmaWxlIHRvIHRoZSBzdHJlYW1cbiAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgYW1vdW50IG9mIHJlc291cmNlcyB0byB0aGUgc3RyZWFtXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChwbHVnaW4ucmVzb3VyY2VzLnNpemUpO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlc291cmNlcywgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGNvbnN0IHJlc291cmNlIG9mIHBsdWdpbi5yZXNvdXJjZXMpIHtcbiAgICAgICAgICAvLyBDb21wcmVzcyB0aGUgcmVzb3VyY2UgcGFjayBpbnRvIGEgYnVmZmVyXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gcmVzb3VyY2UuY29tcHJlc3MoKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIHBhY2sgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludChidWZmZXIuYnl0ZUxlbmd0aCk7XG5cbiAgICAgICAgICAvLyBXcml0ZSB0aGUgcmVzb3VyY2UgcGFjayB0byB0aGUgc3RyZWFtXG4gICAgICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSB0aGUgQmluYXJ5U3RyZWFtIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0tdiR7cGx1Z2luLnZlcnNpb259LnBsdWdpbmApLFxuICAgICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBCcmVhayBvdXQgb2YgdGhlIHN3aXRjaCBzdGF0ZW1lbnRcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJpbmRFdmVudHMocGx1Z2luOiBQbHVnaW4pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHByb3RvdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBsdWdpbik7XG5cbiAgICAvLyBHZXQgdGhlIG9iamVjdCBrZXlzIGZyb20gdGhlIHBsdWdpblxuICAgIGNvbnN0IHBsdWdpbktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90b3R5cGUpO1xuXG4gICAgLy8gR2V0IHRoZSB3b3JsZCBldmVudCBrZXlzLCBhbmQgc2xpY2UgdGhlbSBpbiBoYWxmXG4gICAgbGV0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKFdvcmxkRXZlbnQpO1xuICAgIGV2ZW50S2V5cyA9IGV2ZW50S2V5cy5zbGljZShldmVudEtleXMubGVuZ3RoIC8gMik7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBldmVudCBrZXlzXG4gICAgZm9yIChjb25zdCBldmVudEtleSBvZiBldmVudEtleXMpIHtcbiAgICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IGtleVxuICAgICAgY29uc3QgaW5kZXggPSBldmVudEtleXMuaW5kZXhPZihldmVudEtleSkgYXMgV29ybGRFdmVudDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwib25cIiBldmVudCBrZXlzXG4gICAgICBpZiAocGx1Z2luS2V5cy5pbmNsdWRlcyhcIm9uXCIgKyBldmVudEtleSkpIHtcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgZXZlbnQga2V5XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGx1Z2luWyhcIm9uXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkub24oaW5kZXgsIHZhbHVlLmJpbmQocGx1Z2luKSBhcyAoKSA9PiB2b2lkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYW55IFwiYmVmb3JlXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJiZWZvcmVcIiArIGV2ZW50S2V5KSkge1xuICAgICAgICAvLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBldmVudCBrZXlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwbHVnaW5bKFwiYmVmb3JlXCIgKyBldmVudEtleSkgYXMga2V5b2YgUGx1Z2luXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgLy8gQmluZCB0aGUgZXZlbnQgdG8gdGhlIHBsdWdpblxuICAgICAgICAgIHRoaXMuc2VyZW5pdHkuYmVmb3JlKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gYm9vbGVhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaGFzIGFueSBcImFmdGVyXCIgZXZlbnQga2V5c1xuICAgICAgaWYgKHBsdWdpbktleXMuaW5jbHVkZXMoXCJhZnRlclwiICsgZXZlbnRLZXkpKSB7XG4gICAgICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGV2ZW50IGtleVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHBsdWdpblsoXCJhZnRlclwiICsgZXZlbnRLZXkpIGFzIGtleW9mIFBsdWdpbl07XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb25cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50IHRvIHRoZSBwbHVnaW5cbiAgICAgICAgICB0aGlzLnNlcmVuaXR5LmFmdGVyKGluZGV4LCB2YWx1ZS5iaW5kKHBsdWdpbikgYXMgKCkgPT4gdm9pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgYSBtb2R1bGUgdG8gdGhlIHBpcGVsaW5lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxpbmsuXG4gICAqIEBwYXJhbSBtb2R1bGUgVGhlIG1vZHVsZSB0byBsaW5rLlxuICAgKi9cbiAgcHVibGljIGxpbmtNb2R1bGUobmFtZTogc3RyaW5nLCBtb2R1bGU6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIHJ1bnRpbWUgb2YgdGhlIHNlcnZlclxuICAgIGNvbnN0IGlzQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW4gPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgIC8vIE1vZHVsZSBsaW5raW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIEJ1blxuICAgIGlmICghaXNCdW4pIHJldHVybjtcblxuICAgIC8vIEluamVjdCB0aGUgbW9kdWxlIGludG8gdGhlIEJ1biBwbHVnaW4gc3lzdGVtXG4gICAgQnVuLnBsdWdpbih7XG4gICAgICBuYW1lOiBgc2VyZW5pdHlqcy5wbHVnaW4uJHtuYW1lfWAsXG4gICAgICBzZXR1cChidWlsZGVyKSB7XG4gICAgICAgIGJ1aWxkZXIubW9kdWxlKG5hbWUsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXhwb3J0czogbW9kdWxlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgbG9hZGVyOiBcIm9iamVjdFwiXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kUGFsZXR0ZS5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbnMgPSBbXCJzZXJlbml0eS5vcGVyYXRvclwiXTtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iLCAiZW51bSBQbHVnaW5IZWFkZXIge1xuICBIYXNOb1Jlc291cmNlcyA9IDIsXG4gIEhhc1Jlc291cmNlcyA9IDNcbn1cblxuZXhwb3J0IHsgUGx1Z2luSGVhZGVyIH07XG4iLCAiLyoqXG4gKiBUaGUgcHJpb3JpdHkgb2YgYSBwbHVnaW4gZGV0ZXJtaW5lcyB3aGVuIGl0IHdpbGwgYmUgbG9hZGVkIGluIHJlbGF0aW9uIHRvIG90aGVyIHBsdWdpbnMuXG4gKiBBIHBsdWdpbiB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHdpbGwgYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB3aXRoIGEgbG93ZXIgcHJpb3JpdHkuXG4gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBvciBhZnRlciBvdGhlciBwbHVnaW5zLlxuICogRm9yIGV4YW1wbGUsIGEgbGlicmFyeSBwbHVnaW4gbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGJlZm9yZSBhIHBsdWdpbiB0aGF0IHVzZXMgaXQsXG4gKiBvciBhIHBsdWdpbiB0aGF0IG1vZGlmaWVzIHRoZSBiZWhhdmlvciBvZiBzZXJlbml0eSdzIEFQSXMgbWF5IG5lZWQgdG8gYmUgbG9hZGVkIGFmdGVyIGl0LlxuICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgTm9ybWFsLlxuICovXG5lbnVtIFBsdWdpblByaW9yaXR5IHtcbiAgLyoqXG4gICAqIEEgbG93IHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBhZnRlciBvdGhlciBwbHVnaW5zLlxuICAgKiBVc2VmdWwgZm9yIHJlYWN0aW5nIHRvIGNoYW5nZXMgb3IgZmluYWwgYWRqdXN0bWVudHMuXG4gICAqL1xuICBMb3csXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHBsdWdpbi5cbiAgICogU3VpdGFibGUgZm9yIHN0YW5kYXJkIHBsdWdpbiBiZWhhdmlvci5cbiAgICovXG4gIE5vcm1hbCxcblxuICAvKipcbiAgICogQSBoaWdoIHByaW9yaXR5IHBsdWdpbiB3aWxsIGJlIGxvYWRlZCBiZWZvcmUgb3RoZXIgcGx1Z2lucy5cbiAgICogVXNlZnVsIGZvciBlYXJseSBzZXR1cCBvciBvdmVycmlkaW5nIGJlaGF2aW9yLlxuICAgKi9cbiAgSGlnaFxufVxuXG5leHBvcnQgeyBQbHVnaW5Qcmlvcml0eSB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHJlYWRkaXJTeW5jXG59IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSwgc2VwLCBpc0Fic29sdXRlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5jbGFzcyBQbHVnaW5GaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luRmlsZVN5c3RlbSBjbGFzcy5cbiAgICogQHBhcmFtIGRhdGFQYXRoIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihkYXRhUGF0aDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlcikge1xuICAgIHRoaXMuZGF0YVBhdGggPSBkYXRhUGF0aDtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIHBhdGguXG4gICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwYXRoIGlzIHZhbGlkLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGF0aChcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgZXhwZWN0ZWRUeXBlPzogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyBhYnNvbHV0ZVxuICAgIGlmICghaXNBYnNvbHV0ZShwYXRoKSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYEF0dGVtcHRlZCB0byBhY2Nlc3MgaW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgYWJzb2x1dGUuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHBhdGggaXMgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeVxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKHRoaXMuZGF0YVBhdGggKyBzZXApKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgSW52YWxpZCBwYXRoOiAke3BhdGh9LiBQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGUgb3IgZGlyZWN0b3J5XG4gICAgY29uc3QgZmlsZVJlZ2V4ID0gLy4qXFwuLisvOyAvLyBNYXRjaGVzIHBhdGhzIHdpdGggYSBkb3QgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgY2hhcmFjdGVyc1xuICAgIGNvbnN0IGhhc0V4dGVuc2lvbiA9IGZpbGVSZWdleC50ZXN0KHBhdGgpO1xuICAgIGlmIChcbiAgICAgIChleHBlY3RlZFR5cGUgPT09IFwiZmlsZVwiICYmICFoYXNFeHRlbnNpb24pIHx8XG4gICAgICAoZXhwZWN0ZWRUeXBlID09PSBcImRpcmVjdG9yeVwiICYmIGhhc0V4dGVuc2lvbilcbiAgICApIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBJbnZhbGlkIHBhdGg6ICR7cGF0aH0uIFBhdGggaXMgbm90IGEgdmFsaWQgJHtleHBlY3RlZFR5cGV9LmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSBmaWxlIGZyb20gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkLlxuICAgKiBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgZW5jb2RpbmcuIElmIHByb3ZpZGVkLCByZXR1cm5zIGEgc3RyaW5nOyBvdGhlcndpc2UsIHJldHVybnMgYSBCdWZmZXIuXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGRhdGEgaWYgaXQgZXhpc3RzIGFuZCBpcyB2YWxpZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVhZEZpbGUocGF0aDogc3RyaW5nKTogQnVmZmVyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKHBhdGg6IHN0cmluZywgZW5jb2Rpbmc6IEJ1ZmZlckVuY29kaW5nKTogc3RyaW5nIHwgbnVsbDtcbiAgcHVibGljIHJlYWRGaWxlKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBlbmNvZGluZz86IEJ1ZmZlckVuY29kaW5nXG4gICk6IEJ1ZmZlciB8IHN0cmluZyB8IG51bGwge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlc29sdmUodGhpcy5kYXRhUGF0aCwgcGF0aCk7XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgcmVzb2x2ZWQgcGF0aFxuICAgIGNvbnN0IGlzVmFsaWQgPSB0aGlzLnZhbGlkYXRlUGF0aChmdWxsUGF0aCwgXCJmaWxlXCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlYWQgYW5kIHJldHVybiB0aGUgZmlsZSBkYXRhXG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhmdWxsUGF0aCwgZW5jb2RpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHdyaXRlLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZmlsZS5cbiAgICogQHJldHVybnNcbiAgICovXG4gIHB1YmxpYyB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBCdWZmZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImZpbGVcIik7XG4gICAgaWYgKCFpc1ZhbGlkKSByZXR1cm47XG5cbiAgICAvLyBFbnN1cmUgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIGZpbGUgZXhpc3RzXG4gICAgY29uc3QgZGlyUGF0aCA9IGZ1bGxQYXRoLnN1YnN0cmluZygwLCBmdWxsUGF0aC5sYXN0SW5kZXhPZihzZXApKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlyUGF0aCkpIG1rZGlyU3luYyhkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFdyaXRlIHRoZSBmaWxlIGRhdGFcbiAgICByZXR1cm4gd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGZpbGUgZnJvbSB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVGaWxlKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gZGF0YSBwYXRoIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZmlsZVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybjtcblxuICAgIC8vIFJlbW92ZSB0aGUgZmlsZVxuICAgIHJldHVybiBybVN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZS5cbiAgICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGNyZWF0ZWQgZGlyZWN0b3J5IGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqL1xuICBwdWJsaWMgbWtkaXIocGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGRhdGEgcGF0aCBleGlzdHNcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5kYXRhUGF0aCkpXG4gICAgICAvLyBJZiBpdCBkb2Vzbid0LCBtYWtlIHRoZSBkaXJlY3RvcnlcbiAgICAgIG1rZGlyU3luYyh0aGlzLmRhdGFQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuO1xuXG4gICAgLy8gTWFrZSB0aGUgZGlyZWN0b3J5XG4gICAgcmV0dXJuIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGRpcmVjdG9yeSBmcm9tIHRoZSBwbHVnaW4ncyBkYXRhIGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIHBhdGggVGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gICAqIEBwYXJhbSBmb3JjZSBXaGV0aGVyIHRvIGZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBkaXJlY3RvcnkgYW5kIGl0cyBjb250ZW50cy4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgcm1kaXIoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgcmVjdXJzaXZlOiBib29sZWFuOyBmb3JjZTogYm9vbGVhbiB9ID0ge1xuICAgICAgcmVjdXJzaXZlOiBmYWxzZSxcbiAgICAgIGZvcmNlOiBmYWxzZVxuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBkYXRhIHBhdGggZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm47XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoLCBcImRpcmVjdG9yeVwiKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkgcmV0dXJuO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBkaXJlY3RvcnlcbiAgICByZXR1cm4gcm1TeW5jKGZ1bGxQYXRoLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkgaW4gdGhlIHBsdWdpbidzIGRhdGEgZGlyZWN0b3J5LlxuICAgKiBAcGFyYW0gcGF0aCBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgb3IgbnVsbCBpZiB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9yIGlzIGludmFsaWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZERpcihwYXRoOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgbnVsbCB7XG4gICAgLy8gRW5zdXJlIHRoZSBwbHVnaW4gZGF0YSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFleGlzdHNTeW5jKHRoaXMuZGF0YVBhdGgpKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJlc29sdmUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGlyZWN0b3J5XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXNvbHZlKHRoaXMuZGF0YVBhdGgsIHBhdGgpO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIHJlc29sdmVkIHBhdGhcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZVBhdGgoZnVsbFBhdGgsIFwiZGlyZWN0b3J5XCIpO1xuICAgIGlmICghaXNWYWxpZCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhmdWxsUGF0aCkpIHJldHVybiBudWxsO1xuXG4gICAgLy8gUmVhZCBhbmQgcmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGVudHNcbiAgICByZXR1cm4gcmVhZGRpclN5bmMoZnVsbFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGZpbGUgb3IgZGlyZWN0b3J5IGV4aXN0cyBpbiB0aGUgcGx1Z2luJ3MgZGF0YSBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBwYXRoIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBjaGVjay5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkgZXhpc3RzLCBvdGhlcndpc2UgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgZXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEVuc3VyZSB0aGUgcGx1Z2luIGRhdGEgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyh0aGlzLmRhdGFQYXRoKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgLy8gUmVzb2x2ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWxlIG9yIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVzb2x2ZSh0aGlzLmRhdGFQYXRoLCBwYXRoKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByZXNvbHZlZCBwYXRoXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVQYXRoKGZ1bGxQYXRoKTtcbiAgICBpZiAoIWlzVmFsaWQpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBleGlzdHNcbiAgICByZXR1cm4gZXhpc3RzU3luYyhmdWxsUGF0aCk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRmlsZVN5c3RlbSB9O1xuIiwgImltcG9ydCB7IFJlc291cmNlUGFjaywgU2VyZW5pdHkgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBFbWl0dGVyIH0gZnJvbSBcIkBzZXJlbml0eWpzL2VtaXR0ZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIFBsdWdpbkJsb2NrUmVnaXN0cnksXG4gIFBsdWdpbkVudGl0eVJlZ2lzdHJ5LFxuICBQbHVnaW5JdGVtUmVnaXN0cnlcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IFBsdWdpblByaW9yaXR5IH0gZnJvbSBcIi4vZW51bXMvcHJpb3JpdHlcIjtcbmltcG9ydCB7IFBsdWdpbkZpbGVTeXN0ZW0gfSBmcm9tIFwiLi9maWxlLXN5c3RlbVwiO1xuXG5pbnRlcmZhY2UgUGx1Z2luT3B0aW9ucyBleHRlbmRzIFBhcnRpYWw8UGx1Z2luRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwcmlvcml0eTogUGx1Z2luUHJpb3JpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBtYXhMaXN0ZW5lcnM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiAjIEludHJvZHVjdGlvblxuICogUGx1Z2lucyBhcmUgdGhlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBTZXJlbml0eUpTLlxuICogVGhleSBhcmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdoaWNoIGFsbG93cyB0b3RhbCBjb250cm9sIG92ZXIgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBwbHVnaW5zIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGBQbHVnaW5UeXBlYCBlbnVtOiBgQWRkb25gICYgYEFwaWBcbiAqXG4gKiBBZGRvbiBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS4gVGhpcyBtZWFucyBleHRlcm5hbCBwbHVnaW5zIGNhbm5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIHRoZSBwbHVnaW5zIEFQSS5cbiAqIEFwaSBwbHVnaW5zIGFkZCBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuIFRoaXMgbWVhbnMgZXh0ZXJuYWwgcGx1Z2lucyBjYW4gZGlyZWN0bHkgaW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBBUEkuXG4gKlxuICogIyMgQ2xhc3MgRXh0ZW5kaW5nIFBsdWdpblxuICogYGBgdHNcbiAqIGltcG9ydCB7IFBsdWdpbiwgUGx1Z2luVHlwZSwgUGx1Z2luRXZlbnRzIH0gZnJvbSBcIkBzZXJlbml0eWpzL3BsdWdpbnNcIjtcbiAqXG4gKiBjbGFzcyBTYW1wbGVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuICogICBwdWJsaWMgcmVhZG9ubHkgdHlwZSA9IFBsdWdpblR5cGUuQWRkb247XG4gKlxuICogICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc3VwZXIoXCJzYW1wbGUtcGx1Z2luXCIsIFwiMS4wLjBcIik7XG4gKiAgIH1cbiAqXG4gKiAgIHB1YmxpYyBvbkluaXRpYWxpemUoKTogdm9pZCB7fVxuICpcbiAqICAgcHVibGljIG9uU3RhcnRVcCgpOiB2b2lkIHt9XG4gKlxuICogICBwdWJsaWMgb25TaHV0RG93bigpOiB2b2lkIHt9XG4gKiB9XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgbmV3IFNhbXBsZVBsdWdpbigpO1xuICogYGBgXG4gKi9cbmNsYXNzIFBsdWdpbjxUID0gdW5rbm93bj4gZXh0ZW5kcyBFbWl0dGVyPFQ+IGltcGxlbWVudHMgUGx1Z2luT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmlvcml0eSBvZiB0aGUgcGx1Z2luLlxuICAgKiBAbm90ZSBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJpb3JpdHk6IFBsdWdpblByaW9yaXR5ID0gUGx1Z2luUHJpb3JpdHkuTm9ybWFsO1xuXG4gIC8qKlxuICAgKiBUaGUgYmxvY2sgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYmxvY2tzID0gbmV3IFBsdWdpbkJsb2NrUmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIGl0ZW0gcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXRlbXMgPSBuZXcgUGx1Z2luSXRlbVJlZ2lzdHJ5KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgcmVnaXN0cnkgZm9yIHRoZSBwbHVnaW4uXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHlwZXMvdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW50aXRpZXMgPSBuZXcgUGx1Z2luRW50aXR5UmVnaXN0cnkoKTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBhY2tzIHByb3ZpZGVkIGJ5IHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzb3VyY2VzID0gbmV3IFNldDxSZXNvdXJjZVBhY2s+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IHVua25vd24gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGZpbGUgc3lzdGVtIGZvciB0aGUgcGx1Z2luLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgZmlsZVN5c3RlbSE6IFBsdWdpbkZpbGVTeXN0ZW07XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBvcHRpb25zIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogUGFydGlhbDxQbHVnaW5PcHRpb25zPlxuICApIHtcbiAgICAvLyBDYWxsIHRoZSBzdXBlciBtZXRob2Qgd2l0aCB0aGUgbWF4IGxpc3RlbmVyc1xuICAgIHN1cGVyKG9wdGlvbnM/Lm1heExpc3RlbmVycyk7XG5cbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgb3B0aW9ucz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIG9uIGluaXRpYWxpemUsIHN0YXJ0IHVwLCBhbmQgc2h1dCBkb3duIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucz8ub25Jbml0aWFsaXplKSB0aGlzLm9uSW5pdGlhbGl6ZSA9IG9wdGlvbnMub25Jbml0aWFsaXplO1xuICAgIGlmIChvcHRpb25zPy5vblN0YXJ0VXApIHRoaXMub25TdGFydFVwID0gb3B0aW9ucy5vblN0YXJ0VXA7XG4gICAgaWYgKG9wdGlvbnM/Lm9uU2h1dERvd24pIHRoaXMub25TaHV0RG93biA9IG9wdGlvbnMub25TaHV0RG93bjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcGx1Z2luIGJ5IGl0cyBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpbnN0YW5jZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIG51bGwuXG4gICAqL1xuICBwdWJsaWMgcmVzb2x2ZTxUIGV4dGVuZHMgUGx1Z2luPihpZGVudGlmaWVyOiBzdHJpbmcpOiBUIHwgbnVsbCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGlzIGRlZmluZWQuXG4gICAgaWYgKCF0aGlzLnBpcGVsaW5lKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIGZyb20gdGhlIHBpcGVsaW5lXG4gICAgY29uc3QgcGx1Z2luID0gdGhpcy5waXBlbGluZS5wbHVnaW5zLmdldChpZGVudGlmaWVyKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgZGVmaW5lZFxuICAgIGlmICghcGx1Z2luKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIFJldHVybiB0aGUgcGx1Z2luXG4gICAgcmV0dXJuIHBsdWdpbiBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzaHV0IGRvd24uXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBzaHV0IGRvd24uICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU2h1dERvd24oX3BsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGNvbmZpZyBmb3IgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIGRlZmluaXRpb24gVGhlIGNvbmZpZyBkZWZpbml0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmlnIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBkZWZpbmVDb25maWc8VD4oZGVmaW5pdGlvbjogVCk6IFQge1xuICAgIC8vIEFzc2lnbiB0aGUgdmFsdWVzIHRvIHRoZSBjb25maWcgb2JqZWN0XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZyBhcyBvYmplY3QsIGRlZmluaXRpb24pO1xuXG4gICAgLy8gUmV0dXJuIHRoZSBjb25maWcgb2JqZWN0XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnIGFzIFQ7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luLCBQbHVnaW5PcHRpb25zIH07XG4iLCAiaW1wb3J0IHsgdHlwZSBCbG9ja1RyYWl0LCBDdXN0b21CbG9ja1R5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBibG9jayB0cmFpdHMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBibG9jayB0eXBlIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21CbG9ja1R5cGU+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHlwZSB0byB0aGUgdHlwZXMgYXJyYXkuXG4gICAgdGhpcy50eXBlcy5wdXNoKC4uLnR5cGVzKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgY3VzdG9tIGJsb2NrIHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gYmxvY2sgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGJsb2NrIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJUeXBlKHR5cGU6IEN1c3RvbUJsb2NrVHlwZSk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0eXBlIGluIHRoZSB0eXBlcyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHlwZXMuaW5kZXhPZih0eXBlKTtcblxuICAgIC8vIElmIHRoZSBpbmRleCBpcyBub3QgLTEsIHJlbW92ZSB0aGUgdHlwZSBmcm9tIHRoZSB0eXBlc1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHlwZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgIC8vIFJldHVybiB0aGlzIGluc3RhbmNlLlxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGN1c3RvbSBibG9jayB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gYmxvY2sgdHJhaXQgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqIEBub3RlIE9ubHkgcmVnaXN0ZXIgdHJhaXRzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUcmFpdCguLi50cmFpdHM6IEFycmF5PHR5cGVvZiBCbG9ja1RyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gYmxvY2sgdHJhaXQuXG4gICAqIEBwYXJhbSB0cmFpdCBUaGUgY3VzdG9tIGJsb2NrIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gYmxvY2sgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgQmxvY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5CbG9ja1JlZ2lzdHJ5IH07XG4iLCAiaW1wb3J0IHsgdHlwZSBJdGVtU3RhY2tUcmFpdCwgQ3VzdG9tSXRlbVR5cGUgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5JdGVtUmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGl0ZW0gdHlwZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0eXBlczogQXJyYXk8Q3VzdG9tSXRlbVR5cGU+ID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpc3RlcmVkIGN1c3RvbSBpdGVtIHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEl0ZW1TdGFja1RyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21JdGVtVHlwZT4pOiB0aGlzIHtcbiAgICAvLyBQdXNoIHRoZSB0eXBlIHRvIHRoZSB0eXBlcyBhcnJheS5cbiAgICB0aGlzLnR5cGVzLnB1c2goLi4udHlwZXMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0eXBlLlxuICAgKiBAcGFyYW0gdHlwZSBUaGUgY3VzdG9tIGl0ZW0gdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGl0ZW0gcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclR5cGUodHlwZTogQ3VzdG9tSXRlbVR5cGUpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBpbiB0aGUgdHlwZXMgYXJyYXkuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnR5cGVzLmluZGV4T2YodHlwZSk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHR5cGUgZnJvbSB0aGUgdHlwZXNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnR5cGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gaXRlbSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gaXRlbSB0cmFpdCB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBpdGVtIHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHRyYWl0cyBkdXJpbmcgdGhlIGBvbkluaXRpYWxpemVgIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVHJhaXQoLi4udHJhaXRzOiBBcnJheTx0eXBlb2YgSXRlbVN0YWNrVHJhaXQ+KTogdGhpcyB7XG4gICAgLy8gUHVzaCB0aGUgdHJhaXQgdG8gdGhlIHRyYWl0cyBhcnJheS5cbiAgICB0aGlzLnRyYWl0cy5wdXNoKC4uLnRyYWl0cyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBpdGVtIHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBpdGVtIHRyYWl0IHRvIHVucmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gaXRlbSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHJhaXQodHJhaXQ6IHR5cGVvZiBJdGVtU3RhY2tUcmFpdCk6IHRoaXMge1xuICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIHRoZSB0cmFpdCBpbiB0aGUgdHJhaXRzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFpdHMuaW5kZXhPZih0cmFpdCk7XG5cbiAgICAvLyBJZiB0aGUgaW5kZXggaXMgbm90IC0xLCByZW1vdmUgdGhlIHRyYWl0IGZyb20gdGhlIHRyYWl0c1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRoaXMudHJhaXRzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW5JdGVtUmVnaXN0cnkgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEVudGl0eVRyYWl0LCBDdXN0b21FbnRpdHlUeXBlIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luRW50aXR5UmVnaXN0cnkge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdGVyZWQgY3VzdG9tIGVudGl0eSB0eXBlcyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0ZXJlZCBjdXN0b20gZW50aXR5IHRyYWl0cyBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0PiA9IFtdO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHR5cGUuXG4gICAqIEBwYXJhbSB0eXBlIFRoZSBjdXN0b20gZW50aXR5IHR5cGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwbHVnaW4gZW50aXR5IHJlZ2lzdHJ5LlxuICAgKiBAbm90ZSBPbmx5IHJlZ2lzdGVyIHR5cGVzIGR1cmluZyB0aGUgYG9uSW5pdGlhbGl6ZWAgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJUeXBlKC4uLnR5cGVzOiBBcnJheTxDdXN0b21FbnRpdHlUeXBlPik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHR5cGUgdG8gdGhlIHR5cGVzIGFycmF5LlxuICAgIHRoaXMudHlwZXMucHVzaCguLi50eXBlcyk7XG5cbiAgICAvLyBSZXR1cm4gdGhpcyBpbnN0YW5jZS5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBlbnRpdHkgdHlwZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIGN1c3RvbSBlbnRpdHkgdHlwZSB0byB1bnJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICovXG4gIHB1YmxpYyB1bnJlZ2lzdGVyVHlwZSh0eXBlOiBDdXN0b21FbnRpdHlUeXBlKTogdGhpcyB7XG4gICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIHR5cGUgaW4gdGhlIHR5cGVzIGFycmF5LlxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50eXBlcy5pbmRleE9mKHR5cGUpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0eXBlIGZyb20gdGhlIHR5cGVzXG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhpcy50eXBlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGVudGl0eSB0cmFpdC5cbiAgICogQHBhcmFtIHRyYWl0IFRoZSBjdXN0b20gZW50aXR5IHRyYWl0IHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGVudGl0eSByZWdpc3RyeS5cbiAgICogQG5vdGUgT25seSByZWdpc3RlciB0cmFpdHMgZHVyaW5nIHRoZSBgb25Jbml0aWFsaXplYCBldmVudC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclRyYWl0KC4uLnRyYWl0czogQXJyYXk8dHlwZW9mIEVudGl0eVRyYWl0Pik6IHRoaXMge1xuICAgIC8vIFB1c2ggdGhlIHRyYWl0IHRvIHRoZSB0cmFpdHMgYXJyYXkuXG4gICAgdGhpcy50cmFpdHMucHVzaCguLi50cmFpdHMpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSBjdXN0b20gZW50aXR5IHRyYWl0LlxuICAgKiBAcGFyYW0gdHJhaXQgVGhlIGN1c3RvbSBlbnRpdHkgdHJhaXQgdG8gdW5yZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBlbnRpdHkgcmVnaXN0cnkuXG4gICAqL1xuICBwdWJsaWMgdW5yZWdpc3RlclRyYWl0KHRyYWl0OiB0eXBlb2YgRW50aXR5VHJhaXQpOiB0aGlzIHtcbiAgICAvLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgdHJhaXQgaW4gdGhlIHRyYWl0cyBhcnJheS5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhaXRzLmluZGV4T2YodHJhaXQpO1xuXG4gICAgLy8gSWYgdGhlIGluZGV4IGlzIG5vdCAtMSwgcmVtb3ZlIHRoZSB0cmFpdCBmcm9tIHRoZSB0cmFpdHNcbiAgICBpZiAoaW5kZXggIT09IC0xKSB0aGlzLnRyYWl0cy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gUmV0dXJuIHRoaXMgaW5zdGFuY2UuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGx1Z2luRW50aXR5UmVnaXN0cnkgfTtcbiJdLAogICJtYXBwaW5ncyI6ICJvVUFDQSxPQUNFQSxjQUFBQSxFQUNBQyxhQUFBQSxFQUNBQyxlQUFBQSxFQUNBQyxnQkFBQUEsRUFDQUMsY0FBQUEsRUFDQUMsaUJBQUFBLE1BQ0ssVUFDUCxPQUFTQyxZQUFBQSxFQUFVQyxXQUFBQSxNQUFlLFlBQ2xDLE9BQVNDLGVBQUFBLEVBQWFDLGVBQUFBLE1BQW1CLFlBRXpDLE9BQVNDLFVBQUFBLEdBQVFDLGdCQUFBQSxPQUFvQixxQkFDckMsT0FBbUJDLGVBQUFBLEVBQWFDLGNBQUFBLE1BQWtCLG1CQUNsRCxPQUFTQyxnQkFBQUEsTUFBb0IsMkJDZDdCLE9BQVNDLFlBQUFBLE1BQWdCLE9DQXpCLE9BQVNDLGNBQUFBLE1BQWtCLG1CQUUzQixJQUFNQyxFQUFOLGNBQTBCQyxDQUFBQSxDQUYxQixNQUUwQkEsQ0FBQUEsRUFBQUEsb0JBQ3hCLE9BQXVCQyxXQUFhLFVBQ3BDLE9BQXVCQyxRQUF5QixDQUFBLENBQ2xELEVBRU1DLEVBQU4sY0FBZ0NILENBQUFBLENBUGhDLE1BT2dDQSxDQUFBQSxFQUFBQSwwQkFDOUIsT0FBdUJDLFdBQWEsaUJBQ3BDLE9BQXVCQyxRQUF5QixDQUFDLE9BQVEsU0FBVSxTQUNyRSxFREZBLElBQU1FLEVBQVdDLEVBQUEsQ0FBQ0MsRUFBY0MsSUFBQUEsQ0FDOUJELEVB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QixDQU1PSixhQUFhTyxFQUF1QixDQUUzQyxDQU1PTixVQUFVTSxFQUF1QixDQUV4QyxDQU1PTCxXQUFXSyxFQUF1QixDQUV6QyxDQU9PQyxhQUFnQkMsRUFBa0IsQ0FFdkNDLGNBQU9DLE9BQU8sS0FBS3RCLE9BQWtCb0IsQ0FBQUEsRUFHOUIsS0FBS3BCLE1BQ2QsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJyZWxhdGl2ZSIsICJDdXN0b21FbnVtIiwgIlBsdWdpbnNFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJwaXBlbGluZSIsICJjb21tYW5kUGFsZXR0ZSIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9ucyIsICJvdmVybG9hZCIsICJhY3Rpb24iLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVzdWx0IiwgInBsdWdpbnMiLCAic2l6ZSIsICJtZXNzYWdlIiwgInZhbHVlcyIsICJwbHVnaW4iLCAicHVzaCIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibGVuZ3RoIiwgImpvaW4iLCAiUGx1Z2luc0VudW0iLCAicGx1Z2luSW5zdGFuY2UiLCAiZ2V0IiwgIkVycm9yIiwgInJlbG9hZCIsICJpc0J1bmRsZWQiLCAiYnVuZGxlIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgInBhdGgiLCAiY29tbWFuZF9kZWZhdWx0IiwgIlBsdWdpbkhlYWRlciIsICJQbHVnaW5Qcmlvcml0eSIsICJQbHVnaW5UeXBlIiwgImV4aXN0c1N5bmMiLCAicmVhZEZpbGVTeW5jIiwgIm1rZGlyU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJtU3luYyIsICJyZWFkZGlyU3luYyIsICJyZXNvbHZlIiwgInNlcCIsICJpc0Fic29sdXRlIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAiZGF0YVBhdGgiLCAibG9nZ2VyIiwgInZhbGlkYXRlUGF0aCIsICJwYXRoIiwgImV4cGVjdGVkVHlwZSIsICJpc0Fic29sdXRlIiwgIndhcm4iLCAic3RhcnRzV2l0aCIsICJzZXAiLCAiaGFzRXh0ZW5zaW9uIiwgInRlc3QiLCAicmVhZEZpbGUiLCAiZW5jb2RpbmciLCAiZXhpc3RzU3luYyIsICJmdWxsUGF0aCIsICJyZXNvbHZlIiwgInJlYWRGaWxlU3luYyIsICJ3cml0ZUZpbGUiLCAiZGF0YSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImRpclBhdGgiLCAic3Vic3RyaW5nIiwgImxhc3RJbmRleE9mIiwgIndyaXRlRmlsZVN5bmMiLCAicmVtb3ZlRmlsZSIsICJybVN5bmMiLCAibWtkaXIiLCAicm1kaXIiLCAib3B0aW9ucyIsICJmb3JjZSIsICJyZWFkRGlyIiwgInJlYWRkaXJTeW5jIiwgImV4aXN0cyIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiaW5pdGlhbGl6ZSIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIk1hdGVyaWFsTGFwaXMiLCAicGx1Z2lucyIsICJNYXAiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJwbHVnaW4iLCAiYmxvY2tQYWxldHRlIiwgInJlZ2lzdGVyVHlwZSIsICJibG9ja3MiLCAidHlwZXMiLCAicmVnaXN0ZXJUcmFpdCIsICJ0cmFpdHMiLCAiaXRlbVBhbGV0dGUiLCAiaXRlbXMiLCAiZW50aXR5UGFsZXR0ZSIsICJlbnRpdGllcyIsICJleGlzdHNTeW5jIiwgInJlc29sdmUiLCAibWtkaXJTeW5jIiwgInJlY3Vyc2l2ZSIsICJidW5kbGVzIiwgInJlYWRkaXJTeW5jIiwgIndpdGhGaWxlVHlwZXMiLCAiZmlsdGVyIiwgImRpcmVudCIsICJpc0RpcmVjdG9yeSIsICJuYW1lIiwgImlzRmlsZSIsICJlbmRzV2l0aCIsICJvcmRlcmVkUGx1Z2lucyIsICJidW5kbGUiLCAiYnVmZmVyIiwgImluZmxhdGVTeW5jIiwgInJlYWRGaWxlU3luYyIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInJlYWRCeXRlIiwgInR5cGUiLCAiUGx1Z2luSGVhZGVyIiwgIkhhc05vUmVzb3VyY2VzIiwgImxlbmd0aCIsICJyZWFkVmFySW50IiwgImluZGV4IiwgInJlYWRCdWZmZXIiLCAidG9TdHJpbmciLCAibG9hZEZyb21UZXh0U291cmNlIiwgInB1c2giLCAiSGFzUmVzb3VyY2VzIiwgInJlc291cmNlcyIsICJpIiwgInJlc291cmNlIiwgImxvYWRGcm9tWmlwIiwgInN1Y2Nlc3MiLCAidXVpZCIsICJhZGQiLCAicmVhc29uIiwgImVycm9yIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImlkZW50aWZpZXIiLCAiUGx1Z2luVHlwZSIsICJBZGRvbiIsICJ3YXJuIiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAiQXBpIiwgImRpcmVjdG9yaWVzIiwgImRpcmVjdG9yeSIsICJtYW5pZmVzdCIsICJKU09OIiwgInBhcnNlIiwgIm1haW4iLCAidmVyc2lvbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiaGFzIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJmaWxlU3lzdGVtIiwgIlBsdWdpbkZpbGVTeXN0ZW0iLCAibGlua01vZHVsZSIsICJzZXQiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwYWNrIiwgImxvYWRGcm9tUGF0aCIsICJzb3J0IiwgImEiLCAiYiIsICJwcmlvcml0eSIsICJPYmplY3QiLCAia2V5cyIsICJjb25maWciLCAid3JpdGVGaWxlU3luYyIsICJzdHJpbmdpZnkiLCAiZGF0YSIsICJhc3NpZ24iLCAib25Jbml0aWFsaXplIiwgImJpbmRFdmVudHMiLCAidGVtcCIsICJzbGljZSIsICJyZXBsYWNlIiwgIm5leHRUaWNrIiwgInVubGlua1N5bmMiLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInNvdXJjZSIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAicGFja3MiLCAibmV3UGx1Z2luIiwgImhlYWRlciIsICJzaXplIiwgIndyaXRlQnl0ZSIsICJ3cml0ZVZhckludCIsICJieXRlTGVuZ3RoIiwgIndyaXRlQnVmZmVyIiwgImRlZmxhdGVTeW5jIiwgImdldEJ1ZmZlciIsICJjb21wcmVzcyIsICJwcm90b3R5cGUiLCAiZ2V0UHJvdG90eXBlT2YiLCAicGx1Z2luS2V5cyIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImV2ZW50S2V5cyIsICJldmVudEtleSIsICJpbmRleE9mIiwgImluY2x1ZGVzIiwgInZhbHVlIiwgImJlZm9yZSIsICJhZnRlciIsICJ2ZXJzaW9ucyIsICJidW4iLCAidW5kZWZpbmVkIiwgIkJ1biIsICJzZXR1cCIsICJidWlsZGVyIiwgImxvYWRlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkVtaXR0ZXIiLCAiUGx1Z2luQmxvY2tSZWdpc3RyeSIsICJ0eXBlcyIsICJ0cmFpdHMiLCAicmVnaXN0ZXJUeXBlIiwgInB1c2giLCAidW5yZWdpc3RlclR5cGUiLCAidHlwZSIsICJpbmRleCIsICJpbmRleE9mIiwgInNwbGljZSIsICJyZWdpc3RlclRyYWl0IiwgInVucmVnaXN0ZXJUcmFpdCIsICJ0cmFpdCIsICJQbHVnaW5JdGVtUmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luRW50aXR5UmVnaXN0cnkiLCAidHlwZXMiLCAidHJhaXRzIiwgInJlZ2lzdGVyVHlwZSIsICJwdXNoIiwgInVucmVnaXN0ZXJUeXBlIiwgInR5cGUiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJzcGxpY2UiLCAicmVnaXN0ZXJUcmFpdCIsICJ1bnJlZ2lzdGVyVHJhaXQiLCAidHJhaXQiLCAiUGx1Z2luIiwgIkVtaXR0ZXIiLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJwcmlvcml0eSIsICJQbHVnaW5Qcmlvcml0eSIsICJOb3JtYWwiLCAiYmxvY2tzIiwgIlBsdWdpbkJsb2NrUmVnaXN0cnkiLCAiaXRlbXMiLCAiUGx1Z2luSXRlbVJlZ2lzdHJ5IiwgImVudGl0aWVzIiwgIlBsdWdpbkVudGl0eVJlZ2lzdHJ5IiwgInJlc291cmNlcyIsICJTZXQiLCAiY29uZmlnIiwgImZpbGVTeXN0ZW0iLCAicGF0aCIsICJpc0J1bmRsZWQiLCAicGlwZWxpbmUiLCAic2VyZW5pdHkiLCAib3B0aW9ucyIsICJtYXhMaXN0ZW5lcnMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZXNvbHZlIiwgInBsdWdpbiIsICJwbHVnaW5zIiwgImdldCIsICJfcGx1Z2luIiwgImRlZmluZUNvbmZpZyIsICJkZWZpbml0aW9uIiwgIk9iamVjdCIsICJhc3NpZ24iXQp9Cg==
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@serenityjs/plugins",
3
3
  "author": "Serenity",
4
4
  "license": "MIT",
5
- "version": "0.8.17",
5
+ "version": "0.8.18-beta-20260205000321",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
8
8
  "types": "./dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  "typecheck": "tsc --noEmit"
21
21
  },
22
22
  "devDependencies": {
23
- "@serenityjs/internal-config": "*",
23
+ "@serenityjs/internal-config": "0.8.18-beta-20260205000321",
24
24
  "@swc/core": "1.7.42",
25
25
  "@types/node": "22.8.6",
26
26
  "eslint": "9.13.0",
@@ -29,9 +29,9 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@serenityjs/binarystream": "2.7.3",
32
- "@serenityjs/core": "*",
33
- "@serenityjs/emitter": "*",
34
- "@serenityjs/logger": "*",
35
- "@serenityjs/protocol": "*"
32
+ "@serenityjs/core": "0.8.18-beta-20260205000321",
33
+ "@serenityjs/emitter": "0.8.18-beta-20260205000321",
34
+ "@serenityjs/logger": "0.8.18-beta-20260205000321",
35
+ "@serenityjs/protocol": "0.8.18-beta-20260205000321"
36
36
  }
37
37
  }