angular-odata 0.126.0 → 0.128.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 (283) hide show
  1. package/esm2022/lib/annotations.mjs +140 -0
  2. package/esm2022/lib/api.mjs +211 -166
  3. package/esm2022/lib/cache/cache.mjs +1 -1
  4. package/esm2022/lib/cache/memory.mjs +1 -1
  5. package/esm2022/lib/client.mjs +8 -48
  6. package/esm2022/lib/constants.mjs +4 -1
  7. package/esm2022/lib/index.mjs +3 -1
  8. package/esm2022/lib/loaders.mjs +23 -17
  9. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +95 -0
  10. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +27 -0
  11. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +24 -0
  12. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +37 -0
  13. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +94 -0
  14. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +7 -0
  15. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +23 -0
  16. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +39 -0
  17. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +15 -0
  18. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +70 -0
  19. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +92 -0
  20. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +15 -0
  21. package/esm2022/lib/metadata/index.mjs +3 -0
  22. package/esm2022/lib/metadata/metadata.mjs +14 -0
  23. package/esm2022/lib/metadata/parser.mjs +563 -0
  24. package/esm2022/lib/models/collection.mjs +202 -207
  25. package/esm2022/lib/models/model.mjs +48 -52
  26. package/esm2022/lib/models/options.mjs +172 -137
  27. package/esm2022/lib/module.mjs +21 -8
  28. package/esm2022/lib/options.mjs +2 -1
  29. package/esm2022/lib/resources/index.mjs +2 -2
  30. package/esm2022/lib/resources/options.mjs +56 -0
  31. package/esm2022/lib/resources/path/handlers.mjs +14 -4
  32. package/esm2022/lib/resources/path/segments.mjs +29 -11
  33. package/esm2022/lib/resources/query/builder.mjs +14 -2
  34. package/esm2022/lib/resources/query/expressions/apply.mjs +236 -0
  35. package/esm2022/lib/resources/query/expressions/base.mjs +1 -1
  36. package/esm2022/lib/resources/query/expressions/compute.mjs +2 -2
  37. package/esm2022/lib/resources/query/expressions/count.mjs +6 -6
  38. package/esm2022/lib/resources/query/expressions/expand.mjs +7 -7
  39. package/esm2022/lib/resources/query/expressions/filter.mjs +6 -6
  40. package/esm2022/lib/resources/query/expressions/index.mjs +2 -1
  41. package/esm2022/lib/resources/query/expressions/orderby.mjs +3 -3
  42. package/esm2022/lib/resources/query/expressions/search.mjs +6 -6
  43. package/esm2022/lib/resources/query/expressions/select.mjs +6 -2
  44. package/esm2022/lib/resources/query/expressions/syntax.mjs +161 -8
  45. package/esm2022/lib/resources/query/handlers.mjs +89 -54
  46. package/esm2022/lib/resources/query/options.mjs +91 -77
  47. package/esm2022/lib/resources/request.mjs +5 -5
  48. package/esm2022/lib/resources/resource.mjs +118 -88
  49. package/esm2022/lib/resources/response.mjs +174 -0
  50. package/esm2022/lib/resources/types/action.mjs +29 -26
  51. package/esm2022/lib/resources/types/batch.mjs +18 -16
  52. package/esm2022/lib/resources/types/count.mjs +7 -7
  53. package/esm2022/lib/resources/types/entity-set.mjs +38 -25
  54. package/esm2022/lib/resources/types/entity.mjs +14 -11
  55. package/esm2022/lib/resources/types/function.mjs +25 -28
  56. package/esm2022/lib/resources/types/metadata.mjs +9 -5
  57. package/esm2022/lib/resources/types/navigation-property.mjs +37 -31
  58. package/esm2022/lib/resources/types/property.mjs +32 -50
  59. package/esm2022/lib/resources/types/reference.mjs +6 -7
  60. package/esm2022/lib/resources/types/singleton.mjs +11 -7
  61. package/esm2022/lib/resources/types/value.mjs +16 -12
  62. package/esm2022/lib/schema/callable.mjs +10 -10
  63. package/esm2022/lib/schema/element.mjs +15 -9
  64. package/esm2022/lib/schema/entity-container.mjs +4 -2
  65. package/esm2022/lib/schema/enum-type.mjs +6 -7
  66. package/esm2022/lib/schema/index.mjs +2 -1
  67. package/esm2022/lib/schema/parsers/callable.mjs +10 -7
  68. package/esm2022/lib/schema/parsers/edm.mjs +6 -4
  69. package/esm2022/lib/schema/parsers/enum-type.mjs +15 -8
  70. package/esm2022/lib/schema/parsers/structured-type.mjs +66 -55
  71. package/esm2022/lib/schema/schema.mjs +18 -34
  72. package/esm2022/lib/schema/singleton.mjs +9 -0
  73. package/esm2022/lib/schema/structured-type.mjs +18 -23
  74. package/esm2022/lib/services/base.mjs +4 -4
  75. package/esm2022/lib/services/entity-set.mjs +12 -2
  76. package/esm2022/lib/services/entity.mjs +2 -2
  77. package/esm2022/lib/services/factory.mjs +22 -11
  78. package/esm2022/lib/services/singleton.mjs +8 -2
  79. package/esm2022/lib/settings.mjs +7 -99
  80. package/esm2022/lib/types.mjs +12 -1
  81. package/esm2022/lib/utils/http.mjs +8 -6
  82. package/fesm2022/angular-odata.mjs +7413 -6579
  83. package/fesm2022/angular-odata.mjs.map +1 -1
  84. package/lib/{resources/responses/annotations.d.ts → annotations.d.ts} +3 -2
  85. package/lib/api.d.ts +29 -26
  86. package/lib/cache/memory.d.ts +1 -1
  87. package/lib/client.d.ts +0 -20
  88. package/lib/constants.d.ts +3 -0
  89. package/lib/index.d.ts +1 -0
  90. package/lib/loaders.d.ts +7 -1
  91. package/lib/metadata/csdl/csdl-annotation.d.ts +123 -0
  92. package/lib/metadata/csdl/csdl-entity-container.d.ts +26 -0
  93. package/lib/metadata/csdl/csdl-entity-set.d.ts +20 -0
  94. package/lib/metadata/csdl/csdl-enum-type.d.ts +29 -0
  95. package/lib/metadata/csdl/csdl-function-action.d.ts +105 -0
  96. package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
  97. package/lib/metadata/csdl/csdl-reference.d.ts +30 -0
  98. package/lib/metadata/csdl/csdl-schema.d.ts +34 -0
  99. package/lib/metadata/csdl/csdl-singleton.d.ts +16 -0
  100. package/lib/metadata/csdl/csdl-structural-property.d.ts +70 -0
  101. package/lib/metadata/csdl/csdl-structured-type.d.ts +73 -0
  102. package/lib/metadata/csdl/csdl-type-definition.d.ts +22 -0
  103. package/lib/metadata/index.d.ts +2 -0
  104. package/lib/metadata/metadata.d.ts +10 -0
  105. package/lib/{resources/responses/metadata.d.ts → metadata/parser.d.ts} +19 -7
  106. package/lib/models/collection.d.ts +23 -12
  107. package/lib/models/model.d.ts +19 -19
  108. package/lib/models/options.d.ts +43 -27
  109. package/lib/module.d.ts +2 -1
  110. package/lib/options.d.ts +5 -0
  111. package/lib/resources/index.d.ts +1 -1
  112. package/lib/resources/{responses/options.d.ts → options.d.ts} +2 -2
  113. package/lib/resources/path/handlers.d.ts +4 -2
  114. package/lib/resources/path/segments.d.ts +13 -1
  115. package/lib/resources/query/builder.d.ts +6 -5
  116. package/lib/resources/query/expressions/apply.d.ts +125 -0
  117. package/lib/resources/query/expressions/base.d.ts +1 -1
  118. package/lib/resources/query/expressions/compute.d.ts +4 -4
  119. package/lib/resources/query/expressions/count.d.ts +3 -3
  120. package/lib/resources/query/expressions/expand.d.ts +8 -8
  121. package/lib/resources/query/expressions/filter.d.ts +3 -3
  122. package/lib/resources/query/expressions/index.d.ts +1 -0
  123. package/lib/resources/query/expressions/orderby.d.ts +7 -6
  124. package/lib/resources/query/expressions/search.d.ts +2 -2
  125. package/lib/resources/query/expressions/select.d.ts +4 -3
  126. package/lib/resources/query/expressions/syntax.d.ts +77 -4
  127. package/lib/resources/query/handlers.d.ts +32 -9
  128. package/lib/resources/query/options.d.ts +20 -10
  129. package/lib/resources/resource.d.ts +32 -16
  130. package/lib/resources/{responses/response.d.ts → response.d.ts} +17 -5
  131. package/lib/resources/types/action.d.ts +12 -10
  132. package/lib/resources/types/batch.d.ts +12 -6
  133. package/lib/resources/types/count.d.ts +1 -5
  134. package/lib/resources/types/entity-set.d.ts +13 -6
  135. package/lib/resources/types/entity.d.ts +3 -4
  136. package/lib/resources/types/function.d.ts +11 -11
  137. package/lib/resources/types/metadata.d.ts +1 -1
  138. package/lib/resources/types/navigation-property.d.ts +13 -7
  139. package/lib/resources/types/property.d.ts +15 -8
  140. package/lib/resources/types/reference.d.ts +2 -4
  141. package/lib/resources/types/singleton.d.ts +4 -6
  142. package/lib/resources/types/value.d.ts +2 -6
  143. package/lib/schema/callable.d.ts +5 -7
  144. package/lib/schema/element.d.ts +11 -4
  145. package/lib/schema/entity-container.d.ts +2 -0
  146. package/lib/schema/enum-type.d.ts +4 -7
  147. package/lib/schema/index.d.ts +1 -0
  148. package/lib/schema/parsers/callable.d.ts +7 -8
  149. package/lib/schema/parsers/enum-type.d.ts +15 -5
  150. package/lib/schema/parsers/structured-type.d.ts +6 -8
  151. package/lib/schema/schema.d.ts +6 -9
  152. package/lib/schema/singleton.d.ts +10 -0
  153. package/lib/schema/structured-type.d.ts +5 -8
  154. package/lib/services/entity-set.d.ts +7 -3
  155. package/lib/services/factory.d.ts +14 -2
  156. package/lib/services/singleton.d.ts +4 -2
  157. package/lib/settings.d.ts +0 -10
  158. package/lib/types.d.ts +23 -3
  159. package/lib/utils/http.d.ts +1 -1
  160. package/package.json +5 -1
  161. package/schematics/apigen/angular/api-config.d.ts +15 -0
  162. package/schematics/apigen/angular/api-config.js +34 -0
  163. package/schematics/apigen/angular/api-config.js.map +1 -0
  164. package/schematics/apigen/angular/base.d.ts +51 -0
  165. package/schematics/apigen/angular/base.js +200 -0
  166. package/schematics/apigen/angular/base.js.map +1 -0
  167. package/schematics/apigen/angular/entity.d.ts +24 -0
  168. package/schematics/apigen/angular/entity.js +71 -0
  169. package/schematics/apigen/angular/entity.js.map +1 -0
  170. package/schematics/apigen/angular/enum.d.ts +25 -0
  171. package/schematics/apigen/angular/enum.js +56 -0
  172. package/schematics/apigen/angular/enum.js.map +1 -0
  173. package/schematics/apigen/angular/import.d.ts +6 -0
  174. package/schematics/apigen/angular/import.js +18 -0
  175. package/schematics/apigen/angular/import.js.map +1 -0
  176. package/schematics/apigen/angular/module.d.ts +18 -0
  177. package/schematics/apigen/angular/module.js +41 -0
  178. package/schematics/apigen/angular/module.js.map +1 -0
  179. package/schematics/apigen/angular/service.d.ts +20 -0
  180. package/schematics/apigen/angular/service.js +76 -0
  181. package/schematics/apigen/angular/service.js.map +1 -0
  182. package/schematics/apigen/files/api-config/__fileName__.ts +9 -0
  183. package/schematics/apigen/files/entity/__fileName__.ts +7 -0
  184. package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +18 -0
  185. package/schematics/apigen/files/entityset-service/__fileName__.ts +27 -0
  186. package/schematics/apigen/files/enum/__fileName__.ts +4 -0
  187. package/schematics/apigen/files/index/__fileName__.ts +2 -0
  188. package/schematics/apigen/files/module/__fileName__.ts +9 -0
  189. package/schematics/apigen/files/singleton-service/__fileName__.ts +18 -0
  190. package/schematics/apigen/index.d.ts +3 -0
  191. package/schematics/apigen/index.js +106 -0
  192. package/schematics/apigen/index.js.map +1 -0
  193. package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +120 -0
  194. package/schematics/apigen/metadata/csdl/csdl-annotation.js +98 -0
  195. package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -0
  196. package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +26 -0
  197. package/schematics/apigen/metadata/csdl/csdl-entity-container.js +30 -0
  198. package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -0
  199. package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +20 -0
  200. package/schematics/apigen/metadata/csdl/csdl-entity-set.js +26 -0
  201. package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -0
  202. package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +28 -0
  203. package/schematics/apigen/metadata/csdl/csdl-enum-type.js +33 -0
  204. package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -0
  205. package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +103 -0
  206. package/schematics/apigen/metadata/csdl/csdl-function-action.js +84 -0
  207. package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -0
  208. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +8 -0
  209. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +11 -0
  210. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -0
  211. package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +30 -0
  212. package/schematics/apigen/metadata/csdl/csdl-reference.js +29 -0
  213. package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -0
  214. package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +32 -0
  215. package/schematics/apigen/metadata/csdl/csdl-schema.js +26 -0
  216. package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -0
  217. package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +18 -0
  218. package/schematics/apigen/metadata/csdl/csdl-singleton.js +25 -0
  219. package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -0
  220. package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +63 -0
  221. package/schematics/apigen/metadata/csdl/csdl-structural-property.js +50 -0
  222. package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -0
  223. package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +64 -0
  224. package/schematics/apigen/metadata/csdl/csdl-structured-type.js +71 -0
  225. package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -0
  226. package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +22 -0
  227. package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
  228. package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -0
  229. package/schematics/apigen/metadata/index.d.ts +1 -0
  230. package/schematics/apigen/metadata/index.js +18 -0
  231. package/schematics/apigen/metadata/index.js.map +1 -0
  232. package/schematics/apigen/metadata/metadata.d.ts +11 -0
  233. package/schematics/apigen/metadata/metadata.js +30 -0
  234. package/schematics/apigen/metadata/metadata.js.map +1 -0
  235. package/schematics/apigen/metadata/parser.d.ts +110 -0
  236. package/schematics/apigen/metadata/parser.js +568 -0
  237. package/schematics/apigen/metadata/parser.js.map +1 -0
  238. package/schematics/apigen/schema.d.ts +8 -0
  239. package/schematics/apigen/schema.js +3 -0
  240. package/schematics/apigen/schema.js.map +1 -0
  241. package/schematics/apigen/schema.json +36 -0
  242. package/schematics/apigen/utils.d.ts +1 -0
  243. package/schematics/apigen/utils.js +75 -0
  244. package/schematics/apigen/utils.js.map +1 -0
  245. package/schematics/collection.json +14 -0
  246. package/schematics/ng-add/index.d.ts +2 -0
  247. package/schematics/ng-add/index.js +13 -0
  248. package/schematics/ng-add/index.js.map +1 -0
  249. package/schematics/random.d.ts +1 -0
  250. package/schematics/random.js +604 -0
  251. package/schematics/random.js.map +1 -0
  252. package/esm2022/lib/resources/responses/annotations.mjs +0 -137
  253. package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
  254. package/esm2022/lib/resources/responses/csdl/csdl-entity-container.mjs +0 -11
  255. package/esm2022/lib/resources/responses/csdl/csdl-entity-set.mjs +0 -9
  256. package/esm2022/lib/resources/responses/csdl/csdl-enum-type.mjs +0 -15
  257. package/esm2022/lib/resources/responses/csdl/csdl-function-action.mjs +0 -56
  258. package/esm2022/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +0 -7
  259. package/esm2022/lib/resources/responses/csdl/csdl-reference.mjs +0 -23
  260. package/esm2022/lib/resources/responses/csdl/csdl-schema.mjs +0 -18
  261. package/esm2022/lib/resources/responses/csdl/csdl-singleton.mjs +0 -8
  262. package/esm2022/lib/resources/responses/csdl/csdl-structural-property.mjs +0 -39
  263. package/esm2022/lib/resources/responses/csdl/csdl-structured-type.mjs +0 -34
  264. package/esm2022/lib/resources/responses/csdl/csdl-type-definition.mjs +0 -14
  265. package/esm2022/lib/resources/responses/index.mjs +0 -5
  266. package/esm2022/lib/resources/responses/metadata.mjs +0 -547
  267. package/esm2022/lib/resources/responses/options.mjs +0 -56
  268. package/esm2022/lib/resources/responses/response.mjs +0 -174
  269. package/esm2022/lib/resources/responses/types.mjs +0 -2
  270. package/lib/resources/responses/csdl/csdl-annotation.d.ts +0 -27
  271. package/lib/resources/responses/csdl/csdl-entity-container.d.ts +0 -12
  272. package/lib/resources/responses/csdl/csdl-entity-set.d.ts +0 -8
  273. package/lib/resources/responses/csdl/csdl-enum-type.d.ts +0 -12
  274. package/lib/resources/responses/csdl/csdl-function-action.d.ts +0 -49
  275. package/lib/resources/responses/csdl/csdl-navigation-property-binding.d.ts +0 -5
  276. package/lib/resources/responses/csdl/csdl-reference.d.ts +0 -18
  277. package/lib/resources/responses/csdl/csdl-schema.d.ts +0 -20
  278. package/lib/resources/responses/csdl/csdl-singleton.d.ts +0 -7
  279. package/lib/resources/responses/csdl/csdl-structural-property.d.ts +0 -31
  280. package/lib/resources/responses/csdl/csdl-structured-type.d.ts +0 -27
  281. package/lib/resources/responses/csdl/csdl-type-definition.d.ts +0 -11
  282. package/lib/resources/responses/index.d.ts +0 -4
  283. package/lib/resources/responses/types.d.ts +0 -13
