@randsum/dice
Version:
A flexible, type-safe dice roller for tabletop RPGs, game development, and probability simulations
5 lines (3 loc) • 39.5 kB
JavaScript
import{RandsumError as K}from"@randsum/core";function u(e,t=0){if(e.every((o)=>typeof o==="number"))return e.reduce((o,r)=>Number(o)+r,t);return e.flat().join(", ")}function c(e){return Math.random()*e|0}function f(e){return Array.from({length:Number(e)},(t,o)=>o+1)}function a(e,t,o){let r=o??f(t),i=new Array(e);for(let s=0;s<e;s++){let x=c(t),l=r[x];if(l)i[s]=l}return i}import{CapModifier as S,DropModifier as w,ExplodeModifier as q,MinusModifier as P,PlusModifier as v,ReplaceModifier as F,RerollModifier as T,UniqueModifier as E,coreNotationPattern as I,isDiceNotation as j,optionsConverter as D}from"@randsum/core";function R(e){return typeof e==="object"&&e!==null&&"type"in e&&"sides"in e&&"faces"in e&&"isCustom"in e&&"roll"in e&&"rollSpread"in e&&"rollModified"in e&&"toOptions"in e&&(e.type==="numeric"||e.type==="custom")}function y(e){let t=g(e);return{argument:e,options:t,die:U(e),notation:D.toNotation(t),description:D.toDescription(t)}}function g(e){if(R(e))return e.toOptions;if(j(e)){let o=(e.match(I)??"")[0],r=e.replace(o,""),[i,s=""]=o.split(/[Dd]/);if(s.includes("{"))return{quantity:Number(i),sides:[...s.replaceAll(/{|}/g,"")]};return{quantity:Number(i),sides:Number(s),...{modifiers:{...w.parse(r),...q.parse(r),...E.parse(r),...F.parse(r),...T.parse(r),...S.parse(r),...v.parse(r),...P.parse(r)}}}}if(Array.isArray(e))return{quantity:1,sides:e.map(String)};if(typeof e==="string"||typeof e==="number")return{quantity:1,sides:Number(e)};return e}function U(e){if(R(e))return e;let t=g(e);if(Array.isArray(t.sides))return n(t.sides);return n(t.sides)}import{isNumericRollOptions as V}from"@randsum/core";import{CapModifier as k,DropModifier as z,ExplodeModifier as B,ReplaceModifier as H,RerollModifier as _,UniqueModifier as G}from"@randsum/core";function b(e){return Array.isArray(e.options.sides)}function M(e){return!Array.isArray(e.options.sides)}function C(e){let t=L(e),o=J(e,t),r=u(t);if(t.every((i)=>typeof i==="number")&&o.rolls.every((i)=>typeof i==="number")&&typeof r==="number"&&M(e))return{parameters:e,rawResult:r,rawRolls:t,modifiedRolls:o,total:o.total,type:"numeric"};if(t.every((i)=>typeof i==="string")&&o.rolls.every((i)=>typeof i==="string")&&typeof r==="string"&&b(e))return{parameters:e,rawResult:r,rawRolls:t,modifiedRolls:o,total:u(o.rolls),type:"custom"};throw new Error("Mixed rolls are not supported yet")}function L({options:e}){let t=e.quantity??1;if(V(e))return a(t,e.sides);else return a(t,e.sides.length,e.sides)}function J(e,t){if(b(e)&&t.every((p)=>typeof p==="string"))return{total:u(t),rolls:t};if(!t.every((p)=>typeof p==="number"))throw new Error("Mixed rolls are not supported yet");let{sides:o,quantity:r=1,modifiers:i={}}=e.options;if(Object.keys(i).length===0)return{total:u(t),rolls:t.map((p)=>Number(p))};let s=()=>c(o),l={simpleMathModifier:0,rolls:t.map((p)=>Number(p))};if(i.reroll)l=m("reroll",i,l,{sides:o,quantity:r,rollOne:s});if(i.replace)l=m("replace",i,l,{sides:o,quantity:r,rollOne:s});if(i.cap)l=m("cap",i,l,{sides:o,quantity:r,rollOne:s});if(i.explode)l=m("explode",i,l,{sides:o,quantity:r,rollOne:s});if(i.unique)l=m("unique",i,l,{sides:o,quantity:r,rollOne:s});if(i.drop)l=m("drop",i,l,{sides:o,quantity:r,rollOne:s});if(i.plus)l=m("plus",i,l,{sides:o,quantity:r,rollOne:s});if(i.minus)l=m("minus",i,l,{sides:o,quantity:r,rollOne:s});return{rolls:l.rolls,total:u(l.rolls,l.simpleMathModifier)}}function m(e,t,o,r){let i=t[e];if(i===void 0)return o;switch(e){case"plus":return{...o,simpleMathModifier:Number(i)};case"minus":return{...o,simpleMathModifier:-Number(i)};case"reroll":return new _(t.reroll).apply(o,void 0,r.rollOne);case"unique":return new G(t.unique).apply(o,{sides:r.sides,quantity:r.quantity},r.rollOne);case"replace":return new H(t.replace).apply(o);case"cap":return new k(t.cap).apply(o);case"drop":return new z(t.drop).apply(o);case"explode":return new B(t.explode).apply(o,{sides:r.sides,quantity:r.quantity},r.rollOne);default:throw new Error(`Unknown modifier: ${String(e)}`)}}function h(e){if(e.every((t)=>t.type==="numeric"))return"numeric";if(e.every((t)=>t.type==="custom"))return"custom";return"mixed"}function d(...e){let o=e.map((r)=>y(r)).map((r)=>C(r));return{rolls:o,rawResults:o.map((r)=>r.rawRolls).flat(),total:u(o.map((r)=>r.total)),type:h(o)}}class N{sides;constructor(e){this.sides=e}}class A extends N{type="numeric";faces;isCustom=!1;constructor(e){super(e);this.faces=f(e)}roll(e=1){return this.rollSpread(e).reduce((o,r)=>o+r,0)}rollSpread(e=1){return a(e,this.sides,this.faces)}rollModified(e=1,t={}){let o={...this.toOptions,quantity:e,modifiers:t};return d(o)}get toOptions(){return{quantity:1,sides:this.sides}}}class O extends N{type="custom";faces;isCustom=!0;constructor(e){if(!e.length)throw new K("Custom die must have at least one face","INVALID_DIE_CONFIG",{input:e,expected:"Array with at least one face value"},['Provide at least one face value: ["H", "T"] for a coin',"Use standard dice like D6 if you need numbered faces","Custom faces must be non-empty strings"]);super(e.length);this.faces=[...e]}roll(e=1){return this.rollSpread(e).join(", ")}rollSpread(e=1){return a(e,this.sides,this.faces)}rollModified(e=1,t={}){return d({...this.toOptions,quantity:e,modifiers:t})}get toOptions(){return{quantity:1,sides:[...this.faces]}}}function n(e){if(typeof e==="number")return new A(e);else return new O(e)}var Ie=n(4),je=n(6),Ue=n(8),Ve=n(10),ke=n(12),ze=n(20),Be=n(100),He=n(["Heads","Tails"]),_e=n(["+","+","+","-"," "," "]),Q=["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"],Ge=n(Q);function W(e){return e.type==="numeric"}function X(e){return e.type==="custom"}function Y(e){return e.type==="mixed"}export*from"@randsum/core";export*from"@randsum/notation";export{d as roll,W as isNumericResult,Y as isMixedResult,R as isD,X as isCustomResult,_e as fudgeDice,He as coin,Ge as alphaNumDie,Ue as D8,je as D6,Ie as D4,ze as D20,ke as D12,Be as D100,Ve as D10,n as D};
//# debugId=B9ED1DC2AAF1BAA264756E2164756E21
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0QudHMiLCAiLi4vc3JjL3V0aWxzL2NhbGN1bGF0ZVRvdGFsLnRzIiwgIi4uL3NyYy91dGlscy9jb3JlUmFuZG9tLnRzIiwgIi4uL3NyYy91dGlscy9nZW5lcmF0ZU51bWVyaWNGYWNlcy50cyIsICIuLi9zcmMvdXRpbHMvY29yZVNwcmVhZFJvbGxzLnRzIiwgIi4uL3NyYy91dGlscy9ub3JtYWxpemVBcmd1bWVudC50cyIsICIuLi9zcmMvZ3VhcmRzL2lzRC50cyIsICIuLi9zcmMvdXRpbHMvZ2VuZXJhdGVSb2xsLnRzIiwgIi4uL3NyYy9ndWFyZHMvaXNDdXN0b21Sb2xsUGFyYW1zLnRzIiwgIi4uL3NyYy9ndWFyZHMvaXNOdW1lcmljUm9sbFBhcmFtcy50cyIsICIuLi9zcmMvdXRpbHMvcm9sbFR5cGUudHMiLCAiLi4vc3JjL3JvbGwudHMiLCAiLi4vc3JjL2d1YXJkcy9pc1JvbGxSZXN1bHQudHMiLCAiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tUm9sbE9wdGlvbnMsXG4gIE1vZGlmaWVyT3B0aW9ucyxcbiAgTnVtZXJpY1JvbGxPcHRpb25zXG59IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgeyBSYW5kc3VtRXJyb3IgfSBmcm9tICdAcmFuZHN1bS9jb3JlJ1xuaW1wb3J0IHsgcm9sbCB9IGZyb20gJy4vcm9sbCdcbmltcG9ydCB0eXBlIHtcbiAgQmFzZUQsXG4gIEN1c3RvbURpZSxcbiAgQ3VzdG9tUm9sbFJlc3VsdCxcbiAgTnVtZXJpY0RpZSxcbiAgTnVtZXJpY1JvbGxSZXN1bHRcbn0gZnJvbSAnLi90eXBlcydcbmltcG9ydCB7IGNvcmVTcHJlYWRSb2xscyB9IGZyb20gJy4vdXRpbHMvY29yZVNwcmVhZFJvbGxzJ1xuaW1wb3J0IHsgZ2VuZXJhdGVOdW1lcmljRmFjZXMgfSBmcm9tICcuL3V0aWxzL2dlbmVyYXRlTnVtZXJpY0ZhY2VzJ1xuXG5hYnN0cmFjdCBjbGFzcyBEaWVCYXNlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpZGVzOiBudW1iZXJcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHR5cGU6ICdudW1lcmljJyB8ICdjdXN0b20nXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBmYWNlczogbnVtYmVyW10gfCBzdHJpbmdbXVxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNDdXN0b206IGJvb2xlYW5cblxuICBjb25zdHJ1Y3RvcihzaWRlczogbnVtYmVyKSB7XG4gICAgdGhpcy5zaWRlcyA9IHNpZGVzXG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3Qgcm9sbChxdWFudGl0eT86IG51bWJlcik6IG51bWJlciB8IHN0cmluZ1xuICBwdWJsaWMgYWJzdHJhY3Qgcm9sbFNwcmVhZChxdWFudGl0eT86IG51bWJlcik6IG51bWJlcltdIHwgc3RyaW5nW11cbiAgcHVibGljIGFic3RyYWN0IHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eTogbnVtYmVyLFxuICAgIG1vZGlmaWVycz86IE1vZGlmaWVyT3B0aW9uc1xuICApOiBOdW1lcmljUm9sbFJlc3VsdCB8IEN1c3RvbVJvbGxSZXN1bHRcbiAgcHVibGljIGFic3RyYWN0IGdldCB0b09wdGlvbnMoKTogTnVtZXJpY1JvbGxPcHRpb25zIHwgQ3VzdG9tUm9sbE9wdGlvbnNcbn1cblxuY2xhc3MgTnVtZXJpY0RpZUltcGwgZXh0ZW5kcyBEaWVCYXNlIGltcGxlbWVudHMgTnVtZXJpY0RpZSB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlID0gJ251bWVyaWMnIGFzIGNvbnN0XG4gIHB1YmxpYyByZWFkb25seSBmYWNlczogbnVtYmVyW11cbiAgcHVibGljIHJlYWRvbmx5IGlzQ3VzdG9tID0gZmFsc2UgYXMgY29uc3RcblxuICBjb25zdHJ1Y3RvcihzaWRlczogbnVtYmVyKSB7XG4gICAgc3VwZXIoc2lkZXMpXG4gICAgdGhpcy5mYWNlcyA9IGdlbmVyYXRlTnVtZXJpY0ZhY2VzKHNpZGVzKVxuICB9XG5cbiAgcHVibGljIHJvbGwocXVhbnRpdHkgPSAxKTogbnVtYmVyIHtcbiAgICBjb25zdCByb2xscyA9IHRoaXMucm9sbFNwcmVhZChxdWFudGl0eSlcbiAgICByZXR1cm4gcm9sbHMucmVkdWNlKChhY2MsIHJvbGwpID0+IGFjYyArIHJvbGwsIDApXG4gIH1cblxuICBwdWJsaWMgcm9sbFNwcmVhZChxdWFudGl0eSA9IDEpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xsczxudW1iZXI+KHF1YW50aXR5LCB0aGlzLnNpZGVzLCB0aGlzLmZhY2VzKVxuICB9XG5cbiAgcHVibGljIHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMgPSB7fVxuICApOiBOdW1lcmljUm9sbFJlc3VsdCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy50b09wdGlvbnMsIHF1YW50aXR5LCBtb2RpZmllcnMgfVxuICAgIHJldHVybiByb2xsKG9wdGlvbnMpXG4gIH1cblxuICBwdWJsaWMgZ2V0IHRvT3B0aW9ucygpOiBOdW1lcmljUm9sbE9wdGlvbnMge1xuICAgIHJldHVybiB7XG4gICAgICBxdWFudGl0eTogMSxcbiAgICAgIHNpZGVzOiB0aGlzLnNpZGVzXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEN1c3RvbURpZUltcGwgZXh0ZW5kcyBEaWVCYXNlIGltcGxlbWVudHMgQ3VzdG9tRGllIHtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnY3VzdG9tJyBhcyBjb25zdFxuICBwdWJsaWMgcmVhZG9ubHkgZmFjZXM6IHN0cmluZ1tdXG4gIHB1YmxpYyByZWFkb25seSBpc0N1c3RvbSA9IHRydWUgYXMgY29uc3RcblxuICBjb25zdHJ1Y3RvcihmYWNlczogc3RyaW5nW10pIHtcbiAgICBpZiAoIWZhY2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmRzdW1FcnJvcihcbiAgICAgICAgJ0N1c3RvbSBkaWUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBmYWNlJyxcbiAgICAgICAgJ0lOVkFMSURfRElFX0NPTkZJRycsXG4gICAgICAgIHtcbiAgICAgICAgICBpbnB1dDogZmFjZXMsXG4gICAgICAgICAgZXhwZWN0ZWQ6ICdBcnJheSB3aXRoIGF0IGxlYXN0IG9uZSBmYWNlIHZhbHVlJ1xuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgJ1Byb3ZpZGUgYXQgbGVhc3Qgb25lIGZhY2UgdmFsdWU6IFtcIkhcIiwgXCJUXCJdIGZvciBhIGNvaW4nLFxuICAgICAgICAgICdVc2Ugc3RhbmRhcmQgZGljZSBsaWtlIEQ2IGlmIHlvdSBuZWVkIG51bWJlcmVkIGZhY2VzJyxcbiAgICAgICAgICAnQ3VzdG9tIGZhY2VzIG11c3QgYmUgbm9uLWVtcHR5IHN0cmluZ3MnXG4gICAgICAgIF1cbiAgICAgIClcbiAgICB9XG4gICAgc3VwZXIoZmFjZXMubGVuZ3RoKVxuICAgIHRoaXMuZmFjZXMgPSBbLi4uZmFjZXNdXG4gIH1cblxuICBwdWJsaWMgcm9sbChxdWFudGl0eSA9IDEpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJvbGxzID0gdGhpcy5yb2xsU3ByZWFkKHF1YW50aXR5KVxuICAgIHJldHVybiByb2xscy5qb2luKCcsICcpXG4gIH1cblxuICBwdWJsaWMgcm9sbFNwcmVhZChxdWFudGl0eSA9IDEpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xsczxzdHJpbmc+KHF1YW50aXR5LCB0aGlzLnNpZGVzLCB0aGlzLmZhY2VzKVxuICB9XG5cbiAgcHVibGljIHJvbGxNb2RpZmllZChcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMgPSB7fVxuICApOiBDdXN0b21Sb2xsUmVzdWx0IHtcbiAgICByZXR1cm4gcm9sbCh7XG4gICAgICAuLi50aGlzLnRvT3B0aW9ucyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgbW9kaWZpZXJzXG4gICAgfSBhcyBDdXN0b21Sb2xsT3B0aW9ucylcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9PcHRpb25zKCk6IEN1c3RvbVJvbGxPcHRpb25zIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVhbnRpdHk6IDEsXG4gICAgICBzaWRlczogWy4uLnRoaXMuZmFjZXNdXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEQoc2lkZXM6IG51bWJlcik6IE51bWVyaWNEaWVcblxuZnVuY3Rpb24gRChmYWNlczogc3RyaW5nW10pOiBDdXN0b21EaWVcblxuZnVuY3Rpb24gRChhcmc6IG51bWJlciB8IHN0cmluZ1tdKTogQmFzZUQge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV3IE51bWVyaWNEaWVJbXBsKGFyZylcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEN1c3RvbURpZUltcGwoYXJnKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBENDogTnVtZXJpY0RpZSA9IEQoNClcblxuZXhwb3J0IGNvbnN0IEQ2OiBOdW1lcmljRGllID0gRCg2KVxuXG5leHBvcnQgY29uc3QgRDg6IE51bWVyaWNEaWUgPSBEKDgpXG5cbmV4cG9ydCBjb25zdCBEMTA6IE51bWVyaWNEaWUgPSBEKDEwKVxuXG5leHBvcnQgY29uc3QgRDEyOiBOdW1lcmljRGllID0gRCgxMilcblxuZXhwb3J0IGNvbnN0IEQyMDogTnVtZXJpY0RpZSA9IEQoMjApXG5cbmV4cG9ydCBjb25zdCBEMTAwOiBOdW1lcmljRGllID0gRCgxMDApXG5cbmV4cG9ydCBjb25zdCBjb2luOiBDdXN0b21EaWUgPSBEKFsnSGVhZHMnLCAnVGFpbHMnXSlcblxuZXhwb3J0IGNvbnN0IGZ1ZGdlRGljZTogQ3VzdG9tRGllID0gRChbJysnLCAnKycsICcrJywgJy0nLCAnICcsICcgJ10pXG5cbmNvbnN0IGFscGhhbnVtRmFjZXMgPSBbXG4gICdBJyxcbiAgJ0InLFxuICAnQycsXG4gICdEJyxcbiAgJ0UnLFxuICAnRicsXG4gICdHJyxcbiAgJ0gnLFxuICAnSScsXG4gICdKJyxcbiAgJ0snLFxuICAnTCcsXG4gICdNJyxcbiAgJ04nLFxuICAnTycsXG4gICdQJyxcbiAgJ1EnLFxuICAnUicsXG4gICdTJyxcbiAgJ1QnLFxuICAnVScsXG4gICdWJyxcbiAgJ1cnLFxuICAnWCcsXG4gICdZJyxcbiAgJ1onLFxuICAnYScsXG4gICdiJyxcbiAgJ2MnLFxuICAnZCcsXG4gICdlJyxcbiAgJ2YnLFxuICAnZycsXG4gICdoJyxcbiAgJ2knLFxuICAnaicsXG4gICdrJyxcbiAgJ2wnLFxuICAnbScsXG4gICduJyxcbiAgJ28nLFxuICAncCcsXG4gICdxJyxcbiAgJ3InLFxuICAncycsXG4gICd0JyxcbiAgJ3UnLFxuICAndicsXG4gICd3JyxcbiAgJ3gnLFxuICAneScsXG4gICd6JyxcbiAgJzAnLFxuICAnMScsXG4gICcyJyxcbiAgJzMnLFxuICAnNCcsXG4gICc1JyxcbiAgJzYnLFxuICAnNycsXG4gICc4JyxcbiAgJzknXG5dXG5cbmV4cG9ydCBjb25zdCBhbHBoYU51bURpZTogQ3VzdG9tRGllID0gRChhbHBoYW51bUZhY2VzKVxuXG5leHBvcnQgeyBEIH1cbiIsCiAgICAiZnVuY3Rpb24gY2FsY3VsYXRlVG90YWwoXG4gIHJvbGxzOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBib251czogc3RyaW5nIHwgbnVtYmVyID0gMFxuKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgaWYgKHJvbGxzLmV2ZXJ5KChyb2xsKSA9PiB0eXBlb2Ygcm9sbCA9PT0gJ251bWJlcicpKSB7XG4gICAgcmV0dXJuIHJvbGxzLnJlZHVjZSgoYWNjLCBjdXIpID0+IE51bWJlcihhY2MpICsgY3VyLCBib251cylcbiAgfVxuXG4gIHJldHVybiByb2xscy5mbGF0KCkuam9pbignLCAnKVxufVxuXG5leHBvcnQgeyBjYWxjdWxhdGVUb3RhbCB9XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb3JlUmFuZG9tKG1heDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogbWF4KSB8IDBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlZWRlZFJhbmRvbShcbiAgc2VlZDogbnVtYmVyID0gRGF0ZS5ub3coKVxuKTogKG1heDogbnVtYmVyKSA9PiBudW1iZXIge1xuICBsZXQgY3VycmVudFNlZWQgPSBzZWVkXG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHNlZWRlZFJhbmRvbShtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY3VycmVudFNlZWQgXj0gY3VycmVudFNlZWQgPDwgMTNcbiAgICBjdXJyZW50U2VlZCBePSBjdXJyZW50U2VlZCA+PiAxN1xuICAgIGN1cnJlbnRTZWVkIF49IGN1cnJlbnRTZWVkIDw8IDVcblxuICAgIGNvbnN0IHJhbmRvbVZhbHVlID0gTWF0aC5hYnMoY3VycmVudFNlZWQpIC8gMjE0NzQ4MzY0N1xuICAgIHJldHVybiAocmFuZG9tVmFsdWUgKiBtYXgpIHwgMFxuICB9XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU51bWVyaWNGYWNlcyhzaWRlczogbnVtYmVyKTogbnVtYmVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogTnVtYmVyKHNpZGVzKSB9LCAoXywgaW5kZXgpID0+IGluZGV4ICsgMSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29yZVJhbmRvbSB9IGZyb20gJy4vY29yZVJhbmRvbSdcbmltcG9ydCB7IGdlbmVyYXRlTnVtZXJpY0ZhY2VzIH0gZnJvbSAnLi9nZW5lcmF0ZU51bWVyaWNGYWNlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTcHJlYWRSb2xsczxGIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyPihcbiAgcXVhbnRpdHk6IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4gIGZhY2VzPzogRltdXG4pOiBGW10ge1xuICBjb25zdCBmYWNlc0FyciA9IChmYWNlcyA/PyBnZW5lcmF0ZU51bWVyaWNGYWNlcyhtYXgpKSBhcyBGW11cblxuICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Rj4ocXVhbnRpdHkpXG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl0eTsgaSsrKSB7XG4gICAgY29uc3QgcmFuZG9tSW5kZXggPSBjb3JlUmFuZG9tKG1heClcbiAgICBjb25zdCBmYWNlID0gZmFjZXNBcnJbcmFuZG9tSW5kZXhdXG4gICAgaWYgKGZhY2UpIHtcbiAgICAgIHJlc3VsdFtpXSA9IGZhY2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iLAogICAgImltcG9ydCB7XG4gIENhcE1vZGlmaWVyLFxuICBEcm9wTW9kaWZpZXIsXG4gIEV4cGxvZGVNb2RpZmllcixcbiAgTWludXNNb2RpZmllcixcbiAgUGx1c01vZGlmaWVyLFxuICBSZXBsYWNlTW9kaWZpZXIsXG4gIFJlcm9sbE1vZGlmaWVyLFxuICBVbmlxdWVNb2RpZmllcixcbiAgY29yZU5vdGF0aW9uUGF0dGVybixcbiAgaXNEaWNlTm90YXRpb24sXG4gIG9wdGlvbnNDb252ZXJ0ZXJcbn0gZnJvbSAnQHJhbmRzdW0vY29yZSdcbmltcG9ydCB7IEQgfSBmcm9tICcuLi9EJ1xuaW1wb3J0IHsgaXNEIH0gZnJvbSAnLi4vZ3VhcmRzL2lzRCdcbmltcG9ydCB0eXBlIHsgUm9sbEFyZ3VtZW50LCBSb2xsUGFyYW1zIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBcmd1bWVudChhcmd1bWVudDogUm9sbEFyZ3VtZW50KTogUm9sbFBhcmFtcyB7XG4gIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zRnJvbUFyZ3VtZW50KGFyZ3VtZW50KVxuICByZXR1cm4ge1xuICAgIGFyZ3VtZW50LFxuICAgIG9wdGlvbnMsXG4gICAgZGllOiBkaWVGb3JBcmd1bWVudChhcmd1bWVudCksXG4gICAgbm90YXRpb246IG9wdGlvbnNDb252ZXJ0ZXIudG9Ob3RhdGlvbihvcHRpb25zKSxcbiAgICBkZXNjcmlwdGlvbjogb3B0aW9uc0NvbnZlcnRlci50b0Rlc2NyaXB0aW9uKG9wdGlvbnMpXG4gIH0gYXMgUm9sbFBhcmFtc1xufVxuXG5mdW5jdGlvbiBvcHRpb25zRnJvbUFyZ3VtZW50KGFyZ3VtZW50OiBSb2xsQXJndW1lbnQpOiBSb2xsUGFyYW1zWydvcHRpb25zJ10ge1xuICBpZiAoaXNEKGFyZ3VtZW50KSkge1xuICAgIHJldHVybiBhcmd1bWVudC50b09wdGlvbnNcbiAgfVxuXG4gIGlmIChpc0RpY2VOb3RhdGlvbihhcmd1bWVudCkpIHtcbiAgICBjb25zdCBjb3JlTm90YXRpb25NYXRjaCA9IGFyZ3VtZW50Lm1hdGNoKGNvcmVOb3RhdGlvblBhdHRlcm4pID8/ICcnXG5cbiAgICBjb25zdCBjb3JlTWF0Y2ggPSBjb3JlTm90YXRpb25NYXRjaFswXVxuICAgIGNvbnN0IG1vZGlmaWVyc1N0cmluZyA9IGFyZ3VtZW50LnJlcGxhY2UoY29yZU1hdGNoLCAnJylcbiAgICBjb25zdCBbcXVhbnRpdHksIHNpZGVzID0gJyddID0gY29yZU1hdGNoLnNwbGl0KC9bRGRdLylcblxuICAgIGlmIChzaWRlcy5pbmNsdWRlcygneycpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSxcbiAgICAgICAgc2lkZXM6IFsuLi5zaWRlcy5yZXBsYWNlQWxsKC97fH0vZywgJycpXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBxdWFudGl0eTogTnVtYmVyKHF1YW50aXR5KSxcbiAgICAgIHNpZGVzOiBOdW1iZXIoc2lkZXMpLFxuICAgICAgLi4ue1xuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAuLi5Ecm9wTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5FeHBsb2RlTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5VbmlxdWVNb2RpZmllci5wYXJzZShtb2RpZmllcnNTdHJpbmcpLFxuICAgICAgICAgIC4uLlJlcGxhY2VNb2RpZmllci5wYXJzZShtb2RpZmllcnNTdHJpbmcpLFxuICAgICAgICAgIC4uLlJlcm9sbE1vZGlmaWVyLnBhcnNlKG1vZGlmaWVyc1N0cmluZyksXG4gICAgICAgICAgLi4uQ2FwTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5QbHVzTW9kaWZpZXIucGFyc2UobW9kaWZpZXJzU3RyaW5nKSxcbiAgICAgICAgICAuLi5NaW51c01vZGlmaWVyLnBhcnNlKG1vZGlmaWVyc1N0cmluZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGFyZ3VtZW50KSkge1xuICAgIHJldHVybiB7IHF1YW50aXR5OiAxLCBzaWRlczogYXJndW1lbnQubWFwKFN0cmluZykgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGFyZ3VtZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHF1YW50aXR5OiAxLCBzaWRlczogTnVtYmVyKGFyZ3VtZW50KSB9XG4gIH1cbiAgcmV0dXJuIGFyZ3VtZW50XG59XG5cbmZ1bmN0aW9uIGRpZUZvckFyZ3VtZW50KGFyZ3VtZW50OiBSb2xsQXJndW1lbnQpOiBSb2xsUGFyYW1zWydkaWUnXSB7XG4gIGlmIChpc0QoYXJndW1lbnQpKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50XG4gIH1cbiAgY29uc3Qgb3B0aW9ucyA9IG9wdGlvbnNGcm9tQXJndW1lbnQoYXJndW1lbnQpXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuc2lkZXMpKSB7XG4gICAgcmV0dXJuIEQob3B0aW9ucy5zaWRlcylcbiAgfVxuICByZXR1cm4gRChvcHRpb25zLnNpZGVzKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEJhc2VEIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0QoYXJnOiB1bmtub3duKTogYXJnIGlzIEJhc2VEIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJlxuICAgIGFyZyAhPT0gbnVsbCAmJlxuICAgICd0eXBlJyBpbiBhcmcgJiZcbiAgICAnc2lkZXMnIGluIGFyZyAmJlxuICAgICdmYWNlcycgaW4gYXJnICYmXG4gICAgJ2lzQ3VzdG9tJyBpbiBhcmcgJiZcbiAgICAncm9sbCcgaW4gYXJnICYmXG4gICAgJ3JvbGxTcHJlYWQnIGluIGFyZyAmJlxuICAgICdyb2xsTW9kaWZpZWQnIGluIGFyZyAmJlxuICAgICd0b09wdGlvbnMnIGluIGFyZyAmJlxuICAgIChhcmcudHlwZSA9PT0gJ251bWVyaWMnIHx8IGFyZy50eXBlID09PSAnY3VzdG9tJylcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljRGllKGRpZTogQmFzZUQpOiBkaWUgaXMgaW1wb3J0KCcuLi90eXBlcycpLk51bWVyaWNEaWUge1xuICByZXR1cm4gZGllLnR5cGUgPT09ICdudW1lcmljJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21EaWUoZGllOiBCYXNlRCk6IGRpZSBpcyBpbXBvcnQoJy4uL3R5cGVzJykuQ3VzdG9tRGllIHtcbiAgcmV0dXJuIGRpZS50eXBlID09PSAnY3VzdG9tJ1xufVxuIiwKICAgICJpbXBvcnQgeyBpc051bWVyaWNSb2xsT3B0aW9ucyB9IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgdHlwZSB7XG4gIE51bWVyaWNSb2xsT3B0aW9ucyxcbiAgUm9sbFBhcmFtcyxcbiAgU2luZ2xlQ3VzdG9tUm9sbFJlc3VsdCxcbiAgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHQsXG4gIFNpbmdsZVJvbGxSZXN1bHRcbn0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQge1xuICBDYXBNb2RpZmllcixcbiAgRHJvcE1vZGlmaWVyLFxuICBFeHBsb2RlTW9kaWZpZXIsXG4gIHR5cGUgTW9kaWZpZXJPcHRpb25zLFxuICB0eXBlIE51bWVyaWNSb2xsQm9udXMsXG4gIFJlcGxhY2VNb2RpZmllcixcbiAgUmVyb2xsTW9kaWZpZXIsXG4gIFVuaXF1ZU1vZGlmaWVyXG59IGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5pbXBvcnQgeyBjb3JlU3ByZWFkUm9sbHMgfSBmcm9tICcuL2NvcmVTcHJlYWRSb2xscydcbmltcG9ydCB7IGlzQ3VzdG9tUm9sbFBhcmFtcyB9IGZyb20gJy4uL2d1YXJkcy9pc0N1c3RvbVJvbGxQYXJhbXMnXG5pbXBvcnQgeyBjYWxjdWxhdGVUb3RhbCB9IGZyb20gJy4vY2FsY3VsYXRlVG90YWwnXG5pbXBvcnQgeyBjb3JlUmFuZG9tIH0gZnJvbSAnLi9jb3JlUmFuZG9tJ1xuaW1wb3J0IHsgaXNOdW1lcmljUm9sbFBhcmFtcyB9IGZyb20gJy4uL2d1YXJkcy9pc051bWVyaWNSb2xsUGFyYW1zJ1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVJvbGwocGFyYW1ldGVyczogUm9sbFBhcmFtcyk6IFNpbmdsZVJvbGxSZXN1bHQge1xuICBjb25zdCByYXdSb2xscyA9IGdlbmVyYXRlUmF3Um9sbHMocGFyYW1ldGVycylcbiAgY29uc3QgbW9kaWZpZWRSb2xscyA9IGdlbmVyYXRlTW9kaWZpZWRSb2xscyhwYXJhbWV0ZXJzLCByYXdSb2xscylcbiAgY29uc3QgcmF3UmVzdWx0ID0gY2FsY3VsYXRlVG90YWwocmF3Um9sbHMpXG4gIGlmIChcbiAgICByYXdSb2xscy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09ICdudW1iZXInKSAmJlxuICAgIG1vZGlmaWVkUm9sbHMucm9sbHMuZXZlcnkoKG4pID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJykgJiZcbiAgICB0eXBlb2YgcmF3UmVzdWx0ID09PSAnbnVtYmVyJyAmJlxuICAgIGlzTnVtZXJpY1JvbGxQYXJhbXMocGFyYW1ldGVycylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICByYXdSZXN1bHQsXG4gICAgICByYXdSb2xscyxcbiAgICAgIG1vZGlmaWVkUm9sbHMsXG4gICAgICB0b3RhbDogbW9kaWZpZWRSb2xscy50b3RhbCxcbiAgICAgIHR5cGU6ICdudW1lcmljJ1xuICAgIH0gYXMgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHRcbiAgfVxuICBpZiAoXG4gICAgcmF3Um9sbHMuZXZlcnkoKG4pID0+IHR5cGVvZiBuID09PSAnc3RyaW5nJykgJiZcbiAgICBtb2RpZmllZFJvbGxzLnJvbGxzLmV2ZXJ5KChuKSA9PiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpICYmXG4gICAgdHlwZW9mIHJhd1Jlc3VsdCA9PT0gJ3N0cmluZycgJiZcbiAgICBpc0N1c3RvbVJvbGxQYXJhbXMocGFyYW1ldGVycylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICByYXdSZXN1bHQsXG4gICAgICByYXdSb2xscyxcbiAgICAgIG1vZGlmaWVkUm9sbHMsXG4gICAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwobW9kaWZpZWRSb2xscy5yb2xscyksXG4gICAgICB0eXBlOiAnY3VzdG9tJ1xuICAgIH0gYXMgU2luZ2xlQ3VzdG9tUm9sbFJlc3VsdFxuICB9XG4gIHRocm93IG5ldyBFcnJvcignTWl4ZWQgcm9sbHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Jylcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSYXdSb2xscyh7XG4gIG9wdGlvbnNcbn06IFJvbGxQYXJhbXMpOiBTaW5nbGVSb2xsUmVzdWx0WydyYXdSb2xscyddIHtcbiAgY29uc3QgcXVhbnRpdHkgPSBvcHRpb25zLnF1YW50aXR5ID8/IDFcblxuICBpZiAoaXNOdW1lcmljUm9sbE9wdGlvbnMob3B0aW9ucykpIHtcbiAgICByZXR1cm4gY29yZVNwcmVhZFJvbGxzPG51bWJlcj4ocXVhbnRpdHksIG9wdGlvbnMuc2lkZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvcmVTcHJlYWRSb2xscyhxdWFudGl0eSwgb3B0aW9ucy5zaWRlcy5sZW5ndGgsIG9wdGlvbnMuc2lkZXMpXG4gIH1cbn1cblxuZXhwb3J0IHsgZ2VuZXJhdGVSb2xsIH1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNb2RpZmllZFJvbGxzKFxuICBwYXJhbWV0ZXJzOiBSb2xsUGFyYW1zLFxuICByb2xsczogU2luZ2xlUm9sbFJlc3VsdFsncmF3Um9sbHMnXVxuKTogU2luZ2xlUm9sbFJlc3VsdFsnbW9kaWZpZWRSb2xscyddIHtcbiAgaWYgKFxuICAgIGlzQ3VzdG9tUm9sbFBhcmFtcyhwYXJhbWV0ZXJzKSAmJlxuICAgIHJvbGxzLmV2ZXJ5KChuKSA9PiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwocm9sbHMpLFxuICAgICAgcm9sbHNcbiAgICB9IGFzIFNpbmdsZUN1c3RvbVJvbGxSZXN1bHRbJ21vZGlmaWVkUm9sbHMnXVxuICB9XG5cbiAgaWYgKCFyb2xscy5ldmVyeSgobikgPT4gdHlwZW9mIG4gPT09ICdudW1iZXInKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTWl4ZWQgcm9sbHMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0JylcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBzaWRlcyxcbiAgICBxdWFudGl0eSA9IDEsXG4gICAgbW9kaWZpZXJzID0ge31cbiAgfSA9IHBhcmFtZXRlcnMub3B0aW9ucyBhcyBOdW1lcmljUm9sbE9wdGlvbnNcblxuICBpZiAoT2JqZWN0LmtleXMobW9kaWZpZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWw6IGNhbGN1bGF0ZVRvdGFsKHJvbGxzKSxcbiAgICAgIHJvbGxzOiByb2xscy5tYXAoKG4pID0+IE51bWJlcihuKSlcbiAgICB9IGFzIFNpbmdsZU51bWVyaWNSb2xsUmVzdWx0Wydtb2RpZmllZFJvbGxzJ11cbiAgfVxuXG4gIGNvbnN0IHJvbGxPbmUgPSAoKTogbnVtYmVyID0+IGNvcmVSYW5kb20oc2lkZXMpXG5cbiAgY29uc3QgaW5pdGlhbEJvbnVzZXM6IE51bWVyaWNSb2xsQm9udXMgPSB7XG4gICAgc2ltcGxlTWF0aE1vZGlmaWVyOiAwLFxuICAgIHJvbGxzOiByb2xscy5tYXAoKG4pID0+IE51bWJlcihuKSlcbiAgfVxuXG4gIGxldCBib251c2VzID0gaW5pdGlhbEJvbnVzZXNcblxuICBpZiAobW9kaWZpZXJzLnJlcm9sbCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdyZXJvbGwnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMucmVwbGFjZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdyZXBsYWNlJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLmNhcCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdjYXAnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMuZXhwbG9kZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdleHBsb2RlJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLnVuaXF1ZSkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCd1bmlxdWUnLCBtb2RpZmllcnMsIGJvbnVzZXMsIHtcbiAgICAgIHNpZGVzLFxuICAgICAgcXVhbnRpdHksXG4gICAgICByb2xsT25lXG4gICAgfSlcbiAgfVxuXG4gIGlmIChtb2RpZmllcnMuZHJvcCkge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdkcm9wJywgbW9kaWZpZXJzLCBib251c2VzLCB7XG4gICAgICBzaWRlcyxcbiAgICAgIHF1YW50aXR5LFxuICAgICAgcm9sbE9uZVxuICAgIH0pXG4gIH1cblxuICBpZiAobW9kaWZpZXJzLnBsdXMpIHtcbiAgICBib251c2VzID0gYXBwbHlNb2RpZmllcigncGx1cycsIG1vZGlmaWVycywgYm9udXNlcywge1xuICAgICAgc2lkZXMsXG4gICAgICBxdWFudGl0eSxcbiAgICAgIHJvbGxPbmVcbiAgICB9KVxuICB9XG5cbiAgaWYgKG1vZGlmaWVycy5taW51cykge1xuICAgIGJvbnVzZXMgPSBhcHBseU1vZGlmaWVyKCdtaW51cycsIG1vZGlmaWVycywgYm9udXNlcywge1xuICAgICAgc2lkZXMsXG4gICAgICBxdWFudGl0eSxcbiAgICAgIHJvbGxPbmVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByb2xsczogYm9udXNlcy5yb2xscyxcbiAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwoYm9udXNlcy5yb2xscywgYm9udXNlcy5zaW1wbGVNYXRoTW9kaWZpZXIpXG4gIH0gYXMgU2luZ2xlTnVtZXJpY1JvbGxSZXN1bHRbJ21vZGlmaWVkUm9sbHMnXVxufVxuXG5mdW5jdGlvbiBhcHBseU1vZGlmaWVyKFxuICBrZXk6IGtleW9mIE1vZGlmaWVyT3B0aW9ucyxcbiAgbW9kaWZpZXJzOiBNb2RpZmllck9wdGlvbnMsXG4gIGN1cnJlbnRCb251c2VzOiBOdW1lcmljUm9sbEJvbnVzLFxuICByb2xsUGFyYW1zOiB7IHNpZGVzOiBudW1iZXI7IHF1YW50aXR5OiBudW1iZXI7IHJvbGxPbmU6ICgpID0+IG51bWJlciB9XG4pOiBOdW1lcmljUm9sbEJvbnVzIHtcbiAgY29uc3QgbW9kaWZpZXJWYWx1ZSA9IG1vZGlmaWVyc1trZXldXG4gIGlmIChtb2RpZmllclZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY3VycmVudEJvbnVzZXNcbiAgfVxuXG4gIHN3aXRjaCAoa2V5KSB7XG4gICAgY2FzZSAncGx1cyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jdXJyZW50Qm9udXNlcyxcbiAgICAgICAgc2ltcGxlTWF0aE1vZGlmaWVyOiBOdW1iZXIobW9kaWZpZXJWYWx1ZSlcbiAgICAgIH1cblxuICAgIGNhc2UgJ21pbnVzJzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmN1cnJlbnRCb251c2VzLFxuICAgICAgICBzaW1wbGVNYXRoTW9kaWZpZXI6IC1OdW1iZXIobW9kaWZpZXJWYWx1ZSlcbiAgICAgIH1cblxuICAgIGNhc2UgJ3Jlcm9sbCc6XG4gICAgICByZXR1cm4gbmV3IFJlcm9sbE1vZGlmaWVyKG1vZGlmaWVycy5yZXJvbGwpLmFwcGx5KFxuICAgICAgICBjdXJyZW50Qm9udXNlcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByb2xsUGFyYW1zLnJvbGxPbmVcbiAgICAgIClcblxuICAgIGNhc2UgJ3VuaXF1ZSc6XG4gICAgICByZXR1cm4gbmV3IFVuaXF1ZU1vZGlmaWVyKG1vZGlmaWVycy51bmlxdWUpLmFwcGx5KFxuICAgICAgICBjdXJyZW50Qm9udXNlcyxcbiAgICAgICAgeyBzaWRlczogcm9sbFBhcmFtcy5zaWRlcywgcXVhbnRpdHk6IHJvbGxQYXJhbXMucXVhbnRpdHkgfSxcbiAgICAgICAgcm9sbFBhcmFtcy5yb2xsT25lXG4gICAgICApXG5cbiAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgIHJldHVybiBuZXcgUmVwbGFjZU1vZGlmaWVyKG1vZGlmaWVycy5yZXBsYWNlKS5hcHBseShjdXJyZW50Qm9udXNlcylcblxuICAgIGNhc2UgJ2NhcCc6XG4gICAgICByZXR1cm4gbmV3IENhcE1vZGlmaWVyKG1vZGlmaWVycy5jYXApLmFwcGx5KGN1cnJlbnRCb251c2VzKVxuXG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICByZXR1cm4gbmV3IERyb3BNb2RpZmllcihtb2RpZmllcnMuZHJvcCkuYXBwbHkoY3VycmVudEJvbnVzZXMpXG5cbiAgICBjYXNlICdleHBsb2RlJzpcbiAgICAgIHJldHVybiBuZXcgRXhwbG9kZU1vZGlmaWVyKG1vZGlmaWVycy5leHBsb2RlKS5hcHBseShcbiAgICAgICAgY3VycmVudEJvbnVzZXMsXG4gICAgICAgIHsgc2lkZXM6IHJvbGxQYXJhbXMuc2lkZXMsIHF1YW50aXR5OiByb2xsUGFyYW1zLnF1YW50aXR5IH0sXG4gICAgICAgIHJvbGxQYXJhbXMucm9sbE9uZVxuICAgICAgKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcoa2V5KX1gKVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ3VzdG9tUm9sbFBhcmFtcywgUm9sbFBhcmFtcyB9IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDdXN0b21Sb2xsUGFyYW1zKFxuICBwb29sUGFyYW1ldGVyczogUm9sbFBhcmFtc1xuKTogcG9vbFBhcmFtZXRlcnMgaXMgQ3VzdG9tUm9sbFBhcmFtcyB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHBvb2xQYXJhbWV0ZXJzLm9wdGlvbnMuc2lkZXMpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTnVtZXJpY1JvbGxQYXJhbXMsIFJvbGxQYXJhbXMgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtZXJpY1JvbGxQYXJhbXMoXG4gIHBvb2xQYXJhbWV0ZXJzOiBSb2xsUGFyYW1zXG4pOiBwb29sUGFyYW1ldGVycyBpcyBOdW1lcmljUm9sbFBhcmFtcyB7XG4gIHJldHVybiAhQXJyYXkuaXNBcnJheShwb29sUGFyYW1ldGVycy5vcHRpb25zLnNpZGVzKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFJvbGxSZXN1bHQsIFNpbmdsZVJvbGxSZXN1bHQgfSBmcm9tICcuLi90eXBlcydcblxuZXhwb3J0IGZ1bmN0aW9uIHJvbGxUeXBlKHJvbGxzOiBTaW5nbGVSb2xsUmVzdWx0W10pOiBSb2xsUmVzdWx0Wyd0eXBlJ10ge1xuICBpZiAocm9sbHMuZXZlcnkoKHJvbGwpID0+IHJvbGwudHlwZSA9PT0gJ251bWVyaWMnKSkge1xuICAgIHJldHVybiAnbnVtZXJpYydcbiAgfVxuXG4gIGlmIChyb2xscy5ldmVyeSgocm9sbCkgPT4gcm9sbC50eXBlID09PSAnY3VzdG9tJykpIHtcbiAgICByZXR1cm4gJ2N1c3RvbSdcbiAgfVxuXG4gIHJldHVybiAnbWl4ZWQnXG59XG4iLAogICAgImltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tUm9sbEFyZ3VtZW50LFxuICBDdXN0b21Sb2xsUmVzdWx0LFxuICBOdW1lcmljUm9sbEFyZ3VtZW50LFxuICBOdW1lcmljUm9sbFJlc3VsdCxcbiAgUm9sbEFyZ3VtZW50LFxuICBSb2xsUmVzdWx0XG59IGZyb20gJy4vdHlwZXMnXG5pbXBvcnQgeyBjYWxjdWxhdGVUb3RhbCwgbm9ybWFsaXplQXJndW1lbnQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgZ2VuZXJhdGVSb2xsIH0gZnJvbSAnLi91dGlscy9nZW5lcmF0ZVJvbGwnXG5pbXBvcnQgeyByb2xsVHlwZSB9IGZyb20gJy4vdXRpbHMvcm9sbFR5cGUnXG5cbmZ1bmN0aW9uIHJvbGwoLi4uYXJnczogTnVtZXJpY1JvbGxBcmd1bWVudFtdKTogTnVtZXJpY1JvbGxSZXN1bHRcbmZ1bmN0aW9uIHJvbGwoLi4uYXJnczogQ3VzdG9tUm9sbEFyZ3VtZW50W10pOiBDdXN0b21Sb2xsUmVzdWx0XG5mdW5jdGlvbiByb2xsKC4uLmFyZ3M6IChOdW1lcmljUm9sbEFyZ3VtZW50IHwgQ3VzdG9tUm9sbEFyZ3VtZW50KVtdKTogUm9sbFJlc3VsdFxuZnVuY3Rpb24gcm9sbCguLi5hcmdzOiBSb2xsQXJndW1lbnRbXSk6IFJvbGxSZXN1bHQge1xuICBjb25zdCBwYXJhbWV0ZXJzID0gYXJncy5tYXAoKGFyZykgPT4gbm9ybWFsaXplQXJndW1lbnQoYXJnKSlcbiAgY29uc3Qgcm9sbHMgPSBwYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IGdlbmVyYXRlUm9sbChwYXJhbSkpXG5cbiAgcmV0dXJuIHtcbiAgICByb2xscyxcbiAgICByYXdSZXN1bHRzOiByb2xscy5tYXAoKHJvbGwpID0+IHJvbGwucmF3Um9sbHMpLmZsYXQoKSxcbiAgICB0b3RhbDogY2FsY3VsYXRlVG90YWwocm9sbHMubWFwKChyb2xsKSA9PiByb2xsLnRvdGFsKSksXG4gICAgdHlwZTogcm9sbFR5cGUocm9sbHMpXG4gIH0gYXMgUm9sbFJlc3VsdFxufVxuXG5leHBvcnQgeyByb2xsIH1cbiIsCiAgICAiaW1wb3J0IHR5cGUge1xuICBDdXN0b21Sb2xsUmVzdWx0LFxuICBNaXhlZFJvbGxSZXN1bHQsXG4gIE51bWVyaWNSb2xsUmVzdWx0LFxuICBSb2xsUmVzdWx0XG59IGZyb20gJy4uL3R5cGVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljUmVzdWx0KFxuICByZXN1bHQ6IFJvbGxSZXN1bHRcbik6IHJlc3VsdCBpcyBOdW1lcmljUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ251bWVyaWMnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0N1c3RvbVJlc3VsdChyZXN1bHQ6IFJvbGxSZXN1bHQpOiByZXN1bHQgaXMgQ3VzdG9tUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ2N1c3RvbSdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWl4ZWRSZXN1bHQocmVzdWx0OiBSb2xsUmVzdWx0KTogcmVzdWx0IGlzIE1peGVkUm9sbFJlc3VsdCB7XG4gIHJldHVybiByZXN1bHQudHlwZSA9PT0gJ21peGVkJ1xufVxuIiwKICAgICJleHBvcnQgKiBmcm9tICcuL0QnXG5cbmV4cG9ydCB7IHJvbGwgfSBmcm9tICcuL3JvbGwnXG5cbmV4cG9ydCAqIGZyb20gJy4vZ3VhcmRzJ1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCAqIGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5cbmV4cG9ydCAqIGZyb20gJ0ByYW5kc3VtL25vdGF0aW9uJ1xuXG5leHBvcnQgdHlwZSAqIGZyb20gJ0ByYW5kc3VtL2NvcmUnXG5cbmV4cG9ydCB0eXBlICogZnJvbSAnQHJhbmRzdW0vbm90YXRpb24nXG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFLQSx1QkFBUyxzQkNMVCxTQUFTLENBQWMsQ0FDckIsRUFDQSxFQUF5QixFQUNSLENBQ2pCLEdBQUksRUFBTSxNQUFNLENBQUMsSUFBUyxPQUFPLElBQVMsUUFBUSxFQUNoRCxPQUFPLEVBQU0sT0FBTyxDQUFDLEVBQUssSUFBUSxPQUFPLENBQUcsRUFBSSxFQUFLLENBQUssRUFHNUQsT0FBTyxFQUFNLEtBQUssRUFBRSxLQUFLLElBQUksRUNSeEIsU0FBUyxDQUFVLENBQUMsRUFBcUIsQ0FDOUMsT0FBUSxLQUFLLE9BQU8sRUFBSSxFQUFPLEVDRDFCLFNBQVMsQ0FBb0IsQ0FBQyxFQUF5QixDQUM1RCxPQUFPLE1BQU0sS0FBSyxDQUFFLE9BQVEsT0FBTyxDQUFLLENBQUUsRUFBRyxDQUFDLEVBQUcsSUFBVSxFQUFRLENBQUMsRUNFL0QsU0FBUyxDQUEwQyxDQUN4RCxFQUNBLEVBQ0EsRUFDSyxDQUNMLElBQU0sRUFBWSxHQUFTLEVBQXFCLENBQUcsRUFFN0MsRUFBUyxJQUFJLE1BQVMsQ0FBUSxFQUVwQyxRQUFTLEVBQUksRUFBRyxFQUFJLEVBQVUsSUFBSyxDQUNqQyxJQUFNLEVBQWMsRUFBVyxDQUFHLEVBQzVCLEVBQU8sRUFBUyxHQUN0QixHQUFJLEVBQ0YsRUFBTyxHQUFLLEVBSWhCLE9BQU8sRUNwQlQsc0JBQ0Usa0JBQ0EscUJBQ0EsbUJBQ0Esa0JBQ0EscUJBQ0Esb0JBQ0Esb0JBQ0EseUJBQ0Esb0JBQ0Esc0JBQ0Esc0JDVEssU0FBUyxDQUFHLENBQUMsRUFBNEIsQ0FDOUMsT0FDRSxPQUFPLElBQVEsVUFDZixJQUFRLE1BQ1IsU0FBVSxHQUNWLFVBQVcsR0FDWCxVQUFXLEdBQ1gsYUFBYyxHQUNkLFNBQVUsR0FDVixlQUFnQixHQUNoQixpQkFBa0IsR0FDbEIsY0FBZSxJQUNkLEVBQUksT0FBUyxXQUFhLEVBQUksT0FBUyxVREdyQyxTQUFTLENBQWlCLENBQUMsRUFBb0MsQ0FDcEUsSUFBTSxFQUFVLEVBQW9CLENBQVEsRUFDNUMsTUFBTyxDQUNMLFdBQ0EsVUFDQSxJQUFLLEVBQWUsQ0FBUSxFQUM1QixTQUFVLEVBQWlCLFdBQVcsQ0FBTyxFQUM3QyxZQUFhLEVBQWlCLGNBQWMsQ0FBTyxDQUNyRCxFQUdGLFNBQVMsQ0FBbUIsQ0FBQyxFQUErQyxDQUMxRSxHQUFJLEVBQUksQ0FBUSxFQUNkLE9BQU8sRUFBUyxVQUdsQixHQUFJLEVBQWUsQ0FBUSxFQUFHLENBRzVCLElBQU0sR0FGb0IsRUFBUyxNQUFNLENBQW1CLEdBQUssSUFFN0IsR0FDOUIsRUFBa0IsRUFBUyxRQUFRLEVBQVcsRUFBRSxHQUMvQyxFQUFVLEVBQVEsSUFBTSxFQUFVLE1BQU0sTUFBTSxFQUVyRCxHQUFJLEVBQU0sU0FBUyxHQUFHLEVBQ3BCLE1BQU8sQ0FDTCxTQUFVLE9BQU8sQ0FBUSxFQUN6QixNQUFPLENBQUMsR0FBRyxFQUFNLFdBQVcsT0FBUSxFQUFFLENBQUMsQ0FDekMsRUFHRixNQUFPLENBQ0wsU0FBVSxPQUFPLENBQVEsRUFDekIsTUFBTyxPQUFPLENBQUssS0FDaEIsQ0FDRCxVQUFXLElBQ04sRUFBYSxNQUFNLENBQWUsS0FDbEMsRUFBZ0IsTUFBTSxDQUFlLEtBQ3JDLEVBQWUsTUFBTSxDQUFlLEtBQ3BDLEVBQWdCLE1BQU0sQ0FBZSxLQUNyQyxFQUFlLE1BQU0sQ0FBZSxLQUNwQyxFQUFZLE1BQU0sQ0FBZSxLQUNqQyxFQUFhLE1BQU0sQ0FBZSxLQUNsQyxFQUFjLE1BQU0sQ0FBZSxDQUN4QyxDQUNGLENBQ0YsRUFHRixHQUFJLE1BQU0sUUFBUSxDQUFRLEVBQ3hCLE1BQU8sQ0FBRSxTQUFVLEVBQUcsTUFBTyxFQUFTLElBQUksTUFBTSxDQUFFLEVBR3BELEdBQUksT0FBTyxJQUFhLFVBQVksT0FBTyxJQUFhLFNBQ3RELE1BQU8sQ0FBRSxTQUFVLEVBQUcsTUFBTyxPQUFPLENBQVEsQ0FBRSxFQUVoRCxPQUFPLEVBR1QsU0FBUyxDQUFjLENBQUMsRUFBMkMsQ0FDakUsR0FBSSxFQUFJLENBQVEsRUFDZCxPQUFPLEVBRVQsSUFBTSxFQUFVLEVBQW9CLENBQVEsRUFDNUMsR0FBSSxNQUFNLFFBQVEsRUFBUSxLQUFLLEVBQzdCLE9BQU8sRUFBRSxFQUFRLEtBQUssRUFFeEIsT0FBTyxFQUFFLEVBQVEsS0FBSyxFRW5GeEIsK0JBQVMsc0JBUVQsc0JBQ0Usa0JBQ0EscUJBQ0EscUJBR0Esb0JBQ0Esb0JBQ0Esc0JDZEssU0FBUyxDQUFrQixDQUNoQyxFQUNvQyxDQUNwQyxPQUFPLE1BQU0sUUFBUSxFQUFlLFFBQVEsS0FBSyxFQ0g1QyxTQUFTLENBQW1CLENBQ2pDLEVBQ3FDLENBQ3JDLE9BQVEsTUFBTSxRQUFRLEVBQWUsUUFBUSxLQUFLLEVGbUJwRCxTQUFTLENBQVksQ0FBQyxFQUEwQyxDQUM5RCxJQUFNLEVBQVcsRUFBaUIsQ0FBVSxFQUN0QyxFQUFnQixFQUFzQixFQUFZLENBQVEsRUFDMUQsRUFBWSxFQUFlLENBQVEsRUFDekMsR0FDRSxFQUFTLE1BQU0sQ0FBQyxJQUFNLE9BQU8sSUFBTSxRQUFRLEdBQzNDLEVBQWMsTUFBTSxNQUFNLENBQUMsSUFBTSxPQUFPLElBQU0sUUFBUSxHQUN0RCxPQUFPLElBQWMsVUFDckIsRUFBb0IsQ0FBVSxFQUU5QixNQUFPLENBQ0wsYUFDQSxZQUNBLFdBQ0EsZ0JBQ0EsTUFBTyxFQUFjLE1BQ3JCLEtBQU0sU0FDUixFQUVGLEdBQ0UsRUFBUyxNQUFNLENBQUMsSUFBTSxPQUFPLElBQU0sUUFBUSxHQUMzQyxFQUFjLE1BQU0sTUFBTSxDQUFDLElBQU0sT0FBTyxJQUFNLFFBQVEsR0FDdEQsT0FBTyxJQUFjLFVBQ3JCLEVBQW1CLENBQVUsRUFFN0IsTUFBTyxDQUNMLGFBQ0EsWUFDQSxXQUNBLGdCQUNBLE1BQU8sRUFBZSxFQUFjLEtBQUssRUFDekMsS0FBTSxRQUNSLEVBRUYsTUFBTSxJQUFJLE1BQU0sbUNBQW1DLEVBR3JELFNBQVMsQ0FBZ0IsRUFDdkIsV0FDMkMsQ0FDM0MsSUFBTSxFQUFXLEVBQVEsVUFBWSxFQUVyQyxHQUFJLEVBQXFCLENBQU8sRUFDOUIsT0FBTyxFQUF3QixFQUFVLEVBQVEsS0FBSyxFQUV0RCxZQUFPLEVBQWdCLEVBQVUsRUFBUSxNQUFNLE9BQVEsRUFBUSxLQUFLLEVBTXhFLFNBQVMsQ0FBcUIsQ0FDNUIsRUFDQSxFQUNtQyxDQUNuQyxHQUNFLEVBQW1CLENBQVUsR0FDN0IsRUFBTSxNQUFNLENBQUMsSUFBTSxPQUFPLElBQU0sUUFBUSxFQUV4QyxNQUFPLENBQ0wsTUFBTyxFQUFlLENBQUssRUFDM0IsT0FDRixFQUdGLElBQUssRUFBTSxNQUFNLENBQUMsSUFBTSxPQUFPLElBQU0sUUFBUSxFQUMzQyxNQUFNLElBQUksTUFBTSxtQ0FBbUMsRUFHckQsSUFDRSxRQUNBLFdBQVcsRUFDWCxZQUFZLENBQUMsR0FDWCxFQUFXLFFBRWYsR0FBSSxPQUFPLEtBQUssQ0FBUyxFQUFFLFNBQVcsRUFDcEMsTUFBTyxDQUNMLE1BQU8sRUFBZSxDQUFLLEVBQzNCLE1BQU8sRUFBTSxJQUFJLENBQUMsSUFBTSxPQUFPLENBQUMsQ0FBQyxDQUNuQyxFQUdGLElBQU0sRUFBVSxJQUFjLEVBQVcsQ0FBSyxFQU8xQyxFQUxxQyxDQUN2QyxtQkFBb0IsRUFDcEIsTUFBTyxFQUFNLElBQUksQ0FBQyxJQUFNLE9BQU8sQ0FBQyxDQUFDLENBQ25DLEVBSUEsR0FBSSxFQUFVLE9BQ1osRUFBVSxFQUFjLFNBQVUsRUFBVyxFQUFTLENBQ3BELFFBQ0EsV0FDQSxTQUNGLENBQUMsRUFHSCxHQUFJLEVBQVUsUUFDWixFQUFVLEVBQWMsVUFBVyxFQUFXLEVBQVMsQ0FDckQsUUFDQSxXQUNBLFNBQ0YsQ0FBQyxFQUdILEdBQUksRUFBVSxJQUNaLEVBQVUsRUFBYyxNQUFPLEVBQVcsRUFBUyxDQUNqRCxRQUNBLFdBQ0EsU0FDRixDQUFDLEVBR0gsR0FBSSxFQUFVLFFBQ1osRUFBVSxFQUFjLFVBQVcsRUFBVyxFQUFTLENBQ3JELFFBQ0EsV0FDQSxTQUNGLENBQUMsRUFHSCxHQUFJLEVBQVUsT0FDWixFQUFVLEVBQWMsU0FBVSxFQUFXLEVBQVMsQ0FDcEQsUUFDQSxXQUNBLFNBQ0YsQ0FBQyxFQUdILEdBQUksRUFBVSxLQUNaLEVBQVUsRUFBYyxPQUFRLEVBQVcsRUFBUyxDQUNsRCxRQUNBLFdBQ0EsU0FDRixDQUFDLEVBR0gsR0FBSSxFQUFVLEtBQ1osRUFBVSxFQUFjLE9BQVEsRUFBVyxFQUFTLENBQ2xELFFBQ0EsV0FDQSxTQUNGLENBQUMsRUFHSCxHQUFJLEVBQVUsTUFDWixFQUFVLEVBQWMsUUFBUyxFQUFXLEVBQVMsQ0FDbkQsUUFDQSxXQUNBLFNBQ0YsQ0FBQyxFQUdILE1BQU8sQ0FDTCxNQUFPLEVBQVEsTUFDZixNQUFPLEVBQWUsRUFBUSxNQUFPLEVBQVEsa0JBQWtCLENBQ2pFLEVBR0YsU0FBUyxDQUFhLENBQ3BCLEVBQ0EsRUFDQSxFQUNBLEVBQ2tCLENBQ2xCLElBQU0sRUFBZ0IsRUFBVSxHQUNoQyxHQUFJLElBQWtCLE9BQ3BCLE9BQU8sRUFHVCxPQUFRLE9BQ0QsT0FDSCxNQUFPLElBQ0YsRUFDSCxtQkFBb0IsT0FBTyxDQUFhLENBQzFDLE1BRUcsUUFDSCxNQUFPLElBQ0YsRUFDSCxvQkFBcUIsT0FBTyxDQUFhLENBQzNDLE1BRUcsU0FDSCxPQUFPLElBQUksRUFBZSxFQUFVLE1BQU0sRUFBRSxNQUMxQyxFQUNBLE9BQ0EsRUFBVyxPQUNiLE1BRUcsU0FDSCxPQUFPLElBQUksRUFBZSxFQUFVLE1BQU0sRUFBRSxNQUMxQyxFQUNBLENBQUUsTUFBTyxFQUFXLE1BQU8sU0FBVSxFQUFXLFFBQVMsRUFDekQsRUFBVyxPQUNiLE1BRUcsVUFDSCxPQUFPLElBQUksRUFBZ0IsRUFBVSxPQUFPLEVBQUUsTUFBTSxDQUFjLE1BRS9ELE1BQ0gsT0FBTyxJQUFJLEVBQVksRUFBVSxHQUFHLEVBQUUsTUFBTSxDQUFjLE1BRXZELE9BQ0gsT0FBTyxJQUFJLEVBQWEsRUFBVSxJQUFJLEVBQUUsTUFBTSxDQUFjLE1BRXpELFVBQ0gsT0FBTyxJQUFJLEVBQWdCLEVBQVUsT0FBTyxFQUFFLE1BQzVDLEVBQ0EsQ0FBRSxNQUFPLEVBQVcsTUFBTyxTQUFVLEVBQVcsUUFBUyxFQUN6RCxFQUFXLE9BQ2IsVUFHQSxNQUFNLElBQUksTUFBTSxxQkFBcUIsT0FBTyxDQUFHLEdBQUcsR0c5T2pELFNBQVMsQ0FBUSxDQUFDLEVBQStDLENBQ3RFLEdBQUksRUFBTSxNQUFNLENBQUMsSUFBUyxFQUFLLE9BQVMsU0FBUyxFQUMvQyxNQUFPLFVBR1QsR0FBSSxFQUFNLE1BQU0sQ0FBQyxJQUFTLEVBQUssT0FBUyxRQUFRLEVBQzlDLE1BQU8sU0FHVCxNQUFPLFFDSVQsU0FBUyxDQUFJLElBQUksRUFBa0MsQ0FFakQsSUFBTSxFQURhLEVBQUssSUFBSSxDQUFDLElBQVEsRUFBa0IsQ0FBRyxDQUFDLEVBQ2xDLElBQUksQ0FBQyxJQUFVLEVBQWEsQ0FBSyxDQUFDLEVBRTNELE1BQU8sQ0FDTCxRQUNBLFdBQVksRUFBTSxJQUFJLENBQUMsSUFBUyxFQUFLLFFBQVEsRUFBRSxLQUFLLEVBQ3BELE1BQU8sRUFBZSxFQUFNLElBQUksQ0FBQyxJQUFTLEVBQUssS0FBSyxDQUFDLEVBQ3JELEtBQU0sRUFBUyxDQUFLLENBQ3RCLEVYUEYsTUFBZSxDQUFRLENBQ0wsTUFLaEIsV0FBVyxDQUFDLEVBQWUsQ0FDekIsS0FBSyxNQUFRLEVBVWpCLENBRUEsTUFBTSxVQUF1QixDQUE4QixDQUN6QyxLQUFPLFVBQ1AsTUFDQSxTQUFXLEdBRTNCLFdBQVcsQ0FBQyxFQUFlLENBQ3pCLE1BQU0sQ0FBSyxFQUNYLEtBQUssTUFBUSxFQUFxQixDQUFLLEVBR2xDLElBQUksQ0FBQyxFQUFXLEVBQVcsQ0FFaEMsT0FEYyxLQUFLLFdBQVcsQ0FBUSxFQUN6QixPQUFPLENBQUMsRUFBSyxJQUFTLEVBQU0sRUFBTSxDQUFDLEVBRzNDLFVBQVUsQ0FBQyxFQUFXLEVBQWEsQ0FDeEMsT0FBTyxFQUF3QixFQUFVLEtBQUssTUFBTyxLQUFLLEtBQUssRUFHMUQsWUFBWSxDQUNqQixFQUFXLEVBQ1gsRUFBNkIsQ0FBQyxFQUNYLENBQ25CLElBQU0sRUFBVSxJQUFLLEtBQUssVUFBVyxXQUFVLFdBQVUsRUFDekQsT0FBTyxFQUFLLENBQU8sS0FHVixVQUFTLEVBQXVCLENBQ3pDLE1BQU8sQ0FDTCxTQUFVLEVBQ1YsTUFBTyxLQUFLLEtBQ2QsRUFFSixDQUVBLE1BQU0sVUFBc0IsQ0FBNkIsQ0FDdkMsS0FBTyxTQUNQLE1BQ0EsU0FBVyxHQUUzQixXQUFXLENBQUMsRUFBaUIsQ0FDM0IsSUFBSyxFQUFNLE9BQ1QsTUFBTSxJQUFJLEVBQ1IseUNBQ0EscUJBQ0EsQ0FDRSxNQUFPLEVBQ1AsU0FBVSxvQ0FDWixFQUNBLENBQ0UseURBQ0EsdURBQ0Esd0NBQ0YsQ0FDRixFQUVGLE1BQU0sRUFBTSxNQUFNLEVBQ2xCLEtBQUssTUFBUSxDQUFDLEdBQUcsQ0FBSyxFQUdqQixJQUFJLENBQUMsRUFBVyxFQUFXLENBRWhDLE9BRGMsS0FBSyxXQUFXLENBQVEsRUFDekIsS0FBSyxJQUFJLEVBR2pCLFVBQVUsQ0FBQyxFQUFXLEVBQWEsQ0FDeEMsT0FBTyxFQUF3QixFQUFVLEtBQUssTUFBTyxLQUFLLEtBQUssRUFHMUQsWUFBWSxDQUNqQixFQUFXLEVBQ1gsRUFBNkIsQ0FBQyxFQUNaLENBQ2xCLE9BQU8sRUFBSyxJQUNQLEtBQUssVUFDUixXQUNBLFdBQ0YsQ0FBc0IsS0FHYixVQUFTLEVBQXNCLENBQ3hDLE1BQU8sQ0FDTCxTQUFVLEVBQ1YsTUFBTyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQ3ZCLEVBRUosQ0FNQSxTQUFTLENBQUMsQ0FBQyxFQUErQixDQUN4QyxHQUFJLE9BQU8sSUFBUSxTQUNqQixPQUFPLElBQUksRUFBZSxDQUFHLEVBRTdCLFlBQU8sSUFBSSxFQUFjLENBQUcsRUFJekIsSUFBTSxHQUFpQixFQUFFLENBQUMsRUFFcEIsR0FBaUIsRUFBRSxDQUFDLEVBRXBCLEdBQWlCLEVBQUUsQ0FBQyxFQUVwQixHQUFrQixFQUFFLEVBQUUsRUFFdEIsR0FBa0IsRUFBRSxFQUFFLEVBRXRCLEdBQWtCLEVBQUUsRUFBRSxFQUV0QixHQUFtQixFQUFFLEdBQUcsRUFFeEIsR0FBa0IsRUFBRSxDQUFDLFFBQVMsT0FBTyxDQUFDLEVBRXRDLEdBQXVCLEVBQUUsQ0FBQyxJQUFLLElBQUssSUFBSyxJQUFLLElBQUssR0FBRyxDQUFDLEVBRTlELEVBQWdCLENBQ3BCLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsR0FDRixFQUVhLEdBQXlCLEVBQUUsQ0FBYSxFWXBOOUMsU0FBUyxDQUFlLENBQzdCLEVBQzZCLENBQzdCLE9BQU8sRUFBTyxPQUFTLFVBR2xCLFNBQVMsQ0FBYyxDQUFDLEVBQWdELENBQzdFLE9BQU8sRUFBTyxPQUFTLFNBR2xCLFNBQVMsQ0FBYSxDQUFDLEVBQStDLENBQzNFLE9BQU8sRUFBTyxPQUFTLFFDVnpCLDJCQUVBIiwKICAiZGVidWdJZCI6ICJCOUVEMURDMkFBRjFCQUEyNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==