@nlabs/lex 1.48.3 → 1.48.5

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.
Files changed (63) hide show
  1. package/.storybook/main.ts +25 -4
  2. package/.vscode/settings.json +1 -1
  3. package/README.md +293 -22
  4. package/__mocks__/compare-versions.js +3 -0
  5. package/__mocks__/fileMock.js +1 -0
  6. package/__mocks__/latest-version.js +1 -0
  7. package/__mocks__/react-markdown.js +12 -0
  8. package/babel.config.json +2 -1
  9. package/dist/Button.stories.d.ts +19 -0
  10. package/dist/LexConfig.d.ts +84 -0
  11. package/dist/LexConfig.js +1 -4
  12. package/dist/commands/ai/ai.d.ts +17 -0
  13. package/dist/commands/ai/index.d.ts +8 -0
  14. package/dist/commands/build/build.d.ts +18 -0
  15. package/dist/commands/clean/clean.d.ts +7 -0
  16. package/dist/commands/compile/compile.d.ts +2 -0
  17. package/dist/commands/config/config.d.ts +7 -0
  18. package/dist/commands/config/config.js +2 -2
  19. package/dist/commands/copy/copy.d.ts +6 -0
  20. package/dist/commands/create/create.d.ts +8 -0
  21. package/dist/commands/dev/dev.d.ts +11 -0
  22. package/dist/commands/init/init.d.ts +9 -0
  23. package/dist/commands/link/link.d.ts +6 -0
  24. package/dist/commands/lint/autofix.d.ts +2 -0
  25. package/dist/commands/lint/lint.d.ts +39 -0
  26. package/dist/commands/migrate/migrate.d.ts +7 -0
  27. package/dist/commands/publish/publish.d.ts +12 -0
  28. package/dist/commands/storybook/storybook.d.ts +13 -0
  29. package/dist/commands/storybook/storybook.js +3 -5
  30. package/dist/commands/test/test.d.ts +50 -0
  31. package/dist/commands/test/test.js +80 -10
  32. package/dist/commands/update/update.d.ts +9 -0
  33. package/dist/commands/upgrade/upgrade.d.ts +7 -0
  34. package/dist/commands/versions/versions.d.ts +13 -0
  35. package/dist/create/changelog.d.ts +6 -0
  36. package/dist/index.d.ts +33 -0
  37. package/dist/index.js +2 -1
  38. package/dist/lex.d.ts +2 -0
  39. package/dist/test-react/index.d.ts +8 -0
  40. package/dist/test-react/index.js +86 -0
  41. package/dist/types.d.ts +5 -0
  42. package/dist/utils/aiService.d.ts +9 -0
  43. package/dist/utils/app.d.ts +45 -0
  44. package/dist/utils/file.d.ts +8 -0
  45. package/dist/utils/file.js +9 -3
  46. package/dist/utils/log.d.ts +1 -0
  47. package/dist/utils/reactShim.d.ts +4 -0
  48. package/dist/utils/reactShim.js +82 -2
  49. package/jest.config.d.mts +50 -0
  50. package/jest.config.mjs +69 -0
  51. package/jest.config.template.cjs +63 -0
  52. package/jest.setup.js +18 -15
  53. package/jest.setup.template.js +18 -0
  54. package/package.json +24 -7
  55. package/tsconfig.build.json +8 -10
  56. package/tsconfig.lint.json +2 -2
  57. package/tsconfig.test.json +2 -2
  58. package/dist/dist/LexConfig.d.ts +0 -119
  59. package/dist/dist/utils/file.d.ts +0 -8
  60. package/dist/dist/utils/log.d.ts +0 -1
  61. package/dist/jest.config.lex.d.ts +0 -2
  62. package/jest.config.cjs +0 -43
  63. package/jest.config.lex.js +0 -118
