@sapui5/sap.fe.test 1.97.0 → 1.100.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 (77) hide show
  1. package/package.json +6 -2
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +3 -2
  4. package/src/sap/fe/test/BaseArrangements.js +3 -2
  5. package/src/sap/fe/test/BaseAssertions.js +3 -2
  6. package/src/sap/fe/test/ConfirmDialog.js +3 -2
  7. package/src/sap/fe/test/FCLView.js +3 -2
  8. package/src/sap/fe/test/FeMocks.js +66 -0
  9. package/src/sap/fe/test/FeMocks.ts +77 -0
  10. package/src/sap/fe/test/Flexibility.js +3 -2
  11. package/src/sap/fe/test/FlexibleColumnLayout.js +3 -2
  12. package/src/sap/fe/test/JestTemplatingHelper.js +83 -25
  13. package/src/sap/fe/test/JestTemplatingHelper.ts +74 -26
  14. package/src/sap/fe/test/JourneyRunner.js +11 -5
  15. package/src/sap/fe/test/ListReport.js +11 -5
  16. package/src/sap/fe/test/LocationUtil.js +3 -2
  17. package/src/sap/fe/test/ObjectPage.js +28 -17
  18. package/src/sap/fe/test/Shell.js +3 -2
  19. package/src/sap/fe/test/Stubs.js +3 -2
  20. package/src/sap/fe/test/TemplatePage.js +3 -2
  21. package/src/sap/fe/test/TemplatingTestUtils.js +4 -3
  22. package/src/sap/fe/test/UI5MockHelper.js +249 -137
  23. package/src/sap/fe/test/UI5MockHelper.ts +143 -13
  24. package/src/sap/fe/test/Utils.js +3 -14
  25. package/src/sap/fe/test/api/APIHelper.js +3 -2
  26. package/src/sap/fe/test/api/BaseAPI.js +5 -9
  27. package/src/sap/fe/test/api/ChartActions.js +3 -2
  28. package/src/sap/fe/test/api/ChartAssertions.js +7 -6
  29. package/src/sap/fe/test/api/DialogAPI.js +17 -4
  30. package/src/sap/fe/test/api/DialogActions.js +3 -2
  31. package/src/sap/fe/test/api/DialogAssertions.js +3 -2
  32. package/src/sap/fe/test/api/DialogCreateActions.js +4 -3
  33. package/src/sap/fe/test/api/DialogCreateAssertions.js +4 -3
  34. package/src/sap/fe/test/api/DialogMessageActions.js +19 -3
  35. package/src/sap/fe/test/api/DialogMessageAssertions.js +4 -3
  36. package/src/sap/fe/test/api/DialogType.js +3 -2
  37. package/src/sap/fe/test/api/DialogValueHelpActions.js +4 -3
  38. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +4 -3
  39. package/src/sap/fe/test/api/EditState.js +3 -2
  40. package/src/sap/fe/test/api/FilterBarAPI.js +12 -3
  41. package/src/sap/fe/test/api/FilterBarActions.js +3 -2
  42. package/src/sap/fe/test/api/FilterBarAssertions.js +3 -2
  43. package/src/sap/fe/test/api/FooterAPI.js +3 -2
  44. package/src/sap/fe/test/api/FooterActionsBase.js +3 -2
  45. package/src/sap/fe/test/api/FooterActionsOP.js +3 -2
  46. package/src/sap/fe/test/api/FooterAssertionsBase.js +3 -2
  47. package/src/sap/fe/test/api/FooterAssertionsOP.js +3 -2
  48. package/src/sap/fe/test/api/FormAPI.js +3 -2
  49. package/src/sap/fe/test/api/FormActions.js +3 -2
  50. package/src/sap/fe/test/api/FormAssertions.js +3 -2
  51. package/src/sap/fe/test/api/HeaderAPI.js +3 -2
  52. package/src/sap/fe/test/api/HeaderActions.js +3 -2
  53. package/src/sap/fe/test/api/HeaderActionsLR.js +3 -2
  54. package/src/sap/fe/test/api/HeaderAssertions.js +3 -2
  55. package/src/sap/fe/test/api/HeaderAssertionsLR.js +3 -2
  56. package/src/sap/fe/test/api/HeaderLR.js +3 -2
  57. package/src/sap/fe/test/api/KPICardAPI.js +3 -2
  58. package/src/sap/fe/test/api/KPICardActions.js +43 -0
  59. package/src/sap/fe/test/api/KPICardAssertions.js +22 -17
  60. package/src/sap/fe/test/api/TableAPI.js +3 -2
  61. package/src/sap/fe/test/api/TableActions.js +3 -21
  62. package/src/sap/fe/test/api/TableAssertions.js +17 -6
  63. package/src/sap/fe/test/builder/DialogBuilder.js +3 -2
  64. package/src/sap/fe/test/builder/FEBuilder.js +3 -2
  65. package/src/sap/fe/test/builder/KPIBuilder.js +14 -4
  66. package/src/sap/fe/test/builder/MacroFieldBuilder.js +3 -2
  67. package/src/sap/fe/test/builder/MdcFieldBuilder.js +3 -2
  68. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +3 -2
  69. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +3 -2
  70. package/src/sap/fe/test/builder/MdcTableBuilder.js +29 -2
  71. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +3 -2
  72. package/src/sap/fe/test/builder/VMBuilder.js +3 -2
  73. package/src/sap/fe/test/internal/FEArrangements.js +3 -2
  74. package/src/sap/fe/test/internal/FEJourneyRunner.js +9 -5
  75. package/src/sap/fe/test/library.js +4 -3
  76. package/src/sap/fe/test/massEdit.js +3 -2
  77. package/ui5.yaml +0 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.97.0",
3
+ "version": "1.100.0",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "SAP SE (https://www.sap.com)",
@@ -9,6 +9,8 @@
9
9
  "build": "echo 'nothing to do'",
10
10
  "copy-dependency": "copyfiles -u 7 \"../../node_modules/@sap/ux-ui5-fe-mockserver-middleware/ui5-dist/test/**/*.js\" target/classes/META-INF/test-resources",
11
11
  "prepare-npm-sources": "babel target/npm-sources/src --out-dir target/npm-sources/src --extensions \".ts\" --config-file ../../.babelrc",
12
+ "prepare-ts-class-doc": "echo 'nothing to do'",
13
+ "prepare-ui5-build-sources": "copyfiles -u 7 \"../../node_modules/@sap/ux-ui5-fe-mockserver-middleware/ui5-dist/test/**/*.js\" target/ui5-build-tmp/test && mkdirp target/ui5-build-tmp/src && babel src --out-dir target/ui5-build-tmp/src --extensions \".ts\" --config-file ../../.babelrc",
12
14
  "test": "echo 'nothing to do'"
13
15
  },
14
16
  "keywords": [
@@ -19,7 +21,9 @@
19
21
  "@babel/cli": "^7.14.8",
20
22
  "@ui5/cli": "^2.14.0",
21
23
  "copyfiles": "2.2.0",
24
+ "mkdirp": "^1.0.4",
22
25
  "xpath": "0.0.27",
23
- "xml-formatter": "2.4.0"
26
+ "xml-formatter": "2.4.0",
27
+ "@sap-ux/jest-mock-ui5": "2.0.5"
24
28
  }
25
29
  }
@@ -6,7 +6,7 @@
6
6
  <copyright>SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.97.0</version>
