breeze-client 2.1.3-mjs → 2.1.4

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 (394) hide show
  1. package/README.md +18 -5
  2. package/adapter-ajax-angularjs/{index.d.ts → breeze-client-adapter-ajax-angularjs.d.ts} +0 -1
  3. package/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.metadata.json +1 -0
  4. package/adapter-ajax-angularjs/package.json +13 -0
  5. package/adapter-ajax-fetch/{index.d.ts → breeze-client-adapter-ajax-fetch.d.ts} +0 -1
  6. package/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.metadata.json +1 -0
  7. package/adapter-ajax-fetch/package.json +13 -0
  8. package/adapter-ajax-httpclient/{index.d.ts → breeze-client-adapter-ajax-httpclient.d.ts} +0 -1
  9. package/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.metadata.json +1 -0
  10. package/adapter-ajax-httpclient/package.json +13 -0
  11. package/adapter-ajax-jquery/{index.d.ts → breeze-client-adapter-ajax-jquery.d.ts} +0 -1
  12. package/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.metadata.json +1 -0
  13. package/adapter-ajax-jquery/package.json +13 -0
  14. package/adapter-ajax-post/{index.d.ts → breeze-client-adapter-ajax-post.d.ts} +0 -1
  15. package/adapter-ajax-post/breeze-client-adapter-ajax-post.metadata.json +1 -0
  16. package/adapter-ajax-post/package.json +13 -0
  17. package/adapter-data-service-odata/{index.d.ts → breeze-client-adapter-data-service-odata.d.ts} +0 -1
  18. package/adapter-data-service-odata/breeze-client-adapter-data-service-odata.metadata.json +1 -0
  19. package/adapter-data-service-odata/package.json +13 -0
  20. package/adapter-data-service-webapi/{index.d.ts → breeze-client-adapter-data-service-webapi.d.ts} +0 -1
  21. package/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.metadata.json +1 -0
  22. package/adapter-data-service-webapi/package.json +13 -0
  23. package/adapter-model-library-backing-store/{index.d.ts → breeze-client-adapter-model-library-backing-store.d.ts} +0 -1
  24. package/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.metadata.json +1 -0
  25. package/adapter-model-library-backing-store/package.json +13 -0
  26. package/adapter-model-library-ko/{index.d.ts → breeze-client-adapter-model-library-ko.d.ts} +0 -1
  27. package/adapter-model-library-ko/breeze-client-adapter-model-library-ko.metadata.json +1 -0
  28. package/adapter-model-library-ko/package.json +13 -0
  29. package/adapter-uri-builder-json/{index.d.ts → breeze-client-adapter-uri-builder-json.d.ts} +0 -1
  30. package/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.metadata.json +1 -0
  31. package/adapter-uri-builder-json/package.json +13 -0
  32. package/adapter-uri-builder-odata/{index.d.ts → breeze-client-adapter-uri-builder-odata.d.ts} +0 -1
  33. package/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.metadata.json +1 -0
  34. package/adapter-uri-builder-odata/package.json +13 -0
  35. package/breeze-client.d.ts +8 -0
  36. package/breeze-client.metadata.json +1 -0
  37. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js +190 -0
  38. package/bundles/breeze-client-adapter-ajax-angularjs.umd.js.map +1 -0
  39. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js +2 -0
  40. package/bundles/breeze-client-adapter-ajax-angularjs.umd.min.js.map +1 -0
  41. package/bundles/breeze-client-adapter-ajax-fetch.umd.js +190 -0
  42. package/bundles/breeze-client-adapter-ajax-fetch.umd.js.map +1 -0
  43. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js +2 -0
  44. package/bundles/breeze-client-adapter-ajax-fetch.umd.min.js.map +1 -0
  45. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js +195 -0
  46. package/bundles/breeze-client-adapter-ajax-httpclient.umd.js.map +1 -0
  47. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js +2 -0
  48. package/bundles/breeze-client-adapter-ajax-httpclient.umd.min.js.map +1 -0
  49. package/bundles/breeze-client-adapter-ajax-jquery.umd.js +115 -0
  50. package/bundles/breeze-client-adapter-ajax-jquery.umd.js.map +1 -0
  51. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js +2 -0
  52. package/bundles/breeze-client-adapter-ajax-jquery.umd.min.js.map +1 -0
  53. package/bundles/breeze-client-adapter-ajax-post.umd.js +92 -0
  54. package/bundles/breeze-client-adapter-ajax-post.umd.js.map +1 -0
  55. package/bundles/breeze-client-adapter-ajax-post.umd.min.js +2 -0
  56. package/bundles/breeze-client-adapter-ajax-post.umd.min.js.map +1 -0
  57. package/bundles/breeze-client-adapter-data-service-odata.umd.js +743 -0
  58. package/bundles/breeze-client-adapter-data-service-odata.umd.js.map +1 -0
  59. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js +16 -0
  60. package/bundles/breeze-client-adapter-data-service-odata.umd.min.js.map +1 -0
  61. package/bundles/breeze-client-adapter-data-service-webapi.umd.js +326 -0
  62. package/bundles/breeze-client-adapter-data-service-webapi.umd.js.map +1 -0
  63. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js +16 -0
  64. package/bundles/breeze-client-adapter-data-service-webapi.umd.min.js.map +1 -0
  65. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js +280 -0
  66. package/bundles/breeze-client-adapter-model-library-backing-store.umd.js.map +1 -0
  67. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js +2 -0
  68. package/bundles/breeze-client-adapter-model-library-backing-store.umd.min.js.map +1 -0
  69. package/bundles/breeze-client-adapter-model-library-ko.umd.js +252 -0
  70. package/bundles/breeze-client-adapter-model-library-ko.umd.js.map +1 -0
  71. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js +2 -0
  72. package/bundles/breeze-client-adapter-model-library-ko.umd.min.js.map +1 -0
  73. package/bundles/breeze-client-adapter-uri-builder-json.umd.js +96 -0
  74. package/bundles/breeze-client-adapter-uri-builder-json.umd.js.map +1 -0
  75. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js +2 -0
  76. package/bundles/breeze-client-adapter-uri-builder-json.umd.min.js.map +1 -0
  77. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js +262 -0
  78. package/bundles/breeze-client-adapter-uri-builder-odata.umd.js.map +1 -0
  79. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js +2 -0
  80. package/bundles/breeze-client-adapter-uri-builder-odata.umd.min.js.map +1 -0
  81. package/bundles/breeze-client-mixin-get-entity-graph.umd.js +258 -0
  82. package/bundles/breeze-client-mixin-get-entity-graph.umd.js.map +1 -0
  83. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js +2 -0
  84. package/bundles/breeze-client-mixin-get-entity-graph.umd.min.js.map +1 -0
  85. package/bundles/breeze-client-mixin-save-queuing.umd.js +579 -0
  86. package/bundles/breeze-client-mixin-save-queuing.umd.js.map +1 -0
  87. package/bundles/breeze-client-mixin-save-queuing.umd.min.js +16 -0
  88. package/bundles/breeze-client-mixin-save-queuing.umd.min.js.map +1 -0
  89. package/bundles/breeze-client.umd.js +14098 -0
  90. package/bundles/breeze-client.umd.js.map +1 -0
  91. package/bundles/breeze-client.umd.min.js +16 -0
  92. package/bundles/breeze-client.umd.min.js.map +1 -0
  93. package/esm2015/adapter-ajax-angularjs/adapter-ajax-angularjs.js +130 -0
  94. package/esm2015/adapter-ajax-angularjs/adapter-core.js +49 -0
  95. package/esm2015/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
  96. package/esm2015/adapter-ajax-fetch/adapter-ajax-fetch.js +130 -0
  97. package/esm2015/adapter-ajax-fetch/adapter-core.js +49 -0
  98. package/esm2015/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
  99. package/esm2015/adapter-ajax-httpclient/adapter-ajax-httpclient.js +137 -0
  100. package/esm2015/adapter-ajax-httpclient/adapter-core.js +49 -0
  101. package/esm2015/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
  102. package/esm2015/adapter-ajax-jquery/adapter-ajax-jquery.js +103 -0
  103. package/esm2015/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
  104. package/esm2015/adapter-ajax-post/adapter-ajax-post.js +77 -0
  105. package/esm2015/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
  106. package/esm2015/adapter-data-service-odata/adapter-core.js +49 -0
  107. package/esm2015/adapter-data-service-odata/adapter-data-service-odata.js +459 -0
  108. package/esm2015/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
  109. package/esm2015/adapter-data-service-webapi/adapter-data-service-webapi.js +93 -0
  110. package/esm2015/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
  111. package/esm2015/adapter-model-library-backing-store/adapter-model-library-backing-store.js +268 -0
  112. package/esm2015/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
  113. package/esm2015/adapter-model-library-ko/adapter-model-library-ko.js +240 -0
  114. package/esm2015/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
  115. package/esm2015/adapter-uri-builder-json/adapter-core.js +49 -0
  116. package/esm2015/adapter-uri-builder-json/adapter-uri-builder-json.js +36 -0
  117. package/esm2015/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
  118. package/esm2015/adapter-uri-builder-odata/adapter-core.js +49 -0
  119. package/esm2015/adapter-uri-builder-odata/adapter-uri-builder-odata.js +192 -0
  120. package/esm2015/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
  121. package/esm2015/breeze-client.js +9 -0
  122. package/esm2015/index.js +2 -0
  123. package/esm2015/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
  124. package/esm2015/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
  125. package/esm2015/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
  126. package/esm2015/mixin-save-queuing/mixin-save-queuing.js +400 -0
  127. package/esm2015/src/abstract-data-service-adapter.js +296 -0
  128. package/esm2015/src/array.js +4 -0
  129. package/esm2015/src/assert-param.js +312 -0
  130. package/esm2015/src/breeze.js +85 -0
  131. package/esm2015/src/complex-array.js +119 -0
  132. package/esm2015/src/config.js +223 -0
  133. package/esm2015/src/core.js +709 -0
  134. package/esm2015/src/csdl-metadata-parser.js +385 -0
  135. package/esm2015/src/data-service.js +203 -0
  136. package/esm2015/src/data-type.js +444 -0
  137. package/esm2015/src/default-property-interceptor.js +460 -0
  138. package/esm2015/src/entity-action.js +45 -0
  139. package/esm2015/src/entity-aspect.js +806 -0
  140. package/esm2015/src/entity-group.js +187 -0
  141. package/esm2015/src/entity-key.js +116 -0
  142. package/esm2015/src/entity-manager.js +2094 -0
  143. package/esm2015/src/entity-metadata.js +2109 -0
  144. package/esm2015/src/entity-query.js +996 -0
  145. package/esm2015/src/entity-state.js +99 -0
  146. package/esm2015/src/enum.js +141 -0
  147. package/esm2015/src/event.js +256 -0
  148. package/esm2015/src/interface-registry.js +41 -0
  149. package/esm2015/src/key-generator.js +108 -0
  150. package/esm2015/src/local-query-comparison-options.js +65 -0
  151. package/esm2015/src/mapping-context.js +405 -0
  152. package/esm2015/src/naming-convention.js +88 -0
  153. package/esm2015/src/observable-array.js +185 -0
  154. package/esm2015/src/predicate.js +1235 -0
  155. package/esm2015/src/primitive-array.js +87 -0
  156. package/esm2015/src/query-options.js +152 -0
  157. package/esm2015/src/relation-array.js +175 -0
  158. package/esm2015/src/save-options.js +41 -0
  159. package/esm2015/src/unattached-children-map.js +58 -0
  160. package/esm2015/src/validate.js +991 -0
  161. package/esm2015/src/validation-options.js +64 -0
  162. package/esm5/adapter-ajax-angularjs/adapter-ajax-angularjs.js +132 -0
  163. package/esm5/adapter-ajax-angularjs/adapter-core.js +49 -0
  164. package/esm5/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.js +5 -0
  165. package/esm5/adapter-ajax-fetch/adapter-ajax-fetch.js +132 -0
  166. package/esm5/adapter-ajax-fetch/adapter-core.js +49 -0
  167. package/esm5/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.js +5 -0
  168. package/esm5/adapter-ajax-httpclient/adapter-ajax-httpclient.js +139 -0
  169. package/esm5/adapter-ajax-httpclient/adapter-core.js +49 -0
  170. package/esm5/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.js +5 -0
  171. package/esm5/adapter-ajax-jquery/adapter-ajax-jquery.js +105 -0
  172. package/esm5/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.js +5 -0
  173. package/esm5/adapter-ajax-post/adapter-ajax-post.js +81 -0
  174. package/esm5/adapter-ajax-post/breeze-client-adapter-ajax-post.js +5 -0
  175. package/esm5/adapter-data-service-odata/adapter-core.js +49 -0
  176. package/esm5/adapter-data-service-odata/adapter-data-service-odata.js +466 -0
  177. package/esm5/adapter-data-service-odata/breeze-client-adapter-data-service-odata.js +5 -0
  178. package/esm5/adapter-data-service-webapi/adapter-data-service-webapi.js +98 -0
  179. package/esm5/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.js +5 -0
  180. package/esm5/adapter-model-library-backing-store/adapter-model-library-backing-store.js +270 -0
  181. package/esm5/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.js +5 -0
  182. package/esm5/adapter-model-library-ko/adapter-model-library-ko.js +242 -0
  183. package/esm5/adapter-model-library-ko/breeze-client-adapter-model-library-ko.js +5 -0
  184. package/esm5/adapter-uri-builder-json/adapter-core.js +49 -0
  185. package/esm5/adapter-uri-builder-json/adapter-uri-builder-json.js +38 -0
  186. package/esm5/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.js +5 -0
  187. package/esm5/adapter-uri-builder-odata/adapter-core.js +49 -0
  188. package/esm5/adapter-uri-builder-odata/adapter-uri-builder-odata.js +197 -0
  189. package/esm5/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.js +5 -0
  190. package/esm5/breeze-client.js +9 -0
  191. package/esm5/index.js +2 -0
  192. package/esm5/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.js +5 -0
  193. package/esm5/mixin-get-entity-graph/mixin-get-entity-graph.js +269 -0
  194. package/esm5/mixin-save-queuing/breeze-client-mixin-save-queuing.js +5 -0
  195. package/esm5/mixin-save-queuing/mixin-save-queuing.js +412 -0
  196. package/esm5/src/abstract-data-service-adapter.js +302 -0
  197. package/esm5/src/array.js +4 -0
  198. package/esm5/src/assert-param.js +317 -0
  199. package/esm5/src/breeze.js +85 -0
  200. package/esm5/src/complex-array.js +119 -0
  201. package/esm5/src/config.js +228 -0
  202. package/esm5/src/core.js +717 -0
  203. package/esm5/src/csdl-metadata-parser.js +385 -0
  204. package/esm5/src/data-service.js +207 -0
  205. package/esm5/src/data-type.js +451 -0
  206. package/esm5/src/default-property-interceptor.js +460 -0
  207. package/esm5/src/entity-action.js +52 -0
  208. package/esm5/src/entity-aspect.js +812 -0
  209. package/esm5/src/entity-group.js +189 -0
  210. package/esm5/src/entity-key.js +118 -0
  211. package/esm5/src/entity-manager.js +2112 -0
  212. package/esm5/src/entity-metadata.js +2144 -0
  213. package/esm5/src/entity-query.js +1023 -0
  214. package/esm5/src/entity-state.js +106 -0
  215. package/esm5/src/enum.js +144 -0
  216. package/esm5/src/event.js +259 -0
  217. package/esm5/src/interface-registry.js +43 -0
  218. package/esm5/src/key-generator.js +111 -0
  219. package/esm5/src/local-query-comparison-options.js +67 -0
  220. package/esm5/src/mapping-context.js +407 -0
  221. package/esm5/src/naming-convention.js +90 -0
  222. package/esm5/src/observable-array.js +201 -0
  223. package/esm5/src/predicate.js +1300 -0
  224. package/esm5/src/primitive-array.js +87 -0
  225. package/esm5/src/query-options.js +167 -0
  226. package/esm5/src/relation-array.js +175 -0
  227. package/esm5/src/save-options.js +43 -0
  228. package/esm5/src/unattached-children-map.js +60 -0
  229. package/esm5/src/validate.js +996 -0
  230. package/esm5/src/validation-options.js +66 -0
  231. package/fesm2015/{breeze-client-adapter-ajax-angularjs.mjs → breeze-client-adapter-ajax-angularjs.js} +1 -1
  232. package/fesm2015/breeze-client-adapter-ajax-angularjs.js.map +1 -0
  233. package/fesm2015/{breeze-client-adapter-ajax-fetch.mjs → breeze-client-adapter-ajax-fetch.js} +3 -5
  234. package/fesm2015/breeze-client-adapter-ajax-fetch.js.map +1 -0
  235. package/fesm2015/{breeze-client-adapter-ajax-httpclient.mjs → breeze-client-adapter-ajax-httpclient.js} +1 -1
  236. package/fesm2015/breeze-client-adapter-ajax-httpclient.js.map +1 -0
  237. package/fesm2015/{breeze-client-adapter-ajax-jquery.mjs → breeze-client-adapter-ajax-jquery.js} +2 -2
  238. package/fesm2015/breeze-client-adapter-ajax-jquery.js.map +1 -0
  239. package/{fesm2020/breeze-client-adapter-ajax-post.mjs → fesm2015/breeze-client-adapter-ajax-post.js} +1 -1
  240. package/fesm2015/breeze-client-adapter-ajax-post.js.map +1 -0
  241. package/fesm2015/{breeze-client-adapter-data-service-odata.mjs → breeze-client-adapter-data-service-odata.js} +22 -20
  242. package/fesm2015/breeze-client-adapter-data-service-odata.js.map +1 -0
  243. package/fesm2015/{breeze-client-adapter-data-service-webapi.mjs → breeze-client-adapter-data-service-webapi.js} +13 -13
  244. package/fesm2015/breeze-client-adapter-data-service-webapi.js.map +1 -0
  245. package/{fesm2020/breeze-client-adapter-model-library-backing-store.mjs → fesm2015/breeze-client-adapter-model-library-backing-store.js} +13 -13
  246. package/fesm2015/breeze-client-adapter-model-library-backing-store.js.map +1 -0
  247. package/{fesm2020/breeze-client-adapter-model-library-ko.mjs → fesm2015/breeze-client-adapter-model-library-ko.js} +13 -13
  248. package/fesm2015/breeze-client-adapter-model-library-ko.js.map +1 -0
  249. package/{fesm2020/breeze-client-adapter-uri-builder-json.mjs → fesm2015/breeze-client-adapter-uri-builder-json.js} +8 -8
  250. package/fesm2015/breeze-client-adapter-uri-builder-json.js.map +1 -0
  251. package/{fesm2020/breeze-client-adapter-uri-builder-odata.mjs → fesm2015/breeze-client-adapter-uri-builder-odata.js} +86 -85
  252. package/fesm2015/breeze-client-adapter-uri-builder-odata.js.map +1 -0
  253. package/fesm2015/{breeze-client-mixin-get-entity-graph.mjs → breeze-client-mixin-get-entity-graph.js} +1 -1
  254. package/fesm2015/breeze-client-mixin-get-entity-graph.js.map +1 -0
  255. package/fesm2015/{breeze-client-mixin-save-queuing.mjs → breeze-client-mixin-save-queuing.js} +1 -1
  256. package/fesm2015/breeze-client-mixin-save-queuing.js.map +1 -0
  257. package/fesm2015/{breeze-client.mjs → breeze-client.js} +418 -409
  258. package/fesm2015/breeze-client.js.map +1 -0
  259. package/{fesm2020/breeze-client-adapter-ajax-angularjs.mjs → fesm5/breeze-client-adapter-ajax-angularjs.js} +42 -41
  260. package/fesm5/breeze-client-adapter-ajax-angularjs.js.map +1 -0
  261. package/{fesm2020/breeze-client-adapter-ajax-fetch.mjs → fesm5/breeze-client-adapter-ajax-fetch.js} +43 -44
  262. package/fesm5/breeze-client-adapter-ajax-fetch.js.map +1 -0
  263. package/{fesm2020/breeze-client-adapter-ajax-httpclient.mjs → fesm5/breeze-client-adapter-ajax-httpclient.js} +44 -43
  264. package/fesm5/breeze-client-adapter-ajax-httpclient.js.map +1 -0
  265. package/{fesm2020/breeze-client-adapter-ajax-jquery.mjs → fesm5/breeze-client-adapter-ajax-jquery.js} +19 -18
  266. package/fesm5/breeze-client-adapter-ajax-jquery.js.map +1 -0
  267. package/{fesm2015/breeze-client-adapter-ajax-post.mjs → fesm5/breeze-client-adapter-ajax-post.js} +11 -8
  268. package/fesm5/breeze-client-adapter-ajax-post.js.map +1 -0
  269. package/{fesm2020/breeze-client-adapter-data-service-odata.mjs → fesm5/breeze-client-adapter-data-service-odata.js} +134 -126
  270. package/fesm5/breeze-client-adapter-data-service-odata.js.map +1 -0
  271. package/{fesm2020/breeze-client-adapter-data-service-webapi.mjs → fesm5/breeze-client-adapter-data-service-webapi.js} +42 -38
  272. package/fesm5/breeze-client-adapter-data-service-webapi.js.map +1 -0
  273. package/{fesm2015/breeze-client-adapter-model-library-backing-store.mjs → fesm5/breeze-client-adapter-model-library-backing-store.js} +64 -63
  274. package/fesm5/breeze-client-adapter-model-library-backing-store.js.map +1 -0
  275. package/{fesm2015/breeze-client-adapter-model-library-ko.mjs → fesm5/breeze-client-adapter-model-library-ko.js} +58 -57
  276. package/fesm5/breeze-client-adapter-model-library-ko.js.map +1 -0
  277. package/fesm5/breeze-client-adapter-uri-builder-json.js +92 -0
  278. package/fesm5/breeze-client-adapter-uri-builder-json.js.map +1 -0
  279. package/fesm5/breeze-client-adapter-uri-builder-odata.js +250 -0
  280. package/fesm5/breeze-client-adapter-uri-builder-odata.js.map +1 -0
  281. package/{fesm2020/breeze-client-mixin-get-entity-graph.mjs → fesm5/breeze-client-mixin-get-entity-graph.js} +45 -45
  282. package/fesm5/breeze-client-mixin-get-entity-graph.js.map +1 -0
  283. package/{fesm2020/breeze-client-mixin-save-queuing.mjs → fesm5/breeze-client-mixin-save-queuing.js} +126 -116
  284. package/fesm5/breeze-client-mixin-save-queuing.js.map +1 -0
  285. package/{fesm2020/breeze-client.mjs → fesm5/breeze-client.js} +3630 -3414
  286. package/fesm5/breeze-client.js.map +1 -0
  287. package/mixin-get-entity-graph/{index.d.ts → breeze-client-mixin-get-entity-graph.d.ts} +0 -1
  288. package/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.metadata.json +1 -0
  289. package/mixin-get-entity-graph/package.json +13 -0
  290. package/mixin-save-queuing/{index.d.ts → breeze-client-mixin-save-queuing.d.ts} +0 -1
  291. package/mixin-save-queuing/breeze-client-mixin-save-queuing.metadata.json +1 -0
  292. package/mixin-save-queuing/package.json +13 -0
  293. package/package.json +12 -126
  294. package/src/entity-metadata.d.ts +4 -6
  295. package/src/entity-query.d.ts +1 -1
  296. package/esm2020/adapter-ajax-angularjs/adapter-ajax-angularjs.mjs +0 -130
  297. package/esm2020/adapter-ajax-angularjs/adapter-core.mjs +0 -49
  298. package/esm2020/adapter-ajax-angularjs/breeze-client-adapter-ajax-angularjs.mjs +0 -5
  299. package/esm2020/adapter-ajax-fetch/adapter-ajax-fetch.mjs +0 -132
  300. package/esm2020/adapter-ajax-fetch/adapter-core.mjs +0 -49
  301. package/esm2020/adapter-ajax-fetch/breeze-client-adapter-ajax-fetch.mjs +0 -5
  302. package/esm2020/adapter-ajax-httpclient/adapter-ajax-httpclient.mjs +0 -137
  303. package/esm2020/adapter-ajax-httpclient/adapter-core.mjs +0 -49
  304. package/esm2020/adapter-ajax-httpclient/breeze-client-adapter-ajax-httpclient.mjs +0 -5
  305. package/esm2020/adapter-ajax-jquery/adapter-ajax-jquery.mjs +0 -103
  306. package/esm2020/adapter-ajax-jquery/breeze-client-adapter-ajax-jquery.mjs +0 -5
  307. package/esm2020/adapter-ajax-post/adapter-ajax-post.mjs +0 -77
  308. package/esm2020/adapter-ajax-post/breeze-client-adapter-ajax-post.mjs +0 -5
  309. package/esm2020/adapter-data-service-odata/adapter-core.mjs +0 -49
  310. package/esm2020/adapter-data-service-odata/adapter-data-service-odata.mjs +0 -456
  311. package/esm2020/adapter-data-service-odata/breeze-client-adapter-data-service-odata.mjs +0 -5
  312. package/esm2020/adapter-data-service-webapi/adapter-data-service-webapi.mjs +0 -93
  313. package/esm2020/adapter-data-service-webapi/breeze-client-adapter-data-service-webapi.mjs +0 -5
  314. package/esm2020/adapter-model-library-backing-store/adapter-model-library-backing-store.mjs +0 -268
  315. package/esm2020/adapter-model-library-backing-store/breeze-client-adapter-model-library-backing-store.mjs +0 -5
  316. package/esm2020/adapter-model-library-ko/adapter-model-library-ko.mjs +0 -240
  317. package/esm2020/adapter-model-library-ko/breeze-client-adapter-model-library-ko.mjs +0 -5
  318. package/esm2020/adapter-uri-builder-json/adapter-core.mjs +0 -49
  319. package/esm2020/adapter-uri-builder-json/adapter-uri-builder-json.mjs +0 -36
  320. package/esm2020/adapter-uri-builder-json/breeze-client-adapter-uri-builder-json.mjs +0 -5
  321. package/esm2020/adapter-uri-builder-odata/adapter-core.mjs +0 -49
  322. package/esm2020/adapter-uri-builder-odata/adapter-uri-builder-odata.mjs +0 -190
  323. package/esm2020/adapter-uri-builder-odata/breeze-client-adapter-uri-builder-odata.mjs +0 -5
  324. package/esm2020/breeze-client.mjs +0 -5
  325. package/esm2020/index.mjs +0 -2
  326. package/esm2020/mixin-get-entity-graph/breeze-client-mixin-get-entity-graph.mjs +0 -5
  327. package/esm2020/mixin-get-entity-graph/mixin-get-entity-graph.mjs +0 -269
  328. package/esm2020/mixin-save-queuing/breeze-client-mixin-save-queuing.mjs +0 -5
  329. package/esm2020/mixin-save-queuing/mixin-save-queuing.mjs +0 -400
  330. package/esm2020/src/abstract-data-service-adapter.mjs +0 -296
  331. package/esm2020/src/array.mjs +0 -4
  332. package/esm2020/src/assert-param.mjs +0 -312
  333. package/esm2020/src/breeze.mjs +0 -85
  334. package/esm2020/src/complex-array.mjs +0 -117
  335. package/esm2020/src/config.mjs +0 -223
  336. package/esm2020/src/core.mjs +0 -707
  337. package/esm2020/src/csdl-metadata-parser.mjs +0 -385
  338. package/esm2020/src/data-service.mjs +0 -203
  339. package/esm2020/src/data-type.mjs +0 -444
  340. package/esm2020/src/default-property-interceptor.mjs +0 -460
  341. package/esm2020/src/entity-action.mjs +0 -45
  342. package/esm2020/src/entity-aspect.mjs +0 -806
  343. package/esm2020/src/entity-group.mjs +0 -187
  344. package/esm2020/src/entity-key.mjs +0 -116
  345. package/esm2020/src/entity-manager.mjs +0 -2094
  346. package/esm2020/src/entity-metadata.mjs +0 -2109
  347. package/esm2020/src/entity-query.mjs +0 -996
  348. package/esm2020/src/entity-state.mjs +0 -99
  349. package/esm2020/src/enum.mjs +0 -141
  350. package/esm2020/src/event.mjs +0 -256
  351. package/esm2020/src/interface-registry.mjs +0 -41
  352. package/esm2020/src/key-generator.mjs +0 -108
  353. package/esm2020/src/local-query-comparison-options.mjs +0 -65
  354. package/esm2020/src/mapping-context.mjs +0 -405
  355. package/esm2020/src/naming-convention.mjs +0 -88
  356. package/esm2020/src/observable-array.mjs +0 -183
  357. package/esm2020/src/predicate.mjs +0 -1232
  358. package/esm2020/src/primitive-array.mjs +0 -85
  359. package/esm2020/src/query-options.mjs +0 -152
  360. package/esm2020/src/relation-array.mjs +0 -173
  361. package/esm2020/src/save-options.mjs +0 -41
  362. package/esm2020/src/unattached-children-map.mjs +0 -58
  363. package/esm2020/src/validate.mjs +0 -988
  364. package/esm2020/src/validation-options.mjs +0 -64
  365. package/fesm2015/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  366. package/fesm2015/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  367. package/fesm2015/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  368. package/fesm2015/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  369. package/fesm2015/breeze-client-adapter-ajax-post.mjs.map +0 -1
  370. package/fesm2015/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  371. package/fesm2015/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  372. package/fesm2015/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  373. package/fesm2015/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  374. package/fesm2015/breeze-client-adapter-uri-builder-json.mjs +0 -91
  375. package/fesm2015/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  376. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs +0 -245
  377. package/fesm2015/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  378. package/fesm2015/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  379. package/fesm2015/breeze-client-mixin-save-queuing.mjs.map +0 -1
  380. package/fesm2015/breeze-client.mjs.map +0 -1
  381. package/fesm2020/breeze-client-adapter-ajax-angularjs.mjs.map +0 -1
  382. package/fesm2020/breeze-client-adapter-ajax-fetch.mjs.map +0 -1
  383. package/fesm2020/breeze-client-adapter-ajax-httpclient.mjs.map +0 -1
  384. package/fesm2020/breeze-client-adapter-ajax-jquery.mjs.map +0 -1
  385. package/fesm2020/breeze-client-adapter-ajax-post.mjs.map +0 -1
  386. package/fesm2020/breeze-client-adapter-data-service-odata.mjs.map +0 -1
  387. package/fesm2020/breeze-client-adapter-data-service-webapi.mjs.map +0 -1
  388. package/fesm2020/breeze-client-adapter-model-library-backing-store.mjs.map +0 -1
  389. package/fesm2020/breeze-client-adapter-model-library-ko.mjs.map +0 -1
  390. package/fesm2020/breeze-client-adapter-uri-builder-json.mjs.map +0 -1
  391. package/fesm2020/breeze-client-adapter-uri-builder-odata.mjs.map +0 -1
  392. package/fesm2020/breeze-client-mixin-get-entity-graph.mjs.map +0 -1
  393. package/fesm2020/breeze-client-mixin-save-queuing.mjs.map +0 -1
  394. package/fesm2020/breeze-client.mjs.map +0 -1
