@prisma/studio-core 0.0.0-dev.202505090028 → 0.0.0-dev.202505090208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CPIOZS5X-ICU6WNOA.js +2 -0
- package/dist/OKF6E45R-3IGVLQES.js +2 -0
- package/dist/{adapter-CH4qnR6R.d.cts → adapter-CMdtJ8Fo.d.cts} +9 -6
- package/dist/{adapter-CH4qnR6R.d.ts → adapter-CMdtJ8Fo.d.ts} +9 -6
- package/dist/chunk-IAKOOX7B.js +1 -0
- package/dist/chunk-IDR3H3TJ.js +2 -0
- package/dist/chunk-OGMDOPWW.js +2 -0
- package/dist/chunk-RFCV76TR.js +2 -0
- package/dist/chunk-SOR7YZQY.js +1333 -0
- package/dist/{chunk-BMVJYUJW.js → chunk-XBQ4XZ2M.js} +1 -0
- package/dist/data/accelerate/index.cjs +1 -0
- package/dist/data/accelerate/index.d.cts +2 -2
- package/dist/data/accelerate/index.d.ts +2 -2
- package/dist/data/accelerate/index.js +2 -1
- package/dist/data/bff/index.cjs +1 -0
- package/dist/data/bff/index.d.cts +2 -2
- package/dist/data/bff/index.d.ts +2 -2
- package/dist/data/bff/index.js +2 -1
- package/dist/data/index.cjs +1 -0
- package/dist/data/index.d.cts +2 -2
- package/dist/data/index.d.ts +2 -2
- package/dist/data/index.js +2 -1
- package/dist/data/pglite/index.cjs +2 -1
- package/dist/data/pglite/index.d.cts +2 -2
- package/dist/data/pglite/index.d.ts +2 -2
- package/dist/data/pglite/index.js +2 -1
- package/dist/data/postgres-core/index.cjs +2 -1
- package/dist/data/postgres-core/index.d.cts +58 -3
- package/dist/data/postgres-core/index.d.ts +58 -3
- package/dist/data/postgres-core/index.js +2 -1
- package/dist/{index-DAubYhEp.d.cts → index-CwH2wnXs.d.cts} +1 -1
- package/dist/{index-BTblIzxR.d.ts → index-EZ8ew4JF.d.ts} +1 -1
- package/dist/ui/index.cjs +121 -120
- package/dist/ui/index.d.cts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +7 -6
- package/package.json +1 -1
- package/dist/CPIOZS5X-V4BHP4CI.js +0 -1
- package/dist/OKF6E45R-XYOIK2NY.js +0 -1
- package/dist/chunk-2ZJZX5I7.js +0 -0
- package/dist/chunk-555OIWZX.js +0 -1
- package/dist/chunk-5MNS4IJC.js +0 -1332
- package/dist/chunk-N2MLAUEV.js +0 -1
- package/dist/chunk-P72NBTYE.js +0 -1
|
@@ -1 +1,2 @@
|
|
|
1
|
-
"use strict";var ti=Object.defineProperty;var cn=Object.getOwnPropertyDescriptor;var mn=Object.getOwnPropertyNames;var ln=Object.prototype.hasOwnProperty;var fn=(t,e)=>{for(var r in e)ti(t,r,{get:e[r],enumerable:!0})},Nn=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of mn(e))!ln.call(t,n)&&n!==r&&ti(t,n,{get:()=>e[n],enumerable:!(o=cn(e,n))||o.enumerable});return t};var yn=t=>Nn(ti({},"__esModule",{value:!0}),t);var hs={};fn(hs,{createPostgresAdapter:()=>us,getDeleteQuery:()=>oo,getInsertQuery:()=>to,getSelectQuery:()=>ro,getTablesQuery:()=>no,getTimezoneQuery:()=>ao,getUpdateQuery:()=>io,mockIntrospect:()=>ps,mockSelectQuery:()=>is,mockTablesQuery:()=>so,mockTimezoneQuery:()=>uo});module.exports=yn(hs);var po={bool:{group:"boolean"},boolean:{group:"boolean"},bytea:{group:"string"},char:{group:"string"},citext:{group:"string"},date:{group:"datetime"},interval:{group:"string"},name:{group:"string"},varchar:{group:"string"},text:{group:"string"},time:{group:"time"},timestamp:{group:"datetime"},timestamptz:{group:"datetime"},"timestamp without time zone":{group:"datetime"},"timestamp with time zone":{group:"datetime"},timetz:{group:"time"},"time without time zone":{group:"time"},"time with time zone":{group:"datetime"},uuid:{group:"string"},int2:{group:"numeric"},int4:{group:"numeric"},int8:{group:"numeric"},smallint:{group:"numeric"},integer:{group:"numeric"},bigint:{group:"numeric"},decimal:{group:"numeric"},numeric:{group:"numeric"},real:{group:"numeric"},float4:{group:"numeric"},float8:{group:"numeric"},"double precision":{group:"numeric"},json:{group:"json"},jsonb:{group:"json"}};function K(t){return typeof t>"u"||t===void 0}function v(t){return typeof t=="string"}function Se(t){return typeof t=="number"}function Me(t){return typeof t=="boolean"}function He(t){return t===null}function ho(t){return t instanceof Date}function Ye(t){return typeof t=="bigint"}function T(t){return typeof t=="function"}function q(t){return typeof t=="object"&&t!==null}function i(t){return Object.freeze(t)}function kt(t){return L(t)?t:[t]}function L(t){return Array.isArray(t)}function z(t){return t}var l=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 p=i({is(t){return t.kind==="IdentifierNode"},create(t){return i({kind:"IdentifierNode",name:t})}});var re=i({is(t){return t.kind==="CreateIndexNode"},create(t){return i({kind:"CreateIndexNode",name:p.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:p.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var co=["preserve rows","delete rows","drop"],P=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 F=i({is(t){return t.kind==="SchemableIdentifierNode"},create(t){return i({kind:"SchemableIdentifierNode",identifier:p.create(t)})},createWithSchema(t,e){return i({kind:"SchemableIdentifierNode",schema:p.create(t),identifier:p.create(e)})}});var ke=i({is(t){return t.kind==="DropIndexNode"},create(t,e){return i({kind:"DropIndexNode",name:F.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Et=i({is(t){return t.kind==="DropSchemaNode"},create(t,e){return i({kind:"DropSchemaNode",schema:p.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var At=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 A=i({is(t){return t.kind==="AliasNode"},create(t,e){return i({kind:"AliasNode",node:t,alias:e})}});var j=i({is(t){return t.kind==="TableNode"},create(t){return i({kind:"TableNode",table:F.create(t)})},createWithSchema(t,e){return i({kind:"TableNode",table:F.createWithSchema(t,e)})}});function b(t){return q(t)&&T(t.toOperationNode)}function Jt(t){return q(t)&&"expressionType"in t&&b(t)}function mo(t){return q(t)&&"expression"in t&&v(t.alias)&&b(t)}var he=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 J=i({is(t){return t.kind==="AndNode"},create(t,e){return i({kind:"AndNode",left:t,right:e})}});var ie=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"?J.create(t.on,r):ie.create(t.on,r)})}});var we=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 Ee=i({is(t){return t.kind==="BinaryOperationNode"},create(t,e,r){return i({kind:"BinaryOperationNode",leftOperand:t,operator:e,rightOperand:r})}});var wn=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],xn=["+","-","*","/","%","^","&","|","#","<<",">>"],lo=["->","->>"],gn=[...wn,...xn,"&&","||"],On=["exists","not exists"],bn=["not","-",...On],fo=[...gn,...lo,...bn,"between","between symmetric"],G=i({is(t){return t.kind==="OperatorNode"},create(t){return i({kind:"OperatorNode",operator:t})}});function ri(t){return v(t)&&lo.includes(t)}var c=i({is(t){return t.kind==="ColumnNode"},create(t){return i({kind:"ColumnNode",column:p.create(t)})}});var Xe=i({is(t){return t.kind==="SelectAllNode"},create(){return i({kind:"SelectAllNode"})}});var Ze=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:Xe.create()})}});var Kt=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return ii(this.#e)}};function jt(t){return q(t)&&b(t)&&v(t.dynamicReference)}var oe=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 No={is(t){return t.kind==="CollateNode"},create(t){return i({kind:"CollateNode",collation:p.create(t)})}};var Gt=class t{#e;constructor(e){this.#e=i(e)}desc(){return new t({node:oe.cloneWith(this.#e.node,{direction:W.createWithSql("desc")})})}asc(){return new t({node:oe.cloneWith(this.#e.node,{direction:W.createWithSql("asc")})})}nullsLast(){return new t({node:oe.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new t({node:oe.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new t({node:oe.cloneWith(this.#e.node,{collation:No.create(e)})})}toOperationNode(){return this.#e.node}};var yo=new Set;function Ae(t){yo.has(t)||(yo.add(t),console.log(t))}function ni(t){return t==="asc"||t==="desc"}function Y(t){if(t.length===2)return[oi(t[0],t[1])];if(t.length===1){let[e]=t;return Array.isArray(e)?(Ae("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(r=>oi(r))):[oi(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${t.length}`)}function oi(t,e){let r=Cn(t);if(oe.is(r)){if(e)throw new Error("Cannot specify direction twice!");return r}return wo(r,e)}function Cn(t){if(xe(t))return $(t);if(jt(t))return t.toOperationNode();let[e,r]=t.split(" ");return r?(Ae("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),wo(H(e),r)):H(t)}function wo(t,e){if(typeof e=="string"){if(!ni(e))throw new Error(`Invalid order by direction: ${e}`);return oe.create(t,W.createWithSql(e))}if(Jt(e))return Ae("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),oe.create(t,e.toOperationNode());let r=oe.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 Ht=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 Re=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 ii(t){return v(t)?H(t):t.toOperationNode()}function ge(t){return L(t)?t.map(e=>B(e)):[B(t)]}function B(t){return xe(t)?$(t):ii(t)}function xo(t,e){let r=H(t);if(ri(e))return _e.create(r,Ht.create(G.create(e)));let o=e.slice(0,-1);if(ri(o))return _e.create(r,Re.create(G.create(o)));throw new Error(`Invalid JSON operator: ${e}`)}function H(t){let e=".";if(!t.includes(e))return Ze.create(c.create(t));let r=t.split(e).map(ai);if(r.length===3)return vn(r);if(r.length===2)return Wn(r);throw new Error(`invalid column reference ${t}`)}function go(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(ai);return A.create(H(r),p.create(o))}else return H(t)}function si(t){return c.create(t)}function et(t){let e=" ";if(t.includes(e)){let[r,o]=t.split(e).map(ai);if(!ni(o))throw new Error(`invalid order direction "${o}" next to "${r}"`);return Y([r,o])[0]}else return si(t)}function vn(t){let[e,r,o]=t;return Ze.create(c.create(o),j.createWithSchema(e,r))}function Wn(t){let[e,r]=t;return Ze.create(c.create(r),j.create(e))}function ai(t){return t.trim()}var Yt=i({is(t){return t.kind==="PrimitiveValueListNode"},create(t){return i({kind:"PrimitiveValueListNode",values:i([...t])})}});var ce=i({is(t){return t.kind==="ValueListNode"},create(t){return i({kind:"ValueListNode",values:i(t)})}});var k=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 Oo(t){return L(t)?Tn(t):g(t)}function g(t){return xe(t)?$(t):k.create(t)}function Xt(t){return Se(t)||Me(t)||He(t)}function Rt(t){if(!Xt(t))throw new Error(`unsafe immediate value ${JSON.stringify(t)}`);return k.createImmediate(t)}function Tn(t){return t.some(xe)?ce.create(t.map(e=>g(e))):Yt.create(t)}var me=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 Sn(e)&&Co(r)?Ee.create(B(t),ui(e),k.createImmediate(r)):Ee.create(B(t),ui(e),Oo(r))}function R(t,e,r){return Ee.create(B(t),ui(e),B(r))}function di(t,e){return tt(Object.entries(t).filter(([,r])=>!K(r)).map(([r,o])=>Zt(r,Co(o)?"is":"=",o)),e)}function tt(t,e,r=!0){let o=e==="and"?J.create:ie.create;if(t.length===0)return Ee.create(k.createImmediate(1),G.create("="),k.createImmediate(e==="and"?1:0));let n=bo(t[0]);for(let a=1;a<t.length;++a)n=o(n,bo(t[a]));return t.length>1&&r?me.create(n):n}function Sn(t){return t==="is"||t==="is not"}function Co(t){return He(t)||Me(t)}function ui(t){if(v(t)&&fo.includes(t))return G.create(t);if(b(t))return t.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(t)}`)}function bo(t){return b(t)?t.toOperationNode():t}var Oe=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?Oe.cloneWithItems(t.orderBy,e):Oe.create(e)})},cloneWithPartitionByItems(t,e){return i({...t,partitionBy:t.partitionBy?pi.cloneWithItems(t.partitionBy,e):pi.create(e)})}});var ze=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 hi=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"?J.create(t.having,r):ie.create(t.having,r)})}});var S=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 le=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?ze.cloneWithFroms(t.from,e):ze.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 Ie=i({is(t){return t.kind==="DeleteQueryNode"},create(t,e){return i({kind:"DeleteQueryNode",from:ze.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"?J.create(t.where,r):ie.create(t.where,r)})}});var li=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 vo=i({is(t){return t.kind==="ExplainNode"},create(t,e){return i({kind:"ExplainNode",format:t,options:e})}});var be=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=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),be.cloneWithResult(t.whens[t.whens.length-1],e)]):void 0})}});var fi=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)||S.is(t)||le.is(t)||Ie.is(t)||I.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?li.cloneWithSelections(t.returning,e):li.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:vo.create(e,r?.toOperationNode())})},cloneWithTop(t,e){return i({...t,top:e})},cloneWithOutput(t,e){return i({...t,output:t.output?fi.cloneWithSelections(t.output,e):fi.create(e)})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?Oe.cloneWithItems(t.orderBy,e):Oe.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:ze.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?hi.cloneWithItems(t.groupBy,e):hi.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:we.cloneWithOn(this.#e.joinNode,O(e))})}onRef(e,r,o){return new t({...this.#e,joinNode:we.cloneWithOn(this.#e.joinNode,R(e,r,o))})}onTrue(){return new t({...this.#e,joinNode:we.cloneWithOn(this.#e.joinNode,W.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};var Wo=i({is(t){return t.kind==="PartitionByItemNode"},create(t){return i({kind:"PartitionByItemNode",partitionBy:t})}});function To(t){return ge(t).map(Wo.create)}var tr=class t{#e;constructor(e){this.#e=i(e)}orderBy(...e){return new t({overNode:It.cloneWithOrderByItems(this.#e.overNode,Y(e))})}clearOrderBy(){return new t({overNode:u.cloneWithoutOrderBy(this.#e.overNode)})}partitionBy(e){return new t({overNode:It.cloneWithPartitionByItems(this.#e.overNode,To(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:Xe.create()})},createSelectAllFromTable(t){return i({kind:"SelectionNode",selection:Ze.createSelectAll(t)})}});function E(t){return T(t)?E(t(ne())):L(t)?t.map(e=>So(e)):[So(t)]}function So(t){return v(t)?rt.create(go(t)):jt(t)?rt.create(t.toOperationNode()):rt.create(rr(t))}function D(t){return t?Array.isArray(t)?t.map(ko):[ko(t)]:[rt.createSelectAll()]}function ko(t){if(v(t))return rt.createSelectAllFromTable(f(t));throw new Error(`invalid value selectAll expression: ${JSON.stringify(t)}`)}var Eo=i({is(t){return t.kind==="ValuesNode"},create(t){return i({kind:"ValuesNode",values:i(t)})}});var Ao=i({is(t){return t.kind==="DefaultInsertValueNode"},create(){return i({kind:"DefaultInsertValueNode"})}});function ir(t){let e=T(t)?t(ne()):t,r=L(e)?e:i([e]);return kn(r)}function kn(t){let e=En(t);return[i([...e.keys()].map(c.create)),Eo.create(t.map(r=>An(r,e)))]}function En(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 An(t,e){let r=Object.keys(t),o=Array.from({length:e.size}),n=!1,a=r.length;for(let h of r){let w=e.get(h);if(K(w)){a--;continue}let N=t[h];(K(N)||xe(N))&&(n=!0),o[w]=N}if(a<e.size||n){let h=Ao.create();return ce.create(o.map(w=>K(w)?h:g(w)))}return Yt.create(o)}var Ni=i({is(t){return t.kind==="ColumnUpdateNode"},create(t,e){return i({kind:"ColumnUpdateNode",column:t,value:e})}});function Ro(...t){return t.length===2?[Ni.create(B(t[0]),g(t[1]))]:Dt(t[0])}function Dt(t){let e=T(t)?t(ne()):t;return Object.entries(e).filter(([r,o])=>o!==void 0).map(([r,o])=>Ni.create(c.create(r),g(o)))}var Io=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 Z=class extends Error{node;constructor(e){super("no result"),this.node=e}};function fe(t){return Object.prototype.hasOwnProperty.call(t,"prototype")}var V=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:V.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:V.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:V.cloneWith(this.#e.onConflictNode,{constraint:p.create(e)})})}expression(e){return new t({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new t({...this.#e,onConflictNode:V.cloneWithIndexWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:V.cloneWithIndexWhere(this.#e.onConflictNode,R(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:V.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new yi({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new wi({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{updates:Dt(e)})})}$call(e){return e(this)}},yi=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.onConflictNode}},wi=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,onConflictNode:V.cloneWithUpdateWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:V.cloneWithUpdateWhere(this.#e.onConflictNode,R(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:V.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};var Do=i({is(t){return t.kind==="TopNode"},create(t,e){return i({kind:"TopNode",expression:t,modifiers:e})}});function se(t,e){if(!Se(t)&&!Ye(t))throw new Error(`Invalid top expression: ${t}`);if(!K(e)&&!Rn(e))throw new Error(`Invalid top modifiers: ${e}`);return Do.create(t,e)}function Rn(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:S.cloneWith(this.#e.queryNode,{columns:r,values:o})})}columns(e){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{columns:i(e.map(c.create))})})}expression(e){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{values:$(e)})})}defaultValues(){return new t({...this.#e,queryNode:S.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:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orIgnore(){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orAbort(){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("abort")})})}orFail(){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("fail")})})}orReplace(){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("replace")})})}orRollback(){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{orAction:Ve.create("rollback")})})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,se(e,r))})}onConflict(e){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{onConflict:e(new nr({onConflictNode:V.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new t({...this.#e,queryNode:S.cloneWith(this.#e.queryNode,{onDuplicateKey:Io.create(Dt(e))})})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}returningAll(){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,D())})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,D(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,this.#e.queryId),{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=Z){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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,R(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,se(e,r))})}using(e){return new t({...this.#e,queryNode:Ie.cloneWithUsing(this.#e.queryNode,ae(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,De(e,r))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,D(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,D(e))})}clearReturning(){return new t({...this.#e,queryNode:u.cloneWithoutReturning(this.#e.queryNode)})}clearLimit(){return new t({...this.#e,queryNode:Ie.cloneWithoutLimit(this.#e.queryNode)})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,Y(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:Ie.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,this.#e.queryId),{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=Z){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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,R(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,se(e,r))})}from(e){return new t({...this.#e,queryNode:le.cloneWithFromItems(this.#e.queryNode,ae(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,De(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,Y(e))})}clearOrderBy(){return new t({...this.#e,queryNode:u.cloneWithoutOrderBy(this.#e.queryNode)})}limit(e){return new t({...this.#e,queryNode:le.cloneWithLimit(this.#e.queryNode,it.create(g(e)))})}set(...e){return new t({...this.#e,queryNode:le.cloneWithUpdates(this.#e.queryNode,Ro(...e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,D(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,D(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,this.#e.queryId),{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=Z){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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:j.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 dr=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 gi(t,e){let r=e(Bo()).toOperationNode();return T(t)?t(In(r)).toOperationNode():nt.create(qo(t),r)}function In(t){return e=>new dr({node:nt.create(qo(e),t)})}function qo(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 Qo=["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 Lo(t){let e="";for(let r=0;r<t;++r)e+=Dn();return e}function Dn(){return Qo[~~(Math.random()*Qo.length)]}function m(){return new Oi}var Oi=class{#e;get queryId(){return this.#e===void 0&&(this.#e=Lo(8)),this.#e}};var qe=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 qn=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}),Bn={json_agg:!0,to_json:!0},pr=class extends qe{#e;#t=new Set;#r=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,r){if(!this.#o(e))return super.transformNodeImpl(e,r);let o=this.#d(e);for(let d of o)this.#r.add(d);let n=this.#a(e);for(let d of n)this.#t.add(d);let a=super.transformNodeImpl(e,r);for(let d of n)this.#t.delete(d);for(let d of o)this.#r.delete(d);return a}transformSchemableIdentifier(e,r){let o=super.transformSchemableIdentifier(e,r);return o.schema||!this.#t.has(e.identifier.name)?o:{...o,schema:p.create(this.#e)}}transformReferences(e,r){let o=super.transformReferences(e,r);return o.table.table.schema?o:{...o,table:j.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 Bn[e.func]?e[o].map(n=>!j.is(n)||n.table.schema?this.transformNode(n,r):{...n,table:this.transformIdentifier(n.table.identifier,r)}):this.transformNodeList(e[o],r)}#o(e){return e.kind in qn}#a(e){let r=new Set;if("name"in e&&e.name&&F.is(e.name)&&this.#s(e.name,r),"from"in e&&e.from)for(let o of e.from.froms)this.#n(o,r);if("into"in e&&e.into&&this.#n(e.into,r),"table"in e&&e.table&&this.#n(e.table,r),"joins"in e&&e.joins)for(let o of e.joins)this.#n(o.table,r);return"using"in e&&e.using&&this.#n(e.using,r),r}#d(e){let r=new Set;return"with"in e&&e.with&&this.#u(e.with,r),r}#n(e,r){if(j.is(e))this.#s(e.table,r);else if(A.is(e)&&j.is(e.node))this.#s(e.node.table,r);else if(_t.is(e))for(let o of e.items)this.#n(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 _=class{#e;constructor(e){this.#e=new pr(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};var Po=i({is(t){return t.kind==="MatchedNode"},create(t,e=!1){return i({kind:"MatchedNode",not:t,bySource:e})}});function bi(t,e,r){return be.create(tt([Po.create(!t.isMatched,t.bySource),...e&&e.length>0?[e.length===3&&r?R(e[0],e[1],e[2]):O(e)]:[]],"and",!1))}function st(t){return v(t)?W.create([t],[]):b(t)?t.toOperationNode():t}var Qt=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 hr(t){let e=new Qt,r=new Qt;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 Qn=i([]),at=class{#e;constructor(e=Qn){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,r){return await this.provideConnection(async o=>{let n=await o.executeQuery(e);return"numUpdatedOrDeletedRows"in n&&Ae("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#t(n,r)})}async*stream(e,r,o){let{connection:n,release:a}=await hr(this);try{for await(let d of n.streamQuery(e,r))yield await this.#t(d,o)}finally{a()}}async#t(e,r){for(let o of this.#e)e=await o.transformResult({result:e,queryId:r});return e}};var Ci=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([])}},Be=new Ci;var cr=class{numChangedRows;constructor(e){this.numChangedRows=e}};var mr=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,se(e,r))})}using(...e){return new Qe({...this.#e,queryNode:I.cloneWithUsing(this.#e.queryNode,De("Using",e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,D(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,D(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,se(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:I.cloneWithWhen(this.#e.queryNode,bi({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,E(e))})}returningAll(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,D(e))})}output(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,E(e))})}outputAll(e){return new t({...this.#e,queryNode:u.cloneWithOutput(this.#e.queryNode,D(e))})}#r(e,r=!1,o=!1){let n={...this.#e,queryNode:I.cloneWithWhen(this.#e.queryNode,bi({isMatched:!1,bySource:o},e,r))},a=o?lr:vi;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,this.#e.queryId),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new cr(r.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=Z){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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:I.cloneWithThen(this.#e.queryNode,st("delete"))})}thenDoNothing(){return new Qe({...this.#e,queryNode:I.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenUpdate(e){return new Qe({...this.#e,queryNode:I.cloneWithThen(this.#e.queryNode,st(e(new ot({queryId:this.#e.queryId,executor:Be,queryNode:le.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(r=>r.set(...e))}},vi=class{#e;constructor(e){this.#e=i(e)}thenDoNothing(){return new Qe({...this.#e,queryNode:I.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenInsertValues(e){let[r,o]=ir(e);return new Qe({...this.#e,queryNode:I.cloneWithThen(this.#e.queryNode,st(S.cloneWith(S.createWithoutInto(),{columns:r,values:o})))})}};var ut=class t{#e;constructor(e){this.#e=i(e)}selectFrom(e){return Lt({queryId:m(),executor:this.#e.executor,queryNode:x.createFrom(ae(e),this.#e.withNode)})}selectNoFrom(e){return Lt({queryId:m(),executor:this.#e.executor,queryNode:x.cloneWithSelections(x.create(this.#e.withNode),E(e))})}insertInto(e){return new qt({queryId:m(),executor:this.#e.executor,queryNode:S.create(f(e),this.#e.withNode)})}replaceInto(e){return new qt({queryId:m(),executor:this.#e.executor,queryNode:S.create(f(e),this.#e.withNode,!0)})}deleteFrom(e){return new ar({queryId:m(),executor:this.#e.executor,queryNode:Ie.create(ae(e),this.#e.withNode)})}updateTable(e){return new ot({queryId:m(),executor:this.#e.executor,queryNode:le.create(ae(e),this.#e.withNode)})}mergeInto(e){return new mr({queryId:m(),executor:this.#e.executor,queryNode:I.create(Wi(e),this.#e.withNode)})}with(e,r){let o=gi(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=gi(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 _(e))})}};function Bo(){return new ut({executor:Be})}function Fo(t,e){return new er({joinNode:we.create(t,Ue(e))})}function Mo(){return new tr({overNode:It.create()})}function De(t,e){if(e.length===3)return Pn(t,e[0],e[1],e[2]);if(e.length===2)return Ln(t,e[0],e[1]);if(e.length===1)return Fn(t,e[0]);throw new Error("not implemented")}function Ln(t,e,r){return r(Fo(t,e)).toOperationNode()}function Pn(t,e,r,o){return we.createWithOn(t,Ue(e),R(r,"=",o))}function Fn(t,e){return we.create(t,Ue(e))}var zo=i({is(t){return t.kind==="OffsetNode"},create(t){return i({kind:"OffsetNode",offset:t})}});var Vo=i({is(t){return t.kind==="GroupByItemNode"},create(t){return i({kind:"GroupByItemNode",groupBy:t})}});function Uo(t){return t=T(t)?t(ne()):t,ge(t).map(Vo.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 Je(t,e,r){return T(e)&&(e=e(Nr())),L(e)||(e=[e]),e.map(o=>fr.create(t,$(o),r))}var y=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new Ti(ie.create(this.#e,O(e)))}and(...e){return new Si(J.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 A.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}},Ti=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new t(ie.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return me.create(this.#e)}},Si=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}and(...e){return new t(J.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return me.create(this.#e)}};var Jo={is(t){return t.kind==="FetchNode"},create(t,e){return{kind:"FetchNode",rowCount:k.create(t),modifier:e}}};function $o(t,e){if(!Se(t)&&!Ye(t))throw new Error(`Invalid fetch row count: ${t}`);if(!Mn(e))throw new Error(`Invalid fetch modifier: ${e}`);return Jo.create(t,e)}function Mn(t){return t==="only"||t==="with ties"}var ki=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,R(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,R(e,r,o))})}select(e){return new t({...this.#e,queryNode:x.cloneWithSelections(this.#e.queryNode,E(e))})}distinctOn(e){return new t({...this.#e,queryNode:x.cloneWithDistinctOn(this.#e.queryNode,ge(e))})}modifyFront(e){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,he.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.createWithExpression(e.toOperationNode()))})}distinct(){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,he.create("Distinct"))})}forUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("ForUpdate",e?kt(e).map(f):void 0))})}forShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("ForShare",e?kt(e).map(f):void 0))})}forKeyShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("ForKeyShare",e?kt(e).map(f):void 0))})}forNoKeyUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("ForNoKeyUpdate",e?kt(e).map(f):void 0))})}skipLocked(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("SkipLocked"))})}noWait(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,he.create("NoWait"))})}selectAll(e){return new t({...this.#e,queryNode:x.cloneWithSelections(this.#e.queryNode,D(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,De(e,r))})}orderBy(...e){return new t({...this.#e,queryNode:u.cloneWithOrderByItems(this.#e.queryNode,Y(e))})}groupBy(e){return new t({...this.#e,queryNode:x.cloneWithGroupByItems(this.#e.queryNode,Uo(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,zo.create(g(e)))})}fetch(e,r="only"){return new t({...this.#e,queryNode:x.cloneWithFetch(this.#e.queryNode,$o(e,r))})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,se(e,r))})}union(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("union",e,!1))})}unionAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("union",e,!0))})}intersect(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("intersect",e,!1))})}intersectAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("intersect",e,!0))})}except(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("except",e,!1))})}exceptAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("except",e,!0))})}as(e){return new Ei(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 y(this.toOperationNode())}$asScalar(){return new y(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,this.#e.queryId)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=Z){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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 Lt(t){return new ki(t)}var Ei=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 A.create(this.#e.toOperationNode(),p.create(this.#t))}};var Ne=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]?Oe.cloneWithItems(t[o],e):Oe.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 Ai=i({is(t){return t.kind==="FunctionNode"},create(t,e){return i({kind:"FunctionNode",func:t,arguments:e})}});var dt=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}as(e){return new Ri(this,e)}distinct(){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithDistinct(this.#e.aggregateFunctionNode)})}orderBy(...e){return new t({...this.#e,aggregateFunctionNode:u.cloneWithOrderByItems(this.#e.aggregateFunctionNode,Y(e))})}clearOrderBy(){return new t({...this.#e,aggregateFunctionNode:u.cloneWithoutOrderBy(this.#e.aggregateFunctionNode)})}withinGroupOrderBy(...e){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithOrderBy(this.#e.aggregateFunctionNode,Y(e),!0)})}filterWhere(...e){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithFilter(this.#e.aggregateFunctionNode,O(e))})}filterWhereRef(e,r,o){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithFilter(this.#e.aggregateFunctionNode,R(e,r,o))})}over(e){let r=Mo();return new t({...this.#e,aggregateFunctionNode:Ne.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}},Ri=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return A.create(this.#e.toOperationNode(),p.create(this.#t))}};function yr(){let t=(r,o)=>new y(Ai.create(r,ge(o??[]))),e=(r,o)=>new dt({aggregateFunctionNode:Ne.create(r,o?ge(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 dt({aggregateFunctionNode:Ne.create("count",D(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 dt({aggregateFunctionNode:Ne.create("json_agg",[v(r)?f(r):r.toOperationNode()])})},toJson(r){return new y(Ai.create("to_json",[v(r)?f(r):r.toOperationNode()]))}})}var Ko=i({is(t){return t.kind==="UnaryOperationNode"},create(t,e){return i({kind:"UnaryOperationNode",operator:t,operand:e})}});function jo(t,e){return Ko.create(G.create(t),B(e))}var X=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),be.cloneWithResult(t.when[t.when.length-1],e)]):void 0})},cloneWith(t,e){return i({...t,...e})}});var pt=class{#e;constructor(e){this.#e=i(e)}when(...e){return new wr({...this.#e,node:X.cloneWithWhen(this.#e.node,be.create(O(e)))})}},wr=class{#e;constructor(e){this.#e=i(e)}then(e){return new Ii({...this.#e,node:X.cloneWithThen(this.#e.node,Xt(e)?Rt(e):g(e))})}},Ii=class{#e;constructor(e){this.#e=i(e)}when(...e){return new wr({...this.#e,node:X.cloneWithWhen(this.#e.node,be.create(O(e)))})}else(e){return new Di({...this.#e,node:X.cloneWith(this.#e.node,{else:Xt(e)?Rt(e):g(e)})})}end(){return new y(X.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new y(X.cloneWith(this.#e.node,{isStatement:!0}))}},Di=class{#e;constructor(e){this.#e=i(e)}end(){return new y(X.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new y(X.cloneWith(this.#e.node,{isStatement:!0}))}};var qi=i({is(t){return t.kind==="JSONPathLegNode"},create(t,e){return i({kind:"JSONPathLegNode",type:t,value:e})}});var ht=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 xr(_e.cloneWithTraversal(this.#e,Re.is(this.#e.traversal)?Re.cloneWithLeg(this.#e.traversal,qi.create(e,r)):Ht.cloneWithValue(this.#e.traversal,k.createImmediate(r)))):new xr(Re.cloneWithLeg(this.#e,qi.create(e,r)))}},xr=class t extends ht{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new Bi(this,e)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},Bi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return A.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}};var Qi=i({is(t){return t.kind==="TupleNode"},create(t){return i({kind:"TupleNode",values:i(t)})}});var zn=["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"],Vn=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],Go=i({is(t){return t.kind==="DataTypeNode"},create(t){return i({kind:"DataTypeNode",dataType:t})}});function Ho(t){return!!(zn.includes(t)||Vn.some(e=>e.test(t)))}function ue(t){if(b(t))return t.toOperationNode();if(Ho(t))return Go.create(t);throw new Error(`invalid column data type ${JSON.stringify(t)}`)}var Yo=i({is(t){return t.kind==="CastNode"},create(t,e){return i({kind:"CastNode",expression:t,dataType:e})}});function Nr(t=Be){function e(n,a,d){return new y(Zt(n,a,d))}function r(n,a){return new y(jo(n,a))}let o=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(n){return Lt({queryId:m(),executor:t,queryNode:x.createFrom(ae(n))})},case(n){return new pt({node:X.create(K(n)?void 0:B(n))})},ref(n,a){return K(a)?new y(H(n)):new ht(xo(n,a))},jsonPath(){return new ht(Re.create())},table(n){return new y(f(n))},val(n){return new y(g(n))},refTuple(...n){return new y(Qi.create(n.map(B)))},tuple(...n){return new y(Qi.create(n.map(g)))},lit(n){return new y(Rt(n))},unary:r,not(n){return r("not",n)},exists(n){return r("exists",n)},neg(n){return r("-",n)},between(n,a,d){return new y(Ee.create(B(n),G.create("between"),J.create(g(a),g(d))))},betweenSymmetric(n,a,d){return new y(Ee.create(B(n),G.create("between symmetric"),J.create(g(a),g(d))))},and(n){return L(n)?new y(tt(n,"and")):new y(di(n,"and"))},or(n){return L(n)?new y(tt(n,"or")):new y(di(n,"or"))},parens(...n){let a=O(n);return me.is(a)?new y(a):new y(me.create(a))},cast(n,a){return new y(Yo.create(B(n),ue(a)))},withSchema(n){return Nr(t.withPluginAtFront(new _(n)))}});return o.fn=yr(),o.eb=o,o}function ne(t){return Nr()}function $(t){if(b(t))return t.toOperationNode();if(T(t))return t(ne()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(t)}`)}function rr(t){if(b(t))return t.toOperationNode();if(T(t))return t(ne()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(t)}`)}function xe(t){return Jt(t)||mo(t)||T(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 A.create(f(this.#e),p.create(this.#t))}};function Xo(t){return q(t)&&b(t)&&v(t.table)&&v(t.alias)}function ae(t){return L(t)?t.map(e=>Ue(e)):[Ue(t)]}function Ue(t){return v(t)?Wi(t):Xo(t)?t.toOperationNode():rr(t)}function Wi(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(Zo);return A.create(f(r),p.create(o))}else return f(t)}function f(t){let e=".";if(t.includes(e)){let[r,o]=t.split(e).map(Zo);return j.createWithSchema(r,o)}else return j.create(t)}function Zo(t){return t.trim()}var Pi=i({is(t){return t.kind==="AddColumnNode"},create(t){return i({kind:"AddColumnNode",column:t})}});var C=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 Fi=i({is(t){return t.kind==="DropColumnNode"},create(t){return i({kind:"DropColumnNode",column:c.create(t)})}});var Mi=i({is(t){return t.kind==="RenameColumnNode"},create(t,e){return i({kind:"RenameColumnNode",column:c.create(t),renameTo:c.create(e)})}});var ct=i({is(t){return t.kind==="CheckConstraintNode"},create(t,e){return i({kind:"CheckConstraintNode",expression:t,name:e?p.create(e):void 0})}});var _o=["no action","restrict","cascade","set null","set default"],mt=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 b(t)?t.toOperationNode():k.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 en=i({is(t){return t.kind==="DefaultValueNode"},create(t){return i({kind:"DefaultValueNode",defaultValue:t})}});function lt(t){if(_o.includes(t))return t;throw new Error(`invalid OnModifyForeignAction ${t}`)}var Ce=class t{#e;constructor(e){this.#e=e}autoIncrement(){return new t(C.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new t(C.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new t(C.cloneWith(this.#e,{primaryKey:!0}))}references(e){let r=H(e);if(!r.table||Xe.is(r.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new t(C.cloneWith(this.#e,{references:mt.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(C.cloneWith(this.#e,{references:mt.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(C.cloneWith(this.#e,{references:mt.cloneWithOnUpdate(this.#e.references,lt(e))}))}unique(){return new t(C.cloneWith(this.#e,{unique:!0}))}notNull(){return new t(C.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new t(C.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new t(C.cloneWith(this.#e,{defaultTo:en.create(Or(e))}))}check(e){return new t(C.cloneWith(this.#e,{check:ct.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new t(C.cloneWith(this.#e,{generated:Ft.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new t(C.cloneWith(this.#e,{generated:Ft.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new t(C.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(C.cloneWith(this.#e,{generated:Ft.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new t(C.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new t(C.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new t(C.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new t(C.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};var zi=i({is(t){return t.kind==="ModifyColumnNode"},create(t){return i({kind:"ModifyColumnNode",column:t})}});var de=i({is(t){return t.kind==="ForeignKeyConstraintNode"},create(t,e,r,o){return i({kind:"ForeignKeyConstraintNode",columns:t,references:mt.create(e,r),name:o?p.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(de.cloneWith(this.#e,{onDelete:lt(e)}))}onUpdate(e){return new t(de.cloneWith(this.#e,{onUpdate:lt(e)}))}deferrable(){return new t(de.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(de.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(de.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(de.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 ye=i({is(t){return t.kind==="UniqueConstraintNode"},create(t,e,r){return i({kind:"UniqueConstraintNode",columns:i(t.map(c.create)),name:e?p.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:p.create(t)})},cloneWith(t,e){return i({...t,...e})}});var wt=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 $e(wt.create(this.#e,"dataType",ue(e)))}setDefault(e){return new $e(wt.create(this.#e,"setDefault",Or(e)))}dropDefault(){return new $e(wt.create(this.#e,"dropDefault",!0))}setNotNull(){return new $e(wt.create(this.#e,"setNotNull",!0))}dropNotNull(){return new $e(wt.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},$e=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};var ve=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(),this.#e.queryId)}};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(l.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(),this.#e.queryId)}};var zt=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new t({...this.#e,node:l.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(),this.#e.queryId)}};var We=i({is(t){return t.kind==="PrimaryKeyConstraintNode"},create(t,e){return i({kind:"PrimaryKeyConstraintNode",columns:i(t.map(c.create)),name:e?p.create(e):void 0})},cloneWith(t,e){return i({...t,...e})}});var Le=i({is(t){return t.kind==="AddIndexNode"},create(t){return i({kind:"AddIndexNode",name:p.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:l.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,[et(e)])})})}columns(e){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,e.map(et))})})}expression(e){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new t({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Le.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(),this.#e.queryId)}};var xt=class t{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new t(ye.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(ye.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(ye.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(We.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(We.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(We.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(We.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 tn=i({is(t){return t.kind==="RenameConstraintNode"},create(t,e){return i({kind:"RenameConstraintNode",oldName:p.create(t),newName:p.create(e)})}});var vr=class{#e;constructor(e){this.#e=i(e)}renameTo(e){return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{renameTo:f(e)})})}setSchema(e){return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{setSchema:p.create(e)})})}alterColumn(e,r){let o=r(new Mt(e));return new Ke({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new Ke({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Fi.create(e))})}renameColumn(e,r){return new Ke({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Mi.create(e,r))})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new Ke({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Pi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new Ke({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,zi.create(n.toOperationNode()))})}addUniqueConstraint(e,r,o=z){let n=o(new xt(ye.create(r,e)));return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addCheckConstraint(e,r,o=z){let n=o(new Ot(ct.create(r.toOperationNode(),e)));return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addForeignKeyConstraint(e,r,o,n,a=z){let d=a(new ft(de.create(r.map(c.create),f(o),n.map(c.create),e)));return new br({...this.#e,constraintBuilder:d})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(We.create(r,e)));return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}dropConstraint(e){return new zt({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropConstraint:yt.create(e)})})}renameConstraint(e,r){return new zt({...this.#e,node:l.cloneWithTableProps(this.#e.node,{renameConstraint:tn.create(e,r)})})}addIndex(e){return new Cr({...this.#e,node:l.cloneWithTableProps(this.#e.node,{addIndex:Le.create(e)})})}dropIndex(e){return new ve({...this.#e,node:l.cloneWithTableProps(this.#e.node,{dropIndex:ke.create(e)})})}$call(e){return e(this)}},Ke=class t{#e;constructor(e){this.#e=i(e)}alterColumn(e,r){let o=r(new Mt(e));return new t({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new t({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Fi.create(e))})}renameColumn(e,r){return new t({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Mi.create(e,r))})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,Pi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:l.cloneWithColumnAlteration(this.#e.node,zi.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(),this.#e.queryId)}};var bt=class extends qe{transformPrimitiveValueList(e){return ce.create(e.values.map(k.createImmediate))}transformValue(e){return k.createImmediate(e.value)}};var Wr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new t({...this.#e,node:re.cloneWith(this.#e.node,{table:f(e)})})}column(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,[et(e)])})}columns(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,e.map(et))})}expression(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new t({...this.#e,node:re.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(),this.#e.queryId)}};var Tr=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(),this.#e.queryId)}};function rn(t){if(co.includes(t))return t;throw new Error(`invalid OnCommitAction ${t}`)}var Sr=class t{#e;constructor(e){this.#e=i(e)}temporary(){return new t({...this.#e,node:P.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new t({...this.#e,node:P.cloneWith(this.#e.node,{onCommit:rn(e)})})}ifNotExists(){return new t({...this.#e,node:P.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:P.cloneWithColumn(this.#e.node,n.toOperationNode())})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(We.create(r,e)));return new t({...this.#e,node:P.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addUniqueConstraint(e,r,o=z){let n=o(new xt(ye.create(r,e)));return new t({...this.#e,node:P.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addCheckConstraint(e,r,o=z){let n=o(new Ot(ct.create(r.toOperationNode(),e)));return new t({...this.#e,node:P.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addForeignKeyConstraint(e,r,o,n,a=z){let d=a(new ft(de.create(r.map(c.create),f(o),n.map(c.create),e)));return new t({...this.#e,node:P.cloneWithConstraint(this.#e.node,d.toOperationNode())})}modifyFront(e){return new t({...this.#e,node:P.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new t({...this.#e,node:P.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new t({...this.#e,node:P.cloneWith(this.#e.node,{selectQuery:$(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(),this.#e.queryId)}};var kr=class t{#e;constructor(e){this.#e=i(e)}on(e){return new t({...this.#e,node:ke.cloneWith(this.#e.node,{table:f(e)})})}ifExists(){return new t({...this.#e,node:ke.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:ke.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(),this.#e.queryId)}};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(),this.#e.queryId)}};var Ar=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:At.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:At.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(),this.#e.queryId)}};var pe=i({is(t){return t.kind==="CreateViewNode"},create(t){return i({kind:"CreateViewNode",name:F.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:pe.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{columns:e.map(si)})})}as(e){let r=e.withPlugin(new Rr).toOperationNode();return new t({...this.#e,node:pe.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(),this.#e.queryId)}};var Ct=i({is(t){return t.kind==="DropViewNode"},create(t){return i({kind:"DropViewNode",name:F.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(),this.#e.queryId)}};var qr=i({is(t){return t.kind==="CreateTypeNode"},create(t){return i({kind:"CreateTypeNode",name:t})},cloneWithEnum(t,e){return i({...t,enum:ce.create(e.map(k.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(),this.#e.queryId)}};var Qr=i({is(t){return t.kind==="DropTypeNode"},create(t){return i({kind:"DropTypeNode",name:t})},cloneWith(t,e){return i({...t,...e})}});var Lr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Qr.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(),this.#e.queryId)}};function Vi(t){let e=".";if(t.includes(e)){let r=t.split(e).map(Un);if(r.length===2)return F.createWithSchema(r[0],r[1]);throw new Error(`invalid schemable identifier ${t}`)}else return F.create(t)}function Un(t){return t.trim()}var vt=i({is(t){return t.kind==="RefreshMaterializedViewNode"},create(t){return i({kind:"RefreshMaterializedViewNode",name:F.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(),this.#e.queryId)}};var Fr=class t{#e;constructor(e){this.#e=e}createTable(e){return new Sr({queryId:m(),executor:this.#e,node:P.create(f(e))})}dropTable(e){return new Ar({queryId:m(),executor:this.#e,node:At.create(f(e))})}createIndex(e){return new Wr({queryId:m(),executor:this.#e,node:re.create(e)})}dropIndex(e){return new kr({queryId:m(),executor:this.#e,node:ke.create(e)})}createSchema(e){return new Tr({queryId:m(),executor:this.#e,node:Ut.create(e)})}dropSchema(e){return new Er({queryId:m(),executor:this.#e,node:Et.create(e)})}alterTable(e){return new vr({queryId:m(),executor:this.#e,node:l.create(f(e))})}createView(e){return new Ir({queryId:m(),executor:this.#e,node:pe.create(e)})}refreshMaterializedView(e){return new Pr({queryId:m(),executor:this.#e,node:vt.create(e)})}dropView(e){return new Dr({queryId:m(),executor:this.#e,node:Ct.create(e)})}createType(e){return new Br({queryId:m(),executor:this.#e,node:qr.create(Vi(e))})}dropType(e){return new Lr({queryId:m(),executor:this.#e,node:Qr.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 _(e)))}};var Mr=class{ref(e){return new Kt(e)}table(e){return new gr(e)}};var zr=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 Vr=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"&&T(performance.now)?performance.now():Date.now()}var Jr=class{#e;#t;#r;#i;#o;#a=new WeakSet;constructor(e,r){this.#i=!1,this.#e=e,this.#t=r}async init(){if(this.#o)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.#o)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.#d()&&this.#n(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.#o||(this.#o=this.#e.destroy().catch(e=>(this.#o=void 0,Promise.reject(e)))),await this.#o)}#d(){return this.#t.isLevelEnabled("query")||this.#t.isLevelEnabled("error")}#n(e){let r=e.executeQuery,o=e.streamQuery,n=this;e.executeQuery=async a=>{let d,h=Ur();try{return await r.call(e,a)}catch(w){throw d=w,await n.#s(w,a,h),w}finally{d||await n.#u(a,h)}},e.streamQuery=async function*(a,d){let h,w=Ur();try{for await(let N of o.call(e,a,d))yield N}catch(N){throw h=N,await n.#s(N,a,w),N}finally{h||await n.#u(a,w,!0)}}}async#s(e,r,o){await this.#t.error(()=>({level:"error",error:e,query:r,queryDurationMillis:this.#p(o)}))}async#u(e,r,o=!1){await this.#t.query(()=>({level:"query",isStream:o,query:e,queryDurationMillis:this.#p(r)}))}#p(e){return Ur()-e}};var Jn=()=>{},Wt=class{#e;#t;constructor(e){this.#e=e}async provideConnection(e){for(;this.#t;)await this.#t.catch(Jn);return this.#t=this.#r(e).finally(()=>{this.#t=void 0}),this.#t}async#r(e){return await e(this.#e)}};var $n=["read only","read write"],Kn=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function Ui(t){if(t.accessMode&&!$n.includes(t.accessMode))throw new Error(`invalid transaction access mode ${t.accessMode}`);if(t.isolationLevel&&!Kn.includes(t.isolationLevel))throw new Error(`invalid transaction isolation level ${t.isolationLevel}`)}var jv=i(["query","error"]),$r=class{#e;#t;constructor(e){T(e)?(this.#t=e,this.#e=i({query:!0,error:!0})):(this.#t=jn,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 jn(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 on(t){return q(t)&&T(t.compile)}Symbol.asyncDispose??=Symbol("Symbol.asyncDispose");var Tt=class t extends ut{#e;constructor(e){let r,o;if(Gn(e))r={executor:e.executor},o={...e};else{let n=e.dialect,a=n.createDriver(),d=n.createQueryCompiler(),h=n.createAdapter(),w=new $r(e.log??[]),N=new Jr(a,w),M=new zr(N),ee=new Vr(d,h,M,e.plugins??[]);r={executor:ee},o={config:e,executor:ee,dialect:n,driver:N}}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 pt({node:X.create(K(e)?void 0:$(e))})}get fn(){return yr()}transaction(){return new $i({...this.#e})}startTransaction(){return new Ki({...this.#e})}connection(){return new Ji({...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 _(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=m()){let o=on(e)?e.compile():e;return this.getExecutor().executeQuery(o,r)}async[Symbol.asyncDispose](){await this.destroy()}},Kr=class t extends Tt{#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 _(e))})}withTables(){return new t({...this.#e})}};function Gn(t){return q(t)&&q(t.config)&&q(t.driver)&&q(t.executor)&&q(t.dialect)}var Ji=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 Tt({...this.#e,executor:o});return await e(n)})}},$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(e){let{isolationLevel:r,accessMode:o,...n}=this.#e,a={isolationLevel:r,accessMode:o};return Ui(a),this.#e.executor.provideConnection(async d=>{let h=this.#e.executor.withConnectionProvider(new Wt(d)),w=new Kr({...n,executor:h});try{await this.#e.driver.beginTransaction(d,a);let N=await e(w);return await this.#e.driver.commitTransaction(d),N}catch(N){throw await this.#e.driver.rollbackTransaction(d),N}})}},Ki=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};Ui(n);let a=await hr(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 Kr{#e;#t;#r;constructor(e){let r={isCommitted:!1,isRolledBack:!1};e={...e,executor:new Gi(e.executor,r)};let{connection:o,...n}=e;super(n),this.#e=i(e),this.#r=r;let a=m();this.#t=d=>e.executor.compileQuery(d,a)}get isCommitted(){return this.#r.isCommitted}get isRolledBack(){return this.#r.isRolledBack}commit(){return Ge(this.#r),new je(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#r.isCommitted=!0,this.#e.connection.release()})}rollback(){return Ge(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 Ge(this.#r),new je(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}rollbackToSavepoint(e){return Ge(this.#r),new je(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}releaseSavepoint(e){return Ge(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 _(e))})}withTables(){return new t({...this.#e})}},je=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function Ge(t){if(t.isCommitted)throw new Error("Transaction is already committed");if(t.isRolledBack)throw new Error("Transaction is already rolled back")}var Gi=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,r){return Ge(this.#t),this.#e.executeQuery(e,r)}stream(e,r,o){return Ge(this.#t),this.#e.stream(e,r,o)}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 Hi=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),this.#e.queryId)}#t(e){let r=e!==void 0?e.getExecutor():Be;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 Te(t){return new Hi(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 A.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}};var U=Object.assign((t,...e)=>Te({queryId:m(),rawNode:W.create(t,e?.map(nn)??[])}),{ref(t){return Te({queryId:m(),rawNode:W.createWithChild(H(t))})},val(t){return Te({queryId:m(),rawNode:W.createWithChild(g(t))})},value(t){return this.val(t)},table(t){return Te({queryId:m(),rawNode:W.createWithChild(f(t))})},id(...t){let e=new Array(t.length+1).fill(".");return e[0]="",e[e.length-1]="",Te({queryId:m(),rawNode:W.create(e,t.map(p.create))})},lit(t){return Te({queryId:m(),rawNode:W.createWithChild(k.createImmediate(t))})},literal(t){return this.lit(t)},raw(t){return Te({queryId:m(),rawNode:W.createWithSql(t)})},join(t,e=U`, `){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]=nn(t[n]),n!==t.length-1&&(r[2*n+1]=o);return Te({queryId:m(),rawNode:W.createWithChildren(r)})}});function nn(t){return b(t)?t.toOperationNode():g(t)}var jr=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 Hn=/'/g,Gr=class extends jr{#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&&!me.is(this.parentNode)&&!S.is(this.parentNode)&&!P.is(this.parentNode)&&!pe.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.nodeStack.find(u.is),o=r!==e;!o&&e.explain&&(this.visitNode(e.explain),this.append(" ")),o&&!I.is(r)&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append(e.replace?"replace":"insert"),e.ignore&&(Ae("`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)),o&&!I.is(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.nodeStack.find(u.is)!==e;!r&&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(!v(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(Xn[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.nodeStack.find(u.is),o=r!==e;if(!o&&e.explain&&(this.visitNode(e.explain),this.append(" ")),o&&!I.is(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)),o&&!I.is(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 "),Me(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(Yn[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 G.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(Hn,"''")}addParameter(e){this.#t.push(e)}appendImmediateValue(e){if(v(e))this.appendStringLiteral(e);else if(Se(e)||Me(e))this.append(e.toString());else if(He(e))this.append("null");else if(ho(e))this.appendImmediateValue(e.toISOString());else if(Ye(e))this.appendImmediateValue(e.toString());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?sn[r.modifier]-sn[o.modifier]:1),i(e)}compileColumnAlterations(e){this.compileList(e)}announcesNewColumnDataType(){return!0}},Yn=i({ForKeyShare:"for key share",ForNoKeyUpdate:"for no key update",ForUpdate:"for update",ForShare:"for share",NoWait:"nowait",SkipLocked:"skip locked",Distinct:"distinct"}),sn=i({ForKeyShare:1,ForNoKeyUpdate:1,ForUpdate:1,ForShare:1,NoWait:2,SkipLocked:2,Distinct:0}),Xn=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 Hr=class{async init(){}async acquireConnection(){return new Xi}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},Xi=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};var Yr=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}get supportsOutput(){return!1}};var Zn=/"/g,Xr=class extends Gr{sanitizeIdentifier(e){return e.replace(Zn,'""')}};var _n=BigInt("3853314791062309107"),Zr=class extends Yr{get supportsTransactionalDdl(){return!0}get supportsReturning(){return!0}async acquireMigrationLock(e,r){await U`select pg_advisory_xact_lock(${U.lit(_n)})`.execute(e)}async releaseMigrationLock(e,r){}};function an(t){return new Tt({dialect:{createAdapter:()=>new t.Adapter,createDriver:()=>new Hr,createIntrospector:()=>null,createQueryCompiler:()=>new t.QueryCompiler},plugins:[...t.noParameters?[new Zi]:[]]})}var Zi=class{#e=new _i;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},_i=class extends qe{transformPrimitiveValueList(e){return ce.create(e.values.map(k.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function Pe(t){let e=t.compile();return{parameters:e.parameters,sql:e.sql}}function eo(t,e){let r=ts(t,e);return o=>o.where(n=>n.or(r.map(a=>n.and(a.map(([d,h])=>n(d,h===null?"is":"=",h))))))}function es(t,e){return Object.entries(Object.values(e).reduce((r,o)=>{let{isInPrimaryKey:n,name:a}=o;return n&&(r[a]=t[a]??null),r},{}))}function ts(t,e){return t.map(r=>es(r,e))}function Fe(t){return an({...t,Adapter:Zr,QueryCompiler:Xr})}function to(t,e){let{table:r,rows:o}=t,{name:n,schema:a,columns:d}=r,h=Fe(e),w=Object.keys(d),N={[w[0]]:U`default`};return Pe(h.withSchema(a).insertInto(n).values(o.map(M=>Object.keys(M).length===0?N:M)).returning(w).returning(M=>M.cast("ctid","text").as("ctid")))}function ro(t,e){let{pageIndex:r,pageSize:o,sortOrder:n,table:{name:a,schema:d,columns:h},filters:w={kind:"ColumnFilters",after:"and",filters:[]}}=t,N=Fe(e),M=Object.keys(h),ee=N.withSchema(d).selectFrom(a).select(te=>te.cast(te.fn.coalesce(te.fn.countAll(),U.lit(0)),"text").as("oid"));return Pe(N.with("count",()=>ee).withSchema(d).selectFrom([a,"count"]).select(U.ref("count.oid").$castTo().as("oid")).select(te=>te.cast("ctid","text").as("ctid")).select(M).$call(te=>n.reduce((Vt,St)=>Vt.orderBy(St.column,St.direction),te)).where(un(w.filters)).limit(o).offset(U.lit(BigInt(r)*BigInt(o))))}function rs(t){return t.kind==="ColumnFilter"?e=>e(e.ref(t.column),t.operator,t.value):un(t.filters)}function un(t){if(t.length===0)return o=>o.lit(!0);let e=[],r=[];for(let o=0;o<t.length;o++)r.push(rs(t[o])),(o===t.length-1||t[o].after==="or")&&(e.push(r),r=[]);return o=>{let n=e.map(a=>o.and(a.map(d=>d(o))));return o.or(n)}}function is(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),ctid:"(0,1)",deleted_at:null,id:1,name:"John Doe",oid:"2",role:"admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),ctid:"(0,2)",deleted_at:null,id:2,name:"Jane Doe",oid:"2",role:"poweruser"}]}function io(t,e){let{changes:r,row:o,table:{columns:n,name:a,schema:d}}=t,h=Fe(e),w=Object.keys(n);return Pe(h.withSchema(d).updateTable(a).set(r).$call(eo([o],n)).returning(w).returning(N=>[N.cast("ctid","text").as("ctid"),N.cast(N.fn("floor",[N(N.fn("extract",[U`epoch from now()`]),"*",1e6)]),"text").as("__ps_updated_at__")]))}function oo(t,e){let{rows:r,table:{columns:o,name:n,schema:a}}=t,d=Fe(e);return Pe(d.withSchema(a).deleteFrom(n).$call(eo(r,o)))}function dn(t){return U`(select coalesce(json_agg(agg), '[]') from ${t} as agg)`}var os="r",ns="v",ss=[os,ns];function no(t){return Pe(Fe(t).selectFrom("pg_catalog.pg_class as cls").innerJoin("pg_catalog.pg_namespace as ns","cls.relnamespace","ns.oid").$call(as).where("cls.relkind","in",ss).select(e=>["ns.nspname as schema","cls.relname as name",dn(e.selectFrom("pg_catalog.pg_attribute as att").innerJoin("pg_catalog.pg_type as typ","typ.oid","att.atttypid").innerJoin("pg_catalog.pg_namespace as tns","tns.oid","typ.typnamespace").leftJoin("pg_catalog.pg_constraint as con",r=>r.on("con.contype","=","p").onRef("con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("con.conkey")))).whereRef("att.attrelid","=","cls.oid").where("att.attnum",">=",0).where("att.attisdropped","!=",!0).select(["att.attname as name","typ.typname as datatype","tns.nspname as datatype_schema"]).select(r=>[r("con.conkey","is not",null).$castTo().as("pk"),r("att.attgenerated","!=","").$castTo().as("computed"),r("att.attnotnull","!=",!0).$castTo().as("nullable"),r.fn.coalesce(r.selectFrom("pg_catalog.pg_enum as enm").whereRef("enm.enumtypid","=","typ.oid").select(o=>o.fn.jsonAgg(o.ref("enm.enumlabel")).as("o")),U`'[]'`).as("options")])).as("columns")]))}function so(){return[{schema:"public",name:"users",columns:[{name:"id",datatype:"bigint",datatype_schema:"public",pk:!0,computed:!1,options:[],nullable:!0},{name:"name",datatype:"varchar",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0},{name:"role",datatype:"role",datatype_schema:"public",pk:!1,computed:!1,options:["admin","maintainer","member"],nullable:!0},{name:"created_at",datatype:"timestamptz",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0},{name:"deleted_at",datatype:"timestamptz",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0}]}]}function ao(){let t=Fe();return Pe(t.selectNoFrom(t.fn("current_setting",[U.lit("timezone")]).as("timezone")))}function uo(){return[{timezone:"UTC"}]}function as(t){return t.where("ns.nspname","!~","^pg_").where("ns.nspname","!=","information_schema")}function us(t){let{executor:e,...r}=t;return{defaultSchema:"public",async introspect(o){try{let n=no(r),a=ao(),[[d,h],[w,N]]=await Promise.all([e.execute(n,o),e.execute(a,o)]),M=d||w;if(M)return[M];let[ee]=N;return ee?[null,pn(h,ee.timezone)]:[new Error("Timezone not found")]}catch(n){return[n]}},async query(o,n){try{let a=ro(o,r),[d,h]=await e.execute(a,n);return d?[d]:[null,{filteredRowCount:h[0]?.oid||"0",rows:h}]}catch(a){return[a]}},async insert(o,n){try{let a=to(o,r),[d,h]=await e.execute(a,n);return d?[d]:[null,{rows:h}]}catch(a){return[a]}},async update(o,n){try{let a=io(o,r),[d,h]=await e.execute(a,n);if(d)return[d];let[w]=h;return w?[null,{row:w}]:[new Error("Update failed")]}catch(a){return[a]}},async delete(o,n){try{let a=oo(o,r),[d]=await e.execute(a,n);return d?[d]:[null,o]}catch(a){return[a]}}}}function pn(t,e){return t.reduce((r,o)=>{let{schemas:n}=r,{columns:a,name:d,schema:h}=o,w=a.reduce((N,M)=>{let{datatype:ee,datatype_schema:te,name:Vt,options:St,nullable:hn}=M,_r=ee.startsWith("_"),ei=_r?ee.slice(1):ee;return{...N,[Vt]:{datatype:{...po[ei]||{group:St.length>0?"enum":"raw"},isArray:_r,isNative:te==="pg_catalog",name:_r?`${ei}[]`:ei,options:St,schema:te},isComputed:M.computed,isInPrimaryKey:M.pk,name:Vt,nullable:hn,schema:h,table:d}}},{});return(n[h]||={tables:{}}).tables[d]={columns:w,name:d,schema:h},r},{schemas:{public:{tables:{}}},timezone:e,filterOperators:ds})}var ds=["=","!=",">",">=","<","<=","in","not in","is","is not","like","not like","ilike","not ilike"];function ps(){let t=so(),[{timezone:e}]=uo();return pn(t,e)}0&&(module.exports={createPostgresAdapter,getDeleteQuery,getInsertQuery,getSelectQuery,getTablesQuery,getTimezoneQuery,getUpdateQuery,mockIntrospect,mockSelectQuery,mockTablesQuery,mockTimezoneQuery});
|
|
1
|
+
"use strict";var ti=Object.defineProperty;var hn=Object.getOwnPropertyDescriptor;var ln=Object.getOwnPropertyNames;var mn=Object.prototype.hasOwnProperty;var fn=(t,e)=>{for(var r in e)ti(t,r,{get:e[r],enumerable:!0})},Nn=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ln(e))!mn.call(t,n)&&n!==r&&ti(t,n,{get:()=>e[n],enumerable:!(o=hn(e,n))||o.enumerable});return t};var yn=t=>Nn(ti({},"__esModule",{value:!0}),t);var cs={};fn(cs,{createPostgresAdapter:()=>us,getDeleteQuery:()=>oo,getInsertQuery:()=>to,getSelectQuery:()=>ro,getTablesQuery:()=>no,getTimezoneQuery:()=>ao,getUpdateQuery:()=>io,mockIntrospect:()=>ps,mockSelectQuery:()=>is,mockTablesQuery:()=>so,mockTimezoneQuery:()=>uo});module.exports=yn(cs);var po={bool:{group:"boolean"},boolean:{group:"boolean"},bytea:{group:"string"},char:{group:"string"},citext:{group:"string"},date:{group:"datetime"},interval:{group:"string"},name:{group:"string"},varchar:{group:"string"},text:{group:"string"},time:{group:"time"},timestamp:{group:"datetime"},timestamptz:{group:"datetime"},"timestamp without time zone":{group:"datetime"},"timestamp with time zone":{group:"datetime"},timetz:{group:"time"},"time without time zone":{group:"time"},"time with time zone":{group:"datetime"},uuid:{group:"string"},int2:{group:"numeric"},int4:{group:"numeric"},int8:{group:"numeric"},smallint:{group:"numeric"},integer:{group:"numeric"},bigint:{group:"numeric"},decimal:{group:"numeric"},numeric:{group:"numeric"},real:{group:"numeric"},float4:{group:"numeric"},float8:{group:"numeric"},"double precision":{group:"numeric"},json:{group:"json"},jsonb:{group:"json"}};function j(t){return typeof t>"u"||t===void 0}function v(t){return typeof t=="string"}function Te(t){return typeof t=="number"}function Me(t){return typeof t=="boolean"}function He(t){return t===null}function co(t){return t instanceof Date}function Ye(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 St(t){return P(t)?t:[t]}function P(t){return Array.isArray(t)}function z(t){return t}var m=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 p=i({is(t){return t.kind==="IdentifierNode"},create(t){return i({kind:"IdentifierNode",name:t})}});var re=i({is(t){return t.kind==="CreateIndexNode"},create(t){return i({kind:"CreateIndexNode",name:p.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:p.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var ho=["preserve rows","delete rows","drop"],F=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 M=i({is(t){return t.kind==="SchemableIdentifierNode"},create(t){return i({kind:"SchemableIdentifierNode",identifier:p.create(t)})},createWithSchema(t,e){return i({kind:"SchemableIdentifierNode",schema:p.create(t),identifier:p.create(e)})}});var Se=i({is(t){return t.kind==="DropIndexNode"},create(t,e){return i({kind:"DropIndexNode",name:M.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var Et=i({is(t){return t.kind==="DropSchemaNode"},create(t,e){return i({kind:"DropSchemaNode",schema:p.create(t),...e})},cloneWith(t,e){return i({...t,...e})}});var At=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 R=i({is(t){return t.kind==="AliasNode"},create(t,e){return i({kind:"AliasNode",node:t,alias:e})}});var G=i({is(t){return t.kind==="TableNode"},create(t){return i({kind:"TableNode",table:M.create(t)})},createWithSchema(t,e){return i({kind:"TableNode",table:M.createWithSchema(t,e)})}});function b(t){return B(t)&&k(t.toOperationNode)}function Jt(t){return B(t)&&"expressionType"in t&&b(t)}function lo(t){return B(t)&&"expression"in t&&v(t.alias)&&b(t)}var ce=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 J=i({is(t){return t.kind==="AndNode"},create(t,e){return i({kind:"AndNode",left:t,right:e})}});var ie=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"?J.create(t.on,r):ie.create(t.on,r)})}});var we=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 Ee=i({is(t){return t.kind==="BinaryOperationNode"},create(t,e,r){return i({kind:"BinaryOperationNode",leftOperand:t,operator:e,rightOperand:r})}});var wn=["=","==","!=","<>",">",">=","<","<=","in","not in","is","is not","like","not like","match","ilike","not ilike","@>","<@","^@","&&","?","?&","?|","!<","!>","<=>","!~","~","~*","!~*","@@","@@@","!!","<->","regexp","is distinct from","is not distinct from"],xn=["+","-","*","/","%","^","&","|","#","<<",">>"],mo=["->","->>"],gn=[...wn,...xn,"&&","||"],On=["exists","not exists"],bn=["not","-",...On],fo=[...gn,...mo,...bn,"between","between symmetric"],H=i({is(t){return t.kind==="OperatorNode"},create(t){return i({kind:"OperatorNode",operator:t})}});function ri(t){return v(t)&&mo.includes(t)}var h=i({is(t){return t.kind==="ColumnNode"},create(t){return i({kind:"ColumnNode",column:p.create(t)})}});var Xe=i({is(t){return t.kind==="SelectAllNode"},create(){return i({kind:"SelectAllNode"})}});var Ze=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:Xe.create()})}});var Kt=class{#e;get dynamicReference(){return this.#e}get refType(){}constructor(e){this.#e=e}toOperationNode(){return ii(this.#e)}};function jt(t){return B(t)&&b(t)&&v(t.dynamicReference)}var oe=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 No={is(t){return t.kind==="CollateNode"},create(t){return i({kind:"CollateNode",collation:p.create(t)})}};var Gt=class t{#e;constructor(e){this.#e=i(e)}desc(){return new t({node:oe.cloneWith(this.#e.node,{direction:W.createWithSql("desc")})})}asc(){return new t({node:oe.cloneWith(this.#e.node,{direction:W.createWithSql("asc")})})}nullsLast(){return new t({node:oe.cloneWith(this.#e.node,{nulls:"last"})})}nullsFirst(){return new t({node:oe.cloneWith(this.#e.node,{nulls:"first"})})}collate(e){return new t({node:oe.cloneWith(this.#e.node,{collation:No.create(e)})})}toOperationNode(){return this.#e.node}};var yo=new Set;function Ae(t){yo.has(t)||(yo.add(t),console.log(t))}function ni(t){return t==="asc"||t==="desc"}function X(t){if(t.length===2)return[oi(t[0],t[1])];if(t.length===1){let[e]=t;return Array.isArray(e)?(Ae("orderBy(array) is deprecated, use multiple orderBy calls instead."),e.map(r=>oi(r))):[oi(e)]}throw new Error(`Invalid number of arguments at order by! expected 1-2, received ${t.length}`)}function oi(t,e){let r=Cn(t);if(oe.is(r)){if(e)throw new Error("Cannot specify direction twice!");return r}return wo(r,e)}function Cn(t){if(xe(t))return $(t);if(jt(t))return t.toOperationNode();let[e,r]=t.split(" ");return r?(Ae("`orderBy('column asc')` is deprecated. Use `orderBy('column', 'asc')` instead."),wo(Y(e),r)):Y(t)}function wo(t,e){if(typeof e=="string"){if(!ni(e))throw new Error(`Invalid order by direction: ${e}`);return oe.create(t,W.createWithSql(e))}if(Jt(e))return Ae("`orderBy(..., expr)` is deprecated. Use `orderBy(..., 'asc')` or `orderBy(..., (ob) => ...)` instead."),oe.create(t,e.toOperationNode());let r=oe.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 Ht=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 Re=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 ii(t){return v(t)?Y(t):t.toOperationNode()}function ge(t){return P(t)?t.map(e=>Q(e)):[Q(t)]}function Q(t){return xe(t)?$(t):ii(t)}function xo(t,e){let r=Y(t);if(ri(e))return _e.create(r,Ht.create(H.create(e)));let o=e.slice(0,-1);if(ri(o))return _e.create(r,Re.create(H.create(o)));throw new Error(`Invalid JSON operator: ${e}`)}function Y(t){let e=".";if(!t.includes(e))return Ze.create(h.create(t));let r=t.split(e).map(ai);if(r.length===3)return vn(r);if(r.length===2)return Wn(r);throw new Error(`invalid column reference ${t}`)}function go(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(ai);return R.create(Y(r),p.create(o))}else return Y(t)}function si(t){return h.create(t)}function et(t){let e=" ";if(t.includes(e)){let[r,o]=t.split(e).map(ai);if(!ni(o))throw new Error(`invalid order direction "${o}" next to "${r}"`);return X([r,o])[0]}else return si(t)}function vn(t){let[e,r,o]=t;return Ze.create(h.create(o),G.createWithSchema(e,r))}function Wn(t){let[e,r]=t;return Ze.create(h.create(r),G.create(e))}function ai(t){return t.trim()}var Yt=i({is(t){return t.kind==="PrimitiveValueListNode"},create(t){return i({kind:"PrimitiveValueListNode",values:i([...t])})}});var he=i({is(t){return t.kind==="ValueListNode"},create(t){return i({kind:"ValueListNode",values:i(t)})}});var S=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 Oo(t){return P(t)?kn(t):g(t)}function g(t){return xe(t)?$(t):S.create(t)}function Xt(t){return Te(t)||Me(t)||He(t)}function Rt(t){if(!Xt(t))throw new Error(`unsafe immediate value ${JSON.stringify(t)}`);return S.createImmediate(t)}function kn(t){return t.some(xe)?he.create(t.map(e=>g(e))):Yt.create(t)}var le=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 Tn(e)&&Co(r)?Ee.create(Q(t),ui(e),S.createImmediate(r)):Ee.create(Q(t),ui(e),Oo(r))}function I(t,e,r){return Ee.create(Q(t),ui(e),Q(r))}function di(t,e){return tt(Object.entries(t).filter(([,r])=>!j(r)).map(([r,o])=>Zt(r,Co(o)?"is":"=",o)),e)}function tt(t,e,r=!0){let o=e==="and"?J.create:ie.create;if(t.length===0)return Ee.create(S.createImmediate(1),H.create("="),S.createImmediate(e==="and"?1:0));let n=bo(t[0]);for(let a=1;a<t.length;++a)n=o(n,bo(t[a]));return t.length>1&&r?le.create(n):n}function Tn(t){return t==="is"||t==="is not"}function Co(t){return He(t)||Me(t)}function ui(t){if(v(t)&&fo.includes(t))return H.create(t);if(b(t))return t.toOperationNode();throw new Error(`invalid operator ${JSON.stringify(t)}`)}function bo(t){return b(t)?t.toOperationNode():t}var Oe=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?Oe.cloneWithItems(t.orderBy,e):Oe.create(e)})},cloneWithPartitionByItems(t,e){return i({...t,partitionBy:t.partitionBy?pi.cloneWithItems(t.partitionBy,e):pi.create(e)})}});var ze=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 ci=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 hi=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"?J.create(t.having,r):ie.create(t.having,r)})}});var T=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 me=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?ze.cloneWithFroms(t.from,e):ze.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 li=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 Ie=i({is(t){return t.kind==="DeleteQueryNode"},create(t,e){return i({kind:"DeleteQueryNode",from:ze.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?li.cloneWithTables(t.using,e):li.create(e)})}});var L=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"?J.create(t.where,r):ie.create(t.where,r)})}});var mi=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 vo=i({is(t){return t.kind==="ExplainNode"},create(t,e){return i({kind:"ExplainNode",format:t,options:e})}});var be=i({is(t){return t.kind==="WhenNode"},create(t){return i({kind:"WhenNode",condition:t})},cloneWithResult(t,e){return i({...t,result:e})}});var D=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),be.cloneWithResult(t.whens[t.whens.length-1],e)]):void 0})}});var fi=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)||T.is(t)||me.is(t)||Ie.is(t)||D.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?L.cloneWithOperation(t.where,"And",e):L.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?mi.cloneWithSelections(t.returning,e):mi.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:vo.create(e,r?.toOperationNode())})},cloneWithTop(t,e){return i({...t,top:e})},cloneWithOutput(t,e){return i({...t,output:t.output?fi.cloneWithSelections(t.output,e):fi.create(e)})},cloneWithOrderByItems(t,e){return i({...t,orderBy:t.orderBy?Oe.cloneWithItems(t.orderBy,e):Oe.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:ze.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?ci.cloneWithItems(t.groupBy,e):ci.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?hi.cloneWithOperation(t.having,"And",e):hi.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:we.cloneWithOn(this.#e.joinNode,O(e))})}onRef(e,r,o){return new t({...this.#e,joinNode:we.cloneWithOn(this.#e.joinNode,I(e,r,o))})}onTrue(){return new t({...this.#e,joinNode:we.cloneWithOn(this.#e.joinNode,W.createWithSql("true"))})}$call(e){return e(this)}toOperationNode(){return this.#e.joinNode}};var Wo=i({is(t){return t.kind==="PartitionByItemNode"},create(t){return i({kind:"PartitionByItemNode",partitionBy:t})}});function ko(t){return ge(t).map(Wo.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,ko(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:Xe.create()})},createSelectAllFromTable(t){return i({kind:"SelectionNode",selection:Ze.createSelectAll(t)})}});function E(t){return k(t)?E(t(ne())):P(t)?t.map(e=>To(e)):[To(t)]}function To(t){return v(t)?rt.create(go(t)):jt(t)?rt.create(t.toOperationNode()):rt.create(rr(t))}function q(t){return t?Array.isArray(t)?t.map(So):[So(t)]:[rt.createSelectAll()]}function So(t){if(v(t))return rt.createSelectAllFromTable(f(t));throw new Error(`invalid value selectAll expression: ${JSON.stringify(t)}`)}var Eo=i({is(t){return t.kind==="ValuesNode"},create(t){return i({kind:"ValuesNode",values:i(t)})}});var Ao=i({is(t){return t.kind==="DefaultInsertValueNode"},create(){return i({kind:"DefaultInsertValueNode"})}});function ir(t){let e=k(t)?t(ne()):t,r=P(e)?e:i([e]);return Sn(r)}function Sn(t){let e=En(t);return[i([...e.keys()].map(h.create)),Eo.create(t.map(r=>An(r,e)))]}function En(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 An(t,e){let r=Object.keys(t),o=Array.from({length:e.size}),n=!1,a=r.length;for(let c of r){let w=e.get(c);if(j(w)){a--;continue}let N=t[c];(j(N)||xe(N))&&(n=!0),o[w]=N}if(a<e.size||n){let c=Ao.create();return he.create(o.map(w=>j(w)?c:g(w)))}return Yt.create(o)}var Ni=i({is(t){return t.kind==="ColumnUpdateNode"},create(t,e){return i({kind:"ColumnUpdateNode",column:t,value:e})}});function Ro(...t){return t.length===2?[Ni.create(Q(t[0]),g(t[1]))]:Dt(t[0])}function Dt(t){let e=k(t)?t(ne()):t;return Object.entries(e).filter(([r,o])=>o!==void 0).map(([r,o])=>Ni.create(h.create(r),g(o)))}var Io=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 _=class extends Error{node;constructor(e){super("no result"),this.node=e}};function fe(t){return Object.prototype.hasOwnProperty.call(t,"prototype")}var V=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?L.cloneWithOperation(t.indexWhere,"And",e):L.create(e)})},cloneWithIndexOrWhere(t,e){return i({...t,indexWhere:t.indexWhere?L.cloneWithOperation(t.indexWhere,"Or",e):L.create(e)})},cloneWithUpdateWhere(t,e){return i({...t,updateWhere:t.updateWhere?L.cloneWithOperation(t.updateWhere,"And",e):L.create(e)})},cloneWithUpdateOrWhere(t,e){return i({...t,updateWhere:t.updateWhere?L.cloneWithOperation(t.updateWhere,"Or",e):L.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=h.create(e);return new t({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{columns:this.#e.onConflictNode.columns?i([...this.#e.onConflictNode.columns,r]):i([r])})})}columns(e){let r=e.map(h.create);return new t({...this.#e,onConflictNode:V.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:V.cloneWith(this.#e.onConflictNode,{constraint:p.create(e)})})}expression(e){return new t({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{indexExpression:e.toOperationNode()})})}where(...e){return new t({...this.#e,onConflictNode:V.cloneWithIndexWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:V.cloneWithIndexWhere(this.#e.onConflictNode,I(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:V.cloneWithoutIndexWhere(this.#e.onConflictNode)})}doNothing(){return new yi({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{doNothing:!0})})}doUpdateSet(e){return new wi({...this.#e,onConflictNode:V.cloneWith(this.#e.onConflictNode,{updates:Dt(e)})})}$call(e){return e(this)}},yi=class{#e;constructor(e){this.#e=i(e)}toOperationNode(){return this.#e.onConflictNode}},wi=class t{#e;constructor(e){this.#e=i(e)}where(...e){return new t({...this.#e,onConflictNode:V.cloneWithUpdateWhere(this.#e.onConflictNode,O(e))})}whereRef(e,r,o){return new t({...this.#e,onConflictNode:V.cloneWithUpdateWhere(this.#e.onConflictNode,I(e,r,o))})}clearWhere(){return new t({...this.#e,onConflictNode:V.cloneWithoutUpdateWhere(this.#e.onConflictNode)})}$call(e){return e(this)}toOperationNode(){return this.#e.onConflictNode}};var Do=i({is(t){return t.kind==="TopNode"},create(t,e){return i({kind:"TopNode",expression:t,modifiers:e})}});function se(t,e){if(!Te(t)&&!Ye(t))throw new Error(`Invalid top expression: ${t}`);if(!j(e)&&!Rn(e))throw new Error(`Invalid top modifiers: ${e}`);return Do.create(t,e)}function Rn(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:T.cloneWith(this.#e.queryNode,{columns:r,values:o})})}columns(e){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{columns:i(e.map(h.create))})})}expression(e){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{values:$(e)})})}defaultValues(){return new t({...this.#e,queryNode:T.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:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orIgnore(){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("ignore")})})}orAbort(){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("abort")})})}orFail(){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("fail")})})}orReplace(){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("replace")})})}orRollback(){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{orAction:Ve.create("rollback")})})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,se(e,r))})}onConflict(e){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{onConflict:e(new nr({onConflictNode:V.create()})).toOperationNode()})})}onDuplicateKeyUpdate(e){return new t({...this.#e,queryNode:T.cloneWith(this.#e.queryNode,{onDuplicateKey:Io.create(Dt(e))})})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(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,E(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,this.#e.queryId),{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=_){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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,I(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,se(e,r))})}using(e){return new t({...this.#e,queryNode:Ie.cloneWithUsing(this.#e.queryNode,ae(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,De(e,r))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(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,E(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:Ie.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:Ie.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,this.#e.queryId),{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=_){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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,I(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,se(e,r))})}from(e){return new t({...this.#e,queryNode:me.cloneWithFromItems(this.#e.queryNode,ae(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,De(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:me.cloneWithLimit(this.#e.queryNode,it.create(g(e)))})}set(...e){return new t({...this.#e,queryNode:me.cloneWithUpdates(this.#e.queryNode,Ro(...e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(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,E(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,this.#e.queryId),{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=_){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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:G.create(t),columns:e?i(e.map(h.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 dr=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 gi(t,e){let r=e(Bo()).toOperationNode();return k(t)?t(In(r)).toOperationNode():nt.create(qo(t),r)}function In(t){return e=>new dr({node:nt.create(qo(e),t)})}function qo(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 Qo=["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 Lo(t){let e="";for(let r=0;r<t;++r)e+=Dn();return e}function Dn(){return Qo[~~(Math.random()*Qo.length)]}function l(){return new Oi}var Oi=class{#e;get queryId(){return this.#e===void 0&&(this.#e=Lo(8)),this.#e}};var qe=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 qn=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}),Bn={json_agg:!0,to_json:!0},pr=class extends qe{#e;#t=new Set;#r=new Set;constructor(e){super(),this.#e=e}transformNodeImpl(e,r){if(!this.#o(e))return super.transformNodeImpl(e,r);let o=this.#d(e);for(let d of o)this.#r.add(d);let n=this.#a(e);for(let d of n)this.#t.add(d);let a=super.transformNodeImpl(e,r);for(let d of n)this.#t.delete(d);for(let d of o)this.#r.delete(d);return a}transformSchemableIdentifier(e,r){let o=super.transformSchemableIdentifier(e,r);return o.schema||!this.#t.has(e.identifier.name)?o:{...o,schema:p.create(this.#e)}}transformReferences(e,r){let o=super.transformReferences(e,r);return o.table.table.schema?o:{...o,table:G.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 Bn[e.func]?e[o].map(n=>!G.is(n)||n.table.schema?this.transformNode(n,r):{...n,table:this.transformIdentifier(n.table.identifier,r)}):this.transformNodeList(e[o],r)}#o(e){return e.kind in qn}#a(e){let r=new Set;if("name"in e&&e.name&&M.is(e.name)&&this.#s(e.name,r),"from"in e&&e.from)for(let o of e.from.froms)this.#n(o,r);if("into"in e&&e.into&&this.#n(e.into,r),"table"in e&&e.table&&this.#n(e.table,r),"joins"in e&&e.joins)for(let o of e.joins)this.#n(o.table,r);return"using"in e&&e.using&&this.#n(e.using,r),r}#d(e){let r=new Set;return"with"in e&&e.with&&this.#u(e.with,r),r}#n(e,r){if(G.is(e))this.#s(e.table,r);else if(R.is(e)&&G.is(e.node))this.#s(e.node.table,r);else if(_t.is(e))for(let o of e.items)this.#n(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 ee=class{#e;constructor(e){this.#e=new pr(e)}transformQuery(e){return this.#e.transformNode(e.node,e.queryId)}async transformResult(e){return e.result}};var Po=i({is(t){return t.kind==="MatchedNode"},create(t,e=!1){return i({kind:"MatchedNode",not:t,bySource:e})}});function bi(t,e,r){return be.create(tt([Po.create(!t.isMatched,t.bySource),...e&&e.length>0?[e.length===3&&r?I(e[0],e[1],e[2]):O(e)]:[]],"and",!1))}function st(t){return v(t)?W.create([t],[]):b(t)?t.toOperationNode():t}var Qt=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 Qt,r=new Qt;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 Qn=i([]),at=class{#e;constructor(e=Qn){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,r){return await this.provideConnection(async o=>{let n=await o.executeQuery(e);return"numUpdatedOrDeletedRows"in n&&Ae("kysely:warning: outdated driver/plugin detected! `QueryResult.numUpdatedOrDeletedRows` has been replaced with `QueryResult.numAffectedRows`."),await this.#t(n,r)})}async*stream(e,r,o){let{connection:n,release:a}=await cr(this);try{for await(let d of n.streamQuery(e,r))yield await this.#t(d,o)}finally{a()}}async#t(e,r){for(let o of this.#e)e=await o.transformResult({result:e,queryId:r});return e}};var Ci=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([])}},Be=new Ci;var hr=class{numChangedRows;constructor(e){this.numChangedRows=e}};var lr=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,se(e,r))})}using(...e){return new Qe({...this.#e,queryNode:D.cloneWithUsing(this.#e.queryNode,De("Using",e))})}returning(e){return new t({...this.#e,queryNode:u.cloneWithReturning(this.#e.queryNode,E(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,E(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,se(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 mr({...this.#e,queryNode:D.cloneWithWhen(this.#e.queryNode,bi({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,E(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,E(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:D.cloneWithWhen(this.#e.queryNode,bi({isMatched:!1,bySource:o},e,r))},a=o?mr:vi;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,this.#e.queryId),{adapter:o}=this.#e.executor,n=e.query;return n.returning&&o.supportsReturning||n.output&&o.supportsOutput?r.rows:[new hr(r.numAffectedRows)]}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=_){let r=await this.executeTakeFirst();if(r===void 0)throw fe(e)?new e(this.toOperationNode()):e(this.toOperationNode());return r}},mr=class{#e;constructor(e){this.#e=i(e)}thenDelete(){return new Qe({...this.#e,queryNode:D.cloneWithThen(this.#e.queryNode,st("delete"))})}thenDoNothing(){return new Qe({...this.#e,queryNode:D.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenUpdate(e){return new Qe({...this.#e,queryNode:D.cloneWithThen(this.#e.queryNode,st(e(new ot({queryId:this.#e.queryId,executor:Be,queryNode:me.createWithoutTable()}))))})}thenUpdateSet(...e){return this.thenUpdate(r=>r.set(...e))}},vi=class{#e;constructor(e){this.#e=i(e)}thenDoNothing(){return new Qe({...this.#e,queryNode:D.cloneWithThen(this.#e.queryNode,st("do nothing"))})}thenInsertValues(e){let[r,o]=ir(e);return new Qe({...this.#e,queryNode:D.cloneWithThen(this.#e.queryNode,st(T.cloneWith(T.createWithoutInto(),{columns:r,values:o})))})}};var ut=class t{#e;constructor(e){this.#e=i(e)}selectFrom(e){return Lt({queryId:l(),executor:this.#e.executor,queryNode:x.createFrom(ae(e),this.#e.withNode)})}selectNoFrom(e){return Lt({queryId:l(),executor:this.#e.executor,queryNode:x.cloneWithSelections(x.create(this.#e.withNode),E(e))})}insertInto(e){return new qt({queryId:l(),executor:this.#e.executor,queryNode:T.create(f(e),this.#e.withNode)})}replaceInto(e){return new qt({queryId:l(),executor:this.#e.executor,queryNode:T.create(f(e),this.#e.withNode,!0)})}deleteFrom(e){return new ar({queryId:l(),executor:this.#e.executor,queryNode:Ie.create(ae(e),this.#e.withNode)})}updateTable(e){return new ot({queryId:l(),executor:this.#e.executor,queryNode:me.create(ae(e),this.#e.withNode)})}mergeInto(e){return new lr({queryId:l(),executor:this.#e.executor,queryNode:D.create(Wi(e),this.#e.withNode)})}with(e,r){let o=gi(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=gi(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 ee(e))})}};function Bo(){return new ut({executor:Be})}function Fo(t,e){return new er({joinNode:we.create(t,Ue(e))})}function Mo(){return new tr({overNode:It.create()})}function De(t,e){if(e.length===3)return Pn(t,e[0],e[1],e[2]);if(e.length===2)return Ln(t,e[0],e[1]);if(e.length===1)return Fn(t,e[0]);throw new Error("not implemented")}function Ln(t,e,r){return r(Fo(t,e)).toOperationNode()}function Pn(t,e,r,o){return we.createWithOn(t,Ue(e),I(r,"=",o))}function Fn(t,e){return we.create(t,Ue(e))}var zo=i({is(t){return t.kind==="OffsetNode"},create(t){return i({kind:"OffsetNode",offset:t})}});var Vo=i({is(t){return t.kind==="GroupByItemNode"},create(t){return i({kind:"GroupByItemNode",groupBy:t})}});function Uo(t){return t=k(t)?t(ne()):t,ge(t).map(Vo.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 Je(t,e,r){return k(e)&&(e=e(Nr())),P(e)||(e=[e]),e.map(o=>fr.create(t,$(o),r))}var y=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new ki(ie.create(this.#e,O(e)))}and(...e){return new Ti(J.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 R.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}},ki=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}or(...e){return new t(ie.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return le.create(this.#e)}},Ti=class t{#e;constructor(e){this.#e=e}get expressionType(){}as(e){return new Pt(this,e)}and(...e){return new t(J.create(this.#e,O(e)))}$castTo(){return new t(this.#e)}toOperationNode(){return le.create(this.#e)}};var Jo={is(t){return t.kind==="FetchNode"},create(t,e){return{kind:"FetchNode",rowCount:S.create(t),modifier:e}}};function $o(t,e){if(!Te(t)&&!Ye(t))throw new Error(`Invalid fetch row count: ${t}`);if(!Mn(e))throw new Error(`Invalid fetch modifier: ${e}`);return Jo.create(t,e)}function Mn(t){return t==="only"||t==="with ties"}var Si=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,I(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,I(e,r,o))})}select(e){return new t({...this.#e,queryNode:x.cloneWithSelections(this.#e.queryNode,E(e))})}distinctOn(e){return new t({...this.#e,queryNode:x.cloneWithDistinctOn(this.#e.queryNode,ge(e))})}modifyFront(e){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,ce.createWithExpression(e.toOperationNode()))})}modifyEnd(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.createWithExpression(e.toOperationNode()))})}distinct(){return new t({...this.#e,queryNode:x.cloneWithFrontModifier(this.#e.queryNode,ce.create("Distinct"))})}forUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.create("ForUpdate",e?St(e).map(f):void 0))})}forShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.create("ForShare",e?St(e).map(f):void 0))})}forKeyShare(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.create("ForKeyShare",e?St(e).map(f):void 0))})}forNoKeyUpdate(e){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.create("ForNoKeyUpdate",e?St(e).map(f):void 0))})}skipLocked(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.create("SkipLocked"))})}noWait(){return new t({...this.#e,queryNode:u.cloneWithEndModifier(this.#e.queryNode,ce.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,De(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,Uo(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,zo.create(g(e)))})}fetch(e,r="only"){return new t({...this.#e,queryNode:x.cloneWithFetch(this.#e.queryNode,$o(e,r))})}top(e,r){return new t({...this.#e,queryNode:u.cloneWithTop(this.#e.queryNode,se(e,r))})}union(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("union",e,!1))})}unionAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("union",e,!0))})}intersect(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("intersect",e,!1))})}intersectAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("intersect",e,!0))})}except(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("except",e,!1))})}exceptAll(e){return new t({...this.#e,queryNode:x.cloneWithSetOperations(this.#e.queryNode,Je("except",e,!0))})}as(e){return new Ei(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 y(this.toOperationNode())}$asScalar(){return new y(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,this.#e.queryId)).rows}async executeTakeFirst(){let[e]=await this.execute();return e}async executeTakeFirstOrThrow(e=_){let r=await this.executeTakeFirst();if(r===void 0)throw fe(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,this.#e.queryId);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 Lt(t){return new Si(t)}var Ei=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 R.create(this.#e.toOperationNode(),p.create(this.#t))}};var Ne=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]?Oe.cloneWithItems(t[o],e):Oe.create(e)})},cloneWithFilter(t,e){return i({...t,filter:t.filter?L.cloneWithOperation(t.filter,"And",e):L.create(e)})},cloneWithOrFilter(t,e){return i({...t,filter:t.filter?L.cloneWithOperation(t.filter,"Or",e):L.create(e)})},cloneWithOver(t,e){return i({...t,over:e})}});var Ai=i({is(t){return t.kind==="FunctionNode"},create(t,e){return i({kind:"FunctionNode",func:t,arguments:e})}});var dt=class t{#e;constructor(e){this.#e=i(e)}get expressionType(){}as(e){return new Ri(this,e)}distinct(){return new t({...this.#e,aggregateFunctionNode:Ne.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:Ne.cloneWithOrderBy(this.#e.aggregateFunctionNode,X(e),!0)})}filterWhere(...e){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithFilter(this.#e.aggregateFunctionNode,O(e))})}filterWhereRef(e,r,o){return new t({...this.#e,aggregateFunctionNode:Ne.cloneWithFilter(this.#e.aggregateFunctionNode,I(e,r,o))})}over(e){let r=Mo();return new t({...this.#e,aggregateFunctionNode:Ne.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}},Ri=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return R.create(this.#e.toOperationNode(),p.create(this.#t))}};function yr(){let t=(r,o)=>new y(Ai.create(r,ge(o??[]))),e=(r,o)=>new dt({aggregateFunctionNode:Ne.create(r,o?ge(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 dt({aggregateFunctionNode:Ne.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 dt({aggregateFunctionNode:Ne.create("json_agg",[v(r)?f(r):r.toOperationNode()])})},toJson(r){return new y(Ai.create("to_json",[v(r)?f(r):r.toOperationNode()]))}})}var Ko=i({is(t){return t.kind==="UnaryOperationNode"},create(t,e){return i({kind:"UnaryOperationNode",operator:t,operand:e})}});function jo(t,e){return Ko.create(H.create(t),Q(e))}var Z=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),be.cloneWithResult(t.when[t.when.length-1],e)]):void 0})},cloneWith(t,e){return i({...t,...e})}});var pt=class{#e;constructor(e){this.#e=i(e)}when(...e){return new wr({...this.#e,node:Z.cloneWithWhen(this.#e.node,be.create(O(e)))})}},wr=class{#e;constructor(e){this.#e=i(e)}then(e){return new Ii({...this.#e,node:Z.cloneWithThen(this.#e.node,Xt(e)?Rt(e):g(e))})}},Ii=class{#e;constructor(e){this.#e=i(e)}when(...e){return new wr({...this.#e,node:Z.cloneWithWhen(this.#e.node,be.create(O(e)))})}else(e){return new Di({...this.#e,node:Z.cloneWith(this.#e.node,{else:Xt(e)?Rt(e):g(e)})})}end(){return new y(Z.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new y(Z.cloneWith(this.#e.node,{isStatement:!0}))}},Di=class{#e;constructor(e){this.#e=i(e)}end(){return new y(Z.cloneWith(this.#e.node,{isStatement:!1}))}endCase(){return new y(Z.cloneWith(this.#e.node,{isStatement:!0}))}};var qi=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 xr(_e.cloneWithTraversal(this.#e,Re.is(this.#e.traversal)?Re.cloneWithLeg(this.#e.traversal,qi.create(e,r)):Ht.cloneWithValue(this.#e.traversal,S.createImmediate(r)))):new xr(Re.cloneWithLeg(this.#e,qi.create(e,r)))}},xr=class t extends ct{#e;constructor(e){super(e),this.#e=e}get expressionType(){}as(e){return new Bi(this,e)}$castTo(){return new t(this.#e)}$notNull(){return new t(this.#e)}toOperationNode(){return this.#e}},Bi=class{#e;#t;constructor(e,r){this.#e=e,this.#t=r}get expression(){return this.#e}get alias(){return this.#t}toOperationNode(){return R.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}};var Qi=i({is(t){return t.kind==="TupleNode"},create(t){return i({kind:"TupleNode",values:i(t)})}});var zn=["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"],Vn=[/^varchar\(\d+\)$/,/^char\(\d+\)$/,/^decimal\(\d+, \d+\)$/,/^numeric\(\d+, \d+\)$/,/^binary\(\d+\)$/,/^datetime\(\d+\)$/,/^time\(\d+\)$/,/^timetz\(\d+\)$/,/^timestamp\(\d+\)$/,/^timestamptz\(\d+\)$/,/^varbinary\(\d+\)$/],Go=i({is(t){return t.kind==="DataTypeNode"},create(t){return i({kind:"DataTypeNode",dataType:t})}});function Ho(t){return!!(zn.includes(t)||Vn.some(e=>e.test(t)))}function ue(t){if(b(t))return t.toOperationNode();if(Ho(t))return Go.create(t);throw new Error(`invalid column data type ${JSON.stringify(t)}`)}var Yo=i({is(t){return t.kind==="CastNode"},create(t,e){return i({kind:"CastNode",expression:t,dataType:e})}});function Nr(t=Be){function e(n,a,d){return new y(Zt(n,a,d))}function r(n,a){return new y(jo(n,a))}let o=Object.assign(e,{fn:void 0,eb:void 0,selectFrom(n){return Lt({queryId:l(),executor:t,queryNode:x.createFrom(ae(n))})},case(n){return new pt({node:Z.create(j(n)?void 0:Q(n))})},ref(n,a){return j(a)?new y(Y(n)):new ct(xo(n,a))},jsonPath(){return new ct(Re.create())},table(n){return new y(f(n))},val(n){return new y(g(n))},refTuple(...n){return new y(Qi.create(n.map(Q)))},tuple(...n){return new y(Qi.create(n.map(g)))},lit(n){return new y(Rt(n))},unary:r,not(n){return r("not",n)},exists(n){return r("exists",n)},neg(n){return r("-",n)},between(n,a,d){return new y(Ee.create(Q(n),H.create("between"),J.create(g(a),g(d))))},betweenSymmetric(n,a,d){return new y(Ee.create(Q(n),H.create("between symmetric"),J.create(g(a),g(d))))},and(n){return P(n)?new y(tt(n,"and")):new y(di(n,"and"))},or(n){return P(n)?new y(tt(n,"or")):new y(di(n,"or"))},parens(...n){let a=O(n);return le.is(a)?new y(a):new y(le.create(a))},cast(n,a){return new y(Yo.create(Q(n),ue(a)))},withSchema(n){return Nr(t.withPluginAtFront(new ee(n)))}});return o.fn=yr(),o.eb=o,o}function ne(t){return Nr()}function $(t){if(b(t))return t.toOperationNode();if(k(t))return t(ne()).toOperationNode();throw new Error(`invalid expression: ${JSON.stringify(t)}`)}function rr(t){if(b(t))return t.toOperationNode();if(k(t))return t(ne()).toOperationNode();throw new Error(`invalid aliased expression: ${JSON.stringify(t)}`)}function xe(t){return Jt(t)||lo(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 R.create(f(this.#e),p.create(this.#t))}};function Xo(t){return B(t)&&b(t)&&v(t.table)&&v(t.alias)}function ae(t){return P(t)?t.map(e=>Ue(e)):[Ue(t)]}function Ue(t){return v(t)?Wi(t):Xo(t)?t.toOperationNode():rr(t)}function Wi(t){let e=" as ";if(t.includes(e)){let[r,o]=t.split(e).map(Zo);return R.create(f(r),p.create(o))}else return f(t)}function f(t){let e=".";if(t.includes(e)){let[r,o]=t.split(e).map(Zo);return G.createWithSchema(r,o)}else return G.create(t)}function Zo(t){return t.trim()}var Pi=i({is(t){return t.kind==="AddColumnNode"},create(t){return i({kind:"AddColumnNode",column:t})}});var C=i({is(t){return t.kind==="ColumnDefinitionNode"},create(t,e){return i({kind:"ColumnDefinitionNode",column:h.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 Fi=i({is(t){return t.kind==="DropColumnNode"},create(t){return i({kind:"DropColumnNode",column:h.create(t)})}});var Mi=i({is(t){return t.kind==="RenameColumnNode"},create(t,e){return i({kind:"RenameColumnNode",column:h.create(t),renameTo:h.create(e)})}});var ht=i({is(t){return t.kind==="CheckConstraintNode"},create(t,e){return i({kind:"CheckConstraintNode",expression:t,name:e?p.create(e):void 0})}});var _o=["no action","restrict","cascade","set null","set default"],lt=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 b(t)?t.toOperationNode():S.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 en=i({is(t){return t.kind==="DefaultValueNode"},create(t){return i({kind:"DefaultValueNode",defaultValue:t})}});function mt(t){if(_o.includes(t))return t;throw new Error(`invalid OnModifyForeignAction ${t}`)}var Ce=class t{#e;constructor(e){this.#e=e}autoIncrement(){return new t(C.cloneWith(this.#e,{autoIncrement:!0}))}identity(){return new t(C.cloneWith(this.#e,{identity:!0}))}primaryKey(){return new t(C.cloneWith(this.#e,{primaryKey:!0}))}references(e){let r=Y(e);if(!r.table||Xe.is(r.column))throw new Error(`invalid call references('${e}'). The reference must have format table.column or schema.table.column`);return new t(C.cloneWith(this.#e,{references:lt.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(C.cloneWith(this.#e,{references:lt.cloneWithOnDelete(this.#e.references,mt(e))}))}onUpdate(e){if(!this.#e.references)throw new Error("on update constraint can only be added for foreign keys");return new t(C.cloneWith(this.#e,{references:lt.cloneWithOnUpdate(this.#e.references,mt(e))}))}unique(){return new t(C.cloneWith(this.#e,{unique:!0}))}notNull(){return new t(C.cloneWith(this.#e,{notNull:!0}))}unsigned(){return new t(C.cloneWith(this.#e,{unsigned:!0}))}defaultTo(e){return new t(C.cloneWith(this.#e,{defaultTo:en.create(Or(e))}))}check(e){return new t(C.cloneWith(this.#e,{check:ht.create(e.toOperationNode())}))}generatedAlwaysAs(e){return new t(C.cloneWith(this.#e,{generated:Ft.createWithExpression(e.toOperationNode())}))}generatedAlwaysAsIdentity(){return new t(C.cloneWith(this.#e,{generated:Ft.create({identity:!0,always:!0})}))}generatedByDefaultAsIdentity(){return new t(C.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(C.cloneWith(this.#e,{generated:Ft.cloneWith(this.#e.generated,{stored:!0})}))}modifyFront(e){return new t(C.cloneWithFrontModifier(this.#e,e.toOperationNode()))}nullsNotDistinct(){return new t(C.cloneWith(this.#e,{nullsNotDistinct:!0}))}ifNotExists(){return new t(C.cloneWith(this.#e,{ifNotExists:!0}))}modifyEnd(e){return new t(C.cloneWithEndModifier(this.#e,e.toOperationNode()))}$call(e){return e(this)}toOperationNode(){return this.#e}};var zi=i({is(t){return t.kind==="ModifyColumnNode"},create(t){return i({kind:"ModifyColumnNode",column:t})}});var de=i({is(t){return t.kind==="ForeignKeyConstraintNode"},create(t,e,r,o){return i({kind:"ForeignKeyConstraintNode",columns:t,references:lt.create(e,r),name:o?p.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(de.cloneWith(this.#e,{onDelete:mt(e)}))}onUpdate(e){return new t(de.cloneWith(this.#e,{onUpdate:mt(e)}))}deferrable(){return new t(de.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(de.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(de.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(de.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 ye=i({is(t){return t.kind==="UniqueConstraintNode"},create(t,e,r){return i({kind:"UniqueConstraintNode",columns:i(t.map(h.create)),name:e?p.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:p.create(t)})},cloneWith(t,e){return i({...t,...e})}});var wt=i({is(t){return t.kind==="AlterColumnNode"},create(t,e,r){return i({kind:"AlterColumnNode",column:h.create(t),[e]:r})}});var Mt=class{#e;constructor(e){this.#e=e}setDataType(e){return new $e(wt.create(this.#e,"dataType",ue(e)))}setDefault(e){return new $e(wt.create(this.#e,"setDefault",Or(e)))}dropDefault(){return new $e(wt.create(this.#e,"dropDefault",!0))}setNotNull(){return new $e(wt.create(this.#e,"setNotNull",!0))}dropNotNull(){return new $e(wt.create(this.#e,"dropNotNull",!0))}$call(e){return e(this)}},$e=class{#e;constructor(e){this.#e=e}toOperationNode(){return this.#e}};var ve=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(),this.#e.queryId)}};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(m.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(),this.#e.queryId)}};var zt=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{ifExists:!0})})})}cascade(){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{dropConstraint:yt.cloneWith(this.#e.node.dropConstraint,{modifier:"cascade"})})})}restrict(){return new t({...this.#e,node:m.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(),this.#e.queryId)}};var We=i({is(t){return t.kind==="PrimaryKeyConstraintNode"},create(t,e){return i({kind:"PrimaryKeyConstraintNode",columns:i(t.map(h.create)),name:e?p.create(e):void 0})},cloneWith(t,e){return i({...t,...e})}});var Le=i({is(t){return t.kind==="AddIndexNode"},create(t){return i({kind:"AddIndexNode",name:p.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:m.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWith(this.#e.node.addIndex,{unique:!0})})})}column(e){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,[et(e)])})})}columns(e){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,e.map(et))})})}expression(e){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addIndex:Le.cloneWithColumns(this.#e.node.addIndex,[e.toOperationNode()])})})}using(e){return new t({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addIndex:Le.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(),this.#e.queryId)}};var xt=class t{#e;constructor(e){this.#e=e}nullsNotDistinct(){return new t(ye.cloneWith(this.#e,{nullsNotDistinct:!0}))}deferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(ye.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(ye.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(ye.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(We.cloneWith(this.#e,{deferrable:!0}))}notDeferrable(){return new t(We.cloneWith(this.#e,{deferrable:!1}))}initiallyDeferred(){return new t(We.cloneWith(this.#e,{initiallyDeferred:!0}))}initiallyImmediate(){return new t(We.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 tn=i({is(t){return t.kind==="RenameConstraintNode"},create(t,e){return i({kind:"RenameConstraintNode",oldName:p.create(t),newName:p.create(e)})}});var vr=class{#e;constructor(e){this.#e=i(e)}renameTo(e){return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{renameTo:f(e)})})}setSchema(e){return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{setSchema:p.create(e)})})}alterColumn(e,r){let o=r(new Mt(e));return new Ke({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new Ke({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Fi.create(e))})}renameColumn(e,r){return new Ke({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Mi.create(e,r))})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new Ke({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Pi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new Ke({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,zi.create(n.toOperationNode()))})}addUniqueConstraint(e,r,o=z){let n=o(new xt(ye.create(r,e)));return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addCheckConstraint(e,r,o=z){let n=o(new Ot(ht.create(r.toOperationNode(),e)));return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}addForeignKeyConstraint(e,r,o,n,a=z){let d=a(new ft(de.create(r.map(h.create),f(o),n.map(h.create),e)));return new br({...this.#e,constraintBuilder:d})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(We.create(r,e)));return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addConstraint:Nt.create(n.toOperationNode())})})}dropConstraint(e){return new zt({...this.#e,node:m.cloneWithTableProps(this.#e.node,{dropConstraint:yt.create(e)})})}renameConstraint(e,r){return new zt({...this.#e,node:m.cloneWithTableProps(this.#e.node,{renameConstraint:tn.create(e,r)})})}addIndex(e){return new Cr({...this.#e,node:m.cloneWithTableProps(this.#e.node,{addIndex:Le.create(e)})})}dropIndex(e){return new ve({...this.#e,node:m.cloneWithTableProps(this.#e.node,{dropIndex:Se.create(e)})})}$call(e){return e(this)}},Ke=class t{#e;constructor(e){this.#e=i(e)}alterColumn(e,r){let o=r(new Mt(e));return new t({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,o.toOperationNode())})}dropColumn(e){return new t({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Fi.create(e))})}renameColumn(e,r){return new t({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Mi.create(e,r))})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,Pi.create(n.toOperationNode()))})}modifyColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:m.cloneWithColumnAlteration(this.#e.node,zi.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(),this.#e.queryId)}};var bt=class extends qe{transformPrimitiveValueList(e){return he.create(e.values.map(S.createImmediate))}transformValue(e){return S.createImmediate(e.value)}};var Wr=class t{#e;constructor(e){this.#e=i(e)}ifNotExists(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{ifNotExists:!0})})}unique(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{unique:!0})})}nullsNotDistinct(){return new t({...this.#e,node:re.cloneWith(this.#e.node,{nullsNotDistinct:!0})})}on(e){return new t({...this.#e,node:re.cloneWith(this.#e.node,{table:f(e)})})}column(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,[et(e)])})}columns(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,e.map(et))})}expression(e){return new t({...this.#e,node:re.cloneWithColumns(this.#e.node,[e.toOperationNode()])})}using(e){return new t({...this.#e,node:re.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(),this.#e.queryId)}};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(),this.#e.queryId)}};function rn(t){if(ho.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:F.cloneWith(this.#e.node,{temporary:!0})})}onCommit(e){return new t({...this.#e,node:F.cloneWith(this.#e.node,{onCommit:rn(e)})})}ifNotExists(){return new t({...this.#e,node:F.cloneWith(this.#e.node,{ifNotExists:!0})})}addColumn(e,r,o=z){let n=o(new Ce(C.create(e,ue(r))));return new t({...this.#e,node:F.cloneWithColumn(this.#e.node,n.toOperationNode())})}addPrimaryKeyConstraint(e,r,o=z){let n=o(new gt(We.create(r,e)));return new t({...this.#e,node:F.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addUniqueConstraint(e,r,o=z){let n=o(new xt(ye.create(r,e)));return new t({...this.#e,node:F.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addCheckConstraint(e,r,o=z){let n=o(new Ot(ht.create(r.toOperationNode(),e)));return new t({...this.#e,node:F.cloneWithConstraint(this.#e.node,n.toOperationNode())})}addForeignKeyConstraint(e,r,o,n,a=z){let d=a(new ft(de.create(r.map(h.create),f(o),n.map(h.create),e)));return new t({...this.#e,node:F.cloneWithConstraint(this.#e.node,d.toOperationNode())})}modifyFront(e){return new t({...this.#e,node:F.cloneWithFrontModifier(this.#e.node,e.toOperationNode())})}modifyEnd(e){return new t({...this.#e,node:F.cloneWithEndModifier(this.#e.node,e.toOperationNode())})}as(e){return new t({...this.#e,node:F.cloneWith(this.#e.node,{selectQuery:$(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(),this.#e.queryId)}};var Sr=class t{#e;constructor(e){this.#e=i(e)}on(e){return new t({...this.#e,node:Se.cloneWith(this.#e.node,{table:f(e)})})}ifExists(){return new t({...this.#e,node:Se.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:Se.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(),this.#e.queryId)}};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(),this.#e.queryId)}};var Ar=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:At.cloneWith(this.#e.node,{ifExists:!0})})}cascade(){return new t({...this.#e,node:At.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(),this.#e.queryId)}};var pe=i({is(t){return t.kind==="CreateViewNode"},create(t){return i({kind:"CreateViewNode",name:M.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:pe.cloneWith(this.#e.node,{temporary:!0})})}materialized(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{materialized:!0})})}ifNotExists(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{ifNotExists:!0})})}orReplace(){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{orReplace:!0})})}columns(e){return new t({...this.#e,node:pe.cloneWith(this.#e.node,{columns:e.map(si)})})}as(e){let r=e.withPlugin(new Rr).toOperationNode();return new t({...this.#e,node:pe.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(),this.#e.queryId)}};var Ct=i({is(t){return t.kind==="DropViewNode"},create(t){return i({kind:"DropViewNode",name:M.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(),this.#e.queryId)}};var qr=i({is(t){return t.kind==="CreateTypeNode"},create(t){return i({kind:"CreateTypeNode",name:t})},cloneWithEnum(t,e){return i({...t,enum:he.create(e.map(S.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(),this.#e.queryId)}};var Qr=i({is(t){return t.kind==="DropTypeNode"},create(t){return i({kind:"DropTypeNode",name:t})},cloneWith(t,e){return i({...t,...e})}});var Lr=class t{#e;constructor(e){this.#e=i(e)}ifExists(){return new t({...this.#e,node:Qr.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(),this.#e.queryId)}};function Vi(t){let e=".";if(t.includes(e)){let r=t.split(e).map(Un);if(r.length===2)return M.createWithSchema(r[0],r[1]);throw new Error(`invalid schemable identifier ${t}`)}else return M.create(t)}function Un(t){return t.trim()}var vt=i({is(t){return t.kind==="RefreshMaterializedViewNode"},create(t){return i({kind:"RefreshMaterializedViewNode",name:M.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(),this.#e.queryId)}};var Fr=class t{#e;constructor(e){this.#e=e}createTable(e){return new Tr({queryId:l(),executor:this.#e,node:F.create(f(e))})}dropTable(e){return new Ar({queryId:l(),executor:this.#e,node:At.create(f(e))})}createIndex(e){return new Wr({queryId:l(),executor:this.#e,node:re.create(e)})}dropIndex(e){return new Sr({queryId:l(),executor:this.#e,node:Se.create(e)})}createSchema(e){return new kr({queryId:l(),executor:this.#e,node:Ut.create(e)})}dropSchema(e){return new Er({queryId:l(),executor:this.#e,node:Et.create(e)})}alterTable(e){return new vr({queryId:l(),executor:this.#e,node:m.create(f(e))})}createView(e){return new Ir({queryId:l(),executor:this.#e,node:pe.create(e)})}refreshMaterializedView(e){return new Pr({queryId:l(),executor:this.#e,node:vt.create(e)})}dropView(e){return new Dr({queryId:l(),executor:this.#e,node:Ct.create(e)})}createType(e){return new Br({queryId:l(),executor:this.#e,node:qr.create(Vi(e))})}dropType(e){return new Lr({queryId:l(),executor:this.#e,node:Qr.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 ee(e)))}};var Mr=class{ref(e){return new Kt(e)}table(e){return new gr(e)}};var zr=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 Vr=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;#o;#a=new WeakSet;constructor(e,r){this.#i=!1,this.#e=e,this.#t=r}async init(){if(this.#o)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.#o)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.#d()&&this.#n(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.#o||(this.#o=this.#e.destroy().catch(e=>(this.#o=void 0,Promise.reject(e)))),await this.#o)}#d(){return this.#t.isLevelEnabled("query")||this.#t.isLevelEnabled("error")}#n(e){let r=e.executeQuery,o=e.streamQuery,n=this;e.executeQuery=async a=>{let d,c=Ur();try{return await r.call(e,a)}catch(w){throw d=w,await n.#s(w,a,c),w}finally{d||await n.#u(a,c)}},e.streamQuery=async function*(a,d){let c,w=Ur();try{for await(let N of o.call(e,a,d))yield N}catch(N){throw c=N,await n.#s(N,a,w),N}finally{c||await n.#u(a,w,!0)}}}async#s(e,r,o){await this.#t.error(()=>({level:"error",error:e,query:r,queryDurationMillis:this.#p(o)}))}async#u(e,r,o=!1){await this.#t.query(()=>({level:"query",isStream:o,query:e,queryDurationMillis:this.#p(r)}))}#p(e){return Ur()-e}};var Jn=()=>{},Wt=class{#e;#t;constructor(e){this.#e=e}async provideConnection(e){for(;this.#t;)await this.#t.catch(Jn);return this.#t=this.#r(e).finally(()=>{this.#t=void 0}),this.#t}async#r(e){return await e(this.#e)}};var $n=["read only","read write"],Kn=["read uncommitted","read committed","repeatable read","serializable","snapshot"];function Ui(t){if(t.accessMode&&!$n.includes(t.accessMode))throw new Error(`invalid transaction access mode ${t.accessMode}`);if(t.isolationLevel&&!Kn.includes(t.isolationLevel))throw new Error(`invalid transaction isolation level ${t.isolationLevel}`)}var jv=i(["query","error"]),$r=class{#e;#t;constructor(e){k(e)?(this.#t=e,this.#e=i({query:!0,error:!0})):(this.#t=jn,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 jn(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 on(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(Gn(e))r={executor:e.executor},o={...e};else{let n=e.dialect,a=n.createDriver(),d=n.createQueryCompiler(),c=n.createAdapter(),w=new $r(e.log??[]),N=new Jr(a,w),A=new zr(N),te=new Vr(d,c,A,e.plugins??[]);r={executor:te},o={config:e,executor:te,dialect:n,driver:N}}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 pt({node:Z.create(j(e)?void 0:$(e))})}get fn(){return yr()}transaction(){return new $i({...this.#e})}startTransaction(){return new Ki({...this.#e})}connection(){return new Ji({...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 ee(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=l()){let o=on(e)?e.compile():e;return this.getExecutor().executeQuery(o,r)}async[Symbol.asyncDispose](){await this.destroy()}},Kr=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 ee(e))})}withTables(){return new t({...this.#e})}};function Gn(t){return B(t)&&B(t.config)&&B(t.driver)&&B(t.executor)&&B(t.dialect)}var Ji=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)})}},$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(e){let{isolationLevel:r,accessMode:o,...n}=this.#e,a={isolationLevel:r,accessMode:o};return Ui(a),this.#e.executor.provideConnection(async d=>{let c=this.#e.executor.withConnectionProvider(new Wt(d)),w=new Kr({...n,executor:c});try{await this.#e.driver.beginTransaction(d,a);let N=await e(w);return await this.#e.driver.commitTransaction(d),N}catch(N){throw await this.#e.driver.rollbackTransaction(d),N}})}},Ki=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};Ui(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 Kr{#e;#t;#r;constructor(e){let r={isCommitted:!1,isRolledBack:!1};e={...e,executor:new Gi(e.executor,r)};let{connection:o,...n}=e;super(n),this.#e=i(e),this.#r=r;let a=l();this.#t=d=>e.executor.compileQuery(d,a)}get isCommitted(){return this.#r.isCommitted}get isRolledBack(){return this.#r.isRolledBack}commit(){return Ge(this.#r),new je(async()=>{await this.#e.driver.commitTransaction(this.#e.connection.connection),this.#r.isCommitted=!0,this.#e.connection.release()})}rollback(){return Ge(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 Ge(this.#r),new je(async()=>(await this.#e.driver.savepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}rollbackToSavepoint(e){return Ge(this.#r),new je(async()=>(await this.#e.driver.rollbackToSavepoint?.(this.#e.connection.connection,e,this.#t),new t({...this.#e})))}releaseSavepoint(e){return Ge(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 ee(e))})}withTables(){return new t({...this.#e})}},je=class{#e;constructor(e){this.#e=e}async execute(){return await this.#e()}};function Ge(t){if(t.isCommitted)throw new Error("Transaction is already committed");if(t.isRolledBack)throw new Error("Transaction is already rolled back")}var Gi=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,r){return Ge(this.#t),this.#e.executeQuery(e,r)}stream(e,r,o){return Ge(this.#t),this.#e.stream(e,r,o)}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 Hi=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),this.#e.queryId)}#t(e){let r=e!==void 0?e.getExecutor():Be;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 ke(t){return new Hi(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 R.create(this.#e.toOperationNode(),b(this.#t)?this.#t.toOperationNode():p.create(this.#t))}};var U=Object.assign((t,...e)=>ke({queryId:l(),rawNode:W.create(t,e?.map(nn)??[])}),{ref(t){return ke({queryId:l(),rawNode:W.createWithChild(Y(t))})},val(t){return ke({queryId:l(),rawNode:W.createWithChild(g(t))})},value(t){return this.val(t)},table(t){return ke({queryId:l(),rawNode:W.createWithChild(f(t))})},id(...t){let e=new Array(t.length+1).fill(".");return e[0]="",e[e.length-1]="",ke({queryId:l(),rawNode:W.create(e,t.map(p.create))})},lit(t){return ke({queryId:l(),rawNode:W.createWithChild(S.createImmediate(t))})},literal(t){return this.lit(t)},raw(t){return ke({queryId:l(),rawNode:W.createWithSql(t)})},join(t,e=U`, `){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]=nn(t[n]),n!==t.length-1&&(r[2*n+1]=o);return ke({queryId:l(),rawNode:W.createWithChildren(r)})}});function nn(t){return b(t)?t.toOperationNode():g(t)}var jr=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 Hn=/'/g,Gr=class extends jr{#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&&!le.is(this.parentNode)&&!T.is(this.parentNode)&&!F.is(this.parentNode)&&!pe.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.nodeStack.find(u.is),o=r!==e;!o&&e.explain&&(this.visitNode(e.explain),this.append(" ")),o&&!D.is(r)&&this.append("("),e.with&&(this.visitNode(e.with),this.append(" ")),this.append(e.replace?"replace":"insert"),e.ignore&&(Ae("`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)),o&&!D.is(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.nodeStack.find(u.is)!==e;!r&&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(!v(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(Xn[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.nodeStack.find(u.is),o=r!==e;if(!o&&e.explain&&(this.visitNode(e.explain),this.append(" ")),o&&!D.is(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)),o&&!D.is(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 "),Me(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(Yn[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 H.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(Hn,"''")}addParameter(e){this.#t.push(e)}appendImmediateValue(e){if(v(e))this.appendStringLiteral(e);else if(Te(e)||Me(e))this.append(e.toString());else if(He(e))this.append("null");else if(co(e))this.appendImmediateValue(e.toISOString());else if(Ye(e))this.appendImmediateValue(e.toString());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?sn[r.modifier]-sn[o.modifier]:1),i(e)}compileColumnAlterations(e){this.compileList(e)}announcesNewColumnDataType(){return!0}},Yn=i({ForKeyShare:"for key share",ForNoKeyUpdate:"for no key update",ForUpdate:"for update",ForShare:"for share",NoWait:"nowait",SkipLocked:"skip locked",Distinct:"distinct"}),sn=i({ForKeyShare:1,ForNoKeyUpdate:1,ForUpdate:1,ForShare:1,NoWait:2,SkipLocked:2,Distinct:0}),Xn=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 Hr=class{async init(){}async acquireConnection(){return new Xi}async beginTransaction(){}async commitTransaction(){}async rollbackTransaction(){}async releaseConnection(){}async destroy(){}async releaseSavepoint(){}async rollbackToSavepoint(){}async savepoint(){}},Xi=class{async executeQuery(){return{rows:[]}}async*streamQuery(){}};var Yr=class{get supportsCreateIfNotExists(){return!0}get supportsTransactionalDdl(){return!1}get supportsReturning(){return!1}get supportsOutput(){return!1}};var Zn=/"/g,Xr=class extends Gr{sanitizeIdentifier(e){return e.replace(Zn,'""')}};var _n=BigInt("3853314791062309107"),Zr=class extends Yr{get supportsTransactionalDdl(){return!0}get supportsReturning(){return!0}async acquireMigrationLock(e,r){await U`select pg_advisory_xact_lock(${U.lit(_n)})`.execute(e)}async releaseMigrationLock(e,r){}};function an(t){return new kt({dialect:{createAdapter:()=>new t.Adapter,createDriver:()=>new Hr,createIntrospector:()=>null,createQueryCompiler:()=>new t.QueryCompiler},plugins:[...t.noParameters?[new Zi]:[]]})}var Zi=class{#e=new _i;transformQuery(e){return this.#e.transformNode(e.node)}transformResult(e){return Promise.resolve(e.result)}},_i=class extends qe{transformPrimitiveValueList(e){return he.create(e.values.map(S.createImmediate))}transformValue(e){return{...super.transformValue(e),immediate:!0}}};function Pe(t){let e=t.compile();return{parameters:e.parameters,sql:e.sql}}function eo(t,e){let r=ts(t,e);return o=>o.where(n=>n.or(r.map(a=>n.and(a.map(([d,c])=>n(d,c===null?"is":"=",c))))))}function es(t,e){return Object.entries(Object.values(e).reduce((r,o)=>{let{isInPrimaryKey:n,name:a}=o;return n&&(r[a]=t[a]??null),r},{}))}function ts(t,e){return t.map(r=>es(r,e))}function Fe(t){return an({...t,Adapter:Zr,QueryCompiler:Xr})}function to(t,e){let{table:r,rows:o}=t,{name:n,schema:a,columns:d}=r,c=Fe(e),w=Object.keys(d),N={[w[0]]:U`default`};return Pe(c.withSchema(a).insertInto(n).values(o.map(A=>Object.keys(A).length===0?N:A)).returning(w).returning(A=>A.cast("ctid","text").as("ctid")))}function ro(t,e){let{pageIndex:r,pageSize:o,sortOrder:n,table:{name:a,schema:d,columns:c},filter:w={kind:"FilterGroup",after:"and",filters:[]}}=t,N=Fe(e),A=Object.keys(c),te=N.withSchema(d).selectFrom(a).select(K=>K.cast(K.fn.coalesce(K.fn.countAll(),U.lit(0)),"text").as("oid"));return Pe(N.with("count",()=>te).withSchema(d).selectFrom([a,"count"]).select(U.ref("count.oid").$castTo().as("oid")).select(K=>K.cast("ctid","text").as("ctid")).select(A).$call(K=>n.reduce((Vt,Tt)=>Vt.orderBy(Tt.column,Tt.direction),K)).where(un(w.filters)).limit(o).offset(U.lit(BigInt(r)*BigInt(o))))}function rs(t){return t.kind==="ColumnFilter"?e=>e(e.ref(t.column),t.operator,t.value):un(t.filters)}function un(t){if(t.length===0)return o=>o.lit(!0);let e=[],r=[];for(let o=0;o<t.length;o++)r.push(rs(t[o])),(o===t.length-1||t[o].after==="or")&&(e.push(r),r=[]);return o=>{let n=e.map(a=>o.and(a.map(d=>d(o))));return o.or(n)}}function is(){return[{created_at:new Date("2025-01-26T21:56:12.345Z"),ctid:"(0,1)",deleted_at:null,id:1,name:"John Doe",oid:"2",role:"admin"},{created_at:new Date("2025-01-26T20:56:12.345Z"),ctid:"(0,2)",deleted_at:null,id:2,name:"Jane Doe",oid:"2",role:"poweruser"}]}function io(t,e){let{changes:r,row:o,table:{columns:n,name:a,schema:d}}=t,c=Fe(e),w=Object.keys(n);return Pe(c.withSchema(d).updateTable(a).set(r).$call(eo([o],n)).returning(w).returning(N=>[N.cast("ctid","text").as("ctid"),N.cast(N.fn("floor",[N(N.fn("extract",[U`epoch from now()`]),"*",1e6)]),"text").as("__ps_updated_at__")]))}function oo(t,e){let{rows:r,table:{columns:o,name:n,schema:a}}=t,d=Fe(e);return Pe(d.withSchema(a).deleteFrom(n).$call(eo(r,o)))}function dn(t){return U`(select coalesce(json_agg(agg), '[]') from ${t} as agg)`}var os="r",ns="v",ss=[os,ns];function no(t){return Pe(Fe(t).selectFrom("pg_catalog.pg_class as cls").innerJoin("pg_catalog.pg_namespace as ns","cls.relnamespace","ns.oid").$call(as).where("cls.relkind","in",ss).select(e=>["ns.nspname as schema","cls.relname as name",dn(e.selectFrom("pg_catalog.pg_attribute as att").innerJoin("pg_catalog.pg_type as typ","typ.oid","att.atttypid").innerJoin("pg_catalog.pg_namespace as tns","tns.oid","typ.typnamespace").leftJoin("pg_catalog.pg_constraint as pk_con",r=>r.on("pk_con.contype","=","p").onRef("pk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("pk_con.conkey")))).leftJoin("pg_catalog.pg_constraint as fk_con",r=>r.on("fk_con.contype","=","f").onRef("fk_con.conrelid","=","cls.oid").on(o=>o("att.attnum","=",o.fn.any("fk_con.conkey")))).leftJoin("pg_catalog.pg_class as fk_cls","fk_cls.oid","fk_con.confrelid").leftJoin("pg_catalog.pg_namespace as fk_ns","fk_ns.oid","fk_cls.relnamespace").leftJoin("pg_catalog.pg_attribute as fk_att",r=>r.onRef("fk_att.attrelid","=","fk_cls.oid").on(o=>o("fk_att.attnum","=",o.fn.any("fk_con.confkey")))).whereRef("att.attrelid","=","cls.oid").where("att.attnum",">=",0).where("att.attisdropped","!=",!0).select(["att.attname as name","typ.typname as datatype","tns.nspname as datatype_schema","fk_ns.nspname as foreign_key_schema","fk_cls.relname as foreign_key_table","fk_att.attname as foreign_key_column"]).select(r=>[r("pk_con.conkey","is not",null).$castTo().as("pk"),r("att.attgenerated","!=","").$castTo().as("computed"),r("att.attnotnull","!=",!0).$castTo().as("nullable"),r.fn.coalesce(r.selectFrom("pg_catalog.pg_enum as enm").whereRef("enm.enumtypid","=","typ.oid").select(o=>o.fn.jsonAgg(o.ref("enm.enumlabel")).as("o")),U`'[]'`).as("options")])).as("columns")]))}function so(){return[{schema:"public",name:"users",columns:[{name:"id",datatype:"bigint",datatype_schema:"public",pk:!0,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null},{name:"name",datatype:"varchar",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null},{name:"role",datatype:"role",datatype_schema:"public",pk:!1,computed:!1,options:["admin","maintainer","member"],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null},{name:"created_at",datatype:"timestamptz",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null},{name:"deleted_at",datatype:"timestamptz",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null}]},{schema:"public",name:"posts",columns:[{name:"id",datatype:"bigint",datatype_schema:"public",pk:!0,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null},{name:"user_id",datatype:"bigint",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!1,foreign_key_schema:"public",foreign_key_table:"users",foreign_key_column:"id"},{name:"content",datatype:"text",datatype_schema:"public",pk:!1,computed:!1,options:[],nullable:!0,foreign_key_schema:null,foreign_key_table:null,foreign_key_column:null}]}]}function ao(){let t=Fe();return Pe(t.selectNoFrom(t.fn("current_setting",[U.lit("timezone")]).as("timezone")))}function uo(){return[{timezone:"UTC"}]}function as(t){return t.where("ns.nspname","!~","^pg_").where("ns.nspname","!=","information_schema")}function us(t){let{executor:e,...r}=t;return{defaultSchema:"public",async introspect(o){try{let n=no(r),a=ao(),[[d,c],[w,N]]=await Promise.all([e.execute(n,o),e.execute(a,o)]),A=d||w;if(A)return[A];let[te]=N;if(!te)return[new Error("Timezone not found")];let K=pn(c,te.timezone);return console.log(K),[null,K]}catch(n){return[n]}},async query(o,n){try{let a=ro(o,r),[d,c]=await e.execute(a,n);return d?[d]:[null,{filteredRowCount:c[0]?.oid||"0",rows:c}]}catch(a){return[a]}},async insert(o,n){try{let a=to(o,r),[d,c]=await e.execute(a,n);return d?[d]:[null,{rows:c}]}catch(a){return[a]}},async update(o,n){try{let a=io(o,r),[d,c]=await e.execute(a,n);if(d)return[d];let[w]=c;return w?[null,{row:w}]:[new Error("Update failed")]}catch(a){return[a]}},async delete(o,n){try{let a=oo(o,r),[d]=await e.execute(a,n);return d?[d]:[null,o]}catch(a){return[a]}}}}function pn(t,e){return t.reduce((r,o)=>{let{schemas:n}=r,{columns:a,name:d,schema:c}=o,w=a.reduce((N,A)=>{let{datatype:te,datatype_schema:K,name:Vt,options:Tt,nullable:cn}=A,_r=te.startsWith("_"),ei=_r?te.slice(1):te;return{...N,[Vt]:{datatype:{...po[ei]||{group:Tt.length>0?"enum":"raw"},isArray:_r,isNative:K==="pg_catalog",name:_r?`${ei}[]`:ei,options:Tt,schema:K},isComputed:A.computed,isInPrimaryKey:A.pk,name:Vt,nullable:cn,schema:c,table:d,fkSchema:A.foreign_key_schema,fkTable:A.foreign_key_table,fkColumn:A.foreign_key_column}}},{});return(n[c]||={tables:{}}).tables[d]={columns:w,name:d,schema:c},r},{schemas:{public:{tables:{}}},timezone:e,filterOperators:ds})}var ds=["=","!=",">",">=","<","<=","in","not in","is","is not","like","not like","ilike","not ilike"];function ps(){let t=so(),[{timezone:e}]=uo();return pn(t,e)}0&&(module.exports={createPostgresAdapter,getDeleteQuery,getInsertQuery,getSelectQuery,getTablesQuery,getTimezoneQuery,getUpdateQuery,mockIntrospect,mockSelectQuery,mockTablesQuery,mockTimezoneQuery});
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2luZGV4LnRzIiwgIi4uLy4uLy4uL2RhdGEvcG9zdGdyZXMtY29yZS9kYXRhdHlwZS50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3V0aWwvb2JqZWN0LXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXNjaGVtYS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtdGFibGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LWFsbC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vcmRlci1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbGxhdGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvb3JkZXItYnktaXRlbS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2ctb25jZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1pdGl2ZS12YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZnJvbS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ3JvdXAtYnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2hhdmluZy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9saXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3VzaW5nLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZXJlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZXR1cm5pbmctbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2V4cGxhaW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21lcmdlLXF1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vdXRwdXQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcGFydGl0aW9uLWJ5LWl0ZW0tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9wYXJ0aXRpb24tYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdmFsdWVzLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LWluc2VydC12YWx1ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2luc2VydC12YWx1ZXMtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY29sdW1uLXVwZGF0ZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3VwZGF0ZS1zZXQtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb24tZHVwbGljYXRlLWtleS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9uby1yZXN1bHQtZXJyb3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9vbi1jb25mbGljdC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdG9wLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvdG9wLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29yLWFjdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9pbnNlcnQtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvZGVsZXRlLXJlc3VsdC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2xpbWl0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcmVzdWx0LmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci91cGRhdGUtcXVlcnktYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5hbWUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2N0ZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3dpdGgtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvd2l0aC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9yYW5kb20tc3RyaW5nLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9xdWVyeS1pZC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21hdGNoZWQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9tZXJnZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2RlZmVycmVkLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWV4ZWN1dG9yL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9ub29wLXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9tZXJnZS1yZXN1bHQuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL21lcmdlLXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jcmVhdG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3BhcnNlLXV0aWxzLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2pvaW4tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvZ3JvdXAtYnktcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvc2V0LW9wZXJhdGlvbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9mZXRjaC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Z1bmN0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcXVlcnktYnVpbGRlci9jYXNlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbGVnLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1idWlsZGVyL2pzb24tcGF0aC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdHVwbGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2RhdGEtdHlwZS1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9jYXN0LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9leHByZXNzaW9uLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVuYW1lLWNvbHVtbi1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vcGFyc2VyL2RlZmF1bHQtdmFsdWUtcGFyc2VyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZ2VuZXJhdGVkLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9kZWZhdWx0LXZhbHVlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvb24tbW9kaWZ5LWFjdGlvbi1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29uc3RyYWludC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtZXhlY3V0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NoZWNrLWNvbnN0cmFpbnQtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb25zdHJhaW50LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvYWx0ZXItdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BsdWdpbi9pbW1lZGlhdGUtdmFsdWUvaW1tZWRpYXRlLXZhbHVlLXRyYW5zZm9ybWVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1pbmRleC1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2NyZWF0ZS10YWJsZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtaW5kZXgtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9kcm9wLXNjaGVtYS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3AtdGFibGUtYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvY3JlYXRlLXZpZXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL2Ryb3Atdmlldy1ub2RlLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL2Ryb3Atdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3NjaGVtYS9jcmVhdGUtdHlwZS1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vb3BlcmF0aW9uLW5vZGUvZHJvcC10eXBlLW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvZHJvcC10eXBlLWJ1aWxkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9vcGVyYXRpb24tbm9kZS9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LW5vZGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9zY2hlbWEvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1idWlsZGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vc2NoZW1hL3NjaGVtYS5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2R5bmFtaWMvZHluYW1pYy5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RyaXZlci9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1leGVjdXRvci9kZWZhdWx0LXF1ZXJ5LWV4ZWN1dG9yLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9wZXJmb3JtYW5jZS1ub3cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvcnVudGltZS1kcml2ZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvc2luZ2xlLWNvbm5lY3Rpb24tcHJvdmlkZXIuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kcml2ZXIvZHJpdmVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vdXRpbC9sb2cuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS91dGlsL2NvbXBpbGFibGUuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9reXNlbHkuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9yYXctYnVpbGRlci9yYXctYnVpbGRlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL3Jhdy1idWlsZGVyL3NxbC5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9xdWVyeS1jb21waWxlci9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZHJpdmVyL2R1bW15LWRyaXZlci5qcyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2RpYWxlY3QvZGlhbGVjdC1hZGFwdGVyLWJhc2UuanMiLCAiLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2t5c2VseUAwLjI4LjIvbm9kZV9tb2R1bGVzL2t5c2VseS9kaXN0L2VzbS9kaWFsZWN0L3Bvc3RncmVzL3Bvc3RncmVzLXF1ZXJ5LWNvbXBpbGVyLmpzIiwgIi4uLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9reXNlbHlAMC4yOC4yL25vZGVfbW9kdWxlcy9reXNlbHkvZGlzdC9lc20vZGlhbGVjdC9wb3N0Z3Jlcy9wb3N0Z3Jlcy1hZGFwdGVyLmpzIiwgIi4uLy4uLy4uL2RhdGEvcXVlcnkudHMiLCAiLi4vLi4vLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2J1aWxkZXIudHMiLCAiLi4vLi4vLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2RtbC50cyIsICIuLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0va3lzZWx5QDAuMjguMi9ub2RlX21vZHVsZXMva3lzZWx5L2Rpc3QvZXNtL2hlbHBlcnMvcG9zdGdyZXMuanMiLCAiLi4vLi4vLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2ludHJvc3BlY3Rpb24udHMiLCAiLi4vLi4vLi4vZGF0YS9wb3N0Z3Jlcy1jb3JlL2FkYXB0ZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RtbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50cm9zcGVjdGlvblwiO1xuIiwgImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcblxuZXhwb3J0IGNvbnN0IFBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQTogUmVjb3JkPHN0cmluZywgUGljazxEYXRhVHlwZSwgXCJncm91cFwiPj4gPSB7XG4gIGJvb2w6IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJvb2xlYW46IHtcbiAgICBncm91cDogXCJib29sZWFuXCIsXG4gIH0sXG4gIGJ5dGVhOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIGNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgY2l0ZXh0OiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCdcbiAgICovXG4gIGRhdGU6IHtcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogQGV4YW1wbGUgJzEgZGF5IDIgaG91cnMnXG4gICAqL1xuICBpbnRlcnZhbDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICBuYW1lOiB7XG4gICAgZ3JvdXA6IFwic3RyaW5nXCIsXG4gIH0sXG4gIHZhcmNoYXI6IHtcbiAgICBncm91cDogXCJzdHJpbmdcIixcbiAgfSxcbiAgdGV4dDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICAvKipcbiAgICogc2hvcnQgZm9ybSBvZiBgdGltZSB3aXRob3V0IHRpbWUgem9uZWAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCdcbiAgICovXG4gIHRpbWU6IHtcbiAgICBncm91cDogXCJ0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCdcbiAgICovXG4gIHRpbWVzdGFtcDoge1xuICAgIGdyb3VwOiBcImRhdGV0aW1lXCIsXG4gIH0sXG4gIC8qKlxuICAgKiBzaG9ydCBmb3JtIG9mIGB0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmVgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIHRpbWVzdGFtcHR6OiB7XG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIGxvbmcgZm9ybSBvZiBgdGltZXN0YW1wYC5cbiAgICpcbiAgICogQGV4YW1wbGUgJzIwMjUtMDQtMTQgMTQ6MzA6MDAnXG4gICAqL1xuICBcInRpbWVzdGFtcCB3aXRob3V0IHRpbWUgem9uZVwiOiB7XG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIGxvbmcgZm9ybSBvZiBgdGltZXN0YW1wdHpgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIFwidGltZXN0YW1wIHdpdGggdGltZSB6b25lXCI6IHtcbiAgICBncm91cDogXCJkYXRldGltZVwiLFxuICB9LFxuICAvKipcbiAgICogc2hvcnQgZm9ybSBvZiBgdGltZSB3aXRoIHRpbWUgem9uZWAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCswMDowMCdcbiAgICovXG4gIHRpbWV0ejoge1xuICAgIGdyb3VwOiBcInRpbWVcIixcbiAgfSxcbiAgLyoqXG4gICAqIGxvbmcgZm9ybSBvZiBgdGltZWAuXG4gICAqXG4gICAqIEBleGFtcGxlICcxNDozMDowMCdcbiAgICovXG4gIFwidGltZSB3aXRob3V0IHRpbWUgem9uZVwiOiB7XG4gICAgZ3JvdXA6IFwidGltZVwiLFxuICB9LFxuICAvKipcbiAgICogbG9uZyBmb3JtIG9mIGB0aW1ldHpgLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnMjAyNS0wNC0xNCAxNDozMDowMCswMCdcbiAgICovXG4gIFwidGltZSB3aXRoIHRpbWUgem9uZVwiOiB7XG4gICAgZ3JvdXA6IFwiZGF0ZXRpbWVcIixcbiAgfSxcbiAgdXVpZDoge1xuICAgIGdyb3VwOiBcInN0cmluZ1wiLFxuICB9LFxuICAvLyBOdW1lcmljIHR5cGVzXG4gIGludDI6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGludDQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGludDg6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHNtYWxsaW50OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBpbnRlZ2VyOiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBiaWdpbnQ6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGRlY2ltYWw6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIG51bWVyaWM6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIHJlYWw6IHtcbiAgICBncm91cDogXCJudW1lcmljXCIsXG4gIH0sXG4gIGZsb2F0NDoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAgZmxvYXQ4OiB7XG4gICAgZ3JvdXA6IFwibnVtZXJpY1wiLFxuICB9LFxuICBcImRvdWJsZSBwcmVjaXNpb25cIjoge1xuICAgIGdyb3VwOiBcIm51bWVyaWNcIixcbiAgfSxcbiAganNvbjoge1xuICAgIGdyb3VwOiBcImpzb25cIixcbiAgfSxcbiAganNvbmI6IHtcbiAgICBncm91cDogXCJqc29uXCIsXG4gIH0sXG59O1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vYmplY3QtdXRpbHMuZC50c1wiIC8+XG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopIHx8IGlzU3RyaW5nKG9iaikgfHwgaXNCdWZmZXIob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAob2JqKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyB8fCBvYmogPT09IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIob2JqKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdudW1iZXInO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVsbChvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZShvYmopIHtcbiAgICByZXR1cm4gb2JqIGluc3RhbmNlb2YgRGF0ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpZ0ludChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCc7XG59XG4vLyBEb24ndCBjaGFuZ2UgdGhlIHJldHVybmQgdHlwZSB0byBgb2JqIGlzIEJ1ZmZlcmAgdG8gbm90IGNyZWF0ZSBhXG4vLyBoYXJkIGRlcGVuZGVuY3kgdG8gbm9kZS5cbmV4cG9ydCBmdW5jdGlvbiBpc0J1ZmZlcihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgQnVmZmVyLmlzQnVmZmVyKG9iaik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNGdW5jdGlvbihvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJPclZpZXcob2JqKSB7XG4gICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IEFycmF5QnVmZmVyLmlzVmlldyhvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3Qob2JqKSB7XG4gICAgaWYgKCFpc09iamVjdChvYmopIHx8IGdldFRhZyhvYmopICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHByb3RvID0gb2JqO1xuICAgIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXN0KGFycikge1xuICAgIHJldHVybiBhcnJbYXJyLmxlbmd0aCAtIDFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZyZWV6ZShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShvYmopO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzQXJyYXkoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gW2FyZ107XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFzUmVhZG9ubHlBcnJheShhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoW2FyZ10pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1JlYWRvbmx5QXJyYXkoYXJnKSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub29wKG9iaikge1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZShvYmoxLCBvYmoyKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShvYmoxKSAmJiBpc1JlYWRvbmx5QXJyYXkob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVBcnJheXMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iajEpICYmIGlzT2JqZWN0KG9iajIpKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlT2JqZWN0cyhvYmoxLCBvYmoyKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajEgPT09IG9iajI7XG59XG5mdW5jdGlvbiBjb21wYXJlQXJyYXlzKGFycjEsIGFycjIpIHtcbiAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIxLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICghY29tcGFyZShhcnIxW2ldLCBhcnIyW2ldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gY29tcGFyZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGlmIChpc0J1ZmZlcihvYmoxKSAmJiBpc0J1ZmZlcihvYmoyKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZUJ1ZmZlcnMob2JqMSwgb2JqMik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRGF0ZShvYmoxKSAmJiBpc0RhdGUob2JqMikpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVEYXRlcyhvYmoxLCBvYmoyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhcmVHZW5lcmljT2JqZWN0cyhvYmoxLCBvYmoyKTtcbn1cbmZ1bmN0aW9uIGNvbXBhcmVCdWZmZXJzKGJ1ZjEsIGJ1ZjIpIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbXBhcmUoYnVmMSwgYnVmMikgPT09IDA7XG59XG5mdW5jdGlvbiBjb21wYXJlRGF0ZXMoZGF0ZTEsIGRhdGUyKSB7XG4gICAgcmV0dXJuIGRhdGUxLmdldFRpbWUoKSA9PT0gZGF0ZTIuZ2V0VGltZSgpO1xufVxuZnVuY3Rpb24gY29tcGFyZUdlbmVyaWNPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iajEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqMik7XG4gICAgaWYgKGtleXMxLmxlbmd0aCAhPT0ga2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgICAgaWYgKCFjb21wYXJlKG9iajFba2V5XSwgb2JqMltrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZnVuY3Rpb24gZ2V0VGFnKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyAnW29iamVjdCBVbmRlZmluZWRdJyA6ICdbb2JqZWN0IE51bGxdJztcbiAgICB9XG4gICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFsdGVyVGFibGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBbHRlclRhYmxlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWx0ZXJUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGFibGVQcm9wcyhub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKG5vZGUsIGNvbHVtbkFsdGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uQWx0ZXJhdGlvbnM6IG5vZGUuY29sdW1uQWx0ZXJhdGlvbnNcbiAgICAgICAgICAgICAgICA/IFsuLi5ub2RlLmNvbHVtbkFsdGVyYXRpb25zLCBjb2x1bW5BbHRlcmF0aW9uXVxuICAgICAgICAgICAgICAgIDogW2NvbHVtbkFsdGVyYXRpb25dLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2lkZW50aWZpZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJZGVudGlmaWVyTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSWRlbnRpZmllck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSWRlbnRpZmllck5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtaW5kZXgtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENyZWF0ZUluZGV4Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlSW5kZXhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZUluZGV4Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUobmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aENvbHVtbnMobm9kZSwgY29sdW1ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBjb2x1bW5zOiBbLi4uKG5vZGUuY29sdW1ucyB8fCBbXSksIC4uLmNvbHVtbnNdLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS1zY2hlbWEtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENyZWF0ZVNjaGVtYU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NyZWF0ZVNjaGVtYU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVNjaGVtYU5vZGUnLFxuICAgICAgICAgICAgc2NoZW1hOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoY3JlYXRlU2NoZW1hLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVTY2hlbWEsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXRhYmxlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgT05fQ09NTUlUX0FDVElPTlMgPSBbJ3ByZXNlcnZlIHJvd3MnLCAnZGVsZXRlIHJvd3MnLCAnZHJvcCddO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENyZWF0ZVRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoW10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aENvbHVtbihjcmVhdGVUYWJsZSwgY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmNvbHVtbnMsIGNvbHVtbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aENvbnN0cmFpbnQoY3JlYXRlVGFibGUsIGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVUYWJsZSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBjcmVhdGVUYWJsZS5jb25zdHJhaW50c1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5jb25zdHJhaW50cywgY29uc3RyYWludF0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW2NvbnN0cmFpbnRdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGcm9udE1vZGlmaWVyKGNyZWF0ZVRhYmxlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgZnJvbnRNb2RpZmllcnM6IGNyZWF0ZVRhYmxlLmZyb250TW9kaWZpZXJzXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLmNyZWF0ZVRhYmxlLmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRW5kTW9kaWZpZXIoY3JlYXRlVGFibGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY3JlYXRlVGFibGUsXG4gICAgICAgICAgICBlbmRNb2RpZmllcnM6IGNyZWF0ZVRhYmxlLmVuZE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5jcmVhdGVUYWJsZS5lbmRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IGZyZWV6ZShbbW9kaWZpZXJdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoY3JlYXRlVGFibGUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVRhYmxlLFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGlkZW50aWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2NoZW1hYmxlSWRlbnRpZmllck5vZGUnLFxuICAgICAgICAgICAgaWRlbnRpZmllcjogSWRlbnRpZmllck5vZGUuY3JlYXRlKGlkZW50aWZpZXIpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTY2hlbWEoc2NoZW1hLCBpZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWRlbnRpZmllciksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1pbmRleC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BJbmRleE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcEluZGV4LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BJbmRleCxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atc2NoZW1hLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wU2NoZW1hTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRHJvcFNjaGVtYU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNjaGVtYSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHNjaGVtYSksXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BTY2hlbWEsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BTY2hlbWEsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IERyb3BUYWJsZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BUYWJsZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHRhYmxlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcEluZGV4LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wSW5kZXgsXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWxpYXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBbGlhc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FsaWFzTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm9kZSwgYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWxpYXNOb2RlJyxcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90YWJsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRhYmxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVGFibGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZSh0YWJsZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1RhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcGVyYXRpb24tbm9kZS1zb3VyY2UuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KG9iaikgJiYgaXNGdW5jdGlvbihvYmoudG9PcGVyYXRpb25Ob2RlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwcmVzc2lvbi5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwcmVzc2lvbihvYmopIHtcbiAgICByZXR1cm4gaXNPYmplY3Qob2JqKSAmJiAnZXhwcmVzc2lvblR5cGUnIGluIG9iaiAmJiBpc09wZXJhdGlvbk5vZGVTb3VyY2Uob2JqKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0FsaWFzZWRFeHByZXNzaW9uKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICAnZXhwcmVzc2lvbicgaW4gb2JqICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai5hbGlhcykgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtbW9kaWZpZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RNb2RpZmllck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NlbGVjdE1vZGlmaWVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobW9kaWZpZXIsIG9mKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdE1vZGlmaWVyTm9kZScsXG4gICAgICAgICAgICBtb2RpZmllcixcbiAgICAgICAgICAgIG9mLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhFeHByZXNzaW9uKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdE1vZGlmaWVyTm9kZScsXG4gICAgICAgICAgICByYXdNb2RpZmllcjogbW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYW5kLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQW5kTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQW5kTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQW5kTm9kZScsXG4gICAgICAgICAgICBsZWZ0LFxuICAgICAgICAgICAgcmlnaHQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3Itbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobGVmdCwgcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3JOb2RlJyxcbiAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICByaWdodCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4vYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi9vci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uTm9kZScsXG4gICAgICAgICAgICBvbjogZmlsdGVyLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9wZXJhdGlvbihvbk5vZGUsIG9wZXJhdG9yLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vbk5vZGUsXG4gICAgICAgICAgICBvbjogb3BlcmF0b3IgPT09ICdBbmQnXG4gICAgICAgICAgICAgICAgPyBBbmROb2RlLmNyZWF0ZShvbk5vZGUub24sIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9yTm9kZS5jcmVhdGUob25Ob2RlLm9uLCBvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pvaW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9uTm9kZSB9IGZyb20gJy4vb24tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSm9pbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pvaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShqb2luVHlwZSwgdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSm9pbk5vZGUnLFxuICAgICAgICAgICAgam9pblR5cGUsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIG9uOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aE9uKGpvaW5UeXBlLCB0YWJsZSwgb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSm9pbk5vZGUnLFxuICAgICAgICAgICAgam9pblR5cGUsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIG9uOiBPbk5vZGUuY3JlYXRlKG9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPbihqb2luTm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uam9pbk5vZGUsXG4gICAgICAgICAgICBvbjogam9pbk5vZGUub25cbiAgICAgICAgICAgICAgICA/IE9uTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oam9pbk5vZGUub24sICdBbmQnLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBPbk5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYmluYXJ5LW9wZXJhdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEJpbmFyeU9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0JpbmFyeU9wZXJhdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGxlZnRPcGVyYW5kLCBvcGVyYXRvciwgcmlnaHRPcGVyYW5kKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0JpbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgbGVmdE9wZXJhbmQsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIHJpZ2h0T3BlcmFuZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vcGVyYXRvci1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplLCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBDT01QQVJJU09OX09QRVJBVE9SUyA9IFtcbiAgICAnPScsXG4gICAgJz09JyxcbiAgICAnIT0nLFxuICAgICc8PicsXG4gICAgJz4nLFxuICAgICc+PScsXG4gICAgJzwnLFxuICAgICc8PScsXG4gICAgJ2luJyxcbiAgICAnbm90IGluJyxcbiAgICAnaXMnLFxuICAgICdpcyBub3QnLFxuICAgICdsaWtlJyxcbiAgICAnbm90IGxpa2UnLFxuICAgICdtYXRjaCcsXG4gICAgJ2lsaWtlJyxcbiAgICAnbm90IGlsaWtlJyxcbiAgICAnQD4nLFxuICAgICc8QCcsXG4gICAgJ15AJyxcbiAgICAnJiYnLFxuICAgICc/JyxcbiAgICAnPyYnLFxuICAgICc/fCcsXG4gICAgJyE8JyxcbiAgICAnIT4nLFxuICAgICc8PT4nLFxuICAgICchficsXG4gICAgJ34nLFxuICAgICd+KicsXG4gICAgJyF+KicsXG4gICAgJ0BAJyxcbiAgICAnQEBAJyxcbiAgICAnISEnLFxuICAgICc8LT4nLFxuICAgICdyZWdleHAnLFxuICAgICdpcyBkaXN0aW5jdCBmcm9tJyxcbiAgICAnaXMgbm90IGRpc3RpbmN0IGZyb20nLFxuXTtcbmV4cG9ydCBjb25zdCBBUklUSE1FVElDX09QRVJBVE9SUyA9IFtcbiAgICAnKycsXG4gICAgJy0nLFxuICAgICcqJyxcbiAgICAnLycsXG4gICAgJyUnLFxuICAgICdeJyxcbiAgICAnJicsXG4gICAgJ3wnLFxuICAgICcjJyxcbiAgICAnPDwnLFxuICAgICc+PicsXG5dO1xuZXhwb3J0IGNvbnN0IEpTT05fT1BFUkFUT1JTID0gWyctPicsICctPj4nXTtcbmV4cG9ydCBjb25zdCBCSU5BUllfT1BFUkFUT1JTID0gW1xuICAgIC4uLkNPTVBBUklTT05fT1BFUkFUT1JTLFxuICAgIC4uLkFSSVRITUVUSUNfT1BFUkFUT1JTLFxuICAgICcmJicsXG4gICAgJ3x8Jyxcbl07XG5leHBvcnQgY29uc3QgVU5BUllfRklMVEVSX09QRVJBVE9SUyA9IFsnZXhpc3RzJywgJ25vdCBleGlzdHMnXTtcbmV4cG9ydCBjb25zdCBVTkFSWV9PUEVSQVRPUlMgPSBbJ25vdCcsICctJywgLi4uVU5BUllfRklMVEVSX09QRVJBVE9SU107XG5leHBvcnQgY29uc3QgT1BFUkFUT1JTID0gW1xuICAgIC4uLkJJTkFSWV9PUEVSQVRPUlMsXG4gICAgLi4uSlNPTl9PUEVSQVRPUlMsXG4gICAgLi4uVU5BUllfT1BFUkFUT1JTLFxuICAgICdiZXR3ZWVuJyxcbiAgICAnYmV0d2VlbiBzeW1tZXRyaWMnLFxuXTtcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPcGVyYXRvck5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09wZXJhdG9yTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3BlcmF0b3JOb2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG5leHBvcnQgZnVuY3Rpb24gaXNPcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbmFyeU9wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBCSU5BUllfT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBhcmlzb25PcGVyYXRvcihvcCkge1xuICAgIHJldHVybiBpc1N0cmluZyhvcCkgJiYgQ09NUEFSSVNPTl9PUEVSQVRPUlMuaW5jbHVkZXMob3ApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJpdGhtZXRpY09wZXJhdG9yKG9wKSB7XG4gICAgcmV0dXJuIGlzU3RyaW5nKG9wKSAmJiBBUklUSE1FVElDX09QRVJBVE9SUy5pbmNsdWRlcyhvcCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNKU09OT3BlcmF0b3Iob3ApIHtcbiAgICByZXR1cm4gaXNTdHJpbmcob3ApICYmIEpTT05fT1BFUkFUT1JTLmluY2x1ZGVzKG9wKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1hbGwtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBTZWxlY3RBbGxOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdTZWxlY3RBbGxOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0QWxsTm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVmZXJlbmNlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBTZWxlY3RBbGxOb2RlIH0gZnJvbSAnLi9zZWxlY3QtYWxsLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZmVyZW5jZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZmVyZW5jZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgIGNvbHVtbjogU2VsZWN0QWxsTm9kZS5jcmVhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLXJlZmVyZW5jZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc09iamVjdCwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIge1xuICAgICNkeW5hbWljUmVmZXJlbmNlO1xuICAgIGdldCBkeW5hbWljUmVmZXJlbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHluYW1pY1JlZmVyZW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIFRoaXMgbmVlZHMgdG8gYmUgaGVyZSBqdXN0IHNvIHRoYXQgdGhlIHR5cGluZ3Mgd29yay4gV2l0aG91dCB0aGlzXG4gICAgICogdGhlIGdlbmVyYXRlZCAuZC50cyBmaWxlIGNvbnRhaW5zIG5vIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBwYXJhbSBSXG4gICAgICogd2hpY2ggY2F1c2VzIHRoaXMgdHlwZSB0byBiZSBlcXVhbCB0byBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB3aXRoXG4gICAgICogYW55IFIuXG4gICAgICovXG4gICAgZ2V0IHJlZlR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHJlZmVyZW5jZSkge1xuICAgICAgICB0aGlzLiNkeW5hbWljUmVmZXJlbmNlID0gcmVmZXJlbmNlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNpbXBsZVJlZmVyZW5jZUV4cHJlc3Npb24odGhpcy4jZHluYW1pY1JlZmVyZW5jZSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIob2JqKSB7XG4gICAgcmV0dXJuIChpc09iamVjdChvYmopICYmXG4gICAgICAgIGlzT3BlcmF0aW9uTm9kZVNvdXJjZShvYmopICYmXG4gICAgICAgIGlzU3RyaW5nKG9iai5keW5hbWljUmVmZXJlbmNlKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LWl0ZW0tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPcmRlckJ5SXRlbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yZGVyQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3JkZXJCeSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBvcmRlckJ5LFxuICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSYXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSYXdOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShzcWxGcmFnbWVudHMsIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmF3Tm9kZScsXG4gICAgICAgICAgICBzcWxGcmFnbWVudHM6IGZyZWV6ZShzcWxGcmFnbWVudHMpLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogZnJlZXplKHBhcmFtZXRlcnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNyZWF0ZVdpdGhTcWwoc3FsKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShbc3FsXSwgW10pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aENoaWxkKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBSYXdOb2RlLmNyZWF0ZShbJycsICcnXSwgW2NoaWxkXSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKG5ldyBBcnJheShjaGlsZHJlbi5sZW5ndGggKyAxKS5maWxsKCcnKSwgY2hpbGRyZW4pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sbGF0ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuL2lkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sbGF0ZU5vZGUgPSB7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sbGF0ZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbGxhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2xsYXRlTm9kZScsXG4gICAgICAgICAgICBjb2xsYXRpb246IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb2xsYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktaXRlbS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sbGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2xsYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3JkZXItYnktaXRlbS1ub2RlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3JkZXJCeUl0ZW1CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBkZXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBhc2N9IGZvciB0aGUgb3Bwb3NpdGUuXG4gICAgICovXG4gICAgZGVzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2Rlc2MnKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgYXNjYCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBkZXNjfSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIGFzYygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoJ2FzYycpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBsYXN0YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBhbmQgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBudWxsc0ZpcnN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzTGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcmRlckJ5SXRlbUJ1aWxkZXIoe1xuICAgICAgICAgICAgbm9kZTogT3JkZXJCeUl0ZW1Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IG51bGxzOiAnbGFzdCcgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBmaXJzdGAgdG8gdGhlIGBvcmRlciBieWAgaXRlbS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgYW5kIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgbnVsbHNMYXN0fSBmb3IgdGhlIG9wcG9zaXRlLlxuICAgICAqL1xuICAgIG51bGxzRmlyc3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBudWxsczogJ2ZpcnN0JyB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGNvbGxhdGUgPGNvbGxhdGlvbk5hbWU+YCB0byB0aGUgYG9yZGVyIGJ5YCBpdGVtLlxuICAgICAqL1xuICAgIGNvbGxhdGUoY29sbGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IE9yZGVyQnlJdGVtTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGNvbGxhdGlvbjogQ29sbGF0ZU5vZGUuY3JlYXRlKGNvbGxhdGlvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2ctb25jZS5kLnRzXCIgLz5cbmNvbnN0IExPR0dFRF9NRVNTQUdFUyA9IG5ldyBTZXQoKTtcbi8qKlxuICogVXNlIGZvciBzeXN0ZW0tbGV2ZWwgbG9nZ2luZywgc3VjaCBhcyBkZXByZWNhdGlvbiBtZXNzYWdlcy5cbiAqIExvZ3MgYSBtZXNzYWdlIGFuZCBlbnN1cmVzIGl0IHdvbid0IGJlIGxvZ2dlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ09uY2UobWVzc2FnZSkge1xuICAgIGlmIChMT0dHRURfTUVTU0FHRVMuaGFzKG1lc3NhZ2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgTE9HR0VEX01FU1NBR0VTLmFkZChtZXNzYWdlKTtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3JkZXItYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLmpzJztcbmltcG9ydCB7IE9yZGVyQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29yZGVyLWJ5LWl0ZW0tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeUl0ZW1CdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9vcmRlci1ieS1pdGVtLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgbG9nT25jZSB9IGZyb20gJy4uL3V0aWwvbG9nLW9uY2UuanMnO1xuaW1wb3J0IHsgaXNFeHByZXNzaW9uT3JGYWN0b3J5LCBwYXJzZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVN0cmluZ1JlZmVyZW5jZSwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3JkZXJCeURpcmVjdGlvbih0aGluZykge1xuICAgIHJldHVybiB0aGluZyA9PT0gJ2FzYycgfHwgdGhpbmcgPT09ICdkZXNjJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU9yZGVyQnkoYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW3BhcnNlT3JkZXJCeUl0ZW0oYXJnc1swXSwgYXJnc1sxXSldO1xuICAgIH1cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3QgW29yZGVyQnldID0gYXJncztcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3JkZXJCeSkpIHtcbiAgICAgICAgICAgIGxvZ09uY2UoJ29yZGVyQnkoYXJyYXkpIGlzIGRlcHJlY2F0ZWQsIHVzZSBtdWx0aXBsZSBvcmRlckJ5IGNhbGxzIGluc3RlYWQuJyk7XG4gICAgICAgICAgICByZXR1cm4gb3JkZXJCeS5tYXAoKGl0ZW0pID0+IHBhcnNlT3JkZXJCeUl0ZW0oaXRlbSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcGFyc2VPcmRlckJ5SXRlbShvcmRlckJ5KV07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGF0IG9yZGVyIGJ5ISBleHBlY3RlZCAxLTIsIHJlY2VpdmVkICR7YXJncy5sZW5ndGh9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlckJ5SXRlbShleHByLCBtb2RpZmllcnMpIHtcbiAgICBjb25zdCBwYXJzZWRSZWYgPSBwYXJzZU9yZGVyQnlFeHByZXNzaW9uKGV4cHIpO1xuICAgIGlmIChPcmRlckJ5SXRlbU5vZGUuaXMocGFyc2VkUmVmKSkge1xuICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGRpcmVjdGlvbiB0d2ljZSEnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VkUmVmO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyhwYXJzZWRSZWYsIG1vZGlmaWVycyk7XG59XG5mdW5jdGlvbiBwYXJzZU9yZGVyQnlFeHByZXNzaW9uKGV4cHIpIHtcbiAgICBpZiAoaXNFeHByZXNzaW9uT3JGYWN0b3J5KGV4cHIpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwcik7XG4gICAgfVxuICAgIGlmIChpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKGV4cHIpKSB7XG4gICAgICAgIHJldHVybiBleHByLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBjb25zdCBbcmVmLCBkaXJlY3Rpb25dID0gZXhwci5zcGxpdCgnICcpO1xuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgICAgbG9nT25jZShcImBvcmRlckJ5KCdjb2x1bW4gYXNjJylgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgb3JkZXJCeSgnY29sdW1uJywgJ2FzYycpYCBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlT3JkZXJCeVdpdGhNb2RpZmllcnMocGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKSwgZGlyZWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlKGV4cHIpO1xufVxuZnVuY3Rpb24gcGFyc2VPcmRlckJ5V2l0aE1vZGlmaWVycyhleHByLCBtb2RpZmllcnMpIHtcbiAgICBpZiAodHlwZW9mIG1vZGlmaWVycyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKCFpc09yZGVyQnlEaXJlY3Rpb24obW9kaWZpZXJzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9yZGVyIGJ5IGRpcmVjdGlvbjogJHttb2RpZmllcnN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9yZGVyQnlJdGVtTm9kZS5jcmVhdGUoZXhwciwgUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKG1vZGlmaWVycykpO1xuICAgIH1cbiAgICBpZiAoaXNFeHByZXNzaW9uKG1vZGlmaWVycykpIHtcbiAgICAgICAgbG9nT25jZShcImBvcmRlckJ5KC4uLiwgZXhwcilgIGlzIGRlcHJlY2F0ZWQuIFVzZSBgb3JkZXJCeSguLi4sICdhc2MnKWAgb3IgYG9yZGVyQnkoLi4uLCAob2IpID0+IC4uLilgIGluc3RlYWQuXCIpO1xuICAgICAgICByZXR1cm4gT3JkZXJCeUl0ZW1Ob2RlLmNyZWF0ZShleHByLCBtb2RpZmllcnMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gT3JkZXJCeUl0ZW1Ob2RlLmNyZWF0ZShleHByKTtcbiAgICBpZiAoIW1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGlmaWVycyhuZXcgT3JkZXJCeUl0ZW1CdWlsZGVyKHsgbm9kZSB9KSkudG9PcGVyYXRpb25Ob2RlKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcmVmZXJlbmNlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlJlZmVyZW5jZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0pTT05SZWZlcmVuY2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShyZWZlcmVuY2UsIHRyYXZlcnNhbCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICByZWZlcmVuY2UsXG4gICAgICAgICAgICB0cmF2ZXJzYWwsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVHJhdmVyc2FsKG5vZGUsIHRyYXZlcnNhbCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB0cmF2ZXJzYWwsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1vcGVyYXRvci1jaGFpbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05PcGVyYXRvckNoYWluTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShvcGVyYXRvcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OT3BlcmF0b3JDaGFpbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3IsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVmFsdWUobm9kZSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUoWy4uLm5vZGUudmFsdWVzLCB2YWx1ZV0pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2pzb24tcGF0aC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05QYXRoTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnSlNPTlBhdGhOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpbk9wZXJhdG9yKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTm9kZScsXG4gICAgICAgICAgICBpbk9wZXJhdG9yLFxuICAgICAgICAgICAgcGF0aExlZ3M6IGZyZWV6ZShbXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGVnKGpzb25QYXRoTm9kZSwgcGF0aExlZykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmpzb25QYXRoTm9kZSxcbiAgICAgICAgICAgIHBhdGhMZWdzOiBmcmVlemUoWy4uLmpzb25QYXRoTm9kZS5wYXRoTGVncywgcGF0aExlZ10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZmVyZW5jZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc1JlYWRvbmx5QXJyYXksIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBpc0V4cHJlc3Npb25PckZhY3RvcnksIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09yZGVyQnlEaXJlY3Rpb24sIHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuL29yZGVyLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBPcGVyYXRvck5vZGUsIGlzSlNPTk9wZXJhdG9yLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlJlZmVyZW5jZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXJlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9qc29uLXBhdGgtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTaW1wbGVSZWZlcmVuY2VFeHByZXNzaW9uKGV4cCkge1xuICAgIGlmIChpc1N0cmluZyhleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShleHApO1xuICAgIH1cbiAgICByZXR1cm4gZXhwLnRvT3BlcmF0aW9uTm9kZSgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmcpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KGFyZykpIHtcbiAgICAgICAgcmV0dXJuIGFyZy5tYXAoKGl0KSA9PiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZyldO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbihleHApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSlNPTlJlZmVyZW5jZShyZWYsIG9wKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IHBhcnNlU3RyaW5nUmVmZXJlbmNlKHJlZik7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05PcGVyYXRvckNoYWluTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcCkpKTtcbiAgICB9XG4gICAgY29uc3Qgb3BXaXRob3V0TGFzdENoYXIgPSBvcC5zbGljZSgwLCAtMSk7XG4gICAgaWYgKGlzSlNPTk9wZXJhdG9yKG9wV2l0aG91dExhc3RDaGFyKSkge1xuICAgICAgICByZXR1cm4gSlNPTlJlZmVyZW5jZU5vZGUuY3JlYXRlKHJlZmVyZW5jZU5vZGUsIEpTT05QYXRoTm9kZS5jcmVhdGUoT3BlcmF0b3JOb2RlLmNyZWF0ZShvcFdpdGhvdXRMYXN0Q2hhcikpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEpTT04gb3BlcmF0b3I6ICR7b3B9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmKSB7XG4gICAgY29uc3QgQ09MVU1OX1NFUEFSQVRPUiA9ICcuJztcbiAgICBpZiAoIXJlZi5pbmNsdWRlcyhDT0xVTU5fU0VQQVJBVE9SKSkge1xuICAgICAgICByZXR1cm4gUmVmZXJlbmNlTm9kZS5jcmVhdGUoQ29sdW1uTm9kZS5jcmVhdGUocmVmKSk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnRzID0gcmVmLnNwbGl0KENPTFVNTl9TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICBpZiAocGFydHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZUFuZFNjaGVtYShwYXJ0cyk7XG4gICAgfVxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUmVmZXJlbmNlV2l0aFRhYmxlKHBhcnRzKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGNvbHVtbiByZWZlcmVuY2UgJHtyZWZ9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlKHJlZikge1xuICAgIGNvbnN0IEFMSUFTX1NFUEFSQVRPUiA9ICcgYXMgJztcbiAgICBpZiAocmVmLmluY2x1ZGVzKEFMSUFTX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtblJlZiwgYWxpYXNdID0gcmVmLnNwbGl0KEFMSUFTX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZShwYXJzZVN0cmluZ1JlZmVyZW5jZShjb2x1bW5SZWYpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUoYWxpYXMpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbHVtbk5hbWUoY29sdW1uKSB7XG4gICAgcmV0dXJuIENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPcmRlcmVkQ29sdW1uTmFtZShjb2x1bW4pIHtcbiAgICBjb25zdCBPUkRFUl9TRVBBUkFUT1IgPSAnICc7XG4gICAgaWYgKGNvbHVtbi5pbmNsdWRlcyhPUkRFUl9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFtjb2x1bW5OYW1lLCBvcmRlcl0gPSBjb2x1bW4uc3BsaXQoT1JERVJfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIGlmICghaXNPcmRlckJ5RGlyZWN0aW9uKG9yZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG9yZGVyIGRpcmVjdGlvbiBcIiR7b3JkZXJ9XCIgbmV4dCB0byBcIiR7Y29sdW1uTmFtZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJzZU9yZGVyQnkoW2NvbHVtbk5hbWUsIG9yZGVyXSlbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcGFyc2VDb2x1bW5OYW1lKGNvbHVtbik7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEocGFydHMpIHtcbiAgICBjb25zdCBbc2NoZW1hLCB0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKSk7XG59XG5mdW5jdGlvbiBwYXJzZVN0cmluZ1JlZmVyZW5jZVdpdGhUYWJsZShwYXJ0cykge1xuICAgIGNvbnN0IFt0YWJsZSwgY29sdW1uXSA9IHBhcnRzO1xuICAgIHJldHVybiBSZWZlcmVuY2VOb2RlLmNyZWF0ZShDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLCBUYWJsZU5vZGUuY3JlYXRlKHRhYmxlKSk7XG59XG5mdW5jdGlvbiB0cmltKHN0cikge1xuICAgIHJldHVybiBzdHIudHJpbSgpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1pdGl2ZVZhbHVlTGlzdE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltaXRpdmVWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKFsuLi52YWx1ZXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1saXN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgVmFsdWVMaXN0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTGlzdE5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiBmcmVlemUodmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVmFsdWVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWl0aXZlLXZhbHVlLWxpc3Qtbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCb29sZWFuLCBpc051bGwsIGlzTnVtYmVyLCBpc1JlYWRvbmx5QXJyYXksIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uLCBpc0V4cHJlc3Npb25PckZhY3RvcnksIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QoYXJnKSB7XG4gICAgaWYgKGlzUmVhZG9ubHlBcnJheShhcmcpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QoYXJnKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlVmFsdWVFeHByZXNzaW9uKGFyZyk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzRXhwcmVzc2lvbk9yRmFjdG9yeShleHApKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oZXhwKTtcbiAgICB9XG4gICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGUoZXhwKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKSB8fCBpc051bGwodmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKCFpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bnNhZmUgaW1tZWRpYXRlIHZhbHVlICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApO1xuICAgIH1cbiAgICByZXR1cm4gVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwYXJzZVZhbHVlRXhwcmVzc2lvbkxpc3QoYXJnKSB7XG4gICAgaWYgKGFyZy5zb21lKGlzRXhwcmVzc2lvbk9yRmFjdG9yeSkpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKGFyZy5tYXAoKGl0KSA9PiBwYXJzZVZhbHVlRXhwcmVzc2lvbihpdCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUuY3JlYXRlKGFyZyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcmVucy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFBhcmVuc05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1BhcmVuc05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFyZW5zTm9kZScsXG4gICAgICAgICAgICBub2RlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQmluYXJ5T3BlcmF0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2JpbmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzTnVsbCwgaXNTdHJpbmcsIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3BlcmF0b3JOb2RlLCBPUEVSQVRPUlMsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcGFyc2VWYWx1ZUV4cHJlc3Npb24oYXJnc1swXSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncyl9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbihsZWZ0LCBvcGVyYXRvciwgcmlnaHQpIHtcbiAgICBpZiAoaXNJc09wZXJhdG9yKG9wZXJhdG9yKSAmJiBuZWVkc0lzT3BlcmF0b3IocmlnaHQpKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHJpZ2h0KSk7XG4gICAgfVxuICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24obGVmdCksIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdChyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGVmdCwgb3BlcmF0b3IsIHJpZ2h0KSB7XG4gICAgcmV0dXJuIEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihsZWZ0KSwgcGFyc2VPcGVyYXRvcihvcGVyYXRvciksIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihyaWdodCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmlsdGVyT2JqZWN0KG9iaiwgY29tYmluYXRvcikge1xuICAgIHJldHVybiBwYXJzZUZpbHRlckxpc3QoT2JqZWN0LmVudHJpZXMob2JqKVxuICAgICAgICAuZmlsdGVyKChbLCB2XSkgPT4gIWlzVW5kZWZpbmVkKHYpKVxuICAgICAgICAubWFwKChbaywgdl0pID0+IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24oaywgbmVlZHNJc09wZXJhdG9yKHYpID8gJ2lzJyA6ICc9JywgdikpLCBjb21iaW5hdG9yKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpbHRlckxpc3QobGlzdCwgY29tYmluYXRvciwgd2l0aFBhcmVucyA9IHRydWUpIHtcbiAgICBjb25zdCBjb21iaW5lID0gY29tYmluYXRvciA9PT0gJ2FuZCcgPyBBbmROb2RlLmNyZWF0ZSA6IE9yTm9kZS5jcmVhdGU7XG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKDEpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCc9JyksIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUoY29tYmluYXRvciA9PT0gJ2FuZCcgPyAxIDogMCkpO1xuICAgIH1cbiAgICBsZXQgbm9kZSA9IHRvT3BlcmF0aW9uTm9kZShsaXN0WzBdKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbm9kZSA9IGNvbWJpbmUobm9kZSwgdG9PcGVyYXRpb25Ob2RlKGxpc3RbaV0pKTtcbiAgICB9XG4gICAgaWYgKGxpc3QubGVuZ3RoID4gMSAmJiB3aXRoUGFyZW5zKSB7XG4gICAgICAgIHJldHVybiBQYXJlbnNOb2RlLmNyZWF0ZShub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBpc0lzT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3IgPT09ICdpcycgfHwgb3BlcmF0b3IgPT09ICdpcyBub3QnO1xufVxuZnVuY3Rpb24gbmVlZHNJc09wZXJhdG9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIGlzTnVsbCh2YWx1ZSkgfHwgaXNCb29sZWFuKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT3BlcmF0b3Iob3BlcmF0b3IpIHtcbiAgICBpZiAoaXNTdHJpbmcob3BlcmF0b3IpICYmIE9QRVJBVE9SUy5pbmNsdWRlcyhvcGVyYXRvcikpIHtcbiAgICAgICAgcmV0dXJuIE9wZXJhdG9yTm9kZS5jcmVhdGUob3BlcmF0b3IpO1xuICAgIH1cbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKG9wZXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gb3BlcmF0b3IudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBvcGVyYXRvciAke0pTT04uc3RyaW5naWZ5KG9wZXJhdG9yKX1gKTtcbn1cbmZ1bmN0aW9uIHRvT3BlcmF0aW9uTm9kZShub2RlT3JTb3VyY2UpIHtcbiAgICByZXR1cm4gaXNPcGVyYXRpb25Ob2RlU291cmNlKG5vZGVPclNvdXJjZSlcbiAgICAgICAgPyBub2RlT3JTb3VyY2UudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgOiBub2RlT3JTb3VyY2U7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29yZGVyLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT3JkZXJCeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yZGVyQnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKFsuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKG9yZGVyQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3JkZXJCeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLm9yZGVyQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFydGl0aW9uLWJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdQYXJ0aXRpb25CeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogZnJlZXplKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJdGVtcyhwYXJ0aXRpb25CeSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5wYXJ0aXRpb25CeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLnBhcnRpdGlvbkJ5Lml0ZW1zLCAuLi5pdGVtc10pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbmltcG9ydCB7IFBhcnRpdGlvbkJ5Tm9kZSB9IGZyb20gJy4vcGFydGl0aW9uLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE92ZXJOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPdmVyTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ092ZXJOb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMob3Zlck5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ub3Zlck5vZGUsXG4gICAgICAgICAgICBvcmRlckJ5OiBvdmVyTm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhvdmVyTm9kZS5vcmRlckJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUGFydGl0aW9uQnlJdGVtcyhvdmVyTm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdmVyTm9kZSxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiBvdmVyTm9kZS5wYXJ0aXRpb25CeVxuICAgICAgICAgICAgICAgID8gUGFydGl0aW9uQnlOb2RlLmNsb25lV2l0aEl0ZW1zKG92ZXJOb2RlLnBhcnRpdGlvbkJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IFBhcnRpdGlvbkJ5Tm9kZS5jcmVhdGUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Zyb20tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGcm9tTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRnJvbU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZyb21zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0Zyb21Ob2RlJyxcbiAgICAgICAgICAgIGZyb21zOiBmcmVlemUoZnJvbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb21zKGZyb20sIGZyb21zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZnJvbSxcbiAgICAgICAgICAgIGZyb21zOiBmcmVlemUoWy4uLmZyb20uZnJvbXMsIC4uLmZyb21zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZ3JvdXAtYnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHcm91cEJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnR3JvdXBCeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dyb3VwQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoaXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEl0ZW1zKGdyb3VwQnksIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uZ3JvdXBCeSxcbiAgICAgICAgICAgIGl0ZW1zOiBmcmVlemUoWy4uLmdyb3VwQnkuaXRlbXMsIC4uLml0ZW1zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaGF2aW5nLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBbmROb2RlIH0gZnJvbSAnLi9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPck5vZGUgfSBmcm9tICcuL29yLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEhhdmluZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0hhdmluZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdIYXZpbmdOb2RlJyxcbiAgICAgICAgICAgIGhhdmluZzogZmlsdGVyLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9wZXJhdGlvbihoYXZpbmdOb2RlLCBvcGVyYXRvciwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uaGF2aW5nTm9kZSxcbiAgICAgICAgICAgIGhhdmluZzogb3BlcmF0b3IgPT09ICdBbmQnXG4gICAgICAgICAgICAgICAgPyBBbmROb2RlLmNyZWF0ZShoYXZpbmdOb2RlLmhhdmluZywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogT3JOb2RlLmNyZWF0ZShoYXZpbmdOb2RlLmhhdmluZywgb3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBJbnNlcnRRdWVyeU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0luc2VydFF1ZXJ5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaW50bywgd2l0aE5vZGUsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG8sXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgICAgIHJlcGxhY2UsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlV2l0aG91dEludG8oKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0luc2VydFF1ZXJ5Tm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGluc2VydFF1ZXJ5LCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmluc2VydFF1ZXJ5LFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbGlzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IExpc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdMaXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTGlzdE5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IGZyZWV6ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGcm9tTm9kZSB9IGZyb20gJy4vZnJvbS1ub2RlLmpzJztcbmltcG9ydCB7IExpc3ROb2RlIH0gZnJvbSAnLi9saXN0LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFVwZGF0ZVF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVXBkYXRlUXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh0YWJsZXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VwZGF0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHVzZSB0aGUgcmF3IHRhYmxlIG5vZGUgd2hlbiB0aGVyZSdzIG9ubHkgb25lIHRhYmxlXG4gICAgICAgICAgICAvLyBhbmQgZG9uJ3QgcmVuYW1lIHRoZSBwcm9wZXJ0eSB0byBzb21ldGhpbmcgbGlrZSBgdGFibGVzYC5cbiAgICAgICAgICAgIHRhYmxlOiB0YWJsZXMubGVuZ3RoID09PSAxID8gdGFibGVzWzBdIDogTGlzdE5vZGUuY3JlYXRlKHRhYmxlcyksXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRob3V0VGFibGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VwZGF0ZVF1ZXJ5Tm9kZScsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbUl0ZW1zKHVwZGF0ZVF1ZXJ5LCBmcm9tSXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51cGRhdGVRdWVyeSxcbiAgICAgICAgICAgIGZyb206IHVwZGF0ZVF1ZXJ5LmZyb21cbiAgICAgICAgICAgICAgICA/IEZyb21Ob2RlLmNsb25lV2l0aEZyb21zKHVwZGF0ZVF1ZXJ5LmZyb20sIGZyb21JdGVtcylcbiAgICAgICAgICAgICAgICA6IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVwZGF0ZXModXBkYXRlUXVlcnksIHVwZGF0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi51cGRhdGVRdWVyeSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHVwZGF0ZVF1ZXJ5LnVwZGF0ZXNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udXBkYXRlUXVlcnkudXBkYXRlcywgLi4udXBkYXRlc10pXG4gICAgICAgICAgICAgICAgOiB1cGRhdGVzLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aExpbWl0KHVwZGF0ZVF1ZXJ5LCBsaW1pdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnVwZGF0ZVF1ZXJ5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXNpbmctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVc2luZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VzaW5nTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VzaW5nTm9kZScsXG4gICAgICAgICAgICB0YWJsZXM6IGZyZWV6ZSh0YWJsZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFRhYmxlcyh1c2luZywgdGFibGVzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4udXNpbmcsXG4gICAgICAgICAgICB0YWJsZXM6IGZyZWV6ZShbLi4udXNpbmcudGFibGVzLCAuLi50YWJsZXNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEZyb21Ob2RlIH0gZnJvbSAnLi9mcm9tLW5vZGUuanMnO1xuaW1wb3J0IHsgVXNpbmdOb2RlIH0gZnJvbSAnLi91c2luZy1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4vcXVlcnktbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVsZXRlUXVlcnlOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEZWxldGVRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZyb21JdGVtcywgd2l0aE5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRGVsZXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IEZyb21Ob2RlLmNyZWF0ZShmcm9tSXRlbXMpLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5OiAobm9kZSkgPT4gUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkobm9kZSksXG4gICAgY2xvbmVXaXRoTGltaXQoZGVsZXRlTm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0TGltaXQoZGVsZXRlTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFVzaW5nKGRlbGV0ZU5vZGUsIHRhYmxlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRlbGV0ZU5vZGUsXG4gICAgICAgICAgICB1c2luZzogZGVsZXRlTm9kZS51c2luZyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBVc2luZ05vZGUuY2xvbmVXaXRoVGFibGVzKGRlbGV0ZU5vZGUudXNpbmcsIHRhYmxlcylcbiAgICAgICAgICAgICAgICA6IFVzaW5nTm9kZS5jcmVhdGUodGFibGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aGVyZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4vYW5kLW5vZGUuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi9vci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBXaGVyZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1doZXJlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZmlsdGVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1doZXJlTm9kZScsXG4gICAgICAgICAgICB3aGVyZTogZmlsdGVyLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9wZXJhdGlvbih3aGVyZU5vZGUsIG9wZXJhdG9yLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi53aGVyZU5vZGUsXG4gICAgICAgICAgICB3aGVyZTogb3BlcmF0b3IgPT09ICdBbmQnXG4gICAgICAgICAgICAgICAgPyBBbmROb2RlLmNyZWF0ZSh3aGVyZU5vZGUud2hlcmUsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IE9yTm9kZS5jcmVhdGUod2hlcmVOb2RlLndoZXJlLCBvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JldHVybmluZy1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJldHVybmluZ05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JldHVybmluZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmV0dXJuaW5nTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2VsZWN0aW9ucyhyZXR1cm5pbmcsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5yZXR1cm5pbmcsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiByZXR1cm5pbmcuc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5yZXR1cm5pbmcuc2VsZWN0aW9ucywgLi4uc2VsZWN0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZXhwbGFpbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEV4cGxhaW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdFeHBsYWluTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0V4cGxhaW5Ob2RlJyxcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2hlbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdoZW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdXaGVuTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uZGl0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1doZW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhSZXN1bHQod2hlbk5vZGUsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLndoZW5Ob2RlLFxuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXF1ZXJ5LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVuTm9kZSB9IGZyb20gJy4vd2hlbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBNZXJnZVF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTWVyZ2VRdWVyeU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGludG8sIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01lcmdlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG8sXG4gICAgICAgICAgICAuLi4od2l0aE5vZGUgJiYgeyB3aXRoOiB3aXRoTm9kZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVc2luZyhtZXJnZU5vZGUsIHVzaW5nKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubWVyZ2VOb2RlLFxuICAgICAgICAgICAgdXNpbmcsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoV2hlbihtZXJnZU5vZGUsIHdoZW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5tZXJnZU5vZGUsXG4gICAgICAgICAgICB3aGVuczogbWVyZ2VOb2RlLndoZW5zXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLm1lcmdlTm9kZS53aGVucywgd2hlbl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW3doZW5dKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUaGVuKG1lcmdlTm9kZSwgdGhlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm1lcmdlTm9kZSxcbiAgICAgICAgICAgIHdoZW5zOiBtZXJnZU5vZGUud2hlbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbXG4gICAgICAgICAgICAgICAgICAgIC4uLm1lcmdlTm9kZS53aGVucy5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgICAgIFdoZW5Ob2RlLmNsb25lV2l0aFJlc3VsdChtZXJnZU5vZGUud2hlbnNbbWVyZ2VOb2RlLndoZW5zLmxlbmd0aCAtIDFdLCB0aGVuKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL291dHB1dC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE91dHB1dE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ091dHB1dE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnT3V0cHV0Tm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2VsZWN0aW9ucyhvdXRwdXQsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5vdXRwdXQsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBvdXRwdXQuc2VsZWN0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5vdXRwdXQuc2VsZWN0aW9ucywgLi4uc2VsZWN0aW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IEluc2VydFF1ZXJ5Tm9kZSB9IGZyb20gJy4vaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlOb2RlIH0gZnJvbSAnLi9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuL3VwZGF0ZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5Tm9kZSB9IGZyb20gJy4vZGVsZXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJldHVybmluZ05vZGUgfSBmcm9tICcuL3JldHVybmluZy1ub2RlLmpzJztcbmltcG9ydCB7IEV4cGxhaW5Ob2RlIH0gZnJvbSAnLi9leHBsYWluLW5vZGUuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuL21lcmdlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3V0cHV0Tm9kZSB9IGZyb20gJy4vb3V0cHV0LW5vZGUuanMnO1xuaW1wb3J0IHsgT3JkZXJCeU5vZGUgfSBmcm9tICcuL29yZGVyLWJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gKFNlbGVjdFF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgSW5zZXJ0UXVlcnlOb2RlLmlzKG5vZGUpIHx8XG4gICAgICAgICAgICBVcGRhdGVRdWVyeU5vZGUuaXMobm9kZSkgfHxcbiAgICAgICAgICAgIERlbGV0ZVF1ZXJ5Tm9kZS5pcyhub2RlKSB8fFxuICAgICAgICAgICAgTWVyZ2VRdWVyeU5vZGUuaXMobm9kZSkpO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRW5kTW9kaWZpZXIobm9kZSwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiBub2RlLmVuZE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmVuZE1vZGlmaWVycywgbW9kaWZpZXJdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFttb2RpZmllcl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFdoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogbm9kZS53aGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLndoZXJlLCAnQW5kJywgb3BlcmF0aW9uKVxuICAgICAgICAgICAgICAgIDogV2hlcmVOb2RlLmNyZWF0ZShvcGVyYXRpb24pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEpvaW4obm9kZSwgam9pbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBqb2luczogbm9kZS5qb2lucyA/IGZyZWV6ZShbLi4ubm9kZS5qb2lucywgam9pbl0pIDogZnJlZXplKFtqb2luXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoUmV0dXJuaW5nKG5vZGUsIHNlbGVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiBub2RlLnJldHVybmluZ1xuICAgICAgICAgICAgICAgID8gUmV0dXJuaW5nTm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKG5vZGUucmV0dXJuaW5nLCBzZWxlY3Rpb25zKVxuICAgICAgICAgICAgICAgIDogUmV0dXJuaW5nTm9kZS5jcmVhdGUoc2VsZWN0aW9ucyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0UmV0dXJuaW5nKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0V2hlcmUobm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB3aGVyZTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEV4cGxhaW4obm9kZSwgZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGV4cGxhaW46IEV4cGxhaW5Ob2RlLmNyZWF0ZShmb3JtYXQsIG9wdGlvbnM/LnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhUb3Aobm9kZSwgdG9wKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHRvcCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPdXRwdXQobm9kZSwgc2VsZWN0aW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBvdXRwdXQ6IG5vZGUub3V0cHV0XG4gICAgICAgICAgICAgICAgPyBPdXRwdXROb2RlLmNsb25lV2l0aFNlbGVjdGlvbnMobm9kZS5vdXRwdXQsIHNlbGVjdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBPdXRwdXROb2RlLmNyZWF0ZShzZWxlY3Rpb25zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXMobm9kZSwgaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogbm9kZS5vcmRlckJ5XG4gICAgICAgICAgICAgICAgPyBPcmRlckJ5Tm9kZS5jbG9uZVdpdGhJdGVtcyhub2RlLm9yZGVyQnksIGl0ZW1zKVxuICAgICAgICAgICAgICAgIDogT3JkZXJCeU5vZGUuY3JlYXRlKGl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRPcmRlckJ5KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgb3JkZXJCeTogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NlbGVjdC1xdWVyeS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRnJvbU5vZGUgfSBmcm9tICcuL2Zyb20tbm9kZS5qcyc7XG5pbXBvcnQgeyBHcm91cEJ5Tm9kZSB9IGZyb20gJy4vZ3JvdXAtYnktbm9kZS5qcyc7XG5pbXBvcnQgeyBIYXZpbmdOb2RlIH0gZnJvbSAnLi9oYXZpbmctbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuL3F1ZXJ5LW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbGVjdFF1ZXJ5Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0UXVlcnlOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh3aXRoTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RRdWVyeU5vZGUnLFxuICAgICAgICAgICAgLi4uKHdpdGhOb2RlICYmIHsgd2l0aDogd2l0aE5vZGUgfSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlRnJvbShmcm9tSXRlbXMsIHdpdGhOb2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdFF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBmcm9tOiBGcm9tTm9kZS5jcmVhdGUoZnJvbUl0ZW1zKSxcbiAgICAgICAgICAgIC4uLih3aXRoTm9kZSAmJiB7IHdpdGg6IHdpdGhOb2RlIH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aFNlbGVjdGlvbnMoc2VsZWN0LCBzZWxlY3Rpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0aW9uczogc2VsZWN0LnNlbGVjdGlvbnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LnNlbGVjdGlvbnMsIC4uLnNlbGVjdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKHNlbGVjdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0T24oc2VsZWN0LCBleHByZXNzaW9ucykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGRpc3RpbmN0T246IHNlbGVjdC5kaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnNlbGVjdC5kaXN0aW5jdE9uLCAuLi5leHByZXNzaW9uc10pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoZXhwcmVzc2lvbnMpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEZyb250TW9kaWZpZXIoc2VsZWN0LCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiBzZWxlY3QuZnJvbnRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4uc2VsZWN0LmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW21vZGlmaWVyXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgLy8gVE9ETzogcmVtb3ZlIGluIHYwLjI5XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeWAgaW5zdGVhZC5cbiAgICAgKi9cbiAgICBjbG9uZVdpdGhPcmRlckJ5SXRlbXM6IChub2RlLCBpdGVtcykgPT4gUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyhub2RlLCBpdGVtcyksXG4gICAgY2xvbmVXaXRoR3JvdXBCeUl0ZW1zKHNlbGVjdE5vZGUsIGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIGdyb3VwQnk6IHNlbGVjdE5vZGUuZ3JvdXBCeVxuICAgICAgICAgICAgICAgID8gR3JvdXBCeU5vZGUuY2xvbmVXaXRoSXRlbXMoc2VsZWN0Tm9kZS5ncm91cEJ5LCBpdGVtcylcbiAgICAgICAgICAgICAgICA6IEdyb3VwQnlOb2RlLmNyZWF0ZShpdGVtcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoTGltaXQoc2VsZWN0Tm9kZSwgbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT2Zmc2V0KHNlbGVjdE5vZGUsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRmV0Y2goc2VsZWN0Tm9kZSwgZmV0Y2gpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3ROb2RlLFxuICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSGF2aW5nKHNlbGVjdE5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdE5vZGUsXG4gICAgICAgICAgICBoYXZpbmc6IHNlbGVjdE5vZGUuaGF2aW5nXG4gICAgICAgICAgICAgICAgPyBIYXZpbmdOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihzZWxlY3ROb2RlLmhhdmluZywgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IEhhdmluZ05vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyhzZWxlY3ROb2RlLCBzZXRPcGVyYXRpb25zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uc2VsZWN0Tm9kZSxcbiAgICAgICAgICAgIHNldE9wZXJhdGlvbnM6IHNlbGVjdE5vZGUuc2V0T3BlcmF0aW9uc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5zZWxlY3ROb2RlLnNldE9wZXJhdGlvbnMsIC4uLnNldE9wZXJhdGlvbnNdKVxuICAgICAgICAgICAgICAgIDogZnJlZXplKFsuLi5zZXRPcGVyYXRpb25zXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0U2VsZWN0aW9ucyhzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiBbXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRMaW1pdChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBsaW1pdDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aG91dE9mZnNldChzZWxlY3QpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5zZWxlY3QsXG4gICAgICAgICAgICBvZmZzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gdjAuMjlcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5YCBpbnN0ZWFkLlxuICAgICAqL1xuICAgIGNsb25lV2l0aG91dE9yZGVyQnk6IChub2RlKSA9PiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeShub2RlKSxcbiAgICBjbG9uZVdpdGhvdXRHcm91cEJ5KHNlbGVjdCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnNlbGVjdCxcbiAgICAgICAgICAgIGdyb3VwQnk6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEpvaW5CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBvbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgSm9pbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBqb2luTm9kZTogSm9pbk5vZGUuY2xvbmVXaXRoT24odGhpcy4jcHJvcHMuam9pbk5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVzdCBsaWtlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gYnV0IGFkZHMgYW4gaXRlbSB0byB0aGUgam9pbidzXG4gICAgICogYG9uYCBjbGF1c2UgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgV2hlcmVJbnRlcmZhY2Uud2hlcmVSZWZ9IGZvciBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy5cbiAgICAgKi9cbiAgICBvblJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG9uIHRydWVgLlxuICAgICAqL1xuICAgIG9uVHJ1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKb2luQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGpvaW5Ob2RlOiBKb2luTm9kZS5jbG9uZVdpdGhPbih0aGlzLiNwcm9wcy5qb2luTm9kZSwgUmF3Tm9kZS5jcmVhdGVXaXRoU3FsKCd0cnVlJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5qb2luTm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgUGFydGl0aW9uQnlJdGVtTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnUGFydGl0aW9uQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUocGFydGl0aW9uQnkpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUGFydGl0aW9uQnlJdGVtTm9kZScsXG4gICAgICAgICAgICBwYXJ0aXRpb25CeSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wYXJ0aXRpb24tYnktcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgUGFydGl0aW9uQnlJdGVtTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcnRpdGlvbi1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJ0aXRpb25CeShwYXJ0aXRpb25CeSkge1xuICAgIHJldHVybiBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QocGFydGl0aW9uQnkpLm1hcChQYXJ0aXRpb25CeUl0ZW1Ob2RlLmNyZWF0ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL292ZXItYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IE92ZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Zlci1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VQYXJ0aXRpb25CeSwgfSBmcm9tICcuLi9wYXJzZXIvcGFydGl0aW9uLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3ZlckJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgICAgIG92ZXJOb2RlOiBPdmVyTm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPcmRlckJ5KHRoaXMuI3Byb3BzLm92ZXJOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhcnRpdGlvbkJ5KHBhcnRpdGlvbkJ5KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3ZlckJ1aWxkZXIoe1xuICAgICAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNsb25lV2l0aFBhcnRpdGlvbkJ5SXRlbXModGhpcy4jcHJvcHMub3Zlck5vZGUsIHBhcnNlUGFydGl0aW9uQnkocGFydGl0aW9uQnkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMub3Zlck5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJlZmVyZW5jZU5vZGUgfSBmcm9tICcuL3JlZmVyZW5jZS1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdEFsbE5vZGUgfSBmcm9tICcuL3NlbGVjdC1hbGwtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgU2VsZWN0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnU2VsZWN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY3JlYXRlU2VsZWN0QWxsKCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbjogU2VsZWN0QWxsTm9kZS5jcmVhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVTZWxlY3RBbGxGcm9tVGFibGUodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0aW9uTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb246IFJlZmVyZW5jZU5vZGUuY3JlYXRlU2VsZWN0QWxsKHRhYmxlKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNGdW5jdGlvbiwgaXNSZWFkb25seUFycmF5LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNlbGVjdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRTdHJpbmdSZWZlcmVuY2UgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtcmVmZXJlbmNlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VBbGlhc2VkRXhwcmVzc2lvbiwgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBleHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKGV4cHJlc3Npb25CdWlsZGVyKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNSZWFkb25seUFycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5tYXAoKGl0KSA9PiBwYXJzZVNlbGVjdEV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VTZWxlY3RFeHByZXNzaW9uKHNlbGVjdGlvbildO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0RXhwcmVzc2lvbihzZWxlY3Rpb24pIHtcbiAgICBpZiAoaXNTdHJpbmcoc2VsZWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUocGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlKHNlbGVjdGlvbikpO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyKHNlbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIFNlbGVjdGlvbk5vZGUuY3JlYXRlKHNlbGVjdGlvbi50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGUocGFyc2VBbGlhc2VkRXhwcmVzc2lvbihzZWxlY3Rpb24pKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZWxlY3RBbGwodGFibGUpIHtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBbU2VsZWN0aW9uTm9kZS5jcmVhdGVTZWxlY3RBbGwoKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGFibGUpKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS5tYXAocGFyc2VTZWxlY3RBbGxBcmcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtwYXJzZVNlbGVjdEFsbEFyZyh0YWJsZSldO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHBhcnNlU2VsZWN0QWxsQXJnKHRhYmxlKSB7XG4gICAgaWYgKGlzU3RyaW5nKHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gU2VsZWN0aW9uTm9kZS5jcmVhdGVTZWxlY3RBbGxGcm9tVGFibGUocGFyc2VUYWJsZSh0YWJsZSkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdmFsdWUgc2VsZWN0QWxsIGV4cHJlc3Npb246ICR7SlNPTi5zdHJpbmdpZnkodGFibGUpfWApO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi92YWx1ZXMtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBWYWx1ZXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdWYWx1ZXNOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVmFsdWVzTm9kZScsXG4gICAgICAgICAgICB2YWx1ZXM6IGZyZWV6ZSh2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEluc2VydFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVmYXVsdEluc2VydFZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRJbnNlcnRWYWx1ZU5vZGUnLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2luc2VydC12YWx1ZXMtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltaXRpdmUtdmFsdWUtbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXksIGlzVW5kZWZpbmVkLCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgVmFsdWVzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ZhbHVlcy1ub2RlLmpzJztcbmltcG9ydCB7IGlzRXhwcmVzc2lvbk9yRmFjdG9yeSB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEluc2VydFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtaW5zZXJ0LXZhbHVlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5zZXJ0RXhwcmVzc2lvbihhcmcpIHtcbiAgICBjb25zdCBvYmplY3RPckxpc3QgPSBpc0Z1bmN0aW9uKGFyZykgPyBhcmcoZXhwcmVzc2lvbkJ1aWxkZXIoKSkgOiBhcmc7XG4gICAgY29uc3QgbGlzdCA9IGlzUmVhZG9ubHlBcnJheShvYmplY3RPckxpc3QpXG4gICAgICAgID8gb2JqZWN0T3JMaXN0XG4gICAgICAgIDogZnJlZXplKFtvYmplY3RPckxpc3RdKTtcbiAgICByZXR1cm4gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKGxpc3QpO1xufVxuZnVuY3Rpb24gcGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzKHJvd3MpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgZnJlZXplKFsuLi5jb2x1bW5zLmtleXMoKV0ubWFwKENvbHVtbk5vZGUuY3JlYXRlKSksXG4gICAgICAgIFZhbHVlc05vZGUuY3JlYXRlKHJvd3MubWFwKChyb3cpID0+IHBhcnNlUm93VmFsdWVzKHJvdywgY29sdW1ucykpKSxcbiAgICBdO1xufVxuZnVuY3Rpb24gcGFyc2VDb2x1bW5OYW1lc0FuZEluZGV4ZXMocm93cykge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCBjb2xzID0gT2JqZWN0LmtleXMocm93KTtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29scykge1xuICAgICAgICAgICAgaWYgKCFjb2x1bW5zLmhhcyhjb2wpICYmIHJvd1tjb2xdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnNldChjb2wsIGNvbHVtbnMuc2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbnM7XG59XG5mdW5jdGlvbiBwYXJzZVJvd1ZhbHVlcyhyb3csIGNvbHVtbnMpIHtcbiAgICBjb25zdCByb3dDb2x1bW5zID0gT2JqZWN0LmtleXMocm93KTtcbiAgICBjb25zdCByb3dWYWx1ZXMgPSBBcnJheS5mcm9tKHtcbiAgICAgICAgbGVuZ3RoOiBjb2x1bW5zLnNpemUsXG4gICAgfSk7XG4gICAgbGV0IGhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMgPSBmYWxzZTtcbiAgICBsZXQgaW5kZXhlZFJvd0NvbHVtbnMgPSByb3dDb2x1bW5zLmxlbmd0aDtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiByb3dDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbklkeCA9IGNvbHVtbnMuZ2V0KGNvbCk7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChjb2x1bW5JZHgpKSB7XG4gICAgICAgICAgICBpbmRleGVkUm93Q29sdW1ucy0tO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3dbY29sXTtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSB8fCBpc0V4cHJlc3Npb25PckZhY3RvcnkodmFsdWUpKSB7XG4gICAgICAgICAgICBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByb3dWYWx1ZXNbY29sdW1uSWR4XSA9IHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBoYXNNaXNzaW5nQ29sdW1ucyA9IGluZGV4ZWRSb3dDb2x1bW5zIDwgY29sdW1ucy5zaXplO1xuICAgIGlmIChoYXNNaXNzaW5nQ29sdW1ucyB8fCBoYXNVbmRlZmluZWRPckNvbXBsZXhDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IERlZmF1bHRJbnNlcnRWYWx1ZU5vZGUuY3JlYXRlKCk7XG4gICAgICAgIHJldHVybiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMubWFwKChpdCkgPT4gaXNVbmRlZmluZWQoaXQpID8gZGVmYXVsdFZhbHVlIDogcGFyc2VWYWx1ZUV4cHJlc3Npb24oaXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLmNyZWF0ZShyb3dWYWx1ZXMpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb2x1bW4tdXBkYXRlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29sdW1uVXBkYXRlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uVXBkYXRlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5VcGRhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VwZGF0ZS1zZXQtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtblVwZGF0ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tdXBkYXRlLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uIH0gZnJvbSAnLi92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uLCB9IGZyb20gJy4vcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGUoLi4uYXJncykge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgQ29sdW1uVXBkYXRlTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGFyZ3NbMF0pLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihhcmdzWzFdKSksXG4gICAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24oYXJnc1swXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSkge1xuICAgIGNvbnN0IHVwZGF0ZU9iaiA9IGlzRnVuY3Rpb24odXBkYXRlKSA/IHVwZGF0ZShleHByZXNzaW9uQnVpbGRlcigpKSA6IHVwZGF0ZTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModXBkYXRlT2JqKVxuICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgcmV0dXJuIENvbHVtblVwZGF0ZU5vZGUuY3JlYXRlKENvbHVtbk5vZGUuY3JlYXRlKGtleSksIHBhcnNlVmFsdWVFeHByZXNzaW9uKHZhbHVlKSk7XG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWR1cGxpY2F0ZS1rZXktbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPbkR1cGxpY2F0ZUtleU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09uRHVwbGljYXRlS2V5Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodXBkYXRlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkR1cGxpY2F0ZUtleU5vZGUnLFxuICAgICAgICAgICAgdXBkYXRlcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9pbnNlcnQtcmVzdWx0LmQudHNcIiAvPlxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGFuIGluc2VydCBxdWVyeS5cbiAqXG4gKiBJZiB0aGUgdGFibGUgaGFzIGFuIGF1dG8gaW5jcmVtZW50aW5nIHByaW1hcnkga2V5IHtAbGluayBpbnNlcnRJZH0gd2lsbCBob2xkXG4gKiB0aGUgZ2VuZXJhdGVkIGlkIG9uIGRpYWxlY3RzIHRoYXQgc3VwcG9ydCBpdC4gRm9yIGV4YW1wbGUgUG9zdGdyZVNRTCBkb2Vzbid0XG4gKiByZXR1cm4gdGhlIGlkIGJ5IGRlZmF1bHQgYW5kIHtAbGluayBpbnNlcnRJZH0gaXMgdW5kZWZpbmVkLiBPbiBQb3N0Z3JlU1FMIHlvdVxuICogbmVlZCB0byB1c2Uge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmd9IG9yIHtAbGluayBSZXR1cm5pbmdJbnRlcmZhY2UucmV0dXJuaW5nQWxsfVxuICogdG8gZ2V0IG91dCB0aGUgaW5zZXJ0ZWQgaWQuXG4gKlxuICoge0BsaW5rIG51bUluc2VydGVkT3JVcGRhdGVkUm93c30gaG9sZHMgdGhlIG51bWJlciBvZiAoYWN0dWFsbHkpIGluc2VydGVkIHJvd3MuXG4gKiBPbiBNeVNRTCwgdXBkYXRlZCByb3dzIGFyZSBjb3VudGVkIHR3aWNlIHdoZW4gdXNpbmcgYG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlYC5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbihwZXJzb246IE5ld1BlcnNvbikge1xuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICogICAgIC52YWx1ZXMocGVyc29uKVxuICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gKlxuICogICBjb25zb2xlLmxvZyhyZXN1bHQuaW5zZXJ0SWQpIC8vIHJlbGV2YW50IG9uIE15U1FMXG4gKiAgIGNvbnNvbGUubG9nKHJlc3VsdC5udW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MpIC8vIGFsd2F5cyByZWxldmFudFxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnNlcnRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhdXRvIGluY3JlbWVudGluZyBwcmltYXJ5IGtleSBvZiB0aGUgaW5zZXJ0ZWQgcm93LlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdW5kZWZpbmVkIHdoZW4gdGhlIHF1ZXJ5IGNvbnRhaW5zIGFuIGBvbiBjb25mbGljdGBcbiAgICAgKiBjbGF1c2UgdGhhdCBtYWtlcyB0aGUgcXVlcnkgc3VjY2VlZCBldmVuIHdoZW4gbm90aGluZyBnZXRzIGluc2VydGVkLlxuICAgICAqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBpcyBhbHdheXMgdW5kZWZpbmVkIG9uIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCB0aGF0XG4gICAgICogZG9uJ3QgcmV0dXJuIHRoZSBpbnNlcnRlZCBpZCBieSBkZWZhdWx0LiBPbiB0aG9zZSBkaWFsZWN0cyB5b3UgbmVlZFxuICAgICAqIHRvIHVzZSB0aGUge0BsaW5rIFJldHVybmluZ0ludGVyZmFjZS5yZXR1cm5pbmcgfCByZXR1cm5pbmd9IG1ldGhvZC5cbiAgICAgKi9cbiAgICBpbnNlcnRJZDtcbiAgICAvKipcbiAgICAgKiBBZmZlY3RlZCByb3dzIGNvdW50LlxuICAgICAqL1xuICAgIG51bUluc2VydGVkT3JVcGRhdGVkUm93cztcbiAgICBjb25zdHJ1Y3RvcihpbnNlcnRJZCwgbnVtSW5zZXJ0ZWRPclVwZGF0ZWRSb3dzKSB7XG4gICAgICAgIHRoaXMuaW5zZXJ0SWQgPSBpbnNlcnRJZDtcbiAgICAgICAgdGhpcy5udW1JbnNlcnRlZE9yVXBkYXRlZFJvd3MgPSBudW1JbnNlcnRlZE9yVXBkYXRlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9uby1yZXN1bHQtZXJyb3IuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgTm9SZXN1bHRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlcmF0aW9uIG5vZGUgdHJlZSBvZiB0aGUgcXVlcnkgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHN1cGVyKCdubyByZXN1bHQnKTtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZm4pIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZuLCAncHJvdG90eXBlJyk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbmZsaWN0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBXaGVyZU5vZGUgfSBmcm9tICcuL3doZXJlLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE9uQ29uZmxpY3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdPbkNvbmZsaWN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09uQ29uZmxpY3ROb2RlJyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoSW5kZXhXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgaW5kZXhXaGVyZTogbm9kZS5pbmRleFdoZXJlXG4gICAgICAgICAgICAgICAgPyBXaGVyZU5vZGUuY2xvbmVXaXRoT3BlcmF0aW9uKG5vZGUuaW5kZXhXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhJbmRleE9yV2hlcmUobm9kZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IG5vZGUuaW5kZXhXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLmluZGV4V2hlcmUsICdPcicsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVXaGVyZShub2RlLCBvcGVyYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgdXBkYXRlV2hlcmU6IG5vZGUudXBkYXRlV2hlcmVcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24obm9kZS51cGRhdGVXaGVyZSwgJ0FuZCcsIG9wZXJhdGlvbilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhVcGRhdGVPcldoZXJlKG5vZGUsIG9wZXJhdGlvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICB1cGRhdGVXaGVyZTogbm9kZS51cGRhdGVXaGVyZVxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihub2RlLnVwZGF0ZVdoZXJlLCAnT3InLCBvcGVyYXRpb24pXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRob3V0SW5kZXhXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGluZGV4V2hlcmU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhvdXRVcGRhdGVXaGVyZShub2RlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb24tY29uZmxpY3QtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29uLWNvbmZsaWN0LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci91cGRhdGUtc2V0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT25Db25mbGljdEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzaW5nbGUgY29sdW1uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGNvbHVtbnN9LCB7QGxpbmsgY29uc3RyYWludH0gYW5kIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIG1ldGhvZHMgZm9yIGFsdGVybmF0aXZlIHdheXMgdG8gc3BlY2lmeSB0aGUgY29uZmxpY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIGNvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZSA9IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbik7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgY29sdW1uTm9kZV0pXG4gICAgICAgICAgICAgICAgICAgIDogZnJlZXplKFtjb2x1bW5Ob2RlXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBsaXN0IG9mIGNvbHVtbnMgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbnN0cmFpbnR9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTm9kZXMgPSBjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogdGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4udGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUuY29sdW1ucywgLi4uY29sdW1uTm9kZXNdKVxuICAgICAgICAgICAgICAgICAgICA6IGZyZWV6ZShjb2x1bW5Ob2RlcyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBzcGVjaWZpYyBjb25zdHJhaW50IGJ5IG5hbWUgYXMgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgZXhwcmVzc2lvbn1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW50KGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgY29uc3RyYWludDogSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhbiBleHByZXNzaW9uIGFzIHRoZSBjb25mbGljdCB0YXJnZXQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSB1bmlxdWUgaW5kZXggaXMgYW4gZXhwcmVzc2lvbiBpbmRleC5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHRoZSB7QGxpbmsgY29sdW1ufSwge0BsaW5rIGNvbHVtbnN9IGFuZCB7QGxpbmsgY29uc3RyYWludH1cbiAgICAgKiBtZXRob2RzIGZvciBhbHRlcm5hdGl2ZSB3YXlzIHRvIHNwZWNpZnkgdGhlIGNvbmZsaWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHtcbiAgICAgICAgICAgICAgICBpbmRleEV4cHJlc3Npb246IGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhJbmRleFdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUsIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24obGhzLCBvcCwgcmhzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aG91dEluZGV4V2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgXCJkbyBub3RoaW5nXCIgY29uZmxpY3QgYWN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IGZpcnN0X25hbWUgPSAnSm9obidcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1x1MDBBMGZpcnN0X25hbWUsIGlkIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvTm90aGluZygpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpIGRvIG5vdGhpbmdcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkb05vdGhpbmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgZG9Ob3RoaW5nOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImRvIHVwZGF0ZSBzZXRcIiBjb25mbGljdCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3QgZmlyc3RfbmFtZSA9ICdKb2huJ1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XHUwMEEwZmlyc3RfbmFtZSwgaWQgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignaWQnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBmaXJzdF9uYW1lIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJpZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIG9uIGNvbmZsaWN0IChcImlkXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcImZpcnN0X25hbWVcIiA9ICQzXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGUgbmV4dCBleGFtcGxlIHdlIHVzZSB0aGUgYHJlZmAgbWV0aG9kIHRvIHJlZmVyZW5jZVxuICAgICAqIGNvbHVtbnMgb2YgdGhlIHZpcnR1YWwgdGFibGUgYGV4Y2x1ZGVkYCBpbiBhIHR5cGUtc2FmZSB3YXlcbiAgICAgKiB0byBjcmVhdGUgYW4gdXBzZXJ0IG9wZXJhdGlvbjpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBzZXJ0UGVyc29uKHBlcnNvbjogTmV3UGVyc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICogICBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHBlcnNvbilcbiAgICAgKiAgICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgICAuZG9VcGRhdGVTZXQoKGViKSA9PiAoe1xuICAgICAqICAgICAgICAgZmlyc3RfbmFtZTogZWIucmVmKCdleGNsdWRlZC5maXJzdF9uYW1lJyksXG4gICAgICogICAgICAgICBsYXN0X25hbWU6IGViLnJlZignZXhjbHVkZWQubGFzdF9uYW1lJylcbiAgICAgKiAgICAgICB9KVxuICAgICAqICAgICApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0XG4gICAgICogIFwiZmlyc3RfbmFtZVwiID0gZXhjbHVkZWQuXCJmaXJzdF9uYW1lXCIsXG4gICAgICogIFwibGFzdF9uYW1lXCIgPSBleGNsdWRlZC5cImxhc3RfbmFtZVwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZG9VcGRhdGVTZXQodXBkYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCB7XG4gICAgICAgICAgICAgICAgdXBkYXRlczogcGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT25Db25mbGljdERvTm90aGluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9uQ29uZmxpY3RVcGRhdGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgb25Db25mbGljdE5vZGU6IE9uQ29uZmxpY3ROb2RlLmNsb25lV2l0aFVwZGF0ZVdoZXJlKHRoaXMuI3Byb3BzLm9uQ29uZmxpY3ROb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSB3aGVyZSBjb25kaXRpb24gZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBXaGVyZUludGVyZmFjZS53aGVyZVJlZn0gZm9yIG1vcmUgaW5mby5cbiAgICAgKi9cbiAgICB3aGVyZVJlZihsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbkNvbmZsaWN0VXBkYXRlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jbG9uZVdpdGhVcGRhdGVXaGVyZSh0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBvbkNvbmZsaWN0Tm9kZTogT25Db25mbGljdE5vZGUuY2xvbmVXaXRob3V0VXBkYXRlV2hlcmUodGhpcy4jcHJvcHMub25Db25mbGljdE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5vbkNvbmZsaWN0Tm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3RvcC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRvcE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1RvcE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUb3BOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBtb2RpZmllcnMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdG9wLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IFRvcE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS90b3Atbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0JpZ0ludCwgaXNOdW1iZXIsIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgIGlmICghaXNOdW1iZXIoZXhwcmVzc2lvbikgJiYgIWlzQmlnSW50KGV4cHJlc3Npb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b3AgZXhwcmVzc2lvbjogJHtleHByZXNzaW9ufWApO1xuICAgIH1cbiAgICBpZiAoIWlzVW5kZWZpbmVkKG1vZGlmaWVycykgJiYgIWlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRvcCBtb2RpZmllcnM6ICR7bW9kaWZpZXJzfWApO1xuICAgIH1cbiAgICByZXR1cm4gVG9wTm9kZS5jcmVhdGUoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKTtcbn1cbmZ1bmN0aW9uIGlzVG9wTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAgIHJldHVybiAobW9kaWZpZXJzID09PSAncGVyY2VudCcgfHxcbiAgICAgICAgbW9kaWZpZXJzID09PSAnd2l0aCB0aWVzJyB8fFxuICAgICAgICBtb2RpZmllcnMgPT09ICdwZXJjZW50IHdpdGggdGllcycpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9vci1hY3Rpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBPckFjdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ09yQWN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09yQWN0aW9uTm9kZScsXG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaW5zZXJ0LXF1ZXJ5LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VJbnNlcnRFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9pbnNlcnQtdmFsdWVzLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pbnNlcnQtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVXBkYXRlT2JqZWN0RXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvdXBkYXRlLXNldC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgT25EdXBsaWNhdGVLZXlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb24tZHVwbGljYXRlLWtleS1ub2RlLmpzJztcbmltcG9ydCB7IEluc2VydFJlc3VsdCB9IGZyb20gJy4vaW5zZXJ0LXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBPbkNvbmZsaWN0QnVpbGRlciwgfSBmcm9tICcuL29uLWNvbmZsaWN0LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgT25Db25mbGljdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vbi1jb25mbGljdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgT3JBY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3ItYWN0aW9uLW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEluc2VydFF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgdmFsdWVzIHRvIGluc2VydCBmb3IgYW4ge0BsaW5rIEt5c2VseS5pbnNlcnRJbnRvIHwgaW5zZXJ0fSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBjb2x1bW4gbmFtZXMgYW5kIHZhbHVlcyBhcmVcbiAgICAgKiB2YWx1ZXMgdG8gaW5zZXJ0LiBJbiBhZGRpdGlvbiB0byB0aGUgY29sdW1uJ3MgdHlwZSwgdGhlIHZhbHVlcyBjYW4gYmVcbiAgICAgKiByYXcge0BsaW5rIHNxbH0gc25pcHBldHMgb3Igc2VsZWN0IHF1ZXJpZXMuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBwcm92aWRlIGFsbCBmaWVsZHMgeW91IGhhdmVuJ3QgZXhwbGljaXRseSBtYXJrZWQgYXMgbnVsbGFibGVcbiAgICAgKiBvciBvcHRpb25hbCB1c2luZyB7QGxpbmsgR2VuZXJhdGVkfSBvciB7QGxpbmsgQ29sdW1uVHlwZX0uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIG9mIGFuIGBpbnNlcnRgIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiBUaGVcbiAgICAgKiB7QGxpbmsgSW5zZXJ0UmVzdWx0Lmluc2VydElkIHwgaW5zZXJ0SWR9IGZpZWxkIGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIHByaW1hcnlcbiAgICAgKiBrZXkgaWYgdGhlIGRhdGFiYXNlIHJldHVybmVkIG9uZS5cbiAgICAgKlxuICAgICAqIE9uIFBvc3RncmVTUUwgYW5kIHNvbWUgb3RoZXIgZGlhbGVjdHMsIHlvdSBuZWVkIHRvIGNhbGwgYHJldHVybmluZ2AgdG8gZ2V0XG4gICAgICogc29tZXRoaW5nIG91dCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4cHJlc3Npb259IG1ldGhvZCBmb3IgaW5zZXJ0aW5nIHRoZSByZXN1bHQgb2YgYSBzZWxlY3RcbiAgICAgKiBxdWVyeSBvciBhbnkgb3RoZXIgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIlNpbmdsZSByb3dcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogSW5zZXJ0IGEgc2luZ2xlIHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICBhZ2U6IDQwXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqXG4gICAgICogLy8gYGluc2VydElkYCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBkaWFsZWN0cyB0aGF0XG4gICAgICogLy8gYXV0b21hdGljYWxseSByZXR1cm4gdGhlIGlkIG9mIHRoZSBpbnNlcnRlZCByb3dcbiAgICAgKiAvLyBzdWNoIGFzIE15U1FMIGFuZCBTUUxpdGUuIE9uIFBvc3RncmVTUUwsIGZvciBleGFtcGxlLFxuICAgICAqIC8vIHlvdSBuZWVkIHRvIGFkZCBhIGByZXR1cm5pbmdgIGNsYXVzZSB0byB0aGUgcXVlcnkgdG9cbiAgICAgKiAvLyBnZXQgYW55dGhpbmcgb3V0LiBTZWUgdGhlIFwicmV0dXJuaW5nIGRhdGFcIiBleGFtcGxlLlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGFnZWApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJpbnNlcnRcIiwgXCJNdWx0aXBsZSByb3dzXCIsIDIwKSAtLT5cbiAgICAgKlxuICAgICAqIE9uIGRpYWxlY3RzIHRoYXQgc3VwcG9ydCBpdCAoZm9yIGV4YW1wbGUgUG9zdGdyZVNRTCkgeW91IGNhbiBpbnNlcnQgbXVsdGlwbGVcbiAgICAgKiByb3dzIGJ5IHByb3ZpZGluZyBhbiBhcnJheS4gTm90ZSB0aGF0IHRoZSByZXR1cm4gdmFsdWUgaXMgb25jZSBhZ2FpbiB2ZXJ5XG4gICAgICogZGlhbGVjdC1zcGVjaWZpYy4gU29tZSBkYXRhYmFzZXMgbWF5IG9ubHkgcmV0dXJuIHRoZSBpZCBvZiB0aGUgKmxhc3QqIGluc2VydGVkXG4gICAgICogcm93IGFuZCBzb21lIHJldHVybiBub3RoaW5nIGF0IGFsbCB1bmxlc3MgeW91IGNhbGwgYHJldHVybmluZ2AuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoW3tcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgIGFnZTogNDAsXG4gICAgICogICB9LCB7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdBcm5vbGQnLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdTY2h3YXJ6ZW5lZ2dlcicsXG4gICAgICogICAgIGFnZTogNzAsXG4gICAgICogICB9XSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImFnZVwiKSB2YWx1ZXMgKCgkMSwgJDIsICQzKSwgKCQ0LCAkNSwgJDYpKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIlJldHVybmluZyBkYXRhXCIsIDMwKSAtLT5cbiAgICAgKlxuICAgICAqIE9uIHN1cHBvcnRlZCBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgeW91IG5lZWQgdG8gY2hhaW4gYHJldHVybmluZ2AgdG8gdGhlIHF1ZXJ5IHRvIGdldFxuICAgICAqIHRoZSBpbnNlcnRlZCByb3cncyBjb2x1bW5zIChvciBhbnkgb3RoZXIgZXhwcmVzc2lvbikgYXMgdGhlIHJldHVybiB2YWx1ZS4gYHJldHVybmluZ2BcbiAgICAgKiB3b3JrcyBqdXN0IGxpa2UgYHNlbGVjdGAuIFJlZmVyIHRvIGBzZWxlY3RgIG1ldGhvZCdzIGV4YW1wbGVzIGFuZCBkb2N1bWVudGF0aW9uIGZvclxuICAgICAqIG1vcmUgaW5mby5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICBhZ2U6IDQwLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lIGFzIG5hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJhZ2VcIikgdmFsdWVzICgkMSwgJDIsICQzKSByZXR1cm5pbmcgXCJpZFwiLCBcImZpcnN0X25hbWVcIiBhcyBcIm5hbWVcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcImluc2VydFwiLCBcIkNvbXBsZXggdmFsdWVzXCIsIDQwKSAtLT5cbiAgICAgKlxuICAgICAqIEluIGFkZGl0aW9uIHRvIHByaW1pdGl2ZXMsIHRoZSB2YWx1ZXMgY2FuIGFsc28gYmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zLlxuICAgICAqIFlvdSBjYW4gYnVpbGQgdGhlIGV4cHJlc3Npb25zIGJ5IHVzaW5nIGEgY2FsbGJhY2sgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZHNcbiAgICAgKiBvbiB0aGUgZXhwcmVzc2lvbiBidWlsZGVyIHBhc3NlZCB0byBpdDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgYW5pID0gXCJBbmlcIlxuICAgICAqIGNvbnN0IHN0b24gPSBcInN0b25cIlxuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcygoeyByZWYsIHNlbGVjdEZyb20sIGZuIH0pID0+ICh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgIGxhc3RfbmFtZTogc3FsPHN0cmluZz5gY29uY2F0KCR7YW5pfSwgJHtzdG9ufSlgLFxuICAgICAqICAgICBtaWRkbGVfbmFtZTogcmVmKCdmaXJzdF9uYW1lJyksXG4gICAgICogICAgIGFnZTogc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgICAuc2VsZWN0KGZuLmF2ZzxudW1iZXI+KCdhZ2UnKS5hcygnYXZnX2FnZScpKSxcbiAgICAgKiAgIH0pKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXG4gICAgICogICBcImZpcnN0X25hbWVcIixcbiAgICAgKiAgIFwibGFzdF9uYW1lXCIsXG4gICAgICogICBcIm1pZGRsZV9uYW1lXCIsXG4gICAgICogICBcImFnZVwiXG4gICAgICogKVxuICAgICAqIHZhbHVlcyAoXG4gICAgICogICAkMSxcbiAgICAgKiAgIGNvbmNhdCgkMiwgJDMpLFxuICAgICAqICAgXCJmaXJzdF9uYW1lXCIsXG4gICAgICogICAoc2VsZWN0IGF2ZyhcImFnZVwiKSBhcyBcImF2Z19hZ2VcIiBmcm9tIFwicGVyc29uXCIpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHVzZSB0aGUgY2FsbGJhY2sgdmVyc2lvbiBvZiBzdWJxdWVyaWVzIG9yIHJhdyBleHByZXNzaW9uczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIud2l0aCgnamVubmlmZXInLCAoZGIpID0+IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0plbm5pZmVyJylcbiAgICAgKiAgIC5zZWxlY3QoWydpZCcsICdmaXJzdF9uYW1lJywgJ2dlbmRlciddKVxuICAgICAqICAgLmxpbWl0KDEpXG4gICAgICogKS5pbnNlcnRJbnRvKCdwZXQnKS52YWx1ZXMoKGViKSA9PiAoe1xuICAgICAqICAgb3duZXJfaWQ6IGViLnNlbGVjdEZyb20oJ2plbm5pZmVyJykuc2VsZWN0KCdpZCcpLFxuICAgICAqICAgbmFtZTogZWIuc2VsZWN0RnJvbSgnamVubmlmZXInKS5zZWxlY3QoJ2ZpcnN0X25hbWUnKSxcbiAgICAgKiAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqIH0pKVxuICAgICAqIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHdpdGggXCJqZW5uaWZlclwiIGFzIChcbiAgICAgKiAgIHNlbGVjdCBcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiXG4gICAgICogICBmcm9tIFwicGVyc29uXCJcbiAgICAgKiAgIHdoZXJlIFwiZmlyc3RfbmFtZVwiID0gJDFcbiAgICAgKiAgIGxpbWl0ICQyXG4gICAgICogKVxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwib3duZXJfaWRcIiwgXCJuYW1lXCIsIFwic3BlY2llc1wiKVxuICAgICAqIHZhbHVlcyAoXG4gICAgICogIChzZWxlY3QgXCJpZFwiIGZyb20gXCJqZW5uaWZlclwiKSxcbiAgICAgKiAgKHNlbGVjdCBcImZpcnN0X25hbWVcIiBmcm9tIFwiamVubmlmZXJcIiksXG4gICAgICogICQzXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHZhbHVlcyhpbnNlcnQpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtbnMsIHZhbHVlc10gPSBwYXJzZUluc2VydEV4cHJlc3Npb24oaW5zZXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbHVtbnMgdG8gaW5zZXJ0LlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayB2YWx1ZXN9IG1ldGhvZCBzZXRzIGJvdGggdGhlIGNvbHVtbnMgYW5kIHRoZSB2YWx1ZXMgYW5kIHRoaXMgbWV0aG9kXG4gICAgICogaXMgbm90IG5lZWRlZC4gQnV0IGlmIHlvdSBhcmUgdXNpbmcgdGhlIHtAbGluayBleHByZXNzaW9ufSBtZXRob2QsIHlvdSBjYW4gdXNlXG4gICAgICogdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBjb2x1bW5zIHRvIGluc2VydC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJ10pXG4gICAgICogICAuZXhwcmVzc2lvbigoZWIpID0+IGViLnNlbGVjdEZyb20oJ3BldCcpLnNlbGVjdCgncGV0Lm5hbWUnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiKVxuICAgICAqIHNlbGVjdCBcInBldFwiLlwibmFtZVwiIGZyb20gXCJwZXRcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbHVtbnMoY29sdW1ucykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoY29sdW1ucy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zZXJ0IGFuIGFyYml0cmFyeSBleHByZXNzaW9uLiBGb3IgZXhhbXBsZSB0aGUgcmVzdWx0IG9mIGEgc2VsZWN0IHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiaW5zZXJ0XCIsIFwiSW5zZXJ0IHN1YnF1ZXJ5XCIsIDUwKSAtLT5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gY3JlYXRlIGFuIGBJTlNFUlQgSU5UTyBTRUxFQ1QgRlJPTWAgcXVlcnkgdXNpbmcgdGhlIGBleHByZXNzaW9uYCBtZXRob2QuXG4gICAgICogVGhpcyBBUEkgZG9lc24ndCBmb2xsb3cgb3VyIFdZU0lXWUcgcHJpbmNpcGxlcyBhbmQgbWlnaHQgYmUgYSBiaXQgZGlmZmljdWx0IHRvXG4gICAgICogcmVtZW1iZXIuIFRoZSByZWFzb25zIGZvciB0aGlzIGRlc2lnbiBzdGVtIGZyb20gaW1wbGVtZW50YXRpb24gZGlmZmljdWx0aWVzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdhZ2UnXSlcbiAgICAgKiAgIC5leHByZXNzaW9uKChlYikgPT4gZWJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BldCcpXG4gICAgICogICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICogICAgICAgJ3BldC5uYW1lJyxcbiAgICAgKiAgICAgICBlYi52YWwoJ1BldHNvbicpLmFzKCdsYXN0X25hbWUnKSxcbiAgICAgKiAgICAgICBlYi5saXQoNykuYXMoJ2FnZScpLFxuICAgICAqICAgICBdKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiYWdlXCIpXG4gICAgICogc2VsZWN0IFwicGV0XCIuXCJuYW1lXCIsICQxIGFzIFwibGFzdF9uYW1lXCIsIDcgYXMgXCJhZ2UgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIHZhbHVlczogcGFyc2VFeHByZXNzaW9uKGV4cHJlc3Npb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGBpbnNlcnQgaW50byBcInBlcnNvblwiIGRlZmF1bHQgdmFsdWVzYCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmRlZmF1bHRWYWx1ZXMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiBkZWZhdWx0IHZhbHVlc1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLm1vZGlmeUVuZChzcWxgLS0gVGhpcyBpcyBhIGNvbW1lbnRgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIGBwZXJzb25gIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIilcbiAgICAgKiB2YWx1ZXMgKD8sID8sID8pIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBpZ25vcmUgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqIFRvIGF2b2lkIGEgZm9vdGd1biwgd2hlbiBpbnZva2VkIHdpdGggdGhlIFNRTGl0ZSBkaWFsZWN0LCB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogYmUgaGFuZGxlZCBsaWtlIHtAbGluayBvcklnbm9yZX0uIFNlZSBhbHNvLCB7QGxpbmsgb3JBYm9ydH0sIHtAbGluayBvckZhaWx9LFxuICAgICAqIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogSWYgeW91IHVzZSB0aGUgaWdub3JlIG1vZGlmaWVyLCBpZ25vcmFibGUgZXJyb3JzIHRoYXQgb2NjdXIgd2hpbGUgZXhlY3V0aW5nIHRoZVxuICAgICAqIGluc2VydCBzdGF0ZW1lbnQgYXJlIGlnbm9yZWQuIEZvciBleGFtcGxlLCB3aXRob3V0IGlnbm9yZSwgYSByb3cgdGhhdCBkdXBsaWNhdGVzXG4gICAgICogYW4gZXhpc3RpbmcgdW5pcXVlIGluZGV4IG9yIHByaW1hcnkga2V5IHZhbHVlIGluIHRoZSB0YWJsZSBjYXVzZXMgYSBkdXBsaWNhdGUta2V5XG4gICAgICogZXJyb3IgYW5kIHRoZSBzdGF0ZW1lbnQgaXMgYWJvcnRlZC4gV2l0aCBpZ25vcmUsIHRoZSByb3cgaXMgZGlzY2FyZGVkIGFuZCBubyBlcnJvclxuICAgICAqIG9jY3Vycy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLmlnbm9yZSgpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdmZW1hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaWdub3JlIGludG8gYHBlcnNvbmAgKGBmaXJzdF9uYW1lYCwgYGxhc3RfbmFtZWAsIGBnZW5kZXJgKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBpZ25vcmUgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGlnbm9yZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2lnbm9yZScpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBpZ25vcmUgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBUbyBhdm9pZCBhIGZvb3RndW4sIHdoZW4gaW52b2tlZCB3aXRoIHRoZSBNeVNRTCBkaWFsZWN0LCB0aGlzIG1ldGhvZCB3aWxsXG4gICAgICogYmUgaGFuZGxlZCBsaWtlIHtAbGluayBpZ25vcmV9LlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIHtAbGluayBvclJlcGxhY2V9LCBhbmQge0BsaW5rIG9yUm9sbGJhY2t9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAub3JJZ25vcmUoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBpZ25vcmUgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpZ25vcmUgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvcklnbm9yZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ2lnbm9yZScpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBhYm9ydCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc29tZSBkaWFsZWN0cyBsaWtlIFNRTGl0ZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvLCB7QGxpbmsgb3JJZ25vcmV9LCB7QGxpbmsgb3JGYWlsfSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vckFib3J0KClcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ2ZlbWFsZScsXG4gICAgICogICB9KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFNRTGl0ZSk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgb3IgYWJvcnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJsYXN0X25hbWVcIiwgXCJnZW5kZXJcIikgdmFsdWVzICg/LCA/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG9yQWJvcnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdhYm9ydCcpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGFuIGBpbnNlcnQgaW50b2AgcXVlcnkgdG8gYW4gYGluc2VydCBvciBmYWlsIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yUmVwbGFjZX0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vckZhaWwoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciBmYWlsIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvckZhaWwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdmYWlsJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIHJlcGxhY2UgaW50b2AgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gdXNlIHtAbGluayBLeXNlbHkucmVwbGFjZUludG99IHRvIGFjaGlldmUgdGhlIHNhbWUgcmVzdWx0LlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIGFuZCB7QGxpbmsgb3JSb2xsYmFja30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC5vclJlcGxhY2UoKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciByZXBsYWNlIGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoPywgPywgPylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvclJlcGxhY2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9yQWN0aW9uOiBPckFjdGlvbk5vZGUuY3JlYXRlKCdyZXBsYWNlJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IG9yIHJvbGxiYWNrIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2VlIGFsc28sIHtAbGluayBvcklnbm9yZX0sIHtAbGluayBvckFib3J0fSwge0BsaW5rIG9yRmFpbH0sIGFuZCB7QGxpbmsgb3JSZXBsYWNlfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLm9yUm9sbGJhY2soKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgICAgZ2VuZGVyOiAnZmVtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoU1FMaXRlKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBvciByb2xsYmFjayBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKSB2YWx1ZXMgKD8sID8sID8pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb3JSb2xsYmFjaygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb3JBY3Rpb246IE9yQWN0aW9uTm9kZS5jcmVhdGUoJ3JvbGxiYWNrJyksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYW4gYGluc2VydCBpbnRvYCBxdWVyeSB0byBhbiBgaW5zZXJ0IHRvcCBpbnRvYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogSW5zZXJ0IHRoZSBmaXJzdCA1IHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnZ2VuZGVyJ10pXG4gICAgICogICAuZXhwcmVzc2lvbihcbiAgICAgKiAgICAgKGViKSA9PiBlYi5zZWxlY3RGcm9tKCdwZXQnKS5zZWxlY3QoWyduYW1lJywgc3FsLmxpdCgnb3RoZXInKS5hcygnZ2VuZGVyJyldKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IHRvcCg1KSBpbnRvIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImdlbmRlclwiKSBzZWxlY3QgXCJuYW1lXCIsICdvdGhlcicgYXMgXCJnZW5kZXJcIiBmcm9tIFwicGV0XCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEluc2VydCB0aGUgZmlyc3QgNTAgcGVyY2VudCBvZiByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1MCwgJ3BlcmNlbnQnKVxuICAgICAqICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2dlbmRlciddKVxuICAgICAqICAgLmV4cHJlc3Npb24oXG4gICAgICogICAgIChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KFsnbmFtZScsIHNxbC5saXQoJ290aGVyJykuYXMoJ2dlbmRlcicpXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCB0b3AoNTApIHBlcmNlbnQgaW50byBcInBlcnNvblwiIChcImZpcnN0X25hbWVcIiwgXCJnZW5kZXJcIikgc2VsZWN0IFwibmFtZVwiLCAnb3RoZXInIGFzIFwiZ2VuZGVyXCIgZnJvbSBcInBldFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gY29uZmxpY3RgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBgb24gY29uZmxpY3RgIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBQb3N0Z3JlU1FMIGFuZCBTUUxpdGUuIE9uIE15U1FMXG4gICAgICogeW91IGNhbiB1c2Uge0BsaW5rIGlnbm9yZX0gYW5kIHtAbGluayBvbkR1cGxpY2F0ZUtleVVwZGF0ZX0gdG8gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgIHNwZWNpZXM6ICdjYXQnLFxuICAgICAqICAgICBvd25lcl9pZDogMyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25Db25mbGljdCgob2MpID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ25hbWUnKVxuICAgICAqICAgICAuZG9VcGRhdGVTZXQoeyBzcGVjaWVzOiAnaGFtc3RlcicgfSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGluc2VydCBpbnRvIFwicGV0XCIgKFwibmFtZVwiLCBcInNwZWNpZXNcIiwgXCJvd25lcl9pZFwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBvbiBjb25mbGljdCAoXCJuYW1lXCIpXG4gICAgICogZG8gdXBkYXRlIHNldCBcInNwZWNpZXNcIiA9ICQ0XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIHByb3ZpZGUgdGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgaW5zdGVhZCBvZiBhIGNvbHVtbiBuYW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbnN0cmFpbnQoJ3BldF9uYW1lX2tleScpXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IG9uIGNvbnN0cmFpbnQgXCJwZXRfbmFtZV9rZXlcIlxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBhbHNvIHNwZWNpZnkgYW4gZXhwcmVzc2lvbiBhcyB0aGUgY29uZmxpY3QgdGFyZ2V0IGluIGNhc2VcbiAgICAgKiB0aGUgdW5pcXVlIGluZGV4IGlzIGFuIGV4cHJlc3Npb24gaW5kZXg6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuZXhwcmVzc2lvbihzcWw8c3RyaW5nPmBsb3dlcihuYW1lKWApXG4gICAgICogICAgIC5kb1VwZGF0ZVNldCh7IHNwZWNpZXM6ICdoYW1zdGVyJyB9KVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChsb3dlcihuYW1lKSlcbiAgICAgKiBkbyB1cGRhdGUgc2V0IFwic3BlY2llc1wiID0gJDRcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWRkIGEgZmlsdGVyIGZvciB0aGUgdXBkYXRlIHN0YXRlbWVudCBsaWtlIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgb3duZXJfaWQ6IDMsXG4gICAgICogICB9KVxuICAgICAqICAgLm9uQ29uZmxpY3QoKG9jKSA9PiBvY1xuICAgICAqICAgICAuY29sdW1uKCduYW1lJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHsgc3BlY2llczogJ2hhbXN0ZXInIH0pXG4gICAgICogICAgIC53aGVyZSgnZXhjbHVkZWQubmFtZScsICchPScsICdDYXR0bycpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBldFwiIChcIm5hbWVcIiwgXCJzcGVjaWVzXCIsIFwib3duZXJfaWRcIilcbiAgICAgKiB2YWx1ZXMgKCQxLCAkMiwgJDMpXG4gICAgICogb24gY29uZmxpY3QgKFwibmFtZVwiKVxuICAgICAqIGRvIHVwZGF0ZSBzZXQgXCJzcGVjaWVzXCIgPSAkNFxuICAgICAqIHdoZXJlIFwiZXhjbHVkZWRcIi5cIm5hbWVcIiAhPSAkNVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiBjcmVhdGUgYW4gYG9uIGNvbmZsaWN0IGRvIG5vdGhpbmdgIGNsYXVzZXMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgIG93bmVyX2lkOiAzLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KChvYykgPT4gb2NcbiAgICAgKiAgICAgLmNvbHVtbignbmFtZScpXG4gICAgICogICAgIC5kb05vdGhpbmcoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXRcIiAoXCJuYW1lXCIsIFwic3BlY2llc1wiLCBcIm93bmVyX2lkXCIpXG4gICAgICogdmFsdWVzICgkMSwgJDIsICQzKVxuICAgICAqIG9uIGNvbmZsaWN0IChcIm5hbWVcIikgZG8gbm90aGluZ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogWW91IGNhbiByZWZlciB0byB0aGUgY29sdW1ucyBvZiB0aGUgdmlydHVhbCBgZXhjbHVkZWRgIHRhYmxlXG4gICAgICogaW4gYSB0eXBlLXNhZmUgd2F5IHVzaW5nIGEgY2FsbGJhY2sgYW5kIHRoZSBgcmVmYCBtZXRob2Qgb2ZcbiAgICAgKiBgRXhwcmVzc2lvbkJ1aWxkZXJgOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnZhbHVlcyh7XG4gICAgICogICAgIGlkOiAxLFxuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgfSlcbiAgICAgKiAgIC5vbkNvbmZsaWN0KG9jID0+IG9jXG4gICAgICogICAgIC5jb2x1bW4oJ2lkJylcbiAgICAgKiAgICAgLmRvVXBkYXRlU2V0KHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAoZWIpID0+IGViLnJlZignZXhjbHVkZWQuZmlyc3RfbmFtZScpLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogKGViKSA9PiBlYi5yZWYoJ2V4Y2x1ZGVkLmxhc3RfbmFtZScpXG4gICAgICogICAgIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBcInBlcnNvblwiIChcImlkXCIsIFwiZmlyc3RfbmFtZVwiLCBcImxhc3RfbmFtZVwiLCBcImdlbmRlclwiKVxuICAgICAqIHZhbHVlcyAoJDEsICQyLCAkMywgJDQpXG4gICAgICogb24gY29uZmxpY3QgKFwiaWRcIilcbiAgICAgKiBkbyB1cGRhdGUgc2V0XG4gICAgICogIFwiZmlyc3RfbmFtZVwiID0gXCJleGNsdWRlZFwiLlwiZmlyc3RfbmFtZVwiLFxuICAgICAqICBcImxhc3RfbmFtZVwiID0gXCJleGNsdWRlZFwiLlwibGFzdF9uYW1lXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvbkNvbmZsaWN0KGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBJbnNlcnRRdWVyeU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwge1xuICAgICAgICAgICAgICAgIG9uQ29uZmxpY3Q6IGNhbGxiYWNrKG5ldyBPbkNvbmZsaWN0QnVpbGRlcih7XG4gICAgICAgICAgICAgICAgICAgIG9uQ29uZmxpY3ROb2RlOiBPbkNvbmZsaWN0Tm9kZS5jcmVhdGUoKSxcbiAgICAgICAgICAgICAgICB9KSkudG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlYCB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugc3BlY2lmeSBgb24gZHVwbGljYXRlIGtleSB1cGRhdGVgLCBhbmQgYSByb3cgaXMgaW5zZXJ0ZWQgdGhhdCB3b3VsZCBjYXVzZVxuICAgICAqIGEgZHVwbGljYXRlIHZhbHVlIGluIGEgdW5pcXVlIGluZGV4IG9yIHByaW1hcnkga2V5LCBhbiB1cGRhdGUgb2YgdGhlIG9sZCByb3cgb2NjdXJzLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNeVNRTC4gT24gbW9zdCBkaWFsZWN0cyB5b3Ugc2hvdWxkXG4gICAgICogdXNlIHtAbGluayBvbkNvbmZsaWN0fSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBpZDogMSxcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAub25EdXBsaWNhdGVLZXlVcGRhdGUoeyB1cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBpbnNlcnQgaW50byBgcGVyc29uYCAoYGlkYCwgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYGdlbmRlcmApXG4gICAgICogdmFsdWVzICg/LCA/LCA/LCA/KVxuICAgICAqIG9uIGR1cGxpY2F0ZSBrZXkgdXBkYXRlIGB1cGRhdGVkX2F0YCA9ID9cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvbkR1cGxpY2F0ZUtleVVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB7XG4gICAgICAgICAgICAgICAgb25EdXBsaWNhdGVLZXk6IE9uRHVwbGljYXRlS2V5Tm9kZS5jcmVhdGUocGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uKHVwZGF0ZSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoc2VsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmdBbGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvdXRwdXQoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoeyBmaXJzdF9uYW1lOiAnSmFtZXMnLCBsYXN0X25hbWU6ICdTbWl0aCcsIGdlbmRlcjogJ21hbGUnIH0pXG4gICAgICogICAucmV0dXJuaW5nKFsnZmlyc3RfbmFtZSddKVxuICAgICAqICAgLmNsZWFyUmV0dXJuaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogaW5zZXJ0IGludG8gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIsIFwiZ2VuZGVyXCIpIHZhbHVlcyAoJDEsICQyLCAkMylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHsgZmlyc3RfbmFtZTogJ0pvaG4nLCBsYXN0X25hbWU6ICdEb2UnLCBnZW5kZXI6ICdtYWxlJyB9KVxuICAgICAqICAgLiRjYWxsKGxvZylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGBmdW5jKHRoaXMpYCBpZiBgY29uZGl0aW9uYCBpcyB0cnVlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgZXNwZWNpYWxseSBoYW5keSB3aXRoIG9wdGlvbmFsIHNlbGVjdHMuIEFueSBgcmV0dXJuaW5nYCBvciBgcmV0dXJuaW5nQWxsYFxuICAgICAqIG1ldGhvZCBjYWxscyBhZGQgY29sdW1ucyBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlIG91dHB1dCB0eXBlIHdoZW4gY2FsbGVkIGluc2lkZVxuICAgICAqIHRoZSBgZnVuY2AgY2FsbGJhY2suIFRoaXMgaXMgYmVjYXVzZSB3ZSBjYW4ndCBrbm93IGlmIHRob3NlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseVxuICAgICAqIG1hZGUgYmVmb3JlIHJ1bm5pbmcgdGhlIGNvZGUuXG4gICAgICpcbiAgICAgKiBZb3UgY2FuIGFsc28gY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTmV3UGVyc29uIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydFBlcnNvbih2YWx1ZXM6IE5ld1BlcnNvbiwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgICAgLnZhbHVlcyh2YWx1ZXMpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgaW5zZXJ0UGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBJbnNlcnRRdWVyeUJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIChwYXJ0cyBvZikgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEt5c2VseSB0cmllcyB0byBiZSBhcyB0eXBlLXNhZmUgYXMgcG9zc2libGUsIGJ1dCBpbiBzb21lIGNhc2VzIHdlIGhhdmUgdG8gbWFrZVxuICAgICAqIGNvbXByb21pc2VzIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5IGFuZCBjb21waWxhdGlvbiBwZXJmb3JtYW5jZS4gQXQgcHJlc2VudCxcbiAgICAgKiBLeXNlbHkgZG9lc24ndCBuYXJyb3cgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeSBiYXNlZCBvbiB7QGxpbmsgdmFsdWVzfSBpbnB1dFxuICAgICAqIHdoZW4gdXNpbmcge0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSm9obicsXG4gICAgICogICAgIGxhc3RfbmFtZTogJ0RvZScsXG4gICAgICogICAgIGdlbmRlcjogJ21hbGUnLFxuICAgICAqICAgICBudWxsYWJsZV9jb2x1bW46ICdoZWxsIHllYWghJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGlmIChpc1dpdGhOb051bGxWYWx1ZShwZXJzb24pKSB7XG4gICAgICogICBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uOiBQZXJzb24pOiBwZXJzb24gaXMgUGVyc29uICYgeyBudWxsYWJsZV9jb2x1bW46IHN0cmluZyB9IHtcbiAgICAgKiAgIHJldHVybiBwZXJzb24ubnVsbGFibGVfY29sdW1uICE9IG51bGxcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnRvIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTm90TnVsbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGRiLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0pvaG4nLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdEb2UnLFxuICAgICAqICAgICBnZW5kZXI6ICdtYWxlJyxcbiAgICAgKiAgICAgbnVsbGFibGVfY29sdW1uOiAnaGVsbCB5ZWFoISdcbiAgICAgKiAgIH0pXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBOZXdQZXJzb24sIE5ld1BldCwgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBpbnNlcnRQZXJzb25BbmRQZXQocGVyc29uOiBOZXdQZXJzb24sIHBldDogT21pdDxOZXdQZXQsICdvd25lcl9pZCc+KSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLndpdGgoJ25ld19wZXJzb24nLCAocWIpID0+IHFiXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgICAgLnZhbHVlcyhwZXJzb24pXG4gICAgICogICAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAgIC4kYXNzZXJ0VHlwZTx7IGlkOiBudW1iZXIgfT4oKVxuICAgICAqICAgICApXG4gICAgICogICAgIC53aXRoKCduZXdfcGV0JywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgIC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAgIC52YWx1ZXMoKGViKSA9PiAoe1xuICAgICAqICAgICAgICAgb3duZXJfaWQ6IGViLnNlbGVjdEZyb20oJ25ld19wZXJzb24nKS5zZWxlY3QoJ2lkJyksXG4gICAgICogICAgICAgICAuLi5wZXRcbiAgICAgKiAgICAgICB9KSlcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgICAgLiRhc3NlcnRUeXBlPHsgcGV0X25hbWU6IHN0cmluZywgc3BlY2llczogU3BlY2llcyB9PigpXG4gICAgICogICAgIClcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oWyduZXdfcGVyc29uJywgJ25ld19wZXQnXSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRhc3NlcnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgSW5zZXJ0UXVlcnlCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnNlcnRRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IEluc2VydFJlc3VsdChyZXN1bHQuaW5zZXJ0SWQsIHJlc3VsdC5udW1BZmZlY3RlZFJvd3MgPz8gQmlnSW50KDApKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB0aHJvd3MgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9SZXN1bHRFcnJvcn0gaXMgdGhyb3duLCBidXQgeW91IGNhblxuICAgICAqIHByb3ZpZGUgYSBjdXN0b20gZXJyb3IgY2xhc3MsIG9yIGNhbGxiYWNrIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRocm93IGEgZGlmZmVyZW50XG4gICAgICogZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coZXJyb3JDb25zdHJ1Y3RvciA9IE5vUmVzdWx0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGFrZUZpcnN0KCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvcihlcnJvckNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgID8gbmV3IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSlcbiAgICAgICAgICAgICAgICA6IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNodW5rU2l6ZSA9IDEwMCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgICB5aWVsZCogaXRlbS5yb3dzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGV4cGxhaW4oZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWxldGUtcmVzdWx0LmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIERlbGV0ZVJlc3VsdCB7XG4gICAgbnVtRGVsZXRlZFJvd3M7XG4gICAgY29uc3RydWN0b3IobnVtRGVsZXRlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1EZWxldGVkUm93cyA9IG51bURlbGV0ZWRSb3dzO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbGltaXQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBMaW1pdE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0xpbWl0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnTGltaXROb2RlJyxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlbGV0ZS1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlU2VsZWN0QXJnLCBwYXJzZVNlbGVjdEFsbCwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IERlbGV0ZVJlc3VsdCB9IGZyb20gJy4vZGVsZXRlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBEZWxldGVRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBMaW1pdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9saW1pdC1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUb3AgfSBmcm9tICcuLi9wYXJzZXIvdG9wLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgRGVsZXRlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdoZXJlUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyV2hlcmUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0V2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBgZGVsZXRlIGZyb21gIHF1ZXJ5IGludG8gYSBgZGVsZXRlIHRvcCBmcm9tYCBxdWVyeS5cbiAgICAgKlxuICAgICAqIGB0b3BgIGNsYXVzZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTVMgU1FMIFNlcnZlci5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogRGVsZXRlIHRoZSBmaXJzdCA1IHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgdG9wKDUpIGZyb20gXCJwZXJzb25cIiB3aGVyZSBcImFnZVwiID4gQDFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIERlbGV0ZSB0aGUgZmlyc3QgNTAlIG9mIHJvd3M6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNTAsICdwZXJjZW50JylcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgdG9wKDUwKSBwZXJjZW50IGZyb20gXCJwZXJzb25cIiB3aGVyZSBcImFnZVwiID4gQDFcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1c2luZyh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVc2luZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlcykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW5uZXJKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0lubmVySm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBsZWZ0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICByaWdodEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignUmlnaHRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGZ1bGxKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Z1bGxKb2luJywgYXJncyk7XG4gICAgfVxuICAgICNqb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoSm9pbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbihqb2luVHlwZSwgYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyBhbGwgYHJldHVybmluZ2AgY2xhdXNlcyBmcm9tIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgLnJldHVybmluZ0FsbCgpXG4gICAgICogICAud2hlcmUoJ25hbWUnLCAnPScsICdNYXgnKVxuICAgICAqICAgLmNsZWFyUmV0dXJuaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogZGVsZXRlIGZyb20gXCJwZXRcIiB3aGVyZSBcIm5hbWVcIiA9IFwiTWF4XCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjbGVhclJldHVybmluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgYGxpbWl0YCBjbGF1c2UgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLndoZXJlKCduYW1lJywgJz0nLCAnTWF4JylcbiAgICAgKiAgIC5saW1pdCg1KVxuICAgICAqICAgLmNsZWFyTGltaXQoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBcInBldFwiIHdoZXJlIFwibmFtZVwiID0gXCJNYXhcIiByZXR1cm5pbmcgKlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyTGltaXQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBEZWxldGVRdWVyeU5vZGUuY2xvbmVXaXRob3V0TGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yZGVyQnkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE9yZGVyQnlJdGVtcyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhck9yZGVyQnkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGxpbWl0IGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBBIGxpbWl0IGNsYXVzZSBpbiBhIGRlbGV0ZSBxdWVyeSBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzXG4gICAgICogbGlrZSBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogRGVsZXRlIDUgb2xkZXN0IGl0ZW1zIGluIGEgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAuZGVsZXRlRnJvbSgncGV0JylcbiAgICAgKiAgIC5vcmRlckJ5KCdjcmVhdGVkX2F0JylcbiAgICAgKiAgIC5saW1pdCg1KVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIGBwZXRgIG9yZGVyIGJ5IGBjcmVhdGVkX2F0YCBsaW1pdCA/XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhMaW1pdCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIExpbWl0Tm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24obGltaXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuZGVsZXRlRnJvbSgncGVyc29uJylcbiAgICAgKiAgIC53aGVyZSgnZmlyc3RfbmFtZScsICc9JywgJ0pvaG4nKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWxgLS0gVGhpcyBpcyBhIGNvbW1lbnRgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIGBwZXJzb25gXG4gICAgICogd2hlcmUgYGZpcnN0X25hbWVgID0gXCJKb2huXCIgLS0gVGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBjb25kaXRpb25hbGx5IGNhbGwgYSBtZXRob2Qgb24gYHRoaXNgLCBzZWVcbiAgICAgKiB0aGUge0BsaW5rICRpZn0gbWV0aG9kLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGUgbmV4dCBleGFtcGxlIHVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gYGxvZ2AgdG8gbG9nIGEgcXVlcnk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgQ29tcGlsYWJsZSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGVyc29uKGlkOiBudW1iZXIsIHJldHVybkxhc3ROYW1lOiBib29sZWFuKSB7XG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgICAuJGlmKHJldHVybkxhc3ROYW1lLCAocWIpID0+IHFiLnJldHVybmluZygnbGFzdF9uYW1lJykpXG4gICAgICogICAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQW55IHNlbGVjdGlvbnMgYWRkZWQgaW5zaWRlIHRoZSBgaWZgIGNhbGxiYWNrIHdpbGwgYmUgYWRkZWQgYXMgb3B0aW9uYWwgZmllbGRzIHRvIHRoZVxuICAgICAqIG91dHB1dCB0eXBlIHNpbmNlIHdlIGNhbid0IGtub3cgaWYgdGhlIHNlbGVjdGlvbnMgd2VyZSBhY3R1YWxseSBtYWRlIGJlZm9yZSBydW5uaW5nXG4gICAgICogdGhlIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYGRlbGV0ZVBlcnNvbmAgZnVuY3Rpb24gaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIFByb21pc2U8e1xuICAgICAqICAgaWQ6IG51bWJlclxuICAgICAqICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gICAgICogICBsYXN0X25hbWU/OiBzdHJpbmdcbiAgICAgKiB9PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRpZihjb25kaXRpb24sIGZ1bmMpIHtcbiAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgRGVsZXRlUXVlcnlCdWlsZGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmFycm93cyAocGFydHMgb2YpIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdHJpZXMgdG8gYmUgYXMgdHlwZS1zYWZlIGFzIHBvc3NpYmxlLCBidXQgaW4gc29tZSBjYXNlcyB3ZSBoYXZlIHRvIG1ha2VcbiAgICAgKiBjb21wcm9taXNlcyBmb3IgYmV0dGVyIG1haW50YWluYWJpbGl0eSBhbmQgY29tcGlsYXRpb24gcGVyZm9ybWFuY2UuIEF0IHByZXNlbnQsXG4gICAgICogS3lzZWx5IGRvZXNuJ3QgbmFycm93IHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgcXVlcnkgd2hlbiB1c2luZyB7QGxpbmsgd2hlcmV9IGFuZCB7QGxpbmsgcmV0dXJuaW5nfSBvciB7QGxpbmsgcmV0dXJuaW5nQWxsfS5cbiAgICAgKlxuICAgICAqIFRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdmVyeSB1c2VmdWwgZm9yIHRoZXNlIHNpdHVhdGlvbnMsIGFzIGl0IHJlbW92ZXMgdW5uY2Vzc2FyeVxuICAgICAqIHJ1bnRpbWUgYXNzZXJ0aW9uL2d1YXJkIGNvZGUuIEl0cyBpbnB1dCB0eXBlIGlzIGxpbWl0ZWQgdG8gdGhlIG91dHB1dCB0eXBlXG4gICAgICogb2YgdGhlIHF1ZXJ5LCBzbyB5b3UgY2FuJ3QgYWRkIGEgY29sdW1uIHRoYXQgZG9lc24ndCBleGlzdCwgb3IgY2hhbmdlIGEgY29sdW1uJ3NcbiAgICAgKiB0eXBlIHRvIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3QgaW4gaXRzIHVuaW9uIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFR1cm4gdGhpcyBjb2RlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IFBlcnNvbiB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgMylcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICpcbiAgICAgKiBpZiAoaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uKSkge1xuICAgICAqICAgZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGlzV2l0aE5vTnVsbFZhbHVlKHBlcnNvbjogUGVyc29uKTogcGVyc29uIGlzIFBlcnNvbiAmIHsgbnVsbGFibGVfY29sdW1uOiBzdHJpbmcgfSB7XG4gICAgICogICByZXR1cm4gcGVyc29uLm51bGxhYmxlX2NvbHVtbiAhPSBudWxsXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW50byB0aGlzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IE5vdE51bGwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi5kZWxldGVGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLndoZXJlKCdpZCcsICc9JywgMylcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBTcGVjaWVzIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBlcnNvbkFuZFBldHMocGVyc29uSWQ6IG51bWJlcikge1xuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC53aXRoKCdkZWxldGVkX3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAgICAgIC53aGVyZSgnaWQnLCAnPScsIHBlcnNvbklkKVxuICAgICAqICAgICAgICAucmV0dXJuaW5nKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgICAgLiRhc3NlcnRUeXBlPHsgZmlyc3RfbmFtZTogc3RyaW5nIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAud2l0aCgnZGVsZXRlZF9wZXRzJywgKHFiKSA9PiBxYlxuICAgICAqICAgICAgIC5kZWxldGVGcm9tKCdwZXQnKVxuICAgICAqICAgICAgIC53aGVyZSgnb3duZXJfaWQnLCAnPScsIHBlcnNvbklkKVxuICAgICAqICAgICAgIC5yZXR1cm5pbmcoWyduYW1lIGFzIHBldF9uYW1lJywgJ3NwZWNpZXMnXSlcbiAgICAgKiAgICAgICAuJGFzc2VydFR5cGU8eyBwZXRfbmFtZTogc3RyaW5nLCBzcGVjaWVzOiBTcGVjaWVzIH0+KClcbiAgICAgKiAgICAgKVxuICAgICAqICAgICAuc2VsZWN0RnJvbShbJ2RlbGV0ZWRfcGVyc29uJywgJ2RlbGV0ZWRfcGV0cyddKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWxldGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIERlbGV0ZVF1ZXJ5QnVpbGRlciBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVsZXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiByb3dzLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUgdGhlIHtAbGluayBleGVjdXRlVGFrZUZpcnN0fSBhbmQge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93fSBtZXRob2RzLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICBjb25zdCB7IGFkYXB0ZXIgfSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yO1xuICAgICAgICBjb25zdCBxdWVyeSA9IGNvbXBpbGVkUXVlcnkucXVlcnk7XG4gICAgICAgIGlmICgocXVlcnkucmV0dXJuaW5nICYmIGFkYXB0ZXIuc3VwcG9ydHNSZXR1cm5pbmcpIHx8XG4gICAgICAgICAgICAocXVlcnkub3V0cHV0ICYmIGFkYXB0ZXIuc3VwcG9ydHNPdXRwdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtuZXcgRGVsZXRlUmVzdWx0KHJlc3VsdC5udW1BZmZlY3RlZFJvd3MgPz8gQmlnSW50KDApKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEV4cGxhaW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBmb3JtYXQsIG9wdGlvbnMpLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGJ1aWxkZXIuZXhlY3V0ZSgpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdXBkYXRlLXJlc3VsdC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBVcGRhdGVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IHVwZGF0ZWQgKGV2ZW4gaWYgbm90IGNoYW5nZWQpLlxuICAgICAqL1xuICAgIG51bVVwZGF0ZWRSb3dzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygcm93cyB0aGUgdXBkYXRlIHF1ZXJ5IGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzICoqb3B0aW9uYWwqKiBhbmQgb25seSBzdXBwb3J0ZWQgaW4gZGlhbGVjdHMgc3VjaCBhcyBNeVNRTC5cbiAgICAgKiBZb3Ugd291bGQgcHJvYmFibHkgdXNlIHtAbGluayBudW1VcGRhdGVkUm93c30gaW4gbW9zdCBjYXNlcy5cbiAgICAgKi9cbiAgICBudW1DaGFuZ2VkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1VcGRhdGVkUm93cywgbnVtQ2hhbmdlZFJvd3MpIHtcbiAgICAgICAgdGhpcy5udW1VcGRhdGVkUm93cyA9IG51bVVwZGF0ZWRSb3dzO1xuICAgICAgICB0aGlzLm51bUNoYW5nZWRSb3dzID0gbnVtQ2hhbmdlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91cGRhdGUtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IHBhcnNlSm9pbiwgfSBmcm9tICcuLi9wYXJzZXIvam9pbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVVwZGF0ZSwgfSBmcm9tICcuLi9wYXJzZXIvdXBkYXRlLXNldC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgVXBkYXRlUmVzdWx0IH0gZnJvbSAnLi91cGRhdGUtcmVzdWx0LmpzJztcbmltcG9ydCB7IGlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yLCBOb1Jlc3VsdEVycm9yLCB9IGZyb20gJy4vbm8tcmVzdWx0LWVycm9yLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmV4cG9ydCBjbGFzcyBVcGRhdGVRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHdoZXJlKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoV2hlcmUodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJXaGVyZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhbiBgdXBkYXRlYCBxdWVyeSBpbnRvIGEgYHVwZGF0ZSB0b3BgIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBVcGRhdGUgdGhlIGZpcnN0IHJvdzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAudG9wKDEpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0ZvbycgfSlcbiAgICAgKiAgIC53aGVyZSgnYWdlJywgJz4nLCAxOClcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgdG9wKDEpIFwicGVyc29uXCIgc2V0IFwiZmlyc3RfbmFtZVwiID0gQDEgd2hlcmUgXCJhZ2VcIiA+IEAyXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBVcGRhdGUgdGhlIDUwJSBmaXJzdCByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC50b3AoNTAsICdwZXJjZW50JylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnRm9vJyB9KVxuICAgICAqICAgLndoZXJlKCdhZ2UnLCAnPicsIDE4KVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNUyBTUUwgU2VydmVyKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSB0b3AoNTApIHBlcmNlbnQgXCJwZXJzb25cIiBzZXQgXCJmaXJzdF9uYW1lXCIgPSBAMSB3aGVyZSBcImFnZVwiID4gQDJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB0b3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmcm9tKGZyb20pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhGcm9tSXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdChmcm9tKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgI2pvaW4oam9pblR5cGUsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaW1pdCBjbGF1c2UgdG8gdGhlIHVwZGF0ZSBxdWVyeSBmb3Igc3VwcG9ydGVkIGRhdGFiYXNlcywgc3VjaCBhcyBNeVNRTC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBmaXJzdCAyIHJvd3MgaW4gdGhlICdwZXJzb24nIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh7IGZpcnN0X25hbWU6ICdGb28nIH0pXG4gICAgICogICAubGltaXQoMilcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgYHBlcnNvbmAgc2V0IGBmaXJzdF9uYW1lYCA9ID8gbGltaXQgP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFVwZGF0ZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVcGRhdGVzKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VVcGRhdGUoLi4uYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0QWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBhZ2U6IDM5IH0pXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsLnJhdygnLS0gVGhpcyBpcyBhIGNvbW1lbnQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiB1cGRhdGUgYHBlcnNvbmBcbiAgICAgKiBzZXQgYGFnZWAgPSAzOVxuICAgICAqIHdoZXJlIGBmaXJzdF9uYW1lYCA9IFwiSm9oblwiIC0tIFRoaXMgaXMgYSBjb21tZW50XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgYWxsIGByZXR1cm5pbmdgIGNsYXVzZXMgZnJvbSB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC5zZXQoeyBhZ2U6IDM5IH0pXG4gICAgICogICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKb2huJylcbiAgICAgKiAgIC5jbGVhclJldHVybmluZygpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHVwZGF0ZSBcInBlcnNvblwiIHNldCBcImFnZVwiID0gMzkgd2hlcmUgXCJmaXJzdF9uYW1lXCIgPSBcIkpvaG5cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNsZWFyUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dFJldHVybmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgUGVyc29uVXBkYXRlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGxvZzxUIGV4dGVuZHMgQ29tcGlsYWJsZT4ocWI6IFQpOiBUIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHFiLmNvbXBpbGUoKSlcbiAgICAgKiAgIHJldHVybiBxYlxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgKiAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXJzb25VcGRhdGVcbiAgICAgKlxuICAgICAqIGRiLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLnNldCh2YWx1ZXMpXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGVyc29uKGlkOiBudW1iZXIsIHVwZGF0ZXM6IFBlcnNvblVwZGF0ZSwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAgIC5zZXQodXBkYXRlcylcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgdXBkYXRlUGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBVcGRhdGVRdWVyeUJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIChwYXJ0cyBvZikgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEt5c2VseSB0cmllcyB0byBiZSBhcyB0eXBlLXNhZmUgYXMgcG9zc2libGUsIGJ1dCBpbiBzb21lIGNhc2VzIHdlIGhhdmUgdG8gbWFrZVxuICAgICAqIGNvbXByb21pc2VzIGZvciBiZXR0ZXIgbWFpbnRhaW5hYmlsaXR5IGFuZCBjb21waWxhdGlvbiBwZXJmb3JtYW5jZS4gQXQgcHJlc2VudCxcbiAgICAgKiBLeXNlbHkgZG9lc24ndCBuYXJyb3cgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBxdWVyeSBiYXNlZCBvbiB7QGxpbmsgc2V0fSBpbnB1dFxuICAgICAqIHdoZW4gdXNpbmcge0BsaW5rIHdoZXJlfSBhbmQvb3Ige0BsaW5rIHJldHVybmluZ30gb3Ige0BsaW5rIHJldHVybmluZ0FsbH0uXG4gICAgICpcbiAgICAgKiBUaGlzIHV0aWxpdHkgbWV0aG9kIGlzIHZlcnkgdXNlZnVsIGZvciB0aGVzZSBzaXR1YXRpb25zLCBhcyBpdCByZW1vdmVzIHVubmNlc3NhcnlcbiAgICAgKiBydW50aW1lIGFzc2VydGlvbi9ndWFyZCBjb2RlLiBJdHMgaW5wdXQgdHlwZSBpcyBsaW1pdGVkIHRvIHRoZSBvdXRwdXQgdHlwZVxuICAgICAqIG9mIHRoZSBxdWVyeSwgc28geW91IGNhbid0IGFkZCBhIGNvbHVtbiB0aGF0IGRvZXNuJ3QgZXhpc3QsIG9yIGNoYW5nZSBhIGNvbHVtbidzXG4gICAgICogdHlwZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IGluIGl0cyB1bmlvbiB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUdXJuIHRoaXMgY29kZTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb24gfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgaWQgPSAxXG4gICAgICogY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSBhd2FpdCBkYi51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBkZWxldGVkX2F0OiBub3cgfSlcbiAgICAgKiAgIC53aGVyZSgnaWQnLCAnPScsIGlkKVxuICAgICAqICAgLndoZXJlKCdudWxsYWJsZV9jb2x1bW4nLCAnaXMgbm90JywgbnVsbClcbiAgICAgKiAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIGlmIChpc1dpdGhOb051bGxWYWx1ZShwZXJzb24pKSB7XG4gICAgICogICBmdW5jdGlvblRoYXRFeHBlY3RzUGVyc29uV2l0aE5vbk51bGxWYWx1ZShwZXJzb24pXG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNXaXRoTm9OdWxsVmFsdWUocGVyc29uOiBQZXJzb24pOiBwZXJzb24gaXMgUGVyc29uICYgeyBudWxsYWJsZV9jb2x1bW46IHN0cmluZyB9IHtcbiAgICAgKiAgIHJldHVybiBwZXJzb24ubnVsbGFibGVfY29sdW1uICE9IG51bGxcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbnRvIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgTm90TnVsbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGlkID0gMVxuICAgICAqIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAqXG4gICAgICogY29uc3QgcGVyc29uID0gYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZGVsZXRlZF9hdDogbm93IH0pXG4gICAgICogICAud2hlcmUoJ2lkJywgJz0nLCBpZClcbiAgICAgKiAgIC53aGVyZSgnbnVsbGFibGVfY29sdW1uJywgJ2lzIG5vdCcsIG51bGwpXG4gICAgICogICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgIC4kbmFycm93VHlwZTx7IGRlbGV0ZWRfYXQ6IERhdGU7IG51bGxhYmxlX2NvbHVtbjogTm90TnVsbCB9PigpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogZnVuY3Rpb25UaGF0RXhwZWN0c1BlcnNvbldpdGhOb25OdWxsVmFsdWUocGVyc29uKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFzc2VydHMgdGhhdCBxdWVyeSdzIG91dHB1dCByb3cgdHlwZSBlcXVhbHMgdGhlIGdpdmVuIHR5cGUgYFRgLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgZXhjZXNzaXZlbHkgY29tcGxleCB0eXBlcyB0byBtYWtlIFR5cGVTY3JpcHQgaGFwcHlcbiAgICAgKiBhbmQgbXVjaCBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBLeXNlbHkgdXNlcyBjb21wbGV4IHR5cGUgbWFnaWMgdG8gYWNoaWV2ZSBpdHMgdHlwZSBzYWZldHkuIFRoaXMgY29tcGxleGl0eSBpcyBzb21ldGltZXMgdG9vIG11Y2hcbiAgICAgKiBmb3IgVHlwZVNjcmlwdCBhbmQgeW91IGdldCBlcnJvcnMgbGlrZSB0aGlzOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogZXJyb3IgVFMyNTg5OiBUeXBlIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGUuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGVzZSBjYXNlIHlvdSBjYW4gb2Z0ZW4gdXNlIHRoaXMgbWV0aG9kIHRvIGhlbHAgVHlwZVNjcmlwdCBhIGxpdHRsZSBiaXQuIFdoZW4geW91IHVzZSB0aGlzXG4gICAgICogbWV0aG9kIHRvIGFzc2VydCB0aGUgb3V0cHV0IHR5cGUgb2YgYSBxdWVyeSwgS3lzZWx5IGNhbiBkcm9wIHRoZSBjb21wbGV4IG91dHB1dCB0eXBlIHRoYXRcbiAgICAgKiBjb25zaXN0cyBvZiBtdWx0aXBsZSBuZXN0ZWQgaGVscGVyIHR5cGVzIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIHNpbXBsZSBhc3NlcnRlZCB0eXBlLlxuICAgICAqXG4gICAgICogVXNpbmcgdGhpcyBtZXRob2QgZG9lc24ndCByZWR1Y2UgdHlwZSBzYWZldHkgYXQgYWxsLiBZb3UgaGF2ZSB0byBwYXNzIGluIGEgdHlwZSB0aGF0IGlzXG4gICAgICogc3RydWN0dXJhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUsIFBldFVwZGF0ZSwgU3BlY2llcyB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCBwZXJzb24gPSB7XG4gICAgICogICBpZDogMSxcbiAgICAgKiAgIGdlbmRlcjogJ290aGVyJyxcbiAgICAgKiB9IHNhdGlzZmllcyBQZXJzb25VcGRhdGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHBldCA9IHtcbiAgICAgKiAgIG5hbWU6ICdGbHVmZnknLFxuICAgICAqIH0gc2F0aXNmaWVzIFBldFVwZGF0ZVxuICAgICAqXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC53aXRoKCd1cGRhdGVkX3BlcnNvbicsIChxYikgPT4gcWJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgICAuc2V0KHBlcnNvbilcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgcGVyc29uLmlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgICAgLiRhc3NlcnRUeXBlPHsgZmlyc3RfbmFtZTogc3RyaW5nIH0+KClcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aXRoKCd1cGRhdGVkX3BldCcsIChxYikgPT4gcWJcbiAgICAgKiAgICAgLnVwZGF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgICAuc2V0KHBldClcbiAgICAgKiAgICAgLndoZXJlKCdvd25lcl9pZCcsICc9JywgcGVyc29uLmlkKVxuICAgICAqICAgICAucmV0dXJuaW5nKFsnbmFtZSBhcyBwZXRfbmFtZScsICdzcGVjaWVzJ10pXG4gICAgICogICAgIC4kYXNzZXJ0VHlwZTx7IHBldF9uYW1lOiBzdHJpbmcsIHNwZWNpZXM6IFNwZWNpZXMgfT4oKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oWyd1cGRhdGVkX3BlcnNvbicsICd1cGRhdGVkX3BldCddKVxuICAgICAqICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRhc3NlcnRUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFVwZGF0ZVF1ZXJ5QnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgVXBkYXRlUXVlcnlCdWlsZGVyIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIHBsdWdpbiBpbnN0YWxsZWQuXG4gICAgICovXG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbmV3IFVwZGF0ZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzID8/IEJpZ0ludCgwKSwgcmVzdWx0Lm51bUNoYW5nZWRSb3dzKSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdW5kZWZpbmVkIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlVGFrZUZpcnN0KCkge1xuICAgICAgICBjb25zdCBbcmVzdWx0XSA9IGF3YWl0IHRoaXMuZXhlY3V0ZSgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBvciB0aHJvd3MgaWZcbiAgICAgKiB0aGUgcXVlcnkgcmV0dXJuZWQgbm8gcmVzdWx0LlxuICAgICAqXG4gICAgICogQnkgZGVmYXVsdCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTm9SZXN1bHRFcnJvcn0gaXMgdGhyb3duLCBidXQgeW91IGNhblxuICAgICAqIHByb3ZpZGUgYSBjdXN0b20gZXJyb3IgY2xhc3MsIG9yIGNhbGxiYWNrIGFzIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHRocm93IGEgZGlmZmVyZW50XG4gICAgICogZXJyb3IuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coZXJyb3JDb25zdHJ1Y3RvciA9IE5vUmVzdWx0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlVGFrZUZpcnN0KCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvcihlcnJvckNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgICAgID8gbmV3IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSlcbiAgICAgICAgICAgICAgICA6IGVycm9yQ29uc3RydWN0b3IodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNodW5rU2l6ZSA9IDEwMCkge1xuICAgICAgICBjb25zdCBjb21waWxlZFF1ZXJ5ID0gdGhpcy5jb21waWxlKCk7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2Ygc3RyZWFtKSB7XG4gICAgICAgICAgICB5aWVsZCogaXRlbS5yb3dzO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGV4cGxhaW4oZm9ybWF0LCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRXhwbGFpbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIGZvcm1hdCwgb3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYXdhaXQgYnVpbGRlci5leGVjdXRlKCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1uYW1lLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuL3RhYmxlLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGVOYW1lLCBjb2x1bW5OYW1lcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogVGFibGVOb2RlLmNyZWF0ZSh0YWJsZU5hbWUpLFxuICAgICAgICAgICAgY29sdW1uczogY29sdW1uTmFtZXNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShjb2x1bW5OYW1lcy5tYXAoQ29sdW1uTm9kZS5jcmVhdGUpKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jdGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBDVEVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29tbW9uIHRhYmxlIGV4cHJlc3Npb24gbWF0ZXJpYWxpemVkLlxuICAgICAqL1xuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDVEVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGNvbW1vbiB0YWJsZSBleHByZXNzaW9uIG5vdCBtYXRlcmlhbGl6ZWQuXG4gICAgICovXG4gICAgbm90TWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IENURUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMubm9kZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3dpdGgtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb21tb24tdGFibGUtZXhwcmVzc2lvbi1uYW1lLW5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlDcmVhdG9yIH0gZnJvbSAnLi9wYXJzZS11dGlscy5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ1RFQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvY3RlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbW1vbi10YWJsZS1leHByZXNzaW9uLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uKG5hbWVPckJ1aWxkZXJDYWxsYmFjaywgZXhwcmVzc2lvbikge1xuICAgIGNvbnN0IGV4cHJlc3Npb25Ob2RlID0gZXhwcmVzc2lvbihjcmVhdGVRdWVyeUNyZWF0b3IoKSkudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgaWYgKGlzRnVuY3Rpb24obmFtZU9yQnVpbGRlckNhbGxiYWNrKSkge1xuICAgICAgICByZXR1cm4gbmFtZU9yQnVpbGRlckNhbGxiYWNrKGN0ZUJ1aWxkZXJGYWN0b3J5KGV4cHJlc3Npb25Ob2RlKSkudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHJldHVybiBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlLmNyZWF0ZShwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobmFtZU9yQnVpbGRlckNhbGxiYWNrKSwgZXhwcmVzc2lvbk5vZGUpO1xufVxuZnVuY3Rpb24gY3RlQnVpbGRlckZhY3RvcnkoZXhwcmVzc2lvbk5vZGUpIHtcbiAgICByZXR1cm4gKG5hbWUpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDVEVCdWlsZGVyKHtcbiAgICAgICAgICAgIG5vZGU6IENvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUuY3JlYXRlKHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZShuYW1lKSwgZXhwcmVzc2lvbk5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lKG5hbWUpIHtcbiAgICBpZiAobmFtZS5pbmNsdWRlcygnKCcpKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvW1xcKFxcKV0vKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSBwYXJ0c1swXTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHBhcnRzWzFdLnNwbGl0KCcsJykubWFwKChpdCkgPT4gaXQudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlLmNyZWF0ZSh0YWJsZSwgY29sdW1ucyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUuY3JlYXRlKG5hbWUpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2l0aC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFdpdGhOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdXaXRoTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1dpdGhOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb25zOiBmcmVlemUoW2V4cHJlc3Npb25dKSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFeHByZXNzaW9uKHdpdGhOb2RlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ud2l0aE5vZGUsXG4gICAgICAgICAgICBleHByZXNzaW9uczogZnJlZXplKFsuLi53aXRoTm9kZS5leHByZXNzaW9ucywgZXhwcmVzc2lvbl0pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JhbmRvbS1zdHJpbmcuZC50c1wiIC8+XG5jb25zdCBDSEFSUyA9IFtcbiAgICAnQScsXG4gICAgJ0InLFxuICAgICdDJyxcbiAgICAnRCcsXG4gICAgJ0UnLFxuICAgICdGJyxcbiAgICAnRycsXG4gICAgJ0gnLFxuICAgICdJJyxcbiAgICAnSicsXG4gICAgJ0snLFxuICAgICdMJyxcbiAgICAnTScsXG4gICAgJ04nLFxuICAgICdPJyxcbiAgICAnUCcsXG4gICAgJ1EnLFxuICAgICdSJyxcbiAgICAnUycsXG4gICAgJ1QnLFxuICAgICdVJyxcbiAgICAnVicsXG4gICAgJ1cnLFxuICAgICdYJyxcbiAgICAnWScsXG4gICAgJ1onLFxuICAgICdhJyxcbiAgICAnYicsXG4gICAgJ2MnLFxuICAgICdkJyxcbiAgICAnZScsXG4gICAgJ2YnLFxuICAgICdnJyxcbiAgICAnaCcsXG4gICAgJ2knLFxuICAgICdqJyxcbiAgICAnaycsXG4gICAgJ2wnLFxuICAgICdtJyxcbiAgICAnbicsXG4gICAgJ28nLFxuICAgICdwJyxcbiAgICAncScsXG4gICAgJ3InLFxuICAgICdzJyxcbiAgICAndCcsXG4gICAgJ3UnLFxuICAgICd2JyxcbiAgICAndycsXG4gICAgJ3gnLFxuICAgICd5JyxcbiAgICAneicsXG4gICAgJzAnLFxuICAgICcxJyxcbiAgICAnMicsXG4gICAgJzMnLFxuICAgICc0JyxcbiAgICAnNScsXG4gICAgJzYnLFxuICAgICc3JyxcbiAgICAnOCcsXG4gICAgJzknLFxuXTtcbmV4cG9ydCBmdW5jdGlvbiByYW5kb21TdHJpbmcobGVuZ3RoKSB7XG4gICAgbGV0IGNoYXJzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICBjaGFycyArPSByYW5kb21DaGFyKCk7XG4gICAgfVxuICAgIHJldHVybiBjaGFycztcbn1cbmZ1bmN0aW9uIHJhbmRvbUNoYXIoKSB7XG4gICAgcmV0dXJuIENIQVJTW35+KE1hdGgucmFuZG9tKCkgKiBDSEFSUy5sZW5ndGgpXTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktaWQuZC50c1wiIC8+XG5pbXBvcnQgeyByYW5kb21TdHJpbmcgfSBmcm9tICcuL3JhbmRvbS1zdHJpbmcuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVF1ZXJ5SWQoKSB7XG4gICAgcmV0dXJuIG5ldyBMYXp5UXVlcnlJZCgpO1xufVxuY2xhc3MgTGF6eVF1ZXJ5SWQge1xuICAgICNxdWVyeUlkO1xuICAgIGdldCBxdWVyeUlkKCkge1xuICAgICAgICBpZiAodGhpcy4jcXVlcnlJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLiNxdWVyeUlkID0gcmFuZG9tU3RyaW5nKDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWVyeUlkO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb3BlcmF0aW9uLW5vZGUtdHJhbnNmb3JtZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyByZXF1aXJlQWxsUHJvcHMgfSBmcm9tICcuLi91dGlsL3JlcXVpcmUtYWxsLXByb3BzLmpzJztcbi8qKlxuICogVHJhbnNmb3JtcyBhbiBvcGVyYXRpb24gbm9kZSB0cmVlIGludG8gYW5vdGhlciBvbmUuXG4gKlxuICogS3lzZWx5IHF1ZXJpZXMgYXJlIGV4cHJlc3NlZCBpbnRlcm5hbGx5IGFzIGEgdHJlZSBvZiBvYmplY3RzIChvcGVyYXRpb24gbm9kZXMpLlxuICogYE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcmAgdGFrZXMgc3VjaCBhIHRyZWUgYXMgaXRzIGlucHV0IGFuZCByZXR1cm5zIGFcbiAqIHRyYW5zZm9ybWVkIGRlZXAgY29weSBvZiBpdC4gQnkgZGVmYXVsdCB0aGUgYE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcmBcbiAqIGRvZXMgbm90aGluZy4gWW91IG5lZWQgdG8gb3ZlcnJpZGUgb25lIG9yIG1vcmUgbWV0aG9kcyB0byBtYWtlIGl0IGRvXG4gKiBzb21ldGhpbmcuXG4gKlxuICogVGhlcmUncyBhIG1ldGhvZCBmb3IgZWFjaCBub2RlIHR5cGUuIEZvciBleGFtcGxlIGlmIHlvdSdkIGxpa2UgdG8gY29udmVydFxuICogZWFjaCBpZGVudGlmaWVyICh0YWJsZSBuYW1lLCBjb2x1bW4gbmFtZSwgYWxpYXMgZXRjLikgZnJvbSBjYW1lbENhc2UgdG9cbiAqIHNuYWtlX2Nhc2UsIHlvdSdkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHR5cGUgSWRlbnRpZmllck5vZGUsIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJ2t5c2VseSdcbiAqIGltcG9ydCBzbmFrZUNhc2UgZnJvbSAnbG9kYXNoL3NuYWtlQ2FzZSdcbiAqXG4gKiBjbGFzcyBDYW1lbENhc2VUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gKiAgIG92ZXJyaWRlIHRyYW5zZm9ybUlkZW50aWZpZXIobm9kZTogSWRlbnRpZmllck5vZGUpOiBJZGVudGlmaWVyTm9kZSB7XG4gKiAgICAgbm9kZSA9IHN1cGVyLnRyYW5zZm9ybUlkZW50aWZpZXIobm9kZSlcbiAqXG4gKiAgICAgcmV0dXJuIHtcbiAqICAgICAgIC4uLm5vZGUsXG4gKiAgICAgICBuYW1lOiBzbmFrZUNhc2Uobm9kZS5uYW1lKSxcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDYW1lbENhc2VUcmFuc2Zvcm1lcigpXG4gKlxuICogY29uc3QgcXVlcnkgPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKVxuICpcbiAqIGNvbnN0IHRyZWUgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKHF1ZXJ5LnRvT3BlcmF0aW9uTm9kZSgpKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgIG5vZGVTdGFjayA9IFtdO1xuICAgICN0cmFuc2Zvcm1lcnMgPSBmcmVlemUoe1xuICAgICAgICBBbGlhc05vZGU6IHRoaXMudHJhbnNmb3JtQWxpYXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgSWRlbnRpZmllck5vZGU6IHRoaXMudHJhbnNmb3JtSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBTY2hlbWFibGVJZGVudGlmaWVyTm9kZTogdGhpcy50cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFJhd05vZGU6IHRoaXMudHJhbnNmb3JtUmF3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZU5vZGU6IHRoaXMudHJhbnNmb3JtUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdFF1ZXJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3Rpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRnJvbU5vZGU6IHRoaXMudHJhbnNmb3JtRnJvbS5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RBbGxOb2RlOiB0aGlzLnRyYW5zZm9ybVNlbGVjdEFsbC5iaW5kKHRoaXMpLFxuICAgICAgICBBbmROb2RlOiB0aGlzLnRyYW5zZm9ybUFuZC5iaW5kKHRoaXMpLFxuICAgICAgICBPck5vZGU6IHRoaXMudHJhbnNmb3JtT3IuYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVOb2RlOiB0aGlzLnRyYW5zZm9ybVZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtVmFsdWVMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1pdGl2ZVZhbHVlTGlzdE5vZGU6IHRoaXMudHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFBhcmVuc05vZGU6IHRoaXMudHJhbnNmb3JtUGFyZW5zLmJpbmQodGhpcyksXG4gICAgICAgIEpvaW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUpvaW4uYmluZCh0aGlzKSxcbiAgICAgICAgT3BlcmF0b3JOb2RlOiB0aGlzLnRyYW5zZm9ybU9wZXJhdG9yLmJpbmQodGhpcyksXG4gICAgICAgIFdoZXJlTm9kZTogdGhpcy50cmFuc2Zvcm1XaGVyZS5iaW5kKHRoaXMpLFxuICAgICAgICBJbnNlcnRRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtSW5zZXJ0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgRGVsZXRlUXVlcnlOb2RlOiB0aGlzLnRyYW5zZm9ybURlbGV0ZVF1ZXJ5LmJpbmQodGhpcyksXG4gICAgICAgIFJldHVybmluZ05vZGU6IHRoaXMudHJhbnNmb3JtUmV0dXJuaW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVRhYmxlTm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybUFkZENvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5EZWZpbml0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW5EZWZpbml0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIERhdGFUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1EYXRhVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBPcmRlckJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1PcmRlckJ5LmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1PcmRlckJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1Hcm91cEJ5LmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlJdGVtTm9kZTogdGhpcy50cmFuc2Zvcm1Hcm91cEJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBVcGRhdGVRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtVXBkYXRlUXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uVXBkYXRlTm9kZTogdGhpcy50cmFuc2Zvcm1Db2x1bW5VcGRhdGUuYmluZCh0aGlzKSxcbiAgICAgICAgTGltaXROb2RlOiB0aGlzLnRyYW5zZm9ybUxpbWl0LmJpbmQodGhpcyksXG4gICAgICAgIE9mZnNldE5vZGU6IHRoaXMudHJhbnNmb3JtT2Zmc2V0LmJpbmQodGhpcyksXG4gICAgICAgIE9uQ29uZmxpY3ROb2RlOiB0aGlzLnRyYW5zZm9ybU9uQ29uZmxpY3QuYmluZCh0aGlzKSxcbiAgICAgICAgT25EdXBsaWNhdGVLZXlOb2RlOiB0aGlzLnRyYW5zZm9ybU9uRHVwbGljYXRlS2V5LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZUluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wSW5kZXhOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBMaXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1MaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1QcmltYXJ5S2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBVbmlxdWVDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1VbmlxdWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZXNOb2RlOiB0aGlzLnRyYW5zZm9ybVJlZmVyZW5jZXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ2hlY2tDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1DaGVja0NvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgV2l0aE5vZGU6IHRoaXMudHJhbnNmb3JtV2l0aC5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZTogdGhpcy50cmFuc2Zvcm1Db21tb25UYWJsZUV4cHJlc3Npb25OYW1lLmJpbmQodGhpcyksXG4gICAgICAgIEhhdmluZ05vZGU6IHRoaXMudHJhbnNmb3JtSGF2aW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVNjaGVtYU5vZGU6IHRoaXMudHJhbnNmb3JtQ3JlYXRlU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BTY2hlbWFOb2RlOiB0aGlzLnRyYW5zZm9ybURyb3BTY2hlbWEuYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJUYWJsZU5vZGU6IHRoaXMudHJhbnNmb3JtQWx0ZXJUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbHVtbk5vZGU6IHRoaXMudHJhbnNmb3JtUmVuYW1lQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIEFsdGVyQ29sdW1uTm9kZTogdGhpcy50cmFuc2Zvcm1BbHRlckNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBNb2RpZnlDb2x1bW5Ob2RlOiB0aGlzLnRyYW5zZm9ybU1vZGlmeUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1BZGRDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZW5hbWVDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1SZW5hbWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZTogdGhpcy50cmFuc2Zvcm1Gb3JlaWduS2V5Q29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVWaWV3Tm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVWaWV3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZTogdGhpcy50cmFuc2Zvcm1SZWZyZXNoTWF0ZXJpYWxpemVkVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVmlld05vZGU6IHRoaXMudHJhbnNmb3JtRHJvcFZpZXcuYmluZCh0aGlzKSxcbiAgICAgICAgR2VuZXJhdGVkTm9kZTogdGhpcy50cmFuc2Zvcm1HZW5lcmF0ZWQuYmluZCh0aGlzKSxcbiAgICAgICAgRGVmYXVsdFZhbHVlTm9kZTogdGhpcy50cmFuc2Zvcm1EZWZhdWx0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgT25Ob2RlOiB0aGlzLnRyYW5zZm9ybU9uLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlc05vZGU6IHRoaXMudHJhbnNmb3JtVmFsdWVzLmJpbmQodGhpcyksXG4gICAgICAgIFNlbGVjdE1vZGlmaWVyTm9kZTogdGhpcy50cmFuc2Zvcm1TZWxlY3RNb2RpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1DcmVhdGVUeXBlLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUeXBlTm9kZTogdGhpcy50cmFuc2Zvcm1Ecm9wVHlwZS5iaW5kKHRoaXMpLFxuICAgICAgICBFeHBsYWluTm9kZTogdGhpcy50cmFuc2Zvcm1FeHBsYWluLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRJbnNlcnRWYWx1ZU5vZGU6IHRoaXMudHJhbnNmb3JtRGVmYXVsdEluc2VydFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIEFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBPdmVyTm9kZTogdGhpcy50cmFuc2Zvcm1PdmVyLmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5Tm9kZTogdGhpcy50cmFuc2Zvcm1QYXJ0aXRpb25CeS5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJ0aXRpb25CeUl0ZW1Ob2RlOiB0aGlzLnRyYW5zZm9ybVBhcnRpdGlvbkJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBTZXRPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybVNldE9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBCaW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnRyYW5zZm9ybUJpbmFyeU9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBVbmFyeU9wZXJhdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtVW5hcnlPcGVyYXRpb24uYmluZCh0aGlzKSxcbiAgICAgICAgVXNpbmdOb2RlOiB0aGlzLnRyYW5zZm9ybVVzaW5nLmJpbmQodGhpcyksXG4gICAgICAgIEZ1bmN0aW9uTm9kZTogdGhpcy50cmFuc2Zvcm1GdW5jdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDYXNlTm9kZTogdGhpcy50cmFuc2Zvcm1DYXNlLmJpbmQodGhpcyksXG4gICAgICAgIFdoZW5Ob2RlOiB0aGlzLnRyYW5zZm9ybVdoZW4uYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlJlZmVyZW5jZU5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTlJlZmVyZW5jZS5iaW5kKHRoaXMpLFxuICAgICAgICBKU09OUGF0aE5vZGU6IHRoaXMudHJhbnNmb3JtSlNPTlBhdGguYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlBhdGhMZWdOb2RlOiB0aGlzLnRyYW5zZm9ybUpTT05QYXRoTGVnLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05PcGVyYXRvckNoYWluTm9kZTogdGhpcy50cmFuc2Zvcm1KU09OT3BlcmF0b3JDaGFpbi5iaW5kKHRoaXMpLFxuICAgICAgICBUdXBsZU5vZGU6IHRoaXMudHJhbnNmb3JtVHVwbGUuYmluZCh0aGlzKSxcbiAgICAgICAgTWVyZ2VRdWVyeU5vZGU6IHRoaXMudHJhbnNmb3JtTWVyZ2VRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBNYXRjaGVkTm9kZTogdGhpcy50cmFuc2Zvcm1NYXRjaGVkLmJpbmQodGhpcyksXG4gICAgICAgIEFkZEluZGV4Tm9kZTogdGhpcy50cmFuc2Zvcm1BZGRJbmRleC5iaW5kKHRoaXMpLFxuICAgICAgICBDYXN0Tm9kZTogdGhpcy50cmFuc2Zvcm1DYXN0LmJpbmQodGhpcyksXG4gICAgICAgIEZldGNoTm9kZTogdGhpcy50cmFuc2Zvcm1GZXRjaC5iaW5kKHRoaXMpLFxuICAgICAgICBUb3BOb2RlOiB0aGlzLnRyYW5zZm9ybVRvcC5iaW5kKHRoaXMpLFxuICAgICAgICBPdXRwdXROb2RlOiB0aGlzLnRyYW5zZm9ybU91dHB1dC5iaW5kKHRoaXMpLFxuICAgICAgICBPckFjdGlvbk5vZGU6IHRoaXMudHJhbnNmb3JtT3JBY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sbGF0ZU5vZGU6IHRoaXMudHJhbnNmb3JtQ29sbGF0ZS5iaW5kKHRoaXMpLFxuICAgIH0pO1xuICAgIHRyYW5zZm9ybU5vZGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnB1c2gobm9kZSk7XG4gICAgICAgIGNvbnN0IG91dCA9IHRoaXMudHJhbnNmb3JtTm9kZUltcGwobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIHRoaXMubm9kZVN0YWNrLnBvcCgpO1xuICAgICAgICByZXR1cm4gZnJlZXplKG91dCk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyc1tub2RlLmtpbmRdKG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlTGlzdChsaXN0LCBxdWVyeUlkKSB7XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyZWV6ZShsaXN0Lm1hcCgobm9kZSkgPT4gdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUsIHF1ZXJ5SWQpKSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdFF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnU2VsZWN0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2VsZWN0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNlbGVjdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlzdGluY3RPbjogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmRpc3RpbmN0T24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgam9pbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5qb2lucywgcXVlcnlJZCksXG4gICAgICAgICAgICBncm91cEJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ncm91cEJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGxpbWl0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5saW1pdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9mZnNldCwgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGhhdmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaGF2aW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2V0T3BlcmF0aW9uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnNldE9wZXJhdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZmV0Y2g6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZldGNoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NlbGVjdGlvbk5vZGUnLFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZWxlY3Rpb24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BbGlhcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FsaWFzTm9kZScsXG4gICAgICAgICAgICBub2RlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5ub2RlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hbGlhcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1UYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1RhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnJvbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Zyb21Ob2RlJyxcbiAgICAgICAgICAgIGZyb21zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVmZXJlbmNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQW5kKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQW5kTm9kZScsXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Pcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09yTm9kZScsXG4gICAgICAgICAgICBsZWZ0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5sZWZ0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJpZ2h0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yaWdodCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1WYWx1ZUxpc3Qobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdWYWx1ZUxpc3ROb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnZhbHVlcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJlbnMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQYXJlbnNOb2RlJyxcbiAgICAgICAgICAgIG5vZGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5vZGUsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSm9pbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pvaW5Ob2RlJyxcbiAgICAgICAgICAgIGpvaW5UeXBlOiBub2RlLmpvaW5UeXBlLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vbiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SYXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSYXdOb2RlJyxcbiAgICAgICAgICAgIHNxbEZyYWdtZW50czogZnJlZXplKFsuLi5ub2RlLnNxbEZyYWdtZW50c10pLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnBhcmFtZXRlcnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtV2hlcmUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVyZU5vZGUnLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUluc2VydFF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSW5zZXJ0UXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGludG86IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmludG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb25Db25mbGljdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub25Db25mbGljdCwgcXVlcnlJZCksXG4gICAgICAgICAgICBvbkR1cGxpY2F0ZUtleTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub25EdXBsaWNhdGVLZXksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWdub3JlOiBub2RlLmlnbm9yZSxcbiAgICAgICAgICAgIG9yQWN0aW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vckFjdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXBsYWNlOiBub2RlLnJlcGxhY2UsXG4gICAgICAgICAgICBleHBsYWluOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHBsYWluLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXM6IG5vZGUuZGVmYXVsdFZhbHVlcyxcbiAgICAgICAgICAgIHRvcDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudG9wLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlcyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1ZhbHVlc05vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURlbGV0ZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRGVsZXRlUXVlcnlOb2RlJyxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGpvaW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuam9pbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlcmU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmVuZE1vZGlmaWVycywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aXRoOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9yZGVyQnksIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxpbWl0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGV4cGxhaW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cGxhaW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmV0dXJuaW5nKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmV0dXJuaW5nTm9kZScsXG4gICAgICAgICAgICBzZWxlY3Rpb25zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuc2VsZWN0aW9ucywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0NyZWF0ZVRhYmxlTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uc3RyYWludHM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb25zdHJhaW50cywgcXVlcnlJZCksXG4gICAgICAgICAgICB0ZW1wb3Jhcnk6IG5vZGUudGVtcG9yYXJ5LFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICBvbkNvbW1pdDogbm9kZS5vbkNvbW1pdCxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNlbGVjdFF1ZXJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZWxlY3RRdWVyeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2x1bW5EZWZpbml0aW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlZmVyZW5jZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcHJpbWFyeUtleTogbm9kZS5wcmltYXJ5S2V5LFxuICAgICAgICAgICAgYXV0b0luY3JlbWVudDogbm9kZS5hdXRvSW5jcmVtZW50LFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIG5vdE51bGw6IG5vZGUubm90TnVsbCxcbiAgICAgICAgICAgIHVuc2lnbmVkOiBub2RlLnVuc2lnbmVkLFxuICAgICAgICAgICAgZGVmYXVsdFRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kZWZhdWx0VG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY2hlY2s6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNoZWNrLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZ2VuZXJhdGVkLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb250TW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IG5vZGUubnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgICAgIGlkZW50aXR5OiBub2RlLmlkZW50aXR5LFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZGRDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BUYWJsZU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JkZXJCeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09yZGVyQnlOb2RlJyxcbiAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuaXRlbXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JkZXJCeUl0ZW0obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPcmRlckJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRpcmVjdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2xsYXRpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbGxhdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsczogbm9kZS5udWxscyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdyb3VwQnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUdyb3VwQnlJdGVtKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR3JvdXBCeUl0ZW1Ob2RlJyxcbiAgICAgICAgICAgIGdyb3VwQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmdyb3VwQnksIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVXBkYXRlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVcGRhdGVRdWVyeU5vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGZyb206IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZyb20sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgam9pbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5qb2lucywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVyZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUud2hlcmUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdXBkYXRlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnVwZGF0ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmV0dXJuaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZXR1cm5pbmcsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZXhwbGFpbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZXhwbGFpbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3V0cHV0OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdXRwdXQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3JkZXJCeTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3JkZXJCeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Db2x1bW5VcGRhdGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb2x1bW5VcGRhdGVOb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29sdW1uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS52YWx1ZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1MaW1pdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0xpbWl0Tm9kZScsXG4gICAgICAgICAgICBsaW1pdDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubGltaXQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT2Zmc2V0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT2Zmc2V0Tm9kZScsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9mZnNldCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PbkNvbmZsaWN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnT25Db25mbGljdE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uc3RyYWludDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuY29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICBpbmRleEV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmluZGV4RXhwcmVzc2lvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICBpbmRleFdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbmRleFdoZXJlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS51cGRhdGVzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVwZGF0ZVdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51cGRhdGVXaGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkb05vdGhpbmc6IG5vZGUuZG9Ob3RoaW5nLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT25EdXBsaWNhdGVLZXkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPbkR1cGxpY2F0ZUtleU5vZGUnLFxuICAgICAgICAgICAgdXBkYXRlczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnVwZGF0ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ3JlYXRlSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdW5pcXVlOiBub2RlLnVuaXF1ZSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICBpZk5vdEV4aXN0czogbm9kZS5pZk5vdEV4aXN0cyxcbiAgICAgICAgICAgIHdoZXJlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aGVyZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBub2RlLm51bGxzTm90RGlzdGluY3QsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1MaXN0KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTGlzdE5vZGUnLFxuICAgICAgICAgICAgaXRlbXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5pdGVtcywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wSW5kZXhOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUHJpbWFyeUtleUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVVuaXF1ZUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdVbmlxdWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG51bGxzTm90RGlzdGluY3Q6IG5vZGUubnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgICAgIGRlZmVycmFibGU6IG5vZGUuZGVmZXJyYWJsZSxcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBub2RlLmluaXRpYWxseURlZmVycmVkLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRm9yZWlnbktleUNvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgcmVmZXJlbmNlczogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVmZXJlbmNlcywgcXVlcnlJZCksXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBub2RlLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IG5vZGUub25VcGRhdGUsXG4gICAgICAgICAgICBkZWZlcnJhYmxlOiBub2RlLmRlZmVycmFibGUsXG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogbm9kZS5pbml0aWFsbHlEZWZlcnJlZCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNldE9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NldE9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgb3BlcmF0b3I6IG5vZGUub3BlcmF0b3IsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFsbDogbm9kZS5hbGwsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZWZlcmVuY2VzKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlc05vZGUnLFxuICAgICAgICAgICAgdGFibGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnRhYmxlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBub2RlLm9uRGVsZXRlLFxuICAgICAgICAgICAgb25VcGRhdGU6IG5vZGUub25VcGRhdGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DaGVja0NvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDaGVja0NvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1XaXRoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnV2l0aE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5leHByZXNzaW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICByZWN1cnNpdmU6IG5vZGUucmVjdXJzaXZlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29tbW9uVGFibGVFeHByZXNzaW9uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG1hdGVyaWFsaXplZDogbm9kZS5tYXRlcmlhbGl6ZWQsXG4gICAgICAgICAgICBleHByZXNzaW9uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5leHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZScsXG4gICAgICAgICAgICB0YWJsZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudGFibGUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSGF2aW5nKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSGF2aW5nTm9kZScsXG4gICAgICAgICAgICBoYXZpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmhhdmluZywgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVTY2hlbWEobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcFNjaGVtYShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Ryb3BTY2hlbWFOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWx0ZXJUYWJsZShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyVGFibGVOb2RlJyxcbiAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50YWJsZSwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lVG8sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgc2V0U2NoZW1hOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5zZXRTY2hlbWEsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29sdW1uQWx0ZXJhdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5jb2x1bW5BbHRlcmF0aW9ucywgcXVlcnlJZCksXG4gICAgICAgICAgICBhZGRDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hZGRDb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5kcm9wQ29uc3RyYWludCwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVDb25zdHJhaW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZW5hbWVDb25zdHJhaW50LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGFkZEluZGV4OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5hZGRJbmRleCwgcXVlcnlJZCksXG4gICAgICAgICAgICBkcm9wSW5kZXg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRyb3BJbmRleCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ecm9wQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtUmVuYW1lQ29sdW1uKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbHVtbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZW5hbWVUbzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmVuYW1lVG8sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWx0ZXJDb2x1bW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBbHRlckNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGRhdGFUeXBlRXhwcmVzc2lvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZGF0YVR5cGVFeHByZXNzaW9uLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHNldERlZmF1bHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnNldERlZmF1bHQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZHJvcERlZmF1bHQ6IG5vZGUuZHJvcERlZmF1bHQsXG4gICAgICAgICAgICBzZXROb3ROdWxsOiBub2RlLnNldE5vdE51bGwsXG4gICAgICAgICAgICBkcm9wTm90TnVsbDogbm9kZS5kcm9wTm90TnVsbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1vZGlmeUNvbHVtbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ01vZGlmeUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5jb2x1bW4sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkQ29uc3RyYWludChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0FkZENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnQsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRHJvcENvbnN0cmFpbnQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdEcm9wQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29uc3RyYWludE5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbnN0cmFpbnROYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmRXhpc3RzOiBub2RlLmlmRXhpc3RzLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZW5hbWVDb25zdHJhaW50KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVuYW1lQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgb2xkTmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub2xkTmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBuZXdOYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uZXdOYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNyZWF0ZVZpZXcobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDcmVhdGVWaWV3Tm9kZScsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5uYW1lLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHRlbXBvcmFyeTogbm9kZS50ZW1wb3JhcnksXG4gICAgICAgICAgICBvclJlcGxhY2U6IG5vZGUub3JSZXBsYWNlLFxuICAgICAgICAgICAgaWZOb3RFeGlzdHM6IG5vZGUuaWZOb3RFeGlzdHMsXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgY29sdW1uczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmNvbHVtbnMsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYXM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmFzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgY29uY3VycmVudGx5OiBub2RlLmNvbmN1cnJlbnRseSxcbiAgICAgICAgICAgIHdpdGhOb0RhdGE6IG5vZGUud2l0aE5vRGF0YSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BWaWV3KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgICAgICBtYXRlcmlhbGl6ZWQ6IG5vZGUubWF0ZXJpYWxpemVkLFxuICAgICAgICAgICAgY2FzY2FkZTogbm9kZS5jYXNjYWRlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtR2VuZXJhdGVkKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnR2VuZXJhdGVkTm9kZScsXG4gICAgICAgICAgICBieURlZmF1bHQ6IG5vZGUuYnlEZWZhdWx0LFxuICAgICAgICAgICAgYWx3YXlzOiBub2RlLmFsd2F5cyxcbiAgICAgICAgICAgIGlkZW50aXR5OiBub2RlLmlkZW50aXR5LFxuICAgICAgICAgICAgc3RvcmVkOiBub2RlLnN0b3JlZCxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRGVmYXVsdFZhbHVlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRGVmYXVsdFZhbHVlTm9kZScsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRlZmF1bHRWYWx1ZSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Pbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ09uTm9kZScsXG4gICAgICAgICAgICBvbjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub24sIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2VsZWN0TW9kaWZpZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdTZWxlY3RNb2RpZmllck5vZGUnLFxuICAgICAgICAgICAgbW9kaWZpZXI6IG5vZGUubW9kaWZpZXIsXG4gICAgICAgICAgICByYXdNb2RpZmllcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmF3TW9kaWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb2Y6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5vZiwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1DcmVhdGVUeXBlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBlbnVtOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5lbnVtLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURyb3BUeXBlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm5hbWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgaWZFeGlzdHM6IG5vZGUuaWZFeGlzdHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1FeHBsYWluKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRXhwbGFpbk5vZGUnLFxuICAgICAgICAgICAgZm9ybWF0OiBub2RlLmZvcm1hdCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLm9wdGlvbnMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtU2NoZW1hYmxlSWRlbnRpZmllcihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1NjaGVtYWJsZUlkZW50aWZpZXJOb2RlJyxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuc2NoZW1hLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmlkZW50aWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWdncmVnYXRlRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogbm9kZS5mdW5jLFxuICAgICAgICAgICAgYWdncmVnYXRlZDogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLmFnZ3JlZ2F0ZWQsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGlzdGluY3Q6IG5vZGUuZGlzdGluY3QsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGhpbkdyb3VwOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS53aXRoaW5Hcm91cCwgcXVlcnlJZCksXG4gICAgICAgICAgICBmaWx0ZXI6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmZpbHRlciwgcXVlcnlJZCksXG4gICAgICAgICAgICBvdmVyOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vdmVyLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU92ZXIobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdmVyTm9kZScsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcmRlckJ5LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHBhcnRpdGlvbkJ5OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5wYXJ0aXRpb25CeSwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1QYXJ0aXRpb25CeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5Tm9kZScsXG4gICAgICAgICAgICBpdGVtczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLml0ZW1zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVBhcnRpdGlvbkJ5SXRlbShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1BhcnRpdGlvbkJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgcGFydGl0aW9uQnk6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnBhcnRpdGlvbkJ5LCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUJpbmFyeU9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0JpbmFyeU9wZXJhdGlvbk5vZGUnLFxuICAgICAgICAgICAgbGVmdE9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmxlZnRPcGVyYW5kLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICByaWdodE9wZXJhbmQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJpZ2h0T3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1VbmFyeU9wZXJhdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VuYXJ5T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmF0b3IsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgb3BlcmFuZDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3BlcmFuZCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Vc2luZyhub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ1VzaW5nTm9kZScsXG4gICAgICAgICAgICB0YWJsZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS50YWJsZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogbm9kZS5mdW5jLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuYXJndW1lbnRzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUNhc2Uobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXNlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUudmFsdWUsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgd2hlbjogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLndoZW4sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZWxzZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuZWxzZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBpc1N0YXRlbWVudDogbm9kZS5pc1N0YXRlbWVudCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVdoZW4obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdXaGVuTm9kZScsXG4gICAgICAgICAgICBjb25kaXRpb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmNvbmRpdGlvbiwgcXVlcnlJZCksXG4gICAgICAgICAgICByZXN1bHQ6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnJlc3VsdCwgcXVlcnlJZCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1KU09OUmVmZXJlbmNlKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTlJlZmVyZW5jZU5vZGUnLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yZWZlcmVuY2UsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdHJhdmVyc2FsOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50cmF2ZXJzYWwsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtSlNPTlBhdGgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdKU09OUGF0aE5vZGUnLFxuICAgICAgICAgICAgaW5PcGVyYXRvcjogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUuaW5PcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICBwYXRoTGVnczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLnBhdGhMZWdzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05QYXRoTGVnKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTGVnTm9kZScsXG4gICAgICAgICAgICB0eXBlOiBub2RlLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZTogbm9kZS52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUpTT05PcGVyYXRvckNoYWluKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5vcGVyYXRvciwgcXVlcnlJZCksXG4gICAgICAgICAgICB2YWx1ZXM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS52YWx1ZXMsIHF1ZXJ5SWQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtVHVwbGUobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUdXBsZU5vZGUnLFxuICAgICAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUudmFsdWVzLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1lcmdlUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdNZXJnZVF1ZXJ5Tm9kZScsXG4gICAgICAgICAgICBpbnRvOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5pbnRvLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHVzaW5nOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS51c2luZywgcXVlcnlJZCksXG4gICAgICAgICAgICB3aGVuczogdGhpcy50cmFuc2Zvcm1Ob2RlTGlzdChub2RlLndoZW5zLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHdpdGg6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLndpdGgsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgdG9wOiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS50b3AsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZW5kTW9kaWZpZXJzOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuZW5kTW9kaWZpZXJzLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIG91dHB1dDogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUub3V0cHV0LCBxdWVyeUlkKSxcbiAgICAgICAgICAgIHJldHVybmluZzogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUucmV0dXJuaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybU1hdGNoZWQobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnTWF0Y2hlZE5vZGUnLFxuICAgICAgICAgICAgbm90OiBub2RlLm5vdCxcbiAgICAgICAgICAgIGJ5U291cmNlOiBub2RlLmJ5U291cmNlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQWRkSW5kZXgobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50cmFuc2Zvcm1Ob2RlKG5vZGUubmFtZSwgcXVlcnlJZCksXG4gICAgICAgICAgICBjb2x1bW5zOiB0aGlzLnRyYW5zZm9ybU5vZGVMaXN0KG5vZGUuY29sdW1ucywgcXVlcnlJZCksXG4gICAgICAgICAgICB1bmlxdWU6IG5vZGUudW5pcXVlLFxuICAgICAgICAgICAgdXNpbmc6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLnVzaW5nLCBxdWVyeUlkKSxcbiAgICAgICAgICAgIGlmTm90RXhpc3RzOiBub2RlLmlmTm90RXhpc3RzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ2FzdChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlQWxsUHJvcHMoe1xuICAgICAgICAgICAga2luZDogJ0Nhc3ROb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmV4cHJlc3Npb24sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMudHJhbnNmb3JtTm9kZShub2RlLmRhdGFUeXBlLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybUZldGNoKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmVBbGxQcm9wcyh7XG4gICAgICAgICAgICBraW5kOiAnRmV0Y2hOb2RlJyxcbiAgICAgICAgICAgIHJvd0NvdW50OiB0aGlzLnRyYW5zZm9ybU5vZGUobm9kZS5yb3dDb3VudCwgcXVlcnlJZCksXG4gICAgICAgICAgICBtb2RpZmllcjogbm9kZS5tb2RpZmllcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVRvcChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdUb3BOb2RlJyxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IG5vZGUuZXhwcmVzc2lvbixcbiAgICAgICAgICAgIG1vZGlmaWVyczogbm9kZS5tb2RpZmllcnMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PdXRwdXQobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZUFsbFByb3BzKHtcbiAgICAgICAgICAgIGtpbmQ6ICdPdXRwdXROb2RlJyxcbiAgICAgICAgICAgIHNlbGVjdGlvbnM6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZS5zZWxlY3Rpb25zLCBxdWVyeUlkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybURhdGFUeXBlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVNlbGVjdEFsbChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1JZGVudGlmaWVyKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlKG5vZGUsIF9xdWVyeUlkKSB7XG4gICAgICAgIC8vIEFuIE9iamVjdC5mcmVlemVkIGxlYWYgbm9kZS4gTm8gbmVlZCB0byBjbG9uZS5cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHRyYW5zZm9ybVByaW1pdGl2ZVZhbHVlTGlzdChub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1PcGVyYXRvcihub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1EZWZhdWx0SW5zZXJ0VmFsdWUobm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtT3JBY3Rpb24obm9kZSwgX3F1ZXJ5SWQpIHtcbiAgICAgICAgLy8gQW4gT2JqZWN0LmZyZWV6ZWQgbGVhZiBub2RlLiBObyBuZWVkIHRvIGNsb25lLlxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgdHJhbnNmb3JtQ29sbGF0ZShub2RlLCBfcXVlcnlJZCkge1xuICAgICAgICAvLyBBbiBPYmplY3QuZnJlZXplZCBsZWFmIG5vZGUuIE5vIG5lZWQgdG8gY2xvbmUuXG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vd2l0aC1zY2hlbWEtdHJhbnNmb3JtZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IExpc3ROb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvbGlzdC1ub2RlLmpzJztcbmltcG9ydCB7IE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBUYWJsZU5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS90YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uLy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8vIFRoaXMgb2JqZWN0IGV4aXN0IG9ubHkgc28gdGhhdCB3ZSBnZXQgYSB0eXBlIGVycm9yIHdoZW4gYSBuZXcgUm9vdE9wZXJhdGlvbk5vZGVcbi8vIGlzIGFkZGVkLiBJZiB5b3UgZ2V0IGEgdHlwZSBlcnJvciBoZXJlLCBtYWtlIHN1cmUgdG8gYWRkIHRoZSBuZXcgcm9vdCBub2RlIGFuZFxuLy8gaGFuZGxlIGl0IGNvcnJlY3RseSBpbiB0aGUgdHJhbnNmb3JtZXIuXG4vL1xuLy8gRE8gTk9UIFJFRkFDVE9SIFRISVMgRVZFTiBJRiBJVCBTRUVNUyBVU0VMRVNTIFRPIFlPVSFcbmNvbnN0IFJPT1RfT1BFUkFUSU9OX05PREVTID0gZnJlZXplKHtcbiAgICBBbHRlclRhYmxlTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVJbmRleE5vZGU6IHRydWUsXG4gICAgQ3JlYXRlU2NoZW1hTm9kZTogdHJ1ZSxcbiAgICBDcmVhdGVUYWJsZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVHlwZU5vZGU6IHRydWUsXG4gICAgQ3JlYXRlVmlld05vZGU6IHRydWUsXG4gICAgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlOiB0cnVlLFxuICAgIERlbGV0ZVF1ZXJ5Tm9kZTogdHJ1ZSxcbiAgICBEcm9wSW5kZXhOb2RlOiB0cnVlLFxuICAgIERyb3BTY2hlbWFOb2RlOiB0cnVlLFxuICAgIERyb3BUYWJsZU5vZGU6IHRydWUsXG4gICAgRHJvcFR5cGVOb2RlOiB0cnVlLFxuICAgIERyb3BWaWV3Tm9kZTogdHJ1ZSxcbiAgICBJbnNlcnRRdWVyeU5vZGU6IHRydWUsXG4gICAgUmF3Tm9kZTogdHJ1ZSxcbiAgICBTZWxlY3RRdWVyeU5vZGU6IHRydWUsXG4gICAgVXBkYXRlUXVlcnlOb2RlOiB0cnVlLFxuICAgIE1lcmdlUXVlcnlOb2RlOiB0cnVlLFxufSk7XG5jb25zdCBTQ0hFTUFMRVNTX0ZVTkNUSU9OUyA9IHtcbiAgICBqc29uX2FnZzogdHJ1ZSxcbiAgICB0b19qc29uOiB0cnVlLFxufTtcbmV4cG9ydCBjbGFzcyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICAgICNzY2hlbWE7XG4gICAgI3NjaGVtYWJsZUlkcyA9IG5ldyBTZXQoKTtcbiAgICAjY3RlcyA9IG5ldyBTZXQoKTtcbiAgICBjb25zdHJ1Y3RvcihzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy4jc2NoZW1hID0gc2NoZW1hO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGlmICghdGhpcy4jaXNSb290T3BlcmF0aW9uTm9kZShub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRyYW5zZm9ybU5vZGVJbXBsKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN0ZXMgPSB0aGlzLiNjb2xsZWN0Q1RFcyhub2RlKTtcbiAgICAgICAgZm9yIChjb25zdCBjdGUgb2YgY3Rlcykge1xuICAgICAgICAgICAgdGhpcy4jY3Rlcy5hZGQoY3RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWJsZXMgPSB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzKG5vZGUpO1xuICAgICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgICAgICAgdGhpcy4jc2NoZW1hYmxlSWRzLmFkZCh0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1Ob2RlSW1wbChub2RlLCBxdWVyeUlkKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiB0YWJsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI3NjaGVtYWJsZUlkcy5kZWxldGUodGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY3RlIG9mIGN0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuI2N0ZXMuZGVsZXRlKGN0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyKG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzdXBlci50cmFuc2Zvcm1TY2hlbWFibGVJZGVudGlmaWVyKG5vZGUsIHF1ZXJ5SWQpO1xuICAgICAgICBpZiAodHJhbnNmb3JtZWQuc2NoZW1hIHx8ICF0aGlzLiNzY2hlbWFibGVJZHMuaGFzKG5vZGUuaWRlbnRpZmllci5uYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50cmFuc2Zvcm1lZCxcbiAgICAgICAgICAgIHNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI3NjaGVtYSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIHRyYW5zZm9ybVJlZmVyZW5jZXMobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZCA9IHN1cGVyLnRyYW5zZm9ybVJlZmVyZW5jZXMobm9kZSwgcXVlcnlJZCk7XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZC50YWJsZS50YWJsZS5zY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJhbnNmb3JtZWQsXG4gICAgICAgICAgICB0YWJsZTogVGFibGVOb2RlLmNyZWF0ZVdpdGhTY2hlbWEodGhpcy4jc2NoZW1hLCB0cmFuc2Zvcm1lZC50YWJsZS50YWJsZS5pZGVudGlmaWVyLm5hbWUpLFxuICAgICAgICB9O1xuICAgIH1cbiAgICB0cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbihub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdXBlci50cmFuc2Zvcm1BZ2dyZWdhdGVGdW5jdGlvbih7IC4uLm5vZGUsIGFnZ3JlZ2F0ZWQ6IFtdIH0sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYWdncmVnYXRlZDogdGhpcy4jdHJhbnNmb3JtVGFibGVBcmdzV2l0aG91dFNjaGVtYXMobm9kZSwgcXVlcnlJZCwgJ2FnZ3JlZ2F0ZWQnKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdHJhbnNmb3JtRnVuY3Rpb24obm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3VwZXIudHJhbnNmb3JtRnVuY3Rpb24oeyAuLi5ub2RlLCBhcmd1bWVudHM6IFtdIH0sIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgYXJndW1lbnRzOiB0aGlzLiN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyhub2RlLCBxdWVyeUlkLCAnYXJndW1lbnRzJyksXG4gICAgICAgIH07XG4gICAgfVxuICAgICN0cmFuc2Zvcm1UYWJsZUFyZ3NXaXRob3V0U2NoZW1hcyhub2RlLCBxdWVyeUlkLCBhcmdzS2V5KSB7XG4gICAgICAgIHJldHVybiBTQ0hFTUFMRVNTX0ZVTkNUSU9OU1tub2RlLmZ1bmNdXG4gICAgICAgICAgICA/IG5vZGVbYXJnc0tleV0ubWFwKChhcmcpID0+ICFUYWJsZU5vZGUuaXMoYXJnKSB8fCBhcmcudGFibGUuc2NoZW1hXG4gICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zZm9ybU5vZGUoYXJnLCBxdWVyeUlkKVxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAuLi5hcmcsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0aGlzLnRyYW5zZm9ybUlkZW50aWZpZXIoYXJnLnRhYmxlLmlkZW50aWZpZXIsIHF1ZXJ5SWQpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNmb3JtTm9kZUxpc3Qobm9kZVthcmdzS2V5XSwgcXVlcnlJZCk7XG4gICAgfVxuICAgICNpc1Jvb3RPcGVyYXRpb25Ob2RlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCBpbiBST09UX09QRVJBVElPTl9OT0RFUztcbiAgICB9XG4gICAgI2NvbGxlY3RTY2hlbWFibGVJZHMobm9kZSkge1xuICAgICAgICBjb25zdCBzY2hlbWFibGVJZHMgPSBuZXcgU2V0KCk7XG4gICAgICAgIGlmICgnbmFtZScgaW4gbm9kZSAmJiBub2RlLm5hbWUgJiYgU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuaXMobm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUubmFtZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2Zyb20nIGluIG5vZGUgJiYgbm9kZS5mcm9tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZyb20gb2Ygbm9kZS5mcm9tLmZyb21zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIoZnJvbSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoJ2ludG8nIGluIG5vZGUgJiYgbm9kZS5pbnRvKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLmludG8sIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCd0YWJsZScgaW4gbm9kZSAmJiBub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgnam9pbnMnIGluIG5vZGUgJiYgbm9kZS5qb2lucykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBqb2luIG9mIG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihqb2luLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICgndXNpbmcnIGluIG5vZGUgJiYgbm9kZS51c2luZykge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkc0Zyb21UYWJsZUV4cHIobm9kZS51c2luZywgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2NoZW1hYmxlSWRzO1xuICAgIH1cbiAgICAjY29sbGVjdENURXMobm9kZSkge1xuICAgICAgICBjb25zdCBjdGVzID0gbmV3IFNldCgpO1xuICAgICAgICBpZiAoJ3dpdGgnIGluIG5vZGUgJiYgbm9kZS53aXRoKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0Q1RFSWRzKG5vZGUud2l0aCwgY3Rlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN0ZXM7XG4gICAgfVxuICAgICNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcihub2RlLCBzY2hlbWFibGVJZHMpIHtcbiAgICAgICAgaWYgKFRhYmxlTm9kZS5pcyhub2RlKSkge1xuICAgICAgICAgICAgdGhpcy4jY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUudGFibGUsIHNjaGVtYWJsZUlkcyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQWxpYXNOb2RlLmlzKG5vZGUpICYmIFRhYmxlTm9kZS5pcyhub2RlLm5vZGUpKSB7XG4gICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWQobm9kZS5ub2RlLnRhYmxlLCBzY2hlbWFibGVJZHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKExpc3ROb2RlLmlzKG5vZGUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIG5vZGUuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNjb2xsZWN0U2NoZW1hYmxlSWRzRnJvbVRhYmxlRXhwcih0YWJsZSwgc2NoZW1hYmxlSWRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAjY29sbGVjdFNjaGVtYWJsZUlkKG5vZGUsIHNjaGVtYWJsZUlkcykge1xuICAgICAgICBjb25zdCBpZCA9IG5vZGUuaWRlbnRpZmllci5uYW1lO1xuICAgICAgICBpZiAoIXRoaXMuI3NjaGVtYWJsZUlkcy5oYXMoaWQpICYmICF0aGlzLiNjdGVzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHNjaGVtYWJsZUlkcy5hZGQoaWQpO1xuICAgICAgICB9XG4gICAgfVxuICAgICNjb2xsZWN0Q1RFSWRzKG5vZGUsIGN0ZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBleHByIG9mIG5vZGUuZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0ZUlkID0gZXhwci5uYW1lLnRhYmxlLnRhYmxlLmlkZW50aWZpZXIubmFtZTtcbiAgICAgICAgICAgIGlmICghdGhpcy4jY3Rlcy5oYXMoY3RlSWQpKSB7XG4gICAgICAgICAgICAgICAgY3Rlcy5hZGQoY3RlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi93aXRoLXNjaGVtYS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBXaXRoU2NoZW1hVHJhbnNmb3JtZXIgfSBmcm9tICcuL3dpdGgtc2NoZW1hLXRyYW5zZm9ybWVyLmpzJztcbmV4cG9ydCBjbGFzcyBXaXRoU2NoZW1hUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXI7XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHRoaXMuI3RyYW5zZm9ybWVyID0gbmV3IFdpdGhTY2hlbWFUcmFuc2Zvcm1lcihzY2hlbWEpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0cmFuc2Zvcm1lci50cmFuc2Zvcm1Ob2RlKGFyZ3Mubm9kZSwgYXJncy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtUmVzdWx0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3MucmVzdWx0O1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWF0Y2hlZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IE1hdGNoZWROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdNYXRjaGVkTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobm90LCBieVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01hdGNoZWROb2RlJyxcbiAgICAgICAgICAgIG5vdCxcbiAgICAgICAgICAgIGJ5U291cmNlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL21lcmdlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IE1hdGNoZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWF0Y2hlZC1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgUmF3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3Jhdy1ub2RlLmpzJztcbmltcG9ydCB7IFdoZW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvd2hlbi1ub2RlLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VGaWx0ZXJMaXN0LCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4vYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVyZ2VXaGVuKHR5cGUsIGFyZ3MsIHJlZlJpZ2h0KSB7XG4gICAgcmV0dXJuIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZUZpbHRlckxpc3QoW1xuICAgICAgICBNYXRjaGVkTm9kZS5jcmVhdGUoIXR5cGUuaXNNYXRjaGVkLCB0eXBlLmJ5U291cmNlKSxcbiAgICAgICAgLi4uKGFyZ3MgJiYgYXJncy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICBhcmdzLmxlbmd0aCA9PT0gMyAmJiByZWZSaWdodFxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXSksXG4gICAgXSwgJ2FuZCcsIGZhbHNlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXJnZVRoZW4ocmVzdWx0KSB7XG4gICAgaWYgKGlzU3RyaW5nKHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIFJhd05vZGUuY3JlYXRlKFtyZXN1bHRdLCBbXSk7XG4gICAgfVxuICAgIGlmIChpc09wZXJhdGlvbk5vZGVTb3VyY2UocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0LnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZlcnJlZC5kLnRzXCIgLz5cbmV4cG9ydCBjbGFzcyBEZWZlcnJlZCB7XG4gICAgI3Byb21pc2U7XG4gICAgI3Jlc29sdmU7XG4gICAgI3JlamVjdDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy4jcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgICAgIHRoaXMuI3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IHByb21pc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9taXNlO1xuICAgIH1cbiAgICByZXNvbHZlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNyZXNvbHZlKSB7XG4gICAgICAgICAgICB0aGlzLiNyZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmVqZWN0ID0gKHJlYXNvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy4jcmVqZWN0KSB7XG4gICAgICAgICAgICB0aGlzLiNyZWplY3QocmVhc29uKTtcbiAgICAgICAgfVxuICAgIH07XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmQudHNcIiAvPlxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL2RlZmVycmVkLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24oY29ubmVjdGlvblByb3ZpZGVyKSB7XG4gICAgY29uc3QgY29ubmVjdGlvbkRlZmVyID0gbmV3IERlZmVycmVkKCk7XG4gICAgY29uc3QgY29ubmVjdGlvblJlbGVhc2VEZWZlciA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIGNvbm5lY3Rpb25Qcm92aWRlclxuICAgICAgICAucHJvdmlkZUNvbm5lY3Rpb24oYXN5bmMgKGNvbm5lY3Rpb24pID0+IHtcbiAgICAgICAgY29ubmVjdGlvbkRlZmVyLnJlc29sdmUoY29ubmVjdGlvbik7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnByb21pc2U7XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKChleCkgPT4gY29ubmVjdGlvbkRlZmVyLnJlamVjdChleCkpO1xuICAgIC8vIENyZWF0ZSBjb21wb3NpdGUgb2YgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZSByZWxlYXNlIG1ldGhvZCBpbnN0ZWFkIG9mXG4gICAgLy8gbW9kaWZ5aW5nIHRoZSBjb25uZWN0aW9uIG9yIGNyZWF0aW5nIGEgbmV3IG5lc3RpbmcgYERhdGFiYXNlQ29ubmVjdGlvbmAuXG4gICAgLy8gVGhpcyB3YXkgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IG92ZXJyaWRlIGFueSBtZXRob2RzIG9mIDNyZCBwYXJ0eVxuICAgIC8vIGNvbm5lY3Rpb25zIGFuZCBkb24ndCByZXR1cm4gd3JhcHBlZCBjb25uZWN0aW9ucyB0byBkcml2ZXJzIHRoYXRcbiAgICAvLyBleHBlY3QgYSBjZXJ0YWluIHNwZWNpZmljIGNvbm5lY3Rpb24gY2xhc3MuXG4gICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgIGNvbm5lY3Rpb246IGF3YWl0IGNvbm5lY3Rpb25EZWZlci5wcm9taXNlLFxuICAgICAgICByZWxlYXNlOiBjb25uZWN0aW9uUmVsZWFzZURlZmVyLnJlc29sdmUsXG4gICAgfSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3F1ZXJ5LWV4ZWN1dG9yLWJhc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24gfSBmcm9tICcuLi91dGlsL3Byb3ZpZGUtY29udHJvbGxlZC1jb25uZWN0aW9uLmpzJztcbmltcG9ydCB7IGxvZ09uY2UgfSBmcm9tICcuLi91dGlsL2xvZy1vbmNlLmpzJztcbmNvbnN0IE5PX1BMVUdJTlMgPSBmcmVlemUoW10pO1xuZXhwb3J0IGNsYXNzIFF1ZXJ5RXhlY3V0b3JCYXNlIHtcbiAgICAjcGx1Z2lucztcbiAgICBjb25zdHJ1Y3RvcihwbHVnaW5zID0gTk9fUExVR0lOUykge1xuICAgICAgICB0aGlzLiNwbHVnaW5zID0gcGx1Z2lucztcbiAgICB9XG4gICAgZ2V0IHBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwbHVnaW5zO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1RdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuI3BsdWdpbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkTm9kZSA9IHBsdWdpbi50cmFuc2Zvcm1RdWVyeSh7IG5vZGUsIHF1ZXJ5SWQgfSk7XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRvIGEgcnVudGltZSBjaGVjayBoZXJlLiBUaGVyZSBpcyBubyBnb29kIHdheVxuICAgICAgICAgICAgLy8gdG8gd3JpdGUgdHlwZXMgdGhhdCBlbmZvcmNlIHRoaXMgY29uc3RyYWludC5cbiAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lZE5vZGUua2luZCA9PT0gbm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHRyYW5zZm9ybWVkTm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihbXG4gICAgICAgICAgICAgICAgICAgIGBLeXNlbHlQbHVnaW4udHJhbnNmb3JtUXVlcnkgbXVzdCByZXR1cm4gYSBub2RlYCxcbiAgICAgICAgICAgICAgICAgICAgYG9mIHRoZSBzYW1lIGtpbmQgdGhhdCB3YXMgZ2l2ZW4gdG8gaXQuYCxcbiAgICAgICAgICAgICAgICAgICAgYFRoZSBwbHVnaW4gd2FzIGdpdmVuIGEgJHtub2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICAgICAgYGJ1dCBpdCByZXR1cm5lZCBhICR7dHJhbnNmb3JtZWROb2RlLmtpbmR9YCxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJyAnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5KTtcbiAgICAgICAgICAgIGlmICgnbnVtVXBkYXRlZE9yRGVsZXRlZFJvd3MnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxvZ09uY2UoJ2t5c2VseTp3YXJuaW5nOiBvdXRkYXRlZCBkcml2ZXIvcGx1Z2luIGRldGVjdGVkISBgUXVlcnlSZXN1bHQubnVtVXBkYXRlZE9yRGVsZXRlZFJvd3NgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYFF1ZXJ5UmVzdWx0Lm51bUFmZmVjdGVkUm93c2AuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jdHJhbnNmb3JtUmVzdWx0KHJlc3VsdCwgcXVlcnlJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyAqc3RyZWFtKGNvbXBpbGVkUXVlcnksIGNodW5rU2l6ZSwgcXVlcnlJZCkge1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIHJlbGVhc2UgfSA9IGF3YWl0IHByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbih0aGlzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIGNvbm5lY3Rpb24uc3RyZWFtUXVlcnkoY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGF3YWl0IHRoaXMuI3RyYW5zZm9ybVJlc3VsdChyZXN1bHQsIHF1ZXJ5SWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jICN0cmFuc2Zvcm1SZXN1bHQocmVzdWx0LCBxdWVyeUlkKSB7XG4gICAgICAgIGZvciAoY29uc3QgcGx1Z2luIG9mIHRoaXMuI3BsdWdpbnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHBsdWdpbi50cmFuc2Zvcm1SZXN1bHQoeyByZXN1bHQsIHF1ZXJ5SWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL25vb3AtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG4vKipcbiAqIEEge0BsaW5rIFF1ZXJ5RXhlY3V0b3J9IHN1YmNsYXNzIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiB5b3UgZG9uJ3RcbiAqIGhhdmUgYSB7QGxpbmsgUXVlcnlDb21waWxlcn0sIHtAbGluayBDb25uZWN0aW9uUHJvdmlkZXJ9IG9yIGFueVxuICogb3RoZXIgbmVlZGVkIHRoaW5ncyB0byBhY3R1YWxseSBleGVjdXRlIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb29wUXVlcnlFeGVjdXRvciBleHRlbmRzIFF1ZXJ5RXhlY3V0b3JCYXNlIHtcbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBjb21waWxlZCB0byBTUUwnKTtcbiAgICB9XG4gICAgY29tcGlsZVF1ZXJ5KCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGJlIGNvbXBpbGVkIHRvIFNRTCcpO1xuICAgIH1cbiAgICBwcm92aWRlQ29ubmVjdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGlzIHF1ZXJ5IGNhbm5vdCBiZSBleGVjdXRlZCcpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgcXVlcnkgY2Fubm90IGhhdmUgYSBjb25uZWN0aW9uIHByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoWy4uLnRoaXMucGx1Z2lucywgcGx1Z2luXSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW5zKHBsdWdpbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbLi4udGhpcy5wbHVnaW5zLCAuLi5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhQbHVnaW5BdEZyb250KHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vb3BRdWVyeUV4ZWN1dG9yKFtwbHVnaW4sIC4uLnRoaXMucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb29wUXVlcnlFeGVjdXRvcihbXSk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IE5PT1BfUVVFUllfRVhFQ1VUT1IgPSBuZXcgTm9vcFF1ZXJ5RXhlY3V0b3IoKTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vbWVyZ2UtcmVzdWx0LmQudHNcIiAvPlxuZXhwb3J0IGNsYXNzIE1lcmdlUmVzdWx0IHtcbiAgICBudW1DaGFuZ2VkUm93cztcbiAgICBjb25zdHJ1Y3RvcihudW1DaGFuZ2VkUm93cykge1xuICAgICAgICB0aGlzLm51bUNoYW5nZWRSb3dzID0gbnVtQ2hhbmdlZFJvd3M7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tZXJnZS1xdWVyeS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgTWVyZ2VRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9tZXJnZS1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdXBkYXRlLXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VJbnNlcnRFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9pbnNlcnQtdmFsdWVzLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUpvaW4sIH0gZnJvbSAnLi4vcGFyc2VyL2pvaW4tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlTWVyZ2VUaGVuLCBwYXJzZU1lcmdlV2hlbiB9IGZyb20gJy4uL3BhcnNlci9tZXJnZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBbGwsIHBhcnNlU2VsZWN0QXJnLCB9IGZyb20gJy4uL3BhcnNlci9zZWxlY3QtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVG9wIH0gZnJvbSAnLi4vcGFyc2VyL3RvcC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgTWVyZ2VSZXN1bHQgfSBmcm9tICcuL21lcmdlLXJlc3VsdC5qcyc7XG5pbXBvcnQgeyBOb1Jlc3VsdEVycm9yLCBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3VwZGF0ZS1xdWVyeS1idWlsZGVyLmpzJztcbmV4cG9ydCBjbGFzcyBNZXJnZVF1ZXJ5QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7IHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLm1vZGlmeUVuZChzcWwucmF3KCctLSB0aGlzIGlzIGEgY29tbWVudCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiIHVzaW5nIFwicGV0XCIgb24gXCJwZXRcIi5cIm93bmVyX2lkXCIgPSBcInBlcnNvblwiLlwiaWRcIiB3aGVuIG1hdGNoZWQgdGhlbiBkZWxldGUgLS0gdGhpcyBpcyBhIGNvbW1lbnRcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgbW9kaWZpZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlcyBhIGBtZXJnZSBpbnRvYCBxdWVyeSB0byBhbiBgbWVyZ2UgdG9wIGludG9gIHF1ZXJ5LlxuICAgICAqXG4gICAgICogYHRvcGAgY2xhdXNlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBBZmZlY3QgNSBtYXRjaGVkIHJvd3MgYXQgbW9zdDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnRvcCg1KVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE1TIFNRTCBTZXJ2ZXIpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgdG9wKDUpIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkZWxldGVcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEFmZmVjdCA1MCUgb2YgbWF0Y2hlZCByb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudG9wKDUwLCAncGVyY2VudCcpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVMgU1FMIFNlcnZlcik6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSB0b3AoNTApIHBlcmNlbnQgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFRvcCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhVc2luZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlSm9pbignVXNpbmcnLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5pbmcoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGJcbiAgICAgKiAgIC5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAubW9kaWZ5RW5kKHNxbC5yYXcoJy0tIHRoaXMgaXMgYSBjb21tZW50JykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCIgdXNpbmcgXCJwZXRcIiBvbiBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiIHdoZW4gbWF0Y2hlZCB0aGVuIGRlbGV0ZSAtLSB0aGlzIGlzIGEgY29tbWVudFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUVuZChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIE1lcmdlUXVlcnlCdWlsZGVyLnRvcH0uXG4gICAgICovXG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoVG9wKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VUb3AoZXhwcmVzc2lvbiwgbW9kaWZpZXJzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBGb3IgYSBgd2hlbiBtYXRjaGVkYCBjbGF1c2Ugd2l0aCBhbiBgYW5kYCBjb25kaXRpb24sIHNlZSB7QGxpbmsgd2hlbk1hdGNoZWRBbmR9LlxuICAgICAqXG4gICAgICogRm9yIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkYCBjbGF1c2UsIHNlZSB7QGxpbmsgd2hlbk5vdE1hdGNoZWR9LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbiwgc2VlIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdoZW5NYXRjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk1hdGNoZWQoW10pO1xuICAgIH1cbiAgICB3aGVuTWF0Y2hlZEFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTWF0Y2hlZChhcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHRvIHRoZSBxdWVyeSB3aXRoIGFuIGBhbmRgIGNvbmRpdGlvbi4gQnV0IHVubGlrZVxuICAgICAqIHtAbGluayB3aGVuTWF0Y2hlZEFuZH0sIHRoaXMgbWV0aG9kIGFjY2VwdHMgYSBjb2x1bW4gcmVmZXJlbmNlIGFzIHRoZSAzcmQgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIud2hlcmVSZWZ9LCBzbyBzZWUgdGhlIGRvY3VtZW50YXRpb25cbiAgICAgKiBmb3IgdGhhdCBtZXRob2QgZm9yIG1vcmUgZXhhbXBsZXMuXG4gICAgICovXG4gICAgd2hlbk1hdGNoZWRBbmRSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTWF0Y2hlZChbbGhzLCBvcCwgcmhzXSwgdHJ1ZSk7XG4gICAgfVxuICAgICN3aGVuTWF0Y2hlZChhcmdzLCByZWZSaWdodCkge1xuICAgICAgICByZXR1cm4gbmV3IE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBNZXJnZVF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VNZXJnZVdoZW4oeyBpc01hdGNoZWQ6IHRydWUgfSwgYXJncywgcmVmUmlnaHQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBzaW1wbGUgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBGb3IgYSBgd2hlbiBub3QgbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5Ob3RNYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqIEZvciBhIHNpbXBsZSBgd2hlbiBtYXRjaGVkYCBjbGF1c2UsIHNlZSB7QGxpbmsgd2hlbk1hdGNoZWR9LlxuICAgICAqXG4gICAgICogRm9yIGEgYHdoZW4gbWF0Y2hlZGAgY2xhdXNlIHdpdGggYW4gYGFuZGAgY29uZGl0aW9uLCBzZWUge0BsaW5rIHdoZW5NYXRjaGVkQW5kfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTm90TWF0Y2hlZCgpXG4gICAgICogICAudGhlbkluc2VydFZhbHVlcyh7XG4gICAgICogICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnRG9lJyxcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG5vdCBtYXRjaGVkIHRoZW5cbiAgICAgKiAgIGluc2VydCAoXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIpIHZhbHVlcyAoJDEsICQyKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW10pO1xuICAgIH1cbiAgICB3aGVuTm90TWF0Y2hlZEFuZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN3aGVuTm90TWF0Y2hlZChhcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYHdoZW4gbm90IG1hdGNoZWRgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uIEJ1dCB1bmxpa2VcbiAgICAgKiB7QGxpbmsgd2hlbk5vdE1hdGNoZWRBbmR9LCB0aGlzIG1ldGhvZCBhY2NlcHRzIGEgY29sdW1uIHJlZmVyZW5jZSBhcyB0aGUgM3JkIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogVW5saWtlIHtAbGluayB3aGVuTWF0Y2hlZEFuZFJlZn0sIHlvdSBjYW5ub3QgcmVmZXJlbmNlIGNvbHVtbnMgZnJvbSB0aGUgdGFyZ2V0IHRhYmxlLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB7QGxpbmsgU2VsZWN0UXVlcnlCdWlsZGVyLndoZXJlUmVmfSwgc28gc2VlIHRoZSBkb2N1bWVudGF0aW9uXG4gICAgICogZm9yIHRoYXQgbWV0aG9kIGZvciBtb3JlIGV4YW1wbGVzLlxuICAgICAqL1xuICAgIHdoZW5Ob3RNYXRjaGVkQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgc2ltcGxlIGB3aGVuIG5vdCBtYXRjaGVkIGJ5IHNvdXJjZWAgY2xhdXNlIHRvIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFN1cHBvcnRlZCBpbiBNUyBTUUwgU2VydmVyLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byB7QGxpbmsgd2hlbk5vdE1hdGNoZWR9LCBidXQgcmV0dXJucyBhIHtAbGluayBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcn0uXG4gICAgICovXG4gICAgd2hlbk5vdE1hdGNoZWRCeVNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3doZW5Ob3RNYXRjaGVkKFtdLCBmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuICAgIHdoZW5Ob3RNYXRjaGVkQnlTb3VyY2VBbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoYXJncywgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBgd2hlbiBub3QgbWF0Y2hlZCBieSBzb3VyY2VgIGNsYXVzZSB0byB0aGUgcXVlcnkgd2l0aCBhbiBgYW5kYCBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayB3aGVuTm90TWF0Y2hlZEFuZFJlZn0sIGJ1dCB5b3UgY2FuIHJlZmVyZW5jZSBjb2x1bW5zIGZyb21cbiAgICAgKiB0aGUgdGFyZ2V0IHRhYmxlLCBhbmQgbm90IGZyb20gc291cmNlIHRhYmxlIGFuZCByZXR1cm5zIGEge0BsaW5rIE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyfS5cbiAgICAgKi9cbiAgICB3aGVuTm90TWF0Y2hlZEJ5U291cmNlQW5kUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gdGhpcy4jd2hlbk5vdE1hdGNoZWQoW2xocywgb3AsIHJoc10sIHRydWUsIHRydWUpO1xuICAgIH1cbiAgICByZXR1cm5pbmcoYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoUmV0dXJuaW5nKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuaW5nQWxsKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2hlbmVhYmxlTWVyZ2VRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhSZXR1cm5pbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb3V0cHV0KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aE91dHB1dCh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QXJnKGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG91dHB1dEFsbCh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3V0cHV0KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBbGwodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICN3aGVuTm90TWF0Y2hlZChhcmdzLCByZWZSaWdodCA9IGZhbHNlLCBieVNvdXJjZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IE1lcmdlUXVlcnlOb2RlLmNsb25lV2l0aFdoZW4odGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZU1lcmdlV2hlbih7IGlzTWF0Y2hlZDogZmFsc2UsIGJ5U291cmNlIH0sIGFyZ3MsIHJlZlJpZ2h0KSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IEJ1aWxkZXIgPSBieVNvdXJjZVxuICAgICAgICAgICAgPyBNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlclxuICAgICAgICAgICAgOiBOb3RNYXRjaGVkVGhlbmFibGVNZXJnZVF1ZXJ5QnVpbGRlcjtcbiAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgY2FsbCBhIG1ldGhvZCBvbiBgdGhpc2AsIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgJGlmfSBtZXRob2QuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIFRoZSBuZXh0IGV4YW1wbGUgdXNlcyBhIGhlbHBlciBmdW5jdGlvbiBgbG9nYCB0byBsb2cgYSBxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBDb21waWxhYmxlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogZnVuY3Rpb24gbG9nPFQgZXh0ZW5kcyBDb21waWxhYmxlPihxYjogVCk6IFQge1xuICAgICAqICAgY29uc29sZS5sb2cocWIuY29tcGlsZSgpKVxuICAgICAqICAgcmV0dXJuIHFiXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXdhaXQgZGIudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuc2V0KHsgZmlyc3RfbmFtZTogJ0pvaG4nIH0pXG4gICAgICogICAuJGNhbGwobG9nKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGwgYGZ1bmModGhpcylgIGlmIGBjb25kaXRpb25gIGlzIHRydWUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlc3BlY2lhbGx5IGhhbmR5IHdpdGggb3B0aW9uYWwgc2VsZWN0cy4gQW55IGByZXR1cm5pbmdgIG9yIGByZXR1cm5pbmdBbGxgXG4gICAgICogbWV0aG9kIGNhbGxzIGFkZCBjb2x1bW5zIGFzIG9wdGlvbmFsIGZpZWxkcyB0byB0aGUgb3V0cHV0IHR5cGUgd2hlbiBjYWxsZWQgaW5zaWRlXG4gICAgICogdGhlIGBmdW5jYCBjYWxsYmFjay4gVGhpcyBpcyBiZWNhdXNlIHdlIGNhbid0IGtub3cgaWYgdGhvc2Ugc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5XG4gICAgICogbWFkZSBiZWZvcmUgcnVubmluZyB0aGUgY29kZS5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyBjYWxsIGFueSBvdGhlciBtZXRob2RzIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBQZXJzb25VcGRhdGUgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gdXBkYXRlUGVyc29uKGlkOiBudW1iZXIsIHVwZGF0ZXM6IFBlcnNvblVwZGF0ZSwgcmV0dXJuTGFzdE5hbWU6IGJvb2xlYW4pIHtcbiAgICAgKiAgIHJldHVybiBhd2FpdCBkYlxuICAgICAqICAgICAudXBkYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAgIC5zZXQodXBkYXRlcylcbiAgICAgKiAgICAgLndoZXJlKCdpZCcsICc9JywgaWQpXG4gICAgICogICAgIC5yZXR1cm5pbmcoWydpZCcsICdmaXJzdF9uYW1lJ10pXG4gICAgICogICAgIC4kaWYocmV0dXJuTGFzdE5hbWUsIChxYikgPT4gcWIucmV0dXJuaW5nKCdsYXN0X25hbWUnKSlcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbnkgc2VsZWN0aW9ucyBhZGRlZCBpbnNpZGUgdGhlIGBpZmAgY2FsbGJhY2sgd2lsbCBiZSBhZGRlZCBhcyBvcHRpb25hbCBmaWVsZHMgdG8gdGhlXG4gICAgICogb3V0cHV0IHR5cGUgc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiB0aGUgc2VsZWN0aW9ucyB3ZXJlIGFjdHVhbGx5IG1hZGUgYmVmb3JlIHJ1bm5pbmdcbiAgICAgKiB0aGUgY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgdXBkYXRlUGVyc29uYCBmdW5jdGlvbiBpczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogUHJvbWlzZTx7XG4gICAgICogICBpZDogbnVtYmVyXG4gICAgICogICBmaXJzdF9uYW1lOiBzdHJpbmdcbiAgICAgKiAgIGxhc3RfbmFtZT86IHN0cmluZ1xuICAgICAqIH0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgJGlmKGNvbmRpdGlvbiwgZnVuYykge1xuICAgICAgICBpZiAoY29uZGl0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdoZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMucXVlcnlOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHJvd3MuXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB0aGUge0BsaW5rIGV4ZWN1dGVUYWtlRmlyc3R9IGFuZCB7QGxpbmsgZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3d9IG1ldGhvZHMuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgICAgIGNvbnN0IHsgYWRhcHRlciB9ID0gdGhpcy4jcHJvcHMuZXhlY3V0b3I7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gY29tcGlsZWRRdWVyeS5xdWVyeTtcbiAgICAgICAgaWYgKChxdWVyeS5yZXR1cm5pbmcgJiYgYWRhcHRlci5zdXBwb3J0c1JldHVybmluZykgfHxcbiAgICAgICAgICAgIChxdWVyeS5vdXRwdXQgJiYgYWRhcHRlci5zdXBwb3J0c091dHB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucm93cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25ldyBNZXJnZVJlc3VsdChyZXN1bHQubnVtQWZmZWN0ZWRSb3dzKV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHRoZSBxdWVyeSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgcmVzdWx0IG9yIHVuZGVmaW5lZCBpZlxuICAgICAqIHRoZSBxdWVyeSByZXR1cm5lZCBubyByZXN1bHQuXG4gICAgICovXG4gICAgYXN5bmMgZXhlY3V0ZVRha2VGaXJzdCgpIHtcbiAgICAgICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgb3IgdGhyb3dzIGlmXG4gICAgICogdGhlIHF1ZXJ5IHJldHVybmVkIG5vIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEJ5IGRlZmF1bHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE5vUmVzdWx0RXJyb3J9IGlzIHRocm93biwgYnV0IHlvdSBjYW5cbiAgICAgKiBwcm92aWRlIGEgY3VzdG9tIGVycm9yIGNsYXNzLCBvciBjYWxsYmFjayBhcyB0aGUgb25seSBhcmd1bWVudCB0byB0aHJvdyBhIGRpZmZlcmVudFxuICAgICAqIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgTWF0Y2hlZFRoZW5hYmxlTWVyZ2VRdWVyeUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIHRoZSBgZGVsZXRlYCBhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgZG8gbm90aGluZ2AgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5Eb05vdGhpbmd9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYHVwZGF0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5VcGRhdGV9IG9yIHtAbGluayB0aGVuVXBkYXRlU2V0fS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlbkRlbGV0ZSgpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgZGVsZXRlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRlbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkZWxldGUnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3VwcG9ydGVkIGluIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgZGVsZXRlYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkRlbGV0ZX0uXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgdXBkYXRlYCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlblVwZGF0ZX0gb3Ige0BsaW5rIHRoZW5VcGRhdGVTZXR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiLm1lcmdlSW50bygncGVyc29uJylcbiAgICAgKiAgIC51c2luZygncGV0JywgJ3BlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLndoZW5NYXRjaGVkKClcbiAgICAgKiAgIC50aGVuRG9Ob3RoaW5nKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJwZXJzb25cIlxuICAgICAqIHVzaW5nIFwicGV0XCIgb24gXCJwZXJzb25cIi5cImlkXCIgPSBcInBldFwiLlwib3duZXJfaWRcIlxuICAgICAqIHdoZW4gbWF0Y2hlZCB0aGVuXG4gICAgICogICBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRvTm90aGluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkbyBub3RoaW5nJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGVyZm9ybSBhbiBgdXBkYXRlYCBvcGVyYXRpb24gd2l0aCBhIGZ1bGwtZmxlZGdlZCB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyfS5cbiAgICAgKiBUaGlzIGlzIGhhbmR5IHdoZW4gbXVsdGlwbGUgYHNldGAgaW52b2NhdGlvbnMgYXJlIG5lZWRlZC5cbiAgICAgKlxuICAgICAqIEZvciBhIHNob3J0aGFuZCB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLCBzZWUge0BsaW5rIHRoZW5VcGRhdGVTZXR9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRlbGV0ZWAgYWN0aW9uLCBzZWUge0BsaW5rIHRoZW5EZWxldGV9LlxuICAgICAqXG4gICAgICogVG8gcGVyZm9ybSB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbiwgc2VlIHtAbGluayB0aGVuRG9Ob3RoaW5nfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYi5tZXJnZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudXNpbmcoJ3BldCcsICdwZXJzb24uaWQnLCAncGV0Lm93bmVyX2lkJylcbiAgICAgKiAgIC53aGVuTWF0Y2hlZCgpXG4gICAgICogICAudGhlblVwZGF0ZSgodWIpID0+IHViXG4gICAgICogICAgIC5zZXQoc3FsYG1ldGFkYXRhWydoYXNfcGV0cyddYCwgJ1knKVxuICAgICAqICAgICAuc2V0KHtcbiAgICAgKiAgICAgICB1cGRhdGVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICogICAgIH0pXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBtZXJnZSBpbnRvIFwicGVyc29uXCJcbiAgICAgKiB1c2luZyBcInBldFwiIG9uIFwicGVyc29uXCIuXCJpZFwiID0gXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgdGhlblxuICAgICAqICAgdXBkYXRlIHNldCBtZXRhZGF0YVsnaGFzX3BldHMnXSA9ICQxLCBcInVwZGF0ZWRfYXRcIiA9ICQyXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlblVwZGF0ZShzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKHNldChuZXcgVXBkYXRlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBxdWVyeUlkOiB0aGlzLiNwcm9wcy5xdWVyeUlkLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yOiBOT09QX1FVRVJZX0VYRUNVVE9SLFxuICAgICAgICAgICAgICAgIHF1ZXJ5Tm9kZTogVXBkYXRlUXVlcnlOb2RlLmNyZWF0ZVdpdGhvdXRUYWJsZSgpLFxuICAgICAgICAgICAgfSkpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aGVuVXBkYXRlU2V0KC4uLmFyZ3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBub3Qgc3VyZSBob3cgdG8gdHlwZSB0aGlzIHNvIGl0IHdvbid0IGNvbXBsYWluIGFib3V0IHNldCguLi5hcmdzKS5cbiAgICAgICAgcmV0dXJuIHRoaXMudGhlblVwZGF0ZSgodWIpID0+IHViLnNldCguLi5hcmdzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE5vdE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyB0aGUgYGRvIG5vdGhpbmdgIGFjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgc3VwcG9ydGVkIGluIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBUbyBwZXJmb3JtIHRoZSBgaW5zZXJ0YCBhY3Rpb24sIHNlZSB7QGxpbmsgdGhlbkluc2VydFZhbHVlc30uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGIubWVyZ2VJbnRvKCdwZXJzb24nKVxuICAgICAqICAgLnVzaW5nKCdwZXQnLCAncGVyc29uLmlkJywgJ3BldC5vd25lcl9pZCcpXG4gICAgICogICAud2hlbk5vdE1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5Eb05vdGhpbmcoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIiBvbiBcInBlcnNvblwiLlwiaWRcIiA9IFwicGV0XCIuXCJvd25lcl9pZFwiXG4gICAgICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuXG4gICAgICogICBkbyBub3RoaW5nXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdGhlbkRvTm90aGluZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKCdkbyBub3RoaW5nJykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhlbkluc2VydFZhbHVlcyhpbnNlcnQpIHtcbiAgICAgICAgY29uc3QgW2NvbHVtbnMsIHZhbHVlc10gPSBwYXJzZUluc2VydEV4cHJlc3Npb24oaW5zZXJ0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlTWVyZ2VUaGVuKEluc2VydFF1ZXJ5Tm9kZS5jbG9uZVdpdGgoSW5zZXJ0UXVlcnlOb2RlLmNyZWF0ZVdpdGhvdXRJbnRvKCksIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICAgIH0pKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcXVlcnktY3JlYXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvc2VsZWN0LXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2luc2VydC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERlbGV0ZVF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9kZWxldGUtcXVlcnktYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBVcGRhdGVRdWVyeUJ1aWxkZXIgfSBmcm9tICcuL3F1ZXJ5LWJ1aWxkZXIvdXBkYXRlLXF1ZXJ5LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRGVsZXRlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9kZWxldGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBJbnNlcnRRdWVyeU5vZGUgfSBmcm9tICcuL29wZXJhdGlvbi1ub2RlL2luc2VydC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgVXBkYXRlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS91cGRhdGUtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlLCBwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCwgcGFyc2VBbGlhc2VkVGFibGUsIH0gZnJvbSAnLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uLCB9IGZyb20gJy4vcGFyc2VyL3dpdGgtcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS93aXRoLW5vZGUuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW4vd2l0aC1zY2hlbWEvd2l0aC1zY2hlbWEtcGx1Z2luLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBcmcsIH0gZnJvbSAnLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBNZXJnZVF1ZXJ5QnVpbGRlciB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9tZXJnZS1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi9vcGVyYXRpb24tbm9kZS9tZXJnZS1xdWVyeS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBRdWVyeUNyZWF0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgc2VsZWN0YCBxdWVyeSBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gdGFibGUgb3IgdGFibGVzLlxuICAgICAqXG4gICAgICogVGhlIHRhYmxlcyBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYXJlIGJ1aWx0IGFzIHRoZSBxdWVyeSdzIGBmcm9tYCBjbGF1c2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIHNlbGVjdCBxdWVyeSBmb3Igb25lIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZm9yIG9uZSB0YWJsZSB3aXRoIGFuIGFsaWFzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBwZXJzb25zID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uIGFzIHAnKVxuICAgICAqICAgLnNlbGVjdChbJ3AuaWQnLCAnZmlyc3RfbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocGVyc29uc1swXS5pZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcInBcIi5cImlkXCIsIFwiZmlyc3RfbmFtZVwiIGZyb20gXCJwZXJzb25cIiBhcyBcInBcIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgc2VsZWN0IHF1ZXJ5IGZyb20gYSBzdWJxdWVyeTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcGVyc29ucyA9IGF3YWl0IGRiLnNlbGVjdEZyb20oXG4gICAgICogICAgIChlYikgPT4gZWIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KCdwZXJzb24uaWQgYXMgaWRlbnRpZmllcicpLmFzKCdwJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5zZWxlY3QoJ3AuaWRlbnRpZmllcicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhwZXJzb25zWzBdLmlkZW50aWZpZXIpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJpZGVudGlmaWVyXCIsXG4gICAgICogZnJvbSAoXG4gICAgICogICBzZWxlY3QgXCJwZXJzb25cIi5cImlkXCIgYXMgXCJpZGVudGlmaWVyXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogKSBhcyBwXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzZWxlY3QgcXVlcnkgZnJvbSByYXcgc3FsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGl0ZW1zID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKHNxbDx7IG9uZTogbnVtYmVyIH0+YChzZWxlY3QgMSBhcyBvbmUpYC5hcygncScpKVxuICAgICAqICAgLnNlbGVjdCgncS5vbmUnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coaXRlbXNbMF0ub25lKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwicVwiLlwib25lXCIsXG4gICAgICogZnJvbSAoXG4gICAgICogICBzZWxlY3QgMSBhcyBvbmVcbiAgICAgKiApIGFzIHFcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFdoZW4geW91IHVzZSB0aGUgYHNxbGAgdGFnIHlvdSBuZWVkIHRvIGFsc28gcHJvdmlkZSB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlXG4gICAgICogcmF3IHNuaXBwZXQgLyBxdWVyeSBzbyB0aGF0IEt5c2VseSBjYW4gZmlndXJlIG91dCB3aGF0IGNvbHVtbnMgYXJlXG4gICAgICogYXZhaWxhYmxlIGZvciB0aGUgcmVzdCBvZiB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiBUaGUgYHNlbGVjdEZyb21gIG1ldGhvZCBhbHNvIGFjY2VwdHMgYW4gYXJyYXkgZm9yIG11bHRpcGxlIHRhYmxlcy4gQWxsXG4gICAgICogdGhlIGFib3ZlIGV4YW1wbGVzIGNhbiBhbHNvIGJlIHVzZWQgaW4gYW4gYXJyYXkuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogY29uc3QgaXRlbXMgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKFtcbiAgICAgKiAgICAgJ3BlcnNvbiBhcyBwJyxcbiAgICAgKiAgICAgZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0KCdwZXQuc3BlY2llcycpLmFzKCdhJyksXG4gICAgICogICAgIHNxbDx7IG9uZTogbnVtYmVyIH0+YChzZWxlY3QgMSBhcyBvbmUpYC5hcygncScpXG4gICAgICogICBdKVxuICAgICAqICAgLnNlbGVjdChbJ3AuaWQnLCAnYS5zcGVjaWVzJywgJ3Eub25lJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuaWQsIFwiYVwiLlwic3BlY2llc1wiLCBcInFcIi5cIm9uZVwiXG4gICAgICogZnJvbVxuICAgICAqICAgXCJwZXJzb25cIiBhcyBcInBcIixcbiAgICAgKiAgIChzZWxlY3QgXCJwZXRcIi5cInNwZWNpZXNcIiBmcm9tIFwicGV0XCIpIGFzIGEsXG4gICAgICogICAoc2VsZWN0IDEgYXMgb25lKSBhcyBcInFcIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHNlbGVjdEZyb20oZnJvbSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbGVjdE5vRnJvbShzZWxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKFNlbGVjdFF1ZXJ5Tm9kZS5jcmVhdGUodGhpcy4jcHJvcHMud2l0aE5vZGUpLCBwYXJzZVNlbGVjdEFyZyhzZWxlY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiB7QGxpbmsgSW5zZXJ0UmVzdWx0fVxuICAgICAqIGhhcyB0aGUge0BsaW5rIEluc2VydFJlc3VsdC5pbnNlcnRJZCB8IGluc2VydElkfSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIGlkIG9mXG4gICAgICogdGhlIGluc2VydGVkIHJvdyBpZiB0aGUgZGIgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLnZhbHVlcyB8IHZhbHVlc30gbWV0aG9kIGZvciBtb3JlIGluZm8gYW5kIGV4YW1wbGVzLiBBbHNvIHNlZVxuICAgICAqIHRoZSB7QGxpbmsgUmV0dXJuaW5nSW50ZXJmYWNlLnJldHVybmluZyB8IHJldHVybmluZ30gbWV0aG9kIGZvciBhIHdheSB0byByZXR1cm4gY29sdW1uc1xuICAgICAqIG9uIHN1cHBvcnRlZCBkYXRhYmFzZXMgbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5pbnNlcnRJZClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNvbWUgZGF0YWJhc2VzIGxpa2UgUG9zdGdyZVNRTCBzdXBwb3J0IHRoZSBgcmV0dXJuaW5nYCBtZXRob2Q6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgaWQgfSA9IGF3YWl0IGRiXG4gICAgICogICAuaW5zZXJ0SW50bygncGVyc29uJylcbiAgICAgKiAgIC52YWx1ZXMoe1xuICAgICAqICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICBsYXN0X25hbWU6ICdBbmlzdG9uJ1xuICAgICAqICAgfSlcbiAgICAgKiAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaW5zZXJ0SW50byh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IEluc2VydFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IEluc2VydFF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBcInJlcGxhY2UgaW50b1wiIHF1ZXJ5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzb21lIGRpYWxlY3RzIGxpa2UgTXlTUUwgb3IgU1FMaXRlLlxuICAgICAqXG4gICAgICogU2ltaWxhciB0byBNeVNRTCdzIHtAbGluayBJbnNlcnRRdWVyeUJ1aWxkZXIub25EdXBsaWNhdGVLZXlVcGRhdGV9IHRoYXQgZGVsZXRlc1xuICAgICAqIGFuZCBpbnNlcnRzIHZhbHVlcyBvbiBjb2xsaXNpb24gaW5zdGVhZCBvZiB1cGRhdGluZyBleGlzdGluZyByb3dzLlxuICAgICAqXG4gICAgICogQW4gYWxpYXMgb2YgU1FMaXRlJ3Mge0BsaW5rIEluc2VydFF1ZXJ5QnVpbGRlci5vclJlcGxhY2V9LlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbnNlcnRSZXN1bHR9LiB7QGxpbmsgSW5zZXJ0UmVzdWx0fVxuICAgICAqIGhhcyB0aGUge0BsaW5rIEluc2VydFJlc3VsdC5pbnNlcnRJZCB8IGluc2VydElkfSBmaWVsZCB0aGF0IGhvbGRzIHRoZSBhdXRvIGluY3JlbWVudGVkIGlkIG9mXG4gICAgICogdGhlIGluc2VydGVkIHJvdyBpZiB0aGUgZGIgcmV0dXJuZWQgb25lLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgSW5zZXJ0UXVlcnlCdWlsZGVyLnZhbHVlcyB8IHZhbHVlc30gbWV0aG9kIGZvciBtb3JlIGluZm8gYW5kIGV4YW1wbGVzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAucmVwbGFjZUludG8oJ3BlcnNvbicpXG4gICAgICogICAudmFsdWVzKHtcbiAgICAgKiAgICAgZmlyc3RfbmFtZTogJ0plbm5pZmVyJyxcbiAgICAgKiAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbidcbiAgICAgKiAgIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lmluc2VydElkKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHJlcGxhY2UgaW50byBgcGVyc29uYCAoYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCkgdmFsdWVzICg/LCA/KVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlcGxhY2VJbnRvKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSW5zZXJ0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogSW5zZXJ0UXVlcnlOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUsIHRydWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIERlbGV0ZVF1ZXJ5QnVpbGRlci53aGVyZX0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG8gc3BlY2lmeVxuICAgICAqIGEgd2hlcmUgY2xhdXNlIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBEZWxldGVSZXN1bHR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiZGVsZXRlXCIsIFwiU2luZ2xlIHJvd1wiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBEZWxldGUgYSBzaW5nbGUgcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oJ3BlcnNvbicpXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1EZWxldGVkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGRlbGV0ZSBmcm9tIFwicGVyc29uXCIgd2hlcmUgXCJwZXJzb25cIi5cImlkXCIgPSAkMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogU29tZSBkYXRhYmFzZXMgc3VjaCBhcyBNeVNRTCBzdXBwb3J0IGRlbGV0aW5nIGZyb20gbXVsdGlwbGUgdGFibGVzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLmRlbGV0ZUZyb20oWydwZXJzb24nLCAncGV0J10pXG4gICAgICogICAudXNpbmcoJ3BlcnNvbicpXG4gICAgICogICAuaW5uZXJKb2luKCdwZXQnLCAncGV0Lm93bmVyX2lkJywgJ3BlcnNvbi5pZCcpXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBkZWxldGUgZnJvbSBgcGVyc29uYCwgYHBldGBcbiAgICAgKiB1c2luZyBgcGVyc29uYFxuICAgICAqIGlubmVyIGpvaW4gYHBldGAgb24gYHBldGAuYG93bmVyX2lkYCA9IGBwZXJzb25gLmBpZGBcbiAgICAgKiB3aGVyZSBgcGVyc29uYC5gaWRgID0gP1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRlbGV0ZUZyb20oZnJvbSkge1xuICAgICAgICByZXR1cm4gbmV3IERlbGV0ZVF1ZXJ5QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3IsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IERlbGV0ZVF1ZXJ5Tm9kZS5jcmVhdGUocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoZnJvbSksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gdXBkYXRlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyLndoZXJlfSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBzcGVjaWZ5XG4gICAgICogYSB3aGVyZSBjbGF1c2UgZm9yIHRoZSB1cGRhdGUgb3BlcmF0aW9uLlxuICAgICAqXG4gICAgICogU2VlIHRoZSB7QGxpbmsgVXBkYXRlUXVlcnlCdWlsZGVyLnNldH0gbWV0aG9kIGZvciBleGFtcGxlcyBvbiBob3cgdG9cbiAgICAgKiBzcGVjaWZ5IHRoZSB1cGRhdGVzLlxuICAgICAqXG4gICAgICogVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgcXVlcnkgaXMgYW4ge0BsaW5rIFVwZGF0ZVJlc3VsdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC51cGRhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5zZXQoeyBmaXJzdF9uYW1lOiAnSmVubmlmZXInIH0pXG4gICAgICogICAud2hlcmUoJ3BlcnNvbi5pZCcsICc9JywgMSlcbiAgICAgKiAgIC5leGVjdXRlVGFrZUZpcnN0KClcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHJlc3VsdC5udW1VcGRhdGVkUm93cylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB1cGRhdGVUYWJsZSh0YWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVcGRhdGVRdWVyeUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBVcGRhdGVRdWVyeU5vZGUuY3JlYXRlKHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0KHRhYmxlcyksIHRoaXMuI3Byb3BzLndpdGhOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtZXJnZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHF1ZXJ5IGlzIGEge0BsaW5rIE1lcmdlUmVzdWx0fS5cbiAgICAgKlxuICAgICAqIFNlZSB0aGUge0BsaW5rIE1lcmdlUXVlcnlCdWlsZGVyLnVzaW5nfSBtZXRob2QgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBzcGVjaWZ5XG4gICAgICogdGhlIG90aGVyIHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwibWVyZ2VcIiwgXCJTb3VyY2Ugcm93IGV4aXN0ZW5jZVwiLCAxMCkgLS0+XG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSB0YXJnZXQgY29sdW1uIGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgYSBzb3VyY2Ugcm93OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygncGVyc29uIGFzIHRhcmdldCcpXG4gICAgICogICAudXNpbmcoJ3BldCBhcyBzb3VyY2UnLCAnc291cmNlLm93bmVyX2lkJywgJ3RhcmdldC5pZCcpXG4gICAgICogICAud2hlbk1hdGNoZWRBbmQoJ3RhcmdldC5oYXNfcGV0cycsICchPScsICdZJylcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KHsgaGFzX3BldHM6ICdZJyB9KVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkQnlTb3VyY2VBbmQoJ3RhcmdldC5oYXNfcGV0cycsICc9JywgJ1knKVxuICAgICAqICAgLnRoZW5VcGRhdGVTZXQoeyBoYXNfcGV0czogJ04nIH0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cocmVzdWx0Lm51bUNoYW5nZWRSb3dzKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogbWVyZ2UgaW50byBcInBlcnNvblwiXG4gICAgICogdXNpbmcgXCJwZXRcIlxuICAgICAqIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAgICAgKiB3aGVuIG1hdGNoZWQgYW5kIFwiaGFzX3BldHNcIiAhPSAkMVxuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcImhhc19wZXRzXCIgPSAkMlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgYnkgc291cmNlIGFuZCBcImhhc19wZXRzXCIgPSAkM1xuICAgICAqIHRoZW4gdXBkYXRlIHNldCBcImhhc19wZXRzXCIgPSAkNFxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcIm1lcmdlXCIsIFwiVGVtcG9yYXJ5IGNoYW5nZXMgdGFibGVcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogTWVyZ2UgbmV3IGVudHJpZXMgZnJvbSBhIHRlbXBvcmFyeSBjaGFuZ2VzIHRhYmxlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLm1lcmdlSW50bygnd2luZSBhcyB0YXJnZXQnKVxuICAgICAqICAgLnVzaW5nKFxuICAgICAqICAgICAnd2luZV9zdG9ja19jaGFuZ2UgYXMgc291cmNlJyxcbiAgICAgKiAgICAgJ3NvdXJjZS53aW5lX25hbWUnLFxuICAgICAqICAgICAndGFyZ2V0Lm5hbWUnLFxuICAgICAqICAgKVxuICAgICAqICAgLndoZW5Ob3RNYXRjaGVkQW5kKCdzb3VyY2Uuc3RvY2tfZGVsdGEnLCAnPicsIDApXG4gICAgICogICAudGhlbkluc2VydFZhbHVlcygoeyByZWYgfSkgPT4gKHtcbiAgICAgKiAgICAgbmFtZTogcmVmKCdzb3VyY2Uud2luZV9uYW1lJyksXG4gICAgICogICAgIHN0b2NrOiByZWYoJ3NvdXJjZS5zdG9ja19kZWx0YScpLFxuICAgICAqICAgfSkpXG4gICAgICogICAud2hlbk1hdGNoZWRBbmQoXG4gICAgICogICAgIChlYikgPT4gZWIoJ3RhcmdldC5zdG9jaycsICcrJywgZWIucmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSksXG4gICAgICogICAgICc+JyxcbiAgICAgKiAgICAgMCxcbiAgICAgKiAgIClcbiAgICAgKiAgIC50aGVuVXBkYXRlU2V0KCdzdG9jaycsIChlYikgPT5cbiAgICAgKiAgICAgZWIoJ3RhcmdldC5zdG9jaycsICcrJywgZWIucmVmKCdzb3VyY2Uuc3RvY2tfZGVsdGEnKSksXG4gICAgICogICApXG4gICAgICogICAud2hlbk1hdGNoZWQoKVxuICAgICAqICAgLnRoZW5EZWxldGUoKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIG1lcmdlIGludG8gXCJ3aW5lXCIgYXMgXCJ0YXJnZXRcIlxuICAgICAqIHVzaW5nIFwid2luZV9zdG9ja19jaGFuZ2VcIiBhcyBcInNvdXJjZVwiXG4gICAgICogb24gXCJzb3VyY2VcIi5cIndpbmVfbmFtZVwiID0gXCJ0YXJnZXRcIi5cIm5hbWVcIlxuICAgICAqIHdoZW4gbm90IG1hdGNoZWQgYW5kIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiID4gJDFcbiAgICAgKiB0aGVuIGluc2VydCAoXCJuYW1lXCIsIFwic3RvY2tcIikgdmFsdWVzIChcInNvdXJjZVwiLlwid2luZV9uYW1lXCIsIFwic291cmNlXCIuXCJzdG9ja19kZWx0YVwiKVxuICAgICAqIHdoZW4gbWF0Y2hlZCBhbmQgXCJ0YXJnZXRcIi5cInN0b2NrXCIgKyBcInNvdXJjZVwiLlwic3RvY2tfZGVsdGFcIiA+ICQyXG4gICAgICogdGhlbiB1cGRhdGUgc2V0IFwic3RvY2tcIiA9IFwidGFyZ2V0XCIuXCJzdG9ja1wiICsgXCJzb3VyY2VcIi5cInN0b2NrX2RlbHRhXCJcbiAgICAgKiB3aGVuIG1hdGNoZWRcbiAgICAgKiB0aGVuIGRlbGV0ZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1lcmdlSW50byh0YXJnZXRUYWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IE1lcmdlUXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvcixcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogTWVyZ2VRdWVyeU5vZGUuY3JlYXRlKHBhcnNlQWxpYXNlZFRhYmxlKHRhcmdldFRhYmxlKSwgdGhpcy4jcHJvcHMud2l0aE5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGB3aXRoYCBxdWVyeSAoQ29tbW9uIFRhYmxlIEV4cHJlc3Npb24pLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwiY3RlXCIsIFwiU2ltcGxlIHNlbGVjdHNcIiwgMTApIC0tPlxuICAgICAqXG4gICAgICogQ29tbW9uIHRhYmxlIGV4cHJlc3Npb25zIChDVEUpIGFyZSBhIGdyZWF0IHdheSB0byBtb2R1bGFyaXplIGNvbXBsZXggcXVlcmllcy5cbiAgICAgKiBFc3NlbnRpYWxseSB0aGV5IGFsbG93IHlvdSB0byBydW4gbXVsdGlwbGUgc2VwYXJhdGUgcXVlcmllcyB3aXRoaW4gYVxuICAgICAqIHNpbmdsZSByb3VuZHRyaXAgdG8gdGhlIERCLlxuICAgICAqXG4gICAgICogU2luY2UgQ1RFcyBhcmUgYSBwYXJ0IG9mIHRoZSBtYWluIHF1ZXJ5LCBxdWVyeSBvcHRpbWl6ZXJzIGluc2lkZSBEQlxuICAgICAqIGVuZ2luZXMgYXJlIGFibGUgdG8gb3B0aW1pemUgdGhlIG92ZXJhbGwgcXVlcnkuIEZvciBleGFtcGxlLCBwb3N0Z3Jlc1xuICAgICAqIGlzIGFibGUgdG8gaW5saW5lIHRoZSBDVEVzIGluc2lkZSB0aGUgdXNpbmcgcXVlcmllcyBpZiBpdCBkZWNpZGVzIGl0J3NcbiAgICAgKiBmYXN0ZXIuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAvLyBDcmVhdGUgYSBDVEUgY2FsbGVkIGBqZW5uaWZlcnNgIHRoYXQgc2VsZWN0cyBhbGxcbiAgICAgKiAgIC8vIHBlcnNvbnMgbmFtZWQgJ0plbm5pZmVyJy5cbiAgICAgKiAgIC53aXRoKCdqZW5uaWZlcnMnLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC8vIFNlbGVjdCBhbGwgcm93cyBmcm9tIHRoZSBgamVubmlmZXJzYCBDVEUgYW5kXG4gICAgICogICAvLyBmdXJ0aGVyIGZpbHRlciBpdC5cbiAgICAgKiAgIC53aXRoKCdhZHVsdF9qZW5uaWZlcnMnLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdqZW5uaWZlcnMnKVxuICAgICAqICAgICAud2hlcmUoJ2FnZScsICc+JywgMTgpXG4gICAgICogICAgIC5zZWxlY3QoWydpZCcsICdhZ2UnXSlcbiAgICAgKiAgIClcbiAgICAgKiAgIC8vIEZpbmFsbHkgc2VsZWN0IGFsbCBhZHVsdCBqZW5uaWZlcnMgdGhhdCBhcmVcbiAgICAgKiAgIC8vIGFsc28geW91bmdlciB0aGFuIDYwLlxuICAgICAqICAgLnNlbGVjdEZyb20oJ2FkdWx0X2plbm5pZmVycycpXG4gICAgICogICAud2hlcmUoJ2FnZScsICc8JywgNjApXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJjdGVcIiwgXCJJbnNlcnRzLCB1cGRhdGVzIGFuZCBkZWxldGlvbnNcIiwgMjApIC0tPlxuICAgICAqXG4gICAgICogU29tZSBkYXRhYmFzZXMgbGlrZSBwb3N0Z3JlcyBhbHNvIGFsbG93IHlvdSB0byBydW4gb3RoZXIgcXVlcmllcyB0aGFuIHNlbGVjdHNcbiAgICAgKiBpbiBDVEVzLiBPbiB0aGVzZSBkYXRhYmFzZXMgQ1RFcyBhcmUgZXh0cmVtZWx5IHBvd2VyZnVsOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoJ25ld19wZXJzb24nLCAoZGIpID0+IGRiXG4gICAgICogICAgIC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGFnZTogMzUsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC53aXRoKCduZXdfcGV0JywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgbmFtZTogJ0RvZ2dvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnZG9nJyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogdHJ1ZSxcbiAgICAgKiAgICAgICAvLyBVc2UgdGhlIGlkIG9mIHRoZSBwZXJzb24gd2UganVzdCBpbnNlcnRlZC5cbiAgICAgKiAgICAgICBvd25lcl9pZDogZGJcbiAgICAgKiAgICAgICAgIC5zZWxlY3RGcm9tKCduZXdfcGVyc29uJylcbiAgICAgKiAgICAgICAgIC5zZWxlY3QoJ2lkJylcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oWyduZXdfcGVyc29uJywgJ25ld19wZXQnXSlcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICAnbmV3X3BlcnNvbi5pZCBhcyBwZXJzb25faWQnLFxuICAgICAqICAgICAnbmV3X3BldC5pZCBhcyBwZXRfaWQnXG4gICAgICogICBdKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIENURSBuYW1lIGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgY29sdW1uIG5hbWVzIGluIGFkZGl0aW9uIHRvXG4gICAgICogYSBuYW1lLiBJbiB0aGF0IGNhc2UgS3lzZWx5IHJlcXVpcmVzIHRoZSBleHByZXNzaW9uIHRvIHJldHVuXG4gICAgICogcm93cyB3aXRoIHRoZSBzYW1lIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiXG4gICAgICogICAud2l0aCgnamVubmlmZXJzKGlkLCBhZ2UpJywgKGRiKSA9PiBkYlxuICAgICAqICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgLndoZXJlKCdmaXJzdF9uYW1lJywgJz0nLCAnSmVubmlmZXInKVxuICAgICAqICAgICAvLyBUaGlzIGlzIG9rIHNpbmNlIHdlIHJldHVybiBjb2x1bW5zIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgLy8gbmFtZXMgYXMgc3BlY2lmaWVkIGJ5IGBqZW5uaWZlcnMoaWQsIGFnZSlgLlxuICAgICAqICAgICAuc2VsZWN0KFsnaWQnLCAnYWdlJ10pXG4gICAgICogICApXG4gICAgICogICAuc2VsZWN0RnJvbSgnamVubmlmZXJzJylcbiAgICAgKiAgIC5zZWxlY3RBbGwoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IGFyZ3VtZW50IGNhbiBhbHNvIGJlIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBwYXNzZWRcbiAgICAgKiBhIGBDVEVCdWlsZGVyYCBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgQ1RFOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGgoXG4gICAgICogICAgIChjdGUpID0+IGN0ZSgnamVubmlmZXJzJykubWF0ZXJpYWxpemVkKCksXG4gICAgICogICAgIChkYikgPT4gZGJcbiAgICAgKiAgICAgICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgICAgICAud2hlcmUoJ2ZpcnN0X25hbWUnLCAnPScsICdKZW5uaWZlcicpXG4gICAgICogICAgICAgLnNlbGVjdChbJ2lkJywgJ2FnZSddKVxuICAgICAqICAgKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ2plbm5pZmVycycpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgY29uc3QgY3RlID0gcGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb24obmFtZU9yQnVpbGRlciwgZXhwcmVzc2lvbik7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnlDcmVhdG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgd2l0aE5vZGU6IHRoaXMuI3Byb3BzLndpdGhOb2RlXG4gICAgICAgICAgICAgICAgPyBXaXRoTm9kZS5jbG9uZVdpdGhFeHByZXNzaW9uKHRoaXMuI3Byb3BzLndpdGhOb2RlLCBjdGUpXG4gICAgICAgICAgICAgICAgOiBXaXRoTm9kZS5jcmVhdGUoY3RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZWN1cnNpdmUgYHdpdGhgIHF1ZXJ5IChDb21tb24gVGFibGUgRXhwcmVzc2lvbikuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgcmVjdXJzaXZlbmVzcyBpcyBhIHByb3BlcnR5IG9mIHRoZSB3aG9sZSBgd2l0aGAgc3RhdGVtZW50LlxuICAgICAqIFlvdSBjYW5ub3QgaGF2ZSByZWN1cnNpdmUgYW5kIG5vbi1yZWN1cnNpdmUgQ1RFcyBpbiBhIHNhbWUgYHdpdGhgIHN0YXRlbWVudC5cbiAgICAgKiBUaGVyZWZvcmUgdGhlIHJlY3Vyc2l2ZW5lc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgKipmaXJzdCoqIGB3aXRoYCBvclxuICAgICAqIGB3aXRoUmVjdXNpdmVgIGNhbGwgeW91IG1ha2UuXG4gICAgICpcbiAgICAgKiBTZWUgdGhlIHtAbGluayB3aXRofSBtZXRob2QgZm9yIGV4YW1wbGVzIGFuZCBtb3JlIGRvY3VtZW50YXRpb24uXG4gICAgICovXG4gICAgd2l0aFJlY3Vyc2l2ZShuYW1lT3JCdWlsZGVyLCBleHByZXNzaW9uKSB7XG4gICAgICAgIGNvbnN0IGN0ZSA9IHBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uKG5hbWVPckJ1aWxkZXIsIGV4cHJlc3Npb24pO1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHdpdGhOb2RlOiB0aGlzLiNwcm9wcy53aXRoTm9kZVxuICAgICAgICAgICAgICAgID8gV2l0aE5vZGUuY2xvbmVXaXRoRXhwcmVzc2lvbih0aGlzLiNwcm9wcy53aXRoTm9kZSwgY3RlKVxuICAgICAgICAgICAgICAgIDogV2l0aE5vZGUuY3JlYXRlKGN0ZSwgeyByZWN1cnNpdmU6IHRydWUgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHF1ZXJ5IGNyZWF0b3IgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5Q3JlYXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHF1ZXJ5IGNyZWF0b3IgaW5zdGFuY2Ugd2l0aG91dCBhbnkgcGx1Z2lucy5cbiAgICAgKi9cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aG91dFBsdWdpbnMoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGZvciBhbGwgdGFibGUgcmVmZXJlbmNlcyB0aGF0IGRvbid0IGV4cGxpY2l0bHlcbiAgICAgKiBzcGVjaWZ5IGEgc2NoZW1hLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IGFmZmVjdHMgdGhlIHF1ZXJ5IGNyZWF0ZWQgdGhyb3VnaCB0aGUgYnVpbGRlciByZXR1cm5lZCBmcm9tXG4gICAgICogdGhpcyBtZXRob2QgYW5kIGRvZXNuJ3QgbW9kaWZ5IHRoZSBgZGJgIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogU2VlIFt0aGlzIHJlY2lwZV0oaHR0cHM6Ly9naXRodWIuY29tL2t5c2VseS1vcmcva3lzZWx5L2Jsb2IvbWFzdGVyL3NpdGUvZG9jcy9yZWNpcGVzLzAwMDctc2NoZW1hcy5tZClcbiAgICAgKiBmb3IgYSBtb3JlIGRldGFpbGVkIGV4cGxhbmF0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGhTY2hlbWEoJ21hbW1hbHMnKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BldCcpXG4gICAgICogICAuc2VsZWN0QWxsKClcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3B1YmxpYy5wZXJzb24nLCAncHVibGljLnBlcnNvbi5pZCcsICdwZXQub3duZXJfaWQnKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0ICogZnJvbSBcIm1hbW1hbHNcIi5cInBldFwiXG4gICAgICogaW5uZXIgam9pbiBcInB1YmxpY1wiLlwicGVyc29uXCJcbiAgICAgKiBvbiBcInB1YmxpY1wiLlwicGVyc29uXCIuXCJpZFwiID0gXCJtYW1tYWxzXCIuXCJwZXRcIi5cIm93bmVyX2lkXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIGB3aXRoU2NoZW1hYCBpcyBzbWFydCBlbm91Z2ggdG8gbm90IGFkZCBzY2hlbWEgZm9yIGFsaWFzZXMsXG4gICAgICogY29tbW9uIHRhYmxlIGV4cHJlc3Npb25zIG9yIG90aGVyIHBsYWNlcyB3aGVyZSB0aGUgc2NoZW1hXG4gICAgICogZG9lc24ndCBiZWxvbmcgdG86XG4gICAgICpcbiAgICAgKiBgYGBcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLndpdGhTY2hlbWEoJ21hbW1hbHMnKVxuICAgICAqICAgLnNlbGVjdEZyb20oJ3BldCBhcyBwJylcbiAgICAgKiAgIC5zZWxlY3QoJ3AubmFtZScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwXCIuXCJuYW1lXCIgZnJvbSBcIm1hbW1hbHNcIi5cInBldFwiIGFzIFwicFwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgd2l0aFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcGFyc2UtdXRpbHMuZC50c1wiIC8+XG5pbXBvcnQgeyBKb2luTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pvaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBPdmVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL292ZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBTZWxlY3RRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBKb2luQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvam9pbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IE92ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9vdmVyLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIGFzIG5ld1NlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Q3JlYXRvciB9IGZyb20gJy4uL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4uL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZUV4cHJlc3Npb24sIHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4vdGFibGUtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWxlY3RRdWVyeUJ1aWxkZXIoKSB7XG4gICAgcmV0dXJuIG5ld1NlbGVjdFF1ZXJ5QnVpbGRlcih7XG4gICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgZXhlY3V0b3I6IE5PT1BfUVVFUllfRVhFQ1VUT1IsXG4gICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNyZWF0ZUZyb20ocGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QoW10pKSxcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVRdWVyeUNyZWF0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeUNyZWF0b3Ioe1xuICAgICAgICBleGVjdXRvcjogTk9PUF9RVUVSWV9FWEVDVVRPUixcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVKb2luQnVpbGRlcihqb2luVHlwZSwgdGFibGUpIHtcbiAgICByZXR1cm4gbmV3IEpvaW5CdWlsZGVyKHtcbiAgICAgICAgam9pbk5vZGU6IEpvaW5Ob2RlLmNyZWF0ZShqb2luVHlwZSwgcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpKSxcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPdmVyQnVpbGRlcigpIHtcbiAgICByZXR1cm4gbmV3IE92ZXJCdWlsZGVyKHtcbiAgICAgICAgb3Zlck5vZGU6IE92ZXJOb2RlLmNyZWF0ZSgpLFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qb2luLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEpvaW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvam9pbi1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24gfSBmcm9tICcuL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUpvaW5CdWlsZGVyIH0gZnJvbSAnLi9wYXJzZS11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlRXhwcmVzc2lvbiwgfSBmcm9tICcuL3RhYmxlLXBhcnNlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVNpbmdsZU9uSm9pbihqb2luVHlwZSwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUNhbGxiYWNrSm9pbihqb2luVHlwZSwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiBwYXJzZU9ubGVzc0pvaW4oam9pblR5cGUsIGFyZ3NbMF0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgICB9XG59XG5mdW5jdGlvbiBwYXJzZUNhbGxiYWNrSm9pbihqb2luVHlwZSwgZnJvbSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2soY3JlYXRlSm9pbkJ1aWxkZXIoam9pblR5cGUsIGZyb20pKS50b09wZXJhdGlvbk5vZGUoKTtcbn1cbmZ1bmN0aW9uIHBhcnNlU2luZ2xlT25Kb2luKGpvaW5UeXBlLCBmcm9tLCBsaHNDb2x1bW4sIHJoc0NvbHVtbikge1xuICAgIHJldHVybiBKb2luTm9kZS5jcmVhdGVXaXRoT24oam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKGZyb20pLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxoc0NvbHVtbiwgJz0nLCByaHNDb2x1bW4pKTtcbn1cbmZ1bmN0aW9uIHBhcnNlT25sZXNzSm9pbihqb2luVHlwZSwgZnJvbSkge1xuICAgIHJldHVybiBKb2luTm9kZS5jcmVhdGUoam9pblR5cGUsIHBhcnNlVGFibGVFeHByZXNzaW9uKGZyb20pKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vb2Zmc2V0LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgT2Zmc2V0Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnT2Zmc2V0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ09mZnNldE5vZGUnLFxuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dyb3VwLWJ5LWl0ZW0tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBHcm91cEJ5SXRlbU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dyb3VwQnlJdGVtTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZ3JvdXBCeSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHcm91cEJ5SXRlbU5vZGUnLFxuICAgICAgICAgICAgZ3JvdXBCeSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9ncm91cC1ieS1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBHcm91cEJ5SXRlbU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9ncm91cC1ieS1pdGVtLW5vZGUuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCwgfSBmcm9tICcuL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR3JvdXBCeShncm91cEJ5KSB7XG4gICAgZ3JvdXBCeSA9IGlzRnVuY3Rpb24oZ3JvdXBCeSkgPyBncm91cEJ5KGV4cHJlc3Npb25CdWlsZGVyKCkpIDogZ3JvdXBCeTtcbiAgICByZXR1cm4gcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KGdyb3VwQnkpLm1hcChHcm91cEJ5SXRlbU5vZGUuY3JlYXRlKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2V0LW9wZXJhdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFNldE9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1NldE9wZXJhdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG9wZXJhdG9yLCBleHByZXNzaW9uLCBhbGwpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnU2V0T3BlcmF0aW9uTm9kZScsXG4gICAgICAgICAgICBvcGVyYXRvcixcbiAgICAgICAgICAgIGV4cHJlc3Npb24sXG4gICAgICAgICAgICBhbGwsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc2V0LW9wZXJhdGlvbi1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBjcmVhdGVFeHByZXNzaW9uQnVpbGRlciwgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBTZXRPcGVyYXRpb25Ob2RlLCB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NldC1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc1JlYWRvbmx5QXJyYXkgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZUV4cHJlc3Npb24gfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNldE9wZXJhdGlvbnMob3BlcmF0b3IsIGV4cHJlc3Npb24sIGFsbCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGV4cHJlc3Npb24pKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSBleHByZXNzaW9uKGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKCkpO1xuICAgIH1cbiAgICBpZiAoIWlzUmVhZG9ubHlBcnJheShleHByZXNzaW9uKSkge1xuICAgICAgICBleHByZXNzaW9uID0gW2V4cHJlc3Npb25dO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXAoKGV4cHIpID0+IFNldE9wZXJhdGlvbk5vZGUuY3JlYXRlKG9wZXJhdG9yLCBwYXJzZUV4cHJlc3Npb24oZXhwciksIGFsbCkpO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9leHByZXNzaW9uLXdyYXBwZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IEFuZE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbmQtbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgT3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBQYXJlbnNOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcGFyZW5zLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvYmluYXJ5LW9wZXJhdGlvbi1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25XcmFwcGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEV4cHJlc3Npb25XcmFwcGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgb3IoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcihPck5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgYW5kKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbmRXcmFwcGVyKEFuZE5vZGUuY3JlYXRlKHRoaXMuI25vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgdGhpcyBgRXhwcmVzc2lvbldyYXBwZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogT21pdCBudWxsIGZyb20gdGhlIGV4cHJlc3Npb24ncyB0eXBlLlxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHlvdSBrbm93IGFuIGV4cHJlc3Npb24gY2FuJ3QgYmVcbiAgICAgKiBudWxsLCBidXQgS3lzZWx5IGlzIHVuYWJsZSB0byBpbmZlciBpdC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGwgZG9lc24ndCBjaGFuZ2UgdGhlIFNRTCBpbiBhbnkgd2F5LiBUaGlzIG1ldGhvZHMgc2ltcGx5XG4gICAgICogcmV0dXJucyBhIGNvcHkgb2YgYHRoaXNgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlciB7XG4gICAgI2V4cHI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGV4cHIsIGFsaWFzKSB7XG4gICAgICAgIHRoaXMuI2V4cHIgPSBleHByO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4cHI7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBhbGlhcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHRoaXMuI2V4cHIudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9yV3JhcHBlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRFeHByZXNzaW9uV3JhcHBlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIG9yKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPcldyYXBwZXIoT3JOb2RlLmNyZWF0ZSh0aGlzLiNub2RlLCBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgdGhlIGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYE9yV3JhcHBlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IE9yV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFuZFdyYXBwZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIodGhpcywgYWxpYXMpO1xuICAgIH1cbiAgICBhbmQoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IEFuZFdyYXBwZXIoQW5kTm9kZS5jcmVhdGUodGhpcy4jbm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGFuZ2UgdGhlIG91dHB1dCB0eXBlIG9mIHRoZSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBBbmRXcmFwcGVyYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgQW5kV3JhcHBlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gUGFyZW5zTm9kZS5jcmVhdGUodGhpcy4jbm9kZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9mZXRjaC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGZXRjaE5vZGUgPSB7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRmV0Y2hOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShyb3dDb3VudCwgbW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtpbmQ6ICdGZXRjaE5vZGUnLFxuICAgICAgICAgICAgcm93Q291bnQ6IFZhbHVlTm9kZS5jcmVhdGUocm93Q291bnQpLFxuICAgICAgICAgICAgbW9kaWZpZXIsXG4gICAgICAgIH07XG4gICAgfSxcbn07XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZldGNoLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZldGNoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZldGNoLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNCaWdJbnQsIGlzTnVtYmVyIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmV0Y2gocm93Q291bnQsIG1vZGlmaWVyKSB7XG4gICAgaWYgKCFpc051bWJlcihyb3dDb3VudCkgJiYgIWlzQmlnSW50KHJvd0NvdW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmV0Y2ggcm93IGNvdW50OiAke3Jvd0NvdW50fWApO1xuICAgIH1cbiAgICBpZiAoIWlzRmV0Y2hNb2RpZmllcihtb2RpZmllcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZldGNoIG1vZGlmaWVyOiAke21vZGlmaWVyfWApO1xuICAgIH1cbiAgICByZXR1cm4gRmV0Y2hOb2RlLmNyZWF0ZShyb3dDb3VudCwgbW9kaWZpZXIpO1xufVxuZnVuY3Rpb24gaXNGZXRjaE1vZGlmaWVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAnb25seScgfHwgdmFsdWUgPT09ICd3aXRoIHRpZXMnO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zZWxlY3QtcXVlcnktYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgU2VsZWN0TW9kaWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2VsZWN0LW1vZGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VKb2luLCB9IGZyb20gJy4uL3BhcnNlci9qb2luLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNlbGVjdEFyZywgcGFyc2VTZWxlY3RBbGwsIH0gZnJvbSAnLi4vcGFyc2VyL3NlbGVjdC1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0LCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlckJ5LCB9IGZyb20gJy4uL3BhcnNlci9vcmRlci1ieS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgTGltaXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbGltaXQtbm9kZS5qcyc7XG5pbXBvcnQgeyBPZmZzZXROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb2Zmc2V0LW5vZGUuanMnO1xuaW1wb3J0IHsgYXNBcnJheSwgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VHcm91cEJ5IH0gZnJvbSAnLi4vcGFyc2VyL2dyb3VwLWJ5LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciwgTm9SZXN1bHRFcnJvciwgfSBmcm9tICcuL25vLXJlc3VsdC1lcnJvci5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2lkZW50aWZpZXItbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNldE9wZXJhdGlvbnMsIH0gZnJvbSAnLi4vcGFyc2VyL3NldC1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUZldGNoIH0gZnJvbSAnLi4vcGFyc2VyL2ZldGNoLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRvcCB9IGZyb20gJy4uL3BhcnNlci90b3AtcGFyc2VyLmpzJztcbmNsYXNzIFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IGlzU2VsZWN0UXVlcnlCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhdmluZyguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aEhhdmluZyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaGF2aW5nUmVmKGxocywgb3AsIHJocykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhIYXZpbmcodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VsZWN0KHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZWxlY3RBcmcoc2VsZWN0aW9uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdE9uKHNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhEaXN0aW5jdE9uKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0KHNlbGVjdGlvbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RnJvbnQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGVXaXRoRXhwcmVzc2lvbihtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZVdpdGhFeHByZXNzaW9uKG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Rpc3RpbmN0JykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yVXBkYXRlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yVXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZvclNoYXJlKG9mKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnRm9yU2hhcmUnLCBvZiA/IGFzQXJyYXkob2YpLm1hcChwYXJzZVRhYmxlKSA6IHVuZGVmaW5lZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yS2V5U2hhcmUob2YpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdGb3JLZXlTaGFyZScsIG9mID8gYXNBcnJheShvZikubWFwKHBhcnNlVGFibGUpIDogdW5kZWZpbmVkKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmb3JOb0tleVVwZGF0ZShvZikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIFNlbGVjdE1vZGlmaWVyTm9kZS5jcmVhdGUoJ0Zvck5vS2V5VXBkYXRlJywgb2YgPyBhc0FycmF5KG9mKS5tYXAocGFyc2VUYWJsZSkgOiB1bmRlZmluZWQpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNraXBMb2NrZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgU2VsZWN0TW9kaWZpZXJOb2RlLmNyZWF0ZSgnU2tpcExvY2tlZCcpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vV2FpdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoRW5kTW9kaWZpZXIodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBTZWxlY3RNb2RpZmllck5vZGUuY3JlYXRlKCdOb1dhaXQnKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZWxlY3RBbGwodGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2VsZWN0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2VsZWN0QWxsKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbm5lckpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignSW5uZXJKb2luJywgYXJncyk7XG4gICAgfVxuICAgIGxlZnRKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xlZnRKb2luJywgYXJncyk7XG4gICAgfVxuICAgIHJpZ2h0Sm9pbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdSaWdodEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgZnVsbEpvaW4oLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignRnVsbEpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NKb2luKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0Nyb3NzSm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBpbm5lckpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxJbm5lckpvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgbGVmdEpvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxMZWZ0Sm9pbicsIGFyZ3MpO1xuICAgIH1cbiAgICBjcm9zc0pvaW5MYXRlcmFsKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2pvaW4oJ0xhdGVyYWxDcm9zc0pvaW4nLCBhcmdzKTtcbiAgICB9XG4gICAgY3Jvc3NBcHBseSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqb2luKCdDcm9zc0FwcGx5JywgYXJncyk7XG4gICAgfVxuICAgIG91dGVyQXBwbHkoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jam9pbignT3V0ZXJBcHBseScsIGFyZ3MpO1xuICAgIH1cbiAgICAjam9pbihqb2luVHlwZSwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhKb2luKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VKb2luKGpvaW5UeXBlLCBhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRoT3JkZXJCeUl0ZW1zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VPcmRlckJ5KGFyZ3MpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdyb3VwQnkoZ3JvdXBCeSkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhHcm91cEJ5SXRlbXModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUdyb3VwQnkoZ3JvdXBCeSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGltaXQobGltaXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoTGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBMaW1pdE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKGxpbWl0KSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb2Zmc2V0KG9mZnNldCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBPZmZzZXROb2RlLmNyZWF0ZShwYXJzZVZhbHVlRXhwcmVzc2lvbihvZmZzZXQpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmZXRjaChyb3dDb3VudCwgbW9kaWZpZXIgPSAnb25seScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoRmV0Y2godGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZUZldGNoKHJvd0NvdW50LCBtb2RpZmllcikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9wKGV4cHJlc3Npb24sIG1vZGlmaWVycykge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhUb3AodGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVRvcChleHByZXNzaW9uLCBtb2RpZmllcnMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVuaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygndW5pb24nLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW5pb25BbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCd1bmlvbicsIGV4cHJlc3Npb24sIHRydWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludGVyc2VjdChleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIHF1ZXJ5Tm9kZTogU2VsZWN0UXVlcnlOb2RlLmNsb25lV2l0aFNldE9wZXJhdGlvbnModGhpcy4jcHJvcHMucXVlcnlOb2RlLCBwYXJzZVNldE9wZXJhdGlvbnMoJ2ludGVyc2VjdCcsIGV4cHJlc3Npb24sIGZhbHNlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbnRlcnNlY3RBbGwoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdpbnRlcnNlY3QnLCBleHByZXNzaW9uLCB0cnVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBleGNlcHQoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhTZXRPcGVyYXRpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgcGFyc2VTZXRPcGVyYXRpb25zKCdleGNlcHQnLCBleHByZXNzaW9uLCBmYWxzZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZXhjZXB0QWxsKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRoU2V0T3BlcmF0aW9ucyh0aGlzLiNwcm9wcy5xdWVyeU5vZGUsIHBhcnNlU2V0T3BlcmF0aW9ucygnZXhjZXB0JywgZXhwcmVzc2lvbiwgdHJ1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIGNsZWFyU2VsZWN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRTZWxlY3Rpb25zKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjbGVhcldoZXJlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRXaGVyZSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY2xvbmVXaXRob3V0TGltaXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT2Zmc2V0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRPZmZzZXQodGhpcy4jcHJvcHMucXVlcnlOb2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNsZWFyT3JkZXJCeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcXVlcnlOb2RlOiBRdWVyeU5vZGUuY2xvbmVXaXRob3V0T3JkZXJCeSh0aGlzLiNwcm9wcy5xdWVyeU5vZGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJHcm91cEJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFNlbGVjdFF1ZXJ5Tm9kZS5jbG9uZVdpdGhvdXRHcm91cEJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICAkaWYoY29uZGl0aW9uLCBmdW5jKSB7XG4gICAgICAgIGlmIChjb25kaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2VsZWN0UXVlcnlCdWlsZGVySW1wbCh0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgICRuYXJyb3dUeXBlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICAkYXNzZXJ0VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHRoaXMuI3Byb3BzKTtcbiAgICB9XG4gICAgJGFzVHVwbGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIodGhpcy50b09wZXJhdGlvbk5vZGUoKSk7XG4gICAgfVxuICAgICRhc1NjYWxhcigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcih0aGlzLnRvT3BlcmF0aW9uTm9kZSgpKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSB0aGlzLmNvbXBpbGUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KGNvbXBpbGVkUXVlcnksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3QoKSB7XG4gICAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGVUYWtlRmlyc3RPclRocm93KGVycm9yQ29uc3RydWN0b3IgPSBOb1Jlc3VsdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVRha2VGaXJzdCgpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IoZXJyb3JDb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICA/IG5ldyBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpXG4gICAgICAgICAgICAgICAgOiBlcnJvckNvbnN0cnVjdG9yKHRoaXMudG9PcGVyYXRpb25Ob2RlKCkpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbShjaHVua1NpemUgPSAxMDApIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IHRoaXMuY29tcGlsZSgpO1xuICAgICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLiNwcm9wcy5leGVjdXRvci5zdHJlYW0oY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIHN0cmVhbSkge1xuICAgICAgICAgICAgeWllbGQqIGl0ZW0ucm93cztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBleHBsYWluKGZvcm1hdCwgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBxdWVyeU5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhFeHBsYWluKHRoaXMuI3Byb3BzLnF1ZXJ5Tm9kZSwgZm9ybWF0LCBvcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmV4ZWN1dGUoKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHByb3BzKSB7XG4gICAgcmV0dXJuIG5ldyBTZWxlY3RRdWVyeUJ1aWxkZXJJbXBsKHByb3BzKTtcbn1cbi8qKlxuICoge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlcn0gd2l0aCBhbiBhbGlhcy4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHtAbGluayBTZWxlY3RRdWVyeUJ1aWxkZXIuYXN9LlxuICovXG5jbGFzcyBBbGlhc2VkU2VsZWN0UXVlcnlCdWlsZGVySW1wbCB7XG4gICAgI3F1ZXJ5QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocXVlcnlCdWlsZGVyLCBhbGlhcykge1xuICAgICAgICB0aGlzLiNxdWVyeUJ1aWxkZXIgPSBxdWVyeUJ1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcXVlcnlCdWlsZGVyO1xuICAgIH1cbiAgICBnZXQgYWxpYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbGlhcztcbiAgICB9XG4gICAgZ2V0IGlzQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jcXVlcnlCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlcmVOb2RlIH0gZnJvbSAnLi93aGVyZS1ub2RlLmpzJztcbmltcG9ydCB7IE9yZGVyQnlOb2RlIH0gZnJvbSAnLi9vcmRlci1ieS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoYWdncmVnYXRlRnVuY3Rpb24sIGFnZ3JlZ2F0ZWQgPSBbXSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZ2dyZWdhdGVGdW5jdGlvbk5vZGUnLFxuICAgICAgICAgICAgZnVuYzogYWdncmVnYXRlRnVuY3Rpb24sXG4gICAgICAgICAgICBhZ2dyZWdhdGVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aERpc3RpbmN0KGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGRpc3RpbmN0OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aE9yZGVyQnkoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBvcmRlckl0ZW1zLCB3aXRoaW5Hcm91cCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSB3aXRoaW5Hcm91cCA/ICd3aXRoaW5Hcm91cCcgOiAnb3JkZXJCeSc7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uYWdncmVnYXRlRnVuY3Rpb25Ob2RlLFxuICAgICAgICAgICAgW3Byb3BdOiBhZ2dyZWdhdGVGdW5jdGlvbk5vZGVbcHJvcF1cbiAgICAgICAgICAgICAgICA/IE9yZGVyQnlOb2RlLmNsb25lV2l0aEl0ZW1zKGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZVtwcm9wXSwgb3JkZXJJdGVtcylcbiAgICAgICAgICAgICAgICA6IE9yZGVyQnlOb2RlLmNyZWF0ZShvcmRlckl0ZW1zKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhGaWx0ZXIoYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBmaWx0ZXI6IGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZS5maWx0ZXJcbiAgICAgICAgICAgICAgICA/IFdoZXJlTm9kZS5jbG9uZVdpdGhPcGVyYXRpb24oYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlciwgJ0FuZCcsIGZpbHRlcilcbiAgICAgICAgICAgICAgICA6IFdoZXJlTm9kZS5jcmVhdGUoZmlsdGVyKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPckZpbHRlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSxcbiAgICAgICAgICAgIGZpbHRlcjogYWdncmVnYXRlRnVuY3Rpb25Ob2RlLmZpbHRlclxuICAgICAgICAgICAgICAgID8gV2hlcmVOb2RlLmNsb25lV2l0aE9wZXJhdGlvbihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUuZmlsdGVyLCAnT3InLCBmaWx0ZXIpXG4gICAgICAgICAgICAgICAgOiBXaGVyZU5vZGUuY3JlYXRlKGZpbHRlciksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoT3ZlcihhZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIG92ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsXG4gICAgICAgICAgICBvdmVyLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRnVuY3Rpb25Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGdW5jdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGZ1bmMsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRnVuY3Rpb25Ob2RlJyxcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWdncmVnYXRlLWZ1bmN0aW9uLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZ2dyZWdhdGUtZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGNyZWF0ZU92ZXJCdWlsZGVyIH0gZnJvbSAnLi4vcGFyc2VyL3BhcnNlLXV0aWxzLmpzJztcbmltcG9ydCB7IHBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlT3JkZXJCeSwgfSBmcm9tICcuLi9wYXJzZXIvb3JkZXItYnktcGFyc2VyLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb25UeXBlKCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFuIGFsaWFzZWQgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBJbiBhZGRpdGlvbiB0byBzbGFwcGluZyBgYXMgXCJ0aGVfYWxpYXNcImAgdG8gdGhlIGVuZCBvZiB0aGUgU1FMLFxuICAgICAqIHRoaXMgbWV0aG9kIGFsc28gcHJvdmlkZXMgc3RyaWN0IHR5cGluZzpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5jb3VudDxudW1iZXI+KCdpZCcpLmFzKCdwZXJzb25fY291bnQnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqIC8vIGBwZXJzb25fY291bnQ6IG51bWJlcmAgZmllbGQgZXhpc3RzIGluIHRoZSByZXN1bHQgdHlwZS5cbiAgICAgKiBjb25zb2xlLmxvZyhyZXN1bHQucGVyc29uX2NvdW50KVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KFwiaWRcIikgYXMgXCJwZXJzb25fY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFzKGFsaWFzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXNlZEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBgZGlzdGluY3RgIGNsYXVzZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PlxuICAgICAqICAgICBlYi5mbi5jb3VudDxudW1iZXI+KCdmaXJzdF9uYW1lJykuZGlzdGluY3QoKS5hcygnZmlyc3RfbmFtZV9jb3VudCcpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGNvdW50KGRpc3RpbmN0IFwiZmlyc3RfbmFtZVwiKSBhcyBcImZpcnN0X25hbWVfY291bnRcIlxuICAgICAqIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNsb25lV2l0aERpc3RpbmN0KHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvcmRlckJ5KC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhZ2dyZWdhdGVGdW5jdGlvbk5vZGU6IFF1ZXJ5Tm9kZS5jbG9uZVdpdGhPcmRlckJ5SXRlbXModGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlLCBwYXJzZU9yZGVyQnkoYXJncykpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2xlYXJPcmRlckJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aG91dE9yZGVyQnkodGhpcy4jcHJvcHMuYWdncmVnYXRlRnVuY3Rpb25Ob2RlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhpbkdyb3VwT3JkZXJCeSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3JkZXJCeSh0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIHBhcnNlT3JkZXJCeShhcmdzKSwgdHJ1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmaWx0ZXJXaGVyZSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgYGZpbHRlcmAgY2xhdXNlIHdpdGggYSBuZXN0ZWQgYHdoZXJlYCBjbGF1c2UgYWZ0ZXIgdGhlIGZ1bmN0aW9uLCB3aGVyZVxuICAgICAqIGJvdGggc2lkZXMgb2YgdGhlIG9wZXJhdG9yIGFyZSByZWZlcmVuY2VzIHRvIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBTaW1pbGFyIHRvIHtAbGluayBXaGVyZUludGVyZmFjZX0ncyBgd2hlcmVSZWZgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogQ291bnQgcGVvcGxlIHdpdGggc2FtZSBmaXJzdCBhbmQgbGFzdCBuYW1lcyB2ZXJzdXMgZ2VuZXJhbCBwdWJsaWM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICogICAgIGViLmZuXG4gICAgICogICAgICAgLmNvdW50PG51bWJlcj4oJ2lkJylcbiAgICAgKiAgICAgICAuZmlsdGVyV2hlcmVSZWYoJ2ZpcnN0X25hbWUnLCAnPScsICdsYXN0X25hbWUnKVxuICAgICAqICAgICAgIC5hcygncmVwZWF0X25hbWVfY291bnQnKSxcbiAgICAgKiAgICAgZWIuZm4uY291bnQ8bnVtYmVyPignaWQnKS5hcygndG90YWxfY291bnQnKSxcbiAgICAgKiAgIF0pXG4gICAgICogICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0XG4gICAgICogICBjb3VudChcImlkXCIpIGZpbHRlcih3aGVyZSBcImZpcnN0X25hbWVcIiA9IFwibGFzdF9uYW1lXCIpIGFzIFwicmVwZWF0X25hbWVfY291bnRcIixcbiAgICAgKiAgIGNvdW50KFwiaWRcIikgYXMgXCJ0b3RhbF9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZmlsdGVyV2hlcmVSZWYobGhzLCBvcCwgcmhzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoRmlsdGVyKHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZSwgcGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbihsaHMsIG9wLCByaHMpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gYG92ZXJgIGNsYXVzZSAod2luZG93IGZ1bmN0aW9ucykgYWZ0ZXIgdGhlIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gICAgICogICAuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoXG4gICAgICogICAgIChlYikgPT4gZWIuZm4uYXZnPG51bWJlcj4oJ2FnZScpLm92ZXIoKS5hcygnYXZlcmFnZV9hZ2UnKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGF2ZyhcImFnZVwiKSBvdmVyKCkgYXMgXCJhdmVyYWdlX2FnZVwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbHNvIHN1cHBvcnRzIHBhc3NpbmcgYSBjYWxsYmFjayB0aGF0IHJldHVybnMgYW4gb3ZlciBidWlsZGVyLFxuICAgICAqIGFsbG93aW5nIHRvIGFkZCBwYXJ0aXRpb24gYnkgYW5kIHNvcnQgYnkgY2xhdXNlcyBpbnNpZGUgb3Zlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAgICAgKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChcbiAgICAgKiAgICAgKGViKSA9PiBlYi5mbi5hdmc8bnVtYmVyPignYWdlJykub3ZlcihcbiAgICAgKiAgICAgICBvYiA9PiBvYi5wYXJ0aXRpb25CeSgnbGFzdF9uYW1lJykub3JkZXJCeSgnZmlyc3RfbmFtZScsICdhc2MnKVxuICAgICAqICAgICApLmFzKCdhdmVyYWdlX2FnZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgYXZnKFwiYWdlXCIpIG92ZXIocGFydGl0aW9uIGJ5IFwibGFzdF9uYW1lXCIgb3JkZXIgYnkgXCJmaXJzdF9uYW1lXCIgYXNjKSBhcyBcImF2ZXJhZ2VfYWdlXCJcbiAgICAgKiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvdmVyKG92ZXIpIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGNyZWF0ZU92ZXJCdWlsZGVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY2xvbmVXaXRoT3Zlcih0aGlzLiNwcm9wcy5hZ2dyZWdhdGVGdW5jdGlvbk5vZGUsIChvdmVyID8gb3ZlcihidWlsZGVyKSA6IGJ1aWxkZXIpLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FzdHMgdGhlIGV4cHJlc3Npb24gdG8gdGhlIGdpdmVuIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIHRoaXMgYEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcmAgd2l0aCBhIG5ldyBvdXRwdXQgdHlwZS5cbiAgICAgKi9cbiAgICAkY2FzdFRvKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9taXQgbnVsbCBmcm9tIHRoZSBleHByZXNzaW9uJ3MgdHlwZS5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Uga25vdyBhbiBleHByZXNzaW9uIGNhbid0IGJlXG4gICAgICogbnVsbCwgYnV0IEt5c2VseSBpcyB1bmFibGUgdG8gaW5mZXIgaXQuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBjYWxsIGRvZXNuJ3QgY2hhbmdlIHRoZSBTUUwgaW4gYW55IHdheS4gVGhpcyBtZXRob2RzIHNpbXBseVxuICAgICAqIHJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoIGEgbmV3IG91dHB1dCB0eXBlLlxuICAgICAqL1xuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih0aGlzLiNwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTtcbiAgICB9XG59XG4vKipcbiAqIHtAbGluayBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXJ9IHdpdGggYW4gYWxpYXMuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB7QGxpbmsgQWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLmFzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIge1xuICAgICNhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXI7XG4gICAgI2FsaWFzO1xuICAgIGNvbnN0cnVjdG9yKGFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyID0gYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICAvKiogQHByaXZhdGUgKi9cbiAgICBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcjtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4jYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Z1bmN0aW9uLW1vZHVsZS5kLnRzXCIgLz5cbmltcG9ydCB7IEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLXdyYXBwZXIuanMnO1xuaW1wb3J0IHsgQWdncmVnYXRlRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWdncmVnYXRlLWZ1bmN0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgRnVuY3Rpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZnVuY3Rpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QsIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VTZWxlY3RBbGwgfSBmcm9tICcuLi9wYXJzZXIvc2VsZWN0LXBhcnNlci5qcyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2FnZ3JlZ2F0ZS1mdW5jdGlvbi1idWlsZGVyLmpzJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uTW9kdWxlKCkge1xuICAgIGNvbnN0IGZuID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdChhcmdzID8/IFtdKSkpO1xuICAgIH07XG4gICAgY29uc3QgYWdnID0gKG5hbWUsIGFyZ3MpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKG5hbWUsIGFyZ3MgPyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QoYXJncykgOiB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGZuLCB7XG4gICAgICAgIGFnZyxcbiAgICAgICAgYXZnKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnYXZnJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb2FsZXNjZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmbignY29hbGVzY2UnLCB2YWx1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ2NvdW50JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudEFsbCh0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZUZ1bmN0aW9uTm9kZTogQWdncmVnYXRlRnVuY3Rpb25Ob2RlLmNyZWF0ZSgnY291bnQnLCBwYXJzZVNlbGVjdEFsbCh0YWJsZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG1heChjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBhZ2coJ21heCcsIFtjb2x1bW5dKTtcbiAgICAgICAgfSxcbiAgICAgICAgbWluKGNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuIGFnZygnbWluJywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBzdW0oY29sdW1uKSB7XG4gICAgICAgICAgICByZXR1cm4gYWdnKCdzdW0nLCBbY29sdW1uXSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFueShjb2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmbignYW55JywgW2NvbHVtbl0pO1xuICAgICAgICB9LFxuICAgICAgICBqc29uQWdnKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAgICAgYWdncmVnYXRlRnVuY3Rpb25Ob2RlOiBBZ2dyZWdhdGVGdW5jdGlvbk5vZGUuY3JlYXRlKCdqc29uX2FnZycsIFtcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmcodGFibGUpID8gcGFyc2VUYWJsZSh0YWJsZSkgOiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB0b0pzb24odGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoRnVuY3Rpb25Ob2RlLmNyZWF0ZSgndG9fanNvbicsIFtcbiAgICAgICAgICAgICAgICBpc1N0cmluZyh0YWJsZSkgPyBwYXJzZVRhYmxlKHRhYmxlKSA6IHRhYmxlLnRvT3BlcmF0aW9uTm9kZSgpLFxuICAgICAgICAgICAgXSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmFyeU9wZXJhdGlvbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1VuYXJ5T3BlcmF0aW9uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob3BlcmF0b3IsIG9wZXJhbmQpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVW5hcnlPcGVyYXRpb25Ob2RlJyxcbiAgICAgICAgICAgIG9wZXJhdG9yLFxuICAgICAgICAgICAgb3BlcmFuZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi91bmFyeS1vcGVyYXRpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgT3BlcmF0b3JOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0b3Itbm9kZS5qcyc7XG5pbXBvcnQgeyBVbmFyeU9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91bmFyeS1vcGVyYXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIH0gZnJvbSAnLi9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV4aXN0cyhvcGVyYW5kKSB7XG4gICAgcmV0dXJuIHBhcnNlVW5hcnlPcGVyYXRpb24oJ2V4aXN0cycsIG9wZXJhbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm90RXhpc3RzKG9wZXJhbmQpIHtcbiAgICByZXR1cm4gcGFyc2VVbmFyeU9wZXJhdGlvbignbm90IGV4aXN0cycsIG9wZXJhbmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5hcnlPcGVyYXRpb24ob3BlcmF0b3IsIG9wZXJhbmQpIHtcbiAgICByZXR1cm4gVW5hcnlPcGVyYXRpb25Ob2RlLmNyZWF0ZShPcGVyYXRvck5vZGUuY3JlYXRlKG9wZXJhdG9yKSwgcGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKG9wZXJhbmQpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgV2hlbk5vZGUgfSBmcm9tICcuL3doZW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgQ2FzZU5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Nhc2VOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdDYXNlTm9kZScsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhXaGVuKGNhc2VOb2RlLCB3aGVuKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4uY2FzZU5vZGUsXG4gICAgICAgICAgICB3aGVuOiBmcmVlemUoY2FzZU5vZGUud2hlbiA/IFsuLi5jYXNlTm9kZS53aGVuLCB3aGVuXSA6IFt3aGVuXSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoVGhlbihjYXNlTm9kZSwgdGhlbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgd2hlbjogY2FzZU5vZGUud2hlblxuICAgICAgICAgICAgICAgID8gZnJlZXplKFtcbiAgICAgICAgICAgICAgICAgICAgLi4uY2FzZU5vZGUud2hlbi5zbGljZSgwLCAtMSksXG4gICAgICAgICAgICAgICAgICAgIFdoZW5Ob2RlLmNsb25lV2l0aFJlc3VsdChjYXNlTm9kZS53aGVuW2Nhc2VOb2RlLndoZW4ubGVuZ3RoIC0gMV0sIHRoZW4pLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGNhc2VOb2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNhc2VOb2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICcuLi9leHByZXNzaW9uL2V4cHJlc3Npb24td3JhcHBlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Nhc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBXaGVuTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3doZW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBpc1NhZmVJbW1lZGlhdGVWYWx1ZSwgcGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUsIHBhcnNlVmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci92YWx1ZS1wYXJzZXIuanMnO1xuZXhwb3J0IGNsYXNzIENhc2VCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICB3aGVuKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlVGhlbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jbG9uZVdpdGhXaGVuKHRoaXMuI3Byb3BzLm5vZGUsIFdoZW5Ob2RlLmNyZWF0ZShwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uKGFyZ3MpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBDYXNlVGhlbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRoZW4odmFsdWVFeHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVdoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoVGhlbih0aGlzLiNwcm9wcy5ub2RlLCBpc1NhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgPyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSh2YWx1ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZUV4cHJlc3Npb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENhc2VXaGVuQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgd2hlbiguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2FzZVRoZW5CdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ2FzZU5vZGUuY2xvbmVXaXRoV2hlbih0aGlzLiNwcm9wcy5ub2RlLCBXaGVuTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSh2YWx1ZUV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlRW5kQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENhc2VOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZWxzZTogaXNTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWVFeHByZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlKHZhbHVlRXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZUV4cHJlc3Npb24pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgZW5kQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBpc1N0YXRlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENhc2VFbmRCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBlbmQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHsgaXNTdGF0ZW1lbnQ6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgZW5kQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihDYXNlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwgeyBpc1N0YXRlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9qc29uLXBhdGgtbGVnLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgSlNPTlBhdGhMZWdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdKU09OUGF0aExlZ05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0pTT05QYXRoTGVnTm9kZScsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vanNvbi1wYXRoLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05PcGVyYXRvckNoYWluTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tb3BlcmF0b3ItY2hhaW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aExlZ05vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLWxlZy1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05QYXRoTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2pzb24tcGF0aC1ub2RlLmpzJztcbmltcG9ydCB7IEpTT05SZWZlcmVuY2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1yZWZlcmVuY2Utbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgSlNPTlBhdGhCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgYW4gZWxlbWVudCBvZiBhIEpTT04gYXJyYXkgaW4gYSBzcGVjaWZpYyBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIFNpbmNlIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIGFuIGVsZW1lbnQgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSBsb2NhdGlvbiwgdGhlXG4gICAgICogcmVzdWx0aW5nIHR5cGUgaXMgYWx3YXlzIG51bGxhYmxlLiBJZiB5b3UncmUgc3VyZSB0aGUgZWxlbWVudCBleGlzdHMsIHlvdVxuICAgICAqIHNob3VsZCB1c2Uge0BsaW5rIFNlbGVjdFF1ZXJ5QnVpbGRlci4kYXNzZXJ0VHlwZX0gdG8gbmFycm93IHRoZSB0eXBlIHNhZmVseS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBrZXl9IHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9mIEpTT04gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLnNlbGVjdChlYiA9PlxuICAgICAqICAgICBlYi5yZWYoJ25pY2tuYW1lcycsICctPicpLmF0KDApLmFzKCdwcmltYXJ5X25pY2tuYW1lJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcIm5pY2tuYW1lc1wiLT4wIGFzIFwicHJpbWFyeV9uaWNrbmFtZVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqYGBgXG4gICAgICpcbiAgICAgKiBDb21iaW5lZCB3aXRoIHtAbGluayBrZXl9OlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignZXhwZXJpZW5jZScsICctPicpLmF0KDApLmtleSgncm9sZScpLmFzKCdmaXJzdF9yb2xlJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJleHBlcmllbmNlXCItPjAtPidyb2xlJyBhcyBcImZpcnN0X3JvbGVcIiBmcm9tIFwicGVyc29uXCJcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFlvdSBjYW4gdXNlIGAnbGFzdCdgIHRvIGFjY2VzcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBpbiBNeVNRTDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ25pY2tuYW1lcycsICctPiQnKS5hdCgnbGFzdCcpLmFzKCdsYXN0X25pY2tuYW1lJylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IGBuaWNrbmFtZXNgLT4nJFtsYXN0XScgYXMgYGxhc3Rfbmlja25hbWVgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIE9yIGAnIy0xJ2AgaW4gU1FMaXRlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZignbmlja25hbWVzJywgJy0+PiQnKS5hdCgnIy0xJykuYXMoJ2xhc3Rfbmlja25hbWUnKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChTUUxpdGUpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogc2VsZWN0IFwibmlja25hbWVzXCItPj4nJFsjLTFdJyBhcyBgbGFzdF9uaWNrbmFtZWAgZnJvbSBgcGVyc29uYFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF0KGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWcoJ0FycmF5TG9jYXRpb24nLCBpbmRleCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjY2VzcyBhIHByb3BlcnR5IG9mIGEgSlNPTiBvYmplY3QuXG4gICAgICpcbiAgICAgKiBJZiBhIGZpZWxkIGlzIG9wdGlvbmFsLCB0aGUgcmVzdWx0aW5nIHR5cGUgd2lsbCBiZSBudWxsYWJsZS5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvIHtAbGluayBhdH0gdG8gYWNjZXNzIGVsZW1lbnRzIG9mIEpTT04gYXJyYXlzLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNlbGVjdEZyb20oJ3BlcnNvbicpLnNlbGVjdChlYiA9PlxuICAgICAqICAgZWIucmVmKCdhZGRyZXNzJywgJy0+Jykua2V5KCdjaXR5JykuYXMoJ2NpdHknKVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBcImFkZHJlc3NcIi0+J2NpdHknIGFzIFwiY2l0eVwiIGZyb20gXCJwZXJzb25cIlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogR29pbmcgZGVlcGVyOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoZWIgPT5cbiAgICAgKiAgIGViLnJlZigncHJvZmlsZScsICctPiQnKS5rZXkoJ3dlYnNpdGUnKS5rZXkoJ3VybCcpLmFzKCd3ZWJzaXRlX3VybCcpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIHNlbGVjdCBgcHJvZmlsZWAtPickLndlYnNpdGUudXJsJyBhcyBgd2Vic2l0ZV91cmxgIGZyb20gYHBlcnNvbmBcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIENvbWJpbmVkIHdpdGgge0BsaW5rIGF0fTpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2VsZWN0RnJvbSgncGVyc29uJykuc2VsZWN0KGViID0+XG4gICAgICogICBlYi5yZWYoJ3Byb2ZpbGUnLCAnLT4nKS5rZXkoJ2FkZHJlc3NlcycpLmF0KDApLmtleSgnY2l0eScpLmFzKCdjaXR5JylcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwcm9maWxlXCItPidhZGRyZXNzZXMnLT4wLT4nY2l0eScgYXMgXCJjaXR5XCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAga2V5KGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy4jY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKCdNZW1iZXInLCBrZXkpO1xuICAgIH1cbiAgICAjY3JlYXRlQnVpbGRlcldpdGhQYXRoTGVnKGxlZ1R5cGUsIHZhbHVlKSB7XG4gICAgICAgIGlmIChKU09OUmVmZXJlbmNlTm9kZS5pcyh0aGlzLiNub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIoSlNPTlJlZmVyZW5jZU5vZGUuY2xvbmVXaXRoVHJhdmVyc2FsKHRoaXMuI25vZGUsIEpTT05QYXRoTm9kZS5pcyh0aGlzLiNub2RlLnRyYXZlcnNhbClcbiAgICAgICAgICAgICAgICA/IEpTT05QYXRoTm9kZS5jbG9uZVdpdGhMZWcodGhpcy4jbm9kZS50cmF2ZXJzYWwsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKVxuICAgICAgICAgICAgICAgIDogSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlLmNsb25lV2l0aFZhbHVlKHRoaXMuI25vZGUudHJhdmVyc2FsLCBWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKHZhbHVlKSkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcihKU09OUGF0aE5vZGUuY2xvbmVXaXRoTGVnKHRoaXMuI25vZGUsIEpTT05QYXRoTGVnTm9kZS5jcmVhdGUobGVnVHlwZSwgdmFsdWUpKSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlciBleHRlbmRzIEpTT05QYXRoQnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICBzdXBlcihub2RlKTtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKiBAcHJpdmF0ZSAqL1xuICAgIGdldCBleHByZXNzaW9uVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkSlNPTlBhdGhCdWlsZGVyKHRoaXMsIGFsaWFzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUganNvbiBwYXRoLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgY2FsbCBkb2Vzbid0IGNoYW5nZSB0aGUgU1FMIGluIGFueSB3YXkuIFRoaXMgbWV0aG9kcyBzaW1wbHlcbiAgICAgKiByZXR1cm5zIGEgY29weSBvZiB0aGlzIGBKU09OUGF0aEJ1aWxkZXJgIHdpdGggYSBuZXcgb3V0cHV0IHR5cGUuXG4gICAgICovXG4gICAgJGNhc3RUbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmF2ZXJzZWRKU09OUGF0aEJ1aWxkZXIodGhpcy4jbm9kZSk7XG4gICAgfVxuICAgICRub3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYXZlcnNlZEpTT05QYXRoQnVpbGRlcih0aGlzLiNub2RlKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbm9kZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxpYXNlZEpTT05QYXRoQnVpbGRlciB7XG4gICAgI2pzb25QYXRoO1xuICAgICNhbGlhcztcbiAgICBjb25zdHJ1Y3Rvcihqc29uUGF0aCwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4janNvblBhdGggPSBqc29uUGF0aDtcbiAgICAgICAgdGhpcy4jYWxpYXMgPSBhbGlhcztcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGV4cHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNqc29uUGF0aDtcbiAgICB9XG4gICAgLyoqIEBwcml2YXRlICovXG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUodGhpcy4janNvblBhdGgudG9PcGVyYXRpb25Ob2RlKCksIGlzT3BlcmF0aW9uTm9kZVNvdXJjZSh0aGlzLiNhbGlhcylcbiAgICAgICAgICAgID8gdGhpcy4jYWxpYXMudG9PcGVyYXRpb25Ob2RlKClcbiAgICAgICAgICAgIDogSWRlbnRpZmllck5vZGUuY3JlYXRlKHRoaXMuI2FsaWFzKSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi90dXBsZS1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFR1cGxlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVHVwbGVOb2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnVHVwbGVOb2RlJyxcbiAgICAgICAgICAgIHZhbHVlczogZnJlZXplKHZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGF0YS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5jb25zdCBTSU1QTEVfQ09MVU1OX0RBVEFfVFlQRVMgPSBbXG4gICAgJ3ZhcmNoYXInLFxuICAgICdjaGFyJyxcbiAgICAndGV4dCcsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQyJyxcbiAgICAnaW50NCcsXG4gICAgJ2ludDgnLFxuICAgICdzbWFsbGludCcsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdyZWFsJyxcbiAgICAnZG91YmxlIHByZWNpc2lvbicsXG4gICAgJ2Zsb2F0NCcsXG4gICAgJ2Zsb2F0OCcsXG4gICAgJ2RlY2ltYWwnLFxuICAgICdudW1lcmljJyxcbiAgICAnYmluYXJ5JyxcbiAgICAnYnl0ZWEnLFxuICAgICdkYXRlJyxcbiAgICAnZGF0ZXRpbWUnLFxuICAgICd0aW1lJyxcbiAgICAndGltZXR6JyxcbiAgICAndGltZXN0YW1wJyxcbiAgICAndGltZXN0YW1wdHonLFxuICAgICdzZXJpYWwnLFxuICAgICdiaWdzZXJpYWwnLFxuICAgICd1dWlkJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb25iJyxcbiAgICAnYmxvYicsXG4gICAgJ3ZhcmJpbmFyeScsXG4gICAgJ2ludDRyYW5nZScsXG4gICAgJ2ludDRtdWx0aXJhbmdlJyxcbiAgICAnaW50OHJhbmdlJyxcbiAgICAnaW50OG11bHRpcmFuZ2UnLFxuICAgICdudW1yYW5nZScsXG4gICAgJ251bW11bHRpcmFuZ2UnLFxuICAgICd0c3JhbmdlJyxcbiAgICAndHNtdWx0aXJhbmdlJyxcbiAgICAndHN0enJhbmdlJyxcbiAgICAndHN0em11bHRpcmFuZ2UnLFxuICAgICdkYXRlcmFuZ2UnLFxuICAgICdkYXRlbXVsdGlyYW5nZScsXG5dO1xuY29uc3QgQ09MVU1OX0RBVEFfVFlQRV9SRUdFWCA9IFtcbiAgICAvXnZhcmNoYXJcXChcXGQrXFwpJC8sXG4gICAgL15jaGFyXFwoXFxkK1xcKSQvLFxuICAgIC9eZGVjaW1hbFxcKFxcZCssIFxcZCtcXCkkLyxcbiAgICAvXm51bWVyaWNcXChcXGQrLCBcXGQrXFwpJC8sXG4gICAgL15iaW5hcnlcXChcXGQrXFwpJC8sXG4gICAgL15kYXRldGltZVxcKFxcZCtcXCkkLyxcbiAgICAvXnRpbWVcXChcXGQrXFwpJC8sXG4gICAgL150aW1ldHpcXChcXGQrXFwpJC8sXG4gICAgL150aW1lc3RhbXBcXChcXGQrXFwpJC8sXG4gICAgL150aW1lc3RhbXB0elxcKFxcZCtcXCkkLyxcbiAgICAvXnZhcmJpbmFyeVxcKFxcZCtcXCkkLyxcbl07XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGF0YVR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEYXRhVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RhdGFUeXBlTm9kZScsXG4gICAgICAgICAgICBkYXRhVHlwZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29sdW1uRGF0YVR5cGUoZGF0YVR5cGUpIHtcbiAgICBpZiAoU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTLmluY2x1ZGVzKGRhdGFUeXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKENPTFVNTl9EQVRBX1RZUEVfUkVHRVguc29tZSgocikgPT4gci50ZXN0KGRhdGFUeXBlKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZGF0YS10eXBlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IERhdGFUeXBlTm9kZSwgaXNDb2x1bW5EYXRhVHlwZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kYXRhLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFUeXBlLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICBpZiAoaXNDb2x1bW5EYXRhVHlwZShkYXRhVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIERhdGFUeXBlTm9kZS5jcmVhdGUoZGF0YVR5cGUpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY29sdW1uIGRhdGEgdHlwZSAke0pTT04uc3RyaW5naWZ5KGRhdGFUeXBlKX1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY2FzdC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENhc3ROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdDYXN0Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZXhwcmVzc2lvbiwgZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ2FzdE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIGRhdGFUeXBlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciwgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL3NlbGVjdC1xdWVyeS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NlbGVjdC1xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0LCBwYXJzZVRhYmxlLCB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgV2l0aFNjaGVtYVBsdWdpbiB9IGZyb20gJy4uL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVlcnlJZCB9IGZyb20gJy4uL3V0aWwvcXVlcnktaWQuanMnO1xuaW1wb3J0IHsgY3JlYXRlRnVuY3Rpb25Nb2R1bGUsIH0gZnJvbSAnLi4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgcGFyc2VKU09OUmVmZXJlbmNlLCBwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24sIHBhcnNlU3RyaW5nUmVmZXJlbmNlLCB9IGZyb20gJy4uL3BhcnNlci9yZWZlcmVuY2UtcGFyc2VyLmpzJztcbmltcG9ydCB7IHBhcnNlRmlsdGVyTGlzdCwgcGFyc2VGaWx0ZXJPYmplY3QsIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24sIHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2JpbmFyeS1vcGVyYXRpb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFBhcmVuc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wYXJlbnMtbm9kZS5qcyc7XG5pbXBvcnQgeyBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJy4vZXhwcmVzc2lvbi13cmFwcGVyLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRvci1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVW5hcnlPcGVyYXRpb24gfSBmcm9tICcuLi9wYXJzZXIvdW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL3ZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBOT09QX1FVRVJZX0VYRUNVVE9SIH0gZnJvbSAnLi4vcXVlcnktZXhlY3V0b3Ivbm9vcC1xdWVyeS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBDYXNlQnVpbGRlciB9IGZyb20gJy4uL3F1ZXJ5LWJ1aWxkZXIvY2FzZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENhc2VOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IGlzUmVhZG9ubHlBcnJheSwgaXNVbmRlZmluZWQgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBKU09OUGF0aEJ1aWxkZXIgfSBmcm9tICcuLi9xdWVyeS1idWlsZGVyL2pzb24tcGF0aC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEJpbmFyeU9wZXJhdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9iaW5hcnktb3BlcmF0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgQW5kTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FuZC1ub2RlLmpzJztcbmltcG9ydCB7IFR1cGxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3R1cGxlLW5vZGUuanMnO1xuaW1wb3J0IHsgSlNPTlBhdGhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvanNvbi1wYXRoLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgQ2FzdE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jYXN0LW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKGV4ZWN1dG9yID0gTk9PUF9RVUVSWV9FWEVDVVRPUikge1xuICAgIGZ1bmN0aW9uIGJpbmFyeShsaHMsIG9wLCByaHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uKGxocywgb3AsIHJocykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1bmFyeShvcCwgZXhwcikge1xuICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVW5hcnlPcGVyYXRpb24ob3AsIGV4cHIpKTtcbiAgICB9XG4gICAgY29uc3QgZWIgPSBPYmplY3QuYXNzaWduKGJpbmFyeSwge1xuICAgICAgICBmbjogdW5kZWZpbmVkLFxuICAgICAgICBlYjogdW5kZWZpbmVkLFxuICAgICAgICBzZWxlY3RGcm9tKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICAgICAgcXVlcnlOb2RlOiBTZWxlY3RRdWVyeU5vZGUuY3JlYXRlRnJvbShwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCh0YWJsZSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNhc2UocmVmZXJlbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENhc2VCdWlsZGVyKHtcbiAgICAgICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jcmVhdGUoaXNVbmRlZmluZWQocmVmZXJlbmNlKVxuICAgICAgICAgICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICA6IHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihyZWZlcmVuY2UpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZWYocmVmZXJlbmNlLCBvcCkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG9wKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VTdHJpbmdSZWZlcmVuY2UocmVmZXJlbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEpTT05QYXRoQnVpbGRlcihwYXJzZUpTT05SZWZlcmVuY2UocmVmZXJlbmNlLCBvcCkpO1xuICAgICAgICB9LFxuICAgICAgICBqc29uUGF0aCgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTlBhdGhCdWlsZGVyKEpTT05QYXRoTm9kZS5jcmVhdGUoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVGFibGUodGFibGUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlVmFsdWVFeHByZXNzaW9uKHZhbHVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZlR1cGxlKC4uLnZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihUdXBsZU5vZGUuY3JlYXRlKHZhbHVlcy5tYXAocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKSkpO1xuICAgICAgICB9LFxuICAgICAgICB0dXBsZSguLi52YWx1ZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoVHVwbGVOb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKHBhcnNlVmFsdWVFeHByZXNzaW9uKSkpO1xuICAgICAgICB9LFxuICAgICAgICBsaXQodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIocGFyc2VTYWZlSW1tZWRpYXRlVmFsdWUodmFsdWUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5hcnksXG4gICAgICAgIG5vdChleHByKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5hcnkoJ25vdCcsIGV4cHIpO1xuICAgICAgICB9LFxuICAgICAgICBleGlzdHMoZXhwcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuYXJ5KCdleGlzdHMnLCBleHByKTtcbiAgICAgICAgfSxcbiAgICAgICAgbmVnKGV4cHIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmFyeSgnLScsIGV4cHIpO1xuICAgICAgICB9LFxuICAgICAgICBiZXR3ZWVuKGV4cHIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQmluYXJ5T3BlcmF0aW9uTm9kZS5jcmVhdGUocGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uKGV4cHIpLCBPcGVyYXRvck5vZGUuY3JlYXRlKCdiZXR3ZWVuJyksIEFuZE5vZGUuY3JlYXRlKHBhcnNlVmFsdWVFeHByZXNzaW9uKHN0YXJ0KSwgcGFyc2VWYWx1ZUV4cHJlc3Npb24oZW5kKSkpKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmV0d2VlblN5bW1ldHJpYyhleHByLCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKEJpbmFyeU9wZXJhdGlvbk5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgT3BlcmF0b3JOb2RlLmNyZWF0ZSgnYmV0d2VlbiBzeW1tZXRyaWMnKSwgQW5kTm9kZS5jcmVhdGUocGFyc2VWYWx1ZUV4cHJlc3Npb24oc3RhcnQpLCBwYXJzZVZhbHVlRXhwcmVzc2lvbihlbmQpKSkpO1xuICAgICAgICB9LFxuICAgICAgICBhbmQoZXhwcnMpIHtcbiAgICAgICAgICAgIGlmIChpc1JlYWRvbmx5QXJyYXkoZXhwcnMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlckxpc3QoZXhwcnMsICdhbmQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyT2JqZWN0KGV4cHJzLCAnYW5kJykpO1xuICAgICAgICB9LFxuICAgICAgICBvcihleHBycykge1xuICAgICAgICAgICAgaWYgKGlzUmVhZG9ubHlBcnJheShleHBycykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKHBhcnNlRmlsdGVyTGlzdChleHBycywgJ29yJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihwYXJzZUZpbHRlck9iamVjdChleHBycywgJ29yJykpO1xuICAgICAgICB9LFxuICAgICAgICBwYXJlbnMoLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgICAgICBpZiAoUGFyZW5zTm9kZS5pcyhub2RlKSkge1xuICAgICAgICAgICAgICAgIC8vIE5vIGRvdWJsZSB3cmFwcGluZy5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4cHJlc3Npb25XcmFwcGVyKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uV3JhcHBlcihQYXJlbnNOb2RlLmNyZWF0ZShub2RlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNhc3QoZXhwciwgZGF0YVR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbldyYXBwZXIoQ2FzdE5vZGUuY3JlYXRlKHBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbihleHByKSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRXhwcmVzc2lvbkJ1aWxkZXIoZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQobmV3IFdpdGhTY2hlbWFQbHVnaW4oc2NoZW1hKSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuICAgIGViLmZuID0gY3JlYXRlRnVuY3Rpb25Nb2R1bGUoKTtcbiAgICBlYi5lYiA9IGViO1xuICAgIHJldHVybiBlYjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW9uQnVpbGRlcihfKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV4cHJlc3Npb25CdWlsZGVyKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2V4cHJlc3Npb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNBbGlhc2VkRXhwcmVzc2lvbiwgaXNFeHByZXNzaW9uLCB9IGZyb20gJy4uL2V4cHJlc3Npb24vZXhwcmVzc2lvbi5qcyc7XG5pbXBvcnQgeyBpc09wZXJhdGlvbk5vZGVTb3VyY2UgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgZXhwcmVzc2lvbkJ1aWxkZXIsIH0gZnJvbSAnLi4vZXhwcmVzc2lvbi9leHByZXNzaW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgaXNGdW5jdGlvbiB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShleHApKSB7XG4gICAgICAgIHJldHVybiBleHAudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwKGV4cHJlc3Npb25CdWlsZGVyKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZXhwcmVzc2lvbjogJHtKU09OLnN0cmluZ2lmeShleHApfWApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQWxpYXNlZEV4cHJlc3Npb24oZXhwKSB7XG4gICAgaWYgKGlzT3BlcmF0aW9uTm9kZVNvdXJjZShleHApKSB7XG4gICAgICAgIHJldHVybiBleHAudG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzRnVuY3Rpb24oZXhwKSkge1xuICAgICAgICByZXR1cm4gZXhwKGV4cHJlc3Npb25CdWlsZGVyKCkpLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYWxpYXNlZCBleHByZXNzaW9uOiAke0pTT04uc3RyaW5naWZ5KGV4cCl9YCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNFeHByZXNzaW9uT3JGYWN0b3J5KG9iaikge1xuICAgIHJldHVybiBpc0V4cHJlc3Npb24ob2JqKSB8fCBpc0FsaWFzZWRFeHByZXNzaW9uKG9iaikgfHwgaXNGdW5jdGlvbihvYmopO1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBBbGlhc05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbGlhcy1ub2RlLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaWRlbnRpZmllci1ub2RlLmpzJztcbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS1zb3VyY2UuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNUYWJsZUJ1aWxkZXIge1xuICAgICN0YWJsZTtcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IodGFibGUpIHtcbiAgICAgICAgdGhpcy4jdGFibGUgPSB0YWJsZTtcbiAgICB9XG4gICAgYXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcih0aGlzLiN0YWJsZSwgYWxpYXMpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciB7XG4gICAgI3RhYmxlO1xuICAgICNhbGlhcztcbiAgICBnZXQgdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN0YWJsZTtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRhYmxlLCBhbGlhcykge1xuICAgICAgICB0aGlzLiN0YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLiNhbGlhcyA9IGFsaWFzO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiBBbGlhc05vZGUuY3JlYXRlKHBhcnNlVGFibGUodGhpcy4jdGFibGUpLCBJZGVudGlmaWVyTm9kZS5jcmVhdGUodGhpcy4jYWxpYXMpKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlcihvYmopIHtcbiAgICByZXR1cm4gKGlzT2JqZWN0KG9iaikgJiZcbiAgICAgICAgaXNPcGVyYXRpb25Ob2RlU291cmNlKG9iaikgJiZcbiAgICAgICAgaXNTdHJpbmcob2JqLnRhYmxlKSAmJlxuICAgICAgICBpc1N0cmluZyhvYmouYWxpYXMpKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdGFibGUtcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgaXNSZWFkb25seUFycmF5LCBpc1N0cmluZyB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZUFsaWFzZWRFeHByZXNzaW9uLCB9IGZyb20gJy4vZXhwcmVzc2lvbi1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciwgfSBmcm9tICcuLi9keW5hbWljL2R5bmFtaWMtdGFibGUtYnVpbGRlci5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWJsZUV4cHJlc3Npb25Pckxpc3QodGFibGUpIHtcbiAgICBpZiAoaXNSZWFkb25seUFycmF5KHRhYmxlKSkge1xuICAgICAgICByZXR1cm4gdGFibGUubWFwKChpdCkgPT4gcGFyc2VUYWJsZUV4cHJlc3Npb24oaXQpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpXTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUYWJsZUV4cHJlc3Npb24odGFibGUpIHtcbiAgICBpZiAoaXNTdHJpbmcodGFibGUpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFsaWFzZWRUYWJsZSh0YWJsZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQWxpYXNlZER5bmFtaWNUYWJsZUJ1aWxkZXIodGFibGUpKSB7XG4gICAgICAgIHJldHVybiB0YWJsZS50b09wZXJhdGlvbk5vZGUoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBwYXJzZUFsaWFzZWRFeHByZXNzaW9uKHRhYmxlKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBbGlhc2VkVGFibGUoZnJvbSkge1xuICAgIGNvbnN0IEFMSUFTX1NFUEFSQVRPUiA9ICcgYXMgJztcbiAgICBpZiAoZnJvbS5pbmNsdWRlcyhBTElBU19TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IFt0YWJsZSwgYWxpYXNdID0gZnJvbS5zcGxpdChBTElBU19TRVBBUkFUT1IpLm1hcCh0cmltKTtcbiAgICAgICAgcmV0dXJuIEFsaWFzTm9kZS5jcmVhdGUocGFyc2VUYWJsZSh0YWJsZSksIElkZW50aWZpZXJOb2RlLmNyZWF0ZShhbGlhcykpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlVGFibGUoZnJvbSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVGFibGUoZnJvbSkge1xuICAgIGNvbnN0IFNDSEVNQV9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKGZyb20uaW5jbHVkZXMoU0NIRU1BX1NFUEFSQVRPUikpIHtcbiAgICAgICAgY29uc3QgW3NjaGVtYSwgdGFibGVdID0gZnJvbS5zcGxpdChTQ0hFTUFfU0VQQVJBVE9SKS5tYXAodHJpbSk7XG4gICAgICAgIHJldHVybiBUYWJsZU5vZGUuY3JlYXRlV2l0aFNjaGVtYShzY2hlbWEsIHRhYmxlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBUYWJsZU5vZGUuY3JlYXRlKGZyb20pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FkZC1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQWRkQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLWRlZmluaXRpb24tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDb2x1bW5EZWZpbml0aW9uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbiwgZGF0YVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ29sdW1uRGVmaW5pdGlvbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICAgICAgZGF0YVR5cGUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoRnJvbnRNb2RpZmllcihub2RlLCBtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICBmcm9udE1vZGlmaWVyczogbm9kZS5mcm9udE1vZGlmaWVyc1xuICAgICAgICAgICAgICAgID8gZnJlZXplKFsuLi5ub2RlLmZyb250TW9kaWZpZXJzLCBtb2RpZmllcl0pXG4gICAgICAgICAgICAgICAgOiBbbW9kaWZpZXJdLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aEVuZE1vZGlmaWVyKG5vZGUsIG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIGVuZE1vZGlmaWVyczogbm9kZS5lbmRNb2RpZmllcnNcbiAgICAgICAgICAgICAgICA/IGZyZWV6ZShbLi4ubm9kZS5lbmRNb2RpZmllcnMsIG1vZGlmaWVyXSlcbiAgICAgICAgICAgICAgICA6IFttb2RpZmllcl0sXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcENvbHVtbk5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uOiBDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlbmFtZS1jb2x1bW4tbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENvbHVtbk5vZGUgfSBmcm9tICcuL2NvbHVtbi1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZW5hbWVDb2x1bW5Ob2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb2x1bW5Ob2RlJyxcbiAgICAgICAgICAgIGNvbHVtbjogQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSxcbiAgICAgICAgICAgIHJlbmFtZVRvOiBDb2x1bW5Ob2RlLmNyZWF0ZShuZXdDb2x1bW4pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NoZWNrLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IENoZWNrQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0NoZWNrQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGV4cHJlc3Npb24sIGNvbnN0cmFpbnROYW1lKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0NoZWNrQ29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgIG5hbWU6IGNvbnN0cmFpbnROYW1lID8gSWRlbnRpZmllck5vZGUuY3JlYXRlKGNvbnN0cmFpbnROYW1lKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yZWZlcmVuY2VzLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUyA9IFtcbiAgICAnbm8gYWN0aW9uJyxcbiAgICAncmVzdHJpY3QnLFxuICAgICdjYXNjYWRlJyxcbiAgICAnc2V0IG51bGwnLFxuICAgICdzZXQgZGVmYXVsdCcsXG5dO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlZmVyZW5jZXNOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZWZlcmVuY2VzTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUodGFibGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUmVmZXJlbmNlc05vZGUnLFxuICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICBjb2x1bW5zOiBmcmVlemUoWy4uLmNvbHVtbnNdKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPbkRlbGV0ZShyZWZlcmVuY2VzLCBvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJlZmVyZW5jZXMsXG4gICAgICAgICAgICBvbkRlbGV0ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhPblVwZGF0ZShyZWZlcmVuY2VzLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLnJlZmVyZW5jZXMsXG4gICAgICAgICAgICBvblVwZGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXZhbHVlLXBhcnNlci5kLnRzXCIgLz5cbmltcG9ydCB7IGlzT3BlcmF0aW9uTm9kZVNvdXJjZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXNvdXJjZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24odmFsdWUpIHtcbiAgICByZXR1cm4gaXNPcGVyYXRpb25Ob2RlU291cmNlKHZhbHVlKVxuICAgICAgICA/IHZhbHVlLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgIDogVmFsdWVOb2RlLmNyZWF0ZUltbWVkaWF0ZSh2YWx1ZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2dlbmVyYXRlZC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmVyYXRlZE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0dlbmVyYXRlZE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdHZW5lcmF0ZWROb2RlJyxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjcmVhdGVXaXRoRXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0dlbmVyYXRlZE5vZGUnLFxuICAgICAgICAgICAgYWx3YXlzOiB0cnVlLFxuICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXZhbHVlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFZhbHVlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnRGVmYXVsdFZhbHVlTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0RlZmF1bHRWYWx1ZU5vZGUnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLW1vZGlmeS1hY3Rpb24tcGFyc2VyLmQudHNcIiAvPlxuaW1wb3J0IHsgT05fTU9ESUZZX0ZPUkVJR05fQUNUSU9OUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZWZlcmVuY2VzLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uKGFjdGlvbikge1xuICAgIGlmIChPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TLmluY2x1ZGVzKGFjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGFjdGlvbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIE9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiAke2FjdGlvbn1gKTtcbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENoZWNrQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc05vZGUsIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmZXJlbmNlcy1ub2RlLmpzJztcbmltcG9ydCB7IFNlbGVjdEFsbE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9zZWxlY3QtYWxsLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VTdHJpbmdSZWZlcmVuY2UgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1kZWZpbml0aW9uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBHZW5lcmF0ZWROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZ2VuZXJhdGVkLW5vZGUuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFZhbHVlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2RlZmF1bHQtdmFsdWUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYGF1dG9faW5jcmVtZW50YCBvciBgYXV0b2luY3JlbWVudGAgdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9uXG4gICAgICogZGVwZW5kaW5nIG9uIHRoZSBkaWFsZWN0LlxuICAgICAqXG4gICAgICogU29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgZG9uJ3Qgc3VwcG9ydCB0aGlzLiBPbiBQb3N0Z3JlU1FMXG4gICAgICogeW91IGNhbiB1c2UgdGhlIGBzZXJpYWxgIG9yIGBiaWdzZXJpYWxgIGRhdGEgdHlwZSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuYXV0b0luY3JlbWVudCgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5IGF1dG9faW5jcmVtZW50XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGF1dG9JbmNyZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgYXV0b0luY3JlbWVudDogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBjb2x1bW4gYW4gaWRlbnRpdHkgY29sdW1uLlxuICAgICAqXG4gICAgICogVGhpcyBvbmx5IHdvcmtzIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBNUyBTUUwgU2VydmVyIChNU1NRTCkuXG4gICAgICpcbiAgICAgKiBGb3IgUG9zdGdyZVNRTCdzIGBnZW5lcmF0ZWQgYWx3YXlzIGFzIGlkZW50aXR5YCB1c2Uge0BsaW5rIGdlbmVyYXRlZEFsd2F5c0FzSWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuaWRlbnRpdHkoKS5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTVNTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgaWRlbnRpdHkgcHJpbWFyeSBrZXlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWRlbnRpdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgaWRlbnRpdHk6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXkgdXNlIHRoZVxuICAgICAqIHtAbGluayBDcmVhdGVUYWJsZUJ1aWxkZXIuYWRkUHJpbWFyeUtleUNvbnN0cmFpbnR9IG1ldGhvZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqL1xuICAgIHByaW1hcnlLZXkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgcHJpbWFyeUtleTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGV0XCIgKFxuICAgICAqICAgXCJvd25lcl9pZFwiIGludGVnZXIgcmVmZXJlbmNlcyBcInBlcnNvblwiIChcImlkXCIpXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZmVyZW5jZXMocmVmKSB7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBwYXJzZVN0cmluZ1JlZmVyZW5jZShyZWYpO1xuICAgICAgICBpZiAoIXJlZmVyZW5jZXMudGFibGUgfHwgU2VsZWN0QWxsTm9kZS5pcyhyZWZlcmVuY2VzLmNvbHVtbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBjYWxsIHJlZmVyZW5jZXMoJyR7cmVmfScpLiBUaGUgcmVmZXJlbmNlIG11c3QgaGF2ZSBmb3JtYXQgdGFibGUuY29sdW1uIG9yIHNjaGVtYS50YWJsZS5jb2x1bW5gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICByZWZlcmVuY2VzOiBSZWZlcmVuY2VzTm9kZS5jcmVhdGUocmVmZXJlbmNlcy50YWJsZSwgW1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuY29sdW1uLFxuICAgICAgICAgICAgXSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhbiBgb24gZGVsZXRlYCBjb25zdHJhaW50IGZvciB0aGUgZm9yZWlnbiBrZXkgY29sdW1uLlxuICAgICAqXG4gICAgICogSWYgeW91ciBkYXRhYmFzZSBlbmdpbmUgZG9lc24ndCBzdXBwb3J0IGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uIChsaWtlIE15U1FMIDUpIHlvdSBuZWVkIHRvIGNhbGwgdGhlIHRhYmxlIGxldmVsXG4gICAgICoge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH0gbWV0aG9kIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnb3duZXJfaWQnLFxuICAgICAqICAgICAnaW50ZWdlcicsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXRcIiAoXG4gICAgICogICBcIm93bmVyX2lkXCIgaW50ZWdlciByZWZlcmVuY2VzIFwicGVyc29uXCIgKFwiaWRcIikgb24gZGVsZXRlIGNhc2NhZGVcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgb25EZWxldGUob25EZWxldGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb24gZGVsZXRlIGNvbnN0cmFpbnQgY2FuIG9ubHkgYmUgYWRkZWQgZm9yIGZvcmVpZ24ga2V5cycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNsb25lV2l0aE9uRGVsZXRlKHRoaXMuI25vZGUucmVmZXJlbmNlcywgcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25EZWxldGUpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGFuIGBvbiB1cGRhdGVgIGNvbnN0cmFpbnQgZm9yIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBJZiB5b3VyIGRhdGFiYXNlIGVuZ2luZSBkb2Vzbid0IHN1cHBvcnQgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgaW4gdGhlXG4gICAgICogY29sdW1uIGRlZmluaXRpb24gKGxpa2UgTXlTUUwgNSkgeW91IG5lZWQgdG8gY2FsbCB0aGUgdGFibGUgbGV2ZWxcbiAgICAgKiB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSBtZXRob2QgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oXG4gICAgICogICAgICdvd25lcl9pZCcsXG4gICAgICogICAgICdpbnRlZ2VyJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpLm9uVXBkYXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBldFwiIChcbiAgICAgKiAgIFwib3duZXJfaWRcIiBpbnRlZ2VyIHJlZmVyZW5jZXMgXCJwZXJzb25cIiAoXCJpZFwiKSBvbiB1cGRhdGUgY2FzY2FkZVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBvblVwZGF0ZShvblVwZGF0ZSkge1xuICAgICAgICBpZiAoIXRoaXMuI25vZGUucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbiB1cGRhdGUgY29uc3RyYWludCBjYW4gb25seSBiZSBhZGRlZCBmb3IgZm9yZWlnbiBrZXlzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogUmVmZXJlbmNlc05vZGUuY2xvbmVXaXRoT25VcGRhdGUodGhpcy4jbm9kZS5yZWZlcmVuY2VzLCBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvblVwZGF0ZSkpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB1bmlxdWUgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2VtYWlsJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wudW5pcXVlKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBlbWFpbGAgdmFyY2hhcigyNTUpIHVuaXF1ZVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB1bmlxdWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgdW5pcXVlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGBub3QgbnVsbGAgY29uc3RyYWludCBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcigyNTUpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBmaXJzdF9uYW1lYCB2YXJjaGFyKDI1NSkgbm90IG51bGxcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbm90TnVsbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBub3ROdWxsOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGB1bnNpZ25lZGAgbW9kaWZpZXIgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIE15U1FMLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignYWdlJywgJ2ludGVnZXInLCBjb2wgPT4gY29sLnVuc2lnbmVkKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBhZ2VgIGludGVnZXIgdW5zaWduZWRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5zaWduZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgdW5zaWduZWQ6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgZGVmYXVsdCB2YWx1ZSBjb25zdHJhaW50IGZvciB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignbnVtYmVyX29mX2xlZ3MnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5kZWZhdWx0VG8oNCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXRgIChcbiAgICAgKiAgIGBudW1iZXJfb2ZfbGVnc2AgaW50ZWdlciBkZWZhdWx0IDRcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBWYWx1ZXMgcGFzc2VkIHRvIGBkZWZhdWx0VG9gIGFyZSBpbnRlcnByZXRlZCBhcyB2YWx1ZSBsaXRlcmFscyBieSBkZWZhdWx0LiBZb3UgY2FuIGRlZmluZVxuICAgICAqIGFuIGFyYml0cmFyeSBTUUwgZXhwcmVzc2lvbiB1c2luZyB0aGUge0BsaW5rIHNxbH0gdGVtcGxhdGUgdGFnOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbihcbiAgICAgKiAgICAgJ2NyZWF0ZWRfYXQnLFxuICAgICAqICAgICAndGltZXN0YW1wJyxcbiAgICAgKiAgICAgKGNvbCkgPT4gY29sLmRlZmF1bHRUbyhzcWxgQ1VSUkVOVF9USU1FU1RBTVBgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGV0YCAoXG4gICAgICogICBgY3JlYXRlZF9hdGAgdGltZXN0YW1wIGRlZmF1bHQgQ1VSUkVOVF9USU1FU1RBTVBcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZGVmYXVsdFRvKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGRlZmF1bHRUbzogRGVmYXVsdFZhbHVlTm9kZS5jcmVhdGUocGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNoZWNrIGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGV0JylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInLCAoY29sKSA9PlxuICAgICAqICAgICBjb2wuY2hlY2soc3FsYG51bWJlcl9vZl9sZWdzIDwgNWApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXRgIChcbiAgICAgKiAgIGBudW1iZXJfb2ZfbGVnc2AgaW50ZWdlciBjaGVjayAobnVtYmVyX29mX2xlZ3MgPCA1KVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjaGVjayhleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGNoZWNrOiBDaGVja0NvbnN0cmFpbnROb2RlLmNyZWF0ZShleHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgY29sdW1uIGEgZ2VuZXJhdGVkIGNvbHVtbiB1c2luZyBhIGBnZW5lcmF0ZWQgYWx3YXlzIGFzYCBzdGF0ZW1lbnQuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2Z1bGxfbmFtZScsICd2YXJjaGFyKDI1NSknLFxuICAgICAqICAgICAoY29sKSA9PiBjb2wuZ2VuZXJhdGVkQWx3YXlzQXMoc3FsYGNvbmNhdChmaXJzdF9uYW1lLCAnICcsIGxhc3RfbmFtZSlgKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZnVsbF9uYW1lYCB2YXJjaGFyKDI1NSkgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKSlcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2VuZXJhdGVkQWx3YXlzQXMoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlV2l0aEV4cHJlc3Npb24oZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYGdlbmVyYXRlZCBhbHdheXMgYXMgaWRlbnRpdHlgIHNwZWNpZmllci5cbiAgICAgKlxuICAgICAqIFRoaXMgb25seSB3b3JrcyBvbiBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTC5cbiAgICAgKlxuICAgICAqIEZvciBNUyBTUUwgU2VydmVyIChNU1NRTCkncyBpZGVudGl0eSBjb2x1bW4gdXNlIHtAbGluayBpZGVudGl0eX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5nZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5KCkucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIFwicGVyc29uXCIgKFxuICAgICAqICAgXCJpZFwiIGludGVnZXIgZ2VuZXJhdGVkIGFsd2F5cyBhcyBpZGVudGl0eSBwcmltYXJ5IGtleVxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRBbHdheXNBc0lkZW50aXR5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY3JlYXRlKHsgaWRlbnRpdHk6IHRydWUsIGFsd2F5czogdHJ1ZSB9KSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYXMgaWRlbnRpdHlgIHNwZWNpZmllciBvbiBzdXBwb3J0ZWQgZGlhbGVjdHMuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiBGb3IgTVMgU1FMIFNlcnZlciAoTVNTUUwpJ3MgaWRlbnRpdHkgY29sdW1uIHVzZSB7QGxpbmsgaWRlbnRpdHl9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wuZ2VuZXJhdGVkQnlEZWZhdWx0QXNJZGVudGl0eSgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBcInBlcnNvblwiIChcbiAgICAgKiAgIFwiaWRcIiBpbnRlZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0IGFzIGlkZW50aXR5IHByaW1hcnkga2V5XG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGdlbmVyYXRlZEJ5RGVmYXVsdEFzSWRlbnRpdHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkTm9kZS5jcmVhdGUoeyBpZGVudGl0eTogdHJ1ZSwgYnlEZWZhdWx0OiB0cnVlIH0pLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2VzIGEgZ2VuZXJhdGVkIGNvbHVtbiBzdG9yZWQgaW5zdGVhZCBvZiB2aXJ0dWFsLiBUaGlzIG1ldGhvZCBjYW4gb25seVxuICAgICAqIGJlIHVzZWQgd2l0aCB7QGxpbmsgZ2VuZXJhdGVkQWx3YXlzQXN9XG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmdWxsX25hbWUnLCAndmFyY2hhcigyNTUpJywgKGNvbCkgPT4gY29sXG4gICAgICogICAgIC5nZW5lcmF0ZWRBbHdheXNBcyhzcWxgY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKWApXG4gICAgICogICAgIC5zdG9yZWQoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKE15U1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0YWJsZSBgcGVyc29uYCAoXG4gICAgICogICBgZnVsbF9uYW1lYCB2YXJjaGFyKDI1NSkgZ2VuZXJhdGVkIGFsd2F5cyBhcyAoY29uY2F0KGZpcnN0X25hbWUsICcgJywgbGFzdF9uYW1lKSkgc3RvcmVkXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHN0b3JlZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNub2RlLmdlbmVyYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdG9yZWQoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgZ2VuZXJhdGVkQWx3YXlzQXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUuZ2VuZXJhdGVkLCB7XG4gICAgICAgICAgICAgICAgc3RvcmVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHJpZ2h0IGFmdGVyIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnZmlyc3RfbmFtZScsXG4gICAgICogICAgICd2YXJjaGFyKDM2KScsXG4gICAgICogICAgIChjb2wpID0+IGNvbC5tb2RpZnlGcm9udChzcWxgY29sbGF0ZSB1dGY4bWI0X2dlbmVyYWxfY2lgKS5ub3ROdWxsKClcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoMzYpIGNvbGxhdGUgdXRmOG1iNF9nZW5lcmFsX2NpIG5vdCBudWxsXG4gICAgICogKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIG1vZGlmeUZyb250KG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoRnJvbnRNb2RpZmllcih0aGlzLiNub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHNwZWNpZmllci5cbiAgICAgKiBTaG91bGQgYmUgdXNlZCB3aXRoIGB1bmlxdWVgIGNvbnN0cmFpbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoMzApJywgY29sID0+IGNvbC51bmlxdWUoKS5udWxsc05vdERpc3RpbmN0KCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiIHZhcmNoYXIoMzApIHVuaXF1ZSBudWxscyBub3QgZGlzdGluY3RcbiAgICAgKiApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBgaWYgbm90IGV4aXN0c2Agc3BlY2lmaWVyLiBUaGlzIG9ubHkgd29ya3MgZm9yIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2VtYWlsJywgJ3ZhcmNoYXIoMjU1KScsIGNvbCA9PiBjb2wudW5pcXVlKCkuaWZOb3RFeGlzdHMoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGFsdGVyIHRhYmxlIFwicGVyc29uXCIgYWRkIGNvbHVtbiBpZiBub3QgZXhpc3RzIFwiZW1haWxcIiB2YXJjaGFyKDI1NSkgdW5pcXVlXG4gICAgICogYGBgXG4gICAgICovXG4gICAgaWZOb3RFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgaWZOb3RFeGlzdHM6IHRydWUgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBTUUwgdG8gdGhlIGVuZCBvZiB0aGUgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKFxuICAgICAqICAgICAnYWdlJyxcbiAgICAgKiAgICAgJ2ludGVnZXInLFxuICAgICAqICAgICBjb2wgPT4gY29sLnVuc2lnbmVkKClcbiAgICAgKiAgICAgICAubm90TnVsbCgpXG4gICAgICogICAgICAgLm1vZGlmeUVuZChzcWxgY29tbWVudCAke3NxbC5saXQoJ2l0IGlzIG5vdCBwb2xpdGUgdG8gYXNrIGEgd29tYW4gaGVyIGFnZScpfWApXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIHRhYmxlIGBwZXJzb25gIChcbiAgICAgKiAgIGBpZGAgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIGBhZ2VgIGludGVnZXIgdW5zaWduZWQgbm90IG51bGwgY29tbWVudCAnaXQgaXMgbm90IHBvbGl0ZSB0byBhc2sgYSB3b21hbiBoZXIgYWdlJ1xuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlFbmQobW9kaWZpZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jbG9uZVdpdGhFbmRNb2RpZmllcih0aGlzLiNub2RlLCBtb2RpZmllci50b09wZXJhdGlvbk5vZGUoKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9tb2RpZnktY29sdW1uLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgTW9kaWZ5Q29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnTW9kaWZ5Q29sdW1uTm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1uKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ01vZGlmeUNvbHVtbk5vZGUnLFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVmZXJlbmNlc05vZGUgfSBmcm9tICcuL3JlZmVyZW5jZXMtbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRm9yZWlnbktleUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKHNvdXJjZUNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBjb25zdHJhaW50TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdGb3JlaWduS2V5Q29uc3RyYWludE5vZGUnLFxuICAgICAgICAgICAgY29sdW1uczogc291cmNlQ29sdW1ucyxcbiAgICAgICAgICAgIHJlZmVyZW5jZXM6IFJlZmVyZW5jZXNOb2RlLmNyZWF0ZSh0YXJnZXRUYWJsZSwgdGFyZ2V0Q29sdW1ucyksXG4gICAgICAgICAgICBuYW1lOiBjb25zdHJhaW50TmFtZSA/IElkZW50aWZpZXJOb2RlLmNyZWF0ZShjb25zdHJhaW50TmFtZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKG5vZGUsIHByb3BzKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAgLi4ubm9kZSxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1tb2RpZnktYWN0aW9uLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICBvbkRlbGV0ZShvbkRlbGV0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIG9uRGVsZXRlOiBwYXJzZU9uTW9kaWZ5Rm9yZWlnbkFjdGlvbihvbkRlbGV0ZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgb25VcGRhdGUob25VcGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBvblVwZGF0ZTogcGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24ob25VcGRhdGUpLFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcihGb3JlaWduS2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hZGQtY29uc3RyYWludC1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFkZENvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdBZGRDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBjb25zdHJhaW50LFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3VuaXF1ZS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBVbmlxdWVDb25zdHJhaW50Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnVW5pcXVlQ29uc3RyYWludE5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lLCBudWxsc05vdERpc3RpbmN0KSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ1VuaXF1ZUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdCxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgobm9kZSwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBEcm9wQ29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0Ryb3BDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcENvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChkcm9wQ29uc3RyYWludCwgcHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wQ29uc3RyYWludCxcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLWNvbHVtbi1ub2RlLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4vY29sdW1uLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFsdGVyQ29sdW1uTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQWx0ZXJDb2x1bW5Ob2RlJztcbiAgICB9LFxuICAgIGNyZWF0ZShjb2x1bW4sIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICAgICAga2luZDogJ0FsdGVyQ29sdW1uTm9kZScsXG4gICAgICAgICAgICBjb2x1bW46IENvbHVtbk5vZGUuY3JlYXRlKGNvbHVtbiksXG4gICAgICAgICAgICBbcHJvcF06IHZhbHVlLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2FsdGVyLWNvbHVtbi1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQWx0ZXJDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24sIH0gZnJvbSAnLi4vcGFyc2VyL2RhdGEtdHlwZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9kZWZhdWx0LXZhbHVlLXBhcnNlci5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJDb2x1bW5CdWlsZGVyIHtcbiAgICAjY29sdW1uO1xuICAgIGNvbnN0cnVjdG9yKGNvbHVtbikge1xuICAgICAgICB0aGlzLiNjb2x1bW4gPSBjb2x1bW47XG4gICAgfVxuICAgIHNldERhdGFUeXBlKGRhdGFUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkYXRhVHlwZScsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpO1xuICAgIH1cbiAgICBzZXREZWZhdWx0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdzZXREZWZhdWx0JywgcGFyc2VEZWZhdWx0VmFsdWVFeHByZXNzaW9uKHZhbHVlKSkpO1xuICAgIH1cbiAgICBkcm9wRGVmYXVsdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlcmVkQ29sdW1uQnVpbGRlcihBbHRlckNvbHVtbk5vZGUuY3JlYXRlKHRoaXMuI2NvbHVtbiwgJ2Ryb3BEZWZhdWx0JywgdHJ1ZSkpO1xuICAgIH1cbiAgICBzZXROb3ROdWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyZWRDb2x1bW5CdWlsZGVyKEFsdGVyQ29sdW1uTm9kZS5jcmVhdGUodGhpcy4jY29sdW1uLCAnc2V0Tm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgZHJvcE5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJlZENvbHVtbkJ1aWxkZXIoQWx0ZXJDb2x1bW5Ob2RlLmNyZWF0ZSh0aGlzLiNjb2x1bW4sICdkcm9wTm90TnVsbCcsIHRydWUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbn1cbi8qKlxuICogQWxsb3dzIHVzIHRvIGZvcmNlIGNvbnN1bWVycyB0byBkbyBleGFjdGx5IG9uZSBhbHRlcmF0aW9uIHRvIGEgY29sdW1uLlxuICpcbiAqIE9uZSBjYW5ub3QgZG8gbm8gYWx0ZXJhdGlvbnM6XG4gKlxuICogYGBgdHNcbiAqIGF3YWl0IGRiLnNjaGVtYVxuICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAqIC8vICAuZXhlY3V0ZSgpIC8vIFByb3BlcnR5ICdleGVjdXRlJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiBgYGBcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYykgLy8gVHlwZSAnQWx0ZXJDb2x1bW5CdWlsZGVyJyBpcyBub3QgYXNzaWduYWJsZSB0byB0eXBlICdBbHRlcmVkQ29sdW1uQnVpbGRlcicuXG4gKiAvLyAgLmV4ZWN1dGUoKVxuICogYGBgXG4gKlxuICogT25lIGNhbm5vdCBkbyBtdWx0aXBsZSBhbHRlcmF0aW9uczpcbiAqXG4gKiBgYGB0c1xuICogYXdhaXQgZGIuc2NoZW1hXG4gKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICogLy8gIC5hbHRlckNvbHVtbignYWdlJywgKGFjKSA9PiBhYy5kcm9wTm90TnVsbCgpLnNldE5vdE51bGwoKSkgLy8gUHJvcGVydHkgJ3NldE5vdE51bGwnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgJ0FsdGVyZWRDb2x1bW5CdWlsZGVyJy5cbiAqIC8vICAuZXhlY3V0ZSgpXG4gKiBgYGBcbiAqXG4gKiBXaGljaCB3b3VsZCBub3cgdGhyb3cgYSBjb21waWxhdGlvbiBlcnJvciwgaW5zdGVhZCBvZiBhIHJ1bnRpbWUgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlcmVkQ29sdW1uQnVpbGRlciB7XG4gICAgI2FsdGVyQ29sdW1uTm9kZTtcbiAgICBjb25zdHJ1Y3RvcihhbHRlckNvbHVtbk5vZGUpIHtcbiAgICAgICAgdGhpcy4jYWx0ZXJDb2x1bW5Ob2RlID0gYWx0ZXJDb2x1bW5Ob2RlO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhbHRlckNvbHVtbk5vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1leGVjdXRvci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlRXhlY3V0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYWRkLWZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWRkLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIG9uRGVsZXRlKG9uRGVsZXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5vbkRlbGV0ZShvbkRlbGV0ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBvblVwZGF0ZShvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcjogdGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIub25VcGRhdGUob25VcGRhdGUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmRlZmVycmFibGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5ub3REZWZlcnJhYmxlKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlEZWZlcnJlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgY29uc3RyYWludEJ1aWxkZXI6IHRoaXMuI3Byb3BzLmNvbnN0cmFpbnRCdWlsZGVyLmluaXRpYWxseURlZmVycmVkKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRCdWlsZGVyOiB0aGlzLiNwcm9wcy5jb25zdHJhaW50QnVpbGRlci5pbml0aWFsbHlJbW1lZGlhdGUoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkoQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUodGhpcy4jcHJvcHMuY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1kcm9wLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdjYXNjYWRlJyxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzdHJpY3QoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGRyb3BDb25zdHJhaW50OiBEcm9wQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuZHJvcENvbnN0cmFpbnQsIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXI6ICdyZXN0cmljdCcsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi9jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1ByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlJyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGZyZWV6ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSkpLFxuICAgICAgICAgICAgbmFtZTogY29uc3RyYWludE5hbWUgPyBJZGVudGlmaWVyTm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpIDogdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHsgLi4ubm9kZSwgLi4ucHJvcHMgfSk7XG4gICAgfSxcbn0pO1xuLyoqXG4gKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgYSB0eXBvIGluIHRoZSBjb2RlYmFzZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZX0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFByaW1hcnlDb25zdHJhaW50Tm9kZSA9IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWRkLWluZGV4LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBBZGRJbmRleE5vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ0FkZEluZGV4Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdBZGRJbmRleE5vZGUnLFxuICAgICAgICAgICAgbmFtZTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChub2RlLCBwcm9wcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhDb2x1bW5zKG5vZGUsIGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgICAgY29sdW1uczogWy4uLihub2RlLmNvbHVtbnMgfHwgW10pLCAuLi5jb2x1bW5zXSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9hbHRlci10YWJsZS1hZGQtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvYWx0ZXItdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5hbHRlclRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZEluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5jb2x1bW4oJ2VtYWlsJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKGBlbWFpbGApXG4gICAgICogYGBgXG4gICAgICovXG4gICAgdW5pcXVlKCkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgaW5kZXguXG4gICAgICpcbiAgICAgKiBBbHNvIHNlZSB7QGxpbmsgY29sdW1uc30gZm9yIGFkZGluZyBtdWx0aXBsZSBjb2x1bW5zIGF0IG9uY2Ugb3Ige0BsaW5rIGV4cHJlc3Npb259XG4gICAgICogZm9yIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdmaXJzdF9uYW1lJylcbiAgICAgKiAgIC5jb2x1bW4oJ2FnZSBkZXNjJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZS5hZGRJbmRleCwgW1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleCcpXG4gICAgICogICAuY29sdW1ucyhbJ2ZpcnN0X25hbWUnLCAnYWdlIGRlc2MnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgaW5kZXggYHBlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXhgIChgZmlyc3RfbmFtZWAsIGBhZ2VgIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1ucyhjb2x1bW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLmFkZEluZGV4LCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhbiBhcmJpdHJhcnkgZXhwcmVzc2lvbiBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB7XHUwMEEwc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRJbmRleCgncGVyc29uX2ZpcnN0X25hbWVfaW5kZXgnKVxuICAgICAqICAgLmV4cHJlc3Npb24oc3FsPGJvb2xlYW4+YChmaXJzdF9uYW1lIDwgJ1NhbWknKWApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgYWRkIGluZGV4IGBwZXJzb25fZmlyc3RfbmFtZV9pbmRleGAgKChmaXJzdF9uYW1lIDwgJ1NhbWknKSlcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBleHByZXNzaW9uKGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkSW5kZXg6IEFkZEluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIFtcbiAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi50b09wZXJhdGlvbk5vZGUoKSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdXNpbmcoaW5kZXhUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUFkZEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZEluZGV4OiBBZGRJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUuYWRkSW5kZXgsIHtcbiAgICAgICAgICAgICAgICAgICAgdXNpbmc6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChpbmRleFR5cGUpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vdW5pcXVlLWNvbnN0cmFpbnQtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIHtcbiAgICAjbm9kZTtcbiAgICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgICAgIHRoaXMuI25vZGUgPSBub2RlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHRvIHRoZSB1bmlxdWUgY29uc3RyYWludCBkZWZpbml0aW9uXG4gICAgICpcbiAgICAgKiBTdXBwb3J0ZWQgYnkgUG9zdGdyZVNRTCBkaWFsZWN0IG9ubHlcbiAgICAgKi9cbiAgICBudWxsc05vdERpc3RpbmN0KCkge1xuICAgICAgICByZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlcihVbmlxdWVDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBudWxsc05vdERpc3RpbmN0OiB0cnVlIH0pKTtcbiAgICB9XG4gICAgZGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHsgZGVmZXJyYWJsZTogdHJ1ZSB9KSk7XG4gICAgfVxuICAgIG5vdERlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBpbml0aWFsbHlJbW1lZGlhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyKFVuaXF1ZUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7XG4gICAgICAgICAgICBpbml0aWFsbHlEZWZlcnJlZDogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcHJpbWFyeS1rZXktY29uc3RyYWludC1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIge1xuICAgICNub2RlO1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy4jbm9kZSA9IG5vZGU7XG4gICAgfVxuICAgIGRlZmVycmFibGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwgeyBkZWZlcnJhYmxlOiB0cnVlIH0pKTtcbiAgICB9XG4gICAgbm90RGVmZXJyYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIoUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlLmNsb25lV2l0aCh0aGlzLiNub2RlLCB7IGRlZmVycmFibGU6IGZhbHNlIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5RGVmZXJyZWQoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jbG9uZVdpdGgodGhpcy4jbm9kZSwge1xuICAgICAgICAgICAgaW5pdGlhbGx5RGVmZXJyZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgaW5pdGlhbGx5SW1tZWRpYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlcihQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUuY2xvbmVXaXRoKHRoaXMuI25vZGUsIHtcbiAgICAgICAgICAgIGluaXRpYWxseURlZmVycmVkOiBmYWxzZSxcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25vZGU7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgQ2hlY2tDb25zdHJhaW50QnVpbGRlciB7XG4gICAgI25vZGU7XG4gICAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgICAgICB0aGlzLiNub2RlID0gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNub2RlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcmVuYW1lLWNvbnN0cmFpbnQtbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IElkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9pZGVudGlmaWVyLW5vZGUuanMnO1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFJlbmFtZUNvbnN0cmFpbnROb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdSZW5hbWVDb25zdHJhaW50Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUob2xkTmFtZSwgbmV3TmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZW5hbWVDb25zdHJhaW50Tm9kZScsXG4gICAgICAgICAgICBvbGROYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUob2xkTmFtZSksXG4gICAgICAgICAgICBuZXdOYW1lOiBJZGVudGlmaWVyTm9kZS5jcmVhdGUobmV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH0sXG59KTtcbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vYWx0ZXItdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFkZENvbHVtbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hbHRlci10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IENvbHVtbkRlZmluaXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLWRlZmluaXRpb24tbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlbmFtZS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciwgfSBmcm9tICcuL2NvbHVtbi1kZWZpbml0aW9uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgTW9kaWZ5Q29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL21vZGlmeS1jb2x1bW4tbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9mb3JlaWduLWtleS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWRkQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9hZGQtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvdW5pcXVlLWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY2hlY2stY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY29sdW1uLW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgRHJvcENvbnN0cmFpbnROb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQWx0ZXJDb2x1bW5CdWlsZGVyLCB9IGZyb20gJy4vYWx0ZXItY29sdW1uLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQWx0ZXJUYWJsZUV4ZWN1dG9yIH0gZnJvbSAnLi9hbHRlci10YWJsZS1leGVjdXRvci5qcyc7XG5pbXBvcnQgeyBBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1hZGQtZm9yZWlnbi1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVEcm9wQ29uc3RyYWludEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWRyb3AtY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFkZEluZGV4Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FkZC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIgfSBmcm9tICcuL2FsdGVyLXRhYmxlLWFkZC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vcHJpbWFyeS1rZXktY29uc3RyYWludC1idWlsZGVyLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludEJ1aWxkZXIsIH0gZnJvbSAnLi9jaGVjay1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVuYW1lQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yZW5hbWUtY29uc3RyYWludC1ub2RlLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBhbHRlciB0YWJsZWAgcXVlcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbHRlclRhYmxlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgcmVuYW1lVG8obmV3VGFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lVG86IHBhcnNlVGFibGUobmV3VGFibGVOYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0U2NoZW1hKG5ld1NjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNldFNjaGVtYTogSWRlbnRpZmllck5vZGUuY3JlYXRlKG5ld1NjaGVtYSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRVbmlxdWVDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVFeGVjdXRvcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IEFsdGVyVGFibGVOb2RlLmNsb25lV2l0aFRhYmxlUHJvcHModGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGFkZENvbnN0cmFpbnQ6IEFkZENvbnN0cmFpbnROb2RlLmNyZWF0ZSh1bmlxdWVDb25zdHJhaW50QnVpbGRlci50b09wZXJhdGlvbk5vZGUoKSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZENoZWNrQ29uc3RyYWludH1cbiAgICAgKi9cbiAgICBhZGRDaGVja0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNoZWNrRXhwcmVzc2lvbiwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGNvbnN0cmFpbnRCdWlsZGVyID0gYnVpbGQobmV3IENoZWNrQ29uc3RyYWludEJ1aWxkZXIoQ2hlY2tDb25zdHJhaW50Tm9kZS5jcmVhdGUoY2hlY2tFeHByZXNzaW9uLnRvT3BlcmF0aW9uTm9kZSgpLCBjb25zdHJhaW50TmFtZSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRDb25zdHJhaW50OiBBZGRDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIENyZWF0ZVRhYmxlQnVpbGRlci5hZGRGb3JlaWduS2V5Q29uc3RyYWludH1cbiAgICAgKlxuICAgICAqIFVubGlrZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50fSB0aGlzIG1ldGhvZCByZXR1cm5zXG4gICAgICogdGhlIGNvbnN0cmFpbnQgYnVpbGRlciBhbmQgZG9lc24ndCB0YWtlIGEgY2FsbGJhY2sgYXMgdGhlIGxhc3QgYXJndW1lbnQuIFRoaXNcbiAgICAgKiBpcyBiZWNhdXNlIHlvdSBjYW4gb25seSBhZGQgb25lIGNvbHVtbiBwZXIgYEFMVEVSIFRBQkxFYCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRGb3JlaWduS2V5Q29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY29sdW1ucywgdGFyZ2V0VGFibGUsIHRhcmdldENvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBjb25zdHJhaW50QnVpbGRlcixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLmFkZFByaW1hcnlLZXlDb25zdHJhaW50fVxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUV4ZWN1dG9yKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgYWRkQ29uc3RyYWludDogQWRkQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgZHJvcENvbnN0cmFpbnQ6IERyb3BDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29uc3RyYWludE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb25zdHJhaW50KG9sZE5hbWUsIG5ld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoVGFibGVQcm9wcyh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQ29uc3RyYWludDogUmVuYW1lQ29uc3RyYWludE5vZGUuY3JlYXRlKG9sZE5hbWUsIG5ld05hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGFkZCBpbmRleCB0byB0YWJsZS5cbiAgICAgKlxuICAgICAqICAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmFsdGVyVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuY29sdW1uKCdlbWFpbCcpXG4gICAgICogICAudW5pcXVlKClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBhbHRlciB0YWJsZSBgcGVyc29uYCBhZGQgdW5pcXVlIGluZGV4IGBwZXJzb25fZW1haWxfaW5kZXhgIChgZW1haWxgKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZEluZGV4KGluZGV4TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhZGRJbmRleDogQWRkSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRyb3AgaW5kZXggZnJvbSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBkYi5zY2hlbWEuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9lbWFpbF9pbmRleCcpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoTXlTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogYWx0ZXIgdGFibGUgYHBlcnNvbmAgZHJvcCBpbmRleCBgdGVzdF9maXJzdF9uYW1lX2luZGV4YFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlRXhlY3V0b3Ioe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhUYWJsZVByb3BzKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXg6IERyb3BJbmRleE5vZGUuY3JlYXRlKGluZGV4TmFtZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgQ3JlYXRlVGFibGVCdWlsZGVyLiRjYWxsfVxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFsdGVyQ29sdW1uKGNvbHVtbiwgYWx0ZXJhdGlvbikge1xuICAgICAgICBjb25zdCBidWlsZGVyID0gYWx0ZXJhdGlvbihuZXcgQWx0ZXJDb2x1bW5CdWlsZGVyKGNvbHVtbikpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZHJvcENvbHVtbihjb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBEcm9wQ29sdW1uTm9kZS5jcmVhdGUoY29sdW1uKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZW5hbWVDb2x1bW4oY29sdW1uLCBuZXdDb2x1bW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBSZW5hbWVDb2x1bW5Ob2RlLmNyZWF0ZShjb2x1bW4sIG5ld0NvbHVtbikpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYWRkQ29sdW1uKGNvbHVtbk5hbWUsIGRhdGFUeXBlLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlcihDb2x1bW5EZWZpbml0aW9uTm9kZS5jcmVhdGUoY29sdW1uTmFtZSwgcGFyc2VEYXRhVHlwZUV4cHJlc3Npb24oZGF0YVR5cGUpKSkpO1xuICAgICAgICByZXR1cm4gbmV3IEFsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBBbHRlclRhYmxlTm9kZS5jbG9uZVdpdGhDb2x1bW5BbHRlcmF0aW9uKHRoaXMuI3Byb3BzLm5vZGUsIEFkZENvbHVtbk5vZGUuY3JlYXRlKGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1vZGlmeUNvbHVtbihjb2x1bW5OYW1lLCBkYXRhVHlwZSwgYnVpbGQgPSBub29wKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBidWlsZChuZXcgQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIoQ29sdW1uRGVmaW5pdGlvbk5vZGUuY3JlYXRlKGNvbHVtbk5hbWUsIHBhcnNlRGF0YVR5cGVFeHByZXNzaW9uKGRhdGFUeXBlKSkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY2xvbmVXaXRoQ29sdW1uQWx0ZXJhdGlvbih0aGlzLiNwcm9wcy5ub2RlLCBNb2RpZnlDb2x1bW5Ob2RlLmNyZWF0ZShidWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kLnRzXCIgLz5cbmltcG9ydCB7IE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdGlvbi1ub2RlLXRyYW5zZm9ybWVyLmpzJztcbmltcG9ydCB7IFZhbHVlTGlzdE5vZGUgfSBmcm9tICcuLi8uLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi4vLi4vb3BlcmF0aW9uLW5vZGUvdmFsdWUtbm9kZS5qcyc7XG4vKipcbiAqIFRyYW5zZm9ybXMgYWxsIFZhbHVlTm9kZXMgdG8gaW1tZWRpYXRlLlxuICpcbiAqIFdBUk5JTkchIFRoaXMgc2hvdWxkIG5ldmVyIGJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFVzZXJzIHNob3VsZCBuZXZlciB1c2UgdGhpcy5cbiAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciBleHRlbmRzIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciB7XG4gICAgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTGlzdE5vZGUuY3JlYXRlKG5vZGUudmFsdWVzLm1hcChWYWx1ZU5vZGUuY3JlYXRlSW1tZWRpYXRlKSk7XG4gICAgfVxuICAgIHRyYW5zZm9ybVZhbHVlKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUobm9kZS52YWx1ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZUluZGV4Tm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtaW5kZXgtbm9kZS5qcyc7XG5pbXBvcnQgeyBSYXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmF3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VPcmRlcmVkQ29sdW1uTmFtZSwgfSBmcm9tICcuLi9wYXJzZXIvcmVmZXJlbmNlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBwYXJzZVRhYmxlIH0gZnJvbSAnLi4vcGFyc2VyL3RhYmxlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uLCB9IGZyb20gJy4uL3BhcnNlci9iaW5hcnktb3BlcmF0aW9uLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBRdWVyeU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9xdWVyeS1ub2RlLmpzJztcbmltcG9ydCB7IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS10cmFuc2Zvcm1lci5qcyc7XG5leHBvcnQgY2xhc3MgQ3JlYXRlSW5kZXhCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSBpbmRleCBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFrZXMgdGhlIGluZGV4IHVuaXF1ZS5cbiAgICAgKi9cbiAgICB1bmlxdWUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGBudWxscyBub3QgZGlzdGluY3RgIHNwZWNpZmllciB0byBpbmRleC5cbiAgICAgKiBUaGlzIG9ubHkgd29ya3Mgb24gc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogZGIuc2NoZW1hLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogIC5vbigncGVyc29uJylcbiAgICAgKiAgLmNvbHVtbignZmlyc3RfbmFtZScpXG4gICAgICogIC5udWxsc05vdERpc3RpbmN0KClcbiAgICAgKiAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfaW5kZXhcIlxuICAgICAqIG9uIFwidGVzdFwiIChcImZpcnN0X25hbWVcIilcbiAgICAgKiBudWxscyBub3QgZGlzdGluY3Q7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgbnVsbHNOb3REaXN0aW5jdCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHRhYmxlIGZvciB0aGUgaW5kZXguXG4gICAgICovXG4gICAgb24odGFibGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjb2x1bW4gdG8gdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbnN9IGZvciBhZGRpbmcgbXVsdGlwbGUgY29sdW1ucyBhdCBvbmNlIG9yIHtAbGluayBleHByZXNzaW9ufVxuICAgICAqIGZvciBzcGVjaWZ5aW5nIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgICAgICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4JylcbiAgICAgKiAgICAgICAgIC5vbigncGVyc29uJylcbiAgICAgKiAgICAgICAgIC5jb2x1bW4oJ2ZpcnN0X25hbWUnKVxuICAgICAqICAgICAgICAgLmNvbHVtbignYWdlIGRlc2MnKVxuICAgICAqICAgICAgICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGluZGV4IFwicGVyc29uX2ZpcnN0X25hbWVfYW5kX2FnZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKFwiZmlyc3RfbmFtZVwiLCBcImFnZVwiIGRlc2MpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29sdW1uKGNvbHVtbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGhDb2x1bW5zKHRoaXMuI3Byb3BzLm5vZGUsIFtcbiAgICAgICAgICAgICAgICBwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKGNvbHVtbiksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgdGhlIGluZGV4LlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIGNvbHVtbn0gZm9yIGFkZGluZyBhIHNpbmdsZSBjb2x1bW4gb3Ige0BsaW5rIGV4cHJlc3Npb259IGZvclxuICAgICAqIHNwZWNpZnlpbmcgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAgICAgICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9maXJzdF9uYW1lX2FuZF9hZ2VfaW5kZXgnKVxuICAgICAqICAgICAgICAgLm9uKCdwZXJzb24nKVxuICAgICAqICAgICAgICAgLmNvbHVtbnMoWydmaXJzdF9uYW1lJywgJ2FnZSBkZXNjJ10pXG4gICAgICogICAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9hbmRfYWdlX2luZGV4XCIgb24gXCJwZXJzb25cIiAoXCJmaXJzdF9uYW1lXCIsIFwiYWdlXCIgZGVzYylcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVJbmRleE5vZGUuY2xvbmVXaXRoQ29sdW1ucyh0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5zLm1hcChwYXJzZU9yZGVyZWRDb2x1bW5OYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gZm9yIHRoZSBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQge1x1MDBBMHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZUluZGV4KCdwZXJzb25fZmlyc3RfbmFtZV9pbmRleCcpXG4gICAgICogICAub24oJ3BlcnNvbicpXG4gICAgICogICAuZXhwcmVzc2lvbihzcWxgZmlyc3RfbmFtZSBDT0xMQVRFIFwiZmlfRklcImApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgaW5kZXggXCJwZXJzb25fZmlyc3RfbmFtZV9pbmRleFwiIG9uIFwicGVyc29uXCIgKGZpcnN0X25hbWUgQ09MTEFURSBcImZpX0ZJXCIpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZXhwcmVzc2lvbihleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNsb25lV2l0aENvbHVtbnModGhpcy4jcHJvcHMubm9kZSwgW1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHVzaW5nKGluZGV4VHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZUluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZUluZGV4Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHVzaW5nOiBSYXdOb2RlLmNyZWF0ZVdpdGhTcWwoaW5kZXhUeXBlKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2hlcmUoLi4uYXJncykge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyKCk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlSW5kZXhCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUXVlcnlOb2RlLmNsb25lV2l0aFdoZXJlKHRoaXMuI3Byb3BzLm5vZGUsIHRyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUocGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbihhcmdzKSwgdGhpcy4jcHJvcHMucXVlcnlJZCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IENyZWF0ZVNjaGVtYU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtc2NoZW1hLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmTm90RXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVNjaGVtYUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7IGlmTm90RXhpc3RzOiB0cnVlIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29uLWNvbW1pdC1hY3Rpb24tcGFyc2UuZC50c1wiIC8+XG5pbXBvcnQgeyBPTl9DT01NSVRfQUNUSU9OUywgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VPbkNvbW1pdEFjdGlvbihhY3Rpb24pIHtcbiAgICBpZiAoT05fQ09NTUlUX0FDVElPTlMuaW5jbHVkZXMoYWN0aW9uKSkge1xuICAgICAgICByZXR1cm4gYWN0aW9uO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgT25Db21taXRBY3Rpb24gJHthY3Rpb259YCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10YWJsZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ29sdW1uRGVmaW5pdGlvbk5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jb2x1bW4tZGVmaW5pdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlTm9kZSwgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBDb2x1bW5EZWZpbml0aW9uQnVpbGRlciB9IGZyb20gJy4vY29sdW1uLWRlZmluaXRpb24tYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBmcmVlemUsIG5vb3AgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBGb3JlaWduS2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9mb3JlaWduLWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgQ29sdW1uTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NvbHVtbi1ub2RlLmpzJztcbmltcG9ydCB7IEZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL2ZvcmVpZ24ta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiwgfSBmcm9tICcuLi9wYXJzZXIvZGF0YS10eXBlLXBhcnNlci5qcyc7XG5pbXBvcnQgeyBQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9wcmltYXJ5LWtleS1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgVW5pcXVlQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS91bmlxdWUtY29uc3RyYWludC1ub2RlLmpzJztcbmltcG9ydCB7IENoZWNrQ29uc3RyYWludE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jaGVjay1jb25zdHJhaW50LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VPbkNvbW1pdEFjdGlvbiB9IGZyb20gJy4uL3BhcnNlci9vbi1jb21taXQtYWN0aW9uLXBhcnNlLmpzJztcbmltcG9ydCB7IFVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciwgfSBmcm9tICcuL3VuaXF1ZS1jb25zdHJhaW50LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnLi4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciwgfSBmcm9tICcuL3ByaW1hcnkta2V5LWNvbnN0cmFpbnQtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDaGVja0NvbnN0cmFpbnRCdWlsZGVyLCB9IGZyb20gJy4vY2hlY2stY29uc3RyYWludC1idWlsZGVyLmpzJztcbi8qKlxuICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGBjcmVhdGUgdGFibGVgIHF1ZXJ5LlxuICovXG5leHBvcnQgY2xhc3MgQ3JlYXRlVGFibGVCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRhYmxlLlxuICAgICAqL1xuICAgIHRlbXBvcmFyeSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYW4gXCJvbiBjb21taXRcIiBzdGF0ZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGVtcG9yYXJ5IHRhYmxlcyBvbiBzdXBwb3J0ZWQgZGF0YWJhc2VzXG4gICAgICogbGlrZSBQb3N0Z3JlU1FMLlxuICAgICAqL1xuICAgIG9uQ29tbWl0KG9uQ29tbWl0KSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb25Db21taXQ6IHBhcnNlT25Db21taXRBY3Rpb24ob25Db21taXQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImlmIG5vdCBleGlzdHNcIiBtb2RpZmllci5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoaXMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZk5vdEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2lkJywgJ2ludGVnZXInLCAoY29sKSA9PiBjb2wuYXV0b0luY3JlbWVudCgpLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig1MCknLCAoY29sKSA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoMjU1KScpXG4gICAgICogICAuYWRkQ29sdW1uKCdiYW5rX2JhbGFuY2UnLCAnbnVtZXJpYyg4LCAyKScpXG4gICAgICogICAvLyBZb3UgY2FuIHNwZWNpZnkgYW55IGRhdGEgdHlwZSB1c2luZyB0aGUgYHNxbGAgdGFnIGlmIHRoZSB0eXBlc1xuICAgICAqICAgLy8gZG9uJ3QgaW5jbHVkZSBpdC5cbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2RhdGEnLCBzcWxgYW55X3R5cGVfaGVyZWApXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicsIChjb2wpID0+XG4gICAgICogICAgIGNvbC5yZWZlcmVuY2VzKCdwZXJzb24uaWQnKS5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBXaXRoIHRoaXMgbWV0aG9kLCBpdCdzIG9uY2UgYWdhaW4gZ29vZCB0byByZW1lbWJlciB0aGF0IEt5c2VseSBqdXN0IGJ1aWxkcyB0aGVcbiAgICAgKiBxdWVyeSBhbmQgZG9lc24ndCBwcm92aWRlIHRoZSBzYW1lIEFQSSBmb3IgYWxsIGRhdGFiYXNlcy4gRm9yIGV4YW1wbGUsIHNvbWVcbiAgICAgKiBkYXRhYmFzZXMgbGlrZSBvbGRlciBNeVNRTCBkb24ndCBzdXBwb3J0IHRoZSBgcmVmZXJlbmNlc2Agc3RhdGVtZW50IGluIHRoZVxuICAgICAqIGNvbHVtbiBkZWZpbml0aW9uLiBJbnN0ZWFkIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIG5lZWQgdG8gYmUgZGVmaW5lZCBpbiB0aGVcbiAgICAgKiBgY3JlYXRlIHRhYmxlYCBxdWVyeS4gU2VlIHRoZSBuZXh0IGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIChjb2wpID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdwYXJlbnRfaWQnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdwZXJzb25fcGFyZW50X2lkX2ZrJyxcbiAgICAgKiAgICAgWydwYXJlbnRfaWQnXSxcbiAgICAgKiAgICAgJ3BlcnNvbicsXG4gICAgICogICAgIFsnaWQnXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBbm90aGVyIGdvb2QgZXhhbXBsZSBpcyB0aGF0IFBvc3RncmVTUUwgZG9lc24ndCBzdXBwb3J0IHRoZSBgYXV0b19pbmNyZW1lbnRgXG4gICAgICoga2V5d29yZCBhbmQgeW91IG5lZWQgdG8gZGVmaW5lIGFuIGF1dG9pbmNyZW1lbnRpbmcgY29sdW1uIGZvciBleGFtcGxlIHVzaW5nXG4gICAgICogYHNlcmlhbGA6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXJzb24nKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnc2VyaWFsJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhZGRDb2x1bW4oY29sdW1uTmFtZSwgZGF0YVR5cGUsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCBjb2x1bW5CdWlsZGVyID0gYnVpbGQobmV3IENvbHVtbkRlZmluaXRpb25CdWlsZGVyKENvbHVtbkRlZmluaXRpb25Ob2RlLmNyZWF0ZShjb2x1bW5OYW1lLCBwYXJzZURhdGFUeXBlRXhwcmVzc2lvbihkYXRhVHlwZSkpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbHVtbih0aGlzLiNwcm9wcy5ub2RlLCBjb2x1bW5CdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBwcmltYXJ5IGtleSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkUHJpbWFyeUtleUNvbnN0cmFpbnQoJ3ByaW1hcnlfa2V5JywgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFByaW1hcnlLZXlDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBjb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyKFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZS5jcmVhdGUoY29sdW1ucywgY29uc3RyYWludE5hbWUpKSk7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aENvbnN0cmFpbnQodGhpcy4jcHJvcHMubm9kZSwgY29uc3RyYWludEJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHVuaXF1ZSBjb25zdHJhaW50IGZvciBvbmUgb3IgbW9yZSBjb2x1bW5zLlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2xhc3RfbmFtZScsICd2YXJjaGFyKDY0KScpXG4gICAgICogICAuYWRkVW5pcXVlQ29uc3RyYWludChcbiAgICAgKiAgICAgJ2ZpcnN0X25hbWVfbGFzdF9uYW1lX3VuaXF1ZScsXG4gICAgICogICAgIFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogSW4gZGlhbGVjdHMgc3VjaCBhcyBQb3N0Z3JlU1FMIHlvdSBjYW4gc3BlY2lmeSBgbnVsbHMgbm90IGRpc3RpbmN0YCBhcyBmb2xsb3dzOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCAndmFyY2hhcig2NCknKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJylcbiAgICAgKiAgIC5hZGRVbmlxdWVDb25zdHJhaW50KFxuICAgICAqICAgICAnZmlyc3RfbmFtZV9sYXN0X25hbWVfdW5pcXVlJyxcbiAgICAgKiAgICAgWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddLFxuICAgICAqICAgICAoY2IpID0+IGNiLm51bGxzTm90RGlzdGluY3QoKVxuICAgICAqICAgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZFVuaXF1ZUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIGJ1aWxkID0gbm9vcCkge1xuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50QnVpbGRlciA9IGJ1aWxkKG5ldyBVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIoVW5pcXVlQ29uc3RyYWludE5vZGUuY3JlYXRlKGNvbHVtbnMsIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIHVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBjaGVjayBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHtcdTAwQTBzcWwgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnYW5pbWFsJylcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ251bWJlcl9vZl9sZWdzJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZENoZWNrQ29uc3RyYWludCgnY2hlY2tfbGVncycsIHNxbGBudW1iZXJfb2ZfbGVncyA8IDVgKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGFkZENoZWNrQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgY2hlY2tFeHByZXNzaW9uLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludEJ1aWxkZXIgPSBidWlsZChuZXcgQ2hlY2tDb25zdHJhaW50QnVpbGRlcihDaGVja0NvbnN0cmFpbnROb2RlLmNyZWF0ZShjaGVja0V4cHJlc3Npb24udG9PcGVyYXRpb25Ob2RlKCksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGNvbnN0cmFpbnRCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBmb3JlaWduIGtleSBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogVGhlIGNvbnN0cmFpbnQgbmFtZSBjYW4gYmUgYW55dGhpbmcgeW91IHdhbnQsIGJ1dCBpdCBtdXN0IGJlIHVuaXF1ZVxuICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZCcsICdpbnRlZ2VyJylcbiAgICAgKiAgIC5hZGRGb3JlaWduS2V5Q29uc3RyYWludChcbiAgICAgKiAgICAgJ293bmVyX2lkX2ZvcmVpZ24nLFxuICAgICAqICAgICBbJ293bmVyX2lkJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkJ10sXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBBZGQgY29uc3RyYWludCBmb3IgbXVsdGlwbGUgY29sdW1uczpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDEnLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkQ29sdW1uKCdvd25lcl9pZDInLCAnaW50ZWdlcicpXG4gICAgICogICAuYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoXG4gICAgICogICAgICdvd25lcl9pZF9mb3JlaWduJyxcbiAgICAgKiAgICAgWydvd25lcl9pZDEnLCAnb3duZXJfaWQyJ10sXG4gICAgICogICAgICdwZXJzb24nLFxuICAgICAqICAgICBbJ2lkMScsICdpZDInXSxcbiAgICAgKiAgICAgKGNiKSA9PiBjYi5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYWRkRm9yZWlnbktleUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIGNvbHVtbnMsIHRhcmdldFRhYmxlLCB0YXJnZXRDb2x1bW5zLCBidWlsZCA9IG5vb3ApIHtcbiAgICAgICAgY29uc3QgYnVpbGRlciA9IGJ1aWxkKG5ldyBGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIoRm9yZWlnbktleUNvbnN0cmFpbnROb2RlLmNyZWF0ZShjb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIHBhcnNlVGFibGUodGFyZ2V0VGFibGUpLCB0YXJnZXRDb2x1bW5zLm1hcChDb2x1bW5Ob2RlLmNyZWF0ZSksIGNvbnN0cmFpbnROYW1lKSkpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhDb25zdHJhaW50KHRoaXMuI3Byb3BzLm5vZGUsIGJ1aWxkZXIudG9PcGVyYXRpb25Ob2RlKCkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgYW55IGFkZGl0aW9uYWwgU1FMIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVlcnkgX19hZnRlcl9fIHRoZSBgY3JlYXRlYCBrZXl3b3JkLlxuICAgICAqXG4gICAgICogQWxzbyBzZWUge0BsaW5rIHRlbXBvcmFyeX0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAubW9kaWZ5RnJvbnQoc3FsYGdsb2JhbCB0ZW1wb3JhcnlgKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyKDY0KScsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignbGFzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZXMpOlxuICAgICAqXG4gICAgICogYGBgc3FsXG4gICAgICogY3JlYXRlIGdsb2JhbCB0ZW1wb3JhcnkgdGFibGUgXCJwZXJzb25cIiAoXG4gICAgICogICBcImlkXCIgaW50ZWdlciBwcmltYXJ5IGtleSxcbiAgICAgKiAgIFwiZmlyc3RfbmFtZVwiIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgXCJsYXN0X25hbWVcIiB2YXJjaGFyKDY0KSBub3QgbnVsbFxuICAgICAqIClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBtb2RpZnlGcm9udChtb2RpZmllcikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGhGcm9udE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIFNRTCB0byB0aGUgZW5kIG9mIHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEFsc28gc2VlIHtAbGluayBvbkNvbW1pdH0uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdmaXJzdF9uYW1lJywgJ3ZhcmNoYXIoNjQpJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcig2NCknLCBjb2wgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgIC5tb2RpZnlFbmQoc3FsYGNvbGxhdGUgdXRmOF91bmljb2RlX2NpYClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChNeVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBjcmVhdGUgdGFibGUgYHBlcnNvbmAgKFxuICAgICAqICAgYGlkYCBpbnRlZ2VyIHByaW1hcnkga2V5LFxuICAgICAqICAgYGZpcnN0X25hbWVgIHZhcmNoYXIoNjQpIG5vdCBudWxsLFxuICAgICAqICAgYGxhc3RfbmFtZWAgdmFyY2hhcig2NCkgbm90IG51bGxcbiAgICAgKiApIGNvbGxhdGUgdXRmOF91bmljb2RlX2NpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgbW9kaWZ5RW5kKG1vZGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVGFibGVOb2RlLmNsb25lV2l0aEVuZE1vZGlmaWVyKHRoaXMuI3Byb3BzLm5vZGUsIG1vZGlmaWVyLnRvT3BlcmF0aW9uTm9kZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsbG93cyB0byBjcmVhdGUgdGFibGUgZnJvbSBgc2VsZWN0YCBxdWVyeS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgnY29weScpXG4gICAgICogICAudGVtcG9yYXJ5KClcbiAgICAgKiAgIC5hcyhkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3QoWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZSddKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAgICAgKlxuICAgICAqIGBgYHNxbFxuICAgICAqIGNyZWF0ZSB0ZW1wb3JhcnkgdGFibGUgXCJjb3B5XCIgYXNcbiAgICAgKiBzZWxlY3QgXCJmaXJzdF9uYW1lXCIsIFwibGFzdF9uYW1lXCIgZnJvbSBcInBlcnNvblwiXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXMoZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVRhYmxlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHNlbGVjdFF1ZXJ5OiBwYXJzZUV4cHJlc3Npb24oZXhwcmVzc2lvbiksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhbGxzIHRoZSBnaXZlbiBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVUYWJsZSgndGVzdCcpXG4gICAgICogICAuJGNhbGwoKGJ1aWxkZXIpID0+IGJ1aWxkZXIuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJykpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgcmV1c2FibGUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIGEgYnVpbGRlci5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHsgdHlwZSBDcmVhdGVUYWJsZUJ1aWxkZXIsIHNxbCB9IGZyb20gJ2t5c2VseSdcbiAgICAgKlxuICAgICAqIGNvbnN0IGFkZERlZmF1bHRDb2x1bW5zID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAqICAgcmV0dXJuIGN0YlxuICAgICAqICAgICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgKGNvbCkgPT4gY29sLm5vdE51bGwoKSlcbiAgICAgKiAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICdkYXRlJywgKGNvbCkgPT5cbiAgICAgKiAgICAgICBjb2wubm90TnVsbCgpLmRlZmF1bHRUbyhzcWxgbm93KClgKVxuICAgICAqICAgICApXG4gICAgICogICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAnZGF0ZScsIChjb2wpID0+XG4gICAgICogICAgICAgY29sLm5vdE51bGwoKS5kZWZhdWx0VG8oc3FsYG5vdygpYClcbiAgICAgKiAgICAgKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZXN0JylcbiAgICAgKiAgIC4kY2FsbChhZGREZWZhdWx0Q29sdW1ucylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtaW5kZXgtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BJbmRleE5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BJbmRleEJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdGFibGUgdGhlIGluZGV4IHdhcyBjcmVhdGVkIGZvci4gVGhpcyBpcyBub3QgbmVlZGVkXG4gICAgICogaW4gYWxsIGRpYWxlY3RzLlxuICAgICAqL1xuICAgIG9uKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcGFyc2VUYWJsZSh0YWJsZSksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BJbmRleE5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC1zY2hlbWEtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgRHJvcFNjaGVtYUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BTY2hlbWFCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFNjaGVtYU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBpZkV4aXN0czogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY2FzY2FkZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BTY2hlbWFOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3AtdGFibGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BUYWJsZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUYWJsZU5vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vY3JlYXRlLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVWaWV3Tm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uZC50c1wiIC8+XG5pbXBvcnQgeyBJbW1lZGlhdGVWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi9pbW1lZGlhdGUtdmFsdWUtdHJhbnNmb3JtZXIuanMnO1xuLyoqXG4gKiBUcmFuc2Zvcm1zIGFsbCBWYWx1ZU5vZGVzIHRvIGltbWVkaWF0ZS5cbiAqXG4gKiBXQVJOSU5HISBUaGlzIHNob3VsZCBuZXZlciBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBVc2VycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMuXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIGhlbHBlci5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNsYXNzIEltbWVkaWF0ZVZhbHVlUGx1Z2luIHtcbiAgICAjdHJhbnNmb3JtZXIgPSBuZXcgSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lcigpO1xuICAgIHRyYW5zZm9ybVF1ZXJ5KGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUoYXJncy5ub2RlLCBhcmdzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICB0cmFuc2Zvcm1SZXN1bHQoYXJncykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFyZ3MucmVzdWx0KTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS12aWV3LWJ1aWxkZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgcGFyc2VDb2x1bW5OYW1lIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgSW1tZWRpYXRlVmFsdWVQbHVnaW4gfSBmcm9tICcuLi9wbHVnaW4vaW1tZWRpYXRlLXZhbHVlL2ltbWVkaWF0ZS12YWx1ZS1wbHVnaW4uanMnO1xuZXhwb3J0IGNsYXNzIENyZWF0ZVZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcInRlbXBvcmFyeVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IHZpZXcuXG4gICAgICovXG4gICAgdGVtcG9yYXJ5KCkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB0ZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1hdGVyaWFsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgbWF0ZXJpYWxpemVkOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbmx5IGltcGxlbWVudGVkIG9uIHNvbWUgZGlhbGVjdHMgbGlrZSBTUUxpdGUuIE9uIG1vc3QgZGlhbGVjdHMsIHVzZSB7QGxpbmsgb3JSZXBsYWNlfS5cbiAgICAgKi9cbiAgICBpZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZOb3RFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9yUmVwbGFjZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgb3JSZXBsYWNlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb2x1bW5zKGNvbHVtbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29sdW1uczogY29sdW1ucy5tYXAocGFyc2VDb2x1bW5OYW1lKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VsZWN0IHF1ZXJ5IG9yIGEgYHZhbHVlc2Agc3RhdGVtZW50IHRoYXQgY3JlYXRlcyB0aGUgdmlldy5cbiAgICAgKlxuICAgICAqIFdBUk5JTkchXG4gICAgICogU29tZSBkaWFsZWN0cyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgcXVlcmllcyBpbiBEREwgc3RhdGVtZW50cyBhbmQgdGhlcmVmb3JlXG4gICAgICogdGhlIHF1ZXJ5IG9yIHJhdyB7QGxpbmsgc3FsIH0gZXhwcmVzc2lvbiBwYXNzZWQgaGVyZSBpcyBpbnRlcnBvbGF0ZWQgaW50byBhIHNpbmdsZVxuICAgICAqIHN0cmluZyBvcGVuaW5nIGFuIFNRTCBpbmplY3Rpb24gdnVsbmVyYWJpbGl0eS4gRE8gTk9UIHBhc3MgdW5jaGVja2VkIHVzZXIgaW5wdXRcbiAgICAgKiBpbnRvIHRoZSBxdWVyeSBvciByYXcgZXhwcmVzc2lvbiBwYXNzZWQgdG8gdGhpcyBtZXRob2QhXG4gICAgICovXG4gICAgYXMocXVlcnkpIHtcbiAgICAgICAgY29uc3QgcXVlcnlOb2RlID0gcXVlcnlcbiAgICAgICAgICAgIC53aXRoUGx1Z2luKG5ldyBJbW1lZGlhdGVWYWx1ZVBsdWdpbigpKVxuICAgICAgICAgICAgLnRvT3BlcmF0aW9uTm9kZSgpO1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICBhczogcXVlcnlOb2RlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC12aWV3LW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4vc2NoZW1hYmxlLWlkZW50aWZpZXItbm9kZS5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFZpZXdOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVmlld05vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFZpZXdOb2RlJyxcbiAgICAgICAgICAgIG5hbWU6IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlLmNyZWF0ZShuYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGgoZHJvcFZpZXcsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmRyb3BWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2Ryb3Atdmlldy1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC12aWV3LW5vZGUuanMnO1xuZXhwb3J0IGNsYXNzIERyb3BWaWV3QnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgbWF0ZXJpYWxpemVkKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIG1hdGVyaWFsaXplZDogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWZFeGlzdHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgaWZFeGlzdHM6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2NhZGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY2FzY2FkZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICB0b09wZXJhdGlvbk5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5ub2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLnRvT3BlcmF0aW9uTm9kZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgYXN5bmMgZXhlY3V0ZSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZXhlY3V0b3IuZXhlY3V0ZVF1ZXJ5KHRoaXMuY29tcGlsZSgpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NyZWF0ZS10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5pbXBvcnQgeyBWYWx1ZUxpc3ROb2RlIH0gZnJvbSAnLi92YWx1ZS1saXN0LW5vZGUuanMnO1xuaW1wb3J0IHsgVmFsdWVOb2RlIH0gZnJvbSAnLi92YWx1ZS1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBDcmVhdGVUeXBlTm9kZSA9IGZyZWV6ZSh7XG4gICAgaXMobm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZS5raW5kID09PSAnQ3JlYXRlVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnQ3JlYXRlVHlwZU5vZGUnLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBjbG9uZVdpdGhFbnVtKGNyZWF0ZVR5cGUsIHZhbHVlcykge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIC4uLmNyZWF0ZVR5cGUsXG4gICAgICAgICAgICBlbnVtOiBWYWx1ZUxpc3ROb2RlLmNyZWF0ZSh2YWx1ZXMubWFwKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9jcmVhdGUtdHlwZS1idWlsZGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgQ3JlYXRlVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdHlwZS1ub2RlLmpzJztcbmV4cG9ydCBjbGFzcyBDcmVhdGVUeXBlQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW51bSB0eXBlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGRiLnNjaGVtYS5jcmVhdGVUeXBlKCdzcGVjaWVzJykuYXNFbnVtKFsnY2F0JywgJ2RvZycsICdmcm9nJ10pXG4gICAgICogYGBgXG4gICAgICovXG4gICAgYXNFbnVtKHZhbHVlcykge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVHlwZU5vZGUuY2xvbmVXaXRoRW51bSh0aGlzLiNwcm9wcy5ub2RlLCB2YWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2ltcGx5IGNhbGxzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBwYXNzaW5nIGB0aGlzYCBhcyB0aGUgb25seSBhcmd1bWVudC4gYCRjYWxsYCByZXR1cm5zXG4gICAgICogd2hhdCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcmV0dXJucy5cbiAgICAgKi9cbiAgICAkY2FsbChmdW5jKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJvcC10eXBlLW5vZGUuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgRHJvcFR5cGVOb2RlID0gZnJlZXplKHtcbiAgICBpcyhub2RlKSB7XG4gICAgICAgIHJldHVybiBub2RlLmtpbmQgPT09ICdEcm9wVHlwZU5vZGUnO1xuICAgIH0sXG4gICAgY3JlYXRlKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICBraW5kOiAnRHJvcFR5cGVOb2RlJyxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgY2xvbmVXaXRoKGRyb3BUeXBlLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5kcm9wVHlwZSxcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kcm9wLXR5cGUtYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IERyb3BUeXBlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2Ryb3AtdHlwZS1ub2RlLmpzJztcbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBjbGFzcyBEcm9wVHlwZUJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGlmRXhpc3RzKCkge1xuICAgICAgICByZXR1cm4gbmV3IERyb3BUeXBlQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIGlmRXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW1wbHkgY2FsbHMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHBhc3NpbmcgYHRoaXNgIGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBgJGNhbGxgIHJldHVybnNcbiAgICAgKiB3aGF0IHRoZSBwcm92aWRlZCBmdW5jdGlvbiByZXR1cm5zLlxuICAgICAqL1xuICAgICRjYWxsKGZ1bmMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmModGhpcyk7XG4gICAgfVxuICAgIHRvT3BlcmF0aW9uTm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnRyYW5zZm9ybVF1ZXJ5KHRoaXMuI3Byb3BzLm5vZGUsIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBjb21waWxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KHRoaXMudG9PcGVyYXRpb25Ob2RlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5leGVjdXRvci5leGVjdXRlUXVlcnkodGhpcy5jb21waWxlKCksIHRoaXMuI3Byb3BzLnF1ZXJ5SWQpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vaWRlbnRpZmllci1wYXJzZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBTY2hlbWFibGVJZGVudGlmaWVyTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3NjaGVtYWJsZS1pZGVudGlmaWVyLW5vZGUuanMnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NoZW1hYmxlSWRlbnRpZmllcihpZCkge1xuICAgIGNvbnN0IFNDSEVNQV9TRVBBUkFUT1IgPSAnLic7XG4gICAgaWYgKGlkLmluY2x1ZGVzKFNDSEVNQV9TRVBBUkFUT1IpKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gaWQuc3BsaXQoU0NIRU1BX1NFUEFSQVRPUikubWFwKHRyaW0pO1xuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlV2l0aFNjaGVtYShwYXJ0c1swXSwgcGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHNjaGVtYWJsZSBpZGVudGlmaWVyICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBTY2hlbWFibGVJZGVudGlmaWVyTm9kZS5jcmVhdGUoaWQpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci50cmltKCk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIH0gZnJvbSAnLi9zY2hlbWFibGUtaWRlbnRpZmllci1ub2RlLmpzJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUgPSBmcmVlemUoe1xuICAgIGlzKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUua2luZCA9PT0gJ1JlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSc7XG4gICAgfSxcbiAgICBjcmVhdGUobmFtZSkge1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIGtpbmQ6ICdSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUnLFxuICAgICAgICAgICAgbmFtZTogU2NoZW1hYmxlSWRlbnRpZmllck5vZGUuY3JlYXRlKG5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGNsb25lV2l0aChjcmVhdGVWaWV3LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgICAgICAgICAuLi5jcmVhdGVWaWV3LFxuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IGZyZWV6ZSB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3JlZnJlc2gtbWF0ZXJpYWxpemVkLXZpZXctbm9kZS5qcyc7XG5leHBvcnQgY2xhc3MgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcImNvbmN1cnJlbnRseVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogVXNlIHRoaXMgdG8gcmVmcmVzaCB0aGUgdmlldyB3aXRob3V0IGxvY2tpbmcgb3V0IGNvbmN1cnJlbnQgc2VsZWN0cyBvbiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcuXG4gICAgICpcbiAgICAgKiBXQVJOSU5HIVxuICAgICAqIFRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCB0aGUgXCJ3aXRoIG5vIGRhdGFcIiBtb2RpZmllci5cbiAgICAgKi9cbiAgICBjb25jdXJyZW50bHkoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgbm9kZTogUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlLmNsb25lV2l0aCh0aGlzLiNwcm9wcy5ub2RlLCB7XG4gICAgICAgICAgICAgICAgY29uY3VycmVudGx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkIChvciBkZWZhdWx0cykgdGhlIGJhY2tpbmcgcXVlcnkgaXMgZXhlY3V0ZWQgdG8gcHJvdmlkZSB0aGUgbmV3IGRhdGEsIGFuZCB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgaXMgbGVmdCBpbiBhIHNjYW5uYWJsZSBzdGF0ZVxuICAgICAqL1xuICAgIHdpdGhEYXRhKCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIG5vZGU6IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3Tm9kZS5jbG9uZVdpdGgodGhpcy4jcHJvcHMubm9kZSwge1xuICAgICAgICAgICAgICAgIHdpdGhOb0RhdGE6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBcIndpdGggbm8gZGF0YVwiIG1vZGlmaWVyLlxuICAgICAqXG4gICAgICogSWYgc3BlY2lmaWVkLCBubyBuZXcgZGF0YSBpcyBnZW5lcmF0ZWQgYW5kIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBpcyBsZWZ0IGluIGFuIHVuc2Nhbm5hYmxlIHN0YXRlLlxuICAgICAqXG4gICAgICogV0FSTklORyFcbiAgICAgKiBUaGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggdGhlIFwiY29uY3VycmVudGx5XCIgbW9kaWZpZXIuXG4gICAgICovXG4gICAgd2l0aE5vRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY2xvbmVXaXRoKHRoaXMuI3Byb3BzLm5vZGUsIHtcbiAgICAgICAgICAgICAgICB3aXRoTm9EYXRhOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbnRseTogZmFsc2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpbXBseSBjYWxscyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gcGFzc2luZyBgdGhpc2AgYXMgdGhlIG9ubHkgYXJndW1lbnQuIGAkY2FsbGAgcmV0dXJuc1xuICAgICAqIHdoYXQgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHJldHVybnMuXG4gICAgICovXG4gICAgJGNhbGwoZnVuYykge1xuICAgICAgICByZXR1cm4gZnVuYyh0aGlzKTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMuZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkodGhpcy4jcHJvcHMubm9kZSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvci5jb21waWxlUXVlcnkodGhpcy50b09wZXJhdGlvbk5vZGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLmNvbXBpbGUoKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9zY2hlbWEuZC50c1wiIC8+XG5pbXBvcnQgeyBBbHRlclRhYmxlTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsdGVyLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLWluZGV4LW5vZGUuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUYWJsZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9jcmVhdGUtdGFibGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wSW5kZXhOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1pbmRleC1ub2RlLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC1zY2hlbWEtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvZHJvcC10YWJsZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlVGFibGUgfSBmcm9tICcuLi9wYXJzZXIvdGFibGUtcGFyc2VyLmpzJztcbmltcG9ydCB7IEFsdGVyVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9hbHRlci10YWJsZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZUluZGV4QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLWluZGV4LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgQ3JlYXRlU2NoZW1hQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXRhYmxlLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgRHJvcEluZGV4QnVpbGRlciB9IGZyb20gJy4vZHJvcC1pbmRleC1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BTY2hlbWFCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXNjaGVtYS1idWlsZGVyLmpzJztcbmltcG9ydCB7IERyb3BUYWJsZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdGFibGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi4vdXRpbC9xdWVyeS1pZC5qcyc7XG5pbXBvcnQgeyBXaXRoU2NoZW1hUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luL3dpdGgtc2NoZW1hL3dpdGgtc2NoZW1hLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3QnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDcmVhdGVWaWV3Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2NyZWF0ZS12aWV3LW5vZGUuanMnO1xuaW1wb3J0IHsgRHJvcFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9kcm9wLXZpZXctYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVmlld05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBDcmVhdGVUeXBlQnVpbGRlciB9IGZyb20gJy4vY3JlYXRlLXR5cGUtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZUJ1aWxkZXIgfSBmcm9tICcuL2Ryb3AtdHlwZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IENyZWF0ZVR5cGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBEcm9wVHlwZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9kcm9wLXR5cGUtbm9kZS5qcyc7XG5pbXBvcnQgeyBwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIgfSBmcm9tICcuLi9wYXJzZXIvaWRlbnRpZmllci1wYXJzZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIH0gZnJvbSAnLi9yZWZyZXNoLW1hdGVyaWFsaXplZC12aWV3LWJ1aWxkZXIuanMnO1xuaW1wb3J0IHsgUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvcmVmcmVzaC1tYXRlcmlhbGl6ZWQtdmlldy1ub2RlLmpzJztcbi8qKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hTW9kdWxlIHtcbiAgICAjZXhlY3V0b3I7XG4gICAgY29uc3RydWN0b3IoZXhlY3V0b3IpIHtcbiAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHRhYmxlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyB0YWJsZSB3aXRoIGNvbHVtbnMgYGlkYCwgYGZpcnN0X25hbWVgLFxuICAgICAqIGBsYXN0X25hbWVgIGFuZCBgZ2VuZGVyYDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZmlyc3RfbmFtZScsICd2YXJjaGFyJywgY29sID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICogICAuYWRkQ29sdW1uKCdsYXN0X25hbWUnLCAndmFyY2hhcicsIGNvbCA9PiBjb2wubm90TnVsbCgpKVxuICAgICAqICAgLmFkZENvbHVtbignZ2VuZGVyJywgJ3ZhcmNoYXInKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSB0YWJsZSB3aXRoIGEgZm9yZWlnbiBrZXkuIE5vdCBhbGwgZGF0YWJhc2VcbiAgICAgKiBlbmdpbmVzIHN1cHBvcnQgY29sdW1uLWxldmVsIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZGVmaW5pdGlvbnMuXG4gICAgICogRm9yIGV4YW1wbGUgaWYgeW91IGFyZSB1c2luZyBNeVNRTCA1Llggc2VlIHRoZSBuZXh0IGV4YW1wbGUgYWZ0ZXJcbiAgICAgKiB0aGlzIG9uZS5cbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVGFibGUoJ3BldCcpXG4gICAgICogICAuYWRkQ29sdW1uKCdpZCcsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgICAqICAgLmFkZENvbHVtbignb3duZXJfaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2xcbiAgICAgKiAgICAgLnJlZmVyZW5jZXMoJ3BlcnNvbi5pZCcpXG4gICAgICogICAgIC5vbkRlbGV0ZSgnY2FzY2FkZScpXG4gICAgICogICApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGlzIGV4YW1wbGUgYWRkcyBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgZm9yIGEgY29sdW1ucyBqdXN0XG4gICAgICogbGlrZSB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHVzaW5nIGEgdGFibGUtbGV2ZWwgc3RhdGVtZW50LlxuICAgICAqIE9uIE15U1FMIDUuWCB5b3UgbmVlZCB0byBkZWZpbmUgZm9yZWlnbiBrZXkgY29uc3RyYWludHMgbGlrZVxuICAgICAqIHRoaXM6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCdwZXQnKVxuICAgICAqICAgLmFkZENvbHVtbignaWQnLCAnaW50ZWdlcicsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpLmF1dG9JbmNyZW1lbnQoKSlcbiAgICAgKiAgIC5hZGRDb2x1bW4oJ293bmVyX2lkJywgJ2ludGVnZXInKVxuICAgICAqICAgLmFkZEZvcmVpZ25LZXlDb25zdHJhaW50KFxuICAgICAqICAgICAncGV0X293bmVyX2lkX2ZvcmVpZ24nLCBbJ293bmVyX2lkJ10sICdwZXJzb24nLCBbJ2lkJ10sXG4gICAgICogICAgIChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm9uRGVsZXRlKCdjYXNjYWRlJylcbiAgICAgKiAgIClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVUYWJsZSh0YWJsZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0YWJsZS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVGFibGUoJ3BlcnNvbicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFRhYmxlQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wVGFibGVOb2RlLmNyZWF0ZShwYXJzZVRhYmxlKHRhYmxlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgaW5kZXguXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5vbigncGVyc29uJylcbiAgICAgKiAgIC5jb2x1bW5zKFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVJbmRleChpbmRleE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVJbmRleEJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhbiBpbmRleC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wSW5kZXgoJ3BlcnNvbl9mdWxsX25hbWVfdW5pcXVlX2luZGV4JylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBkcm9wSW5kZXgoaW5kZXhOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcEluZGV4QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wSW5kZXhOb2RlLmNyZWF0ZShpbmRleE5hbWUpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5jcmVhdGVTY2hlbWEoJ3NvbWVfc2NoZW1hJylcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBDcmVhdGVTY2hlbWFOb2RlLmNyZWF0ZShzY2hlbWEpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRHJvcCBhIHNjaGVtYS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wU2NoZW1hKCdzb21lX3NjaGVtYScpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFNjaGVtYShzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wU2NoZW1hQnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBEcm9wU2NoZW1hTm9kZS5jcmVhdGUoc2NoZW1hKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsdGVyIGEgdGFibGUuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuYWx0ZXJUYWJsZSgncGVyc29uJylcbiAgICAgKiAgIC5hbHRlckNvbHVtbignZmlyc3RfbmFtZScsIChhYykgPT4gYWMuc2V0RGF0YVR5cGUoJ3RleHQnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBhbHRlclRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQWx0ZXJUYWJsZUJ1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQWx0ZXJUYWJsZU5vZGUuY3JlYXRlKHBhcnNlVGFibGUodGFibGUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVZpZXcoJ2RvZ3MnKVxuICAgICAqICAgLm9yUmVwbGFjZSgpXG4gICAgICogICAuYXMoZGIuc2VsZWN0RnJvbSgncGV0Jykuc2VsZWN0QWxsKCkud2hlcmUoJ3NwZWNpZXMnLCAnPScsICdkb2cnKSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjcmVhdGVWaWV3KHZpZXdOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogQ3JlYXRlVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZnJlc2ggYSBtYXRlcmlhbGl6ZWQgdmlldy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5yZWZyZXNoTWF0ZXJpYWxpemVkVmlldygnbXlfdmlldycpXG4gICAgICogICAuY29uY3VycmVudGx5KClcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWZyZXNoTWF0ZXJpYWxpemVkVmlldyh2aWV3TmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jZXhlY3V0b3IsXG4gICAgICAgICAgICBub2RlOiBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUuY3JlYXRlKHZpZXdOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB2aWV3LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmRyb3BWaWV3KCdkb2dzJylcbiAgICAgKiAgIC5pZkV4aXN0cygpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZHJvcFZpZXcodmlld05hbWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEcm9wVmlld0J1aWxkZXIoe1xuICAgICAgICAgICAgcXVlcnlJZDogY3JlYXRlUXVlcnlJZCgpLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI2V4ZWN1dG9yLFxuICAgICAgICAgICAgbm9kZTogRHJvcFZpZXdOb2RlLmNyZWF0ZSh2aWV3TmFtZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgdHlwZS5cbiAgICAgKlxuICAgICAqIE9ubHkgc29tZSBkaWFsZWN0cyBsaWtlIFBvc3RncmVTUUwgaGF2ZSB1c2VyLWRlZmluZWQgdHlwZXMuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogYXdhaXQgZGIuc2NoZW1hXG4gICAgICogICAuY3JlYXRlVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuYXNFbnVtKFsnZG9nJywgJ2NhdCcsICdmcm9nJ10pXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgY3JlYXRlVHlwZSh0eXBlTmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IENyZWF0ZVR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IENyZWF0ZVR5cGVOb2RlLmNyZWF0ZShwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIodHlwZU5hbWUpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERyb3AgYSB0eXBlLlxuICAgICAqXG4gICAgICogT25seSBzb21lIGRpYWxlY3RzIGxpa2UgUG9zdGdyZVNRTCBoYXZlIHVzZXItZGVmaW5lZCB0eXBlcy5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zY2hlbWFcbiAgICAgKiAgIC5kcm9wVHlwZSgnc3BlY2llcycpXG4gICAgICogICAuaWZFeGlzdHMoKVxuICAgICAqICAgLmV4ZWN1dGUoKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGRyb3BUeXBlKHR5cGVOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHJvcFR5cGVCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNleGVjdXRvcixcbiAgICAgICAgICAgIG5vZGU6IERyb3BUeXBlTm9kZS5jcmVhdGUocGFyc2VTY2hlbWFibGVJZGVudGlmaWVyKHR5cGVOYW1lKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIGluc3RhbGxlZC5cbiAgICAgKi9cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFNjaGVtYU1vZHVsZSh0aGlzLiNleGVjdXRvci53aXRoUGx1Z2luKHBsdWdpbikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIHNjaGVtYSBtb2R1bGUgIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZWUge0BsaW5rIFF1ZXJ5Q3JlYXRvci53aXRoU2NoZW1hfVxuICAgICAqL1xuICAgIHdpdGhTY2hlbWEoc2NoZW1hKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R5bmFtaWMuZC50c1wiIC8+XG5pbXBvcnQgeyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlciB9IGZyb20gJy4vZHluYW1pYy1yZWZlcmVuY2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBEeW5hbWljVGFibGVCdWlsZGVyIH0gZnJvbSAnLi9keW5hbWljLXRhYmxlLWJ1aWxkZXIuanMnO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNNb2R1bGUge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkeW5hbWljIHJlZmVyZW5jZSB0byBhIGNvbHVtbiB0aGF0IGlzIG5vdCBrbm93IGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKlxuICAgICAqIEt5c2VseSBpcyBidWlsdCBpbiBhIHdheSB0aGF0IGJ5IGRlZmF1bHQgeW91IGNhbid0IHJlZmVyIHRvIHRhYmxlcyBvciBjb2x1bW5zXG4gICAgICogdGhhdCBhcmUgbm90IGFjdHVhbGx5IHZpc2libGUgaW4gdGhlIGN1cnJlbnQgcXVlcnkgYW5kIGNvbnRleHQuIFRoaXMgaXMgYWxsXG4gICAgICogZG9uZSBieSBUeXBlU2NyaXB0IGF0IGNvbXBpbGUgdGltZSwgd2hpY2ggbWVhbnMgdGhhdCB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICAqIGNvbHVtbnMgYW5kIHRhYmxlcyBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgY2FzZSBvZiBjb3Vyc2UuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBiZSB1c2VkIGluIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBjb2x1bW4gbmFtZXNcbiAgICAgKiBjb21lIGZyb20gdGhlIHVzZXIgaW5wdXQgb3IgYXJlIG5vdCBvdGhlcndpc2Uga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqXG4gICAgICogV0FSTklORyEgVW5saWtlIHZhbHVlcywgY29sdW1uIG5hbWVzIGFyZSBub3QgZXNjYXBlZCBieSB0aGUgZGF0YWJhc2UgZW5naW5lXG4gICAgICogb3IgS3lzZWx5IGFuZCBpZiB5b3UgcGFzcyBpbiB1bmNoZWNrZWQgY29sdW1uIG5hbWVzIHVzaW5nIHRoaXMgbWV0aG9kLCB5b3VcbiAgICAgKiBjcmVhdGUgYW4gU1FMIGluamVjdGlvbiB2dWxuZXJhYmlsaXR5LiBBbHdheXMgX19hbHdheXNfXyB2YWxpZGF0ZSB0aGUgdXNlclxuICAgICAqIGlucHV0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoaXMgbWV0aG9kLlxuICAgICAqXG4gICAgICogVGhlcmUgYXJlIGNvdXBsZSBvZiBleGFtcGxlcyBiZWxvdyBmb3Igc29tZSB1c2UgY2FzZXMsIGJ1dCB5b3UgY2FuIHBhc3NcbiAgICAgKiBgcmVmYCB0byBvdGhlciBtZXRob2RzIGFzIHdlbGwuIElmIHRoZSB0eXBlcyBhbGxvdyB5b3UgdG8gcGFzcyBhIGByZWZgXG4gICAgICogdmFsdWUgdG8gc29tZSBwbGFjZSwgaXQgc2hvdWxkIHdvcmsuXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIEZpbHRlciBieSBhIGNvbHVtbiBub3Qga25vdyBhdCBjb21waWxlIHRpbWU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGFzeW5jIGZ1bmN0aW9uIHNvbWVRdWVyeShmaWx0ZXJDb2x1bW46IHN0cmluZywgZmlsdGVyVmFsdWU6IHN0cmluZykge1xuICAgICAqICAgY29uc3QgeyByZWYgfSA9IGRiLmR5bmFtaWNcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IGRiXG4gICAgICogICAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgICAuc2VsZWN0QWxsKClcbiAgICAgKiAgICAgLndoZXJlKHJlZihmaWx0ZXJDb2x1bW4pLCAnPScsIGZpbHRlclZhbHVlKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmaXJzdF9uYW1lJywgJ0Fybm9sZCcpXG4gICAgICogc29tZVF1ZXJ5KCdwZXJzb24ubGFzdF9uYW1lJywgJ0FuaXN0b24nKVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogT3JkZXIgYnkgYSBjb2x1bW4gbm90IGtub3cgYXQgY29tcGlsZSB0aW1lOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBzb21lUXVlcnkob3JkZXJCeTogc3RyaW5nKSB7XG4gICAgICogICBjb25zdCB7IHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gICAgICogICAgIC5zZWxlY3QoJ3BlcnNvbi5maXJzdF9uYW1lIGFzIGZuJylcbiAgICAgKiAgICAgLm9yZGVyQnkocmVmKG9yZGVyQnkpKVxuICAgICAqICAgICAuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogc29tZVF1ZXJ5KCdmbicpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBJbiB0aGlzIGV4YW1wbGUgd2UgYWRkIHNlbGVjdGlvbnMgZHluYW1pY2FsbHk6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHsgcmVmIH0gPSBkYi5keW5hbWljXG4gICAgICpcbiAgICAgKiAvLyBTb21lIGNvbHVtbiBuYW1lIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBWYWx1ZSBub3Qga25vd24gYXQgY29tcGlsZSB0aW1lLlxuICAgICAqIGNvbnN0IGNvbHVtbkZyb21Vc2VySW5wdXQ6IFBvc3NpYmxlQ29sdW1ucyA9ICdiaXJ0aGRhdGUnO1xuICAgICAqXG4gICAgICogLy8gQSB0eXBlIHRoYXQgbGlzdHMgYWxsIHBvc3NpYmxlIHZhbHVlcyBgY29sdW1uRnJvbVVzZXJJbnB1dGAgY2FuIGhhdmUuXG4gICAgICogLy8gWW91IGNhbiB1c2UgYGtleW9mIFBlcnNvbmAgaWYgYW55IGNvbHVtbiBvZiBhbiBpbnRlcmZhY2UgaXMgYWxsb3dlZC5cbiAgICAgKiB0eXBlIFBvc3NpYmxlQ29sdW1ucyA9ICdsYXN0X25hbWUnIHwgJ2ZpcnN0X25hbWUnIHwgJ2JpcnRoZGF0ZSdcbiAgICAgKlxuICAgICAqIGNvbnN0IFtwZXJzb25dID0gYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICByZWY8UG9zc2libGVDb2x1bW5zPihjb2x1bW5Gcm9tVXNlcklucHV0KSxcbiAgICAgKiAgICAgJ2lkJ1xuICAgICAqICAgXSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHRpbmcgdHlwZSBjb250YWlucyBhbGwgYFBvc3NpYmxlQ29sdW1uc2AgYXMgb3B0aW9uYWwgZmllbGRzXG4gICAgICogLy8gYmVjYXVzZSB3ZSBjYW5ub3Qga25vdyB3aGljaCBmaWVsZCB3YXMgYWN0dWFsbHkgc2VsZWN0ZWQgYmVmb3JlXG4gICAgICogLy8gcnVubmluZyB0aGUgY29kZS5cbiAgICAgKiBjb25zdCBsYXN0TmFtZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHBlcnNvbj8ubGFzdF9uYW1lXG4gICAgICogY29uc3QgZmlyc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwZXJzb24/LmZpcnN0X25hbWVcbiAgICAgKiBjb25zdCBiaXJ0aERhdGU6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkID0gcGVyc29uPy5iaXJ0aGRhdGVcbiAgICAgKlxuICAgICAqIC8vIFRoZSByZXN1bHQgdHlwZSBhbHNvIGNvbnRhaW5zIHRoZSBjb21waWxlIHRpbWUgc2VsZWN0aW9uIGBpZGAuXG4gICAgICogcGVyc29uPy5pZFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlZihyZWZlcmVuY2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljUmVmZXJlbmNlQnVpbGRlcihyZWZlcmVuY2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGFibGUgcmVmZXJlbmNlIHRvIGEgdGFibGUgdGhhdCdzIG5vdCBmdWxseSBrbm93biBhdCBjb21waWxlIHRpbWUuXG4gICAgICpcbiAgICAgKiBUaGUgdHlwZSBgVGAgaXMgYWxsb3dlZCB0byBiZSBhIHVuaW9uIG9mIG11bHRpcGxlIHRhYmxlcy5cbiAgICAgKlxuICAgICAqIDwhLS0gc2l0ZUV4YW1wbGUoXCJzZWxlY3RcIiwgXCJHZW5lcmljIGZpbmQgcXVlcnlcIiwgMTMwKSAtLT5cbiAgICAgKlxuICAgICAqIEEgZ2VuZXJpYyB0eXBlLXNhZmUgaGVscGVyIGZ1bmN0aW9uIGZvciBmaW5kaW5nIGEgcm93IGJ5IGEgY29sdW1uIHZhbHVlOlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBnZXRSb3dCeUNvbHVtbjxcbiAgICAgKiAgIFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSxcbiAgICAgKiAgIEMgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZVtUXSAmIHN0cmluZyxcbiAgICAgKiAgIFYgZXh0ZW5kcyBTZWxlY3RUeXBlPERhdGFiYXNlW1RdW0NdPixcbiAgICAgKiA+KHQ6IFQsIGM6IEMsIHY6IFYpIHtcbiAgICAgKiAgIC8vIFdlIG5lZWQgdG8gdXNlIHRoZSBkeW5hbWljIG1vZHVsZSBzaW5jZSB0aGUgdGFibGUgbmFtZVxuICAgICAqICAgLy8gaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZS5cbiAgICAgKiAgIGNvbnN0IHsgdGFibGUsIHJlZiB9ID0gZGIuZHluYW1pY1xuICAgICAqXG4gICAgICogICByZXR1cm4gYXdhaXQgZGJcbiAgICAgKiAgICAgLnNlbGVjdEZyb20odGFibGUodCkuYXMoJ3QnKSlcbiAgICAgKiAgICAgLnNlbGVjdEFsbCgpXG4gICAgICogICAgIC53aGVyZShyZWYoYyksICc9JywgdilcbiAgICAgKiAgICAgLm9yZGVyQnkoJ3QuaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGNvbnN0IHBlcnNvbiA9IGF3YWl0IGdldFJvd0J5Q29sdW1uKCdwZXJzb24nLCAnZmlyc3RfbmFtZScsICdBcm5vbGQnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRhYmxlKHRhYmxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY1RhYmxlQnVpbGRlcih0YWJsZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LWNvbm5lY3Rpb24tcHJvdmlkZXIuZC50c1wiIC8+XG5leHBvcnQgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB7XG4gICAgI2RyaXZlcjtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIpIHtcbiAgICAgICAgdGhpcy4jZHJpdmVyID0gZHJpdmVyO1xuICAgIH1cbiAgICBhc3luYyBwcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcikge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY29uc3VtZXIoY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNkcml2ZXIucmVsZWFzZUNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBRdWVyeUV4ZWN1dG9yQmFzZSB9IGZyb20gJy4vcXVlcnktZXhlY3V0b3ItYmFzZS5qcyc7XG5leHBvcnQgY2xhc3MgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgZXh0ZW5kcyBRdWVyeUV4ZWN1dG9yQmFzZSB7XG4gICAgI2NvbXBpbGVyO1xuICAgICNhZGFwdGVyO1xuICAgICNjb25uZWN0aW9uUHJvdmlkZXI7XG4gICAgY29uc3RydWN0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgcGx1Z2lucyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKHBsdWdpbnMpO1xuICAgICAgICB0aGlzLiNjb21waWxlciA9IGNvbXBpbGVyO1xuICAgICAgICB0aGlzLiNhZGFwdGVyID0gYWRhcHRlcjtcbiAgICAgICAgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyID0gY29ubmVjdGlvblByb3ZpZGVyO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FkYXB0ZXI7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb21waWxlci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIucHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IodGhpcy4jY29tcGlsZXIsIHRoaXMuI2FkYXB0ZXIsIHRoaXMuI2Nvbm5lY3Rpb25Qcm92aWRlciwgWy4uLnRoaXMucGx1Z2lucywgLi4ucGx1Z2luc10pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFsuLi50aGlzLnBsdWdpbnMsIHBsdWdpbl0pO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luQXRGcm9udChwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgdGhpcy4jY29ubmVjdGlvblByb3ZpZGVyLCBbcGx1Z2luLCAuLi50aGlzLnBsdWdpbnNdKTtcbiAgICB9XG4gICAgd2l0aENvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0UXVlcnlFeGVjdXRvcih0aGlzLiNjb21waWxlciwgdGhpcy4jYWRhcHRlciwgY29ubmVjdGlvblByb3ZpZGVyLCBbLi4udGhpcy5wbHVnaW5zXSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRRdWVyeUV4ZWN1dG9yKHRoaXMuI2NvbXBpbGVyLCB0aGlzLiNhZGFwdGVyLCB0aGlzLiNjb25uZWN0aW9uUHJvdmlkZXIsIFtdKTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3BlcmZvcm1hbmNlLW5vdy5kLnRzXCIgLz5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgaWYgKHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNGdW5jdGlvbihwZXJmb3JtYW5jZS5ub3cpKSB7XG4gICAgICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBEYXRlLm5vdygpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcnVudGltZS1kcml2ZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBwZXJmb3JtYW5jZU5vdyB9IGZyb20gJy4uL3V0aWwvcGVyZm9ybWFuY2Utbm93LmpzJztcbi8qKlxuICogQSBzbWFsbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgRHJpdmVyfSB0aGF0IG1ha2VzIHN1cmUgdGhlIGRyaXZlciBpc1xuICogaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIHVzZWQsIG9ubHkgaW5pdGlhbGl6ZWQgYW5kIGRlc3Ryb3llZFxuICogb25jZSBldGMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRHJpdmVyIHtcbiAgICAjZHJpdmVyO1xuICAgICNsb2c7XG4gICAgI2luaXRQcm9taXNlO1xuICAgICNpbml0RG9uZTtcbiAgICAjZGVzdHJveVByb21pc2U7XG4gICAgI2Nvbm5lY3Rpb25zID0gbmV3IFdlYWtTZXQoKTtcbiAgICBjb25zdHJ1Y3Rvcihkcml2ZXIsIGxvZykge1xuICAgICAgICB0aGlzLiNpbml0RG9uZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNkcml2ZXIgPSBkcml2ZXI7XG4gICAgICAgIHRoaXMuI2xvZyA9IGxvZztcbiAgICB9XG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RyaXZlciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4jaW5pdFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuI2luaXRQcm9taXNlID0gdGhpcy4jZHJpdmVyXG4gICAgICAgICAgICAgICAgLmluaXQoKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiNpbml0RG9uZSA9IHRydWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4jaW5pdFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLiNpbml0UHJvbWlzZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIGlmICh0aGlzLiNkZXN0cm95UHJvbWlzZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkcml2ZXIgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuI2luaXREb25lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gYXdhaXQgdGhpcy4jZHJpdmVyLmFjcXVpcmVDb25uZWN0aW9uKCk7XG4gICAgICAgIGlmICghdGhpcy4jY29ubmVjdGlvbnMuaGFzKGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy4jbmVlZHNMb2dnaW5nKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy4jY29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBhc3luYyByZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2RyaXZlci5yZWxlYXNlQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9XG4gICAgYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLCBzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgIH1cbiAgICBjb21taXRUcmFuc2FjdGlvbihjb25uZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfVxuICAgIHNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5zYXZlcG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNkcml2ZXIuc2F2ZXBvaW50KGNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIGNvbXBpbGVRdWVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYHNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yb2xsYmFja1RvU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcm9sbGJhY2tUb1NhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgcmVsZWFzZVNhdmVwb2ludChjb25uZWN0aW9uLCBzYXZlcG9pbnROYW1lLCBjb21waWxlUXVlcnkpIHtcbiAgICAgICAgaWYgKHRoaXMuI2RyaXZlci5yZWxlYXNlU2F2ZXBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy4jZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQoY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBgcmVsZWFzZVNhdmVwb2ludGAgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXInKTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLiNpbml0UHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuI2luaXRQcm9taXNlO1xuICAgICAgICBpZiAoIXRoaXMuI2Rlc3Ryb3lQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLiNkZXN0cm95UHJvbWlzZSA9IHRoaXMuI2RyaXZlci5kZXN0cm95KCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuI2Rlc3Ryb3lQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy4jZGVzdHJveVByb21pc2U7XG4gICAgfVxuICAgICNuZWVkc0xvZ2dpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy4jbG9nLmlzTGV2ZWxFbmFibGVkKCdxdWVyeScpIHx8IHRoaXMuI2xvZy5pc0xldmVsRW5hYmxlZCgnZXJyb3InKSk7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIG1vbmtleSBwYXRjaGVzIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uJ3MgZXhlY3V0ZVF1ZXJ5IG1ldGhvZFxuICAgIC8vIGJ5IGFkZGluZyBsb2dnaW5nIGNvZGUgYXJvdW5kIGl0LiBNb25rZXkgcGF0Y2hpbmcgaXMgbm90IHByZXR0eSwgYnV0IGl0J3NcbiAgICAvLyB0aGUgYmVzdCBvcHRpb24gaW4gdGhpcyBjYXNlLlxuICAgICNhZGRMb2dnaW5nKGNvbm5lY3Rpb24pIHtcbiAgICAgICAgY29uc3QgZXhlY3V0ZVF1ZXJ5ID0gY29ubmVjdGlvbi5leGVjdXRlUXVlcnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVF1ZXJ5ID0gY29ubmVjdGlvbi5zdHJlYW1RdWVyeTtcbiAgICAgICAgY29uc3QgZGlzID0gdGhpcztcbiAgICAgICAgY29ubmVjdGlvbi5leGVjdXRlUXVlcnkgPSBhc3luYyAoY29tcGlsZWRRdWVyeSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNhdWdodEVycm9yO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGV4ZWN1dGVRdWVyeS5jYWxsKGNvbm5lY3Rpb24sIGNvbXBpbGVkUXVlcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25uZWN0aW9uLnN0cmVhbVF1ZXJ5ID0gYXN5bmMgZnVuY3Rpb24qIChjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUpIHtcbiAgICAgICAgICAgIGxldCBjYXVnaHRFcnJvcjtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcmVzdWx0IG9mIHN0cmVhbVF1ZXJ5LmNhbGwoY29ubmVjdGlvbiwgY29tcGlsZWRRdWVyeSwgY2h1bmtTaXplKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ0Vycm9yKGVycm9yLCBjb21waWxlZFF1ZXJ5LCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYXVnaHRFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBkaXMuI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBhc3luYyAjbG9nRXJyb3IoZXJyb3IsIGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cuZXJyb3IoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgYXN5bmMgI2xvZ1F1ZXJ5KGNvbXBpbGVkUXVlcnksIHN0YXJ0VGltZSwgaXNTdHJlYW0gPSBmYWxzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLiNsb2cucXVlcnkoKCkgPT4gKHtcbiAgICAgICAgICAgIGxldmVsOiAncXVlcnknLFxuICAgICAgICAgICAgaXNTdHJlYW0sXG4gICAgICAgICAgICBxdWVyeTogY29tcGlsZWRRdWVyeSxcbiAgICAgICAgICAgIHF1ZXJ5RHVyYXRpb25NaWxsaXM6IHRoaXMuI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSksXG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgI2NhbGN1bGF0ZUR1cmF0aW9uTWlsbGlzKHN0YXJ0VGltZSkge1xuICAgICAgICByZXR1cm4gcGVyZm9ybWFuY2VOb3coKSAtIHN0YXJ0VGltZTtcbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3NpbmdsZS1jb25uZWN0aW9uLXByb3ZpZGVyLmQudHNcIiAvPlxuY29uc3QgaWdub3JlRXJyb3IgPSAoKSA9PiB7IH07XG5leHBvcnQgY2xhc3MgU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIHtcbiAgICAjY29ubmVjdGlvbjtcbiAgICAjcnVubmluZ1Byb21pc2U7XG4gICAgY29uc3RydWN0b3IoY29ubmVjdGlvbikge1xuICAgICAgICB0aGlzLiNjb25uZWN0aW9uID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgYXN5bmMgcHJvdmlkZUNvbm5lY3Rpb24oY29uc3VtZXIpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuI3J1bm5pbmdQcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNydW5uaW5nUHJvbWlzZS5jYXRjaChpZ25vcmVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYCNydW5uaW5nUHJvbWlzZWAgbXVzdCBiZSBzZXQgdG8gdW5kZWZpbmVkIGJlZm9yZSBpdCdzXG4gICAgICAgIC8vIHJlc29sdmVkIG9yIHJlamVjdGVkLiBPdGhlcndpc2UgdGhlIHdoaWxlIGxvb3AgYWJvdmVcbiAgICAgICAgLy8gd2lsbCBtaXNiZWhhdmUuXG4gICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdGhpcy4jcnVuKGNvbnN1bWVyKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuI3J1bm5pbmdQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3J1bm5pbmdQcm9taXNlO1xuICAgIH1cbiAgICAvLyBSdW4gdGhlIHJ1bm5lciBpbiBhbiBhc3luYyBmdW5jdGlvbiB0byBtYWtlIHN1cmUgaXQgZG9lc24ndFxuICAgIC8vIHRocm93IHN5bmNocm9ub3VzIGVycm9ycy5cbiAgICBhc3luYyAjcnVuKHJ1bm5lcikge1xuICAgICAgICByZXR1cm4gYXdhaXQgcnVubmVyKHRoaXMuI2Nvbm5lY3Rpb24pO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vZHJpdmVyLmQudHNcIiAvPlxuZXhwb3J0IGNvbnN0IFRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyA9IFsncmVhZCBvbmx5JywgJ3JlYWQgd3JpdGUnXTtcbmV4cG9ydCBjb25zdCBUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTID0gW1xuICAgICdyZWFkIHVuY29tbWl0dGVkJyxcbiAgICAncmVhZCBjb21taXR0ZWQnLFxuICAgICdyZXBlYXRhYmxlIHJlYWQnLFxuICAgICdzZXJpYWxpemFibGUnLFxuICAgICdzbmFwc2hvdCcsXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIGlmIChzZXR0aW5ncy5hY2Nlc3NNb2RlICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9BQ0NFU1NfTU9ERVMuaW5jbHVkZXMoc2V0dGluZ3MuYWNjZXNzTW9kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGFjY2VzcyBtb2RlICR7c2V0dGluZ3MuYWNjZXNzTW9kZX1gKTtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsICYmXG4gICAgICAgICFUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTLmluY2x1ZGVzKHNldHRpbmdzLmlzb2xhdGlvbkxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVsICR7c2V0dGluZ3MuaXNvbGF0aW9uTGV2ZWx9YCk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9sb2cuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUsIGlzRnVuY3Rpb24gfSBmcm9tICcuL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY29uc3QgTE9HX0xFVkVMUyA9IGZyZWV6ZShbJ3F1ZXJ5JywgJ2Vycm9yJ10pO1xuZXhwb3J0IGNsYXNzIExvZyB7XG4gICAgI2xldmVscztcbiAgICAjbG9nZ2VyO1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb25maWcpKSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLiNsZXZlbHMgPSBmcmVlemUoe1xuICAgICAgICAgICAgICAgIHF1ZXJ5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNsb2dnZXIgPSBkZWZhdWx0TG9nZ2VyO1xuICAgICAgICAgICAgdGhpcy4jbGV2ZWxzID0gZnJlZXplKHtcbiAgICAgICAgICAgICAgICBxdWVyeTogY29uZmlnLmluY2x1ZGVzKCdxdWVyeScpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBjb25maWcuaW5jbHVkZXMoJ2Vycm9yJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jbGV2ZWxzW2xldmVsXTtcbiAgICB9XG4gICAgYXN5bmMgcXVlcnkoZ2V0RXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuI2xldmVscy5xdWVyeSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jbG9nZ2VyKGdldEV2ZW50KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGVycm9yKGdldEV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLiNsZXZlbHMuZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2xvZ2dlcihnZXRFdmVudCgpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGRlZmF1bHRMb2dnZXIoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQubGV2ZWwgPT09ICdxdWVyeScpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gYGt5c2VseTpxdWVyeToke2V2ZW50LmlzU3RyZWFtID8gJ3N0cmVhbTonIDogJyd9YDtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSAke2V2ZW50LnF1ZXJ5LnNxbH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cHJlZml4fSBkdXJhdGlvbjogJHtldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLnRvRml4ZWQoMSl9bXNgKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZlbnQubGV2ZWwgPT09ICdlcnJvcicpIHtcbiAgICAgICAgaWYgKGV2ZW50LmVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGt5c2VseTplcnJvcjogJHtldmVudC5lcnJvci5zdGFjayA/PyBldmVudC5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihga3lzZWx5OmVycm9yOiAke0pTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXZlbnQuZXJyb3IsXG4gICAgICAgICAgICAgICAgcXVlcnk6IGV2ZW50LnF1ZXJ5LnNxbCxcbiAgICAgICAgICAgICAgICBxdWVyeUR1cmF0aW9uTWlsbGlzOiBldmVudC5xdWVyeUR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgfSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2NvbXBpbGFibGUuZC50c1wiIC8+XG5pbXBvcnQgeyBpc0Z1bmN0aW9uLCBpc09iamVjdCB9IGZyb20gJy4vb2JqZWN0LXV0aWxzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gaXNPYmplY3QodmFsdWUpICYmIGlzRnVuY3Rpb24odmFsdWUuY29tcGlsZSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2t5c2VseS5kLnRzXCIgLz5cbmltcG9ydCB7IFNjaGVtYU1vZHVsZSB9IGZyb20gJy4vc2NoZW1hL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnLi9keW5hbWljL2R5bmFtaWMuanMnO1xuaW1wb3J0IHsgRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciB9IGZyb20gJy4vZHJpdmVyL2RlZmF1bHQtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyBRdWVyeUNyZWF0b3IgfSBmcm9tICcuL3F1ZXJ5LWNyZWF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IgfSBmcm9tICcuL3F1ZXJ5LWV4ZWN1dG9yL2RlZmF1bHQtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc09iamVjdCwgaXNVbmRlZmluZWQgfSBmcm9tICcuL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IFJ1bnRpbWVEcml2ZXIgfSBmcm9tICcuL2RyaXZlci9ydW50aW1lLWRyaXZlci5qcyc7XG5pbXBvcnQgeyBTaW5nbGVDb25uZWN0aW9uUHJvdmlkZXIgfSBmcm9tICcuL2RyaXZlci9zaW5nbGUtY29ubmVjdGlvbi1wcm92aWRlci5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRyYW5zYWN0aW9uU2V0dGluZ3MsIH0gZnJvbSAnLi9kcml2ZXIvZHJpdmVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZUZ1bmN0aW9uTW9kdWxlLCB9IGZyb20gJy4vcXVlcnktYnVpbGRlci9mdW5jdGlvbi1tb2R1bGUuanMnO1xuaW1wb3J0IHsgTG9nIH0gZnJvbSAnLi91dGlsL2xvZy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVRdWVyeUlkIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGlzQ29tcGlsYWJsZSB9IGZyb20gJy4vdXRpbC9jb21waWxhYmxlLmpzJztcbmltcG9ydCB7IENhc2VCdWlsZGVyIH0gZnJvbSAnLi9xdWVyeS1idWlsZGVyL2Nhc2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBDYXNlTm9kZSB9IGZyb20gJy4vb3BlcmF0aW9uLW5vZGUvY2FzZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlRXhwcmVzc2lvbiB9IGZyb20gJy4vcGFyc2VyL2V4cHJlc3Npb24tcGFyc2VyLmpzJztcbmltcG9ydCB7IFdpdGhTY2hlbWFQbHVnaW4gfSBmcm9tICcuL3BsdWdpbi93aXRoLXNjaGVtYS93aXRoLXNjaGVtYS1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uLCB9IGZyb20gJy4vdXRpbC9wcm92aWRlLWNvbnRyb2xsZWQtY29ubmVjdGlvbi5qcyc7XG4vLyBAdHMtaWdub3JlXG5TeW1ib2wuYXN5bmNEaXNwb3NlID8/PSBTeW1ib2woJ1N5bWJvbC5hc3luY0Rpc3Bvc2UnKTtcbi8qKlxuICogVGhlIG1haW4gS3lzZWx5IGNsYXNzLlxuICpcbiAqIFlvdSBzaG91bGQgY3JlYXRlIG9uZSBpbnN0YW5jZSBvZiBgS3lzZWx5YCBwZXIgZGF0YWJhc2UgdXNpbmcgdGhlIHtAbGluayBLeXNlbHl9XG4gKiBjb25zdHJ1Y3Rvci4gRWFjaCBgS3lzZWx5YCBpbnN0YW5jZSBtYWludGFpbnMgaXRzIG93biBjb25uZWN0aW9uIHBvb2wuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogVGhpcyBleGFtcGxlIGFzc3VtZXMgeW91ciBkYXRhYmFzZSBoYXMgYSBcInBlcnNvblwiIHRhYmxlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgKiBhcyBTcWxpdGUgZnJvbSAnYmV0dGVyLXNxbGl0ZTMnXG4gKiBpbXBvcnQge1x1MDBBMHR5cGUgR2VuZXJhdGVkLCBLeXNlbHksIFNxbGl0ZURpYWxlY3QgfSBmcm9tICdreXNlbHknXG4gKlxuICogaW50ZXJmYWNlIERhdGFiYXNlIHtcbiAqICAgcGVyc29uOiB7XG4gKiAgICAgaWQ6IEdlbmVyYXRlZDxudW1iZXI+XG4gKiAgICAgZmlyc3RfbmFtZTogc3RyaW5nXG4gKiAgICAgbGFzdF9uYW1lOiBzdHJpbmcgfCBudWxsXG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBjb25zdCBkYiA9IG5ldyBLeXNlbHk8RGF0YWJhc2U+KHtcbiAqICAgZGlhbGVjdDogbmV3IFNxbGl0ZURpYWxlY3Qoe1xuICogICAgIGRhdGFiYXNlOiBuZXcgU3FsaXRlKCc6bWVtb3J5OicpLFxuICogICB9KVxuICogfSlcbiAqIGBgYFxuICpcbiAqIEB0eXBlUGFyYW0gREIgLSBUaGUgZGF0YWJhc2UgaW50ZXJmYWNlIHR5cGUuIEtleXMgb2YgdGhpcyB0eXBlIG11c3QgYmUgdGFibGUgbmFtZXNcbiAqICAgIGluIHRoZSBkYXRhYmFzZSBhbmQgdmFsdWVzIG11c3QgYmUgaW50ZXJmYWNlcyB0aGF0IGRlc2NyaWJlIHRoZSByb3dzIGluIHRob3NlXG4gKiAgICB0YWJsZXMuIFNlZSB0aGUgZXhhbXBsZXMgYWJvdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBLeXNlbHkgZXh0ZW5kcyBRdWVyeUNyZWF0b3Ige1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3RvcihhcmdzKSB7XG4gICAgICAgIGxldCBzdXBlclByb3BzO1xuICAgICAgICBsZXQgcHJvcHM7XG4gICAgICAgIGlmIChpc0t5c2VseVByb3BzKGFyZ3MpKSB7XG4gICAgICAgICAgICBzdXBlclByb3BzID0geyBleGVjdXRvcjogYXJncy5leGVjdXRvciB9O1xuICAgICAgICAgICAgcHJvcHMgPSB7IC4uLmFyZ3MgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxlY3QgPSBhcmdzLmRpYWxlY3Q7XG4gICAgICAgICAgICBjb25zdCBkcml2ZXIgPSBkaWFsZWN0LmNyZWF0ZURyaXZlcigpO1xuICAgICAgICAgICAgY29uc3QgY29tcGlsZXIgPSBkaWFsZWN0LmNyZWF0ZVF1ZXJ5Q29tcGlsZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXIgPSBkaWFsZWN0LmNyZWF0ZUFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGxvZyA9IG5ldyBMb2coYXJncy5sb2cgPz8gW10pO1xuICAgICAgICAgICAgY29uc3QgcnVudGltZURyaXZlciA9IG5ldyBSdW50aW1lRHJpdmVyKGRyaXZlciwgbG9nKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25Qcm92aWRlciA9IG5ldyBEZWZhdWx0Q29ubmVjdGlvblByb3ZpZGVyKHJ1bnRpbWVEcml2ZXIpO1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRGVmYXVsdFF1ZXJ5RXhlY3V0b3IoY29tcGlsZXIsIGFkYXB0ZXIsIGNvbm5lY3Rpb25Qcm92aWRlciwgYXJncy5wbHVnaW5zID8/IFtdKTtcbiAgICAgICAgICAgIHN1cGVyUHJvcHMgPSB7IGV4ZWN1dG9yIH07XG4gICAgICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IGFyZ3MsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICAgICAgZGlhbGVjdCxcbiAgICAgICAgICAgICAgICBkcml2ZXI6IHJ1bnRpbWVEcml2ZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHN1cGVyUHJvcHMpO1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHtAbGluayBTY2hlbWFNb2R1bGV9IG1vZHVsZSBmb3IgYnVpbGRpbmcgZGF0YWJhc2Ugc2NoZW1hLlxuICAgICAqL1xuICAgIGdldCBzY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZW1hTW9kdWxlKHRoaXMuI3Byb3BzLmV4ZWN1dG9yKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHRoZSB7QGxpbmsgRHluYW1pY01vZHVsZX0gbW9kdWxlLlxuICAgICAqXG4gICAgICogVGhlIHtAbGluayBEeW5hbWljTW9kdWxlfSBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gYnlwYXNzIHN0cmljdCB0eXBpbmcgYW5kXG4gICAgICogcGFzc2luZyBpbiBkeW5hbWljIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZXMuXG4gICAgICovXG4gICAgZ2V0IGR5bmFtaWMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRHluYW1pY01vZHVsZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIERhdGFiYXNlSW50cm9zcGVjdG9yIHwgZGF0YWJhc2UgaW50cm9zcGVjdG9yfS5cbiAgICAgKi9cbiAgICBnZXQgaW50cm9zcGVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmRpYWxlY3QuY3JlYXRlSW50cm9zcGVjdG9yKHRoaXMud2l0aG91dFBsdWdpbnMoKSk7XG4gICAgfVxuICAgIGNhc2UodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDYXNlQnVpbGRlcih7XG4gICAgICAgICAgICBub2RlOiBDYXNlTm9kZS5jcmVhdGUoaXNVbmRlZmluZWQodmFsdWUpID8gdW5kZWZpbmVkIDogcGFyc2VFeHByZXNzaW9uKHZhbHVlKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEZ1bmN0aW9uTW9kdWxlfSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIHNvbWV3aGF0IHR5cGUtc2FmZSBmdW5jdGlvblxuICAgICAqIGNhbGxzLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB7IGNvdW50IH0gPSBkYi5mblxuICAgICAqXG4gICAgICogYXdhaXQgZGIuc2VsZWN0RnJvbSgncGVyc29uJylcbiAgICAgKiAgIC5pbm5lckpvaW4oJ3BldCcsICdwZXQub3duZXJfaWQnLCAncGVyc29uLmlkJylcbiAgICAgKiAgIC5zZWxlY3QoW1xuICAgICAqICAgICAnaWQnLFxuICAgICAqICAgICBjb3VudCgncGV0LmlkJykuYXMoJ3BlcnNvbl9jb3VudCcpLFxuICAgICAqICAgXSlcbiAgICAgKiAgIC5ncm91cEJ5KCdwZXJzb24uaWQnKVxuICAgICAqICAgLmhhdmluZyhjb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gICAgICpcbiAgICAgKiBgYGBzcWxcbiAgICAgKiBzZWxlY3QgXCJwZXJzb25cIi5cImlkXCIsIGNvdW50KFwicGV0XCIuXCJpZFwiKSBhcyBcInBlcnNvbl9jb3VudFwiXG4gICAgICogZnJvbSBcInBlcnNvblwiXG4gICAgICogaW5uZXIgam9pbiBcInBldFwiIG9uIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAgICAgKiBncm91cCBieSBcInBlcnNvblwiLlwiaWRcIlxuICAgICAqIGhhdmluZyBjb3VudChcInBldFwiLlwiaWRcIikgPiAkMVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogV2h5IFwic29tZXdoYXRcIiB0eXBlLXNhZmU/IEJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNhbGxzIGFyZSBub3QgYm91bmQgdG8gdGhlXG4gICAgICogY3VycmVudCBxdWVyeSBjb250ZXh0LiBUaGV5IGFsbG93IHlvdSB0byByZWZlcmVuY2UgY29sdW1ucyBhbmQgdGFibGVzIHRoYXRcbiAgICAgKiBhcmUgbm90IGluIHRoZSBjdXJyZW50IHF1ZXJ5LiBFLmcuIHJlbW92ZSB0aGUgYGlubmVySm9pbmAgZnJvbSB0aGUgcHJldmlvdXNcbiAgICAgKiBxdWVyeSBhbmQgVHlwZVNjcmlwdCB3b24ndCBldmVuIGNvbXBsYWluLlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gbWFrZSB0aGUgZnVuY3Rpb24gY2FsbHMgZnVsbHkgdHlwZS1zYWZlLCB5b3UgY2FuIHVzZSB0aGVcbiAgICAgKiB7QGxpbmsgRXhwcmVzc2lvbkJ1aWxkZXIuZm59IGdldHRlciBmb3IgYSBxdWVyeSBjb250ZXh0LWF3YXJlLCBzdHJpY3RlciB7QGxpbmsgRnVuY3Rpb25Nb2R1bGV9LlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICAgICAqICAgLmlubmVySm9pbigncGV0JywgJ3BldC5vd25lcl9pZCcsICdwZXJzb24uaWQnKVxuICAgICAqICAgLnNlbGVjdCgoZWIpID0+IFtcbiAgICAgKiAgICAgJ3BlcnNvbi5pZCcsXG4gICAgICogICAgIGViLmZuLmNvdW50KCdwZXQuaWQnKS5hcygncGV0X2NvdW50JylcbiAgICAgKiAgIF0pXG4gICAgICogICAuZ3JvdXBCeSgncGVyc29uLmlkJylcbiAgICAgKiAgIC5oYXZpbmcoKGViKSA9PiBlYi5mbi5jb3VudCgncGV0LmlkJyksICc+JywgMTApXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZ2V0IGZuKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25Nb2R1bGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi4gVGhlXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSBtZXRob2QgY2FuIHRoZW4gYmUgY2FsbGVkIHRvIHJ1biB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICoge0BsaW5rIFRyYW5zYWN0aW9uQnVpbGRlci5leGVjdXRlfSB0YWtlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIGluc2lkZSB0aGVcbiAgICAgKiB0cmFuc2FjdGlvbi4gSWYgdGhlIGZ1bmN0aW9uIHRocm93cyBhbiBleGNlcHRpb24sXG4gICAgICogMS4gdGhlIGV4Y2VwdGlvbiBpcyBjYXVnaHQsXG4gICAgICogMi4gdGhlIHRyYW5zYWN0aW9uIGlzIHJvbGxlZCBiYWNrLCBhbmRcbiAgICAgKiAzLiB0aGUgZXhjZXB0aW9uIGlzIHRocm93biBhZ2Fpbi5cbiAgICAgKiBPdGhlcndpc2UgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIHtAbGluayBUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZSB8IGV4ZWN1dGV9XG4gICAgICogbWV0aG9kIGdldHMgdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBhcyBpdHMgb25seSBhcmd1bWVudC4gVGhlIHRyYW5zYWN0aW9uIGlzXG4gICAgICogb2YgdHlwZSB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGluaGVyaXRzIHtAbGluayBLeXNlbHl9LiBBbnkgcXVlcnlcbiAgICAgKiBzdGFydGVkIHRocm91Z2ggdGhlIHRyYW5zYWN0aW9uIG9iamVjdCBpcyBleGVjdXRlZCBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogVG8gcnVuIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbiwgYWxsb3dpbmcgeW91IHRvIGNvbW1pdCBhbmQgcm9sbGJhY2sgbWFudWFsbHksXG4gICAgICogdXNlIHtAbGluayBzdGFydFRyYW5zYWN0aW9ufSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiU2ltcGxlIHRyYW5zYWN0aW9uXCIsIDEwKSAtLT5cbiAgICAgKlxuICAgICAqIFRoaXMgZXhhbXBsZSBpbnNlcnRzIHR3byByb3dzIGluIGEgdHJhbnNhY3Rpb24uIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zaWRlXG4gICAgICogdGhlIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgYGV4ZWN1dGVgIG1ldGhvZCxcbiAgICAgKiAxLiB0aGUgZXhjZXB0aW9uIGlzIGNhdWdodCxcbiAgICAgKiAyLiB0aGUgdHJhbnNhY3Rpb24gaXMgcm9sbGVkIGJhY2ssIGFuZFxuICAgICAqIDMuIHRoZSBleGNlcHRpb24gaXMgdGhyb3duIGFnYWluLlxuICAgICAqIE90aGVyd2lzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCBjYXR0byA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCkuZXhlY3V0ZShhc3luYyAodHJ4KSA9PiB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgcmV0dXJuIGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXQnKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgbmFtZTogJ0NhdHRvJyxcbiAgICAgKiAgICAgICBzcGVjaWVzOiAnY2F0JyxcbiAgICAgKiAgICAgICBpc19mYXZvcml0ZTogZmFsc2UsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdCgpXG4gICAgICogfSlcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFNldHRpbmcgdGhlIGlzb2xhdGlvbiBsZXZlbDpcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICpcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLnRyYW5zYWN0aW9uKClcbiAgICAgKiAgIC5zZXRJc29sYXRpb25MZXZlbCgnc2VyaWFsaXphYmxlJylcbiAgICAgKiAgIC5leGVjdXRlKGFzeW5jICh0cngpID0+IHtcbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZih0cngpXG4gICAgICogICB9KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9TdHVmZihreXNlbHk6IHR5cGVvZiBkYikge1xuICAgICAqICAgLy8gLi4uXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXJ9IHRoYXQgY2FuIGJlIHVzZWQgdG8gcnVuIHF1ZXJpZXMgaW5zaWRlIGEgY29udHJvbGxlZCB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcn0gY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBUaGUge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIuZXhlY3V0ZX0gbWV0aG9kIGNhbiB0aGVuIGJlIGNhbGxlZFxuICAgICAqIHRvIHN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhbmQgcmV0dXJuIGEge0BsaW5rIENvbnRyb2xsZWRUcmFuc2FjdGlvbn0uXG4gICAgICpcbiAgICAgKiBBIHtAbGluayBDb250cm9sbGVkVHJhbnNhY3Rpb259IGFsbG93cyB5b3UgdG8gY29tbWl0IGFuZCByb2xsYmFjayBtYW51YWxseSxcbiAgICAgKiBleGVjdXRlIHNhdmVwb2ludCBjb21tYW5kcy4gSXQgZXh0ZW5kcyB7QGxpbmsgVHJhbnNhY3Rpb259IHdoaWNoIGV4dGVuZHMge0BsaW5rIEt5c2VseX0sXG4gICAgICogc28geW91IGNhbiBydW4gcXVlcmllcyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uLiBPbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQsXG4gICAgICogb3Igcm9sbGVkIGJhY2ssIGl0IGNhbid0IGJlIHVzZWQgYW55bW9yZSAtIGFsbCBxdWVyaWVzIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgICogVGhpcyBpcyB0byBwcmV2ZW50IGFjY2lkZW50YWxseSBydW5uaW5nIHF1ZXJpZXMgb3V0c2lkZSB0aGUgdHJhbnNhY3Rpb24gLSB3aGVyZVxuICAgICAqIGF0b21pY2l0eSBpcyBub3QgZ3VhcmFudGVlZCBhbnltb3JlLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiA8IS0tIHNpdGVFeGFtcGxlKFwidHJhbnNhY3Rpb25zXCIsIFwiQ29udHJvbGxlZCB0cmFuc2FjdGlvblwiLCAxMSkgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIHVzZSBpdCB0byBpbnNlcnQgdHdvIHJvd3MgYW5kIHRoZW4gY29tbWl0XG4gICAgICogdGhlIHRyYW5zYWN0aW9uLiBJZiBhbiBlcnJvciBpcyB0aHJvd24sIHdlIGNhdGNoIGl0IGFuZCByb2xsYmFjayB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBjb25zdCBqZW5uaWZlciA9IGF3YWl0IHRyeC5pbnNlcnRJbnRvKCdwZXJzb24nKVxuICAgICAqICAgICAudmFsdWVzKHtcbiAgICAgKiAgICAgICBmaXJzdF9uYW1lOiAnSmVubmlmZXInLFxuICAgICAqICAgICAgIGxhc3RfbmFtZTogJ0FuaXN0b24nLFxuICAgICAqICAgICAgIGFnZTogNDAsXG4gICAgICogICAgIH0pXG4gICAgICogICAgIC5yZXR1cm5pbmcoJ2lkJylcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnguaW5zZXJ0SW50bygncGV0JylcbiAgICAgKiAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgb3duZXJfaWQ6IGplbm5pZmVyLmlkLFxuICAgICAqICAgICAgIG5hbWU6ICdDYXR0bycsXG4gICAgICogICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgaXNfZmF2b3JpdGU6IGZhbHNlLFxuICAgICAqICAgICB9KVxuICAgICAqICAgICAucmV0dXJuaW5nQWxsKClcbiAgICAgKiAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogPCEtLSBzaXRlRXhhbXBsZShcInRyYW5zYWN0aW9uc1wiLCBcIkNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gL3cgc2F2ZXBvaW50c1wiLCAxMikgLS0+XG4gICAgICpcbiAgICAgKiBBIGNvbnRyb2xsZWQgdHJhbnNhY3Rpb24gYWxsb3dzIHlvdSB0byBjb21taXQgYW5kIHJvbGxiYWNrIG1hbnVhbGx5LCBleGVjdXRlXG4gICAgICogc2F2ZXBvaW50IGNvbW1hbmRzLCBhbmQgcXVlcmllcyBpbiBnZW5lcmFsLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IGEgdHJhbnNhY3Rpb24sIGluc2VydCBhIHBlcnNvbiwgY3JlYXRlIGEgc2F2ZXBvaW50LFxuICAgICAqIHRyeSBpbnNlcnRpbmcgYSB0b3kgYW5kIGEgcGV0LCBhbmQgaWYgYW4gZXJyb3IgaXMgdGhyb3duLCB3ZSByb2xsYmFjayB0byB0aGVcbiAgICAgKiBzYXZlcG9pbnQuIEV2ZW50dWFsbHkgd2UgcmVsZWFzZSB0aGUgc2F2ZXBvaW50LCBpbnNlcnQgYW4gYXVkaXQgcmVjb3JkIGFuZFxuICAgICAqIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24uIElmIGFuIGVycm9yIGlzIHRocm93biwgd2UgY2F0Y2ggaXQgYW5kIHJvbGxiYWNrIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLlxuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgY29uc3QgamVubmlmZXIgPSBhd2FpdCB0cnhcbiAgICAgKiAgICAgLmluc2VydEludG8oJ3BlcnNvbicpXG4gICAgICogICAgIC52YWx1ZXMoe1xuICAgICAqICAgICAgIGZpcnN0X25hbWU6ICdKZW5uaWZlcicsXG4gICAgICogICAgICAgbGFzdF9uYW1lOiAnQW5pc3RvbicsXG4gICAgICogICAgICAgYWdlOiA0MCxcbiAgICAgKiAgICAgfSlcbiAgICAgKiAgICAgLnJldHVybmluZygnaWQnKVxuICAgICAqICAgICAuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuICAgICAqXG4gICAgICogICBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgdHJ5IHtcbiAgICAgKiAgICAgY29uc3QgY2F0dG8gPSBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3BldCcpXG4gICAgICogICAgICAgLnZhbHVlcyh7XG4gICAgICogICAgICAgICBvd25lcl9pZDogamVubmlmZXIuaWQsXG4gICAgICogICAgICAgICBuYW1lOiAnQ2F0dG8nLFxuICAgICAqICAgICAgICAgc3BlY2llczogJ2NhdCcsXG4gICAgICogICAgICAgfSlcbiAgICAgKiAgICAgICAucmV0dXJuaW5nKCdpZCcpXG4gICAgICogICAgICAgLmV4ZWN1dGVUYWtlRmlyc3RPclRocm93KClcbiAgICAgKlxuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyXG4gICAgICogICAgICAgLmluc2VydEludG8oJ3RveScpXG4gICAgICogICAgICAgLnZhbHVlcyh7IG5hbWU6ICdCb25lJywgcHJpY2U6IDEuOTksIHBldF9pZDogY2F0dG8uaWQgfSlcbiAgICAgKiAgICAgICAuZXhlY3V0ZSgpXG4gICAgICogICB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogICB9XG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucmVsZWFzZVNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4Lmluc2VydEludG8oJ2F1ZGl0JykudmFsdWVzKHsgYWN0aW9uOiAnYWRkZWQgSmVubmlmZXInIH0pLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogICBhd2FpdCB0cnguY29tbWl0KCkuZXhlY3V0ZSgpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeC5yb2xsYmFjaygpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzdGFydFRyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSBreXNlbHkgaW5zdGFuY2UgYm91bmQgdG8gYSBzaW5nbGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBhd2FpdCBkYlxuICAgICAqICAgLmNvbm5lY3Rpb24oKVxuICAgICAqICAgLmV4ZWN1dGUoYXN5bmMgKGRiKSA9PiB7XG4gICAgICogICAgIC8vIGBkYmAgaXMgYW4gaW5zdGFuY2Ugb2YgYEt5c2VseWAgdGhhdCdzIGJvdW5kIHRvIGEgc2luZ2xlXG4gICAgICogICAgIC8vIGRhdGFiYXNlIGNvbm5lY3Rpb24uIEFsbCBxdWVyaWVzIGV4ZWN1dGVkIHRocm91Z2ggYGRiYCB1c2VcbiAgICAgKiAgICAgLy8gdGhlIHNhbWUgY29ubmVjdGlvbi5cbiAgICAgKiAgICAgYXdhaXQgZG9TdHVmZihkYilcbiAgICAgKiAgIH0pXG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1N0dWZmKGt5c2VseTogdHlwZW9mIGRiKSB7XG4gICAgICogICAvLyAuLi5cbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uQnVpbGRlcih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEt5c2VseSBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBwbHVnaW4gaW5zdGFsbGVkLlxuICAgICAqL1xuICAgIHdpdGhQbHVnaW4ocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGhvdXQgYW55IHBsdWdpbnMuXG4gICAgICovXG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgS3lzZWx5IGluc3RhbmNlIHdpdGggdGFibGVzIGFkZGVkIHRvIGl0c1xuICAgICAqIGRhdGFiYXNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1vZGlmaWVzIHRoZSB0eXBlcyBhbmQgZG9lc24ndCBhZmZlY3QgYW55IG9mIHRoZVxuICAgICAqIGV4ZWN1dGVkIHF1ZXJpZXMgaW4gYW55IHdheS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGFkZHMgYW5kIHVzZXMgYSB0ZW1wb3JhcnkgdGFibGU6XG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGF3YWl0IGRiLnNjaGVtYVxuICAgICAqICAgLmNyZWF0ZVRhYmxlKCd0ZW1wX3RhYmxlJylcbiAgICAgKiAgIC50ZW1wb3JhcnkoKVxuICAgICAqICAgLmFkZENvbHVtbignc29tZV9jb2x1bW4nLCAnaW50ZWdlcicpXG4gICAgICogICAuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBjb25zdCB0ZW1wRGIgPSBkYi53aXRoVGFibGVzPHtcbiAgICAgKiAgIHRlbXBfdGFibGU6IHtcbiAgICAgKiAgICAgc29tZV9jb2x1bW46IG51bWJlclxuICAgICAqICAgfVxuICAgICAqIH0+KClcbiAgICAgKlxuICAgICAqIGF3YWl0IHRlbXBEYlxuICAgICAqICAgLmluc2VydEludG8oJ3RlbXBfdGFibGUnKVxuICAgICAqICAgLnZhbHVlcyh7IHNvbWVfY29sdW1uOiAxMDAgfSlcbiAgICAgKiAgIC5leGVjdXRlKClcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICB3aXRoVGFibGVzKCkge1xuICAgICAgICByZXR1cm4gbmV3IEt5c2VseSh7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGFuZCBkaXNjb25uZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS5cbiAgICAgKlxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgYEt5c2VseWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYEt5c2VseWAgaW5zdGFuY2UgaXMgYSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgYGRiIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25gLlxuICAgICAqL1xuICAgIGdldCBpc1RyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZ2V0RXhlY3V0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcm9wcy5leGVjdXRvcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYSBnaXZlbiBjb21waWxlZCBxdWVyeSBvciBxdWVyeSBidWlsZGVyLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20va3lzZWx5LW9yZy9reXNlbHkvYmxvYi9tYXN0ZXIvc2l0ZS9kb2NzL3JlY2lwZXMvMDAwNC1zcGxpdHRpbmctcXVlcnktYnVpbGRpbmctYW5kLWV4ZWN1dGlvbi5tZCNleGVjdXRlLWNvbXBpbGVkLXF1ZXJpZXMgc3BsaXR0aW5nIGJ1aWxkLCBjb21waWxlIGFuZCBleGVjdXRlIGNvZGUgcmVjaXBlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBleGVjdXRlUXVlcnkocXVlcnksIHF1ZXJ5SWQgPSBjcmVhdGVRdWVyeUlkKCkpIHtcbiAgICAgICAgY29uc3QgY29tcGlsZWRRdWVyeSA9IGlzQ29tcGlsYWJsZShxdWVyeSkgPyBxdWVyeS5jb21waWxlKCkgOiBxdWVyeTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhlY3V0b3IoKS5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgS3lzZWx5IHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLiNwcm9wcyA9IHByb3BzO1xuICAgIH1cbiAgICAvLyBUaGUgcmV0dXJuIHR5cGUgaXMgYHRydWVgIGluc3RlYWQgb2YgYGJvb2xlYW5gIHRvIG1ha2UgS3lzZWx5PERCPlxuICAgIC8vIHVuYXNzaWduYWJsZSB0byBUcmFuc2FjdGlvbjxEQj4gd2hpbGUgYWxsb3dpbmcgYXNzaWdubWVudCB0aGVcbiAgICAvLyBvdGhlciB3YXkgYXJvdW5kLlxuICAgIGdldCBpc1RyYW5zYWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgdHJhbnNhY3Rpb24gbWV0aG9kIGZvciBhIFRyYW5zYWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgY29ubmVjdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsaW5nIHRoZSBjb25uZWN0aW9uIG1ldGhvZCBmb3IgYSBUcmFuc2FjdGlvbiBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICAgIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0aGUgZGVzdHJveSBtZXRob2QgZm9yIGEgVHJhbnNhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhvdXRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhQbHVnaW5BdEZyb250KG5ldyBXaXRoU2NoZW1hUGx1Z2luKHNjaGVtYSkpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFRhYmxlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0t5c2VseVByb3BzKG9iaikge1xuICAgIHJldHVybiAoaXNPYmplY3Qob2JqKSAmJlxuICAgICAgICBpc09iamVjdChvYmouY29uZmlnKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZHJpdmVyKSAmJlxuICAgICAgICBpc09iamVjdChvYmouZXhlY3V0b3IpICYmXG4gICAgICAgIGlzT2JqZWN0KG9iai5kaWFsZWN0KSk7XG59XG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkJ1aWxkZXIge1xuICAgICNwcm9wcztcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICB0aGlzLiNwcm9wcyA9IGZyZWV6ZShwcm9wcyk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uKSk7XG4gICAgICAgICAgICBjb25zdCBkYiA9IG5ldyBLeXNlbHkoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soZGIpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBzZXRBY2Nlc3NNb2RlKGFjY2Vzc01vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBhY2Nlc3NNb2RlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0SXNvbGF0aW9uTGV2ZWwoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgeyBpc29sYXRpb25MZXZlbCwgYWNjZXNzTW9kZSwgLi4ua3lzZWx5UHJvcHMgfSA9IHRoaXMuI3Byb3BzO1xuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUgfTtcbiAgICAgICAgdmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzKHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3Byb3BzLmV4ZWN1dG9yLnByb3ZpZGVDb25uZWN0aW9uKGFzeW5jIChjb25uZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleGVjdXRvciA9IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uKSk7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAgICAgLi4ua3lzZWx5UHJvcHMsXG4gICAgICAgICAgICAgICAgZXhlY3V0b3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLmJlZ2luVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgc2V0dGluZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuY29tbWl0VHJhbnNhY3Rpb24oY29ubmVjdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5yb2xsYmFja1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgI3Byb3BzO1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHRoaXMuI3Byb3BzID0gZnJlZXplKHByb3BzKTtcbiAgICB9XG4gICAgc2V0QWNjZXNzTW9kZShhY2Nlc3NNb2RlKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlcih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGFjY2Vzc01vZGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXRJc29sYXRpb25MZXZlbChpc29sYXRpb25MZXZlbCkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbkJ1aWxkZXIoe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBpc29sYXRpb25MZXZlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIGV4ZWN1dGUoKSB7XG4gICAgICAgIGNvbnN0IHsgaXNvbGF0aW9uTGV2ZWwsIGFjY2Vzc01vZGUsIC4uLnByb3BzIH0gPSB0aGlzLiNwcm9wcztcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7IGlzb2xhdGlvbkxldmVsLCBhY2Nlc3NNb2RlIH07XG4gICAgICAgIHZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBhd2FpdCBwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24odGhpcy4jcHJvcHMuZXhlY3V0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIuYmVnaW5UcmFuc2FjdGlvbihjb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNldHRpbmdzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBjb25uZWN0aW9uLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIobmV3IFNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlcihjb25uZWN0aW9uLmNvbm5lY3Rpb24pKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyb2xsZWRUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgICAjcHJvcHM7XG4gICAgI2NvbXBpbGVRdWVyeTtcbiAgICAjc3RhdGU7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB7IGlzQ29tbWl0dGVkOiBmYWxzZSwgaXNSb2xsZWRCYWNrOiBmYWxzZSB9O1xuICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcihwcm9wcy5leGVjdXRvciwgc3RhdGUpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLnRyYW5zYWN0aW9uUHJvcHMgfSA9IHByb3BzO1xuICAgICAgICBzdXBlcih0cmFuc2FjdGlvblByb3BzKTtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgICAgICBjb25zdCBxdWVyeUlkID0gY3JlYXRlUXVlcnlJZCgpO1xuICAgICAgICB0aGlzLiNjb21waWxlUXVlcnkgPSAobm9kZSkgPT4gcHJvcHMuZXhlY3V0b3IuY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICBnZXQgaXNDb21taXR0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNzdGF0ZS5pc0NvbW1pdHRlZDtcbiAgICB9XG4gICAgZ2V0IGlzUm9sbGVkQmFjaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0YXRlLmlzUm9sbGVkQmFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tbWl0cyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIHJvbGxiYWNrfS5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cngpXG4gICAgICpcbiAgICAgKiAgIGF3YWl0IHRyeC5jb21taXQoKS5leGVjdXRlKClcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4LnJvbGxiYWNrKCkuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gZG9Tb21ldGhpbmcoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbW1pdCgpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb3BzLmRyaXZlci5jb21taXRUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNDb21taXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy4jcHJvcHMuY29ubmVjdGlvbi5yZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgY29tbWl0fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeClcbiAgICAgKlxuICAgICAqICAgYXdhaXQgdHJ4LmNvbW1pdCgpLmV4ZWN1dGUoKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cngucm9sbGJhY2soKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2soKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUcmFuc2FjdGlvbih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgdGhpcy4jc3RhdGUuaXNSb2xsZWRCYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24ucmVsZWFzZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgcm9sbGJhY2tUb1NhdmVwb2ludH0gYW5kIHtAbGluayByZWxlYXNlU2F2ZXBvaW50fS5cbiAgICAgKlxuICAgICAqIEZvciBhIHR5cGUtc2FmZSBleHBlcmllbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgaW5zdGFuY2UgZnJvbSBub3cgb24uXG4gICAgICpcbiAgICAgKiAjIyMgRXhhbXBsZXNcbiAgICAgKlxuICAgICAqIGBgYHRzXG4gICAgICogaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG4gICAgICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnggPSBhd2FpdCBkYi5zdGFydFRyYW5zYWN0aW9uKCkuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBpbnNlcnRKZW5uaWZlcih0cngpXG4gICAgICpcbiAgICAgKiBjb25zdCB0cnhBZnRlckplbm5pZmVyID0gYXdhaXQgdHJ4LnNhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIHRyeSB7XG4gICAgICogICBhd2FpdCBkb1NvbWV0aGluZyh0cnhBZnRlckplbm5pZmVyKVxuICAgICAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICogICBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJvbGxiYWNrVG9TYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICogfVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBzYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnNhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb2xscyBiYWNrIHRvIGEgc2F2ZXBvaW50IHdpdGggYSBnaXZlbiBuYW1lLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBzYXZlcG9pbnR9IGFuZCB7QGxpbmsgcmVsZWFzZVNhdmVwb2ludH0uXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCB1c2UgdGhlIHNhbWUgaW5zdGFuY2UgcmV0dXJuZWQgYnkge0BsaW5rIHNhdmVwb2ludH0sIG9yXG4gICAgICogZXNjYXBlIHRoZSB0eXBlLWNoZWNrIGJ5IHVzaW5nIGBhcyBhbnlgLlxuICAgICAqXG4gICAgICogIyMjIEV4YW1wbGVzXG4gICAgICpcbiAgICAgKiBgYGB0c1xuICAgICAqIGltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuICAgICAqIGltcG9ydCB0eXBlIHsgRGF0YWJhc2UgfSBmcm9tICd0eXBlLWVkaXRvcicgLy8gaW1hZ2luYXJ5IG1vZHVsZVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4ID0gYXdhaXQgZGIuc3RhcnRUcmFuc2FjdGlvbigpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogYXdhaXQgaW5zZXJ0SmVubmlmZXIodHJ4KVxuICAgICAqXG4gICAgICogY29uc3QgdHJ4QWZ0ZXJKZW5uaWZlciA9IGF3YWl0IHRyeC5zYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiB0cnkge1xuICAgICAqICAgYXdhaXQgZG9Tb21ldGhpbmcodHJ4QWZ0ZXJKZW5uaWZlcilcbiAgICAgKiB9IGNhdGNoIChlcnJvcikge1xuICAgICAqICAgYXdhaXQgdHJ4QWZ0ZXJKZW5uaWZlci5yb2xsYmFja1RvU2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGluc2VydEplbm5pZmVyKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZyhreXNlbHk6IEt5c2VseTxEYXRhYmFzZT4pIHt9XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcm9sbGJhY2tUb1NhdmVwb2ludChzYXZlcG9pbnROYW1lKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWFuZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNwcm9wcy5kcml2ZXIucm9sbGJhY2tUb1NhdmVwb2ludD8uKHRoaXMuI3Byb3BzLmNvbm5lY3Rpb24uY29ubmVjdGlvbiwgc2F2ZXBvaW50TmFtZSwgdGhpcy4jY29tcGlsZVF1ZXJ5KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyBhIHNhdmVwb2ludCB3aXRoIGEgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIFNlZSB7QGxpbmsgc2F2ZXBvaW50fSBhbmQge0BsaW5rIHJvbGxiYWNrVG9TYXZlcG9pbnR9LlxuICAgICAqXG4gICAgICogWW91IG11c3QgdXNlIHRoZSBzYW1lIGluc3RhbmNlIHJldHVybmVkIGJ5IHtAbGluayBzYXZlcG9pbnR9LCBvclxuICAgICAqIGVzY2FwZSB0aGUgdHlwZS1jaGVjayBieSB1c2luZyBgYXMgYW55YC5cbiAgICAgKlxuICAgICAqICMjIyBFeGFtcGxlc1xuICAgICAqXG4gICAgICogYGBgdHNcbiAgICAgKiBpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbiAgICAgKiBpbXBvcnQgdHlwZSB7IERhdGFiYXNlIH0gZnJvbSAndHlwZS1lZGl0b3InIC8vIGltYWdpbmFyeSBtb2R1bGVcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeCA9IGF3YWl0IGRiLnN0YXJ0VHJhbnNhY3Rpb24oKS5leGVjdXRlKClcbiAgICAgKlxuICAgICAqIGF3YWl0IGluc2VydEplbm5pZmVyKHRyeClcbiAgICAgKlxuICAgICAqIGNvbnN0IHRyeEFmdGVySmVubmlmZXIgPSBhd2FpdCB0cnguc2F2ZXBvaW50KCdhZnRlcl9qZW5uaWZlcicpLmV4ZWN1dGUoKVxuICAgICAqXG4gICAgICogdHJ5IHtcbiAgICAgKiAgIGF3YWl0IGRvU29tZXRoaW5nKHRyeEFmdGVySmVubmlmZXIpXG4gICAgICogfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgKiAgIGF3YWl0IHRyeEFmdGVySmVubmlmZXIucm9sbGJhY2tUb1NhdmVwb2ludCgnYWZ0ZXJfamVubmlmZXInKS5leGVjdXRlKClcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBhd2FpdCB0cnhBZnRlckplbm5pZmVyLnJlbGVhc2VTYXZlcG9pbnQoJ2FmdGVyX2plbm5pZmVyJykuZXhlY3V0ZSgpXG4gICAgICpcbiAgICAgKiBhd2FpdCBkb1NvbWV0aGluZ0Vsc2UodHJ4KVxuICAgICAqXG4gICAgICogYXN5bmMgZnVuY3Rpb24gaW5zZXJ0SmVubmlmZXIoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGFzeW5jIGZ1bmN0aW9uIGRvU29tZXRoaW5nKGt5c2VseTogS3lzZWx5PERhdGFiYXNlPikge31cbiAgICAgKiBhc3luYyBmdW5jdGlvbiBkb1NvbWV0aGluZ0Vsc2Uoa3lzZWx5OiBLeXNlbHk8RGF0YWJhc2U+KSB7fVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHJlbGVhc2VTYXZlcG9pbnQoc2F2ZXBvaW50TmFtZSkge1xuICAgICAgICBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2sodGhpcy4jc3RhdGUpO1xuICAgICAgICByZXR1cm4gbmV3IENvbW1hbmQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy4jcHJvcHMuZHJpdmVyLnJlbGVhc2VTYXZlcG9pbnQ/Lih0aGlzLiNwcm9wcy5jb25uZWN0aW9uLmNvbm5lY3Rpb24sIHNhdmVwb2ludE5hbWUsIHRoaXMuI2NvbXBpbGVRdWVyeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7IC4uLnRoaXMuI3Byb3BzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbihwbHVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb250cm9sbGVkVHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgLi4udGhpcy4jcHJvcHMsXG4gICAgICAgICAgICBleGVjdXRvcjogdGhpcy4jcHJvcHMuZXhlY3V0b3Iud2l0aFBsdWdpbihwbHVnaW4pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgd2l0aG91dFBsdWdpbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgZXhlY3V0b3I6IHRoaXMuI3Byb3BzLmV4ZWN1dG9yLndpdGhvdXRQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB3aXRoU2NoZW1hKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyb2xsZWRUcmFuc2FjdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLiNwcm9wcyxcbiAgICAgICAgICAgIGV4ZWN1dG9yOiB0aGlzLiNwcm9wcy5leGVjdXRvci53aXRoUGx1Z2luQXRGcm9udChuZXcgV2l0aFNjaGVtYVBsdWdpbihzY2hlbWEpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHdpdGhUYWJsZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29udHJvbGxlZFRyYW5zYWN0aW9uKHsgLi4udGhpcy4jcHJvcHMgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbW1hbmQge1xuICAgICNjYjtcbiAgICBjb25zdHJ1Y3RvcihjYikge1xuICAgICAgICB0aGlzLiNjYiA9IGNiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICAgKi9cbiAgICBhc3luYyBleGVjdXRlKCkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jY2IoKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnROb3RDb21taXR0ZWRPclJvbGxlZEJhY2soc3RhdGUpIHtcbiAgICBpZiAoc3RhdGUuaXNDb21taXR0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBpcyBhbHJlYWR5IGNvbW1pdHRlZCcpO1xuICAgIH1cbiAgICBpZiAoc3RhdGUuaXNSb2xsZWRCYWNrKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gaXMgYWxyZWFkeSByb2xsZWQgYmFjaycpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXhlY3V0b3Igd3JhcHBlciB0aGF0IGFzc2VydHMgdGhhdCB0aGUgdHJhbnNhY3Rpb24gc3RhdGUgaXMgbm90IGNvbW1pdHRlZFxuICogb3Igcm9sbGVkIGJhY2sgd2hlbiBhIHF1ZXJ5IGlzIGV4ZWN1dGVkLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jbGFzcyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciB7XG4gICAgI2V4ZWN1dG9yO1xuICAgICNzdGF0ZTtcbiAgICBjb25zdHJ1Y3RvcihleGVjdXRvciwgc3RhdGUpIHtcbiAgICAgICAgaWYgKGV4ZWN1dG9yIGluc3RhbmNlb2YgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuI2V4ZWN1dG9yID0gZXhlY3V0b3IuI2V4ZWN1dG9yO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jZXhlY3V0b3IgPSBleGVjdXRvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlO1xuICAgIH1cbiAgICBnZXQgYWRhcHRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLmFkYXB0ZXI7XG4gICAgfVxuICAgIGdldCBwbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IucGx1Z2lucztcbiAgICB9XG4gICAgdHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jZXhlY3V0b3IudHJhbnNmb3JtUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIGNvbXBpbGVRdWVyeShub2RlLCBxdWVyeUlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5jb21waWxlUXVlcnkobm9kZSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHByb3ZpZGVDb25uZWN0aW9uKGNvbnN1bWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5wcm92aWRlQ29ubmVjdGlvbihjb25zdW1lcik7XG4gICAgfVxuICAgIGV4ZWN1dGVRdWVyeShjb21waWxlZFF1ZXJ5LCBxdWVyeUlkKSB7XG4gICAgICAgIGFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayh0aGlzLiNzdGF0ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLiNleGVjdXRvci5leGVjdXRlUXVlcnkoY29tcGlsZWRRdWVyeSwgcXVlcnlJZCk7XG4gICAgfVxuICAgIHN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgYXNzZXJ0Tm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrKHRoaXMuI3N0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4ZWN1dG9yLnN0cmVhbShjb21waWxlZFF1ZXJ5LCBjaHVua1NpemUsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgICB3aXRoQ29ubmVjdGlvblByb3ZpZGVyKGNvbm5lY3Rpb25Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhDb25uZWN0aW9uUHJvdmlkZXIoY29ubmVjdGlvblByb3ZpZGVyKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IE5vdENvbW1pdHRlZE9yUm9sbGVkQmFja0Fzc2VydGluZ0V4ZWN1dG9yKHRoaXMuI2V4ZWN1dG9yLndpdGhQbHVnaW4ocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2lucyhwbHVnaW5zKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbnMocGx1Z2lucyksIHRoaXMuI3N0YXRlKTtcbiAgICB9XG4gICAgd2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IodGhpcy4jZXhlY3V0b3Iud2l0aFBsdWdpbkF0RnJvbnQocGx1Z2luKSwgdGhpcy4jc3RhdGUpO1xuICAgIH1cbiAgICB3aXRob3V0UGx1Z2lucygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBOb3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvcih0aGlzLiNleGVjdXRvci53aXRob3V0UGx1Z2lucygpLCB0aGlzLiNzdGF0ZSk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9yYXctYnVpbGRlci5kLnRzXCIgLz5cbmltcG9ydCB7IEFsaWFzTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL2FsaWFzLW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplIH0gZnJvbSAnLi4vdXRpbC9vYmplY3QtdXRpbHMuanMnO1xuaW1wb3J0IHsgTk9PUF9RVUVSWV9FWEVDVVRPUiB9IGZyb20gJy4uL3F1ZXJ5LWV4ZWN1dG9yL25vb3AtcXVlcnktZXhlY3V0b3IuanMnO1xuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmNsYXNzIFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcHJvcHM7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy4jcHJvcHMgPSBmcmVlemUocHJvcHMpO1xuICAgIH1cbiAgICBnZXQgZXhwcmVzc2lvblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCBpc1Jhd0J1aWxkZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBhcyhhbGlhcykge1xuICAgICAgICByZXR1cm4gbmV3IEFsaWFzZWRSYXdCdWlsZGVySW1wbCh0aGlzLCBhbGlhcyk7XG4gICAgfVxuICAgICRjYXN0VG8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwoeyAuLi50aGlzLiNwcm9wcyB9KTtcbiAgICB9XG4gICAgJG5vdE51bGwoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwodGhpcy4jcHJvcHMpO1xuICAgIH1cbiAgICB3aXRoUGx1Z2luKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gbmV3IFJhd0J1aWxkZXJJbXBsKHtcbiAgICAgICAgICAgIC4uLnRoaXMuI3Byb3BzLFxuICAgICAgICAgICAgcGx1Z2luczogdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBmcmVlemUoWy4uLnRoaXMuI3Byb3BzLnBsdWdpbnMsIHBsdWdpbl0pXG4gICAgICAgICAgICAgICAgOiBmcmVlemUoW3BsdWdpbl0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jdG9PcGVyYXRpb25Ob2RlKHRoaXMuI2dldEV4ZWN1dG9yKCkpO1xuICAgIH1cbiAgICBjb21waWxlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2NvbXBpbGUodGhpcy4jZ2V0RXhlY3V0b3IoZXhlY3V0b3JQcm92aWRlcikpO1xuICAgIH1cbiAgICBhc3luYyBleGVjdXRlKGV4ZWN1dG9yUHJvdmlkZXIpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgPSB0aGlzLiNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmV4ZWN1dGVRdWVyeSh0aGlzLiNjb21waWxlKGV4ZWN1dG9yKSwgdGhpcy4jcHJvcHMucXVlcnlJZCk7XG4gICAgfVxuICAgICNnZXRFeGVjdXRvcihleGVjdXRvclByb3ZpZGVyKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dG9yID0gZXhlY3V0b3JQcm92aWRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yUHJvdmlkZXIuZ2V0RXhlY3V0b3IoKVxuICAgICAgICAgICAgOiBOT09QX1FVRVJZX0VYRUNVVE9SO1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJvcHMucGx1Z2lucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGV4ZWN1dG9yLndpdGhQbHVnaW5zKHRoaXMuI3Byb3BzLnBsdWdpbnMpXG4gICAgICAgICAgICA6IGV4ZWN1dG9yO1xuICAgIH1cbiAgICAjdG9PcGVyYXRpb25Ob2RlKGV4ZWN1dG9yKSB7XG4gICAgICAgIHJldHVybiBleGVjdXRvci50cmFuc2Zvcm1RdWVyeSh0aGlzLiNwcm9wcy5yYXdOb2RlLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG4gICAgI2NvbXBpbGUoZXhlY3V0b3IpIHtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLmNvbXBpbGVRdWVyeSh0aGlzLiN0b09wZXJhdGlvbk5vZGUoZXhlY3V0b3IpLCB0aGlzLiNwcm9wcy5xdWVyeUlkKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmF3QnVpbGRlcihwcm9wcykge1xuICAgIHJldHVybiBuZXcgUmF3QnVpbGRlckltcGwocHJvcHMpO1xufVxuY2xhc3MgQWxpYXNlZFJhd0J1aWxkZXJJbXBsIHtcbiAgICAjcmF3QnVpbGRlcjtcbiAgICAjYWxpYXM7XG4gICAgY29uc3RydWN0b3IocmF3QnVpbGRlciwgYWxpYXMpIHtcbiAgICAgICAgdGhpcy4jcmF3QnVpbGRlciA9IHJhd0J1aWxkZXI7XG4gICAgICAgIHRoaXMuI2FsaWFzID0gYWxpYXM7XG4gICAgfVxuICAgIGdldCBleHByZXNzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgZ2V0IGFsaWFzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jYWxpYXM7XG4gICAgfVxuICAgIGdldCByYXdCdWlsZGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy4jcmF3QnVpbGRlcjtcbiAgICB9XG4gICAgdG9PcGVyYXRpb25Ob2RlKCkge1xuICAgICAgICByZXR1cm4gQWxpYXNOb2RlLmNyZWF0ZSh0aGlzLiNyYXdCdWlsZGVyLnRvT3BlcmF0aW9uTm9kZSgpLCBpc09wZXJhdGlvbk5vZGVTb3VyY2UodGhpcy4jYWxpYXMpXG4gICAgICAgICAgICA/IHRoaXMuI2FsaWFzLnRvT3BlcmF0aW9uTm9kZSgpXG4gICAgICAgICAgICA6IElkZW50aWZpZXJOb2RlLmNyZWF0ZSh0aGlzLiNhbGlhcykpO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vc3FsLmQudHNcIiAvPlxuaW1wb3J0IHsgSWRlbnRpZmllck5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9pZGVudGlmaWVyLW5vZGUuanMnO1xuaW1wb3J0IHsgaXNPcGVyYXRpb25Ob2RlU291cmNlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvb3BlcmF0aW9uLW5vZGUtc291cmNlLmpzJztcbmltcG9ydCB7IFJhd05vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9yYXctbm9kZS5qcyc7XG5pbXBvcnQgeyBWYWx1ZU5vZGUgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS92YWx1ZS1ub2RlLmpzJztcbmltcG9ydCB7IHBhcnNlU3RyaW5nUmVmZXJlbmNlIH0gZnJvbSAnLi4vcGFyc2VyL3JlZmVyZW5jZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VUYWJsZSB9IGZyb20gJy4uL3BhcnNlci90YWJsZS1wYXJzZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VWYWx1ZUV4cHJlc3Npb24gfSBmcm9tICcuLi9wYXJzZXIvdmFsdWUtcGFyc2VyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVF1ZXJ5SWQgfSBmcm9tICcuLi91dGlsL3F1ZXJ5LWlkLmpzJztcbmltcG9ydCB7IGNyZWF0ZVJhd0J1aWxkZXIgfSBmcm9tICcuL3Jhdy1idWlsZGVyLmpzJztcbmV4cG9ydCBjb25zdCBzcWwgPSBPYmplY3QuYXNzaWduKChzcWxGcmFnbWVudHMsIC4uLnBhcmFtZXRlcnMpID0+IHtcbiAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgcmF3Tm9kZTogUmF3Tm9kZS5jcmVhdGUoc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzPy5tYXAocGFyc2VQYXJhbWV0ZXIpID8/IFtdKSxcbiAgICB9KTtcbn0sIHtcbiAgICByZWYoY29sdW1uUmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKHBhcnNlU3RyaW5nUmVmZXJlbmNlKGNvbHVtblJlZmVyZW5jZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVZhbHVlRXhwcmVzc2lvbih2YWx1ZSkpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIHZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbCh2YWx1ZSk7XG4gICAgfSxcbiAgICB0YWJsZSh0YWJsZVJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZVdpdGhDaGlsZChwYXJzZVRhYmxlKHRhYmxlUmVmZXJlbmNlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgaWQoLi4uaWRzKSB7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50cyA9IG5ldyBBcnJheShpZHMubGVuZ3RoICsgMSkuZmlsbCgnLicpO1xuICAgICAgICBmcmFnbWVudHNbMF0gPSAnJztcbiAgICAgICAgZnJhZ21lbnRzW2ZyYWdtZW50cy5sZW5ndGggLSAxXSA9ICcnO1xuICAgICAgICByZXR1cm4gY3JlYXRlUmF3QnVpbGRlcih7XG4gICAgICAgICAgICBxdWVyeUlkOiBjcmVhdGVRdWVyeUlkKCksXG4gICAgICAgICAgICByYXdOb2RlOiBSYXdOb2RlLmNyZWF0ZShmcmFnbWVudHMsIGlkcy5tYXAoSWRlbnRpZmllck5vZGUuY3JlYXRlKSksXG4gICAgICAgIH0pO1xuICAgIH0sXG4gICAgbGl0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUodmFsdWUpKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICBsaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpdCh2YWx1ZSk7XG4gICAgfSxcbiAgICByYXcoc3FsKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aFNxbChzcWwpLFxuICAgICAgICB9KTtcbiAgICB9LFxuICAgIGpvaW4oYXJyYXksIHNlcGFyYXRvciA9IHNxbCBgLCBgKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gbmV3IEFycmF5KE1hdGgubWF4KDIgKiBhcnJheS5sZW5ndGggLSAxLCAwKSk7XG4gICAgICAgIGNvbnN0IHNlcCA9IHNlcGFyYXRvci50b09wZXJhdGlvbk5vZGUoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbm9kZXNbMiAqIGldID0gcGFyc2VQYXJhbWV0ZXIoYXJyYXlbaV0pO1xuICAgICAgICAgICAgaWYgKGkgIT09IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICBub2Rlc1syICogaSArIDFdID0gc2VwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVSYXdCdWlsZGVyKHtcbiAgICAgICAgICAgIHF1ZXJ5SWQ6IGNyZWF0ZVF1ZXJ5SWQoKSxcbiAgICAgICAgICAgIHJhd05vZGU6IFJhd05vZGUuY3JlYXRlV2l0aENoaWxkcmVuKG5vZGVzKSxcbiAgICAgICAgfSk7XG4gICAgfSxcbn0pO1xuZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXIocGFyYW0pIHtcbiAgICBpZiAoaXNPcGVyYXRpb25Ob2RlU291cmNlKHBhcmFtKSkge1xuICAgICAgICByZXR1cm4gcGFyYW0udG9PcGVyYXRpb25Ob2RlKCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZVZhbHVlRXhwcmVzc2lvbihwYXJhbSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL29wZXJhdGlvbi1ub2RlLXZpc2l0b3IuZC50c1wiIC8+XG5pbXBvcnQgeyBmcmVlemUgfSBmcm9tICcuLi91dGlsL29iamVjdC11dGlscy5qcyc7XG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uTm9kZVZpc2l0b3Ige1xuICAgIG5vZGVTdGFjayA9IFtdO1xuICAgIGdldCBwYXJlbnROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlU3RhY2tbdGhpcy5ub2RlU3RhY2subGVuZ3RoIC0gMl07XG4gICAgfVxuICAgICN2aXNpdG9ycyA9IGZyZWV6ZSh7XG4gICAgICAgIEFsaWFzTm9kZTogdGhpcy52aXNpdEFsaWFzLmJpbmQodGhpcyksXG4gICAgICAgIENvbHVtbk5vZGU6IHRoaXMudmlzaXRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgSWRlbnRpZmllck5vZGU6IHRoaXMudmlzaXRJZGVudGlmaWVyLmJpbmQodGhpcyksXG4gICAgICAgIFNjaGVtYWJsZUlkZW50aWZpZXJOb2RlOiB0aGlzLnZpc2l0U2NoZW1hYmxlSWRlbnRpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBSYXdOb2RlOiB0aGlzLnZpc2l0UmF3LmJpbmQodGhpcyksXG4gICAgICAgIFJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRSZWZlcmVuY2UuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0UXVlcnlOb2RlOiB0aGlzLnZpc2l0U2VsZWN0UXVlcnkuYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0aW9uTm9kZTogdGhpcy52aXNpdFNlbGVjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBUYWJsZU5vZGU6IHRoaXMudmlzaXRUYWJsZS5iaW5kKHRoaXMpLFxuICAgICAgICBGcm9tTm9kZTogdGhpcy52aXNpdEZyb20uYmluZCh0aGlzKSxcbiAgICAgICAgU2VsZWN0QWxsTm9kZTogdGhpcy52aXNpdFNlbGVjdEFsbC5iaW5kKHRoaXMpLFxuICAgICAgICBBbmROb2RlOiB0aGlzLnZpc2l0QW5kLmJpbmQodGhpcyksXG4gICAgICAgIE9yTm9kZTogdGhpcy52aXNpdE9yLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTm9kZTogdGhpcy52aXNpdFZhbHVlLmJpbmQodGhpcyksXG4gICAgICAgIFZhbHVlTGlzdE5vZGU6IHRoaXMudmlzaXRWYWx1ZUxpc3QuYmluZCh0aGlzKSxcbiAgICAgICAgUHJpbWl0aXZlVmFsdWVMaXN0Tm9kZTogdGhpcy52aXNpdFByaW1pdGl2ZVZhbHVlTGlzdC5iaW5kKHRoaXMpLFxuICAgICAgICBQYXJlbnNOb2RlOiB0aGlzLnZpc2l0UGFyZW5zLmJpbmQodGhpcyksXG4gICAgICAgIEpvaW5Ob2RlOiB0aGlzLnZpc2l0Sm9pbi5iaW5kKHRoaXMpLFxuICAgICAgICBPcGVyYXRvck5vZGU6IHRoaXMudmlzaXRPcGVyYXRvci5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVyZU5vZGU6IHRoaXMudmlzaXRXaGVyZS5iaW5kKHRoaXMpLFxuICAgICAgICBJbnNlcnRRdWVyeU5vZGU6IHRoaXMudmlzaXRJbnNlcnRRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBEZWxldGVRdWVyeU5vZGU6IHRoaXMudmlzaXREZWxldGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBSZXR1cm5pbmdOb2RlOiB0aGlzLnZpc2l0UmV0dXJuaW5nLmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVRhYmxlTm9kZTogdGhpcy52aXNpdENyZWF0ZVRhYmxlLmJpbmQodGhpcyksXG4gICAgICAgIEFkZENvbHVtbk5vZGU6IHRoaXMudmlzaXRBZGRDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQ29sdW1uRGVmaW5pdGlvbk5vZGU6IHRoaXMudmlzaXRDb2x1bW5EZWZpbml0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BUYWJsZU5vZGU6IHRoaXMudmlzaXREcm9wVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRGF0YVR5cGVOb2RlOiB0aGlzLnZpc2l0RGF0YVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgT3JkZXJCeU5vZGU6IHRoaXMudmlzaXRPcmRlckJ5LmJpbmQodGhpcyksXG4gICAgICAgIE9yZGVyQnlJdGVtTm9kZTogdGhpcy52aXNpdE9yZGVyQnlJdGVtLmJpbmQodGhpcyksXG4gICAgICAgIEdyb3VwQnlOb2RlOiB0aGlzLnZpc2l0R3JvdXBCeS5iaW5kKHRoaXMpLFxuICAgICAgICBHcm91cEJ5SXRlbU5vZGU6IHRoaXMudmlzaXRHcm91cEJ5SXRlbS5iaW5kKHRoaXMpLFxuICAgICAgICBVcGRhdGVRdWVyeU5vZGU6IHRoaXMudmlzaXRVcGRhdGVRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBDb2x1bW5VcGRhdGVOb2RlOiB0aGlzLnZpc2l0Q29sdW1uVXBkYXRlLmJpbmQodGhpcyksXG4gICAgICAgIExpbWl0Tm9kZTogdGhpcy52aXNpdExpbWl0LmJpbmQodGhpcyksXG4gICAgICAgIE9mZnNldE5vZGU6IHRoaXMudmlzaXRPZmZzZXQuYmluZCh0aGlzKSxcbiAgICAgICAgT25Db25mbGljdE5vZGU6IHRoaXMudmlzaXRPbkNvbmZsaWN0LmJpbmQodGhpcyksXG4gICAgICAgIE9uRHVwbGljYXRlS2V5Tm9kZTogdGhpcy52aXNpdE9uRHVwbGljYXRlS2V5LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZUluZGV4Tm9kZTogdGhpcy52aXNpdENyZWF0ZUluZGV4LmJpbmQodGhpcyksXG4gICAgICAgIERyb3BJbmRleE5vZGU6IHRoaXMudmlzaXREcm9wSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgTGlzdE5vZGU6IHRoaXMudmlzaXRMaXN0LmJpbmQodGhpcyksXG4gICAgICAgIFByaW1hcnlLZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdFByaW1hcnlLZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIFVuaXF1ZUNvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0VW5pcXVlQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZlcmVuY2VzTm9kZTogdGhpcy52aXNpdFJlZmVyZW5jZXMuYmluZCh0aGlzKSxcbiAgICAgICAgQ2hlY2tDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdENoZWNrQ29uc3RyYWludC5iaW5kKHRoaXMpLFxuICAgICAgICBXaXRoTm9kZTogdGhpcy52aXNpdFdpdGguYmluZCh0aGlzKSxcbiAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lTm9kZTogdGhpcy52aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUuYmluZCh0aGlzKSxcbiAgICAgICAgSGF2aW5nTm9kZTogdGhpcy52aXNpdEhhdmluZy5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVTY2hlbWFOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlU2NoZW1hLmJpbmQodGhpcyksXG4gICAgICAgIERyb3BTY2hlbWFOb2RlOiB0aGlzLnZpc2l0RHJvcFNjaGVtYS5iaW5kKHRoaXMpLFxuICAgICAgICBBbHRlclRhYmxlTm9kZTogdGhpcy52aXNpdEFsdGVyVGFibGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbHVtbk5vZGU6IHRoaXMudmlzaXREcm9wQ29sdW1uLmJpbmQodGhpcyksXG4gICAgICAgIFJlbmFtZUNvbHVtbk5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgQWx0ZXJDb2x1bW5Ob2RlOiB0aGlzLnZpc2l0QWx0ZXJDb2x1bW4uYmluZCh0aGlzKSxcbiAgICAgICAgTW9kaWZ5Q29sdW1uTm9kZTogdGhpcy52aXNpdE1vZGlmeUNvbHVtbi5iaW5kKHRoaXMpLFxuICAgICAgICBBZGRDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEFkZENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcENvbnN0cmFpbnROb2RlOiB0aGlzLnZpc2l0RHJvcENvbnN0cmFpbnQuYmluZCh0aGlzKSxcbiAgICAgICAgUmVuYW1lQ29uc3RyYWludE5vZGU6IHRoaXMudmlzaXRSZW5hbWVDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIEZvcmVpZ25LZXlDb25zdHJhaW50Tm9kZTogdGhpcy52aXNpdEZvcmVpZ25LZXlDb25zdHJhaW50LmJpbmQodGhpcyksXG4gICAgICAgIENyZWF0ZVZpZXdOb2RlOiB0aGlzLnZpc2l0Q3JlYXRlVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGU6IHRoaXMudmlzaXRSZWZyZXNoTWF0ZXJpYWxpemVkVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBEcm9wVmlld05vZGU6IHRoaXMudmlzaXREcm9wVmlldy5iaW5kKHRoaXMpLFxuICAgICAgICBHZW5lcmF0ZWROb2RlOiB0aGlzLnZpc2l0R2VuZXJhdGVkLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgT25Ob2RlOiB0aGlzLnZpc2l0T24uYmluZCh0aGlzKSxcbiAgICAgICAgVmFsdWVzTm9kZTogdGhpcy52aXNpdFZhbHVlcy5iaW5kKHRoaXMpLFxuICAgICAgICBTZWxlY3RNb2RpZmllck5vZGU6IHRoaXMudmlzaXRTZWxlY3RNb2RpZmllci5iaW5kKHRoaXMpLFxuICAgICAgICBDcmVhdGVUeXBlTm9kZTogdGhpcy52aXNpdENyZWF0ZVR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRHJvcFR5cGVOb2RlOiB0aGlzLnZpc2l0RHJvcFR5cGUuYmluZCh0aGlzKSxcbiAgICAgICAgRXhwbGFpbk5vZGU6IHRoaXMudmlzaXRFeHBsYWluLmJpbmQodGhpcyksXG4gICAgICAgIERlZmF1bHRJbnNlcnRWYWx1ZU5vZGU6IHRoaXMudmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUuYmluZCh0aGlzKSxcbiAgICAgICAgQWdncmVnYXRlRnVuY3Rpb25Ob2RlOiB0aGlzLnZpc2l0QWdncmVnYXRlRnVuY3Rpb24uYmluZCh0aGlzKSxcbiAgICAgICAgT3Zlck5vZGU6IHRoaXMudmlzaXRPdmVyLmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5Tm9kZTogdGhpcy52aXNpdFBhcnRpdGlvbkJ5LmJpbmQodGhpcyksXG4gICAgICAgIFBhcnRpdGlvbkJ5SXRlbU5vZGU6IHRoaXMudmlzaXRQYXJ0aXRpb25CeUl0ZW0uYmluZCh0aGlzKSxcbiAgICAgICAgU2V0T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFNldE9wZXJhdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBCaW5hcnlPcGVyYXRpb25Ob2RlOiB0aGlzLnZpc2l0QmluYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVuYXJ5T3BlcmF0aW9uTm9kZTogdGhpcy52aXNpdFVuYXJ5T3BlcmF0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIFVzaW5nTm9kZTogdGhpcy52aXNpdFVzaW5nLmJpbmQodGhpcyksXG4gICAgICAgIEZ1bmN0aW9uTm9kZTogdGhpcy52aXNpdEZ1bmN0aW9uLmJpbmQodGhpcyksXG4gICAgICAgIENhc2VOb2RlOiB0aGlzLnZpc2l0Q2FzZS5iaW5kKHRoaXMpLFxuICAgICAgICBXaGVuTm9kZTogdGhpcy52aXNpdFdoZW4uYmluZCh0aGlzKSxcbiAgICAgICAgSlNPTlJlZmVyZW5jZU5vZGU6IHRoaXMudmlzaXRKU09OUmVmZXJlbmNlLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTm9kZTogdGhpcy52aXNpdEpTT05QYXRoLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05QYXRoTGVnTm9kZTogdGhpcy52aXNpdEpTT05QYXRoTGVnLmJpbmQodGhpcyksXG4gICAgICAgIEpTT05PcGVyYXRvckNoYWluTm9kZTogdGhpcy52aXNpdEpTT05PcGVyYXRvckNoYWluLmJpbmQodGhpcyksXG4gICAgICAgIFR1cGxlTm9kZTogdGhpcy52aXNpdFR1cGxlLmJpbmQodGhpcyksXG4gICAgICAgIE1lcmdlUXVlcnlOb2RlOiB0aGlzLnZpc2l0TWVyZ2VRdWVyeS5iaW5kKHRoaXMpLFxuICAgICAgICBNYXRjaGVkTm9kZTogdGhpcy52aXNpdE1hdGNoZWQuYmluZCh0aGlzKSxcbiAgICAgICAgQWRkSW5kZXhOb2RlOiB0aGlzLnZpc2l0QWRkSW5kZXguYmluZCh0aGlzKSxcbiAgICAgICAgQ2FzdE5vZGU6IHRoaXMudmlzaXRDYXN0LmJpbmQodGhpcyksXG4gICAgICAgIEZldGNoTm9kZTogdGhpcy52aXNpdEZldGNoLmJpbmQodGhpcyksXG4gICAgICAgIFRvcE5vZGU6IHRoaXMudmlzaXRUb3AuYmluZCh0aGlzKSxcbiAgICAgICAgT3V0cHV0Tm9kZTogdGhpcy52aXNpdE91dHB1dC5iaW5kKHRoaXMpLFxuICAgICAgICBPckFjdGlvbk5vZGU6IHRoaXMudmlzaXRPckFjdGlvbi5iaW5kKHRoaXMpLFxuICAgICAgICBDb2xsYXRlTm9kZTogdGhpcy52aXNpdENvbGxhdGUuYmluZCh0aGlzKSxcbiAgICB9KTtcbiAgICB2aXNpdE5vZGUgPSAobm9kZSkgPT4ge1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wdXNoKG5vZGUpO1xuICAgICAgICB0aGlzLiN2aXNpdG9yc1tub2RlLmtpbmRdKG5vZGUpO1xuICAgICAgICB0aGlzLm5vZGVTdGFjay5wb3AoKTtcbiAgICB9O1xufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kZWZhdWx0LXF1ZXJ5LWNvbXBpbGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgQ3JlYXRlVGFibGVOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXRhYmxlLW5vZGUuanMnO1xuaW1wb3J0IHsgSW5zZXJ0UXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvaW5zZXJ0LXF1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uTm9kZVZpc2l0b3IgfSBmcm9tICcuLi9vcGVyYXRpb24tbm9kZS9vcGVyYXRpb24tbm9kZS12aXNpdG9yLmpzJztcbmltcG9ydCB7IE9wZXJhdG9yTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL29wZXJhdG9yLW5vZGUuanMnO1xuaW1wb3J0IHsgUGFyZW5zTm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3BhcmVucy1ub2RlLmpzJztcbmltcG9ydCB7IFF1ZXJ5Tm9kZSB9IGZyb20gJy4uL29wZXJhdGlvbi1ub2RlL3F1ZXJ5LW5vZGUuanMnO1xuaW1wb3J0IHsgZnJlZXplLCBpc1N0cmluZywgaXNOdW1iZXIsIGlzQm9vbGVhbiwgaXNOdWxsLCBpc0RhdGUsIGlzQmlnSW50LCB9IGZyb20gJy4uL3V0aWwvb2JqZWN0LXV0aWxzLmpzJztcbmltcG9ydCB7IENyZWF0ZVZpZXdOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvY3JlYXRlLXZpZXctbm9kZS5qcyc7XG5pbXBvcnQgeyBTZXRPcGVyYXRpb25Ob2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvc2V0LW9wZXJhdGlvbi1ub2RlLmpzJztcbmltcG9ydCB7IE1lcmdlUXVlcnlOb2RlIH0gZnJvbSAnLi4vb3BlcmF0aW9uLW5vZGUvbWVyZ2UtcXVlcnktbm9kZS5qcyc7XG5pbXBvcnQgeyBsb2dPbmNlIH0gZnJvbSAnLi4vdXRpbC9sb2ctb25jZS5qcyc7XG5jb25zdCBMSVRfV1JBUF9SRUdFWCA9IC8nL2c7XG5leHBvcnQgY2xhc3MgRGVmYXVsdFF1ZXJ5Q29tcGlsZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVmlzaXRvciB7XG4gICAgI3NxbCA9ICcnO1xuICAgICNwYXJhbWV0ZXJzID0gW107XG4gICAgZ2V0IG51bVBhcmFtZXRlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICB9XG4gICAgY29tcGlsZVF1ZXJ5KG5vZGUsIHF1ZXJ5SWQpIHtcbiAgICAgICAgdGhpcy4jc3FsID0gJyc7XG4gICAgICAgIHRoaXMuI3BhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5ub2RlU3RhY2suc3BsaWNlKDAsIHRoaXMubm9kZVN0YWNrLmxlbmd0aCk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUpO1xuICAgICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgICAgIHF1ZXJ5OiBub2RlLFxuICAgICAgICAgICAgcXVlcnlJZCxcbiAgICAgICAgICAgIHNxbDogdGhpcy5nZXRTcWwoKSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IFsuLi50aGlzLiNwYXJhbWV0ZXJzXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldFNxbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3NxbDtcbiAgICB9XG4gICAgdmlzaXRTZWxlY3RRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IHdyYXBJblBhcmVucyA9IHRoaXMucGFyZW50Tm9kZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhUGFyZW5zTm9kZS5pcyh0aGlzLnBhcmVudE5vZGUpICYmXG4gICAgICAgICAgICAhSW5zZXJ0UXVlcnlOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFDcmVhdGVUYWJsZU5vZGUuaXModGhpcy5wYXJlbnROb2RlKSAmJlxuICAgICAgICAgICAgIUNyZWF0ZVZpZXdOb2RlLmlzKHRoaXMucGFyZW50Tm9kZSkgJiZcbiAgICAgICAgICAgICFTZXRPcGVyYXRpb25Ob2RlLmlzKHRoaXMucGFyZW50Tm9kZSk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUgPT09IHVuZGVmaW5lZCAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cmFwSW5QYXJlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3NlbGVjdCcpO1xuICAgICAgICBpZiAobm9kZS5kaXN0aW5jdE9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlRGlzdGluY3RPbihub2RlLmRpc3RpbmN0T24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZyb250TW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50b3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNlbGVjdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuc2VsZWN0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZnJvbSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuam9pbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuam9pbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ncm91cEJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ncm91cEJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5oYXZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmhhdmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuc2V0T3BlcmF0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZXRPcGVyYXRpb25zLCAnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5saW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmZldGNoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mZXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZW5kTW9kaWZpZXJzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KHRoaXMuc29ydFNlbGVjdE1vZGlmaWVycyhbLi4ubm9kZS5lbmRNb2RpZmllcnNdKSwgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3JhcEluUGFyZW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RnJvbShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdmcm9tICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbXMpO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdGlvbihub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2VsZWN0aW9uKTtcbiAgICB9XG4gICAgdmlzaXRDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgfVxuICAgIGNvbXBpbGVEaXN0aW5jdE9uKGV4cHJlc3Npb25zKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkaXN0aW5jdCBvbiAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3QoZXhwcmVzc2lvbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgIH1cbiAgICBjb21waWxlTGlzdChub2Rlcywgc2VwYXJhdG9yID0gJywgJykge1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBsYXN0SW5kZXg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZXNbaV0pO1xuICAgICAgICAgICAgaWYgKGkgPCBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChzZXBhcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0V2hlcmUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnd2hlcmUgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2hlcmUpO1xuICAgIH1cbiAgICB2aXNpdEhhdmluZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdoYXZpbmcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaGF2aW5nKTtcbiAgICB9XG4gICAgdmlzaXRJbnNlcnRRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IHJvb3RRdWVyeU5vZGUgPSB0aGlzLm5vZGVTdGFjay5maW5kKFF1ZXJ5Tm9kZS5pcyk7XG4gICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPSByb290UXVlcnlOb2RlICE9PSBub2RlO1xuICAgICAgICBpZiAoIWlzU3ViUXVlcnkgJiYgbm9kZS5leHBsYWluKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cGxhaW4pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdWJRdWVyeSAmJiAhTWVyZ2VRdWVyeU5vZGUuaXMocm9vdFF1ZXJ5Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5yZXBsYWNlID8gJ3JlcGxhY2UnIDogJ2luc2VydCcpO1xuICAgICAgICAvLyBUT0RPOiByZW1vdmUgaW4gMC4yOS5cbiAgICAgICAgaWYgKG5vZGUuaWdub3JlKSB7XG4gICAgICAgICAgICBsb2dPbmNlKCdgSW5zZXJ0UXVlcnlOb2RlLmlnbm9yZWAgaXMgZGVwcmVjYXRlZC4gVXNlIGBJbnNlcnRRdWVyeU5vZGUub3JBY3Rpb25gIGluc3RlYWQuJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlnbm9yZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yQWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vckFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50b3ApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmludG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW50byAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS52YWx1ZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkZWZhdWx0IHZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9uQ29uZmxpY3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uRHVwbGljYXRlS2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5vbkR1cGxpY2F0ZUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1YlF1ZXJ5ICYmICFNZXJnZVF1ZXJ5Tm9kZS5pcyhyb290UXVlcnlOb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRWYWx1ZXMobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgndmFsdWVzICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudmFsdWVzKTtcbiAgICB9XG4gICAgdmlzaXREZWxldGVRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPSB0aGlzLm5vZGVTdGFjay5maW5kKFF1ZXJ5Tm9kZS5pcykgIT09IG5vZGU7XG4gICAgICAgIGlmICghaXNTdWJRdWVyeSAmJiBub2RlLmV4cGxhaW4pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwbGFpbik7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1YlF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLndpdGgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2l0aCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkZWxldGUgJyk7XG4gICAgICAgIGlmIChub2RlLnRvcCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS50b3ApO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmZyb20pO1xuICAgICAgICBpZiAobm9kZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnVzaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5qb2lucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5qb2lucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVyZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2hlcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5saW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1YlF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJldHVybmluZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdyZXR1cm5pbmcgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5zZWxlY3Rpb25zKTtcbiAgICB9XG4gICAgdmlzaXRBbGlhcyhub2RlKSB7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubm9kZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgYXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWxpYXMpO1xuICAgIH1cbiAgICB2aXNpdFJlZmVyZW5jZShub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdEFsbChfKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcqJyk7XG4gICAgfVxuICAgIHZpc2l0SWRlbnRpZmllcihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkpO1xuICAgICAgICB0aGlzLmNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldFJpZ2h0SWRlbnRpZmllcldyYXBwZXIoKSk7XG4gICAgfVxuICAgIGNvbXBpbGVVbndyYXBwZWRJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKCFpc1N0cmluZyhub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Egbm9uLXN0cmluZyBpZGVudGlmaWVyIHdhcyBwYXNzZWQgdG8gY29tcGlsZVVud3JhcHBlZElkZW50aWZpZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQodGhpcy5zYW5pdGl6ZUlkZW50aWZpZXIobm9kZS5uYW1lKSk7XG4gICAgfVxuICAgIHZpc2l0QW5kKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhbmQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmlnaHQpO1xuICAgIH1cbiAgICB2aXNpdE9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0KTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBvciAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yaWdodCk7XG4gICAgfVxuICAgIHZpc2l0VmFsdWUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbW1lZGlhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUobm9kZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZFZhbHVlKG5vZGUudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0VmFsdWVMaXN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnZhbHVlcyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0VHVwbGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUudmFsdWVzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQcmltaXRpdmVWYWx1ZUxpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICBjb25zdCB7IHZhbHVlcyB9ID0gbm9kZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kVmFsdWUodmFsdWVzW2ldKTtcbiAgICAgICAgICAgIGlmIChpICE9PSB2YWx1ZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0UGFyZW5zKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ub2RlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRKb2luKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoSk9JTl9UWVBFX1NRTFtub2RlLmpvaW5UeXBlXSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5vbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub24pO1xuICAgIH1cbiAgICB2aXNpdFJhdyhub2RlKSB7XG4gICAgICAgIGNvbnN0IHsgc3FsRnJhZ21lbnRzLCBwYXJhbWV0ZXJzOiBwYXJhbXMgfSA9IG5vZGU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3FsRnJhZ21lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChzcWxGcmFnbWVudHNbaV0pO1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiBpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUocGFyYW1zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9wZXJhdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgfVxuICAgIHZpc2l0VGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICB9XG4gICAgdmlzaXRTY2hlbWFibGVJZGVudGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnLicpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaWRlbnRpZmllcik7XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVGFibGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5mcm9udE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudGVtcG9yYXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgndGVtcG9yYXJ5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd0YWJsZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZOb3RFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBub3QgZXhpc3RzICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICBpZiAobm9kZS5zZWxlY3RRdWVyeSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2VsZWN0UXVlcnkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KFsuLi5ub2RlLmNvbHVtbnMsIC4uLihub2RlLmNvbnN0cmFpbnRzID8/IFtdKV0pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9uQ29tbWl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBjb21taXQgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vbkNvbW1pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnMgJiYgbm9kZS5lbmRNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENvbHVtbkRlZmluaXRpb24obm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pZk5vdEV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIG5vdCBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmRhdGFUeXBlKTtcbiAgICAgICAgaWYgKG5vZGUudW5zaWduZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5zaWduZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9udE1vZGlmaWVycyAmJiBub2RlLmZyb250TW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuZnJvbnRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZ2VuZXJhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5nZW5lcmF0ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmlkZW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGlkZW50aXR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFRvKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VG8pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdW5pcXVlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5wcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHByaW1hcnkga2V5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXV0b0luY3JlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0QXV0b0luY3JlbWVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5yZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2VzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5jaGVjaykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmVuZE1vZGlmaWVycyAmJiBub2RlLmVuZE1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmVuZE1vZGlmaWVycywgJyAnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRBdXRvSW5jcmVtZW50KCkge1xuICAgICAgICByZXR1cm4gJ2F1dG9faW5jcmVtZW50JztcbiAgICB9XG4gICAgdmlzaXRSZWZlcmVuY2VzKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlZmVyZW5jZXMgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICBpZiAobm9kZS5vbkRlbGV0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiBkZWxldGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uRGVsZXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5vblVwZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiB1cGRhdGUgJyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZChub2RlLm9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUYWJsZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHRhYmxlICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY2FzY2FkZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNjYWRlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREYXRhVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZGF0YVR5cGUpO1xuICAgIH1cbiAgICB2aXNpdE9yZGVyQnkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb3JkZXIgYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0T3JkZXJCeUl0ZW0obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICBpZiAobm9kZS5jb2xsYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbGxhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kaXJlY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG51bGxzICcpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5udWxscyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRHcm91cEJ5KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2dyb3VwIGJ5ICcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdEdyb3VwQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5ncm91cEJ5KTtcbiAgICB9XG4gICAgdmlzaXRVcGRhdGVRdWVyeShub2RlKSB7XG4gICAgICAgIGNvbnN0IHJvb3RRdWVyeU5vZGUgPSB0aGlzLm5vZGVTdGFjay5maW5kKFF1ZXJ5Tm9kZS5pcyk7XG4gICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPSByb290UXVlcnlOb2RlICE9PSBub2RlO1xuICAgICAgICBpZiAoIWlzU3ViUXVlcnkgJiYgbm9kZS5leHBsYWluKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cGxhaW4pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTdWJRdWVyeSAmJiAhTWVyZ2VRdWVyeU5vZGUuaXMocm9vdFF1ZXJ5Tm9kZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3VwZGF0ZSAnKTtcbiAgICAgICAgaWYgKG5vZGUudG9wKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRvcCk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3NldCAnKTtcbiAgICAgICAgaWYgKG5vZGUudXBkYXRlcykge1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnVwZGF0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5mcm9tKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5mcm9tKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5qb2lucykge1xuICAgICAgICAgICAgaWYgKCFub2RlLmZyb20pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJKb2lucyBpbiBhbiB1cGRhdGUgcXVlcnkgYXJlIG9ubHkgc3VwcG9ydGVkIGFzIGEgcGFydCBvZiBhIFBvc3RncmVTUUwgJ3VwZGF0ZSBzZXQgZnJvbSBqb2luJyBxdWVyeS4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgTXlTUUwgJ3VwZGF0ZSBqb2luIHNldCcgcXVlcnksIHNlZSBodHRwczovL2t5c2VseS5kZXYvZG9jcy9leGFtcGxlcy91cGRhdGUvbXktc3FsLWpvaW5zXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5qb2lucywgJyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVyZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUud2hlcmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5saW1pdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1YlF1ZXJ5ICYmICFNZXJnZVF1ZXJ5Tm9kZS5pcyhyb290UXVlcnlOb2RlKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRDb2x1bW5VcGRhdGUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgPSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS52YWx1ZSk7XG4gICAgfVxuICAgIHZpc2l0TGltaXQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbGltaXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubGltaXQpO1xuICAgIH1cbiAgICB2aXNpdE9mZnNldChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdvZmZzZXQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2Zmc2V0KTtcbiAgICB9XG4gICAgdmlzaXRPbkNvbmZsaWN0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ29uIGNvbmZsaWN0Jyk7XG4gICAgICAgIGlmIChub2RlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChub2RlLmNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb24gY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5pbmRleEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgKCcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleEV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbmRleFdoZXJlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5pbmRleFdoZXJlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kb05vdGhpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgZG8gbm90aGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUudXBkYXRlcykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBkbyB1cGRhdGUgc2V0ICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnVwZGF0ZXMpO1xuICAgICAgICAgICAgaWYgKG5vZGUudXBkYXRlV2hlcmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudXBkYXRlV2hlcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0T25EdXBsaWNhdGVLZXkobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnb24gZHVwbGljYXRlIGtleSB1cGRhdGUgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS51cGRhdGVzKTtcbiAgICB9XG4gICAgdmlzaXRDcmVhdGVJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgJyk7XG4gICAgICAgIGlmIChub2RlLnVuaXF1ZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ3VuaXF1ZSAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnaW5kZXggJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHVzaW5nICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAoJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm51bGxzTm90RGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbnVsbHMgbm90IGRpc3RpbmN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlcmUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndoZXJlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BJbmRleChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGluZGV4ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS50YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBvbiAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudGFibGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNhc2NhZGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlU2NoZW1hKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2NyZWF0ZSBzY2hlbWEgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnNjaGVtYSk7XG4gICAgfVxuICAgIHZpc2l0RHJvcFNjaGVtYShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIHNjaGVtYSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zY2hlbWEpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFByaW1hcnlLZXlDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2NvbnN0cmFpbnQgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgncHJpbWFyeSBrZXkgKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuY29sdW1ucyk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICBidWlsZERlZmVycmFibGUobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5kZWZlcnJhYmxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmRlZmVycmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgbm90IGRlZmVycmFibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsbHlEZWZlcnJlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgaW5pdGlhbGx5IGRlZmVycmVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGluaXRpYWxseSBpbW1lZGlhdGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFVuaXF1ZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUnKTtcbiAgICAgICAgaWYgKG5vZGUubnVsbHNOb3REaXN0aW5jdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBudWxscyBub3QgZGlzdGluY3QnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKScpO1xuICAgICAgICB0aGlzLmJ1aWxkRGVmZXJyYWJsZShub2RlKTtcbiAgICB9XG4gICAgdmlzaXRDaGVja0NvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjaGVjayAoJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0Rm9yZWlnbktleUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5uYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uc3RyYWludCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdmb3JlaWduIGtleSAoJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVmZXJlbmNlcyk7XG4gICAgICAgIGlmIChub2RlLm9uRGVsZXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIGRlbGV0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25EZWxldGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9uVXBkYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIG9uIHVwZGF0ZSAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUub25VcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVpbGREZWZlcnJhYmxlKG5vZGUpO1xuICAgIH1cbiAgICB2aXNpdExpc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuaXRlbXMpO1xuICAgIH1cbiAgICB2aXNpdFdpdGgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnd2l0aCAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVjdXJzaXZlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgncmVjdXJzaXZlICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5leHByZXNzaW9ucyk7XG4gICAgfVxuICAgIHZpc2l0Q29tbW9uVGFibGVFeHByZXNzaW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihub2RlLm1hdGVyaWFsaXplZCkpIHtcbiAgICAgICAgICAgIGlmICghbm9kZS5tYXRlcmlhbGl6ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWUobm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgaWYgKG5vZGUuY29sdW1ucykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRBbHRlclRhYmxlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIHRhYmxlICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRhYmxlKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgaWYgKG5vZGUucmVuYW1lVG8pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdyZW5hbWUgdG8gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlbmFtZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXRTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgc2NoZW1hICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5zZXRTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYWRkQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcENvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcENvbnN0cmFpbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnJlbmFtZUNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmVuYW1lQ29uc3RyYWludCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUNvbHVtbkFsdGVyYXRpb25zKG5vZGUuY29sdW1uQWx0ZXJhdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmFkZEluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmFkZEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5kcm9wSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZHJvcEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEFkZENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhZGQgY29sdW1uICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbHVtbik7XG4gICAgfVxuICAgIHZpc2l0UmVuYW1lQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3JlbmFtZSBjb2x1bW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29sdW1uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyB0byAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZW5hbWVUbyk7XG4gICAgfVxuICAgIHZpc2l0RHJvcENvbHVtbihub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFsdGVyQ29sdW1uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2FsdGVyIGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5kYXRhVHlwZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3VuY2VzTmV3Q29sdW1uRGF0YVR5cGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0eXBlICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgICAgICBpZiAobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgndXNpbmcgJyk7XG4gICAgICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZUV4cHJlc3Npb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnNldERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdzZXQgZGVmYXVsdCAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuc2V0RGVmYXVsdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcERlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIGRlZmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zZXROb3ROdWxsKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnc2V0IG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZHJvcE5vdE51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkcm9wIG5vdCBudWxsJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNb2RpZnlDb2x1bW4obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnbW9kaWZ5IGNvbHVtbiAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2x1bW4pO1xuICAgIH1cbiAgICB2aXNpdEFkZENvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB2aXNpdERyb3BDb25zdHJhaW50KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgY29uc3RyYWludCAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb25zdHJhaW50TmFtZSk7XG4gICAgICAgIGlmIChub2RlLm1vZGlmaWVyID09PSAnY2FzY2FkZScpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgY2FzY2FkZScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUubW9kaWZpZXIgPT09ICdyZXN0cmljdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgcmVzdHJpY3QnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdFJlbmFtZUNvbnN0cmFpbnQobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVuYW1lIGNvbnN0cmFpbnQgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub2xkTmFtZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgdG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmV3TmFtZSk7XG4gICAgfVxuICAgIHZpc2l0U2V0T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5vcGVyYXRvcik7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIGlmIChub2RlLmFsbCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2FsbCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgIH1cbiAgICB2aXNpdENyZWF0ZVZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY3JlYXRlICcpO1xuICAgICAgICBpZiAobm9kZS5vclJlcGxhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdvciByZXBsYWNlICcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm1hdGVyaWFsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ21hdGVyaWFsaXplZCAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS50ZW1wb3JhcnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd0ZW1wb3JhcnkgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ3ZpZXcgJyk7XG4gICAgICAgIGlmIChub2RlLmlmTm90RXhpc3RzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnaWYgbm90IGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLmNvbHVtbnMpO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJykgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuYXMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuYXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0UmVmcmVzaE1hdGVyaWFsaXplZFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgncmVmcmVzaCBtYXRlcmlhbGl6ZWQgdmlldyAnKTtcbiAgICAgICAgaWYgKG5vZGUuY29uY3VycmVudGx5KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnY29uY3VycmVudGx5ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUubmFtZSk7XG4gICAgICAgIGlmIChub2RlLndpdGhOb0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgd2l0aCBubyBkYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGggZGF0YScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0RHJvcFZpZXcobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZHJvcCAnKTtcbiAgICAgICAgaWYgKG5vZGUubWF0ZXJpYWxpemVkKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbWF0ZXJpYWxpemVkICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCd2aWV3ICcpO1xuICAgICAgICBpZiAobm9kZS5pZkV4aXN0cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2lmIGV4aXN0cyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jYXNjYWRlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGNhc2NhZGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEdlbmVyYXRlZChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdnZW5lcmF0ZWQgJyk7XG4gICAgICAgIGlmIChub2RlLmFsd2F5cykge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ2Fsd2F5cyAnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5ieURlZmF1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdieSBkZWZhdWx0ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdhcyAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWRlbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZGVudGl0eScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pO1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5zdG9yZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgc3RvcmVkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0VmFsdWUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICB2aXNpdFNlbGVjdE1vZGlmaWVyKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUucmF3TW9kaWZpZXIpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUucmF3TW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoU0VMRUNUX01PRElGSUVSX1NRTFtub2RlLm1vZGlmaWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub2YpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgb2YgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUub2YsICcsICcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0Q3JlYXRlVHlwZShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdjcmVhdGUgdHlwZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICAgICAgaWYgKG5vZGUuZW51bSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyBlbnVtICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbnVtKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdERyb3BUeXBlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Ryb3AgdHlwZSAnKTtcbiAgICAgICAgaWYgKG5vZGUuaWZFeGlzdHMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdpZiBleGlzdHMgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5uYW1lKTtcbiAgICB9XG4gICAgdmlzaXRFeHBsYWluKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2V4cGxhaW4nKTtcbiAgICAgICAgaWYgKG5vZGUub3B0aW9ucyB8fCBub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpKTtcbiAgICAgICAgICAgIGlmIChub2RlLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLmZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdmb3JtYXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEV4cGxhaW5PcHRpb25Bc3NpZ25tZW50KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKG5vZGUuZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXREZWZhdWx0SW5zZXJ0VmFsdWUoXykge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZGVmYXVsdCcpO1xuICAgIH1cbiAgICB2aXNpdEFnZ3JlZ2F0ZUZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5mdW5jKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJygnKTtcbiAgICAgICAgaWYgKG5vZGUuZGlzdGluY3QpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdkaXN0aW5jdCAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYWdncmVnYXRlZCk7XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9yZGVyQnkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIGlmIChub2RlLndpdGhpbkdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHdpdGhpbiBncm91cCAoJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLndpdGhpbkdyb3VwKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZmlsdGVyKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGZpbHRlcignKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuZmlsdGVyKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUub3Zlcikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3Zlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRPdmVyKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ292ZXIoJyk7XG4gICAgICAgIGlmIChub2RlLnBhcnRpdGlvbkJ5KSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnBhcnRpdGlvbkJ5KTtcbiAgICAgICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm9yZGVyQnkpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3JkZXJCeSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRQYXJ0aXRpb25CeShub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCdwYXJ0aXRpb24gYnkgJyk7XG4gICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5pdGVtcyk7XG4gICAgfVxuICAgIHZpc2l0UGFydGl0aW9uQnlJdGVtKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5wYXJ0aXRpb25CeSk7XG4gICAgfVxuICAgIHZpc2l0QmluYXJ5T3BlcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5sZWZ0T3BlcmFuZCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJpZ2h0T3BlcmFuZCk7XG4gICAgfVxuICAgIHZpc2l0VW5hcnlPcGVyYXRpb24obm9kZSkge1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhdG9yKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzTWludXNPcGVyYXRvcihub2RlLm9wZXJhdG9yKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm9wZXJhbmQpO1xuICAgIH1cbiAgICBpc01pbnVzT3BlcmF0b3Iobm9kZSkge1xuICAgICAgICByZXR1cm4gT3BlcmF0b3JOb2RlLmlzKG5vZGUpICYmIG5vZGUub3BlcmF0b3IgPT09ICctJztcbiAgICB9XG4gICAgdmlzaXRVc2luZyhub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKCd1c2luZyAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnRhYmxlcyk7XG4gICAgfVxuICAgIHZpc2l0RnVuY3Rpb24obm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChub2RlLmZ1bmMpO1xuICAgICAgICB0aGlzLmFwcGVuZCgnKCcpO1xuICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUuYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyknKTtcbiAgICB9XG4gICAgdmlzaXRDYXNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ2Nhc2UnKTtcbiAgICAgICAgaWYgKG5vZGUudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS53aGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLndoZW4sICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuZWxzZSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBlbHNlICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5lbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZCgnIGVuZCcpO1xuICAgICAgICBpZiAobm9kZS5pc1N0YXRlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyBjYXNlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRXaGVuKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ3doZW4gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuY29uZGl0aW9uKTtcbiAgICAgICAgaWYgKG5vZGUucmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIHRoZW4gJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRKU09OUmVmZXJlbmNlKG5vZGUpIHtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZWZlcmVuY2UpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnRyYXZlcnNhbCk7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGgobm9kZSkge1xuICAgICAgICBpZiAobm9kZS5pbk9wZXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLmluT3BlcmF0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJyRcIik7XG4gICAgICAgIGZvciAoY29uc3QgcGF0aExlZyBvZiBub2RlLnBhdGhMZWdzKSB7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShwYXRoTGVnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgfVxuICAgIHZpc2l0SlNPTlBhdGhMZWcobm9kZSkge1xuICAgICAgICBjb25zdCBpc0FycmF5TG9jYXRpb24gPSBub2RlLnR5cGUgPT09ICdBcnJheUxvY2F0aW9uJztcbiAgICAgICAgdGhpcy5hcHBlbmQoaXNBcnJheUxvY2F0aW9uID8gJ1snIDogJy4nKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoU3RyaW5nKG5vZGUudmFsdWUpKTtcbiAgICAgICAgaWYgKGlzQXJyYXlMb2NhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJ10nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdEpTT05PcGVyYXRvckNoYWluKG5vZGUpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG5vZGUudmFsdWVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3BlcmF0b3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBlbmQoJy0+Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnZhbHVlc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNZXJnZVF1ZXJ5KG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUud2l0aCkge1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS53aXRoKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ21lcmdlICcpO1xuICAgICAgICBpZiAobm9kZS50b3ApIHtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUudG9wKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2ludG8gJyk7XG4gICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUuaW50byk7XG4gICAgICAgIGlmIChub2RlLnVzaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS51c2luZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUud2hlbnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgJyk7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVMaXN0KG5vZGUud2hlbnMsICcgJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUucmV0dXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICcpO1xuICAgICAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yZXR1cm5pbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLm91dHB1dCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMudmlzaXROb2RlKG5vZGUub3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZS5lbmRNb2RpZmllcnM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmQoJyAnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5lbmRNb2RpZmllcnMsICcgJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmlzaXRNYXRjaGVkKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm90KSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnbm90ICcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwZW5kKCdtYXRjaGVkJyk7XG4gICAgICAgIGlmIChub2RlLmJ5U291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnIGJ5IHNvdXJjZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZpc2l0QWRkSW5kZXgobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnYWRkICcpO1xuICAgICAgICBpZiAobm9kZS51bmlxdWUpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCd1bmlxdWUgJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHBlbmQoJ2luZGV4ICcpO1xuICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLm5hbWUpO1xuICAgICAgICBpZiAobm9kZS5jb2x1bW5zKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVuZCgnICgnKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZUxpc3Qobm9kZS5jb2x1bW5zKTtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUudXNpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCcgdXNpbmcgJyk7XG4gICAgICAgICAgICB0aGlzLnZpc2l0Tm9kZShub2RlLnVzaW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdENhc3Qobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY2FzdCgnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTtcbiAgICAgICAgdGhpcy5hcHBlbmQoJyBhcyAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5kYXRhVHlwZSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKCcpJyk7XG4gICAgfVxuICAgIHZpc2l0RmV0Y2gobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnZmV0Y2ggbmV4dCAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5yb3dDb3VudCk7XG4gICAgICAgIHRoaXMuYXBwZW5kKGAgcm93cyAke25vZGUubW9kaWZpZXJ9YCk7XG4gICAgfVxuICAgIHZpc2l0T3V0cHV0KG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoJ291dHB1dCAnKTtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChub2RlLnNlbGVjdGlvbnMpO1xuICAgIH1cbiAgICB2aXNpdFRvcChub2RlKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGB0b3AoJHtub2RlLmV4cHJlc3Npb259KWApO1xuICAgICAgICBpZiAobm9kZS5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKGAgJHtub2RlLm1vZGlmaWVyc31gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2aXNpdE9yQWN0aW9uKG5vZGUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobm9kZS5hY3Rpb24pO1xuICAgIH1cbiAgICB2aXNpdENvbGxhdGUobm9kZSkge1xuICAgICAgICB0aGlzLmFwcGVuZCgnY29sbGF0ZSAnKTtcbiAgICAgICAgdGhpcy52aXNpdE5vZGUobm9kZS5jb2xsYXRpb24pO1xuICAgIH1cbiAgICBhcHBlbmQoc3RyKSB7XG4gICAgICAgIHRoaXMuI3NxbCArPSBzdHI7XG4gICAgfVxuICAgIGFwcGVuZFZhbHVlKHBhcmFtZXRlcikge1xuICAgICAgICB0aGlzLmFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpO1xuICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpKTtcbiAgICB9XG4gICAgZ2V0TGVmdElkZW50aWZpZXJXcmFwcGVyKCkge1xuICAgICAgICByZXR1cm4gJ1wiJztcbiAgICB9XG4gICAgZ2V0UmlnaHRJZGVudGlmaWVyV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICdcIic7XG4gICAgfVxuICAgIGdldEN1cnJlbnRQYXJhbWV0ZXJQbGFjZWhvbGRlcigpIHtcbiAgICAgICAgcmV0dXJuICckJyArIHRoaXMubnVtUGFyYW1ldGVycztcbiAgICB9XG4gICAgZ2V0TGVmdEV4cGxhaW5PcHRpb25zV3JhcHBlcigpIHtcbiAgICAgICAgcmV0dXJuICcoJztcbiAgICB9XG4gICAgZ2V0RXhwbGFpbk9wdGlvbkFzc2lnbm1lbnQoKSB7XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgfVxuICAgIGdldEV4cGxhaW5PcHRpb25zRGVsaW1pdGVyKCkge1xuICAgICAgICByZXR1cm4gJywgJztcbiAgICB9XG4gICAgZ2V0UmlnaHRFeHBsYWluT3B0aW9uc1dyYXBwZXIoKSB7XG4gICAgICAgIHJldHVybiAnKSc7XG4gICAgfVxuICAgIHNhbml0aXplSWRlbnRpZmllcihpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGxlZnRXcmFwID0gdGhpcy5nZXRMZWZ0SWRlbnRpZmllcldyYXBwZXIoKTtcbiAgICAgICAgY29uc3QgcmlnaHRXcmFwID0gdGhpcy5nZXRSaWdodElkZW50aWZpZXJXcmFwcGVyKCk7XG4gICAgICAgIGxldCBzYW5pdGl6ZWQgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHNhbml0aXplZCArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09IGxlZnRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IGxlZnRXcmFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gcmlnaHRXcmFwKSB7XG4gICAgICAgICAgICAgICAgc2FuaXRpemVkICs9IHJpZ2h0V3JhcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2FuaXRpemVkO1xuICAgIH1cbiAgICBzYW5pdGl6ZVN0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoTElUX1dSQVBfUkVHRVgsIFwiJydcIik7XG4gICAgfVxuICAgIGFkZFBhcmFtZXRlcihwYXJhbWV0ZXIpIHtcbiAgICAgICAgdGhpcy4jcGFyYW1ldGVycy5wdXNoKHBhcmFtZXRlcik7XG4gICAgfVxuICAgIGFwcGVuZEltbWVkaWF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOdW1iZXIodmFsdWUpIHx8IGlzQm9vbGVhbih2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKHZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVsbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kKCdudWxsJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRJbW1lZGlhdGVWYWx1ZSh2YWx1ZS50b0lTT1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0JpZ0ludCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwZW5kSW1tZWRpYXRlVmFsdWUodmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW1tZWRpYXRlIHZhbHVlICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXBwZW5kU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICB0aGlzLmFwcGVuZChcIidcIik7XG4gICAgICAgIHRoaXMuYXBwZW5kKHRoaXMuc2FuaXRpemVTdHJpbmdMaXRlcmFsKHZhbHVlKSk7XG4gICAgICAgIHRoaXMuYXBwZW5kKFwiJ1wiKTtcbiAgICB9XG4gICAgc29ydFNlbGVjdE1vZGlmaWVycyhhcnIpIHtcbiAgICAgICAgYXJyLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0Lm1vZGlmaWVyICYmIHJpZ2h0Lm1vZGlmaWVyXG4gICAgICAgICAgICA/IFNFTEVDVF9NT0RJRklFUl9QUklPUklUWVtsZWZ0Lm1vZGlmaWVyXSAtXG4gICAgICAgICAgICAgICAgU0VMRUNUX01PRElGSUVSX1BSSU9SSVRZW3JpZ2h0Lm1vZGlmaWVyXVxuICAgICAgICAgICAgOiAxKTtcbiAgICAgICAgcmV0dXJuIGZyZWV6ZShhcnIpO1xuICAgIH1cbiAgICBjb21waWxlQ29sdW1uQWx0ZXJhdGlvbnMoY29sdW1uQWx0ZXJhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21waWxlTGlzdChjb2x1bW5BbHRlcmF0aW9ucyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRpYWxlY3QgYWRkcyBhIFwidHlwZVwiIGtleXdvcmQgYmVmb3JlIGEgY29sdW1uJ3MgbmV3IGRhdGFcbiAgICAgKiB0eXBlIGluIGFuIEFMVEVSIFRBQkxFIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBhbm5vdW5jZXNOZXdDb2x1bW5EYXRhVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuY29uc3QgU0VMRUNUX01PRElGSUVSX1NRTCA9IGZyZWV6ZSh7XG4gICAgRm9yS2V5U2hhcmU6ICdmb3Iga2V5IHNoYXJlJyxcbiAgICBGb3JOb0tleVVwZGF0ZTogJ2ZvciBubyBrZXkgdXBkYXRlJyxcbiAgICBGb3JVcGRhdGU6ICdmb3IgdXBkYXRlJyxcbiAgICBGb3JTaGFyZTogJ2ZvciBzaGFyZScsXG4gICAgTm9XYWl0OiAnbm93YWl0JyxcbiAgICBTa2lwTG9ja2VkOiAnc2tpcCBsb2NrZWQnLFxuICAgIERpc3RpbmN0OiAnZGlzdGluY3QnLFxufSk7XG5jb25zdCBTRUxFQ1RfTU9ESUZJRVJfUFJJT1JJVFkgPSBmcmVlemUoe1xuICAgIEZvcktleVNoYXJlOiAxLFxuICAgIEZvck5vS2V5VXBkYXRlOiAxLFxuICAgIEZvclVwZGF0ZTogMSxcbiAgICBGb3JTaGFyZTogMSxcbiAgICBOb1dhaXQ6IDIsXG4gICAgU2tpcExvY2tlZDogMixcbiAgICBEaXN0aW5jdDogMCxcbn0pO1xuY29uc3QgSk9JTl9UWVBFX1NRTCA9IGZyZWV6ZSh7XG4gICAgSW5uZXJKb2luOiAnaW5uZXIgam9pbicsXG4gICAgTGVmdEpvaW46ICdsZWZ0IGpvaW4nLFxuICAgIFJpZ2h0Sm9pbjogJ3JpZ2h0IGpvaW4nLFxuICAgIEZ1bGxKb2luOiAnZnVsbCBqb2luJyxcbiAgICBDcm9zc0pvaW46ICdjcm9zcyBqb2luJyxcbiAgICBMYXRlcmFsSW5uZXJKb2luOiAnaW5uZXIgam9pbiBsYXRlcmFsJyxcbiAgICBMYXRlcmFsTGVmdEpvaW46ICdsZWZ0IGpvaW4gbGF0ZXJhbCcsXG4gICAgTGF0ZXJhbENyb3NzSm9pbjogJ2Nyb3NzIGpvaW4gbGF0ZXJhbCcsXG4gICAgT3V0ZXJBcHBseTogJ291dGVyIGFwcGx5JyxcbiAgICBDcm9zc0FwcGx5OiAnY3Jvc3MgYXBwbHknLFxuICAgIFVzaW5nOiAndXNpbmcnLFxufSk7XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL2R1bW15LWRyaXZlci5kLnRzXCIgLz5cbi8qKlxuICogQSBkcml2ZXIgdGhhdCBkb2VzIGFic29sdXRlbHkgbm90aGluZy5cbiAqXG4gKiBZb3UgY2FuIHVzZSB0aGlzIHRvIGNyZWF0ZSBLeXNlbHkgaW5zdGFuY2VzIHNvbGVseSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICpcbiAqICMjIyBFeGFtcGxlc1xuICpcbiAqIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgS3lzZWx5IGluc3RhbmNlIGZvciBidWlsZGluZyBwb3N0Z3JlcyBxdWVyaWVzOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQge1xuICogICBEdW1teURyaXZlcixcbiAqICAgS3lzZWx5LFxuICogICBQb3N0Z3Jlc0FkYXB0ZXIsXG4gKiAgIFBvc3RncmVzSW50cm9zcGVjdG9yLFxuICogICBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXJcbiAqIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHR5cGUgeyBEYXRhYmFzZSB9IGZyb20gJ3R5cGUtZWRpdG9yJyAvLyBpbWFnaW5hcnkgbW9kdWxlXG4gKlxuICogY29uc3QgZGIgPSBuZXcgS3lzZWx5PERhdGFiYXNlPih7XG4gKiAgIGRpYWxlY3Q6IHtcbiAqICAgICBjcmVhdGVBZGFwdGVyOiAoKSA9PiBuZXcgUG9zdGdyZXNBZGFwdGVyKCksXG4gKiAgICAgY3JlYXRlRHJpdmVyOiAoKSA9PiBuZXcgRHVtbXlEcml2ZXIoKSxcbiAqICAgICBjcmVhdGVJbnRyb3NwZWN0b3I6IChkYjogS3lzZWx5PGFueT4pID0+IG5ldyBQb3N0Z3Jlc0ludHJvc3BlY3RvcihkYiksXG4gKiAgICAgY3JlYXRlUXVlcnlDb21waWxlcjogKCkgPT4gbmV3IFBvc3RncmVzUXVlcnlDb21waWxlcigpLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gdXNlIGl0IHRvIGJ1aWxkIGEgcXVlcnkgYW5kIGNvbXBpbGUgaXQgdG8gU1FMIGJ1dCB0cnlpbmcgdG9cbiAqIGV4ZWN1dGUgdGhlIHF1ZXJ5IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgc3FsIH0gPSBkYi5zZWxlY3RGcm9tKCdwZXJzb24nKS5zZWxlY3RBbGwoKS5jb21waWxlKClcbiAqIGNvbnNvbGUubG9nKHNxbCkgLy8gc2VsZWN0ICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIER1bW15RHJpdmVyIHtcbiAgICBhc3luYyBpbml0KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGFjcXVpcmVDb25uZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gbmV3IER1bW15Q29ubmVjdGlvbigpO1xuICAgIH1cbiAgICBhc3luYyBiZWdpblRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVHJhbnNhY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgcmVsZWFzZUNvbm5lY3Rpb24oKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgLy8gTm90aGluZyB0byBkbyBoZXJlLlxuICAgIH1cbiAgICBhc3luYyByZWxlYXNlU2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxuICAgIGFzeW5jIHJvbGxiYWNrVG9TYXZlcG9pbnQoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZS5cbiAgICB9XG4gICAgYXN5bmMgc2F2ZXBvaW50KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuY2xhc3MgRHVtbXlDb25uZWN0aW9uIHtcbiAgICBhc3luYyBleGVjdXRlUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByb3dzOiBbXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgKnN0cmVhbVF1ZXJ5KCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuXG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9kaWFsZWN0LWFkYXB0ZXItYmFzZS5kLnRzXCIgLz5cbi8qKlxuICogQSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBgRGlhbGVjdEFkYXB0ZXJgIHdpdGggc2Vuc2libGUgZGVmYXVsdCB2YWx1ZXMuXG4gKiBUaGlyZC1wYXJ0eSBkaWFsZWN0cyBjYW4gZXh0ZW5kIHRoaXMgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgdGhlIGBEaWFsZWN0QWRhcHRlcmBcbiAqIGludGVyZmFjZSBmcm9tIHNjcmF0Y2guIFRoYXQgd2F5IGFsbCBuZXcgc2V0dGluZ3Mgd2lsbCBnZXQgZGVmYXVsdCB2YWx1ZXMgd2hlblxuICogdGhleSBhcmUgYWRkZWQgYW5kIHRoZXJlIHdpbGwgYmUgbGVzcyBicmVha2luZyBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNDcmVhdGVJZk5vdEV4aXN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGwoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c091dHB1dCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiIsICIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIi4vcG9zdGdyZXMtcXVlcnktY29tcGlsZXIuZC50c1wiIC8+XG5pbXBvcnQgeyBEZWZhdWx0UXVlcnlDb21waWxlciB9IGZyb20gJy4uLy4uL3F1ZXJ5LWNvbXBpbGVyL2RlZmF1bHQtcXVlcnktY29tcGlsZXIuanMnO1xuY29uc3QgSURfV1JBUF9SRUdFWCA9IC9cIi9nO1xuZXhwb3J0IGNsYXNzIFBvc3RncmVzUXVlcnlDb21waWxlciBleHRlbmRzIERlZmF1bHRRdWVyeUNvbXBpbGVyIHtcbiAgICBzYW5pdGl6ZUlkZW50aWZpZXIoaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllci5yZXBsYWNlKElEX1dSQVBfUkVHRVgsICdcIlwiJyk7XG4gICAgfVxufVxuIiwgIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiLi9wb3N0Z3Jlcy1hZGFwdGVyLmQudHNcIiAvPlxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnLi4vLi4vcmF3LWJ1aWxkZXIvc3FsLmpzJztcbmltcG9ydCB7IERpYWxlY3RBZGFwdGVyQmFzZSB9IGZyb20gJy4uL2RpYWxlY3QtYWRhcHRlci1iYXNlLmpzJztcbi8vIFJhbmRvbSBpZCBmb3Igb3VyIHRyYW5zYWN0aW9uIGxvY2suXG5jb25zdCBMT0NLX0lEID0gQmlnSW50KCczODUzMzE0NzkxMDYyMzA5MTA3Jyk7XG5leHBvcnQgY2xhc3MgUG9zdGdyZXNBZGFwdGVyIGV4dGVuZHMgRGlhbGVjdEFkYXB0ZXJCYXNlIHtcbiAgICBnZXQgc3VwcG9ydHNUcmFuc2FjdGlvbmFsRGRsKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZ2V0IHN1cHBvcnRzUmV0dXJuaW5nKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXN5bmMgYWNxdWlyZU1pZ3JhdGlvbkxvY2soZGIsIF9vcHQpIHtcbiAgICAgICAgLy8gQWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxldmVsIGFkdmlzb3J5IGxvY2suXG4gICAgICAgIGF3YWl0IHNxbCBgc2VsZWN0IHBnX2Fkdmlzb3J5X3hhY3RfbG9jaygke3NxbC5saXQoTE9DS19JRCl9KWAuZXhlY3V0ZShkYik7XG4gICAgfVxuICAgIGFzeW5jIHJlbGVhc2VNaWdyYXRpb25Mb2NrKF9kYiwgX29wdCkge1xuICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuIGBwZ19hZHZpc29yeV94YWN0X2xvY2tgIGlzIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgYXQgdGhlXG4gICAgICAgIC8vIGVuZCBvZiB0aGUgdHJhbnNhY3Rpb24gYW5kIHNpbmNlIGBzdXBwb3J0c1RyYW5zYWN0aW9uYWxEZGxgIHRydWUsIHdlIGtub3dcbiAgICAgICAgLy8gdGhlIGBkYmAgaW5zdGFuY2UgcGFzc2VkIHRvIGFjcXVpcmVNaWdyYXRpb25Mb2NrIGlzIGFjdHVhbGx5IGEgdHJhbnNhY3Rpb24uXG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gIHR5cGUgQ29tcGlsYWJsZSxcbiAgdHlwZSBEaWFsZWN0QWRhcHRlcixcbiAgRHVtbXlEcml2ZXIsXG4gIEt5c2VseSxcbiAgdHlwZSBLeXNlbHlQbHVnaW4sXG4gIE9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lcixcbiAgdHlwZSBQbHVnaW5UcmFuc2Zvcm1RdWVyeUFyZ3MsXG4gIHR5cGUgUGx1Z2luVHJhbnNmb3JtUmVzdWx0QXJncyxcbiAgdHlwZSBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlLFxuICB0eXBlIFF1ZXJ5Q29tcGlsZXIsXG4gIHR5cGUgUXVlcnlSZXN1bHQgYXMgS3lzZWx5UXVlcnlSZXN1bHQsXG4gIHR5cGUgUm9vdE9wZXJhdGlvbk5vZGUsXG4gIHR5cGUgVW5rbm93blJvdyxcbiAgVmFsdWVMaXN0Tm9kZSxcbiAgVmFsdWVOb2RlLFxuICB0eXBlIFdoZXJlSW50ZXJmYWNlLFxufSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB0eXBlIHsgVGFibGUgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlclJlcXVpcmVtZW50cyB7XG4gIEFkYXB0ZXI6IHsgbmV3ICgpOiBEaWFsZWN0QWRhcHRlciB9O1xuICBub1BhcmFtZXRlcnM/OiBib29sZWFuO1xuICBRdWVyeUNvbXBpbGVyOiB7IG5ldyAoKTogUXVlcnlDb21waWxlciB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRlcjxEQj4ocmVxdWlyZW1lbnRzOiBCdWlsZGVyUmVxdWlyZW1lbnRzKTogS3lzZWx5PERCPiB7XG4gIHJldHVybiBuZXcgS3lzZWx5KHtcbiAgICBkaWFsZWN0OiB7XG4gICAgICBjcmVhdGVBZGFwdGVyOiAoKSA9PiBuZXcgcmVxdWlyZW1lbnRzLkFkYXB0ZXIoKSxcbiAgICAgIGNyZWF0ZURyaXZlcjogKCkgPT4gbmV3IER1bW15RHJpdmVyKCksXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gd2UgZG9uJ3QgbmVlZCBidWlsdC1pbiBpbnRyb3NwZWN0aW9uIGluIHRoaXMgY2FzZVxuICAgICAgY3JlYXRlSW50cm9zcGVjdG9yOiAoKSA9PiBudWxsLFxuICAgICAgY3JlYXRlUXVlcnlDb21waWxlcjogKCkgPT4gbmV3IHJlcXVpcmVtZW50cy5RdWVyeUNvbXBpbGVyKCksXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbLi4uKHJlcXVpcmVtZW50cy5ub1BhcmFtZXRlcnMgPyBbbmV3IEltbWVkaWF0ZVZhbHVlUGx1Z2luKCldIDogW10pXSxcbiAgfSk7XG59XG5cbi8qKlxuICogQSBwbHVnaW4gdGhhdCB0cmFuc2Zvcm1zIGFsbCB2YWx1ZXMgdG8gaW1tZWRpYXRlIHZhbHVlcy4gVGhpcyBtZWFucyB0aGVpciBpbmplY3RlZCBpbnRvIHRoZSBTUUwgc3RyaW5nIGluc3RlYWQgb2YgcG9wdWxhdGluZyB0aGUgcGFyYW1ldGVycyBhcnJheS5cbiAqIEluIHNvbWUgc2l0dWF0aW9ucywgYSBkYXRhYmFzZSBkcml2ZXIgbWlnaHQgbm90IHN1cHBvcnQgcGFyYW1ldGVycywgYW5kIHRoaXMgcGx1Z2luIGNhbiBiZSB1c2VkIHRvIHdvcmsgYXJvdW5kIHRoYXQuXG4gKi9cbmNsYXNzIEltbWVkaWF0ZVZhbHVlUGx1Z2luIGltcGxlbWVudHMgS3lzZWx5UGx1Z2luIHtcbiAgcmVhZG9ubHkgI3RyYW5zZm9ybWVyID0gbmV3IEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIoKTtcblxuICB0cmFuc2Zvcm1RdWVyeShhcmdzOiBQbHVnaW5UcmFuc2Zvcm1RdWVyeUFyZ3MpOiBSb290T3BlcmF0aW9uTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyYW5zZm9ybWVyLnRyYW5zZm9ybU5vZGUoYXJncy5ub2RlKTtcbiAgfVxuXG4gIHRyYW5zZm9ybVJlc3VsdChhcmdzOiBQbHVnaW5UcmFuc2Zvcm1SZXN1bHRBcmdzKTogUHJvbWlzZTxLeXNlbHlRdWVyeVJlc3VsdDxVbmtub3duUm93Pj4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXJncy5yZXN1bHQpO1xuICB9XG59XG5cbmNsYXNzIEltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIgZXh0ZW5kcyBPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdHJhbnNmb3JtUHJpbWl0aXZlVmFsdWVMaXN0KG5vZGU6IFByaW1pdGl2ZVZhbHVlTGlzdE5vZGUpOiBQcmltaXRpdmVWYWx1ZUxpc3ROb2RlIHtcbiAgICByZXR1cm4gVmFsdWVMaXN0Tm9kZS5jcmVhdGUobm9kZS52YWx1ZXMubWFwKFZhbHVlTm9kZS5jcmVhdGVJbW1lZGlhdGUpKSBhcyBuZXZlcjtcbiAgfVxuXG4gIG92ZXJyaWRlIHRyYW5zZm9ybVZhbHVlKG5vZGU6IFZhbHVlTm9kZSk6IFZhbHVlTm9kZSB7XG4gICAgcmV0dXJuIHsgLi4uc3VwZXIudHJhbnNmb3JtVmFsdWUobm9kZSksIGltbWVkaWF0ZTogdHJ1ZSB9O1xuICB9XG59XG5cbmRlY2xhcmUgY29uc3QgcXVlcnlUeXBlOiB1bmlxdWUgc3ltYm9sO1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeTxUID0gdW5rbm93bj4ge1xuICBbcXVlcnlUeXBlXT86IFQ7XG4gIHBhcmFtZXRlcnM6IHJlYWRvbmx5IHVua25vd25bXTtcbiAgc3FsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc1F1ZXJ5PFQ+KHF1ZXJ5OiBzdHJpbmcgfCBRdWVyeTx1bmtub3duPik6IFF1ZXJ5PFQ+IHtcbiAgaWYgKHR5cGVvZiBxdWVyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7IHBhcmFtZXRlcnM6IFtdLCBzcWw6IHF1ZXJ5IH0gYXMgbmV2ZXI7XG4gIH1cblxuICByZXR1cm4gcXVlcnkgYXMgbmV2ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UmVzdWx0PFQ+ID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgVCBleHRlbmRzIFF1ZXJ5PGluZmVyIFI+ID8gUltdIDogVCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gUXVlcnk8aW5mZXIgUj4gPyBSW10gOiBuZXZlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGU8VD4oY29tcGlsZWFibGU6IENvbXBpbGFibGU8VD4pOiBRdWVyeTxUPiB7XG4gIGNvbnN0IGNvbXBpbGVkUXVlcnkgPSBjb21waWxlYWJsZS5jb21waWxlKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJhbWV0ZXJzOiBjb21waWxlZFF1ZXJ5LnBhcmFtZXRlcnMsXG4gICAgc3FsOiBjb21waWxlZFF1ZXJ5LnNxbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgZmlsdGVyIHRvIHRoZSBnaXZlbiByb3dzIGJhc2VkIG9uIHRoZSBwcmltYXJ5IGtleSBjb2x1bW5zIG9mIHRoZSB0YWJsZS5cbiAqXG4gKiBAZXhhbXBsZSBkYi5zZWxlY3RGcm9tKFwidXNlcnNcIikuJGNhbGwoYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMocm93cywgY29sdW1ucykpLnNlbGVjdEFsbCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUluZmVycmVkUm93RmlsdGVycyhyb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLCBjb2x1bW5zOiBUYWJsZVtcImNvbHVtbnNcIl0pIHtcbiAgY29uc3Qgcm93RmlsdGVycyA9IGluZmVyUm93RmlsdGVycyhyb3dzLCBjb2x1bW5zKTtcblxuICByZXR1cm4gPFFCIGV4dGVuZHMgV2hlcmVJbnRlcmZhY2U8YW55LCBhbnk+PihxYjogUUIpOiBRQiA9PlxuICAgIHFiLndoZXJlKChlYikgPT4ge1xuICAgICAgcmV0dXJuIGViLm9yKFxuICAgICAgICByb3dGaWx0ZXJzLm1hcCgocm93RmlsdGVyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGViLmFuZChyb3dGaWx0ZXIubWFwKChbY29sdW1uTmFtZSwgdmFsdWVdKSA9PiBlYihjb2x1bW5OYW1lLCB2YWx1ZSA9PT0gbnVsbCA/IFwiaXNcIiA6IFwiPVwiLCB2YWx1ZSkpKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0pIGFzIG5ldmVyO1xufVxuXG4vKipcbiAqIFBhcnQgb2YgYSBmaWx0ZXIgdGhhdCBwcmVkaWN0cyBhIG1hdGNoLlxuICogaWUuIC4uLiBXSEVSRSAkQ29sdW1OYW1lID0gJFZhbHVlIC4uLlxuICovXG50eXBlIFJvd0ZpbHRlclByZWRpY2F0ZSA9IFtDb2x1bW5OYW1lOiBzdHJpbmcsIFZhbHVlOiB1bmtub3duXTtcblxuLyoqXG4gKiBBIHJvdyBmaWx0ZXIgaXMgY29tcHJpc2VkIG9mIG9uZSBvciBtb3JlIHByZWRpY2F0ZXMuXG4gKi9cbnR5cGUgUm93RmlsdGVyID0gUm93RmlsdGVyUHJlZGljYXRlW107XG5cbi8qKlxuICogUm93IGZpbHRlcnMgaXMgc2ltcGx5IGEgc2V0IG9mIG11bHRpcGxlIHtAbGluayBSb3dGaWx0ZXJ9LlxuICovXG50eXBlIFJvd0ZpbHRlcnMgPSBSb3dGaWx0ZXJbXTtcblxuLyoqXG4gKiBJbmZlcnMgdGhlIGZpbHRlciB0aGF0IGlzIG5lY2Vzc2FyeSB0byB1bmlxdWVseSBpZGVudGlmeSBhIGdpdmVuIHJvd1xuICogaW5kaXZpZHVhbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJSb3dGaWx0ZXIocm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdKTogUm93RmlsdGVyIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFxuICAgIE9iamVjdC52YWx1ZXMoY29sdW1ucykucmVkdWNlKFxuICAgICAgKHBrLCBjb2x1bW4pID0+IHtcbiAgICAgICAgY29uc3QgeyBpc0luUHJpbWFyeUtleSwgbmFtZTogY29sdW1uTmFtZSB9ID0gY29sdW1uO1xuXG4gICAgICAgIGlmICghaXNJblByaW1hcnlLZXkpIHtcbiAgICAgICAgICByZXR1cm4gcGs7XG4gICAgICAgIH1cblxuICAgICAgICBwa1tjb2x1bW5OYW1lXSA9IHJvd1tjb2x1bW5OYW1lXSA/PyBudWxsO1xuICAgICAgICByZXR1cm4gcGs7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgKSxcbiAgKTtcbn1cblxuLyoqXG4gKiBJbmZlcnMgdGhlIGZpbHRlciB0aGF0IGlzIG5lY2Vzc2FyeSB0byB1bmlxdWVseSBpZGVudGlmeSBtdWx0aXBsZSByb3dzXG4gKiBpbmRpdmlkdWFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclJvd0ZpbHRlcnMocm93czogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSwgY29sdW1uczogVGFibGVbXCJjb2x1bW5zXCJdKTogUm93RmlsdGVycyB7XG4gIHJldHVybiByb3dzLm1hcCgocm93KSA9PiBpbmZlclJvd0ZpbHRlcihyb3csIGNvbHVtbnMpKTtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIEt5c2VseSwgUG9zdGdyZXNBZGFwdGVyLCBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmltcG9ydCB7IHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgZ2V0QnVpbGRlciB9IGZyb20gXCIuLi9xdWVyeVwiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGdldFBvc3RncmVTUUxCdWlsZGVyPERhdGFiYXNlID0gYW55PihcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbik6IEt5c2VseTxEYXRhYmFzZT4ge1xuICByZXR1cm4gZ2V0QnVpbGRlcih7IC4uLnJlcXVpcmVtZW50cywgQWRhcHRlcjogUG9zdGdyZXNBZGFwdGVyLCBRdWVyeUNvbXBpbGVyOiBQb3N0Z3Jlc1F1ZXJ5Q29tcGlsZXIgfSk7XG59XG4iLCAiaW1wb3J0IHsgRXhwcmVzc2lvbiwgRXhwcmVzc2lvbkJ1aWxkZXIsIHNxbCwgU3FsQm9vbCB9IGZyb20gXCJreXNlbHlcIjtcblxuaW1wb3J0IHR5cGUge1xuICBBZGFwdGVyRGVsZXRlRGV0YWlscyxcbiAgQWRhcHRlckluc2VydERldGFpbHMsXG4gIEFkYXB0ZXJRdWVyeURldGFpbHMsXG4gIEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICBDb2x1bW5GaWx0ZXIsXG4gIEZpbHRlckdyb3VwLFxufSBmcm9tIFwiLi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMsIHR5cGUgQnVpbGRlclJlcXVpcmVtZW50cywgY29tcGlsZSB9IGZyb20gXCIuLi9xdWVyeVwiO1xuaW1wb3J0IHR5cGUgeyBCaWdJbnRTdHJpbmcgfSBmcm9tIFwiLi4vdHlwZS11dGlsc1wiO1xuaW1wb3J0IHsgZ2V0UG9zdGdyZVNRTEJ1aWxkZXIgfSBmcm9tIFwiLi9idWlsZGVyXCI7XG5pbXBvcnQgdHlwZSB7IG1vY2tUYWJsZXNRdWVyeSB9IGZyb20gXCIuL2ludHJvc3BlY3Rpb25cIjtcblxuLyoqXG4gKiBgY3RpZGAgaXMgYSBzeXN0ZW0gY29sdW1uIHRoYXQgcmVwcmVzZW50cyB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgYSByb3cgaW4gYSB0YWJsZS5cbiAqIEl0IGlzIGEgdHVwbGUgb2YgdHdvIGludGVnZXJzOiBgKGJsb2NrTnVtYmVyLCB0dXBsZUluZGV4KWAuXG4gKiBJdCBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcm93IGluIGEgdGFibGUsIGV2ZW4gaWYgdGhlIHJvdyBoYXMgbm8gcHJpbWFyeSBrZXksIG9yIG90aGVyIHVuaXF1ZSBjb25zdHJhaW50cy5cbiAqXG4gKiBFeGFtcGxlOiAnKDAsMjMpJyByZXByZXNlbnRzIHRoZSAyNHRoIHJvdyBpbiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHRhYmxlLlxuICovXG5leHBvcnQgdHlwZSBDVElEYXNUZXh0ID0gYCgke251bWJlcn0sJHtudW1iZXJ9KWA7XG5cbi8qKlxuICogSW5zZXJ0cyBvbmUgb3IgbW9yZSByb3dzIGludG8gYSB0YWJsZSBhbmQgcmV0dXJucyB0aGUgaW5zZXJ0ZWQgcm93cyBhbG9uZyB3aXRoIHRoZWlyIGBjdGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc2VydFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVySW5zZXJ0RGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7IHRhYmxlLCByb3dzIH0gPSBkZXRhaWxzO1xuICBjb25zdCB7IG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hLCBjb2x1bW5zIH0gPSB0YWJsZTtcblxuICBjb25zdCBidWlsZGVyID0gZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgeyBjdGlkOiB1bmtub3duIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG4gIGNvbnN0IGNvbHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zKTtcbiAgY29uc3QgZW1wdHlSb3dXb3JrYXJvdW5kID0geyBbY29sc1swXSFdOiBzcWxgZGVmYXVsdGAgfTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAuaW5zZXJ0SW50byh0YWJsZU5hbWUpXG4gICAgICAudmFsdWVzKHJvd3MubWFwKChyb3cpID0+IChPYmplY3Qua2V5cyhyb3cpLmxlbmd0aCA9PT0gMCA/IGVtcHR5Um93V29ya2Fyb3VuZCA6IHJvdykpKVxuICAgICAgLnJldHVybmluZyhjb2xzKVxuICAgICAgLnJldHVybmluZygoZWIpID0+IGViLmNhc3Q8Q1RJRGFzVGV4dD4oXCJjdGlkXCIsIFwidGV4dFwiKS5hcyhcImN0aWRcIikpLFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IHNlbGVjdHMgYWxsIGNvbHVtbnMgZnJvbSBhIHRhYmxlLCBhbG9uZyB3aXRoIHRoZSBgY3RpZGAgY29sdW1uLCBhbmQgdW5ib3VuZCByb3cgY291bnQgYXMgYG9pZGAgKHJlc2VydmVkIGNvbHVtbiBuYW1lIHRoYXQgY2Fubm90IGNvbmZsaWN0IHdpdGggdXNlciBjb2x1bW5zKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbGVjdFF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyUXVlcnlEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBwYWdlSW5kZXgsXG4gICAgcGFnZVNpemUsXG4gICAgc29ydE9yZGVyLFxuICAgIHRhYmxlOiB7IG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hLCBjb2x1bW5zIH0sXG4gICAgZmlsdGVyID0geyBraW5kOiBcIkZpbHRlckdyb3VwXCIsIGFmdGVyOiBcImFuZFwiLCBmaWx0ZXJzOiBbXSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgeyBjdGlkOiB1bmtub3duIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG4gIGNvbnN0IGNvbHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zKTtcblxuICBjb25zdCBjb3VudFF1ZXJ5ID0gYnVpbGRlclxuICAgIC53aXRoU2NoZW1hKHNjaGVtYSlcbiAgICAuc2VsZWN0RnJvbSh0YWJsZU5hbWUpXG4gICAgLnNlbGVjdCgoZWIpID0+IGViLmNhc3Q8QmlnSW50U3RyaW5nPihlYi5mbi5jb2FsZXNjZShlYi5mbi5jb3VudEFsbCgpLCBzcWwubGl0KDApKSwgXCJ0ZXh0XCIpLmFzKFwib2lkXCIpKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAud2l0aChcImNvdW50XCIsICgpID0+IGNvdW50UXVlcnkpXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAuc2VsZWN0RnJvbShbdGFibGVOYW1lLCBcImNvdW50XCJdKVxuICAgICAgLy8gYG9pZGAgaXMgYSByZXNlcnZlZCBjb2x1bW4gbmFtZSBpbiBQb3N0Z3JlU1FMLCBzbyB3ZSB1c2UgaXQgYXMgYW4gYWxpYXMgZm9yIHRoZSByb3cgY291bnQgdG8gbm90IGNvbmZsaWN0IHdpdGggdXNlciBjb2x1bW5zLlxuICAgICAgLnNlbGVjdChzcWwucmVmKFwiY291bnQub2lkXCIpLiRjYXN0VG88QmlnSW50U3RyaW5nPigpLmFzKFwib2lkXCIpKVxuICAgICAgLnNlbGVjdCgoZWIpID0+IGViLmNhc3Q8Q1RJRGFzVGV4dD4oXCJjdGlkXCIsIFwidGV4dFwiKS5hcyhcImN0aWRcIikpXG4gICAgICAuc2VsZWN0KGNvbHMpXG4gICAgICAuJGNhbGwoKHFiKSA9PiBzb3J0T3JkZXIucmVkdWNlKChxYiwgaXRlbSkgPT4gcWIub3JkZXJCeShpdGVtLmNvbHVtbiwgaXRlbS5kaXJlY3Rpb24pLCBxYikpXG4gICAgICAvLyBUT0RPOiBjdXJzb3IgcGFnaW5hdGlvbj9cbiAgICAgIC53aGVyZShnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKGZpbHRlci5maWx0ZXJzKSlcbiAgICAgIC5saW1pdChwYWdlU2l6ZSlcbiAgICAgIC8vIHdlJ3JlIGluamVjdGluZyB0aGUgb2Zmc2V0IHZhbHVlIGhlcmUgdG8gYXZvaWQgc2VyaWFsaXphdGlvbiBjb21wbGV4aXR5IChgYmlnaW50YCBpcyBhIG5vLWdvIGZvciBgSlNPTi5zdHJpbmdpZnlgKS5cbiAgICAgIC5vZmZzZXQoc3FsLmxpdChCaWdJbnQocGFnZUluZGV4KSAqIEJpZ0ludChwYWdlU2l6ZSkpKSxcbiAgKTtcbn1cblxuLy8gSGVscGVyIHRvIGJ1aWxkIGFuIGV4cHJlc3Npb24gYnVpbGRlciBmb3IgYSBzaW5nbGUgZmlsdGVyIG9yIGEgZ3JvdXBcbmZ1bmN0aW9uIGJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyKFxuICBzcGVjOiBDb2x1bW5GaWx0ZXIgfCBGaWx0ZXJHcm91cCxcbik6IChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+IHtcbiAgaWYgKHNwZWMua2luZCA9PT0gXCJDb2x1bW5GaWx0ZXJcIikge1xuICAgIHJldHVybiAoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gZWIoZWIucmVmKHNwZWMuY29sdW1uKSwgc3BlYy5vcGVyYXRvciwgc3BlYy52YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldFNlbGVjdEZpbHRlckV4cHJlc3Npb24oc3BlYy5maWx0ZXJzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZWxlY3RGaWx0ZXJFeHByZXNzaW9uKFxuICBmaWx0ZXJzOiAoQ29sdW1uRmlsdGVyIHwgRmlsdGVyR3JvdXApW10sXG4pOiAoZWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4gRXhwcmVzc2lvbjxTcWxCb29sPiB7XG4gIGlmIChmaWx0ZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIChlYikgPT4gZWIubGl0KHRydWUpOyAvLyBubyBmaWx0ZXJzLCBhbHdheXMgdHJ1ZVxuXG4gIGNvbnN0IG9yR3JvdXBzT2ZBbmRCdWlsZGVyczogKChlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiBFeHByZXNzaW9uPFNxbEJvb2w+KVtdW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzOiAoKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IEV4cHJlc3Npb248U3FsQm9vbD4pW10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBjdXJyZW50QW5kR3JvdXBCdWlsZGVycy5wdXNoKGJ1aWxkQmFzZUV4cHJlc3Npb25CdWlsZGVyKGZpbHRlcnNbaV0hKSk7XG5cbiAgICAvLyAmbiBBTkQgZ3JvdXAgZW5kcyBpZiBpdCdzIHRoZSBsYXN0IGZpbHRlciwgb3IgdGhlIGl0ZW0gaXMgZm9sbG93ZWQgYnkgYW4gJ29yJ1xuICAgIGlmIChpID09PSBmaWx0ZXJzLmxlbmd0aCAtIDEgfHwgZmlsdGVyc1tpXSEuYWZ0ZXIgPT09IFwib3JcIikge1xuICAgICAgb3JHcm91cHNPZkFuZEJ1aWxkZXJzLnB1c2goY3VycmVudEFuZEdyb3VwQnVpbGRlcnMpO1xuICAgICAgY3VycmVudEFuZEdyb3VwQnVpbGRlcnMgPSBbXTsgLy8gc3RhcnQgYSBuZXcgZ3JvdXBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICBjb25zdCBhbmRFeHByZXNzaW9ucyA9IG9yR3JvdXBzT2ZBbmRCdWlsZGVycy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICByZXR1cm4gZWIuYW5kKGdyb3VwLm1hcCgoYnVpbGRlcikgPT4gYnVpbGRlcihlYikpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlYi5vcihhbmRFeHByZXNzaW9ucyk7XG4gIH07XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrU2VsZWN0UXVlcnkoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoXCIyMDI1LTAxLTI2VDIxOjU2OjEyLjM0NVpcIiksXG4gICAgICBjdGlkOiBcIigwLDEpXCIsXG4gICAgICBkZWxldGVkX2F0OiBudWxsLFxuICAgICAgaWQ6IDEsXG4gICAgICBuYW1lOiBcIkpvaG4gRG9lXCIsXG4gICAgICBvaWQ6IFwiMlwiLFxuICAgICAgcm9sZTogXCJhZG1pblwiLFxuICAgIH0sXG4gICAge1xuICAgICAgY3JlYXRlZF9hdDogbmV3IERhdGUoXCIyMDI1LTAxLTI2VDIwOjU2OjEyLjM0NVpcIiksXG4gICAgICBjdGlkOiBcIigwLDIpXCIsXG4gICAgICBkZWxldGVkX2F0OiBudWxsLFxuICAgICAgaWQ6IDIsXG4gICAgICBuYW1lOiBcIkphbmUgRG9lXCIsXG4gICAgICBvaWQ6IFwiMlwiLFxuICAgICAgcm9sZTogXCJwb3dlcnVzZXJcIixcbiAgICB9LFxuICBdIGFzIGNvbnN0IHNhdGlzZmllcyB7XG4gICAgLy8gYmVzdCBlZmZvcnQgbm8gbmVlZCB0byBnbyBvdmVyYm9hcmRcbiAgICBbSyBpbiBSZXR1cm5UeXBlPHR5cGVvZiBtb2NrVGFibGVzUXVlcnk+WzBdW1wiY29sdW1uc1wiXVtudW1iZXJdW1wibmFtZVwiXSB8IFwiY3RpZFwiIHwgXCJvaWRcIl06IHVua25vd247XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCB1cGRhdGVzIGEgZ2l2ZW4gcm93IGluIGEgdGFibGUgd2l0aCBnaXZlbiBjaGFuZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXBkYXRlUXVlcnkoXG4gIGRldGFpbHM6IEFkYXB0ZXJVcGRhdGVEZXRhaWxzLFxuICByZXF1aXJlbWVudHM/OiBPbWl0PEJ1aWxkZXJSZXF1aXJlbWVudHMsIFwiQWRhcHRlclwiIHwgXCJRdWVyeUNvbXBpbGVyXCI+LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBjaGFuZ2VzLFxuICAgIHJvdyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgeyBjdGlkOiB1bmtub3duIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG4gIGNvbnN0IGNvbHMgPSBPYmplY3Qua2V5cyhjb2x1bW5zKTtcblxuICByZXR1cm4gY29tcGlsZShcbiAgICBidWlsZGVyXG4gICAgICAud2l0aFNjaGVtYShzY2hlbWEpXG4gICAgICAudXBkYXRlVGFibGUodGFibGVOYW1lKVxuICAgICAgLnNldChjaGFuZ2VzKVxuICAgICAgLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKFtyb3ddLCBjb2x1bW5zKSlcbiAgICAgIC5yZXR1cm5pbmcoY29scylcbiAgICAgIC5yZXR1cm5pbmcoKGViKSA9PiBbXG4gICAgICAgIGViLmNhc3Q8Q1RJRGFzVGV4dD4oXCJjdGlkXCIsIFwidGV4dFwiKS5hcyhcImN0aWRcIiksXG4gICAgICAgIGViXG4gICAgICAgICAgLmNhc3Q8QmlnSW50U3RyaW5nPihlYi5mbihcImZsb29yXCIsIFtlYihlYi5mbihcImV4dHJhY3RcIiwgW3NxbGBlcG9jaCBmcm9tIG5vdygpYF0pLCBcIipcIiwgMV8wMDBfMDAwKV0pLCBcInRleHRcIilcbiAgICAgICAgICAuYXMoXCJfX3BzX3VwZGF0ZWRfYXRfX1wiKSxcbiAgICAgIF0pLFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBxdWVyeSB0aGF0IGRlbGV0ZXMgYSBnaXZlbiBzZXQgb2Ygcm93cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGV0ZVF1ZXJ5KFxuICBkZXRhaWxzOiBBZGFwdGVyRGVsZXRlRGV0YWlscyxcbiAgcmVxdWlyZW1lbnRzPzogT21pdDxCdWlsZGVyUmVxdWlyZW1lbnRzLCBcIkFkYXB0ZXJcIiB8IFwiUXVlcnlDb21waWxlclwiPixcbikge1xuICBjb25zdCB7XG4gICAgcm93cyxcbiAgICB0YWJsZTogeyBjb2x1bW5zLCBuYW1lOiB0YWJsZU5hbWUsIHNjaGVtYSB9LFxuICB9ID0gZGV0YWlscztcblxuICBjb25zdCBidWlsZGVyID0gZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8UmVjb3JkPHN0cmluZywgeyBjdGlkOiB1bmtub3duIH0gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KHJlcXVpcmVtZW50cyk7XG5cbiAgcmV0dXJuIGNvbXBpbGUoYnVpbGRlci53aXRoU2NoZW1hKHNjaGVtYSkuZGVsZXRlRnJvbSh0YWJsZU5hbWUpLiRjYWxsKGFwcGx5SW5mZXJyZWRSb3dGaWx0ZXJzKHJvd3MsIGNvbHVtbnMpKSk7XG59XG4iLCAiLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCIuL3Bvc3RncmVzLmQudHNcIiAvPlxuaW1wb3J0IHsgc3FsIH0gZnJvbSAnLi4vcmF3LWJ1aWxkZXIvc3FsLmpzJztcbi8qKlxuICogQSBwb3N0Z3JlcyBoZWxwZXIgZm9yIGFnZ3JlZ2F0aW5nIGEgc3VicXVlcnkgKG9yIG90aGVyIGV4cHJlc3Npb24pIGludG8gYSBKU09OQiBhcnJheS5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiA8IS0tIHNpdGVFeGFtcGxlKFwic2VsZWN0XCIsIFwiTmVzdGVkIGFycmF5XCIsIDExMCkgLS0+XG4gKlxuICogV2hpbGUga3lzZWx5IGlzIG5vdCBhbiBPUk0gYW5kIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgY29uY2VwdCBvZiByZWxhdGlvbnMsIHdlIGRvIHByb3ZpZGVcbiAqIGhlbHBlcnMgZm9yIGZldGNoaW5nIG5lc3RlZCBvYmplY3RzIGFuZCBhcnJheXMgaW4gYSBzaW5nbGUgcXVlcnkuIEluIHRoaXMgZXhhbXBsZSB3ZVxuICogdXNlIHRoZSBganNvbkFycmF5RnJvbWAgaGVscGVyIHRvIGZldGNoIHBlcnNvbidzIHBldHMgYWxvbmcgd2l0aCB0aGUgcGVyc29uJ3MgaWQuXG4gKlxuICogUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBoZWxwZXJzIHVuZGVyIHRoZSBga3lzZWx5L2hlbHBlcnNgIGZvbGRlciwgaW5jbHVkaW5nXG4gKiBganNvbkFycmF5RnJvbWAsIGFyZSBub3QgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGggdGhpcmQgcGFydHkgZGlhbGVjdHMuIEluIG9yZGVyIGZvclxuICogdGhlbSB0byB3b3JrLCB0aGUgZGlhbGVjdCBtdXN0IGF1dG9tYXRpY2FsbHkgcGFyc2UgdGhlIGBqc29uYCBkYXRhIHR5cGUgaW50b1xuICogSmF2YVNjcmlwdCBKU09OIHZhbHVlcyBsaWtlIG9iamVjdHMgYW5kIGFycmF5cy4gU29tZSBkaWFsZWN0cyBtaWdodCBzaW1wbHkgcmV0dXJuXG4gKiB0aGUgZGF0YSBhcyBhIEpTT04gc3RyaW5nLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW4gYFBhcnNlSlNPTlJlc3VsdHNQbHVnaW5gXG4gKiB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsganNvbkFycmF5RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbkFycmF5RnJvbShcbiAqICAgICAgIGViLnNlbGVjdEZyb20oJ3BldCcpXG4gKiAgICAgICAgIC5zZWxlY3QoWydwZXQuaWQgYXMgcGV0X2lkJywgJ3BldC5uYW1lJ10pXG4gKiAgICAgICAgIC53aGVyZVJlZigncGV0Lm93bmVyX2lkJywgJz0nLCAncGVyc29uLmlkJylcbiAqICAgICAgICAgLm9yZGVyQnkoJ3BldC5uYW1lJylcbiAqICAgICApLmFzKCdwZXRzJylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICogYGBgXG4gKlxuICogVGhlIGdlbmVyYXRlZCBTUUwgKFBvc3RncmVTUUwpOlxuICpcbiAqIGBgYHNxbFxuICogc2VsZWN0IFwiaWRcIiwgKFxuICogICBzZWxlY3QgY29hbGVzY2UoanNvbl9hZ2coYWdnKSwgJ1tdJykgZnJvbSAoXG4gKiAgICAgc2VsZWN0IFwicGV0XCIuXCJpZFwiIGFzIFwicGV0X2lkXCIsIFwicGV0XCIuXCJuYW1lXCJcbiAqICAgICBmcm9tIFwicGV0XCJcbiAqICAgICB3aGVyZSBcInBldFwiLlwib3duZXJfaWRcIiA9IFwicGVyc29uXCIuXCJpZFwiXG4gKiAgICAgb3JkZXIgYnkgXCJwZXRcIi5cIm5hbWVcIlxuICogICApIGFzIGFnZ1xuICogKSBhcyBcInBldHNcIlxuICogZnJvbSBcInBlcnNvblwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25BcnJheUZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QgY29hbGVzY2UoanNvbl9hZ2coYWdnKSwgJ1tdJykgZnJvbSAke2V4cHJ9IGFzIGFnZylgO1xufVxuLyoqXG4gKiBBIHBvc3RncmVzIGhlbHBlciBmb3IgdHVybmluZyBhIHN1YnF1ZXJ5IChvciBvdGhlciBleHByZXNzaW9uKSBpbnRvIGEgSlNPTiBvYmplY3QuXG4gKlxuICogVGhlIHN1YnF1ZXJ5IG11c3Qgb25seSByZXR1cm4gb25lIHJvdy5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiA8IS0tIHNpdGVFeGFtcGxlKFwic2VsZWN0XCIsIFwiTmVzdGVkIG9iamVjdFwiLCAxMjApIC0tPlxuICpcbiAqIFdoaWxlIGt5c2VseSBpcyBub3QgYW4gT1JNIGFuZCBpdCBkb2Vzbid0IGhhdmUgdGhlIGNvbmNlcHQgb2YgcmVsYXRpb25zLCB3ZSBkbyBwcm92aWRlXG4gKiBoZWxwZXJzIGZvciBmZXRjaGluZyBuZXN0ZWQgb2JqZWN0cyBhbmQgYXJyYXlzIGluIGEgc2luZ2xlIHF1ZXJ5LiBJbiB0aGlzIGV4YW1wbGUgd2VcbiAqIHVzZSB0aGUgYGpzb25PYmplY3RGcm9tYCBoZWxwZXIgdG8gZmV0Y2ggcGVyc29uJ3MgZmF2b3JpdGUgcGV0IGFsb25nIHdpdGggdGhlIHBlcnNvbidzIGlkLlxuICpcbiAqIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgaGVscGVycyB1bmRlciB0aGUgYGt5c2VseS9oZWxwZXJzYCBmb2xkZXIsIGluY2x1ZGluZ1xuICogYGpzb25PYmplY3RGcm9tYCwgYXJlIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aCB0aGlyZC1wYXJ0eSBkaWFsZWN0cy4gSW4gb3JkZXIgZm9yXG4gKiB0aGVtIHRvIHdvcmssIHRoZSBkaWFsZWN0IG11c3QgYXV0b21hdGljYWxseSBwYXJzZSB0aGUgYGpzb25gIGRhdGEgdHlwZSBpbnRvXG4gKiBKYXZhU2NyaXB0IEpTT04gdmFsdWVzIGxpa2Ugb2JqZWN0cyBhbmQgYXJyYXlzLiBTb21lIGRpYWxlY3RzIG1pZ2h0IHNpbXBseSByZXR1cm5cbiAqIHRoZSBkYXRhIGFzIGEgSlNPTiBzdHJpbmcuIEluIHRoZXNlIGNhc2VzIHlvdSBjYW4gdXNlIHRoZSBidWlsdCBpbiBgUGFyc2VKU09OUmVzdWx0c1BsdWdpbmBcbiAqIHRvIHBhcnNlIHRoZSByZXN1bHRzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBqc29uT2JqZWN0RnJvbSB9IGZyb20gJ2t5c2VseS9oZWxwZXJzL3Bvc3RncmVzJ1xuICpcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRiXG4gKiAgIC5zZWxlY3RGcm9tKCdwZXJzb24nKVxuICogICAuc2VsZWN0KChlYikgPT4gW1xuICogICAgICdpZCcsXG4gKiAgICAganNvbk9iamVjdEZyb20oXG4gKiAgICAgICBlYi5zZWxlY3RGcm9tKCdwZXQnKVxuICogICAgICAgICAuc2VsZWN0KFsncGV0LmlkIGFzIHBldF9pZCcsICdwZXQubmFtZSddKVxuICogICAgICAgICAud2hlcmVSZWYoJ3BldC5vd25lcl9pZCcsICc9JywgJ3BlcnNvbi5pZCcpXG4gKiAgICAgICAgIC53aGVyZSgncGV0LmlzX2Zhdm9yaXRlJywgJz0nLCB0cnVlKVxuICogICAgICkuYXMoJ2Zhdm9yaXRlX3BldCcpXG4gKiAgIF0pXG4gKiAgIC5leGVjdXRlKClcbiAqIGBgYFxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgU1FMIChQb3N0Z3JlU1FMKTpcbiAqXG4gKiBgYGBzcWxcbiAqIHNlbGVjdCBcImlkXCIsIChcbiAqICAgc2VsZWN0IHRvX2pzb24ob2JqKSBmcm9tIChcbiAqICAgICBzZWxlY3QgXCJwZXRcIi5cImlkXCIgYXMgXCJwZXRfaWRcIiwgXCJwZXRcIi5cIm5hbWVcIlxuICogICAgIGZyb20gXCJwZXRcIlxuICogICAgIHdoZXJlIFwicGV0XCIuXCJvd25lcl9pZFwiID0gXCJwZXJzb25cIi5cImlkXCJcbiAqICAgICBhbmQgXCJwZXRcIi5cImlzX2Zhdm9yaXRlXCIgPSAkMVxuICogICApIGFzIG9ialxuICogKSBhcyBcImZhdm9yaXRlX3BldFwiXG4gKiBmcm9tIFwicGVyc29uXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbk9iamVjdEZyb20oZXhwcikge1xuICAgIHJldHVybiBzcWwgYChzZWxlY3QgdG9fanNvbihvYmopIGZyb20gJHtleHByfSBhcyBvYmopYDtcbn1cbi8qKlxuICogVGhlIFBvc3RncmVTUUwgYGpzb25fYnVpbGRfb2JqZWN0YCBmdW5jdGlvbi5cbiAqXG4gKiBOT1RFOiBUaGlzIGhlbHBlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZnVsbHkgd29yayB3aXRoIHRoZSBidWlsdC1pbiBgUG9zdGdyZXNEaWFsZWN0YC5cbiAqIFdoaWxlIHRoZSBwcm9kdWNlZCBTUUwgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBQb3N0Z3JlU1FMIGRhdGFiYXNlcywgc29tZSB0aGlyZC1wYXJ0eSBkaWFsZWN0c1xuICogbWF5IG5vdCBwYXJzZSB0aGUgbmVzdGVkIEpTT04gaW50byBvYmplY3RzLiBJbiB0aGVzZSBjYXNlcyB5b3UgY2FuIHVzZSB0aGUgYnVpbHQgaW5cbiAqIGBQYXJzZUpTT05SZXN1bHRzUGx1Z2luYCB0byBwYXJzZSB0aGUgcmVzdWx0cy5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgc3FsIH0gZnJvbSAna3lzZWx5J1xuICogaW1wb3J0IHsganNvbkJ1aWxkT2JqZWN0IH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvcG9zdGdyZXMnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLnNlbGVjdEZyb20oJ3BlcnNvbicpXG4gKiAgIC5zZWxlY3QoKGViKSA9PiBbXG4gKiAgICAgJ2lkJyxcbiAqICAgICBqc29uQnVpbGRPYmplY3Qoe1xuICogICAgICAgZmlyc3Q6IGViLnJlZignZmlyc3RfbmFtZScpLFxuICogICAgICAgbGFzdDogZWIucmVmKCdsYXN0X25hbWUnKSxcbiAqICAgICAgIGZ1bGw6IHNxbDxzdHJpbmc+YGZpcnN0X25hbWUgfHxcdTAwQTAnICcgfHwgbGFzdF9uYW1lYFxuICogICAgIH0pLmFzKCduYW1lJylcbiAqICAgXSlcbiAqICAgLmV4ZWN1dGUoKVxuICpcbiAqIHJlc3VsdFswXT8uaWRcbiAqIHJlc3VsdFswXT8ubmFtZS5maXJzdFxuICogcmVzdWx0WzBdPy5uYW1lLmxhc3RcbiAqIHJlc3VsdFswXT8ubmFtZS5mdWxsXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gKlxuICogYGBgc3FsXG4gKiBzZWxlY3QgXCJpZFwiLCBqc29uX2J1aWxkX29iamVjdChcbiAqICAgJ2ZpcnN0JywgZmlyc3RfbmFtZSxcbiAqICAgJ2xhc3QnLCBsYXN0X25hbWUsXG4gKiAgICdmdWxsJywgZmlyc3RfbmFtZSB8fCAnICcgfHwgbGFzdF9uYW1lXG4gKiApIGFzIFwibmFtZVwiXG4gKiBmcm9tIFwicGVyc29uXCJcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkJ1aWxkT2JqZWN0KG9iaikge1xuICAgIHJldHVybiBzcWwgYGpzb25fYnVpbGRfb2JqZWN0KCR7c3FsLmpvaW4oT2JqZWN0LmtleXMob2JqKS5mbGF0TWFwKChrKSA9PiBbc3FsLmxpdChrKSwgb2JqW2tdXSkpfSlgO1xufVxuLyoqXG4gKiBUaGUgUG9zdGdyZVNRTCBgbWVyZ2VfYWN0aW9uYCBmdW5jdGlvbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGEgYHJldHVybmluZ2AgY2xhdXNlIHRvIGdldCB0aGUgYWN0aW9uIHRoYXQgd2FzXG4gKiBwZXJmb3JtZWQgaW4gYSBgbWVyZ2VJbnRvYCBxdWVyeS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmdcbiAqIHN0cmluZ3M6IGAnSU5TRVJUJ2AsIGAnVVBEQVRFJ2AsIG9yIGAnREVMRVRFJ2AuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IG1lcmdlQWN0aW9uIH0gZnJvbSAna3lzZWx5L2hlbHBlcnMvcG9zdGdyZXMnXG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZGJcbiAqICAgLm1lcmdlSW50bygncGVyc29uIGFzIHAnKVxuICogICAudXNpbmcoJ3BlcnNvbl9iYWNrdXAgYXMgcGInLCAncC5pZCcsICdwYi5pZCcpXG4gKiAgIC53aGVuTWF0Y2hlZCgpXG4gKiAgIC50aGVuVXBkYXRlU2V0KCh7IHJlZiB9KSA9PiAoe1xuICogICAgIGZpcnN0X25hbWU6IHJlZigncGIuZmlyc3RfbmFtZScpLFxuICogICAgIHVwZGF0ZWRfYXQ6IHJlZigncGIudXBkYXRlZF9hdCcpLiRjYXN0VG88c3RyaW5nIHwgbnVsbD4oKSxcbiAqICAgfSkpXG4gKiAgIC53aGVuTm90TWF0Y2hlZCgpXG4gKiAgIC50aGVuSW5zZXJ0VmFsdWVzKCh7IHJlZn0pID0+ICh7XG4gKiAgICAgaWQ6IHJlZigncGIuaWQnKSxcbiAqICAgICBmaXJzdF9uYW1lOiByZWYoJ3BiLmZpcnN0X25hbWUnKSxcbiAqICAgICBjcmVhdGVkX2F0OiByZWYoJ3BiLnVwZGF0ZWRfYXQnKSxcbiAqICAgICB1cGRhdGVkX2F0OiByZWYoJ3BiLnVwZGF0ZWRfYXQnKS4kY2FzdFRvPHN0cmluZyB8IG51bGw+KCksXG4gKiAgIH0pKVxuICogICAucmV0dXJuaW5nKFttZXJnZUFjdGlvbigpLmFzKCdhY3Rpb24nKSwgJ3AuaWQnLCAncC51cGRhdGVkX2F0J10pXG4gKiAgIC5leGVjdXRlKClcbiAqXG4gKiByZXN1bHRbMF0uYWN0aW9uXG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIFNRTCAoUG9zdGdyZVNRTCk6XG4gKlxuICogYGBgc3FsXG4gKiBtZXJnZSBpbnRvIFwicGVyc29uXCIgYXMgXCJwXCJcbiAqIHVzaW5nIFwicGVyc29uX2JhY2t1cFwiIGFzIFwicGJcIiBvbiBcInBcIi5cImlkXCIgPSBcInBiXCIuXCJpZFwiXG4gKiB3aGVuIG1hdGNoZWQgdGhlbiB1cGRhdGUgc2V0XG4gKiAgIFwiZmlyc3RfbmFtZVwiID0gXCJwYlwiLlwiZmlyc3RfbmFtZVwiLFxuICogICBcInVwZGF0ZWRfYXRcIiA9IFwicGJcIi5cInVwZGF0ZWRfYXRcIjo6dGV4dFxuICogd2hlbiBub3QgbWF0Y2hlZCB0aGVuIGluc2VydCB2YWx1ZXMgKFwiaWRcIiwgXCJmaXJzdF9uYW1lXCIsIFwiY3JlYXRlZF9hdFwiLCBcInVwZGF0ZWRfYXRcIilcbiAqIHZhbHVlcyAoXCJwYlwiLlwiaWRcIiwgXCJwYlwiLlwiZmlyc3RfbmFtZVwiLCBcInBiXCIuXCJ1cGRhdGVkX2F0XCIsIFwicGJcIi5cInVwZGF0ZWRfYXRcIilcbiAqIHJldHVybmluZyBtZXJnZV9hY3Rpb24oKSBhcyBcImFjdGlvblwiLCBcInBcIi5cImlkXCIsIFwicFwiLlwidXBkYXRlZF9hdFwiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQWN0aW9uKCkge1xuICAgIHJldHVybiBzcWwgYG1lcmdlX2FjdGlvbigpYDtcbn1cbiIsICJpbXBvcnQgeyB0eXBlIFNlbGVjdFF1ZXJ5QnVpbGRlciwgc3FsIH0gZnJvbSBcImt5c2VseVwiO1xuaW1wb3J0IHsganNvbkFycmF5RnJvbSB9IGZyb20gXCJreXNlbHkvaGVscGVycy9wb3N0Z3Jlc1wiO1xuXG5pbXBvcnQgeyB0eXBlIEJ1aWxkZXJSZXF1aXJlbWVudHMsIGNvbXBpbGUsIHR5cGUgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB7IGdldFBvc3RncmVTUUxCdWlsZGVyIH0gZnJvbSBcIi4vYnVpbGRlclwiO1xuXG5jb25zdCBSRUdVTEFSX1RBQkxFX0tJTkQgPSBcInJcIjtcbmNvbnN0IFZJRVdfVEFCTEVfS0lORCA9IFwidlwiO1xuY29uc3QgVEFCTEVfS0lORFMgPSBbUkVHVUxBUl9UQUJMRV9LSU5ELCBWSUVXX1RBQkxFX0tJTkRdIGFzIGNvbnN0O1xudHlwZSBUYWJsZUtpbmQgPSAodHlwZW9mIFRBQkxFX0tJTkRTKVtudW1iZXJdO1xuXG5pbnRlcmZhY2UgRGF0YWJhc2Uge1xuICAvKiogY29sdW1ucyAqL1xuICBcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlXCI6IHtcbiAgICAvKiogY29sdW1uIG9yZGVyIG51bWJlciBpbiBpdHMgdGFibGUgKi9cbiAgICBhdHRudW06IG51bWJlcjtcbiAgICAvKiogdGFibGUvdmlldyBpZGVudGlmaWVyICovXG4gICAgYXR0cmVsaWQ6IHN0cmluZztcbiAgICAvKiogY29sdW1uIG5hbWUgKi9cbiAgICBhdHRuYW1lOiBzdHJpbmc7XG4gICAgLyoqIHdhcyB0aGUgY29sdW1uIGRyb3BwZWQuIGRyb3BwZWQgY29sdW1ucyBtaWdodCBub3QgYmUgMTAwJSByZW1vdmVkIGltbWVkaWF0ZWx5LiAqL1xuICAgIGF0dGlzZHJvcHBlZDogYm9vbGVhbjtcbiAgICAvKiogY29sdW1uIGRhdGF0eXBlIGlkZW50aWZpZXIgKi9cbiAgICBhdHR0eXBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGdlbmVyYXRpb24gZmxhZyBmb3IgY29tcHV0ZWQgY29sdW1uczpcbiAgICAgKiAnJyAoZW1wdHkpIGZvciByZWd1bGFyIGNvbHVtbnMsXG4gICAgICogJ3MnIGZvciBTVE9SRUQgZ2VuZXJhdGVkIGNvbHVtbnMgKFBvc3RncmVzIEdFTkVSQVRFRCBBTFdBWVMgQVMpLlxuICAgICAqL1xuICAgIGF0dGdlbmVyYXRlZDogXCJcIiB8IFwic1wiO1xuICAgIC8qKiBOT1QgTlVMTCBjb25zdHJhaW50OiB0cnVlIGlmIHRoZSBjb2x1bW4gaGFzIGEgTk9UIE5VTEwgY29uc3RyYWludCAqL1xuICAgIGF0dG5vdG51bGw6IGJvb2xlYW47XG4gIH07XG4gIC8qKiByZXNvdXJjZXMsIGUuZy4gdGFibGVzLCBzZXF1ZW5jZXMsIGV0Yy4gKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2NsYXNzXCI6IHtcbiAgICAvKiogcmVzb3VyY2UgaWQgKi9cbiAgICBvaWQ6IG51bWJlcjtcbiAgICAvKiogcmVzb3VyY2UgbmFtZSAqL1xuICAgIHJlbG5hbWU6IHN0cmluZztcbiAgICAvKiogc2NoZW1hIGlkICovXG4gICAgcmVsbmFtZXNwYWNlOiBudW1iZXI7XG4gICAgLyoqIHJlc291cmNlIGtpbmQ6IHJlZ3VsYXIgdGFibGUsIHZpZXcgKi9cbiAgICByZWxraW5kOiBUYWJsZUtpbmQ7XG4gIH07XG4gIC8qKiBlbnVtIHR5cGVzJyB2YWx1ZXMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2VudW1cIjoge1xuICAgIC8qKiBlbnVtIHZhbHVlICovXG4gICAgZW51bWxhYmVsOiBzdHJpbmc7XG4gICAgLyoqIGVudW0ncyB0eXBlIGlkICovXG4gICAgZW51bXR5cGlkOiBudW1iZXI7XG4gIH07XG4gIC8qKiBzY2hlbWFzICovXG4gIFwicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2VcIjoge1xuICAgIC8qKiBzY2hlbWEgbmFtZSAqL1xuICAgIG5zcG5hbWU6IHN0cmluZztcbiAgICAvKiogc2NoZW1hIGlkICovXG4gICAgb2lkOiBudW1iZXI7XG4gIH07XG4gIC8qKiBkYXRhdHlwZXMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX3R5cGVcIjoge1xuICAgIC8qKiB0eXBlIGlkICovXG4gICAgb2lkOiBudW1iZXI7XG4gICAgLyoqIHR5cGUgbmFtZSAqL1xuICAgIHR5cG5hbWU6IHN0cmluZztcbiAgICAvKiogdHlwZSdzIHNjaGVtYSAoYWthIG5hbWVzcGFjZSkgaWQgKi9cbiAgICB0eXBuYW1lc3BhY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiB0eXBlJ3Mga2luZFxuICAgICAqXG4gICAgICogJ2UnIC0gZW51bSB0eXBlXG4gICAgICovXG4gICAgdHlwdHlwZTogXCJlXCIgfCAoc3RyaW5nICYge30pO1xuICB9O1xuICAvKiogY29uc3RyYWludHMgKi9cbiAgXCJwZ19jYXRhbG9nLnBnX2NvbnN0cmFpbnRcIjoge1xuICAgIC8qKiByZWxhdGlvbiAodGFibGUpIGlkIHdoaWNoIHRoaXMgY29uc3RyYWludCB3YXMgY3JlYXRlZCBmb3IgKi9cbiAgICBjb25yZWxpZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIGNvbnN0cmFpbnQgdHlwZS5cbiAgICAgKlxuICAgICAqIGAncCdgIC0gcHJpbWFyeSBrZXkgY29uc3RyYWludC5cbiAgICAgKiBgJ2YnYCAtIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgY29udHlwZTogXCJwXCIgfCBcImZcIiB8IChzdHJpbmcgJiB7fSk7XG4gICAgLyoqXG4gICAgICogYW4gb3JkZXJlZCBhcnJheSBvZiBjb2x1bW5zIGluY2x1ZGVkIGluIHRoZSBjb25zdHJhaW50LlxuICAgICAqXG4gICAgICogdGhlIGNvbHVtbnMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZWlyIG9yZGluYWwgbnVtYmVyIChgYXR0bnVtYCkgaW4gdGhlaXIgcmVsYXRpb24gKHRhYmxlKS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlIGAnezEsM30nYCAtIGEgY29uc3RyYWludCB3aXRoIDIgY29sdW1ucywgdGhlIDFzdCAmIDNyZCBpbiB0aGVpciB0YWJsZS5cbiAgICAgKi9cbiAgICBjb25rZXk6IG51bWJlcltdO1xuICAgIC8qKiBpZiBhIGZvcmVpZ24ga2V5LCB0aGUgcmVmZXJlbmNlZCB0YWJsZSAqL1xuICAgIGNvbmZyZWxpZDogbnVtYmVyO1xuICAgIC8qKiBpZiBhIGZvcmVpZ24ga2V5LCB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zICovXG4gICAgY29uZmtleTogbnVtYmVyW107XG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyBtZXRhZGF0YSBmb3IgYWxsIHVzZXItZGVmaW5lZCB0YWJsZXMgYW5kIHZpZXdzIGluIHRoZSBkYXRhYmFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlc1F1ZXJ5KHJlcXVpcmVtZW50cz86IE9taXQ8QnVpbGRlclJlcXVpcmVtZW50cywgXCJBZGFwdGVyXCIgfCBcIlF1ZXJ5Q29tcGlsZXJcIj4pIHtcbiAgcmV0dXJuIGNvbXBpbGUoXG4gICAgZ2V0UG9zdGdyZVNRTEJ1aWxkZXI8RGF0YWJhc2U+KHJlcXVpcmVtZW50cylcbiAgICAgIC5zZWxlY3RGcm9tKFwicGdfY2F0YWxvZy5wZ19jbGFzcyBhcyBjbHNcIilcbiAgICAgIC5pbm5lckpvaW4oXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBhcyBuc1wiLCBcImNscy5yZWxuYW1lc3BhY2VcIiwgXCJucy5vaWRcIilcbiAgICAgIC4kY2FsbChleGNsdWRlU3lzdGVtVGFibGVzKVxuICAgICAgLy8gcmVndWxhciB0YWJsZXMgb3Igdmlld3NcbiAgICAgIC53aGVyZShcImNscy5yZWxraW5kXCIsIFwiaW5cIiwgVEFCTEVfS0lORFMpXG4gICAgICAuc2VsZWN0KChlYikgPT4gW1xuICAgICAgICBcIm5zLm5zcG5hbWUgYXMgc2NoZW1hXCIsXG4gICAgICAgIFwiY2xzLnJlbG5hbWUgYXMgbmFtZVwiLFxuICAgICAgICBqc29uQXJyYXlGcm9tKFxuICAgICAgICAgIGViXG4gICAgICAgICAgICAuc2VsZWN0RnJvbShcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlIGFzIGF0dFwiKVxuICAgICAgICAgICAgLmlubmVySm9pbihcInBnX2NhdGFsb2cucGdfdHlwZSBhcyB0eXBcIiwgXCJ0eXAub2lkXCIsIFwiYXR0LmF0dHR5cGlkXCIpXG4gICAgICAgICAgICAuaW5uZXJKb2luKFwicGdfY2F0YWxvZy5wZ19uYW1lc3BhY2UgYXMgdG5zXCIsIFwidG5zLm9pZFwiLCBcInR5cC50eXBuYW1lc3BhY2VcIilcbiAgICAgICAgICAgIC5sZWZ0Sm9pbihcInBnX2NhdGFsb2cucGdfY29uc3RyYWludCBhcyBwa19jb25cIiwgKGpiKSA9PlxuICAgICAgICAgICAgICBqYlxuICAgICAgICAgICAgICAgIC5vbihcInBrX2Nvbi5jb250eXBlXCIsIFwiPVwiLCBcInBcIilcbiAgICAgICAgICAgICAgICAub25SZWYoXCJwa19jb24uY29ucmVsaWRcIiwgXCI9XCIsIFwiY2xzLm9pZFwiKVxuICAgICAgICAgICAgICAgIC5vbigoZWIpID0+IGViKFwiYXR0LmF0dG51bVwiLCBcIj1cIiwgZWIuZm4uYW55KFwicGtfY29uLmNvbmtleVwiKSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmxlZnRKb2luKFwicGdfY2F0YWxvZy5wZ19jb25zdHJhaW50IGFzIGZrX2NvblwiLCAoamIpID0+XG4gICAgICAgICAgICAgIGpiXG4gICAgICAgICAgICAgICAgLm9uKFwiZmtfY29uLmNvbnR5cGVcIiwgXCI9XCIsIFwiZlwiKVxuICAgICAgICAgICAgICAgIC5vblJlZihcImZrX2Nvbi5jb25yZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAgICAgLm9uKChlYikgPT4gZWIoXCJhdHQuYXR0bnVtXCIsIFwiPVwiLCBlYi5mbi5hbnkoXCJma19jb24uY29ua2V5XCIpKSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJwZ19jYXRhbG9nLnBnX2NsYXNzIGFzIGZrX2Nsc1wiLCBcImZrX2Nscy5vaWRcIiwgXCJma19jb24uY29uZnJlbGlkXCIpXG4gICAgICAgICAgICAubGVmdEpvaW4oXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZSBhcyBma19uc1wiLCBcImZrX25zLm9pZFwiLCBcImZrX2Nscy5yZWxuYW1lc3BhY2VcIilcbiAgICAgICAgICAgIC5sZWZ0Sm9pbihcInBnX2NhdGFsb2cucGdfYXR0cmlidXRlIGFzIGZrX2F0dFwiLCAoamIpID0+XG4gICAgICAgICAgICAgIGpiXG4gICAgICAgICAgICAgICAgLm9uUmVmKFwiZmtfYXR0LmF0dHJlbGlkXCIsIFwiPVwiLCBcImZrX2Nscy5vaWRcIilcbiAgICAgICAgICAgICAgICAvLyBVc2UgYSBjYWxsYmFjayBmb3IgdGhlIC5vbigpIGNvbmRpdGlvbiB0byBlbnN1cmUgY29ycmVjdCBjb250ZXh0IGZvciB0eXBlc1xuICAgICAgICAgICAgICAgIC5vbigob25fZWIpID0+IG9uX2ViKFwiZmtfYXR0LmF0dG51bVwiLCBcIj1cIiwgb25fZWIuZm4uYW55KFwiZmtfY29uLmNvbmZrZXlcIikpKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC53aGVyZVJlZihcImF0dC5hdHRyZWxpZFwiLCBcIj1cIiwgXCJjbHMub2lkXCIpXG4gICAgICAgICAgICAvLyBleGNsdWRlIHN5c3RlbSBjb2x1bW5zXG4gICAgICAgICAgICAud2hlcmUoXCJhdHQuYXR0bnVtXCIsIFwiPj1cIiwgMClcbiAgICAgICAgICAgIC53aGVyZShcImF0dC5hdHRpc2Ryb3BwZWRcIiwgXCIhPVwiLCB0cnVlKVxuICAgICAgICAgICAgLnNlbGVjdChbXG4gICAgICAgICAgICAgIFwiYXR0LmF0dG5hbWUgYXMgbmFtZVwiLFxuICAgICAgICAgICAgICBcInR5cC50eXBuYW1lIGFzIGRhdGF0eXBlXCIsXG4gICAgICAgICAgICAgIFwidG5zLm5zcG5hbWUgYXMgZGF0YXR5cGVfc2NoZW1hXCIsXG4gICAgICAgICAgICAgIFwiZmtfbnMubnNwbmFtZSBhcyBmb3JlaWduX2tleV9zY2hlbWFcIixcbiAgICAgICAgICAgICAgXCJma19jbHMucmVsbmFtZSBhcyBmb3JlaWduX2tleV90YWJsZVwiLFxuICAgICAgICAgICAgICBcImZrX2F0dC5hdHRuYW1lIGFzIGZvcmVpZ25fa2V5X2NvbHVtblwiLFxuICAgICAgICAgICAgXSlcbiAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBbXG4gICAgICAgICAgICAgIGViKFwicGtfY29uLmNvbmtleVwiLCBcImlzIG5vdFwiLCBudWxsKS4kY2FzdFRvPGJvb2xlYW4+KCkuYXMoXCJwa1wiKSxcbiAgICAgICAgICAgICAgZWIoXCJhdHQuYXR0Z2VuZXJhdGVkXCIsIFwiIT1cIiwgXCJcIikuJGNhc3RUbzxib29sZWFuPigpLmFzKFwiY29tcHV0ZWRcIiksXG4gICAgICAgICAgICAgIGViKFwiYXR0LmF0dG5vdG51bGxcIiwgXCIhPVwiLCB0cnVlKS4kY2FzdFRvPGJvb2xlYW4+KCkuYXMoXCJudWxsYWJsZVwiKSxcbiAgICAgICAgICAgICAgZWIuZm5cbiAgICAgICAgICAgICAgICAuY29hbGVzY2UoXG4gICAgICAgICAgICAgICAgICBlYlxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0RnJvbShcInBnX2NhdGFsb2cucGdfZW51bSBhcyBlbm1cIilcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlUmVmKFwiZW5tLmVudW10eXBpZFwiLCBcIj1cIiwgXCJ0eXAub2lkXCIpXG4gICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoKGViKSA9PiBlYi5mbi5qc29uQWdnKGViLnJlZihcImVubS5lbnVtbGFiZWxcIikpLmFzKFwib1wiKSksXG4gICAgICAgICAgICAgICAgICBzcWw8c3RyaW5nW10+YCdbXSdgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuYXMoXCJvcHRpb25zXCIpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICkuYXMoXCJjb2x1bW5zXCIpLFxuICAgICAgXSksXG4gICk7XG59XG5cbi8qKlxuICogRm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrVGFibGVzUXVlcnkoKSB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgc2NoZW1hOiBcInB1YmxpY1wiLFxuICAgICAgbmFtZTogXCJ1c2Vyc1wiLFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgICAgICBwazogdHJ1ZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICAgIGRhdGF0eXBlOiBcInZhcmNoYXJcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgcGs6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBmb3JlaWduX2tleV9zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJyb2xlXCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwicm9sZVwiLFxuICAgICAgICAgIGRhdGF0eXBlX3NjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgICAgICBwazogZmFsc2UsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIG9wdGlvbnM6IFtcImFkbWluXCIsIFwibWFpbnRhaW5lclwiLCBcIm1lbWJlclwiXSxcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBmb3JlaWduX2tleV9zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJjcmVhdGVkX2F0XCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wdHpcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgcGs6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBmb3JlaWduX2tleV9zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJkZWxldGVkX2F0XCIsXG4gICAgICAgICAgZGF0YXR5cGU6IFwidGltZXN0YW1wdHpcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgcGs6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICBmb3JlaWduX2tleV9zY2hlbWE6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfdGFibGU6IG51bGwsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNjaGVtYTogXCJwdWJsaWNcIixcbiAgICAgIG5hbWU6IFwicG9zdHNcIixcbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiaWRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgcGs6IHRydWUsXG4gICAgICAgICAgY29tcHV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3NjaGVtYTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV90YWJsZTogbnVsbCxcbiAgICAgICAgICBmb3JlaWduX2tleV9jb2x1bW46IG51bGwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInVzZXJfaWRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICBkYXRhdHlwZV9zY2hlbWE6IFwicHVibGljXCIsXG4gICAgICAgICAgcGs6IGZhbHNlLFxuICAgICAgICAgIGNvbXB1dGVkOiBmYWxzZSxcbiAgICAgICAgICBvcHRpb25zOiBbXSxcbiAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfc2NoZW1hOiBcInB1YmxpY1wiLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBcInVzZXJzXCIsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfY29sdW1uOiBcImlkXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImNvbnRlbnRcIixcbiAgICAgICAgICBkYXRhdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgZGF0YXR5cGVfc2NoZW1hOiBcInB1YmxpY1wiLFxuICAgICAgICAgIHBrOiBmYWxzZSxcbiAgICAgICAgICBjb21wdXRlZDogZmFsc2UsXG4gICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgZm9yZWlnbl9rZXlfc2NoZW1hOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X3RhYmxlOiBudWxsLFxuICAgICAgICAgIGZvcmVpZ25fa2V5X2NvbHVtbjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSBhcyBjb25zdCBzYXRpc2ZpZXMgUXVlcnlSZXN1bHQ8dHlwZW9mIGdldFRhYmxlc1F1ZXJ5Pjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjdXJyZW50IHRpbWV6b25lIHNldHRpbmcgb2YgdGhlIFBvc3RncmVTUUwgZGF0YWJhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lem9uZVF1ZXJ5KCkge1xuICBjb25zdCBidWlsZGVyID0gZ2V0UG9zdGdyZVNRTEJ1aWxkZXIoKTtcblxuICByZXR1cm4gY29tcGlsZShidWlsZGVyLnNlbGVjdE5vRnJvbShidWlsZGVyLmZuPHN0cmluZz4oXCJjdXJyZW50X3NldHRpbmdcIiwgW3NxbC5saXQoXCJ0aW1lem9uZVwiKV0pLmFzKFwidGltZXpvbmVcIikpKTtcbn1cblxuLyoqXG4gKiBGb3IgdGVzdGluZyBwdXJwb3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tUaW1lem9uZVF1ZXJ5KCkge1xuICByZXR1cm4gW3sgdGltZXpvbmU6IFwiVVRDXCIgfV0gYXMgY29uc3Qgc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PHR5cGVvZiBnZXRUaW1lem9uZVF1ZXJ5Pjtcbn1cblxuLyoqXG4gKiBXZSBkb24ndCB3YW50IFBvc3RncmVTUUwgaW50ZXJuYWxzIGluIGludHJvc3BlY3Rpb24gcmVzdWx0cy4gVG8gYmUgdXNlZCBpbiBgJGNhbGxgLlxuICovXG5mdW5jdGlvbiBleGNsdWRlU3lzdGVtVGFibGVzPFxuICBUIGV4dGVuZHMgU2VsZWN0UXVlcnlCdWlsZGVyPFxuICAgIERhdGFiYXNlICYgeyBuczogRGF0YWJhc2VbXCJwZ19jYXRhbG9nLnBnX25hbWVzcGFjZVwiXTsgY2xzOiBEYXRhYmFzZVtcInBnX2NhdGFsb2cucGdfY2xhc3NcIl0gfSxcbiAgICBcIm5zXCIgfCBcImNsc1wiLFxuICAgIG9iamVjdFxuICA+LFxuPihxYjogVCk6IFQge1xuICByZXR1cm4gcWIud2hlcmUoYG5zLm5zcG5hbWVgLCBgIX5gLCBgXnBnX2ApLndoZXJlKGBucy5uc3BuYW1lYCwgYCE9YCwgYGluZm9ybWF0aW9uX3NjaGVtYWApIGFzIG5ldmVyO1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgQWRhcHRlcixcbiAgQWRhcHRlckRlbGV0ZVJlc3VsdCxcbiAgQWRhcHRlckluc2VydFJlc3VsdCxcbiAgQWRhcHRlclF1ZXJ5UmVzdWx0LFxuICBBZGFwdGVyVXBkYXRlUmVzdWx0LFxuICBDb2x1bW4sXG4gIEZpbHRlck9wZXJhdG9yLFxuICBJbnRyb3NwZWN0aW9uLFxuICBUYWJsZSxcbn0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgRXhlY3V0b3IgfSBmcm9tIFwiLi4vZXhlY3V0b3JcIjtcbmltcG9ydCB0eXBlIHsgUXVlcnlSZXN1bHQgfSBmcm9tIFwiLi4vcXVlcnlcIjtcbmltcG9ydCB0eXBlIHsgRWl0aGVyIH0gZnJvbSBcIi4uL3R5cGUtdXRpbHNcIjtcbmltcG9ydCB7IFBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSB9IGZyb20gXCIuL2RhdGF0eXBlXCI7XG5pbXBvcnQgeyBnZXREZWxldGVRdWVyeSwgZ2V0SW5zZXJ0UXVlcnksIGdldFNlbGVjdFF1ZXJ5LCBnZXRVcGRhdGVRdWVyeSB9IGZyb20gXCIuL2RtbFwiO1xuaW1wb3J0IHsgZ2V0VGFibGVzUXVlcnksIGdldFRpbWV6b25lUXVlcnksIG1vY2tUYWJsZXNRdWVyeSwgbW9ja1RpbWV6b25lUXVlcnkgfSBmcm9tIFwiLi9pbnRyb3NwZWN0aW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9zdGdyZXNBZGFwdGVyUmVxdWlyZW1lbnRzIHtcbiAgZXhlY3V0b3I6IEV4ZWN1dG9yO1xuICBub1BhcmFtZXRlcnM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUG9zdGdyZXNBZGFwdGVyKHJlcXVpcmVtZW50czogUG9zdGdyZXNBZGFwdGVyUmVxdWlyZW1lbnRzKTogQWRhcHRlciB7XG4gIGNvbnN0IHsgZXhlY3V0b3IsIC4uLm90aGVyUmVxdWlyZW1lbnRzIH0gPSByZXF1aXJlbWVudHM7XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0U2NoZW1hOiBcInB1YmxpY1wiLFxuICAgIGFzeW5jIGludHJvc3BlY3Qob3B0aW9ucyk6IFByb21pc2U8RWl0aGVyPEVycm9yLCBJbnRyb3NwZWN0aW9uPj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFibGVzUXVlcnkgPSBnZXRUYWJsZXNRdWVyeShvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgIGNvbnN0IHRpbWV6b25lUXVlcnkgPSBnZXRUaW1lem9uZVF1ZXJ5KCk7XG5cbiAgICAgICAgY29uc3QgW1t0YWJsZXNFcnJvciwgdGFibGVzXSwgW3RpbWV6b25lRXJyb3IsIHRpbWV6b25lc11dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGFibGVzUXVlcnksIG9wdGlvbnMpLFxuICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUodGltZXpvbmVRdWVyeSwgb3B0aW9ucyksXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0IGVycm9yID0gdGFibGVzRXJyb3IgfHwgdGltZXpvbmVFcnJvcjtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gW2Vycm9yXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFt0aW1lem9uZV0gPSB0aW1lem9uZXM7XG5cbiAgICAgICAgaWYgKCF0aW1lem9uZSkge1xuICAgICAgICAgIHJldHVybiBbbmV3IEVycm9yKFwiVGltZXpvbmUgbm90IGZvdW5kXCIpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGludHJvc3BlY3Rpb24gPSBjcmVhdGVJbnRyb3NwZWN0aW9uKHRhYmxlcywgdGltZXpvbmUudGltZXpvbmUpO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGludHJvc3BlY3Rpb24pO1xuXG4gICAgICAgIHJldHVybiBbbnVsbCwgaW50cm9zcGVjdGlvbl07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgcHJvcGVybHlcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBFcnJvcl07XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHF1ZXJ5KGRldGFpbHMsIG9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxFcnJvciwgQWRhcHRlclF1ZXJ5UmVzdWx0Pj4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBnZXRTZWxlY3RRdWVyeShkZXRhaWxzLCBvdGhlclJlcXVpcmVtZW50cyk7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0c10gPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKHF1ZXJ5LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gW2Vycm9yXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyBmaWx0ZXJlZFJvd0NvdW50OiByZXN1bHRzWzBdPy5vaWQgfHwgXCIwXCIsIHJvd3M6IHJlc3VsdHMgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBUT0RPOiBoYW5kbGUgcHJvcGVybHlcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBFcnJvcl07XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGluc2VydChkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8RXJyb3IsIEFkYXB0ZXJJbnNlcnRSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldEluc2VydFF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgW2Vycm9yLCByb3dzXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBbZXJyb3JdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCB7IHJvd3MgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIEVycm9yXTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgdXBkYXRlKGRldGFpbHMsIG9wdGlvbnMpOiBQcm9taXNlPEVpdGhlcjxFcnJvciwgQWRhcHRlclVwZGF0ZVJlc3VsdD4+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0VXBkYXRlUXVlcnkoZGV0YWlscywgb3RoZXJSZXF1aXJlbWVudHMpO1xuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3VsdHNdID0gYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIFtlcnJvcl07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbcm93XSA9IHJlc3VsdHM7XG5cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAvLyBUT0RPOiBjdXN0b20gZXJyb3I/XG4gICAgICAgICAgcmV0dXJuIFtuZXcgRXJyb3IoXCJVcGRhdGUgZmFpbGVkXCIpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgeyByb3cgfV07XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIEVycm9yXTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGRlbGV0ZShkZXRhaWxzLCBvcHRpb25zKTogUHJvbWlzZTxFaXRoZXI8RXJyb3IsIEFkYXB0ZXJEZWxldGVSZXN1bHQ+PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IGdldERlbGV0ZVF1ZXJ5KGRldGFpbHMsIG90aGVyUmVxdWlyZW1lbnRzKTtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IGV4ZWN1dG9yLmV4ZWN1dGUocXVlcnksIG9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBbZXJyb3JdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtudWxsLCBkZXRhaWxzXTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgRXJyb3JdO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUludHJvc3BlY3Rpb24odGFibGVzOiBRdWVyeVJlc3VsdDx0eXBlb2YgZ2V0VGFibGVzUXVlcnk+LCB0aW1lem9uZTogc3RyaW5nKTogSW50cm9zcGVjdGlvbiB7XG4gIHJldHVybiB0YWJsZXMucmVkdWNlKFxuICAgIChyZXN1bHQsIHJvdykgPT4ge1xuICAgICAgY29uc3QgeyBzY2hlbWFzIH0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7IGNvbHVtbnMsIG5hbWU6IHRhYmxlTmFtZSwgc2NoZW1hIH0gPSByb3c7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnNSZWNvcmQgPSBjb2x1bW5zLnJlZHVjZShcbiAgICAgICAgKGNvbHVtbnMsIGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZGF0YXR5cGUsIGRhdGF0eXBlX3NjaGVtYSwgbmFtZTogY29sdW1uTmFtZSwgb3B0aW9ucywgbnVsbGFibGUgfSA9IGNvbHVtbjtcblxuICAgICAgICAgIGNvbnN0IGlzQXJyYXkgPSBkYXRhdHlwZS5zdGFydHNXaXRoKFwiX1wiKTtcbiAgICAgICAgICBjb25zdCBzdHJpcHBlZERhdGFUeXBlID0gaXNBcnJheSA/IGRhdGF0eXBlLnNsaWNlKDEpIDogZGF0YXR5cGU7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY29sdW1ucyxcbiAgICAgICAgICAgIFtjb2x1bW5OYW1lXToge1xuICAgICAgICAgICAgICBkYXRhdHlwZToge1xuICAgICAgICAgICAgICAgIC4uLihQT1NUR1JFU1FMX0RBVEFfVFlQRVNfVE9fTUVUQURBVEFbc3RyaXBwZWREYXRhVHlwZV0gfHwge1xuICAgICAgICAgICAgICAgICAgZ3JvdXA6IG9wdGlvbnMubGVuZ3RoID4gMCA/IFwiZW51bVwiIDogXCJyYXdcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpc0FycmF5LFxuICAgICAgICAgICAgICAgIGlzTmF0aXZlOiBkYXRhdHlwZV9zY2hlbWEgPT09IFwicGdfY2F0YWxvZ1wiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGlzQXJyYXkgPyBgJHtzdHJpcHBlZERhdGFUeXBlfVtdYCA6IHN0cmlwcGVkRGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzY2hlbWE6IGRhdGF0eXBlX3NjaGVtYSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaXNDb21wdXRlZDogY29sdW1uLmNvbXB1dGVkLFxuICAgICAgICAgICAgICBpc0luUHJpbWFyeUtleTogY29sdW1uLnBrLFxuICAgICAgICAgICAgICBuYW1lOiBjb2x1bW5OYW1lLFxuICAgICAgICAgICAgICBudWxsYWJsZSxcbiAgICAgICAgICAgICAgc2NoZW1hLFxuICAgICAgICAgICAgICB0YWJsZTogdGFibGVOYW1lLFxuICAgICAgICAgICAgICBma1NjaGVtYTogY29sdW1uLmZvcmVpZ25fa2V5X3NjaGVtYSxcbiAgICAgICAgICAgICAgZmtUYWJsZTogY29sdW1uLmZvcmVpZ25fa2V5X3RhYmxlLFxuICAgICAgICAgICAgICBma0NvbHVtbjogY29sdW1uLmZvcmVpZ25fa2V5X2NvbHVtbixcbiAgICAgICAgICAgIH0gYXMgY29uc3Qgc2F0aXNmaWVzIENvbHVtbixcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBUYWJsZVtcImNvbHVtbnNcIl0sXG4gICAgICApO1xuXG4gICAgICAoc2NoZW1hc1tzY2hlbWFdIHx8PSB7IHRhYmxlczoge30gfSkudGFibGVzW3RhYmxlTmFtZV0gPSB7XG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnNSZWNvcmQsXG4gICAgICAgIG5hbWU6IHRhYmxlTmFtZSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNjaGVtYXM6IHsgcHVibGljOiB7IHRhYmxlczoge30gfSB9LFxuICAgICAgdGltZXpvbmUsXG4gICAgICBmaWx0ZXJPcGVyYXRvcnMsXG4gICAgfSBzYXRpc2ZpZXMgSW50cm9zcGVjdGlvbiBhcyBJbnRyb3NwZWN0aW9uLFxuICApO1xufVxuXG5jb25zdCBmaWx0ZXJPcGVyYXRvcnMgPSBbXG4gIFwiPVwiLFxuICBcIiE9XCIsXG4gIFwiPlwiLFxuICBcIj49XCIsXG4gIFwiPFwiLFxuICBcIjw9XCIsXG4gIFwiaW5cIixcbiAgXCJub3QgaW5cIixcbiAgXCJpc1wiLFxuICBcImlzIG5vdFwiLFxuICBcImxpa2VcIixcbiAgXCJub3QgbGlrZVwiLFxuICBcImlsaWtlXCIsXG4gIFwibm90IGlsaWtlXCIsXG5dIHNhdGlzZmllcyBGaWx0ZXJPcGVyYXRvcltdO1xuXG4vKipcbiAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja0ludHJvc3BlY3QoKSB7XG4gIGNvbnN0IHRhYmxlcyA9IG1vY2tUYWJsZXNRdWVyeSgpO1xuICBjb25zdCBbeyB0aW1lem9uZSB9XSA9IG1vY2tUaW1lem9uZVF1ZXJ5KCk7XG5cbiAgcmV0dXJuIGNyZWF0ZUludHJvc3BlY3Rpb24odGFibGVzLCB0aW1lem9uZSkgYXMge1xuICAgIC8vIGJlc3QgZWZmb3J0LCBubyBuZWVkIGdvIG92ZXJib2FyZC5cbiAgICBzY2hlbWFzOiB7XG4gICAgICBbSyBpbiAodHlwZW9mIHRhYmxlcylbbnVtYmVyXVtcInNjaGVtYVwiXV06IHtcbiAgICAgICAgdGFibGVzOiB7XG4gICAgICAgICAgW1QgaW4gKHR5cGVvZiB0YWJsZXMpW251bWJlcl1bXCJuYW1lXCJdXTogVGFibGU7XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgIH07XG4gICAgdGltZXpvbmU6IHR5cGVvZiB0aW1lem9uZTtcbiAgICBmaWx0ZXJPcGVyYXRvcnM6IEZpbHRlck9wZXJhdG9yW107XG4gIH0gc2F0aXNmaWVzIEludHJvc3BlY3Rpb247XG59XG4iXSwKICAibWFwcGluZ3MiOiAidWJBQUEsSUFBQUEsR0FBQSxHQUFBQyxHQUFBRCxHQUFBLDJCQUFBRSxHQUFBLG1CQUFBQyxHQUFBLG1CQUFBQyxHQUFBLG1CQUFBQyxHQUFBLG1CQUFBQyxHQUFBLHFCQUFBQyxHQUFBLG1CQUFBQyxHQUFBLG1CQUFBQyxHQUFBLG9CQUFBQyxHQUFBLG9CQUFBQyxHQUFBLHNCQUFBQyxLQUFBLGVBQUFDLEdBQUFiLElDRU8sSUFBTWMsR0FBNkUsQ0FDeEYsS0FBTSxDQUNKLE1BQU8sU0FDVCxFQUNBLFFBQVMsQ0FDUCxNQUFPLFNBQ1QsRUFDQSxNQUFPLENBQ0wsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFDVCxFQUNBLE9BQVEsQ0FDTixNQUFPLFFBQ1QsRUFJQSxLQUFNLENBQ0osTUFBTyxVQUNULEVBSUEsU0FBVSxDQUNSLE1BQU8sUUFDVCxFQUNBLEtBQU0sQ0FDSixNQUFPLFFBQ1QsRUFDQSxRQUFTLENBQ1AsTUFBTyxRQUNULEVBQ0EsS0FBTSxDQUNKLE1BQU8sUUFDVCxFQU1BLEtBQU0sQ0FDSixNQUFPLE1BQ1QsRUFNQSxVQUFXLENBQ1QsTUFBTyxVQUNULEVBTUEsWUFBYSxDQUNYLE1BQU8sVUFDVCxFQU1BLDhCQUErQixDQUM3QixNQUFPLFVBQ1Qs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LEVBQ3pCLENBQUMsQ0FBRSxTQUFBNUIsQ0FBUyxDQUFDLEVBQUk2QixHQUFrQixFQUV6QyxPQUFPM0IsR0FBb0JOLEVBQVFJLENBQVEsQ0FZN0MiLAogICJuYW1lcyI6IFsicG9zdGdyZXNfY29yZV9leHBvcnRzIiwgIl9fZXhwb3J0IiwgImNyZWF0ZVBvc3RncmVzQWRhcHRlciIsICJnZXREZWxldGVRdWVyeSIsICJnZXRJbnNlcnRRdWVyeSIsICJnZXRTZWxlY3RRdWVyeSIsICJnZXRUYWJsZXNRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgImdldFVwZGF0ZVF1ZXJ5IiwgIm1vY2tJbnRyb3NwZWN0IiwgIm1vY2tTZWxlY3RRdWVyeSIsICJtb2NrVGFibGVzUXVlcnkiLCAibW9ja1RpbWV6b25lUXVlcnkiLCAiX190b0NvbW1vbkpTIiwgIlBPU1RHUkVTUUxfREFUQV9UWVBFU19UT19NRVRBREFUQSIsICJpc1VuZGVmaW5lZCIsICJvYmoiLCAiaXNTdHJpbmciLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJpc0RhdGUiLCAiaXNCaWdJbnQiLCAiaXNGdW5jdGlvbiIsICJvYmoiLCAiaXNPYmplY3QiLCAiZnJlZXplIiwgIm9iaiIsICJhc0FycmF5IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXNSZWFkb25seUFycmF5IiwgImFyZyIsICJub29wIiwgIm9iaiIsICJBbHRlclRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJwcm9wcyIsICJjb2x1bW5BbHRlcmF0aW9uIiwgIklkZW50aWZpZXJOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAicHJvcHMiLCAiY29sdW1ucyIsICJDcmVhdGVTY2hlbWFOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNjaGVtYSIsICJwYXJhbXMiLCAiSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlU2NoZW1hIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0YWJsZSIsICJjcmVhdGVUYWJsZSIsICJjb2x1bW4iLCAiY29uc3RyYWludCIsICJtb2RpZmllciIsICJwYXJhbXMiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaWRlbnRpZmllciIsICJJZGVudGlmaWVyTm9kZSIsICJzY2hlbWEiLCAiRHJvcEluZGV4Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgInBhcmFtcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJkcm9wSW5kZXgiLCAicHJvcHMiLCAiRHJvcFNjaGVtYU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2NoZW1hIiwgInBhcmFtcyIsICJJZGVudGlmaWVyTm9kZSIsICJkcm9wU2NoZW1hIiwgIkRyb3BUYWJsZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGUiLCAicGFyYW1zIiwgImRyb3BJbmRleCIsICJBbGlhc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiYWxpYXMiLCAiVGFibGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgInNjaGVtYSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAib2JqIiwgImlzT2JqZWN0IiwgImlzRnVuY3Rpb24iLCAiaXNFeHByZXNzaW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJTZWxlY3RNb2RpZmllck5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibW9kaWZpZXIiLCAib2YiLCAiQW5kTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgIk9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJsZWZ0IiwgInJpZ2h0IiwgIk9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmaWx0ZXIiLCAib25Ob2RlIiwgIm9wZXJhdG9yIiwgIm9wZXJhdGlvbiIsICJBbmROb2RlIiwgIk9yTm9kZSIsICJKb2luTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJqb2luVHlwZSIsICJ0YWJsZSIsICJvbiIsICJPbk5vZGUiLCAiam9pbk5vZGUiLCAib3BlcmF0aW9uIiwgIkJpbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGVmdE9wZXJhbmQiLCAib3BlcmF0b3IiLCAicmlnaHRPcGVyYW5kIiwgIkNPTVBBUklTT05fT1BFUkFUT1JTIiwgIkFSSVRITUVUSUNfT1BFUkFUT1JTIiwgIkpTT05fT1BFUkFUT1JTIiwgIkJJTkFSWV9PUEVSQVRPUlMiLCAiVU5BUllfRklMVEVSX09QRVJBVE9SUyIsICJVTkFSWV9PUEVSQVRPUlMiLCAiT1BFUkFUT1JTIiwgIk9wZXJhdG9yTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJpc0pTT05PcGVyYXRvciIsICJvcCIsICJpc1N0cmluZyIsICJKU09OX09QRVJBVE9SUyIsICJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJJZGVudGlmaWVyTm9kZSIsICJTZWxlY3RBbGxOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIlJlZmVyZW5jZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgInRhYmxlIiwgIlNlbGVjdEFsbE5vZGUiLCAiRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAiI2R5bmFtaWNSZWZlcmVuY2UiLCAicmVmZXJlbmNlIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJpc0R5bmFtaWNSZWZlcmVuY2VCdWlsZGVyIiwgIm9iaiIsICJpc09iamVjdCIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNTdHJpbmciLCAiT3JkZXJCeUl0ZW1Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9yZGVyQnkiLCAiZGlyZWN0aW9uIiwgInByb3BzIiwgIlJhd05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic3FsRnJhZ21lbnRzIiwgInBhcmFtZXRlcnMiLCAic3FsIiwgImNoaWxkIiwgImNoaWxkcmVuIiwgIkNvbGxhdGVOb2RlIiwgIm5vZGUiLCAiY29sbGF0aW9uIiwgImZyZWV6ZSIsICJJZGVudGlmaWVyTm9kZSIsICJPcmRlckJ5SXRlbUJ1aWxkZXIiLCAiX09yZGVyQnlJdGVtQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJSYXdOb2RlIiwgImNvbGxhdGlvbiIsICJDb2xsYXRlTm9kZSIsICJMT0dHRURfTUVTU0FHRVMiLCAibG9nT25jZSIsICJtZXNzYWdlIiwgImlzT3JkZXJCeURpcmVjdGlvbiIsICJ0aGluZyIsICJwYXJzZU9yZGVyQnkiLCAiYXJncyIsICJwYXJzZU9yZGVyQnlJdGVtIiwgIm9yZGVyQnkiLCAibG9nT25jZSIsICJpdGVtIiwgImV4cHIiLCAibW9kaWZpZXJzIiwgInBhcnNlZFJlZiIsICJwYXJzZU9yZGVyQnlFeHByZXNzaW9uIiwgIk9yZGVyQnlJdGVtTm9kZSIsICJwYXJzZU9yZGVyQnlXaXRoTW9kaWZpZXJzIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAiaXNEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJyZWYiLCAiZGlyZWN0aW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlJhd05vZGUiLCAiaXNFeHByZXNzaW9uIiwgIm5vZGUiLCAiT3JkZXJCeUl0ZW1CdWlsZGVyIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInJlZmVyZW5jZSIsICJ0cmF2ZXJzYWwiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9wZXJhdG9yIiwgInZhbHVlIiwgIkpTT05QYXRoTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbk9wZXJhdG9yIiwgImpzb25QYXRoTm9kZSIsICJwYXRoTGVnIiwgInBhcnNlU2ltcGxlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNTdHJpbmciLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFyZyIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJwYXJzZUV4cHJlc3Npb24iLCAicGFyc2VKU09OUmVmZXJlbmNlIiwgInJlZiIsICJvcCIsICJyZWZlcmVuY2VOb2RlIiwgImlzSlNPTk9wZXJhdG9yIiwgIkpTT05SZWZlcmVuY2VOb2RlIiwgIkpTT05PcGVyYXRvckNoYWluTm9kZSIsICJPcGVyYXRvck5vZGUiLCAib3BXaXRob3V0TGFzdENoYXIiLCAiSlNPTlBhdGhOb2RlIiwgIkNPTFVNTl9TRVBBUkFUT1IiLCAiUmVmZXJlbmNlTm9kZSIsICJDb2x1bW5Ob2RlIiwgInBhcnRzIiwgInRyaW0iLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGVBbmRTY2hlbWEiLCAicGFyc2VTdHJpbmdSZWZlcmVuY2VXaXRoVGFibGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgIkFMSUFTX1NFUEFSQVRPUiIsICJjb2x1bW5SZWYiLCAiYWxpYXMiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInBhcnNlQ29sdW1uTmFtZSIsICJjb2x1bW4iLCAicGFyc2VPcmRlcmVkQ29sdW1uTmFtZSIsICJPUkRFUl9TRVBBUkFUT1IiLCAiY29sdW1uTmFtZSIsICJvcmRlciIsICJpc09yZGVyQnlEaXJlY3Rpb24iLCAicGFyc2VPcmRlckJ5IiwgInNjaGVtYSIsICJ0YWJsZSIsICJUYWJsZU5vZGUiLCAic3RyIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIlZhbHVlTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIlZhbHVlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbk9yTGlzdCIsICJhcmciLCAiaXNSZWFkb25seUFycmF5IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uTGlzdCIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJleHAiLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgInBhcnNlRXhwcmVzc2lvbiIsICJWYWx1ZU5vZGUiLCAiaXNTYWZlSW1tZWRpYXRlVmFsdWUiLCAidmFsdWUiLCAiaXNOdW1iZXIiLCAiaXNCb29sZWFuIiwgImlzTnVsbCIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiUGFyZW5zTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImFyZ3MiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJsZWZ0IiwgIm9wZXJhdG9yIiwgInJpZ2h0IiwgImlzSXNPcGVyYXRvciIsICJuZWVkc0lzT3BlcmF0b3IiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAicGFyc2VPcGVyYXRvciIsICJWYWx1ZU5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb25Pckxpc3QiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJwYXJzZUZpbHRlck9iamVjdCIsICJvYmoiLCAiY29tYmluYXRvciIsICJwYXJzZUZpbHRlckxpc3QiLCAidiIsICJpc1VuZGVmaW5lZCIsICJrIiwgImxpc3QiLCAid2l0aFBhcmVucyIsICJjb21iaW5lIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIk9wZXJhdG9yTm9kZSIsICJub2RlIiwgInRvT3BlcmF0aW9uTm9kZSIsICJpIiwgIlBhcmVuc05vZGUiLCAidmFsdWUiLCAiaXNOdWxsIiwgImlzQm9vbGVhbiIsICJpc1N0cmluZyIsICJPUEVSQVRPUlMiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIm5vZGVPclNvdXJjZSIsICJPcmRlckJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJvcmRlckJ5IiwgIlBhcnRpdGlvbkJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJwYXJ0aXRpb25CeSIsICJPdmVyTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvdmVyTm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJQYXJ0aXRpb25CeU5vZGUiLCAiRnJvbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZnJvbXMiLCAiZnJvbSIsICJHcm91cEJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpdGVtcyIsICJncm91cEJ5IiwgIkhhdmluZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgImhhdmluZ05vZGUiLCAib3BlcmF0b3IiLCAib3BlcmF0aW9uIiwgIkFuZE5vZGUiLCAiT3JOb2RlIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJpbnRvIiwgIndpdGhOb2RlIiwgInJlcGxhY2UiLCAiaW5zZXJ0UXVlcnkiLCAicHJvcHMiLCAiTGlzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiaXRlbXMiLCAiVXBkYXRlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlcyIsICJ3aXRoTm9kZSIsICJMaXN0Tm9kZSIsICJ1cGRhdGVRdWVyeSIsICJmcm9tSXRlbXMiLCAiRnJvbU5vZGUiLCAidXBkYXRlcyIsICJsaW1pdCIsICJVc2luZ05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVzIiwgInVzaW5nIiwgIkRlbGV0ZVF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmcm9tSXRlbXMiLCAid2l0aE5vZGUiLCAiRnJvbU5vZGUiLCAiaXRlbXMiLCAiUXVlcnlOb2RlIiwgImRlbGV0ZU5vZGUiLCAibGltaXQiLCAidGFibGVzIiwgIlVzaW5nTm9kZSIsICJXaGVyZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZmlsdGVyIiwgIndoZXJlTm9kZSIsICJvcGVyYXRvciIsICJvcGVyYXRpb24iLCAiQW5kTm9kZSIsICJPck5vZGUiLCAiUmV0dXJuaW5nTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJzZWxlY3Rpb25zIiwgInJldHVybmluZyIsICJFeHBsYWluTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJXaGVuTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb25kaXRpb24iLCAid2hlbk5vZGUiLCAicmVzdWx0IiwgIk1lcmdlUXVlcnlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImludG8iLCAid2l0aE5vZGUiLCAibWVyZ2VOb2RlIiwgInVzaW5nIiwgIndoZW4iLCAidGhlbiIsICJXaGVuTm9kZSIsICJPdXRwdXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInNlbGVjdGlvbnMiLCAib3V0cHV0IiwgIlF1ZXJ5Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJEZWxldGVRdWVyeU5vZGUiLCAiTWVyZ2VRdWVyeU5vZGUiLCAibW9kaWZpZXIiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJqb2luIiwgInNlbGVjdGlvbnMiLCAiUmV0dXJuaW5nTm9kZSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJFeHBsYWluTm9kZSIsICJ0b3AiLCAiT3V0cHV0Tm9kZSIsICJpdGVtcyIsICJPcmRlckJ5Tm9kZSIsICJTZWxlY3RRdWVyeU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAid2l0aE5vZGUiLCAiZnJvbUl0ZW1zIiwgIkZyb21Ob2RlIiwgInNlbGVjdCIsICJzZWxlY3Rpb25zIiwgImV4cHJlc3Npb25zIiwgIm1vZGlmaWVyIiwgIml0ZW1zIiwgIlF1ZXJ5Tm9kZSIsICJzZWxlY3ROb2RlIiwgIkdyb3VwQnlOb2RlIiwgImxpbWl0IiwgIm9mZnNldCIsICJmZXRjaCIsICJvcGVyYXRpb24iLCAiSGF2aW5nTm9kZSIsICJzZXRPcGVyYXRpb25zIiwgIkpvaW5CdWlsZGVyIiwgIl9Kb2luQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiSm9pbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJsaHMiLCAib3AiLCAicmhzIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAiUmF3Tm9kZSIsICJmdW5jIiwgIlBhcnRpdGlvbkJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJwYXJ0aXRpb25CeSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb25Pckxpc3QiLCAiUGFydGl0aW9uQnlJdGVtTm9kZSIsICJPdmVyQnVpbGRlciIsICJfT3ZlckJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIk92ZXJOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJRdWVyeU5vZGUiLCAicGFydGl0aW9uQnkiLCAicGFyc2VQYXJ0aXRpb25CeSIsICJmdW5jIiwgIlNlbGVjdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic2VsZWN0aW9uIiwgIlNlbGVjdEFsbE5vZGUiLCAidGFibGUiLCAiUmVmZXJlbmNlTm9kZSIsICJwYXJzZVNlbGVjdEFyZyIsICJzZWxlY3Rpb24iLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiaXQiLCAicGFyc2VTZWxlY3RFeHByZXNzaW9uIiwgImlzU3RyaW5nIiwgIlNlbGVjdGlvbk5vZGUiLCAicGFyc2VBbGlhc2VkU3RyaW5nUmVmZXJlbmNlIiwgImlzRHluYW1pY1JlZmVyZW5jZUJ1aWxkZXIiLCAicGFyc2VBbGlhc2VkRXhwcmVzc2lvbiIsICJwYXJzZVNlbGVjdEFsbCIsICJ0YWJsZSIsICJwYXJzZVNlbGVjdEFsbEFyZyIsICJwYXJzZVRhYmxlIiwgIlZhbHVlc05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWVzIiwgIkRlZmF1bHRJbnNlcnRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgImFyZyIsICJvYmplY3RPckxpc3QiLCAiaXNGdW5jdGlvbiIsICJleHByZXNzaW9uQnVpbGRlciIsICJsaXN0IiwgImlzUmVhZG9ubHlBcnJheSIsICJmcmVlemUiLCAicGFyc2VJbnNlcnRDb2x1bW5zQW5kVmFsdWVzIiwgInJvd3MiLCAiY29sdW1ucyIsICJwYXJzZUNvbHVtbk5hbWVzQW5kSW5kZXhlcyIsICJDb2x1bW5Ob2RlIiwgIlZhbHVlc05vZGUiLCAicm93IiwgInBhcnNlUm93VmFsdWVzIiwgImNvbHMiLCAiY29sIiwgInJvd0NvbHVtbnMiLCAicm93VmFsdWVzIiwgImhhc1VuZGVmaW5lZE9yQ29tcGxleENvbHVtbnMiLCAiaW5kZXhlZFJvd0NvbHVtbnMiLCAiY29sdW1uSWR4IiwgImlzVW5kZWZpbmVkIiwgInZhbHVlIiwgImlzRXhwcmVzc2lvbk9yRmFjdG9yeSIsICJkZWZhdWx0VmFsdWUiLCAiRGVmYXVsdEluc2VydFZhbHVlTm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIml0IiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIlByaW1pdGl2ZVZhbHVlTGlzdE5vZGUiLCAiQ29sdW1uVXBkYXRlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW4iLCAidmFsdWUiLCAicGFyc2VVcGRhdGUiLCAiYXJncyIsICJDb2x1bW5VcGRhdGVOb2RlIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbiIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAidXBkYXRlIiwgInVwZGF0ZU9iaiIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgIl8iLCAidmFsdWUiLCAia2V5IiwgIkNvbHVtbk5vZGUiLCAiT25EdXBsaWNhdGVLZXlOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInVwZGF0ZXMiLCAiSW5zZXJ0UmVzdWx0IiwgImluc2VydElkIiwgIm51bUluc2VydGVkT3JVcGRhdGVkUm93cyIsICJOb1Jlc3VsdEVycm9yIiwgIm5vZGUiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiZm4iLCAiT25Db25mbGljdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAicHJvcHMiLCAib3BlcmF0aW9uIiwgIldoZXJlTm9kZSIsICJPbkNvbmZsaWN0QnVpbGRlciIsICJfT25Db25mbGljdEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJjb2x1bW4iLCAiY29sdW1uTm9kZSIsICJDb2x1bW5Ob2RlIiwgIk9uQ29uZmxpY3ROb2RlIiwgImNvbHVtbnMiLCAiY29sdW1uTm9kZXMiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZXhwcmVzc2lvbiIsICJhcmdzIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIk9uQ29uZmxpY3REb05vdGhpbmdCdWlsZGVyIiwgInVwZGF0ZSIsICJPbkNvbmZsaWN0VXBkYXRlQnVpbGRlciIsICJwYXJzZVVwZGF0ZU9iamVjdEV4cHJlc3Npb24iLCAiZnVuYyIsICJfT25Db25mbGljdFVwZGF0ZUJ1aWxkZXIiLCAiVG9wTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJpc051bWJlciIsICJpc0JpZ0ludCIsICJpc1VuZGVmaW5lZCIsICJpc1RvcE1vZGlmaWVycyIsICJUb3BOb2RlIiwgIk9yQWN0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJhY3Rpb24iLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIl9JbnNlcnRRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJpbnNlcnQiLCAiY29sdW1ucyIsICJ2YWx1ZXMiLCAicGFyc2VJbnNlcnRFeHByZXNzaW9uIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJDb2x1bW5Ob2RlIiwgImV4cHJlc3Npb24iLCAicGFyc2VFeHByZXNzaW9uIiwgIm1vZGlmaWVyIiwgIlF1ZXJ5Tm9kZSIsICJPckFjdGlvbk5vZGUiLCAibW9kaWZpZXJzIiwgInBhcnNlVG9wIiwgImNhbGxiYWNrIiwgIk9uQ29uZmxpY3RCdWlsZGVyIiwgIk9uQ29uZmxpY3ROb2RlIiwgInVwZGF0ZSIsICJPbkR1cGxpY2F0ZUtleU5vZGUiLCAicGFyc2VVcGRhdGVPYmplY3RFeHByZXNzaW9uIiwgInNlbGVjdGlvbiIsICJwYXJzZVNlbGVjdEFyZyIsICJwYXJzZVNlbGVjdEFsbCIsICJhcmdzIiwgInRhYmxlIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgInBsdWdpbiIsICJjb21waWxlZFF1ZXJ5IiwgInJlc3VsdCIsICJhZGFwdGVyIiwgInF1ZXJ5IiwgIkluc2VydFJlc3VsdCIsICJlcnJvckNvbnN0cnVjdG9yIiwgIk5vUmVzdWx0RXJyb3IiLCAiaXNOb1Jlc3VsdEVycm9yQ29uc3RydWN0b3IiLCAiY2h1bmtTaXplIiwgInN0cmVhbSIsICJpdGVtIiwgImZvcm1hdCIsICJvcHRpb25zIiwgIkRlbGV0ZVJlc3VsdCIsICJudW1EZWxldGVkUm93cyIsICJMaW1pdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibGltaXQiLCAiRGVsZXRlUXVlcnlCdWlsZGVyIiwgIl9EZWxldGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJ0YWJsZXMiLCAiRGVsZXRlUXVlcnlOb2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgIiNqb2luIiwgImpvaW5UeXBlIiwgInBhcnNlSm9pbiIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJtb2RpZmllciIsICJmdW5jIiwgImNvbmRpdGlvbiIsICJwbHVnaW4iLCAiY29tcGlsZWRRdWVyeSIsICJyZXN1bHQiLCAiYWRhcHRlciIsICJxdWVyeSIsICJEZWxldGVSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgImNodW5rU2l6ZSIsICJzdHJlYW0iLCAiaXRlbSIsICJmb3JtYXQiLCAib3B0aW9ucyIsICJVcGRhdGVSZXN1bHQiLCAibnVtVXBkYXRlZFJvd3MiLCAibnVtQ2hhbmdlZFJvd3MiLCAiVXBkYXRlUXVlcnlCdWlsZGVyIiwgIl9VcGRhdGVRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJhcmdzIiwgIlF1ZXJ5Tm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJmcm9tIiwgIlVwZGF0ZVF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICIjam9pbiIsICJqb2luVHlwZSIsICJwYXJzZUpvaW4iLCAicGFyc2VPcmRlckJ5IiwgImxpbWl0IiwgIkxpbWl0Tm9kZSIsICJwYXJzZVZhbHVlRXhwcmVzc2lvbiIsICJwYXJzZVVwZGF0ZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJjb25kaXRpb24iLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiVXBkYXRlUmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiQ29tbW9uVGFibGVFeHByZXNzaW9uTmFtZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidGFibGVOYW1lIiwgImNvbHVtbk5hbWVzIiwgIlRhYmxlTm9kZSIsICJDb2x1bW5Ob2RlIiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJleHByZXNzaW9uIiwgInByb3BzIiwgIkNURUJ1aWxkZXIiLCAiX0NURUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJDb21tb25UYWJsZUV4cHJlc3Npb25Ob2RlIiwgInBhcnNlQ29tbW9uVGFibGVFeHByZXNzaW9uIiwgIm5hbWVPckJ1aWxkZXJDYWxsYmFjayIsICJleHByZXNzaW9uIiwgImV4cHJlc3Npb25Ob2RlIiwgImNyZWF0ZVF1ZXJ5Q3JlYXRvciIsICJpc0Z1bmN0aW9uIiwgImN0ZUJ1aWxkZXJGYWN0b3J5IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5vZGUiLCAicGFyc2VDb21tb25UYWJsZUV4cHJlc3Npb25OYW1lIiwgIm5hbWUiLCAiQ1RFQnVpbGRlciIsICJwYXJ0cyIsICJ0YWJsZSIsICJjb2x1bW5zIiwgIml0IiwgIkNvbW1vblRhYmxlRXhwcmVzc2lvbk5hbWVOb2RlIiwgIldpdGhOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImV4cHJlc3Npb24iLCAicGFyYW1zIiwgIndpdGhOb2RlIiwgIkNIQVJTIiwgInJhbmRvbVN0cmluZyIsICJsZW5ndGgiLCAiY2hhcnMiLCAiaSIsICJyYW5kb21DaGFyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiTGF6eVF1ZXJ5SWQiLCAiI3F1ZXJ5SWQiLCAicmFuZG9tU3RyaW5nIiwgIk9wZXJhdGlvbk5vZGVUcmFuc2Zvcm1lciIsICIjdHJhbnNmb3JtZXJzIiwgImZyZWV6ZSIsICJub2RlIiwgInF1ZXJ5SWQiLCAib3V0IiwgImxpc3QiLCAiX3F1ZXJ5SWQiLCAiUk9PVF9PUEVSQVRJT05fTk9ERVMiLCAiZnJlZXplIiwgIlNDSEVNQUxFU1NfRlVOQ1RJT05TIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAiI3NjaGVtYSIsICIjc2NoZW1hYmxlSWRzIiwgIiNjdGVzIiwgInNjaGVtYSIsICJub2RlIiwgInF1ZXJ5SWQiLCAiI2lzUm9vdE9wZXJhdGlvbk5vZGUiLCAiY3RlcyIsICIjY29sbGVjdENURXMiLCAiY3RlIiwgInRhYmxlcyIsICIjY29sbGVjdFNjaGVtYWJsZUlkcyIsICJ0YWJsZSIsICJ0cmFuc2Zvcm1lZCIsICJJZGVudGlmaWVyTm9kZSIsICJUYWJsZU5vZGUiLCAiI3RyYW5zZm9ybVRhYmxlQXJnc1dpdGhvdXRTY2hlbWFzIiwgImFyZ3NLZXkiLCAiYXJnIiwgInNjaGVtYWJsZUlkcyIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICIjY29sbGVjdFNjaGVtYWJsZUlkIiwgImZyb20iLCAiI2NvbGxlY3RTY2hlbWFibGVJZHNGcm9tVGFibGVFeHByIiwgImpvaW4iLCAiI2NvbGxlY3RDVEVJZHMiLCAiQWxpYXNOb2RlIiwgIkxpc3ROb2RlIiwgImlkIiwgImV4cHIiLCAiY3RlSWQiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAic2NoZW1hIiwgIldpdGhTY2hlbWFUcmFuc2Zvcm1lciIsICJhcmdzIiwgIk1hdGNoZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5vdCIsICJieVNvdXJjZSIsICJwYXJzZU1lcmdlV2hlbiIsICJ0eXBlIiwgImFyZ3MiLCAicmVmUmlnaHQiLCAiV2hlbk5vZGUiLCAicGFyc2VGaWx0ZXJMaXN0IiwgIk1hdGNoZWROb2RlIiwgInBhcnNlUmVmZXJlbnRpYWxCaW5hcnlPcGVyYXRpb24iLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJwYXJzZU1lcmdlVGhlbiIsICJyZXN1bHQiLCAiaXNTdHJpbmciLCAiUmF3Tm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiRGVmZXJyZWQiLCAiI3Byb21pc2UiLCAiI3Jlc29sdmUiLCAiI3JlamVjdCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJ2YWx1ZSIsICJyZWFzb24iLCAicHJvdmlkZUNvbnRyb2xsZWRDb25uZWN0aW9uIiwgImNvbm5lY3Rpb25Qcm92aWRlciIsICJjb25uZWN0aW9uRGVmZXIiLCAiRGVmZXJyZWQiLCAiY29ubmVjdGlvblJlbGVhc2VEZWZlciIsICJjb25uZWN0aW9uIiwgImV4IiwgImZyZWV6ZSIsICJOT19QTFVHSU5TIiwgImZyZWV6ZSIsICJRdWVyeUV4ZWN1dG9yQmFzZSIsICIjcGx1Z2lucyIsICJwbHVnaW5zIiwgIm5vZGUiLCAicXVlcnlJZCIsICJwbHVnaW4iLCAidHJhbnNmb3JtZWROb2RlIiwgImNvbXBpbGVkUXVlcnkiLCAiY29ubmVjdGlvbiIsICJyZXN1bHQiLCAibG9nT25jZSIsICIjdHJhbnNmb3JtUmVzdWx0IiwgImNodW5rU2l6ZSIsICJyZWxlYXNlIiwgInByb3ZpZGVDb250cm9sbGVkQ29ubmVjdGlvbiIsICJOb29wUXVlcnlFeGVjdXRvciIsICJfTm9vcFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAicGx1Z2luIiwgInBsdWdpbnMiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJNZXJnZVJlc3VsdCIsICJudW1DaGFuZ2VkUm93cyIsICJNZXJnZVF1ZXJ5QnVpbGRlciIsICJfTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJtb2RpZmllciIsICJRdWVyeU5vZGUiLCAiZXhwcmVzc2lvbiIsICJtb2RpZmllcnMiLCAicGFyc2VUb3AiLCAiYXJncyIsICJXaGVuZWFibGVNZXJnZVF1ZXJ5QnVpbGRlciIsICJNZXJnZVF1ZXJ5Tm9kZSIsICJwYXJzZUpvaW4iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiX1doZW5lYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgIiN3aGVuTWF0Y2hlZCIsICJsaHMiLCAib3AiLCAicmhzIiwgInJlZlJpZ2h0IiwgIk1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgInBhcnNlTWVyZ2VXaGVuIiwgIiN3aGVuTm90TWF0Y2hlZCIsICJieVNvdXJjZSIsICJCdWlsZGVyIiwgIk5vdE1hdGNoZWRUaGVuYWJsZU1lcmdlUXVlcnlCdWlsZGVyIiwgImZ1bmMiLCAiY29uZGl0aW9uIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImFkYXB0ZXIiLCAicXVlcnkiLCAiTWVyZ2VSZXN1bHQiLCAiZXJyb3JDb25zdHJ1Y3RvciIsICJOb1Jlc3VsdEVycm9yIiwgImlzTm9SZXN1bHRFcnJvckNvbnN0cnVjdG9yIiwgInBhcnNlTWVyZ2VUaGVuIiwgInNldCIsICJVcGRhdGVRdWVyeUJ1aWxkZXIiLCAiTk9PUF9RVUVSWV9FWEVDVVRPUiIsICJVcGRhdGVRdWVyeU5vZGUiLCAidWIiLCAiaW5zZXJ0IiwgImNvbHVtbnMiLCAidmFsdWVzIiwgInBhcnNlSW5zZXJ0RXhwcmVzc2lvbiIsICJJbnNlcnRRdWVyeU5vZGUiLCAiUXVlcnlDcmVhdG9yIiwgIl9RdWVyeUNyZWF0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJmcm9tIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAidGFibGUiLCAiSW5zZXJ0UXVlcnlCdWlsZGVyIiwgIkluc2VydFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlIiwgIkRlbGV0ZVF1ZXJ5QnVpbGRlciIsICJEZWxldGVRdWVyeU5vZGUiLCAidGFibGVzIiwgIlVwZGF0ZVF1ZXJ5QnVpbGRlciIsICJVcGRhdGVRdWVyeU5vZGUiLCAidGFyZ2V0VGFibGUiLCAiTWVyZ2VRdWVyeUJ1aWxkZXIiLCAiTWVyZ2VRdWVyeU5vZGUiLCAicGFyc2VBbGlhc2VkVGFibGUiLCAibmFtZU9yQnVpbGRlciIsICJleHByZXNzaW9uIiwgImN0ZSIsICJwYXJzZUNvbW1vblRhYmxlRXhwcmVzc2lvbiIsICJXaXRoTm9kZSIsICJwbHVnaW4iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlUXVlcnlDcmVhdG9yIiwgIlF1ZXJ5Q3JlYXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImpvaW5UeXBlIiwgInRhYmxlIiwgIkpvaW5CdWlsZGVyIiwgIkpvaW5Ob2RlIiwgInBhcnNlVGFibGVFeHByZXNzaW9uIiwgImNyZWF0ZU92ZXJCdWlsZGVyIiwgIk92ZXJCdWlsZGVyIiwgIk92ZXJOb2RlIiwgInBhcnNlSm9pbiIsICJqb2luVHlwZSIsICJhcmdzIiwgInBhcnNlU2luZ2xlT25Kb2luIiwgInBhcnNlQ2FsbGJhY2tKb2luIiwgInBhcnNlT25sZXNzSm9pbiIsICJmcm9tIiwgImNhbGxiYWNrIiwgImNyZWF0ZUpvaW5CdWlsZGVyIiwgImxoc0NvbHVtbiIsICJyaHNDb2x1bW4iLCAiSm9pbk5vZGUiLCAicGFyc2VUYWJsZUV4cHJlc3Npb24iLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJPZmZzZXROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm9mZnNldCIsICJHcm91cEJ5SXRlbU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZ3JvdXBCeSIsICJwYXJzZUdyb3VwQnkiLCAiZ3JvdXBCeSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlUmVmZXJlbmNlRXhwcmVzc2lvbk9yTGlzdCIsICJHcm91cEJ5SXRlbU5vZGUiLCAiU2V0T3BlcmF0aW9uTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJvcGVyYXRvciIsICJleHByZXNzaW9uIiwgImFsbCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAib3BlcmF0b3IiLCAiZXhwcmVzc2lvbiIsICJhbGwiLCAiaXNGdW5jdGlvbiIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJpc1JlYWRvbmx5QXJyYXkiLCAiZXhwciIsICJTZXRPcGVyYXRpb25Ob2RlIiwgInBhcnNlRXhwcmVzc2lvbiIsICJFeHByZXNzaW9uV3JhcHBlciIsICJfRXhwcmVzc2lvbldyYXBwZXIiLCAiI25vZGUiLCAibm9kZSIsICJhbGlhcyIsICJBbGlhc2VkRXhwcmVzc2lvbldyYXBwZXIiLCAiYXJncyIsICJPcldyYXBwZXIiLCAiT3JOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiQW5kV3JhcHBlciIsICJBbmROb2RlIiwgIiNleHByIiwgIiNhbGlhcyIsICJleHByIiwgIkFsaWFzTm9kZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiSWRlbnRpZmllck5vZGUiLCAiX09yV3JhcHBlciIsICJQYXJlbnNOb2RlIiwgIl9BbmRXcmFwcGVyIiwgIkZldGNoTm9kZSIsICJub2RlIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgIlZhbHVlTm9kZSIsICJwYXJzZUZldGNoIiwgInJvd0NvdW50IiwgIm1vZGlmaWVyIiwgImlzTnVtYmVyIiwgImlzQmlnSW50IiwgImlzRmV0Y2hNb2RpZmllciIsICJGZXRjaE5vZGUiLCAidmFsdWUiLCAiU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICJfU2VsZWN0UXVlcnlCdWlsZGVySW1wbCIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAibGhzIiwgIm9wIiwgInJocyIsICJwYXJzZVJlZmVyZW50aWFsQmluYXJ5T3BlcmF0aW9uIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJzZWxlY3Rpb24iLCAicGFyc2VTZWxlY3RBcmciLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgIm1vZGlmaWVyIiwgIlNlbGVjdE1vZGlmaWVyTm9kZSIsICJvZiIsICJhc0FycmF5IiwgInBhcnNlVGFibGUiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiI2pvaW4iLCAiam9pblR5cGUiLCAicGFyc2VKb2luIiwgInBhcnNlT3JkZXJCeSIsICJncm91cEJ5IiwgInBhcnNlR3JvdXBCeSIsICJsaW1pdCIsICJMaW1pdE5vZGUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAib2Zmc2V0IiwgIk9mZnNldE5vZGUiLCAicm93Q291bnQiLCAicGFyc2VGZXRjaCIsICJleHByZXNzaW9uIiwgIm1vZGlmaWVycyIsICJwYXJzZVRvcCIsICJwYXJzZVNldE9wZXJhdGlvbnMiLCAiYWxpYXMiLCAiQWxpYXNlZFNlbGVjdFF1ZXJ5QnVpbGRlckltcGwiLCAiZnVuYyIsICJjb25kaXRpb24iLCAiRXhwcmVzc2lvbldyYXBwZXIiLCAicGx1Z2luIiwgImNvbXBpbGVkUXVlcnkiLCAicmVzdWx0IiwgImVycm9yQ29uc3RydWN0b3IiLCAiTm9SZXN1bHRFcnJvciIsICJpc05vUmVzdWx0RXJyb3JDb25zdHJ1Y3RvciIsICJjaHVua1NpemUiLCAic3RyZWFtIiwgIml0ZW0iLCAiZm9ybWF0IiwgIm9wdGlvbnMiLCAiY3JlYXRlU2VsZWN0UXVlcnlCdWlsZGVyIiwgIiNxdWVyeUJ1aWxkZXIiLCAiI2FsaWFzIiwgInF1ZXJ5QnVpbGRlciIsICJBbGlhc05vZGUiLCAiSWRlbnRpZmllck5vZGUiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImFnZ3JlZ2F0ZUZ1bmN0aW9uIiwgImFnZ3JlZ2F0ZWQiLCAiYWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgIm9yZGVySXRlbXMiLCAid2l0aGluR3JvdXAiLCAicHJvcCIsICJPcmRlckJ5Tm9kZSIsICJmaWx0ZXIiLCAiV2hlcmVOb2RlIiwgIm92ZXIiLCAiRnVuY3Rpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImZ1bmMiLCAiYXJncyIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiX0FnZ3JlZ2F0ZUZ1bmN0aW9uQnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgImFsaWFzIiwgIkFsaWFzZWRBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImFyZ3MiLCAiUXVlcnlOb2RlIiwgInBhcnNlT3JkZXJCeSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgImxocyIsICJvcCIsICJyaHMiLCAicGFyc2VSZWZlcmVudGlhbEJpbmFyeU9wZXJhdGlvbiIsICJvdmVyIiwgImJ1aWxkZXIiLCAiY3JlYXRlT3ZlckJ1aWxkZXIiLCAiZnVuYyIsICIjYWdncmVnYXRlRnVuY3Rpb25CdWlsZGVyIiwgIiNhbGlhcyIsICJhZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWxpYXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgImZuIiwgIm5hbWUiLCAiYXJncyIsICJFeHByZXNzaW9uV3JhcHBlciIsICJGdW5jdGlvbk5vZGUiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uT3JMaXN0IiwgImFnZyIsICJBZ2dyZWdhdGVGdW5jdGlvbkJ1aWxkZXIiLCAiQWdncmVnYXRlRnVuY3Rpb25Ob2RlIiwgImNvbHVtbiIsICJ2YWx1ZXMiLCAidGFibGUiLCAicGFyc2VTZWxlY3RBbGwiLCAiaXNTdHJpbmciLCAicGFyc2VUYWJsZSIsICJVbmFyeU9wZXJhdGlvbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib3BlcmF0b3IiLCAib3BlcmFuZCIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgIm9wZXJhdG9yIiwgIm9wZXJhbmQiLCAiVW5hcnlPcGVyYXRpb25Ob2RlIiwgIk9wZXJhdG9yTm9kZSIsICJwYXJzZVJlZmVyZW5jZUV4cHJlc3Npb24iLCAiQ2FzZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAidmFsdWUiLCAiY2FzZU5vZGUiLCAid2hlbiIsICJ0aGVuIiwgIldoZW5Ob2RlIiwgInByb3BzIiwgIkNhc2VCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYXJncyIsICJDYXNlVGhlbkJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiV2hlbk5vZGUiLCAicGFyc2VWYWx1ZUJpbmFyeU9wZXJhdGlvbk9yRXhwcmVzc2lvbiIsICJ2YWx1ZUV4cHJlc3Npb24iLCAiQ2FzZVdoZW5CdWlsZGVyIiwgImlzU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlU2FmZUltbWVkaWF0ZVZhbHVlIiwgInBhcnNlVmFsdWVFeHByZXNzaW9uIiwgIkNhc2VFbmRCdWlsZGVyIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgIkpTT05QYXRoTGVnTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ0eXBlIiwgInZhbHVlIiwgIkpTT05QYXRoQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImluZGV4IiwgIiNjcmVhdGVCdWlsZGVyV2l0aFBhdGhMZWciLCAia2V5IiwgImxlZ1R5cGUiLCAidmFsdWUiLCAiSlNPTlJlZmVyZW5jZU5vZGUiLCAiVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgIkpTT05QYXRoTm9kZSIsICJKU09OUGF0aExlZ05vZGUiLCAiSlNPTk9wZXJhdG9yQ2hhaW5Ob2RlIiwgIlZhbHVlTm9kZSIsICJfVHJhdmVyc2VkSlNPTlBhdGhCdWlsZGVyIiwgImFsaWFzIiwgIkFsaWFzZWRKU09OUGF0aEJ1aWxkZXIiLCAiI2pzb25QYXRoIiwgIiNhbGlhcyIsICJqc29uUGF0aCIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgIlR1cGxlTm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJ2YWx1ZXMiLCAiU0lNUExFX0NPTFVNTl9EQVRBX1RZUEVTIiwgIkNPTFVNTl9EQVRBX1RZUEVfUkVHRVgiLCAiRGF0YVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImRhdGFUeXBlIiwgImlzQ29sdW1uRGF0YVR5cGUiLCAiciIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJpc09wZXJhdGlvbk5vZGVTb3VyY2UiLCAiaXNDb2x1bW5EYXRhVHlwZSIsICJEYXRhVHlwZU5vZGUiLCAiQ2FzdE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJkYXRhVHlwZSIsICJjcmVhdGVFeHByZXNzaW9uQnVpbGRlciIsICJleGVjdXRvciIsICJOT09QX1FVRVJZX0VYRUNVVE9SIiwgImJpbmFyeSIsICJsaHMiLCAib3AiLCAicmhzIiwgIkV4cHJlc3Npb25XcmFwcGVyIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb24iLCAidW5hcnkiLCAiZXhwciIsICJwYXJzZVVuYXJ5T3BlcmF0aW9uIiwgImViIiwgInRhYmxlIiwgImNyZWF0ZVNlbGVjdFF1ZXJ5QnVpbGRlciIsICJjcmVhdGVRdWVyeUlkIiwgIlNlbGVjdFF1ZXJ5Tm9kZSIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbk9yTGlzdCIsICJyZWZlcmVuY2UiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VSZWZlcmVuY2VFeHByZXNzaW9uIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIkpTT05QYXRoQnVpbGRlciIsICJwYXJzZUpTT05SZWZlcmVuY2UiLCAiSlNPTlBhdGhOb2RlIiwgInBhcnNlVGFibGUiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWVzIiwgIlR1cGxlTm9kZSIsICJwYXJzZVNhZmVJbW1lZGlhdGVWYWx1ZSIsICJzdGFydCIsICJlbmQiLCAiQmluYXJ5T3BlcmF0aW9uTm9kZSIsICJPcGVyYXRvck5vZGUiLCAiQW5kTm9kZSIsICJleHBycyIsICJpc1JlYWRvbmx5QXJyYXkiLCAicGFyc2VGaWx0ZXJMaXN0IiwgInBhcnNlRmlsdGVyT2JqZWN0IiwgImFyZ3MiLCAibm9kZSIsICJwYXJzZVZhbHVlQmluYXJ5T3BlcmF0aW9uT3JFeHByZXNzaW9uIiwgIlBhcmVuc05vZGUiLCAiZGF0YVR5cGUiLCAiQ2FzdE5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAic2NoZW1hIiwgIldpdGhTY2hlbWFQbHVnaW4iLCAiY3JlYXRlRnVuY3Rpb25Nb2R1bGUiLCAiZXhwcmVzc2lvbkJ1aWxkZXIiLCAiXyIsICJwYXJzZUV4cHJlc3Npb24iLCAiZXhwIiwgImlzT3BlcmF0aW9uTm9kZVNvdXJjZSIsICJpc0Z1bmN0aW9uIiwgImV4cHJlc3Npb25CdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiaXNFeHByZXNzaW9uT3JGYWN0b3J5IiwgIm9iaiIsICJpc0V4cHJlc3Npb24iLCAiaXNBbGlhc2VkRXhwcmVzc2lvbiIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgIiN0YWJsZSIsICJ0YWJsZSIsICJhbGlhcyIsICJBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICIjYWxpYXMiLCAiQWxpYXNOb2RlIiwgInBhcnNlVGFibGUiLCAiSWRlbnRpZmllck5vZGUiLCAiaXNBbGlhc2VkRHluYW1pY1RhYmxlQnVpbGRlciIsICJvYmoiLCAiaXNPYmplY3QiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgImlzU3RyaW5nIiwgInBhcnNlVGFibGVFeHByZXNzaW9uT3JMaXN0IiwgInRhYmxlIiwgImlzUmVhZG9ubHlBcnJheSIsICJpdCIsICJwYXJzZVRhYmxlRXhwcmVzc2lvbiIsICJpc1N0cmluZyIsICJwYXJzZUFsaWFzZWRUYWJsZSIsICJpc0FsaWFzZWREeW5hbWljVGFibGVCdWlsZGVyIiwgInBhcnNlQWxpYXNlZEV4cHJlc3Npb24iLCAiZnJvbSIsICJBTElBU19TRVBBUkFUT1IiLCAiYWxpYXMiLCAidHJpbSIsICJBbGlhc05vZGUiLCAicGFyc2VUYWJsZSIsICJJZGVudGlmaWVyTm9kZSIsICJTQ0hFTUFfU0VQQVJBVE9SIiwgInNjaGVtYSIsICJUYWJsZU5vZGUiLCAic3RyIiwgIkFkZENvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJkYXRhVHlwZSIsICJDb2x1bW5Ob2RlIiwgIm1vZGlmaWVyIiwgInByb3BzIiwgIkRyb3BDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIlJlbmFtZUNvbHVtbk5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29sdW1uIiwgIm5ld0NvbHVtbiIsICJDb2x1bW5Ob2RlIiwgIkNoZWNrQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZXhwcmVzc2lvbiIsICJjb25zdHJhaW50TmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIlJlZmVyZW5jZXNOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInRhYmxlIiwgImNvbHVtbnMiLCAicmVmZXJlbmNlcyIsICJvbkRlbGV0ZSIsICJvblVwZGF0ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAidmFsdWUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIlZhbHVlTm9kZSIsICJHZW5lcmF0ZWROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgInBhcmFtcyIsICJleHByZXNzaW9uIiwgIkRlZmF1bHRWYWx1ZU5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiZGVmYXVsdFZhbHVlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgImFjdGlvbiIsICJPTl9NT0RJRllfRk9SRUlHTl9BQ1RJT05TIiwgIkNvbHVtbkRlZmluaXRpb25CdWlsZGVyIiwgIl9Db2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgIkNvbHVtbkRlZmluaXRpb25Ob2RlIiwgInJlZiIsICJyZWZlcmVuY2VzIiwgInBhcnNlU3RyaW5nUmVmZXJlbmNlIiwgIlNlbGVjdEFsbE5vZGUiLCAiUmVmZXJlbmNlc05vZGUiLCAib25EZWxldGUiLCAicGFyc2VPbk1vZGlmeUZvcmVpZ25BY3Rpb24iLCAib25VcGRhdGUiLCAidmFsdWUiLCAiRGVmYXVsdFZhbHVlTm9kZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZXhwcmVzc2lvbiIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgIkdlbmVyYXRlZE5vZGUiLCAibW9kaWZpZXIiLCAiZnVuYyIsICJNb2RpZnlDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAic291cmNlQ29sdW1ucyIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIlJlZmVyZW5jZXNOb2RlIiwgIklkZW50aWZpZXJOb2RlIiwgInByb3BzIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJfRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAib25EZWxldGUiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgInBhcnNlT25Nb2RpZnlGb3JlaWduQWN0aW9uIiwgIm9uVXBkYXRlIiwgImZ1bmMiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludCIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJjb2x1bW5zIiwgImNvbnN0cmFpbnROYW1lIiwgIm51bGxzTm90RGlzdGluY3QiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiSWRlbnRpZmllck5vZGUiLCAiZHJvcENvbnN0cmFpbnQiLCAicHJvcHMiLCAiQWx0ZXJDb2x1bW5Ob2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbiIsICJwcm9wIiwgInZhbHVlIiwgIkNvbHVtbk5vZGUiLCAiQWx0ZXJDb2x1bW5CdWlsZGVyIiwgIiNjb2x1bW4iLCAiY29sdW1uIiwgImRhdGFUeXBlIiwgIkFsdGVyZWRDb2x1bW5CdWlsZGVyIiwgIkFsdGVyQ29sdW1uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJ2YWx1ZSIsICJwYXJzZURlZmF1bHRWYWx1ZUV4cHJlc3Npb24iLCAiZnVuYyIsICIjYWx0ZXJDb2x1bW5Ob2RlIiwgImFsdGVyQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlRXhlY3V0b3IiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAib25EZWxldGUiLCAib25VcGRhdGUiLCAiZnVuYyIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRDb25zdHJhaW50Tm9kZSIsICJBbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIl9BbHRlclRhYmxlRHJvcENvbnN0cmFpbnRCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQWx0ZXJUYWJsZU5vZGUiLCAiRHJvcENvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgImNvbHVtbnMiLCAiY29uc3RyYWludE5hbWUiLCAiQ29sdW1uTm9kZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJBZGRJbmRleE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJJZGVudGlmaWVyTm9kZSIsICJwcm9wcyIsICJjb2x1bW5zIiwgIkFsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiX0FsdGVyVGFibGVBZGRJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJBbHRlclRhYmxlTm9kZSIsICJBZGRJbmRleE5vZGUiLCAiY29sdW1uIiwgInBhcnNlT3JkZXJlZENvbHVtbk5hbWUiLCAiY29sdW1ucyIsICJleHByZXNzaW9uIiwgImluZGV4VHlwZSIsICJSYXdOb2RlIiwgImZ1bmMiLCAiVW5pcXVlQ29uc3RyYWludE5vZGVCdWlsZGVyIiwgIl9VbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiI25vZGUiLCAibm9kZSIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJmdW5jIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJfUHJpbWFyeUtleUNvbnN0cmFpbnRCdWlsZGVyIiwgIiNub2RlIiwgIm5vZGUiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgImZ1bmMiLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICIjbm9kZSIsICJub2RlIiwgImZ1bmMiLCAiUmVuYW1lQ29uc3RyYWludE5vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIklkZW50aWZpZXJOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAibmV3VGFibGVOYW1lIiwgIkFsdGVyVGFibGVFeGVjdXRvciIsICJBbHRlclRhYmxlTm9kZSIsICJwYXJzZVRhYmxlIiwgIm5ld1NjaGVtYSIsICJJZGVudGlmaWVyTm9kZSIsICJjb2x1bW4iLCAiYWx0ZXJhdGlvbiIsICJidWlsZGVyIiwgIkFsdGVyQ29sdW1uQnVpbGRlciIsICJBbHRlclRhYmxlQ29sdW1uQWx0ZXJpbmdCdWlsZGVyIiwgIkRyb3BDb2x1bW5Ob2RlIiwgIm5ld0NvbHVtbiIsICJSZW5hbWVDb2x1bW5Ob2RlIiwgImNvbHVtbk5hbWUiLCAiZGF0YVR5cGUiLCAiYnVpbGQiLCAibm9vcCIsICJDb2x1bW5EZWZpbml0aW9uQnVpbGRlciIsICJDb2x1bW5EZWZpbml0aW9uTm9kZSIsICJwYXJzZURhdGFUeXBlRXhwcmVzc2lvbiIsICJBZGRDb2x1bW5Ob2RlIiwgIk1vZGlmeUNvbHVtbk5vZGUiLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJ1bmlxdWVDb25zdHJhaW50QnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZUJ1aWxkZXIiLCAiVW5pcXVlQ29uc3RyYWludE5vZGUiLCAiQWRkQ29uc3RyYWludE5vZGUiLCAiY2hlY2tFeHByZXNzaW9uIiwgImNvbnN0cmFpbnRCdWlsZGVyIiwgIkNoZWNrQ29uc3RyYWludEJ1aWxkZXIiLCAiQ2hlY2tDb25zdHJhaW50Tm9kZSIsICJ0YXJnZXRUYWJsZSIsICJ0YXJnZXRDb2x1bW5zIiwgIkZvcmVpZ25LZXlDb25zdHJhaW50QnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludE5vZGUiLCAiQ29sdW1uTm9kZSIsICJBbHRlclRhYmxlQWRkRm9yZWlnbktleUNvbnN0cmFpbnRCdWlsZGVyIiwgIlByaW1hcnlLZXlDb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludE5vZGUiLCAiQWx0ZXJUYWJsZURyb3BDb25zdHJhaW50QnVpbGRlciIsICJEcm9wQ29uc3RyYWludE5vZGUiLCAib2xkTmFtZSIsICJuZXdOYW1lIiwgIlJlbmFtZUNvbnN0cmFpbnROb2RlIiwgImluZGV4TmFtZSIsICJBbHRlclRhYmxlQWRkSW5kZXhCdWlsZGVyIiwgIkFkZEluZGV4Tm9kZSIsICJEcm9wSW5kZXhOb2RlIiwgImZ1bmMiLCAiX0FsdGVyVGFibGVDb2x1bW5BbHRlcmluZ0J1aWxkZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiX0NyZWF0ZUluZGV4QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZUluZGV4Tm9kZSIsICJ0YWJsZSIsICJwYXJzZVRhYmxlIiwgImNvbHVtbiIsICJwYXJzZU9yZGVyZWRDb2x1bW5OYW1lIiwgImNvbHVtbnMiLCAiZXhwcmVzc2lvbiIsICJpbmRleFR5cGUiLCAiUmF3Tm9kZSIsICJhcmdzIiwgInRyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiUXVlcnlOb2RlIiwgInBhcnNlVmFsdWVCaW5hcnlPcGVyYXRpb25PckV4cHJlc3Npb24iLCAiZnVuYyIsICJDcmVhdGVTY2hlbWFCdWlsZGVyIiwgIl9DcmVhdGVTY2hlbWFCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlU2NoZW1hTm9kZSIsICJmdW5jIiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiYWN0aW9uIiwgIk9OX0NPTU1JVF9BQ1RJT05TIiwgIkNyZWF0ZVRhYmxlQnVpbGRlciIsICJfQ3JlYXRlVGFibGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiQ3JlYXRlVGFibGVOb2RlIiwgIm9uQ29tbWl0IiwgInBhcnNlT25Db21taXRBY3Rpb24iLCAiY29sdW1uTmFtZSIsICJkYXRhVHlwZSIsICJidWlsZCIsICJub29wIiwgImNvbHVtbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbkJ1aWxkZXIiLCAiQ29sdW1uRGVmaW5pdGlvbk5vZGUiLCAicGFyc2VEYXRhVHlwZUV4cHJlc3Npb24iLCAiY29uc3RyYWludE5hbWUiLCAiY29sdW1ucyIsICJjb25zdHJhaW50QnVpbGRlciIsICJQcmltYXJ5S2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiUHJpbWFyeUtleUNvbnN0cmFpbnROb2RlIiwgInVuaXF1ZUNvbnN0cmFpbnRCdWlsZGVyIiwgIlVuaXF1ZUNvbnN0cmFpbnROb2RlQnVpbGRlciIsICJVbmlxdWVDb25zdHJhaW50Tm9kZSIsICJjaGVja0V4cHJlc3Npb24iLCAiQ2hlY2tDb25zdHJhaW50QnVpbGRlciIsICJDaGVja0NvbnN0cmFpbnROb2RlIiwgInRhcmdldFRhYmxlIiwgInRhcmdldENvbHVtbnMiLCAiYnVpbGRlciIsICJGb3JlaWduS2V5Q29uc3RyYWludEJ1aWxkZXIiLCAiRm9yZWlnbktleUNvbnN0cmFpbnROb2RlIiwgIkNvbHVtbk5vZGUiLCAicGFyc2VUYWJsZSIsICJtb2RpZmllciIsICJleHByZXNzaW9uIiwgInBhcnNlRXhwcmVzc2lvbiIsICJmdW5jIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiX0Ryb3BJbmRleEJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJ0YWJsZSIsICJEcm9wSW5kZXhOb2RlIiwgInBhcnNlVGFibGUiLCAiZnVuYyIsICJEcm9wU2NoZW1hQnVpbGRlciIsICJfRHJvcFNjaGVtYUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wU2NoZW1hTm9kZSIsICJmdW5jIiwgIkRyb3BUYWJsZUJ1aWxkZXIiLCAiX0Ryb3BUYWJsZUJ1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJEcm9wVGFibGVOb2RlIiwgImZ1bmMiLCAiQ3JlYXRlVmlld05vZGUiLCAiZnJlZXplIiwgIm5vZGUiLCAibmFtZSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJjcmVhdGVWaWV3IiwgInBhcmFtcyIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICIjdHJhbnNmb3JtZXIiLCAiSW1tZWRpYXRlVmFsdWVUcmFuc2Zvcm1lciIsICJhcmdzIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIl9DcmVhdGVWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkNyZWF0ZVZpZXdOb2RlIiwgImNvbHVtbnMiLCAicGFyc2VDb2x1bW5OYW1lIiwgInF1ZXJ5IiwgInF1ZXJ5Tm9kZSIsICJJbW1lZGlhdGVWYWx1ZVBsdWdpbiIsICJmdW5jIiwgIkRyb3BWaWV3Tm9kZSIsICJmcmVlemUiLCAibm9kZSIsICJuYW1lIiwgIlNjaGVtYWJsZUlkZW50aWZpZXJOb2RlIiwgImRyb3BWaWV3IiwgInBhcmFtcyIsICJEcm9wVmlld0J1aWxkZXIiLCAiX0Ryb3BWaWV3QnVpbGRlciIsICIjcHJvcHMiLCAicHJvcHMiLCAiZnJlZXplIiwgIkRyb3BWaWV3Tm9kZSIsICJmdW5jIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiY3JlYXRlVHlwZSIsICJ2YWx1ZXMiLCAiVmFsdWVMaXN0Tm9kZSIsICJWYWx1ZU5vZGUiLCAiQ3JlYXRlVHlwZUJ1aWxkZXIiLCAiX0NyZWF0ZVR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAidmFsdWVzIiwgIkNyZWF0ZVR5cGVOb2RlIiwgImZ1bmMiLCAiRHJvcFR5cGVOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiZHJvcFR5cGUiLCAicGFyYW1zIiwgIkRyb3BUeXBlQnVpbGRlciIsICJfRHJvcFR5cGVCdWlsZGVyIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiRHJvcFR5cGVOb2RlIiwgImZ1bmMiLCAicGFyc2VTY2hlbWFibGVJZGVudGlmaWVyIiwgImlkIiwgIlNDSEVNQV9TRVBBUkFUT1IiLCAicGFydHMiLCAidHJpbSIsICJTY2hlbWFibGVJZGVudGlmaWVyTm9kZSIsICJzdHIiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdOb2RlIiwgImZyZWV6ZSIsICJub2RlIiwgIm5hbWUiLCAiU2NoZW1hYmxlSWRlbnRpZmllck5vZGUiLCAiY3JlYXRlVmlldyIsICJwYXJhbXMiLCAiUmVmcmVzaE1hdGVyaWFsaXplZFZpZXdCdWlsZGVyIiwgIl9SZWZyZXNoTWF0ZXJpYWxpemVkVmlld0J1aWxkZXIiLCAiI3Byb3BzIiwgInByb3BzIiwgImZyZWV6ZSIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiZnVuYyIsICJTY2hlbWFNb2R1bGUiLCAiX1NjaGVtYU1vZHVsZSIsICIjZXhlY3V0b3IiLCAiZXhlY3V0b3IiLCAidGFibGUiLCAiQ3JlYXRlVGFibGVCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiQ3JlYXRlVGFibGVOb2RlIiwgInBhcnNlVGFibGUiLCAiRHJvcFRhYmxlQnVpbGRlciIsICJEcm9wVGFibGVOb2RlIiwgImluZGV4TmFtZSIsICJDcmVhdGVJbmRleEJ1aWxkZXIiLCAiQ3JlYXRlSW5kZXhOb2RlIiwgIkRyb3BJbmRleEJ1aWxkZXIiLCAiRHJvcEluZGV4Tm9kZSIsICJzY2hlbWEiLCAiQ3JlYXRlU2NoZW1hQnVpbGRlciIsICJDcmVhdGVTY2hlbWFOb2RlIiwgIkRyb3BTY2hlbWFCdWlsZGVyIiwgIkRyb3BTY2hlbWFOb2RlIiwgIkFsdGVyVGFibGVCdWlsZGVyIiwgIkFsdGVyVGFibGVOb2RlIiwgInZpZXdOYW1lIiwgIkNyZWF0ZVZpZXdCdWlsZGVyIiwgIkNyZWF0ZVZpZXdOb2RlIiwgIlJlZnJlc2hNYXRlcmlhbGl6ZWRWaWV3QnVpbGRlciIsICJSZWZyZXNoTWF0ZXJpYWxpemVkVmlld05vZGUiLCAiRHJvcFZpZXdCdWlsZGVyIiwgIkRyb3BWaWV3Tm9kZSIsICJ0eXBlTmFtZSIsICJDcmVhdGVUeXBlQnVpbGRlciIsICJDcmVhdGVUeXBlTm9kZSIsICJwYXJzZVNjaGVtYWJsZUlkZW50aWZpZXIiLCAiRHJvcFR5cGVCdWlsZGVyIiwgIkRyb3BUeXBlTm9kZSIsICJwbHVnaW4iLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJEeW5hbWljTW9kdWxlIiwgInJlZmVyZW5jZSIsICJEeW5hbWljUmVmZXJlbmNlQnVpbGRlciIsICJ0YWJsZSIsICJEeW5hbWljVGFibGVCdWlsZGVyIiwgIkRlZmF1bHRDb25uZWN0aW9uUHJvdmlkZXIiLCAiI2RyaXZlciIsICJkcml2ZXIiLCAiY29uc3VtZXIiLCAiY29ubmVjdGlvbiIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJfRGVmYXVsdFF1ZXJ5RXhlY3V0b3IiLCAiUXVlcnlFeGVjdXRvckJhc2UiLCAiI2NvbXBpbGVyIiwgIiNhZGFwdGVyIiwgIiNjb25uZWN0aW9uUHJvdmlkZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAicGx1Z2lucyIsICJub2RlIiwgInF1ZXJ5SWQiLCAiY29uc3VtZXIiLCAicGx1Z2luIiwgInBlcmZvcm1hbmNlTm93IiwgImlzRnVuY3Rpb24iLCAiUnVudGltZURyaXZlciIsICIjZHJpdmVyIiwgIiNsb2ciLCAiI2luaXRQcm9taXNlIiwgIiNpbml0RG9uZSIsICIjZGVzdHJveVByb21pc2UiLCAiI2Nvbm5lY3Rpb25zIiwgImRyaXZlciIsICJsb2ciLCAiZXJyIiwgImNvbm5lY3Rpb24iLCAiI25lZWRzTG9nZ2luZyIsICIjYWRkTG9nZ2luZyIsICJzZXR0aW5ncyIsICJzYXZlcG9pbnROYW1lIiwgImNvbXBpbGVRdWVyeSIsICJleGVjdXRlUXVlcnkiLCAic3RyZWFtUXVlcnkiLCAiZGlzIiwgImNvbXBpbGVkUXVlcnkiLCAiY2F1Z2h0RXJyb3IiLCAic3RhcnRUaW1lIiwgInBlcmZvcm1hbmNlTm93IiwgImVycm9yIiwgIiNsb2dFcnJvciIsICIjbG9nUXVlcnkiLCAiY2h1bmtTaXplIiwgInJlc3VsdCIsICIjY2FsY3VsYXRlRHVyYXRpb25NaWxsaXMiLCAiaXNTdHJlYW0iLCAiaWdub3JlRXJyb3IiLCAiU2luZ2xlQ29ubmVjdGlvblByb3ZpZGVyIiwgIiNjb25uZWN0aW9uIiwgIiNydW5uaW5nUHJvbWlzZSIsICJjb25uZWN0aW9uIiwgImNvbnN1bWVyIiwgIiNydW4iLCAicnVubmVyIiwgIlRSQU5TQUNUSU9OX0FDQ0VTU19NT0RFUyIsICJUUkFOU0FDVElPTl9JU09MQVRJT05fTEVWRUxTIiwgInZhbGlkYXRlVHJhbnNhY3Rpb25TZXR0aW5ncyIsICJzZXR0aW5ncyIsICJMT0dfTEVWRUxTIiwgImZyZWV6ZSIsICJMb2ciLCAiI2xldmVscyIsICIjbG9nZ2VyIiwgImNvbmZpZyIsICJpc0Z1bmN0aW9uIiwgImRlZmF1bHRMb2dnZXIiLCAibGV2ZWwiLCAiZ2V0RXZlbnQiLCAiZXZlbnQiLCAicHJlZml4IiwgImlzQ29tcGlsYWJsZSIsICJ2YWx1ZSIsICJpc09iamVjdCIsICJpc0Z1bmN0aW9uIiwgIkt5c2VseSIsICJfS3lzZWx5IiwgIlF1ZXJ5Q3JlYXRvciIsICIjcHJvcHMiLCAiYXJncyIsICJzdXBlclByb3BzIiwgInByb3BzIiwgImlzS3lzZWx5UHJvcHMiLCAiZGlhbGVjdCIsICJkcml2ZXIiLCAiY29tcGlsZXIiLCAiYWRhcHRlciIsICJsb2ciLCAiTG9nIiwgInJ1bnRpbWVEcml2ZXIiLCAiUnVudGltZURyaXZlciIsICJjb25uZWN0aW9uUHJvdmlkZXIiLCAiRGVmYXVsdENvbm5lY3Rpb25Qcm92aWRlciIsICJleGVjdXRvciIsICJEZWZhdWx0UXVlcnlFeGVjdXRvciIsICJmcmVlemUiLCAiU2NoZW1hTW9kdWxlIiwgIkR5bmFtaWNNb2R1bGUiLCAidmFsdWUiLCAiQ2FzZUJ1aWxkZXIiLCAiQ2FzZU5vZGUiLCAiaXNVbmRlZmluZWQiLCAicGFyc2VFeHByZXNzaW9uIiwgImNyZWF0ZUZ1bmN0aW9uTW9kdWxlIiwgIlRyYW5zYWN0aW9uQnVpbGRlciIsICJDb250cm9sbGVkVHJhbnNhY3Rpb25CdWlsZGVyIiwgIkNvbm5lY3Rpb25CdWlsZGVyIiwgInBsdWdpbiIsICJzY2hlbWEiLCAiV2l0aFNjaGVtYVBsdWdpbiIsICJxdWVyeSIsICJxdWVyeUlkIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiY29tcGlsZWRRdWVyeSIsICJpc0NvbXBpbGFibGUiLCAiVHJhbnNhY3Rpb24iLCAiX1RyYW5zYWN0aW9uIiwgIm9iaiIsICJpc09iamVjdCIsICJjYWxsYmFjayIsICJjb25uZWN0aW9uIiwgIlNpbmdsZUNvbm5lY3Rpb25Qcm92aWRlciIsICJkYiIsICJfVHJhbnNhY3Rpb25CdWlsZGVyIiwgImFjY2Vzc01vZGUiLCAiaXNvbGF0aW9uTGV2ZWwiLCAia3lzZWx5UHJvcHMiLCAic2V0dGluZ3MiLCAidmFsaWRhdGVUcmFuc2FjdGlvblNldHRpbmdzIiwgInRyYW5zYWN0aW9uIiwgInJlc3VsdCIsICJlcnJvciIsICJfQ29udHJvbGxlZFRyYW5zYWN0aW9uQnVpbGRlciIsICJwcm92aWRlQ29udHJvbGxlZENvbm5lY3Rpb24iLCAiQ29udHJvbGxlZFRyYW5zYWN0aW9uIiwgIl9Db250cm9sbGVkVHJhbnNhY3Rpb24iLCAiI2NvbXBpbGVRdWVyeSIsICIjc3RhdGUiLCAic3RhdGUiLCAiTm90Q29tbWl0dGVkT3JSb2xsZWRCYWNrQXNzZXJ0aW5nRXhlY3V0b3IiLCAidHJhbnNhY3Rpb25Qcm9wcyIsICJub2RlIiwgImFzc2VydE5vdENvbW1pdHRlZE9yUm9sbGVkQmFjayIsICJDb21tYW5kIiwgInNhdmVwb2ludE5hbWUiLCAiI2NiIiwgImNiIiwgIl9Ob3RDb21taXR0ZWRPclJvbGxlZEJhY2tBc3NlcnRpbmdFeGVjdXRvciIsICIjZXhlY3V0b3IiLCAiY29uc3VtZXIiLCAiY2h1bmtTaXplIiwgInBsdWdpbnMiLCAiUmF3QnVpbGRlckltcGwiLCAiX1Jhd0J1aWxkZXJJbXBsIiwgIiNwcm9wcyIsICJwcm9wcyIsICJmcmVlemUiLCAiYWxpYXMiLCAiQWxpYXNlZFJhd0J1aWxkZXJJbXBsIiwgInBsdWdpbiIsICIjdG9PcGVyYXRpb25Ob2RlIiwgIiNnZXRFeGVjdXRvciIsICJleGVjdXRvclByb3ZpZGVyIiwgIiNjb21waWxlIiwgImV4ZWN1dG9yIiwgIk5PT1BfUVVFUllfRVhFQ1VUT1IiLCAiY3JlYXRlUmF3QnVpbGRlciIsICIjcmF3QnVpbGRlciIsICIjYWxpYXMiLCAicmF3QnVpbGRlciIsICJBbGlhc05vZGUiLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIklkZW50aWZpZXJOb2RlIiwgInNxbCIsICJzcWxGcmFnbWVudHMiLCAicGFyYW1ldGVycyIsICJjcmVhdGVSYXdCdWlsZGVyIiwgImNyZWF0ZVF1ZXJ5SWQiLCAiUmF3Tm9kZSIsICJwYXJzZVBhcmFtZXRlciIsICJjb2x1bW5SZWZlcmVuY2UiLCAicGFyc2VTdHJpbmdSZWZlcmVuY2UiLCAidmFsdWUiLCAicGFyc2VWYWx1ZUV4cHJlc3Npb24iLCAidGFibGVSZWZlcmVuY2UiLCAicGFyc2VUYWJsZSIsICJpZHMiLCAiZnJhZ21lbnRzIiwgIklkZW50aWZpZXJOb2RlIiwgIlZhbHVlTm9kZSIsICJhcnJheSIsICJzZXBhcmF0b3IiLCAibm9kZXMiLCAic2VwIiwgImkiLCAicGFyYW0iLCAiaXNPcGVyYXRpb25Ob2RlU291cmNlIiwgIk9wZXJhdGlvbk5vZGVWaXNpdG9yIiwgIiN2aXNpdG9ycyIsICJmcmVlemUiLCAibm9kZSIsICJMSVRfV1JBUF9SRUdFWCIsICJEZWZhdWx0UXVlcnlDb21waWxlciIsICJPcGVyYXRpb25Ob2RlVmlzaXRvciIsICIjc3FsIiwgIiNwYXJhbWV0ZXJzIiwgIm5vZGUiLCAicXVlcnlJZCIsICJmcmVlemUiLCAid3JhcEluUGFyZW5zIiwgIlBhcmVuc05vZGUiLCAiSW5zZXJ0UXVlcnlOb2RlIiwgIkNyZWF0ZVRhYmxlTm9kZSIsICJDcmVhdGVWaWV3Tm9kZSIsICJTZXRPcGVyYXRpb25Ob2RlIiwgImV4cHJlc3Npb25zIiwgIm5vZGVzIiwgInNlcGFyYXRvciIsICJsYXN0SW5kZXgiLCAiaSIsICJyb290UXVlcnlOb2RlIiwgIlF1ZXJ5Tm9kZSIsICJpc1N1YlF1ZXJ5IiwgIk1lcmdlUXVlcnlOb2RlIiwgImxvZ09uY2UiLCAiXyIsICJpc1N0cmluZyIsICJ2YWx1ZXMiLCAiSk9JTl9UWVBFX1NRTCIsICJzcWxGcmFnbWVudHMiLCAicGFyYW1zIiwgImlzQm9vbGVhbiIsICJTRUxFQ1RfTU9ESUZJRVJfU1FMIiwgIk9wZXJhdG9yTm9kZSIsICJwYXRoTGVnIiwgImlzQXJyYXlMb2NhdGlvbiIsICJsZW4iLCAic3RyIiwgInBhcmFtZXRlciIsICJpZGVudGlmaWVyIiwgImxlZnRXcmFwIiwgInJpZ2h0V3JhcCIsICJzYW5pdGl6ZWQiLCAiYyIsICJ2YWx1ZSIsICJpc051bWJlciIsICJpc051bGwiLCAiaXNEYXRlIiwgImlzQmlnSW50IiwgImFyciIsICJsZWZ0IiwgInJpZ2h0IiwgIlNFTEVDVF9NT0RJRklFUl9QUklPUklUWSIsICJjb2x1bW5BbHRlcmF0aW9ucyIsICJEdW1teURyaXZlciIsICJEdW1teUNvbm5lY3Rpb24iLCAiRGlhbGVjdEFkYXB0ZXJCYXNlIiwgIklEX1dSQVBfUkVHRVgiLCAiUG9zdGdyZXNRdWVyeUNvbXBpbGVyIiwgIkRlZmF1bHRRdWVyeUNvbXBpbGVyIiwgImlkZW50aWZpZXIiLCAiTE9DS19JRCIsICJQb3N0Z3Jlc0FkYXB0ZXIiLCAiRGlhbGVjdEFkYXB0ZXJCYXNlIiwgImRiIiwgIl9vcHQiLCAic3FsIiwgIl9kYiIsICJnZXRCdWlsZGVyIiwgInJlcXVpcmVtZW50cyIsICJLeXNlbHkiLCAiRHVtbXlEcml2ZXIiLCAiSW1tZWRpYXRlVmFsdWVQbHVnaW4iLCAiI3RyYW5zZm9ybWVyIiwgIkltbWVkaWF0ZVZhbHVlVHJhbnNmb3JtZXIiLCAiYXJncyIsICJPcGVyYXRpb25Ob2RlVHJhbnNmb3JtZXIiLCAibm9kZSIsICJWYWx1ZUxpc3ROb2RlIiwgIlZhbHVlTm9kZSIsICJjb21waWxlIiwgImNvbXBpbGVhYmxlIiwgImNvbXBpbGVkUXVlcnkiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAicm93cyIsICJjb2x1bW5zIiwgInJvd0ZpbHRlcnMiLCAiaW5mZXJSb3dGaWx0ZXJzIiwgInFiIiwgImViIiwgInJvd0ZpbHRlciIsICJjb2x1bW5OYW1lIiwgInZhbHVlIiwgImluZmVyUm93RmlsdGVyIiwgInJvdyIsICJwayIsICJjb2x1bW4iLCAiaXNJblByaW1hcnlLZXkiLCAiZ2V0UG9zdGdyZVNRTEJ1aWxkZXIiLCAicmVxdWlyZW1lbnRzIiwgImdldEJ1aWxkZXIiLCAiUG9zdGdyZXNBZGFwdGVyIiwgIlBvc3RncmVzUXVlcnlDb21waWxlciIsICJnZXRJbnNlcnRRdWVyeSIsICJkZXRhaWxzIiwgInJlcXVpcmVtZW50cyIsICJ0YWJsZSIsICJyb3dzIiwgInRhYmxlTmFtZSIsICJzY2hlbWEiLCAiY29sdW1ucyIsICJidWlsZGVyIiwgImdldFBvc3RncmVTUUxCdWlsZGVyIiwgImNvbHMiLCAiZW1wdHlSb3dXb3JrYXJvdW5kIiwgInNxbCIsICJjb21waWxlIiwgInJvdyIsICJlYiIsICJnZXRTZWxlY3RRdWVyeSIsICJwYWdlSW5kZXgiLCAicGFnZVNpemUiLCAic29ydE9yZGVyIiwgImZpbHRlciIsICJjb3VudFF1ZXJ5IiwgInFiIiwgIml0ZW0iLCAiZ2V0U2VsZWN0RmlsdGVyRXhwcmVzc2lvbiIsICJidWlsZEJhc2VFeHByZXNzaW9uQnVpbGRlciIsICJzcGVjIiwgImZpbHRlcnMiLCAib3JHcm91cHNPZkFuZEJ1aWxkZXJzIiwgImN1cnJlbnRBbmRHcm91cEJ1aWxkZXJzIiwgImkiLCAiYW5kRXhwcmVzc2lvbnMiLCAiZ3JvdXAiLCAibW9ja1NlbGVjdFF1ZXJ5IiwgImdldFVwZGF0ZVF1ZXJ5IiwgImNoYW5nZXMiLCAiYXBwbHlJbmZlcnJlZFJvd0ZpbHRlcnMiLCAiZ2V0RGVsZXRlUXVlcnkiLCAianNvbkFycmF5RnJvbSIsICJleHByIiwgInNxbCIsICJSRUdVTEFSX1RBQkxFX0tJTkQiLCAiVklFV19UQUJMRV9LSU5EIiwgIlRBQkxFX0tJTkRTIiwgImdldFRhYmxlc1F1ZXJ5IiwgInJlcXVpcmVtZW50cyIsICJjb21waWxlIiwgImdldFBvc3RncmVTUUxCdWlsZGVyIiwgImV4Y2x1ZGVTeXN0ZW1UYWJsZXMiLCAiZWIiLCAianNvbkFycmF5RnJvbSIsICJqYiIsICJvbl9lYiIsICJzcWwiLCAibW9ja1RhYmxlc1F1ZXJ5IiwgImdldFRpbWV6b25lUXVlcnkiLCAiYnVpbGRlciIsICJtb2NrVGltZXpvbmVRdWVyeSIsICJxYiIsICJjcmVhdGVQb3N0Z3Jlc0FkYXB0ZXIiLCAicmVxdWlyZW1lbnRzIiwgImV4ZWN1dG9yIiwgIm90aGVyUmVxdWlyZW1lbnRzIiwgIm9wdGlvbnMiLCAidGFibGVzUXVlcnkiLCAiZ2V0VGFibGVzUXVlcnkiLCAidGltZXpvbmVRdWVyeSIsICJnZXRUaW1lem9uZVF1ZXJ5IiwgInRhYmxlc0Vycm9yIiwgInRhYmxlcyIsICJ0aW1lem9uZUVycm9yIiwgInRpbWV6b25lcyIsICJlcnJvciIsICJ0aW1lem9uZSIsICJpbnRyb3NwZWN0aW9uIiwgImNyZWF0ZUludHJvc3BlY3Rpb24iLCAiZGV0YWlscyIsICJxdWVyeSIsICJnZXRTZWxlY3RRdWVyeSIsICJyZXN1bHRzIiwgImdldEluc2VydFF1ZXJ5IiwgInJvd3MiLCAiZ2V0VXBkYXRlUXVlcnkiLCAicm93IiwgImdldERlbGV0ZVF1ZXJ5IiwgInJlc3VsdCIsICJzY2hlbWFzIiwgImNvbHVtbnMiLCAidGFibGVOYW1lIiwgInNjaGVtYSIsICJjb2x1bW5zUmVjb3JkIiwgImNvbHVtbiIsICJkYXRhdHlwZSIsICJkYXRhdHlwZV9zY2hlbWEiLCAiY29sdW1uTmFtZSIsICJudWxsYWJsZSIsICJpc0FycmF5IiwgInN0cmlwcGVkRGF0YVR5cGUiLCAiUE9TVEdSRVNRTF9EQVRBX1RZUEVTX1RPX01FVEFEQVRBIiwgImZpbHRlck9wZXJhdG9ycyIsICJtb2NrSW50cm9zcGVjdCIsICJtb2NrVGFibGVzUXVlcnkiLCAibW9ja1RpbWV6b25lUXVlcnkiXQp9Cg==
|