@lenne.tech/ng-base 13.1.0 → 13.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/base-components/base-components.module.d.ts +12 -0
  2. package/base-components/components/checkbox/checkbox.component.d.ts +11 -0
  3. package/base-components/components/input/input.component.d.ts +14 -0
  4. package/base-components/components/select/select.component.d.ts +19 -0
  5. package/base-components/components/textarea/textarea.component.d.ts +13 -0
  6. package/base-components/lenne.tech-ng-base-base-components.d.ts +5 -0
  7. package/base-components/package.json +10 -0
  8. package/base-components/public-api.d.ts +8 -0
  9. package/base-prototype/base-prototype.module.d.ts +12 -0
  10. package/{src/lib/base/lenne.tech-ng-base-src-lib-base.d.ts → base-prototype/lenne.tech-ng-base-base-prototype.d.ts} +1 -1
  11. package/base-prototype/package.json +10 -0
  12. package/base-prototype/pages/login/login.component.d.ts +20 -0
  13. package/base-prototype/pages/register/register.component.d.ts +20 -0
  14. package/base-prototype/public-api.d.ts +6 -0
  15. package/esm2020/base-components/base-components.module.mjs +42 -0
  16. package/esm2020/base-components/components/checkbox/checkbox.component.mjs +28 -0
  17. package/esm2020/base-components/components/input/input.component.mjs +36 -0
  18. package/esm2020/base-components/components/select/select.component.mjs +37 -0
  19. package/esm2020/base-components/components/textarea/textarea.component.mjs +35 -0
  20. package/esm2020/base-components/lenne.tech-ng-base-base-components.mjs +5 -0
  21. package/esm2020/base-components/public-api.mjs +11 -0
  22. package/esm2020/base-prototype/base-prototype.module.mjs +36 -0
  23. package/esm2020/base-prototype/lenne.tech-ng-base-base-prototype.mjs +5 -0
  24. package/esm2020/base-prototype/pages/login/login.component.mjs +39 -0
  25. package/esm2020/base-prototype/pages/register/register.component.mjs +45 -0
  26. package/esm2020/base-prototype/public-api.mjs +9 -0
  27. package/esm2020/lenne.tech-ng-base.mjs +1 -1
  28. package/esm2020/public-api.mjs +68 -3
  29. package/esm2020/src/base.module.mjs +101 -0
  30. package/esm2020/src/classes/basic-user.class.mjs +51 -0
  31. package/esm2020/src/classes/graphql-enum.class.mjs +9 -0
  32. package/esm2020/src/classes/graphql-meta.class.mjs +171 -0
  33. package/esm2020/src/classes/graphql-type.class.mjs +13 -0
  34. package/esm2020/src/classes/helper.class.mjs +304 -0
  35. package/esm2020/src/classes/standard.class.mjs +40 -0
  36. package/esm2020/src/decorators/debounce.decorator.mjs +12 -0
  37. package/esm2020/src/directives/context-menu.directive.mjs +109 -0
  38. package/esm2020/src/directives/lazy-load.directive.mjs +45 -0
  39. package/esm2020/src/directives/match-height.directive.mjs +79 -0
  40. package/esm2020/src/directives/resizable.directive.mjs +90 -0
  41. package/esm2020/src/enums/comparison-operator.enum.mjs +16 -0
  42. package/esm2020/src/enums/graphql-request-type.enum.mjs +10 -0
  43. package/esm2020/src/enums/logical-operator.enum.mjs +10 -0
  44. package/esm2020/src/enums/sort-order.enum.mjs +6 -0
  45. package/esm2020/src/factories/apollo-options.factory.mjs +61 -0
  46. package/esm2020/src/guards/auth.guard.mjs +61 -0
  47. package/esm2020/src/guards/can-deactivate.guard.mjs +16 -0
  48. package/esm2020/src/guards/logout.guard.mjs +32 -0
  49. package/esm2020/src/interfaces/base-module-config.interface.mjs +3 -0
  50. package/esm2020/src/interfaces/can-component-deactivate.interface.mjs +2 -0
  51. package/esm2020/src/interfaces/combined-filter-input.interface.mjs +2 -0
  52. package/esm2020/src/interfaces/field-object.interface.mjs +2 -0
  53. package/esm2020/src/interfaces/field.interface.mjs +2 -0
  54. package/esm2020/src/interfaces/filter-input.interface.mjs +2 -0
  55. package/esm2020/src/interfaces/find-args.interface.mjs +2 -0
  56. package/esm2020/src/interfaces/graphql-fields-object.interface.mjs +2 -0
  57. package/esm2020/src/interfaces/graphql-options.interface.mjs +2 -0
  58. package/esm2020/src/interfaces/graphql-plus-options.interfacen.mjs +2 -0
  59. package/esm2020/src/interfaces/graphql-type-collection.interface.mjs +2 -0
  60. package/esm2020/src/interfaces/single-filter-input.interface.mjs +2 -0
  61. package/esm2020/src/interfaces/sort-input.interface.mjs +2 -0
  62. package/esm2020/src/pipes/date-ago.pipe.mjs +65 -0
  63. package/esm2020/src/pipes/ellipses.pipe.mjs +22 -0
  64. package/esm2020/src/pipes/safe-html.pipe.mjs +21 -0
  65. package/esm2020/src/services/auth.service.mjs +71 -0
  66. package/esm2020/src/services/forms.service.mjs +26 -0
  67. package/esm2020/src/services/fullscreen.service.mjs +51 -0
  68. package/esm2020/src/services/graphql-meta.service.mjs +123 -0
  69. package/esm2020/src/services/graphql-plus.service.mjs +84 -0
  70. package/esm2020/src/services/graphql.service.mjs +441 -0
  71. package/esm2020/src/services/image.service.mjs +102 -0
  72. package/esm2020/src/services/loader.service.mjs +29 -0
  73. package/esm2020/src/services/scroll.service.mjs +179 -0
  74. package/esm2020/src/services/seo.service.mjs +97 -0
  75. package/esm2020/src/services/storage.service.mjs +132 -0
  76. package/esm2020/src/services/theme.service.mjs +43 -0
  77. package/esm2020/src/services/ws.service.mjs +17 -0
  78. package/esm2020/src/types/graphql-fields.type.mjs +2 -0
  79. package/esm2020/src/types/storage.type.mjs +2 -0
  80. package/esm2020/src/validators/must-match.validator.mjs +22 -0
  81. package/fesm2015/lenne.tech-ng-base-base-components.mjs +173 -0
  82. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -0
  83. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +122 -0
  84. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
  85. package/fesm2015/lenne.tech-ng-base.mjs +225 -77
  86. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
  87. package/fesm2020/lenne.tech-ng-base-base-components.mjs +171 -0
  88. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -0
  89. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +120 -0
  90. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
  91. package/fesm2020/lenne.tech-ng-base.mjs +225 -77
  92. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
  93. package/package.json +24 -15
  94. package/public-api.d.ts +55 -1
  95. package/{lib/base → src}/base.module.d.ts +2 -1
  96. package/{lib/base → src}/classes/basic-user.class.d.ts +0 -0
  97. package/{lib/base → src}/classes/graphql-enum.class.d.ts +0 -0
  98. package/{lib/base → src}/classes/graphql-meta.class.d.ts +0 -0
  99. package/{lib/base → src}/classes/graphql-type.class.d.ts +0 -0
  100. package/{lib/base → src}/classes/helper.class.d.ts +1 -0
  101. package/{lib/base → src}/classes/standard.class.d.ts +0 -0
  102. package/src/decorators/debounce.decorator.d.ts +1 -0
  103. package/{lib/base → src}/directives/context-menu.directive.d.ts +0 -0
  104. package/{lib/base → src}/directives/lazy-load.directive.d.ts +0 -0
  105. package/{lib/base → src}/directives/match-height.directive.d.ts +0 -0
  106. package/{lib/base → src}/directives/resizable.directive.d.ts +0 -0
  107. package/{lib/base → src}/enums/comparison-operator.enum.d.ts +0 -0
  108. package/{lib/base → src}/enums/graphql-request-type.enum.d.ts +0 -0
  109. package/{lib/base → src}/enums/logical-operator.enum.d.ts +0 -0
  110. package/{lib/base → src}/enums/sort-order.enum.d.ts +0 -0
  111. package/{lib/base → src}/factories/apollo-options.factory.d.ts +0 -0
  112. package/{lib/base → src}/guards/auth.guard.d.ts +0 -0
  113. package/{lib/base → src}/guards/can-deactivate.guard.d.ts +0 -0
  114. package/{lib/base → src}/guards/logout.guard.d.ts +0 -0
  115. package/{lib/base → src}/interfaces/base-module-config.interface.d.ts +0 -0
  116. package/{lib/base → src}/interfaces/can-component-deactivate.interface.d.ts +0 -0
  117. package/{lib/base → src}/interfaces/combined-filter-input.interface.d.ts +0 -0
  118. package/{lib/base → src}/interfaces/field-object.interface.d.ts +0 -0
  119. package/{lib/base → src}/interfaces/field.interface.d.ts +0 -0
  120. package/{lib/base → src}/interfaces/filter-input.interface.d.ts +0 -0
  121. package/{lib/base → src}/interfaces/find-args.interface.d.ts +0 -0
  122. package/src/interfaces/graphql-fields-object.interface.d.ts +6 -0
  123. package/{lib/base → src}/interfaces/graphql-options.interface.d.ts +0 -0
  124. package/{lib/base → src}/interfaces/graphql-plus-options.interfacen.d.ts +0 -0
  125. package/{lib/base → src}/interfaces/graphql-type-collection.interface.d.ts +0 -0
  126. package/{lib/base → src}/interfaces/single-filter-input.interface.d.ts +0 -0
  127. package/{lib/base → src}/interfaces/sort-input.interface.d.ts +0 -0
  128. package/src/pipes/date-ago.pipe.d.ts +34 -0
  129. package/{lib/base → src}/pipes/ellipses.pipe.d.ts +0 -0
  130. package/{lib/base → src}/pipes/safe-html.pipe.d.ts +0 -0
  131. package/{lib/base → src}/services/auth.service.d.ts +0 -0
  132. package/src/services/forms.service.d.ts +8 -0
  133. package/{lib/base → src}/services/fullscreen.service.d.ts +0 -0
  134. package/{lib/base → src}/services/graphql-meta.service.d.ts +0 -0
  135. package/{lib/base → src}/services/graphql-plus.service.d.ts +0 -0
  136. package/{lib/base → src}/services/graphql.service.d.ts +0 -0
  137. package/{lib/base → src}/services/image.service.d.ts +0 -0
  138. package/{lib/base → src}/services/loader.service.d.ts +0 -0
  139. package/{lib/base → src}/services/scroll.service.d.ts +0 -0
  140. package/{lib/base → src}/services/seo.service.d.ts +0 -0
  141. package/{lib/base → src}/services/storage.service.d.ts +0 -0
  142. package/src/services/theme.service.d.ts +17 -0
  143. package/{lib/base → src}/services/ws.service.d.ts +0 -0
  144. package/src/types/graphql-fields.type.d.ts +5 -0
  145. package/{lib/base → src}/types/storage.type.d.ts +0 -0
  146. package/{lib/base → src}/validators/must-match.validator.d.ts +2 -2
  147. package/esm2020/lib/base/base.module.mjs +0 -97
  148. package/esm2020/lib/base/classes/basic-user.class.mjs +0 -51
  149. package/esm2020/lib/base/classes/graphql-enum.class.mjs +0 -9
  150. package/esm2020/lib/base/classes/graphql-meta.class.mjs +0 -171
  151. package/esm2020/lib/base/classes/graphql-type.class.mjs +0 -13
  152. package/esm2020/lib/base/classes/helper.class.mjs +0 -295
  153. package/esm2020/lib/base/classes/standard.class.mjs +0 -40
  154. package/esm2020/lib/base/directives/context-menu.directive.mjs +0 -109
  155. package/esm2020/lib/base/directives/lazy-load.directive.mjs +0 -45
  156. package/esm2020/lib/base/directives/match-height.directive.mjs +0 -79
  157. package/esm2020/lib/base/directives/resizable.directive.mjs +0 -90
  158. package/esm2020/lib/base/enums/comparison-operator.enum.mjs +0 -16
  159. package/esm2020/lib/base/enums/graphql-request-type.enum.mjs +0 -10
  160. package/esm2020/lib/base/enums/logical-operator.enum.mjs +0 -10
  161. package/esm2020/lib/base/enums/sort-order.enum.mjs +0 -6
  162. package/esm2020/lib/base/factories/apollo-options.factory.mjs +0 -61
  163. package/esm2020/lib/base/guards/auth.guard.mjs +0 -61
  164. package/esm2020/lib/base/guards/can-deactivate.guard.mjs +0 -16
  165. package/esm2020/lib/base/guards/logout.guard.mjs +0 -32
  166. package/esm2020/lib/base/index.mjs +0 -2
  167. package/esm2020/lib/base/interfaces/base-module-config.interface.mjs +0 -3
  168. package/esm2020/lib/base/interfaces/can-component-deactivate.interface.mjs +0 -2
  169. package/esm2020/lib/base/interfaces/combined-filter-input.interface.mjs +0 -2
  170. package/esm2020/lib/base/interfaces/field-object.interface.mjs +0 -2
  171. package/esm2020/lib/base/interfaces/field.interface.mjs +0 -2
  172. package/esm2020/lib/base/interfaces/filter-input.interface.mjs +0 -2
  173. package/esm2020/lib/base/interfaces/find-args.interface.mjs +0 -2
  174. package/esm2020/lib/base/interfaces/graphql-options.interface.mjs +0 -2
  175. package/esm2020/lib/base/interfaces/graphql-plus-options.interfacen.mjs +0 -2
  176. package/esm2020/lib/base/interfaces/graphql-type-collection.interface.mjs +0 -2
  177. package/esm2020/lib/base/interfaces/single-filter-input.interface.mjs +0 -2
  178. package/esm2020/lib/base/interfaces/sort-input.interface.mjs +0 -2
  179. package/esm2020/lib/base/pipes/ellipses.pipe.mjs +0 -22
  180. package/esm2020/lib/base/pipes/safe-html.pipe.mjs +0 -21
  181. package/esm2020/lib/base/public-api.mjs +0 -61
  182. package/esm2020/lib/base/services/auth.service.mjs +0 -71
  183. package/esm2020/lib/base/services/fullscreen.service.mjs +0 -51
  184. package/esm2020/lib/base/services/graphql-meta.service.mjs +0 -123
  185. package/esm2020/lib/base/services/graphql-plus.service.mjs +0 -84
  186. package/esm2020/lib/base/services/graphql.service.mjs +0 -441
  187. package/esm2020/lib/base/services/image.service.mjs +0 -102
  188. package/esm2020/lib/base/services/loader.service.mjs +0 -29
  189. package/esm2020/lib/base/services/scroll.service.mjs +0 -179
  190. package/esm2020/lib/base/services/seo.service.mjs +0 -97
  191. package/esm2020/lib/base/services/storage.service.mjs +0 -132
  192. package/esm2020/lib/base/services/ws.service.mjs +0 -17
  193. package/esm2020/lib/base/types/storage.type.mjs +0 -2
  194. package/esm2020/lib/base/validators/must-match.validator.mjs +0 -22
  195. package/esm2020/src/lib/base/base.module.mjs +0 -97
  196. package/esm2020/src/lib/base/classes/basic-user.class.mjs +0 -51
  197. package/esm2020/src/lib/base/classes/graphql-enum.class.mjs +0 -9
  198. package/esm2020/src/lib/base/classes/graphql-meta.class.mjs +0 -171
  199. package/esm2020/src/lib/base/classes/graphql-type.class.mjs +0 -13
  200. package/esm2020/src/lib/base/classes/helper.class.mjs +0 -295
  201. package/esm2020/src/lib/base/classes/standard.class.mjs +0 -40
  202. package/esm2020/src/lib/base/directives/context-menu.directive.mjs +0 -109
  203. package/esm2020/src/lib/base/directives/lazy-load.directive.mjs +0 -45
  204. package/esm2020/src/lib/base/directives/match-height.directive.mjs +0 -79
  205. package/esm2020/src/lib/base/directives/resizable.directive.mjs +0 -90
  206. package/esm2020/src/lib/base/enums/comparison-operator.enum.mjs +0 -16
  207. package/esm2020/src/lib/base/enums/graphql-request-type.enum.mjs +0 -10
  208. package/esm2020/src/lib/base/enums/logical-operator.enum.mjs +0 -10
  209. package/esm2020/src/lib/base/enums/sort-order.enum.mjs +0 -6
  210. package/esm2020/src/lib/base/factories/apollo-options.factory.mjs +0 -61
  211. package/esm2020/src/lib/base/guards/auth.guard.mjs +0 -61
  212. package/esm2020/src/lib/base/guards/can-deactivate.guard.mjs +0 -16
  213. package/esm2020/src/lib/base/guards/logout.guard.mjs +0 -32
  214. package/esm2020/src/lib/base/interfaces/base-module-config.interface.mjs +0 -3
  215. package/esm2020/src/lib/base/interfaces/can-component-deactivate.interface.mjs +0 -2
  216. package/esm2020/src/lib/base/interfaces/combined-filter-input.interface.mjs +0 -2
  217. package/esm2020/src/lib/base/interfaces/field-object.interface.mjs +0 -2
  218. package/esm2020/src/lib/base/interfaces/field.interface.mjs +0 -2
  219. package/esm2020/src/lib/base/interfaces/filter-input.interface.mjs +0 -2
  220. package/esm2020/src/lib/base/interfaces/find-args.interface.mjs +0 -2
  221. package/esm2020/src/lib/base/interfaces/graphql-options.interface.mjs +0 -2
  222. package/esm2020/src/lib/base/interfaces/graphql-plus-options.interfacen.mjs +0 -2
  223. package/esm2020/src/lib/base/interfaces/graphql-type-collection.interface.mjs +0 -2
  224. package/esm2020/src/lib/base/interfaces/single-filter-input.interface.mjs +0 -2
  225. package/esm2020/src/lib/base/interfaces/sort-input.interface.mjs +0 -2
  226. package/esm2020/src/lib/base/lenne.tech-ng-base-src-lib-base.mjs +0 -5
  227. package/esm2020/src/lib/base/pipes/ellipses.pipe.mjs +0 -22
  228. package/esm2020/src/lib/base/pipes/safe-html.pipe.mjs +0 -21
  229. package/esm2020/src/lib/base/public-api.mjs +0 -61
  230. package/esm2020/src/lib/base/services/auth.service.mjs +0 -71
  231. package/esm2020/src/lib/base/services/fullscreen.service.mjs +0 -51
  232. package/esm2020/src/lib/base/services/graphql-meta.service.mjs +0 -123
  233. package/esm2020/src/lib/base/services/graphql-plus.service.mjs +0 -84
  234. package/esm2020/src/lib/base/services/graphql.service.mjs +0 -441
  235. package/esm2020/src/lib/base/services/image.service.mjs +0 -102
  236. package/esm2020/src/lib/base/services/loader.service.mjs +0 -29
  237. package/esm2020/src/lib/base/services/scroll.service.mjs +0 -179
  238. package/esm2020/src/lib/base/services/seo.service.mjs +0 -97
  239. package/esm2020/src/lib/base/services/storage.service.mjs +0 -132
  240. package/esm2020/src/lib/base/services/ws.service.mjs +0 -17
  241. package/esm2020/src/lib/base/types/storage.type.mjs +0 -2
  242. package/esm2020/src/lib/base/validators/must-match.validator.mjs +0 -22
  243. package/fesm2015/lenne.tech-ng-base-src-lib-base.mjs +0 -2470
  244. package/fesm2015/lenne.tech-ng-base-src-lib-base.mjs.map +0 -1
  245. package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs +0 -2524
  246. package/fesm2020/lenne.tech-ng-base-src-lib-base.mjs.map +0 -1
  247. package/lib/base/index.d.ts +0 -1
  248. package/lib/base/public-api.d.ts +0 -49
  249. package/src/lib/base/base.module.d.ts +0 -21
  250. package/src/lib/base/classes/basic-user.class.d.ts +0 -26
  251. package/src/lib/base/classes/graphql-enum.class.d.ts +0 -7
  252. package/src/lib/base/classes/graphql-meta.class.d.ts +0 -46
  253. package/src/lib/base/classes/graphql-type.class.d.ts +0 -9
  254. package/src/lib/base/classes/helper.class.d.ts +0 -98
  255. package/src/lib/base/classes/standard.class.d.ts +0 -32
  256. package/src/lib/base/directives/context-menu.directive.d.ts +0 -22
  257. package/src/lib/base/directives/lazy-load.directive.d.ts +0 -17
  258. package/src/lib/base/directives/match-height.directive.d.ts +0 -19
  259. package/src/lib/base/directives/resizable.directive.d.ts +0 -26
  260. package/src/lib/base/enums/comparison-operator.enum.d.ts +0 -14
  261. package/src/lib/base/enums/graphql-request-type.enum.d.ts +0 -8
  262. package/src/lib/base/enums/logical-operator.enum.d.ts +0 -8
  263. package/src/lib/base/enums/sort-order.enum.d.ts +0 -4
  264. package/src/lib/base/factories/apollo-options.factory.d.ts +0 -18
  265. package/src/lib/base/guards/auth.guard.d.ts +0 -27
  266. package/src/lib/base/guards/can-deactivate.guard.d.ts +0 -11
  267. package/src/lib/base/guards/logout.guard.d.ts +0 -16
  268. package/src/lib/base/interfaces/base-module-config.interface.d.ts +0 -57
  269. package/src/lib/base/interfaces/can-component-deactivate.interface.d.ts +0 -7
  270. package/src/lib/base/interfaces/combined-filter-input.interface.d.ts +0 -9
  271. package/src/lib/base/interfaces/field-object.interface.d.ts +0 -6
  272. package/src/lib/base/interfaces/field.interface.d.ts +0 -5
  273. package/src/lib/base/interfaces/filter-input.interface.d.ts +0 -9
  274. package/src/lib/base/interfaces/find-args.interface.d.ts +0 -10
  275. package/src/lib/base/interfaces/graphql-options.interface.d.ts +0 -11
  276. package/src/lib/base/interfaces/graphql-plus-options.interfacen.d.ts +0 -9
  277. package/src/lib/base/interfaces/graphql-type-collection.interface.d.ts +0 -7
  278. package/src/lib/base/interfaces/single-filter-input.interface.d.ts +0 -11
  279. package/src/lib/base/interfaces/sort-input.interface.d.ts +0 -5
  280. package/src/lib/base/package.json +0 -10
  281. package/src/lib/base/pipes/ellipses.pipe.d.ts +0 -10
  282. package/src/lib/base/pipes/safe-html.pipe.d.ts +0 -13
  283. package/src/lib/base/public-api.d.ts +0 -49
  284. package/src/lib/base/services/auth.service.d.ts +0 -32
  285. package/src/lib/base/services/fullscreen.service.d.ts +0 -18
  286. package/src/lib/base/services/graphql-meta.service.d.ts +0 -45
  287. package/src/lib/base/services/graphql-plus.service.d.ts +0 -25
  288. package/src/lib/base/services/graphql.service.d.ts +0 -56
  289. package/src/lib/base/services/image.service.d.ts +0 -27
  290. package/src/lib/base/services/loader.service.d.ts +0 -13
  291. package/src/lib/base/services/scroll.service.d.ts +0 -85
  292. package/src/lib/base/services/seo.service.d.ts +0 -49
  293. package/src/lib/base/services/storage.service.d.ts +0 -48
  294. package/src/lib/base/services/ws.service.d.ts +0 -8
  295. package/src/lib/base/types/storage.type.d.ts +0 -4
  296. package/src/lib/base/validators/must-match.validator.d.ts +0 -6
