@mikarinneoracle/oci-cdk-code-only-preview 0.0.26 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,7 +73,7 @@ Only **`OCI_COMPARTMENT_ID`** (or `OCI_COMPARTMENT_OCID`) is required for deploy
73
73
  | `OCI_STATE_HTTP_UPDATE_METHOD` | Update method (for `http` backend) | `PUT` |
74
74
  | `OCI_STATE_HTTP_LOCK_ADDRESS` | Lock endpoint URL | — |
75
75
  | `OCI_STATE_HTTP_UNLOCK_ADDRESS` | Unlock endpoint URL | — |
76
- | **Log tail (tail-function-logs.js / tail:execution-log)** | | |
76
+ | **Log tail (.ocdk/tail-function-logs.js / tail:execution-log)** | | |
77
77
  | `OCI_COMPARTMENT_ID` or `OCI_COMPARTMENT_OCID` | Required for tail | — |
78
78
  | `OCI_LOG_GROUP_ID` | Log group OCID | terraform output / `write-log-config` |
79
79
  | `OCI_EXECUTION_LOG_ID` | Execution log OCID | terraform output / `write-log-config` |
@@ -142,6 +142,23 @@ entrypoint: node func.js
142
142
 
143
143
  Keep `@fnproject/fdk` in `package.json` dependencies. The function source file uses `fdk.handle(...)`; it is not the OCI handler value.
144
144
 
145
+ For Java, the code-only archive must contain exactly one fat/uber JAR at the ZIP root. Build it first and point OCDK to it when necessary:
146
+
147
+ ```bash
148
+ export OCI_CODE_ONLY_RUNTIME_NAME='java21.ol9'
149
+ export OCI_FUNCTION_HANDLER='com.example.fn.HelloFunction::handleRequest'
150
+ export OCI_FUNCTION_JAR_PATH='target/my-function.jar'
151
+ ```
152
+
153
+ Before the first deploy, build the function JAR:
154
+
155
+ ```bash
156
+ mvn -DskipTests package
157
+ # or: gradle build -x test
158
+ ```
159
+
160
+ OCDK also runs this build automatically when no artifact exists yet, and searches the project root, Maven `target/`, and Gradle `build/libs/`. The build must produce a fat/uber JAR: Maven projects normally use `maven-shade-plugin`, and Gradle projects use the Shadow plugin. If several JARs exist, set `OCI_FUNCTION_JAR_PATH` to the fat JAR explicitly. Java archives do not contain the project source tree or a `function/` directory.
161
+
145
162
  #### Find the available code-only runtimes
146
163
 
147
164
  The exact `OCI_CODE_ONLY_RUNTIME_NAME` values are enabled per tenancy and region during this Limited Availability preview. Query the Preview CLI instead of copying a runtime name from another environment:
@@ -167,7 +184,7 @@ export OCI_FUNCTION_APP_NAME='my-existing-function-app'
167
184
 
168
185
  These settings are optional: `OCI_CODE_ONLY_SOURCE_DIR` (defaults to the current directory), `OCI_FUNCTION_MEMORY_MB` (from `func.yaml`, otherwise `256`), and `OCI_FUNCTION_TIMEOUT_SECONDS` (from `func.yaml`, otherwise `30`). `OCI_TENANCY_ID`, `OCI_REGION`, and `OCI_NAMESPACE` are also optional when they can be resolved from the active OCI CLI profile.
169
186
 
170
- Each deploy re-builds `<function-name>.zip` in the project root and uploads that file. The ZIP has the required `function/` directory at its root, includes source files, and excludes `node_modules`, `package-lock.json`, `.git`, `.tools`, `.terraform`, `cdktf.out`, and the generated `tail-function-logs.js`. For Node.js functions, a sanitized `package.json` remains so OCI can install the FDK and other dependencies; OCDK removes its own package dependency (`@mikarinneoracle/oci-cdk-code-only-preview`, and the legacy package name) from that copied manifest. For Python and Java code-only functions, `package.json` is excluded entirely. A successful code-only destroy removes this ZIP after Terraform has destroyed the Function App and infrastructure. With the default `OCI_STACK_ACTION=full-stack`, OCDK creates the API Gateway and uses a Terraform data source to resolve the CLI-managed function OCID for its route. The first code-only deploy therefore runs Terraform once to create the Function App, uploads the function, then runs Terraform again to create the Gateway deployment. Set `OCI_STACK_ACTION=function-only` to omit API Gateway.
187
+ Each deploy re-builds `<function-name>.zip` in the project root and uploads that file. The ZIP has the required `function/` directory at its root, includes source files, and excludes `node_modules`, `package-lock.json`, `.git`, `.tools`, `.terraform`, `cdktf.out`, and the generated `.ocdk/` directory. For Node.js functions, a sanitized `package.json` remains so OCI can install the FDK and other dependencies; OCDK removes its own package dependency (`@mikarinneoracle/oci-cdk-code-only-preview`, and the legacy package name) from that copied manifest. For Python and Java code-only functions, `package.json` is excluded entirely. A successful code-only destroy removes this ZIP after Terraform has destroyed the Function App and infrastructure. With the default `OCI_STACK_ACTION=full-stack`, OCDK creates the API Gateway and uses a Terraform data source to resolve the CLI-managed function OCID for its route. The first code-only deploy therefore runs Terraform once to create the Function App, uploads the function, then runs Terraform again to create the Gateway deployment. Set `OCI_STACK_ACTION=function-only` to omit API Gateway.
171
188
 
172
189
  After a successful code-only deploy, OCDK writes the log IDs for `npx ocdk tail:execution-log` automatically.
173
190
 
