@salty-css/core 0.0.1-alpha.279 → 0.0.1-alpha.280
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/bin/main.cjs +1 -1
- package/bin/main.js +2 -2
- package/cache/resolve-dynamic-config-cache.cjs +1 -0
- package/cache/resolve-dynamic-config-cache.d.ts +1 -0
- package/cache/resolve-dynamic-config-cache.js +10 -0
- package/compiler/index.cjs +1 -1
- package/compiler/index.js +1 -1
- package/index-BgHtTuZf.cjs +41 -0
- package/index-CXjwv_Dc.js +519 -0
- package/package.json +4 -4
- package/parsers/parse-styles.d.ts +1 -1
- package/server/index.cjs +1 -1
- package/server/index.js +1 -1
- package/{should-restart-CfoDl2WZ.js → should-restart-BELKpXEw.js} +1 -1
- package/{should-restart-CapzIWDV.cjs → should-restart-CBwAaej8.cjs} +1 -1
- package/types/config-types.d.ts +1 -0
- package/cache/get-config-cache.cjs +0 -1
- package/cache/get-config-cache.d.ts +0 -3
- package/cache/get-config-cache.js +0 -6
- package/index-B5Z3hZJn.cjs +0 -41
- package/index-CI0AEQ1k.js +0 -517
package/bin/main.cjs
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const te=require("commander"),A=require("fs"),s=require("fs/promises"),n=require("path"),ne=require("ejs"),e=require("../index-
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const te=require("commander"),A=require("fs"),s=require("fs/promises"),n=require("path"),ne=require("ejs"),e=require("../index-BgHtTuZf.cjs"),ie=require("../pascal-case-iWoaJWwT.cjs"),se=require("child_process"),oe=require("ora"),ae=require("../should-restart-CBwAaej8.cjs");var G=typeof document<"u"?document.currentScript:null;const X=y=>new Promise((C,P)=>{se.exec(y,x=>{if(x)return P(x);C()})}),I=async(...y)=>{const C=y.map(b=>b.replace("-D","").split("@").slice(0,-1).join("@").trim()).join(", "),P=oe(`Installing packages: ${C}`).start(),x=y.join(" ");await X(`npm install ${x}`),P.succeed(`Installed packages: ${C}`)},re=()=>A.existsSync(n.join(process.cwd(),"node_modules",".bin","prettier"));async function S(y){try{if(!re())return;await X(`./node_modules/.bin/prettier --write "${y}"`),e.logger.info(`Formatted ${y} with Prettier`)}catch(C){e.logger.error(`Error formatting ${y} with Prettier:`,C)}}async function ce(){const y=new te.Command;y.name("salty-css").description("Salty-CSS CLI tool to help with annoying configuration tasks.");const C={"salty.config.ts":Promise.resolve().then(()=>require("../salty.config-Dk6ZcCxI.cjs")),"saltygen/index.css":Promise.resolve().then(()=>require("../index-84Wroia-.cjs")),"react/react-styled-file.ts":Promise.resolve().then(()=>require("../react-styled-file-Dkubsz-U.cjs")),"react/react-vanilla-file.ts":Promise.resolve().then(()=>require("../react-vanilla-file-CG_WJLam.cjs"))},P=async(i,a)=>{const{default:f}=await C[i],d=ne.render(f,a);return{fileName:i,content:d}},x=async()=>{const i=n.join(process.cwd(),".saltyrc.json");return await s.readFile(i,"utf-8").then(JSON.parse).catch(()=>({}))},b=n.join(process.cwd(),"package.json"),N=async(i=b)=>{const a=await s.readFile(i,"utf-8").then(JSON.parse).catch(()=>{});if(!a)throw"Could not read package.json file!";return a},Y=async(i,a=b)=>{typeof i=="object"&&(i=JSON.stringify(i,null,2)),await s.writeFile(a,i)},B=async()=>{const i=new URL("../package.json",typeof document>"u"?require("url").pathToFileURL(__filename).href:G&&G.tagName.toUpperCase()==="SCRIPT"&&G.src||new URL("bin/main.cjs",document.baseURI).href);return N(i)},V=await(async()=>(await x()).defaultProject)(),$=await B(),D={core:`@salty-css/core@${$.version}`,react:`@salty-css/react@${$.version}`,eslintConfigCore:`@salty-css/eslint-config-core@${$.version}`,vite:`@salty-css/vite@${$.version}`,next:`@salty-css/next@${$.version}`},H=i=>{const a=i==="."?"":i,f=process.cwd();return n.join(f,a)};y.command("init [directory]").description("Initialize a new Salty-CSS project.").option("-d, --dir <dir>","Project directory to initialize the project in.").option("--css-file <css-file>","Existing CSS file where to import the generated CSS. Path must be relative to the given project directory.").option("--skip-install","Skip installing dependencies.").action(async function(i="."){if(!await N().catch(()=>{}))return e.logError("Salty CSS project must be initialized in a directory with a package.json file.");e.logger.info("Initializing a new Salty-CSS project!");const{dir:f=i,cssFile:d,skipInstall:p}=this.opts();if(!f)return e.logError("Project directory must be provided. Add it as the first argument after init command or use the --dir option.");p||await I(D.core,D.react);const c=process.cwd(),r=H(f),q=await Promise.all([P("salty.config.ts"),P("saltygen/index.css")]);await s.mkdir(r,{recursive:!0});const m=q.map(async({fileName:t,content:u})=>{const l=n.join(r,t);if(await s.readFile(l,"utf-8").catch(()=>{})!==void 0){e.logger.debug("File already exists: "+l);return}const k=t.split("/").slice(0,-1).join("/");k&&await s.mkdir(n.join(r,k),{recursive:!0}),e.logger.info("Creating file: "+l),await s.writeFile(l,u),await S(l)});await Promise.all(m);const w=n.relative(c,r)||".",h=n.join(c,".saltyrc.json"),g=await s.readFile(h,"utf-8").catch(()=>{});if(g===void 0){e.logger.info("Creating file: "+h);const u=JSON.stringify({$schema:"./node_modules/@salty-css/core/.saltyrc.schema.json",info:"This file is used to define projects and their configurations for Salty CSS cli. Do not delete, modify or add this file to .gitignore.",defaultProject:w,projects:[{dir:w,framework:"react"}]},null,2);await s.writeFile(h,u),await S(h)}else{const t=JSON.parse(g),u=(t==null?void 0:t.projects)||[];if(u.findIndex(o=>o.dir===w)===-1){u.push({dir:w,framework:"react"}),t.projects=[...u];const o=JSON.stringify(t,null,2);o!==g&&(e.logger.info("Edit file: "+h),await s.writeFile(h,o),await S(h))}}const j=n.join(c,".gitignore"),T=await s.readFile(j,"utf-8").catch(()=>{});T!==void 0&&(T.includes("saltygen")||(e.logger.info("Edit file: "+j),await s.writeFile(j,T+`
|
2
2
|
|
3
3
|
# Salty-CSS
|
4
4
|
saltygen
|
package/bin/main.js
CHANGED
@@ -3,11 +3,11 @@ import { existsSync as Q, watch as re } from "fs";
|
|
3
3
|
import { mkdir as q, readFile as S, writeFile as C } from "fs/promises";
|
4
4
|
import { join as a, relative as z, parse as ce, format as te } from "path";
|
5
5
|
import { render as le } from "ejs";
|
6
|
-
import { l as t, a as h, g as K, i as de, b as fe } from "../index-
|
6
|
+
import { l as t, a as h, g as K, i as de, b as fe } from "../index-CXjwv_Dc.js";
|
7
7
|
import { p as pe } from "../pascal-case-BQpR5PdN.js";
|
8
8
|
import { exec as ue } from "child_process";
|
9
9
|
import ge from "ora";
|
10
|
-
import { c as ye } from "../should-restart-
|
10
|
+
import { c as ye } from "../should-restart-BELKpXEw.js";
|
11
11
|
const ne = (g) => new Promise((P, x) => {
|
12
12
|
ue(g, ($) => {
|
13
13
|
if ($) return x($);
|
@@ -0,0 +1 @@
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("fs/promises"),t=require("path");var e=typeof document<"u"?document.currentScript:null;const r=new URL(".",typeof document>"u"?require("url").pathToFileURL(__filename).href:e&&e.tagName.toUpperCase()==="SCRIPT"&&e.src||new URL("cache/resolve-dynamic-config-cache.cjs",document.baseURI).href).pathname,i=async()=>{const c=t.join(r,"config-cache.json"),n=await o.readFile(c,"utf8");if(!n)throw new Error("Could not find config cache file");return JSON.parse(n)};exports.resolveDynamicConfigCache=i;
|
@@ -0,0 +1 @@
|
|
1
|
+
export declare const resolveDynamicConfigCache: () => Promise<any>;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { readFile as e } from "fs/promises";
|
2
|
+
import { join as r } from "path";
|
3
|
+
const t = new URL(".", import.meta.url).pathname, a = async () => {
|
4
|
+
const n = r(t, "config-cache.json"), o = await e(n, "utf8");
|
5
|
+
if (!o) throw new Error("Could not find config cache file");
|
6
|
+
return JSON.parse(o);
|
7
|
+
};
|
8
|
+
export {
|
9
|
+
a as resolveDynamicConfigCache
|
10
|
+
};
|
package/compiler/index.cjs
CHANGED
@@ -1 +1 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("esbuild");require("child_process");require("../dash-case-BJEkFEGQ.cjs");require("path");require("fs");require("fs/promises");require("../parse-styles-Bdgw_4ME.cjs");require("../parsers/index.cjs");const e=require("../index-
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("esbuild");require("child_process");require("../dash-case-BJEkFEGQ.cjs");require("path");require("fs");require("fs/promises");require("../parse-styles-Bdgw_4ME.cjs");require("../parsers/index.cjs");const e=require("../index-BgHtTuZf.cjs");require("../css/merge.cjs");require("../define-templates-Cunsb_Tr.cjs");exports.compileSaltyFile=e.compileSaltyFile;exports.generateConfigStyles=e.generateConfigStyles;exports.generateCss=e.generateCss;exports.generateFile=e.generateFile;exports.isSaltyFile=e.isSaltyFile;exports.minimizeFile=e.minimizeFile;exports.saltyFileExtensions=e.saltyFileExtensions;exports.saltyFileRegExp=e.saltyFileRegExp;
|
package/compiler/index.js
CHANGED
@@ -6,7 +6,7 @@ import "fs";
|
|
6
6
|
import "fs/promises";
|
7
7
|
import "../parse-styles-C1E6ETeH.js";
|
8
8
|
import "../parsers/index.js";
|
9
|
-
import { e as F, d as y, g as x, b as S, i as c, m as f, s as C, c as E } from "../index-
|
9
|
+
import { e as F, d as y, g as x, b as S, i as c, m as f, s as C, c as E } from "../index-CXjwv_Dc.js";
|
10
10
|
import "../css/merge.js";
|
11
11
|
import "../define-templates-4A2yHcMF.js";
|
12
12
|
export {
|
@@ -0,0 +1,41 @@
|
|
1
|
+
"use strict";const Jg=require("esbuild"),Hg=require("child_process"),J=require("./dash-case-BJEkFEGQ.cjs"),s=require("path"),n=require("fs"),yg=require("fs/promises"),ng=require("./parse-styles-Bdgw_4ME.cjs"),Ag=require("./parsers/index.cjs"),P=require("winston"),j=require("./css/merge.cjs"),Kg=require("./define-templates-Cunsb_Tr.cjs"),eg=require("typescript");var U=typeof document<"u"?document.currentScript:null;function zg(g){const c=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(g){for(const l in g)if(l!=="default"){const I=Object.getOwnPropertyDescriptor(g,l);Object.defineProperty(c,l,I.get?I:{enumerable:!0,get:()=>g[l]})}}return c.default=g,Object.freeze(c)}const Yg=zg(Jg),pg=g=>{if(!g||g==="/")throw new Error("Could not find package.json file");const c=s.join(g,"package.json");return n.existsSync(c)?c:pg(s.join(g,".."))},wg=async g=>{const c=pg(g);return await yg.readFile(c,"utf-8").then(JSON.parse).catch(()=>{})},Sg=async g=>{const c=await wg(g);if(c)return c.type};let f;const Xg=async g=>{if(f)return f;const c=await Sg(g);return c==="module"?f="esm":(c==="commonjs"||(typeof document>"u"?require("url").pathToFileURL(__filename).href:U&&U.tagName.toUpperCase()==="SCRIPT"&&U.src||new URL("index-BgHtTuZf.cjs",document.baseURI).href).endsWith(".cjs"))&&(f="cjs"),f||"esm"},E=P.createLogger({level:"debug",format:P.format.combine(P.format.colorize(),P.format.cli()),transports:[new P.transports.Console({})]}),vg=g=>{E.error(g)};function Vg(g){return g?typeof g!="string"?Vg(String(g)):g.replace(/[^\d\w]/g,"."):""}const jg={"*, *::before, *::after":{boxSizing:"border-box"},"*":{margin:0},html:{lineHeight:1.15,textSizeAdjust:"100%",WebkitFontSmoothing:"antialiased"},"img, picture, video, canvas, svg":{display:"block",maxWidth:"100%"},"p, h1, h2, h3, h4, h5, h6":{overflowWrap:"break-word"},p:{textWrap:"pretty"},"h1, h2, h3, h4, h5, h6":{textWrap:"balance"},a:{color:"currentColor"},button:{lineHeight:"1em",color:"currentColor"},"input, optgroup, select, textarea":{fontFamily:"inherit",fontSize:"100%",lineHeight:"1.15em"}},kg=(g,c)=>new Promise((l,I)=>{const e=setTimeout(()=>{I(new Error("Timeout"))},100),Z=eg.createSourceFile("temp.ts",g,eg.ScriptTarget.Latest,!0);function C(G){if(eg.isVariableDeclaration(G)&&G.name.getText()===c){const y=G.getStart(),m=G.getEnd();clearTimeout(e),l([y,m])}G.forEachChild(C)}C(Z)}),xg=new URL("data:video/mp2t;base64,LyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWNvbnN0ICovCi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi8KaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkJzsKaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJzsKaW1wb3J0IHsgdG9IYXNoIH0gZnJvbSAnLi4vdXRpbC90by1oYXNoJzsKaW1wb3J0IHsgam9pbiwgcGFyc2UgYXMgcGFyc2VQYXRoIH0gZnJvbSAncGF0aCc7CmltcG9ydCB7IHN0YXRTeW5jLCBleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRkaXJTeW5jLCB3cml0ZUZpbGVTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7CmltcG9ydCB7IGRhc2hDYXNlIH0gZnJvbSAnLi4vdXRpbC9kYXNoLWNhc2UnOwppbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ2ZzL3Byb21pc2VzJzsKaW1wb3J0IHsgcGFyc2VBbmRKb2luU3R5bGVzIH0gZnJvbSAnLi4vcGFyc2Vycy9wYXJzZS1zdHlsZXMnOwppbXBvcnQgeyBnZXRUZW1wbGF0ZVR5cGVzLCBwYXJzZVRlbXBsYXRlcyB9IGZyb20gJy4uL3BhcnNlcnMvcGFyc2UtdGVtcGxhdGVzJzsKaW1wb3J0IHsgQ2FjaGVkQ29uZmlnLCBDc3NDb25kaXRpb25hbFZhcmlhYmxlcywgQ3NzUmVzcG9uc2l2ZVZhcmlhYmxlcywgQ3NzVGVtcGxhdGVzLCBTYWx0eUNvbmZpZywgU2FsdHlWYXJpYWJsZXMgfSBmcm9tICcuLi9jb25maWcnOwppbXBvcnQgeyBwYXJzZVZhcmlhYmxlVG9rZW5zIH0gZnJvbSAnLi4vcGFyc2Vycy9wYXJzZS10b2tlbnMnOwppbXBvcnQgeyBkZXRlY3RDdXJyZW50TW9kdWxlVHlwZSB9IGZyb20gJy4uL3V0aWwvbW9kdWxlLXR5cGUnOwppbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9iaW4vbG9nZ2VyJzsKaW1wb3J0IHsgZG90Q2FzZSB9IGZyb20gJy4uL3V0aWwvZG90LWNhc2UnOwppbXBvcnQgeyBzYWx0eVJlc2V0IH0gZnJvbSAnLi4vdGVtcGxhdGVzL3NhbHR5LXJlc2V0JzsKaW1wb3J0IHsgUkNGaWxlIH0gZnJvbSAnLi4vdHlwZXMvY2xpLXR5cGVzJzsKaW1wb3J0IHsgbWVyZ2VGYWN0b3JpZXMsIG1lcmdlT2JqZWN0cyB9IGZyb20gJy4uL2Nzcyc7CmltcG9ydCB7IGRlZmluZVRlbXBsYXRlcywgR2xvYmFsU3R5bGVzRmFjdG9yeSwgVGVtcGxhdGVzRmFjdG9yeSwgVmFyaWFibGVzRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7CmltcG9ydCB7IFN0eWxlZEdlbmVyYXRvciwgQ2xhc3NOYW1lR2VuZXJhdG9yIH0gZnJvbSAnLi4vZ2VuZXJhdG9ycyc7CmltcG9ydCB7IFN0eWxlc0dlbmVyYXRvciB9IGZyb20gJy4uL2dlbmVyYXRvcnMvc3R5bGVzLWdlbmVyYXRvcic7CmltcG9ydCB7IGdldEZ1bmN0aW9uUmFuZ2UgfSBmcm9tICcuL2dldC1mdW5jdGlvbi1yYW5nZSc7CgppbnRlcmZhY2UgR2VuZXJhdG9yUmVzdWx0PFYgZXh0ZW5kcyBTdHlsZXNHZW5lcmF0b3I+IHsKICBnZW5lcmF0b3I6IFY7CiAgc3JjOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwp9CgppbnRlcmZhY2UgRnVuY3Rpb25SZXN1bHQ8ViBleHRlbmRzIG9iamVjdD4gewogIHZhbHVlOiBWOwogIHNyYzogc3RyaW5nOwogIG5hbWU6IHN0cmluZzsKfQoKaW50ZXJmYWNlIENvbmZpZ0dlbmVyYXRpb25SZXN1bHRzIHsKICBtZWRpYVF1ZXJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXTsKICBnbG9iYWxTdHlsZXM6IEdsb2JhbFN0eWxlc0ZhY3RvcnlbXTsKICB2YXJpYWJsZXM6IFZhcmlhYmxlc0ZhY3RvcnlbXTsKICB0ZW1wbGF0ZXM6IFRlbXBsYXRlc0ZhY3RvcnlbXTsKfQoKaW50ZXJmYWNlIFN0eWxlc0dlbmVyYXRpb25SZXN1bHRzIHsKICBjb21wb25lbnRzOiBHZW5lcmF0b3JSZXN1bHQ8U3R5bGVkR2VuZXJhdG9yPltdOwogIGNsYXNzTmFtZXM6IEdlbmVyYXRvclJlc3VsdDxDbGFzc05hbWVHZW5lcmF0b3I+W107CiAga2V5ZnJhbWVzOiBGdW5jdGlvblJlc3VsdDx7IGFuaW1hdGlvbk5hbWU6IHN0cmluZzsgY3NzOiBzdHJpbmcgfT5bXTsKfQoKaW50ZXJmYWNlIENhY2hlIHsKICBleHRlcm5hbE1vZHVsZXM6IHN0cmluZ1tdOwogIHJjRmlsZT86IFJDRmlsZTsKICBkZXN0RGlyPzogc3RyaW5nOwp9Cgpjb25zdCBfZGlybmFtZSA9IG5ldyBVUkwoJy4nLCBpbXBvcnQubWV0YS51cmwpLnBhdGhuYW1lOwoKY29uc3QgY2FjaGU6IENhY2hlID0gewogIGV4dGVybmFsTW9kdWxlczogW10sCiAgcmNGaWxlOiB1bmRlZmluZWQsCiAgZGVzdERpcjogdW5kZWZpbmVkLAp9OwoKY29uc3QgZ2V0RXh0ZXJuYWxNb2R1bGVzID0gKGNvcmVDb25maWdQYXRoOiBzdHJpbmcpID0+IHsKICBpZiAoY2FjaGUuZXh0ZXJuYWxNb2R1bGVzLmxlbmd0aCA+IDApIHJldHVybiBjYWNoZS5leHRlcm5hbE1vZHVsZXM7CiAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhjb3JlQ29uZmlnUGF0aCwgJ3V0ZjgnKTsKICBjb25zdCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goL2V4dGVybmFsTW9kdWxlczpccz9cWyguKilcXS8pOwogIGlmICghbWF0Y2gpIHJldHVybiBbXTsKICBjb25zdCBleHRlcm5hbE1vZHVsZXMgPSBtYXRjaFsxXS5zcGxpdCgnLCcpLm1hcCgoZCkgPT4gZC5yZXBsYWNlKC9bJyJgXS9nLCAnJykudHJpbSgpKTsKICBjYWNoZS5leHRlcm5hbE1vZHVsZXMgPSBleHRlcm5hbE1vZHVsZXM7CiAgcmV0dXJuIGV4dGVybmFsTW9kdWxlczsKfTsKCmNvbnN0IGdldERlc3REaXIgPSBhc3luYyAoZGlybmFtZTogc3RyaW5nKSA9PiB7CiAgaWYgKGNhY2hlLmRlc3REaXIpIHJldHVybiBjYWNoZS5kZXN0RGlyOwogIGNvbnN0IHByb2plY3RDb25maWcgPSBhd2FpdCBnZXRSQ1Byb2plY3RDb25maWcoZGlybmFtZSk7CiAgY29uc3QgZGVzdERpciA9IGpvaW4oZGlybmFtZSwgcHJvamVjdENvbmZpZz8uc2FsdHlnZW5EaXIgfHwgJ3NhbHR5Z2VuJyk7CiAgY2FjaGUuZGVzdERpciA9IGRlc3REaXI7CiAgcmV0dXJuIGRlc3REaXI7Cn07CgpleHBvcnQgY29uc3Qgc2FsdHlGaWxlRXh0ZW5zaW9ucyA9IFsnc2FsdHknLCAnY3NzJywgJ3N0eWxlcycsICdzdHlsZWQnXTsKZXhwb3J0IGNvbnN0IHNhbHR5RmlsZVJlZ0V4cCA9IChhZGRpdGlvbmFsOiBzdHJpbmdbXSA9IFtdKSA9PiBuZXcgUmVnRXhwKGBcXC4oJHtbLi4uc2FsdHlGaWxlRXh0ZW5zaW9ucywgLi4uYWRkaXRpb25hbF0uam9pbignfCcpfSlcXC5gKTsKZXhwb3J0IGNvbnN0IGlzU2FsdHlGaWxlID0gKGZpbGU6IHN0cmluZywgYWRkaXRpb25hbDogc3RyaW5nW10gPSBbXSkgPT4gc2FsdHlGaWxlUmVnRXhwKGFkZGl0aW9uYWwpLnRlc3QoZmlsZSk7Cgpjb25zdCByZWFkUkNGaWxlID0gYXN5bmMgKGN1cnJlbnREaXI6IHN0cmluZykgPT4gewogIGlmIChjYWNoZS5yY0ZpbGUpIHJldHVybiBjYWNoZS5yY0ZpbGU7CiAgaWYgKGN1cnJlbnREaXIgPT09ICcvJykgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCAuc2FsdHlyYy5qc29uIGZpbGUnKTsKICBjb25zdCByY1BhdGggPSBqb2luKGN1cnJlbnREaXIsICcuc2FsdHlyYy5qc29uJyk7CiAgY29uc3QgcmNDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUocmNQYXRoLCAndXRmLTgnKQogICAgLnRoZW4oSlNPTi5wYXJzZSkKICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpOwoKICBpZiAoIXJjQ29udGVudCkgcmV0dXJuIHJlYWRSQ0ZpbGUoam9pbihjdXJyZW50RGlyLCAnLi4nKSk7CiAgY2FjaGUucmNGaWxlID0gcmNDb250ZW50OwogIHJldHVybiByY0NvbnRlbnQgYXMgUkNGaWxlOwp9OwoKY29uc3QgZ2V0UkNQcm9qZWN0Q29uZmlnID0gYXN5bmMgKGRpcm5hbWU6IHN0cmluZykgPT4gewogIGNvbnN0IHJjRmlsZSA9IGF3YWl0IHJlYWRSQ0ZpbGUoZGlybmFtZSk7CiAgY29uc3QgcHJvamVjdENvbmZpZyA9IHJjRmlsZS5wcm9qZWN0cz8uZmluZCgocHJvamVjdCkgPT4gZGlybmFtZS5lbmRzV2l0aChwcm9qZWN0LmRpciB8fCAnJykpOwogIGlmICghcHJvamVjdENvbmZpZykgcmV0dXJuIHJjRmlsZS5wcm9qZWN0cz8uZmluZCgocHJvamVjdCkgPT4gcHJvamVjdC5kaXIgPT09IHJjRmlsZS5kZWZhdWx0UHJvamVjdCk7CiAgcmV0dXJuIHByb2plY3RDb25maWc7Cn07Cgpjb25zdCBnZW5lcmF0ZUNvbmZpZyA9IGFzeW5jIChkaXJuYW1lOiBzdHJpbmcpID0+IHsKICBjb25zdCByY1Byb2plY3QgPSBhd2FpdCBnZXRSQ1Byb2plY3RDb25maWcoZGlybmFtZSk7CiAgY29uc3QgZGVzdERpciA9IGF3YWl0IGdldERlc3REaXIoZGlybmFtZSk7CiAgY29uc3QgY29yZUNvbmZpZ1BhdGggPSBqb2luKGRpcm5hbWUsIHJjUHJvamVjdD8uY29uZmlnRGlyIHx8ICcnLCAnc2FsdHkuY29uZmlnLnRzJyk7CiAgY29uc3QgY29yZUNvbmZpZ0Rlc3QgPSBqb2luKGRlc3REaXIsICdzYWx0eS5jb25maWcuanMnKTsKCiAgY29uc3QgbW9kdWxlVHlwZSA9IGF3YWl0IGRldGVjdEN1cnJlbnRNb2R1bGVUeXBlKGRpcm5hbWUpOwogIGNvbnN0IGV4dGVybmFsTW9kdWxlcyA9IGdldEV4dGVybmFsTW9kdWxlcyhjb3JlQ29uZmlnUGF0aCk7CiAgYXdhaXQgZXNidWlsZC5idWlsZCh7CiAgICBlbnRyeVBvaW50czogW2NvcmVDb25maWdQYXRoXSwKICAgIG1pbmlmeTogdHJ1ZSwKICAgIHRyZWVTaGFraW5nOiB0cnVlLAogICAgYnVuZGxlOiB0cnVlLAogICAgb3V0ZmlsZTogY29yZUNvbmZpZ0Rlc3QsCiAgICBmb3JtYXQ6IG1vZHVsZVR5cGUsCiAgICBleHRlcm5hbDogZXh0ZXJuYWxNb2R1bGVzLAogIH0pOwoKICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogIGNvbnN0IHsgY29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoYCR7Y29yZUNvbmZpZ0Rlc3R9P3Q9JHtub3d9YCk7CiAgcmV0dXJuIHsgY29uZmlnLCBwYXRoOiBjb3JlQ29uZmlnRGVzdCB9Owp9OwoKZXhwb3J0IGNvbnN0IGdlbmVyYXRlQ29uZmlnU3R5bGVzID0gYXN5bmMgKGRpcm5hbWU6IHN0cmluZywgY29uZmlnRmlsZXM6IFNldDxzdHJpbmc+KSA9PiB7CiAgY29uc3QgZGVzdERpciA9IGF3YWl0IGdldERlc3REaXIoZGlybmFtZSk7CgogIGNvbnN0IGdlbmVyYXRpb25SZXN1bHRzOiBDb25maWdHZW5lcmF0aW9uUmVzdWx0cyA9IHsKICAgIG1lZGlhUXVlcmllczogW10sCiAgICBnbG9iYWxTdHlsZXM6IFtdLAogICAgdmFyaWFibGVzOiBbXSwKICAgIHRlbXBsYXRlczogW10sCiAgfTsKCiAgYXdhaXQgUHJvbWlzZS5hbGwoCiAgICBbLi4uY29uZmlnRmlsZXNdLm1hcChhc3luYyAoc3JjKSA9PiB7CiAgICAgIGNvbnN0IHsgY29udGVudHMsIG91dHB1dEZpbGVQYXRoIH0gPSBhd2FpdCBjb21waWxlU2FsdHlGaWxlKGRpcm5hbWUsIHNyYywgZGVzdERpcik7CiAgICAgIE9iamVjdC5lbnRyaWVzKGNvbnRlbnRzKS5mb3JFYWNoKChbbmFtZSwgdmFsdWVdKSA9PiB7CiAgICAgICAgaWYgKHZhbHVlLmlzTWVkaWEpIGdlbmVyYXRpb25SZXN1bHRzLm1lZGlhUXVlcmllcy5wdXNoKFtuYW1lLCB2YWx1ZSBhcyBhbnldKTsKICAgICAgICBlbHNlIGlmICh2YWx1ZS5pc0dsb2JhbERlZmluZSkgZ2VuZXJhdGlvblJlc3VsdHMuZ2xvYmFsU3R5bGVzLnB1c2godmFsdWUgYXMgYW55KTsKICAgICAgICBlbHNlIGlmICh2YWx1ZS5pc0RlZmluZVZhcmlhYmxlcykgZ2VuZXJhdGlvblJlc3VsdHMudmFyaWFibGVzLnB1c2godmFsdWUgYXMgYW55KTsKICAgICAgICBlbHNlIGlmICh2YWx1ZS5pc0RlZmluZVRlbXBsYXRlcykgZ2VuZXJhdGlvblJlc3VsdHMudGVtcGxhdGVzLnB1c2goKHZhbHVlIGFzIGFueSkuX3NldFBhdGgoYCR7bmFtZX07OyR7b3V0cHV0RmlsZVBhdGh9YCkpOwogICAgICB9KTsKICAgIH0pCiAgKTsKCiAgLy8gR2VuZXJhdGUgdGhlIGNvbmZpZyBmaWxlcwogIGNvbnN0IHsgY29uZmlnLCBwYXRoOiBjb25maWdQYXRoIH0gPSBhd2FpdCBnZW5lcmF0ZUNvbmZpZyhkaXJuYW1lKTsKCiAgLy8gQ2FjaGUgdGhlIGNvbmZpZyBjb250ZW50CiAgY29uc3QgY29uZmlnQ2FjaGVDb250ZW50ID0geyAuLi5jb25maWcgfSBhcyBDYWNoZWRDb25maWc7CgogIC8vIEdlbmVyYXRlIG1lZGlhIHF1ZXJ5IGhlbHBlcnMKICBjb25zdCB7IG1lZGlhUXVlcmllcyB9ID0gZ2VuZXJhdGlvblJlc3VsdHM7CiAgY29uZmlnQ2FjaGVDb250ZW50Lm1lZGlhUXVlcmllcyA9IE9iamVjdC5mcm9tRW50cmllcyhtZWRpYVF1ZXJpZXMubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBbYEAke25hbWV9YCwgdmFsdWVdKSk7CiAgY29uc3QgbWVkaWFRdWVyeUtleXMgPSBtZWRpYVF1ZXJpZXMubWFwKChbbmFtZV0pID0+IGAnQCR7bmFtZX0nYCkuam9pbignIHwgJyk7CgogIC8vIEdlbmVyYXRlIHZhcmlhYmxlcyBjc3MgZmlsZQogIGNvbnN0IHZhcmlhYmxlVG9rZW5zID0gbmV3IFNldDxzdHJpbmc+KCk7CgogIHR5cGUgVmFyaWFibGVzID0gc3RyaW5nIHwgdW5kZWZpbmVkOwogIGNvbnN0IHBhcnNlVmFyaWFibGVzID0gYXN5bmMgPFQgZXh0ZW5kcyBvYmplY3Q+KG9iajogVCwgcGF0aDogUHJvcGVydHlLZXlbXSA9IFtdKTogUHJvbWlzZTxWYXJpYWJsZXNbXT4gPT4gewogICAgaWYgKCFvYmopIHJldHVybiBbXTsKICAgIGNvbnN0IHByb21pc2VzID0gT2JqZWN0LmVudHJpZXMob2JqKS5tYXAoYXN5bmMgKFtrZXksIHZhbHVlXSk6IFByb21pc2U8VmFyaWFibGVzIHwgVmFyaWFibGVzW10+ID0+IHsKICAgICAgY29uc3QgcGFyc2VWYXJpYWJsZSA9IGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4gewogICAgICAgIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIGF3YWl0IHBhcnNlVmFyaWFibGUoYXdhaXQgdmFsdWUpOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHJldHVybiBhd2FpdCBwYXJzZVZhcmlhYmxlKGF3YWl0IHZhbHVlKCkpOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSByZXR1cm4gYXdhaXQgcGFyc2VWYXJpYWJsZXModmFsdWUsIFsuLi5wYXRoLCBrZXldKTsKCiAgICAgICAgY29uc3QgZG90dGVkS2V5ID0gZG90Q2FzZShrZXkpOwogICAgICAgIGNvbnN0IGRhc2hlZEtleSA9IGRhc2hDYXNlKGtleSk7CgogICAgICAgIGNvbnN0IHRzTmFtZSA9IFsuLi5wYXRoLCBkb3R0ZWRLZXldLmpvaW4oJy4nKTsKICAgICAgICB2YXJpYWJsZVRva2Vucy5hZGQoYCIke3RzTmFtZX0iYCk7CgogICAgICAgIGNvbnN0IGNzc05hbWUgPSBbLi4ucGF0aC5tYXAoZGFzaENhc2UpLCBkYXNoZWRLZXldLmpvaW4oJy0nKTsKICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZVZhcmlhYmxlVG9rZW5zKHZhbHVlKTsKICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIGAtLSR7Y3NzTmFtZX06ICR7dmFsdWV9O2A7CiAgICAgICAgcmV0dXJuIGAtLSR7Y3NzTmFtZX06ICR7cmVzdWx0LnRyYW5zZm9ybWVkfTtgOwogICAgICB9OwogICAgICByZXR1cm4gYXdhaXQgcGFyc2VWYXJpYWJsZSh2YWx1ZSk7CiAgICB9KTsKCiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpOwogIH07CgogIGNvbnN0IHBhcnNlUmVzcG9uc2l2ZVZhcmlhYmxlcyA9IGFzeW5jIDxUIGV4dGVuZHMgQ3NzUmVzcG9uc2l2ZVZhcmlhYmxlcz4ob2JqOiBUKTogUHJvbWlzZTxWYXJpYWJsZXNbXT4gPT4gewogICAgaWYgKCFvYmopIHJldHVybiBbXTsKCiAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikubWFwKGFzeW5jIChbbWVkaWFRdWVyeSwgdmFsdWVzXSk6IFByb21pc2U8VmFyaWFibGVzIHwgVmFyaWFibGVzW10+ID0+IHsKICAgICAgY29uc3QgdmFyaWFibGVzID0gYXdhaXQgcGFyc2VWYXJpYWJsZXModmFsdWVzKTsKICAgICAgaWYgKG1lZGlhUXVlcnkgPT09ICdiYXNlJykgcmV0dXJuIHZhcmlhYmxlcy5qb2luKCcnKTsKICAgICAgaWYgKGNvbmZpZ0NhY2hlQ29udGVudC5tZWRpYVF1ZXJpZXNbbWVkaWFRdWVyeV0pIHsKICAgICAgICBjb25zdCBtZWRpYVF1ZXJ5VmFsdWUgPSBjb25maWdDYWNoZUNvbnRlbnQubWVkaWFRdWVyaWVzW21lZGlhUXVlcnldOwogICAgICAgIHJldHVybiBgJHttZWRpYVF1ZXJ5VmFsdWV9IHsgJHt2YXJpYWJsZXMuam9pbignJyl9IH1gOwogICAgICB9CiAgICAgIHJldHVybiBgJHttZWRpYVF1ZXJ5fSB7ICR7dmFyaWFibGVzLmpvaW4oJycpfSB9YDsKICAgIH0pOwogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTsKICB9OwoKICBjb25zdCBwYXJzZUNvbmRpdGlvbmFsVmFyaWFibGVzID0gYXN5bmMgPFQgZXh0ZW5kcyBDc3NDb25kaXRpb25hbFZhcmlhYmxlcz4ob2JqOiBUKTogUHJvbWlzZTxWYXJpYWJsZXNbXT4gPT4gewogICAgaWYgKCFvYmopIHJldHVybiBbXTsKCiAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5lbnRyaWVzKG9iaikubWFwKGFzeW5jIChbcHJvcGVydHksIGNvbmRpdGlvbnNdKTogUHJvbWlzZTxWYXJpYWJsZXMgfCBWYXJpYWJsZXNbXT4gPT4gewogICAgICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC5lbnRyaWVzKGNvbmRpdGlvbnMpLm1hcChhc3luYyAoW2NvbmRpdGlvbiwgdmFsdWVzXSk6IFByb21pc2U8VmFyaWFibGVzIHwgVmFyaWFibGVzW10+ID0+IHsKICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSBhd2FpdCBwYXJzZVZhcmlhYmxlcyh2YWx1ZXMsIFtwcm9wZXJ0eV0pOwogICAgICAgIGNvbnN0IGNvbmRpdGlvblNjb3BlID0gYC4ke3Byb3BlcnR5fS0ke2NvbmRpdGlvbn0sIFtkYXRhLSR7cHJvcGVydHl9PSIke2NvbmRpdGlvbn0iXWA7CiAgICAgICAgY29uc3QgY29tYmluZWQgPSB2YXJpYWJsZXMuam9pbignJyk7CiAgICAgICAgcmV0dXJuIGAke2NvbmRpdGlvblNjb3BlfSB7ICR7Y29tYmluZWR9IH1gOwogICAgICB9KTsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpOwogICAgICByZXR1cm4gcmVzdWx0LmZsYXQoKTsKICAgIH0pOwogICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTsKICB9OwoKICBjb25zdCBnZXRTdGF0aWNWYXJpYWJsZXMgPSAodmFyaWFibGVzOiBTYWx0eVZhcmlhYmxlcyk6IFJlY29yZDxzdHJpbmcsIGFueT4gPT4gewogICAgcmV0dXJuIHsgLi4udmFyaWFibGVzLCByZXNwb25zaXZlOiB1bmRlZmluZWQsIGNvbmRpdGlvbmFsOiB1bmRlZmluZWQgfTsKICB9OwoKICBjb25zdCBnZXRHZW5lcmF0ZWRWYXJpYWJsZXMgPSAodHlwZTogJ3N0YXRpYycgfCAncmVzcG9uc2l2ZScgfCAnY29uZGl0aW9uYWwnKSA9PiB7CiAgICByZXR1cm4gZ2VuZXJhdGlvblJlc3VsdHMudmFyaWFibGVzLm1hcCgoZmFjdG9yeSkgPT4gewogICAgICBpZiAodHlwZSA9PT0gJ3N0YXRpYycpIHJldHVybiBnZXRTdGF0aWNWYXJpYWJsZXMoZmFjdG9yeS5fY3VycmVudCk7CiAgICAgIHJldHVybiBmYWN0b3J5Ll9jdXJyZW50W3R5cGVdOwogICAgfSk7CiAgfTsKCiAgY29uc3QgX3N0YXRpY1ZhcmlhYmxlcyA9IG1lcmdlT2JqZWN0cyhnZXRTdGF0aWNWYXJpYWJsZXMoY29uZmlnLnZhcmlhYmxlcyksIGdldEdlbmVyYXRlZFZhcmlhYmxlcygnc3RhdGljJykpOwogIGNvbnN0IHN0YXRpY1ZhcmlhYmxlcyA9IGF3YWl0IHBhcnNlVmFyaWFibGVzKF9zdGF0aWNWYXJpYWJsZXMpOwogIGNvbnN0IF9yZXNwb25zaXZlVmFyaWFibGVzID0gbWVyZ2VPYmplY3RzPENzc1Jlc3BvbnNpdmVWYXJpYWJsZXM+KGNvbmZpZy52YXJpYWJsZXM/LnJlc3BvbnNpdmUsIGdldEdlbmVyYXRlZFZhcmlhYmxlcygncmVzcG9uc2l2ZScpKTsKICBjb25zdCByZXNwb25zaXZlVmFyaWFibGVzID0gYXdhaXQgcGFyc2VSZXNwb25zaXZlVmFyaWFibGVzKF9yZXNwb25zaXZlVmFyaWFibGVzKTsKICBjb25zdCBfY29uZGl0aW9uYWxWYXJpYWJsZXMgPSBtZXJnZU9iamVjdHMoY29uZmlnLnZhcmlhYmxlcz8uY29uZGl0aW9uYWwsIGdldEdlbmVyYXRlZFZhcmlhYmxlcygnY29uZGl0aW9uYWwnKSk7CiAgY29uc3QgY29uZGl0aW9uYWxWYXJpYWJsZXMgPSBhd2FpdCBwYXJzZUNvbmRpdGlvbmFsVmFyaWFibGVzKF9jb25kaXRpb25hbFZhcmlhYmxlcyk7CgogIGNvbnN0IHZhcmlhYmxlc1BhdGggPSBqb2luKGRlc3REaXIsICdjc3MvX3ZhcmlhYmxlcy5jc3MnKTsKICBjb25zdCB2YXJpYWJsZXNDc3MgPSBgOnJvb3QgeyAke3N0YXRpY1ZhcmlhYmxlcy5qb2luKCcnKX0gJHtyZXNwb25zaXZlVmFyaWFibGVzLmpvaW4oJycpfSB9ICR7Y29uZGl0aW9uYWxWYXJpYWJsZXMuam9pbignJyl9YDsKICB3cml0ZUZpbGVTeW5jKHZhcmlhYmxlc1BhdGgsIHZhcmlhYmxlc0Nzcyk7CiAgY29uZmlnQ2FjaGVDb250ZW50LnN0YXRpY1ZhcmlhYmxlcyA9IF9zdGF0aWNWYXJpYWJsZXM7CgogIC8vIEdlbmVyYXRlIGdsb2JhbCBzdHlsZXMKICBjb25zdCBnbG9iYWxTdHlsZXNQYXRoID0gam9pbihkZXN0RGlyLCAnY3NzL19nbG9iYWwuY3NzJyk7CiAgY29uc3QgbWVyZ2VkR2xvYmFsU3R5bGVzID0gbWVyZ2VPYmplY3RzKGNvbmZpZy5nbG9iYWwsIGdlbmVyYXRpb25SZXN1bHRzLmdsb2JhbFN0eWxlcyk7CiAgY29uc3QgZ2xvYmFsU3R5bGVzU3RyaW5nID0gYXdhaXQgcGFyc2VBbmRKb2luU3R5bGVzKG1lcmdlZEdsb2JhbFN0eWxlcywgJycpOwoKICB3cml0ZUZpbGVTeW5jKGdsb2JhbFN0eWxlc1BhdGgsIGBAbGF5ZXIgZ2xvYmFsIHsgJHtnbG9iYWxTdHlsZXNTdHJpbmd9IH1gKTsKCiAgLy8gR2VuZXJhdGUgcmVzZXQgc3R5bGVzCiAgY29uc3QgcmVzZXRTdHlsZXNQYXRoID0gam9pbihkZXN0RGlyLCAnY3NzL19yZXNldC5jc3MnKTsKCiAgY29uc3QgZ2V0UmVzZXRTdHlsZXMgPSAoKSA9PiB7CiAgICBpZiAoY29uZmlnLnJlc2V0ID09PSAnbm9uZScpIHJldHVybiB7fTsKICAgIGlmICh0eXBlb2YgY29uZmlnLnJlc2V0ID09PSAnb2JqZWN0JykgcmV0dXJuIGNvbmZpZy5yZXNldDsKICAgIHJldHVybiBzYWx0eVJlc2V0OwogIH07CgogIGNvbnN0IHJlc2V0U3R5bGVzID0gZ2V0UmVzZXRTdHlsZXMoKTsKICBjb25zdCByZXNldFN0eWxlc1N0cmluZyA9IGF3YWl0IHBhcnNlQW5kSm9pblN0eWxlcyhyZXNldFN0eWxlcywgJycpOwoKICB3cml0ZUZpbGVTeW5jKHJlc2V0U3R5bGVzUGF0aCwgYEBsYXllciByZXNldCB7ICR7cmVzZXRTdHlsZXNTdHJpbmd9IH1gKTsKCiAgLy8gR2VuZXJhdGUgdGVtcGxhdGVzCiAgY29uc3QgdGVtcGxhdGVTdHlsZXNQYXRoID0gam9pbihkZXN0RGlyLCAnY3NzL190ZW1wbGF0ZXMuY3NzJyk7CiAgY29uc3QgdGVtcGxhdGVzID0gbWVyZ2VPYmplY3RzPENzc1RlbXBsYXRlcz4oY29uZmlnLnRlbXBsYXRlcywgZ2VuZXJhdGlvblJlc3VsdHMudGVtcGxhdGVzKTsKCiAgY29uc3QgdGVtcGxhdGVTdHlsZXNTdHJpbmcgPSBhd2FpdCBwYXJzZVRlbXBsYXRlcyh0ZW1wbGF0ZXMpOwogIGNvbnN0IHRlbXBsYXRlVG9rZW5zID0gZ2V0VGVtcGxhdGVUeXBlcyh0ZW1wbGF0ZXMpOwoKICB3cml0ZUZpbGVTeW5jKHRlbXBsYXRlU3R5bGVzUGF0aCwgYEBsYXllciB0ZW1wbGF0ZXMgeyAke3RlbXBsYXRlU3R5bGVzU3RyaW5nfSB9YCk7CiAgY29uZmlnQ2FjaGVDb250ZW50LnRlbXBsYXRlcyA9IHRlbXBsYXRlczsKCiAgY29uc3QgY29uZmlnVGVtcGxhdGVGYWN0b3JpZXMgPSBjb25maWcudGVtcGxhdGVzID8gW2RlZmluZVRlbXBsYXRlcyhjb25maWcudGVtcGxhdGVzKS5fc2V0UGF0aChgY29uZmlnOzske2NvbmZpZ1BhdGh9YCldIDogW107CiAgY29uc3QgdGVtcGxhdGVGYWN0b3JpZXMgPSBtZXJnZUZhY3RvcmllcyhnZW5lcmF0aW9uUmVzdWx0cy50ZW1wbGF0ZXMsIGNvbmZpZ1RlbXBsYXRlRmFjdG9yaWVzKTsKCiAgY29uZmlnQ2FjaGVDb250ZW50LnRlbXBsYXRlUGF0aHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModGVtcGxhdGVGYWN0b3JpZXMpLm1hcCgoW2tleSwgZmFrdG9yeV0pID0+IFtrZXksIGZha3RvcnkuX3BhdGhdKSk7CgogIC8vIEdlbmVyYXRlIHR5cGVzCgogIGNvbnN0IHRzVG9rZW5zUGF0aCA9IGpvaW4oZGVzdERpciwgJ3R5cGVzL2Nzcy10b2tlbnMuZC50cycpOwogIGNvbnN0IHRzVmFyaWFibGVUb2tlbnMgPSBbLi4udmFyaWFibGVUb2tlbnNdLmpvaW4oJ3wnKTsKCiAgY29uc3QgdHNUb2tlbnNUeXBlcyA9IGAKICAvLyBWYXJpYWJsZSB0eXBlcwogIHR5cGUgVmFyaWFibGVUb2tlbnMgPSAke3RzVmFyaWFibGVUb2tlbnN9OyAKICB0eXBlIFByb3BlcnR5VmFsdWVUb2tlbiA9IFxge1wke1ZhcmlhYmxlVG9rZW5zfX1cYDsKCiAgLy8gVGVtcGxhdGUgdHlwZXMKICB0eXBlIFRlbXBsYXRlVG9rZW5zID0gewogICAgJHtPYmplY3QuZW50cmllcyh0ZW1wbGF0ZVRva2VucykKICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9PzogJHt2YWx1ZX1gKQogICAgICAuam9pbignXG4nKX0KICB9CgogIC8vIE1lZGlhIHF1ZXJ5IHR5cGVzCiAgdHlwZSBNZWRpYVF1ZXJ5S2V5cyA9ICR7bWVkaWFRdWVyeUtleXMgfHwgYCcnYH07CiAgYDsKCiAgd3JpdGVGaWxlU3luYyh0c1Rva2Vuc1BhdGgsIHRzVG9rZW5zVHlwZXMpOwoKICAvLyBTYXZlIGNvbmZpZyBjYWNoZSBmaWxlCiAgY29uc3QgY29uZmlnQ2FjaGVQYXRoID0gam9pbihkZXN0RGlyLCAnY2FjaGUvY29uZmlnLWNhY2hlLmpzb24nKTsKICB3cml0ZUZpbGVTeW5jKGNvbmZpZ0NhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnQ2FjaGVDb250ZW50LCBudWxsLCAyKSk7CgogIGNvbnN0IGNvbmZpZ0NhY2hlU2Vjb25kYXJ5UGF0aCA9IGpvaW4oX2Rpcm5hbWUsICcuLi9jYWNoZS9jb25maWctY2FjaGUuanNvbicpOwogIHdyaXRlRmlsZVN5bmMoY29uZmlnQ2FjaGVTZWNvbmRhcnlQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWdDYWNoZUNvbnRlbnQsIG51bGwsIDIpKTsKfTsKCmNvbnN0IHJlcGxhY2VTdHlsZWRUYWcgPSAoY3VycmVudEZpbGU6IHN0cmluZykgPT4gewogIHJldHVybiBjdXJyZW50RmlsZS5yZXBsYWNlKC9zdHlsZWRcKChbXiInYHssXSspLC9nLCAobWF0Y2gsIHRhZykgPT4gewogICAgLy8gQ2hlY2sgaWYgdGhlIHRhZyBpcyBhIHN0cmluZwogICAgY29uc3QgaXNTdHJpbmcgPSAvXlsnImBdLy50ZXN0KHRhZyk7CiAgICBpZiAoaXNTdHJpbmcpIHJldHVybiBtYXRjaDsKCiAgICAvLyBDaGVjayBpZiB0aGUgdGFnIGlzIGltcG9ydGVkIGZyb20gc29tZXdoZXJlIGVsc2UKICAgIGNvbnN0IGlzSW1wb3J0ZWRSZWdFeHAgPSBuZXcgUmVnRXhwKGBpbXBvcnRbXjtdKiR7dGFnfVssXFxze11bXjtdKmZyb21cXHM/KFtee307XSspO2ApOwogICAgY29uc3QgaXNJbXBvcnRlZCA9IGlzSW1wb3J0ZWRSZWdFeHAudGVzdChjdXJyZW50RmlsZSk7CiAgICBpZiAoIWlzSW1wb3J0ZWQpIHJldHVybiBtYXRjaDsKCiAgICAvLyBDaGVjayBpZiB0aGUgaW1wb3J0IGlzIGEgc2FsdHkgZmlsZQogICAgY29uc3QgaW1wb3J0UmVzdWx0ID0gaXNJbXBvcnRlZFJlZ0V4cC5leGVjKGN1cnJlbnRGaWxlKTsKICAgIGlmIChpbXBvcnRSZXN1bHQpIHsKICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGltcG9ydFJlc3VsdC5hdCgxKTsKICAgICAgY29uc3QgaXNTYWx0eUltcG9ydCA9IHNhbHR5RmlsZUV4dGVuc2lvbnMuc29tZSgoZXh0KSA9PiBpbXBvcnRQYXRoPy5pbmNsdWRlcyhleHQpKTsKICAgICAgaWYgKGlzU2FsdHlJbXBvcnQpIHJldHVybiBtYXRjaDsKICAgIH0KCiAgICAvLyBUbyBhdm9pZCB1bm5lY2Vzc2FyeSBpbXBvcnRzLCB3ZSB3aWxsIHJlcGxhY2UgdGhlIHN0eWxlZCBjYWxsIHdpdGggYSBzdHJpbmcgd2hlbiBpbXBvcnQgaXMgbm90IGEgc2FsdHkgZmlsZQogICAgcmV0dXJuICJzdHlsZWQoJ2RpdicsIjsKICB9KTsKfTsKCmNvbnN0IGFkZENvbmZpZ0NhY2hlID0gKGN1cnJlbnRGaWxlOiBzdHJpbmcsIGRpcm5hbWU6IHN0cmluZykgPT4gewogIHRyeSB7CiAgICBjb25zdCBzYWx0eUNhY2hlZENvbmZpZyA9IHJlYWRGaWxlU3luYyhqb2luKGRpcm5hbWUsICdzYWx0eWdlbi9jYWNoZS9jb25maWctY2FjaGUuanNvbicpLCAndXRmOCcpOwogICAgaWYgKCFzYWx0eUNhY2hlZENvbmZpZykgcmV0dXJuIGBnbG9iYWxUaGlzLnNhbHR5Q29uZmlnID0ge307XG5cbiR7Y3VycmVudEZpbGV9YDsKICAgIHJldHVybiBgZ2xvYmFsVGhpcy5zYWx0eUNvbmZpZyA9ICR7c2FsdHlDYWNoZWRDb25maWd9O1xuXG4ke2N1cnJlbnRGaWxlfWA7CiAgfSBjYXRjaCB7CiAgICByZXR1cm4gY3VycmVudEZpbGU7CiAgfQp9OwoKZXhwb3J0IGNvbnN0IGNvbXBpbGVTYWx0eUZpbGUgPSBhc3luYyAoZGlybmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlUGF0aDogc3RyaW5nLCBvdXRwdXREaXJlY3Rvcnk6IHN0cmluZykgPT4gewogIGNvbnN0IGhhc2hlZE5hbWUgPSB0b0hhc2goc291cmNlRmlsZVBhdGgpOwogIGNvbnN0IHRlbXBEaXIgPSBqb2luKG91dHB1dERpcmVjdG9yeSwgJy4vdGVtcCcpOwoKICBpZiAoIWV4aXN0c1N5bmModGVtcERpcikpIG1rZGlyU3luYyh0ZW1wRGlyKTsKCiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXRoKHNvdXJjZUZpbGVQYXRoKTsKICBsZXQgY3VycmVudEZpbGUgPSByZWFkRmlsZVN5bmMoc291cmNlRmlsZVBhdGgsICd1dGY4Jyk7CgogIGN1cnJlbnRGaWxlID0gcmVwbGFjZVN0eWxlZFRhZyhjdXJyZW50RmlsZSk7CiAgY3VycmVudEZpbGUgPSBhZGRDb25maWdDYWNoZShjdXJyZW50RmlsZSwgZGlybmFtZSk7CgogIGNvbnN0IG91dHB1dEZpbGVQYXRoID0gam9pbihvdXRwdXREaXJlY3RvcnksICdqcycsIGhhc2hlZE5hbWUgKyAnLmpzJyk7CiAgY29uc3QgcmNQcm9qZWN0ID0gYXdhaXQgZ2V0UkNQcm9qZWN0Q29uZmlnKGRpcm5hbWUpOwogIGNvbnN0IGNvcmVDb25maWdQYXRoID0gam9pbihkaXJuYW1lLCByY1Byb2plY3Q/LmNvbmZpZ0RpciB8fCAnJywgJ3NhbHR5LmNvbmZpZy50cycpOwogIGNvbnN0IGV4dGVybmFsTW9kdWxlcyA9IGdldEV4dGVybmFsTW9kdWxlcyhjb3JlQ29uZmlnUGF0aCk7CiAgY29uc3QgbW9kdWxlVHlwZSA9IGF3YWl0IGRldGVjdEN1cnJlbnRNb2R1bGVUeXBlKGRpcm5hbWUpOwoKICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHsKICAgIHN0ZGluOiB7CiAgICAgIGNvbnRlbnRzOiBjdXJyZW50RmlsZSwKICAgICAgc291cmNlZmlsZTogcGFyc2VkLmJhc2UsCiAgICAgIHJlc29sdmVEaXI6IHBhcnNlZC5kaXIsCiAgICAgIGxvYWRlcjogJ3RzeCcsCiAgICB9LAogICAgbWluaWZ5OiBmYWxzZSwKICAgIHRyZWVTaGFraW5nOiB0cnVlLAogICAgYnVuZGxlOiB0cnVlLAogICAgb3V0ZmlsZTogb3V0cHV0RmlsZVBhdGgsCiAgICBmb3JtYXQ6IG1vZHVsZVR5cGUsCiAgICB0YXJnZXQ6IFsnbm9kZTIwJ10sCiAgICBrZWVwTmFtZXM6IHRydWUsCiAgICBleHRlcm5hbDogZXh0ZXJuYWxNb2R1bGVzLAogICAgcGFja2FnZXM6ICdleHRlcm5hbCcsCiAgICBwbHVnaW5zOiBbCiAgICAgIHsKICAgICAgICBuYW1lOiAndGVzdCcsCiAgICAgICAgc2V0dXA6IChidWlsZCkgPT4gewogICAgICAgICAgYnVpbGQub25Mb2FkKHsgZmlsdGVyOiAvLipcLmNzc3xzYWx0eXxzdHlsZXN8c3R5bGVkXC50cy8gfSwgKGFyZ3MpID0+IHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSByZWFkRmlsZVN5bmMoYXJncy5wYXRoLCAndXRmOCcpOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IHJlcGxhY2VTdHlsZWRUYWcob3JpZ2luYWwpOwogICAgICAgICAgICByZXR1cm4geyBjb250ZW50czogbW9kaWZpZWQsIGxvYWRlcjogJ3RzJyB9OwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgfSwKICAgIF0sCiAgfSk7CgogIHR5cGUgQ29udGVudHMgPSB7CiAgICBba2V5OiBzdHJpbmddOiB7CiAgICAgIGdlbmVyYXRvcjogYW55OwogICAgICBpc0NsYXNzTmFtZT86IGJvb2xlYW47CiAgICAgIGlzTWVkaWE/OiBib29sZWFuOwogICAgICBpc0dsb2JhbERlZmluZT86IGJvb2xlYW47CiAgICAgIGlzRGVmaW5lVmFyaWFibGVzPzogYm9vbGVhbjsKICAgICAgaXNEZWZpbmVUZW1wbGF0ZXM/OiBib29sZWFuOwogICAgICBpc0tleWZyYW1lcz86IGJvb2xlYW47CiAgICAgIGFuaW1hdGlvbk5hbWU/OiBzdHJpbmc7CiAgICAgIGNzcz86IFByb21pc2U8c3RyaW5nPjsKICAgICAgc3R5bGVzPzogYW55OwogICAgfTsKICB9OwoKICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogIGNvbnN0IGNvbnRlbnRzID0gKGF3YWl0IGltcG9ydChgJHtvdXRwdXRGaWxlUGF0aH0/dD0ke25vd31gKSkgYXMgQ29udGVudHM7CgogIHJldHVybiB7IGNvbnRlbnRzLCBvdXRwdXRGaWxlUGF0aCB9Owp9OwoKY29uc3QgZ2V0Q29uZmlnQ2FjaGUgPSBhc3luYyAoZGlybmFtZTogc3RyaW5nKSA9PiB7CiAgY29uc3QgZGVzdERpciA9IGF3YWl0IGdldERlc3REaXIoZGlybmFtZSk7CiAgY29uc3QgY29yZUNvbmZpZ0Rlc3QgPSBqb2luKGRlc3REaXIsICdjYWNoZS9jb25maWctY2FjaGUuanNvbicpOwogIGNvbnN0IGNvbnRlbnRzID0gcmVhZEZpbGVTeW5jKGNvcmVDb25maWdEZXN0LCAndXRmOCcpOwogIGlmICghY29udGVudHMpIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgY29uZmlnIGNhY2hlIGZpbGUnKTsKICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50cyk7Cn07Cgpjb25zdCBnZXRDb25maWcgPSBhc3luYyAoZGlybmFtZTogc3RyaW5nKSA9PiB7CiAgY29uc3QgY2FjaGVkID0gYXdhaXQgZ2V0Q29uZmlnQ2FjaGUoZGlybmFtZSk7CiAgY29uc3QgZGVzdERpciA9IGF3YWl0IGdldERlc3REaXIoZGlybmFtZSk7CiAgY29uc3QgY29yZUNvbmZpZ0Rlc3QgPSBqb2luKGRlc3REaXIsICdzYWx0eS5jb25maWcuanMnKTsKICBjb25zdCBub3cgPSBEYXRlLm5vdygpOwogIGNvbnN0IHsgY29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoYCR7Y29yZUNvbmZpZ0Rlc3R9P3Q9JHtub3d9YCk7CiAgcmV0dXJuIG1lcmdlT2JqZWN0czxTYWx0eUNvbmZpZyAmIENhY2hlZENvbmZpZz4oY29uZmlnLCBjYWNoZWQpOwp9OwoKY29uc3QgaXNQcm9kdWN0aW9uID0gKCkgPT4gewogIHRyeSB7CiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbJ05PREVfRU5WJ10gPT09ICdwcm9kdWN0aW9uJzsKICB9IGNhdGNoIHsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07CgpleHBvcnQgY29uc3QgZ2VuZXJhdGVDc3MgPSBhc3luYyAoZGlybmFtZTogc3RyaW5nLCBwcm9kID0gaXNQcm9kdWN0aW9uKCksIGNsZWFuID0gdHJ1ZSkgPT4gewogIHRyeSB7CiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7CiAgICBpZiAocHJvZCkgbG9nZ2VyLmluZm8oJ0dlbmVyYXRpbmcgQ1NTIGluIHByb2R1Y3Rpb24gbW9kZSEg8J+UpScpOwogICAgZWxzZSBsb2dnZXIuaW5mbygnR2VuZXJhdGluZyBDU1MgaW4gZGV2ZWxvcG1lbnQgbW9kZSEg8J+agCcpOwoKICAgIGNvbnN0IGdsb2JhbENzc0ZpbGVzOiBzdHJpbmdbXSA9IFtdOwogICAgY29uc3QgY3NzRmlsZXM6IHN0cmluZ1tdW10gPSBbXTsKICAgIGNvbnN0IGRlc3REaXIgPSBhd2FpdCBnZXREZXN0RGlyKGRpcm5hbWUpOwogICAgY29uc3QgY3NzRmlsZSA9IGpvaW4oZGVzdERpciwgJ2luZGV4LmNzcycpOwoKICAgIGNvbnN0IGNsZWFyRGlzdERpciA9ICgpID0+IHsKICAgICAgaWYgKGV4aXN0c1N5bmMoZGVzdERpcikpIGV4ZWNTeW5jKCdybSAtcmYgJyArIGRlc3REaXIpOwogICAgICBta2RpclN5bmMoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7CiAgICAgIG1rZGlyU3luYyhqb2luKGRlc3REaXIsICdjc3MnKSk7CiAgICAgIG1rZGlyU3luYyhqb2luKGRlc3REaXIsICd0eXBlcycpKTsKICAgICAgbWtkaXJTeW5jKGpvaW4oZGVzdERpciwgJ2pzJykpOwogICAgICBta2RpclN5bmMoam9pbihkZXN0RGlyLCAnY2FjaGUnKSk7CiAgICB9OwoKICAgIC8vIENsZWFyIHRoZSBkaXN0IGRpcmVjdG9yeQoKICAgIGlmIChjbGVhbikgY2xlYXJEaXN0RGlyKCk7CgogICAgLy8gQ29sbGVjdCBzYWx0eSBjc3MgZmlsZXMKICAgIGNvbnN0IGZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7CiAgICBjb25zdCBjb25maWdGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpOwoKICAgIGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RGaWxlcyhzcmM6IHN0cmluZykgewogICAgICBjb25zdCBmb2xkZXJzVG9Ta2lwID0gWydub2RlX21vZHVsZXMnLCAnc2FsdHlnZW4nXTsKICAgICAgY29uc3Qgc3RhdHMgPSBzdGF0U3luYyhzcmMpOwoKICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICBjb25zdCBmaWxlcyA9IHJlYWRkaXJTeW5jKHNyYyk7CiAgICAgICAgY29uc3Qgc2hvdWxkU2tpcCA9IGZvbGRlcnNUb1NraXAuc29tZSgoZm9sZGVyKSA9PiBzcmMuaW5jbHVkZXMoZm9sZGVyKSk7CiAgICAgICAgaWYgKHNob3VsZFNraXApIHJldHVybjsKICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IGNvbGxlY3RGaWxlcyhqb2luKHNyYywgZmlsZSkpKSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdHMuaXNGaWxlKCkpIHsKICAgICAgICBjb25zdCB2YWxpZEZpbGUgPSBpc1NhbHR5RmlsZShzcmMpOwoKICAgICAgICBpZiAodmFsaWRGaWxlKSB7CiAgICAgICAgICBmaWxlcy5hZGQoc3JjKTsKICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVhZEZpbGVTeW5jKHNyYywgJ3V0ZjgnKTsKICAgICAgICAgIGNvbnN0IGhhc0RlZmluZUZ1bmN0aW9uID0gL2RlZmluZVtcd1xkXStcKC8udGVzdChjb250ZW50cyk7CiAgICAgICAgICBpZiAoaGFzRGVmaW5lRnVuY3Rpb24pIGNvbmZpZ0ZpbGVzLmFkZChzcmMpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gU3RhcnQgdGhlIGNvcHlpbmcgcHJvY2VzcwogICAgYXdhaXQgY29sbGVjdEZpbGVzKGRpcm5hbWUpOwoKICAgIC8vIEdlbmVyYXRlIHZhcmlhYmxlcwogICAgYXdhaXQgZ2VuZXJhdGVDb25maWdTdHlsZXMoZGlybmFtZSwgY29uZmlnRmlsZXMpOwoKICAgIGNvbnN0IGdlbmVyYXRpb25SZXN1bHRzOiBTdHlsZXNHZW5lcmF0aW9uUmVzdWx0cyA9IHsKICAgICAga2V5ZnJhbWVzOiBbXSwKICAgICAgY29tcG9uZW50czogW10sCiAgICAgIGNsYXNzTmFtZXM6IFtdLAogICAgfTsKCiAgICBhd2FpdCBQcm9taXNlLmFsbCgKICAgICAgWy4uLmZpbGVzXS5tYXAoYXN5bmMgKHNyYykgPT4gewogICAgICAgIGNvbnN0IHsgY29udGVudHMgfSA9IGF3YWl0IGNvbXBpbGVTYWx0eUZpbGUoZGlybmFtZSwgc3JjLCBkZXN0RGlyKTsKICAgICAgICBmb3IgKGxldCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRlbnRzKSkgewogICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkgdmFsdWUgPSBhd2FpdCB2YWx1ZTsKCiAgICAgICAgICBpZiAodmFsdWUuaXNLZXlmcmFtZXMpIHsKICAgICAgICAgICAgZ2VuZXJhdGlvblJlc3VsdHMua2V5ZnJhbWVzLnB1c2goewogICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSBhcyBhbnksCiAgICAgICAgICAgICAgc3JjLAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pc0NsYXNzTmFtZSkgewogICAgICAgICAgICBnZW5lcmF0aW9uUmVzdWx0cy5jbGFzc05hbWVzLnB1c2goewogICAgICAgICAgICAgIC4uLnZhbHVlLAogICAgICAgICAgICAgIHNyYywKICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuZ2VuZXJhdG9yKSB7CiAgICAgICAgICAgIGdlbmVyYXRpb25SZXN1bHRzLmNvbXBvbmVudHMucHVzaCh7CiAgICAgICAgICAgICAgLi4udmFsdWUsCiAgICAgICAgICAgICAgc3JjLAogICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSkKICAgICk7CgogICAgLy8gR2V0IGNvbmZpZwogICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKGRpcm5hbWUpOwoKICAgIC8vIEdlbmVyYXRlIENTUyBmb3Iga2V5ZnJhbWUgYW5pbWF0aW9ucwogICAgZm9yIChjb25zdCBrZXlmcmFtZXMgb2YgZ2VuZXJhdGlvblJlc3VsdHMua2V5ZnJhbWVzKSB7CiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGtleWZyYW1lczsKICAgICAgY29uc3QgZmlsZU5hbWUgPSBgYV8ke3ZhbHVlLmFuaW1hdGlvbk5hbWV9LmNzc2A7CiAgICAgIGNvbnN0IGZpbGVQYXRoID0gYGNzcy8ke2ZpbGVOYW1lfWA7CiAgICAgIGNvbnN0IGNzc1BhdGggPSBqb2luKGRlc3REaXIsIGZpbGVQYXRoKTsKICAgICAgZ2xvYmFsQ3NzRmlsZXMucHVzaChmaWxlTmFtZSk7CgogICAgICB3cml0ZUZpbGVTeW5jKGNzc1BhdGgsIHZhbHVlLmNzcyk7CiAgICB9CgogICAgLy8gU3RhcnQgZ2F0aGVyaW5nIENTUyBmaWxlcyBmb3IgY29tcG9uZW50cwogICAgY29uc3QgbG9jYWxDc3NGaWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307CgogICAgLy8gR2VuZXJhdGUgQ1NTIGZvciBjb21wb25lbnRzCiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudFJlc3VsdCBvZiBnZW5lcmF0aW9uUmVzdWx0cy5jb21wb25lbnRzKSB7CiAgICAgIGNvbnN0IHsgc3JjLCBuYW1lIH0gPSBjb21wb25lbnRSZXN1bHQ7CiAgICAgIGlmICghbG9jYWxDc3NGaWxlc1tzcmNdKSBsb2NhbENzc0ZpbGVzW3NyY10gPSBbXTsKCiAgICAgIGNvbnN0IGdlbmVyYXRvciA9IGNvbXBvbmVudFJlc3VsdC5nZW5lcmF0b3IuX3dpdGhCdWlsZENvbnRleHQoewogICAgICAgIGNhbGxlck5hbWU6IG5hbWUsCiAgICAgICAgaXNQcm9kdWN0aW9uOiBwcm9kLAogICAgICAgIGNvbmZpZywKICAgICAgfSk7CgogICAgICBpZiAoIWNzc0ZpbGVzW2dlbmVyYXRvci5wcmlvcml0eV0pIGNzc0ZpbGVzW2dlbmVyYXRvci5wcmlvcml0eV0gPSBbXTsKICAgICAgY29uc3Qgc3R5bGVzID0gYXdhaXQgZ2VuZXJhdG9yLmNzczsKICAgICAgaWYgKCFzdHlsZXMpIGNvbnRpbnVlOwoKICAgICAgY3NzRmlsZXNbZ2VuZXJhdG9yLnByaW9yaXR5XS5wdXNoKGdlbmVyYXRvci5jc3NGaWxlTmFtZSk7CgogICAgICBjb25zdCBmaWxlUGF0aCA9IGBjc3MvJHtnZW5lcmF0b3IuY3NzRmlsZU5hbWV9YDsKICAgICAgY29uc3QgY3NzUGF0aCA9IGpvaW4oZGVzdERpciwgZmlsZVBhdGgpOwoKICAgICAgd3JpdGVGaWxlU3luYyhjc3NQYXRoLCBzdHlsZXMpOwoKICAgICAgaWYgKGNvbmZpZy5pbXBvcnRTdHJhdGVneSA9PT0gJ2NvbXBvbmVudCcpIHsKICAgICAgICBsb2NhbENzc0ZpbGVzW3NyY10ucHVzaChnZW5lcmF0b3IuY3NzRmlsZU5hbWUpOwogICAgICB9CiAgICB9CgogICAgLy8gR2VuZXJhdGUgQ1NTIGZvciBjbGFzcyBuYW1lcwogICAgZm9yIChjb25zdCBjbGFzc05hbWVSZXN1bHQgb2YgZ2VuZXJhdGlvblJlc3VsdHMuY2xhc3NOYW1lcykgewogICAgICBjb25zdCB7IHNyYywgbmFtZSB9ID0gY2xhc3NOYW1lUmVzdWx0OwogICAgICBpZiAoIWxvY2FsQ3NzRmlsZXNbc3JjXSkgbG9jYWxDc3NGaWxlc1tzcmNdID0gW107CgogICAgICBjb25zdCBnZW5lcmF0b3IgPSBjbGFzc05hbWVSZXN1bHQuZ2VuZXJhdG9yLl93aXRoQnVpbGRDb250ZXh0KHsKICAgICAgICBjYWxsZXJOYW1lOiBuYW1lLAogICAgICAgIGlzUHJvZHVjdGlvbjogcHJvZCwKICAgICAgICBjb25maWcsCiAgICAgIH0pOwoKICAgICAgY29uc3Qgc3R5bGVzID0gYXdhaXQgZ2VuZXJhdG9yLmNzczsKICAgICAgaWYgKCFzdHlsZXMpIGNvbnRpbnVlOwoKICAgICAgaWYgKCFjc3NGaWxlc1tnZW5lcmF0b3IucHJpb3JpdHldKSBjc3NGaWxlc1tnZW5lcmF0b3IucHJpb3JpdHldID0gW107CiAgICAgIGNzc0ZpbGVzW2dlbmVyYXRvci5wcmlvcml0eV0ucHVzaChnZW5lcmF0b3IuY3NzRmlsZU5hbWUpOwoKICAgICAgY29uc3QgZmlsZVBhdGggPSBgY3NzLyR7Z2VuZXJhdG9yLmNzc0ZpbGVOYW1lfWA7CiAgICAgIGNvbnN0IGNzc1BhdGggPSBqb2luKGRlc3REaXIsIGZpbGVQYXRoKTsKCiAgICAgIHdyaXRlRmlsZVN5bmMoY3NzUGF0aCwgc3R5bGVzKTsKCiAgICAgIGlmIChjb25maWcuaW1wb3J0U3RyYXRlZ3kgPT09ICdjb21wb25lbnQnKSB7CiAgICAgICAgbG9jYWxDc3NGaWxlc1tzcmNdLnB1c2goZ2VuZXJhdG9yLmNzc0ZpbGVOYW1lKTsKICAgICAgfQogICAgfQoKICAgIC8vIEdlbmVyYXRlIENTUyBmaWxlcyBmb3IgY29tcG9uZW50IGltcG9ydAogICAgaWYgKGNvbmZpZy5pbXBvcnRTdHJhdGVneSA9PT0gJ2NvbXBvbmVudCcpIHsKICAgICAgT2JqZWN0LmVudHJpZXMobG9jYWxDc3NGaWxlcykuZm9yRWFjaCgoW3NyYywgbG9jYWxDc3NGaWxlXSkgPT4gewogICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBsb2NhbENzc0ZpbGUubWFwKChmaWxlKSA9PiBgQGltcG9ydCB1cmwoJy4vJHtmaWxlfScpO2ApLmpvaW4oJ1xuJyk7CgogICAgICAgIGNvbnN0IGhhc2hOYW1lID0gdG9IYXNoKHNyYywgNik7CiAgICAgICAgY29uc3QgcGFyc2VkUGF0aCA9IHBhcnNlUGF0aChzcmMpOwogICAgICAgIGNvbnN0IGRhc2hlcml6ZWQgPSBkYXNoQ2FzZShwYXJzZWRQYXRoLm5hbWUpOwoKICAgICAgICBjb25zdCBjc3NGaWxlID0gam9pbihkZXN0RGlyLCBgY3NzL2ZfJHtkYXNoZXJpemVkfS0ke2hhc2hOYW1lfS5jc3NgKTsKICAgICAgICB3cml0ZUZpbGVTeW5jKGNzc0ZpbGUsIGNzc0NvbnRlbnQgfHwgYC8qIEVtcHR5IGZpbGUgKi9gKTsKICAgICAgfSk7CiAgICB9CgogICAgY29uc3Qgb3RoZXJHbG9iYWxDc3NGaWxlcyA9IGdsb2JhbENzc0ZpbGVzLm1hcCgoZmlsZSkgPT4gYEBpbXBvcnQgdXJsKCcuL2Nzcy8ke2ZpbGV9Jyk7YCkuam9pbignXG4nKTsKCiAgICBjb25zdCBnbG9iYWxDc3NGaWxlbmFtZXMgPSBbJ192YXJpYWJsZXMuY3NzJywgJ19yZXNldC5jc3MnLCAnX2dsb2JhbC5jc3MnLCAnX3RlbXBsYXRlcy5jc3MnXTsKICAgIGNvbnN0IGltcG9ydHNXaXRoRGF0YSA9IGdsb2JhbENzc0ZpbGVuYW1lcy5maWx0ZXIoKGZpbGUpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBkYXRhID0gcmVhZEZpbGVTeW5jKGpvaW4oZGVzdERpciwgJ2NzcycsIGZpbGUpLCAndXRmOCcpOwogICAgICAgIHJldHVybiBkYXRhLmxlbmd0aCA+IDA7CiAgICAgIH0gY2F0Y2ggewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSk7CiAgICBjb25zdCBnbG9iYWxJbXBvcnRzID0gaW1wb3J0c1dpdGhEYXRhLm1hcCgoZmlsZSkgPT4gYEBpbXBvcnQgdXJsKCcuL2Nzcy8ke2ZpbGV9Jyk7YCk7CiAgICBjb25zdCBnZW5lcmF0b3JUZXh0ID0gJy8qIVxuICogR2VuZXJhdGVkIHdpdGggU2FsdHkgQ1NTIChodHRwczovL3NhbHR5LWNzcy5kZXYpXG4gKiBEbyBub3QgZWRpdCB0aGlzIGZpbGUgZGlyZWN0bHlcbiAqL1xuJzsKICAgIGxldCBjc3NDb250ZW50ID0gYCR7Z2VuZXJhdG9yVGV4dH1AbGF5ZXIgcmVzZXQsIGdsb2JhbCwgdGVtcGxhdGVzLCBsMCwgbDEsIGwyLCBsMywgbDQsIGw1LCBsNiwgbDcsIGw4O1xuXG4ke2dsb2JhbEltcG9ydHMuam9pbigKICAgICAgJ1xuJwogICAgKX1cbiR7b3RoZXJHbG9iYWxDc3NGaWxlc31gOwoKICAgIGlmIChjb25maWcuaW1wb3J0U3RyYXRlZ3kgIT09ICdjb21wb25lbnQnKSB7CiAgICAgIGNvbnN0IG1lcmdlZENvbnRlbnQgPSBjc3NGaWxlcy5yZWR1Y2UoKGFjYywgdmFsLCBsYXllcikgPT4gewogICAgICAgIGNvbnN0IGxheWVyQ29udGVudCA9IHZhbC5yZWR1Y2UoKGxheWVyQWNjLCBmaWxlKSA9PiB7CiAgICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGpvaW4oZGVzdERpciwgJ2NzcycsIGZpbGUpOwogICAgICAgICAgY29uc3QgY3NzID0gcmVhZEZpbGVTeW5jKGZpbGVwYXRoLCAndXRmOCcpOwogICAgICAgICAgY29uc3QgZmlsZXBhdGhIYXNoID0gLy4qLShbXi1dKyktXGQrLmNzcy8uZXhlYyhmaWxlKT8uYXQoMSkgfHwgdG9IYXNoKGZpbGVwYXRoLCA2KTsKICAgICAgICAgIGlmIChsYXllckFjYy5pbmNsdWRlcyhmaWxlcGF0aEhhc2gpKSByZXR1cm4gbGF5ZXJBY2M7CiAgICAgICAgICByZXR1cm4gYCR7bGF5ZXJBY2N9XG4vKnN0YXJ0OiR7ZmlsZXBhdGhIYXNofS0ke2ZpbGV9Ki9cbiR7Y3NzfVxuLyplbmQ6JHtmaWxlcGF0aEhhc2h9Ki9cbmA7CiAgICAgICAgfSwgJycpOwoKICAgICAgICBjb25zdCBsYXllckZpbGVOYW1lID0gYGxfJHtsYXllcn0uY3NzYDsKICAgICAgICBjb25zdCBsYXllckZpbGVQYXRoID0gam9pbihkZXN0RGlyLCAnY3NzJywgbGF5ZXJGaWxlTmFtZSk7CiAgICAgICAgY29uc3QgbGF5ZXJDb250ZW50V2l0aExheWVyID0gYEBsYXllciBsJHtsYXllcn0geyAke2xheWVyQ29udGVudH1cbiB9YDsKICAgICAgICB3cml0ZUZpbGVTeW5jKGxheWVyRmlsZVBhdGgsIGxheWVyQ29udGVudFdpdGhMYXllcik7CgogICAgICAgIHJldHVybiBgJHthY2N9XG5AaW1wb3J0IHVybCgnLi9jc3MvJHtsYXllckZpbGVOYW1lfScpO2A7CiAgICAgIH0sICcnKTsKCiAgICAgIGNzc0NvbnRlbnQgKz0gbWVyZ2VkQ29udGVudDsKICAgIH0KCiAgICB3cml0ZUZpbGVTeW5jKGNzc0ZpbGUsIGNzc0NvbnRlbnQpOwoKICAgIGNvbnN0IGVuZCA9IERhdGUubm93KCk7CiAgICBjb25zdCB0aW1lID0gZW5kIC0gc3RhcnQ7CiAgICBjb25zdCBlbW9qaSA9IHRpbWUgPCAyMDAgPyAn8J+UpScgOiB0aW1lIDwgNTAwID8gJ/CfmoAnIDogdGltZSA8IDEwMDAgPyAn8J+OiScgOiB0aW1lIDwgMjAwMCA/ICfwn5qXJyA6IHRpbWUgPCA1MDAwID8gJ/CfpJQnIDogJ/CfpbQnOwogICAgbG9nZ2VyLmluZm8oYEdlbmVyYXRlZCBDU1MgaW4gJHt0aW1lfW1zISAke2Vtb2ppfWApOwogIH0gY2F0Y2ggKGUpIHsKICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgfQp9OwoKZXhwb3J0IGNvbnN0IGdlbmVyYXRlRmlsZSA9IGFzeW5jIChkaXJuYW1lOiBzdHJpbmcsIGZpbGU6IHN0cmluZywgcHJvZCA9IGlzUHJvZHVjdGlvbigpKSA9PiB7CiAgdHJ5IHsKICAgIGNvbnN0IGRlc3REaXIgPSBhd2FpdCBnZXREZXN0RGlyKGRpcm5hbWUpOwogICAgY29uc3QgdmFsaWRGaWxlID0gaXNTYWx0eUZpbGUoZmlsZSk7CgogICAgaWYgKHZhbGlkRmlsZSkgewogICAgICBjb25zdCBjc3NGaWxlczogc3RyaW5nW11bXSA9IFtdOwogICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoZGlybmFtZSk7CiAgICAgIGNvbnN0IHsgY29udGVudHMgfSA9IGF3YWl0IGNvbXBpbGVTYWx0eUZpbGUoZGlybmFtZSwgZmlsZSwgZGVzdERpcik7CiAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb250ZW50cykpIHsKICAgICAgICAvLyBPYmplY3QuZW50cmllcyhjb250ZW50cykuZm9yRWFjaCgoW25hbWUsIHZhbHVlXTogW3N0cmluZywgYW55XSkgPT4gewogICAgICAgIGlmICh2YWx1ZS5pc0tleWZyYW1lcyAmJiB2YWx1ZS5jc3MpIHsKICAgICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYGFfJHt2YWx1ZS5hbmltYXRpb25OYW1lfS5jc3NgOwogICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgY3NzLyR7ZmlsZU5hbWV9YDsKICAgICAgICAgIGNvbnN0IGNzc1BhdGggPSBqb2luKGRlc3REaXIsIGZpbGVQYXRoKTsKCiAgICAgICAgICB3cml0ZUZpbGVTeW5jKGNzc1BhdGgsIGF3YWl0IHZhbHVlLmNzcyk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICh2YWx1ZS5pc0NsYXNzTmFtZSkgewogICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gdmFsdWUuZ2VuZXJhdG9yLl93aXRoQnVpbGRDb250ZXh0KHsKICAgICAgICAgICAgY2FsbGVyTmFtZTogbmFtZSwKICAgICAgICAgICAgaXNQcm9kdWN0aW9uOiBwcm9kLAogICAgICAgICAgICBjb25maWcsCiAgICAgICAgICB9KTsKCiAgICAgICAgICBjb25zdCBzdHlsZXMgPSBhd2FpdCBnZW5lcmF0b3IuY3NzOwogICAgICAgICAgaWYgKCFzdHlsZXMpIGNvbnRpbnVlOwoKICAgICAgICAgIGlmICghY3NzRmlsZXNbZ2VuZXJhdG9yLnByaW9yaXR5XSkgY3NzRmlsZXNbZ2VuZXJhdG9yLnByaW9yaXR5XSA9IFtdOwogICAgICAgICAgY3NzRmlsZXNbZ2VuZXJhdG9yLnByaW9yaXR5XS5wdXNoKGdlbmVyYXRvci5jc3NGaWxlTmFtZSk7CgogICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBgY3NzLyR7Z2VuZXJhdG9yLmNzc0ZpbGVOYW1lfWA7CiAgICAgICAgICBjb25zdCBjc3NQYXRoID0gam9pbihkZXN0RGlyLCBmaWxlUGF0aCk7CiAgICAgICAgICB3cml0ZUZpbGVTeW5jKGNzc1BhdGgsIHN0eWxlcyk7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmICghdmFsdWUuZ2VuZXJhdG9yKSBjb250aW51ZTsKCiAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gdmFsdWUuZ2VuZXJhdG9yLl93aXRoQnVpbGRDb250ZXh0KHsKICAgICAgICAgIGNhbGxlck5hbWU6IG5hbWUsCiAgICAgICAgICBpc1Byb2R1Y3Rpb246IHByb2QsCiAgICAgICAgICBjb25maWcsCiAgICAgICAgfSk7CgogICAgICAgIGNvbnN0IHN0eWxlcyA9IGF3YWl0IGdlbmVyYXRvci5jc3M7CiAgICAgICAgaWYgKCFzdHlsZXMpIGNvbnRpbnVlOwoKICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGBjc3MvJHtnZW5lcmF0b3IuY3NzRmlsZU5hbWV9YDsKICAgICAgICBjb25zdCBjc3NQYXRoID0gam9pbihkZXN0RGlyLCBmaWxlUGF0aCk7CgogICAgICAgIHdyaXRlRmlsZVN5bmMoY3NzUGF0aCwgc3R5bGVzKTsKCiAgICAgICAgaWYgKCFjc3NGaWxlc1tnZW5lcmF0b3IucHJpb3JpdHldKSBjc3NGaWxlc1tnZW5lcmF0b3IucHJpb3JpdHldID0gW107CiAgICAgICAgY3NzRmlsZXNbZ2VuZXJhdG9yLnByaW9yaXR5XS5wdXNoKGdlbmVyYXRvci5jc3NGaWxlTmFtZSk7CiAgICAgIH0KCiAgICAgIGlmIChjb25maWcuaW1wb3J0U3RyYXRlZ3kgIT09ICdjb21wb25lbnQnKSB7CiAgICAgICAgY3NzRmlsZXMuZm9yRWFjaCgodmFsLCBsYXllcikgPT4gewogICAgICAgICAgY29uc3QgbGF5ZXJGaWxlTmFtZSA9IGBsXyR7bGF5ZXJ9LmNzc2A7CiAgICAgICAgICBjb25zdCBsYXllckZpbGVQYXRoID0gam9pbihkZXN0RGlyLCAnY3NzJywgbGF5ZXJGaWxlTmFtZSk7CiAgICAgICAgICBsZXQgY3VycmVudExheWVyRmlsZUNvbnRlbnQgPSByZWFkRmlsZVN5bmMobGF5ZXJGaWxlUGF0aCwgJ3V0ZjgnKTsKICAgICAgICAgIHZhbC5mb3JFYWNoKChmaWxlKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gam9pbihkZXN0RGlyLCAnY3NzJywgZmlsZSk7CiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoSGFzaCA9IC8uKi0oW14tXSspLVxkKy5jc3MvLmV4ZWMoZmlsZSk/LmF0KDEpIHx8IHRvSGFzaChmaWxlcGF0aCwgNik7CiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gY3VycmVudExheWVyRmlsZUNvbnRlbnQuaW5jbHVkZXMoZmlsZXBhdGhIYXNoKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgIGNvbnN0IGNzcyA9IHJlYWRGaWxlU3luYyhmaWxlcGF0aCwgJ3V0ZjgnKTsKICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gYC8qc3RhcnQ6JHtmaWxlcGF0aEhhc2h9LSR7ZmlsZX0qL1xuJHtjc3N9XG4vKmVuZDoke2ZpbGVwYXRoSGFzaH0qL1xuYDsKICAgICAgICAgICAgICBjdXJyZW50TGF5ZXJGaWxlQ29udGVudCA9IGAke2N1cnJlbnRMYXllckZpbGVDb250ZW50LnJlcGxhY2UoL1x9JC8sICcnKX1cbiR7bmV3Q29udGVudH1cbn1gOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHdyaXRlRmlsZVN5bmMobGF5ZXJGaWxlUGF0aCwgY3VycmVudExheWVyRmlsZUNvbnRlbnQpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGNzc0NvbnRlbnQgPSBjc3NGaWxlcwogICAgICAgICAgLmZsYXQoKQogICAgICAgICAgLm1hcCgoZmlsZSkgPT4gYEBpbXBvcnQgdXJsKCcuLyR7ZmlsZX0nKTtgKQogICAgICAgICAgLmpvaW4oJ1xuJyk7CgogICAgICAgIGNvbnN0IGhhc2hOYW1lID0gdG9IYXNoKGZpbGUsIDYpOwogICAgICAgIGNvbnN0IHBhcnNlZFBhdGggPSBwYXJzZVBhdGgoZmlsZSk7CiAgICAgICAgY29uc3QgZGFzaGVyaXplZCA9IGRhc2hDYXNlKHBhcnNlZFBhdGgubmFtZSk7CgogICAgICAgIGNvbnN0IGNzc0ZpbGUgPSBqb2luKGRlc3REaXIsIGBjc3MvZl8ke2Rhc2hlcml6ZWR9LSR7aGFzaE5hbWV9LmNzc2ApOwogICAgICAgIHdyaXRlRmlsZVN5bmMoY3NzRmlsZSwgY3NzQ29udGVudCB8fCBgLyogRW1wdHkgZmlsZSAqL2ApOwogICAgICB9CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS5lcnJvcihlKTsKICB9Cn07CgpleHBvcnQgY29uc3QgbWluaW1pemVGaWxlID0gYXN5bmMgKGRpcm5hbWU6IHN0cmluZywgZmlsZTogc3RyaW5nLCBwcm9kID0gaXNQcm9kdWN0aW9uKCkpID0+IHsKICB0cnkgewogICAgY29uc3QgZGVzdERpciA9IGF3YWl0IGdldERlc3REaXIoZGlybmFtZSk7CiAgICBjb25zdCB2YWxpZEZpbGUgPSBpc1NhbHR5RmlsZShmaWxlKTsKCiAgICBpZiAodmFsaWRGaWxlKSB7CiAgICAgIGNvbnN0IG9yaWdpbmFsID0gcmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4Jyk7CgogICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcoZGlybmFtZSk7CiAgICAgIGNvbnN0IHsgY29udGVudHMgfSA9IGF3YWl0IGNvbXBpbGVTYWx0eUZpbGUoZGlybmFtZSwgZmlsZSwgZGVzdERpcik7CgogICAgICBsZXQgY3VycmVudCA9IG9yaWdpbmFsOwoKICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbnRlbnRzKSkgewogICAgICAgIGlmICh2YWx1ZS5pc0tleWZyYW1lcykgY29udGludWU7CgogICAgICAgIGlmICghdmFsdWUuZ2VuZXJhdG9yKSBjb250aW51ZTsKICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSB2YWx1ZS5nZW5lcmF0b3IuX3dpdGhCdWlsZENvbnRleHQoewogICAgICAgICAgY2FsbGVyTmFtZTogbmFtZSwKICAgICAgICAgIGlzUHJvZHVjdGlvbjogcHJvZCwKICAgICAgICAgIGNvbmZpZywKICAgICAgICB9KTsKCiAgICAgICAgY29uc3QgW3N0YXJ0LCBlbmRdID0gYXdhaXQgZ2V0RnVuY3Rpb25SYW5nZShjdXJyZW50LCBuYW1lKTsKICAgICAgICBjb25zdCByYW5nZSA9IGN1cnJlbnQuc2xpY2Uoc3RhcnQsIGVuZCk7CgogICAgICAgIGlmICh2YWx1ZS5pc0NsYXNzTmFtZSkgewogICAgICAgICAgY29uc3QgY29weSA9IGN1cnJlbnQ7CiAgICAgICAgICBjb25zdCBjbGllbnRWZXJzaW9uID0gYCAke25hbWV9ID0gY2xhc3NOYW1lKCIke2dlbmVyYXRvci5jbGFzc05hbWVzfSIpYDsKICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJlcGxhY2UocmFuZ2UsIGNsaWVudFZlcnNpb24pOwoKICAgICAgICAgIGlmIChjb3B5ID09PSBjdXJyZW50KSBjb25zb2xlLmVycm9yKCdNaW5pbWl6ZSBmaWxlIGZhaWxlZCB0byBjaGFuZ2UgY29udGVudCcsIHsgbmFtZSB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChyYW5nZS5pbmNsdWRlcygnc3R5bGVkJykpIHsKICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSAvc3R5bGVkXCgoW14sXSspLC8uZXhlYyhyYW5nZSk/LmF0KDEpPy50cmltKCk7CgogICAgICAgICAgLy8gUmVwbGFjZSB0aGUgc3R5bGVkIGNhbGwgd2l0aCB0aGUgY2xpZW50IHZlcnNpb24KICAgICAgICAgIGNvbnN0IGNvcHkgPSBjdXJyZW50OwogICAgICAgICAgY29uc3QgY2xpZW50VmVyc2lvbiA9IGAgJHtuYW1lfSA9IHN0eWxlZCgke3RhZ05hbWV9LCAiJHtnZW5lcmF0b3IuY2xhc3NOYW1lc30iLCAke0pTT04uc3RyaW5naWZ5KGdlbmVyYXRvci5jbGllbnRQcm9wcyl9KWA7CiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5yZXBsYWNlKHJhbmdlLCBjbGllbnRWZXJzaW9uKTsKCiAgICAgICAgICBpZiAoY29weSA9PT0gY3VycmVudCkgY29uc29sZS5lcnJvcignTWluaW1pemUgZmlsZSBmYWlsZWQgdG8gY2hhbmdlIGNvbnRlbnQnLCB7IG5hbWUsIHRhZ05hbWUgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY29uZmlnLmltcG9ydFN0cmF0ZWd5ID09PSAnY29tcG9uZW50JykgewogICAgICAgIGNvbnN0IGZpbGVIYXNoID0gdG9IYXNoKGZpbGUsIDYpOwogICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlUGF0aChmaWxlKTsKICAgICAgICBjb25zdCBkYXNoZXJpemVkID0gZGFzaENhc2UocGFyc2VkLm5hbWUpOwogICAgICAgIGNvbnN0IGNzc0ZpbGVOYW1lID0gYGZfJHtkYXNoZXJpemVkfS0ke2ZpbGVIYXNofS5jc3NgOwogICAgICAgIGN1cnJlbnQgPSBgaW1wb3J0ICcuLi8uLi9zYWx0eWdlbi9jc3MvJHtjc3NGaWxlTmFtZX0nO1xuJHtjdXJyZW50fWA7CiAgICAgIH0KCiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJlcGxhY2UoYEBzYWx0eS1jc3MvcmVhY3QvY2xhc3MtbmFtZWAsIGBAc2FsdHktY3NzL3JlYWN0L2NsYXNzLW5hbWUtY2xpZW50YCk7CgogICAgICBjdXJyZW50ID0gY3VycmVudC5yZXBsYWNlKGB7IHN0eWxlZCB9YCwgYHsgc3R5bGVkQ2xpZW50IGFzIHN0eWxlZCB9YCk7CiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJlcGxhY2UoYEBzYWx0eS1jc3MvcmVhY3Qvc3R5bGVkYCwgYEBzYWx0eS1jc3MvcmVhY3Qvc3R5bGVkLWNsaWVudGApOwoKICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gbWluaW1pemVGaWxlOicsIGUpOwogIH0KICByZXR1cm4gdW5kZWZpbmVkOwp9Owo=",typeof document>"u"?require("url").pathToFileURL(__filename).href:U&&U.tagName.toUpperCase()==="SCRIPT"&&U.src||new URL("index-BgHtTuZf.cjs",document.baseURI).href).pathname,K={externalModules:[],rcFile:void 0,destDir:void 0},Ng=g=>{if(K.externalModules.length>0)return K.externalModules;const l=n.readFileSync(g,"utf8").match(/externalModules:\s?\[(.*)\]/);if(!l)return[];const I=l[1].split(",").map(e=>e.replace(/['"`]/g,"").trim());return K.externalModules=I,I},k=async g=>{if(K.destDir)return K.destDir;const c=await tg(g),l=s.join(g,(c==null?void 0:c.saltygenDir)||"saltygen");return K.destDir=l,l},Zg=["salty","css","styles","styled"],ug=(g=[])=>new RegExp(`\\.(${[...Zg,...g].join("|")})\\.`),gg=(g,c=[])=>ug(c).test(g),hg=async g=>{if(K.rcFile)return K.rcFile;if(g==="/")throw new Error("Could not find .saltyrc.json file");const c=s.join(g,".saltyrc.json"),l=await yg.readFile(c,"utf-8").then(JSON.parse).catch(()=>{});return l?(K.rcFile=l,l):hg(s.join(g,".."))},tg=async g=>{var I,e;const c=await hg(g),l=(I=c.projects)==null?void 0:I.find(Z=>g.endsWith(Z.dir||""));return l||((e=c.projects)==null?void 0:e.find(Z=>Z.dir===c.defaultProject))},fg=async g=>{const c=await tg(g),l=await k(g),I=s.join(g,(c==null?void 0:c.configDir)||"","salty.config.ts"),e=s.join(l,"salty.config.js"),Z=await Xg(g),C=Ng(I);await Yg.build({entryPoints:[I],minify:!0,treeShaking:!0,bundle:!0,outfile:e,format:Z,external:C});const G=Date.now(),{config:y}=await import(`${e}?t=${G}`);return{config:y,path:e}},Bg=async(g,c)=>{var ig,Gg;const l=await k(g),I={mediaQueries:[],globalStyles:[],variables:[],templates:[]};await Promise.all([...c].map(async W=>{const{contents:X,outputFilePath:D}=await M(g,W,l);Object.entries(X).forEach(([r,u])=>{u.isMedia?I.mediaQueries.push([r,u]):u.isGlobalDefine?I.globalStyles.push(u):u.isDefineVariables?I.variables.push(u):u.isDefineTemplates&&I.templates.push(u._setPath(`${r};;${D}`))})}));const{config:e,path:Z}=await fg(g),C={...e},{mediaQueries:G}=I;C.mediaQueries=Object.fromEntries(G.map(([W,X])=>[`@${W}`,X]));const y=G.map(([W])=>`'@${W}'`).join(" | "),m=new Set,b=async(W,X=[])=>{if(!W)return[];const D=Object.entries(W).map(async([u,v])=>{const O=async F=>{if(!F)return;if(F instanceof Promise)return await O(await F);if(typeof F=="function")return await O(await F());if(typeof F=="object")return await b(F,[...X,u]);const Cg=Vg(u),sg=J.dashCase(u),bg=[...X,Cg].join(".");m.add(`"${bg}"`);const _=[...X.map(J.dashCase),sg].join("-"),dg=ng.parseVariableTokens(F);return dg?`--${_}: ${dg.transformed};`:`--${_}: ${F};`};return await O(v)});return(await Promise.all(D)).flat()},d=async W=>{if(!W)return[];const X=Object.entries(W).map(async([r,u])=>{const v=await b(u);return r==="base"?v.join(""):C.mediaQueries[r]?`${C.mediaQueries[r]} { ${v.join("")} }`:`${r} { ${v.join("")} }`});return(await Promise.all(X)).flat()},i=async W=>{if(!W)return[];const X=Object.entries(W).map(async([r,u])=>{const v=Object.entries(u).map(async([F,Cg])=>{const sg=await b(Cg,[r]),bg=`.${r}-${F}, [data-${r}="${F}"]`,_=sg.join("");return`${bg} { ${_} }`});return(await Promise.all(v)).flat()});return(await Promise.all(X)).flat()},A=W=>({...W,responsive:void 0,conditional:void 0}),o=W=>I.variables.map(X=>W==="static"?A(X._current):X._current[W]),V=j.mergeObjects(A(e.variables),o("static")),B=await b(V),R=j.mergeObjects((ig=e.variables)==null?void 0:ig.responsive,o("responsive")),z=await d(R),x=j.mergeObjects((Gg=e.variables)==null?void 0:Gg.conditional,o("conditional")),$=await i(x),mg=s.join(l,"css/_variables.css"),w=`:root { ${B.join("")} ${z.join("")} } ${$.join("")}`;n.writeFileSync(mg,w),C.staticVariables=V;const cg=s.join(l,"css/_global.css"),a=j.mergeObjects(e.global,I.globalStyles),Y=await ng.parseAndJoinStyles(a,"");n.writeFileSync(cg,`@layer global { ${Y} }`);const p=s.join(l,"css/_reset.css"),N=e.reset==="none"?{}:typeof e.reset=="object"?e.reset:jg,h=await ng.parseAndJoinStyles(N,"");n.writeFileSync(p,`@layer reset { ${h} }`);const H=s.join(l,"css/_templates.css"),S=j.mergeObjects(e.templates,I.templates),Q=await Ag.parseTemplates(S),T=Ag.getTemplateTypes(S);n.writeFileSync(H,`@layer templates { ${Q} }`),C.templates=S;const q=e.templates?[Kg.defineTemplates(e.templates)._setPath(`config;;${Z}`)]:[],lg=j.mergeFactories(I.templates,q);C.templatePaths=Object.fromEntries(Object.entries(lg).map(([W,X])=>[W,X._path]));const L=s.join(l,"types/css-tokens.d.ts"),Rg=`
|
2
|
+
// Variable types
|
3
|
+
type VariableTokens = ${[...m].join("|")};
|
4
|
+
type PropertyValueToken = \`{\${VariableTokens}}\`;
|
5
|
+
|
6
|
+
// Template types
|
7
|
+
type TemplateTokens = {
|
8
|
+
${Object.entries(T).map(([W,X])=>`${W}?: ${X}`).join(`
|
9
|
+
`)}
|
10
|
+
}
|
11
|
+
|
12
|
+
// Media query types
|
13
|
+
type MediaQueryKeys = ${y||"''"};
|
14
|
+
`;n.writeFileSync(L,Rg);const rg=s.join(l,"cache/config-cache.json");n.writeFileSync(rg,JSON.stringify(C,null,2));const Fg=s.join(xg,"../cache/config-cache.json");n.writeFileSync(Fg,JSON.stringify(C,null,2))},Wg=g=>g.replace(/styled\(([^"'`{,]+),/g,(c,l)=>{if(/^['"`]/.test(l))return c;const e=new RegExp(`import[^;]*${l}[,\\s{][^;]*from\\s?([^{};]+);`);if(!e.test(g))return c;const C=e.exec(g);if(C){const G=C.at(1);if(Zg.some(m=>G==null?void 0:G.includes(m)))return c}return"styled('div',"}),Ug=(g,c)=>{try{const l=n.readFileSync(s.join(c,"saltygen/cache/config-cache.json"),"utf8");return l?`globalThis.saltyConfig = ${l};
|
15
|
+
|
16
|
+
${g}`:`globalThis.saltyConfig = {};
|
17
|
+
|
18
|
+
${g}`}catch{return g}},M=async(g,c,l)=>{const I=J.toHash(c),e=s.join(l,"./temp");n.existsSync(e)||n.mkdirSync(e);const Z=s.parse(c);let C=n.readFileSync(c,"utf8");C=Wg(C),C=Ug(C,g);const G=s.join(l,"js",I+".js"),y=await tg(g),m=s.join(g,(y==null?void 0:y.configDir)||"","salty.config.ts"),b=Ng(m),d=await Xg(g);await Yg.build({stdin:{contents:C,sourcefile:Z.base,resolveDir:Z.dir,loader:"tsx"},minify:!1,treeShaking:!0,bundle:!0,outfile:G,format:d,target:["node20"],keepNames:!0,external:b,packages:"external",plugins:[{name:"test",setup:o=>{o.onLoad({filter:/.*\.css|salty|styles|styled\.ts/},V=>{const B=n.readFileSync(V.path,"utf8");return{contents:Wg(B),loader:"ts"}})}}]});const i=Date.now();return{contents:await import(`${G}?t=${i}`),outputFilePath:G}},Qg=async g=>{const c=await k(g),l=s.join(c,"cache/config-cache.json"),I=n.readFileSync(l,"utf8");if(!I)throw new Error("Could not find config cache file");return JSON.parse(I)},ag=async g=>{const c=await Qg(g),l=await k(g),I=s.join(l,"salty.config.js"),e=Date.now(),{config:Z}=await import(`${I}?t=${e}`);return j.mergeObjects(Z,c)},og=()=>{try{return process.env.NODE_ENV==="production"}catch{return!1}},Tg=async(g,c=og(),l=!0)=>{try{const I=Date.now();c?E.info("Generating CSS in production mode! 🔥"):E.info("Generating CSS in development mode! 🚀");const e=[],Z=[],C=await k(g),G=s.join(C,"index.css");l&&(()=>{n.existsSync(C)&&Hg.execSync("rm -rf "+C),n.mkdirSync(C,{recursive:!0}),n.mkdirSync(s.join(C,"css")),n.mkdirSync(s.join(C,"types")),n.mkdirSync(s.join(C,"js")),n.mkdirSync(s.join(C,"cache"))})();const m=new Set,b=new Set;async function d(a){const Y=["node_modules","saltygen"],p=n.statSync(a);if(p.isDirectory()){const t=n.readdirSync(a);if(Y.some(h=>a.includes(h)))return;await Promise.all(t.map(h=>d(s.join(a,h))))}else if(p.isFile()&&gg(a)){m.add(a);const N=n.readFileSync(a,"utf8");/define[\w\d]+\(/.test(N)&&b.add(a)}}await d(g),await Bg(g,b);const i={keyframes:[],components:[],classNames:[]};await Promise.all([...m].map(async a=>{const{contents:Y}=await M(g,a,C);for(let[p,t]of Object.entries(Y))t instanceof Promise&&(t=await t),t.isKeyframes?i.keyframes.push({value:t,src:a,name:p}):t.isClassName?i.classNames.push({...t,src:a,name:p}):t.generator&&i.components.push({...t,src:a,name:p})}));const A=await ag(g);for(const a of i.keyframes){const{value:Y}=a,p=`a_${Y.animationName}.css`,t=`css/${p}`,N=s.join(C,t);e.push(p),n.writeFileSync(N,Y.css)}const o={};for(const a of i.components){const{src:Y,name:p}=a;o[Y]||(o[Y]=[]);const t=a.generator._withBuildContext({callerName:p,isProduction:c,config:A});Z[t.priority]||(Z[t.priority]=[]);const N=await t.css;if(!N)continue;Z[t.priority].push(t.cssFileName);const h=`css/${t.cssFileName}`,H=s.join(C,h);n.writeFileSync(H,N),A.importStrategy==="component"&&o[Y].push(t.cssFileName)}for(const a of i.classNames){const{src:Y,name:p}=a;o[Y]||(o[Y]=[]);const t=a.generator._withBuildContext({callerName:p,isProduction:c,config:A}),N=await t.css;if(!N)continue;Z[t.priority]||(Z[t.priority]=[]),Z[t.priority].push(t.cssFileName);const h=`css/${t.cssFileName}`,H=s.join(C,h);n.writeFileSync(H,N),A.importStrategy==="component"&&o[Y].push(t.cssFileName)}A.importStrategy==="component"&&Object.entries(o).forEach(([a,Y])=>{const p=Y.map(S=>`@import url('./${S}');`).join(`
|
19
|
+
`),t=J.toHash(a,6),N=s.parse(a),h=J.dashCase(N.name),H=s.join(C,`css/f_${h}-${t}.css`);n.writeFileSync(H,p||"/* Empty file */")});const V=e.map(a=>`@import url('./css/${a}');`).join(`
|
20
|
+
`);let $=`/*!
|
21
|
+
* Generated with Salty CSS (https://salty-css.dev)
|
22
|
+
* Do not edit this file directly
|
23
|
+
*/
|
24
|
+
@layer reset, global, templates, l0, l1, l2, l3, l4, l5, l6, l7, l8;
|
25
|
+
|
26
|
+
${["_variables.css","_reset.css","_global.css","_templates.css"].filter(a=>{try{return n.readFileSync(s.join(C,"css",a),"utf8").length>0}catch{return!1}}).map(a=>`@import url('./css/${a}');`).join(`
|
27
|
+
`)}
|
28
|
+
${V}`;if(A.importStrategy!=="component"){const a=Z.reduce((Y,p,t)=>{const N=p.reduce((Q,T)=>{var Ig;const q=s.join(C,"css",T),lg=n.readFileSync(q,"utf8"),L=((Ig=/.*-([^-]+)-\d+.css/.exec(T))==null?void 0:Ig.at(1))||J.toHash(q,6);return Q.includes(L)?Q:`${Q}
|
29
|
+
/*start:${L}-${T}*/
|
30
|
+
${lg}
|
31
|
+
/*end:${L}*/
|
32
|
+
`},""),h=`l_${t}.css`,H=s.join(C,"css",h),S=`@layer l${t} { ${N}
|
33
|
+
}`;return n.writeFileSync(H,S),`${Y}
|
34
|
+
@import url('./css/${h}');`},"");$+=a}n.writeFileSync(G,$);const w=Date.now()-I,cg=w<200?"🔥":w<500?"🚀":w<1e3?"🎉":w<2e3?"🚗":w<5e3?"🤔":"🥴";E.info(`Generated CSS in ${w}ms! ${cg}`)}catch(I){console.error(I)}},Lg=async(g,c,l=og())=>{try{const I=await k(g);if(gg(c)){const Z=[],C=await ag(g),{contents:G}=await M(g,c,I);for(const[y,m]of Object.entries(G)){if(m.isKeyframes&&m.css){const V=`css/${`a_${m.animationName}.css`}`,B=s.join(I,V);n.writeFileSync(B,await m.css);continue}if(m.isClassName){const o=m.generator._withBuildContext({callerName:y,isProduction:l,config:C}),V=await o.css;if(!V)continue;Z[o.priority]||(Z[o.priority]=[]),Z[o.priority].push(o.cssFileName);const B=`css/${o.cssFileName}`,R=s.join(I,B);n.writeFileSync(R,V);continue}if(!m.generator)continue;const b=m.generator._withBuildContext({callerName:y,isProduction:l,config:C}),d=await b.css;if(!d)continue;const i=`css/${b.cssFileName}`,A=s.join(I,i);n.writeFileSync(A,d),Z[b.priority]||(Z[b.priority]=[]),Z[b.priority].push(b.cssFileName)}if(C.importStrategy!=="component")Z.forEach((y,m)=>{const b=`l_${m}.css`,d=s.join(I,"css",b);let i=n.readFileSync(d,"utf8");y.forEach(A=>{var R;const o=s.join(I,"css",A),V=((R=/.*-([^-]+)-\d+.css/.exec(A))==null?void 0:R.at(1))||J.toHash(o,6);if(!i.includes(V)){const z=n.readFileSync(o,"utf8"),x=`/*start:${V}-${A}*/
|
35
|
+
${z}
|
36
|
+
/*end:${V}*/
|
37
|
+
`;i=`${i.replace(/\}$/,"")}
|
38
|
+
${x}
|
39
|
+
}`}}),n.writeFileSync(d,i)});else{const y=Z.flat().map(A=>`@import url('./${A}');`).join(`
|
40
|
+
`),m=J.toHash(c,6),b=s.parse(c),d=J.dashCase(b.name),i=s.join(I,`css/f_${d}-${m}.css`);n.writeFileSync(i,y||"/* Empty file */")}}}catch(I){console.error(I)}},Dg=async(g,c,l=og())=>{var I,e;try{const Z=await k(g);if(gg(c)){const G=n.readFileSync(c,"utf8"),y=await ag(g),{contents:m}=await M(g,c,Z);let b=G;for(const[d,i]of Object.entries(m)){if(i.isKeyframes||!i.generator)continue;const A=i.generator._withBuildContext({callerName:d,isProduction:l,config:y}),[o,V]=await kg(b,d),B=b.slice(o,V);if(i.isClassName){const R=b,z=` ${d} = className("${A.classNames}")`;b=b.replace(B,z),R===b&&console.error("Minimize file failed to change content",{name:d})}if(B.includes("styled")){const R=(e=(I=/styled\(([^,]+),/.exec(B))==null?void 0:I.at(1))==null?void 0:e.trim(),z=b,x=` ${d} = styled(${R}, "${A.classNames}", ${JSON.stringify(A.clientProps)})`;b=b.replace(B,x),z===b&&console.error("Minimize file failed to change content",{name:d,tagName:R})}}if(y.importStrategy==="component"){const d=J.toHash(c,6),i=s.parse(c);b=`import '../../saltygen/css/${`f_${J.dashCase(i.name)}-${d}.css`}';
|
41
|
+
${b}`}return b=b.replace("@salty-css/react/class-name","@salty-css/react/class-name-client"),b=b.replace("{ styled }","{ styledClient as styled }"),b=b.replace("@salty-css/react/styled","@salty-css/react/styled-client"),b}}catch(Z){console.error("Error in minimizeFile:",Z)}};exports.compileSaltyFile=M;exports.generateConfigStyles=Bg;exports.generateCss=Tg;exports.generateFile=Lg;exports.isSaltyFile=gg;exports.logError=vg;exports.logger=E;exports.minimizeFile=Dg;exports.saltyFileExtensions=Zg;exports.saltyFileRegExp=ug;
|