@willbooster/wb 22.7.0 → 22.7.2

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.
@@ -1,120 +0,0 @@
1
- import{existsSync as e}from"node:fs";import t from"node:path";import{readFile as n}from"node:fs/promises";import{TextlintKernel as r}from"@textlint/kernel";import{moduleInterop as i}from"@textlint/module-interop";import{MarkdownProcessor as a}from"@textlint/textlint-plugin-markdown/lib/src/MarkdownProcessor.js";import o from"@textlint-rule/textlint-rule-no-invalid-control-character";import s from"textlint-rule-no-zero-width-spaces";var c=Object.create,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,f=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty,m=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),h=(e,t)=>{let n={};for(var r in e)l(n,r,{get:e[r],enumerable:!0});return t||l(n,Symbol.toStringTag,{value:`Module`}),n},g=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=d(t),a=0,o=i.length,s;a<o;a++)s=i[a],!p.call(e,s)&&s!==n&&l(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=u(t,s))||r.enumerable});return e},_=(e,t,n)=>(n=e==null?{}:c(f(e)),g(t||!e||!e.__esModule||!p.call(e,`default`)?l(n,`default`,{value:e,enumerable:!0}):n,e));function v(e){return Array.from(new Set(e))}function y(...e){let t,n,r;e.length===1?(t=0,r=1,[n]=e):[t,n,r=1]=e;let i=[],a=t;for(;a<n;)i.push(a),a+=r||1;return i}function b(e){return e.replace(/\\/g,`/`)}function x(e,t){if(!t||t===`all`||t===`*`)return y(1,e+1);if(t===`none`)return[];let n=[];for(let r of t.split(/[,;]/g))if(!r.includes(`-`))n.push(+r);else{let[t,i]=r.split(`-`,2);n.push(...y(+t,i?+i+1:e+1))}return v(n).filter(t=>t<=e).sort((e,t)=>e-t)}const S=Symbol.for(`yaml.alias`),ee=Symbol.for(`yaml.document`),C=Symbol.for(`yaml.map`),te=Symbol.for(`yaml.pair`),w=Symbol.for(`yaml.scalar`),ne=Symbol.for(`yaml.seq`),T=Symbol.for(`yaml.node.type`),E=e=>!!e&&typeof e==`object`&&e[T]===S,D=e=>!!e&&typeof e==`object`&&e[T]===ee,re=e=>!!e&&typeof e==`object`&&e[T]===C,O=e=>!!e&&typeof e==`object`&&e[T]===te,k=e=>!!e&&typeof e==`object`&&e[T]===w,ie=e=>!!e&&typeof e==`object`&&e[T]===ne;function A(e){if(e&&typeof e==`object`)switch(e[T]){case C:case ne:return!0}return!1}function j(e){if(e&&typeof e==`object`)switch(e[T]){case S:case C:case w:case ne:return!0}return!1}const ae=e=>(k(e)||A(e))&&!!e.anchor,M=Symbol(`break visit`),oe=Symbol(`skip children`),N=Symbol(`remove node`);function P(e,t){let n=ce(t);D(e)?F(null,e.contents,n,Object.freeze([e]))===N&&(e.contents=null):F(null,e,n,Object.freeze([]))}P.BREAK=M,P.SKIP=oe,P.REMOVE=N;function F(e,t,n,r){let i=le(e,t,n,r);if(j(i)||O(i))return ue(e,r,i),F(e,i,n,r);if(typeof i!=`symbol`){if(A(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=F(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===M)return M;else i===N&&(t.items.splice(e,1),--e)}}else if(O(t)){r=Object.freeze(r.concat(t));let e=F(`key`,t.key,n,r);if(e===M)return M;e===N&&(t.key=null);let i=F(`value`,t.value,n,r);if(i===M)return M;i===N&&(t.value=null)}}return i}async function se(e,t){let n=ce(t);D(e)?await I(null,e.contents,n,Object.freeze([e]))===N&&(e.contents=null):await I(null,e,n,Object.freeze([]))}se.BREAK=M,se.SKIP=oe,se.REMOVE=N;async function I(e,t,n,r){let i=await le(e,t,n,r);if(j(i)||O(i))return ue(e,r,i),I(e,i,n,r);if(typeof i!=`symbol`){if(A(t)){r=Object.freeze(r.concat(t));for(let e=0;e<t.items.length;++e){let i=await I(e,t.items[e],n,r);if(typeof i==`number`)e=i-1;else if(i===M)return M;else i===N&&(t.items.splice(e,1),--e)}}else if(O(t)){r=Object.freeze(r.concat(t));let e=await I(`key`,t.key,n,r);if(e===M)return M;e===N&&(t.key=null);let i=await I(`value`,t.value,n,r);if(i===M)return M;i===N&&(t.value=null)}}return i}function ce(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function le(e,t,n,r){if(typeof n==`function`)return n(e,t,r);if(re(t))return n.Map?.(e,t,r);if(ie(t))return n.Seq?.(e,t,r);if(O(t))return n.Pair?.(e,t,r);if(k(t))return n.Scalar?.(e,t,r);if(E(t))return n.Alias?.(e,t,r)}function ue(e,t,n){let r=t[t.length-1];if(A(r))r.items[e]=n;else if(O(r))e===`key`?r.key=n:r.value=n;else if(D(r))r.contents=n;else{let e=E(r)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}const de={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},fe=e=>e.replace(/[!,[\]{}]/g,e=>de[e]);var L=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags)}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+fe(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let t=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],n=Object.entries(this.tags),r;if(e&&n.length>0&&j(e.contents)){let t={};P(e.contents,(e,n)=>{j(n)&&n.tag&&(t[n.tag]=!0)}),r=Object.keys(t)}else r=[];for(let[i,a]of n)(i!==`!!`||a!==`tag:yaml.org,2002:`)&&(!e||r.some(e=>e.startsWith(a)))&&t.push(`%TAG ${i} ${a}`);return t.join(`
2
- `)}};L.defaultYaml={explicit:!1,version:`1.2`},L.defaultTags={"!!":`tag:yaml.org,2002:`};function pe(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function me(e){let t=new Set;return P(e,{Value(e,n){n.anchor&&t.add(n.anchor)}}),t}function he(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function ge(e,t){let n=[],r=new Map,i=null;return{onAnchor:r=>{n.push(r),i??=me(e);let a=he(t,i);return i.add(a),a},setAnchors:()=>{for(let e of n){let t=r.get(e);if(typeof t==`object`&&t.anchor&&(k(t.node)||A(t.node)))t.node.anchor=t.anchor;else{let t=Error(`Failed to resolve repeated object (this should not happen)`);throw t.source=e,t}}},sourceObjects:r}}function _e(e,t,n,r){if(r&&typeof r==`object`){if(Array.isArray(r))for(let t=0,n=r.length;t<n;++t){let n=r[t],i=_e(e,r,String(t),n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}else if(r instanceof Map)for(let t of Array.from(r.keys())){let n=r.get(t),i=_e(e,r,t,n);i===void 0?r.delete(t):i!==n&&r.set(t,i)}else if(r instanceof Set)for(let t of Array.from(r)){let n=_e(e,r,t,t);n===void 0?r.delete(t):n!==t&&(r.delete(t),r.add(n))}else for(let[t,n]of Object.entries(r)){let i=_e(e,r,t,n);i===void 0?delete r[t]:i!==n&&(r[t]=i)}}return e.call(t,n,r)}function R(e,t,n){if(Array.isArray(e))return e.map((e,t)=>R(e,String(t),n));if(e&&typeof e.toJSON==`function`){if(!n||!ae(e))return e.toJSON(t,n);let r={aliasCount:0,count:1,res:void 0};n.anchors.set(e,r),n.onCreate=e=>{r.res=e,delete n.onCreate};let i=e.toJSON(t,n);return n.onCreate&&n.onCreate(i),i}return typeof e==`bigint`&&!n?.keep?Number(e):e}var ve=class{constructor(e){Object.defineProperty(this,T,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:t,maxAliasCount:n,onAnchor:r,reviver:i}={}){if(!D(e))throw TypeError(`A document argument is required`);let a={anchors:new Map,doc:e,keep:!0,mapAsMap:t===!0,mapKeyWarned:!1,maxAliasCount:typeof n==`number`?n:100},o=R(this,``,a);if(typeof r==`function`)for(let{count:e,res:t}of a.anchors.values())r(t,e);return typeof i==`function`?_e(i,{"":o},``,o):o}},ye=class extends ve{constructor(e){super(S),this.source=e,Object.defineProperty(this,"tag",{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){if(t?.maxAliasCount===0)throw ReferenceError(`Alias resolution is disabled`);let n;t?.aliasResolveCache?n=t.aliasResolveCache:(n=[],P(e,{Node:(e,t)=>{(E(t)||ae(t))&&n.push(t)}}),t&&(t.aliasResolveCache=n));let r;for(let e of n){if(e===this)break;e.anchor===this.source&&(r=e)}return r}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:r,maxAliasCount:i}=t,a=this.resolve(r,t);if(!a){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}let o=n.get(a);if(o||=(R(a,null,t),n.get(a)),o?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(o.count+=1,o.aliasCount===0&&(o.aliasCount=be(r,a,n)),o.count*o.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`);return o.res}toString(e,t,n){let r=`*${this.source}`;if(e){if(pe(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${r} `}return r}};function be(e,t,n){if(E(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}if(A(t)){let r=0;for(let i of t.items){let t=be(e,i,n);t>r&&(r=t)}return r}if(O(t)){let r=be(e,t.key,n),i=be(e,t.value,n);return Math.max(r,i)}return 1}const xe=e=>!e||typeof e!=`function`&&typeof e!=`object`;var z=class extends ve{constructor(e){super(w),this.value=e}toJSON(e,t){return t?.keep?this.value:R(this.value,e,t)}toString(){return String(this.value)}};z.BLOCK_FOLDED=`BLOCK_FOLDED`,z.BLOCK_LITERAL=`BLOCK_LITERAL`,z.PLAIN=`PLAIN`,z.QUOTE_DOUBLE=`QUOTE_DOUBLE`,z.QUOTE_SINGLE=`QUOTE_SINGLE`;function Se(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function Ce(e,t,n){if(D(e)&&(e=e.contents),j(e))return e;if(O(e)){let t=n.schema[C].createNode?.(n.schema,null,n);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:r,onAnchor:i,onTagObj:a,schema:o,sourceObjects:s}=n,c;if(r&&e&&typeof e==`object`){if(c=s.get(e),c)return c.anchor??(c.anchor=i(e)),new ye(c.anchor);c={anchor:null,node:null},s.set(e,c)}t?.startsWith(`!!`)&&(t=`tag:yaml.org,2002:`+t.slice(2));let l=Se(e,t,o.tags);if(!l){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new z(e);return c&&(c.node=t),t}l=e instanceof Map?o[C]:Symbol.iterator in Object(e)?o[ne]:o[C]}a&&(a(l),delete n.onTagObj);let u=l?.createNode?l.createNode(n.schema,e,n):typeof l?.nodeClass?.from==`function`?l.nodeClass.from(n.schema,e,n):new z(e);return t?u.tag=t:l.default||(u.tag=l.tag),c&&(c.node=u),u}function we(e,t,n){let r=n;for(let e=t.length-1;e>=0;--e){let n=t[e];if(typeof n==`number`&&Number.isInteger(n)&&n>=0){let e=[];e[n]=r,r=e}else r=new Map([[n,r]])}return Ce(r,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:new Map})}const Te=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done;var Ee=class extends ve{constructor(e,t){super(e),Object.defineProperty(this,"schema",{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>j(t)||O(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(Te(e))this.add(t);else{let[n,...r]=e,i=this.get(n,!0);if(A(i))i.addIn(r,t);else if(i===void 0&&this.schema)this.set(n,we(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}deleteIn(e){let[t,...n]=e;if(n.length===0)return this.delete(t);let r=this.get(t,!0);if(A(r))return r.deleteIn(n);throw Error(`Expected YAML collection at ${t}. Remaining path: ${n}`)}getIn(e,t){let[n,...r]=e,i=this.get(n,!0);return r.length===0?!t&&k(i)?i.value:i:A(i)?i.getIn(r,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!O(t))return!1;let n=t.value;return n==null||e&&k(n)&&n.value==null&&!n.commentBefore&&!n.comment&&!n.tag})}hasIn(e){let[t,...n]=e;if(n.length===0)return this.has(t);let r=this.get(t,!0);return A(r)?r.hasIn(n):!1}setIn(e,t){let[n,...r]=e;if(r.length===0)this.set(n,t);else{let e=this.get(n,!0);if(A(e))e.setIn(r,t);else if(e===void 0&&this.schema)this.set(n,we(this.schema,r,t));else throw Error(`Expected YAML collection at ${n}. Remaining path: ${r}`)}}};const De=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function B(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}const V=(e,t,n)=>e.endsWith(`
3
- `)?B(n,t):n.includes(`
4
- `)?`
5
- `+B(n,t):(e.endsWith(` `)?``:` `)+n,Oe=`flow`;function ke(e,t,n=`flow`,{indentAtStart:r,lineWidth:i=80,minContentWidth:a=20,onFold:o,onOverflow:s}={}){if(!i||i<0)return e;i<a&&(a=0);let c=Math.max(1+a,1+i-t.length);if(e.length<=c)return e;let l=[],u={},d=i-t.length;typeof r==`number`&&(r>i-Math.max(2,a)?l.push(0):d=i-r);let f,p,m=!1,h=-1,g=-1,_=-1;n===`block`&&(h=Ae(e,h,t.length),h!==-1&&(d=h+c));for(let r;r=e[h+=1];){if(n===`quoted`&&r===`\\`){switch(g=h,e[h+1]){case`x`:h+=3;break;case`u`:h+=5;break;case`U`:h+=9;break;default:h+=1}_=h}if(r===`
6
- `)n===`block`&&(h=Ae(e,h,t.length)),d=h+t.length+c,f=void 0;else{if(r===` `&&p&&p!==` `&&p!==`
7
- `&&p!==` `){let t=e[h+1];t&&t!==` `&&t!==`
8
- `&&t!==` `&&(f=h)}if(h>=d){if(f)l.push(f),d=f+c,f=void 0;else if(n===`quoted`){for(;p===` `||p===` `;)p=r,r=e[h+=1],m=!0;let t=h>_+1?h-2:g-1;if(u[t])return e;l.push(t),u[t]=!0,d=t+c,f=void 0}else m=!0}}p=r}if(m&&s&&s(),l.length===0)return e;o&&o();let v=e.slice(0,l[0]);for(let r=0;r<l.length;++r){let i=l[r],a=l[r+1]||e.length;i===0?v=`\n${t}${e.slice(0,a)}`:(n===`quoted`&&u[i]&&(v+=`${e[i]}\\`),v+=`\n${t}${e.slice(i+1,a)}`)}return v}function Ae(e,t,n){let r=t,i=t+1,a=e[i];for(;a===` `||a===` `;)if(t<i+n)a=e[++t];else{do a=e[++t];while(a&&a!==`
9
- `);r=t,i=t+1,a=e[i]}return r}const je=(e,t)=>({indentAtStart:t?e.indent.length:e.indentAtStart,lineWidth:e.options.lineWidth,minContentWidth:e.options.minContentWidth}),Me=e=>/^(%|---|\.\.\.)/m.test(e);function Ne(e,t,n){if(!t||t<0)return!1;let r=t-n,i=e.length;if(i<=r)return!1;for(let t=0,n=0;t<i;++t)if(e[t]===`
10
- `){if(t-n>r)return!0;if(n=t+1,i-n<=r)return!1}return!0}function Pe(e,t){let n=JSON.stringify(e);if(t.options.doubleQuotedAsJSON)return n;let{implicitKey:r}=t,i=t.options.doubleQuotedMinMultiLineLength,a=t.indent||(Me(e)?` `:``),o=``,s=0;for(let e=0,t=n[e];t;t=n[++e])if(t===` `&&n[e+1]===`\\`&&n[e+2]===`n`&&(o+=n.slice(s,e)+`\\ `,e+=1,s=e,t=`\\`),t===`\\`)switch(n[e+1]){case`u`:{o+=n.slice(s,e);let t=n.substr(e+2,4);switch(t){case`0000`:o+=`\\0`;break;case`0007`:o+=`\\a`;break;case`000b`:o+=`\\v`;break;case`001b`:o+=`\\e`;break;case`0085`:o+=`\\N`;break;case`00a0`:o+=`\\_`;break;case`2028`:o+=`\\L`;break;case`2029`:o+=`\\P`;break;default:t.substr(0,2)===`00`?o+=`\\x`+t.substr(2):o+=n.substr(e,6)}e+=5,s=e+1}break;case`n`:if(r||n[e+2]===`"`||n.length<i)e+=1;else{for(o+=n.slice(s,e)+`
11
-
12
- `;n[e+2]===`\\`&&n[e+3]===`n`&&n[e+4]!==`"`;)o+=`
13
- `,e+=2;o+=a,n[e+2]===` `&&(o+=`\\`),e+=1,s=e+1}break;default:e+=1}return o=s?o+n.slice(s):n,r?o:ke(o,a,`quoted`,je(t,!1))}function Fe(e,t){if(t.options.singleQuote===!1||t.implicitKey&&e.includes(`
14
- `)||/[ \t]\n|\n[ \t]/.test(e))return Pe(e,t);let n=t.indent||(Me(e)?` `:``),r=`'`+e.replace(/'/g,`''`).replace(/\n+/g,`$&\n${n}`)+`'`;return t.implicitKey?r:ke(r,n,Oe,je(t,!1))}function Ie(e,t){let{singleQuote:n}=t.options,r;if(n===!1)r=Pe;else{let t=e.includes(`"`),i=e.includes(`'`);r=t&&!i?Fe:i&&!t?Pe:n?Fe:Pe}return r(e,t)}let Le;try{Le=RegExp(`(^|(?<!
15
- ))
16
- +(?!
17
- |$)`,`g`)}catch{Le=/\n+(?!\n|$)/g}function Re({comment:e,type:t,value:n},r,i,a){let{blockQuote:o,commentString:s,lineWidth:c}=r.options;if(!o||/\n[\t ]+$/.test(n))return Ie(n,r);let l=r.indent||(r.forceBlockIndent||Me(n)?` `:``),u=o===`literal`?!0:o===`folded`||t===z.BLOCK_FOLDED?!1:t===z.BLOCK_LITERAL||!Ne(n,c,l.length);if(!n)return u?`|
18
- `:`>
19
- `;let d,f;for(f=n.length;f>0;--f){let e=n[f-1];if(e!==`
20
- `&&e!==` `&&e!==` `)break}let p=n.substring(f),m=p.indexOf(`
21
- `);m===-1?d=`-`:n===p||m!==p.length-1?(d=`+`,a&&a()):d=``,p&&=(n=n.slice(0,-p.length),p[p.length-1]===`
22
- `&&(p=p.slice(0,-1)),p.replace(Le,`$&${l}`));let h=!1,g,_=-1;for(g=0;g<n.length;++g){let e=n[g];if(e===` `)h=!0;else if(e===`
23
- `)_=g;else break}let v=n.substring(0,_<g?_+1:g);v&&=(n=n.substring(v.length),v.replace(/\n+/g,`$&${l}`));let y=(h?l?`2`:`1`:``)+d;if(e&&(y+=` `+s(e.replace(/ ?[\r\n]+/g,` `)),i&&i()),!u){let e=n.replace(/\n+/g,`
24
- $&`).replace(/(?:^|\n)([\t ].*)(?:([\n\t ]*)\n(?![\n\t ]))?/g,`$1$2`).replace(/\n+/g,`$&${l}`),i=!1,a=je(r,!0);o!==`folded`&&t!==z.BLOCK_FOLDED&&(a.onOverflow=()=>{i=!0});let s=ke(`${v}${e}${p}`,l,`block`,a);if(!i)return`>${y}\n${l}${s}`}return n=n.replace(/\n+/g,`$&${l}`),`|${y}\n${l}${v}${n}${p}`}function ze(e,t,n,r){let{type:i,value:a}=e,{actualString:o,implicitKey:s,indent:c,indentStep:l,inFlow:u}=t;if(s&&a.includes(`
25
- `)||u&&/[[\]{},]/.test(a))return Ie(a,t);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(a))return s||u||!a.includes(`
26
- `)?Ie(a,t):Re(e,t,n,r);if(!s&&!u&&i!==z.PLAIN&&a.includes(`
27
- `))return Re(e,t,n,r);if(Me(a)){if(c===``)return t.forceBlockIndent=!0,Re(e,t,n,r);if(s&&c===l)return Ie(a,t)}let d=a.replace(/\n+/g,`$&\n${c}`);if(o){let e=e=>e.default&&e.tag!==`tag:yaml.org,2002:str`&&e.test?.test(d),{compat:n,tags:r}=t.doc.schema;if(r.some(e)||n?.some(e))return Ie(a,t)}return s?d:ke(d,c,Oe,je(t,!1))}function Be(e,t,n,r){let{implicitKey:i,inFlow:a}=t,o=typeof e.value==`string`?e:Object.assign({},e,{value:String(e.value)}),{type:s}=e;s!==z.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(o.value)&&(s=z.QUOTE_DOUBLE);let c=e=>{switch(e){case z.BLOCK_FOLDED:case z.BLOCK_LITERAL:return i||a?Ie(o.value,t):Re(o,t,n,r);case z.QUOTE_DOUBLE:return Pe(o.value,t);case z.QUOTE_SINGLE:return Fe(o.value,t);case z.PLAIN:return ze(o,t,n,r);default:return null}},l=c(s);if(l===null){let{defaultKeyType:e,defaultStringType:n}=t.options,r=i&&e||n;if(l=c(r),l===null)throw Error(`Unsupported default string type ${r}`)}return l}function Ve(e,t){let n=Object.assign({blockQuote:!0,commentString:De,defaultKeyType:null,defaultStringType:`PLAIN`,directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:`false`,flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:`null`,simpleKeys:!1,singleQuote:null,trailingComma:!1,trueStr:`true`,verifyAliasOrder:!0},e.schema.toStringOptions,t),r;switch(n.collectionStyle){case`block`:r=!1;break;case`flow`:r=!0;break;default:r=null}return{anchors:new Set,doc:e,flowCollectionPadding:n.flowCollectionPadding?` `:``,indent:``,indentStep:typeof n.indent==`number`?` `.repeat(n.indent):` `,inFlow:r,options:n}}function He(e,t){if(t.tag){let n=e.filter(e=>e.tag===t.tag);if(n.length>0)return n.find(e=>e.format===t.format)??n[0]}let n,r;if(k(t)){r=t.value;let i=e.filter(e=>e.identify?.(r));if(i.length>1){let e=i.filter(e=>e.test);e.length>0&&(i=e)}n=i.find(e=>e.format===t.format)??i.find(e=>!e.format)}else r=t,n=e.find(e=>e.nodeClass&&r instanceof e.nodeClass);if(!n){let e=r?.constructor?.name??(r===null?`null`:typeof r);throw Error(`Tag not resolved for ${e} value`)}return n}function Ue(e,t,{anchors:n,doc:r}){if(!r.directives)return``;let i=[],a=(k(e)||A(e))&&e.anchor;a&&pe(a)&&(n.add(a),i.push(`&${a}`));let o=e.tag??(t.default?null:t.tag);return o&&i.push(r.directives.tagString(o)),i.join(` `)}function H(e,t,n,r){if(O(e))return e.toString(t,n,r);if(E(e)){if(t.doc.directives)return e.toString(t);if(t.resolvedAliases?.has(e))throw TypeError(`Cannot stringify circular structure without alias nodes`);t.resolvedAliases?t.resolvedAliases.add(e):t.resolvedAliases=new Set([e]),e=e.resolve(t.doc)}let i,a=j(e)?e:t.doc.createNode(e,{onTagObj:e=>i=e});i??=He(t.doc.schema.tags,a);let o=Ue(a,i,t);o.length>0&&(t.indentAtStart=(t.indentAtStart??0)+o.length+1);let s=typeof i.stringify==`function`?i.stringify(a,t,n,r):k(a)?Be(a,t,n,r):a.toString(t,n,r);return o?k(a)||s[0]===`{`||s[0]===`[`?`${o} ${s}`:`${o}\n${t.indent}${s}`:s}function We({key:e,value:t},n,r,i){let{allNullValues:a,doc:o,indent:s,indentStep:c,options:{commentString:l,indentSeq:u,simpleKeys:d}}=n,f=j(e)&&e.comment||null;if(d){if(f)throw Error(`With simple keys, key nodes cannot have comments`);if(A(e)||!j(e)&&typeof e==`object`)throw Error(`With simple keys, collection cannot be used as a key value`)}let p=!d&&(!e||f&&t==null&&!n.inFlow||A(e)||(k(e)?e.type===z.BLOCK_FOLDED||e.type===z.BLOCK_LITERAL:typeof e==`object`));n=Object.assign({},n,{allNullValues:!1,implicitKey:!p&&(d||!a),indent:s+c});let m=!1,h=!1,g=H(e,n,()=>m=!0,()=>h=!0);if(!p&&!n.inFlow&&g.length>1024){if(d)throw Error(`With simple keys, single line scalar must not span more than 1024 characters`);p=!0}if(n.inFlow){if(a||t==null)return m&&r&&r(),g===``?`?`:p?`? ${g}`:g}else if(a&&!d||t==null&&p)return g=`? ${g}`,f&&!m?g+=V(g,n.indent,l(f)):h&&i&&i(),g;m&&(f=null),p?(f&&(g+=V(g,n.indent,l(f))),g=`? ${g}\n${s}:`):(g=`${g}:`,f&&(g+=V(g,n.indent,l(f))));let _,v,y;j(t)?(_=!!t.spaceBefore,v=t.commentBefore,y=t.comment):(_=!1,v=null,y=null,t&&typeof t==`object`&&(t=o.createNode(t))),n.implicitKey=!1,!p&&!f&&k(t)&&(n.indentAtStart=g.length+1),h=!1,!u&&c.length>=2&&!n.inFlow&&!p&&ie(t)&&!t.flow&&!t.tag&&!t.anchor&&(n.indent=n.indent.substring(2));let b=!1,x=H(t,n,()=>b=!0,()=>h=!0),S=` `;if(f||_||v){if(S=_?`
28
- `:``,v){let e=l(v);S+=`\n${B(e,n.indent)}`}x===``&&!n.inFlow?S===`
29
- `&&y&&(S=`
30
-
31
- `):S+=`\n${n.indent}`}else if(!p&&A(t)){let e=x[0],r=x.indexOf(`
32
- `),i=r!==-1,a=n.inFlow??t.flow??t.items.length===0;if(i||!a){let t=!1;if(i&&(e===`&`||e===`!`)){let n=x.indexOf(` `);e===`&`&&n!==-1&&n<r&&x[n+1]===`!`&&(n=x.indexOf(` `,n+1)),(n===-1||r<n)&&(t=!0)}t||(S=`\n${n.indent}`)}}else(x===``||x[0]===`
33
- `)&&(S=``);return g+=S+x,n.inFlow?b&&r&&r():y&&!b?g+=V(g,n.indent,l(y)):h&&i&&i(),g}function Ge(e,t){(e===`debug`||e===`warn`)&&console.warn(t)}const U={identify:e=>e===`<<`||typeof e==`symbol`&&e.description===`<<`,default:`key`,tag:`tag:yaml.org,2002:merge`,test:/^<<$/,resolve:()=>Object.assign(new z(Symbol(`<<`)),{addToJSMap:qe}),stringify:()=>`<<`},Ke=(e,t)=>(U.identify(t)||k(t)&&(!t.type||t.type===z.PLAIN)&&U.identify(t.value))&&e?.doc.schema.tags.some(e=>e.tag===U.tag&&e.default);function qe(e,t,n){let r=Ye(e,n);if(ie(r))for(let n of r.items)Je(e,t,n);else if(Array.isArray(r))for(let n of r)Je(e,t,n);else Je(e,t,r)}function Je(e,t,n){let r=Ye(e,n);if(!re(r))throw Error(`Merge sources must be maps or map aliases`);let i=r.toJSON(null,e,Map);for(let[e,n]of i)t instanceof Map?t.has(e)||t.set(e,n):t instanceof Set?t.add(e):Object.prototype.hasOwnProperty.call(t,e)||Object.defineProperty(t,e,{value:n,writable:!0,enumerable:!0,configurable:!0});return t}function Ye(e,t){return e&&E(t)?t.resolve(e.doc,e):t}function Xe(e,t,{key:n,value:r}){if(j(n)&&n.addToJSMap)n.addToJSMap(e,t,r);else if(Ke(e,n))qe(e,t,r);else{let i=R(n,``,e);if(t instanceof Map)t.set(i,R(r,i,e));else if(t instanceof Set)t.add(i);else{let a=Ze(n,i,e),o=R(r,a,e);a in t?Object.defineProperty(t,a,{value:o,writable:!0,enumerable:!0,configurable:!0}):t[a]=o}}return t}function Ze(e,t,n){if(t===null)return``;if(typeof t!=`object`)return String(t);if(j(e)&&n?.doc){let t=Ve(n.doc,{});t.anchors=new Set;for(let e of n.anchors.keys())t.anchors.add(e.anchor);t.inFlow=!0,t.inStringifyKey=!0;let r=e.toString(t);if(!n.mapKeyWarned){let e=JSON.stringify(r);e.length>40&&(e=e.substring(0,36)+`..."`),Ge(n.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${e}. Set mapAsMap: true to use object keys.`),n.mapKeyWarned=!0}return r}return JSON.stringify(t)}function Qe(e,t,n){return new W(Ce(e,void 0,n),Ce(t,void 0,n))}var W=class e{constructor(e,t=null){Object.defineProperty(this,T,{value:te}),this.key=e,this.value=t}clone(t){let{key:n,value:r}=this;return j(n)&&(n=n.clone(t)),j(r)&&(r=r.clone(t)),new e(n,r)}toJSON(e,t){return Xe(t,t?.mapAsMap?new Map:{},this)}toString(e,t,n){return e?.doc?We(this,e,t,n):JSON.stringify(this)}};function $e(e,t,n){return(t.inFlow??e.flow?tt:et)(e,t,n)}function et({comment:e,items:t},n,{blockItemPrefix:r,flowChars:i,itemIndent:a,onChompKeep:o,onComment:s}){let{indent:c,options:{commentString:l}}=n,u=Object.assign({},n,{indent:a,type:null}),d=!1,f=[];for(let e=0;e<t.length;++e){let i=t[e],o=null;if(j(i))!d&&i.spaceBefore&&f.push(``),nt(n,f,i.commentBefore,d),i.comment&&(o=i.comment);else if(O(i)){let e=j(i.key)?i.key:null;e&&(!d&&e.spaceBefore&&f.push(``),nt(n,f,e.commentBefore,d))}d=!1;let s=H(i,u,()=>o=null,()=>d=!0);o&&(s+=V(s,a,l(o))),d&&o&&(d=!1),f.push(r+s)}let p;if(f.length===0)p=i.start+i.end;else{p=f[0];for(let e=1;e<f.length;++e){let t=f[e];p+=t?`\n${c}${t}`:`
34
- `}}return e?(p+=`
35
- `+B(l(e),c),s&&s()):d&&o&&o(),p}function tt({items:e},t,{flowChars:n,itemIndent:r}){let{indent:i,indentStep:a,flowCollectionPadding:o,options:{commentString:s}}=t;r+=a;let c=Object.assign({},t,{indent:r,inFlow:!0,type:null}),l=!1,u=0,d=[];for(let n=0;n<e.length;++n){let i=e[n],a=null;if(j(i))i.spaceBefore&&d.push(``),nt(t,d,i.commentBefore,!1),i.comment&&(a=i.comment);else if(O(i)){let e=j(i.key)?i.key:null;e&&(e.spaceBefore&&d.push(``),nt(t,d,e.commentBefore,!1),e.comment&&(l=!0));let n=j(i.value)?i.value:null;n?(n.comment&&(a=n.comment),n.commentBefore&&(l=!0)):i.value==null&&e?.comment&&(a=e.comment)}a&&(l=!0);let o=H(i,c,()=>a=null);l||=d.length>u||o.includes(`
36
- `),n<e.length-1?o+=`,`:t.options.trailingComma&&(t.options.lineWidth>0&&(l||=d.reduce((e,t)=>e+t.length+2,2)+(o.length+2)>t.options.lineWidth),l&&(o+=`,`)),a&&(o+=V(o,r,s(a))),d.push(o),u=d.length}let{start:f,end:p}=n;if(d.length===0)return f+p;if(!l){let e=d.reduce((e,t)=>e+t.length+2,2);l=t.options.lineWidth>0&&e>t.options.lineWidth}if(l){let e=f;for(let t of d)e+=t?`\n${a}${i}${t}`:`
37
- `;return`${e}\n${i}${p}`}return`${f}${o}${d.join(` `)}${o}${p}`}function nt({indent:e,options:{commentString:t}},n,r,i){if(r&&i&&(r=r.replace(/^\n+/,``)),r){let i=B(t(r),e);n.push(i.trimStart())}}function G(e,t){let n=k(t)?t.value:t;for(let r of e)if(O(r)&&(r.key===t||r.key===n||k(r.key)&&r.key.value===n))return r}var K=class extends Ee{static get tagName(){return`tag:yaml.org,2002:map`}constructor(e){super(C,e),this.items=[]}static from(e,t,n){let{keepUndefined:r,replacer:i}=n,a=new this(e),o=(e,o)=>{if(typeof i==`function`)o=i.call(t,e,o);else if(Array.isArray(i)&&!i.includes(e))return;(o!==void 0||r)&&a.items.push(Qe(e,o,n))};if(t instanceof Map)for(let[e,n]of t)o(e,n);else if(t&&typeof t==`object`)for(let e of Object.keys(t))o(e,t[e]);return typeof e.sortMapEntries==`function`&&a.items.sort(e.sortMapEntries),a}add(e,t){let n;n=O(e)?e:!e||typeof e!=`object`||!(`key`in e)?new W(e,e?.value):new W(e.key,e.value);let r=G(this.items,n.key),i=this.schema?.sortMapEntries;if(r){if(!t)throw Error(`Key ${n.key} already set`);k(r.value)&&xe(n.value)?r.value.value=n.value:r.value=n.value}else if(i){let e=this.items.findIndex(e=>i(n,e)<0);e===-1?this.items.push(n):this.items.splice(e,0,n)}else this.items.push(n)}delete(e){let t=G(this.items,e);return t?this.items.splice(this.items.indexOf(t),1).length>0:!1}get(e,t){let n=G(this.items,e)?.value;return(!t&&k(n)?n.value:n)??void 0}has(e){return!!G(this.items,e)}set(e,t){this.add(new W(e,t),!0)}toJSON(e,t,n){let r=n?new n:t?.mapAsMap?new Map:{};t?.onCreate&&t.onCreate(r);for(let e of this.items)Xe(t,r,e);return r}toString(e,t,n){if(!e)return JSON.stringify(this);for(let e of this.items)if(!O(e))throw Error(`Map items must all be pairs; found ${JSON.stringify(e)} instead`);return!e.allNullValues&&this.hasAllNullValues(!1)&&(e=Object.assign({},e,{allNullValues:!0})),$e(this,e,{blockItemPrefix:``,flowChars:{start:`{`,end:`}`},itemIndent:e.indent||``,onChompKeep:n,onComment:t})}};const rt={collection:`map`,default:!0,nodeClass:K,tag:`tag:yaml.org,2002:map`,resolve(e,t){return re(e)||t(`Expected a mapping for this tag`),e},createNode:(e,t,n)=>K.from(e,t,n)};var q=class extends Ee{static get tagName(){return`tag:yaml.org,2002:seq`}constructor(e){super(ne,e),this.items=[]}add(e){this.items.push(e)}delete(e){let t=it(e);return typeof t==`number`&&this.items.splice(t,1).length>0}get(e,t){let n=it(e);if(typeof n!=`number`)return;let r=this.items[n];return!t&&k(r)?r.value:r}has(e){let t=it(e);return typeof t==`number`&&t<this.items.length}set(e,t){let n=it(e);if(typeof n!=`number`)throw Error(`Expected a valid index, not ${e}.`);let r=this.items[n];k(r)&&xe(t)?r.value=t:this.items[n]=t}toJSON(e,t){let n=[];t?.onCreate&&t.onCreate(n);let r=0;for(let e of this.items)n.push(R(e,String(r++),t));return n}toString(e,t,n){return e?$e(this,e,{blockItemPrefix:`- `,flowChars:{start:`[`,end:`]`},itemIndent:(e.indent||``)+` `,onChompKeep:n,onComment:t}):JSON.stringify(this)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t)){let e=0;for(let a of t){if(typeof r==`function`){let n=t instanceof Set?a:String(e++);a=r.call(t,n,a)}i.items.push(Ce(a,void 0,n))}}return i}};function it(e){let t=k(e)?e.value:e;return t&&typeof t==`string`&&(t=Number(t)),typeof t==`number`&&Number.isInteger(t)&&t>=0?t:null}const at={collection:`seq`,default:!0,nodeClass:q,tag:`tag:yaml.org,2002:seq`,resolve(e,t){return ie(e)||t(`Expected a sequence for this tag`),e},createNode:(e,t,n)=>q.from(e,t,n)},ot={identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify(e,t,n,r){return t=Object.assign({actualString:!0},t),Be(e,t,n,r)}},st={identify:e=>e==null,createNode:()=>new z(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new z(null),stringify:({source:e},t)=>typeof e==`string`&&st.test.test(e)?e:t.options.nullStr},ct={identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:e=>new z(e[0]===`t`||e[0]===`T`),stringify({source:e,value:t},n){return e&&ct.test.test(e)&&t===(e[0]===`t`||e[0]===`T`)?e:t?n.options.trueStr:n.options.falseStr}};function J({format:e,minFractionDigits:t,tag:n,value:r}){if(typeof r==`bigint`)return String(r);let i=typeof r==`number`?r:Number(r);if(!isFinite(i))return isNaN(i)?`.nan`:i<0?`-.inf`:`.inf`;let a=Object.is(r,-0)?`-0`:JSON.stringify(r);if(!e&&t&&(!n||n===`tag:yaml.org,2002:float`)&&/^-?\d/.test(a)&&!a.includes(`e`)){let e=a.indexOf(`.`);e<0&&(e=a.length,a+=`.`);let n=t-(a.length-e-1);for(;n-->0;)a+=`0`}return a}const lt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()===`nan`?NaN:e[0]===`-`?-1/0:1/0,stringify:J},ut={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`EXP`,test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():J(e)}},dt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(e){let t=new z(parseFloat(e)),n=e.indexOf(`.`);return n!==-1&&e[e.length-1]===`0`&&(t.minFractionDigits=e.length-n-1),t},stringify:J},ft=e=>typeof e==`bigint`||Number.isInteger(e),pt=(e,t,n,{intAsBigInt:r})=>r?BigInt(e):parseInt(e.substring(t),n);function mt(e,t,n){let{value:r}=e;return ft(r)&&r>=0?n+r.toString(t):J(e)}const ht={identify:e=>ft(e)&&e>=0,default:!0,tag:`tag:yaml.org,2002:int`,format:`OCT`,test:/^0o[0-7]+$/,resolve:(e,t,n)=>pt(e,2,8,n),stringify:e=>mt(e,8,`0o`)},gt={identify:ft,default:!0,tag:`tag:yaml.org,2002:int`,test:/^[-+]?[0-9]+$/,resolve:(e,t,n)=>pt(e,0,10,n),stringify:J},_t={identify:e=>ft(e)&&e>=0,default:!0,tag:`tag:yaml.org,2002:int`,format:`HEX`,test:/^0x[0-9a-fA-F]+$/,resolve:(e,t,n)=>pt(e,2,16,n),stringify:e=>mt(e,16,`0x`)},vt=[rt,at,ot,st,ct,ht,gt,_t,lt,ut,dt];function yt(e){return typeof e==`bigint`||Number.isInteger(e)}const bt=({value:e})=>JSON.stringify(e),xt=[{identify:e=>typeof e==`string`,default:!0,tag:`tag:yaml.org,2002:str`,resolve:e=>e,stringify:bt},{identify:e=>e==null,createNode:()=>new z(null),default:!0,tag:`tag:yaml.org,2002:null`,test:/^null$/,resolve:()=>null,stringify:bt},{identify:e=>typeof e==`boolean`,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^true$|^false$/,resolve:e=>e===`true`,stringify:bt},{identify:yt,default:!0,tag:`tag:yaml.org,2002:int`,test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(e,t,{intAsBigInt:n})=>n?BigInt(e):parseInt(e,10),stringify:({value:e})=>yt(e)?e.toString():JSON.stringify(e)},{identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:e=>parseFloat(e),stringify:bt}],St=[rt,at].concat(xt,{default:!0,tag:``,test:/^/,resolve(e,t){return t(`Unresolved plain scalar ${JSON.stringify(e)}`),e}}),Ct={identify:e=>e instanceof Uint8Array,default:!1,tag:`tag:yaml.org,2002:binary`,resolve(e,t){if(typeof atob==`function`){let t=atob(e.replace(/[\n\r]/g,``)),n=new Uint8Array(t.length);for(let e=0;e<t.length;++e)n[e]=t.charCodeAt(e);return n}return t(`This environment does not support reading binary tags; either Buffer or atob is required`),e},stringify({comment:e,type:t,value:n},r,i,a){if(!n)return``;let o=n,s;if(typeof btoa==`function`){let e=``;for(let t=0;t<o.length;++t)e+=String.fromCharCode(o[t]);s=btoa(e)}else throw Error(`This environment does not support writing binary tags; either Buffer or btoa is required`);if(t??=z.BLOCK_LITERAL,t!==z.QUOTE_DOUBLE){let e=Math.max(r.options.lineWidth-r.indent.length,r.options.minContentWidth),n=Math.ceil(s.length/e),i=Array(n);for(let t=0,r=0;t<n;++t,r+=e)i[t]=s.substr(r,e);s=i.join(t===z.BLOCK_LITERAL?`
38
- `:` `)}return Be({comment:e,type:t,value:s},r,i,a)}};function wt(e,t){if(ie(e))for(let n=0;n<e.items.length;++n){let r=e.items[n];if(!O(r)){if(re(r)){r.items.length>1&&t(`Each pair must have its own sequence indicator`);let e=r.items[0]||new W(new z(null));if(r.commentBefore&&(e.key.commentBefore=e.key.commentBefore?`${r.commentBefore}\n${e.key.commentBefore}`:r.commentBefore),r.comment){let t=e.value??e.key;t.comment=t.comment?`${r.comment}\n${t.comment}`:r.comment}r=e}e.items[n]=O(r)?r:new W(r)}}else t(`Expected a sequence for this tag`);return e}function Tt(e,t,n){let{replacer:r}=n,i=new q(e);i.tag=`tag:yaml.org,2002:pairs`;let a=0;if(t&&Symbol.iterator in Object(t))for(let e of t){typeof r==`function`&&(e=r.call(t,String(a++),e));let o,s;if(Array.isArray(e)){if(e.length===2)o=e[0],s=e[1];else throw TypeError(`Expected [key, value] tuple: ${e}`)}else if(e&&e instanceof Object){let t=Object.keys(e);if(t.length===1)o=t[0],s=e[o];else throw TypeError(`Expected tuple with one key, not ${t.length} keys`)}else o=e;i.items.push(Qe(o,s,n))}return i}const Et={collection:`seq`,default:!1,tag:`tag:yaml.org,2002:pairs`,resolve:wt,createNode:Tt};var Dt=class e extends q{constructor(){super(),this.add=K.prototype.add.bind(this),this.delete=K.prototype.delete.bind(this),this.get=K.prototype.get.bind(this),this.has=K.prototype.has.bind(this),this.set=K.prototype.set.bind(this),this.tag=e.tag}toJSON(e,t){if(!t)return super.toJSON(e);let n=new Map;t?.onCreate&&t.onCreate(n);for(let e of this.items){let r,i;if(O(e)?(r=R(e.key,``,t),i=R(e.value,r,t)):r=R(e,``,t),n.has(r))throw Error(`Ordered maps must not include duplicate keys`);n.set(r,i)}return n}static from(e,t,n){let r=Tt(e,t,n),i=new this;return i.items=r.items,i}};Dt.tag=`tag:yaml.org,2002:omap`;const Ot={collection:`seq`,identify:e=>e instanceof Map,nodeClass:Dt,default:!1,tag:`tag:yaml.org,2002:omap`,resolve(e,t){let n=wt(e,t),r=[];for(let{key:e}of n.items)k(e)&&(r.includes(e.value)?t(`Ordered maps must not include duplicate keys: ${e.value}`):r.push(e.value));return Object.assign(new Dt,n)},createNode:(e,t,n)=>Dt.from(e,t,n)};function kt({value:e,source:t},n){return t&&(e?At:jt).test.test(t)?t:e?n.options.trueStr:n.options.falseStr}const At={identify:e=>e===!0,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new z(!0),stringify:kt},jt={identify:e=>e===!1,default:!0,tag:`tag:yaml.org,2002:bool`,test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new z(!1),stringify:kt},Mt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:e=>e.slice(-3).toLowerCase()===`nan`?NaN:e[0]===`-`?-1/0:1/0,stringify:J},Nt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`EXP`,test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:e=>parseFloat(e.replace(/_/g,``)),stringify(e){let t=Number(e.value);return isFinite(t)?t.toExponential():J(e)}},Pt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(e){let t=new z(parseFloat(e.replace(/_/g,``))),n=e.indexOf(`.`);if(n!==-1){let r=e.substring(n+1).replace(/_/g,``);r[r.length-1]===`0`&&(t.minFractionDigits=r.length)}return t},stringify:J},Ft=e=>typeof e==`bigint`||Number.isInteger(e);function It(e,t,n,{intAsBigInt:r}){let i=e[0];if((i===`-`||i===`+`)&&(t+=1),e=e.substring(t).replace(/_/g,``),r){switch(n){case 2:e=`0b${e}`;break;case 8:e=`0o${e}`;break;case 16:e=`0x${e}`}let t=BigInt(e);return i===`-`?BigInt(-1)*t:t}let a=parseInt(e,n);return i===`-`?-1*a:a}function Lt(e,t,n){let{value:r}=e;if(Ft(r)){let e=r.toString(t);return r<0?`-`+n+e.substr(1):n+e}return J(e)}const Rt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`BIN`,test:/^[-+]?0b[0-1_]+$/,resolve:(e,t,n)=>It(e,2,2,n),stringify:e=>Lt(e,2,`0b`)},zt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`OCT`,test:/^[-+]?0[0-7_]+$/,resolve:(e,t,n)=>It(e,1,8,n),stringify:e=>Lt(e,8,`0`)},Bt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,test:/^[-+]?[0-9][0-9_]*$/,resolve:(e,t,n)=>It(e,0,10,n),stringify:J},Vt={identify:Ft,default:!0,tag:`tag:yaml.org,2002:int`,format:`HEX`,test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(e,t,n)=>It(e,2,16,n),stringify:e=>Lt(e,16,`0x`)};var Ht=class e extends K{constructor(t){super(t),this.tag=e.tag}add(e){let t;t=O(e)?e:e&&typeof e==`object`&&`key`in e&&`value`in e&&e.value===null?new W(e.key,null):new W(e,null),G(this.items,t.key)||this.items.push(t)}get(e,t){let n=G(this.items,e);return!t&&O(n)?k(n.key)?n.key.value:n.key:n}set(e,t){if(typeof t!=`boolean`)throw Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof t}`);let n=G(this.items,e);n&&!t?this.items.splice(this.items.indexOf(n),1):!n&&t&&this.items.push(new W(e))}toJSON(e,t){return super.toJSON(e,t,Set)}toString(e,t,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),t,n);throw Error(`Set items must all have null values`)}static from(e,t,n){let{replacer:r}=n,i=new this(e);if(t&&Symbol.iterator in Object(t))for(let e of t)typeof r==`function`&&(e=r.call(t,e,e)),i.items.push(Qe(e,null,n));return i}};Ht.tag=`tag:yaml.org,2002:set`;const Ut={collection:`map`,identify:e=>e instanceof Set,nodeClass:Ht,default:!1,tag:`tag:yaml.org,2002:set`,createNode:(e,t,n)=>Ht.from(e,t,n),resolve(e,t){if(re(e)){if(e.hasAllNullValues(!0))return Object.assign(new Ht,e);t(`Set items must all have null values`)}else t(`Expected a mapping for this tag`);return e}};function Wt(e,t){let n=e[0],r=n===`-`||n===`+`?e.substring(1):e,i=e=>t?BigInt(e):Number(e),a=r.replace(/_/g,``).split(`:`).reduce((e,t)=>e*i(60)+i(t),i(0));return n===`-`?i(-1)*a:a}function Gt(e){let{value:t}=e,n=e=>e;if(typeof t==`bigint`)n=e=>BigInt(e);else if(isNaN(t)||!isFinite(t))return J(e);let r=``;t<0&&(r=`-`,t*=n(-1));let i=n(60),a=[t%i];return t<60?a.unshift(0):(t=(t-a[0])/i,a.unshift(t%i),t>=60&&(t=(t-a[0])/i,a.unshift(t))),r+a.map(e=>String(e).padStart(2,`0`)).join(`:`).replace(/000000\d*$/,``)}const Kt={identify:e=>typeof e==`bigint`||Number.isInteger(e),default:!0,tag:`tag:yaml.org,2002:int`,format:`TIME`,test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(e,t,{intAsBigInt:n})=>Wt(e,n),stringify:Gt},qt={identify:e=>typeof e==`number`,default:!0,tag:`tag:yaml.org,2002:float`,format:`TIME`,test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:e=>Wt(e,!1),stringify:Gt},Jt={identify:e=>e instanceof Date,default:!0,tag:`tag:yaml.org,2002:timestamp`,test:RegExp(`^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$`),resolve(e){let t=e.match(Jt.test);if(!t)throw Error(`!!timestamp expects a date, starting with yyyy-mm-dd`);let[,n,r,i,a,o,s]=t.map(Number),c=t[7]?Number((t[7]+`00`).substr(1,3)):0,l=Date.UTC(n,r-1,i,a||0,o||0,s||0,c),u=t[8];if(u&&u!==`Z`){let e=Wt(u,!1);Math.abs(e)<30&&(e*=60),l-=6e4*e}return new Date(l)},stringify:({value:e})=>e?.toISOString().replace(/(T00:00:00)?\.000Z$/,``)??``},Yt=[rt,at,ot,st,At,jt,Rt,zt,Bt,Vt,Mt,Nt,Pt,Ct,U,Ot,Et,Ut,Kt,qt,Jt],Xt=new Map([[`core`,vt],[`failsafe`,[rt,at,ot]],[`json`,St],[`yaml11`,Yt],[`yaml-1.1`,Yt]]),Zt={binary:Ct,bool:ct,float:dt,floatExp:ut,floatNaN:lt,floatTime:qt,int:gt,intHex:_t,intOct:ht,intTime:Kt,map:rt,merge:U,null:st,omap:Ot,pairs:Et,seq:at,set:Ut,timestamp:Jt},Qt={"tag:yaml.org,2002:binary":Ct,"tag:yaml.org,2002:merge":U,"tag:yaml.org,2002:omap":Ot,"tag:yaml.org,2002:pairs":Et,"tag:yaml.org,2002:set":Ut,"tag:yaml.org,2002:timestamp":Jt};function $t(e,t,n){let r=Xt.get(t);if(r&&!e)return n&&!r.includes(U)?r.concat(U):r.slice();let i=r;if(!i){if(Array.isArray(e))i=[];else{let e=Array.from(Xt.keys()).filter(e=>e!==`yaml11`).map(e=>JSON.stringify(e)).join(`, `);throw Error(`Unknown schema "${t}"; use one of ${e} or define customTags array`)}}if(Array.isArray(e))for(let t of e)i=i.concat(t);else typeof e==`function`&&(i=e(i.slice()));return n&&(i=i.concat(U)),i.reduce((e,t)=>{let n=typeof t==`string`?Zt[t]:t;if(!n){let e=JSON.stringify(t),n=Object.keys(Zt).map(e=>JSON.stringify(e)).join(`, `);throw Error(`Unknown custom tag ${e}; use one of ${n}`)}return e.includes(n)||e.push(n),e},[])}const en=(e,t)=>e.key<t.key?-1:+(e.key>t.key);var tn=class e{constructor({compat:e,customTags:t,merge:n,resolveKnownTags:r,schema:i,sortMapEntries:a,toStringDefaults:o}){this.compat=Array.isArray(e)?$t(e,`compat`):e?$t(null,e):null,this.name=typeof i==`string`&&i||`core`,this.knownTags=r?Qt:{},this.tags=$t(t,this.name,n),this.toStringOptions=o??null,Object.defineProperty(this,C,{value:rt}),Object.defineProperty(this,w,{value:ot}),Object.defineProperty(this,ne,{value:at}),this.sortMapEntries=typeof a==`function`?a:a===!0?en:null}clone(){let t=Object.create(e.prototype,Object.getOwnPropertyDescriptors(this));return t.tags=this.tags.slice(),t}};function nn(e,t){let n=[],r=t.directives===!0;if(t.directives!==!1&&e.directives){let t=e.directives.toString(e);t?(n.push(t),r=!0):e.directives.docStart&&(r=!0)}r&&n.push(`---`);let i=Ve(e,t),{commentString:a}=i.options;if(e.commentBefore){n.length!==1&&n.unshift(``);let t=a(e.commentBefore);n.unshift(B(t,``))}let o=!1,s=null;if(e.contents){if(j(e.contents)){if(e.contents.spaceBefore&&r&&n.push(``),e.contents.commentBefore){let t=a(e.contents.commentBefore);n.push(B(t,``))}i.forceBlockIndent=!!e.comment,s=e.contents.comment}let t=s?void 0:()=>o=!0,c=H(e.contents,i,()=>s=null,t);s&&(c+=V(c,``,a(s))),(c[0]===`|`||c[0]===`>`)&&n[n.length-1]===`---`?n[n.length-1]=`--- ${c}`:n.push(c)}else n.push(H(e.contents,i));if(e.directives?.docEnd){if(e.comment){let t=a(e.comment);t.includes(`
39
- `)?(n.push(`...`),n.push(B(t,``))):n.push(`... ${t}`)}else n.push(`...`)}else{let t=e.comment;t&&o&&(t=t.replace(/^\n+/,``)),t&&((!o||s)&&n[n.length-1]!==``&&n.push(``),n.push(B(a(t),``)))}return n.join(`
40
- `)+`
41
- `}var rn=class e{constructor(e,t,n){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,T,{value:ee});let r=null;typeof t==`function`||Array.isArray(t)?r=t:n===void 0&&t&&(n=t,t=void 0);let i=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:`warn`,prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:`1.2`},n);this.options=i;let{version:a}=i;n?._directives?(this.directives=n._directives.atDocument(),this.directives.yaml.explicit&&(a=this.directives.yaml.version)):this.directives=new L({version:a}),this.setSchema(a,n),this.contents=e===void 0?null:this.createNode(e,r,n)}clone(){let t=Object.create(e.prototype,{[T]:{value:ee}});return t.commentBefore=this.commentBefore,t.comment=this.comment,t.errors=this.errors.slice(),t.warnings=this.warnings.slice(),t.options=Object.assign({},this.options),this.directives&&(t.directives=this.directives.clone()),t.schema=this.schema.clone(),t.contents=j(this.contents)?this.contents.clone(t.schema):this.contents,this.range&&(t.range=this.range.slice()),t}add(e){an(this.contents)&&this.contents.add(e)}addIn(e,t){an(this.contents)&&this.contents.addIn(e,t)}createAlias(e,t){if(!e.anchor){let n=me(this);e.anchor=!t||n.has(t)?he(t||`a`,n):t}return new ye(e.anchor)}createNode(e,t,n){let r;if(typeof t==`function`)e=t.call({"":e},``,e),r=t;else if(Array.isArray(t)){let e=t.filter(e=>typeof e==`number`||e instanceof String||e instanceof Number).map(String);e.length>0&&(t=t.concat(e)),r=t}else n===void 0&&t&&(n=t,t=void 0);let{aliasDuplicateObjects:i,anchorPrefix:a,flow:o,keepUndefined:s,onTagObj:c,tag:l}=n??{},{onAnchor:u,setAnchors:d,sourceObjects:f}=ge(this,a||`a`),p={aliasDuplicateObjects:i??!0,keepUndefined:s??!1,onAnchor:u,onTagObj:c,replacer:r,schema:this.schema,sourceObjects:f},m=Ce(e,l,p);return o&&A(m)&&(m.flow=!0),d(),m}createPair(e,t,n={}){return new W(this.createNode(e,null,n),this.createNode(t,null,n))}delete(e){return an(this.contents)?this.contents.delete(e):!1}deleteIn(e){return Te(e)?this.contents!=null&&(this.contents=null,!0):an(this.contents)?this.contents.deleteIn(e):!1}get(e,t){return A(this.contents)?this.contents.get(e,t):void 0}getIn(e,t){return Te(e)?!t&&k(this.contents)?this.contents.value:this.contents:A(this.contents)?this.contents.getIn(e,t):void 0}has(e){return A(this.contents)?this.contents.has(e):!1}hasIn(e){return Te(e)?this.contents!==void 0:A(this.contents)?this.contents.hasIn(e):!1}set(e,t){this.contents==null?this.contents=we(this.schema,[e],t):an(this.contents)&&this.contents.set(e,t)}setIn(e,t){Te(e)?this.contents=t:this.contents==null?this.contents=we(this.schema,Array.from(e),t):an(this.contents)&&this.contents.setIn(e,t)}setSchema(e,t={}){typeof e==`number`&&(e=String(e));let n;switch(e){case`1.1`:this.directives?this.directives.yaml.version=`1.1`:this.directives=new L({version:`1.1`}),n={resolveKnownTags:!1,schema:`yaml-1.1`};break;case`1.2`:case`next`:this.directives?this.directives.yaml.version=e:this.directives=new L({version:e}),n={resolveKnownTags:!0,schema:`core`};break;case null:this.directives&&delete this.directives,n=null;break;default:{let t=JSON.stringify(e);throw Error(`Expected '1.1', '1.2' or null as first argument, but found: ${t}`)}}if(t.schema instanceof Object)this.schema=t.schema;else if(n)this.schema=new tn(Object.assign(n,t));else throw Error(`With a null YAML version, the { schema: Schema } option is required`)}toJS({json:e,jsonArg:t,mapAsMap:n,maxAliasCount:r,onAnchor:i,reviver:a}={}){let o={anchors:new Map,doc:this,keep:!e,mapAsMap:n===!0,mapKeyWarned:!1,maxAliasCount:typeof r==`number`?r:100},s=R(this.contents,t??``,o);if(typeof i==`function`)for(let{count:e,res:t}of o.anchors.values())i(t,e);return typeof a==`function`?_e(a,{"":s},``,s):s}toJSON(e,t){return this.toJS({json:!0,jsonArg:e,mapAsMap:!1,onAnchor:t})}toString(e={}){if(this.errors.length>0)throw Error(`Document with errors cannot be stringified`);if(`indent`in e&&(!Number.isInteger(e.indent)||Number(e.indent)<=0)){let t=JSON.stringify(e.indent);throw Error(`"indent" option must be a positive integer, not ${t}`)}return nn(this,e)}};function an(e){if(A(e))return!0;throw Error(`Expected a YAML collection as document contents`)}var on=class extends Error{constructor(e,t,n,r){super(),this.name=e,this.code=n,this.message=r,this.pos=t}},Y=class extends on{constructor(e,t,n){super(`YAMLParseError`,e,t,n)}},sn=class extends on{constructor(e,t,n){super(`YAMLWarning`,e,t,n)}};const cn=(e,t)=>n=>{if(n.pos[0]===-1)return;n.linePos=n.pos.map(e=>t.linePos(e));let{line:r,col:i}=n.linePos[0];n.message+=` at line ${r}, column ${i}`;let a=i-1,o=e.substring(t.lineStarts[r-1],t.lineStarts[r]).replace(/[\n\r]+$/,``);if(a>=60&&o.length>80){let e=Math.min(a-39,o.length-79);o=`…`+o.substring(e),a-=e-1}if(o.length>80&&(o=o.substring(0,79)+`…`),r>1&&/^ *$/.test(o.substring(0,a))){let n=e.substring(t.lineStarts[r-2],t.lineStarts[r-1]);n.length>80&&(n=n.substring(0,79)+`…
42
- `),o=n+o}if(/[^ ]/.test(o)){let e=1,t=n.linePos[1];t?.line===r&&t.col>i&&(e=Math.max(1,Math.min(t.col-i,80-a)));let s=` `.repeat(a)+`^`.repeat(e);n.message+=`:\n\n${o}\n${s}\n`}};function ln(e,{flow:t,indicator:n,next:r,offset:i,onError:a,parentIndent:o,startOnNewline:s}){let c=!1,l=s,u=s,d=``,f=``,p=!1,m=!1,h=null,g=null,_=null,v=null,y=null,b=null,x=null;for(let i of e)switch(m&&=(i.type!==`space`&&i.type!==`newline`&&i.type!==`comma`&&a(i.offset,`MISSING_CHAR`,`Tags and anchors must be separated from the next token by white space`),!1),h&&=(l&&i.type!==`comment`&&i.type!==`newline`&&a(h,`TAB_AS_INDENT`,`Tabs are not allowed as indentation`),null),i.type){case`space`:!t&&(n!==`doc-start`||r?.type!==`flow-collection`)&&i.source.includes(` `)&&(h=i),u=!0;break;case`comment`:{u||a(i,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`);let e=i.source.substring(1)||` `;d?d+=f+e:d=e,f=``,l=!1;break}case`newline`:l?d?d+=i.source:(!b||n!==`seq-item-ind`)&&(c=!0):f+=i.source,l=!0,p=!0,(g||_)&&(v=i),u=!0;break;case`anchor`:g&&a(i,`MULTIPLE_ANCHORS`,`A node can have at most one anchor`),i.source.endsWith(`:`)&&a(i.offset+i.source.length-1,`BAD_ALIAS`,`Anchor ending in : is ambiguous`,!0),g=i,x??=i.offset,l=!1,u=!1,m=!0;break;case`tag`:_&&a(i,`MULTIPLE_TAGS`,`A node can have at most one tag`),_=i,x??=i.offset,l=!1,u=!1,m=!0;break;case n:(g||_)&&a(i,`BAD_PROP_ORDER`,`Anchors and tags must be after the ${i.source} indicator`),b&&a(i,`UNEXPECTED_TOKEN`,`Unexpected ${i.source} in ${t??`collection`}`),b=i,l=n===`seq-item-ind`||n===`explicit-key-ind`,u=!1;break;case`comma`:if(t){y&&a(i,`UNEXPECTED_TOKEN`,`Unexpected , in ${t}`),y=i,l=!1,u=!1;break}default:a(i,`UNEXPECTED_TOKEN`,`Unexpected ${i.type} token`),l=!1,u=!1}let S=e[e.length-1],ee=S?S.offset+S.source.length:i;return m&&r&&r.type!==`space`&&r.type!==`newline`&&r.type!==`comma`&&(r.type!==`scalar`||r.source!==``)&&a(r.offset,`MISSING_CHAR`,`Tags and anchors must be separated from the next token by white space`),h&&(l&&h.indent<=o||r?.type===`block-map`||r?.type===`block-seq`)&&a(h,`TAB_AS_INDENT`,`Tabs are not allowed as indentation`),{comma:y,found:b,spaceBefore:c,comment:d,hasNewline:p,anchor:g,tag:_,newlineAfterProp:v,end:ee,start:x??ee}}function un(e){if(!e)return null;switch(e.type){case`alias`:case`scalar`:case`double-quoted-scalar`:case`single-quoted-scalar`:if(e.source.includes(`
43
- `))return!0;if(e.end){for(let t of e.end)if(t.type===`newline`)return!0}return!1;case`flow-collection`:for(let t of e.items){for(let e of t.start)if(e.type===`newline`)return!0;if(t.sep){for(let e of t.sep)if(e.type===`newline`)return!0}if(un(t.key)||un(t.value))return!0}return!1;default:return!0}}function dn(e,t,n){if(t?.type===`flow-collection`){let r=t.end[0];r.indent===e&&(r.source===`]`||r.source===`}`)&&un(t)&&n(r,`BAD_INDENT`,`Flow end indicator should be more indented than parent`,!0)}}function fn(e,t,n){let{uniqueKeys:r}=e.options;if(r===!1)return!1;let i=typeof r==`function`?r:(e,t)=>e===t||k(e)&&k(t)&&e.value===t.value;return t.some(e=>i(e.key,n))}const pn=`All mapping items must start at the same column`;function mn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=new((a?.nodeClass)??K)(n.schema);n.atRoot&&=!1;let s=r.offset,c=null;for(let a of r.items){let{start:l,key:u,sep:d,value:f}=a,p=ln(l,{indicator:`explicit-key-ind`,next:u??d?.[0],offset:s,onError:i,parentIndent:r.indent,startOnNewline:!0}),m=!p.found;if(m){if(u&&(u.type===`block-seq`?i(s,`BLOCK_AS_IMPLICIT_KEY`,`A block sequence may not be used as an implicit map key`):`indent`in u&&u.indent!==r.indent&&i(s,`BAD_INDENT`,pn)),!p.anchor&&!p.tag&&!d){c=p.end,p.comment&&(o.comment?o.comment+=`
44
- `+p.comment:o.comment=p.comment);continue}(p.newlineAfterProp||un(u))&&i(u??l[l.length-1],`MULTILINE_IMPLICIT_KEY`,`Implicit keys need to be on a single line`)}else p.found?.indent!==r.indent&&i(s,`BAD_INDENT`,pn);n.atKey=!0;let h=p.end,g=u?e(n,u,p,i):t(n,h,l,null,p,i);n.schema.compat&&dn(r.indent,u,i),n.atKey=!1,fn(n,o.items,g)&&i(h,`DUPLICATE_KEY`,`Map keys must be unique`);let _=ln(d??[],{indicator:`map-value-ind`,next:f,offset:g.range[2],onError:i,parentIndent:r.indent,startOnNewline:!u||u.type===`block-scalar`});if(s=_.end,_.found){m&&(f?.type===`block-map`&&!_.hasNewline&&i(s,`BLOCK_AS_IMPLICIT_KEY`,`Nested mappings are not allowed in compact mappings`),n.options.strict&&p.start<_.found.offset-1024&&i(g.range,`KEY_OVER_1024_CHARS`,`The : indicator must be at most 1024 chars after the start of an implicit block mapping key`));let c=f?e(n,f,_,i):t(n,s,d,null,_,i);n.schema.compat&&dn(r.indent,f,i),s=c.range[2];let l=new W(g,c);n.options.keepSourceTokens&&(l.srcToken=a),o.items.push(l)}else{m&&i(g.range,`MISSING_CHAR`,`Implicit map keys need to be followed by map values`),_.comment&&(g.comment?g.comment+=`
45
- `+_.comment:g.comment=_.comment);let e=new W(g);n.options.keepSourceTokens&&(e.srcToken=a),o.items.push(e)}}return c&&c<s&&i(c,`IMPOSSIBLE`,`Map comment with trailing content`),o.range=[r.offset,s,c??s],o}function hn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=new((a?.nodeClass)??q)(n.schema);n.atRoot&&=!1,n.atKey&&=!1;let s=r.offset,c=null;for(let{start:a,value:l}of r.items){let u=ln(a,{indicator:`seq-item-ind`,next:l,offset:s,onError:i,parentIndent:r.indent,startOnNewline:!0});if(!u.found){if(u.anchor||u.tag||l)l?.type===`block-seq`?i(u.end,`BAD_INDENT`,`All sequence items must start at the same column`):i(s,`MISSING_CHAR`,`Sequence item without - indicator`);else{c=u.end,u.comment&&(o.comment=u.comment);continue}}let d=l?e(n,l,u,i):t(n,u.end,a,null,u,i);n.schema.compat&&dn(r.indent,l,i),s=d.range[2],o.items.push(d)}return o.range=[r.offset,s,c??s],o}function gn(e,t,n,r){let i=``;if(e){let a=!1,o=``;for(let s of e){let{source:e,type:c}=s;switch(c){case`space`:a=!0;break;case`comment`:{n&&!a&&r(s,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`);let t=e.substring(1)||` `;i?i+=o+t:i=t,o=``;break}case`newline`:i&&(o+=e),a=!0;break;default:r(s,`UNEXPECTED_TOKEN`,`Unexpected ${c} at node end`)}t+=e.length}}return{comment:i,offset:t}}const _n=`Block collections are not allowed within flow collections`,vn=e=>e&&(e.type===`block-map`||e.type===`block-seq`);function yn({composeNode:e,composeEmptyNode:t},n,r,i,a){let o=r.start.source===`{`,s=o?`flow map`:`flow sequence`,c=new((a?.nodeClass)??(o?K:q))(n.schema);c.flow=!0;let l=n.atRoot;l&&(n.atRoot=!1),n.atKey&&=!1;let u=r.offset+r.start.source.length;for(let a=0;a<r.items.length;++a){let l=r.items[a],{start:d,key:f,sep:p,value:m}=l,h=ln(d,{flow:s,indicator:`explicit-key-ind`,next:f??p?.[0],offset:u,onError:i,parentIndent:r.indent,startOnNewline:!1});if(!h.found){if(!h.anchor&&!h.tag&&!p&&!m){a===0&&h.comma?i(h.comma,`UNEXPECTED_TOKEN`,`Unexpected , in ${s}`):a<r.items.length-1&&i(h.start,`UNEXPECTED_TOKEN`,`Unexpected empty item in ${s}`),h.comment&&(c.comment?c.comment+=`
46
- `+h.comment:c.comment=h.comment),u=h.end;continue}!o&&n.options.strict&&un(f)&&i(f,`MULTILINE_IMPLICIT_KEY`,`Implicit keys of flow sequence pairs need to be on a single line`)}if(a===0)h.comma&&i(h.comma,`UNEXPECTED_TOKEN`,`Unexpected , in ${s}`);else if(h.comma||i(h.start,`MISSING_CHAR`,`Missing , between ${s} items`),h.comment){let e=``;loop:for(let t of d)switch(t.type){case`comma`:case`space`:break;case`comment`:e=t.source.substring(1);break loop;default:break loop}if(e){let t=c.items[c.items.length-1];O(t)&&(t=t.value??t.key),t.comment?t.comment+=`
47
- `+e:t.comment=e,h.comment=h.comment.substring(e.length+1)}}if(!o&&!p&&!h.found){let r=m?e(n,m,h,i):t(n,h.end,p,null,h,i);c.items.push(r),u=r.range[2],vn(m)&&i(r.range,`BLOCK_IN_FLOW`,_n)}else{n.atKey=!0;let a=h.end,g=f?e(n,f,h,i):t(n,a,d,null,h,i);vn(f)&&i(g.range,`BLOCK_IN_FLOW`,_n),n.atKey=!1;let _=ln(p??[],{flow:s,indicator:`map-value-ind`,next:m,offset:g.range[2],onError:i,parentIndent:r.indent,startOnNewline:!1});if(_.found){if(!o&&!h.found&&n.options.strict){if(p)for(let e of p){if(e===_.found)break;if(e.type===`newline`){i(e,`MULTILINE_IMPLICIT_KEY`,`Implicit keys of flow sequence pairs need to be on a single line`);break}}h.start<_.found.offset-1024&&i(_.found,`KEY_OVER_1024_CHARS`,`The : indicator must be at most 1024 chars after the start of an implicit flow sequence key`)}}else m&&(`source`in m&&m.source?.[0]===`:`?i(m,`MISSING_CHAR`,`Missing space after : in ${s}`):i(_.start,`MISSING_CHAR`,`Missing , or : between ${s} items`));let v=m?e(n,m,_,i):_.found?t(n,_.end,p,null,_,i):null;v?vn(m)&&i(v.range,`BLOCK_IN_FLOW`,_n):_.comment&&(g.comment?g.comment+=`
48
- `+_.comment:g.comment=_.comment);let y=new W(g,v);if(n.options.keepSourceTokens&&(y.srcToken=l),o){let e=c;fn(n,e.items,g)&&i(a,`DUPLICATE_KEY`,`Map keys must be unique`),e.items.push(y)}else{let e=new K(n.schema);e.flow=!0,e.items.push(y);let t=(v??g).range;e.range=[g.range[0],t[1],t[2]],c.items.push(e)}u=v?v.range[2]:_.end}}let d=o?`}`:`]`,[f,...p]=r.end,m=u;if(f?.source===d)m=f.offset+f.source.length;else{let e=s[0].toUpperCase()+s.substring(1),t=l?`${e} must end with a ${d}`:`${e} in block collection must be sufficiently indented and end with a ${d}`;i(u,l?`MISSING_CHAR`:`BAD_INDENT`,t),f&&f.source.length!==1&&p.unshift(f)}if(p.length>0){let e=gn(p,m,n.options.strict,i);e.comment&&(c.comment?c.comment+=`
49
- `+e.comment:c.comment=e.comment),c.range=[r.offset,m,e.offset]}else c.range=[r.offset,m,m];return c}function bn(e,t,n,r,i,a){let o=n.type===`block-map`?mn(e,t,n,r,a):n.type===`block-seq`?hn(e,t,n,r,a):yn(e,t,n,r,a),s=o.constructor;return i===`!`||i===s.tagName?(o.tag=s.tagName,o):(i&&(o.tag=i),o)}function xn(e,t,n,r,i){let a=r.tag,o=a?t.directives.tagName(a.source,e=>i(a,`TAG_RESOLVE_FAILED`,e)):null;if(n.type===`block-seq`){let{anchor:e,newlineAfterProp:t}=r,n=e&&a?e.offset>a.offset?e:a:e??a;n&&(!t||t.offset<n.offset)&&i(n,`MISSING_CHAR`,`Missing newline after block sequence props`)}let s=n.type===`block-map`?`map`:n.type===`block-seq`?`seq`:n.start.source===`{`?`map`:`seq`;if(!a||!o||o===`!`||o===K.tagName&&s===`map`||o===q.tagName&&s===`seq`)return bn(e,t,n,i,o);let c=t.schema.tags.find(e=>e.tag===o&&e.collection===s);if(!c){let r=t.schema.knownTags[o];if(r?.collection===s)t.schema.tags.push(Object.assign({},r,{default:!1})),c=r;else return r?i(a,`BAD_COLLECTION_TYPE`,`${r.tag} used for ${s} collection, but expects ${r.collection??`scalar`}`,!0):i(a,`TAG_RESOLVE_FAILED`,`Unresolved tag: ${o}`,!0),bn(e,t,n,i,o)}let l=bn(e,t,n,i,o,c),u=c.resolve?.(l,e=>i(a,`TAG_RESOLVE_FAILED`,e),t.options)??l,d=j(u)?u:new z(u);return d.range=l.range,d.tag=o,c?.format&&(d.format=c.format),d}function Sn(e,t,n){let r=t.offset,i=Cn(t,e.options.strict,n);if(!i)return{value:``,type:null,comment:``,range:[r,r,r]};let a=i.mode===`>`?z.BLOCK_FOLDED:z.BLOCK_LITERAL,o=t.source?wn(t.source):[],s=o.length;for(let e=o.length-1;e>=0;--e){let t=o[e][1];if(t===``||t===`\r`)s=e;else break}if(s===0){let e=i.chomp===`+`&&o.length>0?`
50
- `.repeat(Math.max(1,o.length-1)):``,n=r+i.length;return t.source&&(n+=t.source.length),{value:e,type:a,comment:i.comment,range:[r,n,n]}}let c=t.indent+i.indent,l=t.offset+i.length,u=0;for(let t=0;t<s;++t){let[r,a]=o[t];if(a===``||a===`\r`)i.indent===0&&r.length>c&&(c=r.length);else{r.length<c&&n(l+r.length,`MISSING_CHAR`,`Block scalars with more-indented leading empty lines must use an explicit indentation indicator`),i.indent===0&&(c=r.length),u=t,c===0&&!e.atRoot&&n(l,`BAD_INDENT`,`Block scalar values in collections must be indented`);break}l+=r.length+a.length+1}for(let e=o.length-1;e>=s;--e)o[e][0].length>c&&(s=e+1);let d=``,f=``,p=!1;for(let e=0;e<u;++e)d+=o[e][0].slice(c)+`
51
- `;for(let e=u;e<s;++e){let[t,r]=o[e];l+=t.length+r.length+1;let s=r[r.length-1]===`\r`;if(s&&(r=r.slice(0,-1)),r&&t.length<c){let e=`Block scalar lines must not be less indented than their ${i.indent?`explicit indentation indicator`:`first line`}`;n(l-r.length-(s?2:1),`BAD_INDENT`,e),t=``}a===z.BLOCK_LITERAL?(d+=f+t.slice(c)+r,f=`
52
- `):t.length>c||r[0]===` `?(f===` `?f=`
53
- `:!p&&f===`
54
- `&&(f=`
55
-
56
- `),d+=f+t.slice(c)+r,f=`
57
- `,p=!0):r===``?f===`
58
- `?d+=`
59
- `:f=`
60
- `:(d+=f+r,f=` `,p=!1)}switch(i.chomp){case`-`:break;case`+`:for(let e=s;e<o.length;++e)d+=`
61
- `+o[e][0].slice(c);d[d.length-1]!==`
62
- `&&(d+=`
63
- `);break;default:d+=`
64
- `}let m=r+i.length+t.source.length;return{value:d,type:a,comment:i.comment,range:[r,m,m]}}function Cn({offset:e,props:t},n,r){if(t[0].type!==`block-scalar-header`)return r(t[0],`IMPOSSIBLE`,`Block scalar header not found`),null;let{source:i}=t[0],a=i[0],o=0,s=``,c=-1;for(let t=1;t<i.length;++t){let n=i[t];if(!s&&(n===`-`||n===`+`))s=n;else{let r=Number(n);!o&&r?o=r:c===-1&&(c=e+t)}}c!==-1&&r(c,`UNEXPECTED_TOKEN`,`Block scalar header includes extra characters: ${i}`);let l=!1,u=``,d=i.length;for(let e=1;e<t.length;++e){let i=t[e];switch(i.type){case`space`:l=!0;case`newline`:d+=i.source.length;break;case`comment`:n&&!l&&r(i,`MISSING_CHAR`,`Comments must be separated from other tokens by white space characters`),d+=i.source.length,u=i.source.substring(1);break;case`error`:r(i,`UNEXPECTED_TOKEN`,i.message),d+=i.source.length;break;default:{r(i,`UNEXPECTED_TOKEN`,`Unexpected token in block scalar header: ${i.type}`);let e=i.source;e&&typeof e==`string`&&(d+=e.length)}}}return{mode:a,indent:o,chomp:s,comment:u,length:d}}function wn(e){let t=e.split(/\n( *)/),n=t[0],r=n.match(/^( *)/),i=[r?.[1]?[r[1],n.slice(r[1].length)]:[``,n]];for(let e=1;e<t.length;e+=2)i.push([t[e],t[e+1]]);return i}function Tn(e,t,n){let{offset:r,type:i,source:a,end:o}=e,s,c,l=(e,t,i)=>n(r+e,t,i);switch(i){case`scalar`:s=z.PLAIN,c=En(a,l);break;case`single-quoted-scalar`:s=z.QUOTE_SINGLE,c=Dn(a,l);break;case`double-quoted-scalar`:s=z.QUOTE_DOUBLE,c=kn(a,l);break;default:return n(e,`UNEXPECTED_TOKEN`,`Expected a flow scalar value, but found: ${i}`),{value:``,type:null,comment:``,range:[r,r+a.length,r+a.length]}}let u=r+a.length,d=gn(o,u,t,n);return{value:c,type:s,comment:d.comment,range:[r,u,d.offset]}}function En(e,t){let n=``;switch(e[0]){case` `:n=`a tab character`;break;case`,`:n=`flow indicator character ,`;break;case`%`:n=`directive indicator character %`;break;case`|`:case`>`:n=`block scalar indicator ${e[0]}`;break;case`@`:case"`":n=`reserved character ${e[0]}`}return n&&t(0,`BAD_SCALAR_START`,`Plain value cannot start with ${n}`),On(e)}function Dn(e,t){return(e[e.length-1]!==`'`||e.length===1)&&t(e.length,`MISSING_CHAR`,`Missing closing 'quote`),On(e.slice(1,-1)).replace(/''/g,`'`)}function On(e){let t,n;try{t=RegExp(`(.*?)(?<![ ])[ ]*\r?
65
- `,`sy`),n=RegExp(`[ ]*(.*?)(?:(?<![ ])[ ]*)?\r?
66
- `,`sy`)}catch{t=/(.*?)[ \t]*\r?\n/sy,n=/[ \t]*(.*?)[ \t]*\r?\n/sy}let r=t.exec(e);if(!r)return e;let i=r[1],a=` `,o=t.lastIndex;for(n.lastIndex=o;r=n.exec(e);)r[1]===``?a===`
67
- `?i+=a:a=`
68
- `:(i+=a+r[1],a=` `),o=n.lastIndex;let s=/[ \t]*(.*)/sy;return s.lastIndex=o,r=s.exec(e),i+a+(r?.[1]??``)}function kn(e,t){let n=``;for(let r=1;r<e.length-1;++r){let i=e[r];if(i!==`\r`||e[r+1]!==`
69
- `){if(i===`
70
- `){let{fold:t,offset:i}=An(e,r);n+=t,r=i}else if(i===`\\`){let i=e[++r],a=jn[i];if(a)n+=a;else if(i===`
71
- `)for(i=e[r+1];i===` `||i===` `;)i=e[++r+1];else if(i===`\r`&&e[r+1]===`
72
- `)for(i=e[++r+1];i===` `||i===` `;)i=e[++r+1];else if(i===`x`||i===`u`||i===`U`){let a=i===`x`?2:i===`u`?4:8;n+=Mn(e,r+1,a,t),r+=a}else{let i=e.substr(r-1,2);t(r-1,`BAD_DQ_ESCAPE`,`Invalid escape sequence ${i}`),n+=i}}else if(i===` `||i===` `){let t=r,a=e[r+1];for(;a===` `||a===` `;)a=e[++r+1];a!==`
73
- `&&(a!==`\r`||e[r+2]!==`
74
- `)&&(n+=r>t?e.slice(t,r+1):i)}else n+=i}}return(e[e.length-1]!==`"`||e.length===1)&&t(e.length,`MISSING_CHAR`,`Missing closing "quote`),n}function An(e,t){let n=``,r=e[t+1];for(;(r===` `||r===` `||r===`
75
- `||r===`\r`)&&(r!==`\r`||e[t+2]===`
76
- `);)r===`
77
- `&&(n+=`
78
- `),t+=1,r=e[t+1];return n||=` `,{fold:n,offset:t}}const jn={0:`\0`,a:`\x07`,b:`\b`,e:`\x1B`,f:`\f`,n:`
79
- `,r:`\r`,t:` `,v:`\v`,N:`…`,_:`\xA0`,L:`\u2028`,P:`\u2029`," ":` `,'"':`"`,"/":`/`,"\\":`\\`," ":` `};function Mn(e,t,n,r){let i=e.substr(t,n),a=i.length===n&&/^[0-9a-fA-F]+$/.test(i)?parseInt(i,16):NaN;try{return String.fromCodePoint(a)}catch{let i=e.substr(t-2,n+2);return r(t-2,`BAD_DQ_ESCAPE`,`Invalid escape sequence ${i}`),i}}function Nn(e,t,n,r){let{value:i,type:a,comment:o,range:s}=t.type===`block-scalar`?Sn(e,t,r):Tn(t,e.options.strict,r),c=n?e.directives.tagName(n.source,e=>r(n,`TAG_RESOLVE_FAILED`,e)):null,l;l=e.options.stringKeys&&e.atKey?e.schema[w]:c?Pn(e.schema,i,c,n,r):t.type===`scalar`?Fn(e,i,t,r):e.schema[w];let u;try{let a=l.resolve(i,e=>r(n??t,`TAG_RESOLVE_FAILED`,e),e.options);u=k(a)?a:new z(a)}catch(e){let a=e instanceof Error?e.message:String(e);r(n??t,`TAG_RESOLVE_FAILED`,a),u=new z(i)}return u.range=s,u.source=i,a&&(u.type=a),c&&(u.tag=c),l.format&&(u.format=l.format),o&&(u.comment=o),u}function Pn(e,t,n,r,i){if(n===`!`)return e[w];let a=[];for(let t of e.tags)if(!t.collection&&t.tag===n){if(t.default&&t.test)a.push(t);else return t}for(let e of a)if(e.test?.test(t))return e;let o=e.knownTags[n];return o&&!o.collection?(e.tags.push(Object.assign({},o,{default:!1,test:void 0})),o):(i(r,`TAG_RESOLVE_FAILED`,`Unresolved tag: ${n}`,n!==`tag:yaml.org,2002:str`),e[w])}function Fn({atKey:e,directives:t,schema:n},r,i,a){let o=n.tags.find(t=>(t.default===!0||e&&t.default===`key`)&&t.test?.test(r))||n[w];if(n.compat){let e=n.compat.find(e=>e.default&&e.test?.test(r))??n[w];o.tag!==e.tag&&a(i,`TAG_RESOLVE_FAILED`,`Value may be parsed as either ${t.tagString(o.tag)} or ${t.tagString(e.tag)}`,!0)}return o}function In(e,t,n){if(t){n??=t.length;for(let r=n-1;r>=0;--r){let n=t[r];switch(n.type){case`space`:case`comment`:case`newline`:e-=n.source.length;continue}for(n=t[++r];n?.type===`space`;)e+=n.source.length,n=t[++r];break}}return e}const Ln={composeNode:Rn,composeEmptyNode:zn};function Rn(e,t,n,r){let i=e.atKey,{spaceBefore:a,comment:o,anchor:s,tag:c}=n,l,u=!0;switch(t.type){case`alias`:l=Bn(e,t,r),(s||c)&&r(t,`ALIAS_PROPS`,`An alias node must not specify any properties`);break;case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:case`block-scalar`:l=Nn(e,t,c,r),s&&(l.anchor=s.source.substring(1));break;case`block-map`:case`block-seq`:case`flow-collection`:try{l=xn(Ln,e,t,n,r),s&&(l.anchor=s.source.substring(1))}catch(e){r(t,`RESOURCE_EXHAUSTION`,e instanceof Error?e.message:String(e))}break;default:r(t,`UNEXPECTED_TOKEN`,t.type===`error`?t.message:`Unsupported token (type: ${t.type})`),u=!1}return l??=zn(e,t.offset,void 0,null,n,r),s&&l.anchor===``&&r(s,`BAD_ALIAS`,`Anchor cannot be an empty string`),i&&e.options.stringKeys&&(!k(l)||typeof l.value!=`string`||l.tag&&l.tag!==`tag:yaml.org,2002:str`)&&r(c??t,`NON_STRING_KEY`,`With stringKeys, all keys must be strings`),a&&(l.spaceBefore=!0),o&&(t.type===`scalar`&&t.source===``?l.comment=o:l.commentBefore=o),e.options.keepSourceTokens&&u&&(l.srcToken=t),l}function zn(e,t,n,r,{spaceBefore:i,comment:a,anchor:o,tag:s,end:c},l){let u=Nn(e,{type:`scalar`,offset:In(t,n,r),indent:-1,source:``},s,l);return o&&(u.anchor=o.source.substring(1),u.anchor===``&&l(o,`BAD_ALIAS`,`Anchor cannot be an empty string`)),i&&(u.spaceBefore=!0),a&&(u.comment=a,u.range[2]=c),u}function Bn({options:e},{offset:t,source:n,end:r},i){let a=new ye(n.substring(1));a.source===``&&i(t,`BAD_ALIAS`,`Alias cannot be an empty string`),a.source.endsWith(`:`)&&i(t+n.length-1,`BAD_ALIAS`,`Alias ending in : is ambiguous`,!0);let o=t+n.length,s=gn(r,o,e.strict,i);return a.range=[t,o,s.offset],s.comment&&(a.comment=s.comment),a}function Vn(e,t,{offset:n,start:r,value:i,end:a},o){let s=new rn(void 0,Object.assign({_directives:t},e)),c={atKey:!1,atRoot:!0,directives:s.directives,options:s.options,schema:s.schema},l=ln(r,{indicator:`doc-start`,next:i??a?.[0],offset:n,onError:o,parentIndent:0,startOnNewline:!0});l.found&&(s.directives.docStart=!0,i&&(i.type===`block-map`||i.type===`block-seq`)&&!l.hasNewline&&o(l.end,`MISSING_CHAR`,`Block collection cannot start on same line with directives-end marker`)),s.contents=i?Rn(c,i,l,o):zn(c,l.end,r,null,l,o);let u=s.contents.range[2],d=gn(a,u,!1,o);return d.comment&&(s.comment=d.comment),s.range=[n,u,d.offset],s}function Hn(e){if(typeof e==`number`)return[e,e+1];if(Array.isArray(e))return e.length===2?e:[e[0],e[1]];let{offset:t,source:n}=e;return[t,t+(typeof n==`string`?n.length:1)]}function Un(e){let t=``,n=!1,r=!1;for(let i=0;i<e.length;++i){let a=e[i];switch(a[0]){case`#`:t+=(t===``?``:r?`
80
-
81
- `:`
82
- `)+(a.substring(1)||` `),n=!0,r=!1;break;case`%`:e[i+1]?.[0]!==`#`&&(i+=1),n=!1;break;default:n||(r=!0),n=!1}}return{comment:t,afterEmptyLine:r}}var Wn=class{constructor(e={}){this.doc=null,this.atDirectives=!1,this.prelude=[],this.errors=[],this.warnings=[],this.onError=(e,t,n,r)=>{let i=Hn(e);r?this.warnings.push(new sn(i,t,n)):this.errors.push(new Y(i,t,n))},this.directives=new L({version:e.version||`1.2`}),this.options=e}decorate(e,t){let{comment:n,afterEmptyLine:r}=Un(this.prelude);if(n){let i=e.contents;if(t)e.comment=e.comment?`${e.comment}\n${n}`:n;else if(r||e.directives.docStart||!i)e.commentBefore=n;else if(A(i)&&!i.flow&&i.items.length>0){let e=i.items[0];O(e)&&(e=e.key);let t=e.commentBefore;e.commentBefore=t?`${n}\n${t}`:n}else{let e=i.commentBefore;i.commentBefore=e?`${n}\n${e}`:n}}if(t){for(let t=0;t<this.errors.length;++t)e.errors.push(this.errors[t]);for(let t=0;t<this.warnings.length;++t)e.warnings.push(this.warnings[t])}else e.errors=this.errors,e.warnings=this.warnings;this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:Un(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(e,t=!1,n=-1){for(let t of e)yield*this.next(t);yield*this.end(t,n)}*next(e){switch(e.type){case`directive`:this.directives.add(e.source,(t,n,r)=>{let i=Hn(e);i[0]+=t,this.onError(i,`BAD_DIRECTIVE`,n,r)}),this.prelude.push(e.source),this.atDirectives=!0;break;case`document`:{let t=Vn(this.options,this.directives,e,this.onError);this.atDirectives&&!t.directives.docStart&&this.onError(e,`MISSING_CHAR`,`Missing directives-end/doc-start indicator line`),this.decorate(t,!1),this.doc&&(yield this.doc),this.doc=t,this.atDirectives=!1;break}case`byte-order-mark`:case`space`:break;case`comment`:case`newline`:this.prelude.push(e.source);break;case`error`:{let t=e.source?`${e.message}: ${JSON.stringify(e.source)}`:e.message,n=new Y(Hn(e),`UNEXPECTED_TOKEN`,t);this.atDirectives||!this.doc?this.errors.push(n):this.doc.errors.push(n);break}case`doc-end`:{if(!this.doc){this.errors.push(new Y(Hn(e),`UNEXPECTED_TOKEN`,`Unexpected doc-end without preceding document`));break}this.doc.directives.docEnd=!0;let t=gn(e.end,e.offset+e.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),t.comment){let e=this.doc.comment;this.doc.comment=e?`${e}\n${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.push(new Y(Hn(e),`UNEXPECTED_TOKEN`,`Unsupported token ${e.type}`))}}*end(e=!1,t=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(e){let e=new rn(void 0,Object.assign({_directives:this.directives},this.options));this.atDirectives&&this.onError(t,`MISSING_CHAR`,`Missing directives-end indicator line`),e.range=[0,t,t],this.decorate(e,!1),yield e}}};function Gn(e,t=!0,n){if(e){let r=(e,t,r)=>{let i=typeof e==`number`?e:Array.isArray(e)?e[0]:e.offset;if(n)n(i,t,r);else throw new Y([i,i+1],t,r)};switch(e.type){case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return Tn(e,t,r);case`block-scalar`:return Sn({options:{strict:t}},e,r)}}return null}function Kn(e,t){let{implicitKey:n=!1,indent:r,inFlow:i=!1,offset:a=-1,type:o=`PLAIN`}=t,s=Be({type:o,value:e},{implicitKey:n,indent:r>0?` `.repeat(r):``,inFlow:i,options:{blockQuote:!0,lineWidth:-1}}),c=t.end??[{type:`newline`,offset:-1,indent:r,source:`
83
- `}];switch(s[0]){case`|`:case`>`:{let e=s.indexOf(`
84
- `),t=s.substring(0,e),n=s.substring(e+1)+`
85
- `,i=[{type:`block-scalar-header`,offset:a,indent:r,source:t}];return Yn(i,c)||i.push({type:`newline`,offset:-1,indent:r,source:`
86
- `}),{type:`block-scalar`,offset:a,indent:r,props:i,source:n}}case`"`:return{type:`double-quoted-scalar`,offset:a,indent:r,source:s,end:c};case`'`:return{type:`single-quoted-scalar`,offset:a,indent:r,source:s,end:c};default:return{type:`scalar`,offset:a,indent:r,source:s,end:c}}}function qn(e,t,n={}){let{afterKey:r=!1,implicitKey:i=!1,inFlow:a=!1,type:o}=n,s=`indent`in e?e.indent:null;if(r&&typeof s==`number`&&(s+=2),!o)switch(e.type){case`single-quoted-scalar`:o=`QUOTE_SINGLE`;break;case`double-quoted-scalar`:o=`QUOTE_DOUBLE`;break;case`block-scalar`:{let t=e.props[0];if(t.type!==`block-scalar-header`)throw Error(`Invalid block scalar header`);o=t.source[0]===`>`?`BLOCK_FOLDED`:`BLOCK_LITERAL`;break}default:o=`PLAIN`}let c=Be({type:o,value:t},{implicitKey:i||s===null,indent:s!==null&&s>0?` `.repeat(s):``,inFlow:a,options:{blockQuote:!0,lineWidth:-1}});switch(c[0]){case`|`:case`>`:Jn(e,c);break;case`"`:Xn(e,c,`double-quoted-scalar`);break;case`'`:Xn(e,c,`single-quoted-scalar`);break;default:Xn(e,c,`scalar`)}}function Jn(e,t){let n=t.indexOf(`
87
- `),r=t.substring(0,n),i=t.substring(n+1)+`
88
- `;if(e.type===`block-scalar`){let t=e.props[0];if(t.type!==`block-scalar-header`)throw Error(`Invalid block scalar header`);t.source=r,e.source=i}else{let{offset:t}=e,n=`indent`in e?e.indent:-1,a=[{type:`block-scalar-header`,offset:t,indent:n,source:r}];Yn(a,`end`in e?e.end:void 0)||a.push({type:`newline`,offset:-1,indent:n,source:`
89
- `});for(let t of Object.keys(e))t!==`type`&&t!==`offset`&&delete e[t];Object.assign(e,{type:`block-scalar`,indent:n,props:a,source:i})}}function Yn(e,t){if(t)for(let n of t)switch(n.type){case`space`:case`comment`:e.push(n);break;case`newline`:return e.push(n),!0}return!1}function Xn(e,t,n){switch(e.type){case`scalar`:case`double-quoted-scalar`:case`single-quoted-scalar`:e.type=n,e.source=t;break;case`block-scalar`:{let r=e.props.slice(1),i=t.length;e.props[0].type===`block-scalar-header`&&(i-=e.props[0].source.length);for(let e of r)e.offset+=i;delete e.props,Object.assign(e,{type:n,source:t,end:r});break}case`block-map`:case`block-seq`:{let r={type:`newline`,offset:e.offset+t.length,indent:e.indent,source:`
90
- `};delete e.items,Object.assign(e,{type:n,source:t,end:[r]});break}default:{let r=`indent`in e?e.indent:-1,i=`end`in e&&Array.isArray(e.end)?e.end.filter(e=>e.type===`space`||e.type===`comment`||e.type===`newline`):[];for(let t of Object.keys(e))t!==`type`&&t!==`offset`&&delete e[t];Object.assign(e,{type:n,indent:r,source:t,end:i})}}}const Zn=e=>`type`in e?Qn(e):$n(e);function Qn(e){switch(e.type){case`block-scalar`:{let t=``;for(let n of e.props)t+=Qn(n);return t+e.source}case`block-map`:case`block-seq`:{let t=``;for(let n of e.items)t+=$n(n);return t}case`flow-collection`:{let t=e.start.source;for(let n of e.items)t+=$n(n);for(let n of e.end)t+=n.source;return t}case`document`:{let t=$n(e);if(e.end)for(let n of e.end)t+=n.source;return t}default:{let t=e.source;if(`end`in e&&e.end)for(let n of e.end)t+=n.source;return t}}}function $n({start:e,key:t,sep:n,value:r}){let i=``;for(let t of e)i+=t.source;if(t&&(i+=Qn(t)),n)for(let e of n)i+=e.source;return r&&(i+=Qn(r)),i}const er=Symbol(`break visit`),tr=Symbol(`skip children`),nr=Symbol(`remove item`);function X(e,t){`type`in e&&e.type===`document`&&(e={start:e.start,value:e.value}),rr(Object.freeze([]),e,t)}X.BREAK=er,X.SKIP=tr,X.REMOVE=nr,X.itemAtPath=(e,t)=>{let n=e;for(let[e,r]of t){let t=n?.[e];if(t&&`items`in t)n=t.items[r];else return}return n},X.parentCollection=(e,t)=>{let n=X.itemAtPath(e,t.slice(0,-1)),r=t[t.length-1][0],i=n?.[r];if(i&&`items`in i)return i;throw Error(`Parent collection not found`)};function rr(e,t,n){let r=n(t,e);if(typeof r==`symbol`)return r;for(let i of[`key`,`value`]){let a=t[i];if(a&&`items`in a){for(let t=0;t<a.items.length;++t){let r=rr(Object.freeze(e.concat([[i,t]])),a.items[t],n);if(typeof r==`number`)t=r-1;else if(r===er)return er;else r===nr&&(a.items.splice(t,1),--t)}typeof r==`function`&&i===`key`&&(r=r(t,e))}}return typeof r==`function`?r(t,e):r}var ir=h({BOM:()=>``,DOCUMENT:()=>``,FLOW_END:()=>``,SCALAR:()=>``,createScalarToken:()=>Kn,isCollection:()=>ar,isScalar:()=>or,prettyToken:()=>sr,resolveAsScalar:()=>Gn,setScalarValue:()=>qn,stringify:()=>Zn,tokenType:()=>cr,visit:()=>X});const ar=e=>!!e&&`items`in e,or=e=>!!e&&(e.type===`scalar`||e.type===`single-quoted-scalar`||e.type===`double-quoted-scalar`||e.type===`block-scalar`);function sr(e){switch(e){case``:return`<BOM>`;case``:return`<DOC>`;case``:return`<FLOW_END>`;case``:return`<SCALAR>`;default:return JSON.stringify(e)}}function cr(e){switch(e){case``:return`byte-order-mark`;case``:return`doc-mode`;case``:return`flow-error-end`;case``:return`scalar`;case`---`:return`doc-start`;case`...`:return`doc-end`;case``:case`
91
- `:case`\r
92
- `:return`newline`;case`-`:return`seq-item-ind`;case`?`:return`explicit-key-ind`;case`:`:return`map-value-ind`;case`{`:return`flow-map-start`;case`}`:return`flow-map-end`;case`[`:return`flow-seq-start`;case`]`:return`flow-seq-end`;case`,`:return`comma`}switch(e[0]){case` `:case` `:return`space`;case`#`:return`comment`;case`%`:return`directive-line`;case`*`:return`alias`;case`&`:return`anchor`;case`!`:return`tag`;case`'`:return`single-quoted-scalar`;case`"`:return`double-quoted-scalar`;case`|`:case`>`:return`block-scalar-header`}return null}function Z(e){switch(e){case void 0:case` `:case`
93
- `:case`\r`:case` `:return!0;default:return!1}}const lr=new Set(`0123456789ABCDEFabcdef`),ur=new Set(`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()`),dr=new Set(`,[]{}`),fr=new Set(` ,[]{}
94
- \r `),pr=e=>!e||fr.has(e);var mr=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer=``,this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(e,t=!1){if(e){if(typeof e!=`string`)throw TypeError(`source is not a string`);this.buffer=this.buffer?this.buffer+e:e,this.lineEndPos=null}this.atEnd=!t;let n=this.next??`stream`;for(;n&&(t||this.hasChars(1));)n=yield*this.parseNext(n)}atLineEnd(){let e=this.pos,t=this.buffer[e];for(;t===` `||t===` `;)t=this.buffer[++e];return!t||t===`#`||t===`
95
- `||t===`\r`&&this.buffer[e+1]===`
96
- `}charAt(e){return this.buffer[this.pos+e]}continueScalar(e){let t=this.buffer[e];if(this.indentNext>0){let n=0;for(;t===` `;)t=this.buffer[++n+e];if(t===`\r`){let t=this.buffer[n+e+1];if(t===`
97
- `||!t&&!this.atEnd)return e+n+1}return t===`
98
- `||n>=this.indentNext||!t&&!this.atEnd?e+n:-1}if(t===`-`||t===`.`){let t=this.buffer.substr(e,3);if((t===`---`||t===`...`)&&Z(this.buffer[e+3]))return-1}return e}getLine(){let e=this.lineEndPos;return(typeof e!=`number`||e!==-1&&e<this.pos)&&(e=this.buffer.indexOf(`
99
- `,this.pos),this.lineEndPos=e),e===-1?this.atEnd?this.buffer.substring(this.pos):null:(this.buffer[e-1]===`\r`&&--e,this.buffer.substring(this.pos,e))}hasChars(e){return this.pos+e<=this.buffer.length}setNext(e){return this.buffer=this.buffer.substring(this.pos),this.pos=0,this.lineEndPos=null,this.next=e,null}peek(e){return this.buffer.substr(this.pos,e)}*parseNext(e){switch(e){case`stream`:return yield*this.parseStream();case`line-start`:return yield*this.parseLineStart();case`block-start`:return yield*this.parseBlockStart();case`doc`:return yield*this.parseDocument();case`flow`:return yield*this.parseFlowCollection();case`quoted-scalar`:return yield*this.parseQuotedScalar();case`block-scalar`:return yield*this.parseBlockScalar();case`plain-scalar`:return yield*this.parsePlainScalar()}}*parseStream(){let e=this.getLine();if(e===null)return this.setNext(`stream`);if(e[0]===``&&(yield*this.pushCount(1),e=e.substring(1)),e[0]===`%`){let t=e.length,n=e.indexOf(`#`);for(;n!==-1;){let r=e[n-1];if(r===` `||r===` `){t=n-1;break}n=e.indexOf(`#`,n+1)}for(;;){let n=e[t-1];if(n===` `||n===` `)--t;else break}let r=(yield*this.pushCount(t))+(yield*this.pushSpaces(!0));return yield*this.pushCount(e.length-r),this.pushNewline(),`stream`}if(this.atLineEnd()){let t=yield*this.pushSpaces(!0);return yield*this.pushCount(e.length-t),yield*this.pushNewline(),`stream`}return yield``,yield*this.parseLineStart()}*parseLineStart(){let e=this.charAt(0);if(!e&&!this.atEnd)return this.setNext(`line-start`);if(e===`-`||e===`.`){if(!this.atEnd&&!this.hasChars(4))return this.setNext(`line-start`);let e=this.peek(3);if((e===`---`||e===`...`)&&Z(this.charAt(3)))return yield*this.pushCount(3),this.indentValue=0,this.indentNext=0,e===`---`?`doc`:`stream`}return this.indentValue=yield*this.pushSpaces(!1),this.indentNext>this.indentValue&&!Z(this.charAt(1))&&(this.indentNext=this.indentValue),yield*this.parseBlockStart()}*parseBlockStart(){let[e,t]=this.peek(2);if(!t&&!this.atEnd)return this.setNext(`block-start`);if((e===`-`||e===`?`||e===`:`)&&Z(t)){let e=(yield*this.pushCount(1))+(yield*this.pushSpaces(!0));return this.indentNext=this.indentValue+1,this.indentValue+=e,`block-start`}return`doc`}*parseDocument(){yield*this.pushSpaces(!0);let e=this.getLine();if(e===null)return this.setNext(`doc`);let t=yield*this.pushIndicators();switch(e[t]){case`#`:yield*this.pushCount(e.length-t);case void 0:return yield*this.pushNewline(),yield*this.parseLineStart();case`{`:case`[`:return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel=1,`flow`;case`}`:case`]`:return yield*this.pushCount(1),`doc`;case`*`:return yield*this.pushUntil(pr),`doc`;case`"`:case`'`:return yield*this.parseQuotedScalar();case`|`:case`>`:return t+=yield*this.parseBlockScalarHeader(),t+=yield*this.pushSpaces(!0),yield*this.pushCount(e.length-t),yield*this.pushNewline(),yield*this.parseBlockScalar();default:return yield*this.parsePlainScalar()}}*parseFlowCollection(){let e,t,n=-1;do e=yield*this.pushNewline(),e>0?(t=yield*this.pushSpaces(!1),this.indentValue=n=t):t=0,t+=yield*this.pushSpaces(!0);while(e+t>0);let r=this.getLine();if(r===null)return this.setNext(`flow`);if((n!==-1&&n<this.indentNext&&r[0]!==`#`||n===0&&(r.startsWith(`---`)||r.startsWith(`...`))&&Z(r[3]))&&(n!==this.indentNext-1||this.flowLevel!==1||r[0]!==`]`&&r[0]!==`}`))return this.flowLevel=0,yield``,yield*this.parseLineStart();let i=0;for(;r[i]===`,`;)i+=yield*this.pushCount(1),i+=yield*this.pushSpaces(!0),this.flowKey=!1;switch(i+=yield*this.pushIndicators(),r[i]){case void 0:return`flow`;case`#`:return yield*this.pushCount(r.length-i),`flow`;case`{`:case`[`:return yield*this.pushCount(1),this.flowKey=!1,this.flowLevel+=1,`flow`;case`}`:case`]`:return yield*this.pushCount(1),this.flowKey=!0,--this.flowLevel,this.flowLevel?`flow`:`doc`;case`*`:return yield*this.pushUntil(pr),`flow`;case`"`:case`'`:return this.flowKey=!0,yield*this.parseQuotedScalar();case`:`:{let e=this.charAt(1);if(this.flowKey||Z(e)||e===`,`)return this.flowKey=!1,yield*this.pushCount(1),yield*this.pushSpaces(!0),`flow`}default:return this.flowKey=!1,yield*this.parsePlainScalar()}}*parseQuotedScalar(){let e=this.charAt(0),t=this.buffer.indexOf(e,this.pos+1);if(e===`'`)for(;t!==-1&&this.buffer[t+1]===`'`;)t=this.buffer.indexOf(`'`,t+2);else for(;t!==-1;){let e=0;for(;this.buffer[t-1-e]===`\\`;)e+=1;if(e%2==0)break;t=this.buffer.indexOf(`"`,t+1)}let n=this.buffer.substring(0,t),r=n.indexOf(`
100
- `,this.pos);if(r!==-1){for(;r!==-1;){let e=this.continueScalar(r+1);if(e===-1)break;r=n.indexOf(`
101
- `,e)}r!==-1&&(t=r-(n[r-1]===`\r`?2:1))}if(t===-1){if(!this.atEnd)return this.setNext(`quoted-scalar`);t=this.buffer.length}return yield*this.pushToIndex(t+1,!1),this.flowLevel?`flow`:`doc`}*parseBlockScalarHeader(){this.blockScalarIndent=-1,this.blockScalarKeep=!1;let e=this.pos;for(;;){let t=this.buffer[++e];if(t===`+`)this.blockScalarKeep=!0;else if(t>`0`&&t<=`9`)this.blockScalarIndent=Number(t)-1;else if(t!==`-`)break}return yield*this.pushUntil(e=>Z(e)||e===`#`)}*parseBlockScalar(){let e=this.pos-1,t=0,n;loop:for(let r=this.pos;n=this.buffer[r];++r)switch(n){case` `:t+=1;break;case`
102
- `:e=r,t=0;break;case`\r`:{let e=this.buffer[r+1];if(!e&&!this.atEnd)return this.setNext(`block-scalar`);if(e===`
103
- `)break}default:break loop}if(!n&&!this.atEnd)return this.setNext(`block-scalar`);if(t>=this.indentNext){this.indentNext=this.blockScalarIndent===-1?t:this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let t=this.continueScalar(e+1);if(t===-1)break;e=this.buffer.indexOf(`
104
- `,t)}while(e!==-1);if(e===-1){if(!this.atEnd)return this.setNext(`block-scalar`);e=this.buffer.length}}let r=e+1;for(n=this.buffer[r];n===` `;)n=this.buffer[++r];if(n===` `){for(;n===` `||n===` `||n===`\r`||n===`
105
- `;)n=this.buffer[++r];e=r-1}else if(!this.blockScalarKeep)do{let n=e-1,r=this.buffer[n];r===`\r`&&(r=this.buffer[--n]);let i=n;for(;r===` `;)r=this.buffer[--n];if(r===`
106
- `&&n>=this.pos&&n+1+t>i)e=n;else break}while(1);return yield``,yield*this.pushToIndex(e+1,!0),yield*this.parseLineStart()}*parsePlainScalar(){let e=this.flowLevel>0,t=this.pos-1,n=this.pos-1,r;for(;r=this.buffer[++n];)if(r===`:`){let r=this.buffer[n+1];if(Z(r)||e&&dr.has(r))break;t=n}else if(Z(r)){let i=this.buffer[n+1];if(r===`\r`&&(i===`
107
- `?(n+=1,r=`
108
- `,i=this.buffer[n+1]):t=n),i===`#`||e&&dr.has(i))break;if(r===`
109
- `){let e=this.continueScalar(n+1);if(e===-1)break;n=Math.max(n,e-2)}}else{if(e&&dr.has(r))break;t=n}return!r&&!this.atEnd?this.setNext(`plain-scalar`):(yield``,yield*this.pushToIndex(t+1,!0),e?`flow`:`doc`)}*pushCount(e){return e>0?(yield this.buffer.substr(this.pos,e),this.pos+=e,e):0}*pushToIndex(e,t){let n=this.buffer.slice(this.pos,e);return n?(yield n,this.pos+=n.length,n.length):(t&&(yield``),0)}*pushIndicators(){let e=0;loop:for(;;){switch(this.charAt(0)){case`!`:e+=yield*this.pushTag(),e+=yield*this.pushSpaces(!0);continue loop;case`&`:e+=yield*this.pushUntil(pr),e+=yield*this.pushSpaces(!0);continue loop;case`-`:case`?`:case`:`:{let t=this.flowLevel>0,n=this.charAt(1);if(Z(n)||t&&dr.has(n)){t?this.flowKey&&=!1:this.indentNext=this.indentValue+1,e+=yield*this.pushCount(1),e+=yield*this.pushSpaces(!0);continue loop}}}break loop}return e}*pushTag(){if(this.charAt(1)===`<`){let e=this.pos+2,t=this.buffer[e];for(;!Z(t)&&t!==`>`;)t=this.buffer[++e];return yield*this.pushToIndex(t===`>`?e+1:e,!1)}{let e=this.pos+1,t=this.buffer[e];for(;t;)if(ur.has(t))t=this.buffer[++e];else if(t===`%`&&lr.has(this.buffer[e+1])&&lr.has(this.buffer[e+2]))t=this.buffer[e+=3];else break;return yield*this.pushToIndex(e,!1)}}*pushNewline(){let e=this.buffer[this.pos];return e===`
110
- `?yield*this.pushCount(1):e===`\r`&&this.charAt(1)===`
111
- `?yield*this.pushCount(2):0}*pushSpaces(e){let t=this.pos-1,n;do n=this.buffer[++t];while(n===` `||e&&n===` `);let r=t-this.pos;return r>0&&(yield this.buffer.substr(this.pos,r),this.pos=t),r}*pushUntil(e){let t=this.pos,n=this.buffer[t];for(;!e(n);)n=this.buffer[++t];return yield*this.pushToIndex(t,!1)}},hr=class{constructor(){this.lineStarts=[],this.addNewLine=e=>this.lineStarts.push(e),this.linePos=e=>{let t=0,n=this.lineStarts.length;for(;t<n;){let r=t+n>>1;this.lineStarts[r]<e?t=r+1:n=r}if(this.lineStarts[t]===e)return{line:t+1,col:1};if(t===0)return{line:0,col:e};let r=this.lineStarts[t-1];return{line:t,col:e-r+1}}}};function Q(e,t){for(let n=0;n<e.length;++n)if(e[n].type===t)return!0;return!1}function gr(e){for(let t=0;t<e.length;++t)switch(e[t].type){case`space`:case`comment`:case`newline`:break;default:return t}return-1}function _r(e){switch(e?.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:case`flow-collection`:return!0;default:return!1}}function vr(e){switch(e.type){case`document`:return e.start;case`block-map`:{let t=e.items[e.items.length-1];return t.sep??t.start}case`block-seq`:return e.items[e.items.length-1].start;default:return[]}}function $(e){if(e.length===0)return[];let t=e.length;loop:for(;--t>=0;)switch(e[t].type){case`doc-start`:case`explicit-key-ind`:case`map-value-ind`:case`seq-item-ind`:case`newline`:break loop}for(;e[++t]?.type===`space`;);return e.splice(t,e.length)}function yr(e,t){if(t.length<1e5)Array.prototype.push.apply(e,t);else for(let n=0;n<t.length;++n)e.push(t[n])}function br(e){if(e.start.type===`flow-seq-start`)for(let t of e.items)t.sep&&!t.value&&!Q(t.start,`explicit-key-ind`)&&!Q(t.sep,`map-value-ind`)&&(t.key&&(t.value=t.key),delete t.key,_r(t.value)?t.value.end?yr(t.value.end,t.sep):t.value.end=t.sep:yr(t.start,t.sep),delete t.sep)}var xr=class{constructor(e){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source=``,this.type=``,this.lexer=new mr,this.onNewLine=e}*parse(e,t=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let n of this.lexer.lex(e,t))yield*this.next(n);t||(yield*this.end())}*next(e){if(this.source=e,this.atScalar){this.atScalar=!1,yield*this.step(),this.offset+=e.length;return}let t=cr(e);if(!t){let t=`Not a YAML token: ${e}`;yield*this.pop({type:`error`,offset:this.offset,message:t,source:e}),this.offset+=e.length}else if(t===`scalar`)this.atNewLine=!1,this.atScalar=!0,this.type=`scalar`;else{switch(this.type=t,yield*this.step(),t){case`newline`:this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+e.length);break;case`space`:this.atNewLine&&e[0]===` `&&(this.indent+=e.length);break;case`explicit-key-ind`:case`map-value-ind`:case`seq-item-ind`:this.atNewLine&&(this.indent+=e.length);break;case`doc-mode`:case`flow-error-end`:return;default:this.atNewLine=!1}this.offset+=e.length}}*end(){for(;this.stack.length>0;)yield*this.pop()}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let e=this.peek(1);if(this.type===`doc-end`&&e?.type!==`doc-end`){for(;this.stack.length>0;)yield*this.pop();this.stack.push({type:`doc-end`,offset:this.offset,source:this.source});return}if(!e)return yield*this.stream();switch(e.type){case`document`:return yield*this.document(e);case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return yield*this.scalar(e);case`block-scalar`:return yield*this.blockScalar(e);case`block-map`:return yield*this.blockMap(e);case`block-seq`:return yield*this.blockSequence(e);case`flow-collection`:return yield*this.flowCollection(e);case`doc-end`:return yield*this.documentEnd(e)}yield*this.pop()}peek(e){return this.stack[this.stack.length-e]}*pop(e){let t=e??this.stack.pop();if(!t)yield{type:`error`,offset:this.offset,source:``,message:`Tried to pop an empty stack`};else if(this.stack.length===0)yield t;else{let e=this.peek(1);switch(t.type===`block-scalar`?t.indent=`indent`in e?e.indent:0:t.type===`flow-collection`&&e.type===`document`&&(t.indent=0),t.type===`flow-collection`&&br(t),e.type){case`document`:e.value=t;break;case`block-scalar`:e.props.push(t);break;case`block-map`:{let n=e.items[e.items.length-1];if(n.value){e.items.push({start:[],key:t,sep:[]}),this.onKeyLine=!0;return}if(n.sep)n.value=t;else{Object.assign(n,{key:t,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case`block-seq`:{let n=e.items[e.items.length-1];n.value?e.items.push({start:[],value:t}):n.value=t;break}case`flow-collection`:{let n=e.items[e.items.length-1];!n||n.value?e.items.push({start:[],key:t,sep:[]}):n.sep?n.value=t:Object.assign(n,{key:t,sep:[]});return}default:yield*this.pop(),yield*this.pop(t)}if((e.type===`document`||e.type===`block-map`||e.type===`block-seq`)&&(t.type===`block-map`||t.type===`block-seq`)){let n=t.items[t.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&gr(n.start)===-1&&(t.indent===0||n.start.every(e=>e.type!==`comment`||e.indent<t.indent))&&(e.type===`document`?e.end=n.start:e.items.push({start:n.start}),t.items.splice(-1,1))}}}*stream(){switch(this.type){case`directive-line`:yield{type:`directive`,offset:this.offset,source:this.source};return;case`byte-order-mark`:case`space`:case`comment`:case`newline`:yield this.sourceToken;return;case`doc-mode`:case`doc-start`:{let e={type:`document`,offset:this.offset,start:[]};this.type===`doc-start`&&e.start.push(this.sourceToken),this.stack.push(e);return}}yield{type:`error`,offset:this.offset,message:`Unexpected ${this.type} token in YAML stream`,source:this.source}}*document(e){if(e.value)return yield*this.lineEnd(e);switch(this.type){case`doc-start`:gr(e.start)===-1?e.start.push(this.sourceToken):(yield*this.pop(),yield*this.step());return;case`anchor`:case`tag`:case`space`:case`comment`:case`newline`:e.start.push(this.sourceToken);return}let t=this.startBlockValue(e);t?this.stack.push(t):yield{type:`error`,offset:this.offset,message:`Unexpected ${this.type} token in YAML document`,source:this.source}}*scalar(e){if(this.type===`map-value-ind`){let t=$(vr(this.peek(2))),n;e.end?(n=e.end,n.push(this.sourceToken),delete e.end):n=[this.sourceToken];let r={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:t,key:e,sep:n}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=r}else yield*this.lineEnd(e)}*blockScalar(e){switch(this.type){case`space`:case`comment`:case`newline`:e.props.push(this.sourceToken);return;case`scalar`:if(e.source=this.source,this.atNewLine=!0,this.indent=0,this.onNewLine){let e=this.source.indexOf(`
112
- `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
113
- `,e)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(this.onKeyLine=!1,t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else if(t.sep)t.sep.push(this.sourceToken);else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){yr(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return}if(this.indent>=e.indent){let n=!this.onKeyLine&&this.indent===e.indent,r=n&&(t.sep||t.explicitKey)&&this.type!==`seq-item-ind`,i=[];if(r&&t.sep&&!t.value){let n=[];for(let r=0;r<t.sep.length;++r){let i=t.sep[r];switch(i.type){case`newline`:n.push(r);break;case`space`:break;case`comment`:i.indent>e.indent&&(n.length=0);break;default:n.length=0}}n.length>=2&&(i=t.sep.splice(n[1]))}switch(this.type){case`anchor`:case`tag`:r||t.value?(i.push(this.sourceToken),e.items.push({start:i}),this.onKeyLine=!0):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`explicit-key-ind`:!t.sep&&!t.explicitKey?(t.start.push(this.sourceToken),t.explicitKey=!0):r||t.value?(i.push(this.sourceToken),e.items.push({start:i,explicitKey:!0})):this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case`map-value-ind`:if(t.explicitKey){if(!t.sep){if(Q(t.start,`newline`))Object.assign(t,{key:null,sep:[this.sourceToken]});else{let e=$(t.start);this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:null,sep:[this.sourceToken]}]})}}else if(t.value)e.items.push({start:[],key:null,sep:[this.sourceToken]});else if(Q(t.sep,`map-value-ind`))this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]});else if(_r(t.key)&&!Q(t.sep,`newline`)){let e=$(t.start),n=t.key,r=t.sep;r.push(this.sourceToken),delete t.key,delete t.sep,this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:e,key:n,sep:r}]})}else i.length>0?t.sep=t.sep.concat(i,this.sourceToken):t.sep.push(this.sourceToken)}else t.sep?t.value||r?e.items.push({start:i,key:null,sep:[this.sourceToken]}):Q(t.sep,`map-value-ind`)?this.stack.push({type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);r||t.value?(e.items.push({start:i,key:n,sep:[]}),this.onKeyLine=!0):t.sep?this.stack.push(n):(Object.assign(t,{key:n,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(e);if(r){if(r.type===`block-seq`){if(!t.explicitKey&&t.sep&&!Q(t.sep,`newline`)){yield*this.pop({type:`error`,offset:this.offset,message:`Unexpected block-seq-ind on same line with key`,source:this.source});return}}else n&&e.items.push({start:i});this.stack.push(r);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(e){let t=e.items[e.items.length-1];switch(this.type){case`newline`:if(t.value){let n=`end`in t.value?t.value.end:void 0;(Array.isArray(n)?n[n.length-1]:void 0)?.type===`comment`?n?.push(this.sourceToken):e.items.push({start:[this.sourceToken]})}else t.start.push(this.sourceToken);return;case`space`:case`comment`:if(t.value)e.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(t.start,e.indent)){let n=e.items[e.items.length-2]?.value?.end;if(Array.isArray(n)){yr(n,t.start),n.push(this.sourceToken),e.items.pop();return}}t.start.push(this.sourceToken)}return;case`anchor`:case`tag`:if(t.value||this.indent<=e.indent)break;t.start.push(this.sourceToken);return;case`seq-item-ind`:if(this.indent!==e.indent)break;t.value||Q(t.start,`seq-item-ind`)?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return}if(this.indent>e.indent){let t=this.startBlockValue(e);if(t){this.stack.push(t);return}}yield*this.pop(),yield*this.step()}*flowCollection(e){let t=e.items[e.items.length-1];if(this.type===`flow-error-end`){let e;do yield*this.pop(),e=this.peek(1);while(e?.type===`flow-collection`)}else if(e.end.length===0){switch(this.type){case`comma`:case`explicit-key-ind`:!t||t.sep?e.items.push({start:[this.sourceToken]}):t.start.push(this.sourceToken);return;case`map-value-ind`:!t||t.value?e.items.push({start:[],key:null,sep:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):Object.assign(t,{key:null,sep:[this.sourceToken]});return;case`space`:case`comment`:case`newline`:case`anchor`:case`tag`:!t||t.value?e.items.push({start:[this.sourceToken]}):t.sep?t.sep.push(this.sourceToken):t.start.push(this.sourceToken);return;case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:{let n=this.flowScalar(this.type);!t||t.value?e.items.push({start:[],key:n,sep:[]}):t.sep?this.stack.push(n):Object.assign(t,{key:n,sep:[]});return}case`flow-map-end`:case`flow-seq-end`:e.end.push(this.sourceToken);return}let n=this.startBlockValue(e);n?this.stack.push(n):(yield*this.pop(),yield*this.step())}else{let t=this.peek(2);if(t.type===`block-map`&&(this.type===`map-value-ind`&&t.indent===e.indent||this.type===`newline`&&!t.items[t.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type===`map-value-ind`&&t.type!==`flow-collection`){let n=$(vr(t));br(e);let r=e.end.splice(1,e.end.length);r.push(this.sourceToken);let i={type:`block-map`,offset:e.offset,indent:e.indent,items:[{start:n,key:e,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=i}else yield*this.lineEnd(e)}}flowScalar(e){if(this.onNewLine){let e=this.source.indexOf(`
114
- `)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(`
115
- `,e)+1}return{type:e,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(e){switch(this.type){case`alias`:case`scalar`:case`single-quoted-scalar`:case`double-quoted-scalar`:return this.flowScalar(this.type);case`block-scalar-header`:return{type:`block-scalar`,offset:this.offset,indent:this.indent,props:[this.sourceToken],source:``};case`flow-map-start`:case`flow-seq-start`:return{type:`flow-collection`,offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case`seq-item-ind`:return{type:`block-seq`,offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case`explicit-key-ind`:{this.onKeyLine=!0;let t=$(vr(e));return t.push(this.sourceToken),{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,explicitKey:!0}]}}case`map-value-ind`:{this.onKeyLine=!0;let t=$(vr(e));return{type:`block-map`,offset:this.offset,indent:this.indent,items:[{start:t,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(e,t){return this.type!==`comment`||this.indent<=t?!1:e.every(e=>e.type===`newline`||e.type===`space`)}*documentEnd(e){this.type!==`doc-mode`&&(e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop()))}*lineEnd(e){switch(this.type){case`comma`:case`doc-start`:case`doc-end`:case`flow-seq-end`:case`flow-map-end`:case`map-value-ind`:yield*this.pop(),yield*this.step();break;case`newline`:this.onKeyLine=!1;default:e.end?e.end.push(this.sourceToken):e.end=[this.sourceToken],this.type===`newline`&&(yield*this.pop())}}};function Sr(e){let t=e.prettyErrors!==!1;return{lineCounter:e.lineCounter||t&&new hr||null,prettyErrors:t}}function Cr(e,t={}){let{lineCounter:n,prettyErrors:r}=Sr(t),i=new xr(n?.addNewLine),a=new Wn(t),o=Array.from(a.compose(i.parse(e)));if(r&&n)for(let t of o)t.errors.forEach(cn(e,n)),t.warnings.forEach(cn(e,n));return o.length>0?o:Object.assign([],{empty:!0},a.streamInfo())}function wr(e,t={}){let{lineCounter:n,prettyErrors:r}=Sr(t),i=new xr(n?.addNewLine),a=new Wn(t),o=null;for(let t of a.compose(i.parse(e),!0,e.length))if(!o)o=t;else if(o.options.logLevel!==`silent`){o.errors.push(new Y(t.range.slice(0,2),`MULTIPLE_DOCS`,`Source contains multiple documents; please use YAML.parseAllDocuments()`));break}return r&&n&&(o.errors.forEach(cn(e,n)),o.warnings.forEach(cn(e,n))),o}function Tr(e,t,n){let r;typeof t==`function`?r=t:n===void 0&&t&&typeof t==`object`&&(n=t);let i=wr(e,n);if(!i)return null;if(i.warnings.forEach(e=>Ge(i.options.logLevel,e)),i.errors.length>0){if(i.options.logLevel!==`silent`)throw i.errors[0];i.errors=[]}return i.toJS(Object.assign({reviver:r},n))}function Er(e,t,n){let r=null;if(typeof t==`function`||Array.isArray(t)?r=t:n===void 0&&t&&(n=t),typeof n==`string`&&(n=n.length),typeof n==`number`){let e=Math.round(n);n=e<1?void 0:e>8?{indent:8}:{indent:e}}if(e===void 0){let{keepUndefined:e}=n??t??{};if(!e)return}return D(e)&&!r?e.toString(n):new rn(e,r,n).toString(n)}var Dr=h({Alias:()=>ye,CST:()=>ir,Composer:()=>Wn,Document:()=>rn,Lexer:()=>mr,LineCounter:()=>hr,Pair:()=>W,Parser:()=>xr,Scalar:()=>z,Schema:()=>tn,YAMLError:()=>on,YAMLMap:()=>K,YAMLParseError:()=>Y,YAMLSeq:()=>q,YAMLWarning:()=>sn,isAlias:()=>E,isCollection:()=>A,isDocument:()=>D,isMap:()=>re,isNode:()=>j,isPair:()=>O,isScalar:()=>k,isSeq:()=>ie,parse:()=>Tr,parseAllDocuments:()=>Cr,parseDocument:()=>wr,stringify:()=>Er,visit:()=>P,visitAsync:()=>se});const Or=/^---.*\r?\n([\s\S]*?)---/,kr=/^\s*```ya?ml([\s\S]*?)```/,Ar=/\$.*?\$/,jr=/\$\$/,Mr=/\{monaco.*\}/,Nr=/<Tweet\b/,Pr=/<BlueSky\b/,Fr=/^```mermaid/m,Ir=/^(#+) (.*)$/m,Lr=/^\s*`+/,Rr=/\r?\n/g;function zr(e,t){let n=0;for(;n<e.length;)if(t){let r=e.indexOf(`-->`,n);if(r<0)return!0;t=!1,n=r+3}else{let t=e.indexOf(`<!--`,n);if(t<0)return!1;let r=e.indexOf(`-->`,t+4);if(r<0)return!0;n=r+3}return t}function Br(e,t){let n,r,i=e.replace(Or,(e,t)=>(n=`frontmatter`,r=t,``));n!==`frontmatter`&&(i=i.replace(kr,(e,t)=>(n=`yaml`,r=t,``)));let a=r&&!t.noParseYAML?Dr.parseDocument(r):void 0;return{type:n,raw:r,doc:a,data:a?.toJSON(),content:i}}const Vr=/\.(?:png|jpe?g|gif|svg|webp|avif|ico|bmp|tiff?)$/i;function Hr(e,t){let n=new Set;for(let e of[`image`,`backgroundImage`,`background`]){let r=t[e];typeof r==`string`&&r&&!r.startsWith(`data:`)&&(e===`background`?(Vr.test(r)||r.startsWith(`/`)||r.startsWith(`http`))&&n.add(r):n.add(r))}let r=e.replace(/^```[\s\S]+?^```/gm,``);for(let[,e]of r.matchAll(/!\[[^\]]*\]\(([^)]+)\)/g))e&&!e.startsWith(`data:`)&&n.add(e.trim());for(let[,e]of r.matchAll(/\b(?:src|image)=["']([^"']+)["']/g))e&&!e.startsWith(`data:`)&&!e.includes(`{{`)&&Vr.test(e)&&n.add(e.trim());for(let[,e]of r.matchAll(/:(?:src|image)=["']'([^']+)'["']/g))e&&!e.startsWith(`data:`)&&Vr.test(e)&&n.add(e.trim());for(let[,e]of r.matchAll(/url\(["']?([^"')]+)["']?\)/g))e&&!e.startsWith(`data:`)&&Vr.test(e)&&n.add(e.trim());return Array.from(n)}function Ur(e){return{katex:!!e.match(Ar)||!!e.match(jr),monaco:Mr.test(e)?Kr(e):!1,tweet:!!e.match(Nr),bluesky:!!e.match(Pr),mermaid:!!e.match(Fr)}}function Wr(e,t={}){let n=Br(e,t),r,i=n.data||{},a=n.content.trim(),o=qr(e.trim()),s=Array.from(a.matchAll(/<!--([\s\S]*?)-->/g));if(s.length){let e=s[s.length-1];e.index!==void 0&&e.index+e[0].length>=a.length&&(r=e[1].trim(),a=a.slice(0,e.index).trim())}let c,l;if(i.title||i.name)c=i.title||i.name;else{let e=a.match(Ir);c=e?.[2]?.trim(),l=e?.[1]?.length}i.level&&(l=i.level||1);let u=Hr(a,i);return{raw:e,title:c,level:l,revision:o,content:a,contentRaw:a,frontmatter:i,frontmatterStyle:n.type,frontmatterDoc:n.doc,frontmatterRaw:n.raw,note:r,images:u}}async function Gr(e,t,n,r={}){let i=e.split(r.preserveCR?`
116
- `:Rr),a=[],o=0,s=0,c=!1;async function l(e){if(o===e)return;let c={...Wr(i.slice(o,e).join(`
117
- `),r),filepath:t,index:a.length,start:o,contentStart:s,end:e};if(n)for(let e of n){if(e.transformSlide){let t=await e.transformSlide(c.content,c.frontmatter);t!==void 0&&(c.content=t),typeof c.frontmatter.title==`string`&&(c.title=c.frontmatter.title),typeof c.frontmatter.level==`number`&&(c.level=c.frontmatter.level)}if(e.transformNote){let t=await e.transformNote(c.note,c.frontmatter);t!==void 0&&(c.note=t)}}a.push(c),o=e+1,s=e+1}if(n)for(let e of n)e.transformRawLines&&await e.transformRawLines(i);for(let e=0;e<i.length;e++){let t=i[e],n=t.trimEnd();if(c){c=zr(t,!0);continue}if(n.startsWith(`---`)){await l(e);let t=i[e+1];if(n[3]!==`-`&&t?.trim()){for(o=e,e+=1;e<i.length&&i[e].trimEnd()!==`---`;e++);s=e+1}}else if(n.trimStart().startsWith("```")){let t=n.match(Lr)[0],r=e+1;for(;r<i.length&&!i[r].startsWith(t);r++);r!==i.length&&(e=r)}else c=zr(t,!1)}return o<=i.length-1&&await l(i.length),{filepath:t,raw:e,slides:a}}function Kr(e){let t=new Set,n=new Set;return e.replace(/^```(\w+)\s*\{monaco([^}]*)\}\s*(\S[\s\S]*?)^```/gm,(e,r=`ts`,i,a)=>{r=r.trim();let o=i===`-run`;if([`js`,`javascript`,`ts`,`typescript`].includes(r))for(let[,,e]of a.matchAll(/\s+from\s+(["'])([/.\w@-]+)\1/g))e&&(`./`.includes(e)||t.add(e),o&&n.add(e));return``}),{types:Array.from(t),deps:Array.from(n)}}function qr(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return t.toString(36).slice(0,12)}const Jr=/^[A-Za-z]:\//;function Yr(e=``){return e&&e.replace(/\\/g,`/`).replace(Jr,e=>e.toUpperCase())}const Xr=/^[/\\](?![/\\])|^[/\\]{2}(?!\.)|^[A-Za-z]:[/\\]/,Zr=/^[A-Za-z]:$/,Qr=/^\/([A-Za-z]:)?$/;function $r(){return typeof process<`u`&&typeof process.cwd==`function`?process.cwd().replace(/\\/g,`/`):`/`}const ei=function(...e){e=e.map(e=>Yr(e));let t=``,n=!1;for(let r=e.length-1;r>=-1&&!n;r--){let i=r>=0?e[r]:$r();i&&i.length!==0&&(t=`${i}/${t}`,n=ni(i))}return t=ti(t,!n),n&&!ni(t)?`/${t}`:t.length>0?t:`.`};function ti(e,t){let n=``,r=0,i=-1,a=0,o=null;for(let s=0;s<=e.length;++s){if(s<e.length)o=e[s];else if(o===`/`)break;else o=`/`;if(o===`/`){if(i!==s-1&&a!==1){if(a===2){if(n.length<2||r!==2||n[n.length-1]!==`.`||n[n.length-2]!==`.`){if(n.length>2){let e=n.lastIndexOf(`/`);e===-1?(n=``,r=0):(n=n.slice(0,e),r=n.length-1-n.lastIndexOf(`/`)),i=s,a=0;continue}if(n.length>0){n=``,r=0,i=s,a=0;continue}}t&&(n+=n.length>0?`/..`:`..`,r=2)}else n.length>0?n+=`/${e.slice(i+1,s)}`:n=e.slice(i+1,s),r=s-i-1}i=s,a=0}else o===`.`&&a!==-1?++a:a=-1}return n}const ni=function(e){return Xr.test(e)},ri=function(e,t){let n=ei(e).replace(Qr,`$1`).split(`/`),r=ei(t).replace(Qr,`$1`).split(`/`);if(r[0][1]===`:`&&n[0][1]===`:`&&n[0]!==r[0])return r.join(`/`);let i=[...n];for(let e of i){if(r[0]!==e)break;n.shift(),r.shift()}return[...n.map(()=>`..`),...r].join(`/`)},ii=function(e){let t=Yr(e).replace(/\/$/,``).split(`/`).slice(0,-1);return t.length===1&&Zr.test(t[0])&&(t[0]+=`/`),t.join(`/`)||(ni(e)?`/`:`.`)};function ai(e,t){return t.some(t=>{let n=ri(t,e);return n===``||!!n&&!n.startsWith(`..`)&&!ni(n)})}async function oi(t,r,i={},a){let o=typeof i==`function`?i:async e=>i[e]??n(e,`utf-8`);await o(r);let s,c={},l={},u=[];async function d(e,t,n,r){let i=c[e];i||(i=await Gr(await o(e),e,s),c[e]=i,l[e]=new Set);let a=r?.at(-1);for(let e of x(i.slides.length,t)){let t=i.slides[e-1];try{await f(i,t,n,r)}catch(e){i.errors??=[],i.errors.push({row:t.start,message:`Error when loading slide: ${e}`});continue}a&&(a.imports??=[]).push(t)}return i}async function f(n,r,i,a){if(!(r.frontmatter.disabled||r.frontmatter.hide)){if(r.frontmatter.src){let[o,s]=r.frontmatter.src.split(`#`),c=b(o.startsWith(`/`)?ei(t.userRoot,o.substring(1)):ei(ii(r.filepath),o));i={...r.frontmatter,...i},delete i.src;let l=new Set((a??[]).map(e=>e.filepath));if(c===r.filepath||l.has(c)){n.errors??=[],n.errors.push({row:r.start,message:`Circular import detected for "${r.frontmatter.src}" (${c})`});return}t.allowedRoots&&!ai(c,t.allowedRoots)?(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown escapes the project root: ${c}`})):e(c)?await d(c,s,i,a?[...a,r]:[r]):(n.errors??=[],n.errors.push({row:r.start,message:`Imported markdown file not found: ${c}`}))}else u.push({frontmatter:{...r.frontmatter,...i},content:r.content,revision:r.revision,frontmatterRaw:r.frontmatterRaw,note:r.note,title:r.title,level:r.level,index:u.length,importChain:a,source:r})}}let p=await d(b(r)),m={...p.slides[0]?.frontmatter};return u[0]?.title&&(m.title??=u[0].title),{slides:u,entry:p,headmatter:m,features:Ur(u.map(e=>e.source.raw).join(``)),markdownFiles:c,watchFiles:l}}var si=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t;(function(e){e.Document=`Document`,e.DocumentExit=`Document:exit`,e.Paragraph=`Paragraph`,e.ParagraphExit=`Paragraph:exit`,e.BlockQuote=`BlockQuote`,e.BlockQuoteExit=`BlockQuote:exit`,e.ListItem=`ListItem`,e.ListItemExit=`ListItem:exit`,e.List=`List`,e.ListExit=`List:exit`,e.Header=`Header`,e.HeaderExit=`Header:exit`,e.CodeBlock=`CodeBlock`,e.CodeBlockExit=`CodeBlock:exit`,e.HtmlBlock=`HtmlBlock`,e.HtmlBlockExit=`HtmlBlock:exit`,e.HorizontalRule=`HorizontalRule`,e.HorizontalRuleExit=`HorizontalRule:exit`,e.Comment=`Comment`,e.CommentExit=`Comment:exit`,e.ReferenceDef=`ReferenceDef`,e.ReferenceDefExit=`ReferenceDef:exit`,e.Str=`Str`,e.StrExit=`Str:exit`,e.Break=`Break`,e.BreakExit=`Break:exit`,e.Emphasis=`Emphasis`,e.EmphasisExit=`Emphasis:exit`,e.Strong=`Strong`,e.StrongExit=`Strong:exit`,e.Html=`Html`,e.HtmlExit=`Html:exit`,e.Link=`Link`,e.LinkExit=`Link:exit`,e.LinkReference=`LinkReference`,e.LinkReferenceExit=`LinkReference:exit`,e.Image=`Image`,e.ImageExit=`Image:exit`,e.ImageReference=`ImageReference`,e.ImageReferenceExit=`ImageReference:exit`,e.Definition=`Definition`,e.DefinitionExit=`Definition:exit`,e.Code=`Code`,e.CodeExit=`Code:exit`,e.Delete=`Delete`,e.DeleteExit=`Delete:exit`,e.Table=`Table`,e.TableExit=`Table:exit`,e.TableRow=`TableRow`,e.TableRowExit=`TableRow:exit`,e.TableCell=`TableCell`,e.TableCellExit=`TableCell:exit`})(t||(e.ASTNodeTypes=t={}))})),ci=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.ASTNodeTypes=void 0;var t=si();Object.defineProperty(e,"ASTNodeTypes",{enumerable:!0,get:function(){return t.ASTNodeTypes}})})),li=m((e=>{Object.defineProperty(e,"__esModule",{value:!0});var t=ci();e.default=function(){function e(e){this._ruleContext=e}return e.prototype.getParents=function(e){for(var t=[],n=e.parent;n!=null;)t.push(n),n=n.parent;return t},e.prototype.isChildNode=function(e,t){var n=this.getParents(e).map(function(e){return e.type});return t.some(function(e){return n.some(function(t){return t===e})})},e.prototype.isPlainStrNode=function(e){return e.type!==t.ASTNodeTypes.Str||e.parent?.type!==t.ASTNodeTypes.Paragraph?!1:!this.isChildNode(e,[t.ASTNodeTypes.BlockQuote])},e}()})),ui=m(((e,t)=>{t.exports=n;function n(e){if(e==null)return o;if(typeof e==`string`)return a(e);if(typeof e==`object`)return`length`in e?i(e):r(e);if(typeof e==`function`)return e;throw Error(`Expected function, string, or object as test`)}function r(e){return t;function t(t){for(var n in e)if(t[n]!==e[n])return!1;return!0}}function i(e){for(var t=[],r=-1;++r<e.length;)t[r]=n(e[r]);return i;function i(){for(var e=-1;++e<t.length;)if(t[e].apply(this,arguments))return!0;return!1}}function a(e){return t;function t(t){return!!(t&&t.type===e)}}function o(){return!0}})),di=m(((e,t)=>{t.exports=n;function n(e){return e}})),fi=m(((e,t)=>{t.exports=s;var n=ui(),r=di(),i=!0,a=`skip`,o=!1;s.CONTINUE=i,s.SKIP=a,s.EXIT=o;function s(e,t,i,s){var l,u;typeof t==`function`&&typeof i!=`function`&&(s=i,i=t,t=null),u=n(t),l=s?-1:1,d(e,null,[])();function d(e,n,f){var p=typeof e==`object`&&e?e:{},m;return typeof p.type==`string`&&(m=typeof p.tagName==`string`?p.tagName:typeof p.name==`string`?p.name:void 0,h.displayName=`node (`+r(p.type+(m?`<`+m+`>`:``))+`)`),h;function h(){var r=f.concat(e),p=[],m,h;if((!t||u(e,n,f[f.length-1]||null))&&(p=c(i(e,f)),p[0]===o))return p;if(e.children&&p[0]!==a)for(h=(s?e.children.length:-1)+l;h>-1&&h<e.children.length;){if(m=d(e.children[h],h,r)(),m[0]===o)return m;h=typeof m[1]==`number`?m[1]:h+l}return p}}}function c(e){return typeof e==`object`&&e&&`length`in e?e:typeof e==`number`?[i,e]:[e]}})),pi=m(((e,t)=>{t.exports=o;var n=fi(),r=n.CONTINUE,i=n.SKIP,a=n.EXIT;o.CONTINUE=r,o.SKIP=i,o.EXIT=a;function o(e,t,r,i){typeof t==`function`&&typeof r!=`function`&&(i=r,r=t,t=null),n(e,t,a,i);function a(e,t){var n=t[t.length-1],i=n?n.children.indexOf(e):null;return r(e,i,n)}}})),mi=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0});var n=t(pi());e.default=function(){function e(){this._ignoredRangeList=[]}return Object.defineProperty(e.prototype,"ignoredRanges",{get:function(){return this._ignoredRangeList},enumerable:!1,configurable:!0}),e.prototype.isIgnoredIndex=function(e){return this._ignoredRangeList.some(function(t){var n=t[0],r=t[1];return n<=e&&e<r})},e.prototype.isIgnoredRange=function(e){return this.isIgnoredIndex(e[0])||this.isIgnoredIndex(e[1])},e.prototype.isIgnored=function(e){return this.isIgnoredRange(e.range)},e.prototype.ignore=function(e){this.ignoreRange(e.range)},e.prototype.ignoreRange=function(e){this._ignoredRangeList.push(e)},e.prototype.ignoreChildrenByTypes=function(e,t){var r=this;(0,n.default)(e,function(e){t.includes(e.type)&&r.ignore(e)})},e}()})),hi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.binarySearch=e.upperBound=e.lowerBound=e.compare=void 0;function t(e,t){return e<t}e.compare=t;function n(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(n,e[o])?i=t:(a=o+1,i-=t+1)}return a}e.upperBound=n;function r(e,n,r=t){let i=e.length,a=0;for(;i;){let t=i>>>1,o=a+t;r(e[o],n)?(a=o+1,i-=t+1):i=t}return a}e.lowerBound=r;function i(e,n,i=t){let a=r(e,n,i);return a!==e.length&&!i(n,e[a])}e.binarySearch=i})),gi=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.StructuredSource=void 0;let t=hi();e.StructuredSource=class{constructor(e){this.indice=[0];let t=/[\r\n\u2028\u2029]/g,n=e.length;for(t.lastIndex=0;;){let r=t.exec(e);if(!r)break;let i=r.index;e.charCodeAt(i)===13&&e.charCodeAt(i+1)===10&&(i+=1);let a=i+1;if(n<a)break;this.indice.push(a),t.lastIndex=a}}get line(){return this.indice.length}locationToRange(e){return[this.positionToIndex(e.start),this.positionToIndex(e.end)]}rangeToLocation(e){return{start:this.indexToPosition(e[0]),end:this.indexToPosition(e[1])}}positionToIndex(e){return this.indice[e.line-1]+e.column}indexToPosition(e){let n=(0,t.upperBound)(this.indice,e);return{line:n,column:e-this.indice[n-1]}}}})),_i=m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.SourceLocation=void 0;var t=gi();e.SourceLocation=function(){function e(e){this.source=new t.StructuredSource(e)}return e.prototype.toAbsoluteLocation=function(e,t){var n=e.range,r=e.loc.start.line,i=e.loc.start.column;if(t.index!==void 0){var a=t.index;return n[0]+a}if(t.line!==void 0&&t.column!==void 0){var o=r+t.line;return t.column>0?this.source.positionToIndex({line:o,column:t.column}):this.source.positionToIndex({line:o,column:i})}if(t.line!==void 0&&t.line>0){var o=r+t.line;return this.source.positionToIndex({line:o,column:i})}return n[0]},e}()})),vi=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=a;var n=t(li()),r=t(mi()),i=_i();function a(e,t,a){var o=t.ignoreNodeTypes||[],s=new r.default,c=new n.default(e),l=e.getSource(),u=new i.SourceLocation(l),d=a(function(t,n){var r=u.toAbsoluteLocation(t,n);if(!s.isIgnoredIndex(r))return e.report(t,n)});return Object.keys(d).forEach(function(e){var t=d[e];d[e]=function(e){if(s.ignoreChildrenByTypes(e,o),!c.isChildNode(e,o)&&t)return t(e)}}),d}})),yi=m((e=>{var t=e&&e.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(e,"__esModule",{value:!0}),e.wrapReportHandler=e.RuleHelper=e.IgnoreNodeManager=void 0,e.RuleHelper=t(li()).default,e.IgnoreNodeManager=t(mi()).default;var n=vi();Object.defineProperty(e,"wrapReportHandler",{enumerable:!0,get:function(){return n.wrapReportHandler}})})),bi=_(m((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.report=e.default=void 0;var t=yi(),n=/([\uff61-\uff9f]+)/g,r=function(e){var{Syntax:r,RuleError:i,fixer:a,report:o,locator:s,getSource:c}=e,l=new t.RuleHelper(e);return{[r.Str](e){if(l.isPlainStrNode(e))for(var t of c(e).matchAll(n)){var r=t[0],u=t.index??0,d=[u,u+r.length];o(e,new i(`Disallow to use 半角カタカナ: "${r}"`,{padding:s.range(d),fix:a.replaceTextRange(d,r.normalize(`NFKC`))}))}}}};e.report=r,e.default={linter:r,fixer:r}}))(),1);const xi=[{ruleId:`no-invalid-control-character`,rule:i(o)},{ruleId:`no-hankaku-kana`,rule:i(bi.default)},{ruleId:`no-zero-width-spaces`,rule:i(s)}];async function Si(e,n){console.info(`Textlint: ${e}`);let i=t.dirname(e),o;try{o=await oi({roots:[i],userRoot:i,allowedRoots:[n,i]},e)}catch(t){return console.error(`${e}: ${t instanceof Error?t.message:String(t)}`),1}let s=new r,c=0;for(let e of Object.values(o.markdownFiles)){let t=(e.errors??[]).map(t=>`${e.filepath}:${t.row+1}:1: ${t.message}`);for(let e of new Set(t))console.error(e),c=1}let l=new Set;for(let{source:e}of o.slides){let t=`${e.filepath}:${e.index}`;if(l.has(t))continue;l.add(t);let n=e.contentStart>e.end?e.start:e.contentStart,r=e.raw.split(`
118
- `).slice(n-e.start).join(`
119
- `),i=await s.lintText(r,{filePath:e.filepath,ext:`.md`,plugins:[{pluginId:`markdown`,plugin:{Processor:a}}],rules:xi});for(let t of i.messages)console.error(`${e.filepath}:${n+t.line}:${t.column}: ${t.message} (${t.ruleId})`),c=1}return c}export{Si as lintSlidevText};
120
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGV2VGV4dGxpbnQtRG1NN0k2WE8uanMiLCJuYW1lcyI6WyJTQ0FMQVIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsIkJSRUFLIiwiU0tJUCIsIlJFTU9WRSIsInZpc2l0IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImlzQ29sbGVjdGlvbiIsImlzQ29sbGVjdGlvbiIsIlNDQUxBUiIsImlzQ29sbGVjdGlvbiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJpc0NvbGxlY3Rpb24iLCJpc1NjYWxhciIsInN0cmluZ2lmeSIsImlzU2NhbGFyIiwic3RyaW5naWZ5IiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5IiwiaW50UmVzb2x2ZSIsImludFN0cmluZ2lmeSIsImludE9jdCIsImludCIsImludEhleCIsInNjaGVtYSIsImludE9jdCIsImludCIsImludEhleCIsImZsb2F0TmFOIiwiZmxvYXRFeHAiLCJmbG9hdCIsImludElkZW50aWZ5Iiwic2NoZW1hIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsInNjaGVtYSIsInNjaGVtYSQyIiwiU0NBTEFSIiwic3RyaW5naWZ5IiwiaXNDb2xsZWN0aW9uIiwiaXNTY2FsYXIiLCJpc1NjYWxhciIsIlNDQUxBUiIsImlzU2NhbGFyIiwiaXNTY2FsYXIiLCJpc0NvbGxlY3Rpb24iLCJzdHJpbmdpZnkiLCJwYXJzZSIsIllBTUwiLCJSRV9DUkxGIiwiWUFNTCIsIllBTUwiLCJub0hhbmtha3VLYW5hIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BhbnRmdS91dGlscy9kaXN0L2luZGV4Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9Ac2xpZGV2L3BhcnNlci9kaXN0L3V0aWxzLm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9pZGVudGl0eS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC92aXNpdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvZGlyZWN0aXZlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvYW5jaG9ycy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9kb2MvYXBwbHlSZXZpdmVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL3RvSlMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvTm9kZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9BbGlhcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9TY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvZG9jL2NyZWF0ZU5vZGUuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvQ29sbGVjdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5Q29tbWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvZm9sZEZsb3dMaW5lcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeVBhaXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvbG9nLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9tZXJnZS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9hZGRQYWlyVG9KU01hcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9ub2Rlcy9QYWlyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L25vZGVzL1lBTUxNYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvbW1vbi9tYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvbm9kZXMvWUFNTFNlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3NlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL3N0cmluZy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29tbW9uL251bGwuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2NvcmUvYm9vbC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zdHJpbmdpZnkvc3RyaW5naWZ5TnVtYmVyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2Zsb2F0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9jb3JlL2ludC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEvY29yZS9zY2hlbWEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL2pzb24vc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9iaW5hcnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3BhaXJzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9vbWFwLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9ib29sLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9mbG9hdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvaW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS95YW1sLTEuMS9zZXQuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc2NoZW1hL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9zY2hlbWEveWFtbC0xLjEvc2NoZW1hLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS90YWdzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3NjaGVtYS9TY2hlbWEuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3Qvc3RyaW5naWZ5L3N0cmluZ2lmeURvY3VtZW50LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2RvYy9Eb2N1bWVudC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9lcnJvcnMuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLXByb3BzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvdXRpbC1jb250YWlucy1uZXdsaW5lLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvdXRpbC1mbG93LWluZGVudC1jaGVjay5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtbWFwLWluY2x1ZGVzLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1ibG9jay1tYXAuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNlcS5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZW5kLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvcmVzb2x2ZS1mbG93LWNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3NlLWNvbGxlY3Rpb24uanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3Jlc29sdmUtZmxvdy1zY2FsYXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3NlLXNjYWxhci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9jb21wb3NlL3V0aWwtZW1wdHktc2NhbGFyLXBvc2l0aW9uLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1ub2RlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L2NvbXBvc2UvY29tcG9zZS1kb2MuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvY29tcG9zZS9jb21wb3Nlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9jc3Qtc2NhbGFyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC1zdHJpbmdpZnkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvY3N0LXZpc2l0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3BhcnNlL2NzdC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9sZXhlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy95YW1sL2Jyb3dzZXIvZGlzdC9wYXJzZS9saW5lLWNvdW50ZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvcGFyc2UvcGFyc2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3lhbWwvYnJvd3Nlci9kaXN0L3B1YmxpYy1hcGkuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2Rpc3QvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMveWFtbC9icm93c2VyL2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BzbGlkZXYvcGFyc2VyL2Rpc3QvY29yZS5tanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvcGF0aGUvZGlzdC9zaGFyZWQvcGF0aGUuTS1lVGh0TloubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BzbGlkZXYvcGFyc2VyL2Rpc3QvZnMubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0B0ZXh0bGludC9hc3Qtbm9kZS10eXBlcy9saWIvc3JjL0FTVE5vZGVUeXBlcy5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdGV4dGxpbnQvYXN0LW5vZGUtdHlwZXMvbGliL3NyYy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvdGV4dGxpbnQtcnVsZS1oZWxwZXIuanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdW5pc3QtdXRpbC1pcy9jb252ZXJ0LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9jb2xvci5icm93c2VyLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cy9pbmRleC5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy91bmlzdC11dGlsLXZpc2l0L2luZGV4LmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtaGVscGVyL2xpYi9JZ25vcmVOb2RlTWFuYWdlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9ib3VuZGFyeS9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvc3RydWN0dXJlZC1zb3VyY2UvbGliL3N0cnVjdHVyZWQtc291cmNlLmpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RleHRsaW50LXJ1bGUtaGVscGVyL2xpYi9Tb3VyY2VMb2NhdGlvbi5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvd3JhcC1yZXBvcnQtaGFuZGxlci5qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy90ZXh0bGludC1ydWxlLWhlbHBlci9saWIvaW5kZXguanMiLCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvdGV4dGxpbnQtcnVsZS1uby1oYW5rYWt1LWthbmEvbGliL3RleHRsaW50LXJ1bGUtbm8taGFua2FrdS1rYW5hLmpzIiwiLi4vc3JjL3V0aWxzL3NsaWRldlRleHRsaW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGNsYW1wKG4sIG1pbiwgbWF4KSB7XG4gIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgbikpO1xufVxuZnVuY3Rpb24gc3VtKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGZsYXR0ZW5BcnJheWFibGUoYXJncykucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59XG5mdW5jdGlvbiBsZXJwKG1pbiwgbWF4LCB0KSB7XG4gIGNvbnN0IGludGVycG9sYXRpb24gPSBjbGFtcCh0LCAwLCAxKTtcbiAgcmV0dXJuIG1pbiArIChtYXggLSBtaW4pICogaW50ZXJwb2xhdGlvbjtcbn1cbmZ1bmN0aW9uIHJlbWFwKG4sIGluTWluLCBpbk1heCwgb3V0TWluLCBvdXRNYXgpIHtcbiAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IChuIC0gaW5NaW4pIC8gKGluTWF4IC0gaW5NaW4pO1xuICByZXR1cm4gbGVycChvdXRNaW4sIG91dE1heCwgaW50ZXJwb2xhdGlvbik7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkoYXJyYXkpIHtcbiAgYXJyYXkgPSBhcnJheSA/PyBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyYXkpID8gYXJyYXkgOiBbYXJyYXldO1xufVxuZnVuY3Rpb24gZmxhdHRlbkFycmF5YWJsZShhcnJheSkge1xuICByZXR1cm4gdG9BcnJheShhcnJheSkuZmxhdCgxKTtcbn1cbmZ1bmN0aW9uIG1lcmdlQXJyYXlhYmxlKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MuZmxhdE1hcCgoaSkgPT4gdG9BcnJheShpKSk7XG59XG5mdW5jdGlvbiBwYXJ0aXRpb24oYXJyYXksIC4uLmZpbHRlcnMpIHtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogZmlsdGVycy5sZW5ndGggKyAxIH0pLmZpbGwobnVsbCkubWFwKCgpID0+IFtdKTtcbiAgYXJyYXkuZm9yRWFjaCgoZSwgaWR4LCBhcnIpID0+IHtcbiAgICBsZXQgaSA9IDA7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgaWYgKGZpbHRlcihlLCBpZHgsIGFycikpIHtcbiAgICAgICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGkgKz0gMTtcbiAgICB9XG4gICAgcmVzdWx0W2ldLnB1c2goZSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGFycmF5KSk7XG59XG5mdW5jdGlvbiB1bmlxdWVCeShhcnJheSwgZXF1YWxGbikge1xuICByZXR1cm4gYXJyYXkucmVkdWNlKChhY2MsIGN1cikgPT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYWNjLmZpbmRJbmRleCgoaXRlbSkgPT4gZXF1YWxGbihjdXIsIGl0ZW0pKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKVxuICAgICAgYWNjLnB1c2goY3VyKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHJldHVybiBhdChhcnJheSwgLTEpO1xufVxuZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCB2YWx1ZSkge1xuICBpZiAoIWFycmF5KVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKHZhbHVlKTtcbiAgaWYgKGluZGV4ID49IDApIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGF0KGFycmF5LCBpbmRleCkge1xuICBjb25zdCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuKVxuICAgIHJldHVybiB2b2lkIDA7XG4gIGlmIChpbmRleCA8IDApXG4gICAgaW5kZXggKz0gbGVuO1xuICByZXR1cm4gYXJyYXlbaW5kZXhdO1xufVxuZnVuY3Rpb24gcmFuZ2UoLi4uYXJncykge1xuICBsZXQgc3RhcnQsIHN0b3AsIHN0ZXA7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgICBzdGVwID0gMTtcbiAgICBbc3RvcF0gPSBhcmdzO1xuICB9IGVsc2Uge1xuICAgIFtzdGFydCwgc3RvcCwgc3RlcCA9IDFdID0gYXJncztcbiAgfVxuICBjb25zdCBhcnIgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBzdGFydDtcbiAgd2hpbGUgKGN1cnJlbnQgPCBzdG9wKSB7XG4gICAgYXJyLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCArPSBzdGVwIHx8IDE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIG1vdmUoYXJyLCBmcm9tLCB0bykge1xuICBhcnIuc3BsaWNlKHRvLCAwLCBhcnIuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgcmV0dXJuIGFycjtcbn1cbmZ1bmN0aW9uIGNsYW1wQXJyYXlSYW5nZShuLCBhcnIpIHtcbiAgcmV0dXJuIGNsYW1wKG4sIDAsIGFyci5sZW5ndGggLSAxKTtcbn1cbmZ1bmN0aW9uIHNhbXBsZShhcnIsIHF1YW50aXR5KSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBxdWFudGl0eSB9LCAoXykgPT4gYXJyW01hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChhcnIubGVuZ3RoIC0gMSkpXSk7XG59XG5mdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgIFthcnJheVtpXSwgYXJyYXlbal1dID0gW2FycmF5W2pdLCBhcnJheVtpXV07XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuZnVuY3Rpb24gZmlsdGVySW5QbGFjZShhcnJheSwgcHJlZGljYXRlKSB7XG4gIGZvciAobGV0IGkgPSBhcnJheS5sZW5ndGg7IGktLTsgaSA+PSAwKSB7XG4gICAgaWYgKCFwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSlcbiAgICAgIGFycmF5LnNwbGljZShpLCAxKTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydChjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKCFjb25kaXRpb24pXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xufVxuY29uc3QgdG9TdHJpbmcgPSAodikgPT4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpO1xuZnVuY3Rpb24gZ2V0VHlwZU5hbWUodikge1xuICBpZiAodiA9PT0gbnVsbClcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIGNvbnN0IHR5cGUgPSB0b1N0cmluZyh2KS5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2ID09PSBcImZ1bmN0aW9uXCIgPyB0eXBlIDogdHlwZW9mIHY7XG59XG5mdW5jdGlvbiBub29wKCkge1xufVxuXG5mdW5jdGlvbiBpc0RlZXBFcXVhbCh2YWx1ZTEsIHZhbHVlMikge1xuICBjb25zdCB0eXBlMSA9IGdldFR5cGVOYW1lKHZhbHVlMSk7XG4gIGNvbnN0IHR5cGUyID0gZ2V0VHlwZU5hbWUodmFsdWUyKTtcbiAgaWYgKHR5cGUxICE9PSB0eXBlMilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlMSA9PT0gXCJhcnJheVwiKSB7XG4gICAgaWYgKHZhbHVlMS5sZW5ndGggIT09IHZhbHVlMi5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHZhbHVlMS5ldmVyeSgoaXRlbSwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGlzRGVlcEVxdWFsKGl0ZW0sIHZhbHVlMltpXSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKHR5cGUxID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3Qga2V5QXJyID0gT2JqZWN0LmtleXModmFsdWUxKTtcbiAgICBpZiAoa2V5QXJyLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModmFsdWUyKS5sZW5ndGgpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGtleUFyci5ldmVyeSgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gaXNEZWVwRXF1YWwodmFsdWUxW2tleV0sIHZhbHVlMltrZXldKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmlzKHZhbHVlMSwgdmFsdWUyKTtcbn1cblxuZnVuY3Rpb24gYmF0Y2hJbnZva2UoZnVuY3Rpb25zKSB7XG4gIGZ1bmN0aW9ucy5mb3JFYWNoKChmbikgPT4gZm4gJiYgZm4oKSk7XG59XG5mdW5jdGlvbiBpbnZva2UoZm4pIHtcbiAgcmV0dXJuIGZuKCk7XG59XG5mdW5jdGlvbiB0YXAodmFsdWUsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrKHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBub3ROdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgIT0gbnVsbDtcbn1cbmZ1bmN0aW9uIG5vTnVsbCh2KSB7XG4gIHJldHVybiB2ICE9PSBudWxsO1xufVxuZnVuY3Rpb24gbm90VW5kZWZpbmVkKHYpIHtcbiAgcmV0dXJuIHYgIT09IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIGlzVHJ1dGh5KHYpIHtcbiAgcmV0dXJuIEJvb2xlYW4odik7XG59XG5cbmNvbnN0IGlzRGVmID0gKHZhbCkgPT4gdHlwZW9mIHZhbCAhPT0gXCJ1bmRlZmluZWRcIjtcbmNvbnN0IGlzQm9vbGVhbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiYm9vbGVhblwiO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIjtcbmNvbnN0IGlzTnVtYmVyID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIjtcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIjtcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIjtcbmNvbnN0IGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IFVuZGVmaW5lZF1cIjtcbmNvbnN0IGlzTnVsbCA9ICh2YWwpID0+IHRvU3RyaW5nKHZhbCkgPT09IFwiW29iamVjdCBOdWxsXVwiO1xuY29uc3QgaXNSZWdFeHAgPSAodmFsKSA9PiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xuY29uc3QgaXNEYXRlID0gKHZhbCkgPT4gdG9TdHJpbmcodmFsKSA9PT0gXCJbb2JqZWN0IERhdGVdXCI7XG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSh2YWwpIHtcbiAgcmV0dXJuICF2YWwgfHwgT2JqZWN0KHZhbCkgIT09IHZhbDtcbn1cbmNvbnN0IGlzV2luZG93ID0gKHZhbCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0b1N0cmluZyh2YWwpID09PSBcIltvYmplY3QgV2luZG93XVwiO1xuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuZnVuY3Rpb24gc2xhc2goc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG59XG5mdW5jdGlvbiBlbnN1cmVQcmVmaXgocHJlZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgIHJldHVybiBwcmVmaXggKyBzdHI7XG4gIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBlbnN1cmVTdWZmaXgoc3VmZml4LCBzdHIpIHtcbiAgaWYgKCFzdHIuZW5kc1dpdGgoc3VmZml4KSlcbiAgICByZXR1cm4gc3RyICsgc3VmZml4O1xuICByZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gdGVtcGxhdGUoc3RyLCAuLi5hcmdzKSB7XG4gIGNvbnN0IFtmaXJzdEFyZywgZmFsbGJhY2tdID0gYXJncztcbiAgaWYgKGlzT2JqZWN0KGZpcnN0QXJnKSkge1xuICAgIGNvbnN0IHZhcnMgPSBmaXJzdEFyZztcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xceyhcXHcrKVxcfS9nLCAoXywga2V5KSA9PiB2YXJzW2tleV0gfHwgKCh0eXBlb2YgZmFsbGJhY2sgPT09IFwiZnVuY3Rpb25cIiA/IGZhbGxiYWNrKGtleSkgOiBmYWxsYmFjaykgPz8ga2V5KSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHsoXFxkKylcXH0vZywgKF8sIGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5kZXgpKVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgcmV0dXJuIGFyZ3NbaW5kZXhdO1xuICAgIH0pO1xuICB9XG59XG5jb25zdCB1cmxBbHBoYWJldCA9IFwidXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdFwiO1xuZnVuY3Rpb24gcmFuZG9tU3RyKHNpemUgPSAxNiwgZGljdCA9IHVybEFscGhhYmV0KSB7XG4gIGxldCBpZCA9IFwiXCI7XG4gIGxldCBpID0gc2l6ZTtcbiAgY29uc3QgbGVuID0gZGljdC5sZW5ndGg7XG4gIHdoaWxlIChpLS0pXG4gICAgaWQgKz0gZGljdFtNYXRoLnJhbmRvbSgpICogbGVuIHwgMF07XG4gIHJldHVybiBpZDtcbn1cbmZ1bmN0aW9uIGNhcGl0YWxpemUoc3RyKSB7XG4gIHJldHVybiBzdHJbMF0udG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xufVxuY29uc3QgX3JlRnVsbFdzID0gL15cXHMqJC87XG5mdW5jdGlvbiB1bmluZGVudChzdHIpIHtcbiAgY29uc3QgbGluZXMgPSAodHlwZW9mIHN0ciA9PT0gXCJzdHJpbmdcIiA/IHN0ciA6IHN0clswXSkuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHdoaXRlc3BhY2VMaW5lcyA9IGxpbmVzLm1hcCgobGluZSkgPT4gX3JlRnVsbFdzLnRlc3QobGluZSkpO1xuICBjb25zdCBjb21tb25JbmRlbnQgPSBsaW5lcy5yZWR1Y2UoKG1pbiwgbGluZSwgaWR4KSA9PiB7XG4gICAgaWYgKHdoaXRlc3BhY2VMaW5lc1tpZHhdKVxuICAgICAgcmV0dXJuIG1pbjtcbiAgICBjb25zdCBpbmRlbnQgPSBsaW5lLm1hdGNoKC9eXFxzKi8pPy5bMF0ubGVuZ3RoO1xuICAgIHJldHVybiBpbmRlbnQgPT09IHZvaWQgMCA/IG1pbiA6IE1hdGgubWluKG1pbiwgaW5kZW50KTtcbiAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgbGV0IGVtcHR5TGluZXNIZWFkID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNIZWFkIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tlbXB0eUxpbmVzSGVhZF0pXG4gICAgZW1wdHlMaW5lc0hlYWQrKztcbiAgbGV0IGVtcHR5TGluZXNUYWlsID0gMDtcbiAgd2hpbGUgKGVtcHR5TGluZXNUYWlsIDwgbGluZXMubGVuZ3RoICYmIHdoaXRlc3BhY2VMaW5lc1tsaW5lcy5sZW5ndGggLSBlbXB0eUxpbmVzVGFpbCAtIDFdKVxuICAgIGVtcHR5TGluZXNUYWlsKys7XG4gIHJldHVybiBsaW5lcy5zbGljZShlbXB0eUxpbmVzSGVhZCwgbGluZXMubGVuZ3RoIC0gZW1wdHlMaW5lc1RhaWwpLm1hcCgobGluZSkgPT4gbGluZS5zbGljZShjb21tb25JbmRlbnQpKS5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBvYmplY3RNYXAob2JqLCBmbikge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKG9iaikubWFwKChbaywgdl0pID0+IGZuKGssIHYpKS5maWx0ZXIobm90TnVsbGlzaClcbiAgKTtcbn1cbmZ1bmN0aW9uIGlzS2V5T2Yob2JqLCBrKSB7XG4gIHJldHVybiBrIGluIG9iajtcbn1cbmZ1bmN0aW9uIG9iamVjdEtleXMob2JqKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xufVxuZnVuY3Rpb24gb2JqZWN0RW50cmllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaik7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0W2tleV0pKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZGVlcE1lcmdlKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5mdW5jdGlvbiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKSB7XG4gIGlmICghc291cmNlcy5sZW5ndGgpXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICBpZiAoc291cmNlID09PSB2b2lkIDApXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBBcnJheS5pc0FycmF5KHNvdXJjZSkpXG4gICAgdGFyZ2V0LnB1c2goLi4uc291cmNlKTtcbiAgaWYgKGlzTWVyZ2FibGVPYmplY3QodGFyZ2V0KSAmJiBpc01lcmdhYmxlT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBvYmplY3RLZXlzKHNvdXJjZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJjb25zdHJ1Y3RvclwiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBbXTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWVyZ2FibGVPYmplY3Qoc291cmNlW2tleV0pKSB7XG4gICAgICAgIGlmICghdGFyZ2V0W2tleV0pXG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB7fTtcbiAgICAgICAgZGVlcE1lcmdlV2l0aEFycmF5KHRhcmdldFtrZXldLCBzb3VyY2Vba2V5XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWVwTWVyZ2VXaXRoQXJyYXkodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbn1cbmZ1bmN0aW9uIGlzTWVyZ2FibGVPYmplY3QoaXRlbSkge1xuICByZXR1cm4gaXNPYmplY3QoaXRlbSkgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSk7XG59XG5mdW5jdGlvbiBvYmplY3RQaWNrKG9iaiwga2V5cywgb21pdFVuZGVmaW5lZCA9IGZhbHNlKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZSgobiwgaykgPT4ge1xuICAgIGlmIChrIGluIG9iaikge1xuICAgICAgaWYgKCFvbWl0VW5kZWZpbmVkIHx8IG9ialtrXSAhPT0gdm9pZCAwKVxuICAgICAgICBuW2tdID0gb2JqW2tdO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfSwge30pO1xufVxuZnVuY3Rpb24gb2JqZWN0T21pdChvYmosIGtleXMsIG9taXRVbmRlZmluZWQgPSBmYWxzZSkge1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICByZXR1cm4gKCFvbWl0VW5kZWZpbmVkIHx8IHZhbHVlICE9PSB2b2lkIDApICYmICFrZXlzLmluY2x1ZGVzKGtleSk7XG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGNsZWFyVW5kZWZpbmVkKG9iaikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goKGtleSkgPT4gb2JqW2tleV0gPT09IHZvaWQgMCA/IGRlbGV0ZSBvYmpba2V5XSA6IHt9KTtcbiAgcmV0dXJuIG9iajtcbn1cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgdikge1xuICBpZiAob2JqID09IG51bGwpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgdik7XG59XG5jb25zdCBfb2JqZWN0SWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIG9iamVjdElkKG9iaikge1xuICBpZiAoaXNQcmltaXRpdmUob2JqKSlcbiAgICByZXR1cm4gb2JqO1xuICBpZiAoIV9vYmplY3RJZE1hcC5oYXMob2JqKSkge1xuICAgIF9vYmplY3RJZE1hcC5zZXQob2JqLCByYW5kb21TdHIoKSk7XG4gIH1cbiAgcmV0dXJuIF9vYmplY3RJZE1hcC5nZXQob2JqKTtcbn1cblxuLypcbkhvdyBpdCB3b3JrczpcbmB0aGlzLiNoZWFkYCBpcyBhbiBpbnN0YW5jZSBvZiBgTm9kZWAgd2hpY2gga2VlcHMgdHJhY2sgb2YgaXRzIGN1cnJlbnQgdmFsdWUgYW5kIG5lc3RzIGFub3RoZXIgaW5zdGFuY2Ugb2YgYE5vZGVgIHRoYXQga2VlcHMgdGhlIHZhbHVlIHRoYXQgY29tZXMgYWZ0ZXIgaXQuIFdoZW4gYSB2YWx1ZSBpcyBwcm92aWRlZCB0byBgLmVucXVldWUoKWAsIHRoZSBjb2RlIG5lZWRzIHRvIGl0ZXJhdGUgdGhyb3VnaCBgdGhpcy4jaGVhZGAsIGdvaW5nIGRlZXBlciBhbmQgZGVlcGVyIHRvIGZpbmQgdGhlIGxhc3QgdmFsdWUuIEhvd2V2ZXIsIGl0ZXJhdGluZyB0aHJvdWdoIGV2ZXJ5IHNpbmdsZSBpdGVtIGlzIHNsb3cuIFRoaXMgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgc2F2aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBsYXN0IHZhbHVlIGFzIGB0aGlzLiN0YWlsYCBzbyB0aGF0IGl0IGNhbiByZWZlcmVuY2UgaXQgdG8gYWRkIGEgbmV3IHZhbHVlLlxuKi9cblxuY2xhc3MgTm9kZSB7XG5cdHZhbHVlO1xuXHRuZXh0O1xuXG5cdGNvbnN0cnVjdG9yKHZhbHVlKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXHR9XG59XG5cbmNsYXNzIFF1ZXVlIHtcblx0I2hlYWQ7XG5cdCN0YWlsO1xuXHQjc2l6ZTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHR0aGlzLmNsZWFyKCk7XG5cdH1cblxuXHRlbnF1ZXVlKHZhbHVlKSB7XG5cdFx0Y29uc3Qgbm9kZSA9IG5ldyBOb2RlKHZhbHVlKTtcblxuXHRcdGlmICh0aGlzLiNoZWFkKSB7XG5cdFx0XHR0aGlzLiN0YWlsLm5leHQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuI2hlYWQgPSBub2RlO1xuXHRcdFx0dGhpcy4jdGFpbCA9IG5vZGU7XG5cdFx0fVxuXG5cdFx0dGhpcy4jc2l6ZSsrO1xuXHR9XG5cblx0ZGVxdWV1ZSgpIHtcblx0XHRjb25zdCBjdXJyZW50ID0gdGhpcy4jaGVhZDtcblx0XHRpZiAoIWN1cnJlbnQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLiNoZWFkID0gdGhpcy4jaGVhZC5uZXh0O1xuXHRcdHRoaXMuI3NpemUtLTtcblx0XHRyZXR1cm4gY3VycmVudC52YWx1ZTtcblx0fVxuXG5cdHBlZWsoKSB7XG5cdFx0aWYgKCF0aGlzLiNoZWFkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuI2hlYWQudmFsdWU7XG5cblx0XHQvLyBUT0RPOiBOb2RlLmpzIDE4LlxuXHRcdC8vIHJldHVybiB0aGlzLiNoZWFkPy52YWx1ZTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuI2hlYWQgPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy4jdGFpbCA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiNzaXplID0gMDtcblx0fVxuXG5cdGdldCBzaXplKCkge1xuXHRcdHJldHVybiB0aGlzLiNzaXplO1xuXHR9XG5cblx0KiBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuI2hlYWQ7XG5cblx0XHR3aGlsZSAoY3VycmVudCkge1xuXHRcdFx0eWllbGQgY3VycmVudC52YWx1ZTtcblx0XHRcdGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG5cdFx0fVxuXHR9XG5cblx0KiBkcmFpbigpIHtcblx0XHR3aGlsZSAodGhpcy4jaGVhZCkge1xuXHRcdFx0eWllbGQgdGhpcy5kZXF1ZXVlKCk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHBMaW1pdChjb25jdXJyZW5jeSkge1xuXHR2YWxpZGF0ZUNvbmN1cnJlbmN5KGNvbmN1cnJlbmN5KTtcblxuXHRjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZSgpO1xuXHRsZXQgYWN0aXZlQ291bnQgPSAwO1xuXG5cdGNvbnN0IHJlc3VtZU5leHQgPSAoKSA9PiB7XG5cdFx0Ly8gUHJvY2VzcyB0aGUgbmV4dCBxdWV1ZWQgZnVuY3Rpb24gaWYgd2UncmUgdW5kZXIgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kgJiYgcXVldWUuc2l6ZSA+IDApIHtcblx0XHRcdGFjdGl2ZUNvdW50Kys7XG5cdFx0XHRxdWV1ZS5kZXF1ZXVlKCkoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgbmV4dCA9ICgpID0+IHtcblx0XHRhY3RpdmVDb3VudC0tO1xuXHRcdHJlc3VtZU5leHQoKTtcblx0fTtcblxuXHRjb25zdCBydW4gPSBhc3luYyAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYW5kIGNhcHR1cmUgdGhlIHJlc3VsdCBwcm9taXNlXG5cdFx0Y29uc3QgcmVzdWx0ID0gKGFzeW5jICgpID0+IGZ1bmN0aW9uXyguLi5hcmd1bWVudHNfKSkoKTtcblxuXHRcdC8vIFJlc29sdmUgaW1tZWRpYXRlbHkgd2l0aCB0aGUgcHJvbWlzZSAoZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbilcblx0XHRyZXNvbHZlKHJlc3VsdCk7XG5cblx0XHQvLyBXYWl0IGZvciB0aGUgZnVuY3Rpb24gdG8gY29tcGxldGUgKHN1Y2Nlc3Mgb3IgZmFpbHVyZSlcblx0XHQvLyBXZSBjYXRjaCBlcnJvcnMgaGVyZSB0byBwcmV2ZW50IHVuaGFuZGxlZCByZWplY3Rpb25zLFxuXHRcdC8vIGJ1dCB0aGUgb3JpZ2luYWwgcHJvbWlzZSByZWplY3Rpb24gaXMgcHJlc2VydmVkIGZvciB0aGUgY2FsbGVyXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHJlc3VsdDtcblx0XHR9IGNhdGNoIHt9XG5cblx0XHQvLyBEZWNyZW1lbnQgYWN0aXZlIGNvdW50IGFuZCBwcm9jZXNzIG5leHQgcXVldWVkIGZ1bmN0aW9uXG5cdFx0bmV4dCgpO1xuXHR9O1xuXG5cdGNvbnN0IGVucXVldWUgPSAoZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSA9PiB7XG5cdFx0Ly8gUXVldWUgdGhlIGludGVybmFsIHJlc29sdmUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgcnVuIGZ1bmN0aW9uXG5cdFx0Ly8gdG8gcHJlc2VydmUgdGhlIGFzeW5jaHJvbm91cyBleGVjdXRpb24gY29udGV4dC5cblx0XHRuZXcgUHJvbWlzZShpbnRlcm5hbFJlc29sdmUgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByb21pc2UvcGFyYW0tbmFtZXNcblx0XHRcdHF1ZXVlLmVucXVldWUoaW50ZXJuYWxSZXNvbHZlKTtcblx0XHR9KS50aGVuKHJ1bi5iaW5kKHVuZGVmaW5lZCwgZnVuY3Rpb25fLCByZXNvbHZlLCBhcmd1bWVudHNfKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJvbWlzZS9wcmVmZXItYXdhaXQtdG8tdGhlblxuXG5cdFx0Ly8gU3RhcnQgcHJvY2Vzc2luZyBpbW1lZGlhdGVseSBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGNvbmN1cnJlbmN5IGxpbWl0XG5cdFx0aWYgKGFjdGl2ZUNvdW50IDwgY29uY3VycmVuY3kpIHtcblx0XHRcdHJlc3VtZU5leHQoKTtcblx0XHR9XG5cdH07XG5cblx0Y29uc3QgZ2VuZXJhdG9yID0gKGZ1bmN0aW9uXywgLi4uYXJndW1lbnRzXykgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0ZW5xdWV1ZShmdW5jdGlvbl8sIHJlc29sdmUsIGFyZ3VtZW50c18pO1xuXHR9KTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyhnZW5lcmF0b3IsIHtcblx0XHRhY3RpdmVDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBhY3RpdmVDb3VudCxcblx0XHR9LFxuXHRcdHBlbmRpbmdDb3VudDoge1xuXHRcdFx0Z2V0OiAoKSA9PiBxdWV1ZS5zaXplLFxuXHRcdH0sXG5cdFx0Y2xlYXJRdWV1ZToge1xuXHRcdFx0dmFsdWUoKSB7XG5cdFx0XHRcdHF1ZXVlLmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0Y29uY3VycmVuY3k6IHtcblx0XHRcdGdldDogKCkgPT4gY29uY3VycmVuY3ksXG5cblx0XHRcdHNldChuZXdDb25jdXJyZW5jeSkge1xuXHRcdFx0XHR2YWxpZGF0ZUNvbmN1cnJlbmN5KG5ld0NvbmN1cnJlbmN5KTtcblx0XHRcdFx0Y29uY3VycmVuY3kgPSBuZXdDb25jdXJyZW5jeTtcblxuXHRcdFx0XHRxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVubW9kaWZpZWQtbG9vcC1jb25kaXRpb25cblx0XHRcdFx0XHR3aGlsZSAoYWN0aXZlQ291bnQgPCBjb25jdXJyZW5jeSAmJiBxdWV1ZS5zaXplID4gMCkge1xuXHRcdFx0XHRcdFx0cmVzdW1lTmV4dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bWFwOiB7XG5cdFx0XHRhc3luYyB2YWx1ZShhcnJheSwgZnVuY3Rpb25fKSB7XG5cdFx0XHRcdGNvbnN0IHByb21pc2VzID0gYXJyYXkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHRoaXMoZnVuY3Rpb25fLCB2YWx1ZSwgaW5kZXgpKTtcblx0XHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcblx0XHRcdH0sXG5cdFx0fSxcblx0fSk7XG5cblx0cmV0dXJuIGdlbmVyYXRvcjtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb25jdXJyZW5jeShjb25jdXJyZW5jeSkge1xuXHRpZiAoISgoTnVtYmVyLmlzSW50ZWdlcihjb25jdXJyZW5jeSkgfHwgY29uY3VycmVuY3kgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgJiYgY29uY3VycmVuY3kgPiAwKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBjb25jdXJyZW5jeWAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCcpO1xuXHR9XG59XG5cbmNvbnN0IFZPSUQgPSBTeW1ib2woXCJwLXZvaWRcIik7XG5jbGFzcyBQSW5zdGFuY2UgZXh0ZW5kcyBQcm9taXNlIHtcbiAgY29uc3RydWN0b3IoaXRlbXMgPSBbXSwgb3B0aW9ucykge1xuICAgIHN1cGVyKCgpID0+IHtcbiAgICB9KTtcbiAgICB0aGlzLml0ZW1zID0gaXRlbXM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBwcm9taXNlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGdldCBwcm9taXNlKCkge1xuICAgIGxldCBiYXRjaDtcbiAgICBjb25zdCBpdGVtcyA9IFsuLi5BcnJheS5mcm9tKHRoaXMuaXRlbXMpLCAuLi5BcnJheS5mcm9tKHRoaXMucHJvbWlzZXMpXTtcbiAgICBpZiAodGhpcy5vcHRpb25zPy5jb25jdXJyZW5jeSkge1xuICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQodGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KTtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMubWFwKChwMikgPT4gbGltaXQoKCkgPT4gcDIpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhdGNoID0gUHJvbWlzZS5hbGwoaXRlbXMpO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2gudGhlbigobCkgPT4gbC5maWx0ZXIoKGkpID0+IGkgIT09IFZPSUQpKTtcbiAgfVxuICBhZGQoLi4uYXJncykge1xuICAgIGFyZ3MuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5wcm9taXNlcy5hZGQoaSk7XG4gICAgfSk7XG4gIH1cbiAgbWFwKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBpZiAodiA9PT0gVk9JRClcbiAgICAgICAgICByZXR1cm4gVk9JRDtcbiAgICAgICAgcmV0dXJuIGZuKHYsIGlkeCk7XG4gICAgICB9KSxcbiAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG4gIH1cbiAgZmlsdGVyKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQSW5zdGFuY2UoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuaXRlbXMpLm1hcChhc3luYyAoaSwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHYgPSBhd2FpdCBpO1xuICAgICAgICBjb25zdCByID0gYXdhaXQgZm4odiwgaWR4KTtcbiAgICAgICAgaWYgKCFyKVxuICAgICAgICAgIHJldHVybiBWT0lEO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0pLFxuICAgICAgdGhpcy5vcHRpb25zXG4gICAgKTtcbiAgfVxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZuKS50aGVuKCk7XG4gIH1cbiAgcmVkdWNlKGZuLCBpbml0aWFsVmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4oKGFycmF5KSA9PiBhcnJheS5yZWR1Y2UoZm4sIGluaXRpYWxWYWx1ZSkpO1xuICB9XG4gIGNsZWFyKCkge1xuICAgIHRoaXMucHJvbWlzZXMuY2xlYXIoKTtcbiAgfVxuICB0aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvbWlzZS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgfVxuICBjYXRjaChmbikge1xuICAgIHJldHVybiB0aGlzLnByb21pc2UuY2F0Y2goZm4pO1xuICB9XG4gIGZpbmFsbHkoZm4pIHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlLmZpbmFsbHkoZm4pO1xuICB9XG59XG5mdW5jdGlvbiBwKGl0ZW1zLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUEluc3RhbmNlKGl0ZW1zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2luZ2xldG9uUHJvbWlzZShmbikge1xuICBsZXQgX3Byb21pc2U7XG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgaWYgKCFfcHJvbWlzZSlcbiAgICAgIF9wcm9taXNlID0gZm4oKTtcbiAgICByZXR1cm4gX3Byb21pc2U7XG4gIH1cbiAgd3JhcHBlci5yZXNldCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBfcHJldiA9IF9wcm9taXNlO1xuICAgIF9wcm9taXNlID0gdm9pZCAwO1xuICAgIGlmIChfcHJldilcbiAgICAgIGF3YWl0IF9wcmV2O1xuICB9O1xuICByZXR1cm4gd3JhcHBlcjtcbn1cbmZ1bmN0aW9uIHNsZWVwKG1zLCBjYWxsYmFjaykge1xuICByZXR1cm4gbmV3IFByb21pc2UoXG4gICAgKHJlc29sdmUpID0+IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgY2FsbGJhY2s/LigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlUHJvbWlzZUxvY2soKSB7XG4gIGNvbnN0IGxvY2tzID0gW107XG4gIHJldHVybiB7XG4gICAgYXN5bmMgcnVuKGZuKSB7XG4gICAgICBjb25zdCBwID0gZm4oKTtcbiAgICAgIGxvY2tzLnB1c2gocCk7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJlbW92ZShsb2NrcywgcCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyB3YWl0KCkge1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGxvY2tzKTtcbiAgICB9LFxuICAgIGlzV2FpdGluZygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKGxvY2tzLmxlbmd0aCk7XG4gICAgfSxcbiAgICBjbGVhcigpIHtcbiAgICAgIGxvY2tzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlQ29udHJvbGxlZFByb21pc2UoKSB7XG4gIGxldCByZXNvbHZlLCByZWplY3Q7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIHByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG4gIHByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuY29uc3QgdGltZXN0YW1wID0gKCkgPT4gK0RhdGUubm93KCk7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmaW5lZCxuby1wYXJhbS1yZWFzc2lnbixuby1zaGFkb3cgKi9cblxuLyoqXG4gKiBUaHJvdHRsZSBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4gRXNwZWNpYWxseSB1c2VmdWwgZm9yIHJhdGUgbGltaXRpbmdcbiAqIGV4ZWN1dGlvbiBvZiBoYW5kbGVycyBvbiBldmVudHMgbGlrZSByZXNpemUgYW5kIHNjcm9sbC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcilcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW9zdCB1c2VmdWwuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtICAgICAgICAgICAgICAgQSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhZnRlciBkZWxheSBtaWxsaXNlY29uZHMuIFRoZSBgdGhpc2AgY29udGV4dCBhbmQgYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2gsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMtaXMsIHRvIGBjYWxsYmFja2Agd2hlbiB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGV4ZWN1dGVkLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtICAgICAgICAgICAgICBBbiBvYmplY3QgdG8gY29uZmlndXJlIG9wdGlvbnMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vVHJhaWxpbmddIC0gICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIG5vVHJhaWxpbmcgaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBvbmx5IGV4ZWN1dGUgZXZlcnkgYGRlbGF5YCBtaWxsaXNlY29uZHNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZC4gSWYgbm9UcmFpbGluZyBpcyBmYWxzZSBvciB1bnNwZWNpZmllZCwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBmaW5hbCB0aW1lIGFmdGVyIHRoZSBsYXN0IHRocm90dGxlZC1mdW5jdGlvbiBjYWxsLiAoQWZ0ZXIgdGhlIHRocm90dGxlZC1mdW5jdGlvbiBoYXMgbm90IGJlZW4gY2FsbGVkIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm5vTGVhZGluZ10gLSAgIE9wdGlvbmFsLCBkZWZhdWx0cyB0byBmYWxzZS4gSWYgbm9MZWFkaW5nIGlzIGZhbHNlLCB0aGUgZmlyc3QgdGhyb3R0bGVkLWZ1bmN0aW9uIGNhbGwgd2lsbCBleGVjdXRlIGNhbGxiYWNrXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkuIElmIG5vTGVhZGluZyBpcyB0cnVlLCB0aGUgZmlyc3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbiB3aWxsIGJlIHNraXBwZWQuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgd2lsbCBuZXZlciBleGVjdXRlZCBpZiBib3RoIG5vTGVhZGluZyA9IHRydWUgYW5kIG5vVHJhaWxpbmcgPSB0cnVlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kZWJvdW5jZU1vZGVdIC0gSWYgYGRlYm91bmNlTW9kZWAgaXMgdHJ1ZSAoYXQgYmVnaW4pLCBzY2hlZHVsZSBgY2xlYXJgIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy4gSWYgYGRlYm91bmNlTW9kZWAgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGFmdGVyIGBkZWxheWAgbXMuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgdGhyb3R0bGVkLCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUkMSAoZGVsYXksIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBfcmVmID0gb3B0aW9ucyB8fCB7fSxcbiAgICAgIF9yZWYkbm9UcmFpbGluZyA9IF9yZWYubm9UcmFpbGluZyxcbiAgICAgIG5vVHJhaWxpbmcgPSBfcmVmJG5vVHJhaWxpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRub1RyYWlsaW5nLFxuICAgICAgX3JlZiRub0xlYWRpbmcgPSBfcmVmLm5vTGVhZGluZyxcbiAgICAgIG5vTGVhZGluZyA9IF9yZWYkbm9MZWFkaW5nID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkbm9MZWFkaW5nLFxuICAgICAgX3JlZiRkZWJvdW5jZU1vZGUgPSBfcmVmLmRlYm91bmNlTW9kZSxcbiAgICAgIGRlYm91bmNlTW9kZSA9IF9yZWYkZGVib3VuY2VNb2RlID09PSB2b2lkIDAgPyB1bmRlZmluZWQgOiBfcmVmJGRlYm91bmNlTW9kZTtcbiAgLypcbiAgICogQWZ0ZXIgd3JhcHBlciBoYXMgc3RvcHBlZCBiZWluZyBjYWxsZWQsIHRoaXMgdGltZW91dCBlbnN1cmVzIHRoYXRcbiAgICogYGNhbGxiYWNrYCBpcyBleGVjdXRlZCBhdCB0aGUgcHJvcGVyIHRpbWVzIGluIGB0aHJvdHRsZWAgYW5kIGBlbmRgXG4gICAqIGRlYm91bmNlIG1vZGVzLlxuICAgKi9cblxuXG4gIHZhciB0aW1lb3V0SUQ7XG4gIHZhciBjYW5jZWxsZWQgPSBmYWxzZTsgLy8gS2VlcCB0cmFjayBvZiB0aGUgbGFzdCB0aW1lIGBjYWxsYmFja2Agd2FzIGV4ZWN1dGVkLlxuXG4gIHZhciBsYXN0RXhlYyA9IDA7IC8vIEZ1bmN0aW9uIHRvIGNsZWFyIGV4aXN0aW5nIHRpbWVvdXRcblxuICBmdW5jdGlvbiBjbGVhckV4aXN0aW5nVGltZW91dCgpIHtcbiAgICBpZiAodGltZW91dElEKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICB9XG4gIH0gLy8gRnVuY3Rpb24gdG8gY2FuY2VsIG5leHQgZXhlY1xuXG5cbiAgZnVuY3Rpb24gY2FuY2VsKG9wdGlvbnMpIHtcbiAgICB2YXIgX3JlZjIgPSBvcHRpb25zIHx8IHt9LFxuICAgICAgICBfcmVmMiR1cGNvbWluZ09ubHkgPSBfcmVmMi51cGNvbWluZ09ubHksXG4gICAgICAgIHVwY29taW5nT25seSA9IF9yZWYyJHVwY29taW5nT25seSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcmVmMiR1cGNvbWluZ09ubHk7XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuICAgIGNhbmNlbGxlZCA9ICF1cGNvbWluZ09ubHk7XG4gIH1cbiAgLypcbiAgICogVGhlIGB3cmFwcGVyYCBmdW5jdGlvbiBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSB0aHJvdHRsaW5nIC8gZGVib3VuY2luZ1xuICAgKiBmdW5jdGlvbmFsaXR5IGFuZCB3aGVuIGV4ZWN1dGVkIHdpbGwgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggYGNhbGxiYWNrYFxuICAgKiBpcyBleGVjdXRlZC5cbiAgICovXG5cblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNfID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJndW1lbnRzX1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGVsYXBzZWQgPSBEYXRlLm5vdygpIC0gbGFzdEV4ZWM7XG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBFeGVjdXRlIGBjYWxsYmFja2AgYW5kIHVwZGF0ZSB0aGUgYGxhc3RFeGVjYCB0aW1lc3RhbXAuXG5cblxuICAgIGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICBsYXN0RXhlYyA9IERhdGUubm93KCk7XG4gICAgICBjYWxsYmFjay5hcHBseShzZWxmLCBhcmd1bWVudHNfKTtcbiAgICB9XG4gICAgLypcbiAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbikgdGhpcyBpcyB1c2VkIHRvIGNsZWFyIHRoZSBmbGFnXG4gICAgICogdG8gYWxsb3cgZnV0dXJlIGBjYWxsYmFja2AgZXhlY3V0aW9ucy5cbiAgICAgKi9cblxuXG4gICAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICB0aW1lb3V0SUQgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub0xlYWRpbmcgJiYgZGVib3VuY2VNb2RlICYmICF0aW1lb3V0SUQpIHtcbiAgICAgIC8qXG4gICAgICAgKiBTaW5jZSBgd3JhcHBlcmAgaXMgYmVpbmcgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmRcbiAgICAgICAqIGBkZWJvdW5jZU1vZGVgIGlzIHRydWUgKGF0IGJlZ2luKSwgZXhlY3V0ZSBgY2FsbGJhY2tgXG4gICAgICAgKiBhbmQgbm9MZWFkaW5nICE9IHRydWUuXG4gICAgICAgKi9cbiAgICAgIGV4ZWMoKTtcbiAgICB9XG5cbiAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuXG4gICAgaWYgKGRlYm91bmNlTW9kZSA9PT0gdW5kZWZpbmVkICYmIGVsYXBzZWQgPiBkZWxheSkge1xuICAgICAgaWYgKG5vTGVhZGluZykge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGggbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzXG4gICAgICAgICAqIGJlZW4gZXhjZWVkZWQsIHVwZGF0ZSBgbGFzdEV4ZWNgIGFuZCBzY2hlZHVsZSBgY2FsbGJhY2tgXG4gICAgICAgICAqIHRvIGV4ZWN1dGUgYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAgICovXG4gICAgICAgIGxhc3RFeGVjID0gRGF0ZS5ub3coKTtcblxuICAgICAgICBpZiAoIW5vVHJhaWxpbmcpIHtcbiAgICAgICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKlxuICAgICAgICAgKiBJbiB0aHJvdHRsZSBtb2RlIHdpdGhvdXQgbm9MZWFkaW5nLCBpZiBgZGVsYXlgIHRpbWUgaGFzIGJlZW4gZXhjZWVkZWQsIGV4ZWN1dGVcbiAgICAgICAgICogYGNhbGxiYWNrYC5cbiAgICAgICAgICovXG4gICAgICAgIGV4ZWMoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vVHJhaWxpbmcgIT09IHRydWUpIHtcbiAgICAgIC8qXG4gICAgICAgKiBJbiB0cmFpbGluZyB0aHJvdHRsZSBtb2RlLCBzaW5jZSBgZGVsYXlgIHRpbWUgaGFzIG5vdCBiZWVuXG4gICAgICAgKiBleGNlZWRlZCwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0byBleGVjdXRlIGBkZWxheWAgbXMgYWZ0ZXIgbW9zdFxuICAgICAgICogcmVjZW50IGV4ZWN1dGlvbi5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyB0cnVlIChhdCBiZWdpbiksIHNjaGVkdWxlIGBjbGVhcmAgdG8gZXhlY3V0ZVxuICAgICAgICogYWZ0ZXIgYGRlbGF5YCBtcy5cbiAgICAgICAqXG4gICAgICAgKiBJZiBgZGVib3VuY2VNb2RlYCBpcyBmYWxzZSAoYXQgZW5kKSwgc2NoZWR1bGUgYGNhbGxiYWNrYCB0b1xuICAgICAgICogZXhlY3V0ZSBhZnRlciBgZGVsYXlgIG1zLlxuICAgICAgICovXG4gICAgICB0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgZGVib3VuY2VNb2RlID09PSB1bmRlZmluZWQgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSk7XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlci5jYW5jZWwgPSBjYW5jZWw7IC8vIFJldHVybiB0aGUgd3JhcHBlciBmdW5jdGlvbi5cblxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkICovXG4vKipcbiAqIERlYm91bmNlIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLiBEZWJvdW5jaW5nLCB1bmxpa2UgdGhyb3R0bGluZyxcbiAqIGd1YXJhbnRlZXMgdGhhdCBhIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgYSBzaW5nbGUgdGltZSwgZWl0aGVyIGF0IHRoZVxuICogdmVyeSBiZWdpbm5pbmcgb2YgYSBzZXJpZXMgb2YgY2FsbHMsIG9yIGF0IHRoZSB2ZXJ5IGVuZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZGVsYXkgLSAgICAgICAgICAgICAgIEEgemVyby1vci1ncmVhdGVyIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gRm9yIGV2ZW50IGNhbGxiYWNrcywgdmFsdWVzIGFyb3VuZCAxMDAgb3IgMjUwIChvciBldmVuIGhpZ2hlcikgYXJlIG1vc3QgdXNlZnVsLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSAgICAgICAgICBBIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIGRlbGF5IG1pbGxpc2Vjb25kcy4gVGhlIGB0aGlzYCBjb250ZXh0IGFuZCBhbGwgYXJndW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCwgYXMtaXMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBgY2FsbGJhY2tgIHdoZW4gdGhlIGRlYm91bmNlZC1mdW5jdGlvbiBpcyBleGVjdXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSAgICAgICAgICAgQW4gb2JqZWN0IHRvIGNvbmZpZ3VyZSBvcHRpb25zLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hdEJlZ2luXSAtICBPcHRpb25hbCwgZGVmYXVsdHMgdG8gZmFsc2UuIElmIGF0QmVnaW4gaXMgZmFsc2Ugb3IgdW5zcGVjaWZpZWQsIGNhbGxiYWNrIHdpbGwgb25seSBiZSBleGVjdXRlZCBgZGVsYXlgIG1pbGxpc2Vjb25kc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGxhc3QgZGVib3VuY2VkLWZ1bmN0aW9uIGNhbGwuIElmIGF0QmVnaW4gaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZCBvbmx5IGF0IHRoZSBmaXJzdCBkZWJvdW5jZWQtZnVuY3Rpb24gY2FsbC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBZnRlciB0aGUgdGhyb3R0bGVkLWZ1bmN0aW9uIGhhcyBub3QgYmVlbiBjYWxsZWQgZm9yIGBkZWxheWAgbWlsbGlzZWNvbmRzLCB0aGUgaW50ZXJuYWwgY291bnRlciBpcyByZXNldCkuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldywgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICovXG5cbmZ1bmN0aW9uIGRlYm91bmNlJDEgKGRlbGF5LCBjYWxsYmFjaywgb3B0aW9ucykge1xuICB2YXIgX3JlZiA9IG9wdGlvbnMgfHwge30sXG4gICAgICBfcmVmJGF0QmVnaW4gPSBfcmVmLmF0QmVnaW4sXG4gICAgICBhdEJlZ2luID0gX3JlZiRhdEJlZ2luID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYkYXRCZWdpbjtcblxuICByZXR1cm4gdGhyb3R0bGUkMShkZWxheSwgY2FsbGJhY2ssIHtcbiAgICBkZWJvdW5jZU1vZGU6IGF0QmVnaW4gIT09IGZhbHNlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZSguLi5hcmdzKSB7XG4gIHJldHVybiB0aHJvdHRsZSQxKC4uLmFyZ3MpO1xufVxuZnVuY3Rpb24gZGVib3VuY2UoLi4uYXJncykge1xuICByZXR1cm4gZGVib3VuY2UkMSguLi5hcmdzKTtcbn1cblxuZXhwb3J0IHsgYXNzZXJ0LCBhdCwgYmF0Y2hJbnZva2UsIGNhcGl0YWxpemUsIGNsYW1wLCBjbGFtcEFycmF5UmFuZ2UsIGNsZWFyVW5kZWZpbmVkLCBjcmVhdGVDb250cm9sbGVkUHJvbWlzZSwgY3JlYXRlUHJvbWlzZUxvY2ssIGNyZWF0ZVNpbmdsZXRvblByb21pc2UsIGRlYm91bmNlLCBkZWVwTWVyZ2UsIGRlZXBNZXJnZVdpdGhBcnJheSwgZW5zdXJlUHJlZml4LCBlbnN1cmVTdWZmaXgsIGZpbHRlckluUGxhY2UsIGZsYXR0ZW5BcnJheWFibGUsIGdldFR5cGVOYW1lLCBoYXNPd25Qcm9wZXJ0eSwgaW52b2tlLCBpc0Jvb2xlYW4sIGlzQnJvd3NlciwgaXNEYXRlLCBpc0RlZXBFcXVhbCwgaXNEZWYsIGlzRnVuY3Rpb24sIGlzS2V5T2YsIGlzTnVsbCwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNSZWdFeHAsIGlzU3RyaW5nLCBpc1RydXRoeSwgaXNVbmRlZmluZWQsIGlzV2luZG93LCBsYXN0LCBsZXJwLCBtZXJnZUFycmF5YWJsZSwgbW92ZSwgbm9OdWxsLCBub29wLCBub3ROdWxsaXNoLCBub3RVbmRlZmluZWQsIG9iamVjdEVudHJpZXMsIG9iamVjdElkLCBvYmplY3RLZXlzLCBvYmplY3RNYXAsIG9iamVjdE9taXQsIG9iamVjdFBpY2ssIHAsIHBhcnRpdGlvbiwgcmFuZG9tU3RyLCByYW5nZSwgcmVtYXAsIHJlbW92ZSwgc2FtcGxlLCBzaHVmZmxlLCBzbGFzaCwgc2xlZXAsIHN1bSwgdGFwLCB0ZW1wbGF0ZSwgdGhyb3R0bGUsIHRpbWVzdGFtcCwgdG9BcnJheSwgdG9TdHJpbmcsIHVuaW5kZW50LCB1bmlxLCB1bmlxdWVCeSB9O1xuIiwiaW1wb3J0IHsgaXNOdW1iZXIsIHJhbmdlLCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuLy8jcmVnaW9uIHNyYy90aW1lc3BsaXQvdGltZXN0cmluZy50c1xuLyoqXG4qIFBhcnNlIHRpbWVzdGFtcCBpbnRvIHNlY29uZHNcbipcbiogQWNjZXB0czpcbiogLSAxMDo1MC4xXG4qIC0gMTBzXG4qIC0gNW1cbiogLSAzbWluXG4qIC0gM21pbnMgNXNlY3NcbiogLSAxMC41bTNzXG4qIC0gKzEwc1xuKiAtIDFoMTBtMzBzXG4qIC0gMWg0c1xuKiAtIDE6MToxXG4qL1xuY29uc3QgUkVfQUxQSEEgPSAvW2Etel0vaTtcbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyh0aW1lc3RhbXApIHtcblx0aWYgKHR5cGVvZiB0aW1lc3RhbXAgPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG5cdFx0c2Vjb25kczogdGltZXN0YW1wLFxuXHRcdHJlbGF0aXZlOiBmYWxzZVxuXHR9O1xuXHRjb25zdCByZWxhdGl2ZSA9IHRpbWVzdGFtcC5zdGFydHNXaXRoKFwiK1wiKTtcblx0aWYgKHJlbGF0aXZlKSB0aW1lc3RhbXAgPSB0aW1lc3RhbXAuc2xpY2UoMSk7XG5cdGxldCBzZWNvbmRzID0gMDtcblx0aWYgKHRpbWVzdGFtcC5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRjb25zdCBwYXJ0cyA9IHRpbWVzdGFtcC5zcGxpdChcIjpcIikubWFwKE51bWJlcik7XG5cdFx0bGV0IGggPSAwO1xuXHRcdGxldCBtID0gMDtcblx0XHRsZXQgcyA9IDA7XG5cdFx0aWYgKHBhcnRzLmxlbmd0aCA9PT0gMykge1xuXHRcdFx0aCA9IHBhcnRzWzBdO1xuXHRcdFx0bSA9IHBhcnRzWzFdO1xuXHRcdFx0cyA9IHBhcnRzWzJdO1xuXHRcdH0gZWxzZSBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRtID0gcGFydHNbMF07XG5cdFx0XHRzID0gcGFydHNbMV07XG5cdFx0fSBlbHNlIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHMgPSBwYXJ0c1swXTtcblx0XHRlbHNlIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHRpbWVzdGFtcCBmb3JtYXRcIik7XG5cdFx0aWYgKE51bWJlci5pc05hTihoKSB8fCBOdW1iZXIuaXNOYU4obSkgfHwgTnVtYmVyLmlzTmFOKHMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCB0aW1lc3RhbXAgZm9ybWF0XCIpO1xuXHRcdHNlY29uZHMgPSAoaCB8fCAwKSAqIDM2MDAgKyAobSB8fCAwKSAqIDYwICsgKHMgfHwgMCk7XG5cdH0gZWxzZSBpZiAoIVJFX0FMUEhBLnRlc3QodGltZXN0YW1wKSkgc2Vjb25kcyA9IE51bWJlcih0aW1lc3RhbXApO1xuXHRlbHNlIHtcblx0XHRjb25zdCB1bml0TWFwID0ge1xuXHRcdFx0czogMSxcblx0XHRcdHNlYzogMSxcblx0XHRcdHNlY3M6IDEsXG5cdFx0XHRtOiA2MCxcblx0XHRcdG1pbjogNjAsXG5cdFx0XHRtaW5zOiA2MCxcblx0XHRcdGg6IDM2MDAsXG5cdFx0XHRocjogMzYwMCxcblx0XHRcdGhyczogMzYwMCxcblx0XHRcdGhvdXI6IDM2MDAsXG5cdFx0XHRob3VyczogMzYwMCxcblx0XHRcdGRheTogODY0MDAsXG5cdFx0XHRkYXlzOiA4NjQwMCxcblx0XHRcdHdlZWs6IDYwNDgwMCxcblx0XHRcdHdlZWtzOiA2MDQ4MDAsXG5cdFx0XHRtb250aDogMjYyOTc0Nixcblx0XHRcdG1vbnRoczogMjYyOTc0Nixcblx0XHRcdHllYXI6IDMxNTU2OTUyLFxuXHRcdFx0eWVhcnM6IDMxNTU2OTUyXG5cdFx0fTtcblx0XHRjb25zdCByZWdleCA9IC8oW1xcZC5dKykoW2Etel0rKS9naTtcblx0XHRjb25zdCBtYXRjaGVzID0gdGltZXN0YW1wLm1hdGNoQWxsKHJlZ2V4KTtcblx0XHRpZiAobWF0Y2hlcykgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IE51bWJlcihtYXRjaFsxXSk7XG5cdFx0XHRpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCB0aW1lc3RhbXAgdmFsdWU6ICR7bWF0Y2hbMV19YCk7XG5cdFx0XHRjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKTtcblx0XHRcdGlmICghKHVuaXQgaW4gdW5pdE1hcCkpIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdGltZXN0YW1wIHVuaXQ6ICR7dW5pdH1gKTtcblx0XHRcdHNlY29uZHMgKz0gdmFsdWUgKiB1bml0TWFwW3VuaXRdO1xuXHRcdH1cblx0XHRjb25zdCByZW1haW5pbmcgPSB0aW1lc3RhbXAucmVwbGFjZShyZWdleCwgXCJcIikudHJpbSgpO1xuXHRcdGlmIChyZW1haW5pbmcpIHRocm93IG5ldyBUeXBlRXJyb3IoYFVua25vd24gdGltZXN0YW1wIHJlbWFpbmluZzogJHtyZW1haW5pbmd9YCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRzZWNvbmRzLFxuXHRcdHJlbGF0aXZlXG5cdH07XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvdGltZXNwbGl0L3RpbWVzcGxpdC50c1xuZnVuY3Rpb24gcGFyc2VUaW1lc3BsaXRzKGlucHV0cykge1xuXHRsZXQgdHMgPSAwO1xuXHRjb25zdCBvdXRwdXRzID0gW107XG5cdGxldCBjdXJyZW50ID0ge1xuXHRcdHRpbWVzdGFtcFN0YXJ0OiB0cyxcblx0XHR0aW1lc3RhbXBFbmQ6IHRzLFxuXHRcdG5vU3RhcnQ6IDAsXG5cdFx0bm9FbmQ6IDAsXG5cdFx0dGl0bGU6IFwiW3N0YXJ0XVwiXG5cdH07XG5cdG91dHB1dHMucHVzaChjdXJyZW50KTtcblx0Zm9yIChjb25zdCBpbnB1dCBvZiBpbnB1dHMpIHtcblx0XHRjb25zdCB0aW1lID0gcGFyc2VUaW1lU3RyaW5nKGlucHV0LnRpbWVzcGxpdCk7XG5cdFx0Y29uc3QgZW5kID0gdGltZS5yZWxhdGl2ZSA/IHRzICsgdGltZS5zZWNvbmRzIDogdGltZS5zZWNvbmRzO1xuXHRcdGlmIChlbmQgPCB0cykgdGhyb3cgbmV3IEVycm9yKGBUaW1lc3BsaXQgZW5kICR7ZW5kfSBpcyBiZWZvcmUgc3RhcnQgJHt0c31gKTtcblx0XHRjdXJyZW50LnRpbWVzdGFtcEVuZCA9IGVuZDtcblx0XHRjdXJyZW50Lm5vRW5kID0gaW5wdXQubm87XG5cdFx0aWYgKGlucHV0LnRpdGxlKSBjdXJyZW50LnRpdGxlID0gaW5wdXQudGl0bGU7XG5cdFx0dHMgPSBlbmQ7XG5cdFx0Y3VycmVudCA9IHtcblx0XHRcdHRpbWVzdGFtcFN0YXJ0OiBlbmQsXG5cdFx0XHR0aW1lc3RhbXBFbmQ6IGVuZCxcblx0XHRcdG5vU3RhcnQ6IGlucHV0Lm5vLFxuXHRcdFx0bm9FbmQ6IGlucHV0Lm5vXG5cdFx0fTtcblx0XHRvdXRwdXRzLnB1c2goY3VycmVudCk7XG5cdH1cblx0cmV0dXJuIG91dHB1dHM7XG59XG4vLyNlbmRyZWdpb25cbi8vI3JlZ2lvbiBzcmMvdXRpbHMudHNcbmNvbnN0IFJFX0FTUEVDVF9SQVRJT19TRVBBUkFUT1IgPSAvWzoveHxdLztcbi8qKlxuKiAxLDMtNSw4ID0+IFsxLCAzLCA0LCA1LCA4XVxuKi9cbmZ1bmN0aW9uIHBhcnNlUmFuZ2VTdHJpbmcodG90YWwsIHJhbmdlU3RyKSB7XG5cdGlmICghcmFuZ2VTdHIgfHwgcmFuZ2VTdHIgPT09IFwiYWxsXCIgfHwgcmFuZ2VTdHIgPT09IFwiKlwiKSByZXR1cm4gcmFuZ2UoMSwgdG90YWwgKyAxKTtcblx0aWYgKHJhbmdlU3RyID09PSBcIm5vbmVcIikgcmV0dXJuIFtdO1xuXHRjb25zdCBpbmRleGVzID0gW107XG5cdGZvciAoY29uc3QgcGFydCBvZiByYW5nZVN0ci5zcGxpdCgvWyw7XS9nKSkgaWYgKCFwYXJ0LmluY2x1ZGVzKFwiLVwiKSkgaW5kZXhlcy5wdXNoKCtwYXJ0KTtcblx0ZWxzZSB7XG5cdFx0Y29uc3QgW3N0YXJ0LCBlbmRdID0gcGFydC5zcGxpdChcIi1cIiwgMik7XG5cdFx0aW5kZXhlcy5wdXNoKC4uLnJhbmdlKCtzdGFydCwgIWVuZCA/IHRvdGFsICsgMSA6ICtlbmQgKyAxKSk7XG5cdH1cblx0cmV0dXJuIHVuaXEoaW5kZXhlcykuZmlsdGVyKChpKSA9PiBpIDw9IHRvdGFsKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG59XG4vKipcbiogQWNjZXB0cyBgMTYvOWAgYDE6MWAgYDN4NGBcbiovXG5mdW5jdGlvbiBwYXJzZUFzcGVjdFJhdGlvKHN0cikge1xuXHRpZiAoaXNOdW1iZXIoc3RyKSkgcmV0dXJuIHN0cjtcblx0aWYgKCFOdW1iZXIuaXNOYU4oK3N0cikpIHJldHVybiArc3RyO1xuXHRjb25zdCBbd1N0ciA9IFwiXCIsIGhTdHIgPSBcIlwiXSA9IHN0ci5zcGxpdChSRV9BU1BFQ1RfUkFUSU9fU0VQQVJBVE9SKTtcblx0Y29uc3QgdyA9IE51bWJlci5wYXJzZUZsb2F0KHdTdHIudHJpbSgpKTtcblx0Y29uc3QgaCA9IE51bWJlci5wYXJzZUZsb2F0KGhTdHIudHJpbSgpKTtcblx0aWYgKE51bWJlci5pc05hTih3KSB8fCBOdW1iZXIuaXNOYU4oaCkgfHwgaCA9PT0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFzcGVjdCByYXRpbyBcIiR7c3RyfVwiYCk7XG5cdHJldHVybiB3IC8gaDtcbn1cbi8vI2VuZHJlZ2lvblxuZXhwb3J0IHsgcGFyc2VBc3BlY3RSYXRpbywgcGFyc2VSYW5nZVN0cmluZywgcGFyc2VUaW1lU3RyaW5nLCBwYXJzZVRpbWVzcGxpdHMgfTtcbiIsImNvbnN0IEFMSUFTID0gU3ltYm9sLmZvcigneWFtbC5hbGlhcycpO1xuY29uc3QgRE9DID0gU3ltYm9sLmZvcigneWFtbC5kb2N1bWVudCcpO1xuY29uc3QgTUFQID0gU3ltYm9sLmZvcigneWFtbC5tYXAnKTtcbmNvbnN0IFBBSVIgPSBTeW1ib2wuZm9yKCd5YW1sLnBhaXInKTtcbmNvbnN0IFNDQUxBUiA9IFN5bWJvbC5mb3IoJ3lhbWwuc2NhbGFyJyk7XG5jb25zdCBTRVEgPSBTeW1ib2wuZm9yKCd5YW1sLnNlcScpO1xuY29uc3QgTk9ERV9UWVBFID0gU3ltYm9sLmZvcigneWFtbC5ub2RlLnR5cGUnKTtcbmNvbnN0IGlzQWxpYXMgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IEFMSUFTO1xuY29uc3QgaXNEb2N1bWVudCA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gRE9DO1xuY29uc3QgaXNNYXAgPSAobm9kZSkgPT4gISFub2RlICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlW05PREVfVFlQRV0gPT09IE1BUDtcbmNvbnN0IGlzUGFpciA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gUEFJUjtcbmNvbnN0IGlzU2NhbGFyID0gKG5vZGUpID0+ICEhbm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgbm9kZVtOT0RFX1RZUEVdID09PSBTQ0FMQVI7XG5jb25zdCBpc1NlcSA9IChub2RlKSA9PiAhIW5vZGUgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGVbTk9ERV9UWVBFXSA9PT0gU0VRO1xuZnVuY3Rpb24gaXNDb2xsZWN0aW9uKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHN3aXRjaCAobm9kZVtOT0RFX1RZUEVdKSB7XG4gICAgICAgICAgICBjYXNlIE1BUDpcbiAgICAgICAgICAgIGNhc2UgU0VROlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpXG4gICAgICAgIHN3aXRjaCAobm9kZVtOT0RFX1RZUEVdKSB7XG4gICAgICAgICAgICBjYXNlIEFMSUFTOlxuICAgICAgICAgICAgY2FzZSBNQVA6XG4gICAgICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIGNhc2UgU0VROlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuY29uc3QgaGFzQW5jaG9yID0gKG5vZGUpID0+IChpc1NjYWxhcihub2RlKSB8fCBpc0NvbGxlY3Rpb24obm9kZSkpICYmICEhbm9kZS5hbmNob3I7XG5cbmV4cG9ydCB7IEFMSUFTLCBET0MsIE1BUCwgTk9ERV9UWVBFLCBQQUlSLCBTQ0FMQVIsIFNFUSwgaGFzQW5jaG9yLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH07XG4iLCJpbXBvcnQgeyBpc0RvY3VtZW50LCBpc05vZGUsIGlzUGFpciwgaXNDb2xsZWN0aW9uLCBpc01hcCwgaXNTZXEsIGlzU2NhbGFyLCBpc0FsaWFzIH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5cbmNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgbm9kZScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYW4gQVNUIG5vZGUgb3IgZG9jdW1lbnQuXG4gKlxuICogV2Fsa3MgdGhyb3VnaCB0aGUgdHJlZSAoZGVwdGgtZmlyc3QpIHN0YXJ0aW5nIGZyb20gYG5vZGVgLCBjYWxsaW5nIGFcbiAqIGB2aXNpdG9yYCBmdW5jdGlvbiB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICAgLSBga2V5YDogRm9yIHNlcXVlbmNlIHZhbHVlcyBhbmQgbWFwIGBQYWlyYCwgdGhlIG5vZGUncyBpbmRleCBpbiB0aGVcbiAqICAgICBjb2xsZWN0aW9uLiBXaXRoaW4gYSBgUGFpcmAsIGAna2V5J2Agb3IgYCd2YWx1ZSdgLCBjb3JyZXNwb25kaW5nbHkuXG4gKiAgICAgYG51bGxgIGZvciB0aGUgcm9vdCBub2RlLlxuICogICAtIGBub2RlYDogVGhlIGN1cnJlbnQgbm9kZS5cbiAqICAgLSBgcGF0aGA6IFRoZSBhbmNlc3RyeSBvZiB0aGUgY3VycmVudCBub2RlLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHZpc2l0b3IgbWF5IGJlIHVzZWQgdG8gY29udHJvbCB0aGUgdHJhdmVyc2FsOlxuICogICAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogRG8gbm90aGluZyBhbmQgY29udGludWVcbiAqICAgLSBgdmlzaXQuU0tJUGA6IERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCBjb250aW51ZSB3aXRoIG5leHRcbiAqICAgICBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYE5vZGVgOiBSZXBsYWNlIHRoZSBjdXJyZW50IG5vZGUsIHRoZW4gY29udGludWUgYnkgdmlzaXRpbmcgaXRcbiAqICAgLSBgbnVtYmVyYDogV2hpbGUgaXRlcmF0aW5nIHRoZSBpdGVtcyBvZiBhIHNlcXVlbmNlIG9yIG1hcCwgc2V0IHRoZSBpbmRleFxuICogICAgIG9mIHRoZSBuZXh0IHN0ZXAuIFRoaXMgaXMgdXNlZnVsIGVzcGVjaWFsbHkgaWYgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50XG4gKiAgICAgbm9kZSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBJZiBgdmlzaXRvcmAgaXMgYSBzaW5nbGUgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggYWxsIHZhbHVlc1xuICogZW5jb3VudGVyZWQgaW4gdGhlIHRyZWUsIGluY2x1ZGluZyBlLmcuIGBudWxsYCB2YWx1ZXMuIEFsdGVybmF0aXZlbHksXG4gKiBzZXBhcmF0ZSB2aXNpdG9yIGZ1bmN0aW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IgZWFjaCBgTWFwYCwgYFBhaXJgLCBgU2VxYCxcbiAqIGBBbGlhc2AgYW5kIGBTY2FsYXJgIG5vZGUuIFRvIGRlZmluZSB0aGUgc2FtZSB2aXNpdG9yIGZ1bmN0aW9uIGZvciBtb3JlIHRoYW5cbiAqIG9uZSBub2RlIHR5cGUsIHVzZSB0aGUgYENvbGxlY3Rpb25gIChtYXAgYW5kIHNlcSksIGBWYWx1ZWAgKG1hcCwgc2VxICYgc2NhbGFyKVxuICogYW5kIGBOb2RlYCAoYWxpYXMsIG1hcCwgc2VxICYgc2NhbGFyKSB0YXJnZXRzLiBPZiBhbGwgdGhlc2UsIG9ubHkgdGhlIG1vc3RcbiAqIHNwZWNpZmljIGRlZmluZWQgb25lIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBub2RlLlxuICovXG5mdW5jdGlvbiB2aXNpdChub2RlLCB2aXNpdG9yKSB7XG4gICAgY29uc3QgdmlzaXRvcl8gPSBpbml0VmlzaXRvcih2aXNpdG9yKTtcbiAgICBpZiAoaXNEb2N1bWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBjZCA9IHZpc2l0XyhudWxsLCBub2RlLmNvbnRlbnRzLCB2aXNpdG9yXywgT2JqZWN0LmZyZWV6ZShbbm9kZV0pKTtcbiAgICAgICAgaWYgKGNkID09PSBSRU1PVkUpXG4gICAgICAgICAgICBub2RlLmNvbnRlbnRzID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICB2aXNpdF8obnVsbCwgbm9kZSwgdmlzaXRvcl8sIE9iamVjdC5mcmVlemUoW10pKTtcbn1cbi8vIFdpdGhvdXQgdGhlIGBhcyBzeW1ib2xgIGNhc3RzLCBUUyBkZWNsYXJlcyB0aGVzZSBpbiB0aGUgYHZpc2l0YFxuLy8gbmFtZXNwYWNlIHVzaW5nIGB2YXJgLCBidXQgdGhlbiBjb21wbGFpbnMgYWJvdXQgdGhhdCBiZWNhdXNlXG4vLyBgdW5pcXVlIHN5bWJvbGAgbXVzdCBiZSBgY29uc3RgLlxuLyoqIFRlcm1pbmF0ZSB2aXNpdCB0cmF2ZXJzYWwgY29tcGxldGVseSAqL1xudmlzaXQuQlJFQUsgPSBCUkVBSztcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0LlNLSVAgPSBTS0lQO1xuLyoqIFJlbW92ZSB0aGUgY3VycmVudCBub2RlICovXG52aXNpdC5SRU1PVkUgPSBSRU1PVkU7XG5mdW5jdGlvbiB2aXNpdF8oa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgY29uc3QgY3RybCA9IGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgaWYgKGlzTm9kZShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0XyhrZXksIGN0cmwsIHZpc2l0b3IsIHBhdGgpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGN0cmwgIT09ICdzeW1ib2wnKSB7XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpIHtcbiAgICAgICAgICAgIHBhdGggPSBPYmplY3QuZnJlZXplKHBhdGguY29uY2F0KG5vZGUpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gdmlzaXRfKGksIG5vZGUuaXRlbXNbaV0sIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2kgPT09ICdudW1iZXInKVxuICAgICAgICAgICAgICAgICAgICBpID0gY2kgLSAxO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJSRUFLO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNpID09PSBSRU1PVkUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pdGVtcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKG5vZGUpKSB7XG4gICAgICAgICAgICBwYXRoID0gT2JqZWN0LmZyZWV6ZShwYXRoLmNvbmNhdChub2RlKSk7XG4gICAgICAgICAgICBjb25zdCBjayA9IHZpc2l0Xygna2V5Jywgbm9kZS5rZXksIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGNrID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUua2V5ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGN2ID0gdmlzaXRfKCd2YWx1ZScsIG5vZGUudmFsdWUsIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGN2ID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjdiA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjdHJsO1xufVxuLyoqXG4gKiBBcHBseSBhbiBhc3luYyB2aXNpdG9yIHRvIGFuIEFTVCBub2RlIG9yIGRvY3VtZW50LlxuICpcbiAqIFdhbGtzIHRocm91Z2ggdGhlIHRyZWUgKGRlcHRoLWZpcnN0KSBzdGFydGluZyBmcm9tIGBub2RlYCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAgIC0gYGtleWA6IEZvciBzZXF1ZW5jZSB2YWx1ZXMgYW5kIG1hcCBgUGFpcmAsIHRoZSBub2RlJ3MgaW5kZXggaW4gdGhlXG4gKiAgICAgY29sbGVjdGlvbi4gV2l0aGluIGEgYFBhaXJgLCBgJ2tleSdgIG9yIGAndmFsdWUnYCwgY29ycmVzcG9uZGluZ2x5LlxuICogICAgIGBudWxsYCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAqICAgLSBgbm9kZWA6IFRoZSBjdXJyZW50IG5vZGUuXG4gKiAgIC0gYHBhdGhgOiBUaGUgYW5jZXN0cnkgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgUHJvbWlzZWA6IE11c3QgcmVzb2x2ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXNcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgbm9kZSwgY29udGludWUgd2l0aCBuZXh0XG4gKiAgICAgc2libGluZ1xuICogICAtIGB2aXNpdC5CUkVBS2A6IFRlcm1pbmF0ZSB0cmF2ZXJzYWwgY29tcGxldGVseVxuICogICAtIGB2aXNpdC5SRU1PVkVgOiBSZW1vdmUgdGhlIGN1cnJlbnQgbm9kZSwgdGhlbiBjb250aW51ZSB3aXRoIHRoZSBuZXh0IG9uZVxuICogICAtIGBOb2RlYDogUmVwbGFjZSB0aGUgY3VycmVudCBub2RlLCB0aGVuIGNvbnRpbnVlIGJ5IHZpc2l0aW5nIGl0XG4gKiAgIC0gYG51bWJlcmA6IFdoaWxlIGl0ZXJhdGluZyB0aGUgaXRlbXMgb2YgYSBzZXF1ZW5jZSBvciBtYXAsIHNldCB0aGUgaW5kZXhcbiAqICAgICBvZiB0aGUgbmV4dCBzdGVwLiBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IGlmIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudFxuICogICAgIG5vZGUgaGFzIGNoYW5nZWQuXG4gKlxuICogSWYgYHZpc2l0b3JgIGlzIGEgc2luZ2xlIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGFsbCB2YWx1ZXNcbiAqIGVuY291bnRlcmVkIGluIHRoZSB0cmVlLCBpbmNsdWRpbmcgZS5nLiBgbnVsbGAgdmFsdWVzLiBBbHRlcm5hdGl2ZWx5LFxuICogc2VwYXJhdGUgdmlzaXRvciBmdW5jdGlvbnMgbWF5IGJlIGRlZmluZWQgZm9yIGVhY2ggYE1hcGAsIGBQYWlyYCwgYFNlcWAsXG4gKiBgQWxpYXNgIGFuZCBgU2NhbGFyYCBub2RlLiBUbyBkZWZpbmUgdGhlIHNhbWUgdmlzaXRvciBmdW5jdGlvbiBmb3IgbW9yZSB0aGFuXG4gKiBvbmUgbm9kZSB0eXBlLCB1c2UgdGhlIGBDb2xsZWN0aW9uYCAobWFwIGFuZCBzZXEpLCBgVmFsdWVgIChtYXAsIHNlcSAmIHNjYWxhcilcbiAqIGFuZCBgTm9kZWAgKGFsaWFzLCBtYXAsIHNlcSAmIHNjYWxhcikgdGFyZ2V0cy4gT2YgYWxsIHRoZXNlLCBvbmx5IHRoZSBtb3N0XG4gKiBzcGVjaWZpYyBkZWZpbmVkIG9uZSB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggbm9kZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmlzaXRBc3luYyhub2RlLCB2aXNpdG9yKSB7XG4gICAgY29uc3QgdmlzaXRvcl8gPSBpbml0VmlzaXRvcih2aXNpdG9yKTtcbiAgICBpZiAoaXNEb2N1bWVudChub2RlKSkge1xuICAgICAgICBjb25zdCBjZCA9IGF3YWl0IHZpc2l0QXN5bmNfKG51bGwsIG5vZGUuY29udGVudHMsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtub2RlXSkpO1xuICAgICAgICBpZiAoY2QgPT09IFJFTU9WRSlcbiAgICAgICAgICAgIG5vZGUuY29udGVudHMgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICAgIGF3YWl0IHZpc2l0QXN5bmNfKG51bGwsIG5vZGUsIHZpc2l0b3JfLCBPYmplY3QuZnJlZXplKFtdKSk7XG59XG4vLyBXaXRob3V0IHRoZSBgYXMgc3ltYm9sYCBjYXN0cywgVFMgZGVjbGFyZXMgdGhlc2UgaW4gdGhlIGB2aXNpdGBcbi8vIG5hbWVzcGFjZSB1c2luZyBgdmFyYCwgYnV0IHRoZW4gY29tcGxhaW5zIGFib3V0IHRoYXQgYmVjYXVzZVxuLy8gYHVuaXF1ZSBzeW1ib2xgIG11c3QgYmUgYGNvbnN0YC5cbi8qKiBUZXJtaW5hdGUgdmlzaXQgdHJhdmVyc2FsIGNvbXBsZXRlbHkgKi9cbnZpc2l0QXN5bmMuQlJFQUsgPSBCUkVBSztcbi8qKiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0QXN5bmMuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IG5vZGUgKi9cbnZpc2l0QXN5bmMuUkVNT1ZFID0gUkVNT1ZFO1xuYXN5bmMgZnVuY3Rpb24gdmlzaXRBc3luY18oa2V5LCBub2RlLCB2aXNpdG9yLCBwYXRoKSB7XG4gICAgY29uc3QgY3RybCA9IGF3YWl0IGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgaWYgKGlzTm9kZShjdHJsKSB8fCBpc1BhaXIoY3RybCkpIHtcbiAgICAgICAgcmVwbGFjZU5vZGUoa2V5LCBwYXRoLCBjdHJsKTtcbiAgICAgICAgcmV0dXJuIHZpc2l0QXN5bmNfKGtleSwgY3RybCwgdmlzaXRvciwgcGF0aCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3RybCAhPT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLml0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2kgPSBhd2FpdCB2aXNpdEFzeW5jXyhpLCBub2RlLml0ZW1zW2ldLCB2aXNpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaXRlbXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBpIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzUGFpcihub2RlKSkge1xuICAgICAgICAgICAgcGF0aCA9IE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQobm9kZSkpO1xuICAgICAgICAgICAgY29uc3QgY2sgPSBhd2FpdCB2aXNpdEFzeW5jXygna2V5Jywgbm9kZS5rZXksIHZpc2l0b3IsIHBhdGgpO1xuICAgICAgICAgICAgaWYgKGNrID09PSBCUkVBSylcbiAgICAgICAgICAgICAgICByZXR1cm4gQlJFQUs7XG4gICAgICAgICAgICBlbHNlIGlmIChjayA9PT0gUkVNT1ZFKVxuICAgICAgICAgICAgICAgIG5vZGUua2V5ID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGN2ID0gYXdhaXQgdmlzaXRBc3luY18oJ3ZhbHVlJywgbm9kZS52YWx1ZSwgdmlzaXRvciwgcGF0aCk7XG4gICAgICAgICAgICBpZiAoY3YgPT09IEJSRUFLKVxuICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgIGVsc2UgaWYgKGN2ID09PSBSRU1PVkUpXG4gICAgICAgICAgICAgICAgbm9kZS52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN0cmw7XG59XG5mdW5jdGlvbiBpbml0VmlzaXRvcih2aXNpdG9yKSB7XG4gICAgaWYgKHR5cGVvZiB2aXNpdG9yID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAodmlzaXRvci5Db2xsZWN0aW9uIHx8IHZpc2l0b3IuTm9kZSB8fCB2aXNpdG9yLlZhbHVlKSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgICBBbGlhczogdmlzaXRvci5Ob2RlLFxuICAgICAgICAgICAgTWFwOiB2aXNpdG9yLk5vZGUsXG4gICAgICAgICAgICBTY2FsYXI6IHZpc2l0b3IuTm9kZSxcbiAgICAgICAgICAgIFNlcTogdmlzaXRvci5Ob2RlXG4gICAgICAgIH0sIHZpc2l0b3IuVmFsdWUgJiYge1xuICAgICAgICAgICAgTWFwOiB2aXNpdG9yLlZhbHVlLFxuICAgICAgICAgICAgU2NhbGFyOiB2aXNpdG9yLlZhbHVlLFxuICAgICAgICAgICAgU2VxOiB2aXNpdG9yLlZhbHVlXG4gICAgICAgIH0sIHZpc2l0b3IuQ29sbGVjdGlvbiAmJiB7XG4gICAgICAgICAgICBNYXA6IHZpc2l0b3IuQ29sbGVjdGlvbixcbiAgICAgICAgICAgIFNlcTogdmlzaXRvci5Db2xsZWN0aW9uXG4gICAgICAgIH0sIHZpc2l0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaXRvcjtcbn1cbmZ1bmN0aW9uIGNhbGxWaXNpdG9yKGtleSwgbm9kZSwgdmlzaXRvciwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgdmlzaXRvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgcmV0dXJuIHZpc2l0b3Ioa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNNYXAobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLk1hcD8uKGtleSwgbm9kZSwgcGF0aCk7XG4gICAgaWYgKGlzU2VxKG5vZGUpKVxuICAgICAgICByZXR1cm4gdmlzaXRvci5TZXE/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc1BhaXIobm9kZSkpXG4gICAgICAgIHJldHVybiB2aXNpdG9yLlBhaXI/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIGlmIChpc1NjYWxhcihub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuU2NhbGFyPy4oa2V5LCBub2RlLCBwYXRoKTtcbiAgICBpZiAoaXNBbGlhcyhub2RlKSlcbiAgICAgICAgcmV0dXJuIHZpc2l0b3IuQWxpYXM/LihrZXksIG5vZGUsIHBhdGgpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiByZXBsYWNlTm9kZShrZXksIHBhdGgsIG5vZGUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgaWYgKGlzQ29sbGVjdGlvbihwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5pdGVtc1trZXldID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNQYWlyKHBhcmVudCkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2tleScpXG4gICAgICAgICAgICBwYXJlbnQua2V5ID0gbm9kZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcGFyZW50LnZhbHVlID0gbm9kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEb2N1bWVudChwYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudC5jb250ZW50cyA9IG5vZGU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwdCA9IGlzQWxpYXMocGFyZW50KSA/ICdhbGlhcycgOiAnc2NhbGFyJztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVwbGFjZSBub2RlIHdpdGggJHtwdH0gcGFyZW50YCk7XG4gICAgfVxufVxuXG5leHBvcnQgeyB2aXNpdCwgdmlzaXRBc3luYyB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICcuLi92aXNpdC5qcyc7XG5cbmNvbnN0IGVzY2FwZUNoYXJzID0ge1xuICAgICchJzogJyUyMScsXG4gICAgJywnOiAnJTJDJyxcbiAgICAnWyc6ICclNUInLFxuICAgICddJzogJyU1RCcsXG4gICAgJ3snOiAnJTdCJyxcbiAgICAnfSc6ICclN0QnXG59O1xuY29uc3QgZXNjYXBlVGFnTmFtZSA9ICh0bikgPT4gdG4ucmVwbGFjZSgvWyEsW1xcXXt9XS9nLCBjaCA9PiBlc2NhcGVDaGFyc1tjaF0pO1xuY2xhc3MgRGlyZWN0aXZlcyB7XG4gICAgY29uc3RydWN0b3IoeWFtbCwgdGFncykge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGRpcmVjdGl2ZXMtZW5kL2RvYy1zdGFydCBtYXJrZXIgYC0tLWAuIElmIGBudWxsYCwgYSBtYXJrZXIgbWF5IHN0aWxsIGJlXG4gICAgICAgICAqIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudCdzIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5kb2NTdGFydCA9IG51bGw7XG4gICAgICAgIC8qKiBUaGUgZG9jLWVuZCBtYXJrZXIgYC4uLmAuICAqL1xuICAgICAgICB0aGlzLmRvY0VuZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnlhbWwgPSBPYmplY3QuYXNzaWduKHt9LCBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLCB5YW1sKTtcbiAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncywgdGFncyk7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gbmV3IERpcmVjdGl2ZXModGhpcy55YW1sLCB0aGlzLnRhZ3MpO1xuICAgICAgICBjb3B5LmRvY1N0YXJ0ID0gdGhpcy5kb2NTdGFydDtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIER1cmluZyBwYXJzaW5nLCBnZXQgYSBEaXJlY3RpdmVzIGluc3RhbmNlIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCBhbmRcbiAgICAgKiB1cGRhdGUgdGhlIHN0cmVhbSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbidzIHNwZWMuXG4gICAgICovXG4gICAgYXREb2N1bWVudCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IERpcmVjdGl2ZXModGhpcy55YW1sLCB0aGlzLnRhZ3MpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMueWFtbC52ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlICcxLjEnOlxuICAgICAgICAgICAgICAgIHRoaXMuYXROZXh0RG9jdW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMS4yJzpcbiAgICAgICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy55YW1sID0ge1xuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdDogRGlyZWN0aXZlcy5kZWZhdWx0WWFtbC5leHBsaWNpdCxcbiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEuMidcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMudGFncyA9IE9iamVjdC5hc3NpZ24oe30sIERpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBvbkVycm9yIC0gTWF5IGJlIGNhbGxlZCBldmVuIGlmIHRoZSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWxcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgb24gc3VjY2Vzc1xuICAgICAqL1xuICAgIGFkZChsaW5lLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLmF0TmV4dERvY3VtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnlhbWwgPSB7IGV4cGxpY2l0OiBEaXJlY3RpdmVzLmRlZmF1bHRZYW1sLmV4cGxpY2l0LCB2ZXJzaW9uOiAnMS4xJyB9O1xuICAgICAgICAgICAgdGhpcy50YWdzID0gT2JqZWN0LmFzc2lnbih7fSwgRGlyZWN0aXZlcy5kZWZhdWx0VGFncyk7XG4gICAgICAgICAgICB0aGlzLmF0TmV4dERvY3VtZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSBsaW5lLnRyaW0oKS5zcGxpdCgvWyBcXHRdKy8pO1xuICAgICAgICBjb25zdCBuYW1lID0gcGFydHMuc2hpZnQoKTtcbiAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICBjYXNlICclVEFHJzoge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcigwLCAnJVRBRyBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSB0d28gcGFydHMnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA8IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IFtoYW5kbGUsIHByZWZpeF0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ3NbaGFuZGxlXSA9IHByZWZpeDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJyVZQU1MJzoge1xuICAgICAgICAgICAgICAgIHRoaXMueWFtbC5leHBsaWNpdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDAsICclWUFNTCBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgcGFydCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IFt2ZXJzaW9uXSA9IHBhcnRzO1xuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09PSAnMS4xJyB8fCB2ZXJzaW9uID09PSAnMS4yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IC9eXFxkK1xcLlxcZCskLy50ZXN0KHZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKDYsIGBVbnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gJHt2ZXJzaW9ufWAsIGlzVmFsaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBvbkVycm9yKDAsIGBVbmtub3duIGRpcmVjdGl2ZSAke25hbWV9YCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc29sdmVzIGEgdGFnLCBtYXRjaGluZyBoYW5kbGVzIHRvIHRob3NlIGRlZmluZWQgaW4gJVRBRyBkaXJlY3RpdmVzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgUmVzb2x2ZWQgdGFnLCB3aGljaCBtYXkgYWxzbyBiZSB0aGUgbm9uLXNwZWNpZmljIHRhZyBgJyEnYCBvciBhXG4gICAgICogICBgJyFsb2NhbCdgIHRhZywgb3IgYG51bGxgIGlmIHVucmVzb2x2YWJsZS5cbiAgICAgKi9cbiAgICB0YWdOYW1lKHNvdXJjZSwgb25FcnJvcikge1xuICAgICAgICBpZiAoc291cmNlID09PSAnIScpXG4gICAgICAgICAgICByZXR1cm4gJyEnOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgICAgIGlmIChzb3VyY2VbMF0gIT09ICchJykge1xuICAgICAgICAgICAgb25FcnJvcihgTm90IGEgdmFsaWQgdGFnOiAke3NvdXJjZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VbMV0gPT09ICc8Jykge1xuICAgICAgICAgICAgY29uc3QgdmVyYmF0aW0gPSBzb3VyY2Uuc2xpY2UoMiwgLTEpO1xuICAgICAgICAgICAgaWYgKHZlcmJhdGltID09PSAnIScgfHwgdmVyYmF0aW0gPT09ICchIScpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKGBWZXJiYXRpbSB0YWdzIGFyZW4ndCByZXNvbHZlZCwgc28gJHtzb3VyY2V9IGlzIGludmFsaWQuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc291cmNlW3NvdXJjZS5sZW5ndGggLSAxXSAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIG9uRXJyb3IoJ1ZlcmJhdGltIHRhZ3MgbXVzdCBlbmQgd2l0aCBhID4nKTtcbiAgICAgICAgICAgIHJldHVybiB2ZXJiYXRpbTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbLCBoYW5kbGUsIHN1ZmZpeF0gPSBzb3VyY2UubWF0Y2goL14oLiohKShbXiFdKikkL3MpO1xuICAgICAgICBpZiAoIXN1ZmZpeClcbiAgICAgICAgICAgIG9uRXJyb3IoYFRoZSAke3NvdXJjZX0gdGFnIGhhcyBubyBzdWZmaXhgKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy50YWdzW2hhbmRsZV07XG4gICAgICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGRlY29kZVVSSUNvbXBvbmVudChzdWZmaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFuZGxlID09PSAnIScpXG4gICAgICAgICAgICByZXR1cm4gc291cmNlOyAvLyBsb2NhbCB0YWdcbiAgICAgICAgb25FcnJvcihgQ291bGQgbm90IHJlc29sdmUgdGFnOiAke3NvdXJjZX1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdpdmVuIGEgZnVsbHkgcmVzb2x2ZWQgdGFnLCByZXR1cm5zIGl0cyBwcmludGFibGUgc3RyaW5nIGZvcm0sXG4gICAgICogdGFraW5nIGludG8gYWNjb3VudCBjdXJyZW50IHRhZyBwcmVmaXhlcyBhbmQgZGVmYXVsdHMuXG4gICAgICovXG4gICAgdGFnU3RyaW5nKHRhZykge1xuICAgICAgICBmb3IgKGNvbnN0IFtoYW5kbGUsIHByZWZpeF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy50YWdzKSkge1xuICAgICAgICAgICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZSArIGVzY2FwZVRhZ05hbWUodGFnLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhZ1swXSA9PT0gJyEnID8gdGFnIDogYCE8JHt0YWd9PmA7XG4gICAgfVxuICAgIHRvU3RyaW5nKGRvYykge1xuICAgICAgICBjb25zdCBsaW5lcyA9IHRoaXMueWFtbC5leHBsaWNpdFxuICAgICAgICAgICAgPyBbYCVZQU1MICR7dGhpcy55YW1sLnZlcnNpb24gfHwgJzEuMid9YF1cbiAgICAgICAgICAgIDogW107XG4gICAgICAgIGNvbnN0IHRhZ0VudHJpZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpO1xuICAgICAgICBsZXQgdGFnTmFtZXM7XG4gICAgICAgIGlmIChkb2MgJiYgdGFnRW50cmllcy5sZW5ndGggPiAwICYmIGlzTm9kZShkb2MuY29udGVudHMpKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0ge307XG4gICAgICAgICAgICB2aXNpdChkb2MuY29udGVudHMsIChfa2V5LCBub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm9kZShub2RlKSAmJiBub2RlLnRhZylcbiAgICAgICAgICAgICAgICAgICAgdGFnc1tub2RlLnRhZ10gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0YWdOYW1lcyA9IE9iamVjdC5rZXlzKHRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRhZ05hbWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2hhbmRsZSwgcHJlZml4XSBvZiB0YWdFbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlID09PSAnISEnICYmIHByZWZpeCA9PT0gJ3RhZzp5YW1sLm9yZywyMDAyOicpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIWRvYyB8fCB0YWdOYW1lcy5zb21lKHRuID0+IHRuLnN0YXJ0c1dpdGgocHJlZml4KSkpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgJVRBRyAke2hhbmRsZX0gJHtwcmVmaXh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICAgIH1cbn1cbkRpcmVjdGl2ZXMuZGVmYXVsdFlhbWwgPSB7IGV4cGxpY2l0OiBmYWxzZSwgdmVyc2lvbjogJzEuMicgfTtcbkRpcmVjdGl2ZXMuZGVmYXVsdFRhZ3MgPSB7ICchISc6ICd0YWc6eWFtbC5vcmcsMjAwMjonIH07XG5cbmV4cG9ydCB7IERpcmVjdGl2ZXMgfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyLCBpc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJy4uL3Zpc2l0LmpzJztcblxuLyoqXG4gKiBWZXJpZnkgdGhhdCB0aGUgaW5wdXQgc3RyaW5nIGlzIGEgdmFsaWQgYW5jaG9yLlxuICpcbiAqIFdpbGwgdGhyb3cgb24gZXJyb3JzLlxuICovXG5mdW5jdGlvbiBhbmNob3JJc1ZhbGlkKGFuY2hvcikge1xuICAgIGlmICgvW1xceDAwLVxceDE5XFxzLFtcXF17fV0vLnRlc3QoYW5jaG9yKSkge1xuICAgICAgICBjb25zdCBzYSA9IEpTT04uc3RyaW5naWZ5KGFuY2hvcik7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBBbmNob3IgbXVzdCBub3QgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbnRyb2wgY2hhcmFjdGVyczogJHtzYX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBhbmNob3JOYW1lcyhyb290KSB7XG4gICAgY29uc3QgYW5jaG9ycyA9IG5ldyBTZXQoKTtcbiAgICB2aXNpdChyb290LCB7XG4gICAgICAgIFZhbHVlKF9rZXksIG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmFuY2hvcilcbiAgICAgICAgICAgICAgICBhbmNob3JzLmFkZChub2RlLmFuY2hvcik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYW5jaG9ycztcbn1cbi8qKiBGaW5kIGEgbmV3IGFuY2hvciBuYW1lIHdpdGggdGhlIGdpdmVuIGBwcmVmaXhgIGFuZCBhIG9uZS1pbmRleGVkIHN1ZmZpeC4gKi9cbmZ1bmN0aW9uIGZpbmROZXdBbmNob3IocHJlZml4LCBleGNsdWRlKSB7XG4gICAgZm9yIChsZXQgaSA9IDE7IHRydWU7ICsraSkge1xuICAgICAgICBjb25zdCBuYW1lID0gYCR7cHJlZml4fSR7aX1gO1xuICAgICAgICBpZiAoIWV4Y2x1ZGUuaGFzKG5hbWUpKVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlTm9kZUFuY2hvcnMoZG9jLCBwcmVmaXgpIHtcbiAgICBjb25zdCBhbGlhc09iamVjdHMgPSBbXTtcbiAgICBjb25zdCBzb3VyY2VPYmplY3RzID0gbmV3IE1hcCgpO1xuICAgIGxldCBwcmV2QW5jaG9ycyA9IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgb25BbmNob3I6IChzb3VyY2UpID0+IHtcbiAgICAgICAgICAgIGFsaWFzT2JqZWN0cy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBwcmV2QW5jaG9ycyA/PyAocHJldkFuY2hvcnMgPSBhbmNob3JOYW1lcyhkb2MpKTtcbiAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGZpbmROZXdBbmNob3IocHJlZml4LCBwcmV2QW5jaG9ycyk7XG4gICAgICAgICAgICBwcmV2QW5jaG9ycy5hZGQoYW5jaG9yKTtcbiAgICAgICAgICAgIHJldHVybiBhbmNob3I7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMsIHRoZSBzb3VyY2Ugbm9kZSBpcyBvbmx5IHJlc29sdmVkIGFmdGVyIGFsbFxuICAgICAgICAgKiBvZiBpdHMgY2hpbGQgbm9kZXMgYXJlLiBUaGlzIGlzIHdoeSBhbmNob3JzIGFyZSBzZXQgb25seSBhZnRlciBhbGwgb2ZcbiAgICAgICAgICogdGhlIG5vZGVzIGhhdmUgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgc2V0QW5jaG9yczogKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgYWxpYXNPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmID0gc291cmNlT2JqZWN0cy5nZXQoc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmLmFuY2hvciAmJlxuICAgICAgICAgICAgICAgICAgICAoaXNTY2FsYXIocmVmLm5vZGUpIHx8IGlzQ29sbGVjdGlvbihyZWYubm9kZSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5ub2RlLmFuY2hvciA9IHJlZi5hbmNob3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlc29sdmUgcmVwZWF0ZWQgb2JqZWN0ICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKScpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlT2JqZWN0c1xuICAgIH07XG59XG5cbmV4cG9ydCB7IGFuY2hvcklzVmFsaWQsIGFuY2hvck5hbWVzLCBjcmVhdGVOb2RlQW5jaG9ycywgZmluZE5ld0FuY2hvciB9O1xuIiwiLyoqXG4gKiBBcHBsaWVzIHRoZSBKU09OLnBhcnNlIHJldml2ZXIgYWxnb3JpdGhtIGFzIGRlZmluZWQgaW4gdGhlIEVDTUEtMjYyIHNwZWMsXG4gKiBpbiBzZWN0aW9uIDI0LjUuMS4xIFwiUnVudGltZSBTZW1hbnRpY3M6IEludGVybmFsaXplSlNPTlByb3BlcnR5XCIgb2YgdGhlXG4gKiAyMDIxIGVkaXRpb246IGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtanNvbi5wYXJzZVxuICpcbiAqIEluY2x1ZGVzIGV4dGVuc2lvbnMgZm9yIGhhbmRsaW5nIE1hcCBhbmQgU2V0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGFwcGx5UmV2aXZlcihyZXZpdmVyLCBvYmosIGtleSwgdmFsKSB7XG4gICAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdjAgPSB2YWxbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgdjEgPSBhcHBseVJldml2ZXIocmV2aXZlciwgdmFsLCBTdHJpbmcoaSksIHYwKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWFycmF5LWRlbGV0ZVxuICAgICAgICAgICAgICAgIGlmICh2MSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsW2ldO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MClcbiAgICAgICAgICAgICAgICAgICAgdmFsW2ldID0gdjE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgQXJyYXkuZnJvbSh2YWwua2V5cygpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gdmFsLmdldChrKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgdmFsLmRlbGV0ZShrKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbC5zZXQoaywgdjEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbCBpbnN0YW5jZW9mIFNldCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB2MCBvZiBBcnJheS5mcm9tKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIHYwLCB2MCk7XG4gICAgICAgICAgICAgICAgaWYgKHYxID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIHZhbC5kZWxldGUodjApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYxICE9PSB2MCkge1xuICAgICAgICAgICAgICAgICAgICB2YWwuZGVsZXRlKHYwKTtcbiAgICAgICAgICAgICAgICAgICAgdmFsLmFkZCh2MSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdjBdIG9mIE9iamVjdC5lbnRyaWVzKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2MSA9IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB2YWwsIGssIHYwKTtcbiAgICAgICAgICAgICAgICBpZiAodjEgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZhbFtrXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICh2MSAhPT0gdjApXG4gICAgICAgICAgICAgICAgICAgIHZhbFtrXSA9IHYxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXZpdmVyLmNhbGwob2JqLCBrZXksIHZhbCk7XG59XG5cbmV4cG9ydCB7IGFwcGx5UmV2aXZlciB9O1xuIiwiaW1wb3J0IHsgaGFzQW5jaG9yIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY29udmVydCBhbnkgbm9kZSBvciBpdHMgY29udGVudHMgdG8gbmF0aXZlIEphdmFTY3JpcHRcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5wdXQgdmFsdWVcbiAqIEBwYXJhbSBhcmcgLSBJZiBgdmFsdWVgIGRlZmluZXMgYSBgdG9KU09OKClgIG1ldGhvZCwgdXNlIHRoaXNcbiAqICAgYXMgaXRzIGZpcnN0IGFyZ3VtZW50XG4gKiBAcGFyYW0gY3R4IC0gQ29udmVyc2lvbiBjb250ZXh0LCBvcmlnaW5hbGx5IHNldCBpbiBEb2N1bWVudCN0b0pTKCkuIElmXG4gKiAgIGB7IGtlZXA6IHRydWUgfWAgaXMgbm90IHNldCwgb3V0cHV0IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgSlNPTlxuICogICBzdHJpbmdpZmljYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRvSlModmFsdWUsIGFyZywgY3R4KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtcmV0dXJuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4gdmFsdWUubWFwKCh2LCBpKSA9PiB0b0pTKHYsIFN0cmluZyhpKSwgY3R4KSk7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbFxuICAgICAgICBpZiAoIWN0eCB8fCAhaGFzQW5jaG9yKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0pTT04oYXJnLCBjdHgpO1xuICAgICAgICBjb25zdCBkYXRhID0geyBhbGlhc0NvdW50OiAwLCBjb3VudDogMSwgcmVzOiB1bmRlZmluZWQgfTtcbiAgICAgICAgY3R4LmFuY2hvcnMuc2V0KHZhbHVlLCBkYXRhKTtcbiAgICAgICAgY3R4Lm9uQ3JlYXRlID0gcmVzID0+IHtcbiAgICAgICAgICAgIGRhdGEucmVzID0gcmVzO1xuICAgICAgICAgICAgZGVsZXRlIGN0eC5vbkNyZWF0ZTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gdmFsdWUudG9KU09OKGFyZywgY3R4KTtcbiAgICAgICAgaWYgKGN0eC5vbkNyZWF0ZSlcbiAgICAgICAgICAgIGN0eC5vbkNyZWF0ZShyZXMpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiAhY3R4Py5rZWVwKVxuICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCB7IHRvSlMgfTtcbiIsImltcG9ydCB7IGFwcGx5UmV2aXZlciB9IGZyb20gJy4uL2RvYy9hcHBseVJldml2ZXIuanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBpc0RvY3VtZW50IH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY2xhc3MgTm9kZUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIE5PREVfVFlQRSwgeyB2YWx1ZTogdHlwZSB9KTtcbiAgICB9XG4gICAgLyoqIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBub2RlLiAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0aGlzKSk7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlKVxuICAgICAgICAgICAgY29weS5yYW5nZSA9IHRoaXMucmFuZ2Uuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKiBBIHBsYWluIEphdmFTY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBub2RlLiAqL1xuICAgIHRvSlMoZG9jLCB7IG1hcEFzTWFwLCBtYXhBbGlhc0NvdW50LCBvbkFuY2hvciwgcmV2aXZlciB9ID0ge30pIHtcbiAgICAgICAgaWYgKCFpc0RvY3VtZW50KGRvYykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIGRvY3VtZW50IGFyZ3VtZW50IGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGFuY2hvcnM6IG5ldyBNYXAoKSxcbiAgICAgICAgICAgIGRvYyxcbiAgICAgICAgICAgIGtlZXA6IHRydWUsXG4gICAgICAgICAgICBtYXBBc01hcDogbWFwQXNNYXAgPT09IHRydWUsXG4gICAgICAgICAgICBtYXBLZXlXYXJuZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbWF4QWxpYXNDb3VudDogdHlwZW9mIG1heEFsaWFzQ291bnQgPT09ICdudW1iZXInID8gbWF4QWxpYXNDb3VudCA6IDEwMFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXMgPSB0b0pTKHRoaXMsICcnLCBjdHgpO1xuICAgICAgICBpZiAodHlwZW9mIG9uQW5jaG9yID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGNvdW50LCByZXMgfSBvZiBjdHguYW5jaG9ycy52YWx1ZXMoKSlcbiAgICAgICAgICAgICAgICBvbkFuY2hvcihyZXMsIGNvdW50KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGFwcGx5UmV2aXZlcihyZXZpdmVyLCB7ICcnOiByZXMgfSwgJycsIHJlcylcbiAgICAgICAgICAgIDogcmVzO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgTm9kZUJhc2UgfTtcbiIsImltcG9ydCB7IGFuY2hvcklzVmFsaWQgfSBmcm9tICcuLi9kb2MvYW5jaG9ycy5qcyc7XG5pbXBvcnQgeyB2aXNpdCB9IGZyb20gJy4uL3Zpc2l0LmpzJztcbmltcG9ydCB7IEFMSUFTLCBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzUGFpciwgaGFzQW5jaG9yIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBOb2RlQmFzZSB9IGZyb20gJy4vTm9kZS5qcyc7XG5pbXBvcnQgeyB0b0pTIH0gZnJvbSAnLi90b0pTLmpzJztcblxuY2xhc3MgQWxpYXMgZXh0ZW5kcyBOb2RlQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHN1cGVyKEFMSUFTKTtcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndGFnJywge1xuICAgICAgICAgICAgc2V0KCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQWxpYXMgbm9kZXMgY2Fubm90IGhhdmUgdGFncycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVzb2x2ZSB0aGUgdmFsdWUgb2YgdGhpcyBhbGlhcyB3aXRoaW4gYGRvY2AsIGZpbmRpbmcgdGhlIGxhc3RcbiAgICAgKiBpbnN0YW5jZSBvZiB0aGUgYHNvdXJjZWAgYW5jaG9yIGJlZm9yZSB0aGlzIG5vZGUuXG4gICAgICovXG4gICAgcmVzb2x2ZShkb2MsIGN0eCkge1xuICAgICAgICBpZiAoY3R4Py5tYXhBbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCdBbGlhcyByZXNvbHV0aW9uIGlzIGRpc2FibGVkJyk7XG4gICAgICAgIGxldCBub2RlcztcbiAgICAgICAgaWYgKGN0eD8uYWxpYXNSZXNvbHZlQ2FjaGUpIHtcbiAgICAgICAgICAgIG5vZGVzID0gY3R4LmFsaWFzUmVzb2x2ZUNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbm9kZXMgPSBbXTtcbiAgICAgICAgICAgIHZpc2l0KGRvYywge1xuICAgICAgICAgICAgICAgIE5vZGU6IChfa2V5LCBub2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0FsaWFzKG5vZGUpIHx8IGhhc0FuY2hvcihub2RlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoY3R4KVxuICAgICAgICAgICAgICAgIGN0eC5hbGlhc1Jlc29sdmVDYWNoZSA9IG5vZGVzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmb3VuZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZSA9PT0gdGhpcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGlmIChub2RlLmFuY2hvciA9PT0gdGhpcy5zb3VyY2UpXG4gICAgICAgICAgICAgICAgZm91bmQgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9XG4gICAgdG9KU09OKF9hcmcsIGN0eCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiB7IHNvdXJjZTogdGhpcy5zb3VyY2UgfTtcbiAgICAgICAgY29uc3QgeyBhbmNob3JzLCBkb2MsIG1heEFsaWFzQ291bnQgfSA9IGN0eDtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5yZXNvbHZlKGRvYywgY3R4KTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGF0YSA9IGFuY2hvcnMuZ2V0KHNvdXJjZSk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBhbmNob3JzIGZvciBOb2RlLnByb3RvdHlwZS50b0pTKClcbiAgICAgICAgICAgIHRvSlMoc291cmNlLCBudWxsLCBjdHgpO1xuICAgICAgICAgICAgZGF0YSA9IGFuY2hvcnMuZ2V0KHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChkYXRhPy5yZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ1RoaXMgc2hvdWxkIG5vdCBoYXBwZW46IEFsaWFzIGFuY2hvciB3YXMgbm90IHJlc29sdmVkPyc7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4QWxpYXNDb3VudCA+PSAwKSB7XG4gICAgICAgICAgICBkYXRhLmNvdW50ICs9IDE7XG4gICAgICAgICAgICBpZiAoZGF0YS5hbGlhc0NvdW50ID09PSAwKVxuICAgICAgICAgICAgICAgIGRhdGEuYWxpYXNDb3VudCA9IGdldEFsaWFzQ291bnQoZG9jLCBzb3VyY2UsIGFuY2hvcnMpO1xuICAgICAgICAgICAgaWYgKGRhdGEuY291bnQgKiBkYXRhLmFsaWFzQ291bnQgPiBtYXhBbGlhc0NvdW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXNnID0gJ0V4Y2Vzc2l2ZSBhbGlhcyBjb3VudCBpbmRpY2F0ZXMgYSByZXNvdXJjZSBleGhhdXN0aW9uIGF0dGFjayc7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGEucmVzO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIF9vbkNvbW1lbnQsIF9vbkNob21wS2VlcCkge1xuICAgICAgICBjb25zdCBzcmMgPSBgKiR7dGhpcy5zb3VyY2V9YDtcbiAgICAgICAgaWYgKGN0eCkge1xuICAgICAgICAgICAgYW5jaG9ySXNWYWxpZCh0aGlzLnNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMudmVyaWZ5QWxpYXNPcmRlciAmJiAhY3R4LmFuY2hvcnMuaGFzKHRoaXMuc291cmNlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmltcGxpY2l0S2V5KVxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtzcmN9IGA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNyYztcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRBbGlhc0NvdW50KGRvYywgbm9kZSwgYW5jaG9ycykge1xuICAgIGlmIChpc0FsaWFzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IG5vZGUucmVzb2x2ZShkb2MpO1xuICAgICAgICBjb25zdCBhbmNob3IgPSBhbmNob3JzICYmIHNvdXJjZSAmJiBhbmNob3JzLmdldChzb3VyY2UpO1xuICAgICAgICByZXR1cm4gYW5jaG9yID8gYW5jaG9yLmNvdW50ICogYW5jaG9yLmFsaWFzQ291bnQgOiAwO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5vZGUuaXRlbXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGMgPSBnZXRBbGlhc0NvdW50KGRvYywgaXRlbSwgYW5jaG9ycyk7XG4gICAgICAgICAgICBpZiAoYyA+IGNvdW50KVxuICAgICAgICAgICAgICAgIGNvdW50ID0gYztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzUGFpcihub2RlKSkge1xuICAgICAgICBjb25zdCBrYyA9IGdldEFsaWFzQ291bnQoZG9jLCBub2RlLmtleSwgYW5jaG9ycyk7XG4gICAgICAgIGNvbnN0IHZjID0gZ2V0QWxpYXNDb3VudChkb2MsIG5vZGUudmFsdWUsIGFuY2hvcnMpO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoa2MsIHZjKTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG59XG5cbmV4cG9ydCB7IEFsaWFzIH07XG4iLCJpbXBvcnQgeyBTQ0FMQVIgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IE5vZGVCYXNlIH0gZnJvbSAnLi9Ob2RlLmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5jb25zdCBpc1NjYWxhclZhbHVlID0gKHZhbHVlKSA9PiAhdmFsdWUgfHwgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKTtcbmNsYXNzIFNjYWxhciBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcihTQ0FMQVIpO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHRvSlNPTihhcmcsIGN0eCkge1xuICAgICAgICByZXR1cm4gY3R4Py5rZWVwID8gdGhpcy52YWx1ZSA6IHRvSlModGhpcy52YWx1ZSwgYXJnLCBjdHgpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKTtcbiAgICB9XG59XG5TY2FsYXIuQkxPQ0tfRk9MREVEID0gJ0JMT0NLX0ZPTERFRCc7XG5TY2FsYXIuQkxPQ0tfTElURVJBTCA9ICdCTE9DS19MSVRFUkFMJztcblNjYWxhci5QTEFJTiA9ICdQTEFJTic7XG5TY2FsYXIuUVVPVEVfRE9VQkxFID0gJ1FVT1RFX0RPVUJMRSc7XG5TY2FsYXIuUVVPVEVfU0lOR0xFID0gJ1FVT1RFX1NJTkdMRSc7XG5cbmV4cG9ydCB7IFNjYWxhciwgaXNTY2FsYXJWYWx1ZSB9O1xuIiwiaW1wb3J0IHsgQWxpYXMgfSBmcm9tICcuLi9ub2Rlcy9BbGlhcy5qcyc7XG5pbXBvcnQgeyBpc05vZGUsIGlzUGFpciwgTUFQLCBTRVEsIGlzRG9jdW1lbnQgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5jb25zdCBkZWZhdWx0VGFnUHJlZml4ID0gJ3RhZzp5YW1sLm9yZywyMDAyOic7XG5mdW5jdGlvbiBmaW5kVGFnT2JqZWN0KHZhbHVlLCB0YWdOYW1lLCB0YWdzKSB7XG4gICAgaWYgKHRhZ05hbWUpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQudGFnID09PSB0YWdOYW1lKTtcbiAgICAgICAgY29uc3QgdGFnT2JqID0gbWF0Y2guZmluZCh0ID0+ICF0LmZvcm1hdCkgPz8gbWF0Y2hbMF07XG4gICAgICAgIGlmICghdGFnT2JqKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWcgJHt0YWdOYW1lfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHRhZ09iajtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3MuZmluZCh0ID0+IHQuaWRlbnRpZnk/Lih2YWx1ZSkgJiYgIXQuZm9ybWF0KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU5vZGUodmFsdWUsIHRhZ05hbWUsIGN0eCkge1xuICAgIGlmIChpc0RvY3VtZW50KHZhbHVlKSlcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5jb250ZW50cztcbiAgICBpZiAoaXNOb2RlKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGlmIChpc1BhaXIodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IG1hcCA9IGN0eC5zY2hlbWFbTUFQXS5jcmVhdGVOb2RlPy4oY3R4LnNjaGVtYSwgbnVsbCwgY3R4KTtcbiAgICAgICAgbWFwLml0ZW1zLnB1c2godmFsdWUpO1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuIHx8XG4gICAgICAgICh0eXBlb2YgQmlnSW50ICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJpZ0ludCkgLy8gbm90IHN1cHBvcnRlZCBldmVyeXdoZXJlXG4gICAgKSB7XG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtc2VyaWFsaXplanNvbnByb3BlcnR5XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpO1xuICAgIH1cbiAgICBjb25zdCB7IGFsaWFzRHVwbGljYXRlT2JqZWN0cywgb25BbmNob3IsIG9uVGFnT2JqLCBzY2hlbWEsIHNvdXJjZU9iamVjdHMgfSA9IGN0eDtcbiAgICAvLyBEZXRlY3QgZHVwbGljYXRlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgb2JqZWN0ICYgdXNlIEFsaWFzIG5vZGVzIGZvciBhbGxcbiAgICAvLyBhZnRlciBmaXJzdC4gVGhlIGByZWZgIHdyYXBwZXIgYWxsb3dzIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIHRvIHJlc29sdmUuXG4gICAgbGV0IHJlZiA9IHVuZGVmaW5lZDtcbiAgICBpZiAoYWxpYXNEdXBsaWNhdGVPYmplY3RzICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmVmID0gc291cmNlT2JqZWN0cy5nZXQodmFsdWUpO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICByZWYuYW5jaG9yID8/IChyZWYuYW5jaG9yID0gb25BbmNob3IodmFsdWUpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQWxpYXMocmVmLmFuY2hvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZWYgPSB7IGFuY2hvcjogbnVsbCwgbm9kZTogbnVsbCB9O1xuICAgICAgICAgICAgc291cmNlT2JqZWN0cy5zZXQodmFsdWUsIHJlZik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRhZ05hbWU/LnN0YXJ0c1dpdGgoJyEhJykpXG4gICAgICAgIHRhZ05hbWUgPSBkZWZhdWx0VGFnUHJlZml4ICsgdGFnTmFtZS5zbGljZSgyKTtcbiAgICBsZXQgdGFnT2JqID0gZmluZFRhZ09iamVjdCh2YWx1ZSwgdGFnTmFtZSwgc2NoZW1hLnRhZ3MpO1xuICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudG9KU09OID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSlNPTigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlZilcbiAgICAgICAgICAgICAgICByZWYubm9kZSA9IG5vZGU7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBNYXBcbiAgICAgICAgICAgICAgICA/IHNjaGVtYVtNQVBdXG4gICAgICAgICAgICAgICAgOiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IHNjaGVtYVtTRVFdXG4gICAgICAgICAgICAgICAgICAgIDogc2NoZW1hW01BUF07XG4gICAgfVxuICAgIGlmIChvblRhZ09iaikge1xuICAgICAgICBvblRhZ09iaih0YWdPYmopO1xuICAgICAgICBkZWxldGUgY3R4Lm9uVGFnT2JqO1xuICAgIH1cbiAgICBjb25zdCBub2RlID0gdGFnT2JqPy5jcmVhdGVOb2RlXG4gICAgICAgID8gdGFnT2JqLmNyZWF0ZU5vZGUoY3R4LnNjaGVtYSwgdmFsdWUsIGN0eClcbiAgICAgICAgOiB0eXBlb2YgdGFnT2JqPy5ub2RlQ2xhc3M/LmZyb20gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gdGFnT2JqLm5vZGVDbGFzcy5mcm9tKGN0eC5zY2hlbWEsIHZhbHVlLCBjdHgpXG4gICAgICAgICAgICA6IG5ldyBTY2FsYXIodmFsdWUpO1xuICAgIGlmICh0YWdOYW1lKVxuICAgICAgICBub2RlLnRhZyA9IHRhZ05hbWU7XG4gICAgZWxzZSBpZiAoIXRhZ09iai5kZWZhdWx0KVxuICAgICAgICBub2RlLnRhZyA9IHRhZ09iai50YWc7XG4gICAgaWYgKHJlZilcbiAgICAgICAgcmVmLm5vZGUgPSBub2RlO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5leHBvcnQgeyBjcmVhdGVOb2RlIH07XG4iLCJpbXBvcnQgeyBjcmVhdGVOb2RlIH0gZnJvbSAnLi4vZG9jL2NyZWF0ZU5vZGUuanMnO1xuaW1wb3J0IHsgaXNOb2RlLCBpc1BhaXIsIGlzQ29sbGVjdGlvbiwgaXNTY2FsYXIgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IE5vZGVCYXNlIH0gZnJvbSAnLi9Ob2RlLmpzJztcblxuZnVuY3Rpb24gY29sbGVjdGlvbkZyb21QYXRoKHNjaGVtYSwgcGF0aCwgdmFsdWUpIHtcbiAgICBsZXQgdiA9IHZhbHVlO1xuICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGNvbnN0IGsgPSBwYXRoW2ldO1xuICAgICAgICBpZiAodHlwZW9mIGsgPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoaykgJiYgayA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gW107XG4gICAgICAgICAgICBhW2tdID0gdjtcbiAgICAgICAgICAgIHYgPSBhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdiA9IG5ldyBNYXAoW1trLCB2XV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVOb2RlKHYsIHVuZGVmaW5lZCwge1xuICAgICAgICBhbGlhc0R1cGxpY2F0ZU9iamVjdHM6IGZhbHNlLFxuICAgICAgICBrZWVwVW5kZWZpbmVkOiBmYWxzZSxcbiAgICAgICAgb25BbmNob3I6ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgcGxlYXNlIHJlcG9ydCBhIGJ1Zy4nKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBzb3VyY2VPYmplY3RzOiBuZXcgTWFwKClcbiAgICB9KTtcbn1cbi8vIFR5cGUgZ3VhcmQgaXMgaW50ZW50aW9uYWxseSBhIGxpdHRsZSB3cm9uZyBzbyBhcyB0byBiZSBtb3JlIHVzZWZ1bCxcbi8vIGFzIGl0IGRvZXMgbm90IGNvdmVyIHVudHlwYWJsZSBlbXB0eSBub24tc3RyaW5nIGl0ZXJhYmxlcyAoZS5nLiBbXSkuXG5jb25zdCBpc0VtcHR5UGF0aCA9IChwYXRoKSA9PiBwYXRoID09IG51bGwgfHxcbiAgICAodHlwZW9mIHBhdGggPT09ICdvYmplY3QnICYmICEhcGF0aFtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmUpO1xuY2xhc3MgQ29sbGVjdGlvbiBleHRlbmRzIE5vZGVCYXNlIHtcbiAgICBjb25zdHJ1Y3Rvcih0eXBlLCBzY2hlbWEpIHtcbiAgICAgICAgc3VwZXIodHlwZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NoZW1hJywge1xuICAgICAgICAgICAgdmFsdWU6IHNjaGVtYSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIElmIGRlZmluZWQsIG92ZXJ3cml0ZXMgdGhlIG9yaWdpbmFsJ3Mgc2NoZW1hXG4gICAgICovXG4gICAgY2xvbmUoc2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO1xuICAgICAgICBpZiAoc2NoZW1hKVxuICAgICAgICAgICAgY29weS5zY2hlbWEgPSBzY2hlbWE7XG4gICAgICAgIGNvcHkuaXRlbXMgPSBjb3B5Lml0ZW1zLm1hcChpdCA9PiBpc05vZGUoaXQpIHx8IGlzUGFpcihpdCkgPyBpdC5jbG9uZShzY2hlbWEpIDogaXQpO1xuICAgICAgICBpZiAodGhpcy5yYW5nZSlcbiAgICAgICAgICAgIGNvcHkucmFuZ2UgPSB0aGlzLnJhbmdlLnNsaWNlKCk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGNvbGxlY3Rpb24uIEZvciBgISFtYXBgIGFuZCBgISFvbWFwYCB0aGUgdmFsdWUgbXVzdFxuICAgICAqIGJlIGEgUGFpciBpbnN0YW5jZSBvciBhIGB7IGtleSwgdmFsdWUgfWAgb2JqZWN0LCB3aGljaCBtYXkgbm90IGhhdmUgYSBrZXlcbiAgICAgKiB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAuXG4gICAgICovXG4gICAgYWRkSW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgdGhpcy5hZGQodmFsdWUpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzQ29sbGVjdGlvbihub2RlKSlcbiAgICAgICAgICAgICAgICBub2RlLmFkZEluKHJlc3QsIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnNjaGVtYSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldChrZXksIGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgcmVzdCwgdmFsdWUpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke2tleX0uIFJlbWFpbmluZyBwYXRoOiAke3Jlc3R9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBkZWxldGVJbihwYXRoKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICBpZiAoaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGVsZXRlSW4ocmVzdCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7a2V5fS4gUmVtYWluaW5nIHBhdGg6ICR7cmVzdH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuIEJ5IGRlZmF1bHQgdW53cmFwc1xuICAgICAqIHNjYWxhciB2YWx1ZXMgZnJvbSB0aGVpciBzdXJyb3VuZGluZyBub2RlOyB0byBkaXNhYmxlIHNldCBga2VlcFNjYWxhcmAgdG9cbiAgICAgKiBgdHJ1ZWAgKGNvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmV0dXJuZWQgaW50YWN0KS5cbiAgICAgKi9cbiAgICBnZXRJbihwYXRoLCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0KGtleSwgdHJ1ZSk7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiAha2VlcFNjYWxhciAmJiBpc1NjYWxhcihub2RlKSA/IG5vZGUudmFsdWUgOiBub2RlO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKG5vZGUpID8gbm9kZS5nZXRJbihyZXN0LCBrZWVwU2NhbGFyKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaGFzQWxsTnVsbFZhbHVlcyhhbGxvd1NjYWxhcikge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5ldmVyeShub2RlID0+IHtcbiAgICAgICAgICAgIGlmICghaXNQYWlyKG5vZGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBub2RlLnZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIChuID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAoYWxsb3dTY2FsYXIgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNTY2FsYXIobikgJiZcbiAgICAgICAgICAgICAgICAgICAgbi52YWx1ZSA9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICFuLmNvbW1lbnRCZWZvcmUgJiZcbiAgICAgICAgICAgICAgICAgICAgIW4uY29tbWVudCAmJlxuICAgICAgICAgICAgICAgICAgICAhbi50YWcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKi9cbiAgICBoYXNJbihwYXRoKSB7XG4gICAgICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0aDtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzKGtleSk7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldChrZXksIHRydWUpO1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKG5vZGUpID8gbm9kZS5oYXNJbihyZXN0KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBjb2xsZWN0aW9uLiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKi9cbiAgICBzZXRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBba2V5LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5nZXQoa2V5LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc0NvbGxlY3Rpb24obm9kZSkpXG4gICAgICAgICAgICAgICAgbm9kZS5zZXRJbihyZXN0LCB2YWx1ZSk7XG4gICAgICAgICAgICBlbHNlIGlmIChub2RlID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCBjb2xsZWN0aW9uRnJvbVBhdGgodGhpcy5zY2hlbWEsIHJlc3QsIHZhbHVlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtrZXl9LiBSZW1haW5pbmcgcGF0aDogJHtyZXN0fWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb2xsZWN0aW9uLCBjb2xsZWN0aW9uRnJvbVBhdGgsIGlzRW1wdHlQYXRoIH07XG4iLCIvKipcbiAqIFN0cmluZ2lmaWVzIGEgY29tbWVudC5cbiAqXG4gKiBFbXB0eSBjb21tZW50IGxpbmVzIGFyZSBsZWZ0IGVtcHR5LFxuICogbGluZXMgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBzcGFjZSBhcmUgcmVwbGFjZWQgYnkgYCNgLFxuICogYW5kIGFsbCBvdGhlciBsaW5lcyBhcmUgcHJlZml4ZWQgd2l0aCBhIGAjYC5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5Q29tbWVudCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC9eKD8hJCkoPzogJCk/L2dtLCAnIycpO1xuZnVuY3Rpb24gaW5kZW50Q29tbWVudChjb21tZW50LCBpbmRlbnQpIHtcbiAgICBpZiAoL15cXG4rJC8udGVzdChjb21tZW50KSlcbiAgICAgICAgcmV0dXJuIGNvbW1lbnQuc3Vic3RyaW5nKDEpO1xuICAgIHJldHVybiBpbmRlbnQgPyBjb21tZW50LnJlcGxhY2UoL14oPyEgKiQpL2dtLCBpbmRlbnQpIDogY29tbWVudDtcbn1cbmNvbnN0IGxpbmVDb21tZW50ID0gKHN0ciwgaW5kZW50LCBjb21tZW50KSA9PiBzdHIuZW5kc1dpdGgoJ1xcbicpXG4gICAgPyBpbmRlbnRDb21tZW50KGNvbW1lbnQsIGluZGVudClcbiAgICA6IGNvbW1lbnQuaW5jbHVkZXMoJ1xcbicpXG4gICAgICAgID8gJ1xcbicgKyBpbmRlbnRDb21tZW50KGNvbW1lbnQsIGluZGVudClcbiAgICAgICAgOiAoc3RyLmVuZHNXaXRoKCcgJykgPyAnJyA6ICcgJykgKyBjb21tZW50O1xuXG5leHBvcnQgeyBpbmRlbnRDb21tZW50LCBsaW5lQ29tbWVudCwgc3RyaW5naWZ5Q29tbWVudCB9O1xuIiwiY29uc3QgRk9MRF9GTE9XID0gJ2Zsb3cnO1xuY29uc3QgRk9MRF9CTE9DSyA9ICdibG9jayc7XG5jb25zdCBGT0xEX1FVT1RFRCA9ICdxdW90ZWQnO1xuLyoqXG4gKiBUcmllcyB0byBrZWVwIGlucHV0IGF0IHVwIHRvIGBsaW5lV2lkdGhgIGNoYXJhY3RlcnMsIHNwbGl0dGluZyBvbmx5IG9uIHNwYWNlc1xuICogbm90IGZvbGxvd2VkIGJ5IG5ld2xpbmVzIG9yIHNwYWNlcyB1bmxlc3MgYG1vZGVgIGlzIGAncXVvdGVkJ2AuIExpbmVzIGFyZVxuICogdGVybWluYXRlZCB3aXRoIGBcXG5gIGFuZCBzdGFydGVkIHdpdGggYGluZGVudGAuXG4gKi9cbmZ1bmN0aW9uIGZvbGRGbG93TGluZXModGV4dCwgaW5kZW50LCBtb2RlID0gJ2Zsb3cnLCB7IGluZGVudEF0U3RhcnQsIGxpbmVXaWR0aCA9IDgwLCBtaW5Db250ZW50V2lkdGggPSAyMCwgb25Gb2xkLCBvbk92ZXJmbG93IH0gPSB7fSkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIGlmIChsaW5lV2lkdGggPCBtaW5Db250ZW50V2lkdGgpXG4gICAgICAgIG1pbkNvbnRlbnRXaWR0aCA9IDA7XG4gICAgY29uc3QgZW5kU3RlcCA9IE1hdGgubWF4KDEgKyBtaW5Db250ZW50V2lkdGgsIDEgKyBsaW5lV2lkdGggLSBpbmRlbnQubGVuZ3RoKTtcbiAgICBpZiAodGV4dC5sZW5ndGggPD0gZW5kU3RlcClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgY29uc3QgZm9sZHMgPSBbXTtcbiAgICBjb25zdCBlc2NhcGVkRm9sZHMgPSB7fTtcbiAgICBsZXQgZW5kID0gbGluZVdpZHRoIC0gaW5kZW50Lmxlbmd0aDtcbiAgICBpZiAodHlwZW9mIGluZGVudEF0U3RhcnQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChpbmRlbnRBdFN0YXJ0ID4gbGluZVdpZHRoIC0gTWF0aC5tYXgoMiwgbWluQ29udGVudFdpZHRoKSlcbiAgICAgICAgICAgIGZvbGRzLnB1c2goMCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGVuZCA9IGxpbmVXaWR0aCAtIGluZGVudEF0U3RhcnQ7XG4gICAgfVxuICAgIGxldCBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJldiA9IHVuZGVmaW5lZDtcbiAgICBsZXQgb3ZlcmZsb3cgPSBmYWxzZTtcbiAgICBsZXQgaSA9IC0xO1xuICAgIGxldCBlc2NTdGFydCA9IC0xO1xuICAgIGxldCBlc2NFbmQgPSAtMTtcbiAgICBpZiAobW9kZSA9PT0gRk9MRF9CTE9DSykge1xuICAgICAgICBpID0gY29uc3VtZU1vcmVJbmRlbnRlZExpbmVzKHRleHQsIGksIGluZGVudC5sZW5ndGgpO1xuICAgICAgICBpZiAoaSAhPT0gLTEpXG4gICAgICAgICAgICBlbmQgPSBpICsgZW5kU3RlcDtcbiAgICB9XG4gICAgZm9yIChsZXQgY2g7IChjaCA9IHRleHRbKGkgKz0gMSldKTspIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGVzY1N0YXJ0ID0gaTtcbiAgICAgICAgICAgIHN3aXRjaCAodGV4dFtpICsgMV0pIHtcbiAgICAgICAgICAgICAgICBjYXNlICd4JzpcbiAgICAgICAgICAgICAgICAgICAgaSArPSAzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd1JzpcbiAgICAgICAgICAgICAgICAgICAgaSArPSA1O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdVJzpcbiAgICAgICAgICAgICAgICAgICAgaSArPSA5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlc2NFbmQgPSBpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGlmIChtb2RlID09PSBGT0xEX0JMT0NLKVxuICAgICAgICAgICAgICAgIGkgPSBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSwgaW5kZW50Lmxlbmd0aCk7XG4gICAgICAgICAgICBlbmQgPSBpICsgaW5kZW50Lmxlbmd0aCArIGVuZFN0ZXA7XG4gICAgICAgICAgICBzcGxpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnICYmXG4gICAgICAgICAgICAgICAgcHJldiAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICcgJyAmJlxuICAgICAgICAgICAgICAgIHByZXYgIT09ICdcXG4nICYmXG4gICAgICAgICAgICAgICAgcHJldiAhPT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGFjZSBzdXJyb3VuZGVkIGJ5IG5vbi1zcGFjZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBuZXdsaW5lICsgaW5kZW50XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRleHRbaSArIDFdO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09ICcgJyAmJiBuZXh0ICE9PSAnXFxuJyAmJiBuZXh0ICE9PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgc3BsaXQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGkgPj0gZW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNwbGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbGRzLnB1c2goc3BsaXQpO1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSBzcGxpdCArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09PSBGT0xEX1FVT1RFRCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB3aGl0ZS1zcGFjZSBjb2xsZWN0ZWQgYXQgZW5kIG1heSBzdHJldGNoIHBhc3QgbGluZVdpZHRoXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2ID09PSAnICcgfHwgcHJldiA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gdGV4dFsoaSArPSAxKV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgbmV3bGluZSBlc2NhcGUsIGJ1dCBkb24ndCBicmVhayBwcmVjZWRpbmcgZXNjYXBlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGogPSBpID4gZXNjRW5kICsgMSA/IGkgLSAyIDogZXNjU3RhcnQgLSAxO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWlsIG91dCBpZiBsaW5lV2lkdGggJiBtaW5Db250ZW50V2lkdGggYXJlIHNob3J0ZXIgdGhhbiBhbiBlc2NhcGUgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2NhcGVkRm9sZHNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgZm9sZHMucHVzaChqKTtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZEZvbGRzW2pdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZW5kID0gaiArIGVuZFN0ZXA7XG4gICAgICAgICAgICAgICAgICAgIHNwbGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwcmV2ID0gY2g7XG4gICAgfVxuICAgIGlmIChvdmVyZmxvdyAmJiBvbk92ZXJmbG93KVxuICAgICAgICBvbk92ZXJmbG93KCk7XG4gICAgaWYgKGZvbGRzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgaWYgKG9uRm9sZClcbiAgICAgICAgb25Gb2xkKCk7XG4gICAgbGV0IHJlcyA9IHRleHQuc2xpY2UoMCwgZm9sZHNbMF0pO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9sZHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgZm9sZCA9IGZvbGRzW2ldO1xuICAgICAgICBjb25zdCBlbmQgPSBmb2xkc1tpICsgMV0gfHwgdGV4dC5sZW5ndGg7XG4gICAgICAgIGlmIChmb2xkID09PSAwKVxuICAgICAgICAgICAgcmVzID0gYFxcbiR7aW5kZW50fSR7dGV4dC5zbGljZSgwLCBlbmQpfWA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IEZPTERfUVVPVEVEICYmIGVzY2FwZWRGb2xkc1tmb2xkXSlcbiAgICAgICAgICAgICAgICByZXMgKz0gYCR7dGV4dFtmb2xkXX1cXFxcYDtcbiAgICAgICAgICAgIHJlcyArPSBgXFxuJHtpbmRlbnR9JHt0ZXh0LnNsaWNlKGZvbGQgKyAxLCBlbmQpfWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogUHJlc3VtZXMgYGkgKyAxYCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lXG4gKiBAcmV0dXJucyBpbmRleCBvZiBsYXN0IG5ld2xpbmUgaW4gbW9yZS1pbmRlbnRlZCBibG9ja1xuICovXG5mdW5jdGlvbiBjb25zdW1lTW9yZUluZGVudGVkTGluZXModGV4dCwgaSwgaW5kZW50KSB7XG4gICAgbGV0IGVuZCA9IGk7XG4gICAgbGV0IHN0YXJ0ID0gaSArIDE7XG4gICAgbGV0IGNoID0gdGV4dFtzdGFydF07XG4gICAgd2hpbGUgKGNoID09PSAnICcgfHwgY2ggPT09ICdcXHQnKSB7XG4gICAgICAgIGlmIChpIDwgc3RhcnQgKyBpbmRlbnQpIHtcbiAgICAgICAgICAgIGNoID0gdGV4dFsrK2ldO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGNoID0gdGV4dFsrK2ldO1xuICAgICAgICAgICAgfSB3aGlsZSAoY2ggJiYgY2ggIT09ICdcXG4nKTtcbiAgICAgICAgICAgIGVuZCA9IGk7XG4gICAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgICAgY2ggPSB0ZXh0W3N0YXJ0XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZW5kO1xufVxuXG5leHBvcnQgeyBGT0xEX0JMT0NLLCBGT0xEX0ZMT1csIEZPTERfUVVPVEVELCBmb2xkRmxvd0xpbmVzIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgZm9sZEZsb3dMaW5lcywgRk9MRF9GTE9XLCBGT0xEX1FVT1RFRCwgRk9MRF9CTE9DSyB9IGZyb20gJy4vZm9sZEZsb3dMaW5lcy5qcyc7XG5cbmNvbnN0IGdldEZvbGRPcHRpb25zID0gKGN0eCwgaXNCbG9jaykgPT4gKHtcbiAgICBpbmRlbnRBdFN0YXJ0OiBpc0Jsb2NrID8gY3R4LmluZGVudC5sZW5ndGggOiBjdHguaW5kZW50QXRTdGFydCxcbiAgICBsaW5lV2lkdGg6IGN0eC5vcHRpb25zLmxpbmVXaWR0aCxcbiAgICBtaW5Db250ZW50V2lkdGg6IGN0eC5vcHRpb25zLm1pbkNvbnRlbnRXaWR0aFxufSk7XG4vLyBBbHNvIGNoZWNrcyBmb3IgbGluZXMgc3RhcnRpbmcgd2l0aCAlLCBhcyBwYXJzaW5nIHRoZSBvdXRwdXQgYXMgWUFNTCAxLjEgd2lsbFxuLy8gcHJlc3VtZSB0aGF0J3Mgc3RhcnRpbmcgYSBuZXcgZG9jdW1lbnQuXG5jb25zdCBjb250YWluc0RvY3VtZW50TWFya2VyID0gKHN0cikgPT4gL14oJXwtLS18XFwuXFwuXFwuKS9tLnRlc3Qoc3RyKTtcbmZ1bmN0aW9uIGxpbmVMZW5ndGhPdmVyTGltaXQoc3RyLCBsaW5lV2lkdGgsIGluZGVudExlbmd0aCkge1xuICAgIGlmICghbGluZVdpZHRoIHx8IGxpbmVXaWR0aCA8IDApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBsaW1pdCA9IGxpbmVXaWR0aCAtIGluZGVudExlbmd0aDtcbiAgICBjb25zdCBzdHJMZW4gPSBzdHIubGVuZ3RoO1xuICAgIGlmIChzdHJMZW4gPD0gbGltaXQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMCwgc3RhcnQgPSAwOyBpIDwgc3RyTGVuOyArK2kpIHtcbiAgICAgICAgaWYgKHN0cltpXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGlmIChpIC0gc3RhcnQgPiBsaW1pdClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICBpZiAoc3RyTGVuIC0gc3RhcnQgPD0gbGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gZG91YmxlUXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChjdHgub3B0aW9ucy5kb3VibGVRdW90ZWRBc0pTT04pXG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIGNvbnN0IHsgaW1wbGljaXRLZXkgfSA9IGN0eDtcbiAgICBjb25zdCBtaW5NdWx0aUxpbmVMZW5ndGggPSBjdHgub3B0aW9ucy5kb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg7XG4gICAgY29uc3QgaW5kZW50ID0gY3R4LmluZGVudCB8fCAoY29udGFpbnNEb2N1bWVudE1hcmtlcih2YWx1ZSkgPyAnICAnIDogJycpO1xuICAgIGxldCBzdHIgPSAnJztcbiAgICBsZXQgc3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwLCBjaCA9IGpzb25baV07IGNoOyBjaCA9IGpzb25bKytpXSkge1xuICAgICAgICBpZiAoY2ggPT09ICcgJyAmJiBqc29uW2kgKyAxXSA9PT0gJ1xcXFwnICYmIGpzb25baSArIDJdID09PSAnbicpIHtcbiAgICAgICAgICAgIC8vIHNwYWNlIGJlZm9yZSBuZXdsaW5lIG5lZWRzIHRvIGJlIGVzY2FwZWQgdG8gbm90IGJlIGZvbGRlZFxuICAgICAgICAgICAgc3RyICs9IGpzb24uc2xpY2Uoc3RhcnQsIGkpICsgJ1xcXFwgJztcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGNoID0gJ1xcXFwnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgc3dpdGNoIChqc29uW2kgKyAxXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3UnOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0ganNvbi5zbGljZShzdGFydCwgaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0ganNvbi5zdWJzdHIoaSArIDIsIDQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAwMCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXDAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDA3JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcYSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwMGInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFx2JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMDAxYic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwMDg1JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcTic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzAwYTAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFxfJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMjAyOCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXEwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcyMDI5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICdcXFxcUCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlLnN1YnN0cigwLCAyKSA9PT0gJzAwJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnXFxcXHgnICsgY29kZS5zdWJzdHIoMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnN1YnN0cihpLCA2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnbic6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBsaWNpdEtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgMl0gPT09ICdcIicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ubGVuZ3RoIDwgbWluTXVsdGlMaW5lTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xkaW5nIHdpbGwgZWF0IGZpcnN0IG5ld2xpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBqc29uLnNsaWNlKHN0YXJ0LCBpKSArICdcXG5cXG4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGpzb25baSArIDJdID09PSAnXFxcXCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uW2kgKyAzXSA9PT0gJ24nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbltpICsgNF0gIT09ICdcIicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGluZGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlIGFmdGVyIG5ld2xpbmUgbmVlZHMgdG8gYmUgZXNjYXBlZCB0byBub3QgYmUgZm9sZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvbltpICsgMl0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJ1xcXFwnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHN0ciA9IHN0YXJ0ID8gc3RyICsganNvbi5zbGljZShzdGFydCkgOiBqc29uO1xuICAgIHJldHVybiBpbXBsaWNpdEtleVxuICAgICAgICA/IHN0clxuICAgICAgICA6IGZvbGRGbG93TGluZXMoc3RyLCBpbmRlbnQsIEZPTERfUVVPVEVELCBnZXRGb2xkT3B0aW9ucyhjdHgsIGZhbHNlKSk7XG59XG5mdW5jdGlvbiBzaW5nbGVRdW90ZWRTdHJpbmcodmFsdWUsIGN0eCkge1xuICAgIGlmIChjdHgub3B0aW9ucy5zaW5nbGVRdW90ZSA9PT0gZmFsc2UgfHxcbiAgICAgICAgKGN0eC5pbXBsaWNpdEtleSAmJiB2YWx1ZS5pbmNsdWRlcygnXFxuJykpIHx8XG4gICAgICAgIC9bIFxcdF1cXG58XFxuWyBcXHRdLy50ZXN0KHZhbHVlKSAvLyBzaW5nbGUgcXVvdGVkIHN0cmluZyBjYW4ndCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcm91bmQgbmV3bGluZVxuICAgIClcbiAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICBjb25zdCBpbmRlbnQgPSBjdHguaW5kZW50IHx8IChjb250YWluc0RvY3VtZW50TWFya2VyKHZhbHVlKSA/ICcgICcgOiAnJyk7XG4gICAgY29uc3QgcmVzID0gXCInXCIgKyB2YWx1ZS5yZXBsYWNlKC8nL2csIFwiJydcIikucmVwbGFjZSgvXFxuKy9nLCBgJCZcXG4ke2luZGVudH1gKSArIFwiJ1wiO1xuICAgIHJldHVybiBjdHguaW1wbGljaXRLZXlcbiAgICAgICAgPyByZXNcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHJlcywgaW5kZW50LCBGT0xEX0ZMT1csIGdldEZvbGRPcHRpb25zKGN0eCwgZmFsc2UpKTtcbn1cbmZ1bmN0aW9uIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KSB7XG4gICAgY29uc3QgeyBzaW5nbGVRdW90ZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgbGV0IHFzO1xuICAgIGlmIChzaW5nbGVRdW90ZSA9PT0gZmFsc2UpXG4gICAgICAgIHFzID0gZG91YmxlUXVvdGVkU3RyaW5nO1xuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBoYXNEb3VibGUgPSB2YWx1ZS5pbmNsdWRlcygnXCInKTtcbiAgICAgICAgY29uc3QgaGFzU2luZ2xlID0gdmFsdWUuaW5jbHVkZXMoXCInXCIpO1xuICAgICAgICBpZiAoaGFzRG91YmxlICYmICFoYXNTaW5nbGUpXG4gICAgICAgICAgICBxcyA9IHNpbmdsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZSBpZiAoaGFzU2luZ2xlICYmICFoYXNEb3VibGUpXG4gICAgICAgICAgICBxcyA9IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcXMgPSBzaW5nbGVRdW90ZSA/IHNpbmdsZVF1b3RlZFN0cmluZyA6IGRvdWJsZVF1b3RlZFN0cmluZztcbiAgICB9XG4gICAgcmV0dXJuIHFzKHZhbHVlLCBjdHgpO1xufVxuLy8gVGhlIG5lZ2F0aXZlIGxvb2tiZWhpbmQgYXZvaWRzIGEgcG9seW5vbWlhbCBzZWFyY2gsXG4vLyBidXQgaXNuJ3Qgc3VwcG9ydGVkIHlldCBvbiBTYWZhcmk6IGh0dHBzOi8vY2FuaXVzZS5jb20vanMtcmVnZXhwLWxvb2tiZWhpbmRcbmxldCBibG9ja0VuZE5ld2xpbmVzO1xudHJ5IHtcbiAgICBibG9ja0VuZE5ld2xpbmVzID0gbmV3IFJlZ0V4cCgnKF58KD88IVxcbikpXFxuKyg/IVxcbnwkKScsICdnJyk7XG59XG5jYXRjaCB7XG4gICAgYmxvY2tFbmROZXdsaW5lcyA9IC9cXG4rKD8hXFxufCQpL2c7XG59XG5mdW5jdGlvbiBibG9ja1N0cmluZyh7IGNvbW1lbnQsIHR5cGUsIHZhbHVlIH0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgIGNvbnN0IHsgYmxvY2tRdW90ZSwgY29tbWVudFN0cmluZywgbGluZVdpZHRoIH0gPSBjdHgub3B0aW9ucztcbiAgICAvLyAxLiBCbG9jayBjYW4ndCBlbmQgaW4gd2hpdGVzcGFjZSB1bmxlc3MgdGhlIGxhc3QgbGluZSBpcyBub24tZW1wdHkuXG4gICAgLy8gMi4gU3RyaW5ncyBjb25zaXN0aW5nIG9mIG9ubHkgd2hpdGVzcGFjZSBhcmUgYmVzdCByZW5kZXJlZCBleHBsaWNpdGx5LlxuICAgIGlmICghYmxvY2tRdW90ZSB8fCAvXFxuW1xcdCBdKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGVudCA9IGN0eC5pbmRlbnQgfHxcbiAgICAgICAgKGN0eC5mb3JjZUJsb2NrSW5kZW50IHx8IGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpID8gJyAgJyA6ICcnKTtcbiAgICBjb25zdCBsaXRlcmFsID0gYmxvY2tRdW90ZSA9PT0gJ2xpdGVyYWwnXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGJsb2NrUXVvdGUgPT09ICdmb2xkZWQnIHx8IHR5cGUgPT09IFNjYWxhci5CTE9DS19GT0xERURcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogdHlwZSA9PT0gU2NhbGFyLkJMT0NLX0xJVEVSQUxcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6ICFsaW5lTGVuZ3RoT3ZlckxpbWl0KHZhbHVlLCBsaW5lV2lkdGgsIGluZGVudC5sZW5ndGgpO1xuICAgIGlmICghdmFsdWUpXG4gICAgICAgIHJldHVybiBsaXRlcmFsID8gJ3xcXG4nIDogJz5cXG4nO1xuICAgIC8vIGRldGVybWluZSBjaG9tcGluZyBmcm9tIHdoaXRlc3BhY2UgYXQgdmFsdWUgZW5kXG4gICAgbGV0IGNob21wO1xuICAgIGxldCBlbmRTdGFydDtcbiAgICBmb3IgKGVuZFN0YXJ0ID0gdmFsdWUubGVuZ3RoOyBlbmRTdGFydCA+IDA7IC0tZW5kU3RhcnQpIHtcbiAgICAgICAgY29uc3QgY2ggPSB2YWx1ZVtlbmRTdGFydCAtIDFdO1xuICAgICAgICBpZiAoY2ggIT09ICdcXG4nICYmIGNoICE9PSAnXFx0JyAmJiBjaCAhPT0gJyAnKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxldCBlbmQgPSB2YWx1ZS5zdWJzdHJpbmcoZW5kU3RhcnQpO1xuICAgIGNvbnN0IGVuZE5sUG9zID0gZW5kLmluZGV4T2YoJ1xcbicpO1xuICAgIGlmIChlbmRObFBvcyA9PT0gLTEpIHtcbiAgICAgICAgY2hvbXAgPSAnLSc7IC8vIHN0cmlwXG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlID09PSBlbmQgfHwgZW5kTmxQb3MgIT09IGVuZC5sZW5ndGggLSAxKSB7XG4gICAgICAgIGNob21wID0gJysnOyAvLyBrZWVwXG4gICAgICAgIGlmIChvbkNob21wS2VlcClcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjaG9tcCA9ICcnOyAvLyBjbGlwXG4gICAgfVxuICAgIGlmIChlbmQpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCAtZW5kLmxlbmd0aCk7XG4gICAgICAgIGlmIChlbmRbZW5kLmxlbmd0aCAtIDFdID09PSAnXFxuJylcbiAgICAgICAgICAgIGVuZCA9IGVuZC5zbGljZSgwLCAtMSk7XG4gICAgICAgIGVuZCA9IGVuZC5yZXBsYWNlKGJsb2NrRW5kTmV3bGluZXMsIGAkJiR7aW5kZW50fWApO1xuICAgIH1cbiAgICAvLyBkZXRlcm1pbmUgaW5kZW50IGluZGljYXRvciBmcm9tIHdoaXRlc3BhY2UgYXQgdmFsdWUgc3RhcnRcbiAgICBsZXQgc3RhcnRXaXRoU3BhY2UgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRFbmQ7XG4gICAgbGV0IHN0YXJ0TmxQb3MgPSAtMTtcbiAgICBmb3IgKHN0YXJ0RW5kID0gMDsgc3RhcnRFbmQgPCB2YWx1ZS5sZW5ndGg7ICsrc3RhcnRFbmQpIHtcbiAgICAgICAgY29uc3QgY2ggPSB2YWx1ZVtzdGFydEVuZF07XG4gICAgICAgIGlmIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgc3RhcnRXaXRoU3BhY2UgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICBzdGFydE5sUG9zID0gc3RhcnRFbmQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsZXQgc3RhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgc3RhcnRObFBvcyA8IHN0YXJ0RW5kID8gc3RhcnRObFBvcyArIDEgOiBzdGFydEVuZCk7XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKHN0YXJ0Lmxlbmd0aCk7XG4gICAgICAgIHN0YXJ0ID0gc3RhcnQucmVwbGFjZSgvXFxuKy9nLCBgJCYke2luZGVudH1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZW50U2l6ZSA9IGluZGVudCA/ICcyJyA6ICcxJzsgLy8gcm9vdCBpcyBhdCAtMVxuICAgIC8vIExlYWRpbmcgfCBvciA+IGlzIGFkZGVkIGxhdGVyXG4gICAgbGV0IGhlYWRlciA9IChzdGFydFdpdGhTcGFjZSA/IGluZGVudFNpemUgOiAnJykgKyBjaG9tcDtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBoZWFkZXIgKz0gJyAnICsgY29tbWVudFN0cmluZyhjb21tZW50LnJlcGxhY2UoLyA/W1xcclxcbl0rL2csICcgJykpO1xuICAgICAgICBpZiAob25Db21tZW50KVxuICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgfVxuICAgIGlmICghbGl0ZXJhbCkge1xuICAgICAgICBjb25zdCBmb2xkZWRWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuKy9nLCAnXFxuJCYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFxuKShbXFx0IF0uKikoPzooW1xcblxcdCBdKilcXG4oPyFbXFxuXFx0IF0pKT8vZywgJyQxJDInKSAvLyBtb3JlLWluZGVudGVkIGxpbmVzIGFyZW4ndCBmb2xkZWRcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIF4gbW9yZS1pbmQuIF4gZW1wdHkgICAgIF4gY2FwdHVyZSBuZXh0IGVtcHR5IGxpbmVzIG9ubHkgYXQgZW5kIG9mIGluZGVudFxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgICAgIGxldCBsaXRlcmFsRmFsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZm9sZE9wdGlvbnMgPSBnZXRGb2xkT3B0aW9ucyhjdHgsIHRydWUpO1xuICAgICAgICBpZiAoYmxvY2tRdW90ZSAhPT0gJ2ZvbGRlZCcgJiYgdHlwZSAhPT0gU2NhbGFyLkJMT0NLX0ZPTERFRCkge1xuICAgICAgICAgICAgZm9sZE9wdGlvbnMub25PdmVyZmxvdyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBsaXRlcmFsRmFsbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5ID0gZm9sZEZsb3dMaW5lcyhgJHtzdGFydH0ke2ZvbGRlZFZhbHVlfSR7ZW5kfWAsIGluZGVudCwgRk9MRF9CTE9DSywgZm9sZE9wdGlvbnMpO1xuICAgICAgICBpZiAoIWxpdGVyYWxGYWxsYmFjaylcbiAgICAgICAgICAgIHJldHVybiBgPiR7aGVhZGVyfVxcbiR7aW5kZW50fSR7Ym9keX1gO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcbisvZywgYCQmJHtpbmRlbnR9YCk7XG4gICAgcmV0dXJuIGB8JHtoZWFkZXJ9XFxuJHtpbmRlbnR9JHtzdGFydH0ke3ZhbHVlfSR7ZW5kfWA7XG59XG5mdW5jdGlvbiBwbGFpblN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IHR5cGUsIHZhbHVlIH0gPSBpdGVtO1xuICAgIGNvbnN0IHsgYWN0dWFsU3RyaW5nLCBpbXBsaWNpdEtleSwgaW5kZW50LCBpbmRlbnRTdGVwLCBpbkZsb3cgfSA9IGN0eDtcbiAgICBpZiAoKGltcGxpY2l0S2V5ICYmIHZhbHVlLmluY2x1ZGVzKCdcXG4nKSkgfHxcbiAgICAgICAgKGluRmxvdyAmJiAvW1tcXF17fSxdLy50ZXN0KHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIHF1b3RlZFN0cmluZyh2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKC9eW1xcblxcdCAsW1xcXXt9IyYqIXw+J1wiJUBgXXxeWz8tXSR8Xls/LV1bIFxcdF18W1xcbjpdWyBcXHRdfFsgXFx0XVxcbnxbXFxuXFx0IF0jfFtcXG5cXHQgOl0kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAvLyBub3QgYWxsb3dlZDpcbiAgICAgICAgLy8gLSAnLScgb3IgJz8nXG4gICAgICAgIC8vIC0gc3RhcnQgd2l0aCBhbiBpbmRpY2F0b3IgY2hhcmFjdGVyIChleGNlcHQgWz86LV0pIG9yIC9bPy1dIC9cbiAgICAgICAgLy8gLSAnXFxuICcsICc6ICcgb3IgJyBcXG4nIGFueXdoZXJlXG4gICAgICAgIC8vIC0gJyMnIG5vdCBwcmVjZWRlZCBieSBhIG5vbi1zcGFjZSBjaGFyXG4gICAgICAgIC8vIC0gZW5kIHdpdGggJyAnIG9yICc6J1xuICAgICAgICByZXR1cm4gaW1wbGljaXRLZXkgfHwgaW5GbG93IHx8ICF2YWx1ZS5pbmNsdWRlcygnXFxuJylcbiAgICAgICAgICAgID8gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpXG4gICAgICAgICAgICA6IGJsb2NrU3RyaW5nKGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgfVxuICAgIGlmICghaW1wbGljaXRLZXkgJiZcbiAgICAgICAgIWluRmxvdyAmJlxuICAgICAgICB0eXBlICE9PSBTY2FsYXIuUExBSU4gJiZcbiAgICAgICAgdmFsdWUuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgIC8vIFdoZXJlIGFsbG93ZWQgJiB0eXBlIG5vdCBzZXQgZXhwbGljaXRseSwgcHJlZmVyIGJsb2NrIHN0eWxlIGZvciBtdWx0aWxpbmUgc3RyaW5nc1xuICAgICAgICByZXR1cm4gYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG4gICAgaWYgKGNvbnRhaW5zRG9jdW1lbnRNYXJrZXIodmFsdWUpKSB7XG4gICAgICAgIGlmIChpbmRlbnQgPT09ICcnKSB7XG4gICAgICAgICAgICBjdHguZm9yY2VCbG9ja0luZGVudCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gYmxvY2tTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpbXBsaWNpdEtleSAmJiBpbmRlbnQgPT09IGluZGVudFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiBxdW90ZWRTdHJpbmcodmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3RyID0gdmFsdWUucmVwbGFjZSgvXFxuKy9nLCBgJCZcXG4ke2luZGVudH1gKTtcbiAgICAvLyBWZXJpZnkgdGhhdCBvdXRwdXQgd2lsbCBiZSBwYXJzZWQgYXMgYSBzdHJpbmcsIGFzIGUuZy4gcGxhaW4gbnVtYmVycyBhbmRcbiAgICAvLyBib29sZWFucyBnZXQgcGFyc2VkIHdpdGggdGhvc2UgdHlwZXMgaW4gdjEuMiAoZS5nLiAnNDInLCAndHJ1ZScgJiAnMC45ZS0zJyksXG4gICAgLy8gYW5kIG90aGVycyBpbiB2MS4xLlxuICAgIGlmIChhY3R1YWxTdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGVzdCA9ICh0YWcpID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50YWcgIT09ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInICYmIHRhZy50ZXN0Py50ZXN0KHN0cik7XG4gICAgICAgIGNvbnN0IHsgY29tcGF0LCB0YWdzIH0gPSBjdHguZG9jLnNjaGVtYTtcbiAgICAgICAgaWYgKHRhZ3Muc29tZSh0ZXN0KSB8fCBjb21wYXQ/LnNvbWUodGVzdCkpXG4gICAgICAgICAgICByZXR1cm4gcXVvdGVkU3RyaW5nKHZhbHVlLCBjdHgpO1xuICAgIH1cbiAgICByZXR1cm4gaW1wbGljaXRLZXlcbiAgICAgICAgPyBzdHJcbiAgICAgICAgOiBmb2xkRmxvd0xpbmVzKHN0ciwgaW5kZW50LCBGT0xEX0ZMT1csIGdldEZvbGRPcHRpb25zKGN0eCwgZmFsc2UpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeVN0cmluZyhpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBjb25zdCB7IGltcGxpY2l0S2V5LCBpbkZsb3cgfSA9IGN0eDtcbiAgICBjb25zdCBzcyA9IHR5cGVvZiBpdGVtLnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGl0ZW1cbiAgICAgICAgOiBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7IHZhbHVlOiBTdHJpbmcoaXRlbS52YWx1ZSkgfSk7XG4gICAgbGV0IHsgdHlwZSB9ID0gaXRlbTtcbiAgICBpZiAodHlwZSAhPT0gU2NhbGFyLlFVT1RFX0RPVUJMRSkge1xuICAgICAgICAvLyBmb3JjZSBkb3VibGUgcXVvdGVzIG9uIGNvbnRyb2wgY2hhcmFjdGVycyAmIHVucGFpcmVkIHN1cnJvZ2F0ZXNcbiAgICAgICAgaWYgKC9bXFx4MDAtXFx4MDhcXHgwYi1cXHgxZlxceDdmLVxceDlmXFx1e0Q4MDB9LVxcdXtERkZGfV0vdS50ZXN0KHNzLnZhbHVlKSlcbiAgICAgICAgICAgIHR5cGUgPSBTY2FsYXIuUVVPVEVfRE9VQkxFO1xuICAgIH1cbiAgICBjb25zdCBfc3RyaW5naWZ5ID0gKF90eXBlKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoX3R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0ZPTERFRDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLkJMT0NLX0xJVEVSQUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGltcGxpY2l0S2V5IHx8IGluRmxvd1xuICAgICAgICAgICAgICAgICAgICA/IHF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KSAvLyBibG9ja3MgYXJlIG5vdCB2YWxpZCBpbnNpZGUgZmxvdyBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgICAgIDogYmxvY2tTdHJpbmcoc3MsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhci5RVU9URV9ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZVF1b3RlZFN0cmluZyhzcy52YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyLlFVT1RFX1NJTkdMRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gc2luZ2xlUXVvdGVkU3RyaW5nKHNzLnZhbHVlLCBjdHgpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXIuUExBSU46XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBsYWluU3RyaW5nKHNzLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgbGV0IHJlcyA9IF9zdHJpbmdpZnkodHlwZSk7XG4gICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCB7IGRlZmF1bHRLZXlUeXBlLCBkZWZhdWx0U3RyaW5nVHlwZSB9ID0gY3R4Lm9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHQgPSAoaW1wbGljaXRLZXkgJiYgZGVmYXVsdEtleVR5cGUpIHx8IGRlZmF1bHRTdHJpbmdUeXBlO1xuICAgICAgICByZXMgPSBfc3RyaW5naWZ5KHQpO1xuICAgICAgICBpZiAocmVzID09PSBudWxsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkZWZhdWx0IHN0cmluZyB0eXBlICR7dH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5U3RyaW5nIH07XG4iLCJpbXBvcnQgeyBhbmNob3JJc1ZhbGlkIH0gZnJvbSAnLi4vZG9jL2FuY2hvcnMuanMnO1xuaW1wb3J0IHsgaXNQYWlyLCBpc0FsaWFzLCBpc05vZGUsIGlzU2NhbGFyLCBpc0NvbGxlY3Rpb24gfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4vc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlU3RyaW5naWZ5Q29udGV4dChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgYmxvY2tRdW90ZTogdHJ1ZSxcbiAgICAgICAgY29tbWVudFN0cmluZzogc3RyaW5naWZ5Q29tbWVudCxcbiAgICAgICAgZGVmYXVsdEtleVR5cGU6IG51bGwsXG4gICAgICAgIGRlZmF1bHRTdHJpbmdUeXBlOiAnUExBSU4nLFxuICAgICAgICBkaXJlY3RpdmVzOiBudWxsLFxuICAgICAgICBkb3VibGVRdW90ZWRBc0pTT046IGZhbHNlLFxuICAgICAgICBkb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg6IDQwLFxuICAgICAgICBmYWxzZVN0cjogJ2ZhbHNlJyxcbiAgICAgICAgZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiB0cnVlLFxuICAgICAgICBpbmRlbnRTZXE6IHRydWUsXG4gICAgICAgIGxpbmVXaWR0aDogODAsXG4gICAgICAgIG1pbkNvbnRlbnRXaWR0aDogMjAsXG4gICAgICAgIG51bGxTdHI6ICdudWxsJyxcbiAgICAgICAgc2ltcGxlS2V5czogZmFsc2UsXG4gICAgICAgIHNpbmdsZVF1b3RlOiBudWxsLFxuICAgICAgICB0cmFpbGluZ0NvbW1hOiBmYWxzZSxcbiAgICAgICAgdHJ1ZVN0cjogJ3RydWUnLFxuICAgICAgICB2ZXJpZnlBbGlhc09yZGVyOiB0cnVlXG4gICAgfSwgZG9jLnNjaGVtYS50b1N0cmluZ09wdGlvbnMsIG9wdGlvbnMpO1xuICAgIGxldCBpbkZsb3c7XG4gICAgc3dpdGNoIChvcHQuY29sbGVjdGlvblN0eWxlKSB7XG4gICAgICAgIGNhc2UgJ2Jsb2NrJzpcbiAgICAgICAgICAgIGluRmxvdyA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zsb3cnOlxuICAgICAgICAgICAgaW5GbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaW5GbG93ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYW5jaG9yczogbmV3IFNldCgpLFxuICAgICAgICBkb2MsXG4gICAgICAgIGZsb3dDb2xsZWN0aW9uUGFkZGluZzogb3B0LmZsb3dDb2xsZWN0aW9uUGFkZGluZyA/ICcgJyA6ICcnLFxuICAgICAgICBpbmRlbnQ6ICcnLFxuICAgICAgICBpbmRlbnRTdGVwOiB0eXBlb2Ygb3B0LmluZGVudCA9PT0gJ251bWJlcicgPyAnICcucmVwZWF0KG9wdC5pbmRlbnQpIDogJyAgJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiBvcHRcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0VGFnT2JqZWN0KHRhZ3MsIGl0ZW0pIHtcbiAgICBpZiAoaXRlbS50YWcpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0YWdzLmZpbHRlcih0ID0+IHQudGFnID09PSBpdGVtLnRhZyk7XG4gICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoLmZpbmQodCA9PiB0LmZvcm1hdCA9PT0gaXRlbS5mb3JtYXQpID8/IG1hdGNoWzBdO1xuICAgIH1cbiAgICBsZXQgdGFnT2JqID0gdW5kZWZpbmVkO1xuICAgIGxldCBvYmo7XG4gICAgaWYgKGlzU2NhbGFyKGl0ZW0pKSB7XG4gICAgICAgIG9iaiA9IGl0ZW0udmFsdWU7XG4gICAgICAgIGxldCBtYXRjaCA9IHRhZ3MuZmlsdGVyKHQgPT4gdC5pZGVudGlmeT8uKG9iaikpO1xuICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgdGVzdE1hdGNoID0gbWF0Y2guZmlsdGVyKHQgPT4gdC50ZXN0KTtcbiAgICAgICAgICAgIGlmICh0ZXN0TWF0Y2gubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICBtYXRjaCA9IHRlc3RNYXRjaDtcbiAgICAgICAgfVxuICAgICAgICB0YWdPYmogPVxuICAgICAgICAgICAgbWF0Y2guZmluZCh0ID0+IHQuZm9ybWF0ID09PSBpdGVtLmZvcm1hdCkgPz8gbWF0Y2guZmluZCh0ID0+ICF0LmZvcm1hdCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvYmogPSBpdGVtO1xuICAgICAgICB0YWdPYmogPSB0YWdzLmZpbmQodCA9PiB0Lm5vZGVDbGFzcyAmJiBvYmogaW5zdGFuY2VvZiB0Lm5vZGVDbGFzcyk7XG4gICAgfVxuICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBvYmo/LmNvbnN0cnVjdG9yPy5uYW1lID8/IChvYmogPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygb2JqKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWcgbm90IHJlc29sdmVkIGZvciAke25hbWV9IHZhbHVlYCk7XG4gICAgfVxuICAgIHJldHVybiB0YWdPYmo7XG59XG4vLyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHZhbHVlIHN0cmluZ2lmaWVyIHRvIGFsbG93IGZvciBjaXJjdWxhciBhbmNob3IgcmVmc1xuZnVuY3Rpb24gc3RyaW5naWZ5UHJvcHMobm9kZSwgdGFnT2JqLCB7IGFuY2hvcnMsIGRvYyB9KSB7XG4gICAgaWYgKCFkb2MuZGlyZWN0aXZlcylcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGNvbnN0IHByb3BzID0gW107XG4gICAgY29uc3QgYW5jaG9yID0gKGlzU2NhbGFyKG5vZGUpIHx8IGlzQ29sbGVjdGlvbihub2RlKSkgJiYgbm9kZS5hbmNob3I7XG4gICAgaWYgKGFuY2hvciAmJiBhbmNob3JJc1ZhbGlkKGFuY2hvcikpIHtcbiAgICAgICAgYW5jaG9ycy5hZGQoYW5jaG9yKTtcbiAgICAgICAgcHJvcHMucHVzaChgJiR7YW5jaG9yfWApO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBub2RlLnRhZyA/PyAodGFnT2JqLmRlZmF1bHQgPyBudWxsIDogdGFnT2JqLnRhZyk7XG4gICAgaWYgKHRhZylcbiAgICAgICAgcHJvcHMucHVzaChkb2MuZGlyZWN0aXZlcy50YWdTdHJpbmcodGFnKSk7XG4gICAgcmV0dXJuIHByb3BzLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeShpdGVtLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICBpZiAoaXNQYWlyKGl0ZW0pKVxuICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIGlmIChpc0FsaWFzKGl0ZW0pKSB7XG4gICAgICAgIGlmIChjdHguZG9jLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICByZXR1cm4gaXRlbS50b1N0cmluZyhjdHgpO1xuICAgICAgICBpZiAoY3R4LnJlc29sdmVkQWxpYXNlcz8uaGFzKGl0ZW0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBDYW5ub3Qgc3RyaW5naWZ5IGNpcmN1bGFyIHN0cnVjdHVyZSB3aXRob3V0IGFsaWFzIG5vZGVzYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3R4LnJlc29sdmVkQWxpYXNlcylcbiAgICAgICAgICAgICAgICBjdHgucmVzb2x2ZWRBbGlhc2VzLmFkZChpdGVtKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBjdHgucmVzb2x2ZWRBbGlhc2VzID0gbmV3IFNldChbaXRlbV0pO1xuICAgICAgICAgICAgaXRlbSA9IGl0ZW0ucmVzb2x2ZShjdHguZG9jKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgdGFnT2JqID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vZGUgPSBpc05vZGUoaXRlbSlcbiAgICAgICAgPyBpdGVtXG4gICAgICAgIDogY3R4LmRvYy5jcmVhdGVOb2RlKGl0ZW0sIHsgb25UYWdPYmo6IG8gPT4gKHRhZ09iaiA9IG8pIH0pO1xuICAgIHRhZ09iaiA/PyAodGFnT2JqID0gZ2V0VGFnT2JqZWN0KGN0eC5kb2Muc2NoZW1hLnRhZ3MsIG5vZGUpKTtcbiAgICBjb25zdCBwcm9wcyA9IHN0cmluZ2lmeVByb3BzKG5vZGUsIHRhZ09iaiwgY3R4KTtcbiAgICBpZiAocHJvcHMubGVuZ3RoID4gMClcbiAgICAgICAgY3R4LmluZGVudEF0U3RhcnQgPSAoY3R4LmluZGVudEF0U3RhcnQgPz8gMCkgKyBwcm9wcy5sZW5ndGggKyAxO1xuICAgIGNvbnN0IHN0ciA9IHR5cGVvZiB0YWdPYmouc3RyaW5naWZ5ID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdGFnT2JqLnN0cmluZ2lmeShub2RlLCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApXG4gICAgICAgIDogaXNTY2FsYXIobm9kZSlcbiAgICAgICAgICAgID8gc3RyaW5naWZ5U3RyaW5nKG5vZGUsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgICAgIDogbm9kZS50b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIGlmICghcHJvcHMpXG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgcmV0dXJuIGlzU2NhbGFyKG5vZGUpIHx8IHN0clswXSA9PT0gJ3snIHx8IHN0clswXSA9PT0gJ1snXG4gICAgICAgID8gYCR7cHJvcHN9ICR7c3RyfWBcbiAgICAgICAgOiBgJHtwcm9wc31cXG4ke2N0eC5pbmRlbnR9JHtzdHJ9YDtcbn1cblxuZXhwb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCwgc3RyaW5naWZ5IH07XG4iLCJpbXBvcnQgeyBpc0NvbGxlY3Rpb24sIGlzTm9kZSwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGxpbmVDb21tZW50LCBpbmRlbnRDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5UGFpcih7IGtleSwgdmFsdWUgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgY29uc3QgeyBhbGxOdWxsVmFsdWVzLCBkb2MsIGluZGVudCwgaW5kZW50U3RlcCwgb3B0aW9uczogeyBjb21tZW50U3RyaW5nLCBpbmRlbnRTZXEsIHNpbXBsZUtleXMgfSB9ID0gY3R4O1xuICAgIGxldCBrZXlDb21tZW50ID0gKGlzTm9kZShrZXkpICYmIGtleS5jb21tZW50KSB8fCBudWxsO1xuICAgIGlmIChzaW1wbGVLZXlzKSB7XG4gICAgICAgIGlmIChrZXlDb21tZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGggc2ltcGxlIGtleXMsIGtleSBub2RlcyBjYW5ub3QgaGF2ZSBjb21tZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0NvbGxlY3Rpb24oa2V5KSB8fCAoIWlzTm9kZShrZXkpICYmIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ1dpdGggc2ltcGxlIGtleXMsIGNvbGxlY3Rpb24gY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgdmFsdWUnO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGV4cGxpY2l0S2V5ID0gIXNpbXBsZUtleXMgJiZcbiAgICAgICAgKCFrZXkgfHxcbiAgICAgICAgICAgIChrZXlDb21tZW50ICYmIHZhbHVlID09IG51bGwgJiYgIWN0eC5pbkZsb3cpIHx8XG4gICAgICAgICAgICBpc0NvbGxlY3Rpb24oa2V5KSB8fFxuICAgICAgICAgICAgKGlzU2NhbGFyKGtleSlcbiAgICAgICAgICAgICAgICA/IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfRk9MREVEIHx8IGtleS50eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTFxuICAgICAgICAgICAgICAgIDogdHlwZW9mIGtleSA9PT0gJ29iamVjdCcpKTtcbiAgICBjdHggPSBPYmplY3QuYXNzaWduKHt9LCBjdHgsIHtcbiAgICAgICAgYWxsTnVsbFZhbHVlczogZmFsc2UsXG4gICAgICAgIGltcGxpY2l0S2V5OiAhZXhwbGljaXRLZXkgJiYgKHNpbXBsZUtleXMgfHwgIWFsbE51bGxWYWx1ZXMpLFxuICAgICAgICBpbmRlbnQ6IGluZGVudCArIGluZGVudFN0ZXBcbiAgICB9KTtcbiAgICBsZXQga2V5Q29tbWVudERvbmUgPSBmYWxzZTtcbiAgICBsZXQgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgbGV0IHN0ciA9IHN0cmluZ2lmeShrZXksIGN0eCwgKCkgPT4gKGtleUNvbW1lbnREb25lID0gdHJ1ZSksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgaWYgKCFleHBsaWNpdEtleSAmJiAhY3R4LmluRmxvdyAmJiBzdHIubGVuZ3RoID4gMTAyNCkge1xuICAgICAgICBpZiAoc2ltcGxlS2V5cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV2l0aCBzaW1wbGUga2V5cywgc2luZ2xlIGxpbmUgc2NhbGFyIG11c3Qgbm90IHNwYW4gbW9yZSB0aGFuIDEwMjQgY2hhcmFjdGVycycpO1xuICAgICAgICBleHBsaWNpdEtleSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjdHguaW5GbG93KSB7XG4gICAgICAgIGlmIChhbGxOdWxsVmFsdWVzIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChrZXlDb21tZW50RG9uZSAmJiBvbkNvbW1lbnQpXG4gICAgICAgICAgICAgICAgb25Db21tZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gc3RyID09PSAnJyA/ICc/JyA6IGV4cGxpY2l0S2V5ID8gYD8gJHtzdHJ9YCA6IHN0cjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICgoYWxsTnVsbFZhbHVlcyAmJiAhc2ltcGxlS2V5cykgfHwgKHZhbHVlID09IG51bGwgJiYgZXhwbGljaXRLZXkpKSB7XG4gICAgICAgIHN0ciA9IGA/ICR7c3RyfWA7XG4gICAgICAgIGlmIChrZXlDb21tZW50ICYmICFrZXlDb21tZW50RG9uZSkge1xuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKVxuICAgICAgICAgICAgb25DaG9tcEtlZXAoKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgaWYgKGtleUNvbW1lbnREb25lKVxuICAgICAgICBrZXlDb21tZW50ID0gbnVsbDtcbiAgICBpZiAoZXhwbGljaXRLZXkpIHtcbiAgICAgICAgaWYgKGtleUNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBjdHguaW5kZW50LCBjb21tZW50U3RyaW5nKGtleUNvbW1lbnQpKTtcbiAgICAgICAgc3RyID0gYD8gJHtzdHJ9XFxuJHtpbmRlbnR9OmA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHIgPSBgJHtzdHJ9OmA7XG4gICAgICAgIGlmIChrZXlDb21tZW50KVxuICAgICAgICAgICAgc3RyICs9IGxpbmVDb21tZW50KHN0ciwgY3R4LmluZGVudCwgY29tbWVudFN0cmluZyhrZXlDb21tZW50KSk7XG4gICAgfVxuICAgIGxldCB2c2IsIHZjYiwgdmFsdWVDb21tZW50O1xuICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIHZzYiA9ICEhdmFsdWUuc3BhY2VCZWZvcmU7XG4gICAgICAgIHZjYiA9IHZhbHVlLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgIHZhbHVlQ29tbWVudCA9IHZhbHVlLmNvbW1lbnQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2c2IgPSBmYWxzZTtcbiAgICAgICAgdmNiID0gbnVsbDtcbiAgICAgICAgdmFsdWVDb21tZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICB2YWx1ZSA9IGRvYy5jcmVhdGVOb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgY3R4LmltcGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgaWYgKCFleHBsaWNpdEtleSAmJiAha2V5Q29tbWVudCAmJiBpc1NjYWxhcih2YWx1ZSkpXG4gICAgICAgIGN0eC5pbmRlbnRBdFN0YXJ0ID0gc3RyLmxlbmd0aCArIDE7XG4gICAgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgaWYgKCFpbmRlbnRTZXEgJiZcbiAgICAgICAgaW5kZW50U3RlcC5sZW5ndGggPj0gMiAmJlxuICAgICAgICAhY3R4LmluRmxvdyAmJlxuICAgICAgICAhZXhwbGljaXRLZXkgJiZcbiAgICAgICAgaXNTZXEodmFsdWUpICYmXG4gICAgICAgICF2YWx1ZS5mbG93ICYmXG4gICAgICAgICF2YWx1ZS50YWcgJiZcbiAgICAgICAgIXZhbHVlLmFuY2hvcikge1xuICAgICAgICAvLyBJZiBpbmRlbnRTZXEgPT09IGZhbHNlLCBjb25zaWRlciAnLSAnIGFzIHBhcnQgb2YgaW5kZW50YXRpb24gd2hlcmUgcG9zc2libGVcbiAgICAgICAgY3R4LmluZGVudCA9IGN0eC5pbmRlbnQuc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICBsZXQgdmFsdWVDb21tZW50RG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IHZhbHVlU3RyID0gc3RyaW5naWZ5KHZhbHVlLCBjdHgsICgpID0+ICh2YWx1ZUNvbW1lbnREb25lID0gdHJ1ZSksICgpID0+IChjaG9tcEtlZXAgPSB0cnVlKSk7XG4gICAgbGV0IHdzID0gJyAnO1xuICAgIGlmIChrZXlDb21tZW50IHx8IHZzYiB8fCB2Y2IpIHtcbiAgICAgICAgd3MgPSB2c2IgPyAnXFxuJyA6ICcnO1xuICAgICAgICBpZiAodmNiKSB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcodmNiKTtcbiAgICAgICAgICAgIHdzICs9IGBcXG4ke2luZGVudENvbW1lbnQoY3MsIGN0eC5pbmRlbnQpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlU3RyID09PSAnJyAmJiAhY3R4LmluRmxvdykge1xuICAgICAgICAgICAgaWYgKHdzID09PSAnXFxuJyAmJiB2YWx1ZUNvbW1lbnQpXG4gICAgICAgICAgICAgICAgd3MgPSAnXFxuXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdzICs9IGBcXG4ke2N0eC5pbmRlbnR9YDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICghZXhwbGljaXRLZXkgJiYgaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgICBjb25zdCB2czAgPSB2YWx1ZVN0clswXTtcbiAgICAgICAgY29uc3QgbmwwID0gdmFsdWVTdHIuaW5kZXhPZignXFxuJyk7XG4gICAgICAgIGNvbnN0IGhhc05ld2xpbmUgPSBubDAgIT09IC0xO1xuICAgICAgICBjb25zdCBmbG93ID0gY3R4LmluRmxvdyA/PyB2YWx1ZS5mbG93ID8/IHZhbHVlLml0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgaWYgKGhhc05ld2xpbmUgfHwgIWZsb3cpIHtcbiAgICAgICAgICAgIGxldCBoYXNQcm9wc0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChoYXNOZXdsaW5lICYmICh2czAgPT09ICcmJyB8fCB2czAgPT09ICchJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3AwID0gdmFsdWVTdHIuaW5kZXhPZignICcpO1xuICAgICAgICAgICAgICAgIGlmICh2czAgPT09ICcmJyAmJlxuICAgICAgICAgICAgICAgICAgICBzcDAgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHNwMCA8IG5sMCAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0cltzcDAgKyAxXSA9PT0gJyEnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNwMCA9IHZhbHVlU3RyLmluZGV4T2YoJyAnLCBzcDAgKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNwMCA9PT0gLTEgfHwgbmwwIDwgc3AwKVxuICAgICAgICAgICAgICAgICAgICBoYXNQcm9wc0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFoYXNQcm9wc0xpbmUpXG4gICAgICAgICAgICAgICAgd3MgPSBgXFxuJHtjdHguaW5kZW50fWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVTdHIgPT09ICcnIHx8IHZhbHVlU3RyWzBdID09PSAnXFxuJykge1xuICAgICAgICB3cyA9ICcnO1xuICAgIH1cbiAgICBzdHIgKz0gd3MgKyB2YWx1ZVN0cjtcbiAgICBpZiAoY3R4LmluRmxvdykge1xuICAgICAgICBpZiAodmFsdWVDb21tZW50RG9uZSAmJiBvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVDb21tZW50ICYmICF2YWx1ZUNvbW1lbnREb25lKSB7XG4gICAgICAgIHN0ciArPSBsaW5lQ29tbWVudChzdHIsIGN0eC5pbmRlbnQsIGNvbW1lbnRTdHJpbmcodmFsdWVDb21tZW50KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNob21wS2VlcCAmJiBvbkNob21wS2VlcCkge1xuICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlQYWlyIH07XG4iLCJmdW5jdGlvbiBkZWJ1Zyhsb2dMZXZlbCwgLi4ubWVzc2FnZXMpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycpXG4gICAgICAgIGNvbnNvbGUubG9nKC4uLm1lc3NhZ2VzKTtcbn1cbmZ1bmN0aW9uIHdhcm4obG9nTGV2ZWwsIHdhcm5pbmcpIHtcbiAgICBpZiAobG9nTGV2ZWwgPT09ICdkZWJ1ZycgfHwgbG9nTGV2ZWwgPT09ICd3YXJuJykge1xuICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBkZWJ1Zywgd2FybiB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIGlzU2VxLCBpc0FsaWFzLCBpc01hcCB9IGZyb20gJy4uLy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbi8vIElmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBtZXJnZSBrZXkgaXMgYSBzaW5nbGUgbWFwcGluZyBub2RlLCBlYWNoIG9mXG4vLyBpdHMga2V5L3ZhbHVlIHBhaXJzIGlzIGluc2VydGVkIGludG8gdGhlIGN1cnJlbnQgbWFwcGluZywgdW5sZXNzIHRoZSBrZXlcbi8vIGFscmVhZHkgZXhpc3RzIGluIGl0LiBJZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXJnZSBrZXkgaXMgYVxuLy8gc2VxdWVuY2UsIHRoZW4gdGhpcyBzZXF1ZW5jZSBpcyBleHBlY3RlZCB0byBjb250YWluIG1hcHBpbmcgbm9kZXMgYW5kIGVhY2hcbi8vIG9mIHRoZXNlIG5vZGVzIGlzIG1lcmdlZCBpbiB0dXJuIGFjY29yZGluZyB0byBpdHMgb3JkZXIgaW4gdGhlIHNlcXVlbmNlLlxuLy8gS2V5cyBpbiBtYXBwaW5nIG5vZGVzIGVhcmxpZXIgaW4gdGhlIHNlcXVlbmNlIG92ZXJyaWRlIGtleXMgc3BlY2lmaWVkIGluXG4vLyBsYXRlciBtYXBwaW5nIG5vZGVzLiAtLSBodHRwOi8veWFtbC5vcmcvdHlwZS9tZXJnZS5odG1sXG5jb25zdCBNRVJHRV9LRVkgPSAnPDwnO1xuY29uc3QgbWVyZ2UgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSBNRVJHRV9LRVkgfHxcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgJiYgdmFsdWUuZGVzY3JpcHRpb24gPT09IE1FUkdFX0tFWSksXG4gICAgZGVmYXVsdDogJ2tleScsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnLFxuICAgIHRlc3Q6IC9ePDwkLyxcbiAgICByZXNvbHZlOiAoKSA9PiBPYmplY3QuYXNzaWduKG5ldyBTY2FsYXIoU3ltYm9sKE1FUkdFX0tFWSkpLCB7XG4gICAgICAgIGFkZFRvSlNNYXA6IGFkZE1lcmdlVG9KU01hcFxuICAgIH0pLFxuICAgIHN0cmluZ2lmeTogKCkgPT4gTUVSR0VfS0VZXG59O1xuY29uc3QgaXNNZXJnZUtleSA9IChjdHgsIGtleSkgPT4gKG1lcmdlLmlkZW50aWZ5KGtleSkgfHxcbiAgICAoaXNTY2FsYXIoa2V5KSAmJlxuICAgICAgICAoIWtleS50eXBlIHx8IGtleS50eXBlID09PSBTY2FsYXIuUExBSU4pICYmXG4gICAgICAgIG1lcmdlLmlkZW50aWZ5KGtleS52YWx1ZSkpKSAmJlxuICAgIGN0eD8uZG9jLnNjaGVtYS50YWdzLnNvbWUodGFnID0+IHRhZy50YWcgPT09IG1lcmdlLnRhZyAmJiB0YWcuZGVmYXVsdCk7XG5mdW5jdGlvbiBhZGRNZXJnZVRvSlNNYXAoY3R4LCBtYXAsIHZhbHVlKSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZUFsaWFzVmFsdWUoY3R4LCB2YWx1ZSk7XG4gICAgaWYgKGlzU2VxKHNvdXJjZSkpXG4gICAgICAgIGZvciAoY29uc3QgaXQgb2Ygc291cmNlLml0ZW1zKVxuICAgICAgICAgICAgbWVyZ2VWYWx1ZShjdHgsIG1hcCwgaXQpO1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSlcbiAgICAgICAgZm9yIChjb25zdCBpdCBvZiBzb3VyY2UpXG4gICAgICAgICAgICBtZXJnZVZhbHVlKGN0eCwgbWFwLCBpdCk7XG4gICAgZWxzZVxuICAgICAgICBtZXJnZVZhbHVlKGN0eCwgbWFwLCBzb3VyY2UpO1xufVxuZnVuY3Rpb24gbWVyZ2VWYWx1ZShjdHgsIG1hcCwgdmFsdWUpIHtcbiAgICBjb25zdCBzb3VyY2UgPSByZXNvbHZlQWxpYXNWYWx1ZShjdHgsIHZhbHVlKTtcbiAgICBpZiAoIWlzTWFwKHNvdXJjZSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWVyZ2Ugc291cmNlcyBtdXN0IGJlIG1hcHMgb3IgbWFwIGFsaWFzZXMnKTtcbiAgICBjb25zdCBzcmNNYXAgPSBzb3VyY2UudG9KU09OKG51bGwsIGN0eCwgTWFwKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzcmNNYXApIHtcbiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgaWYgKCFtYXAuaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtYXAgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIG1hcC5hZGQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1hcCwga2V5KSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG1hcCwga2V5LCB7XG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5mdW5jdGlvbiByZXNvbHZlQWxpYXNWYWx1ZShjdHgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGN0eCAmJiBpc0FsaWFzKHZhbHVlKSA/IHZhbHVlLnJlc29sdmUoY3R4LmRvYywgY3R4KSA6IHZhbHVlO1xufVxuXG5leHBvcnQgeyBhZGRNZXJnZVRvSlNNYXAsIGlzTWVyZ2VLZXksIG1lcmdlIH07XG4iLCJpbXBvcnQgeyB3YXJuIH0gZnJvbSAnLi4vbG9nLmpzJztcbmltcG9ydCB7IGlzTWVyZ2VLZXksIGFkZE1lcmdlVG9KU01hcCB9IGZyb20gJy4uL3NjaGVtYS95YW1sLTEuMS9tZXJnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJpbmdpZnlDb250ZXh0IH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHRvSlMgfSBmcm9tICcuL3RvSlMuanMnO1xuXG5mdW5jdGlvbiBhZGRQYWlyVG9KU01hcChjdHgsIG1hcCwgeyBrZXksIHZhbHVlIH0pIHtcbiAgICBpZiAoaXNOb2RlKGtleSkgJiYga2V5LmFkZFRvSlNNYXApXG4gICAgICAgIGtleS5hZGRUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSk7XG4gICAgLy8gVE9ETzogU2hvdWxkIGRyb3AgdGhpcyBzcGVjaWFsIGNhc2UgZm9yIGJhcmUgPDwgaGFuZGxpbmdcbiAgICBlbHNlIGlmIChpc01lcmdlS2V5KGN0eCwga2V5KSlcbiAgICAgICAgYWRkTWVyZ2VUb0pTTWFwKGN0eCwgbWFwLCB2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGpzS2V5ID0gdG9KUyhrZXksICcnLCBjdHgpO1xuICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBtYXAuc2V0KGpzS2V5LCB0b0pTKHZhbHVlLCBqc0tleSwgY3R4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFwIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICBtYXAuYWRkKGpzS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0tleSA9IHN0cmluZ2lmeUtleShrZXksIGpzS2V5LCBjdHgpO1xuICAgICAgICAgICAgY29uc3QganNWYWx1ZSA9IHRvSlModmFsdWUsIHN0cmluZ0tleSwgY3R4KTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdLZXkgaW4gbWFwKVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtYXAsIHN0cmluZ0tleSwge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZToganNWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1hcFtzdHJpbmdLZXldID0ganNWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5S2V5KGtleSwganNLZXksIGN0eCkge1xuICAgIGlmIChqc0tleSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmdcbiAgICBpZiAodHlwZW9mIGpzS2V5ICE9PSAnb2JqZWN0JylcbiAgICAgICAgcmV0dXJuIFN0cmluZyhqc0tleSk7XG4gICAgaWYgKGlzTm9kZShrZXkpICYmIGN0eD8uZG9jKSB7XG4gICAgICAgIGNvbnN0IHN0ckN0eCA9IGNyZWF0ZVN0cmluZ2lmeUNvbnRleHQoY3R4LmRvYywge30pO1xuICAgICAgICBzdHJDdHguYW5jaG9ycyA9IG5ldyBTZXQoKTtcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGN0eC5hbmNob3JzLmtleXMoKSlcbiAgICAgICAgICAgIHN0ckN0eC5hbmNob3JzLmFkZChub2RlLmFuY2hvcik7XG4gICAgICAgIHN0ckN0eC5pbkZsb3cgPSB0cnVlO1xuICAgICAgICBzdHJDdHguaW5TdHJpbmdpZnlLZXkgPSB0cnVlO1xuICAgICAgICBjb25zdCBzdHJLZXkgPSBrZXkudG9TdHJpbmcoc3RyQ3R4KTtcbiAgICAgICAgaWYgKCFjdHgubWFwS2V5V2FybmVkKSB7XG4gICAgICAgICAgICBsZXQganNvblN0ciA9IEpTT04uc3RyaW5naWZ5KHN0cktleSk7XG4gICAgICAgICAgICBpZiAoanNvblN0ci5sZW5ndGggPiA0MClcbiAgICAgICAgICAgICAgICBqc29uU3RyID0ganNvblN0ci5zdWJzdHJpbmcoMCwgMzYpICsgJy4uLlwiJztcbiAgICAgICAgICAgIHdhcm4oY3R4LmRvYy5vcHRpb25zLmxvZ0xldmVsLCBgS2V5cyB3aXRoIGNvbGxlY3Rpb24gdmFsdWVzIHdpbGwgYmUgc3RyaW5naWZpZWQgZHVlIHRvIEpTIE9iamVjdCByZXN0cmljdGlvbnM6ICR7anNvblN0cn0uIFNldCBtYXBBc01hcDogdHJ1ZSB0byB1c2Ugb2JqZWN0IGtleXMuYCk7XG4gICAgICAgICAgICBjdHgubWFwS2V5V2FybmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyS2V5O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNLZXkpO1xufVxuXG5leHBvcnQgeyBhZGRQYWlyVG9KU01hcCB9O1xuIiwiaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4uL2RvYy9jcmVhdGVOb2RlLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVBhaXIgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5UGFpci5qcyc7XG5pbXBvcnQgeyBhZGRQYWlyVG9KU01hcCB9IGZyb20gJy4vYWRkUGFpclRvSlNNYXAuanMnO1xuaW1wb3J0IHsgTk9ERV9UWVBFLCBQQUlSLCBpc05vZGUgfSBmcm9tICcuL2lkZW50aXR5LmpzJztcblxuZnVuY3Rpb24gY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpIHtcbiAgICBjb25zdCBrID0gY3JlYXRlTm9kZShrZXksIHVuZGVmaW5lZCwgY3R4KTtcbiAgICBjb25zdCB2ID0gY3JlYXRlTm9kZSh2YWx1ZSwgdW5kZWZpbmVkLCBjdHgpO1xuICAgIHJldHVybiBuZXcgUGFpcihrLCB2KTtcbn1cbmNsYXNzIFBhaXIge1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUgPSBudWxsKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBOT0RFX1RZUEUsIHsgdmFsdWU6IFBBSVIgfSk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGNsb25lKHNjaGVtYSkge1xuICAgICAgICBsZXQgeyBrZXksIHZhbHVlIH0gPSB0aGlzO1xuICAgICAgICBpZiAoaXNOb2RlKGtleSkpXG4gICAgICAgICAgICBrZXkgPSBrZXkuY2xvbmUoc2NoZW1hKTtcbiAgICAgICAgaWYgKGlzTm9kZSh2YWx1ZSkpXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmNsb25lKHNjaGVtYSk7XG4gICAgICAgIHJldHVybiBuZXcgUGFpcihrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgdG9KU09OKF8sIGN0eCkge1xuICAgICAgICBjb25zdCBwYWlyID0gY3R4Py5tYXBBc01hcCA/IG5ldyBNYXAoKSA6IHt9O1xuICAgICAgICByZXR1cm4gYWRkUGFpclRvSlNNYXAoY3R4LCBwYWlyLCB0aGlzKTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIHJldHVybiBjdHg/LmRvY1xuICAgICAgICAgICAgPyBzdHJpbmdpZnlQYWlyKHRoaXMsIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcClcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBQYWlyLCBjcmVhdGVQYWlyIH07XG4iLCJpbXBvcnQgeyBpc05vZGUsIGlzUGFpciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeSB9IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCB7IGxpbmVDb21tZW50LCBpbmRlbnRDb21tZW50IH0gZnJvbSAnLi9zdHJpbmdpZnlDb21tZW50LmpzJztcblxuZnVuY3Rpb24gc3RyaW5naWZ5Q29sbGVjdGlvbihjb2xsZWN0aW9uLCBjdHgsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmbG93ID0gY3R4LmluRmxvdyA/PyBjb2xsZWN0aW9uLmZsb3c7XG4gICAgY29uc3Qgc3RyaW5naWZ5ID0gZmxvdyA/IHN0cmluZ2lmeUZsb3dDb2xsZWN0aW9uIDogc3RyaW5naWZ5QmxvY2tDb2xsZWN0aW9uO1xuICAgIHJldHVybiBzdHJpbmdpZnkoY29sbGVjdGlvbiwgY3R4LCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeUJsb2NrQ29sbGVjdGlvbih7IGNvbW1lbnQsIGl0ZW1zIH0sIGN0eCwgeyBibG9ja0l0ZW1QcmVmaXgsIGZsb3dDaGFycywgaXRlbUluZGVudCwgb25DaG9tcEtlZXAsIG9uQ29tbWVudCB9KSB7XG4gICAgY29uc3QgeyBpbmRlbnQsIG9wdGlvbnM6IHsgY29tbWVudFN0cmluZyB9IH0gPSBjdHg7XG4gICAgY29uc3QgaXRlbUN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwgeyBpbmRlbnQ6IGl0ZW1JbmRlbnQsIHR5cGU6IG51bGwgfSk7XG4gICAgbGV0IGNob21wS2VlcCA9IGZhbHNlOyAvLyBmbGFnIGZvciB0aGUgcHJlY2VkaW5nIG5vZGUncyBzdGF0dXNcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBsZXQgY29tbWVudCA9IG51bGw7XG4gICAgICAgIGlmIChpc05vZGUoaXRlbSkpIHtcbiAgICAgICAgICAgIGlmICghY2hvbXBLZWVwICYmIGl0ZW0uc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGl0ZW0uY29tbWVudEJlZm9yZSwgY2hvbXBLZWVwKTtcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGl0ZW0uY29tbWVudDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BhaXIoaXRlbSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlrID0gaXNOb2RlKGl0ZW0ua2V5KSA/IGl0ZW0ua2V5IDogbnVsbDtcbiAgICAgICAgICAgIGlmIChpaykge1xuICAgICAgICAgICAgICAgIGlmICghY2hvbXBLZWVwICYmIGlrLnNwYWNlQmVmb3JlKVxuICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgICAgICBhZGRDb21tZW50QmVmb3JlKGN0eCwgbGluZXMsIGlrLmNvbW1lbnRCZWZvcmUsIGNob21wS2VlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBzdHIgPSBzdHJpbmdpZnkoaXRlbSwgaXRlbUN0eCwgKCkgPT4gKGNvbW1lbnQgPSBudWxsKSwgKCkgPT4gKGNob21wS2VlcCA9IHRydWUpKTtcbiAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBpdGVtSW5kZW50LCBjb21tZW50U3RyaW5nKGNvbW1lbnQpKTtcbiAgICAgICAgaWYgKGNob21wS2VlcCAmJiBjb21tZW50KVxuICAgICAgICAgICAgY2hvbXBLZWVwID0gZmFsc2U7XG4gICAgICAgIGxpbmVzLnB1c2goYmxvY2tJdGVtUHJlZml4ICsgc3RyKTtcbiAgICB9XG4gICAgbGV0IHN0cjtcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0ciA9IGZsb3dDaGFycy5zdGFydCArIGZsb3dDaGFycy5lbmQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBzdHIgPSBsaW5lc1swXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgICAgICAgc3RyICs9IGxpbmUgPyBgXFxuJHtpbmRlbnR9JHtsaW5lfWAgOiAnXFxuJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBzdHIgKz0gJ1xcbicgKyBpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoY29tbWVudCksIGluZGVudCk7XG4gICAgICAgIGlmIChvbkNvbW1lbnQpXG4gICAgICAgICAgICBvbkNvbW1lbnQoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2hvbXBLZWVwICYmIG9uQ2hvbXBLZWVwKVxuICAgICAgICBvbkNob21wS2VlcCgpO1xuICAgIHJldHVybiBzdHI7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlGbG93Q29sbGVjdGlvbih7IGl0ZW1zIH0sIGN0eCwgeyBmbG93Q2hhcnMsIGl0ZW1JbmRlbnQgfSkge1xuICAgIGNvbnN0IHsgaW5kZW50LCBpbmRlbnRTdGVwLCBmbG93Q29sbGVjdGlvblBhZGRpbmc6IGZjUGFkZGluZywgb3B0aW9uczogeyBjb21tZW50U3RyaW5nIH0gfSA9IGN0eDtcbiAgICBpdGVtSW5kZW50ICs9IGluZGVudFN0ZXA7XG4gICAgY29uc3QgaXRlbUN0eCA9IE9iamVjdC5hc3NpZ24oe30sIGN0eCwge1xuICAgICAgICBpbmRlbnQ6IGl0ZW1JbmRlbnQsXG4gICAgICAgIGluRmxvdzogdHJ1ZSxcbiAgICAgICAgdHlwZTogbnVsbFxuICAgIH0pO1xuICAgIGxldCByZXFOZXdsaW5lID0gZmFsc2U7XG4gICAgbGV0IGxpbmVzQXRWYWx1ZSA9IDA7XG4gICAgY29uc3QgbGluZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSBudWxsO1xuICAgICAgICBpZiAoaXNOb2RlKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAoaXRlbS5zcGFjZUJlZm9yZSlcbiAgICAgICAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaXRlbS5jb21tZW50QmVmb3JlLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoaXRlbS5jb21tZW50KVxuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBpdGVtLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNQYWlyKGl0ZW0pKSB7XG4gICAgICAgICAgICBjb25zdCBpayA9IGlzTm9kZShpdGVtLmtleSkgPyBpdGVtLmtleSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaWspIHtcbiAgICAgICAgICAgICAgICBpZiAoaWsuc3BhY2VCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgICAgIGFkZENvbW1lbnRCZWZvcmUoY3R4LCBsaW5lcywgaWsuY29tbWVudEJlZm9yZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChpay5jb21tZW50KVxuICAgICAgICAgICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGl2ID0gaXNOb2RlKGl0ZW0udmFsdWUpID8gaXRlbS52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICBpZiAoaXYpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXYuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGl2LmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKGl2LmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHJlcU5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS52YWx1ZSA9PSBudWxsICYmIGlrPy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IGlrLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICByZXFOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgbGV0IHN0ciA9IHN0cmluZ2lmeShpdGVtLCBpdGVtQ3R4LCAoKSA9PiAoY29tbWVudCA9IG51bGwpKTtcbiAgICAgICAgcmVxTmV3bGluZSB8fCAocmVxTmV3bGluZSA9IGxpbmVzLmxlbmd0aCA+IGxpbmVzQXRWYWx1ZSB8fCBzdHIuaW5jbHVkZXMoJ1xcbicpKTtcbiAgICAgICAgaWYgKGkgPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICBzdHIgKz0gJywnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN0eC5vcHRpb25zLnRyYWlsaW5nQ29tbWEpIHtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy5saW5lV2lkdGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVxTmV3bGluZSB8fCAocmVxTmV3bGluZSA9IGxpbmVzLnJlZHVjZSgoc3VtLCBsaW5lKSA9PiBzdW0gKyBsaW5lLmxlbmd0aCArIDIsIDIpICtcbiAgICAgICAgICAgICAgICAgICAgKHN0ci5sZW5ndGggKyAyKSA+XG4gICAgICAgICAgICAgICAgICAgIGN0eC5vcHRpb25zLmxpbmVXaWR0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxTmV3bGluZSkge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnLCc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICBzdHIgKz0gbGluZUNvbW1lbnQoc3RyLCBpdGVtSW5kZW50LCBjb21tZW50U3RyaW5nKGNvbW1lbnQpKTtcbiAgICAgICAgbGluZXMucHVzaChzdHIpO1xuICAgICAgICBsaW5lc0F0VmFsdWUgPSBsaW5lcy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gZmxvd0NoYXJzO1xuICAgIGlmIChsaW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFyZXFOZXdsaW5lKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBsaW5lcy5yZWR1Y2UoKHN1bSwgbGluZSkgPT4gc3VtICsgbGluZS5sZW5ndGggKyAyLCAyKTtcbiAgICAgICAgICAgIHJlcU5ld2xpbmUgPSBjdHgub3B0aW9ucy5saW5lV2lkdGggPiAwICYmIGxlbiA+IGN0eC5vcHRpb25zLmxpbmVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxTmV3bGluZSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHN0YXJ0O1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKVxuICAgICAgICAgICAgICAgIHN0ciArPSBsaW5lID8gYFxcbiR7aW5kZW50U3RlcH0ke2luZGVudH0ke2xpbmV9YCA6ICdcXG4nO1xuICAgICAgICAgICAgcmV0dXJuIGAke3N0cn1cXG4ke2luZGVudH0ke2VuZH1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke3N0YXJ0fSR7ZmNQYWRkaW5nfSR7bGluZXMuam9pbignICcpfSR7ZmNQYWRkaW5nfSR7ZW5kfWA7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBhZGRDb21tZW50QmVmb3JlKHsgaW5kZW50LCBvcHRpb25zOiB7IGNvbW1lbnRTdHJpbmcgfSB9LCBsaW5lcywgY29tbWVudCwgY2hvbXBLZWVwKSB7XG4gICAgaWYgKGNvbW1lbnQgJiYgY2hvbXBLZWVwKVxuICAgICAgICBjb21tZW50ID0gY29tbWVudC5yZXBsYWNlKC9eXFxuKy8sICcnKTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBjb25zdCBpYyA9IGluZGVudENvbW1lbnQoY29tbWVudFN0cmluZyhjb21tZW50KSwgaW5kZW50KTtcbiAgICAgICAgbGluZXMucHVzaChpYy50cmltU3RhcnQoKSk7IC8vIEF2b2lkIGRvdWJsZSBpbmRlbnQgb24gZmlyc3QgbGluZVxuICAgIH1cbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5Q29sbGVjdGlvbiB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlDb2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IGFkZFBhaXJUb0pTTWFwIH0gZnJvbSAnLi9hZGRQYWlyVG9KU01hcC5qcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uIH0gZnJvbSAnLi9Db2xsZWN0aW9uLmpzJztcbmltcG9ydCB7IE1BUCwgaXNQYWlyLCBpc1NjYWxhciB9IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9IGZyb20gJy4vUGFpci5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhclZhbHVlIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuXG5mdW5jdGlvbiBmaW5kUGFpcihpdGVtcywga2V5KSB7XG4gICAgY29uc3QgayA9IGlzU2NhbGFyKGtleSkgPyBrZXkudmFsdWUgOiBrZXk7XG4gICAgZm9yIChjb25zdCBpdCBvZiBpdGVtcykge1xuICAgICAgICBpZiAoaXNQYWlyKGl0KSkge1xuICAgICAgICAgICAgaWYgKGl0LmtleSA9PT0ga2V5IHx8IGl0LmtleSA9PT0gaylcbiAgICAgICAgICAgICAgICByZXR1cm4gaXQ7XG4gICAgICAgICAgICBpZiAoaXNTY2FsYXIoaXQua2V5KSAmJiBpdC5rZXkudmFsdWUgPT09IGspXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5jbGFzcyBZQU1MTWFwIGV4dGVuZHMgQ29sbGVjdGlvbiB7XG4gICAgc3RhdGljIGdldCB0YWdOYW1lKCkge1xuICAgICAgICByZXR1cm4gJ3RhZzp5YW1sLm9yZywyMDAyOm1hcCc7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihNQVAsIHNjaGVtYSk7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIGNvbGxlY3Rpb24gcGFyc2luZyBtZXRob2QgdGhhdCBjYW4gYmUgZXh0ZW5kZWRcbiAgICAgKiB0byBvdGhlciBub2RlIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gWUFNTE1hcFxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tKHNjaGVtYSwgb2JqLCBjdHgpIHtcbiAgICAgICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkLCByZXBsYWNlciB9ID0gY3R4O1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgdGhpcyhzY2hlbWEpO1xuICAgICAgICBjb25zdCBhZGQgPSAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VyLmNhbGwob2JqLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZXIpICYmICFyZXBsYWNlci5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IGtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb2JqKVxuICAgICAgICAgICAgICAgIGFkZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChvYmogJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpXG4gICAgICAgICAgICAgICAgYWRkKGtleSwgb2JqW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnNvcnRNYXBFbnRyaWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBtYXAuaXRlbXMuc29ydChzY2hlbWEuc29ydE1hcEVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZHMgYSB2YWx1ZSB0byB0aGUgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvdmVyd3JpdGUgLSBJZiBub3Qgc2V0IGB0cnVlYCwgdXNpbmcgYSBrZXkgdGhhdCBpcyBhbHJlYWR5IGluIHRoZVxuICAgICAqICAgY29sbGVjdGlvbiB3aWxsIHRocm93LiBPdGhlcndpc2UsIG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIHZhbHVlLlxuICAgICAqL1xuICAgIGFkZChwYWlyLCBvdmVyd3JpdGUpIHtcbiAgICAgICAgbGV0IF9wYWlyO1xuICAgICAgICBpZiAoaXNQYWlyKHBhaXIpKVxuICAgICAgICAgICAgX3BhaXIgPSBwYWlyO1xuICAgICAgICBlbHNlIGlmICghcGFpciB8fCB0eXBlb2YgcGFpciAhPT0gJ29iamVjdCcgfHwgISgna2V5JyBpbiBwYWlyKSkge1xuICAgICAgICAgICAgLy8gSW4gVHlwZVNjcmlwdCwgdGhpcyBuZXZlciBoYXBwZW5zLlxuICAgICAgICAgICAgX3BhaXIgPSBuZXcgUGFpcihwYWlyLCBwYWlyPy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgX3BhaXIgPSBuZXcgUGFpcihwYWlyLmtleSwgcGFpci52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBfcGFpci5rZXkpO1xuICAgICAgICBjb25zdCBzb3J0RW50cmllcyA9IHRoaXMuc2NoZW1hPy5zb3J0TWFwRW50cmllcztcbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGlmICghb3ZlcndyaXRlKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgS2V5ICR7X3BhaXIua2V5fSBhbHJlYWR5IHNldGApO1xuICAgICAgICAgICAgLy8gRm9yIHNjYWxhcnMsIGtlZXAgdGhlIG9sZCBub2RlICYgaXRzIGNvbW1lbnRzIGFuZCBhbmNob3JzXG4gICAgICAgICAgICBpZiAoaXNTY2FsYXIocHJldi52YWx1ZSkgJiYgaXNTY2FsYXJWYWx1ZShfcGFpci52YWx1ZSkpXG4gICAgICAgICAgICAgICAgcHJldi52YWx1ZS52YWx1ZSA9IF9wYWlyLnZhbHVlO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHByZXYudmFsdWUgPSBfcGFpci52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzb3J0RW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gc29ydEVudHJpZXMoX3BhaXIsIGl0ZW0pIDwgMCk7XG4gICAgICAgICAgICBpZiAoaSA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKF9wYWlyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnNwbGljZShpLCAwLCBfcGFpcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goX3BhaXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBpZiAoIWl0KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBkZWwgPSB0aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YoaXQpLCAxKTtcbiAgICAgICAgcmV0dXJuIGRlbC5sZW5ndGggPiAwO1xuICAgIH1cbiAgICBnZXQoa2V5LCBrZWVwU2NhbGFyKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGl0Py52YWx1ZTtcbiAgICAgICAgcmV0dXJuICgha2VlcFNjYWxhciAmJiBpc1NjYWxhcihub2RlKSA/IG5vZGUudmFsdWUgOiBub2RlKSA/PyB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgcmV0dXJuICEhZmluZFBhaXIodGhpcy5pdGVtcywga2V5KTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5hZGQobmV3IFBhaXIoa2V5LCB2YWx1ZSksIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY3R4IC0gQ29udmVyc2lvbiBjb250ZXh0LCBvcmlnaW5hbGx5IHNldCBpbiBEb2N1bWVudCN0b0pTKClcbiAgICAgKiBAcGFyYW0ge0NsYXNzfSBUeXBlIC0gSWYgc2V0LCBmb3JjZXMgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gdHlwZVxuICAgICAqIEByZXR1cm5zIEluc3RhbmNlIG9mIFR5cGUsIE1hcCwgb3IgT2JqZWN0XG4gICAgICovXG4gICAgdG9KU09OKF8sIGN0eCwgVHlwZSkge1xuICAgICAgICBjb25zdCBtYXAgPSBUeXBlID8gbmV3IFR5cGUoKSA6IGN0eD8ubWFwQXNNYXAgPyBuZXcgTWFwKCkgOiB7fTtcbiAgICAgICAgaWYgKGN0eD8ub25DcmVhdGUpXG4gICAgICAgICAgICBjdHgub25DcmVhdGUobWFwKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpXG4gICAgICAgICAgICBhZGRQYWlyVG9KU01hcChjdHgsIG1hcCwgaXRlbSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIHRvU3RyaW5nKGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBpZiAoIWN0eClcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmICghaXNQYWlyKGl0ZW0pKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWFwIGl0ZW1zIG11c3QgYWxsIGJlIHBhaXJzOyBmb3VuZCAke0pTT04uc3RyaW5naWZ5KGl0ZW0pfSBpbnN0ZWFkYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjdHguYWxsTnVsbFZhbHVlcyAmJiB0aGlzLmhhc0FsbE51bGxWYWx1ZXMoZmFsc2UpKVxuICAgICAgICAgICAgY3R4ID0gT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGFsbE51bGxWYWx1ZXM6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlDb2xsZWN0aW9uKHRoaXMsIGN0eCwge1xuICAgICAgICAgICAgYmxvY2tJdGVtUHJlZml4OiAnJyxcbiAgICAgICAgICAgIGZsb3dDaGFyczogeyBzdGFydDogJ3snLCBlbmQ6ICd9JyB9LFxuICAgICAgICAgICAgaXRlbUluZGVudDogY3R4LmluZGVudCB8fCAnJyxcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwLFxuICAgICAgICAgICAgb25Db21tZW50XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgWUFNTE1hcCwgZmluZFBhaXIgfTtcbiIsImltcG9ydCB7IGlzTWFwIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxNYXAuanMnO1xuXG5jb25zdCBtYXAgPSB7XG4gICAgY29sbGVjdGlvbjogJ21hcCcsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICBub2RlQ2xhc3M6IFlBTUxNYXAsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6bWFwJyxcbiAgICByZXNvbHZlKG1hcCwgb25FcnJvcikge1xuICAgICAgICBpZiAoIWlzTWFwKG1hcCkpXG4gICAgICAgICAgICBvbkVycm9yKCdFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBvYmosIGN0eCkgPT4gWUFNTE1hcC5mcm9tKHNjaGVtYSwgb2JqLCBjdHgpXG59O1xuXG5leHBvcnQgeyBtYXAgfTtcbiIsImltcG9ydCB7IGNyZWF0ZU5vZGUgfSBmcm9tICcuLi9kb2MvY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlDb2xsZWN0aW9uIH0gZnJvbSAnLi4vc3RyaW5naWZ5L3N0cmluZ2lmeUNvbGxlY3Rpb24uanMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbiB9IGZyb20gJy4vQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBTRVEsIGlzU2NhbGFyIH0gZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBpc1NjYWxhclZhbHVlIH0gZnJvbSAnLi9TY2FsYXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4vdG9KUy5qcyc7XG5cbmNsYXNzIFlBTUxTZXEgZXh0ZW5kcyBDb2xsZWN0aW9uIHtcbiAgICBzdGF0aWMgZ2V0IHRhZ05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGFnOnlhbWwub3JnLDIwMDI6c2VxJztcbiAgICB9XG4gICAgY29uc3RydWN0b3Ioc2NoZW1hKSB7XG4gICAgICAgIHN1cGVyKFNFUSwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIH1cbiAgICBhZGQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBga2V5YCBtdXN0IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyIGZvciB0aGlzIHRvIHN1Y2NlZWQuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQuXG4gICAgICovXG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGRlbCA9IHRoaXMuaXRlbXMuc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgIHJldHVybiBkZWwubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgZ2V0KGtleSwga2VlcFNjYWxhcikge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBpdCA9IHRoaXMuaXRlbXNbaWR4XTtcbiAgICAgICAgcmV0dXJuICFrZWVwU2NhbGFyICYmIGlzU2NhbGFyKGl0KSA/IGl0LnZhbHVlIDogaXQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29sbGVjdGlvbiBpbmNsdWRlcyBhIHZhbHVlIHdpdGggdGhlIGtleSBga2V5YC5cbiAgICAgKlxuICAgICAqIGBrZXlgIG11c3QgY29udGFpbiBhIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgZm9yIHRoaXMgdG8gc3VjY2VlZC5cbiAgICAgKiBJdCBtYXkgYmUgd3JhcHBlZCBpbiBhIGBTY2FsYXJgLlxuICAgICAqL1xuICAgIGhhcyhrZXkpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gYXNJdGVtSW5kZXgoa2V5KTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpZHggPT09ICdudW1iZXInICYmIGlkeCA8IHRoaXMuaXRlbXMubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhpcyBjb2xsZWN0aW9uLiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKlxuICAgICAqIElmIGBrZXlgIGRvZXMgbm90IGNvbnRhaW4gYSByZXByZXNlbnRhdGlvbiBvZiBhbiBpbnRlZ2VyLCB0aGlzIHdpbGwgdGhyb3cuXG4gICAgICogSXQgbWF5IGJlIHdyYXBwZWQgaW4gYSBgU2NhbGFyYC5cbiAgICAgKi9cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBpZHggPSBhc0l0ZW1JbmRleChrZXkpO1xuICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdmFsaWQgaW5kZXgsIG5vdCAke2tleX0uYCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSB0aGlzLml0ZW1zW2lkeF07XG4gICAgICAgIGlmIChpc1NjYWxhcihwcmV2KSAmJiBpc1NjYWxhclZhbHVlKHZhbHVlKSlcbiAgICAgICAgICAgIHByZXYudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7XG4gICAgfVxuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgY29uc3Qgc2VxID0gW107XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKHNlcSk7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuaXRlbXMpXG4gICAgICAgICAgICBzZXEucHVzaCh0b0pTKGl0ZW0sIFN0cmluZyhpKyspLCBjdHgpKTtcbiAgICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG4gICAgdG9TdHJpbmcoY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghY3R4KVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xuICAgICAgICByZXR1cm4gc3RyaW5naWZ5Q29sbGVjdGlvbih0aGlzLCBjdHgsIHtcbiAgICAgICAgICAgIGJsb2NrSXRlbVByZWZpeDogJy0gJyxcbiAgICAgICAgICAgIGZsb3dDaGFyczogeyBzdGFydDogJ1snLCBlbmQ6ICddJyB9LFxuICAgICAgICAgICAgaXRlbUluZGVudDogKGN0eC5pbmRlbnQgfHwgJycpICsgJyAgJyxcbiAgICAgICAgICAgIG9uQ2hvbXBLZWVwLFxuICAgICAgICAgICAgb25Db21tZW50XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIG9iaiwgY3R4KSB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZXIgfSA9IGN0eDtcbiAgICAgICAgY29uc3Qgc2VxID0gbmV3IHRoaXMoc2NoZW1hKTtcbiAgICAgICAgaWYgKG9iaiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KG9iaikpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIG9iaikge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwbGFjZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gb2JqIGluc3RhbmNlb2YgU2V0ID8gaXQgOiBTdHJpbmcoaSsrKTtcbiAgICAgICAgICAgICAgICAgICAgaXQgPSByZXBsYWNlci5jYWxsKG9iaiwga2V5LCBpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKGNyZWF0ZU5vZGUoaXQsIHVuZGVmaW5lZCwgY3R4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc0l0ZW1JbmRleChrZXkpIHtcbiAgICBsZXQgaWR4ID0gaXNTY2FsYXIoa2V5KSA/IGtleS52YWx1ZSA6IGtleTtcbiAgICBpZiAoaWR4ICYmIHR5cGVvZiBpZHggPT09ICdzdHJpbmcnKVxuICAgICAgICBpZHggPSBOdW1iZXIoaWR4KTtcbiAgICByZXR1cm4gdHlwZW9mIGlkeCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzSW50ZWdlcihpZHgpICYmIGlkeCA+PSAwXG4gICAgICAgID8gaWR4XG4gICAgICAgIDogbnVsbDtcbn1cblxuZXhwb3J0IHsgWUFNTFNlcSB9O1xuIiwiaW1wb3J0IHsgaXNTZXEgfSBmcm9tICcuLi8uLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5cbmNvbnN0IHNlcSA9IHtcbiAgICBjb2xsZWN0aW9uOiAnc2VxJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIG5vZGVDbGFzczogWUFNTFNlcSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXEnLFxuICAgIHJlc29sdmUoc2VxLCBvbkVycm9yKSB7XG4gICAgICAgIGlmICghaXNTZXEoc2VxKSlcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnJyk7XG4gICAgICAgIHJldHVybiBzZXE7XG4gICAgfSxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBvYmosIGN0eCkgPT4gWUFNTFNlcS5mcm9tKHNjaGVtYSwgb2JqLCBjdHgpXG59O1xuXG5leHBvcnQgeyBzZXEgfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMnO1xuXG5jb25zdCBzdHJpbmcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICAgIHJlc29sdmU6IHN0ciA9PiBzdHIsXG4gICAgc3RyaW5naWZ5KGl0ZW0sIGN0eCwgb25Db21tZW50LCBvbkNob21wS2VlcCkge1xuICAgICAgICBjdHggPSBPYmplY3QuYXNzaWduKHsgYWN0dWFsU3RyaW5nOiB0cnVlIH0sIGN0eCk7XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlTdHJpbmcoaXRlbSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBzdHJpbmcgfTtcbiIsImltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uLy4uL25vZGVzL1NjYWxhci5qcyc7XG5cbmNvbnN0IG51bGxUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09IG51bGwsXG4gICAgY3JlYXRlTm9kZTogKCkgPT4gbmV3IFNjYWxhcihudWxsKSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLFxuICAgIHRlc3Q6IC9eKD86fnxbTm5ddWxsfE5VTEwpPyQvLFxuICAgIHJlc29sdmU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgc3RyaW5naWZ5OiAoeyBzb3VyY2UgfSwgY3R4KSA9PiB0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJyAmJiBudWxsVGFnLnRlc3QudGVzdChzb3VyY2UpXG4gICAgICAgID8gc291cmNlXG4gICAgICAgIDogY3R4Lm9wdGlvbnMubnVsbFN0clxufTtcblxuZXhwb3J0IHsgbnVsbFRhZyB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcblxuY29uc3QgYm9vbFRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpib29sJyxcbiAgICB0ZXN0OiAvXig/OltUdF1ydWV8VFJVRXxbRmZdYWxzZXxGQUxTRSkkLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gbmV3IFNjYWxhcihzdHJbMF0gPT09ICd0JyB8fCBzdHJbMF0gPT09ICdUJyksXG4gICAgc3RyaW5naWZ5KHsgc291cmNlLCB2YWx1ZSB9LCBjdHgpIHtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBib29sVGFnLnRlc3QudGVzdChzb3VyY2UpKSB7XG4gICAgICAgICAgICBjb25zdCBzdiA9IHNvdXJjZVswXSA9PT0gJ3QnIHx8IHNvdXJjZVswXSA9PT0gJ1QnO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBzdilcbiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IGN0eC5vcHRpb25zLnRydWVTdHIgOiBjdHgub3B0aW9ucy5mYWxzZVN0cjtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBib29sVGFnIH07XG4iLCJmdW5jdGlvbiBzdHJpbmdpZnlOdW1iZXIoeyBmb3JtYXQsIG1pbkZyYWN0aW9uRGlnaXRzLCB0YWcsIHZhbHVlIH0pIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50JylcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgY29uc3QgbnVtID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIWlzRmluaXRlKG51bSkpXG4gICAgICAgIHJldHVybiBpc05hTihudW0pID8gJy5uYW4nIDogbnVtIDwgMCA/ICctLmluZicgOiAnLmluZic7XG4gICAgbGV0IG4gPSBPYmplY3QuaXModmFsdWUsIC0wKSA/ICctMCcgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKCFmb3JtYXQgJiZcbiAgICAgICAgbWluRnJhY3Rpb25EaWdpdHMgJiZcbiAgICAgICAgKCF0YWcgfHwgdGFnID09PSAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnKSAmJlxuICAgICAgICAvXi0/XFxkLy50ZXN0KG4pICYmXG4gICAgICAgICFuLmluY2x1ZGVzKCdlJykpIHtcbiAgICAgICAgbGV0IGkgPSBuLmluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgICBpID0gbi5sZW5ndGg7XG4gICAgICAgICAgICBuICs9ICcuJztcbiAgICAgICAgfVxuICAgICAgICBsZXQgZCA9IG1pbkZyYWN0aW9uRGlnaXRzIC0gKG4ubGVuZ3RoIC0gaSAtIDEpO1xuICAgICAgICB3aGlsZSAoZC0tID4gMClcbiAgICAgICAgICAgIG4gKz0gJzAnO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn1cblxuZXhwb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eKD86Wy0rXT9cXC4oPzppbmZ8SW5mfElORil8XFwubmFufFxcLk5hTnxcXC5OQU4pJC8sXG4gICAgcmVzb2x2ZTogc3RyID0+IHN0ci5zbGljZSgtMykudG9Mb3dlckNhc2UoKSA9PT0gJ25hbidcbiAgICAgICAgPyBOYU5cbiAgICAgICAgOiBzdHJbMF0gPT09ICctJ1xuICAgICAgICAgICAgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICAgICAgICAgIDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgZmxvYXRFeHAgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgZm9ybWF0OiAnRVhQJyxcbiAgICB0ZXN0OiAvXlstK10/KD86XFwuWzAtOV0rfFswLTldKyg/OlxcLlswLTldKik/KVtlRV1bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IHN0ciA9PiBwYXJzZUZsb2F0KHN0ciksXG4gICAgc3RyaW5naWZ5KG5vZGUpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyKG5vZGUudmFsdWUpO1xuICAgICAgICByZXR1cm4gaXNGaW5pdGUobnVtKSA/IG51bS50b0V4cG9uZW50aWFsKCkgOiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG4gICAgfVxufTtcbmNvbnN0IGZsb2F0ID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpcXC5bMC05XSt8WzAtOV0rXFwuWzAtOV0qKSQvLFxuICAgIHJlc29sdmUoc3RyKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHBhcnNlRmxvYXQoc3RyKSk7XG4gICAgICAgIGNvbnN0IGRvdCA9IHN0ci5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChkb3QgIT09IC0xICYmIHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICcwJylcbiAgICAgICAgICAgIG5vZGUubWluRnJhY3Rpb25EaWdpdHMgPSBzdHIubGVuZ3RoIC0gZG90IC0gMTtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcblxuZXhwb3J0IHsgZmxvYXQsIGZsb2F0RXhwLCBmbG9hdE5hTiB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGludElkZW50aWZ5ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuY29uc3QgaW50UmVzb2x2ZSA9IChzdHIsIG9mZnNldCwgcmFkaXgsIHsgaW50QXNCaWdJbnQgfSkgPT4gKGludEFzQmlnSW50ID8gQmlnSW50KHN0cikgOiBwYXJzZUludChzdHIuc3Vic3RyaW5nKG9mZnNldCksIHJhZGl4KSk7XG5mdW5jdGlvbiBpbnRTdHJpbmdpZnkobm9kZSwgcmFkaXgsIHByZWZpeCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IG5vZGU7XG4gICAgaWYgKGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwKVxuICAgICAgICByZXR1cm4gcHJlZml4ICsgdmFsdWUudG9TdHJpbmcocmFkaXgpO1xuICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5jb25zdCBpbnRPY3QgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IGludElkZW50aWZ5KHZhbHVlKSAmJiB2YWx1ZSA+PSAwLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdPQ1QnLFxuICAgIHRlc3Q6IC9eMG9bMC03XSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgOCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDgsICcwbycpXG59O1xuY29uc3QgaW50ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgdGVzdDogL15bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAwLCAxMCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcbmNvbnN0IGludEhleCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gaW50SWRlbnRpZnkodmFsdWUpICYmIHZhbHVlID49IDAsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLFxuICAgIGZvcm1hdDogJ0hFWCcsXG4gICAgdGVzdDogL14weFswLTlhLWZBLUZdKyQvLFxuICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCBvcHQpID0+IGludFJlc29sdmUoc3RyLCAyLCAxNiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDE2LCAnMHgnKVxufTtcblxuZXhwb3J0IHsgaW50LCBpbnRIZXgsIGludE9jdCB9O1xuIiwiaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi4vY29tbW9uL251bGwuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi4vY29tbW9uL3NlcS5qcyc7XG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tICcuLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJvb2xUYWcgfSBmcm9tICcuL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXROYU4sIGZsb2F0RXhwLCBmbG9hdCB9IGZyb20gJy4vZmxvYXQuanMnO1xuaW1wb3J0IHsgaW50T2N0LCBpbnQsIGludEhleCB9IGZyb20gJy4vaW50LmpzJztcblxuY29uc3Qgc2NoZW1hID0gW1xuICAgIG1hcCxcbiAgICBzZXEsXG4gICAgc3RyaW5nLFxuICAgIG51bGxUYWcsXG4gICAgYm9vbFRhZyxcbiAgICBpbnRPY3QsXG4gICAgaW50LFxuICAgIGludEhleCxcbiAgICBmbG9hdE5hTixcbiAgICBmbG9hdEV4cCxcbiAgICBmbG9hdFxuXTtcblxuZXhwb3J0IHsgc2NoZW1hIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAnLi4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuLi9jb21tb24vc2VxLmpzJztcblxuZnVuY3Rpb24gaW50SWRlbnRpZnkodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTtcbn1cbmNvbnN0IHN0cmluZ2lmeUpTT04gPSAoeyB2YWx1ZSB9KSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5jb25zdCBqc29uU2NhbGFycyA9IFtcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLFxuICAgICAgICByZXNvbHZlOiBzdHIgPT4gc3RyLFxuICAgICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeUpTT05cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09IG51bGwsXG4gICAgICAgIGNyZWF0ZU5vZGU6ICgpID0+IG5ldyBTY2FsYXIobnVsbCksXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm51bGwnLFxuICAgICAgICB0ZXN0OiAvXm51bGwkLyxcbiAgICAgICAgcmVzb2x2ZTogKCkgPT4gbnVsbCxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgICAgIHRlc3Q6IC9edHJ1ZSR8XmZhbHNlJC8sXG4gICAgICAgIHJlc29sdmU6IHN0ciA9PiBzdHIgPT09ICd0cnVlJyxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICAgICAgdGVzdDogL14tPyg/OjB8WzEtOV1bMC05XSopJC8sXG4gICAgICAgIHJlc29sdmU6IChzdHIsIF9vbkVycm9yLCB7IGludEFzQmlnSW50IH0pID0+IGludEFzQmlnSW50ID8gQmlnSW50KHN0cikgOiBwYXJzZUludChzdHIsIDEwKSxcbiAgICAgICAgc3RyaW5naWZ5OiAoeyB2YWx1ZSB9KSA9PiBpbnRJZGVudGlmeSh2YWx1ZSkgPyB2YWx1ZS50b1N0cmluZygpIDogSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgICAgIHRlc3Q6IC9eLT8oPzowfFsxLTldWzAtOV0qKSg/OlxcLlswLTldKik/KD86W2VFXVstK10/WzAtOV0rKT8kLyxcbiAgICAgICAgcmVzb2x2ZTogc3RyID0+IHBhcnNlRmxvYXQoc3RyKSxcbiAgICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlKU09OXG4gICAgfVxuXTtcbmNvbnN0IGpzb25FcnJvciA9IHtcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJycsXG4gICAgdGVzdDogL14vLFxuICAgIHJlc29sdmUoc3RyLCBvbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IoYFVucmVzb2x2ZWQgcGxhaW4gc2NhbGFyICR7SlNPTi5zdHJpbmdpZnkoc3RyKX1gKTtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG59O1xuY29uc3Qgc2NoZW1hID0gW21hcCwgc2VxXS5jb25jYXQoanNvblNjYWxhcnMsIGpzb25FcnJvcik7XG5cbmV4cG9ydCB7IHNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvU2NhbGFyLmpzJztcbmltcG9ydCB7IHN0cmluZ2lmeVN0cmluZyB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlTdHJpbmcuanMnO1xuXG5jb25zdCBiaW5hcnkgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSwgLy8gQnVmZmVyIGluaGVyaXRzIGZyb20gVWludDhBcnJheVxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeScsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEJ1ZmZlciBpbiBub2RlIGFuZCBhbiBVaW50OEFycmF5IGluIGJyb3dzZXJzXG4gICAgICpcbiAgICAgKiBUbyB1c2UgdGhlIHJlc3VsdGluZyBidWZmZXIgYXMgYW4gaW1hZ2UsIHlvdSdsbCB3YW50IHRvIGRvIHNvbWV0aGluZyBsaWtlOlxuICAgICAqXG4gICAgICogICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogJ2ltYWdlL2pwZWcnIH0pXG4gICAgICogICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjcGhvdG8nKS5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICovXG4gICAgcmVzb2x2ZShzcmMsIG9uRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhdG9iID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBPbiBJRSAxMSwgYXRvYigpIGNhbid0IGhhbmRsZSBuZXdsaW5lc1xuICAgICAgICAgICAgY29uc3Qgc3RyID0gYXRvYihzcmMucmVwbGFjZSgvW1xcblxccl0vZywgJycpKTtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb25FcnJvcignVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYXRvYiBpcyByZXF1aXJlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHNyYztcbiAgICAgICAgfVxuICAgIH0sXG4gICAgc3RyaW5naWZ5KHsgY29tbWVudCwgdHlwZSwgdmFsdWUgfSwgY3R4LCBvbkNvbW1lbnQsIG9uQ2hvbXBLZWVwKSB7XG4gICAgICAgIGlmICghdmFsdWUpXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IHZhbHVlOyAvLyBjaGVja2VkIGVhcmxpZXIgYnkgYmluYXJ5LmlkZW50aWZ5KClcbiAgICAgICAgbGV0IHN0cjtcbiAgICAgICAgaWYgKHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsZXQgcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gICAgICAgICAgICBzdHIgPSBidG9hKHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyBiaW5hcnkgdGFnczsgZWl0aGVyIEJ1ZmZlciBvciBidG9hIGlzIHJlcXVpcmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdHlwZSA/PyAodHlwZSA9IFNjYWxhci5CTE9DS19MSVRFUkFMKTtcbiAgICAgICAgaWYgKHR5cGUgIT09IFNjYWxhci5RVU9URV9ET1VCTEUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVXaWR0aCA9IE1hdGgubWF4KGN0eC5vcHRpb25zLmxpbmVXaWR0aCAtIGN0eC5pbmRlbnQubGVuZ3RoLCBjdHgub3B0aW9ucy5taW5Db250ZW50V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbiA9IE1hdGguY2VpbChzdHIubGVuZ3RoIC8gbGluZVdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gbmV3IEFycmF5KG4pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIG8gPSAwOyBpIDwgbjsgKytpLCBvICs9IGxpbmVXaWR0aCkge1xuICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gc3RyLnN1YnN0cihvLCBsaW5lV2lkdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyID0gbGluZXMuam9pbih0eXBlID09PSBTY2FsYXIuQkxPQ0tfTElURVJBTCA/ICdcXG4nIDogJyAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5U3RyaW5nKHsgY29tbWVudCwgdHlwZSwgdmFsdWU6IHN0ciB9LCBjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgIH1cbn07XG5cbmV4cG9ydCB7IGJpbmFyeSB9O1xuIiwiaW1wb3J0IHsgaXNTZXEsIGlzUGFpciwgaXNNYXAgfSBmcm9tICcuLi8uLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQYWlyLCBQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvUGFpci5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlUGFpcnMoc2VxLCBvbkVycm9yKSB7XG4gICAgaWYgKGlzU2VxKHNlcSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXEuaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gc2VxLml0ZW1zW2ldO1xuICAgICAgICAgICAgaWYgKGlzUGFpcihpdGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTWFwKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXRlbXMubGVuZ3RoID4gMSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcignRWFjaCBwYWlyIG11c3QgaGF2ZSBpdHMgb3duIHNlcXVlbmNlIGluZGljYXRvcicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBpdGVtLml0ZW1zWzBdIHx8IG5ldyBQYWlyKG5ldyBTY2FsYXIobnVsbCkpO1xuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNvbW1lbnRCZWZvcmUpXG4gICAgICAgICAgICAgICAgICAgIHBhaXIua2V5LmNvbW1lbnRCZWZvcmUgPSBwYWlyLmtleS5jb21tZW50QmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudEJlZm9yZX1cXG4ke3BhaXIua2V5LmNvbW1lbnRCZWZvcmV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbiA9IHBhaXIudmFsdWUgPz8gcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNuLmNvbW1lbnQgPSBjbi5jb21tZW50XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGAke2l0ZW0uY29tbWVudH1cXG4ke2NuLmNvbW1lbnR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpdGVtLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGl0ZW0gPSBwYWlyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VxLml0ZW1zW2ldID0gaXNQYWlyKGl0ZW0pID8gaXRlbSA6IG5ldyBQYWlyKGl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgICAgb25FcnJvcignRXhwZWN0ZWQgYSBzZXF1ZW5jZSBmb3IgdGhpcyB0YWcnKTtcbiAgICByZXR1cm4gc2VxO1xufVxuZnVuY3Rpb24gY3JlYXRlUGFpcnMoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSB7XG4gICAgY29uc3QgeyByZXBsYWNlciB9ID0gY3R4O1xuICAgIGNvbnN0IHBhaXJzID0gbmV3IFlBTUxTZXEoc2NoZW1hKTtcbiAgICBwYWlycy50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnO1xuICAgIGxldCBpID0gMDtcbiAgICBpZiAoaXRlcmFibGUgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyYWJsZSkpXG4gICAgICAgIGZvciAobGV0IGl0IG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgICAgIGl0ID0gcmVwbGFjZXIuY2FsbChpdGVyYWJsZSwgU3RyaW5nKGkrKyksIGl0KTtcbiAgICAgICAgICAgIGxldCBrZXksIHZhbHVlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBpdFswXTtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpdFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBba2V5LCB2YWx1ZV0gdHVwbGU6ICR7aXR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpdCAmJiBpdCBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpdCk7XG4gICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IGtleXNbMF07XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaXRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIHR1cGxlIHdpdGggb25lIGtleSwgbm90ICR7a2V5cy5sZW5ndGh9IGtleXNgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBpdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhaXJzLml0ZW1zLnB1c2goY3JlYXRlUGFpcihrZXksIHZhbHVlLCBjdHgpKTtcbiAgICAgICAgfVxuICAgIHJldHVybiBwYWlycztcbn1cbmNvbnN0IHBhaXJzID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJyxcbiAgICByZXNvbHZlOiByZXNvbHZlUGFpcnMsXG4gICAgY3JlYXRlTm9kZTogY3JlYXRlUGFpcnNcbn07XG5cbmV4cG9ydCB7IGNyZWF0ZVBhaXJzLCBwYWlycywgcmVzb2x2ZVBhaXJzIH07XG4iLCJpbXBvcnQgeyBpc1NjYWxhciwgaXNQYWlyIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4uLy4uL25vZGVzL3RvSlMuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxNYXAuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uLy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZVBhaXJzLCBjcmVhdGVQYWlycyB9IGZyb20gJy4vcGFpcnMuanMnO1xuXG5jbGFzcyBZQU1MT01hcCBleHRlbmRzIFlBTUxTZXEge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmFkZCA9IFlBTUxNYXAucHJvdG90eXBlLmFkZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlbGV0ZSA9IFlBTUxNYXAucHJvdG90eXBlLmRlbGV0ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmdldCA9IFlBTUxNYXAucHJvdG90eXBlLmdldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmhhcyA9IFlBTUxNYXAucHJvdG90eXBlLmhhcy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNldCA9IFlBTUxNYXAucHJvdG90eXBlLnNldC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRhZyA9IFlBTUxPTWFwLnRhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgYGN0eGAgaXMgZ2l2ZW4sIHRoZSByZXR1cm4gdHlwZSBpcyBhY3R1YWxseSBgTWFwPHVua25vd24sIHVua25vd24+YCxcbiAgICAgKiBidXQgVHlwZVNjcmlwdCB3b24ndCBhbGxvdyB3aWRlbmluZyB0aGUgc2lnbmF0dXJlIG9mIGEgY2hpbGQgbWV0aG9kLlxuICAgICAqL1xuICAgIHRvSlNPTihfLCBjdHgpIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9KU09OKF8pO1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChjdHg/Lm9uQ3JlYXRlKVxuICAgICAgICAgICAgY3R4Lm9uQ3JlYXRlKG1hcCk7XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICBsZXQga2V5LCB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChpc1BhaXIocGFpcikpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSB0b0pTKHBhaXIua2V5LCAnJywgY3R4KTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRvSlMocGFpci52YWx1ZSwga2V5LCBjdHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0gdG9KUyhwYWlyLCAnJywgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGtleSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5cycpO1xuICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpIHtcbiAgICAgICAgY29uc3QgcGFpcnMgPSBjcmVhdGVQYWlycyhzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpO1xuICAgICAgICBjb25zdCBvbWFwID0gbmV3IHRoaXMoKTtcbiAgICAgICAgb21hcC5pdGVtcyA9IHBhaXJzLml0ZW1zO1xuICAgICAgICByZXR1cm4gb21hcDtcbiAgICB9XG59XG5ZQU1MT01hcC50YWcgPSAndGFnOnlhbWwub3JnLDIwMDI6b21hcCc7XG5jb25zdCBvbWFwID0ge1xuICAgIGNvbGxlY3Rpb246ICdzZXEnLFxuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCxcbiAgICBub2RlQ2xhc3M6IFlBTUxPTWFwLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOm9tYXAnLFxuICAgIHJlc29sdmUoc2VxLCBvbkVycm9yKSB7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gcmVzb2x2ZVBhaXJzKHNlcSwgb25FcnJvcik7XG4gICAgICAgIGNvbnN0IHNlZW5LZXlzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgeyBrZXkgfSBvZiBwYWlycy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKGlzU2NhbGFyKGtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VlbktleXMuaW5jbHVkZXMoa2V5LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGBPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5czogJHtrZXkudmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWVuS2V5cy5wdXNoKGtleS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBZQU1MT01hcCgpLCBwYWlycyk7XG4gICAgfSxcbiAgICBjcmVhdGVOb2RlOiAoc2NoZW1hLCBpdGVyYWJsZSwgY3R4KSA9PiBZQU1MT01hcC5mcm9tKHNjaGVtYSwgaXRlcmFibGUsIGN0eClcbn07XG5cbmV4cG9ydCB7IFlBTUxPTWFwLCBvbWFwIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5mdW5jdGlvbiBib29sU3RyaW5naWZ5KHsgdmFsdWUsIHNvdXJjZSB9LCBjdHgpIHtcbiAgICBjb25zdCBib29sT2JqID0gdmFsdWUgPyB0cnVlVGFnIDogZmFsc2VUYWc7XG4gICAgaWYgKHNvdXJjZSAmJiBib29sT2JqLnRlc3QudGVzdChzb3VyY2UpKVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIHJldHVybiB2YWx1ZSA/IGN0eC5vcHRpb25zLnRydWVTdHIgOiBjdHgub3B0aW9ucy5mYWxzZVN0cjtcbn1cbmNvbnN0IHRydWVUYWcgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlID09PSB0cnVlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpZfHl8W1l5XWVzfFlFU3xbVHRdcnVlfFRSVUV8W09vXW58T04pJC8sXG4gICAgcmVzb2x2ZTogKCkgPT4gbmV3IFNjYWxhcih0cnVlKSxcbiAgICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn07XG5jb25zdCBmYWxzZVRhZyA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdmFsdWUgPT09IGZhbHNlLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6Ym9vbCcsXG4gICAgdGVzdDogL14oPzpOfG58W05uXW98Tk98W0ZmXWFsc2V8RkFMU0V8W09vXWZmfE9GRikkLyxcbiAgICByZXNvbHZlOiAoKSA9PiBuZXcgU2NhbGFyKGZhbHNlKSxcbiAgICBzdHJpbmdpZnk6IGJvb2xTdHJpbmdpZnlcbn07XG5cbmV4cG9ydCB7IGZhbHNlVGFnLCB0cnVlVGFnIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGZsb2F0TmFOID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIHRlc3Q6IC9eKD86Wy0rXT9cXC4oPzppbmZ8SW5mfElORil8XFwubmFufFxcLk5hTnxcXC5OQU4pJC8sXG4gICAgcmVzb2x2ZTogKHN0cikgPT4gc3RyLnNsaWNlKC0zKS50b0xvd2VyQ2FzZSgpID09PSAnbmFuJ1xuICAgICAgICA/IE5hTlxuICAgICAgICA6IHN0clswXSA9PT0gJy0nXG4gICAgICAgICAgICA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gICAgc3RyaW5naWZ5OiBzdHJpbmdpZnlOdW1iZXJcbn07XG5jb25zdCBmbG9hdEV4cCA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmZsb2F0JyxcbiAgICBmb3JtYXQ6ICdFWFAnLFxuICAgIHRlc3Q6IC9eWy0rXT8oPzpbMC05XVswLTlfXSopPyg/OlxcLlswLTlfXSopP1tlRV1bLStdP1swLTldKyQvLFxuICAgIHJlc29sdmU6IChzdHIpID0+IHBhcnNlRmxvYXQoc3RyLnJlcGxhY2UoL18vZywgJycpKSxcbiAgICBzdHJpbmdpZnkobm9kZSkge1xuICAgICAgICBjb25zdCBudW0gPSBOdW1iZXIobm9kZS52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpc0Zpbml0ZShudW0pID8gbnVtLnRvRXhwb25lbnRpYWwoKSA6IHN0cmluZ2lmeU51bWJlcihub2RlKTtcbiAgICB9XG59O1xuY29uc3QgZmxvYXQgPSB7XG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsXG4gICAgdGVzdDogL15bLStdPyg/OlswLTldWzAtOV9dKik/XFwuWzAtOV9dKiQvLFxuICAgIHJlc29sdmUoc3RyKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBuZXcgU2NhbGFyKHBhcnNlRmxvYXQoc3RyLnJlcGxhY2UoL18vZywgJycpKSk7XG4gICAgICAgIGNvbnN0IGRvdCA9IHN0ci5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChkb3QgIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBmID0gc3RyLnN1YnN0cmluZyhkb3QgKyAxKS5yZXBsYWNlKC9fL2csICcnKTtcbiAgICAgICAgICAgIGlmIChmW2YubGVuZ3RoIC0gMV0gPT09ICcwJylcbiAgICAgICAgICAgICAgICBub2RlLm1pbkZyYWN0aW9uRGlnaXRzID0gZi5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeU51bWJlclxufTtcblxuZXhwb3J0IHsgZmxvYXQsIGZsb2F0RXhwLCBmbG9hdE5hTiB9O1xuIiwiaW1wb3J0IHsgc3RyaW5naWZ5TnVtYmVyIH0gZnJvbSAnLi4vLi4vc3RyaW5naWZ5L3N0cmluZ2lmeU51bWJlci5qcyc7XG5cbmNvbnN0IGludElkZW50aWZ5ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnIHx8IE51bWJlci5pc0ludGVnZXIodmFsdWUpO1xuZnVuY3Rpb24gaW50UmVzb2x2ZShzdHIsIG9mZnNldCwgcmFkaXgsIHsgaW50QXNCaWdJbnQgfSkge1xuICAgIGNvbnN0IHNpZ24gPSBzdHJbMF07XG4gICAgaWYgKHNpZ24gPT09ICctJyB8fCBzaWduID09PSAnKycpXG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcob2Zmc2V0KS5yZXBsYWNlKC9fL2csICcnKTtcbiAgICBpZiAoaW50QXNCaWdJbnQpIHtcbiAgICAgICAgc3dpdGNoIChyYWRpeCkge1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHN0ciA9IGAwYiR7c3RyfWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgc3RyID0gYDBvJHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgc3RyID0gYDB4JHtzdHJ9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuID0gQmlnSW50KHN0cik7XG4gICAgICAgIHJldHVybiBzaWduID09PSAnLScgPyBCaWdJbnQoLTEpICogbiA6IG47XG4gICAgfVxuICAgIGNvbnN0IG4gPSBwYXJzZUludChzdHIsIHJhZGl4KTtcbiAgICByZXR1cm4gc2lnbiA9PT0gJy0nID8gLTEgKiBuIDogbjtcbn1cbmZ1bmN0aW9uIGludFN0cmluZ2lmeShub2RlLCByYWRpeCwgcHJlZml4KSB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICBpZiAoaW50SWRlbnRpZnkodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IHZhbHVlLnRvU3RyaW5nKHJhZGl4KTtcbiAgICAgICAgcmV0dXJuIHZhbHVlIDwgMCA/ICctJyArIHByZWZpeCArIHN0ci5zdWJzdHIoMSkgOiBwcmVmaXggKyBzdHI7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdpZnlOdW1iZXIobm9kZSk7XG59XG5jb25zdCBpbnRCaW4gPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICBmb3JtYXQ6ICdCSU4nLFxuICAgIHRlc3Q6IC9eWy0rXT8wYlswLTFfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMiwgMiwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDIsICcwYicpXG59O1xuY29uc3QgaW50T2N0ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnT0NUJyxcbiAgICB0ZXN0OiAvXlstK10/MFswLTdfXSskLyxcbiAgICByZXNvbHZlOiAoc3RyLCBfb25FcnJvciwgb3B0KSA9PiBpbnRSZXNvbHZlKHN0ciwgMSwgOCwgb3B0KSxcbiAgICBzdHJpbmdpZnk6IG5vZGUgPT4gaW50U3RyaW5naWZ5KG5vZGUsIDgsICcwJylcbn07XG5jb25zdCBpbnQgPSB7XG4gICAgaWRlbnRpZnk6IGludElkZW50aWZ5LFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6aW50JyxcbiAgICB0ZXN0OiAvXlstK10/WzAtOV1bMC05X10qJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDAsIDEwLCBvcHQpLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5TnVtYmVyXG59O1xuY29uc3QgaW50SGV4ID0ge1xuICAgIGlkZW50aWZ5OiBpbnRJZGVudGlmeSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnSEVYJyxcbiAgICB0ZXN0OiAvXlstK10/MHhbMC05YS1mQS1GX10rJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIG9wdCkgPT4gaW50UmVzb2x2ZShzdHIsIDIsIDE2LCBvcHQpLFxuICAgIHN0cmluZ2lmeTogbm9kZSA9PiBpbnRTdHJpbmdpZnkobm9kZSwgMTYsICcweCcpXG59O1xuXG5leHBvcnQgeyBpbnQsIGludEJpbiwgaW50SGV4LCBpbnRPY3QgfTtcbiIsImltcG9ydCB7IGlzTWFwLCBpc1BhaXIsIGlzU2NhbGFyIH0gZnJvbSAnLi4vLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgUGFpciwgY3JlYXRlUGFpciB9IGZyb20gJy4uLy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCwgZmluZFBhaXIgfSBmcm9tICcuLi8uLi9ub2Rlcy9ZQU1MTWFwLmpzJztcblxuY2xhc3MgWUFNTFNldCBleHRlbmRzIFlBTUxNYXAge1xuICAgIGNvbnN0cnVjdG9yKHNjaGVtYSkge1xuICAgICAgICBzdXBlcihzY2hlbWEpO1xuICAgICAgICB0aGlzLnRhZyA9IFlBTUxTZXQudGFnO1xuICAgIH1cbiAgICBhZGQoa2V5KSB7XG4gICAgICAgIGxldCBwYWlyO1xuICAgICAgICBpZiAoaXNQYWlyKGtleSkpXG4gICAgICAgICAgICBwYWlyID0ga2V5O1xuICAgICAgICBlbHNlIGlmIChrZXkgJiZcbiAgICAgICAgICAgIHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAna2V5JyBpbiBrZXkgJiZcbiAgICAgICAgICAgICd2YWx1ZScgaW4ga2V5ICYmXG4gICAgICAgICAgICBrZXkudmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICBwYWlyID0gbmV3IFBhaXIoa2V5LmtleSwgbnVsbCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHBhaXIgPSBuZXcgUGFpcihrZXksIG51bGwpO1xuICAgICAgICBjb25zdCBwcmV2ID0gZmluZFBhaXIodGhpcy5pdGVtcywgcGFpci5rZXkpO1xuICAgICAgICBpZiAoIXByZXYpXG4gICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2gocGFpcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIGBrZWVwUGFpcmAgaXMgYHRydWVgLCByZXR1cm5zIHRoZSBQYWlyIG1hdGNoaW5nIGBrZXlgLlxuICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhhdCBQYWlyJ3Mga2V5LlxuICAgICAqL1xuICAgIGdldChrZXksIGtlZXBQYWlyKSB7XG4gICAgICAgIGNvbnN0IHBhaXIgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICByZXR1cm4gIWtlZXBQYWlyICYmIGlzUGFpcihwYWlyKVxuICAgICAgICAgICAgPyBpc1NjYWxhcihwYWlyLmtleSlcbiAgICAgICAgICAgICAgICA/IHBhaXIua2V5LnZhbHVlXG4gICAgICAgICAgICAgICAgOiBwYWlyLmtleVxuICAgICAgICAgICAgOiBwYWlyO1xuICAgIH1cbiAgICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJvb2xlYW4gdmFsdWUgZm9yIHNldChrZXksIHZhbHVlKSBpbiBhIFlBTUwgc2V0LCBub3QgJHt0eXBlb2YgdmFsdWV9YCk7XG4gICAgICAgIGNvbnN0IHByZXYgPSBmaW5kUGFpcih0aGlzLml0ZW1zLCBrZXkpO1xuICAgICAgICBpZiAocHJldiAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihwcmV2KSwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXByZXYgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChuZXcgUGFpcihrZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b0pTT04oXywgY3R4KSB7XG4gICAgICAgIHJldHVybiBzdXBlci50b0pTT04oXywgY3R4LCBTZXQpO1xuICAgIH1cbiAgICB0b1N0cmluZyhjdHgsIG9uQ29tbWVudCwgb25DaG9tcEtlZXApIHtcbiAgICAgICAgaWYgKCFjdHgpXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLmhhc0FsbE51bGxWYWx1ZXModHJ1ZSkpXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoT2JqZWN0LmFzc2lnbih7fSwgY3R4LCB7IGFsbE51bGxWYWx1ZXM6IHRydWUgfSksIG9uQ29tbWVudCwgb25DaG9tcEtlZXApO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzJyk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHNjaGVtYSwgaXRlcmFibGUsIGN0eCkge1xuICAgICAgICBjb25zdCB7IHJlcGxhY2VyIH0gPSBjdHg7XG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyB0aGlzKHNjaGVtYSk7XG4gICAgICAgIGlmIChpdGVyYWJsZSAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXJhYmxlKSlcbiAgICAgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlci5jYWxsKGl0ZXJhYmxlLCB2YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIHNldC5pdGVtcy5wdXNoKGNyZWF0ZVBhaXIodmFsdWUsIG51bGwsIGN0eCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2V0O1xuICAgIH1cbn1cbllBTUxTZXQudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOnNldCc7XG5jb25zdCBzZXQgPSB7XG4gICAgY29sbGVjdGlvbjogJ21hcCcsXG4gICAgaWRlbnRpZnk6IHZhbHVlID0+IHZhbHVlIGluc3RhbmNlb2YgU2V0LFxuICAgIG5vZGVDbGFzczogWUFNTFNldCxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLFxuICAgIGNyZWF0ZU5vZGU6IChzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpID0+IFlBTUxTZXQuZnJvbShzY2hlbWEsIGl0ZXJhYmxlLCBjdHgpLFxuICAgIHJlc29sdmUobWFwLCBvbkVycm9yKSB7XG4gICAgICAgIGlmIChpc01hcChtYXApKSB7XG4gICAgICAgICAgICBpZiAobWFwLmhhc0FsbE51bGxWYWx1ZXModHJ1ZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFlBTUxTZXQoKSwgbWFwKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9uRXJyb3IoJ0V4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWcnKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBZQU1MU2V0LCBzZXQgfTtcbiIsImltcG9ydCB7IHN0cmluZ2lmeU51bWJlciB9IGZyb20gJy4uLy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlOdW1iZXIuanMnO1xuXG4vKiogSW50ZXJuYWwgdHlwZXMgaGFuZGxlIGJpZ2ludCBhcyBudW1iZXIsIGJlY2F1c2UgVFMgY2FuJ3QgZmlndXJlIGl0IG91dC4gKi9cbmZ1bmN0aW9uIHBhcnNlU2V4YWdlc2ltYWwoc3RyLCBhc0JpZ0ludCkge1xuICAgIGNvbnN0IHNpZ24gPSBzdHJbMF07XG4gICAgY29uc3QgcGFydHMgPSBzaWduID09PSAnLScgfHwgc2lnbiA9PT0gJysnID8gc3RyLnN1YnN0cmluZygxKSA6IHN0cjtcbiAgICBjb25zdCBudW0gPSAobikgPT4gYXNCaWdJbnQgPyBCaWdJbnQobikgOiBOdW1iZXIobik7XG4gICAgY29uc3QgcmVzID0gcGFydHNcbiAgICAgICAgLnJlcGxhY2UoL18vZywgJycpXG4gICAgICAgIC5zcGxpdCgnOicpXG4gICAgICAgIC5yZWR1Y2UoKHJlcywgcCkgPT4gcmVzICogbnVtKDYwKSArIG51bShwKSwgbnVtKDApKTtcbiAgICByZXR1cm4gKHNpZ24gPT09ICctJyA/IG51bSgtMSkgKiByZXMgOiByZXMpO1xufVxuLyoqXG4gKiBoaGhoOm1tOnNzLnNzc1xuICpcbiAqIEludGVybmFsIHR5cGVzIGhhbmRsZSBiaWdpbnQgYXMgbnVtYmVyLCBiZWNhdXNlIFRTIGNhbid0IGZpZ3VyZSBpdCBvdXQuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNleGFnZXNpbWFsKG5vZGUpIHtcbiAgICBsZXQgeyB2YWx1ZSB9ID0gbm9kZTtcbiAgICBsZXQgbnVtID0gKG4pID0+IG47XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgIG51bSA9IG4gPT4gQmlnSW50KG4pO1xuICAgIGVsc2UgaWYgKGlzTmFOKHZhbHVlKSB8fCAhaXNGaW5pdGUodmFsdWUpKVxuICAgICAgICByZXR1cm4gc3RyaW5naWZ5TnVtYmVyKG5vZGUpO1xuICAgIGxldCBzaWduID0gJyc7XG4gICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICB2YWx1ZSAqPSBudW0oLTEpO1xuICAgIH1cbiAgICBjb25zdCBfNjAgPSBudW0oNjApO1xuICAgIGNvbnN0IHBhcnRzID0gW3ZhbHVlICUgXzYwXTsgLy8gc2Vjb25kcywgaW5jbHVkaW5nIG1zXG4gICAgaWYgKHZhbHVlIDwgNjApIHtcbiAgICAgICAgcGFydHMudW5zaGlmdCgwKTsgLy8gYXQgbGVhc3Qgb25lIDogaXMgcmVxdWlyZWRcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlIC0gcGFydHNbMF0pIC8gXzYwO1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KHZhbHVlICUgXzYwKTsgLy8gbWludXRlc1xuICAgICAgICBpZiAodmFsdWUgPj0gNjApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlIC0gcGFydHNbMF0pIC8gXzYwO1xuICAgICAgICAgICAgcGFydHMudW5zaGlmdCh2YWx1ZSk7IC8vIGhvdXJzXG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChzaWduICtcbiAgICAgICAgcGFydHNcbiAgICAgICAgICAgIC5tYXAobiA9PiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKSlcbiAgICAgICAgICAgIC5qb2luKCc6JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8wMDAwMDBcXGQqJC8sICcnKSAvLyAlIDYwIG1heSBpbnRyb2R1Y2UgZXJyb3JcbiAgICApO1xufVxuY29uc3QgaW50VGltZSA9IHtcbiAgICBpZGVudGlmeTogdmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyB8fCBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSxcbiAgICBkZWZhdWx0OiB0cnVlLFxuICAgIHRhZzogJ3RhZzp5YW1sLm9yZywyMDAyOmludCcsXG4gICAgZm9ybWF0OiAnVElNRScsXG4gICAgdGVzdDogL15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrJC8sXG4gICAgcmVzb2x2ZTogKHN0ciwgX29uRXJyb3IsIHsgaW50QXNCaWdJbnQgfSkgPT4gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGludEFzQmlnSW50KSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVNleGFnZXNpbWFsXG59O1xuY29uc3QgZmxvYXRUaW1lID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgdGFnOiAndGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQnLFxuICAgIGZvcm1hdDogJ1RJTUUnLFxuICAgIHRlc3Q6IC9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1xcLlswLTlfXSokLyxcbiAgICByZXNvbHZlOiBzdHIgPT4gcGFyc2VTZXhhZ2VzaW1hbChzdHIsIGZhbHNlKSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVNleGFnZXNpbWFsXG59O1xuY29uc3QgdGltZXN0YW1wID0ge1xuICAgIGlkZW50aWZ5OiB2YWx1ZSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgICB0YWc6ICd0YWc6eWFtbC5vcmcsMjAwMjp0aW1lc3RhbXAnLFxuICAgIC8vIElmIHRoZSB0aW1lIHpvbmUgaXMgb21pdHRlZCwgdGhlIHRpbWVzdGFtcCBpcyBhc3N1bWVkIHRvIGJlIHNwZWNpZmllZCBpbiBVVEMuIFRoZSB0aW1lIHBhcnRcbiAgICAvLyBtYXkgYmUgb21pdHRlZCBhbHRvZ2V0aGVyLCByZXN1bHRpbmcgaW4gYSBkYXRlIGZvcm1hdC4gSW4gc3VjaCBhIGNhc2UsIHRoZSB0aW1lIHBhcnQgaXNcbiAgICAvLyBhc3N1bWVkIHRvIGJlIDAwOjAwOjAwWiAoc3RhcnQgb2YgZGF5LCBVVEMpLlxuICAgIHRlc3Q6IFJlZ0V4cCgnXihbMC05XXs0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KScgKyAvLyBZWVlZLU1tLURkXG4gICAgICAgICcoPzonICsgLy8gdGltZSBpcyBvcHRpb25hbFxuICAgICAgICAnKD86dHxUfFsgXFxcXHRdKyknICsgLy8gdCB8IFQgfCB3aGl0ZXNwYWNlXG4gICAgICAgICcoWzAtOV17MSwyfSk6KFswLTldezEsMn0pOihbMC05XXsxLDJ9KFxcXFwuWzAtOV0rKT8pJyArIC8vIEhoOk1tOlNzKC5zcyk/XG4gICAgICAgICcoPzpbIFxcXFx0XSooWnxbLStdWzAxMl0/WzAtOV0oPzo6WzAtOV17Mn0pPykpPycgKyAvLyBaIHwgKzUgfCAtMDM6MzBcbiAgICAgICAgJyk/JCcpLFxuICAgIHJlc29sdmUoc3RyKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKHRpbWVzdGFtcC50ZXN0KTtcbiAgICAgICAgaWYgKCFtYXRjaClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignISF0aW1lc3RhbXAgZXhwZWN0cyBhIGRhdGUsIHN0YXJ0aW5nIHdpdGggeXl5eS1tbS1kZCcpO1xuICAgICAgICBjb25zdCBbLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZF0gPSBtYXRjaC5tYXAoTnVtYmVyKTtcbiAgICAgICAgY29uc3QgbWlsbGlzZWMgPSBtYXRjaFs3XSA/IE51bWJlcigobWF0Y2hbN10gKyAnMDAnKS5zdWJzdHIoMSwgMykpIDogMDtcbiAgICAgICAgbGV0IGRhdGUgPSBEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciB8fCAwLCBtaW51dGUgfHwgMCwgc2Vjb25kIHx8IDAsIG1pbGxpc2VjKTtcbiAgICAgICAgY29uc3QgdHogPSBtYXRjaFs4XTtcbiAgICAgICAgaWYgKHR6ICYmIHR6ICE9PSAnWicpIHtcbiAgICAgICAgICAgIGxldCBkID0gcGFyc2VTZXhhZ2VzaW1hbCh0eiwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGQpIDwgMzApXG4gICAgICAgICAgICAgICAgZCAqPSA2MDtcbiAgICAgICAgICAgIGRhdGUgLT0gNjAwMDAgKiBkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcbiAgICB9LFxuICAgIHN0cmluZ2lmeTogKHsgdmFsdWUgfSkgPT4gdmFsdWU/LnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvKFQwMDowMDowMCk/XFwuMDAwWiQvLCAnJykgPz8gJydcbn07XG5cbmV4cG9ydCB7IGZsb2F0VGltZSwgaW50VGltZSwgdGltZXN0YW1wIH07XG4iLCJpbXBvcnQgeyBtYXAgfSBmcm9tICcuLi9jb21tb24vbWFwLmpzJztcbmltcG9ydCB7IG51bGxUYWcgfSBmcm9tICcuLi9jb21tb24vbnVsbC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4uL2NvbW1vbi9zdHJpbmcuanMnO1xuaW1wb3J0IHsgYmluYXJ5IH0gZnJvbSAnLi9iaW5hcnkuanMnO1xuaW1wb3J0IHsgdHJ1ZVRhZywgZmFsc2VUYWcgfSBmcm9tICcuL2Jvb2wuanMnO1xuaW1wb3J0IHsgZmxvYXROYU4sIGZsb2F0RXhwLCBmbG9hdCB9IGZyb20gJy4vZmxvYXQuanMnO1xuaW1wb3J0IHsgaW50QmluLCBpbnRPY3QsIGludCwgaW50SGV4IH0gZnJvbSAnLi9pbnQuanMnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmltcG9ydCB7IG9tYXAgfSBmcm9tICcuL29tYXAuanMnO1xuaW1wb3J0IHsgcGFpcnMgfSBmcm9tICcuL3BhaXJzLmpzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJy4vc2V0LmpzJztcbmltcG9ydCB7IGludFRpbWUsIGZsb2F0VGltZSwgdGltZXN0YW1wIH0gZnJvbSAnLi90aW1lc3RhbXAuanMnO1xuXG5jb25zdCBzY2hlbWEgPSBbXG4gICAgbWFwLFxuICAgIHNlcSxcbiAgICBzdHJpbmcsXG4gICAgbnVsbFRhZyxcbiAgICB0cnVlVGFnLFxuICAgIGZhbHNlVGFnLFxuICAgIGludEJpbixcbiAgICBpbnRPY3QsXG4gICAgaW50LFxuICAgIGludEhleCxcbiAgICBmbG9hdE5hTixcbiAgICBmbG9hdEV4cCxcbiAgICBmbG9hdCxcbiAgICBiaW5hcnksXG4gICAgbWVyZ2UsXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXQsXG4gICAgaW50VGltZSxcbiAgICBmbG9hdFRpbWUsXG4gICAgdGltZXN0YW1wXG5dO1xuXG5leHBvcnQgeyBzY2hlbWEgfTtcbiIsImltcG9ydCB7IG1hcCB9IGZyb20gJy4vY29tbW9uL21hcC5qcyc7XG5pbXBvcnQgeyBudWxsVGFnIH0gZnJvbSAnLi9jb21tb24vbnVsbC5qcyc7XG5pbXBvcnQgeyBzZXEgfSBmcm9tICcuL2NvbW1vbi9zZXEuanMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAnLi9jb21tb24vc3RyaW5nLmpzJztcbmltcG9ydCB7IGJvb2xUYWcgfSBmcm9tICcuL2NvcmUvYm9vbC5qcyc7XG5pbXBvcnQgeyBmbG9hdE5hTiwgZmxvYXRFeHAsIGZsb2F0IH0gZnJvbSAnLi9jb3JlL2Zsb2F0LmpzJztcbmltcG9ydCB7IGludE9jdCwgaW50SGV4LCBpbnQgfSBmcm9tICcuL2NvcmUvaW50LmpzJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4vY29yZS9zY2hlbWEuanMnO1xuaW1wb3J0IHsgc2NoZW1hIGFzIHNjaGVtYSQxIH0gZnJvbSAnLi9qc29uL3NjaGVtYS5qcyc7XG5pbXBvcnQgeyBiaW5hcnkgfSBmcm9tICcuL3lhbWwtMS4xL2JpbmFyeS5qcyc7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJy4veWFtbC0xLjEvbWVyZ2UuanMnO1xuaW1wb3J0IHsgb21hcCB9IGZyb20gJy4veWFtbC0xLjEvb21hcC5qcyc7XG5pbXBvcnQgeyBwYWlycyB9IGZyb20gJy4veWFtbC0xLjEvcGFpcnMuanMnO1xuaW1wb3J0IHsgc2NoZW1hIGFzIHNjaGVtYSQyIH0gZnJvbSAnLi95YW1sLTEuMS9zY2hlbWEuanMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnLi95YW1sLTEuMS9zZXQuanMnO1xuaW1wb3J0IHsgdGltZXN0YW1wLCBpbnRUaW1lLCBmbG9hdFRpbWUgfSBmcm9tICcuL3lhbWwtMS4xL3RpbWVzdGFtcC5qcyc7XG5cbmNvbnN0IHNjaGVtYXMgPSBuZXcgTWFwKFtcbiAgICBbJ2NvcmUnLCBzY2hlbWFdLFxuICAgIFsnZmFpbHNhZmUnLCBbbWFwLCBzZXEsIHN0cmluZ11dLFxuICAgIFsnanNvbicsIHNjaGVtYSQxXSxcbiAgICBbJ3lhbWwxMScsIHNjaGVtYSQyXSxcbiAgICBbJ3lhbWwtMS4xJywgc2NoZW1hJDJdXG5dKTtcbmNvbnN0IHRhZ3NCeU5hbWUgPSB7XG4gICAgYmluYXJ5LFxuICAgIGJvb2w6IGJvb2xUYWcsXG4gICAgZmxvYXQsXG4gICAgZmxvYXRFeHAsXG4gICAgZmxvYXROYU4sXG4gICAgZmxvYXRUaW1lLFxuICAgIGludCxcbiAgICBpbnRIZXgsXG4gICAgaW50T2N0LFxuICAgIGludFRpbWUsXG4gICAgbWFwLFxuICAgIG1lcmdlLFxuICAgIG51bGw6IG51bGxUYWcsXG4gICAgb21hcCxcbiAgICBwYWlycyxcbiAgICBzZXEsXG4gICAgc2V0LFxuICAgIHRpbWVzdGFtcFxufTtcbmNvbnN0IGNvcmVLbm93blRhZ3MgPSB7XG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSc6IGJpbmFyeSxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UnOiBtZXJnZSxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6b21hcCc6IG9tYXAsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnBhaXJzJzogcGFpcnMsXG4gICAgJ3RhZzp5YW1sLm9yZywyMDAyOnNldCc6IHNldCxcbiAgICAndGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wJzogdGltZXN0YW1wXG59O1xuZnVuY3Rpb24gZ2V0VGFncyhjdXN0b21UYWdzLCBzY2hlbWFOYW1lLCBhZGRNZXJnZVRhZykge1xuICAgIGNvbnN0IHNjaGVtYVRhZ3MgPSBzY2hlbWFzLmdldChzY2hlbWFOYW1lKTtcbiAgICBpZiAoc2NoZW1hVGFncyAmJiAhY3VzdG9tVGFncykge1xuICAgICAgICByZXR1cm4gYWRkTWVyZ2VUYWcgJiYgIXNjaGVtYVRhZ3MuaW5jbHVkZXMobWVyZ2UpXG4gICAgICAgICAgICA/IHNjaGVtYVRhZ3MuY29uY2F0KG1lcmdlKVxuICAgICAgICAgICAgOiBzY2hlbWFUYWdzLnNsaWNlKCk7XG4gICAgfVxuICAgIGxldCB0YWdzID0gc2NoZW1hVGFncztcbiAgICBpZiAoIXRhZ3MpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpXG4gICAgICAgICAgICB0YWdzID0gW107XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oc2NoZW1hcy5rZXlzKCkpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4ga2V5ICE9PSAneWFtbDExJylcbiAgICAgICAgICAgICAgICAubWFwKGtleSA9PiBKU09OLnN0cmluZ2lmeShrZXkpKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNjaGVtYSBcIiR7c2NoZW1hTmFtZX1cIjsgdXNlIG9uZSBvZiAke2tleXN9IG9yIGRlZmluZSBjdXN0b21UYWdzIGFycmF5YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VzdG9tVGFncykpIHtcbiAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgY3VzdG9tVGFncylcbiAgICAgICAgICAgIHRhZ3MgPSB0YWdzLmNvbmNhdCh0YWcpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgY3VzdG9tVGFncyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0YWdzID0gY3VzdG9tVGFncyh0YWdzLnNsaWNlKCkpO1xuICAgIH1cbiAgICBpZiAoYWRkTWVyZ2VUYWcpXG4gICAgICAgIHRhZ3MgPSB0YWdzLmNvbmNhdChtZXJnZSk7XG4gICAgcmV0dXJuIHRhZ3MucmVkdWNlKCh0YWdzLCB0YWcpID0+IHtcbiAgICAgICAgY29uc3QgdGFnT2JqID0gdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgPyB0YWdzQnlOYW1lW3RhZ10gOiB0YWc7XG4gICAgICAgIGlmICghdGFnT2JqKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdOYW1lID0gSlNPTi5zdHJpbmdpZnkodGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YWdzQnlOYW1lKVxuICAgICAgICAgICAgICAgIC5tYXAoa2V5ID0+IEpTT04uc3RyaW5naWZ5KGtleSkpXG4gICAgICAgICAgICAgICAgLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY3VzdG9tIHRhZyAke3RhZ05hbWV9OyB1c2Ugb25lIG9mICR7a2V5c31gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRhZ3MuaW5jbHVkZXModGFnT2JqKSlcbiAgICAgICAgICAgIHRhZ3MucHVzaCh0YWdPYmopO1xuICAgICAgICByZXR1cm4gdGFncztcbiAgICB9LCBbXSk7XG59XG5cbmV4cG9ydCB7IGNvcmVLbm93blRhZ3MsIGdldFRhZ3MgfTtcbiIsImltcG9ydCB7IE1BUCwgU0NBTEFSLCBTRVEgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICcuL2NvbW1vbi9tYXAuanMnO1xuaW1wb3J0IHsgc2VxIH0gZnJvbSAnLi9jb21tb24vc2VxLmpzJztcbmltcG9ydCB7IHN0cmluZyB9IGZyb20gJy4vY29tbW9uL3N0cmluZy5qcyc7XG5pbXBvcnQgeyBnZXRUYWdzLCBjb3JlS25vd25UYWdzIH0gZnJvbSAnLi90YWdzLmpzJztcblxuY29uc3Qgc29ydE1hcEVudHJpZXNCeUtleSA9IChhLCBiKSA9PiBhLmtleSA8IGIua2V5ID8gLTEgOiBhLmtleSA+IGIua2V5ID8gMSA6IDA7XG5jbGFzcyBTY2hlbWEge1xuICAgIGNvbnN0cnVjdG9yKHsgY29tcGF0LCBjdXN0b21UYWdzLCBtZXJnZSwgcmVzb2x2ZUtub3duVGFncywgc2NoZW1hLCBzb3J0TWFwRW50cmllcywgdG9TdHJpbmdEZWZhdWx0cyB9KSB7XG4gICAgICAgIHRoaXMuY29tcGF0ID0gQXJyYXkuaXNBcnJheShjb21wYXQpXG4gICAgICAgICAgICA/IGdldFRhZ3MoY29tcGF0LCAnY29tcGF0JylcbiAgICAgICAgICAgIDogY29tcGF0XG4gICAgICAgICAgICAgICAgPyBnZXRUYWdzKG51bGwsIGNvbXBhdClcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIHRoaXMubmFtZSA9ICh0eXBlb2Ygc2NoZW1hID09PSAnc3RyaW5nJyAmJiBzY2hlbWEpIHx8ICdjb3JlJztcbiAgICAgICAgdGhpcy5rbm93blRhZ3MgPSByZXNvbHZlS25vd25UYWdzID8gY29yZUtub3duVGFncyA6IHt9O1xuICAgICAgICB0aGlzLnRhZ3MgPSBnZXRUYWdzKGN1c3RvbVRhZ3MsIHRoaXMubmFtZSwgbWVyZ2UpO1xuICAgICAgICB0aGlzLnRvU3RyaW5nT3B0aW9ucyA9IHRvU3RyaW5nRGVmYXVsdHMgPz8gbnVsbDtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIE1BUCwgeyB2YWx1ZTogbWFwIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU0NBTEFSLCB7IHZhbHVlOiBzdHJpbmcgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBTRVEsIHsgdmFsdWU6IHNlcSB9KTtcbiAgICAgICAgLy8gVXNlZCBieSBjcmVhdGVNYXAoKVxuICAgICAgICB0aGlzLnNvcnRNYXBFbnRyaWVzID1cbiAgICAgICAgICAgIHR5cGVvZiBzb3J0TWFwRW50cmllcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgICAgID8gc29ydE1hcEVudHJpZXNcbiAgICAgICAgICAgICAgICA6IHNvcnRNYXBFbnRyaWVzID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICAgID8gc29ydE1hcEVudHJpZXNCeUtleVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICBjb25zdCBjb3B5ID0gT2JqZWN0LmNyZWF0ZShTY2hlbWEucHJvdG90eXBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0aGlzKSk7XG4gICAgICAgIGNvcHkudGFncyA9IHRoaXMudGFncy5zbGljZSgpO1xuICAgICAgICByZXR1cm4gY29weTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IFNjaGVtYSB9O1xuIiwiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RyaW5naWZ5Q29udGV4dCwgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHsgaW5kZW50Q29tbWVudCwgbGluZUNvbW1lbnQgfSBmcm9tICcuL3N0cmluZ2lmeUNvbW1lbnQuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdpZnlEb2N1bWVudChkb2MsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGxldCBoYXNEaXJlY3RpdmVzID0gb3B0aW9ucy5kaXJlY3RpdmVzID09PSB0cnVlO1xuICAgIGlmIChvcHRpb25zLmRpcmVjdGl2ZXMgIT09IGZhbHNlICYmIGRvYy5kaXJlY3RpdmVzKSB7XG4gICAgICAgIGNvbnN0IGRpciA9IGRvYy5kaXJlY3RpdmVzLnRvU3RyaW5nKGRvYyk7XG4gICAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgICAgIGxpbmVzLnB1c2goZGlyKTtcbiAgICAgICAgICAgIGhhc0RpcmVjdGl2ZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNEaXJlY3RpdmVzKVxuICAgICAgICBsaW5lcy5wdXNoKCctLS0nKTtcbiAgICBjb25zdCBjdHggPSBjcmVhdGVTdHJpbmdpZnlDb250ZXh0KGRvYywgb3B0aW9ucyk7XG4gICAgY29uc3QgeyBjb21tZW50U3RyaW5nIH0gPSBjdHgub3B0aW9ucztcbiAgICBpZiAoZG9jLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCAhPT0gMSlcbiAgICAgICAgICAgIGxpbmVzLnVuc2hpZnQoJycpO1xuICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbW1lbnRCZWZvcmUpO1xuICAgICAgICBsaW5lcy51bnNoaWZ0KGluZGVudENvbW1lbnQoY3MsICcnKSk7XG4gICAgfVxuICAgIGxldCBjaG9tcEtlZXAgPSBmYWxzZTtcbiAgICBsZXQgY29udGVudENvbW1lbnQgPSBudWxsO1xuICAgIGlmIChkb2MuY29udGVudHMpIHtcbiAgICAgICAgaWYgKGlzTm9kZShkb2MuY29udGVudHMpKSB7XG4gICAgICAgICAgICBpZiAoZG9jLmNvbnRlbnRzLnNwYWNlQmVmb3JlICYmIGhhc0RpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgICAgICBpZiAoZG9jLmNvbnRlbnRzLmNvbW1lbnRCZWZvcmUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IGNvbW1lbnRTdHJpbmcoZG9jLmNvbnRlbnRzLmNvbW1lbnRCZWZvcmUpO1xuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goaW5kZW50Q29tbWVudChjcywgJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRvcC1sZXZlbCBibG9jayBzY2FsYXJzIG5lZWQgdG8gYmUgaW5kZW50ZWQgaWYgZm9sbG93ZWQgYnkgYSBjb21tZW50XG4gICAgICAgICAgICBjdHguZm9yY2VCbG9ja0luZGVudCA9ICEhZG9jLmNvbW1lbnQ7XG4gICAgICAgICAgICBjb250ZW50Q29tbWVudCA9IGRvYy5jb250ZW50cy5jb21tZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9uQ2hvbXBLZWVwID0gY29udGVudENvbW1lbnQgPyB1bmRlZmluZWQgOiAoKSA9PiAoY2hvbXBLZWVwID0gdHJ1ZSk7XG4gICAgICAgIGxldCBib2R5ID0gc3RyaW5naWZ5KGRvYy5jb250ZW50cywgY3R4LCAoKSA9PiAoY29udGVudENvbW1lbnQgPSBudWxsKSwgb25DaG9tcEtlZXApO1xuICAgICAgICBpZiAoY29udGVudENvbW1lbnQpXG4gICAgICAgICAgICBib2R5ICs9IGxpbmVDb21tZW50KGJvZHksICcnLCBjb21tZW50U3RyaW5nKGNvbnRlbnRDb21tZW50KSk7XG4gICAgICAgIGlmICgoYm9keVswXSA9PT0gJ3wnIHx8IGJvZHlbMF0gPT09ICc+JykgJiZcbiAgICAgICAgICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSAnLS0tJykge1xuICAgICAgICAgICAgLy8gVG9wLWxldmVsIGJsb2NrIHNjYWxhcnMgd2l0aCBhIHByZWNlZGluZyBkb2MgbWFya2VyIG91Z2h0IHRvIHVzZSB0aGVcbiAgICAgICAgICAgIC8vIHNhbWUgbGluZSBmb3IgdGhlaXIgaGVhZGVyLlxuICAgICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gPSBgLS0tICR7Ym9keX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYm9keSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKHN0cmluZ2lmeShkb2MuY29udGVudHMsIGN0eCkpO1xuICAgIH1cbiAgICBpZiAoZG9jLmRpcmVjdGl2ZXM/LmRvY0VuZCkge1xuICAgICAgICBpZiAoZG9jLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gY29tbWVudFN0cmluZyhkb2MuY29tbWVudCk7XG4gICAgICAgICAgICBpZiAoY3MuaW5jbHVkZXMoJ1xcbicpKSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaCgnLi4uJyk7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNzLCAnJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGluZXMucHVzaChgLi4uICR7Y3N9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKCcuLi4nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbGV0IGRjID0gZG9jLmNvbW1lbnQ7XG4gICAgICAgIGlmIChkYyAmJiBjaG9tcEtlZXApXG4gICAgICAgICAgICBkYyA9IGRjLnJlcGxhY2UoL15cXG4rLywgJycpO1xuICAgICAgICBpZiAoZGMpIHtcbiAgICAgICAgICAgIGlmICgoIWNob21wS2VlcCB8fCBjb250ZW50Q29tbWVudCkgJiYgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gIT09ICcnKVxuICAgICAgICAgICAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgICAgICAgbGluZXMucHVzaChpbmRlbnRDb21tZW50KGNvbW1lbnRTdHJpbmcoZGMpLCAnJykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKSArICdcXG4nO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnlEb2N1bWVudCB9O1xuIiwiaW1wb3J0IHsgQWxpYXMgfSBmcm9tICcuLi9ub2Rlcy9BbGlhcy5qcyc7XG5pbXBvcnQgeyBpc0VtcHR5UGF0aCwgY29sbGVjdGlvbkZyb21QYXRoIH0gZnJvbSAnLi4vbm9kZXMvQ29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBOT0RFX1RZUEUsIERPQywgaXNOb2RlLCBpc0NvbGxlY3Rpb24sIGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgUGFpciB9IGZyb20gJy4uL25vZGVzL1BhaXIuanMnO1xuaW1wb3J0IHsgdG9KUyB9IGZyb20gJy4uL25vZGVzL3RvSlMuanMnO1xuaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hL1NjaGVtYS5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlEb2N1bWVudCB9IGZyb20gJy4uL3N0cmluZ2lmeS9zdHJpbmdpZnlEb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBhbmNob3JOYW1lcywgZmluZE5ld0FuY2hvciwgY3JlYXRlTm9kZUFuY2hvcnMgfSBmcm9tICcuL2FuY2hvcnMuanMnO1xuaW1wb3J0IHsgYXBwbHlSZXZpdmVyIH0gZnJvbSAnLi9hcHBseVJldml2ZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlTm9kZSB9IGZyb20gJy4vY3JlYXRlTm9kZS5qcyc7XG5pbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi9kaXJlY3RpdmVzLmpzJztcblxuY2xhc3MgRG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCByZXBsYWNlciwgb3B0aW9ucykge1xuICAgICAgICAvKiogQSBjb21tZW50IGJlZm9yZSB0aGlzIERvY3VtZW50ICovXG4gICAgICAgIHRoaXMuY29tbWVudEJlZm9yZSA9IG51bGw7XG4gICAgICAgIC8qKiBBIGNvbW1lbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBEb2N1bWVudCAqL1xuICAgICAgICB0aGlzLmNvbW1lbnQgPSBudWxsO1xuICAgICAgICAvKiogRXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBwYXJzaW5nLiAqL1xuICAgICAgICB0aGlzLmVycm9ycyA9IFtdO1xuICAgICAgICAvKiogV2FybmluZ3MgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuICovXG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIE5PREVfVFlQRSwgeyB2YWx1ZTogRE9DIH0pO1xuICAgICAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJyB8fCBBcnJheS5pc0FycmF5KHJlcGxhY2VyKSkge1xuICAgICAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJlcGxhY2VyKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gcmVwbGFjZXI7XG4gICAgICAgICAgICByZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcHQgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgIGludEFzQmlnSW50OiBmYWxzZSxcbiAgICAgICAgICAgIGtlZXBTb3VyY2VUb2tlbnM6IGZhbHNlLFxuICAgICAgICAgICAgbG9nTGV2ZWw6ICd3YXJuJyxcbiAgICAgICAgICAgIHByZXR0eUVycm9yczogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgIHN0cmluZ0tleXM6IGZhbHNlLFxuICAgICAgICAgICAgdW5pcXVlS2V5czogdHJ1ZSxcbiAgICAgICAgICAgIHZlcnNpb246ICcxLjInXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHQ7XG4gICAgICAgIGxldCB7IHZlcnNpb24gfSA9IG9wdDtcbiAgICAgICAgaWYgKG9wdGlvbnM/Ll9kaXJlY3RpdmVzKSB7XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBvcHRpb25zLl9kaXJlY3RpdmVzLmF0RG9jdW1lbnQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMueWFtbC5leHBsaWNpdClcbiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgIHRoaXMuc2V0U2NoZW1hKHZlcnNpb24sIG9wdGlvbnMpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICB0aGlzLmNvbnRlbnRzID1cbiAgICAgICAgICAgIHZhbHVlID09PSB1bmRlZmluZWQgPyBudWxsIDogdGhpcy5jcmVhdGVOb2RlKHZhbHVlLCBfcmVwbGFjZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhpcyBEb2N1bWVudCBhbmQgaXRzIGNvbnRlbnRzLlxuICAgICAqXG4gICAgICogQ3VzdG9tIE5vZGUgdmFsdWVzIHRoYXQgaW5oZXJpdCBmcm9tIGBPYmplY3RgIHN0aWxsIHJlZmVyIHRvIHRoZWlyIG9yaWdpbmFsIGluc3RhbmNlcy5cbiAgICAgKi9cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY29weSA9IE9iamVjdC5jcmVhdGUoRG9jdW1lbnQucHJvdG90eXBlLCB7XG4gICAgICAgICAgICBbTk9ERV9UWVBFXTogeyB2YWx1ZTogRE9DIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvcHkuY29tbWVudEJlZm9yZSA9IHRoaXMuY29tbWVudEJlZm9yZTtcbiAgICAgICAgY29weS5jb21tZW50ID0gdGhpcy5jb21tZW50O1xuICAgICAgICBjb3B5LmVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKCk7XG4gICAgICAgIGNvcHkud2FybmluZ3MgPSB0aGlzLndhcm5pbmdzLnNsaWNlKCk7XG4gICAgICAgIGNvcHkub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICBjb3B5LmRpcmVjdGl2ZXMgPSB0aGlzLmRpcmVjdGl2ZXMuY2xvbmUoKTtcbiAgICAgICAgY29weS5zY2hlbWEgPSB0aGlzLnNjaGVtYS5jbG9uZSgpO1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICBjb3B5LmNvbnRlbnRzID0gaXNOb2RlKHRoaXMuY29udGVudHMpXG4gICAgICAgICAgICA/IHRoaXMuY29udGVudHMuY2xvbmUoY29weS5zY2hlbWEpXG4gICAgICAgICAgICA6IHRoaXMuY29udGVudHM7XG4gICAgICAgIGlmICh0aGlzLnJhbmdlKVxuICAgICAgICAgICAgY29weS5yYW5nZSA9IHRoaXMucmFuZ2Uuc2xpY2UoKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKiBBZGRzIGEgdmFsdWUgdG8gdGhlIGRvY3VtZW50LiAqL1xuICAgIGFkZCh2YWx1ZSkge1xuICAgICAgICBpZiAoYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMuYWRkKHZhbHVlKTtcbiAgICB9XG4gICAgLyoqIEFkZHMgYSB2YWx1ZSB0byB0aGUgZG9jdW1lbnQuICovXG4gICAgYWRkSW4ocGF0aCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzLmFkZEluKHBhdGgsIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGBBbGlhc2Agbm9kZSwgZW5zdXJpbmcgdGhhdCB0aGUgdGFyZ2V0IGBub2RlYCBoYXMgdGhlIHJlcXVpcmVkIGFuY2hvci5cbiAgICAgKlxuICAgICAqIElmIGBub2RlYCBhbHJlYWR5IGhhcyBhbiBhbmNob3IsIGBuYW1lYCBpcyBpZ25vcmVkLlxuICAgICAqIE90aGVyd2lzZSwgdGhlIGBub2RlLmFuY2hvcmAgdmFsdWUgd2lsbCBiZSBzZXQgdG8gYG5hbWVgLFxuICAgICAqIG9yIGlmIGFuIGFuY2hvciB3aXRoIHRoYXQgbmFtZSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGRvY3VtZW50LFxuICAgICAqIGBuYW1lYCB3aWxsIGJlIHVzZWQgYXMgYSBwcmVmaXggZm9yIGEgbmV3IHVuaXF1ZSBhbmNob3IuXG4gICAgICogSWYgYG5hbWVgIGlzIHVuZGVmaW5lZCwgdGhlIGdlbmVyYXRlZCBhbmNob3Igd2lsbCB1c2UgJ2EnIGFzIGEgcHJlZml4LlxuICAgICAqL1xuICAgIGNyZWF0ZUFsaWFzKG5vZGUsIG5hbWUpIHtcbiAgICAgICAgaWYgKCFub2RlLmFuY2hvcikge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IGFuY2hvck5hbWVzKHRoaXMpO1xuICAgICAgICAgICAgbm9kZS5hbmNob3IgPVxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICAgICAgICAgICFuYW1lIHx8IHByZXYuaGFzKG5hbWUpID8gZmluZE5ld0FuY2hvcihuYW1lIHx8ICdhJywgcHJldikgOiBuYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQWxpYXMobm9kZS5hbmNob3IpO1xuICAgIH1cbiAgICBjcmVhdGVOb2RlKHZhbHVlLCByZXBsYWNlciwgb3B0aW9ucykge1xuICAgICAgICBsZXQgX3JlcGxhY2VyID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHJlcGxhY2VyLmNhbGwoeyAnJzogdmFsdWUgfSwgJycsIHZhbHVlKTtcbiAgICAgICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlUb1N0ciA9ICh2KSA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgfHwgdiBpbnN0YW5jZW9mIFN0cmluZyB8fCB2IGluc3RhbmNlb2YgTnVtYmVyO1xuICAgICAgICAgICAgY29uc3QgYXNTdHIgPSByZXBsYWNlci5maWx0ZXIoa2V5VG9TdHIpLm1hcChTdHJpbmcpO1xuICAgICAgICAgICAgaWYgKGFzU3RyLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmVwbGFjZXIgPSByZXBsYWNlci5jb25jYXQoYXNTdHIpO1xuICAgICAgICAgICAgX3JlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIHJlcGxhY2VyKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gcmVwbGFjZXI7XG4gICAgICAgICAgICByZXBsYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFsaWFzRHVwbGljYXRlT2JqZWN0cywgYW5jaG9yUHJlZml4LCBmbG93LCBrZWVwVW5kZWZpbmVkLCBvblRhZ09iaiwgdGFnIH0gPSBvcHRpb25zID8/IHt9O1xuICAgICAgICBjb25zdCB7IG9uQW5jaG9yLCBzZXRBbmNob3JzLCBzb3VyY2VPYmplY3RzIH0gPSBjcmVhdGVOb2RlQW5jaG9ycyh0aGlzLCBcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gICAgICAgIGFuY2hvclByZWZpeCB8fCAnYScpO1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBhbGlhc0R1cGxpY2F0ZU9iamVjdHM6IGFsaWFzRHVwbGljYXRlT2JqZWN0cyA/PyB0cnVlLFxuICAgICAgICAgICAga2VlcFVuZGVmaW5lZDoga2VlcFVuZGVmaW5lZCA/PyBmYWxzZSxcbiAgICAgICAgICAgIG9uQW5jaG9yLFxuICAgICAgICAgICAgb25UYWdPYmosXG4gICAgICAgICAgICByZXBsYWNlcjogX3JlcGxhY2VyLFxuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLnNjaGVtYSxcbiAgICAgICAgICAgIHNvdXJjZU9iamVjdHNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGNyZWF0ZU5vZGUodmFsdWUsIHRhZywgY3R4KTtcbiAgICAgICAgaWYgKGZsb3cgJiYgaXNDb2xsZWN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgbm9kZS5mbG93ID0gdHJ1ZTtcbiAgICAgICAgc2V0QW5jaG9ycygpO1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCBhIGtleSBhbmQgYSB2YWx1ZSBpbnRvIGEgYFBhaXJgIHVzaW5nIHRoZSBjdXJyZW50IHNjaGVtYSxcbiAgICAgKiByZWN1cnNpdmVseSB3cmFwcGluZyBhbGwgdmFsdWVzIGFzIGBTY2FsYXJgIG9yIGBDb2xsZWN0aW9uYCBub2Rlcy5cbiAgICAgKi9cbiAgICBjcmVhdGVQYWlyKGtleSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBrID0gdGhpcy5jcmVhdGVOb2RlKGtleSwgbnVsbCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLmNyZWF0ZU5vZGUodmFsdWUsIG51bGwsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbmV3IFBhaXIoaywgdik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykgPyB0aGlzLmNvbnRlbnRzLmRlbGV0ZShrZXkpIDogZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGl0ZW0gd2FzIGZvdW5kIGFuZCByZW1vdmVkLlxuICAgICAqL1xuICAgIGRlbGV0ZUluKHBhdGgpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgUHJlc3VtZWQgaW1wb3NzaWJsZSBpZiBTdHJpY3QgZXh0ZW5kcyBmYWxzZVxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXNzZXJ0Q29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmRlbGV0ZUluKHBhdGgpXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGl0ZW0gYXQgYGtleWAsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBmb3VuZC4gQnkgZGVmYXVsdCB1bndyYXBzXG4gICAgICogc2NhbGFyIHZhbHVlcyBmcm9tIHRoZWlyIHN1cnJvdW5kaW5nIG5vZGU7IHRvIGRpc2FibGUgc2V0IGBrZWVwU2NhbGFyYCB0b1xuICAgICAqIGB0cnVlYCAoY29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZXR1cm5lZCBpbnRhY3QpLlxuICAgICAqL1xuICAgIGdldChrZXksIGtlZXBTY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKVxuICAgICAgICAgICAgPyB0aGlzLmNvbnRlbnRzLmdldChrZXksIGtlZXBTY2FsYXIpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpdGVtIGF0IGBwYXRoYCwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLiBCeSBkZWZhdWx0IHVud3JhcHNcbiAgICAgKiBzY2FsYXIgdmFsdWVzIGZyb20gdGhlaXIgc3Vycm91bmRpbmcgbm9kZTsgdG8gZGlzYWJsZSBzZXQgYGtlZXBTY2FsYXJgIHRvXG4gICAgICogYHRydWVgIChjb2xsZWN0aW9ucyBhcmUgYWx3YXlzIHJldHVybmVkIGludGFjdCkuXG4gICAgICovXG4gICAgZ2V0SW4ocGF0aCwga2VlcFNjYWxhcikge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpXG4gICAgICAgICAgICByZXR1cm4gIWtlZXBTY2FsYXIgJiYgaXNTY2FsYXIodGhpcy5jb250ZW50cylcbiAgICAgICAgICAgICAgICA/IHRoaXMuY29udGVudHMudmFsdWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuY29udGVudHM7XG4gICAgICAgIHJldHVybiBpc0NvbGxlY3Rpb24odGhpcy5jb250ZW50cylcbiAgICAgICAgICAgID8gdGhpcy5jb250ZW50cy5nZXRJbihwYXRoLCBrZWVwU2NhbGFyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZG9jdW1lbnQgaW5jbHVkZXMgYSB2YWx1ZSB3aXRoIHRoZSBrZXkgYGtleWAuXG4gICAgICovXG4gICAgaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gaXNDb2xsZWN0aW9uKHRoaXMuY29udGVudHMpID8gdGhpcy5jb250ZW50cy5oYXMoa2V5KSA6IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGRvY3VtZW50IGluY2x1ZGVzIGEgdmFsdWUgYXQgYHBhdGhgLlxuICAgICAqL1xuICAgIGhhc0luKHBhdGgpIHtcbiAgICAgICAgaWYgKGlzRW1wdHlQYXRoKHBhdGgpKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudHMgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGlzQ29sbGVjdGlvbih0aGlzLmNvbnRlbnRzKSA/IHRoaXMuY29udGVudHMuaGFzSW4ocGF0aCkgOiBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluIHRoaXMgZG9jdW1lbnQuIEZvciBgISFzZXRgLCBgdmFsdWVgIG5lZWRzIHRvIGJlIGFcbiAgICAgKiBib29sZWFuIHRvIGFkZC9yZW1vdmUgdGhlIGl0ZW0gZnJvbSB0aGUgc2V0LlxuICAgICAqL1xuICAgIHNldChrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRzID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgV2UgY2FuJ3QgcmVhbGx5IGtub3cgdGhhdCB0aGlzIG1hdGNoZXMgQ29udGVudHMuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gY29sbGVjdGlvbkZyb21QYXRoKHRoaXMuc2NoZW1hLCBba2V5XSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgYSB2YWx1ZSBpbiB0aGlzIGRvY3VtZW50LiBGb3IgYCEhc2V0YCwgYHZhbHVlYCBuZWVkcyB0byBiZSBhXG4gICAgICogYm9vbGVhbiB0byBhZGQvcmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIHNldC5cbiAgICAgKi9cbiAgICBzZXRJbihwYXRoLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNFbXB0eVBhdGgocGF0aCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgV2UgY2FuJ3QgcmVhbGx5IGtub3cgdGhhdCB0aGlzIG1hdGNoZXMgQ29udGVudHMuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRzID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5jb250ZW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFdlIGNhbid0IHJlYWxseSBrbm93IHRoYXQgdGhpcyBtYXRjaGVzIENvbnRlbnRzLlxuICAgICAgICAgICAgdGhpcy5jb250ZW50cyA9IGNvbGxlY3Rpb25Gcm9tUGF0aCh0aGlzLnNjaGVtYSwgQXJyYXkuZnJvbShwYXRoKSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFzc2VydENvbGxlY3Rpb24odGhpcy5jb250ZW50cykpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudHMuc2V0SW4ocGF0aCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgWUFNTCB2ZXJzaW9uIGFuZCBzY2hlbWEgdXNlZCBieSB0aGUgZG9jdW1lbnQuXG4gICAgICogQSBgbnVsbGAgdmVyc2lvbiBkaXNhYmxlcyBzdXBwb3J0IGZvciBkaXJlY3RpdmVzLCBleHBsaWNpdCB0YWdzLCBhbmNob3JzLCBhbmQgYWxpYXNlcy5cbiAgICAgKiBJdCBhbHNvIHJlcXVpcmVzIHRoZSBgc2NoZW1hYCBvcHRpb24gdG8gYmUgZ2l2ZW4gYXMgYSBgU2NoZW1hYCBpbnN0YW5jZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIE92ZXJyaWRlcyBhbGwgcHJldmlvdXNseSBzZXQgc2NoZW1hIG9wdGlvbnMuXG4gICAgICovXG4gICAgc2V0U2NoZW1hKHZlcnNpb24sIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdudW1iZXInKVxuICAgICAgICAgICAgdmVyc2lvbiA9IFN0cmluZyh2ZXJzaW9uKTtcbiAgICAgICAgbGV0IG9wdDtcbiAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgICAgICAgICBjYXNlICcxLjEnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24gPSAnMS4xJztcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IG5ldyBEaXJlY3RpdmVzKHsgdmVyc2lvbjogJzEuMScgfSk7XG4gICAgICAgICAgICAgICAgb3B0ID0geyByZXNvbHZlS25vd25UYWdzOiBmYWxzZSwgc2NoZW1hOiAneWFtbC0xLjEnIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxLjInOlxuICAgICAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb24gfSk7XG4gICAgICAgICAgICAgICAgb3B0ID0geyByZXNvbHZlS25vd25UYWdzOiB0cnVlLCBzY2hlbWE6ICdjb3JlJyB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpcmVjdGl2ZXMpXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgICAgb3B0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdiA9IEpTT04uc3RyaW5naWZ5KHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJzEuMScsICcxLjInIG9yIG51bGwgYXMgZmlyc3QgYXJndW1lbnQsIGJ1dCBmb3VuZDogJHtzdn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBOb3QgdXNpbmcgYGluc3RhbmNlb2YgU2NoZW1hYCB0byBhbGxvdyBmb3IgZHVjayB0eXBpbmdcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NoZW1hIGluc3RhbmNlb2YgT2JqZWN0KVxuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBvcHRpb25zLnNjaGVtYTtcbiAgICAgICAgZWxzZSBpZiAob3B0KVxuICAgICAgICAgICAgdGhpcy5zY2hlbWEgPSBuZXcgU2NoZW1hKE9iamVjdC5hc3NpZ24ob3B0LCBvcHRpb25zKSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgV2l0aCBhIG51bGwgWUFNTCB2ZXJzaW9uLCB0aGUgeyBzY2hlbWE6IFNjaGVtYSB9IG9wdGlvbiBpcyByZXF1aXJlZGApO1xuICAgIH1cbiAgICAvLyBqc29uICYganNvbkFyZyBhcmUgb25seSB1c2VkIGZyb20gdG9KU09OKClcbiAgICB0b0pTKHsganNvbiwganNvbkFyZywgbWFwQXNNYXAsIG1heEFsaWFzQ291bnQsIG9uQW5jaG9yLCByZXZpdmVyIH0gPSB7fSkge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBhbmNob3JzOiBuZXcgTWFwKCksXG4gICAgICAgICAgICBkb2M6IHRoaXMsXG4gICAgICAgICAgICBrZWVwOiAhanNvbixcbiAgICAgICAgICAgIG1hcEFzTWFwOiBtYXBBc01hcCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIG1hcEtleVdhcm5lZDogZmFsc2UsXG4gICAgICAgICAgICBtYXhBbGlhc0NvdW50OiB0eXBlb2YgbWF4QWxpYXNDb3VudCA9PT0gJ251bWJlcicgPyBtYXhBbGlhc0NvdW50IDogMTAwXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlcyA9IHRvSlModGhpcy5jb250ZW50cywganNvbkFyZyA/PyAnJywgY3R4KTtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkFuY2hvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBjb3VudCwgcmVzIH0gb2YgY3R4LmFuY2hvcnMudmFsdWVzKCkpXG4gICAgICAgICAgICAgICAgb25BbmNob3IocmVzLCBjb3VudCk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcmV2aXZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhcHBseVJldml2ZXIocmV2aXZlciwgeyAnJzogcmVzIH0sICcnLCByZXMpXG4gICAgICAgICAgICA6IHJlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkb2N1bWVudCBgY29udGVudHNgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGpzb25BcmcgVXNlZCBieSBgSlNPTi5zdHJpbmdpZnlgIHRvIGluZGljYXRlIHRoZSBhcnJheSBpbmRleCBvclxuICAgICAqICAgcHJvcGVydHkgbmFtZS5cbiAgICAgKi9cbiAgICB0b0pTT04oanNvbkFyZywgb25BbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9KUyh7IGpzb246IHRydWUsIGpzb25BcmcsIG1hcEFzTWFwOiBmYWxzZSwgb25BbmNob3IgfSk7XG4gICAgfVxuICAgIC8qKiBBIFlBTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvY3VtZW50LiAqL1xuICAgIHRvU3RyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5lcnJvcnMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRG9jdW1lbnQgd2l0aCBlcnJvcnMgY2Fubm90IGJlIHN0cmluZ2lmaWVkJyk7XG4gICAgICAgIGlmICgnaW5kZW50JyBpbiBvcHRpb25zICYmXG4gICAgICAgICAgICAoIU51bWJlci5pc0ludGVnZXIob3B0aW9ucy5pbmRlbnQpIHx8IE51bWJlcihvcHRpb25zLmluZGVudCkgPD0gMCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmluZGVudCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFwiaW5kZW50XCIgb3B0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLCBub3QgJHtzfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlEb2N1bWVudCh0aGlzLCBvcHRpb25zKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NlcnRDb2xsZWN0aW9uKGNvbnRlbnRzKSB7XG4gICAgaWYgKGlzQ29sbGVjdGlvbihjb250ZW50cykpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSBZQU1MIGNvbGxlY3Rpb24gYXMgZG9jdW1lbnQgY29udGVudHMnKTtcbn1cblxuZXhwb3J0IHsgRG9jdW1lbnQgfTtcbiIsImNsYXNzIFlBTUxFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihuYW1lLCBwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5wb3MgPSBwb3M7XG4gICAgfVxufVxuY2xhc3MgWUFNTFBhcnNlRXJyb3IgZXh0ZW5kcyBZQU1MRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBvcywgY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcignWUFNTFBhcnNlRXJyb3InLCBwb3MsIGNvZGUsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmNsYXNzIFlBTUxXYXJuaW5nIGV4dGVuZHMgWUFNTEVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3MsIGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoJ1lBTUxXYXJuaW5nJywgcG9zLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB9XG59XG5jb25zdCBwcmV0dGlmeUVycm9yID0gKHNyYywgbGMpID0+IChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvci5wb3NbMF0gPT09IC0xKVxuICAgICAgICByZXR1cm47XG4gICAgZXJyb3IubGluZVBvcyA9IGVycm9yLnBvcy5tYXAocG9zID0+IGxjLmxpbmVQb3MocG9zKSk7XG4gICAgY29uc3QgeyBsaW5lLCBjb2wgfSA9IGVycm9yLmxpbmVQb3NbMF07XG4gICAgZXJyb3IubWVzc2FnZSArPSBgIGF0IGxpbmUgJHtsaW5lfSwgY29sdW1uICR7Y29sfWA7XG4gICAgbGV0IGNpID0gY29sIC0gMTtcbiAgICBsZXQgbGluZVN0ciA9IHNyY1xuICAgICAgICAuc3Vic3RyaW5nKGxjLmxpbmVTdGFydHNbbGluZSAtIDFdLCBsYy5saW5lU3RhcnRzW2xpbmVdKVxuICAgICAgICAucmVwbGFjZSgvW1xcblxccl0rJC8sICcnKTtcbiAgICAvLyBUcmltIHRvIG1heCA4MCBjaGFycywga2VlcGluZyBjb2wgcG9zaXRpb24gbmVhciB0aGUgbWlkZGxlXG4gICAgaWYgKGNpID49IDYwICYmIGxpbmVTdHIubGVuZ3RoID4gODApIHtcbiAgICAgICAgY29uc3QgdHJpbVN0YXJ0ID0gTWF0aC5taW4oY2kgLSAzOSwgbGluZVN0ci5sZW5ndGggLSA3OSk7XG4gICAgICAgIGxpbmVTdHIgPSAn4oCmJyArIGxpbmVTdHIuc3Vic3RyaW5nKHRyaW1TdGFydCk7XG4gICAgICAgIGNpIC09IHRyaW1TdGFydCAtIDE7XG4gICAgfVxuICAgIGlmIChsaW5lU3RyLmxlbmd0aCA+IDgwKVxuICAgICAgICBsaW5lU3RyID0gbGluZVN0ci5zdWJzdHJpbmcoMCwgNzkpICsgJ+KApic7XG4gICAgLy8gSW5jbHVkZSBwcmV2aW91cyBsaW5lIGluIGNvbnRleHQgaWYgcG9pbnRpbmcgYXQgbGluZSBzdGFydFxuICAgIGlmIChsaW5lID4gMSAmJiAvXiAqJC8udGVzdChsaW5lU3RyLnN1YnN0cmluZygwLCBjaSkpKSB7XG4gICAgICAgIC8vIFJlZ2V4cCB3b24ndCBtYXRjaCBpZiBzdGFydCBpcyB0cmltbWVkXG4gICAgICAgIGxldCBwcmV2ID0gc3JjLnN1YnN0cmluZyhsYy5saW5lU3RhcnRzW2xpbmUgLSAyXSwgbGMubGluZVN0YXJ0c1tsaW5lIC0gMV0pO1xuICAgICAgICBpZiAocHJldi5sZW5ndGggPiA4MClcbiAgICAgICAgICAgIHByZXYgPSBwcmV2LnN1YnN0cmluZygwLCA3OSkgKyAn4oCmXFxuJztcbiAgICAgICAgbGluZVN0ciA9IHByZXYgKyBsaW5lU3RyO1xuICAgIH1cbiAgICBpZiAoL1teIF0vLnRlc3QobGluZVN0cikpIHtcbiAgICAgICAgbGV0IGNvdW50ID0gMTtcbiAgICAgICAgY29uc3QgZW5kID0gZXJyb3IubGluZVBvc1sxXTtcbiAgICAgICAgaWYgKGVuZD8ubGluZSA9PT0gbGluZSAmJiBlbmQuY29sID4gY29sKSB7XG4gICAgICAgICAgICBjb3VudCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGVuZC5jb2wgLSBjb2wsIDgwIC0gY2kpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2ludGVyID0gJyAnLnJlcGVhdChjaSkgKyAnXicucmVwZWF0KGNvdW50KTtcbiAgICAgICAgZXJyb3IubWVzc2FnZSArPSBgOlxcblxcbiR7bGluZVN0cn1cXG4ke3BvaW50ZXJ9XFxuYDtcbiAgICB9XG59O1xuXG5leHBvcnQgeyBZQU1MRXJyb3IsIFlBTUxQYXJzZUVycm9yLCBZQU1MV2FybmluZywgcHJldHRpZnlFcnJvciB9O1xuIiwiZnVuY3Rpb24gcmVzb2x2ZVByb3BzKHRva2VucywgeyBmbG93LCBpbmRpY2F0b3IsIG5leHQsIG9mZnNldCwgb25FcnJvciwgcGFyZW50SW5kZW50LCBzdGFydE9uTmV3bGluZSB9KSB7XG4gICAgbGV0IHNwYWNlQmVmb3JlID0gZmFsc2U7XG4gICAgbGV0IGF0TmV3bGluZSA9IHN0YXJ0T25OZXdsaW5lO1xuICAgIGxldCBoYXNTcGFjZSA9IHN0YXJ0T25OZXdsaW5lO1xuICAgIGxldCBjb21tZW50ID0gJyc7XG4gICAgbGV0IGNvbW1lbnRTZXAgPSAnJztcbiAgICBsZXQgaGFzTmV3bGluZSA9IGZhbHNlO1xuICAgIGxldCByZXFTcGFjZSA9IGZhbHNlO1xuICAgIGxldCB0YWIgPSBudWxsO1xuICAgIGxldCBhbmNob3IgPSBudWxsO1xuICAgIGxldCB0YWcgPSBudWxsO1xuICAgIGxldCBuZXdsaW5lQWZ0ZXJQcm9wID0gbnVsbDtcbiAgICBsZXQgY29tbWEgPSBudWxsO1xuICAgIGxldCBmb3VuZCA9IG51bGw7XG4gICAgbGV0IHN0YXJ0ID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2Vucykge1xuICAgICAgICBpZiAocmVxU3BhY2UpIHtcbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlICE9PSAnc3BhY2UnICYmXG4gICAgICAgICAgICAgICAgdG9rZW4udHlwZSAhPT0gJ25ld2xpbmUnICYmXG4gICAgICAgICAgICAgICAgdG9rZW4udHlwZSAhPT0gJ2NvbW1hJylcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLm9mZnNldCwgJ01JU1NJTkdfQ0hBUicsICdUYWdzIGFuZCBhbmNob3JzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgdG9rZW4gYnkgd2hpdGUgc3BhY2UnKTtcbiAgICAgICAgICAgIHJlcVNwYWNlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhYikge1xuICAgICAgICAgICAgaWYgKGF0TmV3bGluZSAmJiB0b2tlbi50eXBlICE9PSAnY29tbWVudCcgJiYgdG9rZW4udHlwZSAhPT0gJ25ld2xpbmUnKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcih0YWIsICdUQUJfQVNfSU5ERU5UJywgJ1RhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YWIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIC8vIEF0IHRoZSBkb2MgbGV2ZWwsIHRhYnMgYXQgbGluZSBzdGFydCBtYXkgYmUgcGFyc2VkXG4gICAgICAgICAgICAgICAgLy8gYXMgbGVhZGluZyB3aGl0ZSBzcGFjZSByYXRoZXIgdGhhbiBpbmRlbnRhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBJbiBhIGZsb3cgY29sbGVjdGlvbiwgb25seSB0aGUgcGFyc2VyIGhhbmRsZXMgaW5kZW50LlxuICAgICAgICAgICAgICAgIGlmICghZmxvdyAmJlxuICAgICAgICAgICAgICAgICAgICAoaW5kaWNhdG9yICE9PSAnZG9jLXN0YXJ0JyB8fCBuZXh0Py50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykgJiZcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uc291cmNlLmluY2x1ZGVzKCdcXHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0YWIgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc1NwYWNlKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTUlTU0lOR19DSEFSJywgJ0NvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IHRva2VuLnNvdXJjZS5zdWJzdHJpbmcoMSkgfHwgJyAnO1xuICAgICAgICAgICAgICAgIGlmICghY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IGNiO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCArPSBjb21tZW50U2VwICsgY2I7XG4gICAgICAgICAgICAgICAgY29tbWVudFNlcCA9ICcnO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgaWYgKGF0TmV3bGluZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgKz0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghZm91bmQgfHwgaW5kaWNhdG9yICE9PSAnc2VxLWl0ZW0taW5kJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBjb21tZW50U2VwICs9IHRva2VuLnNvdXJjZTtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGhhc05ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3IgfHwgdGFnKVxuICAgICAgICAgICAgICAgICAgICBuZXdsaW5lQWZ0ZXJQcm9wID0gdG9rZW47XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYW5jaG9yJzpcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnTVVMVElQTEVfQU5DSE9SUycsICdBIG5vZGUgY2FuIGhhdmUgYXQgbW9zdCBvbmUgYW5jaG9yJyk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuLnNvdXJjZS5lbmRzV2l0aCgnOicpKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLm9mZnNldCArIHRva2VuLnNvdXJjZS5sZW5ndGggLSAxLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBlbmRpbmcgaW4gOiBpcyBhbWJpZ3VvdXMnLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBhbmNob3IgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBzdGFydCA/PyAoc3RhcnQgPSB0b2tlbi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVxU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndGFnJzoge1xuICAgICAgICAgICAgICAgIGlmICh0YWcpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNVUxUSVBMRV9UQUdTJywgJ0Egbm9kZSBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB0YWcnKTtcbiAgICAgICAgICAgICAgICB0YWcgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBzdGFydCA/PyAoc3RhcnQgPSB0b2tlbi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIGF0TmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmVxU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBpbmRpY2F0b3I6XG4gICAgICAgICAgICAgICAgLy8gQ291bGQgaGVyZSBoYW5kbGUgcHJlY2VkaW5nIGNvbW1lbnRzIGRpZmZlcmVudGx5XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdCQURfUFJPUF9PUkRFUicsIGBBbmNob3JzIGFuZCB0YWdzIG11c3QgYmUgYWZ0ZXIgdGhlICR7dG9rZW4uc291cmNlfSBpbmRpY2F0b3JgKTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0b2tlbi5zb3VyY2V9IGluICR7ZmxvdyA/PyAnY29sbGVjdGlvbid9YCk7XG4gICAgICAgICAgICAgICAgZm91bmQgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICBhdE5ld2xpbmUgPVxuICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3IgPT09ICdzZXEtaXRlbS1pbmQnIHx8IGluZGljYXRvciA9PT0gJ2V4cGxpY2l0LWtleS1pbmQnO1xuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAsIGluICR7Zmxvd31gKTtcbiAgICAgICAgICAgICAgICAgICAgY29tbWEgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgYXROZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVsc2UgZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAke3Rva2VuLnR5cGV9IHRva2VuYCk7XG4gICAgICAgICAgICAgICAgYXROZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaGFzU3BhY2UgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsYXN0ID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBlbmQgPSBsYXN0ID8gbGFzdC5vZmZzZXQgKyBsYXN0LnNvdXJjZS5sZW5ndGggOiBvZmZzZXQ7XG4gICAgaWYgKHJlcVNwYWNlICYmXG4gICAgICAgIG5leHQgJiZcbiAgICAgICAgbmV4dC50eXBlICE9PSAnc3BhY2UnICYmXG4gICAgICAgIG5leHQudHlwZSAhPT0gJ25ld2xpbmUnICYmXG4gICAgICAgIG5leHQudHlwZSAhPT0gJ2NvbW1hJyAmJlxuICAgICAgICAobmV4dC50eXBlICE9PSAnc2NhbGFyJyB8fCBuZXh0LnNvdXJjZSAhPT0gJycpKSB7XG4gICAgICAgIG9uRXJyb3IobmV4dC5vZmZzZXQsICdNSVNTSU5HX0NIQVInLCAnVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlJyk7XG4gICAgfVxuICAgIGlmICh0YWIgJiZcbiAgICAgICAgKChhdE5ld2xpbmUgJiYgdGFiLmluZGVudCA8PSBwYXJlbnRJbmRlbnQpIHx8XG4gICAgICAgICAgICBuZXh0Py50eXBlID09PSAnYmxvY2stbWFwJyB8fFxuICAgICAgICAgICAgbmV4dD8udHlwZSA9PT0gJ2Jsb2NrLXNlcScpKVxuICAgICAgICBvbkVycm9yKHRhYiwgJ1RBQl9BU19JTkRFTlQnLCAnVGFicyBhcmUgbm90IGFsbG93ZWQgYXMgaW5kZW50YXRpb24nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBjb21tYSxcbiAgICAgICAgZm91bmQsXG4gICAgICAgIHNwYWNlQmVmb3JlLFxuICAgICAgICBjb21tZW50LFxuICAgICAgICBoYXNOZXdsaW5lLFxuICAgICAgICBhbmNob3IsXG4gICAgICAgIHRhZyxcbiAgICAgICAgbmV3bGluZUFmdGVyUHJvcCxcbiAgICAgICAgZW5kLFxuICAgICAgICBzdGFydDogc3RhcnQgPz8gZW5kXG4gICAgfTtcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZVByb3BzIH07XG4iLCJmdW5jdGlvbiBjb250YWluc05ld2xpbmUoa2V5KSB7XG4gICAgaWYgKCFrZXkpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHN3aXRjaCAoa2V5LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGlmIChrZXkuc291cmNlLmluY2x1ZGVzKCdcXG4nKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChrZXkuZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2Yga2V5LmVuZClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgZm9yIChjb25zdCBpdCBvZiBrZXkuaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIGl0LnN0YXJ0KVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3QudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGl0LnNlcClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChjb250YWluc05ld2xpbmUoaXQua2V5KSB8fCBjb250YWluc05ld2xpbmUoaXQudmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cblxuZXhwb3J0IHsgY29udGFpbnNOZXdsaW5lIH07XG4iLCJpbXBvcnQgeyBjb250YWluc05ld2xpbmUgfSBmcm9tICcuL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyc7XG5cbmZ1bmN0aW9uIGZsb3dJbmRlbnRDaGVjayhpbmRlbnQsIGZjLCBvbkVycm9yKSB7XG4gICAgaWYgKGZjPy50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICBjb25zdCBlbmQgPSBmYy5lbmRbMF07XG4gICAgICAgIGlmIChlbmQuaW5kZW50ID09PSBpbmRlbnQgJiZcbiAgICAgICAgICAgIChlbmQuc291cmNlID09PSAnXScgfHwgZW5kLnNvdXJjZSA9PT0gJ30nKSAmJlxuICAgICAgICAgICAgY29udGFpbnNOZXdsaW5lKGZjKSkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gJ0Zsb3cgZW5kIGluZGljYXRvciBzaG91bGQgYmUgbW9yZSBpbmRlbnRlZCB0aGFuIHBhcmVudCc7XG4gICAgICAgICAgICBvbkVycm9yKGVuZCwgJ0JBRF9JTkRFTlQnLCBtc2csIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBmbG93SW5kZW50Q2hlY2sgfTtcbiIsImltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuXG5mdW5jdGlvbiBtYXBJbmNsdWRlcyhjdHgsIGl0ZW1zLCBzZWFyY2gpIHtcbiAgICBjb25zdCB7IHVuaXF1ZUtleXMgfSA9IGN0eC5vcHRpb25zO1xuICAgIGlmICh1bmlxdWVLZXlzID09PSBmYWxzZSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGlzRXF1YWwgPSB0eXBlb2YgdW5pcXVlS2V5cyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHVuaXF1ZUtleXNcbiAgICAgICAgOiAoYSwgYikgPT4gYSA9PT0gYiB8fCAoaXNTY2FsYXIoYSkgJiYgaXNTY2FsYXIoYikgJiYgYS52YWx1ZSA9PT0gYi52YWx1ZSk7XG4gICAgcmV0dXJuIGl0ZW1zLnNvbWUocGFpciA9PiBpc0VxdWFsKHBhaXIua2V5LCBzZWFyY2gpKTtcbn1cblxuZXhwb3J0IHsgbWFwSW5jbHVkZXMgfTtcbiIsImltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gJy4vcmVzb2x2ZS1wcm9wcy5qcyc7XG5pbXBvcnQgeyBjb250YWluc05ld2xpbmUgfSBmcm9tICcuL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyc7XG5pbXBvcnQgeyBmbG93SW5kZW50Q2hlY2sgfSBmcm9tICcuL3V0aWwtZmxvdy1pbmRlbnQtY2hlY2suanMnO1xuaW1wb3J0IHsgbWFwSW5jbHVkZXMgfSBmcm9tICcuL3V0aWwtbWFwLWluY2x1ZGVzLmpzJztcblxuY29uc3Qgc3RhcnRDb2xNc2cgPSAnQWxsIG1hcHBpbmcgaXRlbXMgbXVzdCBzdGFydCBhdCB0aGUgc2FtZSBjb2x1bW4nO1xuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrTWFwKHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSwgY3R4LCBibSwgb25FcnJvciwgdGFnKSB7XG4gICAgY29uc3QgTm9kZUNsYXNzID0gdGFnPy5ub2RlQ2xhc3MgPz8gWUFNTE1hcDtcbiAgICBjb25zdCBtYXAgPSBuZXcgTm9kZUNsYXNzKGN0eC5zY2hlbWEpO1xuICAgIGlmIChjdHguYXRSb290KVxuICAgICAgICBjdHguYXRSb290ID0gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9IGJtLm9mZnNldDtcbiAgICBsZXQgY29tbWVudEVuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCBjb2xsSXRlbSBvZiBibS5pdGVtcykge1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBrZXksIHNlcCwgdmFsdWUgfSA9IGNvbGxJdGVtO1xuICAgICAgICAvLyBrZXkgcHJvcGVydGllc1xuICAgICAgICBjb25zdCBrZXlQcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgaW5kaWNhdG9yOiAnZXhwbGljaXQta2V5LWluZCcsXG4gICAgICAgICAgICBuZXh0OiBrZXkgPz8gc2VwPy5bMF0sXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgcGFyZW50SW5kZW50OiBibS5pbmRlbnQsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgaW1wbGljaXRLZXkgPSAha2V5UHJvcHMuZm91bmQ7XG4gICAgICAgIGlmIChpbXBsaWNpdEtleSkge1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkudHlwZSA9PT0gJ2Jsb2NrLXNlcScpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkxPQ0tfQVNfSU1QTElDSVRfS0VZJywgJ0EgYmxvY2sgc2VxdWVuY2UgbWF5IG5vdCBiZSB1c2VkIGFzIGFuIGltcGxpY2l0IG1hcCBrZXknKTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmICgnaW5kZW50JyBpbiBrZXkgJiYga2V5LmluZGVudCAhPT0gYm0uaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCBzdGFydENvbE1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWtleVByb3BzLmFuY2hvciAmJiAha2V5UHJvcHMudGFnICYmICFzZXApIHtcbiAgICAgICAgICAgICAgICBjb21tZW50RW5kID0ga2V5UHJvcHMuZW5kO1xuICAgICAgICAgICAgICAgIGlmIChrZXlQcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXAuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5jb21tZW50ICs9ICdcXG4nICsga2V5UHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmNvbW1lbnQgPSBrZXlQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChrZXlQcm9wcy5uZXdsaW5lQWZ0ZXJQcm9wIHx8IGNvbnRhaW5zTmV3bGluZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcihrZXkgPz8gc3RhcnRbc3RhcnQubGVuZ3RoIC0gMV0sICdNVUxUSUxJTkVfSU1QTElDSVRfS0VZJywgJ0ltcGxpY2l0IGtleXMgbmVlZCB0byBiZSBvbiBhIHNpbmdsZSBsaW5lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2V5UHJvcHMuZm91bmQ/LmluZGVudCAhPT0gYm0uaW5kZW50KSB7XG4gICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JBRF9JTkRFTlQnLCBzdGFydENvbE1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8ga2V5IHZhbHVlXG4gICAgICAgIGN0eC5hdEtleSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGtleVN0YXJ0ID0ga2V5UHJvcHMuZW5kO1xuICAgICAgICBjb25zdCBrZXlOb2RlID0ga2V5XG4gICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwga2V5LCBrZXlQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgIDogY29tcG9zZUVtcHR5Tm9kZShjdHgsIGtleVN0YXJ0LCBzdGFydCwgbnVsbCwga2V5UHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICBmbG93SW5kZW50Q2hlY2soYm0uaW5kZW50LCBrZXksIG9uRXJyb3IpO1xuICAgICAgICBjdHguYXRLZXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKG1hcEluY2x1ZGVzKGN0eCwgbWFwLml0ZW1zLCBrZXlOb2RlKSlcbiAgICAgICAgICAgIG9uRXJyb3Ioa2V5U3RhcnQsICdEVVBMSUNBVEVfS0VZJywgJ01hcCBrZXlzIG11c3QgYmUgdW5pcXVlJyk7XG4gICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXNcbiAgICAgICAgY29uc3QgdmFsdWVQcm9wcyA9IHJlc29sdmVQcm9wcyhzZXAgPz8gW10sIHtcbiAgICAgICAgICAgIGluZGljYXRvcjogJ21hcC12YWx1ZS1pbmQnLFxuICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICBvZmZzZXQ6IGtleU5vZGUucmFuZ2VbMl0sXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgcGFyZW50SW5kZW50OiBibS5pbmRlbnQsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogIWtleSB8fCBrZXkudHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcidcbiAgICAgICAgfSk7XG4gICAgICAgIG9mZnNldCA9IHZhbHVlUHJvcHMuZW5kO1xuICAgICAgICBpZiAodmFsdWVQcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0S2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlPy50eXBlID09PSAnYmxvY2stbWFwJyAmJiAhdmFsdWVQcm9wcy5oYXNOZXdsaW5lKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ0JMT0NLX0FTX0lNUExJQ0lUX0tFWScsICdOZXN0ZWQgbWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBhY3QgbWFwcGluZ3MnKTtcbiAgICAgICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMuc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgICAgIGtleVByb3BzLnN0YXJ0IDwgdmFsdWVQcm9wcy5mb3VuZC5vZmZzZXQgLSAxMDI0KVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKGtleU5vZGUucmFuZ2UsICdLRVlfT1ZFUl8xMDI0X0NIQVJTJywgJ1RoZSA6IGluZGljYXRvciBtdXN0IGJlIGF0IG1vc3QgMTAyNCBjaGFycyBhZnRlciB0aGUgc3RhcnQgb2YgYW4gaW1wbGljaXQgYmxvY2sgbWFwcGluZyBrZXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZhbHVlIHZhbHVlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBvZmZzZXQsIHNlcCwgbnVsbCwgdmFsdWVQcm9wcywgb25FcnJvcik7XG4gICAgICAgICAgICBpZiAoY3R4LnNjaGVtYS5jb21wYXQpXG4gICAgICAgICAgICAgICAgZmxvd0luZGVudENoZWNrKGJtLmluZGVudCwgdmFsdWUsIG9uRXJyb3IpO1xuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlLnJhbmdlWzJdO1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IG5ldyBQYWlyKGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBtYXAuaXRlbXMucHVzaChwYWlyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGtleSB3aXRoIG5vIHZhbHVlXG4gICAgICAgICAgICBpZiAoaW1wbGljaXRLZXkpXG4gICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnTUlTU0lOR19DSEFSJywgJ0ltcGxpY2l0IG1hcCBrZXlzIG5lZWQgdG8gYmUgZm9sbG93ZWQgYnkgbWFwIHZhbHVlcycpO1xuICAgICAgICAgICAgaWYgKHZhbHVlUHJvcHMuY29tbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXlOb2RlLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCArPSAnXFxuJyArIHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGtleU5vZGUuY29tbWVudCA9IHZhbHVlUHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBuZXcgUGFpcihrZXlOb2RlKTtcbiAgICAgICAgICAgIGlmIChjdHgub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zKVxuICAgICAgICAgICAgICAgIHBhaXIuc3JjVG9rZW4gPSBjb2xsSXRlbTtcbiAgICAgICAgICAgIG1hcC5pdGVtcy5wdXNoKHBhaXIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChjb21tZW50RW5kICYmIGNvbW1lbnRFbmQgPCBvZmZzZXQpXG4gICAgICAgIG9uRXJyb3IoY29tbWVudEVuZCwgJ0lNUE9TU0lCTEUnLCAnTWFwIGNvbW1lbnQgd2l0aCB0cmFpbGluZyBjb250ZW50Jyk7XG4gICAgbWFwLnJhbmdlID0gW2JtLm9mZnNldCwgb2Zmc2V0LCBjb21tZW50RW5kID8/IG9mZnNldF07XG4gICAgcmV0dXJuIG1hcDtcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZUJsb2NrTWFwIH07XG4iLCJpbXBvcnQgeyBZQU1MU2VxIH0gZnJvbSAnLi4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuaW1wb3J0IHsgZmxvd0luZGVudENoZWNrIH0gZnJvbSAnLi91dGlsLWZsb3ctaW5kZW50LWNoZWNrLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrU2VxKHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSwgY3R4LCBicywgb25FcnJvciwgdGFnKSB7XG4gICAgY29uc3QgTm9kZUNsYXNzID0gdGFnPy5ub2RlQ2xhc3MgPz8gWUFNTFNlcTtcbiAgICBjb25zdCBzZXEgPSBuZXcgTm9kZUNsYXNzKGN0eC5zY2hlbWEpO1xuICAgIGlmIChjdHguYXRSb290KVxuICAgICAgICBjdHguYXRSb290ID0gZmFsc2U7XG4gICAgaWYgKGN0eC5hdEtleSlcbiAgICAgICAgY3R4LmF0S2V5ID0gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9IGJzLm9mZnNldDtcbiAgICBsZXQgY29tbWVudEVuZCA9IG51bGw7XG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCB2YWx1ZSB9IG9mIGJzLml0ZW1zKSB7XG4gICAgICAgIGNvbnN0IHByb3BzID0gcmVzb2x2ZVByb3BzKHN0YXJ0LCB7XG4gICAgICAgICAgICBpbmRpY2F0b3I6ICdzZXEtaXRlbS1pbmQnLFxuICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgcGFyZW50SW5kZW50OiBicy5pbmRlbnQsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgaWYgKHByb3BzLmFuY2hvciB8fCBwcm9wcy50YWcgfHwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWU/LnR5cGUgPT09ICdibG9jay1zZXEnKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHByb3BzLmVuZCwgJ0JBRF9JTkRFTlQnLCAnQWxsIHNlcXVlbmNlIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uJyk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCwgJ01JU1NJTkdfQ0hBUicsICdTZXF1ZW5jZSBpdGVtIHdpdGhvdXQgLSBpbmRpY2F0b3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRFbmQgPSBwcm9wcy5lbmQ7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIHNlcS5jb21tZW50ID0gcHJvcHMuY29tbWVudDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub2RlID0gdmFsdWVcbiAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgcHJvcHMsIG9uRXJyb3IpXG4gICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBwcm9wcy5lbmQsIHN0YXJ0LCBudWxsLCBwcm9wcywgb25FcnJvcik7XG4gICAgICAgIGlmIChjdHguc2NoZW1hLmNvbXBhdClcbiAgICAgICAgICAgIGZsb3dJbmRlbnRDaGVjayhicy5pbmRlbnQsIHZhbHVlLCBvbkVycm9yKTtcbiAgICAgICAgb2Zmc2V0ID0gbm9kZS5yYW5nZVsyXTtcbiAgICAgICAgc2VxLml0ZW1zLnB1c2gobm9kZSk7XG4gICAgfVxuICAgIHNlcS5yYW5nZSA9IFticy5vZmZzZXQsIG9mZnNldCwgY29tbWVudEVuZCA/PyBvZmZzZXRdO1xuICAgIHJldHVybiBzZXE7XG59XG5cbmV4cG9ydCB7IHJlc29sdmVCbG9ja1NlcSB9O1xuIiwiZnVuY3Rpb24gcmVzb2x2ZUVuZChlbmQsIG9mZnNldCwgcmVxU3BhY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGlmIChlbmQpIHtcbiAgICAgICAgbGV0IGhhc1NwYWNlID0gZmFsc2U7XG4gICAgICAgIGxldCBzZXAgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCB0b2tlbiBvZiBlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc291cmNlLCB0eXBlIH0gPSB0b2tlbjtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3BhY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVxU3BhY2UgJiYgIWhhc1NwYWNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ01JU1NJTkdfQ0hBUicsICdDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gc291cmNlLnN1YnN0cmluZygxKSB8fCAnICc7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjYjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCArPSBzZXAgKyBjYjtcbiAgICAgICAgICAgICAgICAgICAgc2VwID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXAgKz0gc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBoYXNTcGFjZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgYFVuZXhwZWN0ZWQgJHt0eXBlfSBhdCBub2RlIGVuZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29tbWVudCwgb2Zmc2V0IH07XG59XG5cbmV4cG9ydCB7IHJlc29sdmVFbmQgfTtcbiIsImltcG9ydCB7IGlzUGFpciB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFBhaXIgfSBmcm9tICcuLi9ub2Rlcy9QYWlyLmpzJztcbmltcG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MTWFwLmpzJztcbmltcG9ydCB7IFlBTUxTZXEgfSBmcm9tICcuLi9ub2Rlcy9ZQU1MU2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVFbmQgfSBmcm9tICcuL3Jlc29sdmUtZW5kLmpzJztcbmltcG9ydCB7IHJlc29sdmVQcm9wcyB9IGZyb20gJy4vcmVzb2x2ZS1wcm9wcy5qcyc7XG5pbXBvcnQgeyBjb250YWluc05ld2xpbmUgfSBmcm9tICcuL3V0aWwtY29udGFpbnMtbmV3bGluZS5qcyc7XG5pbXBvcnQgeyBtYXBJbmNsdWRlcyB9IGZyb20gJy4vdXRpbC1tYXAtaW5jbHVkZXMuanMnO1xuXG5jb25zdCBibG9ja01zZyA9ICdCbG9jayBjb2xsZWN0aW9ucyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIGZsb3cgY29sbGVjdGlvbnMnO1xuY29uc3QgaXNCbG9jayA9ICh0b2tlbikgPT4gdG9rZW4gJiYgKHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnKTtcbmZ1bmN0aW9uIHJlc29sdmVGbG93Q29sbGVjdGlvbih7IGNvbXBvc2VOb2RlLCBjb21wb3NlRW1wdHlOb2RlIH0sIGN0eCwgZmMsIG9uRXJyb3IsIHRhZykge1xuICAgIGNvbnN0IGlzTWFwID0gZmMuc3RhcnQuc291cmNlID09PSAneyc7XG4gICAgY29uc3QgZmNOYW1lID0gaXNNYXAgPyAnZmxvdyBtYXAnIDogJ2Zsb3cgc2VxdWVuY2UnO1xuICAgIGNvbnN0IE5vZGVDbGFzcyA9ICh0YWc/Lm5vZGVDbGFzcyA/PyAoaXNNYXAgPyBZQU1MTWFwIDogWUFNTFNlcSkpO1xuICAgIGNvbnN0IGNvbGwgPSBuZXcgTm9kZUNsYXNzKGN0eC5zY2hlbWEpO1xuICAgIGNvbGwuZmxvdyA9IHRydWU7XG4gICAgY29uc3QgYXRSb290ID0gY3R4LmF0Um9vdDtcbiAgICBpZiAoYXRSb290KVxuICAgICAgICBjdHguYXRSb290ID0gZmFsc2U7XG4gICAgaWYgKGN0eC5hdEtleSlcbiAgICAgICAgY3R4LmF0S2V5ID0gZmFsc2U7XG4gICAgbGV0IG9mZnNldCA9IGZjLm9mZnNldCArIGZjLnN0YXJ0LnNvdXJjZS5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmYy5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjb2xsSXRlbSA9IGZjLml0ZW1zW2ldO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBrZXksIHNlcCwgdmFsdWUgfSA9IGNvbGxJdGVtO1xuICAgICAgICBjb25zdCBwcm9wcyA9IHJlc29sdmVQcm9wcyhzdGFydCwge1xuICAgICAgICAgICAgZmxvdzogZmNOYW1lLFxuICAgICAgICAgICAgaW5kaWNhdG9yOiAnZXhwbGljaXQta2V5LWluZCcsXG4gICAgICAgICAgICBuZXh0OiBrZXkgPz8gc2VwPy5bMF0sXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBvbkVycm9yLFxuICAgICAgICAgICAgcGFyZW50SW5kZW50OiBmYy5pbmRlbnQsXG4gICAgICAgICAgICBzdGFydE9uTmV3bGluZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcHJvcHMuZm91bmQpIHtcbiAgICAgICAgICAgIGlmICghcHJvcHMuYW5jaG9yICYmICFwcm9wcy50YWcgJiYgIXNlcCAmJiAhdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCAmJiBwcm9wcy5jb21tYSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5jb21tYSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAsIGluICR7ZmNOYW1lfWApO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBmYy5pdGVtcy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHByb3BzLnN0YXJ0LCAnVU5FWFBFQ1RFRF9UT0tFTicsIGBVbmV4cGVjdGVkIGVtcHR5IGl0ZW0gaW4gJHtmY05hbWV9YCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbGwuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCArPSAnXFxuJyArIHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGwuY29tbWVudCA9IHByb3BzLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9mZnNldCA9IHByb3BzLmVuZDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNNYXAgJiYgY3R4Lm9wdGlvbnMuc3RyaWN0ICYmIGNvbnRhaW5zTmV3bGluZShrZXkpKVxuICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5LCAvLyBjaGVja2VkIGJ5IGNvbnRhaW5zTmV3bGluZSgpXG4gICAgICAgICAgICAgICAgJ01VTFRJTElORV9JTVBMSUNJVF9LRVknLCAnSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMuY29tbWEpXG4gICAgICAgICAgICAgICAgb25FcnJvcihwcm9wcy5jb21tYSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5leHBlY3RlZCAsIGluICR7ZmNOYW1lfWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFwcm9wcy5jb21tYSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKHByb3BzLnN0YXJ0LCAnTUlTU0lOR19DSEFSJywgYE1pc3NpbmcgLCBiZXR3ZWVuICR7ZmNOYW1lfSBpdGVtc2ApO1xuICAgICAgICAgICAgaWYgKHByb3BzLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgcHJldkl0ZW1Db21tZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgbG9vcDogZm9yIChjb25zdCBzdCBvZiBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZJdGVtQ29tbWVudCA9IHN0LnNvdXJjZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJldkl0ZW1Db21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gY29sbC5pdGVtc1tjb2xsLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYWlyKHByZXYpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHByZXYudmFsdWUgPz8gcHJldi5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2LmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNvbW1lbnQgKz0gJ1xcbicgKyBwcmV2SXRlbUNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYuY29tbWVudCA9IHByZXZJdGVtQ29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMuY29tbWVudCA9IHByb3BzLmNvbW1lbnQuc3Vic3RyaW5nKHByZXZJdGVtQ29tbWVudC5sZW5ndGggKyAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc01hcCAmJiAhc2VwICYmICFwcm9wcy5mb3VuZCkge1xuICAgICAgICAgICAgLy8gaXRlbSBpcyBhIHZhbHVlIGluIGEgc2VxXG4gICAgICAgICAgICAvLyDihpIga2V5ICYgc2VwIGFyZSBlbXB0eSwgc3RhcnQgZG9lcyBub3QgaW5jbHVkZSA/IG9yIDpcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTm9kZSA9IHZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBwcm9wcy5lbmQsIHNlcCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgICAgICAgICAgY29sbC5pdGVtcy5wdXNoKHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBvZmZzZXQgPSB2YWx1ZU5vZGUucmFuZ2VbMl07XG4gICAgICAgICAgICBpZiAoaXNCbG9jayh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZU5vZGUucmFuZ2UsICdCTE9DS19JTl9GTE9XJywgYmxvY2tNc2cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaXRlbSBpcyBhIGtleSt2YWx1ZSBwYWlyXG4gICAgICAgICAgICAvLyBrZXkgdmFsdWVcbiAgICAgICAgICAgIGN0eC5hdEtleSA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBrZXlTdGFydCA9IHByb3BzLmVuZDtcbiAgICAgICAgICAgIGNvbnN0IGtleU5vZGUgPSBrZXlcbiAgICAgICAgICAgICAgICA/IGNvbXBvc2VOb2RlKGN0eCwga2V5LCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCBrZXlTdGFydCwgc3RhcnQsIG51bGwsIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChpc0Jsb2NrKGtleSkpXG4gICAgICAgICAgICAgICAgb25FcnJvcihrZXlOb2RlLnJhbmdlLCAnQkxPQ0tfSU5fRkxPVycsIGJsb2NrTXNnKTtcbiAgICAgICAgICAgIGN0eC5hdEtleSA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gdmFsdWUgcHJvcGVydGllc1xuICAgICAgICAgICAgY29uc3QgdmFsdWVQcm9wcyA9IHJlc29sdmVQcm9wcyhzZXAgPz8gW10sIHtcbiAgICAgICAgICAgICAgICBmbG93OiBmY05hbWUsXG4gICAgICAgICAgICAgICAgaW5kaWNhdG9yOiAnbWFwLXZhbHVlLWluZCcsXG4gICAgICAgICAgICAgICAgbmV4dDogdmFsdWUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBrZXlOb2RlLnJhbmdlWzJdLFxuICAgICAgICAgICAgICAgIG9uRXJyb3IsXG4gICAgICAgICAgICAgICAgcGFyZW50SW5kZW50OiBmYy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgc3RhcnRPbk5ld2xpbmU6IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVByb3BzLmZvdW5kKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc01hcCAmJiAhcHJvcHMuZm91bmQgJiYgY3R4Lm9wdGlvbnMuc3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdCA9PT0gdmFsdWVQcm9wcy5mb3VuZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LnR5cGUgPT09ICduZXdsaW5lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHN0LCAnTVVMVElMSU5FX0lNUExJQ0lUX0tFWScsICdJbXBsaWNpdCBrZXlzIG9mIGZsb3cgc2VxdWVuY2UgcGFpcnMgbmVlZCB0byBiZSBvbiBhIHNpbmdsZSBsaW5lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BzLnN0YXJ0IDwgdmFsdWVQcm9wcy5mb3VuZC5vZmZzZXQgLSAxMDI0KVxuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZVByb3BzLmZvdW5kLCAnS0VZX09WRVJfMTAyNF9DSEFSUycsICdUaGUgOiBpbmRpY2F0b3IgbXVzdCBiZSBhdCBtb3N0IDEwMjQgY2hhcnMgYWZ0ZXIgdGhlIHN0YXJ0IG9mIGFuIGltcGxpY2l0IGZsb3cgc2VxdWVuY2Uga2V5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoJ3NvdXJjZScgaW4gdmFsdWUgJiYgdmFsdWUuc291cmNlPy5bMF0gPT09ICc6JylcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZSwgJ01JU1NJTkdfQ0hBUicsIGBNaXNzaW5nIHNwYWNlIGFmdGVyIDogaW4gJHtmY05hbWV9YCk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yKHZhbHVlUHJvcHMuc3RhcnQsICdNSVNTSU5HX0NIQVInLCBgTWlzc2luZyAsIG9yIDogYmV0d2VlbiAke2ZjTmFtZX0gaXRlbXNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHZhbHVlIHZhbHVlXG4gICAgICAgICAgICBjb25zdCB2YWx1ZU5vZGUgPSB2YWx1ZVxuICAgICAgICAgICAgICAgID8gY29tcG9zZU5vZGUoY3R4LCB2YWx1ZSwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICA6IHZhbHVlUHJvcHMuZm91bmRcbiAgICAgICAgICAgICAgICAgICAgPyBjb21wb3NlRW1wdHlOb2RlKGN0eCwgdmFsdWVQcm9wcy5lbmQsIHNlcCwgbnVsbCwgdmFsdWVQcm9wcywgb25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgaWYgKHZhbHVlTm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc0Jsb2NrKHZhbHVlKSlcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvcih2YWx1ZU5vZGUucmFuZ2UsICdCTE9DS19JTl9GTE9XJywgYmxvY2tNc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWVQcm9wcy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleU5vZGUuY29tbWVudClcbiAgICAgICAgICAgICAgICAgICAga2V5Tm9kZS5jb21tZW50ICs9ICdcXG4nICsgdmFsdWVQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAga2V5Tm9kZS5jb21tZW50ID0gdmFsdWVQcm9wcy5jb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcGFpciA9IG5ldyBQYWlyKGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgICAgICBpZiAoY3R4Lm9wdGlvbnMua2VlcFNvdXJjZVRva2VucylcbiAgICAgICAgICAgICAgICBwYWlyLnNyY1Rva2VuID0gY29sbEl0ZW07XG4gICAgICAgICAgICBpZiAoaXNNYXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb2xsO1xuICAgICAgICAgICAgICAgIGlmIChtYXBJbmNsdWRlcyhjdHgsIG1hcC5pdGVtcywga2V5Tm9kZSkpXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3Ioa2V5U3RhcnQsICdEVVBMSUNBVEVfS0VZJywgJ01hcCBrZXlzIG11c3QgYmUgdW5pcXVlJyk7XG4gICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgWUFNTE1hcChjdHguc2NoZW1hKTtcbiAgICAgICAgICAgICAgICBtYXAuZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2gocGFpcik7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kUmFuZ2UgPSAodmFsdWVOb2RlID8/IGtleU5vZGUpLnJhbmdlO1xuICAgICAgICAgICAgICAgIG1hcC5yYW5nZSA9IFtrZXlOb2RlLnJhbmdlWzBdLCBlbmRSYW5nZVsxXSwgZW5kUmFuZ2VbMl1dO1xuICAgICAgICAgICAgICAgIGNvbGwuaXRlbXMucHVzaChtYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ID0gdmFsdWVOb2RlID8gdmFsdWVOb2RlLnJhbmdlWzJdIDogdmFsdWVQcm9wcy5lbmQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWRFbmQgPSBpc01hcCA/ICd9JyA6ICddJztcbiAgICBjb25zdCBbY2UsIC4uLmVlXSA9IGZjLmVuZDtcbiAgICBsZXQgY2VQb3MgPSBvZmZzZXQ7XG4gICAgaWYgKGNlPy5zb3VyY2UgPT09IGV4cGVjdGVkRW5kKVxuICAgICAgICBjZVBvcyA9IGNlLm9mZnNldCArIGNlLnNvdXJjZS5sZW5ndGg7XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmY05hbWVbMF0udG9VcHBlckNhc2UoKSArIGZjTmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIGNvbnN0IG1zZyA9IGF0Um9vdFxuICAgICAgICAgICAgPyBgJHtuYW1lfSBtdXN0IGVuZCB3aXRoIGEgJHtleHBlY3RlZEVuZH1gXG4gICAgICAgICAgICA6IGAke25hbWV9IGluIGJsb2NrIGNvbGxlY3Rpb24gbXVzdCBiZSBzdWZmaWNpZW50bHkgaW5kZW50ZWQgYW5kIGVuZCB3aXRoIGEgJHtleHBlY3RlZEVuZH1gO1xuICAgICAgICBvbkVycm9yKG9mZnNldCwgYXRSb290ID8gJ01JU1NJTkdfQ0hBUicgOiAnQkFEX0lOREVOVCcsIG1zZyk7XG4gICAgICAgIGlmIChjZSAmJiBjZS5zb3VyY2UubGVuZ3RoICE9PSAxKVxuICAgICAgICAgICAgZWUudW5zaGlmdChjZSk7XG4gICAgfVxuICAgIGlmIChlZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGVuZCA9IHJlc29sdmVFbmQoZWUsIGNlUG9zLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgICAgICBpZiAoZW5kLmNvbW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChjb2xsLmNvbW1lbnQpXG4gICAgICAgICAgICAgICAgY29sbC5jb21tZW50ICs9ICdcXG4nICsgZW5kLmNvbW1lbnQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgY29sbC5jb21tZW50ID0gZW5kLmNvbW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29sbC5yYW5nZSA9IFtmYy5vZmZzZXQsIGNlUG9zLCBlbmQub2Zmc2V0XTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbGwucmFuZ2UgPSBbZmMub2Zmc2V0LCBjZVBvcywgY2VQb3NdO1xuICAgIH1cbiAgICByZXR1cm4gY29sbDtcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZUZsb3dDb2xsZWN0aW9uIH07XG4iLCJpbXBvcnQgeyBpc05vZGUgfSBmcm9tICcuLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgWUFNTE1hcCB9IGZyb20gJy4uL25vZGVzL1lBTUxNYXAuanMnO1xuaW1wb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4uL25vZGVzL1lBTUxTZXEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUJsb2NrTWFwIH0gZnJvbSAnLi9yZXNvbHZlLWJsb2NrLW1hcC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmxvY2tTZXEgfSBmcm9tICcuL3Jlc29sdmUtYmxvY2stc2VxLmpzJztcbmltcG9ydCB7IHJlc29sdmVGbG93Q29sbGVjdGlvbiB9IGZyb20gJy4vcmVzb2x2ZS1mbG93LWNvbGxlY3Rpb24uanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlQ29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnTmFtZSwgdGFnKSB7XG4gICAgY29uc3QgY29sbCA9IHRva2VuLnR5cGUgPT09ICdibG9jay1tYXAnXG4gICAgICAgID8gcmVzb2x2ZUJsb2NrTWFwKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWcpXG4gICAgICAgIDogdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNlcSdcbiAgICAgICAgICAgID8gcmVzb2x2ZUJsb2NrU2VxKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWcpXG4gICAgICAgICAgICA6IHJlc29sdmVGbG93Q29sbGVjdGlvbihDTiwgY3R4LCB0b2tlbiwgb25FcnJvciwgdGFnKTtcbiAgICBjb25zdCBDb2xsID0gY29sbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBJZiB3ZSBnb3QgYSB0YWdOYW1lIG1hdGNoaW5nIHRoZSBjbGFzcywgb3IgdGhlIHRhZyBuYW1lIGlzICchJyxcbiAgICAvLyB0aGVuIHVzZSB0aGUgdGFnTmFtZSBmcm9tIHRoZSBub2RlIGNsYXNzIHVzZWQgdG8gY3JlYXRlIGl0LlxuICAgIGlmICh0YWdOYW1lID09PSAnIScgfHwgdGFnTmFtZSA9PT0gQ29sbC50YWdOYW1lKSB7XG4gICAgICAgIGNvbGwudGFnID0gQ29sbC50YWdOYW1lO1xuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB9XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIGNvbGwudGFnID0gdGFnTmFtZTtcbiAgICByZXR1cm4gY29sbDtcbn1cbmZ1bmN0aW9uIGNvbXBvc2VDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBwcm9wcywgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZ1Rva2VuID0gcHJvcHMudGFnO1xuICAgIGNvbnN0IHRhZ05hbWUgPSAhdGFnVG9rZW5cbiAgICAgICAgPyBudWxsXG4gICAgICAgIDogY3R4LmRpcmVjdGl2ZXMudGFnTmFtZSh0YWdUb2tlbi5zb3VyY2UsIG1zZyA9PiBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgbXNnKSk7XG4gICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnKSB7XG4gICAgICAgIGNvbnN0IHsgYW5jaG9yLCBuZXdsaW5lQWZ0ZXJQcm9wOiBubCB9ID0gcHJvcHM7XG4gICAgICAgIGNvbnN0IGxhc3RQcm9wID0gYW5jaG9yICYmIHRhZ1Rva2VuXG4gICAgICAgICAgICA/IGFuY2hvci5vZmZzZXQgPiB0YWdUb2tlbi5vZmZzZXRcbiAgICAgICAgICAgICAgICA/IGFuY2hvclxuICAgICAgICAgICAgICAgIDogdGFnVG9rZW5cbiAgICAgICAgICAgIDogKGFuY2hvciA/PyB0YWdUb2tlbik7XG4gICAgICAgIGlmIChsYXN0UHJvcCAmJiAoIW5sIHx8IG5sLm9mZnNldCA8IGxhc3RQcm9wLm9mZnNldCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnTWlzc2luZyBuZXdsaW5lIGFmdGVyIGJsb2NrIHNlcXVlbmNlIHByb3BzJztcbiAgICAgICAgICAgIG9uRXJyb3IobGFzdFByb3AsICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBleHBUeXBlID0gdG9rZW4udHlwZSA9PT0gJ2Jsb2NrLW1hcCdcbiAgICAgICAgPyAnbWFwJ1xuICAgICAgICA6IHRva2VuLnR5cGUgPT09ICdibG9jay1zZXEnXG4gICAgICAgICAgICA/ICdzZXEnXG4gICAgICAgICAgICA6IHRva2VuLnN0YXJ0LnNvdXJjZSA9PT0gJ3snXG4gICAgICAgICAgICAgICAgPyAnbWFwJ1xuICAgICAgICAgICAgICAgIDogJ3NlcSc7XG4gICAgLy8gc2hvcnRjdXQ6IGNoZWNrIGlmIGl0J3MgYSBnZW5lcmljIFlBTUxNYXAgb3IgWUFNTFNlcVxuICAgIC8vIGJlZm9yZSBqdW1waW5nIGludG8gdGhlIGN1c3RvbSB0YWcgbG9naWMuXG4gICAgaWYgKCF0YWdUb2tlbiB8fFxuICAgICAgICAhdGFnTmFtZSB8fFxuICAgICAgICB0YWdOYW1lID09PSAnIScgfHxcbiAgICAgICAgKHRhZ05hbWUgPT09IFlBTUxNYXAudGFnTmFtZSAmJiBleHBUeXBlID09PSAnbWFwJykgfHxcbiAgICAgICAgKHRhZ05hbWUgPT09IFlBTUxTZXEudGFnTmFtZSAmJiBleHBUeXBlID09PSAnc2VxJykpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWdOYW1lKTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IGN0eC5zY2hlbWEudGFncy5maW5kKHQgPT4gdC50YWcgPT09IHRhZ05hbWUgJiYgdC5jb2xsZWN0aW9uID09PSBleHBUeXBlKTtcbiAgICBpZiAoIXRhZykge1xuICAgICAgICBjb25zdCBrdCA9IGN0eC5zY2hlbWEua25vd25UYWdzW3RhZ05hbWVdO1xuICAgICAgICBpZiAoa3Q/LmNvbGxlY3Rpb24gPT09IGV4cFR5cGUpIHtcbiAgICAgICAgICAgIGN0eC5zY2hlbWEudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGt0LCB7IGRlZmF1bHQ6IGZhbHNlIH0pKTtcbiAgICAgICAgICAgIHRhZyA9IGt0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGt0KSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcih0YWdUb2tlbiwgJ0JBRF9DT0xMRUNUSU9OX1RZUEUnLCBgJHtrdC50YWd9IHVzZWQgZm9yICR7ZXhwVHlwZX0gY29sbGVjdGlvbiwgYnV0IGV4cGVjdHMgJHtrdC5jb2xsZWN0aW9uID8/ICdzY2FsYXInfWAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIGBVbnJlc29sdmVkIHRhZzogJHt0YWdOYW1lfWAsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xsZWN0aW9uKENOLCBjdHgsIHRva2VuLCBvbkVycm9yLCB0YWdOYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb2xsID0gcmVzb2x2ZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIG9uRXJyb3IsIHRhZ05hbWUsIHRhZyk7XG4gICAgY29uc3QgcmVzID0gdGFnLnJlc29sdmU/Lihjb2xsLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZyksIGN0eC5vcHRpb25zKSA/PyBjb2xsO1xuICAgIGNvbnN0IG5vZGUgPSBpc05vZGUocmVzKVxuICAgICAgICA/IHJlc1xuICAgICAgICA6IG5ldyBTY2FsYXIocmVzKTtcbiAgICBub2RlLnJhbmdlID0gY29sbC5yYW5nZTtcbiAgICBub2RlLnRhZyA9IHRhZ05hbWU7XG4gICAgaWYgKHRhZz8uZm9ybWF0KVxuICAgICAgICBub2RlLmZvcm1hdCA9IHRhZy5mb3JtYXQ7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmV4cG9ydCB7IGNvbXBvc2VDb2xsZWN0aW9uIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlQmxvY2tTY2FsYXIoY3R4LCBzY2FsYXIsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBzdGFydCA9IHNjYWxhci5vZmZzZXQ7XG4gICAgY29uc3QgaGVhZGVyID0gcGFyc2VCbG9ja1NjYWxhckhlYWRlcihzY2FsYXIsIGN0eC5vcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgaWYgKCFoZWFkZXIpXG4gICAgICAgIHJldHVybiB7IHZhbHVlOiAnJywgdHlwZTogbnVsbCwgY29tbWVudDogJycsIHJhbmdlOiBbc3RhcnQsIHN0YXJ0LCBzdGFydF0gfTtcbiAgICBjb25zdCB0eXBlID0gaGVhZGVyLm1vZGUgPT09ICc+JyA/IFNjYWxhci5CTE9DS19GT0xERUQgOiBTY2FsYXIuQkxPQ0tfTElURVJBTDtcbiAgICBjb25zdCBsaW5lcyA9IHNjYWxhci5zb3VyY2UgPyBzcGxpdExpbmVzKHNjYWxhci5zb3VyY2UpIDogW107XG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBlbmQgb2YgY29udGVudCAmIHN0YXJ0IG9mIGNob21waW5nXG4gICAgbGV0IGNob21wU3RhcnQgPSBsaW5lcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBsaW5lc1tpXVsxXTtcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09ICcnIHx8IGNvbnRlbnQgPT09ICdcXHInKVxuICAgICAgICAgICAgY2hvbXBTdGFydCA9IGk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBzaG9ydGN1dCBmb3IgZW1wdHkgY29udGVudHNcbiAgICBpZiAoY2hvbXBTdGFydCA9PT0gMCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5jaG9tcCA9PT0gJysnICYmIGxpbmVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gJ1xcbicucmVwZWF0KE1hdGgubWF4KDEsIGxpbmVzLmxlbmd0aCAtIDEpKVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgbGV0IGVuZCA9IHN0YXJ0ICsgaGVhZGVyLmxlbmd0aDtcbiAgICAgICAgaWYgKHNjYWxhci5zb3VyY2UpXG4gICAgICAgICAgICBlbmQgKz0gc2NhbGFyLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7IHZhbHVlLCB0eXBlLCBjb21tZW50OiBoZWFkZXIuY29tbWVudCwgcmFuZ2U6IFtzdGFydCwgZW5kLCBlbmRdIH07XG4gICAgfVxuICAgIC8vIGZpbmQgdGhlIGluZGVudGF0aW9uIGxldmVsIHRvIHRyaW0gZnJvbSBzdGFydFxuICAgIGxldCB0cmltSW5kZW50ID0gc2NhbGFyLmluZGVudCArIGhlYWRlci5pbmRlbnQ7XG4gICAgbGV0IG9mZnNldCA9IHNjYWxhci5vZmZzZXQgKyBoZWFkZXIubGVuZ3RoO1xuICAgIGxldCBjb250ZW50U3RhcnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hvbXBTdGFydDsgKytpKSB7XG4gICAgICAgIGNvbnN0IFtpbmRlbnQsIGNvbnRlbnRdID0gbGluZXNbaV07XG4gICAgICAgIGlmIChjb250ZW50ID09PSAnJyB8fCBjb250ZW50ID09PSAnXFxyJykge1xuICAgICAgICAgICAgaWYgKGhlYWRlci5pbmRlbnQgPT09IDAgJiYgaW5kZW50Lmxlbmd0aCA+IHRyaW1JbmRlbnQpXG4gICAgICAgICAgICAgICAgdHJpbUluZGVudCA9IGluZGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoaW5kZW50Lmxlbmd0aCA8IHRyaW1JbmRlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Jsb2NrIHNjYWxhcnMgd2l0aCBtb3JlLWluZGVudGVkIGxlYWRpbmcgZW1wdHkgbGluZXMgbXVzdCB1c2UgYW4gZXhwbGljaXQgaW5kZW50YXRpb24gaW5kaWNhdG9yJztcbiAgICAgICAgICAgICAgICBvbkVycm9yKG9mZnNldCArIGluZGVudC5sZW5ndGgsICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChoZWFkZXIuaW5kZW50ID09PSAwKVxuICAgICAgICAgICAgICAgIHRyaW1JbmRlbnQgPSBpbmRlbnQubGVuZ3RoO1xuICAgICAgICAgICAgY29udGVudFN0YXJ0ID0gaTtcbiAgICAgICAgICAgIGlmICh0cmltSW5kZW50ID09PSAwICYmICFjdHguYXRSb290KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdCbG9jayBzY2FsYXIgdmFsdWVzIGluIGNvbGxlY3Rpb25zIG11c3QgYmUgaW5kZW50ZWQnO1xuICAgICAgICAgICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0lOREVOVCcsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2Zmc2V0ICs9IGluZGVudC5sZW5ndGggKyBjb250ZW50Lmxlbmd0aCArIDE7XG4gICAgfVxuICAgIC8vIGluY2x1ZGUgdHJhaWxpbmcgbW9yZS1pbmRlbnRlZCBlbXB0eSBsaW5lcyBpbiBjb250ZW50XG4gICAgZm9yIChsZXQgaSA9IGxpbmVzLmxlbmd0aCAtIDE7IGkgPj0gY2hvbXBTdGFydDsgLS1pKSB7XG4gICAgICAgIGlmIChsaW5lc1tpXVswXS5sZW5ndGggPiB0cmltSW5kZW50KVxuICAgICAgICAgICAgY2hvbXBTdGFydCA9IGkgKyAxO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSAnJztcbiAgICBsZXQgc2VwID0gJyc7XG4gICAgbGV0IHByZXZNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAvLyBsZWFkaW5nIHdoaXRlc3BhY2UgaXMga2VwdCBpbnRhY3RcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRTdGFydDsgKytpKVxuICAgICAgICB2YWx1ZSArPSBsaW5lc1tpXVswXS5zbGljZSh0cmltSW5kZW50KSArICdcXG4nO1xuICAgIGZvciAobGV0IGkgPSBjb250ZW50U3RhcnQ7IGkgPCBjaG9tcFN0YXJ0OyArK2kpIHtcbiAgICAgICAgbGV0IFtpbmRlbnQsIGNvbnRlbnRdID0gbGluZXNbaV07XG4gICAgICAgIG9mZnNldCArPSBpbmRlbnQubGVuZ3RoICsgY29udGVudC5sZW5ndGggKyAxO1xuICAgICAgICBjb25zdCBjcmxmID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdID09PSAnXFxyJztcbiAgICAgICAgaWYgKGNybGYpXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgwLCAtMSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiBhbHJlYWR5IGNhdWdodCBpbiBsZXhlciAqL1xuICAgICAgICBpZiAoY29udGVudCAmJiBpbmRlbnQubGVuZ3RoIDwgdHJpbUluZGVudCkge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gaGVhZGVyLmluZGVudFxuICAgICAgICAgICAgICAgID8gJ2V4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvcidcbiAgICAgICAgICAgICAgICA6ICdmaXJzdCBsaW5lJztcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgQmxvY2sgc2NhbGFyIGxpbmVzIG11c3Qgbm90IGJlIGxlc3MgaW5kZW50ZWQgdGhhbiB0aGVpciAke3NyY31gO1xuICAgICAgICAgICAgb25FcnJvcihvZmZzZXQgLSBjb250ZW50Lmxlbmd0aCAtIChjcmxmID8gMiA6IDEpLCAnQkFEX0lOREVOVCcsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgaW5kZW50ID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09IFNjYWxhci5CTE9DS19MSVRFUkFMKSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBpbmRlbnQuc2xpY2UodHJpbUluZGVudCkgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaW5kZW50Lmxlbmd0aCA+IHRyaW1JbmRlbnQgfHwgY29udGVudFswXSA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIG1vcmUtaW5kZW50ZWQgY29udGVudCB3aXRoaW4gYSBmb2xkZWQgYmxvY2tcbiAgICAgICAgICAgIGlmIChzZXAgPT09ICcgJylcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgICAgIGVsc2UgaWYgKCFwcmV2TW9yZUluZGVudGVkICYmIHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcblxcbic7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBpbmRlbnQuc2xpY2UodHJpbUluZGVudCkgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgICAgICBwcmV2TW9yZUluZGVudGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjb250ZW50ID09PSAnJykge1xuICAgICAgICAgICAgLy8gZW1wdHkgbGluZVxuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgc2VwID0gJ1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSArPSBzZXAgKyBjb250ZW50O1xuICAgICAgICAgICAgc2VwID0gJyAnO1xuICAgICAgICAgICAgcHJldk1vcmVJbmRlbnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAoaGVhZGVyLmNob21wKSB7XG4gICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNob21wU3RhcnQ7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnXFxuJyArIGxpbmVzW2ldWzBdLnNsaWNlKHRyaW1JbmRlbnQpO1xuICAgICAgICAgICAgaWYgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdICE9PSAnXFxuJylcbiAgICAgICAgICAgICAgICB2YWx1ZSArPSAnXFxuJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFsdWUgKz0gJ1xcbic7XG4gICAgfVxuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgaGVhZGVyLmxlbmd0aCArIHNjYWxhci5zb3VyY2UubGVuZ3RoO1xuICAgIHJldHVybiB7IHZhbHVlLCB0eXBlLCBjb21tZW50OiBoZWFkZXIuY29tbWVudCwgcmFuZ2U6IFtzdGFydCwgZW5kLCBlbmRdIH07XG59XG5mdW5jdGlvbiBwYXJzZUJsb2NrU2NhbGFySGVhZGVyKHsgb2Zmc2V0LCBwcm9wcyB9LCBzdHJpY3QsIG9uRXJyb3IpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICBpZiAocHJvcHNbMF0udHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKSB7XG4gICAgICAgIG9uRXJyb3IocHJvcHNbMF0sICdJTVBPU1NJQkxFJywgJ0Jsb2NrIHNjYWxhciBoZWFkZXIgbm90IGZvdW5kJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHNvdXJjZSB9ID0gcHJvcHNbMF07XG4gICAgY29uc3QgbW9kZSA9IHNvdXJjZVswXTtcbiAgICBsZXQgaW5kZW50ID0gMDtcbiAgICBsZXQgY2hvbXAgPSAnJztcbiAgICBsZXQgZXJyb3IgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBjaCA9IHNvdXJjZVtpXTtcbiAgICAgICAgaWYgKCFjaG9tcCAmJiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSlcbiAgICAgICAgICAgIGNob21wID0gY2g7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbiA9IE51bWJlcihjaCk7XG4gICAgICAgICAgICBpZiAoIWluZGVudCAmJiBuKVxuICAgICAgICAgICAgICAgIGluZGVudCA9IG47XG4gICAgICAgICAgICBlbHNlIGlmIChlcnJvciA9PT0gLTEpXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBvZmZzZXQgKyBpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvciAhPT0gLTEpXG4gICAgICAgIG9uRXJyb3IoZXJyb3IsICdVTkVYUEVDVEVEX1RPS0VOJywgYEJsb2NrIHNjYWxhciBoZWFkZXIgaW5jbHVkZXMgZXh0cmEgY2hhcmFjdGVyczogJHtzb3VyY2V9YCk7XG4gICAgbGV0IGhhc1NwYWNlID0gZmFsc2U7XG4gICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICBsZXQgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHByb3BzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcHJvcHNbaV07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBsZW5ndGggKz0gdG9rZW4uc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIWhhc1NwYWNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyc7XG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgY29tbWVudCA9IHRva2VuLnNvdXJjZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1VORVhQRUNURURfVE9LRU4nLCB0b2tlbi5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBsZW5ndGggKz0gdG9rZW4uc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBVbmV4cGVjdGVkIHRva2VuIGluIGJsb2NrIHNjYWxhciBoZWFkZXI6ICR7dG9rZW4udHlwZX1gO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdHMgPSB0b2tlbi5zb3VyY2U7XG4gICAgICAgICAgICAgICAgaWYgKHRzICYmIHR5cGVvZiB0cyA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCArPSB0cy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgbW9kZSwgaW5kZW50LCBjaG9tcCwgY29tbWVudCwgbGVuZ3RoIH07XG59XG4vKiogQHJldHVybnMgQXJyYXkgb2YgbGluZXMgc3BsaXQgdXAgYXMgYFtpbmRlbnQsIGNvbnRlbnRdYCAqL1xuZnVuY3Rpb24gc3BsaXRMaW5lcyhzb3VyY2UpIHtcbiAgICBjb25zdCBzcGxpdCA9IHNvdXJjZS5zcGxpdCgvXFxuKCAqKS8pO1xuICAgIGNvbnN0IGZpcnN0ID0gc3BsaXRbMF07XG4gICAgY29uc3QgbSA9IGZpcnN0Lm1hdGNoKC9eKCAqKS8pO1xuICAgIGNvbnN0IGxpbmUwID0gbT8uWzFdXG4gICAgICAgID8gW21bMV0sIGZpcnN0LnNsaWNlKG1bMV0ubGVuZ3RoKV1cbiAgICAgICAgOiBbJycsIGZpcnN0XTtcbiAgICBjb25zdCBsaW5lcyA9IFtsaW5lMF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdC5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgbGluZXMucHVzaChbc3BsaXRbaV0sIHNwbGl0W2kgKyAxXV0pO1xuICAgIHJldHVybiBsaW5lcztcbn1cblxuZXhwb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH07XG4iLCJpbXBvcnQgeyBTY2FsYXIgfSBmcm9tICcuLi9ub2Rlcy9TY2FsYXIuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiByZXNvbHZlRmxvd1NjYWxhcihzY2FsYXIsIHN0cmljdCwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgb2Zmc2V0LCB0eXBlLCBzb3VyY2UsIGVuZCB9ID0gc2NhbGFyO1xuICAgIGxldCBfdHlwZTtcbiAgICBsZXQgdmFsdWU7XG4gICAgY29uc3QgX29uRXJyb3IgPSAocmVsLCBjb2RlLCBtc2cpID0+IG9uRXJyb3Iob2Zmc2V0ICsgcmVsLCBjb2RlLCBtc2cpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUExBSU47XG4gICAgICAgICAgICB2YWx1ZSA9IHBsYWluVmFsdWUoc291cmNlLCBfb25FcnJvcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgX3R5cGUgPSBTY2FsYXIuUVVPVEVfU0lOR0xFO1xuICAgICAgICAgICAgdmFsdWUgPSBzaW5nbGVRdW90ZWRWYWx1ZShzb3VyY2UsIF9vbkVycm9yKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICBfdHlwZSA9IFNjYWxhci5RVU9URV9ET1VCTEU7XG4gICAgICAgICAgICB2YWx1ZSA9IGRvdWJsZVF1b3RlZFZhbHVlKHNvdXJjZSwgX29uRXJyb3IpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBvbkVycm9yKHNjYWxhciwgJ1VORVhQRUNURURfVE9LRU4nLCBgRXhwZWN0ZWQgYSBmbG93IHNjYWxhciB2YWx1ZSwgYnV0IGZvdW5kOiAke3R5cGV9YCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvbW1lbnQ6ICcnLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBbb2Zmc2V0LCBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoLCBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoXVxuICAgICAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBzdHJpY3QsIG9uRXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICB0eXBlOiBfdHlwZSxcbiAgICAgICAgY29tbWVudDogcmUuY29tbWVudCxcbiAgICAgICAgcmFuZ2U6IFtvZmZzZXQsIHZhbHVlRW5kLCByZS5vZmZzZXRdXG4gICAgfTtcbn1cbmZ1bmN0aW9uIHBsYWluVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgbGV0IGJhZENoYXIgPSAnJztcbiAgICBzd2l0Y2ggKHNvdXJjZVswXSkge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdhIHRhYiBjaGFyYWN0ZXInO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgYmFkQ2hhciA9ICdmbG93IGluZGljYXRvciBjaGFyYWN0ZXIgLCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICBiYWRDaGFyID0gJ2RpcmVjdGl2ZSBpbmRpY2F0b3IgY2hhcmFjdGVyICUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+Jzoge1xuICAgICAgICAgICAgYmFkQ2hhciA9IGBibG9jayBzY2FsYXIgaW5kaWNhdG9yICR7c291cmNlWzBdfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAJzpcbiAgICAgICAgY2FzZSAnYCc6IHtcbiAgICAgICAgICAgIGJhZENoYXIgPSBgcmVzZXJ2ZWQgY2hhcmFjdGVyICR7c291cmNlWzBdfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFkQ2hhcilcbiAgICAgICAgb25FcnJvcigwLCAnQkFEX1NDQUxBUl9TVEFSVCcsIGBQbGFpbiB2YWx1ZSBjYW5ub3Qgc3RhcnQgd2l0aCAke2JhZENoYXJ9YCk7XG4gICAgcmV0dXJuIGZvbGRMaW5lcyhzb3VyY2UpO1xufVxuZnVuY3Rpb24gc2luZ2xlUXVvdGVkVmFsdWUoc291cmNlLCBvbkVycm9yKSB7XG4gICAgaWYgKHNvdXJjZVtzb3VyY2UubGVuZ3RoIC0gMV0gIT09IFwiJ1wiIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsIFwiTWlzc2luZyBjbG9zaW5nICdxdW90ZVwiKTtcbiAgICByZXR1cm4gZm9sZExpbmVzKHNvdXJjZS5zbGljZSgxLCAtMSkpLnJlcGxhY2UoLycnL2csIFwiJ1wiKTtcbn1cbmZ1bmN0aW9uIGZvbGRMaW5lcyhzb3VyY2UpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmVnYXRpdmUgbG9va2JlaGluZCBoZXJlIGFuZCBpbiB0aGUgYHJlYCBSZWdFeHAgaXMgdG9cbiAgICAgKiBwcmV2ZW50IGNhdXNpbmcgYSBwb2x5bm9taWFsIHNlYXJjaCB0aW1lIGluIGNlcnRhaW4gY2FzZXMuXG4gICAgICpcbiAgICAgKiBUaGUgdHJ5LWNhdGNoIGlzIGZvciBTYWZhcmksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHlldDpcbiAgICAgKiBodHRwczovL2Nhbml1c2UuY29tL2pzLXJlZ2V4cC1sb29rYmVoaW5kXG4gICAgICovXG4gICAgbGV0IGZpcnN0LCBsaW5lO1xuICAgIHRyeSB7XG4gICAgICAgIGZpcnN0ID0gbmV3IFJlZ0V4cCgnKC4qPykoPzwhWyBcXHRdKVsgXFx0XSpcXHI/XFxuJywgJ3N5Jyk7XG4gICAgICAgIGxpbmUgPSBuZXcgUmVnRXhwKCdbIFxcdF0qKC4qPykoPzooPzwhWyBcXHRdKVsgXFx0XSopP1xccj9cXG4nLCAnc3knKTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICBmaXJzdCA9IC8oLio/KVsgXFx0XSpcXHI/XFxuL3N5O1xuICAgICAgICBsaW5lID0gL1sgXFx0XSooLio/KVsgXFx0XSpcXHI/XFxuL3N5O1xuICAgIH1cbiAgICBsZXQgbWF0Y2ggPSBmaXJzdC5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaClcbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICBsZXQgcmVzID0gbWF0Y2hbMV07XG4gICAgbGV0IHNlcCA9ICcgJztcbiAgICBsZXQgcG9zID0gZmlyc3QubGFzdEluZGV4O1xuICAgIGxpbmUubGFzdEluZGV4ID0gcG9zO1xuICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lLmV4ZWMoc291cmNlKSkpIHtcbiAgICAgICAgaWYgKG1hdGNoWzFdID09PSAnJykge1xuICAgICAgICAgICAgaWYgKHNlcCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgcmVzICs9IHNlcDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzZXAgPSAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcyArPSBzZXAgKyBtYXRjaFsxXTtcbiAgICAgICAgICAgIHNlcCA9ICcgJztcbiAgICAgICAgfVxuICAgICAgICBwb3MgPSBsaW5lLmxhc3RJbmRleDtcbiAgICB9XG4gICAgY29uc3QgbGFzdCA9IC9bIFxcdF0qKC4qKS9zeTtcbiAgICBsYXN0Lmxhc3RJbmRleCA9IHBvcztcbiAgICBtYXRjaCA9IGxhc3QuZXhlYyhzb3VyY2UpO1xuICAgIHJldHVybiByZXMgKyBzZXAgKyAobWF0Y2g/LlsxXSA/PyAnJyk7XG59XG5mdW5jdGlvbiBkb3VibGVRdW90ZWRWYWx1ZShzb3VyY2UsIG9uRXJyb3IpIHtcbiAgICBsZXQgcmVzID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIGNvbnN0IGNoID0gc291cmNlW2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtpICsgMV0gPT09ICdcXG4nKVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9sZCwgb2Zmc2V0IH0gPSBmb2xkTmV3bGluZShzb3VyY2UsIGkpO1xuICAgICAgICAgICAgcmVzICs9IGZvbGQ7XG4gICAgICAgICAgICBpID0gb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gc291cmNlWysraV07XG4gICAgICAgICAgICBjb25zdCBjYyA9IGVzY2FwZUNvZGVzW25leHRdO1xuICAgICAgICAgICAgaWYgKGNjKVxuICAgICAgICAgICAgICAgIHJlcyArPSBjYztcbiAgICAgICAgICAgIGVsc2UgaWYgKG5leHQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIG5ld2xpbmVzLCBidXQgc3RpbGwgdHJpbSB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlW2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ1xccicgJiYgc291cmNlW2kgKyAxXSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGVzY2FwZWQgQ1JMRiBuZXdsaW5lcywgYnV0IHN0aWxsIHRyaW0gdGhlIGZvbGxvd2luZyBsaW5lXG4gICAgICAgICAgICAgICAgbmV4dCA9IHNvdXJjZVsrK2kgKyAxXTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgICAgICBuZXh0ID0gc291cmNlWysraSArIDFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PT0gJ3gnIHx8IG5leHQgPT09ICd1JyB8fCBuZXh0ID09PSAnVScpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBuZXh0ID09PSAneCcgPyAyIDogbmV4dCA9PT0gJ3UnID8gNCA6IDg7XG4gICAgICAgICAgICAgICAgcmVzICs9IHBhcnNlQ2hhckNvZGUoc291cmNlLCBpICsgMSwgbGVuZ3RoLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpICs9IGxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIoaSAtIDEsIDIpO1xuICAgICAgICAgICAgICAgIG9uRXJyb3IoaSAtIDEsICdCQURfRFFfRVNDQVBFJywgYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7cmF3fWApO1xuICAgICAgICAgICAgICAgIHJlcyArPSByYXc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcpIHtcbiAgICAgICAgICAgIC8vIHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAgICAgY29uc3Qgd3NTdGFydCA9IGk7XG4gICAgICAgICAgICBsZXQgbmV4dCA9IHNvdXJjZVtpICsgMV07XG4gICAgICAgICAgICB3aGlsZSAobmV4dCA9PT0gJyAnIHx8IG5leHQgPT09ICdcXHQnKVxuICAgICAgICAgICAgICAgIG5leHQgPSBzb3VyY2VbKytpICsgMV07XG4gICAgICAgICAgICBpZiAobmV4dCAhPT0gJ1xcbicgJiYgIShuZXh0ID09PSAnXFxyJyAmJiBzb3VyY2VbaSArIDJdID09PSAnXFxuJykpXG4gICAgICAgICAgICAgICAgcmVzICs9IGkgPiB3c1N0YXJ0ID8gc291cmNlLnNsaWNlKHdzU3RhcnQsIGkgKyAxKSA6IGNoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzICs9IGNoO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2Vbc291cmNlLmxlbmd0aCAtIDFdICE9PSAnXCInIHx8IHNvdXJjZS5sZW5ndGggPT09IDEpXG4gICAgICAgIG9uRXJyb3Ioc291cmNlLmxlbmd0aCwgJ01JU1NJTkdfQ0hBUicsICdNaXNzaW5nIGNsb3NpbmcgXCJxdW90ZScpO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEZvbGQgYSBzaW5nbGUgbmV3bGluZSBpbnRvIGEgc3BhY2UsIG11bHRpcGxlIG5ld2xpbmVzIHRvIE4gLSAxIG5ld2xpbmVzLlxuICogUHJlc3VtZXMgYHNvdXJjZVtvZmZzZXRdID09PSAnXFxuJ2BcbiAqL1xuZnVuY3Rpb24gZm9sZE5ld2xpbmUoc291cmNlLCBvZmZzZXQpIHtcbiAgICBsZXQgZm9sZCA9ICcnO1xuICAgIGxldCBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB3aGlsZSAoY2ggPT09ICcgJyB8fCBjaCA9PT0gJ1xcdCcgfHwgY2ggPT09ICdcXG4nIHx8IGNoID09PSAnXFxyJykge1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIHNvdXJjZVtvZmZzZXQgKyAyXSAhPT0gJ1xcbicpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIGZvbGQgKz0gJ1xcbic7XG4gICAgICAgIG9mZnNldCArPSAxO1xuICAgICAgICBjaCA9IHNvdXJjZVtvZmZzZXQgKyAxXTtcbiAgICB9XG4gICAgaWYgKCFmb2xkKVxuICAgICAgICBmb2xkID0gJyAnO1xuICAgIHJldHVybiB7IGZvbGQsIG9mZnNldCB9O1xufVxuY29uc3QgZXNjYXBlQ29kZXMgPSB7XG4gICAgJzAnOiAnXFwwJywgLy8gbnVsbCBjaGFyYWN0ZXJcbiAgICBhOiAnXFx4MDcnLCAvLyBiZWxsIGNoYXJhY3RlclxuICAgIGI6ICdcXGInLCAvLyBiYWNrc3BhY2VcbiAgICBlOiAnXFx4MWInLCAvLyBlc2NhcGUgY2hhcmFjdGVyXG4gICAgZjogJ1xcZicsIC8vIGZvcm0gZmVlZFxuICAgIG46ICdcXG4nLCAvLyBsaW5lIGZlZWRcbiAgICByOiAnXFxyJywgLy8gY2FycmlhZ2UgcmV0dXJuXG4gICAgdDogJ1xcdCcsIC8vIGhvcml6b250YWwgdGFiXG4gICAgdjogJ1xcdicsIC8vIHZlcnRpY2FsIHRhYlxuICAgIE46ICdcXHUwMDg1JywgLy8gVW5pY29kZSBuZXh0IGxpbmVcbiAgICBfOiAnXFx1MDBhMCcsIC8vIFVuaWNvZGUgbm9uLWJyZWFraW5nIHNwYWNlXG4gICAgTDogJ1xcdTIwMjgnLCAvLyBVbmljb2RlIGxpbmUgc2VwYXJhdG9yXG4gICAgUDogJ1xcdTIwMjknLCAvLyBVbmljb2RlIHBhcmFncmFwaCBzZXBhcmF0b3JcbiAgICAnICc6ICcgJyxcbiAgICAnXCInOiAnXCInLFxuICAgICcvJzogJy8nLFxuICAgICdcXFxcJzogJ1xcXFwnLFxuICAgICdcXHQnOiAnXFx0J1xufTtcbmZ1bmN0aW9uIHBhcnNlQ2hhckNvZGUoc291cmNlLCBvZmZzZXQsIGxlbmd0aCwgb25FcnJvcikge1xuICAgIGNvbnN0IGNjID0gc291cmNlLnN1YnN0cihvZmZzZXQsIGxlbmd0aCk7XG4gICAgY29uc3Qgb2sgPSBjYy5sZW5ndGggPT09IGxlbmd0aCAmJiAvXlswLTlhLWZBLUZdKyQvLnRlc3QoY2MpO1xuICAgIGNvbnN0IGNvZGUgPSBvayA/IHBhcnNlSW50KGNjLCAxNikgOiBOYU47XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGUpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHJhdyA9IHNvdXJjZS5zdWJzdHIob2Zmc2V0IC0gMiwgbGVuZ3RoICsgMik7XG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0IC0gMiwgJ0JBRF9EUV9FU0NBUEUnLCBgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtyYXd9YCk7XG4gICAgICAgIHJldHVybiByYXc7XG4gICAgfVxufVxuXG5leHBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9O1xuIiwiaW1wb3J0IHsgaXNTY2FsYXIsIFNDQUxBUiB9IGZyb20gJy4uL25vZGVzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFNjYWxhciB9IGZyb20gJy4uL25vZGVzL1NjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQmxvY2tTY2FsYXIgfSBmcm9tICcuL3Jlc29sdmUtYmxvY2stc2NhbGFyLmpzJztcbmltcG9ydCB7IHJlc29sdmVGbG93U2NhbGFyIH0gZnJvbSAnLi9yZXNvbHZlLWZsb3ctc2NhbGFyLmpzJztcblxuZnVuY3Rpb24gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWdUb2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHsgdmFsdWUsIHR5cGUsIGNvbW1lbnQsIHJhbmdlIH0gPSB0b2tlbi50eXBlID09PSAnYmxvY2stc2NhbGFyJ1xuICAgICAgICA/IHJlc29sdmVCbG9ja1NjYWxhcihjdHgsIHRva2VuLCBvbkVycm9yKVxuICAgICAgICA6IHJlc29sdmVGbG93U2NhbGFyKHRva2VuLCBjdHgub3B0aW9ucy5zdHJpY3QsIG9uRXJyb3IpO1xuICAgIGNvbnN0IHRhZ05hbWUgPSB0YWdUb2tlblxuICAgICAgICA/IGN0eC5kaXJlY3RpdmVzLnRhZ05hbWUodGFnVG9rZW4uc291cmNlLCBtc2cgPT4gb25FcnJvcih0YWdUb2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZykpXG4gICAgICAgIDogbnVsbDtcbiAgICBsZXQgdGFnO1xuICAgIGlmIChjdHgub3B0aW9ucy5zdHJpbmdLZXlzICYmIGN0eC5hdEtleSkge1xuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgfVxuICAgIGVsc2UgaWYgKHRhZ05hbWUpXG4gICAgICAgIHRhZyA9IGZpbmRTY2FsYXJUYWdCeU5hbWUoY3R4LnNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKTtcbiAgICBlbHNlIGlmICh0b2tlbi50eXBlID09PSAnc2NhbGFyJylcbiAgICAgICAgdGFnID0gZmluZFNjYWxhclRhZ0J5VGVzdChjdHgsIHZhbHVlLCB0b2tlbiwgb25FcnJvcik7XG4gICAgZWxzZVxuICAgICAgICB0YWcgPSBjdHguc2NoZW1hW1NDQUxBUl07XG4gICAgbGV0IHNjYWxhcjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSB0YWcucmVzb2x2ZSh2YWx1ZSwgbXNnID0+IG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpLCBjdHgub3B0aW9ucyk7XG4gICAgICAgIHNjYWxhciA9IGlzU2NhbGFyKHJlcykgPyByZXMgOiBuZXcgU2NhbGFyKHJlcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIG9uRXJyb3IodGFnVG9rZW4gPz8gdG9rZW4sICdUQUdfUkVTT0xWRV9GQUlMRUQnLCBtc2cpO1xuICAgICAgICBzY2FsYXIgPSBuZXcgU2NhbGFyKHZhbHVlKTtcbiAgICB9XG4gICAgc2NhbGFyLnJhbmdlID0gcmFuZ2U7XG4gICAgc2NhbGFyLnNvdXJjZSA9IHZhbHVlO1xuICAgIGlmICh0eXBlKVxuICAgICAgICBzY2FsYXIudHlwZSA9IHR5cGU7XG4gICAgaWYgKHRhZ05hbWUpXG4gICAgICAgIHNjYWxhci50YWcgPSB0YWdOYW1lO1xuICAgIGlmICh0YWcuZm9ybWF0KVxuICAgICAgICBzY2FsYXIuZm9ybWF0ID0gdGFnLmZvcm1hdDtcbiAgICBpZiAoY29tbWVudClcbiAgICAgICAgc2NhbGFyLmNvbW1lbnQgPSBjb21tZW50O1xuICAgIHJldHVybiBzY2FsYXI7XG59XG5mdW5jdGlvbiBmaW5kU2NhbGFyVGFnQnlOYW1lKHNjaGVtYSwgdmFsdWUsIHRhZ05hbWUsIHRhZ1Rva2VuLCBvbkVycm9yKSB7XG4gICAgaWYgKHRhZ05hbWUgPT09ICchJylcbiAgICAgICAgcmV0dXJuIHNjaGVtYVtTQ0FMQVJdOyAvLyBub24tc3BlY2lmaWMgdGFnXG4gICAgY29uc3QgbWF0Y2hXaXRoVGVzdCA9IFtdO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHNjaGVtYS50YWdzKSB7XG4gICAgICAgIGlmICghdGFnLmNvbGxlY3Rpb24gJiYgdGFnLnRhZyA9PT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgaWYgKHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0KVxuICAgICAgICAgICAgICAgIG1hdGNoV2l0aFRlc3QucHVzaCh0YWcpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbWF0Y2hXaXRoVGVzdClcbiAgICAgICAgaWYgKHRhZy50ZXN0Py50ZXN0KHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiB0YWc7XG4gICAgY29uc3Qga3QgPSBzY2hlbWEua25vd25UYWdzW3RhZ05hbWVdO1xuICAgIGlmIChrdCAmJiAha3QuY29sbGVjdGlvbikge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUga25vd24gdGFnIGlzIGF2YWlsYWJsZSBmb3Igc3RyaW5naWZ5aW5nLFxuICAgICAgICAvLyBidXQgZG9lcyBub3QgZ2V0IHVzZWQgYnkgZGVmYXVsdC5cbiAgICAgICAgc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LCBrdCwgeyBkZWZhdWx0OiBmYWxzZSwgdGVzdDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgcmV0dXJuIGt0O1xuICAgIH1cbiAgICBvbkVycm9yKHRhZ1Rva2VuLCAnVEFHX1JFU09MVkVfRkFJTEVEJywgYFVucmVzb2x2ZWQgdGFnOiAke3RhZ05hbWV9YCwgdGFnTmFtZSAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpO1xuICAgIHJldHVybiBzY2hlbWFbU0NBTEFSXTtcbn1cbmZ1bmN0aW9uIGZpbmRTY2FsYXJUYWdCeVRlc3QoeyBhdEtleSwgZGlyZWN0aXZlcywgc2NoZW1hIH0sIHZhbHVlLCB0b2tlbiwgb25FcnJvcikge1xuICAgIGNvbnN0IHRhZyA9IHNjaGVtYS50YWdzLmZpbmQodGFnID0+ICh0YWcuZGVmYXVsdCA9PT0gdHJ1ZSB8fCAoYXRLZXkgJiYgdGFnLmRlZmF1bHQgPT09ICdrZXknKSkgJiZcbiAgICAgICAgdGFnLnRlc3Q/LnRlc3QodmFsdWUpKSB8fCBzY2hlbWFbU0NBTEFSXTtcbiAgICBpZiAoc2NoZW1hLmNvbXBhdCkge1xuICAgICAgICBjb25zdCBjb21wYXQgPSBzY2hlbWEuY29tcGF0LmZpbmQodGFnID0+IHRhZy5kZWZhdWx0ICYmIHRhZy50ZXN0Py50ZXN0KHZhbHVlKSkgPz9cbiAgICAgICAgICAgIHNjaGVtYVtTQ0FMQVJdO1xuICAgICAgICBpZiAodGFnLnRhZyAhPT0gY29tcGF0LnRhZykge1xuICAgICAgICAgICAgY29uc3QgdHMgPSBkaXJlY3RpdmVzLnRhZ1N0cmluZyh0YWcudGFnKTtcbiAgICAgICAgICAgIGNvbnN0IGNzID0gZGlyZWN0aXZlcy50YWdTdHJpbmcoY29tcGF0LnRhZyk7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgVmFsdWUgbWF5IGJlIHBhcnNlZCBhcyBlaXRoZXIgJHt0c30gb3IgJHtjc31gO1xuICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ1RBR19SRVNPTFZFX0ZBSUxFRCcsIG1zZywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbn1cblxuZXhwb3J0IHsgY29tcG9zZVNjYWxhciB9O1xuIiwiZnVuY3Rpb24gZW1wdHlTY2FsYXJQb3NpdGlvbihvZmZzZXQsIGJlZm9yZSwgcG9zKSB7XG4gICAgaWYgKGJlZm9yZSkge1xuICAgICAgICBwb3MgPz8gKHBvcyA9IGJlZm9yZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gcG9zIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgIGxldCBzdCA9IGJlZm9yZVtpXTtcbiAgICAgICAgICAgIHN3aXRjaCAoc3QudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC09IHN0LnNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIGFuIGVtcHR5IHNjYWxhciBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGFzdCBub24tZW1wdHlcbiAgICAgICAgICAgIC8vIG5vZGUsIGJ1dCBpdCdzIG1vcmUgdXNlZnVsIHRvIHBsYWNlIGl0IGFmdGVyIGFueSB3aGl0ZXNwYWNlLlxuICAgICAgICAgICAgc3QgPSBiZWZvcmVbKytpXTtcbiAgICAgICAgICAgIHdoaWxlIChzdD8udHlwZSA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSBzdC5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHN0ID0gYmVmb3JlWysraV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2Zmc2V0O1xufVxuXG5leHBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH07XG4iLCJpbXBvcnQgeyBBbGlhcyB9IGZyb20gJy4uL25vZGVzL0FsaWFzLmpzJztcbmltcG9ydCB7IGlzU2NhbGFyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbXBvc2UtY29sbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjb21wb3NlU2NhbGFyIH0gZnJvbSAnLi9jb21wb3NlLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyBlbXB0eVNjYWxhclBvc2l0aW9uIH0gZnJvbSAnLi91dGlsLWVtcHR5LXNjYWxhci1wb3NpdGlvbi5qcyc7XG5cbmNvbnN0IENOID0geyBjb21wb3NlTm9kZSwgY29tcG9zZUVtcHR5Tm9kZSB9O1xuZnVuY3Rpb24gY29tcG9zZU5vZGUoY3R4LCB0b2tlbiwgcHJvcHMsIG9uRXJyb3IpIHtcbiAgICBjb25zdCBhdEtleSA9IGN0eC5hdEtleTtcbiAgICBjb25zdCB7IHNwYWNlQmVmb3JlLCBjb21tZW50LCBhbmNob3IsIHRhZyB9ID0gcHJvcHM7XG4gICAgbGV0IG5vZGU7XG4gICAgbGV0IGlzU3JjVG9rZW4gPSB0cnVlO1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBub2RlID0gY29tcG9zZUFsaWFzKGN0eCwgdG9rZW4sIG9uRXJyb3IpO1xuICAgICAgICAgICAgaWYgKGFuY2hvciB8fCB0YWcpXG4gICAgICAgICAgICAgICAgb25FcnJvcih0b2tlbiwgJ0FMSUFTX1BST1BTJywgJ0FuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgbm9kZSA9IGNvbXBvc2VTY2FsYXIoY3R4LCB0b2tlbiwgdGFnLCBvbkVycm9yKTtcbiAgICAgICAgICAgIGlmIChhbmNob3IpXG4gICAgICAgICAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOlxuICAgICAgICBjYXNlICdibG9jay1zZXEnOlxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBub2RlID0gY29tcG9zZUNvbGxlY3Rpb24oQ04sIGN0eCwgdG9rZW4sIHByb3BzLCBvbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jaG9yKVxuICAgICAgICAgICAgICAgICAgICBub2RlLmFuY2hvciA9IGFuY2hvci5zb3VyY2Uuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgLy8gQWxtb3N0IGNlcnRhaW5seSBoZXJlIGR1ZSB0byBhIHN0YWNrIG92ZXJmbG93XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHRva2VuLCAnUkVTT1VSQ0VfRVhIQVVTVElPTicsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0b2tlbi50eXBlID09PSAnZXJyb3InXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5tZXNzYWdlXG4gICAgICAgICAgICAgICAgOiBgVW5zdXBwb3J0ZWQgdG9rZW4gKHR5cGU6ICR7dG9rZW4udHlwZX0pYDtcbiAgICAgICAgICAgIG9uRXJyb3IodG9rZW4sICdVTkVYUEVDVEVEX1RPS0VOJywgbWVzc2FnZSk7XG4gICAgICAgICAgICBpc1NyY1Rva2VuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9kZSA/PyAobm9kZSA9IGNvbXBvc2VFbXB0eU5vZGUoY3R4LCB0b2tlbi5vZmZzZXQsIHVuZGVmaW5lZCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpKTtcbiAgICBpZiAoYW5jaG9yICYmIG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgb25FcnJvcihhbmNob3IsICdCQURfQUxJQVMnLCAnQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYXRLZXkgJiZcbiAgICAgICAgY3R4Lm9wdGlvbnMuc3RyaW5nS2V5cyAmJlxuICAgICAgICAoIWlzU2NhbGFyKG5vZGUpIHx8XG4gICAgICAgICAgICB0eXBlb2Ygbm9kZS52YWx1ZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIChub2RlLnRhZyAmJiBub2RlLnRhZyAhPT0gJ3RhZzp5YW1sLm9yZywyMDAyOnN0cicpKSkge1xuICAgICAgICBjb25zdCBtc2cgPSAnV2l0aCBzdHJpbmdLZXlzLCBhbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MnO1xuICAgICAgICBvbkVycm9yKHRhZyA/PyB0b2tlbiwgJ05PTl9TVFJJTkdfS0VZJywgbXNnKTtcbiAgICB9XG4gICAgaWYgKHNwYWNlQmVmb3JlKVxuICAgICAgICBub2RlLnNwYWNlQmVmb3JlID0gdHJ1ZTtcbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgICBpZiAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgJiYgdG9rZW4uc291cmNlID09PSAnJylcbiAgICAgICAgICAgIG5vZGUuY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG5vZGUuY29tbWVudEJlZm9yZSA9IGNvbW1lbnQ7XG4gICAgfVxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSBjaGVja2luZyBtaXNzZXMgbWVhbmluZyBvZiBpc1NyY1Rva2VuXG4gICAgaWYgKGN0eC5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMgJiYgaXNTcmNUb2tlbilcbiAgICAgICAgbm9kZS5zcmNUb2tlbiA9IHRva2VuO1xuICAgIHJldHVybiBub2RlO1xufVxuZnVuY3Rpb24gY29tcG9zZUVtcHR5Tm9kZShjdHgsIG9mZnNldCwgYmVmb3JlLCBwb3MsIHsgc3BhY2VCZWZvcmUsIGNvbW1lbnQsIGFuY2hvciwgdGFnLCBlbmQgfSwgb25FcnJvcikge1xuICAgIGNvbnN0IHRva2VuID0ge1xuICAgICAgICB0eXBlOiAnc2NhbGFyJyxcbiAgICAgICAgb2Zmc2V0OiBlbXB0eVNjYWxhclBvc2l0aW9uKG9mZnNldCwgYmVmb3JlLCBwb3MpLFxuICAgICAgICBpbmRlbnQ6IC0xLFxuICAgICAgICBzb3VyY2U6ICcnXG4gICAgfTtcbiAgICBjb25zdCBub2RlID0gY29tcG9zZVNjYWxhcihjdHgsIHRva2VuLCB0YWcsIG9uRXJyb3IpO1xuICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgbm9kZS5hbmNob3IgPSBhbmNob3Iuc291cmNlLnN1YnN0cmluZygxKTtcbiAgICAgICAgaWYgKG5vZGUuYW5jaG9yID09PSAnJylcbiAgICAgICAgICAgIG9uRXJyb3IoYW5jaG9yLCAnQkFEX0FMSUFTJywgJ0FuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChzcGFjZUJlZm9yZSlcbiAgICAgICAgbm9kZS5zcGFjZUJlZm9yZSA9IHRydWU7XG4gICAgaWYgKGNvbW1lbnQpIHtcbiAgICAgICAgbm9kZS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgbm9kZS5yYW5nZVsyXSA9IGVuZDtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG59XG5mdW5jdGlvbiBjb21wb3NlQWxpYXMoeyBvcHRpb25zIH0sIHsgb2Zmc2V0LCBzb3VyY2UsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3QgYWxpYXMgPSBuZXcgQWxpYXMoc291cmNlLnN1YnN0cmluZygxKSk7XG4gICAgaWYgKGFsaWFzLnNvdXJjZSA9PT0gJycpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0LCAnQkFEX0FMSUFTJywgJ0FsaWFzIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTtcbiAgICBpZiAoYWxpYXMuc291cmNlLmVuZHNXaXRoKCc6JykpXG4gICAgICAgIG9uRXJyb3Iob2Zmc2V0ICsgc291cmNlLmxlbmd0aCAtIDEsICdCQURfQUxJQVMnLCAnQWxpYXMgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzJywgdHJ1ZSk7XG4gICAgY29uc3QgdmFsdWVFbmQgPSBvZmZzZXQgKyBzb3VyY2UubGVuZ3RoO1xuICAgIGNvbnN0IHJlID0gcmVzb2x2ZUVuZChlbmQsIHZhbHVlRW5kLCBvcHRpb25zLnN0cmljdCwgb25FcnJvcik7XG4gICAgYWxpYXMucmFuZ2UgPSBbb2Zmc2V0LCB2YWx1ZUVuZCwgcmUub2Zmc2V0XTtcbiAgICBpZiAocmUuY29tbWVudClcbiAgICAgICAgYWxpYXMuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgcmV0dXJuIGFsaWFzO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRW1wdHlOb2RlLCBjb21wb3NlTm9kZSB9O1xuIiwiaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgY29tcG9zZU5vZGUsIGNvbXBvc2VFbXB0eU5vZGUgfSBmcm9tICcuL2NvbXBvc2Utbm9kZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRW5kIH0gZnJvbSAnLi9yZXNvbHZlLWVuZC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUHJvcHMgfSBmcm9tICcuL3Jlc29sdmUtcHJvcHMuanMnO1xuXG5mdW5jdGlvbiBjb21wb3NlRG9jKG9wdGlvbnMsIGRpcmVjdGl2ZXMsIHsgb2Zmc2V0LCBzdGFydCwgdmFsdWUsIGVuZCB9LCBvbkVycm9yKSB7XG4gICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogZGlyZWN0aXZlcyB9LCBvcHRpb25zKTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICBjb25zdCBjdHggPSB7XG4gICAgICAgIGF0S2V5OiBmYWxzZSxcbiAgICAgICAgYXRSb290OiB0cnVlLFxuICAgICAgICBkaXJlY3RpdmVzOiBkb2MuZGlyZWN0aXZlcyxcbiAgICAgICAgb3B0aW9uczogZG9jLm9wdGlvbnMsXG4gICAgICAgIHNjaGVtYTogZG9jLnNjaGVtYVxuICAgIH07XG4gICAgY29uc3QgcHJvcHMgPSByZXNvbHZlUHJvcHMoc3RhcnQsIHtcbiAgICAgICAgaW5kaWNhdG9yOiAnZG9jLXN0YXJ0JyxcbiAgICAgICAgbmV4dDogdmFsdWUgPz8gZW5kPy5bMF0sXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb25FcnJvcixcbiAgICAgICAgcGFyZW50SW5kZW50OiAwLFxuICAgICAgICBzdGFydE9uTmV3bGluZTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChwcm9wcy5mb3VuZCkge1xuICAgICAgICBkb2MuZGlyZWN0aXZlcy5kb2NTdGFydCA9IHRydWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgKHZhbHVlLnR5cGUgPT09ICdibG9jay1tYXAnIHx8IHZhbHVlLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgIXByb3BzLmhhc05ld2xpbmUpXG4gICAgICAgICAgICBvbkVycm9yKHByb3BzLmVuZCwgJ01JU1NJTkdfQ0hBUicsICdCbG9jayBjb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBvbiBzYW1lIGxpbmUgd2l0aCBkaXJlY3RpdmVzLWVuZCBtYXJrZXInKTtcbiAgICB9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBJZiBDb250ZW50cyBpcyBzZXQsIGxldCdzIHRydXN0IHRoZSB1c2VyXG4gICAgZG9jLmNvbnRlbnRzID0gdmFsdWVcbiAgICAgICAgPyBjb21wb3NlTm9kZShjdHgsIHZhbHVlLCBwcm9wcywgb25FcnJvcilcbiAgICAgICAgOiBjb21wb3NlRW1wdHlOb2RlKGN0eCwgcHJvcHMuZW5kLCBzdGFydCwgbnVsbCwgcHJvcHMsIG9uRXJyb3IpO1xuICAgIGNvbnN0IGNvbnRlbnRFbmQgPSBkb2MuY29udGVudHMucmFuZ2VbMl07XG4gICAgY29uc3QgcmUgPSByZXNvbHZlRW5kKGVuZCwgY29udGVudEVuZCwgZmFsc2UsIG9uRXJyb3IpO1xuICAgIGlmIChyZS5jb21tZW50KVxuICAgICAgICBkb2MuY29tbWVudCA9IHJlLmNvbW1lbnQ7XG4gICAgZG9jLnJhbmdlID0gW29mZnNldCwgY29udGVudEVuZCwgcmUub2Zmc2V0XTtcbiAgICByZXR1cm4gZG9jO1xufVxuXG5leHBvcnQgeyBjb21wb3NlRG9jIH07XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmVzIH0gZnJvbSAnLi4vZG9jL2RpcmVjdGl2ZXMuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuLi9kb2MvRG9jdW1lbnQuanMnO1xuaW1wb3J0IHsgWUFNTFdhcm5pbmcsIFlBTUxQYXJzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzLmpzJztcbmltcG9ydCB7IGlzQ29sbGVjdGlvbiwgaXNQYWlyIH0gZnJvbSAnLi4vbm9kZXMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY29tcG9zZURvYyB9IGZyb20gJy4vY29tcG9zZS1kb2MuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVuZCB9IGZyb20gJy4vcmVzb2x2ZS1lbmQuanMnO1xuXG5mdW5jdGlvbiBnZXRFcnJvclBvcyhzcmMpIHtcbiAgICBpZiAodHlwZW9mIHNyYyA9PT0gJ251bWJlcicpXG4gICAgICAgIHJldHVybiBbc3JjLCBzcmMgKyAxXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzcmMpKVxuICAgICAgICByZXR1cm4gc3JjLmxlbmd0aCA9PT0gMiA/IHNyYyA6IFtzcmNbMF0sIHNyY1sxXV07XG4gICAgY29uc3QgeyBvZmZzZXQsIHNvdXJjZSB9ID0gc3JjO1xuICAgIHJldHVybiBbb2Zmc2V0LCBvZmZzZXQgKyAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycgPyBzb3VyY2UubGVuZ3RoIDogMSldO1xufVxuZnVuY3Rpb24gcGFyc2VQcmVsdWRlKHByZWx1ZGUpIHtcbiAgICBsZXQgY29tbWVudCA9ICcnO1xuICAgIGxldCBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICBsZXQgYWZ0ZXJFbXB0eUxpbmUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWx1ZGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gcHJlbHVkZVtpXTtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIGNvbW1lbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgKGNvbW1lbnQgPT09ICcnID8gJycgOiBhZnRlckVtcHR5TGluZSA/ICdcXG5cXG4nIDogJ1xcbicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChzb3VyY2Uuc3Vic3RyaW5nKDEpIHx8ICcgJyk7XG4gICAgICAgICAgICAgICAgYXRDb21tZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhZnRlckVtcHR5TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICAgICAgaWYgKHByZWx1ZGVbaSArIDFdPy5bMF0gIT09ICcjJylcbiAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgIGF0Q29tbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSB3cm9uZyBhZnRlciBkb2MtZW5kLCBidXQgaW4gdGhhdCBjYXNlIGl0IGRvZXNuJ3QgbWF0dGVyXG4gICAgICAgICAgICAgICAgaWYgKCFhdENvbW1lbnQpXG4gICAgICAgICAgICAgICAgICAgIGFmdGVyRW1wdHlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBhdENvbW1lbnQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBjb21tZW50LCBhZnRlckVtcHR5TGluZSB9O1xufVxuLyoqXG4gKiBDb21wb3NlIGEgc3RyZWFtIG9mIENTVCBub2RlcyBpbnRvIGEgc3RyZWFtIG9mIFlBTUwgRG9jdW1lbnRzLlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb3NlciwgUGFyc2VyIH0gZnJvbSAneWFtbCdcbiAqXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogY29uc3QgdG9rZW5zID0gbmV3IFBhcnNlcigpLnBhcnNlKHNyYylcbiAqIGNvbnN0IGRvY3MgPSBuZXcgQ29tcG9zZXIoKS5jb21wb3NlKHRva2VucylcbiAqIGBgYFxuICovXG5jbGFzcyBDb21wb3NlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVsdWRlID0gW107XG4gICAgICAgIHRoaXMuZXJyb3JzID0gW107XG4gICAgICAgIHRoaXMud2FybmluZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gKHNvdXJjZSwgY29kZSwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9zID0gZ2V0RXJyb3JQb3Moc291cmNlKTtcbiAgICAgICAgICAgIGlmICh3YXJuaW5nKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ3MucHVzaChuZXcgWUFNTFdhcm5pbmcocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChuZXcgWUFNTFBhcnNlRXJyb3IocG9zLCBjb2RlLCBtZXNzYWdlKSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLW51bGxpc2gtY29hbGVzY2luZ1xuICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBuZXcgRGlyZWN0aXZlcyh7IHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB8fCAnMS4yJyB9KTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgZGVjb3JhdGUoZG9jLCBhZnRlckRvYykge1xuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIGFmdGVyRW1wdHlMaW5lIH0gPSBwYXJzZVByZWx1ZGUodGhpcy5wcmVsdWRlKTtcbiAgICAgICAgLy9jb25zb2xlLmxvZyh7IGRjOiBkb2MuY29tbWVudCwgcHJlbHVkZSwgY29tbWVudCB9KVxuICAgICAgICBpZiAoY29tbWVudCkge1xuICAgICAgICAgICAgY29uc3QgZGMgPSBkb2MuY29udGVudHM7XG4gICAgICAgICAgICBpZiAoYWZ0ZXJEb2MpIHtcbiAgICAgICAgICAgICAgICBkb2MuY29tbWVudCA9IGRvYy5jb21tZW50ID8gYCR7ZG9jLmNvbW1lbnR9XFxuJHtjb21tZW50fWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoYWZ0ZXJFbXB0eUxpbmUgfHwgZG9jLmRpcmVjdGl2ZXMuZG9jU3RhcnQgfHwgIWRjKSB7XG4gICAgICAgICAgICAgICAgZG9jLmNvbW1lbnRCZWZvcmUgPSBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNDb2xsZWN0aW9uKGRjKSAmJiAhZGMuZmxvdyAmJiBkYy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ID0gZGMuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgaWYgKGlzUGFpcihpdCkpXG4gICAgICAgICAgICAgICAgICAgIGl0ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gaXQuY29tbWVudEJlZm9yZTtcbiAgICAgICAgICAgICAgICBpdC5jb21tZW50QmVmb3JlID0gY2IgPyBgJHtjb21tZW50fVxcbiR7Y2J9YCA6IGNvbW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYiA9IGRjLmNvbW1lbnRCZWZvcmU7XG4gICAgICAgICAgICAgICAgZGMuY29tbWVudEJlZm9yZSA9IGNiID8gYCR7Y29tbWVudH1cXG4ke2NifWAgOiBjb21tZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhZnRlckRvYykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVycm9ycy5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBkb2MuZXJyb3JzLnB1c2godGhpcy5lcnJvcnNbaV0pO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndhcm5pbmdzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGRvYy53YXJuaW5ncy5wdXNoKHRoaXMud2FybmluZ3NbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jLmVycm9ycyA9IHRoaXMuZXJyb3JzO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzID0gdGhpcy53YXJuaW5ncztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZWx1ZGUgPSBbXTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgdGhpcy53YXJuaW5ncyA9IFtdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHN0cmVhbSBzdGF0dXMgaW5mb3JtYXRpb24uXG4gICAgICpcbiAgICAgKiBNb3N0bHkgdXNlZnVsIGF0IHRoZSBlbmQgb2YgaW5wdXQgZm9yIGFuIGVtcHR5IHN0cmVhbS5cbiAgICAgKi9cbiAgICBzdHJlYW1JbmZvKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29tbWVudDogcGFyc2VQcmVsdWRlKHRoaXMucHJlbHVkZSkuY29tbWVudCxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IHRoaXMuZGlyZWN0aXZlcyxcbiAgICAgICAgICAgIGVycm9yczogdGhpcy5lcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogdGhpcy53YXJuaW5nc1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wb3NlIHRva2VucyBpbnRvIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZURvYyAtIElmIHRoZSBzdHJlYW0gY29udGFpbnMgbm8gZG9jdW1lbnQsIHN0aWxsIGVtaXQgYSBmaW5hbCBkb2N1bWVudCBpbmNsdWRpbmcgYW55IGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzIHRoYXQgd291bGQgYmUgYXBwbGllZCB0byBhIHN1YnNlcXVlbnQgZG9jdW1lbnQuXG4gICAgICogQHBhcmFtIGVuZE9mZnNldCAtIFNob3VsZCBiZSBzZXQgaWYgYGZvcmNlRG9jYCBpcyBhbHNvIHNldCwgdG8gc2V0IHRoZSBkb2N1bWVudCByYW5nZSBlbmQgYW5kIHRvIGluZGljYXRlIGVycm9ycyBjb3JyZWN0bHkuXG4gICAgICovXG4gICAgKmNvbXBvc2UodG9rZW5zLCBmb3JjZURvYyA9IGZhbHNlLCBlbmRPZmZzZXQgPSAtMSkge1xuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIG9mIHRva2VucylcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQodG9rZW4pO1xuICAgICAgICB5aWVsZCogdGhpcy5lbmQoZm9yY2VEb2MsIGVuZE9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBBZHZhbmNlIHRoZSBjb21wb3NlciBieSBvbmUgQ1NUIHRva2VuLiAqL1xuICAgICpuZXh0KHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlyZWN0aXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMuYWRkKHRva2VuLnNvdXJjZSwgKG9mZnNldCwgbWVzc2FnZSwgd2FybmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSBnZXRFcnJvclBvcyh0b2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHBvc1swXSArPSBvZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25FcnJvcihwb3MsICdCQURfRElSRUNUSVZFJywgbWVzc2FnZSwgd2FybmluZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsdWRlLnB1c2godG9rZW4uc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0RGlyZWN0aXZlcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjb21wb3NlRG9jKHRoaXMub3B0aW9ucywgdGhpcy5kaXJlY3RpdmVzLCB0b2tlbiwgdGhpcy5vbkVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdERpcmVjdGl2ZXMgJiYgIWRvYy5kaXJlY3RpdmVzLmRvY1N0YXJ0KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IodG9rZW4sICdNSVNTSU5HX0NIQVInLCAnTWlzc2luZyBkaXJlY3RpdmVzLWVuZC9kb2Mtc3RhcnQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvYylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgdGhpcy5kb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgdGhpcy5hdERpcmVjdGl2ZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMucHJlbHVkZS5wdXNoKHRva2VuLnNvdXJjZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtc2cgPSB0b2tlbi5zb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgPyBgJHt0b2tlbi5tZXNzYWdlfTogJHtKU09OLnN0cmluZ2lmeSh0b2tlbi5zb3VyY2UpfWBcbiAgICAgICAgICAgICAgICAgICAgOiB0b2tlbi5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBtc2cpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcyB8fCAhdGhpcy5kb2MpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MuZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVbmV4cGVjdGVkIGRvYy1lbmQgd2l0aG91dCBwcmVjZWRpbmcgZG9jdW1lbnQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihnZXRFcnJvclBvcyh0b2tlbiksICdVTkVYUEVDVEVEX1RPS0VOJywgbXNnKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5kaXJlY3RpdmVzLmRvY0VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcmVzb2x2ZUVuZCh0b2tlbi5lbmQsIHRva2VuLm9mZnNldCArIHRva2VuLnNvdXJjZS5sZW5ndGgsIHRoaXMuZG9jLm9wdGlvbnMuc3RyaWN0LCB0aGlzLm9uRXJyb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjb3JhdGUodGhpcy5kb2MsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChlbmQuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYyA9IHRoaXMuZG9jLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLmNvbW1lbnQgPSBkYyA/IGAke2RjfVxcbiR7ZW5kLmNvbW1lbnR9YCA6IGVuZC5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmRvYy5yYW5nZVsyXSA9IGVuZC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLnB1c2gobmV3IFlBTUxQYXJzZUVycm9yKGdldEVycm9yUG9zKHRva2VuKSwgJ1VORVhQRUNURURfVE9LRU4nLCBgVW5zdXBwb3J0ZWQgdG9rZW4gJHt0b2tlbi50eXBlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxsIGF0IGVuZCBvZiBpbnB1dCB0byB5aWVsZCBhbnkgcmVtYWluaW5nIGRvY3VtZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIGZvcmNlRG9jIC0gSWYgdGhlIHN0cmVhbSBjb250YWlucyBubyBkb2N1bWVudCwgc3RpbGwgZW1pdCBhIGZpbmFsIGRvY3VtZW50IGluY2x1ZGluZyBhbnkgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgdGhhdCB3b3VsZCBiZSBhcHBsaWVkIHRvIGEgc3Vic2VxdWVudCBkb2N1bWVudC5cbiAgICAgKiBAcGFyYW0gZW5kT2Zmc2V0IC0gU2hvdWxkIGJlIHNldCBpZiBgZm9yY2VEb2NgIGlzIGFsc28gc2V0LCB0byBzZXQgdGhlIGRvY3VtZW50IHJhbmdlIGVuZCBhbmQgdG8gaW5kaWNhdGUgZXJyb3JzIGNvcnJlY3RseS5cbiAgICAgKi9cbiAgICAqZW5kKGZvcmNlRG9jID0gZmFsc2UsIGVuZE9mZnNldCA9IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLmRvYykge1xuICAgICAgICAgICAgdGhpcy5kZWNvcmF0ZSh0aGlzLmRvYywgdHJ1ZSk7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmRvYztcbiAgICAgICAgICAgIHRoaXMuZG9jID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmb3JjZURvYykge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oeyBfZGlyZWN0aXZlczogdGhpcy5kaXJlY3RpdmVzIH0sIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBuZXcgRG9jdW1lbnQodW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmF0RGlyZWN0aXZlcylcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZW5kT2Zmc2V0LCAnTUlTU0lOR19DSEFSJywgJ01pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUnKTtcbiAgICAgICAgICAgIGRvYy5yYW5nZSA9IFswLCBlbmRPZmZzZXQsIGVuZE9mZnNldF07XG4gICAgICAgICAgICB0aGlzLmRlY29yYXRlKGRvYywgZmFsc2UpO1xuICAgICAgICAgICAgeWllbGQgZG9jO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgeyBDb21wb3NlciB9O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZUJsb2NrU2NhbGFyIH0gZnJvbSAnLi4vY29tcG9zZS9yZXNvbHZlLWJsb2NrLXNjYWxhci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlRmxvd1NjYWxhciB9IGZyb20gJy4uL2NvbXBvc2UvcmVzb2x2ZS1mbG93LXNjYWxhci5qcyc7XG5pbXBvcnQgeyBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBzdHJpbmdpZnlTdHJpbmcgfSBmcm9tICcuLi9zdHJpbmdpZnkvc3RyaW5naWZ5U3RyaW5nLmpzJztcblxuZnVuY3Rpb24gcmVzb2x2ZUFzU2NhbGFyKHRva2VuLCBzdHJpY3QgPSB0cnVlLCBvbkVycm9yKSB7XG4gICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGNvbnN0IF9vbkVycm9yID0gKHBvcywgY29kZSwgbWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHlwZW9mIHBvcyA9PT0gJ251bWJlcicgPyBwb3MgOiBBcnJheS5pc0FycmF5KHBvcykgPyBwb3NbMF0gOiBwb3Mub2Zmc2V0O1xuICAgICAgICAgICAgaWYgKG9uRXJyb3IpXG4gICAgICAgICAgICAgICAgb25FcnJvcihvZmZzZXQsIGNvZGUsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBZQU1MUGFyc2VFcnJvcihbb2Zmc2V0LCBvZmZzZXQgKyAxXSwgY29kZSwgbWVzc2FnZSk7XG4gICAgICAgIH07XG4gICAgICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUZsb3dTY2FsYXIodG9rZW4sIHN0cmljdCwgX29uRXJyb3IpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUJsb2NrU2NhbGFyKHsgb3B0aW9uczogeyBzdHJpY3QgfSB9LCB0b2tlbiwgX29uRXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc2NhbGFyIHRva2VuIHdpdGggYHZhbHVlYFxuICpcbiAqIFZhbHVlcyB0aGF0IHJlcHJlc2VudCBhbiBhY3R1YWwgc3RyaW5nIGJ1dCBtYXkgYmUgcGFyc2VkIGFzIGEgZGlmZmVyZW50IHR5cGUgc2hvdWxkIHVzZSBhIGB0eXBlYCBvdGhlciB0aGFuIGAnUExBSU4nYCxcbiAqIGFzIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhbnkgc2NoZW1hIG9wZXJhdGlvbnMgYW5kIHdvbid0IGNoZWNrIGZvciBzdWNoIGNvbmZsaWN0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIHdoaWNoIHdpbGwgaGF2ZSBpdHMgY29udGVudCBwcm9wZXJseSBpbmRlbnRlZC5cbiAqIEBwYXJhbSBjb250ZXh0LmVuZCBDb21tZW50cyBhbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YWx1ZSwgb3IgYWZ0ZXIgdGhlIGJsb2NrIHNjYWxhciBoZWFkZXIuIElmIHVuZGVmaW5lZCwgYSBuZXdsaW5lIHdpbGwgYmUgYWRkZWQuXG4gKiBAcGFyYW0gY29udGV4dC5pbXBsaWNpdEtleSBCZWluZyB3aXRoaW4gYW4gaW1wbGljaXQga2V5IG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5pbmRlbnQgVGhlIGluZGVudCBsZXZlbCBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC5pbkZsb3cgSXMgdGhpcyBzY2FsYXIgd2l0aGluIGEgZmxvdyBjb2xsZWN0aW9uPyBUaGlzIG1heSBhZmZlY3QgdGhlIHJlc29sdmVkIHR5cGUgb2YgdGhlIHRva2VuJ3MgdmFsdWUuXG4gKiBAcGFyYW0gY29udGV4dC5vZmZzZXQgVGhlIG9mZnNldCBwb3NpdGlvbiBvZiB0aGUgdG9rZW4uXG4gKiBAcGFyYW0gY29udGV4dC50eXBlIFRoZSBwcmVmZXJyZWQgdHlwZSBvZiB0aGUgc2NhbGFyIHRva2VuLiBJZiB1bmRlZmluZWQsIHRoZSBwcmV2aW91cyB0eXBlIG9mIHRoZSBgdG9rZW5gIHdpbGwgYmUgdXNlZCwgZGVmYXVsdGluZyB0byBgJ1BMQUlOJ2AuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjYWxhclRva2VuKHZhbHVlLCBjb250ZXh0KSB7XG4gICAgY29uc3QgeyBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbmRlbnQsIGluRmxvdyA9IGZhbHNlLCBvZmZzZXQgPSAtMSwgdHlwZSA9ICdQTEFJTicgfSA9IGNvbnRleHQ7XG4gICAgY29uc3Qgc291cmNlID0gc3RyaW5naWZ5U3RyaW5nKHsgdHlwZSwgdmFsdWUgfSwge1xuICAgICAgICBpbXBsaWNpdEtleSxcbiAgICAgICAgaW5kZW50OiBpbmRlbnQgPiAwID8gJyAnLnJlcGVhdChpbmRlbnQpIDogJycsXG4gICAgICAgIGluRmxvdyxcbiAgICAgICAgb3B0aW9uczogeyBibG9ja1F1b3RlOiB0cnVlLCBsaW5lV2lkdGg6IC0xIH1cbiAgICB9KTtcbiAgICBjb25zdCBlbmQgPSBjb250ZXh0LmVuZCA/PyBbXG4gICAgICAgIHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfVxuICAgIF07XG4gICAgc3dpdGNoIChzb3VyY2VbMF0pIHtcbiAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgIGNhc2UgJz4nOiB7XG4gICAgICAgICAgICBjb25zdCBoZSA9IHNvdXJjZS5pbmRleE9mKCdcXG4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGhlKTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Jsb2NrLXNjYWxhci1oZWFkZXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlOiBoZWFkIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSlcbiAgICAgICAgICAgICAgICBwcm9wcy5wdXNoKHsgdHlwZTogJ25ld2xpbmUnLCBvZmZzZXQ6IC0xLCBpbmRlbnQsIHNvdXJjZTogJ1xcbicgfSk7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnYmxvY2stc2NhbGFyJywgb2Zmc2V0LCBpbmRlbnQsIHByb3BzLCBzb3VyY2U6IGJvZHkgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAnZG91YmxlLXF1b3RlZC1zY2FsYXInLCBvZmZzZXQsIGluZGVudCwgc291cmNlLCBlbmQgfTtcbiAgICAgICAgY2FzZSBcIidcIjpcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdzaW5nbGUtcXVvdGVkLXNjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogJ3NjYWxhcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2UsIGVuZCB9O1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHRoZSB2YWx1ZSBvZiBgdG9rZW5gIHRvIHRoZSBnaXZlbiBzdHJpbmcgYHZhbHVlYCwgb3ZlcndyaXRpbmcgYW55IHByZXZpb3VzIGNvbnRlbnRzIGFuZCB0eXBlIHRoYXQgaXQgbWF5IGhhdmUuXG4gKlxuICogQmVzdCBlZmZvcnRzIGFyZSBtYWRlIHRvIHJldGFpbiBhbnkgY29tbWVudHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggdGhlIGB0b2tlbmAsXG4gKiB0aG91Z2ggYWxsIGNvbnRlbnRzIHdpdGhpbiBhIGNvbGxlY3Rpb24ncyBgaXRlbXNgIHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogVmFsdWVzIHRoYXQgcmVwcmVzZW50IGFuIGFjdHVhbCBzdHJpbmcgYnV0IG1heSBiZSBwYXJzZWQgYXMgYSBkaWZmZXJlbnQgdHlwZSBzaG91bGQgdXNlIGEgYHR5cGVgIG90aGVyIHRoYW4gYCdQTEFJTidgLFxuICogYXMgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFueSBzY2hlbWEgb3BlcmF0aW9ucyBhbmQgd29uJ3QgY2hlY2sgZm9yIHN1Y2ggY29uZmxpY3RzLlxuICpcbiAqIEBwYXJhbSB0b2tlbiBBbnkgdG9rZW4uIElmIGl0IGRvZXMgbm90IGluY2x1ZGUgYW4gYGluZGVudGAgdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkIGFzIGlmIGl0IHdlcmUgYW4gaW1wbGljaXQga2V5LlxuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCB3aGljaCB3aWxsIGhhdmUgaXRzIGNvbnRlbnQgcHJvcGVybHkgaW5kZW50ZWQuXG4gKiBAcGFyYW0gY29udGV4dC5hZnRlcktleSBJbiBtb3N0IGNhc2VzLCB2YWx1ZXMgYWZ0ZXIgYSBrZXkgc2hvdWxkIGhhdmUgYW4gYWRkaXRpb25hbCBsZXZlbCBvZiBpbmRlbnRhdGlvbi5cbiAqIEBwYXJhbSBjb250ZXh0LmltcGxpY2l0S2V5IEJlaW5nIHdpdGhpbiBhbiBpbXBsaWNpdCBrZXkgbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LmluRmxvdyBCZWluZyB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24gbWF5IGFmZmVjdCB0aGUgcmVzb2x2ZWQgdHlwZSBvZiB0aGUgdG9rZW4ncyB2YWx1ZS5cbiAqIEBwYXJhbSBjb250ZXh0LnR5cGUgVGhlIHByZWZlcnJlZCB0eXBlIG9mIHRoZSBzY2FsYXIgdG9rZW4uIElmIHVuZGVmaW5lZCwgdGhlIHByZXZpb3VzIHR5cGUgb2YgdGhlIGB0b2tlbmAgd2lsbCBiZSB1c2VkLCBkZWZhdWx0aW5nIHRvIGAnUExBSU4nYC5cbiAqL1xuZnVuY3Rpb24gc2V0U2NhbGFyVmFsdWUodG9rZW4sIHZhbHVlLCBjb250ZXh0ID0ge30pIHtcbiAgICBsZXQgeyBhZnRlcktleSA9IGZhbHNlLCBpbXBsaWNpdEtleSA9IGZhbHNlLCBpbkZsb3cgPSBmYWxzZSwgdHlwZSB9ID0gY29udGV4dDtcbiAgICBsZXQgaW5kZW50ID0gJ2luZGVudCcgaW4gdG9rZW4gPyB0b2tlbi5pbmRlbnQgOiBudWxsO1xuICAgIGlmIChhZnRlcktleSAmJiB0eXBlb2YgaW5kZW50ID09PSAnbnVtYmVyJylcbiAgICAgICAgaW5kZW50ICs9IDI7XG4gICAgaWYgKCF0eXBlKVxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICB0eXBlID0gJ1FVT1RFX1NJTkdMRSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdRVU9URV9ET1VCTEUnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRva2VuLnByb3BzWzBdO1xuICAgICAgICAgICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlcicpO1xuICAgICAgICAgICAgICAgIHR5cGUgPSBoZWFkZXIuc291cmNlWzBdID09PSAnPicgPyAnQkxPQ0tfRk9MREVEJyA6ICdCTE9DS19MSVRFUkFMJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdHlwZSA9ICdQTEFJTic7XG4gICAgICAgIH1cbiAgICBjb25zdCBzb3VyY2UgPSBzdHJpbmdpZnlTdHJpbmcoeyB0eXBlLCB2YWx1ZSB9LCB7XG4gICAgICAgIGltcGxpY2l0S2V5OiBpbXBsaWNpdEtleSB8fCBpbmRlbnQgPT09IG51bGwsXG4gICAgICAgIGluZGVudDogaW5kZW50ICE9PSBudWxsICYmIGluZGVudCA+IDAgPyAnICcucmVwZWF0KGluZGVudCkgOiAnJyxcbiAgICAgICAgaW5GbG93LFxuICAgICAgICBvcHRpb25zOiB7IGJsb2NrUXVvdGU6IHRydWUsIGxpbmVXaWR0aDogLTEgfVxuICAgIH0pO1xuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgIHNldEJsb2NrU2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnXCInOlxuICAgICAgICAgICAgc2V0Rmxvd1NjYWxhclZhbHVlKHRva2VuLCBzb3VyY2UsICdkb3VibGUtcXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICBzZXRGbG93U2NhbGFyVmFsdWUodG9rZW4sIHNvdXJjZSwgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCAnc2NhbGFyJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0QmxvY2tTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlKSB7XG4gICAgY29uc3QgaGUgPSBzb3VyY2UuaW5kZXhPZignXFxuJyk7XG4gICAgY29uc3QgaGVhZCA9IHNvdXJjZS5zdWJzdHJpbmcoMCwgaGUpO1xuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2Uuc3Vic3RyaW5nKGhlICsgMSkgKyAnXFxuJztcbiAgICBpZiAodG9rZW4udHlwZSA9PT0gJ2Jsb2NrLXNjYWxhcicpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gdG9rZW4ucHJvcHNbMF07XG4gICAgICAgIGlmIChoZWFkZXIudHlwZSAhPT0gJ2Jsb2NrLXNjYWxhci1oZWFkZXInKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXInKTtcbiAgICAgICAgaGVhZGVyLnNvdXJjZSA9IGhlYWQ7XG4gICAgICAgIHRva2VuLnNvdXJjZSA9IGJvZHk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCB7IG9mZnNldCB9ID0gdG9rZW47XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICdpbmRlbnQnIGluIHRva2VuID8gdG9rZW4uaW5kZW50IDogLTE7XG4gICAgICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAgICAgeyB0eXBlOiAnYmxvY2stc2NhbGFyLWhlYWRlcicsIG9mZnNldCwgaW5kZW50LCBzb3VyY2U6IGhlYWQgfVxuICAgICAgICBdO1xuICAgICAgICBpZiAoIWFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgJ2VuZCcgaW4gdG9rZW4gPyB0b2tlbi5lbmQgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgcHJvcHMucHVzaCh7IHR5cGU6ICduZXdsaW5lJywgb2Zmc2V0OiAtMSwgaW5kZW50LCBzb3VyY2U6ICdcXG4nIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0b2tlbikpXG4gICAgICAgICAgICBpZiAoa2V5ICE9PSAndHlwZScgJiYga2V5ICE9PSAnb2Zmc2V0JylcbiAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0b2tlbiwgeyB0eXBlOiAnYmxvY2stc2NhbGFyJywgaW5kZW50LCBwcm9wcywgc291cmNlOiBib2R5IH0pO1xuICAgIH1cbn1cbi8qKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbGFzdCB0b2tlbiBpcyBhIG5ld2xpbmUgKi9cbmZ1bmN0aW9uIGFkZEVuZHRvQmxvY2tQcm9wcyhwcm9wcywgZW5kKSB7XG4gICAgaWYgKGVuZClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBlbmQpXG4gICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnB1c2goc3QpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMucHVzaChzdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNldEZsb3dTY2FsYXJWYWx1ZSh0b2tlbiwgc291cmNlLCB0eXBlKSB7XG4gICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgdG9rZW4udHlwZSA9IHR5cGU7XG4gICAgICAgICAgICB0b2tlbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzoge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gdG9rZW4ucHJvcHMuc2xpY2UoMSk7XG4gICAgICAgICAgICBsZXQgb2EgPSBzb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKHRva2VuLnByb3BzWzBdLnR5cGUgPT09ICdibG9jay1zY2FsYXItaGVhZGVyJylcbiAgICAgICAgICAgICAgICBvYSAtPSB0b2tlbi5wcm9wc1swXS5zb3VyY2UubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0b2sgb2YgZW5kKVxuICAgICAgICAgICAgICAgIHRvay5vZmZzZXQgKz0gb2E7XG4gICAgICAgICAgICBkZWxldGUgdG9rZW4ucHJvcHM7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRva2VuLCB7IHR5cGUsIHNvdXJjZSwgZW5kIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9rZW4ub2Zmc2V0ICsgc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG5sID0geyB0eXBlOiAnbmV3bGluZScsIG9mZnNldCwgaW5kZW50OiB0b2tlbi5pbmRlbnQsIHNvdXJjZTogJ1xcbicgfTtcbiAgICAgICAgICAgIGRlbGV0ZSB0b2tlbi5pdGVtcztcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgc291cmNlLCBlbmQ6IFtubF0gfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBjb25zdCBpbmRlbnQgPSAnaW5kZW50JyBpbiB0b2tlbiA/IHRva2VuLmluZGVudCA6IC0xO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gJ2VuZCcgaW4gdG9rZW4gJiYgQXJyYXkuaXNBcnJheSh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgPyB0b2tlbi5lbmQuZmlsdGVyKHN0ID0+IHN0LnR5cGUgPT09ICdzcGFjZScgfHxcbiAgICAgICAgICAgICAgICAgICAgc3QudHlwZSA9PT0gJ2NvbW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0LnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModG9rZW4pKVxuICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICd0eXBlJyAmJiBrZXkgIT09ICdvZmZzZXQnKVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdG9rZW5ba2V5XTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odG9rZW4sIHsgdHlwZSwgaW5kZW50LCBzb3VyY2UsIGVuZCB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHsgY3JlYXRlU2NhbGFyVG9rZW4sIHJlc29sdmVBc1NjYWxhciwgc2V0U2NhbGFyVmFsdWUgfTtcbiIsIi8qKlxuICogU3RyaW5naWZ5IGEgQ1NUIGRvY3VtZW50LCB0b2tlbiwgb3IgY29sbGVjdGlvbiBpdGVtXG4gKlxuICogRmFpciB3YXJuaW5nOiBUaGlzIGFwcGxpZXMgbm8gdmFsaWRhdGlvbiB3aGF0c29ldmVyLCBhbmRcbiAqIHNpbXBseSBjb25jYXRlbmF0ZXMgdGhlIHNvdXJjZXMgaW4gdGhlaXIgbG9naWNhbCBvcmRlci5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gKGNzdCkgPT4gJ3R5cGUnIGluIGNzdCA/IHN0cmluZ2lmeVRva2VuKGNzdCkgOiBzdHJpbmdpZnlJdGVtKGNzdCk7XG5mdW5jdGlvbiBzdHJpbmdpZnlUb2tlbih0b2tlbikge1xuICAgIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gJyc7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRvayBvZiB0b2tlbi5wcm9wcylcbiAgICAgICAgICAgICAgICByZXMgKz0gc3RyaW5naWZ5VG9rZW4odG9rKTtcbiAgICAgICAgICAgIHJldHVybiByZXMgKyB0b2tlbi5zb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgY2FzZSAnYmxvY2stc2VxJzoge1xuICAgICAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmbG93LWNvbGxlY3Rpb24nOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc3RhcnQuc291cmNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRva2VuLml0ZW1zKVxuICAgICAgICAgICAgICAgIHJlcyArPSBzdHJpbmdpZnlJdGVtKGl0ZW0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdCBvZiB0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZG9jdW1lbnQnOiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gc3RyaW5naWZ5SXRlbSh0b2tlbik7XG4gICAgICAgICAgICBpZiAodG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3Qgb2YgdG9rZW4uZW5kKVxuICAgICAgICAgICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBsZXQgcmVzID0gdG9rZW4uc291cmNlO1xuICAgICAgICAgICAgaWYgKCdlbmQnIGluIHRva2VuICYmIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0IG9mIHRva2VuLmVuZClcbiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHN0LnNvdXJjZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlJdGVtKHsgc3RhcnQsIGtleSwgc2VwLCB2YWx1ZSB9KSB7XG4gICAgbGV0IHJlcyA9ICcnO1xuICAgIGZvciAoY29uc3Qgc3Qgb2Ygc3RhcnQpXG4gICAgICAgIHJlcyArPSBzdC5zb3VyY2U7XG4gICAgaWYgKGtleSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKGtleSk7XG4gICAgaWYgKHNlcClcbiAgICAgICAgZm9yIChjb25zdCBzdCBvZiBzZXApXG4gICAgICAgICAgICByZXMgKz0gc3Quc291cmNlO1xuICAgIGlmICh2YWx1ZSlcbiAgICAgICAgcmVzICs9IHN0cmluZ2lmeVRva2VuKHZhbHVlKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgeyBzdHJpbmdpZnkgfTtcbiIsImNvbnN0IEJSRUFLID0gU3ltYm9sKCdicmVhayB2aXNpdCcpO1xuY29uc3QgU0tJUCA9IFN5bWJvbCgnc2tpcCBjaGlsZHJlbicpO1xuY29uc3QgUkVNT1ZFID0gU3ltYm9sKCdyZW1vdmUgaXRlbScpO1xuLyoqXG4gKiBBcHBseSBhIHZpc2l0b3IgdG8gYSBDU1QgZG9jdW1lbnQgb3IgaXRlbS5cbiAqXG4gKiBXYWxrcyB0aHJvdWdoIHRoZSB0cmVlIChkZXB0aC1maXJzdCkgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCwgY2FsbGluZyBhXG4gKiBgdmlzaXRvcmAgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzIHdoZW4gZW50ZXJpbmcgZWFjaCBpdGVtOlxuICogICAtIGBpdGVtYDogVGhlIGN1cnJlbnQgaXRlbSwgd2hpY2ggaW5jbHVkZWQgdGhlIGZvbGxvd2luZyBtZW1iZXJzOlxuICogICAgIC0gYHN0YXJ0OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZWZvcmUgdGhlIGtleSBvciB2YWx1ZSxcbiAqICAgICAgIHBvc3NpYmx5IGluY2x1ZGluZyBpdHMgYW5jaG9yIG9yIHRhZy5cbiAqICAgICAtIGBrZXk/OiBUb2tlbiB8IG51bGxgIOKAkyBTZXQgZm9yIHBhaXIgdmFsdWVzLiBNYXkgdGhlbiBiZSBgbnVsbGAsIGlmXG4gKiAgICAgICB0aGUga2V5IGJlZm9yZSB0aGUgYDpgIHNlcGFyYXRvciBpcyBlbXB0eS5cbiAqICAgICAtIGBzZXA/OiBTb3VyY2VUb2tlbltdYCDigJMgU291cmNlIHRva2VucyBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSxcbiAqICAgICAgIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZSBgOmAgbWFwIHZhbHVlIGluZGljYXRvciBpZiBgdmFsdWVgIGlzIHNldC5cbiAqICAgICAtIGB2YWx1ZT86IFRva2VuYCDigJMgVGhlIHZhbHVlIG9mIGEgc2VxdWVuY2UgaXRlbSwgb3Igb2YgYSBtYXAgcGFpci5cbiAqICAgLSBgcGF0aGA6IFRoZSBzdGVwcyBmcm9tIHRoZSByb290IHRvIHRoZSBjdXJyZW50IG5vZGUsIGFzIGFuIGFycmF5IG9mXG4gKiAgICAgYFsna2V5JyB8ICd2YWx1ZScsIG51bWJlcl1gIHR1cGxlcy5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB2aXNpdG9yIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYXZlcnNhbDpcbiAqICAgLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IERvIG5vdGhpbmcgYW5kIGNvbnRpbnVlXG4gKiAgIC0gYHZpc2l0LlNLSVBgOiBEbyBub3QgdmlzaXQgdGhlIGNoaWxkcmVuIG9mIHRoaXMgdG9rZW4sIGNvbnRpbnVlIHdpdGhcbiAqICAgICAgbmV4dCBzaWJsaW5nXG4gKiAgIC0gYHZpc2l0LkJSRUFLYDogVGVybWluYXRlIHRyYXZlcnNhbCBjb21wbGV0ZWx5XG4gKiAgIC0gYHZpc2l0LlJFTU9WRWA6IFJlbW92ZSB0aGUgY3VycmVudCBpdGVtLCB0aGVuIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgb25lXG4gKiAgIC0gYG51bWJlcmA6IFNldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3RlcC4gVGhpcyBpcyB1c2VmdWwgZXNwZWNpYWxseSBpZlxuICogICAgIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB0b2tlbiBoYXMgY2hhbmdlZC5cbiAqICAgLSBgZnVuY3Rpb25gOiBEZWZpbmUgdGhlIG5leHQgdmlzaXRvciBmb3IgdGhpcyBpdGVtLiBBZnRlciB0aGUgb3JpZ2luYWxcbiAqICAgICB2aXNpdG9yIGlzIGNhbGxlZCBvbiBpdGVtIGVudHJ5LCBuZXh0IHZpc2l0b3JzIGFyZSBjYWxsZWQgYWZ0ZXIgaGFuZGxpbmdcbiAqICAgICBhIG5vbi1lbXB0eSBga2V5YCBhbmQgd2hlbiBleGl0aW5nIHRoZSBpdGVtLlxuICovXG5mdW5jdGlvbiB2aXNpdChjc3QsIHZpc2l0b3IpIHtcbiAgICBpZiAoJ3R5cGUnIGluIGNzdCAmJiBjc3QudHlwZSA9PT0gJ2RvY3VtZW50JylcbiAgICAgICAgY3N0ID0geyBzdGFydDogY3N0LnN0YXJ0LCB2YWx1ZTogY3N0LnZhbHVlIH07XG4gICAgX3Zpc2l0KE9iamVjdC5mcmVlemUoW10pLCBjc3QsIHZpc2l0b3IpO1xufVxuLy8gV2l0aG91dCB0aGUgYGFzIHN5bWJvbGAgY2FzdHMsIFRTIGRlY2xhcmVzIHRoZXNlIGluIHRoZSBgdmlzaXRgXG4vLyBuYW1lc3BhY2UgdXNpbmcgYHZhcmAsIGJ1dCB0aGVuIGNvbXBsYWlucyBhYm91dCB0aGF0IGJlY2F1c2Vcbi8vIGB1bmlxdWUgc3ltYm9sYCBtdXN0IGJlIGBjb25zdGAuXG4vKiogVGVybWluYXRlIHZpc2l0IHRyYXZlcnNhbCBjb21wbGV0ZWx5ICovXG52aXNpdC5CUkVBSyA9IEJSRUFLO1xuLyoqIERvIG5vdCB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgaXRlbSAqL1xudmlzaXQuU0tJUCA9IFNLSVA7XG4vKiogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gKi9cbnZpc2l0LlJFTU9WRSA9IFJFTU9WRTtcbi8qKiBGaW5kIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290ICovXG52aXNpdC5pdGVtQXRQYXRoID0gKGNzdCwgcGF0aCkgPT4ge1xuICAgIGxldCBpdGVtID0gY3N0O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBpbmRleF0gb2YgcGF0aCkge1xuICAgICAgICBjb25zdCB0b2sgPSBpdGVtPy5bZmllbGRdO1xuICAgICAgICBpZiAodG9rICYmICdpdGVtcycgaW4gdG9rKSB7XG4gICAgICAgICAgICBpdGVtID0gdG9rLml0ZW1zW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbn07XG4vKipcbiAqIEdldCB0aGUgaW1tZWRpYXRlIHBhcmVudCBjb2xsZWN0aW9uIG9mIHRoZSBpdGVtIGF0IGBwYXRoYCBmcm9tIGBjc3RgIGFzIHRoZSByb290LlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZm91bmQsIHdoaWNoIHNob3VsZCBuZXZlciBoYXBwZW4gaWYgdGhlIGl0ZW0gaXRzZWxmIGV4aXN0cy5cbiAqL1xudmlzaXQucGFyZW50Q29sbGVjdGlvbiA9IChjc3QsIHBhdGgpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB2aXNpdC5pdGVtQXRQYXRoKGNzdCwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIGNvbnN0IGZpZWxkID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdWzBdO1xuICAgIGNvbnN0IGNvbGwgPSBwYXJlbnQ/LltmaWVsZF07XG4gICAgaWYgKGNvbGwgJiYgJ2l0ZW1zJyBpbiBjb2xsKVxuICAgICAgICByZXR1cm4gY29sbDtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCBjb2xsZWN0aW9uIG5vdCBmb3VuZCcpO1xufTtcbmZ1bmN0aW9uIF92aXNpdChwYXRoLCBpdGVtLCB2aXNpdG9yKSB7XG4gICAgbGV0IGN0cmwgPSB2aXNpdG9yKGl0ZW0sIHBhdGgpO1xuICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ3N5bWJvbCcpXG4gICAgICAgIHJldHVybiBjdHJsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgWydrZXknLCAndmFsdWUnXSkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IGl0ZW1bZmllbGRdO1xuICAgICAgICBpZiAodG9rZW4gJiYgJ2l0ZW1zJyBpbiB0b2tlbikge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbi5pdGVtcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNpID0gX3Zpc2l0KE9iamVjdC5mcmVlemUocGF0aC5jb25jYXQoW1tmaWVsZCwgaV1dKSksIHRva2VuLml0ZW1zW2ldLCB2aXNpdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNpID09PSAnbnVtYmVyJylcbiAgICAgICAgICAgICAgICAgICAgaSA9IGNpIC0gMTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gQlJFQUspXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCUkVBSztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaSA9PT0gUkVNT1ZFKSB7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3RybCA9PT0gJ2Z1bmN0aW9uJyAmJiBmaWVsZCA9PT0gJ2tleScpXG4gICAgICAgICAgICAgICAgY3RybCA9IGN0cmwoaXRlbSwgcGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBjdHJsID09PSAnZnVuY3Rpb24nID8gY3RybChpdGVtLCBwYXRoKSA6IGN0cmw7XG59XG5cbmV4cG9ydCB7IHZpc2l0IH07XG4iLCJleHBvcnQgeyBjcmVhdGVTY2FsYXJUb2tlbiwgcmVzb2x2ZUFzU2NhbGFyLCBzZXRTY2FsYXJWYWx1ZSB9IGZyb20gJy4vY3N0LXNjYWxhci5qcyc7XG5leHBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICcuL2NzdC1zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgdmlzaXQgfSBmcm9tICcuL2NzdC12aXNpdC5qcyc7XG5cbi8qKiBUaGUgYnl0ZSBvcmRlciBtYXJrICovXG5jb25zdCBCT00gPSAnXFx1e0ZFRkZ9Jztcbi8qKiBTdGFydCBvZiBkb2MtbW9kZSAqL1xuY29uc3QgRE9DVU1FTlQgPSAnXFx4MDInOyAvLyBDMDogU3RhcnQgb2YgVGV4dFxuLyoqIFVuZXhwZWN0ZWQgZW5kIG9mIGZsb3ctbW9kZSAqL1xuY29uc3QgRkxPV19FTkQgPSAnXFx4MTgnOyAvLyBDMDogQ2FuY2VsXG4vKiogTmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuY29uc3QgU0NBTEFSID0gJ1xceDFmJzsgLy8gQzA6IFVuaXQgU2VwYXJhdG9yXG4vKiogQHJldHVybnMgYHRydWVgIGlmIGB0b2tlbmAgaXMgYSBmbG93IG9yIGJsb2NrIGNvbGxlY3Rpb24gKi9cbmNvbnN0IGlzQ29sbGVjdGlvbiA9ICh0b2tlbikgPT4gISF0b2tlbiAmJiAnaXRlbXMnIGluIHRva2VuO1xuLyoqIEByZXR1cm5zIGB0cnVlYCBpZiBgdG9rZW5gIGlzIGEgZmxvdyBvciBibG9jayBzY2FsYXI7IG5vdCBhbiBhbGlhcyAqL1xuY29uc3QgaXNTY2FsYXIgPSAodG9rZW4pID0+ICEhdG9rZW4gJiZcbiAgICAodG9rZW4udHlwZSA9PT0gJ3NjYWxhcicgfHxcbiAgICAgICAgdG9rZW4udHlwZSA9PT0gJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJyB8fFxuICAgICAgICB0b2tlbi50eXBlID09PSAnZG91YmxlLXF1b3RlZC1zY2FsYXInIHx8XG4gICAgICAgIHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogR2V0IGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbGV4ZXIgdG9rZW4gKi9cbmZ1bmN0aW9uIHByZXR0eVRva2VuKHRva2VuKSB7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgICBjYXNlIEJPTTpcbiAgICAgICAgICAgIHJldHVybiAnPEJPTT4nO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICc8RE9DPic7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJzxGTE9XX0VORD4nO1xuICAgICAgICBjYXNlIFNDQUxBUjpcbiAgICAgICAgICAgIHJldHVybiAnPFNDQUxBUj4nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRva2VuKTtcbiAgICB9XG59XG4vKiogSWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBsZXhlciB0b2tlbi4gTWF5IHJldHVybiBgbnVsbGAgZm9yIHVua25vd24gdG9rZW5zLiAqL1xuZnVuY3Rpb24gdG9rZW5UeXBlKHNvdXJjZSkge1xuICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgIGNhc2UgQk9NOlxuICAgICAgICAgICAgcmV0dXJuICdieXRlLW9yZGVyLW1hcmsnO1xuICAgICAgICBjYXNlIERPQ1VNRU5UOlxuICAgICAgICAgICAgcmV0dXJuICdkb2MtbW9kZSc7XG4gICAgICAgIGNhc2UgRkxPV19FTkQ6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctZXJyb3ItZW5kJztcbiAgICAgICAgY2FzZSBTQ0FMQVI6XG4gICAgICAgICAgICByZXR1cm4gJ3NjYWxhcic7XG4gICAgICAgIGNhc2UgJy0tLSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1zdGFydCc7XG4gICAgICAgIGNhc2UgJy4uLic6XG4gICAgICAgICAgICByZXR1cm4gJ2RvYy1lbmQnO1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICdcXG4nOlxuICAgICAgICBjYXNlICdcXHJcXG4nOlxuICAgICAgICAgICAgcmV0dXJuICduZXdsaW5lJztcbiAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICByZXR1cm4gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgIGNhc2UgJz8nOlxuICAgICAgICAgICAgcmV0dXJuICdleHBsaWNpdC1rZXktaW5kJztcbiAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICByZXR1cm4gJ21hcC12YWx1ZS1pbmQnO1xuICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtc3RhcnQnO1xuICAgICAgICBjYXNlICd9JzpcbiAgICAgICAgICAgIHJldHVybiAnZmxvdy1tYXAtZW5kJztcbiAgICAgICAgY2FzZSAnWyc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLXN0YXJ0JztcbiAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICByZXR1cm4gJ2Zsb3ctc2VxLWVuZCc7XG4gICAgICAgIGNhc2UgJywnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tYSc7XG4gICAgfVxuICAgIHN3aXRjaCAoc291cmNlWzBdKSB7XG4gICAgICAgIGNhc2UgJyAnOlxuICAgICAgICBjYXNlICdcXHQnOlxuICAgICAgICAgICAgcmV0dXJuICdzcGFjZSc7XG4gICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JztcbiAgICAgICAgY2FzZSAnJSc6XG4gICAgICAgICAgICByZXR1cm4gJ2RpcmVjdGl2ZS1saW5lJztcbiAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICByZXR1cm4gJ2FsaWFzJztcbiAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICByZXR1cm4gJ2FuY2hvcic7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgcmV0dXJuICd0YWcnO1xuICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUtcXVvdGVkLXNjYWxhcic7XG4gICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIHJldHVybiAnZG91YmxlLXF1b3RlZC1zY2FsYXInO1xuICAgICAgICBjYXNlICd8JzpcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICByZXR1cm4gJ2Jsb2NrLXNjYWxhci1oZWFkZXInO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiwgaXNDb2xsZWN0aW9uLCBpc1NjYWxhciwgcHJldHR5VG9rZW4sIHRva2VuVHlwZSB9O1xuIiwiaW1wb3J0IHsgQk9NLCBET0NVTUVOVCwgRkxPV19FTkQsIFNDQUxBUiB9IGZyb20gJy4vY3N0LmpzJztcblxuLypcblNUQVJUIC0+IHN0cmVhbVxuXG5zdHJlYW1cbiAgZGlyZWN0aXZlIC0+IGxpbmUtZW5kIC0+IHN0cmVhbVxuICBpbmRlbnQgKyBsaW5lLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGxpbmUtc3RhcnRcblxubGluZS1lbmRcbiAgY29tbWVudCAtPiBsaW5lLWVuZFxuICBuZXdsaW5lIC0+IC5cbiAgaW5wdXQtZW5kIC0+IEVORFxuXG5saW5lLXN0YXJ0XG4gIGRvYy1zdGFydCAtPiBkb2NcbiAgZG9jLWVuZCAtPiBzdHJlYW1cbiAgW2Vsc2VdIC0+IGluZGVudCAtPiBibG9jay1zdGFydFxuXG5ibG9jay1zdGFydFxuICBzZXEtaXRlbS1zdGFydCAtPiBibG9jay1zdGFydFxuICBleHBsaWNpdC1rZXktc3RhcnQgLT4gYmxvY2stc3RhcnRcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGJsb2NrLXN0YXJ0XG4gIFtlbHNlXSAtPiBkb2NcblxuZG9jXG4gIGxpbmUtZW5kIC0+IGxpbmUtc3RhcnRcbiAgc3BhY2VzIC0+IGRvY1xuICBhbmNob3IgLT4gZG9jXG4gIHRhZyAtPiBkb2NcbiAgZmxvdy1zdGFydCAtPiBmbG93IC0+IGRvY1xuICBmbG93LWVuZCAtPiBlcnJvciAtPiBkb2NcbiAgc2VxLWl0ZW0tc3RhcnQgLT4gZXJyb3IgLT4gZG9jXG4gIGV4cGxpY2l0LWtleS1zdGFydCAtPiBlcnJvciAtPiBkb2NcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGRvY1xuICBhbGlhcyAtPiBkb2NcbiAgcXVvdGUtc3RhcnQgLT4gcXVvdGVkLXNjYWxhciAtPiBkb2NcbiAgYmxvY2stc2NhbGFyLWhlYWRlciAtPiBsaW5lLWVuZCAtPiBibG9jay1zY2FsYXIobWluKSAtPiBsaW5lLXN0YXJ0XG4gIFtlbHNlXSAtPiBwbGFpbi1zY2FsYXIoZmFsc2UsIG1pbikgLT4gZG9jXG5cbmZsb3dcbiAgbGluZS1lbmQgLT4gZmxvd1xuICBzcGFjZXMgLT4gZmxvd1xuICBhbmNob3IgLT4gZmxvd1xuICB0YWcgLT4gZmxvd1xuICBmbG93LXN0YXJ0IC0+IGZsb3cgLT4gZmxvd1xuICBmbG93LWVuZCAtPiAuXG4gIHNlcS1pdGVtLXN0YXJ0IC0+IGVycm9yIC0+IGZsb3dcbiAgZXhwbGljaXQta2V5LXN0YXJ0IC0+IGZsb3dcbiAgbWFwLXZhbHVlLXN0YXJ0IC0+IGZsb3dcbiAgYWxpYXMgLT4gZmxvd1xuICBxdW90ZS1zdGFydCAtPiBxdW90ZWQtc2NhbGFyIC0+IGZsb3dcbiAgY29tbWEgLT4gZmxvd1xuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKHRydWUsIDApIC0+IGZsb3dcblxucXVvdGVkLXNjYWxhclxuICBxdW90ZS1lbmQgLT4gLlxuICBbZWxzZV0gLT4gcXVvdGVkLXNjYWxhclxuXG5ibG9jay1zY2FsYXIobWluKVxuICBuZXdsaW5lICsgcGVlayhpbmRlbnQgPCBtaW4pIC0+IC5cbiAgW2Vsc2VdIC0+IGJsb2NrLXNjYWxhcihtaW4pXG5cbnBsYWluLXNjYWxhcihpcy1mbG93LCBtaW4pXG4gIHNjYWxhci1lbmQoaXMtZmxvdykgLT4gLlxuICBwZWVrKG5ld2xpbmUgKyAoaW5kZW50IDwgbWluKSkgLT4gLlxuICBbZWxzZV0gLT4gcGxhaW4tc2NhbGFyKG1pbilcbiovXG5mdW5jdGlvbiBpc0VtcHR5KGNoKSB7XG4gICAgc3dpdGNoIChjaCkge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgY2FzZSAnICc6XG4gICAgICAgIGNhc2UgJ1xcbic6XG4gICAgICAgIGNhc2UgJ1xccic6XG4gICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5jb25zdCBoZXhEaWdpdHMgPSBuZXcgU2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJyk7XG5jb25zdCB0YWdDaGFycyA9IG5ldyBTZXQoXCIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei0jOy8/OkAmPSskXy4hfionKClcIik7XG5jb25zdCBmbG93SW5kaWNhdG9yQ2hhcnMgPSBuZXcgU2V0KCcsW117fScpO1xuY29uc3QgaW52YWxpZEFuY2hvckNoYXJzID0gbmV3IFNldCgnICxbXXt9XFxuXFxyXFx0Jyk7XG5jb25zdCBpc05vdEFuY2hvckNoYXIgPSAoY2gpID0+ICFjaCB8fCBpbnZhbGlkQW5jaG9yQ2hhcnMuaGFzKGNoKTtcbi8qKlxuICogU3BsaXRzIGFuIGlucHV0IHN0cmluZyBpbnRvIGxleGljYWwgdG9rZW5zLCBpLmUuIHNtYWxsZXIgc3RyaW5ncyB0aGF0IGFyZVxuICogZWFzaWx5IGlkZW50aWZpYWJsZSBieSBgdG9rZW5zLnRva2VuVHlwZSgpYC5cbiAqXG4gKiBMZXhpbmcgc3RhcnRzIGFsd2F5cyBpbiBhIFwic3RyZWFtXCIgY29udGV4dC4gSW5jb21wbGV0ZSBpbnB1dCBtYXkgYmUgYnVmZmVyZWRcbiAqIHVudGlsIGEgY29tcGxldGUgdG9rZW4gY2FuIGJlIGVtaXR0ZWQuXG4gKlxuICogSW4gYWRkaXRpb24gdG8gc2xpY2VzIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCwgdGhlIGZvbGxvd2luZyBjb250cm9sIGNoYXJhY3RlcnNcbiAqIG1heSBhbHNvIGJlIGVtaXR0ZWQ6XG4gKlxuICogLSBgXFx4MDJgIChTdGFydCBvZiBUZXh0KTogQSBkb2N1bWVudCBzdGFydHMgd2l0aCB0aGUgbmV4dCB0b2tlblxuICogLSBgXFx4MThgIChDYW5jZWwpOiBVbmV4cGVjdGVkIGVuZCBvZiBmbG93LW1vZGUgKGluZGljYXRlcyBhbiBlcnJvcilcbiAqIC0gYFxceDFmYCAoVW5pdCBTZXBhcmF0b3IpOiBOZXh0IHRva2VuIGlzIGEgc2NhbGFyIHZhbHVlXG4gKiAtIGBcXHV7RkVGRn1gIChCeXRlIG9yZGVyIG1hcmspOiBFbWl0dGVkIHNlcGFyYXRlbHkgb3V0c2lkZSBkb2N1bWVudHNcbiAqL1xuY2xhc3MgTGV4ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBidWZmZXIgbWFya3MgdGhlIGVuZCBvZlxuICAgICAgICAgKiBhbGwgaW5wdXRcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYXRFbmQgPSBmYWxzZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4cGxpY2l0IGluZGVudCBzZXQgaW4gYmxvY2sgc2NhbGFyIGhlYWRlciwgYXMgYW4gb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnRcbiAgICAgICAgICogbWluaW11bSBpbmRlbnQsIHNvIGUuZy4gc2V0IHRvIDEgZnJvbSBhIGhlYWRlciBgfDIrYC4gU2V0IHRvIC0xIGlmIG5vdFxuICAgICAgICAgKiBleHBsaWNpdGx5IHNldC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQgPSAtMTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJsb2NrIHNjYWxhcnMgdGhhdCBpbmNsdWRlIGEgKyAoa2VlcCkgY2hvbXBpbmcgaW5kaWNhdG9yIGluIHRoZWlyIGhlYWRlclxuICAgICAgICAgKiBpbmNsdWRlIHRyYWlsaW5nIGVtcHR5IGxpbmVzLCB3aGljaCBhcmUgb3RoZXJ3aXNlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gICAgICAgICAqIHNjYWxhcidzIGNvbnRlbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ibG9ja1NjYWxhcktlZXAgPSBmYWxzZTtcbiAgICAgICAgLyoqIEN1cnJlbnQgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5idWZmZXIgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZsYWcgbm90aW5nIHdoZXRoZXIgdGhlIG1hcCB2YWx1ZSBpbmRpY2F0b3IgOiBjYW4gaW1tZWRpYXRlbHkgZm9sbG93IHRoaXNcbiAgICAgICAgICogbm9kZSB3aXRoaW4gYSBmbG93IGNvbnRleHQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgLyoqIENvdW50IG9mIHN1cnJvdW5kaW5nIGZsb3cgY29sbGVjdGlvbiBsZXZlbHMuICovXG4gICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pbmltdW0gbGV2ZWwgb2YgaW5kZW50YXRpb24gcmVxdWlyZWQgZm9yIG5leHQgbGluZXMgdG8gYmUgcGFyc2VkIGFzIGFcbiAgICAgICAgICogcGFydCBvZiB0aGUgY3VycmVudCBzY2FsYXIgdmFsdWUuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAvKiogSW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGN1cnJlbnQgbGluZS4gKi9cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IDA7XG4gICAgICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbmV4dCBcXG4gY2hhcmFjdGVyLiAqL1xuICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBudWxsO1xuICAgICAgICAvKiogU3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbGV4ZXIgaWYgcmVhY2hpbmcgdGhlIGVuZCBvZiBpbmNwb21wbGV0ZSBpbnB1dCAqL1xuICAgICAgICB0aGlzLm5leHQgPSBudWxsO1xuICAgICAgICAvKiogQSBwb2ludGVyIHRvIGBidWZmZXJgOyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbGV4ZXIuICovXG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgWUFNTCB0b2tlbnMgZnJvbSB0aGUgYHNvdXJjZWAgc3RyaW5nLiBJZiBgaW5jb21wbGV0ZWAsXG4gICAgICogYSBwYXJ0IG9mIHRoZSBsYXN0IGxpbmUgbWF5IGJlIGxlZnQgYXMgYSBidWZmZXIgZm9yIHRoZSBuZXh0IGNhbGwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBBIGdlbmVyYXRvciBvZiBsZXhpY2FsIHRva2Vuc1xuICAgICAqL1xuICAgICpsZXgoc291cmNlLCBpbmNvbXBsZXRlID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignc291cmNlIGlzIG5vdCBhIHN0cmluZycpO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyICsgc291cmNlIDogc291cmNlO1xuICAgICAgICAgICAgdGhpcy5saW5lRW5kUG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF0RW5kID0gIWluY29tcGxldGU7XG4gICAgICAgIGxldCBuZXh0ID0gdGhpcy5uZXh0ID8/ICdzdHJlYW0nO1xuICAgICAgICB3aGlsZSAobmV4dCAmJiAoaW5jb21wbGV0ZSB8fCB0aGlzLmhhc0NoYXJzKDEpKSlcbiAgICAgICAgICAgIG5leHQgPSB5aWVsZCogdGhpcy5wYXJzZU5leHQobmV4dCk7XG4gICAgfVxuICAgIGF0TGluZUVuZCgpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgaWYgKCFjaCB8fCBjaCA9PT0gJyMnIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHInKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2kgKyAxXSA9PT0gJ1xcbic7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hhckF0KG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zICsgbl07XG4gICAgfVxuICAgIGNvbnRpbnVlU2NhbGFyKG9mZnNldCkge1xuICAgICAgICBsZXQgY2ggPSB0aGlzLmJ1ZmZlcltvZmZzZXRdO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICcgJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraW5kZW50ICsgb2Zmc2V0XTtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5idWZmZXJbaW5kZW50ICsgb2Zmc2V0ICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICdcXG4nIHx8ICghbmV4dCAmJiAhdGhpcy5hdEVuZCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgKyBpbmRlbnQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNoID09PSAnXFxuJyB8fCBpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0IHx8ICghY2ggJiYgIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgPyBvZmZzZXQgKyBpbmRlbnRcbiAgICAgICAgICAgICAgICA6IC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnLicpIHtcbiAgICAgICAgICAgIGNvbnN0IGR0ID0gdGhpcy5idWZmZXIuc3Vic3RyKG9mZnNldCwgMyk7XG4gICAgICAgICAgICBpZiAoKGR0ID09PSAnLS0tJyB8fCBkdCA9PT0gJy4uLicpICYmIGlzRW1wdHkodGhpcy5idWZmZXJbb2Zmc2V0ICsgM10pKVxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgIH1cbiAgICBnZXRMaW5lKCkge1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5saW5lRW5kUG9zO1xuICAgICAgICBpZiAodHlwZW9mIGVuZCAhPT0gJ251bWJlcicgfHwgKGVuZCAhPT0gLTEgJiYgZW5kIDwgdGhpcy5wb3MpKSB7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcXG4nLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLmxpbmVFbmRQb3MgPSBlbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZCA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hdEVuZCA/IHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy5idWZmZXJbZW5kIC0gMV0gPT09ICdcXHInKVxuICAgICAgICAgICAgZW5kIC09IDE7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MsIGVuZCk7XG4gICAgfVxuICAgIGhhc0NoYXJzKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zICsgbiA8PSB0aGlzLmJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHNldE5leHQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5idWZmZXIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyA9IDA7XG4gICAgICAgIHRoaXMubGluZUVuZFBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmV4dCA9IHN0YXRlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgIH1cbiAgICAqcGFyc2VOZXh0KG5leHQpIHtcbiAgICAgICAgc3dpdGNoIChuZXh0KSB7XG4gICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVN0cmVhbSgpO1xuICAgICAgICAgICAgY2FzZSAnbGluZS1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zdGFydCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTdGFydCgpO1xuICAgICAgICAgICAgY2FzZSAnZG9jJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VEb2N1bWVudCgpO1xuICAgICAgICAgICAgY2FzZSAnZmxvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtcbiAgICAgICAgICAgIGNhc2UgJ3F1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAncGxhaW4tc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVN0cmVhbSgpIHtcbiAgICAgICAgbGV0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdzdHJlYW0nKTtcbiAgICAgICAgaWYgKGxpbmVbMF0gPT09IEJPTSkge1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lWzBdID09PSAnJScpIHtcbiAgICAgICAgICAgIGxldCBkaXJFbmQgPSBsaW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBjcyA9IGxpbmUuaW5kZXhPZignIycpO1xuICAgICAgICAgICAgd2hpbGUgKGNzICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoID0gbGluZVtjcyAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0Jykge1xuICAgICAgICAgICAgICAgICAgICBkaXJFbmQgPSBjcyAtIDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3MgPSBsaW5lLmluZGV4T2YoJyMnLCBjcyArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2ggPSBsaW5lW2RpckVuZCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJyAnIHx8IGNoID09PSAnXFx0JylcbiAgICAgICAgICAgICAgICAgICAgZGlyRW5kIC09IDE7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG4gPSAoeWllbGQqIHRoaXMucHVzaENvdW50KGRpckVuZCkpICsgKHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSkpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7IC8vIHBvc3NpYmxlIGNvbW1lbnRcbiAgICAgICAgICAgIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hdExpbmVFbmQoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3AgPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gc3ApO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIHJldHVybiAnc3RyZWFtJztcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBET0NVTUVOVDtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUxpbmVTdGFydCgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgaWYgKCFjaCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcuJykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kICYmICF0aGlzLmhhc0NoYXJzKDQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2xpbmUtc3RhcnQnKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnBlZWsoMyk7XG4gICAgICAgICAgICBpZiAoKHMgPT09ICctLS0nIHx8IHMgPT09ICcuLi4nKSAmJiBpc0VtcHR5KHRoaXMuY2hhckF0KDMpKSkge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudFZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSAwO1xuICAgICAgICAgICAgICAgIHJldHVybiBzID09PSAnLS0tJyA/ICdkb2MnIDogJ3N0cmVhbSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRlbnRWYWx1ZSA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnROZXh0ID4gdGhpcy5pbmRlbnRWYWx1ZSAmJiAhaXNFbXB0eSh0aGlzLmNoYXJBdCgxKSkpXG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlO1xuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IFtjaDAsIGNoMV0gPSB0aGlzLnBlZWsoMik7XG4gICAgICAgIGlmICghY2gxICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc3RhcnQnKTtcbiAgICAgICAgaWYgKChjaDAgPT09ICctJyB8fCBjaDAgPT09ICc/JyB8fCBjaDAgPT09ICc6JykgJiYgaXNFbXB0eShjaDEpKSB7XG4gICAgICAgICAgICBjb25zdCBuID0gKHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKSkgKyAoeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLmluZGVudE5leHQgPSB0aGlzLmluZGVudFZhbHVlICsgMTtcbiAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgKz0gbjtcbiAgICAgICAgICAgIHJldHVybiAnYmxvY2stc3RhcnQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnZG9jJztcbiAgICB9XG4gICAgKnBhcnNlRG9jdW1lbnQoKSB7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUoKTtcbiAgICAgICAgaWYgKGxpbmUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdkb2MnKTtcbiAgICAgICAgbGV0IG4gPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudChsaW5lLmxlbmd0aCAtIG4pO1xuICAgICAgICAgICAgLy8gZmFsbHRocm91Z2hcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hOZXdsaW5lKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnBhcnNlTGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBjYXNlICd7JzpcbiAgICAgICAgICAgIGNhc2UgJ1snOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgY2FzZSAnXSc6XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2RvYyc7XG4gICAgICAgICAgICBjYXNlICdcIic6XG4gICAgICAgICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO1xuICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKTtcbiAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaENvdW50KGxpbmUubGVuZ3RoIC0gbik7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VCbG9ja1NjYWxhcigpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZUZsb3dDb2xsZWN0aW9uKCkge1xuICAgICAgICBsZXQgbmwsIHNwO1xuICAgICAgICBsZXQgaW5kZW50ID0gLTE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIG5sID0geWllbGQqIHRoaXMucHVzaE5ld2xpbmUoKTtcbiAgICAgICAgICAgIGlmIChubCA+IDApIHtcbiAgICAgICAgICAgICAgICBzcCA9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXMoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50VmFsdWUgPSBpbmRlbnQgPSBzcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHNwID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgIH0gd2hpbGUgKG5sICsgc3AgPiAwKTtcbiAgICAgICAgY29uc3QgbGluZSA9IHRoaXMuZ2V0TGluZSgpO1xuICAgICAgICBpZiAobGluZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Zsb3cnKTtcbiAgICAgICAgaWYgKChpbmRlbnQgIT09IC0xICYmIGluZGVudCA8IHRoaXMuaW5kZW50TmV4dCAmJiBsaW5lWzBdICE9PSAnIycpIHx8XG4gICAgICAgICAgICAoaW5kZW50ID09PSAwICYmXG4gICAgICAgICAgICAgICAgKGxpbmUuc3RhcnRzV2l0aCgnLS0tJykgfHwgbGluZS5zdGFydHNXaXRoKCcuLi4nKSkgJiZcbiAgICAgICAgICAgICAgICBpc0VtcHR5KGxpbmVbM10pKSkge1xuICAgICAgICAgICAgLy8gQWxsb3dpbmcgZm9yIHRoZSB0ZXJtaW5hbCBdIG9yIH0gYXQgdGhlIHNhbWUgKHJhdGhlciB0aGFuIGdyZWF0ZXIpXG4gICAgICAgICAgICAvLyBpbmRlbnQgbGV2ZWwgYXMgdGhlIGluaXRpYWwgWyBvciB7IGlzIHRlY2huaWNhbGx5IGludmFsaWQsIGJ1dFxuICAgICAgICAgICAgLy8gZmFpbGluZyBoZXJlIHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gdXNlcnMuXG4gICAgICAgICAgICBjb25zdCBhdEZsb3dFbmRNYXJrZXIgPSBpbmRlbnQgPT09IHRoaXMuaW5kZW50TmV4dCAtIDEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIChsaW5lWzBdID09PSAnXScgfHwgbGluZVswXSA9PT0gJ30nKTtcbiAgICAgICAgICAgIGlmICghYXRGbG93RW5kTWFya2VyKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMuZmxvd0xldmVsID0gMDtcbiAgICAgICAgICAgICAgICB5aWVsZCBGTE9XX0VORDtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VMaW5lU3RhcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgIHdoaWxlIChsaW5lW25dID09PSAnLCcpIHtcbiAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoSW5kaWNhdG9ycygpO1xuICAgICAgICBzd2l0Y2ggKGxpbmVbbl0pIHtcbiAgICAgICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnZmxvdyc7XG4gICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQobGluZS5sZW5ndGggLSBuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAneyc6XG4gICAgICAgICAgICBjYXNlICdbJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93TGV2ZWwgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Zsb3cnO1xuICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICBjYXNlICddJzpcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dMZXZlbCAtPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dMZXZlbCA/ICdmbG93JyA6ICdkb2MnO1xuICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFVudGlsKGlzTm90QW5jaG9yQ2hhcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgIGNhc2UgJ1wiJzpcbiAgICAgICAgICAgIGNhc2UgXCInXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtcbiAgICAgICAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuY2hhckF0KDEpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZsb3dLZXkgfHwgaXNFbXB0eShuZXh0KSB8fCBuZXh0ID09PSAnLCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG93S2V5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgxKTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbG93JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmZsb3dLZXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucGFyc2VQbGFpblNjYWxhcigpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwYXJzZVF1b3RlZFNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgcXVvdGUgPSB0aGlzLmNoYXJBdCgwKTtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMuYnVmZmVyLmluZGV4T2YocXVvdGUsIHRoaXMucG9zICsgMSk7XG4gICAgICAgIGlmIChxdW90ZSA9PT0gXCInXCIpIHtcbiAgICAgICAgICAgIHdoaWxlIChlbmQgIT09IC0xICYmIHRoaXMuYnVmZmVyW2VuZCArIDFdID09PSBcIidcIilcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKFwiJ1wiLCBlbmQgKyAyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGRvdWJsZS1xdW90ZVxuICAgICAgICAgICAgd2hpbGUgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgbiA9IDA7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuYnVmZmVyW2VuZCAtIDEgLSBuXSA9PT0gJ1xcXFwnKVxuICAgICAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgaWYgKG4gJSAyID09PSAwKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLmJ1ZmZlci5pbmRleE9mKCdcIicsIGVuZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE9ubHkgbG9va2luZyBmb3IgbmV3bGluZXMgd2l0aGluIHRoZSBxdW90ZXNcbiAgICAgICAgY29uc3QgcWIgPSB0aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCwgZW5kKTtcbiAgICAgICAgbGV0IG5sID0gcWIuaW5kZXhPZignXFxuJywgdGhpcy5wb3MpO1xuICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICB3aGlsZSAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3MgPSB0aGlzLmNvbnRpbnVlU2NhbGFyKG5sICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNzID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgbmwgPSBxYi5pbmRleE9mKCdcXG4nLCBjcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmwgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhbiBlcnJvciBjYXVzZWQgYnkgYW4gdW5leHBlY3RlZCB1bmluZGVudFxuICAgICAgICAgICAgICAgIGVuZCA9IG5sIC0gKHFiW25sIC0gMV0gPT09ICdcXHInID8gMiA6IDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXRFbmQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncXVvdGVkLXNjYWxhcicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5idWZmZXIubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KGVuZCArIDEsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmxvd0xldmVsID8gJ2Zsb3cnIDogJ2RvYyc7XG4gICAgfVxuICAgICpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmJsb2NrU2NhbGFySW5kZW50ID0gLTE7XG4gICAgICAgIHRoaXMuYmxvY2tTY2FsYXJLZWVwID0gZmFsc2U7XG4gICAgICAgIGxldCBpID0gdGhpcy5wb3M7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBjb25zdCBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBpZiAoY2ggPT09ICcrJylcbiAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2NhbGFyS2VlcCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChjaCA+ICcwJyAmJiBjaCA8PSAnOScpXG4gICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCA9IE51bWJlcihjaCkgLSAxO1xuICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT09ICctJylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFVudGlsKGNoID0+IGlzRW1wdHkoY2gpIHx8IGNoID09PSAnIycpO1xuICAgIH1cbiAgICAqcGFyc2VCbG9ja1NjYWxhcigpIHtcbiAgICAgICAgbGV0IG5sID0gdGhpcy5wb3MgLSAxOyAvLyBtYXkgYmUgLTEgaWYgdGhpcy5wb3MgPT09IDBcbiAgICAgICAgbGV0IGluZGVudCA9IDA7XG4gICAgICAgIGxldCBjaDtcbiAgICAgICAgbG9vcDogZm9yIChsZXQgaSA9IHRoaXMucG9zOyAoY2ggPSB0aGlzLmJ1ZmZlcltpXSk7ICsraSkge1xuICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dCAmJiAhdGhpcy5hdEVuZClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldE5leHQoJ2Jsb2NrLXNjYWxhcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PT0gJ1xcbicpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IC8vIGZhbGx0aHJvdWdoXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgnYmxvY2stc2NhbGFyJyk7XG4gICAgICAgIGlmIChpbmRlbnQgPj0gdGhpcy5pbmRlbnROZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja1NjYWxhckluZGVudCA9PT0gLTEpXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID0gaW5kZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmRlbnROZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibG9ja1NjYWxhckluZGVudCArICh0aGlzLmluZGVudE5leHQgPT09IDAgPyAxIDogdGhpcy5pbmRlbnROZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcyA9IHRoaXMuY29udGludWVTY2FsYXIobmwgKyAxKTtcbiAgICAgICAgICAgICAgICBpZiAoY3MgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmluZGV4T2YoJ1xcbicsIGNzKTtcbiAgICAgICAgICAgIH0gd2hpbGUgKG5sICE9PSAtMSk7XG4gICAgICAgICAgICBpZiAobmwgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXROZXh0KCdibG9jay1zY2FsYXInKTtcbiAgICAgICAgICAgICAgICBubCA9IHRoaXMuYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFpbGluZyBpbnN1ZmZpY2llbnRseSBpbmRlbnRlZCB0YWJzIGFyZSBpbnZhbGlkLlxuICAgICAgICAvLyBUbyBjYXRjaCB0aGF0IGR1cmluZyBwYXJzaW5nLCB3ZSBpbmNsdWRlIHRoZW0gaW4gdGhlIGJsb2NrIHNjYWxhciB2YWx1ZS5cbiAgICAgICAgbGV0IGkgPSBubCArIDE7XG4gICAgICAgIGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlIChjaCA9PT0gJyAnKVxuICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsrK2ldO1xuICAgICAgICBpZiAoY2ggPT09ICdcXHQnKSB7XG4gICAgICAgICAgICB3aGlsZSAoY2ggPT09ICdcXHQnIHx8IGNoID09PSAnICcgfHwgY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJylcbiAgICAgICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgICAgICBubCA9IGkgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmJsb2NrU2NhbGFyS2VlcCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGxldCBpID0gbmwgLSAxO1xuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhciA9IGk7IC8vIERyb3AgdGhlIGxpbmUgaWYgbGFzdCBjaGFyIG5vdCBtb3JlIGluZGVudGVkXG4gICAgICAgICAgICAgICAgd2hpbGUgKGNoID09PSAnICcpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbLS1pXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nICYmIGkgPj0gdGhpcy5wb3MgJiYgaSArIDEgKyBpbmRlbnQgPiBsYXN0Q2hhcilcbiAgICAgICAgICAgICAgICAgICAgbmwgPSBpO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB5aWVsZCBTQ0FMQVI7XG4gICAgICAgIHlpZWxkKiB0aGlzLnB1c2hUb0luZGV4KG5sICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wYXJzZUxpbmVTdGFydCgpO1xuICAgIH1cbiAgICAqcGFyc2VQbGFpblNjYWxhcigpIHtcbiAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICBsZXQgZW5kID0gdGhpcy5wb3MgLSAxO1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICB3aGlsZSAoKGNoID0gdGhpcy5idWZmZXJbKytpXSkpIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gJzonKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eShuZXh0KSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNFbXB0eShjaCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IHRoaXMuYnVmZmVyW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFxuJztcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSB0aGlzLmJ1ZmZlcltpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgPT09ICcjJyB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMobmV4dCkpKVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNzID0gdGhpcy5jb250aW51ZVNjYWxhcihpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjcyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgaSA9IE1hdGgubWF4KGksIGNzIC0gMik7IC8vIHRvIGFkdmFuY2UsIGJ1dCBzdGlsbCBhY2NvdW50IGZvciAnICMnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGluRmxvdyAmJiBmbG93SW5kaWNhdG9yQ2hhcnMuaGFzKGNoKSlcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNoICYmICF0aGlzLmF0RW5kKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0TmV4dCgncGxhaW4tc2NhbGFyJyk7XG4gICAgICAgIHlpZWxkIFNDQUxBUjtcbiAgICAgICAgeWllbGQqIHRoaXMucHVzaFRvSW5kZXgoZW5kICsgMSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBpbkZsb3cgPyAnZmxvdycgOiAnZG9jJztcbiAgICB9XG4gICAgKnB1c2hDb3VudChuKSB7XG4gICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLCBuKTtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IG47XG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgKnB1c2hUb0luZGV4KGksIGFsbG93RW1wdHkpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuYnVmZmVyLnNsaWNlKHRoaXMucG9zLCBpKTtcbiAgICAgICAgaWYgKHMpIHtcbiAgICAgICAgICAgIHlpZWxkIHM7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSBzLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGxvd0VtcHR5KVxuICAgICAgICAgICAgeWllbGQgJyc7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAqcHVzaEluZGljYXRvcnMoKSB7XG4gICAgICAgIGxldCBuID0gMDtcbiAgICAgICAgbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jaGFyQXQoMCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVGFnKCk7XG4gICAgICAgICAgICAgICAgICAgIG4gKz0geWllbGQqIHRoaXMucHVzaFNwYWNlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDtcbiAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoVW50aWwoaXNOb3RBbmNob3JDaGFyKTtcbiAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoU3BhY2VzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgIGNhc2UgJy0nOiAvLyB0aGlzIGlzIGFuIGVycm9yXG4gICAgICAgICAgICAgICAgY2FzZSAnPyc6IC8vIHRoaXMgaXMgYW4gZXJyb3Igb3V0c2lkZSBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5GbG93ID0gdGhpcy5mbG93TGV2ZWwgPiAwO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaDEgPSB0aGlzLmNoYXJBdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHkoY2gxKSB8fCAoaW5GbG93ICYmIGZsb3dJbmRpY2F0b3JDaGFycy5oYXMoY2gxKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5GbG93KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50TmV4dCA9IHRoaXMuaW5kZW50VmFsdWUgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5mbG93S2V5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvd0tleSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB5aWVsZCogdGhpcy5wdXNoQ291bnQoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuICs9IHlpZWxkKiB0aGlzLnB1c2hTcGFjZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgKnB1c2hUYWcoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoYXJBdCgxKSA9PT0gJzwnKSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMjtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKCFpc0VtcHR5KGNoKSAmJiBjaCAhPT0gJz4nKVxuICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChjaCA9PT0gJz4nID8gaSArIDEgOiBpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgaSA9IHRoaXMucG9zICsgMTtcbiAgICAgICAgICAgIGxldCBjaCA9IHRoaXMuYnVmZmVyW2ldO1xuICAgICAgICAgICAgd2hpbGUgKGNoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ0NoYXJzLmhhcyhjaCkpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gdGhpcy5idWZmZXJbKytpXTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJyUnICYmXG4gICAgICAgICAgICAgICAgICAgIGhleERpZ2l0cy5oYXModGhpcy5idWZmZXJbaSArIDFdKSAmJlxuICAgICAgICAgICAgICAgICAgICBoZXhEaWdpdHMuaGFzKHRoaXMuYnVmZmVyW2kgKyAyXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2ggPSB0aGlzLmJ1ZmZlclsoaSArPSAzKV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaFRvSW5kZXgoaSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpwdXNoTmV3bGluZSgpIHtcbiAgICAgICAgY29uc3QgY2ggPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc107XG4gICAgICAgIGlmIChjaCA9PT0gJ1xcbicpXG4gICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMucHVzaENvdW50KDEpO1xuICAgICAgICBlbHNlIGlmIChjaCA9PT0gJ1xccicgJiYgdGhpcy5jaGFyQXQoMSkgPT09ICdcXG4nKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLnB1c2hDb3VudCgyKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgICpwdXNoU3BhY2VzKGFsbG93VGFicykge1xuICAgICAgICBsZXQgaSA9IHRoaXMucG9zIC0gMTtcbiAgICAgICAgbGV0IGNoO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIH0gd2hpbGUgKGNoID09PSAnICcgfHwgKGFsbG93VGFicyAmJiBjaCA9PT0gJ1xcdCcpKTtcbiAgICAgICAgY29uc3QgbiA9IGkgLSB0aGlzLnBvcztcbiAgICAgICAgaWYgKG4gPiAwKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsIG4pO1xuICAgICAgICAgICAgdGhpcy5wb3MgPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICAqcHVzaFVudGlsKHRlc3QpIHtcbiAgICAgICAgbGV0IGkgPSB0aGlzLnBvcztcbiAgICAgICAgbGV0IGNoID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHdoaWxlICghdGVzdChjaCkpXG4gICAgICAgICAgICBjaCA9IHRoaXMuYnVmZmVyWysraV07XG4gICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5wdXNoVG9JbmRleChpLCBmYWxzZSk7XG4gICAgfVxufVxuXG5leHBvcnQgeyBMZXhlciB9O1xuIiwiLyoqXG4gKiBUcmFja3MgbmV3bGluZXMgZHVyaW5nIHBhcnNpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZSBhbiBlZmZpY2llbnQgQVBJIGZvclxuICogZGV0ZXJtaW5pbmcgdGhlIG9uZS1pbmRleGVkIGB7IGxpbmUsIGNvbCB9YCBwb3NpdGlvbiBmb3IgYW55IG9mZnNldFxuICogd2l0aGluIHRoZSBpbnB1dC5cbiAqL1xuY2xhc3MgTGluZUNvdW50ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmxpbmVTdGFydHMgPSBbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNob3VsZCBiZSBjYWxsZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIGNhbGxcbiAgICAgICAgICogYGxpbmVDb3VudGVyLmxpbmVTdGFydHMuc29ydCgpYCBiZWZvcmUgY2FsbGluZyBgbGluZVBvcygpYC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkTmV3TGluZSA9IChvZmZzZXQpID0+IHRoaXMubGluZVN0YXJ0cy5wdXNoKG9mZnNldCk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggYW5kIHJldHVybnMgdGhlIDEtaW5kZXhlZCB7IGxpbmUsIGNvbCB9XG4gICAgICAgICAqIHBvc2l0aW9uIG9mIGBvZmZzZXRgLiBJZiBgbGluZSA9PT0gMGAsIGBhZGROZXdMaW5lYCBoYXMgbmV2ZXIgYmVlblxuICAgICAgICAgKiBjYWxsZWQgb3IgYG9mZnNldGAgaXMgYmVmb3JlIHRoZSBmaXJzdCBrbm93biBuZXdsaW5lLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5saW5lUG9zID0gKG9mZnNldCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxvdyA9IDA7XG4gICAgICAgICAgICBsZXQgaGlnaCA9IHRoaXMubGluZVN0YXJ0cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOyAvLyBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGluZVN0YXJ0c1ttaWRdIDwgb2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVTdGFydHNbbG93XSA9PT0gb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiB7IGxpbmU6IGxvdyArIDEsIGNvbDogMSB9O1xuICAgICAgICAgICAgaWYgKGxvdyA9PT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjb2w6IG9mZnNldCB9O1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLmxpbmVTdGFydHNbbG93IC0gMV07XG4gICAgICAgICAgICByZXR1cm4geyBsaW5lOiBsb3csIGNvbDogb2Zmc2V0IC0gc3RhcnQgKyAxIH07XG4gICAgICAgIH07XG4gICAgfVxufVxuXG5leHBvcnQgeyBMaW5lQ291bnRlciB9O1xuIiwiaW1wb3J0IHsgdG9rZW5UeXBlIH0gZnJvbSAnLi9jc3QuanMnO1xuaW1wb3J0IHsgTGV4ZXIgfSBmcm9tICcuL2xleGVyLmpzJztcblxuZnVuY3Rpb24gaW5jbHVkZXNUb2tlbihsaXN0LCB0eXBlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKVxuICAgICAgICBpZiAobGlzdFtpXS50eXBlID09PSB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZmluZE5vbkVtcHR5SW5kZXgobGlzdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBzd2l0Y2ggKGxpc3RbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gaXNGbG93VG9rZW4odG9rZW4pIHtcbiAgICBzd2l0Y2ggKHRva2VuPy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2FsaWFzJzpcbiAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICBjYXNlICdkb3VibGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRQcmV2UHJvcHMocGFyZW50KSB7XG4gICAgc3dpdGNoIChwYXJlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdkb2N1bWVudCc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50LnN0YXJ0O1xuICAgICAgICBjYXNlICdibG9jay1tYXAnOiB7XG4gICAgICAgICAgICBjb25zdCBpdCA9IHBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICByZXR1cm4gaXQuc2VwID8/IGl0LnN0YXJ0O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50Lml0ZW1zW3BhcmVudC5pdGVtcy5sZW5ndGggLSAxXS5zdGFydDtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59XG4vKiogTm90ZTogTWF5IG1vZGlmeSBpbnB1dCBhcnJheSAqL1xuZnVuY3Rpb24gZ2V0Rmlyc3RLZXlTdGFydFByb3BzKHByZXYpIHtcbiAgICBpZiAocHJldi5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBbXTtcbiAgICBsZXQgaSA9IHByZXYubGVuZ3RoO1xuICAgIGxvb3A6IHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICBzd2l0Y2ggKHByZXZbaV0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAocHJldlsrK2ldPy50eXBlID09PSAnc3BhY2UnKSB7XG4gICAgICAgIC8qIGxvb3AgKi9cbiAgICB9XG4gICAgcmV0dXJuIHByZXYuc3BsaWNlKGksIHByZXYubGVuZ3RoKTtcbn1cbmZ1bmN0aW9uIGFycmF5UHVzaEFycmF5KHRhcmdldCwgc291cmNlKSB7XG4gICAgLy8gTWF5IGV4aGF1c3QgY2FsbCBzdGFjayB3aXRoIGxhcmdlIGBzb3VyY2VgIGFycmF5XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPCAxZTUpXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRhcmdldCwgc291cmNlKTtcbiAgICBlbHNlXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlW2ldKTtcbn1cbmZ1bmN0aW9uIGZpeEZsb3dTZXFJdGVtcyhmYykge1xuICAgIGlmIChmYy5zdGFydC50eXBlID09PSAnZmxvdy1zZXEtc3RhcnQnKSB7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgZmMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdC5zZXAgJiZcbiAgICAgICAgICAgICAgICAhaXQudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ2V4cGxpY2l0LWtleS1pbmQnKSAmJlxuICAgICAgICAgICAgICAgICFpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdC5rZXkpXG4gICAgICAgICAgICAgICAgICAgIGl0LnZhbHVlID0gaXQua2V5O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmxvd1Rva2VuKGl0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUuZW5kKVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQudmFsdWUuZW5kLCBpdC5zZXApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZS5lbmQgPSBpdC5zZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYXJyYXlQdXNoQXJyYXkoaXQuc3RhcnQsIGl0LnNlcCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGl0LnNlcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBZQU1MIGNvbmNyZXRlIHN5bnRheCB0cmVlIChDU1QpIHBhcnNlclxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBzcmM6IHN0cmluZyA9IC4uLlxuICogZm9yIChjb25zdCB0b2tlbiBvZiBuZXcgUGFyc2VyKCkucGFyc2Uoc3JjKSkge1xuICogICAvLyB0b2tlbjogVG9rZW5cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRvIHVzZSB0aGUgcGFyc2VyIHdpdGggYSB1c2VyLXByb3ZpZGVkIGxleGVyOlxuICpcbiAqIGBgYHRzXG4gKiBmdW5jdGlvbiogcGFyc2Uoc291cmNlOiBzdHJpbmcsIGxleGVyOiBMZXhlcikge1xuICogICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKClcbiAqICAgZm9yIChjb25zdCBsZXhlbWUgb2YgbGV4ZXIubGV4KHNvdXJjZSkpXG4gKiAgICAgeWllbGQqIHBhcnNlci5uZXh0KGxleGVtZSlcbiAqICAgeWllbGQqIHBhcnNlci5lbmQoKVxuICogfVxuICpcbiAqIGNvbnN0IHNyYzogc3RyaW5nID0gLi4uXG4gKiBjb25zdCBsZXhlciA9IG5ldyBMZXhlcigpXG4gKiBmb3IgKGNvbnN0IHRva2VuIG9mIHBhcnNlKHNyYywgbGV4ZXIpKSB7XG4gKiAgIC8vIHRva2VuOiBUb2tlblxuICogfVxuICogYGBgXG4gKi9cbmNsYXNzIFBhcnNlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9uTmV3TGluZSAtIElmIGRlZmluZWQsIGNhbGxlZCBzZXBhcmF0ZWx5IHdpdGggdGhlIHN0YXJ0IHBvc2l0aW9uIG9mXG4gICAgICogICBlYWNoIG5ldyBsaW5lIChpbiBgcGFyc2UoKWAsIGluY2x1ZGluZyB0aGUgc3RhcnQgb2YgaW5wdXQpLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9uTmV3TGluZSkge1xuICAgICAgICAvKiogSWYgdHJ1ZSwgc3BhY2UgYW5kIHNlcXVlbmNlIGluZGljYXRvcnMgY291bnQgYXMgaW5kZW50YXRpb24gKi9cbiAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAvKiogSWYgdHJ1ZSwgbmV4dCB0b2tlbiBpcyBhIHNjYWxhciB2YWx1ZSAqL1xuICAgICAgICB0aGlzLmF0U2NhbGFyID0gZmFsc2U7XG4gICAgICAgIC8qKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsICovXG4gICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHNpbmNlIHRoZSBzdGFydCBvZiBwYXJzaW5nICovXG4gICAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICAgICAgLyoqIE9uIHRoZSBzYW1lIGxpbmUgd2l0aCBhIGJsb2NrIG1hcCBrZXkgKi9cbiAgICAgICAgdGhpcy5vbktleUxpbmUgPSBmYWxzZTtcbiAgICAgICAgLyoqIFRvcCBpbmRpY2F0ZXMgdGhlIG5vZGUgdGhhdCdzIGN1cnJlbnRseSBiZWluZyBidWlsdCAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIC8qKiBUaGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHRva2VuLCBzZXQgaW4gcGFyc2UoKSAqL1xuICAgICAgICB0aGlzLnNvdXJjZSA9ICcnO1xuICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgdG9rZW4sIHNldCBpbiBwYXJzZSgpICovXG4gICAgICAgIHRoaXMudHlwZSA9ICcnO1xuICAgICAgICAvLyBNdXN0IGJlIGRlZmluZWQgYWZ0ZXIgYG5leHQoKWBcbiAgICAgICAgdGhpcy5sZXhlciA9IG5ldyBMZXhlcigpO1xuICAgICAgICB0aGlzLm9uTmV3TGluZSA9IG9uTmV3TGluZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgYHNvdXJjZWAgYXMgYSBZQU1MIHN0cmVhbS5cbiAgICAgKiBJZiBgaW5jb21wbGV0ZWAsIGEgcGFydCBvZiB0aGUgbGFzdCBsaW5lIG1heSBiZSBsZWZ0IGFzIGEgYnVmZmVyIGZvciB0aGUgbmV4dCBjYWxsLlxuICAgICAqXG4gICAgICogRXJyb3JzIGFyZSBub3QgdGhyb3duLCBidXQgeWllbGRlZCBhcyBgeyB0eXBlOiAnZXJyb3InLCBtZXNzYWdlIH1gIHRva2Vucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEEgZ2VuZXJhdG9yIG9mIHRva2VucyByZXByZXNlbnRpbmcgZWFjaCBkaXJlY3RpdmUsIGRvY3VtZW50LCBhbmQgb3RoZXIgc3RydWN0dXJlLlxuICAgICAqL1xuICAgICpwYXJzZShzb3VyY2UsIGluY29tcGxldGUgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUgJiYgdGhpcy5vZmZzZXQgPT09IDApXG4gICAgICAgICAgICB0aGlzLm9uTmV3TGluZSgwKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXhlbWUgb2YgdGhpcy5sZXhlci5sZXgoc291cmNlLCBpbmNvbXBsZXRlKSlcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLm5leHQobGV4ZW1lKTtcbiAgICAgICAgaWYgKCFpbmNvbXBsZXRlKVxuICAgICAgICAgICAgeWllbGQqIHRoaXMuZW5kKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkdmFuY2UgdGhlIHBhcnNlciBieSB0aGUgYHNvdXJjZWAgb2Ygb25lIGxleGljYWwgdG9rZW4uXG4gICAgICovXG4gICAgKm5leHQoc291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgICBpZiAodGhpcy5hdFNjYWxhcikge1xuICAgICAgICAgICAgdGhpcy5hdFNjYWxhciA9IGZhbHNlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlID0gdG9rZW5UeXBlKHNvdXJjZSk7XG4gICAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGBOb3QgYSBZQU1MIHRva2VuOiAke3NvdXJjZX1gO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHsgdHlwZTogJ2Vycm9yJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgbWVzc2FnZSwgc291cmNlIH0pO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnc2NhbGFyJykge1xuICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXRTY2FsYXIgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlID0gJ3NjYWxhcic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTmV3TGluZSh0aGlzLm9mZnNldCArIHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSAmJiBzb3VyY2VbMF0gPT09ICcgJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2V4cGxpY2l0LWtleS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0TmV3TGluZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ICs9IHNvdXJjZS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvYy1tb2RlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LWVycm9yLWVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0TmV3TGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQ2FsbCBhdCBlbmQgb2YgaW5wdXQgdG8gcHVzaCBvdXQgYW55IHJlbWFpbmluZyBjb25zdHJ1Y3Rpb25zICovXG4gICAgKmVuZCgpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuc3RhY2subGVuZ3RoID4gMClcbiAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgIH1cbiAgICBnZXQgc291cmNlVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IHN0ID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBzdDtcbiAgICB9XG4gICAgKnN0ZXAoKSB7XG4gICAgICAgIGNvbnN0IHRvcCA9IHRoaXMucGVlaygxKTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RvYy1lbmQnICYmIHRvcD8udHlwZSAhPT0gJ2RvYy1lbmQnKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5zdGFjay5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZG9jLWVuZCcsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRvcClcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5zdHJlYW0oKTtcbiAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5kb2N1bWVudCh0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuc2NhbGFyKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdibG9jay1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCogdGhpcy5ibG9ja1NjYWxhcih0b3ApO1xuICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuYmxvY2tNYXAodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmJsb2NrU2VxdWVuY2UodG9wKTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctY29sbGVjdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmZsb3dDb2xsZWN0aW9uKHRvcCk7XG4gICAgICAgICAgICBjYXNlICdkb2MtZW5kJzpcbiAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHRoaXMuZG9jdW1lbnRFbmQodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICB9XG4gICAgcGVlayhuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoIC0gbl07XG4gICAgfVxuICAgICpwb3AoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBlcnJvciA/PyB0aGlzLnN0YWNrLnBvcCgpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9ICdUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2snO1xuICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZXJyb3InLCBvZmZzZXQ6IHRoaXMub2Zmc2V0LCBzb3VyY2U6ICcnLCBtZXNzYWdlIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFjay5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5wZWVrKDEpO1xuICAgICAgICAgICAgaWYgKHRva2VuLnR5cGUgPT09ICdibG9jay1zY2FsYXInKSB7XG4gICAgICAgICAgICAgICAgLy8gQmxvY2sgc2NhbGFycyB1c2UgdGhlaXIgcGFyZW50IHJhdGhlciB0aGFuIGhlYWRlciBpbmRlbnRcbiAgICAgICAgICAgICAgICB0b2tlbi5pbmRlbnQgPSAnaW5kZW50JyBpbiB0b3AgPyB0b3AuaW5kZW50IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nICYmIHRvcC50eXBlID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBpbmRlbnQgZm9yIHRvcC1sZXZlbCBmbG93IGNvbGxlY3Rpb25zXG4gICAgICAgICAgICAgICAgdG9rZW4uaW5kZW50ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnZmxvdy1jb2xsZWN0aW9uJylcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXModG9rZW4pO1xuICAgICAgICAgICAgc3dpdGNoICh0b3AudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzpcbiAgICAgICAgICAgICAgICAgICAgdG9wLnZhbHVlID0gdG9rZW47XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgICAgIHRvcC5wcm9wcy5wdXNoKHRva2VuKTsgLy8gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYmxvY2stbWFwJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogdG9rZW4sIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSAhaXQuZXhwbGljaXRLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNlcSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXQgPSB0b3AuaXRlbXNbdG9wLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwgdmFsdWU6IHRva2VuIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBpdC52YWx1ZSA9IHRva2VuO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1jb2xsZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdCA9IHRvcC5pdGVtc1t0b3AuaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiB0b2tlbiwgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQudmFsdWUgPSB0b2tlbjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpdCwgeyBrZXk6IHRva2VuLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0IHNob3VsZCBub3QgaGFwcGVuICovXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKHRvcC50eXBlID09PSAnZG9jdW1lbnQnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1tYXAnIHx8XG4gICAgICAgICAgICAgICAgdG9wLnR5cGUgPT09ICdibG9jay1zZXEnKSAmJlxuICAgICAgICAgICAgICAgICh0b2tlbi50eXBlID09PSAnYmxvY2stbWFwJyB8fCB0b2tlbi50eXBlID09PSAnYmxvY2stc2VxJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gdG9rZW4uaXRlbXNbdG9rZW4uaXRlbXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGxhc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgIWxhc3Quc2VwICYmXG4gICAgICAgICAgICAgICAgICAgICFsYXN0LnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIGxhc3Quc3RhcnQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmaW5kTm9uRW1wdHlJbmRleChsYXN0LnN0YXJ0KSA9PT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgKHRva2VuLmluZGVudCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdC5zdGFydC5ldmVyeShzdCA9PiBzdC50eXBlICE9PSAnY29tbWVudCcgfHwgc3QuaW5kZW50IDwgdG9rZW4uaW5kZW50KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcC50eXBlID09PSAnZG9jdW1lbnQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9wLmVuZCA9IGxhc3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5pdGVtcy5wdXNoKHsgc3RhcnQ6IGxhc3Quc3RhcnQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuLml0ZW1zLnNwbGljZSgtMSwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgICpzdHJlYW0oKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXJlY3RpdmUtbGluZSc6XG4gICAgICAgICAgICAgICAgeWllbGQgeyB0eXBlOiAnZGlyZWN0aXZlJywgb2Zmc2V0OiB0aGlzLm9mZnNldCwgc291cmNlOiB0aGlzLnNvdXJjZSB9O1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2J5dGUtb3JkZXItbWFyayc6XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMuc291cmNlVG9rZW47XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnZG9jLW1vZGUnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLXN0YXJ0Jzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IFtdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnZG9jLXN0YXJ0JylcbiAgICAgICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGRvYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHlpZWxkIHtcbiAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgbWVzc2FnZTogYFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgc3RyZWFtYCxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgKmRvY3VtZW50KGRvYykge1xuICAgICAgICBpZiAoZG9jLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiB0aGlzLmxpbmVFbmQoZG9jKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RvYy1zdGFydCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoZmluZE5vbkVtcHR5SW5kZXgoZG9jLnN0YXJ0KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBkb2Muc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgZG9jLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUoZG9jKTtcbiAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgdGhpcy5zdGFjay5wdXNoKGJ2KTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB5aWVsZCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBVbmV4cGVjdGVkICR7dGhpcy50eXBlfSB0b2tlbiBpbiBZQU1MIGRvY3VtZW50YCxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuc291cmNlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgICpzY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJykge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IGdldFByZXZQcm9wcyh0aGlzLnBlZWsoMikpO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICBsZXQgc2VwO1xuICAgICAgICAgICAgaWYgKHNjYWxhci5lbmQpIHtcbiAgICAgICAgICAgICAgICBzZXAgPSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgICAgIHNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBzY2FsYXIuZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHNlcCA9IFt0aGlzLnNvdXJjZVRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IHNjYWxhci5vZmZzZXQsXG4gICAgICAgICAgICAgICAgaW5kZW50OiBzY2FsYXIuaW5kZW50LFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBzY2FsYXIsIHNlcCB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB5aWVsZCogdGhpcy5saW5lRW5kKHNjYWxhcik7XG4gICAgfVxuICAgICpibG9ja1NjYWxhcihzY2FsYXIpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgY2FzZSAnbmV3bGluZSc6XG4gICAgICAgICAgICAgICAgc2NhbGFyLnByb3BzLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBzY2FsYXIuc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgICAgICAgICAgICAgLy8gYmxvY2stc2NhbGFyIHNvdXJjZSBpbmNsdWRlcyB0cmFpbGluZyBuZXdsaW5lXG4gICAgICAgICAgICAgICAgdGhpcy5hdE5ld0xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5kZW50ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJykgKyAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAobmwgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmwgPSB0aGlzLnNvdXJjZS5pbmRleE9mKCdcXG4nLCBubCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgc2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgICAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpibG9ja01hcChtYXApIHtcbiAgICAgICAgY29uc3QgaXQgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDFdO1xuICAgICAgICAvLyBpdC5zZXAgaXMgdHJ1ZS1pc2ggaWYgcGFpciBhbHJlYWR5IGhhcyBrZXkgb3IgOiBzZXBhcmF0b3JcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9ICdlbmQnIGluIGl0LnZhbHVlID8gaXQudmFsdWUuZW5kIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0ID0gQXJyYXkuaXNBcnJheShlbmQpID8gZW5kW2VuZC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3Q/LnR5cGUgPT09ICdjb21tZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZD8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgbWFwLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBtYXAuaXRlbXNbbWFwLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPj0gbWFwLmluZGVudCkge1xuICAgICAgICAgICAgY29uc3QgYXRNYXBJbmRlbnQgPSAhdGhpcy5vbktleUxpbmUgJiYgdGhpcy5pbmRlbnQgPT09IG1hcC5pbmRlbnQ7XG4gICAgICAgICAgICBjb25zdCBhdE5leHRJdGVtID0gYXRNYXBJbmRlbnQgJiZcbiAgICAgICAgICAgICAgICAoaXQuc2VwIHx8IGl0LmV4cGxpY2l0S2V5KSAmJlxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSAhPT0gJ3NlcS1pdGVtLWluZCc7XG4gICAgICAgICAgICAvLyBGb3IgZW1wdHkgbm9kZXMsIGFzc2lnbiBuZXdsaW5lLXNlcGFyYXRlZCBub3QgaW5kZW50ZWQgZW1wdHkgdG9rZW5zIHRvIGZvbGxvd2luZyBub2RlXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBbXTtcbiAgICAgICAgICAgIGlmIChhdE5leHRJdGVtICYmIGl0LnNlcCAmJiAhaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBubCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXQuc2VwLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ID0gaXQuc2VwW2ldO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5sLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzcGFjZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QuaW5kZW50ID4gbWFwLmluZGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmwubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmwubGVuZ3RoID49IDIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXQuc2VwLnNwbGljZShubFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICAgICAgY2FzZSAndGFnJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXAgJiYgIWl0LmV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXQuZXhwbGljaXRLZXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TmV4dEl0ZW0gfHwgaXQudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dLCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFwLXZhbHVlLWluZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdC5leHBsaWNpdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ25ld2xpbmUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydDogW10sIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmNsdWRlc1Rva2VuKGl0LnNlcCwgJ21hcC12YWx1ZS1pbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogbnVsbCwgc2VwOiBbdGhpcy5zb3VyY2VUb2tlbl0gfV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmxvd1Rva2VuKGl0LmtleSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhpdC5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaXQua2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGl0LnNlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGUgZ3VhcmQgaXMgd3JvbmcgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdC5rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlIGd1YXJkIGlzIHdyb25nIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaXQuc2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1tYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleSwgc2VwIH1dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFydC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IGFjdHVhbGx5IGF0IG5leHQgaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCA9IGl0LnNlcC5jb25jYXQoc3RhcnQsIHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LnNlcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGl0LnZhbHVlIHx8IGF0TmV4dEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuaXRlbXMucHVzaCh7IHN0YXJ0LCBrZXk6IG51bGwsIHNlcDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jbHVkZXNUb2tlbihpdC5zZXAsICdtYXAtdmFsdWUtaW5kJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAnYWxpYXMnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3NjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZS1xdW90ZWQtc2NhbGFyJzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmcyA9IHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXROZXh0SXRlbSB8fCBpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCwga2V5OiBmcywgc2VwOiBbXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChmcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uS2V5TGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ2ID0gdGhpcy5zdGFydEJsb2NrVmFsdWUobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnYudHlwZSA9PT0gJ2Jsb2NrLXNlcScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWl0LmV4cGxpY2l0S2V5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaW5jbHVkZXNUb2tlbihpdC5zZXAsICduZXdsaW5lJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgYmxvY2stc2VxLWluZCBvbiBzYW1lIGxpbmUgd2l0aCBrZXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGF0TWFwSW5kZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLml0ZW1zLnB1c2goeyBzdGFydCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gICAgKmJsb2NrU2VxdWVuY2Uoc2VxKSB7XG4gICAgICAgIGNvbnN0IGl0ID0gc2VxLml0ZW1zW3NlcS5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAnZW5kJyBpbiBpdC52YWx1ZSA/IGl0LnZhbHVlLmVuZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IEFycmF5LmlzQXJyYXkoZW5kKSA/IGVuZFtlbmQubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Py50eXBlID09PSAnY29tbWVudCcpXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ/LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcS5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgc2VxLml0ZW1zLnB1c2goeyBzdGFydDogW3RoaXMuc291cmNlVG9rZW5dIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdEluZGVudGVkQ29tbWVudChpdC5zdGFydCwgc2VxLmluZGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBzZXEuaXRlbXNbc2VxLml0ZW1zLmxlbmd0aCAtIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gcHJldj8udmFsdWU/LmVuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVuZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVB1c2hBcnJheShlbmQsIGl0LnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ2FuY2hvcic6XG4gICAgICAgICAgICBjYXNlICd0YWcnOlxuICAgICAgICAgICAgICAgIGlmIChpdC52YWx1ZSB8fCB0aGlzLmluZGVudCA8PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNhc2UgJ3NlcS1pdGVtLWluZCc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZW50ICE9PSBzZXEuaW5kZW50KVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBpZiAoaXQudmFsdWUgfHwgaW5jbHVkZXNUb2tlbihpdC5zdGFydCwgJ3NlcS1pdGVtLWluZCcpKVxuICAgICAgICAgICAgICAgICAgICBzZXEuaXRlbXMucHVzaCh7IHN0YXJ0OiBbdGhpcy5zb3VyY2VUb2tlbl0gfSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBpdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPiBzZXEuaW5kZW50KSB7XG4gICAgICAgICAgICBjb25zdCBidiA9IHRoaXMuc3RhcnRCbG9ja1ZhbHVlKHNlcSk7XG4gICAgICAgICAgICBpZiAoYnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goYnYpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgeWllbGQqIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgICAqZmxvd0NvbGxlY3Rpb24oZmMpIHtcbiAgICAgICAgY29uc3QgaXQgPSBmYy5pdGVtc1tmYy5pdGVtcy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2Zsb3ctZXJyb3ItZW5kJykge1xuICAgICAgICAgICAgbGV0IHRvcDtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB0b3AgPSB0aGlzLnBlZWsoMSk7XG4gICAgICAgICAgICB9IHdoaWxlICh0b3A/LnR5cGUgPT09ICdmbG93LWNvbGxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmYy5lbmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1hJzpcbiAgICAgICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdCB8fCBpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0IHx8IGl0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgZmMuaXRlbXMucHVzaCh7IHN0YXJ0OiBbXSwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaXQsIHsga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NwYWNlJzpcbiAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50JzpcbiAgICAgICAgICAgICAgICBjYXNlICduZXdsaW5lJzpcbiAgICAgICAgICAgICAgICBjYXNlICdhbmNob3InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3RhZyc6XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXQuc2VwKVxuICAgICAgICAgICAgICAgICAgICAgICAgaXQuc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICAgICAgY2FzZSAnc2NhbGFyJzpcbiAgICAgICAgICAgICAgICBjYXNlICdzaW5nbGUtcXVvdGVkLXNjYWxhcic6XG4gICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZzID0gdGhpcy5mbG93U2NhbGFyKHRoaXMudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXQgfHwgaXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmYy5pdGVtcy5wdXNoKHsgc3RhcnQ6IFtdLCBrZXk6IGZzLCBzZXA6IFtdIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpdC5zZXApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YWNrLnB1c2goZnMpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGl0LCB7IGtleTogZnMsIHNlcDogW10gfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgICAgICAgICBmYy5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYnYgPSB0aGlzLnN0YXJ0QmxvY2tWYWx1ZShmYyk7XG4gICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSBzaG91bGQgbm90IGhhcHBlbiAqL1xuICAgICAgICAgICAgaWYgKGJ2KVxuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sucHVzaChidik7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBlZWsoMik7XG4gICAgICAgICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdibG9jay1tYXAnICYmXG4gICAgICAgICAgICAgICAgKCh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJiBwYXJlbnQuaW5kZW50ID09PSBmYy5pbmRlbnQpIHx8XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmVudC5pdGVtc1twYXJlbnQuaXRlbXMubGVuZ3RoIC0gMV0uc2VwKSkpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5wb3AoKTtcbiAgICAgICAgICAgICAgICB5aWVsZCogdGhpcy5zdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnR5cGUgPT09ICdtYXAtdmFsdWUtaW5kJyAmJlxuICAgICAgICAgICAgICAgIHBhcmVudC50eXBlICE9PSAnZmxvdy1jb2xsZWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSBnZXRQcmV2UHJvcHMocGFyZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGdldEZpcnN0S2V5U3RhcnRQcm9wcyhwcmV2KTtcbiAgICAgICAgICAgICAgICBmaXhGbG93U2VxSXRlbXMoZmMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcCA9IGZjLmVuZC5zcGxpY2UoMSwgZmMuZW5kLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBmYy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogZmMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQsIGtleTogZmMsIHNlcCB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbktleUxpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGggLSAxXSA9IG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLmxpbmVFbmQoZmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZsb3dTY2FsYXIodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5vbk5ld0xpbmUpIHtcbiAgICAgICAgICAgIGxldCBubCA9IHRoaXMuc291cmNlLmluZGV4T2YoJ1xcbicpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChubCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0ICsgbmwpO1xuICAgICAgICAgICAgICAgIG5sID0gdGhpcy5zb3VyY2UuaW5kZXhPZignXFxuJywgbmwpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnNvdXJjZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBzdGFydEJsb2NrVmFsdWUocGFyZW50KSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhbGlhcyc6XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnc2luZ2xlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgY2FzZSAnZG91YmxlLXF1b3RlZC1zY2FsYXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ2Jsb2NrLXNjYWxhci1oZWFkZXInOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zY2FsYXInLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogW3RoaXMuc291cmNlVG9rZW5dLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICcnXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctbWFwLXN0YXJ0JzpcbiAgICAgICAgICAgIGNhc2UgJ2Zsb3ctc2VxLXN0YXJ0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvdy1jb2xsZWN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc291cmNlVG9rZW4sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdzZXEtaXRlbS1pbmQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdibG9jay1zZXEnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHRoaXMub2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IHRoaXMuaW5kZW50LFxuICAgICAgICAgICAgICAgICAgICBpdGVtczogW3sgc3RhcnQ6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXNlICdleHBsaWNpdC1rZXktaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYmxvY2stbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLm9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZW50OiB0aGlzLmluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFt7IHN0YXJ0LCBleHBsaWNpdEtleTogdHJ1ZSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdtYXAtdmFsdWUtaW5kJzoge1xuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gZ2V0UHJldlByb3BzKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBnZXRGaXJzdEtleVN0YXJ0UHJvcHMocHJldik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jsb2NrLW1hcCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudDogdGhpcy5pbmRlbnQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbeyBzdGFydCwga2V5OiBudWxsLCBzZXA6IFt0aGlzLnNvdXJjZVRva2VuXSB9XVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGF0SW5kZW50ZWRDb21tZW50KHN0YXJ0LCBpbmRlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ2NvbW1lbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pbmRlbnQgPD0gaW5kZW50KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc3RhcnQuZXZlcnkoc3QgPT4gc3QudHlwZSA9PT0gJ25ld2xpbmUnIHx8IHN0LnR5cGUgPT09ICdzcGFjZScpO1xuICAgIH1cbiAgICAqZG9jdW1lbnRFbmQoZG9jRW5kKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgIT09ICdkb2MtbW9kZScpIHtcbiAgICAgICAgICAgIGlmIChkb2NFbmQuZW5kKVxuICAgICAgICAgICAgICAgIGRvY0VuZC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkb2NFbmQuZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ25ld2xpbmUnKVxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgICpsaW5lRW5kKHRva2VuKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjb21tYSc6XG4gICAgICAgICAgICBjYXNlICdkb2Mtc3RhcnQnOlxuICAgICAgICAgICAgY2FzZSAnZG9jLWVuZCc6XG4gICAgICAgICAgICBjYXNlICdmbG93LXNlcS1lbmQnOlxuICAgICAgICAgICAgY2FzZSAnZmxvdy1tYXAtZW5kJzpcbiAgICAgICAgICAgIGNhc2UgJ21hcC12YWx1ZS1pbmQnOlxuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnBvcCgpO1xuICAgICAgICAgICAgICAgIHlpZWxkKiB0aGlzLnN0ZXAoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25ld2xpbmUnOlxuICAgICAgICAgICAgICAgIHRoaXMub25LZXlMaW5lID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBmYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSAnc3BhY2UnOlxuICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGVycm9yc1xuICAgICAgICAgICAgICAgIGlmICh0b2tlbi5lbmQpXG4gICAgICAgICAgICAgICAgICAgIHRva2VuLmVuZC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZW5kID0gW3RoaXMuc291cmNlVG9rZW5dO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICduZXdsaW5lJylcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIHRoaXMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB7IFBhcnNlciB9O1xuIiwiaW1wb3J0IHsgQ29tcG9zZXIgfSBmcm9tICcuL2NvbXBvc2UvY29tcG9zZXIuanMnO1xuaW1wb3J0IHsgRG9jdW1lbnQgfSBmcm9tICcuL2RvYy9Eb2N1bWVudC5qcyc7XG5pbXBvcnQgeyBwcmV0dGlmeUVycm9yLCBZQU1MUGFyc2VFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICcuL2xvZy5qcyc7XG5pbXBvcnQgeyBpc0RvY3VtZW50IH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBMaW5lQ291bnRlciB9IGZyb20gJy4vcGFyc2UvbGluZS1jb3VudGVyLmpzJztcbmltcG9ydCB7IFBhcnNlciB9IGZyb20gJy4vcGFyc2UvcGFyc2VyLmpzJztcblxuZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwcmV0dHlFcnJvcnMgPSBvcHRpb25zLnByZXR0eUVycm9ycyAhPT0gZmFsc2U7XG4gICAgY29uc3QgbGluZUNvdW50ZXIgPSBvcHRpb25zLmxpbmVDb3VudGVyIHx8IChwcmV0dHlFcnJvcnMgJiYgbmV3IExpbmVDb3VudGVyKCkpIHx8IG51bGw7XG4gICAgcmV0dXJuIHsgbGluZUNvdW50ZXIsIHByZXR0eUVycm9ycyB9O1xufVxuLyoqXG4gKiBQYXJzZSB0aGUgaW5wdXQgYXMgYSBzdHJlYW0gb2YgWUFNTCBkb2N1bWVudHMuXG4gKlxuICogRG9jdW1lbnRzIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGJ5IGAuLi5gIG9yIGAtLS1gIG1hcmtlciBsaW5lcy5cbiAqXG4gKiBAcmV0dXJucyBJZiBhbiBlbXB0eSBgZG9jc2AgYXJyYXkgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgb2YgdHlwZVxuICogICBFbXB0eVN0cmVhbSBhbmQgY29udGFpbiBhZGRpdGlvbmFsIHN0cmVhbSBpbmZvcm1hdGlvbi4gSW5cbiAqICAgVHlwZVNjcmlwdCwgeW91IHNob3VsZCB1c2UgYCdlbXB0eScgaW4gZG9jc2AgYXMgYSB0eXBlIGd1YXJkIGZvciBpdC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VBbGxEb2N1bWVudHMoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICBjb25zdCBkb2NzID0gQXJyYXkuZnJvbShjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpKSk7XG4gICAgaWYgKHByZXR0eUVycm9ycyAmJiBsaW5lQ291bnRlcilcbiAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICAgICAgZG9jLndhcm5pbmdzLmZvckVhY2gocHJldHRpZnlFcnJvcihzb3VyY2UsIGxpbmVDb3VudGVyKSk7XG4gICAgICAgIH1cbiAgICBpZiAoZG9jcy5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gZG9jcztcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihbXSwgeyBlbXB0eTogdHJ1ZSB9LCBjb21wb3Nlci5zdHJlYW1JbmZvKCkpO1xufVxuLyoqIFBhcnNlIGFuIGlucHV0IHN0cmluZyBpbnRvIGEgc2luZ2xlIFlBTUwuRG9jdW1lbnQgKi9cbmZ1bmN0aW9uIHBhcnNlRG9jdW1lbnQoc291cmNlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGxpbmVDb3VudGVyLCBwcmV0dHlFcnJvcnMgfSA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKTtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGxpbmVDb3VudGVyPy5hZGROZXdMaW5lKTtcbiAgICBjb25zdCBjb21wb3NlciA9IG5ldyBDb21wb3NlcihvcHRpb25zKTtcbiAgICAvLyBgZG9jYCBpcyBhbHdheXMgc2V0IGJ5IGNvbXBvc2UuZW5kKHRydWUpIGF0IHRoZSB2ZXJ5IGxhdGVzdFxuICAgIGxldCBkb2MgPSBudWxsO1xuICAgIGZvciAoY29uc3QgX2RvYyBvZiBjb21wb3Nlci5jb21wb3NlKHBhcnNlci5wYXJzZShzb3VyY2UpLCB0cnVlLCBzb3VyY2UubGVuZ3RoKSkge1xuICAgICAgICBpZiAoIWRvYylcbiAgICAgICAgICAgIGRvYyA9IF9kb2M7XG4gICAgICAgIGVsc2UgaWYgKGRvYy5vcHRpb25zLmxvZ0xldmVsICE9PSAnc2lsZW50Jykge1xuICAgICAgICAgICAgZG9jLmVycm9ycy5wdXNoKG5ldyBZQU1MUGFyc2VFcnJvcihfZG9jLnJhbmdlLnNsaWNlKDAsIDIpLCAnTVVMVElQTEVfRE9DUycsICdTb3VyY2UgY29udGFpbnMgbXVsdGlwbGUgZG9jdW1lbnRzOyBwbGVhc2UgdXNlIFlBTUwucGFyc2VBbGxEb2N1bWVudHMoKScpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV0dHlFcnJvcnMgJiYgbGluZUNvdW50ZXIpIHtcbiAgICAgICAgZG9jLmVycm9ycy5mb3JFYWNoKHByZXR0aWZ5RXJyb3Ioc291cmNlLCBsaW5lQ291bnRlcikpO1xuICAgICAgICBkb2Mud2FybmluZ3MuZm9yRWFjaChwcmV0dGlmeUVycm9yKHNvdXJjZSwgbGluZUNvdW50ZXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvYztcbn1cbmZ1bmN0aW9uIHBhcnNlKHNyYywgcmV2aXZlciwgb3B0aW9ucykge1xuICAgIGxldCBfcmV2aXZlciA9IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIHJldml2ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgX3Jldml2ZXIgPSByZXZpdmVyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmV2aXZlciAmJiB0eXBlb2YgcmV2aXZlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJldml2ZXI7XG4gICAgfVxuICAgIGNvbnN0IGRvYyA9IHBhcnNlRG9jdW1lbnQoc3JjLCBvcHRpb25zKTtcbiAgICBpZiAoIWRvYylcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgZG9jLndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB3YXJuKGRvYy5vcHRpb25zLmxvZ0xldmVsLCB3YXJuaW5nKSk7XG4gICAgaWYgKGRvYy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZG9jLm9wdGlvbnMubG9nTGV2ZWwgIT09ICdzaWxlbnQnKVxuICAgICAgICAgICAgdGhyb3cgZG9jLmVycm9yc1swXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZG9jLmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICByZXR1cm4gZG9jLnRvSlMoT2JqZWN0LmFzc2lnbih7IHJldml2ZXI6IF9yZXZpdmVyIH0sIG9wdGlvbnMpKTtcbn1cbmZ1bmN0aW9uIHN0cmluZ2lmeSh2YWx1ZSwgcmVwbGFjZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgX3JlcGxhY2VyID0gbnVsbDtcbiAgICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnZnVuY3Rpb24nIHx8IEFycmF5LmlzQXJyYXkocmVwbGFjZXIpKSB7XG4gICAgICAgIF9yZXBsYWNlciA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQgJiYgcmVwbGFjZXIpIHtcbiAgICAgICAgb3B0aW9ucyA9IHJlcGxhY2VyO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBpbmRlbnQgPSBNYXRoLnJvdW5kKG9wdGlvbnMpO1xuICAgICAgICBvcHRpb25zID0gaW5kZW50IDwgMSA/IHVuZGVmaW5lZCA6IGluZGVudCA+IDggPyB7IGluZGVudDogOCB9IDogeyBpbmRlbnQgfTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBrZWVwVW5kZWZpbmVkIH0gPSBvcHRpb25zID8/IHJlcGxhY2VyID8/IHt9O1xuICAgICAgICBpZiAoIWtlZXBVbmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaXNEb2N1bWVudCh2YWx1ZSkgJiYgIV9yZXBsYWNlcilcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIHJldHVybiBuZXcgRG9jdW1lbnQodmFsdWUsIF9yZXBsYWNlciwgb3B0aW9ucykudG9TdHJpbmcob3B0aW9ucyk7XG59XG5cbmV4cG9ydCB7IHBhcnNlLCBwYXJzZUFsbERvY3VtZW50cywgcGFyc2VEb2N1bWVudCwgc3RyaW5naWZ5IH07XG4iLCJleHBvcnQgeyBDb21wb3NlciB9IGZyb20gJy4vY29tcG9zZS9jb21wb3Nlci5qcyc7XG5leHBvcnQgeyBEb2N1bWVudCB9IGZyb20gJy4vZG9jL0RvY3VtZW50LmpzJztcbmV4cG9ydCB7IFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hL1NjaGVtYS5qcyc7XG5leHBvcnQgeyBZQU1MRXJyb3IsIFlBTUxQYXJzZUVycm9yLCBZQU1MV2FybmluZyB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCB7IEFsaWFzIH0gZnJvbSAnLi9ub2Rlcy9BbGlhcy5qcyc7XG5leHBvcnQgeyBpc0FsaWFzLCBpc0NvbGxlY3Rpb24sIGlzRG9jdW1lbnQsIGlzTWFwLCBpc05vZGUsIGlzUGFpciwgaXNTY2FsYXIsIGlzU2VxIH0gZnJvbSAnLi9ub2Rlcy9pZGVudGl0eS5qcyc7XG5leHBvcnQgeyBQYWlyIH0gZnJvbSAnLi9ub2Rlcy9QYWlyLmpzJztcbmV4cG9ydCB7IFNjYWxhciB9IGZyb20gJy4vbm9kZXMvU2NhbGFyLmpzJztcbmV4cG9ydCB7IFlBTUxNYXAgfSBmcm9tICcuL25vZGVzL1lBTUxNYXAuanMnO1xuZXhwb3J0IHsgWUFNTFNlcSB9IGZyb20gJy4vbm9kZXMvWUFNTFNlcS5qcyc7XG5pbXBvcnQgKiBhcyBjc3QgZnJvbSAnLi9wYXJzZS9jc3QuanMnO1xuZXhwb3J0IHsgY3N0IGFzIENTVCB9O1xuZXhwb3J0IHsgTGV4ZXIgfSBmcm9tICcuL3BhcnNlL2xleGVyLmpzJztcbmV4cG9ydCB7IExpbmVDb3VudGVyIH0gZnJvbSAnLi9wYXJzZS9saW5lLWNvdW50ZXIuanMnO1xuZXhwb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9wYXJzZS9wYXJzZXIuanMnO1xuZXhwb3J0IHsgcGFyc2UsIHBhcnNlQWxsRG9jdW1lbnRzLCBwYXJzZURvY3VtZW50LCBzdHJpbmdpZnkgfSBmcm9tICcuL3B1YmxpYy1hcGkuanMnO1xuZXhwb3J0IHsgdmlzaXQsIHZpc2l0QXN5bmMgfSBmcm9tICcuL3Zpc2l0LmpzJztcbiIsIi8vIGBleHBvcnQgKiBhcyBkZWZhdWx0IGZyb20gLi4uYCBmYWlscyBvbiBXZWJwYWNrIHY0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZWVtZWxpL3lhbWwvaXNzdWVzLzIyOFxuaW1wb3J0ICogYXMgWUFNTCBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG5leHBvcnQgZGVmYXVsdCBZQU1MXG5leHBvcnQgKiBmcm9tICcuL2Rpc3QvaW5kZXguanMnXG4iLCJpbXBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgZW5zdXJlUHJlZml4LCB0b0FycmF5LCB1bmlxIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcbi8vI3JlZ2lvbiBzcmMvY29uZmlnLnRzXG5jb25zdCBSRV9RVU9URURfU1RSSU5HID0gL14oWydcIl0pLipcXDEkLztcbmNvbnN0IFJFX0ZJTEVOQU1FX1NURU0gPSAvKFteXFxcXC9dKz8pKD86XFwuXFx3Kyk/JC87XG5mdW5jdGlvbiBnZXREZWZhdWx0Q29uZmlnKCkge1xuXHRyZXR1cm4ge1xuXHRcdHRoZW1lOiBcImRlZmF1bHRcIixcblx0XHR0aXRsZTogXCJTbGlkZXZcIixcblx0XHR0aXRsZVRlbXBsYXRlOiBcIiVzIC0gU2xpZGV2XCIsXG5cdFx0YWRkb25zOiBbXSxcblx0XHRyZW1vdGVBc3NldHM6IGZhbHNlLFxuXHRcdG1vbmFjbzogdHJ1ZSxcblx0XHRtb25hY29UeXBlc1NvdXJjZTogXCJsb2NhbFwiLFxuXHRcdG1vbmFjb1R5cGVzQWRkaXRpb25hbFBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29UeXBlc0lnbm9yZVBhY2thZ2VzOiBbXSxcblx0XHRtb25hY29SdW5BZGRpdGlvbmFsRGVwczogW10sXG5cdFx0bW9uYWNvUnVuVXNlU3RyaWN0OiB0cnVlLFxuXHRcdGRvd25sb2FkOiBmYWxzZSxcblx0XHRleHBvcnQ6IHt9LFxuXHRcdGluZm86IGZhbHNlLFxuXHRcdGhpZ2hsaWdodGVyOiBcInNoaWtpXCIsXG5cdFx0dHdvc2xhc2g6IHRydWUsXG5cdFx0bGluZU51bWJlcnM6IGZhbHNlLFxuXHRcdGNvbG9yU2NoZW1hOiBcImF1dG9cIixcblx0XHRyb3V0ZXJNb2RlOiBcImhpc3RvcnlcIixcblx0XHRhc3BlY3RSYXRpbzogMTYgLyA5LFxuXHRcdGNhbnZhc1dpZHRoOiA5ODAsXG5cdFx0ZXhwb3J0RmlsZW5hbWU6IFwiXCIsXG5cdFx0c2VsZWN0YWJsZTogZmFsc2UsXG5cdFx0dGhlbWVDb25maWc6IHt9LFxuXHRcdGZvbnRzOiB7fSxcblx0XHRmYXZpY29uOiBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9zbGlkZXZqcy9zbGlkZXYvYXNzZXRzL2Zhdmljb24ucG5nXCIsXG5cdFx0ZHJhd2luZ3M6IHt9LFxuXHRcdHBsYW50VW1sU2VydmVyOiBcImh0dHBzOi8vd3d3LnBsYW50dW1sLmNvbS9wbGFudHVtbFwiLFxuXHRcdGNvZGVDb3B5OiB0cnVlLFxuXHRcdG1hZ2ljTW92ZUNvcHk6IHRydWUsXG5cdFx0YXV0aG9yOiBcIlwiLFxuXHRcdHJlY29yZDogXCJkZXZcIixcblx0XHRjc3M6IFwidW5vY3NzXCIsXG5cdFx0cHJlc2VudGVyOiB0cnVlLFxuXHRcdGJyb3dzZXJFeHBvcnRlcjogXCJkZXZcIixcblx0XHRodG1sQXR0cnM6IHt9LFxuXHRcdHRyYW5zaXRpb246IG51bGwsXG5cdFx0ZWRpdG9yOiB0cnVlLFxuXHRcdG1jcDogdHJ1ZSxcblx0XHRjb250ZXh0TWVudTogbnVsbCxcblx0XHR3YWtlTG9jazogdHJ1ZSxcblx0XHRwd2E6IGZhbHNlLFxuXHRcdHJlbW90ZTogZmFsc2UsXG5cdFx0bWRjOiBmYWxzZSxcblx0XHRjb21hcms6IGZhbHNlLFxuXHRcdHNlb01ldGE6IHt9LFxuXHRcdG5vdGVzQXV0b1J1Ynk6IHt9LFxuXHRcdGR1cmF0aW9uOiBcIjMwbWluXCIsXG5cdFx0dGltZXI6IFwic3RvcHdhdGNoXCIsXG5cdFx0bWFnaWNNb3ZlRHVyYXRpb246IDgwMCxcblx0XHRwcmVsb2FkSW1hZ2VzOiB0cnVlLFxuXHRcdGNsaWNrQW5pbWF0aW9uOiBcIlwiXG5cdH07XG59XG5mdW5jdGlvbiByZXNvbHZlQ29uZmlnKGhlYWRtYXR0ZXIsIHRoZW1lTWV0YSA9IHt9LCBmaWxlcGF0aCwgdmVyaWZ5ID0gZmFsc2UpIHtcblx0Y29uc3QgdGhlbWVIaWdodGxpZ2h0ZXIgPSBbXG5cdFx0XCJwcmlzbVwiLFxuXHRcdFwic2hpa2lcIixcblx0XHRcInNoaWtpamlcIlxuXHRdLmluY2x1ZGVzKHRoZW1lTWV0YS5oaWdobGlnaHRlciB8fCBcIlwiKSA/IHRoZW1lTWV0YS5oaWdobGlnaHRlciA6IHZvaWQgMDtcblx0Y29uc3QgdGhlbWVDb2xvclNjaGVtYSA9IFtcImxpZ2h0XCIsIFwiZGFya1wiXS5pbmNsdWRlcyh0aGVtZU1ldGEuY29sb3JTY2hlbWEgfHwgXCJcIikgPyB0aGVtZU1ldGEuY29sb3JTY2hlbWEgOiB2b2lkIDA7XG5cdGNvbnN0IGRlZmF1bHRDb25maWcgPSBnZXREZWZhdWx0Q29uZmlnKCk7XG5cdGNvbnN0IGNvbmZpZyA9IHtcblx0XHQuLi5kZWZhdWx0Q29uZmlnLFxuXHRcdGhpZ2hsaWdodGVyOiB0aGVtZUhpZ2h0bGlnaHRlciB8fCBkZWZhdWx0Q29uZmlnLmhpZ2hsaWdodGVyLFxuXHRcdGNvbG9yU2NoZW1hOiB0aGVtZUNvbG9yU2NoZW1hIHx8IGRlZmF1bHRDb25maWcuY29sb3JTY2hlbWEsXG5cdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzLFxuXHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnLFxuXHRcdC4uLmhlYWRtYXR0ZXIsXG5cdFx0Zm9udHM6IHJlc29sdmVGb250cyh7XG5cdFx0XHQuLi5kZWZhdWx0Q29uZmlnLmZvbnRzLFxuXHRcdFx0Li4udGhlbWVNZXRhLmRlZmF1bHRzPy5mb250cyxcblx0XHRcdC4uLmhlYWRtYXR0ZXIuY29uZmlnPy5mb250cyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/LmZvbnRzXG5cdFx0fSksXG5cdFx0ZHJhd2luZ3M6IHJlc29sdmVEcmF3aW5ncyhoZWFkbWF0dGVyLmRyYXdpbmdzLCBmaWxlcGF0aCksXG5cdFx0aHRtbEF0dHJzOiB7XG5cdFx0XHQuLi5kZWZhdWx0Q29uZmlnLmh0bWxBdHRycyxcblx0XHRcdC4uLnRoZW1lTWV0YS5kZWZhdWx0cz8uaHRtbEF0dHJzLFxuXHRcdFx0Li4uaGVhZG1hdHRlci5jb25maWc/Lmh0bWxBdHRycyxcblx0XHRcdC4uLmhlYWRtYXR0ZXI/Lmh0bWxBdHRyc1xuXHRcdH0sXG5cdFx0dGhlbWVDb25maWc6IHtcblx0XHRcdC4uLmRlZmF1bHRDb25maWcudGhlbWVDb25maWcsXG5cdFx0XHQuLi50aGVtZU1ldGEuZGVmYXVsdHM/LnRoZW1lQ29uZmlnLFxuXHRcdFx0Li4uaGVhZG1hdHRlci5jb25maWc/LnRoZW1lQ29uZmlnLFxuXHRcdFx0Li4uaGVhZG1hdHRlcj8udGhlbWVDb25maWdcblx0XHR9XG5cdH07XG5cdGlmIChjb25maWcuaGlnaGxpZ2h0ZXIgPT09IFwic2hpa2lqaVwiKSB7XG5cdFx0Y29uc29sZS53YXJuKGBbc2xpZGV2XSBcInNoaWtpamlcIiBpcyBtZXJnZWQgYmFjayB0byBcInNoaWtpXCIsIHlvdSBjYW4gc2FmZWx5IGNoYW5nZSBpdCBcImhpZ2hsaWdodGVyOiBzaGlraVwiYCk7XG5cdFx0Y29uZmlnLmhpZ2hsaWdodGVyID0gXCJzaGlraVwiO1xuXHR9XG5cdGlmIChjb25maWcuaGlnaGxpZ2h0ZXIgPT09IFwicHJpc21cIikgdGhyb3cgbmV3IEVycm9yKGBbc2xpZGV2XSBcInByaXNtXCIgc3VwcG9ydCBoYXMgYmVlbiBkcm9wcGVkLiBQbGVhc2UgdXNlIFwiaGlnaGxpZ2h0ZXI6IHNoaWtpXCIgaW5zdGVhZGApO1xuXHRpZiAoY29uZmlnLmNvbG9yU2NoZW1hICE9PSBcImRhcmtcIiAmJiBjb25maWcuY29sb3JTY2hlbWEgIT09IFwibGlnaHRcIikgY29uZmlnLmNvbG9yU2NoZW1hID0gXCJhdXRvXCI7XG5cdGlmICh0aGVtZUNvbG9yU2NoZW1hICYmIGNvbmZpZy5jb2xvclNjaGVtYSA9PT0gXCJhdXRvXCIpIGNvbmZpZy5jb2xvclNjaGVtYSA9IHRoZW1lQ29sb3JTY2hlbWE7XG5cdGNvbmZpZy5hc3BlY3RSYXRpbyA9IHBhcnNlQXNwZWN0UmF0aW8oY29uZmlnLmFzcGVjdFJhdGlvKTtcblx0aWYgKHZlcmlmeSkgdmVyaWZ5Q29uZmlnKGNvbmZpZywgdGhlbWVNZXRhKTtcblx0cmV0dXJuIGNvbmZpZztcbn1cbmZ1bmN0aW9uIHZlcmlmeUNvbmZpZyhjb25maWcsIHRoZW1lTWV0YSA9IHt9LCB3YXJuID0gKHYpID0+IGNvbnNvbGUud2FybihgW3NsaWRldl0gJHt2fWApKSB7XG5cdGNvbnN0IHRoZW1lSGlnaHRsaWdodGVyID0gdGhlbWVNZXRhLmhpZ2hsaWdodGVyID09PSBcInNoaWtpXCIgPyB0aGVtZU1ldGEuaGlnaGxpZ2h0ZXIgOiB2b2lkIDA7XG5cdGNvbnN0IHRoZW1lQ29sb3JTY2hlbWEgPSBbXCJsaWdodFwiLCBcImRhcmtcIl0uaW5jbHVkZXModGhlbWVNZXRhLmNvbG9yU2NoZW1hIHx8IFwiXCIpID8gdGhlbWVNZXRhLmNvbG9yU2NoZW1hIDogdm9pZCAwO1xuXHRpZiAodGhlbWVDb2xvclNjaGVtYSAmJiBjb25maWcuY29sb3JTY2hlbWEgIT09IHRoZW1lQ29sb3JTY2hlbWEpIHdhcm4oYENvbG9yIHNjaGVtYSBcIiR7Y29uZmlnLmNvbG9yU2NoZW1hfVwiIGRvZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdGhlbWVgKTtcblx0aWYgKHRoZW1lSGlnaHRsaWdodGVyICYmIGNvbmZpZy5oaWdobGlnaHRlciAhPT0gdGhlbWVIaWdodGxpZ2h0ZXIpIHdhcm4oYFN5bnRheCBoaWdobGlnaHRlciBcIiR7Y29uZmlnLmhpZ2hsaWdodGVyfVwiIGRvZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdGhlbWVgKTtcblx0aWYgKGNvbmZpZy5jc3MgIT09IFwidW5vY3NzXCIpIHtcblx0XHR3YXJuKGBVbnN1cHBvcnRlZCBBdG9taWMgQ1NTIGVuZ2luZSBcIiR7Y29uZmlnLmNzc31cIiwgZmFsbGJhY2sgdG8gVW5vQ1NTYCk7XG5cdFx0Y29uZmlnLmNzcyA9IFwidW5vY3NzXCI7XG5cdH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVGb250cyhmb250cyA9IHt9KSB7XG5cdGNvbnN0IHsgZmFsbGJhY2tzID0gdHJ1ZSwgaXRhbGljID0gZmFsc2UsIHByb3ZpZGVyID0gXCJnb29nbGVcIiB9ID0gZm9udHM7XG5cdGxldCBzYW5zID0gdG9BcnJheShmb250cy5zYW5zKS5mbGF0TWFwKChpKSA9PiBpLnNwbGl0KFwiLFwiKSkubWFwKChpKSA9PiBpLnRyaW0oKSk7XG5cdGxldCBzZXJpZiA9IHRvQXJyYXkoZm9udHMuc2VyaWYpLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0bGV0IG1vbm8gPSB0b0FycmF5KGZvbnRzLm1vbm8pLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3Qgd2VpZ2h0cyA9IHRvQXJyYXkoZm9udHMud2VpZ2h0cyB8fCBcIjIwMCw0MDAsNjAwXCIpLmZsYXRNYXAoKGkpID0+IGkudG9TdHJpbmcoKS5zcGxpdChcIixcIikpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRjb25zdCBjdXN0b20gPSB0b0FycmF5KGZvbnRzLmN1c3RvbSkuZmxhdE1hcCgoaSkgPT4gaS5zcGxpdChcIixcIikpLm1hcCgoaSkgPT4gaS50cmltKCkpO1xuXHRjb25zdCBsb2NhbCA9IHRvQXJyYXkoZm9udHMubG9jYWwpLmZsYXRNYXAoKGkpID0+IGkuc3BsaXQoXCIsXCIpKS5tYXAoKGkpID0+IGkudHJpbSgpKTtcblx0Y29uc3Qgd2ViZm9udHMgPSBmb250cy53ZWJmb250cyA/IGZvbnRzLndlYmZvbnRzIDogZmFsbGJhY2tzID8gdW5pcShbXG5cdFx0Li4uc2Fucyxcblx0XHQuLi5zZXJpZixcblx0XHQuLi5tb25vLFxuXHRcdC4uLmN1c3RvbVxuXHRdKS5maWx0ZXIoKGkpID0+ICFsb2NhbC5pbmNsdWRlcyhpKSkgOiBbXTtcblx0ZnVuY3Rpb24gdG9RdW90ZWQoZm9udCkge1xuXHRcdGlmIChSRV9RVU9URURfU1RSSU5HLnRlc3QoZm9udCkpIHJldHVybiBmb250O1xuXHRcdHJldHVybiBgXCIke2ZvbnR9XCJgO1xuXHR9XG5cdGlmIChmYWxsYmFja3MpIHtcblx0XHRzYW5zID0gdW5pcShbXG5cdFx0XHQuLi5zYW5zLm1hcCh0b1F1b3RlZCksXG5cdFx0XHRcInVpLXNhbnMtc2VyaWZcIixcblx0XHRcdFwic3lzdGVtLXVpXCIsXG5cdFx0XHRcIi1hcHBsZS1zeXN0ZW1cIixcblx0XHRcdFwiQmxpbmtNYWNTeXN0ZW1Gb250XCIsXG5cdFx0XHRcIlxcXCJTZWdvZSBVSVxcXCJcIixcblx0XHRcdFwiUm9ib3RvXCIsXG5cdFx0XHRcIlxcXCJIZWx2ZXRpY2EgTmV1ZVxcXCJcIixcblx0XHRcdFwiQXJpYWxcIixcblx0XHRcdFwiXFxcIk5vdG8gU2Fuc1xcXCJcIixcblx0XHRcdFwic2Fucy1zZXJpZlwiLFxuXHRcdFx0XCJcXFwiQXBwbGUgQ29sb3IgRW1vamlcXFwiXCIsXG5cdFx0XHRcIlxcXCJTZWdvZSBVSSBFbW9qaVxcXCJcIixcblx0XHRcdFwiXFxcIlNlZ29lIFVJIFN5bWJvbFxcXCJcIixcblx0XHRcdFwiXFxcIk5vdG8gQ29sb3IgRW1vamlcXFwiXCJcblx0XHRdKTtcblx0XHRzZXJpZiA9IHVuaXEoW1xuXHRcdFx0Li4uc2VyaWYubWFwKHRvUXVvdGVkKSxcblx0XHRcdFwidWktc2VyaWZcIixcblx0XHRcdFwiR2VvcmdpYVwiLFxuXHRcdFx0XCJDYW1icmlhXCIsXG5cdFx0XHRcIlxcXCJUaW1lcyBOZXcgUm9tYW5cXFwiXCIsXG5cdFx0XHRcIlRpbWVzXCIsXG5cdFx0XHRcInNlcmlmXCJcblx0XHRdKTtcblx0XHRtb25vID0gdW5pcShbXG5cdFx0XHQuLi5tb25vLm1hcCh0b1F1b3RlZCksXG5cdFx0XHRcInVpLW1vbm9zcGFjZVwiLFxuXHRcdFx0XCJTRk1vbm8tUmVndWxhclwiLFxuXHRcdFx0XCJNZW5sb1wiLFxuXHRcdFx0XCJNb25hY29cIixcblx0XHRcdFwiQ29uc29sYXNcIixcblx0XHRcdFwiXFxcIkxpYmVyYXRpb24gTW9ub1xcXCJcIixcblx0XHRcdFwiXFxcIkNvdXJpZXIgTmV3XFxcIlwiLFxuXHRcdFx0XCJtb25vc3BhY2VcIlxuXHRcdF0pO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0c2Fucyxcblx0XHRzZXJpZixcblx0XHRtb25vLFxuXHRcdHdlYmZvbnRzLFxuXHRcdHByb3ZpZGVyLFxuXHRcdGxvY2FsLFxuXHRcdGl0YWxpYyxcblx0XHR3ZWlnaHRzXG5cdH07XG59XG5mdW5jdGlvbiByZXNvbHZlRHJhd2luZ3Mob3B0aW9ucyA9IHt9LCBmaWxlcGF0aCkge1xuXHRjb25zdCB7IGVuYWJsZWQgPSB0cnVlLCBwZXJzaXN0ID0gZmFsc2UsIHByZXNlbnRlck9ubHkgPSBmYWxzZSwgc3luY0FsbCA9IHRydWUgfSA9IG9wdGlvbnM7XG5cdHJldHVybiB7XG5cdFx0ZW5hYmxlZCxcblx0XHRwZXJzaXN0OiB0eXBlb2YgcGVyc2lzdCA9PT0gXCJzdHJpbmdcIiA/IHBlcnNpc3QgOiBwZXJzaXN0ID8gYC5zbGlkZXYvZHJhd2luZ3Mke2ZpbGVwYXRoID8gYC8ke2ZpbGVwYXRoLm1hdGNoKFJFX0ZJTEVOQU1FX1NURU0pPy5bMV19YCA6IFwiXCJ9YCA6IGZhbHNlLFxuXHRcdHByZXNlbnRlck9ubHksXG5cdFx0c3luY0FsbFxuXHR9O1xufVxuLy8jZW5kcmVnaW9uXG4vLyNyZWdpb24gc3JjL2NvcmUudHNcbmNvbnN0IFJFX0ZST05UTUFUVEVSID0gL14tLS0uKlxccj9cXG4oW1xcc1xcU10qPyktLS0vO1xuY29uc3QgUkVfWUFNTF9DT0RFQkxPQ0sgPSAvXlxccypgYGB5YT9tbChbXFxzXFxTXSo/KWBgYC87XG5jb25zdCBSRV9ET0xMQVJfSU5MSU5FID0gL1xcJC4qP1xcJC87XG5jb25zdCBSRV9ET0xMQVJfQkxPQ0sgPSAvXFwkXFwkLztcbmNvbnN0IFJFX01PTkFDT19CTE9DSyA9IC9cXHttb25hY28uKlxcfS87XG5jb25zdCBSRV9UV0VFVF9UQUcgPSAvPFR3ZWV0XFxiLztcbmNvbnN0IFJFX0JMVUVTS1lfVEFHID0gLzxCbHVlU2t5XFxiLztcbmNvbnN0IFJFX01FUk1BSURfQ09ERUJMT0NLID0gL15gYGBtZXJtYWlkL207XG5jb25zdCBSRV9IRUFESU5HID0gL14oIyspICguKikkL207XG5jb25zdCBSRV9MRUFESU5HX0JBQ0tUSUNLUyA9IC9eXFxzKmArLztcbmNvbnN0IFJFX0NSTEYgPSAvXFxyP1xcbi9nO1xuZnVuY3Rpb24gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUobGluZSwgaW5IdG1sQ29tbWVudCkge1xuXHRsZXQgY3Vyc29yID0gMDtcblx0d2hpbGUgKGN1cnNvciA8IGxpbmUubGVuZ3RoKSBpZiAoaW5IdG1sQ29tbWVudCkge1xuXHRcdGNvbnN0IGVuZCA9IGxpbmUuaW5kZXhPZihcIi0tPlwiLCBjdXJzb3IpO1xuXHRcdGlmIChlbmQgPCAwKSByZXR1cm4gdHJ1ZTtcblx0XHRpbkh0bWxDb21tZW50ID0gZmFsc2U7XG5cdFx0Y3Vyc29yID0gZW5kICsgMztcblx0fSBlbHNlIHtcblx0XHRjb25zdCBzdGFydCA9IGxpbmUuaW5kZXhPZihcIjwhLS1cIiwgY3Vyc29yKTtcblx0XHRpZiAoc3RhcnQgPCAwKSByZXR1cm4gZmFsc2U7XG5cdFx0Y29uc3QgZW5kID0gbGluZS5pbmRleE9mKFwiLS0+XCIsIHN0YXJ0ICsgNCk7XG5cdFx0aWYgKGVuZCA8IDApIHJldHVybiB0cnVlO1xuXHRcdGN1cnNvciA9IGVuZCArIDM7XG5cdH1cblx0cmV0dXJuIGluSHRtbENvbW1lbnQ7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnkoZGF0YSkge1xuXHRyZXR1cm4gYCR7ZGF0YS5zbGlkZXMubWFwKHN0cmluZ2lmeVNsaWRlKS5qb2luKFwiXFxuXCIpLnRyaW0oKX1cXG5gO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5U2xpZGUoZGF0YSwgaWR4ID0gMCkge1xuXHRyZXR1cm4gZGF0YS5yYXcuc3RhcnRzV2l0aChcIi0tLVwiKSB8fCBpZHggPT09IDAgPyBkYXRhLnJhdyA6IGAtLS1cXG4ke2Vuc3VyZVByZWZpeChcIlxcblwiLCBkYXRhLnJhdyl9YDtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5U2xpZGUoZGF0YSkge1xuXHRkYXRhLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQudHJpbSgpID8gYFxcbiR7ZGF0YS5jb250ZW50LnRyaW0oKX1cXG5gIDogXCJcIjtcblx0ZGF0YS5yYXcgPSBkYXRhLmZyb250bWF0dGVyRG9jPy5jb250ZW50cyA/IGRhdGEuZnJvbnRtYXR0ZXJTdHlsZSA9PT0gXCJ5YW1sXCIgPyBgXFxgXFxgXFxgeWFtbFxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG5cXGBcXGBcXGBcXG4ke2RhdGEuY29udGVudH1gIDogYC0tLVxcbiR7ZGF0YS5mcm9udG1hdHRlckRvYy50b1N0cmluZygpLnRyaW0oKX1cXG4tLS1cXG4ke2RhdGEuY29udGVudH1gIDogZGF0YS5jb250ZW50O1xuXHRpZiAoZGF0YS5ub3RlKSBkYXRhLnJhdyArPSBgXFxuPCEtLVxcbiR7ZGF0YS5ub3RlLnRyaW0oKX1cXG4tLT5cXG5gO1xuXHRyZXR1cm4gZGF0YTtcbn1cbmZ1bmN0aW9uIHByZXR0aWZ5KGRhdGEpIHtcblx0ZGF0YS5zbGlkZXMuZm9yRWFjaChwcmV0dGlmeVNsaWRlKTtcblx0cmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiBtYXR0ZXIoY29kZSwgb3B0aW9ucykge1xuXHRsZXQgdHlwZTtcblx0bGV0IHJhdztcblx0bGV0IGNvbnRlbnQgPSBjb2RlLnJlcGxhY2UoUkVfRlJPTlRNQVRURVIsIChfLCBmKSA9PiB7XG5cdFx0dHlwZSA9IFwiZnJvbnRtYXR0ZXJcIjtcblx0XHRyYXcgPSBmO1xuXHRcdHJldHVybiBcIlwiO1xuXHR9KTtcblx0aWYgKHR5cGUgIT09IFwiZnJvbnRtYXR0ZXJcIikgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShSRV9ZQU1MX0NPREVCTE9DSywgKF8sIGYpID0+IHtcblx0XHR0eXBlID0gXCJ5YW1sXCI7XG5cdFx0cmF3ID0gZjtcblx0XHRyZXR1cm4gXCJcIjtcblx0fSk7XG5cdGNvbnN0IGRvYyA9IHJhdyAmJiAhb3B0aW9ucy5ub1BhcnNlWUFNTCA/IFlBTUwucGFyc2VEb2N1bWVudChyYXcpIDogdm9pZCAwO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGUsXG5cdFx0cmF3LFxuXHRcdGRvYyxcblx0XHRkYXRhOiBkb2M/LnRvSlNPTigpLFxuXHRcdGNvbnRlbnRcblx0fTtcbn1cbmNvbnN0IElNQUdFX0VYVEVOU0lPTlMgPSAvXFwuKD86cG5nfGpwZT9nfGdpZnxzdmd8d2VicHxhdmlmfGljb3xibXB8dGlmZj8pJC9pO1xuLyoqXG4qIEV4dHJhY3QgaW1hZ2UgVVJMcyBmcm9tIHNsaWRlIGNvbnRlbnQgYW5kIGZyb250bWF0dGVyLlxuKiBTdHJpcHMgY29kZSBibG9ja3MgZmlyc3QgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzLlxuKi9cbmZ1bmN0aW9uIGV4dHJhY3RJbWFnZXNVc2FnZShjb250ZW50LCBmcm9udG1hdHRlcikge1xuXHRjb25zdCBpbWFnZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRmb3IgKGNvbnN0IGtleSBvZiBbXG5cdFx0XCJpbWFnZVwiLFxuXHRcdFwiYmFja2dyb3VuZEltYWdlXCIsXG5cdFx0XCJiYWNrZ3JvdW5kXCJcblx0XSkge1xuXHRcdGNvbnN0IHZhbCA9IGZyb250bWF0dGVyW2tleV07XG5cdFx0aWYgKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgJiYgdmFsICYmICF2YWwuc3RhcnRzV2l0aChcImRhdGE6XCIpKSBpZiAoa2V5ID09PSBcImJhY2tncm91bmRcIikge1xuXHRcdFx0aWYgKElNQUdFX0VYVEVOU0lPTlMudGVzdCh2YWwpIHx8IHZhbC5zdGFydHNXaXRoKFwiL1wiKSB8fCB2YWwuc3RhcnRzV2l0aChcImh0dHBcIikpIGltYWdlcy5hZGQodmFsKTtcblx0XHR9IGVsc2UgaW1hZ2VzLmFkZCh2YWwpO1xuXHR9XG5cdGNvbnN0IHN0cmlwcGVkID0gY29udGVudC5yZXBsYWNlKC9eYGBgW1xcc1xcU10rP15gYGAvZ20sIFwiXCIpO1xuXHRmb3IgKGNvbnN0IFssIHVybF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLyFcXFtbXlxcXV0qXFxdXFwoKFteKV0rKVxcKS9nKSkgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSkgaW1hZ2VzLmFkZCh1cmwudHJpbSgpKTtcblx0Zm9yIChjb25zdCBbLCB1cmxdIG9mIHN0cmlwcGVkLm1hdGNoQWxsKC9cXGIoPzpzcmN8aW1hZ2UpPVtcIiddKFteXCInXSspW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgIXVybC5pbmNsdWRlcyhcInt7XCIpICYmIElNQUdFX0VYVEVOU0lPTlMudGVzdCh1cmwpKSBpbWFnZXMuYWRkKHVybC50cmltKCkpO1xuXHRmb3IgKGNvbnN0IFssIHVybF0gb2Ygc3RyaXBwZWQubWF0Y2hBbGwoLzooPzpzcmN8aW1hZ2UpPVtcIiddJyhbXiddKyknW1wiJ10vZykpIGlmICh1cmwgJiYgIXVybC5zdGFydHNXaXRoKFwiZGF0YTpcIikgJiYgSU1BR0VfRVhURU5TSU9OUy50ZXN0KHVybCkpIGltYWdlcy5hZGQodXJsLnRyaW0oKSk7XG5cdGZvciAoY29uc3QgWywgdXJsXSBvZiBzdHJpcHBlZC5tYXRjaEFsbCgvdXJsXFwoW1wiJ10/KFteXCInKV0rKVtcIiddP1xcKS9nKSkgaWYgKHVybCAmJiAhdXJsLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSAmJiBJTUFHRV9FWFRFTlNJT05TLnRlc3QodXJsKSkgaW1hZ2VzLmFkZCh1cmwudHJpbSgpKTtcblx0cmV0dXJuIEFycmF5LmZyb20oaW1hZ2VzKTtcbn1cbmZ1bmN0aW9uIGRldGVjdEZlYXR1cmVzKGNvZGUpIHtcblx0cmV0dXJuIHtcblx0XHRrYXRleDogISFjb2RlLm1hdGNoKFJFX0RPTExBUl9JTkxJTkUpIHx8ICEhY29kZS5tYXRjaChSRV9ET0xMQVJfQkxPQ0spLFxuXHRcdG1vbmFjbzogUkVfTU9OQUNPX0JMT0NLLnRlc3QoY29kZSkgPyBzY2FuTW9uYWNvUmVmZXJlbmNlZE1vZHMoY29kZSkgOiBmYWxzZSxcblx0XHR0d2VldDogISFjb2RlLm1hdGNoKFJFX1RXRUVUX1RBRyksXG5cdFx0Ymx1ZXNreTogISFjb2RlLm1hdGNoKFJFX0JMVUVTS1lfVEFHKSxcblx0XHRtZXJtYWlkOiAhIWNvZGUubWF0Y2goUkVfTUVSTUFJRF9DT0RFQkxPQ0spXG5cdH07XG59XG5mdW5jdGlvbiBwYXJzZVNsaWRlKHJhdywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IG1hdHRlclJlc3VsdCA9IG1hdHRlcihyYXcsIG9wdGlvbnMpO1xuXHRsZXQgbm90ZTtcblx0Y29uc3QgZnJvbnRtYXR0ZXIgPSBtYXR0ZXJSZXN1bHQuZGF0YSB8fCB7fTtcblx0bGV0IGNvbnRlbnQgPSBtYXR0ZXJSZXN1bHQuY29udGVudC50cmltKCk7XG5cdGNvbnN0IHJldmlzaW9uID0gaGFzaChyYXcudHJpbSgpKTtcblx0Y29uc3QgY29tbWVudHMgPSBBcnJheS5mcm9tKGNvbnRlbnQubWF0Y2hBbGwoLzwhLS0oW1xcc1xcU10qPyktLT4vZykpO1xuXHRpZiAoY29tbWVudHMubGVuZ3RoKSB7XG5cdFx0Y29uc3QgbGFzdCA9IGNvbW1lbnRzW2NvbW1lbnRzLmxlbmd0aCAtIDFdO1xuXHRcdGlmIChsYXN0LmluZGV4ICE9PSB2b2lkIDAgJiYgbGFzdC5pbmRleCArIGxhc3RbMF0ubGVuZ3RoID49IGNvbnRlbnQubGVuZ3RoKSB7XG5cdFx0XHRub3RlID0gbGFzdFsxXS50cmltKCk7XG5cdFx0XHRjb250ZW50ID0gY29udGVudC5zbGljZSgwLCBsYXN0LmluZGV4KS50cmltKCk7XG5cdFx0fVxuXHR9XG5cdGxldCB0aXRsZTtcblx0bGV0IGxldmVsO1xuXHRpZiAoZnJvbnRtYXR0ZXIudGl0bGUgfHwgZnJvbnRtYXR0ZXIubmFtZSkgdGl0bGUgPSBmcm9udG1hdHRlci50aXRsZSB8fCBmcm9udG1hdHRlci5uYW1lO1xuXHRlbHNlIHtcblx0XHRjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goUkVfSEVBRElORyk7XG5cdFx0dGl0bGUgPSBtYXRjaD8uWzJdPy50cmltKCk7XG5cdFx0bGV2ZWwgPSBtYXRjaD8uWzFdPy5sZW5ndGg7XG5cdH1cblx0aWYgKGZyb250bWF0dGVyLmxldmVsKSBsZXZlbCA9IGZyb250bWF0dGVyLmxldmVsIHx8IDE7XG5cdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RJbWFnZXNVc2FnZShjb250ZW50LCBmcm9udG1hdHRlcik7XG5cdHJldHVybiB7XG5cdFx0cmF3LFxuXHRcdHRpdGxlLFxuXHRcdGxldmVsLFxuXHRcdHJldmlzaW9uLFxuXHRcdGNvbnRlbnQsXG5cdFx0Y29udGVudFJhdzogY29udGVudCxcblx0XHRmcm9udG1hdHRlcixcblx0XHRmcm9udG1hdHRlclN0eWxlOiBtYXR0ZXJSZXN1bHQudHlwZSxcblx0XHRmcm9udG1hdHRlckRvYzogbWF0dGVyUmVzdWx0LmRvYyxcblx0XHRmcm9udG1hdHRlclJhdzogbWF0dGVyUmVzdWx0LnJhdyxcblx0XHRub3RlLFxuXHRcdGltYWdlc1xuXHR9O1xufVxuYXN5bmMgZnVuY3Rpb24gcGFyc2UobWFya2Rvd24sIGZpbGVwYXRoLCBleHRlbnNpb25zLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdChvcHRpb25zLnByZXNlcnZlQ1IgPyBcIlxcblwiIDogUkVfQ1JMRik7XG5cdGNvbnN0IHNsaWRlcyA9IFtdO1xuXHRsZXQgc3RhcnQgPSAwO1xuXHRsZXQgY29udGVudFN0YXJ0ID0gMDtcblx0bGV0IGluSHRtbENvbW1lbnQgPSBmYWxzZTtcblx0YXN5bmMgZnVuY3Rpb24gc2xpY2UoZW5kKSB7XG5cdFx0aWYgKHN0YXJ0ID09PSBlbmQpIHJldHVybjtcblx0XHRjb25zdCBzbGlkZSA9IHtcblx0XHRcdC4uLnBhcnNlU2xpZGUobGluZXMuc2xpY2Uoc3RhcnQsIGVuZCkuam9pbihcIlxcblwiKSwgb3B0aW9ucyksXG5cdFx0XHRmaWxlcGF0aCxcblx0XHRcdGluZGV4OiBzbGlkZXMubGVuZ3RoLFxuXHRcdFx0c3RhcnQsXG5cdFx0XHRjb250ZW50U3RhcnQsXG5cdFx0XHRlbmRcblx0XHR9O1xuXHRcdGlmIChleHRlbnNpb25zKSBmb3IgKGNvbnN0IGUgb2YgZXh0ZW5zaW9ucykge1xuXHRcdFx0aWYgKGUudHJhbnNmb3JtU2xpZGUpIHtcblx0XHRcdFx0Y29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGUudHJhbnNmb3JtU2xpZGUoc2xpZGUuY29udGVudCwgc2xpZGUuZnJvbnRtYXR0ZXIpO1xuXHRcdFx0XHRpZiAobmV3Q29udGVudCAhPT0gdm9pZCAwKSBzbGlkZS5jb250ZW50ID0gbmV3Q29udGVudDtcblx0XHRcdFx0aWYgKHR5cGVvZiBzbGlkZS5mcm9udG1hdHRlci50aXRsZSA9PT0gXCJzdHJpbmdcIikgc2xpZGUudGl0bGUgPSBzbGlkZS5mcm9udG1hdHRlci50aXRsZTtcblx0XHRcdFx0aWYgKHR5cGVvZiBzbGlkZS5mcm9udG1hdHRlci5sZXZlbCA9PT0gXCJudW1iZXJcIikgc2xpZGUubGV2ZWwgPSBzbGlkZS5mcm9udG1hdHRlci5sZXZlbDtcblx0XHRcdH1cblx0XHRcdGlmIChlLnRyYW5zZm9ybU5vdGUpIHtcblx0XHRcdFx0Y29uc3QgbmV3Tm90ZSA9IGF3YWl0IGUudHJhbnNmb3JtTm90ZShzbGlkZS5ub3RlLCBzbGlkZS5mcm9udG1hdHRlcik7XG5cdFx0XHRcdGlmIChuZXdOb3RlICE9PSB2b2lkIDApIHNsaWRlLm5vdGUgPSBuZXdOb3RlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRzbGlkZXMucHVzaChzbGlkZSk7XG5cdFx0c3RhcnQgPSBlbmQgKyAxO1xuXHRcdGNvbnRlbnRTdGFydCA9IGVuZCArIDE7XG5cdH1cblx0aWYgKGV4dGVuc2lvbnMpIHtcblx0XHRmb3IgKGNvbnN0IGUgb2YgZXh0ZW5zaW9ucykgaWYgKGUudHJhbnNmb3JtUmF3TGluZXMpIGF3YWl0IGUudHJhbnNmb3JtUmF3TGluZXMobGluZXMpO1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCByYXdMaW5lID0gbGluZXNbaV07XG5cdFx0Y29uc3QgbGluZSA9IHJhd0xpbmUudHJpbUVuZCgpO1xuXHRcdGlmIChpbkh0bWxDb21tZW50KSB7XG5cdFx0XHRpbkh0bWxDb21tZW50ID0gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUocmF3TGluZSwgdHJ1ZSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKGxpbmUuc3RhcnRzV2l0aChcIi0tLVwiKSkge1xuXHRcdFx0YXdhaXQgc2xpY2UoaSk7XG5cdFx0XHRjb25zdCBuZXh0ID0gbGluZXNbaSArIDFdO1xuXHRcdFx0aWYgKGxpbmVbM10gIT09IFwiLVwiICYmIG5leHQ/LnRyaW0oKSkge1xuXHRcdFx0XHRzdGFydCA9IGk7XG5cdFx0XHRcdGZvciAoaSArPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIGlmIChsaW5lc1tpXS50cmltRW5kKCkgPT09IFwiLS0tXCIpIGJyZWFrO1xuXHRcdFx0XHRjb250ZW50U3RhcnQgPSBpICsgMTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGxpbmUudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChcImBgYFwiKSkge1xuXHRcdFx0Y29uc3QgY29kZUJsb2NrTGV2ZWwgPSBsaW5lLm1hdGNoKFJFX0xFQURJTkdfQkFDS1RJQ0tTKVswXTtcblx0XHRcdGxldCBqID0gaSArIDE7XG5cdFx0XHRmb3IgKDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSBpZiAobGluZXNbal0uc3RhcnRzV2l0aChjb2RlQmxvY2tMZXZlbCkpIGJyZWFrO1xuXHRcdFx0aWYgKGogIT09IGxpbmVzLmxlbmd0aCkgaSA9IGo7XG5cdFx0fSBlbHNlIGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCBmYWxzZSk7XG5cdH1cblx0aWYgKHN0YXJ0IDw9IGxpbmVzLmxlbmd0aCAtIDEpIGF3YWl0IHNsaWNlKGxpbmVzLmxlbmd0aCk7XG5cdHJldHVybiB7XG5cdFx0ZmlsZXBhdGgsXG5cdFx0cmF3OiBtYXJrZG93bixcblx0XHRzbGlkZXNcblx0fTtcbn1cbmZ1bmN0aW9uIHBhcnNlU3luYyhtYXJrZG93biwgZmlsZXBhdGgsIG9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBsaW5lcyA9IG1hcmtkb3duLnNwbGl0KG9wdGlvbnMucHJlc2VydmVDUiA/IFwiXFxuXCIgOiBSRV9DUkxGKTtcblx0Y29uc3Qgc2xpZGVzID0gW107XG5cdGxldCBzdGFydCA9IDA7XG5cdGxldCBjb250ZW50U3RhcnQgPSAwO1xuXHRsZXQgaW5IdG1sQ29tbWVudCA9IGZhbHNlO1xuXHRmdW5jdGlvbiBzbGljZShlbmQpIHtcblx0XHRpZiAoc3RhcnQgPT09IGVuZCkgcmV0dXJuO1xuXHRcdGNvbnN0IHNsaWRlID0ge1xuXHRcdFx0Li4ucGFyc2VTbGlkZShsaW5lcy5zbGljZShzdGFydCwgZW5kKS5qb2luKFwiXFxuXCIpLCBvcHRpb25zKSxcblx0XHRcdGZpbGVwYXRoLFxuXHRcdFx0aW5kZXg6IHNsaWRlcy5sZW5ndGgsXG5cdFx0XHRzdGFydCxcblx0XHRcdGNvbnRlbnRTdGFydCxcblx0XHRcdGVuZFxuXHRcdH07XG5cdFx0c2xpZGVzLnB1c2goc2xpZGUpO1xuXHRcdHN0YXJ0ID0gZW5kICsgMTtcblx0XHRjb250ZW50U3RhcnQgPSBlbmQgKyAxO1xuXHR9XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcblx0XHRjb25zdCByYXdMaW5lID0gbGluZXNbaV07XG5cdFx0Y29uc3QgbGluZSA9IHJhd0xpbmUudHJpbUVuZCgpO1xuXHRcdGlmIChpbkh0bWxDb21tZW50KSB7XG5cdFx0XHRpbkh0bWxDb21tZW50ID0gYWR2YW5jZUh0bWxDb21tZW50U3RhdGUocmF3TGluZSwgdHJ1ZSk7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cdFx0aWYgKGxpbmUuc3RhcnRzV2l0aChcIi0tLVwiKSkge1xuXHRcdFx0c2xpY2UoaSk7XG5cdFx0XHRjb25zdCBuZXh0ID0gbGluZXNbaSArIDFdO1xuXHRcdFx0aWYgKGxpbmVbM10gIT09IFwiLVwiICYmIG5leHQ/LnRyaW0oKSkge1xuXHRcdFx0XHRzdGFydCA9IGk7XG5cdFx0XHRcdGZvciAoaSArPSAxOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIGlmIChsaW5lc1tpXS50cmltRW5kKCkgPT09IFwiLS0tXCIpIGJyZWFrO1xuXHRcdFx0XHRjb250ZW50U3RhcnQgPSBpICsgMTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGxpbmUudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aChcImBgYFwiKSkge1xuXHRcdFx0Y29uc3QgY29kZUJsb2NrTGV2ZWwgPSBsaW5lLm1hdGNoKFJFX0xFQURJTkdfQkFDS1RJQ0tTKVswXTtcblx0XHRcdGxldCBqID0gaSArIDE7XG5cdFx0XHRmb3IgKDsgaiA8IGxpbmVzLmxlbmd0aDsgaisrKSBpZiAobGluZXNbal0uc3RhcnRzV2l0aChjb2RlQmxvY2tMZXZlbCkpIGJyZWFrO1xuXHRcdFx0aWYgKGogIT09IGxpbmVzLmxlbmd0aCkgaSA9IGo7XG5cdFx0fSBlbHNlIGluSHRtbENvbW1lbnQgPSBhZHZhbmNlSHRtbENvbW1lbnRTdGF0ZShyYXdMaW5lLCBmYWxzZSk7XG5cdH1cblx0aWYgKHN0YXJ0IDw9IGxpbmVzLmxlbmd0aCAtIDEpIHNsaWNlKGxpbmVzLmxlbmd0aCk7XG5cdHJldHVybiB7XG5cdFx0ZmlsZXBhdGgsXG5cdFx0cmF3OiBtYXJrZG93bixcblx0XHRzbGlkZXNcblx0fTtcbn1cbmZ1bmN0aW9uIHNjYW5Nb25hY29SZWZlcmVuY2VkTW9kcyhtZCkge1xuXHRjb25zdCB0eXBlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG5cdGNvbnN0IGRlcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRtZC5yZXBsYWNlKC9eYGBgKFxcdyspXFxzKlxce21vbmFjbyhbXn1dKilcXH1cXHMqKFxcU1tcXHNcXFNdKj8pXmBgYC9nbSwgKGZ1bGwsIGxhbmcgPSBcInRzXCIsIGtpbmQsIGNvZGUpID0+IHtcblx0XHRsYW5nID0gbGFuZy50cmltKCk7XG5cdFx0Y29uc3QgaXNEZXAgPSBraW5kID09PSBcIi1ydW5cIjtcblx0XHRpZiAoW1xuXHRcdFx0XCJqc1wiLFxuXHRcdFx0XCJqYXZhc2NyaXB0XCIsXG5cdFx0XHRcInRzXCIsXG5cdFx0XHRcInR5cGVzY3JpcHRcIlxuXHRcdF0uaW5jbHVkZXMobGFuZykpIHtcblx0XHRcdGZvciAoY29uc3QgWywgLCBzcGVjaWZpZXJdIG9mIGNvZGUubWF0Y2hBbGwoL1xccytmcm9tXFxzKyhbXCInXSkoWy8uXFx3QC1dKylcXDEvZykpIGlmIChzcGVjaWZpZXIpIHtcblx0XHRcdFx0aWYgKCFcIi4vXCIuaW5jbHVkZXMoc3BlY2lmaWVyKSkgdHlwZXMuYWRkKHNwZWNpZmllcik7XG5cdFx0XHRcdGlmIChpc0RlcCkgZGVwcy5hZGQoc3BlY2lmaWVyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHR5cGVzOiBBcnJheS5mcm9tKHR5cGVzKSxcblx0XHRkZXBzOiBBcnJheS5mcm9tKGRlcHMpXG5cdH07XG59XG5mdW5jdGlvbiBoYXNoKHN0cikge1xuXHRsZXQgaGFzaCA9IDA7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG5cdFx0aGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0ci5jaGFyQ29kZUF0KGkpO1xuXHRcdGhhc2ggfD0gMDtcblx0fVxuXHRyZXR1cm4gaGFzaC50b1N0cmluZygzNikuc2xpY2UoMCwgMTIpO1xufVxuLy8jZW5kcmVnaW9uXG5leHBvcnQgeyBkZXRlY3RGZWF0dXJlcywgZXh0cmFjdEltYWdlc1VzYWdlLCBnZXREZWZhdWx0Q29uZmlnLCBwYXJzZSwgcGFyc2VBc3BlY3RSYXRpbywgcGFyc2VSYW5nZVN0cmluZywgcGFyc2VTbGlkZSwgcGFyc2VTeW5jLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cywgcHJldHRpZnksIHByZXR0aWZ5U2xpZGUsIHJlc29sdmVDb25maWcsIHJlc29sdmVGb250cywgc3RyaW5naWZ5LCBzdHJpbmdpZnlTbGlkZSwgdmVyaWZ5Q29uZmlnIH07XG4iLCJsZXQgX2xhenlNYXRjaCA9ICgpID0+IHsgdmFyIF9fbGliX189KCgpPT57dmFyIG09T2JqZWN0LmRlZmluZVByb3BlcnR5LFY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixHPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxxPShyLGUpPT57Zm9yKHZhciBuIGluIGUpbShyLG4se2dldDplW25dLGVudW1lcmFibGU6dHJ1ZX0pO30sSD0ocixlLG4sYSk9PntpZihlJiZ0eXBlb2YgZT09XCJvYmplY3RcInx8dHlwZW9mIGU9PVwiZnVuY3Rpb25cIilmb3IobGV0IHQgb2YgRyhlKSkhVC5jYWxsKHIsdCkmJnQhPT1uJiZtKHIsdCx7Z2V0OigpPT5lW3RdLGVudW1lcmFibGU6IShhPVYoZSx0KSl8fGEuZW51bWVyYWJsZX0pO3JldHVybiByfSxKPXI9PkgobSh7fSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6dHJ1ZX0pLHIpLHc9e307cSh3LHtkZWZhdWx0OigpPT5yZX0pO3ZhciBBPXI9PkFycmF5LmlzQXJyYXkociksZD1yPT50eXBlb2Ygcj09XCJmdW5jdGlvblwiLFE9cj0+ci5sZW5ndGg9PT0wLFc9cj0+dHlwZW9mIHI9PVwibnVtYmVyXCIsSz1yPT50eXBlb2Ygcj09XCJvYmplY3RcIiYmciE9PW51bGwsWD1yPT5yIGluc3RhbmNlb2YgUmVnRXhwLGI9cj0+dHlwZW9mIHI9PVwic3RyaW5nXCIsaD1yPT5yPT09dm9pZCAwLFk9cj0+e2NvbnN0IGU9bmV3IE1hcDtyZXR1cm4gbj0+e2NvbnN0IGE9ZS5nZXQobik7aWYoYSlyZXR1cm4gYTtjb25zdCB0PXIobik7cmV0dXJuIGUuc2V0KG4sdCksdH19LHJyPShyLGUsbj17fSk9Pntjb25zdCBhPXtjYWNoZTp7fSxpbnB1dDpyLGluZGV4OjAsaW5kZXhNYXg6MCxvcHRpb25zOm4sb3V0cHV0OltdfTtpZih2KGUpKGEpJiZhLmluZGV4PT09ci5sZW5ndGgpcmV0dXJuIGEub3V0cHV0O3Rocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIGF0IGluZGV4ICR7YS5pbmRleE1heH1gKX0saT0ocixlKT0+QShyKT9lcihyLGUpOmIocik/YXIocixlKTpucihyLGUpLGVyPShyLGUpPT57Y29uc3Qgbj17fTtmb3IoY29uc3QgYSBvZiByKXtpZihhLmxlbmd0aCE9PTEpdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJhY3RlcjogXCIke2F9XCJgKTtjb25zdCB0PWEuY2hhckNvZGVBdCgwKTtuW3RdPXRydWU7fXJldHVybiBhPT57Y29uc3QgdD1hLmluZGV4LG89YS5pbnB1dDtmb3IoO2EuaW5kZXg8by5sZW5ndGgmJm8uY2hhckNvZGVBdChhLmluZGV4KWluIG47KWEuaW5kZXgrPTE7Y29uc3QgdT1hLmluZGV4O2lmKHU+dCl7aWYoIWgoZSkmJiFhLm9wdGlvbnMuc2lsZW50KXtjb25zdCBzPWEuaW5wdXQuc2xpY2UodCx1KSxjPWQoZSk/ZShzLG8sU3RyaW5nKHQpKTplO2goYyl8fGEub3V0cHV0LnB1c2goYyk7fWEuaW5kZXhNYXg9TWF0aC5tYXgoYS5pbmRleE1heCxhLmluZGV4KTt9cmV0dXJuICB0cnVlfX0sbnI9KHIsZSk9Pntjb25zdCBuPXIuc291cmNlLGE9ci5mbGFncy5yZXBsYWNlKC95fCQvLFwieVwiKSx0PW5ldyBSZWdFeHAobixhKTtyZXR1cm4gZyhvPT57dC5sYXN0SW5kZXg9by5pbmRleDtjb25zdCB1PXQuZXhlYyhvLmlucHV0KTtpZih1KXtpZighaChlKSYmIW8ub3B0aW9ucy5zaWxlbnQpe2NvbnN0IHM9ZChlKT9lKC4uLnUsby5pbnB1dCxTdHJpbmcoby5pbmRleCkpOmU7aChzKXx8by5vdXRwdXQucHVzaChzKTt9cmV0dXJuIG8uaW5kZXgrPXVbMF0ubGVuZ3RoLG8uaW5kZXhNYXg9TWF0aC5tYXgoby5pbmRleE1heCxvLmluZGV4KSx0cnVlfWVsc2UgcmV0dXJuICBmYWxzZX0pfSxhcj0ocixlKT0+bj0+e2lmKG4uaW5wdXQuc3RhcnRzV2l0aChyLG4uaW5kZXgpKXtpZighaChlKSYmIW4ub3B0aW9ucy5zaWxlbnQpe2NvbnN0IHQ9ZChlKT9lKHIsbi5pbnB1dCxTdHJpbmcobi5pbmRleCkpOmU7aCh0KXx8bi5vdXRwdXQucHVzaCh0KTt9cmV0dXJuIG4uaW5kZXgrPXIubGVuZ3RoLG4uaW5kZXhNYXg9TWF0aC5tYXgobi5pbmRleE1heCxuLmluZGV4KSx0cnVlfWVsc2UgcmV0dXJuICBmYWxzZX0sQz0ocixlLG4sYSk9Pntjb25zdCB0PXYocik7cmV0dXJuIGcoXyhNKG89PntsZXQgdT0wO2Zvcig7dTxuOyl7Y29uc3Qgcz1vLmluZGV4O2lmKCF0KG8pfHwodSs9MSxvLmluZGV4PT09cykpYnJlYWt9cmV0dXJuIHU+PWV9KSkpfSx0cj0ocixlKT0+QyhyLDAsMSksZj0ocixlKT0+QyhyLDAsMS8wKSx4PShyLGUpPT57Y29uc3Qgbj1yLm1hcCh2KTtyZXR1cm4gZyhfKE0oYT0+e2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKylpZighblt0XShhKSlyZXR1cm4gIGZhbHNlO3JldHVybiAgdHJ1ZX0pKSl9LGw9KHIsZSk9Pntjb25zdCBuPXIubWFwKHYpO3JldHVybiBnKF8oYT0+e2ZvcihsZXQgdD0wLG89bi5sZW5ndGg7dDxvO3QrKylpZihuW3RdKGEpKXJldHVybiAgdHJ1ZTtyZXR1cm4gIGZhbHNlfSkpfSxNPShyLGU9ZmFsc2UpPT57Y29uc3Qgbj12KHIpO3JldHVybiBhPT57Y29uc3QgdD1hLmluZGV4LG89YS5vdXRwdXQubGVuZ3RoLHU9bihhKTtyZXR1cm4gKCF1fHxlKSYmKGEuaW5kZXg9dCxhLm91dHB1dC5sZW5ndGghPT1vJiYoYS5vdXRwdXQubGVuZ3RoPW8pKSx1fX0sXz0ocixlKT0+e2NvbnN0IG49dihyKTtyZXR1cm4gbn0sZz0oKCk9PntsZXQgcj0wO3JldHVybiBlPT57Y29uc3Qgbj12KGUpLGE9cis9MTtyZXR1cm4gdD0+e3ZhciBvO2lmKHQub3B0aW9ucy5tZW1vaXphdGlvbj09PWZhbHNlKXJldHVybiBuKHQpO2NvbnN0IHU9dC5pbmRleCxzPShvPXQuY2FjaGUpW2FdfHwob1thXT1uZXcgTWFwKSxjPXMuZ2V0KHUpO2lmKGM9PT1mYWxzZSlyZXR1cm4gIGZhbHNlO2lmKFcoYykpcmV0dXJuIHQuaW5kZXg9Yyx0cnVlO2lmKGMpcmV0dXJuIHQuaW5kZXg9Yy5pbmRleCxjLm91dHB1dD8ubGVuZ3RoJiZ0Lm91dHB1dC5wdXNoKC4uLmMub3V0cHV0KSx0cnVlO3tjb25zdCBaPXQub3V0cHV0Lmxlbmd0aDtpZihuKHQpKXtjb25zdCBEPXQuaW5kZXgsVT10Lm91dHB1dC5sZW5ndGg7aWYoVT5aKXtjb25zdCBlZT10Lm91dHB1dC5zbGljZShaLFUpO3Muc2V0KHUse2luZGV4OkQsb3V0cHV0OmVlfSk7fWVsc2Ugcy5zZXQodSxEKTtyZXR1cm4gIHRydWV9ZWxzZSByZXR1cm4gcy5zZXQodSxmYWxzZSksZmFsc2V9fX19KSgpLEU9cj0+e2xldCBlO3JldHVybiBuPT4oZXx8KGU9dihyKCkpKSxlKG4pKX0sdj1ZKHI9PntpZihkKHIpKXJldHVybiBRKHIpP0Uocik6cjtpZihiKHIpfHxYKHIpKXJldHVybiBpKHIpO2lmKEEocikpcmV0dXJuIHgocik7aWYoSyhyKSlyZXR1cm4gbChPYmplY3QudmFsdWVzKHIpKTt0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJ1bGVcIil9KSxQPVwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcIixpcj1yPT57bGV0IGU9XCJcIjtmb3IoO3I+MDspe2NvbnN0IG49KHItMSklMjY7ZT1QW25dK2Uscj1NYXRoLmZsb29yKChyLTEpLzI2KTt9cmV0dXJuIGV9LE89cj0+e2xldCBlPTA7Zm9yKGxldCBuPTAsYT1yLmxlbmd0aDtuPGE7bisrKWU9ZSoyNitQLmluZGV4T2YocltuXSkrMTtyZXR1cm4gZX0sUz0ocixlKT0+e2lmKGU8cilyZXR1cm4gUyhlLHIpO2NvbnN0IG49W107Zm9yKDtyPD1lOyluLnB1c2gocisrKTtyZXR1cm4gbn0sb3I9KHIsZSxuKT0+UyhyLGUpLm1hcChhPT5TdHJpbmcoYSkucGFkU3RhcnQobixcIjBcIikpLFI9KHIsZSk9PlMoTyhyKSxPKGUpKS5tYXAoaXIpLHA9cj0+cix6PXI9PnVyKGU9PnJyKGUscix7bWVtb2l6YXRpb246ZmFsc2V9KS5qb2luKFwiXCIpKSx1cj1yPT57Y29uc3QgZT17fTtyZXR1cm4gbj0+ZVtuXT8/KGVbbl09cihuKSl9LHNyPWkoL15cXCpcXCpcXC9cXCokLyxcIi4qXCIpLGNyPWkoL15cXCpcXCpcXC8oXFwqKT8oWyBhLXpBLVowLTkuXy1dKykkLywocixlLG4pPT5gLioke2U/XCJcIjpcIig/Ol58LylcIn0ke24ucmVwbGFjZUFsbChcIi5cIixcIlxcXFwuXCIpfWApLGxyPWkoL15cXCpcXCpcXC8oXFwqKT8oWyBhLXpBLVowLTkuXy1dKilcXHsoWyBhLXpBLVowLTkuXy1dKyg/OixbIGEtekEtWjAtOS5fLV0rKSopXFx9JC8sKHIsZSxuLGEpPT5gLioke2U/XCJcIjpcIig/Ol58LylcIn0ke24ucmVwbGFjZUFsbChcIi5cIixcIlxcXFwuXCIpfSg/OiR7YS5yZXBsYWNlQWxsKFwiLFwiLFwifFwiKS5yZXBsYWNlQWxsKFwiLlwiLFwiXFxcXC5cIil9KWApLHk9aSgvXFxcXC4vLHApLHByPWkoL1skLiorP14oKXt9W1xcXVxcfF0vLHI9PmBcXFxcJHtyfWApLHZyPWkoLy4vLHApLGhyPWkoL14oPzohISkqISguKikkLywocixlKT0+YCg/IV4ke0woZSl9JCkuKj9gKSxkcj1pKC9eKCEhKSsvLFwiXCIpLGZyPWwoW2hyLGRyXSkseHI9aSgvXFwvKFxcKlxcKlxcLykrLyxcIig/Oi8uKy98LylcIiksZ3I9aSgvXihcXCpcXCpcXC8pKy8sXCIoPzpefC4qLylcIiksbXI9aSgvXFwvKFxcKlxcKikkLyxcIig/Oi8uKnwkKVwiKSxfcj1pKC9cXCpcXCovLFwiLipcIiksaj1sKFt4cixncixtcixfcl0pLFNyPWkoL1xcKlxcLyg/IVxcKlxcKlxcLykvLFwiW14vXSovXCIpLHlyPWkoL1xcKi8sXCJbXi9dKlwiKSxOPWwoW1NyLHlyXSksaz1pKFwiP1wiLFwiW14vXVwiKSwkcj1pKFwiW1wiLHApLHdyPWkoXCJdXCIscCksQXI9aSgvWyFeXS8sXCJeL1wiKSxicj1pKC9bYS16XS1bYS16XXxbMC05XS1bMC05XS9pLHApLENyPWkoL1skLiorP14oKXt9W1xcfF0vLHI9PmBcXFxcJHtyfWApLE1yPWkoL1teXFxdXS8scCksRXI9bChbeSxDcixicixNcl0pLEI9eChbJHIsdHIoQXIpLGYoRXIpLHdyXSksUHI9aShcIntcIixcIig/OlwiKSxPcj1pKFwifVwiLFwiKVwiKSxScj1pKC8oXFxkKylcXC5cXC4oXFxkKykvLChyLGUsbik9Pm9yKCtlLCtuLE1hdGgubWluKGUubGVuZ3RoLG4ubGVuZ3RoKSkuam9pbihcInxcIikpLHpyPWkoLyhbYS16XSspXFwuXFwuKFthLXpdKykvLChyLGUsbik9PlIoZSxuKS5qb2luKFwifFwiKSksanI9aSgvKFtBLVpdKylcXC5cXC4oW0EtWl0rKS8sKHIsZSxuKT0+UihlLnRvTG93ZXJDYXNlKCksbi50b0xvd2VyQ2FzZSgpKS5qb2luKFwifFwiKS50b1VwcGVyQ2FzZSgpKSxOcj1sKFtScix6cixqcl0pLEk9eChbUHIsTnIsT3JdKSxrcj1pKFwie1wiLFwiKD86XCIpLEJyPWkoXCJ9XCIsXCIpXCIpLElyPWkoXCIsXCIsXCJ8XCIpLEZyPWkoL1skLiorP14oKXtbXFxdXFx8XS8scj0+YFxcXFwke3J9YCksTHI9aSgvW159XS8scCksWnI9RSgoKT0+RiksRHI9bChbaixOLGssQixJLFpyLHksRnIsSXIsTHJdKSxGPXgoW2tyLGYoRHIpLEJyXSksVXI9ZihsKFtzcixjcixscixmcixqLE4sayxCLEksRix5LHByLHZyXSkpLFZyPVVyLEdyPXooVnIpLEw9R3IsVHI9aSgvXFxcXC4vLHApLHFyPWkoLy4vLHApLEhyPWkoL1xcKlxcKlxcKisvLFwiKlwiKSxKcj1pKC8oW14ve1soIV0pXFwqXFwqLywocixlKT0+YCR7ZX0qYCksUXI9aSgvKF58LilcXCpcXCooPz1bXiovKVxcXX1dKS8sKHIsZSk9PmAke2V9KmApLFdyPWYobChbVHIsSHIsSnIsUXIscXJdKSksS3I9V3IsWHI9eihLciksWXI9WHIsJD0ocixlKT0+e2NvbnN0IG49QXJyYXkuaXNBcnJheShyKT9yOltyXTtpZighbi5sZW5ndGgpcmV0dXJuICBmYWxzZTtjb25zdCBhPW4ubWFwKCQuY29tcGlsZSksdD1uLmV2ZXJ5KHM9Pi8oXFwvKD86XFwqXFwqKT98XFxbXFwvXFxdKSQvLnRlc3QocykpLG89ZS5yZXBsYWNlKC9bXFxcXFxcL10rL2csXCIvXCIpLnJlcGxhY2UoL1xcLyQvLHQ/XCIvXCI6XCJcIik7cmV0dXJuIGEuc29tZShzPT5zLnRlc3QobykpfTskLmNvbXBpbGU9cj0+bmV3IFJlZ0V4cChgXiR7TChZcihyKSl9JGAsXCJzXCIpO3ZhciByZT0kO3JldHVybiBKKHcpfSkoKTtcbiByZXR1cm4gX19saWJfXy5kZWZhdWx0IHx8IF9fbGliX187IH07XG5sZXQgX21hdGNoO1xuY29uc3QgemVwdG9tYXRjaCA9IChwYXRoLCBwYXR0ZXJuKSA9PiB7XG4gIGlmICghX21hdGNoKSB7XG4gICAgX21hdGNoID0gX2xhenlNYXRjaCgpO1xuICAgIF9sYXp5TWF0Y2ggPSBudWxsO1xuICB9XG4gIHJldHVybiBfbWF0Y2gocGF0aCwgcGF0dGVybik7XG59O1xuXG5jb25zdCBfRFJJVkVfTEVUVEVSX1NUQVJUX1JFID0gL15bQS1aYS16XTpcXC8vO1xuZnVuY3Rpb24gbm9ybWFsaXplV2luZG93c1BhdGgoaW5wdXQgPSBcIlwiKSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnJlcGxhY2UoX0RSSVZFX0xFVFRFUl9TVEFSVF9SRSwgKHIpID0+IHIudG9VcHBlckNhc2UoKSk7XG59XG5cbmNvbnN0IF9VTkNfUkVHRVggPSAvXlsvXFxcXF17Mn0vO1xuY29uc3QgX0lTX0FCU09MVVRFX1JFID0gL15bL1xcXFxdKD8hWy9cXFxcXSl8XlsvXFxcXF17Mn0oPyFcXC4pfF5bQS1aYS16XTpbL1xcXFxdLztcbmNvbnN0IF9EUklWRV9MRVRURVJfUkUgPSAvXltBLVphLXpdOiQvO1xuY29uc3QgX1JPT1RfRk9MREVSX1JFID0gL15cXC8oW0EtWmEtel06KT8kLztcbmNvbnN0IF9FWFROQU1FX1JFID0gLy4oXFwuW14uL10rfFxcLikkLztcbmNvbnN0IF9QQVRIX1JPT1RfUkUgPSAvXlsvXFxcXF18XlthLXpBLVpdOlsvXFxcXF0vO1xuY29uc3Qgc2VwID0gXCIvXCI7XG5jb25zdCBub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcIi5cIjtcbiAgfVxuICBwYXRoID0gbm9ybWFsaXplV2luZG93c1BhdGgocGF0aCk7XG4gIGNvbnN0IGlzVU5DUGF0aCA9IHBhdGgubWF0Y2goX1VOQ19SRUdFWCk7XG4gIGNvbnN0IGlzUGF0aEFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKTtcbiAgY29uc3QgdHJhaWxpbmdTZXBhcmF0b3IgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09IFwiL1wiO1xuICBwYXRoID0gbm9ybWFsaXplU3RyaW5nKHBhdGgsICFpc1BhdGhBYnNvbHV0ZSk7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc1BhdGhBYnNvbHV0ZSkge1xuICAgICAgcmV0dXJuIFwiL1wiO1xuICAgIH1cbiAgICByZXR1cm4gdHJhaWxpbmdTZXBhcmF0b3IgPyBcIi4vXCIgOiBcIi5cIjtcbiAgfVxuICBpZiAodHJhaWxpbmdTZXBhcmF0b3IpIHtcbiAgICBwYXRoICs9IFwiL1wiO1xuICB9XG4gIGlmIChfRFJJVkVfTEVUVEVSX1JFLnRlc3QocGF0aCkpIHtcbiAgICBwYXRoICs9IFwiL1wiO1xuICB9XG4gIGlmIChpc1VOQ1BhdGgpIHtcbiAgICBpZiAoIWlzUGF0aEFic29sdXRlKSB7XG4gICAgICByZXR1cm4gYC8vLi8ke3BhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAvLyR7cGF0aH1gO1xuICB9XG4gIHJldHVybiBpc1BhdGhBYnNvbHV0ZSAmJiAhaXNBYnNvbHV0ZShwYXRoKSA/IGAvJHtwYXRofWAgOiBwYXRoO1xufTtcbmNvbnN0IGpvaW4gPSBmdW5jdGlvbiguLi5zZWdtZW50cykge1xuICBsZXQgcGF0aCA9IFwiXCI7XG4gIGZvciAoY29uc3Qgc2VnIG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKCFzZWcpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocGF0aC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBwYXRoVHJhaWxpbmcgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09IFwiL1wiO1xuICAgICAgY29uc3Qgc2VnTGVhZGluZyA9IHNlZ1swXSA9PT0gXCIvXCI7XG4gICAgICBjb25zdCBib3RoID0gcGF0aFRyYWlsaW5nICYmIHNlZ0xlYWRpbmc7XG4gICAgICBpZiAoYm90aCkge1xuICAgICAgICBwYXRoICs9IHNlZy5zbGljZSgxKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGggKz0gcGF0aFRyYWlsaW5nIHx8IHNlZ0xlYWRpbmcgPyBzZWcgOiBgLyR7c2VnfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGggKz0gc2VnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9ybWFsaXplKHBhdGgpO1xufTtcbmZ1bmN0aW9uIGN3ZCgpIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBwcm9jZXNzLmN3ZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG4gIH1cbiAgcmV0dXJuIFwiL1wiO1xufVxuY29uc3QgcmVzb2x2ZSA9IGZ1bmN0aW9uKC4uLmFyZ3VtZW50c18pIHtcbiAgYXJndW1lbnRzXyA9IGFyZ3VtZW50c18ubWFwKChhcmd1bWVudCkgPT4gbm9ybWFsaXplV2luZG93c1BhdGgoYXJndW1lbnQpKTtcbiAgbGV0IHJlc29sdmVkUGF0aCA9IFwiXCI7XG4gIGxldCByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gIGZvciAobGV0IGluZGV4ID0gYXJndW1lbnRzXy5sZW5ndGggLSAxOyBpbmRleCA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaW5kZXgtLSkge1xuICAgIGNvbnN0IHBhdGggPSBpbmRleCA+PSAwID8gYXJndW1lbnRzX1tpbmRleF0gOiBjd2QoKTtcbiAgICBpZiAoIXBhdGggfHwgcGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXNvbHZlZFBhdGggPSBgJHtwYXRofS8ke3Jlc29sdmVkUGF0aH1gO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICB9XG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZVN0cmluZyhyZXNvbHZlZFBhdGgsICFyZXNvbHZlZEFic29sdXRlKTtcbiAgaWYgKHJlc29sdmVkQWJzb2x1dGUgJiYgIWlzQWJzb2x1dGUocmVzb2x2ZWRQYXRoKSkge1xuICAgIHJldHVybiBgLyR7cmVzb2x2ZWRQYXRofWA7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkUGF0aC5sZW5ndGggPiAwID8gcmVzb2x2ZWRQYXRoIDogXCIuXCI7XG59O1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nKHBhdGgsIGFsbG93QWJvdmVSb290KSB7XG4gIGxldCByZXMgPSBcIlwiO1xuICBsZXQgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICBsZXQgbGFzdFNsYXNoID0gLTE7XG4gIGxldCBkb3RzID0gMDtcbiAgbGV0IGNoYXIgPSBudWxsO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDw9IHBhdGgubGVuZ3RoOyArK2luZGV4KSB7XG4gICAgaWYgKGluZGV4IDwgcGF0aC5sZW5ndGgpIHtcbiAgICAgIGNoYXIgPSBwYXRoW2luZGV4XTtcbiAgICB9IGVsc2UgaWYgKGNoYXIgPT09IFwiL1wiKSB7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhciA9IFwiL1wiO1xuICAgIH1cbiAgICBpZiAoY2hhciA9PT0gXCIvXCIpIHtcbiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGluZGV4IC0gMSB8fCBkb3RzID09PSAxKSA7IGVsc2UgaWYgKGRvdHMgPT09IDIpIHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlc1tyZXMubGVuZ3RoIC0gMV0gIT09IFwiLlwiIHx8IHJlc1tyZXMubGVuZ3RoIC0gMl0gIT09IFwiLlwiKSB7XG4gICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IHJlcy5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgIHJlcyA9IFwiXCI7XG4gICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcyA9IHJlcy5zbGljZSgwLCBsYXN0U2xhc2hJbmRleCk7XG4gICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gcmVzLmxlbmd0aCAtIDEgLSByZXMubGFzdEluZGV4T2YoXCIvXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdFNsYXNoID0gaW5kZXg7XG4gICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlcyA9IFwiXCI7XG4gICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgICAgICAgICBsYXN0U2xhc2ggPSBpbmRleDtcbiAgICAgICAgICAgIGRvdHMgPSAwO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgICAgICAgIHJlcyArPSByZXMubGVuZ3RoID4gMCA/IFwiLy4uXCIgOiBcIi4uXCI7XG4gICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXMgKz0gYC8ke3BhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaW5kZXgpfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzID0gcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSBpbmRleCAtIGxhc3RTbGFzaCAtIDE7XG4gICAgICB9XG4gICAgICBsYXN0U2xhc2ggPSBpbmRleDtcbiAgICAgIGRvdHMgPSAwO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gXCIuXCIgJiYgZG90cyAhPT0gLTEpIHtcbiAgICAgICsrZG90cztcbiAgICB9IGVsc2Uge1xuICAgICAgZG90cyA9IC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuY29uc3QgaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgcmV0dXJuIF9JU19BQlNPTFVURV9SRS50ZXN0KHApO1xufTtcbmNvbnN0IHRvTmFtZXNwYWNlZFBhdGggPSBmdW5jdGlvbihwKSB7XG4gIHJldHVybiBub3JtYWxpemVXaW5kb3dzUGF0aChwKTtcbn07XG5jb25zdCBleHRuYW1lID0gZnVuY3Rpb24ocCkge1xuICBpZiAocCA9PT0gXCIuLlwiKSByZXR1cm4gXCJcIjtcbiAgY29uc3QgbWF0Y2ggPSBfRVhUTkFNRV9SRS5leGVjKG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8IFwiXCI7XG59O1xuY29uc3QgcmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBjb25zdCBfZnJvbSA9IHJlc29sdmUoZnJvbSkucmVwbGFjZShfUk9PVF9GT0xERVJfUkUsIFwiJDFcIikuc3BsaXQoXCIvXCIpO1xuICBjb25zdCBfdG8gPSByZXNvbHZlKHRvKS5yZXBsYWNlKF9ST09UX0ZPTERFUl9SRSwgXCIkMVwiKS5zcGxpdChcIi9cIik7XG4gIGlmIChfdG9bMF1bMV0gPT09IFwiOlwiICYmIF9mcm9tWzBdWzFdID09PSBcIjpcIiAmJiBfZnJvbVswXSAhPT0gX3RvWzBdKSB7XG4gICAgcmV0dXJuIF90by5qb2luKFwiL1wiKTtcbiAgfVxuICBjb25zdCBfZnJvbUNvcHkgPSBbLi4uX2Zyb21dO1xuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgX2Zyb21Db3B5KSB7XG4gICAgaWYgKF90b1swXSAhPT0gc2VnbWVudCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIF9mcm9tLnNoaWZ0KCk7XG4gICAgX3RvLnNoaWZ0KCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5fZnJvbS5tYXAoKCkgPT4gXCIuLlwiKSwgLi4uX3RvXS5qb2luKFwiL1wiKTtcbn07XG5jb25zdCBkaXJuYW1lID0gZnVuY3Rpb24ocCkge1xuICBjb25zdCBzZWdtZW50cyA9IG5vcm1hbGl6ZVdpbmRvd3NQYXRoKHApLnJlcGxhY2UoL1xcLyQvLCBcIlwiKS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpO1xuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAxICYmIF9EUklWRV9MRVRURVJfUkUudGVzdChzZWdtZW50c1swXSkpIHtcbiAgICBzZWdtZW50c1swXSArPSBcIi9cIjtcbiAgfVxuICByZXR1cm4gc2VnbWVudHMuam9pbihcIi9cIikgfHwgKGlzQWJzb2x1dGUocCkgPyBcIi9cIiA6IFwiLlwiKTtcbn07XG5jb25zdCBmb3JtYXQgPSBmdW5jdGlvbihwKSB7XG4gIGNvbnN0IGV4dCA9IHAuZXh0ID8gcC5leHQuc3RhcnRzV2l0aChcIi5cIikgPyBwLmV4dCA6IGAuJHtwLmV4dH1gIDogXCJcIjtcbiAgY29uc3Qgc2VnbWVudHMgPSBbcC5yb290LCBwLmRpciwgcC5iYXNlID8/IChwLm5hbWUgPz8gXCJcIikgKyBleHRdLmZpbHRlcihcbiAgICBCb29sZWFuXG4gICk7XG4gIHJldHVybiBub3JtYWxpemVXaW5kb3dzUGF0aChcbiAgICBwLnJvb3QgPyByZXNvbHZlKC4uLnNlZ21lbnRzKSA6IHNlZ21lbnRzLmpvaW4oXCIvXCIpXG4gICk7XG59O1xuY29uc3QgYmFzZW5hbWUgPSBmdW5jdGlvbihwLCBleHRlbnNpb24pIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBub3JtYWxpemVXaW5kb3dzUGF0aChwKS5zcGxpdChcIi9cIik7XG4gIGxldCBsYXN0U2VnbWVudCA9IFwiXCI7XG4gIGZvciAobGV0IGkgPSBzZWdtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHZhbCA9IHNlZ21lbnRzW2ldO1xuICAgIGlmICh2YWwpIHtcbiAgICAgIGxhc3RTZWdtZW50ID0gdmFsO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRlbnNpb24gJiYgbGFzdFNlZ21lbnQuZW5kc1dpdGgoZXh0ZW5zaW9uKSA/IGxhc3RTZWdtZW50LnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKSA6IGxhc3RTZWdtZW50O1xufTtcbmNvbnN0IHBhcnNlID0gZnVuY3Rpb24ocCkge1xuICBjb25zdCByb290ID0gX1BBVEhfUk9PVF9SRS5leGVjKHApPy5bMF0/LnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpIHx8IFwiXCI7XG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShwKTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShiYXNlKTtcbiAgcmV0dXJuIHtcbiAgICByb290LFxuICAgIGRpcjogZGlybmFtZShwKSxcbiAgICBiYXNlLFxuICAgIGV4dDogZXh0ZW5zaW9uLFxuICAgIG5hbWU6IGJhc2Uuc2xpY2UoMCwgYmFzZS5sZW5ndGggLSBleHRlbnNpb24ubGVuZ3RoKVxuICB9O1xufTtcbmNvbnN0IG1hdGNoZXNHbG9iID0gKHBhdGgsIHBhdHRlcm4pID0+IHtcbiAgcmV0dXJuIHplcHRvbWF0Y2gocGF0dGVybiwgbm9ybWFsaXplKHBhdGgpKTtcbn07XG5cbmNvbnN0IF9wYXRoID0ge1xuICBfX3Byb3RvX186IG51bGwsXG4gIGJhc2VuYW1lOiBiYXNlbmFtZSxcbiAgZGlybmFtZTogZGlybmFtZSxcbiAgZXh0bmFtZTogZXh0bmFtZSxcbiAgZm9ybWF0OiBmb3JtYXQsXG4gIGlzQWJzb2x1dGU6IGlzQWJzb2x1dGUsXG4gIGpvaW46IGpvaW4sXG4gIG1hdGNoZXNHbG9iOiBtYXRjaGVzR2xvYixcbiAgbm9ybWFsaXplOiBub3JtYWxpemUsXG4gIG5vcm1hbGl6ZVN0cmluZzogbm9ybWFsaXplU3RyaW5nLFxuICBwYXJzZTogcGFyc2UsXG4gIHJlbGF0aXZlOiByZWxhdGl2ZSxcbiAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgc2VwOiBzZXAsXG4gIHRvTmFtZXNwYWNlZFBhdGg6IHRvTmFtZXNwYWNlZFBhdGhcbn07XG5cbmV4cG9ydCB7IF9wYXRoIGFzIF8sIG5vcm1hbGl6ZVN0cmluZyBhcyBhLCByZWxhdGl2ZSBhcyBiLCBiYXNlbmFtZSBhcyBjLCBkaXJuYW1lIGFzIGQsIGV4dG5hbWUgYXMgZSwgZm9ybWF0IGFzIGYsIG5vcm1hbGl6ZVdpbmRvd3NQYXRoIGFzIGcsIGlzQWJzb2x1dGUgYXMgaSwgam9pbiBhcyBqLCBtYXRjaGVzR2xvYiBhcyBtLCBub3JtYWxpemUgYXMgbiwgcGFyc2UgYXMgcCwgcmVzb2x2ZSBhcyByLCBzZXAgYXMgcywgdG9OYW1lc3BhY2VkUGF0aCBhcyB0IH07XG4iLCJpbXBvcnQgeyBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVRpbWVTdHJpbmcsIHBhcnNlVGltZXNwbGl0cyB9IGZyb20gXCIuL3V0aWxzLm1qc1wiO1xuaW1wb3J0IHsgZGV0ZWN0RmVhdHVyZXMsIGV4dHJhY3RJbWFnZXNVc2FnZSwgZ2V0RGVmYXVsdENvbmZpZywgcGFyc2UsIHBhcnNlU2xpZGUsIHBhcnNlU3luYywgcHJldHRpZnksIHByZXR0aWZ5U2xpZGUsIHJlc29sdmVDb25maWcsIHJlc29sdmVGb250cywgc3RyaW5naWZ5LCBzdHJpbmdpZnlTbGlkZSwgdmVyaWZ5Q29uZmlnIH0gZnJvbSBcIi4vY29yZS5tanNcIjtcbmltcG9ydCB7IHNsYXNoIH0gZnJvbSBcIkBhbnRmdS91dGlsc1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gXCJwYXRoZVwiO1xuLy8jcmVnaW9uIHNyYy9mcy50c1xuLyoqXG4qIFdoZXRoZXIgYGZpbGVQYXRoYCByZXNvbHZlcyBpbnNpZGUgYW55IG9mIGByb290c2AgKG5vIGAuLmAgZXNjYXBlKS5cbiogSW5saW5lZCBoZXJlIChyYXRoZXIgdGhhbiBpbXBvcnRlZCBmcm9tIHRoZSBgc2xpZGV2YCBwYWNrYWdlKSBiZWNhdXNlXG4qIGBAc2xpZGV2L3BhcnNlcmAgbXVzdCBzdGF5IGluZGVwZW5kZW50IG9mIGBAc2xpZGV2L3NsaWRldmAuXG4qL1xuZnVuY3Rpb24gaXNQYXRoSW5zaWRlUm9vdHMoZmlsZVBhdGgsIHJvb3RzKSB7XG5cdHJldHVybiByb290cy5zb21lKChyb290KSA9PiB7XG5cdFx0Y29uc3QgcmVsID0gcmVsYXRpdmUocm9vdCwgZmlsZVBhdGgpO1xuXHRcdHJldHVybiByZWwgPT09IFwiXCIgfHwgISFyZWwgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIWlzQWJzb2x1dGUocmVsKTtcblx0fSk7XG59XG5jb25zdCBSRV9GUk9OVE1BVFRFUl9TVEFSVCA9IC9eLS0tKD86W14tXS4qKT8kLztcbmNvbnN0IFJFX0JMQU5LX0xJTkUgPSAvXlxccyokLztcbmNvbnN0IFJFX0ZST05UTUFUVEVSX0VORCA9IC9eLS0tJC87XG5jb25zdCBSRV9DUkxGID0gL1xccj9cXG4vZztcbmxldCBwcmVwYXJzZXJFeHRlbnNpb25Mb2FkZXIgPSBudWxsO1xuZnVuY3Rpb24gaW5qZWN0UHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyKGZuKSB7XG5cdHByZXBhcnNlckV4dGVuc2lvbkxvYWRlciA9IGZuO1xufVxuYXN5bmMgZnVuY3Rpb24gbG9hZChvcHRpb25zLCBmaWxlcGF0aCwgc291cmNlcyA9IHt9LCBtb2RlKSB7XG5cdGNvbnN0IGxvYWRTb3VyY2UgPSB0eXBlb2Ygc291cmNlcyA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlcyA6IGFzeW5jIChwYXRoKSA9PiBzb3VyY2VzW3BhdGhdID8/IHJlYWRGaWxlKHBhdGgsIFwidXRmLThcIik7XG5cdGNvbnN0IG1hcmtkb3duID0gYXdhaXQgbG9hZFNvdXJjZShmaWxlcGF0aCk7XG5cdGxldCBleHRlbnNpb25zO1xuXHRpZiAocHJlcGFyc2VyRXh0ZW5zaW9uTG9hZGVyKSB7XG5cdFx0Y29uc3QgbGluZXMgPSBtYXJrZG93bi5zcGxpdChSRV9DUkxGKTtcblx0XHRsZXQgaG0gPSBcIlwiO1xuXHRcdGlmIChSRV9GUk9OVE1BVFRFUl9TVEFSVC50ZXN0KGxpbmVzWzBdKSAmJiAhbGluZXNbMV0/Lm1hdGNoKFJFX0JMQU5LX0xJTkUpKSB7XG5cdFx0XHRsZXQgaEVuZCA9IDE7XG5cdFx0XHR3aGlsZSAoaEVuZCA8IGxpbmVzLmxlbmd0aCAmJiAhUkVfRlJPTlRNQVRURVJfRU5ELnRlc3QobGluZXNbaEVuZF0udHJpbUVuZCgpKSkgaEVuZCsrO1xuXHRcdFx0aG0gPSBsaW5lcy5zbGljZSgxLCBoRW5kKS5qb2luKFwiXFxuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBvID0gWUFNTC5wYXJzZShobSkgPz8ge307XG5cdFx0ZXh0ZW5zaW9ucyA9IGF3YWl0IHByZXBhcnNlckV4dGVuc2lvbkxvYWRlcihvcHRpb25zLnJvb3RzLCBvLCBmaWxlcGF0aCwgbW9kZSk7XG5cdH1cblx0Y29uc3QgbWFya2Rvd25GaWxlcyA9IHt9O1xuXHRjb25zdCB3YXRjaEZpbGVzID0ge307XG5cdGNvbnN0IHNsaWRlcyA9IFtdO1xuXHRhc3luYyBmdW5jdGlvbiBsb2FkTWFya2Rvd24ocGF0aCwgcmFuZ2UsIGZyb250bWF0dGVyT3ZlcnJpZGUsIGltcG9ydGVycykge1xuXHRcdGxldCBtZCA9IG1hcmtkb3duRmlsZXNbcGF0aF07XG5cdFx0aWYgKCFtZCkge1xuXHRcdFx0Y29uc3QgcmF3ID0gYXdhaXQgbG9hZFNvdXJjZShwYXRoKTtcblx0XHRcdG1kID0gYXdhaXQgcGFyc2UocmF3LCBwYXRoLCBleHRlbnNpb25zKTtcblx0XHRcdG1hcmtkb3duRmlsZXNbcGF0aF0gPSBtZDtcblx0XHRcdHdhdGNoRmlsZXNbcGF0aF0gPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuXHRcdH1cblx0XHRjb25zdCBkaXJlY3RJbXBvcnRlciA9IGltcG9ydGVycz8uYXQoLTEpO1xuXHRcdGZvciAoY29uc3QgaW5kZXggb2YgcGFyc2VSYW5nZVN0cmluZyhtZC5zbGlkZXMubGVuZ3RoLCByYW5nZSkpIHtcblx0XHRcdGNvbnN0IHN1YlNsaWRlID0gbWQuc2xpZGVzW2luZGV4IC0gMV07XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRhd2FpdCBsb2FkU2xpZGUobWQsIHN1YlNsaWRlLCBmcm9udG1hdHRlck92ZXJyaWRlLCBpbXBvcnRlcnMpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRtZC5lcnJvcnMgPz89IFtdO1xuXHRcdFx0XHRtZC5lcnJvcnMucHVzaCh7XG5cdFx0XHRcdFx0cm93OiBzdWJTbGlkZS5zdGFydCxcblx0XHRcdFx0XHRtZXNzYWdlOiBgRXJyb3Igd2hlbiBsb2FkaW5nIHNsaWRlOiAke2V9YFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZGlyZWN0SW1wb3J0ZXIpIChkaXJlY3RJbXBvcnRlci5pbXBvcnRzID8/PSBbXSkucHVzaChzdWJTbGlkZSk7XG5cdFx0fVxuXHRcdHJldHVybiBtZDtcblx0fVxuXHRhc3luYyBmdW5jdGlvbiBsb2FkU2xpZGUobWQsIHNsaWRlLCBmcm9udG1hdHRlck92ZXJyaWRlLCBpbXBvcnRDaGFpbikge1xuXHRcdGlmIChzbGlkZS5mcm9udG1hdHRlci5kaXNhYmxlZCB8fCBzbGlkZS5mcm9udG1hdHRlci5oaWRlKSByZXR1cm47XG5cdFx0aWYgKHNsaWRlLmZyb250bWF0dGVyLnNyYykge1xuXHRcdFx0Y29uc3QgW3Jhd1BhdGgsIHJhbmdlUmF3XSA9IHNsaWRlLmZyb250bWF0dGVyLnNyYy5zcGxpdChcIiNcIik7XG5cdFx0XHRjb25zdCBwYXRoID0gc2xhc2gocmF3UGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHJlc29sdmUob3B0aW9ucy51c2VyUm9vdCwgcmF3UGF0aC5zdWJzdHJpbmcoMSkpIDogcmVzb2x2ZShkaXJuYW1lKHNsaWRlLmZpbGVwYXRoKSwgcmF3UGF0aCkpO1xuXHRcdFx0ZnJvbnRtYXR0ZXJPdmVycmlkZSA9IHtcblx0XHRcdFx0Li4uc2xpZGUuZnJvbnRtYXR0ZXIsXG5cdFx0XHRcdC4uLmZyb250bWF0dGVyT3ZlcnJpZGVcblx0XHRcdH07XG5cdFx0XHRkZWxldGUgZnJvbnRtYXR0ZXJPdmVycmlkZS5zcmM7XG5cdFx0XHRjb25zdCBhbmNlc3RvclBhdGhzID0gbmV3IFNldCgoaW1wb3J0Q2hhaW4gPz8gW10pLm1hcCgocykgPT4gcy5maWxlcGF0aCkpO1xuXHRcdFx0aWYgKHBhdGggPT09IHNsaWRlLmZpbGVwYXRoIHx8IGFuY2VzdG9yUGF0aHMuaGFzKHBhdGgpKSB7XG5cdFx0XHRcdG1kLmVycm9ycyA/Pz0gW107XG5cdFx0XHRcdG1kLmVycm9ycy5wdXNoKHtcblx0XHRcdFx0XHRyb3c6IHNsaWRlLnN0YXJ0LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBDaXJjdWxhciBpbXBvcnQgZGV0ZWN0ZWQgZm9yIFwiJHtzbGlkZS5mcm9udG1hdHRlci5zcmN9XCIgKCR7cGF0aH0pYFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG9wdGlvbnMuYWxsb3dlZFJvb3RzICYmICFpc1BhdGhJbnNpZGVSb290cyhwYXRoLCBvcHRpb25zLmFsbG93ZWRSb290cykpIHtcblx0XHRcdFx0bWQuZXJyb3JzID8/PSBbXTtcblx0XHRcdFx0bWQuZXJyb3JzLnB1c2goe1xuXHRcdFx0XHRcdHJvdzogc2xpZGUuc3RhcnQsXG5cdFx0XHRcdFx0bWVzc2FnZTogYEltcG9ydGVkIG1hcmtkb3duIGVzY2FwZXMgdGhlIHByb2plY3Qgcm9vdDogJHtwYXRofWBcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKCFleGlzdHNTeW5jKHBhdGgpKSB7XG5cdFx0XHRcdG1kLmVycm9ycyA/Pz0gW107XG5cdFx0XHRcdG1kLmVycm9ycy5wdXNoKHtcblx0XHRcdFx0XHRyb3c6IHNsaWRlLnN0YXJ0LFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBJbXBvcnRlZCBtYXJrZG93biBmaWxlIG5vdCBmb3VuZDogJHtwYXRofWBcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgYXdhaXQgbG9hZE1hcmtkb3duKHBhdGgsIHJhbmdlUmF3LCBmcm9udG1hdHRlck92ZXJyaWRlLCBpbXBvcnRDaGFpbiA/IFsuLi5pbXBvcnRDaGFpbiwgc2xpZGVdIDogW3NsaWRlXSk7XG5cdFx0fSBlbHNlIHNsaWRlcy5wdXNoKHtcblx0XHRcdGZyb250bWF0dGVyOiB7XG5cdFx0XHRcdC4uLnNsaWRlLmZyb250bWF0dGVyLFxuXHRcdFx0XHQuLi5mcm9udG1hdHRlck92ZXJyaWRlXG5cdFx0XHR9LFxuXHRcdFx0Y29udGVudDogc2xpZGUuY29udGVudCxcblx0XHRcdHJldmlzaW9uOiBzbGlkZS5yZXZpc2lvbixcblx0XHRcdGZyb250bWF0dGVyUmF3OiBzbGlkZS5mcm9udG1hdHRlclJhdyxcblx0XHRcdG5vdGU6IHNsaWRlLm5vdGUsXG5cdFx0XHR0aXRsZTogc2xpZGUudGl0bGUsXG5cdFx0XHRsZXZlbDogc2xpZGUubGV2ZWwsXG5cdFx0XHRpbmRleDogc2xpZGVzLmxlbmd0aCxcblx0XHRcdGltcG9ydENoYWluLFxuXHRcdFx0c291cmNlOiBzbGlkZVxuXHRcdH0pO1xuXHR9XG5cdGNvbnN0IGVudHJ5ID0gYXdhaXQgbG9hZE1hcmtkb3duKHNsYXNoKGZpbGVwYXRoKSk7XG5cdGNvbnN0IGhlYWRtYXR0ZXIgPSB7IC4uLmVudHJ5LnNsaWRlc1swXT8uZnJvbnRtYXR0ZXIgfTtcblx0aWYgKHNsaWRlc1swXT8udGl0bGUpIGhlYWRtYXR0ZXIudGl0bGUgPz89IHNsaWRlc1swXS50aXRsZTtcblx0cmV0dXJuIHtcblx0XHRzbGlkZXMsXG5cdFx0ZW50cnksXG5cdFx0aGVhZG1hdHRlcixcblx0XHRmZWF0dXJlczogZGV0ZWN0RmVhdHVyZXMoc2xpZGVzLm1hcCgocykgPT4gcy5zb3VyY2UucmF3KS5qb2luKFwiXCIpKSxcblx0XHRtYXJrZG93bkZpbGVzLFxuXHRcdHdhdGNoRmlsZXNcblx0fTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHNhdmUobWFya2Rvd24pIHtcblx0Y29uc3QgZmlsZUNvbnRlbnQgPSBzdHJpbmdpZnkobWFya2Rvd24pO1xuXHRhd2FpdCB3cml0ZUZpbGUobWFya2Rvd24uZmlsZXBhdGgsIGZpbGVDb250ZW50LCBcInV0Zi04XCIpO1xuXHRyZXR1cm4gZmlsZUNvbnRlbnQ7XG59XG4vLyNlbmRyZWdpb25cbmV4cG9ydCB7IGRldGVjdEZlYXR1cmVzLCBleHRyYWN0SW1hZ2VzVXNhZ2UsIGdldERlZmF1bHRDb25maWcsIGluamVjdFByZXBhcnNlckV4dGVuc2lvbkxvYWRlciwgaXNQYXRoSW5zaWRlUm9vdHMsIGxvYWQsIHBhcnNlLCBwYXJzZUFzcGVjdFJhdGlvLCBwYXJzZVJhbmdlU3RyaW5nLCBwYXJzZVNsaWRlLCBwYXJzZVN5bmMsIHBhcnNlVGltZVN0cmluZywgcGFyc2VUaW1lc3BsaXRzLCBwcmV0dGlmeSwgcHJldHRpZnlTbGlkZSwgcmVzb2x2ZUNvbmZpZywgcmVzb2x2ZUZvbnRzLCBzYXZlLCBzdHJpbmdpZnksIHN0cmluZ2lmeVNsaWRlLCB2ZXJpZnlDb25maWcgfTtcbiIsIlwidXNlIHN0cmljdFwiO1xuLy8gTm90ZXM6IEFkZCBuZXcgTm9kZSB0eXBlc1xuLy8gMS4gQWRkIG5ldyBOb2RlIHR5cGUgdG8gQVNUTm9kZVR5cGVzXG4vLyAyLiBVcGRhdGUgdHh0bm9kZS5tZFxuLy8gMy4gQWRkIHRlc3QgdG8gcGFja2FnZXMvQHRleHRsaW50L3R5cGVzL3Rlc3QvUnVsZS9UeHROb2RlLXRlc3QudHNcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQVNUTm9kZVR5cGVzID0gdm9pZCAwO1xuLyoqXG4gKiBBU1ROb2RlVHlwZXMgaXMgYSBsaXN0IG9mIEFTVE5vZGUgdHlwZS5cbiAqL1xudmFyIEFTVE5vZGVUeXBlcztcbihmdW5jdGlvbiAoQVNUTm9kZVR5cGVzKSB7XG4gICAgQVNUTm9kZVR5cGVzW1wiRG9jdW1lbnRcIl0gPSBcIkRvY3VtZW50XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRG9jdW1lbnRFeGl0XCJdID0gXCJEb2N1bWVudDpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiUGFyYWdyYXBoXCJdID0gXCJQYXJhZ3JhcGhcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJQYXJhZ3JhcGhFeGl0XCJdID0gXCJQYXJhZ3JhcGg6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkJsb2NrUXVvdGVcIl0gPSBcIkJsb2NrUXVvdGVcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCbG9ja1F1b3RlRXhpdFwiXSA9IFwiQmxvY2tRdW90ZTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlzdEl0ZW1cIl0gPSBcIkxpc3RJdGVtXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlzdEl0ZW1FeGl0XCJdID0gXCJMaXN0SXRlbTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlzdFwiXSA9IFwiTGlzdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpc3RFeGl0XCJdID0gXCJMaXN0OmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJIZWFkZXJcIl0gPSBcIkhlYWRlclwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkhlYWRlckV4aXRcIl0gPSBcIkhlYWRlcjpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZUJsb2NrXCJdID0gXCJDb2RlQmxvY2tcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJDb2RlQmxvY2tFeGl0XCJdID0gXCJDb2RlQmxvY2s6ZXhpdFwiO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHVzZSBIdG1sIGluc3RlYWQgb2YgaXRcbiAgICAgKi9cbiAgICBBU1ROb2RlVHlwZXNbXCJIdG1sQmxvY2tcIl0gPSBcIkh0bWxCbG9ja1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkh0bWxCbG9ja0V4aXRcIl0gPSBcIkh0bWxCbG9jazpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSG9yaXpvbnRhbFJ1bGVcIl0gPSBcIkhvcml6b250YWxSdWxlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSG9yaXpvbnRhbFJ1bGVFeGl0XCJdID0gXCJIb3Jpem9udGFsUnVsZTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29tbWVudFwiXSA9IFwiQ29tbWVudFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkNvbW1lbnRFeGl0XCJdID0gXCJDb21tZW50OmV4aXRcIjtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIEFTVE5vZGVUeXBlc1tcIlJlZmVyZW5jZURlZlwiXSA9IFwiUmVmZXJlbmNlRGVmXCI7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBBU1ROb2RlVHlwZXNbXCJSZWZlcmVuY2VEZWZFeGl0XCJdID0gXCJSZWZlcmVuY2VEZWY6ZXhpdFwiO1xuICAgIC8vIGlubGluZVxuICAgIEFTVE5vZGVUeXBlc1tcIlN0clwiXSA9IFwiU3RyXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiU3RyRXhpdFwiXSA9IFwiU3RyOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCcmVha1wiXSA9IFwiQnJlYWtcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJCcmVha0V4aXRcIl0gPSBcIkJyZWFrOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJFbXBoYXNpc1wiXSA9IFwiRW1waGFzaXNcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJFbXBoYXNpc0V4aXRcIl0gPSBcIkVtcGhhc2lzOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJTdHJvbmdcIl0gPSBcIlN0cm9uZ1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlN0cm9uZ0V4aXRcIl0gPSBcIlN0cm9uZzpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSHRtbFwiXSA9IFwiSHRtbFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkh0bWxFeGl0XCJdID0gXCJIdG1sOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaW5rXCJdID0gXCJMaW5rXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiTGlua0V4aXRcIl0gPSBcIkxpbms6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkxpbmtSZWZlcmVuY2VcIl0gPSBcIkxpbmtSZWZlcmVuY2VcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJMaW5rUmVmZXJlbmNlRXhpdFwiXSA9IFwiTGlua1JlZmVyZW5jZTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSW1hZ2VcIl0gPSBcIkltYWdlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSW1hZ2VFeGl0XCJdID0gXCJJbWFnZTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSW1hZ2VSZWZlcmVuY2VcIl0gPSBcIkltYWdlUmVmZXJlbmNlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiSW1hZ2VSZWZlcmVuY2VFeGl0XCJdID0gXCJJbWFnZVJlZmVyZW5jZTpleGl0XCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRGVmaW5pdGlvblwiXSA9IFwiRGVmaW5pdGlvblwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlZmluaXRpb25FeGl0XCJdID0gXCJEZWZpbml0aW9uOmV4aXRcIjtcbiAgICBBU1ROb2RlVHlwZXNbXCJDb2RlXCJdID0gXCJDb2RlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiQ29kZUV4aXRcIl0gPSBcIkNvZGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIkRlbGV0ZVwiXSA9IFwiRGVsZXRlXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiRGVsZXRlRXhpdFwiXSA9IFwiRGVsZXRlOmV4aXRcIjtcbiAgICAvLyBUYWJsZSBpcyBzdXBwb3J0ZWQgaW4gdGV4dGxpbnQgdjEzK1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlXCJdID0gXCJUYWJsZVwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlRXhpdFwiXSA9IFwiVGFibGU6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlUm93XCJdID0gXCJUYWJsZVJvd1wiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlUm93RXhpdFwiXSA9IFwiVGFibGVSb3c6ZXhpdFwiO1xuICAgIEFTVE5vZGVUeXBlc1tcIlRhYmxlQ2VsbFwiXSA9IFwiVGFibGVDZWxsXCI7XG4gICAgQVNUTm9kZVR5cGVzW1wiVGFibGVDZWxsRXhpdFwiXSA9IFwiVGFibGVDZWxsOmV4aXRcIjtcbn0pKEFTVE5vZGVUeXBlcyB8fCAoZXhwb3J0cy5BU1ROb2RlVHlwZXMgPSBBU1ROb2RlVHlwZXMgPSB7fSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QVNUTm9kZVR5cGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5BU1ROb2RlVHlwZXMgPSB2b2lkIDA7XG52YXIgQVNUTm9kZVR5cGVzX2pzXzEgPSByZXF1aXJlKFwiLi9BU1ROb2RlVHlwZXMuanNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBU1ROb2RlVHlwZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEFTVE5vZGVUeXBlc19qc18xLkFTVE5vZGVUeXBlczsgfSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGFzdF9ub2RlX3R5cGVzXzEgPSByZXF1aXJlKFwiQHRleHRsaW50L2FzdC1ub2RlLXR5cGVzXCIpO1xuLyoqXG4gKiBSdWxlSGVscGVyIGlzIGhlbHBlciBjbGFzcyBmb3IgdGV4dGxpbnQuXG4gKiBAY2xhc3MgUnVsZUhlbHBlclxuICovXG52YXIgUnVsZUhlbHBlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIFJ1bGVIZWxwZXIgd2l0aCBSdWxlQ29udGV4dCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBydWxlQ29udGV4dCBpcyBjb250ZXh0IG9iamVjdCBvZiB0aGUgcnVsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBSdWxlSGVscGVyKHJ1bGVDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX3J1bGVDb250ZXh0ID0gcnVsZUNvbnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBwYXJlbnRzIG9mIG5vZGUuXG4gICAgICogVGhlIHBhcmVudCBub2RlcyBhcmUgcmV0dXJuZWQgaW4gb3JkZXIgZnJvbSB0aGUgY2xvc2VzdCBwYXJlbnQgdG8gdGhlIG91dGVyIG9uZXMuXG4gICAgICoge0BsaW5rIG5vZGV9IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHJlc3VsdHMuXG4gICAgICogQHBhcmFtIHtUeHROb2RlfSBub2RlIHRoZSBub2RlIGlzIHN0YXJ0IHBvaW50LlxuICAgICAqL1xuICAgIFJ1bGVIZWxwZXIucHJvdG90eXBlLmdldFBhcmVudHMgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJlbnQpO1xuICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRydWUgaWYgYG5vZGVgIGlzIHdyYXBwZWQgYW55IG9uZSBvZiBub2RlIHtAbGluayB0eXBlc30uXG4gICAgICogQHBhcmFtIHtUeHROb2RlfSBub2RlIGlzIHRhcmdldCBub2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdHlwZXMgYXJlIHdyYXBwZWQgdGFyZ2V0IG5vZGVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBSdWxlSGVscGVyLnByb3RvdHlwZS5pc0NoaWxkTm9kZSA9IGZ1bmN0aW9uIChub2RlLCB0eXBlcykge1xuICAgICAgICB2YXIgcGFyZW50cyA9IHRoaXMuZ2V0UGFyZW50cyhub2RlKTtcbiAgICAgICAgdmFyIHBhcmVudHNUeXBlcyA9IHBhcmVudHMubWFwKGZ1bmN0aW9uIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQudHlwZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlcy5zb21lKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyZW50c1R5cGVzLnNvbWUoZnVuY3Rpb24gKHBhcmVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50VHlwZSA9PT0gdHlwZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBub2RlIGlzIFN0ciBub2RlIGFuZCBmaWxsIGZvbGxvd2luZyBjb25kaXRpb25zXG4gICAgICpcbiAgICAgKiAtIHRoZSBub2RlIGlzIFN0ciBub2RlXG4gICAgICogLSB0aGUgbm9kZSBpcyB1bmRlciB0aGUgUGFyYWdyYXBoIG5vZGVcbiAgICAgKiAtIHRoZSBub2RlIGlzIG5vdCB1bmRlciB0aGUgQmxvY2tRdW90ZVxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGNvbW1vbiB1c2UtY2FzZS5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW50IFN0ciBub2RlLCBidXQgeW91IG5vdCB3YW50IHRvIGxpbnQgc3R5bGVkIG5vZGUsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsLlxuICAgICAqIHN0eWxlZCBub2RlIGlzIExpbmssIFN0cm9uZywgQmxvY2tRdW90ZSwgSGVhZGVyIGV0Yy4uLlxuICAgICAqIE9wcG9zaXRlIG9mIGl0LCBwbGFpbiBzdHIgbm9kZSBpcyBqdXN0IHVuZGVyIHRoZSBQYXJhZ3JhcGggbm9kZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBSZXR1cm4gdHJ1ZVxuICAgICAqXG4gICAgICogLS0tXG4gICAgICogc3RyIHN0ciBzdHJcbiAgICAgKiAtIGxpc3QgdGV4dFxuICAgICAqIC0tLVxuICAgICAqXG4gICAgICogUmV0dXJuIGZhbHNlXG4gICAgICpcbiAgICAgKiAtLS0tXG4gICAgICogIyBIZWFkZXJcbiAgICAgKiAhW2FsdCB0ZXh0XShodHRwczovL2V4YW1wbGUuY29tKVxuICAgICAqIFtsaW5rIHRpdGxlXShodHRwczovL2V4YW1wbGUuY29tKVxuICAgICAqID4gQmxvY2tRdW90ZVxuICAgICAqICoqU3Ryb25nKipcbiAgICAgKiBbXmZvb3Rub3RlXTogdGV4dCB0ZXh0XG4gICAgICogLS0tLVxuICAgICAqXG4gICAgICogU3VtbWFyeTpcbiAgICAgKlxuICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBub2RlIGlzIHBsYWluIHRleHQuXG4gICAgICogSW4gb3RoZXIgd29yZHMsIHJldHVybiBmYWxzZSBpZiB0aGUgbm9kZSBpcyBzdHlsZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgUnVsZUhlbHBlci5wcm90b3R5cGUuaXNQbGFpblN0ck5vZGUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChub2RlLnR5cGUgIT09IGFzdF9ub2RlX3R5cGVzXzEuQVNUTm9kZVR5cGVzLlN0cikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoKF9hID0gbm9kZS5wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS50eXBlKSAhPT0gYXN0X25vZGVfdHlwZXNfMS5BU1ROb2RlVHlwZXMuUGFyYWdyYXBoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzSW5VbmNvbnRyb2xsYWJsZU5vZGUgPSB0aGlzLmlzQ2hpbGROb2RlKG5vZGUsIFtcbiAgICAgICAgICAgIC8vIDxibG9ja3F1b3RlPiBpcyBCbG9jayBub2RlIGluIGh0bWwuIEl0IGNhbiBoYXMgUHJhZ2FyYXBoIG5vZGUgYXMgY2hpbGRyZW5cbiAgICAgICAgICAgIGFzdF9ub2RlX3R5cGVzXzEuQVNUTm9kZVR5cGVzLkJsb2NrUXVvdGVcbiAgICAgICAgXSk7XG4gICAgICAgIHJldHVybiAhaXNJblVuY29udHJvbGxhYmxlTm9kZTtcbiAgICB9O1xuICAgIHJldHVybiBSdWxlSGVscGVyO1xufSgpKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJ1bGVIZWxwZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0bGludC1ydWxlLWhlbHBlci5qcy5tYXAiLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0XG5cbmZ1bmN0aW9uIGNvbnZlcnQodGVzdCkge1xuICBpZiAodGVzdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG9rXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGVGYWN0b3J5KHRlc3QpXG4gIH1cblxuICBpZiAodHlwZW9mIHRlc3QgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuICdsZW5ndGgnIGluIHRlc3QgPyBhbnlGYWN0b3J5KHRlc3QpIDogYWxsRmFjdG9yeSh0ZXN0KVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRlc3RcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgZnVuY3Rpb24sIHN0cmluZywgb3Igb2JqZWN0IGFzIHRlc3QnKVxufVxuXG4vLyBVdGlsaXR5IGFzc2VydCBlYWNoIHByb3BlcnR5IGluIGB0ZXN0YCBpcyByZXByZXNlbnRlZCBpbiBgbm9kZWAsIGFuZCBlYWNoXG4vLyB2YWx1ZXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuZnVuY3Rpb24gYWxsRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiBhbGxcblxuICBmdW5jdGlvbiBhbGwobm9kZSkge1xuICAgIHZhciBrZXlcblxuICAgIGZvciAoa2V5IGluIHRlc3QpIHtcbiAgICAgIGlmIChub2RlW2tleV0gIT09IHRlc3Rba2V5XSkgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxufVxuXG5mdW5jdGlvbiBhbnlGYWN0b3J5KHRlc3RzKSB7XG4gIHZhciBjaGVja3MgPSBbXVxuICB2YXIgaW5kZXggPSAtMVxuXG4gIHdoaWxlICgrK2luZGV4IDwgdGVzdHMubGVuZ3RoKSB7XG4gICAgY2hlY2tzW2luZGV4XSA9IGNvbnZlcnQodGVzdHNbaW5kZXhdKVxuICB9XG5cbiAgcmV0dXJuIGFueVxuXG4gIGZ1bmN0aW9uIGFueSgpIHtcbiAgICB2YXIgaW5kZXggPSAtMVxuXG4gICAgd2hpbGUgKCsraW5kZXggPCBjaGVja3MubGVuZ3RoKSB7XG4gICAgICBpZiAoY2hlY2tzW2luZGV4XS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gYSBmdW5jdGlvbiB3aGljaCBjaGVja3MgYSBnaXZlbiBub2Rl4oCZcyB0eXBlXG4vLyBmb3Igc2FpZCBzdHJpbmcuXG5mdW5jdGlvbiB0eXBlRmFjdG9yeSh0ZXN0KSB7XG4gIHJldHVybiB0eXBlXG5cbiAgZnVuY3Rpb24gdHlwZShub2RlKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4obm9kZSAmJiBub2RlLnR5cGUgPT09IHRlc3QpXG4gIH1cbn1cblxuLy8gVXRpbGl0eSB0byByZXR1cm4gdHJ1ZS5cbmZ1bmN0aW9uIG9rKCkge1xuICByZXR1cm4gdHJ1ZVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eVxuZnVuY3Rpb24gaWRlbnRpdHkoZCkge1xuICByZXR1cm4gZFxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gdmlzaXRQYXJlbnRzXG5cbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgndW5pc3QtdXRpbC1pcy9jb252ZXJ0JylcbnZhciBjb2xvciA9IHJlcXVpcmUoJy4vY29sb3InKVxuXG52YXIgQ09OVElOVUUgPSB0cnVlXG52YXIgU0tJUCA9ICdza2lwJ1xudmFyIEVYSVQgPSBmYWxzZVxuXG52aXNpdFBhcmVudHMuQ09OVElOVUUgPSBDT05USU5VRVxudmlzaXRQYXJlbnRzLlNLSVAgPSBTS0lQXG52aXNpdFBhcmVudHMuRVhJVCA9IEVYSVRcblxuZnVuY3Rpb24gdmlzaXRQYXJlbnRzKHRyZWUsIHRlc3QsIHZpc2l0b3IsIHJldmVyc2UpIHtcbiAgdmFyIHN0ZXBcbiAgdmFyIGlzXG5cbiAgaWYgKHR5cGVvZiB0ZXN0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2aXNpdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV2ZXJzZSA9IHZpc2l0b3JcbiAgICB2aXNpdG9yID0gdGVzdFxuICAgIHRlc3QgPSBudWxsXG4gIH1cblxuICBpcyA9IGNvbnZlcnQodGVzdClcbiAgc3RlcCA9IHJldmVyc2UgPyAtMSA6IDFcblxuICBmYWN0b3J5KHRyZWUsIG51bGwsIFtdKSgpXG5cbiAgZnVuY3Rpb24gZmFjdG9yeShub2RlLCBpbmRleCwgcGFyZW50cykge1xuICAgIHZhciB2YWx1ZSA9IHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBub2RlICE9PSBudWxsID8gbm9kZSA6IHt9XG4gICAgdmFyIG5hbWVcblxuICAgIGlmICh0eXBlb2YgdmFsdWUudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPVxuICAgICAgICB0eXBlb2YgdmFsdWUudGFnTmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHZhbHVlLnRhZ05hbWVcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZS5uYW1lID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gdmFsdWUubmFtZVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHZpc2l0LmRpc3BsYXlOYW1lID1cbiAgICAgICAgJ25vZGUgKCcgKyBjb2xvcih2YWx1ZS50eXBlICsgKG5hbWUgPyAnPCcgKyBuYW1lICsgJz4nIDogJycpKSArICcpJ1xuICAgIH1cblxuICAgIHJldHVybiB2aXNpdFxuXG4gICAgZnVuY3Rpb24gdmlzaXQoKSB7XG4gICAgICB2YXIgZ3JhbmRwYXJlbnRzID0gcGFyZW50cy5jb25jYXQobm9kZSlcbiAgICAgIHZhciByZXN1bHQgPSBbXVxuICAgICAgdmFyIHN1YnJlc3VsdFxuICAgICAgdmFyIG9mZnNldFxuXG4gICAgICBpZiAoIXRlc3QgfHwgaXMobm9kZSwgaW5kZXgsIHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXSB8fCBudWxsKSkge1xuICAgICAgICByZXN1bHQgPSB0b1Jlc3VsdCh2aXNpdG9yKG5vZGUsIHBhcmVudHMpKVxuXG4gICAgICAgIGlmIChyZXN1bHRbMF0gPT09IEVYSVQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgcmVzdWx0WzBdICE9PSBTS0lQKSB7XG4gICAgICAgIG9mZnNldCA9IChyZXZlcnNlID8gbm9kZS5jaGlsZHJlbi5sZW5ndGggOiAtMSkgKyBzdGVwXG5cbiAgICAgICAgd2hpbGUgKG9mZnNldCA+IC0xICYmIG9mZnNldCA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgc3VicmVzdWx0ID0gZmFjdG9yeShub2RlLmNoaWxkcmVuW29mZnNldF0sIG9mZnNldCwgZ3JhbmRwYXJlbnRzKSgpXG5cbiAgICAgICAgICBpZiAoc3VicmVzdWx0WzBdID09PSBFWElUKSB7XG4gICAgICAgICAgICByZXR1cm4gc3VicmVzdWx0XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb2Zmc2V0ID1cbiAgICAgICAgICAgIHR5cGVvZiBzdWJyZXN1bHRbMV0gPT09ICdudW1iZXInID8gc3VicmVzdWx0WzFdIDogb2Zmc2V0ICsgc3RlcFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9SZXN1bHQodmFsdWUpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2xlbmd0aCcgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFtDT05USU5VRSwgdmFsdWVdXG4gIH1cblxuICByZXR1cm4gW3ZhbHVlXVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gdmlzaXRcblxudmFyIHZpc2l0UGFyZW50cyA9IHJlcXVpcmUoJ3VuaXN0LXV0aWwtdmlzaXQtcGFyZW50cycpXG5cbnZhciBDT05USU5VRSA9IHZpc2l0UGFyZW50cy5DT05USU5VRVxudmFyIFNLSVAgPSB2aXNpdFBhcmVudHMuU0tJUFxudmFyIEVYSVQgPSB2aXNpdFBhcmVudHMuRVhJVFxuXG52aXNpdC5DT05USU5VRSA9IENPTlRJTlVFXG52aXNpdC5TS0lQID0gU0tJUFxudmlzaXQuRVhJVCA9IEVYSVRcblxuZnVuY3Rpb24gdmlzaXQodHJlZSwgdGVzdCwgdmlzaXRvciwgcmV2ZXJzZSkge1xuICBpZiAodHlwZW9mIHRlc3QgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHZpc2l0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXZlcnNlID0gdmlzaXRvclxuICAgIHZpc2l0b3IgPSB0ZXN0XG4gICAgdGVzdCA9IG51bGxcbiAgfVxuXG4gIHZpc2l0UGFyZW50cyh0cmVlLCB0ZXN0LCBvdmVybG9hZCwgcmV2ZXJzZSlcblxuICBmdW5jdGlvbiBvdmVybG9hZChub2RlLCBwYXJlbnRzKSB7XG4gICAgdmFyIHBhcmVudCA9IHBhcmVudHNbcGFyZW50cy5sZW5ndGggLSAxXVxuICAgIHZhciBpbmRleCA9IHBhcmVudCA/IHBhcmVudC5jaGlsZHJlbi5pbmRleE9mKG5vZGUpIDogbnVsbFxuICAgIHJldHVybiB2aXNpdG9yKG5vZGUsIGluZGV4LCBwYXJlbnQpXG4gIH1cbn1cbiIsIi8vIExJQ0VOU0UgOiBNSVRcblwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHVuaXN0X3V0aWxfdmlzaXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwidW5pc3QtdXRpbC12aXNpdFwiKSk7XG4vKipcbiAqIElnbm9yZSBub2RlIG1hbmFnZXIgdGhhdCBtYW5hZ2VyIGlnbm9yZWQgcmFuZ2VzLlxuICpcbiAqL1xudmFyIElnbm9yZU5vZGVNYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIElnbm9yZU5vZGVNYW5hZ2VyKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHR5cGUge1tudW1iZXIsbnVtYmVyXVtdfVxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5faWdub3JlZFJhbmdlTGlzdCA9IFtdO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLCBcImlnbm9yZWRSYW5nZXNcIiwge1xuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgeyhudW1iZXIpW11bXX1cbiAgICAgICAgICovXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRSYW5nZUxpc3Q7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICAvKipcbiAgICAgKiB8Li4uLi4uLnxcbiAgICAgKiBeICAgICAgIF5cbiAgICAgKiBJZ25vcmVkIFJhbmdlXG4gICAgICpcbiAgICAgKiAgICB8Li4uLi4uLi58XG4gICAgICogICAgXlxuICAgICAqICBpbmRleFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pc0lnbm9yZWRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faWdub3JlZFJhbmdlTGlzdC5zb21lKGZ1bmN0aW9uIChyYW5nZSkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2VbMF0sIGVuZCA9IHJhbmdlWzFdO1xuICAgICAgICAgICAgcmV0dXJuIHN0YXJ0IDw9IGluZGV4ICYmIGluZGV4IDwgZW5kO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7W251bWJlciwgbnVtYmVyXX0gYVJhbmdlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkXG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlzSWdub3JlZFJhbmdlID0gZnVuY3Rpb24gKGFSYW5nZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0lnbm9yZWRJbmRleChhUmFuZ2VbMF0pIHx8IHRoaXMuaXNJZ25vcmVkSW5kZXgoYVJhbmdlWzFdKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBub2RlXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgSWdub3JlTm9kZU1hbmFnZXIucHJvdG90eXBlLmlzSWdub3JlZCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSWdub3JlZFJhbmdlKG5vZGUucmFuZ2UpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogYWRkIG5vZGUgdG8gaWdub3JlIHJhbmdlIGxpc3RcbiAgICAgKiBAcGFyYW0ge1R4dE5vZGV9IG5vZGVcbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgdGhpcy5pZ25vcmVSYW5nZShub2RlLnJhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGFkZCByYW5nZSB0byBpZ25vcmUgcmFuZ2UgbGlzdFxuICAgICAqIEBwYXJhbSB7W251bWJlciwgbnVtYmVyXX0gcmFuZ2VcbiAgICAgKi9cbiAgICBJZ25vcmVOb2RlTWFuYWdlci5wcm90b3R5cGUuaWdub3JlUmFuZ2UgPSBmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5faWdub3JlZFJhbmdlTGlzdC5wdXNoKHJhbmdlKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIGlnbm9yZSBjaGlsZHJlbiBub2RlIG9mIGBub2RlYCxcbiAgICAgKiBpZiB0aGUgY2hpbGRyZW4gbm9kZSBoYXMgdGhlIHR5cGUgdGhhdCBpcyBpbmNsdWRlZCBpbiBgaWdub3JlZE5vZGVUeXBlc2AuXG4gICAgICogQHBhcmFtIHtUeHROb2RlfSB0YXJnZXROb2RlXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gaWdub3JlZE5vZGVUeXBlc1xuICAgICAqL1xuICAgIElnbm9yZU5vZGVNYW5hZ2VyLnByb3RvdHlwZS5pZ25vcmVDaGlsZHJlbkJ5VHlwZXMgPSBmdW5jdGlvbiAodGFyZ2V0Tm9kZSwgaWdub3JlZE5vZGVUeXBlcykge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAoMCwgdW5pc3RfdXRpbF92aXNpdF8xLmRlZmF1bHQpKHRhcmdldE5vZGUsIGZ1bmN0aW9uICh2aXNpdGVkTm9kZSkge1xuICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvcjogdHlwZSBpcyBUeHROb2RlVHlwZVxuICAgICAgICAgICAgaWYgKGlnbm9yZWROb2RlVHlwZXMuaW5jbHVkZXModmlzaXRlZE5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5pZ25vcmUodmlzaXRlZE5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBJZ25vcmVOb2RlTWFuYWdlcjtcbn0oKSk7XG5leHBvcnRzLmRlZmF1bHQgPSBJZ25vcmVOb2RlTWFuYWdlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlnbm9yZU5vZGVNYW5hZ2VyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29weXJpZ2h0IChDKSAyMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5iaW5hcnlTZWFyY2ggPSBleHBvcnRzLnVwcGVyQm91bmQgPSBleHBvcnRzLmxvd2VyQm91bmQgPSBleHBvcnRzLmNvbXBhcmUgPSB2b2lkIDA7XG5mdW5jdGlvbiBjb21wYXJlKHYxLCB2Mikge1xuICAgIHJldHVybiB2MSA8IHYyO1xufVxuZXhwb3J0cy5jb21wYXJlID0gY29tcGFyZTtcbmZ1bmN0aW9uIHVwcGVyQm91bmQoYXJyYXksIHZhbHVlLCBjb21wID0gY29tcGFyZSkge1xuICAgIGxldCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChsZW4pIHtcbiAgICAgICAgbGV0IGRpZmYgPSBsZW4gPj4+IDE7XG4gICAgICAgIGxldCBjdXJzb3IgPSBpICsgZGlmZjtcbiAgICAgICAgaWYgKGNvbXAodmFsdWUsIGFycmF5W2N1cnNvcl0pKSB7XG4gICAgICAgICAgICBsZW4gPSBkaWZmO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaSA9IGN1cnNvciArIDE7XG4gICAgICAgICAgICBsZW4gLT0gZGlmZiArIDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG59XG5leHBvcnRzLnVwcGVyQm91bmQgPSB1cHBlckJvdW5kO1xuZnVuY3Rpb24gbG93ZXJCb3VuZChhcnJheSwgdmFsdWUsIGNvbXAgPSBjb21wYXJlKSB7XG4gICAgbGV0IGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKGxlbikge1xuICAgICAgICBsZXQgZGlmZiA9IGxlbiA+Pj4gMTtcbiAgICAgICAgbGV0IGN1cnNvciA9IGkgKyBkaWZmO1xuICAgICAgICBpZiAoY29tcChhcnJheVtjdXJzb3JdLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIGkgPSBjdXJzb3IgKyAxO1xuICAgICAgICAgICAgbGVuIC09IGRpZmYgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGVuID0gZGlmZjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbn1cbmV4cG9ydHMubG93ZXJCb3VuZCA9IGxvd2VyQm91bmQ7XG5mdW5jdGlvbiBiaW5hcnlTZWFyY2goYXJyYXksIHZhbHVlLCBjb21wID0gY29tcGFyZSkge1xuICAgIGxldCBjdXJzb3IgPSBsb3dlckJvdW5kKGFycmF5LCB2YWx1ZSwgY29tcCk7XG4gICAgcmV0dXJuIGN1cnNvciAhPT0gYXJyYXkubGVuZ3RoICYmICFjb21wKHZhbHVlLCBhcnJheVtjdXJzb3JdKTtcbn1cbmV4cG9ydHMuYmluYXJ5U2VhcmNoID0gYmluYXJ5U2VhcmNoO1xuLyogdmltOiBzZXQgc3c9NCB0cz00IGV0IHR3PTgwIDogKi9cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLypcbiAgQ29weXJpZ2h0IChDKSAyMDE0IFl1c3VrZSBTdXp1a2kgPHV0YXRhbmUudGVhQGdtYWlsLmNvbT5cblxuICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XG5cbiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cblxuICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIFwiQVMgSVNcIlxuICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Q09QWVJJR0hUIEhPTERFUj4gQkUgTElBQkxFIEZPUiBBTllcbiAgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVNcbiAgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTO1xuICBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TdHJ1Y3R1cmVkU291cmNlID0gdm9pZCAwO1xuY29uc3QgYm91bmRhcnlfMSA9IHJlcXVpcmUoXCJib3VuZGFyeVwiKTtcbi8qKlxuICogU3RydWN0dXJlZFNvdXJjZVxuICovXG5jbGFzcyBTdHJ1Y3R1cmVkU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBAY29uc3RydWN0cyBTdHJ1Y3R1cmVkU291cmNlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIHNvdXJjZSBjb2RlIHRleHQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc291cmNlKSB7XG4gICAgICAgIHRoaXMuaW5kaWNlID0gWzBdO1xuICAgICAgICBsZXQgcmVnZXhwID0gL1tcXHJcXG5cXHUyMDI4XFx1MjAyOV0vZztcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgcmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVnZXhwLmV4ZWMoc291cmNlKTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByZXN1bHQuaW5kZXg7XG4gICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoaW5kZXgpID09PSAweDBEIC8qICdcXHInICovICYmXG4gICAgICAgICAgICAgICAgc291cmNlLmNoYXJDb2RlQXQoaW5kZXggKyAxKSA9PT0gMHgwQSAvKiAnXFxuJyAqLykge1xuICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBhIGxhc3QgbGluZSB0ZXJtaW5hdG9yLCB3ZSBwdXNoIGl0IHRvIHRoZSBpbmRpY2UuXG4gICAgICAgICAgICAvLyBTbyB1c2UgPCBpbnN0ZWFkIG9mIDw9LlxuICAgICAgICAgICAgaWYgKGxlbmd0aCA8IG5leHRJbmRleCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pbmRpY2UucHVzaChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgcmVnZXhwLmxhc3RJbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5kaWNlLmxlbmd0aDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtTb3VyY2VMb2NhdGlvbn0gbG9jIC0gbG9jYXRpb24gaW5kaWNhdG9yLlxuICAgICAqIEByZXR1cm4ge1sgbnVtYmVyLCBudW1iZXIgXX0gcmFuZ2UuXG4gICAgICovXG4gICAgbG9jYXRpb25Ub1JhbmdlKGxvYykge1xuICAgICAgICByZXR1cm4gW3RoaXMucG9zaXRpb25Ub0luZGV4KGxvYy5zdGFydCksIHRoaXMucG9zaXRpb25Ub0luZGV4KGxvYy5lbmQpXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtbIG51bWJlciwgbnVtYmVyIF19IHJhbmdlIC0gcGFpciBvZiBpbmRpY2UuXG4gICAgICogQHJldHVybiB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uLlxuICAgICAqL1xuICAgIHJhbmdlVG9Mb2NhdGlvbihyYW5nZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhcnQ6IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHJhbmdlWzBdKSxcbiAgICAgICAgICAgIGVuZDogdGhpcy5pbmRleFRvUG9zaXRpb24ocmFuZ2VbMV0pXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7U291cmNlUG9zaXRpb259IHBvcyAtIHBvc2l0aW9uIGluZGljYXRvci5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGluZGV4LlxuICAgICAqL1xuICAgIHBvc2l0aW9uVG9JbmRleChwb3MpIHtcbiAgICAgICAgLy8gTGluZSBudW1iZXIgc3RhcnRzIHdpdGggMS5cbiAgICAgICAgLy8gQ29sdW1uIG51bWJlciBzdGFydHMgd2l0aCAwLlxuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLmluZGljZVtwb3MubGluZSAtIDFdO1xuICAgICAgICByZXR1cm4gc3RhcnQgKyBwb3MuY29sdW1uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBpbmRleCB0byB0aGUgc291cmNlIGNvZGUuXG4gICAgICogQHJldHVybiB7U291cmNlUG9zaXRpb259IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGluZGV4VG9Qb3NpdGlvbihpbmRleCkge1xuICAgICAgICBjb25zdCBzdGFydExpbmUgPSAoMCwgYm91bmRhcnlfMS51cHBlckJvdW5kKSh0aGlzLmluZGljZSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGluZTogc3RhcnRMaW5lLFxuICAgICAgICAgICAgY29sdW1uOiBpbmRleCAtIHRoaXMuaW5kaWNlW3N0YXJ0TGluZSAtIDFdXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5TdHJ1Y3R1cmVkU291cmNlID0gU3RydWN0dXJlZFNvdXJjZTtcbi8qIHZpbTogc2V0IHN3PTQgdHM9NCBldCB0dz04MCA6ICovXG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJ1Y3R1cmVkLXNvdXJjZS5qcy5tYXAiLCIvLyBMSUNFTlNFIDogTUlUXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuU291cmNlTG9jYXRpb24gPSB2b2lkIDA7XG52YXIgc3RydWN0dXJlZF9zb3VyY2VfMSA9IHJlcXVpcmUoXCJzdHJ1Y3R1cmVkLXNvdXJjZVwiKTtcbnZhciBTb3VyY2VMb2NhdGlvbiA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTb3VyY2VMb2NhdGlvbih0ZXh0KSB7XG4gICAgICAgIHRoaXMuc291cmNlID0gbmV3IHN0cnVjdHVyZWRfc291cmNlXzEuU3RydWN0dXJlZFNvdXJjZSh0ZXh0KTtcbiAgICB9XG4gICAgU291cmNlTG9jYXRpb24ucHJvdG90eXBlLnRvQWJzb2x1dGVMb2NhdGlvbiA9IGZ1bmN0aW9uIChub2RlLCBwYWRkaW5nKSB7XG4gICAgICAgIHZhciBub2RlUmFuZ2UgPSBub2RlLnJhbmdlO1xuICAgICAgICB2YXIgbGluZSA9IG5vZGUubG9jLnN0YXJ0LmxpbmU7XG4gICAgICAgIHZhciBjb2x1bW4gPSBub2RlLmxvYy5zdGFydC5jb2x1bW47XG4gICAgICAgIC8vIHdoZW4gdXNlIHtpbmRleH1cbiAgICAgICAgaWYgKHBhZGRpbmcuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHBhZGRpbmdJbmRleCA9IHBhZGRpbmcuaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gbm9kZVJhbmdlWzBdICsgcGFkZGluZ0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gdXNlIHtsaW5lLCBjb2x1bW59XG4gICAgICAgIGlmIChwYWRkaW5nLmxpbmUgIT09IHVuZGVmaW5lZCAmJiBwYWRkaW5nLmNvbHVtbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB2YXIgYWRkZWRMaW5lID0gbGluZSArIHBhZGRpbmcubGluZTtcbiAgICAgICAgICAgIC8vIHdoZW4gcmVwb3J0IHdpdGggcGFkZGluZyB7bGluZSwgY29sdW1ufSwgbWVzc2FnZS5jb2x1bW4gc2hvdWxkIGJlIDAgKyBwYWRkaW5nLmNvbHVtbi5cbiAgICAgICAgICAgIC8vIEluIG90aGVyIHdvcmQsIHBhZGRpbmcgbGluZSA+IDAgYW5kIG1lc3NhZ2UuY29sdW1uIHN0YXJ0IHdpdGggMC5cbiAgICAgICAgICAgIGlmIChwYWRkaW5nLmNvbHVtbiA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UucG9zaXRpb25Ub0luZGV4KHtcbiAgICAgICAgICAgICAgICAgICAgbGluZTogYWRkZWRMaW5lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHBhZGRpbmcuY29sdW1uXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2UucG9zaXRpb25Ub0luZGV4KHtcbiAgICAgICAgICAgICAgICAgICAgbGluZTogYWRkZWRMaW5lLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gdXNlIHsgbGluZSB9IG9ubHlcbiAgICAgICAgaWYgKHBhZGRpbmcubGluZSAhPT0gdW5kZWZpbmVkICYmIHBhZGRpbmcubGluZSA+IDApIHtcbiAgICAgICAgICAgIHZhciBhZGRlZExpbmUgPSBsaW5lICsgcGFkZGluZy5saW5lO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlLnBvc2l0aW9uVG9JbmRleCh7XG4gICAgICAgICAgICAgICAgbGluZTogYWRkZWRMaW5lLFxuICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZVJhbmdlWzBdO1xuICAgIH07XG4gICAgcmV0dXJuIFNvdXJjZUxvY2F0aW9uO1xufSgpKTtcbmV4cG9ydHMuU291cmNlTG9jYXRpb24gPSBTb3VyY2VMb2NhdGlvbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNvdXJjZUxvY2F0aW9uLmpzLm1hcCIsIi8vIE1JVCDCqSAyMDE4IGF6dVxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLndyYXBSZXBvcnRIYW5kbGVyID0gd3JhcFJlcG9ydEhhbmRsZXI7XG52YXIgdGV4dGxpbnRfcnVsZV9oZWxwZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi90ZXh0bGludC1ydWxlLWhlbHBlclwiKSk7XG52YXIgSWdub3JlTm9kZU1hbmFnZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9JZ25vcmVOb2RlTWFuYWdlclwiKSk7XG52YXIgU291cmNlTG9jYXRpb25fMSA9IHJlcXVpcmUoXCIuL1NvdXJjZUxvY2F0aW9uXCIpO1xuLyoqXG4gKlxuICogQHBhcmFtIGNvbnRleHRcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcGFyYW0gaGFuZGxlclxuICovXG5mdW5jdGlvbiB3cmFwUmVwb3J0SGFuZGxlcihjb250ZXh0LCBvcHRpb25zLCBoYW5kbGVyKSB7XG4gICAgdmFyIGlnbm9yZU5vZGVUeXBlcyA9IG9wdGlvbnMuaWdub3JlTm9kZVR5cGVzIHx8IFtdO1xuICAgIHZhciBpZ25vcmVOb2RlTWFuYWdlciA9IG5ldyBJZ25vcmVOb2RlTWFuYWdlcl8xLmRlZmF1bHQoKTtcbiAgICB2YXIgcnVsZUhlbHBlciA9IG5ldyB0ZXh0bGludF9ydWxlX2hlbHBlcl8xLmRlZmF1bHQoY29udGV4dCk7XG4gICAgdmFyIHRleHQgPSBjb250ZXh0LmdldFNvdXJjZSgpO1xuICAgIHZhciBzb3VyY2VMb2NhdGlvbiA9IG5ldyBTb3VyY2VMb2NhdGlvbl8xLlNvdXJjZUxvY2F0aW9uKHRleHQpO1xuICAgIHZhciByZXBvcnRJZlVuaWdub3JlZCA9IGZ1bmN0aW9uIHJlcG9ydElmVW5pZ25vcmVkKG5vZGUsIHJ1bGVFcnJvcikge1xuICAgICAgICB2YXIgaW5kZXggPSBzb3VyY2VMb2NhdGlvbi50b0Fic29sdXRlTG9jYXRpb24obm9kZSwgcnVsZUVycm9yKTtcbiAgICAgICAgaWYgKGlnbm9yZU5vZGVNYW5hZ2VyLmlzSWdub3JlZEluZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnJlcG9ydChub2RlLCBydWxlRXJyb3IpO1xuICAgIH07XG4gICAgdmFyIGhhbmRsZXJzID0gaGFuZGxlcihyZXBvcnRJZlVuaWdub3JlZCk7XG4gICAgT2JqZWN0LmtleXMoaGFuZGxlcnMpLmZvckVhY2goZnVuY3Rpb24gKG5vZGVUeXBlKSB7XG4gICAgICAgIHZhciBub2RlSGFuZGxlciA9IGhhbmRsZXJzW25vZGVUeXBlXTtcbiAgICAgICAgdmFyIHdyYXBwZWROb2RlSGFuZGxlciA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAvLyBjaGlsZCBub2Rlc1xuICAgICAgICAgICAgaWdub3JlTm9kZU1hbmFnZXIuaWdub3JlQ2hpbGRyZW5CeVR5cGVzKG5vZGUsIGlnbm9yZU5vZGVUeXBlcyk7XG4gICAgICAgICAgICAvLyBwYXJlbnQgbm9kZVxuICAgICAgICAgICAgaWYgKHJ1bGVIZWxwZXIuaXNDaGlsZE5vZGUobm9kZSwgaWdub3JlTm9kZVR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbm9kZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbm9kZUhhbmRsZXIobm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3I6IGlnbm9yZVxuICAgICAgICBoYW5kbGVyc1tub2RlVHlwZV0gPSB3cmFwcGVkTm9kZUhhbmRsZXI7XG4gICAgfSk7XG4gICAgcmV0dXJuIGhhbmRsZXJzO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d3JhcC1yZXBvcnQtaGFuZGxlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMud3JhcFJlcG9ydEhhbmRsZXIgPSBleHBvcnRzLlJ1bGVIZWxwZXIgPSBleHBvcnRzLklnbm9yZU5vZGVNYW5hZ2VyID0gdm9pZCAwO1xudmFyIHRleHRsaW50X3J1bGVfaGVscGVyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdGV4dGxpbnQtcnVsZS1oZWxwZXJcIikpO1xuZXhwb3J0cy5SdWxlSGVscGVyID0gdGV4dGxpbnRfcnVsZV9oZWxwZXJfMS5kZWZhdWx0O1xudmFyIElnbm9yZU5vZGVNYW5hZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vSWdub3JlTm9kZU1hbmFnZXJcIikpO1xuZXhwb3J0cy5JZ25vcmVOb2RlTWFuYWdlciA9IElnbm9yZU5vZGVNYW5hZ2VyXzEuZGVmYXVsdDtcbnZhciB3cmFwX3JlcG9ydF9oYW5kbGVyXzEgPSByZXF1aXJlKFwiLi93cmFwLXJlcG9ydC1oYW5kbGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwid3JhcFJlcG9ydEhhbmRsZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdyYXBfcmVwb3J0X2hhbmRsZXJfMS53cmFwUmVwb3J0SGFuZGxlcjsgfSB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8vIExJQ0VOU0UgOiBNSVRcblwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5yZXBvcnQgPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3RleHRsaW50UnVsZUhlbHBlciA9IHJlcXVpcmUoXCJ0ZXh0bGludC1ydWxlLWhlbHBlclwiKTtcbnZhciBIYW5rYWt1UmVnRXhwID0gLyhbXFx1ZmY2MS1cXHVmZjlmXSspL2c7XG52YXIgcmVwb3J0ID0gZnVuY3Rpb24gcmVwb3J0ZXIoY29udGV4dCkge1xuICB2YXIge1xuICAgIFN5bnRheCxcbiAgICBSdWxlRXJyb3IsXG4gICAgZml4ZXIsXG4gICAgcmVwb3J0LFxuICAgIGxvY2F0b3IsXG4gICAgZ2V0U291cmNlXG4gIH0gPSBjb250ZXh0O1xuICB2YXIgaGVscGVyID0gbmV3IF90ZXh0bGludFJ1bGVIZWxwZXIuUnVsZUhlbHBlcihjb250ZXh0KTtcbiAgcmV0dXJuIHtcbiAgICBbU3ludGF4LlN0cl0obm9kZSkge1xuICAgICAgaWYgKCFoZWxwZXIuaXNQbGFpblN0ck5vZGUobm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIG5vZGVUZXh0ID0gZ2V0U291cmNlKG5vZGUpO1xuICAgICAgZm9yICh2YXIgbWF0Y2ggb2Ygbm9kZVRleHQubWF0Y2hBbGwoSGFua2FrdVJlZ0V4cCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaCRpbmRleDtcbiAgICAgICAgdmFyIHRleHQgPSBtYXRjaFswXTtcbiAgICAgICAgdmFyIGluZGV4ID0gKF9tYXRjaCRpbmRleCA9IG1hdGNoLmluZGV4KSAhPT0gbnVsbCAmJiBfbWF0Y2gkaW5kZXggIT09IHZvaWQgMCA/IF9tYXRjaCRpbmRleCA6IDA7XG4gICAgICAgIHZhciByYW5nZSA9IFtpbmRleCwgaW5kZXggKyB0ZXh0Lmxlbmd0aF07XG4gICAgICAgIHZhciBydWxlRXJyb3IgPSBuZXcgUnVsZUVycm9yKFwiRGlzYWxsb3cgdG8gdXNlIFxcdTUzNEFcXHU4OUQyXFx1MzBBQlxcdTMwQkZcXHUzMEFCXFx1MzBDQTogXFxcIlwiLmNvbmNhdCh0ZXh0LCBcIlxcXCJcIiksIHtcbiAgICAgICAgICBwYWRkaW5nOiBsb2NhdG9yLnJhbmdlKHJhbmdlKSxcbiAgICAgICAgICBmaXg6IGZpeGVyLnJlcGxhY2VUZXh0UmFuZ2UocmFuZ2UsIHRleHQubm9ybWFsaXplKCdORktDJykpXG4gICAgICAgIH0pO1xuICAgICAgICByZXBvcnQobm9kZSwgcnVsZUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuZXhwb3J0cy5yZXBvcnQgPSByZXBvcnQ7XG52YXIgX2RlZmF1bHQgPSB7XG4gIGxpbnRlcjogcmVwb3J0LFxuICBmaXhlcjogcmVwb3J0XG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXh0bGludC1ydWxlLW5vLWhhbmtha3Uta2FuYS5qcy5tYXAiLCJpbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2FkIH0gZnJvbSAnQHNsaWRldi9wYXJzZXIvZnMnO1xuaW1wb3J0IHsgVGV4dGxpbnRLZXJuZWwsIHR5cGUgVGV4dGxpbnRLZXJuZWxSdWxlIH0gZnJvbSAnQHRleHRsaW50L2tlcm5lbCc7XG5pbXBvcnQgeyBtb2R1bGVJbnRlcm9wIH0gZnJvbSAnQHRleHRsaW50L21vZHVsZS1pbnRlcm9wJztcbi8vIFRoZSBwaW5uZWQgcGFja2FnZSBoYXMgbm8gbmFtZWQgUHJvY2Vzc29yIGV4cG9ydDsgaXRzIGRlZmF1bHQgaW1wb3J0IGFsc28gZmFpbHMgTm9kZU5leHQgdHlwaW5nLlxuaW1wb3J0IHsgTWFya2Rvd25Qcm9jZXNzb3IgfSBmcm9tICdAdGV4dGxpbnQvdGV4dGxpbnQtcGx1Z2luLW1hcmtkb3duL2xpYi9zcmMvTWFya2Rvd25Qcm9jZXNzb3IuanMnO1xuaW1wb3J0IG5vSW52YWxpZENvbnRyb2xDaGFyYWN0ZXIgZnJvbSAnQHRleHRsaW50LXJ1bGUvdGV4dGxpbnQtcnVsZS1uby1pbnZhbGlkLWNvbnRyb2wtY2hhcmFjdGVyJztcbmltcG9ydCBub0hhbmtha3VLYW5hIGZyb20gJ3RleHRsaW50LXJ1bGUtbm8taGFua2FrdS1rYW5hJztcbmltcG9ydCBub1plcm9XaWR0aFNwYWNlcyBmcm9tICd0ZXh0bGludC1ydWxlLW5vLXplcm8td2lkdGgtc3BhY2VzJztcblxuY29uc3QgcnVsZXM6IFRleHRsaW50S2VybmVsUnVsZVtdID0gW1xuICB7IHJ1bGVJZDogJ25vLWludmFsaWQtY29udHJvbC1jaGFyYWN0ZXInLCBydWxlOiBtb2R1bGVJbnRlcm9wKG5vSW52YWxpZENvbnRyb2xDaGFyYWN0ZXIpIH0sXG4gIHsgcnVsZUlkOiAnbm8taGFua2FrdS1rYW5hJywgcnVsZTogbW9kdWxlSW50ZXJvcChub0hhbmtha3VLYW5hKSB9LFxuICB7IHJ1bGVJZDogJ25vLXplcm8td2lkdGgtc3BhY2VzJywgcnVsZTogbW9kdWxlSW50ZXJvcChub1plcm9XaWR0aFNwYWNlcykgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW50U2xpZGV2VGV4dChkZWNrUGF0aDogc3RyaW5nLCB3b3Jrc3BhY2VSb290OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zb2xlLmluZm8oYFRleHRsaW50OiAke2RlY2tQYXRofWApO1xuICBjb25zdCB1c2VyUm9vdCA9IHBhdGguZGlybmFtZShkZWNrUGF0aCk7XG4gIGxldCBkYXRhOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGxvYWQ+PjtcbiAgdHJ5IHtcbiAgICBkYXRhID0gYXdhaXQgbG9hZCh7IHJvb3RzOiBbdXNlclJvb3RdLCB1c2VyUm9vdCwgYWxsb3dlZFJvb3RzOiBbd29ya3NwYWNlUm9vdCwgdXNlclJvb3RdIH0sIGRlY2tQYXRoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGAke2RlY2tQYXRofTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgY29uc3Qga2VybmVsID0gbmV3IFRleHRsaW50S2VybmVsKCk7XG4gIGxldCBleGl0Q29kZSA9IDA7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBPYmplY3QudmFsdWVzKGRhdGEubWFya2Rvd25GaWxlcykpIHtcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IChmaWxlLmVycm9ycyA/PyBbXSkubWFwKChlcnJvcikgPT4gYCR7ZmlsZS5maWxlcGF0aH06JHtlcnJvci5yb3cgKyAxfToxOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgZm9yIChjb25zdCBkaWFnbm9zdGljIG9mIG5ldyBTZXQoZGlhZ25vc3RpY3MpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGRpYWdub3N0aWMpO1xuICAgICAgZXhpdENvZGUgPSAxO1xuICAgIH1cbiAgfVxuICBjb25zdCBjaGVja2VkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgeyBzb3VyY2UgfSBvZiBkYXRhLnNsaWRlcykge1xuICAgIGNvbnN0IGtleSA9IGAke3NvdXJjZS5maWxlcGF0aH06JHtzb3VyY2UuaW5kZXh9YDtcbiAgICBpZiAoY2hlY2tlZC5oYXMoa2V5KSkgY29udGludWU7XG4gICAgY2hlY2tlZC5hZGQoa2V5KTtcbiAgICAvLyBUaGUgcGFyc2VyIGFsd2F5cyBzZXRzIGNvbnRlbnRTdGFydCA+PSBzdGFydCwgYnV0IGl0IGNhbiBleGNlZWQgZW5kIGFmdGVyIGEgZmluYWwgc2VwYXJhdG9yIHdpdGhvdXQgYSBibGFuayBsaW5lLlxuICAgIGNvbnN0IGNvbnRlbnRTdGFydCA9IHNvdXJjZS5jb250ZW50U3RhcnQgPiBzb3VyY2UuZW5kID8gc291cmNlLnN0YXJ0IDogc291cmNlLmNvbnRlbnRTdGFydDtcbiAgICBjb25zdCB0ZXh0ID0gc291cmNlLnJhd1xuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLnNsaWNlKGNvbnRlbnRTdGFydCAtIHNvdXJjZS5zdGFydClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBrZXJuZWwubGludFRleHQodGV4dCwge1xuICAgICAgZmlsZVBhdGg6IHNvdXJjZS5maWxlcGF0aCxcbiAgICAgIGV4dDogJy5tZCcsXG4gICAgICBwbHVnaW5zOiBbeyBwbHVnaW5JZDogJ21hcmtkb3duJywgcGx1Z2luOiB7IFByb2Nlc3NvcjogTWFya2Rvd25Qcm9jZXNzb3IgfSB9XSxcbiAgICAgIHJ1bGVzLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiByZXN1bHQubWVzc2FnZXMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGAke3NvdXJjZS5maWxlcGF0aH06JHtjb250ZW50U3RhcnQgKyBtZXNzYWdlLmxpbmV9OiR7bWVzc2FnZS5jb2x1bW59OiAke21lc3NhZ2UubWVzc2FnZX0gKCR7bWVzc2FnZS5ydWxlSWR9KWBcbiAgICAgICk7XG4gICAgICBleGl0Q29kZSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBleGl0Q29kZTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MV0sIm1hcHBpbmdzIjoibW1DQXdDQSxTQUFTLEVBQUssRUFBTyxDQUNuQixPQUFPLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBSyxDQUFDLENBQ2xDLENBOEJBLFNBQVMsRUFBTSxHQUFHLEVBQU0sQ0FDdEIsSUFBSSxFQUFPLEVBQU0sRUFDYixFQUFLLFNBQVcsR0FDbEIsRUFBUSxFQUNSLEVBQU8sRUFDUCxDQUFDLEdBQVEsR0FFVCxDQUFDLEVBQU8sRUFBTSxFQUFPLEdBQUssRUFFNUIsSUFBTSxFQUFNLENBQUMsRUFDVCxFQUFVLEVBQ2QsS0FBTyxFQUFVLEdBQ2YsRUFBSSxLQUFLLENBQU8sRUFDaEIsR0FBVyxHQUFRLEVBRXJCLE9BQU8sQ0FDVCxDQXVHQSxTQUFTLEVB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