@macedon-technologies/batman 1.27.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +10 -10
- package/API.md +4 -2
- package/lib/BatmanProject.js +1 -1
- package/lib/BootcampProject.js +1 -1
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/SoftwareFactoryBootstrap.d.ts +10 -0
- package/lib/SoftwareFactoryBootstrap.js +101 -0
- package/lib/SoftwareFactoryFiles.d.ts +4 -2
- package/lib/SoftwareFactoryFiles.js +10 -8
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/ViteReactProject.js +471 -74
- package/lib/WorkflowAutoDiscover.js +1 -1
- package/lib/utils.js +26 -10
- package/package.json +1 -1
- package/swamp-bootstrap/pull-extensions.ts +68 -0
- package/swamp-bootstrap/tsconfig.json +13 -0
|
@@ -39,7 +39,7 @@ const fs = __importStar(require("fs"));
|
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const projen_1 = require("projen");
|
|
41
41
|
class WorkflowAutoDiscover extends projen_1.Component {
|
|
42
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.
|
|
42
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.28.0" };
|
|
43
43
|
constructor(project) {
|
|
44
44
|
super(project);
|
|
45
45
|
}
|
package/lib/utils.js
CHANGED
|
@@ -127,8 +127,8 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
127
127
|
'| `web/src/App.tsx` | Root application component |',
|
|
128
128
|
'| `web/src/App.css` / `web/src/index.css` | Base stylesheets (Tailwind CSS v4) |',
|
|
129
129
|
'| `web/src/config.ts` | `useConfig()` hook — loads runtime config from `config.json` |',
|
|
130
|
-
'| `web/src/services/
|
|
131
|
-
'| `web/src/
|
|
130
|
+
'| `web/src/services/ApiService.ts` | `useApiQuery()` / `useApiMutation()` — authenticated API hooks, cached per path |',
|
|
131
|
+
'| `web/src/helpers/` | `requests.ts`, `HttpError.ts`, `errors.ts`, `retry.ts` — the request and error helpers `ApiService` is built on |',
|
|
132
132
|
'| `web/public/config.json` | Runtime config (API base URL, Clerk publishable key) |',
|
|
133
133
|
...(e2eTesting ? [
|
|
134
134
|
'| `web/playwright.config.ts` | Playwright e2e config — see `web/e2e/README.md` |',
|
|
@@ -158,7 +158,7 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
158
158
|
'| `web/src/App.tsx` | Build your UI here |',
|
|
159
159
|
'| `web/src/App.css` / `web/src/index.css` | Style your application |',
|
|
160
160
|
'| `web/src/main.tsx` | Adjust top-level providers or routing |',
|
|
161
|
-
'| `web/src/services/
|
|
161
|
+
'| `web/src/services/ApiService.ts` / `web/src/helpers/` | Add API service hooks alongside `ApiService.ts`, or adjust the request helpers |',
|
|
162
162
|
'| `web/public/config.json` | Update for local development (API URL, Clerk key) |',
|
|
163
163
|
...(e2eTesting ? [
|
|
164
164
|
'| `web/playwright.config.ts` / `web/e2e/` | Playwright e2e suite — extend it with real flows; see `web/e2e/README.md` |',
|
|
@@ -183,12 +183,12 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
183
183
|
'| `web/tsconfig.json` / `web/tsconfig.app.json` / `web/tsconfig.node.json` | TypeScript configuration |',
|
|
184
184
|
'| `web/src/vite-env.d.ts` | Vite type declarations |',
|
|
185
185
|
'| `web/src/config.ts` | Runtime config hook — shape driven by `.projenrc.ts` |',
|
|
186
|
-
'| `web/src/services/BaseService.ts` | Base authenticated fetch hook |',
|
|
187
186
|
'| `.github/CODEOWNERS` | Code ownership policy |',
|
|
188
187
|
'| `.github/workflows/*.yml` | All CI/CD workflows |',
|
|
189
188
|
'| `architecture-rules/check.ts`, `tsconfig.json`, `README.md` | Architecture rule engine |',
|
|
190
189
|
'| `attestation/manifest.ts`, `verify.ts`, `tsconfig.json` | PR attestation mechanism |',
|
|
191
190
|
'| `openspec-gates/check-tasks-complete.ts`, `tsconfig.json` | OpenSpec task-completion gate |',
|
|
191
|
+
'| `swamp-bootstrap/pull-extensions.ts`, `tsconfig.json` | Pulls swamp extensions at their pinned versions |',
|
|
192
192
|
'| `workflows/workflow-*.yaml` | Swamp workflows the software factory runs |',
|
|
193
193
|
'',
|
|
194
194
|
'> **Tip:** Files with a `~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen". ~~` header are managed files.',
|
|
@@ -205,12 +205,28 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
205
205
|
'',
|
|
206
206
|
'`swamp init` runs automatically as part of `install`/`install:ci` (a silent',
|
|
207
207
|
'no-op if `swamp` isn\'t on PATH, e.g. in CI), so the repo stays initialized',
|
|
208
|
-
'without a separate step.
|
|
209
|
-
'
|
|
208
|
+
'without a separate step.',
|
|
209
|
+
'',
|
|
210
|
+
'`swampVersion` in `.swamp.yaml` is the minimum swamp CLI the repo needs: the',
|
|
211
|
+
'version it was last upgraded with. swamp doesn\'t keep old builds, so install',
|
|
212
|
+
'the current `stable` release rather than that exact version:',
|
|
213
|
+
'',
|
|
214
|
+
'```bash',
|
|
215
|
+
'# macOS / Linux',
|
|
216
|
+
'curl -fsSL https://swamp.club/install.sh | sh',
|
|
217
|
+
'',
|
|
218
|
+
'# Windows (PowerShell)',
|
|
219
|
+
'irm https://swamp.club/install.ps1 | iex',
|
|
220
|
+
'```',
|
|
221
|
+
'',
|
|
222
|
+
'One-time setup beyond that, after your first `npx projen`:',
|
|
210
223
|
'',
|
|
211
224
|
'```bash',
|
|
212
|
-
'# Pulls
|
|
213
|
-
'#
|
|
225
|
+
'# Pulls each extension at the version pinned in',
|
|
226
|
+
'# extensions/models/upstream_extensions.json (or the latest',
|
|
227
|
+
'# software-factory/github extensions in a repo with no lockfile yet),',
|
|
228
|
+
'# restores the lockfile and committed skill files from git, and creates the',
|
|
229
|
+
'# repo\'s secrets vault',
|
|
214
230
|
'npx projen swamp:bootstrap',
|
|
215
231
|
'',
|
|
216
232
|
'# Then store a GitHub token the factory can open PRs with',
|
|
@@ -223,7 +239,7 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
223
239
|
'',
|
|
224
240
|
'1. **`src/stacks/ApplicationStack.ts`** — Add your CDK constructs here. The base stack already provides `this.api`, `this.vpc`, `this.hostedZone`, and `this.datadog` as protected properties.',
|
|
225
241
|
'',
|
|
226
|
-
'2. **`web/`** — Build your frontend. Start with `web/src/App.tsx` and add services alongside `web/src/services/
|
|
242
|
+
'2. **`web/`** — Build your frontend. Start with `web/src/App.tsx` and add services alongside `web/src/services/ApiService.ts`.',
|
|
227
243
|
'',
|
|
228
244
|
'3. **`src/api/app.ts`** — Implement your backend Lambda handler logic here.',
|
|
229
245
|
'',
|
|
@@ -270,4 +286,4 @@ function readmeContents(projectName, e2eTesting = true, packageManager = javascr
|
|
|
270
286
|
'This updates all managed files to the latest Batman standards. Your editable sample files are never touched.',
|
|
271
287
|
].join('\n');
|
|
272
288
|
}
|
|
273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBV0QsNERBT0M7QUFVRCxzREFFQztBQU9ELDREQUVDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBa0xDO0FBL1FELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QjtJQUN0QyxPQUFPO1FBQ0wsbUdBQW1HO1FBQ25HLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDO0FB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QUFFO1FBQ0YsNkVBQTZFO1FBQzdFLDZFQUE2RTtRQUM3RSx1RUFBdUU7UUFDdkUsZUFBZTtRQUNmLEVBQUU7UUFDRixTQUFTO1FBQ1Qsd0VBQXdFO1FBQ3hFLGlCQUFpQjtRQUNqQiw0QkFBNEI7UUFDNUIsRUFBRTtRQUNGLDJEQUEyRDtRQUMzRCw0RUFBNEU7UUFDNUUsS0FBSztRQUNMLEVBQUU7UUFDRixLQUFLO1FBQ0wsRUFBRTtRQUNGLG1CQUFtQjtRQUNuQixFQUFFO1FBQ0YsZ01BQWdNO1FBQ2hNLEVBQUU7UUFDRixpSUFBaUk7UUFDakksRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSxFQUFFO1FBQ0YsaUlBQWlJO1FBQ2pJLEtBQUs7UUFDTCxFQUFFO1FBQ0YseUJBQXlCO1FBQ3pCLEVBQUU7UUFDRixTQUFTO1FBQ1Qsd0JBQXdCO1FBQ3hCLGNBQWM7UUFDZCxFQUFFO1FBQ0YsdUVBQXVFO1FBQ3ZFLFVBQVU7UUFDVixFQUFFO1FBQ0Ysd0hBQXdIO1FBQ3hILDREQUE0RDtRQUM1RCxFQUFFO1FBQ0YsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxnRUFBZ0U7UUFDaEUsNkRBQTZEO1FBQzdELEVBQUU7UUFDRixhQUFhO1FBQ2IsV0FBVztRQUNYLEVBQUU7UUFDRiwwREFBMEQ7UUFDMUQsWUFBWTtRQUNaLEtBQUs7UUFDTCxFQUFFO1FBQ0YsZ0JBQWdCO1FBQ2hCLGdGQUFnRjtRQUNoRixvRUFBb0U7UUFDcEUsRUFBRTtRQUNGLEtBQUs7UUFDTCxFQUFFO1FBQ0YscUJBQXFCO1FBQ3JCLEVBQUU7UUFDRixTQUFTO1FBQ1QsOENBQThDO1FBQzlDLFlBQVk7UUFDWixLQUFLO1FBQ0wsRUFBRTtRQUNGLDhHQUE4RztLQUMvRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlUGFja2FnZU1hbmFnZXIgfSBmcm9tICdwcm9qZW4vbGliL2phdmFzY3JpcHQnO1xuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbW1hbmQgdXNlZCB0byBydW4gYSBwYWNrYWdlLmpzb24gc2NyaXB0IGZvciB0aGUgZ2l2ZW4gcGFja2FnZSBtYW5hZ2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuU2NyaXB0Q29tbWFuZChwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyLCBzY3JpcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAocGFja2FnZU1hbmFnZXIpIHtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5OUE06XG4gICAgICByZXR1cm4gYG5wbSBydW4gJHtzY3JpcHR9YDtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gYGJ1biBydW4gJHtzY3JpcHR9YDtcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuIGBwbnBtICR7c2NyaXB0fWA7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGFsbCB5YXJuIHZhcmlhbnRzICh5YXJuLCB5YXJuMiwgeWFybl9jbGFzc2ljLCB5YXJuX2JlcnJ5KSBzaGFyZSB0aGUgYHlhcm5gIGJpbmFyeVxuICAgICAgcmV0dXJuIGB5YXJuICR7c2NyaXB0fWA7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21tYW5kIHVzZWQgdG8gZG8gYSBjbGVhbiwgcmVwcm9kdWNpYmxlIGRlcGVuZGVuY3kgaW5zdGFsbCAoZS5nLiBmb3IgQ0kpXG4gKiBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxDb21tYW5kKHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuICducG0gY2knO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLkJVTjpcbiAgICAgIHJldHVybiAnYnVuIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLlBOUE06XG4gICAgICByZXR1cm4gJ3BucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAneWFybiBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgfVxufVxuXG4vKipcbiAqIEJhc2ggbGluZXMgdGhhdCBzYW5pdGl6ZSBhIGBDTEVBTl9CUkFOQ0hfTkFNRWAgdmFyaWFibGUgKGFscmVhZHkgc3RyaXBwZWQgb2YgYW55XG4gKiBjb252ZW50aW9uYWwtY29tbWl0IHByZWZpeCkgaW50byBhIHZhbHVlIHNhZmUgdG8gdXNlIGFzIGEgQ2xvdWRGb3JtYXRpb24gc3RhY2stbmFtZVxuICogZnJhZ21lbnQ6IGNvbGxhcHNlcyBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyB0byBgLWAsIHRyaW1zIGxlYWRpbmcvdHJhaWxpbmdcbiAqIGAtYCwgYW5kIHByZWZpeGVzIHdpdGggYHByLWAgaWYgdGhlIHJlc3VsdCB3b3VsZCBub3Qgc3RhcnQgd2l0aCBhIGxldHRlciAob3IgaXMgZW1wdHkpLlxuICpcbiAqIFNoYXJlZCBieSBQckRlcGxveVdvcmtmbG93IGFuZCBQckNsZWFudXBXb3JrZmxvdyBzbyBib3RoIGRlcml2ZSB0aGUgaWRlbnRpY2FsIHN0YWNrXG4gKiBuYW1lIGZvciBhIGdpdmVuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplQnJhbmNoTmFtZVNjcmlwdCgpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXG4gICAgJ0NMRUFOX0JSQU5DSF9OQU1FPSQoZWNobyBcIiRDTEVBTl9CUkFOQ0hfTkFNRVwiIHwgc2VkIC1FIFxcJ3MvW15BLVphLXowLTldKy8tL2c7IHMvXi0rLy87IHMvLSskLy9cXCcpJyxcbiAgICAnaWYgW1sgISBcIiRDTEVBTl9CUkFOQ0hfTkFNRVwiID1+IF5bQS1aYS16XSBdXTsgdGhlbicsXG4gICAgJyAgQ0xFQU5fQlJBTkNIX05BTUU9XCJwci0ke0NMRUFOX0JSQU5DSF9OQU1FfVwiJyxcbiAgICAnZmknLFxuICBdO1xufVxuXG4vKipcbiAqIEpvaW5zIGNvbW1hbmRzIHdpdGggYDtgIGluc3RlYWQgb2YgYCYmYC9gfHxgIHNvIHRoZSByZXN1bHQgaXMgdmFsaWQgZm9yIGEgc3dhbXBcbiAqIGNvbW1hbmQvc2hlbGwgbW9kZWwncyBgcnVuOmAgdmFsdWUgb24gYm90aCBQT1NJWCBzaGVsbHMgYW5kIFdpbmRvd3MgUG93ZXJTaGVsbCA1LjFcbiAqICh3aGljaCBoYXMgbm8gYCYmYC9gfHxgIGNoYWluIG9wZXJhdG9ycyBiZWZvcmUgcHdzaCA3KS4gVW5saWtlIGAmJmAsIGA7YCBkb2VzIG5vdFxuICogc2hvcnQtY2lyY3VpdCBvbiBmYWlsdXJlIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBmYWlsdXJlIHRvIHN0b3AgdGhlIHNlcXVlbmNlIHNob3VsZCBzcGxpdFxuICogaW50byBzZXBhcmF0ZSB3b3JrZmxvdyBzdGVwcyB3aXRoIHRoZWlyIG93biBgYXNzZXJ0YCBnYXRlcyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhpc1xuICogZm9yIGNvbnRyb2wgZmxvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoZWxsUG9ydGFibGVTZXF1ZW5jZSguLi5jb21tYW5kczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY29tbWFuZHMuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgcG9ydGFibGUgZm9yY2UtZGVsZXRlIGZvciBhIHNpbmdsZSBmaWxlLCBmb3IgdXNlIGluIGEgc3dhbXAgY29tbWFuZC9zaGVsbFxuICogbW9kZWwncyBgcnVuOmAgdmFsdWUgaW4gcGxhY2Ugb2YgYHJtIC1mIDxwYXRoPmAgKGFtYmlndW91cyB3aXRoIFBvd2VyU2hlbGwgNS4xJ3NcbiAqIGBSZW1vdmUtSXRlbSAtRmlsdGVyYCBhbGlhcykuIE1hdGNoZXMgdGhlIGZpeCBhbHJlYWR5IHZhbGlkYXRlZCBpbiBleG1hbiMxMzYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbFBvcnRhYmxlRm9yY2VEZWxldGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBub2RlIC1lIFwicmVxdWlyZSgnZnMnKS5ybVN5bmMoJyR7cGF0aH0nLCB7IGZvcmNlOiB0cnVlIH0pXCJgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVHModmFsdWU6IGFueSwgZGVwdGggPSAxKTogc3RyaW5nIHtcbiAgY29uc3QgcGFkID0gJyAgJy5yZXBlYXQoZGVwdGgpO1xuICBjb25zdCBpbm5lclBhZCA9ICcgICcucmVwZWF0KGRlcHRoICsgMSk7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gYCcke3ZhbHVlfSdgO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gdmFsdWUubWFwKHYgPT4gYCR7aW5uZXJQYWR9JHtzZXJpYWxpemVUcyh2LCBkZXB0aCArIDEpfWApLmpvaW4oJyxcXG4nKTtcbiAgICByZXR1cm4gYFtcXG4ke2l0ZW1zfSxcXG4ke3BhZH1dYDtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyh2YWx1ZSlcbiAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7aW5uZXJQYWR9JHtrfTogJHtzZXJpYWxpemVUcyh2LCBkZXB0aCArIDEpfWApXG4gICAgICAuam9pbignLFxcbicpO1xuICAgIHJldHVybiBge1xcbiR7ZW50cmllc30sXFxuJHtwYWR9fWA7XG4gIH1cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRtZUNvbnRlbnRzKFxuICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICBlMmVUZXN0aW5nID0gdHJ1ZSxcbiAgcGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlciA9IE5vZGVQYWNrYWdlTWFuYWdlci5ZQVJOX0NMQVNTSUMsXG4pIHtcbiAgY29uc3QgdGVzdEUyZUNvbW1hbmQgPSBydW5TY3JpcHRDb21tYW5kKHBhY2thZ2VNYW5hZ2VyLCAndGVzdDplMmUnKTtcbiAgcmV0dXJuIFtcbiAgICBgIyAke3Byb2plY3ROYW1lfWAsXG4gICAgJycsXG4gICAgJ1RoaXMgcHJvamVjdCB3YXMgYm9vdHN0cmFwcGVkIHdpdGggW0JhdG1hbl0oaHR0cHM6Ly9naXRodWIuY29tL21hY2Vkb24tdGVjaG5vbG9naWVzL3BsYXRmb3JtLWNvbW1vbikuJyxcbiAgICAnJyxcbiAgICAnIyMgV2hhdCBCYXRtYW4gQ3JlYXRlZCcsXG4gICAgJycsXG4gICAgJyMjIyBDREsgSW5mcmFzdHJ1Y3R1cmUgKGBzcmMvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHNyYy9tYWluLnRzYCB8IENESyBhcHAgZW50cnkgcG9pbnQg4oCUIGluc3RhbnRpYXRlcyBkZXYsIHN0YWdpbmcsIGFuZCBwcm9kIGBBcHBsaWNhdGlvblN0YWNrYHMgfCcsXG4gICAgJ3wgYHNyYy9Mb2NhbERldkFwcC50c2AgfCBMb2NhbCBkZXZlbG9wbWVudCBDREsgYXBwIOKAlCB1c2VkIGJ5IGB5YXJuIGNkazpkZXZgIC0gZGVwbG95cyB0byBBV1MgZm9yIHNsb3dlciBidXQgbW9yZSB0aG9yb3VnaCB0ZXN0aW5nIHwnLFxuICAgICd8IGBzcmMvR2l0SHViUm9sZXMudHNgIHwgQ0RLIGFwcCBmb3IgZGVwbG95aW5nIHRoZSBHaXRIdWIgT0lEQyBJQU0gcm9sZSAob25lLXRpbWUgYm9vdHN0cmFwKSB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9BcHBsaWNhdGlvblN0YWNrLnRzYCB8IFlvdXIgcHJpbWFyeSBzdGFjayDigJQgZXh0ZW5kIGl0IHRvIGFkZCByZXNvdXJjZXMgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQmFzZSBzdGFjayB3aXRoIFZQQywgQVBJLCBzdGF0aWMgd2Vic2l0ZSwgRGF0YWRvZywgYW5kIFJvdXRlIDUzIHdpcmVkIHVwIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0dpdEh1YlJvbGVzU3RhY2sudHNgIHwgSUFNIHJvbGUgc3RhY2sgZm9yIEdpdEh1YiBBY3Rpb25zIE9JREMgYXV0aGVudGljYXRpb24gfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL0FwaS50c2AgfCBBUEkgR2F0ZXdheSArIExhbWJkYSBjb25zdHJ1Y3Qgd2l0aCBDbGVyayBKV1QgYXV0aG9yaXplciB8JyxcbiAgICAnfCBgc3JjL2NvbnN0cnVjdHMvU3RhdGljV2Vic2l0ZS50c2AgfCBDbG91ZEZyb250ICsgUzMgKyBBQ00gKyBSb3V0ZSA1MyBjb25zdHJ1Y3QgfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL2hhbmRsZXIvQXBpLkZ1bmN0aW9uLnRzYCB8IExhbWJkYSBoYW5kbGVyIGVudHJ5IHBvaW50LCBiYXNpYyB3cmFwcGVyIGFyb3VuZCBFeHByZXNzLWNvbXBhdGlibGUgYXBwIGNvZGUgfCcsXG4gICAgJ3wgYHNyYy9hc3BlY3RzL0RhdGFEb2dBc3BlY3QudHNgIHwgQ0RLIGFzcGVjdCB0aGF0IHdpcmVzIGFsbCBMYW1iZGEgZnVuY3Rpb25zIHRvIERhdGFkb2cgfCcsXG4gICAgJycsXG4gICAgJyMjIyBGcm9udGVuZCAoYHdlYi9gKScsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IERlc2NyaXB0aW9uIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgd2ViL3NyYy9tYWluLnRzeGAgfCBSZWFjdCBhcHAgZW50cnkgcG9pbnQgd2l0aCBDbGVyayBhbmQgUmVhY3QgUXVlcnkgcHJvdmlkZXJzIHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC50c3hgIHwgUm9vdCBhcHBsaWNhdGlvbiBjb21wb25lbnQgfCcsXG4gICAgJ3wgYHdlYi9zcmMvQXBwLmNzc2AgLyBgd2ViL3NyYy9pbmRleC5jc3NgIHwgQmFzZSBzdHlsZXNoZWV0cyAoVGFpbHdpbmQgQ1NTIHY0KSB8JyxcbiAgICAnfCBgd2ViL3NyYy9jb25maWcudHNgIHwgYHVzZUNvbmZpZygpYCBob29rIOKAlCBsb2FkcyBydW50aW1lIGNvbmZpZyBmcm9tIGBjb25maWcuanNvbmAgfCcsXG4gICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvQmFzZVNlcnZpY2UudHNgIHwgYHVzZUJhc2VRdWVyeSgpYCDigJQgYXV0aGVudGljYXRlZCBBUEkgZmV0Y2ggaG9vayB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9Sb290U2VydmljZS50c2AgfCBFeGFtcGxlIHNlcnZpY2UgdXNpbmcgYHVzZUJhc2VRdWVyeWAgfCcsXG4gICAgJ3wgYHdlYi9wdWJsaWMvY29uZmlnLmpzb25gIHwgUnVudGltZSBjb25maWcgKEFQSSBiYXNlIFVSTCwgQ2xlcmsgcHVibGlzaGFibGUga2V5KSB8JyxcbiAgICAuLi4oZTJlVGVzdGluZyA/IFtcbiAgICAgICd8IGB3ZWIvcGxheXdyaWdodC5jb25maWcudHNgIHwgUGxheXdyaWdodCBlMmUgY29uZmlnIOKAlCBzZWUgYHdlYi9lMmUvUkVBRE1FLm1kYCB8JyxcbiAgICAgIGB8IFxcYHdlYi9lMmUvXFxgIHwgUGxheXdyaWdodCBlMmUgc3VpdGUgKFxcYCR7dGVzdEUyZUNvbW1hbmR9XFxgKTsgYWxzbyBydW4gaW4gQ0kgYWdhaW5zdCBlYWNoIFBSJ3MgZGVwbG95ZWQgVVJMIHxgLFxuICAgIF0gOiBbXSksXG4gICAgJycsXG4gICAgJyMjIyBHaXRIdWIgQWN0aW9ucyBXb3JrZmxvd3MgKGAuZ2l0aHViL3dvcmtmbG93cy9gKScsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IFRyaWdnZXIgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tfCcsXG4gICAgJ3wgYHByLWRlcGxveS55bWxgIHwgT24gcHVsbCByZXF1ZXN0IG9wZW4vdXBkYXRlIOKAlCBkZXBsb3lzIGEgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAnfCBgcHItY2xlYW51cC55bWxgIHwgT24gcHVsbCByZXF1ZXN0IGNsb3NlIOKAlCB0ZWFycyBkb3duIHRoZSBwZXItUFIgZGV2IHN0YWNrIHwnLFxuICAgICd8IGBzdGFnaW5nLWRlcGxveS55bWxgIHwgT24gcHVzaCB0byBgbWFpbmAg4oCUIGRlcGxveXMgdG8gc3RhZ2luZyB8JyxcbiAgICAnfCBgcHJvZHVjdGlvbi1kZXBsb3kueW1sYCB8IE1hbnVhbGx5IHRyaWdnZXJlZCDigJQgZGVwbG95cyB0byBwcm9kdWN0aW9uIHwnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBGaWxlcyBZb3UgQ2FuIEVkaXQnLFxuICAgICcnLFxuICAgICdUaGVzZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIG9uY2UgYW5kIG5ldmVyIG92ZXJ3cml0dGVuIGJ5IEJhdG1hbi4gTW9kaWZ5IHRoZW0gZnJlZWx5LicsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IFdoYXQgdG8gZG8gd2l0aCBpdCB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGAucHJvamVucmMudHMgfCBUaGUgbWFpbiBQcm9qZW4gY29uZmlndXJhdGlvbiBmaWxlLiBBZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBmb3IgZWl0aGVyIHRoZSBBUEkgb3IgdGhlIFdlYiBmcm9udGVuZCBuZWVkIHRvIGJlIGFkZGVkIGhlcmUgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AgfCAqKlN0YXJ0IGhlcmUuKiogQWRkIENESyBjb25zdHJ1Y3RzIHRvIGJ1aWxkIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgfCcsXG4gICAgJ3wgYHNyYy9hcGkvYXBwLnRzIHwgVGhlIG1haW4gbW9ub2xpdGhpYyBBUEkgUkVTVCBzZXJ2ZXIgZmlsZS4gTWFpbiBmaWxlIHlvdSBzaG91bGQgYmUgbW9kaWZ5aW5nIHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC50c3hgIHwgQnVpbGQgeW91ciBVSSBoZXJlIHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC5jc3NgIC8gYHdlYi9zcmMvaW5kZXguY3NzYCB8IFN0eWxlIHlvdXIgYXBwbGljYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9zcmMvbWFpbi50c3hgIHwgQWRqdXN0IHRvcC1sZXZlbCBwcm92aWRlcnMgb3Igcm91dGluZyB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9Sb290U2VydmljZS50c2AgfCBBZGQgb3IgcmVwbGFjZSBBUEkgc2VydmljZSBob29rcyB8JyxcbiAgICAnfCBgd2ViL3B1YmxpYy9jb25maWcuanNvbmAgfCBVcGRhdGUgZm9yIGxvY2FsIGRldmVsb3BtZW50IChBUEkgVVJMLCBDbGVyayBrZXkpIHwnLFxuICAgIC4uLihlMmVUZXN0aW5nID8gW1xuICAgICAgJ3wgYHdlYi9wbGF5d3JpZ2h0LmNvbmZpZy50c2AgLyBgd2ViL2UyZS9gIHwgUGxheXdyaWdodCBlMmUgc3VpdGUg4oCUIGV4dGVuZCBpdCB3aXRoIHJlYWwgZmxvd3M7IHNlZSBgd2ViL2UyZS9SRUFETUUubWRgIHwnLFxuICAgIF0gOiBbXSksXG4gICAgJycsXG4gICAgJyMjIEZpbGVzIFlvdSBDYW5ub3QgRWRpdCcsXG4gICAgJycsXG4gICAgJ1RoZXNlIGZpbGVzIGFyZSAqKm1hbmFnZWQgYnkgQmF0bWFuKiogYW5kIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZXZlcnkgdGltZSBgbnB4IHByb2plbmAgcnVucy4gRG8gbm90IGVkaXQgdGhlbSBkaXJlY3RseSDigJQgbWFrZSBjaGFuZ2VzIGluIGAucHJvamVucmMudHNgIGluc3RlYWQuJyxcbiAgICAnJyxcbiAgICAnPiBbIUlNUE9SVEFOVF0nLFxuICAgICc+IElmIHlvdSBoYXZlIEFOWSBjaGFuZ2VzIHlvdSB3YW50IHRvIG1ha2UgdG8gdGhlc2UgZmlsZXMsIG5vdGlmeSAjdGVhbS1iYXRtYW4gb24gU2xhY2suICcsXG4gICAgJz4gV2UgbWFpbnRhaW4gdGhlc2UgZmlsZXMgYXMgcGFydCBvZiB0aGUgY29yZSBCYXRtYW4gZXhwZXJpZW5jZSwgYW5kIHlvdXIgZmVlZGJhY2sgaXMgY3J1Y2lhbCB0byBlbnN1cmUgdGhleSBtZWV0IHlvdXIgbmVlZHMuJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgV2h5IGl0XFwncyBtYW5hZ2VkIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQmFzZUFwcGxpY2F0aW9uU3RhY2sudHNgIHwgQ29yZSBzdGFjayB3aXJpbmcg4oCUIHVwZGF0ZWQgd2l0aCBCYXRtYW4gcmVsZWFzZXMgfCcsXG4gICAgJ3wgYHNyYy9hc3BlY3RzL0RhdGFEb2dBc3BlY3QudHNgIHwgRGF0YWRvZyBDREsgYXNwZWN0IHwnLFxuICAgICd8IGB3ZWIvdml0ZS5jb25maWcudHNgIHwgVml0ZSBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvZXNsaW50LmNvbmZpZy5qc2AgfCBFU0xpbnQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3Bvc3Rjc3MuY29uZmlnLmpzYCB8IFBvc3RDU1MgLyBUYWlsd2luZCBjb25maWd1cmF0aW9uIHwnLFxuICAgICd8IGB3ZWIvaW5kZXguaHRtbGAgfCBIVE1MIGVudHJ5IHBvaW50IHwnLFxuICAgICd8IGB3ZWIvdHNjb25maWcuanNvbmAgLyBgd2ViL3RzY29uZmlnLmFwcC5qc29uYCAvIGB3ZWIvdHNjb25maWcubm9kZS5qc29uYCB8IFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL3NyYy92aXRlLWVudi5kLnRzYCB8IFZpdGUgdHlwZSBkZWNsYXJhdGlvbnMgfCcsXG4gICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IFJ1bnRpbWUgY29uZmlnIGhvb2sg4oCUIHNoYXBlIGRyaXZlbiBieSBgLnByb2plbnJjLnRzYCB8JyxcbiAgICAnfCBgd2ViL3NyYy9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AgfCBCYXNlIGF1dGhlbnRpY2F0ZWQgZmV0Y2ggaG9vayB8JyxcbiAgICAnfCBgLmdpdGh1Yi9DT0RFT1dORVJTYCB8IENvZGUgb3duZXJzaGlwIHBvbGljeSB8JyxcbiAgICAnfCBgLmdpdGh1Yi93b3JrZmxvd3MvKi55bWxgIHwgQWxsIENJL0NEIHdvcmtmbG93cyB8JyxcbiAgICAnfCBgYXJjaGl0ZWN0dXJlLXJ1bGVzL2NoZWNrLnRzYCwgYHRzY29uZmlnLmpzb25gLCBgUkVBRE1FLm1kYCB8IEFyY2hpdGVjdHVyZSBydWxlIGVuZ2luZSB8JyxcbiAgICAnfCBgYXR0ZXN0YXRpb24vbWFuaWZlc3QudHNgLCBgdmVyaWZ5LnRzYCwgYHRzY29uZmlnLmpzb25gIHwgUFIgYXR0ZXN0YXRpb24gbWVjaGFuaXNtIHwnLFxuICAgICd8IGBvcGVuc3BlYy1nYXRlcy9jaGVjay10YXNrcy1jb21wbGV0ZS50c2AsIGB0c2NvbmZpZy5qc29uYCB8IE9wZW5TcGVjIHRhc2stY29tcGxldGlvbiBnYXRlIHwnLFxuICAgICd8IGB3b3JrZmxvd3Mvd29ya2Zsb3ctKi55YW1sYCB8IFN3YW1wIHdvcmtmbG93cyB0aGUgc29mdHdhcmUgZmFjdG9yeSBydW5zIHwnLFxuICAgICcnLFxuICAgICc+ICoqVGlwOioqIEZpbGVzIHdpdGggYSBgfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLiB+fmAgaGVhZGVyIGFyZSBtYW5hZ2VkIGZpbGVzLicsXG4gICAgJycsXG4gICAgJyMjIyBTb2Z0d2FyZSBGYWN0b3J5IChgbW9kZWxzL2AsIGBhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbmApJyxcbiAgICAnJyxcbiAgICAnQmF0bWFuIGFsc28gc2VlZHMgYSBbc3dhbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FtcC1jbHViL3N3YW1wKSBzb2Z0d2FyZScsXG4gICAgJ2ZhY3Rvcnkg4oCUIGEgYEBzd2FtcC9zb2Z0d2FyZS1mYWN0b3J5YCBzdGF0ZSBtYWNoaW5lIHRoYXQgZHJpdmVzIGEgR2l0SHViJyxcbiAgICAnaXNzdWUgdGhyb3VnaCBpbnRha2UsIE9wZW5TcGVjIHBsYW5uaW5nLCBpbXBsZW1lbnRhdGlvbiwgcHJlLVBSJyxcbiAgICAndmVyaWZpY2F0aW9uLCBhbmQgYW4gb3BlbmVkIFBSLiBUaGUgc2VlZCBmaWxlcyB1bmRlciBgbW9kZWxzLyoqLyoueWFtbGAgYW5kJyxcbiAgICAnYGFyY2hpdGVjdHVyZS1ydWxlcy9ydWxlcy5qc29uYCBhcmUgZ2VuZXJhdGVkIG9uY2UgKGxpa2UgdGhlIGZpbGVzIGluJyxcbiAgICAnXCJGaWxlcyBZb3UgQ2FuIEVkaXRcIiBhYm92ZSkg4oCUIHR1bmUgdGhlIGZhY3RvcnlcXCdzIHN0YWdlcy9nYXRlcyBvciBhZGQgeW91cicsXG4gICAgJ293biBhcmNoaXRlY3R1cmUgcnVsZXMgZGlyZWN0bHkgaW4gdGhvc2UgZmlsZXMuJyxcbiAgICAnJyxcbiAgICAnYHN3YW1wIGluaXRgIHJ1bnMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIGBpbnN0YWxsYC9gaW5zdGFsbDpjaWAgKGEgc2lsZW50JyxcbiAgICAnbm8tb3AgaWYgYHN3YW1wYCBpc25cXCd0IG9uIFBBVEgsIGUuZy4gaW4gQ0kpLCBzbyB0aGUgcmVwbyBzdGF5cyBpbml0aWFsaXplZCcsXG4gICAgJ3dpdGhvdXQgYSBzZXBhcmF0ZSBzdGVwLiBPbmUtdGltZSBzZXR1cCBiZXlvbmQgdGhhdCwgYWZ0ZXIgeW91ciBmaXJzdCcsXG4gICAgJ2BucHggcHJvamVuYDonLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBQdWxscyB0aGUgc29mdHdhcmUtZmFjdG9yeS9naXRodWIgZXh0ZW5zaW9ucyBhbmQgY3JlYXRlcyB0aGUgcmVwb1xcJ3MnLFxuICAgICcjIHNlY3JldHMgdmF1bHQnLFxuICAgICducHggcHJvamVuIHN3YW1wOmJvb3RzdHJhcCcsXG4gICAgJycsXG4gICAgJyMgVGhlbiBzdG9yZSBhIEdpdEh1YiB0b2tlbiB0aGUgZmFjdG9yeSBjYW4gb3BlbiBQUnMgd2l0aCcsXG4gICAgJ3N3YW1wIHZhdWx0IHB1dCA8cmVwbz4tc2VjcmV0cyBHSVRIVUJfVE9LRU4gLS1yZWZyZXNoLWZyb20gXCJnaCBhdXRoIHRva2VuXCInLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBXaGVyZSB0byBTdGFydCcsXG4gICAgJycsXG4gICAgJzEuICoqYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AqKiDigJQgQWRkIHlvdXIgQ0RLIGNvbnN0cnVjdHMgaGVyZS4gVGhlIGJhc2Ugc3RhY2sgYWxyZWFkeSBwcm92aWRlcyBgdGhpcy5hcGlgLCBgdGhpcy52cGNgLCBgdGhpcy5ob3N0ZWRab25lYCwgYW5kIGB0aGlzLmRhdGFkb2dgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgJycsXG4gICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvUm9vdFNlcnZpY2UudHNgLicsXG4gICAgJycsXG4gICAgJzMuICoqYHNyYy9hcGkvYXBwLnRzYCoqIOKAlCBJbXBsZW1lbnQgeW91ciBiYWNrZW5kIExhbWJkYSBoYW5kbGVyIGxvZ2ljIGhlcmUuJyxcbiAgICAnJyxcbiAgICAnNC4gKipgLnByb2plbnJjLnRzYCoqIC0gTWFuYWdlcyBwcm9qZWN0IGRlcGVuZGVuY2llcyBhbmQgY29uZmlndXJhdGlvbi4gUnVuIGBucHggcHJvamVuYCBhZnRlciBtYWtpbmcgYW55IGNoYW5nZXMgdG8gdGhpcyBmaWxlLicsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIERldmVsb3BtZW50IFdvcmtmbG93JyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJyMgSW5zdGFsbCBkZXBlbmRlbmNpZXMnLFxuICAgICd5YXJuIGluc3RhbGwnLFxuICAgICcnLFxuICAgICcjIFN0YXJ0IGxvY2FsIGRldiBzZXJ2ZXIgKGJhY2tlbmQgTGFtYmRhICsgVml0ZSBmcm9udGVuZCBpbiBwYXJhbGxlbCknLFxuICAgICd5YXJuIGRldicsXG4gICAgJycsXG4gICAgJyMgRGVwbG95IGEgcGVyc29uYWwgZGV2IHN0YWNrIHRvIEFXUyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBsb2NhbCBkZXZlbG9wbWVudCwgcHJvdmlkZXMgbW9yZSB0aG9yb3VnaCBlbmQtdG8tZW5kIHRlc3RpbmcnLFxuICAgICd5YXJuIGNkazpkZXYgLS1jb250ZXh0IGxvY2FsLWRldi1wcmVmaXg9eW91ci1oYW5kbGUgZGVwbG95JyxcbiAgICAnJyxcbiAgICAnIyBSZWRlcGxveSB5b3VyIHBlcnNvbmFsIGRldiBzdGFjayBmYXN0OiBhZnRlciB0aGUgZmlyc3QgZGVwbG95IGFib3ZlLCBrZWVwJyxcbiAgICBcIiMgcmV1c2luZyB0aGUgc2FtZSBzdGFjayAoZG9uJ3QgZGVsZXRlIGl0IGJldHdlZW4gYnJhbmNoZXMpIGFuZCBpdGVyYXRlIHdpdGhcIixcbiAgICAnIyBob3Rzd2FwLWZhbGxiYWNrIGluc3RlYWQgb2YgYSBmdWxsIENsb3VkRm9ybWF0aW9uIGRlcGxveW1lbnQnLFxuICAgICd5YXJuIGNkazpkZXY6aG90c3dhcCAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZScsXG4gICAgJycsXG4gICAgJyMgUnVuIHRlc3RzJyxcbiAgICAneWFybiB0ZXN0JyxcbiAgICAnJyxcbiAgICAnIyBSZS1zeW50aGVzaXplIHByb2plY3QgZmlsZXMgYWZ0ZXIgZWRpdGluZyAucHJvamVucmMudHMnLFxuICAgICducHggcHJvamVuJyxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnPiBbIUlNUE9SVEFOVF0nLFxuICAgICc+IGAtLWhvdHN3YXAtZmFsbGJhY2tgICh1c2VkIGJ5IGBjZGs6ZGV2OmhvdHN3YXBgIGFuZCB0aGUgYHdhdGNoYCB0YXNrKSBpcyBmb3InLFxuICAgICc+IHBlcnNvbmFsIGRldiBzdGFja3Mgb25seSDigJQgbmV2ZXIgcnVuIGl0IGFnYWluc3Qgc3RhZ2luZyBvciBwcm9kLicsXG4gICAgJycsXG4gICAgJy0tLScsXG4gICAgJycsXG4gICAgJyMjIFVwZ3JhZGluZyBCYXRtYW4nLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAneWFybiBhZGQgQG1hY2Vkb24tdGVjaG5vbG9naWVzL2JhdG1hbkBsYXRlc3QnLFxuICAgICducHggcHJvamVuJyxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICAnVGhpcyB1cGRhdGVzIGFsbCBtYW5hZ2VkIGZpbGVzIHRvIHRoZSBsYXRlc3QgQmF0bWFuIHN0YW5kYXJkcy4gWW91ciBlZGl0YWJsZSBzYW1wbGUgZmlsZXMgYXJlIG5ldmVyIHRvdWNoZWQuJyxcbiAgXS5qb2luKCdcXG4nKTtcbn1cbiJdfQ==
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFLQSw0Q0FZQztBQU1ELHdDQVdDO0FBV0QsNERBT0M7QUFVRCxzREFFQztBQU9ELDREQUVDO0FBRUQsa0NBZ0JDO0FBRUQsd0NBa01DO0FBL1JELHNEQUEyRDtBQUUzRDs7R0FFRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLGNBQWtDLEVBQUUsTUFBYztJQUNqRixRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFdBQVcsTUFBTSxFQUFFLENBQUM7UUFDN0IsS0FBSywrQkFBa0IsQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sV0FBVyxNQUFNLEVBQUUsQ0FBQztRQUM3QixLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxRQUFRLE1BQU0sRUFBRSxDQUFDO1FBQzFCO1lBQ0Usb0ZBQW9GO1lBQ3BGLE9BQU8sUUFBUSxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFrQztJQUMvRCxRQUFRLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssK0JBQWtCLENBQUMsR0FBRztZQUN6QixPQUFPLFFBQVEsQ0FBQztRQUNsQixLQUFLLCtCQUFrQixDQUFDLEdBQUc7WUFDekIsT0FBTywrQkFBK0IsQ0FBQztRQUN6QyxLQUFLLCtCQUFrQixDQUFDLElBQUk7WUFDMUIsT0FBTyxnQ0FBZ0MsQ0FBQztRQUMxQztZQUNFLE9BQU8sZ0NBQWdDLENBQUM7SUFDNUMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLHdCQUF3QjtJQUN0QyxPQUFPO1FBQ0wsbUdBQW1HO1FBQ25HLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsSUFBSTtLQUNMLENBQUM7QUFDSixDQUFDO0FB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O1FBQ1osS0FBSztRQUNMLEVBQUU7UUFDRiw4R0FBOEc7S0FDL0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTm9kZVBhY2thZ2VNYW5hZ2VyIH0gZnJvbSAncHJvamVuL2xpYi9qYXZhc2NyaXB0JztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21tYW5kIHVzZWQgdG8gcnVuIGEgcGFja2FnZS5qc29uIHNjcmlwdCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blNjcmlwdENvbW1hbmQocGFja2FnZU1hbmFnZXI6IE5vZGVQYWNrYWdlTWFuYWdlciwgc2NyaXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHBhY2thZ2VNYW5hZ2VyKSB7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuTlBNOlxuICAgICAgcmV0dXJuIGBucG0gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuQlVOOlxuICAgICAgcmV0dXJuIGBidW4gcnVuICR7c2NyaXB0fWA7XG4gICAgY2FzZSBOb2RlUGFja2FnZU1hbmFnZXIuUE5QTTpcbiAgICAgIHJldHVybiBgcG5wbSAke3NjcmlwdH1gO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBhbGwgeWFybiB2YXJpYW50cyAoeWFybiwgeWFybjIsIHlhcm5fY2xhc3NpYywgeWFybl9iZXJyeSkgc2hhcmUgdGhlIGB5YXJuYCBiaW5hcnlcbiAgICAgIHJldHVybiBgeWFybiAke3NjcmlwdH1gO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgY29tbWFuZCB1c2VkIHRvIGRvIGEgY2xlYW4sIHJlcHJvZHVjaWJsZSBkZXBlbmRlbmN5IGluc3RhbGwgKGUuZy4gZm9yIENJKVxuICogZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG1hbmFnZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsQ29tbWFuZChwYWNrYWdlTWFuYWdlcjogTm9kZVBhY2thZ2VNYW5hZ2VyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYWNrYWdlTWFuYWdlcikge1xuICAgIGNhc2UgTm9kZVBhY2thZ2VNYW5hZ2VyLk5QTTpcbiAgICAgIHJldHVybiAnbnBtIGNpJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5CVU46XG4gICAgICByZXR1cm4gJ2J1biBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlJztcbiAgICBjYXNlIE5vZGVQYWNrYWdlTWFuYWdlci5QTlBNOlxuICAgICAgcmV0dXJuICdwbnBtIGluc3RhbGwgLS1mcm96ZW4tbG9ja2ZpbGUnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ3lhcm4gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZSc7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNoIGxpbmVzIHRoYXQgc2FuaXRpemUgYSBgQ0xFQU5fQlJBTkNIX05BTUVgIHZhcmlhYmxlIChhbHJlYWR5IHN0cmlwcGVkIG9mIGFueVxuICogY29udmVudGlvbmFsLWNvbW1pdCBwcmVmaXgpIGludG8gYSB2YWx1ZSBzYWZlIHRvIHVzZSBhcyBhIENsb3VkRm9ybWF0aW9uIHN0YWNrLW5hbWVcbiAqIGZyYWdtZW50OiBjb2xsYXBzZXMgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gYC1gLCB0cmltcyBsZWFkaW5nL3RyYWlsaW5nXG4gKiBgLWAsIGFuZCBwcmVmaXhlcyB3aXRoIGBwci1gIGlmIHRoZSByZXN1bHQgd291bGQgbm90IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKG9yIGlzIGVtcHR5KS5cbiAqXG4gKiBTaGFyZWQgYnkgUHJEZXBsb3lXb3JrZmxvdyBhbmQgUHJDbGVhbnVwV29ya2Zsb3cgc28gYm90aCBkZXJpdmUgdGhlIGlkZW50aWNhbCBzdGFja1xuICogbmFtZSBmb3IgYSBnaXZlbiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUJyYW5jaE5hbWVTY3JpcHQoKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICdDTEVBTl9CUkFOQ0hfTkFNRT0kKGVjaG8gXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiB8IHNlZCAtRSBcXCdzL1teQS1aYS16MC05XSsvLS9nOyBzL14tKy8vOyBzLy0rJC8vXFwnKScsXG4gICAgJ2lmIFtbICEgXCIkQ0xFQU5fQlJBTkNIX05BTUVcIiA9fiBeW0EtWmEtel0gXV07IHRoZW4nLFxuICAgICcgIENMRUFOX0JSQU5DSF9OQU1FPVwicHItJHtDTEVBTl9CUkFOQ0hfTkFNRX1cIicsXG4gICAgJ2ZpJyxcbiAgXTtcbn1cblxuLyoqXG4gKiBKb2lucyBjb21tYW5kcyB3aXRoIGA7YCBpbnN0ZWFkIG9mIGAmJmAvYHx8YCBzbyB0aGUgcmVzdWx0IGlzIHZhbGlkIGZvciBhIHN3YW1wXG4gKiBjb21tYW5kL3NoZWxsIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIG9uIGJvdGggUE9TSVggc2hlbGxzIGFuZCBXaW5kb3dzIFBvd2VyU2hlbGwgNS4xXG4gKiAod2hpY2ggaGFzIG5vIGAmJmAvYHx8YCBjaGFpbiBvcGVyYXRvcnMgYmVmb3JlIHB3c2ggNykuIFVubGlrZSBgJiZgLCBgO2AgZG9lcyBub3RcbiAqIHNob3J0LWNpcmN1aXQgb24gZmFpbHVyZSDigJQgY2FsbGVycyB0aGF0IG5lZWQgZmFpbHVyZSB0byBzdG9wIHRoZSBzZXF1ZW5jZSBzaG91bGQgc3BsaXRcbiAqIGludG8gc2VwYXJhdGUgd29ya2Zsb3cgc3RlcHMgd2l0aCB0aGVpciBvd24gYGFzc2VydGAgZ2F0ZXMgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoaXNcbiAqIGZvciBjb250cm9sIGZsb3cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGVsbFBvcnRhYmxlU2VxdWVuY2UoLi4uY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmRzLmpvaW4oJzsgJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBvcnRhYmxlIGZvcmNlLWRlbGV0ZSBmb3IgYSBzaW5nbGUgZmlsZSwgZm9yIHVzZSBpbiBhIHN3YW1wIGNvbW1hbmQvc2hlbGxcbiAqIG1vZGVsJ3MgYHJ1bjpgIHZhbHVlIGluIHBsYWNlIG9mIGBybSAtZiA8cGF0aD5gIChhbWJpZ3VvdXMgd2l0aCBQb3dlclNoZWxsIDUuMSdzXG4gKiBgUmVtb3ZlLUl0ZW0gLUZpbHRlcmAgYWxpYXMpLiBNYXRjaGVzIHRoZSBmaXggYWxyZWFkeSB2YWxpZGF0ZWQgaW4gZXhtYW4jMTM2LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hlbGxQb3J0YWJsZUZvcmNlRGVsZXRlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgbm9kZSAtZSBcInJlcXVpcmUoJ2ZzJykucm1TeW5jKCcke3BhdGh9JywgeyBmb3JjZTogdHJ1ZSB9KVwiYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRzKHZhbHVlOiBhbnksIGRlcHRoID0gMSk6IHN0cmluZyB7XG4gIGNvbnN0IHBhZCA9ICcgICcucmVwZWF0KGRlcHRoKTtcbiAgY29uc3QgaW5uZXJQYWQgPSAnICAnLnJlcGVhdChkZXB0aCArIDEpO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGAnJHt2YWx1ZX0nYDtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IHZhbHVlLm1hcCh2ID0+IGAke2lubmVyUGFkfSR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKS5qb2luKCcsXFxuJyk7XG4gICAgcmV0dXJuIGBbXFxuJHtpdGVtc30sXFxuJHtwYWR9XWA7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXModmFsdWUpXG4gICAgICAubWFwKChbaywgdl0pID0+IGAke2lubmVyUGFkfSR7a306ICR7c2VyaWFsaXplVHModiwgZGVwdGggKyAxKX1gKVxuICAgICAgLmpvaW4oJyxcXG4nKTtcbiAgICByZXR1cm4gYHtcXG4ke2VudHJpZXN9LFxcbiR7cGFkfX1gO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkbWVDb250ZW50cyhcbiAgcHJvamVjdE5hbWU6IHN0cmluZyxcbiAgZTJlVGVzdGluZyA9IHRydWUsXG4gIHBhY2thZ2VNYW5hZ2VyOiBOb2RlUGFja2FnZU1hbmFnZXIgPSBOb2RlUGFja2FnZU1hbmFnZXIuWUFSTl9DTEFTU0lDLFxuKSB7XG4gIGNvbnN0IHRlc3RFMmVDb21tYW5kID0gcnVuU2NyaXB0Q29tbWFuZChwYWNrYWdlTWFuYWdlciwgJ3Rlc3Q6ZTJlJyk7XG4gIHJldHVybiBbXG4gICAgYCMgJHtwcm9qZWN0TmFtZX1gLFxuICAgICcnLFxuICAgICdUaGlzIHByb2plY3Qgd2FzIGJvb3RzdHJhcHBlZCB3aXRoIFtCYXRtYW5dKGh0dHBzOi8vZ2l0aHViLmNvbS9tYWNlZG9uLXRlY2hub2xvZ2llcy9wbGF0Zm9ybS1jb21tb24pLicsXG4gICAgJycsXG4gICAgJyMjIFdoYXQgQmF0bWFuIENyZWF0ZWQnLFxuICAgICcnLFxuICAgICcjIyMgQ0RLIEluZnJhc3RydWN0dXJlIChgc3JjL2ApJyxcbiAgICAnJyxcbiAgICAnfCBGaWxlIHwgRGVzY3JpcHRpb24gfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGBzcmMvbWFpbi50c2AgfCBDREsgYXBwIGVudHJ5IHBvaW50IOKAlCBpbnN0YW50aWF0ZXMgZGV2LCBzdGFnaW5nLCBhbmQgcHJvZCBgQXBwbGljYXRpb25TdGFja2BzIHwnLFxuICAgICd8IGBzcmMvTG9jYWxEZXZBcHAudHNgIHwgTG9jYWwgZGV2ZWxvcG1lbnQgQ0RLIGFwcCDigJQgdXNlZCBieSBgeWFybiBjZGs6ZGV2YCAtIGRlcGxveXMgdG8gQVdTIGZvciBzbG93ZXIgYnV0IG1vcmUgdGhvcm91Z2ggdGVzdGluZyB8JyxcbiAgICAnfCBgc3JjL0dpdEh1YlJvbGVzLnRzYCB8IENESyBhcHAgZm9yIGRlcGxveWluZyB0aGUgR2l0SHViIE9JREMgSUFNIHJvbGUgKG9uZS10aW1lIGJvb3RzdHJhcCkgfCcsXG4gICAgJ3wgYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AgfCBZb3VyIHByaW1hcnkgc3RhY2sg4oCUIGV4dGVuZCBpdCB0byBhZGQgcmVzb3VyY2VzIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IEJhc2Ugc3RhY2sgd2l0aCBWUEMsIEFQSSwgc3RhdGljIHdlYnNpdGUsIERhdGFkb2csIGFuZCBSb3V0ZSA1MyB3aXJlZCB1cCB8JyxcbiAgICAnfCBgc3JjL3N0YWNrcy9HaXRIdWJSb2xlc1N0YWNrLnRzYCB8IElBTSByb2xlIHN0YWNrIGZvciBHaXRIdWIgQWN0aW9ucyBPSURDIGF1dGhlbnRpY2F0aW9uIHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9BcGkudHNgIHwgQVBJIEdhdGV3YXkgKyBMYW1iZGEgY29uc3RydWN0IHdpdGggQ2xlcmsgSldUIGF1dGhvcml6ZXIgfCcsXG4gICAgJ3wgYHNyYy9jb25zdHJ1Y3RzL1N0YXRpY1dlYnNpdGUudHNgIHwgQ2xvdWRGcm9udCArIFMzICsgQUNNICsgUm91dGUgNTMgY29uc3RydWN0IHwnLFxuICAgICd8IGBzcmMvY29uc3RydWN0cy9oYW5kbGVyL0FwaS5GdW5jdGlvbi50c2AgfCBMYW1iZGEgaGFuZGxlciBlbnRyeSBwb2ludCwgYmFzaWMgd3JhcHBlciBhcm91bmQgRXhwcmVzcy1jb21wYXRpYmxlIGFwcCBjb2RlIHwnLFxuICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IENESyBhc3BlY3QgdGhhdCB3aXJlcyBhbGwgTGFtYmRhIGZ1bmN0aW9ucyB0byBEYXRhZG9nIHwnLFxuICAgICcnLFxuICAgICcjIyMgRnJvbnRlbmQgKGB3ZWIvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBEZXNjcmlwdGlvbiB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tfCcsXG4gICAgJ3wgYHdlYi9zcmMvbWFpbi50c3hgIHwgUmVhY3QgYXBwIGVudHJ5IHBvaW50IHdpdGggQ2xlcmsgYW5kIFJlYWN0IFF1ZXJ5IHByb3ZpZGVycyB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IFJvb3QgYXBwbGljYXRpb24gY29tcG9uZW50IHwnLFxuICAgICd8IGB3ZWIvc3JjL0FwcC5jc3NgIC8gYHdlYi9zcmMvaW5kZXguY3NzYCB8IEJhc2Ugc3R5bGVzaGVldHMgKFRhaWx3aW5kIENTUyB2NCkgfCcsXG4gICAgJ3wgYHdlYi9zcmMvY29uZmlnLnRzYCB8IGB1c2VDb25maWcoKWAgaG9vayDigJQgbG9hZHMgcnVudGltZSBjb25maWcgZnJvbSBgY29uZmlnLmpzb25gIHwnLFxuICAgICd8IGB3ZWIvc3JjL3NlcnZpY2VzL0FwaVNlcnZpY2UudHNgIHwgYHVzZUFwaVF1ZXJ5KClgIC8gYHVzZUFwaU11dGF0aW9uKClgIOKAlCBhdXRoZW50aWNhdGVkIEFQSSBob29rcywgY2FjaGVkIHBlciBwYXRoIHwnLFxuICAgICd8IGB3ZWIvc3JjL2hlbHBlcnMvYCB8IGByZXF1ZXN0cy50c2AsIGBIdHRwRXJyb3IudHNgLCBgZXJyb3JzLnRzYCwgYHJldHJ5LnRzYCDigJQgdGhlIHJlcXVlc3QgYW5kIGVycm9yIGhlbHBlcnMgYEFwaVNlcnZpY2VgIGlzIGJ1aWx0IG9uIHwnLFxuICAgICd8IGB3ZWIvcHVibGljL2NvbmZpZy5qc29uYCB8IFJ1bnRpbWUgY29uZmlnIChBUEkgYmFzZSBVUkwsIENsZXJrIHB1Ymxpc2hhYmxlIGtleSkgfCcsXG4gICAgLi4uKGUyZVRlc3RpbmcgPyBbXG4gICAgICAnfCBgd2ViL3BsYXl3cmlnaHQuY29uZmlnLnRzYCB8IFBsYXl3cmlnaHQgZTJlIGNvbmZpZyDigJQgc2VlIGB3ZWIvZTJlL1JFQURNRS5tZGAgfCcsXG4gICAgICBgfCBcXGB3ZWIvZTJlL1xcYCB8IFBsYXl3cmlnaHQgZTJlIHN1aXRlIChcXGAke3Rlc3RFMmVDb21tYW5kfVxcYCk7IGFsc28gcnVuIGluIENJIGFnYWluc3QgZWFjaCBQUidzIGRlcGxveWVkIFVSTCB8YCxcbiAgICBdIDogW10pLFxuICAgICcnLFxuICAgICcjIyMgR2l0SHViIEFjdGlvbnMgV29ya2Zsb3dzIChgLmdpdGh1Yi93b3JrZmxvd3MvYCknLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBUcmlnZ2VyIHwnLFxuICAgICd8LS0tLS0tfC0tLS0tLS0tLXwnLFxuICAgICd8IGBwci1kZXBsb3kueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBvcGVuL3VwZGF0ZSDigJQgZGVwbG95cyBhIHBlci1QUiBkZXYgc3RhY2sgfCcsXG4gICAgJ3wgYHByLWNsZWFudXAueW1sYCB8IE9uIHB1bGwgcmVxdWVzdCBjbG9zZSDigJQgdGVhcnMgZG93biB0aGUgcGVyLVBSIGRldiBzdGFjayB8JyxcbiAgICAnfCBgc3RhZ2luZy1kZXBsb3kueW1sYCB8IE9uIHB1c2ggdG8gYG1haW5gIOKAlCBkZXBsb3lzIHRvIHN0YWdpbmcgfCcsXG4gICAgJ3wgYHByb2R1Y3Rpb24tZGVwbG95LnltbGAgfCBNYW51YWxseSB0cmlnZ2VyZWQg4oCUIGRlcGxveXMgdG8gcHJvZHVjdGlvbiB8JyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRmlsZXMgWW91IENhbiBFZGl0JyxcbiAgICAnJyxcbiAgICAnVGhlc2UgZmlsZXMgYXJlIGdlbmVyYXRlZCBvbmNlIGFuZCBuZXZlciBvdmVyd3JpdHRlbiBieSBCYXRtYW4uIE1vZGlmeSB0aGVtIGZyZWVseS4nLFxuICAgICcnLFxuICAgICd8IEZpbGUgfCBXaGF0IHRvIGRvIHdpdGggaXQgfCcsXG4gICAgJ3wtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18JyxcbiAgICAnfCBgLnByb2plbnJjLnRzIHwgVGhlIG1haW4gUHJvamVuIGNvbmZpZ3VyYXRpb24gZmlsZS4gQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGVpdGhlciB0aGUgQVBJIG9yIHRoZSBXZWIgZnJvbnRlbmQgbmVlZCB0byBiZSBhZGRlZCBoZXJlIHwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0FwcGxpY2F0aW9uU3RhY2sudHNgIHwgKipTdGFydCBoZXJlLioqIEFkZCBDREsgY29uc3RydWN0cyB0byBidWlsZCB5b3VyIGluZnJhc3RydWN0dXJlIHwnLFxuICAgICd8IGBzcmMvYXBpL2FwcC50cyB8IFRoZSBtYWluIG1vbm9saXRoaWMgQVBJIFJFU1Qgc2VydmVyIGZpbGUuIE1haW4gZmlsZSB5b3Ugc2hvdWxkIGJlIG1vZGlmeWluZyB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAudHN4YCB8IEJ1aWxkIHlvdXIgVUkgaGVyZSB8JyxcbiAgICAnfCBgd2ViL3NyYy9BcHAuY3NzYCAvIGB3ZWIvc3JjL2luZGV4LmNzc2AgfCBTdHlsZSB5b3VyIGFwcGxpY2F0aW9uIHwnLFxuICAgICd8IGB3ZWIvc3JjL21haW4udHN4YCB8IEFkanVzdCB0b3AtbGV2ZWwgcHJvdmlkZXJzIG9yIHJvdXRpbmcgfCcsXG4gICAgJ3wgYHdlYi9zcmMvc2VydmljZXMvQXBpU2VydmljZS50c2AgLyBgd2ViL3NyYy9oZWxwZXJzL2AgfCBBZGQgQVBJIHNlcnZpY2UgaG9va3MgYWxvbmdzaWRlIGBBcGlTZXJ2aWNlLnRzYCwgb3IgYWRqdXN0IHRoZSByZXF1ZXN0IGhlbHBlcnMgfCcsXG4gICAgJ3wgYHdlYi9wdWJsaWMvY29uZmlnLmpzb25gIHwgVXBkYXRlIGZvciBsb2NhbCBkZXZlbG9wbWVudCAoQVBJIFVSTCwgQ2xlcmsga2V5KSB8JyxcbiAgICAuLi4oZTJlVGVzdGluZyA/IFtcbiAgICAgICd8IGB3ZWIvcGxheXdyaWdodC5jb25maWcudHNgIC8gYHdlYi9lMmUvYCB8IFBsYXl3cmlnaHQgZTJlIHN1aXRlIOKAlCBleHRlbmQgaXQgd2l0aCByZWFsIGZsb3dzOyBzZWUgYHdlYi9lMmUvUkVBRE1FLm1kYCB8JyxcbiAgICBdIDogW10pLFxuICAgICcnLFxuICAgICcjIyBGaWxlcyBZb3UgQ2Fubm90IEVkaXQnLFxuICAgICcnLFxuICAgICdUaGVzZSBmaWxlcyBhcmUgKiptYW5hZ2VkIGJ5IEJhdG1hbioqIGFuZCB3aWxsIGJlIG92ZXJ3cml0dGVuIGV2ZXJ5IHRpbWUgYG5weCBwcm9qZW5gIHJ1bnMuIERvIG5vdCBlZGl0IHRoZW0gZGlyZWN0bHkg4oCUIG1ha2UgY2hhbmdlcyBpbiBgLnByb2plbnJjLnRzYCBpbnN0ZWFkLicsXG4gICAgJycsXG4gICAgJz4gWyFJTVBPUlRBTlRdJyxcbiAgICAnPiBJZiB5b3UgaGF2ZSBBTlkgY2hhbmdlcyB5b3Ugd2FudCB0byBtYWtlIHRvIHRoZXNlIGZpbGVzLCBub3RpZnkgI3RlYW0tYmF0bWFuIG9uIFNsYWNrLiAnLFxuICAgICc+IFdlIG1haW50YWluIHRoZXNlIGZpbGVzIGFzIHBhcnQgb2YgdGhlIGNvcmUgQmF0bWFuIGV4cGVyaWVuY2UsIGFuZCB5b3VyIGZlZWRiYWNrIGlzIGNydWNpYWwgdG8gZW5zdXJlIHRoZXkgbWVldCB5b3VyIG5lZWRzLicsXG4gICAgJycsXG4gICAgJ3wgRmlsZSB8IFdoeSBpdFxcJ3MgbWFuYWdlZCB8JyxcbiAgICAnfC0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwnLFxuICAgICd8IGBzcmMvc3RhY2tzL0Jhc2VBcHBsaWNhdGlvblN0YWNrLnRzYCB8IENvcmUgc3RhY2sgd2lyaW5nIOKAlCB1cGRhdGVkIHdpdGggQmF0bWFuIHJlbGVhc2VzIHwnLFxuICAgICd8IGBzcmMvYXNwZWN0cy9EYXRhRG9nQXNwZWN0LnRzYCB8IERhdGFkb2cgQ0RLIGFzcGVjdCB8JyxcbiAgICAnfCBgd2ViL3ZpdGUuY29uZmlnLnRzYCB8IFZpdGUgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL2VzbGludC5jb25maWcuanNgIHwgRVNMaW50IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9wb3N0Y3NzLmNvbmZpZy5qc2AgfCBQb3N0Q1NTIC8gVGFpbHdpbmQgY29uZmlndXJhdGlvbiB8JyxcbiAgICAnfCBgd2ViL2luZGV4Lmh0bWxgIHwgSFRNTCBlbnRyeSBwb2ludCB8JyxcbiAgICAnfCBgd2ViL3RzY29uZmlnLmpzb25gIC8gYHdlYi90c2NvbmZpZy5hcHAuanNvbmAgLyBgd2ViL3RzY29uZmlnLm5vZGUuanNvbmAgfCBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gfCcsXG4gICAgJ3wgYHdlYi9zcmMvdml0ZS1lbnYuZC50c2AgfCBWaXRlIHR5cGUgZGVjbGFyYXRpb25zIHwnLFxuICAgICd8IGB3ZWIvc3JjL2NvbmZpZy50c2AgfCBSdW50aW1lIGNvbmZpZyBob29rIOKAlCBzaGFwZSBkcml2ZW4gYnkgYC5wcm9qZW5yYy50c2AgfCcsXG4gICAgJ3wgYC5naXRodWIvQ09ERU9XTkVSU2AgfCBDb2RlIG93bmVyc2hpcCBwb2xpY3kgfCcsXG4gICAgJ3wgYC5naXRodWIvd29ya2Zsb3dzLyoueW1sYCB8IEFsbCBDSS9DRCB3b3JrZmxvd3MgfCcsXG4gICAgJ3wgYGFyY2hpdGVjdHVyZS1ydWxlcy9jaGVjay50c2AsIGB0c2NvbmZpZy5qc29uYCwgYFJFQURNRS5tZGAgfCBBcmNoaXRlY3R1cmUgcnVsZSBlbmdpbmUgfCcsXG4gICAgJ3wgYGF0dGVzdGF0aW9uL21hbmlmZXN0LnRzYCwgYHZlcmlmeS50c2AsIGB0c2NvbmZpZy5qc29uYCB8IFBSIGF0dGVzdGF0aW9uIG1lY2hhbmlzbSB8JyxcbiAgICAnfCBgb3BlbnNwZWMtZ2F0ZXMvY2hlY2stdGFza3MtY29tcGxldGUudHNgLCBgdHNjb25maWcuanNvbmAgfCBPcGVuU3BlYyB0YXNrLWNvbXBsZXRpb24gZ2F0ZSB8JyxcbiAgICAnfCBgc3dhbXAtYm9vdHN0cmFwL3B1bGwtZXh0ZW5zaW9ucy50c2AsIGB0c2NvbmZpZy5qc29uYCB8IFB1bGxzIHN3YW1wIGV4dGVuc2lvbnMgYXQgdGhlaXIgcGlubmVkIHZlcnNpb25zIHwnLFxuICAgICd8IGB3b3JrZmxvd3Mvd29ya2Zsb3ctKi55YW1sYCB8IFN3YW1wIHdvcmtmbG93cyB0aGUgc29mdHdhcmUgZmFjdG9yeSBydW5zIHwnLFxuICAgICcnLFxuICAgICc+ICoqVGlwOioqIEZpbGVzIHdpdGggYSBgfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLiB+fmAgaGVhZGVyIGFyZSBtYW5hZ2VkIGZpbGVzLicsXG4gICAgJycsXG4gICAgJyMjIyBTb2Z0d2FyZSBGYWN0b3J5IChgbW9kZWxzL2AsIGBhcmNoaXRlY3R1cmUtcnVsZXMvcnVsZXMuanNvbmApJyxcbiAgICAnJyxcbiAgICAnQmF0bWFuIGFsc28gc2VlZHMgYSBbc3dhbXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FtcC1jbHViL3N3YW1wKSBzb2Z0d2FyZScsXG4gICAgJ2ZhY3Rvcnkg4oCUIGEgYEBzd2FtcC9zb2Z0d2FyZS1mYWN0b3J5YCBzdGF0ZSBtYWNoaW5lIHRoYXQgZHJpdmVzIGEgR2l0SHViJyxcbiAgICAnaXNzdWUgdGhyb3VnaCBpbnRha2UsIE9wZW5TcGVjIHBsYW5uaW5nLCBpbXBsZW1lbnRhdGlvbiwgcHJlLVBSJyxcbiAgICAndmVyaWZpY2F0aW9uLCBhbmQgYW4gb3BlbmVkIFBSLiBUaGUgc2VlZCBmaWxlcyB1bmRlciBgbW9kZWxzLyoqLyoueWFtbGAgYW5kJyxcbiAgICAnYGFyY2hpdGVjdHVyZS1ydWxlcy9ydWxlcy5qc29uYCBhcmUgZ2VuZXJhdGVkIG9uY2UgKGxpa2UgdGhlIGZpbGVzIGluJyxcbiAgICAnXCJGaWxlcyBZb3UgQ2FuIEVkaXRcIiBhYm92ZSkg4oCUIHR1bmUgdGhlIGZhY3RvcnlcXCdzIHN0YWdlcy9nYXRlcyBvciBhZGQgeW91cicsXG4gICAgJ293biBhcmNoaXRlY3R1cmUgcnVsZXMgZGlyZWN0bHkgaW4gdGhvc2UgZmlsZXMuJyxcbiAgICAnJyxcbiAgICAnYHN3YW1wIGluaXRgIHJ1bnMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mIGBpbnN0YWxsYC9gaW5zdGFsbDpjaWAgKGEgc2lsZW50JyxcbiAgICAnbm8tb3AgaWYgYHN3YW1wYCBpc25cXCd0IG9uIFBBVEgsIGUuZy4gaW4gQ0kpLCBzbyB0aGUgcmVwbyBzdGF5cyBpbml0aWFsaXplZCcsXG4gICAgJ3dpdGhvdXQgYSBzZXBhcmF0ZSBzdGVwLicsXG4gICAgJycsXG4gICAgJ2Bzd2FtcFZlcnNpb25gIGluIGAuc3dhbXAueWFtbGAgaXMgdGhlIG1pbmltdW0gc3dhbXAgQ0xJIHRoZSByZXBvIG5lZWRzOiB0aGUnLFxuICAgICd2ZXJzaW9uIGl0IHdhcyBsYXN0IHVwZ3JhZGVkIHdpdGguIHN3YW1wIGRvZXNuXFwndCBrZWVwIG9sZCBidWlsZHMsIHNvIGluc3RhbGwnLFxuICAgICd0aGUgY3VycmVudCBgc3RhYmxlYCByZWxlYXNlIHJhdGhlciB0aGFuIHRoYXQgZXhhY3QgdmVyc2lvbjonLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBtYWNPUyAvIExpbnV4JyxcbiAgICAnY3VybCAtZnNTTCBodHRwczovL3N3YW1wLmNsdWIvaW5zdGFsbC5zaCB8IHNoJyxcbiAgICAnJyxcbiAgICAnIyBXaW5kb3dzIChQb3dlclNoZWxsKScsXG4gICAgJ2lybSBodHRwczovL3N3YW1wLmNsdWIvaW5zdGFsbC5wczEgfCBpZXgnLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICdPbmUtdGltZSBzZXR1cCBiZXlvbmQgdGhhdCwgYWZ0ZXIgeW91ciBmaXJzdCBgbnB4IHByb2plbmA6JyxcbiAgICAnJyxcbiAgICAnYGBgYmFzaCcsXG4gICAgJyMgUHVsbHMgZWFjaCBleHRlbnNpb24gYXQgdGhlIHZlcnNpb24gcGlubmVkIGluJyxcbiAgICAnIyBleHRlbnNpb25zL21vZGVscy91cHN0cmVhbV9leHRlbnNpb25zLmpzb24gKG9yIHRoZSBsYXRlc3QnLFxuICAgICcjIHNvZnR3YXJlLWZhY3RvcnkvZ2l0aHViIGV4dGVuc2lvbnMgaW4gYSByZXBvIHdpdGggbm8gbG9ja2ZpbGUgeWV0KSwnLFxuICAgICcjIHJlc3RvcmVzIHRoZSBsb2NrZmlsZSBhbmQgY29tbWl0dGVkIHNraWxsIGZpbGVzIGZyb20gZ2l0LCBhbmQgY3JlYXRlcyB0aGUnLFxuICAgICcjIHJlcG9cXCdzIHNlY3JldHMgdmF1bHQnLFxuICAgICducHggcHJvamVuIHN3YW1wOmJvb3RzdHJhcCcsXG4gICAgJycsXG4gICAgJyMgVGhlbiBzdG9yZSBhIEdpdEh1YiB0b2tlbiB0aGUgZmFjdG9yeSBjYW4gb3BlbiBQUnMgd2l0aCcsXG4gICAgJ3N3YW1wIHZhdWx0IHB1dCA8cmVwbz4tc2VjcmV0cyBHSVRIVUJfVE9LRU4gLS1yZWZyZXNoLWZyb20gXCJnaCBhdXRoIHRva2VuXCInLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICctLS0nLFxuICAgICcnLFxuICAgICcjIyBXaGVyZSB0byBTdGFydCcsXG4gICAgJycsXG4gICAgJzEuICoqYHNyYy9zdGFja3MvQXBwbGljYXRpb25TdGFjay50c2AqKiDigJQgQWRkIHlvdXIgQ0RLIGNvbnN0cnVjdHMgaGVyZS4gVGhlIGJhc2Ugc3RhY2sgYWxyZWFkeSBwcm92aWRlcyBgdGhpcy5hcGlgLCBgdGhpcy52cGNgLCBgdGhpcy5ob3N0ZWRab25lYCwgYW5kIGB0aGlzLmRhdGFkb2dgIGFzIHByb3RlY3RlZCBwcm9wZXJ0aWVzLicsXG4gICAgJycsXG4gICAgJzIuICoqYHdlYi9gKiog4oCUIEJ1aWxkIHlvdXIgZnJvbnRlbmQuIFN0YXJ0IHdpdGggYHdlYi9zcmMvQXBwLnRzeGAgYW5kIGFkZCBzZXJ2aWNlcyBhbG9uZ3NpZGUgYHdlYi9zcmMvc2VydmljZXMvQXBpU2VydmljZS50c2AuJyxcbiAgICAnJyxcbiAgICAnMy4gKipgc3JjL2FwaS9hcHAudHNgKiog4oCUIEltcGxlbWVudCB5b3VyIGJhY2tlbmQgTGFtYmRhIGhhbmRsZXIgbG9naWMgaGVyZS4nLFxuICAgICcnLFxuICAgICc0LiAqKmAucHJvamVucmMudHNgKiogLSBNYW5hZ2VzIHByb2plY3QgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uLiBSdW4gYG5weCBwcm9qZW5gIGFmdGVyIG1ha2luZyBhbnkgY2hhbmdlcyB0byB0aGlzIGZpbGUuJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgRGV2ZWxvcG1lbnQgV29ya2Zsb3cnLFxuICAgICcnLFxuICAgICdgYGBiYXNoJyxcbiAgICAnIyBJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgJ3lhcm4gaW5zdGFsbCcsXG4gICAgJycsXG4gICAgJyMgU3RhcnQgbG9jYWwgZGV2IHNlcnZlciAoYmFja2VuZCBMYW1iZGEgKyBWaXRlIGZyb250ZW5kIGluIHBhcmFsbGVsKScsXG4gICAgJ3lhcm4gZGV2JyxcbiAgICAnJyxcbiAgICAnIyBEZXBsb3kgYSBwZXJzb25hbCBkZXYgc3RhY2sgdG8gQVdTIGFzIGFuIGFsdGVybmF0aXZlIHRvIGxvY2FsIGRldmVsb3BtZW50LCBwcm92aWRlcyBtb3JlIHRob3JvdWdoIGVuZC10by1lbmQgdGVzdGluZycsXG4gICAgJ3lhcm4gY2RrOmRldiAtLWNvbnRleHQgbG9jYWwtZGV2LXByZWZpeD15b3VyLWhhbmRsZSBkZXBsb3knLFxuICAgICcnLFxuICAgICcjIFJlZGVwbG95IHlvdXIgcGVyc29uYWwgZGV2IHN0YWNrIGZhc3Q6IGFmdGVyIHRoZSBmaXJzdCBkZXBsb3kgYWJvdmUsIGtlZXAnLFxuICAgIFwiIyByZXVzaW5nIHRoZSBzYW1lIHN0YWNrIChkb24ndCBkZWxldGUgaXQgYmV0d2VlbiBicmFuY2hlcykgYW5kIGl0ZXJhdGUgd2l0aFwiLFxuICAgICcjIGhvdHN3YXAtZmFsbGJhY2sgaW5zdGVhZCBvZiBhIGZ1bGwgQ2xvdWRGb3JtYXRpb24gZGVwbG95bWVudCcsXG4gICAgJ3lhcm4gY2RrOmRldjpob3Rzd2FwIC0tY29udGV4dCBsb2NhbC1kZXYtcHJlZml4PXlvdXItaGFuZGxlJyxcbiAgICAnJyxcbiAgICAnIyBSdW4gdGVzdHMnLFxuICAgICd5YXJuIHRlc3QnLFxuICAgICcnLFxuICAgICcjIFJlLXN5bnRoZXNpemUgcHJvamVjdCBmaWxlcyBhZnRlciBlZGl0aW5nIC5wcm9qZW5yYy50cycsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICc+IFshSU1QT1JUQU5UXScsXG4gICAgJz4gYC0taG90c3dhcC1mYWxsYmFja2AgKHVzZWQgYnkgYGNkazpkZXY6aG90c3dhcGAgYW5kIHRoZSBgd2F0Y2hgIHRhc2spIGlzIGZvcicsXG4gICAgJz4gcGVyc29uYWwgZGV2IHN0YWNrcyBvbmx5IOKAlCBuZXZlciBydW4gaXQgYWdhaW5zdCBzdGFnaW5nIG9yIHByb2QuJyxcbiAgICAnJyxcbiAgICAnLS0tJyxcbiAgICAnJyxcbiAgICAnIyMgVXBncmFkaW5nIEJhdG1hbicsXG4gICAgJycsXG4gICAgJ2BgYGJhc2gnLFxuICAgICd5YXJuIGFkZCBAbWFjZWRvbi10ZWNobm9sb2dpZXMvYmF0bWFuQGxhdGVzdCcsXG4gICAgJ25weCBwcm9qZW4nLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgICdUaGlzIHVwZGF0ZXMgYWxsIG1hbmFnZWQgZmlsZXMgdG8gdGhlIGxhdGVzdCBCYXRtYW4gc3RhbmRhcmRzLiBZb3VyIGVkaXRhYmxlIHNhbXBsZSBmaWxlcyBhcmUgbmV2ZXIgdG91Y2hlZC4nLFxuICBdLmpvaW4oJ1xcbicpO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pulls each swamp extension at the version pinned in
|
|
3
|
+
* extensions/models/upstream_extensions.json, so a fresh clone runs the
|
|
4
|
+
* same extensions as the rest of the team, including any the repo added
|
|
5
|
+
* itself. A repo with no lockfile yet pulls DEFAULT_EXTENSIONS at their
|
|
6
|
+
* latest stable versions, which creates the lockfile.
|
|
7
|
+
*
|
|
8
|
+
* A pull rewrites the lockfile even at an identical version, and on Windows
|
|
9
|
+
* it writes backslash paths and deletes the committed files it tracks (e.g.
|
|
10
|
+
* .claude/skills/software-factory/). So afterwards the lockfile and every
|
|
11
|
+
* git-tracked file it lists are restored from git.
|
|
12
|
+
*/
|
|
13
|
+
import { execFileSync } from 'node:child_process';
|
|
14
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
15
|
+
|
|
16
|
+
const LOCKFILE = 'extensions/models/upstream_extensions.json';
|
|
17
|
+
const DEFAULT_EXTENSIONS = ['@swamp/software-factory', '@webframp/github', '@goodcraft/github'];
|
|
18
|
+
|
|
19
|
+
interface LockfileEntry {
|
|
20
|
+
version: string;
|
|
21
|
+
files?: string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function readLockfile(): Record<string, LockfileEntry> | undefined {
|
|
25
|
+
if (!existsSync(LOCKFILE)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return JSON.parse(readFileSync(LOCKFILE, 'utf8')) as Record<string, LockfileEntry>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function run(command: string, args: string[]): string {
|
|
32
|
+
return execFileSync(command, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'inherit'] });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function pull(extension: string): void {
|
|
36
|
+
console.log(`swamp extension pull ${extension} --force`);
|
|
37
|
+
execFileSync('swamp', ['extension', 'pull', extension, '--force'], { stdio: 'inherit' });
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function restoreTrackedFiles(lockfile: Record<string, LockfileEntry>): void {
|
|
41
|
+
const listed = Object.values(lockfile)
|
|
42
|
+
.flatMap((entry) => entry.files ?? [])
|
|
43
|
+
.map((file) => file.replace(/\\/g, '/'))
|
|
44
|
+
.filter((file) => !file.startsWith('.swamp/'));
|
|
45
|
+
const tracked = run('git', ['ls-files', '-z', '--', LOCKFILE, ...listed])
|
|
46
|
+
.split('\0')
|
|
47
|
+
.filter(Boolean);
|
|
48
|
+
if (tracked.length > 0) {
|
|
49
|
+
run('git', ['checkout', '--', ...tracked]);
|
|
50
|
+
console.log(`Restored ${tracked.length} tracked file(s) from git`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function main(): void {
|
|
55
|
+
const lockfile = readLockfile();
|
|
56
|
+
if (!lockfile) {
|
|
57
|
+
console.log(`No ${LOCKFILE} yet: pulling the latest stable software-factory extensions`);
|
|
58
|
+
DEFAULT_EXTENSIONS.forEach(pull);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
for (const [name, entry] of Object.entries(lockfile)) {
|
|
63
|
+
pull(`${name}@${entry.version}`);
|
|
64
|
+
}
|
|
65
|
+
restoreTrackedFiles(lockfile);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
main();
|