@prisma/studio-core-licensed 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/chunk-32BUC7NR.js +10 -0
  2. package/dist/chunk-A6CVKSUD.js +10 -0
  3. package/dist/chunk-M7E5UEO3.js +10 -0
  4. package/dist/chunk-O6ZAHVDF.js +10 -0
  5. package/dist/chunk-PA5LQLPW.js +10 -0
  6. package/dist/chunk-SXTJF4PD.js +10 -0
  7. package/dist/chunk-ZUEQ555M.js +10 -0
  8. package/dist/data/accelerate/index.d.cts +1 -1
  9. package/dist/data/accelerate/index.d.ts +1 -1
  10. package/dist/data/bff/index.cjs +2 -2
  11. package/dist/data/bff/index.d.cts +15 -3
  12. package/dist/data/bff/index.d.ts +15 -3
  13. package/dist/data/bff/index.js +2 -2
  14. package/dist/data/index.d.cts +1 -1
  15. package/dist/data/index.d.ts +1 -1
  16. package/dist/data/index.js +1 -1
  17. package/dist/data/mysql-core/index.cjs +3 -0
  18. package/dist/data/mysql-core/index.d.cts +176 -0
  19. package/dist/data/mysql-core/index.d.ts +176 -0
  20. package/dist/data/mysql-core/index.js +11 -0
  21. package/dist/data/mysql2/index.cjs +2 -0
  22. package/dist/data/mysql2/index.d.cts +7 -0
  23. package/dist/data/mysql2/index.d.ts +7 -0
  24. package/dist/data/mysql2/index.js +10 -0
  25. package/dist/data/node-sqlite/index.cjs +2 -2
  26. package/dist/data/node-sqlite/index.d.cts +2 -3
  27. package/dist/data/node-sqlite/index.d.ts +2 -3
  28. package/dist/data/node-sqlite/index.js +2 -2
  29. package/dist/data/pglite/index.cjs +2 -2
  30. package/dist/data/pglite/index.d.cts +1 -1
  31. package/dist/data/pglite/index.d.ts +1 -1
  32. package/dist/data/pglite/index.js +2 -2
  33. package/dist/data/postgres-core/index.cjs +2 -2
  34. package/dist/data/postgres-core/index.d.cts +37 -37
  35. package/dist/data/postgres-core/index.d.ts +37 -37
  36. package/dist/data/postgres-core/index.js +1 -1
  37. package/dist/data/postgresjs/index.cjs +2 -2
  38. package/dist/data/postgresjs/index.d.cts +3 -14
  39. package/dist/data/postgresjs/index.d.ts +3 -14
  40. package/dist/data/postgresjs/index.js +2 -2
  41. package/dist/data/ppg/index.d.cts +1 -1
  42. package/dist/data/ppg/index.d.ts +1 -1
  43. package/dist/data/sqlite-core/index.cjs +2 -2
  44. package/dist/data/sqlite-core/index.d.cts +25 -25
  45. package/dist/data/sqlite-core/index.d.ts +25 -25
  46. package/dist/data/sqlite-core/index.js +2 -2
  47. package/dist/{index-2horhMcs.d.cts → index-BhPjNuvP.d.cts} +10 -6
  48. package/dist/{index-2horhMcs.d.ts → index-BhPjNuvP.d.ts} +10 -6
  49. package/dist/metafile-cjs.json +1 -1
  50. package/dist/metafile-esm.json +1 -1
  51. package/dist/ui/index.cjs +1 -1
  52. package/dist/ui/index.d.cts +1 -1
  53. package/dist/ui/index.d.ts +1 -1
  54. package/dist/ui/index.js +2 -2
  55. package/package.json +22 -1
  56. package/dist/chunk-AHIV4VYN.js +0 -10
  57. package/dist/chunk-CTJRZ7VA.js +0 -10
  58. package/dist/chunk-NDYVVFWW.js +0 -10
  59. package/dist/chunk-OTK4ZF2W.js +0 -10
  60. package/dist/chunk-WHLVNWIR.js +0 -10
@@ -1,2 +1,2 @@
1
- "use strict";var ei=Object.defineProperty;var Nn=Object.getOwnPropertyDescriptor;var yn=Object.getOwnPropertyNames;var xn=Object.prototype.hasOwnProperty;var wn=(t,e)=>{for(var r in e)ei(t,r,{get:e[r],enumerable:!0})},gn=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of yn(e))!xn.call(t,n)&&n!==r&&ei(t,n,{get:()=>e[n],enumerable:!(o=Nn(e,n))||o.enumerable});return t};var On=t=>gn(ei({},"__esModule",{value:!0}),t);var ps={};wn(ps,{createNodeSQLiteAdapter:()=>us,createNodeSQLiteExecutor:()=>fn});module.exports=On(ps);function te(t){let{error:e,query:r}=t,o=e;return o.query=r,[o]}var no={BLOB:{group:"raw"},INTEGER:{group:"numeric"},NULL:{group:"raw"},NUMERIC:{group:"numeric"},REAL:{group:"numeric"},TEXT:{group:"string"}};function so(t){if(!t)return"BLOB";let e=t.toUpperCase();return e.includes("INT")?"INTEGER":e.includes("TEXT")||e.includes("CHAR")||e.includes("CLOB")?"TEXT":e.includes("BLOB")?"BLOB":e.includes("REAL")||e.includes("FLOA")||e.includes("DOUB")?"REAL":"NUMERIC"}function G(t){return typeof t>"u"||t===void 0}function W(t){return typeof t=="string"}function Se(t){return typeof t=="number"}function Fe(t){return typeof t=="boolean"}function He(t){return t===null}function ao(t){return t instanceof Date}function Xe(t){return typeof t=="bigint"}function k(t){return typeof t=="function"}function B(t){return typeof t=="object"&&t!==null}function i(t){return Object.freeze(t)}function At(t){return F(t)?t:[t]}function F(t){return Array.isArray(t)}function z(t){return t}var h=i({is(t){return t.kind==="AlterTableNode"},create(t){return i({kind:"AlterTableNode",table:t})},cloneWithTableProps(t,e){return i({...t,...e})},cloneWithColumnAlteration(t,e){return i({...t,columnAlterations:t.columnAlterations?[...t.columnAlterations,e]:[e]})}});var d=i({is(t){return t.kind==="IdentifierNode"},create(t){return i({kind:"IdentifierNode",name:t})}});var ne=i({is(t){return t.kind==="CreateIndexNode"},create(t){return i({kind:"CreateIndexNode",name:d.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var Ut=i({is(t){return t.kind==="CreateSchemaNode"},create(t,e){return i({kind:"CreateSchemaNode",schema:d.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var uo=["preserve rows","delete rows","drop"],M=i({is(t){return t.kind==="CreateTableNode"},create(t){return i({kind:"CreateTableNode",table:t,columns:i([])})},cloneWithColumn(t,e){return i({...t,columns:i([...t.columns,e])})},cloneWithConstraint(t,e){return i({...t,constraints:t.constraints?i([...t.constraints,e]):i([e])})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWith(t,e){return i({...t,...e})}});var V=i({is(t){return t.kind==="SchemableIdentifierNode"},create(t){return i({kind:"SchemableIdentifierNode",identifier:d.create(t)})},createWithSchema(t,e){return i({kind:"SchemableIdentifierNode",schema:d.create(t),identifier:d.create(e)})}});var Ee=i({is(t){return t.kind==="DropIndexNode"},create(t,e){return i({kind:"DropIndexNode",name:V.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var St=i({is(t){return t.kind==="DropSchemaNode"},create(t,e){return i({kind:"DropSchemaNode",schema:d.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Et=i({is(t){return t.kind==="DropTableNode"},create(t,e){return i({kind:"DropTableNode",table:t,...e})},cloneWith(t,e){return i({...t,...e})}});var S=i({is(t){return t.kind==="AliasNode"},create(t,e){return i({kind:"AliasNode",node:t,alias:e})}});var U=i({is(t){return t.kind==="TableNode"},create(t){return i({kind:"TableNode",table:V.create(t)})},createWithSchema(t,e){return i({kind:"TableNode",table:V.createWithSchema(t,e)})}});function C(t){return B(t)&&k(t.toOperationNode)}function Jt(t){return B(t)&&"expressionType"in t&&C(t)}function po(t){return B(t)&&"expression"in t&&W(t.alias)&&C(t)}var le=i({is(t){return t.kind==="SelectModifierNode"},create(t,e){return i({kind:"SelectModifierNode",modifier:t,of:e})},createWithExpression(t){return i({kind:"SelectModifierNode",rawModifier:t})}});var $=i({is(t){return t.kind==="AndNode"},create(t,e){return i({kind:"AndNode",left:t,right:e})}});var se=i({is(t){return t.kind==="OrNode"},create(t,e){return i({kind:"OrNode",left:t,right:e})}});var $t=i({is(t){return t.kind==="OnNode"},create(t){return i({kind:"OnNode",on:t})},cloneWithOperation(t,e,r){return i({...t,on:e==="And"?$.create(t.on,r):se.create(t.on,r)})}});var ae=i({is(t){return t.kind==="JoinNode"},create(t,e){return i({kind:"JoinNode",joinType:t,table:e,on:void 0})},createWithOn(t,e,r){return i({kind:"JoinNode",joinType:t,table:e,on:$t.create(r)})},cloneWithOn(t,e){return i({...t,on:t.on?$t.cloneWithOperation(t.on,"And",e):$t.create(e)})}});var Re=i({is(t){return t.kind==="BinaryOperationNode"},create(t,e,r){return i({kind:"BinaryOperationNode",leftOperand:t,operator:e,rightOperand:r})}});var bn=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],Cn=["+","-","*","/","%","^","&","|","#","<<",">>"],co=["->","->>"],vn=[...bn,...Cn,"&&","||"],Wn=["exists","not exists"],kn=["not","-",...Wn],mo=[...vn,...co,...kn,"between","between symmetric"],Y=i({is(t){return t.kind==="OperatorNode"},create(t){return i({kind:"OperatorNode",operator:t})}});function ti(t){return W(t)&&co.includes(t)}var c=i({is(t){return t.kind==="ColumnNode"},create(t){return i({kind:"ColumnNode",column:d.create(t)})}});var Ze=i({is(t){return t.kind==="SelectAllNode"},create(){return i({kind:"SelectAllNode"})}});var Oe=i({is(t){return t.kind==="ReferenceNode"},create(t,e){return i({kind:"ReferenceNode",table:e,column:t})},createSelectAll(t){return i({kind:"ReferenceNode",table:t,column:Ze.create()})}});var jt=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return ri(this.#e)}};function Kt(t){return B(t)&&C(t)&&W(t.dynamicReference)}var ue=i({is(t){return t.kind==="OrderByItemNode"},create(t,e){return i({kind:"OrderByItemNode",orderBy:t,direction:e})},cloneWith(t,e){return i({...t,...e})}});var w=i({is(t){return t.kind==="RawNode"},create(t,e){return i({kind:"RawNode",sqlFragments:i(t),parameters:i(e)})},createWithSql(t){return w.create([t],[])},createWithChild(t){return w.create(["",""],[t])},createWithChildren(t){return w.create(new Array(t.length+1).fill(""),t)}});var ho={is(t){return t.kind==="CollateNode"},create(t){return i({kind:"CollateNode",collation:d.create(t)})}};var Gt=class t{#e;constructor(e){this.#e=i(e)}desc(){return new t({node:ue.cloneWith(this.#e.node,{direction:w.createWithSql("desc")})})}asc(){return new t({node:ue.cloneWith(this.#e.node,{direction:w.createWithSql("asc")})})}nullsLast(){return new t({node:ue.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new t({node:ue.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new t({node:ue.cloneWith(this.#e.node,{collation:ho.create(e)})})}toOperationNode(){return this.#e.node}};var lo=new Set;function fe(t){lo.has(t)||(lo.add(t),console.log(t))}function oi(t){return t==="asc"||t==="desc"}function X(t){if(t.length===2)return[ii(t[0],t[1])];if(t.length===1){let[e]=t;return Array.isArray(e)?(fe("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(r=>ii(r))):[ii(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${t.length}`)}function ii(t,e){let r=Tn(t);if(ue.is(r)){if(e)throw new Error("Cannot specify direction twice!");return r}return fo(r,e)}function Tn(t){if(be(t))return j(t);if(Kt(t))return t.toOperationNode();let[e,r]=t.split(" ");return r?(fe("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),fo(H(e),r)):H(t)}function fo(t,e){if(typeof e=="string"){if(!oi(e))throw new Error(`Invalid order by direction: ${e}`);return ue.create(t,w.createWithSql(e))}if(Jt(e))return fe("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),ue.create(t,e.toOperationNode());let r=ue.create(t);return e?e(new Gt({node:r})).toOperationNode():r}var _e=i({is(t){return t.kind==="JSONReferenceNode"},create(t,e){return i({kind:"JSONReferenceNode",reference:t,traversal:e})},cloneWithTraversal(t,e){return i({...t,traversal:e})}});var Yt=i({is(t){return t.kind==="JSONOperatorChainNode"},create(t){return i({kind:"JSONOperatorChainNode",operator:t,values:i([])})},cloneWithValue(t,e){return i({...t,values:i([...t.values,e])})}});var Ie=i({is(t){return t.kind==="JSONPathNode"},create(t){return i({kind:"JSONPathNode",inOperator:t,pathLegs:i([])})},cloneWithLeg(t,e){return i({...t,pathLegs:i([...t.pathLegs,e])})}});function ri(t){return W(t)?H(t):t.toOperationNode()}function Ce(t){return F(t)?t.map(e=>L(e)):[L(t)]}function L(t){return be(t)?j(t):ri(t)}function No(t,e){let r=H(t);if(ti(e))return _e.create(r,Yt.create(Y.create(e)));let o=e.slice(0,-1);if(ti(o))return _e.create(r,Ie.create(Y.create(o)));throw new Error(`Invalid JSON operator: ${e}`)}function H(t){let e=".";if(!t.includes(e))return Oe.create(c.create(t));let r=t.split(e).map(si);if(r.length===3)return An(r);if(r.length===2)return Sn(r);throw new Error(`invalid column reference ${t}`)}function yo(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(si);return S.create(H(r),d.create(o))}else return H(t)}function ni(t){return c.create(t)}function et(t){let e=" ";if(t.includes(e)){let[r,o]=t.split(e).map(si);if(!oi(o))throw new Error(`invalid order direction "${o}" next to "${r}"`);return X([r,o])[0]}else return ni(t)}function An(t){let[e,r,o]=t;return Oe.create(c.create(o),U.createWithSchema(e,r))}function Sn(t){let[e,r]=t;return Oe.create(c.create(r),U.create(e))}function si(t){return t.trim()}var Ht=i({is(t){return t.kind==="PrimitiveValueListNode"},create(t){return i({kind:"PrimitiveValueListNode",values:i([...t])})}});var Ne=i({is(t){return t.kind==="ValueListNode"},create(t){return i({kind:"ValueListNode",values:i(t)})}});var T=i({is(t){return t.kind==="ValueNode"},create(t){return i({kind:"ValueNode",value:t})},createImmediate(t){return i({kind:"ValueNode",value:t,immediate:!0})}});function xo(t){return F(t)?En(t):g(t)}function g(t){return be(t)?j(t):T.create(t)}function Xt(t){return Se(t)||Fe(t)||He(t)}function Rt(t){if(!Xt(t))throw new Error(`unsafe immediate value ${JSON.stringify(t)}`);return T.createImmediate(t)}function En(t){return t.some(be)?Ne.create(t.map(e=>g(e))):Ht.create(t)}var Z=i({is(t){return t.kind==="ParensNode"},create(t){return i({kind:"ParensNode",node:t})}});function O(t){if(t.length===3)return Zt(t[0],t[1],t[2]);if(t.length===1)return g(t[0]);throw new Error(`invalid arguments: ${JSON.stringify(t)}`)}function Zt(t,e,r){return Rn(e)&&go(r)?Re.create(L(t),ai(e),T.createImmediate(r)):Re.create(L(t),ai(e),xo(r))}function D(t,e,r){return Re.create(L(t),ai(e),L(r))}function ui(t,e){return tt(Object.entries(t).filter(([,r])=>!G(r)).map(([r,o])=>Zt(r,go(o)?"is":"=",o)),e)}function tt(t,e,r=!0){let o=e==="and"?$.create:se.create;if(t.length===0)return Re.create(T.createImmediate(1),Y.create("="),T.createImmediate(e==="and"?1:0));let n=wo(t[0]);for(let a=1;a<t.length;++a)n=o(n,wo(t[a]));return t.length>1&&r?Z.create(n):n}function Rn(t){return t==="is"||t==="is not"}function go(t){return He(t)||Fe(t)}function ai(t){if(W(t)&&mo.includes(t))return Y.create(t);if(C(t))return t.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(t)}`)}function wo(t){return C(t)?t.toOperationNode():t}var ve=i({is(t){return t.kind==="OrderByNode"},create(t){return i({kind:"OrderByNode",items:i([...t])})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var pi=i({is(t){return t.kind==="PartitionByNode"},create(t){return i({kind:"PartitionByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var It=i({is(t){return t.kind==="OverNode"},create(){return i({kind:"OverNode"})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?ve.cloneWithItems(t.orderBy,e):ve.create(e)})},cloneWithPartitionByItems(t,e){return i({...t,partitionBy:t.partitionBy?pi.cloneWithItems(t.partitionBy,e):pi.create(e)})}});var Me=i({is(t){return t.kind==="FromNode"},create(t){return i({kind:"FromNode",froms:i(t)})},cloneWithFroms(t,e){return i({...t,froms:i([...t.froms,...e])})}});var di=i({is(t){return t.kind==="GroupByNode"},create(t){return i({kind:"GroupByNode",items:i(t)})},cloneWithItems(t,e){return i({...t,items:i([...t.items,...e])})}});var ci=i({is(t){return t.kind==="HavingNode"},create(t){return i({kind:"HavingNode",having:t})},cloneWithOperation(t,e,r){return i({...t,having:e==="And"?$.create(t.having,r):se.create(t.having,r)})}});var A=i({is(t){return t.kind==="InsertQueryNode"},create(t,e,r){return i({kind:"InsertQueryNode",into:t,...e&&{with:e},replace:r})},createWithoutInto(){return i({kind:"InsertQueryNode"})},cloneWith(t,e){return i({...t,...e})}});var _t=i({is(t){return t.kind==="ListNode"},create(t){return i({kind:"ListNode",items:i(t)})}});var ye=i({is(t){return t.kind==="UpdateQueryNode"},create(t,e){return i({kind:"UpdateQueryNode",table:t.length===1?t[0]:_t.create(t),...e&&{with:e}})},createWithoutTable(){return i({kind:"UpdateQueryNode"})},cloneWithFromItems(t,e){return i({...t,from:t.from?Me.cloneWithFroms(t.from,e):Me.create(e)})},cloneWithUpdates(t,e){return i({...t,updates:t.updates?i([...t.updates,...e]):e})},cloneWithLimit(t,e){return i({...t,limit:e})}});var mi=i({is(t){return t.kind==="UsingNode"},create(t){return i({kind:"UsingNode",tables:i(t)})},cloneWithTables(t,e){return i({...t,tables:i([...t.tables,...e])})}});var De=i({is(t){return t.kind==="DeleteQueryNode"},create(t,e){return i({kind:"DeleteQueryNode",from:Me.create(t),...e&&{with:e}})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithUsing(t,e){return i({...t,using:t.using!==void 0?mi.cloneWithTables(t.using,e):mi.create(e)})}});var Q=i({is(t){return t.kind==="WhereNode"},create(t){return i({kind:"WhereNode",where:t})},cloneWithOperation(t,e,r){return i({...t,where:e==="And"?$.create(t.where,r):se.create(t.where,r)})}});var hi=i({is(t){return t.kind==="ReturningNode"},create(t){return i({kind:"ReturningNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var Oo=i({is(t){return t.kind==="ExplainNode"},create(t,e){return i({kind:"ExplainNode",format:t,options:e})}});var re=i({is(t){return t.kind==="WhenNode"},create(t){return i({kind:"WhenNode",condition:t})},cloneWithResult(t,e){return i({...t,result:e})}});var _=i({is(t){return t.kind==="MergeQueryNode"},create(t,e){return i({kind:"MergeQueryNode",into:t,...e&&{with:e}})},cloneWithUsing(t,e){return i({...t,using:e})},cloneWithWhen(t,e){return i({...t,whens:t.whens?i([...t.whens,e]):i([e])})},cloneWithThen(t,e){return i({...t,whens:t.whens?i([...t.whens.slice(0,-1),re.cloneWithResult(t.whens[t.whens.length-1],e)]):void 0})}});var li=i({is(t){return t.kind==="OutputNode"},create(t){return i({kind:"OutputNode",selections:i(t)})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})}});var u=i({is(t){return x.is(t)||A.is(t)||ye.is(t)||De.is(t)||_.is(t)},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):i([e])})},cloneWithWhere(t,e){return i({...t,where:t.where?Q.cloneWithOperation(t.where,"And",e):Q.create(e)})},cloneWithJoin(t,e){return i({...t,joins:t.joins?i([...t.joins,e]):i([e])})},cloneWithReturning(t,e){return i({...t,returning:t.returning?hi.cloneWithSelections(t.returning,e):hi.create(e)})},cloneWithoutReturning(t){return i({...t,returning:void 0})},cloneWithoutWhere(t){return i({...t,where:void 0})},cloneWithExplain(t,e,r){return i({...t,explain:Oo.create(e,r?.toOperationNode())})},cloneWithTop(t,e){return i({...t,top:e})},cloneWithOutput(t,e){return i({...t,output:t.output?li.cloneWithSelections(t.output,e):li.create(e)})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?ve.cloneWithItems(t.orderBy,e):ve.create(e)})},cloneWithoutOrderBy(t){return i({...t,orderBy:void 0})}});var x=i({is(t){return t.kind==="SelectQueryNode"},create(t){return i({kind:"SelectQueryNode",...t&&{with:t}})},createFrom(t,e){return i({kind:"SelectQueryNode",from:Me.create(t),...e&&{with:e}})},cloneWithSelections(t,e){return i({...t,selections:t.selections?i([...t.selections,...e]):i(e)})},cloneWithDistinctOn(t,e){return i({...t,distinctOn:t.distinctOn?i([...t.distinctOn,...e]):i(e)})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):i([e])})},cloneWithOrderByItems:(t,e)=>u.cloneWithOrderByItems(t,e),cloneWithGroupByItems(t,e){return i({...t,groupBy:t.groupBy?di.cloneWithItems(t.groupBy,e):di.create(e)})},cloneWithLimit(t,e){return i({...t,limit:e})},cloneWithOffset(t,e){return i({...t,offset:e})},cloneWithFetch(t,e){return i({...t,fetch:e})},cloneWithHaving(t,e){return i({...t,having:t.having?ci.cloneWithOperation(t.having,"And",e):ci.create(e)})},cloneWithSetOperations(t,e){return i({...t,setOperations:t.setOperations?i([...t.setOperations,...e]):i([...e])})},cloneWithoutSelections(t){return i({...t,selections:[]})},cloneWithoutLimit(t){return i({...t,limit:void 0})},cloneWithoutOffset(t){return i({...t,offset:void 0})},cloneWithoutOrderBy:t=>u.cloneWithoutOrderBy(t),cloneWithoutGroupBy(t){return i({...t,groupBy:void 0})}});var er=class t{#e;constructor(e){this.#e=i(e)}on(...e){return new t({...this.#e,joinNode:ae.cloneWithOn(this.#e.joinNode,O(e))})}onRef(e,r,o){return new t({...this.#e,joinNode:ae.cloneWithOn(this.#e.joinNode,D(e,r,o))})}onTrue(){return new t({...this.#e,joinNode:ae.cloneWithOn(this.#e.joinNode,w.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};var bo=i({is(t){return t.kind==="PartitionByItemNode"},create(t){return i({kind:"PartitionByItemNode",partitionBy:t})}});function Co(t){return Ce(t).map(bo.create)}var tr=class t{#e;constructor(e){this.#e=i(e)}orderBy(...e){return new t({overNode:It.cloneWithOrderByItems(this.#e.overNode,X(e))})}clearOrderBy(){return new t({overNode:u.cloneWithoutOrderBy(this.#e.overNode)})}partitionBy(e){return new t({overNode:It.cloneWithPartitionByItems(this.#e.overNode,Co(e))})}$call(e){return e(this)}toOperationNode(){return this.#e.overNode}};var rt=i({is(t){return t.kind==="SelectionNode"},create(t){return i({kind:"SelectionNode",selection:t})},createSelectAll(){return i({kind:"SelectionNode",selection:Ze.create()})},createSelectAllFromTable(t){return i({kind:"SelectionNode",selection:Oe.createSelectAll(t)})}});function R(t){return k(t)?R(t(I())):F(t)?t.map(e=>vo(e)):[vo(t)]}function vo(t){return W(t)?rt.create(yo(t)):Kt(t)?rt.create(t.toOperationNode()):rt.create(rr(t))}function q(t){return t?Array.isArray(t)?t.map(Wo):[Wo(t)]:[rt.createSelectAll()]}function Wo(t){if(W(t))return rt.createSelectAllFromTable(l(t));throw new Error(`invalid value selectAll expression: ${JSON.stringify(t)}`)}var ko=i({is(t){return t.kind==="ValuesNode"},create(t){return i({kind:"ValuesNode",values:i(t)})}});var To=i({is(t){return t.kind==="DefaultInsertValueNode"},create(){return i({kind:"DefaultInsertValueNode"})}});function ir(t){let e=k(t)?t(I()):t,r=F(e)?e:i([e]);return In(r)}function In(t){let e=Dn(t);return[i([...e.keys()].map(c.create)),ko.create(t.map(r=>qn(r,e)))]}function Dn(t){let e=new Map;for(let r of t){let o=Object.keys(r);for(let n of o)!e.has(n)&&r[n]!==void 0&&e.set(n,e.size)}return e}function qn(t,e){let r=Object.keys(t),o=Array.from({length:e.size}),n=!1,a=r.length;for(let m of r){let y=e.get(m);if(G(y)){a--;continue}let b=t[m];(G(b)||be(b))&&(n=!0),o[y]=b}if(a<e.size||n){let m=To.create();return Ne.create(o.map(y=>G(y)?m:g(y)))}return Ht.create(o)}var fi=i({is(t){return t.kind==="ColumnUpdateNode"},create(t,e){return i({kind:"ColumnUpdateNode",column:t,value:e})}});function Ao(...t){return t.length===2?[fi.create(L(t[0]),g(t[1]))]:Dt(t[0])}function Dt(t){let e=k(t)?t(I()):t;return Object.entries(e).filter(([r,o])=>o!==void 0).map(([r,o])=>fi.create(c.create(r),g(o)))}var So=i({is(t){return t.kind==="OnDuplicateKeyNode"},create(t){return i({kind:"OnDuplicateKeyNode",updates:t})}});var or=class{insertId;numInsertedOrUpdatedRows;constructor(e,r){this.insertId=e,this.numInsertedOrUpdatedRows=r}};var ie=class extends Error{node;constructor(e){super("no result"),this.node=e}};function xe(t){return Object.prototype.hasOwnProperty.call(t,"prototype")}var J=i({is(t){return t.kind==="OnConflictNode"},create(){return i({kind:"OnConflictNode"})},cloneWith(t,e){return i({...t,...e})},cloneWithIndexWhere(t,e){return i({...t,indexWhere:t.indexWhere?Q.cloneWithOperation(t.indexWhere,"And",e):Q.create(e)})},cloneWithIndexOrWhere(t,e){return i({...t,indexWhere:t.indexWhere?Q.cloneWithOperation(t.indexWhere,"Or",e):Q.create(e)})},cloneWithUpdateWhere(t,e){return i({...t,updateWhere:t.updateWhere?Q.cloneWithOperation(t.updateWhere,"And",e):Q.create(e)})},cloneWithUpdateOrWhere(t,e){return i({...t,updateWhere:t.updateWhere?Q.cloneWithOperation(t.updateWhere,"Or",e):Q.create(e)})},cloneWithoutIndexWhere(t){return i({...t,indexWhere:void 0})},cloneWithoutUpdateWhere(t){return i({...t,updateWhere:void 0})}});var nr=class t{#e;constructor(e){this.#e=i(e)}column(e){let r=c.create(e);return new t({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,r]):i([r])})})}columns(e){let r=e.map(c.create);return new t({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,...r]):i(r)})})}constraint(e){return new t({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{constraint:d.create(e)})})}expression(e){return new t({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new t({...this.#e,onConflictNode:J.cloneWithIndexWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:J.cloneWithIndexWhere(this.#e.onConflictNode,D(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:J.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new Ni({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new yi({...this.#e,onConflictNode:J.cloneWith(this.#e.onConflictNode,{updates:Dt(e)})})}$call(e){return e(this)}},Ni=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.onConflictNode}},yi=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,onConflictNode:J.cloneWithUpdateWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:J.cloneWithUpdateWhere(this.#e.onConflictNode,D(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:J.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};var Eo=i({is(t){return t.kind==="TopNode"},create(t,e){return i({kind:"TopNode",expression:t,modifiers:e})}});function pe(t,e){if(!Se(t)&&!Xe(t))throw new Error(`Invalid top expression: ${t}`);if(!G(e)&&!Bn(e))throw new Error(`Invalid top modifiers: ${e}`);return Eo.create(t,e)}function Bn(t){return t==="percent"||t==="with ties"||t==="percent with ties"}var Ve=i({is(t){return t.kind==="OrActionNode"},create(t){return i({kind:"OrActionNode",action:t})}});var qt=class t{#e;constructor(e){this.#e=i(e)}values(e){let[r,o]=ir(e);return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{columns:r,values:o})})}columns(e){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{columns:i(e.map(c.create))})})}expression(e){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{values:j(e)})})}defaultValues(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{defaultValues:!0})})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}ignore(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orIgnore(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orAbort(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("abort")})})}orFail(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("fail")})})}orReplace(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("replace")})})}orRollback(){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{orAction:Ve.create("rollback")})})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}onConflict(e){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{onConflict:e(new nr({onConflictNode:J.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new t({...this.#e,queryNode:A.cloneWith(this.#e.queryNode,{onDuplicateKey:So.create(Dt(e))})})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,R(e))})}returningAll(){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,q())})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,R(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,q(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new or(r.insertId,r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ie){let r=await this.executeTakeFirst();if(r===void 0)throw xe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var sr=class{numDeletedRows;constructor(e){this.numDeletedRows=e}};var it=i({is(t){return t.kind==="LimitNode"},create(t){return i({kind:"LimitNode",limit:t})}});var ar=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,D(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}using(e){return new t({...this.#e,queryNode:De.cloneWithUsing(this.#e.queryNode,de(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,qe(e,r))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,R(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,q(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,R(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,q(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:De.cloneWithoutLimit(this.#e.queryNode)})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,X(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:De.cloneWithLimit(this.#e.queryNode,it.create(g(e)))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new sr(r.numAffectedRows??BigInt(0))]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ie){let r=await this.executeTakeFirst();if(r===void 0)throw xe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var ur=class{numUpdatedRows;numChangedRows;constructor(e,r){this.numUpdatedRows=e,this.numChangedRows=r}};var ot=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,D(e,r,o))})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}from(e){return new t({...this.#e,queryNode:ye.cloneWithFromItems(this.#e.queryNode,de(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,qe(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,X(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:ye.cloneWithLimit(this.#e.queryNode,it.create(g(e)))})}set(...e){return new t({...this.#e,queryNode:ye.cloneWithUpdates(this.#e.queryNode,Ao(...e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,R(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,q(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,R(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,q(e))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new ur(r.numAffectedRows??BigInt(0),r.numChangedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ie){let r=await this.executeTakeFirst();if(r===void 0)throw xe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};var xi=i({is(t){return t.kind==="CommonTableExpressionNameNode"},create(t,e){return i({kind:"CommonTableExpressionNameNode",table:U.create(t),columns:e?i(e.map(c.create)):void 0})}});var nt=i({is(t){return t.kind==="CommonTableExpressionNode"},create(t,e){return i({kind:"CommonTableExpressionNode",name:t,expression:e})},cloneWith(t,e){return i({...t,...e})}});var pr=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:nt.cloneWith(this.#e.node,{materialized:!0})})}notMaterialized(){return new t({...this.#e,node:nt.cloneWith(this.#e.node,{materialized:!1})})}toOperationNode(){return this.#e.node}};function wi(t,e){let r=e(Io()).toOperationNode();return k(t)?t(Ln(r)).toOperationNode():nt.create(Ro(t),r)}function Ln(t){return e=>new pr({node:nt.create(Ro(e),t)})}function Ro(t){if(t.includes("(")){let e=t.split(/[\(\)]/),r=e[0],o=e[1].split(",").map(n=>n.trim());return xi.create(r,o)}else return xi.create(t)}var Bt=i({is(t){return t.kind==="WithNode"},create(t,e){return i({kind:"WithNode",expressions:i([t]),...e})},cloneWithExpression(t,e){return i({...t,expressions:i([...t.expressions,e])})}});var Do=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"];function qo(t){let e="";for(let r=0;r<t;++r)e+=Qn();return e}function Qn(){return Do[~~(Math.random()*Do.length)]}function f(){return new gi}var gi=class{#e;get queryId(){return this.#e===void 0&&(this.#e=qo(8)),this.#e}};var Be=class{nodeStack=[];#e=i({AliasNode:this.transformAlias.bind(this),ColumnNode:this.transformColumn.bind(this),IdentifierNode:this.transformIdentifier.bind(this),SchemableIdentifierNode:this.transformSchemableIdentifier.bind(this),RawNode:this.transformRaw.bind(this),ReferenceNode:this.transformReference.bind(this),SelectQueryNode:this.transformSelectQuery.bind(this),SelectionNode:this.transformSelection.bind(this),TableNode:this.transformTable.bind(this),FromNode:this.transformFrom.bind(this),SelectAllNode:this.transformSelectAll.bind(this),AndNode:this.transformAnd.bind(this),OrNode:this.transformOr.bind(this),ValueNode:this.transformValue.bind(this),ValueListNode:this.transformValueList.bind(this),PrimitiveValueListNode:this.transformPrimitiveValueList.bind(this),ParensNode:this.transformParens.bind(this),JoinNode:this.transformJoin.bind(this),OperatorNode:this.transformOperator.bind(this),WhereNode:this.transformWhere.bind(this),InsertQueryNode:this.transformInsertQuery.bind(this),DeleteQueryNode:this.transformDeleteQuery.bind(this),ReturningNode:this.transformReturning.bind(this),CreateTableNode:this.transformCreateTable.bind(this),AddColumnNode:this.transformAddColumn.bind(this),ColumnDefinitionNode:this.transformColumnDefinition.bind(this),DropTableNode:this.transformDropTable.bind(this),DataTypeNode:this.transformDataType.bind(this),OrderByNode:this.transformOrderBy.bind(this),OrderByItemNode:this.transformOrderByItem.bind(this),GroupByNode:this.transformGroupBy.bind(this),GroupByItemNode:this.transformGroupByItem.bind(this),UpdateQueryNode:this.transformUpdateQuery.bind(this),ColumnUpdateNode:this.transformColumnUpdate.bind(this),LimitNode:this.transformLimit.bind(this),OffsetNode:this.transformOffset.bind(this),OnConflictNode:this.transformOnConflict.bind(this),OnDuplicateKeyNode:this.transformOnDuplicateKey.bind(this),CreateIndexNode:this.transformCreateIndex.bind(this),DropIndexNode:this.transformDropIndex.bind(this),ListNode:this.transformList.bind(this),PrimaryKeyConstraintNode:this.transformPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.transformUniqueConstraint.bind(this),ReferencesNode:this.transformReferences.bind(this),CheckConstraintNode:this.transformCheckConstraint.bind(this),WithNode:this.transformWith.bind(this),CommonTableExpressionNode:this.transformCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.transformCommonTableExpressionName.bind(this),HavingNode:this.transformHaving.bind(this),CreateSchemaNode:this.transformCreateSchema.bind(this),DropSchemaNode:this.transformDropSchema.bind(this),AlterTableNode:this.transformAlterTable.bind(this),DropColumnNode:this.transformDropColumn.bind(this),RenameColumnNode:this.transformRenameColumn.bind(this),AlterColumnNode:this.transformAlterColumn.bind(this),ModifyColumnNode:this.transformModifyColumn.bind(this),AddConstraintNode:this.transformAddConstraint.bind(this),DropConstraintNode:this.transformDropConstraint.bind(this),RenameConstraintNode:this.transformRenameConstraint.bind(this),ForeignKeyConstraintNode:this.transformForeignKeyConstraint.bind(this),CreateViewNode:this.transformCreateView.bind(this),RefreshMaterializedViewNode:this.transformRefreshMaterializedView.bind(this),DropViewNode:this.transformDropView.bind(this),GeneratedNode:this.transformGenerated.bind(this),DefaultValueNode:this.transformDefaultValue.bind(this),OnNode:this.transformOn.bind(this),ValuesNode:this.transformValues.bind(this),SelectModifierNode:this.transformSelectModifier.bind(this),CreateTypeNode:this.transformCreateType.bind(this),DropTypeNode:this.transformDropType.bind(this),ExplainNode:this.transformExplain.bind(this),DefaultInsertValueNode:this.transformDefaultInsertValue.bind(this),AggregateFunctionNode:this.transformAggregateFunction.bind(this),OverNode:this.transformOver.bind(this),PartitionByNode:this.transformPartitionBy.bind(this),PartitionByItemNode:this.transformPartitionByItem.bind(this),SetOperationNode:this.transformSetOperation.bind(this),BinaryOperationNode:this.transformBinaryOperation.bind(this),UnaryOperationNode:this.transformUnaryOperation.bind(this),UsingNode:this.transformUsing.bind(this),FunctionNode:this.transformFunction.bind(this),CaseNode:this.transformCase.bind(this),WhenNode:this.transformWhen.bind(this),JSONReferenceNode:this.transformJSONReference.bind(this),JSONPathNode:this.transformJSONPath.bind(this),JSONPathLegNode:this.transformJSONPathLeg.bind(this),JSONOperatorChainNode:this.transformJSONOperatorChain.bind(this),TupleNode:this.transformTuple.bind(this),MergeQueryNode:this.transformMergeQuery.bind(this),MatchedNode:this.transformMatched.bind(this),AddIndexNode:this.transformAddIndex.bind(this),CastNode:this.transformCast.bind(this),FetchNode:this.transformFetch.bind(this),TopNode:this.transformTop.bind(this),OutputNode:this.transformOutput.bind(this),OrActionNode:this.transformOrAction.bind(this),CollateNode:this.transformCollate.bind(this)});transformNode(e,r){if(!e)return e;this.nodeStack.push(e);let o=this.transformNodeImpl(e,r);return this.nodeStack.pop(),i(o)}transformNodeImpl(e,r){return this.#e[e.kind](e,r)}transformNodeList(e,r){return e&&i(e.map(o=>this.transformNode(o,r)))}transformSelectQuery(e,r){return{kind:"SelectQueryNode",from:this.transformNode(e.from,r),selections:this.transformNodeList(e.selections,r),distinctOn:this.transformNodeList(e.distinctOn,r),joins:this.transformNodeList(e.joins,r),groupBy:this.transformNode(e.groupBy,r),orderBy:this.transformNode(e.orderBy,r),where:this.transformNode(e.where,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),limit:this.transformNode(e.limit,r),offset:this.transformNode(e.offset,r),with:this.transformNode(e.with,r),having:this.transformNode(e.having,r),explain:this.transformNode(e.explain,r),setOperations:this.transformNodeList(e.setOperations,r),fetch:this.transformNode(e.fetch,r),top:this.transformNode(e.top,r)}}transformSelection(e,r){return{kind:"SelectionNode",selection:this.transformNode(e.selection,r)}}transformColumn(e,r){return{kind:"ColumnNode",column:this.transformNode(e.column,r)}}transformAlias(e,r){return{kind:"AliasNode",node:this.transformNode(e.node,r),alias:this.transformNode(e.alias,r)}}transformTable(e,r){return{kind:"TableNode",table:this.transformNode(e.table,r)}}transformFrom(e,r){return{kind:"FromNode",froms:this.transformNodeList(e.froms,r)}}transformReference(e,r){return{kind:"ReferenceNode",column:this.transformNode(e.column,r),table:this.transformNode(e.table,r)}}transformAnd(e,r){return{kind:"AndNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformOr(e,r){return{kind:"OrNode",left:this.transformNode(e.left,r),right:this.transformNode(e.right,r)}}transformValueList(e,r){return{kind:"ValueListNode",values:this.transformNodeList(e.values,r)}}transformParens(e,r){return{kind:"ParensNode",node:this.transformNode(e.node,r)}}transformJoin(e,r){return{kind:"JoinNode",joinType:e.joinType,table:this.transformNode(e.table,r),on:this.transformNode(e.on,r)}}transformRaw(e,r){return{kind:"RawNode",sqlFragments:i([...e.sqlFragments]),parameters:this.transformNodeList(e.parameters,r)}}transformWhere(e,r){return{kind:"WhereNode",where:this.transformNode(e.where,r)}}transformInsertQuery(e,r){return{kind:"InsertQueryNode",into:this.transformNode(e.into,r),columns:this.transformNodeList(e.columns,r),values:this.transformNode(e.values,r),returning:this.transformNode(e.returning,r),onConflict:this.transformNode(e.onConflict,r),onDuplicateKey:this.transformNode(e.onDuplicateKey,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),ignore:e.ignore,orAction:this.transformNode(e.orAction,r),replace:e.replace,explain:this.transformNode(e.explain,r),defaultValues:e.defaultValues,top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformValues(e,r){return{kind:"ValuesNode",values:this.transformNodeList(e.values,r)}}transformDeleteQuery(e,r){return{kind:"DeleteQueryNode",from:this.transformNode(e.from,r),using:this.transformNode(e.using,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),orderBy:this.transformNode(e.orderBy,r),limit:this.transformNode(e.limit,r),explain:this.transformNode(e.explain,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r)}}transformReturning(e,r){return{kind:"ReturningNode",selections:this.transformNodeList(e.selections,r)}}transformCreateTable(e,r){return{kind:"CreateTableNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),constraints:this.transformNodeList(e.constraints,r),temporary:e.temporary,ifNotExists:e.ifNotExists,onCommit:e.onCommit,frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),selectQuery:this.transformNode(e.selectQuery,r)}}transformColumnDefinition(e,r){return{kind:"ColumnDefinitionNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),references:this.transformNode(e.references,r),primaryKey:e.primaryKey,autoIncrement:e.autoIncrement,unique:e.unique,notNull:e.notNull,unsigned:e.unsigned,defaultTo:this.transformNode(e.defaultTo,r),check:this.transformNode(e.check,r),generated:this.transformNode(e.generated,r),frontModifiers:this.transformNodeList(e.frontModifiers,r),endModifiers:this.transformNodeList(e.endModifiers,r),nullsNotDistinct:e.nullsNotDistinct,identity:e.identity,ifNotExists:e.ifNotExists}}transformAddColumn(e,r){return{kind:"AddColumnNode",column:this.transformNode(e.column,r)}}transformDropTable(e,r){return{kind:"DropTableNode",table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformOrderBy(e,r){return{kind:"OrderByNode",items:this.transformNodeList(e.items,r)}}transformOrderByItem(e,r){return{kind:"OrderByItemNode",orderBy:this.transformNode(e.orderBy,r),direction:this.transformNode(e.direction,r),collation:this.transformNode(e.collation,r),nulls:e.nulls}}transformGroupBy(e,r){return{kind:"GroupByNode",items:this.transformNodeList(e.items,r)}}transformGroupByItem(e,r){return{kind:"GroupByItemNode",groupBy:this.transformNode(e.groupBy,r)}}transformUpdateQuery(e,r){return{kind:"UpdateQueryNode",table:this.transformNode(e.table,r),from:this.transformNode(e.from,r),joins:this.transformNodeList(e.joins,r),where:this.transformNode(e.where,r),updates:this.transformNodeList(e.updates,r),returning:this.transformNode(e.returning,r),endModifiers:this.transformNodeList(e.endModifiers,r),with:this.transformNode(e.with,r),explain:this.transformNode(e.explain,r),limit:this.transformNode(e.limit,r),top:this.transformNode(e.top,r),output:this.transformNode(e.output,r),orderBy:this.transformNode(e.orderBy,r)}}transformColumnUpdate(e,r){return{kind:"ColumnUpdateNode",column:this.transformNode(e.column,r),value:this.transformNode(e.value,r)}}transformLimit(e,r){return{kind:"LimitNode",limit:this.transformNode(e.limit,r)}}transformOffset(e,r){return{kind:"OffsetNode",offset:this.transformNode(e.offset,r)}}transformOnConflict(e,r){return{kind:"OnConflictNode",columns:this.transformNodeList(e.columns,r),constraint:this.transformNode(e.constraint,r),indexExpression:this.transformNode(e.indexExpression,r),indexWhere:this.transformNode(e.indexWhere,r),updates:this.transformNodeList(e.updates,r),updateWhere:this.transformNode(e.updateWhere,r),doNothing:e.doNothing}}transformOnDuplicateKey(e,r){return{kind:"OnDuplicateKeyNode",updates:this.transformNodeList(e.updates,r)}}transformCreateIndex(e,r){return{kind:"CreateIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists,where:this.transformNode(e.where,r),nullsNotDistinct:e.nullsNotDistinct}}transformList(e,r){return{kind:"ListNode",items:this.transformNodeList(e.items,r)}}transformDropIndex(e,r){return{kind:"DropIndexNode",name:this.transformNode(e.name,r),table:this.transformNode(e.table,r),ifExists:e.ifExists,cascade:e.cascade}}transformPrimaryKeyConstraint(e,r){return{kind:"PrimaryKeyConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformUniqueConstraint(e,r){return{kind:"UniqueConstraintNode",columns:this.transformNodeList(e.columns,r),name:this.transformNode(e.name,r),nullsNotDistinct:e.nullsNotDistinct,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformForeignKeyConstraint(e,r){return{kind:"ForeignKeyConstraintNode",columns:this.transformNodeList(e.columns,r),references:this.transformNode(e.references,r),name:this.transformNode(e.name,r),onDelete:e.onDelete,onUpdate:e.onUpdate,deferrable:e.deferrable,initiallyDeferred:e.initiallyDeferred}}transformSetOperation(e,r){return{kind:"SetOperationNode",operator:e.operator,expression:this.transformNode(e.expression,r),all:e.all}}transformReferences(e,r){return{kind:"ReferencesNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r),onDelete:e.onDelete,onUpdate:e.onUpdate}}transformCheckConstraint(e,r){return{kind:"CheckConstraintNode",expression:this.transformNode(e.expression,r),name:this.transformNode(e.name,r)}}transformWith(e,r){return{kind:"WithNode",expressions:this.transformNodeList(e.expressions,r),recursive:e.recursive}}transformCommonTableExpression(e,r){return{kind:"CommonTableExpressionNode",name:this.transformNode(e.name,r),materialized:e.materialized,expression:this.transformNode(e.expression,r)}}transformCommonTableExpressionName(e,r){return{kind:"CommonTableExpressionNameNode",table:this.transformNode(e.table,r),columns:this.transformNodeList(e.columns,r)}}transformHaving(e,r){return{kind:"HavingNode",having:this.transformNode(e.having,r)}}transformCreateSchema(e,r){return{kind:"CreateSchemaNode",schema:this.transformNode(e.schema,r),ifNotExists:e.ifNotExists}}transformDropSchema(e,r){return{kind:"DropSchemaNode",schema:this.transformNode(e.schema,r),ifExists:e.ifExists,cascade:e.cascade}}transformAlterTable(e,r){return{kind:"AlterTableNode",table:this.transformNode(e.table,r),renameTo:this.transformNode(e.renameTo,r),setSchema:this.transformNode(e.setSchema,r),columnAlterations:this.transformNodeList(e.columnAlterations,r),addConstraint:this.transformNode(e.addConstraint,r),dropConstraint:this.transformNode(e.dropConstraint,r),renameConstraint:this.transformNode(e.renameConstraint,r),addIndex:this.transformNode(e.addIndex,r),dropIndex:this.transformNode(e.dropIndex,r)}}transformDropColumn(e,r){return{kind:"DropColumnNode",column:this.transformNode(e.column,r)}}transformRenameColumn(e,r){return{kind:"RenameColumnNode",column:this.transformNode(e.column,r),renameTo:this.transformNode(e.renameTo,r)}}transformAlterColumn(e,r){return{kind:"AlterColumnNode",column:this.transformNode(e.column,r),dataType:this.transformNode(e.dataType,r),dataTypeExpression:this.transformNode(e.dataTypeExpression,r),setDefault:this.transformNode(e.setDefault,r),dropDefault:e.dropDefault,setNotNull:e.setNotNull,dropNotNull:e.dropNotNull}}transformModifyColumn(e,r){return{kind:"ModifyColumnNode",column:this.transformNode(e.column,r)}}transformAddConstraint(e,r){return{kind:"AddConstraintNode",constraint:this.transformNode(e.constraint,r)}}transformDropConstraint(e,r){return{kind:"DropConstraintNode",constraintName:this.transformNode(e.constraintName,r),ifExists:e.ifExists,modifier:e.modifier}}transformRenameConstraint(e,r){return{kind:"RenameConstraintNode",oldName:this.transformNode(e.oldName,r),newName:this.transformNode(e.newName,r)}}transformCreateView(e,r){return{kind:"CreateViewNode",name:this.transformNode(e.name,r),temporary:e.temporary,orReplace:e.orReplace,ifNotExists:e.ifNotExists,materialized:e.materialized,columns:this.transformNodeList(e.columns,r),as:this.transformNode(e.as,r)}}transformRefreshMaterializedView(e,r){return{kind:"RefreshMaterializedViewNode",name:this.transformNode(e.name,r),concurrently:e.concurrently,withNoData:e.withNoData}}transformDropView(e,r){return{kind:"DropViewNode",name:this.transformNode(e.name,r),ifExists:e.ifExists,materialized:e.materialized,cascade:e.cascade}}transformGenerated(e,r){return{kind:"GeneratedNode",byDefault:e.byDefault,always:e.always,identity:e.identity,stored:e.stored,expression:this.transformNode(e.expression,r)}}transformDefaultValue(e,r){return{kind:"DefaultValueNode",defaultValue:this.transformNode(e.defaultValue,r)}}transformOn(e,r){return{kind:"OnNode",on:this.transformNode(e.on,r)}}transformSelectModifier(e,r){return{kind:"SelectModifierNode",modifier:e.modifier,rawModifier:this.transformNode(e.rawModifier,r),of:this.transformNodeList(e.of,r)}}transformCreateType(e,r){return{kind:"CreateTypeNode",name:this.transformNode(e.name,r),enum:this.transformNode(e.enum,r)}}transformDropType(e,r){return{kind:"DropTypeNode",name:this.transformNode(e.name,r),ifExists:e.ifExists}}transformExplain(e,r){return{kind:"ExplainNode",format:e.format,options:this.transformNode(e.options,r)}}transformSchemableIdentifier(e,r){return{kind:"SchemableIdentifierNode",schema:this.transformNode(e.schema,r),identifier:this.transformNode(e.identifier,r)}}transformAggregateFunction(e,r){return{kind:"AggregateFunctionNode",func:e.func,aggregated:this.transformNodeList(e.aggregated,r),distinct:e.distinct,orderBy:this.transformNode(e.orderBy,r),withinGroup:this.transformNode(e.withinGroup,r),filter:this.transformNode(e.filter,r),over:this.transformNode(e.over,r)}}transformOver(e,r){return{kind:"OverNode",orderBy:this.transformNode(e.orderBy,r),partitionBy:this.transformNode(e.partitionBy,r)}}transformPartitionBy(e,r){return{kind:"PartitionByNode",items:this.transformNodeList(e.items,r)}}transformPartitionByItem(e,r){return{kind:"PartitionByItemNode",partitionBy:this.transformNode(e.partitionBy,r)}}transformBinaryOperation(e,r){return{kind:"BinaryOperationNode",leftOperand:this.transformNode(e.leftOperand,r),operator:this.transformNode(e.operator,r),rightOperand:this.transformNode(e.rightOperand,r)}}transformUnaryOperation(e,r){return{kind:"UnaryOperationNode",operator:this.transformNode(e.operator,r),operand:this.transformNode(e.operand,r)}}transformUsing(e,r){return{kind:"UsingNode",tables:this.transformNodeList(e.tables,r)}}transformFunction(e,r){return{kind:"FunctionNode",func:e.func,arguments:this.transformNodeList(e.arguments,r)}}transformCase(e,r){return{kind:"CaseNode",value:this.transformNode(e.value,r),when:this.transformNodeList(e.when,r),else:this.transformNode(e.else,r),isStatement:e.isStatement}}transformWhen(e,r){return{kind:"WhenNode",condition:this.transformNode(e.condition,r),result:this.transformNode(e.result,r)}}transformJSONReference(e,r){return{kind:"JSONReferenceNode",reference:this.transformNode(e.reference,r),traversal:this.transformNode(e.traversal,r)}}transformJSONPath(e,r){return{kind:"JSONPathNode",inOperator:this.transformNode(e.inOperator,r),pathLegs:this.transformNodeList(e.pathLegs,r)}}transformJSONPathLeg(e,r){return{kind:"JSONPathLegNode",type:e.type,value:e.value}}transformJSONOperatorChain(e,r){return{kind:"JSONOperatorChainNode",operator:this.transformNode(e.operator,r),values:this.transformNodeList(e.values,r)}}transformTuple(e,r){return{kind:"TupleNode",values:this.transformNodeList(e.values,r)}}transformMergeQuery(e,r){return{kind:"MergeQueryNode",into:this.transformNode(e.into,r),using:this.transformNode(e.using,r),whens:this.transformNodeList(e.whens,r),with:this.transformNode(e.with,r),top:this.transformNode(e.top,r),endModifiers:this.transformNodeList(e.endModifiers,r),output:this.transformNode(e.output,r),returning:this.transformNode(e.returning,r)}}transformMatched(e,r){return{kind:"MatchedNode",not:e.not,bySource:e.bySource}}transformAddIndex(e,r){return{kind:"AddIndexNode",name:this.transformNode(e.name,r),columns:this.transformNodeList(e.columns,r),unique:e.unique,using:this.transformNode(e.using,r),ifNotExists:e.ifNotExists}}transformCast(e,r){return{kind:"CastNode",expression:this.transformNode(e.expression,r),dataType:this.transformNode(e.dataType,r)}}transformFetch(e,r){return{kind:"FetchNode",rowCount:this.transformNode(e.rowCount,r),modifier:e.modifier}}transformTop(e,r){return{kind:"TopNode",expression:e.expression,modifiers:e.modifiers}}transformOutput(e,r){return{kind:"OutputNode",selections:this.transformNodeList(e.selections,r)}}transformDataType(e,r){return e}transformSelectAll(e,r){return e}transformIdentifier(e,r){return e}transformValue(e,r){return e}transformPrimitiveValueList(e,r){return e}transformOperator(e,r){return e}transformDefaultInsertValue(e,r){return e}transformOrAction(e,r){return e}transformCollate(e,r){return e}};var Pn=i({AlterTableNode:!0,CreateIndexNode:!0,CreateSchemaNode:!0,CreateTableNode:!0,CreateTypeNode:!0,CreateViewNode:!0,RefreshMaterializedViewNode:!0,DeleteQueryNode:!0,DropIndexNode:!0,DropSchemaNode:!0,DropTableNode:!0,DropTypeNode:!0,DropViewNode:!0,InsertQueryNode:!0,RawNode:!0,SelectQueryNode:!0,UpdateQueryNode:!0,MergeQueryNode:!0}),Fn={json_agg:!0,to_json:!0},dr=class extends Be{#e;#t=new Set;#r=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,r){if(!this.#n(e))return super.transformNodeImpl(e,r);let o=this.#p(e);for(let p of o)this.#r.add(p);let n=this.#a(e);for(let p of n)this.#t.add(p);let a=super.transformNodeImpl(e,r);for(let p of n)this.#t.delete(p);for(let p of o)this.#r.delete(p);return a}transformSchemableIdentifier(e,r){let o=super.transformSchemableIdentifier(e,r);return o.schema||!this.#t.has(e.identifier.name)?o:{...o,schema:d.create(this.#e)}}transformReferences(e,r){let o=super.transformReferences(e,r);return o.table.table.schema?o:{...o,table:U.createWithSchema(this.#e,o.table.table.identifier.name)}}transformAggregateFunction(e,r){return{...super.transformAggregateFunction({...e,aggregated:[]},r),aggregated:this.#i(e,r,"aggregated")}}transformFunction(e,r){return{...super.transformFunction({...e,arguments:[]},r),arguments:this.#i(e,r,"arguments")}}#i(e,r,o){return Fn[e.func]?e[o].map(n=>!U.is(n)||n.table.schema?this.transformNode(n,r):{...n,table:this.transformIdentifier(n.table.identifier,r)}):this.transformNodeList(e[o],r)}#n(e){return e.kind in Pn}#a(e){let r=new Set;if("name"in e&&e.name&&V.is(e.name)&&this.#s(e.name,r),"from"in e&&e.from)for(let o of e.from.froms)this.#o(o,r);if("into"in e&&e.into&&this.#o(e.into,r),"table"in e&&e.table&&this.#o(e.table,r),"joins"in e&&e.joins)for(let o of e.joins)this.#o(o.table,r);return"using"in e&&e.using&&(ae.is(e.using)?this.#o(e.using.table,r):this.#o(e.using,r)),r}#p(e){let r=new Set;return"with"in e&&e.with&&this.#u(e.with,r),r}#o(e,r){if(U.is(e))this.#s(e.table,r);else if(S.is(e)&&U.is(e.node))this.#s(e.node.table,r);else if(_t.is(e))for(let o of e.items)this.#o(o,r)}#s(e,r){let o=e.identifier.name;!this.#t.has(o)&&!this.#r.has(o)&&r.add(o)}#u(e,r){for(let o of e.expressions){let n=o.name.table.table.identifier.name;this.#r.has(n)||r.add(n)}}};var oe=class{#e;constructor(e){this.#e=new dr(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};var Bo=i({is(t){return t.kind==="MatchedNode"},create(t,e=!1){return i({kind:"MatchedNode",not:t,bySource:e})}});function Oi(t,e,r){return re.create(tt([Bo.create(!t.isMatched,t.bySource),...e&&e.length>0?[e.length===3&&r?D(e[0],e[1],e[2]):O(e)]:[]],"and",!1))}function st(t){return W(t)?w.create([t],[]):C(t)?t.toOperationNode():t}var Lt=class{#e;#t;#r;constructor(){this.#e=new Promise((e,r)=>{this.#r=r,this.#t=e})}get promise(){return this.#e}resolve=e=>{this.#t&&this.#t(e)};reject=e=>{this.#r&&this.#r(e)}};async function cr(t){let e=new Lt,r=new Lt;return t.provideConnection(async o=>(e.resolve(o),await r.promise)).catch(o=>e.reject(o)),i({connection:await e.promise,release:r.resolve})}var Mn=i([]),at=class{#e;constructor(e=Mn){this.#e=e}get plugins(){return this.#e}transformQuery(e,r){for(let o of this.#e){let n=o.transformQuery({node:e,queryId:r});if(n.kind===e.kind)e=n;else throw new Error(["KyselyPlugin.transformQuery must return a node","of the same kind that was given to it.",`The plugin was given a ${e.kind}`,`but it returned a ${n.kind}`].join(" "))}return e}async executeQuery(e){return await this.provideConnection(async r=>{let o=await r.executeQuery(e);return"numUpdatedOrDeletedRows"in o&&fe("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#t(o,e.queryId)})}async*stream(e,r){let{connection:o,release:n}=await cr(this);try{for await(let a of o.streamQuery(e,r))yield await this.#t(a,e.queryId)}finally{n()}}async#t(e,r){for(let o of this.#e)e=await o.transformResult({result:e,queryId:r});return e}};var bi=class t extends at{get adapter(){throw new Error("this query cannot be compiled to SQL")}compileQuery(){throw new Error("this query cannot be compiled to SQL")}provideConnection(){throw new Error("this query cannot be executed")}withConnectionProvider(){throw new Error("this query cannot have a connection provider")}withPlugin(e){return new t([...this.plugins,e])}withPlugins(e){return new t([...this.plugins,...e])}withPluginAtFront(e){return new t([e,...this.plugins])}withoutPlugins(){return new t([])}},Le=new bi;var mr=class{numChangedRows;constructor(e){this.numChangedRows=e}};var hr=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}using(...e){return new Qe({...this.#e,queryNode:_.cloneWithUsing(this.#e.queryNode,qe("Using",e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,R(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,q(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,R(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,q(e))})}},Qe=class t{#e;constructor(e){this.#e=i(e)}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,e.toOperationNode())})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}whenMatched(){return this.#t([])}whenMatchedAnd(...e){return this.#t(e)}whenMatchedAndRef(e,r,o){return this.#t([e,r,o],!0)}#t(e,r){return new lr({...this.#e,queryNode:_.cloneWithWhen(this.#e.queryNode,Oi({isMatched:!0},e,r))})}whenNotMatched(){return this.#r([])}whenNotMatchedAnd(...e){return this.#r(e)}whenNotMatchedAndRef(e,r,o){return this.#r([e,r,o],!0)}whenNotMatchedBySource(){return this.#r([],!1,!0)}whenNotMatchedBySourceAnd(...e){return this.#r(e,!1,!0)}whenNotMatchedBySourceAndRef(e,r,o){return this.#r([e,r,o],!0,!0)}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,R(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,q(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,R(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,q(e))})}#r(e,r=!1,o=!1){let n={...this.#e,queryNode:_.cloneWithWhen(this.#e.queryNode,Oi({isMatched:!1,bySource:o},e,r))},a=o?lr:Ci;return new a(n)}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile(),r=await this.#e.executor.executeQuery(e),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new mr(r.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ie){let r=await this.executeTakeFirst();if(r===void 0)throw xe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}},lr=class{#e;constructor(e){this.#e=i(e)}thenDelete(){return new Qe({...this.#e,queryNode:_.cloneWithThen(this.#e.queryNode,st("delete"))})}thenDoNothing(){return new Qe({...this.#e,queryNode:_.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenUpdate(e){return new Qe({...this.#e,queryNode:_.cloneWithThen(this.#e.queryNode,st(e(new ot({queryId:this.#e.queryId,executor:Le,queryNode:ye.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(r=>r.set(...e))}},Ci=class{#e;constructor(e){this.#e=i(e)}thenDoNothing(){return new Qe({...this.#e,queryNode:_.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenInsertValues(e){let[r,o]=ir(e);return new Qe({...this.#e,queryNode:_.cloneWithThen(this.#e.queryNode,st(A.cloneWith(A.createWithoutInto(),{columns:r,values:o})))})}};var ut=class t{#e;constructor(e){this.#e=i(e)}selectFrom(e){return Qt({queryId:f(),executor:this.#e.executor,queryNode:x.createFrom(de(e),this.#e.withNode)})}selectNoFrom(e){return Qt({queryId:f(),executor:this.#e.executor,queryNode:x.cloneWithSelections(x.create(this.#e.withNode),R(e))})}insertInto(e){return new qt({queryId:f(),executor:this.#e.executor,queryNode:A.create(l(e),this.#e.withNode)})}replaceInto(e){return new qt({queryId:f(),executor:this.#e.executor,queryNode:A.create(l(e),this.#e.withNode,!0)})}deleteFrom(e){return new ar({queryId:f(),executor:this.#e.executor,queryNode:De.create(de(e),this.#e.withNode)})}updateTable(e){return new ot({queryId:f(),executor:this.#e.executor,queryNode:ye.create(de(e),this.#e.withNode)})}mergeInto(e){return new hr({queryId:f(),executor:this.#e.executor,queryNode:_.create(vi(e),this.#e.withNode)})}with(e,r){let o=wi(e,r);return new t({...this.#e,withNode:this.#e.withNode?Bt.cloneWithExpression(this.#e.withNode,o):Bt.create(o)})}withRecursive(e,r){let o=wi(e,r);return new t({...this.#e,withNode:this.#e.withNode?Bt.cloneWithExpression(this.#e.withNode,o):Bt.create(o,{recursive:!0})})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new oe(e))})}};function Io(){return new ut({executor:Le})}function Lo(t,e){return new er({joinNode:ae.create(t,ze(e))})}function Qo(){return new tr({overNode:It.create()})}function qe(t,e){if(e.length===3)return zn(t,e[0],e[1],e[2]);if(e.length===2)return Vn(t,e[0],e[1]);if(e.length===1)return Un(t,e[0]);throw new Error("not implemented")}function Vn(t,e,r){return r(Lo(t,e)).toOperationNode()}function zn(t,e,r,o){return ae.createWithOn(t,ze(e),D(r,"=",o))}function Un(t,e){return ae.create(t,ze(e))}var Po=i({is(t){return t.kind==="OffsetNode"},create(t){return i({kind:"OffsetNode",offset:t})}});var Fo=i({is(t){return t.kind==="GroupByItemNode"},create(t){return i({kind:"GroupByItemNode",groupBy:t})}});function Mo(t){return t=k(t)?t(I()):t,Ce(t).map(Fo.create)}var fr=i({is(t){return t.kind==="SetOperationNode"},create(t,e,r){return i({kind:"SetOperationNode",operator:t,expression:e,all:r})}});function Ue(t,e,r){return k(e)&&(e=e(Nr())),F(e)||(e=[e]),e.map(o=>fr.create(t,j(o),r))}var N=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new Wi(se.create(this.#e,O(e)))}and(...e){return new ki($.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},Pt=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return S.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}},Wi=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new t(se.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return Z.create(this.#e)}},ki=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}and(...e){return new t($.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return Z.create(this.#e)}};var Vo={is(t){return t.kind==="FetchNode"},create(t,e){return{kind:"FetchNode",rowCount:T.create(t),modifier:e}}};function zo(t,e){if(!Se(t)&&!Xe(t))throw new Error(`Invalid fetch row count: ${t}`);if(!Jn(e))throw new Error(`Invalid fetch modifier: ${e}`);return Vo.create(t,e)}function Jn(t){return t==="only"||t==="with ties"}var Ti=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isSelectQueryBuilder(){return!0}where(...e){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,queryNode:u.cloneWithWhere(this.#e.queryNode,D(e,r,o))})}having(...e){return new t({...this.#e,queryNode:x.cloneWithHaving(this.#e.queryNode,O(e))})}havingRef(e,r,o){return new t({...this.#e,queryNode:x.cloneWithHaving(this.#e.queryNode,D(e,r,o))})}select(e){return new t({...this.#e,queryNode:x.cloneWithSelections(this.#e.queryNode,R(e))})}distinctOn(e){return new t({...this.#e,queryNode:x.cloneWithDistinctOn(this.#e.queryNode,Ce(e))})}modifyFront(e){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,le.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.createWithExpression(e.toOperationNode()))})}distinct(){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,le.create("Distinct"))})}forUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("ForUpdate",e?At(e).map(l):void 0))})}forShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("ForShare",e?At(e).map(l):void 0))})}forKeyShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("ForKeyShare",e?At(e).map(l):void 0))})}forNoKeyUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("ForNoKeyUpdate",e?At(e).map(l):void 0))})}skipLocked(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("SkipLocked"))})}noWait(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,le.create("NoWait"))})}selectAll(e){return new t({...this.#e,queryNode:x.cloneWithSelections(this.#e.queryNode,q(e))})}innerJoin(...e){return this.#t("InnerJoin",e)}leftJoin(...e){return this.#t("LeftJoin",e)}rightJoin(...e){return this.#t("RightJoin",e)}fullJoin(...e){return this.#t("FullJoin",e)}crossJoin(...e){return this.#t("CrossJoin",e)}innerJoinLateral(...e){return this.#t("LateralInnerJoin",e)}leftJoinLateral(...e){return this.#t("LateralLeftJoin",e)}crossJoinLateral(...e){return this.#t("LateralCrossJoin",e)}crossApply(...e){return this.#t("CrossApply",e)}outerApply(...e){return this.#t("OuterApply",e)}#t(e,r){return new t({...this.#e,queryNode:u.cloneWithJoin(this.#e.queryNode,qe(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,X(e))})}groupBy(e){return new t({...this.#e,queryNode:x.cloneWithGroupByItems(this.#e.queryNode,Mo(e))})}limit(e){return new t({...this.#e,queryNode:x.cloneWithLimit(this.#e.queryNode,it.create(g(e)))})}offset(e){return new t({...this.#e,queryNode:x.cloneWithOffset(this.#e.queryNode,Po.create(g(e)))})}fetch(e,r="only"){return new t({...this.#e,queryNode:x.cloneWithFetch(this.#e.queryNode,zo(e,r))})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,pe(e,r))})}union(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("union",e,!1))})}unionAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("union",e,!0))})}intersect(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("intersect",e,!1))})}intersectAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("intersect",e,!0))})}except(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("except",e,!1))})}exceptAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Ue("except",e,!0))})}as(e){return new Ai(this,e)}clearSelect(){return new t({...this.#e,queryNode:x.cloneWithoutSelections(this.#e.queryNode)})}clearWhere(){return new t({...this.#e,queryNode:u.cloneWithoutWhere(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:x.cloneWithoutLimit(this.#e.queryNode)})}clearOffset(){return new t({...this.#e,queryNode:x.cloneWithoutOffset(this.#e.queryNode)})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}clearGroupBy(){return new t({...this.#e,queryNode:x.cloneWithoutGroupBy(this.#e.queryNode)})}$call(e){return e(this)}$if(e,r){return e?r(this):new t({...this.#e})}$castTo(){return new t(this.#e)}$narrowType(){return new t(this.#e)}$assertType(){return new t(this.#e)}$asTuple(){return new N(this.toOperationNode())}$asScalar(){return new N(this.toOperationNode())}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.queryNode,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){let e=this.compile();return(await this.#e.executor.executeQuery(e)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=ie){let r=await this.executeTakeFirst();if(r===void 0)throw xe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}async*stream(e=100){let r=this.compile(),o=this.#e.executor.stream(r,e);for await(let n of o)yield*n.rows}async explain(e,r){return await new t({...this.#e,queryNode:u.cloneWithExplain(this.#e.queryNode,e,r)}).execute()}};function Qt(t){return new Ti(t)}var Ai=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get isAliasedSelectQueryBuilder(){return!0}toOperationNode(){return S.create(this.#e.toOperationNode(),d.create(this.#t))}};var we=i({is(t){return t.kind==="AggregateFunctionNode"},create(t,e=[]){return i({kind:"AggregateFunctionNode",func:t,aggregated:e})},cloneWithDistinct(t){return i({...t,distinct:!0})},cloneWithOrderBy(t,e,r=!1){let o=r?"withinGroup":"orderBy";return i({...t,[o]:t[o]?ve.cloneWithItems(t[o],e):ve.create(e)})},cloneWithFilter(t,e){return i({...t,filter:t.filter?Q.cloneWithOperation(t.filter,"And",e):Q.create(e)})},cloneWithOrFilter(t,e){return i({...t,filter:t.filter?Q.cloneWithOperation(t.filter,"Or",e):Q.create(e)})},cloneWithOver(t,e){return i({...t,over:e})}});var Si=i({is(t){return t.kind==="FunctionNode"},create(t,e){return i({kind:"FunctionNode",func:t,arguments:e})}});var pt=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}as(e){return new Ei(this,e)}distinct(){return new t({...this.#e,aggregateFunctionNode:we.cloneWithDistinct(this.#e.aggregateFunctionNode)})}orderBy(...e){return new t({...this.#e,aggregateFunctionNode:u.cloneWithOrderByItems(this.#e.aggregateFunctionNode,X(e))})}clearOrderBy(){return new t({...this.#e,aggregateFunctionNode:u.cloneWithoutOrderBy(this.#e.aggregateFunctionNode)})}withinGroupOrderBy(...e){return new t({...this.#e,aggregateFunctionNode:we.cloneWithOrderBy(this.#e.aggregateFunctionNode,X(e),!0)})}filterWhere(...e){return new t({...this.#e,aggregateFunctionNode:we.cloneWithFilter(this.#e.aggregateFunctionNode,O(e))})}filterWhereRef(e,r,o){return new t({...this.#e,aggregateFunctionNode:we.cloneWithFilter(this.#e.aggregateFunctionNode,D(e,r,o))})}over(e){let r=Qo();return new t({...this.#e,aggregateFunctionNode:we.cloneWithOver(this.#e.aggregateFunctionNode,(e?e(r):r).toOperationNode())})}$call(e){return e(this)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e.aggregateFunctionNode}},Ei=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return S.create(this.#e.toOperationNode(),d.create(this.#t))}};function yr(){let t=(r,o)=>new N(Si.create(r,Ce(o??[]))),e=(r,o)=>new pt({aggregateFunctionNode:we.create(r,o?Ce(o):void 0)});return Object.assign(t,{agg:e,avg(r){return e("avg",[r])},coalesce(...r){return t("coalesce",r)},count(r){return e("count",[r])},countAll(r){return new pt({aggregateFunctionNode:we.create("count",q(r))})},max(r){return e("max",[r])},min(r){return e("min",[r])},sum(r){return e("sum",[r])},any(r){return t("any",[r])},jsonAgg(r){return new pt({aggregateFunctionNode:we.create("json_agg",[W(r)?l(r):r.toOperationNode()])})},toJson(r){return new N(Si.create("to_json",[W(r)?l(r):r.toOperationNode()]))}})}var Uo=i({is(t){return t.kind==="UnaryOperationNode"},create(t,e){return i({kind:"UnaryOperationNode",operator:t,operand:e})}});function Jo(t,e){return Uo.create(Y.create(t),L(e))}var ee=i({is(t){return t.kind==="CaseNode"},create(t){return i({kind:"CaseNode",value:t})},cloneWithWhen(t,e){return i({...t,when:i(t.when?[...t.when,e]:[e])})},cloneWithThen(t,e){return i({...t,when:t.when?i([...t.when.slice(0,-1),re.cloneWithResult(t.when[t.when.length-1],e)]):void 0})},cloneWith(t,e){return i({...t,...e})}});var dt=class{#e;constructor(e){this.#e=i(e)}when(...e){return new xr({...this.#e,node:ee.cloneWithWhen(this.#e.node,re.create(O(e)))})}},xr=class{#e;constructor(e){this.#e=i(e)}then(e){return new Ri({...this.#e,node:ee.cloneWithThen(this.#e.node,Xt(e)?Rt(e):g(e))})}},Ri=class{#e;constructor(e){this.#e=i(e)}when(...e){return new xr({...this.#e,node:ee.cloneWithWhen(this.#e.node,re.create(O(e)))})}else(e){return new Ii({...this.#e,node:ee.cloneWith(this.#e.node,{else:Xt(e)?Rt(e):g(e)})})}end(){return new N(ee.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new N(ee.cloneWith(this.#e.node,{isStatement:!0}))}},Ii=class{#e;constructor(e){this.#e=i(e)}end(){return new N(ee.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new N(ee.cloneWith(this.#e.node,{isStatement:!0}))}};var Di=i({is(t){return t.kind==="JSONPathLegNode"},create(t,e){return i({kind:"JSONPathLegNode",type:t,value:e})}});var ct=class{#e;constructor(e){this.#e=e}at(e){return this.#t("ArrayLocation",e)}key(e){return this.#t("Member",e)}#t(e,r){return _e.is(this.#e)?new wr(_e.cloneWithTraversal(this.#e,Ie.is(this.#e.traversal)?Ie.cloneWithLeg(this.#e.traversal,Di.create(e,r)):Yt.cloneWithValue(this.#e.traversal,T.createImmediate(r)))):new wr(Ie.cloneWithLeg(this.#e,Di.create(e,r)))}},wr=class t extends ct{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new qi(this,e)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},qi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return S.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}};var Bi=i({is(t){return t.kind==="TupleNode"},create(t){return i({kind:"TupleNode",values:i(t)})}});var $n=["varchar","char","text","integer","int2","int4","int8","smallint","bigint","boolean","real","double precision","float4","float8","decimal","numeric","binary","bytea","date","datetime","time","timetz","timestamp","timestamptz","serial","bigserial","uuid","json","jsonb","blob","varbinary","int4range","int4multirange","int8range","int8multirange","numrange","nummultirange","tsrange","tsmultirange","tstzrange","tstzmultirange","daterange","datemultirange"],jn=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],$o=i({is(t){return t.kind==="DataTypeNode"},create(t){return i({kind:"DataTypeNode",dataType:t})}});function jo(t){return!!($n.includes(t)||jn.some(e=>e.test(t)))}function ce(t){if(C(t))return t.toOperationNode();if(jo(t))return $o.create(t);throw new Error(`invalid column data type ${JSON.stringify(t)}`)}var Ko=i({is(t){return t.kind==="CastNode"},create(t,e){return i({kind:"CastNode",expression:t,dataType:e})}});function Nr(t=Le){function e(n,a,p){return new N(Zt(n,a,p))}function r(n,a){return new N(Jo(n,a))}let o=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(n){return Qt({queryId:f(),executor:t,queryNode:x.createFrom(de(n))})},case(n){return new dt({node:ee.create(G(n)?void 0:L(n))})},ref(n,a){return G(a)?new N(H(n)):new ct(No(n,a))},jsonPath(){return new ct(Ie.create())},table(n){return new N(l(n))},val(n){return new N(g(n))},refTuple(...n){return new N(Bi.create(n.map(L)))},tuple(...n){return new N(Bi.create(n.map(g)))},lit(n){return new N(Rt(n))},unary:r,not(n){return r("not",n)},exists(n){return r("exists",n)},neg(n){return r("-",n)},between(n,a,p){return new N(Re.create(L(n),Y.create("between"),$.create(g(a),g(p))))},betweenSymmetric(n,a,p){return new N(Re.create(L(n),Y.create("between symmetric"),$.create(g(a),g(p))))},and(n){return F(n)?new N(tt(n,"and")):new N(ui(n,"and"))},or(n){return F(n)?new N(tt(n,"or")):new N(ui(n,"or"))},parens(...n){let a=O(n);return Z.is(a)?new N(a):new N(Z.create(a))},cast(n,a){return new N(Ko.create(L(n),ce(a)))},withSchema(n){return Nr(t.withPluginAtFront(new oe(n)))}});return o.fn=yr(),o.eb=o,o}function I(t){return Nr()}function j(t){if(C(t))return t.toOperationNode();if(k(t))return t(I()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(t)}`)}function rr(t){if(C(t))return t.toOperationNode();if(k(t))return t(I()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(t)}`)}function be(t){return Jt(t)||po(t)||k(t)}var gr=class{#e;get table(){return this.#e}constructor(e){this.#e=e}as(e){return new Li(this.#e,e)}},Li=class{#e;#t;get table(){return this.#e}get alias(){return this.#t}constructor(e,r){this.#e=e,this.#t=r}toOperationNode(){return S.create(l(this.#e),d.create(this.#t))}};function Go(t){return B(t)&&C(t)&&W(t.table)&&W(t.alias)}function de(t){return F(t)?t.map(e=>ze(e)):[ze(t)]}function ze(t){return W(t)?vi(t):Go(t)?t.toOperationNode():rr(t)}function vi(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(Yo);return S.create(l(r),d.create(o))}else return l(t)}function l(t){let e=".";if(t.includes(e)){let[r,o]=t.split(e).map(Yo);return U.createWithSchema(r,o)}else return U.create(t)}function Yo(t){return t.trim()}var Qi=i({is(t){return t.kind==="AddColumnNode"},create(t){return i({kind:"AddColumnNode",column:t})}});var v=i({is(t){return t.kind==="ColumnDefinitionNode"},create(t,e){return i({kind:"ColumnDefinitionNode",column:c.create(t),dataType:e})},cloneWithFrontModifier(t,e){return i({...t,frontModifiers:t.frontModifiers?i([...t.frontModifiers,e]):[e]})},cloneWithEndModifier(t,e){return i({...t,endModifiers:t.endModifiers?i([...t.endModifiers,e]):[e]})},cloneWith(t,e){return i({...t,...e})}});var Pi=i({is(t){return t.kind==="DropColumnNode"},create(t){return i({kind:"DropColumnNode",column:c.create(t)})}});var Fi=i({is(t){return t.kind==="RenameColumnNode"},create(t,e){return i({kind:"RenameColumnNode",column:c.create(t),renameTo:c.create(e)})}});var mt=i({is(t){return t.kind==="CheckConstraintNode"},create(t,e){return i({kind:"CheckConstraintNode",expression:t,name:e?d.create(e):void 0})}});var Ho=["no action","restrict","cascade","set null","set default"],ht=i({is(t){return t.kind==="ReferencesNode"},create(t,e){return i({kind:"ReferencesNode",table:t,columns:i([...e])})},cloneWithOnDelete(t,e){return i({...t,onDelete:e})},cloneWithOnUpdate(t,e){return i({...t,onUpdate:e})}});function Or(t){return C(t)?t.toOperationNode():T.createImmediate(t)}var Ft=i({is(t){return t.kind==="GeneratedNode"},create(t){return i({kind:"GeneratedNode",...t})},createWithExpression(t){return i({kind:"GeneratedNode",always:!0,expression:t})},cloneWith(t,e){return i({...t,...e})}});var Xo=i({is(t){return t.kind==="DefaultValueNode"},create(t){return i({kind:"DefaultValueNode",defaultValue:t})}});function lt(t){if(Ho.includes(t))return t;throw new Error(`invalid OnModifyForeignAction ${t}`)}var We=class t{#e;constructor(e){this.#e=e}autoIncrement(){return new t(v.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new t(v.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new t(v.cloneWith(this.#e,{primaryKey:!0}))}references(e){let r=H(e);if(!r.table||Ze.is(r.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new t(v.cloneWith(this.#e,{references:ht.create(r.table,[r.column])}))}onDelete(e){if(!this.#e.references)throw new Error("on delete constraint can only be added for foreign keys");return new t(v.cloneWith(this.#e,{references:ht.cloneWithOnDelete(this.#e.references,lt(e))}))}onUpdate(e){if(!this.#e.references)throw new Error("on update constraint can only be added for foreign keys");return new t(v.cloneWith(this.#e,{references:ht.cloneWithOnUpdate(this.#e.references,lt(e))}))}unique(){return new t(v.cloneWith(this.#e,{unique:!0}))}notNull(){return new t(v.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new t(v.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new t(v.cloneWith(this.#e,{defaultTo:Xo.create(Or(e))}))}check(e){return new t(v.cloneWith(this.#e,{check:mt.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new t(v.cloneWith(this.#e,{generated:Ft.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new t(v.cloneWith(this.#e,{generated:Ft.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new t(v.cloneWith(this.#e,{generated:Ft.create({identity:!0,byDefault:!0})}))}stored(){if(!this.#e.generated)throw new Error("stored() can only be called after generatedAlwaysAs");return new t(v.cloneWith(this.#e,{generated:Ft.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new t(v.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new t(v.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new t(v.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new t(v.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Mi=i({is(t){return t.kind==="ModifyColumnNode"},create(t){return i({kind:"ModifyColumnNode",column:t})}});var me=i({is(t){return t.kind==="ForeignKeyConstraintNode"},create(t,e,r,o){return i({kind:"ForeignKeyConstraintNode",columns:t,references:ht.create(e,r),name:o?d.create(o):void 0})},cloneWith(t,e){return i({...t,...e})}});var ft=class t{#e;constructor(e){this.#e=e}onDelete(e){return new t(me.cloneWith(this.#e,{onDelete:lt(e)}))}onUpdate(e){return new t(me.cloneWith(this.#e,{onUpdate:lt(e)}))}deferrable(){return new t(me.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(me.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(me.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(me.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Nt=i({is(t){return t.kind==="AddConstraintNode"},create(t){return i({kind:"AddConstraintNode",constraint:t})}});var ge=i({is(t){return t.kind==="UniqueConstraintNode"},create(t,e,r){return i({kind:"UniqueConstraintNode",columns:i(t.map(c.create)),name:e?d.create(e):void 0,nullsNotDistinct:r})},cloneWith(t,e){return i({...t,...e})}});var yt=i({is(t){return t.kind==="DropConstraintNode"},create(t){return i({kind:"DropConstraintNode",constraintName:d.create(t)})},cloneWith(t,e){return i({...t,...e})}});var xt=i({is(t){return t.kind==="AlterColumnNode"},create(t,e,r){return i({kind:"AlterColumnNode",column:c.create(t),[e]:r})}});var Mt=class{#e;constructor(e){this.#e=e}setDataType(e){return new Je(xt.create(this.#e,"dataType",ce(e)))}setDefault(e){return new Je(xt.create(this.#e,"setDefault",Or(e)))}dropDefault(){return new Je(xt.create(this.#e,"dropDefault",!0))}setNotNull(){return new Je(xt.create(this.#e,"setNotNull",!0))}dropNotNull(){return new Je(xt.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},Je=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};var ke=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var br=class t{#e;constructor(e){this.#e=i(e)}onDelete(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onDelete(e)})}onUpdate(e){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.onUpdate(e)})}deferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.deferrable()})}notDeferrable(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.notDeferrable()})}initiallyDeferred(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyDeferred()})}initiallyImmediate(){return new t({...this.#e,constraintBuilder:this.#e.constraintBuilder.initiallyImmediate()})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(h.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(this.#e.constraintBuilder.toOperationNode())}),this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Vt=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{modifier:"restrict"})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Te=i({is(t){return t.kind==="PrimaryKeyConstraintNode"},create(t,e){return i({kind:"PrimaryKeyConstraintNode",columns:i(t.map(c.create)),name:e?d.create(e):void 0})},cloneWith(t,e){return i({...t,...e})}});var Pe=i({is(t){return t.kind==="AddIndexNode"},create(t){return i({kind:"AddIndexNode",name:d.create(t)})},cloneWith(t,e){return i({...t,...e})},cloneWithColumns(t,e){return i({...t,columns:[...t.columns||[],...e]})}});var Cr=class t{#e;constructor(e){this.#e=i(e)}unique(){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.cloneWithColumns(this.#e.node.addIndex,[et(e)])})})}columns(e){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.cloneWithColumns(this.#e.node.addIndex,e.map(et))})})}expression(e){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new t({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.cloneWith(this.#e.node.addIndex,{using:w.createWithSql(e)})})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var wt=class t{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new t(ge.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new t(ge.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(ge.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(ge.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(ge.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var gt=class t{#e;constructor(e){this.#e=e}deferrable(){return new t(Te.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(Te.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(Te.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(Te.cloneWith(this.#e,{initiallyDeferred:!1}))}$call(e){return e(this)}toOperationNode(){return this.#e}};var Ot=class{#e;constructor(e){this.#e=e}$call(e){return e(this)}toOperationNode(){return this.#e}};var Zo=i({is(t){return t.kind==="RenameConstraintNode"},create(t,e){return i({kind:"RenameConstraintNode",oldName:d.create(t),newName:d.create(e)})}});var vr=class{#e;constructor(e){this.#e=i(e)}renameTo(e){return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{renameTo:l(e)})})}setSchema(e){return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{setSchema:d.create(e)})})}alterColumn(e,r){let o=r(new Mt(e));return new $e({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new $e({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Pi.create(e))})}renameColumn(e,r){return new $e({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Fi.create(e,r))})}addColumn(e,r,o=z){let n=o(new We(v.create(e,ce(r))));return new $e({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Qi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new We(v.create(e,ce(r))));return new $e({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Mi.create(n.toOperationNode()))})}addUniqueConstraint(e,r,o=z){let n=o(new wt(ge.create(r,e)));return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addCheckConstraint(e,r,o=z){let n=o(new Ot(mt.create(r.toOperationNode(),e)));return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addForeignKeyConstraint(e,r,o,n,a=z){let p=a(new ft(me.create(r.map(c.create),l(o),n.map(c.create),e)));return new br({...this.#e,constraintBuilder:p})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(Te.create(r,e)));return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}dropConstraint(e){return new Vt({...this.#e,node:h.cloneWithTableProps(this.#e.node,{dropConstraint:yt.create(e)})})}renameConstraint(e,r){return new Vt({...this.#e,node:h.cloneWithTableProps(this.#e.node,{renameConstraint:Zo.create(e,r)})})}addIndex(e){return new Cr({...this.#e,node:h.cloneWithTableProps(this.#e.node,{addIndex:Pe.create(e)})})}dropIndex(e){return new ke({...this.#e,node:h.cloneWithTableProps(this.#e.node,{dropIndex:Ee.create(e)})})}$call(e){return e(this)}},$e=class t{#e;constructor(e){this.#e=i(e)}alterColumn(e,r){let o=r(new Mt(e));return new t({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new t({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Pi.create(e))})}renameColumn(e,r){return new t({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Fi.create(e,r))})}addColumn(e,r,o=z){let n=o(new We(v.create(e,ce(r))));return new t({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Qi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new We(v.create(e,ce(r))));return new t({...this.#e,node:h.cloneWithColumnAlteration(this.#e.node,Mi.create(n.toOperationNode()))})}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var bt=class extends Be{transformPrimitiveValueList(e){return Ne.create(e.values.map(T.createImmediate))}transformValue(e){return T.createImmediate(e.value)}};var Wr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:ne.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new t({...this.#e,node:ne.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new t({...this.#e,node:ne.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new t({...this.#e,node:ne.cloneWith(this.#e.node,{table:l(e)})})}column(e){return new t({...this.#e,node:ne.cloneWithColumns(this.#e.node,[et(e)])})}columns(e){return new t({...this.#e,node:ne.cloneWithColumns(this.#e.node,e.map(et))})}expression(e){return new t({...this.#e,node:ne.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new t({...this.#e,node:ne.cloneWith(this.#e.node,{using:w.createWithSql(e)})})}where(...e){let r=new bt;return new t({...this.#e,node:u.cloneWithWhere(this.#e.node,r.transformNode(O(e),this.#e.queryId))})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var kr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:Ut.cloneWith(this.#e.node,{ifNotExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};function _o(t){if(uo.includes(t))return t;throw new Error(`invalid OnCommitAction ${t}`)}var Tr=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:M.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new t({...this.#e,node:M.cloneWith(this.#e.node,{onCommit:_o(e)})})}ifNotExists(){return new t({...this.#e,node:M.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,r,o=z){let n=o(new We(v.create(e,ce(r))));return new t({...this.#e,node:M.cloneWithColumn(this.#e.node,n.toOperationNode())})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(Te.create(r,e)));return new t({...this.#e,node:M.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addUniqueConstraint(e,r,o=z){let n=o(new wt(ge.create(r,e)));return new t({...this.#e,node:M.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addCheckConstraint(e,r,o=z){let n=o(new Ot(mt.create(r.toOperationNode(),e)));return new t({...this.#e,node:M.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addForeignKeyConstraint(e,r,o,n,a=z){let p=a(new ft(me.create(r.map(c.create),l(o),n.map(c.create),e)));return new t({...this.#e,node:M.cloneWithConstraint(this.#e.node,p.toOperationNode())})}modifyFront(e){return new t({...this.#e,node:M.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new t({...this.#e,node:M.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new t({...this.#e,node:M.cloneWith(this.#e.node,{selectQuery:j(e)})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Ar=class t{#e;constructor(e){this.#e=i(e)}on(e){return new t({...this.#e,node:Ee.cloneWith(this.#e.node,{table:l(e)})})}ifExists(){return new t({...this.#e,node:Ee.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Ee.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Sr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:St.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:St.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Er=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Et.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Et.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var he=i({is(t){return t.kind==="CreateViewNode"},create(t){return i({kind:"CreateViewNode",name:V.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Rr=class{#e=new bt;transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}transformResult(e){return Promise.resolve(e.result)}};var Ir=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:he.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new t({...this.#e,node:he.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new t({...this.#e,node:he.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new t({...this.#e,node:he.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new t({...this.#e,node:he.cloneWith(this.#e.node,{columns:e.map(ni)})})}as(e){let r=e.withPlugin(new Rr).toOperationNode();return new t({...this.#e,node:he.cloneWith(this.#e.node,{as:r})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Ct=i({is(t){return t.kind==="DropViewNode"},create(t){return i({kind:"DropViewNode",name:V.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Dr=class t{#e;constructor(e){this.#e=i(e)}materialized(){return new t({...this.#e,node:Ct.cloneWith(this.#e.node,{materialized:!0})})}ifExists(){return new t({...this.#e,node:Ct.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Ct.cloneWith(this.#e.node,{cascade:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var qr=i({is(t){return t.kind==="CreateTypeNode"},create(t){return i({kind:"CreateTypeNode",name:t})},cloneWithEnum(t,e){return i({...t,enum:Ne.create(e.map(T.createImmediate))})}});var Br=class t{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}asEnum(e){return new t({...this.#e,node:qr.cloneWithEnum(this.#e.node,e)})}$call(e){return e(this)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Lr=i({is(t){return t.kind==="DropTypeNode"},create(t){return i({kind:"DropTypeNode",name:t})},cloneWith(t,e){return i({...t,...e})}});var Qr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Lr.cloneWith(this.#e.node,{ifExists:!0})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};function Vi(t){let e=".";if(t.includes(e)){let r=t.split(e).map(Kn);if(r.length===2)return V.createWithSchema(r[0],r[1]);throw new Error(`invalid schemable identifier ${t}`)}else return V.create(t)}function Kn(t){return t.trim()}var vt=i({is(t){return t.kind==="RefreshMaterializedViewNode"},create(t){return i({kind:"RefreshMaterializedViewNode",name:V.create(t)})},cloneWith(t,e){return i({...t,...e})}});var Pr=class t{#e;constructor(e){this.#e=i(e)}concurrently(){return new t({...this.#e,node:vt.cloneWith(this.#e.node,{concurrently:!0,withNoData:!1})})}withData(){return new t({...this.#e,node:vt.cloneWith(this.#e.node,{withNoData:!1})})}withNoData(){return new t({...this.#e,node:vt.cloneWith(this.#e.node,{withNoData:!0,concurrently:!1})})}$call(e){return e(this)}toOperationNode(){return this.#e.executor.transformQuery(this.#e.node,this.#e.queryId)}compile(){return this.#e.executor.compileQuery(this.toOperationNode(),this.#e.queryId)}async execute(){await this.#e.executor.executeQuery(this.compile())}};var Fr=class t{#e;constructor(e){this.#e=e}createTable(e){return new Tr({queryId:f(),executor:this.#e,node:M.create(l(e))})}dropTable(e){return new Er({queryId:f(),executor:this.#e,node:Et.create(l(e))})}createIndex(e){return new Wr({queryId:f(),executor:this.#e,node:ne.create(e)})}dropIndex(e){return new Ar({queryId:f(),executor:this.#e,node:Ee.create(e)})}createSchema(e){return new kr({queryId:f(),executor:this.#e,node:Ut.create(e)})}dropSchema(e){return new Sr({queryId:f(),executor:this.#e,node:St.create(e)})}alterTable(e){return new vr({queryId:f(),executor:this.#e,node:h.create(l(e))})}createView(e){return new Ir({queryId:f(),executor:this.#e,node:he.create(e)})}refreshMaterializedView(e){return new Pr({queryId:f(),executor:this.#e,node:vt.create(e)})}dropView(e){return new Dr({queryId:f(),executor:this.#e,node:Ct.create(e)})}createType(e){return new Br({queryId:f(),executor:this.#e,node:qr.create(Vi(e))})}dropType(e){return new Qr({queryId:f(),executor:this.#e,node:Lr.create(Vi(e))})}withPlugin(e){return new t(this.#e.withPlugin(e))}withoutPlugins(){return new t(this.#e.withoutPlugins())}withSchema(e){return new t(this.#e.withPluginAtFront(new oe(e)))}};var Mr=class{ref(e){return new jt(e)}table(e){return new gr(e)}};var Vr=class{#e;constructor(e){this.#e=e}async provideConnection(e){let r=await this.#e.acquireConnection();try{return await e(r)}finally{await this.#e.releaseConnection(r)}}};var zr=class t extends at{#e;#t;#r;constructor(e,r,o,n=[]){super(n),this.#e=e,this.#t=r,this.#r=o}get adapter(){return this.#t}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#r.provideConnection(e)}withPlugins(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,...e])}withPlugin(e){return new t(this.#e,this.#t,this.#r,[...this.plugins,e])}withPluginAtFront(e){return new t(this.#e,this.#t,this.#r,[e,...this.plugins])}withConnectionProvider(e){return new t(this.#e,this.#t,e,[...this.plugins])}withoutPlugins(){return new t(this.#e,this.#t,this.#r,[])}};function Ur(){return typeof performance<"u"&&k(performance.now)?performance.now():Date.now()}var Jr=class{#e;#t;#r;#i;#n;#a=new WeakSet;constructor(e,r){this.#i=!1,this.#e=e,this.#t=r}async init(){if(this.#n)throw new Error("driver has already been destroyed");this.#r||(this.#r=this.#e.init().then(()=>{this.#i=!0}).catch(e=>(this.#r=void 0,Promise.reject(e)))),await this.#r}async acquireConnection(){if(this.#n)throw new Error("driver has already been destroyed");this.#i||await this.init();let e=await this.#e.acquireConnection();return this.#a.has(e)||(this.#p()&&this.#o(e),this.#a.add(e)),e}async releaseConnection(e){await this.#e.releaseConnection(e)}beginTransaction(e,r){return this.#e.beginTransaction(e,r)}commitTransaction(e){return this.#e.commitTransaction(e)}rollbackTransaction(e){return this.#e.rollbackTransaction(e)}savepoint(e,r,o){if(this.#e.savepoint)return this.#e.savepoint(e,r,o);throw new Error("The `savepoint` method is not supported by this driver")}rollbackToSavepoint(e,r,o){if(this.#e.rollbackToSavepoint)return this.#e.rollbackToSavepoint(e,r,o);throw new Error("The `rollbackToSavepoint` method is not supported by this driver")}releaseSavepoint(e,r,o){if(this.#e.releaseSavepoint)return this.#e.releaseSavepoint(e,r,o);throw new Error("The `releaseSavepoint` method is not supported by this driver")}async destroy(){this.#r&&(await this.#r,this.#n||(this.#n=this.#e.destroy().catch(e=>(this.#n=void 0,Promise.reject(e)))),await this.#n)}#p(){return this.#t.isLevelEnabled("query")||this.#t.isLevelEnabled("error")}#o(e){let r=e.executeQuery,o=e.streamQuery,n=this;e.executeQuery=async a=>{let p,m=Ur();try{return await r.call(e,a)}catch(y){throw p=y,await n.#s(y,a,m),y}finally{p||await n.#u(a,m)}},e.streamQuery=async function*(a,p){let m,y=Ur();try{for await(let b of o.call(e,a,p))yield b}catch(b){throw m=b,await n.#s(b,a,y),b}finally{m||await n.#u(a,y,!0)}}}async#s(e,r,o){await this.#t.error(()=>({level:"error",error:e,query:r,queryDurationMillis:this.#d(o)}))}async#u(e,r,o=!1){await this.#t.query(()=>({level:"query",isStream:o,query:e,queryDurationMillis:this.#d(r)}))}#d(e){return Ur()-e}};var Gn=()=>{},Wt=class{#e;#t;constructor(e){this.#e=e}async provideConnection(e){for(;this.#t;)await this.#t.catch(Gn);return this.#t=this.#r(e).finally(()=>{this.#t=void 0}),this.#t}async#r(e){return await e(this.#e)}};var Yn=["read only","read write"],Hn=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function zi(t){if(t.accessMode&&!Yn.includes(t.accessMode))throw new Error(`invalid transaction access mode ${t.accessMode}`);if(t.isolationLevel&&!Hn.includes(t.isolationLevel))throw new Error(`invalid transaction isolation level ${t.isolationLevel}`)}var Gv=i(["query","error"]),$r=class{#e;#t;constructor(e){k(e)?(this.#t=e,this.#e=i({query:!0,error:!0})):(this.#t=Xn,this.#e=i({query:e.includes("query"),error:e.includes("error")}))}isLevelEnabled(e){return this.#e[e]}async query(e){this.#e.query&&await this.#t(e())}async error(e){this.#e.error&&await this.#t(e())}};function Xn(t){if(t.level==="query"){let e=`kysely:query:${t.isStream?"stream:":""}`;console.log(`${e} ${t.query.sql}`),console.log(`${e} duration: ${t.queryDurationMillis.toFixed(1)}ms`)}else t.level==="error"&&(t.error instanceof Error?console.error(`kysely:error: ${t.error.stack??t.error.message}`):console.error(`kysely:error: ${JSON.stringify({error:t.error,query:t.query.sql,queryDurationMillis:t.queryDurationMillis})}`))}function en(t){return B(t)&&k(t.compile)}Symbol.asyncDispose??=Symbol("Symbol.asyncDispose");var kt=class t extends ut{#e;constructor(e){let r,o;if(Zn(e))r={executor:e.executor},o={...e};else{let n=e.dialect,a=n.createDriver(),p=n.createQueryCompiler(),m=n.createAdapter(),y=new $r(e.log??[]),b=new Jr(a,y),E=new Vr(b),P=new zr(p,m,E,e.plugins??[]);r={executor:P},o={config:e,executor:P,dialect:n,driver:b}}super(r),this.#e=i(o)}get schema(){return new Fr(this.#e.executor)}get dynamic(){return new Mr}get introspection(){return this.#e.dialect.createIntrospector(this.withoutPlugins())}case(e){return new dt({node:ee.create(G(e)?void 0:j(e))})}get fn(){return yr()}transaction(){return new Ji({...this.#e})}startTransaction(){return new $i({...this.#e})}connection(){return new Ui({...this.#e})}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new oe(e))})}withTables(){return new t({...this.#e})}async destroy(){await this.#e.driver.destroy()}get isTransaction(){return!1}getExecutor(){return this.#e.executor}executeQuery(e,r){r!==void 0&&fe("Passing `queryId` in `db.executeQuery` is deprecated and will result in a compile-time error in the future.");let o=en(e)?e.compile():e;return this.getExecutor().executeQuery(o)}async[Symbol.asyncDispose](){await this.destroy()}},jr=class t extends kt{#e;constructor(e){super(e),this.#e=e}get isTransaction(){return!0}transaction(){throw new Error("calling the transaction method for a Transaction is not supported")}connection(){throw new Error("calling the connection method for a Transaction is not supported")}async destroy(){throw new Error("calling the destroy method for a Transaction is not supported")}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new oe(e))})}withTables(){return new t({...this.#e})}};function Zn(t){return B(t)&&B(t.config)&&B(t.driver)&&B(t.executor)&&B(t.dialect)}var Ui=class{#e;constructor(e){this.#e=i(e)}async execute(e){return this.#e.executor.provideConnection(async r=>{let o=this.#e.executor.withConnectionProvider(new Wt(r)),n=new kt({...this.#e,executor:o});return await e(n)})}},Ji=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(e){let{isolationLevel:r,accessMode:o,...n}=this.#e,a={isolationLevel:r,accessMode:o};return zi(a),this.#e.executor.provideConnection(async p=>{let m=this.#e.executor.withConnectionProvider(new Wt(p)),y=new jr({...n,executor:m}),b=!1;try{await this.#e.driver.beginTransaction(p,a),b=!0;let E=await e(y);return await this.#e.driver.commitTransaction(p),E}catch(E){throw b&&await this.#e.driver.rollbackTransaction(p),E}})}},$i=class t{#e;constructor(e){this.#e=i(e)}setAccessMode(e){return new t({...this.#e,accessMode:e})}setIsolationLevel(e){return new t({...this.#e,isolationLevel:e})}async execute(){let{isolationLevel:e,accessMode:r,...o}=this.#e,n={isolationLevel:e,accessMode:r};zi(n);let a=await cr(this.#e.executor);return await this.#e.driver.beginTransaction(a.connection,n),new ji({...o,connection:a,executor:this.#e.executor.withConnectionProvider(new Wt(a.connection))})}},ji=class t extends jr{#e;#t;#r;constructor(e){let r={isCommitted:!1,isRolledBack:!1};e={...e,executor:new Ki(e.executor,r)};let{connection:o,...n}=e;super(n),this.#e=i(e),this.#r=r;let a=f();this.#t=p=>e.executor.compileQuery(p,a)}get isCommitted(){return this.#r.isCommitted}get isRolledBack(){return this.#r.isRolledBack}commit(){return Ke(this.#r),new je(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#r.isCommitted=!0,this.#e.connection.release()})}rollback(){return Ke(this.#r),new je(async()=>{await this.#e.driver.rollbackTransaction(this.#e.connection.connection),this.#r.isRolledBack=!0,this.#e.connection.release()})}savepoint(e){return Ke(this.#r),new je(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}rollbackToSavepoint(e){return Ke(this.#r),new je(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}releaseSavepoint(e){return Ke(this.#r),new je(async()=>(await this.#e.driver.releaseSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}withPlugin(e){return new t({...this.#e,executor:this.#e.executor.withPlugin(e)})}withoutPlugins(){return new t({...this.#e,executor:this.#e.executor.withoutPlugins()})}withSchema(e){return new t({...this.#e,executor:this.#e.executor.withPluginAtFront(new oe(e))})}withTables(){return new t({...this.#e})}},je=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function Ke(t){if(t.isCommitted)throw new Error("Transaction is already committed");if(t.isRolledBack)throw new Error("Transaction is already rolled back")}var Ki=class t{#e;#t;constructor(e,r){e instanceof t?this.#e=e.#e:this.#e=e,this.#t=r}get adapter(){return this.#e.adapter}get plugins(){return this.#e.plugins}transformQuery(e,r){return this.#e.transformQuery(e,r)}compileQuery(e,r){return this.#e.compileQuery(e,r)}provideConnection(e){return this.#e.provideConnection(e)}executeQuery(e){return Ke(this.#t),this.#e.executeQuery(e)}stream(e,r){return Ke(this.#t),this.#e.stream(e,r)}withConnectionProvider(e){return new t(this.#e.withConnectionProvider(e),this.#t)}withPlugin(e){return new t(this.#e.withPlugin(e),this.#t)}withPlugins(e){return new t(this.#e.withPlugins(e),this.#t)}withPluginAtFront(e){return new t(this.#e.withPluginAtFront(e),this.#t)}withoutPlugins(){return new t(this.#e.withoutPlugins(),this.#t)}};var Gi=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}get isRawBuilder(){return!0}as(e){return new Yi(this,e)}$castTo(){return new t({...this.#e})}$notNull(){return new t(this.#e)}withPlugin(e){return new t({...this.#e,plugins:this.#e.plugins!==void 0?i([...this.#e.plugins,e]):i([e])})}toOperationNode(){return this.#r(this.#t())}compile(e){return this.#i(this.#t(e))}async execute(e){let r=this.#t(e);return r.executeQuery(this.#i(r))}#t(e){let r=e!==void 0?e.getExecutor():Le;return this.#e.plugins!==void 0?r.withPlugins(this.#e.plugins):r}#r(e){return e.transformQuery(this.#e.rawNode,this.#e.queryId)}#i(e){return e.compileQuery(this.#r(e),this.#e.queryId)}};function Ae(t){return new Gi(t)}var Yi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}get rawBuilder(){return this.#e}toOperationNode(){return S.create(this.#e.toOperationNode(),C(this.#t)?this.#t.toOperationNode():d.create(this.#t))}};var K=Object.assign((t,...e)=>Ae({queryId:f(),rawNode:w.create(t,e?.map(tn)??[])}),{ref(t){return Ae({queryId:f(),rawNode:w.createWithChild(H(t))})},val(t){return Ae({queryId:f(),rawNode:w.createWithChild(g(t))})},value(t){return this.val(t)},table(t){return Ae({queryId:f(),rawNode:w.createWithChild(l(t))})},id(...t){let e=new Array(t.length+1).fill(".");return e[0]="",e[e.length-1]="",Ae({queryId:f(),rawNode:w.create(e,t.map(d.create))})},lit(t){return Ae({queryId:f(),rawNode:w.createWithChild(T.createImmediate(t))})},literal(t){return this.lit(t)},raw(t){return Ae({queryId:f(),rawNode:w.createWithSql(t)})},join(t,e=K`, `){let r=new Array(Math.max(2*t.length-1,0)),o=e.toOperationNode();for(let n=0;n<t.length;++n)r[2*n]=tn(t[n]),n!==t.length-1&&(r[2*n+1]=o);return Ae({queryId:f(),rawNode:w.createWithChildren(r)})}});function tn(t){return C(t)?t.toOperationNode():g(t)}var Kr=class{nodeStack=[];get parentNode(){return this.nodeStack[this.nodeStack.length-2]}#e=i({AliasNode:this.visitAlias.bind(this),ColumnNode:this.visitColumn.bind(this),IdentifierNode:this.visitIdentifier.bind(this),SchemableIdentifierNode:this.visitSchemableIdentifier.bind(this),RawNode:this.visitRaw.bind(this),ReferenceNode:this.visitReference.bind(this),SelectQueryNode:this.visitSelectQuery.bind(this),SelectionNode:this.visitSelection.bind(this),TableNode:this.visitTable.bind(this),FromNode:this.visitFrom.bind(this),SelectAllNode:this.visitSelectAll.bind(this),AndNode:this.visitAnd.bind(this),OrNode:this.visitOr.bind(this),ValueNode:this.visitValue.bind(this),ValueListNode:this.visitValueList.bind(this),PrimitiveValueListNode:this.visitPrimitiveValueList.bind(this),ParensNode:this.visitParens.bind(this),JoinNode:this.visitJoin.bind(this),OperatorNode:this.visitOperator.bind(this),WhereNode:this.visitWhere.bind(this),InsertQueryNode:this.visitInsertQuery.bind(this),DeleteQueryNode:this.visitDeleteQuery.bind(this),ReturningNode:this.visitReturning.bind(this),CreateTableNode:this.visitCreateTable.bind(this),AddColumnNode:this.visitAddColumn.bind(this),ColumnDefinitionNode:this.visitColumnDefinition.bind(this),DropTableNode:this.visitDropTable.bind(this),DataTypeNode:this.visitDataType.bind(this),OrderByNode:this.visitOrderBy.bind(this),OrderByItemNode:this.visitOrderByItem.bind(this),GroupByNode:this.visitGroupBy.bind(this),GroupByItemNode:this.visitGroupByItem.bind(this),UpdateQueryNode:this.visitUpdateQuery.bind(this),ColumnUpdateNode:this.visitColumnUpdate.bind(this),LimitNode:this.visitLimit.bind(this),OffsetNode:this.visitOffset.bind(this),OnConflictNode:this.visitOnConflict.bind(this),OnDuplicateKeyNode:this.visitOnDuplicateKey.bind(this),CreateIndexNode:this.visitCreateIndex.bind(this),DropIndexNode:this.visitDropIndex.bind(this),ListNode:this.visitList.bind(this),PrimaryKeyConstraintNode:this.visitPrimaryKeyConstraint.bind(this),UniqueConstraintNode:this.visitUniqueConstraint.bind(this),ReferencesNode:this.visitReferences.bind(this),CheckConstraintNode:this.visitCheckConstraint.bind(this),WithNode:this.visitWith.bind(this),CommonTableExpressionNode:this.visitCommonTableExpression.bind(this),CommonTableExpressionNameNode:this.visitCommonTableExpressionName.bind(this),HavingNode:this.visitHaving.bind(this),CreateSchemaNode:this.visitCreateSchema.bind(this),DropSchemaNode:this.visitDropSchema.bind(this),AlterTableNode:this.visitAlterTable.bind(this),DropColumnNode:this.visitDropColumn.bind(this),RenameColumnNode:this.visitRenameColumn.bind(this),AlterColumnNode:this.visitAlterColumn.bind(this),ModifyColumnNode:this.visitModifyColumn.bind(this),AddConstraintNode:this.visitAddConstraint.bind(this),DropConstraintNode:this.visitDropConstraint.bind(this),RenameConstraintNode:this.visitRenameConstraint.bind(this),ForeignKeyConstraintNode:this.visitForeignKeyConstraint.bind(this),CreateViewNode:this.visitCreateView.bind(this),RefreshMaterializedViewNode:this.visitRefreshMaterializedView.bind(this),DropViewNode:this.visitDropView.bind(this),GeneratedNode:this.visitGenerated.bind(this),DefaultValueNode:this.visitDefaultValue.bind(this),OnNode:this.visitOn.bind(this),ValuesNode:this.visitValues.bind(this),SelectModifierNode:this.visitSelectModifier.bind(this),CreateTypeNode:this.visitCreateType.bind(this),DropTypeNode:this.visitDropType.bind(this),ExplainNode:this.visitExplain.bind(this),DefaultInsertValueNode:this.visitDefaultInsertValue.bind(this),AggregateFunctionNode:this.visitAggregateFunction.bind(this),OverNode:this.visitOver.bind(this),PartitionByNode:this.visitPartitionBy.bind(this),PartitionByItemNode:this.visitPartitionByItem.bind(this),SetOperationNode:this.visitSetOperation.bind(this),BinaryOperationNode:this.visitBinaryOperation.bind(this),UnaryOperationNode:this.visitUnaryOperation.bind(this),UsingNode:this.visitUsing.bind(this),FunctionNode:this.visitFunction.bind(this),CaseNode:this.visitCase.bind(this),WhenNode:this.visitWhen.bind(this),JSONReferenceNode:this.visitJSONReference.bind(this),JSONPathNode:this.visitJSONPath.bind(this),JSONPathLegNode:this.visitJSONPathLeg.bind(this),JSONOperatorChainNode:this.visitJSONOperatorChain.bind(this),TupleNode:this.visitTuple.bind(this),MergeQueryNode:this.visitMergeQuery.bind(this),MatchedNode:this.visitMatched.bind(this),AddIndexNode:this.visitAddIndex.bind(this),CastNode:this.visitCast.bind(this),FetchNode:this.visitFetch.bind(this),TopNode:this.visitTop.bind(this),OutputNode:this.visitOutput.bind(this),OrActionNode:this.visitOrAction.bind(this),CollateNode:this.visitCollate.bind(this)});visitNode=e=>{this.nodeStack.push(e),this.#e[e.kind](e),this.nodeStack.pop()}};var _n=/'/g,Gr=class extends Kr{#e="";#t=[];get numParameters(){return this.#t.length}compileQuery(e,r){return this.#e="",this.#t=[],this.nodeStack.splice(0,this.nodeStack.length),this.visitNode(e),i({query:e,queryId:r,sql:this.getSql(),parameters:[...this.#t]})}getSql(){return this.#e}visitSelectQuery(e){let r=this.parentNode!==void 0&&!Z.is(this.parentNode)&&!A.is(this.parentNode)&&!M.is(this.parentNode)&&!he.is(this.parentNode)&&!fr.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("select"),e.distinctOn&&(this.append(" "),this.compileDistinctOn(e.distinctOn)),e.frontModifiers?.length&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.top&&(this.append(" "),this.visitNode(e.top)),e.selections&&(this.append(" "),this.compileList(e.selections)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.groupBy&&(this.append(" "),this.visitNode(e.groupBy)),e.having&&(this.append(" "),this.visitNode(e.having)),e.setOperations&&(this.append(" "),this.compileList(e.setOperations," ")),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.offset&&(this.append(" "),this.visitNode(e.offset)),e.fetch&&(this.append(" "),this.visitNode(e.fetch)),e.endModifiers?.length&&(this.append(" "),this.compileList(this.sortSelectModifiers([...e.endModifiers])," ")),r&&this.append(")")}visitFrom(e){this.append("from "),this.compileList(e.froms)}visitSelection(e){this.visitNode(e.selection)}visitColumn(e){this.visitNode(e.column)}compileDistinctOn(e){this.append("distinct on ("),this.compileList(e),this.append(")")}compileList(e,r=", "){let o=e.length-1;for(let n=0;n<=o;n++)this.visitNode(e[n]),n<o&&this.append(r)}visitWhere(e){this.append("where "),this.visitNode(e.where)}visitHaving(e){this.append("having "),this.visitNode(e.having)}visitInsertQuery(e){let r=this.parentNode!==void 0&&!Z.is(this.parentNode)&&!w.is(this.parentNode)&&!re.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append(e.replace?"replace":"insert"),e.ignore&&(fe("`InsertQueryNode.ignore` is deprecated. Use `InsertQueryNode.orAction` instead."),this.append(" ignore")),e.orAction&&(this.append(" "),this.visitNode(e.orAction)),e.top&&(this.append(" "),this.visitNode(e.top)),e.into&&(this.append(" into "),this.visitNode(e.into)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.output&&(this.append(" "),this.visitNode(e.output)),e.values&&(this.append(" "),this.visitNode(e.values)),e.defaultValues&&(this.append(" "),this.append("default values")),e.onConflict&&(this.append(" "),this.visitNode(e.onConflict)),e.onDuplicateKey&&(this.append(" "),this.visitNode(e.onDuplicateKey)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitValues(e){this.append("values "),this.compileList(e.values)}visitDeleteQuery(e){let r=this.parentNode!==void 0&&!Z.is(this.parentNode)&&!w.is(this.parentNode);this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("delete "),e.top&&(this.visitNode(e.top),this.append(" ")),this.visitNode(e.from),e.output&&(this.append(" "),this.visitNode(e.output)),e.using&&(this.append(" "),this.visitNode(e.using)),e.joins&&(this.append(" "),this.compileList(e.joins," ")),e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitReturning(e){this.append("returning "),this.compileList(e.selections)}visitAlias(e){this.visitNode(e.node),this.append(" as "),this.visitNode(e.alias)}visitReference(e){e.table&&(this.visitNode(e.table),this.append(".")),this.visitNode(e.column)}visitSelectAll(e){this.append("*")}visitIdentifier(e){this.append(this.getLeftIdentifierWrapper()),this.compileUnwrappedIdentifier(e),this.append(this.getRightIdentifierWrapper())}compileUnwrappedIdentifier(e){if(!W(e.name))throw new Error("a non-string identifier was passed to compileUnwrappedIdentifier.");this.append(this.sanitizeIdentifier(e.name))}visitAnd(e){this.visitNode(e.left),this.append(" and "),this.visitNode(e.right)}visitOr(e){this.visitNode(e.left),this.append(" or "),this.visitNode(e.right)}visitValue(e){e.immediate?this.appendImmediateValue(e.value):this.appendValue(e.value)}visitValueList(e){this.append("("),this.compileList(e.values),this.append(")")}visitTuple(e){this.append("("),this.compileList(e.values),this.append(")")}visitPrimitiveValueList(e){this.append("(");let{values:r}=e;for(let o=0;o<r.length;++o)this.appendValue(r[o]),o!==r.length-1&&this.append(", ");this.append(")")}visitParens(e){this.append("("),this.visitNode(e.node),this.append(")")}visitJoin(e){this.append(ts[e.joinType]),this.append(" "),this.visitNode(e.table),e.on&&(this.append(" "),this.visitNode(e.on))}visitOn(e){this.append("on "),this.visitNode(e.on)}visitRaw(e){let{sqlFragments:r,parameters:o}=e;for(let n=0;n<r.length;++n)this.append(r[n]),o.length>n&&this.visitNode(o[n])}visitOperator(e){this.append(e.operator)}visitTable(e){this.visitNode(e.table)}visitSchemableIdentifier(e){e.schema&&(this.visitNode(e.schema),this.append(".")),this.visitNode(e.identifier)}visitCreateTable(e){this.append("create "),e.frontModifiers&&e.frontModifiers.length>0&&(this.compileList(e.frontModifiers," "),this.append(" ")),e.temporary&&this.append("temporary "),this.append("table "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.table),e.selectQuery?(this.append(" as "),this.visitNode(e.selectQuery)):(this.append(" ("),this.compileList([...e.columns,...e.constraints??[]]),this.append(")"),e.onCommit&&(this.append(" on commit "),this.append(e.onCommit)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," ")))}visitColumnDefinition(e){e.ifNotExists&&this.append("if not exists "),this.visitNode(e.column),this.append(" "),this.visitNode(e.dataType),e.unsigned&&this.append(" unsigned"),e.frontModifiers&&e.frontModifiers.length>0&&(this.append(" "),this.compileList(e.frontModifiers," ")),e.generated&&(this.append(" "),this.visitNode(e.generated)),e.identity&&this.append(" identity"),e.defaultTo&&(this.append(" "),this.visitNode(e.defaultTo)),e.notNull&&this.append(" not null"),e.unique&&this.append(" unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.primaryKey&&this.append(" primary key"),e.autoIncrement&&(this.append(" "),this.append(this.getAutoIncrement())),e.references&&(this.append(" "),this.visitNode(e.references)),e.check&&(this.append(" "),this.visitNode(e.check)),e.endModifiers&&e.endModifiers.length>0&&(this.append(" "),this.compileList(e.endModifiers," "))}getAutoIncrement(){return"auto_increment"}visitReferences(e){this.append("references "),this.visitNode(e.table),this.append(" ("),this.compileList(e.columns),this.append(")"),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate))}visitDropTable(e){this.append("drop table "),e.ifExists&&this.append("if exists "),this.visitNode(e.table),e.cascade&&this.append(" cascade")}visitDataType(e){this.append(e.dataType)}visitOrderBy(e){this.append("order by "),this.compileList(e.items)}visitOrderByItem(e){this.visitNode(e.orderBy),e.collation&&(this.append(" "),this.visitNode(e.collation)),e.direction&&(this.append(" "),this.visitNode(e.direction)),e.nulls&&(this.append(" nulls "),this.append(e.nulls))}visitGroupBy(e){this.append("group by "),this.compileList(e.items)}visitGroupByItem(e){this.visitNode(e.groupBy)}visitUpdateQuery(e){let r=this.parentNode!==void 0&&!Z.is(this.parentNode)&&!w.is(this.parentNode)&&!re.is(this.parentNode);if(this.parentNode===void 0&&e.explain&&(this.visitNode(e.explain),this.append(" ")),r&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append("update "),e.top&&(this.visitNode(e.top),this.append(" ")),e.table&&(this.visitNode(e.table),this.append(" ")),this.append("set "),e.updates&&this.compileList(e.updates),e.output&&(this.append(" "),this.visitNode(e.output)),e.from&&(this.append(" "),this.visitNode(e.from)),e.joins){if(!e.from)throw new Error("Joins in an update query are only supported as a part of a PostgreSQL 'update set from join' query. If you want to create a MySQL 'update join set' query, see https://kysely.dev/docs/examples/update/my-sql-joins");this.append(" "),this.compileList(e.joins," ")}e.where&&(this.append(" "),this.visitNode(e.where)),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),e.limit&&(this.append(" "),this.visitNode(e.limit)),e.returning&&(this.append(" "),this.visitNode(e.returning)),r&&this.append(")"),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitColumnUpdate(e){this.visitNode(e.column),this.append(" = "),this.visitNode(e.value)}visitLimit(e){this.append("limit "),this.visitNode(e.limit)}visitOffset(e){this.append("offset "),this.visitNode(e.offset)}visitOnConflict(e){this.append("on conflict"),e.columns?(this.append(" ("),this.compileList(e.columns),this.append(")")):e.constraint?(this.append(" on constraint "),this.visitNode(e.constraint)):e.indexExpression&&(this.append(" ("),this.visitNode(e.indexExpression),this.append(")")),e.indexWhere&&(this.append(" "),this.visitNode(e.indexWhere)),e.doNothing===!0?this.append(" do nothing"):e.updates&&(this.append(" do update set "),this.compileList(e.updates),e.updateWhere&&(this.append(" "),this.visitNode(e.updateWhere)))}visitOnDuplicateKey(e){this.append("on duplicate key update "),this.compileList(e.updates)}visitCreateIndex(e){this.append("create "),e.unique&&this.append("unique "),this.append("index "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.using&&(this.append(" using "),this.visitNode(e.using)),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.nullsNotDistinct&&this.append(" nulls not distinct"),e.where&&(this.append(" "),this.visitNode(e.where))}visitDropIndex(e){this.append("drop index "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.table&&(this.append(" on "),this.visitNode(e.table)),e.cascade&&this.append(" cascade")}visitCreateSchema(e){this.append("create schema "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.schema)}visitDropSchema(e){this.append("drop schema "),e.ifExists&&this.append("if exists "),this.visitNode(e.schema),e.cascade&&this.append(" cascade")}visitPrimaryKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("primary key ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}buildDeferrable(e){e.deferrable!==void 0&&(e.deferrable?this.append(" deferrable"):this.append(" not deferrable")),e.initiallyDeferred!==void 0&&(e.initiallyDeferred?this.append(" initially deferred"):this.append(" initially immediate"))}visitUniqueConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("unique"),e.nullsNotDistinct&&this.append(" nulls not distinct"),this.append(" ("),this.compileList(e.columns),this.append(")"),this.buildDeferrable(e)}visitCheckConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("check ("),this.visitNode(e.expression),this.append(")")}visitForeignKeyConstraint(e){e.name&&(this.append("constraint "),this.visitNode(e.name),this.append(" ")),this.append("foreign key ("),this.compileList(e.columns),this.append(") "),this.visitNode(e.references),e.onDelete&&(this.append(" on delete "),this.append(e.onDelete)),e.onUpdate&&(this.append(" on update "),this.append(e.onUpdate)),this.buildDeferrable(e)}visitList(e){this.compileList(e.items)}visitWith(e){this.append("with "),e.recursive&&this.append("recursive "),this.compileList(e.expressions)}visitCommonTableExpression(e){this.visitNode(e.name),this.append(" as "),Fe(e.materialized)&&(e.materialized||this.append("not "),this.append("materialized ")),this.visitNode(e.expression)}visitCommonTableExpressionName(e){this.visitNode(e.table),e.columns&&(this.append("("),this.compileList(e.columns),this.append(")"))}visitAlterTable(e){this.append("alter table "),this.visitNode(e.table),this.append(" "),e.renameTo&&(this.append("rename to "),this.visitNode(e.renameTo)),e.setSchema&&(this.append("set schema "),this.visitNode(e.setSchema)),e.addConstraint&&this.visitNode(e.addConstraint),e.dropConstraint&&this.visitNode(e.dropConstraint),e.renameConstraint&&this.visitNode(e.renameConstraint),e.columnAlterations&&this.compileColumnAlterations(e.columnAlterations),e.addIndex&&this.visitNode(e.addIndex),e.dropIndex&&this.visitNode(e.dropIndex)}visitAddColumn(e){this.append("add column "),this.visitNode(e.column)}visitRenameColumn(e){this.append("rename column "),this.visitNode(e.column),this.append(" to "),this.visitNode(e.renameTo)}visitDropColumn(e){this.append("drop column "),this.visitNode(e.column)}visitAlterColumn(e){this.append("alter column "),this.visitNode(e.column),this.append(" "),e.dataType&&(this.announcesNewColumnDataType()&&this.append("type "),this.visitNode(e.dataType),e.dataTypeExpression&&(this.append("using "),this.visitNode(e.dataTypeExpression))),e.setDefault&&(this.append("set default "),this.visitNode(e.setDefault)),e.dropDefault&&this.append("drop default"),e.setNotNull&&this.append("set not null"),e.dropNotNull&&this.append("drop not null")}visitModifyColumn(e){this.append("modify column "),this.visitNode(e.column)}visitAddConstraint(e){this.append("add "),this.visitNode(e.constraint)}visitDropConstraint(e){this.append("drop constraint "),e.ifExists&&this.append("if exists "),this.visitNode(e.constraintName),e.modifier==="cascade"?this.append(" cascade"):e.modifier==="restrict"&&this.append(" restrict")}visitRenameConstraint(e){this.append("rename constraint "),this.visitNode(e.oldName),this.append(" to "),this.visitNode(e.newName)}visitSetOperation(e){this.append(e.operator),this.append(" "),e.all&&this.append("all "),this.visitNode(e.expression)}visitCreateView(e){this.append("create "),e.orReplace&&this.append("or replace "),e.materialized&&this.append("materialized "),e.temporary&&this.append("temporary "),this.append("view "),e.ifNotExists&&this.append("if not exists "),this.visitNode(e.name),this.append(" "),e.columns&&(this.append("("),this.compileList(e.columns),this.append(") ")),e.as&&(this.append("as "),this.visitNode(e.as))}visitRefreshMaterializedView(e){this.append("refresh materialized view "),e.concurrently&&this.append("concurrently "),this.visitNode(e.name),e.withNoData?this.append(" with no data"):this.append(" with data")}visitDropView(e){this.append("drop "),e.materialized&&this.append("materialized "),this.append("view "),e.ifExists&&this.append("if exists "),this.visitNode(e.name),e.cascade&&this.append(" cascade")}visitGenerated(e){this.append("generated "),e.always&&this.append("always "),e.byDefault&&this.append("by default "),this.append("as "),e.identity&&this.append("identity"),e.expression&&(this.append("("),this.visitNode(e.expression),this.append(")")),e.stored&&this.append(" stored")}visitDefaultValue(e){this.append("default "),this.visitNode(e.defaultValue)}visitSelectModifier(e){e.rawModifier?this.visitNode(e.rawModifier):this.append(es[e.modifier]),e.of&&(this.append(" of "),this.compileList(e.of,", "))}visitCreateType(e){this.append("create type "),this.visitNode(e.name),e.enum&&(this.append(" as enum "),this.visitNode(e.enum))}visitDropType(e){this.append("drop type "),e.ifExists&&this.append("if exists "),this.visitNode(e.name)}visitExplain(e){this.append("explain"),(e.options||e.format)&&(this.append(" "),this.append(this.getLeftExplainOptionsWrapper()),e.options&&(this.visitNode(e.options),e.format&&this.append(this.getExplainOptionsDelimiter())),e.format&&(this.append("format"),this.append(this.getExplainOptionAssignment()),this.append(e.format)),this.append(this.getRightExplainOptionsWrapper()))}visitDefaultInsertValue(e){this.append("default")}visitAggregateFunction(e){this.append(e.func),this.append("("),e.distinct&&this.append("distinct "),this.compileList(e.aggregated),e.orderBy&&(this.append(" "),this.visitNode(e.orderBy)),this.append(")"),e.withinGroup&&(this.append(" within group ("),this.visitNode(e.withinGroup),this.append(")")),e.filter&&(this.append(" filter("),this.visitNode(e.filter),this.append(")")),e.over&&(this.append(" "),this.visitNode(e.over))}visitOver(e){this.append("over("),e.partitionBy&&(this.visitNode(e.partitionBy),e.orderBy&&this.append(" ")),e.orderBy&&this.visitNode(e.orderBy),this.append(")")}visitPartitionBy(e){this.append("partition by "),this.compileList(e.items)}visitPartitionByItem(e){this.visitNode(e.partitionBy)}visitBinaryOperation(e){this.visitNode(e.leftOperand),this.append(" "),this.visitNode(e.operator),this.append(" "),this.visitNode(e.rightOperand)}visitUnaryOperation(e){this.visitNode(e.operator),this.isMinusOperator(e.operator)||this.append(" "),this.visitNode(e.operand)}isMinusOperator(e){return Y.is(e)&&e.operator==="-"}visitUsing(e){this.append("using "),this.compileList(e.tables)}visitFunction(e){this.append(e.func),this.append("("),this.compileList(e.arguments),this.append(")")}visitCase(e){this.append("case"),e.value&&(this.append(" "),this.visitNode(e.value)),e.when&&(this.append(" "),this.compileList(e.when," ")),e.else&&(this.append(" else "),this.visitNode(e.else)),this.append(" end"),e.isStatement&&this.append(" case")}visitWhen(e){this.append("when "),this.visitNode(e.condition),e.result&&(this.append(" then "),this.visitNode(e.result))}visitJSONReference(e){this.visitNode(e.reference),this.visitNode(e.traversal)}visitJSONPath(e){e.inOperator&&this.visitNode(e.inOperator),this.append("'$");for(let r of e.pathLegs)this.visitNode(r);this.append("'")}visitJSONPathLeg(e){let r=e.type==="ArrayLocation";this.append(r?"[":"."),this.append(String(e.value)),r&&this.append("]")}visitJSONOperatorChain(e){for(let r=0,o=e.values.length;r<o;r++)r===o-1?this.visitNode(e.operator):this.append("->"),this.visitNode(e.values[r])}visitMergeQuery(e){e.with&&(this.visitNode(e.with),this.append(" ")),this.append("merge "),e.top&&(this.visitNode(e.top),this.append(" ")),this.append("into "),this.visitNode(e.into),e.using&&(this.append(" "),this.visitNode(e.using)),e.whens&&(this.append(" "),this.compileList(e.whens," ")),e.returning&&(this.append(" "),this.visitNode(e.returning)),e.output&&(this.append(" "),this.visitNode(e.output)),e.endModifiers?.length&&(this.append(" "),this.compileList(e.endModifiers," "))}visitMatched(e){e.not&&this.append("not "),this.append("matched"),e.bySource&&this.append(" by source")}visitAddIndex(e){this.append("add "),e.unique&&this.append("unique "),this.append("index "),this.visitNode(e.name),e.columns&&(this.append(" ("),this.compileList(e.columns),this.append(")")),e.using&&(this.append(" using "),this.visitNode(e.using))}visitCast(e){this.append("cast("),this.visitNode(e.expression),this.append(" as "),this.visitNode(e.dataType),this.append(")")}visitFetch(e){this.append("fetch next "),this.visitNode(e.rowCount),this.append(` rows ${e.modifier}`)}visitOutput(e){this.append("output "),this.compileList(e.selections)}visitTop(e){this.append(`top(${e.expression})`),e.modifiers&&this.append(` ${e.modifiers}`)}visitOrAction(e){this.append(e.action)}visitCollate(e){this.append("collate "),this.visitNode(e.collation)}append(e){this.#e+=e}appendValue(e){this.addParameter(e),this.append(this.getCurrentParameterPlaceholder())}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getCurrentParameterPlaceholder(){return"$"+this.numParameters}getLeftExplainOptionsWrapper(){return"("}getExplainOptionAssignment(){return" "}getExplainOptionsDelimiter(){return", "}getRightExplainOptionsWrapper(){return")"}sanitizeIdentifier(e){let r=this.getLeftIdentifierWrapper(),o=this.getRightIdentifierWrapper(),n="";for(let a of e)n+=a,a===r?n+=r:a===o&&(n+=o);return n}sanitizeStringLiteral(e){return e.replace(_n,"''")}addParameter(e){this.#t.push(e)}appendImmediateValue(e){if(W(e))this.appendStringLiteral(e);else if(Se(e)||Fe(e)||Xe(e))this.append(e.toString());else if(He(e))this.append("null");else if(ao(e))this.appendImmediateValue(e.toISOString());else throw new Error(`invalid immediate value ${e}`)}appendStringLiteral(e){this.append("'"),this.append(this.sanitizeStringLiteral(e)),this.append("'")}sortSelectModifiers(e){return e.sort((r,o)=>r.modifier&&o.modifier?rn[r.modifier]-rn[o.modifier]:1),i(e)}compileColumnAlterations(e){this.compileList(e)}announcesNewColumnDataType(){return!0}},es=i({ForKeyShare:"for key share",ForNoKeyUpdate:"for no key update",ForUpdate:"for update",ForShare:"for share",NoWait:"nowait",SkipLocked:"skip locked",Distinct:"distinct"}),rn=i({ForKeyShare:1,ForNoKeyUpdate:1,ForUpdate:1,ForShare:1,NoWait:2,SkipLocked:2,Distinct:0}),ts=i({InnerJoin:"inner join",LeftJoin:"left join",RightJoin:"right join",FullJoin:"full join",CrossJoin:"cross join",LateralInnerJoin:"inner join lateral",LateralLeftJoin:"left join lateral",LateralCrossJoin:"cross join lateral",OuterApply:"outer apply",CrossApply:"cross apply",Using:"using"});var Yr=class{async init(){}async acquireConnection(){return new Hi}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},Hi=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};var Hr=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}get supportsOutput(){return!1}};var rs=/"/g,Xr=class extends Gr{visitOrAction(e){this.append("or "),this.append(e.action)}getCurrentParameterPlaceholder(){return"?"}getLeftExplainOptionsWrapper(){return""}getRightExplainOptionsWrapper(){return""}getLeftIdentifierWrapper(){return'"'}getRightIdentifierWrapper(){return'"'}getAutoIncrement(){return"autoincrement"}sanitizeIdentifier(e){return e.replace(rs,'""')}visitDefaultInsertValue(e){this.append("null")}};var Zr=class extends Hr{get supportsTransactionalDdl(){return!1}get supportsReturning(){return!0}async acquireMigrationLock(e,r){}async releaseMigrationLock(e,r){}};function nn(t){return new kt({dialect:{createAdapter:()=>new t.Adapter,createDriver:()=>new Yr,createIntrospector:()=>null,createQueryCompiler:()=>new t.QueryCompiler},plugins:[...t.noParameters?[new Xi]:[]]})}var Xi=class{#e=new Zi;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},Zi=class extends Be{transformPrimitiveValueList(e){return Ne.create(e.values.map(T.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function Ge(t,e){let r=t.compile();return{parameters:r.parameters,sql:r.sql,transformations:e?.transformations}}function _i(t,e){let r=is(t,e);return o=>o.where(n=>n.or(r.map(a=>n.and(a.map(([p,m])=>n(p,m===null?"is":Array.isArray(m)?"in":"=",m))))))}function is(t,e){let r=[],o=[],n=I();for(let m of t){let y=[];for(let b of Object.values(e)){let{isInPrimaryKey:E,name:P}=b;E&&(m===t.at(0)&&r.push(n.ref(P)),y.push(sn(m[P]??null,b)))}o.push(r.length===1?y.at(0):on(y))}let a=r.length===1?r.at(0):on(r),p=o.length===1?o.at(0):o;return[[[a,p]]]}function on(t){return K`(${K.join(t,K`, `)})`}function sn(t,e){let{datatype:r}=e,o=I();return t===null?o.lit(null):r.isNative?o.val(t):o.cast(o.val(t),K.id(r.schema,r.name))}function eo(t,e){if(t.length===0)return n=>n.lit(!0);let r=[],o=[];for(let n=0;n<t.length;n++)o.push(os(t[n],e)),(n===t.length-1||t[n].after==="or")&&(r.push(o),o=[]);return n=>{let a=r.map(p=>n.and(p.map(m=>m(n))));return n.or(a)}}function os(t,e){return t.kind==="ColumnFilter"?r=>{let{column:o,operator:n,value:a}=t,p=e[o];return r(p.datatype.group==="raw"?r.cast(o,"text"):o,n,sn(a,p))}:eo(t.filters,e)}function Ye(t){return nn({...t,Adapter:Zr,QueryCompiler:Xr})}function an(t,e){let{filter:r={after:"and",filters:[],kind:"FilterGroup"},pageIndex:o,pageSize:n,sortOrder:a,table:{columns:p,name:m}}=t,y=Ye(e),b=eo(r.filters,p),E=y.selectFrom(m).where(b).select(P=>P.cast(P.fn.coalesce(P.fn.countAll(),K.lit(0)),"text").as("value"));return Ge(y.with("count",()=>E).selectFrom([m,"count"]).where(b).select(K.ref("count.value").as("__ps_count__")).select(Object.keys(p)).$call(P=>a.reduce((zt,Tt)=>zt.orderBy(Tt.column,Tt.direction),P)).limit(n).offset(K.lit(BigInt(o)*BigInt(n))))}function un(t,e){let{rows:r,table:{columns:o,name:n}}=t,a=Ye(e);return Ge(a.deleteFrom(n).$call(_i(r,o)).returning(Object.keys(o)).returning(to().as("__ps_deleted_at__")))}function pn(t,e){let{table:{columns:r,name:o},rows:n}=t,a=Ye(e);return Ge(a.insertInto(o).values(n.map(p=>Object.keys(p).length===0?{[Object.keys(r)[0]]:null}:p)).returning(Object.keys(r)).returning(to().as("__ps_inserted_at__")))}function dn(t,e){let{changes:r,row:o,table:{columns:n,name:a}}=t,p=Ye(e);return Ge(p.updateTable(a).set(r).$call(_i([o],n)).returning(Object.keys(n)).returning(to().as("__ps_updated_at__")))}function to(){let t=I();return t.cast(t.cast(K`(julianday('now') - 2440587.5) * 86400000.0`,"integer"),"text")}function cn(t,e){let r=[];for(let{selection:o}of t.selections??[])if(Oe.is(o)&&c.is(o.column))r.push(ro(o.column.column.name),io(e,o.column.column.name));else if(c.is(o))r.push(ro(o.column.name),io(e,o.column.name));else if(S.is(o)&&d.is(o.alias))r.push(ro(o.alias.name),io(e,o.alias.name));else throw new Error("can't extract column names from the select query node");return r}function ro(t){return new N(T.createImmediate(t))}function io(t,e){return new N(Oe.create(c.create(e),U.create(t)))}function mn(t){return K`(select coalesce(json_group_array(json_object(${K.join(ns(t.toOperationNode(),"agg"))})), '[]') from ${t} as agg)`}function ns(t,e){try{return cn(t,e)}catch{throw new Error("SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.")}}function hn(t){return Ge(Ye(t).selectFrom(I().fn("pragma_table_list",[]).as("tl")).leftJoin("sqlite_schema as ss",e=>e.onRef("ss.type","=","tl.type").onRef("ss.name","=","tl.name")).where("tl.type","in",["table","view"]).where("tl.schema","=","main").where("tl.name","not like","sqlite_%").select(["tl.name","ss.sql"]).select(e=>[mn(e.selectFrom(e.fn("pragma_table_xinfo",["tl.name"]).as("txi")).leftJoin(e.fn("pragma_foreign_key_list",["tl.name"]).as("fkl"),"fkl.from","txi.name").where("txi.hidden","!=",1).select(["txi.name","txi.type as datatype","fkl.table as foreign_key_table","fkl.to as foreign_key_column"]).select(r=>[r("txi.hidden","in",[2,3]).as("computed"),r("txi.notnull","!=",0).as("nullable"),r("txi.pk","!=",0).as("pk")])).as("columns")]),{transformations:{columns:"json-parse"}})}var _r="main",ss=["=","!=",">",">=","<","<=","is","is not","like","not like"];function ln(t){let{executor:e,...r}=t;return{defaultSchema:_r,async delete(o,n){try{let a=un(o,r),[p]=await e.execute(a,n);return p?te({error:p,query:a}):[null,{...o,query:a}]}catch(a){return te({error:a})}},async insert(o,n){try{let a=pn(o,r),[p,m]=await e.execute(a,n);return p?te({error:p,query:a}):[null,{rows:m,query:a}]}catch(a){return te({error:a})}},async introspect(o){try{let n=hn(t),[a,p]=await e.execute(n,o);return a?te({error:a,query:n}):[null,as({query:n,tables:p})]}catch(n){return te({error:n})}},async query(o,n){try{let a=an(o,r),[p,m]=await e.execute(a,n);return p?te({error:p,query:a}):[null,{filteredRowCount:m[0]?.__ps_count__||"0",rows:m,query:a}]}catch(a){return te({error:a})}},async update(o,n){try{let a=dn(o,r),[p,m]=await e.execute(a,n);if(p)return te({error:p,query:a});let[y]=m;return y?[null,{row:y,query:a}]:te({error:new Error("Update failed"),query:a})}catch(a){return te({error:a})}}}}function as(t){let{tables:e,query:r}=t;return{filterOperators:ss,query:r,schemas:e.reduce((o,n)=>{let{columns:a,name:p,sql:m}=n,y=a.reduce((b,E)=>{let{datatype:P,foreign_key_column:zt,name:Tt}=E,oo=so(P);return b[Tt]={datatype:{...no[oo],affinity:oo,isArray:!1,isNative:!0,name:P,options:[],schema:_r},fkColumn:zt,fkSchema:zt?_r:null,fkTable:E.foreign_key_table,isComputed:!!E.computed,isInPrimaryKey:!!E.pk,name:Tt,nullable:!!E.nullable,schema:_r,table:p},b},{});return o.main.tables[p]={columns:y,name:p,schema:"main"},o},{main:{tables:{},name:"main"}}),timezone:"UTC"}}function fn(t){return{execute:e=>{let{parameters:r,sql:o,transformations:n}=e,a=t.prepare(o);try{let p=a.all(...r);if(!n||Object.keys(n).length===0)return Promise.resolve([null,p]);for(let m of p)for(let y in n){let b=n[y],E=m[y];if(b==="json-parse"){if(typeof E=="string")try{m[y]=JSON.parse(E)}catch(P){console.error(`Failed to JSON.parse column "${y}" with value: ${E}`,P)}continue}}return Promise.resolve([null,p])}catch(p){return Promise.resolve([p])}}}}function us(t){return ln({executor:fn(t)})}
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9ub2RlLXNxbGl0ZS9pbmRleC50cyIsICIuLi8uLi8uLi9kYXRhL2FkYXB0ZXIudHMiLCAiLi4vLi4vLi4vZGF0YS9zcWxpdGUtY29yZS9kYXRhdHlwZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvb2JqZWN0LXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXNjaGVtYS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbGxhdGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvb3JkZXItYnktaXRlbS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2ctb25jZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZnJvbS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2hhdmluZy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VzaW5nLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZXJlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZXR1cm5pbmctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2V4cGxhaW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21lcmdlLXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vdXRwdXQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9wYXJ0aXRpb24tYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdmFsdWVzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LWluc2VydC12YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2luc2VydC12YWx1ZXMtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29sdW1uLXVwZGF0ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb24tZHVwbGljYXRlLWtleS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9uby1yZXN1bHQtZXJyb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vbi1jb25mbGljdC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdG9wLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvdG9wLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLWFjdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXJlc3VsdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3dpdGgtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9yYW5kb20tc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9xdWVyeS1pZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21hdGNoZWQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9tZXJnZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2RlZmVycmVkLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWV4ZWN1dG9yL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9tZXJnZS1yZXN1bHQuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL21lcmdlLXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jcmVhdG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3BhcnNlLXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2pvaW4tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZ3JvdXAtYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2V0LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9jYXNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbGVnLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2pzb24tcGF0aC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdHVwbGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RhdGEtdHlwZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jYXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ2VuZXJhdGVkLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtZXhlY3V0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NoZWNrLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BsdWdpbi9pbW1lZGlhdGUtdmFsdWUvaW1tZWRpYXRlLXZhbHVlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtaW5kZXgtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXNjaGVtYS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXZpZXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3Atdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdHlwZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC10eXBlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC10eXBlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3NjaGVtYS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RyaXZlci9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wZXJmb3JtYW5jZS1ub3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvcnVudGltZS1kcml2ZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvZHJpdmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2NvbXBpbGFibGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9reXNlbHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9yYXctYnVpbGRlci9yYXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3Jhdy1idWlsZGVyL3NxbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jb21waWxlci9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC44L25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2R1bW15LWRyaXZlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3QvZGlhbGVjdC1hZGFwdGVyLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L3NxbGl0ZS9zcWxpdGUtcXVlcnktY29tcGlsZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4Ljgvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L3NxbGl0ZS9zcWxpdGUtYWRhcHRlci5qcyIsICIuLi8uLi8uLi9kYXRhL3F1ZXJ5LnRzIiwgIi4uLy4uLy4uL2RhdGEvc3FsaXRlLWNvcmUvYnVpbGRlci50cyIsICIuLi8uLi8uLi9kYXRhL3NxbGl0ZS1jb3JlL2RtbC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvanNvbi1vYmplY3QtYXJncy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguOC9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2hlbHBlcnMvc3FsaXRlLmpzIiwgIi4uLy4uLy4uL2RhdGEvc3FsaXRlLWNvcmUvaW50cm9zcGVjdGlvbi50cyIsICIuLi8uLi8uLi9kYXRhL3NxbGl0ZS1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgRGF0YWJhc2VTeW5jLCBTUUxJbnB1dFZhbHVlIH0gZnJvbSBcIm5vZGU6c3FsaXRlXCI7XG5cbmltcG9ydCB0eXBlIHsgQWRhcHRlciB9IGZyb20gXCIuLi9hZGFwdGVyXCI7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dG9yIH0gZnJvbSBcIi4uL2V4ZWN1dG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVTUUxpdGVBZGFwdGVyIH0gZnJvbSBcIi4uL3NxbGl0ZS1jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlU1FMaXRlRXhlY3V0b3IoZGF0YWJhc2U6IERhdGFiYXNlU3luYyk6IEV4ZWN1dG9yIHtcbiAgcmV0dXJuIHtcbiAgICBleGVjdXRlOiAocXVlcnkpID0+IHtcbiAgICAgIGNvbnN0IHsgcGFyYW1ldGVycywgc3FsLCB0cmFuc2Zvcm1hdGlvbnMgfSA9IHF1ZXJ5O1xuXG4gICAgICBjb25zdCBzdGF0ZW1lbnQgPSBkYXRhYmFzZS5wcmVwYXJlKHNxbCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBzdGF0ZW1lbnQuYWxsKC4uLihwYXJhbWV0ZXJzIGFzIFNRTElucHV0VmFsdWVbXSkpO1xuXG4gICAgICAgIGlmICghdHJhbnNmb3JtYXRpb25zIHx8IE9iamVjdC5rZXlzKHRyYW5zZm9ybWF0aW9ucykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbbnVsbCwgcm93c10pIGFzIG5ldmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHRyYW5zZm9ybWF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtYXRpb24gPSB0cmFuc2Zvcm1hdGlvbnNbY29sdW1uXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbl07XG5cbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1hdGlvbiA9PT0gXCJqc29uLXBhcnNlXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICByb3dbY29sdW1uXSA9IEpTT04ucGFyc2UodmFsdWUpIGFzIG5ldmVyO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gSlNPTi5wYXJzZSBjb2x1bW4gXCIke2NvbHVtbn1cIiB3aXRoIHZhbHVlOiAke3ZhbHVlfWAsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gc2F0aXNmaWVzIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtudWxsLCByb3dzXSkgYXMgbmV2ZXI7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtlcnJvciBhcyBFcnJvcl0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOb2RlU1FMaXRlQWRhcHRlcihkYXRhYmFzZTogRGF0YWJhc2VTeW5jKTogQWRhcHRlciB7XG4gIHJldHVybiBjcmVhdGVTUUxpdGVBZGFwdGVyKHtcbiAgICBleGVjdXRvcjogY3JlYXRlTm9kZVNRTGl0ZUV4ZWN1dG9yKGRhdGFiYXNlKSxcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRvciB9IGZyb20gXCIuL2V4ZWN1dG9yXCI7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5IH0gZnJvbSBcIi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgQmlnSW50U3RyaW5nLCBFaXRoZXIsIE51bWVyaWNTdHJpbmcgfSBmcm9tIFwiLi90eXBlLXV0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlclJlcXVpcmVtZW50cyB7XG4gIGV4ZWN1dG9yOiBFeGVjdXRvcjtcbiAgbm9QYXJhbWV0ZXJzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlbWEgc3R1ZGlvIHdpbGwgY2hvb3NlIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIGUuZy4gYHB1YmxpY2AgZm9yIFBvc3RncmVTUUxcbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRTY2hlbWE/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludHJvc3BlY3RzIHRoZSBkYXRhYmFzZSBhbmQgcmV0dXJucyBzdHJ1Y3R1cmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzY2hlbWFzLCB0YWJsZXMsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgaW50cm9zcGVjdGlvbiByZXF1ZXN0LlxuICAgKi9cbiAgaW50cm9zcGVjdChvcHRpb25zOiBBZGFwdGVySW50cm9zcGVjdE9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0Pj47XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgc3RydWN0dXJlZCBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIHF1ZXJ5KGRldGFpbHM6IEFkYXB0ZXJRdWVyeURldGFpbHMsIG9wdGlvbnM6IEFkYXB0ZXJRdWVyeU9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxBZGFwdGVyRXJyb3IsIEFkYXB0ZXJRdWVyeVJlc3VsdD4+O1xuXG4gIC8qKlxuICAgKiBJbnNlcnRzIGEgc2luZ2xlIHJvdyBpbnRvIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIGluc2VydChcbiAgICBkZXRhaWxzOiBBZGFwdGVySW5zZXJ0RGV0YWlscyxcbiAgICBvcHRpb25zOiBBZGFwdGVySW5zZXJ0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW5zZXJ0UmVzdWx0Pj47XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBnaXZlbiByb3cgaW4gdGhlIGRhdGFiYXNlIHdpdGggZ2l2ZW4gY2hhbmdlcy5cbiAgICovXG4gIHVwZGF0ZShcbiAgICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgICBvcHRpb25zOiBBZGFwdGVyVXBkYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyVXBkYXRlUmVzdWx0Pj47XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZ2l2ZW4gcm93cyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIGRlbGV0ZShcbiAgICBkZXRhaWxzOiBBZGFwdGVyRGVsZXRlRGV0YWlscyxcbiAgICBvcHRpb25zOiBBZGFwdGVyRGVsZXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyRGVsZXRlUmVzdWx0Pj47XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckJhc2VPcHRpb25zIHt9XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckludHJvc3BlY3RPcHRpb25zIGV4dGVuZHMgQWRhcHRlckJhc2VPcHRpb25zIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlclF1ZXJ5T3B0aW9ucyBleHRlbmRzIEFkYXB0ZXJCYXNlT3B0aW9ucyB7XG4gIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVySW5zZXJ0T3B0aW9ucyBleHRlbmRzIEFkYXB0ZXJCYXNlT3B0aW9ucyB7fVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJVcGRhdGVPcHRpb25zIGV4dGVuZHMgQWRhcHRlckJhc2VPcHRpb25zIHt9XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktb2JqZWN0LXR5cGVcbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckRlbGV0ZU9wdGlvbnMgZXh0ZW5kcyBBZGFwdGVyQmFzZU9wdGlvbnMge31cblxudHlwZSBTY2hlbWFOYW1lID0gc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0IHtcbiAgc2NoZW1hczogUmVjb3JkPFNjaGVtYU5hbWUsIFNjaGVtYT47XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIGZpbHRlck9wZXJhdG9yczogRmlsdGVyT3BlcmF0b3JbXTtcbiAgcXVlcnk6IFF1ZXJ5O1xufVxuXG50eXBlIFRhYmxlTmFtZSA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWEge1xuICBuYW1lOiBzdHJpbmc7XG4gIHRhYmxlczogUmVjb3JkPFRhYmxlTmFtZSwgVGFibGU+O1xufVxuXG50eXBlIENvbHVtbk5hbWUgPSBzdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGUge1xuICBjb2x1bW5zOiBSZWNvcmQ8Q29sdW1uTmFtZSwgQ29sdW1uPjtcbiAgbmFtZTogVGFibGVOYW1lO1xuICBzY2hlbWE6IFNjaGVtYU5hbWU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uIHtcbiAgZGF0YXR5cGU6IERhdGFUeXBlO1xuICBpc0NvbXB1dGVkOiBib29sZWFuO1xuICBpc0luUHJpbWFyeUtleTogYm9vbGVhbjtcbiAgbmFtZTogQ29sdW1uTmFtZTtcbiAgbnVsbGFibGU6IGJvb2xlYW47XG4gIHNjaGVtYTogU2NoZW1hTmFtZTtcbiAgdGFibGU6IFRhYmxlTmFtZTtcbiAgZmtTY2hlbWE6IFNjaGVtYU5hbWUgfCBudWxsO1xuICBma0NvbHVtbjogQ29sdW1uTmFtZSB8IG51bGw7XG4gIGZrVGFibGU6IFRhYmxlTmFtZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVR5cGUge1xuICAvKipcbiAgICogVGhlIGRhdGFiYXNlLXNwZWNpZmljIGFmZmluaXR5L3R5cGUuXG4gICAqXG4gICAqIGUuZy4gaW4gU1FMaXRlLCBkYXRhdHlwZXMgY2FuIGJlIGFueXRoaW5nLiBUaGV5IGFyZSByZWR1Y2VkIHRvIGFmZmluaXR5IHZpYSBzdHJpbmcgbWF0Y2hpbmcgcnVsZXMuXG4gICAqXG4gICAqIHtAbGluayBodHRwczovL3NxbGl0ZS5vcmcvZGF0YXR5cGUzLmh0bWwjZGV0ZXJtaW5hdGlvbl9vZl9jb2x1bW5fYWZmaW5pdHl9XG4gICAqL1xuICBhZmZpbml0eT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaW1wbGlmaWNhdGlvbi9ub3JtYWxpemF0aW9uIGZvciBVSSB1c2FnZS5cbiAgICpcbiAgICogZS5nLiB2YXJjaGFyIGFuZCBjaGFyIGFyZSBzdHJpbmdzLlxuICAgKi9cbiAgZ3JvdXA6IERhdGFUeXBlR3JvdXA7XG5cbiAgLyoqXG4gICAqIElzIHRoaXMgYSBuYXRpdmUgYXJyYXkgdHlwZT9cbiAgICovXG4gIGlzQXJyYXk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElzIGEgbmF0aXZlIGRhdGFiYXNlIGRhdGF0eXBlIG9yIGEgdXNlci1kZWZpbmVkIGRhdGF0eXBlP1xuICAgKlxuICAgKiBlLmcuIFBvc3RncmVTUUwgZW51bXMgYXJlIHVzZXItZGVmaW5lZCBkYXRhdHlwZXMsIGJ1dCBgaW50NGAgaXMgYSBuYXRpdmUgZGF0YXR5cGUuXG4gICAqL1xuICBpc05hdGl2ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2lsbCBiZSBkaXNwbGF5ZWQgYXMtaXMuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVudW0gdmFsdWVzIGZvciBlbnVtIHR5cGVzLlxuICAgKi9cbiAgb3B0aW9uczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBzY2hlbWEgdGhlIGRhdGF0eXBlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBzY2hlbWE6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVR5cGVHcm91cCA9IFwic3RyaW5nXCIgfCBcImRhdGV0aW1lXCIgfCBcImJvb2xlYW5cIiB8IFwiZW51bVwiIHwgXCJ0aW1lXCIgfCBcInJhd1wiIHwgXCJudW1lcmljXCIgfCBcImpzb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyUXVlcnlEZXRhaWxzIHtcbiAgLyoqXG4gICAqIFplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHBhZ2UgdG8gZmV0Y2guXG4gICAqL1xuICBwYWdlSW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICovXG4gIHBhZ2VTaXplOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgZm9yIHRoZSBxdWVyeS5cbiAgICovXG4gIHNvcnRPcmRlcjogU29ydE9yZGVySXRlbVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgdG8gc2VsZWN0IGZyb20uXG4gICAqL1xuICB0YWJsZTogVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWx0ZXIgdG8gYmUgYXBwbGllZC5cbiAgICovXG4gIGZpbHRlcj86IEZpbHRlckdyb3VwO1xufVxuXG5leHBvcnQgdHlwZSBGaWx0ZXJPcGVyYXRvciA9XG4gIHwgXCI9XCJcbiAgfCBcIiE9XCJcbiAgfCBcIj5cIlxuICB8IFwiPj1cIlxuICB8IFwiPFwiXG4gIHwgXCI8PVwiXG4gIHwgXCJpc1wiXG4gIHwgXCJpcyBub3RcIlxuICB8IFwibGlrZVwiXG4gIHwgXCJub3QgbGlrZVwiXG4gIHwgXCJpbGlrZVwiXG4gIHwgXCJub3QgaWxpa2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2x1bW5GaWx0ZXIge1xuICBraW5kOiBcIkNvbHVtbkZpbHRlclwiO1xuICBjb2x1bW46IHN0cmluZztcbiAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9yO1xuICB2YWx1ZTogdW5rbm93bjtcbiAgYWZ0ZXI6IFwiYW5kXCIgfCBcIm9yXCI7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyR3JvdXAge1xuICBraW5kOiBcIkZpbHRlckdyb3VwXCI7XG4gIGZpbHRlcnM6IChDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cClbXTtcbiAgYWZ0ZXI6IFwiYW5kXCIgfCBcIm9yXCI7XG4gIGlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ydE9yZGVySXRlbSB7XG4gIC8qKlxuICAgKiBUaGUgY29sdW1uIHRvIHNvcnQgYnkuXG4gICAqL1xuICBjb2x1bW46IENvbHVtbk5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3Rpb24gdG8gc29ydCB0aGUgY29sdW1uIGJ5LlxuICAgKi9cbiAgZGlyZWN0aW9uOiBTb3J0RGlyZWN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBTb3J0RGlyZWN0aW9uID0gXCJhc2NcIiB8IFwiZGVzY1wiO1xuXG5leHBvcnQgY2xhc3MgQWRhcHRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBxdWVyeT86IFF1ZXJ5PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJRdWVyeVJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgdGhlIHF1ZXJ5IHdvdWxkIHJldHVybiBpZiBub3QgbGltaXRlZC5cbiAgICpcbiAgICogSWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY291bnRpbmcgcm93cywgdGhpcyBzaG91bGQgYmUgc2V0IHRvIGBJbmZpbml0eWAuXG4gICAqL1xuICBmaWx0ZXJlZFJvd0NvdW50OiBudW1iZXIgfCBiaWdpbnQgfCBOdW1lcmljU3RyaW5nIHwgQmlnSW50U3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcm93cyByZXR1cm5lZCBieSB0aGUgcXVlcnkuXG4gICAqL1xuICByb3dzOiBSZWNvcmQ8Q29sdW1uTmFtZSwgdW5rbm93bj5bXTtcblxuICAvKipcbiAgICogVGhlIGV4ZWN1dGVkIHF1ZXJ5IHN0cmluZy5cbiAgICovXG4gIHF1ZXJ5OiBRdWVyeTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVySW5zZXJ0RGV0YWlscyB7XG4gIC8qKlxuICAgKiBUaGUgdGFibGUgdG8gaW5zZXJ0IGludG8uXG4gICAqL1xuICB0YWJsZTogVGFibGU7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZXMgdG8gaW5zZXJ0IGludG8gdGhlIHRhYmxlLlxuICAgKiAtIFRoZSBrZXlzIHNob3VsZCBtYXRjaCB0aGUgY29sdW1uIG5hbWVzIGluIHRoZSB0YWJsZS5cbiAgICogLSBUaGUgdmFsdWVzIHNob3VsZCBiZSB0aGUgdmFsdWVzIHRvIGluc2VydCBpbnRvIHRoZSB0YWJsZS5cbiAgICovXG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckluc2VydFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZnJlc2hseSBpbnNlcnRlZCByb3cgZGF0YS5cbiAgICovXG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRlZCBxdWVyeSBzdHJpbmcuXG4gICAqL1xuICBxdWVyeTogUXVlcnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlclVwZGF0ZURldGFpbHMge1xuICAvKipcbiAgICogQ2hhbmdlcyB0byBhcHBseSB0byB0aGUgcm93LlxuICAgKi9cbiAgY2hhbmdlczogUmVjb3JkPENvbHVtbk5hbWUsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBUaGUgcm93IHRvIHVwZGF0ZS5cbiAgICovXG4gIHJvdzogUmVjb3JkPENvbHVtbk5hbWUsIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgdG8gdXBkYXRlIGluLlxuICAgKi9cbiAgdGFibGU6IFRhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJVcGRhdGVSZXN1bHQge1xuICAvKipcbiAgICogVGhlIHVwZGF0ZWQgcm93IGRhdGEuXG4gICAqL1xuICByb3c6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPiAmIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBjaGFuZ2VzIHdlcmUgYXBwbGllZCBpbiBkYXRhYmFzZSB0aW1lLlxuICAgICAqL1xuICAgIF9fcHNfdXBkYXRlZF9hdF9fOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0ZWQgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnk6IFF1ZXJ5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkYXB0ZXJEZWxldGVEZXRhaWxzIHtcbiAgLyoqXG4gICAqIFRoZSByb3dzIHRvIGRlbGV0ZS5cbiAgICovXG4gIHJvd3M6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPltdO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgdG8gZGVsZXRlIGZyb20uXG4gICAqL1xuICB0YWJsZTogVGFibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckRlbGV0ZVJlc3VsdCB7XG4gIHJvd3M6IFJlY29yZDxDb2x1bW5OYW1lLCB1bmtub3duPltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0ZWQgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcXVlcnk6IFF1ZXJ5PHVua25vd24+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWRhcHRlckVycm9yKGFyZ3M6IHsgZXJyb3I6IEVycm9yOyBxdWVyeT86IFF1ZXJ5PHVua25vd24+IH0pIHtcbiAgY29uc3QgeyBlcnJvciwgcXVlcnkgfSA9IGFyZ3M7XG5cbiAgY29uc3QgYWRhcHRlckVycm9yID0gZXJyb3IgYXMgQWRhcHRlckVycm9yO1xuXG4gIGFkYXB0ZXJFcnJvci5xdWVyeSA9IHF1ZXJ5O1xuXG4gIHJldHVybiBbYWRhcHRlckVycm9yXSBhcyBbQWRhcHRlckVycm9yXTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IERhdGFUeXBlIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcblxuZXhwb3J0IHR5cGUgU1FMaXRlQWZmaW5pdHkgPSBcIkJMT0JcIiB8IFwiSU5URUdFUlwiIHwgXCJOVUxMXCIgfCBcIk5VTUVSSUNcIiB8IFwiUkVBTFwiIHwgXCJURVhUXCI7XG5cbmV4cG9ydCBjb25zdCBTUUxJVEVfQUZGSU5JVFlfVE9fTUVUQURBVEE6IFJlY29yZDxTUUxpdGVBZmZpbml0eSwgUGljazxEYXRhVHlwZSwgXCJncm91cFwiPj4gPSB7XG4gIEJMT0I6IHtcbiAgICBncm91cDogXCJyYXdcIixcbiAgfSxcbiAgSU5URUdFUjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgTlVMTDoge1xuICAgIGdyb3VwOiBcInJhd1wiLFxuICB9LFxuICBOVU1FUklDOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBSRUFMOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBURVhUOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG59O1xuXG4vKipcbiAqIGh0dHBzOi8vc3FsaXRlLm9yZy9kYXRhdHlwZTMuaHRtbCNkZXRlcm1pbmF0aW9uX29mX2NvbHVtbl9hZmZpbml0eVxuICpcbiAqIERPIE5PVCBDSEFOR0UgVEhFIE9SREVSIE9GIFRIRSBDSEVDS1MgSU4gVEhJUyBGVU5DVElPTiFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluZUNvbHVtbkFmZmluaXR5KGRlY2xhcmVkRGF0YVR5cGU6IHN0cmluZyB8IG51bGwpOiBTUUxpdGVBZmZpbml0eSB7XG4gIGlmICghZGVjbGFyZWREYXRhVHlwZSkge1xuICAgIHJldHVybiBcIkJMT0JcIjtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyVHlwZSA9IGRlY2xhcmVkRGF0YVR5cGUudG9VcHBlckNhc2UoKTtcblxuICBpZiAodXBwZXJUeXBlLmluY2x1ZGVzKFwiSU5UXCIpKSB7XG4gICAgcmV0dXJuIFwiSU5URUdFUlwiO1xuICB9XG5cbiAgaWYgKHVwcGVyVHlwZS5pbmNsdWRlcyhcIlRFWFRcIikgfHwgdXBwZXJUeXBlLmluY2x1ZGVzKFwiQ0hBUlwiKSB8fCB1cHBlclR5cGUuaW5jbHVkZXMoXCJDTE9CXCIpKSB7XG4gICAgcmV0dXJuIFwiVEVYVFwiO1xuICB9XG5cbiAgaWYgKHVwcGVyVHlwZS5pbmNsdWRlcyhcIkJMT0JcIikpIHtcbiAgICByZXR1cm4gXCJCTE9CXCI7XG4gIH1cblxuICBpZiAodXBwZXJUeXBlLmluY2x1ZGVzKFwiUkVBTFwiKSB8fCB1cHBlclR5cGUuaW5jbHVkZXMoXCJGTE9BXCIpIHx8IHVwcGVyVHlwZS5pbmNsdWRlcyhcIkRPVUJcIikpIHtcbiAgICByZXR1cm4gXCJSRUFMXCI7XG4gIH1cblxuICByZXR1cm4gXCJOVU1FUklDXCI7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29iamVjdC11dGlscy5kLnRzXCIgLz5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikgfHwgaXNTdHJpbmcob2JqKSB8fCBpc0J1ZmZlcihvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmoubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChvYmopIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IG9iaiA9PT0gdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ251bWJlcic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdWxsKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlKG9iaikge1xuICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnSW50KG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnYmlnaW50Jztcbn1cbi8vIERvbid0IGNoYW5nZSB0aGUgcmV0dXJuZCB0eXBlIHRvIGBvYmogaXMgQnVmZmVyYCB0byBub3QgY3JlYXRlIGFcbi8vIGhhcmQgZGVwZW5kZW5jeSB0byBub2RlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIHJldHVybiB0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBCdWZmZXIuaXNCdWZmZXIob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcnJheUJ1ZmZlck9yVmlldyhvYmopIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgQXJyYXlCdWZmZXIuaXNWaWV3KG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgICBpZiAoIWlzT2JqZWN0KG9iaikgfHwgZ2V0VGFnKG9iaikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgcHJvdG8gPSBvYmo7XG4gICAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikgPT09IHByb3RvO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldExhc3QoYXJyKSB7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG59XG5leHBvcnQgZnVuY3Rpb24gZnJlZXplKG9iaikge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheShhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbYXJnXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gYXNSZWFkb25seUFycmF5KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShbYXJnXSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheShhcmcpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vb3Aob2JqKSB7XG4gICAgcmV0dXJuIG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlKG9iajEsIG9iajIpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KG9iajEpICYmIGlzUmVhZG9ubHlBcnJheShvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZUFycmF5cyhvYmoxLCBvYmoyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNPYmplY3Qob2JqMSkgJiYgaXNPYmplY3Qob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVPYmplY3RzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqMSA9PT0gb2JqMjtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyMSwgYXJyMikge1xuICAgIGlmIChhcnIxLmxlbmd0aCAhPT0gYXJyMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycjEubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKCFjb21wYXJlKGFycjFbaV0sIGFycjJbaV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBjb21wYXJlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgaWYgKGlzQnVmZmVyKG9iajEpICYmIGlzQnVmZmVyKG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlQnVmZmVycyhvYmoxLCBvYmoyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEYXRlKG9iajEpICYmIGlzRGF0ZShvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZURhdGVzKG9iajEsIG9iajIpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGFyZUdlbmVyaWNPYmplY3RzKG9iajEsIG9iajIpO1xufVxuZnVuY3Rpb24gY29tcGFyZUJ1ZmZlcnMoYnVmMSwgYnVmMikge1xuICAgIHJldHVybiBCdWZmZXIuY29tcGFyZShidWYxLCBidWYyKSA9PT0gMDtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVEYXRlcyhkYXRlMSwgZGF0ZTIpIHtcbiAgICByZXR1cm4gZGF0ZTEuZ2V0VGltZSgpID09PSBkYXRlMi5nZXRUaW1lKCk7XG59XG5mdW5jdGlvbiBjb21wYXJlR2VuZXJpY09iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGNvbnN0IGtleXMxID0gT2JqZWN0LmtleXMob2JqMSk7XG4gICAgY29uc3Qga2V5czIgPSBPYmplY3Qua2V5cyhvYmoyKTtcbiAgICBpZiAoa2V5czEubGVuZ3RoICE9PSBrZXlzMi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzMSkge1xuICAgICAgICBpZiAoIWNvbXBhcmUob2JqMVtrZXldLCBvYmoyW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5mdW5jdGlvbiBnZXRUYWcodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/ICdbb2JqZWN0IFVuZGVmaW5lZF0nIDogJ1tvYmplY3QgTnVsbF0nO1xuICAgIH1cbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWx0ZXJUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsdGVyVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlclRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUYWJsZVByb3BzKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24obm9kZSwgY29sdW1uQWx0ZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBjb2x1bW5BbHRlcmF0aW9uczogbm9kZS5jb2x1bW5BbHRlcmF0aW9uc1xuICAgICAgICAgICAgICAgID8gWy4uLm5vZGUuY29sdW1uQWx0ZXJhdGlvbnMsIGNvbHVtbkFsdGVyYXRpb25dXG4gICAgICAgICAgICAgICAgOiBbY29sdW1uQWx0ZXJhdGlvbl0sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaWRlbnRpZmllci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IElkZW50aWZpZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdJZGVudGlmaWVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS1pbmRleC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlSW5kZXhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDcmVhdGVJbmRleE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1ucyhub2RlLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFsuLi4obm9kZS5jb2x1bW5zIHx8IFtdKSwgLi4uY29sdW1uc10sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXNjaGVtYS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlU2NoZW1hTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlU2NoZW1hTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlU2NoZW1hTm9kZScsXG4gICAgICAgICAgICBzY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVTY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVNjaGVtYSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdGFibGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBPTl9DT01NSVRfQUNUSU9OUyA9IFsncHJlc2VydmUgcm93cycsICdkZWxldGUgcm93cycsICdkcm9wJ107XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDcmVhdGVUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1uKGNyZWF0ZVRhYmxlLCBjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuY29sdW1ucywgY29sdW1uXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29uc3RyYWludChjcmVhdGVUYWJsZSwgY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IGNyZWF0ZVRhYmxlLmNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmNvbnN0cmFpbnRzLCBjb25zdHJhaW50XSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbY29uc3RyYWludF0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIoY3JlYXRlVGFibGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogY3JlYXRlVGFibGUuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uY3JlYXRlVGFibGUuZnJvbnRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbbW9kaWZpZXJdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbmRNb2RpZmllcihjcmVhdGVUYWJsZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogY3JlYXRlVGFibGUuZW5kTW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmVuZE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVUYWJsZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTY2hlbWFibGVJZGVudGlmaWVyTm9kZScsXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWRlbnRpZmllciksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShpZGVudGlmaWVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcEluZGV4Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcEluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wSW5kZXgsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcEluZGV4LFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1zY2hlbWEtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BTY2hlbWFOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wU2NoZW1hTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFNjaGVtYU5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcFNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcFNjaGVtYSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXRhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcFRhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wSW5kZXgsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BJbmRleCxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbGlhcy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFsaWFzTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWxpYXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShub2RlLCBhbGlhcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbGlhc05vZGUnLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1RhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKHRhYmxlKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgdGFibGUpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzT2JqZWN0IH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopIHtcbiAgICByZXR1cm4gaXNPYmplY3Qob2JqKSAmJiBpc0Z1bmN0aW9uKG9iai50b09wZXJhdGlvbk5vZGUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uKG9iaikge1xuICAgIHJldHVybiBpc09iamVjdChvYmopICYmICdleHByZXNzaW9uVHlwZScgaW4gb2JqICYmIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQWxpYXNlZEV4cHJlc3Npb24ob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgICdleHByZXNzaW9uJyBpbiBvYmogJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLmFsaWFzKSAmJlxuICAgICAgICBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1tb2RpZmllci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdE1vZGlmaWVyTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0TW9kaWZpZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShtb2RpZmllciwgb2YpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0TW9kaWZpZXJOb2RlJyxcbiAgICAgICAgICAgIG1vZGlmaWVyLFxuICAgICAgICAgICAgb2YsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aEV4cHJlc3Npb24obW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0TW9kaWZpZXJOb2RlJyxcbiAgICAgICAgICAgIHJhd01vZGlmaWVyOiBtb2RpZmllcixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbmQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbmROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbmROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbmROb2RlJyxcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsZWZ0LCByaWdodCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPck5vZGUnLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuL29yLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT25Ob2RlJyxcbiAgICAgICAgICAgIG9uOiBmaWx0ZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3BlcmF0aW9uKG9uTm9kZSwgb3BlcmF0b3IsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm9uTm9kZSxcbiAgICAgICAgICAgIG9uOiBvcGVyYXRvciA9PT0gJ0FuZCdcbiAgICAgICAgICAgICAgICA/IEFuZE5vZGUuY3JlYXRlKG9uTm9kZS5vbiwgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT3JOb2RlLmNyZWF0ZShvbk5vZGUub24sIG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vam9pbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgT25Ob2RlIH0gZnJvbSAnLi9vbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBKb2luTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSm9pbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGpvaW5UeXBlLCB0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKb2luTm9kZScsXG4gICAgICAgICAgICBqb2luVHlwZSxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgb246IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoT24oam9pblR5cGUsIHRhYmxlLCBvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKb2luTm9kZScsXG4gICAgICAgICAgICBqb2luVHlwZSxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgb246IE9uTm9kZS5jcmVhdGUob24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9uKGpvaW5Ob2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5qb2luTm9kZSxcbiAgICAgICAgICAgIG9uOiBqb2luTm9kZS5vblxuICAgICAgICAgICAgICAgID8gT25Ob2RlLmNsb25lV2l0aE9wZXJhdGlvbihqb2luTm9kZS5vbiwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9uTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9iaW5hcnktb3BlcmF0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQmluYXJ5T3BlcmF0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQmluYXJ5T3BlcmF0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobGVmdE9wZXJhbmQsIG9wZXJhdG9yLCByaWdodE9wZXJhbmQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQmluYXJ5T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBsZWZ0T3BlcmFuZCxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgcmlnaHRPcGVyYW5kLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdG9yLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IENPTVBBUklTT05fT1BFUkFUT1JTID0gW1xuICAgICc9JyxcbiAgICAnPT0nLFxuICAgICchPScsXG4gICAgJzw+JyxcbiAgICAnPicsXG4gICAgJz49JyxcbiAgICAnPCcsXG4gICAgJzw9JyxcbiAgICAnaW4nLFxuICAgICdub3QgaW4nLFxuICAgICdpcycsXG4gICAgJ2lzIG5vdCcsXG4gICAgJ2xpa2UnLFxuICAgICdub3QgbGlrZScsXG4gICAgJ21hdGNoJyxcbiAgICAnaWxpa2UnLFxuICAgICdub3QgaWxpa2UnLFxuICAgICdAPicsXG4gICAgJzxAJyxcbiAgICAnXkAnLFxuICAgICcmJicsXG4gICAgJz8nLFxuICAgICc/JicsXG4gICAgJz98JyxcbiAgICAnITwnLFxuICAgICchPicsXG4gICAgJzw9PicsXG4gICAgJyF+JyxcbiAgICAnficsXG4gICAgJ34qJyxcbiAgICAnIX4qJyxcbiAgICAnQEAnLFxuICAgICdAQEAnLFxuICAgICchIScsXG4gICAgJzwtPicsXG4gICAgJ3JlZ2V4cCcsXG4gICAgJ2lzIGRpc3RpbmN0IGZyb20nLFxuICAgICdpcyBub3QgZGlzdGluY3QgZnJvbScsXG5dO1xuZXhwb3J0IGNvbnN0IEFSSVRITUVUSUNfT1BFUkFUT1JTID0gW1xuICAgICcrJyxcbiAgICAnLScsXG4gICAgJyonLFxuICAgICcvJyxcbiAgICAnJScsXG4gICAgJ14nLFxuICAgICcmJyxcbiAgICAnfCcsXG4gICAgJyMnLFxuICAgICc8PCcsXG4gICAgJz4+Jyxcbl07XG5leHBvcnQgY29uc3QgSlNPTl9PUEVSQVRPUlMgPSBbJy0+JywgJy0+PiddO1xuZXhwb3J0IGNvbnN0IEJJTkFSWV9PUEVSQVRPUlMgPSBbXG4gICAgLi4uQ09NUEFSSVNPTl9PUEVSQVRPUlMsXG4gICAgLi4uQVJJVEhNRVRJQ19PUEVSQVRPUlMsXG4gICAgJyYmJyxcbiAgICAnfHwnLFxuXTtcbmV4cG9ydCBjb25zdCBVTkFSWV9GSUxURVJfT1BFUkFUT1JTID0gWydleGlzdHMnLCAnbm90IGV4aXN0cyddO1xuZXhwb3J0IGNvbnN0IFVOQVJZX09QRVJBVE9SUyA9IFsnbm90JywgJy0nLCAuLi5VTkFSWV9GSUxURVJfT1BFUkFUT1JTXTtcbmV4cG9ydCBjb25zdCBPUEVSQVRPUlMgPSBbXG4gICAgLi4uQklOQVJZX09QRVJBVE9SUyxcbiAgICAuLi5KU09OX09QRVJBVE9SUyxcbiAgICAuLi5VTkFSWV9PUEVSQVRPUlMsXG4gICAgJ2JldHdlZW4nLFxuICAgICdiZXR3ZWVuIHN5bW1ldHJpYycsXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9wZXJhdG9yTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3BlcmF0b3JOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcGVyYXRvck5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc09wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBPUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmluYXJ5T3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIEJJTkFSWV9PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGFyaXNvbk9wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBDT01QQVJJU09OX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBcml0aG1ldGljT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIEFSSVRITUVUSUNfT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0pTT05PcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgSlNPTl9PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbHVtbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LWFsbC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdEFsbE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NlbGVjdEFsbE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RBbGxOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZlcmVuY2Utbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IFNlbGVjdEFsbE5vZGUgfSBmcm9tICcuL3NlbGVjdC1hbGwtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVmZXJlbmNlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmVmZXJlbmNlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCB0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVNlbGVjdEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgY29sdW1uOiBTZWxlY3RBbGxOb2RlLmNyZWF0ZSgpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB7XG4gICAgI2R5bmFtaWNSZWZlcmVuY2U7XG4gICAgZ2V0IGR5bmFtaWNSZWZlcmVuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkeW5hbWljUmVmZXJlbmNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqXG4gICAgICogVGhpcyBuZWVkcyB0byBiZSBoZXJlIGp1c3Qgc28gdGhhdCB0aGUgdHlwaW5ncyB3b3JrLiBXaXRob3V0IHRoaXNcbiAgICAgKiB0aGUgZ2VuZXJhdGVkIC5kLnRzIGZpbGUgY29udGFpbnMgbm8gcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHBhcmFtIFJcbiAgICAgKiB3aGljaCBjYXVzZXMgdGhpcyB0eXBlIHRvIGJlIGVxdWFsIHRvIER5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIHdpdGhcbiAgICAgKiBhbnkgUi5cbiAgICAgKi9cbiAgICBnZXQgcmVmVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IocmVmZXJlbmNlKSB7XG4gICAgICAgIHRoaXMuI2R5bmFtaWNSZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbih0aGlzLiNkeW5hbWljUmVmZXJlbmNlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLmR5bmFtaWNSZWZlcmVuY2UpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktaXRlbS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yZGVyQnlJdGVtTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JkZXJCeUl0ZW1Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcmRlckJ5LCBkaXJlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3JkZXJCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIG9yZGVyQnksXG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3Jhdy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJhd05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1Jhd05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNxbEZyYWdtZW50cywgcGFyYW1ldGVycykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSYXdOb2RlJyxcbiAgICAgICAgICAgIHNxbEZyYWdtZW50czogZnJlZXplKHNxbEZyYWdtZW50cyksXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiBmcmVlemUocGFyYW1ldGVycyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aFNxbChzcWwpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFtzcWxdLCBbXSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoQ2hpbGQoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFsnJywgJyddLCBbY2hpbGRdKTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhDaGlsZHJlbihjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gUmF3Tm9kZS5jcmVhdGUobmV3IEFycmF5KGNoaWxkcmVuLmxlbmd0aCArIDEpLmZpbGwoJycpLCBjaGlsZHJlbik7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2xsYXRlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2xsYXRlTm9kZSA9IHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2xsYXRlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbGxhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbGxhdGlvbjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcmRlci1ieS1pdGVtLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb2xsYXRlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbGxhdGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBPcmRlckJ5SXRlbUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGRlc2NgIHRvIHRoZSBgb3JkZXIgYnlgIGl0ZW0uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGFzY30gZm9yIHRoZSBvcHBvc2l0ZS5cbiAgICAgKi9cbiAgICBkZXNjKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBPcmRlckJ5SXRlbU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFJhd05vZGUuY3JlYXRlV2l0aFNxbCgnZGVzYycpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBhc2NgIHRvIHRoZSBgb3JkZXIgYnlgIGl0ZW0uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGRlc2N9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgYXNjKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBPcmRlckJ5SXRlbU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFJhd05vZGUuY3JlYXRlV2l0aFNxbCgnYXNjJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG51bGxzIGxhc3RgIHRvIHRoZSBgb3JkZXIgYnlgIGl0ZW0uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGFuZCBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIG51bGxzRmlyc3R9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgbnVsbHNMYXN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBPcmRlckJ5SXRlbU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgbnVsbHM6ICdsYXN0JyB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG51bGxzIGZpcnN0YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBhbmQgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBudWxsc0xhc3R9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgbnVsbHNGaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IG51bGxzOiAnZmlyc3QnIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgY29sbGF0ZSA8Y29sbGF0aW9uTmFtZT5gIHRvIHRoZSBgb3JkZXIgYnlgIGl0ZW0uXG4gICAgICovXG4gICAgY29sbGF0ZShjb2xsYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29sbGF0aW9uOiBDb2xsYXRlTm9kZS5jcmVhdGUoY29sbGF0aW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMubm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2xvZy1vbmNlLmQudHNcIiAvPlxuY29uc3QgTE9HR0VEX01FU1NBR0VTID0gbmV3IFNldCgpO1xuLyoqXG4gKiBVc2UgZm9yIHN5c3RlbS1sZXZlbCBsb2dnaW5nLCBzdWNoIGFzIGRlcHJlY2F0aW9uIG1lc3NhZ2VzLlxuICogTG9ncyBhIG1lc3NhZ2UgYW5kIGVuc3VyZXMgaXQgd29uJ3QgYmUgbG9nZ2VkIGFnYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nT25jZShtZXNzYWdlKSB7XG4gICAgaWYgKExPR0dFRF9NRVNTQUdFUy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBMT0dHRURfTUVTU0FHRVMuYWRkKG1lc3NhZ2UpO1xuICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcmRlci1ieS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyLCB9IGZyb20gJy4uL2R5bmFtaWMvZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0V4cHJlc3Npb24gfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5SXRlbUJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL29yZGVyLWJ5LWl0ZW0tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBsb2dPbmNlIH0gZnJvbSAnLi4vdXRpbC9sb2ctb25jZS5qcyc7XG5pbXBvcnQgeyBpc0V4cHJlc3Npb25PckZhY3RvcnksIHBhcnNlRXhwcmVzc2lvbiwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNPcmRlckJ5RGlyZWN0aW9uKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nID09PSAnYXNjJyB8fCB0aGluZyA9PT0gJ2Rlc2MnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT3JkZXJCeShhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VPcmRlckJ5SXRlbShhcmdzWzBdLCBhcmdzWzFdKV07XG4gICAgfVxuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCBbb3JkZXJCeV0gPSBhcmdzO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcmRlckJ5KSkge1xuICAgICAgICAgICAgbG9nT25jZSgnb3JkZXJCeShhcnJheSkgaXMgZGVwcmVjYXRlZCwgdXNlIG11bHRpcGxlIG9yZGVyQnkgY2FsbHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIHJldHVybiBvcmRlckJ5Lm1hcCgoaXRlbSkgPT4gcGFyc2VPcmRlckJ5SXRlbShpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtwYXJzZU9yZGVyQnlJdGVtKG9yZGVyQnkpXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgYXQgb3JkZXIgYnkhIGV4cGVjdGVkIDEtMiwgcmVjZWl2ZWQgJHthcmdzLmxlbmd0aH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9yZGVyQnlJdGVtKGV4cHIsIG1vZGlmaWVycykge1xuICAgIGNvbnN0IHBhcnNlZFJlZiA9IHBhcnNlT3JkZXJCeUV4cHJlc3Npb24oZXhwcik7XG4gICAgaWYgKE9yZGVyQnlJdGVtTm9kZS5pcyhwYXJzZWRSZWYpKSB7XG4gICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHNwZWNpZnkgZGlyZWN0aW9uIHR3aWNlIScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZWRSZWY7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzKHBhcnNlZFJlZiwgbW9kaWZpZXJzKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3JkZXJCeUV4cHJlc3Npb24oZXhwcikge1xuICAgIGlmIChpc0V4cHJlc3Npb25PckZhY3RvcnkoZXhwcikpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbihleHByKTtcbiAgICB9XG4gICAgaWYgKGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIoZXhwcikpIHtcbiAgICAgICAgcmV0dXJuIGV4cHIudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGNvbnN0IFtyZWYsIGRpcmVjdGlvbl0gPSBleHByLnNwbGl0KCcgJyk7XG4gICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgICBsb2dPbmNlKFwiYG9yZGVyQnkoJ2NvbHVtbiBhc2MnKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBvcmRlckJ5KCdjb2x1bW4nLCAnYXNjJylgIGluc3RlYWQuXCIpO1xuICAgICAgICByZXR1cm4gcGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyhwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpLCBkaXJlY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTdHJpbmdSZWZlcmVuY2UoZXhwcik7XG59XG5mdW5jdGlvbiBwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzKGV4cHIsIG1vZGlmaWVycykge1xuICAgIGlmICh0eXBlb2YgbW9kaWZpZXJzID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZiAoIWlzT3JkZXJCeURpcmVjdGlvbihtb2RpZmllcnMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb3JkZXIgYnkgZGlyZWN0aW9uOiAke21vZGlmaWVyc31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT3JkZXJCeUl0ZW1Ob2RlLmNyZWF0ZShleHByLCBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwobW9kaWZpZXJzKSk7XG4gICAgfVxuICAgIGlmIChpc0V4cHJlc3Npb24obW9kaWZpZXJzKSkge1xuICAgICAgICBsb2dPbmNlKFwiYG9yZGVyQnkoLi4uLCBleHByKWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBvcmRlckJ5KC4uLiwgJ2FzYycpYCBvciBgb3JkZXJCeSguLi4sIChvYikgPT4gLi4uKWAgaW5zdGVhZC5cIik7XG4gICAgICAgIHJldHVybiBPcmRlckJ5SXRlbU5vZGUuY3JlYXRlKGV4cHIsIG1vZGlmaWVycy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgIGNvbnN0IG5vZGUgPSBPcmRlckJ5SXRlbU5vZGUuY3JlYXRlKGV4cHIpO1xuICAgIGlmICghbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gbW9kaWZpZXJzKG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoeyBub2RlIH0pKS50b09wZXJhdGlvbk5vZGUoKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1yZWZlcmVuY2Utbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OUmVmZXJlbmNlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlJlZmVyZW5jZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHJlZmVyZW5jZSwgdHJhdmVyc2FsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05SZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIHRyYXZlcnNhbCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUcmF2ZXJzYWwobm9kZSwgdHJhdmVyc2FsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHRyYXZlcnNhbCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OT3BlcmF0b3JDaGFpbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05PcGVyYXRvckNoYWluTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhWYWx1ZShub2RlLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZShbLi4ubm9kZS52YWx1ZXMsIHZhbHVlXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlBhdGhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUGF0aE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGluT3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlBhdGhOb2RlJyxcbiAgICAgICAgICAgIGluT3BlcmF0b3IsXG4gICAgICAgICAgICBwYXRoTGVnczogZnJlZXplKFtdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhMZWcoanNvblBhdGhOb2RlLCBwYXRoTGVnKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uanNvblBhdGhOb2RlLFxuICAgICAgICAgICAgcGF0aExlZ3M6IGZyZWV6ZShbLi4uanNvblBhdGhOb2RlLnBhdGhMZWdzLCBwYXRoTGVnXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVmZXJlbmNlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IGlzUmVhZG9ubHlBcnJheSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIGlzRXhwcmVzc2lvbk9yRmFjdG9yeSwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3JkZXJCeURpcmVjdGlvbiwgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4vb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSwgaXNKU09OT3BlcmF0b3IsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzU3RyaW5nKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlKGV4cCk7XG4gICAgfVxuICAgIHJldHVybiBleHAudG9PcGVyYXRpb25Ob2RlKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KGFyZykge1xuICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoYXJnKSkge1xuICAgICAgICByZXR1cm4gYXJnLm1hcCgoaXQpID0+IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihpdCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oYXJnKV07XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHApIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uT3JGYWN0b3J5KGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbihleHApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKGV4cCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKU09OUmVmZXJlbmNlKHJlZiwgb3ApIHtcbiAgICBjb25zdCByZWZlcmVuY2VOb2RlID0gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKTtcbiAgICBpZiAoaXNKU09OT3BlcmF0b3Iob3ApKSB7XG4gICAgICAgIHJldHVybiBKU09OUmVmZXJlbmNlTm9kZS5jcmVhdGUocmVmZXJlbmNlTm9kZSwgSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlLmNyZWF0ZShPcGVyYXRvck5vZGUuY3JlYXRlKG9wKSkpO1xuICAgIH1cbiAgICBjb25zdCBvcFdpdGhvdXRMYXN0Q2hhciA9IG9wLnNsaWNlKDAsIC0xKTtcbiAgICBpZiAoaXNKU09OT3BlcmF0b3Iob3BXaXRob3V0TGFzdENoYXIpKSB7XG4gICAgICAgIHJldHVybiBKU09OUmVmZXJlbmNlTm9kZS5jcmVhdGUocmVmZXJlbmNlTm9kZSwgSlNPTlBhdGhOb2RlLmNyZWF0ZShPcGVyYXRvck5vZGUuY3JlYXRlKG9wV2l0aG91dExhc3RDaGFyKSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSlNPTiBvcGVyYXRvcjogJHtvcH1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpIHtcbiAgICBjb25zdCBDT0xVTU5fU0VQQVJBVE9SID0gJy4nO1xuICAgIGlmICghcmVmLmluY2x1ZGVzKENPTFVNTl9TRVBBUkFUT1IpKSB7XG4gICAgICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShyZWYpKTtcbiAgICB9XG4gICAgY29uc3QgcGFydHMgPSByZWYuc3BsaXQoQ09MVU1OX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlQW5kU2NoZW1hKHBhcnRzKTtcbiAgICB9XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGUocGFydHMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY29sdW1uIHJlZmVyZW5jZSAke3JlZn1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2UocmVmKSB7XG4gICAgY29uc3QgQUxJQVNfU0VQQVJBVE9SID0gJyBhcyAnO1xuICAgIGlmIChyZWYuaW5jbHVkZXMoQUxJQVNfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBbY29sdW1uUmVmLCBhbGlhc10gPSByZWYuc3BsaXQoQUxJQVNfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlU3RyaW5nUmVmZXJlbmNlKGNvbHVtblJlZiksIElkZW50aWZpZXJOb2RlLmNyZWF0ZShhbGlhcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZik7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29sdW1uTmFtZShjb2x1bW4pIHtcbiAgICByZXR1cm4gQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbikge1xuICAgIGNvbnN0IE9SREVSX1NFUEFSQVRPUiA9ICcgJztcbiAgICBpZiAoY29sdW1uLmluY2x1ZGVzKE9SREVSX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtbk5hbWUsIG9yZGVyXSA9IGNvbHVtbi5zcGxpdChPUkRFUl9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgaWYgKCFpc09yZGVyQnlEaXJlY3Rpb24ob3JkZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgb3JkZXIgZGlyZWN0aW9uIFwiJHtvcmRlcn1cIiBuZXh0IHRvIFwiJHtjb2x1bW5OYW1lfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlT3JkZXJCeShbY29sdW1uTmFtZSwgb3JkZXJdKVswXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZUNvbHVtbk5hbWUoY29sdW1uKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZUFuZFNjaGVtYShwYXJ0cykge1xuICAgIGNvbnN0IFtzY2hlbWEsIHRhYmxlLCBjb2x1bW5dID0gcGFydHM7XG4gICAgcmV0dXJuIFJlZmVyZW5jZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksIFRhYmxlTm9kZS5jcmVhdGVXaXRoU2NoZW1hKHNjaGVtYSwgdGFibGUpKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlKHBhcnRzKSB7XG4gICAgY29uc3QgW3RhYmxlLCBjb2x1bW5dID0gcGFydHM7XG4gICAgcmV0dXJuIFJlZmVyZW5jZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksIFRhYmxlTm9kZS5jcmVhdGUodGFibGUpKTtcbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ByaW1pdGl2ZVZhbHVlTGlzdE5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUoWy4uLnZhbHVlc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ZhbHVlLWxpc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBWYWx1ZUxpc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdWYWx1ZUxpc3ROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVMaXN0Tm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVmFsdWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdWYWx1ZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVJbW1lZGlhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ZhbHVlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzTnVsbCwgaXNOdW1iZXIsIGlzUmVhZG9ubHlBcnJheSwgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIGlzRXhwcmVzc2lvbk9yRmFjdG9yeSwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdChhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWVFeHByZXNzaW9uTGlzdChhcmcpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlRXhwcmVzc2lvbihleHApIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uT3JGYWN0b3J5KGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbihleHApO1xuICAgIH1cbiAgICByZXR1cm4gVmFsdWVOb2RlLmNyZWF0ZShleHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSB8fCBpc0Jvb2xlYW4odmFsdWUpIHx8IGlzTnVsbCh2YWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoIWlzU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc2FmZSBpbW1lZGlhdGUgdmFsdWUgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgfVxuICAgIHJldHVybiBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlVmFsdWVFeHByZXNzaW9uTGlzdChhcmcpIHtcbiAgICBpZiAoYXJnLnNvbWUoaXNFeHByZXNzaW9uT3JGYWN0b3J5KSkge1xuICAgICAgICByZXR1cm4gVmFsdWVMaXN0Tm9kZS5jcmVhdGUoYXJnLm1hcCgoaXQpID0+IHBhcnNlVmFsdWVFeHByZXNzaW9uKGl0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZS5jcmVhdGUoYXJnKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFyZW5zLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFyZW5zTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUGFyZW5zTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJlbnNOb2RlJyxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBCaW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IGlzQm9vbGVhbiwgaXNOdWxsLCBpc1N0cmluZywgaXNVbmRlZmluZWQsIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIE9QRVJBVE9SUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIHBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IFBhcmVuc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wYXJlbnMtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vci1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmdzWzBdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzKX1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGxlZnQsIG9wZXJhdG9yLCByaWdodCkge1xuICAgIGlmIChpc0lzT3BlcmF0b3Iob3BlcmF0b3IpICYmIG5lZWRzSXNPcGVyYXRvcihyaWdodCkpIHtcbiAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihsZWZ0KSwgcGFyc2VPcGVyYXRvcihvcGVyYXRvciksIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUocmlnaHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihsZWZ0KSwgcGFyc2VPcGVyYXRvcihvcGVyYXRvciksIHBhcnNlVmFsdWVFeHByZXNzaW9uT3JMaXN0KHJpZ2h0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsZWZ0LCBvcGVyYXRvciwgcmlnaHQpIHtcbiAgICByZXR1cm4gQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGxlZnQpLCBwYXJzZU9wZXJhdG9yKG9wZXJhdG9yKSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKHJpZ2h0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWx0ZXJPYmplY3Qob2JqLCBjb21iaW5hdG9yKSB7XG4gICAgcmV0dXJuIHBhcnNlRmlsdGVyTGlzdChPYmplY3QuZW50cmllcyhvYmopXG4gICAgICAgIC5maWx0ZXIoKFssIHZdKSA9PiAhaXNVbmRlZmluZWQodikpXG4gICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihrLCBuZWVkc0lzT3BlcmF0b3IodikgPyAnaXMnIDogJz0nLCB2KSksIGNvbWJpbmF0b3IpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmlsdGVyTGlzdChsaXN0LCBjb21iaW5hdG9yLCB3aXRoUGFyZW5zID0gdHJ1ZSkge1xuICAgIGNvbnN0IGNvbWJpbmUgPSBjb21iaW5hdG9yID09PSAnYW5kJyA/IEFuZE5vZGUuY3JlYXRlIDogT3JOb2RlLmNyZWF0ZTtcbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUoMSksIE9wZXJhdG9yTm9kZS5jcmVhdGUoJz0nKSwgVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZShjb21iaW5hdG9yID09PSAnYW5kJyA/IDEgOiAwKSk7XG4gICAgfVxuICAgIGxldCBub2RlID0gdG9PcGVyYXRpb25Ob2RlKGxpc3RbMF0pO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBub2RlID0gY29tYmluZShub2RlLCB0b09wZXJhdGlvbk5vZGUobGlzdFtpXSkpO1xuICAgIH1cbiAgICBpZiAobGlzdC5sZW5ndGggPiAxICYmIHdpdGhQYXJlbnMpIHtcbiAgICAgICAgcmV0dXJuIFBhcmVuc05vZGUuY3JlYXRlKG5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZTtcbn1cbmZ1bmN0aW9uIGlzSXNPcGVyYXRvcihvcGVyYXRvcikge1xuICAgIHJldHVybiBvcGVyYXRvciA9PT0gJ2lzJyB8fCBvcGVyYXRvciA9PT0gJ2lzIG5vdCc7XG59XG5mdW5jdGlvbiBuZWVkc0lzT3BlcmF0b3IodmFsdWUpIHtcbiAgICByZXR1cm4gaXNOdWxsKHZhbHVlKSB8fCBpc0Jvb2xlYW4odmFsdWUpO1xufVxuZnVuY3Rpb24gcGFyc2VPcGVyYXRvcihvcGVyYXRvcikge1xuICAgIGlmIChpc1N0cmluZyhvcGVyYXRvcikgJiYgT1BFUkFUT1JTLmluY2x1ZGVzKG9wZXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JOb2RlLmNyZWF0ZShvcGVyYXRvcik7XG4gICAgfVxuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2Uob3BlcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBvcGVyYXRvci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9wZXJhdG9yICR7SlNPTi5zdHJpbmdpZnkob3BlcmF0b3IpfWApO1xufVxuZnVuY3Rpb24gdG9PcGVyYXRpb25Ob2RlKG5vZGVPclNvdXJjZSkge1xuICAgIHJldHVybiBpc09wZXJhdGlvbk5vZGVTb3VyY2Uobm9kZU9yU291cmNlKVxuICAgICAgICA/IG5vZGVPclNvdXJjZS50b09wZXJhdGlvbk5vZGUoKVxuICAgICAgICA6IG5vZGVPclNvdXJjZTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPcmRlckJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JkZXJCeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSXRlbXMob3JkZXJCeSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vcmRlckJ5LFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShbLi4ub3JkZXJCeS5pdGVtcywgLi4uaXRlbXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJ0aXRpb24tYnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0aXRpb25CeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1BhcnRpdGlvbkJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKHBhcnRpdGlvbkJ5LCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnBhcnRpdGlvbkJ5LFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShbLi4ucGFydGl0aW9uQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3Zlci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgT3JkZXJCeU5vZGUgfSBmcm9tICcuL29yZGVyLWJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgUGFydGl0aW9uQnlOb2RlIH0gZnJvbSAnLi9wYXJ0aXRpb24tYnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3Zlck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ092ZXJOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3Zlck5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yZGVyQnlJdGVtcyhvdmVyTm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdmVyTm9kZSxcbiAgICAgICAgICAgIG9yZGVyQnk6IG92ZXJOb2RlLm9yZGVyQnlcbiAgICAgICAgICAgICAgICA/IE9yZGVyQnlOb2RlLmNsb25lV2l0aEl0ZW1zKG92ZXJOb2RlLm9yZGVyQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogT3JkZXJCeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhQYXJ0aXRpb25CeUl0ZW1zKG92ZXJOb2RlLCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm92ZXJOb2RlLFxuICAgICAgICAgICAgcGFydGl0aW9uQnk6IG92ZXJOb2RlLnBhcnRpdGlvbkJ5XG4gICAgICAgICAgICAgICAgPyBQYXJ0aXRpb25CeU5vZGUuY2xvbmVXaXRoSXRlbXMob3Zlck5vZGUucGFydGl0aW9uQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogUGFydGl0aW9uQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZnJvbS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZyb21Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGcm9tTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZnJvbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRnJvbU5vZGUnLFxuICAgICAgICAgICAgZnJvbXM6IGZyZWV6ZShmcm9tcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbXMoZnJvbSwgZnJvbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5mcm9tLFxuICAgICAgICAgICAgZnJvbXM6IGZyZWV6ZShbLi4uZnJvbS5mcm9tcywgLi4uZnJvbXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEdyb3VwQnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdHcm91cEJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSXRlbXMoZ3JvdXBCeSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ncm91cEJ5LFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShbLi4uZ3JvdXBCeS5pdGVtcywgLi4uaXRlbXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9oYXZpbmctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4vb3Itbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSGF2aW5nTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSGF2aW5nTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0hhdmluZ05vZGUnLFxuICAgICAgICAgICAgaGF2aW5nOiBmaWx0ZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3BlcmF0aW9uKGhhdmluZ05vZGUsIG9wZXJhdG9yLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5oYXZpbmdOb2RlLFxuICAgICAgICAgICAgaGF2aW5nOiBvcGVyYXRvciA9PT0gJ0FuZCdcbiAgICAgICAgICAgICAgICA/IEFuZE5vZGUuY3JlYXRlKGhhdmluZ05vZGUuaGF2aW5nLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPck5vZGUuY3JlYXRlKGhhdmluZ05vZGUuaGF2aW5nLCBvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEluc2VydFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSW5zZXJ0UXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbnRvLCB3aXRoTm9kZSwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdJbnNlcnRRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50byxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICAgICAgcmVwbGFjZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRob3V0SW50bygpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoaW5zZXJ0UXVlcnksIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uaW5zZXJ0UXVlcnksXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0xpc3ROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaXN0Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgTGlzdE5vZGUgfSBmcm9tICcuL2xpc3Qtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVXBkYXRlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdVcGRhdGVRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHRoZSByYXcgdGFibGUgbm9kZSB3aGVuIHRoZXJlJ3Mgb25seSBvbmUgdGFibGVcbiAgICAgICAgICAgIC8vIGFuZCBkb24ndCByZW5hbWUgdGhlIHByb3BlcnR5IHRvIHNvbWV0aGluZyBsaWtlIGB0YWJsZXNgLlxuICAgICAgICAgICAgdGFibGU6IHRhYmxlcy5sZW5ndGggPT09IDEgPyB0YWJsZXNbMF0gOiBMaXN0Tm9kZS5jcmVhdGUodGFibGVzKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhvdXRUYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXBkYXRlUXVlcnlOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9tSXRlbXModXBkYXRlUXVlcnksIGZyb21JdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgZnJvbTogdXBkYXRlUXVlcnkuZnJvbVxuICAgICAgICAgICAgICAgID8gRnJvbU5vZGUuY2xvbmVXaXRoRnJvbXModXBkYXRlUXVlcnkuZnJvbSwgZnJvbUl0ZW1zKVxuICAgICAgICAgICAgICAgIDogRnJvbU5vZGUuY3JlYXRlKGZyb21JdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXBkYXRlcyh1cGRhdGVRdWVyeSwgdXBkYXRlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgdXBkYXRlczogdXBkYXRlUXVlcnkudXBkYXRlc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi51cGRhdGVRdWVyeS51cGRhdGVzLCAuLi51cGRhdGVzXSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGltaXQodXBkYXRlUXVlcnksIGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXBkYXRlUXVlcnksXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91c2luZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVzaW5nTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVXNpbmdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVXNpbmdOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlczogZnJlZXplKHRhYmxlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGFibGVzKHVzaW5nLCB0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51c2luZyxcbiAgICAgICAgICAgIHRhYmxlczogZnJlZXplKFsuLi51c2luZy50YWJsZXMsIC4uLnRhYmxlc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlbGV0ZS1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRnJvbU5vZGUgfSBmcm9tICcuL2Zyb20tbm9kZS5qcyc7XG5pbXBvcnQgeyBVc2luZ05vZGUgfSBmcm9tICcuL3VzaW5nLW5vZGUuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi9xdWVyeS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWxldGVRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0RlbGV0ZVF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZnJvbUl0ZW1zLCB3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEZWxldGVRdWVyeU5vZGUnLFxuICAgICAgICAgICAgZnJvbTogRnJvbU5vZGUuY3JlYXRlKGZyb21JdGVtcyksXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aE9yZGVyQnlJdGVtczogKG5vZGUsIGl0ZW1zKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKG5vZGUsIGl0ZW1zKSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aG91dE9yZGVyQnk6IChub2RlKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeShub2RlKSxcbiAgICBjbG9uZVdpdGhMaW1pdChkZWxldGVOb2RlLCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRMaW1pdChkZWxldGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZGVsZXRlTm9kZSxcbiAgICAgICAgICAgIGxpbWl0OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVXNpbmcoZGVsZXRlTm9kZSwgdGFibGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZGVsZXRlTm9kZSxcbiAgICAgICAgICAgIHVzaW5nOiBkZWxldGVOb2RlLnVzaW5nICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IFVzaW5nTm9kZS5jbG9uZVdpdGhUYWJsZXMoZGVsZXRlTm9kZS51c2luZywgdGFibGVzKVxuICAgICAgICAgICAgICAgIDogVXNpbmdOb2RlLmNyZWF0ZSh0YWJsZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3doZXJlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuL29yLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdoZXJlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnV2hlcmVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnV2hlcmVOb2RlJyxcbiAgICAgICAgICAgIHdoZXJlOiBmaWx0ZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3BlcmF0aW9uKHdoZXJlTm9kZSwgb3BlcmF0b3IsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndoZXJlTm9kZSxcbiAgICAgICAgICAgIHdoZXJlOiBvcGVyYXRvciA9PT0gJ0FuZCdcbiAgICAgICAgICAgICAgICA/IEFuZE5vZGUuY3JlYXRlKHdoZXJlTm9kZS53aGVyZSwgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT3JOb2RlLmNyZWF0ZSh3aGVyZU5vZGUud2hlcmUsIG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmV0dXJuaW5nLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmV0dXJuaW5nTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmV0dXJuaW5nTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZXR1cm5pbmdOb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZWxlY3Rpb25zKHJldHVybmluZywgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJldHVybmluZyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHJldHVybmluZy5zZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnJldHVybmluZy5zZWxlY3Rpb25zLCAuLi5zZWxlY3Rpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHBsYWluLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRXhwbGFpbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0V4cGxhaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRXhwbGFpbk5vZGUnLFxuICAgICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aGVuLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV2hlbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1doZW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb25kaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnV2hlbk5vZGUnLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFJlc3VsdCh3aGVuTm9kZSwgcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ud2hlbk5vZGUsXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi93aGVuLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE1lcmdlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdNZXJnZVF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaW50bywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTWVyZ2VRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50byxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVzaW5nKG1lcmdlTm9kZSwgdXNpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5tZXJnZU5vZGUsXG4gICAgICAgICAgICB1c2luZyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhXaGVuKG1lcmdlTm9kZSwgd2hlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm1lcmdlTm9kZSxcbiAgICAgICAgICAgIHdoZW5zOiBtZXJnZU5vZGUud2hlbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubWVyZ2VOb2RlLndoZW5zLCB3aGVuXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbd2hlbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRoZW4obWVyZ2VOb2RlLCB0aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLFxuICAgICAgICAgICAgd2hlbnM6IG1lcmdlTm9kZS53aGVuc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFtcbiAgICAgICAgICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLndoZW5zLnNsaWNlKDAsIC0xKSxcbiAgICAgICAgICAgICAgICAgICAgV2hlbk5vZGUuY2xvbmVXaXRoUmVzdWx0KG1lcmdlTm9kZS53aGVuc1ttZXJnZU5vZGUud2hlbnMubGVuZ3RoIC0gMV0sIHRoZW4pLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3V0cHV0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3V0cHV0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3V0cHV0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdXRwdXROb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZWxlY3Rpb25zKG91dHB1dCwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm91dHB1dCxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IG91dHB1dC5zZWxlY3Rpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm91dHB1dC5zZWxlY3Rpb25zLCAuLi5zZWxlY3Rpb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi9pbnNlcnQtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlOb2RlIH0gZnJvbSAnLi9kZWxldGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBXaGVyZU5vZGUgfSBmcm9tICcuL3doZXJlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgUmV0dXJuaW5nTm9kZSB9IGZyb20gJy4vcmV0dXJuaW5nLW5vZGUuanMnO1xuaW1wb3J0IHsgRXhwbGFpbk5vZGUgfSBmcm9tICcuL2V4cGxhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBNZXJnZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBPdXRwdXROb2RlIH0gZnJvbSAnLi9vdXRwdXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5Tm9kZSB9IGZyb20gJy4vb3JkZXItYnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiAoU2VsZWN0UXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBJbnNlcnRRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIFVwZGF0ZVF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgRGVsZXRlUXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBNZXJnZVF1ZXJ5Tm9kZS5pcyhub2RlKSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbmRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IG5vZGUuZW5kTW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm5vZGUuZW5kTW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHdoZXJlOiBub2RlLndoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUud2hlcmUsICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSm9pbihub2RlLCBqb2luKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGpvaW5zOiBub2RlLmpvaW5zID8gZnJlZXplKFsuLi5ub2RlLmpvaW5zLCBqb2luXSkgOiBmcmVlemUoW2pvaW5dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhSZXR1cm5pbmcobm9kZSwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICByZXR1cm5pbmc6IG5vZGUucmV0dXJuaW5nXG4gICAgICAgICAgICAgICAgPyBSZXR1cm5pbmdOb2RlLmNsb25lV2l0aFNlbGVjdGlvbnMobm9kZS5yZXR1cm5pbmcsIHNlbGVjdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBSZXR1cm5pbmdOb2RlLmNyZWF0ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRSZXR1cm5pbmcobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICByZXR1cm5pbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHdoZXJlOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRXhwbGFpbihub2RlLCBmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZXhwbGFpbjogRXhwbGFpbk5vZGUuY3JlYXRlKGZvcm1hdCwgb3B0aW9ucz8udG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRvcChub2RlLCB0b3ApIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdG9wLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE91dHB1dChub2RlLCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIG91dHB1dDogbm9kZS5vdXRwdXRcbiAgICAgICAgICAgICAgICA/IE91dHB1dE5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyhub2RlLm91dHB1dCwgc2VsZWN0aW9ucylcbiAgICAgICAgICAgICAgICA6IE91dHB1dE5vZGUuY3JlYXRlKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBvcmRlckJ5OiBub2RlLm9yZGVyQnlcbiAgICAgICAgICAgICAgICA/IE9yZGVyQnlOb2RlLmNsb25lV2l0aEl0ZW1zKG5vZGUub3JkZXJCeSwgaXRlbXMpXG4gICAgICAgICAgICAgICAgOiBPcmRlckJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dE9yZGVyQnkobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBvcmRlckJ5OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGcm9tTm9kZSB9IGZyb20gJy4vZnJvbS1ub2RlLmpzJztcbmltcG9ydCB7IEdyb3VwQnlOb2RlIH0gZnJvbSAnLi9ncm91cC1ieS1ub2RlLmpzJztcbmltcG9ydCB7IEhhdmluZ05vZGUgfSBmcm9tICcuL2hhdmluZy1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4vcXVlcnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0UXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3RRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVGcm9tKGZyb21JdGVtcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2VsZWN0aW9ucyhzZWxlY3QsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBzZWxlY3Quc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3Quc2VsZWN0aW9ucywgLi4uc2VsZWN0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRGlzdGluY3RPbihzZWxlY3QsIGV4cHJlc3Npb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgZGlzdGluY3RPbjogc2VsZWN0LmRpc3RpbmN0T25cbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LmRpc3RpbmN0T24sIC4uLmV4cHJlc3Npb25zXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShleHByZXNzaW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihzZWxlY3QsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IHNlbGVjdC5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3QuZnJvbnRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbbW9kaWZpZXJdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aE9yZGVyQnlJdGVtczogKG5vZGUsIGl0ZW1zKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKG5vZGUsIGl0ZW1zKSxcbiAgICBjbG9uZVdpdGhHcm91cEJ5SXRlbXMoc2VsZWN0Tm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgZ3JvdXBCeTogc2VsZWN0Tm9kZS5ncm91cEJ5XG4gICAgICAgICAgICAgICAgPyBHcm91cEJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhzZWxlY3ROb2RlLmdyb3VwQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogR3JvdXBCeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhMaW1pdChzZWxlY3ROb2RlLCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPZmZzZXQoc2VsZWN0Tm9kZSwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGZXRjaChzZWxlY3ROb2RlLCBmZXRjaCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBmZXRjaCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhIYXZpbmcoc2VsZWN0Tm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGhhdmluZzogc2VsZWN0Tm9kZS5oYXZpbmdcbiAgICAgICAgICAgICAgICA/IEhhdmluZ05vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKHNlbGVjdE5vZGUuaGF2aW5nLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogSGF2aW5nTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhTZXRPcGVyYXRpb25zKHNlbGVjdE5vZGUsIHNldE9wZXJhdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgc2V0T3BlcmF0aW9uczogc2VsZWN0Tm9kZS5zZXRPcGVyYXRpb25zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdE5vZGUuc2V0T3BlcmF0aW9ucywgLi4uc2V0T3BlcmF0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoWy4uLnNldE9wZXJhdGlvbnNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRTZWxlY3Rpb25zKHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IFtdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dExpbWl0KHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGxpbWl0OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0T2Zmc2V0KHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIG9mZnNldDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIC8vIFRPRE86IHJlbW92ZSBpbiB2MC4yOVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBgUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnlgIGluc3RlYWQuXG4gICAgICovXG4gICAgY2xvbmVXaXRob3V0T3JkZXJCeTogKG5vZGUpID0+IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KG5vZGUpLFxuICAgIGNsb25lV2l0aG91dEdyb3VwQnkoc2VsZWN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgZ3JvdXBCeTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pvaW4tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEpvaW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgSm9pbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9uKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBKdXN0IGxpa2Uge0BsaW5rIFdoZXJlSW50ZXJmYWNlLndoZXJlUmVmfSBidXQgYWRkcyBhbiBpdGVtIHRvIHRoZSBqb2luJ3NcbiAgICAgKiBgb25gIGNsYXVzZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gZm9yIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIG9uUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IEpvaW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgam9pbk5vZGU6IEpvaW5Ob2RlLmNsb25lV2l0aE9uKHRoaXMuI3Byb3BzLmpvaW5Ob2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgb24gdHJ1ZWAuXG4gICAgICovXG4gICAgb25UcnVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEpvaW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgam9pbk5vZGU6IEpvaW5Ob2RlLmNsb25lV2l0aE9uKHRoaXMuI3Byb3BzLmpvaW5Ob2RlLCBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ3RydWUnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmpvaW5Ob2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQYXJ0aXRpb25CeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJ0aXRpb25CeUl0ZW1Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShwYXJ0aXRpb25CeSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJ0aXRpb25CeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnRpdGlvbi1ieS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBQYXJ0aXRpb25CeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBhcnRpdGlvbkJ5KHBhcnRpdGlvbkJ5KSB7XG4gICAgcmV0dXJuIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChwYXJ0aXRpb25CeSkubWFwKFBhcnRpdGlvbkJ5SXRlbU5vZGUuY3JlYXRlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3Zlci1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgT3Zlck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vdmVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVBhcnRpdGlvbkJ5LCB9IGZyb20gJy4uL3BhcnNlci9wYXJ0aXRpb24tYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBPdmVyQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5vdmVyTm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyQnVpbGRlcih7XG4gICAgICAgICAgICBvdmVyTm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMub3Zlck5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcGFydGl0aW9uQnkocGFydGl0aW9uQnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPdmVyQnVpbGRlcih7XG4gICAgICAgICAgICBvdmVyTm9kZTogT3Zlck5vZGUuY2xvbmVXaXRoUGFydGl0aW9uQnlJdGVtcyh0aGlzLiNwcm9wcy5vdmVyTm9kZSwgcGFyc2VQYXJ0aXRpb25CeShwYXJ0aXRpb25CeSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5vdmVyTm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4vcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0QWxsTm9kZSB9IGZyb20gJy4vc2VsZWN0LWFsbC1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGwoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBTZWxlY3RBbGxOb2RlLmNyZWF0ZSgpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVNlbGVjdEFsbEZyb21UYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogUmVmZXJlbmNlTm9kZS5jcmVhdGVTZWxlY3RBbGwodGFibGUpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlQWxpYXNlZFN0cmluZ1JlZmVyZW5jZSB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyLCB9IGZyb20gJy4uL2R5bmFtaWMvZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4vdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pIHtcbiAgICBpZiAoaXNGdW5jdGlvbihzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24oZXhwcmVzc2lvbkJ1aWxkZXIoKSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1JlYWRvbmx5QXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gc2VsZWN0aW9uLm1hcCgoaXQpID0+IHBhcnNlU2VsZWN0RXhwcmVzc2lvbihpdCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVNlbGVjdEV4cHJlc3Npb24oc2VsZWN0aW9uKV07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTZWxlY3RFeHByZXNzaW9uKHNlbGVjdGlvbikge1xuICAgIGlmIChpc1N0cmluZyhzZWxlY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2Uoc2VsZWN0aW9uKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUoc2VsZWN0aW9uLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRFeHByZXNzaW9uKHNlbGVjdGlvbikpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbGVjdEFsbCh0YWJsZSkge1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIFtTZWxlY3Rpb25Ob2RlLmNyZWF0ZVNlbGVjdEFsbCgpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcChwYXJzZVNlbGVjdEFsbEFyZyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlU2VsZWN0QWxsQXJnKHRhYmxlKV07XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTZWxlY3RBbGxBcmcodGFibGUpIHtcbiAgICBpZiAoaXNTdHJpbmcodGFibGUpKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3Rpb25Ob2RlLmNyZWF0ZVNlbGVjdEFsbEZyb21UYWJsZShwYXJzZVRhYmxlKHRhYmxlKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB2YWx1ZSBzZWxlY3RBbGwgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeSh0YWJsZSl9YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ZhbHVlcy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbHVlc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ZhbHVlc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZXNOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKHZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVmYXVsdC1pbnNlcnQtdmFsdWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVmYXVsdEluc2VydFZhbHVlTm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaW5zZXJ0LXZhbHVlcy1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIGlzRnVuY3Rpb24sIGlzUmVhZG9ubHlBcnJheSwgaXNVbmRlZmluZWQsIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24gfSBmcm9tICcuL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBWYWx1ZXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWVzLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uT3JGYWN0b3J5IH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGVmYXVsdC1pbnNlcnQtdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBleHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VJbnNlcnRFeHByZXNzaW9uKGFyZykge1xuICAgIGNvbnN0IG9iamVjdE9yTGlzdCA9IGlzRnVuY3Rpb24oYXJnKSA/IGFyZyhleHByZXNzaW9uQnVpbGRlcigpKSA6IGFyZztcbiAgICBjb25zdCBsaXN0ID0gaXNSZWFkb25seUFycmF5KG9iamVjdE9yTGlzdClcbiAgICAgICAgPyBvYmplY3RPckxpc3RcbiAgICAgICAgOiBmcmVlemUoW29iamVjdE9yTGlzdF0pO1xuICAgIHJldHVybiBwYXJzZUluc2VydENvbHVtbnNBbmRWYWx1ZXMobGlzdCk7XG59XG5mdW5jdGlvbiBwYXJzZUluc2VydENvbHVtbnNBbmRWYWx1ZXMocm93cykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBwYXJzZUNvbHVtbk5hbWVzQW5kSW5kZXhlcyhyb3dzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBmcmVlemUoWy4uLmNvbHVtbnMua2V5cygpXS5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgVmFsdWVzTm9kZS5jcmVhdGUocm93cy5tYXAoKHJvdykgPT4gcGFyc2VSb3dWYWx1ZXMocm93LCBjb2x1bW5zKSkpLFxuICAgIF07XG59XG5mdW5jdGlvbiBwYXJzZUNvbHVtbk5hbWVzQW5kSW5kZXhlcyhyb3dzKSB7XG4gICAgY29uc3QgY29sdW1ucyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGNvbnN0IGNvbHMgPSBPYmplY3Qua2V5cyhyb3cpO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2xzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbHVtbnMuaGFzKGNvbCkgJiYgcm93W2NvbF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuc2V0KGNvbCwgY29sdW1ucy5zaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sdW1ucztcbn1cbmZ1bmN0aW9uIHBhcnNlUm93VmFsdWVzKHJvdywgY29sdW1ucykge1xuICAgIGNvbnN0IHJvd0NvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3cpO1xuICAgIGNvbnN0IHJvd1ZhbHVlcyA9IEFycmF5LmZyb20oe1xuICAgICAgICBsZW5ndGg6IGNvbHVtbnMuc2l6ZSxcbiAgICB9KTtcbiAgICBsZXQgaGFzVW5kZWZpbmVkT3JDb21wbGV4Q29sdW1ucyA9IGZhbHNlO1xuICAgIGxldCBpbmRleGVkUm93Q29sdW1ucyA9IHJvd0NvbHVtbnMubGVuZ3RoO1xuICAgIGZvciAoY29uc3QgY29sIG9mIHJvd0NvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uSWR4ID0gY29sdW1ucy5nZXQoY29sKTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGNvbHVtbklkeCkpIHtcbiAgICAgICAgICAgIGluZGV4ZWRSb3dDb2x1bW5zLS07XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2xdO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWUpIHx8IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJvd1ZhbHVlc1tjb2x1bW5JZHhdID0gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGhhc01pc3NpbmdDb2x1bW5zID0gaW5kZXhlZFJvd0NvbHVtbnMgPCBjb2x1bW5zLnNpemU7XG4gICAgaWYgKGhhc01pc3NpbmdDb2x1bW5zIHx8IGhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gRGVmYXVsdEluc2VydFZhbHVlTm9kZS5jcmVhdGUoKTtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKHJvd1ZhbHVlcy5tYXAoKGl0KSA9PiBpc1VuZGVmaW5lZChpdCkgPyBkZWZhdWx0VmFsdWUgOiBwYXJzZVZhbHVlRXhwcmVzc2lvbihpdCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUuY3JlYXRlKHJvd1ZhbHVlcyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi11cGRhdGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5VcGRhdGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2x1bW5VcGRhdGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtblVwZGF0ZU5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXNldC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uVXBkYXRlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi11cGRhdGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBleHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24gfSBmcm9tICcuL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVwZGF0ZSguLi5hcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBDb2x1bW5VcGRhdGVOb2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oYXJnc1swXSksIHBhcnNlVmFsdWVFeHByZXNzaW9uKGFyZ3NbMV0pKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbihhcmdzWzBdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24odXBkYXRlKSB7XG4gICAgY29uc3QgdXBkYXRlT2JqID0gaXNGdW5jdGlvbih1cGRhdGUpID8gdXBkYXRlKGV4cHJlc3Npb25CdWlsZGVyKCkpIDogdXBkYXRlO1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh1cGRhdGVPYmopXG4gICAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICByZXR1cm4gQ29sdW1uVXBkYXRlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUoa2V5KSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWUpKTtcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tZHVwbGljYXRlLWtleS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uRHVwbGljYXRlS2V5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT25EdXBsaWNhdGVLZXlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh1cGRhdGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uRHVwbGljYXRlS2V5Tm9kZScsXG4gICAgICAgICAgICB1cGRhdGVzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC1yZXN1bHQuZC50c1wiIC8+XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYW4gaW5zZXJ0IHF1ZXJ5LlxuICpcbiAqIElmIHRoZSB0YWJsZSBoYXMgYW4gYXV0byBpbmNyZW1lbnRpbmcgcHJpbWFyeSBrZXkge0BsaW5rIGluc2VydElkfSB3aWxsIGhvbGRcbiAqIHRoZSBnZW5lcmF0ZWQgaWQgb24gZGlhbGVjdHMgdGhhdCBzdXBwb3J0IGl0LiBGb3IgZXhhbXBsZSBQb3N0Z3JlU1FMIGRvZXNuJ3RcbiAqIHJldHVybiB0aGUgaWQgYnkgZGVmYXVsdCBhbmQge0BsaW5rIGluc2VydElkfSBpcyB1bmRlZmluZWQuIE9uIFBvc3RncmVTUUwgeW91XG4gKiBuZWVkIHRvIHVzZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZ30gb3Ige0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmdBbGx9XG4gKiB0byBnZXQgb3V0IHRoZSBpbnNlcnRlZCBpZC5cbiAqXG4gKiB7QGxpbmsgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzfSBob2xkcyB0aGUgbnVtYmVyIG9mIChhY3R1YWxseSkgaW5zZXJ0ZWQgcm93cy5cbiAqIE9uIE15U1FMLCB1cGRhdGVkIHJvd3MgYXJlIGNvdW50ZWQgdHdpY2Ugd2hlbiB1c2luZyBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgLlxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0UGVyc29uKHBlcnNvbjogTmV3UGVyc29uKSB7XG4gKiAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gKiAgICAgLnZhbHVlcyhwZXJzb24pXG4gKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAqXG4gKiAgIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZCkgLy8gcmVsZXZhbnQgb24gTXlTUUxcbiAqICAgY29uc29sZS5sb2cocmVzdWx0Lm51bUluc2VydGVkT3JVcGRhdGVkUm93cykgLy8gYWx3YXlzIHJlbGV2YW50XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEluc2VydFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGF1dG8gaW5jcmVtZW50aW5nIHByaW1hcnkga2V5IG9mIHRoZSBpbnNlcnRlZCByb3cuXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IGNhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgcXVlcnkgY29udGFpbnMgYW4gYG9uIGNvbmZsaWN0YFxuICAgICAqIGNsYXVzZSB0aGF0IG1ha2VzIHRoZSBxdWVyeSBzdWNjZWVkIGV2ZW4gd2hlbiBub3RoaW5nIGdldHMgaW5zZXJ0ZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGFsd2F5cyB1bmRlZmluZWQgb24gZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIHRoYXRcbiAgICAgKiBkb24ndCByZXR1cm4gdGhlIGluc2VydGVkIGlkIGJ5IGRlZmF1bHQuIE9uIHRob3NlIGRpYWxlY3RzIHlvdSBuZWVkXG4gICAgICogdG8gdXNlIHRoZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZyB8IHJldHVybmluZ30gbWV0aG9kLlxuICAgICAqL1xuICAgIGluc2VydElkO1xuICAgIC8qKlxuICAgICAqIEFmZmVjdGVkIHJvd3MgY291bnQuXG4gICAgICovXG4gICAgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzO1xuICAgIGNvbnN0cnVjdG9yKGluc2VydElkLCBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5pbnNlcnRJZCA9IGluc2VydElkO1xuICAgICAgICB0aGlzLm51bUluc2VydGVkT3JVcGRhdGVkUm93cyA9IG51bUluc2VydGVkT3JVcGRhdGVkUm93cztcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL25vLXJlc3VsdC1lcnJvci5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBOb1Jlc3VsdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFRoZSBvcGVyYXRpb24gbm9kZSB0cmVlIG9mIHRoZSBxdWVyeSB0aGF0IHdhcyBleGVjdXRlZC5cbiAgICAgKi9cbiAgICBub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIoJ25vIHJlc3VsdCcpO1xuICAgICAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3Rvcihmbikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm4sICdwcm90b3R5cGUnKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tY29uZmxpY3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFdoZXJlTm9kZSB9IGZyb20gJy4vd2hlcmUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT25Db25mbGljdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09uQ29uZmxpY3ROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT25Db25mbGljdE5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJbmRleFdoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBpbmRleFdoZXJlOiBub2RlLmluZGV4V2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS5pbmRleFdoZXJlLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEluZGV4T3JXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogbm9kZS5pbmRleFdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUuaW5kZXhXaGVyZSwgJ09yJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVwZGF0ZVdoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogbm9kZS51cGRhdGVXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLnVwZGF0ZVdoZXJlLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVwZGF0ZU9yV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiBub2RlLnVwZGF0ZVdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUudXBkYXRlV2hlcmUsICdPcicsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRJbmRleFdoZXJlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dFVwZGF0ZVdoZXJlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1jb25mbGljdC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IE9uQ29uZmxpY3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb24tY29uZmxpY3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBPbkNvbmZsaWN0QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHNpbmdsZSBjb2x1bW4gYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1uc30sIHtAbGluayBjb25zdHJhaW50fSBhbmQge0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogbWV0aG9kcyBmb3IgYWx0ZXJuYXRpdmUgd2F5cyB0byBzcGVjaWZ5IHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICBjb25zdCBjb2x1bW5Ob2RlID0gQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi50aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZS5jb2x1bW5zLCBjb2x1bW5Ob2RlXSlcbiAgICAgICAgICAgICAgICAgICAgOiBmcmVlemUoW2NvbHVtbk5vZGVdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIGxpc3Qgb2YgY29sdW1ucyBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBjb2x1bW59LCB7QGxpbmsgY29uc3RyYWludH0gYW5kIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGNvbHVtbnMoY29sdW1ucykge1xuICAgICAgICBjb25zdCBjb2x1bW5Ob2RlcyA9IGNvbHVtbnMubWFwKENvbHVtbk5vZGUuY3JlYXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi50aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZS5jb2x1bW5zLCAuLi5jb2x1bW5Ob2Rlc10pXG4gICAgICAgICAgICAgICAgICAgIDogZnJlZXplKGNvbHVtbk5vZGVzKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHNwZWNpZmljIGNvbnN0cmFpbnQgYnkgbmFtZSBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBjb2x1bW59LCB7QGxpbmsgY29sdW1uc30gYW5kIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb25zdHJhaW50OiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGV4cHJlc3Npb24gYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlIHVuaXF1ZSBpbmRleCBpcyBhbiBleHByZXNzaW9uIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBjb2x1bW59LCB7QGxpbmsgY29sdW1uc30gYW5kIHtAbGluayBjb25zdHJhaW50fVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwge1xuICAgICAgICAgICAgICAgIGluZGV4RXhwcmVzc2lvbjogZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoSW5kZXhXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRob3V0SW5kZXhXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImRvIG5vdGhpbmdcIiBjb25mbGljdCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3QgZmlyc3RfbmFtZSA9ICdKb2huJ1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XHUwMEEwZmlyc3RfbmFtZSwgaWQgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9Ob3RoaW5nKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImlkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIikgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRvTm90aGluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0RG9Ob3RoaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBkb05vdGhpbmc6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIFwiZG8gdXBkYXRlIHNldFwiIGNvbmZsaWN0IGFjdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBpZCA9IDFcbiAgICAgKiBjb25zdCBmaXJzdF9uYW1lID0gJ0pvaG4nXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcdTAwQTBmaXJzdF9uYW1lLCBpZCB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCdpZCcpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IGZpcnN0X25hbWUgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImlkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwiZmlyc3RfbmFtZVwiID0gJDNcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIHRoZSBuZXh0IGV4YW1wbGUgd2UgdXNlIHRoZSBgcmVmYCBtZXRob2QgdG8gcmVmZXJlbmNlXG4gICAgICogY29sdW1ucyBvZiB0aGUgdmlydHVhbCB0YWJsZSBgZXhjbHVkZWRgIGluIGEgdHlwZS1zYWZlIHdheVxuICAgICAqIHRvIGNyZWF0ZSBhbiB1cHNlcnQgb3BlcmF0aW9uOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiB1cHNlcnRQZXJzb24ocGVyc29uOiBOZXdQZXJzb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgKiAgIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMocGVyc29uKVxuICAgICAqICAgICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAgIC5kb1VwZGF0ZVNldCgoZWIpID0+ICh7XG4gICAgICogICAgICAgICBmaXJzdF9uYW1lOiBlYi5yZWYoJ2V4Y2x1ZGVkLmZpcnN0X25hbWUnKSxcbiAgICAgKiAgICAgICAgIGxhc3RfbmFtZTogZWIucmVmKCdleGNsdWRlZC5sYXN0X25hbWUnKVxuICAgICAqICAgICAgIH0pXG4gICAgICogICAgIClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBvbiBjb25mbGljdCAoXCJpZFwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXRcbiAgICAgKiAgXCJmaXJzdF9uYW1lXCIgPSBleGNsdWRlZC5cImZpcnN0X25hbWVcIixcbiAgICAgKiAgXCJsYXN0X25hbWVcIiA9IGV4Y2x1ZGVkLlwibGFzdF9uYW1lXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkb1VwZGF0ZVNldCh1cGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVzOiBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24odXBkYXRlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPbkNvbmZsaWN0RG9Ob3RoaW5nQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoVXBkYXRlV2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdoZXJlIGNvbmRpdGlvbiBmb3IgdGhlIHVwZGF0ZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIFdoZXJlSW50ZXJmYWNlLndoZXJlUmVmfSBmb3IgbW9yZSBpbmZvLlxuICAgICAqL1xuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aFVwZGF0ZVdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhvdXRVcGRhdGVXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdG9wLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVG9wTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVG9wTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1RvcE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIG1vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90b3AtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgVG9wTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3RvcC1ub2RlLmpzJztcbmltcG9ydCB7IGlzQmlnSW50LCBpc051bWJlciwgaXNVbmRlZmluZWQgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgaWYgKCFpc051bWJlcihleHByZXNzaW9uKSAmJiAhaXNCaWdJbnQoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRvcCBleHByZXNzaW9uOiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuICAgIGlmICghaXNVbmRlZmluZWQobW9kaWZpZXJzKSAmJiAhaXNUb3BNb2RpZmllcnMobW9kaWZpZXJzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdG9wIG1vZGlmaWVyczogJHttb2RpZmllcnN9YCk7XG4gICAgfVxuICAgIHJldHVybiBUb3BOb2RlLmNyZWF0ZShleHByZXNzaW9uLCBtb2RpZmllcnMpO1xufVxuZnVuY3Rpb24gaXNUb3BNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gICAgcmV0dXJuIChtb2RpZmllcnMgPT09ICdwZXJjZW50JyB8fFxuICAgICAgICBtb2RpZmllcnMgPT09ICd3aXRoIHRpZXMnIHx8XG4gICAgICAgIG1vZGlmaWVycyA9PT0gJ3BlcmNlbnQgd2l0aCB0aWVzJyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yLWFjdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9yQWN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT3JBY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3JBY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCBwYXJzZVNlbGVjdEFsbCwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUluc2VydEV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2luc2VydC12YWx1ZXMtcGFyc2VyLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBPbkR1cGxpY2F0ZUtleU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vbi1kdXBsaWNhdGUta2V5LW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UmVzdWx0IH0gZnJvbSAnLi9pbnNlcnQtcmVzdWx0LmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IE9uQ29uZmxpY3RCdWlsZGVyLCB9IGZyb20gJy4vb24tY29uZmxpY3QtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBPckFjdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vci1hY3Rpb24tbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgSW5zZXJ0UXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZXMgdG8gaW5zZXJ0IGZvciBhbiB7QGxpbmsgS3lzZWx5Lmluc2VydEludG8gfCBpbnNlcnR9IHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgdGFrZXMgYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIGNvbHVtbiBuYW1lcyBhbmQgdmFsdWVzIGFyZVxuICAgICAqIHZhbHVlcyB0byBpbnNlcnQuIEluIGFkZGl0aW9uIHRvIHRoZSBjb2x1bW4ncyB0eXBlLCB0aGUgdmFsdWVzIGNhbiBiZVxuICAgICAqIHJhdyB7QGxpbmsgc3FsfSBzbmlwcGV0cyBvciBzZWxlY3QgcXVlcmllcy5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHByb3ZpZGUgYWxsIGZpZWxkcyB5b3UgaGF2ZW4ndCBleHBsaWNpdGx5IG1hcmtlZCBhcyBudWxsYWJsZVxuICAgICAqIG9yIG9wdGlvbmFsIHVzaW5nIHtAbGluayBHZW5lcmF0ZWR9IG9yIHtAbGluayBDb2x1bW5UeXBlfS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYW4gYGluc2VydGAgcXVlcnkgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluc2VydFJlc3VsdH0uIFRoZVxuICAgICAqIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgaG9sZHMgdGhlIGF1dG8gaW5jcmVtZW50ZWQgcHJpbWFyeVxuICAgICAqIGtleSBpZiB0aGUgZGF0YWJhc2UgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogT24gUG9zdGdyZVNRTCBhbmQgc29tZSBvdGhlciBkaWFsZWN0cywgeW91IG5lZWQgdG8gY2FsbCBgcmV0dXJuaW5nYCB0byBnZXRcbiAgICAgKiBzb21ldGhpbmcgb3V0IG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhwcmVzc2lvbn0gbWV0aG9kIGZvciBpbnNlcnRpbmcgdGhlIHJlc3VsdCBvZiBhIHNlbGVjdFxuICAgICAqIHF1ZXJ5IG9yIGFueSBvdGhlciBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiU2luZ2xlIHJvd1wiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBJbnNlcnQgYSBzaW5nbGUgcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDBcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiAvLyBgaW5zZXJ0SWRgIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGRpYWxlY3RzIHRoYXRcbiAgICAgKiAvLyBhdXRvbWF0aWNhbGx5IHJldHVybiB0aGUgaWQgb2YgdGhlIGluc2VydGVkIHJvd1xuICAgICAqIC8vIHN1Y2ggYXMgTXlTUUwgYW5kIFNRTGl0ZS4gT24gUG9zdGdyZVNRTCwgZm9yIGV4YW1wbGUsXG4gICAgICogLy8geW91IG5lZWQgdG8gYWRkIGEgYHJldHVybmluZ2AgY2xhdXNlIHRvIHRoZSBxdWVyeSB0b1xuICAgICAqIC8vIGdldCBhbnl0aGluZyBvdXQuIFNlZSB0aGUgXCJyZXR1cm5pbmcgZGF0YVwiIGV4YW1wbGUuXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgYWdlYCkgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIk11bHRpcGxlIHJvd3NcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogT24gZGlhbGVjdHMgdGhhdCBzdXBwb3J0IGl0IChmb3IgZXhhbXBsZSBQb3N0Z3JlU1FMKSB5b3UgY2FuIGluc2VydCBtdWx0aXBsZVxuICAgICAqIHJvd3MgYnkgcHJvdmlkaW5nIGFuIGFycmF5LiBOb3RlIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBpcyBvbmNlIGFnYWluIHZlcnlcbiAgICAgKiBkaWFsZWN0LXNwZWNpZmljLiBTb21lIGRhdGFiYXNlcyBtYXkgb25seSByZXR1cm4gdGhlIGlkIG9mIHRoZSAqbGFzdCogaW5zZXJ0ZWRcbiAgICAgKiByb3cgYW5kIHNvbWUgcmV0dXJuIG5vdGhpbmcgYXQgYWxsIHVubGVzcyB5b3UgY2FsbCBgcmV0dXJuaW5nYC5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyhbe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJyxcbiAgICAgKiAgICAgYWdlOiA0MCxcbiAgICAgKiAgIH0sIHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0Fybm9sZCcsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ1NjaHdhcnplbmVnZ2VyJyxcbiAgICAgKiAgICAgYWdlOiA3MCxcbiAgICAgKiAgIH1dKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiYWdlXCIpIHZhbHVlcyAoKCQxLCAkMiwgJDMpLCAoJDQsICQ1LCAkNikpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiUmV0dXJuaW5nIGRhdGFcIiwgMzApIC0tPlxuICAgICAqXG4gICAgICogT24gc3VwcG9ydGVkIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCB5b3UgbmVlZCB0byBjaGFpbiBgcmV0dXJuaW5nYCB0byB0aGUgcXVlcnkgdG8gZ2V0XG4gICAgICogdGhlIGluc2VydGVkIHJvdydzIGNvbHVtbnMgKG9yIGFueSBvdGhlciBleHByZXNzaW9uKSBhcyB0aGUgcmV0dXJuIHZhbHVlLiBgcmV0dXJuaW5nYFxuICAgICAqIHdvcmtzIGp1c3QgbGlrZSBgc2VsZWN0YC4gUmVmZXIgdG8gYHNlbGVjdGAgbWV0aG9kJ3MgZXhhbXBsZXMgYW5kIGRvY3VtZW50YXRpb24gZm9yXG4gICAgICogbW9yZSBpbmZvLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDAsXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUgYXMgbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImFnZVwiKSB2YWx1ZXMgKCQxLCAkMiwgJDMpIHJldHVybmluZyBcImlkXCIsIFwiZmlyc3RfbmFtZVwiIGFzIFwibmFtZVwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiQ29tcGxleCB2YWx1ZXNcIiwgNDApIC0tPlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gcHJpbWl0aXZlcywgdGhlIHZhbHVlcyBjYW4gYWxzbyBiZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMuXG4gICAgICogWW91IGNhbiBidWlsZCB0aGUgZXhwcmVzc2lvbnMgYnkgdXNpbmcgYSBjYWxsYmFjayBhbmQgY2FsbGluZyB0aGUgbWV0aG9kc1xuICAgICAqIG9uIHRoZSBleHByZXNzaW9uIGJ1aWxkZXIgcGFzc2VkIHRvIGl0OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBhbmkgPSBcIkFuaVwiXG4gICAgICogY29uc3Qgc3RvbiA9IFwic3RvblwiXG4gICAgICpcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKCh7IHJlZiwgc2VsZWN0RnJvbSwgZm4gfSkgPT4gKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiBzcWw8c3RyaW5nPmBjb25jYXQoJHthbml9LCAke3N0b259KWAsXG4gICAgICogICAgIG1pZGRsZV9uYW1lOiByZWYoJ2ZpcnN0X25hbWUnKSxcbiAgICAgKiAgICAgYWdlOiBzZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAgIC5zZWxlY3QoZm4uYXZnPG51bWJlcj4oJ2FnZScpLmFzKCdhdmdfYWdlJykpLFxuICAgICAqICAgfSkpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiLFxuICAgICAqICAgXCJsYXN0X25hbWVcIixcbiAgICAgKiAgIFwibWlkZGxlX25hbWVcIixcbiAgICAgKiAgIFwiYWdlXCJcbiAgICAgKiApXG4gICAgICogdmFsdWVzIChcbiAgICAgKiAgICQxLFxuICAgICAqICAgY29uY2F0KCQyLCAkMyksXG4gICAgICogICBcImZpcnN0X25hbWVcIixcbiAgICAgKiAgIChzZWxlY3QgYXZnKFwiYWdlXCIpIGFzIFwiYXZnX2FnZVwiIGZyb20gXCJwZXJzb25cIilcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBjYWxsYmFjayB2ZXJzaW9uIG9mIHN1YnF1ZXJpZXMgb3IgcmF3IGV4cHJlc3Npb25zOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi53aXRoKCdqZW5uaWZlcicsIChkYikgPT4gZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgLnNlbGVjdChbJ2lkJywgJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAubGltaXQoMSlcbiAgICAgKiApLmluc2VydEludG8oJ3BldCcpLnZhbHVlcygoZWIpID0+ICh7XG4gICAgICogICBvd25lcl9pZDogZWIuc2VsZWN0RnJvbSgnamVubmlmZXInKS5zZWxlY3QoJ2lkJyksXG4gICAgICogICBuYW1lOiBlYi5zZWxlY3RGcm9tKCdqZW5uaWZlcicpLnNlbGVjdCgnZmlyc3RfbmFtZScpLFxuICAgICAqICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogfSkpXG4gICAgICogLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogd2l0aCBcImplbm5pZmVyXCIgYXMgKFxuICAgICAqICAgc2VsZWN0IFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIsIFwiZ2VuZGVyXCJcbiAgICAgKiAgIGZyb20gXCJwZXJzb25cIlxuICAgICAqICAgd2hlcmUgXCJmaXJzdF9uYW1lXCIgPSAkMVxuICAgICAqICAgbGltaXQgJDJcbiAgICAgKiApXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJvd25lcl9pZFwiLCBcIm5hbWVcIiwgXCJzcGVjaWVzXCIpXG4gICAgICogdmFsdWVzIChcbiAgICAgKiAgKHNlbGVjdCBcImlkXCIgZnJvbSBcImplbm5pZmVyXCIpLFxuICAgICAqICAoc2VsZWN0IFwiZmlyc3RfbmFtZVwiIGZyb20gXCJqZW5uaWZlclwiKSxcbiAgICAgKiAgJDNcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdmFsdWVzKGluc2VydCkge1xuICAgICAgICBjb25zdCBbY29sdW1ucywgdmFsdWVzXSA9IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbihpbnNlcnQpO1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1ucyB0byBpbnNlcnQuXG4gICAgICpcbiAgICAgKiBUaGUge0BsaW5rIHZhbHVlc30gbWV0aG9kIHNldHMgYm90aCB0aGUgY29sdW1ucyBhbmQgdGhlIHZhbHVlcyBhbmQgdGhpcyBtZXRob2RcbiAgICAgKiBpcyBub3QgbmVlZGVkLiBCdXQgaWYgeW91IGFyZSB1c2luZyB0aGUge0BsaW5rIGV4cHJlc3Npb259IG1ldGhvZCwgeW91IGNhbiB1c2VcbiAgICAgKiB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIGNvbHVtbnMgdG8gaW5zZXJ0LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KCdwZXQubmFtZScpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIpXG4gICAgICogc2VsZWN0IFwicGV0XCIuXCJuYW1lXCIgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnNlcnQgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uIEZvciBleGFtcGxlIHRoZSByZXN1bHQgb2YgYSBzZWxlY3QgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJJbnNlcnQgc3VicXVlcnlcIiwgNTApIC0tPlxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYW4gYElOU0VSVCBJTlRPIFNFTEVDVCBGUk9NYCBxdWVyeSB1c2luZyB0aGUgYGV4cHJlc3Npb25gIG1ldGhvZC5cbiAgICAgKiBUaGlzIEFQSSBkb2Vzbid0IGZvbGxvdyBvdXIgV1lTSVdZRyBwcmluY2lwbGVzIGFuZCBtaWdodCBiZSBhIGJpdCBkaWZmaWN1bHQgdG9cbiAgICAgKiByZW1lbWJlci4gVGhlIHJlYXNvbnMgZm9yIHRoaXMgZGVzaWduIHN0ZW0gZnJvbSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHRpZXMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2FnZSddKVxuICAgICAqICAgLmV4cHJlc3Npb24oKGViKSA9PiBlYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGV0JylcbiAgICAgKiAgICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgICAncGV0Lm5hbWUnLFxuICAgICAqICAgICAgIGViLnZhbCgnUGV0c29uJykuYXMoJ2xhc3RfbmFtZScpLFxuICAgICAqICAgICAgIGViLmxpdCg3KS5hcygnYWdlJyksXG4gICAgICogICAgIF0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJhZ2VcIilcbiAgICAgKiBzZWxlY3QgXCJwZXRcIi5cIm5hbWVcIiwgJDEgYXMgXCJsYXN0X25hbWVcIiwgNyBhcyBcImFnZSBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYGluc2VydCBpbnRvIFwicGVyc29uXCIgZGVmYXVsdCB2YWx1ZXNgIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuZGVmYXVsdFZhbHVlcygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIGRlZmF1bHQgdmFsdWVzXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlczogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAubW9kaWZ5RW5kKHNxbGAtLSBUaGlzIGlzIGEgY29tbWVudGApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gYHBlcnNvbmAgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKVxuICAgICAqIHZhbHVlcyAoPywgPywgPykgLS0gVGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IGlnbm9yZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLlxuICAgICAqXG4gICAgICogVG8gYXZvaWQgYSBmb290Z3VuLCB3aGVuIGludm9rZWQgd2l0aCB0aGUgU1FMaXRlIGRpYWxlY3QsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiBiZSBoYW5kbGVkIGxpa2Uge0BsaW5rIG9ySWdub3JlfS4gU2VlIGFsc28sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sXG4gICAgICoge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiBJZiB5b3UgdXNlIHRoZSBpZ25vcmUgbW9kaWZpZXIsIGlnbm9yYWJsZSBlcnJvcnMgdGhhdCBvY2N1ciB3aGlsZSBleGVjdXRpbmcgdGhlXG4gICAgICogaW5zZXJ0IHN0YXRlbWVudCBhcmUgaWdub3JlZC4gRm9yIGV4YW1wbGUsIHdpdGhvdXQgaWdub3JlLCBhIHJvdyB0aGF0IGR1cGxpY2F0ZXNcbiAgICAgKiBhbiBleGlzdGluZyB1bmlxdWUgaW5kZXggb3IgcHJpbWFyeSBrZXkgdmFsdWUgaW4gdGhlIHRhYmxlIGNhdXNlcyBhIGR1cGxpY2F0ZS1rZXlcbiAgICAgKiBlcnJvciBhbmQgdGhlIHN0YXRlbWVudCBpcyBhYm9ydGVkLiBXaXRoIGlnbm9yZSwgdGhlIHJvdyBpcyBkaXNjYXJkZWQgYW5kIG5vIGVycm9yXG4gICAgICogb2NjdXJzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAuaWdub3JlKClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpZ25vcmUgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWdub3JlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnaWdub3JlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGlnbm9yZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFRvIGF2b2lkIGEgZm9vdGd1biwgd2hlbiBpbnZva2VkIHdpdGggdGhlIE15U1FMIGRpYWxlY3QsIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAgKiBiZSBoYW5kbGVkIGxpa2Uge0BsaW5rIGlnbm9yZX0uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vcklnbm9yZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGlnbm9yZSBpbnRvIGBwZXJzb25gIChgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgZ2VuZGVyYCkgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9ySWdub3JlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgnaWdub3JlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGFib3J0IGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckZhaWx9LCB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yQWJvcnQoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBhYm9ydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JBYm9ydCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2Fib3J0JyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIGZhaWwgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JSZXBsYWNlfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yRmFpbCgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIGZhaWwgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yRmFpbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2ZhaWwnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3IgcmVwbGFjZSBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2Uge0BsaW5rIEt5c2VseS5yZXBsYWNlSW50b30gdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwgYW5kIHtAbGluayBvclJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIHJlcGxhY2UgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yUmVwbGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ3JlcGxhY2UnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgb3Igcm9sbGJhY2sgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbywge0BsaW5rIG9ySWdub3JlfSwge0BsaW5rIG9yQWJvcnR9LCB7QGxpbmsgb3JGYWlsfSwgYW5kIHtAbGluayBvclJlcGxhY2V9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JSb2xsYmFjaygpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IG9yIHJvbGxiYWNrIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvclJvbGxiYWNrKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvckFjdGlvbjogT3JBY3Rpb25Ob2RlLmNyZWF0ZSgncm9sbGJhY2snKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgaW5zZXJ0IGludG9gIHF1ZXJ5IHRvIGFuIGBpbnNlcnQgdG9wIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBJbnNlcnQgdGhlIGZpcnN0IDUgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdnZW5kZXInXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKFxuICAgICAqICAgICAoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdChbJ25hbWUnLCBzcWwubGl0KCdvdGhlcicpLmFzKCdnZW5kZXInKV0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgdG9wKDUpIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHNlbGVjdCBcIm5hbWVcIiwgJ290aGVyJyBhcyBcImdlbmRlclwiIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW5zZXJ0IHRoZSBmaXJzdCA1MCBwZXJjZW50IG9mIHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAuZXhwcmVzc2lvbihcbiAgICAgKiAgICAgKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoWyduYW1lJywgc3FsLmxpdCgnb3RoZXInKS5hcygnZ2VuZGVyJyldKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IHRvcCg1MCkgcGVyY2VudCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiKSBzZWxlY3QgXCJuYW1lXCIsICdvdGhlcicgYXMgXCJnZW5kZXJcIiBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvbiBjb25mbGljdGAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIGBvbiBjb25mbGljdGAgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS4gT24gTXlTUUxcbiAgICAgKiB5b3UgY2FuIHVzZSB7QGxpbmsgaWdub3JlfSBhbmQge0BsaW5rIG9uRHVwbGljYXRlS2V5VXBkYXRlfSB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignbmFtZScpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChcIm5hbWVcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gcHJvdmlkZSB0aGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCBpbnN0ZWFkIG9mIGEgY29sdW1uIG5hbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29uc3RyYWludCgncGV0X25hbWVfa2V5JylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3Qgb24gY29uc3RyYWludCBcInBldF9uYW1lX2tleVwiXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhbiBleHByZXNzaW9uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQgaW4gY2FzZVxuICAgICAqIHRoZSB1bmlxdWUgaW5kZXggaXMgYW4gZXhwcmVzc2lvbiBpbmRleDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5leHByZXNzaW9uKHNxbDxzdHJpbmc+YGxvd2VyKG5hbWUpYClcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKGxvd2VyKG5hbWUpKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhZGQgYSBmaWx0ZXIgZm9yIHRoZSB1cGRhdGUgc3RhdGVtZW50IGxpa2UgdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ25hbWUnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgICAgLndoZXJlKCdleGNsdWRlZC5uYW1lJywgJyE9JywgJ0NhdHRvJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAoXCJuYW1lXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogd2hlcmUgXCJleGNsdWRlZFwiLlwibmFtZVwiICE9ICQ1XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGNyZWF0ZSBhbiBgb24gY29uZmxpY3QgZG8gbm90aGluZ2AgY2xhdXNlcyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCduYW1lJylcbiAgICAgKiAgICAgLmRvTm90aGluZygpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKFwibmFtZVwiKSBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHJlZmVyIHRvIHRoZSBjb2x1bW5zIG9mIHRoZSB2aXJ0dWFsIGBleGNsdWRlZGAgdGFibGVcbiAgICAgKiBpbiBhIHR5cGUtc2FmZSB3YXkgdXNpbmcgYSBjYWxsYmFjayBhbmQgdGhlIGByZWZgIG1ldGhvZCBvZlxuICAgICAqIGBFeHByZXNzaW9uQnVpbGRlcmA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgaWQ6IDEsXG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3Qob2MgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6IChlYikgPT4gZWIucmVmKCdleGNsdWRlZC5maXJzdF9uYW1lJyksXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAoZWIpID0+IGViLnJlZignZXhjbHVkZWQubGFzdF9uYW1lJylcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzLCAkNClcbiAgICAgKiBvbiBjb25mbGljdCAoXCJpZFwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXRcbiAgICAgKiAgXCJmaXJzdF9uYW1lXCIgPSBcImV4Y2x1ZGVkXCIuXCJmaXJzdF9uYW1lXCIsXG4gICAgICogIFwibGFzdF9uYW1lXCIgPSBcImV4Y2x1ZGVkXCIuXCJsYXN0X25hbWVcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uQ29uZmxpY3QoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb25Db25mbGljdDogY2FsbGJhY2sobmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNyZWF0ZSgpLFxuICAgICAgICAgICAgICAgIH0pKS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIElmIHlvdSBzcGVjaWZ5IGBvbiBkdXBsaWNhdGUga2V5IHVwZGF0ZWAsIGFuZCBhIHJvdyBpcyBpbnNlcnRlZCB0aGF0IHdvdWxkIGNhdXNlXG4gICAgICogYSBkdXBsaWNhdGUgdmFsdWUgaW4gYSB1bmlxdWUgaW5kZXggb3IgcHJpbWFyeSBrZXksIGFuIHVwZGF0ZSBvZiB0aGUgb2xkIHJvdyBvY2N1cnMuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLiBPbiBtb3N0IGRpYWxlY3RzIHlvdSBzaG91bGRcbiAgICAgKiB1c2Uge0BsaW5rIG9uQ29uZmxpY3R9IGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGlkOiAxLFxuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkR1cGxpY2F0ZUtleVVwZGF0ZSh7IHVwZGF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChgaWRgLCBgZmlyc3RfbmFtZWAsIGBsYXN0X25hbWVgLCBgZ2VuZGVyYClcbiAgICAgKiB2YWx1ZXMgKD8sID8sID8sID8pXG4gICAgICogb24gZHVwbGljYXRlIGtleSB1cGRhdGUgYHVwZGF0ZWRfYXRgID0gP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uRHVwbGljYXRlS2V5VXBkYXRlKHVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBvbkR1cGxpY2F0ZUtleTogT25EdXBsaWNhdGVLZXlOb2RlLmNyZWF0ZShwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24odXBkYXRlKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZyhzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgYHJldHVybmluZ2AgY2xhdXNlcyBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7IGZpcnN0X25hbWU6ICdKYW1lcycsIGxhc3RfbmFtZTogJ1NtaXRoJywgZ2VuZGVyOiAnbWFsZScgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoWydmaXJzdF9uYW1lJ10pXG4gICAgICogICAuY2xlYXJSZXR1cm5pbmcoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoeyBmaXJzdF9uYW1lOiAnSm9obicsIGxhc3RfbmFtZTogJ0RvZScsIGdlbmRlcjogJ21hbGUnIH0pXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0UGVyc29uKHZhbHVlczogTmV3UGVyc29uLCByZXR1cm5MYXN0TmFtZTogYm9vbGVhbikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHZhbHVlcylcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgICAgLiRpZihyZXR1cm5MYXN0TmFtZSwgKHFiKSA9PiBxYi5yZXR1cm5pbmcoJ2xhc3RfbmFtZScpKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFueSBzZWxlY3Rpb25zIGFkZGVkIGluc2lkZSB0aGUgYGlmYCBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGVcbiAgICAgKiBvdXRwdXQgdHlwZSBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHkgbWFkZSBiZWZvcmUgcnVubmluZ1xuICAgICAqIHRoZSBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGBpbnNlcnRQZXJzb25gIGZ1bmN0aW9uIGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBQcm9taXNlPHtcbiAgICAgKiAgIGlkOiBudW1iZXJcbiAgICAgKiAgIGZpcnN0X25hbWU6IHN0cmluZ1xuICAgICAqICAgbGFzdF9uYW1lPzogc3RyaW5nXG4gICAgICogfT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEluc2VydFF1ZXJ5QnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgKHBhcnRzIG9mKSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogS3lzZWx5IHRyaWVzIHRvIGJlIGFzIHR5cGUtc2FmZSBhcyBwb3NzaWJsZSwgYnV0IGluIHNvbWUgY2FzZXMgd2UgaGF2ZSB0byBtYWtlXG4gICAgICogY29tcHJvbWlzZXMgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlLiBBdCBwcmVzZW50LFxuICAgICAqIEt5c2VseSBkb2Vzbid0IG5hcnJvdyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5IGJhc2VkIG9uIHtAbGluayB2YWx1ZXN9IGlucHV0XG4gICAgICogd2hlbiB1c2luZyB7QGxpbmsgcmV0dXJuaW5nfSBvciB7QGxpbmsgcmV0dXJuaW5nQWxsfS5cbiAgICAgKlxuICAgICAqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdmVyeSB1c2VmdWwgZm9yIHRoZXNlIHNpdHVhdGlvbnMsIGFzIGl0IHJlbW92ZXMgdW5uY2Vzc2FyeVxuICAgICAqIHJ1bnRpbWUgYXNzZXJ0aW9uL2d1YXJkIGNvZGUuIEl0cyBpbnB1dCB0eXBlIGlzIGxpbWl0ZWQgdG8gdGhlIG91dHB1dCB0eXBlXG4gICAgICogb2YgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuJ3QgYWRkIGEgY29sdW1uIHRoYXQgZG9lc24ndCBleGlzdCwgb3IgY2hhbmdlIGEgY29sdW1uJ3NcbiAgICAgKiB0eXBlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gaXRzIHVuaW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFR1cm4gdGhpcyBjb2RlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICAgIG51bGxhYmxlX2NvbHVtbjogJ2hlbGwgeWVhaCEnXG4gICAgICogICB9KVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogaWYgKGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbikpIHtcbiAgICAgKiAgIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc1dpdGhOb051bGxWYWx1ZShwZXJzb246IFBlcnNvbik6IHBlcnNvbiBpcyBQZXJzb24gJiB7IG51bGxhYmxlX2NvbHVtbjogc3RyaW5nIH0ge1xuICAgICAqICAgcmV0dXJuIHBlcnNvbi5udWxsYWJsZV9jb2x1bW4gIT0gbnVsbFxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEludG8gdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOb3ROdWxsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgICBudWxsYWJsZV9jb2x1bW46ICdoZWxsIHllYWghJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLiRuYXJyb3dUeXBlPHsgbnVsbGFibGVfY29sdW1uOiBOb3ROdWxsIH0+KClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJG5hcnJvd1R5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0cyB0aGF0IHF1ZXJ5J3Mgb3V0cHV0IHJvdyB0eXBlIGVxdWFscyB0aGUgZ2l2ZW4gdHlwZSBgVGAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSBleGNlc3NpdmVseSBjb21wbGV4IHR5cGVzIHRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweVxuICAgICAqIGFuZCBtdWNoIGZhc3Rlci5cbiAgICAgKlxuICAgICAqIEt5c2VseSB1c2VzIGNvbXBsZXggdHlwZSBtYWdpYyB0byBhY2hpZXZlIGl0cyB0eXBlIHNhZmV0eS4gVGhpcyBjb21wbGV4aXR5IGlzIHNvbWV0aW1lcyB0b28gbXVjaFxuICAgICAqIGZvciBUeXBlU2NyaXB0IGFuZCB5b3UgZ2V0IGVycm9ycyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlcnJvciBUUzI1ODk6IFR5cGUgaW5zdGFudGlhdGlvbiBpcyBleGNlc3NpdmVseSBkZWVwIGFuZCBwb3NzaWJseSBpbmZpbml0ZS5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIHRoZXNlIGNhc2UgeW91IGNhbiBvZnRlbiB1c2UgdGhpcyBtZXRob2QgdG8gaGVscCBUeXBlU2NyaXB0IGEgbGl0dGxlIGJpdC4gV2hlbiB5b3UgdXNlIHRoaXNcbiAgICAgKiBtZXRob2QgdG8gYXNzZXJ0IHRoZSBvdXRwdXQgdHlwZSBvZiBhIHF1ZXJ5LCBLeXNlbHkgY2FuIGRyb3AgdGhlIGNvbXBsZXggb3V0cHV0IHR5cGUgdGhhdFxuICAgICAqIGNvbnNpc3RzIG9mIG11bHRpcGxlIG5lc3RlZCBoZWxwZXIgdHlwZXMgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc2ltcGxlIGFzc2VydGVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBkb2Vzbid0IHJlZHVjZSB0eXBlIHNhZmV0eSBhdCBhbGwuIFlvdSBoYXZlIHRvIHBhc3MgaW4gYSB0eXBlIHRoYXQgaXNcbiAgICAgKiBzdHJ1Y3R1cmFsbHkgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5ld1BlcnNvbiwgTmV3UGV0LCBTcGVjaWVzIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbkFuZFBldChwZXJzb246IE5ld1BlcnNvbiwgcGV0OiBPbWl0PE5ld1BldCwgJ293bmVyX2lkJz4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAud2l0aCgnbmV3X3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgICAudmFsdWVzKHBlcnNvbilcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgaWQ6IG51bWJlciB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLndpdGgoJ25ld19wZXQnLCAocWIpID0+IHFiXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgICAgLnZhbHVlcygoZWIpID0+ICh7XG4gICAgICogICAgICAgICBvd25lcl9pZDogZWIuc2VsZWN0RnJvbSgnbmV3X3BlcnNvbicpLnNlbGVjdCgnaWQnKSxcbiAgICAgKiAgICAgICAgIC4uLnBldFxuICAgICAqICAgICAgIH0pKVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoWyduYW1lIGFzIHBldF9uYW1lJywgJ3NwZWNpZXMnXSlcbiAgICAgKiAgICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAuc2VsZWN0RnJvbShbJ25ld19wZXJzb24nLCAnbmV3X3BldCddKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBJbnNlcnRRdWVyeUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygcm93cy5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdH0gYW5kIHtAbGluayBleGVjdXRlVGFrZUZpcnN0T3JUaHJvd30gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBjb21waWxlZFF1ZXJ5LnF1ZXJ5O1xuICAgICAgICBpZiAoKHF1ZXJ5LnJldHVybmluZyAmJiBhZGFwdGVyLnN1cHBvcnRzUmV0dXJuaW5nKSB8fFxuICAgICAgICAgICAgKHF1ZXJ5Lm91dHB1dCAmJiBhZGFwdGVyLnN1cHBvcnRzT3V0cHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgSW5zZXJ0UmVzdWx0KHJlc3VsdC5pbnNlcnRJZCwgcmVzdWx0Lm51bUFmZmVjdGVkUm93cyA/PyBCaWdJbnQoMCkpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlbGV0ZS1yZXN1bHQuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVsZXRlUmVzdWx0IHtcbiAgICBudW1EZWxldGVkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1EZWxldGVkUm93cykge1xuICAgICAgICB0aGlzLm51bURlbGV0ZWRSb3dzID0gbnVtRGVsZXRlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9saW1pdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IExpbWl0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTGltaXROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaW1pdE5vZGUnLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVsZXRlLXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwYXJzZUpvaW4sIH0gZnJvbSAnLi4vcGFyc2VyL2pvaW4tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIE5vUmVzdWx0RXJyb3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgRGVsZXRlUmVzdWx0IH0gZnJvbSAnLi9kZWxldGUtcmVzdWx0LmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlbGV0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IExpbWl0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBEZWxldGVRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhIGBkZWxldGUgZnJvbWAgcXVlcnkgaW50byBhIGBkZWxldGUgdG9wIGZyb21gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBEZWxldGUgdGhlIGZpcnN0IDUgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1KVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSB0b3AoNSkgZnJvbSBcInBlcnNvblwiIHdoZXJlIFwiYWdlXCIgPiBAMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogRGVsZXRlIHRoZSBmaXJzdCA1MCUgb2Ygcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSB0b3AoNTApIHBlcmNlbnQgZnJvbSBcInBlcnNvblwiIHdoZXJlIFwiYWdlXCIgPiBAMVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKHRhYmxlcykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogRGVsZXRlUXVlcnlOb2RlLmNsb25lV2l0aFVzaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGVzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgI2pvaW4oam9pblR5cGUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmdBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCBgcmV0dXJuaW5nYCBjbGF1c2VzIGZyb20gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC53aGVyZSgnbmFtZScsICc9JywgJ01heCcpXG4gICAgICogICAuY2xlYXJSZXR1cm5pbmcoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBcInBldFwiIHdoZXJlIFwibmFtZVwiID0gXCJNYXhcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIHRoZSBgbGltaXRgIGNsYXVzZSBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAud2hlcmUoJ25hbWUnLCAnPScsICdNYXgnKVxuICAgICAqICAgLmxpbWl0KDUpXG4gICAgICogICAuY2xlYXJMaW1pdCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIFwicGV0XCIgd2hlcmUgXCJuYW1lXCIgPSBcIk1heFwiIHJldHVybmluZyAqXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2xlYXJMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRMaW1pdCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbGltaXQgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEEgbGltaXQgY2xhdXNlIGluIGEgZGVsZXRlIHF1ZXJ5IGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHNcbiAgICAgKiBsaWtlIE15U1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBEZWxldGUgNSBvbGRlc3QgaXRlbXMgaW4gYSB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgLm9yZGVyQnkoJ2NyZWF0ZWRfYXQnKVxuICAgICAqICAgLmxpbWl0KDUpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gYHBldGAgb3JkZXIgYnkgYGNyZWF0ZWRfYXRgIGxpbWl0ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBsaW1pdChsaW1pdCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogRGVsZXRlUXVlcnlOb2RlLmNsb25lV2l0aExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgTGltaXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihsaW1pdCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSm9obicpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbGAtLSBUaGlzIGlzIGEgY29tbWVudGApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gYHBlcnNvbmBcbiAgICAgKiB3aGVyZSBgZmlyc3RfbmFtZWAgPSBcIkpvaG5cIiAtLSBUaGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC4kY2FsbChsb2cpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBgZnVuYyh0aGlzKWAgaWYgYGNvbmRpdGlvbmAgaXMgdHJ1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGVzcGVjaWFsbHkgaGFuZHkgd2l0aCBvcHRpb25hbCBzZWxlY3RzLiBBbnkgYHJldHVybmluZ2Agb3IgYHJldHVybmluZ0FsbGBcbiAgICAgKiBtZXRob2QgY2FsbHMgYWRkIGNvbHVtbnMgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZSBvdXRwdXQgdHlwZSB3aGVuIGNhbGxlZCBpbnNpZGVcbiAgICAgKiB0aGUgYGZ1bmNgIGNhbGxiYWNrLiBUaGlzIGlzIGJlY2F1c2Ugd2UgY2FuJ3Qga25vdyBpZiB0aG9zZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHlcbiAgICAgKiBtYWRlIGJlZm9yZSBydW5uaW5nIHRoZSBjb2RlLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIGNhbGwgYW55IG90aGVyIG1ldGhvZHMgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkZWxldGVQZXJzb24oaWQ6IG51bWJlciwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgZGVsZXRlUGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBEZWxldGVRdWVyeUJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIChwYXJ0cyBvZikgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEt5c2VseSB0cmllcyB0byBiZSBhcyB0eXBlLXNhZmUgYXMgcG9zc2libGUsIGJ1dCBpbiBzb21lIGNhc2VzIHdlIGhhdmUgdG8gbWFrZVxuICAgICAqIGNvbXByb21pc2VzIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5IGFuZCBjb21waWxhdGlvbiBwZXJmb3JtYW5jZS4gQXQgcHJlc2VudCxcbiAgICAgKiBLeXNlbHkgZG9lc24ndCBuYXJyb3cgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeSB3aGVuIHVzaW5nIHtAbGluayB3aGVyZX0gYW5kIHtAbGluayByZXR1cm5pbmd9IG9yIHtAbGluayByZXR1cm5pbmdBbGx9LlxuICAgICAqXG4gICAgICogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyB2ZXJ5IHVzZWZ1bCBmb3IgdGhlc2Ugc2l0dWF0aW9ucywgYXMgaXQgcmVtb3ZlcyB1bm5jZXNzYXJ5XG4gICAgICogcnVudGltZSBhc3NlcnRpb24vZ3VhcmQgY29kZS4gSXRzIGlucHV0IHR5cGUgaXMgbGltaXRlZCB0byB0aGUgb3V0cHV0IHR5cGVcbiAgICAgKiBvZiB0aGUgcXVlcnksIHNvIHlvdSBjYW4ndCBhZGQgYSBjb2x1bW4gdGhhdCBkb2Vzbid0IGV4aXN0LCBvciBjaGFuZ2UgYSBjb2x1bW4nc1xuICAgICAqIHR5cGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCBpbiBpdHMgdW5pb24gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVHVybiB0aGlzIGNvZGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCAzKVxuICAgICAqICAgLndoZXJlKCdudWxsYWJsZV9jb2x1bW4nLCAnaXMgbm90JywgbnVsbClcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGlmIChpc1dpdGhOb051bGxWYWx1ZShwZXJzb24pKSB7XG4gICAgICogICBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uOiBQZXJzb24pOiBwZXJzb24gaXMgUGVyc29uICYgeyBudWxsYWJsZV9jb2x1bW46IHN0cmluZyB9IHtcbiAgICAgKiAgIHJldHVybiBwZXJzb24ubnVsbGFibGVfY29sdW1uICE9IG51bGxcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnRvIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTm90TnVsbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCAzKVxuICAgICAqICAgLndoZXJlKCdudWxsYWJsZV9jb2x1bW4nLCAnaXMgbm90JywgbnVsbClcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLiRuYXJyb3dUeXBlPHsgbnVsbGFibGVfY29sdW1uOiBOb3ROdWxsIH0+KClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJG5hcnJvd1R5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0cyB0aGF0IHF1ZXJ5J3Mgb3V0cHV0IHJvdyB0eXBlIGVxdWFscyB0aGUgZ2l2ZW4gdHlwZSBgVGAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSBleGNlc3NpdmVseSBjb21wbGV4IHR5cGVzIHRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweVxuICAgICAqIGFuZCBtdWNoIGZhc3Rlci5cbiAgICAgKlxuICAgICAqIEt5c2VseSB1c2VzIGNvbXBsZXggdHlwZSBtYWdpYyB0byBhY2hpZXZlIGl0cyB0eXBlIHNhZmV0eS4gVGhpcyBjb21wbGV4aXR5IGlzIHNvbWV0aW1lcyB0b28gbXVjaFxuICAgICAqIGZvciBUeXBlU2NyaXB0IGFuZCB5b3UgZ2V0IGVycm9ycyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlcnJvciBUUzI1ODk6IFR5cGUgaW5zdGFudGlhdGlvbiBpcyBleGNlc3NpdmVseSBkZWVwIGFuZCBwb3NzaWJseSBpbmZpbml0ZS5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIHRoZXNlIGNhc2UgeW91IGNhbiBvZnRlbiB1c2UgdGhpcyBtZXRob2QgdG8gaGVscCBUeXBlU2NyaXB0IGEgbGl0dGxlIGJpdC4gV2hlbiB5b3UgdXNlIHRoaXNcbiAgICAgKiBtZXRob2QgdG8gYXNzZXJ0IHRoZSBvdXRwdXQgdHlwZSBvZiBhIHF1ZXJ5LCBLeXNlbHkgY2FuIGRyb3AgdGhlIGNvbXBsZXggb3V0cHV0IHR5cGUgdGhhdFxuICAgICAqIGNvbnNpc3RzIG9mIG11bHRpcGxlIG5lc3RlZCBoZWxwZXIgdHlwZXMgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc2ltcGxlIGFzc2VydGVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBkb2Vzbid0IHJlZHVjZSB0eXBlIHNhZmV0eSBhdCBhbGwuIFlvdSBoYXZlIHRvIHBhc3MgaW4gYSB0eXBlIHRoYXQgaXNcbiAgICAgKiBzdHJ1Y3R1cmFsbHkgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFNwZWNpZXMgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGVyc29uQW5kUGV0cyhwZXJzb25JZDogbnVtYmVyKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLndpdGgoJ2RlbGV0ZWRfcGVyc29uJywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgICAgLndoZXJlKCdpZCcsICc9JywgcGVyc29uSWQpXG4gICAgICogICAgICAgIC5yZXR1cm5pbmcoJ2ZpcnN0X25hbWUnKVxuICAgICAqICAgICAgICAuJGFzc2VydFR5cGU8eyBmaXJzdF9uYW1lOiBzdHJpbmcgfT4oKVxuICAgICAqICAgICApXG4gICAgICogICAgIC53aXRoKCdkZWxldGVkX3BldHMnLCAocWIpID0+IHFiXG4gICAgICogICAgICAgLmRlbGV0ZUZyb20oJ3BldCcpXG4gICAgICogICAgICAgLndoZXJlKCdvd25lcl9pZCcsICc9JywgcGVyc29uSWQpXG4gICAgICogICAgICAgLnJldHVybmluZyhbJ25hbWUgYXMgcGV0X25hbWUnLCAnc3BlY2llcyddKVxuICAgICAqICAgICAgIC4kYXNzZXJ0VHlwZTx7IHBldF9uYW1lOiBzdHJpbmcsIHNwZWNpZXM6IFNwZWNpZXMgfT4oKVxuICAgICAqICAgICApXG4gICAgICogICAgIC5zZWxlY3RGcm9tKFsnZGVsZXRlZF9wZXJzb24nLCAnZGVsZXRlZF9wZXRzJ10pXG4gICAgICogICAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRhc3NlcnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgRGVsZXRlUXVlcnlCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25ldyBEZWxldGVSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyA/PyBCaWdJbnQoMCkpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB0aHJvd3MgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9SZXN1bHRFcnJvcn0gaXMgdGhyb3duLCBidXQgeW91IGNhblxuICAgICAqIHByb3ZpZGUgYSBjdXN0b20gZXJyb3IgY2xhc3MsIG9yIGNhbGxiYWNrIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRocm93IGEgZGlmZmVyZW50XG4gICAgICogZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coZXJyb3JDb25zdHJ1Y3RvciA9IE5vUmVzdWx0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGFrZUZpcnN0KCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvcihlcnJvckNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgID8gbmV3IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSlcbiAgICAgICAgICAgICAgICA6IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNodW5rU2l6ZSA9IDEwMCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgICB5aWVsZCogaXRlbS5yb3dzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGV4cGxhaW4oZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtcmVzdWx0LmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIFVwZGF0ZVJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIHRoZSB1cGRhdGUgcXVlcnkgdXBkYXRlZCAoZXZlbiBpZiBub3QgY2hhbmdlZCkuXG4gICAgICovXG4gICAgbnVtVXBkYXRlZFJvd3M7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByb3dzIHRoZSB1cGRhdGUgcXVlcnkgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgKipvcHRpb25hbCoqIGFuZCBvbmx5IHN1cHBvcnRlZCBpbiBkaWFsZWN0cyBzdWNoIGFzIE15U1FMLlxuICAgICAqIFlvdSB3b3VsZCBwcm9iYWJseSB1c2Uge0BsaW5rIG51bVVwZGF0ZWRSb3dzfSBpbiBtb3N0IGNhc2VzLlxuICAgICAqL1xuICAgIG51bUNoYW5nZWRSb3dzO1xuICAgIGNvbnN0cnVjdG9yKG51bVVwZGF0ZWRSb3dzLCBudW1DaGFuZ2VkUm93cykge1xuICAgICAgICB0aGlzLm51bVVwZGF0ZWRSb3dzID0gbnVtVXBkYXRlZFJvd3M7XG4gICAgICAgIHRoaXMubnVtQ2hhbmdlZFJvd3MgPSBudW1DaGFuZ2VkUm93cztcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCBwYXJzZVNlbGVjdEFsbCwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVXBkYXRlLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBVcGRhdGVSZXN1bHQgfSBmcm9tICcuL3VwZGF0ZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIE5vUmVzdWx0RXJyb3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBMaW1pdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9saW1pdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIFVwZGF0ZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGB1cGRhdGVgIHF1ZXJ5IGludG8gYSBgdXBkYXRlIHRvcGAgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgdG9wYCBjbGF1c2UgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE1TIFNRTCBTZXJ2ZXIuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB0aGUgZmlyc3Qgcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoMSlcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnRm9vJyB9KVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSB0b3AoMSkgXCJwZXJzb25cIiBzZXQgXCJmaXJzdF9uYW1lXCIgPSBAMSB3aGVyZSBcImFnZVwiID4gQDJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFVwZGF0ZSB0aGUgNTAlIGZpcnN0IHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdGb28nIH0pXG4gICAgICogICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIHRvcCg1MCkgcGVyY2VudCBcInBlcnNvblwiIHNldCBcImZpcnN0X25hbWVcIiA9IEAxIHdoZXJlIFwiYWdlXCIgPiBAMlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZyb20oZnJvbSkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNsb25lV2l0aEZyb21JdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KGZyb20pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlubmVySm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignTGVmdEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgcmlnaHRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ1JpZ2h0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBmdWxsSm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdGdWxsSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEpvaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oam9pblR5cGUsIGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbWl0IGNsYXVzZSB0byB0aGUgdXBkYXRlIHF1ZXJ5IGZvciBzdXBwb3J0ZWQgZGF0YWJhc2VzLCBzdWNoIGFzIE15U1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBVcGRhdGUgdGhlIGZpcnN0IDIgcm93cyBpbiB0aGUgJ3BlcnNvbicgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0ZvbycgfSlcbiAgICAgKiAgIC5saW1pdCgyKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSBgcGVyc29uYCBzZXQgYGZpcnN0X25hbWVgID0gPyBsaW1pdCA/XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhMaW1pdCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIExpbWl0Tm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24obGltaXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNsb25lV2l0aFVwZGF0ZXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVVwZGF0ZSguLi5hcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmdBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGFnZTogMzkgfSlcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0pvaG4nKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSBUaGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSBgcGVyc29uYFxuICAgICAqIHNldCBgYWdlYCA9IDM5XG4gICAgICogd2hlcmUgYGZpcnN0X25hbWVgID0gXCJKb2huXCIgLS0gVGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgYHJldHVybmluZ2AgY2xhdXNlcyBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLnNldCh7IGFnZTogMzkgfSlcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0pvaG4nKVxuICAgICAqICAgLmNsZWFyUmV0dXJuaW5nKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogdXBkYXRlIFwicGVyc29uXCIgc2V0IFwiYWdlXCIgPSAzOSB3aGVyZSBcImZpcnN0X25hbWVcIiA9IFwiSm9oblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2xlYXJSZXR1cm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0UmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gY29uZGl0aW9uYWxseSBjYWxsIGEgbWV0aG9kIG9uIGB0aGlzYCwgc2VlXG4gICAgICogdGhlIHtAbGluayAkaWZ9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIG5leHQgZXhhbXBsZSB1c2VzIGEgaGVscGVyIGZ1bmN0aW9uIGBsb2dgIHRvIGxvZyBhIHF1ZXJ5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IENvbXBpbGFibGUgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogY29uc3QgdmFsdWVzID0ge1xuICAgICAqICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqIH0gc2F0aXNmaWVzIFBlcnNvblVwZGF0ZVxuICAgICAqXG4gICAgICogZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHZhbHVlcylcbiAgICAgKiAgIC4kY2FsbChsb2cpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FsbCBgZnVuYyh0aGlzKWAgaWYgYGNvbmRpdGlvbmAgaXMgdHJ1ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGVzcGVjaWFsbHkgaGFuZHkgd2l0aCBvcHRpb25hbCBzZWxlY3RzLiBBbnkgYHJldHVybmluZ2Agb3IgYHJldHVybmluZ0FsbGBcbiAgICAgKiBtZXRob2QgY2FsbHMgYWRkIGNvbHVtbnMgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZSBvdXRwdXQgdHlwZSB3aGVuIGNhbGxlZCBpbnNpZGVcbiAgICAgKiB0aGUgYGZ1bmNgIGNhbGxiYWNrLiBUaGlzIGlzIGJlY2F1c2Ugd2UgY2FuJ3Qga25vdyBpZiB0aG9zZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHlcbiAgICAgKiBtYWRlIGJlZm9yZSBydW5uaW5nIHRoZSBjb2RlLlxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIGNhbGwgYW55IG90aGVyIG1ldGhvZHMgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvblVwZGF0ZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiB1cGRhdGVQZXJzb24oaWQ6IG51bWJlciwgdXBkYXRlczogUGVyc29uVXBkYXRlLCByZXR1cm5MYXN0TmFtZTogYm9vbGVhbikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgICAgLnNldCh1cGRhdGVzKVxuICAgICAqICAgICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgICAgLnJldHVybmluZyhbJ2lkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgICAgLiRpZihyZXR1cm5MYXN0TmFtZSwgKHFiKSA9PiBxYi5yZXR1cm5pbmcoJ2xhc3RfbmFtZScpKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFueSBzZWxlY3Rpb25zIGFkZGVkIGluc2lkZSB0aGUgYGlmYCBjYWxsYmFjayB3aWxsIGJlIGFkZGVkIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGVcbiAgICAgKiBvdXRwdXQgdHlwZSBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIHRoZSBzZWxlY3Rpb25zIHdlcmUgYWN0dWFsbHkgbWFkZSBiZWZvcmUgcnVubmluZ1xuICAgICAqIHRoZSBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGB1cGRhdGVQZXJzb25gIGZ1bmN0aW9uIGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBQcm9taXNlPHtcbiAgICAgKiAgIGlkOiBudW1iZXJcbiAgICAgKiAgIGZpcnN0X25hbWU6IHN0cmluZ1xuICAgICAqICAgbGFzdF9uYW1lPzogc3RyaW5nXG4gICAgICogfT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYFVwZGF0ZVF1ZXJ5QnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgKHBhcnRzIG9mKSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogS3lzZWx5IHRyaWVzIHRvIGJlIGFzIHR5cGUtc2FmZSBhcyBwb3NzaWJsZSwgYnV0IGluIHNvbWUgY2FzZXMgd2UgaGF2ZSB0byBtYWtlXG4gICAgICogY29tcHJvbWlzZXMgZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkgYW5kIGNvbXBpbGF0aW9uIHBlcmZvcm1hbmNlLiBBdCBwcmVzZW50LFxuICAgICAqIEt5c2VseSBkb2Vzbid0IG5hcnJvdyB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5IGJhc2VkIG9uIHtAbGluayBzZXR9IGlucHV0XG4gICAgICogd2hlbiB1c2luZyB7QGxpbmsgd2hlcmV9IGFuZC9vciB7QGxpbmsgcmV0dXJuaW5nfSBvciB7QGxpbmsgcmV0dXJuaW5nQWxsfS5cbiAgICAgKlxuICAgICAqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdmVyeSB1c2VmdWwgZm9yIHRoZXNlIHNpdHVhdGlvbnMsIGFzIGl0IHJlbW92ZXMgdW5uY2Vzc2FyeVxuICAgICAqIHJ1bnRpbWUgYXNzZXJ0aW9uL2d1YXJkIGNvZGUuIEl0cyBpbnB1dCB0eXBlIGlzIGxpbWl0ZWQgdG8gdGhlIG91dHB1dCB0eXBlXG4gICAgICogb2YgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuJ3QgYWRkIGEgY29sdW1uIHRoYXQgZG9lc24ndCBleGlzdCwgb3IgY2hhbmdlIGEgY29sdW1uJ3NcbiAgICAgKiB0eXBlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gaXRzIHVuaW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFR1cm4gdGhpcyBjb2RlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBpZCA9IDFcbiAgICAgKiBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGRlbGV0ZWRfYXQ6IG5vdyB9KVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAud2hlcmUoJ251bGxhYmxlX2NvbHVtbicsICdpcyBub3QnLCBudWxsKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogaWYgKGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbikpIHtcbiAgICAgKiAgIGZ1bmN0aW9uVGhhdEV4cGVjdHNQZXJzb25XaXRoTm9uTnVsbFZhbHVlKHBlcnNvbilcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBpc1dpdGhOb051bGxWYWx1ZShwZXJzb246IFBlcnNvbik6IHBlcnNvbiBpcyBQZXJzb24gJiB7IG51bGxhYmxlX2NvbHVtbjogc3RyaW5nIH0ge1xuICAgICAqICAgcmV0dXJuIHBlcnNvbi5udWxsYWJsZV9jb2x1bW4gIT0gbnVsbFxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEludG8gdGhpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOb3ROdWxsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBkZWxldGVkX2F0OiBub3cgfSlcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgLndoZXJlKCdudWxsYWJsZV9jb2x1bW4nLCAnaXMgbm90JywgbnVsbClcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLiRuYXJyb3dUeXBlPHsgZGVsZXRlZF9hdDogRGF0ZTsgbnVsbGFibGVfY29sdW1uOiBOb3ROdWxsIH0+KClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJG5hcnJvd1R5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0cyB0aGF0IHF1ZXJ5J3Mgb3V0cHV0IHJvdyB0eXBlIGVxdWFscyB0aGUgZ2l2ZW4gdHlwZSBgVGAuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSBleGNlc3NpdmVseSBjb21wbGV4IHR5cGVzIHRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweVxuICAgICAqIGFuZCBtdWNoIGZhc3Rlci5cbiAgICAgKlxuICAgICAqIEt5c2VseSB1c2VzIGNvbXBsZXggdHlwZSBtYWdpYyB0byBhY2hpZXZlIGl0cyB0eXBlIHNhZmV0eS4gVGhpcyBjb21wbGV4aXR5IGlzIHNvbWV0aW1lcyB0b28gbXVjaFxuICAgICAqIGZvciBUeXBlU2NyaXB0IGFuZCB5b3UgZ2V0IGVycm9ycyBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBlcnJvciBUUzI1ODk6IFR5cGUgaW5zdGFudGlhdGlvbiBpcyBleGNlc3NpdmVseSBkZWVwIGFuZCBwb3NzaWJseSBpbmZpbml0ZS5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIHRoZXNlIGNhc2UgeW91IGNhbiBvZnRlbiB1c2UgdGhpcyBtZXRob2QgdG8gaGVscCBUeXBlU2NyaXB0IGEgbGl0dGxlIGJpdC4gV2hlbiB5b3UgdXNlIHRoaXNcbiAgICAgKiBtZXRob2QgdG8gYXNzZXJ0IHRoZSBvdXRwdXQgdHlwZSBvZiBhIHF1ZXJ5LCBLeXNlbHkgY2FuIGRyb3AgdGhlIGNvbXBsZXggb3V0cHV0IHR5cGUgdGhhdFxuICAgICAqIGNvbnNpc3RzIG9mIG11bHRpcGxlIG5lc3RlZCBoZWxwZXIgdHlwZXMgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgc2ltcGxlIGFzc2VydGVkIHR5cGUuXG4gICAgICpcbiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBkb2Vzbid0IHJlZHVjZSB0eXBlIHNhZmV0eSBhdCBhbGwuIFlvdSBoYXZlIHRvIHBhc3MgaW4gYSB0eXBlIHRoYXQgaXNcbiAgICAgKiBzdHJ1Y3R1cmFsbHkgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvblVwZGF0ZSwgUGV0VXBkYXRlLCBTcGVjaWVzIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IHtcbiAgICAgKiAgIGlkOiAxLFxuICAgICAqICAgZ2VuZGVyOiAnb3RoZXInLFxuICAgICAqIH0gc2F0aXNmaWVzIFBlcnNvblVwZGF0ZVxuICAgICAqXG4gICAgICogY29uc3QgcGV0ID0ge1xuICAgICAqICAgbmFtZTogJ0ZsdWZmeScsXG4gICAgICogfSBzYXRpc2ZpZXMgUGV0VXBkYXRlXG4gICAgICpcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoJ3VwZGF0ZWRfcGVyc29uJywgKHFiKSA9PiBxYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAgIC5zZXQocGVyc29uKVxuICAgICAqICAgICAud2hlcmUoJ2lkJywgJz0nLCBwZXJzb24uaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2ZpcnN0X25hbWUnKVxuICAgICAqICAgICAuJGFzc2VydFR5cGU8eyBmaXJzdF9uYW1lOiBzdHJpbmcgfT4oKVxuICAgICAqICAgKVxuICAgICAqICAgLndpdGgoJ3VwZGF0ZWRfcGV0JywgKHFiKSA9PiBxYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAgIC5zZXQocGV0KVxuICAgICAqICAgICAud2hlcmUoJ293bmVyX2lkJywgJz0nLCBwZXJzb24uaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWyduYW1lIGFzIHBldF9uYW1lJywgJ3NwZWNpZXMnXSlcbiAgICAgKiAgICAgLiRhc3NlcnRUeXBlPHsgcGV0X25hbWU6IHN0cmluZywgc3BlY2llczogU3BlY2llcyB9PigpXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0RnJvbShbJ3VwZGF0ZWRfcGVyc29uJywgJ3VwZGF0ZWRfcGV0J10pXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBVcGRhdGVRdWVyeUJ1aWxkZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygcm93cy5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdH0gYW5kIHtAbGluayBleGVjdXRlVGFrZUZpcnN0T3JUaHJvd30gbWV0aG9kcy5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgeyBhZGFwdGVyIH0gPSB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBjb21waWxlZFF1ZXJ5LnF1ZXJ5O1xuICAgICAgICBpZiAoKHF1ZXJ5LnJldHVybmluZyAmJiBhZGFwdGVyLnN1cHBvcnRzUmV0dXJuaW5nKSB8fFxuICAgICAgICAgICAgKHF1ZXJ5Lm91dHB1dCAmJiBhZGFwdGVyLnN1cHBvcnRzT3V0cHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBuZXcgVXBkYXRlUmVzdWx0KHJlc3VsdC5udW1BZmZlY3RlZFJvd3MgPz8gQmlnSW50KDApLCByZXN1bHQubnVtQ2hhbmdlZFJvd3MpLFxuICAgICAgICBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4vdGFibGUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZU5hbWUsIGNvbHVtbk5hbWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlTmFtZSksXG4gICAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5OYW1lc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKGNvbHVtbk5hbWVzLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2N0ZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIENURUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb21tb24gdGFibGUgZXhwcmVzc2lvbiBtYXRlcmlhbGl6ZWQuXG4gICAgICovXG4gICAgbWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IENURUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29tbW9uIHRhYmxlIGV4cHJlc3Npb24gbm90IG1hdGVyaWFsaXplZC5cbiAgICAgKi9cbiAgICBub3RNYXRlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ1RFQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5ub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2l0aC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3BhcnNlLXV0aWxzLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDVEVCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9jdGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29tbW9uLXRhYmxlLWV4cHJlc3Npb24tbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24obmFtZU9yQnVpbGRlckNhbGxiYWNrLCBleHByZXNzaW9uKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbk5vZGUgPSBleHByZXNzaW9uKGNyZWF0ZVF1ZXJ5Q3JlYXRvcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICBpZiAoaXNGdW5jdGlvbihuYW1lT3JCdWlsZGVyQ2FsbGJhY2spKSB7XG4gICAgICAgIHJldHVybiBuYW1lT3JCdWlsZGVyQ2FsbGJhY2soY3RlQnVpbGRlckZhY3RvcnkoZXhwcmVzc2lvbk5vZGUpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUuY3JlYXRlKHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShuYW1lT3JCdWlsZGVyQ2FsbGJhY2spLCBleHByZXNzaW9uTm9kZSk7XG59XG5mdW5jdGlvbiBjdGVCdWlsZGVyRmFjdG9yeShleHByZXNzaW9uTm9kZSkge1xuICAgIHJldHVybiAobmFtZSkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IENURUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jcmVhdGUocGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5hbWUpLCBleHByZXNzaW9uTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobmFtZSkge1xuICAgIGlmIChuYW1lLmluY2x1ZGVzKCcoJykpIHtcbiAgICAgICAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KC9bXFwoXFwpXS8pO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHBhcnRzWzBdO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gcGFydHNbMV0uc3BsaXQoJywnKS5tYXAoKGl0KSA9PiBpdC50cmltKCkpO1xuICAgICAgICByZXR1cm4gQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUuY3JlYXRlKHRhYmxlLCBjb2x1bW5zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZS5jcmVhdGUobmFtZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV2l0aE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1dpdGhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShleHByZXNzaW9uLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnV2l0aE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbnM6IGZyZWV6ZShbZXhwcmVzc2lvbl0pLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEV4cHJlc3Npb24od2l0aE5vZGUsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi53aXRoTm9kZSxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiBmcmVlemUoWy4uLndpdGhOb2RlLmV4cHJlc3Npb25zLCBleHByZXNzaW9uXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmFuZG9tLXN0cmluZy5kLnRzXCIgLz5cbmNvbnN0IENIQVJTID0gW1xuICAgICdBJyxcbiAgICAnQicsXG4gICAgJ0MnLFxuICAgICdEJyxcbiAgICAnRScsXG4gICAgJ0YnLFxuICAgICdHJyxcbiAgICAnSCcsXG4gICAgJ0knLFxuICAgICdKJyxcbiAgICAnSycsXG4gICAgJ0wnLFxuICAgICdNJyxcbiAgICAnTicsXG4gICAgJ08nLFxuICAgICdQJyxcbiAgICAnUScsXG4gICAgJ1InLFxuICAgICdTJyxcbiAgICAnVCcsXG4gICAgJ1UnLFxuICAgICdWJyxcbiAgICAnVycsXG4gICAgJ1gnLFxuICAgICdZJyxcbiAgICAnWicsXG4gICAgJ2EnLFxuICAgICdiJyxcbiAgICAnYycsXG4gICAgJ2QnLFxuICAgICdlJyxcbiAgICAnZicsXG4gICAgJ2cnLFxuICAgICdoJyxcbiAgICAnaScsXG4gICAgJ2onLFxuICAgICdrJyxcbiAgICAnbCcsXG4gICAgJ20nLFxuICAgICduJyxcbiAgICAnbycsXG4gICAgJ3AnLFxuICAgICdxJyxcbiAgICAncicsXG4gICAgJ3MnLFxuICAgICd0JyxcbiAgICAndScsXG4gICAgJ3YnLFxuICAgICd3JyxcbiAgICAneCcsXG4gICAgJ3knLFxuICAgICd6JyxcbiAgICAnMCcsXG4gICAgJzEnLFxuICAgICcyJyxcbiAgICAnMycsXG4gICAgJzQnLFxuICAgICc1JyxcbiAgICAnNicsXG4gICAgJzcnLFxuICAgICc4JyxcbiAgICAnOScsXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVN0cmluZyhsZW5ndGgpIHtcbiAgICBsZXQgY2hhcnMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNoYXJzICs9IHJhbmRvbUNoYXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXJzO1xufVxuZnVuY3Rpb24gcmFuZG9tQ2hhcigpIHtcbiAgICByZXR1cm4gQ0hBUlNbfn4oTWF0aC5yYW5kb20oKSAqIENIQVJTLmxlbmd0aCldO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9xdWVyeS1pZC5kLnRzXCIgLz5cbmltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4vcmFuZG9tLXN0cmluZy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUXVlcnlJZCgpIHtcbiAgICByZXR1cm4gbmV3IExhenlRdWVyeUlkKCk7XG59XG5jbGFzcyBMYXp5UXVlcnlJZCB7XG4gICAgI3F1ZXJ5SWQ7XG4gICAgZ2V0IHF1ZXJ5SWQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNxdWVyeUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuI3F1ZXJ5SWQgPSByYW5kb21TdHJpbmcoOCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXJ5SWQ7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHJlcXVpcmVBbGxQcm9wcyB9IGZyb20gJy4uL3V0aWwvcmVxdWlyZS1hbGwtcHJvcHMuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFuIG9wZXJhdGlvbiBub2RlIHRyZWUgaW50byBhbm90aGVyIG9uZS5cbiAqXG4gKiBLeXNlbHkgcXVlcmllcyBhcmUgZXhwcmVzc2VkIGludGVybmFsbHkgYXMgYSB0cmVlIG9mIG9iamVjdHMgKG9wZXJhdGlvbiBub2RlcykuXG4gKiBgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyYCB0YWtlcyBzdWNoIGEgdHJlZSBhcyBpdHMgaW5wdXQgYW5kIHJldHVybnMgYVxuICogdHJhbnNmb3JtZWQgZGVlcCBjb3B5IG9mIGl0LiBCeSBkZWZhdWx0IHRoZSBgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyYFxuICogZG9lcyBub3RoaW5nLiBZb3UgbmVlZCB0byBvdmVycmlkZSBvbmUgb3IgbW9yZSBtZXRob2RzIHRvIG1ha2UgaXQgZG9cbiAqIHNvbWV0aGluZy5cbiAqXG4gKiBUaGVyZSdzIGEgbWV0aG9kIGZvciBlYWNoIG5vZGUgdHlwZS4gRm9yIGV4YW1wbGUgaWYgeW91J2QgbGlrZSB0byBjb252ZXJ0XG4gKiBlYWNoIGlkZW50aWZpZXIgKHRhYmxlIG5hbWUsIGNvbHVtbiBuYW1lLCBhbGlhcyBldGMuKSBmcm9tIGNhbWVsQ2FzZSB0b1xuICogc25ha2VfY2FzZSwgeW91J2QgZG8gc29tZXRoaW5nIGxpa2UgdGhpczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdHlwZSBJZGVudGlmaWVyTm9kZSwgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHNuYWtlQ2FzZSBmcm9tICdsb2Rhc2gvc25ha2VDYXNlJ1xuICpcbiAqIGNsYXNzIENhbWVsQ2FzZVRyYW5zZm9ybWVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAqICAgb3ZlcnJpZGUgdHJhbnNmb3JtSWRlbnRpZmllcihub2RlOiBJZGVudGlmaWVyTm9kZSk6IElkZW50aWZpZXJOb2RlIHtcbiAqICAgICBub2RlID0gc3VwZXIudHJhbnNmb3JtSWRlbnRpZmllcihub2RlKVxuICpcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgLi4ubm9kZSxcbiAqICAgICAgIG5hbWU6IHNuYWtlQ2FzZShub2RlLm5hbWUpLFxuICogICAgIH1cbiAqICAgfVxuICogfVxuICpcbiAqIGNvbnN0IHRyYW5zZm9ybWVyID0gbmV3IENhbWVsQ2FzZVRyYW5zZm9ybWVyKClcbiAqXG4gKiBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ10pXG4gKlxuICogY29uc3QgdHJlZSA9IHRyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUocXVlcnkudG9PcGVyYXRpb25Ob2RlKCkpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gICAgbm9kZVN0YWNrID0gW107XG4gICAgI3RyYW5zZm9ybWVycyA9IGZyZWV6ZSh7XG4gICAgICAgIEFsaWFzTm9kZTogdGhpcy50cmFuc2Zvcm1BbGlhcy5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBJZGVudGlmaWVyTm9kZTogdGhpcy50cmFuc2Zvcm1JZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlOiB0aGlzLnRyYW5zZm9ybVNjaGVtYWJsZUlkZW50aWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgUmF3Tm9kZTogdGhpcy50cmFuc2Zvcm1SYXcuYmluZCh0aGlzKSxcbiAgICAgICAgUmVmZXJlbmNlTm9kZTogdGhpcy50cmFuc2Zvcm1SZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0UXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdFF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFRhYmxlTm9kZTogdGhpcy50cmFuc2Zvcm1UYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBGcm9tTm9kZTogdGhpcy50cmFuc2Zvcm1Gcm9tLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdEFsbE5vZGU6IHRoaXMudHJhbnNmb3JtU2VsZWN0QWxsLmJpbmQodGhpcyksXG4gICAgICAgIEFuZE5vZGU6IHRoaXMudHJhbnNmb3JtQW5kLmJpbmQodGhpcyksXG4gICAgICAgIE9yTm9kZTogdGhpcy50cmFuc2Zvcm1Pci5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZU5vZGU6IHRoaXMudHJhbnNmb3JtVmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVMaXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1WYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1QcmltaXRpdmVWYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUGFyZW5zTm9kZTogdGhpcy50cmFuc2Zvcm1QYXJlbnMuYmluZCh0aGlzKSxcbiAgICAgICAgSm9pbk5vZGU6IHRoaXMudHJhbnNmb3JtSm9pbi5iaW5kKHRoaXMpLFxuICAgICAgICBPcGVyYXRvck5vZGU6IHRoaXMudHJhbnNmb3JtT3BlcmF0b3IuYmluZCh0aGlzKSxcbiAgICAgICAgV2hlcmVOb2RlOiB0aGlzLnRyYW5zZm9ybVdoZXJlLmJpbmQodGhpcyksXG4gICAgICAgIEluc2VydFF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1JbnNlcnRRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBEZWxldGVRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtRGVsZXRlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgUmV0dXJuaW5nTm9kZTogdGhpcy50cmFuc2Zvcm1SZXR1cm5pbmcuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVGFibGVOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEFkZENvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtQWRkQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbkRlZmluaXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUNvbHVtbkRlZmluaXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFRhYmxlTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRGF0YVR5cGVOb2RlOiB0aGlzLnRyYW5zZm9ybURhdGFUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlOb2RlOiB0aGlzLnRyYW5zZm9ybU9yZGVyQnkuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeUl0ZW1Ob2RlOiB0aGlzLnRyYW5zZm9ybU9yZGVyQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlOb2RlOiB0aGlzLnRyYW5zZm9ybUdyb3VwQnkuYmluZCh0aGlzKSxcbiAgICAgICAgR3JvdXBCeUl0ZW1Ob2RlOiB0aGlzLnRyYW5zZm9ybUdyb3VwQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIFVwZGF0ZVF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1VcGRhdGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5VcGRhdGVOb2RlOiB0aGlzLnRyYW5zZm9ybUNvbHVtblVwZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgICBMaW1pdE5vZGU6IHRoaXMudHJhbnNmb3JtTGltaXQuYmluZCh0aGlzKSxcbiAgICAgICAgT2Zmc2V0Tm9kZTogdGhpcy50cmFuc2Zvcm1PZmZzZXQuYmluZCh0aGlzKSxcbiAgICAgICAgT25Db25mbGljdE5vZGU6IHRoaXMudHJhbnNmb3JtT25Db25mbGljdC5iaW5kKHRoaXMpLFxuICAgICAgICBPbkR1cGxpY2F0ZUtleU5vZGU6IHRoaXMudHJhbnNmb3JtT25EdXBsaWNhdGVLZXkuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlSW5kZXhOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZUluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BJbmRleE5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcEluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIExpc3ROb2RlOiB0aGlzLnRyYW5zZm9ybUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybVByaW1hcnlLZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFVuaXF1ZUNvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybVVuaXF1ZUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVmZXJlbmNlc05vZGU6IHRoaXMudHJhbnNmb3JtUmVmZXJlbmNlcy5iaW5kKHRoaXMpLFxuICAgICAgICBDaGVja0NvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybUNoZWNrQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBXaXRoTm9kZTogdGhpcy50cmFuc2Zvcm1XaXRoLmJpbmQodGhpcyksXG4gICAgICAgIENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGU6IHRoaXMudHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uLmJpbmQodGhpcyksXG4gICAgICAgIENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlOiB0aGlzLnRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgSGF2aW5nTm9kZTogdGhpcy50cmFuc2Zvcm1IYXZpbmcuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlU2NoZW1hTm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVTY2hlbWEuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFNjaGVtYU5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlclRhYmxlTm9kZTogdGhpcy50cmFuc2Zvcm1BbHRlclRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybURyb3BDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1SZW5hbWVDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUFsdGVyQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIE1vZGlmeUNvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtTW9kaWZ5Q29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIEFkZENvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybUFkZENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybVJlbmFtZUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgRm9yZWlnbktleUNvbnN0cmFpbnROb2RlOiB0aGlzLnRyYW5zZm9ybUZvcmVpZ25LZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVZpZXdOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZVZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlOiB0aGlzLnRyYW5zZm9ybVJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BWaWV3Tm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBHZW5lcmF0ZWROb2RlOiB0aGlzLnRyYW5zZm9ybUdlbmVyYXRlZC5iaW5kKHRoaXMpLFxuICAgICAgICBEZWZhdWx0VmFsdWVOb2RlOiB0aGlzLnRyYW5zZm9ybURlZmF1bHRWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBPbk5vZGU6IHRoaXMudHJhbnNmb3JtT24uYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVzTm9kZTogdGhpcy50cmFuc2Zvcm1WYWx1ZXMuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0TW9kaWZpZXJOb2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdE1vZGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVR5cGVOb2RlOiB0aGlzLnRyYW5zZm9ybUNyZWF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFR5cGVOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIEV4cGxhaW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUV4cGxhaW4uYmluZCh0aGlzKSxcbiAgICAgICAgRGVmYXVsdEluc2VydFZhbHVlTm9kZTogdGhpcy50cmFuc2Zvcm1EZWZhdWx0SW5zZXJ0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgQWdncmVnYXRlRnVuY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUFnZ3JlZ2F0ZUZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIE92ZXJOb2RlOiB0aGlzLnRyYW5zZm9ybU92ZXIuYmluZCh0aGlzKSxcbiAgICAgICAgUGFydGl0aW9uQnlOb2RlOiB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkJ5LmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5SXRlbU5vZGU6IHRoaXMudHJhbnNmb3JtUGFydGl0aW9uQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIFNldE9wZXJhdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtU2V0T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIEJpbmFyeU9wZXJhdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtQmluYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVuYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1VbmFyeU9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBVc2luZ05vZGU6IHRoaXMudHJhbnNmb3JtVXNpbmcuYmluZCh0aGlzKSxcbiAgICAgICAgRnVuY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENhc2VOb2RlOiB0aGlzLnRyYW5zZm9ybUNhc2UuYmluZCh0aGlzKSxcbiAgICAgICAgV2hlbk5vZGU6IHRoaXMudHJhbnNmb3JtV2hlbi5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUmVmZXJlbmNlTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OUGF0aC5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUGF0aExlZ05vZGU6IHRoaXMudHJhbnNmb3JtSlNPTlBhdGhMZWcuYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUpTT05PcGVyYXRvckNoYWluLmJpbmQodGhpcyksXG4gICAgICAgIFR1cGxlTm9kZTogdGhpcy50cmFuc2Zvcm1UdXBsZS5iaW5kKHRoaXMpLFxuICAgICAgICBNZXJnZVF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1NZXJnZVF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIE1hdGNoZWROb2RlOiB0aGlzLnRyYW5zZm9ybU1hdGNoZWQuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkSW5kZXhOb2RlOiB0aGlzLnRyYW5zZm9ybUFkZEluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIENhc3ROb2RlOiB0aGlzLnRyYW5zZm9ybUNhc3QuYmluZCh0aGlzKSxcbiAgICAgICAgRmV0Y2hOb2RlOiB0aGlzLnRyYW5zZm9ybUZldGNoLmJpbmQodGhpcyksXG4gICAgICAgIFRvcE5vZGU6IHRoaXMudHJhbnNmb3JtVG9wLmJpbmQodGhpcyksXG4gICAgICAgIE91dHB1dE5vZGU6IHRoaXMudHJhbnNmb3JtT3V0cHV0LmJpbmQodGhpcyksXG4gICAgICAgIE9yQWN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1PckFjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2xsYXRlTm9kZTogdGhpcy50cmFuc2Zvcm1Db2xsYXRlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdHJhbnNmb3JtTm9kZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub2RlU3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgY29uc3Qgb3V0ID0gdGhpcy50cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgdGhpcy5ub2RlU3RhY2sucG9wKCk7XG4gICAgICAgIHJldHVybiBmcmVlemUob3V0KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdHJhbnNmb3JtZXJzW25vZGUua2luZF0obm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU5vZGVMaXN0KGxpc3QsIHF1ZXJ5SWQpIHtcbiAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJlZXplKGxpc3QubWFwKChub2RlKSA9PiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZSwgcXVlcnlJZCkpKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2VsZWN0UXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RRdWVyeU5vZGUnLFxuICAgICAgICAgICAgZnJvbTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZnJvbSwgcXVlcnlJZCksXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2VsZWN0aW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBkaXN0aW5jdE9uOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZGlzdGluY3RPbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmpvaW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGdyb3VwQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmdyb3VwQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub2Zmc2V0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaGF2aW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5oYXZpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBzZXRPcGVyYXRpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2V0T3BlcmF0aW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBmZXRjaDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZmV0Y2gsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2VsZWN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNlbGVjdGlvbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFsaWFzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWxpYXNOb2RlJyxcbiAgICAgICAgICAgIG5vZGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5vZGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWxpYXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmFsaWFzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVRhYmxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Gcm9tKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRnJvbU5vZGUnLFxuICAgICAgICAgICAgZnJvbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5mcm9tcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZlcmVuY2Uobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VOb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BbmQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbmROb2RlJyxcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxlZnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmlnaHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJpZ2h0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9yKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3JOb2RlJyxcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxlZnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmlnaHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJpZ2h0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlTGlzdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTGlzdE5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVBhcmVucyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1BhcmVuc05vZGUnLFxuICAgICAgICAgICAgbm9kZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubm9kZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Kb2luKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSm9pbk5vZGUnLFxuICAgICAgICAgICAgam9pblR5cGU6IG5vZGUuam9pblR5cGUsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJhdyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1Jhd05vZGUnLFxuICAgICAgICAgICAgc3FsRnJhZ21lbnRzOiBmcmVlemUoWy4uLm5vZGUuc3FsRnJhZ21lbnRzXSksXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUucGFyYW1ldGVycywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1XaGVyZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1doZXJlTm9kZScsXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSW5zZXJ0UXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdJbnNlcnRRdWVyeU5vZGUnLFxuICAgICAgICAgICAgaW50bzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW50bywgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkNvbmZsaWN0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbkNvbmZsaWN0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uRHVwbGljYXRlS2V5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbkR1cGxpY2F0ZUtleSwgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZ25vcmU6IG5vZGUuaWdub3JlLFxuICAgICAgICAgICAgb3JBY3Rpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yQWN0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlcGxhY2U6IG5vZGUucmVwbGFjZSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlczogbm9kZS5kZWZhdWx0VmFsdWVzLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVmFsdWVzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVzTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGVsZXRlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEZWxldGVRdWVyeU5vZGUnLFxuICAgICAgICAgICAgZnJvbTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZnJvbSwgcXVlcnlJZCksXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgam9pbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5qb2lucywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZXR1cm5pbmcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZXR1cm5pbmdOb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZWxlY3Rpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZVRhYmxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBjb25zdHJhaW50czogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbnN0cmFpbnRzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRlbXBvcmFyeTogbm9kZS50ZW1wb3JhcnksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgICAgIG9uQ29tbWl0OiBub2RlLm9uQ29tbWl0LFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2VsZWN0UXVlcnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNlbGVjdFF1ZXJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbHVtbkRlZmluaXRpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5EZWZpbml0aW9uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBkYXRhVHlwZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGF0YVR5cGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVmZXJlbmNlczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVmZXJlbmNlcywgcXVlcnlJZCksXG4gICAgICAgICAgICBwcmltYXJ5S2V5OiBub2RlLnByaW1hcnlLZXksXG4gICAgICAgICAgICBhdXRvSW5jcmVtZW50OiBub2RlLmF1dG9JbmNyZW1lbnQsXG4gICAgICAgICAgICB1bmlxdWU6IG5vZGUudW5pcXVlLFxuICAgICAgICAgICAgbm90TnVsbDogbm9kZS5ub3ROdWxsLFxuICAgICAgICAgICAgdW5zaWduZWQ6IG5vZGUudW5zaWduZWQsXG4gICAgICAgICAgICBkZWZhdWx0VG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRlZmF1bHRUbywgcXVlcnlJZCksXG4gICAgICAgICAgICBjaGVjazogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY2hlY2ssIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5nZW5lcmF0ZWQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogbm9kZS5udWxsc05vdERpc3RpbmN0LFxuICAgICAgICAgICAgaWRlbnRpdHk6IG5vZGUuaWRlbnRpdHksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUFkZENvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FkZENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcFRhYmxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBjYXNjYWRlOiBub2RlLmNhc2NhZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PcmRlckJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT3JkZXJCeU5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PcmRlckJ5SXRlbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGlyZWN0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbGxhdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sbGF0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzOiBub2RlLm51bGxzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtR3JvdXBCeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0dyb3VwQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtR3JvdXBCeUl0ZW0obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgZ3JvdXBCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZ3JvdXBCeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1VcGRhdGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VwZGF0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZnJvbTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZnJvbSwgcXVlcnlJZCksXG4gICAgICAgICAgICBqb2luczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmpvaW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB1cGRhdGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudXBkYXRlcywgcXVlcnlJZCksXG4gICAgICAgICAgICByZXR1cm5pbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJldHVybmluZywgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdXRwdXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm91dHB1dCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbHVtblVwZGF0ZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtblVwZGF0ZU5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnZhbHVlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUxpbWl0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTGltaXROb2RlJyxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PZmZzZXQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPZmZzZXROb2RlJyxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub2Zmc2V0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9uQ29uZmxpY3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkNvbmZsaWN0Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBjb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGluZGV4RXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW5kZXhFeHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmluZGV4V2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXBkYXRlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnVwZGF0ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVwZGF0ZVdoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRvTm90aGluZzogbm9kZS5kb05vdGhpbmcsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PbkR1cGxpY2F0ZUtleShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09uRHVwbGljYXRlS2V5Tm9kZScsXG4gICAgICAgICAgICB1cGRhdGVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudXBkYXRlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVJbmRleChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZUluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICB1bmlxdWU6IG5vZGUudW5pcXVlLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IG5vZGUubnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUxpc3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdMaXN0Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BJbmRleChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBjYXNjYWRlOiBub2RlLmNhc2NhZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QcmltYXJ5S2V5Q29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1ByaW1hcnlLZXlDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IG5vZGUuZGVmZXJyYWJsZSxcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBub2RlLmluaXRpYWxseURlZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVW5pcXVlQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogbm9kZS5udWxsc05vdERpc3RpbmN0LFxuICAgICAgICAgICAgZGVmZXJyYWJsZTogbm9kZS5kZWZlcnJhYmxlLFxuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Gb3JlaWduS2V5Q29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0ZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICByZWZlcmVuY2VzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZWZlcmVuY2VzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25EZWxldGU6IG5vZGUub25EZWxldGUsXG4gICAgICAgICAgICBvblVwZGF0ZTogbm9kZS5vblVwZGF0ZSxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IG5vZGUuZGVmZXJyYWJsZSxcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBub2RlLmluaXRpYWxseURlZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2V0T3BlcmF0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2V0T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcjogbm9kZS5vcGVyYXRvcixcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWxsOiBub2RlLmFsbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZmVyZW5jZXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZlcmVuY2VzTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25EZWxldGU6IG5vZGUub25EZWxldGUsXG4gICAgICAgICAgICBvblVwZGF0ZTogbm9kZS5vblVwZGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNoZWNrQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NoZWNrQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVdpdGgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaXRoTm9kZScsXG4gICAgICAgICAgICBleHByZXNzaW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmV4cHJlc3Npb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlY3Vyc2l2ZTogbm9kZS5yZWN1cnNpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBub2RlLm1hdGVyaWFsaXplZCxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1IYXZpbmcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdIYXZpbmdOb2RlJyxcbiAgICAgICAgICAgIGhhdmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaGF2aW5nLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZVNjaGVtYShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVNjaGVtYU5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zY2hlbWEsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wU2NoZW1hKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFNjaGVtYU5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zY2hlbWEsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBjYXNjYWRlOiBub2RlLmNhc2NhZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BbHRlclRhYmxlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWx0ZXJUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlbmFtZVRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZW5hbWVUbywgcXVlcnlJZCksXG4gICAgICAgICAgICBzZXRTY2hlbWE6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNldFNjaGVtYSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5BbHRlcmF0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbkFsdGVyYXRpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmFkZENvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRyb3BDb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlbmFtZUNvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlbmFtZUNvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWRkSW5kZXg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmFkZEluZGV4LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRyb3BJbmRleDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZHJvcEluZGV4LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZW5hbWVDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlbmFtZVRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZW5hbWVUbywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BbHRlckNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBkYXRhVHlwZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGF0YVR5cGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGVFeHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2V0RGVmYXVsdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2V0RGVmYXVsdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkcm9wRGVmYXVsdDogbm9kZS5kcm9wRGVmYXVsdCxcbiAgICAgICAgICAgIHNldE5vdE51bGw6IG5vZGUuc2V0Tm90TnVsbCxcbiAgICAgICAgICAgIGRyb3BOb3ROdWxsOiBub2RlLmRyb3BOb3ROdWxsLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTW9kaWZ5Q29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTW9kaWZ5Q29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZGRDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50TmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29uc3RyYWludE5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBtb2RpZmllcjogbm9kZS5tb2RpZmllcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlbmFtZUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBvbGROYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbGROYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG5ld05hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5ld05hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlVmlldyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGVtcG9yYXJ5OiBub2RlLnRlbXBvcmFyeSxcbiAgICAgICAgICAgIG9yUmVwbGFjZTogbm9kZS5vclJlcGxhY2UsXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogbm9kZS5tYXRlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBhczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuYXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmcmVzaE1hdGVyaWFsaXplZFZpZXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb25jdXJyZW50bHk6IG5vZGUuY29uY3VycmVudGx5LFxuICAgICAgICAgICAgd2l0aE5vRGF0YTogbm9kZS53aXRoTm9EYXRhLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcFZpZXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogbm9kZS5tYXRlcmlhbGl6ZWQsXG4gICAgICAgICAgICBjYXNjYWRlOiBub2RlLmNhc2NhZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1HZW5lcmF0ZWQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHZW5lcmF0ZWROb2RlJyxcbiAgICAgICAgICAgIGJ5RGVmYXVsdDogbm9kZS5ieURlZmF1bHQsXG4gICAgICAgICAgICBhbHdheXM6IG5vZGUuYWx3YXlzLFxuICAgICAgICAgICAgaWRlbnRpdHk6IG5vZGUuaWRlbnRpdHksXG4gICAgICAgICAgICBzdG9yZWQ6IG5vZGUuc3RvcmVkLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EZWZhdWx0VmFsdWUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEZWZhdWx0VmFsdWVOb2RlJyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGVmYXVsdFZhbHVlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT25Ob2RlJyxcbiAgICAgICAgICAgIG9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TZWxlY3RNb2RpZmllcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdE1vZGlmaWVyTm9kZScsXG4gICAgICAgICAgICBtb2RpZmllcjogbm9kZS5tb2RpZmllcixcbiAgICAgICAgICAgIHJhd01vZGlmaWVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yYXdNb2RpZmllciwgcXVlcnlJZCksXG4gICAgICAgICAgICBvZjogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLm9mLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZVR5cGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVUeXBlTm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVudW06IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmVudW0sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcFR5cGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpZkV4aXN0czogbm9kZS5pZkV4aXN0cyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUV4cGxhaW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdFeHBsYWluTm9kZScsXG4gICAgICAgICAgICBmb3JtYXQ6IG5vZGUuZm9ybWF0LFxuICAgICAgICAgICAgb3B0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3B0aW9ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zY2hlbWEsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaWRlbnRpZmllciwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZScsXG4gICAgICAgICAgICBmdW5jOiBub2RlLmZ1bmMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVkOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuYWdncmVnYXRlZCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkaXN0aW5jdDogbm9kZS5kaXN0aW5jdCxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aGluR3JvdXA6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGhpbkdyb3VwLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZmlsdGVyLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG92ZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm92ZXIsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3Zlcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ092ZXJOb2RlJyxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcGFydGl0aW9uQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnBhcnRpdGlvbkJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVBhcnRpdGlvbkJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUGFydGl0aW9uQnlJdGVtKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBwYXJ0aXRpb25CeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucGFydGl0aW9uQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQmluYXJ5T3BlcmF0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQmluYXJ5T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBsZWZ0T3BlcmFuZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGVmdE9wZXJhbmQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhdG9yLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJpZ2h0T3BlcmFuZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmlnaHRPcGVyYW5kLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVuYXJ5T3BlcmF0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICBvcGVyYW5kOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYW5kLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVzaW5nKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnVXNpbmdOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnRhYmxlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1GdW5jdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Z1bmN0aW9uTm9kZScsXG4gICAgICAgICAgICBmdW5jOiBub2RlLmZ1bmMsXG4gICAgICAgICAgICBhcmd1bWVudHM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5hcmd1bWVudHMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ2FzZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Nhc2VOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS52YWx1ZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVuOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUud2hlbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBlbHNlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5lbHNlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlzU3RhdGVtZW50OiBub2RlLmlzU3RhdGVtZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtV2hlbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1doZW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29uZGl0aW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlc3VsdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVzdWx0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05SZWZlcmVuY2Uobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICByZWZlcmVuY2U6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlZmVyZW5jZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0cmF2ZXJzYWw6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRyYXZlcnNhbCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OUGF0aChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTm9kZScsXG4gICAgICAgICAgICBpbk9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbk9wZXJhdG9yLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHBhdGhMZWdzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUucGF0aExlZ3MsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTlBhdGhMZWcobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlBhdGhMZWdOb2RlJyxcbiAgICAgICAgICAgIHR5cGU6IG5vZGUudHlwZSxcbiAgICAgICAgICAgIHZhbHVlOiBub2RlLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTk9wZXJhdG9yQ2hhaW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OT3BlcmF0b3JDaGFpbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wZXJhdG9yLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1UdXBsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1R1cGxlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTWVyZ2VRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ01lcmdlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmludG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdoZW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUud2hlbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2l0aDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2l0aCwgcXVlcnlJZCksXG4gICAgICAgICAgICB0b3A6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRvcCwgcXVlcnlJZCksXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtTWF0Y2hlZChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNYXRjaGVkTm9kZScsXG4gICAgICAgICAgICBub3Q6IG5vZGUubm90LFxuICAgICAgICAgICAgYnlTb3VyY2U6IG5vZGUuYnlTb3VyY2UsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZGRJbmRleChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FkZEluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVuaXF1ZTogbm9kZS51bmlxdWUsXG4gICAgICAgICAgICB1c2luZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudXNpbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DYXN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzdE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBkYXRhVHlwZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGF0YVR5cGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRmV0Y2gobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGZXRjaE5vZGUnLFxuICAgICAgICAgICAgcm93Q291bnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJvd0NvdW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG1vZGlmaWVyOiBub2RlLm1vZGlmaWVyLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVG9wKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1RvcE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogbm9kZS5leHByZXNzaW9uLFxuICAgICAgICAgICAgbW9kaWZpZXJzOiBub2RlLm1vZGlmaWVycyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU91dHB1dChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ091dHB1dE5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNlbGVjdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGF0YVR5cGUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2VsZWN0QWxsKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybUlkZW50aWZpZXIobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVmFsdWUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybU9wZXJhdG9yKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybURlZmF1bHRJbnNlcnRWYWx1ZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PckFjdGlvbihub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2xsYXRlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXNjaGVtYS10cmFuc2Zvcm1lci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgSm9pbk5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9qb2luLW5vZGUuanMnO1xuaW1wb3J0IHsgTGlzdE5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtdHJhbnNmb3JtZXIuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLy8gVGhpcyBvYmplY3QgZXhpc3Qgb25seSBzbyB0aGF0IHdlIGdldCBhIHR5cGUgZXJyb3Igd2hlbiBhIG5ldyBSb290T3BlcmF0aW9uTm9kZVxuLy8gaXMgYWRkZWQuIElmIHlvdSBnZXQgYSB0eXBlIGVycm9yIGhlcmUsIG1ha2Ugc3VyZSB0byBhZGQgdGhlIG5ldyByb290IG5vZGUgYW5kXG4vLyBoYW5kbGUgaXQgY29ycmVjdGx5IGluIHRoZSB0cmFuc2Zvcm1lci5cbi8vXG4vLyBETyBOT1QgUkVGQUNUT1IgVEhJUyBFVkVOIElGIElUIFNFRU1TIFVTRUxFU1MgVE8gWU9VIVxuY29uc3QgUk9PVF9PUEVSQVRJT05fTk9ERVMgPSBmcmVlemUoe1xuICAgIEFsdGVyVGFibGVOb2RlOiB0cnVlLFxuICAgIENyZWF0ZUluZGV4Tm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVTY2hlbWFOb2RlOiB0cnVlLFxuICAgIENyZWF0ZVRhYmxlTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVUeXBlTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVWaWV3Tm9kZTogdHJ1ZSxcbiAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRydWUsXG4gICAgRGVsZXRlUXVlcnlOb2RlOiB0cnVlLFxuICAgIERyb3BJbmRleE5vZGU6IHRydWUsXG4gICAgRHJvcFNjaGVtYU5vZGU6IHRydWUsXG4gICAgRHJvcFRhYmxlTm9kZTogdHJ1ZSxcbiAgICBEcm9wVHlwZU5vZGU6IHRydWUsXG4gICAgRHJvcFZpZXdOb2RlOiB0cnVlLFxuICAgIEluc2VydFF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBSYXdOb2RlOiB0cnVlLFxuICAgIFNlbGVjdFF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBVcGRhdGVRdWVyeU5vZGU6IHRydWUsXG4gICAgTWVyZ2VRdWVyeU5vZGU6IHRydWUsXG59KTtcbmNvbnN0IFNDSEVNQUxFU1NfRlVOQ1RJT05TID0ge1xuICAgIGpzb25fYWdnOiB0cnVlLFxuICAgIHRvX2pzb246IHRydWUsXG59O1xuZXhwb3J0IGNsYXNzIFdpdGhTY2hlbWFUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gICAgI3NjaGVtYTtcbiAgICAjc2NoZW1hYmxlSWRzID0gbmV3IFNldCgpO1xuICAgICNjdGVzID0gbmV3IFNldCgpO1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLiNzY2hlbWEgPSBzY2hlbWE7XG4gICAgfVxuICAgIHRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpc1Jvb3RPcGVyYXRpb25Ob2RlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3RlcyA9IHRoaXMuI2NvbGxlY3RDVEVzKG5vZGUpO1xuICAgICAgICBmb3IgKGNvbnN0IGN0ZSBvZiBjdGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNjdGVzLmFkZChjdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlcyA9IHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHMobm9kZSk7XG4gICAgICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICAgICAgICB0aGlzLiNzY2hlbWFibGVJZHMuYWRkKHRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHN1cGVyLnRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgICAgICAgdGhpcy4jc2NoZW1hYmxlSWRzLmRlbGV0ZSh0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjdGUgb2YgY3Rlcykge1xuICAgICAgICAgICAgdGhpcy4jY3Rlcy5kZWxldGUoY3RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNjaGVtYWJsZUlkZW50aWZpZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHN1cGVyLnRyYW5zZm9ybVNjaGVtYWJsZUlkZW50aWZpZXIobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZC5zY2hlbWEgfHwgIXRoaXMuI3NjaGVtYWJsZUlkcy5oYXMobm9kZS5pZGVudGlmaWVyLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRyYW5zZm9ybWVkLFxuICAgICAgICAgICAgc2NoZW1hOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jc2NoZW1hKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmZXJlbmNlcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkID0gc3VwZXIudHJhbnNmb3JtUmVmZXJlbmNlcyhub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkLnRhYmxlLnRhYmxlLnNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50cmFuc2Zvcm1lZCxcbiAgICAgICAgICAgIHRhYmxlOiBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYSh0aGlzLiNzY2hlbWEsIHRyYW5zZm9ybWVkLnRhYmxlLnRhYmxlLmlkZW50aWZpZXIubmFtZSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybUFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN1cGVyLnRyYW5zZm9ybUFnZ3JlZ2F0ZUZ1bmN0aW9uKHsgLi4ubm9kZSwgYWdncmVnYXRlZDogW10gfSwgcXVlcnlJZCksXG4gICAgICAgICAgICBhZ2dyZWdhdGVkOiB0aGlzLiN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyhub2RlLCBxdWVyeUlkLCAnYWdncmVnYXRlZCcpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0cmFuc2Zvcm1GdW5jdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50cmFuc2Zvcm1GdW5jdGlvbih7IC4uLm5vZGUsIGFyZ3VtZW50czogW10gfSwgcXVlcnlJZCksXG4gICAgICAgICAgICBhcmd1bWVudHM6IHRoaXMuI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzKG5vZGUsIHF1ZXJ5SWQsICdhcmd1bWVudHMnKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzKG5vZGUsIHF1ZXJ5SWQsIGFyZ3NLZXkpIHtcbiAgICAgICAgcmV0dXJuIFNDSEVNQUxFU1NfRlVOQ1RJT05TW25vZGUuZnVuY11cbiAgICAgICAgICAgID8gbm9kZVthcmdzS2V5XS5tYXAoKGFyZykgPT4gIVRhYmxlTm9kZS5pcyhhcmcpIHx8IGFyZy50YWJsZS5zY2hlbWFcbiAgICAgICAgICAgICAgICA/IHRoaXMudHJhbnNmb3JtTm9kZShhcmcsIHF1ZXJ5SWQpXG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmFyZyxcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtSWRlbnRpZmllcihhcmcudGFibGUuaWRlbnRpZmllciwgcXVlcnlJZCksXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlW2FyZ3NLZXldLCBxdWVyeUlkKTtcbiAgICB9XG4gICAgI2lzUm9vdE9wZXJhdGlvbk5vZGUobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kIGluIFJPT1RfT1BFUkFUSU9OX05PREVTO1xuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkcyhub2RlKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYWJsZUlkcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgaWYgKCduYW1lJyBpbiBub2RlICYmIG5vZGUubmFtZSAmJiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5pcyhub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZS5uYW1lLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnZnJvbScgaW4gbm9kZSAmJiBub2RlLmZyb20pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZnJvbSBvZiBub2RlLmZyb20uZnJvbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihmcm9tLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgnaW50bycgaW4gbm9kZSAmJiBub2RlLmludG8pIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUuaW50bywgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3RhYmxlJyBpbiBub2RlICYmIG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKG5vZGUudGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdqb2lucycgaW4gbm9kZSAmJiBub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGpvaW4gb2Ygbm9kZS5qb2lucykge1xuICAgICAgICAgICAgICAgIHRoaXMuI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByKGpvaW4udGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCd1c2luZycgaW4gbm9kZSAmJiBub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICBpZiAoSm9pbk5vZGUuaXMobm9kZS51c2luZykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLnVzaW5nLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS51c2luZywgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hYmxlSWRzO1xuICAgIH1cbiAgICAjY29sbGVjdENURXMobm9kZSkge1xuICAgICAgICBjb25zdCBjdGVzID0gbmV3IFNldCgpO1xuICAgICAgICBpZiAoJ3dpdGgnIGluIG5vZGUgJiYgbm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0Q1RFSWRzKG5vZGUud2l0aCwgY3Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0ZXM7XG4gICAgfVxuICAgICNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLCBzY2hlbWFibGVJZHMpIHtcbiAgICAgICAgaWYgKFRhYmxlTm9kZS5pcyhub2RlKSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUudGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQWxpYXNOb2RlLmlzKG5vZGUpICYmIFRhYmxlTm9kZS5pcyhub2RlLm5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZS5ub2RlLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKExpc3ROb2RlLmlzKG5vZGUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIG5vZGUuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcih0YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUsIHNjaGVtYWJsZUlkcykge1xuICAgICAgICBjb25zdCBpZCA9IG5vZGUuaWRlbnRpZmllci5uYW1lO1xuICAgICAgICBpZiAoIXRoaXMuI3NjaGVtYWJsZUlkcy5oYXMoaWQpICYmICF0aGlzLiNjdGVzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHNjaGVtYWJsZUlkcy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb2xsZWN0Q1RFSWRzKG5vZGUsIGN0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIG5vZGUuZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0ZUlkID0gZXhwci5uYW1lLnRhYmxlLnRhYmxlLmlkZW50aWZpZXIubmFtZTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY3Rlcy5oYXMoY3RlSWQpKSB7XG4gICAgICAgICAgICAgICAgY3Rlcy5hZGQoY3RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXNjaGVtYS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIgfSBmcm9tICcuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzJztcbmV4cG9ydCBjbGFzcyBXaXRoU2NoZW1hUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXI7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gbmV3IFdpdGhTY2hlbWFUcmFuc2Zvcm1lcihzY2hlbWEpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSwgYXJncy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtUmVzdWx0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVzdWx0O1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWF0Y2hlZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE1hdGNoZWROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdNYXRjaGVkTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm90LCBieVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01hdGNoZWROb2RlJyxcbiAgICAgICAgICAgIG5vdCxcbiAgICAgICAgICAgIGJ5U291cmNlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE1hdGNoZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWF0Y2hlZC1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvd2hlbi1ub2RlLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VGaWx0ZXJMaXN0LCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4vYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVyZ2VXaGVuKHR5cGUsIGFyZ3MsIHJlZlJpZ2h0KSB7XG4gICAgcmV0dXJuIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZUZpbHRlckxpc3QoW1xuICAgICAgICBNYXRjaGVkTm9kZS5jcmVhdGUoIXR5cGUuaXNNYXRjaGVkLCB0eXBlLmJ5U291cmNlKSxcbiAgICAgICAgLi4uKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMyAmJiByZWZSaWdodFxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgXSwgJ2FuZCcsIGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXJnZVRoZW4ocmVzdWx0KSB7XG4gICAgaWYgKGlzU3RyaW5nKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFtyZXN1bHRdLCBbXSk7XG4gICAgfVxuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZlcnJlZC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgI3Byb21pc2U7XG4gICAgI3Jlc29sdmU7XG4gICAgI3JlamVjdDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHRoaXMuI3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbiAgICByZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNyZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVqZWN0ID0gKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLiNyZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmQudHNcIiAvPlxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL2RlZmVycmVkLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24oY29ubmVjdGlvblByb3ZpZGVyKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbkRlZmVyID0gbmV3IERlZmVycmVkKCk7XG4gICAgY29uc3QgY29ubmVjdGlvblJlbGVhc2VEZWZlciA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIGNvbm5lY3Rpb25Qcm92aWRlclxuICAgICAgICAucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgY29ubmVjdGlvbkRlZmVyLnJlc29sdmUoY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnByb21pc2U7XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKChleCkgPT4gY29ubmVjdGlvbkRlZmVyLnJlamVjdChleCkpO1xuICAgIC8vIENyZWF0ZSBjb21wb3NpdGUgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSByZWxlYXNlIG1ldGhvZCBpbnN0ZWFkIG9mXG4gICAgLy8gbW9kaWZ5aW5nIHRoZSBjb25uZWN0aW9uIG9yIGNyZWF0aW5nIGEgbmV3IG5lc3RpbmcgYERhdGFiYXNlQ29ubmVjdGlvbmAuXG4gICAgLy8gVGhpcyB3YXkgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IG92ZXJyaWRlIGFueSBtZXRob2RzIG9mIDNyZCBwYXJ0eVxuICAgIC8vIGNvbm5lY3Rpb25zIGFuZCBkb24ndCByZXR1cm4gd3JhcHBlZCBjb25uZWN0aW9ucyB0byBkcml2ZXJzIHRoYXRcbiAgICAvLyBleHBlY3QgYSBjZXJ0YWluIHNwZWNpZmljIGNvbm5lY3Rpb24gY2xhc3MuXG4gICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgIGNvbm5lY3Rpb246IGF3YWl0IGNvbm5lY3Rpb25EZWZlci5wcm9taXNlLFxuICAgICAgICByZWxlYXNlOiBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnJlc29sdmUsXG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24gfSBmcm9tICcuLi91dGlsL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmNvbnN0IE5PX1BMVUdJTlMgPSBmcmVlemUoW10pO1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RXhlY3V0b3JCYXNlIHtcbiAgICAjcGx1Z2lucztcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW5zID0gTk9fUExVR0lOUykge1xuICAgICAgICB0aGlzLiNwbHVnaW5zID0gcGx1Z2lucztcbiAgICB9XG4gICAgZ2V0IHBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwbHVnaW5zO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuI3BsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkTm9kZSA9IHBsdWdpbi50cmFuc2Zvcm1RdWVyeSh7IG5vZGUsIHF1ZXJ5SWQgfSk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIGEgcnVudGltZSBjaGVjayBoZXJlLiBUaGVyZSBpcyBubyBnb29kIHdheVxuICAgICAgICAgICAgLy8gdG8gd3JpdGUgdHlwZXMgdGhhdCBlbmZvcmNlIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZE5vZGUua2luZCA9PT0gbm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHRyYW5zZm9ybWVkTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBLeXNlbHlQbHVnaW4udHJhbnNmb3JtUXVlcnkgbXVzdCByZXR1cm4gYSBub2RlYCxcbiAgICAgICAgICAgICAgICAgICAgYG9mIHRoZSBzYW1lIGtpbmQgdGhhdCB3YXMgZ2l2ZW4gdG8gaXQuYCxcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gd2FzIGdpdmVuIGEgJHtub2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICAgICAgYGJ1dCBpdCByZXR1cm5lZCBhICR7dHJhbnNmb3JtZWROb2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgICAgIGlmICgnbnVtVXBkYXRlZE9yRGVsZXRlZFJvd3MnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxvZ09uY2UoJ2t5c2VseTp3YXJuaW5nOiBvdXRkYXRlZCBkcml2ZXIvcGx1Z2luIGRldGVjdGVkISBgUXVlcnlSZXN1bHQubnVtVXBkYXRlZE9yRGVsZXRlZFJvd3NgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYFF1ZXJ5UmVzdWx0Lm51bUFmZmVjdGVkUm93c2AuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgY29tcGlsZWRRdWVyeS5xdWVyeUlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSB7XG4gICAgICAgIGNvbnN0IHsgY29ubmVjdGlvbiwgcmVsZWFzZSB9ID0gYXdhaXQgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uKHRoaXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCByZXN1bHQgb2YgY29ubmVjdGlvbi5zdHJlYW1RdWVyeShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgYXdhaXQgdGhpcy4jdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgY29tcGlsZWRRdWVyeS5xdWVyeUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyAjdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgcXVlcnlJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLiNwbHVnaW5zKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBwbHVnaW4udHJhbnNmb3JtUmVzdWx0KHsgcmVzdWx0LCBxdWVyeUlkIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgUXVlcnlFeGVjdXRvckJhc2UgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMnO1xuLyoqXG4gKiBBIHtAbGluayBRdWVyeUV4ZWN1dG9yfSBzdWJjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4geW91IGRvbid0XG4gKiBoYXZlIGEge0BsaW5rIFF1ZXJ5Q29tcGlsZXJ9LCB7QGxpbmsgQ29ubmVjdGlvblByb3ZpZGVyfSBvciBhbnlcbiAqIG90aGVyIG5lZWRlZCB0aGluZ3MgdG8gYWN0dWFsbHkgZXhlY3V0ZSBxdWVyaWVzLlxuICovXG5leHBvcnQgY2xhc3MgTm9vcFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgYmUgY29tcGlsZWQgdG8gU1FMJyk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBjb21waWxlZCB0byBTUUwnKTtcbiAgICB9XG4gICAgcHJvdmlkZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGhpcyBxdWVyeSBjYW5ub3QgYmUgZXhlY3V0ZWQnKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBoYXZlIGEgY29ubmVjdGlvbiBwcm92aWRlcicpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoW10pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBOT09QX1FVRVJZX0VYRUNVVE9SID0gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKCk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBNZXJnZVJlc3VsdCB7XG4gICAgbnVtQ2hhbmdlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1DaGFuZ2VkUm93cyA9IG51bUNoYW5nZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlSW5zZXJ0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvaW5zZXJ0LXZhbHVlcy1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU1lcmdlVGhlbiwgcGFyc2VNZXJnZVdoZW4gfSBmcm9tICcuLi9wYXJzZXIvbWVyZ2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QWxsLCBwYXJzZVNlbGVjdEFyZywgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE1lcmdlUmVzdWx0IH0gZnJvbSAnLi9tZXJnZS1yZXN1bHQuanMnO1xuaW1wb3J0IHsgTm9SZXN1bHRFcnJvciwgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi91cGRhdGUtcXVlcnktYnVpbGRlci5qcyc7XG5leHBvcnQgY2xhc3MgTWVyZ2VRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsLnJhdygnLS0gdGhpcyBpcyBhIGNvbW1lbnQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIiB1c2luZyBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCIgd2hlbiBtYXRjaGVkIHRoZW4gZGVsZXRlIC0tIHRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBgbWVyZ2UgaW50b2AgcXVlcnkgdG8gYW4gYG1lcmdlIHRvcCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQWZmZWN0IDUgbWF0Y2hlZCByb3dzIGF0IG1vc3Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIHRvcCg1KSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZGVsZXRlXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZmZlY3QgNTAlIG9mIG1hdGNoZWQgcm93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgdG9wKDUwKSBwZXJjZW50IGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVXNpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUpvaW4oJ1VzaW5nJywgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSB0aGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiIHVzaW5nIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIiB3aGVuIG1hdGNoZWQgdGhlbiBkZWxldGUgLS0gdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBNZXJnZVF1ZXJ5QnVpbGRlci50b3B9LlxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqIEZvciBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2Ugd2l0aCBhbiBgYW5kYCBjb25kaXRpb24sIHNlZSB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5NYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uIEJ1dCB1bmxpa2VcbiAgICAgKiB7QGxpbmsgd2hlbk1hdGNoZWRBbmR9LCB0aGlzIG1ldGhvZCBhY2NlcHRzIGEgY29sdW1uIHJlZmVyZW5jZSBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLndoZXJlUmVmfSwgc28gc2VlIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgICogZm9yIHRoYXQgbWV0aG9kIGZvciBtb3JlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIHdoZW5NYXRjaGVkQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUpO1xuICAgIH1cbiAgICAjd2hlbk1hdGNoZWQoYXJncywgcmVmUmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VXaGVuKHsgaXNNYXRjaGVkOiB0cnVlIH0sIGFyZ3MsIHJlZlJpZ2h0KSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaW1wbGUgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkfS5cbiAgICAgKlxuICAgICAqIEZvciBhIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk5vdE1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5JbnNlcnRWYWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuXG4gICAgICogICBpbnNlcnQgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiKSB2YWx1ZXMgKCQxLCAkMilcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtdKTtcbiAgICB9XG4gICAgd2hlbk5vdE1hdGNoZWRBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoYXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLiBCdXQgdW5saWtlXG4gICAgICoge0BsaW5rIHdoZW5Ob3RNYXRjaGVkQW5kfSwgdGhpcyBtZXRob2QgYWNjZXB0cyBhIGNvbHVtbiByZWZlcmVuY2UgYXMgdGhlIDNyZCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgd2hlbk1hdGNoZWRBbmRSZWZ9LCB5b3UgY2Fubm90IHJlZmVyZW5jZSBjb2x1bW5zIGZyb20gdGhlIHRhcmdldCB0YWJsZS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8ge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci53aGVyZVJlZn0sIHNvIHNlZSB0aGUgZG9jdW1lbnRhdGlvblxuICAgICAqIGZvciB0aGF0IG1ldGhvZCBmb3IgbW9yZSBleGFtcGxlcy5cbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZEFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbXBsZSBgd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2VgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgaW4gTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rIHdoZW5Ob3RNYXRjaGVkfSwgYnV0IHJldHVybnMgYSB7QGxpbmsgTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJ9LlxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkQnlTb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTm90TWF0Y2hlZChbXSwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICB3aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKGFyZ3MsIGZhbHNlLCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbm90IG1hdGNoZWQgYnkgc291cmNlYCBjbGF1c2UgdG8gdGhlIHF1ZXJ5IHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmRSZWZ9LCBidXQgeW91IGNhbiByZWZlcmVuY2UgY29sdW1ucyBmcm9tXG4gICAgICogdGhlIHRhcmdldCB0YWJsZSwgYW5kIG5vdCBmcm9tIHNvdXJjZSB0YWJsZSBhbmQgcmV0dXJucyBhIHtAbGluayBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICovXG4gICAgd2hlbk5vdE1hdGNoZWRCeVNvdXJjZUFuZFJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtsaHMsIG9wLCByaHNdLCB0cnVlLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybmluZ0FsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPdXRwdXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFyZyhhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXRBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAjd2hlbk5vdE1hdGNoZWQoYXJncywgcmVmUmlnaHQgPSBmYWxzZSwgYnlTb3VyY2UgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VNZXJnZVdoZW4oeyBpc01hdGNoZWQ6IGZhbHNlLCBieVNvdXJjZSB9LCBhcmdzLCByZWZSaWdodCkpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBCdWlsZGVyID0gYnlTb3VyY2VcbiAgICAgICAgICAgID8gTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXJcbiAgICAgICAgICAgIDogTm90TWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXI7XG4gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdKb2huJyB9KVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBlcnNvbihpZDogbnVtYmVyLCB1cGRhdGVzOiBQZXJzb25VcGRhdGUsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHVwZGF0ZXMpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYHVwZGF0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtuZXcgTWVyZ2VSZXN1bHQocmVzdWx0Lm51bUFmZmVjdGVkUm93cyldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB1bmRlZmluZWQgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHRocm93cyBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBCeSBkZWZhdWx0IGFuIGluc3RhbmNlIG9mIHtAbGluayBOb1Jlc3VsdEVycm9yfSBpcyB0aHJvd24sIGJ1dCB5b3UgY2FuXG4gICAgICogcHJvdmlkZSBhIGN1c3RvbSBlcnJvciBjbGFzcywgb3IgY2FsbGJhY2sgYXMgdGhlIG9ubHkgYXJndW1lbnQgdG8gdGhyb3cgYSBkaWZmZXJlbnRcbiAgICAgKiBlcnJvci5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRlbGV0ZWAgYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRG9Ob3RoaW5nfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGB1cGRhdGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuVXBkYXRlfSBvciB7QGxpbmsgdGhlblVwZGF0ZVNldH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5EZWxldGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZGVsZXRlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRlbGV0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5EZWxldGV9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYHVwZGF0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5VcGRhdGV9IG9yIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRvTm90aGluZygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm0gYW4gYHVwZGF0ZWAgb3BlcmF0aW9uIHdpdGggYSBmdWxsLWZsZWRnZWQge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICogVGhpcyBpcyBoYW5keSB3aGVuIG11bHRpcGxlIGBzZXRgIGludm9jYXRpb25zIGFyZSBuZWVkZWQuXG4gICAgICpcbiAgICAgKiBGb3IgYSBzaG9ydGhhbmQgdmVyc2lvbiBvZiB0aGlzIG1ldGhvZCwgc2VlIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkZWxldGVgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRGVsZXRlfS5cbiAgICAgKlxuICAgICAqIFRvIHBlcmZvcm0gdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkRvTm90aGluZ30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5VcGRhdGUoKHViKSA9PiB1YlxuICAgICAqICAgICAuc2V0KHNxbGBtZXRhZGF0YVsnaGFzX3BldHMnXWAsICdZJylcbiAgICAgKiAgICAgLnNldCh7XG4gICAgICogICAgICAgdXBkYXRlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAqICAgICB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIHVwZGF0ZSBzZXQgbWV0YWRhdGFbJ2hhc19wZXRzJ10gPSAkMSwgXCJ1cGRhdGVkX2F0XCIgPSAkMlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5VcGRhdGUoc2V0KSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihzZXQobmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgcXVlcnlJZDogdGhpcy4jcHJvcHMucXVlcnlJZCxcbiAgICAgICAgICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICAgICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0VGFibGUoKSxcbiAgICAgICAgICAgIH0pKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhlblVwZGF0ZVNldCguLi5hcmdzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgbm90IHN1cmUgaG93IHRvIHR5cGUgdGhpcyBzbyBpdCB3b24ndCBjb21wbGFpbiBhYm91dCBzZXQoLi4uYXJncykuXG4gICAgICAgIHJldHVybiB0aGlzLnRoZW5VcGRhdGUoKHViKSA9PiB1Yi5zZXQoLi4uYXJncykpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgdGhlIGBkbyBub3RoaW5nYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHN1cHBvcnRlZCBpbiBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGluc2VydGAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5JbnNlcnRWYWx1ZXN9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRG9Ob3RoaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgdGhlblxuICAgICAqICAgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRoZW5Eb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbignZG8gbm90aGluZycpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRoZW5JbnNlcnRWYWx1ZXMoaW5zZXJ0KSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5zLCB2YWx1ZXNdID0gcGFyc2VJbnNlcnRFeHByZXNzaW9uKGluc2VydCk7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlVGhlbihJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGVXaXRob3V0SW50bygpLCB7XG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWNyZWF0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9pbnNlcnQtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL3VwZGF0ZS1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFVwZGF0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSwgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIHBhcnNlQWxpYXNlZFRhYmxlLCB9IGZyb20gJy4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3BhcnNlci93aXRoLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBXaXRoTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgV2l0aFNjaGVtYVBsdWdpbiB9IGZyb20gJy4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCB9IGZyb20gJy4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvbWVyZ2UtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBNZXJnZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUXVlcnlDcmVhdG9yIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYHNlbGVjdGAgcXVlcnkgYnVpbGRlciBmb3IgdGhlIGdpdmVuIHRhYmxlIG9yIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIFRoZSB0YWJsZXMgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIGFyZSBidWlsdCBhcyB0aGUgcXVlcnkncyBgZnJvbWAgY2xhdXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZm9yIG9uZSB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0QWxsKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZvciBvbmUgdGFibGUgd2l0aCBhbiBhbGlhczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcGVyc29ucyA9IGF3YWl0IGRiLnNlbGVjdEZyb20oJ3BlcnNvbiBhcyBwJylcbiAgICAgKiAgIC5zZWxlY3QoWydwLmlkJywgJ2ZpcnN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHBlcnNvbnNbMF0uaWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJpZFwiLCBcImZpcnN0X25hbWVcIiBmcm9tIFwicGVyc29uXCIgYXMgXCJwXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmcm9tIGEgc3VicXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHBlcnNvbnMgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKFxuICAgICAqICAgICAoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdCgncGVyc29uLmlkIGFzIGlkZW50aWZpZXInKS5hcygncCcpXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0KCdwLmlkZW50aWZpZXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocGVyc29uc1swXS5pZGVudGlmaWVyKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLlwiaWRlbnRpZmllclwiLFxuICAgICAqIGZyb20gKFxuICAgICAqICAgc2VsZWN0IFwicGVyc29uXCIuXCJpZFwiIGFzIFwiaWRlbnRpZmllclwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqICkgYXMgcFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZyb20gcmF3IHNxbDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBpdGVtcyA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbShzcWw8eyBvbmU6IG51bWJlciB9PmAoc2VsZWN0IDEgYXMgb25lKWAuYXMoJ3EnKSlcbiAgICAgKiAgIC5zZWxlY3QoJ3Eub25lJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGl0ZW1zWzBdLm9uZSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInFcIi5cIm9uZVwiLFxuICAgICAqIGZyb20gKFxuICAgICAqICAgc2VsZWN0IDEgYXMgb25lXG4gICAgICogKSBhcyBxXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaGVuIHlvdSB1c2UgdGhlIGBzcWxgIHRhZyB5b3UgbmVlZCB0byBhbHNvIHByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIG9mIHRoZVxuICAgICAqIHJhdyBzbmlwcGV0IC8gcXVlcnkgc28gdGhhdCBLeXNlbHkgY2FuIGZpZ3VyZSBvdXQgd2hhdCBjb2x1bW5zIGFyZVxuICAgICAqIGF2YWlsYWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhlIGBzZWxlY3RGcm9tYCBtZXRob2QgYWxzbyBhY2NlcHRzIGFuIGFycmF5IGZvciBtdWx0aXBsZSB0YWJsZXMuIEFsbFxuICAgICAqIHRoZSBhYm92ZSBleGFtcGxlcyBjYW4gYWxzbyBiZSB1c2VkIGluIGFuIGFycmF5LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGl0ZW1zID0gYXdhaXQgZGIuc2VsZWN0RnJvbShbXG4gICAgICogICAgICdwZXJzb24gYXMgcCcsXG4gICAgICogICAgIGRiLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdCgncGV0LnNwZWNpZXMnKS5hcygnYScpLFxuICAgICAqICAgICBzcWw8eyBvbmU6IG51bWJlciB9PmAoc2VsZWN0IDEgYXMgb25lKWAuYXMoJ3EnKVxuICAgICAqICAgXSlcbiAgICAgKiAgIC5zZWxlY3QoWydwLmlkJywgJ2Euc3BlY2llcycsICdxLm9uZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLmlkLCBcImFcIi5cInNwZWNpZXNcIiwgXCJxXCIuXCJvbmVcIlxuICAgICAqIGZyb21cbiAgICAgKiAgIFwicGVyc29uXCIgYXMgXCJwXCIsXG4gICAgICogICAoc2VsZWN0IFwicGV0XCIuXCJzcGVjaWVzXCIgZnJvbSBcInBldFwiKSBhcyBhLFxuICAgICAqICAgKHNlbGVjdCAxIGFzIG9uZSkgYXMgXCJxXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzZWxlY3RGcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGVGcm9tKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KGZyb20pLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3ROb0Zyb20oc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyhTZWxlY3RRdWVyeU5vZGUuY3JlYXRlKHRoaXMuI3Byb3BzLndpdGhOb2RlKSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5zZXJ0UmVzdWx0fS4ge0BsaW5rIEluc2VydFJlc3VsdH1cbiAgICAgKiBoYXMgdGhlIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgdGhhdCBob2xkcyB0aGUgYXV0byBpbmNyZW1lbnRlZCBpZCBvZlxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cgaWYgdGhlIGRiIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci52YWx1ZXMgfCB2YWx1ZXN9IG1ldGhvZCBmb3IgbW9yZSBpbmZvIGFuZCBleGFtcGxlcy4gQWxzbyBzZWVcbiAgICAgKiB0aGUge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmcgfCByZXR1cm5pbmd9IG1ldGhvZCBmb3IgYSB3YXkgdG8gcmV0dXJuIGNvbHVtbnNcbiAgICAgKiBvbiBzdXBwb3J0ZWQgZGF0YWJhc2VzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBTb21lIGRhdGFiYXNlcyBsaWtlIFBvc3RncmVTUUwgc3VwcG9ydCB0aGUgYHJldHVybmluZ2AgbWV0aG9kOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGlkIH0gPSBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGluc2VydEludG8odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgXCJyZXBsYWNlIGludG9cIiBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMIG9yIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8gTXlTUUwncyB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLm9uRHVwbGljYXRlS2V5VXBkYXRlfSB0aGF0IGRlbGV0ZXNcbiAgICAgKiBhbmQgaW5zZXJ0cyB2YWx1ZXMgb24gY29sbGlzaW9uIGluc3RlYWQgb2YgdXBkYXRpbmcgZXhpc3Rpbmcgcm93cy5cbiAgICAgKlxuICAgICAqIEFuIGFsaWFzIG9mIFNRTGl0ZSdzIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIub3JSZXBsYWNlfS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSW5zZXJ0UmVzdWx0fS4ge0BsaW5rIEluc2VydFJlc3VsdH1cbiAgICAgKiBoYXMgdGhlIHtAbGluayBJbnNlcnRSZXN1bHQuaW5zZXJ0SWQgfCBpbnNlcnRJZH0gZmllbGQgdGhhdCBob2xkcyB0aGUgYXV0byBpbmNyZW1lbnRlZCBpZCBvZlxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cgaWYgdGhlIGRiIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci52YWx1ZXMgfCB2YWx1ZXN9IG1ldGhvZCBmb3IgbW9yZSBpbmZvIGFuZCBleGFtcGxlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnJlcGxhY2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiByZXBsYWNlIGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWApIHZhbHVlcyAoPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZXBsYWNlSW50byh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlLCB0cnVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBEZWxldGVRdWVyeUJ1aWxkZXIud2hlcmV9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvIHNwZWNpZnlcbiAgICAgKiBhIHdoZXJlIGNsYXVzZSBmb3IgdGhlIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBxdWVyeSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRGVsZXRlUmVzdWx0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImRlbGV0ZVwiLCBcIlNpbmdsZSByb3dcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogRGVsZXRlIGEgc2luZ2xlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQubnVtRGVsZXRlZFJvd3MpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBcInBlcnNvblwiIHdoZXJlIFwicGVyc29uXCIuXCJpZFwiID0gJDFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIHN1Y2ggYXMgTXlTUUwgc3VwcG9ydCBkZWxldGluZyBmcm9tIG11bHRpcGxlIHRhYmxlczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5kZWxldGVGcm9tKFsncGVyc29uJywgJ3BldCddKVxuICAgICAqICAgLnVzaW5nKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gYHBlcnNvbmAsIGBwZXRgXG4gICAgICogdXNpbmcgYHBlcnNvbmBcbiAgICAgKiBpbm5lciBqb2luIGBwZXRgIG9uIGBwZXRgLmBvd25lcl9pZGAgPSBgcGVyc29uYC5gaWRgXG4gICAgICogd2hlcmUgYHBlcnNvbmAuYGlkYCA9ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkZWxldGVGcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KGZyb20pLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIHVwZGF0ZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlci53aGVyZX0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIGEgd2hlcmUgY2xhdXNlIGZvciB0aGUgdXBkYXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIFVwZGF0ZVF1ZXJ5QnVpbGRlci5zZXR9IG1ldGhvZCBmb3IgZXhhbXBsZXMgb24gaG93IHRvXG4gICAgICogc3BlY2lmeSB0aGUgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGFuIHtAbGluayBVcGRhdGVSZXN1bHR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyB9KVxuICAgICAqICAgLndoZXJlKCdwZXJzb24uaWQnLCAnPScsIDEpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQubnVtVXBkYXRlZFJvd3MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdXBkYXRlVGFibGUodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZXMpLCB0aGlzLiNwcm9wcy53aXRoTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWVyZ2UgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBxdWVyeSBpcyBhIHtAbGluayBNZXJnZVJlc3VsdH0uXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayBNZXJnZVF1ZXJ5QnVpbGRlci51c2luZ30gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIHRoZSBvdGhlciB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcIm1lcmdlXCIsIFwiU291cmNlIHJvdyBleGlzdGVuY2VcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogVXBkYXRlIGEgdGFyZ2V0IGNvbHVtbiBiYXNlZCBvbiB0aGUgZXhpc3RlbmNlIG9mIGEgc291cmNlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3BlcnNvbiBhcyB0YXJnZXQnKVxuICAgICAqICAgLnVzaW5nKCdwZXQgYXMgc291cmNlJywgJ3NvdXJjZS5vd25lcl9pZCcsICd0YXJnZXQuaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkQW5kKCd0YXJnZXQuaGFzX3BldHMnLCAnIT0nLCAnWScpXG4gICAgICogICAudGhlblVwZGF0ZVNldCh7IGhhc19wZXRzOiAnWScgfSlcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kKCd0YXJnZXQuaGFzX3BldHMnLCAnPScsICdZJylcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KHsgaGFzX3BldHM6ICdOJyB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1DaGFuZ2VkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCJcbiAgICAgKiBvbiBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIGFuZCBcImhhc19wZXRzXCIgIT0gJDFcbiAgICAgKiB0aGVuIHVwZGF0ZSBzZXQgXCJoYXNfcGV0c1wiID0gJDJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIGJ5IHNvdXJjZSBhbmQgXCJoYXNfcGV0c1wiID0gJDNcbiAgICAgKiB0aGVuIHVwZGF0ZSBzZXQgXCJoYXNfcGV0c1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJtZXJnZVwiLCBcIlRlbXBvcmFyeSBjaGFuZ2VzIHRhYmxlXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIE1lcmdlIG5ldyBlbnRyaWVzIGZyb20gYSB0ZW1wb3JhcnkgY2hhbmdlcyB0YWJsZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3dpbmUgYXMgdGFyZ2V0JylcbiAgICAgKiAgIC51c2luZyhcbiAgICAgKiAgICAgJ3dpbmVfc3RvY2tfY2hhbmdlIGFzIHNvdXJjZScsXG4gICAgICogICAgICdzb3VyY2Uud2luZV9uYW1lJyxcbiAgICAgKiAgICAgJ3RhcmdldC5uYW1lJyxcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZEFuZCgnc291cmNlLnN0b2NrX2RlbHRhJywgJz4nLCAwKVxuICAgICAqICAgLnRoZW5JbnNlcnRWYWx1ZXMoKHsgcmVmIH0pID0+ICh7XG4gICAgICogICAgIG5hbWU6IHJlZignc291cmNlLndpbmVfbmFtZScpLFxuICAgICAqICAgICBzdG9jazogcmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSxcbiAgICAgKiAgIH0pKVxuICAgICAqICAgLndoZW5NYXRjaGVkQW5kKFxuICAgICAqICAgICAoZWIpID0+IGViKCd0YXJnZXQuc3RvY2snLCAnKycsIGViLnJlZignc291cmNlLnN0b2NrX2RlbHRhJykpLFxuICAgICAqICAgICAnPicsXG4gICAgICogICAgIDAsXG4gICAgICogICApXG4gICAgICogICAudGhlblVwZGF0ZVNldCgnc3RvY2snLCAoZWIpID0+XG4gICAgICogICAgIGViKCd0YXJnZXQuc3RvY2snLCAnKycsIGViLnJlZignc291cmNlLnN0b2NrX2RlbHRhJykpLFxuICAgICAqICAgKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRGVsZXRlKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwid2luZVwiIGFzIFwidGFyZ2V0XCJcbiAgICAgKiB1c2luZyBcIndpbmVfc3RvY2tfY2hhbmdlXCIgYXMgXCJzb3VyY2VcIlxuICAgICAqIG9uIFwic291cmNlXCIuXCJ3aW5lX25hbWVcIiA9IFwidGFyZ2V0XCIuXCJuYW1lXCJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIGFuZCBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIiA+ICQxXG4gICAgICogdGhlbiBpbnNlcnQgKFwibmFtZVwiLCBcInN0b2NrXCIpIHZhbHVlcyAoXCJzb3VyY2VcIi5cIndpbmVfbmFtZVwiLCBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIilcbiAgICAgKiB3aGVuIG1hdGNoZWQgYW5kIFwidGFyZ2V0XCIuXCJzdG9ja1wiICsgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCIgPiAkMlxuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcInN0b2NrXCIgPSBcInRhcmdldFwiLlwic3RvY2tcIiArIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiXG4gICAgICogd2hlbiBtYXRjaGVkXG4gICAgICogdGhlbiBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtZXJnZUludG8odGFyZ2V0VGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNyZWF0ZShwYXJzZUFsaWFzZWRUYWJsZSh0YXJnZXRUYWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgd2l0aGAgcXVlcnkgKENvbW1vbiBUYWJsZSBFeHByZXNzaW9uKS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImN0ZVwiLCBcIlNpbXBsZSBzZWxlY3RzXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIENvbW1vbiB0YWJsZSBleHByZXNzaW9ucyAoQ1RFKSBhcmUgYSBncmVhdCB3YXkgdG8gbW9kdWxhcml6ZSBjb21wbGV4IHF1ZXJpZXMuXG4gICAgICogRXNzZW50aWFsbHkgdGhleSBhbGxvdyB5b3UgdG8gcnVuIG11bHRpcGxlIHNlcGFyYXRlIHF1ZXJpZXMgd2l0aGluIGFcbiAgICAgKiBzaW5nbGUgcm91bmR0cmlwIHRvIHRoZSBEQi5cbiAgICAgKlxuICAgICAqIFNpbmNlIENURXMgYXJlIGEgcGFydCBvZiB0aGUgbWFpbiBxdWVyeSwgcXVlcnkgb3B0aW1pemVycyBpbnNpZGUgREJcbiAgICAgKiBlbmdpbmVzIGFyZSBhYmxlIHRvIG9wdGltaXplIHRoZSBvdmVyYWxsIHF1ZXJ5LiBGb3IgZXhhbXBsZSwgcG9zdGdyZXNcbiAgICAgKiBpcyBhYmxlIHRvIGlubGluZSB0aGUgQ1RFcyBpbnNpZGUgdGhlIHVzaW5nIHF1ZXJpZXMgaWYgaXQgZGVjaWRlcyBpdCdzXG4gICAgICogZmFzdGVyLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLy8gQ3JlYXRlIGEgQ1RFIGNhbGxlZCBgamVubmlmZXJzYCB0aGF0IHNlbGVjdHMgYWxsXG4gICAgICogICAvLyBwZXJzb25zIG5hbWVkICdKZW5uaWZlcicuXG4gICAgICogICAud2l0aCgnamVubmlmZXJzJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAvLyBTZWxlY3QgYWxsIHJvd3MgZnJvbSB0aGUgYGplbm5pZmVyc2AgQ1RFIGFuZFxuICAgICAqICAgLy8gZnVydGhlciBmaWx0ZXIgaXQuXG4gICAgICogICAud2l0aCgnYWR1bHRfamVubmlmZXJzJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgnamVubmlmZXJzJylcbiAgICAgKiAgICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAvLyBGaW5hbGx5IHNlbGVjdCBhbGwgYWR1bHQgamVubmlmZXJzIHRoYXQgYXJlXG4gICAgICogICAvLyBhbHNvIHlvdW5nZXIgdGhhbiA2MC5cbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdhZHVsdF9qZW5uaWZlcnMnKVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPCcsIDYwKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiY3RlXCIsIFwiSW5zZXJ0cywgdXBkYXRlcyBhbmQgZGVsZXRpb25zXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIGxpa2UgcG9zdGdyZXMgYWxzbyBhbGxvdyB5b3UgdG8gcnVuIG90aGVyIHF1ZXJpZXMgdGhhbiBzZWxlY3RzXG4gICAgICogaW4gQ1RFcy4gT24gdGhlc2UgZGF0YWJhc2VzIENURXMgYXJlIGV4dHJlbWVseSBwb3dlcmZ1bDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKCduZXdfcGVyc29uJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgICBhZ2U6IDM1LFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICApXG4gICAgICogICAud2l0aCgnbmV3X3BldCcsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIG5hbWU6ICdEb2dnbycsXG4gICAgICogICAgICAgc3BlY2llczogJ2RvZycsXG4gICAgICogICAgICAgaXNfZmF2b3JpdGU6IHRydWUsXG4gICAgICogICAgICAgLy8gVXNlIHRoZSBpZCBvZiB0aGUgcGVyc29uIHdlIGp1c3QgaW5zZXJ0ZWQuXG4gICAgICogICAgICAgb3duZXJfaWQ6IGRiXG4gICAgICogICAgICAgICAuc2VsZWN0RnJvbSgnbmV3X3BlcnNvbicpXG4gICAgICogICAgICAgICAuc2VsZWN0KCdpZCcpXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKFsnbmV3X3BlcnNvbicsICduZXdfcGV0J10pXG4gICAgICogICAuc2VsZWN0KFtcbiAgICAgKiAgICAgJ25ld19wZXJzb24uaWQgYXMgcGVyc29uX2lkJyxcbiAgICAgKiAgICAgJ25ld19wZXQuaWQgYXMgcGV0X2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBDVEUgbmFtZSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGNvbHVtbiBuYW1lcyBpbiBhZGRpdGlvbiB0b1xuICAgICAqIGEgbmFtZS4gSW4gdGhhdCBjYXNlIEt5c2VseSByZXF1aXJlcyB0aGUgZXhwcmVzc2lvbiB0byByZXR1blxuICAgICAqIHJvd3Mgd2l0aCB0aGUgc2FtZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoJ2plbm5pZmVycyhpZCwgYWdlKScsIChkYikgPT4gZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgICAgLy8gVGhpcyBpcyBvayBzaW5jZSB3ZSByZXR1cm4gY29sdW1ucyB3aXRoIHRoZSBzYW1lXG4gICAgICogICAgIC8vIG5hbWVzIGFzIHNwZWNpZmllZCBieSBgamVubmlmZXJzKGlkLCBhZ2UpYC5cbiAgICAgKiAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ2plbm5pZmVycycpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBmaXJzdCBhcmd1bWVudCBjYW4gYWxzbyBiZSBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgaXMgcGFzc2VkXG4gICAgICogYSBgQ1RFQnVpbGRlcmAgaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIENURTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKFxuICAgICAqICAgICAoY3RlKSA9PiBjdGUoJ2plbm5pZmVycycpLm1hdGVyaWFsaXplZCgpLFxuICAgICAqICAgICAoZGIpID0+IGRiXG4gICAgICogICAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdqZW5uaWZlcnMnKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgd2l0aChuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGN0ZSA9IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHdpdGhOb2RlOiB0aGlzLiNwcm9wcy53aXRoTm9kZVxuICAgICAgICAgICAgICAgID8gV2l0aE5vZGUuY2xvbmVXaXRoRXhwcmVzc2lvbih0aGlzLiNwcm9wcy53aXRoTm9kZSwgY3RlKVxuICAgICAgICAgICAgICAgIDogV2l0aE5vZGUuY3JlYXRlKGN0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVjdXJzaXZlIGB3aXRoYCBxdWVyeSAoQ29tbW9uIFRhYmxlIEV4cHJlc3Npb24pLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHJlY3Vyc2l2ZW5lc3MgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgd2hvbGUgYHdpdGhgIHN0YXRlbWVudC5cbiAgICAgKiBZb3UgY2Fubm90IGhhdmUgcmVjdXJzaXZlIGFuZCBub24tcmVjdXJzaXZlIENURXMgaW4gYSBzYW1lIGB3aXRoYCBzdGF0ZW1lbnQuXG4gICAgICogVGhlcmVmb3JlIHRoZSByZWN1cnNpdmVuZXNzIGlzIGRldGVybWluZWQgYnkgdGhlICoqZmlyc3QqKiBgd2l0aGAgb3JcbiAgICAgKiBgd2l0aFJlY3VzaXZlYCBjYWxsIHlvdSBtYWtlLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgd2l0aH0gbWV0aG9kIGZvciBleGFtcGxlcyBhbmQgbW9yZSBkb2N1bWVudGF0aW9uLlxuICAgICAqL1xuICAgIHdpdGhSZWN1cnNpdmUobmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbikge1xuICAgICAgICBjb25zdCBjdGUgPSBwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbihuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKTtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICB3aXRoTm9kZTogdGhpcy4jcHJvcHMud2l0aE5vZGVcbiAgICAgICAgICAgICAgICA/IFdpdGhOb2RlLmNsb25lV2l0aEV4cHJlc3Npb24odGhpcy4jcHJvcHMud2l0aE5vZGUsIGN0ZSlcbiAgICAgICAgICAgICAgICA6IFdpdGhOb2RlLmNyZWF0ZShjdGUsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBxdWVyeSBjcmVhdG9yIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBxdWVyeSBjcmVhdG9yIGluc3RhbmNlIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzY2hlbWEgdG8gYmUgdXNlZCBmb3IgYWxsIHRhYmxlIHJlZmVyZW5jZXMgdGhhdCBkb24ndCBleHBsaWNpdGx5XG4gICAgICogc3BlY2lmeSBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSBhZmZlY3RzIHRoZSBxdWVyeSBjcmVhdGVkIHRocm91Z2ggdGhlIGJ1aWxkZXIgcmV0dXJuZWQgZnJvbVxuICAgICAqIHRoaXMgbWV0aG9kIGFuZCBkb2Vzbid0IG1vZGlmeSB0aGUgYGRiYCBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIFNlZSBbdGhpcyByZWNpcGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9reXNlbHktb3JnL2t5c2VseS9ibG9iL21hc3Rlci9zaXRlL2RvY3MvcmVjaXBlcy8wMDA3LXNjaGVtYXMubWQpXG4gICAgICogZm9yIGEgbW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoU2NoZW1hKCdtYW1tYWxzJylcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXQnKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuaW5uZXJKb2luKCdwdWJsaWMucGVyc29uJywgJ3B1YmxpYy5wZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCAqIGZyb20gXCJtYW1tYWxzXCIuXCJwZXRcIlxuICAgICAqIGlubmVyIGpvaW4gXCJwdWJsaWNcIi5cInBlcnNvblwiXG4gICAgICogb24gXCJwdWJsaWNcIi5cInBlcnNvblwiLlwiaWRcIiA9IFwibWFtbWFsc1wiLlwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgd2l0aFNjaGVtYWAgaXMgc21hcnQgZW5vdWdoIHRvIG5vdCBhZGQgc2NoZW1hIGZvciBhbGlhc2VzLFxuICAgICAqIGNvbW1vbiB0YWJsZSBleHByZXNzaW9ucyBvciBvdGhlciBwbGFjZXMgd2hlcmUgdGhlIHNjaGVtYVxuICAgICAqIGRvZXNuJ3QgYmVsb25nIHRvOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoU2NoZW1hKCdtYW1tYWxzJylcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXQgYXMgcCcpXG4gICAgICogICAuc2VsZWN0KCdwLm5hbWUnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicFwiLlwibmFtZVwiIGZyb20gXCJtYW1tYWxzXCIuXCJwZXRcIiBhcyBcInBcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnNlLXV0aWxzLmQudHNcIiAvPlxuaW1wb3J0IHsgSm9pbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qb2luLW5vZGUuanMnO1xuaW1wb3J0IHsgT3Zlck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vdmVyLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgSm9pbkJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2pvaW4tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBPdmVyQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvb3Zlci1idWlsZGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciBhcyBuZXdTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9zZWxlY3QtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuLi9xdWVyeS1jcmVhdG9yLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKCkge1xuICAgIHJldHVybiBuZXdTZWxlY3RRdWVyeUJ1aWxkZXIoe1xuICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgIGV4ZWN1dG9yOiBOT09QX1FVRVJZX0VYRUNVVE9SLFxuICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGVGcm9tKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KFtdKSksXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUXVlcnlDcmVhdG9yKCkge1xuICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgZXhlY3V0b3I6IE5PT1BfUVVFUllfRVhFQ1VUT1IsXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSm9pbkJ1aWxkZXIoam9pblR5cGUsIHRhYmxlKSB7XG4gICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jcmVhdGUoam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKSksXG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3ZlckJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBPdmVyQnVpbGRlcih7XG4gICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jcmVhdGUoKSxcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vam9pbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIH0gZnJvbSAnLi9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVKb2luQnVpbGRlciB9IGZyb20gJy4vcGFyc2UtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb24sIH0gZnJvbSAnLi90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICByZXR1cm4gcGFyc2VTaW5nbGVPbkpvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VPbmxlc3NKb2luKGpvaW5UeXBlLCBhcmdzWzBdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VDYWxsYmFja0pvaW4oam9pblR5cGUsIGZyb20sIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGNyZWF0ZUpvaW5CdWlsZGVyKGpvaW5UeXBlLCBmcm9tKSkudG9PcGVyYXRpb25Ob2RlKCk7XG59XG5mdW5jdGlvbiBwYXJzZVNpbmdsZU9uSm9pbihqb2luVHlwZSwgZnJvbSwgbGhzQ29sdW1uLCByaHNDb2x1bW4pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlV2l0aE9uKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHNDb2x1bW4sICc9JywgcmhzQ29sdW1uKSk7XG59XG5mdW5jdGlvbiBwYXJzZU9ubGVzc0pvaW4oam9pblR5cGUsIGZyb20pIHtcbiAgICByZXR1cm4gSm9pbk5vZGUuY3JlYXRlKGpvaW5UeXBlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbihmcm9tKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29mZnNldC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9mZnNldE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09mZnNldE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPZmZzZXROb2RlJyxcbiAgICAgICAgICAgIG9mZnNldCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgR3JvdXBCeUl0ZW1Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdHcm91cEJ5SXRlbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIGdyb3VwQnksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ3JvdXAtYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgR3JvdXBCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdyb3VwQnkoZ3JvdXBCeSkge1xuICAgIGdyb3VwQnkgPSBpc0Z1bmN0aW9uKGdyb3VwQnkpID8gZ3JvdXBCeShleHByZXNzaW9uQnVpbGRlcigpKSA6IGdyb3VwQnk7XG4gICAgcmV0dXJuIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChncm91cEJ5KS5tYXAoR3JvdXBCeUl0ZW1Ob2RlLmNyZWF0ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NldC1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZXRPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZXRPcGVyYXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvciwgZXhwcmVzc2lvbiwgYWxsKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NldE9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgYWxsLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NldC1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgU2V0T3BlcmF0aW9uTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZXQtb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNSZWFkb25seUFycmF5IH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZXRPcGVyYXRpb25zKG9wZXJhdG9yLCBleHByZXNzaW9uLCBhbGwpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihleHByZXNzaW9uKSkge1xuICAgICAgICBleHByZXNzaW9uID0gZXhwcmVzc2lvbihjcmVhdGVFeHByZXNzaW9uQnVpbGRlcigpKTtcbiAgICB9XG4gICAgaWYgKCFpc1JlYWRvbmx5QXJyYXkoZXhwcmVzc2lvbikpIHtcbiAgICAgICAgZXhwcmVzc2lvbiA9IFtleHByZXNzaW9uXTtcbiAgICB9XG4gICAgcmV0dXJuIGV4cHJlc3Npb24ubWFwKChleHByKSA9PiBTZXRPcGVyYXRpb25Ob2RlLmNyZWF0ZShvcGVyYXRvciwgcGFyc2VFeHByZXNzaW9uKGV4cHIpLCBhbGwpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwcmVzc2lvbi13cmFwcGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IE9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBFeHByZXNzaW9uV3JhcHBlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIoT3JOb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIGFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5kV3JhcHBlcihBbmROb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEV4cHJlc3Npb25XcmFwcGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9taXQgbnVsbCBmcm9tIHRoZSBleHByZXNzaW9uJ3MgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Uga25vdyBhbiBleHByZXNzaW9uIGNhbid0IGJlXG4gICAgICogbnVsbCwgYnV0IEt5c2VseSBpcyB1bmFibGUgdG8gaW5mZXIgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHRoaXMuI25vZGUpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIge1xuICAgICNleHByO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3RvcihleHByLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNleHByID0gZXhwcjtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleHByO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNleHByLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPcldyYXBwZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBvciguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JXcmFwcGVyKE9yTm9kZS5jcmVhdGUodGhpcy4jbm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBPcldyYXBwZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIFBhcmVuc05vZGUuY3JlYXRlKHRoaXMuI25vZGUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbmRXcmFwcGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgYW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmRXcmFwcGVyKEFuZE5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgQW5kV3JhcHBlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFuZFdyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIFBhcmVuc05vZGUuY3JlYXRlKHRoaXMuI25vZGUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZmV0Y2gtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4vdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRmV0Y2hOb2RlID0ge1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0ZldGNoTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocm93Q291bnQsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBraW5kOiAnRmV0Y2hOb2RlJyxcbiAgICAgICAgICAgIHJvd0NvdW50OiBWYWx1ZU5vZGUuY3JlYXRlKHJvd0NvdW50KSxcbiAgICAgICAgICAgIG1vZGlmaWVyLFxuICAgICAgICB9O1xuICAgIH0sXG59O1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mZXRjaC1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBGZXRjaE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzJztcbmltcG9ydCB7IGlzQmlnSW50LCBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZldGNoKHJvd0NvdW50LCBtb2RpZmllcikge1xuICAgIGlmICghaXNOdW1iZXIocm93Q291bnQpICYmICFpc0JpZ0ludChyb3dDb3VudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZldGNoIHJvdyBjb3VudDogJHtyb3dDb3VudH1gKTtcbiAgICB9XG4gICAgaWYgKCFpc0ZldGNoTW9kaWZpZXIobW9kaWZpZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmZXRjaCBtb2RpZmllcjogJHttb2RpZmllcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIEZldGNoTm9kZS5jcmVhdGUocm93Q291bnQsIG1vZGlmaWVyKTtcbn1cbmZ1bmN0aW9uIGlzRmV0Y2hNb2RpZmllcih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gJ29ubHknIHx8IHZhbHVlID09PSAnd2l0aCB0aWVzJztcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdE1vZGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1tb2RpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIHBhcnNlU2VsZWN0QWxsLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IExpbWl0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMnO1xuaW1wb3J0IHsgT2Zmc2V0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29mZnNldC1ub2RlLmpzJztcbmltcG9ydCB7IGFzQXJyYXksIGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlR3JvdXBCeSB9IGZyb20gJy4uL3BhcnNlci9ncm91cC1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IsIE5vUmVzdWx0RXJyb3IsIH0gZnJvbSAnLi9uby1yZXN1bHQtZXJyb3IuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VTZXRPcGVyYXRpb25zLCB9IGZyb20gJy4uL3BhcnNlci9zZXQtb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VGZXRjaCB9IGZyb20gJy4uL3BhcnNlci9mZXRjaC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5jbGFzcyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBpc1NlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYXZpbmcoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhIYXZpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhdmluZ1JlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoSGF2aW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbGVjdChzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGlzdGluY3RPbihzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRGlzdGluY3RPbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUZyb250KG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlV2l0aEV4cHJlc3Npb24obW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdEaXN0aW5jdCcpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvclVwZGF0ZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0ZvclVwZGF0ZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3JTaGFyZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0ZvclNoYXJlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvcktleVNoYXJlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yS2V5U2hhcmUnLCBvZiA/IGFzQXJyYXkob2YpLm1hcChwYXJzZVRhYmxlKSA6IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yTm9LZXlVcGRhdGUob2YpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdGb3JOb0tleVVwZGF0ZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBza2lwTG9ja2VkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ1NraXBMb2NrZWQnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub1dhaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnTm9XYWl0JykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNlbGVjdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGNyb3NzSm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdDcm9zc0pvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgaW5uZXJKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsTGVmdEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NKb2luTGF0ZXJhbCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMYXRlcmFsQ3Jvc3NKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGNyb3NzQXBwbHkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignQ3Jvc3NBcHBseScsIGFyZ3MpO1xuICAgIH1cbiAgICBvdXRlckFwcGx5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ091dGVyQXBwbHknLCBhcmdzKTtcbiAgICB9XG4gICAgI2pvaW4oam9pblR5cGUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBncm91cEJ5KGdyb3VwQnkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoR3JvdXBCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VHcm91cEJ5KGdyb3VwQnkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgTGltaXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihsaW1pdCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9mZnNldChvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoT2Zmc2V0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgT2Zmc2V0Tm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24ob2Zmc2V0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmV0Y2gocm93Q291bnQsIG1vZGlmaWVyID0gJ29ubHknKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEZldGNoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VGZXRjaChyb3dDb3VudCwgbW9kaWZpZXIpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bmlvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ3VuaW9uJywgZXhwcmVzc2lvbiwgZmFsc2UpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW9uQWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygndW5pb24nLCBleHByZXNzaW9uLCB0cnVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcnNlY3QoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdpbnRlcnNlY3QnLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW50ZXJzZWN0QWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnaW50ZXJzZWN0JywgZXhwcmVzc2lvbiwgdHJ1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjZXB0KGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnZXhjZXB0JywgZXhwcmVzc2lvbiwgZmFsc2UpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4Y2VwdEFsbChleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ2V4Y2VwdCcsIGV4cHJlc3Npb24sIHRydWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBjbGVhclNlbGVjdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0U2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyTGltaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aG91dExpbWl0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0T2Zmc2V0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyR3JvdXBCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0R3JvdXBCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAkbmFycm93VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgJGFzc2VydFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgICRhc1R1cGxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgIH1cbiAgICAkYXNTY2FsYXIoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0T3JUaHJvdyhlcnJvckNvbnN0cnVjdG9yID0gTm9SZXN1bHRFcnJvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVUYWtlRmlyc3QoKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yKGVycm9yQ29uc3RydWN0b3IpXG4gICAgICAgICAgICAgICAgPyBuZXcgZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKVxuICAgICAgICAgICAgICAgIDogZXJyb3JDb25zdHJ1Y3Rvcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW0oY2h1bmtTaXplID0gMTAwKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iuc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSk7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBzdHJlYW0pIHtcbiAgICAgICAgICAgIHlpZWxkKiBpdGVtLnJvd3M7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZXhwbGFpbihmb3JtYXQsIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcihwcm9wcykge1xuICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbChwcm9wcyk7XG59XG4vKipcbiAqIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXJ9IHdpdGggYW4gYWxpYXMuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLmFzfS5cbiAqL1xuY2xhc3MgQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwge1xuICAgICNxdWVyeUJ1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5QnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jcXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3F1ZXJ5QnVpbGRlcjtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGdldCBpc0FsaWFzZWRTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI3F1ZXJ5QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFdoZXJlTm9kZSB9IGZyb20gJy4vd2hlcmUtbm9kZS5qcyc7XG5pbXBvcnQgeyBPcmRlckJ5Tm9kZSB9IGZyb20gJy4vb3JkZXItYnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWdncmVnYXRlRnVuY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGFnZ3JlZ2F0ZUZ1bmN0aW9uLCBhZ2dyZWdhdGVkID0gW10pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWdncmVnYXRlRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmM6IGFnZ3JlZ2F0ZUZ1bmN0aW9uLFxuICAgICAgICAgICAgYWdncmVnYXRlZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhEaXN0aW5jdChhZ2dyZWdhdGVGdW5jdGlvbk5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBkaXN0aW5jdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5KGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgb3JkZXJJdGVtcywgd2l0aGluR3JvdXAgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBwcm9wID0gd2l0aGluR3JvdXAgPyAnd2l0aGluR3JvdXAnIDogJ29yZGVyQnknO1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIFtwcm9wXTogYWdncmVnYXRlRnVuY3Rpb25Ob2RlW3Byb3BdXG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhhZ2dyZWdhdGVGdW5jdGlvbk5vZGVbcHJvcF0sIG9yZGVySXRlbXMpXG4gICAgICAgICAgICAgICAgOiBPcmRlckJ5Tm9kZS5jcmVhdGUob3JkZXJJdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRmlsdGVyKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgZmlsdGVyOiBhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXIsICdBbmQnLCBmaWx0ZXIpXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKGZpbHRlciksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3JGaWx0ZXIoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBmaWx0ZXI6IGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXJcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlciwgJ09yJywgZmlsdGVyKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShmaWx0ZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE92ZXIoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBvdmVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgb3ZlcixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mdW5jdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZ1bmN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRnVuY3Rpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShmdW5jLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Z1bmN0aW9uTm9kZScsXG4gICAgICAgICAgICBmdW5jLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVPdmVyQnVpbGRlciB9IGZyb20gJy4uL3BhcnNlci9wYXJzZS11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZU9yZGVyQnksIH0gZnJvbSAnLi4vcGFyc2VyL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhbGlhc2VkIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gc2xhcHBpbmcgYGFzIFwidGhlX2FsaWFzXCJgIHRvIHRoZSBlbmQgb2YgdGhlIFNRTCxcbiAgICAgKiB0aGlzIG1ldGhvZCBhbHNvIHByb3ZpZGVzIHN0cmljdCB0eXBpbmc6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoXG4gICAgICogICAgIChlYikgPT4gZWIuZm4uY291bnQ8bnVtYmVyPignaWQnKS5hcygncGVyc29uX2NvdW50JylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiAvLyBgcGVyc29uX2NvdW50OiBudW1iZXJgIGZpZWxkIGV4aXN0cyBpbiB0aGUgcmVzdWx0IHR5cGUuXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0LnBlcnNvbl9jb3VudClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBjb3VudChcImlkXCIpIGFzIFwicGVyc29uX2NvdW50XCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYGRpc3RpbmN0YCBjbGF1c2UgaW5zaWRlIHRoZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KChlYikgPT5cbiAgICAgKiAgICAgZWIuZm4uY291bnQ8bnVtYmVyPignZmlyc3RfbmFtZScpLmRpc3RpbmN0KCkuYXMoJ2ZpcnN0X25hbWVfY291bnQnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBjb3VudChkaXN0aW5jdCBcImZpcnN0X25hbWVcIikgYXMgXCJmaXJzdF9uYW1lX2NvdW50XCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jbG9uZVdpdGhEaXN0aW5jdCh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoaW5Hcm91cE9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aE9yZGVyQnkodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZU9yZGVyQnkoYXJncyksIHRydWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZmlsdGVyV2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aEZpbHRlcih0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGBmaWx0ZXJgIGNsYXVzZSB3aXRoIGEgbmVzdGVkIGB3aGVyZWAgY2xhdXNlIGFmdGVyIHRoZSBmdW5jdGlvbiwgd2hlcmVcbiAgICAgKiBib3RoIHNpZGVzIG9mIHRoZSBvcGVyYXRvciBhcmUgcmVmZXJlbmNlcyB0byBjb2x1bW5zLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgV2hlcmVJbnRlcmZhY2V9J3MgYHdoZXJlUmVmYCBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIENvdW50IHBlb3BsZSB3aXRoIHNhbWUgZmlyc3QgYW5kIGxhc3QgbmFtZXMgdmVyc3VzIGdlbmVyYWwgcHVibGljOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAqICAgICBlYi5mblxuICAgICAqICAgICAgIC5jb3VudDxudW1iZXI+KCdpZCcpXG4gICAgICogICAgICAgLmZpbHRlcldoZXJlUmVmKCdmaXJzdF9uYW1lJywgJz0nLCAnbGFzdF9uYW1lJylcbiAgICAgKiAgICAgICAuYXMoJ3JlcGVhdF9uYW1lX2NvdW50JyksXG4gICAgICogICAgIGViLmZuLmNvdW50PG51bWJlcj4oJ2lkJykuYXMoJ3RvdGFsX2NvdW50JyksXG4gICAgICogICBdKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdFxuICAgICAqICAgY291bnQoXCJpZFwiKSBmaWx0ZXIod2hlcmUgXCJmaXJzdF9uYW1lXCIgPSBcImxhc3RfbmFtZVwiKSBhcyBcInJlcGVhdF9uYW1lX2NvdW50XCIsXG4gICAgICogICBjb3VudChcImlkXCIpIGFzIFwidG90YWxfY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGZpbHRlcldoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aEZpbHRlcih0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvdmVyYCBjbGF1c2UgKHdpbmRvdyBmdW5jdGlvbnMpIGFmdGVyIHRoZSBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KFxuICAgICAqICAgICAoZWIpID0+IGViLmZuLmF2ZzxudW1iZXI+KCdhZ2UnKS5vdmVyKCkuYXMoJ2F2ZXJhZ2VfYWdlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBhdmcoXCJhZ2VcIikgb3ZlcigpIGFzIFwiYXZlcmFnZV9hZ2VcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQWxzbyBzdXBwb3J0cyBwYXNzaW5nIGEgY2FsbGJhY2sgdGhhdCByZXR1cm5zIGFuIG92ZXIgYnVpbGRlcixcbiAgICAgKiBhbGxvd2luZyB0byBhZGQgcGFydGl0aW9uIGJ5IGFuZCBzb3J0IGJ5IGNsYXVzZXMgaW5zaWRlIG92ZXIuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoXG4gICAgICogICAgIChlYikgPT4gZWIuZm4uYXZnPG51bWJlcj4oJ2FnZScpLm92ZXIoXG4gICAgICogICAgICAgb2IgPT4gb2IucGFydGl0aW9uQnkoJ2xhc3RfbmFtZScpLm9yZGVyQnkoJ2ZpcnN0X25hbWUnLCAnYXNjJylcbiAgICAgKiAgICAgKS5hcygnYXZlcmFnZV9hZ2UnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGF2ZyhcImFnZVwiKSBvdmVyKHBhcnRpdGlvbiBieSBcImxhc3RfbmFtZVwiIG9yZGVyIGJ5IFwiZmlyc3RfbmFtZVwiIGFzYykgYXMgXCJhdmVyYWdlX2FnZVwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3ZlcihvdmVyKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjcmVhdGVPdmVyQnVpbGRlcigpO1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aE92ZXIodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCAob3ZlciA/IG92ZXIoYnVpbGRlcikgOiBidWlsZGVyKS50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhc3RzIHRoZSBleHByZXNzaW9uIHRvIHRoZSBnaXZlbiB0eXBlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbWl0IG51bGwgZnJvbSB0aGUgZXhwcmVzc2lvbidzIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgeW91IGtub3cgYW4gZXhwcmVzc2lvbiBjYW4ndCBiZVxuICAgICAqIG51bGwsIGJ1dCBLeXNlbHkgaXMgdW5hYmxlIHRvIGluZmVyIGl0LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiBgdGhpc2Agd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkbm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGU7XG4gICAgfVxufVxuLyoqXG4gKiB7QGxpbmsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyfSB3aXRoIGFuIGFsaWFzLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcge0BsaW5rIEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlci5hc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBBbGlhc2VkQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIHtcbiAgICAjYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3RvcihhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciA9IGFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcjtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXI7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mdW5jdGlvbi1tb2R1bGUuZC50c1wiIC8+XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IEZ1bmN0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QWxsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hZ2dyZWdhdGUtZnVuY3Rpb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbk1vZHVsZSgpIHtcbiAgICBjb25zdCBmbiA9IChuYW1lLCBhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoRnVuY3Rpb25Ob2RlLmNyZWF0ZShuYW1lLCBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJncyA/PyBbXSkpKTtcbiAgICB9O1xuICAgIGNvbnN0IGFnZyA9IChuYW1lLCBhcmdzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZShuYW1lLCBhcmdzID8gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KGFyZ3MpIDogdW5kZWZpbmVkKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihmbiwge1xuICAgICAgICBhZ2csXG4gICAgICAgIGF2Zyhjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ2F2ZycsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29hbGVzY2UoLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oJ2NvYWxlc2NlJywgdmFsdWVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgY291bnQoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdjb3VudCcsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgY291bnRBbGwodGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5jcmVhdGUoJ2NvdW50JywgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtYXgoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdtYXgnLCBbY29sdW1uXSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1pbihjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ21pbicsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VtKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnc3VtJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBhbnkoY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4oJ2FueScsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAganNvbkFnZyh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZSgnanNvbl9hZ2cnLCBbXG4gICAgICAgICAgICAgICAgICAgIGlzU3RyaW5nKHRhYmxlKSA/IHBhcnNlVGFibGUodGFibGUpIDogdGFibGUudG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9Kc29uKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEZ1bmN0aW9uTm9kZS5jcmVhdGUoJ3RvX2pzb24nLCBbXG4gICAgICAgICAgICAgICAgaXNTdHJpbmcodGFibGUpID8gcGFyc2VUYWJsZSh0YWJsZSkgOiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgIF0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5hcnktb3BlcmF0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVW5hcnlPcGVyYXRpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdVbmFyeU9wZXJhdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yLCBvcGVyYW5kKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VuYXJ5T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIG9wZXJhbmQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5hcnktb3BlcmF0aW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE9wZXJhdG9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgVW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeGlzdHMob3BlcmFuZCkge1xuICAgIHJldHVybiBwYXJzZVVuYXJ5T3BlcmF0aW9uKCdleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vdEV4aXN0cyhvcGVyYW5kKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5hcnlPcGVyYXRpb24oJ25vdCBleGlzdHMnLCBvcGVyYW5kKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuYXJ5T3BlcmF0aW9uKG9wZXJhdG9yLCBvcGVyYW5kKSB7XG4gICAgcmV0dXJuIFVuYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihvcGVyYW5kKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc2Utbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi93aGVuLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDYXNlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoV2hlbihjYXNlTm9kZSwgd2hlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgd2hlbjogZnJlZXplKGNhc2VOb2RlLndoZW4gPyBbLi4uY2FzZU5vZGUud2hlbiwgd2hlbl0gOiBbd2hlbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRoZW4oY2FzZU5vZGUsIHRoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jYXNlTm9kZSxcbiAgICAgICAgICAgIHdoZW46IGNhc2VOb2RlLndoZW5cbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbXG4gICAgICAgICAgICAgICAgICAgIC4uLmNhc2VOb2RlLndoZW4uc2xpY2UoMCwgLTEpLFxuICAgICAgICAgICAgICAgICAgICBXaGVuTm9kZS5jbG9uZVdpdGhSZXN1bHQoY2FzZU5vZGUud2hlbltjYXNlTm9kZS53aGVuLmxlbmd0aCAtIDFdLCB0aGVuKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjYXNlTm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jYXNlTm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc2UtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ2FzZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXNlLW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS93aGVuLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlLCBwYXJzZVZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBDYXNlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVRoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5ub2RlLCBXaGVuTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ2FzZVRoZW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB0aGVuKHZhbHVlRXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VXaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFRoZW4odGhpcy4jcHJvcHMubm9kZSwgaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgID8gcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlV2hlbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IENhc2VUaGVuQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aFdoZW4odGhpcy4jcHJvcHMubm9kZSwgV2hlbk5vZGUuY3JlYXRlKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UodmFsdWVFeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZUVuZEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGVsc2U6IGlzU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgPyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgICAgIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWVFeHByZXNzaW9uKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlRW5kQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgZW5kKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlzU3RhdGVtZW50OiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGVuZENhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLWxlZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05QYXRoTGVnTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlBhdGhMZWdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0eXBlLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aExlZ05vZGUnLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcGF0aC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OT3BlcmF0b3JDaGFpbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLW9wZXJhdG9yLWNoYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhMZWdOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1sZWctbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUmVmZXJlbmNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEpTT05QYXRoQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWNjZXNzIGFuIGVsZW1lbnQgb2YgYSBKU09OIGFycmF5IGluIGEgc3BlY2lmaWMgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBTaW5jZSB0aGVyZSdzIG5vIGd1YXJhbnRlZSBhbiBlbGVtZW50IGV4aXN0cyBpbiB0aGUgZ2l2ZW4gYXJyYXkgbG9jYXRpb24sIHRoZVxuICAgICAqIHJlc3VsdGluZyB0eXBlIGlzIGFsd2F5cyBudWxsYWJsZS4gSWYgeW91J3JlIHN1cmUgdGhlIGVsZW1lbnQgZXhpc3RzLCB5b3VcbiAgICAgKiBzaG91bGQgdXNlIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIuJGFzc2VydFR5cGV9IHRvIG5hcnJvdyB0aGUgdHlwZSBzYWZlbHkuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbyB7QGxpbmsga2V5fSB0byBhY2Nlc3MgcHJvcGVydGllcyBvZiBKU09OIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoZWIgPT5cbiAgICAgKiAgICAgZWIucmVmKCduaWNrbmFtZXMnLCAnLT4nKS5hdCgwKS5hcygncHJpbWFyeV9uaWNrbmFtZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJuaWNrbmFtZXNcIi0+MCBhcyBcInByaW1hcnlfbmlja25hbWVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKmBgYFxuICAgICAqXG4gICAgICogQ29tYmluZWQgd2l0aCB7QGxpbmsga2V5fTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ2V4cGVyaWVuY2UnLCAnLT4nKS5hdCgwKS5rZXkoJ3JvbGUnKS5hcygnZmlyc3Rfcm9sZScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwiZXhwZXJpZW5jZVwiLT4wLT4ncm9sZScgYXMgXCJmaXJzdF9yb2xlXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHVzZSBgJ2xhc3QnYCB0byBhY2Nlc3MgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgaW4gTXlTUUw6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCduaWNrbmFtZXMnLCAnLT4kJykuYXQoJ2xhc3QnKS5hcygnbGFzdF9uaWNrbmFtZScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBgbmlja25hbWVzYC0+JyRbbGFzdF0nIGFzIGBsYXN0X25pY2tuYW1lYCBmcm9tIGBwZXJzb25gXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBPciBgJyMtMSdgIGluIFNRTGl0ZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ25pY2tuYW1lcycsICctPj4kJykuYXQoJyMtMScpLmFzKCdsYXN0X25pY2tuYW1lJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcIm5pY2tuYW1lc1wiLT4+JyRbIy0xXScgYXMgYGxhc3Rfbmlja25hbWVgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKCdBcnJheUxvY2F0aW9uJywgaW5kZXgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgYSBwcm9wZXJ0eSBvZiBhIEpTT04gb2JqZWN0LlxuICAgICAqXG4gICAgICogSWYgYSBmaWVsZCBpcyBvcHRpb25hbCwgdGhlIHJlc3VsdGluZyB0eXBlIHdpbGwgYmUgbnVsbGFibGUuXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbyB7QGxpbmsgYXR9IHRvIGFjY2VzcyBlbGVtZW50cyBvZiBKU09OIGFycmF5cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignYWRkcmVzcycsICctPicpLmtleSgnY2l0eScpLmFzKCdjaXR5JylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJhZGRyZXNzXCItPidjaXR5JyBhcyBcImNpdHlcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEdvaW5nIGRlZXBlcjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ3Byb2ZpbGUnLCAnLT4kJykua2V5KCd3ZWJzaXRlJykua2V5KCd1cmwnKS5hcygnd2Vic2l0ZV91cmwnKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYHByb2ZpbGVgLT4nJC53ZWJzaXRlLnVybCcgYXMgYHdlYnNpdGVfdXJsYCBmcm9tIGBwZXJzb25gXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDb21iaW5lZCB3aXRoIHtAbGluayBhdH06XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCdwcm9maWxlJywgJy0+Jykua2V5KCdhZGRyZXNzZXMnKS5hdCgwKS5rZXkoJ2NpdHknKS5hcygnY2l0eScpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicHJvZmlsZVwiLT4nYWRkcmVzc2VzJy0+MC0+J2NpdHknIGFzIFwiY2l0eVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGtleShrZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NyZWF0ZUJ1aWxkZXJXaXRoUGF0aExlZygnTWVtYmVyJywga2V5KTtcbiAgICB9XG4gICAgI2NyZWF0ZUJ1aWxkZXJXaXRoUGF0aExlZyhsZWdUeXBlLCB2YWx1ZSkge1xuICAgICAgICBpZiAoSlNPTlJlZmVyZW5jZU5vZGUuaXModGhpcy4jbm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyKEpTT05SZWZlcmVuY2VOb2RlLmNsb25lV2l0aFRyYXZlcnNhbCh0aGlzLiNub2RlLCBKU09OUGF0aE5vZGUuaXModGhpcy4jbm9kZS50cmF2ZXJzYWwpXG4gICAgICAgICAgICAgICAgPyBKU09OUGF0aE5vZGUuY2xvbmVXaXRoTGVnKHRoaXMuI25vZGUudHJhdmVyc2FsLCBKU09OUGF0aExlZ05vZGUuY3JlYXRlKGxlZ1R5cGUsIHZhbHVlKSlcbiAgICAgICAgICAgICAgICA6IEpTT05PcGVyYXRvckNoYWluTm9kZS5jbG9uZVdpdGhWYWx1ZSh0aGlzLiNub2RlLnRyYXZlcnNhbCwgVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSkpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIoSlNPTlBhdGhOb2RlLmNsb25lV2l0aExlZyh0aGlzLiNub2RlLCBKU09OUGF0aExlZ05vZGUuY3JlYXRlKGxlZ1R5cGUsIHZhbHVlKSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIgZXh0ZW5kcyBKU09OUGF0aEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgc3VwZXIobm9kZSk7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEpTT05QYXRoQnVpbGRlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGpzb24gcGF0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgSlNPTlBhdGhCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyKHRoaXMuI25vZGUpO1xuICAgIH1cbiAgICAkbm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsaWFzZWRKU09OUGF0aEJ1aWxkZXIge1xuICAgICNqc29uUGF0aDtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IoanNvblBhdGgsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2pzb25QYXRoID0ganNvblBhdGg7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4janNvblBhdGg7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2pzb25QYXRoLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdHVwbGUtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBUdXBsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1R1cGxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1R1cGxlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuY29uc3QgU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTID0gW1xuICAgICd2YXJjaGFyJyxcbiAgICAnY2hhcicsXG4gICAgJ3RleHQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50MicsXG4gICAgJ2ludDQnLFxuICAgICdpbnQ4JyxcbiAgICAnc21hbGxpbnQnLFxuICAgICdiaWdpbnQnLFxuICAgICdib29sZWFuJyxcbiAgICAncmVhbCcsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdmbG9hdDQnLFxuICAgICdmbG9hdDgnLFxuICAgICdkZWNpbWFsJyxcbiAgICAnbnVtZXJpYycsXG4gICAgJ2JpbmFyeScsXG4gICAgJ2J5dGVhJyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lJyxcbiAgICAndGltZScsXG4gICAgJ3RpbWV0eicsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWVzdGFtcHR6JyxcbiAgICAnc2VyaWFsJyxcbiAgICAnYmlnc2VyaWFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uYicsXG4gICAgJ2Jsb2InLFxuICAgICd2YXJiaW5hcnknLFxuICAgICdpbnQ0cmFuZ2UnLFxuICAgICdpbnQ0bXVsdGlyYW5nZScsXG4gICAgJ2ludDhyYW5nZScsXG4gICAgJ2ludDhtdWx0aXJhbmdlJyxcbiAgICAnbnVtcmFuZ2UnLFxuICAgICdudW1tdWx0aXJhbmdlJyxcbiAgICAndHNyYW5nZScsXG4gICAgJ3RzbXVsdGlyYW5nZScsXG4gICAgJ3RzdHpyYW5nZScsXG4gICAgJ3RzdHptdWx0aXJhbmdlJyxcbiAgICAnZGF0ZXJhbmdlJyxcbiAgICAnZGF0ZW11bHRpcmFuZ2UnLFxuXTtcbmNvbnN0IENPTFVNTl9EQVRBX1RZUEVfUkVHRVggPSBbXG4gICAgL152YXJjaGFyXFwoXFxkK1xcKSQvLFxuICAgIC9eY2hhclxcKFxcZCtcXCkkLyxcbiAgICAvXmRlY2ltYWxcXChcXGQrLCBcXGQrXFwpJC8sXG4gICAgL15udW1lcmljXFwoXFxkKywgXFxkK1xcKSQvLFxuICAgIC9eYmluYXJ5XFwoXFxkK1xcKSQvLFxuICAgIC9eZGF0ZXRpbWVcXChcXGQrXFwpJC8sXG4gICAgL150aW1lXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXR6XFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wXFwoXFxkK1xcKSQvLFxuICAgIC9edGltZXN0YW1wdHpcXChcXGQrXFwpJC8sXG4gICAgL152YXJiaW5hcnlcXChcXGQrXFwpJC8sXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERhdGFUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGF0YVR5cGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShkYXRhVHlwZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEYXRhVHlwZU5vZGUnLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbkRhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgaWYgKFNJTVBMRV9DT0xVTU5fREFUQV9UWVBFUy5pbmNsdWRlcyhkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChDT0xVTU5fREFUQV9UWVBFX1JFR0VYLnNvbWUoKHIpID0+IHIudGVzdChkYXRhVHlwZSkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RhdGEtdHlwZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEYXRhVHlwZU5vZGUsIGlzQ29sdW1uRGF0YVR5cGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZGF0YS10eXBlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBkYXRhVHlwZS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgaWYgKGlzQ29sdW1uRGF0YVR5cGUoZGF0YVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBEYXRhVHlwZU5vZGUuY3JlYXRlKGRhdGFUeXBlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiBkYXRhIHR5cGUgJHtKU09OLnN0cmluZ2lmeShkYXRhVHlwZSl9YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Nhc3Qtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDYXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ2FzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Nhc3ROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBkYXRhVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9zZWxlY3QtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgcGFyc2VUYWJsZSwgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvZnVuY3Rpb24tbW9kdWxlLmpzJztcbmltcG9ydCB7IHBhcnNlSlNPTlJlZmVyZW5jZSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCBwYXJzZVN0cmluZ1JlZmVyZW5jZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUZpbHRlckxpc3QsIHBhcnNlRmlsdGVyT2JqZWN0LCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICcuL2V4cHJlc3Npb24td3JhcHBlci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVVuYXJ5T3BlcmF0aW9uIH0gZnJvbSAnLi4vcGFyc2VyL3VuYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQ2FzZUJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9qc29uLXBhdGgtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCaW5hcnlPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBUdXBsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90dXBsZS1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kYXRhLXR5cGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IENhc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2FzdC1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHByZXNzaW9uQnVpbGRlcihleGVjdXRvciA9IE5PT1BfUVVFUllfRVhFQ1VUT1IpIHtcbiAgICBmdW5jdGlvbiBiaW5hcnkobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5hcnkob3AsIGV4cHIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVVuYXJ5T3BlcmF0aW9uKG9wLCBleHByKSk7XG4gICAgfVxuICAgIGNvbnN0IGViID0gT2JqZWN0LmFzc2lnbihiaW5hcnksIHtcbiAgICAgICAgZm46IHVuZGVmaW5lZCxcbiAgICAgICAgZWI6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VsZWN0RnJvbSh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGUpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjYXNlKHJlZmVyZW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXNlQnVpbGRlcih7XG4gICAgICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY3JlYXRlKGlzVW5kZWZpbmVkKHJlZmVyZW5jZSlcbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24ocmVmZXJlbmNlKSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmKHJlZmVyZW5jZSwgb3ApIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZmVyZW5jZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OUGF0aEJ1aWxkZXIocGFyc2VKU09OUmVmZXJlbmNlKHJlZmVyZW5jZSwgb3ApKTtcbiAgICAgICAgfSxcbiAgICAgICAganNvblBhdGgoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05QYXRoQnVpbGRlcihKU09OUGF0aE5vZGUuY3JlYXRlKCkpO1xuICAgICAgICB9LFxuICAgICAgICB0YWJsZSh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVRhYmxlKHRhYmxlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpO1xuICAgICAgICB9LFxuICAgICAgICByZWZUdXBsZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoVHVwbGVOb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbikpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdHVwbGUoLi4udmFsdWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKFR1cGxlTm9kZS5jcmVhdGUodmFsdWVzLm1hcChwYXJzZVZhbHVlRXhwcmVzc2lvbikpKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGl0KHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHVuYXJ5LFxuICAgICAgICBub3QoZXhwcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5KCdub3QnLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXhpc3RzKGV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeSgnZXhpc3RzJywgZXhwcik7XG4gICAgICAgIH0sXG4gICAgICAgIG5lZyhleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnkoJy0nLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmV0d2VlbihleHByLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgT3BlcmF0b3JOb2RlLmNyZWF0ZSgnYmV0d2VlbicpLCBBbmROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihzdGFydCksIHBhcnNlVmFsdWVFeHByZXNzaW9uKGVuZCkpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGJldHdlZW5TeW1tZXRyaWMoZXhwciwgc3RhcnQsIGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwciksIE9wZXJhdG9yTm9kZS5jcmVhdGUoJ2JldHdlZW4gc3ltbWV0cmljJyksIEFuZE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKHN0YXJ0KSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24oZW5kKSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgYW5kKGV4cHJzKSB7XG4gICAgICAgICAgICBpZiAoaXNSZWFkb25seUFycmF5KGV4cHJzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJMaXN0KGV4cHJzLCAnYW5kJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlck9iamVjdChleHBycywgJ2FuZCcpKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3IoZXhwcnMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoZXhwcnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlckxpc3QoZXhwcnMsICdvcicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VGaWx0ZXJPYmplY3QoZXhwcnMsICdvcicpKTtcbiAgICAgICAgfSxcbiAgICAgICAgcGFyZW5zKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICAgICAgaWYgKFBhcmVuc05vZGUuaXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBObyBkb3VibGUgd3JhcHBpbmcuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoUGFyZW5zTm9kZS5jcmVhdGUobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjYXN0KGV4cHIsIGRhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKENhc3ROb2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwciksIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKGV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbiAgICBlYi5mbiA9IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlKCk7XG4gICAgZWIuZWIgPSBlYjtcbiAgICByZXR1cm4gZWI7XG59XG5leHBvcnQgZnVuY3Rpb24gZXhwcmVzc2lvbkJ1aWxkZXIoXykge1xuICAgIHJldHVybiBjcmVhdGVFeHByZXNzaW9uQnVpbGRlcigpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzQWxpYXNlZEV4cHJlc3Npb24sIGlzRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24uanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGV4cHJlc3Npb246ICR7SlNPTi5zdHJpbmdpZnkoZXhwKX1gKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFsaWFzZWRFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UoZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0Z1bmN0aW9uKGV4cCkpIHtcbiAgICAgICAgcmV0dXJuIGV4cChleHByZXNzaW9uQnVpbGRlcigpKS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGFsaWFzZWQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbk9yRmFjdG9yeShvYmopIHtcbiAgICByZXR1cm4gaXNFeHByZXNzaW9uKG9iaikgfHwgaXNBbGlhc2VkRXhwcmVzc2lvbihvYmopIHx8IGlzRnVuY3Rpb24ob2JqKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHluYW1pYy10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWxpYXNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWxpYXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGlzT2JqZWN0LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEeW5hbWljVGFibGVCdWlsZGVyIHtcbiAgICAjdGFibGU7XG4gICAgZ2V0IHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFibGU7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhYmxlKSB7XG4gICAgICAgIHRoaXMuI3RhYmxlID0gdGFibGU7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIodGhpcy4jdGFibGUsIGFsaWFzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIge1xuICAgICN0YWJsZTtcbiAgICAjYWxpYXM7XG4gICAgZ2V0IHRhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdGFibGU7XG4gICAgfVxuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcih0YWJsZSwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jdGFibGUgPSB0YWJsZTtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRoaXMuI3RhYmxlKSwgSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai50YWJsZSkgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLmFsaWFzKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RhYmxlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzUmVhZG9ubHlBcnJheSwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IFRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3RhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VBbGlhc2VkRXhwcmVzc2lvbiwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIsIH0gZnJvbSAnLi4vZHluYW1pYy9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheSh0YWJsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRhYmxlLm1hcCgoaXQpID0+IHBhcnNlVGFibGVFeHByZXNzaW9uKGl0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW3BhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKV07XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGVFeHByZXNzaW9uKHRhYmxlKSB7XG4gICAgaWYgKGlzU3RyaW5nKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VBbGlhc2VkVGFibGUodGFibGUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gdGFibGUudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VBbGlhc2VkRXhwcmVzc2lvbih0YWJsZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxpYXNlZFRhYmxlKGZyb20pIHtcbiAgICBjb25zdCBBTElBU19TRVBBUkFUT1IgPSAnIGFzICc7XG4gICAgaWYgKGZyb20uaW5jbHVkZXMoQUxJQVNfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBbdGFibGUsIGFsaWFzXSA9IGZyb20uc3BsaXQoQUxJQVNfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUoYWxpYXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZVRhYmxlKGZyb20pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhYmxlKGZyb20pIHtcbiAgICBjb25zdCBTQ0hFTUFfU0VQQVJBVE9SID0gJy4nO1xuICAgIGlmIChmcm9tLmluY2x1ZGVzKFNDSEVNQV9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtzY2hlbWEsIHRhYmxlXSA9IGZyb20uc3BsaXQoU0NIRU1BX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gVGFibGVOb2RlLmNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCB0YWJsZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gVGFibGVOb2RlLmNyZWF0ZShmcm9tKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZGQtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWRkQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWRkQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FkZENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uRGVmaW5pdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NvbHVtbkRlZmluaXRpb25Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NvbHVtbkRlZmluaXRpb25Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIobm9kZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IG5vZGUuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5mcm9udE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogW21vZGlmaWVyXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbmRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IG5vZGUuZW5kTW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm5vZGUuZW5kTW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBbbW9kaWZpZXJdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLWNvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZW5hbWUtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVuYW1lQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmVuYW1lQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgICAgICByZW5hbWVUbzogQ29sdW1uTm9kZS5jcmVhdGUobmV3Q29sdW1uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDaGVja0NvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDaGVja0NvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShleHByZXNzaW9uLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDaGVja0NvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZSA/IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb25zdHJhaW50TmFtZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVmZXJlbmNlcy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IE9OX01PRElGWV9GT1JFSUdOX0FDVElPTlMgPSBbXG4gICAgJ25vIGFjdGlvbicsXG4gICAgJ3Jlc3RyaWN0JyxcbiAgICAnY2FzY2FkZScsXG4gICAgJ3NldCBudWxsJyxcbiAgICAnc2V0IGRlZmF1bHQnLFxuXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZlcmVuY2VzTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmVmZXJlbmNlc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1JlZmVyZW5jZXNOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgY29sdW1uczogZnJlZXplKFsuLi5jb2x1bW5zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT25EZWxldGUocmVmZXJlbmNlcywgb25EZWxldGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5yZWZlcmVuY2VzLFxuICAgICAgICAgICAgb25EZWxldGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT25VcGRhdGUocmVmZXJlbmNlcywgb25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5yZWZlcmVuY2VzLFxuICAgICAgICAgICAgb25VcGRhdGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVmYXVsdC12YWx1ZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh2YWx1ZSlcbiAgICAgICAgPyB2YWx1ZS50b09wZXJhdGlvbk5vZGUoKVxuICAgICAgICA6IFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9nZW5lcmF0ZWQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5lcmF0ZWROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdHZW5lcmF0ZWROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnR2VuZXJhdGVkTm9kZScsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aEV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHZW5lcmF0ZWROb2RlJyxcbiAgICAgICAgICAgIGFsd2F5czogdHJ1ZSxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVmYXVsdC12YWx1ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRWYWx1ZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0RlZmF1bHRWYWx1ZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEZWZhdWx0VmFsdWVOb2RlJyxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE9OX01PRElGWV9GT1JFSUdOX0FDVElPTlMsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihhY3Rpb24pIHtcbiAgICBpZiAoT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUy5pbmNsdWRlcyhhY3Rpb24pKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBPbk1vZGlmeUZvcmVpZ25BY3Rpb24gJHthY3Rpb259YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZXNOb2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RBbGxOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tZGVmaW5pdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgR2VuZXJhdGVkTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2dlbmVyYXRlZC1ub2RlLmpzJztcbmltcG9ydCB7IERlZmF1bHRWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24gfSBmcm9tICcuLi9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIENvbHVtbkRlZmluaXRpb25CdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBhdXRvX2luY3JlbWVudGAgb3IgYGF1dG9pbmNyZW1lbnRgIHRvIHRoZSBjb2x1bW4gZGVmaW5pdGlvblxuICAgICAqIGRlcGVuZGluZyBvbiB0aGUgZGlhbGVjdC5cbiAgICAgKlxuICAgICAqIFNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGRvbid0IHN1cHBvcnQgdGhpcy4gT24gUG9zdGdyZVNRTFxuICAgICAqIHlvdSBjYW4gdXNlIHRoZSBgc2VyaWFsYCBvciBgYmlnc2VyaWFsYCBkYXRhIHR5cGUgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmF1dG9JbmNyZW1lbnQoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSBhdXRvX2luY3JlbWVudFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGF1dG9JbmNyZW1lbnQ6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIGFuIGlkZW50aXR5IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlciAoTVNTUUwpLlxuICAgICAqXG4gICAgICogRm9yIFBvc3RncmVTUUwncyBgZ2VuZXJhdGVkIGFsd2F5cyBhcyBpZGVudGl0eWAgdXNlIHtAbGluayBnZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmlkZW50aXR5KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGlkZW50aXR5IHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGlkZW50aXR5OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbHVtbiB0aGUgcHJpbWFyeSBrZXkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY29tcG9zaXRlIHByaW1hcnkga2V5IHVzZSB0aGVcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKi9cbiAgICBwcmltYXJ5S2V5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHByaW1hcnlLZXk6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIElmIHlvdXIgZGF0YWJhc2UgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbiAobGlrZSBNeVNRTCA1KSB5b3UgbmVlZCB0byBjYWxsIHRoZSB0YWJsZSBsZXZlbFxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBldFwiIChcbiAgICAgKiAgIFwib3duZXJfaWRcIiBpbnRlZ2VyIHJlZmVyZW5jZXMgXCJwZXJzb25cIiAoXCJpZFwiKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZlcmVuY2VzKHJlZikge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VzID0gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKTtcbiAgICAgICAgaWYgKCFyZWZlcmVuY2VzLnRhYmxlIHx8IFNlbGVjdEFsbE5vZGUuaXMocmVmZXJlbmNlcy5jb2x1bW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY2FsbCByZWZlcmVuY2VzKCcke3JlZn0nKS4gVGhlIHJlZmVyZW5jZSBtdXN0IGhhdmUgZm9ybWF0IHRhYmxlLmNvbHVtbiBvciBzY2hlbWEudGFibGUuY29sdW1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogUmVmZXJlbmNlc05vZGUuY3JlYXRlKHJlZmVyZW5jZXMudGFibGUsIFtcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmNvbHVtbixcbiAgICAgICAgICAgIF0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG9uIGRlbGV0ZWAgY29uc3RyYWludCBmb3IgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi5cbiAgICAgKlxuICAgICAqIElmIHlvdXIgZGF0YWJhc2UgZW5naW5lIGRvZXNuJ3Qgc3VwcG9ydCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbiAobGlrZSBNeVNRTCA1KSB5b3UgbmVlZCB0byBjYWxsIHRoZSB0YWJsZSBsZXZlbFxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9IG1ldGhvZCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ293bmVyX2lkJyxcbiAgICAgKiAgICAgJ2ludGVnZXInLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wucmVmZXJlbmNlcygncGVyc29uLmlkJykub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGV0XCIgKFxuICAgICAqICAgXCJvd25lcl9pZFwiIGludGVnZXIgcmVmZXJlbmNlcyBcInBlcnNvblwiIChcImlkXCIpIG9uIGRlbGV0ZSBjYXNjYWRlXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9uRGVsZXRlKG9uRGVsZXRlKSB7XG4gICAgICAgIGlmICghdGhpcy4jbm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uIGRlbGV0ZSBjb25zdHJhaW50IGNhbiBvbmx5IGJlIGFkZGVkIGZvciBmb3JlaWduIGtleXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jbG9uZVdpdGhPbkRlbGV0ZSh0aGlzLiNub2RlLnJlZmVyZW5jZXMsIHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKG9uRGVsZXRlKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gdXBkYXRlYCBjb25zdHJhaW50IGZvciB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnb3duZXJfaWQnLFxuICAgICAqICAgICAnaW50ZWdlcicsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vblVwZGF0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXRcIiAoXG4gICAgICogICBcIm93bmVyX2lkXCIgaW50ZWdlciByZWZlcmVuY2VzIFwicGVyc29uXCIgKFwiaWRcIikgb24gdXBkYXRlIGNhc2NhZGVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb24gdXBkYXRlIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYWRkZWQgZm9yIGZvcmVpZ24ga2V5cycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNsb25lV2l0aE9uVXBkYXRlKHRoaXMuI25vZGUucmVmZXJlbmNlcywgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25VcGRhdGUpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdW5pcXVlIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdlbWFpbCcsICd2YXJjaGFyKDI1NSknLCBjb2wgPT4gY29sLnVuaXF1ZSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZW1haWxgIHZhcmNoYXIoMjU1KSB1bmlxdWVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHVuaXF1ZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgbm90IG51bGxgIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZmlyc3RfbmFtZWAgdmFyY2hhcigyNTUpIG5vdCBudWxsXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgbm90TnVsbDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgdW5zaWduZWRgIG1vZGlmaWVyIGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2FnZScsICdpbnRlZ2VyJywgY29sID0+IGNvbC51bnNpZ25lZCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgYWdlYCBpbnRlZ2VyIHVuc2lnbmVkXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHVuc2lnbmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IHVuc2lnbmVkOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGRlZmF1bHQgdmFsdWUgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wuZGVmYXVsdFRvKDQpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgbnVtYmVyX29mX2xlZ3NgIGludGVnZXIgZGVmYXVsdCA0XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVmFsdWVzIHBhc3NlZCB0byBgZGVmYXVsdFRvYCBhcmUgaW50ZXJwcmV0ZWQgYXMgdmFsdWUgbGl0ZXJhbHMgYnkgZGVmYXVsdC4gWW91IGNhbiBkZWZpbmVcbiAgICAgKiBhbiBhcmJpdHJhcnkgU1FMIGV4cHJlc3Npb24gdXNpbmcgdGhlIHtAbGluayBzcWx9IHRlbXBsYXRlIHRhZzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdjcmVhdGVkX2F0JyxcbiAgICAgKiAgICAgJ3RpbWVzdGFtcCcsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5kZWZhdWx0VG8oc3FsYENVUlJFTlRfVElNRVNUQU1QYClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBldGAgKFxuICAgICAqICAgYGNyZWF0ZWRfYXRgIHRpbWVzdGFtcCBkZWZhdWx0IENVUlJFTlRfVElNRVNUQU1QXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlZmF1bHRUbyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBkZWZhdWx0VG86IERlZmF1bHRWYWx1ZU5vZGUuY3JlYXRlKHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGVjayBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdudW1iZXJfb2ZfbGVncycsICdpbnRlZ2VyJywgKGNvbCkgPT5cbiAgICAgKiAgICAgY29sLmNoZWNrKHNxbGBudW1iZXJfb2ZfbGVncyA8IDVgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgbnVtYmVyX29mX2xlZ3NgIGludGVnZXIgY2hlY2sgKG51bWJlcl9vZl9sZWdzIDwgNSlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY2hlY2soZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBjaGVjazogQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbHVtbiBhIGdlbmVyYXRlZCBjb2x1bW4gdXNpbmcgYSBgZ2VuZXJhdGVkIGFsd2F5cyBhc2Agc3RhdGVtZW50LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmdWxsX25hbWUnLCAndmFyY2hhcigyNTUpJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLmdlbmVyYXRlZEFsd2F5c0FzKHNxbGBjb25jYXQoZmlyc3RfbmFtZSwgJyAnLCBsYXN0X25hbWUpYClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGZ1bGxfbmFtZWAgdmFyY2hhcigyNTUpIGdlbmVyYXRlZCBhbHdheXMgYXMgKGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSkpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdlbmVyYXRlZEFsd2F5c0FzKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNyZWF0ZVdpdGhFeHByZXNzaW9uKGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGBnZW5lcmF0ZWQgYWx3YXlzIGFzIGlkZW50aXR5YCBzcGVjaWZpZXIuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBGb3IgTVMgU1FMIFNlcnZlciAoTVNTUUwpJ3MgaWRlbnRpdHkgY29sdW1uIHVzZSB7QGxpbmsgaWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuZ2VuZXJhdGVkQWx3YXlzQXNJZGVudGl0eSgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGdlbmVyYXRlZCBhbHdheXMgYXMgaWRlbnRpdHkgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2VuZXJhdGVkQWx3YXlzQXNJZGVudGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNyZWF0ZSh7IGlkZW50aXR5OiB0cnVlLCBhbHdheXM6IHRydWUgfSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYGdlbmVyYXRlZCBieSBkZWZhdWx0IGFzIGlkZW50aXR5YCBzcGVjaWZpZXIgb24gc3VwcG9ydGVkIGRpYWxlY3RzLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogRm9yIE1TIFNRTCBTZXJ2ZXIgKE1TU1FMKSdzIGlkZW50aXR5IGNvbHVtbiB1c2Uge0BsaW5rIGlkZW50aXR5fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLmdlbmVyYXRlZEJ5RGVmYXVsdEFzSWRlbnRpdHkoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBhcyBpZGVudGl0eSBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRCeURlZmF1bHRBc0lkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlKHsgaWRlbnRpdHk6IHRydWUsIGJ5RGVmYXVsdDogdHJ1ZSB9KSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhIGdlbmVyYXRlZCBjb2x1bW4gc3RvcmVkIGluc3RlYWQgb2YgdmlydHVhbC4gVGhpcyBtZXRob2QgY2FuIG9ubHlcbiAgICAgKiBiZSB1c2VkIHdpdGgge0BsaW5rIGdlbmVyYXRlZEFsd2F5c0FzfVxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZnVsbF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScsIChjb2wpID0+IGNvbFxuICAgICAqICAgICAuZ2VuZXJhdGVkQWx3YXlzQXMoc3FsYGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSlgKVxuICAgICAqICAgICAuc3RvcmVkKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGZ1bGxfbmFtZWAgdmFyY2hhcigyNTUpIGdlbmVyYXRlZCBhbHdheXMgYXMgKGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSkpIHN0b3JlZFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdG9yZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy4jbm9kZS5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RvcmVkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGdlbmVyYXRlZEFsd2F5c0FzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLmdlbmVyYXRlZCwge1xuICAgICAgICAgICAgICAgIHN0b3JlZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCByaWdodCBhZnRlciB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWUnLFxuICAgICAqICAgICAndmFyY2hhcigzNiknLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wubW9kaWZ5RnJvbnQoc3FsYGNvbGxhdGUgdXRmOG1iNF9nZW5lcmFsX2NpYCkubm90TnVsbCgpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIGBmaXJzdF9uYW1lYCB2YXJjaGFyKDM2KSBjb2xsYXRlIHV0ZjhtYjRfZ2VuZXJhbF9jaSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlGcm9udChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aEZyb250TW9kaWZpZXIodGhpcy4jbm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbm90IGRpc3RpbmN0YCBzcGVjaWZpZXIuXG4gICAgICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgdW5pcXVlYCBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDMwKScsIGNvbCA9PiBjb2wudW5pcXVlKCkubnVsbHNOb3REaXN0aW5jdCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBcImZpcnN0X25hbWVcIiB2YXJjaGFyKDMwKSB1bmlxdWUgbnVsbHMgbm90IGRpc3RpbmN0XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgbnVsbHNOb3REaXN0aW5jdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGlmIG5vdCBleGlzdHNgIHNwZWNpZmllci4gVGhpcyBvbmx5IHdvcmtzIGZvciBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdlbWFpbCcsICd2YXJjaGFyKDI1NSknLCBjb2wgPT4gY29sLnVuaXF1ZSgpLmlmTm90RXhpc3RzKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBcInBlcnNvblwiIGFkZCBjb2x1bW4gaWYgbm90IGV4aXN0cyBcImVtYWlsXCIgdmFyY2hhcigyNTUpIHVuaXF1ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGlmTm90RXhpc3RzOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2FnZScsXG4gICAgICogICAgICdpbnRlZ2VyJyxcbiAgICAgKiAgICAgY29sID0+IGNvbC51bnNpZ25lZCgpXG4gICAgICogICAgICAgLm5vdE51bGwoKVxuICAgICAqICAgICAgIC5tb2RpZnlFbmQoc3FsYGNvbW1lbnQgJHtzcWwubGl0KCdpdCBpcyBub3QgcG9saXRlIHRvIGFzayBhIHdvbWFuIGhlciBhZ2UnKX1gKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgaWRgIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBgYWdlYCBpbnRlZ2VyIHVuc2lnbmVkIG5vdCBudWxsIGNvbW1lbnQgJ2l0IGlzIG5vdCBwb2xpdGUgdG8gYXNrIGEgd29tYW4gaGVyIGFnZSdcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jbm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbW9kaWZ5LWNvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE1vZGlmeUNvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ01vZGlmeUNvbHVtbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNb2RpZnlDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZXNOb2RlIH0gZnJvbSAnLi9yZWZlcmVuY2VzLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzb3VyY2VDb2x1bW5zLCB0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucywgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRm9yZWlnbktleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IHNvdXJjZUNvbHVtbnMsXG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jcmVhdGUodGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24gfSBmcm9tICcuLi9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgb25EZWxldGUob25EZWxldGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBvbkRlbGV0ZTogcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25EZWxldGUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIG9uVXBkYXRlKG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgb25VcGRhdGU6IHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKG9uVXBkYXRlKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBkZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseURlZmVycmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseUltbWVkaWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWRkQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmlxdWUtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVW5pcXVlQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSwgbnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmlxdWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgICAgIG5hbWU6IGNvbnN0cmFpbnROYW1lID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3QsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcENvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50TmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcENvbnN0cmFpbnQsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcENvbnN0cmFpbnQsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbHRlckNvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsdGVyQ29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlckNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICAgICAgW3Byb3BdOiB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci1jb2x1bW4tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsdGVyQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLWNvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kYXRhLXR5cGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGVmYXVsdC12YWx1ZS1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyQ29sdW1uQnVpbGRlciB7XG4gICAgI2NvbHVtbjtcbiAgICBjb25zdHJ1Y3Rvcihjb2x1bW4pIHtcbiAgICAgICAgdGhpcy4jY29sdW1uID0gY29sdW1uO1xuICAgIH1cbiAgICBzZXREYXRhVHlwZShkYXRhVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnZGF0YVR5cGUnLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKTtcbiAgICB9XG4gICAgc2V0RGVmYXVsdCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnc2V0RGVmYXVsdCcsIHBhcnNlRGVmYXVsdFZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpKTtcbiAgICB9XG4gICAgZHJvcERlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkcm9wRGVmYXVsdCcsIHRydWUpKTtcbiAgICB9XG4gICAgc2V0Tm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ3NldE5vdE51bGwnLCB0cnVlKSk7XG4gICAgfVxuICAgIGRyb3BOb3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnZHJvcE5vdE51bGwnLCB0cnVlKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG59XG4vKipcbiAqIEFsbG93cyB1cyB0byBmb3JjZSBjb25zdW1lcnMgdG8gZG8gZXhhY3RseSBvbmUgYWx0ZXJhdGlvbiB0byBhIGNvbHVtbi5cbiAqXG4gKiBPbmUgY2Fubm90IGRvIG5vIGFsdGVyYXRpb25zOlxuICpcbiAqIGBgYHRzXG4gKiBhd2FpdCBkYi5zY2hlbWFcbiAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gKiAvLyAgLmV4ZWN1dGUoKSAvLyBQcm9wZXJ0eSAnZXhlY3V0ZScgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSAnQWx0ZXJlZENvbHVtbkJ1aWxkZXInLlxuICogYGBgXG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IGRiLnNjaGVtYVxuICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAqIC8vICAuYWx0ZXJDb2x1bW4oJ2FnZScsIChhYykgPT4gYWMpIC8vIFR5cGUgJ0FsdGVyQ29sdW1uQnVpbGRlcicgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnQWx0ZXJlZENvbHVtbkJ1aWxkZXInLlxuICogLy8gIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIE9uZSBjYW5ub3QgZG8gbXVsdGlwbGUgYWx0ZXJhdGlvbnM6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IGRiLnNjaGVtYVxuICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAqIC8vICAuYWx0ZXJDb2x1bW4oJ2FnZScsIChhYykgPT4gYWMuZHJvcE5vdE51bGwoKS5zZXROb3ROdWxsKCkpIC8vIFByb3BlcnR5ICdzZXROb3ROdWxsJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiAvLyAgLmV4ZWN1dGUoKVxuICogYGBgXG4gKlxuICogV2hpY2ggd291bGQgbm93IHRocm93IGEgY29tcGlsYXRpb24gZXJyb3IsIGluc3RlYWQgb2YgYSBydW50aW1lIGVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgQWx0ZXJlZENvbHVtbkJ1aWxkZXIge1xuICAgICNhbHRlckNvbHVtbk5vZGU7XG4gICAgY29uc3RydWN0b3IoYWx0ZXJDb2x1bW5Ob2RlKSB7XG4gICAgICAgIHRoaXMuI2FsdGVyQ29sdW1uTm9kZSA9IGFsdGVyQ29sdW1uTm9kZTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWx0ZXJDb2x1bW5Ob2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUV4ZWN1dG9yIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLWFkZC1mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBZGRDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBvbkRlbGV0ZShvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIub25EZWxldGUob25EZWxldGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLm9uVXBkYXRlKG9uVXBkYXRlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5kZWZlcnJhYmxlKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub3REZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIubm90RGVmZXJyYWJsZSgpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5pbml0aWFsbHlEZWZlcnJlZCgpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIuaW5pdGlhbGx5SW1tZWRpYXRlKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtZHJvcC1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wQ29uc3RyYWludDogRHJvcENvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmRyb3BDb25zdHJhaW50LCB7XG4gICAgICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wQ29uc3RyYWludDogRHJvcENvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmRyb3BDb25zdHJhaW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyOiAnY2FzY2FkZScsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlc3RyaWN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wQ29uc3RyYWludDogRHJvcENvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmRyb3BDb25zdHJhaW50LCB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyOiAncmVzdHJpY3QnLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ByaW1hcnlLZXlDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgICAgIG5hbWU6IGNvbnN0cmFpbnROYW1lID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7IC4uLm5vZGUsIC4uLnByb3BzIH0pO1xuICAgIH0sXG59KTtcbi8qKlxuICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGEgdHlwbyBpbiB0aGUgY29kZWJhc2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGV9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQcmltYXJ5Q29uc3RyYWludE5vZGUgPSBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGU7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FkZC1pbmRleC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQWRkSW5kZXhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRJbmRleE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoQ29sdW1ucyhub2RlLCBjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGNvbHVtbnM6IFsuLi4obm9kZS5jb2x1bW5zIHx8IFtdKSwgLi4uY29sdW1uc10sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYWRkLWluZGV4LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBZGRJbmRleE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJlZENvbHVtbk5hbWUsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBpbmRleCB1bmlxdWUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLnVuaXF1ZSgpXG4gICAgICogICAuY29sdW1uKCdlbWFpbCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIHVuaXF1ZSBpbmRleCBgcGVyc29uX2ZpcnN0X25hbWVfaW5kZXhgIChgZW1haWxgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHVuaXF1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbnN9IGZvciBhZGRpbmcgbXVsdGlwbGUgY29sdW1ucyBhdCBvbmNlIG9yIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIGZvciBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXgnKVxuICAgICAqICAgLmNvbHVtbignZmlyc3RfbmFtZScpXG4gICAgICogICAuY29sdW1uKCdhZ2UgZGVzYycpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4YCAoYGZpcnN0X25hbWVgLCBgYWdlYCBkZXNjKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIFtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pLFxuICAgICAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBjb2x1bW59IGZvciBhZGRpbmcgYSBzaW5nbGUgY29sdW1uIG9yIHtAbGluayBleHByZXNzaW9ufSBmb3JcbiAgICAgKiBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXgnKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2FnZSBkZXNjJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4YCAoYGZpcnN0X25hbWVgLCBgYWdlYCBkZXNjKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbnMoY29sdW1ucykge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwgY29sdW1ucy5tYXAocGFyc2VPcmRlcmVkQ29sdW1uTmFtZSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2luZGV4JylcbiAgICAgKiAgIC5leHByZXNzaW9uKHNxbDxib29sZWFuPmAoZmlyc3RfbmFtZSA8ICdTYW1pJylgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGFsdGVyIHRhYmxlIGBwZXJzb25gIGFkZCBpbmRleCBgcGVyc29uX2ZpcnN0X25hbWVfaW5kZXhgICgoZmlyc3RfbmFtZSA8ICdTYW1pJykpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCBbXG4gICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKGluZGV4VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHVzaW5nOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoaW5kZXhUeXBlKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbm90IGRpc3RpbmN0YCB0byB0aGUgdW5pcXVlIGNvbnN0cmFpbnQgZGVmaW5pdGlvblxuICAgICAqXG4gICAgICogU3VwcG9ydGVkIGJ5IFBvc3RncmVTUUwgZGlhbGVjdCBvbmx5XG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgbnVsbHNOb3REaXN0aW5jdDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IHRydWUgfSkpO1xuICAgIH1cbiAgICBub3REZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseURlZmVycmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICBkZWZlcnJhYmxlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiBmYWxzZSB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseURlZmVycmVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGluaXRpYWxseUltbWVkaWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2hlY2stY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIENoZWNrQ29uc3RyYWludEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlbmFtZS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZW5hbWVDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUmVuYW1lQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgb2xkTmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG9sZE5hbWUpLFxuICAgICAgICAgICAgbmV3TmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5ld05hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBZGRDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWRkLWNvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IFJlbmFtZUNvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZW5hbWUtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBub29wIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIsIH0gZnJvbSAnLi9jb2x1bW4tZGVmaW5pdGlvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IE1vZGlmeUNvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9tb2RpZnktY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFkZENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWRkLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ2hlY2tDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NoZWNrLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IERyb3BDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyQ29sdW1uQnVpbGRlciwgfSBmcm9tICcuL2FsdGVyLWNvbHVtbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVFeGVjdXRvciB9IGZyb20gJy4vYWx0ZXItdGFibGUtZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciB9IGZyb20gJy4vYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBBZGRJbmRleE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIsIH0gZnJvbSAnLi91bmlxdWUtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vY2hlY2stY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFJlbmFtZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG4vKipcbiAqIFRoaXMgYnVpbGRlciBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBgYWx0ZXIgdGFibGVgIHF1ZXJ5LlxuICovXG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHJlbmFtZVRvKG5ld1RhYmxlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHJlbmFtZVRvOiBwYXJzZVRhYmxlKG5ld1RhYmxlTmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFNjaGVtYShuZXdTY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBzZXRTY2hlbWE6IElkZW50aWZpZXJOb2RlLmNyZWF0ZShuZXdTY2hlbWEpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhbHRlckNvbHVtbihjb2x1bW4sIGFsdGVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGFsdGVyYXRpb24obmV3IEFsdGVyQ29sdW1uQnVpbGRlcihjb2x1bW4pKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRyb3BDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgRHJvcENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVuYW1lQ29sdW1uKGNvbHVtbiwgbmV3Q29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgUmVuYW1lQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uLCBuZXdDb2x1bW4pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZENvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBBZGRDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtb2RpZnlDb2x1bW4oY29sdW1uTmFtZSwgZGF0YVR5cGUsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYnVpbGQobmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNyZWF0ZShjb2x1bW5OYW1lLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgTW9kaWZ5Q29sdW1uTm9kZS5jcmVhdGUoYnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkVW5pcXVlQ29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRVbmlxdWVDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlQ29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUodW5pcXVlQ29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRDaGVja0NvbnN0cmFpbnR9XG4gICAgICovXG4gICAgYWRkQ2hlY2tDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjaGVja0V4cHJlc3Npb24sIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyKENoZWNrQ29uc3RyYWludE5vZGUuY3JlYXRlKGNoZWNrRXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSwgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkRm9yZWlnbktleUNvbnN0cmFpbnR9XG4gICAgICpcbiAgICAgKiBVbmxpa2Uge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gdGhpcyBtZXRob2QgcmV0dXJuc1xuICAgICAqIHRoZSBjb25zdHJhaW50IGJ1aWxkZXIgYW5kIGRvZXNuJ3QgdGFrZSBhIGNhbGxiYWNrIGFzIHRoZSBsYXN0IGFyZ3VtZW50LiBUaGlzXG4gICAgICogaXMgYmVjYXVzZSB5b3UgY2FuIG9ubHkgYWRkIG9uZSBjb2x1bW4gcGVyIGBBTFRFUiBUQUJMRWAgcXVlcnkuXG4gICAgICovXG4gICAgYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpLCBwYXJzZVRhYmxlKHRhcmdldFRhYmxlKSwgdGFyZ2V0Q29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRQcmltYXJ5S2V5Q29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRQcmltYXJ5S2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZShjb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRyb3BDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVuYW1lQ29uc3RyYWludChvbGROYW1lLCBuZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHJlbmFtZUNvbnN0cmFpbnQ6IFJlbmFtZUNvbnN0cmFpbnROb2RlLmNyZWF0ZShvbGROYW1lLCBuZXdOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgaW5kZXggdG8gdGFibGUuXG4gICAgICpcbiAgICAgKiAgIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZEluZGV4KCdwZXJzb25fZW1haWxfaW5kZXgnKVxuICAgICAqICAgLmNvbHVtbignZW1haWwnKVxuICAgICAqICAgLnVuaXF1ZSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIHVuaXF1ZSBpbmRleCBgcGVyc29uX2VtYWlsX2luZGV4YCAoYGVtYWlsYClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jcmVhdGUoaW5kZXhOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBkcm9wIGluZGV4IGZyb20gdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuZHJvcEluZGV4KCdwZXJzb25fZW1haWxfaW5kZXgnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGFsdGVyIHRhYmxlIGBwZXJzb25gIGRyb3AgaW5kZXggYHRlc3RfZmlyc3RfbmFtZV9pbmRleGBcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcEluZGV4OiBEcm9wSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci4kY2FsbH1cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBhbHRlckNvbHVtbihjb2x1bW4sIGFsdGVyYXRpb24pIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGFsdGVyYXRpb24obmV3IEFsdGVyQ29sdW1uQnVpbGRlcihjb2x1bW4pKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRyb3BDb2x1bW4oY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgRHJvcENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVuYW1lQ29sdW1uKGNvbHVtbiwgbmV3Q29sdW1uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgUmVuYW1lQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uLCBuZXdDb2x1bW4pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFkZENvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBBZGRDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtb2RpZnlDb2x1bW4oY29sdW1uTmFtZSwgZGF0YVR5cGUsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYnVpbGQobmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNyZWF0ZShjb2x1bW5OYW1lLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUNvbHVtbkFsdGVyaW5nQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbkFsdGVyYXRpb24odGhpcy4jcHJvcHMubm9kZSwgTW9kaWZ5Q29sdW1uTm9kZS5jcmVhdGUoYnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS10cmFuc2Zvcm1lci5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFsbCBWYWx1ZU5vZGVzIHRvIGltbWVkaWF0ZS5cbiAqXG4gKiBXQVJOSU5HISBUaGlzIHNob3VsZCBuZXZlciBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMuXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShub2RlLnZhbHVlcy5tYXAoVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSkpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZShub2RlKSB7XG4gICAgICAgIHJldHVybiBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKG5vZGUudmFsdWUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDcmVhdGVJbmRleE5vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJlZENvbHVtbk5hbWUsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vcGx1Z2luL2ltbWVkaWF0ZS12YWx1ZS9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZUluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJpZiBub3QgZXhpc3RzXCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgaW5kZXggYWxyZWFkeSBleGlzdHMsIG5vIGVycm9yIGlzIHRocm93biBpZiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBpbmRleCB1bmlxdWUuXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgbnVsbHMgbm90IGRpc3RpbmN0YCBzcGVjaWZpZXIgdG8gaW5kZXguXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAub24oJ3BlcnNvbicpXG4gICAgICogIC5jb2x1bW4oJ2ZpcnN0X25hbWUnKVxuICAgICAqICAubnVsbHNOb3REaXN0aW5jdCgpXG4gICAgICogIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSBpbmRleCBcInBlcnNvbl9maXJzdF9uYW1lX2luZGV4XCJcbiAgICAgKiBvbiBcInRlc3RcIiAoXCJmaXJzdF9uYW1lXCIpXG4gICAgICogbnVsbHMgbm90IGRpc3RpbmN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG51bGxzTm90RGlzdGluY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB0YWJsZSBmb3IgdGhlIGluZGV4LlxuICAgICAqL1xuICAgIG9uKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHBhcnNlVGFibGUodGFibGUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBjb2x1bW5zfSBmb3IgYWRkaW5nIG11bHRpcGxlIGNvbHVtbnMgYXQgb25jZSBvciB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBmb3Igc3BlY2lmeWluZyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgICAgICAgIC5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAgICAgICAub24oJ3BlcnNvbicpXG4gICAgICogICAgICAgICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgICAgICAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSBpbmRleCBcInBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhcIiBvbiBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJhZ2VcIiBkZXNjKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLCBbXG4gICAgICAgICAgICAgICAgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBjb2x1bW59IGZvciBhZGRpbmcgYSBzaW5nbGUgY29sdW1uIG9yIHtAbGluayBleHByZXNzaW9ufSBmb3JcbiAgICAgKiBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgICAgICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4JylcbiAgICAgKiAgICAgICAgIC5vbigncGVyc29uJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdhZ2UgZGVzYyddKVxuICAgICAqICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImFnZVwiIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZSwgY29sdW1ucy5tYXAocGFyc2VPcmRlcmVkQ29sdW1uTmFtZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIGZvciB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLm9uKCdwZXJzb24nKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsYGZpcnN0X25hbWUgQ09MTEFURSBcImZpX0ZJXCJgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfaW5kZXhcIiBvbiBcInBlcnNvblwiIChmaXJzdF9uYW1lIENPTExBVEUgXCJmaV9GSVwiKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUsIFtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1c2luZyhpbmRleFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB1c2luZzogUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKGluZGV4VHlwZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5ub2RlLCB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncyksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtc2NoZW1hLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBDcmVhdGVTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXNjaGVtYS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVTY2hlbWFCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVTY2hlbWFCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlU2NoZW1hTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBpZk5vdEV4aXN0czogdHJ1ZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmQudHNcIiAvPlxuaW1wb3J0IHsgT05fQ09NTUlUX0FDVElPTlMsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT25Db21taXRBY3Rpb24oYWN0aW9uKSB7XG4gICAgaWYgKE9OX0NPTU1JVF9BQ1RJT05TLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIE9uQ29tbWl0QWN0aW9uICR7YWN0aW9ufWApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZU5vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBub29wIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZm9yZWlnbi1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT25Db21taXRBY3Rpb24gfSBmcm9tICcuLi9wYXJzZXIvb24tY29tbWl0LWFjdGlvbi1wYXJzZS5qcyc7XG5pbXBvcnQgeyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIsIH0gZnJvbSAnLi91bmlxdWUtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJy4uL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9wcmltYXJ5LWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ2hlY2tDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL2NoZWNrLWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG4vKipcbiAqIFRoaXMgYnVpbGRlciBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBgY3JlYXRlIHRhYmxlYCBxdWVyeS5cbiAqL1xuZXhwb3J0IGNsYXNzIENyZWF0ZVRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJ0ZW1wb3JhcnlcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSB0YWJsZS5cbiAgICAgKi9cbiAgICB0ZW1wb3JhcnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIFwib24gY29tbWl0XCIgc3RhdGVtZW50LlxuICAgICAqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRlbXBvcmFyeSB0YWJsZXMgb24gc3VwcG9ydGVkIGRhdGFiYXNlc1xuICAgICAqIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKi9cbiAgICBvbkNvbW1pdChvbkNvbW1pdCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG9uQ29tbWl0OiBwYXJzZU9uQ29tbWl0QWN0aW9uKG9uQ29tbWl0KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJpZiBub3QgZXhpc3RzXCIgbW9kaWZpZXIuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMsIG5vIGVycm9yIGlzIHRocm93biBpZiB0aGlzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLmF1dG9JbmNyZW1lbnQoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNTApJywgKGNvbCkgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDI1NSknKVxuICAgICAqICAgLmFkZENvbHVtbignYmFua19iYWxhbmNlJywgJ251bWVyaWMoOCwgMiknKVxuICAgICAqICAgLy8gWW91IGNhbiBzcGVjaWZ5IGFueSBkYXRhIHR5cGUgdXNpbmcgdGhlIGBzcWxgIHRhZyBpZiB0aGUgdHlwZXNcbiAgICAgKiAgIC8vIGRvbid0IGluY2x1ZGUgaXQuXG4gICAgICogICAuYWRkQ29sdW1uKCdkYXRhJywgc3FsYGFueV90eXBlX2hlcmVgKVxuICAgICAqICAgLmFkZENvbHVtbigncGFyZW50X2lkJywgJ2ludGVnZXInLCAoY29sKSA9PlxuICAgICAqICAgICBjb2wucmVmZXJlbmNlcygncGVyc29uLmlkJykub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogV2l0aCB0aGlzIG1ldGhvZCwgaXQncyBvbmNlIGFnYWluIGdvb2QgdG8gcmVtZW1iZXIgdGhhdCBLeXNlbHkganVzdCBidWlsZHMgdGhlXG4gICAgICogcXVlcnkgYW5kIGRvZXNuJ3QgcHJvdmlkZSB0aGUgc2FtZSBBUEkgZm9yIGFsbCBkYXRhYmFzZXMuIEZvciBleGFtcGxlLCBzb21lXG4gICAgICogZGF0YWJhc2VzIGxpa2Ugb2xkZXIgTXlTUUwgZG9uJ3Qgc3VwcG9ydCB0aGUgYHJlZmVyZW5jZXNgIHN0YXRlbWVudCBpbiB0aGVcbiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbi4gSW5zdGVhZCBmb3JlaWduIGtleSBjb25zdHJhaW50cyBuZWVkIHRvIGJlIGRlZmluZWQgaW4gdGhlXG4gICAgICogYGNyZWF0ZSB0YWJsZWAgcXVlcnkuIFNlZSB0aGUgbmV4dCBleGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbigncGFyZW50X2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAncGVyc29uX3BhcmVudF9pZF9maycsXG4gICAgICogICAgIFsncGFyZW50X2lkJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkJ10sXG4gICAgICogICAgIChjYikgPT4gY2Iub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW5vdGhlciBnb29kIGV4YW1wbGUgaXMgdGhhdCBQb3N0Z3JlU1FMIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgYGF1dG9faW5jcmVtZW50YFxuICAgICAqIGtleXdvcmQgYW5kIHlvdSBuZWVkIHRvIGRlZmluZSBhbiBhdXRvaW5jcmVtZW50aW5nIGNvbHVtbiBmb3IgZXhhbXBsZSB1c2luZ1xuICAgICAqIGBzZXJpYWxgOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ3NlcmlhbCcsIChjb2wpID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29sdW1uQnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW4odGhpcy4jcHJvcHMubm9kZSwgY29sdW1uQnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgcHJpbWFyeSBrZXkgY29uc3RyYWludCBmb3Igb25lIG9yIG1vcmUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJhaW50IG5hbWUgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50LCBidXQgaXQgbXVzdCBiZSB1bmlxdWVcbiAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZFByaW1hcnlLZXlDb25zdHJhaW50KCdwcmltYXJ5X2tleScsIFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRQcmltYXJ5S2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB1bmlxdWUgY29uc3RyYWludCBmb3Igb25lIG9yIG1vcmUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJhaW50IG5hbWUgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50LCBidXQgaXQgbXVzdCBiZSB1bmlxdWVcbiAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZFVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgICogICAgICdmaXJzdF9uYW1lX2xhc3RfbmFtZV91bmlxdWUnLFxuICAgICAqICAgICBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ11cbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluIGRpYWxlY3RzIHN1Y2ggYXMgUG9zdGdyZVNRTCB5b3UgY2FuIHNwZWNpZnkgYG51bGxzIG5vdCBkaXN0aW5jdGAgYXMgZm9sbG93czpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkVW5pcXVlQ29uc3RyYWludChcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWVfbGFzdF9uYW1lX3VuaXF1ZScsXG4gICAgICogICAgIFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5udWxsc05vdERpc3RpbmN0KClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRVbmlxdWVDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgdW5pcXVlQ29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoQ29uc3RyYWludCh0aGlzLiNwcm9wcy5ub2RlLCB1bmlxdWVDb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJhaW50IG5hbWUgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50LCBidXQgaXQgbXVzdCBiZSB1bmlxdWVcbiAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ2FuaW1hbCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdudW1iZXJfb2ZfbGVncycsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRDaGVja0NvbnN0cmFpbnQoJ2NoZWNrX2xlZ3MnLCBzcWxgbnVtYmVyX29mX2xlZ3MgPCA1YClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRDaGVja0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNoZWNrRXhwcmVzc2lvbiwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IENoZWNrQ29uc3RyYWludEJ1aWxkZXIoQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoY2hlY2tFeHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoQ29uc3RyYWludCh0aGlzLiNwcm9wcy5ub2RlLCBjb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZm9yZWlnbiBrZXkgY29uc3RyYWludC5cbiAgICAgKlxuICAgICAqIFRoZSBjb25zdHJhaW50IG5hbWUgY2FuIGJlIGFueXRoaW5nIHlvdSB3YW50LCBidXQgaXQgbXVzdCBiZSB1bmlxdWVcbiAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIGRhdGFiYXNlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdvd25lcl9pZF9mb3JlaWduJyxcbiAgICAgKiAgICAgWydvd25lcl9pZCddLFxuICAgICAqICAgICAncGVyc29uJyxcbiAgICAgKiAgICAgWydpZCddLFxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQWRkIGNvbnN0cmFpbnQgZm9yIG11bHRpcGxlIGNvbHVtbnM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQxJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQyJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAnb3duZXJfaWRfZm9yZWlnbicsXG4gICAgICogICAgIFsnb3duZXJfaWQxJywgJ293bmVyX2lkMiddLFxuICAgICAqICAgICAncGVyc29uJyxcbiAgICAgKiAgICAgWydpZDEnLCAnaWQyJ10sXG4gICAgICogICAgIChjYikgPT4gY2Iub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZEZvcmVpZ25LZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCB0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucywgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpLCBwYXJzZVRhYmxlKHRhcmdldFRhYmxlKSwgdGFyZ2V0Q29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoQ29uc3RyYWludCh0aGlzLiNwcm9wcy5ub2RlLCBidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXJ5IF9fYWZ0ZXJfXyB0aGUgYGNyZWF0ZWAga2V5d29yZC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayB0ZW1wb3Jhcnl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLm1vZGlmeUZyb250KHNxbGBnbG9iYWwgdGVtcG9yYXJ5YClcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVzKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSBnbG9iYWwgdGVtcG9yYXJ5IHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgcHJpbWFyeSBrZXksXG4gICAgICogICBcImZpcnN0X25hbWVcIiB2YXJjaGFyKDY0KSBub3QgbnVsbCxcbiAgICAgKiAgIFwibGFzdF9uYW1lXCIgdmFyY2hhcig2NCkgbm90IG51bGxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RnJvbnQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5ub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgb25Db21taXR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbGBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIGBmaXJzdF9uYW1lYCB2YXJjaGFyKDY0KSBub3QgbnVsbCxcbiAgICAgKiAgIGBsYXN0X25hbWVgIHZhcmNoYXIoNjQpIG5vdCBudWxsXG4gICAgICogKSBjb2xsYXRlIHV0ZjhfdW5pY29kZV9jaVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5ub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdG8gY3JlYXRlIHRhYmxlIGZyb20gYHNlbGVjdGAgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ2NvcHknKVxuICAgICAqICAgLnRlbXBvcmFyeSgpXG4gICAgICogICAuYXMoZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGVtcG9yYXJ5IHRhYmxlIFwiY29weVwiIGFzXG4gICAgICogc2VsZWN0IFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RRdWVyeTogcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxscyB0aGUgZ2l2ZW4gZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3Rlc3QnKVxuICAgICAqICAgLiRjYWxsKChidWlsZGVyKSA9PiBidWlsZGVyLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGNyZWF0aW5nIHJldXNhYmxlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBjYWxsZWQgd2l0aCBhIGJ1aWxkZXIuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHR5cGUgQ3JlYXRlVGFibGVCdWlsZGVyLCBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBhZGREZWZhdWx0Q29sdW1ucyA9IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICAgKiAgIHJldHVybiBjdGJcbiAgICAgKiAgICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAgIC5hZGRDb2x1bW4oJ2NyZWF0ZWRfYXQnLCAnZGF0ZScsIChjb2wpID0+XG4gICAgICogICAgICAgY29sLm5vdE51bGwoKS5kZWZhdWx0VG8oc3FsYG5vdygpYClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ2RhdGUnLCAoY29sKSA9PlxuICAgICAqICAgICAgIGNvbC5ub3ROdWxsKCkuZGVmYXVsdFRvKHNxbGBub3coKWApXG4gICAgICogICAgIClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgndGVzdCcpXG4gICAgICogICAuJGNhbGwoYWRkRGVmYXVsdENvbHVtbnMpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLWluZGV4LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wSW5kZXhCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHRhYmxlIHRoZSBpbmRleCB3YXMgY3JlYXRlZCBmb3IuIFRoaXMgaXMgbm90IG5lZWRlZFxuICAgICAqIGluIGFsbCBkaWFsZWN0cy5cbiAgICAgKi9cbiAgICBvbih0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHBhcnNlVGFibGUodGFibGUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZkV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcEluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atc2NoZW1hLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEcm9wU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3Atc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BTY2hlbWFCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBpZkV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEcm9wVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVGFibGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBpZkV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVZpZXdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoY3JlYXRlVmlldywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVmlldyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbW1lZGlhdGUtdmFsdWUtcGx1Z2luLmQudHNcIiAvPlxuaW1wb3J0IHsgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciB9IGZyb20gJy4vaW1tZWRpYXRlLXZhbHVlLXRyYW5zZm9ybWVyLmpzJztcbi8qKlxuICogVHJhbnNmb3JtcyBhbGwgVmFsdWVOb2RlcyB0byBpbW1lZGlhdGUuXG4gKlxuICogV0FSTklORyEgVGhpcyBzaG91bGQgbmV2ZXIgYmUgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVXNlcnMgc2hvdWxkIG5ldmVyIHVzZSB0aGlzLlxuICogVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBJbW1lZGlhdGVWYWx1ZVBsdWdpbiB7XG4gICAgI3RyYW5zZm9ybWVyID0gbmV3IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIoKTtcbiAgICB0cmFuc2Zvcm1RdWVyeShhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSwgYXJncy5xdWVyeUlkKTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVzdWx0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhcmdzLnJlc3VsdCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdmlldy1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlQ29sdW1uTmFtZSB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IEltbWVkaWF0ZVZhbHVlUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL2ltbWVkaWF0ZS12YWx1ZS9pbW1lZGlhdGUtdmFsdWUtcGx1Z2luLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJ0ZW1wb3JhcnlcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSB2aWV3LlxuICAgICAqL1xuICAgIHRlbXBvcmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXRlcmlhbGl6ZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT25seSBpbXBsZW1lbnRlZCBvbiBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLiBPbiBtb3N0IGRpYWxlY3RzLCB1c2Uge0BsaW5rIG9yUmVwbGFjZX0uXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmTm90RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvclJlcGxhY2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG9yUmVwbGFjZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMubWFwKHBhcnNlQ29sdW1uTmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdCBxdWVyeSBvciBhIGB2YWx1ZXNgIHN0YXRlbWVudCB0aGF0IGNyZWF0ZXMgdGhlIHZpZXcuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFNvbWUgZGlhbGVjdHMgZG9uJ3Qgc3VwcG9ydCBwYXJhbWV0ZXJpemVkIHF1ZXJpZXMgaW4gRERMIHN0YXRlbWVudHMgYW5kIHRoZXJlZm9yZVxuICAgICAqIHRoZSBxdWVyeSBvciByYXcge0BsaW5rIHNxbCB9IGV4cHJlc3Npb24gcGFzc2VkIGhlcmUgaXMgaW50ZXJwb2xhdGVkIGludG8gYSBzaW5nbGVcbiAgICAgKiBzdHJpbmcgb3BlbmluZyBhbiBTUUwgaW5qZWN0aW9uIHZ1bG5lcmFiaWxpdHkuIERPIE5PVCBwYXNzIHVuY2hlY2tlZCB1c2VyIGlucHV0XG4gICAgICogaW50byB0aGUgcXVlcnkgb3IgcmF3IGV4cHJlc3Npb24gcGFzc2VkIHRvIHRoaXMgbWV0aG9kIVxuICAgICAqL1xuICAgIGFzKHF1ZXJ5KSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5Tm9kZSA9IHF1ZXJ5XG4gICAgICAgICAgICAud2l0aFBsdWdpbihuZXcgSW1tZWRpYXRlVmFsdWVQbHVnaW4oKSlcbiAgICAgICAgICAgIC50b09wZXJhdGlvbk5vZGUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYXM6IHF1ZXJ5Tm9kZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atdmlldy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BWaWV3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcFZpZXdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUobmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wVmlldyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXZpZXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IERyb3BWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVmlld0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNjYWRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdHlwZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgVmFsdWVMaXN0Tm9kZSB9IGZyb20gJy4vdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4vdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ3JlYXRlVHlwZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVR5cGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRW51bShjcmVhdGVUeXBlLCB2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUeXBlLFxuICAgICAgICAgICAgZW51bTogVmFsdWVMaXN0Tm9kZS5jcmVhdGUodmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFudW0gdHlwZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuY3JlYXRlVHlwZSgnc3BlY2llcycpLmFzRW51bShbJ2NhdCcsICdkb2cnLCAnZnJvZyddKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzRW51bSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNsb25lV2l0aEVudW0odGhpcy4jcHJvcHMubm9kZSwgdmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdHlwZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcFR5cGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUeXBlTm9kZScsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wVHlwZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZHJvcFR5cGUsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10eXBlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEcm9wVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcFR5cGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBpZkV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVHlwZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVHlwZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2lkZW50aWZpZXItcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIoaWQpIHtcbiAgICBjb25zdCBTQ0hFTUFfU0VQQVJBVE9SID0gJy4nO1xuICAgIGlmIChpZC5pbmNsdWRlcyhTQ0hFTUFfU0VQQVJBVE9SKSkge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGlkLnNwbGl0KFNDSEVNQV9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZVdpdGhTY2hlbWEocGFydHNbMF0sIHBhcnRzWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzY2hlbWFibGUgaWRlbnRpZmllciAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKGlkKTtcbiAgICB9XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoY3JlYXRlVmlldywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVmlldyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJjb25jdXJyZW50bHlcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIHRvIHJlZnJlc2ggdGhlIHZpZXcgd2l0aG91dCBsb2NraW5nIG91dCBjb25jdXJyZW50IHNlbGVjdHMgb24gdGhlIG1hdGVyaWFsaXplZCB2aWV3LlxuICAgICAqXG4gICAgICogV0FSTklORyFcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFwid2l0aCBubyBkYXRhXCIgbW9kaWZpZXIuXG4gICAgICovXG4gICAgY29uY3VycmVudGx5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRseTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3aXRoTm9EYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJ3aXRoIGRhdGFcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHNwZWNpZmllZCAob3IgZGVmYXVsdHMpIHRoZSBiYWNraW5nIHF1ZXJ5IGlzIGV4ZWN1dGVkIHRvIHByb3ZpZGUgdGhlIG5ldyBkYXRhLCBhbmQgdGhlIG1hdGVyaWFsaXplZCB2aWV3IGlzIGxlZnQgaW4gYSBzY2FubmFibGUgc3RhdGVcbiAgICAgKi9cbiAgICB3aXRoRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB3aXRoTm9EYXRhOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJ3aXRoIG5vIGRhdGFcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHNwZWNpZmllZCwgbm8gbmV3IGRhdGEgaXMgZ2VuZXJhdGVkIGFuZCB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaXMgbGVmdCBpbiBhbiB1bnNjYW5uYWJsZSBzdGF0ZS5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchXG4gICAgICogVGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoZSBcImNvbmN1cnJlbnRseVwiIG1vZGlmaWVyLlxuICAgICAqL1xuICAgIHdpdGhOb0RhdGEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgd2l0aE5vRGF0YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25jdXJyZW50bHk6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCkpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2NoZW1hLmQudHNcIiAvPlxuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENyZWF0ZUluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IENyZWF0ZVNjaGVtYU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3Atc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQnVpbGRlciB9IGZyb20gJy4vYWx0ZXItdGFibGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVNjaGVtYUJ1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZUJ1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS10YWJsZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtaW5kZXgtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wU2NoZW1hQnVpbGRlciB9IGZyb20gJy4vZHJvcC1zY2hlbWEtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXRhYmxlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4uL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgV2l0aFNjaGVtYVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld0J1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdmlldy1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BWaWV3QnVpbGRlciB9IGZyb20gJy4vZHJvcC12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVHlwZUJ1aWxkZXIgfSBmcm9tICcuL2NyZWF0ZS10eXBlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcFR5cGVCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXR5cGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUeXBlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS10eXBlLW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10eXBlLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIH0gZnJvbSAnLi4vcGFyc2VyL2lkZW50aWZpZXItcGFyc2VyLmpzJztcbmltcG9ydCB7IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciB9IGZyb20gJy4vcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1idWlsZGVyLmpzJztcbmltcG9ydCB7IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5qcyc7XG4vKipcbiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGRhdGFiYXNlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYU1vZHVsZSB7XG4gICAgI2V4ZWN1dG9yO1xuICAgIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3I7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSBuZXcgdGFibGUgd2l0aCBjb2x1bW5zIGBpZGAsIGBmaXJzdF9uYW1lYCxcbiAgICAgKiBgbGFzdF9uYW1lYCBhbmQgYGdlbmRlcmA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcicsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXInLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2dlbmRlcicsICd2YXJjaGFyJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgdGFibGUgd2l0aCBhIGZvcmVpZ24ga2V5LiBOb3QgYWxsIGRhdGFiYXNlXG4gICAgICogZW5naW5lcyBzdXBwb3J0IGNvbHVtbi1sZXZlbCBmb3JlaWduIGtleSBjb25zdHJhaW50IGRlZmluaXRpb25zLlxuICAgICAqIEZvciBleGFtcGxlIGlmIHlvdSBhcmUgdXNpbmcgTXlTUUwgNS5YIHNlZSB0aGUgbmV4dCBleGFtcGxlIGFmdGVyXG4gICAgICogdGhpcyBvbmUuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sXG4gICAgICogICAgIC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKVxuICAgICAqICAgICAub25EZWxldGUoJ2Nhc2NhZGUnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50IGZvciBhIGNvbHVtbnMganVzdFxuICAgICAqIGxpa2UgdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCB1c2luZyBhIHRhYmxlLWxldmVsIHN0YXRlbWVudC5cbiAgICAgKiBPbiBNeVNRTCA1LlggeW91IG5lZWQgdG8gZGVmaW5lIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGxpa2VcbiAgICAgKiB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKS5hdXRvSW5jcmVtZW50KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ3BldF9vd25lcl9pZF9mb3JlaWduJywgWydvd25lcl9pZCddLCAncGVyc29uJywgWydpZCddLFxuICAgICAqICAgICAoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVGFibGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcm9wIGEgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuZHJvcFRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFRhYmxlTm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGluZGV4LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZnVsbF9uYW1lX3VuaXF1ZV9pbmRleCcpXG4gICAgICogICAub24oJ3BlcnNvbicpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jcmVhdGUoaW5kZXhOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYW4gaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuZHJvcEluZGV4KCdwZXJzb25fZnVsbF9uYW1lX3VuaXF1ZV9pbmRleCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcEluZGV4KGluZGV4TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcEluZGV4Tm9kZS5jcmVhdGUoaW5kZXhOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBzY2hlbWEuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlU2NoZW1hKCdzb21lX3NjaGVtYScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlU2NoZW1hTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuZHJvcFNjaGVtYSgnc29tZV9zY2hlbWEnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFNjaGVtYU5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbHRlciBhIHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWx0ZXJDb2x1bW4oJ2ZpcnN0X25hbWUnLCAoYWMpID0+IGFjLnNldERhdGFUeXBlKCd0ZXh0JykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWx0ZXJUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVWaWV3KCdkb2dzJylcbiAgICAgKiAgIC5vclJlcGxhY2UoKVxuICAgICAqICAgLmFzKGRiLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdEFsbCgpLndoZXJlKCdzcGVjaWVzJywgJz0nLCAnZG9nJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVmlldyh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIGEgbWF0ZXJpYWxpemVkIHZpZXcuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAucmVmcmVzaE1hdGVyaWFsaXplZFZpZXcoJ215X3ZpZXcnKVxuICAgICAqICAgLmNvbmN1cnJlbnRseSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcmVmcmVzaE1hdGVyaWFsaXplZFZpZXcodmlld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcm9wIGEgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVmlldygnZG9ncycpXG4gICAgICogICAuaWZFeGlzdHMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BWaWV3KHZpZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jcmVhdGUodmlld05hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHR5cGUuXG4gICAgICpcbiAgICAgKiBPbmx5IHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGhhdmUgdXNlci1kZWZpbmVkIHR5cGVzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVR5cGUoJ3NwZWNpZXMnKVxuICAgICAqICAgLmFzRW51bShbJ2RvZycsICdjYXQnLCAnZnJvZyddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNyZWF0ZVR5cGUodHlwZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUeXBlTm9kZS5jcmVhdGUocGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKHR5cGVOYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEcm9wIGEgdHlwZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgaGF2ZSB1c2VyLWRlZmluZWQgdHlwZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuZHJvcFR5cGUoJ3NwZWNpZXMnKVxuICAgICAqICAgLmlmRXhpc3RzKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wVHlwZSh0eXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wVHlwZU5vZGUuY3JlYXRlKHBhcnNlU2NoZW1hYmxlSWRlbnRpZmllcih0eXBlTmFtZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBzY2hlbWEgbW9kdWxlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFNb2R1bGUodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBzY2hlbWEgbW9kdWxlICB3aXRob3V0IGFueSBwbHVnaW5zLlxuICAgICAqL1xuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRob3V0UGx1Z2lucygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VlIHtAbGluayBRdWVyeUNyZWF0b3Iud2l0aFNjaGVtYX1cbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLmQudHNcIiAvPlxuaW1wb3J0IHsgRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIgfSBmcm9tICcuL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHluYW1pY1RhYmxlQnVpbGRlciB9IGZyb20gJy4vZHluYW1pYy10YWJsZS1idWlsZGVyLmpzJztcbmV4cG9ydCBjbGFzcyBEeW5hbWljTW9kdWxlIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZHluYW1pYyByZWZlcmVuY2UgdG8gYSBjb2x1bW4gdGhhdCBpcyBub3Qga25vdyBhdCBjb21waWxlIHRpbWUuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgaXMgYnVpbHQgaW4gYSB3YXkgdGhhdCBieSBkZWZhdWx0IHlvdSBjYW4ndCByZWZlciB0byB0YWJsZXMgb3IgY29sdW1uc1xuICAgICAqIHRoYXQgYXJlIG5vdCBhY3R1YWxseSB2aXNpYmxlIGluIHRoZSBjdXJyZW50IHF1ZXJ5IGFuZCBjb250ZXh0LiBUaGlzIGlzIGFsbFxuICAgICAqIGRvbmUgYnkgVHlwZVNjcmlwdCBhdCBjb21waWxlIHRpbWUsIHdoaWNoIG1lYW5zIHRoYXQgeW91IG5lZWQgdG8ga25vdyB0aGVcbiAgICAgKiBjb2x1bW5zIGFuZCB0YWJsZXMgYXQgY29tcGlsZSB0aW1lLiBUaGlzIGlzIG5vdCBhbHdheXMgdGhlIGNhc2Ugb2YgY291cnNlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgY29sdW1uIG5hbWVzXG4gICAgICogY29tZSBmcm9tIHRoZSB1c2VyIGlucHV0IG9yIGFyZSBub3Qgb3RoZXJ3aXNlIGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchIFVubGlrZSB2YWx1ZXMsIGNvbHVtbiBuYW1lcyBhcmUgbm90IGVzY2FwZWQgYnkgdGhlIGRhdGFiYXNlIGVuZ2luZVxuICAgICAqIG9yIEt5c2VseSBhbmQgaWYgeW91IHBhc3MgaW4gdW5jaGVja2VkIGNvbHVtbiBuYW1lcyB1c2luZyB0aGlzIG1ldGhvZCwgeW91XG4gICAgICogY3JlYXRlIGFuIFNRTCBpbmplY3Rpb24gdnVsbmVyYWJpbGl0eS4gQWx3YXlzIF9fYWx3YXlzX18gdmFsaWRhdGUgdGhlIHVzZXJcbiAgICAgKiBpbnB1dCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIFRoZXJlIGFyZSBjb3VwbGUgb2YgZXhhbXBsZXMgYmVsb3cgZm9yIHNvbWUgdXNlIGNhc2VzLCBidXQgeW91IGNhbiBwYXNzXG4gICAgICogYHJlZmAgdG8gb3RoZXIgbWV0aG9kcyBhcyB3ZWxsLiBJZiB0aGUgdHlwZXMgYWxsb3cgeW91IHRvIHBhc3MgYSBgcmVmYFxuICAgICAqIHZhbHVlIHRvIHNvbWUgcGxhY2UsIGl0IHNob3VsZCB3b3JrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBGaWx0ZXIgYnkgYSBjb2x1bW4gbm90IGtub3cgYXQgY29tcGlsZSB0aW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzb21lUXVlcnkoZmlsdGVyQ29sdW1uOiBzdHJpbmcsIGZpbHRlclZhbHVlOiBzdHJpbmcpIHtcbiAgICAgKiAgIGNvbnN0IHsgcmVmIH0gPSBkYi5keW5hbWljXG4gICAgICpcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC53aGVyZShyZWYoZmlsdGVyQ29sdW1uKSwgJz0nLCBmaWx0ZXJWYWx1ZSlcbiAgICAgKiAgICAgLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHNvbWVRdWVyeSgnZmlyc3RfbmFtZScsICdBcm5vbGQnKVxuICAgICAqIHNvbWVRdWVyeSgncGVyc29uLmxhc3RfbmFtZScsICdBbmlzdG9uJylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE9yZGVyIGJ5IGEgY29sdW1uIG5vdCBrbm93IGF0IGNvbXBpbGUgdGltZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gc29tZVF1ZXJ5KG9yZGVyQnk6IHN0cmluZykge1xuICAgICAqICAgY29uc3QgeyByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAuc2VsZWN0KCdwZXJzb24uZmlyc3RfbmFtZSBhcyBmbicpXG4gICAgICogICAgIC5vcmRlckJ5KHJlZihvcmRlckJ5KSlcbiAgICAgKiAgICAgLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHNvbWVRdWVyeSgnZm4nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIGFkZCBzZWxlY3Rpb25zIGR5bmFtaWNhbGx5OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogLy8gU29tZSBjb2x1bW4gbmFtZSBwcm92aWRlZCBieSB0aGUgdXNlci4gVmFsdWUgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKiBjb25zdCBjb2x1bW5Gcm9tVXNlcklucHV0OiBQb3NzaWJsZUNvbHVtbnMgPSAnYmlydGhkYXRlJztcbiAgICAgKlxuICAgICAqIC8vIEEgdHlwZSB0aGF0IGxpc3RzIGFsbCBwb3NzaWJsZSB2YWx1ZXMgYGNvbHVtbkZyb21Vc2VySW5wdXRgIGNhbiBoYXZlLlxuICAgICAqIC8vIFlvdSBjYW4gdXNlIGBrZXlvZiBQZXJzb25gIGlmIGFueSBjb2x1bW4gb2YgYW4gaW50ZXJmYWNlIGlzIGFsbG93ZWQuXG4gICAgICogdHlwZSBQb3NzaWJsZUNvbHVtbnMgPSAnbGFzdF9uYW1lJyB8ICdmaXJzdF9uYW1lJyB8ICdiaXJ0aGRhdGUnXG4gICAgICpcbiAgICAgKiBjb25zdCBbcGVyc29uXSA9IGF3YWl0IGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAuc2VsZWN0KFtcbiAgICAgKiAgICAgcmVmPFBvc3NpYmxlQ29sdW1ucz4oY29sdW1uRnJvbVVzZXJJbnB1dCksXG4gICAgICogICAgICdpZCdcbiAgICAgKiAgIF0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgcmVzdWx0aW5nIHR5cGUgY29udGFpbnMgYWxsIGBQb3NzaWJsZUNvbHVtbnNgIGFzIG9wdGlvbmFsIGZpZWxkc1xuICAgICAqIC8vIGJlY2F1c2Ugd2UgY2Fubm90IGtub3cgd2hpY2ggZmllbGQgd2FzIGFjdHVhbGx5IHNlbGVjdGVkIGJlZm9yZVxuICAgICAqIC8vIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICogY29uc3QgbGFzdE5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBwZXJzb24/Lmxhc3RfbmFtZVxuICAgICAqIGNvbnN0IGZpcnN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gcGVyc29uPy5maXJzdF9uYW1lXG4gICAgICogY29uc3QgYmlydGhEYXRlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBlcnNvbj8uYmlydGhkYXRlXG4gICAgICpcbiAgICAgKiAvLyBUaGUgcmVzdWx0IHR5cGUgYWxzbyBjb250YWlucyB0aGUgY29tcGlsZSB0aW1lIHNlbGVjdGlvbiBgaWRgLlxuICAgICAqIHBlcnNvbj8uaWRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWYocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIocmVmZXJlbmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHRhYmxlIHJlZmVyZW5jZSB0byBhIHRhYmxlIHRoYXQncyBub3QgZnVsbHkga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogVGhlIHR5cGUgYFRgIGlzIGFsbG93ZWQgdG8gYmUgYSB1bmlvbiBvZiBtdWx0aXBsZSB0YWJsZXMuXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwic2VsZWN0XCIsIFwiR2VuZXJpYyBmaW5kIHF1ZXJ5XCIsIDEzMCkgLS0+XG4gICAgICpcbiAgICAgKiBBIGdlbmVyaWMgdHlwZS1zYWZlIGhlbHBlciBmdW5jdGlvbiBmb3IgZmluZGluZyBhIHJvdyBieSBhIGNvbHVtbiB2YWx1ZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgU2VsZWN0VHlwZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJ1xuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZ2V0Um93QnlDb2x1bW48XG4gICAgICogICBUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsXG4gICAgICogICBDIGV4dGVuZHMga2V5b2YgRGF0YWJhc2VbVF0gJiBzdHJpbmcsXG4gICAgICogICBWIGV4dGVuZHMgU2VsZWN0VHlwZTxEYXRhYmFzZVtUXVtDXT4sXG4gICAgICogPih0OiBULCBjOiBDLCB2OiBWKSB7XG4gICAgICogICAvLyBXZSBuZWVkIHRvIHVzZSB0aGUgZHluYW1pYyBtb2R1bGUgc2luY2UgdGhlIHRhYmxlIG5hbWVcbiAgICAgKiAgIC8vIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUuXG4gICAgICogICBjb25zdCB7IHRhYmxlLCByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKHRhYmxlKHQpLmFzKCd0JykpXG4gICAgICogICAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgICAud2hlcmUocmVmKGMpLCAnPScsIHYpXG4gICAgICogICAgIC5vcmRlckJ5KCd0LmlkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBnZXRSb3dCeUNvbHVtbigncGVyc29uJywgJ2ZpcnN0X25hbWUnLCAnQXJub2xkJylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0YWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IER5bmFtaWNUYWJsZUJ1aWxkZXIodGFibGUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVmYXVsdC1jb25uZWN0aW9uLXByb3ZpZGVyLmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIERlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIge1xuICAgICNkcml2ZXI7XG4gICAgY29uc3RydWN0b3IoZHJpdmVyKSB7XG4gICAgICAgIHRoaXMuI2RyaXZlciA9IGRyaXZlcjtcbiAgICB9XG4gICAgYXN5bmMgcHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuI2RyaXZlci5hY3F1aXJlQ29ubmVjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnN1bWVyKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jZHJpdmVyLnJlbGVhc2VDb25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgUXVlcnlFeGVjdXRvckJhc2UgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMnO1xuZXhwb3J0IGNsYXNzIERlZmF1bHRRdWVyeUV4ZWN1dG9yIGV4dGVuZHMgUXVlcnlFeGVjdXRvckJhc2Uge1xuICAgICNjb21waWxlcjtcbiAgICAjYWRhcHRlcjtcbiAgICAjY29ubmVjdGlvblByb3ZpZGVyO1xuICAgIGNvbnN0cnVjdG9yKGNvbXBpbGVyLCBhZGFwdGVyLCBjb25uZWN0aW9uUHJvdmlkZXIsIHBsdWdpbnMgPSBbXSkge1xuICAgICAgICBzdXBlcihwbHVnaW5zKTtcbiAgICAgICAgdGhpcy4jY29tcGlsZXIgPSBjb21waWxlcjtcbiAgICAgICAgdGhpcy4jYWRhcHRlciA9IGFkYXB0ZXI7XG4gICAgICAgIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciA9IGNvbm5lY3Rpb25Qcm92aWRlcjtcbiAgICB9XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhZGFwdGVyO1xuICAgIH1cbiAgICBjb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29tcGlsZXIuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICByZXR1cm4gdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLnByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbnMocGx1Z2lucykge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFsuLi50aGlzLnBsdWdpbnMsIC4uLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbLi4udGhpcy5wbHVnaW5zLCBwbHVnaW5dKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciwgW3BsdWdpbiwgLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvblByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgWy4uLnRoaXMucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbXSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wZXJmb3JtYW5jZS1ub3cuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkge1xuICAgIGlmICh0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnICYmIGlzRnVuY3Rpb24ocGVyZm9ybWFuY2Uubm93KSkge1xuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3J1bnRpbWUtZHJpdmVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGVyZm9ybWFuY2VOb3cgfSBmcm9tICcuLi91dGlsL3BlcmZvcm1hbmNlLW5vdy5qcyc7XG4vKipcbiAqIEEgc21hbGwgd3JhcHBlciBhcm91bmQge0BsaW5rIERyaXZlcn0gdGhhdCBtYWtlcyBzdXJlIHRoZSBkcml2ZXIgaXNcbiAqIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyB1c2VkLCBvbmx5IGluaXRpYWxpemVkIGFuZCBkZXN0cm95ZWRcbiAqIG9uY2UgZXRjLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZURyaXZlciB7XG4gICAgI2RyaXZlcjtcbiAgICAjbG9nO1xuICAgICNpbml0UHJvbWlzZTtcbiAgICAjaW5pdERvbmU7XG4gICAgI2Rlc3Ryb3lQcm9taXNlO1xuICAgICNjb25uZWN0aW9ucyA9IG5ldyBXZWFrU2V0KCk7XG4gICAgY29uc3RydWN0b3IoZHJpdmVyLCBsb2cpIHtcbiAgICAgICAgdGhpcy4jaW5pdERvbmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgICAgICB0aGlzLiNsb2cgPSBsb2c7XG4gICAgfVxuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcml2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2luaXRQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNpbml0UHJvbWlzZSA9IHRoaXMuI2RyaXZlclxuICAgICAgICAgICAgICAgIC5pbml0KClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaW5pdERvbmUgPSB0cnVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2luaXRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jaW5pdFByb21pc2U7XG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy4jZGVzdHJveVByb21pc2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZHJpdmVyIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiNpbml0RG9uZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMuI2RyaXZlci5hY3F1aXJlQ29ubmVjdGlvbigpO1xuICAgICAgICBpZiAoIXRoaXMuI2Nvbm5lY3Rpb25zLmhhcyhjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuI25lZWRzTG9nZ2luZygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jYWRkTG9nZ2luZyhjb25uZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuI2Nvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIGJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5iZWdpblRyYW5zYWN0aW9uKGNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICB9XG4gICAgY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLmNvbW1pdFRyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICByb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH1cbiAgICBzYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIuc2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGBzYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIHJvbGxiYWNrVG9TYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yb2xsYmFja1RvU2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHJvbGxiYWNrVG9TYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIHJlbGVhc2VTYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KSB7XG4gICAgICAgIGlmICh0aGlzLiNkcml2ZXIucmVsZWFzZVNhdmVwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuI2RyaXZlci5yZWxlYXNlU2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHJlbGVhc2VTYXZlcG9pbnRgIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyJyk7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy4jaW5pdFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNpbml0UHJvbWlzZTtcbiAgICAgICAgaWYgKCF0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy4jZGVzdHJveVByb21pc2UgPSB0aGlzLiNkcml2ZXIuZGVzdHJveSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNkZXN0cm95UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2Rlc3Ryb3lQcm9taXNlO1xuICAgIH1cbiAgICAjbmVlZHNMb2dnaW5nKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuI2xvZy5pc0xldmVsRW5hYmxlZCgncXVlcnknKSB8fCB0aGlzLiNsb2cuaXNMZXZlbEVuYWJsZWQoJ2Vycm9yJykpO1xuICAgIH1cbiAgICAvLyBUaGlzIG1ldGhvZCBtb25rZXkgcGF0Y2hlcyB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbidzIGV4ZWN1dGVRdWVyeSBtZXRob2RcbiAgICAvLyBieSBhZGRpbmcgbG9nZ2luZyBjb2RlIGFyb3VuZCBpdC4gTW9ua2V5IHBhdGNoaW5nIGlzIG5vdCBwcmV0dHksIGJ1dCBpdCdzXG4gICAgLy8gdGhlIGJlc3Qgb3B0aW9uIGluIHRoaXMgY2FzZS5cbiAgICAjYWRkTG9nZ2luZyhjb25uZWN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVRdWVyeSA9IGNvbm5lY3Rpb24uZXhlY3V0ZVF1ZXJ5O1xuICAgICAgICBjb25zdCBzdHJlYW1RdWVyeSA9IGNvbm5lY3Rpb24uc3RyZWFtUXVlcnk7XG4gICAgICAgIGNvbnN0IGRpcyA9IHRoaXM7XG4gICAgICAgIGNvbm5lY3Rpb24uZXhlY3V0ZVF1ZXJ5ID0gYXN5bmMgKGNvbXBpbGVkUXVlcnkpID0+IHtcbiAgICAgICAgICAgIGxldCBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlUXVlcnkuY2FsbChjb25uZWN0aW9uLCBjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dFcnJvcihlcnJvciwgY29tcGlsZWRRdWVyeSwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmICghY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29ubmVjdGlvbi5zdHJlYW1RdWVyeSA9IGFzeW5jIGZ1bmN0aW9uKiAoY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSB7XG4gICAgICAgICAgICBsZXQgY2F1Z2h0RXJyb3I7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHJlc3VsdCBvZiBzdHJlYW1RdWVyeS5jYWxsKGNvbm5lY3Rpb24sIGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dFcnJvcihlcnJvciwgY29tcGlsZWRRdWVyeSwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGlmICghY2F1Z2h0RXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzLiNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jbG9nLmVycm9yKCgpID0+ICh7XG4gICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgcXVlcnk6IGNvbXBpbGVkUXVlcnksXG4gICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiB0aGlzLiNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGFzeW5jICNsb2dRdWVyeShjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUsIGlzU3RyZWFtID0gZmFsc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jbG9nLnF1ZXJ5KCgpID0+ICh7XG4gICAgICAgICAgICBsZXZlbDogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGlzU3RyZWFtLFxuICAgICAgICAgICAgcXVlcnk6IGNvbXBpbGVkUXVlcnksXG4gICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiB0aGlzLiNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgICNjYWxjdWxhdGVEdXJhdGlvbk1pbGxpcyhzdGFydFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlTm93KCkgLSBzdGFydFRpbWU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zaW5nbGUtY29ubmVjdGlvbi1wcm92aWRlci5kLnRzXCIgLz5cbmNvbnN0IGlnbm9yZUVycm9yID0gKCkgPT4geyB9O1xuZXhwb3J0IGNsYXNzIFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciB7XG4gICAgI2Nvbm5lY3Rpb247XG4gICAgI3J1bm5pbmdQcm9taXNlO1xuICAgIGNvbnN0cnVjdG9yKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvbiA9IGNvbm5lY3Rpb247XG4gICAgfVxuICAgIGFzeW5jIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHdoaWxlICh0aGlzLiNydW5uaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcnVubmluZ1Byb21pc2UuY2F0Y2goaWdub3JlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGAjcnVubmluZ1Byb21pc2VgIG11c3QgYmUgc2V0IHRvIHVuZGVmaW5lZCBiZWZvcmUgaXQnc1xuICAgICAgICAvLyByZXNvbHZlZCBvciByZWplY3RlZC4gT3RoZXJ3aXNlIHRoZSB3aGlsZSBsb29wIGFib3ZlXG4gICAgICAgIC8vIHdpbGwgbWlzYmVoYXZlLlxuICAgICAgICB0aGlzLiNydW5uaW5nUHJvbWlzZSA9IHRoaXMuI3J1bihjb25zdW1lcikuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNydW5uaW5nUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNydW5uaW5nUHJvbWlzZTtcbiAgICB9XG4gICAgLy8gUnVuIHRoZSBydW5uZXIgaW4gYW4gYXN5bmMgZnVuY3Rpb24gdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3RcbiAgICAvLyB0aHJvdyBzeW5jaHJvbm91cyBlcnJvcnMuXG4gICAgYXN5bmMgI3J1bihydW5uZXIpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bm5lcih0aGlzLiNjb25uZWN0aW9uKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RyaXZlci5kLnRzXCIgLz5cbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMgPSBbJ3JlYWQgb25seScsICdyZWFkIHdyaXRlJ107XG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05fSVNPTEFUSU9OX0xFVkVMUyA9IFtcbiAgICAncmVhZCB1bmNvbW1pdHRlZCcsXG4gICAgJ3JlYWQgY29tbWl0dGVkJyxcbiAgICAncmVwZWF0YWJsZSByZWFkJyxcbiAgICAnc2VyaWFsaXphYmxlJyxcbiAgICAnc25hcHNob3QnLFxuXTtcbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICBpZiAoc2V0dGluZ3MuYWNjZXNzTW9kZSAmJlxuICAgICAgICAhVFJBTlNBQ1RJT05fQUNDRVNTX01PREVTLmluY2x1ZGVzKHNldHRpbmdzLmFjY2Vzc01vZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB0cmFuc2FjdGlvbiBhY2Nlc3MgbW9kZSAke3NldHRpbmdzLmFjY2Vzc01vZGV9YCk7XG4gICAgfVxuICAgIGlmIChzZXR0aW5ncy5pc29sYXRpb25MZXZlbCAmJlxuICAgICAgICAhVFJBTlNBQ1RJT05fSVNPTEFUSU9OX0xFVkVMUy5pbmNsdWRlcyhzZXR0aW5ncy5pc29sYXRpb25MZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGlzb2xhdGlvbiBsZXZlbCAke3NldHRpbmdzLmlzb2xhdGlvbkxldmVsfWApO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbG9nLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplLCBpc0Z1bmN0aW9uIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNvbnN0IExPR19MRVZFTFMgPSBmcmVlemUoWydxdWVyeScsICdlcnJvciddKTtcbmV4cG9ydCBjbGFzcyBMb2cge1xuICAgICNsZXZlbHM7XG4gICAgI2xvZ2dlcjtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29uZmlnKSkge1xuICAgICAgICAgICAgdGhpcy4jbG9nZ2VyID0gY29uZmlnO1xuICAgICAgICAgICAgdGhpcy4jbGV2ZWxzID0gZnJlZXplKHtcbiAgICAgICAgICAgICAgICBxdWVyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jbG9nZ2VyID0gZGVmYXVsdExvZ2dlcjtcbiAgICAgICAgICAgIHRoaXMuI2xldmVscyA9IGZyZWV6ZSh7XG4gICAgICAgICAgICAgICAgcXVlcnk6IGNvbmZpZy5pbmNsdWRlcygncXVlcnknKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogY29uZmlnLmluY2x1ZGVzKCdlcnJvcicpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXNMZXZlbEVuYWJsZWQobGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2xldmVsc1tsZXZlbF07XG4gICAgfVxuICAgIGFzeW5jIHF1ZXJ5KGdldEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNsZXZlbHMucXVlcnkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2xvZ2dlcihnZXRFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBlcnJvcihnZXRFdmVudCkge1xuICAgICAgICBpZiAodGhpcy4jbGV2ZWxzLmVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNsb2dnZXIoZ2V0RXZlbnQoKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBkZWZhdWx0TG9nZ2VyKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmxldmVsID09PSAncXVlcnknKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGBreXNlbHk6cXVlcnk6JHtldmVudC5pc1N0cmVhbSA/ICdzdHJlYW06JyA6ICcnfWA7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3ByZWZpeH0gJHtldmVudC5xdWVyeS5zcWx9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3ByZWZpeH0gZHVyYXRpb246ICR7ZXZlbnQucXVlcnlEdXJhdGlvbk1pbGxpcy50b0ZpeGVkKDEpfW1zYCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2ZW50LmxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgIGlmIChldmVudC5lcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBreXNlbHk6ZXJyb3I6ICR7ZXZlbnQuZXJyb3Iuc3RhY2sgPz8gZXZlbnQuZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGt5c2VseTplcnJvcjogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGV2ZW50LmVycm9yLFxuICAgICAgICAgICAgICAgIHF1ZXJ5OiBldmVudC5xdWVyeS5zcWwsXG4gICAgICAgICAgICAgICAgcXVlcnlEdXJhdGlvbk1pbGxpczogZXZlbnQucXVlcnlEdXJhdGlvbk1pbGxpcyxcbiAgICAgICAgICAgIH0pfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb21waWxhYmxlLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNPYmplY3QgfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gaXNDb21waWxhYmxlKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHZhbHVlKSAmJiBpc0Z1bmN0aW9uKHZhbHVlLmNvbXBpbGUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9reXNlbHkuZC50c1wiIC8+XG5pbXBvcnQgeyBTY2hlbWFNb2R1bGUgfSBmcm9tICcuL3NjaGVtYS9zY2hlbWEuanMnO1xuaW1wb3J0IHsgRHluYW1pY01vZHVsZSB9IGZyb20gJy4vZHluYW1pYy9keW5hbWljLmpzJztcbmltcG9ydCB7IERlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL2RyaXZlci9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlDcmVhdG9yIH0gZnJvbSAnLi9xdWVyeS1jcmVhdG9yLmpzJztcbmltcG9ydCB7IERlZmF1bHRRdWVyeUV4ZWN1dG9yIH0gZnJvbSAnLi9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IGZyZWV6ZSwgaXNPYmplY3QsIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBSdW50aW1lRHJpdmVyIH0gZnJvbSAnLi9kcml2ZXIvcnVudGltZS1kcml2ZXIuanMnO1xuaW1wb3J0IHsgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIH0gZnJvbSAnLi9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzLCB9IGZyb20gJy4vZHJpdmVyL2RyaXZlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVGdW5jdGlvbk1vZHVsZSwgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvZnVuY3Rpb24tbW9kdWxlLmpzJztcbmltcG9ydCB7IExvZyB9IGZyb20gJy4vdXRpbC9sb2cuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBpc0NvbXBpbGFibGUgfSBmcm9tICcuL3V0aWwvY29tcGlsYWJsZS5qcyc7XG5pbXBvcnQgeyBDYXNlQnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9jYXNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ2FzZU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICcuL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtcGx1Z2luLmpzJztcbmltcG9ydCB7IHByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiwgfSBmcm9tICcuL3V0aWwvcHJvdmlkZS1jb250cm9sbGVkLWNvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4vdXRpbC9sb2ctb25jZS5qcyc7XG4vLyBAdHMtaWdub3JlXG5TeW1ib2wuYXN5bmNEaXNwb3NlID8/PSBTeW1ib2woJ1N5bWJvbC5hc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogVGhlIG1haW4gS3lzZWx5IGNsYXNzLlxuICpcbiAqIFlvdSBzaG91bGQgY3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBgS3lzZWx5YCBwZXIgZGF0YWJhc2UgdXNpbmcgdGhlIHtAbGluayBLeXNlbHl9XG4gKiBjb25zdHJ1Y3Rvci4gRWFjaCBgS3lzZWx5YCBpbnN0YW5jZSBtYWludGFpbnMgaXRzIG93biBjb25uZWN0aW9uIHBvb2wuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogVGhpcyBleGFtcGxlIGFzc3VtZXMgeW91ciBkYXRhYmFzZSBoYXMgYSBcInBlcnNvblwiIHRhYmxlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgKiBhcyBTcWxpdGUgZnJvbSAnYmV0dGVyLXNxbGl0ZTMnXG4gKiBpbXBvcnQge1x1MDBBMHR5cGUgR2VuZXJhdGVkLCBLeXNlbHksIFNxbGl0ZURpYWxlY3QgfSBmcm9tICdreXNlbHknXG4gKlxuICogaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAqICAgcGVyc29uOiB7XG4gKiAgICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+XG4gKiAgICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gKiAgICAgbGFzdF9uYW1lOiBzdHJpbmcgfCBudWxsXG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBkYiA9IG5ldyBLeXNlbHk8RGF0YWJhc2U+KHtcbiAqICAgZGlhbGVjdDogbmV3IFNxbGl0ZURpYWxlY3Qoe1xuICogICAgIGRhdGFiYXNlOiBuZXcgU3FsaXRlKCc6bWVtb3J5OicpLFxuICogICB9KVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEB0eXBlUGFyYW0gREIgLSBUaGUgZGF0YWJhc2UgaW50ZXJmYWNlIHR5cGUuIEtleXMgb2YgdGhpcyB0eXBlIG11c3QgYmUgdGFibGUgbmFtZXNcbiAqICAgIGluIHRoZSBkYXRhYmFzZSBhbmQgdmFsdWVzIG11c3QgYmUgaW50ZXJmYWNlcyB0aGF0IGRlc2NyaWJlIHRoZSByb3dzIGluIHRob3NlXG4gKiAgICB0YWJsZXMuIFNlZSB0aGUgZXhhbXBsZXMgYWJvdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBLeXNlbHkgZXh0ZW5kcyBRdWVyeUNyZWF0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIGxldCBzdXBlclByb3BzO1xuICAgICAgICBsZXQgcHJvcHM7XG4gICAgICAgIGlmIChpc0t5c2VseVByb3BzKGFyZ3MpKSB7XG4gICAgICAgICAgICBzdXBlclByb3BzID0geyBleGVjdXRvcjogYXJncy5leGVjdXRvciB9O1xuICAgICAgICAgICAgcHJvcHMgPSB7IC4uLmFyZ3MgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxlY3QgPSBhcmdzLmRpYWxlY3Q7XG4gICAgICAgICAgICBjb25zdCBkcml2ZXIgPSBkaWFsZWN0LmNyZWF0ZURyaXZlcigpO1xuICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBkaWFsZWN0LmNyZWF0ZVF1ZXJ5Q29tcGlsZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSBkaWFsZWN0LmNyZWF0ZUFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGxvZyA9IG5ldyBMb2coYXJncy5sb2cgPz8gW10pO1xuICAgICAgICAgICAgY29uc3QgcnVudGltZURyaXZlciA9IG5ldyBSdW50aW1lRHJpdmVyKGRyaXZlciwgbG9nKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm92aWRlciA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyKHJ1bnRpbWVEcml2ZXIpO1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgYXJncy5wbHVnaW5zID8/IFtdKTtcbiAgICAgICAgICAgIHN1cGVyUHJvcHMgPSB7IGV4ZWN1dG9yIH07XG4gICAgICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGFyZ3MsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICAgICAgICBkcml2ZXI6IHJ1bnRpbWVEcml2ZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHN1cGVyUHJvcHMpO1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTY2hlbWFNb2R1bGV9IG1vZHVsZSBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICAgICAqL1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI3Byb3BzLmV4ZWN1dG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRoZSB7QGxpbmsgRHluYW1pY01vZHVsZX0gbW9kdWxlLlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayBEeW5hbWljTW9kdWxlfSBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gYnlwYXNzIHN0cmljdCB0eXBpbmcgYW5kXG4gICAgICogcGFzc2luZyBpbiBkeW5hbWljIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgZ2V0IGR5bmFtaWMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY01vZHVsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIERhdGFiYXNlSW50cm9zcGVjdG9yIHwgZGF0YWJhc2UgaW50cm9zcGVjdG9yfS5cbiAgICAgKi9cbiAgICBnZXQgaW50cm9zcGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmRpYWxlY3QuY3JlYXRlSW50cm9zcGVjdG9yKHRoaXMud2l0aG91dFBsdWdpbnMoKSk7XG4gICAgfVxuICAgIGNhc2UodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jcmVhdGUoaXNVbmRlZmluZWQodmFsdWUpID8gdW5kZWZpbmVkIDogcGFyc2VFeHByZXNzaW9uKHZhbHVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZ1bmN0aW9uTW9kdWxlfSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHNvbWV3aGF0IHR5cGUtc2FmZSBmdW5jdGlvblxuICAgICAqIGNhbGxzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGNvdW50IH0gPSBkYi5mblxuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICAnaWQnLFxuICAgICAqICAgICBjb3VudCgncGV0LmlkJykuYXMoJ3BlcnNvbl9jb3VudCcpLFxuICAgICAqICAgXSlcbiAgICAgKiAgIC5ncm91cEJ5KCdwZXJzb24uaWQnKVxuICAgICAqICAgLmhhdmluZyhjb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwZXJzb25cIi5cImlkXCIsIGNvdW50KFwicGV0XCIuXCJpZFwiKSBhcyBcInBlcnNvbl9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogaW5uZXIgam9pbiBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAgICAgKiBncm91cCBieSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIGhhdmluZyBjb3VudChcInBldFwiLlwiaWRcIikgPiAkMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogV2h5IFwic29tZXdoYXRcIiB0eXBlLXNhZmU/IEJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbGxzIGFyZSBub3QgYm91bmQgdG8gdGhlXG4gICAgICogY3VycmVudCBxdWVyeSBjb250ZXh0LiBUaGV5IGFsbG93IHlvdSB0byByZWZlcmVuY2UgY29sdW1ucyBhbmQgdGFibGVzIHRoYXRcbiAgICAgKiBhcmUgbm90IGluIHRoZSBjdXJyZW50IHF1ZXJ5LiBFLmcuIHJlbW92ZSB0aGUgYGlubmVySm9pbmAgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAgKiBxdWVyeSBhbmQgVHlwZVNjcmlwdCB3b24ndCBldmVuIGNvbXBsYWluLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgZnVuY3Rpb24gY2FsbHMgZnVsbHkgdHlwZS1zYWZlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICAgKiB7QGxpbmsgRXhwcmVzc2lvbkJ1aWxkZXIuZm59IGdldHRlciBmb3IgYSBxdWVyeSBjb250ZXh0LWF3YXJlLCBzdHJpY3RlciB7QGxpbmsgRnVuY3Rpb25Nb2R1bGV9LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgJ3BlcnNvbi5pZCcsXG4gICAgICogICAgIGViLmZuLmNvdW50KCdwZXQuaWQnKS5hcygncGV0X2NvdW50JylcbiAgICAgKiAgIF0pXG4gICAgICogICAuZ3JvdXBCeSgncGVyc29uLmlkJylcbiAgICAgKiAgIC5oYXZpbmcoKGViKSA9PiBlYi5mbi5jb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGZuKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25Nb2R1bGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi4gVGhlXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSBtZXRob2QgY2FuIHRoZW4gYmUgY2FsbGVkIHRvIHJ1biB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSB0YWtlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIGluc2lkZSB0aGVcbiAgICAgKiB0cmFuc2FjdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24sXG4gICAgICogMS4gdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQsXG4gICAgICogMi4gdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrLCBhbmRcbiAgICAgKiAzLiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBhZ2Fpbi5cbiAgICAgKiBPdGhlcndpc2UgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZSB8IGV4ZWN1dGV9XG4gICAgICogbWV0aG9kIGdldHMgdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBhcyBpdHMgb25seSBhcmd1bWVudC4gVGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogb2YgdHlwZSB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGluaGVyaXRzIHtAbGluayBLeXNlbHl9LiBBbnkgcXVlcnlcbiAgICAgKiBzdGFydGVkIHRocm91Z2ggdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBpcyBleGVjdXRlZCBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcnVuIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiwgYWxsb3dpbmcgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksXG4gICAgICogdXNlIHtAbGluayBzdGFydFRyYW5zYWN0aW9ufSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiU2ltcGxlIHRyYW5zYWN0aW9uXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIFRoaXMgZXhhbXBsZSBpbnNlcnRzIHR3byByb3dzIGluIGEgdHJhbnNhY3Rpb24uIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zaWRlXG4gICAgICogdGhlIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgYGV4ZWN1dGVgIG1ldGhvZCxcbiAgICAgKiAxLiB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCxcbiAgICAgKiAyLiB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2ssIGFuZFxuICAgICAqIDMuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGFnYWluLlxuICAgICAqIE90aGVyd2lzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjYXR0byA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCkuZXhlY3V0ZShhc3luYyAodHJ4KSA9PiB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhlIGlzb2xhdGlvbiBsZXZlbDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLnRyYW5zYWN0aW9uKClcbiAgICAgKiAgIC5zZXRJc29sYXRpb25MZXZlbCgnc2VyaWFsaXphYmxlJylcbiAgICAgKiAgIC5leGVjdXRlKGFzeW5jICh0cngpID0+IHtcbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZih0cngpXG4gICAgICogICB9KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9TdHVmZihreXNlbHk6IHR5cGVvZiBkYikge1xuICAgICAqICAgLy8gLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBUaGUge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZX0gbWV0aG9kIGNhbiB0aGVuIGJlIGNhbGxlZFxuICAgICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhbmQgcmV0dXJuIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbn0uXG4gICAgICpcbiAgICAgKiBBIHtAbGluayBDb250cm9sbGVkVHJhbnNhY3Rpb259IGFsbG93cyB5b3UgdG8gY29tbWl0IGFuZCByb2xsYmFjayBtYW51YWxseSxcbiAgICAgKiBleGVjdXRlIHNhdmVwb2ludCBjb21tYW5kcy4gSXQgZXh0ZW5kcyB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGV4dGVuZHMge0BsaW5rIEt5c2VseX0sXG4gICAgICogc28geW91IGNhbiBydW4gcXVlcmllcyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLiBPbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQsXG4gICAgICogb3Igcm9sbGVkIGJhY2ssIGl0IGNhbid0IGJlIHVzZWQgYW55bW9yZSAtIGFsbCBxdWVyaWVzIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogVGhpcyBpcyB0byBwcmV2ZW50IGFjY2lkZW50YWxseSBydW5uaW5nIHF1ZXJpZXMgb3V0c2lkZSB0aGUgdHJhbnNhY3Rpb24gLSB3aGVyZVxuICAgICAqIGF0b21pY2l0eSBpcyBub3QgZ3VhcmFudGVlZCBhbnltb3JlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiQ29udHJvbGxlZCB0cmFuc2FjdGlvblwiLCAxMSkgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIHVzZSBpdCB0byBpbnNlcnQgdHdvIHJvd3MgYW5kIHRoZW4gY29tbWl0XG4gICAgICogdGhlIHRyYW5zYWN0aW9uLiBJZiBhbiBlcnJvciBpcyB0aHJvd24sIHdlIGNhdGNoIGl0IGFuZCByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnguaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgb3duZXJfaWQ6IGplbm5pZmVyLmlkLFxuICAgICAqICAgICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgaXNfZmF2b3JpdGU6IGZhbHNlLFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcInRyYW5zYWN0aW9uc1wiLCBcIkNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gL3cgc2F2ZXBvaW50c1wiLCAxMikgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIGluc2VydCBhIHBlcnNvbiwgY3JlYXRlIGEgc2F2ZXBvaW50LFxuICAgICAqIHRyeSBpbnNlcnRpbmcgYSB0b3kgYW5kIGEgcGV0LCBhbmQgaWYgYW4gZXJyb3IgaXMgdGhyb3duLCB3ZSByb2xsYmFjayB0byB0aGVcbiAgICAgKiBzYXZlcG9pbnQuIEV2ZW50dWFsbHkgd2UgcmVsZWFzZSB0aGUgc2F2ZXBvaW50LCBpbnNlcnQgYW4gYXVkaXQgcmVjb3JkIGFuZFxuICAgICAqIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uIElmIGFuIGVycm9yIGlzIHRocm93biwgd2UgY2F0Y2ggaXQgYW5kIHJvbGxiYWNrIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgamVubmlmZXIgPSBhd2FpdCB0cnhcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgdHJ5IHtcbiAgICAgKiAgICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgfSlcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3RveScpXG4gICAgICogICAgICAgLnZhbHVlcyh7IG5hbWU6ICdCb25lJywgcHJpY2U6IDEuOTksIHBldF9pZDogY2F0dG8uaWQgfSlcbiAgICAgKiAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogICB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucmVsZWFzZVNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4Lmluc2VydEludG8oJ2F1ZGl0JykudmFsdWVzKHsgYWN0aW9uOiAnYWRkZWQgSmVubmlmZXInIH0pLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeC5yb2xsYmFjaygpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGFydFRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBreXNlbHkgaW5zdGFuY2UgYm91bmQgdG8gYSBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmNvbm5lY3Rpb24oKVxuICAgICAqICAgLmV4ZWN1dGUoYXN5bmMgKGRiKSA9PiB7XG4gICAgICogICAgIC8vIGBkYmAgaXMgYW4gaW5zdGFuY2Ugb2YgYEt5c2VseWAgdGhhdCdzIGJvdW5kIHRvIGEgc2luZ2xlXG4gICAgICogICAgIC8vIGRhdGFiYXNlIGNvbm5lY3Rpb24uIEFsbCBxdWVyaWVzIGV4ZWN1dGVkIHRocm91Z2ggYGRiYCB1c2VcbiAgICAgKiAgICAgLy8gdGhlIHNhbWUgY29ubmVjdGlvbi5cbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZihkYilcbiAgICAgKiAgIH0pXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1N0dWZmKGt5c2VseTogdHlwZW9mIGRiKSB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEt5c2VseSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGggdGFibGVzIGFkZGVkIHRvIGl0c1xuICAgICAqIGRhdGFiYXNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRoZSB0eXBlcyBhbmQgZG9lc24ndCBhZmZlY3QgYW55IG9mIHRoZVxuICAgICAqIGV4ZWN1dGVkIHF1ZXJpZXMgaW4gYW55IHdheS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGFkZHMgYW5kIHVzZXMgYSB0ZW1wb3JhcnkgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZW1wX3RhYmxlJylcbiAgICAgKiAgIC50ZW1wb3JhcnkoKVxuICAgICAqICAgLmFkZENvbHVtbignc29tZV9jb2x1bW4nLCAnaW50ZWdlcicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCB0ZW1wRGIgPSBkYi53aXRoVGFibGVzPHtcbiAgICAgKiAgIHRlbXBfdGFibGU6IHtcbiAgICAgKiAgICAgc29tZV9jb2x1bW46IG51bWJlclxuICAgICAqICAgfVxuICAgICAqIH0+KClcbiAgICAgKlxuICAgICAqIGF3YWl0IHRlbXBEYlxuICAgICAqICAgLmluc2VydEludG8oJ3RlbXBfdGFibGUnKVxuICAgICAqICAgLnZhbHVlcyh7IHNvbWVfY29sdW1uOiAxMDAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoVGFibGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFuZCBkaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgYEt5c2VseWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEt5c2VseWAgaW5zdGFuY2UgaXMgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgYGRiIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25gLlxuICAgICAqL1xuICAgIGdldCBpc1RyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RXhlY3V0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBjb21waWxlZCBxdWVyeSBvciBxdWVyeSBidWlsZGVyLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20va3lzZWx5LW9yZy9reXNlbHkvYmxvYi9tYXN0ZXIvc2l0ZS9kb2NzL3JlY2lwZXMvMDAwNC1zcGxpdHRpbmctcXVlcnktYnVpbGRpbmctYW5kLWV4ZWN1dGlvbi5tZCNleGVjdXRlLWNvbXBpbGVkLXF1ZXJpZXMgc3BsaXR0aW5nIGJ1aWxkLCBjb21waWxlIGFuZCBleGVjdXRlIGNvZGUgcmVjaXBlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBleGVjdXRlUXVlcnkocXVlcnksIFxuICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGluIHRoZSBmdXR1cmUuIGRlcHJlY2F0ZWQgaW4gIDAuMjgueFxuICAgIHF1ZXJ5SWQpIHtcbiAgICAgICAgaWYgKHF1ZXJ5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9nT25jZSgnUGFzc2luZyBgcXVlcnlJZGAgaW4gYGRiLmV4ZWN1dGVRdWVyeWAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCByZXN1bHQgaW4gYSBjb21waWxlLXRpbWUgZXJyb3IgaW4gdGhlIGZ1dHVyZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gaXNDb21waWxhYmxlKHF1ZXJ5KSA/IHF1ZXJ5LmNvbXBpbGUoKSA6IHF1ZXJ5O1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFeGVjdXRvcigpLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICB9XG4gICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBLeXNlbHkge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gcHJvcHM7XG4gICAgfVxuICAgIC8vIFRoZSByZXR1cm4gdHlwZSBpcyBgdHJ1ZWAgaW5zdGVhZCBvZiBgYm9vbGVhbmAgdG8gbWFrZSBLeXNlbHk8REI+XG4gICAgLy8gdW5hc3NpZ25hYmxlIHRvIFRyYW5zYWN0aW9uPERCPiB3aGlsZSBhbGxvd2luZyBhc3NpZ25tZW50IHRoZVxuICAgIC8vIG90aGVyIHdheSBhcm91bmQuXG4gICAgZ2V0IGlzVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0cmFuc2FjdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSB0cmFuc2FjdGlvbiBtZXRob2QgZm9yIGEgVHJhbnNhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICBjb25uZWN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdGhlIGNvbm5lY3Rpb24gbWV0aG9kIGZvciBhIFRyYW5zYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBkZXN0cm95IG1ldGhvZCBmb3IgYSBUcmFuc2FjdGlvbiBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoVGFibGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzS3lzZWx5UHJvcHMob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgIGlzT2JqZWN0KG9iai5jb25maWcpICYmXG4gICAgICAgIGlzT2JqZWN0KG9iai5kcml2ZXIpICYmXG4gICAgICAgIGlzT2JqZWN0KG9iai5leGVjdXRvcikgJiZcbiAgICAgICAgaXNPYmplY3Qob2JqLmRpYWxlY3QpKTtcbn1cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZShjYWxsYmFjaykge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aENvbm5lY3Rpb25Qcm92aWRlcihuZXcgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb24pKTtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gbmV3IEt5c2VseSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjayhkYik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHNldEFjY2Vzc01vZGUoYWNjZXNzTW9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFjY2Vzc01vZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGlzb2xhdGlvbkxldmVsLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZShjYWxsYmFjaykge1xuICAgICAgICBjb25zdCB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlLCAuLi5reXNlbHlQcm9wcyB9ID0gdGhpcy4jcHJvcHM7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0geyBpc29sYXRpb25MZXZlbCwgYWNjZXNzTW9kZSB9O1xuICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aENvbm5lY3Rpb25Qcm92aWRlcihuZXcgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb24pKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgICAgICAuLi5reXNlbHlQcm9wcyxcbiAgICAgICAgICAgICAgICBleGVjdXRvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uQmVndW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uQmVndW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbkJlZ3VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5yb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHNldEFjY2Vzc01vZGUoYWNjZXNzTW9kZSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhY2Nlc3NNb2RlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0SXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBjb25zdCB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlLCAuLi5wcm9wcyB9ID0gdGhpcy4jcHJvcHM7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0geyBpc29sYXRpb25MZXZlbCwgYWNjZXNzTW9kZSB9O1xuICAgICAgICB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uKHRoaXMuI3Byb3BzLmV4ZWN1dG9yKTtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbi5jb25uZWN0aW9uLCBzZXR0aW5ncyk7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgY29ubmVjdGlvbixcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKG5ldyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvbi5jb25uZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVkVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbiB7XG4gICAgI3Byb3BzO1xuICAgICNjb21waWxlUXVlcnk7XG4gICAgI3N0YXRlO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0geyBpc0NvbW1pdHRlZDogZmFsc2UsIGlzUm9sbGVkQmFjazogZmFsc2UgfTtcbiAgICAgICAgcHJvcHMgPSB7XG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IocHJvcHMuZXhlY3V0b3IsIHN0YXRlKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgeyBjb25uZWN0aW9uLCAuLi50cmFuc2FjdGlvblByb3BzIH0gPSBwcm9wcztcbiAgICAgICAgc3VwZXIodHJhbnNhY3Rpb25Qcm9wcyk7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgcXVlcnlJZCA9IGNyZWF0ZVF1ZXJ5SWQoKTtcbiAgICAgICAgdGhpcy4jY29tcGlsZVF1ZXJ5ID0gKG5vZGUpID0+IHByb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKTtcbiAgICB9XG4gICAgZ2V0IGlzQ29tbWl0dGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc3RhdGUuaXNDb21taXR0ZWQ7XG4gICAgfVxuICAgIGdldCBpc1JvbGxlZEJhY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZS5pc1JvbGxlZEJhY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayByb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4KVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeC5yb2xsYmFjaygpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb21taXQoKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24odGhpcy4jcHJvcHMuY29ubmVjdGlvbi5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuI3N0YXRlLmlzQ29tbWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24ucmVsZWFzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUm9sbHMgYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGNvbW1pdH0gYW5kIHtAbGluayByb2xsYmFja1RvU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cngpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJvbGxiYWNrKCkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24odGhpcy4jcHJvcHMuY29ubmVjdGlvbi5jb25uZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuI3N0YXRlLmlzUm9sbGVkQmFjayA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLiNwcm9wcy5jb25uZWN0aW9uLnJlbGVhc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzYXZlcG9pbnQgd2l0aCBhIGdpdmVuIG5hbWUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9IGFuZCB7QGxpbmsgcmVsZWFzZVNhdmVwb2ludH0uXG4gICAgICpcbiAgICAgKiBGb3IgYSB0eXBlLXNhZmUgZXhwZXJpZW5jZSwgeW91IHNob3VsZCB1c2UgdGhlIHJldHVybmVkIGluc3RhbmNlIGZyb20gbm93IG9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgaW5zZXJ0SmVubmlmZXIodHJ4KVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4QWZ0ZXJKZW5uaWZlciA9IGF3YWl0IHRyeC5zYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4QWZ0ZXJKZW5uaWZlcilcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yb2xsYmFja1RvU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2F2ZXBvaW50KHNhdmVwb2ludE5hbWUpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5zYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUm9sbHMgYmFjayB0byBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc2F2ZXBvaW50fSBhbmQge0BsaW5rIHJlbGVhc2VTYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogWW91IG11c3QgdXNlIHRoZSBzYW1lIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBzYXZlcG9pbnR9LCBvclxuICAgICAqIGVzY2FwZSB0aGUgdHlwZS1jaGVjayBieSB1c2luZyBgYXMgYW55YC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGF3YWl0IGluc2VydEplbm5pZmVyKHRyeClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeEFmdGVySmVubmlmZXIpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBpbnNlcnRKZW5uaWZlcihreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJvbGxiYWNrVG9TYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVsZWFzZXMgYSBzYXZlcG9pbnQgd2l0aCBhIGdpdmVuIG5hbWUuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHNhdmVwb2ludH0gYW5kIHtAbGluayByb2xsYmFja1RvU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHVzZSB0aGUgc2FtZSBpbnN0YW5jZSByZXR1cm5lZCBieSB7QGxpbmsgc2F2ZXBvaW50fSwgb3JcbiAgICAgKiBlc2NhcGUgdGhlIHR5cGUtY2hlY2sgYnkgdXNpbmcgYGFzIGFueWAuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBpbnNlcnRKZW5uaWZlcih0cngpXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cnhBZnRlckplbm5pZmVyKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yZWxlYXNlU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgZG9Tb21ldGhpbmdFbHNlKHRyeClcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmdFbHNlKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWxlYXNlU2F2ZXBvaW50KHNhdmVwb2ludE5hbWUpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5yZWxlYXNlU2F2ZXBvaW50Py4odGhpcy4jcHJvcHMuY29ubmVjdGlvbi5jb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCB0aGlzLiNjb21waWxlUXVlcnkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRob3V0UGx1Z2lucygpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoVGFibGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDb21tYW5kIHtcbiAgICAjY2I7XG4gICAgY29uc3RydWN0b3IoY2IpIHtcbiAgICAgICAgdGhpcy4jY2IgPSBjYjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2NiKCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmlzQ29tbWl0dGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgYWxyZWFkeSBjb21taXR0ZWQnKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmlzUm9sbGVkQmFjaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIGFscmVhZHkgcm9sbGVkIGJhY2snKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV4ZWN1dG9yIHdyYXBwZXIgdGhhdCBhc3NlcnRzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHN0YXRlIGlzIG5vdCBjb21taXR0ZWRcbiAqIG9yIHJvbGxlZCBiYWNrIHdoZW4gYSBxdWVyeSBpcyBleGVjdXRlZC5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY2xhc3MgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3Ige1xuICAgICNleGVjdXRvcjtcbiAgICAjc3RhdGU7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IsIHN0YXRlKSB7XG4gICAgICAgIGlmIChleGVjdXRvciBpbnN0YW5jZW9mIE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKSB7XG4gICAgICAgICAgICB0aGlzLiNleGVjdXRvciA9IGV4ZWN1dG9yLiNleGVjdXRvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy4jc3RhdGUgPSBzdGF0ZTtcbiAgICB9XG4gICAgZ2V0IGFkYXB0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5hZGFwdGVyO1xuICAgIH1cbiAgICBnZXQgcGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnBsdWdpbnM7XG4gICAgfVxuICAgIHRyYW5zZm9ybVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IucHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpO1xuICAgIH1cbiAgICBleGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnkpO1xuICAgIH1cbiAgICBzdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRoQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb25Qcm92aWRlciksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbnMocGx1Z2lucykge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5zKHBsdWdpbnMpLCB0aGlzLiNzdGF0ZSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW5BdEZyb250KHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KHBsdWdpbiksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmF3LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE5PT1BfUVVFUllfRVhFQ1VUT1IgfSBmcm9tICcuLi9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5jbGFzcyBSYXdCdWlsZGVySW1wbCB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgaXNSYXdCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkUmF3QnVpbGRlckltcGwodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYXdCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHBsdWdpbnM6IHRoaXMuI3Byb3BzLnBsdWdpbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi50aGlzLiNwcm9wcy5wbHVnaW5zLCBwbHVnaW5dKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFtwbHVnaW5dKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RvT3BlcmF0aW9uTm9kZSh0aGlzLiNnZXRFeGVjdXRvcigpKTtcbiAgICB9XG4gICAgY29tcGlsZShleGVjdXRvclByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlKHRoaXMuI2dldEV4ZWN1dG9yKGV4ZWN1dG9yUHJvdmlkZXIpKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZShleGVjdXRvclByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gdGhpcy4jZ2V0RXhlY3V0b3IoZXhlY3V0b3JQcm92aWRlcik7XG4gICAgICAgIHJldHVybiBleGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy4jY29tcGlsZShleGVjdXRvcikpO1xuICAgIH1cbiAgICAjZ2V0RXhlY3V0b3IoZXhlY3V0b3JQcm92aWRlcikge1xuICAgICAgICBjb25zdCBleGVjdXRvciA9IGV4ZWN1dG9yUHJvdmlkZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBleGVjdXRvclByb3ZpZGVyLmdldEV4ZWN1dG9yKClcbiAgICAgICAgICAgIDogTk9PUF9RVUVSWV9FWEVDVVRPUjtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLnBsdWdpbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBleGVjdXRvci53aXRoUGx1Z2lucyh0aGlzLiNwcm9wcy5wbHVnaW5zKVxuICAgICAgICAgICAgOiBleGVjdXRvcjtcbiAgICB9XG4gICAgI3RvT3BlcmF0aW9uTm9kZShleGVjdXRvcikge1xuICAgICAgICByZXR1cm4gZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucmF3Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgICNjb21waWxlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRvci5jb21waWxlUXVlcnkodGhpcy4jdG9PcGVyYXRpb25Ob2RlKGV4ZWN1dG9yKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJhd0J1aWxkZXIocHJvcHMpIHtcbiAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHByb3BzKTtcbn1cbmNsYXNzIEFsaWFzZWRSYXdCdWlsZGVySW1wbCB7XG4gICAgI3Jhd0J1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKHJhd0J1aWxkZXIsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI3Jhd0J1aWxkZXIgPSByYXdCdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jhd0J1aWxkZXI7XG4gICAgfVxuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICBnZXQgcmF3QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Jhd0J1aWxkZXI7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jcmF3QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSwgaXNPcGVyYXRpb25Ob2RlU291cmNlKHRoaXMuI2FsaWFzKVxuICAgICAgICAgICAgPyB0aGlzLiNhbGlhcy50b09wZXJhdGlvbk5vZGUoKVxuICAgICAgICAgICAgOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NxbC5kLnRzXCIgLz5cbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ1JlZmVyZW5jZSB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSYXdCdWlsZGVyIH0gZnJvbSAnLi9yYXctYnVpbGRlci5qcyc7XG5leHBvcnQgY29uc3Qgc3FsID0gT2JqZWN0LmFzc2lnbigoc3FsRnJhZ21lbnRzLCAuLi5wYXJhbWV0ZXJzKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZVJhd0J1aWxkZXIoe1xuICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlKHNxbEZyYWdtZW50cywgcGFyYW1ldGVycz8ubWFwKHBhcnNlUGFyYW1ldGVyKSA/PyBbXSksXG4gICAgfSk7XG59LCB7XG4gICAgcmVmKGNvbHVtblJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVN0cmluZ1JlZmVyZW5jZShjb2x1bW5SZWZlcmVuY2UpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICB2YWwodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJhd0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGVXaXRoQ2hpbGQocGFyc2VWYWx1ZUV4cHJlc3Npb24odmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICB2YWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWwodmFsdWUpO1xuICAgIH0sXG4gICAgdGFibGUodGFibGVSZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJhd0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGVXaXRoQ2hpbGQocGFyc2VUYWJsZSh0YWJsZVJlZmVyZW5jZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGlkKC4uLmlkcykge1xuICAgICAgICBjb25zdCBmcmFnbWVudHMgPSBuZXcgQXJyYXkoaWRzLmxlbmd0aCArIDEpLmZpbGwoJy4nKTtcbiAgICAgICAgZnJhZ21lbnRzWzBdID0gJyc7XG4gICAgICAgIGZyYWdtZW50c1tmcmFnbWVudHMubGVuZ3RoIC0gMV0gPSAnJztcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVJhd0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGUoZnJhZ21lbnRzLCBpZHMubWFwKElkZW50aWZpZXJOb2RlLmNyZWF0ZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGxpdCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgbGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5saXQodmFsdWUpO1xuICAgIH0sXG4gICAgcmF3KHNxbCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoc3FsKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBqb2luKGFycmF5LCBzZXBhcmF0b3IgPSBzcWwgYCwgYCkge1xuICAgICAgICBjb25zdCBub2RlcyA9IG5ldyBBcnJheShNYXRoLm1heCgyICogYXJyYXkubGVuZ3RoIC0gMSwgMCkpO1xuICAgICAgICBjb25zdCBzZXAgPSBzZXBhcmF0b3IudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5vZGVzWzIgKiBpXSA9IHBhcnNlUGFyYW1ldGVyKGFycmF5W2ldKTtcbiAgICAgICAgICAgIGlmIChpICE9PSBhcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgbm9kZXNbMiAqIGkgKyAxXSA9IHNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZHJlbihub2RlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbmZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyKHBhcmFtKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShwYXJhbSkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb24ocGFyYW0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcGVyYXRpb24tbm9kZS12aXNpdG9yLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbk5vZGVWaXNpdG9yIHtcbiAgICBub2RlU3RhY2sgPSBbXTtcbiAgICBnZXQgcGFyZW50Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZVN0YWNrW3RoaXMubm9kZVN0YWNrLmxlbmd0aCAtIDJdO1xuICAgIH1cbiAgICAjdmlzaXRvcnMgPSBmcmVlemUoe1xuICAgICAgICBBbGlhc05vZGU6IHRoaXMudmlzaXRBbGlhcy5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0Q29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIElkZW50aWZpZXJOb2RlOiB0aGlzLnZpc2l0SWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBTY2hlbWFibGVJZGVudGlmaWVyTm9kZTogdGhpcy52aXNpdFNjaGVtYWJsZUlkZW50aWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgUmF3Tm9kZTogdGhpcy52aXNpdFJhdy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VOb2RlOiB0aGlzLnZpc2l0UmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdFF1ZXJ5Tm9kZTogdGhpcy52aXNpdFNlbGVjdFF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdGlvbk5vZGU6IHRoaXMudmlzaXRTZWxlY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVGFibGVOb2RlOiB0aGlzLnZpc2l0VGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRnJvbU5vZGU6IHRoaXMudmlzaXRGcm9tLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdEFsbE5vZGU6IHRoaXMudmlzaXRTZWxlY3RBbGwuYmluZCh0aGlzKSxcbiAgICAgICAgQW5kTm9kZTogdGhpcy52aXNpdEFuZC5iaW5kKHRoaXMpLFxuICAgICAgICBPck5vZGU6IHRoaXMudmlzaXRPci5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZU5vZGU6IHRoaXMudmlzaXRWYWx1ZS5iaW5kKHRoaXMpLFxuICAgICAgICBWYWx1ZUxpc3ROb2RlOiB0aGlzLnZpc2l0VmFsdWVMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGU6IHRoaXMudmlzaXRQcmltaXRpdmVWYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUGFyZW5zTm9kZTogdGhpcy52aXNpdFBhcmVucy5iaW5kKHRoaXMpLFxuICAgICAgICBKb2luTm9kZTogdGhpcy52aXNpdEpvaW4uYmluZCh0aGlzKSxcbiAgICAgICAgT3BlcmF0b3JOb2RlOiB0aGlzLnZpc2l0T3BlcmF0b3IuYmluZCh0aGlzKSxcbiAgICAgICAgV2hlcmVOb2RlOiB0aGlzLnZpc2l0V2hlcmUuYmluZCh0aGlzKSxcbiAgICAgICAgSW5zZXJ0UXVlcnlOb2RlOiB0aGlzLnZpc2l0SW5zZXJ0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgRGVsZXRlUXVlcnlOb2RlOiB0aGlzLnZpc2l0RGVsZXRlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgUmV0dXJuaW5nTm9kZTogdGhpcy52aXNpdFJldHVybmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUYWJsZU5vZGU6IHRoaXMudmlzaXRDcmVhdGVUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0QWRkQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbkRlZmluaXRpb25Ob2RlOiB0aGlzLnZpc2l0Q29sdW1uRGVmaW5pdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVGFibGVOb2RlOiB0aGlzLnZpc2l0RHJvcFRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIERhdGFUeXBlTm9kZTogdGhpcy52aXNpdERhdGFUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlOb2RlOiB0aGlzLnZpc2l0T3JkZXJCeS5iaW5kKHRoaXMpLFxuICAgICAgICBPcmRlckJ5SXRlbU5vZGU6IHRoaXMudmlzaXRPcmRlckJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5Tm9kZTogdGhpcy52aXNpdEdyb3VwQnkuYmluZCh0aGlzKSxcbiAgICAgICAgR3JvdXBCeUl0ZW1Ob2RlOiB0aGlzLnZpc2l0R3JvdXBCeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgVXBkYXRlUXVlcnlOb2RlOiB0aGlzLnZpc2l0VXBkYXRlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uVXBkYXRlTm9kZTogdGhpcy52aXNpdENvbHVtblVwZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgICBMaW1pdE5vZGU6IHRoaXMudmlzaXRMaW1pdC5iaW5kKHRoaXMpLFxuICAgICAgICBPZmZzZXROb2RlOiB0aGlzLnZpc2l0T2Zmc2V0LmJpbmQodGhpcyksXG4gICAgICAgIE9uQ29uZmxpY3ROb2RlOiB0aGlzLnZpc2l0T25Db25mbGljdC5iaW5kKHRoaXMpLFxuICAgICAgICBPbkR1cGxpY2F0ZUtleU5vZGU6IHRoaXMudmlzaXRPbkR1cGxpY2F0ZUtleS5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVJbmRleE5vZGU6IHRoaXMudmlzaXRDcmVhdGVJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wSW5kZXhOb2RlOiB0aGlzLnZpc2l0RHJvcEluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIExpc3ROb2RlOiB0aGlzLnZpc2l0TGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRQcmltYXJ5S2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBVbmlxdWVDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdFVuaXF1ZUNvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVmZXJlbmNlc05vZGU6IHRoaXMudmlzaXRSZWZlcmVuY2VzLmJpbmQodGhpcyksXG4gICAgICAgIENoZWNrQ29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRDaGVja0NvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgV2l0aE5vZGU6IHRoaXMudmlzaXRXaXRoLmJpbmQodGhpcyksXG4gICAgICAgIENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGU6IHRoaXMudmlzaXRDb21tb25UYWJsZUV4cHJlc3Npb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGU6IHRoaXMudmlzaXRDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lLmJpbmQodGhpcyksXG4gICAgICAgIEhhdmluZ05vZGU6IHRoaXMudmlzaXRIYXZpbmcuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlU2NoZW1hTm9kZTogdGhpcy52aXNpdENyZWF0ZVNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wU2NoZW1hTm9kZTogdGhpcy52aXNpdERyb3BTY2hlbWEuYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJUYWJsZU5vZGU6IHRoaXMudmlzaXRBbHRlclRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0RHJvcENvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBSZW5hbWVDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0UmVuYW1lQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIEFsdGVyQ29sdW1uTm9kZTogdGhpcy52aXNpdEFsdGVyQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIE1vZGlmeUNvbHVtbk5vZGU6IHRoaXMudmlzaXRNb2RpZnlDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWRkQ29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRBZGRDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdERyb3BDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0UmVuYW1lQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBGb3JlaWduS2V5Q29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRGb3JlaWduS2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVWaWV3Tm9kZTogdGhpcy52aXNpdENyZWF0ZVZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlOiB0aGlzLnZpc2l0UmVmcmVzaE1hdGVyaWFsaXplZFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFZpZXdOb2RlOiB0aGlzLnZpc2l0RHJvcFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgR2VuZXJhdGVkTm9kZTogdGhpcy52aXNpdEdlbmVyYXRlZC5iaW5kKHRoaXMpLFxuICAgICAgICBEZWZhdWx0VmFsdWVOb2RlOiB0aGlzLnZpc2l0RGVmYXVsdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIE9uTm9kZTogdGhpcy52aXNpdE9uLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlc05vZGU6IHRoaXMudmlzaXRWYWx1ZXMuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0TW9kaWZpZXJOb2RlOiB0aGlzLnZpc2l0U2VsZWN0TW9kaWZpZXIuYmluZCh0aGlzKSxcbiAgICAgICAgQ3JlYXRlVHlwZU5vZGU6IHRoaXMudmlzaXRDcmVhdGVUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUeXBlTm9kZTogdGhpcy52aXNpdERyb3BUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIEV4cGxhaW5Ob2RlOiB0aGlzLnZpc2l0RXhwbGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBEZWZhdWx0SW5zZXJ0VmFsdWVOb2RlOiB0aGlzLnZpc2l0RGVmYXVsdEluc2VydFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogdGhpcy52aXNpdEFnZ3JlZ2F0ZUZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIE92ZXJOb2RlOiB0aGlzLnZpc2l0T3Zlci5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeU5vZGU6IHRoaXMudmlzaXRQYXJ0aXRpb25CeS5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeUl0ZW1Ob2RlOiB0aGlzLnZpc2l0UGFydGl0aW9uQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIFNldE9wZXJhdGlvbk5vZGU6IHRoaXMudmlzaXRTZXRPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQmluYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdEJpbmFyeU9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBVbmFyeU9wZXJhdGlvbk5vZGU6IHRoaXMudmlzaXRVbmFyeU9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBVc2luZ05vZGU6IHRoaXMudmlzaXRVc2luZy5iaW5kKHRoaXMpLFxuICAgICAgICBGdW5jdGlvbk5vZGU6IHRoaXMudmlzaXRGdW5jdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDYXNlTm9kZTogdGhpcy52aXNpdENhc2UuYmluZCh0aGlzKSxcbiAgICAgICAgV2hlbk5vZGU6IHRoaXMudmlzaXRXaGVuLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05SZWZlcmVuY2VOb2RlOiB0aGlzLnZpc2l0SlNPTlJlZmVyZW5jZS5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUGF0aE5vZGU6IHRoaXMudmlzaXRKU09OUGF0aC5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUGF0aExlZ05vZGU6IHRoaXMudmlzaXRKU09OUGF0aExlZy5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OT3BlcmF0b3JDaGFpbk5vZGU6IHRoaXMudmlzaXRKU09OT3BlcmF0b3JDaGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBUdXBsZU5vZGU6IHRoaXMudmlzaXRUdXBsZS5iaW5kKHRoaXMpLFxuICAgICAgICBNZXJnZVF1ZXJ5Tm9kZTogdGhpcy52aXNpdE1lcmdlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgTWF0Y2hlZE5vZGU6IHRoaXMudmlzaXRNYXRjaGVkLmJpbmQodGhpcyksXG4gICAgICAgIEFkZEluZGV4Tm9kZTogdGhpcy52aXNpdEFkZEluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIENhc3ROb2RlOiB0aGlzLnZpc2l0Q2FzdC5iaW5kKHRoaXMpLFxuICAgICAgICBGZXRjaE5vZGU6IHRoaXMudmlzaXRGZXRjaC5iaW5kKHRoaXMpLFxuICAgICAgICBUb3BOb2RlOiB0aGlzLnZpc2l0VG9wLmJpbmQodGhpcyksXG4gICAgICAgIE91dHB1dE5vZGU6IHRoaXMudmlzaXRPdXRwdXQuYmluZCh0aGlzKSxcbiAgICAgICAgT3JBY3Rpb25Ob2RlOiB0aGlzLnZpc2l0T3JBY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sbGF0ZU5vZGU6IHRoaXMudmlzaXRDb2xsYXRlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdmlzaXROb2RlID0gKG5vZGUpID0+IHtcbiAgICAgICAgdGhpcy5ub2RlU3RhY2sucHVzaChub2RlKTtcbiAgICAgICAgdGhpcy4jdmlzaXRvcnNbbm9kZS5raW5kXShub2RlKTtcbiAgICAgICAgdGhpcy5ub2RlU3RhY2sucG9wKCk7XG4gICAgfTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGVmYXVsdC1xdWVyeS1jb21waWxlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZVRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbk5vZGVWaXNpdG9yIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtdmlzaXRvci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzJztcbmltcG9ydCB7IFBhcmVuc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wYXJlbnMtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc1N0cmluZywgaXNOdW1iZXIsIGlzQm9vbGVhbiwgaXNOdWxsLCBpc0RhdGUsIGlzQmlnSW50LCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENyZWF0ZVZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBTZXRPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2V0LW9wZXJhdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvd2hlbi1ub2RlLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmNvbnN0IExJVF9XUkFQX1JFR0VYID0gLycvZztcbmV4cG9ydCBjbGFzcyBEZWZhdWx0UXVlcnlDb21waWxlciBleHRlbmRzIE9wZXJhdGlvbk5vZGVWaXNpdG9yIHtcbiAgICAjc3FsID0gJyc7XG4gICAgI3BhcmFtZXRlcnMgPSBbXTtcbiAgICBnZXQgbnVtUGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3BhcmFtZXRlcnMubGVuZ3RoO1xuICAgIH1cbiAgICBjb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICB0aGlzLiNzcWwgPSAnJztcbiAgICAgICAgdGhpcy4jcGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5zcGxpY2UoMCwgdGhpcy5ub2RlU3RhY2subGVuZ3RoKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZSk7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgcXVlcnk6IG5vZGUsXG4gICAgICAgICAgICBxdWVyeUlkLFxuICAgICAgICAgICAgc3FsOiB0aGlzLmdldFNxbCgpLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogWy4uLnRoaXMuI3BhcmFtZXRlcnNdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0U3FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jc3FsO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdFF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgY29uc3Qgd3JhcEluUGFyZW5zID0gdGhpcy5wYXJlbnROb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFQYXJlbnNOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFJbnNlcnRRdWVyeU5vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIUNyZWF0ZVRhYmxlTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhQ3JlYXRlVmlld05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVNldE9wZXJhdGlvbk5vZGUuaXModGhpcy5wYXJlbnROb2RlKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuZXhwbGFpbikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHBsYWluKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGgpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnc2VsZWN0Jyk7XG4gICAgICAgIGlmIChub2RlLmRpc3RpbmN0T24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVEaXN0aW5jdE9uKG5vZGUuZGlzdGluY3RPbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZnJvbnRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRvcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuc2VsZWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZWxlY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9tKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5qb2lucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5qb2lucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVyZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2hlcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmdyb3VwQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmdyb3VwQnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmhhdmluZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaGF2aW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXRPcGVyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNldE9wZXJhdGlvbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3JkZXJCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vZmZzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZmV0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZldGNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3QodGhpcy5zb3J0U2VsZWN0TW9kaWZpZXJzKFsuLi5ub2RlLmVuZE1vZGlmaWVyc10pLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRGcm9tKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Zyb20gJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5mcm9tcyk7XG4gICAgfVxuICAgIHZpc2l0U2VsZWN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zZWxlY3Rpb24pO1xuICAgIH1cbiAgICB2aXNpdENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICB9XG4gICAgY29tcGlsZURpc3RpbmN0T24oZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Rpc3RpbmN0IG9uICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChleHByZXNzaW9ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIGNvbXBpbGVMaXN0KG5vZGVzLCBzZXBhcmF0b3IgPSAnLCAnKSB7XG4gICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGxhc3RJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2Rlc1tpXSk7XG4gICAgICAgICAgICBpZiAoaSA8IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKHNlcGFyYXRvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRXaGVyZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd3aGVyZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgfVxuICAgIHZpc2l0SGF2aW5nKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2hhdmluZyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5oYXZpbmcpO1xuICAgIH1cbiAgICB2aXNpdEluc2VydFF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgY29uc3Qgd3JhcEluUGFyZW5zID0gdGhpcy5wYXJlbnROb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFQYXJlbnNOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFSYXdOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFXaGVuTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlID09PSB1bmRlZmluZWQgJiYgbm9kZS5leHBsYWluKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cGxhaW4pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2l0aCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUucmVwbGFjZSA/ICdyZXBsYWNlJyA6ICdpbnNlcnQnKTtcbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIGluIDAuMjkuXG4gICAgICAgIGlmIChub2RlLmlnbm9yZSkge1xuICAgICAgICAgICAgbG9nT25jZSgnYEluc2VydFF1ZXJ5Tm9kZS5pZ25vcmVgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgSW5zZXJ0UXVlcnlOb2RlLm9yQWN0aW9uYCBpbnN0ZWFkLicpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBpZ25vcmUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vckFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JBY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRvcCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbnRvKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGludG8gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmludG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCB2YWx1ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vbkNvbmZsaWN0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vbkNvbmZsaWN0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vbkR1cGxpY2F0ZUtleSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub25EdXBsaWNhdGVLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJldHVybmluZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmV0dXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFZhbHVlcyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd2YWx1ZXMgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS52YWx1ZXMpO1xuICAgIH1cbiAgICB2aXNpdERlbGV0ZVF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgY29uc3Qgd3JhcEluUGFyZW5zID0gdGhpcy5wYXJlbnROb2RlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICFQYXJlbnNOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFSYXdOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgPT09IHVuZGVmaW5lZCAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2RlbGV0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRvcCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZnJvbSk7XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS51c2luZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXNpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmpvaW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmpvaW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3JkZXJCeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmxpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZXR1cm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJldHVybmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdyYXBJblBhcmVucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRSZXR1cm5pbmcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmV0dXJuaW5nICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuc2VsZWN0aW9ucyk7XG4gICAgfVxuICAgIHZpc2l0QWxpYXMobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5vZGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnIGFzICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFsaWFzKTtcbiAgICB9XG4gICAgdmlzaXRSZWZlcmVuY2Uobm9kZSkge1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICB9XG4gICAgdmlzaXRTZWxlY3RBbGwoXykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKicpO1xuICAgIH1cbiAgICB2aXNpdElkZW50aWZpZXIobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldExlZnRJZGVudGlmaWVyV3JhcHBlcigpKTtcbiAgICAgICAgdGhpcy5jb21waWxlVW53cmFwcGVkSWRlbnRpZmllcihub2RlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5nZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCkpO1xuICAgIH1cbiAgICBjb21waWxlVW53cmFwcGVkSWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIGlmICghaXNTdHJpbmcobm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhIG5vbi1zdHJpbmcgaWRlbnRpZmllciB3YXMgcGFzc2VkIHRvIGNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuc2FuaXRpemVJZGVudGlmaWVyKG5vZGUubmFtZSkpO1xuICAgIH1cbiAgICB2aXNpdEFuZChub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGVmdCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYW5kICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJpZ2h0KTtcbiAgICB9XG4gICAgdmlzaXRPcihub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGVmdCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgb3IgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmlnaHQpO1xuICAgIH1cbiAgICB2aXNpdFZhbHVlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaW1tZWRpYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZEltbWVkaWF0ZVZhbHVlKG5vZGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRWYWx1ZShub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFZhbHVlTGlzdChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS52YWx1ZXMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgIH1cbiAgICB2aXNpdFR1cGxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0UHJpbWl0aXZlVmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgY29uc3QgeyB2YWx1ZXMgfSA9IG5vZGU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFZhbHVlKHZhbHVlc1tpXSk7XG4gICAgICAgICAgICBpZiAoaSAhPT0gdmFsdWVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgIH1cbiAgICB2aXNpdFBhcmVucyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubm9kZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0Sm9pbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKEpPSU5fVFlQRV9TUUxbbm9kZS5qb2luVHlwZV0pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUub24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29uICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9uKTtcbiAgICB9XG4gICAgdmlzaXRSYXcobm9kZSkge1xuICAgICAgICBjb25zdCB7IHNxbEZyYWdtZW50cywgcGFyYW1ldGVyczogcGFyYW1zIH0gPSBub2RlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNxbEZyYWdtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoc3FsRnJhZ21lbnRzW2ldKTtcbiAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gaSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKHBhcmFtc1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRPcGVyYXRvcihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub3BlcmF0b3IpO1xuICAgIH1cbiAgICB2aXNpdFRhYmxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgfVxuICAgIHZpc2l0U2NoZW1hYmxlSWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zY2hlbWEpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJy4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmlkZW50aWZpZXIpO1xuICAgIH1cbiAgICB2aXNpdENyZWF0ZVRhYmxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuZnJvbnRNb2RpZmllcnMgJiYgbm9kZS5mcm9udE1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRlbXBvcmFyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3RlbXBvcmFyeSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgndGFibGUgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuc2VsZWN0UXVlcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNlbGVjdFF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChbLi4ubm9kZS5jb2x1bW5zLCAuLi4obm9kZS5jb25zdHJhaW50cyA/PyBbXSldKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgICAgICBpZiAobm9kZS5vbkNvbW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gY29tbWl0ICcpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25Db21taXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzICYmIG5vZGUuZW5kTW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRDb2x1bW5EZWZpbml0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBub3QgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgIGlmIChub2RlLnVuc2lnbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVuc2lnbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZnJvbnRNb2RpZmllcnMgJiYgbm9kZS5mcm9udE1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmZyb250TW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmdlbmVyYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZ2VuZXJhdGVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pZGVudGl0eSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBpZGVudGl0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRlZmF1bHRUbykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGVmYXVsdFRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ub3ROdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudW5pcXVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVuaXF1ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzTm90RGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbnVsbHMgbm90IGRpc3RpbmN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucHJpbWFyeUtleSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBwcmltYXJ5IGtleScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmF1dG9JbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEF1dG9JbmNyZW1lbnQoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVmZXJlbmNlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY2hlY2spIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnMgJiYgbm9kZS5lbmRNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXV0b0luY3JlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuICdhdXRvX2luY3JlbWVudCc7XG4gICAgfVxuICAgIHZpc2l0UmVmZXJlbmNlcyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdyZWZlcmVuY2VzICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgaWYgKG5vZGUub25EZWxldGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gZGVsZXRlICcpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vbkRlbGV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub25VcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gdXBkYXRlICcpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vblVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREcm9wVGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCB0YWJsZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgICAgIGlmIChub2RlLmNhc2NhZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RGF0YVR5cGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChub2RlLmRhdGFUeXBlKTtcbiAgICB9XG4gICAgdmlzaXRPcmRlckJ5KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29yZGVyIGJ5ICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdE9yZGVyQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgaWYgKG5vZGUuY29sbGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2xsYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRpcmVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5udWxscykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUubnVsbHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0R3JvdXBCeShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdncm91cCBieSAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLml0ZW1zKTtcbiAgICB9XG4gICAgdmlzaXRHcm91cEJ5SXRlbShub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZ3JvdXBCeSk7XG4gICAgfVxuICAgIHZpc2l0VXBkYXRlUXVlcnkobm9kZSkge1xuICAgICAgICBjb25zdCB3cmFwSW5QYXJlbnMgPSB0aGlzLnBhcmVudE5vZGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIVBhcmVuc05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVJhd05vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIVdoZW5Ob2RlLmlzKHRoaXMucGFyZW50Tm9kZSk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgPT09IHVuZGVmaW5lZCAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3VwZGF0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRvcCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3NldCAnKTtcbiAgICAgICAgaWYgKG5vZGUudXBkYXRlcykge1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnVwZGF0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9tKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5qb2lucykge1xuICAgICAgICAgICAgaWYgKCFub2RlLmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJKb2lucyBpbiBhbiB1cGRhdGUgcXVlcnkgYXJlIG9ubHkgc3VwcG9ydGVkIGFzIGEgcGFydCBvZiBhIFBvc3RncmVTUUwgJ3VwZGF0ZSBzZXQgZnJvbSBqb2luJyBxdWVyeS4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgTXlTUUwgJ3VwZGF0ZSBqb2luIHNldCcgcXVlcnksIHNlZSBodHRwczovL2t5c2VseS5kZXYvZG9jcy9leGFtcGxlcy91cGRhdGUvbXktc3FsLWpvaW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5qb2lucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVyZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2hlcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5saW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q29sdW1uVXBkYXRlKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnID0gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudmFsdWUpO1xuICAgIH1cbiAgICB2aXNpdExpbWl0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2xpbWl0ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmxpbWl0KTtcbiAgICB9XG4gICAgdmlzaXRPZmZzZXQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb2Zmc2V0ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9mZnNldCk7XG4gICAgfVxuICAgIHZpc2l0T25Db25mbGljdChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvbiBjb25mbGljdCcpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5jb25zdHJhaW50KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIGNvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuaW5kZXhFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW5kZXhFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaW5kZXhXaGVyZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW5kZXhXaGVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZG9Ob3RoaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGRvIG5vdGhpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLnVwZGF0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgZG8gdXBkYXRlIHNldCAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS51cGRhdGVzKTtcbiAgICAgICAgICAgIGlmIChub2RlLnVwZGF0ZVdoZXJlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnVwZGF0ZVdoZXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9uRHVwbGljYXRlS2V5KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudXBkYXRlcyk7XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlSW5kZXgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2luZGV4ICcpO1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS51c2luZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyB1c2luZyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXNpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5udWxsc05vdERpc3RpbmN0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG51bGxzIG5vdCBkaXN0aW5jdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aGVyZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREcm9wSW5kZXgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCBpbmRleCAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUudGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENyZWF0ZVNjaGVtYShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgc2NoZW1hICcpO1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zY2hlbWEpO1xuICAgIH1cbiAgICB2aXNpdERyb3BTY2hlbWEobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCBzY2hlbWEgJyk7XG4gICAgICAgIGlmIChub2RlLmlmRXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2NoZW1hKTtcbiAgICAgICAgaWYgKG5vZGUuY2FzY2FkZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNjYWRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRQcmltYXJ5S2V5Q29uc3RyYWludChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdjb25zdHJhaW50ICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ByaW1hcnkga2V5ICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB0aGlzLmJ1aWxkRGVmZXJyYWJsZShub2RlKTtcbiAgICB9XG4gICAgYnVpbGREZWZlcnJhYmxlKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVmZXJyYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5kZWZlcnJhYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBkZWZlcnJhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG5vdCBkZWZlcnJhYmxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGx5RGVmZXJyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGluaXRpYWxseSBkZWZlcnJlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBpbml0aWFsbHkgaW1tZWRpYXRlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRVbmlxdWVDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgndW5pcXVlJyk7XG4gICAgICAgIGlmIChub2RlLm51bGxzTm90RGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbnVsbHMgbm90IGRpc3RpbmN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgdGhpcy5idWlsZERlZmVycmFibGUobm9kZSk7XG4gICAgfVxuICAgIHZpc2l0Q2hlY2tDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnY2hlY2sgKCcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgIH1cbiAgICB2aXNpdEZvcmVpZ25LZXlDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnZm9yZWlnbiBrZXkgKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlZmVyZW5jZXMpO1xuICAgICAgICBpZiAobm9kZS5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBkZWxldGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vblVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiB1cGRhdGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1aWxkRGVmZXJyYWJsZShub2RlKTtcbiAgICB9XG4gICAgdmlzaXRMaXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLml0ZW1zKTtcbiAgICB9XG4gICAgdmlzaXRXaXRoKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3dpdGggJyk7XG4gICAgICAgIGlmIChub2RlLnJlY3Vyc2l2ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3JlY3Vyc2l2ZSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZXhwcmVzc2lvbnMpO1xuICAgIH1cbiAgICB2aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgIGlmIChpc0Jvb2xlYW4obm9kZS5tYXRlcmlhbGl6ZWQpKSB7XG4gICAgICAgICAgICBpZiAoIW5vZGUubWF0ZXJpYWxpemVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ25vdCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdtYXRlcmlhbGl6ZWQgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICB9XG4gICAgdmlzaXRDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0QWx0ZXJUYWJsZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhbHRlciB0YWJsZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50YWJsZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIGlmIChub2RlLnJlbmFtZVRvKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgncmVuYW1lIHRvICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZW5hbWVUbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuc2V0U2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnc2V0IHNjaGVtYSAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2V0U2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5hZGRDb25zdHJhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFkZENvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRyb3BDb25zdHJhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmRyb3BDb25zdHJhaW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZW5hbWVDb25zdHJhaW50KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlbmFtZUNvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNvbHVtbkFsdGVyYXRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVDb2x1bW5BbHRlcmF0aW9ucyhub2RlLmNvbHVtbkFsdGVyYXRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5hZGRJbmRleCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5hZGRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmRyb3BJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRBZGRDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdFJlbmFtZUNvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdyZW5hbWUgY29sdW1uICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgdG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVuYW1lVG8pO1xuICAgIH1cbiAgICB2aXNpdERyb3BDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICB9XG4gICAgdmlzaXRBbHRlckNvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhbHRlciBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgaWYgKG5vZGUuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFubm91bmNlc05ld0NvbHVtbkRhdGFUeXBlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgndHlwZSAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGF0YVR5cGUpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZGF0YVR5cGVFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3VzaW5nICcpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGF0YVR5cGVFeHByZXNzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXREZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnc2V0IGRlZmF1bHQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNldERlZmF1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRyb3BEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCBkZWZhdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuc2V0Tm90TnVsbCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3NldCBub3QgbnVsbCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmRyb3BOb3ROdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCBub3QgbnVsbCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0TW9kaWZ5Q29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ21vZGlmeSBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICB9XG4gICAgdmlzaXRBZGRDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FkZCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb25zdHJhaW50KTtcbiAgICB9XG4gICAgdmlzaXREcm9wQ29uc3RyYWludChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGNvbnN0cmFpbnQgJyk7XG4gICAgICAgIGlmIChub2RlLmlmRXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uc3RyYWludE5hbWUpO1xuICAgICAgICBpZiAobm9kZS5tb2RpZmllciA9PT0gJ2Nhc2NhZGUnKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLm1vZGlmaWVyID09PSAncmVzdHJpY3QnKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHJlc3RyaWN0Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRSZW5hbWVDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlbmFtZSBjb25zdHJhaW50ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9sZE5hbWUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnIHRvICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5ld05hbWUpO1xuICAgIH1cbiAgICB2aXNpdFNldE9wZXJhdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5hbGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdhbGwgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICB9XG4gICAgdmlzaXRDcmVhdGVWaWV3KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUub3JSZXBsYWNlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnb3IgcmVwbGFjZSAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5tYXRlcmlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdtYXRlcmlhbGl6ZWQgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGVtcG9yYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndGVtcG9yYXJ5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd2aWV3ICcpO1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnYXMgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlZnJlc2ggbWF0ZXJpYWxpemVkIHZpZXcgJyk7XG4gICAgICAgIGlmIChub2RlLmNvbmN1cnJlbnRseSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbmN1cnJlbnRseSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS53aXRoTm9EYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGggbm8gZGF0YScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyB3aXRoIGRhdGEnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BWaWV3KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgJyk7XG4gICAgICAgIGlmIChub2RlLm1hdGVyaWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgndmlldyAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUuY2FzY2FkZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNjYWRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRHZW5lcmF0ZWQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZ2VuZXJhdGVkICcpO1xuICAgICAgICBpZiAobm9kZS5hbHdheXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdhbHdheXMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYnlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnYnkgZGVmYXVsdCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnYXMgJyk7XG4gICAgICAgIGlmIChub2RlLmlkZW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWRlbnRpdHknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuc3RvcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHN0b3JlZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RGVmYXVsdFZhbHVlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2RlZmF1bHQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gICAgdmlzaXRTZWxlY3RNb2RpZmllcihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnJhd01vZGlmaWVyKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJhd01vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKFNFTEVDVF9NT0RJRklFUl9TUUxbbm9kZS5tb2RpZmllcl0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9mKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9mICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLm9mLCAnLCAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENyZWF0ZVR5cGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlIHR5cGUgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLmVudW0pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgZW51bSAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZW51bSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREcm9wVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHR5cGUgJyk7XG4gICAgICAgIGlmIChub2RlLmlmRXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgfVxuICAgIHZpc2l0RXhwbGFpbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdleHBsYWluJyk7XG4gICAgICAgIGlmIChub2RlLm9wdGlvbnMgfHwgbm9kZS5mb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldExlZnRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSk7XG4gICAgICAgICAgICBpZiAobm9kZS5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5mb3JtYXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5nZXRFeHBsYWluT3B0aW9uc0RlbGltaXRlcigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5mb3JtYXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnZm9ybWF0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5nZXRFeHBsYWluT3B0aW9uQXNzaWdubWVudCgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLmZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldFJpZ2h0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RGVmYXVsdEluc2VydFZhbHVlKF8pIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2RlZmF1bHQnKTtcbiAgICB9XG4gICAgdmlzaXRBZ2dyZWdhdGVGdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZnVuYyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIGlmIChub2RlLmRpc3RpbmN0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnZGlzdGluY3QgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmFnZ3JlZ2F0ZWQpO1xuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcmRlckJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICBpZiAobm9kZS53aXRoaW5Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyB3aXRoaW4gZ3JvdXAgKCcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoaW5Hcm91cCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZpbHRlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBmaWx0ZXIoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZpbHRlcik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm92ZXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T3Zlcihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvdmVyKCcpO1xuICAgICAgICBpZiAobm9kZS5wYXJ0aXRpb25CeSkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5wYXJ0aXRpb25CeSk7XG4gICAgICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vcmRlckJ5KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0UGFydGl0aW9uQnkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncGFydGl0aW9uIGJ5ICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdFBhcnRpdGlvbkJ5SXRlbShub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucGFydGl0aW9uQnkpO1xuICAgIH1cbiAgICB2aXNpdEJpbmFyeU9wZXJhdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGVmdE9wZXJhbmQpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yaWdodE9wZXJhbmQpO1xuICAgIH1cbiAgICB2aXNpdFVuYXJ5T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcGVyYXRvcik7XG4gICAgICAgIGlmICghdGhpcy5pc01pbnVzT3BlcmF0b3Iobm9kZS5vcGVyYXRvcikpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vcGVyYW5kKTtcbiAgICB9XG4gICAgaXNNaW51c09wZXJhdG9yKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yTm9kZS5pcyhub2RlKSAmJiBub2RlLm9wZXJhdG9yID09PSAnLSc7XG4gICAgfVxuICAgIHZpc2l0VXNpbmcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgndXNpbmcgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS50YWJsZXMpO1xuICAgIH1cbiAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5mdW5jKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0Q2FzZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjYXNlJyk7XG4gICAgICAgIGlmIChub2RlLnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS53aGVuLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgZWxzZSAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJyBlbmQnKTtcbiAgICAgICAgaWYgKG5vZGUuaXNTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0V2hlbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd3aGVuICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbmRpdGlvbik7XG4gICAgICAgIGlmIChub2RlLnJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyB0aGVuICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0SlNPTlJlZmVyZW5jZShub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVmZXJlbmNlKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50cmF2ZXJzYWwpO1xuICAgIH1cbiAgICB2aXNpdEpTT05QYXRoKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuaW5PcGVyYXRvcikge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbk9wZXJhdG9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZChcIickXCIpO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdGhMZWcgb2Ygbm9kZS5wYXRoTGVncykge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUocGF0aExlZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoXCInXCIpO1xuICAgIH1cbiAgICB2aXNpdEpTT05QYXRoTGVnKG5vZGUpIHtcbiAgICAgICAgY29uc3QgaXNBcnJheUxvY2F0aW9uID0gbm9kZS50eXBlID09PSAnQXJyYXlMb2NhdGlvbic7XG4gICAgICAgIHRoaXMuYXBwZW5kKGlzQXJyYXlMb2NhdGlvbiA/ICdbJyA6ICcuJyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKFN0cmluZyhub2RlLnZhbHVlKSk7XG4gICAgICAgIGlmIChpc0FycmF5TG9jYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCddJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRKU09OT3BlcmF0b3JDaGFpbihub2RlKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBub2RlLnZhbHVlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCctPicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0TWVyZ2VRdWVyeShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2l0aCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdtZXJnZSAnKTtcbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRvcCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdpbnRvICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmludG8pO1xuICAgICAgICBpZiAobm9kZS51c2luZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXNpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndoZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLndoZW5zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJldHVybmluZykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmV0dXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCAnICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0TWF0Y2hlZChub2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ25vdCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnbWF0Y2hlZCcpO1xuICAgICAgICBpZiAobm9kZS5ieVNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBieSBzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEFkZEluZGV4KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FkZCAnKTtcbiAgICAgICAgaWYgKG5vZGUudW5pcXVlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndW5pcXVlICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdpbmRleCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVzaW5nICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRDYXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Nhc3QoJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZGF0YVR5cGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgIH1cbiAgICB2aXNpdEZldGNoKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2ZldGNoIG5leHQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucm93Q291bnQpO1xuICAgICAgICB0aGlzLmFwcGVuZChgIHJvd3MgJHtub2RlLm1vZGlmaWVyfWApO1xuICAgIH1cbiAgICB2aXNpdE91dHB1dChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvdXRwdXQgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZWxlY3Rpb25zKTtcbiAgICB9XG4gICAgdmlzaXRUb3Aobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChgdG9wKCR7bm9kZS5leHByZXNzaW9ufSlgKTtcbiAgICAgICAgaWYgKG5vZGUubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChgICR7bm9kZS5tb2RpZmllcnN9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRPckFjdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuYWN0aW9uKTtcbiAgICB9XG4gICAgdmlzaXRDb2xsYXRlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbGxhdGUgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sbGF0aW9uKTtcbiAgICB9XG4gICAgYXBwZW5kKHN0cikge1xuICAgICAgICB0aGlzLiNzcWwgKz0gc3RyO1xuICAgIH1cbiAgICBhcHBlbmRWYWx1ZShwYXJhbWV0ZXIpIHtcbiAgICAgICAgdGhpcy5hZGRQYXJhbWV0ZXIocGFyYW1ldGVyKTtcbiAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5nZXRDdXJyZW50UGFyYW1ldGVyUGxhY2Vob2xkZXIoKSk7XG4gICAgfVxuICAgIGdldExlZnRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdcIic7XG4gICAgfVxuICAgIGdldFJpZ2h0SWRlbnRpZmllcldyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnXCInO1xuICAgIH1cbiAgICBnZXRDdXJyZW50UGFyYW1ldGVyUGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIHJldHVybiAnJCcgKyB0aGlzLm51bVBhcmFtZXRlcnM7XG4gICAgfVxuICAgIGdldExlZnRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnKCc7XG4gICAgfVxuICAgIGdldEV4cGxhaW5PcHRpb25Bc3NpZ25tZW50KCkge1xuICAgICAgICByZXR1cm4gJyAnO1xuICAgIH1cbiAgICBnZXRFeHBsYWluT3B0aW9uc0RlbGltaXRlcigpIHtcbiAgICAgICAgcmV0dXJuICcsICc7XG4gICAgfVxuICAgIGdldFJpZ2h0RXhwbGFpbk9wdGlvbnNXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJyknO1xuICAgIH1cbiAgICBzYW5pdGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBsZWZ0V3JhcCA9IHRoaXMuZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0V3JhcCA9IHRoaXMuZ2V0UmlnaHRJZGVudGlmaWVyV3JhcHBlcigpO1xuICAgICAgICBsZXQgc2FuaXRpemVkID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICBzYW5pdGl6ZWQgKz0gYztcbiAgICAgICAgICAgIGlmIChjID09PSBsZWZ0V3JhcCkge1xuICAgICAgICAgICAgICAgIHNhbml0aXplZCArPSBsZWZ0V3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IHJpZ2h0V3JhcCkge1xuICAgICAgICAgICAgICAgIHNhbml0aXplZCArPSByaWdodFdyYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhbml0aXplZDtcbiAgICB9XG4gICAgc2FuaXRpemVTdHJpbmdMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKExJVF9XUkFQX1JFR0VYLCBcIicnXCIpO1xuICAgIH1cbiAgICBhZGRQYXJhbWV0ZXIocGFyYW1ldGVyKSB7XG4gICAgICAgIHRoaXMuI3BhcmFtZXRlcnMucHVzaChwYXJhbWV0ZXIpO1xuICAgIH1cbiAgICBhcHBlbmRJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFN0cmluZ0xpdGVyYWwodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtYmVyKHZhbHVlKSB8fCBpc0Jvb2xlYW4odmFsdWUpIHx8IGlzQmlnSW50KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOdWxsKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ251bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZEltbWVkaWF0ZVZhbHVlKHZhbHVlLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGltbWVkaWF0ZSB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFwcGVuZFN0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoXCInXCIpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLnNhbml0aXplU3RyaW5nTGl0ZXJhbCh2YWx1ZSkpO1xuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgfVxuICAgIHNvcnRTZWxlY3RNb2RpZmllcnMoYXJyKSB7XG4gICAgICAgIGFyci5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5tb2RpZmllciAmJiByaWdodC5tb2RpZmllclxuICAgICAgICAgICAgPyBTRUxFQ1RfTU9ESUZJRVJfUFJJT1JJVFlbbGVmdC5tb2RpZmllcl0gLVxuICAgICAgICAgICAgICAgIFNFTEVDVF9NT0RJRklFUl9QUklPUklUWVtyaWdodC5tb2RpZmllcl1cbiAgICAgICAgICAgIDogMSk7XG4gICAgICAgIHJldHVybiBmcmVlemUoYXJyKTtcbiAgICB9XG4gICAgY29tcGlsZUNvbHVtbkFsdGVyYXRpb25zKGNvbHVtbkFsdGVyYXRpb25zKSB7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3QoY29sdW1uQWx0ZXJhdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBjb250cm9scyB3aGV0aGVyIHRoZSBkaWFsZWN0IGFkZHMgYSBcInR5cGVcIiBrZXl3b3JkIGJlZm9yZSBhIGNvbHVtbidzIG5ldyBkYXRhXG4gICAgICogdHlwZSBpbiBhbiBBTFRFUiBUQUJMRSBzdGF0ZW1lbnQuXG4gICAgICovXG4gICAgYW5ub3VuY2VzTmV3Q29sdW1uRGF0YVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbmNvbnN0IFNFTEVDVF9NT0RJRklFUl9TUUwgPSBmcmVlemUoe1xuICAgIEZvcktleVNoYXJlOiAnZm9yIGtleSBzaGFyZScsXG4gICAgRm9yTm9LZXlVcGRhdGU6ICdmb3Igbm8ga2V5IHVwZGF0ZScsXG4gICAgRm9yVXBkYXRlOiAnZm9yIHVwZGF0ZScsXG4gICAgRm9yU2hhcmU6ICdmb3Igc2hhcmUnLFxuICAgIE5vV2FpdDogJ25vd2FpdCcsXG4gICAgU2tpcExvY2tlZDogJ3NraXAgbG9ja2VkJyxcbiAgICBEaXN0aW5jdDogJ2Rpc3RpbmN0Jyxcbn0pO1xuY29uc3QgU0VMRUNUX01PRElGSUVSX1BSSU9SSVRZID0gZnJlZXplKHtcbiAgICBGb3JLZXlTaGFyZTogMSxcbiAgICBGb3JOb0tleVVwZGF0ZTogMSxcbiAgICBGb3JVcGRhdGU6IDEsXG4gICAgRm9yU2hhcmU6IDEsXG4gICAgTm9XYWl0OiAyLFxuICAgIFNraXBMb2NrZWQ6IDIsXG4gICAgRGlzdGluY3Q6IDAsXG59KTtcbmNvbnN0IEpPSU5fVFlQRV9TUUwgPSBmcmVlemUoe1xuICAgIElubmVySm9pbjogJ2lubmVyIGpvaW4nLFxuICAgIExlZnRKb2luOiAnbGVmdCBqb2luJyxcbiAgICBSaWdodEpvaW46ICdyaWdodCBqb2luJyxcbiAgICBGdWxsSm9pbjogJ2Z1bGwgam9pbicsXG4gICAgQ3Jvc3NKb2luOiAnY3Jvc3Mgam9pbicsXG4gICAgTGF0ZXJhbElubmVySm9pbjogJ2lubmVyIGpvaW4gbGF0ZXJhbCcsXG4gICAgTGF0ZXJhbExlZnRKb2luOiAnbGVmdCBqb2luIGxhdGVyYWwnLFxuICAgIExhdGVyYWxDcm9zc0pvaW46ICdjcm9zcyBqb2luIGxhdGVyYWwnLFxuICAgIE91dGVyQXBwbHk6ICdvdXRlciBhcHBseScsXG4gICAgQ3Jvc3NBcHBseTogJ2Nyb3NzIGFwcGx5JyxcbiAgICBVc2luZzogJ3VzaW5nJyxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kdW1teS1kcml2ZXIuZC50c1wiIC8+XG4vKipcbiAqIEEgZHJpdmVyIHRoYXQgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuXG4gKlxuICogWW91IGNhbiB1c2UgdGhpcyB0byBjcmVhdGUgS3lzZWx5IGluc3RhbmNlcyBzb2xlbHkgZm9yIGJ1aWxkaW5nIHF1ZXJpZXNcbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIEt5c2VseSBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcG9zdGdyZXMgcXVlcmllczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHtcbiAqICAgRHVtbXlEcml2ZXIsXG4gKiAgIEt5c2VseSxcbiAqICAgUG9zdGdyZXNBZGFwdGVyLFxuICogICBQb3N0Z3Jlc0ludHJvc3BlY3RvcixcbiAqICAgUG9zdGdyZXNRdWVyeUNvbXBpbGVyXG4gKiB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiB7XG4gKiAgICAgY3JlYXRlQWRhcHRlcjogKCkgPT4gbmV3IFBvc3RncmVzQWRhcHRlcigpLFxuICogICAgIGNyZWF0ZURyaXZlcjogKCkgPT4gbmV3IER1bW15RHJpdmVyKCksXG4gKiAgICAgY3JlYXRlSW50cm9zcGVjdG9yOiAoZGI6IEt5c2VseTxhbnk+KSA9PiBuZXcgUG9zdGdyZXNJbnRyb3NwZWN0b3IoZGIpLFxuICogICAgIGNyZWF0ZVF1ZXJ5Q29tcGlsZXI6ICgpID0+IG5ldyBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIoKSxcbiAqICAgfSxcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBZb3UgY2FuIHVzZSBpdCB0byBidWlsZCBhIHF1ZXJ5IGFuZCBjb21waWxlIGl0IHRvIFNRTCBidXQgdHJ5aW5nIHRvXG4gKiBleGVjdXRlIHRoZSBxdWVyeSB3aWxsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCB7IHNxbCB9ID0gZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0QWxsKCkuY29tcGlsZSgpXG4gKiBjb25zb2xlLmxvZyhzcWwpIC8vIHNlbGVjdCAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBEdW1teURyaXZlciB7XG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyBhY3F1aXJlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbm5lY3Rpb24oKTtcbiAgICB9XG4gICAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyBjb21taXRUcmFuc2FjdGlvbigpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByb2xsYmFja1RyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJlbGVhc2VDb25uZWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZVNhdmVwb2ludCgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByb2xsYmFja1RvU2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHNhdmVwb2ludCgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbn1cbmNsYXNzIER1bW15Q29ubmVjdGlvbiB7XG4gICAgYXN5bmMgZXhlY3V0ZVF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm93czogW10sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jICpzdHJlYW1RdWVyeSgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGlhbGVjdC1hZGFwdGVyLWJhc2UuZC50c1wiIC8+XG4vKipcbiAqIEEgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgYERpYWxlY3RBZGFwdGVyYCB3aXRoIHNlbnNpYmxlIGRlZmF1bHQgdmFsdWVzLlxuICogVGhpcmQtcGFydHkgZGlhbGVjdHMgY2FuIGV4dGVuZCB0aGlzIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRoZSBgRGlhbGVjdEFkYXB0ZXJgXG4gKiBpbnRlcmZhY2UgZnJvbSBzY3JhdGNoLiBUaGF0IHdheSBhbGwgbmV3IHNldHRpbmdzIHdpbGwgZ2V0IGRlZmF1bHQgdmFsdWVzIHdoZW5cbiAqIHRoZXkgYXJlIGFkZGVkIGFuZCB0aGVyZSB3aWxsIGJlIGxlc3MgYnJlYWtpbmcgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERpYWxlY3RBZGFwdGVyQmFzZSB7XG4gICAgZ2V0IHN1cHBvcnRzQ3JlYXRlSWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBnZXQgc3VwcG9ydHNUcmFuc2FjdGlvbmFsRGRsKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1JldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXQgc3VwcG9ydHNPdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NxbGl0ZS1xdWVyeS1jb21waWxlci5kLnRzXCIgLz5cbmltcG9ydCB7IERlZmF1bHRRdWVyeUNvbXBpbGVyIH0gZnJvbSAnLi4vLi4vcXVlcnktY29tcGlsZXIvZGVmYXVsdC1xdWVyeS1jb21waWxlci5qcyc7XG5jb25zdCBJRF9XUkFQX1JFR0VYID0gL1wiL2c7XG5leHBvcnQgY2xhc3MgU3FsaXRlUXVlcnlDb21waWxlciBleHRlbmRzIERlZmF1bHRRdWVyeUNvbXBpbGVyIHtcbiAgICB2aXNpdE9yQWN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29yICcpO1xuICAgICAgICB0aGlzLmFwcGVuZChub2RlLmFjdGlvbik7XG4gICAgfVxuICAgIGdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuICc/JztcbiAgICB9XG4gICAgZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBnZXRSaWdodEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBnZXRMZWZ0SWRlbnRpZmllcldyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnXCInO1xuICAgIH1cbiAgICBnZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ1wiJztcbiAgICB9XG4gICAgZ2V0QXV0b0luY3JlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuICdhdXRvaW5jcmVtZW50JztcbiAgICB9XG4gICAgc2FuaXRpemVJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZShJRF9XUkFQX1JFR0VYLCAnXCJcIicpO1xuICAgIH1cbiAgICB2aXNpdERlZmF1bHRJbnNlcnRWYWx1ZShfKSB7XG4gICAgICAgIC8vIHNxbGl0ZSBkb2Vzbid0IHN1cHBvcnQgdGhlIGBkZWZhdWx0YCBrZXl3b3JkIGluIGluc2VydHMuXG4gICAgICAgIHRoaXMuYXBwZW5kKCdudWxsJyk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zcWxpdGUtYWRhcHRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERpYWxlY3RBZGFwdGVyQmFzZSB9IGZyb20gJy4uL2RpYWxlY3QtYWRhcHRlci1iYXNlLmpzJztcbmV4cG9ydCBjbGFzcyBTcWxpdGVBZGFwdGVyIGV4dGVuZHMgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNUcmFuc2FjdGlvbmFsRGRsKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1JldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVNaWdyYXRpb25Mb2NrKF9kYiwgX29wdCkge1xuICAgICAgICAvLyBTUUxpdGUgb25seSBoYXMgb25lIGNvbm5lY3Rpb24gdGhhdCdzIHJlc2VydmVkIGJ5IHRoZSBtaWdyYXRpb24gc3lzdGVtXG4gICAgICAgIC8vIGZvciB0aGUgd2hvbGUgdGltZSBiZXR3ZWVuIGFjcXVpcmVNaWdyYXRpb25Mb2NrIGFuZCByZWxlYXNlTWlncmF0aW9uTG9jay5cbiAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByZWxlYXNlTWlncmF0aW9uTG9jayhfZGIsIF9vcHQpIHtcbiAgICAgICAgLy8gU1FMaXRlIG9ubHkgaGFzIG9uZSBjb25uZWN0aW9uIHRoYXQncyByZXNlcnZlZCBieSB0aGUgbWlncmF0aW9uIHN5c3RlbVxuICAgICAgICAvLyBmb3IgdGhlIHdob2xlIHRpbWUgYmV0d2VlbiBhY3F1aXJlTWlncmF0aW9uTG9jayBhbmQgcmVsZWFzZU1pZ3JhdGlvbkxvY2suXG4gICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS5cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgdHlwZSBDb21waWxhYmxlLFxuICB0eXBlIERpYWxlY3RBZGFwdGVyLFxuICBEdW1teURyaXZlcixcbiAgdHlwZSBFeHByZXNzaW9uLFxuICB0eXBlIEV4cHJlc3Npb25CdWlsZGVyLFxuICBleHByZXNzaW9uQnVpbGRlcixcbiAgdHlwZSBFeHByZXNzaW9uV3JhcHBlcixcbiAgdHlwZSBJbnNlcnRPYmplY3QsXG4gIEt5c2VseSxcbiAgdHlwZSBLeXNlbHlQbHVnaW4sXG4gIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcixcbiAgdHlwZSBQbHVnaW5UcmFuc2Zvcm1RdWVyeUFyZ3MsXG4gIHR5cGUgUGx1Z2luVHJhbnNmb3JtUmVzdWx0QXJncyxcbiAgdHlwZSBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLFxuICB0eXBlIFF1ZXJ5Q29tcGlsZXIsXG4gIHR5cGUgUXVlcnlSZXN1bHQgYXMgS3lzZWx5UXVlcnlSZXN1bHQsXG4gIHR5cGUgUm9vdE9wZXJhdGlvbk5vZGUsXG4gIHNxbCxcbiAgdHlwZSBTcWxCb29sLFxuICB0eXBlIFVua25vd25Sb3csXG4gIHR5cGUgVXBkYXRlT2JqZWN0LFxuICBWYWx1ZUxpc3ROb2RlLFxuICBWYWx1ZU5vZGUsXG4gIHR5cGUgV2hlcmVJbnRlcmZhY2UsXG59IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHR5cGUgeyBDb2x1bW4sIENvbHVtbkZpbHRlciwgRmlsdGVyR3JvdXAsIFRhYmxlIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkZXJSZXF1aXJlbWVudHMge1xuICBBZGFwdGVyOiB7IG5ldyAoKTogRGlhbGVjdEFkYXB0ZXIgfTtcbiAgbm9QYXJhbWV0ZXJzPzogYm9vbGVhbjtcbiAgUXVlcnlDb21waWxlcjogeyBuZXcgKCk6IFF1ZXJ5Q29tcGlsZXIgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkZXI8REI+KHJlcXVpcmVtZW50czogQnVpbGRlclJlcXVpcmVtZW50cyk6IEt5c2VseTxEQj4ge1xuICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgZGlhbGVjdDoge1xuICAgICAgY3JlYXRlQWRhcHRlcjogKCkgPT4gbmV3IHJlcXVpcmVtZW50cy5BZGFwdGVyKCksXG4gICAgICBjcmVhdGVEcml2ZXI6ICgpID0+IG5ldyBEdW1teURyaXZlcigpLFxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIHdlIGRvbid0IG5lZWQgYnVpbHQtaW4gaW50cm9zcGVjdGlvbiBpbiB0aGlzIGNhc2VcbiAgICAgIGNyZWF0ZUludHJvc3BlY3RvcjogKCkgPT4gbnVsbCxcbiAgICAgIGNyZWF0ZVF1ZXJ5Q29tcGlsZXI6ICgpID0+IG5ldyByZXF1aXJlbWVudHMuUXVlcnlDb21waWxlcigpLFxuICAgIH0sXG4gICAgcGx1Z2luczogWy4uLihyZXF1aXJlbWVudHMubm9QYXJhbWV0ZXJzID8gW25ldyBJbW1lZGlhdGVWYWx1ZVBsdWdpbigpXSA6IFtdKV0sXG4gIH0pO1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIHRoYXQgdHJhbnNmb3JtcyBhbGwgdmFsdWVzIHRvIGltbWVkaWF0ZSB2YWx1ZXMuIFRoaXMgbWVhbnMgdGhlaXIgaW5qZWN0ZWQgaW50byB0aGUgU1FMIHN0cmluZyBpbnN0ZWFkIG9mIHBvcHVsYXRpbmcgdGhlIHBhcmFtZXRlcnMgYXJyYXkuXG4gKiBJbiBzb21lIHNpdHVhdGlvbnMsIGEgZGF0YWJhc2UgZHJpdmVyIG1pZ2h0IG5vdCBzdXBwb3J0IHBhcmFtZXRlcnMsIGFuZCB0aGlzIHBsdWdpbiBjYW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGF0LlxuICovXG5jbGFzcyBJbW1lZGlhdGVWYWx1ZVBsdWdpbiBpbXBsZW1lbnRzIEt5c2VseVBsdWdpbiB7XG4gIHJlYWRvbmx5ICN0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG5cbiAgdHJhbnNmb3JtUXVlcnkoYXJnczogUGx1Z2luVHJhbnNmb3JtUXVlcnlBcmdzKTogUm9vdE9wZXJhdGlvbk5vZGUge1xuICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSk7XG4gIH1cblxuICB0cmFuc2Zvcm1SZXN1bHQoYXJnczogUGx1Z2luVHJhbnNmb3JtUmVzdWx0QXJncyk6IFByb21pc2U8S3lzZWx5UXVlcnlSZXN1bHQ8VW5rbm93blJvdz4+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFyZ3MucmVzdWx0KTtcbiAgfVxufVxuXG5jbGFzcyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIGV4dGVuZHMgT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIHtcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlOiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlKTogUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZSB7XG4gICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSkgYXMgbmV2ZXI7XG4gIH1cblxuICBvdmVycmlkZSB0cmFuc2Zvcm1WYWx1ZShub2RlOiBWYWx1ZU5vZGUpOiBWYWx1ZU5vZGUge1xuICAgIHJldHVybiB7IC4uLnN1cGVyLnRyYW5zZm9ybVZhbHVlKG5vZGUpLCBpbW1lZGlhdGU6IHRydWUgfTtcbiAgfVxufVxuXG5kZWNsYXJlIGNvbnN0IHF1ZXJ5VHlwZTogdW5pcXVlIHN5bWJvbDtcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnk8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIFtxdWVyeVR5cGVdPzogVDtcbiAgcGFyYW1ldGVyczogcmVhZG9ubHkgdW5rbm93bltdO1xuICBzcWw6IHN0cmluZztcbiAgdHJhbnNmb3JtYXRpb25zPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgXCJqc29uLXBhcnNlXCI+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzUXVlcnk8VD4ocXVlcnk6IHN0cmluZyB8IFF1ZXJ5PHVua25vd24+KTogUXVlcnk8VD4ge1xuICBpZiAodHlwZW9mIHF1ZXJ5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHsgcGFyYW1ldGVyczogW10sIHNxbDogcXVlcnkgfSBhcyBuZXZlcjtcbiAgfVxuXG4gIHJldHVybiBxdWVyeSBhcyBuZXZlcjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlSZXN1bHQ8VD4gPVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBUIGV4dGVuZHMgUXVlcnk8aW5mZXIgUj4gPyBSW10gOiBUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBRdWVyeTxpbmZlciBSPiA/IFJbXSA6IG5ldmVyO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiBjb2x1bW4gbmFtZXMgdG8gdHJhbnNmb3JtYXRpb25zIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC5cbiAgICogQ3VycmVudGx5IHN1cHBvcnRlZCB0cmFuc2Zvcm1hdGlvbiBpcyBcImpzb24tcGFyc2VcIiwgd2hpY2ggcGFyc2VzIGEgSlNPTiBzdHJpbmcgaW50byBhbiBvYmplY3QuXG4gICAqL1xuICB0cmFuc2Zvcm1hdGlvbnM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBcImpzb24tcGFyc2VcIj4+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZTxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBjb21waWxlYWJsZTogQ29tcGlsYWJsZTxUPixcbiAgb3B0aW9ucz86IENvbXBpbGVPcHRpb25zPFQ+LFxuKTogUXVlcnk8VD4ge1xuICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gY29tcGlsZWFibGUuY29tcGlsZSgpO1xuXG4gIHJldHVybiB7XG4gICAgcGFyYW1ldGVyczogY29tcGlsZWRRdWVyeS5wYXJhbWV0ZXJzLFxuICAgIHNxbDogY29tcGlsZWRRdWVyeS5zcWwsXG4gICAgdHJhbnNmb3JtYXRpb25zOiBvcHRpb25zPy50cmFuc2Zvcm1hdGlvbnMsXG4gIH07XG59XG5cbi8qKlxuICogQXBwbGllcyBhIGZpbHRlciB0byB0aGUgZ2l2ZW4gcm93cyBiYXNlZCBvbiB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBvZiB0aGUgdGFibGUuXG4gKlxuICogQGV4YW1wbGUgZGIuc2VsZWN0RnJvbShcInVzZXJzXCIpLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKHJvd3MsIGNvbHVtbnMpKS5zZWxlY3RBbGwoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdKSB7XG4gIGNvbnN0IHJvd0ZpbHRlcnMgPSBpbmZlclJvd0ZpbHRlcnMocm93cywgY29sdW1ucyk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIDxRQiBleHRlbmRzIFdoZXJlSW50ZXJmYWNlPGFueSwgYW55Pj4ocWI6IFFCKTogUUIgPT5cbiAgICBxYi53aGVyZSgoZWIpID0+IHtcbiAgICAgIHJldHVybiBlYi5vcihcbiAgICAgICAgcm93RmlsdGVycy5tYXAoKHJvd0ZpbHRlcikgPT4ge1xuICAgICAgICAgIHJldHVybiBlYi5hbmQoXG4gICAgICAgICAgICByb3dGaWx0ZXIubWFwKChbY29sdW1uTmFtZSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgICBlYihjb2x1bW5OYW1lLCB2YWx1ZSA9PT0gbnVsbCA/IFwiaXNcIiA6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gXCJpblwiIDogXCI9XCIsIHZhbHVlKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pIGFzIG5ldmVyO1xufVxuXG4vKipcbiAqIFBhcnQgb2YgYSBmaWx0ZXIgdGhhdCBwcmVkaWN0cyBhIG1hdGNoLlxuICogaWUuIC4uLiBXSEVSRSAkQ29sdW1OYW1lID0gJFZhbHVlIC4uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxudHlwZSBSb3dGaWx0ZXJQcmVkaWNhdGUgPSBbQ29sdW1uTmFtZTogc3RyaW5nIHwgRXhwcmVzc2lvbjxhbnk+LCBWYWx1ZTogdW5rbm93bl07XG5cbi8qKlxuICogQSByb3cgZmlsdGVyIGlzIGNvbXByaXNlZCBvZiBvbmUgb3IgbW9yZSBwcmVkaWNhdGVzLlxuICovXG50eXBlIFJvd0ZpbHRlciA9IFJvd0ZpbHRlclByZWRpY2F0ZVtdO1xuXG4vKipcbiAqIFJvdyBmaWx0ZXJzIGlzIHNpbXBseSBhIHNldCBvZiBtdWx0aXBsZSB7QGxpbmsgUm93RmlsdGVyfS5cbiAqL1xudHlwZSBSb3dGaWx0ZXJzID0gUm93RmlsdGVyW107XG5cbi8qKlxuICogSW5mZXJzIHRoZSBmaWx0ZXIgdGhhdCBpcyBuZWNlc3NhcnkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBnaXZlbiByb3dcbiAqIGluZGl2aWR1YWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRmlsdGVyT2JqZWN0KHJvdzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGNvbHVtbnM6IFRhYmxlW1wiY29sdW1uc1wiXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZmlsdGVyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgY29sdW1uIG9mIE9iamVjdC52YWx1ZXMoY29sdW1ucykpIHtcbiAgICBjb25zdCB7IGlzSW5QcmltYXJ5S2V5LCBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICBpZiAoIWlzSW5QcmltYXJ5S2V5KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmaWx0ZXJbY29sdW1uTmFtZV0gPSByb3dbY29sdW1uTmFtZV0gPz8gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBmaWx0ZXI7XG59XG5cbi8qKlxuICogSW5mZXJzIHRoZSBmaWx0ZXIgdGhhdCBpcyBuZWNlc3NhcnkgdG8gdW5pcXVlbHkgaWRlbnRpZnkgbXVsdGlwbGUgcm93c1xuICogaW5kaXZpZHVhbGx5LlxuICpcbiAqIEVsZWdhbnRseSBpbmZlcnMgdGhlIGJlc3QgcG9zc2libGUgc3RhdGVtZW50IHRvIGZpbHRlciB3aXRoLlxuICogVE9ETzogaW50cm9zcGVjdCBwcmltYXJ5IGtleSBvcmRpbmFsIG51bWJlcnMgc28gdGhlIHR1cGxlIGlzIGluIHRoZSBjb3JyZWN0IG9yZGVyLlxuICogVE9ETzogaWYgd2UgZXZlciBzdXBwb3J0IE1TU1FMLCB3ZSdsbCBuZWVkIHRvIGRyb3AgdG8gZHVtYiAoLi4uIGFuZCAuLi4pIG9yICguLi4gYW5kIC4uLikgbGlrZSBpbiB0aGUgb2xkIHdheSBqdXN0IGZvciBNU1NRTC5cbiAqXG4gKiBGb3Igc2luZ2xlIGNvbHVtbiBwcmltYXJ5IGtleTpcbiAqXG4gKiAxLiBpZiBvbmx5IDEgcm93OiBjb2wgPSB2YWx1ZVxuICogMi4gaWYgbXVsdGlwbGUgcm93czogY29sIElOICh2YWx1ZTEsIHZhbHVlMiwgLi4uKVxuICpcbiAqIEZvciBjb21wb3NpdGUgcHJpbWFyeSBrZXk6XG4gKlxuICogMS4gaWYgb25seSAxIHJvdzogKGNvbDEsIGNvbDIsIC4uLikgPSAodmFsdWUxLCB2YWx1ZTIsIC4uLilcbiAqIDIuIGlmIG11bHRpcGxlIHJvd3M6IChjb2wxLCBjb2wyLCAuLi4pIElOICgodmFsdWUxYSwgdmFsdWUyYSwgLi4uKSwgKHZhbHVlMWIsIHZhbHVlMmIsIC4uLiksIC4uLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyUm93RmlsdGVycyhyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCBjb2x1bW5zOiBUYWJsZVtcImNvbHVtbnNcIl0pOiBSb3dGaWx0ZXJzIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3QgcmVmczogRXhwcmVzc2lvbldyYXBwZXI8YW55LCBhbnksIGFueT5bXSA9IFtdO1xuICBjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IGViID0gZXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KCk7XG5cbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGNvbnN0IHZhbHVlc0ZvclJvdzogdW5rbm93bltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBPYmplY3QudmFsdWVzKGNvbHVtbnMpKSB7XG4gICAgICBjb25zdCB7IGlzSW5QcmltYXJ5S2V5LCBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgIGlmICghaXNJblByaW1hcnlLZXkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChyb3cgPT09IHJvd3MuYXQoMCkpIHtcbiAgICAgICAgcmVmcy5wdXNoKGViLnJlZihjb2x1bW5OYW1lKSk7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlc0ZvclJvdy5wdXNoKHRyYW5zZm9ybVZhbHVlKHJvd1tjb2x1bW5OYW1lXSA/PyBudWxsLCBjb2x1bW4pKTtcbiAgICB9XG5cbiAgICB2YWx1ZXMucHVzaChyZWZzLmxlbmd0aCA9PT0gMSA/IHZhbHVlc0ZvclJvdy5hdCgwKSEgOiB0dXBsZUZyb20odmFsdWVzRm9yUm93KSk7XG4gIH1cblxuICBjb25zdCBsaHMgPSByZWZzLmxlbmd0aCA9PT0gMSA/IHJlZnMuYXQoMCkhIDogdHVwbGVGcm9tKHJlZnMpO1xuICBjb25zdCByaHMgPSB2YWx1ZXMubGVuZ3RoID09PSAxID8gdmFsdWVzLmF0KDApISA6IHZhbHVlcztcblxuICByZXR1cm4gW1tbbGhzLCByaHNdXV07XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiB0dXBsZUZyb20oaXRlbXM6IHVua25vd25bXSk6IEV4cHJlc3Npb248YW55PiB7XG4gIHJldHVybiBzcWxgKCR7c3FsLmpvaW4oaXRlbXMsIHNxbGAsIGApfSlgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm1hdGlvbnM8QyBleHRlbmRzIFwiaW5zZXJ0XCIgfCBcInVwZGF0ZVwiPihcbiAgX2NvbnRleHQ6IEMsXG4gIHZhbHVlczogQyBleHRlbmRzIFwidXBkYXRlXCIgPyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSxcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogQyBleHRlbmRzIFwidXBkYXRlXCIgPyAoKSA9PiBVcGRhdGVPYmplY3Q8YW55LCBhbnk+IDogKCkgPT4gSW5zZXJ0T2JqZWN0PGFueSwgYW55PiB8IEluc2VydE9iamVjdDxhbnksIGFueT5bXSB7XG4gIHJldHVybiAoKSA9PlxuICAgIEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcy5tYXAoKHJvdykgPT4gdHJhbnNmb3JtVmFsdWVzKHJvdywgY29sdW1ucykpIDogdHJhbnNmb3JtVmFsdWVzKHZhbHVlcywgY29sdW1ucyk7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVZhbHVlcyhcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogSW5zZXJ0T2JqZWN0PGFueSwgYW55PiB8IFVwZGF0ZU9iamVjdDxhbnksIGFueT4ge1xuICBpZiAoT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBbT2JqZWN0LmtleXMoY29sdW1ucykuYXQoMCkhXTogc3FsYGRlZmF1bHRgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWVzKS5yZWR1Y2UoXG4gICAgKG9iaiwgW2tleSwgdmFsdWVdKSA9PiAoeyAuLi5vYmosIFtrZXldOiB0cmFuc2Zvcm1WYWx1ZSh2YWx1ZSwgY29sdW1uc1trZXldISkgfSksXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB7fSBhcyBJbnNlcnRPYmplY3Q8YW55LCBhbnk+IHwgVXBkYXRlT2JqZWN0PGFueSwgYW55PixcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1WYWx1ZSh2YWx1ZTogdW5rbm93biwgY29sdW1uOiBDb2x1bW4pOiBFeHByZXNzaW9uV3JhcHBlcjxhbnksIGFueSwgYW55PiB7XG4gIGNvbnN0IHsgZGF0YXR5cGUgfSA9IGNvbHVtbjtcblxuICBjb25zdCBlYiA9IGV4cHJlc3Npb25CdWlsZGVyKCk7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGViLmxpdChudWxsKTtcbiAgfVxuXG4gIGlmICghZGF0YXR5cGUuaXNOYXRpdmUpIHtcbiAgICByZXR1cm4gZWIuY2FzdChlYi52YWwodmFsdWUpLCBzcWwuaWQoZGF0YXR5cGUuc2NoZW1hLCBkYXRhdHlwZS5uYW1lKSk7XG4gIH1cblxuICByZXR1cm4gZWIudmFsKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oXG4gIGZpbHRlcnM6IChDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cClbXSxcbiAgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuKTogKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4ge1xuICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDApIHJldHVybiAoZWIpID0+IGViLmxpdCh0cnVlKTsgLy8gbm8gZmlsdGVycywgYWx3YXlzIHRydWVcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBvckdyb3Vwc09mQW5kQnVpbGRlcnM6ICgoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gRXhwcmVzc2lvbjxTcWxCb29sPilbXVtdID0gW107XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGxldCBjdXJyZW50QW5kR3JvdXBCdWlsZGVyczogKChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+KVtdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgY3VycmVudEFuZEdyb3VwQnVpbGRlcnMucHVzaChidWlsZEJhc2VFeHByZXNzaW9uQnVpbGRlcihmaWx0ZXJzW2ldISwgY29sdW1ucykpO1xuXG4gICAgLy8gJm4gQU5EIGdyb3VwIGVuZHMgaWYgaXQncyB0aGUgbGFzdCBmaWx0ZXIsIG9yIHRoZSBpdGVtIGlzIGZvbGxvd2VkIGJ5IGFuICdvcidcbiAgICBpZiAoaSA9PT0gZmlsdGVycy5sZW5ndGggLSAxIHx8IGZpbHRlcnNbaV0hLmFmdGVyID09PSBcIm9yXCIpIHtcbiAgICAgIG9yR3JvdXBzT2ZBbmRCdWlsZGVycy5wdXNoKGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzKTtcbiAgICAgIGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzID0gW107IC8vIHN0YXJ0IGEgbmV3IGdyb3VwXG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmV0dXJuIChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc3QgYW5kRXhwcmVzc2lvbnMgPSBvckdyb3Vwc09mQW5kQnVpbGRlcnMubWFwKChncm91cCkgPT4ge1xuICAgICAgcmV0dXJuIGViLmFuZChncm91cC5tYXAoKGJ1aWxkZXIpID0+IGJ1aWxkZXIoZWIpKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZWIub3IoYW5kRXhwcmVzc2lvbnMpO1xuICB9O1xufVxuXG4vLyBIZWxwZXIgdG8gYnVpbGQgYW4gZXhwcmVzc2lvbiBidWlsZGVyIGZvciBhIHNpbmdsZSBmaWx0ZXIgb3IgYSBncm91cFxuZnVuY3Rpb24gYnVpbGRCYXNlRXhwcmVzc2lvbkJ1aWxkZXIoXG4gIHNwZWM6IENvbHVtbkZpbHRlciB8IEZpbHRlckdyb3VwLFxuICBjb2x1bW5zOiBUYWJsZVtcImNvbHVtbnNcIl0sXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4pOiAoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gRXhwcmVzc2lvbjxTcWxCb29sPiB7XG4gIGlmIChzcGVjLmtpbmQgPT09IFwiQ29sdW1uRmlsdGVyXCIpIHtcbiAgICByZXR1cm4gKGViKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbHVtbiwgb3BlcmF0b3IsIHZhbHVlIH0gPSBzcGVjO1xuXG4gICAgICBjb25zdCBjb2x1bW5NZXRhID0gY29sdW1uc1tjb2x1bW5dITtcblxuICAgICAgcmV0dXJuIGViKFxuICAgICAgICBjb2x1bW5NZXRhLmRhdGF0eXBlLmdyb3VwID09PSBcInJhd1wiID8gZWIuY2FzdChjb2x1bW4sIFwidGV4dFwiKSA6IGNvbHVtbixcbiAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgIHRyYW5zZm9ybVZhbHVlKHZhbHVlLCBjb2x1bW5NZXRhKSxcbiAgICAgICk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKHNwZWMuZmlsdGVycywgY29sdW1ucyk7XG59XG4iLCAiaW1wb3J0IHsgdHlwZSBLeXNlbHksIFNxbGl0ZUFkYXB0ZXIsIFNxbGl0ZVF1ZXJ5Q29tcGlsZXIgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgZ2V0QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldFNRTGl0ZUJ1aWxkZXI8RGF0YWJhc2UgPSBhbnk+KFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKTogS3lzZWx5PERhdGFiYXNlPiB7XG4gIHJldHVybiBnZXRCdWlsZGVyPERhdGFiYXNlPih7XG4gICAgLi4ucmVxdWlyZW1lbnRzLFxuICAgIEFkYXB0ZXI6IFNxbGl0ZUFkYXB0ZXIsXG4gICAgUXVlcnlDb21waWxlcjogU3FsaXRlUXVlcnlDb21waWxlcixcbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIHR5cGUgSW5mZXJSZXN1bHQsIHR5cGUgUmVmZXJlbmNlRXhwcmVzc2lvbiwgc3FsIH0gZnJvbSBcImt5c2VseVwiO1xuXG5pbXBvcnQgdHlwZSB7IEFkYXB0ZXJEZWxldGVEZXRhaWxzLCBBZGFwdGVySW5zZXJ0RGV0YWlscywgQWRhcHRlclF1ZXJ5RGV0YWlscywgQWRhcHRlclVwZGF0ZURldGFpbHMgfSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsIHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgY29tcGlsZSwgZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0U1FMaXRlQnVpbGRlciB9IGZyb20gXCIuL2J1aWxkZXJcIjtcbmltcG9ydCB7IG1vY2tUYWJsZXNRdWVyeSB9IGZyb20gXCIuL2ludHJvc3BlY3Rpb25cIjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCBzZWxlY3RzIGFsbCBjb2x1bW5zIGZyb20gYSB0YWJsZSB3aXRoIGFuIHVuYm91bmQgcm93IGNvdW50IGFzIGBfX3BzX2NvdW50X19gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VsZWN0UXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJRdWVyeURldGFpbHMsXG4gIHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4sXG4pIHtcbiAgY29uc3Qge1xuICAgIGZpbHRlciA9IHsgYWZ0ZXI6IFwiYW5kXCIsIGZpbHRlcnM6IFtdLCBraW5kOiBcIkZpbHRlckdyb3VwXCIgfSxcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0U1FMaXRlQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgY29uc3QgZmlsdGVyRXhwcmVzc2lvbiA9IGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oZmlsdGVyLmZpbHRlcnMsIGNvbHVtbnMpO1xuXG4gIGNvbnN0IGNvdW50UXVlcnkgPSBidWlsZGVyXG4gICAgLnNlbGVjdEZyb20odGFibGVOYW1lKVxuICAgIC53aGVyZShmaWx0ZXJFeHByZXNzaW9uKVxuICAgIC5zZWxlY3QoKGViKSA9PiBlYi5jYXN0PEJpZ0ludFN0cmluZz4oZWIuZm4uY29hbGVzY2UoZWIuZm4uY291bnRBbGwoKSwgc3FsLmxpdCgwKSksIFwidGV4dFwiKS5hcyhcInZhbHVlXCIpKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAud2l0aChcImNvdW50XCIsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAuc2VsZWN0RnJvbShbdGFibGVOYW1lLCBcImNvdW50XCJdKVxuICAgICAgLy8gVE9ETzogY3Vyc29yIHBhZ2luYXRpb24/XG4gICAgICAud2hlcmUoZmlsdGVyRXhwcmVzc2lvbilcbiAgICAgIC5zZWxlY3QoXG4gICAgICAgIHNxbFxuICAgICAgICAgIC5yZWY8QmlnSW50U3RyaW5nPihcbiAgICAgICAgICAgIFwiY291bnQudmFsdWVcIiBzYXRpc2ZpZXMgUmVmZXJlbmNlRXhwcmVzc2lvbjx7IGNvdW50OiBJbmZlclJlc3VsdDx0eXBlb2YgY291bnRRdWVyeT5bbnVtYmVyXSB9LCBcImNvdW50XCI+LFxuICAgICAgICAgIClcbiAgICAgICAgICAuYXMoXCJfX3BzX2NvdW50X19cIiksXG4gICAgICApXG4gICAgICAuc2VsZWN0KE9iamVjdC5rZXlzKGNvbHVtbnMpKVxuICAgICAgLiRjYWxsKChxYikgPT4gc29ydE9yZGVyLnJlZHVjZSgocWIsIGl0ZW0pID0+IHFiLm9yZGVyQnkoaXRlbS5jb2x1bW4sIGl0ZW0uZGlyZWN0aW9uKSwgcWIpKVxuICAgICAgLmxpbWl0KHBhZ2VTaXplKVxuICAgICAgLy8gd2UncmUgaW5qZWN0aW5nIHRoZSBvZmZzZXQgdmFsdWUgaGVyZSB0byBhdm9pZCBzZXJpYWxpemF0aW9uIGNvbXBsZXhpdHkgKGBiaWdpbnRgIGlzIGEgbm8tZ28gZm9yIGBKU09OLnN0cmluZ2lmeWApLlxuICAgICAgLm9mZnNldChzcWwubGl0KEJpZ0ludChwYWdlSW5kZXgpICogQmlnSW50KHBhZ2VTaXplKSkpLFxuICApO1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja1NlbGVjdFF1ZXJ5KCkge1xuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKFwiMjAyNS0wMS0yNlQyMTo1NjoxMi4zNDVaXCIpLFxuICAgICAgZGVsZXRlZF9hdDogbnVsbCxcbiAgICAgIGlkOiAxLFxuICAgICAgbmFtZTogXCJKb2huIERvZVwiLFxuICAgICAgX19wc19jb3VudF9fOiBcIjJcIixcbiAgICAgIHJvbGU6IFwiYWRtaW5cIixcbiAgICAgIG5hbWVfcm9sZTogXCJKb25uIERvZSAtIGFkbWluXCIsXG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdGVkX2F0OiBuZXcgRGF0ZShcIjIwMjUtMDEtMjZUMjA6NTY6MTIuMzQ1WlwiKSxcbiAgICAgIGRlbGV0ZWRfYXQ6IG51bGwsXG4gICAgICBpZDogMixcbiAgICAgIG5hbWU6IFwiSmFuZSBEb2VcIixcbiAgICAgIF9fcHNfY291bnRfXzogXCIyXCIsXG4gICAgICByb2xlOiBcInBvd2VydXNlclwiLFxuICAgICAgbmFtZV9yb2xlOiBcIkphbmUgRG9lIC0gcG93ZXJ1c2VyXCIsXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMge1xuICAgIC8vIGJlc3QgZWZmb3J0IG5vIG5lZWQgdG8gZ28gb3ZlcmJvYXJkXG4gICAgW0sgaW4gUmV0dXJuVHlwZTx0eXBlb2YgbW9ja1RhYmxlc1F1ZXJ5PlsxXVtcImNvbHVtbnNcIl1bbnVtYmVyXVtcIm5hbWVcIl0gfCBcIl9fcHNfY291bnRfX1wiXTogdW5rbm93bjtcbiAgfVtdO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IGRlbGV0ZXMgYSBnaXZlbiBzZXQgb2Ygcm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyRGVsZXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgcm93cyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgfSA9IGRldGFpbHM7XG5cbiAgY29uc3QgYnVpbGRlciA9IGdldFNRTGl0ZUJ1aWxkZXI8UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+PihyZXF1aXJlbWVudHMpO1xuXG4gIHJldHVybiBjb21waWxlKFxuICAgIGJ1aWxkZXJcbiAgICAgIC5kZWxldGVGcm9tKHRhYmxlTmFtZSlcbiAgICAgIC4kY2FsbChhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfZGVsZXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIG9uZSBvciBtb3JlIHJvd3MgaW50byBhIHRhYmxlIGFuZCByZXR1cm5zIHRoZSBpbnNlcnRlZCByb3dzIGFsb25nIHdpdGggdGhlaXIgYGN0aWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zZXJ0UXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJJbnNlcnREZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUgfSxcbiAgICByb3dzLFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0U1FMaXRlQnVpbGRlcjxSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgYnVpbGRlclxuICAgICAgLmluc2VydEludG8odGFibGVOYW1lKVxuICAgICAgLnZhbHVlcyhyb3dzLm1hcCgocm93KSA9PiAoT2JqZWN0LmtleXMocm93KS5sZW5ndGggPT09IDAgPyB7IFtPYmplY3Qua2V5cyhjb2x1bW5zKVswXSFdOiBudWxsIH0gOiByb3cpKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfaW5zZXJ0ZWRfYXRfX1wiKSksXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgdXBkYXRlcyBhIGdpdmVuIHJvdyBpbiBhIHRhYmxlIHdpdGggZ2l2ZW4gY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyVXBkYXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgY2hhbmdlcyxcbiAgICByb3csXG4gICAgdGFibGU6IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lIH0sXG4gIH0gPSBkZXRhaWxzO1xuXG4gIGNvbnN0IGJ1aWxkZXIgPSBnZXRTUUxpdGVCdWlsZGVyPFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4ocmVxdWlyZW1lbnRzKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAudXBkYXRlVGFibGUodGFibGVOYW1lKVxuICAgICAgLnNldChjaGFuZ2VzKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFtyb3ddLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoT2JqZWN0LmtleXMoY29sdW1ucykpXG4gICAgICAucmV0dXJuaW5nKGdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMoKS5hcyhcIl9fcHNfdXBkYXRlZF9hdF9fXCIpKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVzdGFtcE1pbGxpcygpIHtcbiAgY29uc3QgZWIgPSBleHByZXNzaW9uQnVpbGRlcigpO1xuXG4gIHJldHVybiBlYi5jYXN0PEJpZ0ludFN0cmluZz4oZWIuY2FzdChzcWxgKGp1bGlhbmRheSgnbm93JykgLSAyNDQwNTg3LjUpICogODY0MDAwMDAuMGAsIFwiaW50ZWdlclwiKSwgXCJ0ZXh0XCIpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLW9iamVjdC1hcmdzLmQudHNcIiAvPlxuaW1wb3J0IHsgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24td3JhcHBlci5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRKc29uT2JqZWN0QXJncyhub2RlLCB0YWJsZSkge1xuICAgIGNvbnN0IGFyZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHsgc2VsZWN0aW9uOiBzIH0gb2Ygbm9kZS5zZWxlY3Rpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChSZWZlcmVuY2VOb2RlLmlzKHMpICYmIENvbHVtbk5vZGUuaXMocy5jb2x1bW4pKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goY29sTmFtZShzLmNvbHVtbi5jb2x1bW4ubmFtZSksIGNvbFJlZih0YWJsZSwgcy5jb2x1bW4uY29sdW1uLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb2x1bW5Ob2RlLmlzKHMpKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goY29sTmFtZShzLmNvbHVtbi5uYW1lKSwgY29sUmVmKHRhYmxlLCBzLmNvbHVtbi5uYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQWxpYXNOb2RlLmlzKHMpICYmIElkZW50aWZpZXJOb2RlLmlzKHMuYWxpYXMpKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goY29sTmFtZShzLmFsaWFzLm5hbWUpLCBjb2xSZWYodGFibGUsIHMuYWxpYXMubmFtZSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBleHRyYWN0IGNvbHVtbiBuYW1lcyBmcm9tIHRoZSBzZWxlY3QgcXVlcnkgbm9kZWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xufVxuZnVuY3Rpb24gY29sTmFtZShjb2wpIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUoY29sKSk7XG59XG5mdW5jdGlvbiBjb2xSZWYodGFibGUsIGNvbCkge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUoY29sKSwgVGFibGVOb2RlLmNyZWF0ZSh0YWJsZSkpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3FsaXRlLmQudHNcIiAvPlxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnLi4vcmF3LWJ1aWxkZXIvc3FsLmpzJztcbmltcG9ydCB7IGdldEpzb25PYmplY3RBcmdzIH0gZnJvbSAnLi4vdXRpbC9qc29uLW9iamVjdC1hcmdzLmpzJztcbi8qKlxuICogQSBTUUxpdGUgaGVscGVyIGZvciBhZ2dyZWdhdGluZyBhIHN1YnF1ZXJ5IGludG8gYSBKU09OIGFycmF5LlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIG9ubHkgd29ya3MgY29ycmVjdGx5IGlmIHlvdSd2ZSBpbnN0YWxsZWQgdGhlIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYC5cbiAqIE90aGVyd2lzZSB0aGUgbmVzdGVkIHNlbGVjdGlvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBKU09OIHN0cmluZ3MuXG4gKlxuICogVGhlIHBsdWdpbiBjYW4gYmUgaW5zdGFsbGVkIGxpa2UgdGhpczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0ICogYXMgU3FsaXRlIGZyb20gJ2JldHRlci1zcWxpdGUzJ1xuICogaW1wb3J0IHsgS3lzZWx5LCBQYXJzZUpTT05SZXN1bHRzUGx1Z2luLCBTcWxpdGVEaWFsZWN0IH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IG5ldyBTcWxpdGVEaWFsZWN0KHtcbiAqICAgICBkYXRhYmFzZTogbmV3IFNxbGl0ZSgnOm1lbW9yeTonKVxuICogICB9KSxcbiAqICAgcGx1Z2luczogW25ldyBQYXJzZUpTT05SZXN1bHRzUGx1Z2luKCldXG4gKiB9KVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25BcnJheUZyb20gfSBmcm9tICdreXNlbHkvaGVscGVycy9zcWxpdGUnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQXJyYXlGcm9tKFxuICogICAgICAgZWIuc2VsZWN0RnJvbSgncGV0JylcbiAqICAgICAgICAgLnNlbGVjdChbJ3BldC5pZCBhcyBwZXRfaWQnLCAncGV0Lm5hbWUnXSlcbiAqICAgICAgICAgLndoZXJlUmVmKCdwZXQub3duZXJfaWQnLCAnPScsICdwZXJzb24uaWQnKVxuICogICAgICAgICAub3JkZXJCeSgncGV0Lm5hbWUnKVxuICogICAgICkuYXMoJ3BldHMnKVxuICogICBdKVxuICogICAuZXhlY3V0ZSgpXG4gKlxuICogcmVzdWx0WzBdPy5pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdLnBldF9pZFxuICogcmVzdWx0WzBdPy5wZXRzWzBdLm5hbWVcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwgKFxuICogICBzZWxlY3QgY29hbGVzY2UoanNvbl9ncm91cF9hcnJheShqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgXCJhZ2dcIi5cInBldF9pZFwiLFxuICogICAgICduYW1lJywgXCJhZ2dcIi5cIm5hbWVcIlxuICogICApKSwgJ1tdJykgZnJvbSAoXG4gKiAgICAgc2VsZWN0IFwicGV0XCIuXCJpZFwiIGFzIFwicGV0X2lkXCIsIFwicGV0XCIuXCJuYW1lXCJcbiAqICAgICBmcm9tIFwicGV0XCJcbiAqICAgICB3aGVyZSBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gKiAgICAgb3JkZXIgYnkgXCJwZXRcIi5cIm5hbWVcIlxuICogICApIGFzIFwiYWdnXCJcbiAqICkgYXMgXCJwZXRzXCJcbiAqIGZyb20gXCJwZXJzb25cIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQXJyYXlGcm9tKGV4cHIpIHtcbiAgICByZXR1cm4gc3FsIGAoc2VsZWN0IGNvYWxlc2NlKGpzb25fZ3JvdXBfYXJyYXkoanNvbl9vYmplY3QoJHtzcWwuam9pbihnZXRTcWxpdGVKc29uT2JqZWN0QXJncyhleHByLnRvT3BlcmF0aW9uTm9kZSgpLCAnYWdnJykpfSkpLCAnW10nKSBmcm9tICR7ZXhwcn0gYXMgYWdnKWA7XG59XG4vKipcbiAqIEEgU1FMaXRlIGhlbHBlciBmb3IgdHVybmluZyBhIHN1YnF1ZXJ5IGludG8gYSBKU09OIG9iamVjdC5cbiAqXG4gKiBUaGUgc3VicXVlcnkgbXVzdCBvbmx5IHJldHVybiBvbmUgcm93LlxuICpcbiAqIE5PVEU6IFRoaXMgaGVscGVyIG9ubHkgd29ya3MgY29ycmVjdGx5IGlmIHlvdSd2ZSBpbnN0YWxsZWQgdGhlIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYC5cbiAqIE90aGVyd2lzZSB0aGUgbmVzdGVkIHNlbGVjdGlvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBKU09OIHN0cmluZ3MuXG4gKlxuICogVGhlIHBsdWdpbiBjYW4gYmUgaW5zdGFsbGVkIGxpa2UgdGhpczpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0ICogYXMgU3FsaXRlIGZyb20gJ2JldHRlci1zcWxpdGUzJ1xuICogaW1wb3J0IHsgS3lzZWx5LCBQYXJzZUpTT05SZXN1bHRzUGx1Z2luLCBTcWxpdGVEaWFsZWN0IH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IG5ldyBTcWxpdGVEaWFsZWN0KHtcbiAqICAgICBkYXRhYmFzZTogbmV3IFNxbGl0ZSgnOm1lbW9yeTonKVxuICogICB9KSxcbiAqICAgcGx1Z2luczogW25ldyBQYXJzZUpTT05SZXN1bHRzUGx1Z2luKCldXG4gKiB9KVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGpzb25PYmplY3RGcm9tIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvc3FsaXRlJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbk9iamVjdEZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC53aGVyZSgncGV0LmlzX2Zhdm9yaXRlJywgJz0nLCB0cnVlKVxuICogICAgICkuYXMoJ2Zhdm9yaXRlX3BldCcpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0/LmlkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ucGV0X2lkXG4gKiByZXN1bHRbMF0/LmZhdm9yaXRlX3BldD8ubmFtZVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCAoXG4gKiAgIHNlbGVjdCBqc29uX29iamVjdChcbiAqICAgICAncGV0X2lkJywgXCJvYmpcIi5cInBldF9pZFwiLFxuICogICAgICduYW1lJywgXCJvYmpcIi5cIm5hbWVcIlxuICogICApIGZyb20gKFxuICogICAgIHNlbGVjdCBcInBldFwiLlwiaWRcIiBhcyBcInBldF9pZFwiLCBcInBldFwiLlwibmFtZVwiXG4gKiAgICAgZnJvbSBcInBldFwiXG4gKiAgICAgd2hlcmUgXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIlxuICogICAgIGFuZCBcInBldFwiLlwiaXNfZmF2b3JpdGVcIiA9ID9cbiAqICAgKSBhcyBvYmpcbiAqICkgYXMgXCJmYXZvcml0ZV9wZXRcIlxuICogZnJvbSBcInBlcnNvblwiO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uT2JqZWN0RnJvbShleHByKSB7XG4gICAgcmV0dXJuIHNxbCBgKHNlbGVjdCBqc29uX29iamVjdCgke3NxbC5qb2luKGdldFNxbGl0ZUpzb25PYmplY3RBcmdzKGV4cHIudG9PcGVyYXRpb25Ob2RlKCksICdvYmonKSl9KSBmcm9tICR7ZXhwcn0gYXMgb2JqKWA7XG59XG4vKipcbiAqIFRoZSBTUUxpdGUgYGpzb25fb2JqZWN0YCBmdW5jdGlvbi5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBvbmx5IHdvcmtzIGNvcnJlY3RseSBpZiB5b3UndmUgaW5zdGFsbGVkIHRoZSBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmAuXG4gKiBPdGhlcndpc2UgdGhlIG5lc3RlZCBzZWxlY3Rpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgSlNPTiBzdHJpbmdzLlxuICpcbiAqIFRoZSBwbHVnaW4gY2FuIGJlIGluc3RhbGxlZCBsaWtlIHRoaXM6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCAqIGFzIFNxbGl0ZSBmcm9tICdiZXR0ZXItc3FsaXRlMydcbiAqIGltcG9ydCB7IEt5c2VseSwgUGFyc2VKU09OUmVzdWx0c1BsdWdpbiwgU3FsaXRlRGlhbGVjdCB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGNvbnN0IGRiID0gbmV3IEt5c2VseTxEYXRhYmFzZT4oe1xuICogICBkaWFsZWN0OiBuZXcgU3FsaXRlRGlhbGVjdCh7XG4gKiAgICAgZGF0YWJhc2U6IG5ldyBTcWxpdGUoJzptZW1vcnk6JylcbiAqICAgfSksXG4gKiAgIHBsdWdpbnM6IFtuZXcgUGFyc2VKU09OUmVzdWx0c1BsdWdpbigpXVxuICogfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gKiBpbXBvcnQgeyBqc29uQnVpbGRPYmplY3QgfSBmcm9tICdreXNlbHkvaGVscGVycy9zcWxpdGUnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQnVpbGRPYmplY3Qoe1xuICogICAgICAgZmlyc3Q6IGViLnJlZignZmlyc3RfbmFtZScpLFxuICogICAgICAgbGFzdDogZWIucmVmKCdsYXN0X25hbWUnKSxcbiAqICAgICAgIGZ1bGw6IHNxbDxzdHJpbmc+YGZpcnN0X25hbWUgfHxcdTAwQTAnICcgfHwgbGFzdF9uYW1lYFxuICogICAgIH0pLmFzKCduYW1lJylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICpcbiAqIHJlc3VsdFswXT8uaWRcbiAqIHJlc3VsdFswXT8ubmFtZS5maXJzdFxuICogcmVzdWx0WzBdPy5uYW1lLmxhc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5mdWxsXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIGpzb25fb2JqZWN0KFxuICogICAnZmlyc3QnLCBmaXJzdF9uYW1lLFxuICogICAnbGFzdCcsIGxhc3RfbmFtZSxcbiAqICAgJ2Z1bGwnLCBcImZpcnN0X25hbWVcIiB8fCAnICcgfHwgXCJsYXN0X25hbWVcIlxuICogKSBhcyBcIm5hbWVcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25CdWlsZE9iamVjdChvYmopIHtcbiAgICByZXR1cm4gc3FsIGBqc29uX29iamVjdCgke3NxbC5qb2luKE9iamVjdC5rZXlzKG9iaikuZmxhdE1hcCgoaykgPT4gW3NxbC5saXQoayksIG9ialtrXV0pKX0pYDtcbn1cbmZ1bmN0aW9uIGdldFNxbGl0ZUpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGdldEpzb25PYmplY3RBcmdzKG5vZGUsIHRhYmxlKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NRTGl0ZSBqc29uQXJyYXlGcm9tIGFuZCBqc29uT2JqZWN0RnJvbSBmdW5jdGlvbnMgY2FuIG9ubHkgaGFuZGxlIGV4cGxpY2l0IHNlbGVjdGlvbnMgZHVlIHRvIGxpbWl0YXRpb25zIG9mIHRoZSBqc29uX29iamVjdCBmdW5jdGlvbi4gc2VsZWN0QWxsKCkgaXMgbm90IGFsbG93ZWQgaW4gdGhlIHN1YnF1ZXJ5LicpO1xuICAgIH1cbn1cbiIsICIvKipcbiAqIFNRTGl0ZSBpbnRyb3NwZWN0aW9uIHF1ZXJpZXMgdG8gYmUgdXNlZCBieSB0aGUgU1FMaXRlIGFkYXB0ZXIncyBpbnRyb3NwZWN0IG1ldGhvZC5cbiAqIEBtb2R1bGUgc3FsaXRlLWNvcmUvaW50cm9zcGVjdGlvblxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiBodHRwczovL3NxbGl0ZS5vcmcvcHJhZ21hLmh0bWxcbiAqIGh0dHBzOi8vc3FsaXRlLm9yZy9zY2hlbWF0YWIuaHRtbFxuICovXG5cbmltcG9ydCB7IGV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSBcImt5c2VseVwiO1xuaW1wb3J0IHsganNvbkFycmF5RnJvbSB9IGZyb20gXCJreXNlbHkvaGVscGVycy9zcWxpdGVcIjtcblxuaW1wb3J0IHsgdHlwZSBCdWlsZGVyUmVxdWlyZW1lbnRzLCBjb21waWxlLCB0eXBlIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBnZXRTUUxpdGVCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogdGhlIG1haW4gc3lzdGVtIHRhYmxlICovXG4gIHNxbGl0ZV9zY2hlbWE6IHtcbiAgICAvKiogb2JqZWN0IG5hbWUgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIHBhZ2UgbnVtYmVyIGluIHJvb3QgaW5kZXggd2hlbiBvYmplY3QgaXMgYSB0YWJsZS4gKi9cbiAgICByb290cGFnZTogbnVtYmVyO1xuICAgIC8qKiBzcWwgc3RhdGVtZW50IHRoYXQgY2FuIHJlY3JlYXRlIHRoZSBvYmplY3QuIG51bGwgd2hlbiBpbnRlcm5hbCBpbmRleCBvYmplY3QuICovXG4gICAgc3FsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKiByZWxhdGVkIHRhYmxlL3ZpZXcgbmFtZSB3aGVuIG9iamVjdCBpcyBhbiBpbmRleC90cmlnZ2VyLiAqL1xuICAgIHRibF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqIG9iamVjdCB0eXBlICovXG4gICAgdHlwZTogXCJpbmRleFwiIHwgXCJ0YWJsZVwiIHwgXCJ0cmlnZ2VyXCIgfCBcInZpZXdcIjtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgZWFjaCByb3cgcmV0dXJuZWQgYnkgYHByYWdtYV90YWJsZV9saXN0KHRhYmxlTmFtZT8pYC5cbiAqL1xuaW50ZXJmYWNlIFByYWdtYVRhYmxlTGlzdCB7XG4gIC8qKiBvYmplY3QgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBzY2hlbWEgbmFtZSAqL1xuICBzY2hlbWE6IFwibWFpblwiIHwgXCJ0ZW1wXCI7XG4gIC8qKiBvYmplY3QgdHlwZSAqL1xuICB0eXBlOiBcInNoYWRvd1wiIHwgXCJ0YWJsZVwiIHwgXCJ2aWV3XCIgfCBcInZpcnR1YWxcIjtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcGUgb2YgZWFjaCByb3cgcmV0dXJuZWQgYnkgYHByYWdtYV90YWJsZV94aW5mbyh0YWJsZU5hbWUpYC5cbiAqL1xuaW50ZXJmYWNlIFByYWdtYVRhYmxlWEluZm8ge1xuICAvKiogXCJyYW5rIHdpdGhpbiBjdXJyZW50IHJlc3VsdCBzZXRcIiAqL1xuICBjaWQ6IG51bWJlcjtcbiAgLyoqIGRlZmF1bHQgdmFsdWUgKi9cbiAgZGZsdF92YWx1ZTogdW5rbm93bjtcbiAgLyoqIDAgLSBub3JtYWwsIDEgLSBoaWRkZW4sIDItMyAtIGR5bmFtaWMvc3RvcmVkIGdlbmVyYXRlZCAqL1xuICBoaWRkZW46IDAgfCAxIHwgMiB8IDM7XG4gIC8qKiBjb2x1bW4gbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiB3aGV0aGVyIHRoZSBjb2x1bW4gY2FuIGJlIG51bGwgKi9cbiAgbm90bnVsbDogMCB8IDE7XG4gIC8qKiAwIGlmIG5vdCBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSwgb3RoZXJ3aXNlIHRoZSAxLWJhc2VkIG9yZGluYWwgbnVtYmVyIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHByaW1hcnkga2V5ICovXG4gIHBrOiBudW1iZXI7XG4gIC8qKiBkYXRhIHR5cGUgKi9cbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzaGFwZSBvZiBlYWNoIHJvdyByZXR1cm5lZCBieSBgcHJhZ21hX2ZvcmVpZ25fa2V5X2xpc3QodGFibGVOYW1lKWAuXG4gKi9cbmludGVyZmFjZSBQcmFnbWFGb3JlaWduS2V5TGlzdCB7XG4gIC8qKiBjb2x1bW4gbmFtZSAqL1xuICBmcm9tOiBzdHJpbmc7XG4gIC8qKiBvcmRpbmFsIG51bWJlciBvZiBjb2x1bW4gd2l0aGluIHRoZSBmb3JlaWduIGtleSAqL1xuICBzZXE6IG51bWJlcjtcbiAgLyoqIGZvcmVpZ24gdGFibGUgbmFtZSAqL1xuICB0YWJsZTogc3RyaW5nO1xuICAvKiogY29sdW1uIG5hbWUgaW4gdGhlIGZvcmVpZ24gdGFibGUgKi9cbiAgdG86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlc1F1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgZ2V0U1FMaXRlQnVpbGRlcjxEYXRhYmFzZT4ocmVxdWlyZW1lbnRzKVxuICAgICAgLnNlbGVjdEZyb20oZXhwcmVzc2lvbkJ1aWxkZXIoKS5mbjxQcmFnbWFUYWJsZUxpc3Q+KFwicHJhZ21hX3RhYmxlX2xpc3RcIiwgW10pLmFzKFwidGxcIikpXG4gICAgICAubGVmdEpvaW4oXCJzcWxpdGVfc2NoZW1hIGFzIHNzXCIsIChqYikgPT4gamIub25SZWYoXCJzcy50eXBlXCIsIFwiPVwiLCBcInRsLnR5cGVcIikub25SZWYoXCJzcy5uYW1lXCIsIFwiPVwiLCBcInRsLm5hbWVcIikpXG4gICAgICAud2hlcmUoXCJ0bC50eXBlXCIsIFwiaW5cIiwgW1widGFibGVcIiwgXCJ2aWV3XCJdKVxuICAgICAgLy8gZXhjbHVkZSB0ZW1wb3JhcnkgdGFibGVzL3ZpZXdzXG4gICAgICAud2hlcmUoXCJ0bC5zY2hlbWFcIiwgXCI9XCIsIFwibWFpblwiKVxuICAgICAgLy8gZXhjbHVkZSBzeXN0ZW0gdGFibGVzL3ZpZXdzXG4gICAgICAud2hlcmUoXCJ0bC5uYW1lXCIsIFwibm90IGxpa2VcIiwgXCJzcWxpdGVfJVwiKVxuICAgICAgLnNlbGVjdChbXCJ0bC5uYW1lXCIsIFwic3Muc3FsXCJdKVxuICAgICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgICAganNvbkFycmF5RnJvbShcbiAgICAgICAgICBlYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oZWIuZm48UHJhZ21hVGFibGVYSW5mbz4oXCJwcmFnbWFfdGFibGVfeGluZm9cIiwgW1widGwubmFtZVwiXSkuYXMoXCJ0eGlcIikpXG4gICAgICAgICAgICAubGVmdEpvaW4oXG4gICAgICAgICAgICAgIGViLmZuPFByYWdtYUZvcmVpZ25LZXlMaXN0PihcInByYWdtYV9mb3JlaWduX2tleV9saXN0XCIsIFtcInRsLm5hbWVcIl0pLmFzKFwiZmtsXCIpLFxuICAgICAgICAgICAgICBcImZrbC5mcm9tXCIsXG4gICAgICAgICAgICAgIFwidHhpLm5hbWVcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgaGlkZGVuIGNvbHVtbnNcbiAgICAgICAgICAgIC53aGVyZShcInR4aS5oaWRkZW5cIiwgXCIhPVwiLCAxKVxuICAgICAgICAgICAgLnNlbGVjdChbXG4gICAgICAgICAgICAgIFwidHhpLm5hbWVcIixcbiAgICAgICAgICAgICAgXCJ0eGkudHlwZSBhcyBkYXRhdHlwZVwiLFxuICAgICAgICAgICAgICBcImZrbC50YWJsZSBhcyBmb3JlaWduX2tleV90YWJsZVwiLFxuICAgICAgICAgICAgICBcImZrbC50byBhcyBmb3JlaWduX2tleV9jb2x1bW5cIixcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAgICAgICAgICBlYihcInR4aS5oaWRkZW5cIiwgXCJpblwiLCBbMiwgM10pLmFzKFwiY29tcHV0ZWRcIiksXG4gICAgICAgICAgICAgIGViKFwidHhpLm5vdG51bGxcIiwgXCIhPVwiLCAwKS5hcyhcIm51bGxhYmxlXCIpLFxuICAgICAgICAgICAgICBlYihcInR4aS5wa1wiLCBcIiE9XCIsIDApLmFzKFwicGtcIiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgKS5hcyhcImNvbHVtbnNcIiksXG4gICAgICBdKSxcbiAgICB7IHRyYW5zZm9ybWF0aW9uczogeyBjb2x1bW5zOiBcImpzb24tcGFyc2VcIiB9IH0sXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVGFibGVzUXVlcnkoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbmFtZTogXCJhbmltYWxzXCIsXG4gICAgICBzcWw6IFwiQ1JFQVRFIFRBQkxFIGFuaW1hbHMgKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIG5hbWUgVEVYVCk7XCIsXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlkXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwiSU5URUdFUlwiLFxuICAgICAgICAgIHBrOiAxLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAwLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlRFWFRcIixcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogXCJ1c2Vyc1wiLFxuICAgICAgc3FsOiBcIkNSRUFURSBUQUJMRSB1c2VycyAoaWQgVVVJRCBQUklNQVJZIEtFWSwgY3JlYXRlZF9hdCBUSU1FU1RBTVAsIGRlbGV0ZWRfYXQgVElNRVNUQU1QLCByb2xlIHZhcmNoYXIsIG5hbWUgdmFyY2hhciwgbmFtZV9yb2xlIHRleHQpO1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlVVSURcIixcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNyZWF0ZWRfYXRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJUSU1FU1RBTVBcIixcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImRlbGV0ZWRfYXRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJUSU1FU1RBTVBcIixcbiAgICAgICAgICBwazogMCxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMSxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInJvbGVcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJ2YXJjaGFyXCIsXG4gICAgICAgICAgcGs6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJuYW1lXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidmFyY2hhclwiLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZV9yb2xlXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHBrOiAwLFxuICAgICAgICAgIGNvbXB1dGVkOiAwLFxuICAgICAgICAgIG51bGxhYmxlOiAxLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiBcImNvbXBvc2l0ZV9wa1wiLFxuICAgICAgc3FsOiBcIkNSRUFURSBUQUJMRSBjb21wb3NpdGVfcGsgKGlkIFVVSUQsIG5hbWUgVEVYVCwgY3JlYXRlZF9hdCB0aW1lc3RhbXAsIFBSSU1BUlkgS0VZIChpZCwgbmFtZSkpO1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcIlVVSURcIixcbiAgICAgICAgICBwazogMSxcbiAgICAgICAgICBjb21wdXRlZDogMCxcbiAgICAgICAgICBudWxsYWJsZTogMCxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm5hbWVcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJURVhUXCIsXG4gICAgICAgICAgcGs6IDEsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wXCIsXG4gICAgICAgICAgcGs6IDAsXG4gICAgICAgICAgY29tcHV0ZWQ6IDAsXG4gICAgICAgICAgbnVsbGFibGU6IDEsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdIGFzIGNvbnN0IHNhdGlzZmllcyBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+O1xufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQWRhcHRlcixcbiAgdHlwZSBBZGFwdGVyRGVsZXRlUmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJFcnJvcixcbiAgdHlwZSBBZGFwdGVySW5zZXJ0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0LFxuICB0eXBlIEFkYXB0ZXJRdWVyeVJlc3VsdCxcbiAgdHlwZSBBZGFwdGVyUmVxdWlyZW1lbnRzLFxuICB0eXBlIEFkYXB0ZXJVcGRhdGVSZXN1bHQsXG4gIGNyZWF0ZUFkYXB0ZXJFcnJvcixcbiAgdHlwZSBGaWx0ZXJPcGVyYXRvcixcbiAgdHlwZSBUYWJsZSxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgUXVlcnksIFF1ZXJ5UmVzdWx0IH0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVpdGhlciB9IGZyb20gXCIuLi90eXBlLXV0aWxzXCI7XG5pbXBvcnQgeyBkZXRlcm1pbmVDb2x1bW5BZmZpbml0eSwgU1FMSVRFX0FGRklOSVRZX1RPX01FVEFEQVRBIH0gZnJvbSBcIi4vZGF0YXR5cGVcIjtcbmltcG9ydCB7IGdldERlbGV0ZVF1ZXJ5LCBnZXRJbnNlcnRRdWVyeSwgZ2V0U2VsZWN0UXVlcnksIGdldFVwZGF0ZVF1ZXJ5IH0gZnJvbSBcIi4vZG1sXCI7XG5pbXBvcnQgeyBnZXRUYWJsZXNRdWVyeSwgbW9ja1RhYmxlc1F1ZXJ5IH0gZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuXG5leHBvcnQgdHlwZSBTUUxJdGVBZGFwdGVyUmVxdWlyZW1lbnRzID0gQWRhcHRlclJlcXVpcmVtZW50cztcblxuY29uc3Qgc2NoZW1hID0gXCJtYWluXCI7XG5cbmNvbnN0IGZpbHRlck9wZXJhdG9ycyA9IFtcbiAgXCI9XCIsXG4gIFwiIT1cIixcbiAgXCI+XCIsXG4gIFwiPj1cIixcbiAgXCI8XCIsXG4gIFwiPD1cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuXSBzYXRpc2ZpZXMgRmlsdGVyT3BlcmF0b3JbXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNRTGl0ZUFkYXB0ZXIocmVxdWlyZW1lbnRzOiBTUUxJdGVBZGFwdGVyUmVxdWlyZW1lbnRzKTogQWRhcHRlciB7XG4gIGNvbnN0IHsgZXhlY3V0b3IsIC4uLm90aGVyUmVxdWlyZW1lbnRzIH0gPSByZXF1aXJlbWVudHM7XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0U2NoZW1hOiBzY2hlbWEsXG5cbiAgICBhc3luYyBkZWxldGUoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckRlbGV0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0RGVsZXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIC8vIFRPRE86IHVzZSByZXN1bHRzIHRvby5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHsgLi4uZGV0YWlscywgcXVlcnkgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBpbnNlcnQoZGV0YWlscywgb3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEFkYXB0ZXJFcnJvciwgQWRhcHRlckluc2VydFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0SW5zZXJ0UXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgcm93c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3IsIHF1ZXJ5IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3MsIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgaW50cm9zcGVjdChvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVySW50cm9zcGVjdFJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhYmxlc1F1ZXJ5ID0gZ2V0VGFibGVzUXVlcnkocmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbdGFibGVzRXJyb3IsIHRhYmxlc10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHRhYmxlc1F1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodGFibGVzRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IHRhYmxlc0Vycm9yLCBxdWVyeTogdGFibGVzUXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeTogdGFibGVzUXVlcnksIHRhYmxlcyB9KV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWRhcHRlckVycm9yKHsgZXJyb3I6IGVycm9yIGFzIEVycm9yIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBxdWVyeShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyUXVlcnlSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldFNlbGVjdFF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcblxuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyBmaWx0ZXJlZFJvd0NvdW50OiByZXN1bHRzWzBdPy5fX3BzX2NvdW50X18gfHwgXCIwXCIsIHJvd3M6IHJlc3VsdHMsIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHByb3Blcmx5XG4gICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvcjogZXJyb3IgYXMgRXJyb3IgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHVwZGF0ZShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8QWRhcHRlckVycm9yLCBBZGFwdGVyVXBkYXRlUmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRVcGRhdGVRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVBZGFwdGVyRXJyb3IoeyBlcnJvciwgcXVlcnkgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAvLyBUT0RPOiBjdXN0b20gZXJyb3I/XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBuZXcgRXJyb3IoXCJVcGRhdGUgZmFpbGVkXCIpLCBxdWVyeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyByb3csIHF1ZXJ5IH1dO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFkYXB0ZXJFcnJvcih7IGVycm9yOiBlcnJvciBhcyBFcnJvciB9KTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVJbnRyb3NwZWN0aW9uKGFyZ3M6IHtcbiAgdGFibGVzOiBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+O1xuICBxdWVyeTogUXVlcnk7XG59KTogQWRhcHRlckludHJvc3BlY3RSZXN1bHQge1xuICBjb25zdCB7IHRhYmxlcywgcXVlcnk6IHRhYmxlc1F1ZXJ5IH0gPSBhcmdzO1xuXG4gIHJldHVybiB7XG4gICAgZmlsdGVyT3BlcmF0b3JzLFxuICAgIHF1ZXJ5OiB0YWJsZXNRdWVyeSxcbiAgICBzY2hlbWFzOiB0YWJsZXMucmVkdWNlKFxuICAgICAgKHNjaGVtYXMsIHRhYmxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29sdW1ucywgbmFtZTogdGFibGVOYW1lLCBzcWw6IF9zcWwgfSA9IHRhYmxlO1xuXG4gICAgICAgIC8vIFRPRE86IHVzZSBgc3FsYCB0byBnZXQgZWFjaCBjb2x1bW4ncyBkZWZpbml0aW9uLlxuICAgICAgICAvLyB3ZSBjYW4gdXNlIGl0IHRvIGZpbmQgZW51bXMgb3IgYXV0byBpbmNyZW1lbnQgd2hlbiBub3QgaW50ZWdlciBwcmltYXJ5IGtleS5cblxuICAgICAgICBjb25zdCBjb2x1bW5zUmVjb3JkID0gY29sdW1ucy5yZWR1Y2UoXG4gICAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBkYXRhdHlwZSwgZm9yZWlnbl9rZXlfY29sdW1uLCBuYW1lOiBjb2x1bW5OYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgICAgIGNvbnN0IGFmZmluaXR5ID0gZGV0ZXJtaW5lQ29sdW1uQWZmaW5pdHkoZGF0YXR5cGUpO1xuXG4gICAgICAgICAgICBjb2x1bW5zW2NvbHVtbk5hbWVdID0ge1xuICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHdvcnRoIGV4cGxvcmluZyBzdGlsbCB2aWJpbmcgd2l0aCB0aGUgZGVjbGFyZWQgZGF0YSB0eXBlIGZvciBzdHVmZiBsaWtlIGRhdGVzIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAgICAgICAgLi4uU1FMSVRFX0FGRklOSVRZX1RPX01FVEFEQVRBW2FmZmluaXR5XSxcbiAgICAgICAgICAgICAgICBhZmZpbml0eSxcbiAgICAgICAgICAgICAgICBpc0FycmF5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc05hdGl2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBuYW1lOiBkYXRhdHlwZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZrQ29sdW1uOiBmb3JlaWduX2tleV9jb2x1bW4sXG4gICAgICAgICAgICAgIGZrU2NoZW1hOiBmb3JlaWduX2tleV9jb2x1bW4gPyBzY2hlbWEgOiBudWxsLFxuICAgICAgICAgICAgICBma1RhYmxlOiBjb2x1bW4uZm9yZWlnbl9rZXlfdGFibGUsXG4gICAgICAgICAgICAgIGlzQ29tcHV0ZWQ6IEJvb2xlYW4oY29sdW1uLmNvbXB1dGVkKSxcbiAgICAgICAgICAgICAgaXNJblByaW1hcnlLZXk6IEJvb2xlYW4oY29sdW1uLnBrKSxcbiAgICAgICAgICAgICAgbmFtZTogY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IEJvb2xlYW4oY29sdW1uLm51bGxhYmxlKSxcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICAgICk7XG5cbiAgICAgICAgc2NoZW1hcy5tYWluIS50YWJsZXNbdGFibGVOYW1lXSA9IHtcbiAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zUmVjb3JkLFxuICAgICAgICAgIG5hbWU6IHRhYmxlTmFtZSxcbiAgICAgICAgICBzY2hlbWE6IFwibWFpblwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBzY2hlbWFzO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWFpbjogeyB0YWJsZXM6IHt9LCBuYW1lOiBcIm1haW5cIiB9LFxuICAgICAgfSBzYXRpc2ZpZXMgQWRhcHRlckludHJvc3BlY3RSZXN1bHRbXCJzY2hlbWFzXCJdIGFzIEFkYXB0ZXJJbnRyb3NwZWN0UmVzdWx0W1wic2NoZW1hc1wiXSxcbiAgICApLFxuICAgIHRpbWV6b25lOiBcIlVUQ1wiLFxuICB9O1xufVxuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja0ludHJvc3BlY3QoKSB7XG4gIGNvbnN0IHF1ZXJ5ID0geyBwYXJhbWV0ZXJzOiBbXSwgc3FsOiBcIjxtb2NrZWQ+XCIgfSBhcyBRdWVyeTtcbiAgY29uc3QgdGFibGVzID0gbW9ja1RhYmxlc1F1ZXJ5KCk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24oeyBxdWVyeSwgdGFibGVzIH0pIGFzIHtcbiAgICAvLyBiZXN0IGVmZm9ydCwgbm8gbmVlZCBnbyBvdmVyYm9hcmQuXG4gICAgc2NoZW1hczoge1xuICAgICAgbWFpbjoge1xuICAgICAgICBuYW1lOiBcIm1haW5cIjtcbiAgICAgICAgdGFibGVzOiB7XG4gICAgICAgICAgW1QgaW4gKHR5cGVvZiB0YWJsZXMpW251bWJlcl1bXCJuYW1lXCJdXTogVGFibGU7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH07XG4gICAgdGltZXpvbmU6IHN0cmluZztcbiAgICBmaWx0ZXJPcGVyYXRvcnM6IEZpbHRlck9wZXJhdG9yW107XG4gICAgcXVlcnk6IFF1ZXJ5O1xuICB9IHNhdGlzZmllcyBBZGFwdGVySW50cm9zcGVjdFJlc3VsdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJ1YkFBQSxJQUFBQSxHQUFBLEdBQUFDLEdBQUFELEdBQUEsNkJBQUFFLEdBQUEsNkJBQUFDLEtBQUEsZUFBQUMsR0FBQUosSUM0VU8sU0FBU0ssR0FBbUJDLEVBQWdELENBQ2pGLEdBQU0sQ0FBRSxNQUFBQyxFQUFPLE1BQUFDLENBQU0sRUFBSUYsRUFFbkJHLEVBQWVGLEVBRXJCLE9BQUFFLEVB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RUFFdkNJLEVBQVlMLEVBQVMsUUFBUUcsQ0FBRyxFQUV0QyxHQUFJLENBQ0YsSUFBTUcsRUFBT0QsRUFBVSxJQUFJLEdBQUlILENBQThCLEVBRTdELEdBQUksQ0FBQ0UsR0FBbUIsT0FBTyxLQUFLQSxDQUFlLEVBQUUsU0FBVyxFQUM5RCxPQUFPLFFBQVEsUUFBUSxDQUFDLEtBQU1FLENBQUksQ0FBQyxFQUdyQyxRQUFXQyxLQUFPRCxFQUNoQixRQUFXRSxLQUFVSixFQUFpQixDQUNwQyxJQUFNSyxFQUFpQkwsRUFBZ0JJLENBQU0sRUFDdkNFLEVBQVFILEVBQUlDLENBQU0sRUFFeEIsR0FBSUMsSUFBbUIsYUFBYyxDQUNuQyxHQUFJLE9BQU9DLEdBQVUsU0FDbkIsR0FBSSxDQUNGSCxFQUFJQyxDQUFNLEVBQUksS0FBSyxNQUFNRSxDQUFLLENBQ2hDLE9BQVNDLEVBQU8sQ0FDZCxRQUFRLE1BQU0sZ0NBQWdDSCxDQUFNLGlCQUFpQkUsQ0FBSyxHQUFJQyxDQUFLLENBQ3JGLENBR0YsUUFDRixDQUdGLENBR0YsT0FBTyxRQUFRLFFBQVEsQ0FBQyxLQUFNTCxDQUFJLENBQUMsQ0FDckMsT0FBU0ssRUFBZ0IsQ0FDdkIsT0FBTyxRQUFRLFFBQVEsQ0FBQ0EsQ0FBYyxDQUFDLENBQ3pDLENBQ0YsQ0FDRixDQUNGLENBRU8sU0FBU0MsR0FBd0JaLEVBQWlDLENBQ3ZFLE9BQU9hLEdBQW9CLENBQ3pCLFNBQVVkLEdBQXlCQyxDQUFRLENBQzdDLENBQUMsQ0FDSCIsCiAgIm5hbWVzIjogWyJub2RlX3NxbGl0ZV9leHBvcnRzIiwgIl9fZXhwb3J0IiwgImNyZWF0ZU5vZGVTUUxpdGVBZGFwdGVyIiwgImNyZWF0ZU5vZGVTUUxpdGVFeGVjdXRvciIsICJfX3RvQ29tbW9uSlMiLCAiY3JlYXRlQWRhcHRlckVycm9yIiwgImFyZ3MiLCAiZXJyb3IiLCAicXVlcnkiLCAiYWRhcHRlckVycm9yIiwgIlNRTElURV9BRkZJTklUWV9UT19NRVRBREFUQSIsICJkZXRlcm1pbmVDb2x1bW5BZmZpbml0eSIsICJkZWNsYXJlZERhdGFUeXBlIiwgInVwcGVyVHlwZSIsICJpc1VuZGVmaW5lZCIsICJvYmoiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJpc0RhdGUiLCAiaXNCaWdJbnQiLCAiaXNGdW5jdGlvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiZnJlZXplIiwgIm9iaiIsICJhc0FycmF5IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXNSZWFkb25seUFycmF5IiwgImFyZyIsICJub29wIiwgIm9iaiIsICJBbHRlclRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJwcm9wcyIsICJjb2x1bW5BbHRlcmF0aW9uIiwgIklkZW50aWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiY29sdW1ucyIsICJDcmVhdGVTY2hlbWFOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNjaGVtYSIsICJwYXJhbXMiLCAiSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlU2NoZW1hIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJjcmVhdGVUYWJsZSIsICJjb2x1bW4iLCAiY29uc3RyYWludCIsICJtb2RpZmllciIsICJwYXJhbXMiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaWRlbnRpZmllciIsICJJZGVudGlmaWVyTm9kZSIsICJzY2hlbWEiLCAiRHJvcEluZGV4Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgInBhcmFtcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJkcm9wSW5kZXgiLCAicHJvcHMiLCAiRHJvcFNjaGVtYU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2NoZW1hIiwgInBhcmFtcyIsICJJZGVudGlmaWVyTm9kZSIsICJkcm9wU2NoZW1hIiwgIkRyb3BUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAicGFyYW1zIiwgImRyb3BJbmRleCIsICJBbGlhc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWxpYXMiLCAiVGFibGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgInNjaGVtYSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAib2JqIiwgImlzT2JqZWN0IiwgImlzRnVuY3Rpb24iLCAiaXNFeHByZXNzaW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJTZWxlY3RNb2RpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibW9kaWZpZXIiLCAib2YiLCAiQW5kTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgIk9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgIk9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmaWx0ZXIiLCAib25Ob2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhdGlvbiIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJKb2luTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJqb2luVHlwZSIsICJ0YWJsZSIsICJvbiIsICJPbk5vZGUiLCAiam9pbk5vZGUiLCAib3BlcmF0aW9uIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdE9wZXJhbmQiLCAib3BlcmF0b3IiLCAicmlnaHRPcGVyYW5kIiwgIkNPTVBBUklTT05fT1BFUkFUT1JTIiwgIkFSSVRITUVUSUNfT1BFUkFUT1JTIiwgIkpTT05fT1BFUkFUT1JTIiwgIkJJTkFSWV9PUEVSQVRPUlMiLCAiVU5BUllfRklMVEVSX09QRVJBVE9SUyIsICJVTkFSWV9PUEVSQVRPUlMiLCAiT1BFUkFUT1JTIiwgIk9wZXJhdG9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJpc0pTT05PcGVyYXRvciIsICJvcCIsICJpc1N0cmluZyIsICJKU09OX09QRVJBVE9SUyIsICJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJJZGVudGlmaWVyTm9kZSIsICJTZWxlY3RBbGxOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIlJlZmVyZW5jZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgInRhYmxlIiwgIlNlbGVjdEFsbE5vZGUiLCAiRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAiI2R5bmFtaWNSZWZlcmVuY2UiLCAicmVmZXJlbmNlIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNTdHJpbmciLCAiT3JkZXJCeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9yZGVyQnkiLCAiZGlyZWN0aW9uIiwgInByb3BzIiwgIlJhd05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic3FsRnJhZ21lbnRzIiwgInBhcmFtZXRlcnMiLCAic3FsIiwgImNoaWxkIiwgImNoaWxkcmVuIiwgIkNvbGxhdGVOb2RlIiwgIm5vZGUiLCAiY29sbGF0aW9uIiwgImZyZWV6ZSIsICJJZGVudGlmaWVyTm9kZSIsICJPcmRlckJ5SXRlbUJ1aWxkZXIiLCAiX09yZGVyQnlJdGVtQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJSYXdOb2RlIiwgImNvbGxhdGlvbiIsICJDb2xsYXRlTm9kZSIsICJMT0dHRURfTUVTU0FHRVMiLCAibG9nT25jZSIsICJtZXNzYWdlIiwgImlzT3JkZXJCeURpcmVjdGlvbiIsICJ0aGluZyIsICJwYXJzZU9yZGVyQnkiLCAiYXJncyIsICJwYXJzZU9yZGVyQnlJdGVtIiwgIm9yZGVyQnkiLCAibG9nT25jZSIsICJpdGVtIiwgImV4cHIiLCAibW9kaWZpZXJzIiwgInBhcnNlZFJlZiIsICJwYXJzZU9yZGVyQnlFeHByZXNzaW9uIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAiaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJyZWYiLCAiZGlyZWN0aW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlJhd05vZGUiLCAiaXNFeHByZXNzaW9uIiwgIm5vZGUiLCAiT3JkZXJCeUl0ZW1CdWlsZGVyIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInJlZmVyZW5jZSIsICJ0cmF2ZXJzYWwiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9wZXJhdG9yIiwgInZhbHVlIiwgIkpTT05QYXRoTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbk9wZXJhdG9yIiwgImpzb25QYXRoTm9kZSIsICJwYXRoTGVnIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNTdHJpbmciLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAicGFyc2VKU09OUmVmZXJlbmNlIiwgInJlZiIsICJvcCIsICJyZWZlcmVuY2VOb2RlIiwgImlzSlNPTk9wZXJhdG9yIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJPcGVyYXRvck5vZGUiLCAib3BXaXRob3V0TGFzdENoYXIiLCAiSlNPTlBhdGhOb2RlIiwgIkNPTFVNTl9TRVBBUkFUT1IiLCAiUmVmZXJlbmNlTm9kZSIsICJDb2x1bW5Ob2RlIiwgInBhcnRzIiwgInRyaW0iLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEiLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgIkFMSUFTX1NFUEFSQVRPUiIsICJjb2x1bW5SZWYiLCAiYWxpYXMiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInBhcnNlQ29sdW1uTmFtZSIsICJjb2x1bW4iLCAicGFyc2VPcmRlcmVkQ29sdW1uTmFtZSIsICJPUkRFUl9TRVBBUkFUT1IiLCAiY29sdW1uTmFtZSIsICJvcmRlciIsICJpc09yZGVyQnlEaXJlY3Rpb24iLCAicGFyc2VPcmRlckJ5IiwgInNjaGVtYSIsICJ0YWJsZSIsICJUYWJsZU5vZGUiLCAic3RyIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIlZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIlZhbHVlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uTGlzdCIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgInBhcnNlRXhwcmVzc2lvbiIsICJWYWx1ZU5vZGUiLCAiaXNTYWZlSW1tZWRpYXRlVmFsdWUiLCAidmFsdWUiLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiUGFyZW5zTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImFyZ3MiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJsZWZ0IiwgIm9wZXJhdG9yIiwgInJpZ2h0IiwgImlzSXNPcGVyYXRvciIsICJuZWVkc0lzT3BlcmF0b3IiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VPcGVyYXRvciIsICJWYWx1ZU5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZUZpbHRlck9iamVjdCIsICJvYmoiLCAiY29tYmluYXRvciIsICJwYXJzZUZpbHRlckxpc3QiLCAidiIsICJpc1VuZGVmaW5lZCIsICJrIiwgImxpc3QiLCAid2l0aFBhcmVucyIsICJjb21iaW5lIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIk9wZXJhdG9yTm9kZSIsICJub2RlIiwgInRvT3BlcmF0aW9uTm9kZSIsICJpIiwgIlBhcmVuc05vZGUiLCAidmFsdWUiLCAiaXNOdWxsIiwgImlzQm9vbGVhbiIsICJpc1N0cmluZyIsICJPUEVSQVRPUlMiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIm5vZGVPclNvdXJjZSIsICJPcmRlckJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJvcmRlckJ5IiwgIlBhcnRpdGlvbkJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJwYXJ0aXRpb25CeSIsICJPdmVyTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvdmVyTm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJQYXJ0aXRpb25CeU5vZGUiLCAiRnJvbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnJvbXMiLCAiZnJvbSIsICJHcm91cEJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJncm91cEJ5IiwgIkhhdmluZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgImhhdmluZ05vZGUiLCAib3BlcmF0b3IiLCAib3BlcmF0aW9uIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbnRvIiwgIndpdGhOb2RlIiwgInJlcGxhY2UiLCAiaW5zZXJ0UXVlcnkiLCAicHJvcHMiLCAiTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAiVXBkYXRlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlcyIsICJ3aXRoTm9kZSIsICJMaXN0Tm9kZSIsICJ1cGRhdGVRdWVyeSIsICJmcm9tSXRlbXMiLCAiRnJvbU5vZGUiLCAidXBkYXRlcyIsICJsaW1pdCIsICJVc2luZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVzIiwgInVzaW5nIiwgIkRlbGV0ZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmcm9tSXRlbXMiLCAid2l0aE5vZGUiLCAiRnJvbU5vZGUiLCAiaXRlbXMiLCAiUXVlcnlOb2RlIiwgImRlbGV0ZU5vZGUiLCAibGltaXQiLCAidGFibGVzIiwgIlVzaW5nTm9kZSIsICJXaGVyZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgIndoZXJlTm9kZSIsICJvcGVyYXRvciIsICJvcGVyYXRpb24iLCAiQW5kTm9kZSIsICJPck5vZGUiLCAiUmV0dXJuaW5nTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzZWxlY3Rpb25zIiwgInJldHVybmluZyIsICJFeHBsYWluTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJXaGVuTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb25kaXRpb24iLCAid2hlbk5vZGUiLCAicmVzdWx0IiwgIk1lcmdlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImludG8iLCAid2l0aE5vZGUiLCAibWVyZ2VOb2RlIiwgInVzaW5nIiwgIndoZW4iLCAidGhlbiIsICJXaGVuTm9kZSIsICJPdXRwdXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNlbGVjdGlvbnMiLCAib3V0cHV0IiwgIlF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJEZWxldGVRdWVyeU5vZGUiLCAiTWVyZ2VRdWVyeU5vZGUiLCAibW9kaWZpZXIiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJqb2luIiwgInNlbGVjdGlvbnMiLCAiUmV0dXJuaW5nTm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJFeHBsYWluTm9kZSIsICJ0b3AiLCAiT3V0cHV0Tm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAid2l0aE5vZGUiLCAiZnJvbUl0ZW1zIiwgIkZyb21Ob2RlIiwgInNlbGVjdCIsICJzZWxlY3Rpb25zIiwgImV4cHJlc3Npb25zIiwgIm1vZGlmaWVyIiwgIml0ZW1zIiwgIlF1ZXJ5Tm9kZSIsICJzZWxlY3ROb2RlIiwgIkdyb3VwQnlOb2RlIiwgImxpbWl0IiwgIm9mZnNldCIsICJmZXRjaCIsICJvcGVyYXRpb24iLCAiSGF2aW5nTm9kZSIsICJzZXRPcGVyYXRpb25zIiwgIkpvaW5CdWlsZGVyIiwgIl9Kb2luQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiSm9pbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiUmF3Tm9kZSIsICJmdW5jIiwgIlBhcnRpdGlvbkJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJwYXJ0aXRpb25CeSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiUGFydGl0aW9uQnlJdGVtTm9kZSIsICJPdmVyQnVpbGRlciIsICJfT3ZlckJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIk92ZXJOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJRdWVyeU5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJmdW5jIiwgIlNlbGVjdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2VsZWN0aW9uIiwgIlNlbGVjdEFsbE5vZGUiLCAidGFibGUiLCAiUmVmZXJlbmNlTm9kZSIsICJwYXJzZVNlbGVjdEFyZyIsICJzZWxlY3Rpb24iLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VTZWxlY3RFeHByZXNzaW9uIiwgImlzU3RyaW5nIiwgIlNlbGVjdGlvbk5vZGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgImlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAicGFyc2VBbGlhc2VkRXhwcmVzc2lvbiIsICJwYXJzZVNlbGVjdEFsbCIsICJ0YWJsZSIsICJwYXJzZVNlbGVjdEFsbEFyZyIsICJwYXJzZVRhYmxlIiwgIlZhbHVlc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIkRlZmF1bHRJbnNlcnRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgImFyZyIsICJvYmplY3RPckxpc3QiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJsaXN0IiwgImlzUmVhZG9ubHlBcnJheSIsICJmcmVlemUiLCAicGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzIiwgInJvd3MiLCAiY29sdW1ucyIsICJwYXJzZUNvbHVtbk5hbWVzQW5kSW5kZXhlcyIsICJDb2x1bW5Ob2RlIiwgIlZhbHVlc05vZGUiLCAicm93IiwgInBhcnNlUm93VmFsdWVzIiwgImNvbHMiLCAiY29sIiwgInJvd0NvbHVtbnMiLCAicm93VmFsdWVzIiwgImhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMiLCAiaW5kZXhlZFJvd0NvbHVtbnMiLCAiY29sdW1uSWR4IiwgImlzVW5kZWZpbmVkIiwgInZhbHVlIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJkZWZhdWx0VmFsdWUiLCAiRGVmYXVsdEluc2VydFZhbHVlTm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiQ29sdW1uVXBkYXRlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAidmFsdWUiLCAicGFyc2VVcGRhdGUiLCAiYXJncyIsICJDb2x1bW5VcGRhdGVOb2RlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAidXBkYXRlIiwgInVwZGF0ZU9iaiIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgIl8iLCAidmFsdWUiLCAia2V5IiwgIkNvbHVtbk5vZGUiLCAiT25EdXBsaWNhdGVLZXlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInVwZGF0ZXMiLCAiSW5zZXJ0UmVzdWx0IiwgImluc2VydElkIiwgIm51bUluc2VydGVkT3JVcGRhdGVkUm93cyIsICJOb1Jlc3VsdEVycm9yIiwgIm5vZGUiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiZm4iLCAiT25Db25mbGljdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicHJvcHMiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJPbkNvbmZsaWN0QnVpbGRlciIsICJfT25Db25mbGljdEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJjb2x1bW4iLCAiY29sdW1uTm9kZSIsICJDb2x1bW5Ob2RlIiwgIk9uQ29uZmxpY3ROb2RlIiwgImNvbHVtbnMiLCAiY29sdW1uTm9kZXMiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZXhwcmVzc2lvbiIsICJhcmdzIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIk9uQ29uZmxpY3REb05vdGhpbmdCdWlsZGVyIiwgInVwZGF0ZSIsICJPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAiZnVuYyIsICJfT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIiLCAiVG9wTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJpc051bWJlciIsICJpc0JpZ0ludCIsICJpc1VuZGVmaW5lZCIsICJpc1RvcE1vZGlmaWVycyIsICJUb3BOb2RlIiwgIk9yQWN0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJhY3Rpb24iLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIl9JbnNlcnRRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJpbnNlcnQiLCAiY29sdW1ucyIsICJ2YWx1ZXMiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJDb2x1bW5Ob2RlIiwgImV4cHJlc3Npb24iLCAicGFyc2VFeHByZXNzaW9uIiwgIm1vZGlmaWVyIiwgIlF1ZXJ5Tm9kZSIsICJPckFjdGlvbk5vZGUiLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgImNhbGxiYWNrIiwgIk9uQ29uZmxpY3RCdWlsZGVyIiwgIk9uQ29uZmxpY3ROb2RlIiwgInVwZGF0ZSIsICJPbkR1cGxpY2F0ZUtleU5vZGUiLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgInNlbGVjdGlvbiIsICJwYXJzZVNlbGVjdEFyZyIsICJwYXJzZVNlbGVjdEFsbCIsICJhcmdzIiwgInRhYmxlIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIkluc2VydFJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgIkRlbGV0ZVJlc3VsdCIsICJudW1EZWxldGVkUm93cyIsICJMaW1pdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGltaXQiLCAiRGVsZXRlUXVlcnlCdWlsZGVyIiwgIl9EZWxldGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJ0YWJsZXMiLCAiRGVsZXRlUXVlcnlOb2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgIiNqb2luIiwgImpvaW5UeXBlIiwgInBhcnNlSm9pbiIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJtb2RpZmllciIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiYWRhcHRlciIsICJxdWVyeSIsICJEZWxldGVSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJVcGRhdGVSZXN1bHQiLCAibnVtVXBkYXRlZFJvd3MiLCAibnVtQ2hhbmdlZFJvd3MiLCAiVXBkYXRlUXVlcnlCdWlsZGVyIiwgIl9VcGRhdGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJmcm9tIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJjb25kaXRpb24iLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiVXBkYXRlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVOYW1lIiwgImNvbHVtbk5hbWVzIiwgIlRhYmxlTm9kZSIsICJDb2x1bW5Ob2RlIiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJleHByZXNzaW9uIiwgInByb3BzIiwgIkNURUJ1aWxkZXIiLCAiX0NURUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgInBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uIiwgIm5hbWVPckJ1aWxkZXJDYWxsYmFjayIsICJleHByZXNzaW9uIiwgImV4cHJlc3Npb25Ob2RlIiwgImNyZWF0ZVF1ZXJ5Q3JlYXRvciIsICJpc0Z1bmN0aW9uIiwgImN0ZUJ1aWxkZXJGYWN0b3J5IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAicGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lIiwgIm5hbWUiLCAiQ1RFQnVpbGRlciIsICJwYXJ0cyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgIml0IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIiwgIldpdGhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImV4cHJlc3Npb24iLCAicGFyYW1zIiwgIndpdGhOb2RlIiwgIkNIQVJTIiwgInJhbmRvbVN0cmluZyIsICJsZW5ndGgiLCAiY2hhcnMiLCAiaSIsICJyYW5kb21DaGFyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiTGF6eVF1ZXJ5SWQiLCAiI3F1ZXJ5SWQiLCAicmFuZG9tU3RyaW5nIiwgIk9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciIsICIjdHJhbnNmb3JtZXJzIiwgImZyZWV6ZSIsICJub2RlIiwgInF1ZXJ5SWQiLCAib3V0IiwgImxpc3QiLCAiX3F1ZXJ5SWQiLCAiUk9PVF9PUEVSQVRJT05fTk9ERVMiLCAiZnJlZXplIiwgIlNDSEVNQUxFU1NfRlVOQ1RJT05TIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAiI3NjaGVtYSIsICIjc2NoZW1hYmxlSWRzIiwgIiNjdGVzIiwgInNjaGVtYSIsICJub2RlIiwgInF1ZXJ5SWQiLCAiI2lzUm9vdE9wZXJhdGlvbk5vZGUiLCAiY3RlcyIsICIjY29sbGVjdENURXMiLCAiY3RlIiwgInRhYmxlcyIsICIjY29sbGVjdFNjaGVtYWJsZUlkcyIsICJ0YWJsZSIsICJ0cmFuc2Zvcm1lZCIsICJJZGVudGlmaWVyTm9kZSIsICJUYWJsZU5vZGUiLCAiI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzIiwgImFyZ3NLZXkiLCAiYXJnIiwgInNjaGVtYWJsZUlkcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICIjY29sbGVjdFNjaGVtYWJsZUlkIiwgImZyb20iLCAiI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByIiwgImpvaW4iLCAiSm9pbk5vZGUiLCAiI2NvbGxlY3RDVEVJZHMiLCAiQWxpYXNOb2RlIiwgIkxpc3ROb2RlIiwgImlkIiwgImV4cHIiLCAiY3RlSWQiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAic2NoZW1hIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJhcmdzIiwgIk1hdGNoZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5vdCIsICJieVNvdXJjZSIsICJwYXJzZU1lcmdlV2hlbiIsICJ0eXBlIiwgImFyZ3MiLCAicmVmUmlnaHQiLCAiV2hlbk5vZGUiLCAicGFyc2VGaWx0ZXJMaXN0IiwgIk1hdGNoZWROb2RlIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJwYXJzZU1lcmdlVGhlbiIsICJyZXN1bHQiLCAiaXNTdHJpbmciLCAiUmF3Tm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiRGVmZXJyZWQiLCAiI3Byb21pc2UiLCAiI3Jlc29sdmUiLCAiI3JlamVjdCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJ2YWx1ZSIsICJyZWFzb24iLCAicHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uIiwgImNvbm5lY3Rpb25Qcm92aWRlciIsICJjb25uZWN0aW9uRGVmZXIiLCAiRGVmZXJyZWQiLCAiY29ubmVjdGlvblJlbGVhc2VEZWZlciIsICJjb25uZWN0aW9uIiwgImV4IiwgImZyZWV6ZSIsICJOT19QTFVHSU5TIiwgImZyZWV6ZSIsICJRdWVyeUV4ZWN1dG9yQmFzZSIsICIjcGx1Z2lucyIsICJwbHVnaW5zIiwgIm5vZGUiLCAicXVlcnlJZCIsICJwbHVnaW4iLCAidHJhbnNmb3JtZWROb2RlIiwgImNvbXBpbGVkUXVlcnkiLCAiY29ubmVjdGlvbiIsICJyZXN1bHQiLCAibG9nT25jZSIsICIjdHJhbnNmb3JtUmVzdWx0IiwgImNodW5rU2l6ZSIsICJyZWxlYXNlIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJOb29wUXVlcnlFeGVjdXRvciIsICJfTm9vcFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJNZXJnZVJlc3VsdCIsICJudW1DaGFuZ2VkUm93cyIsICJNZXJnZVF1ZXJ5QnVpbGRlciIsICJfTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJtb2RpZmllciIsICJRdWVyeU5vZGUiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiYXJncyIsICJXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJNZXJnZVF1ZXJ5Tm9kZSIsICJwYXJzZUpvaW4iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiX1doZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgIiN3aGVuTWF0Y2hlZCIsICJsaHMiLCAib3AiLCAicmhzIiwgInJlZlJpZ2h0IiwgIk1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgInBhcnNlTWVyZ2VXaGVuIiwgIiN3aGVuTm90TWF0Y2hlZCIsICJieVNvdXJjZSIsICJCdWlsZGVyIiwgIk5vdE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiTWVyZ2VSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgInBhcnNlTWVyZ2VUaGVuIiwgInNldCIsICJVcGRhdGVRdWVyeUJ1aWxkZXIiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJVcGRhdGVRdWVyeU5vZGUiLCAidWIiLCAiaW5zZXJ0IiwgImNvbHVtbnMiLCAidmFsdWVzIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJJbnNlcnRRdWVyeU5vZGUiLCAiUXVlcnlDcmVhdG9yIiwgIl9RdWVyeUNyZWF0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJmcm9tIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlIiwgIkRlbGV0ZVF1ZXJ5QnVpbGRlciIsICJEZWxldGVRdWVyeU5vZGUiLCAidGFibGVzIiwgIlVwZGF0ZVF1ZXJ5QnVpbGRlciIsICJVcGRhdGVRdWVyeU5vZGUiLCAidGFyZ2V0VGFibGUiLCAiTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiTWVyZ2VRdWVyeU5vZGUiLCAicGFyc2VBbGlhc2VkVGFibGUiLCAibmFtZU9yQnVpbGRlciIsICJleHByZXNzaW9uIiwgImN0ZSIsICJwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiIsICJXaXRoTm9kZSIsICJwbHVnaW4iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlUXVlcnlDcmVhdG9yIiwgIlF1ZXJ5Q3JlYXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImpvaW5UeXBlIiwgInRhYmxlIiwgIkpvaW5CdWlsZGVyIiwgIkpvaW5Ob2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgImNyZWF0ZU92ZXJCdWlsZGVyIiwgIk92ZXJCdWlsZGVyIiwgIk92ZXJOb2RlIiwgInBhcnNlSm9pbiIsICJqb2luVHlwZSIsICJhcmdzIiwgInBhcnNlU2luZ2xlT25Kb2luIiwgInBhcnNlQ2FsbGJhY2tKb2luIiwgInBhcnNlT25sZXNzSm9pbiIsICJmcm9tIiwgImNhbGxiYWNrIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImxoc0NvbHVtbiIsICJyaHNDb2x1bW4iLCAiSm9pbk5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb24iLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJPZmZzZXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9mZnNldCIsICJHcm91cEJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZ3JvdXBCeSIsICJwYXJzZUdyb3VwQnkiLCAiZ3JvdXBCeSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJHcm91cEJ5SXRlbU5vZGUiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJleHByZXNzaW9uIiwgImFsbCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAib3BlcmF0b3IiLCAiZXhwcmVzc2lvbiIsICJhbGwiLCAiaXNGdW5jdGlvbiIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiZXhwciIsICJTZXRPcGVyYXRpb25Ob2RlIiwgInBhcnNlRXhwcmVzc2lvbiIsICJFeHByZXNzaW9uV3JhcHBlciIsICJfRXhwcmVzc2lvbldyYXBwZXIiLCAiI25vZGUiLCAibm9kZSIsICJhbGlhcyIsICJBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIiLCAiYXJncyIsICJPcldyYXBwZXIiLCAiT3JOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiQW5kV3JhcHBlciIsICJBbmROb2RlIiwgIiNleHByIiwgIiNhbGlhcyIsICJleHByIiwgIkFsaWFzTm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiSWRlbnRpZmllck5vZGUiLCAiX09yV3JhcHBlciIsICJQYXJlbnNOb2RlIiwgIl9BbmRXcmFwcGVyIiwgIkZldGNoTm9kZSIsICJub2RlIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgIlZhbHVlTm9kZSIsICJwYXJzZUZldGNoIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgImlzTnVtYmVyIiwgImlzQmlnSW50IiwgImlzRmV0Y2hNb2RpZmllciIsICJGZXRjaE5vZGUiLCAidmFsdWUiLCAiU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICJfU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgIm1vZGlmaWVyIiwgIlNlbGVjdE1vZGlmaWVyTm9kZSIsICJvZiIsICJhc0FycmF5IiwgInBhcnNlVGFibGUiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiI2pvaW4iLCAiam9pblR5cGUiLCAicGFyc2VKb2luIiwgInBhcnNlT3JkZXJCeSIsICJncm91cEJ5IiwgInBhcnNlR3JvdXBCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAib2Zmc2V0IiwgIk9mZnNldE5vZGUiLCAicm93Q291bnQiLCAicGFyc2VGZXRjaCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAiYWxpYXMiLCAiQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwiLCAiZnVuYyIsICJjb25kaXRpb24iLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIiwgIiNxdWVyeUJ1aWxkZXIiLCAiI2FsaWFzIiwgInF1ZXJ5QnVpbGRlciIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImFnZ3JlZ2F0ZUZ1bmN0aW9uIiwgImFnZ3JlZ2F0ZWQiLCAiYWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgIm9yZGVySXRlbXMiLCAid2l0aGluR3JvdXAiLCAicHJvcCIsICJPcmRlckJ5Tm9kZSIsICJmaWx0ZXIiLCAiV2hlcmVOb2RlIiwgIm92ZXIiLCAiRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZ1bmMiLCAiYXJncyIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiX0FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFsaWFzIiwgIkFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJvdmVyIiwgImJ1aWxkZXIiLCAiY3JlYXRlT3ZlckJ1aWxkZXIiLCAiZnVuYyIsICIjYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIiNhbGlhcyIsICJhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgImZuIiwgIm5hbWUiLCAiYXJncyIsICJFeHByZXNzaW9uV3JhcHBlciIsICJGdW5jdGlvbk5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFnZyIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImNvbHVtbiIsICJ2YWx1ZXMiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiaXNTdHJpbmciLCAicGFyc2VUYWJsZSIsICJVbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAib3BlcmFuZCIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgIm9wZXJhdG9yIiwgIm9wZXJhbmQiLCAiVW5hcnlPcGVyYXRpb25Ob2RlIiwgIk9wZXJhdG9yTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiQ2FzZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWUiLCAiY2FzZU5vZGUiLCAid2hlbiIsICJ0aGVuIiwgIldoZW5Ob2RlIiwgInByb3BzIiwgIkNhc2VCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJDYXNlVGhlbkJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiV2hlbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJ2YWx1ZUV4cHJlc3Npb24iLCAiQ2FzZVdoZW5CdWlsZGVyIiwgImlzU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIkNhc2VFbmRCdWlsZGVyIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgIkpTT05QYXRoTGVnTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0eXBlIiwgInZhbHVlIiwgIkpTT05QYXRoQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImluZGV4IiwgIiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWciLCAia2V5IiwgImxlZ1R5cGUiLCAidmFsdWUiLCAiSlNPTlJlZmVyZW5jZU5vZGUiLCAiVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgIkpTT05QYXRoTm9kZSIsICJKU09OUGF0aExlZ05vZGUiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgIlZhbHVlTm9kZSIsICJfVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgImFsaWFzIiwgIkFsaWFzZWRKU09OUGF0aEJ1aWxkZXIiLCAiI2pzb25QYXRoIiwgIiNhbGlhcyIsICJqc29uUGF0aCIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgIlR1cGxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZXMiLCAiU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTIiwgIkNPTFVNTl9EQVRBX1RZUEVfUkVHRVgiLCAiRGF0YVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImRhdGFUeXBlIiwgImlzQ29sdW1uRGF0YVR5cGUiLCAiciIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNDb2x1bW5EYXRhVHlwZSIsICJEYXRhVHlwZU5vZGUiLCAiQ2FzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJleGVjdXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImJpbmFyeSIsICJsaHMiLCAib3AiLCAicmhzIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24iLCAidW5hcnkiLCAiZXhwciIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgImViIiwgInRhYmxlIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJyZWZlcmVuY2UiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIkpTT05QYXRoQnVpbGRlciIsICJwYXJzZUpTT05SZWZlcmVuY2UiLCAiSlNPTlBhdGhOb2RlIiwgInBhcnNlVGFibGUiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWVzIiwgIlR1cGxlTm9kZSIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJzdGFydCIsICJlbmQiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJPcGVyYXRvck5vZGUiLCAiQW5kTm9kZSIsICJleHBycyIsICJpc1JlYWRvbmx5QXJyYXkiLCAicGFyc2VGaWx0ZXJMaXN0IiwgInBhcnNlRmlsdGVyT2JqZWN0IiwgImFyZ3MiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgIlBhcmVuc05vZGUiLCAiZGF0YVR5cGUiLCAiQ2FzdE5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlRnVuY3Rpb25Nb2R1bGUiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiXyIsICJwYXJzZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgIm9iaiIsICJpc0V4cHJlc3Npb24iLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgIiN0YWJsZSIsICJ0YWJsZSIsICJhbGlhcyIsICJBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICIjYWxpYXMiLCAiQWxpYXNOb2RlIiwgInBhcnNlVGFibGUiLCAiSWRlbnRpZmllck5vZGUiLCAiaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzU3RyaW5nIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgInRhYmxlIiwgImlzUmVhZG9ubHlBcnJheSIsICJpdCIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJwYXJzZUFsaWFzZWRUYWJsZSIsICJpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiZnJvbSIsICJBTElBU19TRVBBUkFUT1IiLCAiYWxpYXMiLCAidHJpbSIsICJBbGlhc05vZGUiLCAicGFyc2VUYWJsZSIsICJJZGVudGlmaWVyTm9kZSIsICJTQ0hFTUFfU0VQQVJBVE9SIiwgInNjaGVtYSIsICJUYWJsZU5vZGUiLCAic3RyIiwgIkFkZENvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJkYXRhVHlwZSIsICJDb2x1bW5Ob2RlIiwgIm1vZGlmaWVyIiwgInByb3BzIiwgIkRyb3BDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIlJlbmFtZUNvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIm5ld0NvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIkNoZWNrQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJjb25zdHJhaW50TmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIlJlZmVyZW5jZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgImNvbHVtbnMiLCAicmVmZXJlbmNlcyIsICJvbkRlbGV0ZSIsICJvblVwZGF0ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIlZhbHVlTm9kZSIsICJHZW5lcmF0ZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcmFtcyIsICJleHByZXNzaW9uIiwgIkRlZmF1bHRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZGVmYXVsdFZhbHVlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgImFjdGlvbiIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIkNvbHVtbkRlZmluaXRpb25CdWlsZGVyIiwgIl9Db2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgInJlZiIsICJyZWZlcmVuY2VzIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlNlbGVjdEFsbE5vZGUiLCAiUmVmZXJlbmNlc05vZGUiLCAib25EZWxldGUiLCAicGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24iLCAib25VcGRhdGUiLCAidmFsdWUiLCAiRGVmYXVsdFZhbHVlTm9kZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZXhwcmVzc2lvbiIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgIkdlbmVyYXRlZE5vZGUiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJNb2RpZnlDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic291cmNlQ29sdW1ucyIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIlJlZmVyZW5jZXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJfRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAib25EZWxldGUiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgIm9uVXBkYXRlIiwgImZ1bmMiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludCIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIm51bGxzTm90RGlzdGluY3QiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcENvbnN0cmFpbnQiLCAicHJvcHMiLCAiQWx0ZXJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJwcm9wIiwgInZhbHVlIiwgIkNvbHVtbk5vZGUiLCAiQWx0ZXJDb2x1bW5CdWlsZGVyIiwgIiNjb2x1bW4iLCAiY29sdW1uIiwgImRhdGFUeXBlIiwgIkFsdGVyZWRDb2x1bW5CdWlsZGVyIiwgIkFsdGVyQ29sdW1uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJ2YWx1ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZnVuYyIsICIjYWx0ZXJDb2x1bW5Ob2RlIiwgImFsdGVyQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlRXhlY3V0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAib25EZWxldGUiLCAib25VcGRhdGUiLCAiZnVuYyIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRDb25zdHJhaW50Tm9kZSIsICJBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbnMiLCAiY29uc3RyYWludE5hbWUiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJBZGRJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJjb2x1bW5zIiwgIkFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiX0FsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRJbmRleE5vZGUiLCAiY29sdW1uIiwgInBhcnNlT3JkZXJlZENvbHVtbk5hbWUiLCAiY29sdW1ucyIsICJleHByZXNzaW9uIiwgImluZGV4VHlwZSIsICJSYXdOb2RlIiwgImZ1bmMiLCAiVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIl9VbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJfUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImZ1bmMiLCAiUmVuYW1lQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibmV3VGFibGVOYW1lIiwgIkFsdGVyVGFibGVFeGVjdXRvciIsICJBbHRlclRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIm5ld1NjaGVtYSIsICJJZGVudGlmaWVyTm9kZSIsICJjb2x1bW4iLCAiYWx0ZXJhdGlvbiIsICJidWlsZGVyIiwgIkFsdGVyQ29sdW1uQnVpbGRlciIsICJBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIiwgIkRyb3BDb2x1bW5Ob2RlIiwgIm5ld0NvbHVtbiIsICJSZW5hbWVDb2x1bW5Ob2RlIiwgImNvbHVtbk5hbWUiLCAiZGF0YVR5cGUiLCAiYnVpbGQiLCAibm9vcCIsICJDb2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJBZGRDb2x1bW5Ob2RlIiwgIk1vZGlmeUNvbHVtbk5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJ1bmlxdWVDb25zdHJhaW50QnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiY2hlY2tFeHByZXNzaW9uIiwgImNvbnN0cmFpbnRCdWlsZGVyIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUiLCAiQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIlJlbmFtZUNvbnN0cmFpbnROb2RlIiwgImluZGV4TmFtZSIsICJBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIkFkZEluZGV4Tm9kZSIsICJEcm9wSW5kZXhOb2RlIiwgImZ1bmMiLCAiX0FsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiX0NyZWF0ZUluZGV4QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJ0YWJsZSIsICJwYXJzZVRhYmxlIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbnMiLCAiZXhwcmVzc2lvbiIsICJpbmRleFR5cGUiLCAiUmF3Tm9kZSIsICJhcmdzIiwgInRyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiZnVuYyIsICJDcmVhdGVTY2hlbWFCdWlsZGVyIiwgIl9DcmVhdGVTY2hlbWFCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmdW5jIiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiYWN0aW9uIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJfQ3JlYXRlVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlVGFibGVOb2RlIiwgIm9uQ29tbWl0IiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiY29sdW1uTmFtZSIsICJkYXRhVHlwZSIsICJidWlsZCIsICJub29wIiwgImNvbHVtbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJjb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgInVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJjaGVja0V4cHJlc3Npb24iLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgInRhcmdldFRhYmxlIiwgInRhcmdldENvbHVtbnMiLCAiYnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgIkNvbHVtbk5vZGUiLCAicGFyc2VUYWJsZSIsICJtb2RpZmllciIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJmdW5jIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiX0Ryb3BJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJ0YWJsZSIsICJEcm9wSW5kZXhOb2RlIiwgInBhcnNlVGFibGUiLCAiZnVuYyIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJfRHJvcFNjaGVtYUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wU2NoZW1hTm9kZSIsICJmdW5jIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiX0Ryb3BUYWJsZUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wVGFibGVOb2RlIiwgImZ1bmMiLCAiQ3JlYXRlVmlld05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJjcmVhdGVWaWV3IiwgInBhcmFtcyIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJhcmdzIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIl9DcmVhdGVWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVZpZXdOb2RlIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lIiwgInF1ZXJ5IiwgInF1ZXJ5Tm9kZSIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICJmdW5jIiwgIkRyb3BWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImRyb3BWaWV3IiwgInBhcmFtcyIsICJEcm9wVmlld0J1aWxkZXIiLCAiX0Ryb3BWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkRyb3BWaWV3Tm9kZSIsICJmdW5jIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiY3JlYXRlVHlwZSIsICJ2YWx1ZXMiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiX0NyZWF0ZVR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAidmFsdWVzIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZ1bmMiLCAiRHJvcFR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZHJvcFR5cGUiLCAicGFyYW1zIiwgIkRyb3BUeXBlQnVpbGRlciIsICJfRHJvcFR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFR5cGVOb2RlIiwgImZ1bmMiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgImlkIiwgIlNDSEVNQV9TRVBBUkFUT1IiLCAicGFydHMiLCAidHJpbSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJzdHIiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlVmlldyIsICJwYXJhbXMiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIiwgIl9SZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiZnVuYyIsICJTY2hlbWFNb2R1bGUiLCAiX1NjaGVtYU1vZHVsZSIsICIjZXhlY3V0b3IiLCAiZXhlY3V0b3IiLCAidGFibGUiLCAiQ3JlYXRlVGFibGVCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiQ3JlYXRlVGFibGVOb2RlIiwgInBhcnNlVGFibGUiLCAiRHJvcFRhYmxlQnVpbGRlciIsICJEcm9wVGFibGVOb2RlIiwgImluZGV4TmFtZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiRHJvcEluZGV4Tm9kZSIsICJzY2hlbWEiLCAiQ3JlYXRlU2NoZW1hQnVpbGRlciIsICJDcmVhdGVTY2hlbWFOb2RlIiwgIkRyb3BTY2hlbWFCdWlsZGVyIiwgIkRyb3BTY2hlbWFOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIkFsdGVyVGFibGVOb2RlIiwgInZpZXdOYW1lIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIkNyZWF0ZVZpZXdOb2RlIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiRHJvcFZpZXdCdWlsZGVyIiwgIkRyb3BWaWV3Tm9kZSIsICJ0eXBlTmFtZSIsICJDcmVhdGVUeXBlQnVpbGRlciIsICJDcmVhdGVUeXBlTm9kZSIsICJwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIiLCAiRHJvcFR5cGVCdWlsZGVyIiwgIkRyb3BUeXBlTm9kZSIsICJwbHVnaW4iLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJEeW5hbWljTW9kdWxlIiwgInJlZmVyZW5jZSIsICJEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJ0YWJsZSIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgIkRlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIiLCAiI2RyaXZlciIsICJkcml2ZXIiLCAiY29uc3VtZXIiLCAiY29ubmVjdGlvbiIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJfRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAiI2NvbXBpbGVyIiwgIiNhZGFwdGVyIiwgIiNjb25uZWN0aW9uUHJvdmlkZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAicGx1Z2lucyIsICJub2RlIiwgInF1ZXJ5SWQiLCAiY29uc3VtZXIiLCAicGx1Z2luIiwgInBlcmZvcm1hbmNlTm93IiwgImlzRnVuY3Rpb24iLCAiUnVudGltZURyaXZlciIsICIjZHJpdmVyIiwgIiNsb2ciLCAiI2luaXRQcm9taXNlIiwgIiNpbml0RG9uZSIsICIjZGVzdHJveVByb21pc2UiLCAiI2Nvbm5lY3Rpb25zIiwgImRyaXZlciIsICJsb2ciLCAiZXJyIiwgImNvbm5lY3Rpb24iLCAiI25lZWRzTG9nZ2luZyIsICIjYWRkTG9nZ2luZyIsICJzZXR0aW5ncyIsICJzYXZlcG9pbnROYW1lIiwgImNvbXBpbGVRdWVyeSIsICJleGVjdXRlUXVlcnkiLCAic3RyZWFtUXVlcnkiLCAiZGlzIiwgImNvbXBpbGVkUXVlcnkiLCAiY2F1Z2h0RXJyb3IiLCAic3RhcnRUaW1lIiwgInBlcmZvcm1hbmNlTm93IiwgImVycm9yIiwgIiNsb2dFcnJvciIsICIjbG9nUXVlcnkiLCAiY2h1bmtTaXplIiwgInJlc3VsdCIsICIjY2FsY3VsYXRlRHVyYXRpb25NaWxsaXMiLCAiaXNTdHJlYW0iLCAiaWdub3JlRXJyb3IiLCAiU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIiwgIiNjb25uZWN0aW9uIiwgIiNydW5uaW5nUHJvbWlzZSIsICJjb25uZWN0aW9uIiwgImNvbnN1bWVyIiwgIiNydW4iLCAicnVubmVyIiwgIlRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyIsICJUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTIiwgInZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyIsICJzZXR0aW5ncyIsICJMT0dfTEVWRUxTIiwgImZyZWV6ZSIsICJMb2ciLCAiI2xldmVscyIsICIjbG9nZ2VyIiwgImNvbmZpZyIsICJpc0Z1bmN0aW9uIiwgImRlZmF1bHRMb2dnZXIiLCAibGV2ZWwiLCAiZ2V0RXZlbnQiLCAiZXZlbnQiLCAicHJlZml4IiwgImlzQ29tcGlsYWJsZSIsICJ2YWx1ZSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgIkt5c2VseSIsICJfS3lzZWx5IiwgIlF1ZXJ5Q3JlYXRvciIsICIjcHJvcHMiLCAiYXJncyIsICJzdXBlclByb3BzIiwgInByb3BzIiwgImlzS3lzZWx5UHJvcHMiLCAiZGlhbGVjdCIsICJkcml2ZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJsb2ciLCAiTG9nIiwgInJ1bnRpbWVEcml2ZXIiLCAiUnVudGltZURyaXZlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAiRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciIsICJleGVjdXRvciIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJmcmVlemUiLCAiU2NoZW1hTW9kdWxlIiwgIkR5bmFtaWNNb2R1bGUiLCAidmFsdWUiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VFeHByZXNzaW9uIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgIlRyYW5zYWN0aW9uQnVpbGRlciIsICJDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyIiwgIkNvbm5lY3Rpb25CdWlsZGVyIiwgInBsdWdpbiIsICJzY2hlbWEiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJxdWVyeSIsICJxdWVyeUlkIiwgImxvZ09uY2UiLCAiY29tcGlsZWRRdWVyeSIsICJpc0NvbXBpbGFibGUiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJjYWxsYmFjayIsICJjb25uZWN0aW9uIiwgIlNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciIsICJkYiIsICJfVHJhbnNhY3Rpb25CdWlsZGVyIiwgImFjY2Vzc01vZGUiLCAiaXNvbGF0aW9uTGV2ZWwiLCAia3lzZWx5UHJvcHMiLCAic2V0dGluZ3MiLCAidmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzIiwgInRyYW5zYWN0aW9uIiwgInRyYW5zYWN0aW9uQmVndW4iLCAicmVzdWx0IiwgImVycm9yIiwgIl9Db250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJDb250cm9sbGVkVHJhbnNhY3Rpb24iLCAiX0NvbnRyb2xsZWRUcmFuc2FjdGlvbiIsICIjY29tcGlsZVF1ZXJ5IiwgIiNzdGF0ZSIsICJzdGF0ZSIsICJOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciIsICJ0cmFuc2FjdGlvblByb3BzIiwgImNyZWF0ZVF1ZXJ5SWQiLCAibm9kZSIsICJhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2siLCAiQ29tbWFuZCIsICJzYXZlcG9pbnROYW1lIiwgIiNjYiIsICJjYiIsICJfTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IiLCAiI2V4ZWN1dG9yIiwgImNvbnN1bWVyIiwgImNodW5rU2l6ZSIsICJwbHVnaW5zIiwgIlJhd0J1aWxkZXJJbXBsIiwgIl9SYXdCdWlsZGVySW1wbCIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFsaWFzIiwgIkFsaWFzZWRSYXdCdWlsZGVySW1wbCIsICJwbHVnaW4iLCAiI3RvT3BlcmF0aW9uTm9kZSIsICIjZ2V0RXhlY3V0b3IiLCAiZXhlY3V0b3JQcm92aWRlciIsICIjY29tcGlsZSIsICJleGVjdXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImNyZWF0ZVJhd0J1aWxkZXIiLCAiI3Jhd0J1aWxkZXIiLCAiI2FsaWFzIiwgInJhd0J1aWxkZXIiLCAiQWxpYXNOb2RlIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJJZGVudGlmaWVyTm9kZSIsICJzcWwiLCAic3FsRnJhZ21lbnRzIiwgInBhcmFtZXRlcnMiLCAiY3JlYXRlUmF3QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlJhd05vZGUiLCAicGFyc2VQYXJhbWV0ZXIiLCAiY29sdW1uUmVmZXJlbmNlIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgInZhbHVlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgInRhYmxlUmVmZXJlbmNlIiwgInBhcnNlVGFibGUiLCAiaWRzIiwgImZyYWdtZW50cyIsICJJZGVudGlmaWVyTm9kZSIsICJWYWx1ZU5vZGUiLCAiYXJyYXkiLCAic2VwYXJhdG9yIiwgIm5vZGVzIiwgInNlcCIsICJpIiwgInBhcmFtIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJPcGVyYXRpb25Ob2RlVmlzaXRvciIsICIjdmlzaXRvcnMiLCAiZnJlZXplIiwgIm5vZGUiLCAiTElUX1dSQVBfUkVHRVgiLCAiRGVmYXVsdFF1ZXJ5Q29tcGlsZXIiLCAiT3BlcmF0aW9uTm9kZVZpc2l0b3IiLCAiI3NxbCIsICIjcGFyYW1ldGVycyIsICJub2RlIiwgInF1ZXJ5SWQiLCAiZnJlZXplIiwgIndyYXBJblBhcmVucyIsICJQYXJlbnNOb2RlIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJDcmVhdGVUYWJsZU5vZGUiLCAiQ3JlYXRlVmlld05vZGUiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJleHByZXNzaW9ucyIsICJub2RlcyIsICJzZXBhcmF0b3IiLCAibGFzdEluZGV4IiwgImkiLCAiUmF3Tm9kZSIsICJXaGVuTm9kZSIsICJsb2dPbmNlIiwgIl8iLCAiaXNTdHJpbmciLCAidmFsdWVzIiwgIkpPSU5fVFlQRV9TUUwiLCAic3FsRnJhZ21lbnRzIiwgInBhcmFtcyIsICJpc0Jvb2xlYW4iLCAiU0VMRUNUX01PRElGSUVSX1NRTCIsICJPcGVyYXRvck5vZGUiLCAicGF0aExlZyIsICJpc0FycmF5TG9jYXRpb24iLCAibGVuIiwgInN0ciIsICJwYXJhbWV0ZXIiLCAiaWRlbnRpZmllciIsICJsZWZ0V3JhcCIsICJyaWdodFdyYXAiLCAic2FuaXRpemVkIiwgImMiLCAidmFsdWUiLCAiaXNOdW1iZXIiLCAiaXNCaWdJbnQiLCAiaXNOdWxsIiwgImlzRGF0ZSIsICJhcnIiLCAibGVmdCIsICJyaWdodCIsICJTRUxFQ1RfTU9ESUZJRVJfUFJJT1JJVFkiLCAiY29sdW1uQWx0ZXJhdGlvbnMiLCAiRHVtbXlEcml2ZXIiLCAiRHVtbXlDb25uZWN0aW9uIiwgIkRpYWxlY3RBZGFwdGVyQmFzZSIsICJJRF9XUkFQX1JFR0VYIiwgIlNxbGl0ZVF1ZXJ5Q29tcGlsZXIiLCAiRGVmYXVsdFF1ZXJ5Q29tcGlsZXIiLCAibm9kZSIsICJpZGVudGlmaWVyIiwgIl8iLCAiU3FsaXRlQWRhcHRlciIsICJEaWFsZWN0QWRhcHRlckJhc2UiLCAiX2RiIiwgIl9vcHQiLCAiZ2V0QnVpbGRlciIsICJyZXF1aXJlbWVudHMiLCAiS3lzZWx5IiwgIkR1bW15RHJpdmVyIiwgIkltbWVkaWF0ZVZhbHVlUGx1Z2luIiwgIiN0cmFuc2Zvcm1lciIsICJJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIiwgImFyZ3MiLCAiT3BlcmF0aW9uTm9kZVRyYW5zZm9ybWVyIiwgIm5vZGUiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiY29tcGlsZSIsICJjb21waWxlYWJsZSIsICJvcHRpb25zIiwgImNvbXBpbGVkUXVlcnkiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAicm93cyIsICJjb2x1bW5zIiwgInJvd0ZpbHRlcnMiLCAiaW5mZXJSb3dGaWx0ZXJzIiwgInFiIiwgImViIiwgInJvd0ZpbHRlciIsICJjb2x1bW5OYW1lIiwgInZhbHVlIiwgImluZmVyUm93RmlsdGVycyIsICJyb3dzIiwgImNvbHVtbnMiLCAicmVmcyIsICJ2YWx1ZXMiLCAiZWIiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAicm93IiwgInZhbHVlc0ZvclJvdyIsICJjb2x1bW4iLCAiaXNJblByaW1hcnlLZXkiLCAiY29sdW1uTmFtZSIsICJ0cmFuc2Zvcm1WYWx1ZSIsICJ0dXBsZUZyb20iLCAibGhzIiwgInJocyIsICJpdGVtcyIsICJzcWwiLCAidHJhbnNmb3JtVmFsdWUiLCAidmFsdWUiLCAiY29sdW1uIiwgImRhdGF0eXBlIiwgImViIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInNxbCIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgImZpbHRlcnMiLCAiY29sdW1ucyIsICJvckdyb3Vwc09mQW5kQnVpbGRlcnMiLCAiY3VycmVudEFuZEdyb3VwQnVpbGRlcnMiLCAiaSIsICJidWlsZEJhc2VFeHByZXNzaW9uQnVpbGRlciIsICJhbmRFeHByZXNzaW9ucyIsICJncm91cCIsICJidWlsZGVyIiwgInNwZWMiLCAib3BlcmF0b3IiLCAiY29sdW1uTWV0YSIsICJnZXRTUUxpdGVCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJnZXRCdWlsZGVyIiwgIlNxbGl0ZUFkYXB0ZXIiLCAiU3FsaXRlUXVlcnlDb21waWxlciIsICJnZXRTZWxlY3RRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJmaWx0ZXIiLCAicGFnZUluZGV4IiwgInBhZ2VTaXplIiwgInNvcnRPcmRlciIsICJjb2x1bW5zIiwgInRhYmxlTmFtZSIsICJidWlsZGVyIiwgImdldFNRTGl0ZUJ1aWxkZXIiLCAiZmlsdGVyRXhwcmVzc2lvbiIsICJnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uIiwgImNvdW50UXVlcnkiLCAiZWIiLCAic3FsIiwgImNvbXBpbGUiLCAicWIiLCAiaXRlbSIsICJnZXREZWxldGVRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJyb3dzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgImJ1aWxkZXIiLCAiZ2V0U1FMaXRlQnVpbGRlciIsICJjb21waWxlIiwgImFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzIiwgImdldEN1cnJlbnRUaW1lc3RhbXBNaWxsaXMiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAicm93IiwgImdldFVwZGF0ZVF1ZXJ5IiwgImNoYW5nZXMiLCAiZWIiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAic3FsIiwgImdldEpzb25PYmplY3RBcmdzIiwgIm5vZGUiLCAidGFibGUiLCAiYXJncyIsICJzIiwgIlJlZmVyZW5jZU5vZGUiLCAiQ29sdW1uTm9kZSIsICJjb2xOYW1lIiwgImNvbFJlZiIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAiY29sIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgIlZhbHVlTm9kZSIsICJUYWJsZU5vZGUiLCAianNvbkFycmF5RnJvbSIsICJleHByIiwgInNxbCIsICJnZXRTcWxpdGVKc29uT2JqZWN0QXJncyIsICJnZXRTcWxpdGVKc29uT2JqZWN0QXJncyIsICJub2RlIiwgInRhYmxlIiwgImdldEpzb25PYmplY3RBcmdzIiwgImdldFRhYmxlc1F1ZXJ5IiwgInJlcXVpcmVtZW50cyIsICJjb21waWxlIiwgImdldFNRTGl0ZUJ1aWxkZXIiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiamIiLCAiZWIiLCAianNvbkFycmF5RnJvbSIsICJzY2hlbWEiLCAiZmlsdGVyT3BlcmF0b3JzIiwgImNyZWF0ZVNRTGl0ZUFkYXB0ZXIiLCAicmVxdWlyZW1lbnRzIiwgImV4ZWN1dG9yIiwgIm90aGVyUmVxdWlyZW1lbnRzIiwgImRldGFpbHMiLCAib3B0aW9ucyIsICJxdWVyeSIsICJnZXREZWxldGVRdWVyeSIsICJlcnJvciIsICJjcmVhdGVBZGFwdGVyRXJyb3IiLCAiZ2V0SW5zZXJ0UXVlcnkiLCAicm93cyIsICJ0YWJsZXNRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJ0YWJsZXNFcnJvciIsICJ0YWJsZXMiLCAiY3JlYXRlSW50cm9zcGVjdGlvbiIsICJnZXRTZWxlY3RRdWVyeSIsICJyZXN1bHRzIiwgImdldFVwZGF0ZVF1ZXJ5IiwgInJvdyIsICJhcmdzIiwgInNjaGVtYXMiLCAidGFibGUiLCAiY29sdW1ucyIsICJ0YWJsZU5hbWUiLCAiX3NxbCIsICJjb2x1bW5zUmVjb3JkIiwgImNvbHVtbiIsICJkYXRhdHlwZSIsICJmb3JlaWduX2tleV9jb2x1bW4iLCAiY29sdW1uTmFtZSIsICJhZmZpbml0eSIsICJkZXRlcm1pbmVDb2x1bW5BZmZpbml0eSIsICJTUUxJVEVfQUZGSU5JVFlfVE9fTUVUQURBVEEiLCAiY3JlYXRlTm9kZVNRTGl0ZUV4ZWN1dG9yIiwgImRhdGFiYXNlIiwgInF1ZXJ5IiwgInBhcmFtZXRlcnMiLCAic3FsIiwgInRyYW5zZm9ybWF0aW9ucyIsICJzdGF0ZW1lbnQiLCAicm93cyIsICJyb3ciLCAiY29sdW1uIiwgInRyYW5zZm9ybWF0aW9uIiwgInZhbHVlIiwgImVycm9yIiwgImNyZWF0ZU5vZGVTUUxpdGVBZGFwdGVyIiwgImNyZWF0ZVNRTGl0ZUFkYXB0ZXIiXQp9Cg==
1
+ "use strict";var u=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var S=(t,e)=>{for(var o in e)u(t,o,{get:e[o],enumerable:!0})},x=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of v(e))!y.call(t,r)&&r!==o&&u(t,r,{get:()=>e[r],enumerable:!(s=m(e,r))||s.enumerable});return t};var d=t=>x(u({},"__esModule",{value:!0}),t);var w={};S(w,{createNodeSQLiteExecutor:()=>h});module.exports=d(w);function h(t){return{execute:e=>{let{parameters:o,sql:s,transformations:r}=e,f=t.prepare(s);try{let n=f.all(...o);if(!r||Object.keys(r).length===0)return Promise.resolve([null,n]);for(let i of n)for(let a in r){let l=r[a],c=i[a];if(l==="json-parse"){if(typeof c=="string")try{i[a]=JSON.parse(c)}catch(p){console.error(`Failed to JSON.parse column "${a}" with value: ${c}`,p)}continue}}return Promise.resolve([null,n])}catch(n){return Promise.resolve([n])}}}}
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9ub2RlLXNxbGl0ZS9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVN5bmMsIFNRTElucHV0VmFsdWUgfSBmcm9tIFwibm9kZTpzcWxpdGVcIjtcblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRvciB9IGZyb20gXCIuLi9leGVjdXRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTm9kZVNRTGl0ZUV4ZWN1dG9yKGRhdGFiYXNlOiBEYXRhYmFzZVN5bmMpOiBFeGVjdXRvciB7XG4gIHJldHVybiB7XG4gICAgZXhlY3V0ZTogKHF1ZXJ5KSA9PiB7XG4gICAgICBjb25zdCB7IHBhcmFtZXRlcnMsIHNxbCwgdHJhbnNmb3JtYXRpb25zIH0gPSBxdWVyeTtcblxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0gZGF0YWJhc2UucHJlcGFyZShzcWwpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByb3dzID0gc3RhdGVtZW50LmFsbCguLi4ocGFyYW1ldGVycyBhcyBTUUxJbnB1dFZhbHVlW10pKTtcblxuICAgICAgICBpZiAoIXRyYW5zZm9ybWF0aW9ucyB8fCBPYmplY3Qua2V5cyh0cmFuc2Zvcm1hdGlvbnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW251bGwsIHJvd3NdKSBhcyBuZXZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBpbiB0cmFuc2Zvcm1hdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWF0aW9uID0gdHJhbnNmb3JtYXRpb25zW2NvbHVtbl07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd1tjb2x1bW5dO1xuXG4gICAgICAgICAgICBpZiAodHJhbnNmb3JtYXRpb24gPT09IFwianNvbi1wYXJzZVwiKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgcm93W2NvbHVtbl0gPSBKU09OLnBhcnNlKHZhbHVlKSBhcyBuZXZlcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIEpTT04ucGFyc2UgY29sdW1uIFwiJHtjb2x1bW59XCIgd2l0aCB2YWx1ZTogJHt2YWx1ZX1gLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uIHNhdGlzZmllcyB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbbnVsbCwgcm93c10pIGFzIG5ldmVyO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbZXJyb3IgYXMgRXJyb3JdKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogInlhQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSw4QkFBQUUsSUFBQSxlQUFBQyxFQUFBSCxHQUlPLFNBQVNJLEVBQXlCQyxFQUFrQyxDQUN6RSxNQUFPLENBQ0wsUUFBVUMsR0FBVSxDQUNsQixHQUFNLENBQUUsV0FBQUMsRUFBWSxJQUFBQyxFQUFLLGdCQUFBQyxDQUFnQixFQUFJSCxFQUV2Q0ksRUFBWUwsRUFBUyxRQUFRRyxDQUFHLEVBRXRDLEdBQUksQ0FDRixJQUFNRyxFQUFPRCxFQUFVLElBQUksR0FBSUgsQ0FBOEIsRUFFN0QsR0FBSSxDQUFDRSxHQUFtQixPQUFPLEtBQUtBLENBQWUsRUFBRSxTQUFXLEVBQzlELE9BQU8sUUFBUSxRQUFRLENBQUMsS0FBTUUsQ0FBSSxDQUFDLEVBR3JDLFFBQVdDLEtBQU9ELEVBQ2hCLFFBQVdFLEtBQVVKLEVBQWlCLENBQ3BDLElBQU1LLEVBQWlCTCxFQUFnQkksQ0FBTSxFQUN2Q0UsRUFBUUgsRUFBSUMsQ0FBTSxFQUV4QixHQUFJQyxJQUFtQixhQUFjLENBQ25DLEdBQUksT0FBT0MsR0FBVSxTQUNuQixHQUFJLENBQ0ZILEVBQUlDLENBQU0sRUFBSSxLQUFLLE1BQU1FLENBQUssQ0FDaEMsT0FBU0MsRUFBTyxDQUNkLFFBQVEsTUFBTSxnQ0FBZ0NILENBQU0saUJBQWlCRSxDQUFLLEdBQUlDLENBQUssQ0FDckYsQ0FHRixRQUNGLENBR0YsQ0FHRixPQUFPLFFBQVEsUUFBUSxDQUFDLEtBQU1MLENBQUksQ0FBQyxDQUNyQyxPQUFTSyxFQUFnQixDQUN2QixPQUFPLFFBQVEsUUFBUSxDQUFDQSxDQUFjLENBQUMsQ0FDekMsQ0FDRixDQUNGLENBQ0YiLAogICJuYW1lcyI6IFsibm9kZV9zcWxpdGVfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJjcmVhdGVOb2RlU1FMaXRlRXhlY3V0b3IiLCAiX190b0NvbW1vbkpTIiwgImNyZWF0ZU5vZGVTUUxpdGVFeGVjdXRvciIsICJkYXRhYmFzZSIsICJxdWVyeSIsICJwYXJhbWV0ZXJzIiwgInNxbCIsICJ0cmFuc2Zvcm1hdGlvbnMiLCAic3RhdGVtZW50IiwgInJvd3MiLCAicm93IiwgImNvbHVtbiIsICJ0cmFuc2Zvcm1hdGlvbiIsICJ2YWx1ZSIsICJlcnJvciJdCn0K