testcafe 2.3.1 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +1 -1
  3. package/README.md +40 -46
  4. package/lib/api/test-controller/execution-context.js +4 -2
  5. package/lib/browser/connection/gateway.js +43 -1
  6. package/lib/browser/connection/index.js +24 -10
  7. package/lib/browser/connection/service-routes.js +3 -1
  8. package/lib/browser/provider/built-in/dedicated/chrome/index.js +19 -5
  9. package/lib/browser/provider/index.js +4 -1
  10. package/lib/client/automation/deps/hammerhead.js +24 -0
  11. package/lib/client/automation/deps/testcafe-core.js +24 -0
  12. package/lib/client/automation/index.js +251 -54
  13. package/lib/client/automation/index.min.js +1 -1
  14. package/lib/client/automation/playback/press/get-key-info.js +44 -0
  15. package/lib/client/automation/playback/press/utils.js +142 -0
  16. package/lib/client/automation/utils/get-key-code.js +15 -0
  17. package/lib/client/automation/utils/get-key-identifier.js +14 -0
  18. package/lib/client/automation/utils/is-letter.js +7 -0
  19. package/lib/client/automation/utils/key-identifier-maps.js +93 -0
  20. package/lib/client/browser/idle-page/index.js +7 -2
  21. package/lib/client/core/index.js +46 -3
  22. package/lib/client/core/index.min.js +1 -1
  23. package/lib/client/driver/index.js +45 -17
  24. package/lib/client/driver/index.min.js +1 -1
  25. package/lib/client/test-run/index.js.mustache +34 -30
  26. package/lib/client/ui/index.js +3230 -48
  27. package/lib/client/ui/index.min.js +1 -1
  28. package/lib/client/ui/sprite.svg +15 -0
  29. package/lib/client/ui/styles.css +183 -41
  30. package/lib/live/test-runner.js +4 -2
  31. package/lib/proxyless/api-base.js +3 -2
  32. package/lib/proxyless/client/event-descriptor.js +67 -0
  33. package/lib/proxyless/client/input.js +36 -0
  34. package/lib/proxyless/client/key-press/utils.js +31 -0
  35. package/lib/proxyless/client/types.js +1 -1
  36. package/lib/proxyless/client/utils.js +32 -2
  37. package/lib/proxyless/cookie-provider.js +31 -3
  38. package/lib/proxyless/errors.js +20 -0
  39. package/lib/proxyless/index.js +2 -10
  40. package/lib/proxyless/request-pipeline/index.js +32 -3
  41. package/lib/proxyless/resource-injector.js +5 -4
  42. package/lib/proxyless/types.js +3 -2
  43. package/lib/proxyless/utils/cdp.js +4 -3
  44. package/lib/reporter/index.js +2 -1
  45. package/lib/runner/bootstrapper.js +8 -1
  46. package/lib/runner/index.js +57 -44
  47. package/lib/shared/utils/is-file-protocol.js +2 -2
  48. package/lib/test-run/commands/actions.js +2 -2
  49. package/lib/test-run/cookies/base.js +4 -1
  50. package/lib/test-run/cookies/provider.js +9 -2
  51. package/lib/test-run/execute-js-expression/index.js +4 -2
  52. package/lib/test-run/index.js +17 -12
  53. package/lib/test-run/request/create-request-options.js +23 -12
  54. package/lib/test-run/request/send.js +2 -3
  55. package/lib/utils/check-is-vm.js +58 -0
  56. package/package.json +9 -6
  57. package/lib/proxyless/client/event-simulator.js +0 -40
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## v2.4.0 (2023-03-06)
4
+ TestCafe v2.4.0 introduces the Visual Selector Debugger. You can now create and debug Selector queries in the browser window.
5
+
6
+ ### Visual Selector Debugger
7
+
8
+ TestCafe v2.4.0 displays the Visual Selector Debugger panel when you activate [Debug Mode](https://testcafe.io/documentation/402835/guides/basic-guides/debug-tests). Use the panel to debug Selector queries from your test, or generate new Selector queries.
9
+
10
+ ![](https://testcafe.io/images/inspector/enter-query.gif)
11
+
12
+ If a Selector query causes your test to fail, add the [t.debug()](https://testcafe.io/documentation/402707/reference/test-api/testcontroller/debug) command after the last successful action, and launch the test.
13
+
14
+ When the test reaches the breakpoint, the window that runs the test displays the Selector Debugger panel. Copy the failing Selector query from test code to the Selector Debugger input field.
15
+
16
+ * TestCafe highlights page elements that match the Selector query.
17
+ * If no elements match the Selector query, the panel displays the **No Matching Elements** warning.
18
+ * If your Selector query contians a syntax error, the panel displays the **Invalid Selector** warning.
19
+
20
+ To interactively generate a Selector query, click the **Pick** button, and select the target element on the page.
21
+
22
+ For more information on the panel, its capabilities, and limitations, read the [Visual Selector Debugger Guide](https://testcafe.io/documentation/404288/guides/intermediate-guides/visual-selector-debugger).
23
+
24
+ ### Bug Fixes
25
+
26
+ * TestCafe cannot execute the [t.request](https://testcafe.io/documentation/403981/reference/test-api/testcontroller/request) action in [proxyless mode](https://testcafe.io/documentation/404237/guides/experimental-capabilities/proxyless-mode) ([#7523](https://github.com/DevExpress/testcafe/issues/7523)).
27
+
3
28
  ## v2.3.1 (2023-02-09)
4
29
  TestCafe v2.3.1 introduces a number of bug fixes.
5
30
 
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (C) 2012-2022 Developer Express Inc.
3
+ Copyright (C) 2012-2023 Developer Express Inc.
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  <p align="center">
2
- <a href="https://testcafe.io/surveys/open-source-feedback-2022">
3
- <img src="https://raw.github.com/DevExpress/testcafe/master/media/2022-feedback-survey-banner.png" alt="2022 TestCafe Feedback Survey" />
4
- </a>
2
+ <a href="https://www.devexpress.com/products/testcafestudio/?utm_source=github.com&utm_medium=referral&utm_campaign=tc-gh-banner">
3
+ <img src="https://raw.github.com/DevExpress/testcafe/master/media/testcafe-studio-banner.png" alt="Try TestCafe Studio IDE" />
4
+ </a>
5
5
  </p>
6
6
 
7
7
  <p align="center">
@@ -17,7 +17,9 @@
17
17
  </p>
18
18
 
19
19
  <p align="center">
20
- <i>A Node.js tool to automate end-to-end web testing.<br/>Write tests in JS or TypeScript, run them and view results.</i>
20
+ <i> Automate end-to-end web testing with TestCafe, a Node.js-based testing framework.</i><br><br>
21
+ TestCafe is <strong>free</strong> and as easy to use as <strong>1-2-3</strong>:<br>
22
+ <strong>1.</strong> Write your tests in JS or TypeScript.<br><strong>2.</strong> Execute your tests.<br><strong>3.</strong> View test results.
21
23
  </p>
22
24
 
23
25
  <p align="center">
@@ -29,7 +31,7 @@
29
31
 
30
32
  * **Works on all popular environments**: TestCafe runs on Windows, MacOS, and Linux. It supports desktop, mobile, remote and cloud [browsers](https://testcafe.io/documentation/402828/guides/concepts/browsers#browser-support) (UI or headless).
31
33
  * **1 minute to set up**: You [do not need WebDriver](https://testcafe.io/402636/faq#i-have-heard-that-testcafe-does-not-use-selenium-how-does-it-operate) or any other testing software. Install TestCafe with one command, and you are ready to test: `npm install -g testcafe`
32
- * **Free and open source**: TestCafe is free to use under the [MIT license](https://github.com/DevExpress/testcafe/blob/master/LICENSE). [Plugins](#plugins) provide custom reports, integration with other tools, launching tests from IDE, etc. You can use the plugins made by the GitHub community or make your own.
34
+ * **Free and open source**: TestCafe is free to use under the [MIT license](https://github.com/DevExpress/testcafe/blob/master/LICENSE). [Plugins](#plugins) provide custom reports, integration with other tools, launching tests from IDE, etc. You can use the plugins made by the GitHub community or create your own.
33
35
 
34
36
  ![Install TestCafe and Run a Test](https://raw.githubusercontent.com/DevExpress/testcafe/master/media/install-and-run-test.gif)
35
37
 
@@ -62,26 +64,20 @@ You can change the maximum wait time.
62
64
  If elements load faster, tests skip the timeout and continue.
63
65
 
64
66
  **Rapid test development tool**<br/>
65
- Changes in test code immediately restart the test, and you see the results instantly.<br/>
66
- See how it works in the [TestCafe Live repository](https://github.com/DevExpress/testcafe-live).
67
+ When you enable [live mode](https://testcafe.io/documentation/403842/guides/intermediate-guides/live-mode), changes to test code immediately restart the test, and you instantly see the results.
67
68
 
68
69
  **Latest JS and TypeScript support**<br/>
69
- TestCafe supports the latest JavaScript features, including ES2017 (for example, async/await).
70
- You can also [use TypeScript](https://testcafe.io/documentation/402824/guides/concepts/typescript-and-coffeescript#typescript-support)
71
- if you prefer a strongly typed language.
70
+ TestCafe supports the most recent JavaScript-related features, including ES2017 (async/await). You can also [use TypeScript](https://testcafe.io/documentation/402824/guides/concepts/typescript-and-coffeescript#typescript-support) if you prefer a strongly typed language instead.
72
71
 
73
72
  **Detects JS errors in your code**<br/>
74
- TestCafe reports JS errors that it finds on the webpage.
75
- Tests automatically fail because of that.
76
- However, you can disable this.
73
+ TestCafe reports JS errors that it locates on a given webpage. Tests automatically fail if TestCafe encounters such errors.<br />
74
+ You can, however, disable this option.<br />
77
75
 
78
76
  **Concurrent test launch**<br/>
79
- TestCafe can open multiple instances of the same browser to run parallel
80
- tests which decreases test execution time.
77
+ TestCafe can open multiple instances of the same browser and run parallel tests (to help decrease test execution time).
81
78
 
82
79
  **PageObject pattern support**<br/>
83
- The TestCafe's [Test API](https://testcafe.io/documentation/402632/reference)
84
- includes a high-level selector library, assertions, etc.
80
+ The TestCafe's [Test API](https://testcafe.io/documentation/402632/reference) includes a high-level selector library, assertions, etc.
85
81
  You can combine them to implement readable tests with the [PageObject pattern](https://testcafe.io/documentation/402826/guides/concepts/page-model).
86
82
 
87
83
  ```js
@@ -89,14 +85,15 @@ const macOSInput = Selector('.column').find('label').withText('MacOS').child('in
89
85
  ```
90
86
 
91
87
  **Easy to include in a continuous integration system**<br/>
92
- You can run TestCafe from a console, and its reports can be viewed in a CI system's interface
93
- (TeamCity, Jenkins, Travis & etc.)
88
+ You can run TestCafe from a console, and its reports can be viewed within CI systems (TeamCity, Jenkins, Travis & etc.)
89
+
90
+ # Love TestCafe Open-source Edition? Want to Record Tests without Writing JavaScript or TypeScript Code?
94
91
 
95
92
  ## TestCafe Studio: IDE for End-to-End Web Testing
96
93
 
97
- TestCafe works great for JavaScript developers, but at some point you will need to delegate testing tasks to your Q&A department. If that's the case and you are looking for a codeless way to record and maintain tests compatible with your existing infrastructure, check out [TestCafe Studio](https://www.devexpress.com/products/testcafestudio/?utm_source=github.com&utm_medium=referral&utm_campaign=tc-gh-ide) - a testing IDE built on top of the open-source TestCafe.
94
+ TestCafe is the perfect choice for JavaScript developers and experienced Q&A teams. If you’d like to delegate testing to QA engineers and are looking for a code-free way to record and maintain tests compatible with your existing infrastructure, check out [TestCafe Studio](https://www.devexpress.com/products/testcafestudio/?utm_source=github.com&utm_medium=referral&utm_campaign=tc-gh-ide) - a testing IDE built atop the open-source version of TestCafe.
98
95
 
99
- Read the following article to learn how TestCafe Studio could fit into your workflow: [What's Better than TestCafe? TestCafe Studio](https://www.devexpress.com/products/testcafestudio/qa-end-to-end-web-testing.xml).
96
+ Review the following article to learn how TestCafe Studio can fit into any workflow: [What's Better than TestCafe? TestCafe Studio](https://www.devexpress.com/products/testcafestudio/qa-end-to-end-web-testing.xml).
100
97
 
101
98
  ![Get Started with TestCafe Studio](https://raw.githubusercontent.com/DevExpress/testcafe/master/media/testcafe-studio-get-started.gif)
102
99
 
@@ -104,11 +101,11 @@ Read the following article to learn how TestCafe Studio could fit into your work
104
101
  <i>Record and Run a Test in TestCafe Studio</i>
105
102
  </p>
106
103
 
107
- ## Getting Started
104
+ # Getting Started
108
105
 
109
106
  ### Installation
110
107
 
111
- Ensure that [Node.js](https://nodejs.org/) ([Current or Active LTS](https://github.com/nodejs/Release#release-phases) is recommended, version 12 at minimum) and [npm](https://www.npmjs.com/) are installed on your computer before running it:
108
+ Ensure that [Node.js](https://nodejs.org/) ([Current or Active LTS](https://github.com/nodejs/Release#release-phases) is recommended, version 18 at minimum) and [npm](https://www.npmjs.com/) are installed on your computer before running it:
112
109
 
113
110
  ```sh
114
111
  npm install -g testcafe
@@ -116,11 +113,9 @@ npm install -g testcafe
116
113
 
117
114
  ### Creating the Test
118
115
 
119
- As an example, we are going to test the [https://devexpress.github.io/testcafe/example](https://devexpress.github.io/testcafe/example) page.
116
+ For this simple example, we will test the following page: [https://devexpress.github.io/testcafe/example](https://devexpress.github.io/testcafe/example)
120
117
 
121
- Create a `.js` or `.ts` file on your computer.
122
- Note that it needs to have a specific structure: tests must be organized into fixtures.
123
- You can paste the following code to see the test in action:
118
+ Create a .js or .ts file on your computer. Remember that a .js or .ts file must maintain a specific structure: tests must be organized into fixtures. You can paste the following code to see the test in action:
124
119
 
125
120
  ```js
126
121
  import { Selector } from 'testcafe'; // first import testcafe selectors
@@ -129,57 +124,57 @@ fixture `Getting Started`// declare the fixture
129
124
  .page `https://devexpress.github.io/testcafe/example`; // specify the start page
130
125
 
131
126
 
132
- //then create a test and place your code there
127
+ //then create a test and place your code within it
133
128
  test('My first test', async t => {
134
129
  await t
135
130
  .typeText('#developer-name', 'John Smith')
136
131
  .click('#submit-button')
137
132
 
138
- // Use the assertion to check if the actual header text is equal to the expected one
133
+ // Use the assertion to check if actual header text equals expected text
139
134
  .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');
140
135
  });
141
136
  ```
142
137
 
143
138
  ### Running the Test
144
139
 
145
- Call the following command in a command shell.
146
- Specify the [target browser](https://testcafe.io/documentation/402639/reference/command-line-interface#browser-list)
147
- and [file path](https://testcafe.io/documentation/402639/reference/command-line-interface#file-pathglob-pattern).
140
+ Call the following command in a command shell. Specify the [target browser](https://testcafe.io/documentation/402639/reference/command-line-interface#browser-list) and [file path](https://testcafe.io/documentation/402639/reference/command-line-interface#file-pathglob-pattern).
148
141
 
149
142
  ```sh
150
143
  testcafe chrome test1.js
151
144
  ```
152
145
 
153
- TestCafe opens the browser and starts executing the test.
146
+ TestCafe opens the browser and begins test execution.
147
+
148
+ > Important: Make certain the browser tab that runs tests stays active.
149
+ > Do not minimize the browser window.
150
+ > Inactive tabs and minimized browser windows switch to lower resource consumption mode.
151
+ > In low consumption mode, tests may not execute correctly.
154
152
 
155
- > Important! Make sure the browser tab that runs tests stays active.
156
- > Do not minimize the browser window. Inactive tabs and minimized browser windows switch
157
- > to a lower resource consumption mode where tests are not guaranteed to execute correctly.
158
153
 
159
154
  ### Viewing the Results
160
155
 
161
- TestCafe outputs the results into a command shell by default. See [Reporters](https://testcafe.io/documentation/402825/guides/concepts/reporters)
162
- for more information. You can also use [plugins](#plugins) to customize the reports.
156
+ TestCafe outputs results into a command shell by default. See [Reporters](https://testcafe.io/documentation/402825/guides/concepts/reporters)
157
+ for more information. You can also use [plugins](#plugins) to customize reports.
163
158
 
164
159
  ![Test Report](https://testcafe.io/images/report.png)
165
160
 
166
- Read the [Getting Started](https://testcafe.io/documentation/402635/getting-started) page for a more detailed guide.
161
+ Read the [Getting Started](https://testcafe.io/documentation/402635/getting-started) page for additional assistance.
167
162
 
168
163
  ## Documentation
169
164
 
170
- Go to our website for full [documentation](https://testcafe.io/documentation/402635/getting-started) on TestCafe.
165
+ Visit the following webpage to review our online help system: [Documentation](https://testcafe.io/documentation/402635/getting-started).
171
166
 
172
167
  ## Get Help
173
168
 
174
- Join the TestCafe community on Stack Overflow to get help. Ask and answer [questions with the TestCafe tag](https://stackoverflow.com/questions/tagged/testcafe).
169
+ Join the TestCafe community on Stack Overflow. Ask and answer questions [using the TestCafe tag](https://stackoverflow.com/questions/tagged/testcafe).
175
170
 
176
171
  ## Issue Tracker
177
172
 
178
- Use our GitHub issues page to [report bugs](https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md) and [suggest improvements](https://github.com/DevExpress/testcafe/issues/new?template=feature_request.md).
173
+ Use our GitHub issues page to [report bugs](https://github.com/DevExpress/testcafe/issues/new?template=bug-report.md) and [suggest enhancements](https://github.com/DevExpress/testcafe/issues/new?template=feature_request.md).
179
174
 
180
175
  ## Stay in Touch
181
176
 
182
- Follow us on [Twitter](https://twitter.com/DXTestCafe). We post TestCafe news and updates, several times a week.
177
+ Follow us on [Twitter](https://twitter.com/DXTestCafe). We post TestCafe news and updates.
183
178
 
184
179
  ## Contributing
185
180
 
@@ -187,14 +182,13 @@ Read our [Contributing Guide](https://github.com/DevExpress/testcafe/blob/master
187
182
 
188
183
  To create your own plugin for TestCafe, you can use these plugin generators:
189
184
 
190
- * [Build a browser provider](https://testcafe.io/documentation/402812/guides/extend-testcafe/browser-provider-plugin)
191
- to set up tests on your on-premises server farm, to use a cloud testing platform, or to start your local browsers in a special way. Use this [Yeoman generator](https://www.npmjs.com/package/generator-testcafe-browser-provider) to write only a few lines of code.
185
+ * [Build a browser provider](https://testcafe.io/documentation/402812/guides/extend-testcafe/browser-provider-plugin) to set up tests on your on-premises server farm, to use a cloud testing platform, or to start your local browsers in a special way. Use this [Yeoman generator](https://www.npmjs.com/package/generator-testcafe-browser-provider) to write only a few lines of code.
192
186
  * To [build a custom reporter](https://testcafe.io/documentation/402810/guides/extend-testcafe/reporter-plugin)
193
187
  with your formatting and style, check out this [generator](https://www.npmjs.com/package/generator-testcafe-reporter).
194
188
 
195
189
  If you want your plugin to be listed below, [send us a note in a Github issue](https://github.com/DevExpress/testcafe/issues/new).
196
190
 
197
- Thank you to all the people who already contributed to TestCafe!
191
+ Thanks to all of our contributors We appreciate your commitment to the TestCafe community.
198
192
 
199
193
  [<img alt="aha-oretama" src="https://avatars.githubusercontent.com/u/7259161?v=4&s=117" width="117">](https://github.com/aha-oretama) |[<img alt="ai" src="https://avatars.githubusercontent.com/u/19343?v=4&s=117" width="117">](https://github.com/ai) |[<img alt="aleks-pro" src="https://avatars.githubusercontent.com/u/14822473?v=4&s=117" width="117">](https://github.com/aleks-pro) |[<img alt="Aleksey28" src="https://avatars.githubusercontent.com/u/32869530?v=4&s=117" width="117">](https://github.com/Aleksey28) |[<img alt="AlexanderMoiseev" src="https://avatars.githubusercontent.com/u/1498953?v=4&s=117" width="117">](https://github.com/AlexanderMoiseev) |[<img alt="AlexanderMoskovkin" src="https://avatars.githubusercontent.com/u/12047804?v=4&s=117" width="117">](https://github.com/AlexanderMoskovkin) |
200
194
  :---: |:---: |:---: |:---: |:---: |:---: |
@@ -38,7 +38,9 @@ function createRequire(filename) {
38
38
  }
39
39
  function createSelectorDefinition(testRun) {
40
40
  return (fn, options = {}) => {
41
- const { skipVisibilityCheck, collectionMode } = testRun.controller.getExecutionContext()[OPTIONS_KEY];
41
+ const { skipVisibilityCheck, collectionMode } = testRun.controller ?
42
+ testRun.controller.getExecutionContext()[OPTIONS_KEY] :
43
+ createExecutionContext(testRun)[OPTIONS_KEY];
42
44
  if (skipVisibilityCheck)
43
45
  options.visibilityCheck = false;
44
46
  if (testRun && testRun.id)
@@ -86,4 +88,4 @@ function createExecutionContext(testRun) {
86
88
  }));
87
89
  }
88
90
  exports.createExecutionContext = createExecutionContext;
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3Rlc3QtY29udHJvbGxlci9leGVjdXRpb24tY29udGV4dC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBbUM7QUFDbkMsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qix1RUFBOEM7QUFDOUMsb0dBQWdFO0FBRWhFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV6QixRQUFBLHVCQUF1QixHQUFHO0lBQ25DLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsY0FBYyxFQUFPLEtBQUs7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsa0JBQWtCLENBQUUsV0FBVztJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsSUFBSSxTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1QyxPQUFPLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDOUIsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGtDQUFZLENBQUMsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsZ0NBQWdDO0lBQ2hDLElBQUksZ0JBQU0sQ0FBQyxxQkFBcUI7UUFDNUIsT0FBTyxnQkFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksZ0JBQU0sQ0FBQyxhQUFhO1FBQ3BCLE9BQU8sZ0JBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUMsTUFBTSxXQUFXLEdBQVksSUFBSSxnQkFB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LENBQUMsQ0FBQztZQUU1QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7S0FDSixDQUFDLENBQUMsQ0FBQztBQUNSLENBQUM7QUE3QkQsd0RBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3ZtJztcbmltcG9ydCBNb2R1bGUgZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGV4cG9ydGFibGVMaWIgZnJvbSAnLi4vZXhwb3J0YWJsZS1saWInO1xuaW1wb3J0IE5PREVfTU9EVUxFUyBmcm9tICcuLi8uLi91dGlscy9ub2RlLW1vZHVsZXMtZm9sZGVyLW5hbWUnO1xuXG5jb25zdCBPUFRJT05TX0tFWSA9IFN5bWJvbCgnb3B0aW9ucycpO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT05URVhUX09QVElPTlMgPSB7XG4gICAgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UsXG4gICAgY29sbGVjdGlvbk1vZGU6ICAgICAgZmFsc2UsXG59O1xuXG5mdW5jdGlvbiBnZXRNb2R1bGVCYXNlUGF0aHMgKGN1cnJlbnRQYXRoKSB7XG4gICAgY29uc3Qgbm9kZVBhdGhzID0gW107XG4gICAgbGV0IHBhcmVudERpciAgID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcblxuICAgIHdoaWxlIChjdXJyZW50UGF0aCAhPT0gcGFyZW50RGlyKSB7XG4gICAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50RGlyO1xuICAgICAgICBwYXJlbnREaXIgICA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG5cbiAgICAgICAgbm9kZVBhdGhzLnB1c2gocGF0aC5qb2luKGN1cnJlbnRQYXRoLCBOT0RFX01PRFVMRVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1aXJlIChmaWxlbmFtZSkge1xuICAgIC8vRGVwcmVjYXRlZCBzaW5jZTogTm9kZSB2MTIuMi4wXG4gICAgaWYgKE1vZHVsZS5jcmVhdGVSZXF1aXJlRnJvbVBhdGgpXG4gICAgICAgIHJldHVybiBNb2R1bGUuY3JlYXRlUmVxdWlyZUZyb21QYXRoKGZpbGVuYW1lKTtcblxuICAgIGlmIChNb2R1bGUuY3JlYXRlUmVxdWlyZSlcbiAgICAgICAgcmV0dXJuIE1vZHVsZS5jcmVhdGVSZXF1aXJlKGZpbGVuYW1lKTtcblxuICAgIGNvbnN0IGR1bW15TW9kdWxlICAgICAgICAgID0gbmV3IE1vZHVsZShmaWxlbmFtZSwgbW9kdWxlKTtcbiAgICBjb25zdCBsb2NhbE1vZHVsZXNQYXRocyAgICA9IGdldE1vZHVsZUJhc2VQYXRocyhmaWxlbmFtZSk7XG5cbiAgICBkdW1teU1vZHVsZS5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgIGR1bW15TW9kdWxlLnBhdGhzICAgID0gbG9jYWxNb2R1bGVzUGF0aHMuY29uY2F0KG1vZHVsZS5wYXRocyk7XG5cbiAgICByZXR1cm4gaWQgPT4gZHVtbXlNb2R1bGUucmVxdWlyZShpZCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yRGVmaW5pdGlvbiAodGVzdFJ1bikge1xuICAgIHJldHVybiAoZm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNraXBWaXNpYmlsaXR5Q2hlY2ssIGNvbGxlY3Rpb25Nb2RlIH0gPSB0ZXN0UnVuLmNvbnRyb2xsZXIuZ2V0RXhlY3V0aW9uQ29udGV4dCgpW09QVElPTlNfS0VZXTtcblxuICAgICAgICBpZiAoc2tpcFZpc2liaWxpdHlDaGVjaylcbiAgICAgICAgICAgIG9wdGlvbnMudmlzaWJpbGl0eUNoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRlc3RSdW4gJiYgdGVzdFJ1bi5pZClcbiAgICAgICAgICAgIG9wdGlvbnMuYm91bmRUZXN0UnVuID0gdGVzdFJ1bjtcblxuICAgICAgICBpZiAoY29sbGVjdGlvbk1vZGUpXG4gICAgICAgICAgICBvcHRpb25zLmNvbGxlY3Rpb25Nb2RlID0gY29sbGVjdGlvbk1vZGU7XG5cbiAgICAgICAgcmV0dXJuIGV4cG9ydGFibGVMaWIuU2VsZWN0b3IoZm4sIG9wdGlvbnMpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNsaWVudEZ1bmN0aW9uRGVmaW5pdGlvbiAodGVzdFJ1bikge1xuICAgIHJldHVybiAoZm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAodGVzdFJ1biAmJiB0ZXN0UnVuLmlkKVxuICAgICAgICAgICAgb3B0aW9ucy5ib3VuZFRlc3RSdW4gPSB0ZXN0UnVuO1xuXG4gICAgICAgIHJldHVybiBleHBvcnRhYmxlTGliLkNsaWVudEZ1bmN0aW9uKGZuLCBvcHRpb25zKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29udGV4dE9wdGlvbnMgKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBjb250ZXh0W09QVElPTlNfS0VZXSA9IG9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0ICh0ZXN0UnVuKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0ZXN0UnVuLnRlc3QudGVzdEZpbGUuZmlsZW5hbWU7XG5cbiAgICBjb25zdCByZXBsYWNlcnMgPSB7XG4gICAgICAgIHJlcXVpcmU6ICAgICAgICBjcmVhdGVSZXF1aXJlKGZpbGVuYW1lKSxcbiAgICAgICAgX19maWxlbmFtZTogICAgIGZpbGVuYW1lLFxuICAgICAgICBfX2Rpcm5hbWU6ICAgICAgcGF0aC5kaXJuYW1lKGZpbGVuYW1lKSxcbiAgICAgICAgdDogICAgICAgICAgICAgIHRlc3RSdW4uY29udHJvbGxlcixcbiAgICAgICAgU2VsZWN0b3I6ICAgICAgIGNyZWF0ZVNlbGVjdG9yRGVmaW5pdGlvbih0ZXN0UnVuKSxcbiAgICAgICAgQ2xpZW50RnVuY3Rpb246IGNyZWF0ZUNsaWVudEZ1bmN0aW9uRGVmaW5pdGlvbih0ZXN0UnVuKSxcbiAgICAgICAgUm9sZTogICAgICAgICAgIGV4cG9ydGFibGVMaWIuUm9sZSxcbiAgICAgICAgUmVxdWVzdExvZ2dlcjogIGV4cG9ydGFibGVMaWIuUmVxdWVzdExvZ2dlcixcbiAgICAgICAgUmVxdWVzdE1vY2s6ICAgIGV4cG9ydGFibGVMaWIuUmVxdWVzdE1vY2ssXG4gICAgICAgIFJlcXVlc3RIb29rOiAgICBleHBvcnRhYmxlTGliLlJlcXVlc3RIb29rLFxuICAgICAgICBbT1BUSU9OU19LRVldOiAgREVGQVVMVF9DT05URVhUX09QVElPTlMsXG4gICAgICAgIHVzZXJWYXJpYWJsZXM6ICBleHBvcnRhYmxlTGliLnVzZXJWYXJpYWJsZXMsXG4gICAgfTtcblxuICAgIHJldHVybiBjcmVhdGVDb250ZXh0KG5ldyBQcm94eShyZXBsYWNlcnMsIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcGxhY2Vycy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vyc1twcm9wZXJ0eV07XG5cbiAgICAgICAgICAgIGlmIChnbG9iYWwuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxbcHJvcGVydHldO1xuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7cHJvcGVydHl9IGlzIG5vdCBkZWZpbmVkYCk7XG4gICAgICAgIH0sXG4gICAgfSkpO1xufVxuIl19
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3Rlc3QtY29udHJvbGxlci9leGVjdXRpb24tY29udGV4dC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyQkFBbUM7QUFDbkMsb0RBQTRCO0FBQzVCLGdEQUF3QjtBQUN4Qix1RUFBOEM7QUFDOUMsb0dBQWdFO0FBRWhFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV6QixRQUFBLHVCQUF1QixHQUFHO0lBQ25DLG1CQUFtQixFQUFFLEtBQUs7SUFDMUIsY0FBYyxFQUFPLEtBQUs7Q0FDN0IsQ0FBQztBQUVGLFNBQVMsa0JBQWtCLENBQUUsV0FBVztJQUNwQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsSUFBSSxTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUU1QyxPQUFPLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDOUIsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixTQUFTLEdBQUssY0FBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV4QyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGtDQUFZLENBQUMsQ0FBQyxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFFLFFBQVE7SUFDNUIsZ0NBQWdDO0lBQ2hDLElBQUksZ0JBQU0sQ0FBQyxxQkFBcUI7UUFDNUIsT0FBTyxnQkFBTSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWxELElBQUksZ0JBQU0sQ0FBQyxhQUFhO1FBQ3BCLE9BQU8sZ0JBQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFMUMsTUFBTSxXQUFXLEdBQVksSUFBSSxnQkFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxRCxNQUFNLGlCQUFpQixHQUFNLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTFELFdBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLFdBQVcsQ0FBQyxLQUFLLEdBQU0saUJBQWlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5RCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyx3QkFBd0IsQ0FBRSxPQUFPO0lBQ3RDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDdkQsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFakQsSUFBSSxtQkFBbUI7WUFDbkIsT0FBTyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFFcEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUU7WUFDckIsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7UUFFbkMsSUFBSSxjQUFjO1lBQ2QsT0FBTyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFFNUMsT0FBTyx3QkFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsOEJBQThCLENBQUUsT0FBTztJQUM1QyxPQUFPLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsRUFBRTtRQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRTtZQUNyQixPQUFPLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUVuQyxPQUFPLHdCQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUM7QUFDTixDQUFDO0FBRUQsU0FBZ0IsaUJBQWlCLENBQUUsT0FBTyxFQUFFLE9BQU87SUFDL0MsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUNuQyxDQUFDO0FBRkQsOENBRUM7QUFFRCxTQUFnQixzQkFBc0IsQ0FBRSxPQUFPO0lBQzNDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUVoRCxNQUFNLFNBQVMsR0FBRztRQUNkLE9BQU8sRUFBUyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQ3ZDLFVBQVUsRUFBTSxRQUFRO1FBQ3hCLFNBQVMsRUFBTyxjQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLEVBQWUsT0FBTyxDQUFDLFVBQVU7UUFDbEMsUUFBUSxFQUFRLHdCQUF3QixDQUFDLE9BQU8sQ0FBQztRQUNqRCxjQUFjLEVBQUUsOEJBQThCLENBQUMsT0FBTyxDQUFDO1FBQ3ZELElBQUksRUFBWSx3QkFBYSxDQUFDLElBQUk7UUFDbEMsYUFBYSxFQUFHLHdCQUFhLENBQUMsYUFBYTtRQUMzQyxXQUFXLEVBQUssd0JBQWEsQ0FBQyxXQUFXO1FBQ3pDLFdBQVcsRUFBSyx3QkFBYSxDQUFDLFdBQVc7UUFDekMsQ0FBQyxXQUFXLENBQUMsRUFBRywrQkFBdUI7UUFDdkMsYUFBYSxFQUFHLHdCQUFhLENBQUMsYUFBYTtLQUM5QyxDQUFDO0lBRUYsT0FBTyxJQUFBLGtCQUFhLEVBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO1FBQ3RDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUN0QixJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUNsQyxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUvQixJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUMvQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU1QixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7S0FDSixDQUFDLENBQUMsQ0FBQztBQUNSLENBQUM7QUE3QkQsd0RBNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3ZtJztcbmltcG9ydCBNb2R1bGUgZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGV4cG9ydGFibGVMaWIgZnJvbSAnLi4vZXhwb3J0YWJsZS1saWInO1xuaW1wb3J0IE5PREVfTU9EVUxFUyBmcm9tICcuLi8uLi91dGlscy9ub2RlLW1vZHVsZXMtZm9sZGVyLW5hbWUnO1xuXG5jb25zdCBPUFRJT05TX0tFWSA9IFN5bWJvbCgnb3B0aW9ucycpO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9DT05URVhUX09QVElPTlMgPSB7XG4gICAgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UsXG4gICAgY29sbGVjdGlvbk1vZGU6ICAgICAgZmFsc2UsXG59O1xuXG5mdW5jdGlvbiBnZXRNb2R1bGVCYXNlUGF0aHMgKGN1cnJlbnRQYXRoKSB7XG4gICAgY29uc3Qgbm9kZVBhdGhzID0gW107XG4gICAgbGV0IHBhcmVudERpciAgID0gcGF0aC5kaXJuYW1lKGN1cnJlbnRQYXRoKTtcblxuICAgIHdoaWxlIChjdXJyZW50UGF0aCAhPT0gcGFyZW50RGlyKSB7XG4gICAgICAgIGN1cnJlbnRQYXRoID0gcGFyZW50RGlyO1xuICAgICAgICBwYXJlbnREaXIgICA9IHBhdGguZGlybmFtZShjdXJyZW50UGF0aCk7XG5cbiAgICAgICAgbm9kZVBhdGhzLnB1c2gocGF0aC5qb2luKGN1cnJlbnRQYXRoLCBOT0RFX01PRFVMRVMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9kZVBhdGhzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1aXJlIChmaWxlbmFtZSkge1xuICAgIC8vRGVwcmVjYXRlZCBzaW5jZTogTm9kZSB2MTIuMi4wXG4gICAgaWYgKE1vZHVsZS5jcmVhdGVSZXF1aXJlRnJvbVBhdGgpXG4gICAgICAgIHJldHVybiBNb2R1bGUuY3JlYXRlUmVxdWlyZUZyb21QYXRoKGZpbGVuYW1lKTtcblxuICAgIGlmIChNb2R1bGUuY3JlYXRlUmVxdWlyZSlcbiAgICAgICAgcmV0dXJuIE1vZHVsZS5jcmVhdGVSZXF1aXJlKGZpbGVuYW1lKTtcblxuICAgIGNvbnN0IGR1bW15TW9kdWxlICAgICAgICAgID0gbmV3IE1vZHVsZShmaWxlbmFtZSwgbW9kdWxlKTtcbiAgICBjb25zdCBsb2NhbE1vZHVsZXNQYXRocyAgICA9IGdldE1vZHVsZUJhc2VQYXRocyhmaWxlbmFtZSk7XG5cbiAgICBkdW1teU1vZHVsZS5maWxlbmFtZSA9IGZpbGVuYW1lO1xuICAgIGR1bW15TW9kdWxlLnBhdGhzICAgID0gbG9jYWxNb2R1bGVzUGF0aHMuY29uY2F0KG1vZHVsZS5wYXRocyk7XG5cbiAgICByZXR1cm4gaWQgPT4gZHVtbXlNb2R1bGUucmVxdWlyZShpZCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlbGVjdG9yRGVmaW5pdGlvbiAodGVzdFJ1bikge1xuICAgIHJldHVybiAoZm4sIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNraXBWaXNpYmlsaXR5Q2hlY2ssIGNvbGxlY3Rpb25Nb2RlIH0gPSB0ZXN0UnVuLmNvbnRyb2xsZXIgP1xuICAgICAgICAgICAgdGVzdFJ1bi5jb250cm9sbGVyLmdldEV4ZWN1dGlvbkNvbnRleHQoKVtPUFRJT05TX0tFWV0gOlxuICAgICAgICAgICAgY3JlYXRlRXhlY3V0aW9uQ29udGV4dCh0ZXN0UnVuKVtPUFRJT05TX0tFWV07XG5cbiAgICAgICAgaWYgKHNraXBWaXNpYmlsaXR5Q2hlY2spXG4gICAgICAgICAgICBvcHRpb25zLnZpc2liaWxpdHlDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0ZXN0UnVuICYmIHRlc3RSdW4uaWQpXG4gICAgICAgICAgICBvcHRpb25zLmJvdW5kVGVzdFJ1biA9IHRlc3RSdW47XG5cbiAgICAgICAgaWYgKGNvbGxlY3Rpb25Nb2RlKVxuICAgICAgICAgICAgb3B0aW9ucy5jb2xsZWN0aW9uTW9kZSA9IGNvbGxlY3Rpb25Nb2RlO1xuXG4gICAgICAgIHJldHVybiBleHBvcnRhYmxlTGliLlNlbGVjdG9yKGZuLCBvcHRpb25zKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGllbnRGdW5jdGlvbkRlZmluaXRpb24gKHRlc3RSdW4pIHtcbiAgICByZXR1cm4gKGZuLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgaWYgKHRlc3RSdW4gJiYgdGVzdFJ1bi5pZClcbiAgICAgICAgICAgIG9wdGlvbnMuYm91bmRUZXN0UnVuID0gdGVzdFJ1bjtcblxuICAgICAgICByZXR1cm4gZXhwb3J0YWJsZUxpYi5DbGllbnRGdW5jdGlvbihmbiwgb3B0aW9ucyk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRleHRPcHRpb25zIChjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgY29udGV4dFtPUFRJT05TX0tFWV0gPSBvcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRXhlY3V0aW9uQ29udGV4dCAodGVzdFJ1bikge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGVzdFJ1bi50ZXN0LnRlc3RGaWxlLmZpbGVuYW1lO1xuXG4gICAgY29uc3QgcmVwbGFjZXJzID0ge1xuICAgICAgICByZXF1aXJlOiAgICAgICAgY3JlYXRlUmVxdWlyZShmaWxlbmFtZSksXG4gICAgICAgIF9fZmlsZW5hbWU6ICAgICBmaWxlbmFtZSxcbiAgICAgICAgX19kaXJuYW1lOiAgICAgIHBhdGguZGlybmFtZShmaWxlbmFtZSksXG4gICAgICAgIHQ6ICAgICAgICAgICAgICB0ZXN0UnVuLmNvbnRyb2xsZXIsXG4gICAgICAgIFNlbGVjdG9yOiAgICAgICBjcmVhdGVTZWxlY3RvckRlZmluaXRpb24odGVzdFJ1biksXG4gICAgICAgIENsaWVudEZ1bmN0aW9uOiBjcmVhdGVDbGllbnRGdW5jdGlvbkRlZmluaXRpb24odGVzdFJ1biksXG4gICAgICAgIFJvbGU6ICAgICAgICAgICBleHBvcnRhYmxlTGliLlJvbGUsXG4gICAgICAgIFJlcXVlc3RMb2dnZXI6ICBleHBvcnRhYmxlTGliLlJlcXVlc3RMb2dnZXIsXG4gICAgICAgIFJlcXVlc3RNb2NrOiAgICBleHBvcnRhYmxlTGliLlJlcXVlc3RNb2NrLFxuICAgICAgICBSZXF1ZXN0SG9vazogICAgZXhwb3J0YWJsZUxpYi5SZXF1ZXN0SG9vayxcbiAgICAgICAgW09QVElPTlNfS0VZXTogIERFRkFVTFRfQ09OVEVYVF9PUFRJT05TLFxuICAgICAgICB1c2VyVmFyaWFibGVzOiAgZXhwb3J0YWJsZUxpYi51c2VyVmFyaWFibGVzLFxuICAgIH07XG5cbiAgICByZXR1cm4gY3JlYXRlQ29udGV4dChuZXcgUHJveHkocmVwbGFjZXJzLCB7XG4gICAgICAgIGdldDogKHRhcmdldCwgcHJvcGVydHkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXBsYWNlcnMuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcnNbcHJvcGVydHldO1xuXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsW3Byb3BlcnR5XTtcblxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Byb3BlcnR5fSBpcyBub3QgZGVmaW5lZGApO1xuICAgICAgICB9LFxuICAgIH0pKTtcbn1cbiJdfQ==
@@ -10,6 +10,7 @@ const testcafe_hammerhead_1 = require("testcafe-hammerhead");
10
10
  const service_routes_1 = __importDefault(require("./service-routes"));
11
11
  const empty_page_markup_1 = __importDefault(require("../../proxyless/empty-page-markup"));
12
12
  const error_route_1 = __importDefault(require("../../proxyless/error-route"));
13
+ const initializers_1 = require("../../test-run/commands/validations/initializers");
13
14
  class BrowserConnectionGateway {
14
15
  constructor(proxy, options) {
15
16
  this._connections = {};
@@ -48,6 +49,8 @@ class BrowserConnectionGateway {
48
49
  this._dispatch(`${service_routes_1.default.closeWindow}/{id}`, proxy, BrowserConnectionGateway._onCloseWindowRequest, 'POST');
49
50
  this._dispatch(`${service_routes_1.default.openFileProtocol}/{id}`, proxy, BrowserConnectionGateway._onOpenFileProtocolRequest, 'POST');
50
51
  this._dispatch(`${service_routes_1.default.dispatchProxylessEvent}/{id}`, proxy, BrowserConnectionGateway._onDispatchProxylessEvent, 'POST', this.proxyless);
52
+ this._dispatch(`${service_routes_1.default.parseSelector}/{id}`, proxy, BrowserConnectionGateway._parseSelector, 'POST', this.proxyless);
53
+ this._dispatch(`${service_routes_1.default.dispatchProxylessEventSequence}/{id}`, proxy, BrowserConnectionGateway._onDispatchProxylessEventSequence, 'POST', this.proxyless);
51
54
  proxy.GET(service_routes_1.default.connect, (req, res) => this._connectNextRemoteBrowser(req, res));
52
55
  proxy.GET(service_routes_1.default.connectWithTrailingSlash, (req, res) => this._connectNextRemoteBrowser(req, res));
53
56
  proxy.GET(service_routes_1.default.serviceWorker, { content: serviceWorkerScript, contentType: 'application/x-javascript' });
@@ -176,6 +179,17 @@ class BrowserConnectionGateway {
176
179
  });
177
180
  }
178
181
  }
182
+ static _onDispatchProxylessEventSequence(req, res, connection) {
183
+ if (BrowserConnectionGateway._ensureConnectionReady(res, connection)) {
184
+ BrowserConnectionGateway._fetchRequestData(req, data => {
185
+ const eventSequence = JSON.parse(data);
186
+ connection.dispatchProxylessEventSequence(eventSequence)
187
+ .then(() => {
188
+ (0, http_1.respondWithJSON)(res);
189
+ });
190
+ });
191
+ }
192
+ }
179
193
  async _connectNextRemoteBrowser(req, res) {
180
194
  (0, http_1.preventCaching)(res);
181
195
  const remoteConnection = await this._remotesQueue.shift();
@@ -184,6 +198,31 @@ class BrowserConnectionGateway {
184
198
  else
185
199
  (0, http_1.respond500)(res, 'There are no available _connections to establish.');
186
200
  }
201
+ static _getParsedSelector(testRun, rawSelector) {
202
+ const options = {
203
+ testRun,
204
+ skipVisibilityCheck: true,
205
+ collectionMode: true,
206
+ };
207
+ const value = rawSelector.trim().startsWith('Selector(') ? rawSelector : `'${rawSelector}'`;
208
+ const selector = { type: 'js-expr', value };
209
+ return (0, initializers_1.initSelector)('selector', selector, options);
210
+ }
211
+ static _parseSelector(req, res, connection) {
212
+ if (BrowserConnectionGateway._ensureConnectionReady(res, connection)) {
213
+ BrowserConnectionGateway._fetchRequestData(req, data => {
214
+ try {
215
+ const testRun = connection.getCurrentTestRun();
216
+ const rawSelector = JSON.parse(data).selector;
217
+ const parsedSelector = BrowserConnectionGateway._getParsedSelector(testRun, rawSelector);
218
+ (0, http_1.respondWithJSON)(res, parsedSelector);
219
+ }
220
+ catch (error) {
221
+ (0, http_1.respondWithJSON)(res);
222
+ }
223
+ });
224
+ }
225
+ }
187
226
  // API
188
227
  startServingConnection(connection) {
189
228
  this._connections[connection.id] = connection;
@@ -199,7 +238,10 @@ class BrowserConnectionGateway {
199
238
  for (const id in this._connections)
200
239
  await this._connections[id].close();
201
240
  }
241
+ getConnections() {
242
+ return this._connections;
243
+ }
202
244
  }
203
245
  exports.default = BrowserConnectionGateway;
204
246
  module.exports = exports.default;
205
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9FQUEyQztBQUMzQywyQ0FNMEI7QUFFMUIsb0VBQTJDO0FBQzNDLDZEQUErRDtBQUkvRCxzRUFBOEM7QUFDOUMsMEZBQWtFO0FBQ2xFLDhFQUFnRTtBQUVoRSxNQUFxQix3QkFBd0I7SUFRekMsWUFBb0IsS0FBWSxFQUFFLE9BQXdEO1FBUGxGLGlCQUFZLEdBQWtDLEVBQUUsQ0FBQztRQVFyRCxJQUFJLENBQUMsYUFBYSxHQUFLLElBQUksdUJBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQVEsS0FBSyxDQUFDLHlCQUF5QixDQUFDLHdCQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsR0FBSSxPQUFPLENBQUMsY0FBYyxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLEdBQVMsT0FBTyxDQUFDLFNBQVMsQ0FBQztRQUN6QyxJQUFJLENBQUMsS0FBSyxHQUFhLEtBQUssQ0FBQztRQUU3QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxTQUFTLENBQUUsR0FBVyxFQUFFLEtBQVksRUFBRSxPQUFpQixFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsdUJBQWlDO1FBQzlHLHlFQUF5RTtRQUN6RSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBb0IsRUFBRSxHQUFtQixFQUFFLFVBQVUsRUFBRSxNQUEwQixFQUFFLEVBQUU7WUFDckcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFaEQsSUFBQSxxQkFBYyxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBCLElBQUksdUJBQXVCO2dCQUN2QixJQUFBLHVDQUFpQixFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTNCLElBQUksVUFBVTtnQkFDVixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzs7Z0JBRTlCLElBQUEsaUJBQVUsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxlQUFlLENBQUUsS0FBWTtRQUNqQyxNQUFNLEVBQ0YsY0FBYyxFQUNkLGFBQWEsRUFDYixZQUFZLEVBQ1osbUJBQW1CLEdBQ3RCLEdBQUcsSUFBQSxxQkFBVSxHQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUFjLENBQUMsT0FBTyxPQUFPLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBYyxDQUFDLFNBQVMsT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4SCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQWMsQ0FBQyxJQUFJLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUFjLENBQUMsVUFBVSxPQUFPLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBYyxDQUFDLE1BQU0sT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBYyxDQUFDLFVBQVUsT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsQ0FBQywwQkFBMEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3ZJLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBYyxDQUFDLFVBQVUsT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBYyxDQUFDLFVBQVUsT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuSCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQWMsQ0FBQyxjQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1SSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQWMsQ0FBQyxjQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsMkJBQTJCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3SSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQWMsQ0FBQyxXQUFXLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUFjLENBQUMsZ0JBQWdCLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUFjLENBQUMsc0JBQXNCLE9BQU8sRUFBRSxLQUFLLEVBQUUsd0JBQXdCLENBQUMseUJBQXlCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuSixLQUFLLENBQUMsR0FBRyxDQUFDLHdCQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBb0IsRUFBRSxHQUFtQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyx3QkFBYyxDQUFDLHdCQUF3QixFQUFFLENBQUMsR0FBb0IsRUFBRSxHQUFtQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFNUksS0FBSyxDQUFDLEdBQUcsQ0FBQyx3QkFBYyxDQUFDLGFBQWEsRUFBRSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO1FBQzdHLEtBQUssQ0FBQyxHQUFHLENBQUMsd0JBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM3RixLQUFLLENBQUMsR0FBRyxDQUFDLHdCQUFjLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFFL0YsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLEtBQUssQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFvQixFQUFFLEdBQW1CLEVBQUUsRUFBRTtnQkFDM0UsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQywyQkFBaUIsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsVUFBVTtJQUNGLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBRSxHQUFtQixFQUFFLFVBQTZCO1FBQ3JGLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDdkIsSUFBQSxpQkFBVSxFQUFDLEdBQUcsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBRSxHQUFvQixFQUFFLFFBQWdDO1FBQ3BGLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVkLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ25CLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7WUFDZixRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsaUJBQWlCO0lBQ1QsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUUsR0FBb0IsRUFBRSxHQUFtQixFQUFFLFVBQTZCO1FBQ3hHLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUNwQixJQUFBLGlCQUFVLEVBQUMsR0FBRyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7YUFFekQ7WUFDRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBVyxDQUFDO1lBRXRELE1BQU0sVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxJQUFBLGVBQVEsRUFBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUUsR0FBb0IsRUFBRSxHQUFtQixFQUFFLFVBQTZCO1FBQ2pHLElBQUksd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2xFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUV0QyxJQUFBLHNCQUFlLEVBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxPQUFPLENBQUUsR0FBb0IsRUFBRSxHQUFtQixFQUFFLFVBQTZCO1FBQzVGLElBQUksd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztZQUNoRSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkI7UUFDeEcsSUFBSSx3QkFBd0IsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDbEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhELElBQUEsZUFBUSxFQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkI7UUFDM0csT0FBTyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkI7UUFDckgsT0FBTyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBRU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkIsRUFBRSxVQUFtQjtRQUNwSSxJQUFJLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNsRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFdEQsSUFBQSxzQkFBZSxFQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFTyxNQUFNLENBQUMsb0JBQW9CLENBQUUsR0FBb0IsRUFBRSxHQUFtQixFQUFFLFVBQTZCO1FBQ3pHLElBQUksd0JBQXdCLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ2xFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUUxQyxJQUFBLHNCQUFlLEVBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkI7UUFDMUcsSUFBSSx3QkFBd0IsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDbEUsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNuRCxVQUFVLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXhDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLDJCQUEyQixDQUFFLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUE2QjtRQUNoSCxJQUFJLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNsRSxJQUFBLHNCQUFlLEVBQUMsR0FBRyxFQUFFO2dCQUNqQixjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQWM7YUFDNUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLDJCQUEyQixDQUFFLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUE2QjtRQUNoSCxJQUFJLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNsRSx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXBDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFFaEQsSUFBQSxzQkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFFLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUE2QjtRQUMxRyxJQUFJLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNsRSxVQUFVLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7aUJBQ3JELElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsSUFBQSxzQkFBZSxFQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQ1Y7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLDBCQUEwQixDQUFFLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUE2QjtRQUMvRyxJQUFJLHdCQUF3QixDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUNsRSx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXBDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO3FCQUN0QyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNQLElBQUEsc0JBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBRSxHQUFvQixFQUFFLEdBQW1CLEVBQUUsVUFBNkI7UUFDOUcsSUFBSSx3QkFBd0IsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUU7WUFDbEUsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNuRCxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTNDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO3FCQUMzQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNQLElBQUEsc0JBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBRSxHQUFvQixFQUFFLEdBQW1CO1FBQzlFLElBQUEscUJBQWMsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUVwQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUUxRCxJQUFJLGdCQUFnQjtZQUNoQixJQUFBLGVBQVEsRUFBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBRXBDLElBQUEsaUJBQVUsRUFBQyxHQUFHLEVBQUUsbURBQW1ELENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTTtJQUNDLHNCQUFzQixDQUFFLFVBQTZCO1FBQ3hELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUU5QyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVNLHFCQUFxQixDQUFFLFVBQTZCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEMsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksS0FBSyxRQUFRO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNkLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDOUIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQXhQRCwyQ0F3UEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9hZEFzc2V0cyBmcm9tICcuLi8uLi9sb2FkLWFzc2V0cyc7XG5pbXBvcnQge1xuICAgIHJlc3BvbmQ0MDQsXG4gICAgcmVzcG9uZDUwMCxcbiAgICByZXNwb25kV2l0aEpTT04sXG4gICAgcmVkaXJlY3QsXG4gICAgcHJldmVudENhY2hpbmcsXG59IGZyb20gJy4uLy4uL3V0aWxzL2h0dHAnO1xuXG5pbXBvcnQgUmVtb3Rlc1F1ZXVlIGZyb20gJy4vcmVtb3Rlcy1xdWV1ZSc7XG5pbXBvcnQgeyBQcm94eSwgYWNjZXB0Q3Jvc3NPcmlnaW4gfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IFNFUlZJQ0VfUk9VVEVTIGZyb20gJy4vc2VydmljZS1yb3V0ZXMnO1xuaW1wb3J0IEVNUFRZX1BBR0VfTUFSS1VQIGZyb20gJy4uLy4uL3Byb3h5bGVzcy9lbXB0eS1wYWdlLW1hcmt1cCc7XG5pbXBvcnQgUFJPWFlMRVNTX0VSUk9SX1JPVVRFIGZyb20gJy4uLy4uL3Byb3h5bGVzcy9lcnJvci1yb3V0ZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSB7XG4gICAgcHJpdmF0ZSBfY29ubmVjdGlvbnM6IERpY3Rpb25hcnk8QnJvd3NlckNvbm5lY3Rpb24+ID0ge307XG4gICAgcHJpdmF0ZSBfcmVtb3Rlc1F1ZXVlOiBSZW1vdGVzUXVldWU7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RVcmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmV0cnlUZXN0UGFnZXM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm94eWxlc3M6IGJvb2xlYW47XG4gICAgcHVibGljIHJlYWRvbmx5IHByb3h5OiBQcm94eTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAocHJveHk6IFByb3h5LCBvcHRpb25zOiB7IHJldHJ5VGVzdFBhZ2VzOiBib29sZWFuOyBwcm94eWxlc3M6IGJvb2xlYW4gfSkge1xuICAgICAgICB0aGlzLl9yZW1vdGVzUXVldWUgICA9IG5ldyBSZW1vdGVzUXVldWUoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0VXJsICAgICAgPSBwcm94eS5yZXNvbHZlUmVsYXRpdmVTZXJ2aWNlVXJsKFNFUlZJQ0VfUk9VVEVTLmNvbm5lY3QpO1xuICAgICAgICB0aGlzLnJldHJ5VGVzdFBhZ2VzICA9IG9wdGlvbnMucmV0cnlUZXN0UGFnZXM7XG4gICAgICAgIHRoaXMucHJveHlsZXNzICAgICAgID0gb3B0aW9ucy5wcm94eWxlc3M7XG4gICAgICAgIHRoaXMucHJveHkgICAgICAgICAgID0gcHJveHk7XG5cbiAgICAgICAgdGhpcy5fcmVnaXN0ZXJSb3V0ZXMocHJveHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc3BhdGNoICh1cmw6IHN0cmluZywgcHJveHk6IFByb3h5LCBoYW5kbGVyOiBGdW5jdGlvbiwgbWV0aG9kID0gJ0dFVCcsIHNob3VsZEFjY2VwdENyb3NzT3JpZ2luPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlIE5lZWQgdG8gaW1wcm92ZSB0eXBpbmdzIG9mIHRoZSAndGVzdGNhZmUtaGFtbWVyaGVhZCcgbW9kdWxlXG4gICAgICAgIHByb3h5W21ldGhvZF0odXJsLCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIHNlcnZlckluZm8sIHBhcmFtczogRGljdGlvbmFyeTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbnNbcGFyYW1zLmlkXTtcblxuICAgICAgICAgICAgcHJldmVudENhY2hpbmcocmVzKTtcblxuICAgICAgICAgICAgaWYgKHNob3VsZEFjY2VwdENyb3NzT3JpZ2luKVxuICAgICAgICAgICAgICAgIGFjY2VwdENyb3NzT3JpZ2luKHJlcyk7XG5cbiAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgIGhhbmRsZXIocmVxLCByZXMsIGNvbm5lY3Rpb24pO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJlc3BvbmQ0MDQocmVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJSb3V0ZXMgKHByb3h5OiBQcm94eSk6IHZvaWQge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpZGxlUGFnZVNjcmlwdCxcbiAgICAgICAgICAgIGlkbGVQYWdlU3R5bGUsXG4gICAgICAgICAgICBpZGxlUGFnZUxvZ28sXG4gICAgICAgICAgICBzZXJ2aWNlV29ya2VyU2NyaXB0LFxuICAgICAgICB9ID0gbG9hZEFzc2V0cygpO1xuXG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmNvbm5lY3R9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkNvbm5lY3Rpb24pO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5oZWFydGJlYXR9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkhlYXJ0YmVhdCwgJ0dFVCcsIHRoaXMucHJveHlsZXNzKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuaWRsZX0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSWRsZSk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmlkbGVGb3JjZWR9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbklkbGVGb3JjZWQpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5zdGF0dXN9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vblN0YXR1c1JlcXVlc3QpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5zdGF0dXNEb25lfS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25TdGF0dXNSZXF1ZXN0T25UZXN0RG9uZSwgJ0dFVCcsIHRoaXMucHJveHlsZXNzKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuaW5pdFNjcmlwdH0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSW5pdFNjcmlwdFJlcXVlc3QpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5pbml0U2NyaXB0fS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25Jbml0U2NyaXB0UmVzcG9uc2UsICdQT1NUJyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmFjdGl2ZVdpbmRvd0lkfS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25HZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QsICdHRVQnLCB0aGlzLnByb3h5bGVzcyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmFjdGl2ZVdpbmRvd0lkfS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25TZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QsICdQT1NUJywgdGhpcy5wcm94eWxlc3MpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5jbG9zZVdpbmRvd30ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uQ2xvc2VXaW5kb3dSZXF1ZXN0LCAnUE9TVCcpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5vcGVuRmlsZVByb3RvY29sfS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25PcGVuRmlsZVByb3RvY29sUmVxdWVzdCwgJ1BPU1QnKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuZGlzcGF0Y2hQcm94eWxlc3NFdmVudH0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uRGlzcGF0Y2hQcm94eWxlc3NFdmVudCwgJ1BPU1QnLCB0aGlzLnByb3h5bGVzcyk7XG5cbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmNvbm5lY3QsIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSkgPT4gdGhpcy5fY29ubmVjdE5leHRSZW1vdGVCcm93c2VyKHJlcSwgcmVzKSk7XG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5jb25uZWN0V2l0aFRyYWlsaW5nU2xhc2gsIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSkgPT4gdGhpcy5fY29ubmVjdE5leHRSZW1vdGVCcm93c2VyKHJlcSwgcmVzKSk7XG5cbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLnNlcnZpY2VXb3JrZXIsIHsgY29udGVudDogc2VydmljZVdvcmtlclNjcmlwdCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLmluZGV4LCB7IGNvbnRlbnQ6IGlkbGVQYWdlU2NyaXB0LCBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgfSk7XG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5hc3NldHMuc3R5bGVzLCB7IGNvbnRlbnQ6IGlkbGVQYWdlU3R5bGUsIGNvbnRlbnRUeXBlOiAndGV4dC9jc3MnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLmxvZ28sIHsgY29udGVudDogaWRsZVBhZ2VMb2dvLCBjb250ZW50VHlwZTogJ2ltYWdlL3N2Zyt4bWwnIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3h5bGVzcykge1xuICAgICAgICAgICAgcHJveHkuR0VUKFBST1hZTEVTU19FUlJPUl9ST1VURSwgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgICAgIHJlcy5lbmQoRU1QVFlfUEFHRV9NQVJLVVApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeSAocmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBub3QgcmVhZHkgeWV0LicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2ZldGNoUmVxdWVzdERhdGEgKHJlcTogSW5jb21pbmdNZXNzYWdlLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuXG4gICAgICAgIHJlcS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUm91dGUgaGFuZGxlcnNcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25Db25uZWN0aW9uIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaXNSZWFkeSgpKVxuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLicpO1xuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZXN0YWJsaXNoKHVzZXJBZ2VudCk7XG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIGNvbm5lY3Rpb24uaWRsZVVybCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25IZWFydGJlYXQgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvbi5oZWFydGJlYXQoKTtcblxuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vbklkbGUgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSlcbiAgICAgICAgICAgIHJlcy5lbmQoY29ubmVjdGlvbi5yZW5kZXJJZGxlUGFnZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25JZGxlRm9yY2VkIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKHRydWUpO1xuXG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIHN0YXR1cy51cmwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgX29uU3RhdHVzUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25TdGF0dXNSZXF1ZXN0T25UZXN0RG9uZSAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIF9vblN0YXR1c1JlcXVlc3RDb3JlIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24sIGlzVGVzdERvbmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKGlzVGVzdERvbmUpO1xuXG4gICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX29uSW5pdFNjcmlwdFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gY29ubmVjdGlvbi5nZXRJbml0U2NyaXB0KCk7XG5cbiAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMsIHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25Jbml0U2NyaXB0UmVzcG9uc2UgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5oYW5kbGVJbml0U2NyaXB0UmVzdWx0KGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25HZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25TZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkID0gcGFyc2VkRGF0YS53aW5kb3dJZDtcblxuICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25DbG9zZVdpbmRvd1JlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5wcm92aWRlci5jbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyhjb25uZWN0aW9uLmlkKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25PcGVuRmlsZVByb3RvY29sUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeShyZXMsIGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2ZldGNoUmVxdWVzdERhdGEocmVxLCBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub3BlbkZpbGVQcm90b2NvbChwYXJzZWREYXRhLnVybClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25EaXNwYXRjaFByb3h5bGVzc0V2ZW50IChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZmV0Y2hSZXF1ZXN0RGF0YShyZXEsIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgb3B0aW9ucyB9ID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzcGF0Y2hQcm94eWxlc3NFdmVudCh0eXBlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2Nvbm5lY3ROZXh0UmVtb3RlQnJvd3NlciAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcHJldmVudENhY2hpbmcocmVzKTtcblxuICAgICAgICBjb25zdCByZW1vdGVDb25uZWN0aW9uID0gYXdhaXQgdGhpcy5fcmVtb3Rlc1F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKHJlbW90ZUNvbm5lY3Rpb24pXG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIHJlbW90ZUNvbm5lY3Rpb24udXJsKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGVyZSBhcmUgbm8gYXZhaWxhYmxlIF9jb25uZWN0aW9ucyB0byBlc3RhYmxpc2guJyk7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgcHVibGljIHN0YXJ0U2VydmluZ0Nvbm5lY3Rpb24gKGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zW2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcblxuICAgICAgICBpZiAoY29ubmVjdGlvbi5icm93c2VySW5mby5wcm92aWRlck5hbWUgPT09ICdyZW1vdGUnKVxuICAgICAgICAgICAgdGhpcy5fcmVtb3Rlc1F1ZXVlLmFkZChjb25uZWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcFNlcnZpbmdDb25uZWN0aW9uIChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBkZWxldGUgdGhpcy5fY29ubmVjdGlvbnNbY29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lID09PSAncmVtb3RlJylcbiAgICAgICAgICAgIHRoaXMuX3JlbW90ZXNRdWV1ZS5yZW1vdmUoY29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsb3NlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9jb25uZWN0aW9ucylcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rpb25zW2lkXS5jbG9zZSgpO1xuICAgIH1cbn1cblxuIl19
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG9FQUEyQztBQUMzQywyQ0FNMEI7QUFFMUIsb0VBQTJDO0FBQzNDLDZEQUErRDtBQUkvRCxzRUFBOEM7QUFDOUMsMEZBQWtFO0FBQ2xFLDhFQUFnRTtBQUNoRSxtRkFBZ0Y7QUFHaEYsTUFBcUIsd0JBQXdCO0lBUXpDLFlBQW9CLEtBQVksRUFBRSxPQUF3RDtRQVBsRixpQkFBWSxHQUFrQyxFQUFFLENBQUM7UUFRckQsSUFBSSxDQUFDLGFBQWEsR0FBSSxJQUFJLHVCQUFZLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFPLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDeEMsSUFBSSxDQUFDLEtBQUssR0FBWSxLQUFLLENBQUM7UUFFNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRU8sU0FBUyxDQUFFLEdBQVcsRUFBRSxLQUFZLEVBQUUsT0FBaUIsRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLHVCQUFpQztRQUM5Ryx5RUFBeUU7UUFDekUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQW9CLEVBQUUsR0FBbUIsRUFBRSxVQUFVLEVBQUUsTUFBMEIsRUFBRSxFQUFFO1lBQ3JHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRWhELElBQUEscUJBQWMsRUFBQyxHQUFHLENBQUMsQ0FBQztZQUVw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QUV4QyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxLQUFLLFFBQVE7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWTtZQUM5QixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVNLGNBQWM7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQTFTRCwyQ0EwU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9hZEFzc2V0cyBmcm9tICcuLi8uLi9sb2FkLWFzc2V0cyc7XG5pbXBvcnQge1xuICAgIHJlc3BvbmQ0MDQsXG4gICAgcmVzcG9uZDUwMCxcbiAgICByZXNwb25kV2l0aEpTT04sXG4gICAgcmVkaXJlY3QsXG4gICAgcHJldmVudENhY2hpbmcsXG59IGZyb20gJy4uLy4uL3V0aWxzL2h0dHAnO1xuXG5pbXBvcnQgUmVtb3Rlc1F1ZXVlIGZyb20gJy4vcmVtb3Rlcy1xdWV1ZSc7XG5pbXBvcnQgeyBQcm94eSwgYWNjZXB0Q3Jvc3NPcmlnaW4gfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IFNFUlZJQ0VfUk9VVEVTIGZyb20gJy4vc2VydmljZS1yb3V0ZXMnO1xuaW1wb3J0IEVNUFRZX1BBR0VfTUFSS1VQIGZyb20gJy4uLy4uL3Byb3h5bGVzcy9lbXB0eS1wYWdlLW1hcmt1cCc7XG5pbXBvcnQgUFJPWFlMRVNTX0VSUk9SX1JPVVRFIGZyb20gJy4uLy4uL3Byb3h5bGVzcy9lcnJvci1yb3V0ZSc7XG5pbXBvcnQgeyBpbml0U2VsZWN0b3IgfSBmcm9tICcuLi8uLi90ZXN0LXJ1bi9jb21tYW5kcy92YWxpZGF0aW9ucy9pbml0aWFsaXplcnMnO1xuaW1wb3J0IFRlc3RSdW4gZnJvbSAnLi4vLi4vdGVzdC1ydW4nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkge1xuICAgIHByaXZhdGUgX2Nvbm5lY3Rpb25zOiBEaWN0aW9uYXJ5PEJyb3dzZXJDb25uZWN0aW9uPiA9IHt9O1xuICAgIHByaXZhdGUgX3JlbW90ZXNRdWV1ZTogUmVtb3Rlc1F1ZXVlO1xuICAgIHB1YmxpYyByZWFkb25seSBjb25uZWN0VXJsOiBzdHJpbmc7XG4gICAgcHVibGljIHJldHJ5VGVzdFBhZ2VzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJveHlsZXNzOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSBwcm94eTogUHJveHk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHByb3h5OiBQcm94eSwgb3B0aW9uczogeyByZXRyeVRlc3RQYWdlczogYm9vbGVhbjsgcHJveHlsZXNzOiBib29sZWFuIH0pIHtcbiAgICAgICAgdGhpcy5fcmVtb3Rlc1F1ZXVlICA9IG5ldyBSZW1vdGVzUXVldWUoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0VXJsICAgICA9IHByb3h5LnJlc29sdmVSZWxhdGl2ZVNlcnZpY2VVcmwoU0VSVklDRV9ST1VURVMuY29ubmVjdCk7XG4gICAgICAgIHRoaXMucmV0cnlUZXN0UGFnZXMgPSBvcHRpb25zLnJldHJ5VGVzdFBhZ2VzO1xuICAgICAgICB0aGlzLnByb3h5bGVzcyAgICAgID0gb3B0aW9ucy5wcm94eWxlc3M7XG4gICAgICAgIHRoaXMucHJveHkgICAgICAgICAgPSBwcm94eTtcblxuICAgICAgICB0aGlzLl9yZWdpc3RlclJvdXRlcyhwcm94eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzcGF0Y2ggKHVybDogc3RyaW5nLCBwcm94eTogUHJveHksIGhhbmRsZXI6IEZ1bmN0aW9uLCBtZXRob2QgPSAnR0VUJywgc2hvdWxkQWNjZXB0Q3Jvc3NPcmlnaW4/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgTmVlZCB0byBpbXByb3ZlIHR5cGluZ3Mgb2YgdGhlICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJyBtb2R1bGVcbiAgICAgICAgcHJveHlbbWV0aG9kXSh1cmwsIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgc2VydmVySW5mbywgcGFyYW1zOiBEaWN0aW9uYXJ5PHN0cmluZz4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzLl9jb25uZWN0aW9uc1twYXJhbXMuaWRdO1xuXG4gICAgICAgICAgICBwcmV2ZW50Q2FjaGluZyhyZXMpO1xuXG4gICAgICAgICAgICBpZiAoc2hvdWxkQWNjZXB0Q3Jvc3NPcmlnaW4pXG4gICAgICAgICAgICAgICAgYWNjZXB0Q3Jvc3NPcmlnaW4ocmVzKTtcblxuICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24pXG4gICAgICAgICAgICAgICAgaGFuZGxlcihyZXEsIHJlcywgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmVzcG9uZDQwNChyZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWdpc3RlclJvdXRlcyAocHJveHk6IFByb3h5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGlkbGVQYWdlU2NyaXB0LFxuICAgICAgICAgICAgaWRsZVBhZ2VTdHlsZSxcbiAgICAgICAgICAgIGlkbGVQYWdlTG9nbyxcbiAgICAgICAgICAgIHNlcnZpY2VXb3JrZXJTY3JpcHQsXG4gICAgICAgIH0gPSBsb2FkQXNzZXRzKCk7XG5cbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuY29ubmVjdH0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uQ29ubmVjdGlvbik7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmhlYXJ0YmVhdH0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSGVhcnRiZWF0LCAnR0VUJywgdGhpcy5wcm94eWxlc3MpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5pZGxlfS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25JZGxlKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuaWRsZUZvcmNlZH0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uSWRsZUZvcmNlZCk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLnN0YXR1c30ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdCk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLnN0YXR1c0RvbmV9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vblN0YXR1c1JlcXVlc3RPblRlc3REb25lLCAnR0VUJywgdGhpcy5wcm94eWxlc3MpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5pbml0U2NyaXB0fS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25Jbml0U2NyaXB0UmVxdWVzdCk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmluaXRTY3JpcHR9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkluaXRTY3JpcHRSZXNwb25zZSwgJ1BPU1QnKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuYWN0aXZlV2luZG93SWR9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkdldEFjdGl2ZVdpbmRvd0lkUmVxdWVzdCwgJ0dFVCcsIHRoaXMucHJveHlsZXNzKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMuYWN0aXZlV2luZG93SWR9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vblNldEFjdGl2ZVdpbmRvd0lkUmVxdWVzdCwgJ1BPU1QnLCB0aGlzLnByb3h5bGVzcyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLmNsb3NlV2luZG93fS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25DbG9zZVdpbmRvd1JlcXVlc3QsICdQT1NUJyk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoKGAke1NFUlZJQ0VfUk9VVEVTLm9wZW5GaWxlUHJvdG9jb2x9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbk9wZW5GaWxlUHJvdG9jb2xSZXF1ZXN0LCAnUE9TVCcpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5kaXNwYXRjaFByb3h5bGVzc0V2ZW50fS97aWR9YCwgcHJveHksIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fb25EaXNwYXRjaFByb3h5bGVzc0V2ZW50LCAnUE9TVCcsIHRoaXMucHJveHlsZXNzKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2goYCR7U0VSVklDRV9ST1VURVMucGFyc2VTZWxlY3Rvcn0ve2lkfWAsIHByb3h5LCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX3BhcnNlU2VsZWN0b3IsICdQT1NUJywgdGhpcy5wcm94eWxlc3MpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaChgJHtTRVJWSUNFX1JPVVRFUy5kaXNwYXRjaFByb3h5bGVzc0V2ZW50U2VxdWVuY2V9L3tpZH1gLCBwcm94eSwgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9vbkRpc3BhdGNoUHJveHlsZXNzRXZlbnRTZXF1ZW5jZSwgJ1BPU1QnLCB0aGlzLnByb3h5bGVzcyk7XG5cbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLmNvbm5lY3QsIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSkgPT4gdGhpcy5fY29ubmVjdE5leHRSZW1vdGVCcm93c2VyKHJlcSwgcmVzKSk7XG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5jb25uZWN0V2l0aFRyYWlsaW5nU2xhc2gsIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSkgPT4gdGhpcy5fY29ubmVjdE5leHRSZW1vdGVCcm93c2VyKHJlcSwgcmVzKSk7XG5cbiAgICAgICAgcHJveHkuR0VUKFNFUlZJQ0VfUk9VVEVTLnNlcnZpY2VXb3JrZXIsIHsgY29udGVudDogc2VydmljZVdvcmtlclNjcmlwdCwgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLmluZGV4LCB7IGNvbnRlbnQ6IGlkbGVQYWdlU2NyaXB0LCBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcgfSk7XG4gICAgICAgIHByb3h5LkdFVChTRVJWSUNFX1JPVVRFUy5hc3NldHMuc3R5bGVzLCB7IGNvbnRlbnQ6IGlkbGVQYWdlU3R5bGUsIGNvbnRlbnRUeXBlOiAndGV4dC9jc3MnIH0pO1xuICAgICAgICBwcm94eS5HRVQoU0VSVklDRV9ST1VURVMuYXNzZXRzLmxvZ28sIHsgY29udGVudDogaWRsZVBhZ2VMb2dvLCBjb250ZW50VHlwZTogJ2ltYWdlL3N2Zyt4bWwnIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3h5bGVzcykge1xuICAgICAgICAgICAgcHJveHkuR0VUKFBST1hZTEVTU19FUlJPUl9ST1VURSwgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L2h0bWwnIH0pO1xuICAgICAgICAgICAgICAgIHJlcy5lbmQoRU1QVFlfUEFHRV9NQVJLVVApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIZWxwZXJzXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeSAocmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb25uZWN0aW9uLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBub3QgcmVhZHkgeWV0LicpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX2ZldGNoUmVxdWVzdERhdGEgKHJlcTogSW5jb21pbmdNZXNzYWdlLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuXG4gICAgICAgIHJlcS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlcS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soZGF0YS50b1N0cmluZygpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUm91dGUgaGFuZGxlcnNcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25Db25uZWN0aW9uIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaXNSZWFkeSgpKVxuICAgICAgICAgICAgcmVzcG9uZDUwMChyZXMsICdUaGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkLicpO1xuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdXNlckFnZW50ID0gcmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZXN0YWJsaXNoKHVzZXJBZ2VudCk7XG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIGNvbm5lY3Rpb24uaWRsZVVybCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25IZWFydGJlYXQgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gY29ubmVjdGlvbi5oZWFydGJlYXQoKTtcblxuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywgc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vbklkbGUgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSlcbiAgICAgICAgICAgIHJlcy5lbmQoY29ubmVjdGlvbi5yZW5kZXJJZGxlUGFnZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25JZGxlRm9yY2VkIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKHRydWUpO1xuXG4gICAgICAgICAgICByZWRpcmVjdChyZXMsIHN0YXR1cy51cmwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgX29uU3RhdHVzUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBfb25TdGF0dXNSZXF1ZXN0T25UZXN0RG9uZSAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX29uU3RhdHVzUmVxdWVzdENvcmUocmVxLCByZXMsIGNvbm5lY3Rpb24sIHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIF9vblN0YXR1c1JlcXVlc3RDb3JlIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24sIGlzVGVzdERvbmU6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IGNvbm5lY3Rpb24uZ2V0U3RhdHVzKGlzVGVzdERvbmUpO1xuXG4gICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX29uSW5pdFNjcmlwdFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gY29ubmVjdGlvbi5nZXRJbml0U2NyaXB0KCk7XG5cbiAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMsIHNjcmlwdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25Jbml0U2NyaXB0UmVzcG9uc2UgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5oYW5kbGVJbml0U2NyaXB0UmVzdWx0KGRhdGEpO1xuXG4gICAgICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25HZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcywge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25TZXRBY3RpdmVXaW5kb3dJZFJlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9mZXRjaFJlcXVlc3REYXRhKHJlcSwgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkID0gcGFyc2VkRGF0YS53aW5kb3dJZDtcblxuICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25DbG9zZVdpbmRvd1JlcXVlc3QgKHJlcTogSW5jb21pbmdNZXNzYWdlLCByZXM6IFNlcnZlclJlc3BvbnNlLCBjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5Ll9lbnN1cmVDb25uZWN0aW9uUmVhZHkocmVzLCBjb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi5wcm92aWRlci5jbG9zZUJyb3dzZXJDaGlsZFdpbmRvdyhjb25uZWN0aW9uLmlkKVxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25PcGVuRmlsZVByb3RvY29sUmVxdWVzdCAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeShyZXMsIGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2ZldGNoUmVxdWVzdERhdGEocmVxLCBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub3BlbkZpbGVQcm90b2NvbChwYXJzZWREYXRhLnVybClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZFdpdGhKU09OKHJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfb25EaXNwYXRjaFByb3h5bGVzc0V2ZW50IChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSwgY29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZW5zdXJlQ29ubmVjdGlvblJlYWR5KHJlcywgY29ubmVjdGlvbikpIHtcbiAgICAgICAgICAgIEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZmV0Y2hSZXF1ZXN0RGF0YShyZXEsIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgdHlwZSwgb3B0aW9ucyB9ID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzcGF0Y2hQcm94eWxlc3NFdmVudCh0eXBlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kV2l0aEpTT04ocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIF9vbkRpc3BhdGNoUHJveHlsZXNzRXZlbnRTZXF1ZW5jZSAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeShyZXMsIGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2ZldGNoUmVxdWVzdERhdGEocmVxLCBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudFNlcXVlbmNlID0gSlNPTi5wYXJzZShkYXRhKTtcblxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzcGF0Y2hQcm94eWxlc3NFdmVudFNlcXVlbmNlKGV2ZW50U2VxdWVuY2UpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY29ubmVjdE5leHRSZW1vdGVCcm93c2VyIChyZXE6IEluY29taW5nTWVzc2FnZSwgcmVzOiBTZXJ2ZXJSZXNwb25zZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBwcmV2ZW50Q2FjaGluZyhyZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm5lY3Rpb24gPSBhd2FpdCB0aGlzLl9yZW1vdGVzUXVldWUuc2hpZnQoKTtcblxuICAgICAgICBpZiAocmVtb3RlQ29ubmVjdGlvbilcbiAgICAgICAgICAgIHJlZGlyZWN0KHJlcywgcmVtb3RlQ29ubmVjdGlvbi51cmwpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXNwb25kNTAwKHJlcywgJ1RoZXJlIGFyZSBubyBhdmFpbGFibGUgX2Nvbm5lY3Rpb25zIHRvIGVzdGFibGlzaC4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfZ2V0UGFyc2VkU2VsZWN0b3IgKHRlc3RSdW46IFRlc3RSdW4sIHJhd1NlbGVjdG9yOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgdGVzdFJ1bixcblxuICAgICAgICAgICAgc2tpcFZpc2liaWxpdHlDaGVjazogdHJ1ZSxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25Nb2RlOiAgICAgIHRydWUsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgdmFsdWUgICAgPSByYXdTZWxlY3Rvci50cmltKCkuc3RhcnRzV2l0aCgnU2VsZWN0b3IoJykgPyByYXdTZWxlY3RvciA6IGAnJHtyYXdTZWxlY3Rvcn0nYDtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB7IHR5cGU6ICdqcy1leHByJywgdmFsdWUgfTtcblxuICAgICAgICByZXR1cm4gaW5pdFNlbGVjdG9yKCdzZWxlY3RvcicsIHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfcGFyc2VTZWxlY3RvciAocmVxOiBJbmNvbWluZ01lc3NhZ2UsIHJlczogU2VydmVyUmVzcG9uc2UsIGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2Vuc3VyZUNvbm5lY3Rpb25SZWFkeShyZXMsIGNvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuX2ZldGNoUmVxdWVzdERhdGEocmVxLCBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0UnVuICAgICAgICA9IGNvbm5lY3Rpb24uZ2V0Q3VycmVudFRlc3RSdW4oKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3U2VsZWN0b3IgICAgPSBKU09OLnBhcnNlKGRhdGEpLnNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRTZWxlY3RvciA9IEJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5fZ2V0UGFyc2VkU2VsZWN0b3IodGVzdFJ1biwgcmF3U2VsZWN0b3IpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMsIHBhcnNlZFNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbmRXaXRoSlNPTihyZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgcHVibGljIHN0YXJ0U2VydmluZ0Nvbm5lY3Rpb24gKGNvbm5lY3Rpb246IEJyb3dzZXJDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Nvbm5lY3Rpb25zW2Nvbm5lY3Rpb24uaWRdID0gY29ubmVjdGlvbjtcblxuICAgICAgICBpZiAoY29ubmVjdGlvbi5icm93c2VySW5mby5wcm92aWRlck5hbWUgPT09ICdyZW1vdGUnKVxuICAgICAgICAgICAgdGhpcy5fcmVtb3Rlc1F1ZXVlLmFkZChjb25uZWN0aW9uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcFNlcnZpbmdDb25uZWN0aW9uIChjb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbik6IHZvaWQge1xuICAgICAgICBkZWxldGUgdGhpcy5fY29ubmVjdGlvbnNbY29ubmVjdGlvbi5pZF07XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uYnJvd3NlckluZm8ucHJvdmlkZXJOYW1lID09PSAncmVtb3RlJylcbiAgICAgICAgICAgIHRoaXMuX3JlbW90ZXNRdWV1ZS5yZW1vdmUoY29ubmVjdGlvbik7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNsb3NlICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiB0aGlzLl9jb25uZWN0aW9ucylcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3Rpb25zW2lkXS5jbG9zZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb25uZWN0aW9ucyAoKTogRGljdGlvbmFyeTxCcm93c2VyQ29ubmVjdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbnM7XG4gICAgfVxufVxuXG4iXX0=