@@ -0,0 +1,407 @@
1
+ import { core } from './core';
2
+ import { DataType } from './data-type';
3
+ import { EntityState } from './entity-state';
4
+ import { EntityAction } from './entity-action';
5
+ import { EntityType, DataProperty } from './entity-metadata';
6
+ import { MergeStrategy } from './query-options';
7
+ import { EntityQuery } from './entity-query';
8
+ /**
9
+ For use by breeze plugin authors only. The class is for use in building a [[IDataServiceAdapter]] implementation.
10
+ @adapter (see [[IDataServiceAdapter]])
11
+ @hidden
12
+ */
13
+ var MappingContext = /** @class */ (function () {
14
+ function MappingContext(config) {
15
+ this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
16
+ core.extend(this, config, [
17
+ "query", "entityManager", "dataService", "mergeOptions"
18
+ ]);
19
+ // calc'd props
20
+ this.refMap = {};
21
+ this.deferredFns = [];
22
+ this.jsonResultsAdapter = this.dataService.jsonResultsAdapter;
23
+ this.metadataStore = this.entityManager.metadataStore;
24
+ this.rawValueFn = DataProperty.getRawValueFromServer; // think about passing this in later.
25
+ }
26
+ MappingContext.prototype.getUrl = function () {
27
+ var query = this.query;
28
+ if (!query) {
29
+ throw new Error("query cannot be empty");
30
+ }
31
+ var uriString;
32
+ if (typeof query === 'string') {
33
+ uriString = query;
34
+ }
35
+ else if (query instanceof EntityQuery) {
36
+ uriString = this.dataService.uriBuilder.buildUri(query, this.metadataStore);
37
+ }
38
+ else {
39
+ throw new Error("unable to recognize query parameter as either a string or an EntityQuery");
40
+ }
41
+ return this.dataService.qualifyUrl(uriString);
42
+ };
43
+ MappingContext.prototype.visitAndMerge = function (nodes, nodeContext) {
44
+ var query = this.query;
45
+ var jra = this.jsonResultsAdapter;
46
+ nodeContext = nodeContext || {};
47
+ var that = this;
48
+ return core.map(nodes, function (node) {
49
+ if (query == null && node.entityAspect) {
50
+ // don't bother merging a result from a save that was not returned from the server.
51
+ if (node.entityAspect.entityState.isDeleted()) {
52
+ that.entityManager.detachEntity(node);
53
+ }
54
+ else {
55
+ node.entityAspect.acceptChanges();
56
+ }
57
+ return node;
58
+ }
59
+ var meta = jra.visitNode(node, that, nodeContext) || {};
60
+ node = meta.node || node;
61
+ if (query && nodeContext.nodeType === "root" && !meta.entityType) {
62
+ meta.entityType = query instanceof EntityQuery && query._getToEntityType && query._getToEntityType(that.metadataStore);
63
+ }
64
+ return processMeta(that, node, meta);
65
+ }, this.mergeOptions.includeDeleted);
66
+ };
67
+ MappingContext.prototype.processDeferred = function () {
68
+ if (this.deferredFns.length > 0) {
69
+ this.deferredFns.forEach(function (fn) {
70
+ fn();
71
+ });
72
+ }
73
+ };
74
+ return MappingContext;
75
+ }());
76
+ export { MappingContext };
77
+ MappingContext.prototype._$typeName = "MappingContext";
78
+ function processMeta(mc, node, meta, assignFn) {
79
+ // == is deliberate here instead of ===
80
+ if (meta.ignore || node == null) {
81
+ return null;
82
+ }
83
+ else if (meta.nodeRefId) {
84
+ var refValue_1 = resolveEntityRef(mc, meta.nodeRefId);
85
+ if (typeof refValue_1 === "function" && assignFn != null) {
86
+ mc.deferredFns.push(function () {
87
+ assignFn(refValue_1);
88
+ });
89
+ return undefined; // deferred and will be set later;
90
+ }
91
+ return refValue_1;
92
+ }
93
+ else if (meta.entityType) {
94
+ var entityType = meta.entityType;
95
+ if (mc.mergeOptions.noTracking) {
96
+ node = processNoMerge(mc, entityType, node);
97
+ if (entityType.noTrackingFn) {
98
+ node = entityType.noTrackingFn(node, entityType);
99
+ }
100
+ if (meta.nodeId) {
101
+ mc.refMap[meta.nodeId] = node;
102
+ }
103
+ return node;
104
+ }
105
+ else {
106
+ if (entityType.isComplexType) {
107
+ // because we still need to do serverName to client name processing
108
+ return processNoMerge(mc, entityType, node);
109
+ }
110
+ else {
111
+ return mergeEntity(mc, node, meta);
112
+ }
113
+ }
114
+ }
115
+ else {
116
+ if ((!meta.passThru) && typeof node === 'object' && !core.isDate(node)) {
117
+ node = processAnonType(mc, node);
118
+ }
119
+ // updating the refMap for entities is handled by updateEntityRef for entities.
120
+ if (meta.nodeId) {
121
+ mc.refMap[meta.nodeId] = node;
122
+ }
123
+ return node;
124
+ }
125
+ }
126
+ function processNoMerge(mc, stype, node) {
127
+ var result = {};
128
+ stype.dataProperties.forEach(function (dp) {
129
+ if (dp.isComplexProperty) {
130
+ result[dp.name] = core.map(node[dp.nameOnServer], function (v) {
131
+ return processNoMerge(mc, dp.dataType, v);
132
+ });
133
+ }
134
+ else {
135
+ result[dp.name] = DataType.parseRawValue(node[dp.nameOnServer], dp.dataType);
136
+ }
137
+ });
138
+ (stype instanceof EntityType) && stype.navigationProperties.forEach(function (np) {
139
+ var nodeContext = { nodeType: "navProp", navigationProperty: np };
140
+ visitNode(node[np.nameOnServer], mc, nodeContext, result, np.name);
141
+ });
142
+ return result;
143
+ }
144
+ function processAnonType(mc, node) {
145
+ // node is guaranteed to be an object by this point, i.e. not a scalar
146
+ var keyFn = mc.metadataStore.namingConvention.serverPropertyNameToClient;
147
+ var result = {};
148
+ core.objectForEach(node, function (key, value) {
149
+ var newKey = keyFn(key);
150
+ var nodeContext = { nodeType: "anonProp", propertyName: newKey };
151
+ visitNode(value, mc, nodeContext, result, newKey);
152
+ });
153
+ return result;
154
+ }
155
+ function visitNode(node, mc, nodeContext, result, key) {
156
+ var jra = mc.jsonResultsAdapter;
157
+ var meta = jra.visitNode(node, mc, nodeContext) || {};
158
+ // allows visitNode to change the value;
159
+ node = meta.node || node;
160
+ if (meta.ignore)
161
+ return;
162
+ if (meta.passThru)
163
+ return node;
164
+ if (Array.isArray(node)) {
165
+ nodeContext.nodeType = nodeContext.nodeType + "Item";
166
+ result[key] = node.map(function (v, ix) {
167
+ meta = jra.visitNode(v, mc, nodeContext) || {};
168
+ v = meta.node || v;
169
+ return processMeta(mc, v, meta, function (refValue) {
170
+ result[key][ix] = refValue();
171
+ });
172
+ });
173
+ }
174
+ else {
175
+ result[key] = processMeta(mc, node, meta, function (refValue) {
176
+ result[key] = refValue();
177
+ });
178
+ }
179
+ }
180
+ function resolveEntityRef(mc, nodeRefId) {
181
+ var entity = mc.refMap[nodeRefId];
182
+ if (entity === undefined) {
183
+ return function () {
184
+ return mc.refMap[nodeRefId];
185
+ };
186
+ }
187
+ else {
188
+ return entity;
189
+ }
190
+ }
191
+ function updateEntityRef(mc, targetEntity, node) {
192
+ var nodeId = node._$meta.nodeId;
193
+ if (!nodeId && node._$meta.extraMetadata) {
194
+ // odata case. refMap isn't really used, but is returned as data.retrievedEntities, so we populated it anyway.
195
+ nodeId = node._$meta.extraMetadata.uriKey;
196
+ }
197
+ if (nodeId != null) {
198
+ mc.refMap[nodeId] = targetEntity;
199
+ }
200
+ }
201
+ // can return null for a deleted entity if includeDeleted == false
202
+ function mergeEntity(mc, node, meta) {
203
+ node._$meta = meta;
204
+ var em = mc.entityManager;
205
+ var entityType = meta.entityType;
206
+ if (typeof (entityType) === 'string') {
207
+ entityType = mc.metadataStore._getStructuralType(entityType, false);
208
+ }
209
+ node.entityType = entityType;
210
+ var mergeStrategy = mc.mergeOptions.mergeStrategy;
211
+ var isSaving = mc.query == null;
212
+ var entityKey = entityType.getEntityKeyFromRawEntity(node, mc.rawValueFn);
213
+ var targetEntity = em.getEntityByKey(entityKey);
214
+ if (targetEntity) {
215
+ if (isSaving && targetEntity.entityAspect.entityState.isDeleted()) {
216
+ em.detachEntity(targetEntity);
217
+ return targetEntity;
218
+ }
219
+ var targetEntityState = targetEntity.entityAspect.entityState;
220
+ if (mergeStrategy === MergeStrategy.Disallowed) {
221
+ throw new Error("A MergeStrategy of 'Disallowed' prevents " + entityKey.toString() + " from being merged");
222
+ }
223
+ else if (mergeStrategy === MergeStrategy.SkipMerge) {
224
+ updateEntityNoMerge(mc, targetEntity, node);
225
+ }
226
+ else {
227
+ if (mergeStrategy === MergeStrategy.OverwriteChanges
228
+ || targetEntityState.isUnchanged()) {
229
+ updateEntity(mc, targetEntity, node);
230
+ targetEntity.entityAspect.wasLoaded = true;
231
+ if (meta.extraMetadata) {
232
+ targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
233
+ }
234
+ targetEntity.entityAspect.entityState = EntityState.Unchanged;
235
+ clearOriginalValues(targetEntity);
236
+ // propertyName not specified because multiple props EntityChangedEventArgs
237
+ targetEntity.entityAspect.propertyChanged.publish({ entity: targetEntity, propertyName: null });
238
+ var action = isSaving ? EntityAction.MergeOnSave : EntityAction.MergeOnQuery;
239
+ em.entityChanged.publish({ entityAction: action, entity: targetEntity });
240
+ // this is needed to handle an overwrite of a modified entity with an unchanged entity
241
+ // which might in turn cause _hasChanges to change.
242
+ if (!targetEntityState.isUnchanged()) {
243
+ em._notifyStateChange(targetEntity, false);
244
+ }
245
+ }
246
+ else {
247
+ if (targetEntityState === EntityState.Deleted && !mc.mergeOptions.includeDeleted) {
248
+ return null;
249
+ }
250
+ updateEntityNoMerge(mc, targetEntity, node);
251
+ }
252
+ }
253
+ }
254
+ else {
255
+ targetEntity = entityType._createInstanceCore();
256
+ updateEntity(mc, targetEntity, node);
257
+ if (meta.extraMetadata) {
258
+ targetEntity.entityAspect.extraMetadata = meta.extraMetadata;
259
+ }
260
+ // em._attachEntityCore(targetEntity, EntityState.Unchanged, MergeStrategy.Disallowed);
261
+ em._attachEntityCore(targetEntity, EntityState.Unchanged, mergeStrategy);
262
+ targetEntity.entityAspect.wasLoaded = true;
263
+ em.entityChanged.publish({ entityAction: EntityAction.AttachOnQuery, entity: targetEntity });
264
+ }
265
+ return targetEntity;
266
+ }
267
+ // copied from entityAspect
268
+ function clearOriginalValues(target) {
269
+ var aspect = target.entityAspect || target.complexAspect;
270
+ aspect.originalValues = {};
271
+ var stype = target.entityType || target.complexType;
272
+ stype.complexProperties.forEach(function (cp) {
273
+ var cos = target.getProperty(cp.name);
274
+ if (cp.isScalar) {
275
+ clearOriginalValues(cos);
276
+ }
277
+ else {
278
+ cos._acceptChanges();
279
+ cos.forEach(clearOriginalValues);
280
+ }
281
+ });
282
+ }
283
+ function updateEntityNoMerge(mc, targetEntity, node) {
284
+ updateEntityRef(mc, targetEntity, node);
285
+ // we still need to merge related entities even if top level entity wasn't modified.
286
+ node.entityType.navigationProperties.forEach(function (np) {
287
+ if (np.isScalar) {
288
+ mergeRelatedEntityCore(mc, node, np);
289
+ }
290
+ else {
291
+ mergeRelatedEntitiesCore(mc, node, np);
292
+ }
293
+ });
294
+ }
295
+ function updateEntity(mc, targetEntity, node) {
296
+ updateEntityRef(mc, targetEntity, node);
297
+ var entityType = targetEntity.entityType;
298
+ entityType._updateTargetFromRaw(targetEntity, node, mc.rawValueFn);
299
+ entityType.navigationProperties.forEach(function (np) {
300
+ if (np.isScalar) {
301
+ mergeRelatedEntity(mc, np, targetEntity, node);
302
+ }
303
+ else {
304
+ mergeRelatedEntities(mc, np, targetEntity, node);
305
+ }
306
+ });
307
+ }
308
+ function mergeRelatedEntity(mc, navigationProperty, targetEntity, rawEntity) {
309
+ var relatedEntity = mergeRelatedEntityCore(mc, rawEntity, navigationProperty);
310
+ if (relatedEntity == null)
311
+ return;
312
+ if (typeof relatedEntity === 'function') {
313
+ mc.deferredFns.push(function () {
314
+ relatedEntity = relatedEntity();
315
+ updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
316
+ });
317
+ }
318
+ else {
319
+ updateRelatedEntity(relatedEntity, targetEntity, navigationProperty);
320
+ }
321
+ }
322
+ function mergeRelatedEntities(mc, navigationProperty, targetEntity, rawEntity) {
323
+ var relatedEntities = mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty);
324
+ if (relatedEntities == null)
325
+ return;
326
+ var inverseProperty = navigationProperty.inverse;
327
+ if (!inverseProperty)
328
+ return;
329
+ var originalRelatedEntities = targetEntity.getProperty(navigationProperty.name);
330
+ originalRelatedEntities.wasLoaded = true;
331
+ relatedEntities.forEach(function (relatedEntity) {
332
+ if (typeof relatedEntity === 'function') {
333
+ mc.deferredFns.push(function () {
334
+ relatedEntity = relatedEntity();
335
+ updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
336
+ });
337
+ }
338
+ else {
339
+ updateRelatedEntityInCollection(mc, relatedEntity, originalRelatedEntities, targetEntity, inverseProperty);
340
+ }
341
+ });
342
+ }
343
+ function mergeRelatedEntityCore(mc, rawEntity, navigationProperty) {
344
+ var relatedRawEntity = rawEntity[navigationProperty.nameOnServer];
345
+ if (!relatedRawEntity)
346
+ return null;
347
+ var relatedEntity = mc.visitAndMerge(relatedRawEntity, { nodeType: "navProp", navigationProperty: navigationProperty });
348
+ return relatedEntity;
349
+ }
350
+ function mergeRelatedEntitiesCore(mc, rawEntity, navigationProperty) {
351
+ var relatedRawEntities = rawEntity[navigationProperty.nameOnServer];
352
+ if (!relatedRawEntities)
353
+ return null;
354
+ // needed if what is returned is not an array and we expect one - this happens with __deferred in OData.
355
+ if (!Array.isArray(relatedRawEntities)) {
356
+ // return null;
357
+ relatedRawEntities = relatedRawEntities.results; // OData v3 will look like this with an expand
358
+ if (!relatedRawEntities) {
359
+ return null;
360
+ }
361
+ }
362
+ var relatedEntities = mc.visitAndMerge(relatedRawEntities, { nodeType: "navPropItem", navigationProperty: navigationProperty });
363
+ return relatedEntities;
364
+ }
365
+ function updateRelatedEntity(relatedEntity, targetEntity, navigationProperty) {
366
+ if (!relatedEntity)
367
+ return;
368
+ var propName = navigationProperty.name;
369
+ var currentRelatedEntity = targetEntity.getProperty(propName);
370
+ // check if the related entity is already hooked up
371
+ if (currentRelatedEntity !== relatedEntity) {
372
+ // if not hook up both directions.
373
+ targetEntity.setProperty(propName, relatedEntity);
374
+ var inverseProperty = navigationProperty.inverse;
375
+ if (!inverseProperty)
376
+ return;
377
+ if (inverseProperty.isScalar) {
378
+ relatedEntity.setProperty(inverseProperty.name, targetEntity);
379
+ }
380
+ else {
381
+ var collection = relatedEntity.getProperty(inverseProperty.name);
382
+ collection.push(targetEntity);
383
+ }
384
+ }
385
+ }
386
+ function updateRelatedEntityInCollection(mc, relatedEntity, relatedEntities, targetEntity, inverseProperty) {
387
+ if (!relatedEntity)
388
+ return;
389
+ // don't update relatedCollection if preserveChanges & relatedEntity has an fkChange.
390
+ if (relatedEntity.entityAspect.entityState === EntityState.Modified
391
+ && mc.mergeOptions.mergeStrategy === MergeStrategy.PreserveChanges) {
392
+ var origValues_1 = relatedEntity.entityAspect.originalValues;
393
+ var fkWasModified = inverseProperty.relatedDataProperties.some(function (dp) {
394
+ return origValues_1[dp.name] != undefined;
395
+ });
396
+ if (fkWasModified)
397
+ return;
398
+ }
399
+ // check if the related entity is already hooked up
400
+ var thisEntity = relatedEntity.getProperty(inverseProperty.name);
401
+ if (thisEntity !== targetEntity) {
402
+ // if not - hook it up.
403
+ relatedEntities.push(relatedEntity);
404
+ relatedEntity.setProperty(inverseProperty.name, targetEntity);
405
+ }
406
+ }
407
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYnJlZXplLWNsaWVudC8iLCJzb3VyY2VzIjpbInNyYy9tYXBwaW5nLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFHLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFpQixVQUFVLEVBQWtCLFlBQVksRUFBc0IsTUFBTSxtQkFBbUIsQ0FBQztBQUVoSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBc0I3Qzs7OztFQUlFO0FBQ0Y7SUFpQkUsd0JBQVksTUFBNEI7UUFieEMsZUFBVSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLHFDQUFxQztRQWVwRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsY0FBYztTQUN4RCxDQUFDLENBQUM7UUFFSCxlQUFlO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLHFDQUFxQztJQUM3RixDQUFDO0lBRUQsK0JBQU0sR0FBTjtRQUNFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUNELElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM3QixTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ25CO2FBQU0sSUFBSSxLQUFLLFlBQVksV0FBVyxFQUFFO1lBQ3ZDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM5RTthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1NBQzdGO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsc0NBQWEsR0FBYixVQUFjLEtBQVksRUFBRSxXQUFnQjtRQUMxQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNsQyxXQUFXLEdBQUcsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUk7WUFDbkMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3RDLG1GQUFtRjtnQkFDbkYsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTtvQkFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7aUJBQ25DO2dCQUNELE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztZQUN6QixJQUFJLEtBQUssSUFBSSxXQUFXLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxZQUFZLFdBQVcsSUFBSyxLQUFLLENBQUMsZ0JBQWdCLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN6SDtZQUNELE9BQU8sV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHdDQUFlLEdBQWY7UUFDRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEVBQUU7Z0JBQzFCLEVBQUUsRUFBRSxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUEvRUQsSUErRUM7O0FBQ0QsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7QUFHdkQsU0FBUyxXQUFXLENBQUMsRUFBa0IsRUFBRSxJQUFTLEVBQUUsSUFBYyxFQUFFLFFBQTZCO0lBQy9GLHVDQUF1QztJQUN2QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUMvQixPQUFPLElBQUksQ0FBQztLQUNiO1NBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ3pCLElBQUksVUFBUSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsSUFBSSxPQUFPLFVBQVEsS0FBSyxVQUFVLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtZQUN0RCxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDbEIsUUFBUSxDQUFDLFVBQVEsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUMsQ0FBQyxrQ0FBa0M7U0FDckQ7UUFDRCxPQUFPLFVBQVEsQ0FBQztLQUNqQjtTQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUMxQixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2pDLElBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUU7WUFDOUIsSUFBSSxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksVUFBVSxDQUFDLFlBQVksRUFBRTtnQkFDM0IsSUFBSSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNmLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQzthQUMvQjtZQUNELE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTTtZQUNMLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRTtnQkFDNUIsbUVBQW1FO2dCQUNuRSxPQUFPLGNBQWMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzdDO2lCQUFNO2dCQUNMLE9BQU8sV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDcEM7U0FDRjtLQUNGO1NBQU07UUFFTCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN2RSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNsQztRQUVELCtFQUErRTtRQUMvRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDL0I7UUFDRCxPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEVBQWtCLEVBQUUsS0FBcUIsRUFBRSxJQUFTO0lBQzFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVoQixLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7UUFDdkMsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBQyxDQUFNO2dCQUN2RCxPQUFPLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsUUFBb0IsQ0FBQyxDQUFDO1NBQzFGO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFFLFVBQUMsRUFBRTtRQUN0RSxJQUFJLFdBQVcsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDbEUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQWtCLEVBQUUsSUFBUztJQUNwRCxzRUFBc0U7SUFDdEUsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQztJQUN6RSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLEVBQUUsS0FBSztRQUMzQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxXQUFXLEdBQUcsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUNqRSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLElBQVMsRUFBRSxFQUFrQixFQUFFLFdBQXdCLEVBQUUsTUFBYyxFQUFFLEdBQVc7SUFDckcsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0lBQ2hDLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEQsd0NBQXdDO0lBQ3hDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztJQUV6QixJQUFJLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTztJQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDL0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDckQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7WUFDbkIsT0FBTyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxRQUFRO2dCQUNoRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsUUFBUTtZQUMxRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEVBQWtCLEVBQUUsU0FBaUI7SUFDN0QsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7UUFDeEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUM7S0FDSDtTQUFNO1FBQ0wsT0FBTyxNQUFNLENBQUM7S0FDZjtBQUNILENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxFQUFrQixFQUFFLFlBQWlCLEVBQUUsSUFBUztJQUN2RSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO1FBQ3hDLCtHQUErRztRQUMvRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1FBQ2xCLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDO0tBQ2xDO0FBQ0gsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxTQUFTLFdBQVcsQ0FBQyxFQUFrQixFQUFFLElBQVMsRUFBRSxJQUFjO0lBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ25CLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFFMUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQXdCLENBQUM7SUFDL0MsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQ3BDLFVBQVUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQWUsQ0FBQztLQUNuRjtJQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBRTdCLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ2xELElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO0lBRWhDLElBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzFFLElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsSUFBSSxRQUFRLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDakUsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM5QixPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUNELElBQUksaUJBQWlCLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDOUQsSUFBSSxhQUFhLEtBQUssYUFBYSxDQUFDLFVBQVUsRUFBRTtZQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO1NBQzVHO2FBQU0sSUFBSSxhQUFhLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRTtZQUNwRCxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDTCxJQUFJLGFBQWEsS0FBSyxhQUFhLENBQUMsZ0JBQWdCO21CQUMvQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDcEMsWUFBWSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztnQkFDM0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO29CQUN0QixZQUFZLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUM5RDtnQkFDRCxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO2dCQUM5RCxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbEMsMkVBQTJFO2dCQUMzRSxZQUFZLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQzdFLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDekUsc0ZBQXNGO2dCQUN0RixtREFBbUQ7Z0JBQ25ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDcEMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLGlCQUFpQixLQUFLLFdBQVcsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRTtvQkFDaEYsT0FBTyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0QsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3QztTQUNGO0tBQ0Y7U0FBTTtRQUNMLFlBQVksR0FBRyxVQUFVLENBQUMsbUJBQW1CLEVBQVksQ0FBQztRQUUxRCxZQUFZLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUM5RDtRQUNELHVGQUF1RjtRQUN2RixFQUFFLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekUsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQzNDLEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7S0FDOUY7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsMkJBQTJCO0FBQzNCLFNBQVMsbUJBQW1CLENBQUMsTUFBVztJQUN0QyxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDekQsTUFBTSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDM0IsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDO0lBQ3BELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFPO1FBQy9DLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUNmLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO2FBQU07WUFDTCxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBR0QsU0FBUyxtQkFBbUIsQ0FBQyxFQUFrQixFQUFFLFlBQW9CLEVBQUUsSUFBUztJQUM5RSxlQUFlLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxvRkFBb0Y7SUFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFzQjtRQUMzRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDZixzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDTCx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFBa0IsRUFBRSxZQUFvQixFQUFFLElBQVM7SUFDdkUsZUFBZSxDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN6QyxVQUFVLENBQUMsb0JBQW9CLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFbkUsVUFBVSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7UUFDbEQsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQ2Ysa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDaEQ7YUFBTTtZQUNMLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxFQUFrQixFQUFFLGtCQUFzQyxFQUFFLFlBQW9CLEVBQUUsU0FBYztJQUUxSCxJQUFJLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDOUUsSUFBSSxhQUFhLElBQUksSUFBSTtRQUFFLE9BQU87SUFDbEMsSUFBSSxPQUFPLGFBQWEsS0FBSyxVQUFVLEVBQUU7UUFDdkMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDbEIsYUFBYSxHQUFHLGFBQWEsRUFBRSxDQUFDO1lBQ2hDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixDQUFDLENBQUM7S0FDdEU7QUFDSCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxFQUFrQixFQUFFLGtCQUFzQyxFQUFFLFlBQW9CLEVBQUUsU0FBYztJQUM1SCxJQUFJLGVBQWUsR0FBRyx3QkFBd0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDbEYsSUFBSSxlQUFlLElBQUksSUFBSTtRQUFFLE9BQU87SUFFcEMsSUFBSSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO0lBQ2pELElBQUksQ0FBQyxlQUFlO1FBQUUsT0FBTztJQUU3QixJQUFJLHVCQUF1QixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEYsdUJBQXVCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUV6QyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsYUFBa0I7UUFDbEQsSUFBSSxPQUFPLGFBQWEsS0FBSyxVQUFVLEVBQUU7WUFDdkMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLGFBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQztnQkFDaEMsK0JBQStCLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEVBQUUsZUFBcUMsQ0FBQyxDQUFDO1lBQ25JLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLCtCQUErQixDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLGVBQXFDLENBQUMsQ0FBQztTQUNsSTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsRUFBa0IsRUFBRSxTQUFjLEVBQUUsa0JBQXNDO0lBQ3hHLElBQUksZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xFLElBQUksQ0FBQyxnQkFBZ0I7UUFBRSxPQUFPLElBQUksQ0FBQztJQUVuQyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDeEgsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsRUFBa0IsRUFBRSxTQUFjLEVBQUUsa0JBQXNDO0lBQzFHLElBQUksa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxrQkFBa0I7UUFBRSxPQUFPLElBQUksQ0FBQztJQUVyQyx3R0FBd0c7SUFDeEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUN0QyxlQUFlO1FBQ2Ysa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsOENBQThDO1FBQy9GLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN2QixPQUFPLElBQUksQ0FBQztTQUNiO0tBQ0Y7SUFFRCxJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDaEksT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsYUFBcUIsRUFBRSxZQUFvQixFQUFFLGtCQUFzQztJQUM5RyxJQUFJLENBQUMsYUFBYTtRQUFFLE9BQU87SUFDM0IsSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLElBQUksb0JBQW9CLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU5RCxtREFBbUQ7SUFDbkQsSUFBSSxvQkFBb0IsS0FBSyxhQUFhLEVBQUU7UUFDMUMsa0NBQWtDO1FBQ2xDLFlBQVksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELElBQUksZUFBZSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQUNqRCxJQUFJLENBQUMsZUFBZTtZQUFFLE9BQU87UUFDN0IsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQzVCLGFBQWEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztTQUMvRDthQUFNO1lBQ0wsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakUsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUUvQjtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsK0JBQStCLENBQUMsRUFBa0IsRUFBRSxhQUFpQyxFQUMxRixlQUF5QixFQUFFLFlBQW9CLEVBQUUsZUFBbUM7SUFDdEYsSUFBSSxDQUFDLGFBQWE7UUFBRSxPQUFPO0lBRTNCLHFGQUFxRjtJQUNyRixJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxRQUFRO1dBQzlELEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxLQUFLLGFBQWEsQ0FBQyxlQUFlLEVBQUU7UUFDcEUsSUFBSSxZQUFVLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7UUFDM0QsSUFBSSxhQUFhLEdBQUcsZUFBZSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDekUsT0FBTyxZQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksYUFBYTtZQUFFLE9BQU87S0FDM0I7SUFDRCxtREFBbUQ7SUFDbkQsSUFBSSxVQUFVLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFakUsSUFBSSxVQUFVLEtBQUssWUFBWSxFQUFFO1FBQy9CLHVCQUF1QjtRQUN2QixlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztLQUMvRDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU2VydmljZUFkYXB0ZXIgfSBmcm9tICcuL2ludGVyZmFjZS1yZWdpc3RyeSc7XHJcbmltcG9ydCB7IGNvcmUgfSBmcm9tICcuL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZSAgfSBmcm9tICcuL2RhdGEtdHlwZSc7XHJcbmltcG9ydCB7IERhdGFTZXJ2aWNlLCBKc29uUmVzdWx0c0FkYXB0ZXIsIE5vZGVDb250ZXh0LCBOb2RlTWV0YSB9IGZyb20gJy4vZGF0YS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50aXR5U3RhdGUgIH0gZnJvbSAnLi9lbnRpdHktc3RhdGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBY3Rpb24gfSBmcm9tICcuL2VudGl0eS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVN0b3JlLCBFbnRpdHlUeXBlLCBTdHJ1Y3R1cmFsVHlwZSwgRGF0YVByb3BlcnR5LCBOYXZpZ2F0aW9uUHJvcGVydHkgfSBmcm9tICcuL2VudGl0eS1tZXRhZGF0YSc7XHJcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tICcuL2VudGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgTWVyZ2VTdHJhdGVneSB9IGZyb20gJy4vcXVlcnktb3B0aW9ucyc7XHJcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eVF1ZXJ5IH0gZnJvbSAnLi9lbnRpdHktcXVlcnknO1xyXG5cclxuXHJcbi8qKlxyXG5Gb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiBUaGUgY2xhc3MgaXMgZm9yIHVzZSBpbiBidWlsZGluZyBhIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uLiBcclxuQGFkYXB0ZXIgKHNlZSBbW0lEYXRhU2VydmljZUFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW4gXHJcbiovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VPcHRpb25zIHtcclxuICBtZXJnZVN0cmF0ZWd5OiBNZXJnZVN0cmF0ZWd5O1xyXG4gIGluY2x1ZGVEZWxldGVkPzogYm9vbGVhbjtcclxuICBub1RyYWNraW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBoaWRkZW4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBNYXBwaW5nQ29udGV4dENvbmZpZyB7XHJcbiAgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlO1xyXG4gIHF1ZXJ5PzogRW50aXR5UXVlcnkgfCBzdHJpbmc7XHJcbiAgZW50aXR5TWFuYWdlcjogRW50aXR5TWFuYWdlcjtcclxuICBtZXJnZU9wdGlvbnM6IE1lcmdlT3B0aW9ucztcclxufVxyXG5cclxuLyoqXHJcbkZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuIFRoZSBjbGFzcyBpcyBmb3IgdXNlIGluIGJ1aWxkaW5nIGEgW1tJRGF0YVNlcnZpY2VBZGFwdGVyXV0gaW1wbGVtZW50YXRpb24uIFxyXG5AYWRhcHRlciAoc2VlIFtbSURhdGFTZXJ2aWNlQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKi9cclxuZXhwb3J0IGNsYXNzIE1hcHBpbmdDb250ZXh0IHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfJHR5cGVOYW1lOiBzdHJpbmc7IC8vIG9uIHByb3RvdHlwZVxyXG5cclxuICByYXdWYWx1ZUZuID0gRGF0YVByb3BlcnR5LmdldFJhd1ZhbHVlRnJvbVNlcnZlcjsgLy8gdGhpbmsgYWJvdXQgcGFzc2luZyB0aGlzIGluIGxhdGVyLlxyXG5cclxuICBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XHJcbiAgcXVlcnk6IEVudGl0eVF1ZXJ5IHwgc3RyaW5nO1xyXG4gIGVudGl0eU1hbmFnZXI6IEVudGl0eU1hbmFnZXI7XHJcbiAgbWVyZ2VPcHRpb25zOiBNZXJnZU9wdGlvbnM7XHJcbiAgYWRhcHRlcjogRGF0YVNlcnZpY2VBZGFwdGVyOyAgLy8gYXNzaWduZWQgaW4gdGhlIEFic3RyYWN0RGF0YVNlcnZpY2VBZGFwdGVyLlxyXG5cclxuICByZWZNYXA6IE9iamVjdDsgLy8gVE9ET1xyXG4gIGRlZmVycmVkRm5zOiBGdW5jdGlvbltdOyAvLyBUT0RPXHJcbiAganNvblJlc3VsdHNBZGFwdGVyOiBKc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgbWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBNYXBwaW5nQ29udGV4dENvbmZpZykge1xyXG5cclxuICAgIGNvcmUuZXh0ZW5kKHRoaXMsIGNvbmZpZywgW1xyXG4gICAgICBcInF1ZXJ5XCIsIFwiZW50aXR5TWFuYWdlclwiLCBcImRhdGFTZXJ2aWNlXCIsIFwibWVyZ2VPcHRpb25zXCJcclxuICAgIF0pO1xyXG5cclxuICAgIC8vIGNhbGMnZCBwcm9wc1xyXG4gICAgdGhpcy5yZWZNYXAgPSB7fTtcclxuICAgIHRoaXMuZGVmZXJyZWRGbnMgPSBbXTtcclxuICAgIHRoaXMuanNvblJlc3VsdHNBZGFwdGVyID0gdGhpcy5kYXRhU2VydmljZS5qc29uUmVzdWx0c0FkYXB0ZXI7XHJcbiAgICB0aGlzLm1ldGFkYXRhU3RvcmUgPSB0aGlzLmVudGl0eU1hbmFnZXIubWV0YWRhdGFTdG9yZTtcclxuICAgIHRoaXMucmF3VmFsdWVGbiA9IERhdGFQcm9wZXJ0eS5nZXRSYXdWYWx1ZUZyb21TZXJ2ZXI7IC8vIHRoaW5rIGFib3V0IHBhc3NpbmcgdGhpcyBpbiBsYXRlci5cclxuICB9XHJcblxyXG4gIGdldFVybCgpIHtcclxuICAgIGxldCBxdWVyeSA9IHRoaXMucXVlcnk7XHJcbiAgICBpZiAoIXF1ZXJ5KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInF1ZXJ5IGNhbm5vdCBiZSBlbXB0eVwiKTtcclxuICAgIH1cclxuICAgIGxldCB1cmlTdHJpbmc6IHN0cmluZztcclxuICAgIGlmICh0eXBlb2YgcXVlcnkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHF1ZXJ5O1xyXG4gICAgfSBlbHNlIGlmIChxdWVyeSBpbnN0YW5jZW9mIEVudGl0eVF1ZXJ5KSB7XHJcbiAgICAgIHVyaVN0cmluZyA9IHRoaXMuZGF0YVNlcnZpY2UudXJpQnVpbGRlciEuYnVpbGRVcmkocXVlcnksIHRoaXMubWV0YWRhdGFTdG9yZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gcmVjb2duaXplIHF1ZXJ5IHBhcmFtZXRlciBhcyBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gRW50aXR5UXVlcnlcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5xdWFsaWZ5VXJsKHVyaVN0cmluZyk7XHJcbiAgfVxyXG5cclxuICB2aXNpdEFuZE1lcmdlKG5vZGVzOiBhbnlbXSwgbm9kZUNvbnRleHQ6IGFueSkge1xyXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5xdWVyeTtcclxuICAgIGxldCBqcmEgPSB0aGlzLmpzb25SZXN1bHRzQWRhcHRlcjtcclxuICAgIG5vZGVDb250ZXh0ID0gbm9kZUNvbnRleHQgfHwge307XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICByZXR1cm4gY29yZS5tYXAobm9kZXMsIGZ1bmN0aW9uIChub2RlKSB7XHJcbiAgICAgIGlmIChxdWVyeSA9PSBudWxsICYmIG5vZGUuZW50aXR5QXNwZWN0KSB7XHJcbiAgICAgICAgLy8gZG9uJ3QgYm90aGVyIG1lcmdpbmcgYSByZXN1bHQgZnJvbSBhIHNhdmUgdGhhdCB3YXMgbm90IHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAgICBpZiAobm9kZS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgICAgIHRoYXQuZW50aXR5TWFuYWdlci5kZXRhY2hFbnRpdHkobm9kZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5vZGUuZW50aXR5QXNwZWN0LmFjY2VwdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtZXRhID0ganJhLnZpc2l0Tm9kZShub2RlLCB0aGF0LCBub2RlQ29udGV4dCkgfHwge307XHJcbiAgICAgIG5vZGUgPSBtZXRhLm5vZGUgfHwgbm9kZTtcclxuICAgICAgaWYgKHF1ZXJ5ICYmIG5vZGVDb250ZXh0Lm5vZGVUeXBlID09PSBcInJvb3RcIiAmJiAhbWV0YS5lbnRpdHlUeXBlKSB7XHJcbiAgICAgICAgbWV0YS5lbnRpdHlUeXBlID0gcXVlcnkgaW5zdGFuY2VvZiBFbnRpdHlRdWVyeSAmJiAgcXVlcnkuX2dldFRvRW50aXR5VHlwZSAmJiBxdWVyeS5fZ2V0VG9FbnRpdHlUeXBlKHRoYXQubWV0YWRhdGFTdG9yZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByb2Nlc3NNZXRhKHRoYXQsIG5vZGUsIG1ldGEpO1xyXG4gICAgfSwgdGhpcy5tZXJnZU9wdGlvbnMuaW5jbHVkZURlbGV0ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc0RlZmVycmVkKCkge1xyXG4gICAgaWYgKHRoaXMuZGVmZXJyZWRGbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRlZmVycmVkRm5zLmZvckVhY2goKGZuKSA9PiB7XHJcbiAgICAgICAgZm4oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbk1hcHBpbmdDb250ZXh0LnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJNYXBwaW5nQ29udGV4dFwiO1xyXG5cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NNZXRhKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZTogYW55LCBtZXRhOiBOb2RlTWV0YSwgYXNzaWduRm4/OiAodmFsOiBhbnkpID0+IHZvaWQpIHtcclxuICAvLyA9PSBpcyBkZWxpYmVyYXRlIGhlcmUgaW5zdGVhZCBvZiA9PT1cclxuICBpZiAobWV0YS5pZ25vcmUgfHwgbm9kZSA9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9IGVsc2UgaWYgKG1ldGEubm9kZVJlZklkKSB7XHJcbiAgICBsZXQgcmVmVmFsdWUgPSByZXNvbHZlRW50aXR5UmVmKG1jLCBtZXRhLm5vZGVSZWZJZCk7XHJcbiAgICBpZiAodHlwZW9mIHJlZlZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgYXNzaWduRm4gIT0gbnVsbCkge1xyXG4gICAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBhc3NpZ25GbihyZWZWYWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBkZWZlcnJlZCBhbmQgd2lsbCBiZSBzZXQgbGF0ZXI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmVmFsdWU7XHJcbiAgfSBlbHNlIGlmIChtZXRhLmVudGl0eVR5cGUpIHtcclxuICAgIGxldCBlbnRpdHlUeXBlID0gbWV0YS5lbnRpdHlUeXBlO1xyXG4gICAgaWYgKG1jLm1lcmdlT3B0aW9ucy5ub1RyYWNraW5nKSB7XHJcbiAgICAgIG5vZGUgPSBwcm9jZXNzTm9NZXJnZShtYywgZW50aXR5VHlwZSwgbm9kZSk7XHJcbiAgICAgIGlmIChlbnRpdHlUeXBlLm5vVHJhY2tpbmdGbikge1xyXG4gICAgICAgIG5vZGUgPSBlbnRpdHlUeXBlLm5vVHJhY2tpbmdGbihub2RlLCBlbnRpdHlUeXBlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobWV0YS5ub2RlSWQpIHtcclxuICAgICAgICBtYy5yZWZNYXBbbWV0YS5ub2RlSWRdID0gbm9kZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbm9kZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChlbnRpdHlUeXBlLmlzQ29tcGxleFR5cGUpIHtcclxuICAgICAgICAvLyBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdG8gZG8gc2VydmVyTmFtZSB0byBjbGllbnQgbmFtZSBwcm9jZXNzaW5nXHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NOb01lcmdlKG1jLCBlbnRpdHlUeXBlLCBub2RlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbWVyZ2VFbnRpdHkobWMsIG5vZGUsIG1ldGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuXHJcbiAgICBpZiAoKCFtZXRhLnBhc3NUaHJ1KSAmJiB0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcgJiYgISBjb3JlLmlzRGF0ZShub2RlKSkge1xyXG4gICAgICBub2RlID0gcHJvY2Vzc0Fub25UeXBlKG1jLCBub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGRhdGluZyB0aGUgcmVmTWFwIGZvciBlbnRpdGllcyBpcyBoYW5kbGVkIGJ5IHVwZGF0ZUVudGl0eVJlZiBmb3IgZW50aXRpZXMuXHJcbiAgICBpZiAobWV0YS5ub2RlSWQpIHtcclxuICAgICAgbWMucmVmTWFwW21ldGEubm9kZUlkXSA9IG5vZGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NOb01lcmdlKG1jOiBNYXBwaW5nQ29udGV4dCwgc3R5cGU6IFN0cnVjdHVyYWxUeXBlLCBub2RlOiBhbnkpIHtcclxuICBsZXQgcmVzdWx0ID0ge307XHJcblxyXG4gIHN0eXBlLmRhdGFQcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKGRwKSB7XHJcbiAgICBpZiAoZHAuaXNDb21wbGV4UHJvcGVydHkpIHtcclxuICAgICAgcmVzdWx0W2RwLm5hbWVdID0gY29yZS5tYXAobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCAodjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NOb01lcmdlKG1jLCBkcC5kYXRhVHlwZSBhcyBhbnksIHYpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdFtkcC5uYW1lXSA9IERhdGFUeXBlLnBhcnNlUmF3VmFsdWUobm9kZVtkcC5uYW1lT25TZXJ2ZXJdLCBkcC5kYXRhVHlwZSBhcyBEYXRhVHlwZSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIChzdHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUpICYmIHN0eXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goIChucCkgPT4ge1xyXG4gICAgbGV0IG5vZGVDb250ZXh0ID0geyBub2RlVHlwZTogXCJuYXZQcm9wXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbnAgfTtcclxuICAgIHZpc2l0Tm9kZShub2RlW25wLm5hbWVPblNlcnZlcl0sIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBucC5uYW1lKTtcclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc0Fub25UeXBlKG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZTogYW55KSB7XHJcbiAgLy8gbm9kZSBpcyBndWFyYW50ZWVkIHRvIGJlIGFuIG9iamVjdCBieSB0aGlzIHBvaW50LCBpLmUuIG5vdCBhIHNjYWxhclxyXG4gIGxldCBrZXlGbiA9IG1jLm1ldGFkYXRhU3RvcmUubmFtaW5nQ29udmVudGlvbi5zZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDtcclxuICBsZXQgcmVzdWx0ID0ge307XHJcblxyXG4gIGNvcmUub2JqZWN0Rm9yRWFjaChub2RlLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xyXG4gICAgbGV0IG5ld0tleSA9IGtleUZuKGtleSk7XHJcbiAgICBsZXQgbm9kZUNvbnRleHQgPSB7IG5vZGVUeXBlOiBcImFub25Qcm9wXCIsIHByb3BlcnR5TmFtZTogbmV3S2V5IH07XHJcbiAgICB2aXNpdE5vZGUodmFsdWUsIG1jLCBub2RlQ29udGV4dCwgcmVzdWx0LCBuZXdLZXkpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHZpc2l0Tm9kZShub2RlOiBhbnksIG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZUNvbnRleHQ6IE5vZGVDb250ZXh0LCByZXN1bHQ6IE9iamVjdCwga2V5OiBzdHJpbmcpIHtcclxuICBsZXQganJhID0gbWMuanNvblJlc3VsdHNBZGFwdGVyO1xyXG4gIGxldCBtZXRhID0ganJhLnZpc2l0Tm9kZShub2RlLCBtYywgbm9kZUNvbnRleHQpIHx8IHt9O1xyXG4gIC8vIGFsbG93cyB2aXNpdE5vZGUgdG8gY2hhbmdlIHRoZSB2YWx1ZTtcclxuICBub2RlID0gbWV0YS5ub2RlIHx8IG5vZGU7XHJcblxyXG4gIGlmIChtZXRhLmlnbm9yZSkgcmV0dXJuO1xyXG4gIGlmIChtZXRhLnBhc3NUaHJ1KSByZXR1cm4gbm9kZTtcclxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xyXG4gICAgbm9kZUNvbnRleHQubm9kZVR5cGUgPSBub2RlQ29udGV4dC5ub2RlVHlwZSArIFwiSXRlbVwiO1xyXG4gICAgcmVzdWx0W2tleV0gPSBub2RlLm1hcChmdW5jdGlvbiAodiwgaXgpIHtcclxuICAgICAgbWV0YSA9IGpyYS52aXNpdE5vZGUodiwgbWMsIG5vZGVDb250ZXh0KSB8fCB7fTtcclxuICAgICAgdiA9IG1ldGEubm9kZSB8fCB2O1xyXG4gICAgICByZXR1cm4gcHJvY2Vzc01ldGEobWMsIHYsIG1ldGEsIGZ1bmN0aW9uIChyZWZWYWx1ZSkge1xyXG4gICAgICAgIHJlc3VsdFtrZXldW2l4XSA9IHJlZlZhbHVlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJlc3VsdFtrZXldID0gcHJvY2Vzc01ldGEobWMsIG5vZGUsIG1ldGEsIGZ1bmN0aW9uIChyZWZWYWx1ZSkge1xyXG4gICAgICByZXN1bHRba2V5XSA9IHJlZlZhbHVlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVFbnRpdHlSZWYobWM6IE1hcHBpbmdDb250ZXh0LCBub2RlUmVmSWQ6IHN0cmluZykge1xyXG4gIGxldCBlbnRpdHkgPSBtYy5yZWZNYXBbbm9kZVJlZklkXTtcclxuICBpZiAoZW50aXR5ID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiBtYy5yZWZNYXBbbm9kZVJlZklkXTtcclxuICAgIH07XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBlbnRpdHk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHlSZWYobWM6IE1hcHBpbmdDb250ZXh0LCB0YXJnZXRFbnRpdHk6IGFueSwgbm9kZTogYW55KSB7XHJcbiAgbGV0IG5vZGVJZCA9IG5vZGUuXyRtZXRhLm5vZGVJZDtcclxuICBpZiAoIW5vZGVJZCAmJiBub2RlLl8kbWV0YS5leHRyYU1ldGFkYXRhKSB7XHJcbiAgICAvLyBvZGF0YSBjYXNlLiAgcmVmTWFwIGlzbid0IHJlYWxseSB1c2VkLCBidXQgaXMgcmV0dXJuZWQgYXMgZGF0YS5yZXRyaWV2ZWRFbnRpdGllcywgc28gd2UgcG9wdWxhdGVkIGl0IGFueXdheS5cclxuICAgIG5vZGVJZCA9IG5vZGUuXyRtZXRhLmV4dHJhTWV0YWRhdGEudXJpS2V5O1xyXG4gIH1cclxuICBpZiAobm9kZUlkICE9IG51bGwpIHtcclxuICAgIG1jLnJlZk1hcFtub2RlSWRdID0gdGFyZ2V0RW50aXR5O1xyXG4gIH1cclxufVxyXG5cclxuLy8gY2FuIHJldHVybiBudWxsIGZvciBhIGRlbGV0ZWQgZW50aXR5IGlmIGluY2x1ZGVEZWxldGVkID09IGZhbHNlXHJcbmZ1bmN0aW9uIG1lcmdlRW50aXR5KG1jOiBNYXBwaW5nQ29udGV4dCwgbm9kZTogYW55LCBtZXRhOiBOb2RlTWV0YSkge1xyXG4gIG5vZGUuXyRtZXRhID0gbWV0YTtcclxuICBsZXQgZW0gPSBtYy5lbnRpdHlNYW5hZ2VyO1xyXG5cclxuICBsZXQgZW50aXR5VHlwZSA9IG1ldGEuZW50aXR5VHlwZSBhcyBFbnRpdHlUeXBlO1xyXG4gIGlmICh0eXBlb2YgKGVudGl0eVR5cGUpID09PSAnc3RyaW5nJykge1xyXG4gICAgZW50aXR5VHlwZSA9IG1jLm1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGVudGl0eVR5cGUsIGZhbHNlKSBhcyBFbnRpdHlUeXBlO1xyXG4gIH1cclxuICBub2RlLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlO1xyXG5cclxuICBsZXQgbWVyZ2VTdHJhdGVneSA9IG1jLm1lcmdlT3B0aW9ucy5tZXJnZVN0cmF0ZWd5O1xyXG4gIGxldCBpc1NhdmluZyA9IG1jLnF1ZXJ5ID09IG51bGw7XHJcblxyXG4gIGxldCBlbnRpdHlLZXkgPSBlbnRpdHlUeXBlLmdldEVudGl0eUtleUZyb21SYXdFbnRpdHkobm9kZSwgbWMucmF3VmFsdWVGbik7XHJcbiAgbGV0IHRhcmdldEVudGl0eSA9IGVtLmdldEVudGl0eUJ5S2V5KGVudGl0eUtleSk7XHJcbiAgaWYgKHRhcmdldEVudGl0eSkge1xyXG4gICAgaWYgKGlzU2F2aW5nICYmIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUuaXNEZWxldGVkKCkpIHtcclxuICAgICAgZW0uZGV0YWNoRW50aXR5KHRhcmdldEVudGl0eSk7XHJcbiAgICAgIHJldHVybiB0YXJnZXRFbnRpdHk7XHJcbiAgICB9XHJcbiAgICBsZXQgdGFyZ2V0RW50aXR5U3RhdGUgPSB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlO1xyXG4gICAgaWYgKG1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIE1lcmdlU3RyYXRlZ3kgb2YgJ0Rpc2FsbG93ZWQnIHByZXZlbnRzIFwiICsgZW50aXR5S2V5LnRvU3RyaW5nKCkgKyBcIiBmcm9tIGJlaW5nIG1lcmdlZFwiKTtcclxuICAgIH0gZWxzZSBpZiAobWVyZ2VTdHJhdGVneSA9PT0gTWVyZ2VTdHJhdGVneS5Ta2lwTWVyZ2UpIHtcclxuICAgICAgdXBkYXRlRW50aXR5Tm9NZXJnZShtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChtZXJnZVN0cmF0ZWd5ID09PSBNZXJnZVN0cmF0ZWd5Lk92ZXJ3cml0ZUNoYW5nZXNcclxuICAgICAgICB8fCB0YXJnZXRFbnRpdHlTdGF0ZS5pc1VuY2hhbmdlZCgpKSB7XHJcbiAgICAgICAgdXBkYXRlRW50aXR5KG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG4gICAgICAgIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3Qud2FzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICBpZiAobWV0YS5leHRyYU1ldGFkYXRhKSB7XHJcbiAgICAgICAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0LmV4dHJhTWV0YWRhdGEgPSBtZXRhLmV4dHJhTWV0YWRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3QuZW50aXR5U3RhdGUgPSBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQ7XHJcbiAgICAgICAgY2xlYXJPcmlnaW5hbFZhbHVlcyh0YXJnZXRFbnRpdHkpO1xyXG4gICAgICAgIC8vIHByb3BlcnR5TmFtZSBub3Qgc3BlY2lmaWVkIGJlY2F1c2UgbXVsdGlwbGUgcHJvcHMgRW50aXR5Q2hhbmdlZEV2ZW50QXJnc1xyXG4gICAgICAgIHRhcmdldEVudGl0eS5lbnRpdHlBc3BlY3QucHJvcGVydHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHk6IHRhcmdldEVudGl0eSwgcHJvcGVydHlOYW1lOiBudWxsIH0pO1xyXG4gICAgICAgIGxldCBhY3Rpb24gPSBpc1NhdmluZyA/IEVudGl0eUFjdGlvbi5NZXJnZU9uU2F2ZSA6IEVudGl0eUFjdGlvbi5NZXJnZU9uUXVlcnk7XHJcbiAgICAgICAgZW0uZW50aXR5Q2hhbmdlZC5wdWJsaXNoKHsgZW50aXR5QWN0aW9uOiBhY3Rpb24sIGVudGl0eTogdGFyZ2V0RW50aXR5IH0pO1xyXG4gICAgICAgIC8vIHRoaXMgaXMgbmVlZGVkIHRvIGhhbmRsZSBhbiBvdmVyd3JpdGUgb2YgYSBtb2RpZmllZCBlbnRpdHkgd2l0aCBhbiB1bmNoYW5nZWQgZW50aXR5XHJcbiAgICAgICAgLy8gd2hpY2ggbWlnaHQgaW4gdHVybiBjYXVzZSBfaGFzQ2hhbmdlcyB0byBjaGFuZ2UuXHJcbiAgICAgICAgaWYgKCF0YXJnZXRFbnRpdHlTdGF0ZS5pc1VuY2hhbmdlZCgpKSB7XHJcbiAgICAgICAgICBlbS5fbm90aWZ5U3RhdGVDaGFuZ2UodGFyZ2V0RW50aXR5LCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0YXJnZXRFbnRpdHlTdGF0ZSA9PT0gRW50aXR5U3RhdGUuRGVsZXRlZCAmJiAhbWMubWVyZ2VPcHRpb25zLmluY2x1ZGVEZWxldGVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdXBkYXRlRW50aXR5Tm9NZXJnZShtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB0YXJnZXRFbnRpdHkgPSBlbnRpdHlUeXBlLl9jcmVhdGVJbnN0YW5jZUNvcmUoKSBhcyBFbnRpdHk7XHJcblxyXG4gICAgdXBkYXRlRW50aXR5KG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG5cclxuICAgIGlmIChtZXRhLmV4dHJhTWV0YWRhdGEpIHtcclxuICAgICAgdGFyZ2V0RW50aXR5LmVudGl0eUFzcGVjdC5leHRyYU1ldGFkYXRhID0gbWV0YS5leHRyYU1ldGFkYXRhO1xyXG4gICAgfVxyXG4gICAgLy8gZW0uX2F0dGFjaEVudGl0eUNvcmUodGFyZ2V0RW50aXR5LCBFbnRpdHlTdGF0ZS5VbmNoYW5nZWQsIE1lcmdlU3RyYXRlZ3kuRGlzYWxsb3dlZCk7XHJcbiAgICBlbS5fYXR0YWNoRW50aXR5Q29yZSh0YXJnZXRFbnRpdHksIEVudGl0eVN0YXRlLlVuY2hhbmdlZCwgbWVyZ2VTdHJhdGVneSk7XHJcbiAgICB0YXJnZXRFbnRpdHkuZW50aXR5QXNwZWN0Lndhc0xvYWRlZCA9IHRydWU7XHJcbiAgICBlbS5lbnRpdHlDaGFuZ2VkLnB1Ymxpc2goeyBlbnRpdHlBY3Rpb246IEVudGl0eUFjdGlvbi5BdHRhY2hPblF1ZXJ5LCBlbnRpdHk6IHRhcmdldEVudGl0eSB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHRhcmdldEVudGl0eTtcclxufVxyXG5cclxuLy8gY29waWVkIGZyb20gZW50aXR5QXNwZWN0XHJcbmZ1bmN0aW9uIGNsZWFyT3JpZ2luYWxWYWx1ZXModGFyZ2V0OiBhbnkpIHtcclxuICBsZXQgYXNwZWN0ID0gdGFyZ2V0LmVudGl0eUFzcGVjdCB8fCB0YXJnZXQuY29tcGxleEFzcGVjdDtcclxuICBhc3BlY3Qub3JpZ2luYWxWYWx1ZXMgPSB7fTtcclxuICBsZXQgc3R5cGUgPSB0YXJnZXQuZW50aXR5VHlwZSB8fCB0YXJnZXQuY29tcGxleFR5cGU7XHJcbiAgc3R5cGUuY29tcGxleFByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAoY3A6IGFueSkge1xyXG4gICAgbGV0IGNvcyA9IHRhcmdldC5nZXRQcm9wZXJ0eShjcC5uYW1lKTtcclxuICAgIGlmIChjcC5pc1NjYWxhcikge1xyXG4gICAgICBjbGVhck9yaWdpbmFsVmFsdWVzKGNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb3MuX2FjY2VwdENoYW5nZXMoKTtcclxuICAgICAgY29zLmZvckVhY2goY2xlYXJPcmlnaW5hbFZhbHVlcyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHlOb01lcmdlKG1jOiBNYXBwaW5nQ29udGV4dCwgdGFyZ2V0RW50aXR5OiBFbnRpdHksIG5vZGU6IGFueSkge1xyXG4gIHVwZGF0ZUVudGl0eVJlZihtYywgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAvLyB3ZSBzdGlsbCBuZWVkIHRvIG1lcmdlIHJlbGF0ZWQgZW50aXRpZXMgZXZlbiBpZiB0b3AgbGV2ZWwgZW50aXR5IHdhc24ndCBtb2RpZmllZC5cclxuICBub2RlLmVudGl0eVR5cGUubmF2aWdhdGlvblByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbiAobnA6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gICAgaWYgKG5wLmlzU2NhbGFyKSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIG5vZGUsIG5wKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzQ29yZShtYywgbm9kZSwgbnApO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cGRhdGVFbnRpdHkobWM6IE1hcHBpbmdDb250ZXh0LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbm9kZTogYW55KSB7XHJcbiAgdXBkYXRlRW50aXR5UmVmKG1jLCB0YXJnZXRFbnRpdHksIG5vZGUpO1xyXG4gIGxldCBlbnRpdHlUeXBlID0gdGFyZ2V0RW50aXR5LmVudGl0eVR5cGU7XHJcbiAgZW50aXR5VHlwZS5fdXBkYXRlVGFyZ2V0RnJvbVJhdyh0YXJnZXRFbnRpdHksIG5vZGUsIG1jLnJhd1ZhbHVlRm4pO1xyXG5cclxuICBlbnRpdHlUeXBlLm5hdmlnYXRpb25Qcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24gKG5wKSB7XHJcbiAgICBpZiAobnAuaXNTY2FsYXIpIHtcclxuICAgICAgbWVyZ2VSZWxhdGVkRW50aXR5KG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lcmdlUmVsYXRlZEVudGl0aWVzKG1jLCBucCwgdGFyZ2V0RW50aXR5LCBub2RlKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXR5KG1jOiBNYXBwaW5nQ29udGV4dCwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHksIHRhcmdldEVudGl0eTogRW50aXR5LCByYXdFbnRpdHk6IGFueSkge1xyXG5cclxuICBsZXQgcmVsYXRlZEVudGl0eSA9IG1lcmdlUmVsYXRlZEVudGl0eUNvcmUobWMsIHJhd0VudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5KTtcclxuICBpZiAocmVsYXRlZEVudGl0eSA9PSBudWxsKSByZXR1cm47XHJcbiAgaWYgKHR5cGVvZiByZWxhdGVkRW50aXR5ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmVsYXRlZEVudGl0eSA9IHJlbGF0ZWRFbnRpdHkoKTtcclxuICAgICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgICB9KTtcclxuICB9IGVsc2Uge1xyXG4gICAgdXBkYXRlUmVsYXRlZEVudGl0eShyZWxhdGVkRW50aXR5LCB0YXJnZXRFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdGllcyhtYzogTWFwcGluZ0NvbnRleHQsIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgcmF3RW50aXR5OiBhbnkpIHtcclxuICBsZXQgcmVsYXRlZEVudGl0aWVzID0gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jLCByYXdFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eSk7XHJcbiAgaWYgKHJlbGF0ZWRFbnRpdGllcyA9PSBudWxsKSByZXR1cm47XHJcblxyXG4gIGxldCBpbnZlcnNlUHJvcGVydHkgPSBuYXZpZ2F0aW9uUHJvcGVydHkuaW52ZXJzZTtcclxuICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG5cclxuICBsZXQgb3JpZ2luYWxSZWxhdGVkRW50aXRpZXMgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5Lm5hbWUpO1xyXG4gIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLndhc0xvYWRlZCA9IHRydWU7XHJcblxyXG4gIHJlbGF0ZWRFbnRpdGllcy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGVkRW50aXR5OiBhbnkpIHtcclxuICAgIGlmICh0eXBlb2YgcmVsYXRlZEVudGl0eSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBtYy5kZWZlcnJlZEZucy5wdXNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZWxhdGVkRW50aXR5ID0gcmVsYXRlZEVudGl0eSgpO1xyXG4gICAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVwZGF0ZVJlbGF0ZWRFbnRpdHlJbkNvbGxlY3Rpb24obWMsIHJlbGF0ZWRFbnRpdHksIG9yaWdpbmFsUmVsYXRlZEVudGl0aWVzLCB0YXJnZXRFbnRpdHksIGludmVyc2VQcm9wZXJ0eSBhcyBOYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZVJlbGF0ZWRFbnRpdHlDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdHkgPSByYXdFbnRpdHlbbmF2aWdhdGlvblByb3BlcnR5Lm5hbWVPblNlcnZlcl07XHJcbiAgaWYgKCFyZWxhdGVkUmF3RW50aXR5KSByZXR1cm4gbnVsbDtcclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdHkgPSBtYy52aXNpdEFuZE1lcmdlKHJlbGF0ZWRSYXdFbnRpdHksIHsgbm9kZVR5cGU6IFwibmF2UHJvcFwiLCBuYXZpZ2F0aW9uUHJvcGVydHk6IG5hdmlnYXRpb25Qcm9wZXJ0eSB9KTtcclxuICByZXR1cm4gcmVsYXRlZEVudGl0eTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VSZWxhdGVkRW50aXRpZXNDb3JlKG1jOiBNYXBwaW5nQ29udGV4dCwgcmF3RW50aXR5OiBhbnksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgbGV0IHJlbGF0ZWRSYXdFbnRpdGllcyA9IHJhd0VudGl0eVtuYXZpZ2F0aW9uUHJvcGVydHkubmFtZU9uU2VydmVyXTtcclxuICBpZiAoIXJlbGF0ZWRSYXdFbnRpdGllcykgcmV0dXJuIG51bGw7XHJcblxyXG4gIC8vIG5lZWRlZCBpZiB3aGF0IGlzIHJldHVybmVkIGlzIG5vdCBhbiBhcnJheSBhbmQgd2UgZXhwZWN0IG9uZSAtIHRoaXMgaGFwcGVucyB3aXRoIF9fZGVmZXJyZWQgaW4gT0RhdGEuXHJcbiAgaWYgKCFBcnJheS5pc0FycmF5KHJlbGF0ZWRSYXdFbnRpdGllcykpIHtcclxuICAgIC8vIHJldHVybiBudWxsO1xyXG4gICAgcmVsYXRlZFJhd0VudGl0aWVzID0gcmVsYXRlZFJhd0VudGl0aWVzLnJlc3VsdHM7IC8vIE9EYXRhIHYzIHdpbGwgbG9vayBsaWtlIHRoaXMgd2l0aCBhbiBleHBhbmRcclxuICAgIGlmICghcmVsYXRlZFJhd0VudGl0aWVzKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGV0IHJlbGF0ZWRFbnRpdGllcyA9IG1jLnZpc2l0QW5kTWVyZ2UocmVsYXRlZFJhd0VudGl0aWVzLCB7IG5vZGVUeXBlOiBcIm5hdlByb3BJdGVtXCIsIG5hdmlnYXRpb25Qcm9wZXJ0eTogbmF2aWdhdGlvblByb3BlcnR5IH0pO1xyXG4gIHJldHVybiByZWxhdGVkRW50aXRpZXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVJlbGF0ZWRFbnRpdHkocmVsYXRlZEVudGl0eTogRW50aXR5LCB0YXJnZXRFbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkpIHtcclxuICBpZiAoIXJlbGF0ZWRFbnRpdHkpIHJldHVybjtcclxuICBsZXQgcHJvcE5hbWUgPSBuYXZpZ2F0aW9uUHJvcGVydHkubmFtZTtcclxuICBsZXQgY3VycmVudFJlbGF0ZWRFbnRpdHkgPSB0YXJnZXRFbnRpdHkuZ2V0UHJvcGVydHkocHJvcE5hbWUpO1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgcmVsYXRlZCBlbnRpdHkgaXMgYWxyZWFkeSBob29rZWQgdXBcclxuICBpZiAoY3VycmVudFJlbGF0ZWRFbnRpdHkgIT09IHJlbGF0ZWRFbnRpdHkpIHtcclxuICAgIC8vIGlmIG5vdCBob29rIHVwIGJvdGggZGlyZWN0aW9ucy5cclxuICAgIHRhcmdldEVudGl0eS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgcmVsYXRlZEVudGl0eSk7XHJcbiAgICBsZXQgaW52ZXJzZVByb3BlcnR5ID0gbmF2aWdhdGlvblByb3BlcnR5LmludmVyc2U7XHJcbiAgICBpZiAoIWludmVyc2VQcm9wZXJ0eSkgcmV0dXJuO1xyXG4gICAgaWYgKGludmVyc2VQcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgICByZWxhdGVkRW50aXR5LnNldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lLCB0YXJnZXRFbnRpdHkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGNvbGxlY3Rpb24gPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuICAgICAgY29sbGVjdGlvbi5wdXNoKHRhcmdldEVudGl0eSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdXBkYXRlUmVsYXRlZEVudGl0eUluQ29sbGVjdGlvbihtYzogTWFwcGluZ0NvbnRleHQsIHJlbGF0ZWRFbnRpdHk6IEVudGl0eSB8IHVuZGVmaW5lZCxcclxuICAgIHJlbGF0ZWRFbnRpdGllczogRW50aXR5W10sIHRhcmdldEVudGl0eTogRW50aXR5LCBpbnZlcnNlUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gIGlmICghcmVsYXRlZEVudGl0eSkgcmV0dXJuO1xyXG5cclxuICAvLyBkb24ndCB1cGRhdGUgcmVsYXRlZENvbGxlY3Rpb24gaWYgcHJlc2VydmVDaGFuZ2VzICYgcmVsYXRlZEVudGl0eSBoYXMgYW4gZmtDaGFuZ2UuXHJcbiAgaWYgKHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eVN0YXRlID09PSBFbnRpdHlTdGF0ZS5Nb2RpZmllZFxyXG4gICAgJiYgbWMubWVyZ2VPcHRpb25zLm1lcmdlU3RyYXRlZ3kgPT09IE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzKSB7XHJcbiAgICBsZXQgb3JpZ1ZhbHVlcyA9IHJlbGF0ZWRFbnRpdHkuZW50aXR5QXNwZWN0Lm9yaWdpbmFsVmFsdWVzO1xyXG4gICAgbGV0IGZrV2FzTW9kaWZpZWQgPSBpbnZlcnNlUHJvcGVydHkucmVsYXRlZERhdGFQcm9wZXJ0aWVzLnNvbWUoZnVuY3Rpb24gKGRwKSB7XHJcbiAgICAgIHJldHVybiBvcmlnVmFsdWVzW2RwLm5hbWVdICE9IHVuZGVmaW5lZDtcclxuICAgIH0pO1xyXG4gICAgaWYgKGZrV2FzTW9kaWZpZWQpIHJldHVybjtcclxuICB9XHJcbiAgLy8gY2hlY2sgaWYgdGhlIHJlbGF0ZWQgZW50aXR5IGlzIGFscmVhZHkgaG9va2VkIHVwXHJcbiAgbGV0IHRoaXNFbnRpdHkgPSByZWxhdGVkRW50aXR5LmdldFByb3BlcnR5KGludmVyc2VQcm9wZXJ0eS5uYW1lKTtcclxuXHJcbiAgaWYgKHRoaXNFbnRpdHkgIT09IHRhcmdldEVudGl0eSkge1xyXG4gICAgLy8gaWYgbm90IC0gaG9vayBpdCB1cC5cclxuICAgIHJlbGF0ZWRFbnRpdGllcy5wdXNoKHJlbGF0ZWRFbnRpdHkpO1xyXG4gICAgcmVsYXRlZEVudGl0eS5zZXRQcm9wZXJ0eShpbnZlcnNlUHJvcGVydHkubmFtZSwgdGFyZ2V0RW50aXR5KTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,90 @@
1
+ import { assertConfig } from './assert-param';
2
+ import { core } from './core';
3
+ import { config } from './config';
4
+ /**
5
+ A NamingConvention instance is used to specify the naming conventions under which a MetadataStore
6
+ will translate property names between the server and the javascript client.
7
+
8
+ The default NamingConvention does not perform any translation, it simply passes property names thru unchanged.
9
+ @dynamic
10
+ **/
11
+ var NamingConvention = /** @class */ (function () {
12
+ /**
13
+ NamingConvention constructor
14
+ > // A naming convention that converts the first character of every property name to uppercase on the server
15
+ > // and lowercase on the client.
16
+ > var namingConv = new NamingConvention({
17
+ > serverPropertyNameToClient: function(serverPropertyName) {
18
+ > return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
19
+ > },
20
+ > clientPropertyNameToServer: function(clientPropertyName) {
21
+ > return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
22
+ > }
23
+ > });
24
+ > var ms = new MetadataStore({ namingConvention: namingConv });
25
+ > var em = new EntityManager( { metadataStore: ms });
26
+ **/
27
+ function NamingConvention(ncConfig) {
28
+ assertConfig(ncConfig || {})
29
+ .whereParam("name").isOptional().isString()
30
+ .whereParam("serverPropertyNameToClient").isFunction()
31
+ .whereParam("clientPropertyNameToServer").isFunction()
32
+ .applyAll(this);
33
+ if (!this.name) {
34
+ this.name = core.getUuid();
35
+ }
36
+ config._storeObject(this, "NamingConvention", this.name);
37
+ }
38
+ /**
39
+ Sets the 'defaultInstance' by creating a copy of the current 'defaultInstance' and then applying all of the properties of the current instance.
40
+ The current instance is returned unchanged.
41
+ > var namingConv = new NamingConvention({
42
+ > serverPropertyNameToClient: function(serverPropertyName) {
43
+ > return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
44
+ > },
45
+ > clientPropertyNameToServer: function(clientPropertyName) {
46
+ > return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
47
+ > }
48
+ > });
49
+ > namingConv.setAsDefault();
50
+ **/
51
+ NamingConvention.prototype.setAsDefault = function () {
52
+ return core.setAsDefault(this, NamingConvention);
53
+ };
54
+ /**
55
+
56
+
57
+ /**
58
+ A noop naming convention - This is the default unless another is specified.
59
+ **/
60
+ NamingConvention.none = new NamingConvention({
61
+ name: "noChange",
62
+ serverPropertyNameToClient: function (serverPropertyName) {
63
+ return serverPropertyName;
64
+ },
65
+ clientPropertyNameToServer: function (clientPropertyName) {
66
+ return clientPropertyName;
67
+ }
68
+ });
69
+ /**
70
+ The "camelCase" naming convention - This implementation only lowercases the first character of the server property name
71
+ but leaves the rest of the property name intact. If a more complicated version is needed then one should be created via the ctor.
72
+ **/
73
+ NamingConvention.camelCase = new NamingConvention({
74
+ name: "camelCase",
75
+ serverPropertyNameToClient: function (serverPropertyName) {
76
+ return serverPropertyName.substr(0, 1).toLowerCase() + serverPropertyName.substr(1);
77
+ },
78
+ clientPropertyNameToServer: function (clientPropertyName) {
79
+ return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
80
+ }
81
+ });
82
+ /**
83
+ The default value whenever NamingConventions are not specified.
84
+ **/
85
+ NamingConvention.defaultInstance = new NamingConvention(NamingConvention.none);
86
+ return NamingConvention;
87
+ }());
88
+ export { NamingConvention };
89
+ NamingConvention.prototype._$typeName = "NamingConvention";
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtaW5nLWNvbnZlbnRpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9icmVlemUtY2xpZW50LyIsInNvdXJjZXMiOlsic3JjL25hbWluZy1jb252ZW50aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFjbEM7Ozs7OztHQU1HO0FBQ0g7SUFVRTs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILDBCQUFZLFFBQWdDO1FBQzFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO2FBQ3ZCLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUU7YUFDMUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLENBQUMsVUFBVSxFQUFFO2FBQ3JELFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLFVBQVUsRUFBRTthQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QjtRQUNELE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBcUNEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILHVDQUFZLEdBQVo7UUFDRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQWxERDs7Ozs7T0FLRztJQUNJLHFCQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQztRQUNqQyxJQUFJLEVBQUUsVUFBVTtRQUNoQiwwQkFBMEIsRUFBRSxVQUFDLGtCQUFrQjtZQUM3QyxPQUFPLGtCQUFrQixDQUFDO1FBQzVCLENBQUM7UUFDRCwwQkFBMEIsRUFBRSxVQUFDLGtCQUFrQjtZQUM3QyxPQUFPLGtCQUFrQixDQUFDO1FBQzVCLENBQUM7S0FDRixDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSSwwQkFBUyxHQUFHLElBQUksZ0JBQWdCLENBQUM7UUFDdEMsSUFBSSxFQUFFLFdBQVc7UUFDakIsMEJBQTBCLEVBQUUsVUFBQyxrQkFBa0I7WUFDN0MsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0QsMEJBQTBCLEVBQUUsVUFBQyxrQkFBa0I7WUFDN0MsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUg7O09BRUc7SUFDSSxnQ0FBZSxHQUFHLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFtQnZFLHVCQUFDO0NBQUEsQUF6RkQsSUF5RkM7U0F6RlksZ0JBQWdCO0FBMkY3QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0Q29uZmlnIH0gZnJvbSAnLi9hc3NlcnQtcGFyYW0nO1xyXG5pbXBvcnQgeyBjb3JlIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xyXG5cclxuLy8gVE9ETzogc3Ryb25nbHkgdHlwZSBjb250ZXh0IG9iamVjdCBwYXNzZWQgdG8gbmFtaW5nIGNvbnZlbnRpb24gY29udmVydGVyIGZucy5cclxuXHJcbi8qKiBDb25maWd1cmF0aW9uIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBbW05hbWluZ0NvbnZlbnRpb25dXSBjb25zdHJ1Y3RvciAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE5hbWluZ0NvbnZlbnRpb25Db25maWcge1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIE5hbWluZ0NvbnZlbnRpb24gKi9cclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIC8qKiBGdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VydmVyIHByb3BlcnR5IG5hbWUgYWRkIGNvbnZlcnRzIGl0IGludG8gYSBjbGllbnQgc2lkZSBwcm9wZXJ0eSBuYW1lLiAgKi9cclxuICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudD86IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjbGllbnQgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIHNlcnZlciBzaWRlIHByb3BlcnR5IG5hbWUuICovXHJcbiAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI/OiAobm06IHN0cmluZywgY29udGV4dD86IGFueSkgPT4gc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuQSBOYW1pbmdDb252ZW50aW9uIGluc3RhbmNlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIHVuZGVyIHdoaWNoIGEgTWV0YWRhdGFTdG9yZVxyXG53aWxsIHRyYW5zbGF0ZSBwcm9wZXJ0eSBuYW1lcyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIHRoZSBqYXZhc2NyaXB0IGNsaWVudC5cclxuXHJcblRoZSBkZWZhdWx0IE5hbWluZ0NvbnZlbnRpb24gZG9lcyBub3QgcGVyZm9ybSBhbnkgdHJhbnNsYXRpb24sIGl0IHNpbXBseSBwYXNzZXMgcHJvcGVydHkgbmFtZXMgdGhydSB1bmNoYW5nZWQuXHJcbkBkeW5hbWljXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgTmFtaW5nQ29udmVudGlvbiB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgXyR0eXBlTmFtZTogc3RyaW5nO1xyXG4gIC8qKiBUaGUgbmFtZSBvZiB0aGlzIE5hbWluZ0NvbnZlbnRpb24uIF9fUmVhZCBPbmx5X18gKi9cclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzZXJ2ZXIgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIGNsaWVudCBzaWRlIHByb3BlcnR5IG5hbWUuICBfX1JlYWQgT25seV9fICovXHJcbiAgc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ6IChubTogc3RyaW5nLCBjb250ZXh0PzogYW55KSA9PiBzdHJpbmc7XHJcbiAgLyoqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjbGllbnQgcHJvcGVydHkgbmFtZSBhZGQgY29udmVydHMgaXQgaW50byBhIHNlcnZlciBzaWRlIHByb3BlcnR5IG5hbWUuIF9fUmVhZCBPbmx5X18gKi9cclxuICBjbGllbnRQcm9wZXJ0eU5hbWVUb1NlcnZlcjogKG5tOiBzdHJpbmcsIGNvbnRleHQ/OiBhbnkpID0+IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgTmFtaW5nQ29udmVudGlvbiBjb25zdHJ1Y3RvclxyXG4gID4gICAgICAvLyBBIG5hbWluZyBjb252ZW50aW9uIHRoYXQgY29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBldmVyeSBwcm9wZXJ0eSBuYW1lIHRvIHVwcGVyY2FzZSBvbiB0aGUgc2VydmVyXHJcbiAgPiAgICAgIC8vIGFuZCBsb3dlcmNhc2Ugb24gdGhlIGNsaWVudC5cclxuICA+ICAgICAgdmFyIG5hbWluZ0NvbnYgPSBuZXcgTmFtaW5nQ29udmVudGlvbih7XHJcbiAgPiAgICAgICAgICBzZXJ2ZXJQcm9wZXJ0eU5hbWVUb0NsaWVudDogZnVuY3Rpb24oc2VydmVyUHJvcGVydHlOYW1lKSB7XHJcbiAgPiAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlclByb3BlcnR5TmFtZS5zdWJzdHIoMCwgMSkudG9Mb3dlckNhc2UoKSArIHNlcnZlclByb3BlcnR5TmFtZS5zdWJzdHIoMSk7XHJcbiAgPiAgICAgICAgICB9LFxyXG4gID4gICAgICAgICAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI6IGZ1bmN0aW9uKGNsaWVudFByb3BlcnR5TmFtZSkge1xyXG4gID4gICAgICAgICAgICAgIHJldHVybiBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gID4gICAgICAgICAgfSAgICAgICAgICAgIFxyXG4gID4gICAgICB9KTtcclxuICA+ICAgICAgdmFyIG1zID0gbmV3IE1ldGFkYXRhU3RvcmUoeyBuYW1pbmdDb252ZW50aW9uOiBuYW1pbmdDb252IH0pO1xyXG4gID4gICAgICB2YXIgZW0gPSBuZXcgRW50aXR5TWFuYWdlciggeyBtZXRhZGF0YVN0b3JlOiBtcyB9KTtcclxuICAqKi9cclxuICBjb25zdHJ1Y3RvcihuY0NvbmZpZzogTmFtaW5nQ29udmVudGlvbkNvbmZpZyApIHtcclxuICAgIGFzc2VydENvbmZpZyhuY0NvbmZpZyB8fCB7fSlcclxuICAgICAgICAud2hlcmVQYXJhbShcIm5hbWVcIikuaXNPcHRpb25hbCgpLmlzU3RyaW5nKClcclxuICAgICAgICAud2hlcmVQYXJhbShcInNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50XCIpLmlzRnVuY3Rpb24oKVxyXG4gICAgICAgIC53aGVyZVBhcmFtKFwiY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXJcIikuaXNGdW5jdGlvbigpXHJcbiAgICAgICAgLmFwcGx5QWxsKHRoaXMpO1xyXG4gICAgaWYgKCF0aGlzLm5hbWUpIHtcclxuICAgICAgdGhpcy5uYW1lID0gY29yZS5nZXRVdWlkKCk7XHJcbiAgICB9XHJcbiAgICBjb25maWcuX3N0b3JlT2JqZWN0KHRoaXMsIFwiTmFtaW5nQ29udmVudGlvblwiLCB0aGlzLm5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcblxyXG5cclxuICAvKipcclxuICBBIG5vb3AgbmFtaW5nIGNvbnZlbnRpb24gLSBUaGlzIGlzIHRoZSBkZWZhdWx0IHVubGVzcyBhbm90aGVyIGlzIHNwZWNpZmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgbm9uZSA9IG5ldyBOYW1pbmdDb252ZW50aW9uKHtcclxuICAgIG5hbWU6IFwibm9DaGFuZ2VcIixcclxuICAgIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiAoc2VydmVyUHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWU7XHJcbiAgICB9LFxyXG4gICAgY2xpZW50UHJvcGVydHlOYW1lVG9TZXJ2ZXI6IChjbGllbnRQcm9wZXJ0eU5hbWUpID0+IHtcclxuICAgICAgcmV0dXJuIGNsaWVudFByb3BlcnR5TmFtZTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgLyoqXHJcbiAgVGhlIFwiY2FtZWxDYXNlXCIgbmFtaW5nIGNvbnZlbnRpb24gLSBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgbG93ZXJjYXNlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzZXJ2ZXIgcHJvcGVydHkgbmFtZVxyXG4gIGJ1dCBsZWF2ZXMgdGhlIHJlc3Qgb2YgdGhlIHByb3BlcnR5IG5hbWUgaW50YWN0LiAgSWYgYSBtb3JlIGNvbXBsaWNhdGVkIHZlcnNpb24gaXMgbmVlZGVkIHRoZW4gb25lIHNob3VsZCBiZSBjcmVhdGVkIHZpYSB0aGUgY3Rvci5cclxuICAqKi9cclxuICBzdGF0aWMgY2FtZWxDYXNlID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oe1xyXG4gICAgbmFtZTogXCJjYW1lbENhc2VcIixcclxuICAgIHNlcnZlclByb3BlcnR5TmFtZVRvQ2xpZW50OiAoc2VydmVyUHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gICAgfSxcclxuICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiAoY2xpZW50UHJvcGVydHlOYW1lKSA9PiB7XHJcbiAgICAgIHJldHVybiBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBjbGllbnRQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICAvKipcclxuICBUaGUgZGVmYXVsdCB2YWx1ZSB3aGVuZXZlciBOYW1pbmdDb252ZW50aW9ucyBhcmUgbm90IHNwZWNpZmllZC5cclxuICAqKi9cclxuICBzdGF0aWMgZGVmYXVsdEluc3RhbmNlID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oTmFtaW5nQ29udmVudGlvbi5ub25lKTtcclxuXHJcbiAgLyoqXHJcbiAgU2V0cyB0aGUgJ2RlZmF1bHRJbnN0YW5jZScgYnkgY3JlYXRpbmcgYSBjb3B5IG9mIHRoZSBjdXJyZW50ICdkZWZhdWx0SW5zdGFuY2UnIGFuZCB0aGVuIGFwcGx5aW5nIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBpbnN0YW5jZS5cclxuICBUaGUgY3VycmVudCBpbnN0YW5jZSBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXHJcbiAgPiAgICAgIHZhciBuYW1pbmdDb252ID0gbmV3IE5hbWluZ0NvbnZlbnRpb24oe1xyXG4gID4gICAgICAgICAgc2VydmVyUHJvcGVydHlOYW1lVG9DbGllbnQ6IGZ1bmN0aW9uKHNlcnZlclByb3BlcnR5TmFtZSkge1xyXG4gID4gICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyBzZXJ2ZXJQcm9wZXJ0eU5hbWUuc3Vic3RyKDEpO1xyXG4gID4gICAgICAgICAgfSxcclxuICA+ICAgICAgICAgIGNsaWVudFByb3BlcnR5TmFtZVRvU2VydmVyOiBmdW5jdGlvbihjbGllbnRQcm9wZXJ0eU5hbWUpIHtcclxuICA+ICAgICAgICAgICAgICByZXR1cm4gY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigwLCAxKS50b1VwcGVyQ2FzZSgpICsgY2xpZW50UHJvcGVydHlOYW1lLnN1YnN0cigxKTtcclxuICA+ICAgICAgICAgIH0gICAgICAgICAgICBcclxuICA+ICAgICAgfSk7XHJcbiAgPiAgICAgIG5hbWluZ0NvbnYuc2V0QXNEZWZhdWx0KCk7XHJcbiAgKiovXHJcbiAgc2V0QXNEZWZhdWx0KCkge1xyXG4gICAgcmV0dXJuIGNvcmUuc2V0QXNEZWZhdWx0KHRoaXMsIE5hbWluZ0NvbnZlbnRpb24pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbk5hbWluZ0NvbnZlbnRpb24ucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIk5hbWluZ0NvbnZlbnRpb25cIjtcclxuXHJcblxyXG5cclxuXHJcbiJdfQ==