@serenityjs/plugins 0.6.1-beta-20241119163501 → 0.6.1

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/CHANGELOG.md CHANGED
@@ -1,15 +1,15 @@
1
1
  # @serenityjs/plugins
2
2
 
3
- ## 0.6.1-beta-20241119163501
3
+ ## 0.6.1
4
4
 
5
5
  ### Patch Changes
6
6
 
7
7
  - [`5994a69`](https://github.com/SerenityJS/serenity/commit/5994a699c705402ae044c262588c1668e876a972) Thanks [@PMK744](https://github.com/PMK744)! - init v0.6.1-beta
8
8
 
9
9
  - Updated dependencies [[`5994a69`](https://github.com/SerenityJS/serenity/commit/5994a699c705402ae044c262588c1668e876a972)]:
10
- - @serenityjs/protocol@0.6.1-beta-20241119163501
11
- - @serenityjs/logger@0.6.1-beta-20241119163501
12
- - @serenityjs/core@0.6.1-beta-20241119163501
10
+ - @serenityjs/protocol@0.6.1
11
+ - @serenityjs/logger@0.6.1
12
+ - @serenityjs/core@0.6.1
13
13
 
14
14
  ## 0.6.0
15
15
 
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var S=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var d=(a,e)=>S(a,"name",{value:e,configurable:!0});var q=(a,e)=>{for(var r in e)S(a,r,{get:e[r],enumerable:!0})},_=(a,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of C(e))!L.call(a,n)&&n!==r&&S(a,n,{get:()=>e[n],enumerable:!(i=F(e,n))||i.enumerable});return a};var j=a=>_(S({},"__esModule",{value:!0}),a);var N={};q(N,{DefaultPipelineProperties:()=>D,Pipeline:()=>T,Plugin:()=>P,PluginType:()=>h});module.exports=j(N);var o=require("fs"),t=require("path"),w=require("zlib"),v=require("child_process"),b=require("@serenityjs/logger"),y=require("@serenityjs/core"),z=require("@serenityjs/binarystream");var $=require("@serenityjs/logger");var h=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(h||{});var P=class{static{d(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,r,i){this.identifier=e,this.version=r,this.logger=i?.logger??new $.Logger(`${e}@${r}`,$.LoggerColors.Blue),this.type=i?.type??h.Addon,i?.onInitialize&&(this.onInitialize=i.onInitialize),i?.onStartUp&&(this.onStartUp=i.onStartUp),i?.onShutDown&&(this.onShutDown=i.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};var U=require("path"),k=require("@serenityjs/protocol");var E=require("@serenityjs/core");var g=class extends E.CustomEnum{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},A=class extends E.CustomEnum{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=d((a,e)=>{a.commands.register("plugins","Interact with the plugins of the server",r=>{r.permissionLevel=k.CommandPermissionLevel.Operator,r.overload({action:A},({action:i})=>{if(i.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],s=[];for(let l of n)s.push(`\xA7u${l.identifier} v${l.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${s.join("\xA77,\xA7r ")}`}}),r.overload({action:A,plugin:g},({action:i,plugin:n})=>{if(i.result!=="reload"&&i.result!=="bundle")return;let s=e.plugins.get(n.result);if(!s)throw new Error(`Plugin ${n.result} is not found.`);if(i.result==="reload")return e.reload(s),{message:`\xA7aSuccessfully reloaded \xA72${s.identifier}\xA7a.`};if(s.isBundled)throw new Error(`Plugin ${s.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(s),{message:`\xA7aSuccessfully bundled \xA72${s.identifier}\xA7a, output file was placed at \xA77${(0,U.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),I=W;var D={path:"./plugins",commands:!0},T=class{static{d(this,"Pipeline")}serenity;properties;logger=new b.Logger("Plugins",b.LoggerColors.CyanBright);plugins=new Map;tempPaths=new Set;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,r){this.serenity=e,this.properties={...D,...r},e.on(y.ServerEvent.Start,this.start.bind(this)),e.on(y.ServerEvent.Stop,this.stop.bind(this)),this.properties.commands&&e.on(y.WorldEvent.WorldInitialize,({world:i})=>I(i,this))}initialize(e){(0,o.existsSync)((0,t.resolve)(this.path))||(0,o.mkdirSync)((0,t.resolve)(this.path),{recursive:!0});let i=(0,o.readdirSync)((0,t.resolve)(this.path),{withFileTypes:!0}).filter(s=>s.isFile()?s.name.endsWith(".plugin"):!1);for(let s of i)try{let l=(0,t.resolve)(this.path,s.name),m=(0,w.inflateSync)((0,o.readFileSync)(l)),c=new z.BinaryStream(m),x=c.readByte();if(x===h.Addon){let p=c.readRemainingBuffer().toString("utf-8"),f=(0,t.resolve)(this.path,`~${s.name.slice(0,-7)}`);(0,o.writeFileSync)(f,p);let u=require(f).default;if(!(u instanceof P)){this.logger.warn(`Unable to load plugin from \xA78${(0,t.relative)(process.cwd(),l)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(u.identifier)){this.logger.warn(`Unable to load plugin \xA71${u.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}u.pipeline=this,u.serenity=this.serenity,u.path=l,u.isBundled=!0,this.plugins.set(u.identifier,u),u.onInitialize(u),g.options.push(u.identifier),this.tempPaths.add(f)}else if(x===h.Api){let p=c.readRemainingBuffer();(0,o.unlinkSync)(l);let f=(0,t.resolve)(this.path,`~${s.name.slice(0,-7)}`);(0,o.writeFileSync)(f,p),(0,v.execSync)(`tar -xzf ${f} -C ${this.path}`,{stdio:"ignore"}),(0,o.unlinkSync)(f);let B=s.name.slice(0,-7);(0,o.renameSync)((0,t.resolve)(this.path,"package"),(0,t.resolve)(this.path,`${B}.api`)),(0,v.execSync)("npm install",{cwd:(0,t.resolve)(this.path,`${B}.api`),stdio:"ignore"})}}catch(l){this.logger.error(`Failed to load plugin from "${(0,t.relative)(process.cwd(),(0,t.resolve)(this.path,s.name))}", skipping the plugin.`,l)}let n=(0,o.readdirSync)((0,t.resolve)(this.path),{withFileTypes:!0}).filter(s=>s.isDirectory());for(let s of n)try{let l=(0,t.resolve)(this.path,s.name);if(!(0,o.existsSync)((0,t.resolve)(l,"package.json")))continue;let m=JSON.parse((0,o.readFileSync)((0,t.resolve)(l,"package.json"),"utf-8")),c=(0,t.resolve)(l,m.main);if(!(0,o.existsSync)((0,t.resolve)(l,c))){this.logger.warn(`Unable to load plugin \xA71${m.name}\xA78@\xA71${m.version}\xA7r, the main entry path "\xA78${(0,t.relative)(process.cwd(),(0,t.resolve)(l,c))}\xA7r" was not found in the directory.`);continue}let p=require((0,t.resolve)(l,c)).default;if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=l,p.isBundled=!1,this.plugins.set(p.identifier,p),g.options.push(p.identifier),p.onInitialize(p)}catch(l){this.logger.error(`Failed to load plugin from "${(0,t.relative)(process.cwd(),(0,t.resolve)(this.path,s.name))}", skipping the plugin.`,l)}return e()}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)(0,o.unlinkSync)(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let r=e.path;delete require.cache[require.resolve(r)],this.serenity.removePath(r);try{let n=require(r).default;if(!(n instanceof P)){this.logger.warn(`Unable to reload plugin from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r, the plugin is not an instance of the Plugin class.`);return}n.pipeline=this,n.serenity=this.serenity,n.path=r,this.plugins.set(n.identifier,n),n.onInitialize(n),n.onStartUp(n),this.logger.info(`Successfully reloaded plugin \xA71${n.identifier}\xA7r from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r.`)}catch(i){this.logger.warn(`Failed to reload plugin from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r, skipping the plugin.`,i)}}bundle(e){let r=new z.BinaryStream;if(r.writeByte(e.type),e.type===h.Addon){let i=(0,t.resolve)(e.path,"dist"),n=(0,o.readFileSync)((0,t.resolve)(i,"index.js"));r.writeBuffer(n),(0,o.writeFileSync)((0,t.resolve)(this.path,`${e.identifier}.plugin`),(0,w.deflateSync)(r.getBuffer()))}else if(e.type===h.Api){(0,v.execSync)("npm pack",{cwd:e.path,stdio:"ignore"});let i=(0,o.readdirSync)(e.path).find(s=>s.endsWith(".tgz"));if(!i)throw new Error("Packed tarball not found.");let n=(0,o.readFileSync)((0,t.resolve)(e.path,i));(0,o.unlinkSync)((0,t.resolve)(e.path,i)),r.writeBuffer(n),(0,o.writeFileSync)((0,t.resolve)(this.path,`${e.identifier}.plugin`),(0,w.deflateSync)(r.getBuffer()))}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICAgICAgaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYH4ke2J1bmRsZS5uYW1lLnNsaWNlKDAsIC03KX1gKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMoXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYCksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjb21wbGV0ZSBjYWxsYmFja1xuICAgIHJldHVybiBjb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBEZWxldGUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXNcbiAgICBmb3IgKGNvbnN0IHRlbXBQYXRoIG9mIHRoaXMudGVtcFBhdGhzKSB7XG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIER5bmFtaWMgZGVsZXRlIGlzIHJlcXVpcmVkIGhlcmVcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcblxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcblxuaW50ZXJmYWNlIFBsdWdpblByb3BlcnRpZXMge1xuICBsb2dnZXI6IExvZ2dlcjtcbiAgdHlwZTogUGx1Z2luVHlwZTtcbiAgb25Jbml0aWFsaXplOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU3RhcnRVcDogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblNodXREb3duOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG59XG5cbmNsYXNzIFBsdWdpbiB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGx1Z2luVHlwZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBsdWdpblByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBwcm9wZXJ0aWVzPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gcHJvcGVydGllcz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBwcm9wZXJ0aWVzLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAocHJvcGVydGllcz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IHByb3BlcnRpZXMub25TdGFydFVwO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBwcm9wZXJ0aWVzLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luUHJvcGVydGllcyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iXSwKICAibWFwcGluZ3MiOiAiNGRBQUEsSUFBQUEsRUFBQSxHQUFBQyxFQUFBRCxFQUFBLCtCQUFBRSxFQUFBLGFBQUFDLEVBQUEsV0FBQUMsRUFBQSxlQUFBQyxJQUFBLGVBQUFDLEVBQUFOLEdDQ0EsSUFBQU8sRUFRTyxjQUNQQyxFQUFrQyxnQkFDbENDLEVBQXlDLGdCQUN6Q0MsRUFBeUIseUJBRXpCQyxFQUFxQyw4QkFDckNDLEVBQWtELDRCQUNsREMsRUFBNkIsb0NDZjdCLElBQUFDLEVBQXFDLDhCQ0VyQyxJQUFLQyxFQUFBQSxTQUFBQSxFQUFBQSxDQUdGLE9BQUFBLEVBQUFBLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFLQUEsRUFBQUEsRUFBQSxJQUFBLENBQUEsRUFBQSxNQVJFQSxHQUFBQSxHQUFBQSxDQUFBQSxDQUFBQSxFRFdMLElBQU1DLEVBQU4sS0FBTUEsQ0FiTixNQWFNQSxDQUFBQSxFQUFBQSxlQUlZQyxXQUtBQyxRQUtBQyxPQUtBQyxLQU1UQyxLQU1BQyxVQU1BQyxTQU1BQyxTQVFQLFlBQ0VQLEVBQ0FDLEVBQ0FPLEVBQ0EsQ0FFQSxLQUFLUixXQUFhQSxFQUNsQixLQUFLQyxRQUFVQSxFQUdmLEtBQUtDLE9BQ0hNLEdBQVlOLFFBQ1osSUFBSU8sU0FBTyxHQUFHVCxDQUFBQSxJQUFjQyxDQUFBQSxHQUFXUyxl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QUFLLElBRXpDRSxZQUFTLFdBQVksQ0FBRWIsSUFBS1AsRUFBTzNELEtBQU1nRixNQUFPLFFBQVMsQ0FBQSxFQUd6RCxJQUFNMEIsS0FBVXRFLGVBQVl1QixFQUFPM0QsSUFBSSxFQUFFMkcsS0FBTUMsR0FDN0NBLEVBQUtsRSxTQUFTLE1BQUEsQ0FBQSxFQUloQixHQUFJLENBQUNnRSxFQUFTLE1BQU0sSUFBSXpGLE1BQU0sMkJBQUEsRUFHOUIsSUFBTTJCLEtBQVNFLG1CQUFhZCxXQUFRMkIsRUFBTzNELEtBQU0wRyxDQUFBQSxDQUFBQSxLQUdqRDVCLGlCQUFXOUMsV0FBUTJCLEVBQU8zRCxLQUFNMEcsQ0FBQUEsQ0FBQUEsRUFHaEMzRCxFQUFPd0QsWUFBWTNELENBQUFBLEtBR25CYyxvQkFDRTFCLFdBQVEsS0FBS2hDLEtBQU0sR0FBRzJELEVBQU9TLFVBQVUsU0FBUyxLQUNoRG9DLGVBQVl6RCxFQUFPMEQsVUFBUyxDQUFBLENBQUEsQ0FFaEMsQ0FDRixDQUNGIiwKICAibmFtZXMiOiBbInNyY19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAiUGlwZWxpbmUiLCAiUGx1Z2luIiwgIlBsdWdpblR5cGUiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9ub2RlX2ZzIiwgImltcG9ydF9ub2RlX3BhdGgiLCAiaW1wb3J0X25vZGVfemxpYiIsICJpbXBvcnRfbm9kZV9jaGlsZF9wcm9jZXNzIiwgImltcG9ydF9sb2dnZXIiLCAiaW1wb3J0X2NvcmUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJpbXBvcnRfbG9nZ2VyIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgImltcG9ydF9wYXRoIiwgImltcG9ydF9wcm90b2NvbCIsICJpbXBvcnRfY29yZSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJpbml0aWFsaXplIiwgImNvbXBsZXRlIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImluZGV4IiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidG9TdHJpbmciLCAidGVtcFBhdGgiLCAic2xpY2UiLCAid3JpdGVGaWxlU3luYyIsICJwbHVnaW4iLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInVubGlua1N5bmMiLCAiZXhlY1N5bmMiLCAic3RkaW8iLCAicmVuYW1lU3luYyIsICJyZWFzb24iLCAiZXJyb3IiLCAiZGlyZWN0b3JpZXMiLCAiaXNEaXJlY3RvcnkiLCAiZGlyZWN0b3J5IiwgIm1hbmlmZXN0IiwgIkpTT04iLCAicGFyc2UiLCAibWFpbiIsICJ2ZXJzaW9uIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
1
+ "use strict";var S=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var d=(a,e)=>S(a,"name",{value:e,configurable:!0});var q=(a,e)=>{for(var r in e)S(a,r,{get:e[r],enumerable:!0})},_=(a,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of C(e))!L.call(a,n)&&n!==r&&S(a,n,{get:()=>e[n],enumerable:!(i=F(e,n))||i.enumerable});return a};var j=a=>_(S({},"__esModule",{value:!0}),a);var N={};q(N,{DefaultPipelineProperties:()=>D,Pipeline:()=>T,Plugin:()=>P,PluginType:()=>h});module.exports=j(N);var o=require("fs"),t=require("path"),w=require("zlib"),v=require("child_process"),b=require("@serenityjs/logger"),y=require("@serenityjs/core"),z=require("@serenityjs/binarystream");var $=require("@serenityjs/logger");var h=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(h||{});var P=class{static{d(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,r,i){this.identifier=e,this.version=r,this.logger=i?.logger??new $.Logger(`${e}@${r}`,$.LoggerColors.Blue),this.type=i?.type??h.Addon,i?.onInitialize&&(this.onInitialize=i.onInitialize),i?.onStartUp&&(this.onStartUp=i.onStartUp),i?.onShutDown&&(this.onShutDown=i.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};var U=require("path"),k=require("@serenityjs/protocol");var E=require("@serenityjs/core");var g=class extends E.CustomEnum{static{d(this,"PluginsEnum")}static identifier="plugins";static options=[]},A=class extends E.CustomEnum{static{d(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var W=d((a,e)=>{a.commands.register("plugins","Interact with the plugins of the server",r=>{r.permissionLevel=k.CommandPermissionLevel.Operator,r.overload({action:A},({action:i})=>{if(i.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let n=[...e.plugins.values()],s=[];for(let l of n)s.push(`\xA7u${l.identifier} v${l.version}\xA7r`);return{message:`\xA77Active Plugins (${n.length}):\xA7r ${s.join("\xA77,\xA7r ")}`}}),r.overload({action:A,plugin:g},({action:i,plugin:n})=>{if(i.result!=="reload"&&i.result!=="bundle")return;let s=e.plugins.get(n.result);if(!s)throw new Error(`Plugin ${n.result} is not found.`);if(i.result==="reload")return e.reload(s),{message:`\xA7aSuccessfully reloaded \xA72${s.identifier}\xA7a.`};if(s.isBundled)throw new Error(`Plugin ${s.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(s),{message:`\xA7aSuccessfully bundled \xA72${s.identifier}\xA7a, output file was placed at \xA77${(0,U.relative)(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),I=W;var D={path:"./plugins",commands:!0},T=class{static{d(this,"Pipeline")}serenity;properties;logger=new b.Logger("Plugins",b.LoggerColors.CyanBright);plugins=new Map;tempPaths=new Set;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,r){this.serenity=e,this.properties={...D,...r},e.on(y.ServerEvent.Start,this.start.bind(this)),e.on(y.ServerEvent.Stop,this.stop.bind(this)),this.properties.commands&&e.on(y.WorldEvent.WorldInitialize,({world:i})=>I(i,this))}initialize(e){(0,o.existsSync)((0,t.resolve)(this.path))||(0,o.mkdirSync)((0,t.resolve)(this.path),{recursive:!0});let i=(0,o.readdirSync)((0,t.resolve)(this.path),{withFileTypes:!0}).filter(s=>s.isFile()?s.name.endsWith(".plugin"):!1);for(let s of i)try{let l=(0,t.resolve)(this.path,s.name),m=(0,w.inflateSync)((0,o.readFileSync)(l)),c=new z.BinaryStream(m),x=c.readByte();if(x===h.Addon){let p=c.readRemainingBuffer().toString("utf-8"),f=(0,t.resolve)(this.path,`~${s.name.slice(0,-7)}`);(0,o.writeFileSync)(f,p);let u=require(f).default;if(!(u instanceof P)){this.logger.warn(`Unable to load plugin from \xA78${(0,t.relative)(process.cwd(),l)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(u.identifier)){this.logger.warn(`Unable to load plugin \xA71${u.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}u.pipeline=this,u.serenity=this.serenity,u.path=l,u.isBundled=!0,this.plugins.set(u.identifier,u),u.onInitialize(u),g.options.push(u.identifier),this.tempPaths.add(f)}else if(x===h.Api){let p=c.readRemainingBuffer();(0,o.unlinkSync)(l);let f=(0,t.resolve)(this.path,`~${s.name.slice(0,-7)}`);(0,o.writeFileSync)(f,p),(0,v.execSync)(`tar -xzf ${f} -C ${this.path}`,{stdio:"ignore"}),(0,o.unlinkSync)(f);let B=s.name.slice(0,-7);(0,o.renameSync)((0,t.resolve)(this.path,"package"),(0,t.resolve)(this.path,`${B}.api`)),(0,v.execSync)("npm install",{cwd:(0,t.resolve)(this.path,`${B}.api`),stdio:"ignore"})}}catch(l){this.logger.error(`Failed to load plugin from "${(0,t.relative)(process.cwd(),(0,t.resolve)(this.path,s.name))}", skipping the plugin.`,l)}let n=(0,o.readdirSync)((0,t.resolve)(this.path),{withFileTypes:!0}).filter(s=>s.isDirectory());for(let s of n)try{let l=(0,t.resolve)(this.path,s.name);if(!(0,o.existsSync)((0,t.resolve)(l,"package.json")))continue;let m=JSON.parse((0,o.readFileSync)((0,t.resolve)(l,"package.json"),"utf-8")),c=(0,t.resolve)(l,m.main);if(!(0,o.existsSync)((0,t.resolve)(l,c))){this.logger.warn(`Unable to load plugin \xA71${m.name}\xA78@\xA71${m.version}\xA7r, the main entry path "\xA78${(0,t.relative)(process.cwd(),(0,t.resolve)(l,c))}\xA7r" was not found in the directory.`);continue}let p=require((0,t.resolve)(l,c)).default;if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=l,p.isBundled=!1,this.plugins.set(p.identifier,p),g.options.push(p.identifier),p.onInitialize(p)}catch(l){this.logger.error(`Failed to load plugin from "${(0,t.relative)(process.cwd(),(0,t.resolve)(this.path,s.name))}", skipping the plugin.`,l)}return e()}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)(0,o.unlinkSync)(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let r=e.path;delete require.cache[require.resolve(r)],this.serenity.removePath(r);try{let n=require(r).default;if(!(n instanceof P)){this.logger.warn(`Unable to reload plugin from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r, the plugin is not an instance of the Plugin class.`);return}n.pipeline=this,n.serenity=this.serenity,n.path=r,this.plugins.set(n.identifier,n),n.onInitialize(n),n.onStartUp(n),this.logger.info(`Successfully reloaded plugin \xA71${n.identifier}\xA7r from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r.`)}catch(i){this.logger.error(`Failed to reload plugin from \xA78${(0,t.relative)(process.cwd(),r)}\xA7r, skipping the plugin.`,i)}}bundle(e){let r=new z.BinaryStream;if(r.writeByte(e.type),e.type===h.Addon){let i=(0,t.resolve)(e.path,"dist"),n=(0,o.readFileSync)((0,t.resolve)(i,"index.js"));r.writeBuffer(n),(0,o.writeFileSync)((0,t.resolve)(this.path,`${e.identifier}.plugin`),(0,w.deflateSync)(r.getBuffer()))}else if(e.type===h.Api){(0,v.execSync)("npm pack",{cwd:e.path,stdio:"ignore"});let i=(0,o.readdirSync)(e.path).find(s=>s.endsWith(".tgz"));if(!i)throw new Error("Packed tarball not found.");let n=(0,o.readFileSync)((0,t.resolve)(e.path,i));(0,o.unlinkSync)((0,t.resolve)(e.path,i)),r.writeBuffer(n),(0,o.writeFileSync)((0,t.resolve)(this.path,`${e.identifier}.plugin`),(0,w.deflateSync)(r.getBuffer()))}}};0&&(module.exports={DefaultPipelineProperties,Pipeline,Plugin,PluginType});
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9waXBlbGluZS50cyIsICIuLi9zcmMvcGx1Z2luLnRzIiwgIi4uL3NyYy9lbnVtcy90eXBlLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9jb21tYW5kLnRzIiwgIi4uL3NyYy9jb21tYW5kcy9lbnVtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwiLi9waXBlbGluZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGx1Z2luXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9lbnVtc1wiO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICAgICAgaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYH4ke2J1bmRsZS5uYW1lLnNsaWNlKDAsIC03KX1gKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMoXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYCksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjb21wbGV0ZSBjYWxsYmFja1xuICAgIHJldHVybiBjb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBEZWxldGUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXNcbiAgICBmb3IgKGNvbnN0IHRlbXBQYXRoIG9mIHRoaXMudGVtcFBhdGhzKSB7XG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIER5bmFtaWMgZGVsZXRlIGlzIHJlcXVpcmVkIGhlcmVcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcblxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgcGx1Z2luIHR5cGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbS53cml0ZUJ5dGUocGx1Z2luLnR5cGUpO1xuXG4gICAgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAvLyBHZXQgdGhlIGFkZG9uIHBhdGhcbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZVxuICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocmVzb2x2ZShpbnB1dFBhdGgsIFwiaW5kZXguanNcIikpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IHRvIHRoZSBzdHJlYW1cbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAvLyBQYWNrIHRoZSBwbHVnaW5cbiAgICAgIGV4ZWNTeW5jKFwibnBtIHBhY2tcIiwgeyBjd2Q6IHBsdWdpbi5wYXRoLCBzdGRpbzogXCJpZ25vcmVcIiB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB0YXJiYWxsIHBhdGhcbiAgICAgIGNvbnN0IHRhcmJhbGwgPSByZWFkZGlyU3luYyhwbHVnaW4ucGF0aCkuZmluZCgoZmlsZSkgPT5cbiAgICAgICAgZmlsZS5lbmRzV2l0aChcIi50Z3pcIilcbiAgICAgICk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGV4aXN0c1xuICAgICAgaWYgKCF0YXJiYWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQYWNrZWQgdGFyYmFsbCBub3QgZm91bmQuXCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG4gIG9uSW5pdGlhbGl6ZTogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblN0YXJ0VXA6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TaHV0RG93bjogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBQbHVnaW4ge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbHVnaW5Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgcHJvcGVydGllcz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IHByb3BlcnRpZXM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gcHJvcGVydGllc1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gcHJvcGVydGllcy5vbkluaXRpYWxpemU7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBwcm9wZXJ0aWVzLm9uU3RhcnRVcDtcbiAgICBpZiAocHJvcGVydGllcz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gcHJvcGVydGllcy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpblByb3BlcnRpZXMgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjRkQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSwrQkFBQUUsRUFBQSxhQUFBQyxFQUFBLFdBQUFDLEVBQUEsZUFBQUMsSUFBQSxlQUFBQyxFQUFBTixHQ0NBLElBQUFPLEVBUU8sY0FDUEMsRUFBa0MsZ0JBQ2xDQyxFQUF5QyxnQkFDekNDLEVBQXlCLHlCQUV6QkMsRUFBcUMsOEJBQ3JDQyxFQUFrRCw0QkFDbERDLEVBQTZCLG9DQ2Y3QixJQUFBQyxFQUFxQyw4QkNFckMsSUFBS0MsRUFBQUEsU0FBQUEsRUFBQUEsQ0FHRixPQUFBQSxFQUFBQSxFQUFBLE1BQUEsQ0FBQSxFQUFBLFFBS0FBLEVBQUFBLEVBQUEsSUFBQSxDQUFBLEVBQUEsTUFSRUEsR0FBQUEsR0FBQUEsQ0FBQUEsQ0FBQUEsRURXTCxJQUFNQyxFQUFOLEtBQU1BLENBYk4sTUFhTUEsQ0FBQUEsRUFBQUEsZUFJWUMsV0FLQUMsUUFLQUMsT0FLQUMsS0FNVEMsS0FNQUMsVUFNQUMsU0FNQUMsU0FRUCxZQUNFUCxFQUNBQyxFQUNBTyxFQUNBLENBRUEsS0FBS1IsV0FBYUEsRUFDbEIsS0FBS0MsUUFBVUEsRUFHZixLQUFLQyxPQUNITSxHQUFZTixRQUNaLElBQUlPLFNBQU8sR0FBR1QsQ0FBQUEsSUFBY0MsQ0FBQUEsR0FBV1Ms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LElBQUssSUFFekNFLFlBQVMsV0FBWSxDQUFFYixJQUFLUCxFQUFPM0QsS0FBTWdGLE1BQU8sUUFBUyxDQUFBLEVBR3pELElBQU0wQixLQUFVdEUsZUFBWXVCLEVBQU8zRCxJQUFJLEVBQUUyRyxLQUFNQyxHQUM3Q0EsRUFBS2xFLFNBQVMsTUFBQSxDQUFBLEVBSWhCLEdBQUksQ0FBQ2dFLEVBQVMsTUFBTSxJQUFJekYsTUFBTSwyQkFBQSxFQUc5QixJQUFNMkIsS0FBU0UsbUJBQWFkLFdBQVEyQixFQUFPM0QsS0FBTTBHLENBQUFBLENBQUFBLEtBR2pENUIsaUJBQVc5QyxXQUFRMkIsRUFBTzNELEtBQU0wRyxDQUFBQSxDQUFBQSxFQUdoQzNELEVBQU93RCxZQUFZM0QsQ0FBQUEsS0FHbkJjLG9CQUNFMUIsV0FBUSxLQUFLaEMsS0FBTSxHQUFHMkQsRUFBT1MsVUFBVSxTQUFTLEtBQ2hEb0MsZUFBWXpELEVBQU8wRCxVQUFTLENBQUEsQ0FBQSxDQUVoQyxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsic3JjX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyIsICJQaXBlbGluZSIsICJQbHVnaW4iLCAiUGx1Z2luVHlwZSIsICJfX3RvQ29tbW9uSlMiLCAiaW1wb3J0X25vZGVfZnMiLCAiaW1wb3J0X25vZGVfcGF0aCIsICJpbXBvcnRfbm9kZV96bGliIiwgImltcG9ydF9ub2RlX2NoaWxkX3Byb2Nlc3MiLCAiaW1wb3J0X2xvZ2dlciIsICJpbXBvcnRfY29yZSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgImltcG9ydF9sb2dnZXIiLCAiUGx1Z2luVHlwZSIsICJQbHVnaW4iLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgIl9wbHVnaW4iLCAiaW1wb3J0X3BhdGgiLCAiaW1wb3J0X3Byb3RvY29sIiwgImltcG9ydF9jb3JlIiwgIlBsdWdpbnNFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJwaXBlbGluZSIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJhY3Rpb24iLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVzdWx0IiwgInBsdWdpbnMiLCAic2l6ZSIsICJtZXNzYWdlIiwgInZhbHVlcyIsICJwbHVnaW4iLCAicHVzaCIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibGVuZ3RoIiwgImpvaW4iLCAiUGx1Z2luc0VudW0iLCAicGx1Z2luSW5zdGFuY2UiLCAiZ2V0IiwgIkVycm9yIiwgInJlbG9hZCIsICJpc0J1bmRsZWQiLCAiYnVuZGxlIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgInBhdGgiLCAiY29tbWFuZF9kZWZhdWx0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAicGF0aCIsICJjb21tYW5kcyIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkN5YW5CcmlnaHQiLCAicGx1Z2lucyIsICJNYXAiLCAidGVtcFBhdGhzIiwgIlNldCIsICJlc20iLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiXyIsICJFcnJvciIsICJvbiIsICJTZXJ2ZXJFdmVudCIsICJTdGFydCIsICJzdGFydCIsICJiaW5kIiwgIlN0b3AiLCAic3RvcCIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJ3b3JsZCIsICJDb21tYW5kIiwgImluaXRpYWxpemUiLCAiY29tcGxldGUiLCAiZXhpc3RzU3luYyIsICJyZXNvbHZlIiwgIm1rZGlyU3luYyIsICJyZWN1cnNpdmUiLCAiYnVuZGxlcyIsICJyZWFkZGlyU3luYyIsICJ3aXRoRmlsZVR5cGVzIiwgImZpbHRlciIsICJkaXJlbnQiLCAiaXNGaWxlIiwgIm5hbWUiLCAiZW5kc1dpdGgiLCAiYnVuZGxlIiwgImJ1ZmZlciIsICJpbmZsYXRlU3luYyIsICJyZWFkRmlsZVN5bmMiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJ0eXBlIiwgInJlYWRCeXRlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAiaW5kZXgiLCAicmVhZFJlbWFpbmluZ0J1ZmZlciIsICJ0b1N0cmluZyIsICJ0ZW1wUGF0aCIsICJzbGljZSIsICJ3cml0ZUZpbGVTeW5jIiwgInBsdWdpbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiUGx1Z2luIiwgIndhcm4iLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImFkZCIsICJBcGkiLCAidW5saW5rU3luYyIsICJleGVjU3luYyIsICJzdGRpbyIsICJyZW5hbWVTeW5jIiwgInJlYXNvbiIsICJlcnJvciIsICJkaXJlY3RvcmllcyIsICJpc0RpcmVjdG9yeSIsICJkaXJlY3RvcnkiLCAibWFuaWZlc3QiLCAiSlNPTiIsICJwYXJzZSIsICJtYWluIiwgInZlcnNpb24iLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlbG9hZCIsICJkZWxldGUiLCAiY2FjaGUiLCAicmVtb3ZlUGF0aCIsICJyUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiXQp9Cg==
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var F=Object.defineProperty;var u=(a,e)=>F(a,"name",{value:e,configurable:!0}),m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as B,mkdirSync as W,readdirSync as E,readFileSync as y,renameSync as T,unlinkSync as S,writeFileSync as $}from"node:fs";import{relative as f,resolve as r}from"node:path";import{deflateSync as k,inflateSync as N}from"node:zlib";import{execSync as A}from"node:child_process";import{Logger as O,LoggerColors as R}from"@serenityjs/logger";import{ServerEvent as I,WorldEvent as J}from"@serenityjs/core";import{BinaryStream as D}from"@serenityjs/binarystream";import{Logger as C,LoggerColors as L}from"@serenityjs/logger";var d=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(d||{});var b=class{static{u(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,n,t){this.identifier=e,this.version=n,this.logger=t?.logger??new C(`${e}@${n}`,L.Blue),this.type=t?.type??d.Addon,t?.onInitialize&&(this.onInitialize=t.onInitialize),t?.onStartUp&&(this.onStartUp=t.onStartUp),t?.onShutDown&&(this.onShutDown=t.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};import{relative as q}from"path";import{CommandPermissionLevel as _}from"@serenityjs/protocol";import{CustomEnum as z}from"@serenityjs/core";var w=class extends z{static{u(this,"PluginsEnum")}static identifier="plugins";static options=[]},x=class extends z{static{u(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var j=u((a,e)=>{a.commands.register("plugins","Interact with the plugins of the server",n=>{n.permissionLevel=_.Operator,n.overload({action:x},({action:t})=>{if(t.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let o=[...e.plugins.values()],i=[];for(let s of o)i.push(`\xA7u${s.identifier} v${s.version}\xA7r`);return{message:`\xA77Active Plugins (${o.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),n.overload({action:x,plugin:w},({action:t,plugin:o})=>{if(t.result!=="reload"&&t.result!=="bundle")return;let i=e.plugins.get(o.result);if(!i)throw new Error(`Plugin ${o.result} is not found.`);if(t.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${q(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),U=j;var M={path:"./plugins",commands:!0},xe=class{static{u(this,"Pipeline")}serenity;properties;logger=new O("Plugins",R.CyanBright);plugins=new Map;tempPaths=new Set;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,n){this.serenity=e,this.properties={...M,...n},e.on(I.Start,this.start.bind(this)),e.on(I.Stop,this.stop.bind(this)),this.properties.commands&&e.on(J.WorldInitialize,({world:t})=>U(t,this))}initialize(e){B(r(this.path))||W(r(this.path),{recursive:!0});let t=E(r(this.path),{withFileTypes:!0}).filter(i=>i.isFile()?i.name.endsWith(".plugin"):!1);for(let i of t)try{let s=r(this.path,i.name),g=N(y(s)),h=new D(g),P=h.readByte();if(P===d.Addon){let l=h.readRemainingBuffer().toString("utf-8"),c=r(this.path,`~${i.name.slice(0,-7)}`);$(c,l);let p=m(c).default;if(!(p instanceof b)){this.logger.warn(`Unable to load plugin from \xA78${f(process.cwd(),s)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=s,p.isBundled=!0,this.plugins.set(p.identifier,p),p.onInitialize(p),w.options.push(p.identifier),this.tempPaths.add(c)}else if(P===d.Api){let l=h.readRemainingBuffer();S(s);let c=r(this.path,`~${i.name.slice(0,-7)}`);$(c,l),A(`tar -xzf ${c} -C ${this.path}`,{stdio:"ignore"}),S(c);let v=i.name.slice(0,-7);T(r(this.path,"package"),r(this.path,`${v}.api`)),A("npm install",{cwd:r(this.path,`${v}.api`),stdio:"ignore"})}}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,i.name))}", skipping the plugin.`,s)}let o=E(r(this.path),{withFileTypes:!0}).filter(i=>i.isDirectory());for(let i of o)try{let s=r(this.path,i.name);if(!B(r(s,"package.json")))continue;let g=JSON.parse(y(r(s,"package.json"),"utf-8")),h=r(s,g.main);if(!B(r(s,h))){this.logger.warn(`Unable to load plugin \xA71${g.name}\xA78@\xA71${g.version}\xA7r, the main entry path "\xA78${f(process.cwd(),r(s,h))}\xA7r" was not found in the directory.`);continue}let l=m(r(s,h)).default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=s,l.isBundled=!1,this.plugins.set(l.identifier,l),w.options.push(l.identifier),l.onInitialize(l)}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,i.name))}", skipping the plugin.`,s)}return e()}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)S(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let n=e.path;delete m.cache[m.resolve(n)],this.serenity.removePath(n);try{let o=m(n).default;if(!(o instanceof b)){this.logger.warn(`Unable to reload plugin from \xA78${f(process.cwd(),n)}\xA7r, the plugin is not an instance of the Plugin class.`);return}o.pipeline=this,o.serenity=this.serenity,o.path=n,this.plugins.set(o.identifier,o),o.onInitialize(o),o.onStartUp(o),this.logger.info(`Successfully reloaded plugin \xA71${o.identifier}\xA7r from \xA78${f(process.cwd(),n)}\xA7r.`)}catch(t){this.logger.warn(`Failed to reload plugin from \xA78${f(process.cwd(),n)}\xA7r, skipping the plugin.`,t)}}bundle(e){let n=new D;if(n.writeByte(e.type),e.type===d.Addon){let t=r(e.path,"dist"),o=y(r(t,"index.js"));n.writeBuffer(o),$(r(this.path,`${e.identifier}.plugin`),k(n.getBuffer()))}else if(e.type===d.Api){A("npm pack",{cwd:e.path,stdio:"ignore"});let t=E(e.path).find(i=>i.endsWith(".tgz"));if(!t)throw new Error("Packed tarball not found.");let o=y(r(e.path,t));S(r(e.path,t)),n.writeBuffer(o),$(r(this.path,`${e.identifier}.plugin`),k(n.getBuffer()))}}};export{M as DefaultPipelineProperties,xe as Pipeline,b as Plugin,d as PluginType};
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICAgICAgaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYH4ke2J1bmRsZS5uYW1lLnNsaWNlKDAsIC03KX1gKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMoXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYCksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjb21wbGV0ZSBjYWxsYmFja1xuICAgIHJldHVybiBjb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBEZWxldGUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXNcbiAgICBmb3IgKGNvbnN0IHRlbXBQYXRoIG9mIHRoaXMudGVtcFBhdGhzKSB7XG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIER5bmFtaWMgZGVsZXRlIGlzIHJlcXVpcmVkIGhlcmVcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcblxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBGYWlsZWQgdG8gcmVsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgIHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYnVuZGxlKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IEJpbmFyeVN0cmVhbSBpbnN0YW5jZVxuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgIC8vIFdyaXRlIHRoZSBwbHVnaW4gdHlwZSB0byB0aGUgc3RyZWFtXG4gICAgc3RyZWFtLndyaXRlQnl0ZShwbHVnaW4udHlwZSk7XG5cbiAgICBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQWRkb24pIHtcbiAgICAgIC8vIEdldCB0aGUgYWRkb24gcGF0aFxuICAgICAgY29uc3QgaW5wdXRQYXRoID0gcmVzb2x2ZShwbHVnaW4ucGF0aCwgXCJkaXN0XCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBpbmRleCBmaWxlXG4gICAgICBjb25zdCBpbmRleCA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKGlucHV0UGF0aCwgXCJpbmRleC5qc1wiKSk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBtb2R1bGUgZW50cnkgcG9pbnQgdG8gdGhlIHN0cmVhbVxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGluZGV4KTtcblxuICAgICAgLy8gV3JpdGUgdGhlIEJpbmFyeVN0cmVhbSB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgIHJlc29sdmUodGhpcy5wYXRoLCBgJHtwbHVnaW4uaWRlbnRpZmllcn0ucGx1Z2luYCksXG4gICAgICAgIGRlZmxhdGVTeW5jKHN0cmVhbS5nZXRCdWZmZXIoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChwbHVnaW4udHlwZSA9PT0gUGx1Z2luVHlwZS5BcGkpIHtcbiAgICAgIC8vIFBhY2sgdGhlIHBsdWdpblxuICAgICAgZXhlY1N5bmMoXCJucG0gcGFja1wiLCB7IGN3ZDogcGx1Z2luLnBhdGgsIHN0ZGlvOiBcImlnbm9yZVwiIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIHRhcmJhbGwgcGF0aFxuICAgICAgY29uc3QgdGFyYmFsbCA9IHJlYWRkaXJTeW5jKHBsdWdpbi5wYXRoKS5maW5kKChmaWxlKSA9PlxuICAgICAgICBmaWxlLmVuZHNXaXRoKFwiLnRnelwiKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRhcmJhbGwgZXhpc3RzXG4gICAgICBpZiAoIXRhcmJhbGwpIHRocm93IG5ldyBFcnJvcihcIlBhY2tlZCB0YXJiYWxsIG5vdCBmb3VuZC5cIik7XG5cbiAgICAgIC8vIFJlYWQgdGhlIHRhcmJhbGwgZmlsZVxuICAgICAgY29uc3QgYnVmZmVyID0gcmVhZEZpbGVTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIHVubGlua1N5bmMocmVzb2x2ZShwbHVnaW4ucGF0aCwgdGFyYmFsbCkpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgc3RyZWFtLndyaXRlQnVmZmVyKGJ1ZmZlcik7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBQaXBlbGluZSwgRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcyB9O1xuIiwgImltcG9ydCB7IFNlcmVuaXR5IH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2VyQ29sb3JzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuL3BpcGVsaW5lXCI7XG5pbXBvcnQgeyBQbHVnaW5UeXBlIH0gZnJvbSBcIi4vZW51bXNcIjtcblxuaW50ZXJmYWNlIFBsdWdpblByb3BlcnRpZXMge1xuICBsb2dnZXI6IExvZ2dlcjtcbiAgdHlwZTogUGx1Z2luVHlwZTtcbiAgb25Jbml0aWFsaXplOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG4gIG9uU3RhcnRVcDogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblNodXREb3duOiAocGx1Z2luOiBQbHVnaW4pID0+IHZvaWQ7XG59XG5cbmNsYXNzIFBsdWdpbiB7XG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogUGx1Z2luVHlwZTtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBhdGghOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwbHVnaW4gaXMgYnVuZGxlZC5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIGlzQnVuZGxlZCE6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGlwZWxpbmUgdGhlIHBsdWdpbiBpcyBpbi5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHBpcGVsaW5lITogUGlwZWxpbmU7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJlbml0eSBpbnN0YW5jZSBvZiB0aGUgc2VydmVyLlxuICAgKiBATm90ZSBUaGlzIGlzIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgc2VyZW5pdHkhOiBTZXJlbml0eTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgdmVyc2lvbjogc3RyaW5nLFxuICAgIHByb3BlcnRpZXM/OiBQYXJ0aWFsPFBsdWdpblByb3BlcnRpZXM+XG4gICkge1xuICAgIC8vIFNldCB0aGUgaWRlbnRpZmllciBhbmQgdmVyc2lvbiBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy5pZGVudGlmaWVyID0gaWRlbnRpZmllcjtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgLy8gU2V0IHRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5cbiAgICB0aGlzLmxvZ2dlciA9XG4gICAgICBwcm9wZXJ0aWVzPy5sb2dnZXIgPz9cbiAgICAgIG5ldyBMb2dnZXIoYCR7aWRlbnRpZmllcn1AJHt2ZXJzaW9ufWAsIExvZ2dlckNvbG9ycy5CbHVlKTtcblxuICAgIC8vIFNldCB0aGUgdHlwZSBvZiB0aGUgcGx1Z2luXG4gICAgdGhpcy50eXBlID0gcHJvcGVydGllcz8udHlwZSA/PyBQbHVnaW5UeXBlLkFkZG9uO1xuXG4gICAgLy8gU2V0IHRoZSBvbiBpbml0aWFsaXplLCBzdGFydCB1cCwgYW5kIHNodXQgZG93biBwcm9wZXJ0aWVzXG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uSW5pdGlhbGl6ZSkgdGhpcy5vbkluaXRpYWxpemUgPSBwcm9wZXJ0aWVzLm9uSW5pdGlhbGl6ZTtcbiAgICBpZiAocHJvcGVydGllcz8ub25TdGFydFVwKSB0aGlzLm9uU3RhcnRVcCA9IHByb3BlcnRpZXMub25TdGFydFVwO1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vblNodXREb3duKSB0aGlzLm9uU2h1dERvd24gPSBwcm9wZXJ0aWVzLm9uU2h1dERvd247XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIGluaXRpYWxpemVkLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvbkluaXRpYWxpemUoX3BsdWdpbjogdGhpcyk6IHZvaWQge1xuICAgIC8vIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHlvdXIgcGx1Z2luXG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBzdGFydGVkIHVwLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc3RhcnRlZCB1cC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TdGFydFVwKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc2h1dCBkb3duLlxuICAgKiBAcGFyYW0gcGx1Z2luIFRoZSBwbHVnaW4gaW5zdGFuY2UgdGhhdCB3YXMgc2h1dCBkb3duLiAodGhpcylcbiAgICovXG4gIHB1YmxpYyBvblNodXREb3duKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG59XG5cbmV4cG9ydCB7IFBsdWdpbiwgUGx1Z2luUHJvcGVydGllcyB9O1xuIiwgIi8qKlxuICogVGhlIHBsdWdpbiB0eXBlIGRlY2xhcmVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgcGx1Z2luLlxuICovXG5lbnVtIFBsdWdpblR5cGUge1xuICAvKipcbiAgICogQW4gYWRkb24gcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aG91dCBhbiBleHBvc2VkIEFQSS5cbiAgICovXG4gIEFkZG9uLFxuXG4gIC8qKlxuICAgKiBBbiBBUEkgcGx1Z2luIHR5cGUgYWRkcyBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHNlcnZlciwgd2l0aCBhbiBleHBvc2VkIEFQSSBmb3Igb3RoZXIgcGx1Z2lucyB0byB1c2UuXG4gICAqL1xuICBBcGlcbn1cblxuZXhwb3J0IHsgUGx1Z2luVHlwZSB9O1xuIiwgImltcG9ydCB7IHJlbGF0aXZlIH0gZnJvbSBcInBhdGhcIjtcblxuaW1wb3J0IHsgV29ybGQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQ29tbWFuZFBlcm1pc3Npb25MZXZlbCB9IGZyb20gXCJAc2VyZW5pdHlqcy9wcm90b2NvbFwiO1xuXG5pbXBvcnQgeyBQaXBlbGluZSB9IGZyb20gXCIuLi9waXBlbGluZVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5BY3Rpb25zRW51bSwgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9lbnVtXCI7XG5cbmNvbnN0IHJlZ2lzdGVyID0gKHdvcmxkOiBXb3JsZCwgcGlwZWxpbmU6IFBpcGVsaW5lKSA9PiB7XG4gIHdvcmxkLmNvbW1hbmRzLnJlZ2lzdGVyKFxuICAgIFwicGx1Z2luc1wiLFxuICAgIFwiSW50ZXJhY3Qgd2l0aCB0aGUgcGx1Z2lucyBvZiB0aGUgc2VydmVyXCIsXG4gICAgKHJlZ2lzdHJ5KSA9PiB7XG4gICAgICAvLyBTZXQgdGhlIGNvbW1hbmQgdG8gYmUgYW4gb3BlcmF0b3IgY29tbWFuZFxuICAgICAgcmVnaXN0cnkucGVybWlzc2lvbkxldmVsID0gQ29tbWFuZFBlcm1pc3Npb25MZXZlbC5PcGVyYXRvcjtcblxuICAgICAgLy8gT3ZlcmxvYWQgZm9yIGxpc3RpbmcgdGhlIHBsdWdpbnNcbiAgICAgIHJlZ2lzdHJ5Lm92ZXJsb2FkKFxuICAgICAgICB7XG4gICAgICAgICAgYWN0aW9uOiBQbHVnaW5BY3Rpb25zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgbGlzdFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ICE9PSBcImxpc3RcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBpcGVsaW5lIGhhcyBubyBwbHVnaW5zXG4gICAgICAgICAgaWYgKHBpcGVsaW5lLnBsdWdpbnMuc2l6ZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwiwqdjVGhlcmUgYXJlIGN1cnJlbnQgbm8gcGx1Z2lucyBsb2FkZWQgb24gdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgIC8vIEdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbLi4ucGlwZWxpbmUucGx1Z2lucy52YWx1ZXMoKV07XG5cbiAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtdO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwbHVnaW5zXG4gICAgICAgICAgZm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgLy8gUHVzaCB0aGUgcGx1Z2luIG5hbWUgdG8gdGhlIG1lc3NhZ2VcbiAgICAgICAgICAgIG1lc3NhZ2UucHVzaChgwqd1JHtwbHVnaW4uaWRlbnRpZmllcn0gdiR7cGx1Z2luLnZlcnNpb259wqdyYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IGDCpzdBY3RpdmUgUGx1Z2lucyAoJHtwbHVnaW5zLmxlbmd0aH0pOsKnciAke21lc3NhZ2Uuam9pbihcIsKnNyzCp3IgXCIpfWBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW0sXG4gICAgICAgICAgcGx1Z2luOiBQbHVnaW5zRW51bVxuICAgICAgICB9LFxuICAgICAgICAoeyBhY3Rpb24sIHBsdWdpbiB9KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJyZWxvYWRcIiAmJiBhY3Rpb24ucmVzdWx0ICE9PSBcImJ1bmRsZVwiKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBmcm9tIHRoZSBwaXBlbGluZVxuICAgICAgICAgIGNvbnN0IHBsdWdpbkluc3RhbmNlID0gcGlwZWxpbmUucGx1Z2lucy5nZXQocGx1Z2luLnJlc3VsdCBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBub3QgZm91bmRcbiAgICAgICAgICBpZiAoIXBsdWdpbkluc3RhbmNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gJHtwbHVnaW4ucmVzdWx0fSBpcyBub3QgZm91bmQuYCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIHJlbG9hZFxuICAgICAgICAgIGlmIChhY3Rpb24ucmVzdWx0ID09PSBcInJlbG9hZFwiKSB7XG4gICAgICAgICAgICAvLyBSZWxvYWQgdGhlIHBsdWdpblxuICAgICAgICAgICAgcGlwZWxpbmUucmVsb2FkKHBsdWdpbkluc3RhbmNlKTtcblxuICAgICAgICAgICAgLy8gU2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3JpZ2luXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgwqdhU3VjY2Vzc2Z1bGx5IHJlbG9hZGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHBsdWdpbkluc3RhbmNlLmlzQnVuZGxlZClcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGJ1bmRsZWRcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBQbHVnaW4gJHtwbHVnaW5JbnN0YW5jZS5pZGVudGlmaWVyfSBjYW5ub3QgYmUgYnVuZGxlZCwgYXMgaXQgaXMgYWxyZWFkeSBhIGJ1bmRsZWQgcGx1Z2luLmBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gQnVuZGxlIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLmJ1bmRsZShwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSBidW5kbGVkIMKnMiR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn3Cp2EsIG91dHB1dCBmaWxlIHdhcyBwbGFjZWQgYXQgwqc3JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwaXBlbGluZS5wYXRoKX3Cp2EuYFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICAoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdmVybG9hZCBtYXRjaGVkIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXCIpO1xuICAgIH1cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHJlZ2lzdGVyO1xuIiwgImltcG9ydCB7IEN1c3RvbUVudW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuXG5jbGFzcyBQbHVnaW5zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW107XG59XG5cbmNsYXNzIFBsdWdpbkFjdGlvbnNFbnVtIGV4dGVuZHMgQ3VzdG9tRW51bSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaWRlbnRpZmllciA9IFwicGx1Z2luX2FjdGlvbnNcIjtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBvcHRpb25zOiBBcnJheTxzdHJpbmc+ID0gW1wibGlzdFwiLCBcInJlbG9hZFwiLCBcImJ1bmRsZVwiXTtcbn1cblxuZXhwb3J0IHsgUGx1Z2luc0VudW0sIFBsdWdpbkFjdGlvbnNFbnVtIH07XG4iXSwKICAibWFwcGluZ3MiOiAib1VBQ0EsT0FDRUEsY0FBQUEsRUFDQUMsYUFBQUEsRUFDQUMsZUFBQUEsRUFDQUMsZ0JBQUFBLEVBQ0FDLGNBQUFBLEVBQ0FDLGNBQUFBLEVBQ0FDLGlCQUFBQSxNQUNLLFVBQ1AsT0FBU0MsWUFBQUEsRUFBVUMsV0FBQUEsTUFBZSxZQUNsQyxPQUFTQyxlQUFBQSxFQUFhQyxlQUFBQSxNQUFtQixZQUN6QyxPQUFTQyxZQUFBQSxNQUFnQixxQkFFekIsT0FBU0MsVUFBQUEsRUFBUUMsZ0JBQUFBLE1BQW9CLHFCQUNyQyxPQUFtQkMsZUFBQUEsRUFBYUMsY0FBQUEsTUFBa0IsbUJBQ2xELE9BQVNDLGdCQUFBQSxNQUFvQiwyQkNmN0IsT0FBU0MsVUFBQUEsRUFBUUMsZ0JBQUFBLE1BQW9CLHFCQ0VyQyxJQUFLQyxFQUFBQSxTQUFBQSxFQUFBQSxDQUdGLE9BQUFBLEVBQUFBLEVBQUEsTUFBQSxDQUFBLEVBQUEsUUFLQUEsRUFBQUEsRUFBQSxJQUFBLENBQUEsRUFBQSxNQVJFQSxHQUFBQSxHQUFBQSxDQUFBQSxDQUFBQSxFRFdMLElBQU1DLEVBQU4sS0FBTUEsQ0FiTixNQWFNQSxDQUFBQSxFQUFBQSxlQUlZQyxXQUtBQyxRQUtBQyxPQUtBQyxLQU1UQyxLQU1BQyxVQU1BQyxTQU1BQyxTQVFQLFlBQ0VQLEVBQ0FDLEVBQ0FPLEVBQ0EsQ0FFQSxLQUFLUixXQUFhQSxFQUNsQixLQUFLQyxRQUFVQSxFQUdmLEtBQUtDLE9BQ0hNLEdBQVlOLFFBQ1osSUFBSU8sRUFBTyxHQUFHVCxDQUFBQSxJQUFjQyxD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RUFBT1YsT0FBU0UsRUFBVzBCLElBQUssQ0FFekNFLEVBQVMsV0FBWSxDQUFFYixJQUFLUCxFQUFPM0QsS0FBTWdGLE1BQU8sUUFBUyxDQUFBLEVBR3pELElBQU0wQixFQUFVdEUsRUFBWXVCLEVBQU8zRCxJQUFJLEVBQUUyRyxLQUFNQyxHQUM3Q0EsRUFBS2xFLFNBQVMsTUFBQSxDQUFBLEVBSWhCLEdBQUksQ0FBQ2dFLEVBQVMsTUFBTSxJQUFJekYsTUFBTSwyQkFBQSxFQUc5QixJQUFNMkIsRUFBU0UsRUFBYWQsRUFBUTJCLEVBQU8zRCxLQUFNMEcsQ0FBQUEsQ0FBQUEsRUFHakQ1QixFQUFXOUMsRUFBUTJCLEVBQU8zRCxLQUFNMEcsQ0FBQUEsQ0FBQUEsRUFHaEMzRCxFQUFPd0QsWUFBWTNELENBQUFBLEVBR25CYyxFQUNFMUIsRUFBUSxLQUFLaEMsS0FBTSxHQUFHMkQsRUFBT1MsVUFBVSxTQUFTLEVBQ2hEb0MsRUFBWXpELEVBQU8wRCxVQUFTLENBQUEsQ0FBQSxDQUVoQyxDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsiZXhpc3RzU3luYyIsICJta2RpclN5bmMiLCAicmVhZGRpclN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInJlbmFtZVN5bmMiLCAidW5saW5rU3luYyIsICJ3cml0ZUZpbGVTeW5jIiwgInJlbGF0aXZlIiwgInJlc29sdmUiLCAiZGVmbGF0ZVN5bmMiLCAiaW5mbGF0ZVN5bmMiLCAiZXhlY1N5bmMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJTZXJ2ZXJFdmVudCIsICJXb3JsZEV2ZW50IiwgIkJpbmFyeVN0cmVhbSIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlBsdWdpblR5cGUiLCAiUGx1Z2luIiwgImlkZW50aWZpZXIiLCAidmVyc2lvbiIsICJsb2dnZXIiLCAidHlwZSIsICJwYXRoIiwgImlzQnVuZGxlZCIsICJwaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiQmx1ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgIm9uSW5pdGlhbGl6ZSIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJfcGx1Z2luIiwgInJlbGF0aXZlIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiQ3VzdG9tRW51bSIsICJQbHVnaW5zRW51bSIsICJDdXN0b21FbnVtIiwgImlkZW50aWZpZXIiLCAib3B0aW9ucyIsICJQbHVnaW5BY3Rpb25zRW51bSIsICJyZWdpc3RlciIsICJfX25hbWUiLCAid29ybGQiLCAicGlwZWxpbmUiLCAiY29tbWFuZHMiLCAicmVnaXN0cnkiLCAicGVybWlzc2lvbkxldmVsIiwgIkNvbW1hbmRQZXJtaXNzaW9uTGV2ZWwiLCAiT3BlcmF0b3IiLCAib3ZlcmxvYWQiLCAiYWN0aW9uIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlc3VsdCIsICJwbHVnaW5zIiwgInNpemUiLCAibWVzc2FnZSIsICJ2YWx1ZXMiLCAicGx1Z2luIiwgInB1c2giLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxlbmd0aCIsICJqb2luIiwgIlBsdWdpbnNFbnVtIiwgInBsdWdpbkluc3RhbmNlIiwgImdldCIsICJFcnJvciIsICJyZWxvYWQiLCAiaXNCdW5kbGVkIiwgImJ1bmRsZSIsICJyZWxhdGl2ZSIsICJwcm9jZXNzIiwgImN3ZCIsICJwYXRoIiwgImNvbW1hbmRfZGVmYXVsdCIsICJEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzIiwgInBhdGgiLCAiY29tbWFuZHMiLCAiUGlwZWxpbmUiLCAic2VyZW5pdHkiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJDeWFuQnJpZ2h0IiwgInBsdWdpbnMiLCAiTWFwIiwgInRlbXBQYXRocyIsICJTZXQiLCAiZXNtIiwgIm1vZHVsZSIsICJleHBvcnRzIiwgIl8iLCAiRXJyb3IiLCAib24iLCAiU2VydmVyRXZlbnQiLCAiU3RhcnQiLCAic3RhcnQiLCAiYmluZCIsICJTdG9wIiwgInN0b3AiLCAiV29ybGRFdmVudCIsICJXb3JsZEluaXRpYWxpemUiLCAid29ybGQiLCAiQ29tbWFuZCIsICJpbml0aWFsaXplIiwgImNvbXBsZXRlIiwgImV4aXN0c1N5bmMiLCAicmVzb2x2ZSIsICJta2RpclN5bmMiLCAicmVjdXJzaXZlIiwgImJ1bmRsZXMiLCAicmVhZGRpclN5bmMiLCAid2l0aEZpbGVUeXBlcyIsICJmaWx0ZXIiLCAiZGlyZW50IiwgImlzRmlsZSIsICJuYW1lIiwgImVuZHNXaXRoIiwgImJ1bmRsZSIsICJidWZmZXIiLCAiaW5mbGF0ZVN5bmMiLCAicmVhZEZpbGVTeW5jIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAidHlwZSIsICJyZWFkQnl0ZSIsICJQbHVnaW5UeXBlIiwgIkFkZG9uIiwgImluZGV4IiwgInJlYWRSZW1haW5pbmdCdWZmZXIiLCAidG9TdHJpbmciLCAidGVtcFBhdGgiLCAic2xpY2UiLCAid3JpdGVGaWxlU3luYyIsICJwbHVnaW4iLCAicmVxdWlyZSIsICJkZWZhdWx0IiwgIlBsdWdpbiIsICJ3YXJuIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgImhhcyIsICJpZGVudGlmaWVyIiwgInBpcGVsaW5lIiwgImlzQnVuZGxlZCIsICJzZXQiLCAib25Jbml0aWFsaXplIiwgIlBsdWdpbnNFbnVtIiwgIm9wdGlvbnMiLCAicHVzaCIsICJhZGQiLCAiQXBpIiwgInVubGlua1N5bmMiLCAiZXhlY1N5bmMiLCAic3RkaW8iLCAicmVuYW1lU3luYyIsICJyZWFzb24iLCAiZXJyb3IiLCAiZGlyZWN0b3JpZXMiLCAiaXNEaXJlY3RvcnkiLCAiZGlyZWN0b3J5IiwgIm1hbmlmZXN0IiwgIkpTT04iLCAicGFyc2UiLCAibWFpbiIsICJ2ZXJzaW9uIiwgInZhbHVlcyIsICJvblN0YXJ0VXAiLCAib25TaHV0RG93biIsICJyZWxvYWQiLCAiZGVsZXRlIiwgImNhY2hlIiwgInJlbW92ZVBhdGgiLCAiclBsdWdpbiIsICJpbmZvIiwgIndyaXRlQnl0ZSIsICJpbnB1dFBhdGgiLCAid3JpdGVCdWZmZXIiLCAiZGVmbGF0ZVN5bmMiLCAiZ2V0QnVmZmVyIiwgInRhcmJhbGwiLCAiZmluZCIsICJmaWxlIl0KfQo=
1
+ var F=Object.defineProperty;var u=(a,e)=>F(a,"name",{value:e,configurable:!0}),m=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});import{existsSync as B,mkdirSync as W,readdirSync as E,readFileSync as y,renameSync as T,unlinkSync as S,writeFileSync as $}from"node:fs";import{relative as f,resolve as r}from"node:path";import{deflateSync as k,inflateSync as N}from"node:zlib";import{execSync as A}from"node:child_process";import{Logger as O,LoggerColors as R}from"@serenityjs/logger";import{ServerEvent as I,WorldEvent as J}from"@serenityjs/core";import{BinaryStream as D}from"@serenityjs/binarystream";import{Logger as C,LoggerColors as L}from"@serenityjs/logger";var d=function(a){return a[a.Addon=0]="Addon",a[a.Api=1]="Api",a}(d||{});var b=class{static{u(this,"Plugin")}identifier;version;logger;type;path;isBundled;pipeline;serenity;constructor(e,n,t){this.identifier=e,this.version=n,this.logger=t?.logger??new C(`${e}@${n}`,L.Blue),this.type=t?.type??d.Addon,t?.onInitialize&&(this.onInitialize=t.onInitialize),t?.onStartUp&&(this.onStartUp=t.onStartUp),t?.onShutDown&&(this.onShutDown=t.onShutDown)}onInitialize(e){}onStartUp(e){}onShutDown(e){}};import{relative as q}from"path";import{CommandPermissionLevel as _}from"@serenityjs/protocol";import{CustomEnum as z}from"@serenityjs/core";var w=class extends z{static{u(this,"PluginsEnum")}static identifier="plugins";static options=[]},x=class extends z{static{u(this,"PluginActionsEnum")}static identifier="plugin_actions";static options=["list","reload","bundle"]};var j=u((a,e)=>{a.commands.register("plugins","Interact with the plugins of the server",n=>{n.permissionLevel=_.Operator,n.overload({action:x},({action:t})=>{if(t.result!=="list")return;if(e.plugins.size===0)return{message:"\xA7cThere are current no plugins loaded on the server."};let o=[...e.plugins.values()],i=[];for(let s of o)i.push(`\xA7u${s.identifier} v${s.version}\xA7r`);return{message:`\xA77Active Plugins (${o.length}):\xA7r ${i.join("\xA77,\xA7r ")}`}}),n.overload({action:x,plugin:w},({action:t,plugin:o})=>{if(t.result!=="reload"&&t.result!=="bundle")return;let i=e.plugins.get(o.result);if(!i)throw new Error(`Plugin ${o.result} is not found.`);if(t.result==="reload")return e.reload(i),{message:`\xA7aSuccessfully reloaded \xA72${i.identifier}\xA7a.`};if(i.isBundled)throw new Error(`Plugin ${i.identifier} cannot be bundled, as it is already a bundled plugin.`);return e.bundle(i),{message:`\xA7aSuccessfully bundled \xA72${i.identifier}\xA7a, output file was placed at \xA77${q(process.cwd(),e.path)}\xA7a.`}})},()=>{throw new Error("No overload matched the provided arguments.")})},"register"),U=j;var M={path:"./plugins",commands:!0},xe=class{static{u(this,"Pipeline")}serenity;properties;logger=new O("Plugins",R.CyanBright);plugins=new Map;tempPaths=new Set;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,n){this.serenity=e,this.properties={...M,...n},e.on(I.Start,this.start.bind(this)),e.on(I.Stop,this.stop.bind(this)),this.properties.commands&&e.on(J.WorldInitialize,({world:t})=>U(t,this))}initialize(e){B(r(this.path))||W(r(this.path),{recursive:!0});let t=E(r(this.path),{withFileTypes:!0}).filter(i=>i.isFile()?i.name.endsWith(".plugin"):!1);for(let i of t)try{let s=r(this.path,i.name),g=N(y(s)),h=new D(g),P=h.readByte();if(P===d.Addon){let l=h.readRemainingBuffer().toString("utf-8"),c=r(this.path,`~${i.name.slice(0,-7)}`);$(c,l);let p=m(c).default;if(!(p instanceof b)){this.logger.warn(`Unable to load plugin from \xA78${f(process.cwd(),s)}\xA7r, the plugin is not an instance of the Plugin class.`);continue}if(this.plugins.has(p.identifier)){this.logger.warn(`Unable to load plugin \xA71${p.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}p.pipeline=this,p.serenity=this.serenity,p.path=s,p.isBundled=!0,this.plugins.set(p.identifier,p),p.onInitialize(p),w.options.push(p.identifier),this.tempPaths.add(c)}else if(P===d.Api){let l=h.readRemainingBuffer();S(s);let c=r(this.path,`~${i.name.slice(0,-7)}`);$(c,l),A(`tar -xzf ${c} -C ${this.path}`,{stdio:"ignore"}),S(c);let v=i.name.slice(0,-7);T(r(this.path,"package"),r(this.path,`${v}.api`)),A("npm install",{cwd:r(this.path,`${v}.api`),stdio:"ignore"})}}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,i.name))}", skipping the plugin.`,s)}let o=E(r(this.path),{withFileTypes:!0}).filter(i=>i.isDirectory());for(let i of o)try{let s=r(this.path,i.name);if(!B(r(s,"package.json")))continue;let g=JSON.parse(y(r(s,"package.json"),"utf-8")),h=r(s,g.main);if(!B(r(s,h))){this.logger.warn(`Unable to load plugin \xA71${g.name}\xA78@\xA71${g.version}\xA7r, the main entry path "\xA78${f(process.cwd(),r(s,h))}\xA7r" was not found in the directory.`);continue}let l=m(r(s,h)).default;if(this.plugins.has(l.identifier)){this.logger.warn(`Unable to load plugin \xA71${l.identifier}\xA7r, the plugin is already loaded in the pipeline.`);continue}l.pipeline=this,l.serenity=this.serenity,l.path=s,l.isBundled=!1,this.plugins.set(l.identifier,l),w.options.push(l.identifier),l.onInitialize(l)}catch(s){this.logger.error(`Failed to load plugin from "${f(process.cwd(),r(this.path,i.name))}", skipping the plugin.`,s)}return e()}start(){for(let e of this.plugins.values())e.onStartUp(e)}stop(){for(let e of this.plugins.values())e.onShutDown(e);for(let e of this.tempPaths)S(e)}reload(e){e.onShutDown(e),this.plugins.delete(e.identifier);let n=e.path;delete m.cache[m.resolve(n)],this.serenity.removePath(n);try{let o=m(n).default;if(!(o instanceof b)){this.logger.warn(`Unable to reload plugin from \xA78${f(process.cwd(),n)}\xA7r, the plugin is not an instance of the Plugin class.`);return}o.pipeline=this,o.serenity=this.serenity,o.path=n,this.plugins.set(o.identifier,o),o.onInitialize(o),o.onStartUp(o),this.logger.info(`Successfully reloaded plugin \xA71${o.identifier}\xA7r from \xA78${f(process.cwd(),n)}\xA7r.`)}catch(t){this.logger.error(`Failed to reload plugin from \xA78${f(process.cwd(),n)}\xA7r, skipping the plugin.`,t)}}bundle(e){let n=new D;if(n.writeByte(e.type),e.type===d.Addon){let t=r(e.path,"dist"),o=y(r(t,"index.js"));n.writeBuffer(o),$(r(this.path,`${e.identifier}.plugin`),k(n.getBuffer()))}else if(e.type===d.Api){A("npm pack",{cwd:e.path,stdio:"ignore"});let t=E(e.path).find(i=>i.endsWith(".tgz"));if(!t)throw new Error("Packed tarball not found.");let o=y(r(e.path,t));S(r(e.path,t)),n.writeBuffer(o),$(r(this.path,`${e.identifier}.plugin`),k(n.getBuffer()))}}};export{M as DefaultPipelineProperties,xe as Pipeline,b as Plugin,d as PluginType};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3BpcGVsaW5lLnRzIiwgIi4uL3NyYy9wbHVnaW4udHMiLCAiLi4vc3JjL2VudW1zL3R5cGUudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2NvbW1hbmQudHMiLCAiLi4vc3JjL2NvbW1hbmRzL2VudW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgdW5saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkZWZsYXRlU3luYywgaW5mbGF0ZVN5bmMgfSBmcm9tIFwibm9kZTp6bGliXCI7XG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnZXJDb2xvcnMgfSBmcm9tIFwiQHNlcmVuaXR5anMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBTZXJlbml0eSwgU2VydmVyRXZlbnQsIFdvcmxkRXZlbnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvY29yZVwiO1xuaW1wb3J0IHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQbHVnaW5QYWNrYWdlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCIuL3BsdWdpblwiO1xuaW1wb3J0IENvbW1hbmQgZnJvbSBcIi4vY29tbWFuZHMvY29tbWFuZFwiO1xuaW1wb3J0IHsgUGx1Z2luc0VudW0gfSBmcm9tIFwiLi9jb21tYW5kc1wiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQaXBlbGluZVByb3BlcnRpZXMge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmRzOiBib29sZWFuO1xufVxuXG5jb25zdCBEZWZhdWx0UGlwZWxpbmVQcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXMgPSB7XG4gIHBhdGg6IFwiLi9wbHVnaW5zXCIsXG4gIGNvbW1hbmRzOiB0cnVlXG59O1xuXG5jbGFzcyBQaXBlbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgc2VydmVyIGluc3RhbmNlIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXJlbml0eTogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wZXJ0aWVzOiBQaXBlbGluZVByb3BlcnRpZXM7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2dnZXIgZm9yIHRoZSBwbHVnaW5zIHBpcGVsaW5lLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoXCJQbHVnaW5zXCIsIExvZ2dlckNvbG9ycy5DeWFuQnJpZ2h0KTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbnMgbG9hZGVkIGluIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5zID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbj4oKTtcblxuICAvKipcbiAgICogVGhlIHRlbXBvcmFyeSBwYXRocyB1c2VkIGJ5IHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0ZW1wUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGlwZWxpbmUgaXMgcnVubmluZyBpbiBFU00gbW9kZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlc206IGJvb2xlYW4gPVxuICAgIHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlPy5leHBvcnRzICE9PSBleHBvcnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgcGx1Z2lucyBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHVibGljIHNldCBwYXRoKF8pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGF0aCBwcm9wZXJ0eSBpcyByZWFkLW9ubHkuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFBpcGVsaW5lIGNsYXNzLlxuICAgKiBAcGFyYW0gc2VyZW5pdHkgVGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJlbml0eTogU2VyZW5pdHksXG4gICAgcHJvcGVydGllcz86IFBhcnRpYWw8UGlwZWxpbmVQcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIHNlcmVuaXR5IHNlcnZlciBpbnN0YW5jZVxuICAgIHRoaXMuc2VyZW5pdHkgPSBzZXJlbml0eTtcblxuICAgIC8vIE1lcmdlIHRoZSBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFBpcGVsaW5lUHJvcGVydGllcywgLi4ucHJvcGVydGllcyB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHRoZSBzZXJlbml0eSBzZXJ2ZXIgZXZlbnRzXG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RhcnQsIHRoaXMuc3RhcnQuYmluZCh0aGlzKSk7XG4gICAgc2VyZW5pdHkub24oU2VydmVyRXZlbnQuU3RvcCwgdGhpcy5zdG9wLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgY29tbWFuZCBzaG91bGQgYmUgcmVnaXN0ZXJlZFxuICAgIGlmICghdGhpcy5wcm9wZXJ0aWVzLmNvbW1hbmRzKSByZXR1cm47XG5cbiAgICAvLyBIb29rIGludG8gdGhlIHdvcmxkIGluaXRpYWxpemUgZXZlbnRcbiAgICBzZXJlbml0eS5vbihXb3JsZEV2ZW50LldvcmxkSW5pdGlhbGl6ZSwgKHsgd29ybGQgfSkgPT5cbiAgICAgIENvbW1hbmQod29ybGQsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICogQHBhcmFtIGNvbXBsZXRlIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHBpcGVsaW5lIGlzIGluaXRpYWxpemVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwaXBlbGluZSBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplKGNvbXBsZXRlOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhyZXNvbHZlKHRoaXMucGF0aCkpKVxuICAgICAgLy8gSWYgbm90LCBjcmVhdGUgdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICBta2RpclN5bmMocmVzb2x2ZSh0aGlzLnBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFJlYWQgYWxsIHRoZSBlbnRyaWVzIGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeVxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhyZXNvbHZlKHRoaXMucGF0aCksIHtcbiAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWVcbiAgICB9KTtcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsIHRoZSBmaWxlcyB0aGF0IGhhdmUgYSAucGx1Z2luIGV4dGVuc2lvblxuICAgIGNvbnN0IGJ1bmRsZXMgPSBlbnRyaWVzLmZpbHRlcigoZGlyZW50KSA9PlxuICAgICAgZGlyZW50LmlzRmlsZSgpID8gZGlyZW50Lm5hbWUuZW5kc1dpdGgoXCIucGx1Z2luXCIpIDogZmFsc2VcbiAgICApO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYnVuZGxlZCBwbHVnaW5zLCBhbmQgaW1wb3J0IHRoZW1cbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBidW5kbGVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgLnBsdWdpbiBmaWxlIGFuZCBpbmZsYXRlIGl0LCBhbmQgY3JlYXRlIGEgbmV3IGJpbmFyeSBzdHJlYW1cbiAgICAgICAgY29uc3QgYnVmZmVyID0gaW5mbGF0ZVN5bmMocmVhZEZpbGVTeW5jKHBhdGgpKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBsdWdpbiB0eXBlIGZyb20gdGhlIHN0cmVhbVxuICAgICAgICBjb25zdCB0eXBlID0gc3RyZWFtLnJlYWRCeXRlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiB0eXBlIGlzIHZhbGlkXG4gICAgICAgIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAgICAgLy8gUmVhZCB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0cmVhbVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gc3RyZWFtLnJlYWRSZW1haW5pbmdCdWZmZXIoKS50b1N0cmluZyhcInV0Zi04XCIpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZHVsZSBvciBtYWluIGVudHJ5IHBvaW50cyB0byB0ZW1wb3JhcnkgZmlsZXNcbiAgICAgICAgICBjb25zdCB0ZW1wUGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBgfiR7YnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpfWApO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmModGVtcFBhdGgsIGluZGV4KTtcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IHJlcXVpcmUodGVtcFBhdGgpO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzXG4gICAgICAgICAgaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiBmcm9tIMKnOCR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aCl9wqdyLCB0aGUgcGx1Z2luIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0aGUgUGx1Z2luIGNsYXNzLmBcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICAgIGlmICh0aGlzLnBsdWdpbnMuaGFzKHBsdWdpbi5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gU2tpcCB0aGUgcGx1Z2luXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgdGhlIHBpcGVsaW5lLCBzZXJlbml0eSwgYW5kIHBhdGggZm9yIHRoZSBwbHVnaW5cbiAgICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICAgIHBsdWdpbi5zZXJlbml0eSA9IHRoaXMuc2VyZW5pdHk7XG4gICAgICAgICAgcGx1Z2luLnBhdGggPSBwYXRoO1xuICAgICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSBwbHVnaW4gdG8gdGhlIHBsdWdpbnMgbWFwXG4gICAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHBsdWdpblxuICAgICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIGVudW1cbiAgICAgICAgICBQbHVnaW5zRW51bS5vcHRpb25zLnB1c2gocGx1Z2luLmlkZW50aWZpZXIpO1xuXG4gICAgICAgICAgLy8gQWRkIHRoZSB0ZW1wb3JhcnkgcGF0aCB0byB0aGUgc2V0XG4gICAgICAgICAgdGhpcy50ZW1wUGF0aHMuYWRkKHRlbXBQYXRoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBQbHVnaW5UeXBlLkFwaSkge1xuICAgICAgICAgIC8vIFJlYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW1cbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBzdHJlYW0ucmVhZFJlbWFpbmluZ0J1ZmZlcigpO1xuXG4gICAgICAgICAgLy8gRGVsZXRlIHRoZSAucGx1Z2luIGZpbGVcbiAgICAgICAgICB1bmxpbmtTeW5jKHBhdGgpO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byBhIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSByZXNvbHZlKHRoaXMucGF0aCwgYH4ke2J1bmRsZS5uYW1lLnNsaWNlKDAsIC03KX1gKTtcblxuICAgICAgICAgIC8vIFdyaXRlIHRoZSBidWZmZXIgdG8gdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgd3JpdGVGaWxlU3luYyh0ZW1wUGF0aCwgYnVmZmVyKTtcblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHRhcmJhbGwgdG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5XG4gICAgICAgICAgZXhlY1N5bmMoYHRhciAteHpmICR7dGVtcFBhdGh9IC1DICR7dGhpcy5wYXRofWAsIHtcbiAgICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgICAgdW5saW5rU3luYyh0ZW1wUGF0aCk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbiBuYW1lIGZyb20gdGhlIHRhcmJhbGxcbiAgICAgICAgICBjb25zdCBuYW1lID0gYnVuZGxlLm5hbWUuc2xpY2UoMCwgLTcpO1xuXG4gICAgICAgICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgXCJwYWNrYWdlXCIgZGlyZWN0b3J5IHRvIHRoZSBwbHVnaW4gbmFtZVxuICAgICAgICAgIHJlbmFtZVN5bmMoXG4gICAgICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgXCJwYWNrYWdlXCIpLFxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke25hbWV9LmFwaWApXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIEluc3RhbGwgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHBsdWdpblxuICAgICAgICAgIGV4ZWNTeW5jKFwibnBtIGluc3RhbGxcIiwge1xuICAgICAgICAgICAgY3dkOiByZXNvbHZlKHRoaXMucGF0aCwgYCR7bmFtZX0uYXBpYCksXG4gICAgICAgICAgICBzdGRpbzogXCJpZ25vcmVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvclxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGZyb20gXCIke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHJlc29sdmUodGhpcy5wYXRoLCBidW5kbGUubmFtZSkpfVwiLCBza2lwcGluZyB0aGUgcGx1Z2luLmAsXG4gICAgICAgICAgcmVhc29uXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwgdGhlIGRpcmVjdG9yaWVzIGZyb20gdGhlIGVudHJpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IHJlYWRkaXJTeW5jKHJlc29sdmUodGhpcy5wYXRoKSwge1xuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxuICAgIH0pLmZpbHRlcigoZGlyZW50KSA9PiBkaXJlbnQuaXNEaXJlY3RvcnkoKSk7XG5cbiAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBkaXJlY3RvcmllcywgY2hlY2tpbmcgaWYgdGhleSBhcmUgdmFsaWQgcGx1Z2luc1xuICAgIGZvciAoY29uc3QgZGlyZWN0b3J5IG9mIGRpcmVjdG9yaWVzKSB7XG4gICAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIHRoZSBwbHVnaW5cbiAgICAgICAgY29uc3QgcGF0aCA9IHJlc29sdmUodGhpcy5wYXRoLCBkaXJlY3RvcnkubmFtZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYSBwYWNrYWdlLmpzb24gZmlsZSwgaWYgbm90LCBza2lwIHRoZSBwbHVnaW5cbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIikpKSBjb250aW51ZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBwYWNrYWdlLmpzb24gZmlsZVxuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgcmVhZEZpbGVTeW5jKHJlc29sdmUocGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmLThcIilcbiAgICAgICAgKSBhcyBQbHVnaW5QYWNrYWdlO1xuXG4gICAgICAgIC8vIEdldCB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHBsdWdpblxuICAgICAgICAvLyBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCB0aGlzLmVzbSA/IG1hbmlmZXN0Lm1vZHVsZSA6IG1hbmlmZXN0Lm1haW4pO1xuICAgICAgICBjb25zdCBtYWluID0gcmVzb2x2ZShwYXRoLCBtYW5pZmVzdC5tYWluKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgZW50cnkgcG9pbnQgaXMgdmFsaWRcbiAgICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc29sdmUocGF0aCwgbWFpbikpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBVbmFibGUgdG8gbG9hZCBwbHVnaW4gwqcxJHttYW5pZmVzdC5uYW1lfcKnOEDCpzEke21hbmlmZXN0LnZlcnNpb259wqdyLCB0aGUgbWFpbiBlbnRyeSBwYXRoIFwiwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCByZXNvbHZlKHBhdGgsIG1haW4pKX3Cp3JcIiB3YXMgbm90IGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCB0aGUgcGx1Z2luIG1vZHVsZVxuICAgICAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKHJlc29sdmUocGF0aCwgbWFpbikpO1xuXG4gICAgICAgIC8vIEdldCB0aGUgcGx1Z2luIGNsYXNzIGZyb20gdGhlIG1vZHVsZVxuICAgICAgICBjb25zdCBwbHVnaW4gPSBtb2R1bGUuZGVmYXVsdCBhcyBQbHVnaW47XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBsdWdpbiBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5wbHVnaW5zLmhhcyhwbHVnaW4uaWRlbnRpZmllcikpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFVuYWJsZSB0byBsb2FkIHBsdWdpbiDCpzEke3BsdWdpbi5pZGVudGlmaWVyfcKnciwgdGhlIHBsdWdpbiBpcyBhbHJlYWR5IGxvYWRlZCBpbiB0aGUgcGlwZWxpbmUuYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBTa2lwIHRoZSBwbHVnaW5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgICBwbHVnaW4ucGlwZWxpbmUgPSB0aGlzO1xuICAgICAgICBwbHVnaW4uc2VyZW5pdHkgPSB0aGlzLnNlcmVuaXR5O1xuICAgICAgICBwbHVnaW4ucGF0aCA9IHBhdGg7XG4gICAgICAgIHBsdWdpbi5pc0J1bmRsZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBtYXBcbiAgICAgICAgdGhpcy5wbHVnaW5zLnNldChwbHVnaW4uaWRlbnRpZmllciwgcGx1Z2luKTtcblxuICAgICAgICAvLyBBZGQgdGhlIHBsdWdpbiB0byB0aGUgcGx1Z2lucyBlbnVtXG4gICAgICAgIFBsdWdpbnNFbnVtLm9wdGlvbnMucHVzaChwbHVnaW4uaWRlbnRpZmllcik7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcGx1Z2luXG4gICAgICAgIHBsdWdpbi5vbkluaXRpYWxpemUocGx1Z2luKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gbG9hZCBwbHVnaW4gZnJvbSBcIiR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcmVzb2x2ZSh0aGlzLnBhdGgsIGRpcmVjdG9yeS5uYW1lKSl9XCIsIHNraXBwaW5nIHRoZSBwbHVnaW4uYCxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDYWxsIHRoZSBjb21wbGV0ZSBjYWxsYmFja1xuICAgIHJldHVybiBjb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB1cCBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblN0YXJ0VXAocGx1Z2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgcGx1Z2lucyBwaXBlbGluZS5cbiAgICovXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIC8vIFNodXQgZG93biBhbGwgdGhlIHBsdWdpbnNcbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMudmFsdWVzKCkpIHBsdWdpbi5vblNodXREb3duKHBsdWdpbik7XG5cbiAgICAvLyBEZWxldGUgYWxsIHRoZSB0ZW1wb3JhcnkgZmlsZXNcbiAgICBmb3IgKGNvbnN0IHRlbXBQYXRoIG9mIHRoaXMudGVtcFBhdGhzKSB7XG4gICAgICAvLyBEZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHRlbXBQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkKHBsdWdpbjogUGx1Z2luKTogdm9pZCB7XG4gICAgLy8gU2h1dCBkb3duIHRoZSBwbHVnaW5cbiAgICBwbHVnaW4ub25TaHV0RG93bihwbHVnaW4pO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgcGx1Z2lucyBtYXBcbiAgICB0aGlzLnBsdWdpbnMuZGVsZXRlKHBsdWdpbi5pZGVudGlmaWVyKTtcblxuICAgIC8vIEdldCB0aGUgcGx1Z2luIHBhdGhcbiAgICBjb25zdCBwYXRoID0gcGx1Z2luLnBhdGg7XG5cbiAgICAvLyBEZWxldGUgdGhlIHJlcXVpcmUgY2FjaGUgZm9yIHRoZSBwbHVnaW5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIER5bmFtaWMgZGVsZXRlIGlzIHJlcXVpcmVkIGhlcmVcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUocGF0aCldO1xuXG4gICAgLy8gUmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgc2VyZW5pdHkgaW5zdGFuY2VcbiAgICB0aGlzLnNlcmVuaXR5LnJlbW92ZVBhdGgocGF0aCk7XG5cbiAgICAvLyBBdHRlbXB0IHRvIGxvYWQgdGhlIHBsdWdpblxuICAgIHRyeSB7XG4gICAgICAvLyBJbXBvcnQgdGhlIHBsdWdpbiBtb2R1bGVcblxuICAgICAgY29uc3QgbW9kdWxlID0gcmVxdWlyZShwYXRoKTtcblxuICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gY2xhc3MgZnJvbSB0aGUgbW9kdWxlXG4gICAgICBjb25zdCByUGx1Z2luID0gbW9kdWxlLmRlZmF1bHQgYXMgUGx1Z2luO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGx1Z2luIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3NcbiAgICAgIGlmICghKHJQbHVnaW4gaW5zdGFuY2VvZiBQbHVnaW4pKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byByZWxvYWQgcGx1Z2luIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IsIHRoZSBwbHVnaW4gaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZSBQbHVnaW4gY2xhc3MuYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFNraXAgdGhlIHBsdWdpblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgcGlwZWxpbmUsIHNlcmVuaXR5LCBhbmQgcGF0aCBmb3IgdGhlIHBsdWdpblxuICAgICAgclBsdWdpbi5waXBlbGluZSA9IHRoaXM7XG4gICAgICByUGx1Z2luLnNlcmVuaXR5ID0gdGhpcy5zZXJlbml0eTtcbiAgICAgIHJQbHVnaW4ucGF0aCA9IHBhdGg7XG5cbiAgICAgIC8vIEFkZCB0aGUgcGx1Z2luIHRvIHRoZSBwbHVnaW5zIG1hcFxuICAgICAgdGhpcy5wbHVnaW5zLnNldChyUGx1Z2luLmlkZW50aWZpZXIsIHJQbHVnaW4pO1xuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBwbHVnaW5cbiAgICAgIHJQbHVnaW4ub25Jbml0aWFsaXplKHJQbHVnaW4pO1xuXG4gICAgICAvLyBTdGFydCB1cCB0aGUgcGx1Z2luXG4gICAgICByUGx1Z2luLm9uU3RhcnRVcChyUGx1Z2luKTtcblxuICAgICAgLy8gTG9nIHRoZSBzdWNjZXNzZnVsIHJlbG9hZFxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYFN1Y2Nlc3NmdWxseSByZWxvYWRlZCBwbHVnaW4gwqcxJHtyUGx1Z2luLmlkZW50aWZpZXJ9wqdyIGZyb20gwqc4JHtyZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoKX3Cp3IuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgIC8vIExvZyB0aGUgZXJyb3JcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlbG9hZCBwbHVnaW4gZnJvbSDCpzgke3JlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHBhdGgpfcKnciwgc2tpcHBpbmcgdGhlIHBsdWdpbi5gLFxuICAgICAgICByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGJ1bmRsZShwbHVnaW46IFBsdWdpbik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBCaW5hcnlTdHJlYW0gaW5zdGFuY2VcbiAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG5cbiAgICAvLyBXcml0ZSB0aGUgcGx1Z2luIHR5cGUgdG8gdGhlIHN0cmVhbVxuICAgIHN0cmVhbS53cml0ZUJ5dGUocGx1Z2luLnR5cGUpO1xuXG4gICAgaWYgKHBsdWdpbi50eXBlID09PSBQbHVnaW5UeXBlLkFkZG9uKSB7XG4gICAgICAvLyBHZXQgdGhlIGFkZG9uIHBhdGhcbiAgICAgIGNvbnN0IGlucHV0UGF0aCA9IHJlc29sdmUocGx1Z2luLnBhdGgsIFwiZGlzdFwiKTtcblxuICAgICAgLy8gUmVhZCB0aGUgaW5kZXggZmlsZVxuICAgICAgY29uc3QgaW5kZXggPSByZWFkRmlsZVN5bmMocmVzb2x2ZShpbnB1dFBhdGgsIFwiaW5kZXguanNcIikpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgbW9kdWxlIGVudHJ5IHBvaW50IHRvIHRoZSBzdHJlYW1cbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihpbmRleCk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBCaW5hcnlTdHJlYW0gdG8gdGhlIG91dHB1dCBwYXRoXG4gICAgICB3cml0ZUZpbGVTeW5jKFxuICAgICAgICByZXNvbHZlKHRoaXMucGF0aCwgYCR7cGx1Z2luLmlkZW50aWZpZXJ9LnBsdWdpbmApLFxuICAgICAgICBkZWZsYXRlU3luYyhzdHJlYW0uZ2V0QnVmZmVyKCkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocGx1Z2luLnR5cGUgPT09IFBsdWdpblR5cGUuQXBpKSB7XG4gICAgICAvLyBQYWNrIHRoZSBwbHVnaW5cbiAgICAgIGV4ZWNTeW5jKFwibnBtIHBhY2tcIiwgeyBjd2Q6IHBsdWdpbi5wYXRoLCBzdGRpbzogXCJpZ25vcmVcIiB9KTtcblxuICAgICAgLy8gR2V0IHRoZSB0YXJiYWxsIHBhdGhcbiAgICAgIGNvbnN0IHRhcmJhbGwgPSByZWFkZGlyU3luYyhwbHVnaW4ucGF0aCkuZmluZCgoZmlsZSkgPT5cbiAgICAgICAgZmlsZS5lbmRzV2l0aChcIi50Z3pcIilcbiAgICAgICk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSB0YXJiYWxsIGV4aXN0c1xuICAgICAgaWYgKCF0YXJiYWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQYWNrZWQgdGFyYmFsbCBub3QgZm91bmQuXCIpO1xuXG4gICAgICAvLyBSZWFkIHRoZSB0YXJiYWxsIGZpbGVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHJlYWRGaWxlU3luYyhyZXNvbHZlKHBsdWdpbi5wYXRoLCB0YXJiYWxsKSk7XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgdGFyYmFsbCBmaWxlXG4gICAgICB1bmxpbmtTeW5jKHJlc29sdmUocGx1Z2luLnBhdGgsIHRhcmJhbGwpKTtcblxuICAgICAgLy8gV3JpdGUgdGhlIGJ1ZmZlciB0byB0aGUgb3V0cHV0IHBhdGhcbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihidWZmZXIpO1xuXG4gICAgICAvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQgcGF0aFxuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnBhdGgsIGAke3BsdWdpbi5pZGVudGlmaWVyfS5wbHVnaW5gKSxcbiAgICAgICAgZGVmbGF0ZVN5bmMoc3RyZWFtLmdldEJ1ZmZlcigpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgUGlwZWxpbmUsIERlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMgfTtcbiIsICJpbXBvcnQgeyBTZXJlbml0eSB9IGZyb20gXCJAc2VyZW5pdHlqcy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi9waXBlbGluZVwiO1xuaW1wb3J0IHsgUGx1Z2luVHlwZSB9IGZyb20gXCIuL2VudW1zXCI7XG5cbmludGVyZmFjZSBQbHVnaW5Qcm9wZXJ0aWVzIHtcbiAgbG9nZ2VyOiBMb2dnZXI7XG4gIHR5cGU6IFBsdWdpblR5cGU7XG4gIG9uSW5pdGlhbGl6ZTogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xuICBvblN0YXJ0VXA6IChwbHVnaW46IFBsdWdpbikgPT4gdm9pZDtcbiAgb25TaHV0RG93bjogKHBsdWdpbjogUGx1Z2luKSA9PiB2b2lkO1xufVxuXG5jbGFzcyBQbHVnaW4ge1xuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IFBsdWdpblR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRvIHRoZSBwbHVnaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGx1Z2luIGlzIGJ1bmRsZWQuXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBpc0J1bmRsZWQhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHBpcGVsaW5lIHRoZSBwbHVnaW4gaXMgaW4uXG4gICAqIEBOb3RlIFRoaXMgaXMgb25seSBhdmFpbGFibGUgYWZ0ZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZC5cbiAgICovXG4gIHB1YmxpYyBwaXBlbGluZSE6IFBpcGVsaW5lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VyZW5pdHkgaW5zdGFuY2Ugb2YgdGhlIHNlcnZlci5cbiAgICogQE5vdGUgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIHNlcmVuaXR5ITogU2VyZW5pdHk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBwbHVnaW4gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIHZlcnNpb246IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzPzogUGFydGlhbDxQbHVnaW5Qcm9wZXJ0aWVzPlxuICApIHtcbiAgICAvLyBTZXQgdGhlIGlkZW50aWZpZXIgYW5kIHZlcnNpb24gb2YgdGhlIHBsdWdpblxuICAgIHRoaXMuaWRlbnRpZmllciA9IGlkZW50aWZpZXI7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIC8vIFNldCB0aGUgbG9nZ2VyIGZvciB0aGUgcGx1Z2luXG4gICAgdGhpcy5sb2dnZXIgPVxuICAgICAgcHJvcGVydGllcz8ubG9nZ2VyID8/XG4gICAgICBuZXcgTG9nZ2VyKGAke2lkZW50aWZpZXJ9QCR7dmVyc2lvbn1gLCBMb2dnZXJDb2xvcnMuQmx1ZSk7XG5cbiAgICAvLyBTZXQgdGhlIHR5cGUgb2YgdGhlIHBsdWdpblxuICAgIHRoaXMudHlwZSA9IHByb3BlcnRpZXM/LnR5cGUgPz8gUGx1Z2luVHlwZS5BZGRvbjtcblxuICAgIC8vIFNldCB0aGUgb24gaW5pdGlhbGl6ZSwgc3RhcnQgdXAsIGFuZCBzaHV0IGRvd24gcHJvcGVydGllc1xuICAgIGlmIChwcm9wZXJ0aWVzPy5vbkluaXRpYWxpemUpIHRoaXMub25Jbml0aWFsaXplID0gcHJvcGVydGllcy5vbkluaXRpYWxpemU7XG4gICAgaWYgKHByb3BlcnRpZXM/Lm9uU3RhcnRVcCkgdGhpcy5vblN0YXJ0VXAgPSBwcm9wZXJ0aWVzLm9uU3RhcnRVcDtcbiAgICBpZiAocHJvcGVydGllcz8ub25TaHV0RG93bikgdGhpcy5vblNodXREb3duID0gcHJvcGVydGllcy5vblNodXREb3duO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBwYXJhbSBwbHVnaW4gVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHdhcyBpbml0aWFsaXplZC4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25Jbml0aWFsaXplKF9wbHVnaW46IHRoaXMpOiB2b2lkIHtcbiAgICAvLyBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiB5b3VyIHBsdWdpblxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgc3RhcnRlZCB1cC5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHN0YXJ0ZWQgdXAuICh0aGlzKVxuICAgKi9cbiAgcHVibGljIG9uU3RhcnRVcChfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIHNodXQgZG93bi5cbiAgICogQHBhcmFtIHBsdWdpbiBUaGUgcGx1Z2luIGluc3RhbmNlIHRoYXQgd2FzIHNodXQgZG93bi4gKHRoaXMpXG4gICAqL1xuICBwdWJsaWMgb25TaHV0RG93bihfcGx1Z2luOiB0aGlzKTogdm9pZCB7XG4gICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBwbHVnaW5cbiAgfVxufVxuXG5leHBvcnQgeyBQbHVnaW4sIFBsdWdpblByb3BlcnRpZXMgfTtcbiIsICIvKipcbiAqIFRoZSBwbHVnaW4gdHlwZSBkZWNsYXJlcyB0aGUgdXNlIGNhc2Ugb2YgdGhlIHBsdWdpbi5cbiAqL1xuZW51bSBQbHVnaW5UeXBlIHtcbiAgLyoqXG4gICAqIEFuIGFkZG9uIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgYW4gZXhwb3NlZCBBUEkuXG4gICAqL1xuICBBZGRvbixcblxuICAvKipcbiAgICogQW4gQVBJIHBsdWdpbiB0eXBlIGFkZHMgYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBzZXJ2ZXIsIHdpdGggYW4gZXhwb3NlZCBBUEkgZm9yIG90aGVyIHBsdWdpbnMgdG8gdXNlLlxuICAgKi9cbiAgQXBpXG59XG5cbmV4cG9ydCB7IFBsdWdpblR5cGUgfTtcbiIsICJpbXBvcnQgeyByZWxhdGl2ZSB9IGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFdvcmxkIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcbmltcG9ydCB7IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwgfSBmcm9tIFwiQHNlcmVuaXR5anMvcHJvdG9jb2xcIjtcblxuaW1wb3J0IHsgUGlwZWxpbmUgfSBmcm9tIFwiLi4vcGlwZWxpbmVcIjtcblxuaW1wb3J0IHsgUGx1Z2luQWN0aW9uc0VudW0sIFBsdWdpbnNFbnVtIH0gZnJvbSBcIi4vZW51bVwiO1xuXG5jb25zdCByZWdpc3RlciA9ICh3b3JsZDogV29ybGQsIHBpcGVsaW5lOiBQaXBlbGluZSkgPT4ge1xuICB3b3JsZC5jb21tYW5kcy5yZWdpc3RlcihcbiAgICBcInBsdWdpbnNcIixcbiAgICBcIkludGVyYWN0IHdpdGggdGhlIHBsdWdpbnMgb2YgdGhlIHNlcnZlclwiLFxuICAgIChyZWdpc3RyeSkgPT4ge1xuICAgICAgLy8gU2V0IHRoZSBjb21tYW5kIHRvIGJlIGFuIG9wZXJhdG9yIGNvbW1hbmRcbiAgICAgIHJlZ2lzdHJ5LnBlcm1pc3Npb25MZXZlbCA9IENvbW1hbmRQZXJtaXNzaW9uTGV2ZWwuT3BlcmF0b3I7XG5cbiAgICAgIC8vIE92ZXJsb2FkIGZvciBsaXN0aW5nIHRoZSBwbHVnaW5zXG4gICAgICByZWdpc3RyeS5vdmVybG9hZChcbiAgICAgICAge1xuICAgICAgICAgIGFjdGlvbjogUGx1Z2luQWN0aW9uc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uIH0pID0+IHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWN0aW9uIGlzIGxpc3RcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCAhPT0gXCJsaXN0XCIpIHJldHVybjtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwaXBlbGluZSBoYXMgbm8gcGx1Z2luc1xuICAgICAgICAgIGlmIChwaXBlbGluZS5wbHVnaW5zLnNpemUgPT09IDApXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBtZXNzYWdlOiBcIsKnY1RoZXJlIGFyZSBjdXJyZW50IG5vIHBsdWdpbnMgbG9hZGVkIG9uIHRoZSBzZXJ2ZXIuXCJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBsdWdpbnMgZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5zID0gWy4uLnBpcGVsaW5lLnBsdWdpbnMudmFsdWVzKCldO1xuXG4gICAgICAgICAgLy8gUHJlcGFyZSB0aGUgbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXTtcblxuICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgcGx1Z2luc1xuICAgICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBsdWdpbiBuYW1lIHRvIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICBtZXNzYWdlLnB1c2goYMKndSR7cGx1Z2luLmlkZW50aWZpZXJ9IHYke3BsdWdpbi52ZXJzaW9ufcKncmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgwqc3QWN0aXZlIFBsdWdpbnMgKCR7cGx1Z2lucy5sZW5ndGh9KTrCp3IgJHttZXNzYWdlLmpvaW4oXCLCpzcswqdyIFwiKX1gXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmVnaXN0cnkub3ZlcmxvYWQoXG4gICAgICAgIHtcbiAgICAgICAgICBhY3Rpb246IFBsdWdpbkFjdGlvbnNFbnVtLFxuICAgICAgICAgIHBsdWdpbjogUGx1Z2luc0VudW1cbiAgICAgICAgfSxcbiAgICAgICAgKHsgYWN0aW9uLCBwbHVnaW4gfSkgPT4ge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3Rpb24gaXMgcmVsb2FkXG4gICAgICAgICAgaWYgKGFjdGlvbi5yZXN1bHQgIT09IFwicmVsb2FkXCIgJiYgYWN0aW9uLnJlc3VsdCAhPT0gXCJidW5kbGVcIikgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gR2V0IHRoZSBwbHVnaW4gZnJvbSB0aGUgcGlwZWxpbmVcbiAgICAgICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBpcGVsaW5lLnBsdWdpbnMuZ2V0KHBsdWdpbi5yZXN1bHQgYXMgc3RyaW5nKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgbm90IGZvdW5kXG4gICAgICAgICAgaWYgKCFwbHVnaW5JbnN0YW5jZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luICR7cGx1Z2luLnJlc3VsdH0gaXMgbm90IGZvdW5kLmApO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFjdGlvbiBpcyByZWxvYWRcbiAgICAgICAgICBpZiAoYWN0aW9uLnJlc3VsdCA9PT0gXCJyZWxvYWRcIikge1xuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBwbHVnaW5cbiAgICAgICAgICAgIHBpcGVsaW5lLnJlbG9hZChwbHVnaW5JbnN0YW5jZSk7XG5cbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIG9yaWdpblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbWVzc2FnZTogYMKnYVN1Y2Nlc3NmdWxseSByZWxvYWRlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwbHVnaW5JbnN0YW5jZS5pc0J1bmRsZWQpXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwbHVnaW4gaXMgYWxyZWFkeSBidW5kbGVkXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgUGx1Z2luICR7cGx1Z2luSW5zdGFuY2UuaWRlbnRpZmllcn0gY2Fubm90IGJlIGJ1bmRsZWQsIGFzIGl0IGlzIGFscmVhZHkgYSBidW5kbGVkIHBsdWdpbi5gXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIEJ1bmRsZSB0aGUgcGx1Z2luXG4gICAgICAgICAgICBwaXBlbGluZS5idW5kbGUocGx1Z2luSW5zdGFuY2UpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBvcmlnaW5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGDCp2FTdWNjZXNzZnVsbHkgYnVuZGxlZCDCpzIke3BsdWdpbkluc3RhbmNlLmlkZW50aWZpZXJ9wqdhLCBvdXRwdXQgZmlsZSB3YXMgcGxhY2VkIGF0IMKnNyR7cmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGlwZWxpbmUucGF0aCl9wqdhLmBcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gb3ZlcmxvYWQgbWF0Y2hlZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlwiKTtcbiAgICB9XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZWdpc3RlcjtcbiIsICJpbXBvcnQgeyBDdXN0b21FbnVtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2NvcmVcIjtcblxuY2xhc3MgUGx1Z2luc0VudW0gZXh0ZW5kcyBDdXN0b21FbnVtIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBpZGVudGlmaWVyID0gXCJwbHVnaW5zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG5jbGFzcyBQbHVnaW5BY3Rpb25zRW51bSBleHRlbmRzIEN1c3RvbUVudW0ge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGlkZW50aWZpZXIgPSBcInBsdWdpbl9hY3Rpb25zXCI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgb3B0aW9uczogQXJyYXk8c3RyaW5nPiA9IFtcImxpc3RcIiwgXCJyZWxvYWRcIiwgXCJidW5kbGVcIl07XG59XG5cbmV4cG9ydCB7IFBsdWdpbnNFbnVtLCBQbHVnaW5BY3Rpb25zRW51bSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIm9VQUNBLE9BQ0VBLGNBQUFBLEVBQ0FDLGFBQUFBLEVBQ0FDLGVBQUFBLEVBQ0FDLGdCQUFBQSxFQUNBQyxjQUFBQSxFQUNBQyxjQUFBQSxFQUNBQyxpQkFBQUEsTUFDSyxVQUNQLE9BQVNDLFlBQUFBLEVBQVVDLFdBQUFBLE1BQWUsWUFDbEMsT0FBU0MsZUFBQUEsRUFBYUMsZUFBQUEsTUFBbUIsWUFDekMsT0FBU0MsWUFBQUEsTUFBZ0IscUJBRXpCLE9BQVNDLFVBQUFBLEVBQVFDLGdCQUFBQSxNQUFvQixxQkFDckMsT0FBbUJDLGVBQUFBLEVBQWFDLGNBQUFBLE1BQWtCLG1CQUNsRCxPQUFTQyxnQkFBQUEsTUFBb0IsMkJDZjdCLE9BQVNDLFVBQUFBLEVBQVFDLGdCQUFBQSxNQUFvQixxQkNFckMsSUFBS0MsRUFBQUEsU0FBQUEsRUFBQUEsQ0FHRixPQUFBQSxFQUFBQSxFQUFBLE1BQUEsQ0FBQSxFQUFBLFFBS0FBLEVBQUFBLEVBQUEsSUFBQSxDQUFBLEVBQUEsTUFSRUEsR0FBQUEsR0FBQUEsQ0FBQUEsQ0FBQUEsRURXTCxJQUFNQyxFQUFOLEtBQU1BLENBYk4sTUFhTUEsQ0FBQUEsRUFBQUEsZUFJWUMsV0FLQUMsUUFLQUMsT0FLQUMsS0FNVEMsS0FNQUMsVUFNQUMsU0FNQUMsU0FRUCxZQUNFUCxFQUNBQyxFQUNBTyxFQUNBLENBRUEsS0FBS1IsV0FBYUEsRUFDbEIsS0FBS0MsUUFBVUEsRUFHZixLQUFLQyxPQUNITSxHQUFZTixRQUNaLElBQUlPLEVBQU8sR0FBR1QsQ0FBQUEsSUFBY0Ms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QyxFQUFPVixPQUFTRSxFQUFXMEIsSUFBSyxDQUV6Q0UsRUFBUyxXQUFZLENBQUViLElBQUtQLEVBQU8zRCxLQUFNZ0YsTUFBTyxRQUFTLENBQUEsRUFHekQsSUFBTTBCLEVBQVV0RSxFQUFZdUIsRUFBTzNELElBQUksRUFBRTJHLEtBQU1DLEdBQzdDQSxFQUFLbEUsU0FBUyxNQUFBLENBQUEsRUFJaEIsR0FBSSxDQUFDZ0UsRUFBUyxNQUFNLElBQUl6RixNQUFNLDJCQUFBLEVBRzlCLElBQU0yQixFQUFTRSxFQUFhZCxFQUFRMkIsRUFBTzNELEtBQU0wRyxDQUFBQSxDQUFBQSxFQUdqRDVCLEVBQVc5QyxFQUFRMkIsRUFBTzNELEtBQU0wRyxDQUFBQSxDQUFBQSxFQUdoQzNELEVBQU93RCxZQUFZM0QsQ0FBQUEsRUFHbkJjLEVBQ0UxQixFQUFRLEtBQUtoQyxLQUFNLEdBQUcyRCxFQUFPUyxVQUFVLFNBQVMsRUFDaERvQyxFQUFZekQsRUFBTzBELFVBQVMsQ0FBQSxDQUFBLENBRWhDLENBQ0YsQ0FDRiIsCiAgIm5hbWVzIjogWyJleGlzdHNTeW5jIiwgIm1rZGlyU3luYyIsICJyZWFkZGlyU3luYyIsICJyZWFkRmlsZVN5bmMiLCAicmVuYW1lU3luYyIsICJ1bmxpbmtTeW5jIiwgIndyaXRlRmlsZVN5bmMiLCAicmVsYXRpdmUiLCAicmVzb2x2ZSIsICJkZWZsYXRlU3luYyIsICJpbmZsYXRlU3luYyIsICJleGVjU3luYyIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlNlcnZlckV2ZW50IiwgIldvcmxkRXZlbnQiLCAiQmluYXJ5U3RyZWFtIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiUGx1Z2luVHlwZSIsICJQbHVnaW4iLCAiaWRlbnRpZmllciIsICJ2ZXJzaW9uIiwgImxvZ2dlciIsICJ0eXBlIiwgInBhdGgiLCAiaXNCdW5kbGVkIiwgInBpcGVsaW5lIiwgInNlcmVuaXR5IiwgInByb3BlcnRpZXMiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJCbHVlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAib25Jbml0aWFsaXplIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgIl9wbHVnaW4iLCAicmVsYXRpdmUiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJDdXN0b21FbnVtIiwgIlBsdWdpbnNFbnVtIiwgIkN1c3RvbUVudW0iLCAiaWRlbnRpZmllciIsICJvcHRpb25zIiwgIlBsdWdpbkFjdGlvbnNFbnVtIiwgInJlZ2lzdGVyIiwgIl9fbmFtZSIsICJ3b3JsZCIsICJwaXBlbGluZSIsICJjb21tYW5kcyIsICJyZWdpc3RyeSIsICJwZXJtaXNzaW9uTGV2ZWwiLCAiQ29tbWFuZFBlcm1pc3Npb25MZXZlbCIsICJPcGVyYXRvciIsICJvdmVybG9hZCIsICJhY3Rpb24iLCAiUGx1Z2luQWN0aW9uc0VudW0iLCAicmVzdWx0IiwgInBsdWdpbnMiLCAic2l6ZSIsICJtZXNzYWdlIiwgInZhbHVlcyIsICJwbHVnaW4iLCAicHVzaCIsICJpZGVudGlmaWVyIiwgInZlcnNpb24iLCAibGVuZ3RoIiwgImpvaW4iLCAiUGx1Z2luc0VudW0iLCAicGx1Z2luSW5zdGFuY2UiLCAiZ2V0IiwgIkVycm9yIiwgInJlbG9hZCIsICJpc0J1bmRsZWQiLCAiYnVuZGxlIiwgInJlbGF0aXZlIiwgInByb2Nlc3MiLCAiY3dkIiwgInBhdGgiLCAiY29tbWFuZF9kZWZhdWx0IiwgIkRlZmF1bHRQaXBlbGluZVByb3BlcnRpZXMiLCAicGF0aCIsICJjb21tYW5kcyIsICJQaXBlbGluZSIsICJzZXJlbml0eSIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkN5YW5CcmlnaHQiLCAicGx1Z2lucyIsICJNYXAiLCAidGVtcFBhdGhzIiwgIlNldCIsICJlc20iLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiXyIsICJFcnJvciIsICJvbiIsICJTZXJ2ZXJFdmVudCIsICJTdGFydCIsICJzdGFydCIsICJiaW5kIiwgIlN0b3AiLCAic3RvcCIsICJXb3JsZEV2ZW50IiwgIldvcmxkSW5pdGlhbGl6ZSIsICJ3b3JsZCIsICJDb21tYW5kIiwgImluaXRpYWxpemUiLCAiY29tcGxldGUiLCAiZXhpc3RzU3luYyIsICJyZXNvbHZlIiwgIm1rZGlyU3luYyIsICJyZWN1cnNpdmUiLCAiYnVuZGxlcyIsICJyZWFkZGlyU3luYyIsICJ3aXRoRmlsZVR5cGVzIiwgImZpbHRlciIsICJkaXJlbnQiLCAiaXNGaWxlIiwgIm5hbWUiLCAiZW5kc1dpdGgiLCAiYnVuZGxlIiwgImJ1ZmZlciIsICJpbmZsYXRlU3luYyIsICJyZWFkRmlsZVN5bmMiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJ0eXBlIiwgInJlYWRCeXRlIiwgIlBsdWdpblR5cGUiLCAiQWRkb24iLCAiaW5kZXgiLCAicmVhZFJlbWFpbmluZ0J1ZmZlciIsICJ0b1N0cmluZyIsICJ0ZW1wUGF0aCIsICJzbGljZSIsICJ3cml0ZUZpbGVTeW5jIiwgInBsdWdpbiIsICJyZXF1aXJlIiwgImRlZmF1bHQiLCAiUGx1Z2luIiwgIndhcm4iLCAicmVsYXRpdmUiLCAicHJvY2VzcyIsICJjd2QiLCAiaGFzIiwgImlkZW50aWZpZXIiLCAicGlwZWxpbmUiLCAiaXNCdW5kbGVkIiwgInNldCIsICJvbkluaXRpYWxpemUiLCAiUGx1Z2luc0VudW0iLCAib3B0aW9ucyIsICJwdXNoIiwgImFkZCIsICJBcGkiLCAidW5saW5rU3luYyIsICJleGVjU3luYyIsICJzdGRpbyIsICJyZW5hbWVTeW5jIiwgInJlYXNvbiIsICJlcnJvciIsICJkaXJlY3RvcmllcyIsICJpc0RpcmVjdG9yeSIsICJkaXJlY3RvcnkiLCAibWFuaWZlc3QiLCAiSlNPTiIsICJwYXJzZSIsICJtYWluIiwgInZlcnNpb24iLCAidmFsdWVzIiwgIm9uU3RhcnRVcCIsICJvblNodXREb3duIiwgInJlbG9hZCIsICJkZWxldGUiLCAiY2FjaGUiLCAicmVtb3ZlUGF0aCIsICJyUGx1Z2luIiwgImluZm8iLCAid3JpdGVCeXRlIiwgImlucHV0UGF0aCIsICJ3cml0ZUJ1ZmZlciIsICJkZWZsYXRlU3luYyIsICJnZXRCdWZmZXIiLCAidGFyYmFsbCIsICJmaW5kIiwgImZpbGUiXQp9Cg==
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@serenityjs/plugins",
3
3
  "author": "Serenity",
4
4
  "license": "MIT",
5
- "version": "0.6.1-beta-20241119163501",
5
+ "version": "0.6.1",
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": "0.6.1-beta-20241119163501",
23
+ "@serenityjs/internal-config": "*",
24
24
  "@swc/core": "1.7.42",
25
25
  "@types/node": "22.8.6",
26
26
  "eslint": "9.13.0",
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@serenityjs/binarystream": "^2.6.6",
32
- "@serenityjs/core": "0.6.1-beta-20241119163501",
33
- "@serenityjs/logger": "0.6.1-beta-20241119163501",
34
- "@serenityjs/protocol": "0.6.1-beta-20241119163501"
32
+ "@serenityjs/core": "*",
33
+ "@serenityjs/logger": "*",
34
+ "@serenityjs/protocol": "*"
35
35
  }
36
36
  }