@dockstat/sqlite-wrapper 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js DELETED
@@ -1,28 +0,0 @@
1
- // @bun
2
- import{Database as C}from"bun:sqlite";class P{state;constructor(M,X,Y){this.state={db:M,tableName:X,whereConditions:[],whereParams:[],regexConditions:[],jsonColumns:Y?.jsonColumns}}getDb(){return this.state.db}getTableName(){return this.state.tableName}buildWhereClause(){if(this.state.whereConditions.length===0)return["",[]];return[` WHERE ${this.state.whereConditions.join(" AND ")}`,this.state.whereParams.slice()]}hasRegexConditions(){return this.state.regexConditions.length>0}applyRegexFiltering(M){if(this.state.regexConditions.length===0)return M;return M.filter((X)=>this.state.regexConditions.every(({column:Y,regex:Z})=>{let _=X[String(Y)];if(_===null||_===void 0)return!1;return Z.test(String(_))}))}requireWhereClause(M){if(this.state.whereConditions.length===0&&this.state.regexConditions.length===0)throw new Error(`${M} operation requires at least one WHERE condition. Use where(), whereRaw(), whereIn(), whereOp(), or whereRgx() to add conditions.`)}quoteIdentifier(M){return`"${M.replace(/"/g,'""')}"`}resetWhereConditions(){this.state.whereConditions=[],this.state.whereParams=[],this.state.regexConditions=[]}transformRowFromDb(M){if(!this.state.jsonColumns||!M)return M;let X={...M};for(let Y of this.state.jsonColumns){let Z=String(Y);if(X[Z]&&typeof X[Z]==="string")try{X[Z]=JSON.parse(X[Z])}catch{}}return X}transformRowsFromDb(M){if(!this.state.jsonColumns)return M;return M.map((X)=>this.transformRowFromDb(X))}transformRowToDb(M){if(!this.state.jsonColumns||!M)return M;let X={...M};for(let Y of this.state.jsonColumns){let Z=String(Y);if(X[Z]!==void 0&&X[Z]!==null){if(typeof X[Z]==="object")X[Z]=JSON.stringify(X[Z])}}return X}}class R extends P{where(M){for(let[X,Y]of Object.entries(M))if(Y===null||Y===void 0)this.state.whereConditions.push(`${String(X)} IS NULL`);else this.state.whereConditions.push(`${String(X)} = ?`),this.state.whereParams.push(Y);return this}whereRgx(M){for(let[X,Y]of Object.entries(M))if(Y instanceof RegExp)this.state.regexConditions.push({column:X,regex:Y});else if(typeof Y==="string")this.state.regexConditions.push({column:X,regex:new RegExp(Y)});else if(Y!==null&&Y!==void 0)this.state.whereConditions.push(`${String(X)} = ?`),this.state.whereParams.push(Y);return this}whereExpr(M,X=[]){if(!M||typeof M!=="string")throw new Error("whereExpr: expr must be a non-empty string");if(this.state.whereConditions.push(`(${M})`),X.length)this.state.whereParams.push(...X);return this}whereRaw(M,X=[]){return this.whereExpr(M,X)}whereIn(M,X){if(!Array.isArray(X)||X.length===0)throw new Error("whereIn: values must be a non-empty array");let Y=X.map(()=>"?").join(", ");return this.state.whereConditions.push(`${String(M)} IN (${Y})`),this.state.whereParams.push(...X),this}whereNotIn(M,X){if(!Array.isArray(X)||X.length===0)throw new Error("whereNotIn: values must be a non-empty array");let Y=X.map(()=>"?").join(", ");return this.state.whereConditions.push(`${String(M)} NOT IN (${Y})`),this.state.whereParams.push(...X),this}whereOp(M,X,Y){let Z=(X??"").toUpperCase().trim();if(!["=","!=","<>","<","<=",">",">=","LIKE","GLOB","IS","IS NOT"].includes(Z))throw new Error(`whereOp: operator "${X}" not supported`);if((Y===null||Y===void 0)&&(Z==="="||Z==="IS"))return this.state.whereConditions.push(`${String(M)} IS NULL`),this;if((Y===null||Y===void 0)&&(Z==="!="||Z==="<>"||Z==="IS NOT"))return this.state.whereConditions.push(`${String(M)} IS NOT NULL`),this;return this.state.whereConditions.push(`${String(M)} ${Z} ?`),this.state.whereParams.push(Y),this}whereBetween(M,X,Y){return this.state.whereConditions.push(`${String(M)} BETWEEN ? AND ?`),this.state.whereParams.push(X,Y),this}whereNotBetween(M,X,Y){return this.state.whereConditions.push(`${String(M)} NOT BETWEEN ? AND ?`),this.state.whereParams.push(X,Y),this}whereNull(M){return this.state.whereConditions.push(`${String(M)} IS NULL`),this}whereNotNull(M){return this.state.whereConditions.push(`${String(M)} IS NOT NULL`),this}}class B extends R{selectedColumns=["*"];orderColumn;orderDirection="ASC";limitValue;offsetValue;select(M){return this.selectedColumns=M,this}orderBy(M){return this.orderColumn=M,this}desc(){return this.orderDirection="DESC",this}asc(){return this.orderDirection="ASC",this}limit(M){if(M<0)throw new Error("limit: amount must be non-negative");return this.limitValue=M,this}offset(M){if(M<0)throw new Error("offset: start must be non-negative");return this.offsetValue=M,this}buildSelectQuery(M=!0){let Y=`SELECT ${this.selectedColumns[0]==="*"?"*":this.selectedColumns.join(", ")} FROM ${this.quoteIdentifier(this.getTableName())}`,[Z,_]=this.buildWhereClause();if(Y+=Z,M&&!this.hasRegexConditions()){if(this.orderColumn)Y+=` ORDER BY ${String(this.orderColumn)} ${this.orderDirection}`;if(this.limitValue!==void 0)Y+=` LIMIT ${this.limitValue}`;if(this.offsetValue!==void 0)Y+=` OFFSET ${this.offsetValue}`}return[Y,_]}applyClientSideOperations(M){if(!this.hasRegexConditions())return M;let X=this.applyRegexFiltering(M);if(this.orderColumn){let Z=String(this.orderColumn);X.sort((_,$)=>{let H=_[Z],J=$[Z];if(H===J)return 0;if(H===null||H===void 0)return-1;if(J===null||J===void 0)return 1;if(H<J)return this.orderDirection==="ASC"?-1:1;return this.orderDirection==="ASC"?1:-1})}let Y=this.offsetValue??0;if(this.limitValue!==void 0)X=X.slice(Y,Y+this.limitValue);else if(Y>0)X=X.slice(Y);return X}all(){if(!this.hasRegexConditions()){let[_,$]=this.buildSelectQuery(!0),H=this.getDb().prepare(_).all(...$);return this.transformRowsFromDb(H)}let[M,X]=this.buildSelectQuery(!1),Y=this.getDb().prepare(M).all(...X),Z=this.transformRowsFromDb(Y);return this.applyClientSideOperations(Z)}get(){if(!this.hasRegexConditions()&&this.limitValue===void 0){let[X,Y]=this.buildSelectQuery(!0),Z=X.includes("LIMIT")?X:`${X} LIMIT 1`,_=this.getDb().prepare(Z).get(...Y);return _?this.transformRowFromDb(_):null}if(!this.hasRegexConditions()&&this.limitValue!==void 0){let[X,Y]=this.buildSelectQuery(!0),Z=this.getDb().prepare(X).get(...Y);return Z?this.transformRowFromDb(Z):null}return this.all()[0]??null}first(){let M=this.limitValue;this.limitValue=1;let X=this.get();return this.limitValue=M,X}count(){if(!this.hasRegexConditions()){let[M,X]=this.buildSelectQuery(!0),Y=M.replace(/SELECT (.+?) FROM/i,"SELECT COUNT(*) AS __count FROM");return this.getDb().prepare(Y).get(...X)?.__count??0}return this.all().length}exists(){if(!this.hasRegexConditions()){let[M,X]=this.buildSelectQuery(!0),Y=`SELECT EXISTS(${M}) AS __exists`,Z=this.getDb().prepare(Y).get(...X);return Boolean(Z?.__exists)}return this.count()>0}value(M){let X=this.first();return X?X[M]:null}pluck(M){return this.all().map((Y)=>Y[M])}}class L extends R{insert(M,X){let Z=(Array.isArray(M)?M:[M]).map((K)=>this.transformRowToDb(K));if(Z.length===0)throw new Error("insert: data cannot be empty");let _=new Set;for(let K of Z)for(let k of Object.keys(K))_.add(k);let $=Array.from(_);if($.length===0)throw new Error("insert: no columns to insert");let H="INSERT";if(X?.orIgnore)H="INSERT OR IGNORE";else if(X?.orReplace)H="INSERT OR REPLACE";else if(X?.orAbort)H="INSERT OR ABORT";else if(X?.orFail)H="INSERT OR FAIL";else if(X?.orRollback)H="INSERT OR ROLLBACK";let J=$.map((K)=>this.quoteIdentifier(K)).join(", "),F=$.map(()=>"?").join(", "),G=`${H} INTO ${this.quoteIdentifier(this.getTableName())} (${J}) VALUES (${F})`,A=this.getDb().prepare(G),W=0,z=0;for(let K of Z){let k=$.map((j)=>K[j]??null),O=A.run(...k);if(W+=O.changes,O.lastInsertRowid)z=Number(O.lastInsertRowid)}return{insertId:z,changes:W}}insertOrIgnore(M){return this.insert(M,{orIgnore:!0})}insertOrReplace(M){return this.insert(M,{orReplace:!0})}insertOrAbort(M){return this.insert(M,{orAbort:!0})}insertOrFail(M){return this.insert(M,{orFail:!0})}insertOrRollback(M){return this.insert(M,{orRollback:!0})}insertAndGet(M,X){let Y=this.insert(M,X);if(Y.changes===0)return null;if(Y.insertId>0)try{let Z=this.getDb().prepare(`SELECT * FROM ${this.quoteIdentifier(this.getTableName())} WHERE rowid = ?`).get(Y.insertId);return Z?this.transformRowFromDb(Z):null}catch{return null}return null}insertBatch(M,X){if(!Array.isArray(M)||M.length===0)throw new Error("insertBatch: rows must be a non-empty array");let Y=this.getDb();return Y.transaction((_)=>{let $=0,H=0,J=_.map((O)=>this.transformRowToDb(O)),F=new Set;for(let O of J)for(let j of Object.keys(O))F.add(j);let G=Array.from(F);if(G.length===0)throw new Error("insertBatch: no columns to insert");let A="INSERT";if(X?.orIgnore)A="INSERT OR IGNORE";else if(X?.orReplace)A="INSERT OR REPLACE";else if(X?.orAbort)A="INSERT OR ABORT";else if(X?.orFail)A="INSERT OR FAIL";else if(X?.orRollback)A="INSERT OR ROLLBACK";let W=G.map((O)=>this.quoteIdentifier(O)).join(", "),z=G.map(()=>"?").join(", "),K=`${A} INTO ${this.quoteIdentifier(this.getTableName())} (${W}) VALUES (${z})`,k=Y.prepare(K);for(let O of J){let j=G.map((I)=>O[I]??null),E=k.run(...j);if($+=E.changes,E.lastInsertRowid)H=Number(E.lastInsertRowid)}return{insertId:H,changes:$}})(M)}}class S extends B{update(M){this.requireWhereClause("UPDATE");let X=this.transformRowToDb(M),Y=Object.keys(X);if(Y.length===0)throw new Error("update: no columns to update");if(this.hasRegexConditions())return this.updateWithRegexConditions(X);let Z=Y.map((A)=>`${this.quoteIdentifier(A)} = ?`).join(", "),[_,$]=this.buildWhereClause(),H=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${Z}${_}`,F=[...Y.map((A)=>X[A]),...$];return{changes:this.getDb().prepare(H).run(...F).changes}}updateWithRegexConditions(M){let[X,Y]=this.buildWhereClause(),Z=this.getDb().prepare(`SELECT rowid, * FROM ${this.quoteIdentifier(this.getTableName())}${X}`).all(...Y),_=this.applyRegexFiltering(Z);if(_.length===0)return{changes:0};let $=Object.keys(M),H=$.map((W)=>`${this.quoteIdentifier(W)} = ?`).join(", "),J=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${H} WHERE rowid = ?`,F=this.getDb().prepare(J),G=0,A=$.map((W)=>M[W]);for(let W of _){let z=F.run(...A,W.rowid);G+=z.changes}return{changes:G}}upsert(M){let X=this.transformRowToDb(M),Y=Object.keys(X);if(Y.length===0)throw new Error("upsert: no columns to upsert");let Z=Y.map((F)=>this.quoteIdentifier(F)).join(", "),_=Y.map(()=>"?").join(", "),$=`INSERT OR REPLACE INTO ${this.quoteIdentifier(this.getTableName())} (${Z}) VALUES (${_})`,H=Y.map((F)=>X[F]??null);return{changes:this.getDb().prepare($).run(...H).changes}}increment(M,X=1){this.requireWhereClause("INCREMENT");let[Y,Z]=this.buildWhereClause(),_=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = ${this.quoteIdentifier(String(M))} + ?${Y}`;return{changes:this.getDb().prepare(_).run(X,...Z).changes}}decrement(M,X=1){return this.increment(M,-X)}updateAndGet(M){let X=this.all();if(this.update(M).changes===0)return[];return X}updateBatch(M){if(!Array.isArray(M)||M.length===0)throw new Error("updateBatch: updates must be a non-empty array");let X=this.getDb();return X.transaction((Z)=>{let _=0;for(let{where:$,data:H}of Z){let J=this.transformRowToDb(H),F=Object.keys(J);if(F.length===0)continue;let G=[],A=[];for(let[E,I]of Object.entries($))if(I===null||I===void 0)G.push(`${this.quoteIdentifier(E)} IS NULL`);else G.push(`${this.quoteIdentifier(E)} = ?`),A.push(I);if(G.length===0)throw new Error("updateBatch: each update must have WHERE conditions");let W=F.map((E)=>`${this.quoteIdentifier(E)} = ?`).join(", "),z=` WHERE ${G.join(" AND ")}`,K=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${W}${z}`,O=[...F.map((E)=>J[E]??null),...A],j=X.prepare(K).run(...O);_+=j.changes}return{changes:_}})(M)}}class Q extends B{delete(){if(this.requireWhereClause("DELETE"),this.hasRegexConditions())return this.deleteWithRegexConditions();let[M,X]=this.buildWhereClause(),Y=`DELETE FROM ${this.quoteIdentifier(this.getTableName())}${M}`;return{changes:this.getDb().prepare(Y).run(...X).changes}}deleteWithRegexConditions(){let[M,X]=this.buildWhereClause(),Y=this.getDb().prepare(`SELECT rowid, * FROM ${this.quoteIdentifier(this.getTableName())}${M}`).all(...X),Z=this.applyRegexFiltering(Y);if(Z.length===0)return{changes:0};let _=`DELETE FROM ${this.quoteIdentifier(this.getTableName())} WHERE rowid = ?`,$=this.getDb().prepare(_),H=0;for(let J of Z){let F=$.run(J.rowid);H+=F.changes}return{changes:H}}deleteAndGet(){let M=this.all();if(this.delete().changes===0)return[];return M}softDelete(M="deleted_at",X=Math.floor(Date.now()/1000)){if(this.requireWhereClause("SOFT DELETE"),this.hasRegexConditions())return this.softDeleteWithRegexConditions(M,X);let[Y,Z]=this.buildWhereClause(),_=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = ?${Y}`;return{changes:this.getDb().prepare(_).run(X,...Z).changes}}softDeleteWithRegexConditions(M,X){let[Y,Z]=this.buildWhereClause(),_=this.getDb().prepare(`SELECT rowid, * FROM ${this.quoteIdentifier(this.getTableName())}${Y}`).all(...Z),$=this.applyRegexFiltering(_);if($.length===0)return{changes:0};let H=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = ? WHERE rowid = ?`,J=this.getDb().prepare(H),F=0;for(let G of $){let A=J.run(X,G.rowid);F+=A.changes}return{changes:F}}restore(M="deleted_at"){if(this.requireWhereClause("RESTORE"),this.hasRegexConditions())return this.restoreWithRegexConditions(M);let[X,Y]=this.buildWhereClause(),Z=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = NULL${X}`;return{changes:this.getDb().prepare(Z).run(...Y).changes}}restoreWithRegexConditions(M){let[X,Y]=this.buildWhereClause(),Z=this.getDb().prepare(`SELECT rowid, * FROM ${this.quoteIdentifier(this.getTableName())}${X}`).all(...Y),_=this.applyRegexFiltering(Z);if(_.length===0)return{changes:0};let $=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = NULL WHERE rowid = ?`,H=this.getDb().prepare($),J=0;for(let F of _){let G=H.run(F.rowid);J+=G.changes}return{changes:J}}deleteBatch(M){if(!Array.isArray(M)||M.length===0)throw new Error("deleteBatch: conditions must be a non-empty array");let X=this.getDb();return X.transaction((Z)=>{let _=0;for(let $ of Z){let H=[],J=[];for(let[W,z]of Object.entries($))if(z===null||z===void 0)H.push(`${this.quoteIdentifier(W)} IS NULL`);else H.push(`${this.quoteIdentifier(W)} = ?`),J.push(z);if(H.length===0)throw new Error("deleteBatch: each delete must have WHERE conditions");let F=` WHERE ${H.join(" AND ")}`,G=`DELETE FROM ${this.quoteIdentifier(this.getTableName())}${F}`,A=X.prepare(G).run(...J);_+=A.changes}return{changes:_}})(M)}truncate(){let M=`DELETE FROM ${this.quoteIdentifier(this.getTableName())}`;return{changes:this.getDb().prepare(M).run().changes}}deleteOlderThan(M,X){return this.whereOp(M,"<",X).delete()}deleteDuplicates(M){if(!Array.isArray(M)||M.length===0)throw new Error("deleteDuplicates: columns must be a non-empty array");let Y=M.map(($)=>String($)).map(($)=>this.quoteIdentifier($)).join(", "),Z=`
3
- DELETE FROM ${this.quoteIdentifier(this.getTableName())}
4
- WHERE rowid NOT IN (
5
- SELECT MIN(rowid)
6
- FROM ${this.quoteIdentifier(this.getTableName())}
7
- GROUP BY ${Y}
8
- )
9
- `;return{changes:this.getDb().prepare(Z).run().changes}}}class q{selectBuilder;insertBuilder;updateBuilder;deleteBuilder;constructor(M,X,Y){this.selectBuilder=new B(M,X,Y),this.insertBuilder=new L(M,X,Y),this.updateBuilder=new S(M,X,Y),this.deleteBuilder=new Q(M,X,Y),this.syncBuilderStates()}syncBuilderStates(){let M=this.selectBuilder.state;this.insertBuilder.state=M,this.updateBuilder.state=M,this.deleteBuilder.state=M}where(M){return this.selectBuilder.where(M),this}whereRgx(M){return this.selectBuilder.whereRgx(M),this}whereExpr(M,X=[]){return this.selectBuilder.whereExpr(M,X),this}whereRaw(M,X=[]){return this.selectBuilder.whereRaw(M,X),this}whereIn(M,X){return this.selectBuilder.whereIn(M,X),this}whereNotIn(M,X){return this.selectBuilder.whereNotIn(M,X),this}whereOp(M,X,Y){return this.selectBuilder.whereOp(M,X,Y),this}whereBetween(M,X,Y){return this.selectBuilder.whereBetween(M,X,Y),this}whereNotBetween(M,X,Y){return this.selectBuilder.whereNotBetween(M,X,Y),this}whereNull(M){return this.selectBuilder.whereNull(M),this}whereNotNull(M){return this.selectBuilder.whereNotNull(M),this}select(M){return this.selectBuilder.select(M),this}orderBy(M){return this.selectBuilder.orderBy(M),this}desc(){return this.selectBuilder.desc(),this}asc(){return this.selectBuilder.asc(),this}limit(M){return this.selectBuilder.limit(M),this}offset(M){return this.selectBuilder.offset(M),this}all(){return this.selectBuilder.all()}get(){return this.selectBuilder.get()}first(){return this.selectBuilder.first()}count(){return this.selectBuilder.count()}exists(){return this.selectBuilder.exists()}value(M){return this.selectBuilder.value(M)}pluck(M){return this.selectBuilder.pluck(M)}insert(M,X){return this.insertBuilder.insert(M,X)}insertOrIgnore(M){return this.insertBuilder.insertOrIgnore(M)}insertOrReplace(M){return this.insertBuilder.insertOrReplace(M)}insertOrAbort(M){return this.insertBuilder.insertOrAbort(M)}insertOrFail(M){return this.insertBuilder.insertOrFail(M)}insertOrRollback(M){return this.insertBuilder.insertOrRollback(M)}insertAndGet(M,X){return this.insertBuilder.insertAndGet(M,X)}insertBatch(M,X){return this.insertBuilder.insertBatch(M,X)}update(M){return this.updateBuilder.update(M)}upsert(M){return this.updateBuilder.upsert(M)}increment(M,X=1){return this.updateBuilder.increment(M,X)}decrement(M,X=1){return this.updateBuilder.decrement(M,X)}updateAndGet(M){return this.updateBuilder.updateAndGet(M)}updateBatch(M){return this.updateBuilder.updateBatch(M)}delete(){return this.deleteBuilder.delete()}deleteAndGet(){return this.deleteBuilder.deleteAndGet()}softDelete(M="deleted_at",X=Math.floor(Date.now()/1000)){return this.deleteBuilder.softDelete(M,X)}restore(M="deleted_at"){return this.deleteBuilder.restore(M)}deleteBatch(M){return this.deleteBuilder.deleteBatch(M)}truncate(){return this.deleteBuilder.truncate()}deleteOlderThan(M,X){return this.deleteBuilder.deleteOlderThan(M,X)}deleteDuplicates(M){return this.deleteBuilder.deleteDuplicates(M)}}var U={INTEGER:"INTEGER",TEXT:"TEXT",REAL:"REAL",BLOB:"BLOB",NUMERIC:"NUMERIC",INT:"INT",TINYINT:"TINYINT",SMALLINT:"SMALLINT",MEDIUMINT:"MEDIUMINT",BIGINT:"BIGINT",VARCHAR:"VARCHAR",CHAR:"CHAR",CHARACTER:"CHARACTER",NCHAR:"NCHAR",NVARCHAR:"NVARCHAR",CLOB:"CLOB",DOUBLE:"DOUBLE",FLOAT:"FLOAT",DECIMAL:"DECIMAL",DATE:"DATE",DATETIME:"DATETIME",TIMESTAMP:"TIMESTAMP",TIME:"TIME",BOOLEAN:"BOOLEAN",JSON:"JSON"},T={DATE:(M)=>`DATE(${M})`,TIME:(M)=>`TIME(${M})`,DATETIME:(M)=>`DATETIME(${M})`,JULIANDAY:(M)=>`JULIANDAY(${M})`,STRFTIME:(M,X)=>`STRFTIME('${M}', ${X})`,LENGTH:(M)=>`LENGTH(${M})`,LOWER:(M)=>`LOWER(${M})`,UPPER:(M)=>`UPPER(${M})`,TRIM:(M,X)=>X?`TRIM(${M}, '${X}')`:`TRIM(${M})`,LTRIM:(M,X)=>X?`LTRIM(${M}, '${X}')`:`LTRIM(${M})`,RTRIM:(M,X)=>X?`RTRIM(${M}, '${X}')`:`RTRIM(${M})`,SUBSTR:(M,X,Y)=>Y?`SUBSTR(${M}, ${X}, ${Y})`:`SUBSTR(${M}, ${X})`,SUBSTRING:(M,X,Y)=>Y?`SUBSTRING(${M}, ${X}, ${Y})`:`SUBSTRING(${M}, ${X})`,REPLACE:(M,X,Y)=>`REPLACE(${M}, '${X}', '${Y}')`,PRINTF:(M,...X)=>`PRINTF('${M}', ${X.join(", ")})`,ABS:(M)=>`ABS(${M})`,ROUND:(M,X)=>X!==void 0?`ROUND(${M}, ${X})`:`ROUND(${M})`,RANDOM:()=>"RANDOM()",MIN:(...M)=>`MIN(${M.join(", ")})`,MAX:(...M)=>`MAX(${M.join(", ")})`,CAST:(M,X)=>`CAST(${M} AS ${X})`,TYPEOF:(M)=>`TYPEOF(${M})`,COALESCE:(...M)=>`COALESCE(${M.join(", ")})`,IFNULL:(M,X)=>`IFNULL(${M}, ${X})`,NULLIF:(M,X)=>`NULLIF(${M}, ${X})`,IIF:(M,X,Y)=>`IIF(${M}, ${X}, ${Y})`,COUNT:(M)=>M?`COUNT(${M})`:"COUNT(*)",SUM:(M)=>`SUM(${M})`,AVG:(M)=>`AVG(${M})`,TOTAL:(M)=>`TOTAL(${M})`,GROUP_CONCAT:(M,X)=>X?`GROUP_CONCAT(${M}, '${X}')`:`GROUP_CONCAT(${M})`,JSON:(M)=>`JSON(${M})`,JSON_EXTRACT:(M,X)=>`JSON_EXTRACT(${M}, '${X}')`,JSON_TYPE:(M,X)=>X?`JSON_TYPE(${M}, '${X}')`:`JSON_TYPE(${M})`,JSON_VALID:(M)=>`JSON_VALID(${M})`,JSON_ARRAY:(...M)=>`JSON_ARRAY(${M.join(", ")})`,JSON_OBJECT:(...M)=>`JSON_OBJECT(${M.join(", ")})`},g={NULL:"NULL",CURRENT_TIME:"CURRENT_TIME",CURRENT_DATE:"CURRENT_DATE",CURRENT_TIMESTAMP:"CURRENT_TIMESTAMP",TRUE:"1",FALSE:"0",ROLLBACK:"ROLLBACK",ABORT:"ABORT",FAIL:"FAIL",IGNORE:"IGNORE",REPLACE:"REPLACE"},V=(M)=>({_type:"expression",expression:M}),b={integer:(M)=>({type:M?.size||U.INTEGER,...M}),text:(M)=>({type:M?.variant||U.TEXT,length:M?.length,...M}),real:(M)=>({type:M?.variant||U.REAL,...M}),blob:(M)=>({type:U.BLOB,...M}),numeric:(M)=>({type:M?.variant||U.NUMERIC,precision:M?.precision,scale:M?.scale,...M}),date:(M)=>({type:U.DATE,...M}),datetime:(M)=>({type:U.DATETIME,...M}),timestamp:(M)=>({type:M?.asText?U.TEXT:U.INTEGER,...M}),time:(M)=>({type:U.TIME,...M}),boolean:(M)=>({type:U.BOOLEAN,check:M?.check||"{{COLUMN}} IN (0, 1)",...M}),json:(M)=>({type:U.JSON,check:M?.validateJson?"JSON_VALID({{COLUMN}})":M?.check,...M}),varchar:(M,X)=>({type:U.VARCHAR,length:M,...X}),char:(M,X)=>({type:U.CHAR,length:M,...X}),id:(M)=>({type:U.INTEGER,primaryKey:!0,autoincrement:!0,notNull:!0,...M}),uuid:(M)=>({type:U.TEXT,length:36,default:M?.generateDefault?V("lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))"):M?.default,...M}),createdAt:(M)=>({type:M?.asText?U.DATETIME:U.INTEGER,notNull:!0,default:M?.asText?V("datetime('now')"):V("strftime('%s', 'now')"),...M}),updatedAt:(M)=>({type:M?.asText?U.DATETIME:U.INTEGER,default:M?.asText?V("datetime('now')"):V("strftime('%s', 'now')"),...M}),foreignKey:(M,X="id",Y)=>({type:Y?.type||U.INTEGER,references:{table:M,column:X,onDelete:Y?.onDelete,onUpdate:Y?.onUpdate},...Y}),enum:(M,X)=>({type:U.TEXT,check:`{{COLUMN}} IN (${M.map((Y)=>`'${Y}'`).join(", ")})`,...X})},v={now:()=>V("datetime('now')"),currentTime:()=>V("time('now')"),currentDate:()=>V("date('now')"),currentTimestamp:()=>V("datetime('now')"),unixTimestamp:()=>V("strftime('%s', 'now')"),...T,raw:(M)=>V(M),null:()=>null,true:()=>1,false:()=>0};class N{db;constructor(M,X){if(this.db=new C(M),X?.pragmas)for(let[Y,Z]of X.pragmas)this.pragma(Y,Z);if(X?.loadExtensions)for(let Y of X.loadExtensions)this.loadExtension(Y)}table(M,X){return new q(this.db,M,X)}close(){this.db.close()}createTable(M,X,Y){let Z=Y?.temporary?"TEMPORARY ":"",_=Y?.ifNotExists?"IF NOT EXISTS ":"",$=Y?.withoutRowId?" WITHOUT ROWID":"",H=(W)=>`"${W.replace(/"/g,'""')}"`,J,F=[];if(typeof X==="string"){if(J=X.trim(),!J)throw new Error("Empty column definition string")}else if(this.isTableSchema(X)){let W=[];for(let[z,K]of Object.entries(X)){if(!z)continue;let k=this.buildColumnSQL(z,K);W.push(`${H(z)} ${k}`)}if(W.length===0)throw new Error("No columns provided");if(J=W.join(", "),Y?.constraints)F=this.buildTableConstraints(Y.constraints)}else{let W=[];for(let[z,K]of Object.entries(X)){if(!z)continue;let k=(K??"").trim();if(!k)throw new Error(`Missing SQL type/constraints for column "${z}"`);W.push(`${H(z)} ${k}`)}if(W.length===0)throw new Error("No columns provided");J=W.join(", ")}let G=[J,...F].join(", "),A=`CREATE ${Z}TABLE ${_}${H(M)} (${G})${$};`;if(this.db.exec(A),Y?.comment)this.setTableComment(M,Y.comment)}createIndex(M,X,Y,Z){let _=Z?.unique?"UNIQUE ":"",$=Z?.ifNotExists?"IF NOT EXISTS ":"",H=(G)=>`"${G.replace(/"/g,'""')}"`,J=Array.isArray(Y)?Y.map(H).join(", "):H(Y),F=`CREATE ${_}INDEX ${$}${H(M)} ON ${H(X)} (${J})`;if(Z?.where)F+=` WHERE ${Z.where}`;this.db.exec(`${F};`)}dropTable(M,X){let _=`DROP TABLE ${X?.ifExists?"IF EXISTS ":""}${(($)=>`"${$.replace(/"/g,'""')}"`)(M)};`;this.db.exec(_)}dropIndex(M,X){let _=`DROP INDEX ${X?.ifExists?"IF EXISTS ":""}${(($)=>`"${$.replace(/"/g,'""')}"`)(M)};`;this.db.exec(_)}isTableSchema(M){if(typeof M!=="object"||M===null)return!1;for(let[X,Y]of Object.entries(M))if(typeof Y==="object"&&Y!==null&&"type"in Y){let Z=Y.type;if(["INTEGER","TEXT","REAL","BLOB","NUMERIC","INT","TINYINT","SMALLINT","MEDIUMINT","BIGINT","VARCHAR","CHAR","CHARACTER","NCHAR","NVARCHAR","CLOB","DOUBLE","FLOAT","DECIMAL","DATE","DATETIME","TIMESTAMP","TIME","BOOLEAN","JSON"].includes(Z))return!0}return!1}buildColumnSQL(M,X){let Y=[],Z=X.type;if(X.length)Z+=`(${X.length})`;else if(X.precision!==void 0)if(X.scale!==void 0)Z+=`(${X.precision}, ${X.scale})`;else Z+=`(${X.precision})`;if(Y.push(Z),X.primaryKey)Y.push("PRIMARY KEY");if(X.autoincrement){if(!X.type.includes("INT")||!X.primaryKey)throw new Error(`AUTOINCREMENT can only be used with INTEGER PRIMARY KEY columns (column: ${M})`);Y.push("AUTOINCREMENT")}if(X.notNull&&!X.primaryKey)Y.push("NOT NULL");if(X.unique)Y.push("UNIQUE");if(X.default!==void 0)if(X.default===null)Y.push("DEFAULT NULL");else if(typeof X.default==="object"&&X.default._type==="expression")Y.push(`DEFAULT (${X.default.expression})`);else if(typeof X.default==="string")if(this.isSQLFunction(X.default))Y.push(`DEFAULT (${X.default})`);else Y.push(`DEFAULT '${X.default.replace(/'/g,"''")}'`);else if(typeof X.default==="boolean")Y.push(`DEFAULT ${X.default?1:0}`);else Y.push(`DEFAULT ${X.default}`);if(X.collate)Y.push(`COLLATE ${X.collate}`);if(X.check){let _=X.check.replace(/\{\{COLUMN\}\}/g,`"${M.replace(/"/g,'""')}"`);Y.push(`CHECK (${_})`)}if(X.references){let _=X.references,$=`REFERENCES "${_.table.replace(/"/g,'""')}"("${_.column.replace(/"/g,'""')}")`;if(_.onDelete)$+=` ON DELETE ${_.onDelete}`;if(_.onUpdate)$+=` ON UPDATE ${_.onUpdate}`;Y.push($)}if(X.generated){let _=X.generated.stored?"STORED":"VIRTUAL";Y.push(`GENERATED ALWAYS AS (${X.generated.expression}) ${_}`)}return Y.join(" ")}buildTableConstraints(M){let X=[];if(M.primaryKey&&M.primaryKey.length>0){let Y=M.primaryKey.map((Z)=>`"${Z.replace(/"/g,'""')}"`).join(", ");X.push(`PRIMARY KEY (${Y})`)}if(M.unique)if(Array.isArray(M.unique[0]))for(let Y of M.unique){let Z=Y.map((_)=>`"${_.replace(/"/g,'""')}"`).join(", ");X.push(`UNIQUE (${Z})`)}else{let Y=M.unique.map((Z)=>`"${Z.replace(/"/g,'""')}"`).join(", ");X.push(`UNIQUE (${Y})`)}if(M.check)for(let Y of M.check)X.push(`CHECK (${Y})`);if(M.foreignKeys)for(let Y of M.foreignKeys){let Z=Y.columns.map((H)=>`"${H.replace(/"/g,'""')}"`).join(", "),_=Y.references.columns.map((H)=>`"${H.replace(/"/g,'""')}"`).join(", "),$=`FOREIGN KEY (${Z}) REFERENCES "${Y.references.table.replace(/"/g,'""')}" (${_})`;if(Y.references.onDelete)$+=` ON DELETE ${Y.references.onDelete}`;if(Y.references.onUpdate)$+=` ON UPDATE ${Y.references.onUpdate}`;X.push($)}return X}isSQLFunction(M){return[/^\w+\s*\(/,/^(datetime|date|time|strftime|current_timestamp|current_date|current_time)/i,/^(random|abs|length|upper|lower|trim)/i,/^(coalesce|ifnull|nullif|iif)/i,/^(json|json_extract|json_valid)/i].some((Y)=>Y.test(M.trim()))}setTableComment(M,X){try{this.db.exec(`
10
- CREATE TABLE IF NOT EXISTS __table_metadata__ (
11
- table_name TEXT PRIMARY KEY,
12
- comment TEXT,
13
- created_at DATETIME DEFAULT CURRENT_TIMESTAMP
14
- )
15
- `),this.db.prepare(`
16
- INSERT OR REPLACE INTO __table_metadata__ (table_name, comment, created_at)
17
- VALUES (?, ?, CURRENT_TIMESTAMP)
18
- `).run(M,X)}catch(Y){console.warn(`Could not store table comment for ${M}:`,Y)}}getTableComment(M){try{return this.db.prepare(`
19
- SELECT comment FROM __table_metadata__ WHERE table_name = ?
20
- `).get(M)?.comment||null}catch(X){return null}}exec(M){this.db.exec(M)}prepare(M){return this.db.prepare(M)}transaction(M){return this.db.transaction(M)()}begin(M){let X=M?` ${M}`:"";this.db.exec(`BEGIN${X}`)}commit(){this.db.exec("COMMIT")}rollback(){this.db.exec("ROLLBACK")}savepoint(M){let X=`"${M.replace(/"/g,'""')}"`;this.db.exec(`SAVEPOINT ${X}`)}releaseSavepoint(M){let X=`"${M.replace(/"/g,'""')}"`;this.db.exec(`RELEASE SAVEPOINT ${X}`)}rollbackToSavepoint(M){let X=`"${M.replace(/"/g,'""')}"`;this.db.exec(`ROLLBACK TO SAVEPOINT ${X}`)}vacuum(){this.db.exec("VACUUM")}analyze(M){if(M){let X=`"${M.replace(/"/g,'""')}"`;this.db.exec(`ANALYZE ${X}`)}else this.db.exec("ANALYZE")}integrityCheck(){return this.db.prepare("PRAGMA integrity_check").all()}getSchema(){return this.db.prepare(`
21
- SELECT name, type, sql
22
- FROM sqlite_master
23
- WHERE type IN ('table', 'index', 'view', 'trigger')
24
- ORDER BY type, name
25
- `).all()}getTableInfo(M){return this.db.prepare(`PRAGMA table_info("${M.replace(/"/g,'""')}")`).all()}getForeignKeys(M){return this.db.prepare(`PRAGMA foreign_key_list("${M.replace(/"/g,'""')}")`).all()}getIndexes(M){return this.db.prepare(`PRAGMA index_list("${M.replace(/"/g,'""')}")`).all()}pragma(M,X){if(X!==void 0){this.db.exec(`PRAGMA ${M} = ${X}`);return}let Y=this.db.prepare(`PRAGMA ${M}`).get();return Object.values(Y)[0]}loadExtension(M){this.db.loadExtension(M)}getDb(){return this.db}}var XM=N;export{v as sql,V as defaultExpr,XM as default,b as column,U as SQLiteTypes,g as SQLiteKeywords,T as SQLiteFunctions,q as QueryBuilder,N as DB};
26
-
27
- //# debugId=7CE759C0B927428264756E2164756E21
28
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vcXVlcnktYnVpbGRlci9iYXNlLnRzIiwgIi4uL3F1ZXJ5LWJ1aWxkZXIvd2hlcmUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9zZWxlY3QudHMiLCAiLi4vcXVlcnktYnVpbGRlci9pbnNlcnQudHMiLCAiLi4vcXVlcnktYnVpbGRlci91cGRhdGUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9kZWxldGUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9pbmRleC50cyIsICIuLi90eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBEYXRhYmFzZSwgdHlwZSBTUUxRdWVyeUJpbmRpbmdzIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB7IFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3F1ZXJ5LWJ1aWxkZXIvaW5kZXhcIjtcbmltcG9ydCB0eXBlIHtcbiAgSnNvbkNvbHVtbkNvbmZpZyxcbiAgVGFibGVTY2hlbWEsXG4gIENvbHVtbkRlZmluaXRpb24sXG4gIFNRTGl0ZVR5cGUsXG4gIENvbHVtbkNvbnN0cmFpbnRzLFxuICBUYWJsZU9wdGlvbnMsXG4gIERlZmF1bHRFeHByZXNzaW9uLFxuICBGb3JlaWduS2V5QWN0aW9uLFxuICBUYWJsZUNvbnN0cmFpbnRzLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFJlLWV4cG9ydCBhbGwgdHlwZXMgYW5kIHV0aWxpdGllc1xuICovXG5leHBvcnQgeyBRdWVyeUJ1aWxkZXIgfTtcbmV4cG9ydCB0eXBlIHtcbiAgSW5zZXJ0UmVzdWx0LFxuICBVcGRhdGVSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgSW5zZXJ0T3B0aW9ucyxcbiAgQ29sdW1uTmFtZXMsXG4gIFdoZXJlQ29uZGl0aW9uLFxuICBSZWdleENvbmRpdGlvbixcbiAgSnNvbkNvbHVtbkNvbmZpZyxcbiAgVGFibGVTY2hlbWEsXG4gIENvbHVtbkRlZmluaXRpb24sXG4gIFNRTGl0ZVR5cGUsXG4gIENvbHVtbkNvbnN0cmFpbnRzLFxuICBUYWJsZU9wdGlvbnMsXG4gIERlZmF1bHRFeHByZXNzaW9uLFxuICBGb3JlaWduS2V5QWN0aW9uLFxuICBUYWJsZUNvbnN0cmFpbnRzLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vLyBSZS1leHBvcnQgaGVscGVyIHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgY29sdW1uLFxuICBzcWwsXG4gIFNRTGl0ZVR5cGVzLFxuICBTUUxpdGVGdW5jdGlvbnMsXG4gIFNRTGl0ZUtleXdvcmRzLFxuICBkZWZhdWx0RXhwcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUeXBlZFNRTGl0ZSDigJQgY29tcHJlaGVuc2l2ZSB3cmFwcGVyIGFyb3VuZCBidW46c3FsaXRlIGBEYXRhYmFzZWAuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBmdWxsIHR5cGUgc2FmZXR5IGZvciBTUUxpdGUgb3BlcmF0aW9ucyB3aXRoIHN1cHBvcnQgZm9yOlxuICogLSBBbGwgU1FMaXRlIGRhdGEgdHlwZXMgYW5kIHZhcmlhdGlvbnNcbiAqIC0gQnVpbHQtaW4gU1FMIGZ1bmN0aW9uc1xuICogLSBDb21wbGV4IGNvbnN0cmFpbnRzIGFuZCByZWxhdGlvbnNoaXBzXG4gKiAtIEdlbmVyYXRlZCBjb2x1bW5zXG4gKiAtIFRhYmxlLWxldmVsIGNvbnN0cmFpbnRzXG4gKiAtIEpTT04gY29sdW1uIHN1cHBvcnRcbiAqIC0gQW5kIG11Y2ggbW9yZS4uLlxuICovXG5jbGFzcyBEQiB7XG4gIHByaXZhdGUgZGI6IERhdGFiYXNlO1xuXG4gIC8qKlxuICAgKiBPcGVuIG9yIGNyZWF0ZSBhIFNRTGl0ZSBkYXRhYmFzZSBhdCBgcGF0aGAuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byB0aGUgU1FMaXRlIGZpbGUgKGUuZy4gXCJhcHAuZGJcIikuIFVzZSBcIjptZW1vcnk6XCIgZm9yIGluLW1lbW9yeSBEQi5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBkYXRhYmFzZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHByYWdtYXM/OiBBcnJheTxbc3RyaW5nLCBTUUxRdWVyeUJpbmRpbmdzXT47XG4gICAgICBsb2FkRXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuICAgIH0sXG4gICkge1xuICAgIHRoaXMuZGIgPSBuZXcgRGF0YWJhc2UocGF0aCk7XG5cbiAgICAvLyBBcHBseSBQUkFHTUEgc2V0dGluZ3MgaWYgcHJvdmlkZWRcbiAgICBpZiAob3B0aW9ucz8ucHJhZ21hcykge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIG9wdGlvbnMucHJhZ21hcykge1xuICAgICAgICB0aGlzLnByYWdtYShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBleHRlbnNpb25zIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LmxvYWRFeHRlbnNpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGV4dGVuc2lvblBhdGggb2Ygb3B0aW9ucy5sb2FkRXh0ZW5zaW9ucykge1xuICAgICAgICB0aGlzLmxvYWRFeHRlbnNpb24oZXh0ZW5zaW9uUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHR5cGVkIFF1ZXJ5QnVpbGRlciBmb3IgYSBnaXZlbiB0YWJsZSBuYW1lLlxuICAgKiAoRG9jdW1lbnRhdGlvbiByZW1haW5zIHRoZSBzYW1lIGFzIGJlZm9yZS4uLilcbiAgICovXG4gIHRhYmxlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAganNvbkNvbmZpZz86IEpzb25Db2x1bW5Db25maWc8VD4sXG4gICk6IFF1ZXJ5QnVpbGRlcjxUPiB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeUJ1aWxkZXI8VD4odGhpcy5kYiwgdGFibGVOYW1lLCBqc29uQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgdW5kZXJseWluZyBTUUxpdGUgZGF0YWJhc2UgaGFuZGxlLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kYi5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRhYmxlIHdpdGggY29tcHJlaGVuc2l2ZSB0eXBlIHNhZmV0eSBhbmQgZmVhdHVyZSBzdXBwb3J0LlxuICAgKlxuICAgKiBOb3cgc3VwcG9ydHMgYWxsIFNRTGl0ZSBmZWF0dXJlczpcbiAgICpcbiAgICogKipCYXNpYyBVc2FnZToqKlxuICAgKiBgYGB0c1xuICAgKiBpbXBvcnQgeyBjb2x1bW4sIHNxbCB9IGZyb20gXCIuL2RiXCI7XG4gICAqXG4gICAqIGRiLmNyZWF0ZVRhYmxlKFwidXNlcnNcIiwge1xuICAgKiAgIGlkOiBjb2x1bW4uaWQoKSwgLy8gQXV0by1pbmNyZW1lbnRpbmcgcHJpbWFyeSBrZXlcbiAgICogICBlbWFpbDogY29sdW1uLnZhcmNoYXIoMjU1LCB7IHVuaXF1ZTogdHJ1ZSwgbm90TnVsbDogdHJ1ZSB9KSxcbiAgICogICBuYW1lOiBjb2x1bW4udGV4dCh7IG5vdE51bGw6IHRydWUgfSksXG4gICAqICAgYWdlOiBjb2x1bW4uaW50ZWdlcih7IGNoZWNrOiAnYWdlID49IDAgQU5EIGFnZSA8PSAxNTAnIH0pLFxuICAgKiAgIGJhbGFuY2U6IGNvbHVtbi5udW1lcmljKHsgcHJlY2lzaW9uOiAxMCwgc2NhbGU6IDIsIGRlZmF1bHQ6IDAgfSksXG4gICAqICAgaXNfYWN0aXZlOiBjb2x1bW4uYm9vbGVhbih7IGRlZmF1bHQ6IHNxbC50cnVlKCkgfSksXG4gICAqICAgbWV0YWRhdGE6IGNvbHVtbi5qc29uKHsgdmFsaWRhdGVKc29uOiB0cnVlIH0pLFxuICAgKiAgIGNyZWF0ZWRfYXQ6IGNvbHVtbi5jcmVhdGVkQXQoKSxcbiAgICogICB1cGRhdGVkX2F0OiBjb2x1bW4udXBkYXRlZEF0KCksXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogKipBZHZhbmNlZCBGZWF0dXJlczoqKlxuICAgKiBgYGB0c1xuICAgKiBkYi5jcmVhdGVUYWJsZShcIm9yZGVyc1wiLCB7XG4gICAqICAgaWQ6IGNvbHVtbi5pZCgpLFxuICAgKiAgIG9yZGVyX251bWJlcjogY29sdW1uLnZhcmNoYXIoNTAsIHtcbiAgICogICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICogICAgIGRlZmF1bHQ6IHNxbC5yYXcoXCInT1JELScgfHwgc3RyZnRpbWUoJyVZJW0lZCcsICdub3cnKSB8fCAnLScgfHwgc3Vic3RyKGhleChyYW5kb21ibG9iKDQpKSwgMSwgOClcIilcbiAgICogICB9KSxcbiAgICogICBjdXN0b21lcl9pZDogY29sdW1uLmZvcmVpZ25LZXkoJ3VzZXJzJywgJ2lkJywge1xuICAgKiAgICAgb25EZWxldGU6ICdDQVNDQURFJyxcbiAgICogICAgIG9uVXBkYXRlOiAnUkVTVFJJQ1QnXG4gICAqICAgfSksXG4gICAqICAgc3RhdHVzOiBjb2x1bW4uZW51bShbJ3BlbmRpbmcnLCAncGFpZCcsICdzaGlwcGVkJywgJ2RlbGl2ZXJlZCddLCB7XG4gICAqICAgICBkZWZhdWx0OiAncGVuZGluZydcbiAgICogICB9KSxcbiAgICogICB0b3RhbDogY29sdW1uLm51bWVyaWMoeyBwcmVjaXNpb246IDEwLCBzY2FsZTogMiwgbm90TnVsbDogdHJ1ZSB9KSxcbiAgICogICAvLyBHZW5lcmF0ZWQgY29sdW1uXG4gICAqICAgZGlzcGxheV90b3RhbDoge1xuICAgKiAgICAgdHlwZTogJ1RFWFQnLFxuICAgKiAgICAgZ2VuZXJhdGVkOiB7XG4gICAqICAgICAgIGV4cHJlc3Npb246IFwicHJpbnRmKCckJS4yZicsIHRvdGFsKVwiLFxuICAgKiAgICAgICBzdG9yZWQ6IGZhbHNlIC8vIFZJUlRVQUwgY29sdW1uXG4gICAqICAgICB9XG4gICAqICAgfSxcbiAgICogfSwge1xuICAgKiAgIGNvbnN0cmFpbnRzOiB7XG4gICAqICAgICBjaGVjazogWyd0b3RhbCA+PSAwJ10sXG4gICAqICAgICB1bmlxdWU6IFtbJ2N1c3RvbWVyX2lkJywgJ29yZGVyX251bWJlciddXVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiAqKkRhdGUvVGltZSBDb2x1bW5zOioqXG4gICAqIGBgYHRzXG4gICAqIGRiLmNyZWF0ZVRhYmxlKFwiZXZlbnRzXCIsIHtcbiAgICogICBpZDogY29sdW1uLmlkKCksXG4gICAqICAgbmFtZTogY29sdW1uLnRleHQoeyBub3ROdWxsOiB0cnVlIH0pLFxuICAgKiAgIGV2ZW50X2RhdGU6IGNvbHVtbi5kYXRlKHsgbm90TnVsbDogdHJ1ZSB9KSxcbiAgICogICBzdGFydF90aW1lOiBjb2x1bW4udGltZSgpLFxuICAgKiAgIGNyZWF0ZWRfYXQ6IGNvbHVtbi50aW1lc3RhbXAoeyBkZWZhdWx0OiBzcWwudW5peFRpbWVzdGFtcCgpIH0pLFxuICAgKiAgIGV4cGlyZXNfYXQ6IGNvbHVtbi5kYXRldGltZSh7XG4gICAqICAgICBkZWZhdWx0OiBzcWwucmF3KFwiZGF0ZXRpbWUoJ25vdycsICcrMSB5ZWFyJylcIilcbiAgICogICB9KSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiAqKkpTT04gYW5kIEFkdmFuY2VkIFR5cGVzOioqXG4gICAqIGBgYHRzXG4gICAqIGRiLmNyZWF0ZVRhYmxlKFwicHJvZHVjdHNcIiwge1xuICAgKiAgIGlkOiBjb2x1bW4udXVpZCh7IGdlbmVyYXRlRGVmYXVsdDogdHJ1ZSB9KSwgLy8gVVVJRCBwcmltYXJ5IGtleVxuICAgKiAgIG5hbWU6IGNvbHVtbi50ZXh0KHsgbm90TnVsbDogdHJ1ZSB9KSxcbiAgICogICBwcmljZTogY29sdW1uLnJlYWwoeyBjaGVjazogJ3ByaWNlID4gMCcgfSksXG4gICAqICAgc3BlY2lmaWNhdGlvbnM6IGNvbHVtbi5qc29uKHsgdmFsaWRhdGVKc29uOiB0cnVlIH0pLFxuICAgKiAgIHRhZ3M6IGNvbHVtbi50ZXh0KCksIC8vIEpTT04gYXJyYXlcbiAgICogICBpbWFnZV9kYXRhOiBjb2x1bW4uYmxvYigpLFxuICAgKiAgIHNlYXJjaF92ZWN0b3I6IHtcbiAgICogICAgIHR5cGU6ICdURVhUJyxcbiAgICogICAgIGdlbmVyYXRlZDoge1xuICAgKiAgICAgICBleHByZXNzaW9uOiBcImxvd2VyKG5hbWUgfHwgJyAnIHx8IGNvYWxlc2NlKGpzb25fZXh0cmFjdChzcGVjaWZpY2F0aW9ucywgJyQuZGVzY3JpcHRpb24nKSwgJycpKVwiLFxuICAgKiAgICAgICBzdG9yZWQ6IHRydWUgLy8gU1RPUkVEIGZvciBpbmRleGluZ1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdGFibGVOYW1lIC0gVGFibGUgbmFtZSB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1uIGRlZmluaXRpb25zIChzdHJpbmcsIGxlZ2FjeSBvYmplY3QsIG9yIHR5cGUtc2FmZSBzY2hlbWEpLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRhYmxlIG9wdGlvbnMgaW5jbHVkaW5nIGNvbnN0cmFpbnRzIGFuZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGNvbHVtbiBkZWZpbml0aW9ucyBhcmUgaW52YWxpZCBvciBjb25zdHJhaW50cyBjb25mbGljdC5cbiAgICovXG4gIGNyZWF0ZVRhYmxlPF9UIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvbHVtbnM6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBUYWJsZVNjaGVtYSxcbiAgICBvcHRpb25zPzogVGFibGVPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB0ZW1wID0gb3B0aW9ucz8udGVtcG9yYXJ5ID8gXCJURU1QT1JBUlkgXCIgOiBcIlwiO1xuICAgIGNvbnN0IGlmTm90ID0gb3B0aW9ucz8uaWZOb3RFeGlzdHMgPyBcIklGIE5PVCBFWElTVFMgXCIgOiBcIlwiO1xuICAgIGNvbnN0IHdpdGhvdXRSb3dJZCA9IG9wdGlvbnM/LndpdGhvdXRSb3dJZCA/IFwiIFdJVEhPVVQgUk9XSURcIiA6IFwiXCI7XG5cbiAgICBjb25zdCBxdW90ZUlkZW50ID0gKHM6IHN0cmluZykgPT4gYFwiJHtzLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuXG4gICAgbGV0IGNvbHVtbkRlZnM6IHN0cmluZztcbiAgICBsZXQgdGFibGVDb25zdHJhaW50czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0eXBlb2YgY29sdW1ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgLy8gT3JpZ2luYWwgc3RyaW5nLWJhc2VkIGFwcHJvYWNoXG4gICAgICBjb2x1bW5EZWZzID0gY29sdW1ucy50cmltKCk7XG4gICAgICBpZiAoIWNvbHVtbkRlZnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgY29sdW1uIGRlZmluaXRpb24gc3RyaW5nXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxlU2NoZW1hKGNvbHVtbnMpKSB7XG4gICAgICAvLyBOZXcgY29tcHJlaGVuc2l2ZSB0eXBlLXNhZmUgYXBwcm9hY2hcbiAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBbY29sTmFtZSwgY29sRGVmXSBvZiBPYmplY3QuZW50cmllcyhjb2x1bW5zKSkge1xuICAgICAgICBpZiAoIWNvbE5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHNxbERlZiA9IHRoaXMuYnVpbGRDb2x1bW5TUUwoY29sTmFtZSwgY29sRGVmKTtcbiAgICAgICAgcGFydHMucHVzaChgJHtxdW90ZUlkZW50KGNvbE5hbWUpfSAke3NxbERlZn1gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW5zIHByb3ZpZGVkXCIpO1xuICAgICAgfVxuICAgICAgY29sdW1uRGVmcyA9IHBhcnRzLmpvaW4oXCIsIFwiKTtcblxuICAgICAgLy8gQWRkIHRhYmxlLWxldmVsIGNvbnN0cmFpbnRzXG4gICAgICBpZiAob3B0aW9ucz8uY29uc3RyYWludHMpIHtcbiAgICAgICAgdGFibGVDb25zdHJhaW50cyA9IHRoaXMuYnVpbGRUYWJsZUNvbnN0cmFpbnRzKG9wdGlvbnMuY29uc3RyYWludHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPcmlnaW5hbCBvYmplY3QtYmFzZWQgYXBwcm9hY2hcbiAgICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBbY29sLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGNvbHVtbnMpKSB7XG4gICAgICAgIGlmICghY29sKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBkZWZUcmltID0gKGRlZiA/PyBcIlwiKS50cmltKCk7XG4gICAgICAgIGlmICghZGVmVHJpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBTUUwgdHlwZS9jb25zdHJhaW50cyBmb3IgY29sdW1uIFwiJHtjb2x9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGAke3F1b3RlSWRlbnQoY29sKX0gJHtkZWZUcmltfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbHVtbnMgcHJvdmlkZWRcIik7XG4gICAgICB9XG4gICAgICBjb2x1bW5EZWZzID0gcGFydHMuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8vIENvbWJpbmUgY29sdW1uIGRlZmluaXRpb25zIGFuZCB0YWJsZSBjb25zdHJhaW50c1xuICAgIGNvbnN0IGFsbERlZmluaXRpb25zID0gW2NvbHVtbkRlZnMsIC4uLnRhYmxlQ29uc3RyYWludHNdLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IHNxbCA9IGBDUkVBVEUgJHt0ZW1wfVRBQkxFICR7aWZOb3R9JHtxdW90ZUlkZW50KHRhYmxlTmFtZSl9ICgke2FsbERlZmluaXRpb25zfSkke3dpdGhvdXRSb3dJZH07YDtcblxuICAgIHRoaXMuZGIuZXhlYyhzcWwpO1xuXG4gICAgLy8gU3RvcmUgdGFibGUgY29tbWVudCBhcyBtZXRhZGF0YSBpZiBwcm92aWRlZFxuICAgIGlmIChvcHRpb25zPy5jb21tZW50KSB7XG4gICAgICB0aGlzLnNldFRhYmxlQ29tbWVudCh0YWJsZU5hbWUsIG9wdGlvbnMuY29tbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbmRleCBvbiBhIHRhYmxlXG4gICAqL1xuICBjcmVhdGVJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBjb2x1bW5zOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBvcHRpb25zPzoge1xuICAgICAgdW5pcXVlPzogYm9vbGVhbjtcbiAgICAgIGlmTm90RXhpc3RzPzogYm9vbGVhbjtcbiAgICAgIHdoZXJlPzogc3RyaW5nO1xuICAgICAgcGFydGlhbD86IHN0cmluZztcbiAgICB9LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCB1bmlxdWUgPSBvcHRpb25zPy51bmlxdWUgPyBcIlVOSVFVRSBcIiA6IFwiXCI7XG4gICAgY29uc3QgaWZOb3QgPSBvcHRpb25zPy5pZk5vdEV4aXN0cyA/IFwiSUYgTk9UIEVYSVNUUyBcIiA6IFwiXCI7XG4gICAgY29uc3QgcXVvdGVJZGVudCA9IChzOiBzdHJpbmcpID0+IGBcIiR7cy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcblxuICAgIGNvbnN0IGNvbHVtbkxpc3QgPSBBcnJheS5pc0FycmF5KGNvbHVtbnMpXG4gICAgICA/IGNvbHVtbnMubWFwKHF1b3RlSWRlbnQpLmpvaW4oXCIsIFwiKVxuICAgICAgOiBxdW90ZUlkZW50KGNvbHVtbnMpO1xuXG4gICAgbGV0IHNxbCA9IGBDUkVBVEUgJHt1bmlxdWV9SU5ERVggJHtpZk5vdH0ke3F1b3RlSWRlbnQoaW5kZXhOYW1lKX0gT04gJHtxdW90ZUlkZW50KHRhYmxlTmFtZSl9ICgke2NvbHVtbkxpc3R9KWA7XG5cbiAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgIHNxbCArPSBgIFdIRVJFICR7b3B0aW9ucy53aGVyZX1gO1xuICAgIH1cblxuICAgIHRoaXMuZGIuZXhlYyhgJHtzcWx9O2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgYSB0YWJsZVxuICAgKi9cbiAgZHJvcFRhYmxlKHRhYmxlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBpZkV4aXN0cz86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGNvbnN0IGlmRXhpc3RzID0gb3B0aW9ucz8uaWZFeGlzdHMgPyBcIklGIEVYSVNUUyBcIiA6IFwiXCI7XG4gICAgY29uc3QgcXVvdGVJZGVudCA9IChzOiBzdHJpbmcpID0+IGBcIiR7cy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcblxuICAgIGNvbnN0IHNxbCA9IGBEUk9QIFRBQkxFICR7aWZFeGlzdHN9JHtxdW90ZUlkZW50KHRhYmxlTmFtZSl9O2A7XG4gICAgdGhpcy5kYi5leGVjKHNxbCk7XG4gIH1cblxuICAvKipcbiAgICogRHJvcCBhbiBpbmRleFxuICAgKi9cbiAgZHJvcEluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBpZkV4aXN0cz86IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGNvbnN0IGlmRXhpc3RzID0gb3B0aW9ucz8uaWZFeGlzdHMgPyBcIklGIEVYSVNUUyBcIiA6IFwiXCI7XG4gICAgY29uc3QgcXVvdGVJZGVudCA9IChzOiBzdHJpbmcpID0+IGBcIiR7cy5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcblxuICAgIGNvbnN0IHNxbCA9IGBEUk9QIElOREVYICR7aWZFeGlzdHN9JHtxdW90ZUlkZW50KGluZGV4TmFtZSl9O2A7XG4gICAgdGhpcy5kYi5leGVjKHNxbCk7XG4gIH1cblxuICAvKipcbiAgICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBjb2x1bW5zIGRlZmluaXRpb24gaXMgYSBUYWJsZVNjaGVtYVxuICAgKi9cbiAgcHJpdmF0ZSBpc1RhYmxlU2NoZW1hKGNvbHVtbnM6IHVua25vd24pOiBjb2x1bW5zIGlzIFRhYmxlU2NoZW1hIHtcbiAgICBpZiAodHlwZW9mIGNvbHVtbnMgIT09IFwib2JqZWN0XCIgfHwgY29sdW1ucyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFueSB2YWx1ZSBoYXMgYSAndHlwZScgcHJvcGVydHkgd2l0aCBhIHZhbGlkIFNRTGl0ZSB0eXBlXG4gICAgZm9yIChjb25zdCBbX2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbHVtbnMpKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwidHlwZVwiIGluIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAodmFsdWUgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZTtcbiAgICAgICAgY29uc3QgdmFsaWRUeXBlcyA9IFtcbiAgICAgICAgICBcIklOVEVHRVJcIixcbiAgICAgICAgICBcIlRFWFRcIixcbiAgICAgICAgICBcIlJFQUxcIixcbiAgICAgICAgICBcIkJMT0JcIixcbiAgICAgICAgICBcIk5VTUVSSUNcIixcbiAgICAgICAgICBcIklOVFwiLFxuICAgICAgICAgIFwiVElOWUlOVFwiLFxuICAgICAgICAgIFwiU01BTExJTlRcIixcbiAgICAgICAgICBcIk1FRElVTUlOVFwiLFxuICAgICAgICAgIFwiQklHSU5UXCIsXG4gICAgICAgICAgXCJWQVJDSEFSXCIsXG4gICAgICAgICAgXCJDSEFSXCIsXG4gICAgICAgICAgXCJDSEFSQUNURVJcIixcbiAgICAgICAgICBcIk5DSEFSXCIsXG4gICAgICAgICAgXCJOVkFSQ0hBUlwiLFxuICAgICAgICAgIFwiQ0xPQlwiLFxuICAgICAgICAgIFwiRE9VQkxFXCIsXG4gICAgICAgICAgXCJGTE9BVFwiLFxuICAgICAgICAgIFwiREVDSU1BTFwiLFxuICAgICAgICAgIFwiREFURVwiLFxuICAgICAgICAgIFwiREFURVRJTUVcIixcbiAgICAgICAgICBcIlRJTUVTVEFNUFwiLFxuICAgICAgICAgIFwiVElNRVwiLFxuICAgICAgICAgIFwiQk9PTEVBTlwiLFxuICAgICAgICAgIFwiSlNPTlwiLFxuICAgICAgICBdO1xuICAgICAgICBpZiAodmFsaWRUeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFNRTCBjb2x1bW4gZGVmaW5pdGlvbiBmcm9tIENvbHVtbkRlZmluaXRpb24gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ29sdW1uU1FMKGNvbHVtbk5hbWU6IHN0cmluZywgY29sRGVmOiBDb2x1bW5EZWZpbml0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFkZCB0eXBlIHdpdGggb3B0aW9uYWwgcGFyYW1ldGVyc1xuICAgIGxldCB0eXBlU3RyID0gY29sRGVmLnR5cGU7XG4gICAgaWYgKGNvbERlZi5sZW5ndGgpIHtcbiAgICAgIHR5cGVTdHIgKz0gYCgke2NvbERlZi5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIGlmIChjb2xEZWYucHJlY2lzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb2xEZWYuc2NhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0eXBlU3RyICs9IGAoJHtjb2xEZWYucHJlY2lzaW9ufSwgJHtjb2xEZWYuc2NhbGV9KWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyICs9IGAoJHtjb2xEZWYucHJlY2lzaW9ufSlgO1xuICAgICAgfVxuICAgIH1cbiAgICBwYXJ0cy5wdXNoKHR5cGVTdHIpO1xuXG4gICAgLy8gQWRkIFBSSU1BUlkgS0VZIChtdXN0IGNvbWUgYmVmb3JlIEFVVE9JTkNSRU1FTlQpXG4gICAgaWYgKGNvbERlZi5wcmltYXJ5S2V5KSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiUFJJTUFSWSBLRVlcIik7XG4gICAgfVxuXG4gICAgLy8gQWRkIEFVVE9JTkNSRU1FTlQgKG9ubHkgdmFsaWQgd2l0aCBJTlRFR0VSIFBSSU1BUlkgS0VZKVxuICAgIGlmIChjb2xEZWYuYXV0b2luY3JlbWVudCkge1xuICAgICAgaWYgKCFjb2xEZWYudHlwZS5pbmNsdWRlcyhcIklOVFwiKSB8fCAhY29sRGVmLnByaW1hcnlLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBVVRPSU5DUkVNRU5UIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBJTlRFR0VSIFBSSU1BUlkgS0VZIGNvbHVtbnMgKGNvbHVtbjogJHtjb2x1bW5OYW1lfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcGFydHMucHVzaChcIkFVVE9JTkNSRU1FTlRcIik7XG4gICAgfVxuXG4gICAgLy8gQWRkIE5PVCBOVUxMIChidXQgc2tpcCBpZiBQUklNQVJZIEtFWSBpcyBhbHJlYWR5IHNwZWNpZmllZCwgYXMgaXQncyBpbXBsaWNpdClcbiAgICBpZiAoY29sRGVmLm5vdE51bGwgJiYgIWNvbERlZi5wcmltYXJ5S2V5KSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiTk9UIE5VTExcIik7XG4gICAgfVxuXG4gICAgLy8gQWRkIFVOSVFVRVxuICAgIGlmIChjb2xEZWYudW5pcXVlKSB7XG4gICAgICBwYXJ0cy5wdXNoKFwiVU5JUVVFXCIpO1xuICAgIH1cblxuICAgIC8vIEFkZCBERUZBVUxUXG4gICAgaWYgKGNvbERlZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChjb2xEZWYuZGVmYXVsdCA9PT0gbnVsbCkge1xuICAgICAgICBwYXJ0cy5wdXNoKFwiREVGQVVMVCBOVUxMXCIpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIGNvbERlZi5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIGNvbERlZi5kZWZhdWx0Ll90eXBlID09PSBcImV4cHJlc3Npb25cIlxuICAgICAgKSB7XG4gICAgICAgIC8vIEhhbmRsZSBEZWZhdWx0RXhwcmVzc2lvblxuICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICgke2NvbERlZi5kZWZhdWx0LmV4cHJlc3Npb259KWApO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29sRGVmLmRlZmF1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gSGFuZGxlIHN0cmluZyBkZWZhdWx0cyAtIGNoZWNrIGlmIGl0J3MgYSBmdW5jdGlvbiBjYWxsIG9yIGxpdGVyYWxcbiAgICAgICAgaWYgKHRoaXMuaXNTUUxGdW5jdGlvbihjb2xEZWYuZGVmYXVsdCkpIHtcbiAgICAgICAgICBwYXJ0cy5wdXNoKGBERUZBVUxUICgke2NvbERlZi5kZWZhdWx0fSlgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBMaXRlcmFsIHN0cmluZyB2YWx1ZVxuICAgICAgICAgIHBhcnRzLnB1c2goYERFRkFVTFQgJyR7Y29sRGVmLmRlZmF1bHQucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29sRGVmLmRlZmF1bHQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHBhcnRzLnB1c2goYERFRkFVTFQgJHtjb2xEZWYuZGVmYXVsdCA/IDEgOiAwfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMucHVzaChgREVGQVVMVCAke2NvbERlZi5kZWZhdWx0fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBDT0xMQVRFXG4gICAgaWYgKGNvbERlZi5jb2xsYXRlKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBDT0xMQVRFICR7Y29sRGVmLmNvbGxhdGV9YCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIENIRUNLIGNvbnN0cmFpbnQgKHJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCBhY3R1YWwgY29sdW1uIG5hbWUpXG4gICAgaWYgKGNvbERlZi5jaGVjaykge1xuICAgICAgY29uc3QgY2hlY2tDb25zdHJhaW50ID0gY29sRGVmLmNoZWNrLnJlcGxhY2UoXG4gICAgICAgIC9cXHtcXHtDT0xVTU5cXH1cXH0vZyxcbiAgICAgICAgYFwiJHtjb2x1bW5OYW1lLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgLFxuICAgICAgKTtcbiAgICAgIHBhcnRzLnB1c2goYENIRUNLICgke2NoZWNrQ29uc3RyYWludH0pYCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIFJFRkVSRU5DRVMgKGZvcmVpZ24ga2V5KVxuICAgIGlmIChjb2xEZWYucmVmZXJlbmNlcykge1xuICAgICAgY29uc3QgcmVmID0gY29sRGVmLnJlZmVyZW5jZXM7XG4gICAgICBsZXQgcmVmQ2xhdXNlID0gYFJFRkVSRU5DRVMgXCIke3JlZi50YWJsZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiKFwiJHtyZWYuY29sdW1uLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCIpYDtcblxuICAgICAgaWYgKHJlZi5vbkRlbGV0ZSkge1xuICAgICAgICByZWZDbGF1c2UgKz0gYCBPTiBERUxFVEUgJHtyZWYub25EZWxldGV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZi5vblVwZGF0ZSkge1xuICAgICAgICByZWZDbGF1c2UgKz0gYCBPTiBVUERBVEUgJHtyZWYub25VcGRhdGV9YDtcbiAgICAgIH1cblxuICAgICAgcGFydHMucHVzaChyZWZDbGF1c2UpO1xuICAgIH1cblxuICAgIC8vIEFkZCBHRU5FUkFURUQgY29sdW1uXG4gICAgaWYgKGNvbERlZi5nZW5lcmF0ZWQpIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VUeXBlID0gY29sRGVmLmdlbmVyYXRlZC5zdG9yZWQgPyBcIlNUT1JFRFwiIDogXCJWSVJUVUFMXCI7XG4gICAgICBwYXJ0cy5wdXNoKFxuICAgICAgICBgR0VORVJBVEVEIEFMV0FZUyBBUyAoJHtjb2xEZWYuZ2VuZXJhdGVkLmV4cHJlc3Npb259KSAke3N0b3JhZ2VUeXBlfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKFwiIFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0YWJsZS1sZXZlbCBjb25zdHJhaW50c1xuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRhYmxlQ29uc3RyYWludHMoY29uc3RyYWludHM6IFRhYmxlQ29uc3RyYWludHMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBQUklNQVJZIEtFWSBjb25zdHJhaW50XG4gICAgaWYgKGNvbnN0cmFpbnRzLnByaW1hcnlLZXkgJiYgY29uc3RyYWludHMucHJpbWFyeUtleS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjb2x1bW5zID0gY29uc3RyYWludHMucHJpbWFyeUtleVxuICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgKVxuICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgcGFydHMucHVzaChgUFJJTUFSWSBLRVkgKCR7Y29sdW1uc30pYCk7XG4gICAgfVxuXG4gICAgLy8gVU5JUVVFIGNvbnN0cmFpbnRzXG4gICAgaWYgKGNvbnN0cmFpbnRzLnVuaXF1ZSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uc3RyYWludHMudW5pcXVlWzBdKSkge1xuICAgICAgICAvLyBNdWx0aXBsZSBjb21wb3NpdGUgdW5pcXVlIGNvbnN0cmFpbnRzXG4gICAgICAgIGZvciAoY29uc3QgdW5pcXVlR3JvdXAgb2YgY29uc3RyYWludHMudW5pcXVlIGFzIHN0cmluZ1tdW10pIHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gdW5pcXVlR3JvdXBcbiAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2wucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICAgIHBhcnRzLnB1c2goYFVOSVFVRSAoJHtjb2x1bW5zfSlgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2luZ2xlIHVuaXF1ZSBjb25zdHJhaW50XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSAoY29uc3RyYWludHMudW5pcXVlIGFzIHN0cmluZ1tdKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2wucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImApXG4gICAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgcGFydHMucHVzaChgVU5JUVVFICgke2NvbHVtbnN9KWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENIRUNLIGNvbnN0cmFpbnRzXG4gICAgaWYgKGNvbnN0cmFpbnRzLmNoZWNrKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoZWNrRXhwciBvZiBjb25zdHJhaW50cy5jaGVjaykge1xuICAgICAgICBwYXJ0cy5wdXNoKGBDSEVDSyAoJHtjaGVja0V4cHJ9KWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZPUkVJR04gS0VZIGNvbnN0cmFpbnRzXG4gICAgaWYgKGNvbnN0cmFpbnRzLmZvcmVpZ25LZXlzKSB7XG4gICAgICBmb3IgKGNvbnN0IGZrIG9mIGNvbnN0cmFpbnRzLmZvcmVpZ25LZXlzKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBmay5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYClcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCByZWZDb2x1bW5zID0gZmsucmVmZXJlbmNlcy5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYClcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIGxldCBma0NsYXVzZSA9IGBGT1JFSUdOIEtFWSAoJHtjb2x1bW5zfSkgUkVGRVJFTkNFUyBcIiR7ZmsucmVmZXJlbmNlcy50YWJsZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiICgke3JlZkNvbHVtbnN9KWA7XG5cbiAgICAgICAgaWYgKGZrLnJlZmVyZW5jZXMub25EZWxldGUpIHtcbiAgICAgICAgICBma0NsYXVzZSArPSBgIE9OIERFTEVURSAke2ZrLnJlZmVyZW5jZXMub25EZWxldGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmay5yZWZlcmVuY2VzLm9uVXBkYXRlKSB7XG4gICAgICAgICAgZmtDbGF1c2UgKz0gYCBPTiBVUERBVEUgJHtmay5yZWZlcmVuY2VzLm9uVXBkYXRlfWA7XG4gICAgICAgIH1cblxuICAgICAgICBwYXJ0cy5wdXNoKGZrQ2xhdXNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBzdHJpbmcgbG9va3MgbGlrZSBhIFNRTCBmdW5jdGlvbiBjYWxsXG4gICAqL1xuICBwcml2YXRlIGlzU1FMRnVuY3Rpb24oc3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBTaW1wbGUgaGV1cmlzdGljOiBjb250YWlucyBwYXJlbnRoZXNlcyBhbmQgY29tbW9uIFNRTCBmdW5jdGlvbiBwYXR0ZXJuc1xuICAgIGNvbnN0IGZ1bmN0aW9uUGF0dGVybnMgPSBbXG4gICAgICAvXlxcdytcXHMqXFwoLywgLy8gRnVuY3Rpb24gbmFtZSBmb2xsb3dlZCBieSAoXG4gICAgICAvXihkYXRldGltZXxkYXRlfHRpbWV8c3RyZnRpbWV8Y3VycmVudF90aW1lc3RhbXB8Y3VycmVudF9kYXRlfGN1cnJlbnRfdGltZSkvaSxcbiAgICAgIC9eKHJhbmRvbXxhYnN8bGVuZ3RofHVwcGVyfGxvd2VyfHRyaW0pL2ksXG4gICAgICAvXihjb2FsZXNjZXxpZm51bGx8bnVsbGlmfGlpZikvaSxcbiAgICAgIC9eKGpzb258anNvbl9leHRyYWN0fGpzb25fdmFsaWQpL2ksXG4gICAgXTtcblxuICAgIHJldHVybiBmdW5jdGlvblBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChzdHIudHJpbSgpKSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgdGFibGUgY29tbWVudCBhcyBtZXRhZGF0YSAodXNpbmcgYSBzeXN0ZW0gdGFibGUgaWYgbmVlZGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBzZXRUYWJsZUNvbW1lbnQodGFibGVOYW1lOiBzdHJpbmcsIGNvbW1lbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBtZXRhZGF0YSB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGIuZXhlYyhgXG4gICAgICAgIENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIF9fdGFibGVfbWV0YWRhdGFfXyAoXG4gICAgICAgICAgdGFibGVfbmFtZSBURVhUIFBSSU1BUlkgS0VZLFxuICAgICAgICAgIGNvbW1lbnQgVEVYVCxcbiAgICAgICAgICBjcmVhdGVkX2F0IERBVEVUSU1FIERFRkFVTFQgQ1VSUkVOVF9USU1FU1RBTVBcbiAgICAgICAgKVxuICAgICAgYCk7XG5cbiAgICAgIC8vIEluc2VydCBvciByZXBsYWNlIGNvbW1lbnRcbiAgICAgIGNvbnN0IHN0bXQgPSB0aGlzLmRiLnByZXBhcmUoYFxuICAgICAgICBJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIF9fdGFibGVfbWV0YWRhdGFfXyAodGFibGVfbmFtZSwgY29tbWVudCwgY3JlYXRlZF9hdClcbiAgICAgICAgVkFMVUVTICg/LCA/LCBDVVJSRU5UX1RJTUVTVEFNUClcbiAgICAgIGApO1xuICAgICAgc3RtdC5ydW4odGFibGVOYW1lLCBjb21tZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU2lsZW50bHkgaWdub3JlIGlmIHdlIGNhbid0IGNyZWF0ZSBtZXRhZGF0YSB0YWJsZVxuICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3Qgc3RvcmUgdGFibGUgY29tbWVudCBmb3IgJHt0YWJsZU5hbWV9OmAsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRhYmxlIGNvbW1lbnQgZnJvbSBtZXRhZGF0YVxuICAgKi9cbiAgZ2V0VGFibGVDb21tZW50KHRhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0bXQgPSB0aGlzLmRiLnByZXBhcmUoYFxuICAgICAgICBTRUxFQ1QgY29tbWVudCBGUk9NIF9fdGFibGVfbWV0YWRhdGFfXyBXSEVSRSB0YWJsZV9uYW1lID0gP1xuICAgICAgYCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdG10LmdldCh0YWJsZU5hbWUpIGFzIHsgY29tbWVudDogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gcmVzdWx0Py5jb21tZW50IHx8IG51bGw7XG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHJhdyBTUUwgc3RhdGVtZW50XG4gICAqL1xuICBleGVjKHNxbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYi5leGVjKHNxbCk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSBhIFNRTCBzdGF0ZW1lbnQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvblxuICAgKi9cbiAgcHJlcGFyZShzcWw6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmRiLnByZXBhcmUoc3FsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb25cbiAgICovXG4gIHRyYW5zYWN0aW9uPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oZm4pKCk7XG4gIH1cblxuICAvKipcbiAgICogQmVnaW4gYSB0cmFuc2FjdGlvbiBtYW51YWxseVxuICAgKi9cbiAgYmVnaW4obW9kZT86IFwiREVGRVJSRURcIiB8IFwiSU1NRURJQVRFXCIgfCBcIkVYQ0xVU0lWRVwiKTogdm9pZCB7XG4gICAgY29uc3QgbW9kZVN0ciA9IG1vZGUgPyBgICR7bW9kZX1gIDogXCJcIjtcbiAgICB0aGlzLmRiLmV4ZWMoYEJFR0lOJHttb2RlU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uXG4gICAqL1xuICBjb21taXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYi5leGVjKFwiQ09NTUlUXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIGEgdHJhbnNhY3Rpb25cbiAgICovXG4gIHJvbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuZGIuZXhlYyhcIlJPTExCQUNLXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNhdmVwb2ludFxuICAgKi9cbiAgc2F2ZXBvaW50KG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHF1b3RlZE5hbWUgPSBgXCIke25hbWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XG4gICAgdGhpcy5kYi5leGVjKGBTQVZFUE9JTlQgJHtxdW90ZWROYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYSBzYXZlcG9pbnRcbiAgICovXG4gIHJlbGVhc2VTYXZlcG9pbnQobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcXVvdGVkTmFtZSA9IGBcIiR7bmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgICB0aGlzLmRiLmV4ZWMoYFJFTEVBU0UgU0FWRVBPSU5UICR7cXVvdGVkTmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsYmFjayB0byBhIHNhdmVwb2ludFxuICAgKi9cbiAgcm9sbGJhY2tUb1NhdmVwb2ludChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBxdW90ZWROYW1lID0gYFwiJHtuYW1lLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICAgIHRoaXMuZGIuZXhlYyhgUk9MTEJBQ0sgVE8gU0FWRVBPSU5UICR7cXVvdGVkTmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWN1dW0gdGhlIGRhdGFiYXNlIChyZWNsYWltIHNwYWNlIGFuZCBvcHRpbWl6ZSlcbiAgICovXG4gIHZhY3V1bSgpOiB2b2lkIHtcbiAgICB0aGlzLmRiLmV4ZWMoXCJWQUNVVU1cIik7XG4gIH1cblxuICAvKipcbiAgICogQW5hbHl6ZSB0aGUgZGF0YWJhc2UgKHVwZGF0ZSBzdGF0aXN0aWNzIGZvciBxdWVyeSBvcHRpbWl6ZXIpXG4gICAqL1xuICBhbmFseXplKHRhYmxlTmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0YWJsZU5hbWUpIHtcbiAgICAgIGNvbnN0IHF1b3RlZE5hbWUgPSBgXCIke3RhYmxlTmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgICAgIHRoaXMuZGIuZXhlYyhgQU5BTFlaRSAke3F1b3RlZE5hbWV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGIuZXhlYyhcIkFOQUxZWkVcIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGRhdGFiYXNlIGludGVncml0eVxuICAgKi9cbiAgaW50ZWdyaXR5Q2hlY2soKTogQXJyYXk8eyBpbnRlZ3JpdHlfY2hlY2s6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuZGIucHJlcGFyZShcIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2tcIik7XG4gICAgcmV0dXJuIHN0bXQuYWxsKCkgYXMgQXJyYXk8eyBpbnRlZ3JpdHlfY2hlY2s6IHN0cmluZyB9PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGF0YWJhc2Ugc2NoZW1hIGluZm9ybWF0aW9uXG4gICAqL1xuICBnZXRTY2hlbWEoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3FsOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmRiLnByZXBhcmUoYFxuICAgICAgU0VMRUNUIG5hbWUsIHR5cGUsIHNxbFxuICAgICAgRlJPTSBzcWxpdGVfbWFzdGVyXG4gICAgICBXSEVSRSB0eXBlIElOICgndGFibGUnLCAnaW5kZXgnLCAndmlldycsICd0cmlnZ2VyJylcbiAgICAgIE9SREVSIEJZIHR5cGUsIG5hbWVcbiAgICBgKTtcbiAgICByZXR1cm4gc3RtdC5hbGwoKSBhcyBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzcWw6IHN0cmluZyB9PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGFibGUgaW5mbyAoY29sdW1ucywgdHlwZXMsIGNvbnN0cmFpbnRzKVxuICAgKi9cbiAgZ2V0VGFibGVJbmZvKHRhYmxlTmFtZTogc3RyaW5nKTogQXJyYXk8e1xuICAgIGNpZDogbnVtYmVyO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbm90bnVsbDogbnVtYmVyO1xuICAgIGRmbHRfdmFsdWU6IFNRTFF1ZXJ5QmluZGluZ3M7XG4gICAgcGs6IG51bWJlcjtcbiAgfT4ge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmRiLnByZXBhcmUoXG4gICAgICBgUFJBR01BIHRhYmxlX2luZm8oXCIke3RhYmxlTmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiKWAsXG4gICAgKTtcbiAgICByZXR1cm4gc3RtdC5hbGwoKSBhcyBBcnJheTx7XG4gICAgICBjaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5vdG51bGw6IG51bWJlcjtcbiAgICAgIGRmbHRfdmFsdWU6IFNRTFF1ZXJ5QmluZGluZ3M7XG4gICAgICBwazogbnVtYmVyO1xuICAgIH0+O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3JlaWduIGtleSBpbmZvcm1hdGlvbiBmb3IgYSB0YWJsZVxuICAgKi9cbiAgZ2V0Rm9yZWlnbktleXModGFibGVOYW1lOiBzdHJpbmcpOiBBcnJheTx7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBzZXE6IG51bWJlcjtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIGZyb206IHN0cmluZztcbiAgICB0bzogc3RyaW5nO1xuICAgIG9uX3VwZGF0ZTogc3RyaW5nO1xuICAgIG9uX2RlbGV0ZTogc3RyaW5nO1xuICAgIG1hdGNoOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzdG10ID0gdGhpcy5kYi5wcmVwYXJlKFxuICAgICAgYFBSQUdNQSBmb3JlaWduX2tleV9saXN0KFwiJHt0YWJsZU5hbWUucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cIilgLFxuICAgICk7XG4gICAgcmV0dXJuIHN0bXQuYWxsKCkgYXMgQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHNlcTogbnVtYmVyO1xuICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgIGZyb206IHN0cmluZztcbiAgICAgIHRvOiBzdHJpbmc7XG4gICAgICBvbl91cGRhdGU6IHN0cmluZztcbiAgICAgIG9uX2RlbGV0ZTogc3RyaW5nO1xuICAgICAgbWF0Y2g6IHN0cmluZztcbiAgICB9PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5kZXggaW5mb3JtYXRpb24gZm9yIGEgdGFibGVcbiAgICovXG4gIGdldEluZGV4ZXModGFibGVOYW1lOiBzdHJpbmcpOiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVuaXF1ZTogbnVtYmVyO1xuICAgIG9yaWdpbjogc3RyaW5nO1xuICAgIHBhcnRpYWw6IG51bWJlcjtcbiAgfT4ge1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmRiLnByZXBhcmUoXG4gICAgICBgUFJBR01BIGluZGV4X2xpc3QoXCIke3RhYmxlTmFtZS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiKWAsXG4gICAgKTtcbiAgICByZXR1cm4gc3RtdC5hbGwoKSBhcyBBcnJheTx7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB1bmlxdWU6IG51bWJlcjtcbiAgICAgIG9yaWdpbjogc3RyaW5nO1xuICAgICAgcGFydGlhbDogbnVtYmVyO1xuICAgIH0+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvciBnZXQgYSBQUkFHTUEgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gUFJBR01BIG5hbWUgKGUuZy4sIFwiZm9yZWlnbl9rZXlzXCIsIFwiam91cm5hbF9tb2RlXCIpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldCAob21pdCB0byBnZXQgY3VycmVudCB2YWx1ZSlcbiAgICogQHJldHVybnMgQ3VycmVudCB2YWx1ZSB3aGVuIGdldHRpbmcsIHVuZGVmaW5lZCB3aGVuIHNldHRpbmdcbiAgICovXG4gIHByYWdtYShuYW1lOiBzdHJpbmcsIHZhbHVlPzogU1FMUXVlcnlCaW5kaW5ncyk6IFNRTFF1ZXJ5QmluZGluZ3MgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRiLmV4ZWMoYFBSQUdNQSAke25hbWV9ID0gJHt2YWx1ZX1gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGIucHJlcGFyZShgUFJBR01BICR7bmFtZX1gKS5nZXQoKSBhcyBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBTUUxRdWVyeUJpbmRpbmdzXG4gICAgPjtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyZXN1bHQpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgYSBTUUxpdGUgZXh0ZW5zaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGNvbXBpbGVkIFNRTGl0ZSBleHRlbnNpb25cbiAgICovXG4gIGxvYWRFeHRlbnNpb24ocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYi5sb2FkRXh0ZW5zaW9uKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkaXJlY3QgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIFNRTGl0ZSBkYXRhYmFzZSBpbnN0YW5jZS5cbiAgICogVXNlIHRoaXMgZm9yIGFkdmFuY2VkIG9wZXJhdGlvbnMgbm90IGNvdmVyZWQgYnkgdGhlIHdyYXBwZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB1bmRlcmx5aW5nIERhdGFiYXNlIGluc3RhbmNlXG4gICAqL1xuICBnZXREYigpOiBEYXRhYmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuZGI7XG4gIH1cbn1cblxuZXhwb3J0IHsgREIgfTtcbmV4cG9ydCBkZWZhdWx0IERCO1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IERhdGFiYXNlLCBTUUxRdWVyeUJpbmRpbmdzIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ29sdW1uTmFtZXMsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBRdWVyeUJ1aWxkZXJTdGF0ZSxcbiAgSnNvbkNvbHVtbkNvbmZpZyxcbiAgRGF0YWJhc2VSb3dEYXRhLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBCYXNlIFF1ZXJ5QnVpbGRlciBjbGFzcyB0aGF0IG1hbmFnZXMgY29yZSBzdGF0ZSBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgcXVlcnkgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VRdWVyeUJ1aWxkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIHByb3RlY3RlZCBzdGF0ZTogUXVlcnlCdWlsZGVyU3RhdGU8VD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGI6IERhdGFiYXNlLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGpzb25Db25maWc/OiBKc29uQ29sdW1uQ29uZmlnPFQ+LFxuICApIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZGIsXG4gICAgICB0YWJsZU5hbWUsXG4gICAgICB3aGVyZUNvbmRpdGlvbnM6IFtdLFxuICAgICAgd2hlcmVQYXJhbXM6IFtdLFxuICAgICAgcmVnZXhDb25kaXRpb25zOiBbXSxcbiAgICAgIGpzb25Db2x1bW5zOiBqc29uQ29uZmlnPy5qc29uQ29sdW1ucyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGF0YWJhc2UgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXREYigpOiBEYXRhYmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZGI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0YWJsZSBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0VGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUudGFibGVOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBXSEVSRSBjbGF1c2UgcG9ydGlvbiBvZiBhIFNRTCBxdWVyeS5cbiAgICogQHJldHVybnMgVHVwbGUgb2YgW3doZXJlQ2xhdXNlLCBwYXJhbWV0ZXJzXSB3aGVyZSB3aGVyZUNsYXVzZSBpbmNsdWRlcyBcIldIRVJFXCIgcHJlZml4XG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRXaGVyZUNsYXVzZSgpOiBbc3RyaW5nLCBTUUxRdWVyeUJpbmRpbmdzW11dIHtcbiAgICBpZiAodGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW1wiXCIsIFtdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIGAgV0hFUkUgJHt0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5qb2luKFwiIEFORCBcIil9YCxcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMuc2xpY2UoKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgcmVnZXggY29uZGl0aW9ucyB0aGF0IHJlcXVpcmUgY2xpZW50LXNpZGUgZmlsdGVyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhc1JlZ2V4Q29uZGl0aW9ucygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5yZWdleENvbmRpdGlvbnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBjbGllbnQtc2lkZSByZWdleCBmaWx0ZXJpbmcgdG8gYSBzZXQgb2Ygcm93cy5cbiAgICogVGhpcyBpcyB1c2VkIHdoZW4gcmVnZXggY29uZGl0aW9ucyBhcmUgcHJlc2VudC5cbiAgICovXG4gIHByb3RlY3RlZCBhcHBseVJlZ2V4RmlsdGVyaW5nKHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgaWYgKHRoaXMuc3RhdGUucmVnZXhDb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MuZmlsdGVyKChyb3cpID0+XG4gICAgICB0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucy5ldmVyeSgoeyBjb2x1bW4sIHJlZ2V4IH0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbU3RyaW5nKGNvbHVtbildO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gcmVnZXgudGVzdChTdHJpbmcodmFsdWUpKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhhdCBXSEVSRSBjb25kaXRpb25zIGV4aXN0IGZvciBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSB0aGVtLlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgbm8gV0hFUkUgY29uZGl0aW9ucyBhcmUgcHJlc2VudC5cbiAgICovXG4gIHByb3RlY3RlZCByZXF1aXJlV2hlcmVDbGF1c2Uob3BlcmF0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHRoaXMuc3RhdGUucmVnZXhDb25kaXRpb25zLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtvcGVyYXRpb259IG9wZXJhdGlvbiByZXF1aXJlcyBhdCBsZWFzdCBvbmUgV0hFUkUgY29uZGl0aW9uLiBVc2Ugd2hlcmUoKSwgd2hlcmVSYXcoKSwgd2hlcmVJbigpLCB3aGVyZU9wKCksIG9yIHdoZXJlUmd4KCkgdG8gYWRkIGNvbmRpdGlvbnMuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFF1b3RlIFNRTCBpZGVudGlmaWVycyB0byBwcmV2ZW50IGluamVjdGlvbiBhbmQgaGFuZGxlIHNwZWNpYWwgY2hhcmFjdGVycy5cbiAgICovXG4gIHByb3RlY3RlZCBxdW90ZUlkZW50aWZpZXIoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFwiJHtpZGVudGlmaWVyLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGFsbCBXSEVSRSBjb25kaXRpb25zIGFuZCBwYXJhbWV0ZXJzLlxuICAgKiBVc2VmdWwgZm9yIHJldXNpbmcgdGhlIHNhbWUgYnVpbGRlciBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNldFdoZXJlQ29uZGl0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucyA9IFtdO1xuICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSByb3cgZGF0YSBhZnRlciBmZXRjaGluZyBmcm9tIGRhdGFiYXNlIChkZXNlcmlhbGl6ZSBKU09OIGNvbHVtbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRyYW5zZm9ybVJvd0Zyb21EYihyb3c6IHVua25vd24pOiBUIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuanNvbkNvbHVtbnMgfHwgIXJvdykgcmV0dXJuIHJvdyBhcyBUO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtZWQgPSB7IC4uLnJvdyB9IGFzIERhdGFiYXNlUm93RGF0YTtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLnN0YXRlLmpzb25Db2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2x1bW5LZXkgPSBTdHJpbmcoY29sdW1uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSAmJlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSA9PT0gXCJzdHJpbmdcIlxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSA9IEpTT04ucGFyc2UodHJhbnNmb3JtZWRbY29sdW1uS2V5XSBhcyBzdHJpbmcpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBLZWVwIG9yaWdpbmFsIHZhbHVlIGlmIEpTT04gcGFyc2luZyBmYWlsc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZCBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBtdWx0aXBsZSByb3dzIGFmdGVyIGZldGNoaW5nIGZyb20gZGF0YWJhc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJhbnNmb3JtUm93c0Zyb21EYihyb3dzOiB1bmtub3duW10pOiBUW10ge1xuICAgIGlmICghdGhpcy5zdGF0ZS5qc29uQ29sdW1ucykgcmV0dXJuIHJvd3MgYXMgVFtdO1xuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiB0aGlzLnRyYW5zZm9ybVJvd0Zyb21EYihyb3cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcm93IGRhdGEgYmVmb3JlIGluc2VydGluZy91cGRhdGluZyB0byBkYXRhYmFzZSAoc2VyaWFsaXplIEpTT04gY29sdW1ucykuXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJhbnNmb3JtUm93VG9EYihyb3c6IFBhcnRpYWw8VD4pOiBEYXRhYmFzZVJvd0RhdGEge1xuICAgIGlmICghdGhpcy5zdGF0ZS5qc29uQ29sdW1ucyB8fCAhcm93KSByZXR1cm4gcm93IGFzIERhdGFiYXNlUm93RGF0YTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkOiBEYXRhYmFzZVJvd0RhdGEgPSB7IC4uLnJvdyB9IGFzIERhdGFiYXNlUm93RGF0YTtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLnN0YXRlLmpzb25Db2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2x1bW5LZXkgPSBTdHJpbmcoY29sdW1uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRyYW5zZm9ybWVkW2NvbHVtbktleV0gIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkW2NvbHVtbktleV0gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1lZFtjb2x1bW5LZXldID0gSlNPTi5zdHJpbmdpZnkodHJhbnNmb3JtZWRbY29sdW1uS2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgU1FMUXVlcnlCaW5kaW5ncyB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgdHlwZSB7IFdoZXJlQ29uZGl0aW9uLCBSZWdleENvbmRpdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQmFzZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgV0hFUkUtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBRdWVyeUJ1aWxkZXIuXG4gKiBUaGlzIGluY2x1ZGVzIGFsbCBjb25kaXRpb25hbCBmaWx0ZXJpbmcgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdoZXJlUXVlcnlCdWlsZGVyPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+IGV4dGVuZHMgQmFzZVF1ZXJ5QnVpbGRlcjxUPiB7XG4gIC8qKlxuICAgKiBBZGQgc2ltcGxlIGVxdWFsaXR5IGNvbmRpdGlvbnMgdG8gdGhlIFdIRVJFIGNsYXVzZS5cbiAgICogSGFuZGxlcyBudWxsIHZhbHVlcyBhcHByb3ByaWF0ZWx5IHdpdGggSVMgTlVMTCAvIElTIE5PVCBOVUxMLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyAtIE9iamVjdCB3aXRoIGNvbHVtbi12YWx1ZSBwYWlycyBmb3IgZXF1YWxpdHkgY2hlY2tzXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VD4pOiB0aGlzIHtcbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25kaXRpb25zKSkge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gSVMgTlVMTGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gPSA/YCk7XG4gICAgICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCByZWdleCBjb25kaXRpb25zLiBOb3RlOiByZWdleCBjb25kaXRpb25zIGFyZSBhcHBsaWVkIGNsaWVudC1zaWRlXG4gICAqIGFmdGVyIFNRTCBleGVjdXRpb24gZHVlIHRvIEJ1bidzIFNRTGl0ZSBsaW1pdGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmRpdGlvbnMgLSBPYmplY3Qgd2l0aCBjb2x1bW4tcmVnZXggcGFpcnNcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZVJneChjb25kaXRpb25zOiBSZWdleENvbmRpdGlvbjxUPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZWdleENvbmRpdGlvbnMucHVzaCh7XG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4gYXMga2V5b2YgVCxcbiAgICAgICAgICByZWdleDogdmFsdWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS5yZWdleENvbmRpdGlvbnMucHVzaCh7XG4gICAgICAgICAgY29sdW1uOiBjb2x1bW4gYXMga2V5b2YgVCxcbiAgICAgICAgICByZWdleDogbmV3IFJlZ0V4cCh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEhhbmRsZSBub24tcmVnZXggdmFsdWVzIGFzIHNpbXBsZSBlcXVhbGl0eSBjb25kaXRpb25zXG4gICAgICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9ID0gP2ApO1xuICAgICAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByYXcgU1FMIFdIRVJFIGZyYWdtZW50IHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBleHByIC0gU1FMIGZyYWdtZW50ICh3aXRob3V0IGxlYWRpbmcgV0hFUkUvQU5EKSwgY2FuIHVzZSA/IHBsYWNlaG9sZGVyc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmFsdWVzIGZvciB0aGUgcGxhY2Vob2xkZXJzIGluIG9yZGVyXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmVFeHByKGV4cHI6IHN0cmluZywgcGFyYW1zOiBTUUxRdWVyeUJpbmRpbmdzW10gPSBbXSk6IHRoaXMge1xuICAgIGlmICghZXhwciB8fCB0eXBlb2YgZXhwciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwid2hlcmVFeHByOiBleHByIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nXCIpO1xuICAgIH1cbiAgICAvLyBXcmFwIGluIHBhcmVudGhlc2VzIHRvIHByZXNlcnZlIGdyb3VwaW5nIHdoZW4gY29tYmluZWQgd2l0aCBvdGhlciBjbGF1c2VzXG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgKCR7ZXhwcn0pYCk7XG4gICAgaWYgKHBhcmFtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaCguLi5wYXJhbXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyBmb3Igd2hlcmVFeHByIGZvciBjb21wYXRpYmlsaXR5XG4gICAqL1xuICB3aGVyZVJhdyhleHByOiBzdHJpbmcsIHBhcmFtczogU1FMUXVlcnlCaW5kaW5nc1tdID0gW10pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy53aGVyZUV4cHIoZXhwciwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gSU4gY2xhdXNlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIHdpdGggcHJvcGVyIHBhcmFtZXRlciBiaW5kaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlcyAtIE5vbi1lbXB0eSBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBJTiBjbGF1c2VcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZUluKGNvbHVtbjoga2V5b2YgVCwgdmFsdWVzOiBTUUxRdWVyeUJpbmRpbmdzW10pOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSB8fCB2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3aGVyZUluOiB2YWx1ZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheVwiKTtcbiAgICB9XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpO1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElOICgke3BsYWNlaG9sZGVyc30pYCk7XG4gICAgdGhpcy5zdGF0ZS53aGVyZVBhcmFtcy5wdXNoKC4uLnZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgTk9UIElOIGNsYXVzZSBmb3IgdGhlIGdpdmVuIGNvbHVtbiB3aXRoIHByb3BlciBwYXJhbWV0ZXIgYmluZGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lIHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBOb24tZW1wdHkgYXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgTk9UIElOIGNsYXVzZVxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIHdoZXJlTm90SW4oY29sdW1uOiBrZXlvZiBULCB2YWx1ZXM6IFNRTFF1ZXJ5QmluZGluZ3NbXSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIndoZXJlTm90SW46IHZhbHVlcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChcbiAgICAgIGAke1N0cmluZyhjb2x1bW4pfSBOT1QgSU4gKCR7cGxhY2Vob2xkZXJzfSlgLFxuICAgICk7XG4gICAgdGhpcy5zdGF0ZS53aGVyZVBhcmFtcy5wdXNoKC4uLnZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBjb25kaXRpb24gd2l0aCBwcm9wZXIgbnVsbCBoYW5kbGluZy5cbiAgICogU3VwcG9ydHM6ID0sICE9LCA8PiwgPCwgPD0sID4sID49LCBMSUtFLCBHTE9CLCBJU1xuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHBhcmFtIG9wIC0gQ29tcGFyaXNvbiBvcGVyYXRvclxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjb21wYXJlIChoYW5kbGVzIG51bGwgYXBwcm9wcmlhdGVseSlcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZU9wKGNvbHVtbjoga2V5b2YgVCwgb3A6IHN0cmluZywgdmFsdWU6IFNRTFF1ZXJ5QmluZGluZ3MpOiB0aGlzIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3AgPSAob3AgPz8gXCJcIikudG9VcHBlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3QgYWxsb3dlZCA9IFtcbiAgICAgIFwiPVwiLFxuICAgICAgXCIhPVwiLFxuICAgICAgXCI8PlwiLFxuICAgICAgXCI8XCIsXG4gICAgICBcIjw9XCIsXG4gICAgICBcIj5cIixcbiAgICAgIFwiPj1cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJHTE9CXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIklTIE5PVFwiLFxuICAgIF07XG5cbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMobm9ybWFsaXplZE9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aGVyZU9wOiBvcGVyYXRvciBcIiR7b3B9XCIgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBudWxsIHNwZWNpYWwtY2FzaW5nIGZvciBJUyAvIElTIE5PVCBhbmQgZXF1YWxpdHkgb3BlcmF0b3JzXG4gICAgaWYgKFxuICAgICAgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAobm9ybWFsaXplZE9wID09PSBcIj1cIiB8fCBub3JtYWxpemVkT3AgPT09IFwiSVNcIilcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElTIE5VTExgKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKG5vcm1hbGl6ZWRPcCA9PT0gXCIhPVwiIHx8XG4gICAgICAgIG5vcm1hbGl6ZWRPcCA9PT0gXCI8PlwiIHx8XG4gICAgICAgIG5vcm1hbGl6ZWRPcCA9PT0gXCJJUyBOT1RcIilcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElTIE5PVCBOVUxMYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgcGFyYW0tYm91bmQgY29uZGl0aW9uXG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gJHtub3JtYWxpemVkT3B9ID9gKTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIEJFVFdFRU4gY29uZGl0aW9uIGZvciB0aGUgZ2l2ZW4gY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHBhcmFtIG1pbiAtIE1pbmltdW0gdmFsdWUgKGluY2x1c2l2ZSlcbiAgICogQHBhcmFtIG1heCAtIE1heGltdW0gdmFsdWUgKGluY2x1c2l2ZSlcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZUJldHdlZW4oXG4gICAgY29sdW1uOiBrZXlvZiBULFxuICAgIG1pbjogU1FMUXVlcnlCaW5kaW5ncyxcbiAgICBtYXg6IFNRTFF1ZXJ5QmluZGluZ3MsXG4gICk6IHRoaXMge1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IEJFVFdFRU4gPyBBTkQgP2ApO1xuICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaChtaW4sIG1heCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgTk9UIEJFVFdFRU4gY29uZGl0aW9uIGZvciB0aGUgZ2l2ZW4gY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHBhcmFtIG1pbiAtIE1pbmltdW0gdmFsdWUgKGV4Y2x1c2l2ZSlcbiAgICogQHBhcmFtIG1heCAtIE1heGltdW0gdmFsdWUgKGV4Y2x1c2l2ZSlcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZU5vdEJldHdlZW4oXG4gICAgY29sdW1uOiBrZXlvZiBULFxuICAgIG1pbjogU1FMUXVlcnlCaW5kaW5ncyxcbiAgICBtYXg6IFNRTFF1ZXJ5QmluZGluZ3MsXG4gICk6IHRoaXMge1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IE5PVCBCRVRXRUVOID8gQU5EID9gKTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2gobWluLCBtYXgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBJUyBOVUxMIGNvbmRpdGlvbiBmb3IgdGhlIGdpdmVuIGNvbHVtbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmVOdWxsKGNvbHVtbjoga2V5b2YgVCk6IHRoaXMge1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElTIE5VTExgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gSVMgTk9UIE5VTEwgY29uZGl0aW9uIGZvciB0aGUgZ2l2ZW4gY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZU5vdE51bGwoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gSVMgTk9UIE5VTExgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFNRTFF1ZXJ5QmluZGluZ3MgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5OYW1lcywgT3JkZXJEaXJlY3Rpb24gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFdoZXJlUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vd2hlcmVcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgU0VMRUNULXNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIFF1ZXJ5QnVpbGRlci5cbiAqIEhhbmRsZXMgY29sdW1uIHNlbGVjdGlvbiwgb3JkZXJpbmcsIGxpbWl0aW5nLCBhbmQgcmVzdWx0IGV4ZWN1dGlvbiBtZXRob2RzLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0UXVlcnlCdWlsZGVyPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+IGV4dGVuZHMgV2hlcmVRdWVyeUJ1aWxkZXI8VD4ge1xuICBwcml2YXRlIHNlbGVjdGVkQ29sdW1uczogQ29sdW1uTmFtZXM8VD4gPSBbXCIqXCJdO1xuICBwcml2YXRlIG9yZGVyQ29sdW1uPzoga2V5b2YgVDtcbiAgcHJpdmF0ZSBvcmRlckRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBcIkFTQ1wiO1xuICBwcml2YXRlIGxpbWl0VmFsdWU/OiBudW1iZXI7XG4gIHByaXZhdGUgb2Zmc2V0VmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hpY2ggY29sdW1ucyB0byBzZWxlY3QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQXJyYXkgb2YgY29sdW1uIG5hbWVzIG9yIFtcIipcIl0gZm9yIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgc2VsZWN0KGNvbHVtbnM6IENvbHVtbk5hbWVzPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBPUkRFUiBCWSBjbGF1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4gLSBDb2x1bW4gbmFtZSB0byBvcmRlciBieVxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIG9yZGVyQnkoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5vcmRlckNvbHVtbiA9IGNvbHVtbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3JkZXIgZGlyZWN0aW9uIHRvIGRlc2NlbmRpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZGVzYygpOiB0aGlzIHtcbiAgICB0aGlzLm9yZGVyRGlyZWN0aW9uID0gXCJERVNDXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9yZGVyIGRpcmVjdGlvbiB0byBhc2NlbmRpbmcgKGRlZmF1bHQpLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIGFzYygpOiB0aGlzIHtcbiAgICB0aGlzLm9yZGVyRGlyZWN0aW9uID0gXCJBU0NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgTElNSVQgY2xhdXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYW1vdW50IC0gTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBsaW1pdChhbW91bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChhbW91bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsaW1pdDogYW1vdW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlXCIpO1xuICAgIH1cbiAgICB0aGlzLmxpbWl0VmFsdWUgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIE9GRlNFVCBjbGF1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCAtIE51bWJlciBvZiByb3dzIHRvIHNraXBcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBvZmZzZXQoc3RhcnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm9mZnNldDogc3RhcnQgbXVzdCBiZSBub24tbmVnYXRpdmVcIik7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBzdGFydDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgY29tcGxldGUgU0VMRUNUIHF1ZXJ5LlxuICAgKiBJZiByZWdleCBjb25kaXRpb25zIGV4aXN0LCBPUkRFUi9MSU1JVC9PRkZTRVQgYXJlIG5vdCBpbmNsdWRlZCBpbiBTUUxcbiAgICogYXMgdGhleSB3aWxsIGJlIGFwcGxpZWQgY2xpZW50LXNpZGUgYWZ0ZXIgcmVnZXggZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaW5jbHVkZU9yZGVyQW5kTGltaXQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgT1JERVIvTElNSVQvT0ZGU0VUIGluIFNRTFxuICAgKiBAcmV0dXJucyBUdXBsZSBvZiBbcXVlcnksIHBhcmFtZXRlcnNdXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0UXVlcnkoXG4gICAgaW5jbHVkZU9yZGVyQW5kTGltaXQgPSB0cnVlLFxuICApOiBbc3RyaW5nLCBTUUxRdWVyeUJpbmRpbmdzW11dIHtcbiAgICBjb25zdCBjb2xzID1cbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zWzBdID09PSBcIipcIlxuICAgICAgICA/IFwiKlwiXG4gICAgICAgIDogKHRoaXMuc2VsZWN0ZWRDb2x1bW5zIGFzIHN0cmluZ1tdKS5qb2luKFwiLCBcIik7XG5cbiAgICBsZXQgcXVlcnkgPSBgU0VMRUNUICR7Y29sc30gRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfWA7XG5cbiAgICBjb25zdCBbd2hlcmVDbGF1c2UsIHdoZXJlUGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIHF1ZXJ5ICs9IHdoZXJlQ2xhdXNlO1xuXG4gICAgaWYgKGluY2x1ZGVPcmRlckFuZExpbWl0ICYmICF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSB7XG4gICAgICBpZiAodGhpcy5vcmRlckNvbHVtbikge1xuICAgICAgICBxdWVyeSArPSBgIE9SREVSIEJZICR7U3RyaW5nKHRoaXMub3JkZXJDb2x1bW4pfSAke3RoaXMub3JkZXJEaXJlY3Rpb259YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGltaXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXJ5ICs9IGAgTElNSVQgJHt0aGlzLmxpbWl0VmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2Zmc2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWVyeSArPSBgIE9GRlNFVCAke3RoaXMub2Zmc2V0VmFsdWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3F1ZXJ5LCB3aGVyZVBhcmFtc107XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgSmF2YVNjcmlwdC1iYXNlZCBmaWx0ZXJpbmcsIG9yZGVyaW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAgICogVXNlZCB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgcmVxdWlyZSBjbGllbnQtc2lkZSBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcm93cyAtIFJvd3MgdG8gcHJvY2Vzc1xuICAgKiBAcmV0dXJucyBQcm9jZXNzZWQgcm93c1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUNsaWVudFNpZGVPcGVyYXRpb25zKHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgaWYgKCF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSByZXR1cm4gcm93cztcblxuICAgIC8vIEFwcGx5IHJlZ2V4IGZpbHRlcnNcbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmFwcGx5UmVnZXhGaWx0ZXJpbmcocm93cyk7XG5cbiAgICAvLyBBcHBseSBvcmRlcmluZyBpbiBKYXZhU2NyaXB0XG4gICAgaWYgKHRoaXMub3JkZXJDb2x1bW4pIHtcbiAgICAgIGNvbnN0IGNvbCA9IFN0cmluZyh0aGlzLm9yZGVyQ29sdW1uKTtcbiAgICAgIGZpbHRlcmVkLnNvcnQoKGE6IFQsIGI6IFQpID0+IHtcbiAgICAgICAgY29uc3QgdmEgPSBhW2NvbF07XG4gICAgICAgIGNvbnN0IHZiID0gYltjb2xdO1xuICAgICAgICBpZiAodmEgPT09IHZiKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKHZhID09PSBudWxsIHx8IHZhID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKHZiID09PSBudWxsIHx8IHZiID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgICAgICBpZiAodmEgPCB2YikgcmV0dXJuIHRoaXMub3JkZXJEaXJlY3Rpb24gPT09IFwiQVNDXCIgPyAtMSA6IDE7XG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyRGlyZWN0aW9uID09PSBcIkFTQ1wiID8gMSA6IC0xO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgb2Zmc2V0ICYgbGltaXQgaW4gSmF2YVNjcmlwdFxuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5vZmZzZXRWYWx1ZSA/PyAwO1xuICAgIGlmICh0aGlzLmxpbWl0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5zbGljZShzdGFydCwgc3RhcnQgKyB0aGlzLmxpbWl0VmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoc3RhcnQgPiAwKSB7XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLnNsaWNlKHN0YXJ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiBhbGwgbWF0Y2hpbmcgcm93cy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygcm93cyBtYXRjaGluZyB0aGUgcXVlcnlcbiAgICovXG4gIGFsbCgpOiBUW10ge1xuICAgIGlmICghdGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSkge1xuICAgICAgY29uc3QgW3F1ZXJ5LCBwYXJhbXNdID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHRydWUpO1xuICAgICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgICAgLmFsbCguLi5wYXJhbXMpIGFzIFRbXTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVJvd3NGcm9tRGIocm93cyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3F1ZXJ5LCBwYXJhbXNdID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KGZhbHNlKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5hbGwoLi4ucGFyYW1zKSBhcyBUW107XG4gICAgY29uc3QgdHJhbnNmb3JtZWRSb3dzID0gdGhpcy50cmFuc2Zvcm1Sb3dzRnJvbURiKHJvd3MpO1xuICAgIHJldHVybiB0aGlzLmFwcGx5Q2xpZW50U2lkZU9wZXJhdGlvbnModHJhbnNmb3JtZWRSb3dzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBtYXRjaGluZyByb3csIG9yIG51bGwgaWYgbm9uZSBmb3VuZC5cbiAgICogSWYgbm8gZXhwbGljaXQgTElNSVQgaXMgc2V0LCBhZGRzIExJTUlUIDEgZm9yIGVmZmljaWVuY3kuXG4gICAqXG4gICAqIEByZXR1cm5zIEZpcnN0IG1hdGNoaW5nIHJvdyBvciBudWxsXG4gICAqL1xuICBnZXQoKTogVCB8IG51bGwge1xuICAgIGlmICghdGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSAmJiB0aGlzLmxpbWl0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTm8gcmVnZXggYW5kIG5vIGV4cGxpY2l0IGxpbWl0LCB3ZSBjYW4gc2FmZWx5IGFkZCBMSU1JVCAxXG4gICAgICBjb25zdCBbcXVlcnksIHBhcmFtc10gPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkodHJ1ZSk7XG4gICAgICBjb25zdCBxID0gcXVlcnkuaW5jbHVkZXMoXCJMSU1JVFwiKSA/IHF1ZXJ5IDogYCR7cXVlcnl9IExJTUlUIDFgO1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAgIC5wcmVwYXJlKHEpXG4gICAgICAgIC5nZXQoLi4ucGFyYW1zKSBhcyBUIHwgbnVsbDtcbiAgICAgIHJldHVybiByb3cgPyB0aGlzLnRyYW5zZm9ybVJvd0Zyb21EYihyb3cpIDogbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkgJiYgdGhpcy5saW1pdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIExpbWl0IGlzIHByZXNlbnQ7IGp1c3QgdXNlIHRoZSBxdWVyeSBhcy1pc1xuICAgICAgY29uc3QgW3F1ZXJ5LCBwYXJhbXNdID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHRydWUpO1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAgIC5wcmVwYXJlKHF1ZXJ5KVxuICAgICAgICAuZ2V0KC4uLnBhcmFtcykgYXMgVCB8IG51bGw7XG4gICAgICByZXR1cm4gcm93ID8gdGhpcy50cmFuc2Zvcm1Sb3dGcm9tRGIocm93KSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFzIHJlZ2V4IGNvbmRpdGlvbnMsIG5lZWQgdG8gcHJvY2VzcyBjbGllbnQtc2lkZVxuICAgIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmFsbCgpO1xuICAgIHJldHVybiByZXN1bHRzWzBdID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiB0aGUgZmlyc3QgbWF0Y2hpbmcgcm93LCBvciBudWxsIGlmIG5vbmUgZm91bmQuXG4gICAqIEFsd2F5cyByZXNwZWN0cyB0aGUgc2VtYW50aWNzIG9mIHJldHVybmluZyB0aGUgZmlyc3Qgcm93IHJlZ2FyZGxlc3Mgb2YgTElNSVQuXG4gICAqXG4gICAqIEByZXR1cm5zIEZpcnN0IG1hdGNoaW5nIHJvdyBvciBudWxsXG4gICAqL1xuICBmaXJzdCgpOiBUIHwgbnVsbCB7XG4gICAgLy8gVGVtcG9yYXJpbHkgc2V0IGxpbWl0IHRvIDEgYnV0IHByZXNlcnZlIHByZXZpb3VzIHZhbHVlXG4gICAgY29uc3QgcHJldkxpbWl0ID0gdGhpcy5saW1pdFZhbHVlO1xuICAgIHRoaXMubGltaXRWYWx1ZSA9IDE7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXQoKTtcbiAgICB0aGlzLmxpbWl0VmFsdWUgPSBwcmV2TGltaXQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgQ09VTlQgcXVlcnkgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIHJvd3MuXG4gICAqIEZvciByZWdleCBjb25kaXRpb25zLCB0aGlzIGZldGNoZXMgYWxsIHJvd3MgYW5kIGNvdW50cyBjbGllbnQtc2lkZS5cbiAgICpcbiAgICogQHJldHVybnMgTnVtYmVyIG9mIG1hdGNoaW5nIHJvd3NcbiAgICovXG4gIGNvdW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSB7XG4gICAgICAvLyBTYWZlIHRvIGRvIENPVU5UKCopIGluIFNRTFxuICAgICAgY29uc3QgW2Jhc2VRdWVyeSwgcGFyYW1zXSA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh0cnVlKTtcbiAgICAgIGNvbnN0IGNvdW50UXVlcnkgPSBiYXNlUXVlcnkucmVwbGFjZShcbiAgICAgICAgL1NFTEVDVCAoLis/KSBGUk9NL2ksXG4gICAgICAgIFwiU0VMRUNUIENPVU5UKCopIEFTIF9fY291bnQgRlJPTVwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShjb3VudFF1ZXJ5KVxuICAgICAgICAuZ2V0KC4uLnBhcmFtcykgYXMge1xuICAgICAgICBfX2NvdW50OiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdD8uX19jb3VudCA/PyAwO1xuICAgIH1cblxuICAgIC8vIEhhcyByZWdleCBjb25kaXRpb25zLCBjb3VudCBjbGllbnQtc2lkZVxuICAgIHJldHVybiB0aGlzLmFsbCgpLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbnkgcm93cyBtYXRjaCB0aGUgY3VycmVudCBjb25kaXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSByb3cgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBleGlzdHMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSB7XG4gICAgICAvLyBVc2UgRVhJU1RTIGZvciBlZmZpY2llbmN5XG4gICAgICBjb25zdCBbYmFzZVF1ZXJ5LCBwYXJhbXNdID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHRydWUpO1xuICAgICAgY29uc3QgZXhpc3RzUXVlcnkgPSBgU0VMRUNUIEVYSVNUUygke2Jhc2VRdWVyeX0pIEFTIF9fZXhpc3RzYDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShleGlzdHNRdWVyeSlcbiAgICAgICAgLmdldCguLi5wYXJhbXMpIGFzIHtcbiAgICAgICAgX19leGlzdHM6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gQm9vbGVhbihyZXN1bHQ/Ll9fZXhpc3RzKTtcbiAgICB9XG5cbiAgICAvLyBIYXMgcmVnZXggY29uZGl0aW9ucywgY2hlY2sgY2xpZW50LXNpZGVcbiAgICByZXR1cm4gdGhpcy5jb3VudCgpID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAqIFVzZWZ1bCBmb3IgZ2V0dGluZyBhIHNwZWNpZmljIGZpZWxkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbVxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4gZnJvbSB0aGUgZmlyc3Qgcm93LCBvciBudWxsXG4gICAqL1xuICB2YWx1ZTxLIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBLKTogVFtLXSB8IG51bGwge1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZmlyc3QoKTtcbiAgICByZXR1cm4gcm93ID8gcm93W2NvbHVtbl0gOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgdmFsdWVzIGZyb20gYSBzaW5nbGUgY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gZXh0cmFjdCB2YWx1ZXMgZnJvbVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtblxuICAgKi9cbiAgcGx1Y2s8SyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogSyk6IFRbS11bXSB7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuYWxsKCk7XG4gICAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvd1tjb2x1bW5dKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFNRTFF1ZXJ5QmluZGluZ3MgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBJbnNlcnRSZXN1bHQsIEluc2VydE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFdoZXJlUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vd2hlcmVcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgSU5TRVJUIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIFF1ZXJ5QnVpbGRlci5cbiAqIEhhbmRsZXMgc2luZ2xlIGFuZCBidWxrIGluc2VydCBvcGVyYXRpb25zIHdpdGggY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFF1ZXJ5QnVpbGRlcjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuPiBleHRlbmRzIFdoZXJlUXVlcnlCdWlsZGVyPFQ+IHtcbiAgLyoqXG4gICAqIEluc2VydCBhIHNpbmdsZSByb3cgb3IgbXVsdGlwbGUgcm93cyBpbnRvIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaW5nbGUgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSW5zZXJ0IG9wdGlvbnMgKE9SIElHTk9SRSwgT1IgUkVQTEFDRSwgZXRjLilcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnQoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSxcbiAgICBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyxcbiAgKTogSW5zZXJ0UmVzdWx0IHtcbiAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XG5cbiAgICAvLyBUcmFuc2Zvcm0gcm93cyB0byBoYW5kbGUgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgdHJhbnNmb3JtZWRSb3dzID0gcm93cy5tYXAoKHJvdykgPT4gdGhpcy50cmFuc2Zvcm1Sb3dUb0RiKHJvdykpO1xuXG4gICAgaWYgKHRyYW5zZm9ybWVkUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImluc2VydDogZGF0YSBjYW5ub3QgYmUgZW1wdHlcIik7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFsbCB1bmlxdWUgY29sdW1ucyBmcm9tIGFsbCByb3dzXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHRyYW5zZm9ybWVkUm93cykge1xuICAgICAgZm9yIChjb25zdCBjb2wgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAgICBhbGxDb2x1bW5zLmFkZChjb2wpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbnMgPSBBcnJheS5mcm9tKGFsbENvbHVtbnMpO1xuICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0OiBubyBjb2x1bW5zIHRvIGluc2VydFwiKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBJTlNFUlQgc3RhdGVtZW50IHdpdGggY29uZmxpY3QgcmVzb2x1dGlvblxuICAgIGxldCBpbnNlcnRUeXBlID0gXCJJTlNFUlRcIjtcbiAgICBpZiAob3B0aW9ucz8ub3JJZ25vcmUpIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBJR05PUkVcIjtcbiAgICBlbHNlIGlmIChvcHRpb25zPy5vclJlcGxhY2UpIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBSRVBMQUNFXCI7XG4gICAgZWxzZSBpZiAob3B0aW9ucz8ub3JBYm9ydCkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIEFCT1JUXCI7XG4gICAgZWxzZSBpZiAob3B0aW9ucz8ub3JGYWlsKSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgRkFJTFwiO1xuICAgIGVsc2UgaWYgKG9wdGlvbnM/Lm9yUm9sbGJhY2spIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBST0xMQkFDS1wiO1xuXG4gICAgY29uc3QgcXVvdGVkQ29sdW1ucyA9IGNvbHVtbnNcbiAgICAgIC5tYXAoKGNvbCkgPT4gdGhpcy5xdW90ZUlkZW50aWZpZXIoY29sKSlcbiAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzID0gY29sdW1ucy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gYCR7aW5zZXJ0VHlwZX0gSU5UTyAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSAoJHtxdW90ZWRDb2x1bW5zfSkgVkFMVUVTICgke3BsYWNlaG9sZGVyc30pYDtcbiAgICBjb25zdCBzdG10ID0gdGhpcy5nZXREYigpLnByZXBhcmUocXVlcnkpO1xuXG4gICAgbGV0IHRvdGFsQ2hhbmdlcyA9IDA7XG4gICAgbGV0IGxhc3RJbnNlcnRJZCA9IDA7XG5cbiAgICAvLyBFeGVjdXRlIGZvciBlYWNoIHJvd1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHRyYW5zZm9ybWVkUm93cykge1xuICAgICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoXG4gICAgICAgIChjb2wpID0+IHJvd1tjb2wgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gbnVsbCxcbiAgICAgICkgYXMgU1FMUXVlcnlCaW5kaW5nc1tdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RtdC5ydW4oLi4udmFsdWVzKTtcbiAgICAgIHRvdGFsQ2hhbmdlcyArPSByZXN1bHQuY2hhbmdlcztcbiAgICAgIGlmIChyZXN1bHQubGFzdEluc2VydFJvd2lkKSB7XG4gICAgICAgIGxhc3RJbnNlcnRJZCA9IE51bWJlcihyZXN1bHQubGFzdEluc2VydFJvd2lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0SWQ6IGxhc3RJbnNlcnRJZCxcbiAgICAgIGNoYW5nZXM6IHRvdGFsQ2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIElHTk9SRSBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnNlcnQoZGF0YSwgeyBvcklnbm9yZTogdHJ1ZSB9KVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPcklnbm9yZShkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoZGF0YSwgeyBvcklnbm9yZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBSRVBMQUNFIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIGluc2VydChkYXRhLCB7IG9yUmVwbGFjZTogdHJ1ZSB9KVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPclJlcGxhY2UoZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGRhdGEsIHsgb3JSZXBsYWNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIEFCT1JUIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYnV0IHByb3ZpZGVkIGZvciBleHBsaWNpdCB1c2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaW5nbGUgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm5zIEluc2VydCByZXN1bHQgd2l0aCBpbnNlcnRJZCBhbmQgY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5zZXJ0T3JBYm9ydChkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoZGF0YSwgeyBvckFib3J0OiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIEZBSUwgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaW5nbGUgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm5zIEluc2VydCByZXN1bHQgd2l0aCBpbnNlcnRJZCBhbmQgY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5zZXJ0T3JGYWlsKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydChkYXRhLCB7IG9yRmFpbDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBST0xMQkFDSyBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPclJvbGxiYWNrKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydChkYXRhLCB7IG9yUm9sbGJhY2s6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGFuZCBnZXQgdGhlIGluc2VydGVkIHJvdyBiYWNrLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZSB0aGUgcm93IHdpdGggYXV0by1nZW5lcmF0ZWQgZmllbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3QgdG8gaW5zZXJ0IChidWxrIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbWV0aG9kKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEluc2VydCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFRoZSBpbnNlcnRlZCByb3cgd2l0aCBhbGwgZmllbGRzLCBvciBudWxsIGlmIGluc2VydGlvbiBmYWlsZWRcbiAgICovXG4gIGluc2VydEFuZEdldChkYXRhOiBQYXJ0aWFsPFQ+LCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IFQgfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmluc2VydChkYXRhLCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnNlcnRJZCwgdHJ5IHRvIGZldGNoIHRoZSBpbnNlcnRlZCByb3dcbiAgICBpZiAocmVzdWx0Lmluc2VydElkID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAgICAgLnByZXBhcmUoXG4gICAgICAgICAgICBgU0VMRUNUICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBXSEVSRSByb3dpZCA9ID9gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZ2V0KHJlc3VsdC5pbnNlcnRJZCkgYXMgVCB8IG51bGw7XG4gICAgICAgIHJldHVybiByb3cgPyB0aGlzLnRyYW5zZm9ybVJvd0Zyb21EYihyb3cpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZiBmZXRjaGluZyBieSByb3dpZCBmYWlscywgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggaW5zZXJ0IHdpdGggdHJhbnNhY3Rpb24gc3VwcG9ydC5cbiAgICogVGhpcyBtZXRob2Qgd3JhcHMgbXVsdGlwbGUgaW5zZXJ0cyBpbiBhIHRyYW5zYWN0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICogYW5kIGF0b21pY2l0eSB3aGVuIGluc2VydGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSByb3dzIC0gQXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBJbnNlcnQgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBJbnNlcnQgcmVzdWx0IHdpdGggdG90YWwgY2hhbmdlc1xuICAgKi9cbiAgaW5zZXJ0QmF0Y2gocm93czogUGFydGlhbDxUPltdLCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IEluc2VydFJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd3MpIHx8IHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnRCYXRjaDogcm93cyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREYigpO1xuXG4gICAgLy8gVXNlIGEgdHJhbnNhY3Rpb24gZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKChyb3dzVG9JbnNlcnQ6IFBhcnRpYWw8VD5bXSkgPT4ge1xuICAgICAgbGV0IHRvdGFsQ2hhbmdlcyA9IDA7XG4gICAgICBsZXQgbGFzdEluc2VydElkID0gMDtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJvd3MgdG8gaGFuZGxlIEpTT04gc2VyaWFsaXphdGlvblxuICAgICAgY29uc3QgdHJhbnNmb3JtZWRSb3dzID0gcm93c1RvSW5zZXJ0Lm1hcCgocm93KSA9PlxuICAgICAgICB0aGlzLnRyYW5zZm9ybVJvd1RvRGIocm93KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEdldCBhbGwgdW5pcXVlIGNvbHVtbnMgZnJvbSBhbGwgcm93c1xuICAgICAgY29uc3QgYWxsQ29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdHJhbnNmb3JtZWRSb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICBhbGxDb2x1bW5zLmFkZChjb2wpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBBcnJheS5mcm9tKGFsbENvbHVtbnMpO1xuICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImluc2VydEJhdGNoOiBubyBjb2x1bW5zIHRvIGluc2VydFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgSU5TRVJUIHN0YXRlbWVudCB3aXRoIGNvbmZsaWN0IHJlc29sdXRpb25cbiAgICAgIGxldCBpbnNlcnRUeXBlID0gXCJJTlNFUlRcIjtcbiAgICAgIGlmIChvcHRpb25zPy5vcklnbm9yZSkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIElHTk9SRVwiO1xuICAgICAgZWxzZSBpZiAob3B0aW9ucz8ub3JSZXBsYWNlKSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgUkVQTEFDRVwiO1xuICAgICAgZWxzZSBpZiAob3B0aW9ucz8ub3JBYm9ydCkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIEFCT1JUXCI7XG4gICAgICBlbHNlIGlmIChvcHRpb25zPy5vckZhaWwpIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBGQUlMXCI7XG4gICAgICBlbHNlIGlmIChvcHRpb25zPy5vclJvbGxiYWNrKSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgUk9MTEJBQ0tcIjtcblxuICAgICAgY29uc3QgcXVvdGVkQ29sdW1ucyA9IGNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiB0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpKVxuICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gY29sdW1ucy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcblxuICAgICAgY29uc3QgcXVlcnkgPSBgJHtpbnNlcnRUeXBlfSBJTlRPICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9ICgke3F1b3RlZENvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSlgO1xuICAgICAgY29uc3Qgc3RtdCA9IGRiLnByZXBhcmUocXVlcnkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0cmFuc2Zvcm1lZFJvd3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoXG4gICAgICAgICAgKGNvbCkgPT4gcm93W2NvbCBhcyBrZXlvZiB0eXBlb2Ygcm93XSA/PyBudWxsLFxuICAgICAgICApIGFzIFNRTFF1ZXJ5QmluZGluZ3NbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc3RtdC5ydW4oLi4udmFsdWVzKTtcbiAgICAgICAgdG90YWxDaGFuZ2VzICs9IHJlc3VsdC5jaGFuZ2VzO1xuICAgICAgICBpZiAocmVzdWx0Lmxhc3RJbnNlcnRSb3dpZCkge1xuICAgICAgICAgIGxhc3RJbnNlcnRJZCA9IE51bWJlcihyZXN1bHQubGFzdEluc2VydFJvd2lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpbnNlcnRJZDogbGFzdEluc2VydElkLCBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2FjdGlvbihyb3dzKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFNRTFF1ZXJ5QmluZGluZ3MgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVSZXN1bHQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3NlbGVjdFwiO1xuXG4vKipcbiAqIE1peGluIGNsYXNzIHRoYXQgYWRkcyBVUERBVEUgZnVuY3Rpb25hbGl0eSB0byB0aGUgUXVlcnlCdWlsZGVyLlxuICogSGFuZGxlcyBzYWZlIHVwZGF0ZSBvcGVyYXRpb25zIHdpdGggbWFuZGF0b3J5IFdIRVJFIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGRhdGVRdWVyeUJ1aWxkZXI8XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbj4gZXh0ZW5kcyBTZWxlY3RRdWVyeUJ1aWxkZXI8VD4ge1xuICAvKipcbiAgICogVXBkYXRlIHJvd3MgbWF0Y2hpbmcgdGhlIFdIRVJFIGNvbmRpdGlvbnMgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAgICogUmVxdWlyZXMgYXQgbGVhc3Qgb25lIFdIRVJFIGNvbmRpdGlvbiB0byBwcmV2ZW50IGFjY2lkZW50YWwgZnVsbCB0YWJsZSB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIE9iamVjdCB3aXRoIGNvbHVtbnMgdG8gdXBkYXRlIGFuZCB0aGVpciBuZXcgdmFsdWVzXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB1cGRhdGUoZGF0YTogUGFydGlhbDxUPik6IFVwZGF0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJVUERBVEVcIik7XG5cbiAgICAvLyBUcmFuc2Zvcm0gZGF0YSB0byBoYW5kbGUgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy50cmFuc2Zvcm1Sb3dUb0RiKGRhdGEpO1xuICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyh0cmFuc2Zvcm1lZERhdGEpO1xuICAgIGlmICh1cGRhdGVDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXBkYXRlOiBubyBjb2x1bW5zIHRvIHVwZGF0ZVwiKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcmVnZXggY29uZGl0aW9ucyBieSBmaXJzdCBmZXRjaGluZyBtYXRjaGluZyByb3dzXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpdGhSZWdleENvbmRpdGlvbnModHJhbnNmb3JtZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBVUERBVEUgc3RhdGVtZW50XG4gICAgY29uc3Qgc2V0Q2xhdXNlID0gdXBkYXRlQ29sdW1uc1xuICAgICAgLm1hcCgoY29sKSA9PiBgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpfSA9ID9gKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IFt3aGVyZUNsYXVzZSwgd2hlcmVQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgcXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3NldENsYXVzZX0ke3doZXJlQ2xhdXNlfWA7XG5cbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSB1cGRhdGVDb2x1bW5zLm1hcCgoY29sKSA9PiB0cmFuc2Zvcm1lZERhdGFbY29sXSk7XG4gICAgY29uc3QgYWxsUGFyYW1zID0gWy4uLnVwZGF0ZVZhbHVlcywgLi4ud2hlcmVQYXJhbXNdO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4uYWxsUGFyYW1zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVUERBVEUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqIFRoaXMgcmVxdWlyZXMgY2xpZW50LXNpZGUgZmlsdGVyaW5nIGFuZCBpbmRpdmlkdWFsIHJvdyB1cGRhdGVzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVXaXRoUmVnZXhDb25kaXRpb25zKFxuICAgIHRyYW5zZm9ybWVkRGF0YTogUmVjb3JkPHN0cmluZywgU1FMUXVlcnlCaW5kaW5ncz4sXG4gICk6IFVwZGF0ZVJlc3VsdCB7XG4gICAgLy8gRmlyc3QsIGdldCBhbGwgcm93cyBtYXRjaGluZyBTUUwgY29uZGl0aW9ucyAod2l0aG91dCByZWdleClcbiAgICBjb25zdCBbc2VsZWN0UXVlcnksIHNlbGVjdFBhcmFtc10gPSB0aGlzLmJ1aWxkV2hlcmVDbGF1c2UoKTtcbiAgICBjb25zdCBjYW5kaWRhdGVSb3dzID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShcbiAgICAgICAgYFNFTEVDVCByb3dpZCwgKiBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9JHtzZWxlY3RRdWVyeX1gLFxuICAgICAgKVxuICAgICAgLmFsbCguLi5zZWxlY3RQYXJhbXMpIGFzIChUICYgeyByb3dpZDogbnVtYmVyIH0pW107XG5cbiAgICAvLyBBcHBseSByZWdleCBmaWx0ZXJpbmdcbiAgICBjb25zdCBtYXRjaGluZ1Jvd3MgPSB0aGlzLmFwcGx5UmVnZXhGaWx0ZXJpbmcoY2FuZGlkYXRlUm93cyk7XG5cbiAgICBpZiAobWF0Y2hpbmdSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHsgY2hhbmdlczogMCB9O1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBlYWNoIG1hdGNoaW5nIHJvdyBieSByb3dpZFxuICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyh0cmFuc2Zvcm1lZERhdGEpO1xuICAgIGNvbnN0IHNldENsYXVzZSA9IHVwZGF0ZUNvbHVtbnNcbiAgICAgIC5tYXAoKGNvbCkgPT4gYCR7dGhpcy5xdW90ZUlkZW50aWZpZXIoY29sKX0gPSA/YClcbiAgICAgIC5qb2luKFwiLCBcIik7XG5cbiAgICBjb25zdCB1cGRhdGVRdWVyeSA9IGBVUERBVEUgJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0gU0VUICR7c2V0Q2xhdXNlfSBXSEVSRSByb3dpZCA9ID9gO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZSh1cGRhdGVRdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSB1cGRhdGVDb2x1bW5zLm1hcCgoY29sKSA9PiB0cmFuc2Zvcm1lZERhdGFbY29sXSk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBtYXRjaGluZ1Jvd3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0bXQucnVuKC4uLnVwZGF0ZVZhbHVlcywgcm93LnJvd2lkIGFzIFNRTFF1ZXJ5QmluZGluZ3MpO1xuICAgICAgdG90YWxDaGFuZ2VzICs9IHJlc3VsdC5jaGFuZ2VzO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNoYW5nZXM6IHRvdGFsQ2hhbmdlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBvciBpbnNlcnQgKHVwc2VydCkgZnVuY3Rpb25hbGl0eSB1c2luZyBJTlNFUlQgT1IgUkVQTEFDRS5cbiAgICogVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gdXBkYXRlIGV4aXN0aW5nIHJvd3MsIGFuZCBpbnNlcnRzIG5ldyBvbmVzIGlmIHRoZXkgZG9uJ3QgZXhpc3QuXG4gICAqIFJlcXVpcmVzIGEgdW5pcXVlIGNvbnN0cmFpbnQgb3IgcHJpbWFyeSBrZXkgdG8gd29yayBwcm9wZXJseS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3Qgd2l0aCBjb2x1bW5zIHRvIHVwc2VydFxuICAgKiBAcmV0dXJucyBVcGRhdGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgdXBzZXJ0KGRhdGE6IFBhcnRpYWw8VD4pOiBVcGRhdGVSZXN1bHQge1xuICAgIC8vIFRyYW5zZm9ybSBkYXRhIHRvIGhhbmRsZSBKU09OIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0aGlzLnRyYW5zZm9ybVJvd1RvRGIoZGF0YSk7XG4gICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVkRGF0YSk7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cHNlcnQ6IG5vIGNvbHVtbnMgdG8gdXBzZXJ0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1b3RlZENvbHVtbnMgPSBjb2x1bW5zXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMucXVvdGVJZGVudGlmaWVyKGNvbCkpXG4gICAgICAuam9pbihcIiwgXCIpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGNvbHVtbnMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG5cbiAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9ICgke3F1b3RlZENvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSlgO1xuXG4gICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoKGNvbCkgPT4gdHJhbnNmb3JtZWREYXRhW2NvbF0gPz8gbnVsbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4udmFsdWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBhIG51bWVyaWMgY29sdW1uIGJ5IGEgc3BlY2lmaWVkIGFtb3VudC5cbiAgICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGZldGNoaW5nLCBjYWxjdWxhdGluZywgYW5kIHVwZGF0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gaW5jcmVtZW50XG4gICAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgdG8gaW5jcmVtZW50IGJ5IChkZWZhdWx0cyB0byAxKVxuICAgKiBAcmV0dXJucyBVcGRhdGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5jcmVtZW50KGNvbHVtbjoga2V5b2YgVCwgYW1vdW50ID0gMSk6IFVwZGF0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJJTkNSRU1FTlRcIik7XG5cbiAgICBjb25zdCBbd2hlcmVDbGF1c2UsIHdoZXJlUGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFVQREFURSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBTRVQgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihTdHJpbmcoY29sdW1uKSl9ID0gJHt0aGlzLnF1b3RlSWRlbnRpZmllcihTdHJpbmcoY29sdW1uKSl9ICsgPyR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKGFtb3VudCwgLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGEgbnVtZXJpYyBjb2x1bW4gYnkgYSBzcGVjaWZpZWQgYW1vdW50LlxuICAgKiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gZmV0Y2hpbmcsIGNhbGN1bGF0aW5nLCBhbmQgdXBkYXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4gLSBDb2x1bW4gbmFtZSB0byBkZWNyZW1lbnRcbiAgICogQHBhcmFtIGFtb3VudCAtIEFtb3VudCB0byBkZWNyZW1lbnQgYnkgKGRlZmF1bHRzIHRvIDEpXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBkZWNyZW1lbnQoY29sdW1uOiBrZXlvZiBULCBhbW91bnQgPSAxKTogVXBkYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY29sdW1uLCAtYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW5kIGdldCB0aGUgdXBkYXRlZCByb3dzIGJhY2suXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VlIHRoZSByb3dzIGFmdGVyIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IHdpdGggY29sdW1ucyB0byB1cGRhdGUgYW5kIHRoZWlyIG5ldyB2YWx1ZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdXBkYXRlZCByb3dzXG4gICAqL1xuICB1cGRhdGVBbmRHZXQoZGF0YTogUGFydGlhbDxUPik6IFRbXSB7XG4gICAgLy8gRmlyc3QsIGdldCB0aGUgcm93cyB0aGF0IHdpbGwgYmUgdXBkYXRlZFxuICAgIGNvbnN0IHJvd3NUb1VwZGF0ZSA9IHRoaXMuYWxsKCk7XG5cbiAgICAvLyBQZXJmb3JtIHRoZSB1cGRhdGVcbiAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSB0aGlzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmICh1cGRhdGVSZXN1bHQuY2hhbmdlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZXR1cm4gdGhlIG9yaWdpbmFsbHkgbWF0Y2hlZCByb3dzXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3UgbWlnaHQgd2FudCB0byByZS1mZXRjaCB0aGUgdXBkYXRlZCByb3dzXG4gICAgcmV0dXJuIHJvd3NUb1VwZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCB1cGRhdGUgbXVsdGlwbGUgcm93cyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBpbmRpdmlkdWFsIHVwZGF0ZXMgd2hlbiB1cGRhdGluZyBtYW55IHJvd3MuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gQXJyYXkgb2Ygb2JqZWN0cywgZWFjaCBjb250YWluaW5nIHVwZGF0ZSBkYXRhIGFuZCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCB0b3RhbCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB1cGRhdGVCYXRjaChcbiAgICB1cGRhdGVzOiBBcnJheTx7IHdoZXJlOiBQYXJ0aWFsPFQ+OyBkYXRhOiBQYXJ0aWFsPFQ+IH0+LFxuICApOiBVcGRhdGVSZXN1bHQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1cGRhdGVzKSB8fCB1cGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXBkYXRlQmF0Y2g6IHVwZGF0ZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0RGIoKTtcblxuICAgIC8vIFVzZSBhIHRyYW5zYWN0aW9uIGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihcbiAgICAgICh1cGRhdGVzVG9Qcm9jZXNzOiBBcnJheTx7IHdoZXJlOiBQYXJ0aWFsPFQ+OyBkYXRhOiBQYXJ0aWFsPFQ+IH0+KSA9PiB7XG4gICAgICAgIGxldCB0b3RhbENoYW5nZXMgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgeyB3aGVyZTogd2hlcmVEYXRhLCBkYXRhIH0gb2YgdXBkYXRlc1RvUHJvY2Vzcykge1xuICAgICAgICAgIC8vIFRyYW5zZm9ybSBkYXRhIHRvIGhhbmRsZSBKU09OIHNlcmlhbGl6YXRpb25cbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFVwZGF0ZURhdGEgPSB0aGlzLnRyYW5zZm9ybVJvd1RvRGIoZGF0YSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlQ29sdW1ucyA9IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVkVXBkYXRlRGF0YSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSB1cGRhdGVzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQnVpbGQgV0hFUkUgY29uZGl0aW9ucyBmb3IgdGhpcyB1cGRhdGVcbiAgICAgICAgICBjb25zdCB3aGVyZUNvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3Qgd2hlcmVQYXJhbXM6IFNRTFF1ZXJ5QmluZGluZ3NbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMod2hlcmVEYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgd2hlcmVDb25kaXRpb25zLnB1c2goYCR7dGhpcy5xdW90ZUlkZW50aWZpZXIoY29sdW1uKX0gSVMgTlVMTGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd2hlcmVDb25kaXRpb25zLnB1c2goYCR7dGhpcy5xdW90ZUlkZW50aWZpZXIoY29sdW1uKX0gPSA/YCk7XG4gICAgICAgICAgICAgIHdoZXJlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3aGVyZUNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIFwidXBkYXRlQmF0Y2g6IGVhY2ggdXBkYXRlIG11c3QgaGF2ZSBXSEVSRSBjb25kaXRpb25zXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEJ1aWxkIFVQREFURSBzdGF0ZW1lbnRcbiAgICAgICAgICBjb25zdCBzZXRDbGF1c2UgPSB1cGRhdGVDb2x1bW5zXG4gICAgICAgICAgICAubWFwKChjb2wpID0+IGAke3RoaXMucXVvdGVJZGVudGlmaWVyKGNvbCl9ID0gP2ApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuXG4gICAgICAgICAgY29uc3Qgd2hlcmVDbGF1c2UgPSBgIFdIRVJFICR7d2hlcmVDb25kaXRpb25zLmpvaW4oXCIgQU5EIFwiKX1gO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gYFVQREFURSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBTRVQgJHtzZXRDbGF1c2V9JHt3aGVyZUNsYXVzZX1gO1xuXG4gICAgICAgICAgY29uc3QgdXBkYXRlVmFsdWVzID0gdXBkYXRlQ29sdW1ucy5tYXAoXG4gICAgICAgICAgICAoY29sKSA9PiB0cmFuc2Zvcm1lZFVwZGF0ZURhdGFbY29sXSA/PyBudWxsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgYWxsUGFyYW1zID0gWy4uLnVwZGF0ZVZhbHVlcywgLi4ud2hlcmVQYXJhbXNdO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGIucHJlcGFyZShxdWVyeSkucnVuKC4uLmFsbFBhcmFtcyk7XG4gICAgICAgICAgdG90YWxDaGFuZ2VzICs9IHJlc3VsdC5jaGFuZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY2hhbmdlczogdG90YWxDaGFuZ2VzIH07XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb24odXBkYXRlcyk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBTUUxRdWVyeUJpbmRpbmdzIH0gZnJvbSBcImJ1bjpzcWxpdGVcIjtcbmltcG9ydCB0eXBlIHsgRGVsZXRlUmVzdWx0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9zZWxlY3RcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgREVMRVRFIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIFF1ZXJ5QnVpbGRlci5cbiAqIEhhbmRsZXMgc2FmZSBkZWxldGUgb3BlcmF0aW9ucyB3aXRoIG1hbmRhdG9yeSBXSEVSRSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgRGVsZXRlUXVlcnlCdWlsZGVyPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4+IGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFQ+IHtcbiAgLyoqXG4gICAqIERlbGV0ZSByb3dzIG1hdGNoaW5nIHRoZSBXSEVSRSBjb25kaXRpb25zLlxuICAgKiBSZXF1aXJlcyBhdCBsZWFzdCBvbmUgV0hFUkUgY29uZGl0aW9uIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBmdWxsIHRhYmxlIGRlbGV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZWxldGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgZGVsZXRlKCk6IERlbGV0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJERUxFVEVcIik7XG5cbiAgICAvLyBIYW5kbGUgcmVnZXggY29uZGl0aW9ucyBieSBmaXJzdCBmZXRjaGluZyBtYXRjaGluZyByb3dzXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVdpdGhSZWdleENvbmRpdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBERUxFVEUgc3RhdGVtZW50XG4gICAgY29uc3QgW3doZXJlQ2xhdXNlLCB3aGVyZVBhcmFtc10gPSB0aGlzLmJ1aWxkV2hlcmVDbGF1c2UoKTtcbiAgICBjb25zdCBxdWVyeSA9IGBERUxFVEUgRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKC4uLndoZXJlUGFyYW1zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBERUxFVEUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqIFRoaXMgcmVxdWlyZXMgY2xpZW50LXNpZGUgZmlsdGVyaW5nIGFuZCBpbmRpdmlkdWFsIHJvdyBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlV2l0aFJlZ2V4Q29uZGl0aW9ucygpOiBEZWxldGVSZXN1bHQge1xuICAgIC8vIEZpcnN0LCBnZXQgYWxsIHJvd3MgbWF0Y2hpbmcgU1FMIGNvbmRpdGlvbnMgKHdpdGhvdXQgcmVnZXgpXG4gICAgY29uc3QgW3NlbGVjdFF1ZXJ5LCBzZWxlY3RQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlUm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgIGBTRUxFQ1Qgcm93aWQsICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7c2VsZWN0UXVlcnl9YCxcbiAgICAgIClcbiAgICAgIC5hbGwoLi4uc2VsZWN0UGFyYW1zKSBhcyAoVCAmIHsgcm93aWQ6IG51bWJlciB9KVtdO1xuXG4gICAgLy8gQXBwbHkgcmVnZXggZmlsdGVyaW5nXG4gICAgY29uc3QgbWF0Y2hpbmdSb3dzID0gdGhpcy5hcHBseVJlZ2V4RmlsdGVyaW5nKGNhbmRpZGF0ZVJvd3MpO1xuXG4gICAgaWYgKG1hdGNoaW5nUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNoYW5nZXM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgZWFjaCBtYXRjaGluZyByb3cgYnkgcm93aWRcbiAgICBjb25zdCBkZWxldGVRdWVyeSA9IGBERUxFVEUgRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBXSEVSRSByb3dpZCA9ID9gO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZShkZWxldGVRdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBtYXRjaGluZ1Jvd3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0bXQucnVuKHJvdy5yb3dpZCBhcyBTUUxRdWVyeUJpbmRpbmdzKTtcbiAgICAgIHRvdGFsQ2hhbmdlcyArPSByZXN1bHQuY2hhbmdlcztcbiAgICB9XG5cbiAgICByZXR1cm4geyBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW5kIGdldCB0aGUgZGVsZXRlZCByb3dzIGJhY2suXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VlIHdoYXQgd2FzIGRlbGV0ZWQgZm9yIGxvZ2dpbmcgb3IgYXVkaXQgcHVycG9zZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRlbGV0ZWQgcm93c1xuICAgKi9cbiAgZGVsZXRlQW5kR2V0KCk6IFRbXSB7XG4gICAgLy8gRmlyc3QsIGdldCB0aGUgcm93cyB0aGF0IHdpbGwgYmUgZGVsZXRlZFxuICAgIGNvbnN0IHJvd3NUb0RlbGV0ZSA9IHRoaXMuYWxsKCk7XG5cbiAgICAvLyBQZXJmb3JtIHRoZSBkZWxldGVcbiAgICBjb25zdCBkZWxldGVSZXN1bHQgPSB0aGlzLmRlbGV0ZSgpO1xuXG4gICAgaWYgKGRlbGV0ZVJlc3VsdC5jaGFuZ2VzID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSByb3dzIHRoYXQgd2VyZSBkZWxldGVkXG4gICAgcmV0dXJuIHJvd3NUb0RlbGV0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2Z0IGRlbGV0ZSAtIG1hcmsgcm93cyBhcyBkZWxldGVkIGluc3RlYWQgb2YgcGh5c2ljYWxseSByZW1vdmluZyB0aGVtLlxuICAgKiBUaGlzIHJlcXVpcmVzIGEgJ2RlbGV0ZWRfYXQnIG9yIHNpbWlsYXIgY29sdW1uIGluIHlvdXIgdGFibGUgc2NoZW1hLlxuICAgKlxuICAgKiBAcGFyYW0gZGVsZXRlZENvbHVtbiAtIENvbHVtbiBuYW1lIHRvIG1hcmsgYXMgZGVsZXRlZCAoZGVmYXVsdHMgdG8gJ2RlbGV0ZWRfYXQnKVxuICAgKiBAcGFyYW0gZGVsZXRlZFZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciB0aGUgZGVsZXRlZCBtYXJrZXIgKGRlZmF1bHRzIHRvIGN1cnJlbnQgdGltZXN0YW1wKVxuICAgKiBAcmV0dXJucyBVcGRhdGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgc29mdERlbGV0ZShcbiAgICBkZWxldGVkQ29sdW1uOiBrZXlvZiBUID0gXCJkZWxldGVkX2F0XCIgYXMga2V5b2YgVCxcbiAgICBkZWxldGVkVmFsdWU6IFNRTFF1ZXJ5QmluZGluZ3MgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcbiAgKTogRGVsZXRlUmVzdWx0IHtcbiAgICB0aGlzLnJlcXVpcmVXaGVyZUNsYXVzZShcIlNPRlQgREVMRVRFXCIpO1xuXG4gICAgLy8gSGFuZGxlIHJlZ2V4IGNvbmRpdGlvbnNcbiAgICBpZiAodGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29mdERlbGV0ZVdpdGhSZWdleENvbmRpdGlvbnMoZGVsZXRlZENvbHVtbiwgZGVsZXRlZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBVUERBVEUgc3RhdGVtZW50IHRvIG1hcmsgYXMgZGVsZXRlZFxuICAgIGNvbnN0IFt3aGVyZUNsYXVzZSwgd2hlcmVQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgcXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3RoaXMucXVvdGVJZGVudGlmaWVyKFN0cmluZyhkZWxldGVkQ29sdW1uKSl9ID0gPyR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKGRlbGV0ZWRWYWx1ZSwgLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNvZnQgZGVsZXRlIG9wZXJhdGlvbnMgd2hlbiByZWdleCBjb25kaXRpb25zIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzb2Z0RGVsZXRlV2l0aFJlZ2V4Q29uZGl0aW9ucyhcbiAgICBkZWxldGVkQ29sdW1uOiBrZXlvZiBULFxuICAgIGRlbGV0ZWRWYWx1ZTogU1FMUXVlcnlCaW5kaW5ncyxcbiAgKTogRGVsZXRlUmVzdWx0IHtcbiAgICAvLyBGaXJzdCwgZ2V0IGFsbCByb3dzIG1hdGNoaW5nIFNRTCBjb25kaXRpb25zICh3aXRob3V0IHJlZ2V4KVxuICAgIGNvbnN0IFtzZWxlY3RRdWVyeSwgc2VsZWN0UGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJvd3MgPSB0aGlzLmdldERiKClcbiAgICAgIC5wcmVwYXJlKFxuICAgICAgICBgU0VMRUNUIHJvd2lkLCAqIEZST00gJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0ke3NlbGVjdFF1ZXJ5fWAsXG4gICAgICApXG4gICAgICAuYWxsKC4uLnNlbGVjdFBhcmFtcykgYXMgKFQgJiB7IHJvd2lkOiBudW1iZXIgfSlbXTtcblxuICAgIC8vIEFwcGx5IHJlZ2V4IGZpbHRlcmluZ1xuICAgIGNvbnN0IG1hdGNoaW5nUm93cyA9IHRoaXMuYXBwbHlSZWdleEZpbHRlcmluZyhjYW5kaWRhdGVSb3dzKTtcblxuICAgIGlmIChtYXRjaGluZ1Jvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBjaGFuZ2VzOiAwIH07XG4gICAgfVxuXG4gICAgLy8gU29mdCBkZWxldGUgZWFjaCBtYXRjaGluZyByb3cgYnkgcm93aWRcbiAgICBjb25zdCB1cGRhdGVRdWVyeSA9IGBVUERBVEUgJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0gU0VUICR7dGhpcy5xdW90ZUlkZW50aWZpZXIoU3RyaW5nKGRlbGV0ZWRDb2x1bW4pKX0gPSA/IFdIRVJFIHJvd2lkID0gP2A7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKHVwZGF0ZVF1ZXJ5KTtcblxuICAgIGxldCB0b3RhbENoYW5nZXMgPSAwO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIG1hdGNoaW5nUm93cykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RtdC5ydW4oZGVsZXRlZFZhbHVlLCByb3cucm93aWQgYXMgU1FMUXVlcnlCaW5kaW5ncyk7XG4gICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2hhbmdlczogdG90YWxDaGFuZ2VzIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBzb2Z0IGRlbGV0ZWQgcm93cyBieSBjbGVhcmluZyB0aGUgZGVsZXRlZCBtYXJrZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkZWxldGVkQ29sdW1uIC0gQ29sdW1uIG5hbWUgdGhhdCBtYXJrcyByb3dzIGFzIGRlbGV0ZWRcbiAgICogQHJldHVybnMgVXBkYXRlIHJlc3VsdCB3aXRoIGNoYW5nZXMgY291bnRcbiAgICovXG4gIHJlc3RvcmUoZGVsZXRlZENvbHVtbjoga2V5b2YgVCA9IFwiZGVsZXRlZF9hdFwiIGFzIGtleW9mIFQpOiBEZWxldGVSZXN1bHQge1xuICAgIHRoaXMucmVxdWlyZVdoZXJlQ2xhdXNlKFwiUkVTVE9SRVwiKTtcblxuICAgIC8vIEhhbmRsZSByZWdleCBjb25kaXRpb25zXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3RvcmVXaXRoUmVnZXhDb25kaXRpb25zKGRlbGV0ZWRDb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIFVQREFURSBzdGF0ZW1lbnQgdG8gY2xlYXIgdGhlIGRlbGV0ZWQgbWFya2VyXG4gICAgY29uc3QgW3doZXJlQ2xhdXNlLCB3aGVyZVBhcmFtc10gPSB0aGlzLmJ1aWxkV2hlcmVDbGF1c2UoKTtcbiAgICBjb25zdCBxdWVyeSA9IGBVUERBVEUgJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0gU0VUICR7dGhpcy5xdW90ZUlkZW50aWZpZXIoU3RyaW5nKGRlbGV0ZWRDb2x1bW4pKX0gPSBOVUxMJHt3aGVyZUNsYXVzZX1gO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHJlc3RvcmUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBwcml2YXRlIHJlc3RvcmVXaXRoUmVnZXhDb25kaXRpb25zKGRlbGV0ZWRDb2x1bW46IGtleW9mIFQpOiBEZWxldGVSZXN1bHQge1xuICAgIC8vIEZpcnN0LCBnZXQgYWxsIHJvd3MgbWF0Y2hpbmcgU1FMIGNvbmRpdGlvbnMgKHdpdGhvdXQgcmVnZXgpXG4gICAgY29uc3QgW3NlbGVjdFF1ZXJ5LCBzZWxlY3RQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlUm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgIGBTRUxFQ1Qgcm93aWQsICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7c2VsZWN0UXVlcnl9YCxcbiAgICAgIClcbiAgICAgIC5hbGwoLi4uc2VsZWN0UGFyYW1zKSBhcyAoVCAmIHsgcm93aWQ6IG51bWJlciB9KVtdO1xuXG4gICAgLy8gQXBwbHkgcmVnZXggZmlsdGVyaW5nXG4gICAgY29uc3QgbWF0Y2hpbmdSb3dzID0gdGhpcy5hcHBseVJlZ2V4RmlsdGVyaW5nKGNhbmRpZGF0ZVJvd3MpO1xuXG4gICAgaWYgKG1hdGNoaW5nUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNoYW5nZXM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGVhY2ggbWF0Y2hpbmcgcm93IGJ5IHJvd2lkXG4gICAgY29uc3QgdXBkYXRlUXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3RoaXMucXVvdGVJZGVudGlmaWVyKFN0cmluZyhkZWxldGVkQ29sdW1uKSl9ID0gTlVMTCBXSEVSRSByb3dpZCA9ID9gO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZSh1cGRhdGVRdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBtYXRjaGluZ1Jvd3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0bXQucnVuKHJvdy5yb3dpZCBhcyBTUUxRdWVyeUJpbmRpbmdzKTtcbiAgICAgIHRvdGFsQ2hhbmdlcyArPSByZXN1bHQuY2hhbmdlcztcbiAgICB9XG5cbiAgICByZXR1cm4geyBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBkZWxldGUgbXVsdGlwbGUgc2V0cyBvZiByb3dzIGJhc2VkIG9uIGRpZmZlcmVudCBjb25kaXRpb25zLlxuICAgKiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gaW5kaXZpZHVhbCBkZWxldGVzIHdoZW4gcmVtb3ZpbmcgbWFueSBkaWZmZXJlbnQgcm93IHNldHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIC0gQXJyYXkgb2YgV0hFUkUgY29uZGl0aW9uIG9iamVjdHNcbiAgICogQHJldHVybnMgRGVsZXRlIHJlc3VsdCB3aXRoIHRvdGFsIGNoYW5nZXMgY291bnRcbiAgICovXG4gIGRlbGV0ZUJhdGNoKGNvbmRpdGlvbnM6IEFycmF5PFBhcnRpYWw8VD4+KTogRGVsZXRlUmVzdWx0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZGl0aW9ucykgfHwgY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImRlbGV0ZUJhdGNoOiBjb25kaXRpb25zIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXlcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERiKCk7XG5cbiAgICAvLyBVc2UgYSB0cmFuc2FjdGlvbiBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oXG4gICAgICAoY29uZGl0aW9uc1RvUHJvY2VzczogQXJyYXk8UGFydGlhbDxUPj4pID0+IHtcbiAgICAgICAgbGV0IHRvdGFsQ2hhbmdlcyA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCB3aGVyZURhdGEgb2YgY29uZGl0aW9uc1RvUHJvY2Vzcykge1xuICAgICAgICAgIC8vIEJ1aWxkIFdIRVJFIGNvbmRpdGlvbnMgZm9yIHRoaXMgZGVsZXRlXG4gICAgICAgICAgY29uc3Qgd2hlcmVDb25kaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHdoZXJlUGFyYW1zOiBTUUxRdWVyeUJpbmRpbmdzW10gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHdoZXJlRGF0YSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHdoZXJlQ29uZGl0aW9ucy5wdXNoKGAke3RoaXMucXVvdGVJZGVudGlmaWVyKGNvbHVtbil9IElTIE5VTExgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdoZXJlQ29uZGl0aW9ucy5wdXNoKGAke3RoaXMucXVvdGVJZGVudGlmaWVyKGNvbHVtbil9ID0gP2ApO1xuICAgICAgICAgICAgICB3aGVyZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod2hlcmVDb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcImRlbGV0ZUJhdGNoOiBlYWNoIGRlbGV0ZSBtdXN0IGhhdmUgV0hFUkUgY29uZGl0aW9uc1wiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBCdWlsZCBERUxFVEUgc3RhdGVtZW50XG4gICAgICAgICAgY29uc3Qgd2hlcmVDbGF1c2UgPSBgIFdIRVJFICR7d2hlcmVDb25kaXRpb25zLmpvaW4oXCIgQU5EIFwiKX1gO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gYERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9JHt3aGVyZUNsYXVzZX1gO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGIucHJlcGFyZShxdWVyeSkucnVuKC4uLndoZXJlUGFyYW1zKTtcbiAgICAgICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB0cmFuc2FjdGlvbihjb25kaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSB0aGUgZW50aXJlIHRhYmxlIChkZWxldGUgYWxsIHJvd3MpLlxuICAgKiBUaGlzIGJ5cGFzc2VzIHRoZSBXSEVSRSBjb25kaXRpb24gcmVxdWlyZW1lbnQgc2luY2UgaXQncyBleHBsaWNpdGx5IGRlc3RydWN0aXZlLlxuICAgKiBVU0UgV0lUSCBFWFRSRU1FIENBVVRJT04hXG4gICAqXG4gICAqIEByZXR1cm5zIERlbGV0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB0cnVuY2F0ZSgpOiBEZWxldGVSZXN1bHQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9YDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKCkucHJlcGFyZShxdWVyeSkucnVuKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hhbmdlczogcmVzdWx0LmNoYW5nZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcm93cyBvbGRlciB0aGFuIGEgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb21tb24gY2xlYW51cCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZXN0YW1wQ29sdW1uIC0gQ29sdW1uIG5hbWUgY29udGFpbmluZyB0aGUgdGltZXN0YW1wXG4gICAqIEBwYXJhbSBvbGRlclRoYW4gLSBUaW1lc3RhbXAgdGhyZXNob2xkIChyb3dzIG9sZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGRlbGV0ZWQpXG4gICAqIEByZXR1cm5zIERlbGV0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBkZWxldGVPbGRlclRoYW4odGltZXN0YW1wQ29sdW1uOiBrZXlvZiBULCBvbGRlclRoYW46IG51bWJlcik6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMud2hlcmVPcCh0aW1lc3RhbXBDb2x1bW4sIFwiPFwiLCBvbGRlclRoYW4pLmRlbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBkdXBsaWNhdGUgcm93cyBiYXNlZCBvbiBzcGVjaWZpZWQgY29sdW1ucywga2VlcGluZyBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGF0YSBjbGVhbnVwIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1ucyB0byBjaGVjayBmb3IgZHVwbGljYXRlc1xuICAgKiBAcmV0dXJucyBEZWxldGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgZGVsZXRlRHVwbGljYXRlcyhjb2x1bW5zOiBBcnJheTxrZXlvZiBUPik6IERlbGV0ZVJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpIHx8IGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWxldGVEdXBsaWNhdGVzOiBjb2x1bW5zIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXlcIik7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBjb2x1bW5zLm1hcCgoY29sKSA9PiBTdHJpbmcoY29sKSk7XG4gICAgY29uc3QgcXVvdGVkQ29sdW1ucyA9IGNvbHVtbk5hbWVzXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMucXVvdGVJZGVudGlmaWVyKGNvbCkpXG4gICAgICAuam9pbihcIiwgXCIpO1xuXG4gICAgLy8gRmluZCBkdXBsaWNhdGUgcm93cywga2VlcGluZyB0aGUgb25lIHdpdGggdGhlIG1pbmltdW0gcm93aWRcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9XG4gICAgICBXSEVSRSByb3dpZCBOT1QgSU4gKFxuICAgICAgICBTRUxFQ1QgTUlOKHJvd2lkKVxuICAgICAgICBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9XG4gICAgICAgIEdST1VQIEJZICR7cXVvdGVkQ29sdW1uc31cbiAgICAgIClcbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpLnByZXBhcmUocXVlcnkpLnJ1bigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSwgU1FMUXVlcnlCaW5kaW5ncyB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbHVtbk5hbWVzLFxuICBXaGVyZUNvbmRpdGlvbixcbiAgUmVnZXhDb25kaXRpb24sXG4gIEluc2VydFJlc3VsdCxcbiAgVXBkYXRlUmVzdWx0LFxuICBEZWxldGVSZXN1bHQsXG4gIEluc2VydE9wdGlvbnMsXG4gIEpzb25Db2x1bW5Db25maWcsXG4gIFF1ZXJ5QnVpbGRlclN0YXRlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3NlbGVjdFwiO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vaW5zZXJ0XCI7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi91cGRhdGVcIjtcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL2RlbGV0ZVwiO1xuXG4vKipcbiAqIE1haW4gUXVlcnlCdWlsZGVyIGNsYXNzIHRoYXQgY29tYmluZXMgYWxsIGZ1bmN0aW9uYWxpdHkgdXNpbmcgY29tcG9zaXRpb24uXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIFNFTEVDVCwgSU5TRVJULCBVUERBVEUsIGFuZCBERUxFVEUgb3BlcmF0aW9ucy5cbiAqXG4gKiBFYWNoIG9wZXJhdGlvbiB0eXBlIGlzIGltcGxlbWVudGVkIGluIGEgc2VwYXJhdGUgbW9kdWxlIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5OlxuICogLSBTRUxFQ1Q6IGNvbHVtbiBzZWxlY3Rpb24sIG9yZGVyaW5nLCBsaW1pdGluZywgcmVzdWx0IGV4ZWN1dGlvblxuICogLSBJTlNFUlQ6IHNpbmdsZS9idWxrIGluc2VydHMgd2l0aCBjb25mbGljdCByZXNvbHV0aW9uXG4gKiAtIFVQREFURTogc2FmZSB1cGRhdGVzIHdpdGggbWFuZGF0b3J5IFdIRVJFIGNvbmRpdGlvbnNcbiAqIC0gREVMRVRFOiBzYWZlIGRlbGV0ZXMgd2l0aCBtYW5kYXRvcnkgV0hFUkUgY29uZGl0aW9uc1xuICogLSBXSEVSRTogc2hhcmVkIGNvbmRpdGlvbmFsIGxvZ2ljIGFjcm9zcyBhbGwgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgUXVlcnlCdWlsZGVyPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBwcml2YXRlIHNlbGVjdEJ1aWxkZXI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPjtcbiAgcHJpdmF0ZSBpbnNlcnRCdWlsZGVyOiBJbnNlcnRRdWVyeUJ1aWxkZXI8VD47XG4gIHByaXZhdGUgdXBkYXRlQnVpbGRlcjogVXBkYXRlUXVlcnlCdWlsZGVyPFQ+O1xuICBwcml2YXRlIGRlbGV0ZUJ1aWxkZXI6IERlbGV0ZVF1ZXJ5QnVpbGRlcjxUPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYjogRGF0YWJhc2UsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAganNvbkNvbmZpZz86IEpzb25Db2x1bW5Db25maWc8VD4sXG4gICkge1xuICAgIC8vIENyZWF0ZSBpbnN0YW5jZXMgb2YgZWFjaCBzcGVjaWFsaXplZCBidWlsZGVyXG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyID0gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPihkYiwgdGFibGVOYW1lLCBqc29uQ29uZmlnKTtcbiAgICB0aGlzLmluc2VydEJ1aWxkZXIgPSBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyPFQ+KGRiLCB0YWJsZU5hbWUsIGpzb25Db25maWcpO1xuICAgIHRoaXMudXBkYXRlQnVpbGRlciA9IG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXI8VD4oZGIsIHRhYmxlTmFtZSwganNvbkNvbmZpZyk7XG4gICAgdGhpcy5kZWxldGVCdWlsZGVyID0gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcjxUPihkYiwgdGFibGVOYW1lLCBqc29uQ29uZmlnKTtcblxuICAgIC8vIEVuc3VyZSBhbGwgYnVpbGRlcnMgc2hhcmUgdGhlIHNhbWUgc3RhdGUgZm9yIFdIRVJFIGNvbmRpdGlvbnNcbiAgICB0aGlzLnN5bmNCdWlsZGVyU3RhdGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25pemUgdGhlIHN0YXRlIGJldHdlZW4gYWxsIGJ1aWxkZXJzIHNvIFdIRVJFIGNvbmRpdGlvbnMgYXJlIHNoYXJlZC5cbiAgICovXG4gIHByaXZhdGUgc3luY0J1aWxkZXJTdGF0ZXMoKTogdm9pZCB7XG4gICAgY29uc3QgbWFzdGVyU3RhdGUgPSAoXG4gICAgICB0aGlzLnNlbGVjdEJ1aWxkZXIgYXMgdW5rbm93biBhcyB7IHN0YXRlOiBRdWVyeUJ1aWxkZXJTdGF0ZTxUPiB9XG4gICAgKS5zdGF0ZTtcbiAgICAodGhpcy5pbnNlcnRCdWlsZGVyIGFzIHVua25vd24gYXMgeyBzdGF0ZTogUXVlcnlCdWlsZGVyU3RhdGU8VD4gfSkuc3RhdGUgPVxuICAgICAgbWFzdGVyU3RhdGU7XG4gICAgKHRoaXMudXBkYXRlQnVpbGRlciBhcyB1bmtub3duIGFzIHsgc3RhdGU6IFF1ZXJ5QnVpbGRlclN0YXRlPFQ+IH0pLnN0YXRlID1cbiAgICAgIG1hc3RlclN0YXRlO1xuICAgICh0aGlzLmRlbGV0ZUJ1aWxkZXIgYXMgdW5rbm93biBhcyB7IHN0YXRlOiBRdWVyeUJ1aWxkZXJTdGF0ZTxUPiB9KS5zdGF0ZSA9XG4gICAgICBtYXN0ZXJTdGF0ZTtcbiAgfVxuXG4gIC8vID09PT09IFdIRVJFIE1FVEhPRFMgKGRlbGVnYXRlZCB0byBzZWxlY3RCdWlsZGVyKSA9PT09PVxuXG4gIC8qKlxuICAgKiBBZGQgc2ltcGxlIGVxdWFsaXR5IGNvbmRpdGlvbnMgdG8gdGhlIFdIRVJFIGNsYXVzZS5cbiAgICovXG4gIHdoZXJlKGNvbmRpdGlvbnM6IFdoZXJlQ29uZGl0aW9uPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlKGNvbmRpdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCByZWdleCBjb25kaXRpb25zIChhcHBsaWVkIGNsaWVudC1zaWRlKS5cbiAgICovXG4gIHdoZXJlUmd4KGNvbmRpdGlvbnM6IFJlZ2V4Q29uZGl0aW9uPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlUmd4KGNvbmRpdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJhdyBTUUwgV0hFUkUgZnJhZ21lbnQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy5cbiAgICovXG4gIHdoZXJlRXhwcihleHByOiBzdHJpbmcsIHBhcmFtczogU1FMUXVlcnlCaW5kaW5nc1tdID0gW10pOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIud2hlcmVFeHByKGV4cHIsIHBhcmFtcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgZm9yIHdoZXJlRXhwci5cbiAgICovXG4gIHdoZXJlUmF3KGV4cHI6IHN0cmluZywgcGFyYW1zOiBTUUxRdWVyeUJpbmRpbmdzW10gPSBbXSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZVJhdyhleHByLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBJTiBjbGF1c2Ugd2l0aCBwcm9wZXIgcGFyYW1ldGVyIGJpbmRpbmcuXG4gICAqL1xuICB3aGVyZUluKGNvbHVtbjoga2V5b2YgVCwgdmFsdWVzOiBTUUxRdWVyeUJpbmRpbmdzW10pOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgTk9UIElOIGNsYXVzZSB3aXRoIHByb3BlciBwYXJhbWV0ZXIgYmluZGluZy5cbiAgICovXG4gIHdoZXJlTm90SW4oY29sdW1uOiBrZXlvZiBULCB2YWx1ZXM6IFNRTFF1ZXJ5QmluZGluZ3NbXSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU5vdEluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wYXJpc29uIG9wZXJhdG9yIGNvbmRpdGlvbi5cbiAgICovXG4gIHdoZXJlT3AoY29sdW1uOiBrZXlvZiBULCBvcDogc3RyaW5nLCB2YWx1ZTogU1FMUXVlcnlCaW5kaW5ncyk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU9wKGNvbHVtbiwgb3AsIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBCRVRXRUVOIGNvbmRpdGlvbi5cbiAgICovXG4gIHdoZXJlQmV0d2VlbihcbiAgICBjb2x1bW46IGtleW9mIFQsXG4gICAgbWluOiBTUUxRdWVyeUJpbmRpbmdzLFxuICAgIG1heDogU1FMUXVlcnlCaW5kaW5ncyxcbiAgKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlQmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBOT1QgQkVUV0VFTiBjb25kaXRpb24uXG4gICAqL1xuICB3aGVyZU5vdEJldHdlZW4oXG4gICAgY29sdW1uOiBrZXlvZiBULFxuICAgIG1pbjogU1FMUXVlcnlCaW5kaW5ncyxcbiAgICBtYXg6IFNRTFF1ZXJ5QmluZGluZ3MsXG4gICk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU5vdEJldHdlZW4oY29sdW1uLCBtaW4sIG1heCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIElTIE5VTEwgY29uZGl0aW9uLlxuICAgKi9cbiAgd2hlcmVOdWxsKGNvbHVtbjoga2V5b2YgVCk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU51bGwoY29sdW1uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gSVMgTk9UIE5VTEwgY29uZGl0aW9uLlxuICAgKi9cbiAgd2hlcmVOb3ROdWxsKGNvbHVtbjoga2V5b2YgVCk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU5vdE51bGwoY29sdW1uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vID09PT09IFNFTEVDVCBNRVRIT0RTIChkZWxlZ2F0ZWQgdG8gc2VsZWN0QnVpbGRlcikgPT09PT1cblxuICAvKipcbiAgICogU3BlY2lmeSB3aGljaCBjb2x1bW5zIHRvIHNlbGVjdC5cbiAgICovXG4gIHNlbGVjdChjb2x1bW5zOiBDb2x1bW5OYW1lczxUPik6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci5zZWxlY3QoY29sdW1ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIE9SREVSIEJZIGNsYXVzZS5cbiAgICovXG4gIG9yZGVyQnkoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLm9yZGVyQnkoY29sdW1uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3JkZXIgZGlyZWN0aW9uIHRvIGRlc2NlbmRpbmcuXG4gICAqL1xuICBkZXNjKCk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci5kZXNjKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9yZGVyIGRpcmVjdGlvbiB0byBhc2NlbmRpbmcuXG4gICAqL1xuICBhc2MoKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLmFzYygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBMSU1JVCBjbGF1c2UuXG4gICAqL1xuICBsaW1pdChhbW91bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci5saW1pdChhbW91bnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBPRkZTRVQgY2xhdXNlLlxuICAgKi9cbiAgb2Zmc2V0KHN0YXJ0OiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIub2Zmc2V0KHN0YXJ0KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vID09PT09IFNFTEVDVCBFWEVDVVRJT04gTUVUSE9EUyAoZGVsZWdhdGVkIHRvIHNlbGVjdEJ1aWxkZXIpID09PT09XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYWxsIG1hdGNoaW5nIHJvd3MuXG4gICAqL1xuICBhbGwoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RCdWlsZGVyLmFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIHJvdywgb3IgbnVsbC5cbiAgICovXG4gIGdldCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci5nZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBtYXRjaGluZyByb3csIG9yIG51bGwuXG4gICAqL1xuICBmaXJzdCgpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci5maXJzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBDT1VOVCBxdWVyeSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgbWF0Y2hpbmcgcm93cy5cbiAgICovXG4gIGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci5jb3VudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSByb3dzIG1hdGNoIHRoZSBjdXJyZW50IGNvbmRpdGlvbnMuXG4gICAqL1xuICBleGlzdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci5leGlzdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZSBmcm9tIHRoZSBmaXJzdCByb3cuXG4gICAqL1xuICB2YWx1ZTxLIGV4dGVuZHMga2V5b2YgVD4oY29sdW1uOiBLKTogVFtLXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEJ1aWxkZXIudmFsdWUoY29sdW1uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIHZhbHVlcyBmcm9tIGEgc2luZ2xlIGNvbHVtbi5cbiAgICovXG4gIHBsdWNrPEsgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEspOiBUW0tdW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEJ1aWxkZXIucGx1Y2soY29sdW1uKTtcbiAgfVxuXG4gIC8vID09PT09IElOU0VSVCBNRVRIT0RTIChkZWxlZ2F0ZWQgdG8gaW5zZXJ0QnVpbGRlcikgPT09PT1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgc2luZ2xlIHJvdyBvciBtdWx0aXBsZSByb3dzIGludG8gdGhlIHRhYmxlLlxuICAgKi9cbiAgaW5zZXJ0KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10sXG4gICAgb3B0aW9ucz86IEluc2VydE9wdGlvbnMsXG4gICk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnVpbGRlci5pbnNlcnQoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IHdpdGggT1IgSUdOT1JFIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqL1xuICBpbnNlcnRPcklnbm9yZShkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCdWlsZGVyLmluc2VydE9ySWdub3JlKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIFJFUExBQ0UgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICovXG4gIGluc2VydE9yUmVwbGFjZShkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCdWlsZGVyLmluc2VydE9yUmVwbGFjZShkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBBQk9SVCBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKi9cbiAgaW5zZXJ0T3JBYm9ydChkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCdWlsZGVyLmluc2VydE9yQWJvcnQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IHdpdGggT1IgRkFJTCBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKi9cbiAgaW5zZXJ0T3JGYWlsKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0T3JGYWlsKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIFJPTExCQUNLIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqL1xuICBpbnNlcnRPclJvbGxiYWNrKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0T3JSb2xsYmFjayhkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYW5kIGdldCB0aGUgaW5zZXJ0ZWQgcm93IGJhY2suXG4gICAqL1xuICBpbnNlcnRBbmRHZXQoZGF0YTogUGFydGlhbDxUPiwgb3B0aW9ucz86IEluc2VydE9wdGlvbnMpOiBUIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnVpbGRlci5pbnNlcnRBbmRHZXQoZGF0YSwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggaW5zZXJ0IHdpdGggdHJhbnNhY3Rpb24gc3VwcG9ydC5cbiAgICovXG4gIGluc2VydEJhdGNoKHJvd3M6IFBhcnRpYWw8VD5bXSwgb3B0aW9ucz86IEluc2VydE9wdGlvbnMpOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0QmF0Y2gocm93cywgb3B0aW9ucyk7XG4gIH1cblxuICAvLyA9PT09PSBVUERBVEUgTUVUSE9EUyAoZGVsZWdhdGVkIHRvIHVwZGF0ZUJ1aWxkZXIpID09PT09XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSByb3dzIG1hdGNoaW5nIHRoZSBXSEVSRSBjb25kaXRpb25zLlxuICAgKi9cbiAgdXBkYXRlKGRhdGE6IFBhcnRpYWw8VD4pOiBVcGRhdGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJ1aWxkZXIudXBkYXRlKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBvciBpbnNlcnQgKHVwc2VydCkgdXNpbmcgSU5TRVJUIE9SIFJFUExBQ0UuXG4gICAqL1xuICB1cHNlcnQoZGF0YTogUGFydGlhbDxUPik6IFVwZGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQnVpbGRlci51cHNlcnQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50IGEgbnVtZXJpYyBjb2x1bW4gYnkgYSBzcGVjaWZpZWQgYW1vdW50LlxuICAgKi9cbiAgaW5jcmVtZW50KGNvbHVtbjoga2V5b2YgVCwgYW1vdW50ID0gMSk6IFVwZGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQnVpbGRlci5pbmNyZW1lbnQoY29sdW1uLCBhbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY3JlbWVudCBhIG51bWVyaWMgY29sdW1uIGJ5IGEgc3BlY2lmaWVkIGFtb3VudC5cbiAgICovXG4gIGRlY3JlbWVudChjb2x1bW46IGtleW9mIFQsIGFtb3VudCA9IDEpOiBVcGRhdGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJ1aWxkZXIuZGVjcmVtZW50KGNvbHVtbiwgYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW5kIGdldCB0aGUgdXBkYXRlZCByb3dzIGJhY2suXG4gICAqL1xuICB1cGRhdGVBbmRHZXQoZGF0YTogUGFydGlhbDxUPik6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQnVpbGRlci51cGRhdGVBbmRHZXQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggdXBkYXRlIG11bHRpcGxlIHJvd3Mgd2l0aCBkaWZmZXJlbnQgdmFsdWVzLlxuICAgKi9cbiAgdXBkYXRlQmF0Y2goXG4gICAgdXBkYXRlczogQXJyYXk8eyB3aGVyZTogUGFydGlhbDxUPjsgZGF0YTogUGFydGlhbDxUPiB9PixcbiAgKTogVXBkYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCdWlsZGVyLnVwZGF0ZUJhdGNoKHVwZGF0ZXMpO1xuICB9XG5cbiAgLy8gPT09PT0gREVMRVRFIE1FVEhPRFMgKGRlbGVnYXRlZCB0byBkZWxldGVCdWlsZGVyKSA9PT09PVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcm93cyBtYXRjaGluZyB0aGUgV0hFUkUgY29uZGl0aW9ucy5cbiAgICovXG4gIGRlbGV0ZSgpOiBEZWxldGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1aWxkZXIuZGVsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuZCBnZXQgdGhlIGRlbGV0ZWQgcm93cyBiYWNrLlxuICAgKi9cbiAgZGVsZXRlQW5kR2V0KCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5kZWxldGVBbmRHZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2Z0IGRlbGV0ZSAtIG1hcmsgcm93cyBhcyBkZWxldGVkIGluc3RlYWQgb2YgcGh5c2ljYWxseSByZW1vdmluZyB0aGVtLlxuICAgKi9cbiAgc29mdERlbGV0ZShcbiAgICBkZWxldGVkQ29sdW1uOiBrZXlvZiBUID0gXCJkZWxldGVkX2F0XCIgYXMga2V5b2YgVCxcbiAgICBkZWxldGVkVmFsdWU6IFNRTFF1ZXJ5QmluZGluZ3MgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcbiAgKTogRGVsZXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdWlsZGVyLnNvZnREZWxldGUoZGVsZXRlZENvbHVtbiwgZGVsZXRlZFZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHNvZnQgZGVsZXRlZCByb3dzLlxuICAgKi9cbiAgcmVzdG9yZShkZWxldGVkQ29sdW1uOiBrZXlvZiBUID0gXCJkZWxldGVkX2F0XCIgYXMga2V5b2YgVCk6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5yZXN0b3JlKGRlbGV0ZWRDb2x1bW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJhdGNoIGRlbGV0ZSBtdWx0aXBsZSBzZXRzIG9mIHJvd3MuXG4gICAqL1xuICBkZWxldGVCYXRjaChjb25kaXRpb25zOiBBcnJheTxQYXJ0aWFsPFQ+Pik6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5kZWxldGVCYXRjaChjb25kaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSB0aGUgZW50aXJlIHRhYmxlIChkZWxldGUgYWxsIHJvd3MpLlxuICAgKi9cbiAgdHJ1bmNhdGUoKTogRGVsZXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdWlsZGVyLnRydW5jYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHJvd3Mgb2xkZXIgdGhhbiBhIHNwZWNpZmllZCB0aW1lc3RhbXAuXG4gICAqL1xuICBkZWxldGVPbGRlclRoYW4odGltZXN0YW1wQ29sdW1uOiBrZXlvZiBULCBvbGRlclRoYW46IG51bWJlcik6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5kZWxldGVPbGRlclRoYW4odGltZXN0YW1wQ29sdW1uLCBvbGRlclRoYW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBkdXBsaWNhdGUgcm93cyBiYXNlZCBvbiBzcGVjaWZpZWQgY29sdW1ucy5cbiAgICovXG4gIGRlbGV0ZUR1cGxpY2F0ZXMoY29sdW1uczogQXJyYXk8a2V5b2YgVD4pOiBEZWxldGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1aWxkZXIuZGVsZXRlRHVwbGljYXRlcyhjb2x1bW5zKTtcbiAgfVxufVxuIiwKICAgICIvLyBFbmhhbmNlZCB0eXBlcy50cyB3aXRoIGNvbXByZWhlbnNpdmUgU1FMaXRlIHN1cHBvcnRcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2UsIFNRTFF1ZXJ5QmluZGluZ3MgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuXG4vKipcbiAqIEFsbCBTUUxpdGUgZGF0YSB0eXBlcyBpbmNsdWRpbmcgYWZmaW5pdHkgdHlwZXNcbiAqL1xuZXhwb3J0IGNvbnN0IFNRTGl0ZVR5cGVzID0ge1xuICAvLyBTdGFuZGFyZCBTUUxpdGUgdHlwZXNcbiAgSU5URUdFUjogXCJJTlRFR0VSXCIgYXMgY29uc3QsXG4gIFRFWFQ6IFwiVEVYVFwiIGFzIGNvbnN0LFxuICBSRUFMOiBcIlJFQUxcIiBhcyBjb25zdCxcbiAgQkxPQjogXCJCTE9CXCIgYXMgY29uc3QsXG4gIE5VTUVSSUM6IFwiTlVNRVJJQ1wiIGFzIGNvbnN0LFxuXG4gIC8vIENvbW1vbiB0eXBlIGFsaWFzZXMgYW5kIHZhcmlhdGlvbnNcbiAgSU5UOiBcIklOVFwiIGFzIGNvbnN0LFxuICBUSU5ZSU5UOiBcIlRJTllJTlRcIiBhcyBjb25zdCxcbiAgU01BTExJTlQ6IFwiU01BTExJTlRcIiBhcyBjb25zdCxcbiAgTUVESVVNSU5UOiBcIk1FRElVTUlOVFwiIGFzIGNvbnN0LFxuICBCSUdJTlQ6IFwiQklHSU5UXCIgYXMgY29uc3QsXG5cbiAgLy8gVGV4dCB2YXJpYXRpb25zXG4gIFZBUkNIQVI6IFwiVkFSQ0hBUlwiIGFzIGNvbnN0LFxuICBDSEFSOiBcIkNIQVJcIiBhcyBjb25zdCxcbiAgQ0hBUkFDVEVSOiBcIkNIQVJBQ1RFUlwiIGFzIGNvbnN0LFxuICBOQ0hBUjogXCJOQ0hBUlwiIGFzIGNvbnN0LFxuICBOVkFSQ0hBUjogXCJOVkFSQ0hBUlwiIGFzIGNvbnN0LFxuICBDTE9COiBcIkNMT0JcIiBhcyBjb25zdCxcblxuICAvLyBOdW1lcmljIHZhcmlhdGlvbnNcbiAgRE9VQkxFOiBcIkRPVUJMRVwiIGFzIGNvbnN0LFxuICBGTE9BVDogXCJGTE9BVFwiIGFzIGNvbnN0LFxuICBERUNJTUFMOiBcIkRFQ0lNQUxcIiBhcyBjb25zdCxcblxuICAvLyBEYXRlL1RpbWUgKHN0b3JlZCBhcyBURVhULCBJTlRFR0VSLCBvciBSRUFMKVxuICBEQVRFOiBcIkRBVEVcIiBhcyBjb25zdCxcbiAgREFURVRJTUU6IFwiREFURVRJTUVcIiBhcyBjb25zdCxcbiAgVElNRVNUQU1QOiBcIlRJTUVTVEFNUFwiIGFzIGNvbnN0LFxuICBUSU1FOiBcIlRJTUVcIiBhcyBjb25zdCxcblxuICAvLyBCb29sZWFuIChzdG9yZWQgYXMgSU5URUdFUilcbiAgQk9PTEVBTjogXCJCT09MRUFOXCIgYXMgY29uc3QsXG5cbiAgLy8gSlNPTiAoc3RvcmVkIGFzIFRFWFQpXG4gIEpTT046IFwiSlNPTlwiIGFzIGNvbnN0LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgU1FMaXRlVHlwZSA9ICh0eXBlb2YgU1FMaXRlVHlwZXMpW2tleW9mIHR5cGVvZiBTUUxpdGVUeXBlc107XG5cbi8qKlxuICogU1FMaXRlIGJ1aWx0LWluIHNjYWxhciBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IFNRTGl0ZUZ1bmN0aW9ucyA9IHtcbiAgLy8gRGF0ZS9UaW1lIGZ1bmN0aW9uc1xuICBEQVRFOiAoZXhwcjogc3RyaW5nKSA9PiBgREFURSgke2V4cHJ9KWAsXG4gIFRJTUU6IChleHByOiBzdHJpbmcpID0+IGBUSU1FKCR7ZXhwcn0pYCxcbiAgREFURVRJTUU6IChleHByOiBzdHJpbmcpID0+IGBEQVRFVElNRSgke2V4cHJ9KWAsXG4gIEpVTElBTkRBWTogKGV4cHI6IHN0cmluZykgPT4gYEpVTElBTkRBWSgke2V4cHJ9KWAsXG4gIFNUUkZUSU1FOiAoZm9ybWF0OiBzdHJpbmcsIGV4cHI6IHN0cmluZykgPT4gYFNUUkZUSU1FKCcke2Zvcm1hdH0nLCAke2V4cHJ9KWAsXG5cbiAgLy8gU3RyaW5nIGZ1bmN0aW9uc1xuICBMRU5HVEg6IChleHByOiBzdHJpbmcpID0+IGBMRU5HVEgoJHtleHByfSlgLFxuICBMT1dFUjogKGV4cHI6IHN0cmluZykgPT4gYExPV0VSKCR7ZXhwcn0pYCxcbiAgVVBQRVI6IChleHByOiBzdHJpbmcpID0+IGBVUFBFUigke2V4cHJ9KWAsXG4gIFRSSU06IChleHByOiBzdHJpbmcsIGNoYXJzPzogc3RyaW5nKSA9PlxuICAgIGNoYXJzID8gYFRSSU0oJHtleHByfSwgJyR7Y2hhcnN9JylgIDogYFRSSU0oJHtleHByfSlgLFxuICBMVFJJTTogKGV4cHI6IHN0cmluZywgY2hhcnM/OiBzdHJpbmcpID0+XG4gICAgY2hhcnMgPyBgTFRSSU0oJHtleHByfSwgJyR7Y2hhcnN9JylgIDogYExUUklNKCR7ZXhwcn0pYCxcbiAgUlRSSU06IChleHByOiBzdHJpbmcsIGNoYXJzPzogc3RyaW5nKSA9PlxuICAgIGNoYXJzID8gYFJUUklNKCR7ZXhwcn0sICcke2NoYXJzfScpYCA6IGBSVFJJTSgke2V4cHJ9KWAsXG4gIFNVQlNUUjogKGV4cHI6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyKSA9PlxuICAgIGxlbmd0aFxuICAgICAgPyBgU1VCU1RSKCR7ZXhwcn0sICR7c3RhcnR9LCAke2xlbmd0aH0pYFxuICAgICAgOiBgU1VCU1RSKCR7ZXhwcn0sICR7c3RhcnR9KWAsXG4gIFNVQlNUUklORzogKGV4cHI6IHN0cmluZywgc3RhcnQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyKSA9PlxuICAgIGxlbmd0aFxuICAgICAgPyBgU1VCU1RSSU5HKCR7ZXhwcn0sICR7c3RhcnR9LCAke2xlbmd0aH0pYFxuICAgICAgOiBgU1VCU1RSSU5HKCR7ZXhwcn0sICR7c3RhcnR9KWAsXG4gIFJFUExBQ0U6IChleHByOiBzdHJpbmcsIG9sZDogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKSA9PlxuICAgIGBSRVBMQUNFKCR7ZXhwcn0sICcke29sZH0nLCAnJHtyZXBsYWNlbWVudH0nKWAsXG4gIFBSSU5URjogKGZvcm1hdDogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSkgPT5cbiAgICBgUFJJTlRGKCcke2Zvcm1hdH0nLCAke2FyZ3Muam9pbihcIiwgXCIpfSlgLFxuXG4gIC8vIE1hdGggZnVuY3Rpb25zXG4gIEFCUzogKGV4cHI6IHN0cmluZykgPT4gYEFCUygke2V4cHJ9KWAsXG4gIFJPVU5EOiAoZXhwcjogc3RyaW5nLCBkaWdpdHM/OiBudW1iZXIpID0+XG4gICAgZGlnaXRzICE9PSB1bmRlZmluZWQgPyBgUk9VTkQoJHtleHByfSwgJHtkaWdpdHN9KWAgOiBgUk9VTkQoJHtleHByfSlgLFxuICBSQU5ET006ICgpID0+IFwiUkFORE9NKClcIixcbiAgTUlOOiAoLi4uZXhwcnM6IHN0cmluZ1tdKSA9PiBgTUlOKCR7ZXhwcnMuam9pbihcIiwgXCIpfSlgLFxuICBNQVg6ICguLi5leHByczogc3RyaW5nW10pID0+IGBNQVgoJHtleHBycy5qb2luKFwiLCBcIil9KWAsXG5cbiAgLy8gVHlwZSBjb252ZXJzaW9uXG4gIENBU1Q6IChleHByOiBzdHJpbmcsIHR5cGU6IHN0cmluZykgPT4gYENBU1QoJHtleHByfSBBUyAke3R5cGV9KWAsXG4gIFRZUEVPRjogKGV4cHI6IHN0cmluZykgPT4gYFRZUEVPRigke2V4cHJ9KWAsXG5cbiAgLy8gQ29uZGl0aW9uYWxcbiAgQ09BTEVTQ0U6ICguLi5leHByczogc3RyaW5nW10pID0+IGBDT0FMRVNDRSgke2V4cHJzLmpvaW4oXCIsIFwiKX0pYCxcbiAgSUZOVUxMOiAoZXhwcjogc3RyaW5nLCByZXBsYWNlbWVudDogc3RyaW5nKSA9PlxuICAgIGBJRk5VTEwoJHtleHByfSwgJHtyZXBsYWNlbWVudH0pYCxcbiAgTlVMTElGOiAoZXhwcjE6IHN0cmluZywgZXhwcjI6IHN0cmluZykgPT4gYE5VTExJRigke2V4cHIxfSwgJHtleHByMn0pYCxcbiAgSUlGOiAoY29uZGl0aW9uOiBzdHJpbmcsIHRydWVWYWx1ZTogc3RyaW5nLCBmYWxzZVZhbHVlOiBzdHJpbmcpID0+XG4gICAgYElJRigke2NvbmRpdGlvbn0sICR7dHJ1ZVZhbHVlfSwgJHtmYWxzZVZhbHVlfSlgLFxuXG4gIC8vIEFnZ3JlZ2F0ZSBmdW5jdGlvbnMgKGZvciB1c2UgaW4gZXhwcmVzc2lvbnMpXG4gIENPVU5UOiAoZXhwcj86IHN0cmluZykgPT4gKGV4cHIgPyBgQ09VTlQoJHtleHByfSlgIDogXCJDT1VOVCgqKVwiKSxcbiAgU1VNOiAoZXhwcjogc3RyaW5nKSA9PiBgU1VNKCR7ZXhwcn0pYCxcbiAgQVZHOiAoZXhwcjogc3RyaW5nKSA9PiBgQVZHKCR7ZXhwcn0pYCxcbiAgVE9UQUw6IChleHByOiBzdHJpbmcpID0+IGBUT1RBTCgke2V4cHJ9KWAsXG4gIEdST1VQX0NPTkNBVDogKGV4cHI6IHN0cmluZywgc2VwYXJhdG9yPzogc3RyaW5nKSA9PlxuICAgIHNlcGFyYXRvclxuICAgICAgPyBgR1JPVVBfQ09OQ0FUKCR7ZXhwcn0sICcke3NlcGFyYXRvcn0nKWBcbiAgICAgIDogYEdST1VQX0NPTkNBVCgke2V4cHJ9KWAsXG5cbiAgLy8gSlNPTiBmdW5jdGlvbnMgKFNRTGl0ZSAzLjQ1KylcbiAgSlNPTjogKGV4cHI6IHN0cmluZykgPT4gYEpTT04oJHtleHByfSlgLFxuICBKU09OX0VYVFJBQ1Q6IChqc29uOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT5cbiAgICBgSlNPTl9FWFRSQUNUKCR7anNvbn0sICcke3BhdGh9JylgLFxuICBKU09OX1RZUEU6IChqc29uOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpID0+XG4gICAgcGF0aCA/IGBKU09OX1RZUEUoJHtqc29ufSwgJyR7cGF0aH0nKWAgOiBgSlNPTl9UWVBFKCR7anNvbn0pYCxcbiAgSlNPTl9WQUxJRDogKGV4cHI6IHN0cmluZykgPT4gYEpTT05fVkFMSUQoJHtleHByfSlgLFxuICBKU09OX0FSUkFZOiAoLi4udmFsdWVzOiBzdHJpbmdbXSkgPT4gYEpTT05fQVJSQVkoJHt2YWx1ZXMuam9pbihcIiwgXCIpfSlgLFxuICBKU09OX09CSkVDVDogKC4uLnBhaXJzOiBzdHJpbmdbXSkgPT4gYEpTT05fT0JKRUNUKCR7cGFpcnMuam9pbihcIiwgXCIpfSlgLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBTUUxpdGUga2V5d29yZHMgYW5kIHNwZWNpYWwgdmFsdWVzXG4gKi9cbmV4cG9ydCBjb25zdCBTUUxpdGVLZXl3b3JkcyA9IHtcbiAgLy8gU3BlY2lhbCB2YWx1ZXNcbiAgTlVMTDogXCJOVUxMXCIgYXMgY29uc3QsXG4gIENVUlJFTlRfVElNRTogXCJDVVJSRU5UX1RJTUVcIiBhcyBjb25zdCxcbiAgQ1VSUkVOVF9EQVRFOiBcIkNVUlJFTlRfREFURVwiIGFzIGNvbnN0LFxuICBDVVJSRU5UX1RJTUVTVEFNUDogXCJDVVJSRU5UX1RJTUVTVEFNUFwiIGFzIGNvbnN0LFxuXG4gIC8vIEJvb2xlYW4gdmFsdWVzIChhcyBpbnRlZ2VycylcbiAgVFJVRTogXCIxXCIgYXMgY29uc3QsXG4gIEZBTFNFOiBcIjBcIiBhcyBjb25zdCxcblxuICAvLyBDb25mbGljdCByZXNvbHV0aW9uXG4gIFJPTExCQUNLOiBcIlJPTExCQUNLXCIgYXMgY29uc3QsXG4gIEFCT1JUOiBcIkFCT1JUXCIgYXMgY29uc3QsXG4gIEZBSUw6IFwiRkFJTFwiIGFzIGNvbnN0LFxuICBJR05PUkU6IFwiSUdOT1JFXCIgYXMgY29uc3QsXG4gIFJFUExBQ0U6IFwiUkVQTEFDRVwiIGFzIGNvbnN0LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JlaWduIGtleSBhY3Rpb25zXG4gKi9cbmV4cG9ydCB0eXBlIEZvcmVpZ25LZXlBY3Rpb24gPVxuICB8IFwiQ0FTQ0FERVwiXG4gIHwgXCJTRVQgTlVMTFwiXG4gIHwgXCJSRVNUUklDVFwiXG4gIHwgXCJOTyBBQ1RJT05cIlxuICB8IFwiU0VUIERFRkFVTFRcIjtcblxuLyoqXG4gKiBDb2x1bW4gY29uc3RyYWludCBvcHRpb25zIHdpdGggY29tcHJlaGVuc2l2ZSBzdXBwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uQ29uc3RyYWludHMge1xuICAvKiogQ29sdW1uIGlzIFBSSU1BUlkgS0VZICovXG4gIHByaW1hcnlLZXk/OiBib29sZWFuO1xuICAvKiogQ29sdW1uIGhhcyBBVVRPSU5DUkVNRU5UIChvbmx5IHZhbGlkIHdpdGggSU5URUdFUiBQUklNQVJZIEtFWSkgKi9cbiAgYXV0b2luY3JlbWVudD86IGJvb2xlYW47XG4gIC8qKiBDb2x1bW4gaXMgTk9UIE5VTEwgKi9cbiAgbm90TnVsbD86IGJvb2xlYW47XG4gIC8qKiBDb2x1bW4gaGFzIFVOSVFVRSBjb25zdHJhaW50ICovXG4gIHVuaXF1ZT86IGJvb2xlYW47XG4gIC8qKiBEZWZhdWx0IHZhbHVlIC0gY2FuIGJlIGxpdGVyYWwgdmFsdWUsIGZ1bmN0aW9uIGNhbGwsIG9yIGtleXdvcmQgKi9cbiAgZGVmYXVsdD86IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgRGVmYXVsdEV4cHJlc3Npb247XG4gIC8qKiBDdXN0b20gY2hlY2sgY29uc3RyYWludCAqL1xuICBjaGVjaz86IHN0cmluZztcbiAgLyoqIENvbGxhdGlvbiBzZXF1ZW5jZSAqL1xuICBjb2xsYXRlPzogXCJCSU5BUllcIiB8IFwiTk9DQVNFXCIgfCBcIlJUUklNXCIgfCBzdHJpbmc7XG4gIC8qKiBSZWZlcmVuY2VzIGFub3RoZXIgdGFibGUgKGZvcmVpZ24ga2V5KSAqL1xuICByZWZlcmVuY2VzPzoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgY29sdW1uOiBzdHJpbmc7XG4gICAgb25EZWxldGU/OiBGb3JlaWduS2V5QWN0aW9uO1xuICAgIG9uVXBkYXRlPzogRm9yZWlnbktleUFjdGlvbjtcbiAgfTtcbiAgLyoqIEdlbmVyYXRlZCBjb2x1bW4gZXhwcmVzc2lvbiAoR0VORVJBVEVEIEFMV0FZUyBBUykgKi9cbiAgZ2VuZXJhdGVkPzoge1xuICAgIGV4cHJlc3Npb246IHN0cmluZztcbiAgICBzdG9yZWQ/OiBib29sZWFuOyAvLyB0cnVlIGZvciBTVE9SRUQsIGZhbHNlL3VuZGVmaW5lZCBmb3IgVklSVFVBTFxuICB9O1xuICAvKiogQ29sdW1uIGNvbW1lbnQgKHN0b3JlZCBhcyBtZXRhZGF0YSwgbm90IGluIHNjaGVtYSkgKi9cbiAgY29tbWVudD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlLXNhZmUgZGVmYXVsdCB2YWx1ZSBleHByZXNzaW9uc1xuICovXG5leHBvcnQgdHlwZSBEZWZhdWx0RXhwcmVzc2lvbiA9IHtcbiAgX3R5cGU6IFwiZXhwcmVzc2lvblwiO1xuICBleHByZXNzaW9uOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEhlbHBlciB0byBjcmVhdGUgZGVmYXVsdCBleHByZXNzaW9uc1xuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdEV4cHIgPSAoZXhwcmVzc2lvbjogc3RyaW5nKTogRGVmYXVsdEV4cHJlc3Npb24gPT4gKHtcbiAgX3R5cGU6IFwiZXhwcmVzc2lvblwiLFxuICBleHByZXNzaW9uLFxufSk7XG5cbi8qKlxuICogVHlwZS1zYWZlIGNvbHVtbiBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmaW5pdGlvbiBleHRlbmRzIENvbHVtbkNvbnN0cmFpbnRzIHtcbiAgLyoqIFNRTGl0ZSBkYXRhIHR5cGUgKi9cbiAgdHlwZTogU1FMaXRlVHlwZTtcbiAgLyoqIE9wdGlvbmFsIHR5cGUgcGFyYW1ldGVycyAoZS5nLiwgVkFSQ0hBUigyNTUpKSAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG4gIC8qKiBQcmVjaXNpb24gZm9yIERFQ0lNQUwvTlVNRVJJQyB0eXBlcyAqL1xuICBwcmVjaXNpb24/OiBudW1iZXI7XG4gIC8qKiBTY2FsZSBmb3IgREVDSU1BTC9OVU1FUklDIHR5cGVzICovXG4gIHNjYWxlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFR5cGUtc2FmZSB0YWJsZSBzY2hlbWEgZGVmaW5pdGlvblxuICovXG5leHBvcnQgdHlwZSBUYWJsZVNjaGVtYSA9IFJlY29yZDxzdHJpbmcsIENvbHVtbkRlZmluaXRpb24+O1xuXG4vKipcbiAqIFRhYmxlIGNvbnN0cmFpbnQgdHlwZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbnN0cmFpbnRzIHtcbiAgLyoqIFBSSU1BUlkgS0VZIGNvbnN0cmFpbnQgb24gbXVsdGlwbGUgY29sdW1ucyAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nW107XG4gIC8qKiBVTklRVUUgY29uc3RyYWludHMgKi9cbiAgdW5pcXVlPzogc3RyaW5nW10gfCBzdHJpbmdbXVtdO1xuICAvKiogQ0hFQ0sgY29uc3RyYWludHMgKi9cbiAgY2hlY2s/OiBzdHJpbmdbXTtcbiAgLyoqIEZPUkVJR04gS0VZIGNvbnN0cmFpbnRzICovXG4gIGZvcmVpZ25LZXlzPzogQXJyYXk8e1xuICAgIGNvbHVtbnM6IHN0cmluZ1tdO1xuICAgIHJlZmVyZW5jZXM6IHtcbiAgICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgICAgIG9uRGVsZXRlPzogRm9yZWlnbktleUFjdGlvbjtcbiAgICAgIG9uVXBkYXRlPzogRm9yZWlnbktleUFjdGlvbjtcbiAgICB9O1xuICB9Pjtcbn1cblxuLyoqXG4gKiBFbmhhbmNlZCB0YWJsZSBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVPcHRpb25zIHtcbiAgLyoqIEFkZCBJRiBOT1QgRVhJU1RTIGNsYXVzZSAqL1xuICBpZk5vdEV4aXN0cz86IGJvb2xlYW47XG4gIC8qKiBDcmVhdGUgV0lUSE9VVCBST1dJRCB0YWJsZSAqL1xuICB3aXRob3V0Um93SWQ/OiBib29sZWFuO1xuICAvKiogVGFibGUgY29uc3RyYWludHMgKi9cbiAgY29uc3RyYWludHM/OiBUYWJsZUNvbnN0cmFpbnRzO1xuICAvKiogVGVtcG9yYXJ5IHRhYmxlICovXG4gIHRlbXBvcmFyeT86IGJvb2xlYW47XG4gIC8qKiBUYWJsZSBjb21tZW50ICovXG4gIGNvbW1lbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29tcHJlaGVuc2l2ZSBjb2x1bW4gaGVscGVyIGZ1bmN0aW9ucyB3aXRoIGZ1bGwgdHlwZSBzdXBwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBjb2x1bW4gPSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gSU5URUdFUiBjb2x1bW4gd2l0aCBvcHRpb25hbCBzaXplIHNwZWNpZmljYXRpb25cbiAgICovXG4gIGludGVnZXI6IChcbiAgICBjb25zdHJhaW50cz86IENvbHVtbkNvbnN0cmFpbnRzICYge1xuICAgICAgc2l6ZT86IFwiVElOWUlOVFwiIHwgXCJTTUFMTElOVFwiIHwgXCJNRURJVU1JTlRcIiB8IFwiQklHSU5UXCI7XG4gICAgfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IGNvbnN0cmFpbnRzPy5zaXplIHx8IFNRTGl0ZVR5cGVzLklOVEVHRVIsXG4gICAgLi4uY29uc3RyYWludHMsXG4gIH0pLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBURVhUIGNvbHVtbiB3aXRoIG9wdGlvbmFsIGxlbmd0aFxuICAgKi9cbiAgdGV4dDogKFxuICAgIGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMgJiB7XG4gICAgICBsZW5ndGg/OiBudW1iZXI7XG4gICAgICB2YXJpYW50PzogXCJWQVJDSEFSXCIgfCBcIkNIQVJcIiB8IFwiQ0xPQlwiIHwgXCJOQ0hBUlwiIHwgXCJOVkFSQ0hBUlwiO1xuICAgIH0sXG4gICk6IENvbHVtbkRlZmluaXRpb24gPT4gKHtcbiAgICB0eXBlOiBjb25zdHJhaW50cz8udmFyaWFudCB8fCBTUUxpdGVUeXBlcy5URVhULFxuICAgIGxlbmd0aDogY29uc3RyYWludHM/Lmxlbmd0aCxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIFJFQUwgY29sdW1uXG4gICAqL1xuICByZWFsOiAoXG4gICAgY29uc3RyYWludHM/OiBDb2x1bW5Db25zdHJhaW50cyAmIHsgdmFyaWFudD86IFwiRE9VQkxFXCIgfCBcIkZMT0FUXCIgfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IGNvbnN0cmFpbnRzPy52YXJpYW50IHx8IFNRTGl0ZVR5cGVzLlJFQUwsXG4gICAgLi4uY29uc3RyYWludHMsXG4gIH0pLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBCTE9CIGNvbHVtblxuICAgKi9cbiAgYmxvYjogKGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMpOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogU1FMaXRlVHlwZXMuQkxPQixcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE5VTUVSSUMvREVDSU1BTCBjb2x1bW4gd2l0aCBwcmVjaXNpb24gYW5kIHNjYWxlXG4gICAqL1xuICBudW1lcmljOiAoXG4gICAgY29uc3RyYWludHM/OiBDb2x1bW5Db25zdHJhaW50cyAmIHtcbiAgICAgIHByZWNpc2lvbj86IG51bWJlcjtcbiAgICAgIHNjYWxlPzogbnVtYmVyO1xuICAgICAgdmFyaWFudD86IFwiREVDSU1BTFwiO1xuICAgIH0sXG4gICk6IENvbHVtbkRlZmluaXRpb24gPT4gKHtcbiAgICB0eXBlOiBjb25zdHJhaW50cz8udmFyaWFudCB8fCBTUUxpdGVUeXBlcy5OVU1FUklDLFxuICAgIHByZWNpc2lvbjogY29uc3RyYWludHM/LnByZWNpc2lvbixcbiAgICBzY2FsZTogY29uc3RyYWludHM/LnNjYWxlLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgREFURSBjb2x1bW4gKHN0b3JlZCBhcyBURVhUKVxuICAgKi9cbiAgZGF0ZTogKGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMpOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogU1FMaXRlVHlwZXMuREFURSxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIERBVEVUSU1FIGNvbHVtbiAoc3RvcmVkIGFzIFRFWFQpXG4gICAqL1xuICBkYXRldGltZTogKGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMpOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogU1FMaXRlVHlwZXMuREFURVRJTUUsXG4gICAgLi4uY29uc3RyYWludHMsXG4gIH0pLFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBUSU1FU1RBTVAgY29sdW1uIChzdG9yZWQgYXMgSU5URUdFUiBieSBkZWZhdWx0KVxuICAgKi9cbiAgdGltZXN0YW1wOiAoXG4gICAgY29uc3RyYWludHM/OiBDb2x1bW5Db25zdHJhaW50cyAmIHsgYXNUZXh0PzogYm9vbGVhbiB9LFxuICApOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogY29uc3RyYWludHM/LmFzVGV4dCA/IFNRTGl0ZVR5cGVzLlRFWFQgOiBTUUxpdGVUeXBlcy5JTlRFR0VSLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVElNRSBjb2x1bW4gKHN0b3JlZCBhcyBURVhUKVxuICAgKi9cbiAgdGltZTogKGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMpOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogU1FMaXRlVHlwZXMuVElNRSxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEJPT0xFQU4gY29sdW1uIChzdG9yZWQgYXMgSU5URUdFUilcbiAgICovXG4gIGJvb2xlYW46IChjb25zdHJhaW50cz86IENvbHVtbkNvbnN0cmFpbnRzKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IFNRTGl0ZVR5cGVzLkJPT0xFQU4sXG4gICAgY2hlY2s6IGNvbnN0cmFpbnRzPy5jaGVjayB8fCBcInt7Q09MVU1OfX0gSU4gKDAsIDEpXCIsIC8vIFBsYWNlaG9sZGVyIGZvciBjb2x1bW4gbmFtZVxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgSlNPTiBjb2x1bW4gKHN0b3JlZCBhcyBURVhUKVxuICAgKi9cbiAganNvbjogKFxuICAgIGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMgJiB7IHZhbGlkYXRlSnNvbj86IGJvb2xlYW4gfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IFNRTGl0ZVR5cGVzLkpTT04sXG4gICAgY2hlY2s6IGNvbnN0cmFpbnRzPy52YWxpZGF0ZUpzb25cbiAgICAgID8gXCJKU09OX1ZBTElEKHt7Q09MVU1OfX0pXCJcbiAgICAgIDogY29uc3RyYWludHM/LmNoZWNrLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVkFSQ0hBUiBjb2x1bW4gd2l0aCBzcGVjaWZpZWQgbGVuZ3RoXG4gICAqL1xuICB2YXJjaGFyOiAoXG4gICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgY29uc3RyYWludHM/OiBDb2x1bW5Db25zdHJhaW50cyxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IFNRTGl0ZVR5cGVzLlZBUkNIQVIsXG4gICAgbGVuZ3RoLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ0hBUiBjb2x1bW4gd2l0aCBzcGVjaWZpZWQgbGVuZ3RoXG4gICAqL1xuICBjaGFyOiAoXG4gICAgbGVuZ3RoOiBudW1iZXIsXG4gICAgY29uc3RyYWludHM/OiBDb2x1bW5Db25zdHJhaW50cyxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IFNRTGl0ZVR5cGVzLkNIQVIsXG4gICAgbGVuZ3RoLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGF1dG8taW5jcmVtZW50aW5nIHByaW1hcnkga2V5IGNvbHVtblxuICAgKi9cbiAgaWQ6IChcbiAgICBjb25zdHJhaW50cz86IE9taXQ8XG4gICAgICBDb2x1bW5Db25zdHJhaW50cyxcbiAgICAgIFwicHJpbWFyeUtleVwiIHwgXCJhdXRvaW5jcmVtZW50XCIgfCBcIm5vdE51bGxcIlxuICAgID4sXG4gICk6IENvbHVtbkRlZmluaXRpb24gPT4gKHtcbiAgICB0eXBlOiBTUUxpdGVUeXBlcy5JTlRFR0VSLFxuICAgIHByaW1hcnlLZXk6IHRydWUsXG4gICAgYXV0b2luY3JlbWVudDogdHJ1ZSxcbiAgICBub3ROdWxsOiB0cnVlLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGEgVVVJRCBjb2x1bW4gKHN0b3JlZCBhcyBURVhUKVxuICAgKi9cbiAgdXVpZDogKFxuICAgIGNvbnN0cmFpbnRzPzogQ29sdW1uQ29uc3RyYWludHMgJiB7IGdlbmVyYXRlRGVmYXVsdD86IGJvb2xlYW4gfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IFNRTGl0ZVR5cGVzLlRFWFQsXG4gICAgbGVuZ3RoOiAzNixcbiAgICBkZWZhdWx0OiBjb25zdHJhaW50cz8uZ2VuZXJhdGVEZWZhdWx0XG4gICAgICA/IGRlZmF1bHRFeHByKFxuICAgICAgICAgIFwibG93ZXIoaGV4KHJhbmRvbWJsb2IoNCkpKSB8fCAnLScgfHwgbG93ZXIoaGV4KHJhbmRvbWJsb2IoMikpKSB8fCAnLTQnIHx8IHN1YnN0cihsb3dlcihoZXgocmFuZG9tYmxvYigyKSkpLDIpIHx8ICctJyB8fCBzdWJzdHIoJzg5YWInLGFicyhyYW5kb20oKSkgJSA0ICsgMSwgMSkgfHwgc3Vic3RyKGxvd2VyKGhleChyYW5kb21ibG9iKDIpKSksMikgfHwgJy0nIHx8IGxvd2VyKGhleChyYW5kb21ibG9iKDYpKSlcIixcbiAgICAgICAgKVxuICAgICAgOiBjb25zdHJhaW50cz8uZGVmYXVsdCxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNyZWF0ZWRfYXQgdGltZXN0YW1wIGNvbHVtblxuICAgKi9cbiAgY3JlYXRlZEF0OiAoXG4gICAgY29uc3RyYWludHM/OiBPbWl0PENvbHVtbkNvbnN0cmFpbnRzLCBcImRlZmF1bHRcIiB8IFwibm90TnVsbFwiPiAmIHtcbiAgICAgIGFzVGV4dD86IGJvb2xlYW47XG4gICAgfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IGNvbnN0cmFpbnRzPy5hc1RleHQgPyBTUUxpdGVUeXBlcy5EQVRFVElNRSA6IFNRTGl0ZVR5cGVzLklOVEVHRVIsXG4gICAgbm90TnVsbDogdHJ1ZSxcbiAgICBkZWZhdWx0OiBjb25zdHJhaW50cz8uYXNUZXh0XG4gICAgICA/IGRlZmF1bHRFeHByKFwiZGF0ZXRpbWUoJ25vdycpXCIpXG4gICAgICA6IGRlZmF1bHRFeHByKFwic3RyZnRpbWUoJyVzJywgJ25vdycpXCIpLFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIHVwZGF0ZWRfYXQgdGltZXN0YW1wIGNvbHVtblxuICAgKi9cbiAgdXBkYXRlZEF0OiAoXG4gICAgY29uc3RyYWludHM/OiBPbWl0PENvbHVtbkNvbnN0cmFpbnRzLCBcImRlZmF1bHRcIj4gJiB7IGFzVGV4dD86IGJvb2xlYW4gfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IGNvbnN0cmFpbnRzPy5hc1RleHQgPyBTUUxpdGVUeXBlcy5EQVRFVElNRSA6IFNRTGl0ZVR5cGVzLklOVEVHRVIsXG4gICAgZGVmYXVsdDogY29uc3RyYWludHM/LmFzVGV4dFxuICAgICAgPyBkZWZhdWx0RXhwcihcImRhdGV0aW1lKCdub3cnKVwiKVxuICAgICAgOiBkZWZhdWx0RXhwcihcInN0cmZ0aW1lKCclcycsICdub3cnKVwiKSxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZvcmVpZ24ga2V5IHJlZmVyZW5jZSBjb2x1bW5cbiAgICovXG4gIGZvcmVpZ25LZXk6IChcbiAgICByZWZUYWJsZTogc3RyaW5nLFxuICAgIHJlZkNvbHVtbiA9IFwiaWRcIixcbiAgICBjb25zdHJhaW50cz86IENvbHVtbkNvbnN0cmFpbnRzICYge1xuICAgICAgb25EZWxldGU/OiBGb3JlaWduS2V5QWN0aW9uO1xuICAgICAgb25VcGRhdGU/OiBGb3JlaWduS2V5QWN0aW9uO1xuICAgICAgdHlwZT86IFNRTGl0ZVR5cGU7XG4gICAgfSxcbiAgKTogQ29sdW1uRGVmaW5pdGlvbiA9PiAoe1xuICAgIHR5cGU6IGNvbnN0cmFpbnRzPy50eXBlIHx8IFNRTGl0ZVR5cGVzLklOVEVHRVIsXG4gICAgcmVmZXJlbmNlczoge1xuICAgICAgdGFibGU6IHJlZlRhYmxlLFxuICAgICAgY29sdW1uOiByZWZDb2x1bW4sXG4gICAgICBvbkRlbGV0ZTogY29uc3RyYWludHM/Lm9uRGVsZXRlLFxuICAgICAgb25VcGRhdGU6IGNvbnN0cmFpbnRzPy5vblVwZGF0ZSxcbiAgICB9LFxuICAgIC4uLmNvbnN0cmFpbnRzLFxuICB9KSxcblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGVudW0gY29sdW1uICh3aXRoIENIRUNLIGNvbnN0cmFpbnQpXG4gICAqL1xuICBlbnVtOiAoXG4gICAgdmFsdWVzOiBzdHJpbmdbXSxcbiAgICBjb25zdHJhaW50cz86IENvbHVtbkNvbnN0cmFpbnRzLFxuICApOiBDb2x1bW5EZWZpbml0aW9uID0+ICh7XG4gICAgdHlwZTogU1FMaXRlVHlwZXMuVEVYVCxcbiAgICBjaGVjazogYHt7Q09MVU1OfX0gSU4gKCR7dmFsdWVzLm1hcCgodikgPT4gYCcke3Z9J2ApLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAuLi5jb25zdHJhaW50cyxcbiAgfSksXG59O1xuXG4vKipcbiAqIFNRTCBmdW5jdGlvbiBoZWxwZXJzIGZvciB1c2UgaW4gZGVmYXVsdHMgYW5kIGV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBjb25zdCBzcWwgPSB7XG4gIC8vIEN1cnJlbnQgZGF0ZS90aW1lXG4gIG5vdzogKCkgPT4gZGVmYXVsdEV4cHIoXCJkYXRldGltZSgnbm93JylcIiksXG4gIGN1cnJlbnRUaW1lOiAoKSA9PiBkZWZhdWx0RXhwcihcInRpbWUoJ25vdycpXCIpLFxuICBjdXJyZW50RGF0ZTogKCkgPT4gZGVmYXVsdEV4cHIoXCJkYXRlKCdub3cnKVwiKSxcbiAgY3VycmVudFRpbWVzdGFtcDogKCkgPT4gZGVmYXVsdEV4cHIoXCJkYXRldGltZSgnbm93JylcIiksXG4gIHVuaXhUaW1lc3RhbXA6ICgpID0+IGRlZmF1bHRFeHByKFwic3RyZnRpbWUoJyVzJywgJ25vdycpXCIpLFxuXG4gIC8vIEZ1bmN0aW9uc1xuICAuLi5TUUxpdGVGdW5jdGlvbnMsXG5cbiAgLy8gUmF3IGV4cHJlc3Npb25cbiAgcmF3OiAoZXhwcmVzc2lvbjogc3RyaW5nKSA9PiBkZWZhdWx0RXhwcihleHByZXNzaW9uKSxcblxuICAvLyBMaXRlcmFsc1xuICBudWxsOiAoKSA9PiBudWxsLFxuICB0cnVlOiAoKSA9PiAxLFxuICBmYWxzZTogKCkgPT4gMCxcbn07XG5cbi8qKlxuICogRW5oYW5jZWQgY3JlYXRlVGFibGUgbWV0aG9kIHNpZ25hdHVyZVxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVUYWJsZUNvbHVtbnMgPSBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgVGFibGVTY2hlbWE7XG5cbi8qKlxuICogUXVlcnkgYnVpbGRlciBzdGF0ZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUJ1aWxkZXJTdGF0ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgZGI6IERhdGFiYXNlOyAvLyBEYXRhYmFzZSBpbnN0YW5jZSBmcm9tIGJ1bjpzcWxpdGVcbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIHdoZXJlQ29uZGl0aW9uczogc3RyaW5nW107XG4gIHdoZXJlUGFyYW1zOiBTUUxRdWVyeUJpbmRpbmdzW107XG4gIHJlZ2V4Q29uZGl0aW9uczogQXJyYXk8e1xuICAgIGNvbHVtbjoga2V5b2YgVDtcbiAgICByZWdleDogUmVnRXhwO1xuICB9PjtcbiAganNvbkNvbHVtbnM/OiBBcnJheTxrZXlvZiBUPjtcbn1cblxuLyoqXG4gKiBDb2x1bW4gbmFtZXMgdHlwZSBmb3IgU0VMRUNUIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29sdW1uTmFtZXM8VD4gPSBbXCIqXCJdIHwgQXJyYXk8a2V5b2YgVD47XG5cbi8qKlxuICogT3JkZXIgZGlyZWN0aW9uIGZvciBPUkRFUiBCWSBjbGF1c2VzXG4gKi9cbmV4cG9ydCB0eXBlIE9yZGVyRGlyZWN0aW9uID0gXCJBU0NcIiB8IFwiREVTQ1wiO1xuXG4vKipcbiAqIFdIRVJFIGNvbmRpdGlvbiBvYmplY3QgdHlwZVxuICovXG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbjxUPiA9IFBhcnRpYWw8VD47XG5cbi8qKlxuICogUmVnZXggY29uZGl0aW9uIG9iamVjdCB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlZ2V4Q29uZGl0aW9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgUmVnRXhwIHwgc3RyaW5nPj47XG5cbi8qKlxuICogSW5zZXJ0IHJlc3VsdCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRSZXN1bHQge1xuICBpbnNlcnRJZDogbnVtYmVyO1xuICBjaGFuZ2VzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVXBkYXRlIHJlc3VsdCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVSZXN1bHQge1xuICBjaGFuZ2VzOiBudW1iZXI7XG59XG5cbi8qKlxuICogRGVsZXRlIHJlc3VsdCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxldGVSZXN1bHQge1xuICBjaGFuZ2VzOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5zZXJ0IG9wdGlvbnMgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0T3B0aW9ucyB7XG4gIG9ySWdub3JlPzogYm9vbGVhbjtcbiAgb3JSZXBsYWNlPzogYm9vbGVhbjtcbiAgb3JBYm9ydD86IGJvb2xlYW47XG4gIG9yRmFpbD86IGJvb2xlYW47XG4gIG9yUm9sbGJhY2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEpTT04gY29sdW1uIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uQ29sdW1uQ29uZmlnPFQ+IHtcbiAganNvbkNvbHVtbnM/OiBBcnJheTxrZXlvZiBUPjtcbn1cblxuLyoqXG4gKiBHZW5lcmljIGRhdGFiYXNlIHJvdyB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIERhdGFiYXNlUm93ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogU1FMIHBhcmFtZXRlciB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFNxbFBhcmFtZXRlciA9IFNRTFF1ZXJ5QmluZGluZ3M7XG5cbi8qKlxuICogRGF0YWJhc2Ugcm93IHdpdGggdW5rbm93biBzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJhc2VSb3dEYXRhID0gUmVjb3JkPHN0cmluZywgU1FMUXVlcnlCaW5kaW5ncz47XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsbUJBQVMsbUJDYUYsTUFBZSxDQUFvRCxDQUM5RCxNQUVWLFdBQVcsQ0FDVCxFQUNBLEVBQ0EsRUFDQSxDQUNBLEtBQUssTUFBUSxDQUNYLEtBQ0EsWUFDQSxnQkFBaUIsQ0FBQyxFQUNsQixZQUFhLENBQUMsRUFDZCxn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