9
+ <version>1.100.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/fe/test/Utils"], function(
6
7
  Opa5,
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  ["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/thirdparty/jquery", "sap/base/util/UriParameters", "./Utils", "./Stubs"],
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/fe/test/Utils"], function(
6
7
  Opa5,
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
6
7
  "use strict";
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  /**
6
7
  * Actions and assertions to be used with a page hosted in an FCL
@@ -0,0 +1,66 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/core/PageController", "@sap-ux/jest-mock-ui5/dist/generic", "sap/ui/mdc/FilterBar", "sap/fe/core/controllerextensions/InternalEditFlow"], function (PageController, generic, FilterBar, InternalEditFlow) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ var mock = generic.mock;
10
+
11
+ function mockListReportController() {
12
+ // manually add ListReportController.controller functions since I am unable to import the prototype
13
+ var listReport = {
14
+ _getFilterBarControl: jest.fn(),
15
+ _getControls: jest.fn(),
16
+ _isFilterBarHidden: jest.fn(),
17
+ _isMultiMode: jest.fn(),
18
+ _setCountsOutDated: jest.fn(),
19
+ _getCurrentControl: jest.fn(),
20
+ _getMultiModeControl: jest.fn(),
21
+ _hasMultiVisualizations: jest.fn(),
22
+ _shouldAutoTriggerSearch: jest.fn(),
23
+ _getTable: jest.fn(),
24
+ getExtensionAPI: jest.fn(),
25
+ _editFlow: mock(InternalEditFlow)
26
+ };
27
+ return Object.assign(mock(PageController), listReport);
28
+ }
29
+
30
+ _exports.mockListReportController = mockListReportController;
31
+
32
+ function mockObjectPageController() {
33
+ // manually add ListReportController.controller functions since I am unable to import the prototype
34
+ var objectPage = {
35
+ getStickyEditMode: jest.fn(),
36
+ getExtensionAPI: jest.fn(),
37
+ _editFlow: mock(InternalEditFlow)
38
+ };
39
+ return Object.assign(mock(PageController), objectPage);
40
+ }
41
+
42
+ _exports.mockObjectPageController = mockObjectPageController;
43
+
44
+ function mockContextForExtension(extension, controller, base) {
45
+ var view = controller.getView();
46
+
47
+ extension.getView = function () {
48
+ return view;
49
+ };
50
+
51
+ var mockedBase = mock(base || {});
52
+ return Object.assign(mockedBase, extension);
53
+ }
54
+
55
+ _exports.mockContextForExtension = mockContextForExtension;
56
+
57
+ function mockFilterBar() {
58
+ var filterBar = mock(FilterBar);
59
+ filterBar.mock.initialized = jest.fn();
60
+ return filterBar;
61
+ }
62
+
63
+ _exports.mockFilterBar = mockFilterBar;
64
+ return _exports;
65
+ }, false);
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZlTW9ja3MudHMiXSwibmFtZXMiOlsibW9ja0xpc3RSZXBvcnRDb250cm9sbGVyIiwibGlzdFJlcG9ydCIsIl9nZXRGaWx0ZXJCYXJDb250cm9sIiwiamVzdCIsImZuIiwiX2dldENvbnRyb2xzIiwiX2lzRmlsdGVyQmFySGlkZGVuIiwiX2lzTXVsdGlNb2RlIiwiX3NldENvdW50c091dERhdGVkIiwiX2dldEN1cnJlbnRDb250cm9sIiwiX2dldE11bHRpTW9kZUNvbnRyb2wiLCJfaGFzTXVsdGlWaXN1YWxpemF0aW9ucyIsIl9zaG91bGRBdXRvVHJpZ2dlclNlYXJjaCIsIl9nZXRUYWJsZSIsImdldEV4dGVuc2lvbkFQSSIsIl9lZGl0RmxvdyIsIm1vY2siLCJJbnRlcm5hbEVkaXRGbG93IiwiT2JqZWN0IiwiYXNzaWduIiwiUGFnZUNvbnRyb2xsZXIiLCJtb2NrT2JqZWN0UGFnZUNvbnRyb2xsZXIiLCJvYmplY3RQYWdlIiwiZ2V0U3RpY2t5RWRpdE1vZGUiLCJtb2NrQ29udGV4dEZvckV4dGVuc2lvbiIsImV4dGVuc2lvbiIsImNvbnRyb2xsZXIiLCJiYXNlIiwidmlldyIsImdldFZpZXciLCJtb2NrZWRCYXNlIiwibW9ja0ZpbHRlckJhciIsImZpbHRlckJhciIsIkZpbHRlckJhciIsImluaXRpYWxpemVkIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7O0FBMEJPLFdBQVNBLHdCQUFULEdBQTZIO0FBQ25JO0FBQ0EsUUFBTUMsVUFBMkUsR0FBRztBQUNuRkMsTUFBQUEsb0JBQW9CLEVBQUVDLElBQUksQ0FBQ0MsRUFBTCxFQUQ2RDtBQUVuRkMsTUFBQUEsWUFBWSxFQUFFRixJQUFJLENBQUNDLEVBQUwsRUFGcUU7QUFHbkZFLE1BQUFBLGtCQUFrQixFQUFFSCxJQUFJLENBQUNDLEVBQUwsRUFIK0Q7QUFJbkZHLE1BQUFBLFlBQVksRUFBRUosSUFBSSxDQUFDQyxFQUFMLEVBSnFFO0FBS25GSSxNQUFBQSxrQkFBa0IsRUFBRUwsSUFBSSxDQUFDQyxFQUFMLEVBTCtEO0FBTW5GSyxNQUFBQSxrQkFBa0IsRUFBRU4sSUFBSSxDQUFDQyxFQUFMLEVBTitEO0FBT25GTSxNQUFBQSxvQkFBb0IsRUFBRVAsSUFBSSxDQUFDQyxFQUFMLEVBUDZEO0FBUW5GTyxNQUFBQSx1QkFBdUIsRUFBRVIsSUFBSSxDQUFDQyxFQUFMLEVBUjBEO0FBU25GUSxNQUFBQSx3QkFBd0IsRUFBRVQsSUFBSSxDQUFDQyxFQUFMLEVBVHlEO0FBVW5GUyxNQUFBQSxTQUFTLEVBQUVWLElBQUksQ0FBQ0MsRUFBTCxFQVZ3RTtBQVduRlUsTUFBQUEsZUFBZSxFQUFFWCxJQUFJLENBQUNDLEVBQUwsRUFYa0U7QUFZbkZXLE1BQUFBLFNBQVMsRUFBRUMsSUFBSSxDQUFDQyxnQkFBRDtBQVpvRSxLQUFwRjtBQWNBLFdBQU9DLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjSCxJQUFJLENBQUNJLGNBQUQsQ0FBbEIsRUFBMkNuQixVQUEzQyxDQUFQO0FBR0E7Ozs7QUFFTSxXQUFTb0Isd0JBQVQsR0FBNkg7QUFDbkk7QUFDQSxRQUFNQyxVQUEyRSxHQUFHO0FBQ25GQyxNQUFBQSxpQkFBaUIsRUFBRXBCLElBQUksQ0FBQ0MsRUFBTCxFQURnRTtBQUVuRlUsTUFBQUEsZUFBZSxFQUFFWCxJQUFJLENBQUNDLEVBQUwsRUFGa0U7QUFHbkZXLE1BQUFBLFNBQVMsRUFBR0MsSUFBSSxDQUFDQyxnQkFBRDtBQUhtRSxLQUFwRjtBQUtBLFdBQU9DLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjSCxJQUFJLENBQUNJLGNBQUQsQ0FBbEIsRUFBMkNFLFVBQTNDLENBQVA7QUFHQTs7OztBQUVNLFdBQVNFLHVCQUFULENBQ05DLFNBRE0sRUFFTkMsVUFGTSxFQUdOQyxJQUhNLEVBSWtDO0FBQ3hDLFFBQU1DLElBQUksR0FBR0YsVUFBVSxDQUFDRyxPQUFYLEVBQWI7O0FBQ0NKLElBQUFBLFNBQUQsQ0FBbUJJLE9BQW5CLEdBQTZCO0FBQUEsYUFBTUQsSUFBTjtBQUFBLEtBQTdCOztBQUNBLFFBQU1FLFVBQVUsR0FBR2QsSUFBSSxDQUFDVyxJQUFJLElBQUksRUFBVCxDQUF2QjtBQUNBLFdBQU9ULE1BQU0sQ0FBQ0MsTUFBUCxDQUFjVyxVQUFkLEVBQTBCTCxTQUExQixDQUFQO0FBQ0E7Ozs7QUFFTSxXQUFTTSxhQUFULEdBQXNHO0FBQzVHLFFBQU1DLFNBQVMsR0FBR2hCLElBQUksQ0FBQ2lCLFNBQUQsQ0FBdEI7QUFDQUQsSUFBQUEsU0FBUyxDQUFDaEIsSUFBVixDQUFla0IsV0FBZixHQUE2Qi9CLElBQUksQ0FBQ0MsRUFBTCxFQUE3QjtBQUNBLFdBQU80QixTQUFQO0FBQ0EiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYWdlQ29udHJvbGxlciBmcm9tIFwic2FwL2ZlL2NvcmUvUGFnZUNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IG1vY2ssIE1vY2tlZEluc3RhbmNlLCBVSTVJbnN0YW5jZVR5cGUsIFdpdGhNb2NrIH0gZnJvbSBcIkBzYXAtdXgvamVzdC1tb2NrLXVpNS9kaXN0L2dlbmVyaWNcIjtcbmltcG9ydCBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IEZpbHRlckJhciBmcm9tIFwic2FwL3VpL21kYy9GaWx0ZXJCYXJcIjtcbmltcG9ydCBJbnRlcm5hbEVkaXRGbG93IGZyb20gXCJzYXAvZmUvY29yZS9jb250cm9sbGVyZXh0ZW5zaW9ucy9JbnRlcm5hbEVkaXRGbG93XCI7XG5cbmludGVyZmFjZSBDb21tb25Db250cm9sbGVyVHlwZSB7XG5cdGdldEV4dGVuc2lvbkFQSTogYW55O1xuXHRfZWRpdEZsb3c6IFdpdGhNb2NrPEludGVybmFsRWRpdEZsb3c+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RSZXBvcnRDb250cm9sbGVyVHlwZSB7XG5cdF9nZXRGaWx0ZXJCYXJDb250cm9sOiBhbnk7XG5cdF9nZXRDb250cm9sczogYW55O1xuXHRfaXNGaWx0ZXJCYXJIaWRkZW46IGFueTtcblx0X2lzTXVsdGlNb2RlOiBhbnk7XG5cdF9zZXRDb3VudHNPdXREYXRlZDogYW55O1xuXHRfZ2V0Q3VycmVudENvbnRyb2w6IGFueTtcblx0X2dldE11bHRpTW9kZUNvbnRyb2w6IGFueTtcblx0X2hhc011bHRpVmlzdWFsaXphdGlvbnM6IGFueTtcblx0X3Nob3VsZEF1dG9UcmlnZ2VyU2VhcmNoOiBhbnk7XG5cdF9nZXRUYWJsZTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdFBhZ2VDb250cm9sbGVyVHlwZSB7XG5cdGdldFN0aWNreUVkaXRNb2RlOiBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTGlzdFJlcG9ydENvbnRyb2xsZXIoKTogV2l0aE1vY2s8Q29udHJvbGxlciAmIFBhZ2VDb250cm9sbGVyICYgTGlzdFJlcG9ydENvbnRyb2xsZXJUeXBlICYgQ29tbW9uQ29udHJvbGxlclR5cGU+IHtcblx0Ly8gbWFudWFsbHkgYWRkIExpc3RSZXBvcnRDb250cm9sbGVyLmNvbnRyb2xsZXIgZnVuY3Rpb25zIHNpbmNlIEkgYW0gdW5hYmxlIHRvIGltcG9ydCB0aGUgcHJvdG90eXBlXG5cdGNvbnN0IGxpc3RSZXBvcnQ6IE1vY2tlZEluc3RhbmNlPExpc3RSZXBvcnRDb250cm9sbGVyVHlwZSAmIENvbW1vbkNvbnRyb2xsZXJUeXBlPiA9IHtcblx0XHRfZ2V0RmlsdGVyQmFyQ29udHJvbDogamVzdC5mbigpLFxuXHRcdF9nZXRDb250cm9sczogamVzdC5mbigpLFxuXHRcdF9pc0ZpbHRlckJhckhpZGRlbjogamVzdC5mbigpLFxuXHRcdF9pc011bHRpTW9kZTogamVzdC5mbigpLFxuXHRcdF9zZXRDb3VudHNPdXREYXRlZDogamVzdC5mbigpLFxuXHRcdF9nZXRDdXJyZW50Q29udHJvbDogamVzdC5mbigpLFxuXHRcdF9nZXRNdWx0aU1vZGVDb250cm9sOiBqZXN0LmZuKCksXG5cdFx0X2hhc011bHRpVmlzdWFsaXphdGlvbnM6IGplc3QuZm4oKSxcblx0XHRfc2hvdWxkQXV0b1RyaWdnZXJTZWFyY2g6IGplc3QuZm4oKSxcblx0XHRfZ2V0VGFibGU6IGplc3QuZm4oKSxcblx0XHRnZXRFeHRlbnNpb25BUEk6IGplc3QuZm4oKSxcblx0XHRfZWRpdEZsb3c6IG1vY2soSW50ZXJuYWxFZGl0RmxvdykgYXMgYW55XG5cdH07XG5cdHJldHVybiBPYmplY3QuYXNzaWduKG1vY2soUGFnZUNvbnRyb2xsZXIpIGFzIGFueSwgbGlzdFJlcG9ydCkgYXMgV2l0aE1vY2s8XG5cdFx0Q29udHJvbGxlciAmIFBhZ2VDb250cm9sbGVyICYgTGlzdFJlcG9ydENvbnRyb2xsZXJUeXBlICYgQ29tbW9uQ29udHJvbGxlclR5cGVcblx0Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tPYmplY3RQYWdlQ29udHJvbGxlcigpOiBXaXRoTW9jazxDb250cm9sbGVyICYgUGFnZUNvbnRyb2xsZXIgJiBPYmplY3RQYWdlQ29udHJvbGxlclR5cGUgJiBDb21tb25Db250cm9sbGVyVHlwZT4ge1xuXHQvLyBtYW51YWxseSBhZGQgTGlzdFJlcG9ydENvbnRyb2xsZXIuY29udHJvbGxlciBmdW5jdGlvbnMgc2luY2UgSSBhbSB1bmFibGUgdG8gaW1wb3J0IHRoZSBwcm90b3R5cGVcblx0Y29uc3Qgb2JqZWN0UGFnZTogTW9ja2VkSW5zdGFuY2U8T2JqZWN0UGFnZUNvbnRyb2xsZXJUeXBlICYgQ29tbW9uQ29udHJvbGxlclR5cGU+ID0ge1xuXHRcdGdldFN0aWNreUVkaXRNb2RlOiBqZXN0LmZuKCksXG5cdFx0Z2V0RXh0ZW5zaW9uQVBJOiBqZXN0LmZuKCksXG5cdFx0X2VkaXRGbG93OiAobW9jayhJbnRlcm5hbEVkaXRGbG93KSBhcyBXaXRoTW9jazxJbnRlcm5hbEVkaXRGbG93PikgYXMgYW55XG5cdH07XG5cdHJldHVybiBPYmplY3QuYXNzaWduKG1vY2soUGFnZUNvbnRyb2xsZXIpIGFzIGFueSwgb2JqZWN0UGFnZSkgYXMgV2l0aE1vY2s8XG5cdFx0Q29udHJvbGxlciAmIFBhZ2VDb250cm9sbGVyICYgT2JqZWN0UGFnZUNvbnRyb2xsZXJUeXBlICYgQ29tbW9uQ29udHJvbGxlclR5cGVcblx0Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tDb250ZXh0Rm9yRXh0ZW5zaW9uPEVYVCBleHRlbmRzIG9iamVjdCwgQkFTRSBleHRlbmRzIG9iamVjdD4oXG5cdGV4dGVuc2lvbjogRVhULFxuXHRjb250cm9sbGVyOiBXaXRoTW9jazxDb250cm9sbGVyPixcblx0YmFzZT86IEJBU0Vcbik6IFdpdGhNb2NrPEVYVCAmIFVJNUluc3RhbmNlVHlwZTxCQVNFPj4ge1xuXHRjb25zdCB2aWV3ID0gY29udHJvbGxlci5nZXRWaWV3KCk7XG5cdChleHRlbnNpb24gYXMgYW55KS5nZXRWaWV3ID0gKCkgPT4gdmlldztcblx0Y29uc3QgbW9ja2VkQmFzZSA9IG1vY2soYmFzZSB8fCB7fSk7XG5cdHJldHVybiBPYmplY3QuYXNzaWduKG1vY2tlZEJhc2UsIGV4dGVuc2lvbikgYXMgV2l0aE1vY2s8RVhUICYgVUk1SW5zdGFuY2VUeXBlPEJBU0U+Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1vY2tGaWx0ZXJCYXIoKTogV2l0aE1vY2s8RmlsdGVyQmFyICYgeyBpbml0aWFsaXplZDogRnVuY3Rpb247IF9iU2VhcmNoVHJpZ2dlcmVkOiBCb29sZWFuIH0+IHtcblx0Y29uc3QgZmlsdGVyQmFyID0gbW9jayhGaWx0ZXJCYXIpIGFzIFdpdGhNb2NrPEZpbHRlckJhciAmIHsgaW5pdGlhbGl6ZWQ6IEZ1bmN0aW9uOyBfYlNlYXJjaFRyaWdnZXJlZDogQm9vbGVhbiB9Pjtcblx0ZmlsdGVyQmFyLm1vY2suaW5pdGlhbGl6ZWQgPSBqZXN0LmZuKCk7XG5cdHJldHVybiBmaWx0ZXJCYXI7XG59XG4iXX0=
@@ -0,0 +1,77 @@
1
+ import PageController from "sap/fe/core/PageController";
2
+ import { mock, MockedInstance, UI5InstanceType, WithMock } from "@sap-ux/jest-mock-ui5/dist/generic";
3
+ import Controller from "sap/ui/core/mvc/Controller";
4
+ import FilterBar from "sap/ui/mdc/FilterBar";
5
+ import InternalEditFlow from "sap/fe/core/controllerextensions/InternalEditFlow";
6
+
7
+ interface CommonControllerType {
8
+ getExtensionAPI: any;
9
+ _editFlow: WithMock<InternalEditFlow>;
10
+ }
11
+
12
+ export interface ListReportControllerType {
13
+ _getFilterBarControl: any;
14
+ _getControls: any;
15
+ _isFilterBarHidden: any;
16
+ _isMultiMode: any;
17
+ _setCountsOutDated: any;
18
+ _getCurrentControl: any;
19
+ _getMultiModeControl: any;
20
+ _hasMultiVisualizations: any;
21
+ _shouldAutoTriggerSearch: any;
22
+ _getTable: any;
23
+ }
24
+
25
+ export interface ObjectPageControllerType {
26
+ getStickyEditMode: any;
27
+ }
28
+
29
+ export function mockListReportController(): WithMock<Controller & PageController & ListReportControllerType & CommonControllerType> {
30
+ // manually add ListReportController.controller functions since I am unable to import the prototype
31
+ const listReport: MockedInstance<ListReportControllerType & CommonControllerType> = {
32
+ _getFilterBarControl: jest.fn(),
33
+ _getControls: jest.fn(),
34
+ _isFilterBarHidden: jest.fn(),
35
+ _isMultiMode: jest.fn(),
36
+ _setCountsOutDated: jest.fn(),
37
+ _getCurrentControl: jest.fn(),
38
+ _getMultiModeControl: jest.fn(),
39
+ _hasMultiVisualizations: jest.fn(),
40
+ _shouldAutoTriggerSearch: jest.fn(),
41
+ _getTable: jest.fn(),
42
+ getExtensionAPI: jest.fn(),
43
+ _editFlow: mock(InternalEditFlow) as any
44
+ };
45
+ return Object.assign(mock(PageController) as any, listReport) as WithMock<
46
+ Controller & PageController & ListReportControllerType & CommonControllerType
47
+ >;
48
+ }
49
+
50
+ export function mockObjectPageController(): WithMock<Controller & PageController & ObjectPageControllerType & CommonControllerType> {
51
+ // manually add ListReportController.controller functions since I am unable to import the prototype
52
+ const objectPage: MockedInstance<ObjectPageControllerType & CommonControllerType> = {
53
+ getStickyEditMode: jest.fn(),
54
+ getExtensionAPI: jest.fn(),
55
+ _editFlow: (mock(InternalEditFlow) as WithMock<InternalEditFlow>) as any
56
+ };
57
+ return Object.assign(mock(PageController) as any, objectPage) as WithMock<
58
+ Controller & PageController & ObjectPageControllerType & CommonControllerType
59
+ >;
60
+ }
61
+
62
+ export function mockContextForExtension<EXT extends object, BASE extends object>(
63
+ extension: EXT,
64
+ controller: WithMock<Controller>,
65
+ base?: BASE
66
+ ): WithMock<EXT & UI5InstanceType<BASE>> {
67
+ const view = controller.getView();
68
+ (extension as any).getView = () => view;
69
+ const mockedBase = mock(base || {});
70
+ return Object.assign(mockedBase, extension) as WithMock<EXT & UI5InstanceType<BASE>>;
71
+ }
72
+
73
+ export function mockFilterBar(): WithMock<FilterBar & { initialized: Function; _bSearchTriggered: Boolean }> {
74
+ const filterBar = mock(FilterBar) as WithMock<FilterBar & { initialized: Function; _bSearchTriggered: Boolean }>;
75
+ filterBar.mock.initialized = jest.fn();
76
+ return filterBar;
77
+ }
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnitUtils"], function(Opa5, OpaBuilder, QUnitUtils) {
6
7
  "use strict";
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/base/util/merge", "./TemplatePage", "sap/ui/test/OpaBuilder", "sap/m/library"], function(
6
7
  mergeObjects,
@@ -12,16 +12,24 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
12
12
 
13
13
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
14
14
 
15
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
16
+
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+
15
19
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
20
 
17
21
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
22
 
23
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
24
+
25
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
26
+
19
27
  /**
20
28
  * Process the requested XML fragment with the provided data.
21
29
  *
22
30
  * @param {string} name Fully qualified name of the fragment to be tested.
23
31
  * @param {object} testData Test data consisting
24
- * @returns Tempalted fragment as string
32
+ * @returns Templated fragment as string
25
33
  */
