@dyanet/nestjs-config-aws 1.2.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -43
  3. package/dist/cjs/aws-config-loader.js +57 -0
  4. package/dist/cjs/build-loaders.js +58 -0
  5. package/dist/cjs/config.module.js +138 -0
  6. package/dist/cjs/index.js +46 -0
  7. package/dist/cjs/interfaces/config-service.interface.js +11 -0
  8. package/dist/cjs/interfaces/default-schema.interface.js +63 -0
  9. package/dist/cjs/{nestjs-config-aws/src/interfaces → interfaces}/index.js +1 -1
  10. package/dist/cjs/interfaces/module-options.interface.js +3 -0
  11. package/dist/cjs/package.json +3 -0
  12. package/dist/cjs/services/config.service.js +142 -0
  13. package/dist/esm/aws-config-loader.js +54 -0
  14. package/dist/esm/build-loaders.js +55 -0
  15. package/dist/esm/config.module.js +135 -0
  16. package/dist/esm/index.js +18 -0
  17. package/dist/esm/interfaces/config-service.interface.js +7 -0
  18. package/dist/esm/interfaces/default-schema.interface.js +59 -0
  19. package/dist/esm/interfaces/index.js +8 -0
  20. package/dist/esm/interfaces/module-options.interface.js +2 -0
  21. package/dist/esm/package.json +3 -1
  22. package/dist/esm/services/config.service.js +139 -0
  23. package/dist/types/aws-config-loader.d.ts +74 -0
  24. package/dist/types/aws-config-loader.d.ts.map +1 -0
  25. package/dist/types/build-loaders.d.ts +30 -0
  26. package/dist/types/build-loaders.d.ts.map +1 -0
  27. package/dist/types/{nestjs-config-aws/src/config.module.d.ts → config.module.d.ts} +2 -8
  28. package/dist/types/config.module.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +10 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/interfaces/config-service.interface.d.ts.map +1 -0
  32. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/default-schema.interface.d.ts +14 -14
  33. package/dist/types/interfaces/default-schema.interface.d.ts.map +1 -0
  34. package/dist/types/interfaces/index.d.ts.map +1 -0
  35. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/module-options.interface.d.ts +22 -3
  36. package/dist/types/interfaces/module-options.interface.d.ts.map +1 -0
  37. package/dist/types/services/config.service.d.ts.map +1 -0
  38. package/package.json +13 -7
  39. package/dist/cjs/config-aws/src/config-manager.js +0 -366
  40. package/dist/cjs/config-aws/src/errors/index.js +0 -77
  41. package/dist/cjs/config-aws/src/index.js +0 -37
  42. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +0 -3
  43. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +0 -3
  44. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +0 -3
  45. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +0 -3
  46. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +0 -3
  47. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -3
  48. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -3
  49. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +0 -169
  50. package/dist/cjs/config-aws/src/loaders/environment.loader.js +0 -85
  51. package/dist/cjs/config-aws/src/loaders/s3.loader.js +0 -145
  52. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +0 -169
  53. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -199
  54. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +0 -98
  55. package/dist/cjs/config-aws/src/utils/validation.util.js +0 -116
  56. package/dist/cjs/nestjs-config-aws/src/config.module.js +0 -175
  57. package/dist/cjs/nestjs-config-aws/src/index.js +0 -61
  58. package/dist/cjs/nestjs-config-aws/src/integration/index.js +0 -23
  59. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -3
  60. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -3
  61. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/index.js +0 -26
  62. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -3
  63. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -3
  64. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  65. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  66. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -4
  67. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -52
  68. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -124
  69. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -592
  70. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -385
  71. package/dist/cjs/nestjs-config-aws/src/integration/providers/index.js +0 -20
  72. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -366
  73. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -267
  74. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -517
  75. package/dist/cjs/nestjs-config-aws/src/integration/services/index.js +0 -26
  76. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -81
  77. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -465
  78. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -318
  79. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -292
  80. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -595
  81. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -283
  82. package/dist/cjs/nestjs-config-aws/src/integration/utils/index.js +0 -19
  83. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -11
  84. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -63
  85. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -3
  86. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +0 -142
  87. package/dist/esm/config-aws/src/config-manager.js +0 -362
  88. package/dist/esm/config-aws/src/errors/index.js +0 -69
  89. package/dist/esm/config-aws/src/index.js +0 -21
  90. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +0 -2
  91. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +0 -2
  92. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +0 -2
  93. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +0 -2
  94. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +0 -2
  95. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -2
  96. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -2
  97. package/dist/esm/config-aws/src/loaders/env-file.loader.js +0 -132
  98. package/dist/esm/config-aws/src/loaders/environment.loader.js +0 -81
  99. package/dist/esm/config-aws/src/loaders/s3.loader.js +0 -141
  100. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +0 -165
  101. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -195
  102. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +0 -94
  103. package/dist/esm/config-aws/src/utils/validation.util.js +0 -112
  104. package/dist/esm/nestjs-config-aws/src/config.module.js +0 -172
  105. package/dist/esm/nestjs-config-aws/src/index.js +0 -23
  106. package/dist/esm/nestjs-config-aws/src/integration/index.js +0 -7
  107. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -2
  108. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -2
  109. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +0 -10
  110. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -2
  111. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -2
  112. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  113. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  114. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -3
  115. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -44
  116. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -121
  117. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -589
  118. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -382
  119. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +0 -4
  120. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -363
  121. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -264
  122. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -514
  123. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +0 -10
  124. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -78
  125. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -462
  126. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -315
  127. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -289
  128. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -589
  129. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -240
  130. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +0 -3
  131. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -7
  132. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -59
  133. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +0 -8
  134. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -2
  135. package/dist/esm/nestjs-config-aws/src/services/config.service.js +0 -139
  136. package/dist/types/config-aws/src/config-manager.d.ts +0 -119
  137. package/dist/types/config-aws/src/config-manager.d.ts.map +0 -1
  138. package/dist/types/config-aws/src/errors/index.d.ts +0 -43
  139. package/dist/types/config-aws/src/errors/index.d.ts.map +0 -1
  140. package/dist/types/config-aws/src/index.d.ts +0 -24
  141. package/dist/types/config-aws/src/index.d.ts.map +0 -1
  142. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +0 -33
  143. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +0 -1
  144. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +0 -86
  145. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +0 -1
  146. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +0 -12
  147. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +0 -1
  148. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +0 -10
  149. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +0 -1
  150. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +0 -14
  151. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +0 -1
  152. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +0 -12
  153. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +0 -1
  154. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +0 -14
  155. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +0 -1
  156. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +0 -69
  157. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +0 -1
  158. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +0 -46
  159. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +0 -1
  160. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +0 -62
  161. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +0 -1
  162. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +0 -68
  163. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +0 -1
  164. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +0 -78
  165. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  166. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +0 -45
  167. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +0 -1
  168. package/dist/types/config-aws/src/utils/validation.util.d.ts +0 -53
  169. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +0 -1
  170. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +0 -1
  171. package/dist/types/nestjs-config-aws/src/index.d.ts +0 -11
  172. package/dist/types/nestjs-config-aws/src/index.d.ts.map +0 -1
  173. package/dist/types/nestjs-config-aws/src/integration/index.d.ts +0 -6
  174. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +0 -1
  175. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts +0 -71
  176. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  177. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts +0 -24
  178. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  179. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts +0 -9
  180. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +0 -1
  181. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts +0 -66
  182. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  183. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts +0 -17
  184. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  185. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts +0 -332
  186. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  187. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts +0 -259
  188. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  189. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts +0 -209
  190. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  191. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts +0 -249
  192. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  193. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts +0 -36
  194. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +0 -1
  195. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts +0 -134
  196. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  197. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts +0 -119
  198. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  199. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts +0 -3
  200. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +0 -1
  201. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts +0 -84
  202. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +0 -1
  203. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts +0 -84
  204. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +0 -1
  205. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts +0 -158
  206. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +0 -1
  207. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts +0 -9
  208. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +0 -1
  209. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts +0 -41
  210. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +0 -1
  211. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts +0 -192
  212. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +0 -1
  213. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts +0 -87
  214. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  215. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts +0 -103
  216. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +0 -1
  217. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts +0 -222
  218. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +0 -1
  219. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts +0 -81
  220. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +0 -1
  221. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts +0 -2
  222. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +0 -1
  223. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +0 -1
  224. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +0 -1
  225. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +0 -1
  226. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +0 -1
  227. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +0 -1
  228. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/config-service.interface.d.ts +0 -0
  229. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/index.d.ts +0 -0
  230. /package/dist/types/{nestjs-config-aws/src/services → services}/config.service.d.ts +0 -0