@@ -0,0 +1,563 @@
1
+ import { CsdlReference } from './csdl/csdl-reference';
2
+ import { CsdlSchema } from './csdl/csdl-schema';
3
+ import { VERSION_4_0 } from '../constants';
4
+ import { ODataMetadata } from './metadata';
5
+ var FieldType;
6
+ (function (FieldType) {
7
+ FieldType[FieldType["ATTRIBUTE"] = 0] = "ATTRIBUTE";
8
+ FieldType[FieldType["TAG"] = 1] = "TAG";
9
+ })(FieldType || (FieldType = {}));
10
+ class Field {
11
+ constructor(name, fieldType) {
12
+ this.name = name;
13
+ this.fieldType = fieldType;
14
+ }
15
+ }
16
+ export class ODataMetadataParser {
17
+ // TAGS
18
+ static { this.TAG_EDMX = 'edmx:Edmx'; }
19
+ static { this.TAG_DATA_SERVICES = 'edmx:DataServices'; }
20
+ static { this.TAG_REFERENCE = 'edmx:Reference'; }
21
+ static { this.TAG_INCLUDE = 'edmx:Include'; }
22
+ static { this.TAG_INCLUDE_ANNOTATIONS = 'edmx:IncludeAnnotations'; }
23
+ static { this.TAG_TERM = 'Term'; }
24
+ static { this.TAG_ANNOTATIONS = 'Annotations'; }
25
+ static { this.TAG_ANNOTATION = 'Annotation'; }
26
+ static { this.TAG_SCHEMA = 'Schema'; }
27
+ static { this.TAG_ENUM_TYPE = 'EnumType'; }
28
+ static { this.TAG_MEMBER = 'Member'; }
29
+ static { this.TAG_COMPLEX_TYPE = 'ComplexType'; }
30
+ static { this.TAG_ENTITY_TYPE = 'EntityType'; }
31
+ static { this.TAG_PROPERTY = 'Property'; }
32
+ static { this.TAG_KEY = 'Key'; }
33
+ static { this.TAG_PROPERTY_REF = 'PropertyRef'; }
34
+ static { this.TAG_NAVIGATION_PROPERTY = 'NavigationProperty'; }
35
+ static { this.TAG_REFERENTIAL_CONSTRAINT = 'ReferentialConstraint'; }
36
+ static { this.TAG_ON_DELETE = 'OnDelete'; }
37
+ static { this.TAG_FUNCTION = 'Function'; }
38
+ static { this.TAG_RETURN_TYPE = 'ReturnType'; }
39
+ static { this.TAG_PARAMETER = 'Parameter'; }
40
+ static { this.TAG_ACTION = 'Action'; }
41
+ static { this.TAG_ENTITY_CONTAINER = 'EntityContainer'; }
42
+ static { this.TAG_ENTITY_SET = 'EntitySet'; }
43
+ static { this.TAG_SINGLETON = 'Singleton'; }
44
+ static { this.TAG_COLLECTION = 'Collection'; }
45
+ static { this.TAG_RECORD = 'Record'; }
46
+ static { this.TAG_STRING = 'String'; }
47
+ static { this.TAG_ENUM_MEMBER = 'EnumMember'; }
48
+ static { this.TAG_PROPERTY_VALUE = 'PropertyValue'; }
49
+ static { this.TAG_PROPERTY_PATH = 'PropertyPath'; }
50
+ static { this.TAG_NAVIGATION_PROPERTY_PATH = 'NavigationPropertyPath'; }
51
+ static { this.TAG_FUNCTION_IMPORT = 'FunctionImport'; }
52
+ static { this.TAG_ACTION_IMPORT = 'ActionImport'; }
53
+ static { this.TAG_NAVIGATION_PROPERTY_BINDING = 'NavigationPropertyBinding'; }
54
+ static { this.TAG_TYPE_DEFINITION = 'TypeDefinition'; }
55
+ // ATTRIBUTES
56
+ static { this.ATTRIBUTE_VERSION = 'Version'; }
57
+ static { this.ATTRIBUTE_URI = 'Uri'; }
58
+ static { this.ATTRIBUTE_ALIAS = 'Alias'; }
59
+ static { this.ATTRIBUTE_NAMESPACE = 'Namespace'; }
60
+ static { this.ATTRIBUTE_TERM_NAMESPACE = 'TermNamespace'; }
61
+ static { this.ATTRIBUTE_QUALIFIER = 'Qualifier'; }
62
+ static { this.ATTRIBUTE_STRING = 'String'; }
63
+ static { this.ATTRIBUTE_DATE = 'Date'; }
64
+ static { this.ATTRIBUTE_BOOL = 'Bool'; }
65
+ static { this.ATTRIBUTE_INT = 'Int'; }
66
+ static { this.ATTRIBUTE_TARGET_NAMESPACE = 'TargetNamespace'; }
67
+ static { this.ATTRIBUTE_TERM = 'Term'; }
68
+ static { this.ATTRIBUTE_NAME = 'Name'; }
69
+ static { this.ATTRIBUTE_VALUE = 'Value'; }
70
+ static { this.ATTRIBUTE_BASE_TYPE = 'BaseType'; }
71
+ static { this.ATTRIBUTE_OPEN_TYPE = 'OpenType'; }
72
+ static { this.ATTRIBUTE_TYPE = 'Type'; }
73
+ static { this.ATTRIBUTE_NULLABLE = 'Nullable'; }
74
+ static { this.ATTRIBUTE_MAX_LENGTH = 'MaxLength'; }
75
+ static { this.ATTRIBUTE_PRECISION = 'Precision'; }
76
+ static { this.ATTRIBUTE_SCALE = 'Scale'; }
77
+ static { this.ATTRIBUTE_UNICODE = 'Unicode'; }
78
+ static { this.ATTRIBUTE_SRID = 'SRID'; }
79
+ static { this.ATTRIBUTE_DEFAULT_VALUE = 'DefaultValue'; }
80
+ static { this.ATTRIBUTE_PARTNER = 'Partner'; }
81
+ static { this.ATTRIBUTE_PROPERTY = 'Property'; }
82
+ static { this.ATTRIBUTE_REFERENCED_PROPERTY = 'ReferencedProperty'; }
83
+ static { this.ATTRIBUTE_HAS_STREAM = 'HasStream'; }
84
+ static { this.ATTRIBUTE_CONTAINS_TARGET = 'ContainsTarget'; }
85
+ static { this.ATTRIBUTE_IS_BOUND = 'IsBound'; }
86
+ static { this.ATTRIBUTE_ENTITY_SET_PATH = 'EntitySetPath'; }
87
+ static { this.ATTRIBUTE_IS_COMPOSABLE = 'IsComposable'; }
88
+ static { this.ATTRIBUTE_ENTITY_TYPE = 'EntityType'; }
89
+ static { this.ATTRIBUTE_PATH = 'Path'; }
90
+ static { this.ATTRIBUTE_TARGET = 'Target'; }
91
+ static { this.ATTRIBUTE_FUNCTION = 'Function'; }
92
+ static { this.ATTRIBUTE_ACTION = 'Action'; }
93
+ static { this.ATTRIBUTE_ENTITY_SET = 'EntitySet'; }
94
+ static { this.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT = 'IncludeInServiceDocument'; }
95
+ static { this.ATTRIBUTE_ABSTRACT = 'Abstract'; }
96
+ static { this.ATTRIBUTE_UNDERLYING_TYPE = 'UnderlyingType'; }
97
+ static { this.ATTRIBUTE_IS_FLAGS = 'IsFlags'; }
98
+ static { this.ATTRIBUTE_EXTENDS = 'Extends'; }
99
+ static { this.ATTRIBUTE_BASE_TERM = 'BaseTerm'; }
100
+ static { this.ATTRIBUTE_APPLIES_TO = 'AppliesTo'; }
101
+ constructor(xml) {
102
+ try {
103
+ const parser = new DOMParser();
104
+ this.document = parser.parseFromString(xml, 'text/xml');
105
+ this.checkVersion(document);
106
+ }
107
+ catch (error) {
108
+ throw new Error('Unable to parse metadata, ' + error);
109
+ }
110
+ }
111
+ metadata() {
112
+ const version = this.getFieldValueByAttribute(new Field(ODataMetadataParser.ATTRIBUTE_VERSION, FieldType.ATTRIBUTE), this.document.documentElement.attributes);
113
+ const references = this.getObjects(this.document.documentElement, ODataMetadataParser.TAG_REFERENCE, [
114
+ new Field(ODataMetadataParser.ATTRIBUTE_URI, FieldType.ATTRIBUTE),
115
+ new Field(ODataMetadataParser.TAG_INCLUDE, FieldType.TAG),
116
+ new Field(ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS, FieldType.TAG),
117
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
118
+ ]).map((t) => new CsdlReference(t));
119
+ const dataServices = this.document.documentElement.getElementsByTagName(ODataMetadataParser.TAG_DATA_SERVICES)[0];
120
+ const schemas = this.getObjects(dataServices, ODataMetadataParser.TAG_SCHEMA, [
121
+ new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
122
+ new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
123
+ new Field(ODataMetadataParser.TAG_ENUM_TYPE, FieldType.TAG),
124
+ new Field(ODataMetadataParser.TAG_COMPLEX_TYPE, FieldType.TAG),
125
+ new Field(ODataMetadataParser.TAG_ENTITY_TYPE, FieldType.TAG),
126
+ new Field(ODataMetadataParser.TAG_FUNCTION, FieldType.TAG),
127
+ new Field(ODataMetadataParser.TAG_ACTION, FieldType.TAG),
128
+ new Field(ODataMetadataParser.TAG_ENTITY_CONTAINER, FieldType.TAG),
129
+ new Field(ODataMetadataParser.TAG_TYPE_DEFINITION, FieldType.TAG),
130
+ new Field(ODataMetadataParser.TAG_TERM, FieldType.TAG),
131
+ new Field(ODataMetadataParser.TAG_ANNOTATIONS, FieldType.TAG),
132
+ ]).map((s) => new CsdlSchema(s));
133
+ return new ODataMetadata(version, references, schemas);
134
+ }
135
+ checkVersion(document) {
136
+ // check version
137
+ const attributes = document.documentElement.attributes;
138
+ if (!attributes) {
139
+ throw new Error('OData version is not specified in the metadata');
140
+ }
141
+ const attr = attributes.getNamedItem('Version');
142
+ if (attr === null) {
143
+ throw new Error('OData version is not specified in the metadata');
144
+ }
145
+ const odataVersion = attr?.nodeValue;
146
+ if (odataVersion !== VERSION_4_0) {
147
+ throw new Error('OData version "' + odataVersion + '" is not supported');
148
+ }
149
+ }
150
+ getObjects(parentElement, tag, fieldNames) {
151
+ let objects = [];
152
+ const children = parentElement.children;
153
+ for (let index = 0; index < children.length; index++) {
154
+ const element = children.item(index);
155
+ if (!element || element.nodeName !== tag) {
156
+ continue;
157
+ }
158
+ const attributes = element.attributes;
159
+ const fieldValues = this.getFieldValues(fieldNames, attributes, element);
160
+ fieldValues['TextContent'] = element.textContent;
161
+ switch (tag) {
162
+ case ODataMetadataParser.TAG_REFERENCE:
163
+ case ODataMetadataParser.TAG_INCLUDE:
164
+ case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
165
+ case ODataMetadataParser.TAG_TERM:
166
+ case ODataMetadataParser.TAG_ANNOTATIONS:
167
+ case ODataMetadataParser.TAG_COLLECTION:
168
+ case ODataMetadataParser.TAG_RECORD:
169
+ case ODataMetadataParser.TAG_STRING:
170
+ case ODataMetadataParser.TAG_ENUM_MEMBER:
171
+ case ODataMetadataParser.TAG_PROPERTY_VALUE:
172
+ case ODataMetadataParser.TAG_PROPERTY_PATH:
173
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
174
+ case ODataMetadataParser.TAG_ANNOTATION:
175
+ case ODataMetadataParser.TAG_SCHEMA:
176
+ case ODataMetadataParser.TAG_ENUM_TYPE:
177
+ case ODataMetadataParser.TAG_COMPLEX_TYPE:
178
+ case ODataMetadataParser.TAG_ENTITY_TYPE:
179
+ case ODataMetadataParser.TAG_FUNCTION:
180
+ case ODataMetadataParser.TAG_MEMBER:
181
+ case ODataMetadataParser.TAG_PROPERTY:
182
+ case ODataMetadataParser.TAG_PROPERTY_REF:
183
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
184
+ case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
185
+ case ODataMetadataParser.TAG_PARAMETER:
186
+ case ODataMetadataParser.TAG_ACTION:
187
+ case ODataMetadataParser.TAG_ENTITY_SET:
188
+ case ODataMetadataParser.TAG_SINGLETON:
189
+ case ODataMetadataParser.TAG_FUNCTION_IMPORT:
190
+ case ODataMetadataParser.TAG_ACTION_IMPORT:
191
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
192
+ case ODataMetadataParser.TAG_TYPE_DEFINITION:
193
+ case ODataMetadataParser.TAG_ENTITY_CONTAINER:
194
+ objects.push(fieldValues);
195
+ break;
196
+ default:
197
+ throw new Error('Unknwon tag:' + tag);
198
+ }
199
+ }
200
+ return objects;
201
+ }
202
+ getObject(parentElement, tag, fieldNames) {
203
+ let object;
204
+ const children = parentElement.children;
205
+ let element;
206
+ for (let index = 0; index < children.length; index++) {
207
+ if (children && children.item(index)?.nodeName === tag) {
208
+ if (element !== undefined && element !== null) {
209
+ throw new Error('Expected one ' + tag);
210
+ }
211
+ element = children.item(index);
212
+ }
213
+ }
214
+ if (element !== undefined && element !== null) {
215
+ const attributes = element.attributes;
216
+ const fieldValues = this.getFieldValues(fieldNames, attributes, element);
217
+ fieldValues['TextContent'] = element.textContent;
218
+ switch (tag) {
219
+ case ODataMetadataParser.TAG_KEY:
220
+ case ODataMetadataParser.TAG_RETURN_TYPE:
221
+ case ODataMetadataParser.TAG_ON_DELETE:
222
+ return fieldValues;
223
+ default:
224
+ throw new Error('Unknwon tag:' + tag);
225
+ }
226
+ }
227
+ return object;
228
+ }
229
+ getFieldValues(fields, attributes, element) {
230
+ const fieldValues = {};
231
+ for (const field of fields) {
232
+ if (field.fieldType === FieldType.TAG) {
233
+ fieldValues[field.name] = this.getFieldValueByTag(field, element);
234
+ }
235
+ else if (field.fieldType === FieldType.ATTRIBUTE) {
236
+ fieldValues[field.name] = this.getFieldValueByAttribute(field, attributes);
237
+ }
238
+ else {
239
+ throw new Error('Unknown field type: ' + field.fieldType);
240
+ }
241
+ }
242
+ return fieldValues;
243
+ }
244
+ getFieldValueByAttribute(field, attributes) {
245
+ switch (field.name) {
246
+ case ODataMetadataParser.ATTRIBUTE_VERSION:
247
+ case ODataMetadataParser.ATTRIBUTE_URI:
248
+ case ODataMetadataParser.ATTRIBUTE_NAMESPACE:
249
+ case ODataMetadataParser.ATTRIBUTE_ALIAS:
250
+ case ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE:
251
+ case ODataMetadataParser.ATTRIBUTE_TERM:
252
+ case ODataMetadataParser.ATTRIBUTE_QUALIFIER:
253
+ case ODataMetadataParser.ATTRIBUTE_STRING:
254
+ case ODataMetadataParser.ATTRIBUTE_BOOL:
255
+ case ODataMetadataParser.ATTRIBUTE_INT:
256
+ case ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE:
257
+ case ODataMetadataParser.ATTRIBUTE_NAME:
258
+ case ODataMetadataParser.ATTRIBUTE_TYPE:
259
+ case ODataMetadataParser.ATTRIBUTE_SRID:
260
+ case ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE:
261
+ case ODataMetadataParser.ATTRIBUTE_PARTNER:
262
+ case ODataMetadataParser.ATTRIBUTE_PROPERTY:
263
+ case ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY:
264
+ case ODataMetadataParser.ATTRIBUTE_BASE_TYPE:
265
+ case ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH:
266
+ case ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE:
267
+ case ODataMetadataParser.ATTRIBUTE_PATH:
268
+ case ODataMetadataParser.ATTRIBUTE_TARGET:
269
+ case ODataMetadataParser.ATTRIBUTE_FUNCTION:
270
+ case ODataMetadataParser.ATTRIBUTE_ACTION:
271
+ case ODataMetadataParser.ATTRIBUTE_ENTITY_SET:
272
+ case ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE:
273
+ case ODataMetadataParser.ATTRIBUTE_EXTENDS:
274
+ case ODataMetadataParser.ATTRIBUTE_BASE_TERM:
275
+ case ODataMetadataParser.ATTRIBUTE_APPLIES_TO:
276
+ return this.getAttributeValue(attributes, field.name);
277
+ case ODataMetadataParser.ATTRIBUTE_NULLABLE:
278
+ case ODataMetadataParser.ATTRIBUTE_UNICODE:
279
+ case ODataMetadataParser.ATTRIBUTE_OPEN_TYPE:
280
+ case ODataMetadataParser.ATTRIBUTE_HAS_STREAM:
281
+ case ODataMetadataParser.ATTRIBUTE_IS_BOUND:
282
+ case ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE:
283
+ case ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET:
284
+ case ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT:
285
+ case ODataMetadataParser.ATTRIBUTE_ABSTRACT:
286
+ case ODataMetadataParser.ATTRIBUTE_IS_FLAGS:
287
+ return this.propertyValueToBoolean(this.getAttributeValue(attributes, field.name));
288
+ case ODataMetadataParser.ATTRIBUTE_VALUE:
289
+ case ODataMetadataParser.ATTRIBUTE_MAX_LENGTH:
290
+ case ODataMetadataParser.ATTRIBUTE_PRECISION:
291
+ case ODataMetadataParser.ATTRIBUTE_SCALE:
292
+ return this.propertyValueToNumber(this.getAttributeValue(attributes, field.name));
293
+ case ODataMetadataParser.ATTRIBUTE_DATE:
294
+ return this.propertyValueToDate(this.getAttributeValue(attributes, field.name));
295
+ default:
296
+ throw new Error('Unknwon attribute:' + field.name);
297
+ }
298
+ }
299
+ getFieldValueByTag(field, element) {
300
+ switch (field.name) {
301
+ case ODataMetadataParser.TAG_INCLUDE:
302
+ return this.getObjects(element, field.name, [
303
+ new Field(ODataMetadataParser.ATTRIBUTE_NAMESPACE, FieldType.ATTRIBUTE),
304
+ new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
305
+ ]);
306
+ case ODataMetadataParser.TAG_INCLUDE_ANNOTATIONS:
307
+ return this.getObjects(element, field.name, [
308
+ new Field(ODataMetadataParser.ATTRIBUTE_TERM_NAMESPACE, FieldType.ATTRIBUTE),
309
+ new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
310
+ new Field(ODataMetadataParser.ATTRIBUTE_TARGET_NAMESPACE, FieldType.ATTRIBUTE),
311
+ ]);
312
+ case ODataMetadataParser.TAG_TERM:
313
+ return this.getObjects(element, field.name, [
314
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
315
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
316
+ new Field(ODataMetadataParser.ATTRIBUTE_BASE_TERM, FieldType.ATTRIBUTE),
317
+ new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
318
+ new Field(ODataMetadataParser.ATTRIBUTE_APPLIES_TO, FieldType.ATTRIBUTE),
319
+ new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
320
+ new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
321
+ new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
322
+ new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
323
+ new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
324
+ new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
325
+ new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
326
+ new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
327
+ ]);
328
+ case ODataMetadataParser.TAG_ANNOTATIONS:
329
+ return this.getObjects(element, field.name, [
330
+ new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
331
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
332
+ new Field(ODataMetadataParser.ATTRIBUTE_QUALIFIER, FieldType.ATTRIBUTE),
333
+ ]);
334
+ case ODataMetadataParser.TAG_ANNOTATION:
335
+ return this.getObjects(element, field.name, [
336
+ new Field(ODataMetadataParser.ATTRIBUTE_TERM, FieldType.ATTRIBUTE),
337
+ new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
338
+ new Field(ODataMetadataParser.ATTRIBUTE_BOOL, FieldType.ATTRIBUTE),
339
+ new Field(ODataMetadataParser.ATTRIBUTE_INT, FieldType.ATTRIBUTE),
340
+ new Field(ODataMetadataParser.TAG_COLLECTION, FieldType.TAG),
341
+ new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
342
+ new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
343
+ ]);
344
+ case ODataMetadataParser.TAG_COLLECTION:
345
+ return this.getObjects(element, field.name, [
346
+ new Field(ODataMetadataParser.TAG_STRING, FieldType.TAG),
347
+ new Field(ODataMetadataParser.TAG_RECORD, FieldType.TAG),
348
+ new Field(ODataMetadataParser.TAG_PROPERTY_PATH, FieldType.TAG),
349
+ new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH, FieldType.TAG),
350
+ ]);
351
+ case ODataMetadataParser.TAG_RECORD:
352
+ return this.getObjects(element, field.name, [
353
+ new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
354
+ ]);
355
+ case ODataMetadataParser.TAG_STRING:
356
+ return this.getObjects(element, field.name, []);
357
+ case ODataMetadataParser.TAG_ENUM_MEMBER:
358
+ return this.getObjects(element, field.name, []);
359
+ case ODataMetadataParser.TAG_PROPERTY_VALUE:
360
+ return this.getObjects(element, field.name, [
361
+ new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
362
+ new Field(ODataMetadataParser.ATTRIBUTE_STRING, FieldType.ATTRIBUTE),
363
+ new Field(ODataMetadataParser.ATTRIBUTE_DATE, FieldType.ATTRIBUTE),
364
+ new Field(ODataMetadataParser.TAG_ENUM_MEMBER, FieldType.TAG),
365
+ ]);
366
+ case ODataMetadataParser.TAG_PROPERTY_PATH:
367
+ return this.getObjects(element, field.name, [
368
+ new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
369
+ ]);
370
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_PATH:
371
+ return this.getObjects(element, field.name, [
372
+ new Field(ODataMetadataParser.TAG_PROPERTY_VALUE, FieldType.TAG),
373
+ ]);
374
+ case ODataMetadataParser.TAG_ENUM_TYPE:
375
+ return this.getObjects(element, field.name, [
376
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
377
+ new Field(ODataMetadataParser.TAG_MEMBER, FieldType.TAG),
378
+ new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
379
+ new Field(ODataMetadataParser.ATTRIBUTE_IS_FLAGS, FieldType.ATTRIBUTE),
380
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
381
+ ]);
382
+ case ODataMetadataParser.TAG_COMPLEX_TYPE:
383
+ return this.getObjects(element, field.name, [
384
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
385
+ new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
386
+ new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
387
+ new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
388
+ new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
389
+ new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
390
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
391
+ ]);
392
+ case ODataMetadataParser.TAG_ENTITY_TYPE:
393
+ return this.getObjects(element, field.name, [
394
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
395
+ new Field(ODataMetadataParser.TAG_KEY, FieldType.TAG),
396
+ new Field(ODataMetadataParser.TAG_PROPERTY, FieldType.TAG),
397
+ new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY, FieldType.TAG),
398
+ new Field(ODataMetadataParser.ATTRIBUTE_BASE_TYPE, FieldType.ATTRIBUTE),
399
+ new Field(ODataMetadataParser.ATTRIBUTE_OPEN_TYPE, FieldType.ATTRIBUTE),
400
+ new Field(ODataMetadataParser.ATTRIBUTE_ABSTRACT, FieldType.ATTRIBUTE),
401
+ new Field(ODataMetadataParser.ATTRIBUTE_HAS_STREAM, FieldType.ATTRIBUTE),
402
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
403
+ ]);
404
+ case ODataMetadataParser.TAG_FUNCTION:
405
+ return this.getObjects(element, field.name, [
406
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
407
+ new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
408
+ new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
409
+ new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
410
+ new Field(ODataMetadataParser.ATTRIBUTE_IS_COMPOSABLE, FieldType.ATTRIBUTE),
411
+ new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
412
+ ]);
413
+ case ODataMetadataParser.TAG_MEMBER:
414
+ return this.getObjects(element, field.name, [
415
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
416
+ new Field(ODataMetadataParser.ATTRIBUTE_VALUE, FieldType.ATTRIBUTE),
417
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
418
+ ]);
419
+ case ODataMetadataParser.TAG_PROPERTY:
420
+ return this.getObjects(element, field.name, [
421
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
422
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
423
+ new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
424
+ new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
425
+ new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
426
+ new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
427
+ new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
428
+ new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
429
+ new Field(ODataMetadataParser.ATTRIBUTE_DEFAULT_VALUE, FieldType.ATTRIBUTE),
430
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
431
+ ]);
432
+ case ODataMetadataParser.TAG_KEY:
433
+ return this.getObject(element, field.name, [
434
+ new Field(ODataMetadataParser.TAG_PROPERTY_REF, FieldType.TAG),
435
+ ]);
436
+ case ODataMetadataParser.TAG_PROPERTY_REF:
437
+ return this.getObjects(element, field.name, [
438
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
439
+ new Field(ODataMetadataParser.ATTRIBUTE_ALIAS, FieldType.ATTRIBUTE),
440
+ ]);
441
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY:
442
+ return this.getObjects(element, field.name, [
443
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
444
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
445
+ new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
446
+ new Field(ODataMetadataParser.ATTRIBUTE_PARTNER, FieldType.ATTRIBUTE),
447
+ new Field(ODataMetadataParser.ATTRIBUTE_CONTAINS_TARGET, FieldType.ATTRIBUTE),
448
+ new Field(ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT, FieldType.TAG),
449
+ new Field(ODataMetadataParser.TAG_ON_DELETE, FieldType.TAG),
450
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
451
+ ]);
452
+ case ODataMetadataParser.TAG_REFERENTIAL_CONSTRAINT:
453
+ return this.getObjects(element, field.name, [
454
+ new Field(ODataMetadataParser.ATTRIBUTE_PROPERTY, FieldType.ATTRIBUTE),
455
+ new Field(ODataMetadataParser.ATTRIBUTE_REFERENCED_PROPERTY, FieldType.ATTRIBUTE),
456
+ ]);
457
+ case ODataMetadataParser.TAG_ON_DELETE:
458
+ return this.getObject(element, field.name, [
459
+ new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
460
+ ]);
461
+ case ODataMetadataParser.TAG_PARAMETER:
462
+ return this.getObjects(element, field.name, [
463
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
464
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
465
+ new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
466
+ new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
467
+ new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
468
+ new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
469
+ new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
470
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
471
+ ]);
472
+ case ODataMetadataParser.TAG_RETURN_TYPE:
473
+ return this.getObject(element, field.name, [
474
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
475
+ new Field(ODataMetadataParser.ATTRIBUTE_NULLABLE, FieldType.ATTRIBUTE),
476
+ new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
477
+ new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
478
+ new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
479
+ new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
480
+ ]);
481
+ case ODataMetadataParser.TAG_ACTION:
482
+ return this.getObjects(element, field.name, [
483
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
484
+ new Field(ODataMetadataParser.TAG_RETURN_TYPE, FieldType.TAG),
485
+ new Field(ODataMetadataParser.ATTRIBUTE_IS_BOUND, FieldType.ATTRIBUTE),
486
+ new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET_PATH, FieldType.ATTRIBUTE),
487
+ new Field(ODataMetadataParser.TAG_PARAMETER, FieldType.TAG),
488
+ ]);
489
+ case ODataMetadataParser.TAG_ENTITY_CONTAINER:
490
+ return this.getObjects(element, field.name, [
491
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
492
+ new Field(ODataMetadataParser.ATTRIBUTE_EXTENDS, FieldType.ATTRIBUTE),
493
+ new Field(ODataMetadataParser.TAG_ENTITY_SET, FieldType.TAG),
494
+ new Field(ODataMetadataParser.TAG_SINGLETON, FieldType.TAG),
495
+ new Field(ODataMetadataParser.TAG_FUNCTION_IMPORT, FieldType.TAG),
496
+ new Field(ODataMetadataParser.TAG_ACTION_IMPORT, FieldType.TAG),
497
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
498
+ ]);
499
+ case ODataMetadataParser.TAG_ENTITY_SET:
500
+ return this.getObjects(element, field.name, [
501
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
502
+ new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_TYPE, FieldType.ATTRIBUTE),
503
+ new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
504
+ new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
505
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
506
+ ]);
507
+ case ODataMetadataParser.TAG_SINGLETON:
508
+ return this.getObjects(element, field.name, [
509
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
510
+ new Field(ODataMetadataParser.ATTRIBUTE_TYPE, FieldType.ATTRIBUTE),
511
+ new Field(ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING, FieldType.TAG),
512
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
513
+ ]);
514
+ case ODataMetadataParser.TAG_FUNCTION_IMPORT:
515
+ return this.getObjects(element, field.name, [
516
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
517
+ new Field(ODataMetadataParser.ATTRIBUTE_FUNCTION, FieldType.ATTRIBUTE),
518
+ new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
519
+ new Field(ODataMetadataParser.ATTRIBUTE_INCLUDE_IN_SERVICE_DOCUMENT, FieldType.ATTRIBUTE),
520
+ ]);
521
+ case ODataMetadataParser.TAG_ACTION_IMPORT:
522
+ return this.getObjects(element, field.name, [
523
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
524
+ new Field(ODataMetadataParser.ATTRIBUTE_ACTION, FieldType.ATTRIBUTE),
525
+ new Field(ODataMetadataParser.ATTRIBUTE_ENTITY_SET, FieldType.ATTRIBUTE),
526
+ ]);
527
+ case ODataMetadataParser.TAG_NAVIGATION_PROPERTY_BINDING:
528
+ return this.getObjects(element, field.name, [
529
+ new Field(ODataMetadataParser.ATTRIBUTE_PATH, FieldType.ATTRIBUTE),
530
+ new Field(ODataMetadataParser.ATTRIBUTE_TARGET, FieldType.ATTRIBUTE),
531
+ ]);
532
+ case ODataMetadataParser.TAG_TYPE_DEFINITION:
533
+ return this.getObjects(element, field.name, [
534
+ new Field(ODataMetadataParser.ATTRIBUTE_NAME, FieldType.ATTRIBUTE),
535
+ new Field(ODataMetadataParser.ATTRIBUTE_UNDERLYING_TYPE, FieldType.ATTRIBUTE),
536
+ new Field(ODataMetadataParser.ATTRIBUTE_MAX_LENGTH, FieldType.ATTRIBUTE),
537
+ new Field(ODataMetadataParser.ATTRIBUTE_PRECISION, FieldType.ATTRIBUTE),
538
+ new Field(ODataMetadataParser.ATTRIBUTE_SCALE, FieldType.ATTRIBUTE),
539
+ new Field(ODataMetadataParser.ATTRIBUTE_UNICODE, FieldType.ATTRIBUTE),
540
+ new Field(ODataMetadataParser.ATTRIBUTE_SRID, FieldType.ATTRIBUTE),
541
+ new Field(ODataMetadataParser.TAG_ANNOTATION, FieldType.TAG),
542
+ ]);
543
+ default:
544
+ throw new Error('Unknwon tag:' + field.name);
545
+ }
546
+ }
547
+ getAttributeValue(attributes, attributeName) {
548
+ const attribute = attributes.getNamedItem(attributeName);
549
+ return attribute !== null && attribute.nodeValue
550
+ ? attribute.nodeValue
551
+ : undefined;
552
+ }
553
+ propertyValueToNumber(attributeValue) {
554
+ return attributeValue !== undefined ? Number(attributeValue) : undefined;
555
+ }
556
+ propertyValueToBoolean(attributeValue) {
557
+ return attributeValue !== undefined ? attributeValue === 'true' : false;
558
+ }
559
+ propertyValueToDate(attributeValue) {
560
+ return attributeValue !== undefined ? new Date(attributeValue) : undefined;
561
+ }
562
+ }
563
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL21ldGFkYXRhL3BhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyxJQUFLLFNBR0o7QUFIRCxXQUFLLFNBQVM7SUFDWixtREFBUyxDQUFBO0lBQ1QsdUNBQUcsQ0FBQTtBQUNMLENBQUMsRUFISSxTQUFTLEtBQVQsU0FBUyxRQUdiO0FBRUQsTUFBTSxLQUFLO0lBQ1QsWUFDUyxJQUFZLEVBQ1osU0FBb0I7UUFEcEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGNBQVMsR0FBVCxTQUFTLENBQVc7SUFDMUIsQ0FBQztDQUNMO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixPQUFPO2FBQ2lCLGFBQVEsR0FBRyxXQUFXLENBQUM7YUFDdkIsc0JBQWlCLEdBQUcsbUJBQW1CLENBQUM7YUFDeEMsa0JBQWEsR0FBRyxnQkFBZ0IsQ0FBQzthQUNqQyxnQkFBVyxHQUFHLGNBQWMsQ0FBQzthQUM3Qiw0QkFBdUIsR0FBRyx5QkFBeUIsQ0FBQzthQUNwRCxhQUFRLEdBQUcsTUFBTSxDQUFDO2FBQ2xCLG9CQUFlLEdBQUcsYUFBYSxDQUFDO2FBQ2hDLG1CQUFjLEdBQUcsWUFBWSxDQUFDO2FBQzlCLGVBQVUsR0FBRyxRQUFRLENBQUM7YUFDdEIsa0JBQWEsR0FBRyxVQUFVLENBQUM7YUFDM0IsZUFBVSxHQUFHLFFBQVEsQ0FBQzthQUN0QixxQkFBZ0IsR0FBRyxhQUFhLENBQUM7YUFDakMsb0JBQWUsR0FB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QkFBbUIsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztvQkFDbEUsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUM7aUJBQzdELENBQUMsQ0FBQztZQUNMO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxVQUF3QixFQUFFLGFBQXFCO1FBQ3pFLE1BQU0sU0FBUyxHQUFnQixVQUFVLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sU0FBUyxLQUFLLElBQUksSUFBSSxTQUFTLENBQUMsU0FBUztZQUM5QyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFDckIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoQixDQUFDO0lBRVMscUJBQXFCLENBQUMsY0FBdUI7UUFDckQsT0FBTyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRSxDQUFDO0lBRVMsc0JBQXNCLENBQUMsY0FBdUI7UUFDdEQsT0FBTyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUUsQ0FBQztJQUVTLG1CQUFtQixDQUFDLGNBQXVCO1FBQ25ELE9BQU8sY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3NkbFJlZmVyZW5jZSB9IGZyb20gJy4vY3NkbC9jc2RsLXJlZmVyZW5jZSc7XG5cbmltcG9ydCB7IENzZGxTY2hlbWEgfSBmcm9tICcuL2NzZGwvY3NkbC1zY2hlbWEnO1xuaW1wb3J0IHsgVkVSU0lPTl80XzAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEnO1xuXG5lbnVtIEZpZWxkVHlwZSB7XG4gIEFUVFJJQlVURSxcbiAgVEFHLFxufVxuXG5jbGFzcyBGaWVsZCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmcsXG4gICAgcHVibGljIGZpZWxkVHlwZTogRmllbGRUeXBlLFxuICApIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1ldGFkYXRhUGFyc2VyIHtcbiAgLy8gVEFHU1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfRURNWCA9ICdlZG14OkVkbXgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfREFUQV9TRVJWSUNFUyA9ICdlZG14OkRhdGFTZXJ2aWNlcyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19SRUZFUkVOQ0UgPSAnZWRteDpSZWZlcmVuY2UnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfSU5DTFVERSA9ICdlZG14OkluY2x1ZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfSU5DTFVERV9BTk5PVEFUSU9OUyA9ICdlZG14OkluY2x1ZGVBbm5vdGF0aW9ucyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19URVJNID0gJ1Rlcm0nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQU5OT1RBVElPTlMgPSAnQW5ub3RhdGlvbnMnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQU5OT1RBVElPTiA9ICdBbm5vdGF0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1NDSEVNQSA9ICdTY2hlbWEnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfRU5VTV9UWVBFID0gJ0VudW1UeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX01FTUJFUiA9ICdNZW1iZXInO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQ09NUExFWF9UWVBFID0gJ0NvbXBsZXhUeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0VOVElUWV9UWVBFID0gJ0VudGl0eVR5cGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUFJPUEVSVFkgPSAnUHJvcGVydHknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfS0VZID0gJ0tleSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19QUk9QRVJUWV9SRUYgPSAnUHJvcGVydHlSZWYnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfTkFWSUdBVElPTl9QUk9QRVJUWSA9ICdOYXZpZ2F0aW9uUHJvcGVydHknO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUkVGRVJFTlRJQUxfQ09OU1RSQUlOVCA9ICdSZWZlcmVudGlhbENvbnN0cmFpbnQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfT05fREVMRVRFID0gJ09uRGVsZXRlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0ZVTkNUSU9OID0gJ0Z1bmN0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1JFVFVSTl9UWVBFID0gJ1JldHVyblR5cGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUEFSQU1FVEVSID0gJ1BhcmFtZXRlcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19BQ1RJT04gPSAnQWN0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0VOVElUWV9DT05UQUlORVIgPSAnRW50aXR5Q29udGFpbmVyJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX0VOVElUWV9TRVQgPSAnRW50aXR5U2V0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1NJTkdMRVRPTiA9ICdTaW5nbGV0b24nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQ09MTEVDVElPTiA9ICdDb2xsZWN0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1JFQ09SRCA9ICdSZWNvcmQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfU1RSSU5HID0gJ1N0cmluZyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19FTlVNX01FTUJFUiA9ICdFbnVtTWVtYmVyJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVEFHX1BST1BFUlRZX1ZBTFVFID0gJ1Byb3BlcnR5VmFsdWUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfUFJPUEVSVFlfUEFUSCA9ICdQcm9wZXJ0eVBhdGgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfTkFWSUdBVElPTl9QUk9QRVJUWV9QQVRIID1cbiAgICAnTmF2aWdhdGlvblByb3BlcnR5UGF0aCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19GVU5DVElPTl9JTVBPUlQgPSAnRnVuY3Rpb25JbXBvcnQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfQUNUSU9OX0lNUE9SVCA9ICdBY3Rpb25JbXBvcnQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfTkFWSUdBVElPTl9QUk9QRVJUWV9CSU5ESU5HID1cbiAgICAnTmF2aWdhdGlvblByb3BlcnR5QmluZGluZyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19UWVBFX0RFRklOSVRJT04gPSAnVHlwZURlZmluaXRpb24nO1xuXG4gIC8vIEFUVFJJQlVURVNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1ZFUlNJT04gPSAnVmVyc2lvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9VUkkgPSAnVXJpJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0FMSUFTID0gJ0FsaWFzJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX05BTUVTUEFDRSA9ICdOYW1lc3BhY2UnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVEVSTV9OQU1FU1BBQ0UgPSAnVGVybU5hbWVzcGFjZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9RVUFMSUZJRVIgPSAnUXVhbGlmaWVyJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1NUUklORyA9ICdTdHJpbmcnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfREFURSA9ICdEYXRlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0JPT0wgPSAnQm9vbCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9JTlQgPSAnSW50JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1RBUkdFVF9OQU1FU1BBQ0UgPSAnVGFyZ2V0TmFtZXNwYWNlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1RFUk0gPSAnVGVybSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9OQU1FID0gJ05hbWUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfVkFMVUUgPSAnVmFsdWUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQkFTRV9UWVBFID0gJ0Jhc2VUeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX09QRU5fVFlQRSA9ICdPcGVuVHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9UWVBFID0gJ1R5cGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfTlVMTEFCTEUgPSAnTnVsbGFibGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfTUFYX0xFTkdUSCA9ICdNYXhMZW5ndGgnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfUFJFQ0lTSU9OID0gJ1ByZWNpc2lvbic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9TQ0FMRSA9ICdTY2FsZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9VTklDT0RFID0gJ1VuaWNvZGUnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfU1JJRCA9ICdTUklEJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0RFRkFVTFRfVkFMVUUgPSAnRGVmYXVsdFZhbHVlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1BBUlRORVIgPSAnUGFydG5lcic7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9QUk9QRVJUWSA9ICdQcm9wZXJ0eSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9SRUZFUkVOQ0VEX1BST1BFUlRZID0gJ1JlZmVyZW5jZWRQcm9wZXJ0eSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9IQVNfU1RSRUFNID0gJ0hhc1N0cmVhbSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9DT05UQUlOU19UQVJHRVQgPSAnQ29udGFpbnNUYXJnZXQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSVNfQk9VTkQgPSAnSXNCb3VuZCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9FTlRJVFlfU0VUX1BBVEggPSAnRW50aXR5U2V0UGF0aCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9JU19DT01QT1NBQkxFID0gJ0lzQ29tcG9zYWJsZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9FTlRJVFlfVFlQRSA9ICdFbnRpdHlUeXBlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1BBVEggPSAnUGF0aCc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9UQVJHRVQgPSAnVGFyZ2V0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0ZVTkNUSU9OID0gJ0Z1bmN0aW9uJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0FDVElPTiA9ICdBY3Rpb24nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfRU5USVRZX1NFVCA9ICdFbnRpdHlTZXQnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfSU5DTFVERV9JTl9TRVJWSUNFX0RPQ1VNRU5UID1cbiAgICAnSW5jbHVkZUluU2VydmljZURvY3VtZW50JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0FCU1RSQUNUID0gJ0Fic3RyYWN0JztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX1VOREVSTFlJTkdfVFlQRSA9ICdVbmRlcmx5aW5nVHlwZSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9JU19GTEFHUyA9ICdJc0ZsYWdzJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0VYVEVORFMgPSAnRXh0ZW5kcyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFUVFJJQlVURV9CQVNFX1RFUk0gPSAnQmFzZVRlcm0nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBVFRSSUJVVEVfQVBQTElFU19UTyA9ICdBcHBsaWVzVG8nO1xuXG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoeG1sOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VyOiBET01QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICB0aGlzLmRvY3VtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xuXG4gICAgICB0aGlzLmNoZWNrVmVyc2lvbihkb2N1bWVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIG1ldGFkYXRhLCAnICsgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG1ldGFkYXRhKCkge1xuICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldEZpZWxkVmFsdWVCeUF0dHJpYnV0ZShcbiAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9WRVJTSU9OLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgIHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dHJpYnV0ZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLmdldE9iamVjdHMoXG4gICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFRkVSRU5DRSxcbiAgICAgIFtcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1VSSSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19JTkNMVURFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0lOQ0xVREVfQU5OT1RBVElPTlMsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICBdLFxuICAgICkubWFwKCh0KSA9PiBuZXcgQ3NkbFJlZmVyZW5jZSh0KSk7XG5cbiAgICBjb25zdCBkYXRhU2VydmljZXM6IEVsZW1lbnQgPVxuICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXG4gICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0RBVEFfU0VSVklDRVMsXG4gICAgICApWzBdO1xuICAgIGNvbnN0IHNjaGVtYXMgPSB0aGlzLmdldE9iamVjdHMoXG4gICAgICBkYXRhU2VydmljZXMsXG4gICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TQ0hFTUEsXG4gICAgICBbXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FU1BBQ0UsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUxJQVMsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5VTV9UWVBFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0NPTVBMRVhfVFlQRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfVFlQRSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19GVU5DVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BQ1RJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX0NPTlRBSU5FUiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19UWVBFX0RFRklOSVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfVEVSTSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OUywgRmllbGRUeXBlLlRBRyksXG4gICAgICBdLFxuICAgICkubWFwKChzKSA9PiBuZXcgQ3NkbFNjaGVtYShzKSk7XG5cbiAgICByZXR1cm4gbmV3IE9EYXRhTWV0YWRhdGEodmVyc2lvbiwgcmVmZXJlbmNlcywgc2NoZW1hcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tWZXJzaW9uKGRvY3VtZW50OiBEb2N1bWVudCkge1xuICAgIC8vIGNoZWNrIHZlcnNpb25cbiAgICBjb25zdCBhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXAgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0cmlidXRlcztcbiAgICBpZiAoIWF0dHJpYnV0ZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT0RhdGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtZXRhZGF0YScpO1xuICAgIH1cbiAgICBjb25zdCBhdHRyOiBBdHRyIHwgbnVsbCA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdWZXJzaW9uJyk7XG4gICAgaWYgKGF0dHIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT0RhdGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtZXRhZGF0YScpO1xuICAgIH1cbiAgICBjb25zdCBvZGF0YVZlcnNpb24gPSBhdHRyPy5ub2RlVmFsdWU7XG4gICAgaWYgKG9kYXRhVmVyc2lvbiAhPT0gVkVSU0lPTl80XzApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT0RhdGEgdmVyc2lvbiBcIicgKyBvZGF0YVZlcnNpb24gKyAnXCIgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRPYmplY3RzKFxuICAgIHBhcmVudEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZmllbGROYW1lczogRmllbGRbXSxcbiAgKTogYW55W10ge1xuICAgIGxldCBvYmplY3RzOiBhbnlbXSA9IFtdO1xuXG4gICAgY29uc3QgY2hpbGRyZW46IEhUTUxDb2xsZWN0aW9uID0gcGFyZW50RWxlbWVudC5jaGlsZHJlbjtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY2hpbGRyZW4uaXRlbShpbmRleCk7XG5cbiAgICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVOYW1lICE9PSB0YWcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICAgIGNvbnN0IGZpZWxkVmFsdWVzOiBhbnkgPSB0aGlzLmdldEZpZWxkVmFsdWVzKFxuICAgICAgICBmaWVsZE5hbWVzLFxuICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICBlbGVtZW50LFxuICAgICAgKTtcbiAgICAgIGZpZWxkVmFsdWVzWydUZXh0Q29udGVudCddID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVGRVJFTkNFOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0lOQ0xVREU6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfSU5DTFVERV9BTk5PVEFUSU9OUzpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19URVJNOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT05TOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0NPTExFQ1RJT046XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVDT1JEOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NUUklORzpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlVNX01FTUJFUjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9WQUxVRTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9QQVRIOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfUEFUSDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NDSEVNQTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlVNX1RZUEU6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQ09NUExFWF9UWVBFOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVElUWV9UWVBFOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0ZVTkNUSU9OOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX01FTUJFUjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9SRUY6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTkFWSUdBVElPTl9QUk9QRVJUWTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUZFUkVOVElBTF9DT05TVFJBSU5UOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BBUkFNRVRFUjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BQ1RJT046XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX1NFVDpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19TSU5HTEVUT046XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRlVOQ1RJT05fSU1QT1JUOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FDVElPTl9JTVBPUlQ6XG4gICAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTkFWSUdBVElPTl9QUk9QRVJUWV9CSU5ESU5HOlxuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1RZUEVfREVGSU5JVElPTjpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfQ09OVEFJTkVSOlxuICAgICAgICAgIG9iamVjdHMucHVzaChmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtud29uIHRhZzonICsgdGFnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRPYmplY3QoXG4gICAgcGFyZW50RWxlbWVudDogRWxlbWVudCxcbiAgICB0YWc6IHN0cmluZyxcbiAgICBmaWVsZE5hbWVzOiBGaWVsZFtdLFxuICApOiBhbnkge1xuICAgIGxldCBvYmplY3Q6IGFueTtcblxuICAgIGNvbnN0IGNoaWxkcmVuOiBIVE1MQ29sbGVjdGlvbiA9IHBhcmVudEVsZW1lbnQuY2hpbGRyZW47XG4gICAgbGV0IGVsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQgfCBudWxsO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5pdGVtKGluZGV4KT8ubm9kZU5hbWUgPT09IHRhZykge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWZpbmVkICYmIGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG9uZSAnICsgdGFnKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50ID0gY2hpbGRyZW4uaXRlbShpbmRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzOiBOYW1lZE5vZGVNYXAgPSBlbGVtZW50LmF0dHJpYnV0ZXM7XG4gICAgICBjb25zdCBmaWVsZFZhbHVlczogYW55ID0gdGhpcy5nZXRGaWVsZFZhbHVlcyhcbiAgICAgICAgZmllbGROYW1lcyxcbiAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICk7XG4gICAgICBmaWVsZFZhbHVlc1snVGV4dENvbnRlbnQnXSA9IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0tFWTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRVRVUk5fVFlQRTpcbiAgICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19PTl9ERUxFVEU6XG4gICAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWVzO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbndvbiB0YWc6JyArIHRhZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGaWVsZFZhbHVlcyhcbiAgICBmaWVsZHM6IEZpZWxkW10sXG4gICAgYXR0cmlidXRlczogTmFtZWROb2RlTWFwLFxuICAgIGVsZW1lbnQ6IEVsZW1lbnQsXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBmaWVsZFZhbHVlczogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQuZmllbGRUeXBlID09PSBGaWVsZFR5cGUuVEFHKSB7XG4gICAgICAgIGZpZWxkVmFsdWVzW2ZpZWxkLm5hbWVdID0gdGhpcy5nZXRGaWVsZFZhbHVlQnlUYWcoZmllbGQsIGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5maWVsZFR5cGUgPT09IEZpZWxkVHlwZS5BVFRSSUJVVEUpIHtcbiAgICAgICAgZmllbGRWYWx1ZXNbZmllbGQubmFtZV0gPSB0aGlzLmdldEZpZWxkVmFsdWVCeUF0dHJpYnV0ZShcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGZpZWxkIHR5cGU6ICcgKyBmaWVsZC5maWVsZFR5cGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWVsZFZhbHVlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGaWVsZFZhbHVlQnlBdHRyaWJ1dGUoXG4gICAgZmllbGQ6IEZpZWxkLFxuICAgIGF0dHJpYnV0ZXM6IE5hbWVkTm9kZU1hcCxcbiAgKTogYW55IHtcbiAgICBzd2l0Y2ggKGZpZWxkLm5hbWUpIHtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVkVSU0lPTjpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVVJJOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FU1BBQ0U6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FMSUFTOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9URVJNX05BTUVTUEFDRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEVSTTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUVVBTElGSUVSOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TVFJJTkc6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JPT0w6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lOVDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEFSR0VUX05BTUVTUEFDRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVFlQRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU1JJRDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfREVGQVVMVF9WQUxVRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUEFSVE5FUjpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJPUEVSVFk6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1JFRkVSRU5DRURfUFJPUEVSVFk6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JBU0VfVFlQRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfRU5USVRZX1NFVF9QQVRIOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfVFlQRTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUEFUSDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEFSR0VUOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9GVU5DVElPTjpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUNUSU9OOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfU0VUOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9VTkRFUkxZSU5HX1RZUEU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0VYVEVORFM6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JBU0VfVEVSTTpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQVBQTElFU19UTzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywgZmllbGQubmFtZSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9VTklDT0RFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9PUEVOX1RZUEU6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0hBU19TVFJFQU06XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lTX0JPVU5EOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19DT01QT1NBQkxFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9DT05UQUlOU19UQVJHRVQ6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lOQ0xVREVfSU5fU0VSVklDRV9ET0NVTUVOVDpcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUJTVFJBQ1Q6XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lTX0ZMQUdTOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlVG9Cb29sZWFuKFxuICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlcywgZmllbGQubmFtZSksXG4gICAgICAgICk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1ZBTFVFOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9NQVhfTEVOR1RIOlxuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUkVDSVNJT046XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NDQUxFOlxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVZhbHVlVG9OdW1iZXIoXG4gICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGVWYWx1ZShhdHRyaWJ1dGVzLCBmaWVsZC5uYW1lKSxcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfREFURTpcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlWYWx1ZVRvRGF0ZShcbiAgICAgICAgICB0aGlzLmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZXMsIGZpZWxkLm5hbWUpLFxuICAgICAgICApO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtud29uIGF0dHJpYnV0ZTonICsgZmllbGQubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpZWxkVmFsdWVCeVRhZyhmaWVsZDogRmllbGQsIGVsZW1lbnQ6IEVsZW1lbnQpOiBhbnlbXSB7XG4gICAgc3dpdGNoIChmaWVsZC5uYW1lKSB7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0lOQ0xVREU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUVTUEFDRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUxJQVMsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfSU5DTFVERV9BTk5PVEFUSU9OUzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEVSTV9OQU1FU1BBQ0UsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUVVBTElGSUVSLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RBUkdFVF9OQU1FU1BBQ0UsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19URVJNOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JBU0VfVEVSTSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9ERUZBVUxUX1ZBTFVFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FQUExJRVNfVE8sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTlVMTEFCTEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTUFYX0xFTkdUSCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUkVDSVNJT04sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NDQUxFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU1JJRCwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NUUklORywgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JPT0wsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTlQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTlM6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9UQVJHRVQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9RVUFMSUZJRVIsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVEVSTSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NUUklORywgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0JPT0wsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTlQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19DT0xMRUNUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVDT1JELCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5VTV9NRU1CRVIsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQ09MTEVDVElPTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NUUklORywgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFQ09SRCwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1BBVEgsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfUEFUSCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5UQUcsXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFQ09SRDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1ZBTFVFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1NUUklORzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVU1fTUVNQkVSOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfVkFMVUU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BST1BFUlRZLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TVFJJTkcsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9EQVRFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5VTV9NRU1CRVIsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfUEFUSDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1ZBTFVFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfUEFUSDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZX1ZBTFVFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVU1fVFlQRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19NRU1CRVIsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1VOREVSTFlJTkdfVFlQRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19GTEFHUyxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19DT01QTEVYX1RZUEU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFksIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19OQVZJR0FUSU9OX1BST1BFUlRZLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9CQVNFX1RZUEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfT1BFTl9UWVBFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FCU1RSQUNULFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0VOVElUWV9UWVBFOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0tFWSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BST1BFUlRZLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTkFWSUdBVElPTl9QUk9QRVJUWSwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQkFTRV9UWVBFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX09QRU5fVFlQRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9BQlNUUkFDVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9IQVNfU1RSRUFNLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0ZVTkNUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFVFVSTl9UWVBFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19CT1VORCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfU0VUX1BBVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfSVNfQ09NUE9TQUJMRSxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUEFSQU1FVEVSLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX01FTUJFUjpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9WQUxVRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVFlQRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTlVMTEFCTEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTUFYX0xFTkdUSCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUkVDSVNJT04sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NDQUxFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVU5JQ09ERSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0RFRkFVTFRfVkFMVUUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfS0VZOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3QoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QUk9QRVJUWV9SRUYsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUFJPUEVSVFlfUkVGOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FMSUFTLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFk6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVFlQRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTlVMTEFCTEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BBUlRORVIsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0NPTlRBSU5TX1RBUkdFVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19SRUZFUkVOVElBTF9DT05TVFJBSU5ULFxuICAgICAgICAgICAgRmllbGRUeXBlLlRBRyxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19PTl9ERUxFVEUsIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFRkVSRU5USUFMX0NPTlNUUkFJTlQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1BST1BFUlRZLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1JFRkVSRU5DRURfUFJPUEVSVFksXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19PTl9ERUxFVEU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0FDVElPTiwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19QQVJBTUVURVI6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVFlQRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTlVMTEFCTEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTUFYX0xFTkdUSCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUkVDSVNJT04sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NDQUxFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfU1JJRCwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfUkVUVVJOX1RZUEU6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdChlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05VTExBQkxFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX01BWF9MRU5HVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUFJFQ0lTSU9OLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9TQ0FMRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQUNUSU9OOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1JFVFVSTl9UWVBFLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JU19CT1VORCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfU0VUX1BBVEgsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX1BBUkFNRVRFUiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfQ09OVEFJTkVSOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0VYVEVORFMsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19FTlRJVFlfU0VULCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfU0lOR0xFVE9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRlVOQ1RJT05fSU1QT1JULCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQUNUSU9OX0lNUE9SVCwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfRU5USVRZX1NFVDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0cyhlbGVtZW50LCBmaWVsZC5uYW1lLCBbXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX05BTUUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0VOVElUWV9UWVBFLFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfQklORElORyxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5UQUcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9JTkNMVURFX0lOX1NFUlZJQ0VfRE9DVU1FTlQsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FOTk9UQVRJT04sIEZpZWxkVHlwZS5UQUcpLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfU0lOR0xFVE9OOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTkFNRSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RZUEUsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX05BVklHQVRJT05fUFJPUEVSVFlfQklORElORyxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5UQUcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfQU5OT1RBVElPTiwgRmllbGRUeXBlLlRBRyksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19GVU5DVElPTl9JTVBPUlQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9GVU5DVElPTixcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfU0VULFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICAgIG5ldyBGaWVsZChcbiAgICAgICAgICAgIE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX0lOQ0xVREVfSU5fU0VSVklDRV9ET0NVTUVOVCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgXSk7XG4gICAgICBjYXNlIE9EYXRhTWV0YWRhdGFQYXJzZXIuVEFHX0FDVElPTl9JTVBPUlQ6XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfQUNUSU9OLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9FTlRJVFlfU0VULFxuICAgICAgICAgICAgRmllbGRUeXBlLkFUVFJJQlVURSxcbiAgICAgICAgICApLFxuICAgICAgICBdKTtcbiAgICAgIGNhc2UgT0RhdGFNZXRhZGF0YVBhcnNlci5UQUdfTkFWSUdBVElPTl9QUk9QRVJUWV9CSU5ESU5HOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRPYmplY3RzKGVsZW1lbnQsIGZpZWxkLm5hbWUsIFtcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfUEFUSCwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1RBUkdFVCwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSBPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19UWVBFX0RFRklOSVRJT046XG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdHMoZWxlbWVudCwgZmllbGQubmFtZSwgW1xuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9OQU1FLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9VTkRFUkxZSU5HX1RZUEUsXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKFxuICAgICAgICAgICAgT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfTUFYX0xFTkdUSCxcbiAgICAgICAgICAgIEZpZWxkVHlwZS5BVFRSSUJVVEUsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBuZXcgRmllbGQoXG4gICAgICAgICAgICBPRGF0YU1ldGFkYXRhUGFyc2VyLkFUVFJJQlVURV9QUkVDSVNJT04sXG4gICAgICAgICAgICBGaWVsZFR5cGUuQVRUUklCVVRFLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NDQUxFLCBGaWVsZFR5cGUuQVRUUklCVVRFKSxcbiAgICAgICAgICBuZXcgRmllbGQoT0RhdGFNZXRhZGF0YVBhcnNlci5BVFRSSUJVVEVfVU5JQ09ERSwgRmllbGRUeXBlLkFUVFJJQlVURSksXG4gICAgICAgICAgbmV3IEZpZWxkKE9EYXRhTWV0YWRhdGFQYXJzZXIuQVRUUklCVVRFX1NSSUQsIEZpZWxkVHlwZS5BVFRSSUJVVEUpLFxuICAgICAgICAgIG5ldyBGaWVsZChPRGF0YU1ldGFkYXRhUGFyc2VyLlRBR19BTk5PVEFUSU9OLCBGaWVsZFR5cGUuVEFHKSxcbiAgICAgICAgXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua253b24gdGFnOicgKyBmaWVsZC5uYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0QXR0cmlidXRlVmFsdWUoYXR0cmlidXRlczogTmFtZWROb2RlTWFwLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGU6IEF0dHIgfCBudWxsID0gYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSk7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZSAhPT0gbnVsbCAmJiBhdHRyaWJ1dGUubm9kZVZhbHVlXG4gICAgICA/IGF0dHJpYnV0ZS5ub2RlVmFsdWVcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb3BlcnR5VmFsdWVUb051bWJlcihhdHRyaWJ1dGVWYWx1ZT86IHN0cmluZykge1xuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkID8gTnVtYmVyKGF0dHJpYnV0ZVZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlVG9Cb29sZWFuKGF0dHJpYnV0ZVZhbHVlPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVWYWx1ZSA9PT0gJ3RydWUnIDogZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvcGVydHlWYWx1ZVRvRGF0ZShhdHRyaWJ1dGVWYWx1ZT86IHN0cmluZykge1xuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZSAhPT0gdW5kZWZpbmVkID8gbmV3IERhdGUoYXR0cmlidXRlVmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=