@@ -0,0 +1,441 @@
1
+ import { gql } from 'apollo-angular';
2
+ import { Injectable } from '@angular/core';
3
+ import { GraphQLRequestType } from '../enums/graphql-request-type.enum';
4
+ import { Observable, throwError } from 'rxjs';
5
+ import { GraphQLEnum } from '../classes/graphql-enum.class';
6
+ import { GraphQLType } from '../classes/graphql-type.class';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "apollo-angular";
9
+ import * as i2 from "./graphql-meta.service";
10
+ /**
11
+ * GraphQL service
12
+ */
13
+ export class GraphQLService {
14
+ /**
15
+ * Include services
16
+ */
17
+ constructor(apollo, graphQLMetaService) {
18
+ this.apollo = apollo;
19
+ this.graphQLMetaService = graphQLMetaService;
20
+ }
21
+ /**
22
+ * GraphQL request
23
+ */
24
+ graphQl(graphql, options = {}) {
25
+ // Check arguments
26
+ if (!graphql) {
27
+ throwError('Missing graphql argument');
28
+ }
29
+ // Get config
30
+ const config = {
31
+ arguments: null,
32
+ fields: null,
33
+ log: false,
34
+ model: null,
35
+ type: GraphQLRequestType.QUERY,
36
+ ...options,
37
+ };
38
+ // Convert class to Object for arguments
39
+ if (typeof config.arguments === 'function') {
40
+ config.arguments = new config.arguments();
41
+ }
42
+ // Convert class to Object for fields
43
+ if (typeof config.fields === 'function') {
44
+ config.fields = new config.fields();
45
+ }
46
+ // Log
47
+ if (config.log) {
48
+ console.log({ config });
49
+ }
50
+ // Send request
51
+ return new Observable((subscriber) => {
52
+ // Get meta
53
+ this.graphQLMetaService.getMeta({ log: config.log }).subscribe((meta) => {
54
+ // Prepare fields
55
+ let fields;
56
+ let allowedFields;
57
+ // Log meta
58
+ if (config.log) {
59
+ console.log({ meta });
60
+ }
61
+ if (config.fields) {
62
+ allowedFields = meta.getFields(graphql, { type: config.type });
63
+ // Log meta
64
+ if (config.log) {
65
+ console.log({ allowedFields });
66
+ }
67
+ const fieldsData = this.prepareFields(config.fields, {
68
+ allowed: allowedFields,
69
+ });
70
+ // Log fields data
71
+ if (config.log) {
72
+ fieldsData.usedFields.sort();
73
+ fieldsData.schemaFields.sort();
74
+ const filtered = fieldsData.schemaFields.filter((field) => !fieldsData.usedFields.includes(field));
75
+ const unused = this.graphQLTypeCollectionToStringArray(allowedFields).filter((field) => !fieldsData.usedFields.includes(field));
76
+ console.log({ fieldsData, filtered, unused });
77
+ }
78
+ fields = fieldsData.fieldsString;
79
+ }
80
+ if (fields && !fields.startsWith('{')) {
81
+ fields = '{' + fields + '\n}';
82
+ }
83
+ // Log fields
84
+ if (config.log) {
85
+ console.log({ fields });
86
+ }
87
+ // Get allowed args
88
+ const allowedArgs = meta.getArgs(graphql, { type: config.type });
89
+ // Log allowed args
90
+ if (config.log) {
91
+ console.log({ allowedArgs });
92
+ }
93
+ const argsData = this.prepareArguments(config.arguments, {
94
+ allowed: allowedArgs,
95
+ });
96
+ // Log args data
97
+ if (config.log) {
98
+ argsData.usedArgs.sort();
99
+ argsData.schemaArgs.sort();
100
+ const filtered = argsData.schemaArgs.filter((field) => !argsData.usedArgs.includes(field));
101
+ const unused = this.graphQLTypeCollectionToStringArray(allowedArgs)
102
+ .sort()
103
+ .filter((field) => !argsData.usedArgs.includes(field));
104
+ console.log({ argsData, filtered, unused });
105
+ }
106
+ const args = argsData?.argsString || '';
107
+ // Log
108
+ if (config.log) {
109
+ console.log({ graphQL: graphql, args, fields, type: config.type });
110
+ }
111
+ // Prepare request
112
+ const documentNode = fields
113
+ ? gql(config.type + '{\n' + graphql + args + fields + '\n}')
114
+ : gql(config.type + '{\n' + graphql + args + '\n}');
115
+ // Log
116
+ if (config.log) {
117
+ console.log({ documentNode });
118
+ }
119
+ const request = {};
120
+ request[config.type] = documentNode;
121
+ // Log
122
+ if (config.log) {
123
+ console.log({ request });
124
+ }
125
+ let func;
126
+ if (config.type === GraphQLRequestType.MUTATION) {
127
+ func = 'mutate';
128
+ request[config.type] = documentNode;
129
+ }
130
+ else if (config.type === GraphQLRequestType.SUBSCRIPTION) {
131
+ func = 'subscribe';
132
+ request.query = documentNode;
133
+ }
134
+ else {
135
+ func = config.type;
136
+ request[config.type] = documentNode;
137
+ }
138
+ this.apollo[func](request).subscribe((result) => {
139
+ const data = result?.data?.[graphql] !== undefined ? result.data[graphql] : result;
140
+ // Direct data
141
+ if (!config.model) {
142
+ subscriber.next(data);
143
+ }
144
+ // Map data as array
145
+ else if (Array.isArray(data)) {
146
+ subscriber.next(data.map((item) => {
147
+ return config.model.map(item);
148
+ }));
149
+ }
150
+ // Map data
151
+ else {
152
+ subscriber.next(config.model.map(data));
153
+ }
154
+ if (config.type !== GraphQLRequestType.SUBSCRIPTION) {
155
+ // Done
156
+ subscriber.complete();
157
+ }
158
+ }, (error) => {
159
+ subscriber.error(error);
160
+ subscriber.complete();
161
+ });
162
+ });
163
+ });
164
+ }
165
+ /**
166
+ * Get fields / args from IGraphQLTypeCollection
167
+ */
168
+ graphQLTypeCollectionToStringArray(collection, current = '', result = [], cacheNode = []) {
169
+ if (collection) {
170
+ if (collection instanceof GraphQLType) {
171
+ result.push(current);
172
+ }
173
+ else {
174
+ if (current?.includes('.')) {
175
+ cacheNode.push(current.split('.')[1]);
176
+ }
177
+ else if (current) {
178
+ cacheNode.push(current);
179
+ }
180
+ for (const key of Object.keys(collection)) {
181
+ if (current === key || cacheNode.includes(key)) {
182
+ continue;
183
+ }
184
+ this.graphQLTypeCollectionToStringArray(collection[key], current ? current + '.' + key : key, result, cacheNode);
185
+ }
186
+ }
187
+ }
188
+ return result;
189
+ }
190
+ /**
191
+ * Prepare arguments for GraphQL request
192
+ */
193
+ prepareArguments(args, options = {}) {
194
+ // Init config variables
195
+ const { allowed, level, parent, schemaArgs, usedArgs } = {
196
+ allowed: null,
197
+ level: 1,
198
+ parent: '',
199
+ schemaArgs: [],
200
+ usedArgs: [],
201
+ ...options,
202
+ };
203
+ // Check args
204
+ if (args === undefined || args === null) {
205
+ return { argsString: '', schemaArgs, usedArgs };
206
+ }
207
+ // Init args
208
+ const result = [];
209
+ // Process array
210
+ if (Array.isArray(args)) {
211
+ const allowedKeys = allowed ? Object.keys(allowed) : null;
212
+ for (const item of args) {
213
+ let key = null;
214
+ if (allowed) {
215
+ if (allowed.length < 1) {
216
+ break;
217
+ }
218
+ key = allowedKeys?.shift();
219
+ }
220
+ // Process value
221
+ result.push(this.prepareArguments(item, {
222
+ allowed: key ? allowed[key] : null,
223
+ level: level + 1,
224
+ parent: parent + key + '.',
225
+ schemaArgs,
226
+ usedArgs,
227
+ }).argsString);
228
+ }
229
+ // Encapsulation of the array result
230
+ if (result.length) {
231
+ // Complete result, encapsulated via round brackets
232
+ if (level === 1) {
233
+ return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs };
234
+ }
235
+ // Deeper result part, encapsulated via square brackets
236
+ else {
237
+ return { argsString: '[' + result.join(', ') + ']', schemaArgs, usedArgs };
238
+ }
239
+ }
240
+ }
241
+ // Process object
242
+ else if (typeof args === 'object') {
243
+ // Check object is empty
244
+ if (args && Object.keys(args).length === 0 && Object.getPrototypeOf(args) === Object.prototype) {
245
+ return { argsString: '{}', schemaArgs, usedArgs };
246
+ }
247
+ // Process all object entries
248
+ for (const [key, value] of Object.entries(args)) {
249
+ // Init data for current entry
250
+ const currentKey = parent + key;
251
+ schemaArgs.push(currentKey);
252
+ // If the allowed key handling is enabled and the current key is not included in the list of allowed keys,
253
+ // the current key will be skipped
254
+ if (allowed && !allowed[key]) {
255
+ continue;
256
+ }
257
+ // Skip value if not exists
258
+ if (value === undefined || value === null) {
259
+ continue;
260
+ }
261
+ // Add current key to metadata
262
+ usedArgs.push(currentKey);
263
+ // Process GraphQLEnum
264
+ if (value instanceof GraphQLEnum) {
265
+ result.push(key + ':' + value.value);
266
+ continue;
267
+ }
268
+ // Process array
269
+ else if (Array.isArray(value)) {
270
+ result.push(key +
271
+ ': [' +
272
+ value.map((item) => this.prepareArguments(item, {
273
+ allowed: allowed[key],
274
+ level: level + 1,
275
+ parent: currentKey + '.',
276
+ schemaArgs,
277
+ usedArgs,
278
+ }).argsString) +
279
+ ']');
280
+ continue;
281
+ }
282
+ // Prepare additional result string
283
+ let additionalResult = key + ': ';
284
+ // Value is a date object
285
+ if (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]') {
286
+ additionalResult += `"""${value.toString()}"""`;
287
+ }
288
+ // Value is a string
289
+ else if (typeof value === 'string') {
290
+ // Enum (doesn't need quotation marks)
291
+ if (allowed[key].isEnum) {
292
+ additionalResult += value;
293
+ }
294
+ // String
295
+ else {
296
+ additionalResult += `"""${value.replace(/"/g, '\\"')}"""`;
297
+ }
298
+ }
299
+ // Value is a simple boolean or a number
300
+ else if (typeof value === 'boolean' || typeof value === 'number') {
301
+ additionalResult += value;
302
+ }
303
+ // Others
304
+ else {
305
+ additionalResult += this.prepareArguments(value, {
306
+ allowed: allowed[key],
307
+ level: level + 1,
308
+ parent: currentKey + '.',
309
+ schemaArgs,
310
+ usedArgs,
311
+ }).argsString;
312
+ }
313
+ // Push deeper part into result array
314
+ result.push(additionalResult);
315
+ }
316
+ // Encapsulation of the object result
317
+ if (result.length) {
318
+ // Complete result, encapsulated via round brackets
319
+ if (level === 1) {
320
+ return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs };
321
+ }
322
+ // Deeper result part, encapsulated via curly brackets
323
+ else {
324
+ return { argsString: '{' + result.join(', ') + '}', schemaArgs, usedArgs };
325
+ }
326
+ }
327
+ }
328
+ // Prepare and process other / unknown values as JSON
329
+ else {
330
+ return { argsString: JSON.stringify(args), schemaArgs, usedArgs };
331
+ }
332
+ }
333
+ /**
334
+ * Prepare fields for GraphQL request
335
+ */
336
+ prepareFields(fields, options = {}) {
337
+ // Config
338
+ const { allowed, parent, schemaFields, spaces, tab, usedFields } = {
339
+ allowed: null,
340
+ parent: '',
341
+ schemaFields: [],
342
+ spaces: 2,
343
+ tab: 1,
344
+ usedFields: [],
345
+ ...options,
346
+ };
347
+ // Init fields string
348
+ let fieldsString = '';
349
+ // Check fields
350
+ if (!fields) {
351
+ return { fieldsString, schemaFields, usedFields };
352
+ }
353
+ // Process string
354
+ if (typeof fields === 'string') {
355
+ if (allowed &&
356
+ ((typeof allowed === 'string' && allowed !== fields) || (typeof allowed === 'object' && !allowed[fields]))) {
357
+ return { fieldsString, schemaFields, usedFields };
358
+ }
359
+ return { fieldsString: '\n' + ' '.repeat(spaces).repeat(tab) + fields, schemaFields, usedFields };
360
+ }
361
+ // Process array
362
+ else if (Array.isArray(fields)) {
363
+ for (const item of fields) {
364
+ if (typeof item === 'object') {
365
+ fieldsString =
366
+ fieldsString +
367
+ this.prepareFields(item, {
368
+ allowed,
369
+ parent,
370
+ spaces,
371
+ schemaFields,
372
+ tab: tab + 1,
373
+ usedFields,
374
+ }).fieldsString;
375
+ continue;
376
+ }
377
+ const currentPath = parent + item;
378
+ schemaFields.push(currentPath);
379
+ if (allowed && !allowed?.[item]) {
380
+ continue;
381
+ }
382
+ usedFields.push(currentPath);
383
+ fieldsString =
384
+ fieldsString +
385
+ this.prepareFields(item, {
386
+ allowed: typeof allowed?.[item] === 'object' && !(allowed?.[item] instanceof GraphQLType) ? allowed?.[item] : item,
387
+ parent: currentPath + '.',
388
+ spaces,
389
+ schemaFields,
390
+ tab: tab + 1,
391
+ usedFields,
392
+ }).fieldsString;
393
+ }
394
+ }
395
+ // Process object
396
+ else if (typeof fields === 'object') {
397
+ for (const [key, val] of Object.entries(fields)) {
398
+ const currentPath = parent + key;
399
+ schemaFields.push(currentPath);
400
+ if (allowed && !allowed[key]) {
401
+ continue;
402
+ }
403
+ usedFields.push(currentPath);
404
+ if (typeof val !== 'object' || !Object.keys(val).length) {
405
+ fieldsString = fieldsString + '\n' + ' '.repeat(spaces).repeat(tab) + key;
406
+ }
407
+ else {
408
+ fieldsString =
409
+ fieldsString +
410
+ '\n' +
411
+ ' '.repeat(spaces).repeat(tab) +
412
+ key +
413
+ ' ' +
414
+ '{' +
415
+ this.prepareFields(val, {
416
+ allowed: typeof allowed?.[key] === 'object' && !(allowed?.[key] instanceof GraphQLType) ? allowed?.[key] : key,
417
+ parent: currentPath + '.',
418
+ spaces,
419
+ schemaFields,
420
+ tab: tab + 1,
421
+ usedFields,
422
+ }).fieldsString +
423
+ '\n' +
424
+ ' '.repeat(spaces).repeat(tab) +
425
+ '}';
426
+ }
427
+ }
428
+ }
429
+ // Return result
430
+ return { fieldsString, schemaFields, usedFields };
431
+ }
432
+ }
433
+ GraphQLService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: GraphQLService, deps: [{ token: i1.Apollo }, { token: i2.GraphQLMetaService }], target: i0.ɵɵFactoryTarget.Injectable });
434
+ GraphQLService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: GraphQLService, providedIn: 'root' });
435
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: GraphQLService, decorators: [{
436
+ type: Injectable,
437
+ args: [{
438
+ providedIn: 'root',
439
+ }]
440
+ }], ctorParameters: function () { return [{ type: i1.Apollo }, { type: i2.GraphQLMetaService }]; } });
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zcmMvc2VydmljZXMvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUFHNUQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sY0FBYztJQUN6Qjs7T0FFRztJQUNILFlBQXNCLE1BQWMsRUFBWSxrQkFBc0M7UUFBaEUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFZLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7SUFBRyxDQUFDO0lBRTFGOztPQUVHO0lBQ0ksT0FBTyxDQUFDLE9BQWUsRUFBRSxVQUEyQixFQUFFO1FBQzNELGtCQUFrQjtRQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osVUFBVSxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDeEM7UUFFRCxhQUFhO1FBQ2IsTUFBTSxNQUFNLEdBQUc7WUFDYixTQUFTLEVBQUUsSUFBSTtZQUNmLE1BQU0sRUFBRSxJQUFJO1lBQ1osR0FBRyxFQUFFLEtBQUs7WUFDVixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxLQUFLO1lBQzlCLEdBQUcsT0FBTztTQUNYLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFT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Q0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztnQ0FDdkcsTUFBTSxFQUFFLFdBQVcsR0FBRyxHQUFHO2dDQUN6QixNQUFNO2dDQUNOLFlBQVk7Z0NBQ1osR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO2dDQUNaLFVBQVU7NkJBQ1gsQ0FBQyxDQUFDLFlBQVk7NEJBQ2YsSUFBSTs0QkFDSixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7NEJBQzlCLEdBQUcsQ0FBQztpQkFDUDthQUNGO1NBQ0Y7UUFFRCxnQkFBZ0I7UUFDaEIsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEQsQ0FBQzs7MkdBdGdCVSxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBvbGxvLCBncWwgfSBmcm9tICdhcG9sbG8tYW5ndWxhcic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJR3JhcGhRTE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBocWwtb3B0aW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgR3JhcGhRTFJlcXVlc3RUeXBlIH0gZnJvbSAnLi4vZW51bXMvZ3JhcGhxbC1yZXF1ZXN0LXR5cGUuZW51bSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHcmFwaFFMTWV0YVNlcnZpY2UgfSBmcm9tICcuL2dyYXBocWwtbWV0YS5zZXJ2aWNlJztcbmltcG9ydCB7IEdyYXBoUUxFbnVtIH0gZnJvbSAnLi4vY2xhc3Nlcy9ncmFwaHFsLWVudW0uY2xhc3MnO1xuaW1wb3J0IHsgR3JhcGhRTFR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL2dyYXBocWwtdHlwZS5jbGFzcyc7XG5pbXBvcnQgeyBJR3JhcGhRTFR5cGVDb2xsZWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaHFsLXR5cGUtY29sbGVjdGlvbi5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEdyYXBoUUwgc2VydmljZVxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgR3JhcGhRTFNlcnZpY2Uge1xuICAvKipcbiAgICogSW5jbHVkZSBzZXJ2aWNlc1xuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGFwb2xsbzogQXBvbGxvLCBwcm90ZWN0ZWQgZ3JhcGhRTE1ldGFTZXJ2aWNlOiBHcmFwaFFMTWV0YVNlcnZpY2UpIHt9XG5cbiAgLyoqXG4gICAqIEdyYXBoUUwgcmVxdWVzdFxuICAgKi9cbiAgcHVibGljIGdyYXBoUWwoZ3JhcGhxbDogc3RyaW5nLCBvcHRpb25zOiBJR3JhcGhRTE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgLy8gQ2hlY2sgYXJndW1lbnRzXG4gICAgaWYgKCFncmFwaHFsKSB7XG4gICAgICB0aHJvd0Vycm9yKCdNaXNzaW5nIGdyYXBocWwgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgY29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgYXJndW1lbnRzOiBudWxsLFxuICAgICAgZmllbGRzOiBudWxsLFxuICAgICAgbG9nOiBmYWxzZSxcbiAgICAgIG1vZGVsOiBudWxsLFxuICAgICAgdHlwZTogR3JhcGhRTFJlcXVlc3RUeXBlLlFVRVJZLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gQ29udmVydCBjbGFzcyB0byBPYmplY3QgZm9yIGFyZ3VtZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmFyZ3VtZW50cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uZmlnLmFyZ3VtZW50cyA9IG5ldyBjb25maWcuYXJndW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBjbGFzcyB0byBPYmplY3QgZm9yIGZpZWxkc1xuICAgIGlmICh0eXBlb2YgY29uZmlnLmZpZWxkcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uZmlnLmZpZWxkcyA9IG5ldyBjb25maWcuZmllbGRzKCk7XG4gICAgfVxuXG4gICAgLy8gTG9nXG4gICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKHsgY29uZmlnIH0pO1xuICAgIH1cblxuICAgIC8vIFNlbmQgcmVxdWVzdFxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgICAgLy8gR2V0IG1ldGFcbiAgICAgIHRoaXMuZ3JhcGhRTE1ldGFTZXJ2aWNlLmdldE1ldGEoeyBsb2c6IGNvbmZpZy5sb2cgfSkuc3Vic2NyaWJlKChtZXRhKSA9PiB7XG4gICAgICAgIC8vIFByZXBhcmUgZmllbGRzXG4gICAgICAgIGxldCBmaWVsZHM7XG4gICAgICAgIGxldCBhbGxvd2VkRmllbGRzO1xuXG4gICAgICAgIC8vIExvZyBtZXRhXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBtZXRhIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5maWVsZHMpIHtcbiAgICAgICAgICBhbGxvd2VkRmllbGRzID0gbWV0YS5nZXRGaWVsZHMoZ3JhcGhxbCwgeyB0eXBlOiBjb25maWcudHlwZSB9KTtcblxuICAgICAgICAgIC8vIExvZyBtZXRhXG4gICAgICAgICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgYWxsb3dlZEZpZWxkcyB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaWVsZHNEYXRhID0gdGhpcy5wcmVwYXJlRmllbGRzKGNvbmZpZy5maWVsZHMsIHtcbiAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWRGaWVsZHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2cgZmllbGRzIGRhdGFcbiAgICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgICAgZmllbGRzRGF0YS51c2VkRmllbGRzLnNvcnQoKTtcbiAgICAgICAgICAgIGZpZWxkc0RhdGEuc2NoZW1hRmllbGRzLnNvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gZmllbGRzRGF0YS5zY2hlbWFGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWZpZWxkc0RhdGEudXNlZEZpZWxkcy5pbmNsdWRlcyhmaWVsZCkpO1xuICAgICAgICAgICAgY29uc3QgdW51c2VkID0gdGhpcy5ncmFwaFFMVHlwZUNvbGxlY3Rpb25Ub1N0cmluZ0FycmF5KGFsbG93ZWRGaWVsZHMpLmZpbHRlcihcbiAgICAgICAgICAgICAgKGZpZWxkKSA9PiAhZmllbGRzRGF0YS51c2VkRmllbGRzLmluY2x1ZGVzKGZpZWxkKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHsgZmllbGRzRGF0YSwgZmlsdGVyZWQsIHVudXNlZCB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWVsZHMgPSBmaWVsZHNEYXRhLmZpZWxkc1N0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZHMgJiYgIWZpZWxkcy5zdGFydHNXaXRoKCd7JykpIHtcbiAgICAgICAgICBmaWVsZHMgPSAneycgKyBmaWVsZHMgKyAnXFxufSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2cgZmllbGRzXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBmaWVsZHMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWxsb3dlZCBhcmdzXG4gICAgICAgIGNvbnN0IGFsbG93ZWRBcmdzID0gbWV0YS5nZXRBcmdzKGdyYXBocWwsIHsgdHlwZTogY29uZmlnLnR5cGUgfSk7XG5cbiAgICAgICAgLy8gTG9nIGFsbG93ZWQgYXJnc1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgYWxsb3dlZEFyZ3MgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzRGF0YSA9IHRoaXMucHJlcGFyZUFyZ3VtZW50cyhjb25maWcuYXJndW1lbnRzLCB7XG4gICAgICAgICAgYWxsb3dlZDogYWxsb3dlZEFyZ3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExvZyBhcmdzIGRhdGFcbiAgICAgICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgICAgICBhcmdzRGF0YS51c2VkQXJncy5zb3J0KCk7XG4gICAgICAgICAgYXJnc0RhdGEuc2NoZW1hQXJncy5zb3J0KCk7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBhcmdzRGF0YS5zY2hlbWFBcmdzLmZpbHRlcigoZmllbGQpID0+ICFhcmdzRGF0YS51c2VkQXJncy5pbmNsdWRlcyhmaWVsZCkpO1xuICAgICAgICAgIGNvbnN0IHVudXNlZCA9IHRoaXMuZ3JhcGhRTFR5cGVDb2xsZWN0aW9uVG9TdHJpbmdBcnJheShhbGxvd2VkQXJncylcbiAgICAgICAgICAgIC5zb3J0KClcbiAgICAgICAgICAgIC5maWx0ZXIoKGZpZWxkKSA9PiAhYXJnc0RhdGEudXNlZEFyZ3MuaW5jbHVkZXMoZmllbGQpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyh7IGFyZ3NEYXRhLCBmaWx0ZXJlZCwgdW51c2VkIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3NEYXRhPy5hcmdzU3RyaW5nIHx8ICcnO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgZ3JhcGhRTDogZ3JhcGhxbCwgYXJncywgZmllbGRzLCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgcmVxdWVzdFxuICAgICAgICBjb25zdCBkb2N1bWVudE5vZGUgPSBmaWVsZHNcbiAgICAgICAgICA/IGdxbChjb25maWcudHlwZSArICd7XFxuJyArIGdyYXBocWwgKyBhcmdzICsgZmllbGRzICsgJ1xcbn0nKVxuICAgICAgICAgIDogZ3FsKGNvbmZpZy50eXBlICsgJ3tcXG4nICsgZ3JhcGhxbCArIGFyZ3MgKyAnXFxufScpO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgZG9jdW1lbnROb2RlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdDogYW55ID0ge307XG4gICAgICAgIHJlcXVlc3RbY29uZmlnLnR5cGVdID0gZG9jdW1lbnROb2RlO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgcmVxdWVzdCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmdW5jO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnbXV0YXRlJztcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gR3JhcGhRTFJlcXVlc3RUeXBlLlNVQlNDUklQVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnc3Vic2NyaWJlJztcbiAgICAgICAgICByZXF1ZXN0LnF1ZXJ5ID0gZG9jdW1lbnROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZ1bmMgPSBjb25maWcudHlwZTtcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgICh0aGlzLmFwb2xsbyBhcyBhbnkpW2Z1bmNdKHJlcXVlc3QpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQ/LmRhdGE/LltncmFwaHFsXSAhPT0gdW5kZWZpbmVkID8gcmVzdWx0LmRhdGFbZ3JhcGhxbF0gOiByZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIERpcmVjdCBkYXRhXG4gICAgICAgICAgICBpZiAoIWNvbmZpZy5tb2RlbCkge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1hcCBkYXRhIGFzIGFycmF5XG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChcbiAgICAgICAgICAgICAgICBkYXRhLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5tb2RlbC5tYXAoaXRlbSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFwIGRhdGFcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoY29uZmlnLm1vZGVsLm1hcChkYXRhKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb25maWcudHlwZSAhPT0gR3JhcGhRTFJlcXVlc3RUeXBlLlNVQlNDUklQVElPTikge1xuICAgICAgICAgICAgICAvLyBEb25lXG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmllbGRzIC8gYXJncyBmcm9tIElHcmFwaFFMVHlwZUNvbGxlY3Rpb25cbiAgICovXG4gIHByb3RlY3RlZCBncmFwaFFMVHlwZUNvbGxlY3Rpb25Ub1N0cmluZ0FycmF5KFxuICAgIGNvbGxlY3Rpb246IElHcmFwaFFMVHlwZUNvbGxlY3Rpb24sXG4gICAgY3VycmVudCA9ICcnLFxuICAgIHJlc3VsdCA9IFtdLFxuICAgIGNhY2hlTm9kZSA9IFtdXG4gICkge1xuICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEdyYXBoUUxUeXBlKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGN1cnJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJlbnQ/LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICBjYWNoZU5vZGUucHVzaChjdXJyZW50LnNwbGl0KCcuJylbMV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICBjYWNoZU5vZGUucHVzaChjdXJyZW50KTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKSkge1xuICAgICAgICAgIGlmIChjdXJyZW50ID09PSBrZXkgfHwgY2FjaGVOb2RlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmdyYXBoUUxUeXBlQ29sbGVjdGlvblRvU3RyaW5nQXJyYXkoXG4gICAgICAgICAgICBjb2xsZWN0aW9uW2tleV0gYXMgSUdyYXBoUUxUeXBlQ29sbGVjdGlvbixcbiAgICAgICAgICAgIGN1cnJlbnQgPyBjdXJyZW50ICsgJy4nICsga2V5IDoga2V5LFxuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY2FjaGVOb2RlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgYXJndW1lbnRzIGZvciBHcmFwaFFMIHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlQXJndW1lbnRzKFxuICAgIGFyZ3M6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhbGxvd2VkPzogYW55O1xuICAgICAgbGV2ZWw/OiBudW1iZXI7XG4gICAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgICBzY2hlbWFBcmdzPzogc3RyaW5nW107XG4gICAgICB1c2VkQXJncz86IHN0cmluZ1tdO1xuICAgIH0gPSB7fVxuICApOiB7IGFyZ3NTdHJpbmc6IHN0cmluZzsgc2NoZW1hQXJnczogc3RyaW5nW107IHVzZWRBcmdzOiBzdHJpbmdbXSB9IHtcbiAgICAvLyBJbml0IGNvbmZpZyB2YXJpYWJsZXNcbiAgICBjb25zdCB7IGFsbG93ZWQsIGxldmVsLCBwYXJlbnQsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzIH0gPSB7XG4gICAgICBhbGxvd2VkOiBudWxsLFxuICAgICAgbGV2ZWw6IDEsXG4gICAgICBwYXJlbnQ6ICcnLFxuICAgICAgc2NoZW1hQXJnczogW10sXG4gICAgICB1c2VkQXJnczogW10sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBhcmdzXG4gICAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCB8fCBhcmdzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnJywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICB9XG5cbiAgICAvLyBJbml0IGFyZ3NcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZEtleXMgPSBhbGxvd2VkID8gT2JqZWN0LmtleXMoYWxsb3dlZCkgOiBudWxsO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFyZ3MpIHtcbiAgICAgICAgbGV0IGtleSA9IG51bGw7XG4gICAgICAgIGlmIChhbGxvd2VkKSB7XG4gICAgICAgICAgaWYgKGFsbG93ZWQubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleSA9IGFsbG93ZWRLZXlzPy5zaGlmdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyB2YWx1ZVxuICAgICAgICByZXN1bHQucHVzaChcbiAgICAgICAgICB0aGlzLnByZXBhcmVBcmd1bWVudHMoaXRlbSwge1xuICAgICAgICAgICAgYWxsb3dlZDoga2V5ID8gYWxsb3dlZFtrZXldIDogbnVsbCxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbCArIDEsXG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCArIGtleSArICcuJyxcbiAgICAgICAgICAgIHNjaGVtYUFyZ3MsXG4gICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICB9KS5hcmdzU3RyaW5nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuY2Fwc3VsYXRpb24gb2YgdGhlIGFycmF5IHJlc3VsdFxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gQ29tcGxldGUgcmVzdWx0LCBlbmNhcHN1bGF0ZWQgdmlhIHJvdW5kIGJyYWNrZXRzXG4gICAgICAgIGlmIChsZXZlbCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICcoJyArIHJlc3VsdC5qb2luKCcsICcpICsgJyknLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVlcGVyIHJlc3VsdCBwYXJ0LCBlbmNhcHN1bGF0ZWQgdmlhIHNxdWFyZSBicmFja2V0c1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnWycgKyByZXN1bHQuam9pbignLCAnKSArICddJywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyZ3MgPT09ICdvYmplY3QnKSB7XG4gICAgICAvLyBDaGVjayBvYmplY3QgaXMgZW1wdHlcbiAgICAgIGlmIChhcmdzICYmIE9iamVjdC5rZXlzKGFyZ3MpLmxlbmd0aCA9PT0gMCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYXJncykgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHsgYXJnc1N0cmluZzogJ3t9Jywgc2NoZW1hQXJncywgdXNlZEFyZ3MgfTtcbiAgICAgIH1cbiAgICAgIC8vIFByb2Nlc3MgYWxsIG9iamVjdCBlbnRyaWVzXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcmdzKSkge1xuICAgICAgICAvLyBJbml0IGRhdGEgZm9yIGN1cnJlbnQgZW50cnlcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IHBhcmVudCArIGtleTtcbiAgICAgICAgc2NoZW1hQXJncy5wdXNoKGN1cnJlbnRLZXkpO1xuXG4gICAgICAgIC8vIElmIHRoZSBhbGxvd2VkIGtleSBoYW5kbGluZyBpcyBlbmFibGVkIGFuZCB0aGUgY3VycmVudCBrZXkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGFsbG93ZWQga2V5cyxcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQga2V5IHdpbGwgYmUgc2tpcHBlZFxuICAgICAgICBpZiAoYWxsb3dlZCAmJiAhYWxsb3dlZFtrZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIHZhbHVlIGlmIG5vdCBleGlzdHNcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IGtleSB0byBtZXRhZGF0YVxuICAgICAgICB1c2VkQXJncy5wdXNoKGN1cnJlbnRLZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgR3JhcGhRTEVudW1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgR3JhcGhRTEVudW0pIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkgKyAnOicgKyB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgICAnOiBbJyArXG4gICAgICAgICAgICAgIHZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZUFyZ3VtZW50cyhpdGVtLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWRba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdXJyZW50S2V5ICsgJy4nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWFBcmdzLFxuICAgICAgICAgICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICAgICAgICAgIH0pLmFyZ3NTdHJpbmdcbiAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICddJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVwYXJlIGFkZGl0aW9uYWwgcmVzdWx0IHN0cmluZ1xuICAgICAgICBsZXQgYWRkaXRpb25hbFJlc3VsdCA9IGtleSArICc6ICc7XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBkYXRlIG9iamVjdFxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IGBcIlwiXCIkeyh2YWx1ZSBhcyBEYXRlKS50b1N0cmluZygpfVwiXCJcImA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWx1ZSBpcyBhIHN0cmluZ1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gRW51bSAoZG9lc24ndCBuZWVkIHF1b3RhdGlvbiBtYXJrcylcbiAgICAgICAgICBpZiAoYWxsb3dlZFtrZXldLmlzRW51bSkge1xuICAgICAgICAgICAgYWRkaXRpb25hbFJlc3VsdCArPSB2YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdHJpbmdcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXN1bHQgKz0gYFwiXCJcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiXCJcImA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBzaW1wbGUgYm9vbGVhbiBvciBhIG51bWJlclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYWRkaXRpb25hbFJlc3VsdCArPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IHRoaXMucHJlcGFyZUFyZ3VtZW50cyh2YWx1ZSwge1xuICAgICAgICAgICAgYWxsb3dlZDogYWxsb3dlZFtrZXldLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSxcbiAgICAgICAgICAgIHBhcmVudDogY3VycmVudEtleSArICcuJyxcbiAgICAgICAgICAgIHNjaGVtYUFyZ3MsXG4gICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICB9KS5hcmdzU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVzaCBkZWVwZXIgcGFydCBpbnRvIHJlc3VsdCBhcnJheVxuICAgICAgICByZXN1bHQucHVzaChhZGRpdGlvbmFsUmVzdWx0KTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5jYXBzdWxhdGlvbiBvZiB0aGUgb2JqZWN0IHJlc3VsdFxuICAgICAgaWYgKHJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gQ29tcGxldGUgcmVzdWx0LCBlbmNhcHN1bGF0ZWQgdmlhIHJvdW5kIGJyYWNrZXRzXG4gICAgICAgIGlmIChsZXZlbCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICcoJyArIHJlc3VsdC5qb2luKCcsICcpICsgJyknLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVlcGVyIHJlc3VsdCBwYXJ0LCBlbmNhcHN1bGF0ZWQgdmlhIGN1cmx5IGJyYWNrZXRzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICd7JyArIHJlc3VsdC5qb2luKCcsICcpICsgJ30nLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBhbmQgcHJvY2VzcyBvdGhlciAvIHVua25vd24gdmFsdWVzIGFzIEpTT05cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLCBzY2hlbWFBcmdzLCB1c2VkQXJncyB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlIGZpZWxkcyBmb3IgR3JhcGhRTCByZXF1ZXN0XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZUZpZWxkcyhcbiAgICBmaWVsZHM6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhbGxvd2VkPzogYW55O1xuICAgICAgc2NoZW1hRmllbGRzPzogc3RyaW5nW107XG4gICAgICB1c2VkRmllbGRzPzogc3RyaW5nW107XG4gICAgICBwYXJlbnQ/OiBzdHJpbmc7XG4gICAgICBzcGFjZXM/OiBudW1iZXI7XG4gICAgICB0YWI/OiBudW1iZXI7XG4gICAgfSA9IHt9XG4gICk6IHsgc2NoZW1hRmllbGRzOiBzdHJpbmdbXTsgZmllbGRzU3RyaW5nOiBzdHJpbmc7IHVzZWRGaWVsZHM6IHN0cmluZ1tdIH0ge1xuICAgIC8vIENvbmZpZ1xuICAgIGNvbnN0IHsgYWxsb3dlZCwgcGFyZW50LCBzY2hlbWFGaWVsZHMsIHNwYWNlcywgdGFiLCB1c2VkRmllbGRzIH0gPSB7XG4gICAgICBhbGxvd2VkOiBudWxsLFxuICAgICAgcGFyZW50OiAnJyxcbiAgICAgIHNjaGVtYUZpZWxkczogW10sXG4gICAgICBzcGFjZXM6IDIsXG4gICAgICB0YWI6IDEsXG4gICAgICB1c2VkRmllbGRzOiBbXSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIEluaXQgZmllbGRzIHN0cmluZ1xuICAgIGxldCBmaWVsZHNTdHJpbmcgPSAnJztcblxuICAgIC8vIENoZWNrIGZpZWxkc1xuICAgIGlmICghZmllbGRzKSB7XG4gICAgICByZXR1cm4geyBmaWVsZHNTdHJpbmcsIHNjaGVtYUZpZWxkcywgdXNlZEZpZWxkcyB9O1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBmaWVsZHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGFsbG93ZWQgJiZcbiAgICAgICAgKCh0eXBlb2YgYWxsb3dlZCA9PT0gJ3N0cmluZycgJiYgYWxsb3dlZCAhPT0gZmllbGRzKSB8fCAodHlwZW9mIGFsbG93ZWQgPT09ICdvYmplY3QnICYmICFhbGxvd2VkW2ZpZWxkc10pKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7IGZpZWxkc1N0cmluZywgc2NoZW1hRmllbGRzLCB1c2VkRmllbGRzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyBmaWVsZHNTdHJpbmc6ICdcXG4nICsgJyAnLnJlcGVhdChzcGFjZXMpLnJlcGVhdCh0YWIpICsgZmllbGRzLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShmaWVsZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmllbGRzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmaWVsZHNTdHJpbmcgPVxuICAgICAgICAgICAgZmllbGRzU3RyaW5nICtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZUZpZWxkcyhpdGVtLCB7XG4gICAgICAgICAgICAgIGFsbG93ZWQsXG4gICAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgICAgc3BhY2VzLFxuICAgICAgICAgICAgICBzY2hlbWFGaWVsZHMsXG4gICAgICAgICAgICAgIHRhYjogdGFiICsgMSxcbiAgICAgICAgICAgICAgdXNlZEZpZWxkcyxcbiAgICAgICAgICAgIH0pLmZpZWxkc1N0cmluZztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHBhcmVudCArIGl0ZW07XG4gICAgICAgIHNjaGVtYUZpZWxkcy5wdXNoKGN1cnJlbnRQYXRoKTtcbiAgICAgICAgaWYgKGFsbG93ZWQgJiYgIWFsbG93ZWQ/LltpdGVtXSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHVzZWRGaWVsZHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICAgIGZpZWxkc1N0cmluZyA9XG4gICAgICAgICAgZmllbGRzU3RyaW5nICtcbiAgICAgICAgICB0aGlzLnByZXBhcmVGaWVsZHMoaXRlbSwge1xuICAgICAgICAgICAgYWxsb3dlZDpcbiAgICAgICAgICAgICAgdHlwZW9mIGFsbG93ZWQ/LltpdGVtXSA9PT0gJ29iamVjdCcgJiYgIShhbGxvd2VkPy5baXRlbV0gaW5zdGFuY2VvZiBHcmFwaFFMVHlwZSkgPyBhbGxvd2VkPy5baXRlbV0gOiBpdGVtLFxuICAgICAgICAgICAgcGFyZW50OiBjdXJyZW50UGF0aCArICcuJyxcbiAgICAgICAgICAgIHNwYWNlcyxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkcyxcbiAgICAgICAgICAgIHRhYjogdGFiICsgMSxcbiAgICAgICAgICAgIHVzZWRGaWVsZHMsXG4gICAgICAgICAgfSkuZmllbGRzU3RyaW5nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb2Nlc3Mgb2JqZWN0XG4gICAgZWxzZSBpZiAodHlwZW9mIGZpZWxkcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZHMpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcGFyZW50ICsga2V5O1xuICAgICAgICBzY2hlbWFGaWVsZHMucHVzaChjdXJyZW50UGF0aCk7XG4gICAgICAgIGlmIChhbGxvd2VkICYmICFhbGxvd2VkW2tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB1c2VkRmllbGRzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKHZhbCkubGVuZ3RoKSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID0gZmllbGRzU3RyaW5nICsgJ1xcbicgKyAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgKyBrZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID1cbiAgICAgICAgICAgIGZpZWxkc1N0cmluZyArXG4gICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgK1xuICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAneycgK1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlRmllbGRzKHZhbCwge1xuICAgICAgICAgICAgICBhbGxvd2VkOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBhbGxvd2VkPy5ba2V5XSA9PT0gJ29iamVjdCcgJiYgIShhbGxvd2VkPy5ba2V5XSBpbnN0YW5jZW9mIEdyYXBoUUxUeXBlKSA/IGFsbG93ZWQ/LltrZXldIDoga2V5LFxuICAgICAgICAgICAgICBwYXJlbnQ6IGN1cnJlbnRQYXRoICsgJy4nLFxuICAgICAgICAgICAgICBzcGFjZXMsXG4gICAgICAgICAgICAgIHNjaGVtYUZpZWxkcyxcbiAgICAgICAgICAgICAgdGFiOiB0YWIgKyAxLFxuICAgICAgICAgICAgICB1c2VkRmllbGRzLFxuICAgICAgICAgICAgfSkuZmllbGRzU3RyaW5nICtcbiAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgICcgJy5yZXBlYXQoc3BhY2VzKS5yZXBlYXQodGFiKSArXG4gICAgICAgICAgICAnfSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gcmVzdWx0XG4gICAgcmV0dXJuIHsgZmllbGRzU3RyaW5nLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,102 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Helper } from '../classes/helper.class';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Image service
6
+ */
7
+ export class ImageService {
8
+ /**
9
+ * Preaload images (for lazy handling)
10
+ *
11
+ * @param options
12
+ * @protected
13
+ */
14
+ preLoadImages(options) {
15
+ // Init configuration
16
+ const config = {
17
+ doneFunnction: undefined,
18
+ elements: document,
19
+ regExp: undefined,
20
+ ...options,
21
+ };
22
+ return new Promise((resolve) => {
23
+ // Convert element(s) into array
24
+ if (!Array.isArray(config.elements)) {
25
+ // NodeList or HTMLCollection
26
+ if (Helper.isNodeList(config.elements)) {
27
+ config.elements = Array.from(config.elements);
28
+ }
29
+ // Single element
30
+ else {
31
+ config.elements = [config.elements];
32
+ }
33
+ }
34
+ // Init loading
35
+ const promises = [];
36
+ // Get all images
37
+ let images = [];
38
+ config.elements.forEach((element) => {
39
+ images = images.concat(Array.from(element.getElementsByTagName('img')));
40
+ });
41
+ // Prepare images
42
+ for (let image of images) {
43
+ const src = image.getAttribute('src');
44
+ // Check if changes are necessary and possible
45
+ if ((image.complete && image.naturalHeight !== 0) || // already laoded
46
+ !src || // Image has no src
47
+ config.regExp?.test(src) // Test if src matches regular expression
48
+ ) {
49
+ continue;
50
+ }
51
+ // Replace lazy loading image with immediately loading image
52
+ if (image.getAttribute('loading') === 'lazy') {
53
+ const newImage = document.createElement('img');
54
+ Array.from(image.attributes).forEach((attr) => {
55
+ if (attr.name !== 'loading' && attr.name !== 'src') {
56
+ newImage.setAttribute(attr.name, attr.value);
57
+ }
58
+ });
59
+ image.replaceWith(newImage);
60
+ image = newImage;
61
+ }
62
+ // Wait for laoding
63
+ promises.push(this.loadImage(image, src));
64
+ }
65
+ // Wait until all images loaded
66
+ Promise.all(promises)
67
+ .catch((e) => console.error('Error during image loading', e))
68
+ .finally(async () => {
69
+ // Return result
70
+ let result;
71
+ if (config.doneFunnction) {
72
+ result = await config.doneFunction();
73
+ }
74
+ resolve(result);
75
+ });
76
+ });
77
+ }
78
+ /**
79
+ * Load image for image element
80
+ *
81
+ * @param imageElement
82
+ * @param src
83
+ * @protected
84
+ */
85
+ async loadImage(imageElement, src) {
86
+ src = src || imageElement.src;
87
+ return new Promise((resolve, reject) => {
88
+ imageElement.onload = () => resolve(imageElement);
89
+ imageElement.onerror = reject;
90
+ imageElement.src = src;
91
+ });
92
+ }
93
+ }
94
+ ImageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
95
+ ImageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ImageService, providedIn: 'root' });
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ImageService, decorators: [{
97
+ type: Injectable,
98
+ args: [{
99
+ providedIn: 'root',
100
+ }]
101
+ }] });
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJhc2Uvc3JjL3NlcnZpY2VzL2ltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRWpEOztHQUVHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFDdkI7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsT0FZcEI7UUFDQyxxQkFBcUI7UUFDckIsTUFBTSxNQUFNLEdBQUc7WUFDYixhQUFhLEVBQUUsU0FBUztZQUN4QixRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUUsU0FBUztZQUNqQixHQUFHLE9BQU87U0FDWCxDQUFDO1FBRUYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLGdDQUFnQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ25DLDZCQUE2QjtnQkFDN0IsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDdEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFxQyxDQUFjLENBQUM7aUJBQ3pGO2dCQUVELGlCQUFpQjtxQkFDWjtvQkFDSCxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBYyxDQUFDO2lCQUNsRDthQUNGO1lBRUQsZUFBZTtZQUNmLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztZQUVwQixpQkFBaUI7WUFDakIsSUFBSSxNQUFNLEdBQXVCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8s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QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVyLmNsYXNzJztcblxuLyoqXG4gKiBJbWFnZSBzZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVNlcnZpY2Uge1xuICAvKipcbiAgICogUHJlYWxvYWQgaW1hZ2VzIChmb3IgbGF6eSBoYW5kbGluZylcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHVibGljIHByZUxvYWRJbWFnZXMob3B0aW9ucz86IHtcbiAgICBkb25lRnVuY3Rpb24/OiAoKSA9PiBQcm9taXNlPGFueT4gfCBhbnkgfCB2b2lkO1xuICAgIGVsZW1lbnRzPzpcbiAgICAgIHwgRWxlbWVudFxuICAgICAgfCBFbGVtZW50W11cbiAgICAgIHwgSFRNTENvbGxlY3Rpb25PZjxFbGVtZW50PlxuICAgICAgfCBOb2RlXG4gICAgICB8IE5vZGVMaXN0XG4gICAgICB8IERvY3VtZW50XG4gICAgICB8IEhUTUxFbGVtZW50XG4gICAgICB8IEhUTUxFbGVtZW50W107XG4gICAgcmVnRXhwPzogUmVnRXhwO1xuICB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBJbml0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBkb25lRnVubmN0aW9uOiB1bmRlZmluZWQsXG4gICAgICBlbGVtZW50czogZG9jdW1lbnQsXG4gICAgICByZWdFeHA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQ29udmVydCBlbGVtZW50KHMpIGludG8gYXJyYXlcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb25maWcuZWxlbWVudHMpKSB7XG4gICAgICAgIC8vIE5vZGVMaXN0IG9yIEhUTUxDb2xsZWN0aW9uXG4gICAgICAgIGlmIChIZWxwZXIuaXNOb2RlTGlzdChjb25maWcuZWxlbWVudHMpKSB7XG4gICAgICAgICAgY29uZmlnLmVsZW1lbnRzID0gQXJyYXkuZnJvbShjb25maWcuZWxlbWVudHMgYXMgSFRNTENvbGxlY3Rpb24gfCBOb2RlTGlzdCkgYXMgRWxlbWVudFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2luZ2xlIGVsZW1lbnRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uZmlnLmVsZW1lbnRzID0gW2NvbmZpZy5lbGVtZW50c10gYXMgRWxlbWVudFtdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXQgbG9hZGluZ1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcblxuICAgICAgLy8gR2V0IGFsbCBpbWFnZXNcbiAgICAgIGxldCBpbWFnZXM6IEhUTUxJbWFnZUVsZW1lbnRbXSA9IFtdO1xuICAgICAgY29uZmlnLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaW1hZ2VzID0gaW1hZ2VzLmNvbmNhdChBcnJheS5mcm9tKGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpKSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJlcGFyZSBpbWFnZXNcbiAgICAgIGZvciAobGV0IGltYWdlIG9mIGltYWdlcykge1xuICAgICAgICBjb25zdCBzcmMgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGNoYW5nZXMgYXJlIG5lY2Vzc2FyeSBhbmQgcG9zc2libGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChpbWFnZS5jb21wbGV0ZSAmJiBpbWFnZS5uYXR1cmFsSGVpZ2h0ICE9PSAwKSB8fCAvLyBhbHJlYWR5IGxhb2RlZFxuICAgICAgICAgICFzcmMgfHwgLy8gSW1hZ2UgaGFzIG5vIHNyY1xuICAgICAgICAgIGNvbmZpZy5yZWdFeHA/LnRlc3Qoc3JjKSAvLyBUZXN0IGlmIHNyYyBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvblxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcGxhY2UgbGF6eSBsb2FkaW5nIGltYWdlIHdpdGggaW1tZWRpYXRlbHkgbG9hZGluZyBpbWFnZVxuICAgICAgICBpZiAoaW1hZ2UuZ2V0QXR0cmlidXRlKCdsb2FkaW5nJykgPT09ICdsYXp5Jykge1xuICAgICAgICAgIGNvbnN0IG5ld0ltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgQXJyYXkuZnJvbShpbWFnZS5hdHRyaWJ1dGVzKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXR0ci5uYW1lICE9PSAnbG9hZGluZycgJiYgYXR0ci5uYW1lICE9PSAnc3JjJykge1xuICAgICAgICAgICAgICBuZXdJbWFnZS5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpbWFnZS5yZXBsYWNlV2l0aChuZXdJbWFnZSk7XG4gICAgICAgICAgaW1hZ2UgPSBuZXdJbWFnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIGxhb2RpbmdcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmxvYWRJbWFnZShpbWFnZSwgc3JjKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdhaXQgdW50aWwgYWxsIGltYWdlcyBsb2FkZWRcbiAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAuY2F0Y2goKGUpID0+IGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBpbWFnZSBsb2FkaW5nJywgZSkpXG4gICAgICAgIC5maW5hbGx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gcmVzdWx0XG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoY29uZmlnLmRvbmVGdW5uY3Rpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbmZpZy5kb25lRnVuY3Rpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGltYWdlIGZvciBpbWFnZSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSBpbWFnZUVsZW1lbnRcbiAgICogQHBhcmFtIHNyY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEltYWdlKGltYWdlRWxlbWVudDogSFRNTEltYWdlRWxlbWVudCwgc3JjPzogc3RyaW5nKSB7XG4gICAgc3JjID0gc3JjIHx8IGltYWdlRWxlbWVudC5zcmM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGltYWdlRWxlbWVudC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlRWxlbWVudCk7XG4gICAgICBpbWFnZUVsZW1lbnQub25lcnJvciA9IHJlamVjdDtcbiAgICAgIGltYWdlRWxlbWVudC5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==