projen 0.98.22 → 0.98.23

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 (153) hide show
  1. package/.jsii +6552 -893
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +5 -5
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +2 -2
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +4 -4
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-docgen.js +1 -1
  22. package/lib/cdk/jsii-project.js +1 -1
  23. package/lib/cdk8s/auto-discover.js +2 -2
  24. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  25. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  26. package/lib/cdk8s/cdk8s-construct.js +1 -1
  27. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps.js +1 -1
  29. package/lib/cdk8s/integration-test.js +1 -1
  30. package/lib/cdktf/cdktf-construct.js +1 -1
  31. package/lib/circleci/circleci.js +1 -1
  32. package/lib/component.js +1 -1
  33. package/lib/dependencies.js +1 -1
  34. package/lib/dev-env.js +1 -1
  35. package/lib/docker-compose/docker-compose-service.js +1 -1
  36. package/lib/docker-compose/docker-compose.js +1 -1
  37. package/lib/file.js +1 -1
  38. package/lib/gitattributes.js +1 -1
  39. package/lib/github/actions-provider.js +1 -1
  40. package/lib/github/auto-approve.js +1 -1
  41. package/lib/github/auto-merge.js +1 -1
  42. package/lib/github/auto-queue.js +1 -1
  43. package/lib/github/dependabot.js +1 -1
  44. package/lib/github/github-credentials.js +1 -1
  45. package/lib/github/github-project.js +1 -1
  46. package/lib/github/github.js +1 -1
  47. package/lib/github/merge-queue.js +1 -1
  48. package/lib/github/mergify.js +1 -1
  49. package/lib/github/pr-template.js +1 -1
  50. package/lib/github/pull-request-backport.js +1 -1
  51. package/lib/github/pull-request-lint.js +1 -1
  52. package/lib/github/stale.js +1 -1
  53. package/lib/github/task-workflow-job.js +1 -1
  54. package/lib/github/task-workflow.js +1 -1
  55. package/lib/github/workflow-actions.js +1 -1
  56. package/lib/github/workflow-jobs.js +1 -1
  57. package/lib/github/workflow-steps.js +1 -1
  58. package/lib/github/workflows.js +1 -1
  59. package/lib/gitlab/configuration.js +1 -1
  60. package/lib/gitlab/gitlab-configuration.js +1 -1
  61. package/lib/gitlab/nested-configuration.js +1 -1
  62. package/lib/gitpod.js +1 -1
  63. package/lib/ignore-file.js +1 -1
  64. package/lib/ini.js +1 -1
  65. package/lib/java/java-project.js +1 -1
  66. package/lib/java/junit.js +1 -1
  67. package/lib/java/maven-compile.js +1 -1
  68. package/lib/java/maven-packaging.js +1 -1
  69. package/lib/java/maven-sample.js +1 -1
  70. package/lib/java/pom.js +2 -2
  71. package/lib/java/projenrc.js +1 -1
  72. package/lib/javascript/biome/biome.js +1 -1
  73. package/lib/javascript/bundler.js +1 -1
  74. package/lib/javascript/eslint.js +1 -1
  75. package/lib/javascript/jest.js +4 -4
  76. package/lib/javascript/license-checker.js +1 -1
  77. package/lib/javascript/node-package.js +1 -1
  78. package/lib/javascript/node-project.js +1 -1
  79. package/lib/javascript/npm-config.js +1 -1
  80. package/lib/javascript/prettier.js +1 -1
  81. package/lib/javascript/projenrc.js +1 -1
  82. package/lib/javascript/typescript-config.js +2 -2
  83. package/lib/javascript/upgrade-dependencies.js +2 -2
  84. package/lib/javascript/yarnrc.js +1 -1
  85. package/lib/json-patch.js +1 -1
  86. package/lib/json.js +1 -1
  87. package/lib/license.js +1 -1
  88. package/lib/logger.js +1 -1
  89. package/lib/makefile.js +1 -1
  90. package/lib/object-file.js +1 -1
  91. package/lib/project-build.js +1 -1
  92. package/lib/project-tree.js +1 -1
  93. package/lib/project.js +1 -1
  94. package/lib/projects.js +1 -1
  95. package/lib/projenrc-json.js +2 -2
  96. package/lib/projenrc.js +1 -1
  97. package/lib/python/index.d.ts +4 -0
  98. package/lib/python/index.js +6 -1
  99. package/lib/python/pip.js +1 -1
  100. package/lib/python/poetry.d.ts +4 -3
  101. package/lib/python/poetry.js +11 -18
  102. package/lib/python/projenrc.js +1 -1
  103. package/lib/python/pyproject-toml-file.d.ts +13 -0
  104. package/lib/python/pyproject-toml-file.js +29 -0
  105. package/lib/python/pyproject-toml.d.ts +418 -0
  106. package/lib/python/pyproject-toml.js +187 -0
  107. package/lib/python/pytest-sample.js +1 -1
  108. package/lib/python/pytest.js +1 -1
  109. package/lib/python/python-packaging.d.ts +5 -0
  110. package/lib/python/python-packaging.js +1 -1
  111. package/lib/python/python-project.d.ts +10 -1
  112. package/lib/python/python-project.js +62 -8
  113. package/lib/python/python-sample.js +1 -1
  114. package/lib/python/requirements-file.js +1 -1
  115. package/lib/python/setuppy.js +1 -1
  116. package/lib/python/setuptools.js +1 -1
  117. package/lib/python/uv-config.d.ts +1804 -0
  118. package/lib/python/uv-config.js +344 -0
  119. package/lib/python/uv.d.ts +53 -0
  120. package/lib/python/uv.js +138 -0
  121. package/lib/python/venv.js +1 -1
  122. package/lib/readme.js +1 -1
  123. package/lib/release/publisher.js +1 -1
  124. package/lib/release/release-trigger.js +1 -1
  125. package/lib/release/release.js +1 -1
  126. package/lib/renovatebot.js +1 -1
  127. package/lib/sample-file.js +2 -2
  128. package/lib/semver.js +1 -1
  129. package/lib/source-code.js +1 -1
  130. package/lib/task-runtime.js +1 -1
  131. package/lib/task.js +1 -1
  132. package/lib/tasks.js +1 -1
  133. package/lib/testing.js +1 -1
  134. package/lib/textfile.js +1 -1
  135. package/lib/toml.d.ts +2 -2
  136. package/lib/toml.js +4 -4
  137. package/lib/typescript/projenrc-ts.js +1 -1
  138. package/lib/typescript/projenrc.js +1 -1
  139. package/lib/typescript/typescript-typedoc.js +1 -1
  140. package/lib/typescript/typescript.js +6 -6
  141. package/lib/version.js +2 -2
  142. package/lib/vscode/devcontainer.js +1 -1
  143. package/lib/vscode/extensions.js +1 -1
  144. package/lib/vscode/launch-config.js +1 -1
  145. package/lib/vscode/settings.js +1 -1
  146. package/lib/vscode/vscode.js +1 -1
  147. package/lib/web/next.js +3 -3
  148. package/lib/web/postcss.js +1 -1
  149. package/lib/web/react.js +4 -4
  150. package/lib/web/tailwind.js +1 -1
  151. package/lib/xmlfile.js +1 -1
  152. package/lib/yaml.js +1 -1
  153. package/package.json +5 -1
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PyprojectTomlProjectDynamic = void 0;
4
+ exports.toJson_PyprojectToml = toJson_PyprojectToml;
5
+ exports.toJson_PyprojectTomlProject = toJson_PyprojectTomlProject;
6
+ exports.toJson_PyprojectTomlDependencyGroups = toJson_PyprojectTomlDependencyGroups;
7
+ exports.toJson_BuildSystem = toJson_BuildSystem;
8
+ exports.toJson_PyprojectTomlTool = toJson_PyprojectTomlTool;
9
+ exports.toJson_ProjectAuthor = toJson_ProjectAuthor;
10
+ /**
11
+ * Converts an object of type 'PyprojectToml' to JSON representation.
12
+ * @internal
13
+ */
14
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
15
+ function toJson_PyprojectToml(obj) {
16
+ if (obj === undefined) {
17
+ return undefined;
18
+ }
19
+ const result = {
20
+ 'project': toJson_PyprojectTomlProject(obj.project),
21
+ 'dependency-groups': toJson_PyprojectTomlDependencyGroups(obj.dependencyGroups),
22
+ 'build-system': toJson_BuildSystem(obj.buildSystem),
23
+ 'tool': toJson_PyprojectTomlTool(obj.tool),
24
+ };
25
+ // filter undefined values
26
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
27
+ }
28
+ /**
29
+ * Converts an object of type 'PyprojectTomlProject' to JSON representation.
30
+ * @internal
31
+ */
32
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
33
+ function toJson_PyprojectTomlProject(obj) {
34
+ if (obj === undefined) {
35
+ return undefined;
36
+ }
37
+ const result = {
38
+ 'name': obj.name,
39
+ 'version': obj.version,
40
+ 'description': obj.description,
41
+ 'readme': obj.readme,
42
+ 'requires-python': obj.requiresPython,
43
+ 'license': obj.license,
44
+ 'license-files': obj.licenseFiles?.map(y => y),
45
+ 'authors': obj.authors?.map(y => toJson_ProjectAuthor(y)),
46
+ 'maintainers': obj.maintainers?.map(y => toJson_ProjectAuthor(y)),
47
+ 'keywords': obj.keywords?.map(y => y),
48
+ 'classifiers': obj.classifiers?.map(y => y),
49
+ 'urls': ((obj.urls) === undefined) ? undefined : (Object.entries(obj.urls).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
50
+ 'scripts': ((obj.scripts) === undefined) ? undefined : (Object.entries(obj.scripts).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
51
+ 'gui-scripts': ((obj.guiScripts) === undefined) ? undefined : (Object.entries(obj.guiScripts).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {})),
52
+ 'entry-points': obj.entryPoints,
53
+ 'dependencies': obj.dependencies?.map(y => y),
54
+ 'optional-dependencies': obj.optionalDependencies,
55
+ 'import-names': obj.importNames?.map(y => y),
56
+ 'import-namespaces': obj.importNamespaces?.map(y => y),
57
+ 'dynamic': obj.dynamic?.map(y => y),
58
+ };
59
+ // filter undefined values
60
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
61
+ }
62
+ /**
63
+ * Converts an object of type 'PyprojectTomlDependencyGroups' to JSON representation.
64
+ * @internal
65
+ */
66
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
67
+ function toJson_PyprojectTomlDependencyGroups(obj) {
68
+ if (obj === undefined) {
69
+ return undefined;
70
+ }
71
+ const result = {
72
+ 'dev': obj.dev?.map(y => y),
73
+ };
74
+ // filter undefined values
75
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
76
+ }
77
+ /**
78
+ * Converts an object of type 'BuildSystem' to JSON representation.
79
+ * @internal
80
+ */
81
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
82
+ function toJson_BuildSystem(obj) {
83
+ if (obj === undefined) {
84
+ return undefined;
85
+ }
86
+ const result = {
87
+ 'requires': obj.requires?.map(y => y),
88
+ 'build-backend': obj.buildBackend,
89
+ 'backend-path': obj.backendPath?.map(y => y),
90
+ };
91
+ // filter undefined values
92
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
93
+ }
94
+ /**
95
+ * Converts an object of type 'PyprojectTomlTool' to JSON representation.
96
+ * @internal
97
+ */
98
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
99
+ function toJson_PyprojectTomlTool(obj) {
100
+ if (obj === undefined) {
101
+ return undefined;
102
+ }
103
+ const result = {
104
+ 'black': obj.black,
105
+ 'cibuildwheel': obj.cibuildwheel,
106
+ 'mypy': obj.mypy,
107
+ 'ruff': obj.ruff,
108
+ 'ty': obj.ty,
109
+ 'hatch': obj.hatch,
110
+ 'maturin': obj.maturin,
111
+ 'scikit-build': obj.scikitBuild,
112
+ 'setuptools': obj.setuptools,
113
+ 'setuptools_scm': obj.setuptoolsScm,
114
+ 'poe': obj.poe,
115
+ 'poetry': obj.poetry,
116
+ 'pdm': obj.pdm,
117
+ 'pyright': obj.pyright,
118
+ 'pytest': obj.pytest,
119
+ 'repo-review': obj.repoReview,
120
+ 'taskipy': obj.taskipy,
121
+ 'tombi': obj.tombi,
122
+ 'tox': obj.tox,
123
+ 'uv': obj.uv,
124
+ };
125
+ // filter undefined values
126
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
127
+ }
128
+ /**
129
+ * Converts an object of type 'ProjectAuthor' to JSON representation.
130
+ * @internal
131
+ */
132
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
133
+ function toJson_ProjectAuthor(obj) {
134
+ if (obj === undefined) {
135
+ return undefined;
136
+ }
137
+ const result = {
138
+ 'name': obj.name,
139
+ 'email': obj.email,
140
+ };
141
+ // filter undefined values
142
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
143
+ }
144
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
145
+ /**
146
+ * @schema PyprojectTomlProjectDynamic
147
+ */
148
+ var PyprojectTomlProjectDynamic;
149
+ (function (PyprojectTomlProjectDynamic) {
150
+ /** version */
151
+ PyprojectTomlProjectDynamic["VERSION"] = "version";
152
+ /** description */
153
+ PyprojectTomlProjectDynamic["DESCRIPTION"] = "description";
154
+ /** readme */
155
+ PyprojectTomlProjectDynamic["README"] = "readme";
156
+ /** requires-python */
157
+ PyprojectTomlProjectDynamic["REQUIRES_HYPHEN_PYTHON"] = "requires-python";
158
+ /** license */
159
+ PyprojectTomlProjectDynamic["LICENSE"] = "license";
160
+ /** license-files */
161
+ PyprojectTomlProjectDynamic["LICENSE_HYPHEN_FILES"] = "license-files";
162
+ /** authors */
163
+ PyprojectTomlProjectDynamic["AUTHORS"] = "authors";
164
+ /** maintainers */
165
+ PyprojectTomlProjectDynamic["MAINTAINERS"] = "maintainers";
166
+ /** keywords */
167
+ PyprojectTomlProjectDynamic["KEYWORDS"] = "keywords";
168
+ /** classifiers */
169
+ PyprojectTomlProjectDynamic["CLASSIFIERS"] = "classifiers";
170
+ /** urls */
171
+ PyprojectTomlProjectDynamic["URLS"] = "urls";
172
+ /** scripts */
173
+ PyprojectTomlProjectDynamic["SCRIPTS"] = "scripts";
174
+ /** gui-scripts */
175
+ PyprojectTomlProjectDynamic["GUI_HYPHEN_SCRIPTS"] = "gui-scripts";
176
+ /** entry-points */
177
+ PyprojectTomlProjectDynamic["ENTRY_HYPHEN_POINTS"] = "entry-points";
178
+ /** dependencies */
179
+ PyprojectTomlProjectDynamic["DEPENDENCIES"] = "dependencies";
180
+ /** optional-dependencies */
181
+ PyprojectTomlProjectDynamic["OPTIONAL_HYPHEN_DEPENDENCIES"] = "optional-dependencies";
182
+ /** import-names */
183
+ PyprojectTomlProjectDynamic["IMPORT_HYPHEN_NAMES"] = "import-names";
184
+ /** import-namespaces */
185
+ PyprojectTomlProjectDynamic["IMPORT_HYPHEN_NAMESPACES"] = "import-namespaces";
186
+ })(PyprojectTomlProjectDynamic || (exports.PyprojectTomlProjectDynamic = PyprojectTomlProjectDynamic = {}));
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHlwcm9qZWN0LXRvbWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHl0aG9uL3B5cHJvamVjdC10b21sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVDQSxvREFVQztBQW9LRCxrRUEwQkM7QUFvQkQsb0ZBT0M7QUFvQ0QsZ0RBU0M7QUEySkQsNERBMEJDO0FBdUJELG9EQVFDO0FBemVEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixvQkFBb0IsQ0FBQyxHQUE4QjtJQUNqRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFNBQVMsRUFBRSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ25ELG1CQUFtQixFQUFFLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRSxjQUFjLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNuRCxNQUFNLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUMzQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUErSkQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDJCQUEyQixDQUFDLEdBQXFDO0lBQy9FLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDOUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3BCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxjQUFjO1FBQ3JDLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixlQUFlLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckosU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlKLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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c0JBQXNCO0lBQ3RCLHlFQUEwQyxDQUFBO0lBQzFDLGNBQWM7SUFDZCxrREFBbUIsQ0FBQTtJQUNuQixvQkFBb0I7SUFDcEIscUVBQXNDLENBQUE7SUFDdEMsY0FBYztJQUNkLGtEQUFtQixDQUFBO0lBQ25CLGtCQUFrQjtJQUNsQiwwREFBMkIsQ0FBQTtJQUMzQixlQUFlO0lBQ2Ysb0RBQXFCLENBQUE7SUFDckIsa0JBQWtCO0lBQ2xCLDBEQUEyQixDQUFBO0lBQzNCLFdBQVc7SUFDWCw0Q0FBYSxDQUFBO0lBQ2IsY0FBYztJQUNkLGtEQUFtQixDQUFBO0lBQ25CLGtCQUFrQjtJQUNsQixpRUFBa0MsQ0FBQTtJQUNsQyxtQkFBbUI7SUFDbkIsbUVBQW9DLENBQUE7SUFDcEMsbUJBQW1CO0lBQ25CLDREQUE2QixDQUFBO0lBQzdCLDRCQUE0QjtJQUM1QixxRkFBc0QsQ0FBQTtJQUN0RCxtQkFBbUI7SUFDbkIsbUVBQW9DLENBQUE7SUFDcEMsd0JBQXdCO0lBQ3hCLDZFQUE4QyxDQUFBO0FBQ2hELENBQUMsRUFyQ1csMkJBQTJCLDJDQUEzQiwyQkFBMkIsUUFxQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibm9kZSAuL3Byb2plbi5qc1wiLlxuLyoqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXByb2plY3RUb21sIHtcbiAgLyoqXG4gICAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgbWV0YWRhdGE6IF9zdGF0aWNfIGFuZCBfZHluYW1pY18uXG4gICAqIC0gU3RhdGljIG1ldGFkYXRhIGlzIGxpc3RlZCBpbiB0aGUgYFtwcm9qZWN0XWAgdGFibGUgZGlyZWN0bHkgYW5kIGNhbm5vdCBiZSBzcGVjaWZpZWQgb3IgY2hhbmdlZCBieSBhIHRvb2wuXG4gICAqIC0gRHluYW1pYyBtZXRhZGF0YSBrZXkgbmFtZXMgYXJlIGxpc3RlZCBpbnNpZGUgdGhlIGBkeW5hbWljYCBrZXkgYW5kIHJlcHJlc2VudHMgbWV0YWRhdGEgdGhhdCBhIHRvb2wgd2lsbCBsYXRlciBwcm92aWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWwjcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IFB5cHJvamVjdFRvbWxQcm9qZWN0O1xuXG4gIC8qKlxuICAgKiBOYW1lZCBncm91cHMgb2YgZGVwZW5kZW5jaWVzLCBzaW1pbGFyIHRvIGByZXF1aXJlbWVudHMudHh0YCBmaWxlcywgd2hpY2ggbGF1bmNoZXJzLCBJREVzLCBhbmQgb3RoZXIgdG9vbHMgY2FuIGZpbmQgYW5kIGlkZW50aWZ5IGJ5IG5hbWUuIEVhY2ggaXRlbSBpbiBgW2RlcGVuZGVuY3ktZ3JvdXBzXWAgaXMgZGVmaW5lZCBhcyBtYXBwaW5nIG9mIGdyb3VwIG5hbWUgdG8gbGlzdCBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9kZXBlbmRlbmN5LXNwZWNpZmllcnMvKS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sI2RlcGVuZGVuY3ktZ3JvdXBzXG4gICAqL1xuICByZWFkb25seSBkZXBlbmRlbmN5R3JvdXBzPzogUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHM7XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbCNidWlsZC1zeXN0ZW1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkU3lzdGVtPzogQnVpbGRTeXN0ZW07XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHRvb2wgdGhhdCBpcyB1c2VkIGJ5IHRoZSBwcm9qZWN0IGNhbiBoYXZlIHVzZXJzIHNwZWNpZnkgY29uZmlndXJhdGlvbiBkYXRhIGFzIGxvbmcgYXMgdGhleSB1c2UgYSBzdWItdGFibGUgd2l0aGluIGBbdG9vbF1gLiBHZW5lcmFsbHkgYSBwcm9qZWN0IGNhbiB1c2UgdGhlIHN1YnRhYmxlIGB0b29sLiROQU1FYCBpZiwgYW5kIG9ubHkgaWYsIHRoZXkgb3duIHRoZSBlbnRyeSBmb3IgYCROQU1FYCBpbiB0aGUgQ2hlZXNlc2hvcC9QeVBJLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWwjdG9vbFxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbD86IFB5cHJvamVjdFRvbWxUb29sO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUHlwcm9qZWN0VG9tbChvYmo6IFB5cHJvamVjdFRvbWwgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcm9qZWN0JzogdG9Kc29uX1B5cHJvamVjdFRvbWxQcm9qZWN0KG9iai5wcm9qZWN0KSxcbiAgICAnZGVwZW5kZW5jeS1ncm91cHMnOiB0b0pzb25fUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMob2JqLmRlcGVuZGVuY3lHcm91cHMpLFxuICAgICdidWlsZC1zeXN0ZW0nOiB0b0pzb25fQnVpbGRTeXN0ZW0ob2JqLmJ1aWxkU3lzdGVtKSxcbiAgICAndG9vbCc6IHRvSnNvbl9QeXByb2plY3RUb21sVG9vbChvYmoudG9vbCksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIG1ldGFkYXRhOiBfc3RhdGljXyBhbmQgX2R5bmFtaWNfLlxuICogLSBTdGF0aWMgbWV0YWRhdGEgaXMgbGlzdGVkIGluIHRoZSBgW3Byb2plY3RdYCB0YWJsZSBkaXJlY3RseSBhbmQgY2Fubm90IGJlIHNwZWNpZmllZCBvciBjaGFuZ2VkIGJ5IGEgdG9vbC5cbiAqIC0gRHluYW1pYyBtZXRhZGF0YSBrZXkgbmFtZXMgYXJlIGxpc3RlZCBpbnNpZGUgdGhlIGBkeW5hbWljYCBrZXkgYW5kIHJlcHJlc2VudHMgbWV0YWRhdGEgdGhhdCBhIHRvb2wgd2lsbCBsYXRlciBwcm92aWRlLlxuICpcbiAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXByb2plY3RUb21sUHJvamVjdCB7XG4gIC8qKlxuICAgKiBWYWxpZCBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycywgcGVyaW9kLCB1bmRlcnNjb3JlIGFuZCBoeXBoZW4uIEl0IG11c3Qgc3RhcnQgYW5kIGVuZCB3aXRoIGEgbGV0dGVyIG9yIG51bWJlci5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIHByb2plY3QsIGFzIGRlZmluZWQgaW4gdGhlIFtWZXJzaW9uIHNwZWNpZmllciBzcGVjaWZpY2F0aW9uXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy92ZXJzaW9uLXNwZWNpZmllcnMvKSwgYW5kIHByZWZlcmFibHkgW2FscmVhZHkgbm9ybWFsaXplZF0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvdmVyc2lvbi1zcGVjaWZpZXJzLyNub3JtYWxpemF0aW9uKS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdW1tYXJ5IGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0IGluIG9uZSBsaW5lLiBUb29scyBtYXkgbm90IGFjY2VwdCBtdWx0aXBsZSBsaW5lcy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGNhbiBiZSBhIHJlbGF0aXZlIHBhdGggdG8gdGV4dCAvIG1hcmtkb3duIChgLm1kYCBzdWZmaXgpIC8gcmVTdHJ1Y3R1cmVkVGV4dCAoYC5yc3RgIHN1ZmZpeCkgcmVhZG1lIGZpbGUsIG9yIGEgdGFibGUgd2l0aCBlaXRoZXI6XG4gICAqIC0gYGZpbGVgIGtleSBjb250YWluaW5nIHBhdGggb2YgYWZvcmVtZW50aW9uZWQgcmVhZG1lIGZpbGUsIG9yXG4gICAqIC0gYHRleHRgIGtleSBjb250YWluaW5nIHRoZSBmdWxsIHJlYWRtZSB0ZXh0IGVtYmVkZGVkIGluc2lkZSBgcHlwcm9qZWN0LnRvbWxgLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I3JlYWRtZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVhZG1lPzogYW55O1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIFB5dGhvbiB2ZXJzaW9uKHMpIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBjb21wYXRpYmxlIHdpdGguIE11c3QgYmUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gW1ZlcnNpb24gc3BlY2lmaWVyc10oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvdmVyc2lvbi1zcGVjaWZpZXJzLykuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjcmVxdWlyZXMtcHl0aG9uXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlc1B5dGhvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRm9yIG5vdyBpdCBpcyBhIHRhYmxlIHdpdGggZWl0aGVyOlxuICAgKiAtIGBmaWxlYCBrZXkgc3BlY2lmeWluZyBhIHJlbGF0aXZlIHBhdGggdG8gYSBsaWNlbnNlIGZpbGUsIG9yXG4gICAqIC0gYHRleHRgIGtleSBjb250YWluaW5nIGZ1bGwgbGljZW5zZSBjb250ZW50XG4gICAqXG4gICAqIE5ld2VyIHRvb2wgbWF5IGFjY2VwdCBhIHNpbmdsZSBbU1BEWCBsaWNlbnNlIGV4cHJlc3Npb25dKGh0dHBzOi8vc3BkeC5naXRodWIuaW8vc3BkeC1zcGVjL3YyLjIuMi9TUERYLWxpY2Vuc2UtZXhwcmVzc2lvbnMvKSBzdHJpbmcgaW5zdGVhZCBvZiBhIHRhYmxlLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2xpY2Vuc2VcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFJlbGF0aXZlIHBhdGhzIG9yIGdsb2JzIHRvIHBhdGhzIG9mIGxpY2Vuc2UgZmlsZXMuIENhbiBiZSBhbiBlbXB0eSBsaXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2xpY2Vuc2UtZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2VGaWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQZW9wbGUgb3Igb3JnYW5pemF0aW9ucyBjb25zaWRlcmVkIGFzICdhdXRob3JzJyBvZiB0aGUgcHJvamVjdC4gRWFjaCBhdXRob3IgaXMgYSB0YWJsZSB3aXRoIGBuYW1lYCBrZXksIGBlbWFpbGAga2V5LCBvciBib3RoLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2F1dGhvcnNcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcnM/OiBQcm9qZWN0QXV0aG9yW107XG5cbiAgLyoqXG4gICAqIFBlb3BsZSBvciBvcmdhbml6YXRpb25zIGNvbnNpZGVyZWQgYXMgJ21haW50YWluZXJzJyBvZiB0aGUgcHJvamVjdC4gRWFjaCBtYWludGFpbmVyIGlzIGEgdGFibGUgd2l0aCBgbmFtZWAga2V5LCBgZW1haWxgIGtleSwgb3IgYm90aC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNtYWludGFpbmVyc1xuICAgKi9cbiAgcmVhZG9ubHkgbWFpbnRhaW5lcnM/OiBQcm9qZWN0QXV0aG9yW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2Yga2V5d29yZHMgb3IgdGFncyB0aGF0IGRlc2NyaWJlIHRoZSBwcm9qZWN0LiBUaGV5IGNvdWxkIGJlIHVzZWQgYnkgc2VhcmNoIGVuZ2luZXMgdG8gY2F0ZWdvcml6ZSB0aGUgcHJvamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNrZXl3b3Jkc1xuICAgKi9cbiAgcmVhZG9ubHkga2V5d29yZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBbVHJvdmUgY2xhc3NpZmllcnNdKGh0dHBzOi8vcHlwaS5vcmcvY2xhc3NpZmllcnMvKSB0aGF0IGRlc2NyaWJlIHRoZSBwcm9qZWN0LiBQeVBJIHVzZSB0aGUgY2xhc3NpZmllcnMgdG8gY2F0ZWdvcml6ZSBwcm9qZWN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNjbGFzc2lmaWVyc1xuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3NpZmllcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGFibGUgY29uc2lzdGluZyBvbmUgb3IgbXVsdGlwbGUgYGxhYmVsOiBVUkxgIHBhaXJzLiBDb21tb24gaW5kZXhlcyBsaWtlIFB5UEkgdXNlcyBbd2VsbC1rbm93biBQcm9qZWN0IFVSTHNdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL3dlbGwta25vd24tcHJvamVjdC11cmxzLyN3ZWxsLWtub3duLWxhYmVscykgd2hlbiBwcmVzZW50aW5nIHByb2plY3QgcGFnZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjdXJsc1xuICAgKi9cbiAgcmVhZG9ubHkgdXJscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIFRhYmxlIG9mIFtlbnRyeSBwb2ludHNdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL2VudHJ5LXBvaW50cy8pIHRoYXQgYWxsb3dzIHBhY2thZ2UgaW5zdGFsbGVycyB0byBjcmVhdGUgYSBjb21tYW5kLWxpbmUgd3JhcHBlciBmb3IuIEVhY2gga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgdG8gYmUgY3JlYXRlZCwgYW5kIGVhY2ggdmFsdWUgaXMgdGhlIGZ1bmN0aW9uIG9yIG9iamVjdCB0byBhbGwsIGluIGZvcm0gb2YgZWl0aGVyIGBpbXBvcnRhYmxlLm1vZHVsZWAgb3IgYGltcG9ydGFibGUubW9kdWxlOm9iamVjdC5hdHRyYC4gV2luZG93cyBwbGF0Zm9ybSB0cmVhdHMgYGNvbnNvbGVfc2NyaXB0c2Agc3BlY2lhbGx5IGluIHRoYXQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIGNvbnNvbGUgZXhlY3V0YWJsZSwgc28gdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb25zb2xlIGFuZCBjYW4gdXNlIGBzeXMuc3RkaW5gLCBgc3lzLnN0ZG91dGAgYW5kIGBzeXMuc3RkZXJyYCBmb3IgSS9PLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I3NjcmlwdHNcbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUYWJsZSBvZiBbZW50cnkgcG9pbnRzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9lbnRyeS1wb2ludHMvKSB0aGF0IGFsbG93cyBwYWNrYWdlIGluc3RhbGxlcnMgdG8gY3JlYXRlIGEgR1VJIHdyYXBwZXIgZm9yLiBFYWNoIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgc2NyaXB0IHRvIGJlIGNyZWF0ZWQsIGFuZCBlYWNoIHZhbHVlIGlzIHRoZSBmdW5jdGlvbiBvciBvYmplY3QgdG8gYWxsLCBpbiBmb3JtIG9mIGVpdGhlciBgaW1wb3J0YWJsZS5tb2R1bGVgIG9yIGBpbXBvcnRhYmxlLm1vZHVsZTpvYmplY3QuYXR0cmAuIFdpbmRvd3MgcGxhdGZvcm0gdHJlYXRzIGBndWlfc2NyaXB0c2Agc3BlY2lhbGx5IGluIHRoYXQgdGhleSBhcmUgd3JhcHBlZCBpbiBhIEdVSSBleGVjdXRhYmxlLCBzbyB0aGV5IGNhbiBiZSBzdGFydGVkIHdpdGhvdXQgYSBjb25zb2xlLCBidXQgY2Fubm90IHVzZSBzdGFuZGFyZCBzdHJlYW1zIHVubGVzcyBhcHBsaWNhdGlvbiBjb2RlIHJlZGlyZWN0cyB0aGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2d1aS1zY3JpcHRzXG4gICAqL1xuICByZWFkb25seSBndWlTY3JpcHRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogRXh0cmEgW2VudHJ5IHBvaW50IGdyb3Vwc10oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvZW50cnktcG9pbnRzLykgdGhhdCBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gbG9hZCBwbHVnaW5zLiBGb3IgZXhhbXBsZSwgUHlnbWVudHMgKGEgc3ludGF4IGhpZ2hsaWdodGluZyB0b29sKSBjYW4gdXNlIGFkZGl0aW9uYWwgc3R5bGVzIGZyb20gc2VwYXJhdGVseSBpbnN0YWxsZWQgcGFja2FnZXMgdGhyb3VnaCBgW3Byb2plY3QuZW50cnktcG9pbnRzLlwicHlnbWVudHMuc3R5bGVzXCJdYC4gRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIGVudHJ5LXBvaW50IGdyb3VwLCBhbmQgZWFjaCB2YWx1ZSBpcyBhIHRhYmxlIG9mIGVudHJ5IHBvaW50cy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNlbnRyeS1wb2ludHNcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5UG9pbnRzPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL2RlcGVuZGVuY3ktc3BlY2lmaWVycy8pIHN0cmluZ3MsIGVhY2ggcmVwcmVzZW50aW5nIGEgbWFuZGF0b3J5IGRlcGVuZGVudCBwYWNrYWdlIG9mIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2RlcGVuZGVuY2llc1xuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVhY2ggZW50cnkgaXMgYSBrZXkvdmFsdWUgcGFpciwgd2l0aCB0aGUga2V5IHNwZWNpZnlpbmcgW2V4dHJhIGZlYXR1cmUgbmFtZV0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvY29yZS1tZXRhZGF0YS8jcHJvdmlkZXMtZXh0cmEtbXVsdGlwbGUtdXNlKSAoc3VjaCBhcyBgc29ja3NgIGluIGByZXF1ZXN0c1tzb2Nrc11gKSwgYW5kIHZhbHVlIGlzIGFuIGFycmF5IG9mIFtkZXBlbmRlbmN5IHNwZWNpZmllcl0oaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc3BlY2lmaWNhdGlvbnMvZGVwZW5kZW5jeS1zcGVjaWZpZXJzLykgc3RyaW5ncy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNvcHRpb25hbC1kZXBlbmRlbmNpZXNcbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbmFsRGVwZW5kZW5jaWVzPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgdGhlIGltcG9ydCBuYW1lcyB0aGF0IHRoZSBwcm9qZWN0IGV4Y2x1c2l2ZWx5IHByb3ZpZGVzIHdoZW4gaW5zdGFsbGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxQcm9qZWN0I2ltcG9ydC1uYW1lc1xuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0TmFtZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIHRoZSBpbXBvcnQgbmFtZXMgdGhhdCB0aGUgcHJvamVjdCBwcm92aWRlcyB3aGVuIGluc3RhbGxlZCwgYnV0IG5vdCBleGNsdXNpdmVseS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdCNpbXBvcnQtbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgaW1wb3J0TmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hpY2gga2V5cyBhcmUgaW50ZW50aW9uYWxseSB1bnNwZWNpZmllZCB1bmRlciBgW3Byb2plY3RdYCB0YWJsZSBzbyBidWlsZCBiYWNrZW5kIGNhbi93aWxsIHByb3ZpZGUgc3VjaCBtZXRhZGF0YSBkeW5hbWljYWxseS4gRWFjaCBrZXkgbXVzdCBiZSBsaXN0ZWQgb25seSBvbmNlLiBJdCBpcyBhbiBlcnJvciB0byBib3RoIGxpc3QgYSBrZXkgaW4gYGR5bmFtaWNgIGFuZCB1c2UgdGhlIGtleSBkaXJlY3RseSBpbiBgW3Byb2plY3RdYC5cbiAgICogT25lIG9mIHRoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyBgdmVyc2lvbmAsIHdoaWNoIGFsbG93cyBidWlsZCBiYWNrZW5kIHRvIHJldHJpZXZlIHByb2plY3QgdmVyc2lvbiBmcm9tIHNvdXJjZSBjb2RlIG9yIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaW5zdGVhZCBvZiBoYXJkY29kaW5nIGl0IGluIGBweXByb2plY3QudG9tbGAuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFByb2plY3QjZHluYW1pY1xuICAgKi9cbiAgcmVhZG9ubHkgZHluYW1pYz86IFB5cHJvamVjdFRvbWxQcm9qZWN0RHluYW1pY1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sUHJvamVjdCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1B5cHJvamVjdFRvbWxQcm9qZWN0KG9iajogUHlwcm9qZWN0VG9tbFByb2plY3QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3ZlcnNpb24nOiBvYmoudmVyc2lvbixcbiAgICAnZGVzY3JpcHRpb24nOiBvYmouZGVzY3JpcHRpb24sXG4gICAgJ3JlYWRtZSc6IG9iai5yZWFkbWUsXG4gICAgJ3JlcXVpcmVzLXB5dGhvbic6IG9iai5yZXF1aXJlc1B5dGhvbixcbiAgICAnbGljZW5zZSc6IG9iai5saWNlbnNlLFxuICAgICdsaWNlbnNlLWZpbGVzJzogb2JqLmxpY2Vuc2VGaWxlcz8ubWFwKHkgPT4geSksXG4gICAgJ2F1dGhvcnMnOiBvYmouYXV0aG9ycz8ubWFwKHkgPT4gdG9Kc29uX1Byb2plY3RBdXRob3IoeSkpLFxuICAgICdtYWludGFpbmVycyc6IG9iai5tYWludGFpbmVycz8ubWFwKHkgPT4gdG9Kc29uX1Byb2plY3RBdXRob3IoeSkpLFxuICAgICdrZXl3b3Jkcyc6IG9iai5rZXl3b3Jkcz8ubWFwKHkgPT4geSksXG4gICAgJ2NsYXNzaWZpZXJzJzogb2JqLmNsYXNzaWZpZXJzPy5tYXAoeSA9PiB5KSxcbiAgICAndXJscyc6ICgob2JqLnVybHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai51cmxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnc2NyaXB0cyc6ICgob2JqLnNjcmlwdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5zY3JpcHRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnZ3VpLXNjcmlwdHMnOiAoKG9iai5ndWlTY3JpcHRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouZ3VpU2NyaXB0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2VudHJ5LXBvaW50cyc6IG9iai5lbnRyeVBvaW50cyxcbiAgICAnZGVwZW5kZW5jaWVzJzogb2JqLmRlcGVuZGVuY2llcz8ubWFwKHkgPT4geSksXG4gICAgJ29wdGlvbmFsLWRlcGVuZGVuY2llcyc6IG9iai5vcHRpb25hbERlcGVuZGVuY2llcyxcbiAgICAnaW1wb3J0LW5hbWVzJzogb2JqLmltcG9ydE5hbWVzPy5tYXAoeSA9PiB5KSxcbiAgICAnaW1wb3J0LW5hbWVzcGFjZXMnOiBvYmouaW1wb3J0TmFtZXNwYWNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2R5bmFtaWMnOiBvYmouZHluYW1pYz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBOYW1lZCBncm91cHMgb2YgZGVwZW5kZW5jaWVzLCBzaW1pbGFyIHRvIGByZXF1aXJlbWVudHMudHh0YCBmaWxlcywgd2hpY2ggbGF1bmNoZXJzLCBJREVzLCBhbmQgb3RoZXIgdG9vbHMgY2FuIGZpbmQgYW5kIGlkZW50aWZ5IGJ5IG5hbWUuIEVhY2ggaXRlbSBpbiBgW2RlcGVuZGVuY3ktZ3JvdXBzXWAgaXMgZGVmaW5lZCBhcyBtYXBwaW5nIG9mIGdyb3VwIG5hbWUgdG8gbGlzdCBvZiBbZGVwZW5kZW5jeSBzcGVjaWZpZXJzXShodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zcGVjaWZpY2F0aW9ucy9kZXBlbmRlbmN5LXNwZWNpZmllcnMvKS5cbiAqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxEZXBlbmRlbmN5R3JvdXBzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMge1xuICAvKipcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sRGVwZW5kZW5jeUdyb3VwcyNkZXZcbiAgICovXG4gIHJlYWRvbmx5IGRldj86IGFueVtdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQeXByb2plY3RUb21sRGVwZW5kZW5jeUdyb3VwcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1B5cHJvamVjdFRvbWxEZXBlbmRlbmN5R3JvdXBzKG9iajogUHlwcm9qZWN0VG9tbERlcGVuZGVuY3lHcm91cHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZXYnOiBvYmouZGV2Py5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlY2xhcmVzIGFueSBQeXRob24gbGV2ZWwgZGVwZW5kZW5jaWVzIHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgaW4gb3JkZXIgdG8gcnVuIHRoZSBwcm9qZWN04oCZcyBidWlsZCBzeXN0ZW0gc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIEBzY2hlbWEgQnVpbGRTeXN0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFN5c3RlbSB7XG4gIC8qKlxuICAgKiBMaXN0IG9mIHN0cmluZ3MgZm9sbG93aW5nIHRoZSB2ZXJzaW9uIHNwZWNpZmllciBzcGVjaWZpY2F0aW9uLCByZXByZXNlbnRpbmcgZGVwZW5kZW5jaWVzIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkIHN5c3RlbS5cbiAgICpcbiAgICogQHNjaGVtYSBCdWlsZFN5c3RlbSNyZXF1aXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTdHJpbmcgaXMgZm9ybWF0dGVkIGZvbGxvd2luZyB0aGUgc2FtZSBgbW9kdWxlOm9iamVjdGAgc3ludGF4IGFzIGEgYHNldHVwdG9vbHNgIGVudHJ5IHBvaW50LiBJdOKAmXMgYWxzbyBsZWdhbCB0byBsZWF2ZSBvdXQgdGhlIGA6b2JqZWN0YCBwYXJ0LlxuICAgKlxuICAgKiBAc2NoZW1hIEJ1aWxkU3lzdGVtI2J1aWxkLWJhY2tlbmRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQmFja2VuZD86IHN0cmluZztcblxuICAvKipcbiAgICogbGlzdCBvZiBkaXJlY3RvcmllcyB0byBwcmVwZW5kIHRvIGBzeXMucGF0aGAgd2hlbiBsb2FkaW5nIHRoZSBidWlsZCBiYWNrZW5kLCByZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3RcbiAgICpcbiAgICogQHNjaGVtYSBCdWlsZFN5c3RlbSNiYWNrZW5kLXBhdGhcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tlbmRQYXRoPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1aWxkU3lzdGVtJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQnVpbGRTeXN0ZW0ob2JqOiBCdWlsZFN5c3RlbSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3JlcXVpcmVzJzogb2JqLnJlcXVpcmVzPy5tYXAoeSA9PiB5KSxcbiAgICAnYnVpbGQtYmFja2VuZCc6IG9iai5idWlsZEJhY2tlbmQsXG4gICAgJ2JhY2tlbmQtcGF0aCc6IG9iai5iYWNrZW5kUGF0aD8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBFdmVyeSB0b29sIHRoYXQgaXMgdXNlZCBieSB0aGUgcHJvamVjdCBjYW4gaGF2ZSB1c2VycyBzcGVjaWZ5IGNvbmZpZ3VyYXRpb24gZGF0YSBhcyBsb25nIGFzIHRoZXkgdXNlIGEgc3ViLXRhYmxlIHdpdGhpbiBgW3Rvb2xdYC4gR2VuZXJhbGx5IGEgcHJvamVjdCBjYW4gdXNlIHRoZSBzdWJ0YWJsZSBgdG9vbC4kTkFNRWAgaWYsIGFuZCBvbmx5IGlmLCB0aGV5IG93biB0aGUgZW50cnkgZm9yIGAkTkFNRWAgaW4gdGhlIENoZWVzZXNob3AvUHlQSS5cbiAqXG4gKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHlwcm9qZWN0VG9tbFRvb2wge1xuICAvKipcbiAgICogVGhlIHVuY29tcHJvbWlzaW5nIFB5dGhvbiBjb2RlIGZvcm1hdHRlci5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNibGFja1xuICAgKi9cbiAgcmVhZG9ubHkgYmxhY2s/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIFB5dGhvbiB3aGVlbHMgZm9yIGFsbCBwbGF0Zm9ybXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjY2lidWlsZHdoZWVsXG4gICAqL1xuICByZWFkb25seSBjaWJ1aWxkd2hlZWw/OiBhbnk7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHN0YXRpYyB0eXBpbmcgZm9yIFB5dGhvbi5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNteXB5XG4gICAqL1xuICByZWFkb25seSBteXB5PzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBleHRyZW1lbHkgZmFzdCBQeXRob24gbGludGVyIGFuZCBmb3JtYXR0ZXIsIHdyaXR0ZW4gaW4gUnVzdC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNydWZmXG4gICAqL1xuICByZWFkb25seSBydWZmPzogYW55O1xuXG4gIC8qKlxuICAgKiBBbiBleHRyZW1lbHkgZmFzdCBQeXRob24gdHlwZSBjaGVja2VyLCB3cml0dGVuIGluIFJ1c3QuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjdHlcbiAgICovXG4gIHJlYWRvbmx5IHR5PzogYW55O1xuXG4gIC8qKlxuICAgKiBNb2Rlcm4sIGV4dGVuc2libGUgUHl0aG9uIHByb2plY3QgbWFuYWdlbWVudC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNoYXRjaFxuICAgKi9cbiAgcmVhZG9ubHkgaGF0Y2g/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuZCBwdWJsaXNoIGNyYXRlcyB3aXRoIHB5bzMsIGNmZmkgYW5kIHVuaWZmaSBiaW5kaW5ncyBhcyB3ZWxsIGFzIHJ1c3QgYmluYXJpZXMgYXMgcHl0aG9uIHBhY2thZ2VzXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjbWF0dXJpblxuICAgKi9cbiAgcmVhZG9ubHkgbWF0dXJpbj86IGFueTtcblxuICAvKipcbiAgICogSW1wcm92ZWQgYnVpbGQgc3lzdGVtIGdlbmVyYXRvciBmb3IgUHl0aG9uIEMvQysrL0ZvcnRyYW4gZXh0ZW5zaW9uc1xuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3NjaWtpdC1idWlsZFxuICAgKi9cbiAgcmVhZG9ubHkgc2Npa2l0QnVpbGQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIEVhc2lseSBkb3dubG9hZCwgYnVpbGQsIGluc3RhbGwsIHVwZ3JhZGUsIGFuZCB1bmluc3RhbGwgUHl0aG9uIHBhY2thZ2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3NldHVwdG9vbHNcbiAgICovXG4gIHJlYWRvbmx5IHNldHVwdG9vbHM/OiBhbnk7XG5cbiAgLyoqXG4gICAqIE1hbmFnZSBQeXRob24gcGFja2FnZSB2ZXJzaW9ucyB1c2luZyBTQ00gKGUuZy4gR2l0KS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNzZXR1cHRvb2xzX3NjbVxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dXB0b29sc1NjbT86IGFueTtcblxuICAvKipcbiAgICogQSB0YXNrIHJ1bm5lciB0aGF0IHdvcmtzIHdlbGwgd2l0aCBweXByb2plY3QudG9tbCBmaWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwb2VcbiAgICovXG4gIHJlYWRvbmx5IHBvZT86IGFueTtcblxuICAvKipcbiAgICogUHl0aG9uIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBhbmQgcGFja2FnaW5nIG1hZGUgZWFzeS5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwb2V0cnlcbiAgICovXG4gIHJlYWRvbmx5IHBvZXRyeT86IGFueTtcblxuICAvKipcbiAgICogQSBtb2Rlcm4gUHl0aG9uIHBhY2thZ2UgbWFuYWdlciB3aXRoIFBFUCA2MjEgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNwZG1cbiAgICovXG4gIHJlYWRvbmx5IHBkbT86IGFueTtcblxuICAvKipcbiAgICogU3RhdGljIHR5cGUgY2hlY2tlciBmb3IgUHl0aG9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3B5cmlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHB5cmlnaHQ/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFN0YW5kYXJkaXplZCBhdXRvbWF0ZWQgdGVzdGluZyBvZiBQeXRob24gcGFja2FnZXNcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCNweXRlc3RcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdD86IGFueTtcblxuICAvKipcbiAgICogUmV2aWV3IGEgcmVwb3NpdG9yeSBmb3IgYmVzdCBwcmFjdGljZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjcmVwby1yZXZpZXdcbiAgICovXG4gIHJlYWRvbmx5IHJlcG9SZXZpZXc/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wbGVtZW50YXJ5IHRhc2sgcnVubmVyIGZvciBweXRob24uXG4gICAqXG4gICAqIEBzY2hlbWEgUHlwcm9qZWN0VG9tbFRvb2wjdGFza2lweVxuICAgKi9cbiAgcmVhZG9ubHkgdGFza2lweT86IGFueTtcblxuICAvKipcbiAgICogVG9tYmkgaXMgYSB0b29sa2l0IGZvciBUT01MOyBwcm92aWRpbmcgYSBmb3JtYXR0ZXIvbGludGVyIGFuZCBsYW5ndWFnZSBzZXJ2ZXJcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCN0b21iaVxuICAgKi9cbiAgcmVhZG9ubHkgdG9tYmk/OiBhbnk7XG5cbiAgLyoqXG4gICAqIFN0YW5kYXJkaXplZCBhdXRvbWF0ZWQgdGVzdGluZyBvZiBQeXRob24gcGFja2FnZXNcbiAgICpcbiAgICogQHNjaGVtYSBQeXByb2plY3RUb21sVG9vbCN0b3hcbiAgICovXG4gIHJlYWRvbmx5IHRveD86IGFueTtcblxuICAvKipcbiAgICogQW4gZXh0cmVtZWx5IGZhc3QgUHl0aG9uIHBhY2thZ2UgaW5zdGFsbGVyIGFuZCByZXNvbHZlciwgd3JpdHRlbiBpbiBSdXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFB5cHJvamVjdFRvbWxUb29sI3V2XG4gICAqL1xuICByZWFkb25seSB1dj86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUHlwcm9qZWN0VG9tbFRvb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9QeXByb2plY3RUb21sVG9vbChvYmo6IFB5cHJvamVjdFRvbWxUb29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmxhY2snOiBvYmouYmxhY2ssXG4gICAgJ2NpYnVpbGR3aGVlbCc6IG9iai5jaWJ1aWxkd2hlZWwsXG4gICAgJ215cHknOiBvYmoubXlweSxcbiAgICAncnVmZic6IG9iai5ydWZmLFxuICAgICd0eSc6IG9iai50eSxcbiAgICAnaGF0Y2gnOiBvYmouaGF0Y2gsXG4gICAgJ21hdHVyaW4nOiBvYmoubWF0dXJpbixcbiAgICAnc2Npa2l0LWJ1aWxkJzogb2JqLnNjaWtpdEJ1aWxkLFxuICAgICdzZXR1cHRvb2xzJzogb2JqLnNldHVwdG9vbHMsXG4gICAgJ3NldHVwdG9vbHNfc2NtJzogb2JqLnNldHVwdG9vbHNTY20sXG4gICAgJ3BvZSc6IG9iai5wb2UsXG4gICAgJ3BvZXRyeSc6IG9iai5wb2V0cnksXG4gICAgJ3BkbSc6IG9iai5wZG0sXG4gICAgJ3B5cmlnaHQnOiBvYmoucHlyaWdodCxcbiAgICAncHl0ZXN0Jzogb2JqLnB5dGVzdCxcbiAgICAncmVwby1yZXZpZXcnOiBvYmoucmVwb1JldmlldyxcbiAgICAndGFza2lweSc6IG9iai50YXNraXB5LFxuICAgICd0b21iaSc6IG9iai50b21iaSxcbiAgICAndG94Jzogb2JqLnRveCxcbiAgICAndXYnOiBvYmoudXYsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIHByb2plY3RBdXRob3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0QXV0aG9yIHtcbiAgLyoqXG4gICAqIEBzY2hlbWEgcHJvamVjdEF1dGhvciNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIHByb2plY3RBdXRob3IjZW1haWxcbiAgICovXG4gIHJlYWRvbmx5IGVtYWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdQcm9qZWN0QXV0aG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUHJvamVjdEF1dGhvcihvYmo6IFByb2plY3RBdXRob3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ2VtYWlsJzogb2JqLmVtYWlsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBQeXByb2plY3RUb21sUHJvamVjdER5bmFtaWNcbiAqL1xuZXhwb3J0IGVudW0gUHlwcm9qZWN0VG9tbFByb2plY3REeW5hbWljIHtcbiAgLyoqIHZlcnNpb24gKi9cbiAgVkVSU0lPTiA9IFwidmVyc2lvblwiLFxuICAvKiogZGVzY3JpcHRpb24gKi9cbiAgREVTQ1JJUFRJT04gPSBcImRlc2NyaXB0aW9uXCIsXG4gIC8qKiByZWFkbWUgKi9cbiAgUkVBRE1FID0gXCJyZWFkbWVcIixcbiAgLyoqIHJlcXVpcmVzLXB5dGhvbiAqL1xuICBSRVFVSVJFU19IWVBIRU5fUFlUSE9OID0gXCJyZXF1aXJlcy1weXRob25cIixcbiAgLyoqIGxpY2Vuc2UgKi9cbiAgTElDRU5TRSA9IFwibGljZW5zZVwiLFxuICAvKiogbGljZW5zZS1maWxlcyAqL1xuICBMSUNFTlNFX0hZUEhFTl9GSUxFUyA9IFwibGljZW5zZS1maWxlc1wiLFxuICAvKiogYXV0aG9ycyAqL1xuICBBVVRIT1JTID0gXCJhdXRob3JzXCIsXG4gIC8qKiBtYWludGFpbmVycyAqL1xuICBNQUlOVEFJTkVSUyA9IFwibWFpbnRhaW5lcnNcIixcbiAgLyoqIGtleXdvcmRzICovXG4gIEtFWVdPUkRTID0gXCJrZXl3b3Jkc1wiLFxuICAvKiogY2xhc3NpZmllcnMgKi9cbiAgQ0xBU1NJRklFUlMgPSBcImNsYXNzaWZpZXJzXCIsXG4gIC8qKiB1cmxzICovXG4gIFVSTFMgPSBcInVybHNcIixcbiAgLyoqIHNjcmlwdHMgKi9cbiAgU0NSSVBUUyA9IFwic2NyaXB0c1wiLFxuICAvKiogZ3VpLXNjcmlwdHMgKi9cbiAgR1VJX0hZUEhFTl9TQ1JJUFRTID0gXCJndWktc2NyaXB0c1wiLFxuICAvKiogZW50cnktcG9pbnRzICovXG4gIEVOVFJZX0hZUEhFTl9QT0lOVFMgPSBcImVudHJ5LXBvaW50c1wiLFxuICAvKiogZGVwZW5kZW5jaWVzICovXG4gIERFUEVOREVOQ0lFUyA9IFwiZGVwZW5kZW5jaWVzXCIsXG4gIC8qKiBvcHRpb25hbC1kZXBlbmRlbmNpZXMgKi9cbiAgT1BUSU9OQUxfSFlQSEVOX0RFUEVOREVOQ0lFUyA9IFwib3B0aW9uYWwtZGVwZW5kZW5jaWVzXCIsXG4gIC8qKiBpbXBvcnQtbmFtZXMgKi9cbiAgSU1QT1JUX0hZUEhFTl9OQU1FUyA9IFwiaW1wb3J0LW5hbWVzXCIsXG4gIC8qKiBpbXBvcnQtbmFtZXNwYWNlcyAqL1xuICBJTVBPUlRfSFlQSEVOX05BTUVTUEFDRVMgPSBcImltcG9ydC1uYW1lc3BhY2VzXCIsXG59XG4iXX0=
@@ -37,5 +37,5 @@ class PytestSample extends __1.Component {
37
37
  }
38
38
  exports.PytestSample = PytestSample;
39
39
  _a = JSII_RTTI_SYMBOL_1;
40
- PytestSample[_a] = { fqn: "projen.python.PytestSample", version: "0.98.22" };
40
+ PytestSample[_a] = { fqn: "projen.python.PytestSample", version: "0.98.23" };
41
41
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0ZXN0LXNhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9weXRob24vcHl0ZXN0LXNhbXBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDBCQUEwQztBQWtCMUM7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxhQUFTO0lBQ3pDLFlBQVksT0FBZ0IsRUFBRSxPQUE0QjtRQUN4RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixJQUFJLGFBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLGlCQUFpQixFQUFFO29CQUNqQixlQUFlO29CQUNmLEVBQUU7b0JBQ0YsUUFBUSxPQUFPLENBQUMsVUFBVSx1QkFBdUI7b0JBQ2pELEVBQUU7b0JBQ0YsMkJBQTJCO29CQUMzQiwyQkFBMkI7b0JBQzNCLE9BQU87b0JBQ1AsNENBQTRDO29CQUM1QywwQ0FBMEM7b0JBQzFDLDBEQUEwRDtvQkFDMUQsUUFBUTtvQkFDUixHQUFHO29CQUNILGlDQUFpQztvQkFDakMsOENBQThDO29CQUM5QyxvQ0FBb0M7b0JBQ3BDLEVBQUU7aUJBQ0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2I7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTNCSCxvQ0E0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFNhbXBsZURpciB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcHl0aG9uIHRlc3QgY29kZSBzYW1wbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHl0ZXN0U2FtcGxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBweXRob24gcGFja2FnZSBhcyB1c2VkIGluIGltcG9ydHMgYW5kIGZpbGVuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGVzdCBkaXJlY3RvcnlcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gdGVzdCBjb2RlIHNhbXBsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFB5dGVzdFNhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFB5dGVzdFNhbXBsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIG5ldyBTYW1wbGVEaXIocHJvamVjdCwgb3B0aW9ucy50ZXN0ZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcIl9faW5pdF9fLnB5XCI6IFwiXCIsXG4gICAgICAgIFwidGVzdF9leGFtcGxlLnB5XCI6IFtcbiAgICAgICAgICBcImltcG9ydCBweXRlc3RcIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIGBmcm9tICR7b3B0aW9ucy5tb2R1bGVOYW1lfS5leGFtcGxlIGltcG9ydCBoZWxsb2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgICBcIkBweXRlc3QubWFyay5wYXJhbWV0cml6ZShcIixcbiAgICAgICAgICAnICAgIChcIm5hbWVcIiwgXCJleHBlY3RlZFwiKSwnLFxuICAgICAgICAgIFwiICAgIFtcIixcbiAgICAgICAgICAnICAgICAgICAoXCJBLiBNdXNpbmdcIiwgXCJIZWxsbyBBLiBNdXNpbmchXCIpLCcsXG4gICAgICAgICAgJyAgICAgICAgKFwidHJhdmVsZXJcIiwgXCJIZWxsbyB0cmF2ZWxlciFcIiksJyxcbiAgICAgICAgICAnICAgICAgICAoXCJwcm9qZW4gZGV2ZWxvcGVyXCIsIFwiSGVsbG8gcHJvamVuIGRldmVsb3BlciFcIiksJyxcbiAgICAgICAgICBcIiAgICBdLFwiLFxuICAgICAgICAgIFwiKVwiLFxuICAgICAgICAgIFwiZGVmIHRlc3RfaGVsbG8obmFtZSwgZXhwZWN0ZWQpOlwiLFxuICAgICAgICAgICcgICAgXCJcIlwiRXhhbXBsZSB0ZXN0IHdpdGggcGFyYW1ldHJpemF0aW9uLlwiXCJcIicsXG4gICAgICAgICAgXCIgICAgYXNzZXJ0IGhlbGxvKG5hbWUpID09IGV4cGVjdGVkXCIsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -23,5 +23,5 @@ class Pytest extends component_1.Component {
23
23
  }
24
24
  exports.Pytest = Pytest;
25
25
  _a = JSII_RTTI_SYMBOL_1;
26
- Pytest[_a] = { fqn: "projen.python.Pytest", version: "0.98.22" };
26
+ Pytest[_a] = { fqn: "projen.python.Pytest", version: "0.98.23" };
27
27
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B5dGhvbi9weXRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBeUM7QUFDekMsa0RBQWlEO0FBdUNqRCxNQUFhLE1BQU8sU0FBUSxxQkFBUztJQU9uQyxZQUFZLE9BQWdCLEVBQUUsVUFBeUIsRUFBRTtRQUN2RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFZixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUUzQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDO1FBRTFDLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFFekMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSw2QkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJFLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNuQjtZQUNFLFFBQVE7WUFDUixHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEUsR0FBRyxJQUFJLENBQUMsU0FBUztTQUNsQjthQUNFLElBQUksQ0FBQyxHQUFHLENBQUM7YUFDVCxPQUFPLEVBQUUsQ0FDYixDQUFDO0lBQ0osQ0FBQzs7QUEzQkgsd0JBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVR5cGUgfSBmcm9tIFwiLi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcblxuZXhwb3J0IGludGVyZmFjZSBQeXRlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFB5dGVzdCB2ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiNy40LjNcIlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTG9jYXRpb24gb2Ygc2FtcGxlIHRlc3RzLlxuICAgKiBUeXBpY2FsbHkgdGhlIHNhbWUgZGlyZWN0b3J5IHdoZXJlIHByb2plY3QgdGVzdHMgd2lsbCBiZSBsb2NhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcInRlc3RzXCJcbiAgICogQGRlcHJlY2F0ZWQgUmVmZXJlbmNlIGBzYW1wbGVUZXN0ZGlyYCBvbiB0aGUgcHJvamVjdCBpbnN0ZWFkOyB0byBjaGFuZ2UgdGhlIGRpcmVjdG9yeSB3aGVyZSB0ZXN0cyBhcmUgZGlzY292ZXJlZCBmcm9tLCB1c2UgYHRlc3RNYXRjaGAuXG4gICAqL1xuICByZWFkb25seSB0ZXN0ZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdG9wIHRoZSB0ZXN0aW5nIHByb2Nlc3MgYWZ0ZXIgdGhlIGZpcnN0IE4gZmFpbHVyZXNcbiAgICovXG4gIHJlYWRvbmx5IG1heEZhaWx1cmVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHBhdGhzIHRvIHRlc3QgZmlsZXMgb3IgZGlyZWN0b3JpZXMuXG4gICAqIFVzZWZ1bCB3aGVuIGFsbCBwcm9qZWN0IHRlc3RzIGFyZSBpbiBhIGtub3duIGxvY2F0aW9uIHRvIHNwZWVkIHVwXG4gICAqIHRlc3QgY29sbGVjdGlvbiBhbmQgdG8gYXZvaWQgcGlja2luZyB1cCB1bmRlc2lyZWQgdGVzdHMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIExlYXZlIGVtcHR5IHRvIGRpc2NvdmVyIGFsbCB0ZXN0XyoucHkgb3IgKl90ZXN0LnB5IGZpbGVzLCBwZXIgUHl0ZXN0IGRlZmF1bHQuXG4gICAqXG4gICAqIFRoZSBhcnJheSB3aWxsIGJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIGFzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHB5dGVzdC5cbiAgICogQGV4YW1wbGUgW1widGVzdHMvdW5pdFwiLCBcInRlc3RzL3FhXCJdXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSB0ZXN0TWF0Y2g/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFB5dGVzdCBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgYHNhbXBsZVRlc3RkaXJgIG9uIHRoZSBwcm9qZWN0IGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSB0ZXN0ZGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlc3RNYXRjaDogc3RyaW5nW107XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogUHl0ZXN0T3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCB2ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uID8/IFwiNy40LjNcIjtcblxuICAgIHRoaXMudGVzdGRpciA9IG9wdGlvbnMudGVzdGRpciA/PyBcInRlc3RzXCI7XG5cbiAgICB0aGlzLnRlc3RNYXRjaCA9IG9wdGlvbnMudGVzdE1hdGNoID8/IFtdO1xuXG4gICAgcHJvamVjdC5kZXBzLmFkZERlcGVuZGVuY3koYHB5dGVzdEAke3ZlcnNpb259YCwgRGVwZW5kZW5jeVR5cGUuVEVTVCk7XG5cbiAgICBwcm9qZWN0LnRlc3RUYXNrLmV4ZWMoXG4gICAgICBbXG4gICAgICAgIFwicHl0ZXN0XCIsXG4gICAgICAgIC4uLihvcHRpb25zLm1heEZhaWx1cmVzID8gW2AtLW1heGZhaWw9JHtvcHRpb25zLm1heEZhaWx1cmVzfWBdIDogW10pLFxuICAgICAgICAuLi50aGlzLnRlc3RNYXRjaCxcbiAgICAgIF1cbiAgICAgICAgLmpvaW4oXCIgXCIpXG4gICAgICAgIC50cmltRW5kKClcbiAgICApO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,6 @@
1
1
  import { PoetryPyprojectOptionsWithoutDeps } from "./poetry";
2
2
  import { Task } from "../task";
3
+ import { UvOptions } from "./uv";
3
4
  export interface IPythonPackaging {
4
5
  /**
5
6
  * A task that uploads the package to a package repository.
@@ -59,4 +60,8 @@ export interface PythonPackagingOptions {
59
60
  * Additional options to set for poetry if using poetry
60
61
  */
61
62
  readonly poetryOptions?: PoetryPyprojectOptionsWithoutDeps;
63
+ /**
64
+ * Additional options to set for uv if using uv
65
+ */
66
+ readonly uvOptions?: UvOptions;
62
67
  }
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXBhY2thZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9weXRob24vcHl0aG9uLXBhY2thZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9ldHJ5UHlwcm9qZWN0T3B0aW9uc1dpdGhvdXREZXBzIH0gZnJvbSBcIi4vcG9ldHJ5XCI7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSBcIi4uL3Rhc2tcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUHl0aG9uUGFja2FnaW5nIHtcbiAgLyoqXG4gICAqIEEgdGFzayB0aGF0IHVwbG9hZHMgdGhlIHBhY2thZ2UgdG8gYSBwYWNrYWdlIHJlcG9zaXRvcnkuXG4gICAqL1xuICByZWFkb25seSBwdWJsaXNoVGFzazogVGFzaztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQeXRob25QYWNrYWdpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEF1dGhvcidzIG5hbWVcbiAgICpcbiAgICogQGRlZmF1bHQgJEdJVF9VU0VSX05BTUVcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvck5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUGFja2FnZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGhvcidzIGUtbWFpbFxuICAgKlxuICAgKiBAZGVmYXVsdCAkR0lUX1VTRVJfRU1BSUxcbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvckVtYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhlIHBhY2thZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiMC4xLjBcIlxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2FnZS5cbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogTGljZW5zZSBvZiB0aGlzIHBhY2thZ2UgYXMgYW4gU1BEWCBpZGVudGlmaWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbGljZW5zZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBVUkwgdG8gdGhlIHdlYnNpdGUgb2YgdGhlIHByb2plY3QuXG4gICAqL1xuICByZWFkb25seSBob21lcGFnZT86IHN0cmluZztcblxuICAvKipcbiAgICogQSBsaXN0IG9mIFB5UEkgdHJvdmUgY2xhc3NpZmllcnMgdGhhdCBkZXNjcmliZSB0aGUgcHJvamVjdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL3B5cGkub3JnL2NsYXNzaWZpZXJzL1xuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3NpZmllcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWVsZHMgdG8gcGFzcyBpbiB0aGUgc2V0dXAoKSBmdW5jdGlvbiBpZiB1c2luZyBzZXR1cHRvb2xzXG4gICAqL1xuICByZWFkb25seSBzZXR1cENvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBzZXQgZm9yIHBvZXRyeSBpZiB1c2luZyBwb2V0cnlcbiAgICovXG4gIHJlYWRvbmx5IHBvZXRyeU9wdGlvbnM/OiBQb2V0cnlQeXByb2plY3RPcHRpb25zV2l0aG91dERlcHM7XG59XG4iXX0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXBhY2thZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9weXRob24vcHl0aG9uLXBhY2thZ2luZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9ldHJ5UHlwcm9qZWN0T3B0aW9uc1dpdGhvdXREZXBzIH0gZnJvbSBcIi4vcG9ldHJ5XCI7XG5pbXBvcnQgeyBUYXNrIH0gZnJvbSBcIi4uL3Rhc2tcIjtcbmltcG9ydCB7IFV2T3B0aW9ucyB9IGZyb20gXCIuL3V2XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVB5dGhvblBhY2thZ2luZyB7XG4gIC8qKlxuICAgKiBBIHRhc2sgdGhhdCB1cGxvYWRzIHRoZSBwYWNrYWdlIHRvIGEgcGFja2FnZSByZXBvc2l0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGlzaFRhc2s6IFRhc2s7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uUGFja2FnaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBdXRob3IncyBuYW1lXG4gICAqXG4gICAqIEBkZWZhdWx0ICRHSVRfVVNFUl9OQU1FXG4gICAqL1xuICByZWFkb25seSBhdXRob3JOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRob3IncyBlLW1haWxcbiAgICpcbiAgICogQGRlZmF1bHQgJEdJVF9VU0VSX0VNQUlMXG4gICAqL1xuICByZWFkb25seSBhdXRob3JFbWFpbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBwYWNrYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIjAuMS4wXCJcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UuXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpY2Vuc2Ugb2YgdGhpcyBwYWNrYWdlIGFzIGFuIFNQRFggaWRlbnRpZmllci5cbiAgICovXG4gIHJlYWRvbmx5IGxpY2Vuc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgVVJMIHRvIHRoZSB3ZWJzaXRlIG9mIHRoZSBwcm9qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaG9tZXBhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBQeVBJIHRyb3ZlIGNsYXNzaWZpZXJzIHRoYXQgZGVzY3JpYmUgdGhlIHByb2plY3QuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9weXBpLm9yZy9jbGFzc2lmaWVycy9cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzaWZpZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZmllbGRzIHRvIHBhc3MgaW4gdGhlIHNldHVwKCkgZnVuY3Rpb24gaWYgdXNpbmcgc2V0dXB0b29sc1xuICAgKi9cbiAgcmVhZG9ubHkgc2V0dXBDb25maWc/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gc2V0IGZvciBwb2V0cnkgaWYgdXNpbmcgcG9ldHJ5XG4gICAqL1xuICByZWFkb25seSBwb2V0cnlPcHRpb25zPzogUG9ldHJ5UHlwcm9qZWN0T3B0aW9uc1dpdGhvdXREZXBzO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gc2V0IGZvciB1diBpZiB1c2luZyB1dlxuICAgKi9cbiAgcmVhZG9ubHkgdXZPcHRpb25zPzogVXZPcHRpb25zO1xufVxuIl19
@@ -85,6 +85,14 @@ export interface PythonProjectOptions extends GitHubProjectOptions, PythonPackag
85
85
  * @featured
86
86
  */
87
87
  readonly poetry?: boolean;
88
+ /**
89
+ * Use uv to manage your project dependencies, virtual environment, and
90
+ * (optional) packaging/publishing.
91
+ *
92
+ * @default false
93
+ * @featured
94
+ */
95
+ readonly uv?: boolean;
88
96
  /**
89
97
  * Include pytest tests.
90
98
  * @default true
@@ -170,7 +178,7 @@ export declare class PythonProject extends GitHubProject {
170
178
  */
171
179
  readonly depsManager: IPythonDeps;
172
180
  /**
173
- * API for mangaging the Python runtime environment.
181
+ * API for managing the Python runtime environment.
174
182
  */
175
183
  readonly envManager: IPythonEnv;
176
184
  /**
@@ -187,6 +195,7 @@ export declare class PythonProject extends GitHubProject {
187
195
  */
188
196
  readonly sampleTestdir: string;
189
197
  constructor(options: PythonProjectOptions);
198
+ private checkToolConflicts;
190
199
  /**
191
200
  * Adds default gitignore options for a Python project based on
192
201
  * https://github.com/github/gitignore/blob/master/Python.gitignore
@@ -10,6 +10,7 @@ const pytest_1 = require("./pytest");
10
10
  const pytest_sample_1 = require("./pytest-sample");
11
11
  const python_sample_1 = require("./python-sample");
12
12
  const setuptools_1 = require("./setuptools");
13
+ const uv_1 = require("./uv");
13
14
  const venv_1 = require("./venv");
14
15
  const github_1 = require("../github");
15
16
  const projenrc_2 = require("../javascript/projenrc");
@@ -42,12 +43,21 @@ class PythonProject extends github_1.GitHubProject {
42
43
  throw new Error("Only one of projenrcPython, projenrcJs, projenrcTs, and projenrcJson can be selected.");
43
44
  }
44
45
  const poetry = options.poetry ?? false;
45
- const pip = options.pip ?? !poetry;
46
- const venv = options.venv ?? !poetry;
47
- const setuptools = options.setuptools ?? (!poetry && this.projectType === project_1.ProjectType.LIB);
48
- if (poetry && (pip || venv || setuptools)) {
49
- throw new Error("poetry is true - pip, venv, and setuptools must be undefined or false");
50
- }
46
+ const uv = options.uv ?? false;
47
+ const not_poetry_or_uv = !poetry && !uv;
48
+ // Assume pip if not using poetry or uv
49
+ const pip = options.pip ?? not_poetry_or_uv;
50
+ // Assume venv if not using poetry or uv
51
+ const venv = options.venv ?? not_poetry_or_uv;
52
+ const setuptools = options.setuptools ??
53
+ (not_poetry_or_uv && this.projectType === project_1.ProjectType.LIB);
54
+ const tools = {
55
+ poetry: poetry,
56
+ pip: pip,
57
+ venv: venv,
58
+ setuptools: setuptools,
59
+ uv: uv,
60
+ };
51
61
  if (!this.parent) {
52
62
  // default to projenrc.py if no other projenrc type was elected
53
63
  if (options.projenrcPython ?? !(0, util_1.anySelected)(rcFileTypeOptions)) {
@@ -85,7 +95,40 @@ class PythonProject extends github_1.GitHubProject {
85
95
  pythonExec: options.pythonExec,
86
96
  });
87
97
  }
98
+ if (uv) {
99
+ // uv cannot be used with other tools.
100
+ this.checkToolConflicts("uv", tools);
101
+ const uvProject = new uv_1.Uv(this, {
102
+ project: {
103
+ name: options.name,
104
+ version: options.version,
105
+ description: options.description,
106
+ readme: options.readme?.filename ?? "README.md",
107
+ license: options.license,
108
+ authors: options.authorName
109
+ ? [{ name: options.authorName, email: options.authorEmail }]
110
+ : [],
111
+ classifiers: options.classifiers,
112
+ urls: options.homepage
113
+ ? {
114
+ homepage: options.homepage,
115
+ }
116
+ : undefined,
117
+ ...options.uvOptions?.project, // takes priority
118
+ },
119
+ buildSystem: options.uvOptions?.buildSystem,
120
+ uv: options.uvOptions?.uv,
121
+ });
122
+ this.depsManager = uvProject;
123
+ this.envManager = uvProject;
124
+ this.packagingManager = uvProject;
125
+ }
126
+ else if (options.uvOptions) {
127
+ throw new Error("uvOptions only applies when using uv.");
128
+ }
88
129
  if (poetry) {
130
+ // poetry cannot be used with other tools.
131
+ this.checkToolConflicts("poetry", tools);
89
132
  const poetryProject = new poetry_1.Poetry(this, {
90
133
  version: options.version,
91
134
  description: options.description,
@@ -144,6 +187,17 @@ class PythonProject extends github_1.GitHubProject {
144
187
  }
145
188
  this.addDefaultGitIgnore();
146
189
  }
190
+ checkToolConflicts(activeToolName, tools) {
191
+ if (tools[activeToolName]) {
192
+ // Collect names of other enabled tools excluding the active tool itself
193
+ const conflicts = Object.entries(tools)
194
+ .filter(([name, enabled]) => name !== activeToolName && enabled)
195
+ .map(([name]) => name);
196
+ if (conflicts.length) {
197
+ throw new Error(`${activeToolName} cannot be used together with other tools, found the following incompatible tools enabled: ${conflicts.join(", ")}`);
198
+ }
199
+ }
200
+ }
147
201
  /**
148
202
  * Adds default gitignore options for a Python project based on
149
203
  * https://github.com/github/gitignore/blob/master/Python.gitignore
@@ -175,5 +229,5 @@ class PythonProject extends github_1.GitHubProject {
175
229
  }
176
230
  exports.PythonProject = PythonProject;
177
231
  _a = JSII_RTTI_SYMBOL_1;
178
- PythonProject[_a] = { fqn: "projen.python.PythonProject", version: "0.98.22" };
179
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHl0aG9uL3B5dGhvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQTRCO0FBQzVCLHFDQUFrQztBQUNsQyx5Q0FHb0I7QUFDcEIscUNBQWlEO0FBQ2pELG1EQUErQztBQUkvQyxtREFBK0M7QUFDL0MsNkNBQTBDO0FBQzFDLGlDQUEyQztBQUMzQyxzQ0FBZ0U7QUFDaEUscURBR2dDO0FBQ2hDLHdDQUF5QztBQUN6Qyw4Q0FBOEQ7QUFDOUQsa0NBQXdEO0FBRXhELGlEQUFpRDtBQUNqRCxNQUFNLHlCQUF5QixHQUFHLG9CQUFvQixDQUFDO0FBK0t2RDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsc0JBQWE7SUFzQzlDLFlBQVksT0FBNkI7UUFDdkMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksS0FBSyxDQUNiLHlGQUF5RixDQUMxRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQztRQUV0RCxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLE9BQU8sQ0FBQyxjQUFjO1lBQ3RCLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxZQUFZO1lBQ3BCLE9BQU8sQ0FBQyxVQUFVO1NBQ25CLENBQUM7UUFFRixJQUFJLElBQUEsdUJBQWdCLEVBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ2Is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eSB9IGZyb20gXCIuL3BvZXRyeVwiO1xuaW1wb3J0IHtcbiAgUHJvamVucmMgYXMgUHJvamVucmNQeXRob24sXG4gIFByb2plbnJjT3B0aW9ucyBhcyBQcm9qZW5yY1B5dGhvbk9wdGlvbnMsXG59IGZyb20gXCIuL3Byb2plbnJjXCI7XG5pbXBvcnQgeyBQeXRlc3QsIFB5dGVzdE9wdGlvbnMgfSBmcm9tIFwiLi9weXRlc3RcIjtcbmltcG9ydCB7IFB5dGVzdFNhbXBsZSB9IGZyb20gXCIuL3B5dGVzdC1zYW1wbGVcIjtcbmltcG9ydCB7IElQeXRob25EZXBzIH0gZnJvbSBcIi4vcHl0aG9uLWRlcHNcIjtcbmltcG9ydCB7IElQeXRob25FbnYgfSBmcm9tIFwiLi9weXRob24tZW52XCI7XG5pbXBvcnQgeyBJUHl0aG9uUGFja2FnaW5nLCBQeXRob25QYWNrYWdpbmdPcHRpb25zIH0gZnJvbSBcIi4vcHl0aG9uLXBhY2thZ2luZ1wiO1xuaW1wb3J0IHsgUHl0aG9uU2FtcGxlIH0gZnJvbSBcIi4vcHl0aG9uLXNhbXBsZVwiO1xuaW1wb3J0IHsgU2V0dXB0b29scyB9IGZyb20gXCIuL3NldHVwdG9vbHNcIjtcbmltcG9ydCB7IFZlbnYsIFZlbnZPcHRpb25zIH0gZnJvbSBcIi4vdmVudlwiO1xuaW1wb3J0IHsgR2l0SHViUHJvamVjdCwgR2l0SHViUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi4vZ2l0aHViXCI7XG5pbXBvcnQge1xuICBQcm9qZW5yYyBhcyBQcm9qZW5yY0pzLFxuICBQcm9qZW5yY09wdGlvbnMgYXMgUHJvamVucmNKc09wdGlvbnMsXG59IGZyb20gXCIuLi9qYXZhc2NyaXB0L3Byb2plbnJjXCI7XG5pbXBvcnQgeyBQcm9qZWN0VHlwZSB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgeyBQcm9qZW5yY1RzLCBQcm9qZW5yY1RzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBhbnlTZWxlY3RlZCwgbXVsdGlwbGVTZWxlY3RlZCB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKiBBbGxvd2VkIGNoYXJhY3RlcnMgaW4gcHl0aG9uIHByb2plY3QgbmFtZXMgKi9cbmNvbnN0IFBZVEhPTl9QUk9KRUNUX05BTUVfUkVHRVggPSAvXltBLVphLXowLTktX1xcLl0rJC87XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uRXhlY3V0YWJsZU9wdGlvbnMge1xuICAvKipcbiAgICogUGF0aCB0byB0aGUgcHl0aG9uIGV4ZWN1dGFibGUgdG8gdXNlLlxuICAgKiBAZGVmYXVsdCBcInB5dGhvblwiXG4gICAqL1xuICByZWFkb25seSBweXRob25FeGVjPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBQeXRob25Qcm9qZWN0YC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXRob25Qcm9qZWN0T3B0aW9uc1xuICBleHRlbmRzIEdpdEh1YlByb2plY3RPcHRpb25zLFxuICAgIFB5dGhvblBhY2thZ2luZ09wdGlvbnMsXG4gICAgUHl0aG9uRXhlY3V0YWJsZU9wdGlvbnMge1xuICAvLyAtLSByZXF1aXJlZCBvcHRpb25zIC0tXG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHB5dGhvbiBwYWNrYWdlIGFzIHVzZWQgaW4gaW1wb3J0cyBhbmQgZmlsZW5hbWVzLlxuICAgKlxuICAgKiBNdXN0IG9ubHkgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0ICRQWVRIT05fTU9EVUxFX05BTUVcbiAgICovXG4gIHJlYWRvbmx5IG1vZHVsZU5hbWU6IHN0cmluZztcblxuICAvLyAtLSBkZXBlbmRlbmNpZXMgLS1cblxuICAvKipcbiAgICogTGlzdCBvZiBydW50aW1lIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBwcm9qZWN0LlxuICAgKlxuICAgKiBEZXBlbmRlbmNpZXMgdXNlIHRoZSBmb3JtYXQ6IGA8bW9kdWxlPkA8c2VtdmVyPmBcbiAgICpcbiAgICogQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgY2FuIGJlIGFkZGVkIHZpYSBgcHJvamVjdC5hZGREZXBlbmRlbmN5KClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IGRlcHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBkZXYgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHByb2plY3QuXG4gICAqXG4gICAqIERlcGVuZGVuY2llcyB1c2UgdGhlIGZvcm1hdDogYDxtb2R1bGU+QDxzZW12ZXI+YFxuICAgKlxuICAgKiBBZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBjYW4gYmUgYWRkZWQgdmlhIGBwcm9qZWN0LmFkZERldkRlcGVuZGVuY3koKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2RGVwcz86IHN0cmluZ1tdO1xuXG4gIC8vIC0tIGNvcmUgY29tcG9uZW50cyAtLVxuXG4gIC8qKlxuICAgKiBVc2UgcGlwIHdpdGggYSByZXF1aXJlbWVudHMudHh0IGZpbGUgdG8gdHJhY2sgcHJvamVjdCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSwgdW5sZXNzIHBvZXRyeSBpcyB0cnVlLCB0aGVuIGZhbHNlXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcGlwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIHZlbnYgdG8gbWFuYWdlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBmb3IgaW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgaW5zaWRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWUsIHVubGVzcyBwb2V0cnkgaXMgdHJ1ZSwgdGhlbiBmYWxzZVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHZlbnY/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWZW52IG9wdGlvbnNcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgdmVudk9wdGlvbnM/OiBWZW52T3B0aW9ucztcblxuICAvKipcbiAgICogVXNlIHNldHVwdG9vbHMgd2l0aCBhIHNldHVwLnB5IHNjcmlwdCBmb3IgcGFja2FnaW5nIGFuZCBwdWJsaXNoaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWUsIHVubGVzcyBwb2V0cnkgaXMgdHJ1ZSwgdGhlbiBmYWxzZVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHNldHVwdG9vbHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgcG9ldHJ5IHRvIG1hbmFnZSB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzLCB2aXJ0dWFsIGVudmlyb25tZW50LCBhbmRcbiAgICogKG9wdGlvbmFsKSBwYWNrYWdpbmcvcHVibGlzaGluZy5cbiAgICpcbiAgICogVGhpcyBmZWF0dXJlIGlzIGluY29tcGF0aWJsZSB3aXRoIHBpcCwgc2V0dXB0b29scywgb3IgdmVudi5cbiAgICogSWYgeW91IHNldCB0aGlzIG9wdGlvbiB0byBgdHJ1ZWAsIHRoZW4gcGlwLCBzZXR1cHRvb2xzLCBhbmQgdmVudiBtdXN0IGJlIHNldCB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHBvZXRyeT86IGJvb2xlYW47XG5cbiAgLy8gLS0gb3B0aW9uYWwgY29tcG9uZW50cyAtLVxuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHB5dGVzdCB0ZXN0cy5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHB5dGVzdCBvcHRpb25zXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdE9wdGlvbnM/OiBQeXRlc3RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHNhbXBsZSBjb2RlIGFuZCB0ZXN0IGlmIHRoZSByZWxldmFudCBkaXJlY3RvcmllcyBkb24ndCBleGlzdC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTG9jYXRpb24gb2Ygc2FtcGxlIHRlc3RzLlxuICAgKiBUeXBpY2FsbHkgdGhlIHNhbWUgZGlyZWN0b3J5IHdoZXJlIHByb2plY3QgdGVzdHMgd2lsbCBiZSBsb2NhdGVkLlxuICAgKiBAZGVmYXVsdCBcInRlc3RzXCJcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZVRlc3RkaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSBwcm9qZW5yYyBpbiBQeXRob24uXG4gICAqXG4gICAqIFRoaXMgd2lsbCBpbnN0YWxsIGBwcm9qZW5gIGFzIGEgUHl0aG9uIGRlcGVuZGVuY3kgYW5kIGFkZCBhIGBzeW50aGBcbiAgICogdGFzayB3aGljaCB3aWxsIHJ1biBgLnByb2plbnJjLnB5YC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNQeXRob24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHJlbGF0ZWQgdG8gcHJvamVucmMgaW4gcHl0aG9uLlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNQeXRob25PcHRpb25zPzogUHJvamVucmNQeXRob25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBVc2UgcHJvamVucmMgaW4gamF2YXNjcmlwdC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGluc3RhbGwgYHByb2plbmAgYXMgYSBKYXZhU2NyaXB0IGRlcGVuZGVuY3kgYW5kIGFkZCBhIGBzeW50aGBcbiAgICogdGFzayB3aGljaCB3aWxsIHJ1biBgLnByb2plbnJjLmpzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjSnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHJlbGF0ZWQgdG8gcHJvamVucmMgaW4gSmF2YVNjcmlwdC5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjSnNPcHRpb25zPzogUHJvamVucmNKc09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFVzZSBwcm9qZW5yYyBpbiBUeXBlU2NyaXB0LlxuICAgKlxuICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgdHNjb25maWcgZmlsZSAoZGVmYXVsdDogYHRzY29uZmlnLnByb2plbi5qc29uYClcbiAgICogYW5kIHVzZSBgdHMtbm9kZWAgaW4gdGhlIGRlZmF1bHQgdGFzayB0byBwYXJzZSB0aGUgcHJvamVjdCBzb3VyY2UgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5yY1RzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyByZWxhdGVkIHRvIHByb2plbnJjIGluIFR5cGVTY3JpcHQuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5yY1RzT3B0aW9ucz86IFByb2plbnJjVHNPcHRpb25zO1xufVxuXG4vKipcbiAqIFB5dGhvbiBwcm9qZWN0LlxuICpcbiAqIEBwamlkIHB5dGhvblxuICovXG5leHBvcnQgY2xhc3MgUHl0aG9uUHJvamVjdCBleHRlbmRzIEdpdEh1YlByb2plY3Qge1xuICAvKipcbiAgICogUHl0aG9uIG1vZHVsZSBuYW1lICh0aGUgcHJvamVjdCBuYW1lLCB3aXRoIGFueSBoeXBoZW5zIG9yIHBlcmlvZHMgcmVwbGFjZWRcbiAgICogd2l0aCB1bmRlcnNjb3JlcykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGZvciBkaXN0cmlidXRpb24gKHNob3VsZCBmb2xsb3cgc2VtdmVyKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBmb3IgbWFuYWdpbmcgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlcHNNYW5hZ2VyITogSVB5dGhvbkRlcHM7XG5cbiAgLyoqXG4gICAqIEFQSSBmb3IgbWFuZ2FnaW5nIHRoZSBQeXRob24gcnVudGltZSBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbnZNYW5hZ2VyITogSVB5dGhvbkVudjtcblxuICAvKipcbiAgICogQVBJIGZvciBtYW5hZ2luZyBwYWNrYWdpbmcgdGhlIHByb2plY3QgYXMgYSBsaWJyYXJ5LiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgYHByb2plY3RUeXBlYCBpcyBMSUIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFja2FnaW5nTWFuYWdlcj86IElQeXRob25QYWNrYWdpbmc7XG5cbiAgLyoqXG4gICAqIFB5dGVzdCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgcHl0ZXN0PzogUHl0ZXN0O1xuXG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgc2FtcGxlIHRlc3RzIGFyZSBsb2NhdGVkLlxuICAgKiBAZGVmYXVsdCBcInRlc3RzXCJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzYW1wbGVUZXN0ZGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUHl0aG9uUHJvamVjdE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIGlmICghUFlUSE9OX1BST0pFQ1RfTkFNRV9SRUdFWC50ZXN0KG9wdGlvbnMubmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJQeXRob24gcHJvamVjdHMgbXVzdCBvbmx5IGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3Jlcy5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm1vZHVsZU5hbWUgPSBvcHRpb25zLm1vZHVsZU5hbWU7XG4gICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgIHRoaXMuc2FtcGxlVGVzdGRpciA9IG9wdGlvbnMuc2FtcGxlVGVzdGRpciA/PyBcInRlc3RzXCI7XG5cbiAgICBjb25zdCByY0ZpbGVUeXBlT3B0aW9ucyA9IFtcbiAgICAgIG9wdGlvbnMucHJvamVucmNQeXRob24sXG4gICAgICBvcHRpb25zLnByb2plbnJjSnMsXG4gICAgICBvcHRpb25zLnByb2plbnJjSnNvbixcbiAgICAgIG9wdGlvbnMucHJvamVucmNUcyxcbiAgICBdO1xuXG4gICAgaWYgKG11bHRpcGxlU2VsZWN0ZWQocmNGaWxlVHlwZU9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiT25seSBvbmUgb2YgcHJvamVucmNQeXRob24sIHByb2plbnJjSnMsIHByb2plbnJjVHMsIGFuZCBwcm9qZW5yY0pzb24gY2FuIGJlIHNlbGVjdGVkLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBvZXRyeSA9IG9wdGlvbnMucG9ldHJ5ID8/IGZhbHNlO1xuICAgIGNvbnN0IHBpcCA9IG9wdGlvbnMucGlwID8/ICFwb2V0cnk7XG4gICAgY29uc3QgdmVudiA9IG9wdGlvbnMudmVudiA/PyAhcG9ldHJ5O1xuICAgIGNvbnN0IHNldHVwdG9vbHMgPVxuICAgICAgb3B0aW9ucy5zZXR1cHRvb2xzID8/ICghcG9ldHJ5ICYmIHRoaXMucHJvamVjdFR5cGUgPT09IFByb2plY3RUeXBlLkxJQik7XG5cbiAgICBpZiAocG9ldHJ5ICYmIChwaXAgfHwgdmVudiB8fCBzZXR1cHRvb2xzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInBvZXRyeSBpcyB0cnVlIC0gcGlwLCB2ZW52LCBhbmQgc2V0dXB0b29scyBtdXN0IGJlIHVuZGVmaW5lZCBvciBmYWxzZVwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIC8vIGRlZmF1bHQgdG8gcHJvamVucmMucHkgaWYgbm8gb3RoZXIgcHJvamVucmMgdHlwZSB3YXMgZWxlY3RlZFxuICAgICAgaWYgKG9wdGlvbnMucHJvamVucmNQeXRob24gPz8gIWFueVNlbGVjdGVkKHJjRmlsZVR5cGVPcHRpb25zKSkge1xuICAgICAgICBuZXcgUHJvamVucmNQeXRob24odGhpcywge1xuICAgICAgICAgIHB5dGhvbkV4ZWM6IG9wdGlvbnMucHl0aG9uRXhlYyxcbiAgICAgICAgICAuLi5vcHRpb25zLnByb2plbnJjUHl0aG9uT3B0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnByb2plbnJjSnMgPz8gZmFsc2UpIHtcbiAgICAgICAgbmV3IFByb2plbnJjSnModGhpcywgb3B0aW9ucy5wcm9qZW5yY0pzT3B0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnByb2plbnJjVHMgPz8gZmFsc2UpIHtcbiAgICAgICAgbmV3IFByb2plbnJjVHModGhpcywgb3B0aW9ucy5wcm9qZW5yY1RzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZlbnYpIHtcbiAgICAgIHRoaXMuZW52TWFuYWdlciA9IG5ldyBWZW52KHRoaXMsIHtcbiAgICAgICAgcHl0aG9uRXhlYzogb3B0aW9ucy5weXRob25FeGVjLFxuICAgICAgICAuLi5vcHRpb25zLnZlbnZPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHBpcCkge1xuICAgICAgdGhpcy5kZXBzTWFuYWdlciA9IG5ldyBQaXAodGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHNldHVwdG9vbHMpIHtcbiAgICAgIHRoaXMucGFja2FnaW5nTWFuYWdlciA9IG5ldyBTZXR1cHRvb2xzKHRoaXMsIHtcbiAgICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgYXV0aG9yTmFtZTogb3B0aW9ucy5hdXRob3JOYW1lLFxuICAgICAgICBhdXRob3JFbWFpbDogb3B0aW9ucy5hdXRob3JFbWFpbCxcbiAgICAgICAgbGljZW5zZTogb3B0aW9ucy5saWNlbnNlLFxuICAgICAgICBob21lcGFnZTogb3B0aW9ucy5ob21lcGFnZSxcbiAgICAgICAgY2xhc3NpZmllcnM6IG9wdGlvbnMuY2xhc3NpZmllcnMsXG4gICAgICAgIHNldHVwQ29uZmlnOiBvcHRpb25zLnNldHVwQ29uZmlnLFxuICAgICAgICBweXRob25FeGVjOiBvcHRpb25zLnB5dGhvbkV4ZWMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocG9ldHJ5KSB7XG4gICAgICBjb25zdCBwb2V0cnlQcm9qZWN0ID0gbmV3IFBvZXRyeSh0aGlzLCB7XG4gICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGF1dGhvck5hbWU6IG9wdGlvbnMuYXV0aG9yTmFtZSxcbiAgICAgICAgYXV0aG9yRW1haWw6IG9wdGlvbnMuYXV0aG9yRW1haWwsXG4gICAgICAgIGxpY2Vuc2U6IG9wdGlvbnMubGljZW5zZSxcbiAgICAgICAgaG9tZXBhZ2U6IG9wdGlvbnMuaG9tZXBhZ2UsXG4gICAgICAgIGNsYXNzaWZpZXJzOiBvcHRpb25zLmNsYXNzaWZpZXJzLFxuICAgICAgICBweXRob25FeGVjOiBvcHRpb25zLnB5dGhvbkV4ZWMsXG4gICAgICAgIHBvZXRyeU9wdGlvbnM6IHtcbiAgICAgICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lPy5maWxlbmFtZSA/PyBcIlJFQURNRS5tZFwiLFxuICAgICAgICAgIC4uLm9wdGlvbnMucG9ldHJ5T3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzTWFuYWdlciA9IHBvZXRyeVByb2plY3Q7XG4gICAgICB0aGlzLmVudk1hbmFnZXIgPSBwb2V0cnlQcm9qZWN0O1xuICAgICAgdGhpcy5wYWNrYWdpbmdNYW5hZ2VyID0gcG9ldHJ5UHJvamVjdDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW52TWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF0IGxlYXN0IG9uZSB0b29sIG11c3QgYmUgY2hvc2VuIGZvciBtYW5hZ2luZyB0aGUgZW52aXJvbm1lbnQgKHZlbnYsIGNvbmRhLCBwaXBlbnYsIG9yIHBvZXRyeSkuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRlcHNNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQXQgbGVhc3Qgb25lIHRvb2wgbXVzdCBiZSBjaG9zZW4gZm9yIG1hbmFnaW5nIGRlcGVuZGVuY2llcyAocGlwLCBjb25kYSwgcGlwZW52LCBvciBwb2V0cnkpLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wYWNrYWdpbmdNYW5hZ2VyICYmIHRoaXMucHJvamVjdFR5cGUgPT09IFByb2plY3RUeXBlLkxJQikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF0IGxlYXN0IG9uZSB0b29sIG11c3QgYmUgY2hvc2VuIGZvciBtYW5hZ2luZyBwYWNrYWdpbmcgKHNldHVwdG9vbHMgb3IgcG9ldHJ5KS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHZlbnYpICsgTnVtYmVyKHBvZXRyeSkgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTW9yZSB0aGFuIG9uZSBjb21wb25lbnQgaGFzIGJlZW4gY2hvc2VuIGZvciBtYW5hZ2luZyB0aGUgZW52aXJvbm1lbnQgKHZlbnYsIGNvbmRhLCBwaXBlbnYsIG9yIHBvZXRyeSlcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHBpcCkgKyBOdW1iZXIocG9ldHJ5KSA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNb3JlIHRoYW4gb25lIGNvbXBvbmVudCBoYXMgYmVlbiBjaG9zZW4gZm9yIG1hbmFnaW5nIGRlcGVuZGVuY2llcyAocGlwLCBjb25kYSwgcGlwZW52LCBvciBwb2V0cnkpXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKE51bWJlcihzZXR1cHRvb2xzKSArIE51bWJlcihwb2V0cnkpID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vcmUgdGhhbiBvbmUgY29tcG9uZW50IGhhcyBiZWVuIGNob3NlbiBmb3IgbWFuYWdpbmcgcGFja2FnaW5nIChzZXR1cHRvb2xzIG9yIHBvZXRyeSlcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5weXRlc3QgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5weXRlc3QgPSBuZXcgUHl0ZXN0KHRoaXMsIG9wdGlvbnMucHl0ZXN0T3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5zYW1wbGUgPz8gdHJ1ZSkge1xuICAgICAgICBuZXcgUHl0ZXN0U2FtcGxlKHRoaXMsIHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgICAgICAgdGVzdGRpcjogdGhpcy5zYW1wbGVUZXN0ZGlyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zYW1wbGUgPz8gdHJ1ZSkge1xuICAgICAgbmV3IFB5dGhvblNhbXBsZSh0aGlzLCB7XG4gICAgICAgIGRpcjogdGhpcy5tb2R1bGVOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXAgb2Ygb3B0aW9ucy5kZXBzID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZERlcGVuZGVuY3koZGVwKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBvcHRpb25zLmRldkRlcHMgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkRGV2RGVwZW5kZW5jeShkZXApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEdpdElnbm9yZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgZGVmYXVsdCBnaXRpZ25vcmUgb3B0aW9ucyBmb3IgYSBQeXRob24gcHJvamVjdCBiYXNlZCBvblxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2dpdGlnbm9yZS9ibG9iL21hc3Rlci9QeXRob24uZ2l0aWdub3JlXG4gICAqL1xuICBwcml2YXRlIGFkZERlZmF1bHRHaXRJZ25vcmUoKSB7XG4gICAgdGhpcy5naXRpZ25vcmUuZXhjbHVkZShcbiAgICAgIFwiIyBCeXRlLWNvbXBpbGVkIC8gb3B0aW1pemVkIC8gRExMIGZpbGVzXCIsXG4gICAgICBcIl9fcHljYWNoZV9fL1wiLFxuICAgICAgXCIqLnB5W2NvZF1cIixcbiAgICAgIFwiKiRweS5jbGFzc1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBDIGV4dGVuc2lvbnNcIixcbiAgICAgIFwiKi5zb1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBEaXN0cmlidXRpb24gLyBwYWNrYWdpbmdcIixcbiAgICAgIFwiLlB5dGhvblwiLFxuICAgICAgXCJidWlsZC9cIixcbiAgICAgIFwiZGV2ZWxvcC1lZ2dzL1wiLFxuICAgICAgXCJkaXN0L1wiLFxuICAgICAgXCJkb3dubG9hZHMvXCIsXG4gICAgICBcImVnZ3MvXCIsXG4gICAgICBcIi5lZ2dzL1wiLFxuICAgICAgXCJsaWIvXCIsXG4gICAgICBcImxpYjY0L1wiLFxuICAgICAgXCJwYXJ0cy9cIixcbiAgICAgIFwic2Rpc3QvXCIsXG4gICAgICBcInZhci9cIixcbiAgICAgIFwid2hlZWxzL1wiLFxuICAgICAgXCJzaGFyZS9weXRob24td2hlZWxzL1wiLFxuICAgICAgXCIqLmVnZy1pbmZvL1wiLFxuICAgICAgXCIuaW5zdGFsbGVkLmNmZ1wiLFxuICAgICAgXCIqLmVnZ1wiLFxuICAgICAgXCJNQU5JRkVTVFwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBQeUluc3RhbGxlclwiLFxuICAgICAgXCIjICBVc3VhbGx5IHRoZXNlIGZpbGVzIGFyZSB3cml0dGVuIGJ5IGEgcHl0aG9uIHNjcmlwdCBmcm9tIGEgdGVtcGxhdGVcIixcbiAgICAgIFwiIyAgYmVmb3JlIFB5SW5zdGFsbGVyIGJ1aWxkcyB0aGUgZXhlLCBzbyBhcyB0byBpbmplY3QgZGF0ZS9vdGhlciBpbmZvcyBpbnRvIGl0LlwiLFxuICAgICAgXCIqLm1hbmlmZXN0XCIsXG4gICAgICBcIiouc3BlY1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBJbnN0YWxsZXIgbG9nc1wiLFxuICAgICAgXCJwaXAtbG9nLnR4dFwiLFxuICAgICAgXCJwaXAtZGVsZXRlLXRoaXMtZGlyZWN0b3J5LnR4dFwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBVbml0IHRlc3QgLyBjb3ZlcmFnZSByZXBvcnRzXCIsXG4gICAgICBcImh0bWxjb3YvXCIsXG4gICAgICBcIi50b3gvXCIsXG4gICAgICBcIi5ub3gvXCIsXG4gICAgICBcIi5jb3ZlcmFnZVwiLFxuICAgICAgXCIuY292ZXJhZ2UuKlwiLFxuICAgICAgXCIuY2FjaGVcIixcbiAgICAgIFwibm9zZXRlc3RzLnhtbFwiLFxuICAgICAgXCJjb3ZlcmFnZS54bWxcIixcbiAgICAgIFwiKi5jb3ZlclwiLFxuICAgICAgXCIqLnB5LGNvdmVyXCIsXG4gICAgICBcIi5oeXBvdGhlc2lzL1wiLFxuICAgICAgXCIucHl0ZXN0X2NhY2hlL1wiLFxuICAgICAgXCJjb3Zlci9cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgVHJhbnNsYXRpb25zXCIsXG4gICAgICBcIioubW9cIixcbiAgICAgIFwiKi5wb3RcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgRGphbmdvIHN0dWZmOlwiLFxuICAgICAgXCIqLmxvZ1wiLFxuICAgICAgXCJsb2NhbF9zZXR0aW5ncy5weVwiLFxuICAgICAgXCJkYi5zcWxpdGUzXCIsXG4gICAgICBcImRiLnNxbGl0ZTMtam91cm5hbFwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBGbGFzayBzdHVmZjpcIixcbiAgICAgIFwiaW5zdGFuY2UvXCIsXG4gICAgICBcIi53ZWJhc3NldHMtY2FjaGVcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgU2NyYXB5IHN0dWZmOlwiLFxuICAgICAgXCIuc2NyYXB5XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFNwaGlueCBkb2N1bWVudGF0aW9uXCIsXG4gICAgICBcImRvY3MvX2J1aWxkL1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBQeUJ1aWxkZXJcIixcbiAgICAgIFwiLnB5YnVpbGRlci9cIixcbiAgICAgIFwidGFyZ2V0L1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBKdXB5dGVyIE5vdGVib29rXCIsXG4gICAgICBcIi5pcHluYl9jaGVja3BvaW50c1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBJUHl0aG9uXCIsXG4gICAgICBcInByb2ZpbGVfZGVmYXVsdC9cIixcbiAgICAgIFwiaXB5dGhvbl9jb25maWcucHlcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgUEVQIDU4MjsgdXNlZCBieSBlLmcuIGdpdGh1Yi5jb20vRGF2aWQtT0Nvbm5vci9weWZsb3dcIixcbiAgICAgIFwiX19weXBhY2thZ2VzX18vXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIENlbGVyeSBzdHVmZlwiLFxuICAgICAgXCJjZWxlcnliZWF0LXNjaGVkdWxlXCIsXG4gICAgICBcImNlbGVyeWJlYXQucGlkXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFNhZ2VNYXRoIHBhcnNlZCBmaWxlc1wiLFxuICAgICAgXCIqLnNhZ2UucHlcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgRW52aXJvbm1lbnRzXCIsXG4gICAgICBcIi5lbnZcIixcbiAgICAgIFwiLnZlbnZcIixcbiAgICAgIFwiZW52L1wiLFxuICAgICAgXCJ2ZW52L1wiLFxuICAgICAgXCJFTlYvXCIsXG4gICAgICBcImVudi5iYWsvXCIsXG4gICAgICBcInZlbnYuYmFrL1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBTcHlkZXIgcHJvamVjdCBzZXR0aW5nc1wiLFxuICAgICAgXCIuc3B5ZGVycHJvamVjdFwiLFxuICAgICAgXCIuc3B5cHJvamVjdFwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBSb3BlIHByb2plY3Qgc2V0dGluZ3NcIixcbiAgICAgIFwiLnJvcGVwcm9qZWN0XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIG1rZG9jcyBkb2N1bWVudGF0aW9uXCIsXG4gICAgICBcIi9zaXRlXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIG15cHlcIixcbiAgICAgIFwiLm15cHlfY2FjaGUvXCIsXG4gICAgICBcIi5kbXlweS5qc29uXCIsXG4gICAgICBcImRteXB5Lmpzb25cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgUHlyZSB0eXBlIGNoZWNrZXJcIixcbiAgICAgIFwiLnB5cmUvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIHB5dHlwZSBzdGF0aWMgdHlwZSBhbmFseXplclwiLFxuICAgICAgXCIucHl0eXBlL1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBDeXRob24gZGVidWcgc3ltYm9sc1wiLFxuICAgICAgXCJjeXRob25fZGVidWcvXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBydW50aW1lIGRlcGVuZGVuY3kuXG4gICAqXG4gICAqIEBwYXJhbSBzcGVjIEZvcm1hdCBgPG1vZHVsZT5APHNlbXZlcj5gXG4gICAqL1xuICBwdWJsaWMgYWRkRGVwZW5kZW5jeShzcGVjOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5kZXBzTWFuYWdlci5hZGREZXBlbmRlbmN5KHNwZWMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkZXYgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQHBhcmFtIHNwZWMgRm9ybWF0IGA8bW9kdWxlPkA8c2VtdmVyPmBcbiAgICovXG4gIHB1YmxpYyBhZGREZXZEZXBlbmRlbmN5KHNwZWM6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmRlcHNNYW5hZ2VyLmFkZERldkRlcGVuZGVuY3koc3BlYyk7XG4gIH1cblxuICBwdWJsaWMgcG9zdFN5bnRoZXNpemUoKSB7XG4gICAgc3VwZXIucG9zdFN5bnRoZXNpemUoKTtcblxuICAgIHRoaXMuZW52TWFuYWdlci5zZXR1cEVudmlyb25tZW50KCk7XG4gICAgdGhpcy5kZXBzTWFuYWdlci5pbnN0YWxsRGVwZW5kZW5jaWVzKCk7XG4gIH1cbn1cbiJdfQ==
232
+ PythonProject[_a] = { fqn: "projen.python.PythonProject", version: "0.98.23" };
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXByb2plY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHl0aG9uL3B5dGhvbi1wcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQTRCO0FBQzVCLHFDQUFrQztBQUNsQyx5Q0FHb0I7QUFDcEIscUNBQWlEO0FBQ2pELG1EQUErQztBQUkvQyxtREFBK0M7QUFDL0MsNkNBQTBDO0FBQzFDLDZCQUEwQjtBQUMxQixpQ0FBMkM7QUFDM0Msc0NBQWdFO0FBQ2hFLHFEQUdnQztBQUNoQyx3Q0FBeUM7QUFDekMsOENBQThEO0FBQzlELGtDQUF3RDtBQUV4RCxpREFBaUQ7QUFDakQsTUFBTSx5QkFBeUIsR0FBRyxvQkFBb0IsQ0FBQztBQXdMdkQ7Ozs7R0FJRztBQUNILE1BQWEsYUFBYyxTQUFRLHNCQUFhO0lBc0M5QyxZQUFZLE9BQTZCO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FDYix5RkFBeUYsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxPQUFPLENBQUM7UUFFdEQsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixPQUFPLENBQUMsY0FBYztZQUN0QixPQUFPLENBQUMsVUFBVTtZQUNsQixPQUFPLENBQUMsWUFBWTtZQUNwQixPQUFPLENBQUMsVUFBVTtTQUNuQixDQUFDO1FBRUYsSUFBSSxJQUFBLHVCQUFnQixFQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElB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TUFBTSxFQUNOLE9BQU8sRUFDUCxNQUFNLEVBQ04sVUFBVSxFQUNWLFdBQVcsRUFDWCxFQUFFLEVBQ0YsMkJBQTJCLEVBQzNCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsRUFBRSxFQUNGLHlCQUF5QixFQUN6QixjQUFjLEVBQ2QsRUFBRSxFQUNGLHdCQUF3QixFQUN4QixPQUFPLEVBQ1AsRUFBRSxFQUNGLFFBQVEsRUFDUixjQUFjLEVBQ2QsYUFBYSxFQUNiLFlBQVksRUFDWixFQUFFLEVBQ0YscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixFQUFFLEVBQ0YsK0JBQStCLEVBQy9CLFVBQVUsRUFDVixFQUFFLEVBQ0Ysd0JBQXdCLEVBQ3hCLGVBQWUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksYUFBYSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLElBQVk7UUFDbEMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFTSxjQUFjO1FBQ25CLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3pDLENBQUM7O0FBMWFILHNDQTJhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcCB9IGZyb20gXCIuL3BpcFwiO1xuaW1wb3J0IHsgUG9ldHJ5IH0gZnJvbSBcIi4vcG9ldHJ5XCI7XG5pbXBvcnQge1xuICBQcm9qZW5yYyBhcyBQcm9qZW5yY1B5dGhvbixcbiAgUHJvamVucmNPcHRpb25zIGFzIFByb2plbnJjUHl0aG9uT3B0aW9ucyxcbn0gZnJvbSBcIi4vcHJvamVucmNcIjtcbmltcG9ydCB7IFB5dGVzdCwgUHl0ZXN0T3B0aW9ucyB9IGZyb20gXCIuL3B5dGVzdFwiO1xuaW1wb3J0IHsgUHl0ZXN0U2FtcGxlIH0gZnJvbSBcIi4vcHl0ZXN0LXNhbXBsZVwiO1xuaW1wb3J0IHsgSVB5dGhvbkRlcHMgfSBmcm9tIFwiLi9weXRob24tZGVwc1wiO1xuaW1wb3J0IHsgSVB5dGhvbkVudiB9IGZyb20gXCIuL3B5dGhvbi1lbnZcIjtcbmltcG9ydCB7IElQeXRob25QYWNrYWdpbmcsIFB5dGhvblBhY2thZ2luZ09wdGlvbnMgfSBmcm9tIFwiLi9weXRob24tcGFja2FnaW5nXCI7XG5pbXBvcnQgeyBQeXRob25TYW1wbGUgfSBmcm9tIFwiLi9weXRob24tc2FtcGxlXCI7XG5pbXBvcnQgeyBTZXR1cHRvb2xzIH0gZnJvbSBcIi4vc2V0dXB0b29sc1wiO1xuaW1wb3J0IHsgVXYgfSBmcm9tIFwiLi91dlwiO1xuaW1wb3J0IHsgVmVudiwgVmVudk9wdGlvbnMgfSBmcm9tIFwiLi92ZW52XCI7XG5pbXBvcnQgeyBHaXRIdWJQcm9qZWN0LCBHaXRIdWJQcm9qZWN0T3B0aW9ucyB9IGZyb20gXCIuLi9naXRodWJcIjtcbmltcG9ydCB7XG4gIFByb2plbnJjIGFzIFByb2plbnJjSnMsXG4gIFByb2plbnJjT3B0aW9ucyBhcyBQcm9qZW5yY0pzT3B0aW9ucyxcbn0gZnJvbSBcIi4uL2phdmFzY3JpcHQvcHJvamVucmNcIjtcbmltcG9ydCB7IFByb2plY3RUeXBlIH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IFByb2plbnJjVHMsIFByb2plbnJjVHNPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzY3JpcHRcIjtcbmltcG9ydCB7IGFueVNlbGVjdGVkLCBtdWx0aXBsZVNlbGVjdGVkIH0gZnJvbSBcIi4uL3V0aWxcIjtcblxuLyoqIEFsbG93ZWQgY2hhcmFjdGVycyBpbiBweXRob24gcHJvamVjdCBuYW1lcyAqL1xuY29uc3QgUFlUSE9OX1BST0pFQ1RfTkFNRV9SRUdFWCA9IC9eW0EtWmEtejAtOS1fXFwuXSskLztcblxuZXhwb3J0IGludGVyZmFjZSBQeXRob25FeGVjdXRhYmxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZSB0byB1c2UuXG4gICAqIEBkZWZhdWx0IFwicHl0aG9uXCJcbiAgICovXG4gIHJlYWRvbmx5IHB5dGhvbkV4ZWM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYFB5dGhvblByb2plY3RgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB5dGhvblByb2plY3RPcHRpb25zXG4gIGV4dGVuZHMgR2l0SHViUHJvamVjdE9wdGlvbnMsXG4gICAgUHl0aG9uUGFja2FnaW5nT3B0aW9ucyxcbiAgICBQeXRob25FeGVjdXRhYmxlT3B0aW9ucyB7XG4gIC8vIC0tIHJlcXVpcmVkIG9wdGlvbnMgLS1cblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgcHl0aG9uIHBhY2thZ2UgYXMgdXNlZCBpbiBpbXBvcnRzIGFuZCBmaWxlbmFtZXMuXG4gICAqXG4gICAqIE11c3Qgb25seSBjb25zaXN0IG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3Jlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgJFBZVEhPTl9NT0RVTEVfTkFNRVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlTmFtZTogc3RyaW5nO1xuXG4gIC8vIC0tIGRlcGVuZGVuY2llcyAtLVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHByb2plY3QuXG4gICAqXG4gICAqIERlcGVuZGVuY2llcyB1c2UgdGhlIGZvcm1hdDogYDxtb2R1bGU+QDxzZW12ZXI+YFxuICAgKlxuICAgKiBBZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBjYW4gYmUgYWRkZWQgdmlhIGBwcm9qZWN0LmFkZERlcGVuZGVuY3koKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRldiBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgcHJvamVjdC5cbiAgICpcbiAgICogRGVwZW5kZW5jaWVzIHVzZSB0aGUgZm9ybWF0OiBgPG1vZHVsZT5APHNlbXZlcj5gXG4gICAqXG4gICAqIEFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIGNhbiBiZSBhZGRlZCB2aWEgYHByb2plY3QuYWRkRGV2RGVwZW5kZW5jeSgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgW11cbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBkZXZEZXBzPzogc3RyaW5nW107XG5cbiAgLy8gLS0gY29yZSBjb21wb25lbnRzIC0tXG5cbiAgLyoqXG4gICAqIFVzZSBwaXAgd2l0aCBhIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byB0cmFjayBwcm9qZWN0IGRlcGVuZGVuY2llcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlLCB1bmxlc3MgcG9ldHJ5IGlzIHRydWUsIHRoZW4gZmFsc2VcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSBwaXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBVc2UgdmVudiB0byBtYW5hZ2UgYSB2aXJ0dWFsIGVudmlyb25tZW50IGZvciBpbnN0YWxsaW5nIGRlcGVuZGVuY2llcyBpbnNpZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSwgdW5sZXNzIHBvZXRyeSBpcyB0cnVlLCB0aGVuIGZhbHNlXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdmVudj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlbnYgb3B0aW9uc1xuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHRzXG4gICAqL1xuICByZWFkb25seSB2ZW52T3B0aW9ucz86IFZlbnZPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBVc2Ugc2V0dXB0b29scyB3aXRoIGEgc2V0dXAucHkgc2NyaXB0IGZvciBwYWNrYWdpbmcgYW5kIHB1Ymxpc2hpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJ1ZSwgdW5sZXNzIHBvZXRyeSBpcyB0cnVlLCB0aGVuIGZhbHNlXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dXB0b29scz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFVzZSBwb2V0cnkgdG8gbWFuYWdlIHlvdXIgcHJvamVjdCBkZXBlbmRlbmNpZXMsIHZpcnR1YWwgZW52aXJvbm1lbnQsIGFuZFxuICAgKiAob3B0aW9uYWwpIHBhY2thZ2luZy9wdWJsaXNoaW5nLlxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgaW5jb21wYXRpYmxlIHdpdGggcGlwLCBzZXR1cHRvb2xzLCBvciB2ZW52LlxuICAgKiBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uIHRvIGB0cnVlYCwgdGhlbiBwaXAsIHNldHVwdG9vbHMsIGFuZCB2ZW52IG11c3QgYmUgc2V0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBmZWF0dXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ldHJ5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVXNlIHV2IHRvIG1hbmFnZSB5b3VyIHByb2plY3QgZGVwZW5kZW5jaWVzLCB2aXJ0dWFsIGVudmlyb25tZW50LCBhbmRcbiAgICogKG9wdGlvbmFsKSBwYWNrYWdpbmcvcHVibGlzaGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGZlYXR1cmVkXG4gICAqL1xuICByZWFkb25seSB1dj86IGJvb2xlYW47XG5cbiAgLy8gLS0gb3B0aW9uYWwgY29tcG9uZW50cyAtLVxuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHB5dGVzdCB0ZXN0cy5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAZmVhdHVyZWRcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHB5dGVzdCBvcHRpb25zXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdHNcbiAgICovXG4gIHJlYWRvbmx5IHB5dGVzdE9wdGlvbnM/OiBQeXRlc3RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIHNhbXBsZSBjb2RlIGFuZCB0ZXN0IGlmIHRoZSByZWxldmFudCBkaXJlY3RvcmllcyBkb24ndCBleGlzdC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTG9jYXRpb24gb2Ygc2FtcGxlIHRlc3RzLlxuICAgKiBUeXBpY2FsbHkgdGhlIHNhbWUgZGlyZWN0b3J5IHdoZXJlIHByb2plY3QgdGVzdHMgd2lsbCBiZSBsb2NhdGVkLlxuICAgKiBAZGVmYXVsdCBcInRlc3RzXCJcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZVRlc3RkaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVzZSBwcm9qZW5yYyBpbiBQeXRob24uXG4gICAqXG4gICAqIFRoaXMgd2lsbCBpbnN0YWxsIGBwcm9qZW5gIGFzIGEgUHl0aG9uIGRlcGVuZGVuY3kgYW5kIGFkZCBhIGBzeW50aGBcbiAgICogdGFzayB3aGljaCB3aWxsIHJ1biBgLnByb2plbnJjLnB5YC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNQeXRob24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHJlbGF0ZWQgdG8gcHJvamVucmMgaW4gcHl0aG9uLlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgb3B0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVucmNQeXRob25PcHRpb25zPzogUHJvamVucmNQeXRob25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBVc2UgcHJvamVucmMgaW4gamF2YXNjcmlwdC5cbiAgICpcbiAgICogVGhpcyB3aWxsIGluc3RhbGwgYHByb2plbmAgYXMgYSBKYXZhU2NyaXB0IGRlcGVuZGVuY3kgYW5kIGFkZCBhIGBzeW50aGBcbiAgICogdGFzayB3aGljaCB3aWxsIHJ1biBgLnByb2plbnJjLmpzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjSnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIHJlbGF0ZWQgdG8gcHJvamVucmMgaW4gSmF2YVNjcmlwdC5cbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IG9wdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IHByb2plbnJjSnNPcHRpb25zPzogUHJvamVucmNKc09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFVzZSBwcm9qZW5yYyBpbiBUeXBlU2NyaXB0LlxuICAgKlxuICAgKiBUaGlzIHdpbGwgY3JlYXRlIGEgdHNjb25maWcgZmlsZSAoZGVmYXVsdDogYHRzY29uZmlnLnByb2plbi5qc29uYClcbiAgICogYW5kIHVzZSBgdHMtbm9kZWAgaW4gdGhlIGRlZmF1bHQgdGFzayB0byBwYXJzZSB0aGUgcHJvamVjdCBzb3VyY2UgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5yY1RzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9ucyByZWxhdGVkIHRvIHByb2plbnJjIGluIFR5cGVTY3JpcHQuXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBvcHRpb25zXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5yY1RzT3B0aW9ucz86IFByb2plbnJjVHNPcHRpb25zO1xufVxuXG4vKipcbiAqIFB5dGhvbiBwcm9qZWN0LlxuICpcbiAqIEBwamlkIHB5dGhvblxuICovXG5leHBvcnQgY2xhc3MgUHl0aG9uUHJvamVjdCBleHRlbmRzIEdpdEh1YlByb2plY3Qge1xuICAvKipcbiAgICogUHl0aG9uIG1vZHVsZSBuYW1lICh0aGUgcHJvamVjdCBuYW1lLCB3aXRoIGFueSBoeXBoZW5zIG9yIHBlcmlvZHMgcmVwbGFjZWRcbiAgICogd2l0aCB1bmRlcnNjb3JlcykuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIHRoZSBwYWNrYWdlIGZvciBkaXN0cmlidXRpb24gKHNob3VsZCBmb2xsb3cgc2VtdmVyKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFQSSBmb3IgbWFuYWdpbmcgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlcHNNYW5hZ2VyITogSVB5dGhvbkRlcHM7XG5cbiAgLyoqXG4gICAqIEFQSSBmb3IgbWFuYWdpbmcgdGhlIFB5dGhvbiBydW50aW1lIGVudmlyb25tZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGVudk1hbmFnZXIhOiBJUHl0aG9uRW52O1xuXG4gIC8qKlxuICAgKiBBUEkgZm9yIG1hbmFnaW5nIHBhY2thZ2luZyB0aGUgcHJvamVjdCBhcyBhIGxpYnJhcnkuIE9ubHkgYXBwbGllcyB3aGVuIHRoZSBgcHJvamVjdFR5cGVgIGlzIExJQi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYWNrYWdpbmdNYW5hZ2VyPzogSVB5dGhvblBhY2thZ2luZztcblxuICAvKipcbiAgICogUHl0ZXN0IGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBweXRlc3Q/OiBQeXRlc3Q7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSB3aGVyZSBzYW1wbGUgdGVzdHMgYXJlIGxvY2F0ZWQuXG4gICAqIEBkZWZhdWx0IFwidGVzdHNcIlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNhbXBsZVRlc3RkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBQeXRob25Qcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgaWYgKCFQWVRIT05fUFJPSkVDVF9OQU1FX1JFR0VYLnRlc3Qob3B0aW9ucy5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIlB5dGhvbiBwcm9qZWN0cyBtdXN0IG9ubHkgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubW9kdWxlTmFtZSA9IG9wdGlvbnMubW9kdWxlTmFtZTtcbiAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgdGhpcy5zYW1wbGVUZXN0ZGlyID0gb3B0aW9ucy5zYW1wbGVUZXN0ZGlyID8/IFwidGVzdHNcIjtcblxuICAgIGNvbnN0IHJjRmlsZVR5cGVPcHRpb25zID0gW1xuICAgICAgb3B0aW9ucy5wcm9qZW5yY1B5dGhvbixcbiAgICAgIG9wdGlvbnMucHJvamVucmNKcyxcbiAgICAgIG9wdGlvbnMucHJvamVucmNKc29uLFxuICAgICAgb3B0aW9ucy5wcm9qZW5yY1RzLFxuICAgIF07XG5cbiAgICBpZiAobXVsdGlwbGVTZWxlY3RlZChyY0ZpbGVUeXBlT3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJPbmx5IG9uZSBvZiBwcm9qZW5yY1B5dGhvbiwgcHJvamVucmNKcywgcHJvamVucmNUcywgYW5kIHByb2plbnJjSnNvbiBjYW4gYmUgc2VsZWN0ZWQuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcG9ldHJ5ID0gb3B0aW9ucy5wb2V0cnkgPz8gZmFsc2U7XG4gICAgY29uc3QgdXYgPSBvcHRpb25zLnV2ID8/IGZhbHNlO1xuICAgIGNvbnN0IG5vdF9wb2V0cnlfb3JfdXYgPSAhcG9ldHJ5ICYmICF1djtcblxuICAgIC8vIEFzc3VtZSBwaXAgaWYgbm90IHVzaW5nIHBvZXRyeSBvciB1dlxuICAgIGNvbnN0IHBpcCA9IG9wdGlvbnMucGlwID8/IG5vdF9wb2V0cnlfb3JfdXY7XG5cbiAgICAvLyBBc3N1bWUgdmVudiBpZiBub3QgdXNpbmcgcG9ldHJ5IG9yIHV2XG4gICAgY29uc3QgdmVudiA9IG9wdGlvbnMudmVudiA/PyBub3RfcG9ldHJ5X29yX3V2O1xuXG4gICAgY29uc3Qgc2V0dXB0b29scyA9XG4gICAgICBvcHRpb25zLnNldHVwdG9vbHMgPz9cbiAgICAgIChub3RfcG9ldHJ5X29yX3V2ICYmIHRoaXMucHJvamVjdFR5cGUgPT09IFByb2plY3RUeXBlLkxJQik7XG5cbiAgICBjb25zdCB0b29scyA9IHtcbiAgICAgIHBvZXRyeTogcG9ldHJ5LFxuICAgICAgcGlwOiBwaXAsXG4gICAgICB2ZW52OiB2ZW52LFxuICAgICAgc2V0dXB0b29sczogc2V0dXB0b29scyxcbiAgICAgIHV2OiB1dixcbiAgICB9O1xuXG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgLy8gZGVmYXVsdCB0byBwcm9qZW5yYy5weSBpZiBubyBvdGhlciBwcm9qZW5yYyB0eXBlIHdhcyBlbGVjdGVkXG4gICAgICBpZiAob3B0aW9ucy5wcm9qZW5yY1B5dGhvbiA/PyAhYW55U2VsZWN0ZWQocmNGaWxlVHlwZU9wdGlvbnMpKSB7XG4gICAgICAgIG5ldyBQcm9qZW5yY1B5dGhvbih0aGlzLCB7XG4gICAgICAgICAgcHl0aG9uRXhlYzogb3B0aW9ucy5weXRob25FeGVjLFxuICAgICAgICAgIC4uLm9wdGlvbnMucHJvamVucmNQeXRob25PcHRpb25zLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucHJvamVucmNKcyA/PyBmYWxzZSkge1xuICAgICAgICBuZXcgUHJvamVucmNKcyh0aGlzLCBvcHRpb25zLnByb2plbnJjSnNPcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucHJvamVucmNUcyA/PyBmYWxzZSkge1xuICAgICAgICBuZXcgUHJvamVucmNUcyh0aGlzLCBvcHRpb25zLnByb2plbnJjVHNPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmVudikge1xuICAgICAgdGhpcy5lbnZNYW5hZ2VyID0gbmV3IFZlbnYodGhpcywge1xuICAgICAgICBweXRob25FeGVjOiBvcHRpb25zLnB5dGhvbkV4ZWMsXG4gICAgICAgIC4uLm9wdGlvbnMudmVudk9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocGlwKSB7XG4gICAgICB0aGlzLmRlcHNNYW5hZ2VyID0gbmV3IFBpcCh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dXB0b29scykge1xuICAgICAgdGhpcy5wYWNrYWdpbmdNYW5hZ2VyID0gbmV3IFNldHVwdG9vbHModGhpcywge1xuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgICBhdXRob3JOYW1lOiBvcHRpb25zLmF1dGhvck5hbWUsXG4gICAgICAgIGF1dGhvckVtYWlsOiBvcHRpb25zLmF1dGhvckVtYWlsLFxuICAgICAgICBsaWNlbnNlOiBvcHRpb25zLmxpY2Vuc2UsXG4gICAgICAgIGhvbWVwYWdlOiBvcHRpb25zLmhvbWVwYWdlLFxuICAgICAgICBjbGFzc2lmaWVyczogb3B0aW9ucy5jbGFzc2lmaWVycyxcbiAgICAgICAgc2V0dXBDb25maWc6IG9wdGlvbnMuc2V0dXBDb25maWcsXG4gICAgICAgIHB5dGhvbkV4ZWM6IG9wdGlvbnMucHl0aG9uRXhlYyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh1dikge1xuICAgICAgLy8gdXYgY2Fubm90IGJlIHVzZWQgd2l0aCBvdGhlciB0b29scy5cbiAgICAgIHRoaXMuY2hlY2tUb29sQ29uZmxpY3RzKFwidXZcIiwgdG9vbHMpO1xuXG4gICAgICBjb25zdCB1dlByb2plY3QgPSBuZXcgVXYodGhpcywge1xuICAgICAgICBwcm9qZWN0OiB7XG4gICAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogb3B0aW9ucy5kZXNjcmlwdGlvbixcbiAgICAgICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lPy5maWxlbmFtZSA/PyBcIlJFQURNRS5tZFwiLFxuICAgICAgICAgIGxpY2Vuc2U6IG9wdGlvbnMubGljZW5zZSxcbiAgICAgICAgICBhdXRob3JzOiBvcHRpb25zLmF1dGhvck5hbWVcbiAgICAgICAgICAgID8gW3sgbmFtZTogb3B0aW9ucy5hdXRob3JOYW1lLCBlbWFpbDogb3B0aW9ucy5hdXRob3JFbWFpbCB9XVxuICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICBjbGFzc2lmaWVyczogb3B0aW9ucy5jbGFzc2lmaWVycyxcbiAgICAgICAgICB1cmxzOiBvcHRpb25zLmhvbWVwYWdlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBob21lcGFnZTogb3B0aW9ucy5ob21lcGFnZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgLi4ub3B0aW9ucy51dk9wdGlvbnM/LnByb2plY3QsIC8vIHRha2VzIHByaW9yaXR5XG4gICAgICAgIH0sXG5cbiAgICAgICAgYnVpbGRTeXN0ZW06IG9wdGlvbnMudXZPcHRpb25zPy5idWlsZFN5c3RlbSxcbiAgICAgICAgdXY6IG9wdGlvbnMudXZPcHRpb25zPy51dixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzTWFuYWdlciA9IHV2UHJvamVjdDtcbiAgICAgIHRoaXMuZW52TWFuYWdlciA9IHV2UHJvamVjdDtcbiAgICAgIHRoaXMucGFja2FnaW5nTWFuYWdlciA9IHV2UHJvamVjdDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMudXZPcHRpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dk9wdGlvbnMgb25seSBhcHBsaWVzIHdoZW4gdXNpbmcgdXYuXCIpO1xuICAgIH1cblxuICAgIGlmIChwb2V0cnkpIHtcbiAgICAgIC8vIHBvZXRyeSBjYW5ub3QgYmUgdXNlZCB3aXRoIG90aGVyIHRvb2xzLlxuICAgICAgdGhpcy5jaGVja1Rvb2xDb25mbGljdHMoXCJwb2V0cnlcIiwgdG9vbHMpO1xuXG4gICAgICBjb25zdCBwb2V0cnlQcm9qZWN0ID0gbmV3IFBvZXRyeSh0aGlzLCB7XG4gICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgIGF1dGhvck5hbWU6IG9wdGlvbnMuYXV0aG9yTmFtZSxcbiAgICAgICAgYXV0aG9yRW1haWw6IG9wdGlvbnMuYXV0aG9yRW1haWwsXG4gICAgICAgIGxpY2Vuc2U6IG9wdGlvbnMubGljZW5zZSxcbiAgICAgICAgaG9tZXBhZ2U6IG9wdGlvbnMuaG9tZXBhZ2UsXG4gICAgICAgIGNsYXNzaWZpZXJzOiBvcHRpb25zLmNsYXNzaWZpZXJzLFxuICAgICAgICBweXRob25FeGVjOiBvcHRpb25zLnB5dGhvbkV4ZWMsXG4gICAgICAgIHBvZXRyeU9wdGlvbnM6IHtcbiAgICAgICAgICByZWFkbWU6IG9wdGlvbnMucmVhZG1lPy5maWxlbmFtZSA/PyBcIlJFQURNRS5tZFwiLFxuICAgICAgICAgIC4uLm9wdGlvbnMucG9ldHJ5T3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXBzTWFuYWdlciA9IHBvZXRyeVByb2plY3Q7XG4gICAgICB0aGlzLmVudk1hbmFnZXIgPSBwb2V0cnlQcm9qZWN0O1xuICAgICAgdGhpcy5wYWNrYWdpbmdNYW5hZ2VyID0gcG9ldHJ5UHJvamVjdDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZW52TWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF0IGxlYXN0IG9uZSB0b29sIG11c3QgYmUgY2hvc2VuIGZvciBtYW5hZ2luZyB0aGUgZW52aXJvbm1lbnQgKHZlbnYsIGNvbmRhLCBwaXBlbnYsIG9yIHBvZXRyeSkuXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRlcHNNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiQXQgbGVhc3Qgb25lIHRvb2wgbXVzdCBiZSBjaG9zZW4gZm9yIG1hbmFnaW5nIGRlcGVuZGVuY2llcyAocGlwLCBjb25kYSwgcGlwZW52LCBvciBwb2V0cnkpLlwiXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5wYWNrYWdpbmdNYW5hZ2VyICYmIHRoaXMucHJvamVjdFR5cGUgPT09IFByb2plY3RUeXBlLkxJQikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkF0IGxlYXN0IG9uZSB0b29sIG11c3QgYmUgY2hvc2VuIGZvciBtYW5hZ2luZyBwYWNrYWdpbmcgKHNldHVwdG9vbHMgb3IgcG9ldHJ5KS5cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHZlbnYpICsgTnVtYmVyKHBvZXRyeSkgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTW9yZSB0aGFuIG9uZSBjb21wb25lbnQgaGFzIGJlZW4gY2hvc2VuIGZvciBtYW5hZ2luZyB0aGUgZW52aXJvbm1lbnQgKHZlbnYsIGNvbmRhLCBwaXBlbnYsIG9yIHBvZXRyeSlcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKHBpcCkgKyBOdW1iZXIocG9ldHJ5KSA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJNb3JlIHRoYW4gb25lIGNvbXBvbmVudCBoYXMgYmVlbiBjaG9zZW4gZm9yIG1hbmFnaW5nIGRlcGVuZGVuY2llcyAocGlwLCBjb25kYSwgcGlwZW52LCBvciBwb2V0cnkpXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKE51bWJlcihzZXR1cHRvb2xzKSArIE51bWJlcihwb2V0cnkpID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIk1vcmUgdGhhbiBvbmUgY29tcG9uZW50IGhhcyBiZWVuIGNob3NlbiBmb3IgbWFuYWdpbmcgcGFja2FnaW5nIChzZXR1cHRvb2xzIG9yIHBvZXRyeSlcIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5weXRlc3QgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5weXRlc3QgPSBuZXcgUHl0ZXN0KHRoaXMsIG9wdGlvbnMucHl0ZXN0T3B0aW9ucyk7XG4gICAgICBpZiAob3B0aW9ucy5zYW1wbGUgPz8gdHJ1ZSkge1xuICAgICAgICBuZXcgUHl0ZXN0U2FtcGxlKHRoaXMsIHtcbiAgICAgICAgICBtb2R1bGVOYW1lOiB0aGlzLm1vZHVsZU5hbWUsXG4gICAgICAgICAgdGVzdGRpcjogdGhpcy5zYW1wbGVUZXN0ZGlyLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zYW1wbGUgPz8gdHJ1ZSkge1xuICAgICAgbmV3IFB5dGhvblNhbXBsZSh0aGlzLCB7XG4gICAgICAgIGRpcjogdGhpcy5tb2R1bGVOYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZXAgb2Ygb3B0aW9ucy5kZXBzID8/IFtdKSB7XG4gICAgICB0aGlzLmFkZERlcGVuZGVuY3koZGVwKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcCBvZiBvcHRpb25zLmRldkRlcHMgPz8gW10pIHtcbiAgICAgIHRoaXMuYWRkRGV2RGVwZW5kZW5jeShkZXApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEdpdElnbm9yZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1Rvb2xDb25mbGljdHMoXG4gICAgYWN0aXZlVG9vbE5hbWU6IHN0cmluZyxcbiAgICB0b29sczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj5cbiAgKSB7XG4gICAgaWYgKHRvb2xzW2FjdGl2ZVRvb2xOYW1lXSkge1xuICAgICAgLy8gQ29sbGVjdCBuYW1lcyBvZiBvdGhlciBlbmFibGVkIHRvb2xzIGV4Y2x1ZGluZyB0aGUgYWN0aXZlIHRvb2wgaXRzZWxmXG4gICAgICBjb25zdCBjb25mbGljdHMgPSBPYmplY3QuZW50cmllcyh0b29scylcbiAgICAgICAgLmZpbHRlcigoW25hbWUsIGVuYWJsZWRdKSA9PiBuYW1lICE9PSBhY3RpdmVUb29sTmFtZSAmJiBlbmFibGVkKVxuICAgICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpO1xuXG4gICAgICBpZiAoY29uZmxpY3RzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7YWN0aXZlVG9vbE5hbWV9IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggb3RoZXIgdG9vbHMsIGZvdW5kIHRoZSBmb2xsb3dpbmcgaW5jb21wYXRpYmxlIHRvb2xzIGVuYWJsZWQ6ICR7Y29uZmxpY3RzLmpvaW4oXG4gICAgICAgICAgICBcIiwgXCJcbiAgICAgICAgICApfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBkZWZhdWx0IGdpdGlnbm9yZSBvcHRpb25zIGZvciBhIFB5dGhvbiBwcm9qZWN0IGJhc2VkIG9uXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvZ2l0aWdub3JlL2Jsb2IvbWFzdGVyL1B5dGhvbi5naXRpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgYWRkRGVmYXVsdEdpdElnbm9yZSgpIHtcbiAgICB0aGlzLmdpdGlnbm9yZS5leGNsdWRlKFxuICAgICAgXCIjIEJ5dGUtY29tcGlsZWQgLyBvcHRpbWl6ZWQgLyBETEwgZmlsZXNcIixcbiAgICAgIFwiX19weWNhY2hlX18vXCIsXG4gICAgICBcIioucHlbY29kXVwiLFxuICAgICAgXCIqJHB5LmNsYXNzXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIEMgZXh0ZW5zaW9uc1wiLFxuICAgICAgXCIqLnNvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIERpc3RyaWJ1dGlvbiAvIHBhY2thZ2luZ1wiLFxuICAgICAgXCIuUHl0aG9uXCIsXG4gICAgICBcImJ1aWxkL1wiLFxuICAgICAgXCJkZXZlbG9wLWVnZ3MvXCIsXG4gICAgICBcImRpc3QvXCIsXG4gICAgICBcImRvd25sb2Fkcy9cIixcbiAgICAgIFwiZWdncy9cIixcbiAgICAgIFwiLmVnZ3MvXCIsXG4gICAgICBcImxpYi9cIixcbiAgICAgIFwibGliNjQvXCIsXG4gICAgICBcInBhcnRzL1wiLFxuICAgICAgXCJzZGlzdC9cIixcbiAgICAgIFwidmFyL1wiLFxuICAgICAgXCJ3aGVlbHMvXCIsXG4gICAgICBcInNoYXJlL3B5dGhvbi13aGVlbHMvXCIsXG4gICAgICBcIiouZWdnLWluZm8vXCIsXG4gICAgICBcIi5pbnN0YWxsZWQuY2ZnXCIsXG4gICAgICBcIiouZWdnXCIsXG4gICAgICBcIk1BTklGRVNUXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFB5SW5zdGFsbGVyXCIsXG4gICAgICBcIiMgIFVzdWFsbHkgdGhlc2UgZmlsZXMgYXJlIHdyaXR0ZW4gYnkgYSBweXRob24gc2NyaXB0IGZyb20gYSB0ZW1wbGF0ZVwiLFxuICAgICAgXCIjICBiZWZvcmUgUHlJbnN0YWxsZXIgYnVpbGRzIHRoZSBleGUsIHNvIGFzIHRvIGluamVjdCBkYXRlL290aGVyIGluZm9zIGludG8gaXQuXCIsXG4gICAgICBcIioubWFuaWZlc3RcIixcbiAgICAgIFwiKi5zcGVjXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIEluc3RhbGxlciBsb2dzXCIsXG4gICAgICBcInBpcC1sb2cudHh0XCIsXG4gICAgICBcInBpcC1kZWxldGUtdGhpcy1kaXJlY3RvcnkudHh0XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFVuaXQgdGVzdCAvIGNvdmVyYWdlIHJlcG9ydHNcIixcbiAgICAgIFwiaHRtbGNvdi9cIixcbiAgICAgIFwiLnRveC9cIixcbiAgICAgIFwiLm5veC9cIixcbiAgICAgIFwiLmNvdmVyYWdlXCIsXG4gICAgICBcIi5jb3ZlcmFnZS4qXCIsXG4gICAgICBcIi5jYWNoZVwiLFxuICAgICAgXCJub3NldGVzdHMueG1sXCIsXG4gICAgICBcImNvdmVyYWdlLnhtbFwiLFxuICAgICAgXCIqLmNvdmVyXCIsXG4gICAgICBcIioucHksY292ZXJcIixcbiAgICAgIFwiLmh5cG90aGVzaXMvXCIsXG4gICAgICBcIi5weXRlc3RfY2FjaGUvXCIsXG4gICAgICBcImNvdmVyL1wiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBUcmFuc2xhdGlvbnNcIixcbiAgICAgIFwiKi5tb1wiLFxuICAgICAgXCIqLnBvdFwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBEamFuZ28gc3R1ZmY6XCIsXG4gICAgICBcIioubG9nXCIsXG4gICAgICBcImxvY2FsX3NldHRpbmdzLnB5XCIsXG4gICAgICBcImRiLnNxbGl0ZTNcIixcbiAgICAgIFwiZGIuc3FsaXRlMy1qb3VybmFsXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIEZsYXNrIHN0dWZmOlwiLFxuICAgICAgXCJpbnN0YW5jZS9cIixcbiAgICAgIFwiLndlYmFzc2V0cy1jYWNoZVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBTY3JhcHkgc3R1ZmY6XCIsXG4gICAgICBcIi5zY3JhcHlcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgU3BoaW54IGRvY3VtZW50YXRpb25cIixcbiAgICAgIFwiZG9jcy9fYnVpbGQvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFB5QnVpbGRlclwiLFxuICAgICAgXCIucHlidWlsZGVyL1wiLFxuICAgICAgXCJ0YXJnZXQvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIEp1cHl0ZXIgTm90ZWJvb2tcIixcbiAgICAgIFwiLmlweW5iX2NoZWNrcG9pbnRzXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIElQeXRob25cIixcbiAgICAgIFwicHJvZmlsZV9kZWZhdWx0L1wiLFxuICAgICAgXCJpcHl0aG9uX2NvbmZpZy5weVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBQRVAgNTgyOyB1c2VkIGJ5IGUuZy4gZ2l0aHViLmNvbS9EYXZpZC1PQ29ubm9yL3B5Zmxvd1wiLFxuICAgICAgXCJfX3B5cGFja2FnZXNfXy9cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgQ2VsZXJ5IHN0dWZmXCIsXG4gICAgICBcImNlbGVyeWJlYXQtc2NoZWR1bGVcIixcbiAgICAgIFwiY2VsZXJ5YmVhdC5waWRcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgU2FnZU1hdGggcGFyc2VkIGZpbGVzXCIsXG4gICAgICBcIiouc2FnZS5weVwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBFbnZpcm9ubWVudHNcIixcbiAgICAgIFwiLmVudlwiLFxuICAgICAgXCIudmVudlwiLFxuICAgICAgXCJlbnYvXCIsXG4gICAgICBcInZlbnYvXCIsXG4gICAgICBcIkVOVi9cIixcbiAgICAgIFwiZW52LmJhay9cIixcbiAgICAgIFwidmVudi5iYWsvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFNweWRlciBwcm9qZWN0IHNldHRpbmdzXCIsXG4gICAgICBcIi5zcHlkZXJwcm9qZWN0XCIsXG4gICAgICBcIi5zcHlwcm9qZWN0XCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIFJvcGUgcHJvamVjdCBzZXR0aW5nc1wiLFxuICAgICAgXCIucm9wZXByb2plY3RcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgbWtkb2NzIGRvY3VtZW50YXRpb25cIixcbiAgICAgIFwiL3NpdGVcIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgbXlweVwiLFxuICAgICAgXCIubXlweV9jYWNoZS9cIixcbiAgICAgIFwiLmRteXB5Lmpzb25cIixcbiAgICAgIFwiZG15cHkuanNvblwiLFxuICAgICAgXCJcIixcbiAgICAgIFwiIyBQeXJlIHR5cGUgY2hlY2tlclwiLFxuICAgICAgXCIucHlyZS9cIixcbiAgICAgIFwiXCIsXG4gICAgICBcIiMgcHl0eXBlIHN0YXRpYyB0eXBlIGFuYWx5emVyXCIsXG4gICAgICBcIi5weXR5cGUvXCIsXG4gICAgICBcIlwiLFxuICAgICAgXCIjIEN5dGhvbiBkZWJ1ZyBzeW1ib2xzXCIsXG4gICAgICBcImN5dGhvbl9kZWJ1Zy9cIlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJ1bnRpbWUgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogQHBhcmFtIHNwZWMgRm9ybWF0IGA8bW9kdWxlPkA8c2VtdmVyPmBcbiAgICovXG4gIHB1YmxpYyBhZGREZXBlbmRlbmN5KHNwZWM6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmRlcHNNYW5hZ2VyLmFkZERlcGVuZGVuY3koc3BlYyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRldiBkZXBlbmRlbmN5LlxuICAgKlxuICAgKiBAcGFyYW0gc3BlYyBGb3JtYXQgYDxtb2R1bGU+QDxzZW12ZXI+YFxuICAgKi9cbiAgcHVibGljIGFkZERldkRlcGVuZGVuY3koc3BlYzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVwc01hbmFnZXIuYWRkRGV2RGVwZW5kZW5jeShzcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBwb3N0U3ludGhlc2l6ZSgpIHtcbiAgICBzdXBlci5wb3N0U3ludGhlc2l6ZSgpO1xuXG4gICAgdGhpcy5lbnZNYW5hZ2VyLnNldHVwRW52aXJvbm1lbnQoKTtcbiAgICB0aGlzLmRlcHNNYW5hZ2VyLmluc3RhbGxEZXBlbmRlbmNpZXMoKTtcbiAgfVxufVxuIl19
@@ -39,5 +39,5 @@ class PythonSample extends component_1.Component {
39
39
  }
40
40
  exports.PythonSample = PythonSample;
41
41
  _a = JSII_RTTI_SYMBOL_1;
42
- PythonSample[_a] = { fqn: "projen.python.PythonSample", version: "0.98.22" };
42
+ PythonSample[_a] = { fqn: "projen.python.PythonSample", version: "0.98.23" };
43
43
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLXNhbXBsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9weXRob24vcHl0aG9uLXNhbXBsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDRDQUF5QztBQUV6QyxnREFBMkM7QUFZM0M7O0dBRUc7QUFDSCxNQUFhLFlBQWEsU0FBUSxxQkFBUztJQUN6QyxZQUFZLE9BQWdCLEVBQUUsT0FBNEI7UUFDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWYsSUFBSSx1QkFBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2xDLEtBQUssRUFBRTtnQkFDTCxhQUFhLEVBQUUseUJBQXlCO2dCQUN4QyxhQUFhLEVBQUU7b0JBQ2IsNEJBQTRCO29CQUM1QixFQUFFO29CQUNGLDRCQUE0QjtvQkFDNUIseUNBQXlDO29CQUN6Qyx3QkFBd0I7b0JBQ3hCLEVBQUU7aUJBQ0gsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNaLFlBQVksRUFBRTtvQkFDWiw4QkFBOEI7b0JBQzlCLDJCQUEyQjtvQkFDM0IsV0FBVztvQkFDWCxvQ0FBb0M7b0JBQ3BDLGNBQWM7b0JBQ2QsK0JBQStCO29CQUMvQixTQUFTO29CQUNULDZCQUE2QjtvQkFDN0IsRUFBRTtpQkFDSCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDYjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNUJILG9DQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgU2FtcGxlRGlyIH0gZnJvbSBcIi4uL3NhbXBsZS1maWxlXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgcHl0aG9uIHNhbXBsZSBjb2RlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB5dGhvblNhbXBsZU9wdGlvbnMge1xuICAvKipcbiAgICogU2FtcGxlIGNvZGUgZGlyZWN0b3J5XG4gICAqL1xuICByZWFkb25seSBkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQeXRob24gY29kZSBzYW1wbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQeXRob25TYW1wbGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBQeXRob25TYW1wbGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBuZXcgU2FtcGxlRGlyKHByb2plY3QsIG9wdGlvbnMuZGlyLCB7XG4gICAgICBmaWxlczoge1xuICAgICAgICBcIl9faW5pdF9fLnB5XCI6ICdfX3ZlcnNpb25fXyA9IFwiMC4xLjBcIlxcbicsXG4gICAgICAgIFwiX19tYWluX18ucHlcIjogW1xuICAgICAgICAgIFwiZnJvbSAuZXhhbXBsZSBpbXBvcnQgaGVsbG9cIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgICdpZiBfX25hbWVfXyA9PSBcIl9fbWFpbl9fXCI6JyxcbiAgICAgICAgICAnICAgIG5hbWUgPSBpbnB1dChcIldoYXQgaXMgeW91ciBuYW1lPyBcIiknLFxuICAgICAgICAgIFwiICAgIHByaW50KGhlbGxvKG5hbWUpKVwiLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgXCJleGFtcGxlLnB5XCI6IFtcbiAgICAgICAgICBcImRlZiBoZWxsbyhuYW1lOiBzdHIpIC0+IHN0cjpcIixcbiAgICAgICAgICAnICAgIFwiXCJcIkEgc2ltcGxlIGdyZWV0aW5nLicsXG4gICAgICAgICAgXCIgICAgQXJnczpcIixcbiAgICAgICAgICBcIiAgICAgICAgbmFtZSAoc3RyKTogTmFtZSB0byBncmVldC5cIixcbiAgICAgICAgICBcIiAgICBSZXR1cm5zOlwiLFxuICAgICAgICAgIFwiICAgICAgICBzdHI6IGdyZWV0aW5nIG1lc3NhZ2VcIixcbiAgICAgICAgICAnICAgIFwiXCJcIicsXG4gICAgICAgICAgJyAgICByZXR1cm4gZlwiSGVsbG8ge25hbWV9IVwiJyxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=