@@ -1,363 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- var AsyncConfigHelperService_1;
14
- import { Injectable, Logger, Inject, Optional } from '@nestjs/common';
15
- import { FactoryRegistrationService } from './factory-registration.service';
16
- import { NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS } from '../nestjs-config-integration.module';
17
- /**
18
- * Helper service for async configuration support with @nestjs/config.
19
- * This service provides utilities for creating async configuration factories
20
- * and managing dependency injection in async scenarios.
21
- */
22
- let AsyncConfigHelperService = AsyncConfigHelperService_1 = class AsyncConfigHelperService {
23
- factoryRegistrationService;
24
- options;
25
- logger = new Logger(AsyncConfigHelperService_1.name);
26
- constructor(factoryRegistrationService, options = {}) {
27
- this.factoryRegistrationService = factoryRegistrationService;
28
- this.options = options;
29
- }
30
- /**
31
- * Create an async configuration factory that loads AWS configuration.
32
- * This factory can be used with @nestjs/config's load array.
33
- *
34
- * @returns Promise resolving to configuration factory
35
- */
36
- async createAsyncConfigFactory() {
37
- this.logger.debug('Creating async configuration factory');
38
- try {
39
- // Register AWS factories and get the first one
40
- const awsFactories = await this.factoryRegistrationService.registerFactories();
41
- if (awsFactories.length === 0) {
42
- this.logger.warn('No AWS factories available, creating empty factory');
43
- return () => ({});
44
- }
45
- // Create a combined factory that merges all AWS factories
46
- const combinedFactory = () => {
47
- const combinedConfig = {};
48
- for (const factory of awsFactories) {
49
- try {
50
- const factoryConfig = factory();
51
- Object.assign(combinedConfig, factoryConfig);
52
- }
53
- catch (error) {
54
- this.logger.error(`Error executing AWS factory:`, error);
55
- }
56
- }
57
- return combinedConfig;
58
- };
59
- this.logger.debug(`Created async configuration factory with ${awsFactories.length} AWS factories`);
60
- return combinedFactory;
61
- }
62
- catch (error) {
63
- const factoryError = error instanceof Error ? error : new Error(String(error));
64
- this.logger.error('Failed to create async configuration factory:', factoryError);
65
- // Handle error based on options
66
- if (this.options.failOnAwsError) {
67
- throw factoryError;
68
- }
69
- // Return empty factory as fallback
70
- if (this.options.fallbackToLocal) {
71
- this.logger.warn('Returning empty factory due to AWS error');
72
- return () => ({});
73
- }
74
- throw factoryError;
75
- }
76
- }
77
- /**
78
- * Create multiple async configuration factories for namespaces.
79
- * This method creates separate factories for each namespace.
80
- *
81
- * @param namespaces - Array of namespace names
82
- * @returns Promise resolving to array of namespaced configuration factories
83
- */
84
- async createAsyncNamespacedFactories(namespaces) {
85
- this.logger.debug(`Creating async namespaced factories for: ${namespaces.join(', ')}`);
86
- try {
87
- const namespacedFactories = await this.factoryRegistrationService.registerNamespacedFactories(namespaces);
88
- if (namespacedFactories.length === 0) {
89
- this.logger.warn('No namespaced factories available, creating empty factories');
90
- return namespaces.map(() => () => ({}));
91
- }
92
- this.logger.debug(`Created ${namespacedFactories.length} async namespaced factories`);
93
- return namespacedFactories;
94
- }
95
- catch (error) {
96
- const namespacedError = error instanceof Error ? error : new Error(String(error));
97
- this.logger.error('Failed to create async namespaced factories:', namespacedError);
98
- // Handle error based on options
99
- if (this.options.failOnAwsError) {
100
- throw namespacedError;
101
- }
102
- // Return empty factories as fallback
103
- if (this.options.fallbackToLocal) {
104
- this.logger.warn('Returning empty namespaced factories due to AWS error');
105
- return namespaces.map(() => () => ({}));
106
- }
107
- throw namespacedError;
108
- }
109
- }
110
- /**
111
- * Create an async factory function that can be used with dependency injection.
112
- * This method creates a factory that can receive injected dependencies.
113
- *
114
- * @param dependencies - Array of dependency tokens to inject
115
- * @returns Async factory function
116
- */
117
- createAsyncFactoryWithDependencies(dependencies = []) {
118
- this.logger.debug(`Creating async factory with ${dependencies.length} dependencies`);
119
- return async (..._injectedDependencies) => {
120
- try {
121
- this.logger.debug('Executing async factory with dependencies');
122
- // Create AWS configuration factory
123
- const awsFactory = await this.createAsyncConfigFactory();
124
- // Create enhanced configuration options
125
- const configOptions = {
126
- load: [awsFactory],
127
- isGlobal: this.options.registerGlobally ?? true,
128
- cache: this.options.factoryOptions?.cache ?? true,
129
- expandVariables: this.options.factoryOptions?.expandVariables ?? true,
130
- };
131
- this.logger.debug('Async factory with dependencies executed successfully');
132
- return configOptions;
133
- }
134
- catch (error) {
135
- const dependencyError = error instanceof Error ? error : new Error(String(error));
136
- this.logger.error('Failed to execute async factory with dependencies:', dependencyError);
137
- // Handle error based on options
138
- if (this.options.failOnAwsError) {
139
- throw dependencyError;
140
- }
141
- // Return basic configuration as fallback
142
- if (this.options.fallbackToLocal) {
143
- this.logger.warn('Returning basic configuration due to dependency error');
144
- return {
145
- load: [],
146
- isGlobal: this.options.registerGlobally ?? true,
147
- cache: this.options.factoryOptions?.cache ?? true,
148
- expandVariables: this.options.factoryOptions?.expandVariables ?? true,
149
- };
150
- }
151
- throw dependencyError;
152
- }
153
- };
154
- }
155
- /**
156
- * Create an async factory that merges with existing configuration.
157
- * This method creates a factory that can be combined with other configuration sources.
158
- *
159
- * @param existingFactory - Existing configuration factory to merge with
160
- * @returns Promise resolving to merged configuration factory
161
- */
162
- async createMergedAsyncFactory(existingFactory) {
163
- this.logger.debug('Creating merged async configuration factory');
164
- try {
165
- // Create AWS configuration factory
166
- const awsFactory = await this.createAsyncConfigFactory();
167
- // If no existing factory, return AWS factory
168
- if (!existingFactory) {
169
- return awsFactory;
170
- }
171
- // Create merged factory
172
- const mergedFactory = () => {
173
- const awsConfig = awsFactory();
174
- const existingConfig = existingFactory();
175
- // Merge configurations based on precedence
176
- const precedence = this.options.precedence || 'aws-first';
177
- if (precedence === 'aws-first') {
178
- return { ...existingConfig, ...awsConfig };
179
- }
180
- else if (precedence === 'local-first') {
181
- return { ...awsConfig, ...existingConfig };
182
- }
183
- else {
184
- // merge - deep merge both configurations
185
- return this.deepMerge(existingConfig, awsConfig);
186
- }
187
- };
188
- this.logger.debug('Created merged async configuration factory');
189
- return mergedFactory;
190
- }
191
- catch (error) {
192
- const mergeError = error instanceof Error ? error : new Error(String(error));
193
- this.logger.error('Failed to create merged async factory:', mergeError);
194
- // Handle error based on options
195
- if (this.options.failOnAwsError) {
196
- throw mergeError;
197
- }
198
- // Return existing factory or empty factory as fallback
199
- if (this.options.fallbackToLocal) {
200
- this.logger.warn('Returning existing factory due to merge error');
201
- return existingFactory || (() => ({}));
202
- }
203
- throw mergeError;
204
- }
205
- }
206
- /**
207
- * Create configuration options for async module setup.
208
- * This method creates options that can be used with ConfigModule.forRoot().
209
- *
210
- * @param baseOptions - Base configuration options to enhance
211
- * @returns Promise resolving to enhanced configuration options
212
- */
213
- async createAsyncConfigOptions(baseOptions = {}) {
214
- this.logger.debug('Creating async configuration options');
215
- try {
216
- // Create AWS configuration factory
217
- const awsFactory = await this.createAsyncConfigFactory();
218
- // Merge with existing load array
219
- const existingLoad = baseOptions.load || [];
220
- const enhancedLoad = [...existingLoad, awsFactory];
221
- // Create enhanced options
222
- const enhancedOptions = {
223
- ...baseOptions,
224
- load: enhancedLoad,
225
- isGlobal: baseOptions.isGlobal !== undefined ? baseOptions.isGlobal : (this.options.registerGlobally ?? true),
226
- cache: baseOptions.cache !== undefined ? baseOptions.cache : (this.options.factoryOptions?.cache ?? true),
227
- expandVariables: baseOptions.expandVariables !== undefined ? baseOptions.expandVariables : (this.options.factoryOptions?.expandVariables ?? true),
228
- };
229
- this.logger.debug('Created async configuration options');
230
- return enhancedOptions;
231
- }
232
- catch (error) {
233
- const optionsError = error instanceof Error ? error : new Error(String(error));
234
- this.logger.error('Failed to create async configuration options:', optionsError);
235
- // Handle error based on options
236
- if (this.options.failOnAwsError) {
237
- throw optionsError;
238
- }
239
- // Return base options as fallback
240
- if (this.options.fallbackToLocal) {
241
- this.logger.warn('Returning base options due to async error');
242
- return baseOptions;
243
- }
244
- throw optionsError;
245
- }
246
- }
247
- /**
248
- * Check if AWS configuration is available for async loading.
249
- * This method can be used to determine if AWS integration should be enabled.
250
- *
251
- * @returns Promise resolving to availability status
252
- */
253
- async checkAsyncAvailability() {
254
- this.logger.debug('Checking async configuration availability');
255
- const status = {
256
- isAvailable: false,
257
- factoriesCount: 0,
258
- errors: []
259
- };
260
- try {
261
- // Try to register factories to check availability
262
- const factories = await this.factoryRegistrationService.registerFactories();
263
- status.isAvailable = factories.length > 0;
264
- status.factoriesCount = factories.length;
265
- this.logger.debug(`Async availability check: available=${status.isAvailable}, factories=${status.factoriesCount}`);
266
- }
267
- catch (error) {
268
- const availabilityError = error instanceof Error ? error : new Error(String(error));
269
- status.errors.push(availabilityError.message);
270
- this.logger.error('Async availability check failed:', availabilityError);
271
- }
272
- return status;
273
- }
274
- /**
275
- * Create a factory that loads configuration on-demand.
276
- * This factory delays AWS configuration loading until it's actually needed.
277
- *
278
- * @returns Configuration factory with lazy loading
279
- */
280
- createLazyAsyncFactory() {
281
- this.logger.debug('Creating lazy async configuration factory');
282
- let cachedConfig = null;
283
- let loadingPromise = null;
284
- return () => {
285
- // Return cached config if available
286
- if (cachedConfig !== null) {
287
- return cachedConfig;
288
- }
289
- // If already loading, wait for the promise
290
- if (loadingPromise) {
291
- // For synchronous factory, we can't wait for async operations
292
- // Return empty config and let the promise resolve in background
293
- this.logger.warn('Lazy factory called while loading, returning empty config');
294
- return {};
295
- }
296
- // Start loading configuration and update cache when complete
297
- loadingPromise = this.loadConfigurationLazily()
298
- .then((config) => {
299
- cachedConfig = config;
300
- loadingPromise = null;
301
- return config;
302
- })
303
- .catch((error) => {
304
- loadingPromise = null;
305
- this.logger.error('Lazy loading failed:', error);
306
- return {};
307
- });
308
- // Return empty config for now (will be populated on next call)
309
- this.logger.debug('Started lazy loading, returning empty config');
310
- return {};
311
- };
312
- }
313
- /**
314
- * Load configuration lazily for the lazy factory.
315
- * @returns Promise resolving to configuration data
316
- */
317
- async loadConfigurationLazily() {
318
- try {
319
- this.logger.debug('Loading configuration lazily');
320
- const awsFactory = await this.createAsyncConfigFactory();
321
- const config = awsFactory();
322
- this.logger.debug('Lazy configuration loading completed');
323
- return config;
324
- }
325
- catch (error) {
326
- const lazyError = error instanceof Error ? error : new Error(String(error));
327
- this.logger.error('Lazy configuration loading failed:', lazyError);
328
- // Return empty config on error
329
- return {};
330
- }
331
- }
332
- /**
333
- * Deep merge two configuration objects.
334
- * @param target - Target object
335
- * @param source - Source object
336
- * @returns Merged object
337
- */
338
- deepMerge(target, source) {
339
- const result = { ...target };
340
- for (const [key, value] of Object.entries(source)) {
341
- if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
342
- if (result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {
343
- result[key] = this.deepMerge(result[key], value);
344
- }
345
- else {
346
- result[key] = { ...value };
347
- }
348
- }
349
- else {
350
- result[key] = value;
351
- }
352
- }
353
- return result;
354
- }
355
- };
356
- AsyncConfigHelperService = AsyncConfigHelperService_1 = __decorate([
357
- Injectable(),
358
- __param(1, Optional()),
359
- __param(1, Inject(NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
360
- __metadata("design:paramtypes", [FactoryRegistrationService, Object])
361
- ], AsyncConfigHelperService);
362
- export { AsyncConfigHelperService };
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtY29uZmlnLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL2FzeW5jLWNvbmZpZy1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTVGOzs7O0dBSUc7QUFFSSxJQUFNLHdCQUF3QixnQ0FBOUIsTUFBTSx3QkFBd0I7SUFJaEI7SUFFQTtJQUxGLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQywwQkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRSxZQUNtQiwwQkFBc0QsRUFFdEQsVUFBOEIsRUFBRTtRQUZoQywrQkFBMEIsR0FBMUIsMEJBQTBCLENBQTRCO1FBRXRELFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQ2hELENBQUM7SUFFSjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyx3QkFBd0I7UUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUM7WUFDSCwrQ0FBK0M7WUFDL0MsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUUvRSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixDQUFDO1lBRUQsMERBQTBEO1lBQzFELE1BQU0sZUFBZSxHQUFrQixHQUFHLEVBQUU7Z0JBQzFDLE1BQU0sY0FBYyxHQUF3QixFQUFFLENBQUM7Z0JBRS9DLEtBQUssTUFBTSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQzt3QkFDSCxNQUFNLGFBQWEsR0FBRyxPQUFPLEVBQUUsQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQy9DLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDM0QsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE9BQU8sY0FBYyxDQUFDO1lBQ3hCLENBQUMsQ0FBQztZQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRDQUE0QyxZQUFZLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ25HLE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVqRixnQ0FBZ0M7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLFlBQVksQ0FBQztZQUNyQixDQUFDO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFFRCxNQUFNLFlBQVksQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxVQUFvQjtRQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUxRyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztnQkFDaEYsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxtQkFBbUIsQ0FBQyxNQUFNLDZCQUE2QixDQUFDLENBQUM7WUFDdEYsT0FBTyxtQkFBbUIsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sZUFBZSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFbkYsZ0NBQWdDO1lBQ2hDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxlQUFlLENBQUM7WUFDeEIsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7Z0JBQzFFLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUVELE1BQU0sZUFBZSxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsa0NBQWtDLENBQUMsZUFBc0IsRUFBRTtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsWUFBWSxDQUFDLE1BQU0sZUFBZSxDQUFDLENBQUM7UUFFckYsT0FBTyxLQUFLLEVBQUUsR0FBRyxxQkFBNEIsRUFBZ0MsRUFBRTtZQUM3RSxJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFFL0QsbUNBQW1DO2dCQUNuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUV6RCx3Q0FBd0M7Z0JBQ3hDLE1BQU0sYUFBYSxHQUF3QjtvQkFDekMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNsQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO29CQUMvQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLElBQUk7b0JBQ2pELGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLElBQUksSUFBSTtpQkFDdEUsQ0FBQztnQkFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO2dCQUMzRSxPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLGVBQWUsR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNsRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvREFBb0QsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFFekYsZ0NBQWdDO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sZUFBZSxDQUFDO2dCQUN4QixDQUFDO2dCQUVELHlDQUF5QztnQkFDekMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO29CQUMxRSxPQUFPO3dCQUNMLElBQUksRUFBRSxFQUFFO3dCQUNSLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLElBQUk7d0JBQy9DLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksSUFBSTt3QkFDakQsZUFBZSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLGVBQWUsSUFBSSxJQUFJO3FCQUN0RSxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxlQUFlLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQUMsZUFBK0I7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUM7WUFDSCxtQ0FBbUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUV6RCw2Q0FBNkM7WUFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNyQixPQUFPLFVBQVUsQ0FBQztZQUNwQixDQUFDO1lBRUQsd0JBQXdCO1lBQ3hCLE1BQU0sYUFBYSxHQUFrQixHQUFHLEVBQUU7Z0JBQ3hDLE1BQU0sU0FBUyxHQUFHLFVBQVUsRUFBRSxDQUFDO2dCQUMvQixNQUFNLGNBQWMsR0FBRyxlQUFlLEVBQUUsQ0FBQztnQkFFekMsMkNBQTJDO2dCQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxXQUFXLENBQUM7Z0JBRTFELElBQUksVUFBVSxLQUFLLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQztnQkFDN0MsQ0FBQztxQkFBTSxJQUFJLFVBQVUsS0FBSyxhQUFhLEVBQUUsQ0FBQztvQkFDeEMsT0FBTyxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7Z0JBQzdDLENBQUM7cUJBQU0sQ0FBQztvQkFDTix5Q0FBeUM7b0JBQ3pDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ25ELENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxVQUFVLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUV4RSxnQ0FBZ0M7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLFVBQVUsQ0FBQztZQUNuQixDQUFDO1lBRUQsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztnQkFDbEUsT0FBTyxlQUFlLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsQ0FBQztZQUVELE1BQU0sVUFBVSxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QixDQUFDLGNBQW1DLEVBQUU7UUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUUxRCxJQUFJLENBQUM7WUFDSCxtQ0FBbUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUV6RCxpQ0FBaUM7WUFDakMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDNUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFHLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUVuRCwwQkFBMEI7WUFDMUIsTUFBTSxlQUFlLEdBQXdCO2dCQUMzQyxHQUFHLFdBQVc7Z0JBQ2QsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQztnQkFDN0csS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUM7Z0JBQ3pHLGVBQWUsRUFBRSxXQUFXLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxlQUFlLElBQUksSUFBSSxDQUFDO2FBQ2xKLENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sZUFBZSxDQUFDO1FBQ3pCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUVqRixnQ0FBZ0M7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLFlBQVksQ0FBQztZQUNyQixDQUFDO1lBRUQsa0NBQWtDO1lBQ2xDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFDOUQsT0FBTyxXQUFXLENBQUM7WUFDckIsQ0FBQztZQUVELE1BQU0sWUFBWSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsc0JBQXNCO1FBSzFCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFL0QsTUFBTSxNQUFNLEdBQUc7WUFDYixXQUFXLEVBQUUsS0FBSztZQUNsQixjQUFjLEVBQUUsQ0FBQztZQUNqQixNQUFNLEVBQUUsRUFBYztTQUN2QixDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsa0RBQWtEO1lBQ2xELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFNUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7WUFFekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLE1BQU0sQ0FBQyxXQUFXLGVBQWUsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDckgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLGlCQUFpQixHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEYsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsc0JBQXNCO1FBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFFL0QsSUFBSSxZQUFZLEdBQStCLElBQUksQ0FBQztRQUNwRCxJQUFJLGNBQWMsR0FBd0MsSUFBSSxDQUFDO1FBRS9ELE9BQU8sR0FBRyxFQUFFO1lBQ1Ysb0NBQW9DO1lBQ3BDLElBQUksWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxQixPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDO1lBRUQsMkNBQTJDO1lBQzNDLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ25CLDhEQUE4RDtnQkFDOUQsZ0VBQWdFO2dCQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFDO2dCQUM5RSxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUM7WUFFRCw2REFBNkQ7WUFDN0QsY0FBYyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtpQkFDNUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2YsWUFBWSxHQUFHLE1BQU0sQ0FBQztnQkFDdEIsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDdEIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNmLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1lBRUwsK0RBQStEO1lBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDbEUsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLHVCQUF1QjtRQUNuQyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBRWxELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDekQsTUFBTSxNQUFNLEdBQUcsVUFBVSxFQUFFLENBQUM7WUFFNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sU0FBUyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFbkUsK0JBQStCO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFNBQVMsQ0FBQyxNQUEyQixFQUFFLE1BQTJCO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUU3QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2xELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3pFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDbEYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUE7QUFuWVksd0JBQXdCO0lBRHBDLFVBQVUsRUFBRTtJQU1SLFdBQUEsUUFBUSxFQUFFLENBQUE7SUFBRSxXQUFBLE1BQU0sQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO3FDQURiLDBCQUEwQjtHQUo5RCx3QkFBd0IsQ0FtWXBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdGYWN0b3J5LCBDb25maWdNb2R1bGVPcHRpb25zIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSB9IGZyb20gJy4vZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEludGVncmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZWdyYXRpb24tb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBORVNUSlNfQ09ORklHX0FXU19JTlRFR1JBVElPTl9PUFRJT05TIH0gZnJvbSAnLi4vbmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5tb2R1bGUnO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBzZXJ2aWNlIGZvciBhc3luYyBjb25maWd1cmF0aW9uIHN1cHBvcnQgd2l0aCBAbmVzdGpzL2NvbmZpZy5cclxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgY3JlYXRpbmcgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICogYW5kIG1hbmFnaW5nIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIGFzeW5jIHNjZW5hcmlvcy5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFzeW5jQ29uZmlnSGVscGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEFzeW5jQ29uZmlnSGVscGVyU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlOiBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkVTVEpTX0NPTkZJR19BV1NfSU5URUdSQVRJT05fT1BUSU9OUykgXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucyA9IHt9XHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3J5IHRoYXQgbG9hZHMgQVdTIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogVGhpcyBmYWN0b3J5IGNhbiBiZSB1c2VkIHdpdGggQG5lc3Rqcy9jb25maWcncyBsb2FkIGFycmF5LlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUFzeW5jQ29uZmlnRmFjdG9yeSgpOiBQcm9taXNlPENvbmZpZ0ZhY3Rvcnk+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gUmVnaXN0ZXIgQVdTIGZhY3RvcmllcyBhbmQgZ2V0IHRoZSBmaXJzdCBvbmVcclxuICAgICAgY29uc3QgYXdzRmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGF3c0ZhY3Rvcmllcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdObyBBV1MgZmFjdG9yaWVzIGF2YWlsYWJsZSwgY3JlYXRpbmcgZW1wdHkgZmFjdG9yeScpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAoe30pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgYSBjb21iaW5lZCBmYWN0b3J5IHRoYXQgbWVyZ2VzIGFsbCBBV1MgZmFjdG9yaWVzXHJcbiAgICAgIGNvbnN0IGNvbWJpbmVkRmFjdG9yeTogQ29uZmlnRmFjdG9yeSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjb21iaW5lZENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgZmFjdG9yeSBvZiBhd3NGYWN0b3JpZXMpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnlDb25maWcgPSBmYWN0b3J5KCk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRDb25maWcsIGZhY3RvcnlDb25maWcpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGV4ZWN1dGluZyBBV1MgZmFjdG9yeTpgLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb21iaW5lZENvbmZpZztcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIGFzeW5jIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSB3aXRoICR7YXdzRmFjdG9yaWVzLmxlbmd0aH0gQVdTIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gY29tYmluZWRGYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgZmFjdG9yeUVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBjb25maWd1cmF0aW9uIGZhY3Rvcnk6JywgZmFjdG9yeUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEhhbmRsZSBlcnJvciBiYXNlZCBvbiBvcHRpb25zXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBmYWN0b3J5IGFzIGZhbGxiYWNrXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGVtcHR5IGZhY3RvcnkgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAoe30pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgbXVsdGlwbGUgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgZm9yIG5hbWVzcGFjZXMuXHJcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBzZXBhcmF0ZSBmYWN0b3JpZXMgZm9yIGVhY2ggbmFtZXNwYWNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gQXJyYXkgb2YgbmFtZXNwYWNlIG5hbWVzXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUFzeW5jTmFtZXNwYWNlZEZhY3RvcmllcyhuYW1lc3BhY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeVtdPiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYXN5bmMgbmFtZXNwYWNlZCBmYWN0b3JpZXMgZm9yOiAke25hbWVzcGFjZXMuam9pbignLCAnKX1gKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEZhY3RvcmllcyA9IGF3YWl0IHRoaXMuZmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UucmVnaXN0ZXJOYW1lc3BhY2VkRmFjdG9yaWVzKG5hbWVzcGFjZXMpO1xyXG4gICAgICBcclxuICAgICAgaWYgKG5hbWVzcGFjZWRGYWN0b3JpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignTm8gbmFtZXNwYWNlZCBmYWN0b3JpZXMgYXZhaWxhYmxlLCBjcmVhdGluZyBlbXB0eSBmYWN0b3JpZXMnKTtcclxuICAgICAgICByZXR1cm4gbmFtZXNwYWNlcy5tYXAoKCkgPT4gKCkgPT4gKHt9KSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkICR7bmFtZXNwYWNlZEZhY3Rvcmllcy5sZW5ndGh9IGFzeW5jIG5hbWVzcGFjZWQgZmFjdG9yaWVzYCk7XHJcbiAgICAgIHJldHVybiBuYW1lc3BhY2VkRmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBuYW1lc3BhY2VkIGZhY3RvcmllczonLCBuYW1lc3BhY2VkRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gSGFuZGxlIGVycm9yIGJhc2VkIG9uIG9wdGlvbnNcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG5hbWVzcGFjZWRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGZhY3RvcmllcyBhcyBmYWxsYmFja1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1JldHVybmluZyBlbXB0eSBuYW1lc3BhY2VkIGZhY3RvcmllcyBkdWUgdG8gQVdTIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXMubWFwKCgpID0+ICgpID0+ICh7fSkpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBuYW1lc3BhY2VkRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gYXN5bmMgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXHJcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIGZhY3RvcnkgdGhhdCBjYW4gcmVjZWl2ZSBpbmplY3RlZCBkZXBlbmRlbmNpZXMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyAtIEFycmF5IG9mIGRlcGVuZGVuY3kgdG9rZW5zIHRvIGluamVjdFxyXG4gICAqIEByZXR1cm5zIEFzeW5jIGZhY3RvcnkgZnVuY3Rpb25cclxuICAgKi9cclxuICBjcmVhdGVBc3luY0ZhY3RvcnlXaXRoRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczogYW55W10gPSBbXSk6ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxDb25maWdNb2R1bGVPcHRpb25zPiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYXN5bmMgZmFjdG9yeSB3aXRoICR7ZGVwZW5kZW5jaWVzLmxlbmd0aH0gZGVwZW5kZW5jaWVzYCk7XHJcbiAgICBcclxuICAgIHJldHVybiBhc3luYyAoLi4uX2luamVjdGVkRGVwZW5kZW5jaWVzOiBhbnlbXSk6IFByb21pc2U8Q29uZmlnTW9kdWxlT3B0aW9ucz4gPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgYXN5bmMgZmFjdG9yeSB3aXRoIGRlcGVuZGVuY2llcycpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENyZWF0ZSBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3J5XHJcbiAgICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ09wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBsb2FkOiBbYXdzRmFjdG9yeV0sXHJcbiAgICAgICAgICBpc0dsb2JhbDogdGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICAgIGNhY2hlOiB0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmNhY2hlID8/IHRydWUsXHJcbiAgICAgICAgICBleHBhbmRWYXJpYWJsZXM6IHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uZXhwYW5kVmFyaWFibGVzID8/IHRydWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXN5bmMgZmFjdG9yeSB3aXRoIGRlcGVuZGVuY2llcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICByZXR1cm4gY29uZmlnT3B0aW9ucztcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRlbmN5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIGFzeW5jIGZhY3Rvcnkgd2l0aCBkZXBlbmRlbmNpZXM6JywgZGVwZW5kZW5jeUVycm9yKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICAgIHRocm93IGRlcGVuZGVuY3lFcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUmV0dXJuIGJhc2ljIGNvbmZpZ3VyYXRpb24gYXMgZmFsbGJhY2tcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGJhc2ljIGNvbmZpZ3VyYXRpb24gZHVlIHRvIGRlcGVuZGVuY3kgZXJyb3InKTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxvYWQ6IFtdLFxyXG4gICAgICAgICAgICBpc0dsb2JhbDogdGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uY2FjaGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgZXhwYW5kVmFyaWFibGVzOiB0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhyb3cgZGVwZW5kZW5jeUVycm9yO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGFzeW5jIGZhY3RvcnkgdGhhdCBtZXJnZXMgd2l0aCBleGlzdGluZyBjb25maWd1cmF0aW9uLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmYWN0b3J5IHRoYXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgY29uZmlndXJhdGlvbiBzb3VyY2VzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBleGlzdGluZ0ZhY3RvcnkgLSBFeGlzdGluZyBjb25maWd1cmF0aW9uIGZhY3RvcnkgdG8gbWVyZ2Ugd2l0aFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG1lcmdlZCBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNZXJnZWRBc3luY0ZhY3RvcnkoZXhpc3RpbmdGYWN0b3J5PzogQ29uZmlnRmFjdG9yeSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIG1lcmdlZCBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIEFXUyBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBJZiBubyBleGlzdGluZyBmYWN0b3J5LCByZXR1cm4gQVdTIGZhY3RvcnlcclxuICAgICAgaWYgKCFleGlzdGluZ0ZhY3RvcnkpIHtcclxuICAgICAgICByZXR1cm4gYXdzRmFjdG9yeTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gQ3JlYXRlIG1lcmdlZCBmYWN0b3J5XHJcbiAgICAgIGNvbnN0IG1lcmdlZEZhY3Rvcnk6IENvbmZpZ0ZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXdzQ29uZmlnID0gYXdzRmFjdG9yeSgpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gZXhpc3RpbmdGYWN0b3J5KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTWVyZ2UgY29uZmlndXJhdGlvbnMgYmFzZWQgb24gcHJlY2VkZW5jZVxyXG4gICAgICAgIGNvbnN0IHByZWNlZGVuY2UgPSB0aGlzLm9wdGlvbnMucHJlY2VkZW5jZSB8fCAnYXdzLWZpcnN0JztcclxuICAgICAgICBcclxuICAgICAgICBpZiAocHJlY2VkZW5jZSA9PT0gJ2F3cy1maXJzdCcpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLmV4aXN0aW5nQ29uZmlnLCAuLi5hd3NDb25maWcgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHByZWNlZGVuY2UgPT09ICdsb2NhbC1maXJzdCcpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLmF3c0NvbmZpZywgLi4uZXhpc3RpbmdDb25maWcgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gbWVyZ2UgLSBkZWVwIG1lcmdlIGJvdGggY29uZmlndXJhdGlvbnNcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRlZXBNZXJnZShleGlzdGluZ0NvbmZpZywgYXdzQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRlZCBtZXJnZWQgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3J5Jyk7XHJcbiAgICAgIHJldHVybiBtZXJnZWRGYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbWVyZ2VFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgbWVyZ2VkIGFzeW5jIGZhY3Rvcnk6JywgbWVyZ2VFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbWVyZ2VFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGV4aXN0aW5nIGZhY3Rvcnkgb3IgZW1wdHkgZmFjdG9yeSBhcyBmYWxsYmFja1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1JldHVybmluZyBleGlzdGluZyBmYWN0b3J5IGR1ZSB0byBtZXJnZSBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBleGlzdGluZ0ZhY3RvcnkgfHwgKCgpID0+ICh7fSkpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBtZXJnZUVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYXN5bmMgbW9kdWxlIHNldHVwLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggQ29uZmlnTW9kdWxlLmZvclJvb3QoKS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gYmFzZU9wdGlvbnMgLSBCYXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBlbmhhbmNlXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZW5oYW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlQXN5bmNDb25maWdPcHRpb25zKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPENvbmZpZ01vZHVsZU9wdGlvbnM+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBhc3luYyBjb25maWd1cmF0aW9uIG9wdGlvbnMnKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIEFXUyBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIGxvYWQgYXJyYXlcclxuICAgICAgY29uc3QgZXhpc3RpbmdMb2FkID0gYmFzZU9wdGlvbnMubG9hZCB8fCBbXTtcclxuICAgICAgY29uc3QgZW5oYW5jZWRMb2FkID0gWy4uLmV4aXN0aW5nTG9hZCwgYXdzRmFjdG9yeV07XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgZW5oYW5jZWQgb3B0aW9uc1xyXG4gICAgICBjb25zdCBlbmhhbmNlZE9wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgLi4uYmFzZU9wdGlvbnMsXHJcbiAgICAgICAgbG9hZDogZW5oYW5jZWRMb2FkLFxyXG4gICAgICAgIGlzR2xvYmFsOiBiYXNlT3B0aW9ucy5pc0dsb2JhbCAhPT0gdW5kZWZpbmVkID8gYmFzZU9wdGlvbnMuaXNHbG9iYWwgOiAodGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSksXHJcbiAgICAgICAgY2FjaGU6IGJhc2VPcHRpb25zLmNhY2hlICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5jYWNoZSA6ICh0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmNhY2hlID8/IHRydWUpLFxyXG4gICAgICAgIGV4cGFuZFZhcmlhYmxlczogYmFzZU9wdGlvbnMuZXhwYW5kVmFyaWFibGVzICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5leHBhbmRWYXJpYWJsZXMgOiAodGhpcy5vcHRpb25zLmZhY3RvcnlPcHRpb25zPy5leHBhbmRWYXJpYWJsZXMgPz8gdHJ1ZSksXHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRlZCBhc3luYyBjb25maWd1cmF0aW9uIG9wdGlvbnMnKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkT3B0aW9ucztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnNFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYXN5bmMgY29uZmlndXJhdGlvbiBvcHRpb25zOicsIG9wdGlvbnNFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgb3B0aW9uc0Vycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzZSBvcHRpb25zIGFzIGZhbGxiYWNrXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGJhc2Ugb3B0aW9ucyBkdWUgdG8gYXN5bmMgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYmFzZU9wdGlvbnM7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRocm93IG9wdGlvbnNFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIEFXUyBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgYXN5bmMgbG9hZGluZy5cclxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgQVdTIGludGVncmF0aW9uIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF2YWlsYWJpbGl0eSBzdGF0dXNcclxuICAgKi9cclxuICBhc3luYyBjaGVja0FzeW5jQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8e1xyXG4gICAgaXNBdmFpbGFibGU6IGJvb2xlYW47XHJcbiAgICBmYWN0b3JpZXNDb3VudDogbnVtYmVyO1xyXG4gICAgZXJyb3JzOiBzdHJpbmdbXTtcclxuICB9PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgYXN5bmMgY29uZmlndXJhdGlvbiBhdmFpbGFiaWxpdHknKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc3RhdHVzID0ge1xyXG4gICAgICBpc0F2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgIGZhY3Rvcmllc0NvdW50OiAwLFxyXG4gICAgICBlcnJvcnM6IFtdIGFzIHN0cmluZ1tdXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmYWN0b3JpZXMgdG8gY2hlY2sgYXZhaWxhYmlsaXR5XHJcbiAgICAgIGNvbnN0IGZhY3RvcmllcyA9IGF3YWl0IHRoaXMuZmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UucmVnaXN0ZXJGYWN0b3JpZXMoKTtcclxuICAgICAgXHJcbiAgICAgIHN0YXR1cy5pc0F2YWlsYWJsZSA9IGZhY3Rvcmllcy5sZW5ndGggPiAwO1xyXG4gICAgICBzdGF0dXMuZmFjdG9yaWVzQ291bnQgPSBmYWN0b3JpZXMubGVuZ3RoO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEFzeW5jIGF2YWlsYWJpbGl0eSBjaGVjazogYXZhaWxhYmxlPSR7c3RhdHVzLmlzQXZhaWxhYmxlfSwgZmFjdG9yaWVzPSR7c3RhdHVzLmZhY3Rvcmllc0NvdW50fWApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgYXZhaWxhYmlsaXR5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHN0YXR1cy5lcnJvcnMucHVzaChhdmFpbGFiaWxpdHlFcnJvci5tZXNzYWdlKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0FzeW5jIGF2YWlsYWJpbGl0eSBjaGVjayBmYWlsZWQ6JywgYXZhaWxhYmlsaXR5RXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgbG9hZHMgY29uZmlndXJhdGlvbiBvbi1kZW1hbmQuXHJcbiAgICogVGhpcyBmYWN0b3J5IGRlbGF5cyBBV1MgY29uZmlndXJhdGlvbiBsb2FkaW5nIHVudGlsIGl0J3MgYWN0dWFsbHkgbmVlZGVkLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZmFjdG9yeSB3aXRoIGxhenkgbG9hZGluZ1xyXG4gICAqL1xyXG4gIGNyZWF0ZUxhenlBc3luY0ZhY3RvcnkoKTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgbGF6eSBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgbGV0IGNhY2hlZENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGxvYWRpbmdQcm9taXNlOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHwgbnVsbCA9IG51bGw7XHJcbiAgICBcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIC8vIFJldHVybiBjYWNoZWQgY29uZmlnIGlmIGF2YWlsYWJsZVxyXG4gICAgICBpZiAoY2FjaGVkQ29uZmlnICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZENvbmZpZztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gSWYgYWxyZWFkeSBsb2FkaW5nLCB3YWl0IGZvciB0aGUgcHJvbWlzZVxyXG4gICAgICBpZiAobG9hZGluZ1Byb21pc2UpIHtcclxuICAgICAgICAvLyBGb3Igc3luY2hyb25vdXMgZmFjdG9yeSwgd2UgY2FuJ3Qgd2FpdCBmb3IgYXN5bmMgb3BlcmF0aW9uc1xyXG4gICAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgYW5kIGxldCB0aGUgcHJvbWlzZSByZXNvbHZlIGluIGJhY2tncm91bmRcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdMYXp5IGZhY3RvcnkgY2FsbGVkIHdoaWxlIGxvYWRpbmcsIHJldHVybmluZyBlbXB0eSBjb25maWcnKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFN0YXJ0IGxvYWRpbmcgY29uZmlndXJhdGlvbiBhbmQgdXBkYXRlIGNhY2hlIHdoZW4gY29tcGxldGVcclxuICAgICAgbG9hZGluZ1Byb21pc2UgPSB0aGlzLmxvYWRDb25maWd1cmF0aW9uTGF6aWx5KClcclxuICAgICAgICAudGhlbigoY29uZmlnKSA9PiB7XHJcbiAgICAgICAgICBjYWNoZWRDb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICBsb2FkaW5nUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgbG9hZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0xhenkgbG9hZGluZyBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBmb3Igbm93ICh3aWxsIGJlIHBvcHVsYXRlZCBvbiBuZXh0IGNhbGwpXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTdGFydGVkIGxhenkgbG9hZGluZywgcmV0dXJuaW5nIGVtcHR5IGNvbmZpZycpO1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGxhemlseSBmb3IgdGhlIGxhenkgZmFjdG9yeS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBjb25maWd1cmF0aW9uIGRhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvYWRDb25maWd1cmF0aW9uTGF6aWx5KCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgY29uZmlndXJhdGlvbiBsYXppbHknKTtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGF3c0ZhY3RvcnkgPSBhd2FpdCB0aGlzLmNyZWF0ZUFzeW5jQ29uZmlnRmFjdG9yeSgpO1xyXG4gICAgICBjb25zdCBjb25maWcgPSBhd3NGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTGF6eSBjb25maWd1cmF0aW9uIGxvYWRpbmcgY29tcGxldGVkJyk7XHJcbiAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBsYXp5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdMYXp5IGNvbmZpZ3VyYXRpb24gbG9hZGluZyBmYWlsZWQ6JywgbGF6eUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgb24gZXJyb3JcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVlcCBtZXJnZSB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzLlxyXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0XHJcbiAgICogQHBhcmFtIHNvdXJjZSAtIFNvdXJjZSBvYmplY3RcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWVwTWVyZ2UodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udGFyZ2V0IH07XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xyXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICBpZiAocmVzdWx0W2tleV0gJiYgdHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHRba2V5XSkpIHtcclxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5kZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB7IC4uLnZhbHVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufSJdfQ==