projen
Version:
CDK for software projects
443 lines • 51.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NextComponent = exports.NextJsTypeScriptProject = exports.NextJsProject = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const postcss_1 = require("./postcss");
const component_1 = require("../component");
const javascript_1 = require("../javascript");
const sample_file_1 = require("../sample-file");
const typescript_1 = require("../typescript");
const util_1 = require("../util");
const MINIMUM_NEXT_JS_NODE_VERSION = "16.14.0"; // https://nextjs.org/docs/pages/building-your-application/upgrading/version-13
/**
* Next.js project using JavaScript.
*
* @pjid nextjs
*/
class NextJsProject extends javascript_1.NodeProject {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsProject", version: "0.103.12" };
/**
* The directory in which source files reside.
*/
srcdir;
/**
* The directory in which app assets reside.
*/
assetsdir;
/**
* Setup Tailwind as a PostCSS plugin.
*
* @see https://tailwindcss.com/docs/installation
*/
tailwind;
constructor(options) {
super({
jest: false,
minNodeVersion: MINIMUM_NEXT_JS_NODE_VERSION,
workflowNodeVersion: "lts/*",
...options,
});
this.srcdir = options.srcdir ?? "pages";
this.assetsdir = options.assetsdir ?? "public";
this.tailwind = options.tailwind ?? true;
new NextComponent(this, { typescript: false, tailwind: this.tailwind });
// generate sample code in `pages` and `public` if these directories are empty or non-existent.
if (options.sampleCode ?? true) {
new NextSampleCode(this, {
fileExt: "js",
srcdir: this.srcdir,
assetsdir: this.assetsdir,
tailwind: this.tailwind,
});
}
}
}
exports.NextJsProject = NextJsProject;
/**
* Next.js project using TypeScript.
*
* @pjid nextjs-ts
*/
class NextJsTypeScriptProject extends typescript_1.TypeScriptAppProject {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextJsTypeScriptProject", version: "0.103.12" };
/**
* The directory in which source files reside.
*/
srcdir;
/**
* The directory in which app assets reside.
*/
assetsdir;
/**
* Setup Tailwind as a PostCSS plugin.
*
* @see https://tailwindcss.com/docs/installation
*/
tailwind;
constructor(options) {
const defaultOptions = {
srcdir: "pages",
eslint: false,
minNodeVersion: MINIMUM_NEXT_JS_NODE_VERSION,
jest: false,
workflowNodeVersion: "lts/*",
tsconfig: {
include: [
"**/*.ts",
"**/*.tsx",
"next-env.d.ts",
".next/types/**/*.ts",
],
compilerOptions: {
// required by Next.js - https://github.com/vercel/next.js/blob/canary/packages/create-next-app/templates/app/ts/tsconfig.json
esModuleInterop: true,
module: "esnext",
moduleResolution: javascript_1.TypeScriptModuleResolution.BUNDLER,
isolatedModules: true,
resolveJsonModule: true,
jsx: javascript_1.TypeScriptJsxMode.PRESERVE,
// recommended by Next.js
allowJs: true,
skipLibCheck: true,
forceConsistentCasingInFileNames: true,
noEmit: true,
lib: ["dom", "dom.iterable", "esnext"],
strict: true,
target: "es5",
incremental: true,
plugins: [
{
name: "next",
},
],
paths: {
"@/*": ["./*"],
},
},
},
// ts-config for projen default needs to be overridden to commonjs
// https://stackoverflow.com/questions/67089549/is-it-ok-to-use-module-commonjs-in-tsconfig-json-for-a-next-js-project-usi
tsconfigDev: {
compilerOptions: {
module: "commonjs",
},
},
};
// never generate default TypeScript sample code, since this class provides its own
super((0, util_1.deepMerge)([
defaultOptions,
options,
{ sampleCode: false },
]));
this.srcdir = options.srcdir ?? "pages";
this.assetsdir = options.assetsdir ?? "public";
this.tailwind = options.tailwind ?? true;
new NextComponent(this, { typescript: true, tailwind: this.tailwind });
// 'next build' command fails if tsconfig.json is immutable
if (this.tsconfig) {
this.tsconfig.file.readonly = false;
}
// generate sample code in `pages` and `public` if these directories are empty or non-existent.
if (options.sampleCode ?? true) {
new NextSampleCode(this, {
fileExt: "tsx",
srcdir: this.srcdir,
assetsdir: this.assetsdir,
tailwind: this.tailwind,
});
}
}
}
exports.NextJsTypeScriptProject = NextJsTypeScriptProject;
class NextComponent extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.web.NextComponent", version: "0.103.12" };
typescript;
tailwind;
constructor(project, options) {
super(project);
this.typescript = options.typescript ?? false;
this.tailwind = options.tailwind ?? true;
project.addDeps("next", "react", "react-dom");
if (this.typescript) {
project.addDevDeps("@types/react", "@types/react-dom");
}
if (this.tailwind) {
new postcss_1.PostCss(project, { tailwind: true });
}
// NextJS CLI commands, see: https://nextjs.org/docs/api-reference/cli
project.addTask("dev", {
description: "Starts the Next.js application in development mode",
execArgs: ["next", "dev"],
});
project.compileTask.execArgs(["next", "build"]);
project.addTask("export", {
description: "Exports the application for production deployment",
execArgs: ["next", "export"],
});
project.addTask("server", {
description: "Starts the Next.js application in production mode",
execArgs: ["next", "start"],
});
project.addTask("telemetry", {
description: "Checks the status of Next.js telemetry collection",
execArgs: ["next", "telemetry"],
});
project.npmignore?.exclude("# Next.js", "/.next/");
project.gitignore.exclude("# Next.js", "/.next/");
}
}
exports.NextComponent = NextComponent;
class NextSampleCode extends component_1.Component {
fileExt;
srcdir;
assetsdir;
tailwind;
constructor(project, options) {
super(project);
this.fileExt = options.fileExt ?? "js";
this.srcdir = options.srcdir;
this.assetsdir = options.assetsdir;
this.tailwind = options.tailwind;
const indexJs = [
'import Head from "next/head"',
"",
"export default function Home() {",
" return (",
' <div className="container">',
" <Head>",
" <title>Create Next App</title>",
" </Head>",
"",
" <main>",
' <h1 className="title">',
' Welcome to <a href="https://nextjs.org">Next.js!</a>',
" </h1>",
"",
' <p className="description">',
" Get started by editing <code>pages/index.js</code>",
" </p>",
"",
' <div className="grid">',
' <a href="https://nextjs.org/docs" className="card">',
" <h3>Documentation →</h3>",
" <p>Find in-depth information about Next.js features and API.</p>",
" </a>",
"",
' <a href="https://nextjs.org/learn" className="card">',
" <h3>Learn →</h3>",
" <p>Learn about Next.js in an interactive course with quizzes!</p>",
" </a>",
"",
" <a",
' href="https://github.com/vercel/next.js/tree/master/examples"',
' className="card"',
" >",
" <h3>Examples →</h3>",
" <p>Discover and deploy boilerplate example Next.js projects.</p>",
" </a>",
"",
" <a",
' href="https://vercel.com/import?filter=next.js&utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"',
' className="card"',
" >",
" <h3>Deploy →</h3>",
" <p>",
" Instantly deploy your Next.js site to a public URL with Vercel.",
" </p>",
" </a>",
" </div>",
" </main>",
"",
" <footer>",
" <a",
' href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"',
' target="_blank"',
' rel="noopener noreferrer"',
" >",
" Powered by Vercel",
' <img src="/vercel.svg" alt="Vercel Logo" className="logo" />',
" </a>",
" </footer>",
"",
" <style jsx>{`",
" .container {",
" min-height: 100vh;",
" padding: 0 0.5rem;",
" display: flex;",
" flex-direction: column;",
" justify-content: center;",
" align-items: center;",
" }",
"",
" main {",
" padding: 5rem 0;",
" flex: 1;",
" display: flex;",
" flex-direction: column;",
" justify-content: center;",
" align-items: center;",
" }",
"",
" footer {",
" width: 100%;",
" height: 100px;",
" border-top: 1px solid #eaeaea;",
" display: flex;",
" justify-content: center;",
" align-items: center;",
" }",
"",
" footer img {",
" margin-left: 0.5rem;",
" }",
"",
" footer a {",
" display: flex;",
" justify-content: center;",
" align-items: center;",
" }",
"",
" a {",
" color: inherit;",
" text-decoration: none;",
" }",
"",
" .title a {",
" color: #0070f3;",
" text-decoration: none;",
" }",
"",
" .title a:hover,",
" .title a:focus,",
" .title a:active {",
" text-decoration: underline;",
" }",
"",
" .title {",
" margin: 0;",
" line-height: 1.15;",
" font-size: 4rem;",
" }",
"",
" .title,",
" .description {",
" text-align: center;",
" }",
"",
" .description {",
" line-height: 1.5;",
" font-size: 1.5rem;",
" }",
"",
" code {",
" background: #fafafa;",
" border-radius: 5px;",
" padding: 0.75rem;",
" font-size: 1.1rem;",
" font-family: Menlo, Monaco, Lucida Console, Liberation Mono,",
" DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace;",
" }",
"",
" .grid {",
" display: flex;",
" align-items: center;",
" justify-content: center;",
" flex-wrap: wrap;",
"",
" max-width: 800px;",
" margin-top: 3rem;",
" }",
"",
" .card {",
" margin: 1rem;",
" flex-basis: 45%;",
" padding: 1.5rem;",
" text-align: left;",
" color: inherit;",
" text-decoration: none;",
" border: 1px solid #eaeaea;",
" border-radius: 10px;",
" transition: color 0.15s ease, border-color 0.15s ease;",
" }",
"",
" .card:hover,",
" .card:focus,",
" .card:active {",
" color: #0070f3;",
" border-color: #0070f3;",
" }",
"",
" .card h3 {",
" margin: 0 0 1rem 0;",
" font-size: 1.5rem;",
" }",
"",
" .card p {",
" margin: 0;",
" font-size: 1.25rem;",
" line-height: 1.5;",
" }",
"",
" .logo {",
" height: 1em;",
" }",
"",
" @media (max-width: 600px) {",
" .grid {",
" width: 100%;",
" flex-direction: column;",
" }",
" }",
" `}</style>",
"",
" <style jsx global>{`",
" html,",
" body {",
" padding: 0;",
" margin: 0;",
" font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto,",
" Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue,",
" sans-serif;",
" }",
"",
" * {",
" box-sizing: border-box;",
" }",
" `}</style>",
" </div>",
" )",
"}",
"",
];
if (this.tailwind) {
indexJs.unshift('import "tailwindcss/tailwind.css"');
}
const vercelSvg = [
'<svg width="283" height="64" viewBox="0 0 283 64" fill="none" ',
' xmlns="http://www.w3.org/2000/svg">',
' <path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>',
"</svg>",
];
new sample_file_1.SampleDir(project, this.srcdir, {
files: {
["index." + this.fileExt]: indexJs.join("\n"),
},
});
new sample_file_1.SampleDir(project, this.assetsdir, {
files: {
"vercel.svg": vercelSvg.join("\n"),
},
});
new sample_file_1.SampleFile(project, "next-env.d.ts", {
contents: [
'/// <reference types="next" />',
'/// <reference types="next/types/global" />',
'/// <reference types="next/image-types/global" />',
"// NOTE: This file should not be edited",
"// see https://nextjs.org/docs/basic-features/typescript for more information.",
"",
].join("\n"),
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWIvbmV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsdUNBQW9DO0FBQ3BDLDRDQUF5QztBQUV6Qyw4Q0FJdUI7QUFDdkIsZ0RBQXVEO0FBRXZELDhDQUFxRDtBQUNyRCxrQ0FBb0M7QUF3Q3BDLE1BQU0sNEJBQTRCLEdBQUcsU0FBUyxDQUFDLENBQUMsK0VBQStFO0FBRS9IOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWMsU0FBUSx3QkFBVzs7SUFDNUM7O09BRUc7SUFDYSxNQUFNLENBQVM7SUFFL0I7O09BRUc7SUFDYSxTQUFTLENBQVM7SUFFbEM7Ozs7T0FJRztJQUNhLFFBQVEsQ0FBVTtJQUVsQyxZQUFZLE9BQTZCO1FBQ3ZDLEtBQUssQ0FBQztZQUNKLElBQUksRUFBRSxLQUFLO1lBQ1gsY0FBYyxFQUFFLDRCQUE0QjtZQUM1QyxtQkFBbUIsRUFBRSxPQUFPO1lBQzVCLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO1FBRXpDLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLCtGQUErRjtRQUMvRixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFLENBQUM7WUFDL0IsSUFBSSxjQUFjLENBQUMsSUFBSSxFQUFFO2dCQUN2QixPQUFPLEVBQUUsSUFBSTtnQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNB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SyxFQUFFO2dCQUNMLFlBQVksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNuQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksd0JBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFO1lBQ3ZDLFFBQVEsRUFBRTtnQkFDUixnQ0FBZ0M7Z0JBQ2hDLDZDQUE2QztnQkFDN0MsbURBQW1EO2dCQUNuRCx5Q0FBeUM7Z0JBQ3pDLGdGQUFnRjtnQkFDaEYsRUFBRTthQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNiLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvc3RDc3MgfSBmcm9tIFwiLi9wb3N0Y3NzXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVQcm9qZWN0T3B0aW9ucyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQge1xuICBOb2RlUHJvamVjdCxcbiAgVHlwZVNjcmlwdEpzeE1vZGUsXG4gIFR5cGVTY3JpcHRNb2R1bGVSZXNvbHV0aW9uLFxufSBmcm9tIFwiLi4vamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgU2FtcGxlRGlyLCBTYW1wbGVGaWxlIH0gZnJvbSBcIi4uL3NhbXBsZS1maWxlXCI7XG5pbXBvcnQgdHlwZSB7IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBUeXBlU2NyaXB0QXBwUHJvamVjdCB9IGZyb20gXCIuLi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiLi4vdXRpbFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRKc0NvbW1vblByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFzc2V0cyBkaXJlY3RvcnlcbiAgICpcbiAgICogQGRlZmF1bHQgXCJwdWJsaWNcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZXR1cCBUYWlsd2luZCBDU1MgYXMgYSBQb3N0Q1NTIHBsdWdpbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2luc3RhbGxhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFpbHdpbmQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRKc1R5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1xuICBleHRlbmRzIE5leHRKc0NvbW1vblByb2plY3RPcHRpb25zLCBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0SnNQcm9qZWN0T3B0aW9uc1xuICBleHRlbmRzIE5leHRKc0NvbW1vblByb2plY3RPcHRpb25zLCBOb2RlUHJvamVjdE9wdGlvbnMge1xuICAvKipcbiAgICogVHlwZXNjcmlwdCBzb3VyY2VzIGRpcmVjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJzcmNcIlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBvbmUtdGltZSBzYW1wbGUgaW4gYHBhZ2VzL2AgYW5kIGBwdWJsaWMvYCBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgdGhlcmUuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZUNvZGU/OiBib29sZWFuO1xufVxuXG5jb25zdCBNSU5JTVVNX05FWFRfSlNfTk9ERV9WRVJTSU9OID0gXCIxNi4xNC4wXCI7IC8vIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2J1aWxkaW5nLXlvdXItYXBwbGljYXRpb24vdXBncmFkaW5nL3ZlcnNpb24tMTNcblxuLyoqXG4gKiBOZXh0LmpzIHByb2plY3QgdXNpbmcgSmF2YVNjcmlwdC5cbiAqXG4gKiBAcGppZCBuZXh0anNcbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRKc1Byb2plY3QgZXh0ZW5kcyBOb2RlUHJvamVjdCB7XG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHNvdXJjZSBmaWxlcyByZXNpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggYXBwIGFzc2V0cyByZXNpZGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzZXRzZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHVwIFRhaWx3aW5kIGFzIGEgUG9zdENTUyBwbHVnaW4uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly90YWlsd2luZGNzcy5jb20vZG9jcy9pbnN0YWxsYXRpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWlsd2luZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBOZXh0SnNQcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIGplc3Q6IGZhbHNlLFxuICAgICAgbWluTm9kZVZlcnNpb246IE1JTklNVU1fTkVYVF9KU19OT0RFX1ZFUlNJT04sXG4gICAgICB3b3JrZmxvd05vZGVWZXJzaW9uOiBcImx0cy8qXCIsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zcmNkaXIgPSBvcHRpb25zLnNyY2RpciA/PyBcInBhZ2VzXCI7XG4gICAgdGhpcy5hc3NldHNkaXIgPSBvcHRpb25zLmFzc2V0c2RpciA/PyBcInB1YmxpY1wiO1xuICAgIHRoaXMudGFpbHdpbmQgPSBvcHRpb25zLnRhaWx3aW5kID8/IHRydWU7XG5cbiAgICBuZXcgTmV4dENvbXBvbmVudCh0aGlzLCB7IHR5cGVzY3JpcHQ6IGZhbHNlLCB0YWlsd2luZDogdGhpcy50YWlsd2luZCB9KTtcblxuICAgIC8vIGdlbmVyYXRlIHNhbXBsZSBjb2RlIGluIGBwYWdlc2AgYW5kIGBwdWJsaWNgIGlmIHRoZXNlIGRpcmVjdG9yaWVzIGFyZSBlbXB0eSBvciBub24tZXhpc3RlbnQuXG4gICAgaWYgKG9wdGlvbnMuc2FtcGxlQ29kZSA/PyB0cnVlKSB7XG4gICAgICBuZXcgTmV4dFNhbXBsZUNvZGUodGhpcywge1xuICAgICAgICBmaWxlRXh0OiBcImpzXCIsXG4gICAgICAgIHNyY2RpcjogdGhpcy5zcmNkaXIsXG4gICAgICAgIGFzc2V0c2RpcjogdGhpcy5hc3NldHNkaXIsXG4gICAgICAgIHRhaWx3aW5kOiB0aGlzLnRhaWx3aW5kLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTmV4dC5qcyBwcm9qZWN0IHVzaW5nIFR5cGVTY3JpcHQuXG4gKlxuICogQHBqaWQgbmV4dGpzLXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0SnNUeXBlU2NyaXB0UHJvamVjdCBleHRlbmRzIFR5cGVTY3JpcHRBcHBQcm9qZWN0IHtcbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggc291cmNlIGZpbGVzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzcmNkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBhcHAgYXNzZXRzIHJlc2lkZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhc3NldHNkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogU2V0dXAgVGFpbHdpbmQgYXMgYSBQb3N0Q1NTIHBsdWdpbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3RhaWx3aW5kY3NzLmNvbS9kb2NzL2luc3RhbGxhdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhaWx3aW5kOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5leHRKc1R5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgc3JjZGlyOiBcInBhZ2VzXCIsXG4gICAgICBlc2xpbnQ6IGZhbHNlLFxuICAgICAgbWluTm9kZVZlcnNpb246IE1JTklNVU1fTkVYVF9KU19OT0RFX1ZFUlNJT04sXG4gICAgICBqZXN0OiBmYWxzZSxcbiAgICAgIHdvcmtmbG93Tm9kZVZlcnNpb246IFwibHRzLypcIixcbiAgICAgIHRzY29uZmlnOiB7XG4gICAgICAgIGluY2x1ZGU6IFtcbiAgICAgICAgICBcIioqLyoudHNcIixcbiAgICAgICAgICBcIioqLyoudHN4XCIsXG4gICAgICAgICAgXCJuZXh0LWVudi5kLnRzXCIsXG4gICAgICAgICAgXCIubmV4dC90eXBlcy8qKi8qLnRzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIC8vIHJlcXVpcmVkIGJ5IE5leHQuanMgLSBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL25leHQuanMvYmxvYi9jYW5hcnkvcGFja2FnZXMvY3JlYXRlLW5leHQtYXBwL3RlbXBsYXRlcy9hcHAvdHMvdHNjb25maWcuanNvblxuICAgICAgICAgIGVzTW9kdWxlSW50ZXJvcDogdHJ1ZSxcbiAgICAgICAgICBtb2R1bGU6IFwiZXNuZXh0XCIsXG4gICAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogVHlwZVNjcmlwdE1vZHVsZVJlc29sdXRpb24uQlVORExFUixcbiAgICAgICAgICBpc29sYXRlZE1vZHVsZXM6IHRydWUsXG4gICAgICAgICAgcmVzb2x2ZUpzb25Nb2R1bGU6IHRydWUsXG4gICAgICAgICAganN4OiBUeXBlU2NyaXB0SnN4TW9kZS5QUkVTRVJWRSxcblxuICAgICAgICAgIC8vIHJlY29tbWVuZGVkIGJ5IE5leHQuanNcbiAgICAgICAgICBhbGxvd0pzOiB0cnVlLFxuICAgICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcbiAgICAgICAgICBmb3JjZUNvbnNpc3RlbnRDYXNpbmdJbkZpbGVOYW1lczogdHJ1ZSxcbiAgICAgICAgICBub0VtaXQ6IHRydWUsXG4gICAgICAgICAgbGliOiBbXCJkb21cIiwgXCJkb20uaXRlcmFibGVcIiwgXCJlc25leHRcIl0sXG4gICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgIHRhcmdldDogXCJlczVcIixcbiAgICAgICAgICBpbmNyZW1lbnRhbDogdHJ1ZSxcbiAgICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6IFwibmV4dFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHBhdGhzOiB7XG4gICAgICAgICAgICBcIkAvKlwiOiBbXCIuLypcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyB0cy1jb25maWcgZm9yIHByb2plbiBkZWZhdWx0IG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4gdG8gY29tbW9uanNcbiAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY3MDg5NTQ5L2lzLWl0LW9rLXRvLXVzZS1tb2R1bGUtY29tbW9uanMtaW4tdHNjb25maWctanNvbi1mb3ItYS1uZXh0LWpzLXByb2plY3QtdXNpXG4gICAgICB0c2NvbmZpZ0Rldjoge1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBtb2R1bGU6IFwiY29tbW9uanNcIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIG5ldmVyIGdlbmVyYXRlIGRlZmF1bHQgVHlwZVNjcmlwdCBzYW1wbGUgY29kZSwgc2luY2UgdGhpcyBjbGFzcyBwcm92aWRlcyBpdHMgb3duXG4gICAgc3VwZXIoXG4gICAgICBkZWVwTWVyZ2UoW1xuICAgICAgICBkZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgeyBzYW1wbGVDb2RlOiBmYWxzZSB9LFxuICAgICAgXSkgYXMgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zLFxuICAgICk7XG5cbiAgICB0aGlzLnNyY2RpciA9IG9wdGlvbnMuc3JjZGlyID8/IFwicGFnZXNcIjtcbiAgICB0aGlzLmFzc2V0c2RpciA9IG9wdGlvbnMuYXNzZXRzZGlyID8/IFwicHVibGljXCI7XG4gICAgdGhpcy50YWlsd2luZCA9IG9wdGlvbnMudGFpbHdpbmQgPz8gdHJ1ZTtcblxuICAgIG5ldyBOZXh0Q29tcG9uZW50KHRoaXMsIHsgdHlwZXNjcmlwdDogdHJ1ZSwgdGFpbHdpbmQ6IHRoaXMudGFpbHdpbmQgfSk7XG5cbiAgICAvLyAnbmV4dCBidWlsZCcgY29tbWFuZCBmYWlscyBpZiB0c2NvbmZpZy5qc29uIGlzIGltbXV0YWJsZVxuICAgIGlmICh0aGlzLnRzY29uZmlnKSB7XG4gICAgICB0aGlzLnRzY29uZmlnLmZpbGUucmVhZG9ubHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBnZW5lcmF0ZSBzYW1wbGUgY29kZSBpbiBgcGFnZXNgIGFuZCBgcHVibGljYCBpZiB0aGVzZSBkaXJlY3RvcmllcyBhcmUgZW1wdHkgb3Igbm9uLWV4aXN0ZW50LlxuICAgIGlmIChvcHRpb25zLnNhbXBsZUNvZGUgPz8gdHJ1ZSkge1xuICAgICAgbmV3IE5leHRTYW1wbGVDb2RlKHRoaXMsIHtcbiAgICAgICAgZmlsZUV4dDogXCJ0c3hcIixcbiAgICAgICAgc3JjZGlyOiB0aGlzLnNyY2RpcixcbiAgICAgICAgYXNzZXRzZGlyOiB0aGlzLmFzc2V0c2RpcixcbiAgICAgICAgdGFpbHdpbmQ6IHRoaXMudGFpbHdpbmQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0Q29tcG9uZW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFwcGx5IG9wdGlvbnMgc3BlY2lmaWMgZm9yIFR5cGVTY3JpcHQgTmV4dC5qcyBwcm9qZWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHR5cGVzY3JpcHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXR1cCBUYWlsd2luZCBhcyBhIFBvc3RDU1MgcGx1Z2luLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vdGFpbHdpbmRjc3MuY29tL2RvY3MvaW5zdGFsbGF0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHRhaWx3aW5kPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHR5cGVzY3JpcHQ6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFpbHdpbmQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM6IE5leHRDb21wb25lbnRPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLnR5cGVzY3JpcHQgPSBvcHRpb25zLnR5cGVzY3JpcHQgPz8gZmFsc2U7XG4gICAgdGhpcy50YWlsd2luZCA9IG9wdGlvbnMudGFpbHdpbmQgPz8gdHJ1ZTtcblxuICAgIHByb2plY3QuYWRkRGVwcyhcIm5leHRcIiwgXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiKTtcbiAgICBpZiAodGhpcy50eXBlc2NyaXB0KSB7XG4gICAgICBwcm9qZWN0LmFkZERldkRlcHMoXCJAdHlwZXMvcmVhY3RcIiwgXCJAdHlwZXMvcmVhY3QtZG9tXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YWlsd2luZCkge1xuICAgICAgbmV3IFBvc3RDc3MocHJvamVjdCwgeyB0YWlsd2luZDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvLyBOZXh0SlMgQ0xJIGNvbW1hbmRzLCBzZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwaS1yZWZlcmVuY2UvY2xpXG4gICAgcHJvamVjdC5hZGRUYXNrKFwiZGV2XCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlN0YXJ0cyB0aGUgTmV4dC5qcyBhcHBsaWNhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlXCIsXG4gICAgICBleGVjQXJnczogW1wibmV4dFwiLCBcImRldlwiXSxcbiAgICB9KTtcblxuICAgIHByb2plY3QuY29tcGlsZVRhc2suZXhlY0FyZ3MoW1wibmV4dFwiLCBcImJ1aWxkXCJdKTtcblxuICAgIHByb2plY3QuYWRkVGFzayhcImV4cG9ydFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJFeHBvcnRzIHRoZSBhcHBsaWNhdGlvbiBmb3IgcHJvZHVjdGlvbiBkZXBsb3ltZW50XCIsXG4gICAgICBleGVjQXJnczogW1wibmV4dFwiLCBcImV4cG9ydFwiXSxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkVGFzayhcInNlcnZlclwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJTdGFydHMgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaW4gcHJvZHVjdGlvbiBtb2RlXCIsXG4gICAgICBleGVjQXJnczogW1wibmV4dFwiLCBcInN0YXJ0XCJdLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5hZGRUYXNrKFwidGVsZW1ldHJ5XCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkNoZWNrcyB0aGUgc3RhdHVzIG9mIE5leHQuanMgdGVsZW1ldHJ5IGNvbGxlY3Rpb25cIixcbiAgICAgIGV4ZWNBcmdzOiBbXCJuZXh0XCIsIFwidGVsZW1ldHJ5XCJdLFxuICAgIH0pO1xuXG4gICAgcHJvamVjdC5ucG1pZ25vcmU/LmV4Y2x1ZGUoXCIjIE5leHQuanNcIiwgXCIvLm5leHQvXCIpO1xuICAgIHByb2plY3QuZ2l0aWdub3JlLmV4Y2x1ZGUoXCIjIE5leHQuanNcIiwgXCIvLm5leHQvXCIpO1xuICB9XG59XG5cbmludGVyZmFjZSBOZXh0U2FtcGxlQ29kZU9wdGlvbnMge1xuICAvKipcbiAgICogRmlsZSBleHRlbnNpb24gZm9yIHNhbXBsZSBqYXZhc2NyaXB0IGNvZGUgdG8gYmUgc2F2ZWQgYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwianNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZUV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpcmVjdG9yeSBpbiB3aGljaCBOZXh0LmpzIHBhZ2VzIGFyZSBkZWNsYXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIGFwcCBhc3NldHMgcmVzaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzZGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHVwIFRhaWx3aW5kIGFzIGEgUG9zdENTUyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSB0YWlsd2luZDogYm9vbGVhbjtcbn1cblxuY2xhc3MgTmV4dFNhbXBsZUNvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVFeHQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhc3NldHNkaXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0YWlsd2luZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBOb2RlUHJvamVjdCwgb3B0aW9uczogTmV4dFNhbXBsZUNvZGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLmZpbGVFeHQgPSBvcHRpb25zLmZpbGVFeHQgPz8gXCJqc1wiO1xuICAgIHRoaXMuc3JjZGlyID0gb3B0aW9ucy5zcmNkaXI7XG4gICAgdGhpcy5hc3NldHNkaXIgPSBvcHRpb25zLmFzc2V0c2RpcjtcbiAgICB0aGlzLnRhaWx3aW5kID0gb3B0aW9ucy50YWlsd2luZDtcblxuICAgIGNvbnN0IGluZGV4SnMgPSBbXG4gICAgICAnaW1wb3J0IEhlYWQgZnJvbSBcIm5leHQvaGVhZFwiJyxcbiAgICAgIFwiXCIsXG4gICAgICBcImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEhvbWUoKSB7XCIsXG4gICAgICBcIiAgcmV0dXJuIChcIixcbiAgICAgICcgICAgPGRpdiBjbGFzc05hbWU9XCJjb250YWluZXJcIj4nLFxuICAgICAgXCIgICAgICA8SGVhZD5cIixcbiAgICAgIFwiICAgICAgICA8dGl0bGU+Q3JlYXRlIE5leHQgQXBwPC90aXRsZT5cIixcbiAgICAgIFwiICAgICAgPC9IZWFkPlwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgPG1haW4+XCIsXG4gICAgICAnICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGl0bGVcIj4nLFxuICAgICAgJyAgICAgICAgICBXZWxjb21lIHRvIDxhIGhyZWY9XCJodHRwczovL25leHRqcy5vcmdcIj5OZXh0LmpzITwvYT4nLFxuICAgICAgXCIgICAgICAgIDwvaDE+XCIsXG4gICAgICBcIlwiLFxuICAgICAgJyAgICAgICAgPHAgY2xhc3NOYW1lPVwiZGVzY3JpcHRpb25cIj4nLFxuICAgICAgXCIgICAgICAgICAgR2V0IHN0YXJ0ZWQgYnkgZWRpdGluZyA8Y29kZT5wYWdlcy9pbmRleC5qczwvY29kZT5cIixcbiAgICAgIFwiICAgICAgICA8L3A+XCIsXG4gICAgICBcIlwiLFxuICAgICAgJyAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkXCI+JyxcbiAgICAgICcgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzXCIgY2xhc3NOYW1lPVwiY2FyZFwiPicsXG4gICAgICBcIiAgICAgICAgICAgIDxoMz5Eb2N1bWVudGF0aW9uICZyYXJyOzwvaDM+XCIsXG4gICAgICBcIiAgICAgICAgICAgIDxwPkZpbmQgaW4tZGVwdGggaW5mb3JtYXRpb24gYWJvdXQgTmV4dC5qcyBmZWF0dXJlcyBhbmQgQVBJLjwvcD5cIixcbiAgICAgIFwiICAgICAgICAgIDwvYT5cIixcbiAgICAgIFwiXCIsXG4gICAgICAnICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL25leHRqcy5vcmcvbGVhcm5cIiBjbGFzc05hbWU9XCJjYXJkXCI+JyxcbiAgICAgIFwiICAgICAgICAgICAgPGgzPkxlYXJuICZyYXJyOzwvaDM+XCIsXG4gICAgICBcIiAgICAgICAgICAgIDxwPkxlYXJuIGFib3V0IE5leHQuanMgaW4gYW4gaW50ZXJhY3RpdmUgY291cnNlIHdpdGggcXVpenplcyE8L3A+XCIsXG4gICAgICBcIiAgICAgICAgICA8L2E+XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgICAgPGFcIixcbiAgICAgICcgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL3RyZWUvbWFzdGVyL2V4YW1wbGVzXCInLFxuICAgICAgJyAgICAgICAgICAgIGNsYXNzTmFtZT1cImNhcmRcIicsXG4gICAgICBcIiAgICAgICAgICA+XCIsXG4gICAgICBcIiAgICAgICAgICAgIDxoMz5FeGFtcGxlcyAmcmFycjs8L2gzPlwiLFxuICAgICAgXCIgICAgICAgICAgICA8cD5EaXNjb3ZlciBhbmQgZGVwbG95IGJvaWxlcnBsYXRlIGV4YW1wbGUgTmV4dC5qcyBwcm9qZWN0cy48L3A+XCIsXG4gICAgICBcIiAgICAgICAgICA8L2E+XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgICAgPGFcIixcbiAgICAgICcgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly92ZXJjZWwuY29tL2ltcG9ydD9maWx0ZXI9bmV4dC5qcyZ1dG1fc291cmNlPWNyZWF0ZS1uZXh0LWFwcCZ1dG1fbWVkaXVtPWRlZmF1bHQtdGVtcGxhdGUmdXRtX2NhbXBhaWduPWNyZWF0ZS1uZXh0LWFwcFwiJyxcbiAgICAgICcgICAgICAgICAgICBjbGFzc05hbWU9XCJjYXJkXCInLFxuICAgICAgXCIgICAgICAgICAgPlwiLFxuICAgICAgXCIgICAgICAgICAgICA8aDM+RGVwbG95ICZyYXJyOzwvaDM+XCIsXG4gICAgICBcIiAgICAgICAgICAgIDxwPlwiLFxuICAgICAgXCIgICAgICAgICAgICAgIEluc3RhbnRseSBkZXBsb3kgeW91ciBOZXh0LmpzIHNpdGUgdG8gYSBwdWJsaWMgVVJMIHdpdGggVmVyY2VsLlwiLFxuICAgICAgXCIgICAgICAgICAgICA8L3A+XCIsXG4gICAgICBcIiAgICAgICAgICA8L2E+XCIsXG4gICAgICBcIiAgICAgICAgPC9kaXY+XCIsXG4gICAgICBcIiAgICAgIDwvbWFpbj5cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgIDxmb290ZXI+XCIsXG4gICAgICBcIiAgICAgICAgPGFcIixcbiAgICAgICcgICAgICAgICAgaHJlZj1cImh0dHBzOi8vdmVyY2VsLmNvbT91dG1fc291cmNlPWNyZWF0ZS1uZXh0LWFwcCZ1dG1fbWVkaXVtPWRlZmF1bHQtdGVtcGxhdGUmdXRtX2NhbXBhaWduPWNyZWF0ZS1uZXh0LWFwcFwiJyxcbiAgICAgICcgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCInLFxuICAgICAgJyAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCInLFxuICAgICAgXCIgICAgICAgID5cIixcbiAgICAgIFwiICAgICAgICAgIFBvd2VyZWQgYnkgVmVyY2VsXCIsXG4gICAgICAnICAgICAgICAgIDxpbWcgc3JjPVwiL3ZlcmNlbC5zdmdcIiBhbHQ9XCJWZXJjZWwgTG9nb1wiIGNsYXNzTmFtZT1cImxvZ29cIiAvPicsXG4gICAgICBcIiAgICAgICAgPC9hPlwiLFxuICAgICAgXCIgICAgICA8L2Zvb3Rlcj5cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgIDxzdHlsZSBqc3g+e2BcIixcbiAgICAgIFwiICAgICAgICAuY29udGFpbmVyIHtcIixcbiAgICAgIFwiICAgICAgICAgIG1pbi1oZWlnaHQ6IDEwMHZoO1wiLFxuICAgICAgXCIgICAgICAgICAgcGFkZGluZzogMCAwLjVyZW07XCIsXG4gICAgICBcIiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1wiLFxuICAgICAgXCIgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIixcbiAgICAgIFwiICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1wiLFxuICAgICAgXCIgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIG1haW4ge1wiLFxuICAgICAgXCIgICAgICAgICAgcGFkZGluZzogNXJlbSAwO1wiLFxuICAgICAgXCIgICAgICAgICAgZmxleDogMTtcIixcbiAgICAgIFwiICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XCIsXG4gICAgICBcIiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiLFxuICAgICAgXCIgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCIsXG4gICAgICBcIiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1wiLFxuICAgICAgXCIgICAgICAgIH1cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgICAgZm9vdGVyIHtcIixcbiAgICAgIFwiICAgICAgICAgIHdpZHRoOiAxMDAlO1wiLFxuICAgICAgXCIgICAgICAgICAgaGVpZ2h0OiAxMDBweDtcIixcbiAgICAgIFwiICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWFlYWVhO1wiLFxuICAgICAgXCIgICAgICAgICAgZGlzcGxheTogZmxleDtcIixcbiAgICAgIFwiICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1wiLFxuICAgICAgXCIgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIGZvb3RlciBpbWcge1wiLFxuICAgICAgXCIgICAgICAgICAgbWFyZ2luLWxlZnQ6IDAuNXJlbTtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIGZvb3RlciBhIHtcIixcbiAgICAgIFwiICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XCIsXG4gICAgICBcIiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIixcbiAgICAgIFwiICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICBhIHtcIixcbiAgICAgIFwiICAgICAgICAgIGNvbG9yOiBpbmhlcml0O1wiLFxuICAgICAgXCIgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1wiLFxuICAgICAgXCIgICAgICAgIH1cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgICAgLnRpdGxlIGEge1wiLFxuICAgICAgXCIgICAgICAgICAgY29sb3I6ICMwMDcwZjM7XCIsXG4gICAgICBcIiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAudGl0bGUgYTpob3ZlcixcIixcbiAgICAgIFwiICAgICAgICAudGl0bGUgYTpmb2N1cyxcIixcbiAgICAgIFwiICAgICAgICAudGl0bGUgYTphY3RpdmUge1wiLFxuICAgICAgXCIgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAudGl0bGUge1wiLFxuICAgICAgXCIgICAgICAgICAgbWFyZ2luOiAwO1wiLFxuICAgICAgXCIgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTU7XCIsXG4gICAgICBcIiAgICAgICAgICBmb250LXNpemU6IDRyZW07XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAudGl0bGUsXCIsXG4gICAgICBcIiAgICAgICAgLmRlc2NyaXB0aW9uIHtcIixcbiAgICAgIFwiICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIC5kZXNjcmlwdGlvbiB7XCIsXG4gICAgICBcIiAgICAgICAgICBsaW5lLWhlaWdodDogMS41O1wiLFxuICAgICAgXCIgICAgICAgICAgZm9udC1zaXplOiAxLjVyZW07XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICBjb2RlIHtcIixcbiAgICAgIFwiICAgICAgICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7XCIsXG4gICAgICBcIiAgICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7XCIsXG4gICAgICBcIiAgICAgICAgICBwYWRkaW5nOiAwLjc1cmVtO1wiLFxuICAgICAgXCIgICAgICAgICAgZm9udC1zaXplOiAxLjFyZW07XCIsXG4gICAgICBcIiAgICAgICAgICBmb250LWZhbWlseTogTWVubG8sIE1vbmFjbywgTHVjaWRhIENvbnNvbGUsIExpYmVyYXRpb24gTW9ubyxcIixcbiAgICAgIFwiICAgICAgICAgICAgRGVqYVZ1IFNhbnMgTW9ubywgQml0c3RyZWFtIFZlcmEgU2FucyBNb25vLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlO1wiLFxuICAgICAgXCIgICAgICAgIH1cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgICAgLmdyaWQge1wiLFxuICAgICAgXCIgICAgICAgICAgZGlzcGxheTogZmxleDtcIixcbiAgICAgIFwiICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XCIsXG4gICAgICBcIiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIixcbiAgICAgIFwiICAgICAgICAgIGZsZXgtd3JhcDogd3JhcDtcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgICAgICBtYXgtd2lkdGg6IDgwMHB4O1wiLFxuICAgICAgXCIgICAgICAgICAgbWFyZ2luLXRvcDogM3JlbTtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIC5jYXJkIHtcIixcbiAgICAgIFwiICAgICAgICAgIG1hcmdpbjogMXJlbTtcIixcbiAgICAgIFwiICAgICAgICAgIGZsZXgtYmFzaXM6IDQ1JTtcIixcbiAgICAgIFwiICAgICAgICAgIHBhZGRpbmc6IDEuNXJlbTtcIixcbiAgICAgIFwiICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XCIsXG4gICAgICBcIiAgICAgICAgICBjb2xvcjogaW5oZXJpdDtcIixcbiAgICAgIFwiICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcIixcbiAgICAgIFwiICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYWVhZWE7XCIsXG4gICAgICBcIiAgICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1wiLFxuICAgICAgXCIgICAgICAgICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZSwgYm9yZGVyLWNvbG9yIDAuMTVzIGVhc2U7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAuY2FyZDpob3ZlcixcIixcbiAgICAgIFwiICAgICAgICAuY2FyZDpmb2N1cyxcIixcbiAgICAgIFwiICAgICAgICAuY2FyZDphY3RpdmUge1wiLFxuICAgICAgXCIgICAgICAgICAgY29sb3I6ICMwMDcwZjM7XCIsXG4gICAgICBcIiAgICAgICAgICBib3JkZXItY29sb3I6ICMwMDcwZjM7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAuY2FyZCBoMyB7XCIsXG4gICAgICBcIiAgICAgICAgICBtYXJnaW46IDAgMCAxcmVtIDA7XCIsXG4gICAgICBcIiAgICAgICAgICBmb250LXNpemU6IDEuNXJlbTtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIC5jYXJkIHAge1wiLFxuICAgICAgXCIgICAgICAgICAgbWFyZ2luOiAwO1wiLFxuICAgICAgXCIgICAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1wiLFxuICAgICAgXCIgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcIixcbiAgICAgIFwiICAgICAgICB9XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIgICAgICAgIC5sb2dvIHtcIixcbiAgICAgIFwiICAgICAgICAgIGhlaWdodDogMWVtO1wiLFxuICAgICAgXCIgICAgICAgIH1cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiAgICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7XCIsXG4gICAgICBcIiAgICAgICAgICAuZ3JpZCB7XCIsXG4gICAgICBcIiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1wiLFxuICAgICAgXCIgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiLFxuICAgICAgXCIgICAgICAgICAgfVwiLFxuICAgICAgXCIgICAgICAgIH1cIixcbiAgICAgIFwiICAgICAgYH08L3N0eWxlPlwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgPHN0eWxlIGpzeCBnbG9iYWw+e2BcIixcbiAgICAgIFwiICAgICAgICBodG1sLFwiLFxuICAgICAgXCIgICAgICAgIGJvZHkge1wiLFxuICAgICAgXCIgICAgICAgICAgcGFkZGluZzogMDtcIixcbiAgICAgIFwiICAgICAgICAgIG1hcmdpbjogMDtcIixcbiAgICAgIFwiICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFNlZ29lIFVJLCBSb2JvdG8sXCIsXG4gICAgICBcIiAgICAgICAgICAgIE94eWdlbiwgVWJ1bnR1LCBDYW50YXJlbGwsIEZpcmEgU2FucywgRHJvaWQgU2FucywgSGVsdmV0aWNhIE5ldWUsXCIsXG4gICAgICBcIiAgICAgICAgICAgIHNhbnMtc2VyaWY7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiICAgICAgICAqIHtcIixcbiAgICAgIFwiICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XCIsXG4gICAgICBcIiAgICAgICAgfVwiLFxuICAgICAgXCIgICAgICBgfTwvc3R5bGU+XCIsXG4gICAgICBcIiAgICA8L2Rpdj5cIixcbiAgICAgIFwiICApXCIsXG4gICAgICBcIn1cIixcbiAgICAgIFwiXCIsXG4gICAgXTtcblxuICAgIGlmICh0aGlzLnRhaWx3aW5kKSB7XG4gICAgICBpbmRleEpzLnVuc2hpZnQoJ2ltcG9ydCBcInRhaWx3aW5kY3NzL3RhaWx3aW5kLmNzc1wiJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyY2VsU3ZnID0gW1xuICAgICAgJzxzdmcgd2lkdGg9XCIyODNcIiBoZWlnaHQ9XCI2NFwiIHZpZXdCb3g9XCIwIDAgMjgzIDY0XCIgZmlsbD1cIm5vbmVcIiAnLFxuICAgICAgJyAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+JyxcbiAgICAgICcgICAgPHBhdGggZD1cIk0xNDEuMDQgMTZjLTExLjA0IDAtMTkgNy4yLTE5IDE4czguOTYgMTggMjAgMThjNi42NyAwIDEyLjU1LTIuNjQgMTYuMTktNy4wOWwtNy42NS00LjQyYy0yLjAyIDIuMjEtNS4wOSAzLjUtOC41NCAzLjUtNC43OSAwLTguODYtMi41LTEwLjM3LTYuNWgyOC4wMmMuMjItMS4xMi4zNS0yLjI4LjM1LTMuNSAwLTEwLjc5LTcuOTYtMTcuOTktMTktMTcuOTl6bS05LjQ2IDE0LjVjMS4yNS0zLjk5IDQuNjctNi41IDkuNDUtNi41IDQuNzkgMCA4LjIxIDIuNTEgOS40NSA2LjVoLTE4Ljl6TTI0OC43MiAxNmMtMTEuMDQgMC0xOSA3LjItMTkgMThzOC45NiAxOCAyMCAxOGM2LjY3IDAgMTIuNTUtMi42NCAxNi4xOS03LjA5bC03LjY1LTQuNDJjLTIuMDIgMi4yMS01LjA5IDMuNS04LjU0IDMuNS00Ljc5IDAtOC44Ni0yLjUtMTAuMzctNi41aDI4LjAyYy4yMi0xLjEyLjM1LTIuMjguMzUtMy41IDAtMTAuNzktNy45Ni0xNy45OS0xOS0xNy45OXptLTkuNDUgMTQuNWMxLjI1LTMuOTkgNC42Ny02LjUgOS40NS02LjUgNC43OSAwIDguMjEgMi41MSA5LjQ1IDYuNWgtMTguOXpNMjAwLjI0IDM0YzAgNiAzLjkyIDEwIDEwIDEwIDQuMTIgMCA3LjIxLTEuODcgOC44LTQuOTJsNy42OCA0LjQzYy0zLjE4IDUuMy05LjE0IDguNDktMTYuNDggOC40OS0xMS4wNSAwLTE5LTcuMi0xOS0xOHM3Ljk2LTE4IDE5LTE4YzcuMzQgMCAxMy4yOSAzLjE5IDE2LjQ4IDguNDlsLTcuNjggNC40M2MtMS41OS0zLjA1LTQuNjgtNC45Mi04LjgtNC45Mi02LjA3IDAtMTAgNC0xMCAxMHptODIuNDgtMjl2NDZoLTlWNWg5ek0zNi45NSAwTDczLjkgNjRIMEwzNi45NSAwem05Mi4zOCA1bC0yNy43MSA0OEw3My45MSA1SDg0LjNsMTcuMzIgMzAgMTcuMzItMzBoMTAuMzl6bTU4LjkxIDEydjkuNjljLTEtLjI5LTIuMDYtLjQ5LTMuMi0uNDktNS44MSAwLTEwIDQtMTAgMTBWNTFoLTlWMTdoOXY5LjJjMC01LjA4IDUuOTEtOS4yIDEzLjItOS4yelwiIGZpbGw9XCIjMDAwXCIvPicsXG4gICAgICBcIjwvc3ZnPlwiLFxuICAgIF07XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHRoaXMuc3JjZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBbXCJpbmRleC5cIiArIHRoaXMuZmlsZUV4dF06IGluZGV4SnMuam9pbihcIlxcblwiKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIHRoaXMuYXNzZXRzZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcInZlcmNlbC5zdmdcIjogdmVyY2VsU3ZnLmpvaW4oXCJcXG5cIiksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgXCJuZXh0LWVudi5kLnRzXCIsIHtcbiAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICcvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5leHRcIiAvPicsXG4gICAgICAgICcvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIm5leHQvdHlwZXMvZ2xvYmFsXCIgLz4nLFxuICAgICAgICAnLy8vIDxyZWZlcmVuY2UgdHlwZXM9XCJuZXh0L2ltYWdlLXR5cGVzL2dsb2JhbFwiIC8+JyxcbiAgICAgICAgXCIvLyBOT1RFOiBUaGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBlZGl0ZWRcIixcbiAgICAgICAgXCIvLyBzZWUgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYmFzaWMtZmVhdHVyZXMvdHlwZXNjcmlwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cIixcbiAgICAgICAgXCJcIixcbiAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICB9KTtcbiAgfVxufVxuIl19