26
34
  var processFragment = function (name, testData) {
27
35
  try {
@@ -34,11 +42,11 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
34
42
  bindingContexts: {}
35
43
  };
36
44
 
37
- for (var _model in testData) {
45
+ for (var _model2 in testData) {
38
46
  var jsonModel = new JSONModel();
39
- jsonModel.setData(testData[_model]);
40
- settings.models[_model] = jsonModel;
41
- settings.bindingContexts[_model] = settings.models[_model].createBindingContext("/");
47
+ jsonModel.setData(testData[_model2]);
48
+ settings.models[_model2] = jsonModel;
49
+ settings.bindingContexts[_model2] = settings.models[_model2].createBindingContext("/");
42
50
  } // execute the pre-processor
43
51
 
44
52
 
@@ -62,9 +70,11 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
62
70
  } finally {
63
71
  _iterator.f();
64
72
  }
65
- }
73
+ } // Keep the fragment result as child of root node when fragment generates multiple root controls
74
+
66
75
 
67
- return formatXml(resultDoc.innerHTML, {
76
+ var xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
77
+ return formatXml(xmlResult, {
68
78
  filter: function (node) {
69
79
  return node.type !== "Comment";
70
80
  }
@@ -78,9 +88,7 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
78
88
  _exports.processFragment = processFragment;
79
89
 
80
90
  // eslint-disable-next-line @typescript-eslint/no-var-requires
81
- var formatXml = require("xml-formatter"); // eslint-disable-next-line @typescript-eslint/ban-ts-comment
82
- // @ts-ignore
83
-
91
+ var formatXml = require("xml-formatter");
84
92
 
85
93
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
86
94
  jest.setTimeout(40000);
@@ -94,8 +102,11 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
94
102
  "core": "sap.ui.core",
95
103
  "m": "sap.m",
96
104
  "f": "sap.ui.layout.form",
105
+ "internalMacro": "sap.fe.macros.internal",
97
106
  "mdc": "sap.ui.mdc",
107
+ "mdcat": "sap.ui.mdc.actiontoolbar",
98
108
  "mdcField": "sap.ui.mdc.field",
109
+ "mdcTable": "sap.ui.mdc.table",
99
110
  "u": "sap.ui.unified",
100
111
  "macroMicroChart": "sap.fe.macros.microchart",
101
112
  "microChart": "sap.suite.ui.microchart"
@@ -173,12 +184,7 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
173
184
 
174
185
  var compileCDS = function (sCDSUrl) {
175
186
  var cdsString = fs.readFileSync(sCDSUrl, "utf-8");
176
- var csn = compileSources({
177
- "string.cds": cdsString
178
- }, {});
179
- var edmxContent = to.edmx(csn, {
180
- service: "sap.fe.test.JestService"
181
- });
187
+ var edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService");
182
188
  var dir = path.resolve(sCDSUrl, "..", "gen");
183
189
  var edmxUrl = path.resolve(dir, path.basename(sCDSUrl).replace(".cds", ".xml"));
184
190
 
@@ -189,9 +195,38 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
189
195
  fs.writeFileSync(edmxUrl, edmxContent);
190
196
  return edmxUrl;
191
197
  };
198
+ /**
199
+ * Compile CDS to EDMX.
200
+ *
201
+ * @param cds The CDS model. It must define at least one service.
202
+ * @param service The fully-qualified name of the service to compile. Defaults to "sap.fe.test.JestService".
203
+ * @returns The compiled service model as EDMX.
204
+ */
205
+
192
206
 
193
207
  _exports.compileCDS = compileCDS;
194
208
 
209
+ function cds2edmx(cds) {
210
+ var service = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "sap.fe.test.JestService";
211
+ var csn = compileSources({
212
+ "string.cds": cds
213
+ }, {});
214
+ var edmx = to.edmx(csn, {
215
+ service: service,
216
+ odataForeignKeys: true,
217
+ odataFormat: "structured",
218
+ odataContainment: false
219
+ });
220
+
221
+ if (!edmx) {
222
+ throw new Error("Compilation failed. Hint: Make sure that the CDS model defines service ".concat(service, "."));
223
+ }
224
+
225
+ return edmx;
226
+ }
227
+
228
+ _exports.cds2edmx = cds2edmx;
229
+
195
230
  var getFakeSideEffectsService = function (oMetaModel) {
196
231
  try {
197
232
  var oServiceContext = {
@@ -252,7 +287,7 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
252
287
  var entitySet = convertedTypes.entitySets.find(function (es) {
253
288
  return es.name === manifestSettings.entitySet;
254
289
  });
255
- var dataModelPath = getDataModelObjectPathForProperty(entitySet, entitySet);
290
+ var dataModelPath = getDataModelObjectPathForProperty(entitySet, convertedTypes, entitySet);
256
291
  return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
257
292
  };
258
293
 
@@ -284,13 +319,14 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
284
319
 
285
320
  _exports.getMetaModel = getMetaModel;
286
321
 
287
- var getDataModelObjectPathForProperty = function (entitySet, property) {
322
+ var getDataModelObjectPathForProperty = function (entitySet, convertedTypes, property) {
288
323
  var targetPath = {
289
324
  startingEntitySet: entitySet,
290
325
  navigationProperties: [],
291
326
  targetObject: property,
292
327
  targetEntitySet: entitySet,
293
- targetEntityType: entitySet.entityType
328
+ targetEntityType: entitySet.entityType,
329
+ convertedTypes: convertedTypes
294
330
  };
295
331
  targetPath.contextLocation = targetPath;
296
332
  return targetPath;
@@ -310,15 +346,37 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
310
346
 
311
347
  _exports.evaluateBinding = evaluateBinding;
312
348
 
313
- var evaluateBindingWithModel = function (bindingString, modelContent) {
349
+ /**
350
+ * Evaluate a binding against a model.
351
+ *
352
+ * @param bindingString The binding string.
353
+ * @param modelContent Content of the default model to use for evaluation.
354
+ * @param namedModelsContent Contents of additional, named models to use.
355
+ * @returns The evaluated binding.
356
+ */
357
+ function evaluateBindingWithModel(bindingString, modelContent, namedModelsContent) {
314
358
  var bindingElement = BindingParser.complexParser(bindingString);
315
- var jsonModel = new JSONModel(modelContent);
316
359
  var text = new InvisibleText();
317
360
  text.bindProperty("text", bindingElement);
318
- text.setModel(jsonModel);
319
- text.setBindingContext(jsonModel.createBindingContext("/"));
361
+ var defaultModel = new JSONModel(modelContent);
362
+ text.setModel(defaultModel);
363
+ text.setBindingContext(defaultModel.createBindingContext("/"));
364
+
365
+ if (namedModelsContent) {
366
+ for (var _i = 0, _Object$entries = Object.entries(namedModelsContent); _i < _Object$entries.length; _i++) {
367
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
368
+ _name = _Object$entries$_i[0],
369
+ content = _Object$entries$_i[1];
370
+
371
+ var _model = new JSONModel(content);
372
+
373
+ text.setModel(_model, _name);
374
+ text.setBindingContext(_model.createBindingContext("/"), _name);
375
+ }
376
+ }
377
+
320
378
  return text.getText();
321
- };
379
+ }
322
380
 
323
381
  _exports.evaluateBindingWithModel = evaluateBindingWithModel;
324
382
 
@@ -383,4 +441,4 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
383
441
  _exports.getTemplatedXML = getTemplatedXML;
384
442
  return _exports;
385
443
  }, false);
386
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsImZvcm1hdFhtbCIsImZpbHRlciIsIm5vZGUiLCJ0eXBlIiwicmVxdWlyZSIsIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsIlBoYW50b21VdGlsIiwicmVnaXN0ZXIiLCJ1bnJlZ2lzdGVyTWFjcm8iLCJwbHVnSW4iLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsInNlbGVjdG9yIiwieG1sZG9tIiwiZXhwZWN0IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJ0b05vdEhhdmVDb250cm9sIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInhtbFN0cmluZyIsInNlcmlhbGl6ZVRvU3RyaW5nIiwicmVwbGFjZSIsImZvcm1hdCIsImNvbXBpbGVDRFMiLCJzQ0RTVXJsIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJjc24iLCJjb21waWxlU291cmNlcyIsImVkbXhDb250ZW50IiwidG8iLCJlZG14Iiwic2VydmljZSIsImRpciIsInBhdGgiLCJyZXNvbHZlIiwiZWRteFVybCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsIm9TZXJ2aWNlQ29udGV4dCIsInNjb3BlT2JqZWN0Iiwic2NvcGVUeXBlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJzTWV0YWRhdGFVcmwiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJ1bmRlZmluZWQiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwieG1sRG9jIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1ldGFNb2RlbCIsInNLZXkiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImdldFRlbXBsYXRlZFhNTCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBOFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ3NCQSxlLGFBQWdCQyxJLEVBQWNDLFE7UUFBd0Q7QUFDM0csVUFBTUMsUUFBUSxpREFBeUNGLElBQXpDLHlEQUFkO0FBQ0EsVUFBTUcsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsU0FBWCxFQUFmO0FBQ0EsVUFBTUMsUUFBUSxHQUFHSCxNQUFNLENB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QUFDbkdGLFVBQUFBLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkJvSyxJQUE3QixJQUFxQ0csTUFBckM7QUFDQSxTQU5ELEVBN0JDLENBcUNEOztBQUNBLFlBQUlMLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkIsTUFBN0IsQ0FBSixFQUEwQztBQUN6Q2tLLFVBQUFBLHFCQUFxQixDQUFDakssZUFBdEIsQ0FBc0MsTUFBdEMsSUFBZ0RpSyxxQkFBcUIsQ0FBQ2xLLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDTSxvQkFBckMsQ0FBMEQsR0FBMUQsQ0FBaEQ7QUFDQTs7QUFFRCxlQUFPQyxlQUFlLENBQUNDLE9BQWhCLENBQXdCZ0osTUFBTSxDQUFDL0ksaUJBQS9CLEVBQW1EO0FBQUVsQixVQUFBQSxJQUFJLEVBQUU7QUFBUixTQUFuRCxFQUE4RTJLLHFCQUE5RSxDQUFQO0FBMUNDO0FBMkNELEtBaEQrQjtBQUFBO0FBQUE7QUFBQSxHQUF6Qjs7OztBQWtEQSxNQUFNTSxlQUFlLGFBQzNCcEIsUUFEMkIsRUFFM0JqQyxZQUYyQixFQUczQmtDLGdCQUgyQixFQUkzQkMsT0FKMkI7QUFBQSxRQUsxQjtBQUFBLDZCQUMwQkgsbUJBQW1CLENBQUNDLFFBQUQsRUFBV2pDLFlBQVgsRUFBeUJrQyxnQkFBekIsRUFBMkNDLE9BQTNDLENBRDdDLE9BRU12RyxZQUZOO0FBR0QsS0FSMkI7QUFBQTtBQUFBO0FBQUEsR0FBckIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBoYW50b21VdGlsIH0gZnJvbSBcInNhcC9mZS9tYWNyb3NcIjtcbmltcG9ydCB7IF9NZXRhZGF0YVJlcXVlc3RvciB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IFhNTFByZXByb2Nlc3NvciB9IGZyb20gXCJzYXAvdWkvY29yZS91dGlsXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgY29tcGlsZVNvdXJjZXMsIHRvIH0gZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IEJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2VcIjtcbmltcG9ydCB7IEFueUFubm90YXRpb24sIENvbnZlcnRlck91dHB1dCwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgSlNPTk1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9qc29uXCI7XG5pbXBvcnQgeyBJbnZpc2libGVUZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJzYXAvYmFzZS91dGlsXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNGYWN0b3J5IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0XCJtYWNyb3NcIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9cIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9kYXRhXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcImxvZ1wiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJ1bml0dGVzdFwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L3ByZXByb2Nlc3NvcmV4dGVuc2lvbi9zYXAuZmUudW5pdHRlc3RpbmcvMVwiLFxuXHRcImNvbnRyb2xcIjogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRcImNvcmVcIjogXCJzYXAudWkuY29yZVwiLFxuXHRcIm1cIjogXCJzYXAubVwiLFxuXHRcImZcIjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0XCJtZGNcIjogXCJzYXAudWkubWRjXCIsXG5cdFwibWRjRmllbGRcIjogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFwidVwiOiBcInNhcC51aS51bmlmaWVkXCIsXG5cdFwibWFjcm9NaWNyb0NoYXJ0XCI6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdFwibWljcm9DaGFydFwiOiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24obWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFBoYW50b21VdGlsLnJlZ2lzdGVyKG1hY3JvTWV0YWRhdGEpO1xufTtcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbihtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSk7XG5cdH1cbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24oeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplclxuXHRcdC5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pXG5cdFx0LnJlcGxhY2UoLyg/OltcXHQgXSooPzpcXHI/XFxufFxccikpKy9nLCBcIlxcblwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7IHBhcnNlcjogXCJodG1sXCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0NEU1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIE1VU1QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbihzQ0RTVXJsOiBzdHJpbmcpIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNDRFNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVTb3VyY2VzKHsgXCJzdHJpbmcuY2RzXCI6IGNkc1N0cmluZyB9LCB7fSk7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gdG8uZWRteChjc24sIHsgc2VydmljZTogXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiIH0pO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoc0NEU1VybCwgXCIuLlwiLCBcImdlblwiKTtcblx0Y29uc3QgZWRteFVybCA9IHBhdGgucmVzb2x2ZShkaXIsIHBhdGguYmFzZW5hbWUoc0NEU1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpKTtcblxuXHRpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdGZzLm1rZGlyU3luYyhkaXIpO1xuXHR9XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14VXJsLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14VXJsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UgPSBhc3luYyBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IG9TZXJ2aWNlQ29udGV4dCA9IHsgc2NvcGVPYmplY3Q6IHt9LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbihvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2NvcGVPYmplY3Q6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24oKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKGlzc3VlID0+IHtcblx0XHRcdFx0aXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbihcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlZFR5cGVzLmVudGl0eVNldHMuZmluZChlcyA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgZW50aXR5U2V0KTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlZFR5cGVzLCBtYW5pZmVzdFNldHRpbmdzLCBnZXRGYWtlRGlhZ25vc3RpY3MoKSwgbWVyZ2UsIGRhdGFNb2RlbFBhdGgpO1xufTtcbmNvbnN0IG1ldGFNb2RlbENhY2hlOiBhbnkgPSB7fTtcbmV4cG9ydCBjb25zdCBnZXRNZXRhTW9kZWwgPSBhc3luYyBmdW5jdGlvbihzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IE9EYXRhTWV0YU1vZGVsKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbihcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZ1N0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0cmV0dXJuIGJpbmRpbmdFbGVtZW50LmZvcm1hdHRlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCA9IGZ1bmN0aW9uKGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWxDb250ZW50OiBhbnkpIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwobW9kZWxDb250ZW50KTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cdHRleHQuc2V0TW9kZWwoanNvbk1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChqc29uTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbihcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbihzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbihzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tzS2V5XSA9IG9Nb2RlbDtcblx0fSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRyZXR1cm4gWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHtvYmplY3R9IHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wYWx0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWw8b2JqZWN0PiB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWw8b2JqZWN0PigpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIik7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9ybWF0WG1sKHJlc3VsdERvYy5pbm5lckhUTUwsIHtcblx0XHRmaWx0ZXI6IChub2RlOiBhbnkpID0+IG5vZGUudHlwZSAhPT0gXCJDb21tZW50XCJcblx0fSk7XG59XG4iXX0=
444
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwib3V0ZXJIVE1MIiwiZm9ybWF0WG1sIiwiZmlsdGVyIiwibm9kZSIsInR5cGUiLCJyZXF1aXJlIiwiTG9nIiwic2V0TGV2ZWwiLCJqZXN0Iiwic2V0VGltZW91dCIsIm5hbWVTcGFjZU1hcCIsInNlbGVjdCIsInhwYXRoIiwidXNlTmFtZXNwYWNlcyIsInJlZ2lzdGVyTWFjcm8iLCJtYWNyb01ldGFkYXRhIiwiUGhhbnRvbVV0aWwiLCJyZWdpc3RlciIsInVucmVnaXN0ZXJNYWNybyIsInBsdWdJbiIsIm5hbWVzcGFjZSIsInB1YmxpY05hbWUiLCJwdWJsaWNOYW1lc3BhY2UiLCJydW5YUGF0aFF1ZXJ5Iiwic2VsZWN0b3IiLCJ4bWxkb20iLCJleHBlY3QiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsInRvTm90SGF2ZUNvbnRyb2wiLCJnZXRDb250cm9sQXR0cmlidXRlIiwiY29udHJvbFNlbGVjdG9yIiwiYXR0cmlidXRlTmFtZSIsInhtbERvbSIsInNlcmlhbGl6ZXIiLCJYTUxTZXJpYWxpemVyIiwieG1sU3RyaW5nIiwic2VyaWFsaXplVG9TdHJpbmciLCJyZXBsYWNlIiwiZm9ybWF0IiwiY29tcGlsZUNEUyIsInNDRFNVcmwiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImVkbXhDb250ZW50IiwiY2RzMmVkbXgiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImVkbXhVcmwiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsImNzbiIsImNvbXBpbGVTb3VyY2VzIiwiZWRteCIsInRvIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsIm9NZXRhTW9kZWwiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsIlNpZGVFZmZlY3RzRmFjdG9yeSIsImNyZWF0ZUluc3RhbmNlIiwidGhlbiIsIm9TZXJ2aWNlSW5zdGFuY2UiLCJvSmVzdFNpZGVFZmZlY3RzU2VydmljZSIsImdldEludGVyZmFjZSIsImdldENvbnRleHQiLCJnZXRNb2RlbCIsImdldE1ldGFNb2RlbCIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwicHVzaCIsImdldElzc3VlcyIsImNoZWNrSWZJc3N1ZUV4aXN0cyIsImZpbmQiLCJpc3N1ZSIsImdldENvbnZlcnRlckNvbnRleHRGb3JUZXN0IiwiY29udmVydGVkVHlwZXMiLCJtYW5pZmVzdFNldHRpbmdzIiwiZW50aXR5U2V0IiwiZW50aXR5U2V0cyIsImVzIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwic01ldGFkYXRhVXJsIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwidW5kZWZpbmVkIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsIm5hbWVkTW9kZWxzQ29udGVudCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5IiwiZGVmYXVsdE1vZGVsIiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsIk9iamVjdCIsImVudHJpZXMiLCJjb250ZW50IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwieG1sRG9jIiwiaGFzT3duUHJvcGVydHkiLCJhc3NpZ24iLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1ldGFNb2RlbCIsInNLZXkiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImdldFRlbXBsYXRlZFhNTCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyVEE7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QU4sQ0FBNERFLFdBQTVEO0FBQ0EsY0FBTUMsTUFBTSxHQUFHaEIsT0FBTyxDQUFDYSxJQUFELENBQVAsSUFBaUJ4RixVQUFoQztBQUNBc0YsVUFBQUEscUJBQXFCLENBQUM5SyxlQUF0QixDQUFzQ2dMLElBQXRDLElBQThDRyxNQUFNLENBQUM5SyxvQkFBUCxDQUE0QjZKLGdCQUFnQixDQUFDYyxJQUFELENBQTVDLENBQTlDLENBSm9ELENBSStDOztBQUNuR0YsVUFBQUEscUJBQXFCLENBQUMvSyxNQUF0QixDQUE2QmlMLElBQTdCLElBQXFDRyxNQUFyQztBQUNBLFNBTkQsRUE3QkMsQ0FxQ0Q7O0FBQ0EsWUFBSUwscUJBQXFCLENBQUMvSyxNQUF0QixDQUE2QixNQUE3QixDQUFKLEVBQTBDO0FBQ3pDK0ssVUFBQUEscUJBQXFCLENBQUM5SyxlQUF0QixDQUFzQyxNQUF0QyxJQUFnRDhLLHFCQUFxQixDQUFDL0ssTUFBdEIsQ0FBNkIsTUFBN0IsRUFBcUNNLG9CQUFyQyxDQUEwRCxHQUExRCxDQUFoRDtBQUNBOztBQUVELGVBQU9DLGVBQWUsQ0FBQ0MsT0FBaEIsQ0FBd0I4SixNQUFNLENBQUM3SixpQkFBL0IsRUFBbUQ7QUFBRWxCLFVBQUFBLElBQUksRUFBRTtBQUFSLFNBQW5ELEVBQThFd0wscUJBQTlFLENBQVA7QUExQ0M7QUEyQ0QsS0FoRCtCO0FBQUE7QUFBQTtBQUFBLEdBQXpCOzs7O0FBa0RBLE1BQU1NLGVBQWUsYUFDM0JuQixRQUQyQixFQUUzQnRDLFlBRjJCLEVBRzNCdUMsZ0JBSDJCLEVBSTNCQyxPQUoyQjtBQUFBLFFBSzFCO0FBQUEsNkJBQzBCSCxtQkFBbUIsQ0FBQ0MsUUFBRCxFQUFXdEMsWUFBWCxFQUF5QnVDLGdCQUF6QixFQUEyQ0MsT0FBM0MsQ0FEN0MsT0FFTWxILFlBRk47QUFHRCxLQVIyQjtBQUFBO0FBQUE7QUFBQSxHQUFyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGhhbnRvbVV0aWwgfSBmcm9tIFwic2FwL2ZlL21hY3Jvc1wiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCBPRGF0YU1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTWV0YU1vZGVsXCI7XG5pbXBvcnQgWE1MUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL1hNTFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IExvZyBmcm9tIFwic2FwL2Jhc2UvTG9nXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGNvbXBpbGVTb3VyY2VzLCB0byB9IGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVyT3V0cHV0LCBFbnRpdHlTZXQsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvYW5ub3RhdGlvbi1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG5jb25zdCBmb3JtYXRYbWwgPSByZXF1aXJlKFwieG1sLWZvcm1hdHRlclwiKTtcblxuTG9nLnNldExldmVsKDEgYXMgYW55LCBcInNhcC51aS5jb3JlLnV0aWwuWE1MUHJlcHJvY2Vzc29yXCIpO1xuamVzdC5zZXRUaW1lb3V0KDQwMDAwKTtcblxuY29uc3QgbmFtZVNwYWNlTWFwID0ge1xuXHRcIm1hY3Jvc1wiOiBcInNhcC5mZS5tYWNyb3NcIixcblx0XCJtYWNyb1wiOiBcInNhcC5mZS5tYWNyb3NcIixcblx0XCJtYWNyb2RhdGFcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdFwibG9nXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcInVuaXR0ZXN0XCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvcHJlcHJvY2Vzc29yZXh0ZW5zaW9uL3NhcC5mZS51bml0dGVzdGluZy8xXCIsXG5cdFwiY29udHJvbFwiOiBcInNhcC5mZS5jb3JlLmNvbnRyb2xzXCIsXG5cdFwiY29yZVwiOiBcInNhcC51aS5jb3JlXCIsXG5cdFwibVwiOiBcInNhcC5tXCIsXG5cdFwiZlwiOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRcImludGVybmFsTWFjcm9cIjogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdFwibWRjXCI6IFwic2FwLnVpLm1kY1wiLFxuXHRcIm1kY2F0XCI6IFwic2FwLnVpLm1kYy5hY3Rpb250b29sYmFyXCIsXG5cdFwibWRjRmllbGRcIjogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFwibWRjVGFibGVcIjogXCJzYXAudWkubWRjLnRhYmxlXCIsXG5cdFwidVwiOiBcInNhcC51aS51bmlmaWVkXCIsXG5cdFwibWFjcm9NaWNyb0NoYXJ0XCI6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdFwibWljcm9DaGFydFwiOiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24obWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFBoYW50b21VdGlsLnJlZ2lzdGVyKG1hY3JvTWV0YWRhdGEpO1xufTtcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbihtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSk7XG5cdH1cbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24oeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplclxuXHRcdC5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pXG5cdFx0LnJlcGxhY2UoLyg/OltcXHQgXSooPzpcXHI/XFxufFxccikpKy9nLCBcIlxcblwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7IHBhcnNlcjogXCJodG1sXCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0NEU1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIE1VU1QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbihzQ0RTVXJsOiBzdHJpbmcpIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNDRFNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gY2RzMmVkbXgoY2RzU3RyaW5nLCBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIpO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoc0NEU1VybCwgXCIuLlwiLCBcImdlblwiKTtcblx0Y29uc3QgZWRteFVybCA9IHBhdGgucmVzb2x2ZShkaXIsIHBhdGguYmFzZW5hbWUoc0NEU1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpKTtcblxuXHRpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdGZzLm1rZGlyU3luYyhkaXIpO1xuXHR9XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14VXJsLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14VXJsO1xufTtcblxuLyoqXG4gKiBDb21waWxlIENEUyB0byBFRE1YLlxuICpcbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gY29tcGlsZS4gRGVmYXVsdHMgdG8gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLlxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcgPSBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIpIHtcblx0Y29uc3QgY3NuID0gY29tcGlsZVNvdXJjZXMoeyBcInN0cmluZy5jZHNcIjogY2RzIH0sIHt9KTtcblx0Y29uc3QgZWRteCA9IHRvLmVkbXgoY3NuLCB7IHNlcnZpY2U6IHNlcnZpY2UsIG9kYXRhRm9yZWlnbktleXM6IHRydWUsIG9kYXRhRm9ybWF0OiBcInN0cnVjdHVyZWRcIiwgb2RhdGFDb250YWlubWVudDogZmFsc2UgfSk7XG5cdGlmICghZWRteCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQ29tcGlsYXRpb24gZmFpbGVkLiBIaW50OiBNYWtlIHN1cmUgdGhhdCB0aGUgQ0RTIG1vZGVsIGRlZmluZXMgc2VydmljZSAke3NlcnZpY2V9LmApO1xuXHR9XG5cdHJldHVybiBlZG14O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH07XG5cdHJldHVybiBuZXcgU2lkZUVmZmVjdHNGYWN0b3J5KCkuY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0KS50aGVuKGZ1bmN0aW9uKG9TZXJ2aWNlSW5zdGFuY2U6IGFueSkge1xuXHRcdGNvbnN0IG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlID0gb1NlcnZpY2VJbnN0YW5jZS5nZXRJbnRlcmZhY2UoKTtcblx0XHRvSmVzdFNpZGVFZmZlY3RzU2VydmljZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY29wZU9iamVjdDoge1xuXHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGdldE1ldGFNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXRhTW9kZWw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0cmV0dXJuIG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlRGlhZ25vc3RpY3MgPSBmdW5jdGlvbigpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoaXNzdWUgPT4ge1xuXHRcdFx0XHRpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uKFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVyT3V0cHV0LFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKGVzID0+IGVzLm5hbWUgPT09IG1hbmlmZXN0U2V0dGluZ3MuZW50aXR5U2V0KTtcblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eShlbnRpdHlTZXQgYXMgRW50aXR5U2V0LCBjb252ZXJ0ZWRUeXBlcywgZW50aXR5U2V0KTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlZFR5cGVzLCBtYW5pZmVzdFNldHRpbmdzLCBnZXRGYWtlRGlhZ25vc3RpY3MoKSwgbWVyZ2UsIGRhdGFNb2RlbFBhdGgpO1xufTtcbmNvbnN0IG1ldGFNb2RlbENhY2hlOiBhbnkgPSB7fTtcbmV4cG9ydCBjb25zdCBnZXRNZXRhTW9kZWwgPSBhc3luYyBmdW5jdGlvbihzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IChPRGF0YU1ldGFNb2RlbCBhcyBhbnkpKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbihcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdGNvbnZlcnRlZFR5cGVzOiBDb252ZXJ0ZXJPdXRwdXQsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlLFxuXHRcdGNvbnZlcnRlZFR5cGVzOiBjb252ZXJ0ZWRUeXBlc1xuXHR9O1xuXHR0YXJnZXRQYXRoLmNvbnRleHRMb2NhdGlvbiA9IHRhcmdldFBhdGg7XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uKGJpbmRpbmdTdHJpbmc6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdHJldHVybiBiaW5kaW5nRWxlbWVudC5mb3JtYXR0ZXIuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbn07XG5cbnR5cGUgTW9kZWxDb250ZW50ID0ge1xuXHRbbmFtZTogc3RyaW5nXTogYW55O1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSBhIGJpbmRpbmcgYWdhaW5zdCBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQpO1xuXG5cdGlmIChuYW1lZE1vZGVsc0NvbnRlbnQpIHtcblx0XHRmb3IgKGNvbnN0IFtuYW1lLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhuYW1lZE1vZGVsc0NvbnRlbnQpKSB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBKU09OTW9kZWwoY29udGVudCk7XG5cdFx0XHR0ZXh0LnNldE1vZGVsKG1vZGVsLCBuYW1lKTtcblx0XHRcdHRleHQuc2V0QmluZGluZ0NvbnRleHQobW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIGFzIENvbnRleHQsIG5hbWUpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0ZXh0LmdldFRleHQoKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbihcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbihzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbihzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tzS2V5XSA9IG9Nb2RlbDtcblx0fSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRyZXR1cm4gWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHtvYmplY3R9IHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWwgfSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IG9iamVjdCB9XG5cdH07XG5cdGZvciAoY29uc3QgbW9kZWwgaW4gdGVzdERhdGEpIHtcblx0XHRjb25zdCBqc29uTW9kZWwgPSBuZXcgSlNPTk1vZGVsKCk7XG5cdFx0anNvbk1vZGVsLnNldERhdGEodGVzdERhdGFbbW9kZWxdKTtcblx0XHRzZXR0aW5ncy5tb2RlbHNbbW9kZWxdID0ganNvbk1vZGVsO1xuXHRcdHNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1ttb2RlbF0gPSBzZXR0aW5ncy5tb2RlbHNbbW9kZWxdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSBhcyBDb250ZXh0O1xuXHR9XG5cblx0Ly8gZXhlY3V0ZSB0aGUgcHJlLXByb2Nlc3NvclxuXHRjb25zdCByZXN1bHREb2MgPSBhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2VzcyhpbnB1dERvYy5maXJzdEVsZW1lbnRDaGlsZCwgeyBuYW1lIH0sIHNldHRpbmdzKTtcblxuXHQvLyBleGNsdWRlIG5lc3RlZCBmcmFnbWVudHMgZnJvbSB0ZXN0IHNuYXBzaG90c1xuXHRjb25zdCBmcmFnbWVudHMgPSByZXN1bHREb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjb3JlOkZyYWdtZW50XCIpO1xuXHRpZiAoZnJhZ21lbnRzPy5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcblx0XHRcdGZyYWdtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0fVxuXHR9XG5cblx0Ly8gS2VlcCB0aGUgZnJhZ21lbnQgcmVzdWx0IGFzIGNoaWxkIG9mIHJvb3Qgbm9kZSB3aGVuIGZyYWdtZW50IGdlbmVyYXRlcyBtdWx0aXBsZSByb290IGNvbnRyb2xzXG5cdGNvbnN0IHhtbFJlc3VsdCA9IHJlc3VsdERvYy5jaGlsZHJlbi5sZW5ndGggPiAxID8gcmVzdWx0RG9jLm91dGVySFRNTCA6IHJlc3VsdERvYy5pbm5lckhUTUw7XG5cblx0cmV0dXJuIGZvcm1hdFhtbCh4bWxSZXN1bHQsIHtcblx0XHRmaWx0ZXI6IChub2RlOiBhbnkpID0+IG5vZGUudHlwZSAhPT0gXCJDb21tZW50XCJcblx0fSk7XG59XG4iXX0=