@@ -186,7 +203,7 @@ npx ocdk destroy --auto-approve --code-only
186
203
  ```
187
204
 
188
205
  - **`npx ocdk deploy`** – Deploy the stack. Options (e.g. `--auto-approve`) are passed through.
189
- - **`npx ocdk tail:execution-log`** – Tail function execution logs. Resolves log IDs from terraform output or `OCI_LOG_GROUP_ID` / `OCI_EXECUTION_LOG_ID`. Set **`OCI_TAIL_DEBUG=1`** to print debug info to stderr if you get no output. Requires **`OCI_COMPARTMENT_ID`** (or `OCI_COMPARTMENT_OCID`) when run without a project `tail-function-logs.js`.
206
+ - **`npx ocdk tail:execution-log`** – Tail function execution logs. Resolves log IDs from Terraform output or `OCI_LOG_GROUP_ID` / `OCI_EXECUTION_LOG_ID`. Its generated helper is stored under `.ocdk/` and ignored by Git. Set **`OCI_TAIL_DEBUG=1`** to print debug info to stderr if you get no output. Requires **`OCI_COMPARTMENT_ID`** (or `OCI_COMPARTMENT_OCID`) when run without generated log configuration.
190
207
  - **`npx ocdk destroy`** – Destroy the stack (Terraform destroy) using the same state/backend configuration as deploy. Options (e.g. `--auto-approve`) are passed through.
191
208
 
192
209
  ## Security notes
@@ -94,6 +94,70 @@ function preparePackageManifest(archiveRoot) {
94
94
  }
95
95
  }
96
96
 
97
+ function listJavaJarCandidates() {
98
+ return [projectDir, path.join(projectDir, 'target'), path.join(projectDir, 'build', 'libs')]
99
+ .flatMap((directory) => {
100
+ if (!fs.existsSync(directory)) return [];
101
+ return fs.readdirSync(directory)
102
+ .filter((name) => name.endsWith('.jar') && !name.endsWith('-sources.jar') && !name.endsWith('-javadoc.jar') && !name.endsWith('-plain.jar') && !name.startsWith('original-'))
103
+ .map((name) => path.join(directory, name));
104
+ });
105
+ }
106
+
107
+ function buildJavaProject() {
108
+ let command;
109
+ let args;
110
+ if (fs.existsSync(path.join(projectDir, 'pom.xml'))) {
111
+ command = fs.existsSync(path.join(projectDir, 'mvnw')) ? './mvnw' : 'mvn';
112
+ args = ['-q', '-DskipTests', 'package'];
113
+ } else if (fs.existsSync(path.join(projectDir, 'build.gradle')) || fs.existsSync(path.join(projectDir, 'build.gradle.kts'))) {
114
+ command = fs.existsSync(path.join(projectDir, 'gradlew')) ? './gradlew' : 'gradle';
115
+ args = ['build', '-x', 'test'];
116
+ } else {
117
+ return;
118
+ }
119
+ console.log(`Building Java function with ${command} ${args.join(' ')}...`);
120
+ const result = spawnSync(command, args, { cwd: projectDir, encoding: 'utf8', shell: false });
121
+ if (result.error || result.status !== 0) {
122
+ fail(`Java build failed: ${result.stderr?.trim() || result.stdout?.trim() || result.error?.message || 'unknown error'}`);
123
+ }
124
+ }
125
+
126
+ function isFatJavaJar(jarPath) {
127
+ const result = spawnSync('jar', ['tf', jarPath], { encoding: 'utf8', shell: false });
128
+ if (result.error || result.status !== 0) return false;
129
+ return /(^|\n)com\/fnproject\/fn\/(api|runtime)\//.test(result.stdout || '');
130
+ }
131
+
132
+ function resolveJavaJar() {
133
+ const configuredPath = (process.env.OCI_CODE_ONLY_JAR_PATH || process.env.OCI_FUNCTION_JAR_PATH || '').trim();
134
+ if (configuredPath) {
135
+ const jarPath = path.resolve(projectDir, configuredPath);
136
+ if (!fs.existsSync(jarPath) || !fs.statSync(jarPath).isFile() || !jarPath.endsWith('.jar')) {
137
+ fail(`OCI_FUNCTION_JAR_PATH must point to an existing .jar file: ${jarPath}`);
138
+ }
139
+ if (!isFatJavaJar(jarPath)) {
140
+ fail(`Java archive is not a fat/uber JAR: ${jarPath}. Configure your Maven Shade or Gradle Shadow build, then point OCI_FUNCTION_JAR_PATH to its output.`);
141
+ }
142
+ return jarPath;
143
+ }
144
+ let candidates = listJavaJarCandidates();
145
+ if (!candidates.length) {
146
+ buildJavaProject();
147
+ candidates = listJavaJarCandidates();
148
+ }
149
+ const uniqueCandidates = [...new Set(candidates)];
150
+ if (uniqueCandidates.length === 1) {
151
+ if (!isFatJavaJar(uniqueCandidates[0])) {
152
+ fail(`Java build produced a non-fat JAR: ${uniqueCandidates[0]}. Configure your Maven Shade or Gradle Shadow build, then set OCI_FUNCTION_JAR_PATH to its fat/uber JAR.`);
153
+ }
154
+ return uniqueCandidates[0];
155
+ }
156
+ const found = uniqueCandidates.length ? ` Found: ${uniqueCandidates.join(', ')}` : '';
157
+ const guidance = ' Run `mvn -DskipTests package` (or `gradle build -x test`) to produce a fat/uber JAR using Maven Shade or Gradle Shadow, then set OCI_FUNCTION_JAR_PATH (for example target/my-function-all.jar).';
158
+ fail(`Java code-only deploy requires exactly one fat/uber JAR.${guidance}${found}`);
159
+ }
160
+
97
161
  function createArchive(functionName, runtimeName) {
98
162
  if (!fs.existsSync(projectDir) || !fs.statSync(projectDir).isDirectory()) {
99
163
  fail(`source directory does not exist: ${projectDir}`);
@@ -101,9 +165,23 @@ function createArchive(functionName, runtimeName) {
101
165
  const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ocdk-code-only-'));
102
166
  const archiveFileName = codeOnlyArchiveFileName(functionName);
103
167
  const archivePath = path.join(projectDir, archiveFileName);
104
- const archiveRoot = path.join(tempDir, 'function');
168
+ const isJavaRuntime = runtimeName.toLowerCase().startsWith('java');
105
169
  const isNodeRuntime = runtimeName.toLowerCase().startsWith('node');
106
- const excludedTopLevel = new Set(['node_modules', '.git', '.tools', '.terraform', 'cdktf.out', 'tail-function-logs.js', 'package-lock.json']);
170
+ if (isJavaRuntime) {
171
+ const jarPath = resolveJavaJar();
172
+ const jarName = path.basename(jarPath);
173
+ fs.copyFileSync(jarPath, path.join(tempDir, jarName));
174
+ fs.rmSync(archivePath, { force: true });
175
+ const zip = spawnSync('zip', ['-q', '-r', archivePath, jarName], { cwd: tempDir, encoding: 'utf8', shell: false });
176
+ if (zip.error || zip.status !== 0) {
177
+ fs.rmSync(tempDir, { recursive: true, force: true });
178
+ fs.rmSync(archivePath, { force: true });
179
+ fail(`could not create Java archive with zip: ${zip.stderr?.trim() || zip.error?.message || 'unknown error'}`);
180
+ }
181
+ return { tempDir, archivePath };
182
+ }
183
+ const archiveRoot = path.join(tempDir, 'function');
184
+ const excludedTopLevel = new Set(['node_modules', '.git', '.tools', '.terraform', 'cdktf.out', '.ocdk', 'tail-function-logs.js', 'package-lock.json']);
107
185
  if (!isNodeRuntime) excludedTopLevel.add('package.json');
108
186
  fs.cpSync(projectDir, archiveRoot, {
109
187
  recursive: true,
package/bin/ocdk.js CHANGED
@@ -88,7 +88,7 @@ Commands (same as CDK):
88
88
  destroy Destroy the stack
89
89
  list List stacks
90
90
  get Generate provider bindings (run from project root; use ocdk get, not cdktf get)
91
- write-log-config (Optional) Write tail-function-logs.js to project root with log IDs from terraform output
91
+ write-log-config (Optional) Write .ocdk/tail-function-logs.js with log IDs from terraform output
92
92
  tail:execution-log Tail function execution logs (gets log IDs from terraform output or env)
93
93
 
94
94
  Examples:
@@ -100,7 +100,7 @@ Examples:
100
100
  process.exit(args[0] === '--help' || args[0] === '-h' ? 0 : 1);
101
101
  }
102
102
 
103
- // write-log-config – write tail-function-logs.js from terraform output (run from project root after deploy)
103
+ // write-log-config – write .ocdk/tail-function-logs.js from terraform output (run from project root after deploy)
104
104
  if (command === 'write-log-config') {
105
105
  const projectDir = process.cwd();
106
106
  const script = path.join(root, 'bin', 'write-log-config.js');
@@ -117,10 +117,10 @@ if (command === 'write-log-config') {
117
117
  process.exit(result.status ?? 1);
118
118
  }
119
119
 
120
- // tail:execution-log – run project's tail-function-logs.js if present (in-code defaults from write-log-config), else package fallback
120
+ // tail:execution-log – run project's generated log-tail script if present, else package fallback
121
121
  if (command === 'tail:execution-log') {
122
122
  const projectDir = process.cwd();
123
- const projectScript = path.join(projectDir, 'tail-function-logs.js');
123
+ const projectScript = path.join(projectDir, '.ocdk', 'tail-function-logs.js');
124
124
  if (fs.existsSync(projectScript)) {
125
125
  // Refresh on every run. Older generated scripts can have empty defaults
126
126
  // instead of placeholders, so inspecting their content is not reliable.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * Verify built package and prepublish: README present, stack and config valid.
4
- * tail-function-logs.js is written by: npx ocdk write-log-config (after deploy).
4
+ * .ocdk/tail-function-logs.js is written by: npx ocdk write-log-config (after deploy).
5
5
  */
6
6
  const fs = require('fs');
7
7
  const path = require('path');
@@ -44,10 +44,10 @@ if (!fs.existsSync(stackPath)) {
44
44
  failed = true;
45
45
  }
46
46
 
47
- // 3. Config must create tail script in Node (ensureTailFunctionLogsScript)
47
+ // 3. Config must create the generated tail script in .ocdk (ensureTailFunctionLogsScript)
48
48
  if (fs.existsSync(configPath)) {
49
49
  const config = fs.readFileSync(configPath, 'utf8');
50
- if (!config.includes('ensureTailFunctionLogsScript') || !config.includes('tail-function-logs.js')) {
50
+ if (!config.includes('ensureTailFunctionLogsScript') || !config.includes("'.ocdk'") || !config.includes('tail-function-logs.js')) {
51
51
  console.error('[verify-publish] lib/config/oci-config.js missing ensureTailFunctionLogsScript. Copy config → lib/config and ensure latest config is used.');
52
52
  failed = true;
53
53
  }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Write tail-function-logs.js to the project root with log IDs from terraform output.
3
+ * Write .ocdk/tail-function-logs.js with log IDs from terraform output.
4
4
  * Run from project root after deploy. Usage: npx ocdk write-log-config
5
5
  */
6
6
  const { spawnSync } = require('child_process');
@@ -54,12 +54,14 @@ if (!logGroupId || !executionLogId) {
54
54
  }
55
55
 
56
56
  const srcScript = path.join(packageRoot, 'scripts', 'tail-function-log.js');
57
- const destScript = path.join(projectRoot, 'tail-function-logs.js');
57
+ const outputDir = path.join(projectRoot, '.ocdk');
58
+ const destScript = path.join(outputDir, 'tail-function-logs.js');
58
59
  if (fs.existsSync(srcScript)) {
60
+ fs.mkdirSync(outputDir, { recursive: true });
59
61
  let content = fs.readFileSync(srcScript, 'utf8');
60
62
  content = content.replace(/__EXECUTION_LOG_ID__/g, executionLogId).replace(/__LOG_GROUP_ID__/g, logGroupId);
61
63
  fs.writeFileSync(destScript, content, 'utf8');
62
- console.log('Wrote tail-function-logs.js');
64
+ console.log('Wrote .ocdk/tail-function-logs.js');
63
65
  } else {
64
66
  console.warn('Source script not found:', srcScript);
65
67
  }
@@ -279,11 +279,13 @@ function ensureDefaultApiGwDeploymentJson(projectDir) {
279
279
  }
280
280
  return p;
281
281
  }
282
- /** Ensure tail-function-logs.js exists in projectDir (copy from package scripts). IDs are placeholders until npx ocdk write-log-config is run. */
282
+ /** Ensure .ocdk/tail-function-logs.js exists (IDs are placeholders until write-log-config runs). */
283
283
  function ensureTailFunctionLogsScript(projectDir) {
284
- const dest = path.join(projectDir, 'tail-function-logs.js');
284
+ const outputDir = path.join(projectDir, '.ocdk');
285
+ const dest = path.join(outputDir, 'tail-function-logs.js');
285
286
  const src = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
286
287
  if (fs.existsSync(src)) {
288
+ fs.mkdirSync(outputDir, { recursive: true });
287
289
  const content = fs.readFileSync(src, 'utf8');
288
290
  fs.writeFileSync(dest, content, 'utf8');
289
291
  }
@@ -619,4 +621,4 @@ async function getOciConfig() {
619
621
  backend: backendConfig,
620
622
  };
621
623
  }
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0VILGtDQUVDO0FBR0Qsd0NBS0M7QUE2YUQsb0NBeUZDO0FBN2xCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBNENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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Q04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIFJ1bnRpbWUgZnJvbSBmdW5jLnlhbWwgKGUuZy4gJ2phdmEnLCAncHl0aG9uJyk7IGNvbnRyb2xzIERvY2tlcmZpbGUgZ2VuZXJhdGlvbi4gKi9cbiAgcnVudGltZT86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgcnVudGltZSBmcm9tIGZ1bmMueWFtbCAoT0NJIEZ1bmN0aW9ucyBmb3JtYXQpLCBlLmcuICdqYXZhJywgJ3B5dGhvbicuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJydW50aW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sUnVudGltZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqcnVudGltZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELlxuICogTG9nIElEczogZnJvbSAub2Nkay1vdXRwdXRzLmpzb24gKGNyZWF0ZWQgb24gZGVwbG95KSwgb3IgcGFzcyBmb3IgdGVzdGluZzpcbiAqICAgT0NJX0xPR19HUk9VUF9JRD1vY2lkMS4uLiBPQ0lfRVhFQ1VUSU9OX0xPR19JRD1vY2lkMS4uLiBub2RlIHRhaWwtZnVuY3Rpb24tbG9ncy5qc1xuICovXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgeyBzcGF3blN5bmMgfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcblxuY29uc3QgZGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUiB8fCBfX2Rpcm5hbWU7XG5jb25zdCBvdXRwdXRzUGF0aCA9IHBhdGguam9pbihkaXIsICcub2Nkay1vdXRwdXRzLmpzb24nKTtcbmNvbnN0IGNvbXBJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfT0NJRDtcbmlmICghY29tcElkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ1NldCBPQ0lfQ09NUEFSVE1FTlRfSUQgKG9yIE9DSV9DT01QQVJUTUVOVF9PQ0lEKS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxubGV0IGxvZ0dyb3VwSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0xPR19HUk9VUF9JRCB8fCAnJykudHJpbSgpO1xubGV0IGV4ZWN1dGlvbkxvZ0lkID0gKHByb2Nlc3MuZW52Lk9DSV9FWEVDVVRJT05fTE9HX0lEIHx8ICcnKS50cmltKCk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24sIG9yIHNldCBPQ0lfTE9HX0dST1VQX0lEIGFuZCBPQ0lfRVhFQ1VUSU9OX0xPR19JRCBmb3IgdGVzdGluZy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgbGV0IG91dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGY4JykucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0ID0gcmF3LmluZGV4T2YoJ3snKTtcbiAgICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGZpcnN0ID09PSAtMSB8fCBsYXN0IDw9IGZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ05vIEpTT04nKTtcbiAgICBvdXQgPSBKU09OLnBhcnNlKHJhdy5zbGljZShmaXJzdCwgbGFzdCArIDEpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyAub2Nkay1vdXRwdXRzLmpzb24uIFJ1biBkZXBsb3kgZmlyc3QuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRPdXRwdXRzKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob2JqLmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25fbG9nX2lkICE9IG51bGwgfHwgb2JqLmxvZ0dyb3VwSWQgIT0gbnVsbCB8fCBvYmouZXhlY3V0aW9uTG9nSWQgIT0gbnVsbCkgcmV0dXJuIG9iajtcbiAgICBpZiAob2JqLm91dHB1dHMgJiYgdHlwZW9mIG9iai5vdXRwdXRzID09PSAnb2JqZWN0JykgcmV0dXJuIGZpbmRPdXRwdXRzKG9iai5vdXRwdXRzKSB8fCBvYmoub3V0cHV0cztcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyhvYmopKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRPdXRwdXRzKHYpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHZhbChvLCBrKSB7XG4gICAgbGV0IHYgPSBvW2tdO1xuICAgIGlmICh2ID09IG51bGwpIHYgPSBvW2sucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSldO1xuICAgIGlmICh2ID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHYudHJpbSgpO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPSBudWxsICYmICd2YWx1ZScgaW4gdikgcmV0dXJuIFN0cmluZyh2LnZhbHVlKS50cmltKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmdW5jdGlvbiBmaW5kQnlTdWJzdHJpbmcobywgc3ViKSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobykuZmluZChmdW5jdGlvbihrKSB7IHJldHVybiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3ViKTsgfSk7XG4gICAgcmV0dXJuIGtleSA/IHZhbChvLCBrZXkpIDogdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG91dHB1dHMgPSBmaW5kT3V0cHV0cyhvdXQpIHx8IG91dDtcbiAgbG9nR3JvdXBJZCA9IHZhbChvdXRwdXRzLCAnbG9nX2dyb3VwX2lkJykgfHwgdmFsKG91dHB1dHMsICdsb2dHcm91cElkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdsb2dfZ3JvdXAnKTtcbiAgZXhlY3V0aW9uTG9nSWQgPSB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2dfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbkxvZ0lkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdleGVjdXRpb25fbG9nJyk7XG4gIGlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdsb2dfZ3JvdXBfaWQgb3IgZXhlY3V0aW9uX2xvZ19pZCBtaXNzaW5nIGluIC5vY2RrLW91dHB1dHMuanNvbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RvcC1sZXZlbCBrZXlzOiAnICsgT2JqZWN0LmtleXMob3V0KS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdPdXRwdXRzIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXRwdXRzKS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdTYW1wbGU6ICcgKyBKU09OLnN0cmluZ2lmeShvdXQpLnNsaWNlKDAsIDQwMCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIDEwICogNjAgKiAxMDAwKTtcbmNvbnN0IHRpbWVTdGFydCA9IHN0YXJ0LnRvSVNPU3RyaW5nKCk7XG5jb25zdCB0aW1lRW5kID0gbm93LnRvSVNPU3RyaW5nKCk7XG5jb25zdCBzY29wZSA9IGNvbXBJZCArICcvJyArIGxvZ0dyb3VwSWQgKyAnLycgKyBleGVjdXRpb25Mb2dJZDtcbmNvbnN0IHF1ZXJ5ID0gJ3NlYXJjaCBcIicgKyBzY29wZSArICdcIiB8IHNvcnQgYnkgZGF0ZXRpbWUgZGVzYyB8IGxpbWl0IDUwJztcbmNvbnN0IHIgPSBzcGF3blN5bmMoJ29jaScsIFsnbG9nZ2luZy1zZWFyY2gnLCAnc2VhcmNoLWxvZ3MnLCAnLS1zZWFyY2gtcXVlcnknLCBxdWVyeSwgJy0tdGltZS1zdGFydCcsIHRpbWVTdGFydCwgJy0tdGltZS1lbmQnLCB0aW1lRW5kXSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xucHJvY2Vzcy5leGl0KHIuc3RhdHVzID8/IDEpO1xuYDtcblxuLyoqIEVuc3VyZSB0YWlsLWZ1bmN0aW9uLWxvZ3MuanMgZXhpc3RzIGluIHByb2plY3REaXI7IHJlbW92ZSBsZWdhY3kgSlMgc2NyaXB0IGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdzY3JpcHRzJywgJ3RhaWwtZnVuY3Rpb24tbG9nLmpzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBzY3JpcHRzL3RhaWwtZnVuY3Rpb24tbG9nLmpzIGluIG9jZGsgcGFja2FnZScpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIGNvbnRlbnQsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbm5vdCByZWFkIHRoZSB0ZW1wbGF0ZSBmb3Igc29tZSByZWFzb24sIGxlYXZlIHRoZSBzY3JpcHQgYWJzZW50LlxuICB9XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIHJ1bnRpbWU/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBydW50aW1lID0gZ2V0RnVuY1lhbWxSdW50aW1lKHByb2plY3REaXIpO1xuICBjb25zdCBpc1B5dGhvbiA9IHJ1bnRpbWU/LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncHl0aG9uJykgPz8gZmFsc2U7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFpc1B5dGhvbiAmJiAhamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gaXNQeXRob24gPyBmYWxzZSA6ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgcnVudGltZSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIHJ1bnRpbWU6IGRpc2NvdmVyZWQucnVudGltZSxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0VILGtDQUVDO0FBR0Qsd0NBS0M7QUE2YUQsb0NBeUZDO0FBN2xCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBNENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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Q04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIFJ1bnRpbWUgZnJvbSBmdW5jLnlhbWwgKGUuZy4gJ2phdmEnLCAncHl0aG9uJyk7IGNvbnRyb2xzIERvY2tlcmZpbGUgZ2VuZXJhdGlvbi4gKi9cbiAgcnVudGltZT86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgcnVudGltZSBmcm9tIGZ1bmMueWFtbCAoT0NJIEZ1bmN0aW9ucyBmb3JtYXQpLCBlLmcuICdqYXZhJywgJ3B5dGhvbicuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJydW50aW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sUnVudGltZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqcnVudGltZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELlxuICogTG9nIElEczogZnJvbSAub2Nkay1vdXRwdXRzLmpzb24gKGNyZWF0ZWQgb24gZGVwbG95KSwgb3IgcGFzcyBmb3IgdGVzdGluZzpcbiAqICAgT0NJX0xPR19HUk9VUF9JRD1vY2lkMS4uLiBPQ0lfRVhFQ1VUSU9OX0xPR19JRD1vY2lkMS4uLiBub2RlIHRhaWwtZnVuY3Rpb24tbG9ncy5qc1xuICovXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgeyBzcGF3blN5bmMgfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcblxuY29uc3QgZGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUiB8fCBfX2Rpcm5hbWU7XG5jb25zdCBvdXRwdXRzUGF0aCA9IHBhdGguam9pbihkaXIsICcub2Nkay1vdXRwdXRzLmpzb24nKTtcbmNvbnN0IGNvbXBJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfT0NJRDtcbmlmICghY29tcElkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ1NldCBPQ0lfQ09NUEFSVE1FTlRfSUQgKG9yIE9DSV9DT01QQVJUTUVOVF9PQ0lEKS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxubGV0IGxvZ0dyb3VwSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0xPR19HUk9VUF9JRCB8fCAnJykudHJpbSgpO1xubGV0IGV4ZWN1dGlvbkxvZ0lkID0gKHByb2Nlc3MuZW52Lk9DSV9FWEVDVVRJT05fTE9HX0lEIHx8ICcnKS50cmltKCk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24sIG9yIHNldCBPQ0lfTE9HX0dST1VQX0lEIGFuZCBPQ0lfRVhFQ1VUSU9OX0xPR19JRCBmb3IgdGVzdGluZy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgbGV0IG91dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGY4JykucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0ID0gcmF3LmluZGV4T2YoJ3snKTtcbiAgICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGZpcnN0ID09PSAtMSB8fCBsYXN0IDw9IGZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ05vIEpTT04nKTtcbiAgICBvdXQgPSBKU09OLnBhcnNlKHJhdy5zbGljZShmaXJzdCwgbGFzdCArIDEpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyAub2Nkay1vdXRwdXRzLmpzb24uIFJ1biBkZXBsb3kgZmlyc3QuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRPdXRwdXRzKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob2JqLmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25fbG9nX2lkICE9IG51bGwgfHwgb2JqLmxvZ0dyb3VwSWQgIT0gbnVsbCB8fCBvYmouZXhlY3V0aW9uTG9nSWQgIT0gbnVsbCkgcmV0dXJuIG9iajtcbiAgICBpZiAob2JqLm91dHB1dHMgJiYgdHlwZW9mIG9iai5vdXRwdXRzID09PSAnb2JqZWN0JykgcmV0dXJuIGZpbmRPdXRwdXRzKG9iai5vdXRwdXRzKSB8fCBvYmoub3V0cHV0cztcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyhvYmopKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRPdXRwdXRzKHYpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHZhbChvLCBrKSB7XG4gICAgbGV0IHYgPSBvW2tdO1xuICAgIGlmICh2ID09IG51bGwpIHYgPSBvW2sucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSldO1xuICAgIGlmICh2ID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHYudHJpbSgpO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPSBudWxsICYmICd2YWx1ZScgaW4gdikgcmV0dXJuIFN0cmluZyh2LnZhbHVlKS50cmltKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmdW5jdGlvbiBmaW5kQnlTdWJzdHJpbmcobywgc3ViKSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobykuZmluZChmdW5jdGlvbihrKSB7IHJldHVybiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3ViKTsgfSk7XG4gICAgcmV0dXJuIGtleSA/IHZhbChvLCBrZXkpIDogdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG91dHB1dHMgPSBmaW5kT3V0cHV0cyhvdXQpIHx8IG91dDtcbiAgbG9nR3JvdXBJZCA9IHZhbChvdXRwdXRzLCAnbG9nX2dyb3VwX2lkJykgfHwgdmFsKG91dHB1dHMsICdsb2dHcm91cElkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdsb2dfZ3JvdXAnKTtcbiAgZXhlY3V0aW9uTG9nSWQgPSB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2dfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbkxvZ0lkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdleGVjdXRpb25fbG9nJyk7XG4gIGlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdsb2dfZ3JvdXBfaWQgb3IgZXhlY3V0aW9uX2xvZ19pZCBtaXNzaW5nIGluIC5vY2RrLW91dHB1dHMuanNvbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RvcC1sZXZlbCBrZXlzOiAnICsgT2JqZWN0LmtleXMob3V0KS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdPdXRwdXRzIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXRwdXRzKS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdTYW1wbGU6ICcgKyBKU09OLnN0cmluZ2lmeShvdXQpLnNsaWNlKDAsIDQwMCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIDEwICogNjAgKiAxMDAwKTtcbmNvbnN0IHRpbWVTdGFydCA9IHN0YXJ0LnRvSVNPU3RyaW5nKCk7XG5jb25zdCB0aW1lRW5kID0gbm93LnRvSVNPU3RyaW5nKCk7XG5jb25zdCBzY29wZSA9IGNvbXBJZCArICcvJyArIGxvZ0dyb3VwSWQgKyAnLycgKyBleGVjdXRpb25Mb2dJZDtcbmNvbnN0IHF1ZXJ5ID0gJ3NlYXJjaCBcIicgKyBzY29wZSArICdcIiB8IHNvcnQgYnkgZGF0ZXRpbWUgZGVzYyB8IGxpbWl0IDUwJztcbmNvbnN0IHIgPSBzcGF3blN5bmMoJ29jaScsIFsnbG9nZ2luZy1zZWFyY2gnLCAnc2VhcmNoLWxvZ3MnLCAnLS1zZWFyY2gtcXVlcnknLCBxdWVyeSwgJy0tdGltZS1zdGFydCcsIHRpbWVTdGFydCwgJy0tdGltZS1lbmQnLCB0aW1lRW5kXSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xucHJvY2Vzcy5leGl0KHIuc3RhdHVzID8/IDEpO1xuYDtcblxuLyoqIEVuc3VyZSB0YWlsLWZ1bmN0aW9uLWxvZ3MuanMgZXhpc3RzIGluIHByb2plY3REaXI7IHJlbW92ZSBsZWdhY3kgSlMgc2NyaXB0IGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdzY3JpcHRzJywgJ3RhaWwtZnVuY3Rpb24tbG9nLmpzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBzY3JpcHRzL3RhaWwtZnVuY3Rpb24tbG9nLmpzIGluIG9jZGsgcGFja2FnZScpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIGNvbnRlbnQsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbm5vdCByZWFkIHRoZSB0ZW1wbGF0ZSBmb3Igc29tZSByZWFzb24sIGxlYXZlIHRoZSBzY3JpcHQgYWJzZW50LlxuICB9XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIHJ1bnRpbWU/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBydW50aW1lID0gZ2V0RnVuY1lhbWxSdW50aW1lKHByb2plY3REaXIpO1xuICBjb25zdCBpc1B5dGhvbiA9IHJ1bnRpbWU/LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncHl0aG9uJykgPz8gZmFsc2U7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFpc1B5dGhvbiAmJiAhamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gaXNQeXRob24gPyBmYWxzZSA6ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgcnVudGltZSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIHJ1bnRpbWU6IGRpc2NvdmVyZWQucnVudGltZSxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
@@ -287,11 +287,13 @@ function ensureDefaultApiGwDeploymentJson(projectDir: string): string {
287
287
  return p;
288
288
  }
289
289
 
290
- /** Ensure tail-function-logs.js exists in projectDir (copy from package scripts). IDs are placeholders until npx ocdk write-log-config is run. */
290
+ /** Ensure .ocdk/tail-function-logs.js exists (IDs are placeholders until write-log-config runs). */
291
291
  function ensureTailFunctionLogsScript(projectDir: string): string {
292
- const dest = path.join(projectDir, 'tail-function-logs.js');
292
+ const outputDir = path.join(projectDir, '.ocdk');
293
+ const dest = path.join(outputDir, 'tail-function-logs.js');
293
294
  const src = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
294
295
  if (fs.existsSync(src)) {
296
+ fs.mkdirSync(outputDir, { recursive: true });
295
297
  const content = fs.readFileSync(src, 'utf8');
296
298
  fs.writeFileSync(dest, content, 'utf8');
297
299
  }
@@ -279,11 +279,13 @@ function ensureDefaultApiGwDeploymentJson(projectDir) {
279
279
  }
280
280
  return p;
281
281
  }
282
- /** Ensure tail-function-logs.js exists in projectDir (copy from package scripts). IDs are placeholders until npx ocdk write-log-config is run. */
282
+ /** Ensure .ocdk/tail-function-logs.js exists (IDs are placeholders until write-log-config runs). */
283
283
  function ensureTailFunctionLogsScript(projectDir) {
284
- const dest = path.join(projectDir, 'tail-function-logs.js');
284
+ const outputDir = path.join(projectDir, '.ocdk');
285
+ const dest = path.join(outputDir, 'tail-function-logs.js');
285
286
  const src = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
286
287
  if (fs.existsSync(src)) {
288
+ fs.mkdirSync(outputDir, { recursive: true });
287
289
  const content = fs.readFileSync(src, 'utf8');
288
290
  fs.writeFileSync(dest, content, 'utf8');
289
291
  }
@@ -619,4 +621,4 @@ async function getOciConfig() {
619
621
  backend: backendConfig,
620
622
  };
621
623
  }
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0VILGtDQUVDO0FBR0Qsd0NBS0M7QUE2YUQsb0NBeUZDO0FBN2xCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBNENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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Q04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIFJ1bnRpbWUgZnJvbSBmdW5jLnlhbWwgKGUuZy4gJ2phdmEnLCAncHl0aG9uJyk7IGNvbnRyb2xzIERvY2tlcmZpbGUgZ2VuZXJhdGlvbi4gKi9cbiAgcnVudGltZT86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgcnVudGltZSBmcm9tIGZ1bmMueWFtbCAoT0NJIEZ1bmN0aW9ucyBmb3JtYXQpLCBlLmcuICdqYXZhJywgJ3B5dGhvbicuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJydW50aW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sUnVudGltZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqcnVudGltZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELlxuICogTG9nIElEczogZnJvbSAub2Nkay1vdXRwdXRzLmpzb24gKGNyZWF0ZWQgb24gZGVwbG95KSwgb3IgcGFzcyBmb3IgdGVzdGluZzpcbiAqICAgT0NJX0xPR19HUk9VUF9JRD1vY2lkMS4uLiBPQ0lfRVhFQ1VUSU9OX0xPR19JRD1vY2lkMS4uLiBub2RlIHRhaWwtZnVuY3Rpb24tbG9ncy5qc1xuICovXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgeyBzcGF3blN5bmMgfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcblxuY29uc3QgZGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUiB8fCBfX2Rpcm5hbWU7XG5jb25zdCBvdXRwdXRzUGF0aCA9IHBhdGguam9pbihkaXIsICcub2Nkay1vdXRwdXRzLmpzb24nKTtcbmNvbnN0IGNvbXBJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfT0NJRDtcbmlmICghY29tcElkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ1NldCBPQ0lfQ09NUEFSVE1FTlRfSUQgKG9yIE9DSV9DT01QQVJUTUVOVF9PQ0lEKS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxubGV0IGxvZ0dyb3VwSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0xPR19HUk9VUF9JRCB8fCAnJykudHJpbSgpO1xubGV0IGV4ZWN1dGlvbkxvZ0lkID0gKHByb2Nlc3MuZW52Lk9DSV9FWEVDVVRJT05fTE9HX0lEIHx8ICcnKS50cmltKCk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24sIG9yIHNldCBPQ0lfTE9HX0dST1VQX0lEIGFuZCBPQ0lfRVhFQ1VUSU9OX0xPR19JRCBmb3IgdGVzdGluZy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgbGV0IG91dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGY4JykucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0ID0gcmF3LmluZGV4T2YoJ3snKTtcbiAgICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGZpcnN0ID09PSAtMSB8fCBsYXN0IDw9IGZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ05vIEpTT04nKTtcbiAgICBvdXQgPSBKU09OLnBhcnNlKHJhdy5zbGljZShmaXJzdCwgbGFzdCArIDEpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyAub2Nkay1vdXRwdXRzLmpzb24uIFJ1biBkZXBsb3kgZmlyc3QuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRPdXRwdXRzKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob2JqLmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25fbG9nX2lkICE9IG51bGwgfHwgb2JqLmxvZ0dyb3VwSWQgIT0gbnVsbCB8fCBvYmouZXhlY3V0aW9uTG9nSWQgIT0gbnVsbCkgcmV0dXJuIG9iajtcbiAgICBpZiAob2JqLm91dHB1dHMgJiYgdHlwZW9mIG9iai5vdXRwdXRzID09PSAnb2JqZWN0JykgcmV0dXJuIGZpbmRPdXRwdXRzKG9iai5vdXRwdXRzKSB8fCBvYmoub3V0cHV0cztcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyhvYmopKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRPdXRwdXRzKHYpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHZhbChvLCBrKSB7XG4gICAgbGV0IHYgPSBvW2tdO1xuICAgIGlmICh2ID09IG51bGwpIHYgPSBvW2sucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSldO1xuICAgIGlmICh2ID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHYudHJpbSgpO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPSBudWxsICYmICd2YWx1ZScgaW4gdikgcmV0dXJuIFN0cmluZyh2LnZhbHVlKS50cmltKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmdW5jdGlvbiBmaW5kQnlTdWJzdHJpbmcobywgc3ViKSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobykuZmluZChmdW5jdGlvbihrKSB7IHJldHVybiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3ViKTsgfSk7XG4gICAgcmV0dXJuIGtleSA/IHZhbChvLCBrZXkpIDogdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG91dHB1dHMgPSBmaW5kT3V0cHV0cyhvdXQpIHx8IG91dDtcbiAgbG9nR3JvdXBJZCA9IHZhbChvdXRwdXRzLCAnbG9nX2dyb3VwX2lkJykgfHwgdmFsKG91dHB1dHMsICdsb2dHcm91cElkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdsb2dfZ3JvdXAnKTtcbiAgZXhlY3V0aW9uTG9nSWQgPSB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2dfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbkxvZ0lkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdleGVjdXRpb25fbG9nJyk7XG4gIGlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdsb2dfZ3JvdXBfaWQgb3IgZXhlY3V0aW9uX2xvZ19pZCBtaXNzaW5nIGluIC5vY2RrLW91dHB1dHMuanNvbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RvcC1sZXZlbCBrZXlzOiAnICsgT2JqZWN0LmtleXMob3V0KS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdPdXRwdXRzIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXRwdXRzKS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdTYW1wbGU6ICcgKyBKU09OLnN0cmluZ2lmeShvdXQpLnNsaWNlKDAsIDQwMCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIDEwICogNjAgKiAxMDAwKTtcbmNvbnN0IHRpbWVTdGFydCA9IHN0YXJ0LnRvSVNPU3RyaW5nKCk7XG5jb25zdCB0aW1lRW5kID0gbm93LnRvSVNPU3RyaW5nKCk7XG5jb25zdCBzY29wZSA9IGNvbXBJZCArICcvJyArIGxvZ0dyb3VwSWQgKyAnLycgKyBleGVjdXRpb25Mb2dJZDtcbmNvbnN0IHF1ZXJ5ID0gJ3NlYXJjaCBcIicgKyBzY29wZSArICdcIiB8IHNvcnQgYnkgZGF0ZXRpbWUgZGVzYyB8IGxpbWl0IDUwJztcbmNvbnN0IHIgPSBzcGF3blN5bmMoJ29jaScsIFsnbG9nZ2luZy1zZWFyY2gnLCAnc2VhcmNoLWxvZ3MnLCAnLS1zZWFyY2gtcXVlcnknLCBxdWVyeSwgJy0tdGltZS1zdGFydCcsIHRpbWVTdGFydCwgJy0tdGltZS1lbmQnLCB0aW1lRW5kXSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xucHJvY2Vzcy5leGl0KHIuc3RhdHVzID8/IDEpO1xuYDtcblxuLyoqIEVuc3VyZSB0YWlsLWZ1bmN0aW9uLWxvZ3MuanMgZXhpc3RzIGluIHByb2plY3REaXI7IHJlbW92ZSBsZWdhY3kgSlMgc2NyaXB0IGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdzY3JpcHRzJywgJ3RhaWwtZnVuY3Rpb24tbG9nLmpzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBzY3JpcHRzL3RhaWwtZnVuY3Rpb24tbG9nLmpzIGluIG9jZGsgcGFja2FnZScpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIGNvbnRlbnQsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbm5vdCByZWFkIHRoZSB0ZW1wbGF0ZSBmb3Igc29tZSByZWFzb24sIGxlYXZlIHRoZSBzY3JpcHQgYWJzZW50LlxuICB9XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIHJ1bnRpbWU/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBydW50aW1lID0gZ2V0RnVuY1lhbWxSdW50aW1lKHByb2plY3REaXIpO1xuICBjb25zdCBpc1B5dGhvbiA9IHJ1bnRpbWU/LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncHl0aG9uJykgPz8gZmFsc2U7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFpc1B5dGhvbiAmJiAhamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gaXNQeXRob24gPyBmYWxzZSA6ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgcnVudGltZSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIHJ1bnRpbWU6IGRpc2NvdmVyZWQucnVudGltZSxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
624
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbmZpZy9vY2ktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0VILGtDQUVDO0FBR0Qsd0NBS0M7QUE2YUQsb0NBeUZDO0FBN2xCRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixtREFBcUM7QUFDckMsaUVBQW1EO0FBNENuRCxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQ2xEO0lBQ0UsTUFBTSxFQUFFO1FBQ047WUFDRSxJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUNuQyxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsVUFBVSxFQUFFLGdCQUFnQjtnQkFDNUIsb0JBQW9CLEVBQUUsRUFBRTthQUN6QjtTQUNGO0tBQ0Y7Q0FDRixFQUNELElBQUksRUFDSixDQUFDLENBQ0YsQ0FBQztBQUVGLHFJQUFxSTtBQUN4SCxRQUFBLG1CQUFtQixHQUEyQjtJQUN6RCxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLO0lBQzNGLFlBQVksRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLO0lBQ3JGLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLO0lBQ3ZGLFlBQVksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixF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Q04sU0FBUztRQUNULGVBQWUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixJQUFJLFVBQVUsQ0FBQyxlQUFlLElBQUksRUFBRTtRQUN0RixZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxVQUFVLENBQUMsWUFBWSxJQUFJLEVBQUU7UUFDNUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxFQUFFLElBQUksU0FBUztRQUN2RSxpQkFBaUIsRUFBRSxpQkFBaUIsSUFBSSxTQUFTO1FBQ2pELE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztRQUMzQixRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sSUFBSSxTQUFTO1FBQzdCLGlCQUFpQjtRQUNqQixrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixJQUFJLFNBQVM7UUFDckUsZ0JBQWdCLEVBQUUsZ0JBQWdCLElBQUksU0FBUztRQUMvQyxzQkFBc0IsRUFBRSxzQkFBc0IsSUFBSSxTQUFTO1FBQzNELGNBQWM7UUFDZCx1QkFBdUIsRUFBRSx1QkFBdUIsSUFBSSxTQUFTO1FBQzdELE9BQU8sRUFBRSxhQUFhO0tBQ3ZCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPQ0kgQ29uZmlndXJhdGlvblxuICpcbiAqIFNldCB0aGVzZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIHVwZGF0ZSBkZWZhdWx0czpcbiAqIC0gT0NJX0NPTVBBUlRNRU5UX0lEXG4gKiAtIE9DSV9URU5BTkNZX0lEXG4gKiAtIE9DSV9SRUdJT05cbiAqIC0gT0NJX05BTUVTUEFDRSAoaWYgdW5zZXQsIG9idGFpbmVkIHZpYSBPQ0kgU0RLIGdldE5hbWVzcGFjZSlcbiAqIC0gT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgKGZvciBPQ0lSOyBtdXN0IGJlIG5vbi1yb290IGZvciBmdWxsIHN0YWNrKVxuICogLSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgKEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lOyBkZWZhdWx0IGVtcHR5KVxuICogLSBPQ0lfRlVOQ1RJT05fTkFNRSAoRnVuY3Rpb24gbmFtZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX0hBTkRMRVIgKEphdmEgRkRLIENNRCBoYW5kbGVyLCBlLmcuIGNvbS5leGFtcGxlLkhhbmRsZXI6OmhhbmRsZVJlcXVlc3Q7IGZyb20gZnVuYy55YW1sIGNtZC9oYW5kbGVyIGlmIHVuc2V0KVxuICogLSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEggKFBhdGggdG8gSkFSIG9yIHByb2plY3QgZGlyIGZvciBmdW5jdGlvbiBpbWFnZTsgZGVmYXVsdCBlbXB0eSlcbiAqIC0gT0NJX0ZVTkNUSU9OX01FTU9SWV9NQiAoZnVuY3Rpb24gbWVtb3J5IGluIE1COyBmcm9tIGZ1bmMueWFtbCBtZW1vcnkgaWYgdW5zZXQpXG4gKiAtIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMgKGZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kczsgZnJvbSBmdW5jLnlhbWwgdGltZW91dCBpZiB1bnNldClcbiAqIC0gT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nIGZvciBmdW5jdGlvbiBjb25maWcvZW52OyBtZXJnZWQgd2l0aCBmdW5jLnlhbWwgY29uZmlnKVxuICogLSBPQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04gKHBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT047IGRlZmF1bHQgcHJvamVjdCByb290IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbilcbiAqIC0gT0NES19QUk9KRUNUX0RJUiAoc2V0IGJ5IG9jZGsgQ0xJIHRvIGNhbGxlciBjd2Q7IHVzZWQgdG8gZGlzY292ZXIgZnVuYy55YW1sIGFuZCB0YXJnZXQvKVxuICogLSBPQ0lfU1RBVEVfQlVDS0VUIChmb3IgcmVtb3RlIHN0YXRlKVxuICogLSBPQ0lfU1RBVEVfQkFDS0VORF9UWVBFIChvY2l8aHR0cHxsb2NhbClcbiAqXG4gKiBXaGVuIE9DREtfUFJPSkVDVF9ESVIgaXMgc2V0IChlLmcuIHJ1bm5pbmcgYG5weCBvY2RrIGRlcGxveWAgZnJvbSBhIEphdmEgcHJvamVjdCksIGNvbmZpZ1xuICogZGlzY292ZXJzIGVpdGhlciB0YXJnZXQvKi5qYXIgb3IgcG9tLnhtbCtzcmMvIChhbmQgb3B0aW9uYWxseSBmdW5jLnlhbWwgbmFtZSwgdmVyc2lvbiwgY21kL2hhbmRsZXIpLlxuICogTm8gRG9ja2VyZmlsZSBpcyByZXF1aXJlZOKAlHRoZSBzdGFjayBnZW5lcmF0ZXMgb25lIGluIGxvY2FsLWV4ZWMgKGV4Y2x1ZGluZyBub2RlX21vZHVsZXMgdmlhIC5kb2NrZXJpZ25vcmUpLFxuICogdGhlbiBidWlsZHMsIHRhZ3MgKGZyb20gZnVuYy55YW1sIHZlcnNpb24pLCBhbmQgcHVzaGVzIHRvIE9DSVIuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIGNvbW1vbiBmcm9tICdvY2ktY29tbW9uJztcbmltcG9ydCAqIGFzIG9iamVjdHN0b3JhZ2UgZnJvbSAnb2NpLW9iamVjdHN0b3JhZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUJhY2tlbmRDb25maWcge1xuICB0eXBlOiAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG4gIGJ1Y2tldD86IHN0cmluZztcbiAga2V5Pzogc3RyaW5nO1xuICBhZGRyZXNzPzogc3RyaW5nO1xuICB1cGRhdGVNZXRob2Q/OiBzdHJpbmc7XG4gIGxvY2tBZGRyZXNzPzogc3RyaW5nO1xuICB1bmxvY2tBZGRyZXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9jaUNvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIFBhdGggdG8gSkFSIG9yIERvY2tlcmZpbGUgY29udGV4dCBmb3IgZnVuY3Rpb24gaW1hZ2U7IGVtcHR5ID0gbm8gYnVpbGQvZGVwbG95LiAqL1xuICBmdW5jdGlvbkphclBhdGg/OiBzdHJpbmc7XG4gIC8qKiBQYXRoIHRvIGRpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKGRpc2NvdmVyZWQ7IERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIFJ1bnRpbWUgZnJvbSBmdW5jLnlhbWwgKGUuZy4gJ2phdmEnLCAncHl0aG9uJyk7IGNvbnRyb2xzIERvY2tlcmZpbGUgZ2VuZXJhdGlvbi4gKi9cbiAgcnVudGltZT86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgY21kL2hhbmRsZXIgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVI7IGRlZmF1bHQgYmVsb3cpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBkZXBsb3kgdXNlcyBhIHRoaW4gRG9ja2VyZmlsZSAoQ09QWSB0YXJnZXQvKi5qYXIgb25seSk7IGZ1bGwgTWF2ZW4gYnVpbGQgb25seSBpbiByZWRlcGxveTpmdW5jdGlvbi4gKi9cbiAgdXNlVGhpbkRvY2tlcmZpbGU/OiBib29sZWFuO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiBtZW1vcnkgaW4gTUIgKDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzIpLiBGcm9tIGZ1bmMueWFtbCBtZW1vcnkgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoMeKAkzMwMCkuIEZyb20gZnVuYy55YW1sIHRpbWVvdXQgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRyAoSlNPTiBvYmplY3Qgc3RyaW5nKS4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gVXNlIE9DSV9BUElHQVRFV0FZX0RFUExPWU1FTlRfSlNPTiBvciBkZWZhdWx0IG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBpbiBwcm9qZWN0IHJvb3QuICovXG4gIGFwaUd3RGVwbG95bWVudEpzb25QYXRoPzogc3RyaW5nO1xuICBiYWNrZW5kPzogT2NpQmFja2VuZENvbmZpZztcbn1cblxuY29uc3QgREVGQVVMVF9BUElHV19ERVBMT1lNRU5UX0pTT04gPSBKU09OLnN0cmluZ2lmeShcbiAge1xuICAgIHJvdXRlczogW1xuICAgICAge1xuICAgICAgICBwYXRoOiAnL3twYXRoKn0nLFxuICAgICAgICBtZXRob2RzOiBbJ0dFVCcsICdQT1NUJywgJ09QVElPTlMnXSxcbiAgICAgICAgYmFja2VuZDoge1xuICAgICAgICAgIHR5cGU6ICdPUkFDTEVfRlVOQ1RJT05TX0JBQ0tFTkQnLFxuICAgICAgICAgIGZ1bmN0aW9uSWQ6ICcke2Z1bmN0aW9uX2lkfScsXG4gICAgICAgICAgcmVhZFRpbWVvdXRJblNlY29uZHM6IDMwLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBudWxsLFxuICAyXG4pO1xuXG4vKiogT0NJUiBzaG9ydCByZWdpb24ga2V5cyAoZS5nLiBldS1mcmFua2Z1cnQtMSAtPiBmcmEpLiBVc2VkIHNvIGxvZ2luLCBidWlsZCwgcHVzaCBhbmQgZnVuY3Rpb24gaW1hZ2UgYWxsIHVzZSBzYW1lIHJlZ2lzdHJ5IGhvc3QuICovXG5leHBvcnQgY29uc3QgUkVHSU9OX1RPX09DSVJfSE9TVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2V1LWZyYW5rZnVydC0xJzogJ2ZyYScsICd1cy1waG9lbml4LTEnOiAncGh4JywgJ3VzLWFzaGJ1cm4tMSc6ICdpYWQnLCAndWstbG9uZG9uLTEnOiAnbGhyJyxcbiAgJ2FwLXRva3lvLTEnOiAnbnJ0JywgJ2FwLW11bWJhaS0xJzogJ2JvbScsICdhcC1zZW91bC0xJzogJ2ljbicsICdjYS10b3JvbnRvLTEnOiAneXl6JyxcbiAgJ3NhLXNhb3BhdWxvLTEnOiAnZ3J1JywgJ2FwLXN5ZG5leS0xJzogJ3N5ZCcsICdldS16dXJpY2gtMSc6ICd6cmgnLCAnbWUtZHViYWktMSc6ICdkeGInLFxuICAnYXAtb3Nha2EtMSc6ICdraXgnLCAnZXUtYW1zdGVyZGFtLTEnOiAnYW1zJywgJ2FwLXNpbmdhcG9yZS0xJzogJ3NpbicsICdhcC1oeWRlcmFiYWQtMSc6ICdoeWQnLFxuICAnZXUtbWlsYW4tMSc6ICdteHAnLCAnc2Etc2FudGlhZ28tMSc6ICdzY2wnLCAnYXAtbWVsYm91cm5lLTEnOiAnbWVsJywgJ2V1LXN0b2NraG9sbS0xJzogJ2FybicsXG4gICdtZS1qZWRkYWgtMSc6ICdqZWQnLCAnYWYtam9oYW5uZXNidXJnLTEnOiAnam5iJywgJ2lsLWplcnVzYWxlbS0xJzogJ3RsdicsICdteC1xdWVyZXRhcm8tMSc6ICdxcm8nLFxuICAnZXUtbWFyc2VpbGxlLTEnOiAnbXJzJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBvY2lySG9zdEtleShyZWdpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBSRUdJT05fVE9fT0NJUl9IT1NUW3JlZ2lvbl0gPz8gcmVnaW9uO1xufVxuXG4vKiogRnVsbCBPQ0lSIGltYWdlIFVSTCBmb3IgdGhlIGZ1bmN0aW9uIChyZWdpc3RyeS9uYW1lc3BhY2UvcmVwbzp0YWcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9jaUltYWdlVXJsKGNvbmZpZzogT2NpQ29uZmlnKTogc3RyaW5nIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gIGNvbnN0IHJlcG8gPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gIGNvbnN0IHRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgcmV0dXJuIGAke3JlZ2lzdHJ5fS8ke2NvbmZpZy5uYW1lc3BhY2V9LyR7cmVwb306JHt0YWd9YDtcbn1cblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBmdW5jdGlvbiBuYW1lIGZyb20gZnVuYy55YW1sIChPQ0kgRnVuY3Rpb25zIGZvcm1hdCkuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJuYW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sTmFtZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbmFtZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgcnVudGltZSBmcm9tIGZ1bmMueWFtbCAoT0NJIEZ1bmN0aW9ucyBmb3JtYXQpLCBlLmcuICdqYXZhJywgJ3B5dGhvbicuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJydW50aW1lOlwiIGxpbmUsIHRyaW1tZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sUnVudGltZShwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqcnVudGltZTpcXHMqW1wiJ10/KFteXCInXFxzXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKG0pIHJldHVybiBtWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY21kL2hhbmRsZXIgZnJvbSBmdW5jLnlhbWwgKE9DSS9GbiBmb3JtYXQpLlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgXCJjbWQ6XCIgb3IgXCJoYW5kbGVyOlwiIGxpbmUsIHRyaW1tZWQ7IHVzZWQgYXMgRG9ja2VyIENNRCBmb3IgSmF2YSBGREsuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sSGFuZGxlcihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgY21kTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eXFxzKmNtZDpcXHMqW1wiJ10/KFteXCInXFxuXSspW1wiJ10/L20pO1xuICAgICAgaWYgKGNtZE1hdGNoKSByZXR1cm4gY21kTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgaGFuZGxlck1hdGNoID0gY29udGVudC5tYXRjaCgvXlxccypoYW5kbGVyOlxccypbXCInXT8oW15cIidcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAoaGFuZGxlck1hdGNoKSByZXR1cm4gaGFuZGxlck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdmVyc2lvbiBmcm9tIGZ1bmMueWFtbCAodXNlZCBhcyBPQ0lSIGltYWdlIHRhZykuXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgXCJ2ZXJzaW9uOlwiIGxpbmUsIHRyaW1tZWQ7IHNhbml0aXplZCBmb3IgRG9ja2VyIHRhZyAoYS16QS1aMC05Xy4tKS5cbiAqL1xuZnVuY3Rpb24gZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgJ2Z1bmMueWFtbCcpO1xuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHAsICd1dGY4Jyk7XG4gICAgICBjb25zdCBtID0gY29udGVudC5tYXRjaCgvXlxccyp2ZXJzaW9uOlxccypbXCInXT8oW15cIidcXHNcXG5dKylbXCInXT8vbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCByYXcgPSBtWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkID0gcmF3LnJlcGxhY2UoL1teYS16QS1aMC05Xy4tXS9nLCAnLScpLnJlcGxhY2UoLy0rL2csICctJykucmVwbGFjZSgvXi18LSQvZywgJycpO1xuICAgICAgICByZXR1cm4gc2FuaXRpemVkIHx8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IFZBTElEX01FTU9SWV9NQiA9IG5ldyBTZXQoWzEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDMwNzJdKTtcblxuLyoqXG4gKiBUcnkgdG8gcmVhZCBtZW1vcnkgKE1CKSBmcm9tIGZ1bmMueWFtbC4gT0NJIGFsbG93cyAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAzMDcyLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIHZhbGlkOyBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqbWVtb3J5OlxccyooXFxkKylcXHMqJC9tKTtcbiAgICAgIGlmIChtKSB7XG4gICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChtWzFdLCAxMCk7XG4gICAgICAgIGlmIChWQUxJRF9NRU1PUllfTUIuaGFzKG4pKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGltZW91dCAoc2Vjb25kcykgZnJvbSBmdW5jLnlhbWwuIE9DSSBtYXggaXMgMzAwLlxuICogUmV0dXJucyB0aGUgbnVtYmVyIGlmIHByZXNlbnQgYW5kIGluIHJhbmdlIDHigJMzMDA7IG90aGVyd2lzZSB1bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNZYW1sVGltZW91dChwcm9qZWN0RGlyOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdmdW5jLnlhbWwnKTtcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpO1xuICAgICAgY29uc3QgbSA9IGNvbnRlbnQubWF0Y2goL15cXHMqdGltZW91dDpcXHMqKFxcZCspXFxzKiQvbSk7XG4gICAgICBpZiAobSkge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQobVsxXSwgMTApO1xuICAgICAgICBpZiAobiA+PSAxICYmIG4gPD0gMzAwKSByZXR1cm4gbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgY29uZmlnIChrZXktdmFsdWUgZW52KSBmcm9tIGZ1bmMueWFtbC4gRXhwZWN0cyBhIHRvcC1sZXZlbCBcImNvbmZpZzpcIiBibG9jayB3aXRoIGtleTogdmFsdWUgbGluZXMuXG4gKiBSZXR1cm5zIGEgcmVjb3JkIG9mIHN0cmluZyBrZXlzIGFuZCBzdHJpbmcgdmFsdWVzOyBlbXB0eSBpZiBub25lIG9yIHBhcnNlIGVycm9yLlxuICovXG5mdW5jdGlvbiBnZXRGdW5jWWFtbENvbmZpZyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnZnVuYy55YW1sJyk7XG4gIHRyeSB7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMocCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcbiAgICBsZXQgaW5Db25maWcgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maWc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkID09PSAnY29uZmlnOicgfHwgL15jb25maWdcXHMqOlxccyokLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICAgIGluQ29uZmlnID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5Db25maWcpIHtcbiAgICAgICAgaWYgKHRyaW1tZWQgIT09ICcnICYmICFsaW5lLnN0YXJ0c1dpdGgoJyAnKSAmJiAhbGluZS5zdGFydHNXaXRoKCdcXHQnKSkgYnJlYWs7XG4gICAgICAgIGNvbnN0IGt2ID0gbGluZS5tYXRjaCgvXlxccysoW2EtekEtWl9dW2EtekEtWjAtOV8tXSopXFxzKjpcXHMqKC4qKSQvKTtcbiAgICAgICAgaWYgKGt2KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0ga3ZbMV0udHJpbSgpO1xuICAgICAgICAgIGxldCB2YWwgPSBrdlsyXS50cmltKCk7XG4gICAgICAgICAgaWYgKCh2YWwuc3RhcnRzV2l0aCgnXCInKSAmJiB2YWwuZW5kc1dpdGgoJ1wiJykpIHx8ICh2YWwuc3RhcnRzV2l0aChcIidcIikgJiYgdmFsLmVuZHNXaXRoKFwiJ1wiKSkpIHtcbiAgICAgICAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbmZpZ1trZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLmxlbmd0aCA/IGNvbmZpZyA6IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogRW5zdXJlIG9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvbiBleGlzdHMgaW4gcHJvamVjdERpcjsgd3JpdGUgZGVmYXVsdCBpZiBtaXNzaW5nLiBSZXR1cm5zIHBhdGguICovXG5mdW5jdGlvbiBlbnN1cmVEZWZhdWx0QXBpR3dEZXBsb3ltZW50SnNvbihwcm9qZWN0RGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24nKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHApKSB7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwLCBERUZBVUxUX0FQSUdXX0RFUExPWU1FTlRfSlNPTiwgJ3V0ZjgnKTtcbiAgfVxuICByZXR1cm4gcDtcbn1cblxuY29uc3QgVEFJTF9GVU5DVElPTl9MT0dTX1NDUklQVCA9IGAjIS91c3IvYmluL2VudiBub2RlXG4vKipcbiAqIFRhaWwgT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9ncy4gR2VuZXJhdGVkIGJ5IE9DREsuXG4gKiBSdW4gZnJvbSBwcm9qZWN0IHJvb3QgYWZ0ZXIgZGVwbG95LiBSZXF1aXJlczogT0NJIENMSSwgT0NJX0NPTVBBUlRNRU5UX0lELlxuICogTG9nIElEczogZnJvbSAub2Nkay1vdXRwdXRzLmpzb24gKGNyZWF0ZWQgb24gZGVwbG95KSwgb3IgcGFzcyBmb3IgdGVzdGluZzpcbiAqICAgT0NJX0xPR19HUk9VUF9JRD1vY2lkMS4uLiBPQ0lfRVhFQ1VUSU9OX0xPR19JRD1vY2lkMS4uLiBub2RlIHRhaWwtZnVuY3Rpb24tbG9ncy5qc1xuICovXG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgeyBzcGF3blN5bmMgfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcblxuY29uc3QgZGlyID0gcHJvY2Vzcy5lbnYuT0NES19QUk9KRUNUX0RJUiB8fCBfX2Rpcm5hbWU7XG5jb25zdCBvdXRwdXRzUGF0aCA9IHBhdGguam9pbihkaXIsICcub2Nkay1vdXRwdXRzLmpzb24nKTtcbmNvbnN0IGNvbXBJZCA9IHByb2Nlc3MuZW52Lk9DSV9DT01QQVJUTUVOVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfT0NJRDtcbmlmICghY29tcElkKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ1NldCBPQ0lfQ09NUEFSVE1FTlRfSUQgKG9yIE9DSV9DT01QQVJUTUVOVF9PQ0lEKS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxubGV0IGxvZ0dyb3VwSWQgPSAocHJvY2Vzcy5lbnYuT0NJX0xPR19HUk9VUF9JRCB8fCAnJykudHJpbSgpO1xubGV0IGV4ZWN1dGlvbkxvZ0lkID0gKHByb2Nlc3MuZW52Lk9DSV9FWEVDVVRJT05fTE9HX0lEIHx8ICcnKS50cmltKCk7XG5pZiAoIWxvZ0dyb3VwSWQgfHwgIWV4ZWN1dGlvbkxvZ0lkKSB7XG4gIGlmICghZnMuZXhpc3RzU3luYyhvdXRwdXRzUGF0aCkpIHtcbiAgICBjb25zb2xlLmVycm9yKCdSdW4gZGVwbG95IGZpcnN0IHRvIGNyZWF0ZSAub2Nkay1vdXRwdXRzLmpzb24sIG9yIHNldCBPQ0lfTE9HX0dST1VQX0lEIGFuZCBPQ0lfRVhFQ1VUSU9OX0xPR19JRCBmb3IgdGVzdGluZy4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgbGV0IG91dDtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMob3V0cHV0c1BhdGgsICd1dGY4JykucmVwbGFjZSgvXlxcdUZFRkYvLCAnJykudHJpbSgpO1xuICAgIGNvbnN0IGZpcnN0ID0gcmF3LmluZGV4T2YoJ3snKTtcbiAgICBjb25zdCBsYXN0ID0gcmF3Lmxhc3RJbmRleE9mKCd9Jyk7XG4gICAgaWYgKGZpcnN0ID09PSAtMSB8fCBsYXN0IDw9IGZpcnN0KSB0aHJvdyBuZXcgRXJyb3IoJ05vIEpTT04nKTtcbiAgICBvdXQgPSBKU09OLnBhcnNlKHJhdy5zbGljZShmaXJzdCwgbGFzdCArIDEpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgb3IgbWlzc2luZyAub2Nkay1vdXRwdXRzLmpzb24uIFJ1biBkZXBsb3kgZmlyc3QuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRPdXRwdXRzKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSByZXR1cm4gbnVsbDtcbiAgICBpZiAob2JqLmxvZ19ncm91cF9pZCAhPSBudWxsIHx8IG9iai5leGVjdXRpb25fbG9nX2lkICE9IG51bGwgfHwgb2JqLmxvZ0dyb3VwSWQgIT0gbnVsbCB8fCBvYmouZXhlY3V0aW9uTG9nSWQgIT0gbnVsbCkgcmV0dXJuIG9iajtcbiAgICBpZiAob2JqLm91dHB1dHMgJiYgdHlwZW9mIG9iai5vdXRwdXRzID09PSAnb2JqZWN0JykgcmV0dXJuIGZpbmRPdXRwdXRzKG9iai5vdXRwdXRzKSB8fCBvYmoub3V0cHV0cztcbiAgICBmb3IgKGNvbnN0IHYgb2YgT2JqZWN0LnZhbHVlcyhvYmopKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRPdXRwdXRzKHYpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIHZhbChvLCBrKSB7XG4gICAgbGV0IHYgPSBvW2tdO1xuICAgIGlmICh2ID09IG51bGwpIHYgPSBvW2sucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGMpID0+IGMudG9VcHBlckNhc2UoKSldO1xuICAgIGlmICh2ID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykgcmV0dXJuIHYudHJpbSgpO1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcgJiYgdiAhPSBudWxsICYmICd2YWx1ZScgaW4gdikgcmV0dXJuIFN0cmluZyh2LnZhbHVlKS50cmltKCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmdW5jdGlvbiBmaW5kQnlTdWJzdHJpbmcobywgc3ViKSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobykuZmluZChmdW5jdGlvbihrKSB7IHJldHVybiBrLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3ViKTsgfSk7XG4gICAgcmV0dXJuIGtleSA/IHZhbChvLCBrZXkpIDogdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG91dHB1dHMgPSBmaW5kT3V0cHV0cyhvdXQpIHx8IG91dDtcbiAgbG9nR3JvdXBJZCA9IHZhbChvdXRwdXRzLCAnbG9nX2dyb3VwX2lkJykgfHwgdmFsKG91dHB1dHMsICdsb2dHcm91cElkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdsb2dfZ3JvdXAnKTtcbiAgZXhlY3V0aW9uTG9nSWQgPSB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbl9sb2dfaWQnKSB8fCB2YWwob3V0cHV0cywgJ2V4ZWN1dGlvbkxvZ0lkJykgfHwgZmluZEJ5U3Vic3RyaW5nKG91dHB1dHMsICdleGVjdXRpb25fbG9nJyk7XG4gIGlmICghbG9nR3JvdXBJZCB8fCAhZXhlY3V0aW9uTG9nSWQpIHtcbiAgICBjb25zb2xlLmVycm9yKCdsb2dfZ3JvdXBfaWQgb3IgZXhlY3V0aW9uX2xvZ19pZCBtaXNzaW5nIGluIC5vY2RrLW91dHB1dHMuanNvbicpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1RvcC1sZXZlbCBrZXlzOiAnICsgT2JqZWN0LmtleXMob3V0KS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdPdXRwdXRzIGtleXM6ICcgKyBPYmplY3Qua2V5cyhvdXRwdXRzKS5qb2luKCcsICcpKTtcbiAgICBjb25zb2xlLmVycm9yKCdTYW1wbGU6ICcgKyBKU09OLnN0cmluZ2lmeShvdXQpLnNsaWNlKDAsIDQwMCkpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IHN0YXJ0ID0gbmV3IERhdGUobm93LmdldFRpbWUoKSAtIDEwICogNjAgKiAxMDAwKTtcbmNvbnN0IHRpbWVTdGFydCA9IHN0YXJ0LnRvSVNPU3RyaW5nKCk7XG5jb25zdCB0aW1lRW5kID0gbm93LnRvSVNPU3RyaW5nKCk7XG5jb25zdCBzY29wZSA9IGNvbXBJZCArICcvJyArIGxvZ0dyb3VwSWQgKyAnLycgKyBleGVjdXRpb25Mb2dJZDtcbmNvbnN0IHF1ZXJ5ID0gJ3NlYXJjaCBcIicgKyBzY29wZSArICdcIiB8IHNvcnQgYnkgZGF0ZXRpbWUgZGVzYyB8IGxpbWl0IDUwJztcbmNvbnN0IHIgPSBzcGF3blN5bmMoJ29jaScsIFsnbG9nZ2luZy1zZWFyY2gnLCAnc2VhcmNoLWxvZ3MnLCAnLS1zZWFyY2gtcXVlcnknLCBxdWVyeSwgJy0tdGltZS1zdGFydCcsIHRpbWVTdGFydCwgJy0tdGltZS1lbmQnLCB0aW1lRW5kXSwgeyBzdGRpbzogJ2luaGVyaXQnIH0pO1xucHJvY2Vzcy5leGl0KHIuc3RhdHVzID8/IDEpO1xuYDtcblxuLyoqIEVuc3VyZSB0YWlsLWZ1bmN0aW9uLWxvZ3MuanMgZXhpc3RzIGluIHByb2plY3REaXI7IHJlbW92ZSBsZWdhY3kgSlMgc2NyaXB0IGFuZCB3cml0ZSBmcmVzaCBmaWxlIGJhc2VkIG9uIHNjcmlwdHMvdGFpbC1mdW5jdGlvbi1sb2cuanMuIFJldHVybnMgcGF0aC4gKi9cbmZ1bmN0aW9uIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQocHJvamVjdERpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAndGFpbC1mdW5jdGlvbi1sb2dzLmpzJyk7XG4gIHRyeSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmMocCk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBpZ25vcmUgY2xlYW51cCBlcnJvcnNcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdzY3JpcHRzJywgJ3RhaWwtZnVuY3Rpb24tbG9nLmpzJyk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHRlbXBsYXRlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBzY3JpcHRzL3RhaWwtZnVuY3Rpb24tbG9nLmpzIGluIG9jZGsgcGFja2FnZScpO1xuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0ZjgnKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHAsIGNvbnRlbnQsICd1dGY4Jyk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbm5vdCByZWFkIHRoZSB0ZW1wbGF0ZSBmb3Igc29tZSByZWFzb24sIGxlYXZlIHRoZSBzY3JpcHQgYWJzZW50LlxuICB9XG4gIHJldHVybiBwO1xufVxuXG4vKiogUmVhZCB0ZW5hbmN5IGFuZCByZWdpb24gZnJvbSBPQ0kgQ0xJIGNvbmZpZy4gRGVmYXVsdCBmaWxlOiB+Ly5vY2kvY29uZmlnLCBkZWZhdWx0IHByb2ZpbGU6IERFRkFVTFQuICovXG5mdW5jdGlvbiByZWFkVGVuYW5jeUFuZFJlZ2lvbkZyb21DbGlDb25maWcoKTogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhjb25maWdQYXRoKSkgcmV0dXJuIHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLyk7XG4gICAgbGV0IGluUHJvZmlsZSA9IGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdDogeyB0ZW5hbmN5Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQuc3RhcnRzV2l0aCgnWycpICYmIHRyaW1tZWQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBpblByb2ZpbGUgPSB0cmltbWVkLnNsaWNlKDEsIC0xKSA9PT0gcHJvZmlsZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIWluUHJvZmlsZSkgY29udGludWU7XG4gICAgICBjb25zdCBlcSA9IHRyaW1tZWQuaW5kZXhPZignPScpO1xuICAgICAgaWYgKGVxIDw9IDApIGNvbnRpbnVlO1xuICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZC5zbGljZSgwLCBlcSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRyaW1tZWQuc2xpY2UoZXEgKyAxKS50cmltKCk7XG4gICAgICBpZiAoa2V5ID09PSAndGVuYW5jeScpIHJlc3VsdC50ZW5hbmN5ID0gdmFsdWU7XG4gICAgICBpZiAoa2V5ID09PSAncmVnaW9uJykgcmVzdWx0LnJlZ2lvbiA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuLyoqIEdldCBvYmplY3Qgc3RvcmFnZSBuYW1lc3BhY2UgdmlhIE9DSSBTREsgKHNhbWUgYXMgXCJvY2kgb3MgbnMgZ2V0XCIpLiBVc2VzIH4vLm9jaS9jb25maWcsIERFRkFVTFQgcHJvZmlsZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZDogc3RyaW5nLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBwcm9jZXNzLmVudi5PQ0lfQ09ORklHX0ZJTEUgfHwgcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5vY2knLCAnY29uZmlnJyk7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5PQ0lfQ0xJX1BST0ZJTEUgfHwgJ0RFRkFVTFQnO1xuICB0cnkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGNvbW1vbi5Db25maWdGaWxlQXV0aGVudGljYXRpb25EZXRhaWxzUHJvdmlkZXIoY29uZmlnUGF0aCwgcHJvZmlsZSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG9iamVjdHN0b3JhZ2UuT2JqZWN0U3RvcmFnZUNsaWVudCh7IGF1dGhlbnRpY2F0aW9uRGV0YWlsc1Byb3ZpZGVyOiBwcm92aWRlciB9KTtcbiAgICBjbGllbnQucmVnaW9uSWQgPSByZWdpb247XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0TmFtZXNwYWNlKHtcbiAgICAgIGNvbXBhcnRtZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlPy50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGaW5kIGEgSkFSIHVuZGVyIHRhcmdldC8gKHByZWZlciBvbmUgbWF0Y2hpbmcgbmFtZSwgZWxzZSBmaXJzdCAuamFyKS5cbiAqL1xuZnVuY3Rpb24gZmluZEphckluVGFyZ2V0KHByb2plY3REaXI6IHN0cmluZywgZnVuY3Rpb25OYW1lPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHByb2plY3REaXIsICd0YXJnZXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpcikpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyh0YXJnZXREaXIpO1xuICAgIGNvbnN0IGphcnMgPSBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5qYXInKSAmJiAhZi5lbmRzV2l0aCgnLXNvdXJjZXMuamFyJykpO1xuICAgIGlmIChqYXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGphcnMuZmluZCgoaikgPT4gai50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZ1bmN0aW9uTmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICBpZiAobWF0Y2gpIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBtYXRjaCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4odGFyZ2V0RGlyLCBqYXJzWzBdKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogVHJ1ZSBpZiBwcm9qZWN0IGhhcyBwb20ueG1sIGFuZCBzcmMvIChNYXZlbiBzb3VyY2UgbGF5b3V0IGZvciBidWlsZC1mcm9tLXNvdXJjZSBEb2NrZXJmaWxlKS4gKi9cbmZ1bmN0aW9uIGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcG9tID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwb20ueG1sJyk7XG4gIGNvbnN0IHNyYyA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnc3JjJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocG9tKSAmJiBmcy5leGlzdHNTeW5jKHNyYykgJiYgZnMuc3RhdFN5bmMoc3JjKS5pc0RpcmVjdG9yeSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzY292ZXJGcm9tRnVuY1lhbWxBbmRUYXJnZXQoKToge1xuICBmdW5jdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGZ1bmN0aW9uQXBwTmFtZT86IHN0cmluZztcbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIHJ1bnRpbWU/OiBzdHJpbmc7XG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICB1c2VUaGluRG9ja2VyZmlsZT86IGJvb2xlYW47XG4gIG1lbW9yeU1iPzogbnVtYmVyO1xuICB0aW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn0ge1xuICBsZXQgcHJvamVjdERpciA9IHByb2Nlc3MuZW52Lk9DREtfUFJPSkVDVF9ESVI/LnRyaW0oKTtcbiAgaWYgKCFwcm9qZWN0RGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5vY2RrLXByb2plY3QtZGlyJyk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgcHJvamVjdERpciA9IGZzLnJlYWRGaWxlU3luYyhwLCAndXRmOCcpLnRyaW0oKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfVxuICBpZiAoIXByb2plY3REaXIgJiYgcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0pBUl9QQVRIPy50cmltKCkpIHtcbiAgICBjb25zdCBwID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSC50cmltKCkpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHApKSBwcm9qZWN0RGlyID0gZnMuc3RhdFN5bmMocCkuaXNEaXJlY3RvcnkoKSA/IHAgOiBwYXRoLmRpcm5hbWUocCk7XG4gIH1cbiAgaWYgKCFwcm9qZWN0RGlyKSBwcm9qZWN0RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgcHJvamVjdERpciA9IHByb2plY3REaXIgPyBwYXRoLnJlc29sdmUocHJvamVjdERpcikgOiAnJztcbiAgaWYgKCFwcm9qZWN0RGlyIHx8ICFmcy5leGlzdHNTeW5jKHByb2plY3REaXIpKSByZXR1cm4ge307XG5cbiAgY29uc3QgbmFtZUZyb21ZYW1sID0gZ2V0RnVuY1lhbWxOYW1lKHByb2plY3REaXIpO1xuICBjb25zdCBydW50aW1lID0gZ2V0RnVuY1lhbWxSdW50aW1lKHByb2plY3REaXIpO1xuICBjb25zdCBpc1B5dGhvbiA9IHJ1bnRpbWU/LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgncHl0aG9uJykgPz8gZmFsc2U7XG4gIGNvbnN0IGphclBhdGggPSBmaW5kSmFySW5UYXJnZXQocHJvamVjdERpciwgbmFtZUZyb21ZYW1sIHx8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGhhc1NvdXJjZSA9IGhhc1BvbUFuZFNyYyhwcm9qZWN0RGlyKTtcbiAgaWYgKCFpc1B5dGhvbiAmJiAhamFyUGF0aCAmJiAhaGFzU291cmNlKSByZXR1cm4ge307XG5cbiAgY29uc3QgZnVuY3Rpb25OYW1lID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX05BTUU/LnRyaW0oKSB8fCBuYW1lRnJvbVlhbWwgfHwgcGF0aC5iYXNlbmFtZShwcm9qZWN0RGlyKSB8fCAnb2NpLWZ1bmN0aW9uJztcbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZ2V0RnVuY1lhbWxWZXJzaW9uKHByb2plY3REaXIpO1xuICBjb25zdCBoYW5kbGVyID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0hBTkRMRVI/LnRyaW0oKSB8fCBnZXRGdW5jWWFtbEhhbmRsZXIocHJvamVjdERpcik7XG4gIGNvbnN0IHVzZVRoaW5Eb2NrZXJmaWxlID0gaXNQeXRob24gPyBmYWxzZSA6ICEhamFyUGF0aDtcbiAgY29uc3QgbWVtb3J5TWIgPSBnZXRGdW5jWWFtbE1lbW9yeShwcm9qZWN0RGlyKTtcbiAgY29uc3QgdGltZW91dFNlY29uZHMgPSBnZXRGdW5jWWFtbFRpbWVvdXQocHJvamVjdERpcik7XG4gIGNvbnN0IGNvbmZpZyA9IGdldEZ1bmNZYW1sQ29uZmlnKHByb2plY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAgZnVuY3Rpb25OYW1lLFxuICAgIGZ1bmN0aW9uQXBwTmFtZTogcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0FQUF9OQU1FPy50cmltKCkgfHwgZnVuY3Rpb25OYW1lLFxuICAgIGRvY2tlckNvbnRleHRQYXRoOiBwYXRoLnJlc29sdmUocHJvamVjdERpciksXG4gICAgcnVudGltZSxcbiAgICBpbWFnZVRhZzogaW1hZ2VUYWcgfHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGhhbmRsZXIgfHwgdW5kZWZpbmVkLFxuICAgIHVzZVRoaW5Eb2NrZXJmaWxlLFxuICAgIG1lbW9yeU1iLFxuICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgIGNvbmZpZyxcbiAgfTtcbn1cblxuY29uc3QgYmFja2VuZFR5cGUgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0JBQ0tFTkRfVFlQRSB8fCAnbG9jYWwnKSBhcyAnb2NpJyB8ICdodHRwJyB8ICdsb2NhbCc7XG5cbmNvbnN0IGJhY2tlbmRDb25maWc6IE9jaUJhY2tlbmRDb25maWcgfCB1bmRlZmluZWQgPSBiYWNrZW5kVHlwZSA9PT0gJ2xvY2FsJ1xuICA/IHVuZGVmaW5lZFxuICA6IGJhY2tlbmRUeXBlID09PSAnb2NpJ1xuICAgID8ge1xuICAgICAgICB0eXBlOiAnb2NpJyxcbiAgICAgICAgYnVja2V0OiBwcm9jZXNzLmVudi5PQ0lfU1RBVEVfQlVDS0VUIHx8ICd0Zi1zdGF0ZScsXG4gICAgICAgIGtleTogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0tFWSB8fCAnZnVuY3Rpb24tc3RhY2svdGVycmFmb3JtLnRmc3RhdGUnLFxuICAgICAgfVxuICAgIDoge1xuICAgICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICAgIGFkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0FERFJFU1MgfHwgJycsXG4gICAgICAgIHVwZGF0ZU1ldGhvZDogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVVBEQVRFX01FVEhPRCB8fCAnUFVUJyxcbiAgICAgICAgbG9ja0FkZHJlc3M6IHByb2Nlc3MuZW52Lk9DSV9TVEFURV9IVFRQX0xPQ0tfQUREUkVTUyxcbiAgICAgICAgdW5sb2NrQWRkcmVzczogcHJvY2Vzcy5lbnYuT0NJX1NUQVRFX0hUVFBfVU5MT0NLX0FERFJFU1MsXG4gICAgICB9O1xuXG4vKipcbiAqIExvYWQgT0NJIGNvbmZpZyBmcm9tIGVudiBhbmQgQ0xJIGNvbmZpZy4gV2hlbiBPQ0lfTkFNRVNQQUNFIGlzIHVuc2V0LCBmZXRjaGVzIGl0IHZpYSBPQ0kgU0RLIChnZXROYW1lc3BhY2UpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T2NpQ29uZmlnKCk6IFByb21pc2U8T2NpQ29uZmlnPiB7XG4gIGNvbnN0IGNsaUNvbmZpZyA9IHJlYWRUZW5hbmN5QW5kUmVnaW9uRnJvbUNsaUNvbmZpZygpO1xuICBjb25zdCBjb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX0NPTVBBUlRNRU5UX0lEPy50cmltKCkgfHwgJ29jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLic7XG4gIGNvbnN0IG9jaXJDb21wYXJ0bWVudElkID0gcHJvY2Vzcy5lbnYuT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5PQ0lfQ09NUEFSVE1FTlRfSUQ/LnRyaW0oKSB8fCBjb21wYXJ0bWVudElkO1xuICBjb25zdCB0ZW5hbmN5SWQgPSBwcm9jZXNzLmVudi5PQ0lfVEVOQU5DWV9JRD8udHJpbSgpIHx8IGNsaUNvbmZpZy50ZW5hbmN5Py50cmltKCkgfHwgJ29jaWQxLnRlbmFuY3kub2MxLi5hYWFhYWFhLi4uJztcbiAgY29uc3QgcmVnaW9uID0gcHJvY2Vzcy5lbnYuT0NJX1JFR0lPTj8udHJpbSgpIHx8IGNsaUNvbmZpZy5yZWdpb24/LnRyaW0oKSB8fCAnZXUtZnJhbmtmdXJ0LTEnO1xuXG4gIGlmICghb2NpckNvbXBhcnRtZW50SWQgfHwgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgIGNvbnNvbGUud2Fybign4pqg77iPICBXQVJOSU5HOiBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCBub3Qgc2V0IG9yIHNldCB0byByb290IGNvbXBhcnRtZW50LicpO1xuICAgIGNvbnNvbGUud2FybignICAgUGxlYXNlIHNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nKTtcbiAgICBjb25zb2xlLndhcm4oJyAgIEV4YW1wbGU6IGV4cG9ydCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRD1cIm9jaWQxLmNvbXBhcnRtZW50Lm9jMS4uYWFhYWFhYS4uLlwiJyk7XG4gIH1cblxuICBsZXQgbmFtZXNwYWNlID0gcHJvY2Vzcy5lbnYuT0NJX05BTUVTUEFDRT8udHJpbSgpO1xuICBpZiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UgPT09ICd5b3VyLW5hbWVzcGFjZScpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldE5hbWVzcGFjZUZyb21PY2lTZGsoY29tcGFydG1lbnRJZCwgcmVnaW9uKTtcbiAgICBpZiAocmVzb2x2ZWQpIG5hbWVzcGFjZSA9IHJlc29sdmVkO1xuICAgIGVsc2UgaWYgKCFuYW1lc3BhY2UpIG5hbWVzcGFjZSA9ICd5b3VyLW5hbWVzcGFjZSc7XG4gICAgaWYgKG5hbWVzcGFjZSA9PT0gJ3lvdXItbmFtZXNwYWNlJykge1xuICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gIE9DSV9OQU1FU1BBQ0Ugbm90IHNldCBhbmQgU0RLIGNvdWxkIG5vdCByZXNvbHZlIGl0LiBTZXQgT0NJX05BTUVTUEFDRSBvciBydW4gXCJvY2kgc2V0dXAgY29uZmlnXCIuJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGlzY292ZXJlZCA9IGRpc2NvdmVyRnJvbUZ1bmNZYW1sQW5kVGFyZ2V0KCk7XG5cbiAgY29uc3QgaW1hZ2VUYWcgPSBwcm9jZXNzLmVudi5PQ0lfSU1BR0VfVEFHPy50cmltKCkgfHwgZGlzY292ZXJlZC5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcblxuICBsZXQgZG9ja2VyQ29udGV4dFBhdGggPSBkaXNjb3ZlcmVkLmRvY2tlckNvbnRleHRQYXRoO1xuICBpZiAoIWRvY2tlckNvbnRleHRQYXRoICYmIHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpKSB7XG4gICAgY29uc3QgcCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSkFSX1BBVEgudHJpbSgpKTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwKSkgZG9ja2VyQ29udGV4dFBhdGggPSBmcy5zdGF0U3luYyhwKS5pc0RpcmVjdG9yeSgpID8gcCA6IHBhdGguZGlybmFtZShwKTtcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fSEFORExFUj8udHJpbSgpIHx8IGRpc2NvdmVyZWQuaGFuZGxlcjtcbiAgY29uc3QgdXNlVGhpbkRvY2tlcmZpbGUgPSBkaXNjb3ZlcmVkLnVzZVRoaW5Eb2NrZXJmaWxlID8/IGZhbHNlO1xuXG4gIGNvbnN0IG1lbW9yeUVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9NRU1PUllfTUI/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25NZW1vcnlNYiA9IG1lbW9yeUVudlxuICAgID8gU3RyaW5nKHBhcnNlSW50KG1lbW9yeUVudiwgMTApKVxuICAgIDogKGRpc2NvdmVyZWQubWVtb3J5TWIgIT0gbnVsbCA/IFN0cmluZyhkaXNjb3ZlcmVkLm1lbW9yeU1iKSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdGltZW91dEVudiA9IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFM/LnRyaW0oKTtcbiAgY29uc3QgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA9IHRpbWVvdXRFbnZcbiAgICA/IHBhcnNlSW50KHRpbWVvdXRFbnYsIDEwKVxuICAgIDogZGlzY292ZXJlZC50aW1lb3V0U2Vjb25kcztcblxuICBsZXQgZnVuY3Rpb25Db25maWcgPSBkaXNjb3ZlcmVkLmNvbmZpZztcbiAgY29uc3QgY29uZmlnRW52ID0gcHJvY2Vzcy5lbnYuT0NJX0ZVTkNUSU9OX0NPTkZJRz8udHJpbSgpO1xuICBpZiAoY29uZmlnRW52KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29uZmlnRW52KSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgZnVuY3Rpb25Db25maWcgPSB7IC4uLmZ1bmN0aW9uQ29uZmlnLCAuLi5wYXJzZWQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZSBpbnZhbGlkIEpTT05cbiAgICB9XG4gIH1cbiAgaWYgKGZ1bmN0aW9uQ29uZmlnICYmIE9iamVjdC5rZXlzKGZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPT09IDApIGZ1bmN0aW9uQ29uZmlnID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGFwaUd3RGVwbG95bWVudEpzb25FbnYgPSBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9ERVBMT1lNRU5UX0pTT04/LnRyaW0oKTtcbiAgY29uc3QgYXBpR3dEZXBsb3ltZW50SnNvblBhdGggPSBhcGlHd0RlcGxveW1lbnRKc29uRW52XG4gICAgPyBwYXRoLnJlc29sdmUoYXBpR3dEZXBsb3ltZW50SnNvbkVudilcbiAgICA6IGRvY2tlckNvbnRleHRQYXRoXG4gICAgICA/IGVuc3VyZURlZmF1bHRBcGlHd0RlcGxveW1lbnRKc29uKGRvY2tlckNvbnRleHRQYXRoKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChkb2NrZXJDb250ZXh0UGF0aCkge1xuICAgIGVuc3VyZVRhaWxGdW5jdGlvbkxvZ3NTY3JpcHQoZG9ja2VyQ29udGV4dFBhdGgpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudElkLFxuICAgIG9jaXJDb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgdGVuYW5jeUlkLFxuICAgIHJlZ2lvbixcbiAgICBuYW1lc3BhY2UsXG4gICAgZnVuY3Rpb25BcHBOYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fQVBQX05BTUUgPz8gZGlzY292ZXJlZC5mdW5jdGlvbkFwcE5hbWUgPz8gJycsXG4gICAgZnVuY3Rpb25OYW1lOiBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fTkFNRSA/PyBkaXNjb3ZlcmVkLmZ1bmN0aW9uTmFtZSA/PyAnJyxcbiAgICBmdW5jdGlvbkphclBhdGg6IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9KQVJfUEFUSD8udHJpbSgpIHx8IHVuZGVmaW5lZCxcbiAgICBkb2NrZXJDb250ZXh0UGF0aDogZG9ja2VyQ29udGV4dFBhdGggfHwgdW5kZWZpbmVkLFxuICAgIHJ1bnRpbWU6IGRpc2NvdmVyZWQucnVudGltZSxcbiAgICBpbWFnZVRhZyxcbiAgICBoYW5kbGVyOiBoYW5kbGVyIHx8IHVuZGVmaW5lZCxcbiAgICB1c2VUaGluRG9ja2VyZmlsZSxcbiAgICBvY2lyUmVwb3NpdG9yeU5hbWU6IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1JFUE9TSVRPUllfTkFNRSB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25NZW1vcnlNYjogZnVuY3Rpb25NZW1vcnlNYiB8fCB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kczogZnVuY3Rpb25UaW1lb3V0U2Vjb25kcyA/PyB1bmRlZmluZWQsXG4gICAgZnVuY3Rpb25Db25maWcsXG4gICAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg6IGFwaUd3RGVwbG95bWVudEpzb25QYXRoIHx8IHVuZGVmaW5lZCxcbiAgICBiYWNrZW5kOiBiYWNrZW5kQ29uZmlnLFxuICB9O1xufVxuIl19
@@ -287,11 +287,13 @@ function ensureDefaultApiGwDeploymentJson(projectDir: string): string {
287
287
  return p;
288
288
  }
289
289
 
290
- /** Ensure tail-function-logs.js exists in projectDir (copy from package scripts). IDs are placeholders until npx ocdk write-log-config is run. */
290
+ /** Ensure .ocdk/tail-function-logs.js exists (IDs are placeholders until write-log-config runs). */
291
291
  function ensureTailFunctionLogsScript(projectDir: string): string {
292
- const dest = path.join(projectDir, 'tail-function-logs.js');
292
+ const outputDir = path.join(projectDir, '.ocdk');
293
+ const dest = path.join(outputDir, 'tail-function-logs.js');
293
294
  const src = path.join(__dirname, '..', 'scripts', 'tail-function-log.js');
294
295
  if (fs.existsSync(src)) {
296
+ fs.mkdirSync(outputDir, { recursive: true });
295
297
  const content = fs.readFileSync(src, 'utf8');
296
298
  fs.writeFileSync(dest, content, 'utf8');
297
299
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikarinneoracle/oci-cdk-code-only-preview",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "description": "OCI CDK stack for OCI Functions, API Gateway, and related infrastructure",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -1,5 +1,5 @@
1
1
  #!/bin/sh
2
- # Generate tail-function-logs.js in project root (IDs from terraform output). Run from Terraform local-exec.
2
+ # Generate .ocdk/tail-function-logs.js (IDs from terraform output). Run from Terraform local-exec.
3
3
  # Terraform runs with cwd = package root (e.g. .../project/node_modules/.../oci-cdk), not inside cdktf.out/stacks.
4
4
  # So we must find project root by walking up to a dir named node_modules; its parent is the project root.
5
5
  PROJ_DIR="${OCI_PROJECT_DIR:-${PROJ_DIR}}"
@@ -33,10 +33,11 @@ else
33
33
  EXEC_LOG_ID="$(terraform output -raw execution_log_id 2>/dev/null || echo '')"
34
34
  fi
35
35
  if [ -z "$LOG_GROUP_ID" ] || [ -z "$EXEC_LOG_ID" ]; then exit 0; fi
36
- # Create tail-function-logs.js if missing (copy from package)
37
- if [ ! -f "$PROJ_DIR/tail-function-logs.js" ] && [ -f "$PROJ_DIR/node_modules/@mikarinneoracle/oci-cdk/scripts/tail-function-log.js" ]; then
38
- cp "$PROJ_DIR/node_modules/@mikarinneoracle/oci-cdk/scripts/tail-function-log.js" "$PROJ_DIR/tail-function-logs.js"
36
+ # Create the generated helper if missing (copy from package)
37
+ mkdir -p "$PROJ_DIR/.ocdk"
38
+ if [ ! -f "$PROJ_DIR/.ocdk/tail-function-logs.js" ] && [ -f "$PROJ_DIR/node_modules/@mikarinneoracle/oci-cdk/scripts/tail-function-log.js" ]; then
39
+ cp "$PROJ_DIR/node_modules/@mikarinneoracle/oci-cdk/scripts/tail-function-log.js" "$PROJ_DIR/.ocdk/tail-function-logs.js"
39
40
  fi
40
- if [ -f "$PROJ_DIR/tail-function-logs.js" ]; then
41
- sed "s|__EXECUTION_LOG_ID__|$EXEC_LOG_ID|g;s|__LOG_GROUP_ID__|$LOG_GROUP_ID|g" "$PROJ_DIR/tail-function-logs.js" > "$PROJ_DIR/tail-function-logs.js.tmp" && mv "$PROJ_DIR/tail-function-logs.js.tmp" "$PROJ_DIR/tail-function-logs.js"
41
+ if [ -f "$PROJ_DIR/.ocdk/tail-function-logs.js" ]; then
42
+ sed "s|__EXECUTION_LOG_ID__|$EXEC_LOG_ID|g;s|__LOG_GROUP_ID__|$LOG_GROUP_ID|g" "$PROJ_DIR/.ocdk/tail-function-logs.js" > "$PROJ_DIR/.ocdk/tail-function-logs.js.tmp" && mv "$PROJ_DIR/.ocdk/tail-function-logs.js.tmp" "$PROJ_DIR/.ocdk/tail-function-logs.js"
42
43
  fi