@@ -3,7 +3,28 @@ const config = {
3
3
  '@storybook/addon-docs',
4
4
  '@storybook/addon-links',
5
5
  '@storybook/addon-postcss',
6
- '@storybook/addon-styling-webpack',
6
+ {
7
+ name: '@storybook/addon-styling-webpack',
8
+ options: {
9
+ rules: [
10
+ {
11
+ test: /\.css$/,
12
+ use: [
13
+ 'style-loader',
14
+ 'css-loader',
15
+ {
16
+ loader: 'postcss-loader',
17
+ options: {
18
+ postcssOptions: {
19
+ config: 'node_modules/@nlabs/lex/postcss.config.js',
20
+ },
21
+ },
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
27
+ },
7
28
  '@storybook/addon-themes'
8
29
  ],
9
30
  framework: {
@@ -11,7 +32,7 @@ const config = {
11
32
  options: {
12
33
  builder: {
13
34
  useSWC: true
14
- }
35
+ },
15
36
  }
16
37
  },
17
38
  stories: ['../src/**/*.stories.@(js|ts|tsx)', '../src/**/*.mdx'],
@@ -29,9 +50,9 @@ const config = {
29
50
  loader: 'babel-loader',
30
51
  options: {
31
52
  presets: [
32
- '@babel/preset-typescript',
53
+ '/Users/nitrog7/Development/gothamjs/node_modules/@babel/preset-typescript',
33
54
  [
34
- '@babel/preset-react',
55
+ '/Users/nitrog7/Development/gothamjs/node_modules/@babel/preset-react',
35
56
  {
36
57
  runtime: 'automatic'
37
58
  }
@@ -21,7 +21,7 @@
21
21
  "editor.autoClosingBrackets": "never",
22
22
  "editor.codeActionsOnSave": {
23
23
  "source.fixAll.eslint": "explicit",
24
- "source.organizeImports": false
24
+ "source.organizeImports": "never"
25
25
  },
26
26
  "editor.detectIndentation": false,
27
27
  "editor.formatOnSave": true,
package/README.md CHANGED
@@ -1,37 +1,308 @@
1
- # @nlabs/lex
1
+ # 🚀 Lex - The Ultimate React Development CLI
2
2
 
3
- Lex is a console line execution module. Works out of the box for any React project, taking care of all your development needs. No need to install unit testing, transpilers, compilers, or even development servers. Install Lex globally and let go of all the grunt work, allowing you focus on coding your app.
3
+ > **Zero Configuration. Maximum Productivity.**
4
4
 
5
- Lex eliminates this hassle. With the most common enterprise configurations used, developers can simply run and go. Lex uses the following libraries to assist in development.
5
+ Lex is the all-in-one development CLI that eliminates the complexity of modern React development. No more juggling webpack configs, testing setups, or build tools. Just install Lex globally and focus on what matters most - building amazing applications.
6
6
 
7
- - [ESBuild](https://esbuild.github.io/)
8
- - [Jest](https://facebook.github.io/jest/)
9
- - [Typescript](http://www.typescriptlang.org/)
10
- - [Webpack](https://webpack.js.org/)
7
+ [![npm version](https://badge.fury.io/js/%40nlabs%2Flex.svg)](https://badge.fury.io/js/%40nlabs%2Flex)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
9
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
11
10
 
11
+ ## ✨ Why Lex?
12
12
 
13
- ## Documentation
13
+ ### 🎯 **Zero Configuration**
14
14
 
15
- See Lex [documentation site](http://lex.nitrogenlabs.com) for full details.
15
+ - Works out of the box with any React project
16
+ - No webpack configs to write
17
+ - No testing setup to configure
18
+ - No build tools to manage
16
19
 
17
- ## Installation
20
+ ### ⚡ **Lightning Fast**
18
21
 
19
- Lex is installed globally using npm.
22
+ - ESBuild-powered compilation
23
+ - Hot reloading development server
24
+ - Optimized production builds
25
+ - Parallel test execution
20
26
 
21
- ```shell
22
- $ npm install -g @nlabs/lex
27
+ ### 🧠 **AI-Powered Development**
28
+
29
+ - AI-assisted error fixing
30
+ - Intelligent test generation
31
+ - Code optimization suggestions
32
+ - Smart linting with auto-fix
33
+
34
+ ### 🛠️ **Enterprise Ready**
35
+
36
+ - TypeScript support out of the box
37
+ - Jest testing framework included
38
+ - Storybook integration
39
+ - Production-optimized builds
40
+
41
+ ## 🚀 Quick Start
42
+
43
+ ```bash
44
+ # Install Lex globally
45
+ npm install -g @nlabs/lex
46
+
47
+ # Create a new React app
48
+ lex init my-awesome-app --typescript --install
49
+
50
+ # Navigate to your app
51
+ cd my-awesome-app
52
+
53
+ # Start development server
54
+ lex dev --open
55
+
56
+ # Run tests
57
+ lex test
58
+
59
+ # Build for production
60
+ lex build --mode production
23
61
  ```
24
62
 
25
- lex compile -c ./webpack.config.js
63
+ ## 📦 What's Included
64
+
65
+ Lex comes with everything you need for modern React development:
66
+
67
+ | Tool | Purpose | Version |
68
+ |------|---------|---------|
69
+ | **ESBuild** | Lightning-fast bundler | Latest |
70
+ | **Jest** | Testing framework | Latest |
71
+ | **TypeScript** | Type safety | Latest |
72
+ | **Webpack** | Advanced bundling | Latest |
73
+ | **Storybook** | Component development | Latest |
74
+ | **PostCSS** | CSS processing | Latest |
75
+ | **ESLint** | Code linting | Latest |
76
+
77
+ ## 🎮 Commands Overview
78
+
79
+ ### 🏗️ **Project Setup**
80
+
81
+ | Command | Description | Quick Example |
82
+ |---------|-------------|---------------|
83
+ | [`lex init`](#init) | Create new React applications | `lex init my-app --typescript` |
84
+ | [`lex create`](#create) | Generate project assets | `lex create view Dashboard` |
85
+ | [`lex migrate`](#migrate) | Migrate existing projects | `lex migrate` |
86
+
87
+ ### 🛠️ **Development**
88
+
89
+ | Command | Description | Quick Example |
90
+ |---------|-------------|---------------|
91
+ | [`lex dev`](#dev) | Start development server | `lex dev --open` |
92
+ | [`lex compile`](#compile) | Compile TypeScript/JavaScript | `lex compile --watch` |
93
+ | [`lex build`](#build) | Build for production | `lex build --mode production` |
94
+
95
+ ### 🧪 **Testing & Quality**
96
+
97
+ | Command | Description | Quick Example |
98
+ |---------|-------------|---------------|
99
+ | [`lex test`](#test) | Run Jest tests | `lex test --watch` |
100
+ | [`lex lint`](#lint) | Lint code with ESLint | `lex lint --fix` |
101
+ | [`lex storybook`](#storybook) | Start Storybook | `lex storybook --open` |
102
+
103
+ ### 🤖 **AI-Powered Features**
104
+
105
+ | Command | Description | Quick Example |
106
+ |---------|-------------|---------------|
107
+ | [`lex ai`](#ai) | AI code assistance | `lex ai --task generate --prompt "Create a button component"` |
108
+ | [`lex ai`](#ai) | AI test generation | `lex test --generate` |
109
+ | [`lex ai`](#ai) | AI error fixing | `lex build --assist` |
26
110
 
27
- ## Quick Start
111
+ ### 📦 **Package Management**
28
112
 
29
- ```shell
30
- // Install a skeleton app with the ArkhamJS framework
31
- $ npm install -g @nlabs/lex
32
- $ lex init myApp -i
33
- $ cd myApp
113
+ | Command | Description | Quick Example |
114
+ |---------|-------------|---------------|
115
+ | [`lex update`](#update) | Update dependencies | `lex update --interactive` |
116
+ | [`lex upgrade`](#upgrade) | Upgrade Lex itself | `lex upgrade` |
117
+ | [`lex publish`](#publish) | Publish to npm | `lex publish --bump minor` |
34
118
 
35
- // Run the dev server
36
- $ lex dev -o
119
+ ### 🔧 **Utilities**
120
+
121
+ | Command | Description | Quick Example |
122
+ |---------|-------------|---------------|
123
+ | [`lex clean`](#clean) | Clean project files | `lex clean` |
124
+ | [`lex copy`](#copy) | Copy files/directories | `lex copy src dist` |
125
+ | [`lex config`](#config) | Show configurations | `lex config webpack` |
126
+ | [`lex versions`](#versions) | Show tool versions | `lex versions` |
127
+ | [`lex link`](#link) | Check linked modules | `lex link` |
128
+
129
+ ## 🎯 Core Features
130
+
131
+ ### 🚀 **Development Server**
132
+
133
+ ```bash
134
+ # Start with hot reloading
135
+ lex dev --open
136
+
137
+ # With bundle analyzer
138
+ lex dev --bundleAnalyzer
139
+
140
+ # Custom webpack config
141
+ lex dev --config ./custom.webpack.js
142
+ ```
143
+
144
+ ### 🏗️ **Production Builds**
145
+
146
+ ```bash
147
+ # Standard production build
148
+ lex build --mode production
149
+
150
+ # With ESBuild (faster)
151
+ lex build --bundler esbuild
152
+
153
+ # With AI optimization analysis
154
+ lex build --analyze
155
+ ```
156
+
157
+ ### 🧪 **Testing Suite**
158
+
159
+ ```bash
160
+ # Run all tests
161
+ lex test
162
+
163
+ # Watch mode
164
+ lex test --watch
165
+
166
+ # Generate tests with AI
167
+ lex test --generate
168
+
169
+ # Debug failing tests
170
+ lex test --debugTests
37
171
  ```
172
+
173
+ ### 🎨 **Storybook Integration**
174
+
175
+ ```bash
176
+ # Start Storybook
177
+ lex storybook --open
178
+
179
+ # With Tailwind CSS support
180
+ lex storybook --useLexConfig
181
+
182
+ # Build static site
183
+ lex storybook --static
184
+ ```
185
+
186
+ ### 🤖 **AI-Powered Development**
187
+
188
+ ```bash
189
+ # Generate code
190
+ lex ai --task generate --prompt "Create a user profile component"
191
+
192
+ # Explain code
193
+ lex ai --task explain --file src/components/Button.tsx
194
+
195
+ # Fix errors
196
+ lex ai --task help --prompt "Fix this TypeScript error"
197
+ ```
198
+
199
+ ## 🎨 Framework Support
200
+
201
+ Lex works seamlessly with popular React frameworks and libraries:
202
+
203
+ - ✅ **Create React App** - Migrate existing CRA projects
204
+ - ✅ **Next.js** - Use Lex for testing and building
205
+ - ✅ **Gatsby** - Integrate Lex workflows
206
+ - ✅ **Vite** - Alternative to Vite for complex projects
207
+ - ✅ **TypeScript** - Full TypeScript support out of the box
208
+ - ✅ **Tailwind CSS** - Automatic Tailwind integration
209
+ - ✅ **Storybook** - Built-in Storybook support
210
+
211
+ ## 🚀 Performance
212
+
213
+ Lex is designed for speed and efficiency:
214
+
215
+ - **⚡ ESBuild Integration** - 10-100x faster than traditional bundlers
216
+ - **🧠 Smart Caching** - Intelligent caching for faster rebuilds
217
+ - **🔄 Hot Reloading** - Instant feedback during development
218
+ - **📦 Tree Shaking** - Automatic dead code elimination
219
+ - **🎯 Code Splitting** - Automatic code splitting for optimal loading
220
+
221
+ ## 🛠️ Configuration
222
+
223
+ Lex works out of the box, but you can customize it with a `lex.config.js` file:
224
+
225
+ ```javascript
226
+ export default {
227
+ // Project settings
228
+ useTypescript: true,
229
+ sourcePath: './src',
230
+ outputPath: './dist',
231
+
232
+ // Package manager
233
+ packageManager: 'npm',
234
+
235
+ // AI configuration
236
+ ai: {
237
+ provider: 'openai',
238
+ model: 'gpt-4'
239
+ },
240
+
241
+ // ESBuild configuration
242
+ esbuild: {
243
+ minify: true,
244
+ sourcemap: true,
245
+ target: 'es2020'
246
+ }
247
+ };
248
+ ```
249
+
250
+ ## 📚 Documentation
251
+
252
+ - 📖 **[Full Documentation](http://lex.nitrogenlabs.com)** - Complete API reference
253
+ - 🎯 **[Getting Started Guide](http://lex.nitrogenlabs.com/getting-started)** - Step-by-step tutorial
254
+ - 🛠️ **[Configuration Guide](http://lex.nitrogenlabs.com/configuration)** - Customization options
255
+ - 🤖 **[AI Features Guide](http://lex.nitrogenlabs.com/ai-features)** - AI-powered development
256
+ - 🧪 **[Testing Guide](http://lex.nitrogenlabs.com/testing)** - Testing best practices
257
+
258
+ ## 🤝 Contributing
259
+
260
+ We love contributions! Here's how you can help:
261
+
262
+ 1. **Fork** the repository
263
+ 2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)
264
+ 3. **Commit** your changes (`git commit -m 'Add amazing feature'`)
265
+ 4. **Push** to the branch (`git push origin feature/amazing-feature`)
266
+ 5. **Open** a Pull Request
267
+
268
+ ### Development Setup
269
+
270
+ ```bash
271
+ # Clone the repository
272
+ git clone https://github.com/nitrogenlabs/lex.git
273
+
274
+ # Install dependencies
275
+ npm install
276
+
277
+ # Run tests
278
+ npm test
279
+
280
+ # Build the project
281
+ npm run build
282
+ ```
283
+
284
+ ## 📄 License
285
+
286
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
287
+
288
+ ## 🙏 Acknowledgments
289
+
290
+ - **ESBuild** - For lightning-fast bundling
291
+ - **Jest** - For comprehensive testing
292
+ - **TypeScript** - For type safety
293
+ - **Webpack** - For advanced bundling features
294
+ - **Storybook** - For component development
295
+ - **OpenAI/Anthropic** - For AI-powered features
296
+
297
+ ## 📞 Support
298
+
299
+ - 🐛 **Issues** - [GitHub Issues](https://github.com/nitrogenlabs/lex/issues)
300
+ - 💬 **Discussions** - [GitHub Discussions](https://github.com/nitrogenlabs/lex/discussions)
301
+ - 📧 **Email** - <support@nitrogenlabs.com>
302
+ - 🐦 **Twitter** - [@NitrogenLabs](https://twitter.com/NitrogenLabs)
303
+
304
+ ---
305
+
306
+ **Made with ❤️ by [Nitrogen Labs](https://nitrogenlabs.com)**
307
+
308
+ *Lex - Because development should be effortless.*
@@ -0,0 +1,3 @@
1
+ module.exports = {
2
+ compareVersions: jest.fn().mockReturnValue(1)
3
+ };
@@ -0,0 +1 @@
1
+ module.exports = 'test-file-stub';
@@ -0,0 +1 @@
1
+ module.exports = jest.fn().mockResolvedValue('1.0.0');
@@ -0,0 +1,12 @@
1
+ const React = require('react');
2
+
3
+ // Mock implementation of react-markdown
4
+ const ReactMarkdown = ({children}) => {
5
+ return React.createElement('div', {
6
+ 'data-testid': 'react-markdown',
7
+ dangerouslySetInnerHTML: {__html: children}
8
+ });
9
+ };
10
+
11
+ module.exports = ReactMarkdown;
12
+ module.exports.default = ReactMarkdown;
package/babel.config.json CHANGED
@@ -8,6 +8,7 @@
8
8
  }
9
9
  }
10
10
  ],
11
- "@babel/preset-typescript"
11
+ "@babel/preset-typescript",
12
+ "@babel/preset-react"
12
13
  ]
13
14
  }
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryObj } from '@storybook/react';
3
+ interface ButtonProps {
4
+ children: React.ReactNode;
5
+ disabled?: boolean;
6
+ onClick?: () => void;
7
+ size?: 'lg' | 'md' | 'sm';
8
+ variant?: 'outline' | 'primary' | 'secondary';
9
+ }
10
+ declare const Button: React.FC<ButtonProps>;
11
+ declare const meta: Meta<typeof Button>;
12
+ export default meta;
13
+ type Story = StoryObj<typeof meta>;
14
+ export declare const Primary: Story;
15
+ export declare const Secondary: Story;
16
+ export declare const Outline: Story;
17
+ export declare const Small: Story;
18
+ export declare const Large: Story;
19
+ export declare const Disabled: Story;
@@ -0,0 +1,84 @@
1
+ export interface EsbuildConfig {
2
+ entryPoints?: string[];
3
+ outdir?: string;
4
+ platform?: 'node' | 'browser';
5
+ target?: string;
6
+ format?: 'cjs' | 'esm';
7
+ minify?: boolean;
8
+ treeShaking?: boolean;
9
+ drop?: string[];
10
+ pure?: string[];
11
+ external?: string[];
12
+ splitting?: boolean;
13
+ metafile?: boolean;
14
+ sourcemap?: boolean | 'inline' | 'external';
15
+ legalComments?: 'none' | 'inline' | 'eof' | 'linked' | 'separate';
16
+ banner?: Record<string, string>;
17
+ footer?: Record<string, string>;
18
+ define?: Record<string, string>;
19
+ [key: string]: unknown;
20
+ }
21
+ export interface JestConfig {
22
+ roots?: string[];
23
+ testEnvironment?: string;
24
+ transform?: Record<string, [string, Record<string, unknown>]>;
25
+ transformIgnorePatterns?: string[];
26
+ moduleNameMapper?: Record<string, string>;
27
+ extensionsToTreatAsEsm?: string[];
28
+ preset?: string;
29
+ [key: string]: unknown;
30
+ }
31
+ export interface WebpackConfig {
32
+ entry?: string | string[];
33
+ output?: Record<string, unknown>;
34
+ module?: Record<string, unknown>;
35
+ plugins?: unknown[];
36
+ [key: string]: unknown;
37
+ }
38
+ export interface AIConfig {
39
+ provider?: 'cursor' | 'copilot' | 'openai' | 'anthropic' | 'none';
40
+ apiKey?: string;
41
+ model?: string;
42
+ maxTokens?: number;
43
+ temperature?: number;
44
+ }
45
+ export interface LexConfigType {
46
+ ai?: AIConfig;
47
+ configFiles?: string[];
48
+ copyFiles?: string[];
49
+ entryHTML?: string;
50
+ entryJs?: string;
51
+ esbuild?: EsbuildConfig;
52
+ env?: object;
53
+ gitUrl?: string;
54
+ jest?: JestConfig;
55
+ libraryName?: string;
56
+ libraryTarget?: string;
57
+ outputFile?: string;
58
+ outputFullPath?: string;
59
+ outputHash?: boolean;
60
+ outputPath?: string;
61
+ packageManager?: 'npm' | 'yarn';
62
+ preset?: 'web' | 'node' | 'lambda' | 'mobile';
63
+ sourceFullPath?: string;
64
+ sourcePath?: string;
65
+ targetEnvironment?: 'node' | 'web';
66
+ useGraphQl?: boolean;
67
+ useTypescript?: boolean;
68
+ webpack?: WebpackConfig;
69
+ }
70
+ export type Config = LexConfigType;
71
+ export declare const defaultConfigValues: LexConfigType;
72
+ export declare function getTypeScriptConfigPath(configName: string): string;
73
+ export declare class LexConfig {
74
+ static config: LexConfigType;
75
+ static getLexDir(): string;
76
+ static set useTypescript(value: boolean);
77
+ static updateConfig(updatedConfig: LexConfigType): LexConfigType;
78
+ static addConfigParams(cmd: any, params: LexConfigType): void;
79
+ static parseConfig(cmd: any, isRoot?: boolean): Promise<void>;
80
+ static checkTypescriptConfig(): void;
81
+ static checkCompileTypescriptConfig(): void;
82
+ static checkLintTypescriptConfig(): void;
83
+ static checkTestTypescriptConfig(): void;
84
+ }
package/dist/LexConfig.js CHANGED
@@ -91,9 +91,6 @@ class LexConfig {
91
91
  static config = {
92
92
  ...defaultConfigValues
93
93
  };
94
- /**
95
- * Get the Lex package root directory, handling both development and installed environments
96
- */
97
94
  static getLexDir() {
98
95
  return dirname(getLexPackageJsonPath());
99
96
  }
@@ -286,4 +283,4 @@ export {
286
283
  defaultConfigValues,
287
284
  getTypeScriptConfigPath
288
285
  };
289
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIGV4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0RGlyTmFtZSwgZ2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVzYnVpbGRDb25maWcge1xuICBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuICBvdXRkaXI/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogJ25vZGUnIHwgJ2Jyb3dzZXInO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gIG1pbmlmeT86IGJvb2xlYW47XG4gIHRyZWVTaGFraW5nPzogYm9vbGVhbjtcbiAgZHJvcD86IHN0cmluZ1tdO1xuICBwdXJlPzogc3RyaW5nW107XG4gIGV4dGVybmFsPzogc3RyaW5nW107XG4gIHNwbGl0dGluZz86IGJvb2xlYW47XG4gIG1ldGFmaWxlPzogYm9vbGVhbjtcbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2V4dGVybmFsJztcbiAgbGVnYWxDb21tZW50cz86ICdub25lJyB8ICdpbmxpbmUnIHwgJ2VvZicgfCAnbGlua2VkJyB8ICdzZXBhcmF0ZSc7XG4gIGJhbm5lcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvb3Rlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlZmluZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmVzdENvbmZpZyB7XG4gIHJvb3RzPzogc3RyaW5nW107XG4gIHRlc3RFbnZpcm9ubWVudD86IHN0cmluZztcbiAgdHJhbnNmb3JtPzogUmVjb3JkPHN0cmluZywgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dPjtcbiAgdHJhbnNmb3JtSWdub3JlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZU1hcHBlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGV4dGVuc2lvbnNUb1RyZWF0QXNFc20/OiBzdHJpbmdbXTtcbiAgcHJlc2V0Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Q29uZmlnVHlwZSB7XG4gIGFpPzogQUlDb25maWc7XG4gIGNvbmZpZ0ZpbGVzPzogc3RyaW5nW107XG4gIGNvcHlGaWxlcz86IHN0cmluZ1tdO1xuICBlbnRyeUhUTUw/OiBzdHJpbmc7XG4gIGVudHJ5SnM/OiBzdHJpbmc7XG4gIGVzYnVpbGQ/OiBFc2J1aWxkQ29uZmlnO1xuICBlbnY/OiBvYmplY3Q7XG4gIGdpdFVybD86IHN0cmluZztcbiAgamVzdD86IEplc3RDb25maWc7XG4gIGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuICBsaWJyYXJ5VGFyZ2V0Pzogc3RyaW5nO1xuICBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICBvdXRwdXRGdWxsUGF0aD86IHN0cmluZztcbiAgb3V0cHV0SGFzaD86IGJvb2xlYW47XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyPzogJ25wbScgfCAneWFybic7XG4gIHByZXNldD86ICd3ZWInIHwgJ25vZGUnIHwgJ2xhbWJkYScgfCAnbW9iaWxlJztcbiAgc291cmNlRnVsbFBhdGg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHRhcmdldEVudmlyb25tZW50PzogJ25vZGUnIHwgJ3dlYic7XG4gIHVzZUdyYXBoUWw/OiBib29sZWFuO1xuICB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbiAgd2VicGFjaz86IFdlYnBhY2tDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IExleENvbmZpZ1R5cGU7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnVmFsdWVzOiBMZXhDb25maWdUeXBlID0ge1xuICBhaToge1xuICAgIHByb3ZpZGVyOiAnbm9uZScsXG4gICAgbW9kZWw6ICdncHQtNG8nLFxuICAgIG1heFRva2VuczogNDAwMCxcbiAgICB0ZW1wZXJhdHVyZTogMC4xXG4gIH0sXG4gIGNvbmZpZ0ZpbGVzOiBbXSxcbiAgY29weUZpbGVzOiBbXSxcbiAgZW50cnlIVE1MOiAnaW5kZXguaHRtbCcsXG4gIGVudHJ5SnM6ICdpbmRleC5qcycsXG4gIGVzYnVpbGQ6IHtcbiAgICBtaW5pZnk6IHRydWUsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZHJvcDogWydjb25zb2xlJywgJ2RlYnVnZ2VyJ10sXG4gICAgcHVyZTogWydjb25zb2xlLmxvZycsICdjb25zb2xlLndhcm4nLCAnY29uc29sZS5lcnJvciddLFxuICAgIGxlZ2FsQ29tbWVudHM6ICdub25lJyxcbiAgICBzcGxpdHRpbmc6IHRydWUsXG4gICAgbWV0YWZpbGU6IGZhbHNlLFxuICAgIHNvdXJjZW1hcDogZmFsc2VcbiAgfSxcbiAgZW52OiBudWxsLFxuICBqZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vZGlzdCcpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vZGlzdCcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnbnBtJyxcbiAgcHJlc2V0OiAnd2ViJyxcbiAgc291cmNlRnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vc3JjJyksXG4gIHNvdXJjZVBhdGg6ICcuL3NyYycsXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7fVxufTtcblxuZnVuY3Rpb24gZmluZExleFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBzdGFydERpcjtcbiAgd2hpbGUoZGlyICE9PSAnLycgJiYgZGlyICE9PSAnLicpIHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aFJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGlmKHBrZy5uYW1lID09PSAnQG5sYWJzL2xleCcpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGRpcm5hbWUoZGlyKTtcbiAgICBpZihwYXJlbnQgPT09IGRpcikge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIEBubGFicy9sZXggcm9vdCcpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXBwcm9wcmlhdGUgVHlwZVNjcmlwdCBjb25maWcgcGF0aCwgcHJpb3JpdGl6aW5nIHByb2plY3QgY29uZmlncyBvdmVyIExleCBjb25maWdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aChjb25maWdOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIEZvciBjb21waWxlIGNvbW1hbmQsIGNoZWNrIGZvciBwcm9qZWN0J3MgYnVpbGQgY29uZmlnIGZpcnN0XG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy5idWlsZC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RCdWlsZENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RCdWlsZENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0QnVpbGRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gRm9yIGxpbnQgY29tbWFuZCwgY2hlY2sgZm9yIHByb2plY3QncyBsaW50IGNvbmZpZyBmaXJzdFxuICBpZihjb25maWdOYW1lID09PSAndHNjb25maWcubGludC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RMaW50Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcuZXNsaW50Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RMaW50Q29uZmlnKSkge1xuICAgICAgcmV0dXJuIHByb2plY3RMaW50Q29uZmlnO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvciB0ZXN0IGNvbW1hbmQsIGNoZWNrIGZvciBwcm9qZWN0J3MgdGVzdCBjb25maWcgZmlyc3RcbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLnRlc3QuanNvbicpIHtcbiAgICBjb25zdCBwcm9qZWN0VGVzdENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLnRlc3QuanNvbicpO1xuICAgIGlmKGV4aXN0c1N5bmMocHJvamVjdFRlc3RDb25maWcpKSB7XG4gICAgICByZXR1cm4gcHJvamVjdFRlc3RDb25maWc7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHRoZSBleGFjdCBjb25maWcgbmFtZSBpbiB0aGUgcHJvamVjdFxuICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgY29uZmlnTmFtZSk7XG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGgpKSB7XG4gICAgcmV0dXJuIHByb2plY3RDb25maWdQYXRoO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgTGV4J3MgY29uZmlnXG4gIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgcmV0dXJuIHBhdGhSZXNvbHZlKGxleERpciwgY29uZmlnTmFtZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBMZXhDb25maWcge1xuICBzdGF0aWMgY29uZmlnOiBMZXhDb25maWdUeXBlID0ge1xuICAgIC4uLmRlZmF1bHRDb25maWdWYWx1ZXNcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBMZXggcGFja2FnZSByb290IGRpcmVjdG9yeSwgaGFuZGxpbmcgYm90aCBkZXZlbG9wbWVudCBhbmQgaW5zdGFsbGVkIGVudmlyb25tZW50c1xuICAgKi9cbiAgc3RhdGljIGdldExleERpcigpOiBzdHJpbmcge1xuICAgIC8vIEFsd2F5cyB1c2UgdGhlIGRpcmVjdG9yeSBvZiBMZXgncyBvd24gcGFja2FnZS5qc29uXG4gICAgcmV0dXJuIGRpcm5hbWUoZ2V0TGV4UGFja2FnZUpzb25QYXRoKCkpO1xuICB9XG5cbiAgc3RhdGljIHNldCB1c2VUeXBlc2NyaXB0KHZhbHVlOiBib29sZWFuKSB7XG4gICAgTGV4Q29uZmlnLmNvbmZpZy51c2VUeXBlc2NyaXB0ID0gdmFsdWU7XG4gICAgY29uc3Qge3NvdXJjZUZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgICBjb25zdCB7ZW50cnlKc30gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gICAgaWYoZW50cnlKcyA9PT0gJ2luZGV4LmpzJyAmJiB2YWx1ZSkge1xuICAgICAgY29uc3QgaW5kZXhQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZUZ1bGxQYXRoLCAnaW5kZXgudHN4Jyk7XG4gICAgICBjb25zdCBoYXNJbmRleFRzeDogYm9vbGVhbiA9IGV4aXN0c1N5bmMoaW5kZXhQYXRoKTtcblxuICAgICAgaWYoaGFzSW5kZXhUc3gpIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzID0gJ2luZGV4LnRzeCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgPSAnaW5kZXgudHMnO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVDb25maWcodXBkYXRlZENvbmZpZzogTGV4Q29uZmlnVHlwZSk6IExleENvbmZpZ1R5cGUge1xuICAgIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgb3V0cHV0UGF0aCwgc291cmNlUGF0aCwgc291cmNlRnVsbFBhdGgsIHVzZVR5cGVzY3JpcHQsIGFpfSA9IHVwZGF0ZWRDb25maWc7XG4gICAgY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgaWYodXNlVHlwZXNjcmlwdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBMZXhDb25maWcudXNlVHlwZXNjcmlwdCA9IHVzZVR5cGVzY3JpcHQ7XG4gICAgfVxuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkICYmIG91dHB1dEZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCAmJiBzb3VyY2VGdWxsUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVkQ29uZmlnLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZihhaSkge1xuICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haSA9IHsuLi5MZXhDb25maWcuY29uZmlnLmFpLCAuLi5haX07XG5cbiAgICAgIGlmKHByb2Nlc3MuZW52LkNVUlNPUl9JREUgPT09ICd0cnVlJyAmJiBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID09PSAnbm9uZScpIHtcbiAgICAgICAgTGV4Q29uZmlnLmNvbmZpZy5haS5wcm92aWRlciA9ICdjdXJzb3InO1xuICAgICAgfVxuICAgIH1cblxuICAgIExleENvbmZpZy5jb25maWcgPSB7Li4uTGV4Q29uZmlnLmNvbmZpZywgLi4udXBkYXRlZENvbmZpZ307XG5cbiAgICByZXR1cm4gTGV4Q29uZmlnLmNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBhZGRDb25maWdQYXJhbXMoY21kLCBwYXJhbXM6IExleENvbmZpZ1R5cGUpIHtcbiAgICBjb25zdCBuYW1lUHJvcGVydHk6IHN0cmluZyA9ICdfbmFtZSc7XG4gICAgY29uc3Qge2Vudmlyb25tZW50LCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCB0eXBlc2NyaXB0fSA9IGNtZDtcblxuICAgIGlmKG91dHB1dFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLm91dHB1dFBhdGggPSBvdXRwdXRQYXRoO1xuICAgICAgcGFyYW1zLm91dHB1dEZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBvdXRwdXRQYXRoKTtcbiAgICB9XG5cbiAgICBpZihzb3VyY2VQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy5zb3VyY2VQYXRoID0gc291cmNlUGF0aDtcbiAgICAgIHBhcmFtcy5zb3VyY2VGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlUGF0aCk7XG4gICAgfVxuXG4gICAgaWYodHlwZXNjcmlwdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudXNlVHlwZXNjcmlwdCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYoZW52aXJvbm1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnRhcmdldEVudmlyb25tZW50ID0gZW52aXJvbm1lbnQgPT09ICd3ZWInID8gJ3dlYicgOiAnbm9kZSc7XG4gICAgfVxuXG4gICAgcHJvY2Vzcy5lbnYuTEVYX0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAge1xuICAgICAgICAuLi5MZXhDb25maWcudXBkYXRlQ29uZmlnKHBhcmFtcyksXG4gICAgICAgIGNvbW1hbmROYW1lOiBjbWRbbmFtZVByb3BlcnR5XSxcbiAgICAgICAgaXNTdGF0aWM6IGNtZC5zdGF0aWNcbiAgICAgIH0sIG51bGwsIDBcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHBhcnNlQ29uZmlnKGNtZCwgaXNSb290OiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGxleENvbmZpZywgbGV4Q29uZmlnTmFtZSwgcXVpZXQsIHR5cGVzY3JpcHQsIGRlYnVnID0gZmFsc2V9ID0gY21kO1xuICAgIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBbJ2pzJywgJ21qcycsICdjanMnLCAndHMnLCAnanNvbiddO1xuICAgIGNvbnN0IGNvbmZpZ0Jhc2VOYW1lOiBzdHJpbmcgPSBsZXhDb25maWdOYW1lIHx8ICdsZXguY29uZmlnJztcbiAgICBsZXQgY29uZmlnUGF0aDogc3RyaW5nID0gbGV4Q29uZmlnIHx8ICcnO1xuICAgIGxldCBjb25maWdFeGlzdHM6IGJvb2xlYW4gPSBsZXhDb25maWcgPyBleGlzdHNTeW5jKGNvbmZpZ1BhdGgpIDogZmFsc2U7XG5cbiAgICBpZighY29uZmlnUGF0aCB8fCAhY29uZmlnRXhpc3RzKSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFNlYXJjaGluZyBmb3IgY29uZmlnIGZpbGVzIHdpdGggYmFzZSBuYW1lOiAke2NvbmZpZ0Jhc2VOYW1lfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBmb3IoY29uc3QgZm9ybWF0IG9mIGNvbmZpZ0Zvcm1hdHMpIHtcbiAgICAgICAgY29uc3QgcG90ZW50aWFsUGF0aCA9IGlzUm9vdFxuICAgICAgICAgID8gcGF0aFJlc29sdmUoY3dkLCBgLi8ke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gKVxuICAgICAgICAgIDogcmVsYXRpdmVGaWxlUGF0aChgJHtjb25maWdCYXNlTmFtZX0uJHtmb3JtYXR9YCwgY3dkKTtcblxuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgQ2hlY2tpbmcgZm9yIGNvbmZpZyBmaWxlOiAke3BvdGVudGlhbFBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihleGlzdHNTeW5jKHBvdGVudGlhbFBhdGgpKSB7XG4gICAgICAgICAgY29uZmlnUGF0aCA9IHBvdGVudGlhbFBhdGg7XG4gICAgICAgICAgY29uZmlnRXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKGNvbmZpZ0V4aXN0cykge1xuICAgICAgbG9nKGBVc2luZyAke2NsaU5hbWV9IGNvbmZpZ3VyYXRpb24gZmlsZTogJHtjb25maWdQYXRofWAsICdub3RlJywgcXVpZXQpO1xuICAgICAgY29uc3QgZXh0OiBzdHJpbmcgPSBwYXRoRXh0bmFtZShjb25maWdQYXRoKTtcblxuICAgICAgaWYoZXh0ID09PSAnLmpzb24nKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQ6IHN0cmluZyA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmOCcpO1xuXG4gICAgICAgIGlmKGNvbmZpZ0NvbnRlbnQpIHtcbiAgICAgICAgICBsZXQgY29uZmlnSnNvbjogTGV4Q29uZmlnVHlwZTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25maWdKc29uID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KT8uZGVmYXVsdCB8fCB7fTtcbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEZhaWxlZCB0byBwYXJzZSBKU09OIGNvbmZpZzogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgY29uZmlnSnNvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtYWxmb3JtZWQsICR7Y29uZmlnUGF0aH1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihbJy5qcycsICcubWpzJywgJy5janMnLCAnLnRzJ10uaW5jbHVkZXMoZXh0KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxldCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihleHQgPT09ICcuY2pzJykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVVybCA9IG5ldyBVUkwoYGZpbGU6Ly8vJHtwYXRoUmVzb2x2ZShjb25maWdQYXRoKX1gKS5ocmVmO1xuXG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgQ29tbW9uSlMgY29uZmlnIGZyb206ICR7ZmlsZVVybH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChmaWxlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgICAgbG9nKGBMb2FkaW5nIEVTTS9UUyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXhDdXN0b21Db25maWcgPSBhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY29uZmlnID0gbGV4Q3VzdG9tQ29uZmlnLmRlZmF1bHQgfHwgbGV4Q3VzdG9tQ29uZmlnO1xuXG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgTG9hZGVkIGNvbmZpZzogJHtKU09OLnN0cmluZ2lmeShjb25maWcsIG51bGwsIDIpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmKCFjb25maWcpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBXYXJuaW5nOiBDb25maWcgZmlsZSBsb2FkZWQgYnV0IG5vIGNvbmZpZ3VyYXRpb24gZm91bmRgLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBMZXhDb25maWcuYWRkQ29uZmlnUGFyYW1zKGNtZCwgY29uZmlnIHx8IHt9KTtcbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIGxvYWQgY29uZmlnIGZpbGU6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb25maWcgZmlsZSBtdXN0IGJlIGEgSlMsIENKUywgTUpTLCBUUywgb3IgSlNPTiBmaWxlLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKCdObyBjb25maWcgZmlsZSBmb3VuZC4gVXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBMZXhDb25maWcudXNlVHlwZXNjcmlwdCA9ICEhdHlwZXNjcmlwdDtcbiAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBMZXhDb25maWcuY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IHRzY29uZmlnUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUoY3dkLCAnLi90c2NvbmZpZy5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1BhdGgpKSB7XG4gICAgICBjb25zdCBkaXJOYW1lID0gZ2V0RGlyTmFtZSgpO1xuICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1BhdGgsIHJlYWRGaWxlU3luYyhwYXRoUmVzb2x2ZShkaXJOYW1lLCAnLi4vLi4vLi4vdHNjb25maWcuYmFzZS5qc29uJykpKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tDb21waWxlVHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdDb21waWxlUGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUobGV4RGlyLCAnLi90c2NvbmZpZy5idWlsZC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ0NvbXBpbGVQYXRoKSkge1xuICAgICAgLy8gVHJ5IHRvIGNvcHkgZnJvbSB0aGUgdGVtcGxhdGUgbG9jYXRpb25cbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgJ3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcbiAgICAgIGlmKGV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnQ29tcGlsZVBhdGgsIHJlYWRGaWxlU3luYyh0ZW1wbGF0ZVBhdGgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY2hlY2tMaW50VHlwZXNjcmlwdENvbmZpZygpIHtcbiAgICBjb25zdCBsZXhEaXIgPSBMZXhDb25maWcuZ2V0TGV4RGlyKCk7XG4gICAgY29uc3QgdHNjb25maWdMaW50UGF0aDogc3RyaW5nID0gcGF0aFJlc29sdmUobGV4RGlyLCAnLi90c2NvbmZpZy5saW50Lmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnTGludFBhdGgpKSB7XG4gICAgICAvLyBUcnkgdG8gY29weSBmcm9tIHRoZSB0ZW1wbGF0ZSBsb2NhdGlvblxuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcubGludC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0xpbnRQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnVGVzdFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcudGVzdC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1Rlc3RQYXRoKSkge1xuICAgICAgLy8gVHJ5IHRvIGNvcHkgZnJvbSB0aGUgdGVtcGxhdGUgbG9jYXRpb25cbiAgICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGhSZXNvbHZlKGxleERpciwgJ3RzY29uZmlnLnRlc3QuanNvbicpO1xuICAgICAgaWYoZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIHdyaXRlRmlsZVN5bmModHNjb25maWdUZXN0UGF0aCwgcmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSJdLAogICJtYXBwaW5ncyI6ICJBQUlBLFNBQVEsWUFBWSxjQUFjLHFCQUFvQjtBQUN0RCxTQUFRLFNBQVMsV0FBVyxhQUFhLFdBQVcsbUJBQWtCO0FBQ3RFLFNBQVEsV0FBVTtBQUVsQixTQUFRLFlBQVksdUJBQXVCLHdCQUF1QjtBQUNsRSxTQUFRLFdBQVU7QUFFbEIsTUFBTSxNQUFjLFFBQVEsSUFBSTtBQTZFekIsTUFBTSxzQkFBcUM7QUFBQSxFQUNoRCxJQUFJO0FBQUEsSUFDRixVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxhQUFhO0FBQUEsRUFDZjtBQUFBLEVBQ0EsYUFBYSxDQUFDO0FBQUEsRUFDZCxXQUFXLENBQUM7QUFBQSxFQUNaLFdBQVc7QUFBQSxFQUNYLFNBQVM7QUFBQSxFQUNULFNBQVM7QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLGFBQWE7QUFBQSxJQUNiLE1BQU0sQ0FBQyxXQUFXLFVBQVU7QUFBQSxJQUM1QixNQUFN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S0FBSztBQUN0RixjQUFHLE9BQU87QUFDUixvQkFBUSxNQUFNLEtBQUs7QUFBQSxVQUNyQjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLE9BQU87QUFDTCxZQUFJO0FBQUEsRUFBSyxPQUFPLGlFQUFpRSxTQUFTLEtBQUs7QUFBQSxNQUNqRztBQUFBLElBQ0YsT0FBTztBQUNMLFVBQUcsT0FBTztBQUNSLFlBQUksc0RBQXNELFFBQVEsS0FBSztBQUFBLE1BQ3pFO0FBRUEsZ0JBQVUsZ0JBQWdCLENBQUMsQ0FBQztBQUM1QixnQkFBVSxnQkFBZ0IsS0FBSyxVQUFVLE1BQU07QUFBQSxJQUNqRDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU8sd0JBQXdCO0FBQzdCLFVBQU0sZUFBdUIsWUFBWSxLQUFLLGlCQUFpQjtBQUUvRCxRQUFHLENBQUMsV0FBVyxZQUFZLEdBQUc7QUFDNUIsWUFBTSxVQUFVLFdBQVc7QUFDM0Isb0JBQWMsY0FBYyxhQUFhLFlBQVksU0FBUyw2QkFBNkIsQ0FBQyxDQUFDO0FBQUEsSUFDL0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLCtCQUErQjtBQUNwQyxVQUFNLFNBQVMsVUFBVSxVQUFVO0FBQ25DLFVBQU0sc0JBQThCLFlBQVksUUFBUSx1QkFBdUI7QUFFL0UsUUFBRyxDQUFDLFdBQVcsbUJBQW1CLEdBQUc7QUFFbkMsWUFBTSxlQUFlLFlBQVksUUFBUSxxQkFBcUI7QUFDOUQsVUFBRyxXQUFXLFlBQVksR0FBRztBQUMzQixzQkFBYyxxQkFBcUIsYUFBYSxZQUFZLENBQUM7QUFBQSxNQUMvRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLDRCQUE0QjtBQUNqQyxVQUFNLFNBQVMsVUFBVSxVQUFVO0FBQ25DLFVBQU0sbUJBQTJCLFlBQVksUUFBUSxzQkFBc0I7QUFFM0UsUUFBRyxDQUFDLFdBQVcsZ0JBQWdCLEdBQUc7QUFFaEMsWUFBTSxlQUFlLFlBQVksUUFBUSxvQkFBb0I7QUFDN0QsVUFBRyxXQUFXLFlBQVksR0FBRztBQUMzQixzQkFBYyxrQkFBa0IsYUFBYSxZQUFZLENBQUM7QUFBQSxNQUM1RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLDRCQUE0QjtBQUNqQyxVQUFNLFNBQVMsVUFBVSxVQUFVO0FBQ25DLFVBQU0sbUJBQTJCLFlBQVksUUFBUSxzQkFBc0I7QUFFM0UsUUFBRyxDQUFDLFdBQVcsZ0JBQWdCLEdBQUc7QUFFaEMsWUFBTSxlQUFlLFlBQVksUUFBUSxvQkFBb0I7QUFDN0QsVUFBRyxXQUFXLFlBQVksR0FBRztBQUMzQixzQkFBYyxrQkFBa0IsYUFBYSxZQUFZLENBQUM7QUFBQSxNQUM1RDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7IiwKICAibmFtZXMiOiBbImN3ZCJdCn0K
286
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL0xleENvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2Rpcm5hbWUsIGV4dG5hbWUgYXMgcGF0aEV4dG5hbWUsIHJlc29sdmUgYXMgcGF0aFJlc29sdmV9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHtVUkx9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7Z2V0RGlyTmFtZSwgZ2V0TGV4UGFja2FnZUpzb25QYXRoLCByZWxhdGl2ZUZpbGVQYXRofSBmcm9tICcuL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vdXRpbHMvbG9nLmpzJztcblxuY29uc3QgY3dkOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVzYnVpbGRDb25maWcge1xuICBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuICBvdXRkaXI/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogJ25vZGUnIHwgJ2Jyb3dzZXInO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gIG1pbmlmeT86IGJvb2xlYW47XG4gIHRyZWVTaGFraW5nPzogYm9vbGVhbjtcbiAgZHJvcD86IHN0cmluZ1tdO1xuICBwdXJlPzogc3RyaW5nW107XG4gIGV4dGVybmFsPzogc3RyaW5nW107XG4gIHNwbGl0dGluZz86IGJvb2xlYW47XG4gIG1ldGFmaWxlPzogYm9vbGVhbjtcbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2V4dGVybmFsJztcbiAgbGVnYWxDb21tZW50cz86ICdub25lJyB8ICdpbmxpbmUnIHwgJ2VvZicgfCAnbGlua2VkJyB8ICdzZXBhcmF0ZSc7XG4gIGJhbm5lcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGZvb3Rlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGRlZmluZT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSmVzdENvbmZpZyB7XG4gIHJvb3RzPzogc3RyaW5nW107XG4gIHRlc3RFbnZpcm9ubWVudD86IHN0cmluZztcbiAgdHJhbnNmb3JtPzogUmVjb3JkPHN0cmluZywgW3N0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj5dPjtcbiAgdHJhbnNmb3JtSWdub3JlUGF0dGVybnM/OiBzdHJpbmdbXTtcbiAgbW9kdWxlTmFtZU1hcHBlcj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGV4dGVuc2lvbnNUb1RyZWF0QXNFc20/OiBzdHJpbmdbXTtcbiAgcHJlc2V0Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYnBhY2tDb25maWcge1xuICBlbnRyeT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBvdXRwdXQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgbW9kdWxlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBsdWdpbnM/OiB1bmtub3duW107XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQUlDb25maWcge1xuICBwcm92aWRlcj86ICdjdXJzb3InIHwgJ2NvcGlsb3QnIHwgJ29wZW5haScgfCAnYW50aHJvcGljJyB8ICdub25lJztcbiAgYXBpS2V5Pzogc3RyaW5nO1xuICBtb2RlbD86IHN0cmluZztcbiAgbWF4VG9rZW5zPzogbnVtYmVyO1xuICB0ZW1wZXJhdHVyZT86IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Q29uZmlnVHlwZSB7XG4gIGFpPzogQUlDb25maWc7XG4gIGNvbmZpZ0ZpbGVzPzogc3RyaW5nW107XG4gIGNvcHlGaWxlcz86IHN0cmluZ1tdO1xuICBlbnRyeUhUTUw/OiBzdHJpbmc7XG4gIGVudHJ5SnM/OiBzdHJpbmc7XG4gIGVzYnVpbGQ/OiBFc2J1aWxkQ29uZmlnO1xuICBlbnY/OiBvYmplY3Q7XG4gIGdpdFVybD86IHN0cmluZztcbiAgamVzdD86IEplc3RDb25maWc7XG4gIGxpYnJhcnlOYW1lPzogc3RyaW5nO1xuICBsaWJyYXJ5VGFyZ2V0Pzogc3RyaW5nO1xuICBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICBvdXRwdXRGdWxsUGF0aD86IHN0cmluZztcbiAgb3V0cHV0SGFzaD86IGJvb2xlYW47XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHBhY2thZ2VNYW5hZ2VyPzogJ25wbScgfCAneWFybic7XG4gIHByZXNldD86ICd3ZWInIHwgJ25vZGUnIHwgJ2xhbWJkYScgfCAnbW9iaWxlJztcbiAgc291cmNlRnVsbFBhdGg/OiBzdHJpbmc7XG4gIHNvdXJjZVBhdGg/OiBzdHJpbmc7XG4gIHRhcmdldEVudmlyb25tZW50PzogJ25vZGUnIHwgJ3dlYic7XG4gIHVzZUdyYXBoUWw/OiBib29sZWFuO1xuICB1c2VUeXBlc2NyaXB0PzogYm9vbGVhbjtcbiAgd2VicGFjaz86IFdlYnBhY2tDb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IExleENvbmZpZ1R5cGU7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnVmFsdWVzOiBMZXhDb25maWdUeXBlID0ge1xuICBhaToge1xuICAgIHByb3ZpZGVyOiAnbm9uZScsXG4gICAgbW9kZWw6ICdncHQtNG8nLFxuICAgIG1heFRva2VuczogNDAwMCxcbiAgICB0ZW1wZXJhdHVyZTogMC4xXG4gIH0sXG4gIGNvbmZpZ0ZpbGVzOiBbXSxcbiAgY29weUZpbGVzOiBbXSxcbiAgZW50cnlIVE1MOiAnaW5kZXguaHRtbCcsXG4gIGVudHJ5SnM6ICdpbmRleC5qcycsXG4gIGVzYnVpbGQ6IHtcbiAgICBtaW5pZnk6IHRydWUsXG4gICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgZHJvcDogWydjb25zb2xlJywgJ2RlYnVnZ2VyJ10sXG4gICAgcHVyZTogWydjb25zb2xlLmxvZycsICdjb25zb2xlLndhcm4nLCAnY29uc29sZS5lcnJvciddLFxuICAgIGxlZ2FsQ29tbWVudHM6ICdub25lJyxcbiAgICBzcGxpdHRpbmc6IHRydWUsXG4gICAgbWV0YWZpbGU6IGZhbHNlLFxuICAgIHNvdXJjZW1hcDogZmFsc2VcbiAgfSxcbiAgZW52OiBudWxsLFxuICBqZXN0OiB7fSxcbiAgb3V0cHV0RnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vZGlzdCcpLFxuICBvdXRwdXRIYXNoOiBmYWxzZSxcbiAgb3V0cHV0UGF0aDogJy4vZGlzdCcsXG4gIHBhY2thZ2VNYW5hZ2VyOiAnbnBtJyxcbiAgcHJlc2V0OiAnd2ViJyxcbiAgc291cmNlRnVsbFBhdGg6IHBhdGhSZXNvbHZlKGN3ZCwgJy4vc3JjJyksXG4gIHNvdXJjZVBhdGg6ICcuL3NyYycsXG4gIHRhcmdldEVudmlyb25tZW50OiAnd2ViJyxcbiAgdXNlR3JhcGhRbDogZmFsc2UsXG4gIHVzZVR5cGVzY3JpcHQ6IGZhbHNlLFxuICB3ZWJwYWNrOiB7fVxufTtcblxuZnVuY3Rpb24gZmluZExleFJvb3Qoc3RhcnREaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBzdGFydERpcjtcbiAgd2hpbGUoZGlyICE9PSAnLycgJiYgZGlyICE9PSAnLicpIHtcbiAgICBjb25zdCBwa2dQYXRoID0gcGF0aFJlc29sdmUoZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwa2dQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0ZjgnKSk7XG4gICAgICAgIGlmKHBrZy5uYW1lID09PSAnQG5sYWJzL2xleCcpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoe31cbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShkaXIpO1xuICAgIGlmKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgQG5sYWJzL2xleCByb290Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aChjb25maWdOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGlmKGNvbmZpZ05hbWUgPT09ICd0c2NvbmZpZy5idWlsZC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RCdWlsZENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHByb2plY3RCdWlsZENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0QnVpbGRDb25maWc7XG4gICAgfVxuICB9XG5cbiAgaWYoY29uZmlnTmFtZSA9PT0gJ3RzY29uZmlnLmxpbnQuanNvbicpIHtcbiAgICBjb25zdCBwcm9qZWN0TGludENvbmZpZyA9IHBhdGhSZXNvbHZlKGN3ZCwgJ3RzY29uZmlnLmVzbGludC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0TGludENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0TGludENvbmZpZztcbiAgICB9XG4gIH1cblxuICBpZihjb25maWdOYW1lID09PSAndHNjb25maWcudGVzdC5qc29uJykge1xuICAgIGNvbnN0IHByb2plY3RUZXN0Q29uZmlnID0gcGF0aFJlc29sdmUoY3dkLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0VGVzdENvbmZpZykpIHtcbiAgICAgIHJldHVybiBwcm9qZWN0VGVzdENvbmZpZztcbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0Q29uZmlnUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgY29uZmlnTmFtZSk7XG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGgpKSB7XG4gICAgcmV0dXJuIHByb2plY3RDb25maWdQYXRoO1xuICB9XG5cbiAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICByZXR1cm4gcGF0aFJlc29sdmUobGV4RGlyLCBjb25maWdOYW1lKTtcbn1cblxuZXhwb3J0IGNsYXNzIExleENvbmZpZyB7XG4gIHN0YXRpYyBjb25maWc6IExleENvbmZpZ1R5cGUgPSB7XG4gICAgLi4uZGVmYXVsdENvbmZpZ1ZhbHVlc1xuICB9O1xuXG4gIHN0YXRpYyBnZXRMZXhEaXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGlybmFtZShnZXRMZXhQYWNrYWdlSnNvblBhdGgoKSk7XG4gIH1cblxuICBzdGF0aWMgc2V0IHVzZVR5cGVzY3JpcHQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBMZXhDb25maWcuY29uZmlnLnVzZVR5cGVzY3JpcHQgPSB2YWx1ZTtcbiAgICBjb25zdCB7c291cmNlRnVsbFBhdGh9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICAgIGNvbnN0IHtlbnRyeUpzfSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgICBpZihlbnRyeUpzID09PSAnaW5kZXguanMnICYmIHZhbHVlKSB7XG4gICAgICBjb25zdCBpbmRleFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGN3ZCwgc291cmNlRnVsbFBhdGgsICdpbmRleC50c3gnKTtcbiAgICAgIGNvbnN0IGhhc0luZGV4VHN4OiBib29sZWFuID0gZXhpc3RzU3luYyhpbmRleFBhdGgpO1xuXG4gICAgICBpZihoYXNJbmRleFRzeCkge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgPSAnaW5kZXgudHN4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIExleENvbmZpZy5jb25maWcuZW50cnlKcyA9ICdpbmRleC50cyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnOiBMZXhDb25maWdUeXBlKTogTGV4Q29uZmlnVHlwZSB7XG4gICAgY29uc3Qge291dHB1dEZ1bGxQYXRoLCBvdXRwdXRQYXRoLCBzb3VyY2VQYXRoLCBzb3VyY2VGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdCwgYWl9ID0gdXBkYXRlZENvbmZpZztcbiAgICBjb25zdCBjd2Q6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgICBpZih1c2VUeXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gdXNlVHlwZXNjcmlwdDtcbiAgICB9XG5cbiAgICBpZihvdXRwdXRQYXRoICE9PSB1bmRlZmluZWQgJiYgb3V0cHV0RnVsbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlZENvbmZpZy5vdXRwdXRGdWxsUGF0aCA9IHBhdGhSZXNvbHZlKGN3ZCwgb3V0cHV0UGF0aCk7XG4gICAgfVxuXG4gICAgaWYoc291cmNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZUZ1bGxQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHVwZGF0ZWRDb25maWcuc291cmNlRnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIHNvdXJjZVBhdGgpO1xuICAgIH1cblxuICAgIGlmKGFpKSB7XG4gICAgICBMZXhDb25maWcuY29uZmlnLmFpID0gey4uLkxleENvbmZpZy5jb25maWcuYWksIC4uLmFpfTtcblxuICAgICAgaWYocHJvY2Vzcy5lbnYuQ1VSU09SX0lERSA9PT0gJ3RydWUnICYmIExleENvbmZpZy5jb25maWcuYWkucHJvdmlkZXIgPT09ICdub25lJykge1xuICAgICAgICBMZXhDb25maWcuY29uZmlnLmFpLnByb3ZpZGVyID0gJ2N1cnNvcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgTGV4Q29uZmlnLmNvbmZpZyA9IHsuLi5MZXhDb25maWcuY29uZmlnLCAuLi51cGRhdGVkQ29uZmlnfTtcblxuICAgIHJldHVybiBMZXhDb25maWcuY29uZmlnO1xuICB9XG5cbiAgc3RhdGljIGFkZENvbmZpZ1BhcmFtcyhjbWQsIHBhcmFtczogTGV4Q29uZmlnVHlwZSkge1xuICAgIGNvbnN0IG5hbWVQcm9wZXJ0eTogc3RyaW5nID0gJ19uYW1lJztcbiAgICBjb25zdCB7ZW52aXJvbm1lbnQsIG91dHB1dFBhdGgsIHNvdXJjZVBhdGgsIHR5cGVzY3JpcHR9ID0gY21kO1xuXG4gICAgaWYob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMub3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7XG4gICAgICBwYXJhbXMub3V0cHV0RnVsbFBhdGggPSBwYXRoUmVzb2x2ZShjd2QsIG91dHB1dFBhdGgpO1xuICAgIH1cblxuICAgIGlmKHNvdXJjZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnNvdXJjZVBhdGggPSBzb3VyY2VQYXRoO1xuICAgICAgcGFyYW1zLnNvdXJjZUZ1bGxQYXRoID0gcGF0aFJlc29sdmUoY3dkLCBzb3VyY2VQYXRoKTtcbiAgICB9XG5cbiAgICBpZih0eXBlc2NyaXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcy51c2VUeXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZihlbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMudGFyZ2V0RW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAnd2ViJyA6ICdub2RlJztcbiAgICB9XG5cbiAgICBwcm9jZXNzLmVudi5MRVhfQ09ORklHID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB7XG4gICAgICAgIC4uLkxleENvbmZpZy51cGRhdGVDb25maWcocGFyYW1zKSxcbiAgICAgICAgY29tbWFuZE5hbWU6IGNtZFtuYW1lUHJvcGVydHldLFxuICAgICAgICBpc1N0YXRpYzogY21kLnN0YXRpY1xuICAgICAgfSwgbnVsbCwgMFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgcGFyc2VDb25maWcoY21kLCBpc1Jvb3Q6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge2NsaU5hbWUgPSAnTGV4JywgbGV4Q29uZmlnLCBsZXhDb25maWdOYW1lLCBxdWlldCwgdHlwZXNjcmlwdCwgZGVidWcgPSBmYWxzZX0gPSBjbWQ7XG4gICAgY29uc3QgY29uZmlnRm9ybWF0cyA9IFsnanMnLCAnbWpzJywgJ2NqcycsICd0cycsICdqc29uJ107XG4gICAgY29uc3QgY29uZmlnQmFzZU5hbWU6IHN0cmluZyA9IGxleENvbmZpZ05hbWUgfHwgJ2xleC5jb25maWcnO1xuICAgIGxldCBjb25maWdQYXRoOiBzdHJpbmcgPSBsZXhDb25maWcgfHwgJyc7XG4gICAgbGV0IGNvbmZpZ0V4aXN0czogYm9vbGVhbiA9IGxleENvbmZpZyA/IGV4aXN0c1N5bmMoY29uZmlnUGF0aCkgOiBmYWxzZTtcblxuICAgIGlmKCFjb25maWdQYXRoIHx8ICFjb25maWdFeGlzdHMpIHtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgU2VhcmNoaW5nIGZvciBjb25maWcgZmlsZXMgd2l0aCBiYXNlIG5hbWU6ICR7Y29uZmlnQmFzZU5hbWV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIGZvcihjb25zdCBmb3JtYXQgb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgICBjb25zdCBwb3RlbnRpYWxQYXRoID0gaXNSb290XG4gICAgICAgICAgPyBwYXRoUmVzb2x2ZShjd2QsIGAuLyR7Y29uZmlnQmFzZU5hbWV9LiR7Zm9ybWF0fWApXG4gICAgICAgICAgOiByZWxhdGl2ZUZpbGVQYXRoKGAke2NvbmZpZ0Jhc2VOYW1lfS4ke2Zvcm1hdH1gLCBjd2QpO1xuXG4gICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBDaGVja2luZyBmb3IgY29uZmlnIGZpbGU6ICR7cG90ZW50aWFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGV4aXN0c1N5bmMocG90ZW50aWFsUGF0aCkpIHtcbiAgICAgICAgICBjb25maWdQYXRoID0gcG90ZW50aWFsUGF0aDtcbiAgICAgICAgICBjb25maWdFeGlzdHMgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnRXhpc3RzKSB7XG4gICAgICBsb2coYFVzaW5nICR7Y2xpTmFtZX0gY29uZmlndXJhdGlvbiBmaWxlOiAke2NvbmZpZ1BhdGh9YCwgJ25vdGUnLCBxdWlldCk7XG4gICAgICBjb25zdCBleHQ6IHN0cmluZyA9IHBhdGhFeHRuYW1lKGNvbmZpZ1BhdGgpO1xuXG4gICAgICBpZihleHQgPT09ICcuanNvbicpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudDogc3RyaW5nID0gcmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGY4Jyk7XG5cbiAgICAgICAgaWYoY29uZmlnQ29udGVudCkge1xuICAgICAgICAgIGxldCBjb25maWdKc29uOiBMZXhDb25maWdUeXBlO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ0pzb24gPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpPy5kZWZhdWx0IHx8IHt9O1xuICAgICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHBhcnNlIEpTT04gY29uZmlnOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgY29uZmlnSnNvbiA9IHt9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWdKc29uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG1hbGZvcm1lZCwgJHtjb25maWdQYXRofWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKFsnLmpzJywgJy5tanMnLCAnLmNqcycsICcudHMnXS5pbmNsdWRlcyhleHQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IGxleEN1c3RvbUNvbmZpZztcblxuICAgICAgICAgIGlmKGV4dCA9PT0gJy5janMnKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gbmV3IFVSTChgZmlsZTovLy8ke3BhdGhSZXNvbHZlKGNvbmZpZ1BhdGgpfWApLmhyZWY7XG5cbiAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgIGxvZyhgTG9hZGluZyBDb21tb25KUyBjb25maWcgZnJvbTogJHtmaWxlVXJsfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV4Q3VzdG9tQ29uZmlnID0gYXdhaXQgaW1wb3J0KGZpbGVVcmwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICBsb2coYExvYWRpbmcgRVNNL1RTIGNvbmZpZyBmcm9tOiAke2NvbmZpZ1BhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxleEN1c3RvbUNvbmZpZyA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb25maWcgPSBsZXhDdXN0b21Db25maWcuZGVmYXVsdCB8fCBsZXhDdXN0b21Db25maWc7XG5cbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBMb2FkZWQgY29uZmlnOiAke0pTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYoIWNvbmZpZykge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IENvbmZpZyBmaWxlIGxvYWRlZCBidXQgbm8gY29uZmlndXJhdGlvbiBmb3VuZGAsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIExleENvbmZpZy5hZGRDb25maWdQYXJhbXMoY21kLCBjb25maWcgfHwge30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gbG9hZCBjb25maWcgZmlsZTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IENvbmZpZyBmaWxlIG11c3QgYmUgYSBKUywgQ0pTLCBNSlMsIFRTLCBvciBKU09OIGZpbGUuYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coJ05vIGNvbmZpZyBmaWxlIGZvdW5kLiBVc2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG5cbiAgICAgIExleENvbmZpZy51c2VUeXBlc2NyaXB0ID0gISF0eXBlc2NyaXB0O1xuICAgICAgTGV4Q29uZmlnLmFkZENvbmZpZ1BhcmFtcyhjbWQsIExleENvbmZpZy5jb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja1R5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgdHNjb25maWdQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShjd2QsICcuL3RzY29uZmlnLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnUGF0aCkpIHtcbiAgICAgIGNvbnN0IGRpck5hbWUgPSBnZXREaXJOYW1lKCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKHRzY29uZmlnUGF0aCwgcmVhZEZpbGVTeW5jKHBhdGhSZXNvbHZlKGRpck5hbWUsICcuLi8uLi8uLi90c2NvbmZpZy5iYXNlLmpzb24nKSkpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGVja0NvbXBpbGVUeXBlc2NyaXB0Q29uZmlnKCkge1xuICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICBjb25zdCB0c2NvbmZpZ0NvbXBpbGVQYXRoOiBzdHJpbmcgPSBwYXRoUmVzb2x2ZShsZXhEaXIsICcuL3RzY29uZmlnLmJ1aWxkLmpzb24nKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKHRzY29uZmlnQ29tcGlsZVBhdGgpKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoUmVzb2x2ZShsZXhEaXIsICd0c2NvbmZpZy5idWlsZC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0NvbXBpbGVQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrTGludFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnTGludFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcubGludC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ0xpbnRQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcubGludC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ0xpbnRQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKSB7XG4gICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgIGNvbnN0IHRzY29uZmlnVGVzdFBhdGg6IHN0cmluZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJy4vdHNjb25maWcudGVzdC5qc29uJyk7XG5cbiAgICBpZighZXhpc3RzU3luYyh0c2NvbmZpZ1Rlc3RQYXRoKSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aFJlc29sdmUobGV4RGlyLCAndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgICBpZihleGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgICAgd3JpdGVGaWxlU3luYyh0c2NvbmZpZ1Rlc3RQYXRoLCByZWFkRmlsZVN5bmModGVtcGxhdGVQYXRoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLGNBQWMscUJBQW9CO0FBQ3RELFNBQVEsU0FBUyxXQUFXLGFBQWEsV0FBVyxtQkFBa0I7QUFDdEUsU0FBUSxXQUFVO0FBRWxCLFNBQVEsWUFBWSx1QkFBdUIsd0JBQXVCO0FBQ2xFLFNBQVEsV0FBVTtBQUVsQixNQUFNLE1BQWMsUUFBUSxJQUFJO0FBNkV6QixNQUFNLHNCQUFxQztBQUFBLEVBQ2hELElBQUk7QUFBQSxJQUNGLFVBQVU7QUFBQSxJQUNWLE9B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