@willbooster/wb 22.12.0 → 22.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/draftRelease-DGtLMmIX.js +4 -0
- package/dist/index.js +59 -59
- package/dist/releasePlugin.js +2 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -76,6 +76,9 @@ Commands:
|
|
|
76
76
|
run the release, then restore the modified
|
|
77
77
|
files. Extra arguments (e.g. `--debug`, after
|
|
78
78
|
`--`) are forwarded to the release command.
|
|
79
|
+
With the @willbooster/wb/release-plugin
|
|
80
|
+
semantic-release plugin, first complete a
|
|
81
|
+
release that a failed run left pending.
|
|
79
82
|
wb retry [command] [args...] Retry the given command until it succeeds
|
|
80
83
|
wb run [args..] Load environment variables and run a script
|
|
81
84
|
with the project runtime.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import e from"node:fs";import t from"node:path";import{spawn as n}from"node:child_process";import{z as r}from"zod";const i=`willbooster-wb-release (https://github.com/WillBooster/shared)`,a=[1,2,4,8,16];function o(e){return async(t,n,r,i)=>{let a=await s(`https://api.github.com/repos/${e.GITHUB_REPOSITORY}/${n}`,{method:t,headers:{Accept:`application/vnd.github+json`,Authorization:`Bearer ${e.GITHUB_TOKEN}`},...r!==void 0&&{body:JSON.stringify(r)}},i);if(!a.ok)throw Error(`${t} ${n} failed: ${a.status} ${await a.text()}`);return a.status===204?void 0:a.json()}}async function s(e,t,{findCreated:n,repeatable:r}={}){for(let i=0;;i++){let o,s;try{let n=await fetch(e,t),r=await n.arrayBuffer();o=new Response(r.byteLength>0?r:void 0,n)}catch(e){if(!(e instanceof TypeError))throw e;s=e}if(i>0&&t.method===`DELETE`&&o&&await c(o))return new Response(void 0,{status:204});let u=o&&await l(o);if(o&&u===void 0&&o.status<500)return o;let d=t.method===`POST`&&!r&&u===void 0,f=d?a[0]:Math.max(a[i]??1/0,u??0);if(f>300||d&&!n){if(!o)throw s;return o}let p=o?`${o.status} ${o.statusText}`:`a dropped connection`;if(console.info(`${d?`Looking for the result of`:`Retrying`} ${t.method??`GET`} ${e} in ${Math.ceil(f)} seconds after ${p}`),await new Promise(e=>setTimeout(e,f*1e3)),d&&n){let e=await n();if(e)return Response.json(e);if(!o)throw s;return o}}}async function c(e){if(e.status===404)return!0;let t=await e.clone().text();return e.status===422&&t.includes(`"Reference does not exist"`)}async function l(e){if(!(e.status===429||e.status===403&&/rate limit/i.test(await e.clone().text())))return;let t=Date.now()/1e3,n=e.headers.get(`retry-after`)??``,r=e.headers.get(`x-ratelimit-remaining`)===`0`&&e.headers.get(`x-ratelimit-reset`),i=[/^\d+$/.test(n)?Number(n):Date.parse(n)/1e3-t,r?Number(r)-t:NaN].filter(e=>Number.isFinite(e));return i.length>0?Math.max(...i):60}const u=`@willbooster/wb/release-plugin`,d=t.join(`script`,`build-release`),f=`
|
|
2
|
+
|
|
3
|
+
<!-- pending release -->`,p=r.object({crate:r.string().min(1).optional(),pkgRoot:r.string().min(1)}),m=r.object({id:r.number(),tag_name:r.string(),target_commitish:r.string(),draft:r.boolean(),body:r.string().nullable(),html_url:r.string()});function h(e){if(e!==void 0&&e!=="v${version}")throw Error(`${u} requires semantic-release's default tagFormat \`v\${version}\`.`)}async function g(e,n,r,i){await T(t.join(e,d),[r],e,n,i)}async function _(e,{gitHead:t,gitTag:n,name:r,notes:i}){let a=await v(e,n)??m.parse(await e(`POST`,`releases`,{tag_name:n,target_commitish:t,name:r,body:`${i??``}${f}`,draft:!0},{findCreated:()=>v(e,n)}));if(a.target_commitish!==t)throw Error(`The draft release ${n} targets ${a.target_commitish}, not ${t}.`);return a}async function v(e,t){return(await y(e)).find(e=>e.tag_name===t)}async function y(e){return r.array(m).parse(await e(`GET`,`releases?per_page=100`)).filter(e=>e.draft&&e.body?.endsWith(f))}async function b({config:{crate:e,pkgRoot:n},cwd:r,env:i,logger:a,draft:s,version:c,tracker:l}){let u=s.target_commitish,d=t.resolve(r,n),f=(await x({crate:e,cwd:r,pkgRoot:n,version:c})).map(t=>({...t,...t.registry===`crates.io`&&e?{dryRun:()=>T(`cargo`,[`publish`,`--dry-run`,`--allow-dirty`,`-p`,e],r,i,l),publish:()=>C(e,r,i,l)}:{dryRun:()=>T(`npm`,[`publish`,`--dry-run`],d,i,l),publish:()=>T(`npm`,[`publish`],d,i,l)}}));for(let{commit:e,name:t}of f)if(e!==void 0&&e!==u)throw Error(`${t} was published from ${e||`an unknown commit`}, not from ${u}.`);let p=f.filter(({commit:e})=>e===void 0);for(let e of p)await e.dryRun();for(let e of f)p.includes(e)?await e.publish():a.log(`Skipped ${e.name}, which is already published from ${u}`);let h=m.parse(await o(i)(`PATCH`,`releases/${s.id}`,{draft:!1,body:s.body?.slice(0,-26)}));a.log(`Published the GitHub Release ${h.html_url}`)}async function x({crate:n,cwd:i,pkgRoot:a,version:o}){let{name:s}=r.object({name:r.string()}).parse(JSON.parse(e.readFileSync(t.resolve(i,a,`package.json`),`utf8`)));return[...n?[{registry:`crates.io`,name:`${n}@${o} on crates.io`,commit:await S(`https://crates.io/api/v1/crates/${n}/${o}`,e=>r.object({version:r.object({trustpub_data:r.object({sha:r.string()}).nullish()})}).parse(e).version.trustpub_data?.sha)}]:[],{registry:`npm`,name:`${s}@${o} on npm`,commit:await S(`https://registry.npmjs.org/${s.replace(`/`,`%2f`)}/${o}`,e=>r.object({gitHead:r.string().optional()}).parse(e).gitHead)}]}async function S(e,t){let n=await s(e,{headers:{"User-Agent":i}});if(n.status!==404){if(!n.ok)throw Error(`GET ${e} failed: ${n.status} ${await n.text()}`);return t(await n.json())??``}}async function C(e,t,n,a){let{value:o}=r.object({value:r.string()}).parse(await w(`${n.ACTIONS_ID_TOKEN_REQUEST_URL}&audience=crates.io`,{headers:{Authorization:`Bearer ${n.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})),c=`https://crates.io/api/v1/trusted_publishing/tokens`,{token:l}=r.object({token:r.string()}).parse(await w(c,{method:`POST`,headers:{"Content-Type":`application/json`,"User-Agent":i},body:JSON.stringify({jwt:o})},!0));try{await T(`cargo`,[`publish`,`-p`,e,`--allow-dirty`],t,{...n,CARGO_REGISTRY_TOKEN:l},a)}finally{let e=await s(c,{method:`DELETE`,headers:{Authorization:`Bearer ${l}`,"User-Agent":i}}).catch(e=>e);(!(e instanceof Response)||!e.ok)&&console.warn(`Failed to revoke the crates.io token.`)}}async function w(e,t,n=!1){let r=await s(e,t,{repeatable:n});if(!r.ok)throw Error(`${t.method??`GET`} ${e} failed: ${r.status}`);return r.json()}async function T(e,t,r,i,a){let o=await new Promise((o,s)=>{let c=n(e,t,{cwd:r,env:i,stdio:`inherit`});a&&(a.current=c),c.on(`error`,s).on(`exit`,o)}).finally(()=>{a&&(a.current=void 0)});if(o!==0)throw Error(`${e} ${t.join(` `)} exited with ${o}.`)}export{_ as a,p as c,o as d,v as i,u as l,d as n,y as o,x as r,b as s,h as t,g as u};
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZnRSZWxlYXNlLURHdExNbUlYLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWxlYXNlL2h0dHAudHMiLCIuLi9zcmMvcmVsZWFzZS9kcmFmdFJlbGVhc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY3JhdGVzLmlvIHJlamVjdHMgcmVxdWVzdHMgd2l0aCBhIGdlbmVyaWMgVXNlci1BZ2VudC5cbmV4cG9ydCBjb25zdCB1c2VyQWdlbnQgPSAnd2lsbGJvb3N0ZXItd2ItcmVsZWFzZSAoaHR0cHM6Ly9naXRodWIuY29tL1dpbGxCb29zdGVyL3NoYXJlZCknO1xuXG4vLyBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGVhY2ggcmV0cnkgb2YgYSByZXF1ZXN0IHRoYXQgZmFpbGVkIHRyYW5zaWVudGx5LlxuY29uc3QgcmV0cnlEZWxheXMgPSBbMSwgMiwgNCwgOCwgMTZdO1xuLy8gR2l0SHViIGFza3MgdG8gd2FpdCBhdCBsZWFzdCBhIG1pbnV0ZSBhZnRlciBhIHNlY29uZGFyeSByYXRlIGxpbWl0IHRoYXQgc3RhdGVzIG5vIHRpbWUuXG5jb25zdCBkZWZhdWx0UmF0ZUxpbWl0RGVsYXkgPSA2MDtcbi8vIEEgcmF0ZSBsaW1pdCB0aGF0IGxhc3RzIGxvbmdlciBmYWlscyB0aGUgcnVuIGluc3RlYWQsIHdoaWNoIGEgcmUtcnVuIGNvbXBsZXRlcy5cbmNvbnN0IG1heFJldHJ5RGVsYXkgPSAzMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlPcHRpb25zIHtcbiAgLyoqIExvb2tzIGZvciB3aGF0IGEgUE9TVCB0aGF0IG1heSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGNyZWF0ZWQuICovXG4gIGZpbmRDcmVhdGVkPzogKCkgPT4gUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIFdoZXRoZXIgYSBQT1NUIG1heSBiZSByZXBlYXRlZCBhZnRlciBhIGZhaWx1cmUgdGhhdCB0aGUgc2VydmVyIG1heSBoYXZlIHByb2Nlc3NlZC4gKi9cbiAgcmVwZWF0YWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEdpdEh1YkNsaWVudCA9IChtZXRob2Q6IHN0cmluZywgcm91dGU6IHN0cmluZywgYm9keT86IHVua25vd24sIG9wdGlvbnM/OiBSZXRyeU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG5cbi8qKlxuICogVGhlIHJldHVybmVkIGNsaWVudCBuZXZlciByZXBlYXRzIGEgUE9TVCBhZnRlciBhIGZhaWx1cmUgdGhhdCBHaXRIdWIgbWF5IGhhdmUgcHJvY2Vzc2VkLCBzaW5jZSBhIGxpc3RpbmcgY2Fubm90IHByb3ZlXG4gKiB0aGF0IHRoZSBQT1NUIGNyZWF0ZWQgbm90aGluZywgdW5sZXNzIHRoZSBQT1NUIGlzIGByZXBlYXRhYmxlYC4gYGZpbmRDcmVhdGVkYCB0aGVuIGxvb2tzIGZvciB3aGF0IGl0IGNyZWF0ZWQsIHdoaWNoXG4gKiB0aGUgY2xpZW50IHJldHVybnMgaWYgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHaXRIdWJDbGllbnQoZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KTogR2l0SHViQ2xpZW50IHtcbiAgcmV0dXJuIGFzeW5jIChtZXRob2QsIHJvdXRlLCBib2R5LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShcbiAgICAgIGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7ZW52LkdJVEhVQl9SRVBPU0lUT1JZfS8ke3JvdXRlfWAsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogeyBBY2NlcHQ6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nLCBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7ZW52LkdJVEhVQl9UT0tFTn1gIH0sXG4gICAgICAgIC4uLihib2R5ICE9PSB1bmRlZmluZWQgJiYgeyBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSB9KSxcbiAgICAgIH0sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYCR7bWV0aG9kfSAke3JvdXRlfSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKTtcbiAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAyMDQgPyB1bmRlZmluZWQgOiByZXNwb25zZS5qc29uKCk7XG4gIH07XG59XG5cbi8qKlxuICogRmV0Y2hlcyBgdXJsYCwgcmV0cnlpbmcgYSBkcm9wcGVkIGNvbm5lY3Rpb24sIGEgNXh4IHJlc3BvbnNlLCBhbmQgYSByYXRlIGxpbWl0LiBVbmxpa2UgYSByYXRlLWxpbWl0ZWQgcmVxdWVzdCwgdGhlXG4gKiBvdGhlcnMgbWF5IGhhdmUgYmVlbiBwcm9jZXNzZWQsIHNvIGEgUE9TVCBpcyBub3QgcmVwZWF0ZWQgYWZ0ZXIgdGhlbSB1bmxlc3MgaXQgaXMgYHJlcGVhdGFibGVgLCBhbmQgYSByZXBlYXRlZCBERUxFVEVcbiAqIHRoYXQgZmluZHMgbm90aGluZyBsZWZ0IHRvIGRlbGV0ZSBzdWNjZWVkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFJldHJ5KFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdDogUmVxdWVzdEluaXQsXG4gIHsgZmluZENyZWF0ZWQsIHJlcGVhdGFibGUgfTogUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgbGV0IHJlc3BvbnNlOiBSZXNwb25zZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY29ubmVjdGlvbkVycm9yOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWNlaXZlZCA9IGF3YWl0IGZldGNoKHVybCwgaW5pdCk7XG4gICAgICAvLyBSZWFkIGhlcmUgc28gdGhhdCBhIGNvbm5lY3Rpb24gZHJvcHBlZCB3aGlsZSByZWNlaXZpbmcgdGhlIGJvZHkgaXMgcmV0cmllZCB0b28uXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVjZWl2ZWQuYXJyYXlCdWZmZXIoKTtcbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKGJvZHkuYnl0ZUxlbmd0aCA+IDAgPyBib2R5IDogdW5kZWZpbmVkLCByZWNlaXZlZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGZldGNoIGFuZCByZWFkaW5nIHRoZSBib2R5IHJlamVjdCB3aXRoIGEgVHlwZUVycm9yIHdoZW4gdGhlIGNvbm5lY3Rpb24gZmFpbHMgb3IgZHJvcHMuXG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikpIHRocm93IGVycm9yO1xuICAgICAgY29ubmVjdGlvbkVycm9yID0gZXJyb3I7XG4gICAgfVxuICAgIGlmIChhdHRlbXB0ID4gMCAmJiBpbml0Lm1ldGhvZCA9PT0gJ0RFTEVURScgJiYgcmVzcG9uc2UgJiYgKGF3YWl0IGlzQWJzZW50KHJlc3BvbnNlKSkpIHtcbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UodW5kZWZpbmVkLCB7IHN0YXR1czogMjA0IH0pO1xuICAgIH1cbiAgICBjb25zdCByYXRlTGltaXREZWxheSA9IHJlc3BvbnNlICYmIChhd2FpdCBnZXRSYXRlTGltaXREZWxheShyZXNwb25zZSkpO1xuICAgIGlmIChyZXNwb25zZSAmJiByYXRlTGltaXREZWxheSA9PT0gdW5kZWZpbmVkICYmIHJlc3BvbnNlLnN0YXR1cyA8IDUwMCkgcmV0dXJuIHJlc3BvbnNlO1xuICAgIGNvbnN0IGlzVW5jZXJ0YWluUG9zdCA9IGluaXQubWV0aG9kID09PSAnUE9TVCcgJiYgIXJlcGVhdGFibGUgJiYgcmF0ZUxpbWl0RGVsYXkgPT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWxheSA9IGlzVW5jZXJ0YWluUG9zdCA/IHJldHJ5RGVsYXlzWzBdISA6IE1hdGgubWF4KHJldHJ5RGVsYXlzW2F0dGVtcHRdID8/IEluZmluaXR5LCByYXRlTGltaXREZWxheSA/PyAwKTtcbiAgICBpZiAoZGVsYXkgPiBtYXhSZXRyeURlbGF5IHx8IChpc1VuY2VydGFpblBvc3QgJiYgIWZpbmRDcmVhdGVkKSkge1xuICAgICAgaWYgKCFyZXNwb25zZSkgdGhyb3cgY29ubmVjdGlvbkVycm9yO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYXNvbiA9IHJlc3BvbnNlID8gYCR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCA6ICdhIGRyb3BwZWQgY29ubmVjdGlvbic7XG4gICAgY29uc3QgYWN0aW9uID0gaXNVbmNlcnRhaW5Qb3N0ID8gJ0xvb2tpbmcgZm9yIHRoZSByZXN1bHQgb2YnIDogJ1JldHJ5aW5nJztcbiAgICBjb25zb2xlLmluZm8oYCR7YWN0aW9ufSAke2luaXQubWV0aG9kID8/ICdHRVQnfSAke3VybH0gaW4gJHtNYXRoLmNlaWwoZGVsYXkpfSBzZWNvbmRzIGFmdGVyICR7cmVhc29ufWApO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5ICogMTAwMCkpO1xuICAgIGlmIChpc1VuY2VydGFpblBvc3QgJiYgZmluZENyZWF0ZWQpIHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBmaW5kQ3JlYXRlZCgpO1xuICAgICAgaWYgKGNyZWF0ZWQpIHJldHVybiBSZXNwb25zZS5qc29uKGNyZWF0ZWQpO1xuICAgICAgaWYgKCFyZXNwb25zZSkgdGhyb3cgY29ubmVjdGlvbkVycm9yO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxufVxuXG4vKiogUmV0dXJucyB3aGV0aGVyIHRoZSByZXNwb25zZSByZXBvcnRzIHRoYXQgdGhlIHRhcmdldCBkb2VzIG5vdCBleGlzdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzQWJzZW50KHJlc3BvbnNlOiBSZXNwb25zZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHJldHVybiB0cnVlO1xuICAvLyBHaXRIdWIgcmVwb3J0cyBhIG1pc3NpbmcgR2l0IHJlZmVyZW5jZSB3aXRoIGEgNDIyIHJlc3BvbnNlLCB3aGljaCBhbHNvIHJlcG9ydHMgb3RoZXIgdmFsaWRhdGlvbiBmYWlsdXJlcy5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpO1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSA0MjIgJiYgdGV4dC5pbmNsdWRlcygnXCJSZWZlcmVuY2UgZG9lcyBub3QgZXhpc3RcIicpO1xufVxuXG4vKiogUmV0dXJucyB0aGUgc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXBlYXRpbmcgYSByYXRlLWxpbWl0ZWQgcmVxdWVzdCwgb3IgYHVuZGVmaW5lZGAgZm9yIGFub3RoZXIgcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSYXRlTGltaXREZWxheShyZXNwb25zZTogUmVzcG9uc2UpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBpc1JhdGVMaW1pdGVkID1cbiAgICByZXNwb25zZS5zdGF0dXMgPT09IDQyOSB8fCAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMgJiYgL3JhdGUgbGltaXQvaS50ZXN0KGF3YWl0IHJlc3BvbnNlLmNsb25lKCkudGV4dCgpKSk7XG4gIGlmICghaXNSYXRlTGltaXRlZCkgcmV0dXJuO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpIC8gMTAwMDtcbiAgLy8gRWl0aGVyIHNlY29uZHMgb3IgYW4gSFRUUCBkYXRlLlxuICBjb25zdCByZXRyeUFmdGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJykgPz8gJyc7XG4gIGNvbnN0IHJlc2V0ID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZycpID09PSAnMCcgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlc2V0Jyk7XG4gIGNvbnN0IGRlbGF5cyA9IFtcbiAgICAvXlxcZCskLy50ZXN0KHJldHJ5QWZ0ZXIpID8gTnVtYmVyKHJldHJ5QWZ0ZXIpIDogRGF0ZS5wYXJzZShyZXRyeUFmdGVyKSAvIDEwMDAgLSBub3csXG4gICAgcmVzZXQgPyBOdW1iZXIocmVzZXQpIC0gbm93IDogTnVtYmVyLk5hTixcbiAgXTtcbiAgY29uc3Qgc3RhdGVkRGVsYXlzID0gZGVsYXlzLmZpbHRlcigoZGVsYXkpID0+IE51bWJlci5pc0Zpbml0ZShkZWxheSkpO1xuICByZXR1cm4gc3RhdGVkRGVsYXlzLmxlbmd0aCA+IDAgPyBNYXRoLm1heCguLi5zdGF0ZWREZWxheXMpIDogZGVmYXVsdFJhdGVMaW1pdERlbGF5O1xufVxuIiwiLy8gVGhlIGRyYWZ0LWZpcnN0IHJlbGVhc2U6IGV2ZXJ5IHJlZ2lzdHJ5IHJlY2VpdmVzIHRoZSB2ZXJzaW9uIGJlZm9yZSB0aGUgdmVyc2lvbiB0YWcgZXhpc3RzLiBzZW1hbnRpYy1yZWxlYXNlIHB1c2hlc1xuLy8gdGhlIHRhZyBiZXR3ZWVuIGBwcmVwYXJlYCBhbmQgYHB1Ymxpc2hgLCBzbyBhIGZhaWx1cmUgaW4gYHB1Ymxpc2hgIHdvdWxkIGxlYXZlIHRoZSB0YWcgYmVoaW5kLCBhbmQgYSByZS1ydW4gd291bGRcbi8vIGZpbmQgbm8gbmV3IGNvbW1pdHMgYW5kIG5ldmVyIGNvbXBsZXRlIHRoZSByZWxlYXNlLiBIZXJlIHRoZSB0YWcgaXMgY3JlYXRlZCBsYXN0LCBieSBwdWJsaXNoaW5nIGEgZHJhZnQgR2l0SHViXG4vLyBSZWxlYXNlIHRoYXQgcmVjb3JkcyB0aGUgdmVyc2lvbiwgdGhlIGNvbW1pdCwgYW5kIHRoZSBub3RlcyBiZWZvcmUgYW55IHJlZ2lzdHJ5IHJlY2VpdmVzIHRoZSB2ZXJzaW9uLiBBIHJlLXJ1biBvZiBhXG4vLyBmYWlsZWQgcmVsZWFzZSBjb21wdXRlcyB0aGUgc2FtZSB2ZXJzaW9uIGFuZCBza2lwcyBlYWNoIHJlZ2lzdHJ5IHRoYXQgYWxyZWFkeSBob2xkcyBpdCBmcm9tIHRoZSBzYW1lIGNvbW1pdDtcbi8vIGB3YiByZWxlYXNlYCBjb21wbGV0ZXMgYSByZWxlYXNlIGxlZnQgcGVuZGluZyB3aGVuIGEgbmV3ZXIgY29tbWl0IHJlYWNoZXMgdGhlIGJyYW5jaCAoc2VlIHBlbmRpbmdSZWxlYXNlLnRzKS5cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7IGNyZWF0ZUdpdEh1YkNsaWVudCwgZmV0Y2hXaXRoUmV0cnksIHVzZXJBZ2VudCB9IGZyb20gJy4vaHR0cC5qcyc7XG5pbXBvcnQgdHlwZSB7IEdpdEh1YkNsaWVudCB9IGZyb20gJy4vaHR0cC5qcyc7XG5cbmV4cG9ydCBjb25zdCByZWxlYXNlUGx1Z2luTmFtZSA9ICdAd2lsbGJvb3N0ZXIvd2IvcmVsZWFzZS1wbHVnaW4nO1xuLy8gV3JpdGVzIHRoZSByZWxlYXNlIHZlcnNpb24gZ2l2ZW4gYXMgaXRzIGFyZ3VtZW50IGFuZCBidWlsZHMgZXZlcnkgYXJ0aWZhY3QgdGhlIHJlbGVhc2UgcHVibGlzaGVzLlxuZXhwb3J0IGNvbnN0IGJ1aWxkU2NyaXB0UGF0aCA9IHBhdGguam9pbignc2NyaXB0JywgJ2J1aWxkLXJlbGVhc2UnKTtcbi8vIE1hcmtzIHRoZSBkcmFmdHMgdGhpcyByZWxlYXNlIGZsb3cgY3JlYXRlcywgc28gdGhhdCBpdCBuZXZlciBjb21wbGV0ZXMgb3IgZGVsZXRlcyBhIGRyYWZ0IHNvbWVvbmUgZWxzZSBwcmVwYXJlZC5cbmNvbnN0IHBlbmRpbmdNYXJrZXIgPSAnXFxuXFxuPCEtLSBwZW5kaW5nIHJlbGVhc2UgLS0+JztcblxuZXhwb3J0IGNvbnN0IHJlbGVhc2VQbHVnaW5Db25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIE9taXR0ZWQgZm9yIGEgcmVwb3NpdG9yeSB0aGF0IHB1Ymxpc2hlcyBvbmx5IHRoZSBucG0gcGFja2FnZS5cbiAgY3JhdGU6IHouc3RyaW5nKCkubWluKDEpLm9wdGlvbmFsKCksXG4gIHBrZ1Jvb3Q6IHouc3RyaW5nKCkubWluKDEpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxlYXNlUGx1Z2luQ29uZmlnID0gei5pbmZlcjx0eXBlb2YgcmVsZWFzZVBsdWdpbkNvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IHJlbGVhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6Lm51bWJlcigpLFxuICB0YWdfbmFtZTogei5zdHJpbmcoKSxcbiAgdGFyZ2V0X2NvbW1pdGlzaDogei5zdHJpbmcoKSxcbiAgZHJhZnQ6IHouYm9vbGVhbigpLFxuICBib2R5OiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGh0bWxfdXJsOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBSZWxlYXNlID0gei5pbmZlcjx0eXBlb2YgcmVsZWFzZVNjaGVtYT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcbiAgbG9nOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG50eXBlIEVudiA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8qKiBIb2xkcyB0aGUgcnVubmluZyBjaGlsZCBwcm9jZXNzIHNvIHRoYXQgYHdiIHJlbGVhc2VgJ3Mgc2lnbmFsIGhhbmRsZXIgY2FuIHRlcm1pbmF0ZSBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRUcmFja2VyIHtcbiAgY3VycmVudDogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogQSBsYXRlciBydW4gcmVhZHMgdGhlIHZlcnNpb24gYmFjayBmcm9tIHRoZSB0YWcgb2YgYSBwZW5kaW5nIGRyYWZ0IGJ5IHJlbW92aW5nIHRoZSBgdmAuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RGVmYXVsdFRhZ0Zvcm1hdCh0YWdGb3JtYXQ6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHRhZ0Zvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHRhZ0Zvcm1hdCAhPT0gJ3Yke3ZlcnNpb259Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtyZWxlYXNlUGx1Z2luTmFtZX0gcmVxdWlyZXMgc2VtYW50aWMtcmVsZWFzZSdzIGRlZmF1bHQgdGFnRm9ybWF0IFxcYHZcXCR7dmVyc2lvbn1cXGAuYCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU2NyaXB0KGN3ZDogc3RyaW5nLCBlbnY6IEVudiwgdmVyc2lvbjogc3RyaW5nLCB0cmFja2VyPzogQ2hpbGRUcmFja2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHJ1bihwYXRoLmpvaW4oY3dkLCBidWlsZFNjcmlwdFBhdGgpLCBbdmVyc2lvbl0sIGN3ZCwgZW52LCB0cmFja2VyKTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGRyYWZ0IHJlbGVhc2Ugb2YgYGdpdFRhZ2AgdGhhdCB0aGlzIHJlbGVhc2UgZmxvdyBjcmVhdGVkLCBjcmVhdGluZyBpdCBpZiBhYnNlbnQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZE9yQ3JlYXRlRHJhZnRSZWxlYXNlKFxuICBnaXRodWI6IEdpdEh1YkNsaWVudCxcbiAgeyBnaXRIZWFkLCBnaXRUYWcsIG5hbWUsIG5vdGVzIH06IHsgZ2l0SGVhZDogc3RyaW5nOyBnaXRUYWc6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBub3Rlcz86IHN0cmluZyB9XG4pOiBQcm9taXNlPFJlbGVhc2U+IHtcbiAgY29uc3QgZHJhZnQgPVxuICAgIChhd2FpdCBmaW5kRHJhZnRSZWxlYXNlKGdpdGh1YiwgZ2l0VGFnKSkgPz9cbiAgICByZWxlYXNlU2NoZW1hLnBhcnNlKFxuICAgICAgYXdhaXQgZ2l0aHViKFxuICAgICAgICAnUE9TVCcsXG4gICAgICAgICdyZWxlYXNlcycsXG4gICAgICAgIHsgdGFnX25hbWU6IGdpdFRhZywgdGFyZ2V0X2NvbW1pdGlzaDogZ2l0SGVhZCwgbmFtZSwgYm9keTogYCR7bm90ZXMgPz8gJyd9JHtwZW5kaW5nTWFya2VyfWAsIGRyYWZ0OiB0cnVlIH0sXG4gICAgICAgIHsgZmluZENyZWF0ZWQ6ICgpID0+IGZpbmREcmFmdFJlbGVhc2UoZ2l0aHViLCBnaXRUYWcpIH1cbiAgICAgIClcbiAgICApO1xuICBpZiAoZHJhZnQudGFyZ2V0X2NvbW1pdGlzaCAhPT0gZ2l0SGVhZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRyYWZ0IHJlbGVhc2UgJHtnaXRUYWd9IHRhcmdldHMgJHtkcmFmdC50YXJnZXRfY29tbWl0aXNofSwgbm90ICR7Z2l0SGVhZH0uYCk7XG4gIH1cbiAgcmV0dXJuIGRyYWZ0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZERyYWZ0UmVsZWFzZShnaXRodWI6IEdpdEh1YkNsaWVudCwgZ2l0VGFnOiBzdHJpbmcpOiBQcm9taXNlPFJlbGVhc2UgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZHJhZnRzID0gYXdhaXQgbGlzdFBlbmRpbmdSZWxlYXNlcyhnaXRodWIpO1xuICByZXR1cm4gZHJhZnRzLmZpbmQoKHJlbGVhc2UpID0+IHJlbGVhc2UudGFnX25hbWUgPT09IGdpdFRhZyk7XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBkcmFmdCByZWxlYXNlcyB0aGF0IHRoaXMgcmVsZWFzZSBmbG93IGNyZWF0ZWQsIHdoaWNoIEdpdEh1YiBsaXN0cyBiZWZvcmUgdGhlIHB1Ymxpc2hlZCByZWxlYXNlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0UGVuZGluZ1JlbGVhc2VzKGdpdGh1YjogR2l0SHViQ2xpZW50KTogUHJvbWlzZTxSZWxlYXNlW10+IHtcbiAgY29uc3QgcmVsZWFzZXMgPSB6LmFycmF5KHJlbGVhc2VTY2hlbWEpLnBhcnNlKGF3YWl0IGdpdGh1YignR0VUJywgJ3JlbGVhc2VzP3Blcl9wYWdlPTEwMCcpKTtcbiAgcmV0dXJuIHJlbGVhc2VzLmZpbHRlcigocmVsZWFzZSkgPT4gcmVsZWFzZS5kcmFmdCAmJiByZWxlYXNlLmJvZHk/LmVuZHNXaXRoKHBlbmRpbmdNYXJrZXIpKTtcbn1cblxuLyoqIFB1Ymxpc2hlcyB0aGUgdmVyc2lvbiB0byBldmVyeSByZWdpc3RyeSB0aGF0IGRvZXMgbm90IGhvbGQgaXQgeWV0LCBhbmQgdGhlbiBwdWJsaXNoZXMgdGhlIGRyYWZ0IHJlbGVhc2UuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaFJlbGVhc2Uoe1xuICBjb25maWc6IHsgY3JhdGUsIHBrZ1Jvb3QgfSxcbiAgY3dkLFxuICBlbnYsXG4gIGxvZ2dlcixcbiAgZHJhZnQsXG4gIHZlcnNpb24sXG4gIHRyYWNrZXIsXG59OiB7XG4gIGNvbmZpZzogUmVsZWFzZVBsdWdpbkNvbmZpZztcbiAgY3dkOiBzdHJpbmc7XG4gIGVudjogRW52O1xuICBsb2dnZXI6IExvZ2dlcjtcbiAgZHJhZnQ6IFJlbGVhc2U7XG4gIHZlcnNpb246IHN0cmluZztcbiAgdHJhY2tlcj86IENoaWxkVHJhY2tlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZ2l0SGVhZCA9IGRyYWZ0LnRhcmdldF9jb21taXRpc2g7XG4gIGNvbnN0IHBrZ0RpciA9IHBhdGgucmVzb2x2ZShjd2QsIHBrZ1Jvb3QpO1xuICBjb25zdCBwdWJsaXNoZWRDb21taXRzID0gYXdhaXQgZmV0Y2hQdWJsaXNoZWRDb21taXRzKHsgY3JhdGUsIGN3ZCwgcGtnUm9vdCwgdmVyc2lvbiB9KTtcbiAgY29uc3QgdGFyZ2V0cyA9IHB1Ymxpc2hlZENvbW1pdHMubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgLi4udGFyZ2V0LFxuICAgIC4uLih0YXJnZXQucmVnaXN0cnkgPT09ICdjcmF0ZXMuaW8nICYmIGNyYXRlXG4gICAgICA/IHtcbiAgICAgICAgICBkcnlSdW46ICgpID0+IHJ1bignY2FyZ28nLCBbJ3B1Ymxpc2gnLCAnLS1kcnktcnVuJywgJy0tYWxsb3ctZGlydHknLCAnLXAnLCBjcmF0ZV0sIGN3ZCwgZW52LCB0cmFja2VyKSxcbiAgICAgICAgICBwdWJsaXNoOiAoKSA9PiBwdWJsaXNoQ3JhdGUoY3JhdGUsIGN3ZCwgZW52LCB0cmFja2VyKSxcbiAgICAgICAgfVxuICAgICAgOiB7XG4gICAgICAgICAgZHJ5UnVuOiAoKSA9PiBydW4oJ25wbScsIFsncHVibGlzaCcsICctLWRyeS1ydW4nXSwgcGtnRGlyLCBlbnYsIHRyYWNrZXIpLFxuICAgICAgICAgIHB1Ymxpc2g6ICgpID0+IHJ1bignbnBtJywgWydwdWJsaXNoJ10sIHBrZ0RpciwgZW52LCB0cmFja2VyKSxcbiAgICAgICAgfSksXG4gIH0pKTtcbiAgZm9yIChjb25zdCB7IGNvbW1pdCwgbmFtZSB9IG9mIHRhcmdldHMpIHtcbiAgICBpZiAoY29tbWl0ICE9PSB1bmRlZmluZWQgJiYgY29tbWl0ICE9PSBnaXRIZWFkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gd2FzIHB1Ymxpc2hlZCBmcm9tICR7Y29tbWl0IHx8ICdhbiB1bmtub3duIGNvbW1pdCd9LCBub3QgZnJvbSAke2dpdEhlYWR9LmApO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVucHVibGlzaGVkID0gdGFyZ2V0cy5maWx0ZXIoKHsgY29tbWl0IH0pID0+IGNvbW1pdCA9PT0gdW5kZWZpbmVkKTtcbiAgLy8gRHJ5IHJ1bnMgY2F0Y2ggcGFja2FnaW5nIGVycm9ycyBiZWZvcmUgYW55IHJlZ2lzdHJ5IHJlY2VpdmVzIHRoZSB2ZXJzaW9uLlxuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB1bnB1Ymxpc2hlZCkgYXdhaXQgdGFyZ2V0LmRyeVJ1bigpO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgaWYgKHVucHVibGlzaGVkLmluY2x1ZGVzKHRhcmdldCkpIGF3YWl0IHRhcmdldC5wdWJsaXNoKCk7XG4gICAgZWxzZSBsb2dnZXIubG9nKGBTa2lwcGVkICR7dGFyZ2V0Lm5hbWV9LCB3aGljaCBpcyBhbHJlYWR5IHB1Ymxpc2hlZCBmcm9tICR7Z2l0SGVhZH1gKTtcbiAgfVxuXG4gIC8vIFB1Ymxpc2hpbmcgdGhlIGRyYWZ0IGNyZWF0ZXMgdGhlIHRhZywgc28gc2VtYW50aWMtcmVsZWFzZSdzIHRhZyBwdXNoIHRoYXQgZm9sbG93cyBjaGFuZ2VzIG5vdGhpbmcuXG4gIGNvbnN0IHJlbGVhc2UgPSByZWxlYXNlU2NoZW1hLnBhcnNlKFxuICAgIGF3YWl0IGNyZWF0ZUdpdEh1YkNsaWVudChlbnYpKCdQQVRDSCcsIGByZWxlYXNlcy8ke2RyYWZ0LmlkfWAsIHtcbiAgICAgIGRyYWZ0OiBmYWxzZSxcbiAgICAgIGJvZHk6IGRyYWZ0LmJvZHk/LnNsaWNlKDAsIC1wZW5kaW5nTWFya2VyLmxlbmd0aCksXG4gICAgfSlcbiAgKTtcbiAgbG9nZ2VyLmxvZyhgUHVibGlzaGVkIHRoZSBHaXRIdWIgUmVsZWFzZSAke3JlbGVhc2UuaHRtbF91cmx9YCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY29tbWl0IGVhY2ggcmVnaXN0cnkgcHVibGlzaGVkIHRoZSB2ZXJzaW9uIGZyb206IGB1bmRlZmluZWRgIGZvciBhbiB1bnB1Ymxpc2hlZCB2ZXJzaW9uLCBhbmQgYW4gZW1wdHlcbiAqIHN0cmluZyB3aGVuIHRoZSByZWdpc3RyeSByZWNvcmRzIG5vIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoUHVibGlzaGVkQ29tbWl0cyh7XG4gIGNyYXRlLFxuICBjd2QsXG4gIHBrZ1Jvb3QsXG4gIHZlcnNpb24sXG59OiBSZWxlYXNlUGx1Z2luQ29uZmlnICYgeyBjd2Q6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH0pOiBQcm9taXNlPFxuICB7IHJlZ2lzdHJ5OiAnY3JhdGVzLmlvJyB8ICducG0nOyBuYW1lOiBzdHJpbmc7IGNvbW1pdDogc3RyaW5nIHwgdW5kZWZpbmVkIH1bXVxuPiB7XG4gIGNvbnN0IHsgbmFtZTogcGtnTmFtZSB9ID0gelxuICAgIC5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpIH0pXG4gICAgLnBhcnNlKEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShjd2QsIHBrZ1Jvb3QsICdwYWNrYWdlLmpzb24nKSwgJ3V0ZjgnKSkpO1xuICByZXR1cm4gW1xuICAgIC4uLihjcmF0ZVxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVnaXN0cnk6ICdjcmF0ZXMuaW8nIGFzIGNvbnN0LFxuICAgICAgICAgICAgbmFtZTogYCR7Y3JhdGV9QCR7dmVyc2lvbn0gb24gY3JhdGVzLmlvYCxcbiAgICAgICAgICAgIGNvbW1pdDogYXdhaXQgZmV0Y2hQdWJsaXNoZWRDb21taXQoXG4gICAgICAgICAgICAgIGBodHRwczovL2NyYXRlcy5pby9hcGkvdjEvY3JhdGVzLyR7Y3JhdGV9LyR7dmVyc2lvbn1gLFxuICAgICAgICAgICAgICAoYm9keSkgPT5cbiAgICAgICAgICAgICAgICB6Lm9iamVjdCh7IHZlcnNpb246IHoub2JqZWN0KHsgdHJ1c3RwdWJfZGF0YTogei5vYmplY3QoeyBzaGE6IHouc3RyaW5nKCkgfSkubnVsbGlzaCgpIH0pIH0pLnBhcnNlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAudmVyc2lvbi50cnVzdHB1Yl9kYXRhPy5zaGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfSxcbiAgICAgICAgXVxuICAgICAgOiBbXSksXG4gICAge1xuICAgICAgcmVnaXN0cnk6ICducG0nIGFzIGNvbnN0LFxuICAgICAgbmFtZTogYCR7cGtnTmFtZX1AJHt2ZXJzaW9ufSBvbiBucG1gLFxuICAgICAgY29tbWl0OiBhd2FpdCBmZXRjaFB1Ymxpc2hlZENvbW1pdChcbiAgICAgICAgYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnLyR7cGtnTmFtZS5yZXBsYWNlKCcvJywgJyUyZicpfS8ke3ZlcnNpb259YCxcbiAgICAgICAgKGJvZHkpID0+IHoub2JqZWN0KHsgZ2l0SGVhZDogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pLnBhcnNlKGJvZHkpLmdpdEhlYWRcbiAgICAgICksXG4gICAgfSxcbiAgXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hQdWJsaXNoZWRDb21taXQoXG4gIHVybDogc3RyaW5nLFxuICBnZXRDb21taXQ6IChib2R5OiB1bmtub3duKSA9PiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCB7IGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiB1c2VyQWdlbnQgfSB9KTtcbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSByZXR1cm47XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgR0VUICR7dXJsfSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke2F3YWl0IHJlc3BvbnNlLnRleHQoKX1gKTtcbiAgcmV0dXJuIGdldENvbW1pdChhd2FpdCByZXNwb25zZS5qc29uKCkpID8/ICcnO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyB0aGUgY3JhdGUgd2l0aCBjcmF0ZXMuaW8ncyB0cnVzdGVkIHB1Ymxpc2hpbmcsIGV4Y2hhbmdpbmcgdGhlIEdpdEh1YiBBY3Rpb25zIE9JREMgdG9rZW4gZm9yIGEgc2hvcnQtbGl2ZWRcbiAqIGNyYXRlcy5pbyB0b2tlbi4gY3JhdGVzLmlvIG1hdGNoZXMgdGhlIGNhbGxlcidzIGByZWxlYXNlLnltbGAgd29ya2Zsb3csIG5vdCB0aGUgcmV1c2FibGUgd29ya2Zsb3cgaXQgY2FsbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hDcmF0ZShjcmF0ZTogc3RyaW5nLCBjd2Q6IHN0cmluZywgZW52OiBFbnYsIHRyYWNrZXI/OiBDaGlsZFRyYWNrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyB2YWx1ZTogand0IH0gPSB6Lm9iamVjdCh7IHZhbHVlOiB6LnN0cmluZygpIH0pLnBhcnNlKFxuICAgIGF3YWl0IGZldGNoSnNvbihgJHtlbnYuQUNUSU9OU19JRF9UT0tFTl9SRVFVRVNUX1VSTH0mYXVkaWVuY2U9Y3JhdGVzLmlvYCwge1xuICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7ZW52LkFDVElPTlNfSURfVE9LRU5fUkVRVUVTVF9UT0tFTn1gIH0sXG4gICAgfSlcbiAgKTtcbiAgY29uc3QgdG9rZW5zVXJsID0gJ2h0dHBzOi8vY3JhdGVzLmlvL2FwaS92MS90cnVzdGVkX3B1Ymxpc2hpbmcvdG9rZW5zJztcbiAgY29uc3QgeyB0b2tlbiB9ID0gei5vYmplY3QoeyB0b2tlbjogei5zdHJpbmcoKSB9KS5wYXJzZShcbiAgICBhd2FpdCBmZXRjaEpzb24oXG4gICAgICB0b2tlbnNVcmwsXG4gICAgICB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdVc2VyLUFnZW50JzogdXNlckFnZW50IH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgand0IH0pLFxuICAgICAgfSxcbiAgICAgIC8vIEFub3RoZXIgdG9rZW4gZm9yIHRoZSBzYW1lIE9JREMgdG9rZW4gaXMgYXMgZ29vZCwgYW5kIGJvdGggZXhwaXJlIG9uIHRoZWlyIG93bi5cbiAgICAgIHRydWVcbiAgICApXG4gICk7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHJlbGVhc2UgdmVyc2lvbnMgdGhhdCBzY3JpcHQvYnVpbGQtcmVsZWFzZSB3cml0ZXMgYXJlIG5vdCBjb21taXR0ZWQuXG4gICAgYXdhaXQgcnVuKFxuICAgICAgJ2NhcmdvJyxcbiAgICAgIFsncHVibGlzaCcsICctcCcsIGNyYXRlLCAnLS1hbGxvdy1kaXJ0eSddLFxuICAgICAgY3dkLFxuICAgICAgeyAuLi5lbnYsIENBUkdPX1JFR0lTVFJZX1RPS0VOOiB0b2tlbiB9LFxuICAgICAgdHJhY2tlclxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gUmV2b2NhdGlvbiBpcyBiZXN0LWVmZm9ydCAodGhlIHRva2VuIGV4cGlyZXMgb24gaXRzIG93bik7IGl0cyBmYWlsdXJlIG11c3Qgbm90IGZhaWwgYW4gYWxyZWFkeS1kb25lIHB1Ymxpc2guXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh0b2tlbnNVcmwsIHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLCAnVXNlci1BZ2VudCc6IHVzZXJBZ2VudCB9LFxuICAgIH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4gZXJyb3IpO1xuICAgIGlmICghKHJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHx8ICFyZXNwb25zZS5vaykgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcmV2b2tlIHRoZSBjcmF0ZXMuaW8gdG9rZW4uJyk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uKHVybDogc3RyaW5nLCBpbml0OiBSZXF1ZXN0SW5pdCwgcmVwZWF0YWJsZSA9IGZhbHNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBpbml0LCB7IHJlcGVhdGFibGUgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihgJHtpbml0Lm1ldGhvZCA/PyAnR0VUJ30gJHt1cmx9IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbi8qKlxuICogUnVucyBhIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkgcmF0aGVyIHRoYW4gd2l0aCBgZXhlY0ZpbGVTeW5jYCwgd2hpY2ggd291bGQgYmxvY2sgdGhlIGV2ZW50IGxvb3AsIHNvIHRoYXQgYHdiIHJlbGVhc2VgJ3NcbiAqIHNpZ25hbCBoYW5kbGVyIGNhbiB0ZXJtaW5hdGUgYSBidWlsZCBvciBwdWJsaXNoIHdoZW4gdGhlIHJlbGVhc2UgaXMgY2FuY2VsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW4oY29tbWFuZDogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcsIGVudjogRW52LCB0cmFja2VyPzogQ2hpbGRUcmFja2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNvZGUgPSBhd2FpdCBuZXcgUHJvbWlzZTxudW1iZXIgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihjb21tYW5kLCBhcmdzLCB7IGN3ZCwgZW52LCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgIGlmICh0cmFja2VyKSB0cmFja2VyLmN1cnJlbnQgPSBjaGlsZDtcbiAgICBjaGlsZC5vbignZXJyb3InLCByZWplY3QpLm9uKCdleGl0JywgcmVzb2x2ZSk7XG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIGlmICh0cmFja2VyKSB0cmFja2VyLmN1cnJlbnQgPSB1bmRlZmluZWQ7XG4gIH0pO1xuICBpZiAoY29kZSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKGAke2NvbW1hbmR9ICR7YXJncy5qb2luKCcgJyl9IGV4aXRlZCB3aXRoICR7Y29kZX0uYCk7XG59XG4iXSwibWFwcGluZ3MiOiJtSEFDQSxNQUFhLEVBQVksaUVBR25CLEVBQWMsQ0FBQyxFQUFHLEVBQUcsRUFBRyxFQUFHLEVBQUUsRUFvQm5DLFNBQWdCLEVBQW1CLEVBQXVELENBQ3hGLE9BQU8sTUFBTyxFQUFRLEVBQU8sRUFBTSxJQUFZLENBQzdDLElBQU0sRUFBVyxNQUFNLEVBQ3JCLGdDQUFnQyxFQUFJLGtCQUFrQixHQUFHLElBQ3pELENBQ0UsU0FDQSxRQUFTLENBQUUsT0FBUSw4QkFBK0IsY0FBZSxVQUFVLEVBQUksY0FBZSxFQUM5RixHQUFJLElBQVMsSUFBQSxJQUFhLENBQUUsS0FBTSxLQUFLLFVBQVUsQ0FBSSxDQUFFLENBQ3pELEVB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
|