@dockstat/sqlite-wrapper 1.0.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 ADDED
@@ -0,0 +1,12 @@
1
+ // @bun
2
+ import{Database as P}from"bun:sqlite";class j{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 O extends j{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 K extends O{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((_,k)=>{let $=_[Z],G=k[Z];if($===G)return 0;if($===null||$===void 0)return-1;if(G===null||G===void 0)return 1;if($<G)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[_,k]=this.buildSelectQuery(!0),$=this.getDb().prepare(_).all(...k);return this.transformRowsFromDb($)}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 I extends O{insert(M,X){let Z=(Array.isArray(M)?M:[M]).map((L)=>this.transformRowToDb(L));if(Z.length===0)throw new Error("insert: data cannot be empty");let _=new Set;for(let L of Z)for(let V of Object.keys(L))_.add(V);let k=Array.from(_);if(k.length===0)throw new Error("insert: no columns to insert");let $="INSERT";if(X?.orIgnore)$="INSERT OR IGNORE";else if(X?.orReplace)$="INSERT OR REPLACE";else if(X?.orAbort)$="INSERT OR ABORT";else if(X?.orFail)$="INSERT OR FAIL";else if(X?.orRollback)$="INSERT OR ROLLBACK";let G=k.map((L)=>this.quoteIdentifier(L)).join(", "),F=k.map(()=>"?").join(", "),H=`${$} INTO ${this.quoteIdentifier(this.getTableName())} (${G}) VALUES (${F})`,J=this.getDb().prepare(H),W=0,E=0;for(let L of Z){let V=k.map((z)=>L[z]??null),A=J.run(...V);if(W+=A.changes,A.lastInsertRowid)E=Number(A.lastInsertRowid)}return{insertId:E,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 k=0,$=0,G=_.map((A)=>this.transformRowToDb(A)),F=new Set;for(let A of G)for(let z of Object.keys(A))F.add(z);let H=Array.from(F);if(H.length===0)throw new Error("insertBatch: no columns to insert");let J="INSERT";if(X?.orIgnore)J="INSERT OR IGNORE";else if(X?.orReplace)J="INSERT OR REPLACE";else if(X?.orAbort)J="INSERT OR ABORT";else if(X?.orFail)J="INSERT OR FAIL";else if(X?.orRollback)J="INSERT OR ROLLBACK";let W=H.map((A)=>this.quoteIdentifier(A)).join(", "),E=H.map(()=>"?").join(", "),L=`${J} INTO ${this.quoteIdentifier(this.getTableName())} (${W}) VALUES (${E})`,V=Y.prepare(L);for(let A of G){let z=H.map((S)=>A[S]??null),U=V.run(...z);if(k+=U.changes,U.lastInsertRowid)$=Number(U.lastInsertRowid)}return{insertId:$,changes:k}})(M)}}class B extends K{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((J)=>`${this.quoteIdentifier(J)} = ?`).join(", "),[_,k]=this.buildWhereClause(),$=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${Z}${_}`,F=[...Y.map((J)=>X[J]),...k];return{changes:this.getDb().prepare($).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 k=Object.keys(M),$=k.map((W)=>`${this.quoteIdentifier(W)} = ?`).join(", "),G=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${$} WHERE rowid = ?`,F=this.getDb().prepare(G),H=0,J=k.map((W)=>M[W]);for(let W of _){let E=F.run(...J,W.rowid);H+=E.changes}return{changes:H}}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(", "),k=`INSERT OR REPLACE INTO ${this.quoteIdentifier(this.getTableName())} (${Z}) VALUES (${_})`,$=Y.map((F)=>X[F]??null);return{changes:this.getDb().prepare(k).run(...$).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:k,data:$}of Z){let G=this.transformRowToDb($),F=Object.keys(G);if(F.length===0)continue;let H=[],J=[];for(let[U,S]of Object.entries(k))if(S===null||S===void 0)H.push(`${this.quoteIdentifier(U)} IS NULL`);else H.push(`${this.quoteIdentifier(U)} = ?`),J.push(S);if(H.length===0)throw new Error("updateBatch: each update must have WHERE conditions");let W=F.map((U)=>`${this.quoteIdentifier(U)} = ?`).join(", "),E=` WHERE ${H.join(" AND ")}`,L=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${W}${E}`,A=[...F.map((U)=>G[U]??null),...J],z=X.prepare(L).run(...A);_+=z.changes}return{changes:_}})(M)}}class N extends K{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 = ?`,k=this.getDb().prepare(_),$=0;for(let G of Z){let F=k.run(G.rowid);$+=F.changes}return{changes:$}}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),k=this.applyRegexFiltering(_);if(k.length===0)return{changes:0};let $=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = ? WHERE rowid = ?`,G=this.getDb().prepare($),F=0;for(let H of k){let J=G.run(X,H.rowid);F+=J.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 k=`UPDATE ${this.quoteIdentifier(this.getTableName())} SET ${this.quoteIdentifier(String(M))} = NULL WHERE rowid = ?`,$=this.getDb().prepare(k),G=0;for(let F of _){let H=$.run(F.rowid);G+=H.changes}return{changes:G}}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 k of Z){let $=[],G=[];for(let[W,E]of Object.entries(k))if(E===null||E===void 0)$.push(`${this.quoteIdentifier(W)} IS NULL`);else $.push(`${this.quoteIdentifier(W)} = ?`),G.push(E);if($.length===0)throw new Error("deleteBatch: each delete must have WHERE conditions");let F=` WHERE ${$.join(" AND ")}`,H=`DELETE FROM ${this.quoteIdentifier(this.getTableName())}${F}`,J=X.prepare(H).run(...G);_+=J.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((k)=>String(k)).map((k)=>this.quoteIdentifier(k)).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 R{selectBuilder;insertBuilder;updateBuilder;deleteBuilder;constructor(M,X,Y){this.selectBuilder=new K(M,X,Y),this.insertBuilder=new I(M,X,Y),this.updateBuilder=new B(M,X,Y),this.deleteBuilder=new N(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)}}class D{db;constructor(M,X){if(this.db=new P(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 R(this.db,M,X)}close(){this.db.close()}createTable(M,X,Y){let Z=Y?.ifNotExists?"IF NOT EXISTS ":"",_=Y?.withoutRowId?" WITHOUT ROWID":"",k=(F)=>`"${F.replace(/"/g,'""')}"`,$;if(typeof X==="string"){if($=X.trim(),!$)throw new Error("Empty column definition string")}else{let F=[];for(let[H,J]of Object.entries(X)){if(!H)continue;let W=(J??"").trim();if(!W)throw new Error(`Missing SQL type/constraints for column "${H}"`);F.push(`${k(H)} ${W}`)}if(F.length===0)throw new Error("No columns provided");$=F.join(", ")}let G=`CREATE TABLE ${Z}${k(M)} (${$})${_};`;this.db.exec(G)}pragma(M,X){if(X!==void 0)this.db.exec(`PRAGMA ${M} = ${X}`);else{let Y=this.db.prepare(`PRAGMA ${M}`).get();return Object.values(Y)[0]}}loadExtension(M){this.db.loadExtension(M)}getDb(){return this.db}}export{R as QueryBuilder,D as DB};
10
+
11
+ //# debugId=759336DF2A87B08264756E2164756E21
12
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vcXVlcnktYnVpbGRlci9iYXNlLnRzIiwgIi4uL3F1ZXJ5LWJ1aWxkZXIvd2hlcmUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9zZWxlY3QudHMiLCAiLi4vcXVlcnktYnVpbGRlci9pbnNlcnQudHMiLCAiLi4vcXVlcnktYnVpbGRlci91cGRhdGUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9kZWxldGUudHMiLCAiLi4vcXVlcnktYnVpbGRlci9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgeyBRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9xdWVyeS1idWlsZGVyL2luZGV4XCI7XG5pbXBvcnQgdHlwZSB7IEpzb25Db2x1bW5Db25maWcgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIFJlLWV4cG9ydCBRdWVyeUJ1aWxkZXIgYW5kIHR5cGVzIHNvIGNhbGxlcnMgY2FuIGltcG9ydCB0aGVtIGRpcmVjdGx5OlxuICpcbiAqIGltcG9ydCBEQiwgeyBRdWVyeUJ1aWxkZXIsIEluc2VydFJlc3VsdCwgVXBkYXRlUmVzdWx0LCBEZWxldGVSZXN1bHQgfSBmcm9tIFwiLi9kYlwiO1xuICovXG5leHBvcnQgeyBRdWVyeUJ1aWxkZXIgfTtcbmV4cG9ydCB0eXBlIHtcbiAgSW5zZXJ0UmVzdWx0LFxuICBVcGRhdGVSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgSW5zZXJ0T3B0aW9ucyxcbiAgQ29sdW1uTmFtZXMsXG4gIFdoZXJlQ29uZGl0aW9uLFxuICBSZWdleENvbmRpdGlvbixcbiAgSnNvbkNvbHVtbkNvbmZpZyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBUeXBlZFNRTGl0ZSDigJQgdGlueSB3cmFwcGVyIGFyb3VuZCBidW46c3FsaXRlIGBEYXRhYmFzZWAuXG4gKlxuICogVGhpcyBjbGFzcyBjZW50cmFsaXplcyBjb21tb24gaGVscGVycyBsaWtlIGB0YWJsZSgpYCAocmV0dXJucyBhIHR5cGVkIFF1ZXJ5QnVpbGRlcilcbiAqIGFuZCBgY3JlYXRlVGFibGUoKWAgZm9yIGNyZWF0aW5nIHRhYmxlcyBlYXNpbHkuXG4gKi9cbmNsYXNzIERCIHtcbiAgcHJpdmF0ZSBkYjogRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIE9wZW4gb3IgY3JlYXRlIGEgU1FMaXRlIGRhdGFiYXNlIGF0IGBwYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIHRoZSBTUUxpdGUgZmlsZSAoZS5nLiBcImFwcC5kYlwiKS4gVXNlIFwiOm1lbW9yeTpcIiBmb3IgaW4tbWVtb3J5IERCLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgcHJhZ21hcz86IEFycmF5PFtzdHJpbmcsIGFueV0+O1xuICAgICAgbG9hZEV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcbiAgICB9LFxuICApIHtcbiAgICB0aGlzLmRiID0gbmV3IERhdGFiYXNlKHBhdGgpO1xuXG4gICAgLy8gQXBwbHkgUFJBR01BIHNldHRpbmdzIGlmIHByb3ZpZGVkXG4gICAgaWYgKG9wdGlvbnM/LnByYWdtYXMpIHtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBvcHRpb25zLnByYWdtYXMpIHtcbiAgICAgICAgdGhpcy5wcmFnbWEobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgZXh0ZW5zaW9ucyBpZiBwcm92aWRlZFxuICAgIGlmIChvcHRpb25zPy5sb2FkRXh0ZW5zaW9ucykge1xuICAgICAgZm9yIChjb25zdCBleHRlbnNpb25QYXRoIG9mIG9wdGlvbnMubG9hZEV4dGVuc2lvbnMpIHtcbiAgICAgICAgdGhpcy5sb2FkRXh0ZW5zaW9uKGV4dGVuc2lvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB0eXBlZCBRdWVyeUJ1aWxkZXIgZm9yIGEgZ2l2ZW4gdGFibGUgbmFtZS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHNcbiAgICogaW50ZXJmYWNlIFVzZXIgeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IH1cbiAgICpcbiAgICogLy8gU0VMRUNUIG9wZXJhdGlvbnNcbiAgICogY29uc3QgdXNlcnMgPSBkYi50YWJsZTxVc2VyPihcInVzZXJzXCIpXG4gICAqICAgLnNlbGVjdChbXCJpZFwiLCBcIm5hbWVcIl0pXG4gICAqICAgLndoZXJlKHsgYWN0aXZlOiB0cnVlIH0pXG4gICAqICAgLm9yZGVyQnkoXCJjcmVhdGVkX2F0XCIpXG4gICAqICAgLmRlc2MoKVxuICAgKiAgIC5saW1pdCgxMClcbiAgICogICAuYWxsKCk7XG4gICAqXG4gICAqIC8vIElOU0VSVCBvcGVyYXRpb25zXG4gICAqIGNvbnN0IGluc2VydFJlc3VsdCA9IGRiLnRhYmxlPFVzZXI+KFwidXNlcnNcIilcbiAgICogICAuaW5zZXJ0KHsgbmFtZTogXCJKb2huXCIsIGVtYWlsOiBcImpvaG5AZXhhbXBsZS5jb21cIiB9KTtcbiAgICpcbiAgICogLy8gVVBEQVRFIG9wZXJhdGlvbnNcbiAgICogY29uc3QgdXBkYXRlUmVzdWx0ID0gZGIudGFibGU8VXNlcj4oXCJ1c2Vyc1wiKVxuICAgKiAgIC53aGVyZSh7IGlkOiAxIH0pXG4gICAqICAgLnVwZGF0ZSh7IG5hbWU6IFwiSmFuZVwiIH0pO1xuICAgKlxuICAgKiAvLyBERUxFVEUgb3BlcmF0aW9uc1xuICAgKiBjb25zdCBkZWxldGVSZXN1bHQgPSBkYi50YWJsZTxVc2VyPihcInVzZXJzXCIpXG4gICAqICAgLndoZXJlKHsgYWN0aXZlOiBmYWxzZSB9KVxuICAgKiAgIC5kZWxldGUoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEZvciB0YWJsZXMgd2l0aCBKU09OIGNvbHVtbnMsIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLXNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkOlxuICAgKiBgYGB0c1xuICAgKiBpbnRlcmZhY2UgQ29uZmlnIHsgaWQ6IG51bWJlcjsgc2V0dGluZ3M6IG9iamVjdDsgbWV0YWRhdGE6IGFueVtdOyB9XG4gICAqXG4gICAqIGNvbnN0IGNvbmZpZyA9IGRiLnRhYmxlPENvbmZpZz4oXCJjb25maWdcIiwgeyBqc29uQ29sdW1uczogW1wic2V0dGluZ3NcIiwgXCJtZXRhZGF0YVwiXSB9KVxuICAgKiAgIC5zZWxlY3QoW1wiKlwiXSlcbiAgICogICAuZ2V0KCk7IC8vIHNldHRpbmdzIGFuZCBtZXRhZGF0YSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcGFyc2VkIGZyb20gSlNPTlxuICAgKiBgYGBcbiAgICpcbiAgICogYFF1ZXJ5QnVpbGRlcmAgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBub3RhYmxlIG1ldGhvZHM6XG4gICAqXG4gICAqICoqU0VMRUNUIG1ldGhvZHM6KipcbiAgICogLSBgc2VsZWN0KGNvbHVtbnM6IEFycmF5PGtleW9mIFQ+IHwgW1wiKlwiXSlgIOKAlCBzcGVjaWZ5IGNvbHVtbnMgdG8gc2VsZWN0XG4gICAqIC0gYHdoZXJlKGNvbmRpdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsPj4pYCDigJQgc2ltcGxlIGVxdWFsaXR5L0lTIE5VTEwgY2hlY2tzXG4gICAqIC0gYHdoZXJlUmd4KGNvbmRpdGlvbnM6IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIHN0cmluZyB8IFJlZ0V4cD4+KWAg4oCUIHJlZ2V4IGNvbmRpdGlvbnMgKGFwcGxpZWQgY2xpZW50LXNpZGUpXG4gICAqIC0gYHdoZXJlRXhwcihleHByOiBzdHJpbmcsIHBhcmFtcz86IGFueVtdKWAgLyBgd2hlcmVSYXcoLi4uKWAg4oCUIHJhdyBTUUwgZnJhZ21lbnRzIHdpdGggcGFyYW1ldGVyIGJpbmRpbmdcbiAgICogLSBgd2hlcmVJbihjb2x1bW46IGtleW9mIFQsIHZhbHVlczogYW55W10pYCDigJQgSU4gY2xhdXNlIHdpdGggcGFyYW1ldGVyIGJpbmRpbmdcbiAgICogLSBgd2hlcmVPcChjb2x1bW46IGtleW9mIFQsIG9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpYCDigJQgY29tcGFyaXNvbiBvcGVyYXRvcnMgKD0sICE9LCA8LCA+LCA8PSwgPj0sIExJS0UsIEdMT0IsIElTKVxuICAgKiAtIGBvcmRlckJ5KGNvbHVtbjoga2V5b2YgVClgLCBgYXNjKClgLCBgZGVzYygpYCDigJQgb3JkZXJpbmdcbiAgICogLSBgbGltaXQobilgLCBgb2Zmc2V0KG4pYCDigJQgcGFnaW5hdGlvblxuICAgKiAtIGBhbGwoKTogVFtdYCwgYGdldCgpOiBUIHwgbnVsbGAsIGBmaXJzdCgpOiBUIHwgbnVsbGAsIGBjb3VudCgpOiBudW1iZXJgIOKAlCByZXN1bHQgZXhlY3V0aW9uXG4gICAqXG4gICAqICoqSU5TRVJUIG1ldGhvZHM6KipcbiAgICogLSBgaW5zZXJ0KGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10sIG9wdGlvbnM/OiBJbnNlcnRPcHRpb25zKTogSW5zZXJ0UmVzdWx0YCDigJQgaW5zZXJ0IHNpbmdsZS9tdWx0aXBsZSByb3dzXG4gICAqIC0gYGluc2VydE9ySWdub3JlKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHRgIOKAlCBJTlNFUlQgT1IgSUdOT1JFXG4gICAqIC0gYGluc2VydE9yUmVwbGFjZShkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0YCDigJQgSU5TRVJUIE9SIFJFUExBQ0VcbiAgICpcbiAgICogKipVUERBVEUgbWV0aG9kczoqKlxuICAgKiAtIGB1cGRhdGUoZGF0YTogUGFydGlhbDxUPik6IFVwZGF0ZVJlc3VsdGAg4oCUIHVwZGF0ZSByb3dzIChyZXF1aXJlcyBXSEVSRSBjb25kaXRpb25zKVxuICAgKlxuICAgKiAqKkRFTEVURSBtZXRob2RzOioqXG4gICAqIC0gYGRlbGV0ZSgpOiBEZWxldGVSZXN1bHRgIOKAlCBkZWxldGUgcm93cyAocmVxdWlyZXMgV0hFUkUgY29uZGl0aW9ucylcbiAgICpcbiAgICogTm90ZXM6XG4gICAqIC0gUmVnZXggY29uZGl0aW9ucyBpbiBgd2hlcmVSZ3hgIGFyZSBhcHBsaWVkIGNsaWVudC1zaWRlIGFmdGVyIFNRTCBleGVjdXRpb25cbiAgICogLSBXaGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQsIG9yZGVyaW5nL2xpbWl0L29mZnNldCBhcmUgYWxzbyBhcHBsaWVkIGNsaWVudC1zaWRlXG4gICAqIC0gVVBEQVRFIGFuZCBERUxFVEUgb3BlcmF0aW9ucyByZXF1aXJlIGF0IGxlYXN0IG9uZSBXSEVSRSBjb25kaXRpb24gZm9yIHNhZmV0eVxuICAgKiAtIEFsbCBtdXRhdGlvbnMgcmV0dXJuIHJlc3VsdCBvYmplY3RzIHdpdGggYGNoYW5nZXNgIGNvdW50IGFuZCBgaW5zZXJ0SWRgIChmb3IgSU5TRVJUKVxuICAgKiAtIEpTT04gY29sdW1ucyBhcmUgYXV0b21hdGljYWxseSBzZXJpYWxpemVkIG9uIElOU0VSVC9VUERBVEUgYW5kIGRlc2VyaWFsaXplZCBvbiBTRUxFQ1RcbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gUm93IHR5cGUgZm9yIHRoZSB0YWJsZS5cbiAgICogQHBhcmFtIHRhYmxlTmFtZSAtIFRoZSB0YWJsZSBuYW1lIHRvIG9wZXJhdGUgb24uXG4gICAqIEBwYXJhbSBqc29uQ29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgSlNPTiBjb2x1bW5zIHRoYXQgc2hvdWxkIGJlIGF1dG8tc2VyaWFsaXplZC9kZXNlcmlhbGl6ZWQuXG4gICAqIEByZXR1cm5zIFF1ZXJ5QnVpbGRlcjxUPlxuICAgKi9cbiAgdGFibGU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGpzb25Db25maWc/OiBKc29uQ29sdW1uQ29uZmlnPFQ+LFxuICApOiBRdWVyeUJ1aWxkZXI8VD4ge1xuICAgIHJldHVybiBuZXcgUXVlcnlCdWlsZGVyPFQ+KHRoaXMuZGIsIHRhYmxlTmFtZSwganNvbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIHVuZGVybHlpbmcgU1FMaXRlIGRhdGFiYXNlIGhhbmRsZS5cbiAgICpcbiAgICogQWZ0ZXIgY2FsbGluZyBgY2xvc2UoKWAgdGhlIGluc3RhbmNlIHNob3VsZCBub3QgYmUgdXNlZC5cbiAgICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGIuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0YWJsZS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXI6XG4gICAqIC0gYGNvbHVtbnNgIGFzIGEgc2luZ2xlIFNRTCBjb2x1bW4tZGVmaW5pdGlvbiBzdHJpbmc6XG4gICAqICAgICBcImlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCBOT1QgTlVMTFwiXG4gICAqIC0gYGNvbHVtbnNgIGFzIG9iamVjdCBgeyBjb2xOYW1lOiBcIlNRTCBUWVBFIENPTlNUUkFJTlRTXCIsIC4uLiB9YFxuICAgKlxuICAgKiBPcHRpb25zOlxuICAgKiAtIGBpZk5vdEV4aXN0c2A6IHByZXBlbmQgYElGIE5PVCBFWElTVFNgXG4gICAqIC0gYHdpdGhvdXRSb3dJZGA6IGFwcGVuZCBgV0lUSE9VVCBST1dJRGBcbiAgICpcbiAgICogVGhlIG1ldGhvZCB3aWxsIHNhZmVseSBxdW90ZSBpZGVudGlmaWVycyAoZG91YmxlIHF1b3RlcykuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZU5hbWUgLSBUYWJsZSBuYW1lIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIGNvbHVtbnMgLSBDb2x1bW4gZGVmaW5pdGlvbnMgKFNRTCBzdHJpbmcpIG9yIGEgbWFwIG9mIGNvbHVtbuKGkmRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgZmxhZ3MgYHsgaWZOb3RFeGlzdHM/OiBib29sZWFuOyB3aXRob3V0Um93SWQ/OiBib29sZWFuIH1gLlxuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgY29sdW1uIGRlZmluaXRpb25zIGFyZSBlbXB0eSBvciBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlVGFibGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY29sdW1uczogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBvcHRpb25zPzogeyBpZk5vdEV4aXN0cz86IGJvb2xlYW47IHdpdGhvdXRSb3dJZD86IGJvb2xlYW4gfSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaWZOb3QgPSBvcHRpb25zPy5pZk5vdEV4aXN0cyA/IFwiSUYgTk9UIEVYSVNUUyBcIiA6IFwiXCI7XG4gICAgY29uc3Qgd2l0aG91dFJvd0lkID0gb3B0aW9ucz8ud2l0aG91dFJvd0lkID8gXCIgV0lUSE9VVCBST1dJRFwiIDogXCJcIjtcblxuICAgIGNvbnN0IHF1b3RlSWRlbnQgPSAoczogc3RyaW5nKSA9PiBgXCIke3MucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImA7XG5cbiAgICBsZXQgY29sdW1uRGVmczogc3RyaW5nO1xuICAgIGlmICh0eXBlb2YgY29sdW1ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29sdW1uRGVmcyA9IGNvbHVtbnMudHJpbSgpO1xuICAgICAgaWYgKCFjb2x1bW5EZWZzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGNvbHVtbiBkZWZpbml0aW9uIHN0cmluZ1wiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtjb2wsIGRlZl0gb2YgT2JqZWN0LmVudHJpZXMoY29sdW1ucykpIHtcbiAgICAgICAgaWYgKCFjb2wpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWZUcmltID0gKGRlZiA/PyBcIlwiKS50cmltKCk7XG4gICAgICAgIGlmICghZGVmVHJpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBTUUwgdHlwZS9jb25zdHJhaW50cyBmb3IgY29sdW1uIFwiJHtjb2x9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJ0cy5wdXNoKGAke3F1b3RlSWRlbnQoY29sKX0gJHtkZWZUcmltfWApO1xuICAgICAgfVxuICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjb2x1bW5zIHByb3ZpZGVkXCIpO1xuICAgICAgfVxuICAgICAgY29sdW1uRGVmcyA9IHBhcnRzLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcWwgPSBgQ1JFQVRFIFRBQkxFICR7aWZOb3R9JHtxdW90ZUlkZW50KHRhYmxlTmFtZSl9ICgke2NvbHVtbkRlZnN9KSR7d2l0aG91dFJvd0lkfTtgO1xuICAgIHRoaXMuZGIuZXhlYyhzcWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvciBnZXQgYSBQUkFHTUEgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gUFJBR01BIG5hbWUgKGUuZy4sIFwiZm9yZWlnbl9rZXlzXCIsIFwiam91cm5hbF9tb2RlXCIpXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldCAob21pdCB0byBnZXQgY3VycmVudCB2YWx1ZSlcbiAgICogQHJldHVybnMgQ3VycmVudCB2YWx1ZSB3aGVuIGdldHRpbmcsIHVuZGVmaW5lZCB3aGVuIHNldHRpbmdcbiAgICovXG4gIHByYWdtYShuYW1lOiBzdHJpbmcsIHZhbHVlPzogYW55KTogYW55IHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kYi5leGVjKGBQUkFHTUEgJHtuYW1lfSA9ICR7dmFsdWV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZGIucHJlcGFyZShgUFJBR01BICR7bmFtZX1gKS5nZXQoKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0KVswXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIFNRTGl0ZSBleHRlbnNpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCB0byB0aGUgY29tcGlsZWQgU1FMaXRlIGV4dGVuc2lvblxuICAgKi9cbiAgbG9hZEV4dGVuc2lvbihwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRiLmxvYWRFeHRlbnNpb24ocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgU1FMaXRlIGRhdGFiYXNlIGluc3RhbmNlLlxuICAgKiBVc2UgdGhpcyBmb3IgYWR2YW5jZWQgb3BlcmF0aW9ucyBub3QgY292ZXJlZCBieSB0aGUgUXVlcnlCdWlsZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBEYXRhYmFzZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0RGIoKTogRGF0YWJhc2Uge1xuICAgIHJldHVybiB0aGlzLmRiO1xuICB9XG59XG5cbmV4cG9ydCB7IERCIH07XG4iLAogICAgImltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tIFwiYnVuOnNxbGl0ZVwiO1xuaW1wb3J0IHR5cGUge1xuICBDb2x1bW5OYW1lcyxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFF1ZXJ5QnVpbGRlclN0YXRlLFxuICBKc29uQ29sdW1uQ29uZmlnLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBCYXNlIFF1ZXJ5QnVpbGRlciBjbGFzcyB0aGF0IG1hbmFnZXMgY29yZSBzdGF0ZSBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgcXVlcnkgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VRdWVyeUJ1aWxkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcHJvdGVjdGVkIHN0YXRlOiBRdWVyeUJ1aWxkZXJTdGF0ZTxUPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYjogRGF0YWJhc2UsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAganNvbkNvbmZpZz86IEpzb25Db2x1bW5Db25maWc8VD4sXG4gICkge1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkYixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHdoZXJlQ29uZGl0aW9uczogW10sXG4gICAgICB3aGVyZVBhcmFtczogW10sXG4gICAgICByZWdleENvbmRpdGlvbnM6IFtdLFxuICAgICAganNvbkNvbHVtbnM6IGpzb25Db25maWc/Lmpzb25Db2x1bW5zLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkYXRhYmFzZSBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldERiKCk6IERhdGFiYXNlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRhYmxlIG5hbWVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRUYWJsZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS50YWJsZU5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIFdIRVJFIGNsYXVzZSBwb3J0aW9uIG9mIGEgU1FMIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBUdXBsZSBvZiBbd2hlcmVDbGF1c2UsIHBhcmFtZXRlcnNdIHdoZXJlIHdoZXJlQ2xhdXNlIGluY2x1ZGVzIFwiV0hFUkVcIiBwcmVmaXhcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZFdoZXJlQ2xhdXNlKCk6IFtzdHJpbmcsIGFueVtdXSB7XG4gICAgaWYgKHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtcIlwiLCBbXV07XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBgIFdIRVJFICR7dGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMuam9pbihcIiBBTkQgXCIpfWAsXG4gICAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnNsaWNlKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHJlZ2V4IGNvbmRpdGlvbnMgdGhhdCByZXF1aXJlIGNsaWVudC1zaWRlIGZpbHRlcmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBoYXNSZWdleENvbmRpdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucmVnZXhDb25kaXRpb25zLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgY2xpZW50LXNpZGUgcmVnZXggZmlsdGVyaW5nIHRvIGEgc2V0IG9mIHJvd3MuXG4gICAqIFRoaXMgaXMgdXNlZCB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXBwbHlSZWdleEZpbHRlcmluZyhyb3dzOiBUW10pOiBUW10ge1xuICAgIGlmICh0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzLmZpbHRlcigocm93KSA9PlxuICAgICAgdGhpcy5zdGF0ZS5yZWdleENvbmRpdGlvbnMuZXZlcnkoKHsgY29sdW1uLCByZWdleCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W1N0cmluZyhjb2x1bW4pXTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgV0hFUkUgY29uZGl0aW9ucyBleGlzdCBmb3Igb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgdGhlbS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIG5vIFdIRVJFIGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVxdWlyZVdoZXJlQ2xhdXNlKG9wZXJhdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMubGVuZ3RoID09PSAwICYmXG4gICAgICB0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucy5sZW5ndGggPT09IDBcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7b3BlcmF0aW9ufSBvcGVyYXRpb24gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIFdIRVJFIGNvbmRpdGlvbi4gVXNlIHdoZXJlKCksIHdoZXJlUmF3KCksIHdoZXJlSW4oKSwgd2hlcmVPcCgpLCBvciB3aGVyZVJneCgpIHRvIGFkZCBjb25kaXRpb25zLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdW90ZSBTUUwgaWRlbnRpZmllcnMgdG8gcHJldmVudCBpbmplY3Rpb24gYW5kIGhhbmRsZSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcXVvdGVJZGVudGlmaWVyKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcIiR7aWRlbnRpZmllci5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBhbGwgV0hFUkUgY29uZGl0aW9ucyBhbmQgcGFyYW1ldGVycy5cbiAgICogVXNlZnVsIGZvciByZXVzaW5nIHRoZSBzYW1lIGJ1aWxkZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzZXRXaGVyZUNvbmRpdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zID0gW107XG4gICAgdGhpcy5zdGF0ZS5yZWdleENvbmRpdGlvbnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcm93IGRhdGEgYWZ0ZXIgZmV0Y2hpbmcgZnJvbSBkYXRhYmFzZSAoZGVzZXJpYWxpemUgSlNPTiBjb2x1bW5zKS5cbiAgICovXG4gIHByb3RlY3RlZCB0cmFuc2Zvcm1Sb3dGcm9tRGIocm93OiBhbnkpOiBUIHtcbiAgICBpZiAoIXRoaXMuc3RhdGUuanNvbkNvbHVtbnMgfHwgIXJvdykgcmV0dXJuIHJvdztcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkID0geyAuLi5yb3cgfTtcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLnN0YXRlLmpzb25Db2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2x1bW5LZXkgPSBTdHJpbmcoY29sdW1uKTtcbiAgICAgIGlmIChcbiAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSAmJlxuICAgICAgICB0eXBlb2YgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSA9PT0gXCJzdHJpbmdcIlxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSA9IEpTT04ucGFyc2UodHJhbnNmb3JtZWRbY29sdW1uS2V5XSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEtlZXAgb3JpZ2luYWwgdmFsdWUgaWYgSlNPTiBwYXJzaW5nIGZhaWxzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBtdWx0aXBsZSByb3dzIGFmdGVyIGZldGNoaW5nIGZyb20gZGF0YWJhc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJhbnNmb3JtUm93c0Zyb21EYihyb3dzOiBhbnlbXSk6IFRbXSB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmpzb25Db2x1bW5zKSByZXR1cm4gcm93cztcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gdGhpcy50cmFuc2Zvcm1Sb3dGcm9tRGIocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHJvdyBkYXRhIGJlZm9yZSBpbnNlcnRpbmcvdXBkYXRpbmcgdG8gZGF0YWJhc2UgKHNlcmlhbGl6ZSBKU09OIGNvbHVtbnMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRyYW5zZm9ybVJvd1RvRGIocm93OiBQYXJ0aWFsPFQ+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlLmpzb25Db2x1bW5zIHx8ICFyb3cpIHJldHVybiByb3c7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4ucm93IH07XG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5zdGF0ZS5qc29uQ29sdW1ucykge1xuICAgICAgY29uc3QgY29sdW1uS2V5ID0gU3RyaW5nKGNvbHVtbik7XG4gICAgICBpZiAoXG4gICAgICAgIHRyYW5zZm9ybWVkW2NvbHVtbktleV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0cmFuc2Zvcm1lZFtjb2x1bW5LZXldICE9PSBudWxsXG4gICAgICApIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm1lZFtjb2x1bW5LZXldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgdHJhbnNmb3JtZWRbY29sdW1uS2V5XSA9IEpTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkW2NvbHVtbktleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdoZXJlQ29uZGl0aW9uLCBSZWdleENvbmRpdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQmFzZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgV0hFUkUtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHRvIHRoZSBRdWVyeUJ1aWxkZXIuXG4gKiBUaGlzIGluY2x1ZGVzIGFsbCBjb25kaXRpb25hbCBmaWx0ZXJpbmcgbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdoZXJlUXVlcnlCdWlsZGVyPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcbj4gZXh0ZW5kcyBCYXNlUXVlcnlCdWlsZGVyPFQ+IHtcbiAgLyoqXG4gICAqIEFkZCBzaW1wbGUgZXF1YWxpdHkgY29uZGl0aW9ucyB0byB0aGUgV0hFUkUgY2xhdXNlLlxuICAgKiBIYW5kbGVzIG51bGwgdmFsdWVzIGFwcHJvcHJpYXRlbHkgd2l0aCBJUyBOVUxMIC8gSVMgTk9UIE5VTEwuXG4gICAqXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIC0gT2JqZWN0IHdpdGggY29sdW1uLXZhbHVlIHBhaXJzIGZvciBlcXVhbGl0eSBjaGVja3NcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZShjb25kaXRpb25zOiBXaGVyZUNvbmRpdGlvbjxUPik6IHRoaXMge1xuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5wdXNoKGAke1N0cmluZyhjb2x1bW4pfSBJUyBOVUxMYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5wdXNoKGAke1N0cmluZyhjb2x1bW4pfSA9ID9gKTtcbiAgICAgICAgdGhpcy5zdGF0ZS53aGVyZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlZ2V4IGNvbmRpdGlvbnMuIE5vdGU6IHJlZ2V4IGNvbmRpdGlvbnMgYXJlIGFwcGxpZWQgY2xpZW50LXNpZGVcbiAgICogYWZ0ZXIgU1FMIGV4ZWN1dGlvbiBkdWUgdG8gQnVuJ3MgU1FMaXRlIGxpbWl0YXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyAtIE9iamVjdCB3aXRoIGNvbHVtbi1yZWdleCBwYWlyc1xuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIHdoZXJlUmd4KGNvbmRpdGlvbnM6IFJlZ2V4Q29uZGl0aW9uPFQ+KTogdGhpcyB7XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29uZGl0aW9ucykpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICB0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbiBhcyBrZXlvZiBULFxuICAgICAgICAgIHJlZ2V4OiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLnN0YXRlLnJlZ2V4Q29uZGl0aW9ucy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW46IGNvbHVtbiBhcyBrZXlvZiBULFxuICAgICAgICAgIHJlZ2V4OiBuZXcgUmVnRXhwKHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gSGFuZGxlIG5vbi1yZWdleCB2YWx1ZXMgYXMgc2ltcGxlIGVxdWFsaXR5IGNvbmRpdGlvbnNcbiAgICAgICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gPSA/YCk7XG4gICAgICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHJhdyBTUUwgV0hFUkUgZnJhZ21lbnQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy5cbiAgICpcbiAgICogQHBhcmFtIGV4cHIgLSBTUUwgZnJhZ21lbnQgKHdpdGhvdXQgbGVhZGluZyBXSEVSRS9BTkQpLCBjYW4gdXNlID8gcGxhY2Vob2xkZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBWYWx1ZXMgZm9yIHRoZSBwbGFjZWhvbGRlcnMgaW4gb3JkZXJcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZUV4cHIoZXhwcjogc3RyaW5nLCBwYXJhbXM6IGFueVtdID0gW10pOiB0aGlzIHtcbiAgICBpZiAoIWV4cHIgfHwgdHlwZW9mIGV4cHIgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIndoZXJlRXhwcjogZXhwciBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ1wiKTtcbiAgICB9XG4gICAgLy8gV3JhcCBpbiBwYXJlbnRoZXNlcyB0byBwcmVzZXJ2ZSBncm91cGluZyB3aGVuIGNvbWJpbmVkIHdpdGggb3RoZXIgY2xhdXNlc1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCgke2V4cHJ9KWApO1xuICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2goLi4ucGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgZm9yIHdoZXJlRXhwciBmb3IgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgd2hlcmVSYXcoZXhwcjogc3RyaW5nLCBwYXJhbXM6IGFueVtdID0gW10pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy53aGVyZUV4cHIoZXhwciwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gSU4gY2xhdXNlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIHdpdGggcHJvcGVyIHBhcmFtZXRlciBiaW5kaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlcyAtIE5vbi1lbXB0eSBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBJTiBjbGF1c2VcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZUluKGNvbHVtbjoga2V5b2YgVCwgdmFsdWVzOiBhbnlbXSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpIHx8IHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIndoZXJlSW46IHZhbHVlcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIH1cbiAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSB2YWx1ZXMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gSU4gKCR7cGxhY2Vob2xkZXJzfSlgKTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2goLi4udmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBOT1QgSU4gY2xhdXNlIGZvciB0aGUgZ2l2ZW4gY29sdW1uIHdpdGggcHJvcGVyIHBhcmFtZXRlciBiaW5kaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlcyAtIE5vbi1lbXB0eSBhcnJheSBvZiB2YWx1ZXMgZm9yIHRoZSBOT1QgSU4gY2xhdXNlXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmVOb3RJbihjb2x1bW46IGtleW9mIFQsIHZhbHVlczogYW55W10pOiB0aGlzIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSB8fCB2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3aGVyZU5vdEluOiB2YWx1ZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheVwiKTtcbiAgICB9XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzID0gdmFsdWVzLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpO1xuICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goXG4gICAgICBgJHtTdHJpbmcoY29sdW1uKX0gTk9UIElOICgke3BsYWNlaG9sZGVyc30pYCxcbiAgICApO1xuICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaCguLi52YWx1ZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNvbXBhcmlzb24gb3BlcmF0b3IgY29uZGl0aW9uIHdpdGggcHJvcGVyIG51bGwgaGFuZGxpbmcuXG4gICAqIFN1cHBvcnRzOiA9LCAhPSwgPD4sIDwsIDw9LCA+LCA+PSwgTElLRSwgR0xPQiwgSVNcbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lXG4gICAqIEBwYXJhbSBvcCAtIENvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY29tcGFyZSAoaGFuZGxlcyBudWxsIGFwcHJvcHJpYXRlbHkpXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmVPcChjb2x1bW46IGtleW9mIFQsIG9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3AgPSAob3AgPz8gXCJcIikudG9VcHBlckNhc2UoKS50cmltKCk7XG4gICAgY29uc3QgYWxsb3dlZCA9IFtcbiAgICAgIFwiPVwiLFxuICAgICAgXCIhPVwiLFxuICAgICAgXCI8PlwiLFxuICAgICAgXCI8XCIsXG4gICAgICBcIjw9XCIsXG4gICAgICBcIj5cIixcbiAgICAgIFwiPj1cIixcbiAgICAgIFwiTElLRVwiLFxuICAgICAgXCJHTE9CXCIsXG4gICAgICBcIklTXCIsXG4gICAgICBcIklTIE5PVFwiLFxuICAgIF07XG5cbiAgICBpZiAoIWFsbG93ZWQuaW5jbHVkZXMobm9ybWFsaXplZE9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB3aGVyZU9wOiBvcGVyYXRvciBcIiR7b3B9XCIgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBudWxsIHNwZWNpYWwtY2FzaW5nIGZvciBJUyAvIElTIE5PVCBhbmQgZXF1YWxpdHkgb3BlcmF0b3JzXG4gICAgaWYgKFxuICAgICAgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAobm9ybWFsaXplZE9wID09PSBcIj1cIiB8fCBub3JtYWxpemVkT3AgPT09IFwiSVNcIilcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElTIE5VTExgKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgKG5vcm1hbGl6ZWRPcCA9PT0gXCIhPVwiIHx8XG4gICAgICAgIG5vcm1hbGl6ZWRPcCA9PT0gXCI8PlwiIHx8XG4gICAgICAgIG5vcm1hbGl6ZWRPcCA9PT0gXCJJUyBOT1RcIilcbiAgICApIHtcbiAgICAgIHRoaXMuc3RhdGUud2hlcmVDb25kaXRpb25zLnB1c2goYCR7U3RyaW5nKGNvbHVtbil9IElTIE5PVCBOVUxMYCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBOb3JtYWwgcGFyYW0tYm91bmQgY29uZGl0aW9uXG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gJHtub3JtYWxpemVkT3B9ID9gKTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2godmFsdWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIEJFVFdFRU4gY29uZGl0aW9uIGZvciB0aGUgZ2l2ZW4gY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHBhcmFtIG1pbiAtIE1pbmltdW0gdmFsdWUgKGluY2x1c2l2ZSlcbiAgICogQHBhcmFtIG1heCAtIE1heGltdW0gdmFsdWUgKGluY2x1c2l2ZSlcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZUJldHdlZW4oY29sdW1uOiBrZXlvZiBULCBtaW46IGFueSwgbWF4OiBhbnkpOiB0aGlzIHtcbiAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5wdXNoKGAke1N0cmluZyhjb2x1bW4pfSBCRVRXRUVOID8gQU5EID9gKTtcbiAgICB0aGlzLnN0YXRlLndoZXJlUGFyYW1zLnB1c2gobWluLCBtYXgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIE5PVCBCRVRXRUVOIGNvbmRpdGlvbiBmb3IgdGhlIGdpdmVuIGNvbHVtbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lXG4gICAqIEBwYXJhbSBtaW4gLSBNaW5pbXVtIHZhbHVlIChleGNsdXNpdmUpXG4gICAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIHZhbHVlIChleGNsdXNpdmUpXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgd2hlcmVOb3RCZXR3ZWVuKGNvbHVtbjoga2V5b2YgVCwgbWluOiBhbnksIG1heDogYW55KTogdGhpcyB7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gTk9UIEJFVFdFRU4gPyBBTkQgP2ApO1xuICAgIHRoaXMuc3RhdGUud2hlcmVQYXJhbXMucHVzaChtaW4sIG1heCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIElTIE5VTEwgY29uZGl0aW9uIGZvciB0aGUgZ2l2ZW4gY29sdW1uLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWVcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICB3aGVyZU51bGwoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5zdGF0ZS53aGVyZUNvbmRpdGlvbnMucHVzaChgJHtTdHJpbmcoY29sdW1uKX0gSVMgTlVMTGApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBJUyBOT1QgTlVMTCBjb25kaXRpb24gZm9yIHRoZSBnaXZlbiBjb2x1bW4uXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4gLSBDb2x1bW4gbmFtZVxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIHdoZXJlTm90TnVsbChjb2x1bW46IGtleW9mIFQpOiB0aGlzIHtcbiAgICB0aGlzLnN0YXRlLndoZXJlQ29uZGl0aW9ucy5wdXNoKGAke1N0cmluZyhjb2x1bW4pfSBJUyBOT1QgTlVMTGApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29sdW1uTmFtZXMsIE9yZGVyRGlyZWN0aW9uIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBXaGVyZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3doZXJlXCI7XG5cbi8qKlxuICogTWl4aW4gY2xhc3MgdGhhdCBhZGRzIFNFTEVDVC1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBRdWVyeUJ1aWxkZXIuXG4gKiBIYW5kbGVzIGNvbHVtbiBzZWxlY3Rpb24sIG9yZGVyaW5nLCBsaW1pdGluZywgYW5kIHJlc3VsdCBleGVjdXRpb24gbWV0aG9kcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IGV4dGVuZHMgV2hlcmVRdWVyeUJ1aWxkZXI8VD4ge1xuICBwcml2YXRlIHNlbGVjdGVkQ29sdW1uczogQ29sdW1uTmFtZXM8VD4gPSBbXCIqXCJdO1xuICBwcml2YXRlIG9yZGVyQ29sdW1uPzoga2V5b2YgVDtcbiAgcHJpdmF0ZSBvcmRlckRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBcIkFTQ1wiO1xuICBwcml2YXRlIGxpbWl0VmFsdWU/OiBudW1iZXI7XG4gIHByaXZhdGUgb2Zmc2V0VmFsdWU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hpY2ggY29sdW1ucyB0byBzZWxlY3QuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQXJyYXkgb2YgY29sdW1uIG5hbWVzIG9yIFtcIipcIl0gZm9yIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgc2VsZWN0KGNvbHVtbnM6IENvbHVtbk5hbWVzPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSBjb2x1bW5zO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBPUkRFUiBCWSBjbGF1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4gLSBDb2x1bW4gbmFtZSB0byBvcmRlciBieVxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIG9yZGVyQnkoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5vcmRlckNvbHVtbiA9IGNvbHVtbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3JkZXIgZGlyZWN0aW9uIHRvIGRlc2NlbmRpbmcuXG4gICAqXG4gICAqIEByZXR1cm5zIHRoaXMgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZGVzYygpOiB0aGlzIHtcbiAgICB0aGlzLm9yZGVyRGlyZWN0aW9uID0gXCJERVNDXCI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9yZGVyIGRpcmVjdGlvbiB0byBhc2NlbmRpbmcgKGRlZmF1bHQpLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGlzIGZvciBtZXRob2QgY2hhaW5pbmdcbiAgICovXG4gIGFzYygpOiB0aGlzIHtcbiAgICB0aGlzLm9yZGVyRGlyZWN0aW9uID0gXCJBU0NcIjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgTElNSVQgY2xhdXNlLlxuICAgKlxuICAgKiBAcGFyYW0gYW1vdW50IC0gTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBsaW1pdChhbW91bnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChhbW91bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJsaW1pdDogYW1vdW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlXCIpO1xuICAgIH1cbiAgICB0aGlzLmxpbWl0VmFsdWUgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIE9GRlNFVCBjbGF1c2UuXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCAtIE51bWJlciBvZiByb3dzIHRvIHNraXBcbiAgICogQHJldHVybnMgdGhpcyBmb3IgbWV0aG9kIGNoYWluaW5nXG4gICAqL1xuICBvZmZzZXQoc3RhcnQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm9mZnNldDogc3RhcnQgbXVzdCBiZSBub24tbmVnYXRpdmVcIik7XG4gICAgfVxuICAgIHRoaXMub2Zmc2V0VmFsdWUgPSBzdGFydDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgY29tcGxldGUgU0VMRUNUIHF1ZXJ5LlxuICAgKiBJZiByZWdleCBjb25kaXRpb25zIGV4aXN0LCBPUkRFUi9MSU1JVC9PRkZTRVQgYXJlIG5vdCBpbmNsdWRlZCBpbiBTUUxcbiAgICogYXMgdGhleSB3aWxsIGJlIGFwcGxpZWQgY2xpZW50LXNpZGUgYWZ0ZXIgcmVnZXggZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gaW5jbHVkZU9yZGVyQW5kTGltaXQgLSBXaGV0aGVyIHRvIGluY2x1ZGUgT1JERVIvTElNSVQvT0ZGU0VUIGluIFNRTFxuICAgKiBAcmV0dXJucyBUdXBsZSBvZiBbcXVlcnksIHBhcmFtZXRlcnNdXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0UXVlcnkoaW5jbHVkZU9yZGVyQW5kTGltaXQgPSB0cnVlKTogW3N0cmluZywgYW55W11dIHtcbiAgICBjb25zdCBjb2xzID1cbiAgICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zWzBdID09PSBcIipcIlxuICAgICAgICA/IFwiKlwiXG4gICAgICAgIDogKHRoaXMuc2VsZWN0ZWRDb2x1bW5zIGFzIHN0cmluZ1tdKS5qb2luKFwiLCBcIik7XG5cbiAgICBsZXQgcXVlcnkgPSBgU0VMRUNUICR7Y29sc30gRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfWA7XG5cbiAgICBjb25zdCBbd2hlcmVDbGF1c2UsIHdoZXJlUGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIHF1ZXJ5ICs9IHdoZXJlQ2xhdXNlO1xuXG4gICAgaWYgKGluY2x1ZGVPcmRlckFuZExpbWl0ICYmICF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSB7XG4gICAgICBpZiAodGhpcy5vcmRlckNvbHVtbikge1xuICAgICAgICBxdWVyeSArPSBgIE9SREVSIEJZICR7U3RyaW5nKHRoaXMub3JkZXJDb2x1bW4pfSAke3RoaXMub3JkZXJEaXJlY3Rpb259YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubGltaXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHF1ZXJ5ICs9IGAgTElNSVQgJHt0aGlzLmxpbWl0VmFsdWV9YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2Zmc2V0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBxdWVyeSArPSBgIE9GRlNFVCAke3RoaXMub2Zmc2V0VmFsdWV9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3F1ZXJ5LCB3aGVyZVBhcmFtc107XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgSmF2YVNjcmlwdC1iYXNlZCBmaWx0ZXJpbmcsIG9yZGVyaW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAgICogVXNlZCB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgcmVxdWlyZSBjbGllbnQtc2lkZSBwcm9jZXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcm93cyAtIFJvd3MgdG8gcHJvY2Vzc1xuICAgKiBAcmV0dXJucyBQcm9jZXNzZWQgcm93c1xuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUNsaWVudFNpZGVPcGVyYXRpb25zKHJvd3M6IFRbXSk6IFRbXSB7XG4gICAgaWYgKCF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpKSByZXR1cm4gcm93cztcblxuICAgIC8vIEFwcGx5IHJlZ2V4IGZpbHRlcnNcbiAgICBsZXQgZmlsdGVyZWQgPSB0aGlzLmFwcGx5UmVnZXhGaWx0ZXJpbmcocm93cyk7XG5cbiAgICAvLyBBcHBseSBvcmRlcmluZyBpbiBKYXZhU2NyaXB0XG4gICAgaWYgKHRoaXMub3JkZXJDb2x1bW4pIHtcbiAgICAgIGNvbnN0IGNvbCA9IFN0cmluZyh0aGlzLm9yZGVyQ29sdW1uKTtcbiAgICAgIGZpbHRlcmVkLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhID0gYVtjb2xdO1xuICAgICAgICBjb25zdCB2YiA9IGJbY29sXTtcbiAgICAgICAgaWYgKHZhID09PSB2YikgcmV0dXJuIDA7XG4gICAgICAgIGlmICh2YSA9PT0gbnVsbCB8fCB2YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gLTE7XG4gICAgICAgIGlmICh2YiA9PT0gbnVsbCB8fCB2YiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHZhIDwgdmIpIHJldHVybiB0aGlzLm9yZGVyRGlyZWN0aW9uID09PSBcIkFTQ1wiID8gLTEgOiAxO1xuICAgICAgICByZXR1cm4gdGhpcy5vcmRlckRpcmVjdGlvbiA9PT0gXCJBU0NcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IG9mZnNldCAmIGxpbWl0IGluIEphdmFTY3JpcHRcbiAgICBjb25zdCBzdGFydCA9IHRoaXMub2Zmc2V0VmFsdWUgPz8gMDtcbiAgICBpZiAodGhpcy5saW1pdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgdGhpcy5saW1pdFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHN0YXJ0ID4gMCkge1xuICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5zbGljZShzdGFydCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYWxsIG1hdGNoaW5nIHJvd3MuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJvd3MgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqL1xuICBhbGwoKTogVFtdIHtcbiAgICBpZiAoIXRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIGNvbnN0IFtxdWVyeSwgcGFyYW1zXSA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh0cnVlKTtcbiAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLmdldERiKClcbiAgICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAgIC5hbGwoLi4ucGFyYW1zKSBhcyBUW107XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Sb3dzRnJvbURiKHJvd3MpO1xuICAgIH1cblxuICAgIGNvbnN0IFtxdWVyeSwgcGFyYW1zXSA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeShmYWxzZSk7XG4gICAgY29uc3Qgcm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAuYWxsKC4uLnBhcmFtcykgYXMgVFtdO1xuICAgIGNvbnN0IHRyYW5zZm9ybWVkUm93cyA9IHRoaXMudHJhbnNmb3JtUm93c0Zyb21EYihyb3dzKTtcbiAgICByZXR1cm4gdGhpcy5hcHBseUNsaWVudFNpZGVPcGVyYXRpb25zKHRyYW5zZm9ybWVkUm93cyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiB0aGUgZmlyc3QgbWF0Y2hpbmcgcm93LCBvciBudWxsIGlmIG5vbmUgZm91bmQuXG4gICAqIElmIG5vIGV4cGxpY2l0IExJTUlUIGlzIHNldCwgYWRkcyBMSU1JVCAxIGZvciBlZmZpY2llbmN5LlxuICAgKlxuICAgKiBAcmV0dXJucyBGaXJzdCBtYXRjaGluZyByb3cgb3IgbnVsbFxuICAgKi9cbiAgZ2V0KCk6IFQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkgJiYgdGhpcy5saW1pdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE5vIHJlZ2V4IGFuZCBubyBleHBsaWNpdCBsaW1pdCwgd2UgY2FuIHNhZmVseSBhZGQgTElNSVQgMVxuICAgICAgY29uc3QgW3F1ZXJ5LCBwYXJhbXNdID0gdGhpcy5idWlsZFNlbGVjdFF1ZXJ5KHRydWUpO1xuICAgICAgY29uc3QgcSA9IHF1ZXJ5LmluY2x1ZGVzKFwiTElNSVRcIikgPyBxdWVyeSA6IGAke3F1ZXJ5fSBMSU1JVCAxYDtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShxKVxuICAgICAgICAuZ2V0KC4uLnBhcmFtcykgYXMgVCB8IG51bGw7XG4gICAgICByZXR1cm4gcm93ID8gdGhpcy50cmFuc2Zvcm1Sb3dGcm9tRGIocm93KSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc1JlZ2V4Q29uZGl0aW9ucygpICYmIHRoaXMubGltaXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBMaW1pdCBpcyBwcmVzZW50OyBqdXN0IHVzZSB0aGUgcXVlcnkgYXMtaXNcbiAgICAgIGNvbnN0IFtxdWVyeSwgcGFyYW1zXSA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh0cnVlKTtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgICAgLmdldCguLi5wYXJhbXMpIGFzIFQgfCBudWxsO1xuICAgICAgcmV0dXJuIHJvdyA/IHRoaXMudHJhbnNmb3JtUm93RnJvbURiKHJvdykgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhcyByZWdleCBjb25kaXRpb25zLCBuZWVkIHRvIHByb2Nlc3MgY2xpZW50LXNpZGVcbiAgICBjb25zdCByZXN1bHRzID0gdGhpcy5hbGwoKTtcbiAgICByZXR1cm4gcmVzdWx0c1swXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIHJvdywgb3IgbnVsbCBpZiBub25lIGZvdW5kLlxuICAgKiBBbHdheXMgcmVzcGVjdHMgdGhlIHNlbWFudGljcyBvZiByZXR1cm5pbmcgdGhlIGZpcnN0IHJvdyByZWdhcmRsZXNzIG9mIExJTUlULlxuICAgKlxuICAgKiBAcmV0dXJucyBGaXJzdCBtYXRjaGluZyByb3cgb3IgbnVsbFxuICAgKi9cbiAgZmlyc3QoKTogVCB8IG51bGwge1xuICAgIC8vIFRlbXBvcmFyaWx5IHNldCBsaW1pdCB0byAxIGJ1dCBwcmVzZXJ2ZSBwcmV2aW91cyB2YWx1ZVxuICAgIGNvbnN0IHByZXZMaW1pdCA9IHRoaXMubGltaXRWYWx1ZTtcbiAgICB0aGlzLmxpbWl0VmFsdWUgPSAxO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0KCk7XG4gICAgdGhpcy5saW1pdFZhbHVlID0gcHJldkxpbWl0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIENPVU5UIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBtYXRjaGluZyByb3dzLlxuICAgKiBGb3IgcmVnZXggY29uZGl0aW9ucywgdGhpcyBmZXRjaGVzIGFsbCByb3dzIGFuZCBjb3VudHMgY2xpZW50LXNpZGUuXG4gICAqXG4gICAqIEByZXR1cm5zIE51bWJlciBvZiBtYXRjaGluZyByb3dzXG4gICAqL1xuICBjb3VudCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSkge1xuICAgICAgLy8gU2FmZSB0byBkbyBDT1VOVCgqKSBpbiBTUUxcbiAgICAgIGNvbnN0IFtiYXNlUXVlcnksIHBhcmFtc10gPSB0aGlzLmJ1aWxkU2VsZWN0UXVlcnkodHJ1ZSk7XG4gICAgICBjb25zdCBjb3VudFF1ZXJ5ID0gYmFzZVF1ZXJ5LnJlcGxhY2UoXG4gICAgICAgIC9TRUxFQ1QgKC4rPykgRlJPTS9pLFxuICAgICAgICBcIlNFTEVDVCBDT1VOVCgqKSBBUyBfX2NvdW50IEZST01cIixcbiAgICAgICk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKClcbiAgICAgICAgLnByZXBhcmUoY291bnRRdWVyeSlcbiAgICAgICAgLmdldCguLi5wYXJhbXMpIGFzIHtcbiAgICAgICAgX19jb3VudDogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZXN1bHQ/Ll9fY291bnQgPz8gMDtcbiAgICB9XG5cbiAgICAvLyBIYXMgcmVnZXggY29uZGl0aW9ucywgY291bnQgY2xpZW50LXNpZGVcbiAgICByZXR1cm4gdGhpcy5hbGwoKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IHJvd3MgbWF0Y2ggdGhlIGN1cnJlbnQgY29uZGl0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgcm93IG1hdGNoZXMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgZXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSkge1xuICAgICAgLy8gVXNlIEVYSVNUUyBmb3IgZWZmaWNpZW5jeVxuICAgICAgY29uc3QgW2Jhc2VRdWVyeSwgcGFyYW1zXSA9IHRoaXMuYnVpbGRTZWxlY3RRdWVyeSh0cnVlKTtcbiAgICAgIGNvbnN0IGV4aXN0c1F1ZXJ5ID0gYFNFTEVDVCBFWElTVFMoJHtiYXNlUXVlcnl9KSBBUyBfX2V4aXN0c2A7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKClcbiAgICAgICAgLnByZXBhcmUoZXhpc3RzUXVlcnkpXG4gICAgICAgIC5nZXQoLi4ucGFyYW1zKSBhcyB7XG4gICAgICAgIF9fZXhpc3RzOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIEJvb2xlYW4ocmVzdWx0Py5fX2V4aXN0cyk7XG4gICAgfVxuXG4gICAgLy8gSGFzIHJlZ2V4IGNvbmRpdGlvbnMsIGNoZWNrIGNsaWVudC1zaWRlXG4gICAgcmV0dXJuIHRoaXMuY291bnQoKSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiBhIHNpbmdsZSBjb2x1bW4gdmFsdWUgZnJvbSB0aGUgZmlyc3Qgcm93LlxuICAgKiBVc2VmdWwgZm9yIGdldHRpbmcgYSBzcGVjaWZpYyBmaWVsZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb21cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uIGZyb20gdGhlIGZpcnN0IHJvdywgb3IgbnVsbFxuICAgKi9cbiAgdmFsdWU8SyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogSyk6IFRbS10gfCBudWxsIHtcbiAgICBjb25zdCByb3cgPSB0aGlzLmZpcnN0KCk7XG4gICAgcmV0dXJuIHJvdyA/IHJvd1tjb2x1bW5dIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBxdWVyeSBhbmQgcmV0dXJuIGFuIGFycmF5IG9mIHZhbHVlcyBmcm9tIGEgc2luZ2xlIGNvbHVtbi5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtbiAtIENvbHVtbiBuYW1lIHRvIGV4dHJhY3QgdmFsdWVzIGZyb21cbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsdWVzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW5cbiAgICovXG4gIHBsdWNrPEsgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEspOiBUW0tdW10ge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmFsbCgpO1xuICAgIHJldHVybiByb3dzLm1hcCgocm93KSA9PiByb3dbY29sdW1uXSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBJbnNlcnRSZXN1bHQsIEluc2VydE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFdoZXJlUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vd2hlcmVcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgSU5TRVJUIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIFF1ZXJ5QnVpbGRlci5cbiAqIEhhbmRsZXMgc2luZ2xlIGFuZCBidWxrIGluc2VydCBvcGVyYXRpb25zIHdpdGggY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFF1ZXJ5QnVpbGRlcjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IGV4dGVuZHMgV2hlcmVRdWVyeUJ1aWxkZXI8VD4ge1xuICAvKipcbiAgICogSW5zZXJ0IGEgc2luZ2xlIHJvdyBvciBtdWx0aXBsZSByb3dzIGludG8gdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBJbnNlcnQgb3B0aW9ucyAoT1IgSUdOT1JFLCBPUiBSRVBMQUNFLCBldGMuKVxuICAgKiBAcmV0dXJucyBJbnNlcnQgcmVzdWx0IHdpdGggaW5zZXJ0SWQgYW5kIGNoYW5nZXMgY291bnRcbiAgICovXG4gIGluc2VydChcbiAgICBkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPcHRpb25zLFxuICApOiBJbnNlcnRSZXN1bHQge1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcblxuICAgIC8vIFRyYW5zZm9ybSByb3dzIHRvIGhhbmRsZSBKU09OIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCB0cmFuc2Zvcm1lZFJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB0aGlzLnRyYW5zZm9ybVJvd1RvRGIocm93KSk7XG5cbiAgICBpZiAodHJhbnNmb3JtZWRSb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0OiBkYXRhIGNhbm5vdCBiZSBlbXB0eVwiKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgYWxsIHVuaXF1ZSBjb2x1bW5zIGZyb20gYWxsIHJvd3NcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCByb3cgb2YgdHJhbnNmb3JtZWRSb3dzKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgIGFsbENvbHVtbnMuYWRkKGNvbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IEFycmF5LmZyb20oYWxsQ29sdW1ucyk7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnQ6IG5vIGNvbHVtbnMgdG8gaW5zZXJ0XCIpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIElOU0VSVCBzdGF0ZW1lbnQgd2l0aCBjb25mbGljdCByZXNvbHV0aW9uXG4gICAgbGV0IGluc2VydFR5cGUgPSBcIklOU0VSVFwiO1xuICAgIGlmIChvcHRpb25zPy5vcklnbm9yZSkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIElHTk9SRVwiO1xuICAgIGVsc2UgaWYgKG9wdGlvbnM/Lm9yUmVwbGFjZSkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIFJFUExBQ0VcIjtcbiAgICBlbHNlIGlmIChvcHRpb25zPy5vckFib3J0KSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgQUJPUlRcIjtcbiAgICBlbHNlIGlmIChvcHRpb25zPy5vckZhaWwpIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBGQUlMXCI7XG4gICAgZWxzZSBpZiAob3B0aW9ucz8ub3JSb2xsYmFjaykgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIFJPTExCQUNLXCI7XG5cbiAgICBjb25zdCBxdW90ZWRDb2x1bW5zID0gY29sdW1uc1xuICAgICAgLm1hcCgoY29sKSA9PiB0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICBjb25zdCBwbGFjZWhvbGRlcnMgPSBjb2x1bW5zLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpO1xuXG4gICAgY29uc3QgcXVlcnkgPSBgJHtpbnNlcnRUeXBlfSBJTlRPICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9ICgke3F1b3RlZENvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSlgO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZShxdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBsZXQgbGFzdEluc2VydElkID0gMDtcblxuICAgIC8vIEV4ZWN1dGUgZm9yIGVhY2ggcm93XG4gICAgZm9yIChjb25zdCByb3cgb2YgdHJhbnNmb3JtZWRSb3dzKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBjb2x1bW5zLm1hcCgoY29sKSA9PiByb3dbY29sIGFzIGtleW9mIHR5cGVvZiByb3ddID8/IG51bGwpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RtdC5ydW4oLi4udmFsdWVzKTtcbiAgICAgIHRvdGFsQ2hhbmdlcyArPSByZXN1bHQuY2hhbmdlcztcbiAgICAgIGlmIChyZXN1bHQubGFzdEluc2VydFJvd2lkKSB7XG4gICAgICAgIGxhc3RJbnNlcnRJZCA9IE51bWJlcihyZXN1bHQubGFzdEluc2VydFJvd2lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0SWQ6IGxhc3RJbnNlcnRJZCxcbiAgICAgIGNoYW5nZXM6IHRvdGFsQ2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIElHTk9SRSBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZXF1aXZhbGVudCB0byBpbnNlcnQoZGF0YSwgeyBvcklnbm9yZTogdHJ1ZSB9KVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPcklnbm9yZShkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoZGF0YSwgeyBvcklnbm9yZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBSRVBMQUNFIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCBlcXVpdmFsZW50IHRvIGluc2VydChkYXRhLCB7IG9yUmVwbGFjZTogdHJ1ZSB9KVxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPclJlcGxhY2UoZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0KGRhdGEsIHsgb3JSZXBsYWNlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIEFCT1JUIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYnV0IHByb3ZpZGVkIGZvciBleHBsaWNpdCB1c2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaW5nbGUgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm5zIEluc2VydCByZXN1bHQgd2l0aCBpbnNlcnRJZCBhbmQgY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5zZXJ0T3JBYm9ydChkYXRhOiBQYXJ0aWFsPFQ+IHwgUGFydGlhbDxUPltdKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnQoZGF0YSwgeyBvckFib3J0OiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIEZBSUwgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBTaW5nbGUgb2JqZWN0IG9yIGFycmF5IG9mIG9iamVjdHMgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm5zIEluc2VydCByZXN1bHQgd2l0aCBpbnNlcnRJZCBhbmQgY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5zZXJ0T3JGYWlsKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydChkYXRhLCB7IG9yRmFpbDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBST0xMQkFDSyBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3Qgb3IgYXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHJldHVybnMgSW5zZXJ0IHJlc3VsdCB3aXRoIGluc2VydElkIGFuZCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBpbnNlcnRPclJvbGxiYWNrKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydChkYXRhLCB7IG9yUm9sbGJhY2s6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGFuZCBnZXQgdGhlIGluc2VydGVkIHJvdyBiYWNrLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZSB0aGUgcm93IHdpdGggYXV0by1nZW5lcmF0ZWQgZmllbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFNpbmdsZSBvYmplY3QgdG8gaW5zZXJ0IChidWxrIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgbWV0aG9kKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEluc2VydCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFRoZSBpbnNlcnRlZCByb3cgd2l0aCBhbGwgZmllbGRzLCBvciBudWxsIGlmIGluc2VydGlvbiBmYWlsZWRcbiAgICovXG4gIGluc2VydEFuZEdldChkYXRhOiBQYXJ0aWFsPFQ+LCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IFQgfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmluc2VydChkYXRhLCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQuY2hhbmdlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnNlcnRJZCwgdHJ5IHRvIGZldGNoIHRoZSBpbnNlcnRlZCByb3dcbiAgICBpZiAocmVzdWx0Lmluc2VydElkID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5nZXREYigpXG4gICAgICAgICAgLnByZXBhcmUoXG4gICAgICAgICAgICBgU0VMRUNUICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBXSEVSRSByb3dpZCA9ID9gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZ2V0KHJlc3VsdC5pbnNlcnRJZCkgYXMgVCB8IG51bGw7XG4gICAgICAgIHJldHVybiByb3cgPyB0aGlzLnRyYW5zZm9ybVJvd0Zyb21EYihyb3cpIDogbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZiBmZXRjaGluZyBieSByb3dpZCBmYWlscywgcmV0dXJuIG51bGxcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggaW5zZXJ0IHdpdGggdHJhbnNhY3Rpb24gc3VwcG9ydC5cbiAgICogVGhpcyBtZXRob2Qgd3JhcHMgbXVsdGlwbGUgaW5zZXJ0cyBpbiBhIHRyYW5zYWN0aW9uIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICogYW5kIGF0b21pY2l0eSB3aGVuIGluc2VydGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSByb3dzIC0gQXJyYXkgb2Ygb2JqZWN0cyB0byBpbnNlcnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBJbnNlcnQgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBJbnNlcnQgcmVzdWx0IHdpdGggdG90YWwgY2hhbmdlc1xuICAgKi9cbiAgaW5zZXJ0QmF0Y2gocm93czogUGFydGlhbDxUPltdLCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IEluc2VydFJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd3MpIHx8IHJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnNlcnRCYXRjaDogcm93cyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREYigpO1xuXG4gICAgLy8gVXNlIGEgdHJhbnNhY3Rpb24gZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKChyb3dzVG9JbnNlcnQ6IFBhcnRpYWw8VD5bXSkgPT4ge1xuICAgICAgbGV0IHRvdGFsQ2hhbmdlcyA9IDA7XG4gICAgICBsZXQgbGFzdEluc2VydElkID0gMDtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJvd3MgdG8gaGFuZGxlIEpTT04gc2VyaWFsaXphdGlvblxuICAgICAgY29uc3QgdHJhbnNmb3JtZWRSb3dzID0gcm93c1RvSW5zZXJ0Lm1hcCgocm93KSA9PlxuICAgICAgICB0aGlzLnRyYW5zZm9ybVJvd1RvRGIocm93KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEdldCBhbGwgdW5pcXVlIGNvbHVtbnMgZnJvbSBhbGwgcm93c1xuICAgICAgY29uc3QgYWxsQ29sdW1ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgdHJhbnNmb3JtZWRSb3dzKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICBhbGxDb2x1bW5zLmFkZChjb2wpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBBcnJheS5mcm9tKGFsbENvbHVtbnMpO1xuICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImluc2VydEJhdGNoOiBubyBjb2x1bW5zIHRvIGluc2VydFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gQnVpbGQgSU5TRVJUIHN0YXRlbWVudCB3aXRoIGNvbmZsaWN0IHJlc29sdXRpb25cbiAgICAgIGxldCBpbnNlcnRUeXBlID0gXCJJTlNFUlRcIjtcbiAgICAgIGlmIChvcHRpb25zPy5vcklnbm9yZSkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIElHTk9SRVwiO1xuICAgICAgZWxzZSBpZiAob3B0aW9ucz8ub3JSZXBsYWNlKSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgUkVQTEFDRVwiO1xuICAgICAgZWxzZSBpZiAob3B0aW9ucz8ub3JBYm9ydCkgaW5zZXJ0VHlwZSA9IFwiSU5TRVJUIE9SIEFCT1JUXCI7XG4gICAgICBlbHNlIGlmIChvcHRpb25zPy5vckZhaWwpIGluc2VydFR5cGUgPSBcIklOU0VSVCBPUiBGQUlMXCI7XG4gICAgICBlbHNlIGlmIChvcHRpb25zPy5vclJvbGxiYWNrKSBpbnNlcnRUeXBlID0gXCJJTlNFUlQgT1IgUk9MTEJBQ0tcIjtcblxuICAgICAgY29uc3QgcXVvdGVkQ29sdW1ucyA9IGNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sKSA9PiB0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpKVxuICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gY29sdW1ucy5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKTtcblxuICAgICAgY29uc3QgcXVlcnkgPSBgJHtpbnNlcnRUeXBlfSBJTlRPICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9ICgke3F1b3RlZENvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSlgO1xuICAgICAgY29uc3Qgc3RtdCA9IGRiLnByZXBhcmUocXVlcnkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0cmFuc2Zvcm1lZFJvd3MpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoXG4gICAgICAgICAgKGNvbCkgPT4gcm93W2NvbCBhcyBrZXlvZiB0eXBlb2Ygcm93XSA/PyBudWxsLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBzdG10LnJ1biguLi52YWx1ZXMpO1xuICAgICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgICAgIGlmIChyZXN1bHQubGFzdEluc2VydFJvd2lkKSB7XG4gICAgICAgICAgbGFzdEluc2VydElkID0gTnVtYmVyKHJlc3VsdC5sYXN0SW5zZXJ0Um93aWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGluc2VydElkOiBsYXN0SW5zZXJ0SWQsIGNoYW5nZXM6IHRvdGFsQ2hhbmdlcyB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uKHJvd3MpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXBkYXRlUmVzdWx0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9zZWxlY3RcIjtcblxuLyoqXG4gKiBNaXhpbiBjbGFzcyB0aGF0IGFkZHMgVVBEQVRFIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIFF1ZXJ5QnVpbGRlci5cbiAqIEhhbmRsZXMgc2FmZSB1cGRhdGUgb3BlcmF0aW9ucyB3aXRoIG1hbmRhdG9yeSBXSEVSRSBjb25kaXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVXBkYXRlUXVlcnlCdWlsZGVyPFxuICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pixcbj4gZXh0ZW5kcyBTZWxlY3RRdWVyeUJ1aWxkZXI8VD4ge1xuICAvKipcbiAgICogVXBkYXRlIHJvd3MgbWF0Y2hpbmcgdGhlIFdIRVJFIGNvbmRpdGlvbnMgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAgICogUmVxdWlyZXMgYXQgbGVhc3Qgb25lIFdIRVJFIGNvbmRpdGlvbiB0byBwcmV2ZW50IGFjY2lkZW50YWwgZnVsbCB0YWJsZSB1cGRhdGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIE9iamVjdCB3aXRoIGNvbHVtbnMgdG8gdXBkYXRlIGFuZCB0aGVpciBuZXcgdmFsdWVzXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB1cGRhdGUoZGF0YTogUGFydGlhbDxUPik6IFVwZGF0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJVUERBVEVcIik7XG5cbiAgICAvLyBUcmFuc2Zvcm0gZGF0YSB0byBoYW5kbGUgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdGhpcy50cmFuc2Zvcm1Sb3dUb0RiKGRhdGEpO1xuICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyh0cmFuc2Zvcm1lZERhdGEpO1xuICAgIGlmICh1cGRhdGVDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXBkYXRlOiBubyBjb2x1bW5zIHRvIHVwZGF0ZVwiKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcmVnZXggY29uZGl0aW9ucyBieSBmaXJzdCBmZXRjaGluZyBtYXRjaGluZyByb3dzXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVdpdGhSZWdleENvbmRpdGlvbnModHJhbnNmb3JtZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBVUERBVEUgc3RhdGVtZW50XG4gICAgY29uc3Qgc2V0Q2xhdXNlID0gdXBkYXRlQ29sdW1uc1xuICAgICAgLm1hcCgoY29sKSA9PiBgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpfSA9ID9gKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IFt3aGVyZUNsYXVzZSwgd2hlcmVQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgcXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3NldENsYXVzZX0ke3doZXJlQ2xhdXNlfWA7XG5cbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSB1cGRhdGVDb2x1bW5zLm1hcCgoY29sKSA9PiB0cmFuc2Zvcm1lZERhdGFbY29sXSk7XG4gICAgY29uc3QgYWxsUGFyYW1zID0gWy4uLnVwZGF0ZVZhbHVlcywgLi4ud2hlcmVQYXJhbXNdO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4uYWxsUGFyYW1zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBVUERBVEUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqIFRoaXMgcmVxdWlyZXMgY2xpZW50LXNpZGUgZmlsdGVyaW5nIGFuZCBpbmRpdmlkdWFsIHJvdyB1cGRhdGVzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVXaXRoUmVnZXhDb25kaXRpb25zKFxuICAgIHRyYW5zZm9ybWVkRGF0YTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogVXBkYXRlUmVzdWx0IHtcbiAgICAvLyBGaXJzdCwgZ2V0IGFsbCByb3dzIG1hdGNoaW5nIFNRTCBjb25kaXRpb25zICh3aXRob3V0IHJlZ2V4KVxuICAgIGNvbnN0IFtzZWxlY3RRdWVyeSwgc2VsZWN0UGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJvd3MgPSB0aGlzLmdldERiKClcbiAgICAgIC5wcmVwYXJlKFxuICAgICAgICBgU0VMRUNUIHJvd2lkLCAqIEZST00gJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0ke3NlbGVjdFF1ZXJ5fWAsXG4gICAgICApXG4gICAgICAuYWxsKC4uLnNlbGVjdFBhcmFtcykgYXMgKFQgJiB7IHJvd2lkOiBudW1iZXIgfSlbXTtcblxuICAgIC8vIEFwcGx5IHJlZ2V4IGZpbHRlcmluZ1xuICAgIGNvbnN0IG1hdGNoaW5nUm93cyA9IHRoaXMuYXBwbHlSZWdleEZpbHRlcmluZyhjYW5kaWRhdGVSb3dzKTtcblxuICAgIGlmIChtYXRjaGluZ1Jvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4geyBjaGFuZ2VzOiAwIH07XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGVhY2ggbWF0Y2hpbmcgcm93IGJ5IHJvd2lkXG4gICAgY29uc3QgdXBkYXRlQ29sdW1ucyA9IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVkRGF0YSk7XG4gICAgY29uc3Qgc2V0Q2xhdXNlID0gdXBkYXRlQ29sdW1uc1xuICAgICAgLm1hcCgoY29sKSA9PiBgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihjb2wpfSA9ID9gKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gYFVQREFURSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBTRVQgJHtzZXRDbGF1c2V9IFdIRVJFIHJvd2lkID0gP2A7XG4gICAgY29uc3Qgc3RtdCA9IHRoaXMuZ2V0RGIoKS5wcmVwYXJlKHVwZGF0ZVF1ZXJ5KTtcblxuICAgIGxldCB0b3RhbENoYW5nZXMgPSAwO1xuICAgIGNvbnN0IHVwZGF0ZVZhbHVlcyA9IHVwZGF0ZUNvbHVtbnMubWFwKChjb2wpID0+IHRyYW5zZm9ybWVkRGF0YVtjb2xdKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIG1hdGNoaW5nUm93cykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc3RtdC5ydW4oLi4udXBkYXRlVmFsdWVzLCByb3cucm93aWQpO1xuICAgICAgdG90YWxDaGFuZ2VzICs9IHJlc3VsdC5jaGFuZ2VzO1xuICAgIH1cblxuICAgIHJldHVybiB7IGNoYW5nZXM6IHRvdGFsQ2hhbmdlcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBvciBpbnNlcnQgKHVwc2VydCkgZnVuY3Rpb25hbGl0eSB1c2luZyBJTlNFUlQgT1IgUkVQTEFDRS5cbiAgICogVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gdXBkYXRlIGV4aXN0aW5nIHJvd3MsIGFuZCBpbnNlcnRzIG5ldyBvbmVzIGlmIHRoZXkgZG9uJ3QgZXhpc3QuXG4gICAqIFJlcXVpcmVzIGEgdW5pcXVlIGNvbnN0cmFpbnQgb3IgcHJpbWFyeSBrZXkgdG8gd29yayBwcm9wZXJseS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBPYmplY3Qgd2l0aCBjb2x1bW5zIHRvIHVwc2VydFxuICAgKiBAcmV0dXJucyBVcGRhdGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgdXBzZXJ0KGRhdGE6IFBhcnRpYWw8VD4pOiBVcGRhdGVSZXN1bHQge1xuICAgIC8vIFRyYW5zZm9ybSBkYXRhIHRvIGhhbmRsZSBKU09OIHNlcmlhbGl6YXRpb25cbiAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0aGlzLnRyYW5zZm9ybVJvd1RvRGIoZGF0YSk7XG4gICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVkRGF0YSk7XG4gICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1cHNlcnQ6IG5vIGNvbHVtbnMgdG8gdXBzZXJ0XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1b3RlZENvbHVtbnMgPSBjb2x1bW5zXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMucXVvdGVJZGVudGlmaWVyKGNvbCkpXG4gICAgICAuam9pbihcIiwgXCIpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGNvbHVtbnMubWFwKCgpID0+IFwiP1wiKS5qb2luKFwiLCBcIik7XG5cbiAgICBjb25zdCBxdWVyeSA9IGBJTlNFUlQgT1IgUkVQTEFDRSBJTlRPICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9ICgke3F1b3RlZENvbHVtbnN9KSBWQUxVRVMgKCR7cGxhY2Vob2xkZXJzfSlgO1xuXG4gICAgY29uc3QgdmFsdWVzID0gY29sdW1ucy5tYXAoKGNvbCkgPT4gdHJhbnNmb3JtZWREYXRhW2NvbF0gPz8gbnVsbCk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4udmFsdWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCBhIG51bWVyaWMgY29sdW1uIGJ5IGEgc3BlY2lmaWVkIGFtb3VudC5cbiAgICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGZldGNoaW5nLCBjYWxjdWxhdGluZywgYW5kIHVwZGF0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uIC0gQ29sdW1uIG5hbWUgdG8gaW5jcmVtZW50XG4gICAqIEBwYXJhbSBhbW91bnQgLSBBbW91bnQgdG8gaW5jcmVtZW50IGJ5IChkZWZhdWx0cyB0byAxKVxuICAgKiBAcmV0dXJucyBVcGRhdGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgaW5jcmVtZW50KGNvbHVtbjoga2V5b2YgVCwgYW1vdW50ID0gMSk6IFVwZGF0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJJTkNSRU1FTlRcIik7XG5cbiAgICBjb25zdCBbd2hlcmVDbGF1c2UsIHdoZXJlUGFyYW1zXSA9IHRoaXMuYnVpbGRXaGVyZUNsYXVzZSgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYFVQREFURSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBTRVQgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihTdHJpbmcoY29sdW1uKSl9ID0gJHt0aGlzLnF1b3RlSWRlbnRpZmllcihTdHJpbmcoY29sdW1uKSl9ICsgPyR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKGFtb3VudCwgLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGEgbnVtZXJpYyBjb2x1bW4gYnkgYSBzcGVjaWZpZWQgYW1vdW50LlxuICAgKiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gZmV0Y2hpbmcsIGNhbGN1bGF0aW5nLCBhbmQgdXBkYXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW4gLSBDb2x1bW4gbmFtZSB0byBkZWNyZW1lbnRcbiAgICogQHBhcmFtIGFtb3VudCAtIEFtb3VudCB0byBkZWNyZW1lbnQgYnkgKGRlZmF1bHRzIHRvIDEpXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBkZWNyZW1lbnQoY29sdW1uOiBrZXlvZiBULCBhbW91bnQgPSAxKTogVXBkYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY29sdW1uLCAtYW1vdW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYW5kIGdldCB0aGUgdXBkYXRlZCByb3dzIGJhY2suXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VlIHRoZSByb3dzIGFmdGVyIHRoZSB1cGRhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IHdpdGggY29sdW1ucyB0byB1cGRhdGUgYW5kIHRoZWlyIG5ldyB2YWx1ZXNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdXBkYXRlZCByb3dzXG4gICAqL1xuICB1cGRhdGVBbmRHZXQoZGF0YTogUGFydGlhbDxUPik6IFRbXSB7XG4gICAgLy8gRmlyc3QsIGdldCB0aGUgcm93cyB0aGF0IHdpbGwgYmUgdXBkYXRlZFxuICAgIGNvbnN0IHJvd3NUb1VwZGF0ZSA9IHRoaXMuYWxsKCk7XG5cbiAgICAvLyBQZXJmb3JtIHRoZSB1cGRhdGVcbiAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSB0aGlzLnVwZGF0ZShkYXRhKTtcblxuICAgIGlmICh1cGRhdGVSZXN1bHQuY2hhbmdlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEZvciBzaW1wbGljaXR5LCByZXR1cm4gdGhlIG9yaWdpbmFsbHkgbWF0Y2hlZCByb3dzXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3UgbWlnaHQgd2FudCB0byByZS1mZXRjaCB0aGUgdXBkYXRlZCByb3dzXG4gICAgcmV0dXJuIHJvd3NUb1VwZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCB1cGRhdGUgbXVsdGlwbGUgcm93cyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBpbmRpdmlkdWFsIHVwZGF0ZXMgd2hlbiB1cGRhdGluZyBtYW55IHJvd3MuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gQXJyYXkgb2Ygb2JqZWN0cywgZWFjaCBjb250YWluaW5nIHVwZGF0ZSBkYXRhIGFuZCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFVwZGF0ZSByZXN1bHQgd2l0aCB0b3RhbCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB1cGRhdGVCYXRjaChcbiAgICB1cGRhdGVzOiBBcnJheTx7IHdoZXJlOiBQYXJ0aWFsPFQ+OyBkYXRhOiBQYXJ0aWFsPFQ+IH0+LFxuICApOiBVcGRhdGVSZXN1bHQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1cGRhdGVzKSB8fCB1cGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidXBkYXRlQmF0Y2g6IHVwZGF0ZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0RGIoKTtcblxuICAgIC8vIFVzZSBhIHRyYW5zYWN0aW9uIGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihcbiAgICAgICh1cGRhdGVzVG9Qcm9jZXNzOiBBcnJheTx7IHdoZXJlOiBQYXJ0aWFsPFQ+OyBkYXRhOiBQYXJ0aWFsPFQ+IH0+KSA9PiB7XG4gICAgICAgIGxldCB0b3RhbENoYW5nZXMgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3QgeyB3aGVyZTogd2hlcmVEYXRhLCBkYXRhIH0gb2YgdXBkYXRlc1RvUHJvY2Vzcykge1xuICAgICAgICAgIC8vIFRyYW5zZm9ybSBkYXRhIHRvIGhhbmRsZSBKU09OIHNlcmlhbGl6YXRpb25cbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFVwZGF0ZURhdGEgPSB0aGlzLnRyYW5zZm9ybVJvd1RvRGIoZGF0YSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlQ29sdW1ucyA9IE9iamVjdC5rZXlzKHRyYW5zZm9ybWVkVXBkYXRlRGF0YSk7XG4gICAgICAgICAgaWYgKHVwZGF0ZUNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBlbXB0eSB1cGRhdGVzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQnVpbGQgV0hFUkUgY29uZGl0aW9ucyBmb3IgdGhpcyB1cGRhdGVcbiAgICAgICAgICBjb25zdCB3aGVyZUNvbmRpdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3Qgd2hlcmVQYXJhbXM6IGFueVtdID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh3aGVyZURhdGEpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbnMucHVzaChgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihjb2x1bW4pfSBJUyBOVUxMYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB3aGVyZUNvbmRpdGlvbnMucHVzaChgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihjb2x1bW4pfSA9ID9gKTtcbiAgICAgICAgICAgICAgd2hlcmVQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHdoZXJlQ29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJ1cGRhdGVCYXRjaDogZWFjaCB1cGRhdGUgbXVzdCBoYXZlIFdIRVJFIGNvbmRpdGlvbnNcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQnVpbGQgVVBEQVRFIHN0YXRlbWVudFxuICAgICAgICAgIGNvbnN0IHNldENsYXVzZSA9IHVwZGF0ZUNvbHVtbnNcbiAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYCR7dGhpcy5xdW90ZUlkZW50aWZpZXIoY29sKX0gPSA/YClcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgICBjb25zdCB3aGVyZUNsYXVzZSA9IGAgV0hFUkUgJHt3aGVyZUNvbmRpdGlvbnMuam9pbihcIiBBTkQgXCIpfWA7XG4gICAgICAgICAgY29uc3QgcXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3NldENsYXVzZX0ke3doZXJlQ2xhdXNlfWA7XG5cbiAgICAgICAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSB1cGRhdGVDb2x1bW5zLm1hcChcbiAgICAgICAgICAgIChjb2wpID0+IHRyYW5zZm9ybWVkVXBkYXRlRGF0YVtjb2xdID8/IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBhbGxQYXJhbXMgPSBbLi4udXBkYXRlVmFsdWVzLCAuLi53aGVyZVBhcmFtc107XG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYi5wcmVwYXJlKHF1ZXJ5KS5ydW4oLi4uYWxsUGFyYW1zKTtcbiAgICAgICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB0cmFuc2FjdGlvbih1cGRhdGVzKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IERlbGV0ZVJlc3VsdCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vc2VsZWN0XCI7XG5cbi8qKlxuICogTWl4aW4gY2xhc3MgdGhhdCBhZGRzIERFTEVURSBmdW5jdGlvbmFsaXR5IHRvIHRoZSBRdWVyeUJ1aWxkZXIuXG4gKiBIYW5kbGVzIHNhZmUgZGVsZXRlIG9wZXJhdGlvbnMgd2l0aCBtYW5kYXRvcnkgV0hFUkUgY29uZGl0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlbGV0ZVF1ZXJ5QnVpbGRlcjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4+IGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFQ+IHtcbiAgLyoqXG4gICAqIERlbGV0ZSByb3dzIG1hdGNoaW5nIHRoZSBXSEVSRSBjb25kaXRpb25zLlxuICAgKiBSZXF1aXJlcyBhdCBsZWFzdCBvbmUgV0hFUkUgY29uZGl0aW9uIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBmdWxsIHRhYmxlIGRlbGV0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZWxldGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgZGVsZXRlKCk6IERlbGV0ZVJlc3VsdCB7XG4gICAgdGhpcy5yZXF1aXJlV2hlcmVDbGF1c2UoXCJERUxFVEVcIik7XG5cbiAgICAvLyBIYW5kbGUgcmVnZXggY29uZGl0aW9ucyBieSBmaXJzdCBmZXRjaGluZyBtYXRjaGluZyByb3dzXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVdpdGhSZWdleENvbmRpdGlvbnMoKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBERUxFVEUgc3RhdGVtZW50XG4gICAgY29uc3QgW3doZXJlQ2xhdXNlLCB3aGVyZVBhcmFtc10gPSB0aGlzLmJ1aWxkV2hlcmVDbGF1c2UoKTtcbiAgICBjb25zdCBxdWVyeSA9IGBERUxFVEUgRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKC4uLndoZXJlUGFyYW1zKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGFuZ2VzOiByZXN1bHQuY2hhbmdlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBERUxFVEUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqIFRoaXMgcmVxdWlyZXMgY2xpZW50LXNpZGUgZmlsdGVyaW5nIGFuZCBpbmRpdmlkdWFsIHJvdyBkZWxldGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGVsZXRlV2l0aFJlZ2V4Q29uZGl0aW9ucygpOiBEZWxldGVSZXN1bHQge1xuICAgIC8vIEZpcnN0LCBnZXQgYWxsIHJvd3MgbWF0Y2hpbmcgU1FMIGNvbmRpdGlvbnMgKHdpdGhvdXQgcmVnZXgpXG4gICAgY29uc3QgW3NlbGVjdFF1ZXJ5LCBzZWxlY3RQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlUm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgIGBTRUxFQ1Qgcm93aWQsICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7c2VsZWN0UXVlcnl9YCxcbiAgICAgIClcbiAgICAgIC5hbGwoLi4uc2VsZWN0UGFyYW1zKSBhcyAoVCAmIHsgcm93aWQ6IG51bWJlciB9KVtdO1xuXG4gICAgLy8gQXBwbHkgcmVnZXggZmlsdGVyaW5nXG4gICAgY29uc3QgbWF0Y2hpbmdSb3dzID0gdGhpcy5hcHBseVJlZ2V4RmlsdGVyaW5nKGNhbmRpZGF0ZVJvd3MpO1xuXG4gICAgaWYgKG1hdGNoaW5nUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNoYW5nZXM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgZWFjaCBtYXRjaGluZyByb3cgYnkgcm93aWRcbiAgICBjb25zdCBkZWxldGVRdWVyeSA9IGBERUxFVEUgRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBXSEVSRSByb3dpZCA9ID9gO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZShkZWxldGVRdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBtYXRjaGluZ1Jvd3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0bXQucnVuKHJvdy5yb3dpZCk7XG4gICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2hhbmdlczogdG90YWxDaGFuZ2VzIH07XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGFuZCBnZXQgdGhlIGRlbGV0ZWQgcm93cyBiYWNrLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZSB3aGF0IHdhcyBkZWxldGVkIGZvciBsb2dnaW5nIG9yIGF1ZGl0IHB1cnBvc2VzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWxldGVkIHJvd3NcbiAgICovXG4gIGRlbGV0ZUFuZEdldCgpOiBUW10ge1xuICAgIC8vIEZpcnN0LCBnZXQgdGhlIHJvd3MgdGhhdCB3aWxsIGJlIGRlbGV0ZWRcbiAgICBjb25zdCByb3dzVG9EZWxldGUgPSB0aGlzLmFsbCgpO1xuXG4gICAgLy8gUGVyZm9ybSB0aGUgZGVsZXRlXG4gICAgY29uc3QgZGVsZXRlUmVzdWx0ID0gdGhpcy5kZWxldGUoKTtcblxuICAgIGlmIChkZWxldGVSZXN1bHQuY2hhbmdlcyA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgcm93cyB0aGF0IHdlcmUgZGVsZXRlZFxuICAgIHJldHVybiByb3dzVG9EZWxldGU7XG4gIH1cblxuICAvKipcbiAgICogU29mdCBkZWxldGUgLSBtYXJrIHJvd3MgYXMgZGVsZXRlZCBpbnN0ZWFkIG9mIHBoeXNpY2FsbHkgcmVtb3ZpbmcgdGhlbS5cbiAgICogVGhpcyByZXF1aXJlcyBhICdkZWxldGVkX2F0JyBvciBzaW1pbGFyIGNvbHVtbiBpbiB5b3VyIHRhYmxlIHNjaGVtYS5cbiAgICpcbiAgICogQHBhcmFtIGRlbGV0ZWRDb2x1bW4gLSBDb2x1bW4gbmFtZSB0byBtYXJrIGFzIGRlbGV0ZWQgKGRlZmF1bHRzIHRvICdkZWxldGVkX2F0JylcbiAgICogQHBhcmFtIGRlbGV0ZWRWYWx1ZSAtIFZhbHVlIHRvIHNldCBmb3IgdGhlIGRlbGV0ZWQgbWFya2VyIChkZWZhdWx0cyB0byBjdXJyZW50IHRpbWVzdGFtcClcbiAgICogQHJldHVybnMgVXBkYXRlIHJlc3VsdCB3aXRoIGNoYW5nZXMgY291bnRcbiAgICovXG4gIHNvZnREZWxldGUoXG4gICAgZGVsZXRlZENvbHVtbjoga2V5b2YgVCA9IFwiZGVsZXRlZF9hdFwiIGFzIGtleW9mIFQsXG4gICAgZGVsZXRlZFZhbHVlOiBhbnkgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSxcbiAgKTogRGVsZXRlUmVzdWx0IHtcbiAgICB0aGlzLnJlcXVpcmVXaGVyZUNsYXVzZShcIlNPRlQgREVMRVRFXCIpO1xuXG4gICAgLy8gSGFuZGxlIHJlZ2V4IGNvbmRpdGlvbnNcbiAgICBpZiAodGhpcy5oYXNSZWdleENvbmRpdGlvbnMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc29mdERlbGV0ZVdpdGhSZWdleENvbmRpdGlvbnMoZGVsZXRlZENvbHVtbiwgZGVsZXRlZFZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBVUERBVEUgc3RhdGVtZW50IHRvIG1hcmsgYXMgZGVsZXRlZFxuICAgIGNvbnN0IFt3aGVyZUNsYXVzZSwgd2hlcmVQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgcXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3RoaXMucXVvdGVJZGVudGlmaWVyKFN0cmluZyhkZWxldGVkQ29sdW1uKSl9ID0gPyR7d2hlcmVDbGF1c2V9YDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUocXVlcnkpXG4gICAgICAucnVuKGRlbGV0ZWRWYWx1ZSwgLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNvZnQgZGVsZXRlIG9wZXJhdGlvbnMgd2hlbiByZWdleCBjb25kaXRpb25zIGFyZSBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzb2Z0RGVsZXRlV2l0aFJlZ2V4Q29uZGl0aW9ucyhcbiAgICBkZWxldGVkQ29sdW1uOiBrZXlvZiBULFxuICAgIGRlbGV0ZWRWYWx1ZTogYW55LFxuICApOiBEZWxldGVSZXN1bHQge1xuICAgIC8vIEZpcnN0LCBnZXQgYWxsIHJvd3MgbWF0Y2hpbmcgU1FMIGNvbmRpdGlvbnMgKHdpdGhvdXQgcmVnZXgpXG4gICAgY29uc3QgW3NlbGVjdFF1ZXJ5LCBzZWxlY3RQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlUm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgIGBTRUxFQ1Qgcm93aWQsICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7c2VsZWN0UXVlcnl9YCxcbiAgICAgIClcbiAgICAgIC5hbGwoLi4uc2VsZWN0UGFyYW1zKSBhcyAoVCAmIHsgcm93aWQ6IG51bWJlciB9KVtdO1xuXG4gICAgLy8gQXBwbHkgcmVnZXggZmlsdGVyaW5nXG4gICAgY29uc3QgbWF0Y2hpbmdSb3dzID0gdGhpcy5hcHBseVJlZ2V4RmlsdGVyaW5nKGNhbmRpZGF0ZVJvd3MpO1xuXG4gICAgaWYgKG1hdGNoaW5nUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNoYW5nZXM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyBTb2Z0IGRlbGV0ZSBlYWNoIG1hdGNoaW5nIHJvdyBieSByb3dpZFxuICAgIGNvbnN0IHVwZGF0ZVF1ZXJ5ID0gYFVQREFURSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSBTRVQgJHt0aGlzLnF1b3RlSWRlbnRpZmllcihTdHJpbmcoZGVsZXRlZENvbHVtbikpfSA9ID8gV0hFUkUgcm93aWQgPSA/YDtcbiAgICBjb25zdCBzdG10ID0gdGhpcy5nZXREYigpLnByZXBhcmUodXBkYXRlUXVlcnkpO1xuXG4gICAgbGV0IHRvdGFsQ2hhbmdlcyA9IDA7XG4gICAgZm9yIChjb25zdCByb3cgb2YgbWF0Y2hpbmdSb3dzKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzdG10LnJ1bihkZWxldGVkVmFsdWUsIHJvdy5yb3dpZCk7XG4gICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2hhbmdlczogdG90YWxDaGFuZ2VzIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBzb2Z0IGRlbGV0ZWQgcm93cyBieSBjbGVhcmluZyB0aGUgZGVsZXRlZCBtYXJrZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkZWxldGVkQ29sdW1uIC0gQ29sdW1uIG5hbWUgdGhhdCBtYXJrcyByb3dzIGFzIGRlbGV0ZWRcbiAgICogQHJldHVybnMgVXBkYXRlIHJlc3VsdCB3aXRoIGNoYW5nZXMgY291bnRcbiAgICovXG4gIHJlc3RvcmUoZGVsZXRlZENvbHVtbjoga2V5b2YgVCA9IFwiZGVsZXRlZF9hdFwiIGFzIGtleW9mIFQpOiBEZWxldGVSZXN1bHQge1xuICAgIHRoaXMucmVxdWlyZVdoZXJlQ2xhdXNlKFwiUkVTVE9SRVwiKTtcblxuICAgIC8vIEhhbmRsZSByZWdleCBjb25kaXRpb25zXG4gICAgaWYgKHRoaXMuaGFzUmVnZXhDb25kaXRpb25zKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3RvcmVXaXRoUmVnZXhDb25kaXRpb25zKGRlbGV0ZWRDb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIFVQREFURSBzdGF0ZW1lbnQgdG8gY2xlYXIgdGhlIGRlbGV0ZWQgbWFya2VyXG4gICAgY29uc3QgW3doZXJlQ2xhdXNlLCB3aGVyZVBhcmFtc10gPSB0aGlzLmJ1aWxkV2hlcmVDbGF1c2UoKTtcbiAgICBjb25zdCBxdWVyeSA9IGBVUERBVEUgJHt0aGlzLnF1b3RlSWRlbnRpZmllcih0aGlzLmdldFRhYmxlTmFtZSgpKX0gU0VUICR7dGhpcy5xdW90ZUlkZW50aWZpZXIoU3RyaW5nKGRlbGV0ZWRDb2x1bW4pKX0gPSBOVUxMJHt3aGVyZUNsYXVzZX1gO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpXG4gICAgICAucHJlcGFyZShxdWVyeSlcbiAgICAgIC5ydW4oLi4ud2hlcmVQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHJlc3RvcmUgb3BlcmF0aW9ucyB3aGVuIHJlZ2V4IGNvbmRpdGlvbnMgYXJlIHByZXNlbnQuXG4gICAqL1xuICBwcml2YXRlIHJlc3RvcmVXaXRoUmVnZXhDb25kaXRpb25zKGRlbGV0ZWRDb2x1bW46IGtleW9mIFQpOiBEZWxldGVSZXN1bHQge1xuICAgIC8vIEZpcnN0LCBnZXQgYWxsIHJvd3MgbWF0Y2hpbmcgU1FMIGNvbmRpdGlvbnMgKHdpdGhvdXQgcmVnZXgpXG4gICAgY29uc3QgW3NlbGVjdFF1ZXJ5LCBzZWxlY3RQYXJhbXNdID0gdGhpcy5idWlsZFdoZXJlQ2xhdXNlKCk7XG4gICAgY29uc3QgY2FuZGlkYXRlUm93cyA9IHRoaXMuZ2V0RGIoKVxuICAgICAgLnByZXBhcmUoXG4gICAgICAgIGBTRUxFQ1Qgcm93aWQsICogRlJPTSAke3RoaXMucXVvdGVJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVOYW1lKCkpfSR7c2VsZWN0UXVlcnl9YCxcbiAgICAgIClcbiAgICAgIC5hbGwoLi4uc2VsZWN0UGFyYW1zKSBhcyAoVCAmIHsgcm93aWQ6IG51bWJlciB9KVtdO1xuXG4gICAgLy8gQXBwbHkgcmVnZXggZmlsdGVyaW5nXG4gICAgY29uc3QgbWF0Y2hpbmdSb3dzID0gdGhpcy5hcHBseVJlZ2V4RmlsdGVyaW5nKGNhbmRpZGF0ZVJvd3MpO1xuXG4gICAgaWYgKG1hdGNoaW5nUm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IGNoYW5nZXM6IDAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXN0b3JlIGVhY2ggbWF0Y2hpbmcgcm93IGJ5IHJvd2lkXG4gICAgY29uc3QgdXBkYXRlUXVlcnkgPSBgVVBEQVRFICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9IFNFVCAke3RoaXMucXVvdGVJZGVudGlmaWVyKFN0cmluZyhkZWxldGVkQ29sdW1uKSl9ID0gTlVMTCBXSEVSRSByb3dpZCA9ID9gO1xuICAgIGNvbnN0IHN0bXQgPSB0aGlzLmdldERiKCkucHJlcGFyZSh1cGRhdGVRdWVyeSk7XG5cbiAgICBsZXQgdG90YWxDaGFuZ2VzID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBtYXRjaGluZ1Jvd3MpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHN0bXQucnVuKHJvdy5yb3dpZCk7XG4gICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2hhbmdlczogdG90YWxDaGFuZ2VzIH07XG4gIH1cblxuICAvKipcbiAgICogQmF0Y2ggZGVsZXRlIG11bHRpcGxlIHNldHMgb2Ygcm93cyBiYXNlZCBvbiBkaWZmZXJlbnQgY29uZGl0aW9ucy5cbiAgICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGluZGl2aWR1YWwgZGVsZXRlcyB3aGVuIHJlbW92aW5nIG1hbnkgZGlmZmVyZW50IHJvdyBzZXRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZGl0aW9ucyAtIEFycmF5IG9mIFdIRVJFIGNvbmRpdGlvbiBvYmplY3RzXG4gICAqIEByZXR1cm5zIERlbGV0ZSByZXN1bHQgd2l0aCB0b3RhbCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBkZWxldGVCYXRjaChjb25kaXRpb25zOiBBcnJheTxQYXJ0aWFsPFQ+Pik6IERlbGV0ZVJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpIHx8IGNvbmRpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWxldGVCYXRjaDogY29uZGl0aW9ucyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5XCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREYigpO1xuXG4gICAgLy8gVXNlIGEgdHJhbnNhY3Rpb24gZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFxuICAgICAgKGNvbmRpdGlvbnNUb1Byb2Nlc3M6IEFycmF5PFBhcnRpYWw8VD4+KSA9PiB7XG4gICAgICAgIGxldCB0b3RhbENoYW5nZXMgPSAwO1xuXG4gICAgICAgIGZvciAoY29uc3Qgd2hlcmVEYXRhIG9mIGNvbmRpdGlvbnNUb1Byb2Nlc3MpIHtcbiAgICAgICAgICAvLyBCdWlsZCBXSEVSRSBjb25kaXRpb25zIGZvciB0aGlzIGRlbGV0ZVxuICAgICAgICAgIGNvbnN0IHdoZXJlQ29uZGl0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCB3aGVyZVBhcmFtczogYW55W10gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHdoZXJlRGF0YSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHdoZXJlQ29uZGl0aW9ucy5wdXNoKGAke3RoaXMucXVvdGVJZGVudGlmaWVyKGNvbHVtbil9IElTIE5VTExgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHdoZXJlQ29uZGl0aW9ucy5wdXNoKGAke3RoaXMucXVvdGVJZGVudGlmaWVyKGNvbHVtbil9ID0gP2ApO1xuICAgICAgICAgICAgICB3aGVyZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAod2hlcmVDb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcImRlbGV0ZUJhdGNoOiBlYWNoIGRlbGV0ZSBtdXN0IGhhdmUgV0hFUkUgY29uZGl0aW9uc1wiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBCdWlsZCBERUxFVEUgc3RhdGVtZW50XG4gICAgICAgICAgY29uc3Qgd2hlcmVDbGF1c2UgPSBgIFdIRVJFICR7d2hlcmVDb25kaXRpb25zLmpvaW4oXCIgQU5EIFwiKX1gO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gYERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9JHt3aGVyZUNsYXVzZX1gO1xuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGIucHJlcGFyZShxdWVyeSkucnVuKC4uLndoZXJlUGFyYW1zKTtcbiAgICAgICAgICB0b3RhbENoYW5nZXMgKz0gcmVzdWx0LmNoYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjaGFuZ2VzOiB0b3RhbENoYW5nZXMgfTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB0cmFuc2FjdGlvbihjb25kaXRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZSB0aGUgZW50aXJlIHRhYmxlIChkZWxldGUgYWxsIHJvd3MpLlxuICAgKiBUaGlzIGJ5cGFzc2VzIHRoZSBXSEVSRSBjb25kaXRpb24gcmVxdWlyZW1lbnQgc2luY2UgaXQncyBleHBsaWNpdGx5IGRlc3RydWN0aXZlLlxuICAgKiBVU0UgV0lUSCBFWFRSRU1FIENBVVRJT04hXG4gICAqXG4gICAqIEByZXR1cm5zIERlbGV0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICB0cnVuY2F0ZSgpOiBEZWxldGVSZXN1bHQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9YDtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmdldERiKCkucHJlcGFyZShxdWVyeSkucnVuKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY2hhbmdlczogcmVzdWx0LmNoYW5nZXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgcm93cyBvbGRlciB0aGFuIGEgc3BlY2lmaWVkIHRpbWVzdGFtcC5cbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjb21tb24gY2xlYW51cCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdGltZXN0YW1wQ29sdW1uIC0gQ29sdW1uIG5hbWUgY29udGFpbmluZyB0aGUgdGltZXN0YW1wXG4gICAqIEBwYXJhbSBvbGRlclRoYW4gLSBUaW1lc3RhbXAgdGhyZXNob2xkIChyb3dzIG9sZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGRlbGV0ZWQpXG4gICAqIEByZXR1cm5zIERlbGV0ZSByZXN1bHQgd2l0aCBjaGFuZ2VzIGNvdW50XG4gICAqL1xuICBkZWxldGVPbGRlclRoYW4odGltZXN0YW1wQ29sdW1uOiBrZXlvZiBULCBvbGRlclRoYW46IG51bWJlcik6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMud2hlcmVPcCh0aW1lc3RhbXBDb2x1bW4sIFwiPFwiLCBvbGRlclRoYW4pLmRlbGV0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBkdXBsaWNhdGUgcm93cyBiYXNlZCBvbiBzcGVjaWZpZWQgY29sdW1ucywga2VlcGluZyBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGF0YSBjbGVhbnVwIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1ucyB0byBjaGVjayBmb3IgZHVwbGljYXRlc1xuICAgKiBAcmV0dXJucyBEZWxldGUgcmVzdWx0IHdpdGggY2hhbmdlcyBjb3VudFxuICAgKi9cbiAgZGVsZXRlRHVwbGljYXRlcyhjb2x1bW5zOiBBcnJheTxrZXlvZiBUPik6IERlbGV0ZVJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbHVtbnMpIHx8IGNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWxldGVEdXBsaWNhdGVzOiBjb2x1bW5zIG11c3QgYmUgYSBub24tZW1wdHkgYXJyYXlcIik7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uTmFtZXMgPSBjb2x1bW5zLm1hcCgoY29sKSA9PiBTdHJpbmcoY29sKSk7XG4gICAgY29uc3QgcXVvdGVkQ29sdW1ucyA9IGNvbHVtbk5hbWVzXG4gICAgICAubWFwKChjb2wpID0+IHRoaXMucXVvdGVJZGVudGlmaWVyKGNvbCkpXG4gICAgICAuam9pbihcIiwgXCIpO1xuXG4gICAgLy8gRmluZCBkdXBsaWNhdGUgcm93cywga2VlcGluZyB0aGUgb25lIHdpdGggdGhlIG1pbmltdW0gcm93aWRcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIERFTEVURSBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9XG4gICAgICBXSEVSRSByb3dpZCBOT1QgSU4gKFxuICAgICAgICBTRUxFQ1QgTUlOKHJvd2lkKVxuICAgICAgICBGUk9NICR7dGhpcy5xdW90ZUlkZW50aWZpZXIodGhpcy5nZXRUYWJsZU5hbWUoKSl9XG4gICAgICAgIEdST1VQIEJZICR7cXVvdGVkQ29sdW1uc31cbiAgICAgIClcbiAgICBgO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXREYigpLnByZXBhcmUocXVlcnkpLnJ1bigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoYW5nZXM6IHJlc3VsdC5jaGFuZ2VzLFxuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gXCJidW46c3FsaXRlXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENvbHVtbk5hbWVzLFxuICBXaGVyZUNvbmRpdGlvbixcbiAgUmVnZXhDb25kaXRpb24sXG4gIEluc2VydFJlc3VsdCxcbiAgVXBkYXRlUmVzdWx0LFxuICBEZWxldGVSZXN1bHQsXG4gIEluc2VydE9wdGlvbnMsXG4gIEpzb25Db2x1bW5Db25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vc2VsZWN0XCI7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeUJ1aWxkZXIgfSBmcm9tIFwiLi9pbnNlcnRcIjtcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gXCIuL3VwZGF0ZVwiO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vZGVsZXRlXCI7XG5cbi8qKlxuICogTWFpbiBRdWVyeUJ1aWxkZXIgY2xhc3MgdGhhdCBjb21iaW5lcyBhbGwgZnVuY3Rpb25hbGl0eSB1c2luZyBjb21wb3NpdGlvbi5cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgU0VMRUNULCBJTlNFUlQsIFVQREFURSwgYW5kIERFTEVURSBvcGVyYXRpb25zLlxuICpcbiAqIEVhY2ggb3BlcmF0aW9uIHR5cGUgaXMgaW1wbGVtZW50ZWQgaW4gYSBzZXBhcmF0ZSBtb2R1bGUgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHk6XG4gKiAtIFNFTEVDVDogY29sdW1uIHNlbGVjdGlvbiwgb3JkZXJpbmcsIGxpbWl0aW5nLCByZXN1bHQgZXhlY3V0aW9uXG4gKiAtIElOU0VSVDogc2luZ2xlL2J1bGsgaW5zZXJ0cyB3aXRoIGNvbmZsaWN0IHJlc29sdXRpb25cbiAqIC0gVVBEQVRFOiBzYWZlIHVwZGF0ZXMgd2l0aCBtYW5kYXRvcnkgV0hFUkUgY29uZGl0aW9uc1xuICogLSBERUxFVEU6IHNhZmUgZGVsZXRlcyB3aXRoIG1hbmRhdG9yeSBXSEVSRSBjb25kaXRpb25zXG4gKiAtIFdIRVJFOiBzaGFyZWQgY29uZGl0aW9uYWwgbG9naWMgYWNyb3NzIGFsbCBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBRdWVyeUJ1aWxkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgcHJpdmF0ZSBzZWxlY3RCdWlsZGVyOiBTZWxlY3RRdWVyeUJ1aWxkZXI8VD47XG4gIHByaXZhdGUgaW5zZXJ0QnVpbGRlcjogSW5zZXJ0UXVlcnlCdWlsZGVyPFQ+O1xuICBwcml2YXRlIHVwZGF0ZUJ1aWxkZXI6IFVwZGF0ZVF1ZXJ5QnVpbGRlcjxUPjtcbiAgcHJpdmF0ZSBkZWxldGVCdWlsZGVyOiBEZWxldGVRdWVyeUJ1aWxkZXI8VD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGI6IERhdGFiYXNlLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGpzb25Db25maWc/OiBKc29uQ29sdW1uQ29uZmlnPFQ+LFxuICApIHtcbiAgICAvLyBDcmVhdGUgaW5zdGFuY2VzIG9mIGVhY2ggc3BlY2lhbGl6ZWQgYnVpbGRlclxuICAgIHRoaXMuc2VsZWN0QnVpbGRlciA9IG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXI8VD4oZGIsIHRhYmxlTmFtZSwganNvbkNvbmZpZyk7XG4gICAgdGhpcy5pbnNlcnRCdWlsZGVyID0gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcjxUPihkYiwgdGFibGVOYW1lLCBqc29uQ29uZmlnKTtcbiAgICB0aGlzLnVwZGF0ZUJ1aWxkZXIgPSBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyPFQ+KGRiLCB0YWJsZU5hbWUsIGpzb25Db25maWcpO1xuICAgIHRoaXMuZGVsZXRlQnVpbGRlciA9IG5ldyBEZWxldGVRdWVyeUJ1aWxkZXI8VD4oZGIsIHRhYmxlTmFtZSwganNvbkNvbmZpZyk7XG5cbiAgICAvLyBFbnN1cmUgYWxsIGJ1aWxkZXJzIHNoYXJlIHRoZSBzYW1lIHN0YXRlIGZvciBXSEVSRSBjb25kaXRpb25zXG4gICAgdGhpcy5zeW5jQnVpbGRlclN0YXRlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplIHRoZSBzdGF0ZSBiZXR3ZWVuIGFsbCBidWlsZGVycyBzbyBXSEVSRSBjb25kaXRpb25zIGFyZSBzaGFyZWQuXG4gICAqL1xuICBwcml2YXRlIHN5bmNCdWlsZGVyU3RhdGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IG1hc3RlclN0YXRlID0gKHRoaXMuc2VsZWN0QnVpbGRlciBhcyBhbnkpLnN0YXRlO1xuICAgICh0aGlzLmluc2VydEJ1aWxkZXIgYXMgYW55KS5zdGF0ZSA9IG1hc3RlclN0YXRlO1xuICAgICh0aGlzLnVwZGF0ZUJ1aWxkZXIgYXMgYW55KS5zdGF0ZSA9IG1hc3RlclN0YXRlO1xuICAgICh0aGlzLmRlbGV0ZUJ1aWxkZXIgYXMgYW55KS5zdGF0ZSA9IG1hc3RlclN0YXRlO1xuICB9XG5cbiAgLy8gPT09PT0gV0hFUkUgTUVUSE9EUyAoZGVsZWdhdGVkIHRvIHNlbGVjdEJ1aWxkZXIpID09PT09XG5cbiAgLyoqXG4gICAqIEFkZCBzaW1wbGUgZXF1YWxpdHkgY29uZGl0aW9ucyB0byB0aGUgV0hFUkUgY2xhdXNlLlxuICAgKi9cbiAgd2hlcmUoY29uZGl0aW9uczogV2hlcmVDb25kaXRpb248VD4pOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIud2hlcmUoY29uZGl0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlZ2V4IGNvbmRpdGlvbnMgKGFwcGxpZWQgY2xpZW50LXNpZGUpLlxuICAgKi9cbiAgd2hlcmVSZ3goY29uZGl0aW9uczogUmVnZXhDb25kaXRpb248VD4pOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIud2hlcmVSZ3goY29uZGl0aW9ucyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmF3IFNRTCBXSEVSRSBmcmFnbWVudCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLlxuICAgKi9cbiAgd2hlcmVFeHByKGV4cHI6IHN0cmluZywgcGFyYW1zOiBhbnlbXSA9IFtdKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlRXhwcihleHByLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsaWFzIGZvciB3aGVyZUV4cHIuXG4gICAqL1xuICB3aGVyZVJhdyhleHByOiBzdHJpbmcsIHBhcmFtczogYW55W10gPSBbXSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZVJhdyhleHByLCBwYXJhbXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBJTiBjbGF1c2Ugd2l0aCBwcm9wZXIgcGFyYW1ldGVyIGJpbmRpbmcuXG4gICAqL1xuICB3aGVyZUluKGNvbHVtbjoga2V5b2YgVCwgdmFsdWVzOiBhbnlbXSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBOT1QgSU4gY2xhdXNlIHdpdGggcHJvcGVyIHBhcmFtZXRlciBiaW5kaW5nLlxuICAgKi9cbiAgd2hlcmVOb3RJbihjb2x1bW46IGtleW9mIFQsIHZhbHVlczogYW55W10pOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIud2hlcmVOb3RJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBjb25kaXRpb24uXG4gICAqL1xuICB3aGVyZU9wKGNvbHVtbjoga2V5b2YgVCwgb3A6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZU9wKGNvbHVtbiwgb3AsIHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBCRVRXRUVOIGNvbmRpdGlvbi5cbiAgICovXG4gIHdoZXJlQmV0d2Vlbihjb2x1bW46IGtleW9mIFQsIG1pbjogYW55LCBtYXg6IGFueSk6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci53aGVyZUJldHdlZW4oY29sdW1uLCBtaW4sIG1heCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgTk9UIEJFVFdFRU4gY29uZGl0aW9uLlxuICAgKi9cbiAgd2hlcmVOb3RCZXR3ZWVuKGNvbHVtbjoga2V5b2YgVCwgbWluOiBhbnksIG1heDogYW55KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlTm90QmV0d2Vlbihjb2x1bW4sIG1pbiwgbWF4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gSVMgTlVMTCBjb25kaXRpb24uXG4gICAqL1xuICB3aGVyZU51bGwoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlTnVsbChjb2x1bW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBJUyBOT1QgTlVMTCBjb25kaXRpb24uXG4gICAqL1xuICB3aGVyZU5vdE51bGwoY29sdW1uOiBrZXlvZiBUKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLndoZXJlTm90TnVsbChjb2x1bW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gPT09PT0gU0VMRUNUIE1FVEhPRFMgKGRlbGVnYXRlZCB0byBzZWxlY3RCdWlsZGVyKSA9PT09PVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIGNvbHVtbnMgdG8gc2VsZWN0LlxuICAgKi9cbiAgc2VsZWN0KGNvbHVtbnM6IENvbHVtbk5hbWVzPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLnNlbGVjdChjb2x1bW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgT1JERVIgQlkgY2xhdXNlLlxuICAgKi9cbiAgb3JkZXJCeShjb2x1bW46IGtleW9mIFQpOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIub3JkZXJCeShjb2x1bW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvcmRlciBkaXJlY3Rpb24gdG8gZGVzY2VuZGluZy5cbiAgICovXG4gIGRlc2MoKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLmRlc2MoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3JkZXIgZGlyZWN0aW9uIHRvIGFzY2VuZGluZy5cbiAgICovXG4gIGFzYygpOiB0aGlzIHtcbiAgICB0aGlzLnNlbGVjdEJ1aWxkZXIuYXNjKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIExJTUlUIGNsYXVzZS5cbiAgICovXG4gIGxpbWl0KGFtb3VudDogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy5zZWxlY3RCdWlsZGVyLmxpbWl0KGFtb3VudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIE9GRlNFVCBjbGF1c2UuXG4gICAqL1xuICBvZmZzZXQoc3RhcnQ6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuc2VsZWN0QnVpbGRlci5vZmZzZXQoc3RhcnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gPT09PT0gU0VMRUNUIEVYRUNVVElPTiBNRVRIT0RTIChkZWxlZ2F0ZWQgdG8gc2VsZWN0QnVpbGRlcikgPT09PT1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiBhbGwgbWF0Y2hpbmcgcm93cy5cbiAgICovXG4gIGFsbCgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdEJ1aWxkZXIuYWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgcXVlcnkgYW5kIHJldHVybiB0aGUgZmlyc3QgbWF0Y2hpbmcgcm93LCBvciBudWxsLlxuICAgKi9cbiAgZ2V0KCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RCdWlsZGVyLmdldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIHJvdywgb3IgbnVsbC5cbiAgICovXG4gIGZpcnN0KCk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RCdWlsZGVyLmZpcnN0KCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIENPVU5UIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBtYXRjaGluZyByb3dzLlxuICAgKi9cbiAgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RCdWlsZGVyLmNvdW50KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW55IHJvd3MgbWF0Y2ggdGhlIGN1cnJlbnQgY29uZGl0aW9ucy5cbiAgICovXG4gIGV4aXN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RCdWlsZGVyLmV4aXN0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYSBzaW5nbGUgY29sdW1uIHZhbHVlIGZyb20gdGhlIGZpcnN0IHJvdy5cbiAgICovXG4gIHZhbHVlPEsgZXh0ZW5kcyBrZXlvZiBUPihjb2x1bW46IEspOiBUW0tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci52YWx1ZShjb2x1bW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgdmFsdWVzIGZyb20gYSBzaW5nbGUgY29sdW1uLlxuICAgKi9cbiAgcGx1Y2s8SyBleHRlbmRzIGtleW9mIFQ+KGNvbHVtbjogSyk6IFRbS11bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0QnVpbGRlci5wbHVjayhjb2x1bW4pO1xuICB9XG5cbiAgLy8gPT09PT0gSU5TRVJUIE1FVEhPRFMgKGRlbGVnYXRlZCB0byBpbnNlcnRCdWlsZGVyKSA9PT09PVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYSBzaW5nbGUgcm93IG9yIG11bHRpcGxlIHJvd3MgaW50byB0aGUgdGFibGUuXG4gICAqL1xuICBpbnNlcnQoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSxcbiAgICBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyxcbiAgKTogSW5zZXJ0UmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCdWlsZGVyLmluc2VydChkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBJR05PUkUgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICovXG4gIGluc2VydE9ySWdub3JlKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0T3JJZ25vcmUoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IHdpdGggT1IgUkVQTEFDRSBjb25mbGljdCByZXNvbHV0aW9uLlxuICAgKi9cbiAgaW5zZXJ0T3JSZXBsYWNlKGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0T3JSZXBsYWNlKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCB3aXRoIE9SIEFCT1JUIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqL1xuICBpbnNlcnRPckFib3J0KGRhdGE6IFBhcnRpYWw8VD4gfCBQYXJ0aWFsPFQ+W10pOiBJbnNlcnRSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmluc2VydEJ1aWxkZXIuaW5zZXJ0T3JBYm9ydChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgd2l0aCBPUiBGQUlMIGNvbmZsaWN0IHJlc29sdXRpb24uXG4gICAqL1xuICBpbnNlcnRPckZhaWwoZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnVpbGRlci5pbnNlcnRPckZhaWwoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IHdpdGggT1IgUk9MTEJBQ0sgY29uZmxpY3QgcmVzb2x1dGlvbi5cbiAgICovXG4gIGluc2VydE9yUm9sbGJhY2soZGF0YTogUGFydGlhbDxUPiB8IFBhcnRpYWw8VD5bXSk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnVpbGRlci5pbnNlcnRPclJvbGxiYWNrKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhbmQgZ2V0IHRoZSBpbnNlcnRlZCByb3cgYmFjay5cbiAgICovXG4gIGluc2VydEFuZEdldChkYXRhOiBQYXJ0aWFsPFQ+LCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IFQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCdWlsZGVyLmluc2VydEFuZEdldChkYXRhLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBpbnNlcnQgd2l0aCB0cmFuc2FjdGlvbiBzdXBwb3J0LlxuICAgKi9cbiAgaW5zZXJ0QmF0Y2gocm93czogUGFydGlhbDxUPltdLCBvcHRpb25zPzogSW5zZXJ0T3B0aW9ucyk6IEluc2VydFJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QnVpbGRlci5pbnNlcnRCYXRjaChyb3dzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vID09PT09IFVQREFURSBNRVRIT0RTIChkZWxlZ2F0ZWQgdG8gdXBkYXRlQnVpbGRlcikgPT09PT1cblxuICAvKipcbiAgICogVXBkYXRlIHJvd3MgbWF0Y2hpbmcgdGhlIFdIRVJFIGNvbmRpdGlvbnMuXG4gICAqL1xuICB1cGRhdGUoZGF0YTogUGFydGlhbDxUPik6IFVwZGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQnVpbGRlci51cGRhdGUoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG9yIGluc2VydCAodXBzZXJ0KSB1c2luZyBJTlNFUlQgT1IgUkVQTEFDRS5cbiAgICovXG4gIHVwc2VydChkYXRhOiBQYXJ0aWFsPFQ+KTogVXBkYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCdWlsZGVyLnVwc2VydChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnQgYSBudW1lcmljIGNvbHVtbiBieSBhIHNwZWNpZmllZCBhbW91bnQuXG4gICAqL1xuICBpbmNyZW1lbnQoY29sdW1uOiBrZXlvZiBULCBhbW91bnQgPSAxKTogVXBkYXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCdWlsZGVyLmluY3JlbWVudChjb2x1bW4sIGFtb3VudCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVtZW50IGEgbnVtZXJpYyBjb2x1bW4gYnkgYSBzcGVjaWZpZWQgYW1vdW50LlxuICAgKi9cbiAgZGVjcmVtZW50KGNvbHVtbjoga2V5b2YgVCwgYW1vdW50ID0gMSk6IFVwZGF0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQnVpbGRlci5kZWNyZW1lbnQoY29sdW1uLCBhbW91bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbmQgZ2V0IHRoZSB1cGRhdGVkIHJvd3MgYmFjay5cbiAgICovXG4gIHVwZGF0ZUFuZEdldChkYXRhOiBQYXJ0aWFsPFQ+KTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCdWlsZGVyLnVwZGF0ZUFuZEdldChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCB1cGRhdGUgbXVsdGlwbGUgcm93cyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAqL1xuICB1cGRhdGVCYXRjaChcbiAgICB1cGRhdGVzOiBBcnJheTx7IHdoZXJlOiBQYXJ0aWFsPFQ+OyBkYXRhOiBQYXJ0aWFsPFQ+IH0+LFxuICApOiBVcGRhdGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJ1aWxkZXIudXBkYXRlQmF0Y2godXBkYXRlcyk7XG4gIH1cblxuICAvLyA9PT09PSBERUxFVEUgTUVUSE9EUyAoZGVsZWdhdGVkIHRvIGRlbGV0ZUJ1aWxkZXIpID09PT09XG5cbiAgLyoqXG4gICAqIERlbGV0ZSByb3dzIG1hdGNoaW5nIHRoZSBXSEVSRSBjb25kaXRpb25zLlxuICAgKi9cbiAgZGVsZXRlKCk6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5kZWxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW5kIGdldCB0aGUgZGVsZXRlZCByb3dzIGJhY2suXG4gICAqL1xuICBkZWxldGVBbmRHZXQoKTogVFtdIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdWlsZGVyLmRlbGV0ZUFuZEdldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvZnQgZGVsZXRlIC0gbWFyayByb3dzIGFzIGRlbGV0ZWQgaW5zdGVhZCBvZiBwaHlzaWNhbGx5IHJlbW92aW5nIHRoZW0uXG4gICAqL1xuICBzb2Z0RGVsZXRlKFxuICAgIGRlbGV0ZWRDb2x1bW46IGtleW9mIFQgPSBcImRlbGV0ZWRfYXRcIiBhcyBrZXlvZiBULFxuICAgIGRlbGV0ZWRWYWx1ZTogYW55ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCksXG4gICk6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci5zb2Z0RGVsZXRlKGRlbGV0ZWRDb2x1bW4sIGRlbGV0ZWRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBzb2Z0IGRlbGV0ZWQgcm93cy5cbiAgICovXG4gIHJlc3RvcmUoZGVsZXRlZENvbHVtbjoga2V5b2YgVCA9IFwiZGVsZXRlZF9hdFwiIGFzIGtleW9mIFQpOiBEZWxldGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1aWxkZXIucmVzdG9yZShkZWxldGVkQ29sdW1uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYXRjaCBkZWxldGUgbXVsdGlwbGUgc2V0cyBvZiByb3dzLlxuICAgKi9cbiAgZGVsZXRlQmF0Y2goY29uZGl0aW9uczogQXJyYXk8UGFydGlhbDxUPj4pOiBEZWxldGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1aWxkZXIuZGVsZXRlQmF0Y2goY29uZGl0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGUgdGhlIGVudGlyZSB0YWJsZSAoZGVsZXRlIGFsbCByb3dzKS5cbiAgICovXG4gIHRydW5jYXRlKCk6IERlbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlQnVpbGRlci50cnVuY2F0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSByb3dzIG9sZGVyIHRoYW4gYSBzcGVjaWZpZWQgdGltZXN0YW1wLlxuICAgKi9cbiAgZGVsZXRlT2xkZXJUaGFuKHRpbWVzdGFtcENvbHVtbjoga2V5b2YgVCwgb2xkZXJUaGFuOiBudW1iZXIpOiBEZWxldGVSZXN1bHQge1xuICAgIHJldHVybiB0aGlzLmRlbGV0ZUJ1aWxkZXIuZGVsZXRlT2xkZXJUaGFuKHRpbWVzdGFtcENvbHVtbiwgb2xkZXJUaGFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZHVwbGljYXRlIHJvd3MgYmFzZWQgb24gc3BlY2lmaWVkIGNvbHVtbnMuXG4gICAqL1xuICBkZWxldGVEdXBsaWNhdGVzKGNvbHVtbnM6IEFycmF5PGtleW9mIFQ+KTogRGVsZXRlUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGVCdWlsZGVyLmRlbGV0ZUR1cGxpY2F0ZXMoY29sdW1ucyk7XG4gIH1cbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxtQkFBUyxtQkNZRixNQUFlLENBQWdELENBQzFELE1BRVYsV0FBVyxDQUNULEVBQ0EsRUFDQSxFQUNBLENBQ0EsS0FBSyxNQUFRLENBQ1gsS0FDQSxZQUNBLGdCQUFpQixDQUFDLEVBQ2xCLFlBQWEsQ0FBQyxFQUNkLGdCQUFpQixDQUFDLEVBQ2xCLFlBQWEsR0FBWSxXQUMzQixFQU1RLEtBQUssRUFBYSxDQUMxQixPQUFPLEtBQUssTUFBTSxHQU1WLFlBQVksRUFBVyxDQUMvQixPQUFPLEtBQUssTUFBTSxVQU9WLGdCQUFnQixFQUFvQixDQUM1QyxHQUFJLEtBQUssTUFBTSxnQkFBZ0IsU0FBVyxFQUN4QyxNQUFPLENBQUMsR0FBSSxDQUFDLENBQUMsRUFFaEIsTUFBTyxDQUNMLFVBQVUsS0FBSyxNQUFNLGdCQUFnQixLQUFLLE9BQU8sSUFDakQsS0FBSyxNQUFNLFlBQVksTUFBTSxDQUMvQixFQU1RLGtCQUFrQixFQUFZLENBQ3RDLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixPQUFTLEVBT25DLG1CQUFtQixDQUFDLEVBQWdCLENBQzVDLEdBQUksS0FBSyxNQUFNLGdCQUFnQixTQUFXLEVBQ3hDLE9BQU8sRUFHVCxPQUFPLEVBQUssT0FBTyxDQUFDLElBQ2xCLEtBQUssTUFBTSxnQkFBZ0IsTUFBTSxFQUFHLFNBQVEsV0FBWSxDQUN0RCxJQUFNLEVBQVEsRUFBSSxPQUFPLENBQU0sR0FDL0IsR0FBSSxJQUFVLE1BQVEsSUFBVSxPQUFXLE1BQU8sR0FDbEQsT0FBTyxFQUFNLEtBQUssT0FBTyxDQUFLLENBQUMs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TXRFLGdCQUFnQixDQUFDLEVBQXVDLENBQ3RELE9BQU8sS0FBSyxjQUFjLGlCQUFpQixDQUFPLEVBRXRELENQcllBLE1BQU0sQ0FBRyxDQUNDLEdBUVIsV0FBVyxDQUNULEVBQ0EsRUFJQSxDQUlBLEdBSEEsS0FBSyxHQUFLLElBQUksRUFBUyxDQUFJLEVBR3ZCLEdBQVMsUUFDWCxRQUFZLEVBQU0sS0FBVSxFQUFRLFFBQ2xDLEtBQUssT0FBTyxFQUFNLENBQUssRUFLM0IsR0FBSSxHQUFTLGVBQ1gsUUFBVyxLQUFpQixFQUFRLGVBQ2xDLEtBQUssY0FBYyxDQUFhLEVBaUZ0QyxLQUFvQyxDQUNsQyxFQUNBLEVBQ2lCLENBQ2pCLE9BQU8sSUFBSSxFQUFnQixLQUFLLEdBQUksRUFBVyxDQUFVLEVBUTNELEtBQUssRUFBUyxDQUNaLEtBQUssR0FBRyxNQUFNLEVBdUJoQixXQUFXLENBQ1QsRUFDQSxFQUNBLEVBQ00sQ0FDTixJQUFNLEVBQVEsR0FBUyxZQUFjLGlCQUFtQixHQUNsRCxFQUFlLEdBQVMsYUFBZSxpQkFBbUIsR0FFMUQsRUFBYSxDQUFDLElBQWMsSUFBSSxFQUFFLFFBQVEsS0FBTSxJQUFJLEtBRXRELEVBQ0osR0FBSSxPQUFPLElBQVksVUFFckIsR0FEQSxFQUFhLEVBQVEsS0FBSyxHQUNyQixFQUNILE1BQU0sSUFBSSxNQUFNLGdDQUFnQyxFQUU3QyxLQUNMLElBQU0sRUFBa0IsQ0FBQyxFQUN6QixRQUFZLEVBQUssS0FBUSxPQUFPLFFBQVEsQ0FBTyxFQUFHLENBQ2hELElBQUssRUFDSCxTQUVGLElBQU0sR0FBVyxHQUFPLElBQUksS0FBSyxFQUNqQyxJQUFLLEVBQ0gsTUFBTSxJQUFJLE1BQU0sNENBQTRDLElBQU0sRUFFcEUsRUFBTSxLQUFLLEdBQUcsRUFBVyxDQUFHLEtBQUssR0FBUyxFQUU1QyxHQUFJLEVBQU0sU0FBVyxFQUNuQixNQUFNLElBQUksTUFBTSxxQkFBcUIsRUFFdkMsRUFBYSxFQUFNLEtBQUssSUFBSSxFQUc5QixJQUFNLEVBQU0sZ0JBQWdCLElBQVEsRUFBVyxDQUFTLE1BQU0sS0FBYyxLQUM1RSxLQUFLLEdBQUcsS0FBSyxDQUFHLEVBVWxCLE1BQU0sQ0FBQyxFQUFjLEVBQWtCLENBQ3JDLEdBQUksSUFBVSxPQUNaLEtBQUssR0FBRyxLQUFLLFVBQVUsT0FBVSxHQUFPLEVBQ25DLEtBQ0wsSUFBTSxFQUFTLEtBQUssR0FBRyxRQUFRLFVBQVUsR0FBTSxFQUFFLElBQUksRUFJckQsT0FBTyxPQUFPLE9BQU8sQ0FBTSxFQUFFLElBU2pDLGFBQWEsQ0FBQyxFQUFvQixDQUNoQyxLQUFLLEdBQUcsY0FBYyxDQUFJLEVBUzVCLEtBQUssRUFBYSxDQUNoQixPQUFPLEtBQUssR0FFaEIiLAogICJkZWJ1Z0lkIjogIjc1OTMzNkRGMkE4N0IwODI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@dockstat/sqlite-wrapper",
3
+ "version": "1.0.0",
4
+ "description": "A TypeScript wrapper around bun:sqlite with type-safe query building",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/**/*",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "bun run ./build.ts",
21
+ "dev": "bun build index.ts",
22
+ "lint": "biome lint .",
23
+ "lint:fix": "biome lint --write .",
24
+ "check-types": "bunx tsc --noEmit",
25
+ "test": "bun run test.ts",
26
+ "clean": "rm -rf dist",
27
+ "prepublishOnly": "npm run clean && npm run build"
28
+ },
29
+ "keywords": [
30
+ "sqlite",
31
+ "database",
32
+ "typescript",
33
+ "bun",
34
+ "query-builder",
35
+ "orm"
36
+ ],
37
+ "author": "Your Name <your.email@example.com>",
38
+ "license": "MIT",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/Its4Nik/DockStat",
42
+ "directory": "packages/sqlite-wrapper"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/Its4Nik/DockStat/issues"
46
+ },
47
+ "homepage": "https://github.com/Its4Nik/DockStat/tree/main/packages/sqlite-wrapper",
48
+ "engines": {
49
+ "bun": ">=1.0.0"
50
+ },
51
+ "peerDependencies": {
52
+ "typescript": "^5"
53
+ },
54
+ "devDependencies": {
55
+ "@types/bun": "latest",
56
+ "@types/dockerode": "^3.3.42"
57
+ }
58
+ }