ng-virtual-list 14.12.0 → 14.12.2

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 (460) hide show
  1. package/README.md +1 -11
  2. package/esm2020/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +309 -0
  3. package/{esm2022 → esm2020}/lib/components/ng-list-item/base/index.mjs +2 -2
  4. package/{esm2022 → esm2020}/lib/components/ng-list-item/const/index.mjs +40 -40
  5. package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/index.mjs +1 -1
  6. package/{esm2022 → esm2020}/lib/components/ng-list-item/interfaces/template-context.mjs +1 -1
  7. package/esm2020/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +200 -0
  8. package/{esm2022 → esm2020}/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +20 -20
  9. package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/create-display-id.mjs +9 -9
  10. package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/get-element-by-index.mjs +19 -19
  11. package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/index.mjs +4 -4
  12. package/{esm2022 → esm2020}/lib/components/ng-list-item/utils/matrix-3d.mjs +12 -12
  13. package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +278 -0
  14. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.mjs +21 -21
  15. package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +94 -0
  16. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +20 -20
  17. package/esm2020/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +141 -0
  18. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.mjs +20 -20
  19. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/core/index.mjs +2 -2
  20. package/esm2020/lib/components/ng-prerender-container/core/prerender-track-box.mjs +201 -0
  21. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/events/index.mjs +5 -5
  22. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/index.mjs +1 -1
  23. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
  24. package/esm2020/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +90 -0
  25. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/ng-prerender-container.module.mjs +20 -20
  26. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/cache.mjs +1 -1
  27. package/{esm2022 → esm2020}/lib/components/ng-prerender-container/types/index.mjs +1 -1
  28. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/const/index.mjs +8 -8
  29. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/index.mjs +2 -2
  30. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/enums/scrollbar-states.mjs +6 -6
  31. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/index.mjs +1 -1
  32. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
  33. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.mjs +1 -1
  34. package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +27 -0
  35. package/esm2020/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +324 -0
  36. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.module.mjs +19 -19
  37. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/ng-scroll-bar.service.mjs +38 -36
  38. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/index.mjs +1 -1
  39. package/{esm2022 → esm2020}/lib/components/ng-scroll-bar/types/scrollbar-state.mjs +1 -1
  40. package/esm2020/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +260 -0
  41. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/const/index.mjs +9 -9
  42. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/index.mjs +2 -2
  43. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-direction.mjs +11 -11
  44. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/enums/scroller-directions.mjs +1 -1
  45. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/index.mjs +3 -3
  46. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/index.mjs +1 -1
  47. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
  48. package/esm2020/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +856 -0
  49. package/esm2020/lib/components/ng-scroll-view/utils/calculate-direction.mjs +17 -0
  50. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +11 -11
  51. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/get-dir.mjs +9 -9
  52. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/index.mjs +5 -5
  53. package/{esm2022 → esm2020}/lib/components/ng-scroll-view/utils/matrix-3d.mjs +9 -9
  54. package/esm2020/lib/components/ng-scroll-view/utils/scroll-box.mjs +45 -0
  55. package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/index.mjs +2 -2
  56. package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-direction.mjs +5 -5
  57. package/{esm2022 → esm2020}/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
  58. package/esm2020/lib/components/ng-scroller/ng-scroller.component.mjs +521 -0
  59. package/{esm2022 → esm2020}/lib/components/ng-scroller/ng-scroller.module.mjs +22 -22
  60. package/{esm2022 → esm2020}/lib/components/ng-scroller/utils/index.mjs +2 -2
  61. package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.mjs +2 -0
  62. package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.mjs +2 -0
  63. package/esm2020/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.mjs +2 -0
  64. package/esm2020/lib/components/ng-scroller/utils/interfaces/index.mjs +2 -0
  65. package/esm2020/lib/components/ng-scroller/utils/scroll-box.mjs +52 -0
  66. package/{esm2022 → esm2020}/lib/const/index.mjs +164 -164
  67. package/esm2020/lib/core/cache-map.mjs +100 -0
  68. package/{esm2022 → esm2020}/lib/core/const/index.mjs +2 -2
  69. package/{esm2022 → esm2020}/lib/core/enums/index.mjs +2 -2
  70. package/{esm2022 → esm2020}/lib/core/enums/item-display-methods.mjs +13 -13
  71. package/{esm2022 → esm2020}/lib/core/events/index.mjs +2 -2
  72. package/{esm2022 → esm2020}/lib/core/events/track-box-events.mjs +11 -11
  73. package/{esm2022 → esm2020}/lib/core/interfaces/get-item-position-options.mjs +1 -1
  74. package/{esm2022 → esm2020}/lib/core/interfaces/get-metrics-returns.mjs +1 -1
  75. package/{esm2022 → esm2020}/lib/core/interfaces/index.mjs +1 -1
  76. package/{esm2022 → esm2020}/lib/core/interfaces/item.mjs +1 -1
  77. package/{esm2022 → esm2020}/lib/core/interfaces/metrics.mjs +1 -1
  78. package/esm2020/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
  79. package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-options.mjs +1 -1
  80. package/{esm2022 → esm2020}/lib/core/interfaces/update-collection-returns.mjs +1 -1
  81. package/esm2020/lib/core/track-box.mjs +1352 -0
  82. package/esm2020/lib/core/tracker.mjs +209 -0
  83. package/{esm2022 → esm2020}/lib/core/types/cache-map-events.mjs +1 -1
  84. package/{esm2022 → esm2020}/lib/core/types/cache-map-listeners.mjs +1 -1
  85. package/{esm2022 → esm2020}/lib/core/types/cache.mjs +1 -1
  86. package/{esm2022 → esm2020}/lib/core/types/index.mjs +1 -1
  87. package/{esm2022 → esm2020}/lib/core/types/on-change-event-listener.mjs +1 -1
  88. package/{esm2022 → esm2020}/lib/core/types/on-tick-event-listener.mjs +1 -1
  89. package/{esm2022 → esm2020}/lib/core/utils/get-service-id-prop.mjs +9 -9
  90. package/{esm2022 → esm2020}/lib/core/utils/index.mjs +2 -2
  91. package/{esm2022 → esm2020}/lib/directives/index.mjs +3 -3
  92. package/esm2020/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +67 -0
  93. package/{esm2022 → esm2020}/lib/directives/locale-sensitive/locale-sensitive.module.mjs +19 -19
  94. package/esm2020/lib/directives/virtual-click/virtual-click.directive.mjs +66 -0
  95. package/{esm2022 → esm2020}/lib/directives/virtual-click/virtual-click.module.mjs +19 -19
  96. package/{esm2022 → esm2020}/lib/enums/alignments.mjs +11 -11
  97. package/{esm2022 → esm2020}/lib/enums/collapsing-modes.mjs +21 -21
  98. package/{esm2022 → esm2020}/lib/enums/collection-modes.mjs +17 -17
  99. package/{esm2022 → esm2020}/lib/enums/directions.mjs +17 -17
  100. package/{esm2022 → esm2020}/lib/enums/focus-alignments.mjs +13 -13
  101. package/{esm2022 → esm2020}/lib/enums/index.mjs +11 -11
  102. package/{esm2022 → esm2020}/lib/enums/selecting-modes-types.mjs +21 -21
  103. package/{esm2022 → esm2020}/lib/enums/selecting-modes.mjs +21 -21
  104. package/{esm2022 → esm2020}/lib/enums/snap-to-item-aligns.mjs +21 -21
  105. package/{esm2022 → esm2020}/lib/enums/snapping-methods.mjs +17 -17
  106. package/{esm2022 → esm2020}/lib/enums/spreading-modes.mjs +17 -17
  107. package/{esm2022 → esm2020}/lib/enums/text-directions.mjs +13 -13
  108. package/{esm2022 → esm2020}/lib/interfaces/animation-params.mjs +1 -1
  109. package/{esm2022 → esm2020}/lib/interfaces/base-virtual-list-item-component.mjs +1 -1
  110. package/{esm2022 → esm2020}/lib/interfaces/index.mjs +1 -1
  111. package/{esm2022 → esm2020}/lib/interfaces/item-transformation.mjs +1 -1
  112. package/{esm2022 → esm2020}/lib/interfaces/point.mjs +1 -1
  113. package/{esm2022 → esm2020}/lib/interfaces/rect.mjs +1 -1
  114. package/{esm2022 → esm2020}/lib/interfaces/render-stabilizer-options.mjs +1 -1
  115. package/{esm2022 → esm2020}/lib/interfaces/scroll-event.mjs +1 -1
  116. package/{esm2022 → esm2020}/lib/interfaces/scroll-options.mjs +1 -1
  117. package/{esm2022 → esm2020}/lib/interfaces/scroll-params.mjs +1 -1
  118. package/{esm2022 → esm2020}/lib/interfaces/scroll-to-params.mjs +1 -1
  119. package/{esm2022 → esm2020}/lib/interfaces/scrolling-settings.mjs +1 -1
  120. package/{esm2022 → esm2020}/lib/interfaces/size.mjs +1 -1
  121. package/{esm2022 → esm2020}/lib/models/collection.model.mjs +2 -2
  122. package/{esm2022 → esm2020}/lib/models/component.model.mjs +1 -1
  123. package/{esm2022 → esm2020}/lib/models/display-object-config.model.mjs +1 -1
  124. package/{esm2022 → esm2020}/lib/models/display-object-measures.model.mjs +1 -1
  125. package/{esm2022 → esm2020}/lib/models/index.mjs +1 -1
  126. package/{esm2022 → esm2020}/lib/models/item-config-map.model.mjs +1 -1
  127. package/{esm2022 → esm2020}/lib/models/item.model.mjs +1 -1
  128. package/{esm2022 → esm2020}/lib/models/render-collection.model.mjs +2 -2
  129. package/{esm2022 → esm2020}/lib/models/render-item-config.model.mjs +1 -1
  130. package/{esm2022 → esm2020}/lib/models/render-item-measures.model.mjs +2 -2
  131. package/{esm2022 → esm2020}/lib/models/render-item.model.mjs +2 -2
  132. package/esm2020/lib/ng-virtual-list-public.service.mjs +122 -0
  133. package/esm2020/lib/ng-virtual-list.component.mjs +3255 -0
  134. package/{esm2022 → esm2020}/lib/ng-virtual-list.module.mjs +23 -23
  135. package/esm2020/lib/ng-virtual-list.service.mjs +430 -0
  136. package/esm2020/lib/transformations/deck-of-cards-3d.mjs +57 -0
  137. package/esm2020/lib/transformations/deck-of-cards.mjs +54 -0
  138. package/esm2020/lib/transformations/event-horizon.mjs +47 -0
  139. package/{esm2022 → esm2020}/lib/transformations/index.mjs +12 -12
  140. package/esm2020/lib/transformations/linear.mjs +47 -0
  141. package/esm2020/lib/transformations/swipe-3d.mjs +51 -0
  142. package/{esm2022 → esm2020}/lib/types/alignment.mjs +1 -1
  143. package/{esm2022 → esm2020}/lib/types/arithmetic-expression.mjs +1 -1
  144. package/{esm2022 → esm2020}/lib/types/collapsing-mode.mjs +1 -1
  145. package/{esm2022 → esm2020}/lib/types/collection-mode.mjs +1 -1
  146. package/{esm2022 → esm2020}/lib/types/color.mjs +1 -1
  147. package/{esm2022 → esm2020}/lib/types/direction.mjs +1 -1
  148. package/{esm2022 → esm2020}/lib/types/float-or-persentage-value.mjs +1 -1
  149. package/{esm2022 → esm2020}/lib/types/focus-alignment.mjs +1 -1
  150. package/{esm2022 → esm2020}/lib/types/focus-item-params.mjs +1 -1
  151. package/{esm2022 → esm2020}/lib/types/gradient-color-position.mjs +1 -1
  152. package/{esm2022 → esm2020}/lib/types/gradient-color-positions.mjs +1 -1
  153. package/{esm2022 → esm2020}/lib/types/id.mjs +1 -1
  154. package/{esm2022 → esm2020}/lib/types/index.mjs +1 -1
  155. package/{esm2022 → esm2020}/lib/types/item-transform.mjs +1 -1
  156. package/{esm2022 → esm2020}/lib/types/scroll-direction.mjs +1 -1
  157. package/{esm2022 → esm2020}/lib/types/selecting-mode.mjs +1 -1
  158. package/{esm2022 → esm2020}/lib/types/snap-to-item-align.mjs +1 -1
  159. package/{esm2022 → esm2020}/lib/types/snapping-distance.mjs +1 -1
  160. package/{esm2022 → esm2020}/lib/types/snapping-method.mjs +1 -1
  161. package/{esm2022 → esm2020}/lib/types/spreading-mode.mjs +1 -1
  162. package/{esm2022 → esm2020}/lib/types/text-direction.mjs +1 -1
  163. package/esm2020/lib/utils/animator/animator.mjs +80 -0
  164. package/{esm2022 → esm2020}/lib/utils/animator/const/index.mjs +1 -1
  165. package/{esm2022 → esm2020}/lib/utils/animator/ease.mjs +6 -6
  166. package/{esm2022 → esm2020}/lib/utils/animator/index.mjs +4 -4
  167. package/esm2020/lib/utils/animator/interfaces/animator-params.mjs +2 -0
  168. package/esm2020/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
  169. package/{esm2022 → esm2020}/lib/utils/animator/interfaces/index.mjs +1 -1
  170. package/esm2020/lib/utils/animator/types/easing.mjs +2 -0
  171. package/{esm2022 → esm2020}/lib/utils/animator/types/index.mjs +1 -1
  172. package/esm2020/lib/utils/buffer-interpolation.mjs +29 -0
  173. package/esm2020/lib/utils/cmap.mjs +34 -0
  174. package/esm2020/lib/utils/debounce.mjs +61 -0
  175. package/esm2020/lib/utils/disposable-component.mjs +29 -0
  176. package/esm2020/lib/utils/event-emitter/event-emitter.mjs +106 -0
  177. package/{esm2022 → esm2020}/lib/utils/event-emitter/index.mjs +2 -2
  178. package/esm2020/lib/utils/event-emitter/interfaces/event-emitter.mjs +2 -0
  179. package/{esm2022 → esm2020}/lib/utils/event-emitter/interfaces/index.mjs +1 -1
  180. package/esm2020/lib/utils/get-scroll-state-version.mjs +12 -0
  181. package/{esm2022 → esm2020}/lib/utils/get-selector-by-item-id.mjs +4 -4
  182. package/{esm2022 → esm2020}/lib/utils/index.mjs +4 -4
  183. package/esm2020/lib/utils/is-collapse-mode.mjs +18 -0
  184. package/{esm2022 → esm2020}/lib/utils/is-collection-mode.mjs +15 -15
  185. package/esm2020/lib/utils/is-direction.mjs +15 -0
  186. package/esm2020/lib/utils/is-persentage-value.mjs +14 -0
  187. package/esm2020/lib/utils/is-select-mode.mjs +18 -0
  188. package/{esm2022 → esm2020}/lib/utils/is-spreading-mode.mjs +15 -15
  189. package/esm2020/lib/utils/list-validators.mjs +27 -0
  190. package/esm2020/lib/utils/normalize-collection.mjs +42 -0
  191. package/esm2020/lib/utils/object.mjs +28 -0
  192. package/esm2020/lib/utils/parse-arithmetic-expression.mjs +53 -0
  193. package/esm2020/lib/utils/parse-float-or-persentage-value.mjs +17 -0
  194. package/esm2020/lib/utils/screen-reader-formatter.mjs +43 -0
  195. package/esm2020/lib/utils/scroll-event.mjs +46 -0
  196. package/esm2020/lib/utils/scrolling-direction.mjs +28 -0
  197. package/{esm2022 → esm2020}/lib/utils/snapping-method.mjs +8 -8
  198. package/esm2020/lib/utils/toggle-class-name.mjs +15 -0
  199. package/{esm2022 → esm2020}/lib/utils/validation.mjs +55 -55
  200. package/{esm2022 → esm2020}/ng-virtual-list.mjs +4 -4
  201. package/{esm2022 → esm2020}/public-api.mjs +19 -19
  202. package/fesm2015/ng-virtual-list.mjs +10731 -0
  203. package/fesm2015/ng-virtual-list.mjs.map +1 -0
  204. package/{fesm2022 → fesm2020}/ng-virtual-list.mjs +10451 -10455
  205. package/fesm2020/ng-virtual-list.mjs.map +1 -0
  206. package/index.d.ts +5 -5
  207. package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +83 -83
  208. package/lib/components/ng-list-item/base/index.d.ts +2 -2
  209. package/lib/components/ng-list-item/const/index.d.ts +3 -3
  210. package/lib/components/ng-list-item/interfaces/index.d.ts +2 -2
  211. package/lib/components/ng-list-item/interfaces/template-context.d.ts +42 -42
  212. package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +30 -30
  213. package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +9 -9
  214. package/lib/components/ng-list-item/utils/create-display-id.d.ts +7 -7
  215. package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -15
  216. package/lib/components/ng-list-item/utils/index.d.ts +4 -4
  217. package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -7
  218. package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +104 -104
  219. package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.module.d.ts +10 -10
  220. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +17 -17
  221. package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +9 -9
  222. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +62 -62
  223. package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.d.ts +9 -9
  224. package/lib/components/ng-prerender-container/core/index.d.ts +2 -2
  225. package/lib/components/ng-prerender-container/core/prerender-track-box.d.ts +35 -35
  226. package/lib/components/ng-prerender-container/events/index.d.ts +6 -6
  227. package/lib/components/ng-prerender-container/interfaces/index.d.ts +2 -2
  228. package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +17 -17
  229. package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +40 -40
  230. package/lib/components/ng-prerender-container/ng-prerender-container.module.d.ts +9 -9
  231. package/lib/components/ng-prerender-container/types/cache.d.ts +13 -13
  232. package/lib/components/ng-prerender-container/types/index.d.ts +2 -2
  233. package/lib/components/ng-scroll-bar/const/index.d.ts +3 -3
  234. package/lib/components/ng-scroll-bar/enums/index.d.ts +2 -2
  235. package/lib/components/ng-scroll-bar/enums/scrollbar-states.d.ts +5 -5
  236. package/lib/components/ng-scroll-bar/interfaces/index.d.ts +3 -3
  237. package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +26 -26
  238. package/lib/components/ng-scroll-bar/interfaces/scrollbar-drag-data.d.ts +13 -13
  239. package/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.d.ts +16 -16
  240. package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +102 -102
  241. package/lib/components/ng-scroll-bar/ng-scroll-bar.module.d.ts +8 -8
  242. package/lib/components/ng-scroll-bar/ng-scroll-bar.service.d.ts +22 -22
  243. package/lib/components/ng-scroll-bar/types/index.d.ts +2 -2
  244. package/lib/components/ng-scroll-bar/types/scrollbar-state.d.ts +2 -2
  245. package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +89 -89
  246. package/lib/components/ng-scroll-view/const/index.d.ts +7 -7
  247. package/lib/components/ng-scroll-view/enums/index.d.ts +4 -4
  248. package/lib/components/ng-scroll-view/enums/scroller-direction.d.ts +10 -10
  249. package/lib/components/ng-scroll-view/enums/scroller-directions.d.ts +8 -8
  250. package/lib/components/ng-scroll-view/index.d.ts +5 -5
  251. package/lib/components/ng-scroll-view/interfaces/index.d.ts +2 -2
  252. package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +22 -22
  253. package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +124 -124
  254. package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +10 -7
  255. package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -7
  256. package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -7
  257. package/lib/components/ng-scroll-view/utils/index.d.ts +5 -5
  258. package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -7
  259. package/lib/components/ng-scroll-view/utils/scroll-box.d.ts +39 -39
  260. package/lib/components/ng-scroller/enums/index.d.ts +4 -4
  261. package/lib/components/ng-scroller/enums/scroller-direction.d.ts +4 -4
  262. package/lib/components/ng-scroller/enums/scroller-directions.d.ts +3 -3
  263. package/lib/components/ng-scroller/ng-scroller.component.d.ts +164 -164
  264. package/lib/components/ng-scroller/ng-scroller.module.d.ts +11 -11
  265. package/lib/components/ng-scroller/utils/index.d.ts +2 -2
  266. package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-metrics.d.ts +11 -0
  267. package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-params.d.ts +19 -0
  268. package/lib/components/ng-scroller/utils/interfaces/calculate-scroll-position-params.d.ts +10 -0
  269. package/lib/components/ng-scroller/utils/interfaces/index.d.ts +4 -0
  270. package/lib/components/ng-scroller/utils/scroll-box.d.ts +23 -40
  271. package/lib/const/index.d.ts +153 -153
  272. package/lib/core/cache-map.d.ts +46 -46
  273. package/lib/core/const/index.d.ts +1 -1
  274. package/lib/core/enums/index.d.ts +2 -2
  275. package/lib/core/enums/item-display-methods.d.ts +12 -12
  276. package/lib/core/events/index.d.ts +2 -2
  277. package/lib/core/events/track-box-events.d.ts +10 -10
  278. package/lib/core/interfaces/get-item-position-options.d.ts +10 -10
  279. package/lib/core/interfaces/get-metrics-returns.d.ts +11 -11
  280. package/lib/core/interfaces/index.d.ts +8 -8
  281. package/lib/core/interfaces/item.d.ts +9 -9
  282. package/lib/core/interfaces/metrics.d.ts +51 -51
  283. package/lib/core/interfaces/recalculate-metrics-options.d.ts +33 -32
  284. package/lib/core/interfaces/update-collection-options.d.ts +10 -10
  285. package/lib/core/interfaces/update-collection-returns.d.ts +14 -14
  286. package/lib/core/track-box.d.ts +153 -153
  287. package/lib/core/tracker.d.ts +55 -55
  288. package/lib/core/types/cache-map-events.d.ts +8 -8
  289. package/lib/core/types/cache-map-listeners.d.ts +9 -9
  290. package/lib/core/types/cache.d.ts +12 -12
  291. package/lib/core/types/index.d.ts +6 -6
  292. package/lib/core/types/on-change-event-listener.d.ts +7 -7
  293. package/lib/core/types/on-tick-event-listener.d.ts +7 -7
  294. package/lib/core/utils/get-service-id-prop.d.ts +7 -7
  295. package/lib/core/utils/index.d.ts +2 -2
  296. package/lib/directives/index.d.ts +3 -3
  297. package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +29 -29
  298. package/lib/directives/locale-sensitive/locale-sensitive.module.d.ts +8 -8
  299. package/lib/directives/virtual-click/virtual-click.directive.d.ts +22 -22
  300. package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -8
  301. package/lib/enums/alignments.d.ts +10 -10
  302. package/lib/enums/collapsing-modes.d.ts +20 -20
  303. package/lib/enums/collection-modes.d.ts +16 -16
  304. package/lib/enums/directions.d.ts +16 -16
  305. package/lib/enums/focus-alignments.d.ts +12 -12
  306. package/lib/enums/index.d.ts +11 -11
  307. package/lib/enums/selecting-modes-types.d.ts +20 -20
  308. package/lib/enums/selecting-modes.d.ts +20 -20
  309. package/lib/enums/snap-to-item-aligns.d.ts +20 -20
  310. package/lib/enums/snapping-methods.d.ts +16 -16
  311. package/lib/enums/spreading-modes.d.ts +16 -16
  312. package/lib/enums/text-directions.d.ts +12 -12
  313. package/lib/interfaces/animation-params.d.ts +14 -14
  314. package/lib/interfaces/base-virtual-list-item-component.d.ts +23 -23
  315. package/lib/interfaces/index.d.ts +11 -11
  316. package/lib/interfaces/item-transformation.d.ts +22 -22
  317. package/lib/interfaces/point.d.ts +16 -16
  318. package/lib/interfaces/rect.d.ts +17 -17
  319. package/lib/interfaces/render-stabilizer-options.d.ts +12 -12
  320. package/lib/interfaces/scroll-event.d.ts +58 -58
  321. package/lib/interfaces/scroll-options.d.ts +28 -28
  322. package/lib/interfaces/scroll-params.d.ts +17 -17
  323. package/lib/interfaces/scroll-to-params.d.ts +7 -7
  324. package/lib/interfaces/scrolling-settings.d.ts +38 -38
  325. package/lib/interfaces/size.d.ts +16 -16
  326. package/lib/models/collection.model.d.ts +9 -9
  327. package/lib/models/component.model.d.ts +3 -3
  328. package/lib/models/display-object-config.model.d.ts +21 -21
  329. package/lib/models/display-object-measures.model.d.ts +45 -45
  330. package/lib/models/index.d.ts +9 -9
  331. package/lib/models/item-config-map.model.d.ts +35 -35
  332. package/lib/models/item.model.d.ts +17 -17
  333. package/lib/models/render-collection.model.d.ts +9 -9
  334. package/lib/models/render-item-config.model.d.ts +119 -119
  335. package/lib/models/render-item-measures.model.d.ts +116 -116
  336. package/lib/models/render-item.model.d.ts +40 -40
  337. package/lib/ng-virtual-list-public.service.d.ts +92 -92
  338. package/lib/ng-virtual-list.component.d.ts +771 -770
  339. package/lib/ng-virtual-list.module.d.ts +12 -12
  340. package/lib/ng-virtual-list.service.d.ts +153 -153
  341. package/lib/transformations/deck-of-cards-3d.d.ts +54 -54
  342. package/lib/transformations/deck-of-cards.d.ts +50 -50
  343. package/lib/transformations/event-horizon.d.ts +26 -26
  344. package/lib/transformations/index.d.ts +7 -7
  345. package/lib/transformations/linear.d.ts +26 -26
  346. package/lib/transformations/swipe-3d.d.ts +38 -38
  347. package/lib/types/alignment.d.ts +8 -8
  348. package/lib/types/arithmetic-expression.d.ts +10 -10
  349. package/lib/types/collapsing-mode.d.ts +8 -8
  350. package/lib/types/collection-mode.d.ts +8 -8
  351. package/lib/types/color.d.ts +4 -4
  352. package/lib/types/direction.d.ts +8 -8
  353. package/lib/types/float-or-persentage-value.d.ts +7 -7
  354. package/lib/types/focus-alignment.d.ts +8 -8
  355. package/lib/types/focus-item-params.d.ts +13 -13
  356. package/lib/types/gradient-color-position.d.ts +7 -7
  357. package/lib/types/gradient-color-positions.d.ts +8 -8
  358. package/lib/types/id.d.ts +7 -7
  359. package/lib/types/index.d.ts +20 -20
  360. package/lib/types/item-transform.d.ts +9 -9
  361. package/lib/types/scroll-direction.d.ts +8 -8
  362. package/lib/types/selecting-mode.d.ts +8 -8
  363. package/lib/types/snap-to-item-align.d.ts +8 -8
  364. package/lib/types/snapping-distance.d.ts +8 -8
  365. package/lib/types/snapping-method.d.ts +10 -10
  366. package/lib/types/spreading-mode.d.ts +8 -8
  367. package/lib/types/text-direction.d.ts +10 -10
  368. package/lib/utils/animator/animator.d.ts +16 -16
  369. package/lib/utils/animator/const/index.d.ts +1 -1
  370. package/lib/utils/animator/ease.d.ts +2 -2
  371. package/lib/utils/animator/index.d.ts +6 -6
  372. package/lib/utils/animator/interfaces/animator-params.d.ts +18 -18
  373. package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -13
  374. package/lib/utils/animator/interfaces/index.d.ts +3 -3
  375. package/lib/utils/animator/types/easing.d.ts +7 -7
  376. package/lib/utils/animator/types/index.d.ts +2 -2
  377. package/lib/utils/buffer-interpolation.d.ts +5 -5
  378. package/lib/utils/cmap.d.ts +16 -16
  379. package/lib/utils/debounce.d.ts +25 -25
  380. package/lib/utils/disposable-component.d.ts +15 -15
  381. package/lib/utils/event-emitter/event-emitter.d.ts +42 -42
  382. package/lib/utils/event-emitter/index.d.ts +4 -4
  383. package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +37 -37
  384. package/lib/utils/event-emitter/interfaces/index.d.ts +2 -2
  385. package/lib/utils/get-scroll-state-version.d.ts +1 -1
  386. package/lib/utils/get-selector-by-item-id.d.ts +2 -2
  387. package/lib/utils/index.d.ts +6 -6
  388. package/lib/utils/is-collapse-mode.d.ts +8 -8
  389. package/lib/utils/is-collection-mode.d.ts +8 -8
  390. package/lib/utils/is-direction.d.ts +8 -8
  391. package/lib/utils/is-persentage-value.d.ts +7 -7
  392. package/lib/utils/is-select-mode.d.ts +8 -8
  393. package/lib/utils/is-spreading-mode.d.ts +8 -8
  394. package/lib/utils/list-validators.d.ts +2 -2
  395. package/lib/utils/normalize-collection.d.ts +8 -8
  396. package/lib/utils/object.d.ts +4 -4
  397. package/lib/utils/parse-arithmetic-expression.d.ts +8 -8
  398. package/lib/utils/parse-float-or-persentage-value.d.ts +7 -7
  399. package/lib/utils/screen-reader-formatter.d.ts +7 -4
  400. package/lib/utils/scroll-event.d.ts +48 -48
  401. package/lib/utils/scrolling-direction.d.ts +17 -17
  402. package/lib/utils/snapping-method.d.ts +3 -3
  403. package/lib/utils/toggle-class-name.d.ts +7 -7
  404. package/lib/utils/validation.d.ts +35 -35
  405. package/package.json +11 -5
  406. package/public-api.d.ts +16 -16
  407. package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +0 -315
  408. package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +0 -200
  409. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +0 -279
  410. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +0 -94
  411. package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +0 -142
  412. package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +0 -198
  413. package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +0 -93
  414. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar-public.service.mjs +0 -25
  415. package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +0 -324
  416. package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +0 -262
  417. package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +0 -859
  418. package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +0 -17
  419. package/esm2022/lib/components/ng-scroll-view/utils/scroll-box.mjs +0 -45
  420. package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +0 -525
  421. package/esm2022/lib/components/ng-scroller/utils/scroll-box.mjs +0 -52
  422. package/esm2022/lib/core/cache-map.mjs +0 -101
  423. package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +0 -2
  424. package/esm2022/lib/core/track-box.mjs +0 -1353
  425. package/esm2022/lib/core/tracker.mjs +0 -207
  426. package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +0 -68
  427. package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +0 -67
  428. package/esm2022/lib/ng-virtual-list-public.service.mjs +0 -120
  429. package/esm2022/lib/ng-virtual-list.component.mjs +0 -3246
  430. package/esm2022/lib/ng-virtual-list.service.mjs +0 -431
  431. package/esm2022/lib/transformations/deck-of-cards-3d.mjs +0 -57
  432. package/esm2022/lib/transformations/deck-of-cards.mjs +0 -54
  433. package/esm2022/lib/transformations/event-horizon.mjs +0 -47
  434. package/esm2022/lib/transformations/linear.mjs +0 -47
  435. package/esm2022/lib/transformations/swipe-3d.mjs +0 -51
  436. package/esm2022/lib/utils/animator/animator.mjs +0 -78
  437. package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +0 -2
  438. package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +0 -2
  439. package/esm2022/lib/utils/animator/types/easing.mjs +0 -2
  440. package/esm2022/lib/utils/buffer-interpolation.mjs +0 -29
  441. package/esm2022/lib/utils/cmap.mjs +0 -34
  442. package/esm2022/lib/utils/debounce.mjs +0 -61
  443. package/esm2022/lib/utils/disposable-component.mjs +0 -27
  444. package/esm2022/lib/utils/event-emitter/event-emitter.mjs +0 -105
  445. package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +0 -2
  446. package/esm2022/lib/utils/get-scroll-state-version.mjs +0 -12
  447. package/esm2022/lib/utils/is-collapse-mode.mjs +0 -18
  448. package/esm2022/lib/utils/is-direction.mjs +0 -15
  449. package/esm2022/lib/utils/is-persentage-value.mjs +0 -14
  450. package/esm2022/lib/utils/is-select-mode.mjs +0 -18
  451. package/esm2022/lib/utils/list-validators.mjs +0 -27
  452. package/esm2022/lib/utils/normalize-collection.mjs +0 -42
  453. package/esm2022/lib/utils/object.mjs +0 -28
  454. package/esm2022/lib/utils/parse-arithmetic-expression.mjs +0 -53
  455. package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +0 -17
  456. package/esm2022/lib/utils/screen-reader-formatter.mjs +0 -43
  457. package/esm2022/lib/utils/scroll-event.mjs +0 -48
  458. package/esm2022/lib/utils/scrolling-direction.mjs +0 -29
  459. package/esm2022/lib/utils/toggle-class-name.mjs +0 -15
  460. package/fesm2022/ng-virtual-list.mjs.map +0 -1
@@ -0,0 +1,1352 @@
1
+ import { CACHE_BOX_CHANGE_EVENT_NAME, CacheMap } from "./cache-map";
2
+ import { Tracker } from "./tracker";
3
+ import { DEFAULT_DIVIDES, HEIGHT_PROP_NAME, SERVICE_PROP_DUMMY, SERVICE_PROP_DUMMY_ENABLED, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME, } from "../const";
4
+ import { debounce } from "../utils";
5
+ import { bufferInterpolation } from "../utils/buffer-interpolation";
6
+ import { objectAsReadonly } from "../utils/object";
7
+ import { getServiceIdProp } from "./utils";
8
+ import { DEFAULT_BUFFER_EXTREMUM_THRESHOLD, DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH, DEFAULT_RESET_BUFFER_SIZE_TIMEOUT, END_COLLECTION_PREFIX_ID, IS_NEW, START_COLLECTION_PREFIX_ID, } from "./const";
9
+ import { Z_INDEX_0, Z_INDEX_1, Z_INDEX_2, Z_INDEX_3, } from '../const';
10
+ import { TrackBoxEvents } from "./events";
11
+ import { ItemDisplayMethods } from "./enums";
12
+ import { Alignments } from "../enums";
13
+ /**
14
+ * An object that performs tracking, calculations and caching.
15
+ * @link https://github.com/DjonnyX/ng-virtual-list/blob/14.x/projects/ng-virtual-list/src/lib/core/track-box.ts
16
+ * @author Evgenii Alexandrovich Grebennikov
17
+ * @email djonnyx@gmail.com
18
+ */
19
+ export class TrackBox extends CacheMap {
20
+ constructor(trackingPropertyName) {
21
+ super();
22
+ this._scrollDirection = 0;
23
+ this._trackBy = TRACK_BY_PROPERTY_NAME;
24
+ this._divides = DEFAULT_DIVIDES;
25
+ this._isInfinity = false;
26
+ this._isSnappingMethodAdvanced = false;
27
+ this._isLazy = false;
28
+ this._trackingPropertyName = TRACK_BY_PROPERTY_NAME;
29
+ this._isScrollStart = false;
30
+ this._isScrollEnd = false;
31
+ this._isScrollSnapToStart = false;
32
+ this._isScrollSnapToEnd = false;
33
+ this._scrollStartOffset = 0;
34
+ this._scrollEndOffset = 0;
35
+ this._deletedItemsMap = {};
36
+ this._crudDetected = false;
37
+ this._previousTotalSize = 0;
38
+ this._deltaOfNewItems = 0;
39
+ this.isAdaptiveBuffer = true;
40
+ this._bufferSequenceExtraThreshold = DEFAULT_BUFFER_EXTREMUM_THRESHOLD;
41
+ this._maxBufferSequenceLength = DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH;
42
+ this._bufferSizeSequence = [];
43
+ this._bufferSize = 0;
44
+ this._defaultBufferSize = 0;
45
+ this._maxBufferSize = this._defaultBufferSize;
46
+ this._resetBufferSizeTimeout = DEFAULT_RESET_BUFFER_SIZE_TIMEOUT;
47
+ this._isReseted = true;
48
+ this._prerenderedCache = null;
49
+ this._newItems = [];
50
+ this._previousScrollSize = 0;
51
+ this._debouncedIsScrollStartOff = debounce(() => {
52
+ this._isScrollStart = false;
53
+ });
54
+ this._trackingPropertyName = trackingPropertyName;
55
+ this.initialize();
56
+ }
57
+ set items(v) {
58
+ if (this._items === v) {
59
+ return;
60
+ }
61
+ this._items = v;
62
+ }
63
+ set displayComponents(v) {
64
+ if (this._displayComponents === v) {
65
+ return;
66
+ }
67
+ this._displayComponents = v;
68
+ }
69
+ set snappedDisplayComponents(v) {
70
+ if (this._snappedDisplayComponents === v) {
71
+ return;
72
+ }
73
+ this._snappedDisplayComponents = v;
74
+ }
75
+ set scrollDirection(v) {
76
+ if (this._scrollDirection === v) {
77
+ return;
78
+ }
79
+ this._scrollDirection = v;
80
+ }
81
+ get scrollDirection() { return this._scrollDirection; }
82
+ set trackBy(v) {
83
+ if (this._trackBy === v) {
84
+ return;
85
+ }
86
+ this._trackBy = v;
87
+ }
88
+ get trackBy() { return this._trackBy; }
89
+ set divides(v) {
90
+ if (this._divides === v) {
91
+ return;
92
+ }
93
+ this._divides = v;
94
+ }
95
+ set isInfinity(v) {
96
+ if (this._isInfinity === v) {
97
+ return;
98
+ }
99
+ this._isInfinity = v;
100
+ }
101
+ set isSnappingMethodAdvanced(v) {
102
+ if (this._isSnappingMethodAdvanced === v) {
103
+ return;
104
+ }
105
+ this._isSnappingMethodAdvanced = v;
106
+ }
107
+ set isLazy(v) {
108
+ if (this._isLazy === v) {
109
+ return;
110
+ }
111
+ this._isLazy = v;
112
+ }
113
+ /**
114
+ * Set the trackBy property
115
+ */
116
+ set trackingPropertyName(v) {
117
+ this._trackingPropertyName = this._tracker.trackingPropertyName = v;
118
+ }
119
+ set isScrollStart(v) {
120
+ this._isScrollStart = v;
121
+ if (v) {
122
+ this._isScrollSnapToStart = true;
123
+ }
124
+ }
125
+ set isScrollEnd(v) {
126
+ this._isScrollEnd = v;
127
+ if (v) {
128
+ this._isScrollSnapToEnd = true;
129
+ }
130
+ }
131
+ get isSnappedToStart() {
132
+ return this._isScrollStart || this._isScrollSnapToStart;
133
+ }
134
+ get isSnappedToEnd() {
135
+ return this._isScrollEnd || this._isScrollSnapToEnd;
136
+ }
137
+ set scrollStartOffset(v) {
138
+ this._scrollStartOffset = v;
139
+ }
140
+ get scrollStartOffset() {
141
+ return this._scrollStartOffset;
142
+ }
143
+ set scrollEndOffset(v) {
144
+ this._scrollEndOffset = v;
145
+ }
146
+ get scrollEndOffset() {
147
+ return this._scrollEndOffset;
148
+ }
149
+ initialize() {
150
+ this._tracker = new Tracker(this._trackingPropertyName);
151
+ }
152
+ set(id, cache) {
153
+ if (this._map.has(id)) {
154
+ const b = this._map.get(id);
155
+ if (b?.width === cache.width && b?.height === cache.height) {
156
+ return this._map;
157
+ }
158
+ }
159
+ const v = this._map.set(id, cache);
160
+ this.bumpVersion();
161
+ return v;
162
+ }
163
+ get crudDetected() { return this._crudDetected; }
164
+ fireChangeIfNeed() {
165
+ if (this.changesDetected()) {
166
+ this.dispatch(TrackBoxEvents.CHANGE, this._version);
167
+ }
168
+ }
169
+ fireTick() {
170
+ this.dispatch(TrackBoxEvents.TICK);
171
+ }
172
+ get deltaOfNewItems() { return this._deltaOfNewItems; }
173
+ get bufferSize() { return this._bufferSize; }
174
+ lifeCircle() {
175
+ this.fireChangeIfNeed();
176
+ this.fireTick();
177
+ this.lifeCircleDo();
178
+ }
179
+ /**
180
+ * Scans the collection for deleted items and flushes the deleted item cache.
181
+ */
182
+ resetCollection(currentCollection, itemSize) {
183
+ if (currentCollection !== undefined && currentCollection !== null &&
184
+ currentCollection === this._previousCollection) {
185
+ console.warn('Attention! The collection must be immutable.');
186
+ return;
187
+ }
188
+ const reseted = ((!this._previousCollection || this._previousCollection.length === 0) &&
189
+ (!!currentCollection && currentCollection.length > 0));
190
+ this._isReseted = reseted;
191
+ this.updateCache(this._previousCollection, currentCollection, itemSize);
192
+ this._previousCollection = [...(currentCollection || [])];
193
+ }
194
+ /**
195
+ * Update the cache of items from the list
196
+ */
197
+ updateCache(previousCollection, currentCollection, itemSize) {
198
+ const trackBy = this._trackingPropertyName;
199
+ let crudDetected = false;
200
+ this._newItems = [];
201
+ if (!currentCollection || currentCollection.length === 0) {
202
+ if (previousCollection) {
203
+ // deleted
204
+ for (let i = 0, l = previousCollection.length; i < l; i++) {
205
+ const item = previousCollection[i], id = item?.[trackBy];
206
+ crudDetected = true;
207
+ if (!!item && this._map.has(id)) {
208
+ this._map.delete(id);
209
+ }
210
+ }
211
+ }
212
+ return;
213
+ }
214
+ if (!previousCollection || previousCollection.length === 0) {
215
+ if (currentCollection) {
216
+ // added
217
+ for (let i = 0, l = currentCollection.length; i < l; i++) {
218
+ crudDetected = true;
219
+ const item = currentCollection[i], id = item?.[trackBy];
220
+ if (!!item) {
221
+ this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
222
+ }
223
+ }
224
+ }
225
+ return;
226
+ }
227
+ const collectionDict = {};
228
+ for (let i = 0, l = currentCollection.length; i < l; i++) {
229
+ const item = currentCollection[i];
230
+ if (!!item) {
231
+ collectionDict[item[trackBy]] = item;
232
+ }
233
+ }
234
+ const notChangedMap = {}, deletedMap = {}, deletedItemsMap = {}, updatedMap = {};
235
+ for (let i = 0, l = previousCollection.length; i < l; i++) {
236
+ const item = previousCollection[i], id = item?.[trackBy];
237
+ if (!!item) {
238
+ if (collectionDict.hasOwnProperty(id)) {
239
+ if (item === collectionDict[id]) {
240
+ // not changed
241
+ notChangedMap[item[trackBy]] = item;
242
+ this._map.set(id, {
243
+ ...(this._map.get(id) || { width: itemSize, height: itemSize }),
244
+ method: ItemDisplayMethods.NOT_CHANGED
245
+ });
246
+ continue;
247
+ }
248
+ else {
249
+ // updated
250
+ crudDetected = true;
251
+ updatedMap[item[trackBy]] = item;
252
+ this._map.set(id, {
253
+ ...(this._map.get(id) || { width: itemSize, height: itemSize }),
254
+ method: ItemDisplayMethods.UPDATE
255
+ });
256
+ continue;
257
+ }
258
+ }
259
+ // deleted
260
+ crudDetected = true;
261
+ deletedMap[id] = item;
262
+ deletedItemsMap[i] = this._map.get(id);
263
+ this._map.delete(id);
264
+ }
265
+ }
266
+ for (let i = 0, l = currentCollection.length; i < l; i++) {
267
+ const item = currentCollection[i], id = item?.[trackBy];
268
+ if (!!item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) &&
269
+ !notChangedMap.hasOwnProperty(id)) {
270
+ this._newItems.push(id);
271
+ // added
272
+ crudDetected = true;
273
+ this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
274
+ }
275
+ }
276
+ this._crudDetected = crudDetected;
277
+ this._deletedItemsMap = deletedItemsMap;
278
+ }
279
+ /**
280
+ * Finds the position of a collection element by the given Id
281
+ */
282
+ getItemPosition(id, itemConfigMap, options) {
283
+ const opt = { fromItemId: id ?? options.fromItemId, itemConfigMap, ...options };
284
+ this._defaultBufferSize = opt.bufferSize;
285
+ this._maxBufferSize = opt.maxBufferSize;
286
+ const { scrollSize, isFromItemIdFound } = this.recalculateMetrics({
287
+ ...opt,
288
+ dynamicSize: this._crudDetected || opt.dynamicSize,
289
+ previousTotalSize: this._previousTotalSize,
290
+ crudDetected: this._crudDetected,
291
+ deletedItemsMap: this._deletedItemsMap,
292
+ });
293
+ return isFromItemIdFound ? scrollSize : -1;
294
+ }
295
+ preventScrollSnapping(clearBuffer = false) {
296
+ this._isScrollStart = this._isScrollEnd = false;
297
+ if (clearBuffer) {
298
+ this._isScrollSnapToStart = this._isScrollSnapToEnd = false;
299
+ }
300
+ }
301
+ /**
302
+ * Updates the collection of display objects
303
+ */
304
+ getMetrics(items, itemConfigMap, options) {
305
+ const opt = { itemConfigMap, ...options }, crudDetected = this._crudDetected, deletedItemsMap = this._deletedItemsMap;
306
+ this._defaultBufferSize = opt.bufferSize;
307
+ this._maxBufferSize = opt.maxBufferSize;
308
+ const metrics = this.recalculateMetrics({
309
+ ...opt,
310
+ collection: items,
311
+ previousTotalSize: this._previousTotalSize,
312
+ crudDetected: this._crudDetected,
313
+ deletedItemsMap,
314
+ });
315
+ return { totalSize: metrics.totalSize, delta: metrics.delta, crudDetected };
316
+ }
317
+ /**
318
+ * Updates the collection of display objects
319
+ */
320
+ updateCollection(items, itemConfigMap, options) {
321
+ const opt = { itemConfigMap, ...options }, dynamicSize = opt.dynamicSize, crudDetected = this._crudDetected, deletedItemsMap = this._deletedItemsMap;
322
+ if (dynamicSize) {
323
+ this.cacheElements(opt.isVertical, opt.itemSize);
324
+ }
325
+ this._defaultBufferSize = opt.bufferSize;
326
+ this._maxBufferSize = opt.maxBufferSize;
327
+ const metrics = this.recalculateMetrics({
328
+ ...opt,
329
+ collection: items,
330
+ previousTotalSize: this._previousTotalSize,
331
+ crudDetected: this._crudDetected,
332
+ deletedItemsMap,
333
+ });
334
+ this._delta += metrics.delta;
335
+ this.updateAdaptiveBufferParams(metrics, items.length);
336
+ this._previousTotalSize = metrics.totalSize;
337
+ this._deletedItemsMap = {};
338
+ this._crudDetected = false;
339
+ if (opt.dynamicSize) {
340
+ this.snapshot();
341
+ }
342
+ const displayItems = this.generateDisplayCollection(metrics.items, items, itemConfigMap, { ...metrics, });
343
+ return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected, leftLayoutOffset: metrics.leftLayoutOffset };
344
+ }
345
+ updateAdaptiveBufferParams(metrics, totalItemsLength) {
346
+ this.disposeClearBufferSizeTimer();
347
+ const scrollSize = metrics.scrollSize + this._delta, delta = Math.abs(this._previousScrollSize - scrollSize);
348
+ this._previousScrollSize = scrollSize;
349
+ const bufferRawSize = Math.min(Math.floor(metrics.typicalItemSize !== 0 ? delta / metrics.typicalItemSize : 0) * 5, totalItemsLength), minBufferSize = bufferRawSize < this._defaultBufferSize ? this._defaultBufferSize : bufferRawSize, bufferValue = minBufferSize > this._maxBufferSize ? this._maxBufferSize : minBufferSize;
350
+ this._bufferSize = bufferInterpolation(this._bufferSize, this._bufferSizeSequence, bufferValue, {
351
+ extremumThreshold: this._bufferSequenceExtraThreshold,
352
+ bufferSize: this._maxBufferSequenceLength,
353
+ });
354
+ this.startResetBufferSizeTimer();
355
+ }
356
+ startResetBufferSizeTimer() {
357
+ this._resetBufferSizeTimer = setTimeout(() => {
358
+ this._bufferSize = this._defaultBufferSize;
359
+ this._bufferSizeSequence = [];
360
+ }, this._resetBufferSizeTimeout);
361
+ }
362
+ disposeClearBufferSizeTimer() {
363
+ clearTimeout(this._resetBufferSizeTimer);
364
+ }
365
+ /**
366
+ * Calculates the entry into the overscroll area and returns the number of overscroll elements
367
+ */
368
+ getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical, indexOffset = 0, reverse = false) {
369
+ const trackBy = this._trackingPropertyName, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;
370
+ let offset = 0, num = 0;
371
+ for (let j = collection.length - indexOffset - 1; reverse ? j >= 0 : j >= i; j--) {
372
+ const item = collection[j], id = item[trackBy];
373
+ let itemSize = 0;
374
+ if (map.has(id)) {
375
+ const cache = map.get(id);
376
+ itemSize = cache && cache[sizeProperty] > 0 ? cache[sizeProperty] : typicalItemSize;
377
+ }
378
+ else {
379
+ itemSize = typicalItemSize;
380
+ }
381
+ if (offset + itemSize > size) {
382
+ return { num, offset };
383
+ }
384
+ offset += itemSize;
385
+ num++;
386
+ }
387
+ return { num, offset };
388
+ }
389
+ /**
390
+ * Calculates list metrics
391
+ */
392
+ recalculateMetrics(options) {
393
+ const { alignment, fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, minItemSize, maxItemSize, bufferSize: minBufferSize, scrollSize, stickyEnabled, itemConfigMap, enabledBufferOptimization, previousTotalSize, snapToItem, snapToItemAlign, deletedItemsMap, itemTransform } = options, roundedScrollSize = Math.round(scrollSize);
394
+ const trackBy = this._trackingPropertyName, bufferSize = Math.max(minBufferSize, this._bufferSize), { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, totalLength = collection.length, typicalItemSize = itemSize, w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height, map = this._map, snapshot = this._snapshot, divides = this._divides, stickyPos = Math.floor(scrollSize) + this._scrollStartOffset, leftItemsOrRowsWeights = [], isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)
395
+ || (typeof fromItemId === 'string' && fromItemId > '-1');
396
+ let leftItemsOffset = 0, rightItemsOffset = 0;
397
+ if (enabledBufferOptimization) {
398
+ switch (this._scrollDirection) {
399
+ case 1: {
400
+ leftItemsOffset = 0;
401
+ rightItemsOffset = bufferSize * divides;
402
+ break;
403
+ }
404
+ case -1: {
405
+ leftItemsOffset = bufferSize * divides;
406
+ rightItemsOffset = 0;
407
+ break;
408
+ }
409
+ case 0:
410
+ default: {
411
+ leftItemsOffset = rightItemsOffset = bufferSize * divides;
412
+ }
413
+ }
414
+ }
415
+ else {
416
+ leftItemsOffset = rightItemsOffset = bufferSize * divides;
417
+ }
418
+ let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, deltaOfNewItems = 0, leftSizeOfAddedItems = 0, leftSizeOfUpdatedItems = 0, leftSizeOfDeletedItems = 0, itemById = null, itemByIdPos = this._scrollStartOffset, isTargetInOverscroll = false, actualScrollSize = itemByIdPos, totalSize = this._scrollStartOffset + this._scrollEndOffset, startIndex, isFromItemIdFound = false, deltaFromStartCreation = 0, isUpdating = false, leftYOffset = 0, leftLayoutOffset = 0, leftLayoutIndexOffset = 0, rightLayoutIndexOffset = 0;
419
+ const isStart = ((roundedScrollSize === 0) || this.isSnappedToStart);
420
+ let stickyItemId, isNew = false;
421
+ let items;
422
+ // If the list is dynamic or there are new elements in the collection, then it switches to the long algorithm.
423
+ if (dynamicSize) {
424
+ items = [];
425
+ const serviceIdProp = getServiceIdProp(trackBy);
426
+ if (isFromId) {
427
+ for (let stickyId = undefined, i = 0, l = collection.length; i < l; i++) {
428
+ const item = collection[i], id = item?.[trackBy];
429
+ if (itemConfigMap[id]?.sticky === 1) {
430
+ stickyId = id;
431
+ }
432
+ if (!itemConfigMap[id]?.sticky) {
433
+ stickyItemId = stickyId;
434
+ }
435
+ if (id == fromItemId) {
436
+ break;
437
+ }
438
+ }
439
+ }
440
+ let y = this._scrollStartOffset, stickyComponentSize = 0, row = {
441
+ startItemIndex: 0,
442
+ endItemIndex: 0,
443
+ size: 0,
444
+ snapshotSize: 0,
445
+ deltaFromStartCreation: 0,
446
+ leftSizeOfAddedItems: 0,
447
+ leftSizeOfUpdatedItems: 0,
448
+ leftSizeOfDeletedItems: 0,
449
+ deltaOfNewItems: 0,
450
+ leftItemsOrRowsWeights: null,
451
+ rightItemsWeight: 0,
452
+ leftHiddenItemsWeight: 0,
453
+ totalItemsToDisplayEndWeight: 0,
454
+ };
455
+ const calculate = (i, l, li, isPrecollection = false, idPrefix = null) => {
456
+ const ii = i + 1;
457
+ if (ii > l) {
458
+ return false;
459
+ }
460
+ const collectionItem = collection[i], id = collectionItem[trackBy], sticky = itemConfigMap?.[id]?.sticky ?? 0, isNewRow = i % divides === 0, isLastItemInRow = ii % divides === 0, isLastItem = i === li, isRowEnd = (isLastItemInRow || (!isLastItemInRow && isLastItem));
461
+ items.push(isPrecollection ? { ...collectionItem, [serviceIdProp]: `_${idPrefix}-${id}_` } : collectionItem);
462
+ if (isNewRow || row === null) {
463
+ row = {
464
+ startItemIndex: i + 1,
465
+ endItemIndex: i + divides,
466
+ size: 0,
467
+ snapshotSize: 0,
468
+ deltaFromStartCreation: 0,
469
+ leftSizeOfAddedItems: 0,
470
+ leftSizeOfUpdatedItems: 0,
471
+ leftSizeOfDeletedItems: 0,
472
+ deltaOfNewItems: 0,
473
+ leftItemsOrRowsWeights: null,
474
+ rightItemsWeight: 0,
475
+ leftHiddenItemsWeight: 0,
476
+ totalItemsToDisplayEndWeight: 0,
477
+ };
478
+ }
479
+ let componentSize = 0, rowSizeDelta = 0, itemDisplayMethod = ItemDisplayMethods.NOT_CHANGED;
480
+ if (map.has(id)) {
481
+ const cache = map.get(id);
482
+ componentSize = cache[sizeProperty] > 0 ? cache[sizeProperty] : typicalItemSize;
483
+ itemDisplayMethod = cache?.method ?? ItemDisplayMethods.UPDATE;
484
+ const isItemNew = this._newItems.indexOf(id) > -1 || (this._isLazy && isStart && !this._isReseted);
485
+ isNew = isItemNew;
486
+ if (isNew) {
487
+ isUpdating = true;
488
+ }
489
+ const snapshotBounds = snapshot.get(id), snapshotSize = snapshotBounds ? snapshotBounds[sizeProperty] : typicalItemSize;
490
+ row.size = Math.max(row.size, componentSize);
491
+ row.snapshotSize = Math.max(row.snapshotSize, snapshotSize);
492
+ rowSizeDelta = row.size - row.snapshotSize;
493
+ switch (itemDisplayMethod) {
494
+ case ItemDisplayMethods.UPDATE: {
495
+ map.set(id, { ...cache, method: isNew ? ItemDisplayMethods.UPDATE : ItemDisplayMethods.NOT_CHANGED, [IS_NEW]: isNew });
496
+ if (isRowEnd && isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
497
+ row.deltaFromStartCreation = rowSizeDelta;
498
+ rowSizeDelta = 0;
499
+ }
500
+ break;
501
+ }
502
+ case ItemDisplayMethods.CREATE: {
503
+ rowSizeDelta = typicalItemSize;
504
+ map.set(id, { ...cache, method: ItemDisplayMethods.UPDATE, [IS_NEW]: isNew });
505
+ if (isRowEnd && isNew && y <= (scrollSize + size + deltaFromStartCreation + componentSize)) {
506
+ row.deltaFromStartCreation = rowSizeDelta;
507
+ rowSizeDelta = 0;
508
+ }
509
+ break;
510
+ }
511
+ }
512
+ }
513
+ else {
514
+ componentSize = typicalItemSize;
515
+ row.size = Math.max(row.size, componentSize);
516
+ row.snapshotSize = row.size;
517
+ rowSizeDelta = row.size - row.snapshotSize;
518
+ }
519
+ if (deletedItemsMap.hasOwnProperty(i)) {
520
+ const cache = deletedItemsMap[i], size = cache?.[sizeProperty] ?? typicalItemSize;
521
+ if (y < scrollSize + this._scrollStartOffset - size) {
522
+ row.leftSizeOfDeletedItems = Math.max(row.leftSizeOfDeletedItems, size);
523
+ }
524
+ }
525
+ if (isFromId) {
526
+ if (itemById === null) {
527
+ if (id != fromItemId && id === stickyItemId && sticky === 1) {
528
+ stickyComponentSize = componentSize;
529
+ y -= stickyComponentSize;
530
+ }
531
+ if (id == fromItemId) {
532
+ isFromItemIdFound = true;
533
+ if (alignment !== Alignments.CENTER) {
534
+ const { num, offset } = this.getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical), leftViewportSize = size - offset;
535
+ if (leftViewportSize > 0) {
536
+ const { num: num1, offset: offset1 } = this.getElementNumToEnd(i + num, collection, map, typicalItemSize, size, isVertical, 0, true), deltaNum = (num1 - num), deltaOffset = (offset1 - offset);
537
+ totalItemsToDisplayEndWeight += offset;
538
+ itemsFromStartToScrollEnd -= deltaNum;
539
+ rightItemsWeight = rightItemLength = 0;
540
+ leftHiddenItemsWeight -= deltaOffset;
541
+ leftItemsOrRowsWeights.splice(leftItemsOrRowsWeights.length - deltaNum, deltaNum);
542
+ y -= deltaOffset;
543
+ }
544
+ }
545
+ itemById = collectionItem;
546
+ itemByIdPos = y;
547
+ }
548
+ else {
549
+ leftItemsOrRowsWeights.push(componentSize);
550
+ leftHiddenItemsWeight += componentSize;
551
+ itemsFromStartToScrollEnd = row.startItemIndex;
552
+ }
553
+ }
554
+ }
555
+ else if (y <= scrollSize - componentSize) {
556
+ if (row.leftItemsOrRowsWeights === null) {
557
+ row.leftItemsOrRowsWeights = 0;
558
+ }
559
+ row.leftItemsOrRowsWeights = Math.max(row.leftItemsOrRowsWeights, componentSize);
560
+ row.leftHiddenItemsWeight = Math.max(row.leftHiddenItemsWeight, componentSize);
561
+ if (!isPrecollection) {
562
+ itemsFromStartToScrollEnd = row.startItemIndex;
563
+ }
564
+ }
565
+ if (isFromId) {
566
+ if (itemById === null || y < itemByIdPos + size + componentSize) {
567
+ itemsFromStartToDisplayEnd = row.endItemIndex;
568
+ totalItemsToDisplayEndWeight += componentSize;
569
+ itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
570
+ }
571
+ }
572
+ else if (y <= scrollSize + size + componentSize) {
573
+ if (!isPrecollection) {
574
+ itemsFromStartToDisplayEnd = row.endItemIndex;
575
+ itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
576
+ }
577
+ row.totalItemsToDisplayEndWeight = Math.max(row.totalItemsToDisplayEndWeight, componentSize);
578
+ if (isRowEnd && y <= scrollSize + componentSize) {
579
+ switch (itemDisplayMethod) {
580
+ case ItemDisplayMethods.CREATE: {
581
+ row.leftSizeOfAddedItems = rowSizeDelta;
582
+ break;
583
+ }
584
+ case ItemDisplayMethods.UPDATE:
585
+ case ItemDisplayMethods.NOT_CHANGED: {
586
+ row.leftSizeOfUpdatedItems = rowSizeDelta;
587
+ break;
588
+ }
589
+ case ItemDisplayMethods.DELETE: {
590
+ row.leftSizeOfDeletedItems = rowSizeDelta;
591
+ break;
592
+ }
593
+ }
594
+ }
595
+ if (isRowEnd && itemDisplayMethod === ItemDisplayMethods.CREATE) {
596
+ row.deltaOfNewItems = rowSizeDelta;
597
+ }
598
+ }
599
+ else {
600
+ if (isRowEnd && i < itemsFromDisplayEndToOffsetEnd) {
601
+ row.rightItemsWeight = Math.max(row.rightItemsWeight, componentSize);
602
+ }
603
+ }
604
+ if (isRowEnd) {
605
+ if (!isPrecollection) {
606
+ deltaFromStartCreation += row.deltaFromStartCreation;
607
+ leftSizeOfAddedItems += row.leftSizeOfAddedItems;
608
+ leftSizeOfUpdatedItems += row.leftSizeOfUpdatedItems;
609
+ leftSizeOfDeletedItems += row.leftSizeOfDeletedItems;
610
+ deltaOfNewItems += row.deltaOfNewItems;
611
+ rightItemsWeight += row.rightItemsWeight;
612
+ totalItemsToDisplayEndWeight += row.totalItemsToDisplayEndWeight;
613
+ leftHiddenItemsWeight += row.leftHiddenItemsWeight;
614
+ if (row.leftItemsOrRowsWeights !== null) {
615
+ leftItemsOrRowsWeights.push(row.leftItemsOrRowsWeights);
616
+ }
617
+ }
618
+ totalSize += row.size;
619
+ y += row.size;
620
+ }
621
+ return true;
622
+ };
623
+ if (this._isInfinity) {
624
+ const viewportSize = isVertical ? height : width;
625
+ let buffSize = -1;
626
+ if (scrollSize <= viewportSize) {
627
+ let i = 0, l = collection.length, li = l > 0 ? (l - 1) : 0;
628
+ if (l > 0) {
629
+ const limit = viewportSize;
630
+ while (y <= limit || buffSize > -1) {
631
+ const ii = i + 1;
632
+ if (buffSize === -1) {
633
+ buffSize = leftItemsOffset;
634
+ }
635
+ if (y >= limit) {
636
+ buffSize--;
637
+ }
638
+ if (!calculate(li - i, l, li, true, START_COLLECTION_PREFIX_ID)) {
639
+ break;
640
+ }
641
+ if (ii === l) {
642
+ i = 0;
643
+ }
644
+ else {
645
+ i++;
646
+ }
647
+ }
648
+ items.reverse();
649
+ leftYOffset = y;
650
+ leftLayoutOffset = viewportSize * .5;
651
+ leftLayoutIndexOffset = i;
652
+ y = this._scrollStartOffset;
653
+ totalSize = this._scrollStartOffset + this._scrollEndOffset;
654
+ itemsFromStartToDisplayEnd = itemsFromDisplayEndToOffsetEnd = 0;
655
+ row = null;
656
+ }
657
+ }
658
+ }
659
+ for (let i = 0, l = collection.length, li = l - 1; i < l; i++) {
660
+ if (!calculate(i, l, li)) {
661
+ break;
662
+ }
663
+ }
664
+ if (this._isInfinity) {
665
+ row = null;
666
+ const yy = y, currentTotalSize = totalSize, viewportSize = isVertical ? height : width, normalizedTotalSize = totalSize + viewportSize;
667
+ row = {
668
+ startItemIndex: 0,
669
+ endItemIndex: 0,
670
+ size: 0,
671
+ snapshotSize: 0,
672
+ deltaFromStartCreation: 0,
673
+ leftSizeOfAddedItems: 0,
674
+ leftSizeOfUpdatedItems: 0,
675
+ leftSizeOfDeletedItems: 0,
676
+ deltaOfNewItems: 0,
677
+ leftItemsOrRowsWeights: null,
678
+ rightItemsWeight: 0,
679
+ leftHiddenItemsWeight: 0,
680
+ totalItemsToDisplayEndWeight: 0,
681
+ };
682
+ const l = collection.length, li = l - 1;
683
+ let i = 0, count = 0;
684
+ while (y < normalizedTotalSize) {
685
+ const ii = i + 1;
686
+ if (!calculate(i, l, li, true, END_COLLECTION_PREFIX_ID)) {
687
+ break;
688
+ }
689
+ if (ii === l) {
690
+ i = 0;
691
+ }
692
+ else {
693
+ i++;
694
+ }
695
+ count++;
696
+ }
697
+ y = yy;
698
+ totalSize = currentTotalSize;
699
+ rightLayoutIndexOffset = count;
700
+ }
701
+ actualScrollSize = (isFromId ? itemByIdPos : scrollSize);
702
+ if (itemsFromStartToScrollEnd <= -1) {
703
+ itemsFromStartToScrollEnd = 0;
704
+ }
705
+ if (itemsFromStartToDisplayEnd <= -1) {
706
+ itemsFromStartToDisplayEnd = 0;
707
+ }
708
+ leftItemsOrRowsWeights.splice(0, leftItemsOrRowsWeights.length - bufferSize);
709
+ leftItemsOrRowsWeights.forEach(v => {
710
+ leftItemsWeight += v;
711
+ });
712
+ leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);
713
+ rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength
714
+ ? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;
715
+ startIndex = (Math.ceil(Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0) / divides) * divides);
716
+ }
717
+ else
718
+ // Buffer optimization does not work on fast linear algorithm
719
+ {
720
+ const dividedTypicalItemSize = typicalItemSize / divides, bufferItemNumbers = bufferSize * divides;
721
+ itemsFromStartToScrollEnd = Math.floor(dividedTypicalItemSize !== 0 ? (scrollSize / dividedTypicalItemSize) : 0);
722
+ itemsFromStartToDisplayEnd = Math.ceil(dividedTypicalItemSize !== 0 ? ((scrollSize + size) / dividedTypicalItemSize) : 0);
723
+ leftItemLength = Math.min(itemsFromStartToScrollEnd, bufferSize * divides);
724
+ rightItemLength = (itemsFromStartToDisplayEnd + bufferItemNumbers) > totalLength
725
+ ? totalLength - itemsFromStartToDisplayEnd : bufferItemNumbers;
726
+ leftItemsWeight = Math.floor(leftItemLength * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
727
+ rightItemsWeight = Math.floor(rightItemLength * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
728
+ leftHiddenItemsWeight = Math.floor(itemsFromStartToScrollEnd * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
729
+ totalItemsToDisplayEndWeight = Math.floor(itemsFromStartToDisplayEnd * dividedTypicalItemSize / typicalItemSize) * typicalItemSize;
730
+ totalSize = (Math.ceil(totalLength / divides) * divides * dividedTypicalItemSize) + this._scrollStartOffset + this._scrollEndOffset;
731
+ const k = totalSize !== 0 ? previousTotalSize / totalSize : 0;
732
+ if (isFromId) {
733
+ const index = collection.findIndex(item => item[trackBy] == fromItemId);
734
+ if (index > -1) {
735
+ itemByIdPos = this._scrollStartOffset + Math.floor(index * dividedTypicalItemSize / divides);
736
+ isFromItemIdFound = true;
737
+ }
738
+ }
739
+ actualScrollSize = (isFromId ? itemByIdPos : scrollSize * k);
740
+ items = [];
741
+ if (this._isInfinity) {
742
+ const viewportSize = isVertical ? height : width;
743
+ let buffSize = -1, y = this._scrollStartOffset;
744
+ if (scrollSize <= viewportSize) {
745
+ let i = 0, l = collection.length, li = l > 0 ? (l - 1) : 0;
746
+ if (l > 0) {
747
+ const limit = viewportSize;
748
+ while (y <= limit || buffSize > -1) {
749
+ const ii = i + 1;
750
+ if (buffSize === -1) {
751
+ buffSize = leftItemsOffset;
752
+ }
753
+ if (y >= limit) {
754
+ buffSize--;
755
+ }
756
+ const itemIndex = li - i;
757
+ if (collection.length > itemIndex) {
758
+ items.push(collection[itemIndex]);
759
+ }
760
+ else {
761
+ break;
762
+ }
763
+ const isLastItemInRow = ii % divides === 0, isLastItem = i === li;
764
+ if (isLastItemInRow || (!isLastItemInRow && isLastItem)) {
765
+ y += dividedTypicalItemSize;
766
+ }
767
+ if (ii === l) {
768
+ i = 0;
769
+ }
770
+ else {
771
+ i++;
772
+ }
773
+ }
774
+ items.reverse();
775
+ leftYOffset = y;
776
+ leftLayoutOffset = viewportSize * .5;
777
+ leftLayoutIndexOffset = i;
778
+ }
779
+ }
780
+ }
781
+ items.push(...collection);
782
+ if (this._isInfinity) {
783
+ let y = Math.floor(totalSize / dividedTypicalItemSize) * dividedTypicalItemSize;
784
+ const viewportSize = isVertical ? height : width, normalizedTotalSize = totalSize + viewportSize;
785
+ const l = collection.length, li = l - 1;
786
+ let i = 0, count = 0;
787
+ while (y < normalizedTotalSize) {
788
+ const ii = i + 1;
789
+ if (collection.length <= i) {
790
+ break;
791
+ }
792
+ items.push(collection[i]);
793
+ const isLastItemInRow = ii % divides === 0, isLastItem = i === li;
794
+ if (isLastItemInRow || (!isLastItemInRow && isLastItem)) {
795
+ y += dividedTypicalItemSize;
796
+ }
797
+ if (ii === l) {
798
+ i = 0;
799
+ }
800
+ else {
801
+ i++;
802
+ }
803
+ count++;
804
+ }
805
+ rightLayoutIndexOffset = count;
806
+ leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);
807
+ rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength
808
+ ? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;
809
+ startIndex = (Math.ceil(Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0) / divides) * divides);
810
+ }
811
+ else {
812
+ startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);
813
+ }
814
+ }
815
+ const itemsOnDisplayWeight = totalItemsToDisplayEndWeight - leftItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd, startPosition = this._scrollStartOffset + leftHiddenItemsWeight - leftItemsWeight - leftYOffset, renderItems = (Math.ceil((itemsOnDisplayLength + leftItemLength + rightItemLength) / divides) * divides) + rightLayoutIndexOffset, startCreationDelta = deltaFromStartCreation > 0 ? deltaFromStartCreation : 0, delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems + startCreationDelta;
816
+ this._deltaOfNewItems = deltaOfNewItems;
817
+ if (isFromId && !isTargetInOverscroll) {
818
+ actualScrollSize -= this._scrollStartOffset;
819
+ }
820
+ const metrics = {
821
+ delta,
822
+ normalizedItemWidth: w,
823
+ normalizedItemHeight: h,
824
+ width,
825
+ height,
826
+ dynamicSize,
827
+ divides,
828
+ itemSize,
829
+ minItemSize,
830
+ maxItemSize,
831
+ items,
832
+ itemsFromStartToScrollEnd,
833
+ itemsFromStartToDisplayEnd,
834
+ itemsOnDisplayWeight,
835
+ itemsOnDisplayLength,
836
+ isVertical,
837
+ leftHiddenItemsWeight,
838
+ leftItemLength,
839
+ leftItemsWeight,
840
+ leftLayoutOffset,
841
+ leftLayoutIndexOffset,
842
+ renderItems,
843
+ rightItemLength,
844
+ rightItemsWeight,
845
+ scrollSize: actualScrollSize,
846
+ leftSizeOfAddedItems,
847
+ sizeProperty,
848
+ stickyEnabled,
849
+ stickyPos,
850
+ startIndex,
851
+ startPosition,
852
+ totalItemsToDisplayEndWeight,
853
+ totalLength,
854
+ totalSize,
855
+ typicalItemSize,
856
+ isFromItemIdFound,
857
+ isUpdating,
858
+ snapToItem,
859
+ snapToItemAlign,
860
+ itemTransform,
861
+ };
862
+ return metrics;
863
+ }
864
+ refreshCache(cache) {
865
+ this._prerenderedCache = cache;
866
+ }
867
+ clearDelta() {
868
+ this._delta = this._deltaOfNewItems = 0;
869
+ }
870
+ changes(immediately = false, force = false) {
871
+ if (immediately) {
872
+ if (force) {
873
+ this.bumpVersion();
874
+ }
875
+ this._previousVersion = this._version;
876
+ this.dispatch(CACHE_BOX_CHANGE_EVENT_NAME, this.version);
877
+ }
878
+ else {
879
+ if (force) {
880
+ this.bumpVersion();
881
+ return;
882
+ }
883
+ if (this.changesDetected()) {
884
+ return;
885
+ }
886
+ this.bumpVersion();
887
+ }
888
+ }
889
+ /**
890
+ * Returns true if the bounds of at least one screen object have changed.
891
+ */
892
+ checkBoundsOfElements() {
893
+ if (!this._displayComponents) {
894
+ return false;
895
+ }
896
+ for (let i = 0, l = this._displayComponents.length; i < l; i++) {
897
+ const component = this._displayComponents[i], itemId = component.instance.itemId;
898
+ if (itemId === undefined) {
899
+ continue;
900
+ }
901
+ const bounds = component.instance.getBounds(), cache = this.get(itemId);
902
+ if (!!bounds && !!cache) {
903
+ if (bounds.width !== cache.width || bounds.height !== cache.height) {
904
+ return true;
905
+ }
906
+ }
907
+ }
908
+ return false;
909
+ }
910
+ generateDisplayCollection(items, actualItems, itemConfigMap, metrics) {
911
+ const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, divides, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, leftLayoutOffset: layoutOffset, leftLayoutIndexOffset: layoutIndexOffset, renderItems: renderItemsLength, scrollSize, sizeProperty, stickyEnabled, stickyPos, startPosition, totalLength, startIndex, typicalItemSize, minItemSize, maxItemSize, snapToItem, snapToItemAlign, itemTransform, } = metrics, displayItems = [];
912
+ if (items.length) {
913
+ const trackBy = this._trackingPropertyName, actualSnippedPosition = stickyPos, isSnappingMethodAdvanced = this._isSnappingMethodAdvanced, deltaOffet = (isSnappingMethodAdvanced ? scrollSize : 0), scrollDirection = this._scrollDirection, boundsSize = isVertical ? height : width, actualEndSnippedPosition = scrollSize + boundsSize - this._scrollEndOffset;
914
+ let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0, endStickyItem, nextEndSticky, endStickyItemIndex = -1, endStickyItemSize = 0;
915
+ const li = layoutIndexOffset + actualItems.length - 1;
916
+ if (stickyEnabled) {
917
+ for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? (divides > 1 ? (itemsFromStartToScrollEnd - 1) : itemsFromStartToScrollEnd) : 0, totalLength - 1); i >= 0; i--) {
918
+ const collectionItem = items[i], isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED);
919
+ if (!collectionItem || isDummy) {
920
+ continue;
921
+ }
922
+ const rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), id = collectionItem[trackBy], cache = this.get(id), sticky = itemConfigMap[id]?.sticky ?? 0, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, size = dynamicSize ? cache?.[sizeProperty] > 0 ? cache?.[sizeProperty] : typicalItemSize : typicalItemSize, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? 0 : actualSnippedPosition, y = isVertical ? actualSnippedPosition : 0;
923
+ if (sticky === 1) {
924
+ const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, measures = {
925
+ x,
926
+ y,
927
+ transformedX: x,
928
+ transformedY: y,
929
+ z: 0,
930
+ rotationX: 0,
931
+ rotationY: 0,
932
+ rotationZ: 0,
933
+ scaleX: 1,
934
+ scaleY: 1,
935
+ scaleZ: 1,
936
+ width: isVertical ? normalizedItemWidth : size,
937
+ height: isVertical ? size : normalizedItemHeight,
938
+ minWidth: minItemSize,
939
+ minHeight: minItemSize,
940
+ maxWidth: maxItemSize,
941
+ maxHeight: maxItemSize,
942
+ size,
943
+ row: {
944
+ size,
945
+ odd: rowIndex % 2 != 0,
946
+ even: rowIndex % 2 == 0,
947
+ },
948
+ position: pos,
949
+ boundsSize,
950
+ scrollSize,
951
+ absoluteStartPosition,
952
+ absoluteStartPositionPercent,
953
+ absoluteEndPosition,
954
+ absoluteEndPositionPercent,
955
+ scrollDirection,
956
+ delta: sticky === 1 ? this._scrollStartOffset : sticky === 2 ? actualEndSnippedPosition - deltaOffet - size : 0,
957
+ }, config = {
958
+ fullSize: true,
959
+ isFirst: i === layoutIndexOffset,
960
+ isLast: i === li,
961
+ new: cache?.[IS_NEW] === true,
962
+ odd: isOdd,
963
+ even: !isOdd,
964
+ isVertical,
965
+ collapsable,
966
+ selectable,
967
+ sticky,
968
+ snap: stickyEnabled,
969
+ snapped: true,
970
+ snappedOut: false,
971
+ dynamic: dynamicSize,
972
+ isSnappingMethodAdvanced,
973
+ layoutOffset,
974
+ layoutIndexOffset,
975
+ totalItems: items.length,
976
+ snapToItem,
977
+ snapToItemAlign,
978
+ tabIndex: i - layoutIndexOffset,
979
+ divides,
980
+ opacity: 1,
981
+ zIndex: Z_INDEX_1,
982
+ };
983
+ const itemData = collectionItem;
984
+ stickyItem = {
985
+ index: i, id, measures, data: itemData, previouseData: i > 0 ? items[i - 1] : null,
986
+ nextData: i < totalLength ? items[i + 1] : null, config,
987
+ };
988
+ stickyItemIndex = i;
989
+ stickyItemSize = size;
990
+ displayItems.push(stickyItem);
991
+ break;
992
+ }
993
+ }
994
+ }
995
+ if (stickyEnabled) {
996
+ const si = itemsFromStartToScrollEnd + itemsOnDisplayLength - 1, startIndex = si < 0 ? si : si;
997
+ for (let i = Math.min(startIndex, totalLength > 0 ? totalLength - 1 : 0), rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), l = totalLength; i < l; i++) {
998
+ const collectionItem = items[i], isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED);
999
+ if (!collectionItem || isDummy) {
1000
+ continue;
1001
+ }
1002
+ const id = collectionItem[trackBy], cache = this.get(id), sticky = itemConfigMap[id]?.sticky ?? 0, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, size = dynamicSize
1003
+ ? cache?.[sizeProperty] || typicalItemSize
1004
+ : typicalItemSize;
1005
+ if (sticky === 2) {
1006
+ const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, w = isVertical ? normalizedItemWidth : size, h = isVertical ? size : normalizedItemHeight, absoluteStartPosition = pos - (scrollSize - size) - size, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? 0 : actualEndSnippedPosition - w, y = isVertical ? actualEndSnippedPosition - h : 0, measures = {
1007
+ x,
1008
+ y,
1009
+ transformedX: x,
1010
+ transformedY: y,
1011
+ z: 0,
1012
+ rotationX: 0,
1013
+ rotationY: 0,
1014
+ rotationZ: 0,
1015
+ scaleX: 1,
1016
+ scaleY: 1,
1017
+ scaleZ: 1,
1018
+ size,
1019
+ row: {
1020
+ size,
1021
+ odd: rowIndex % 2 != 0,
1022
+ even: rowIndex % 2 == 0,
1023
+ },
1024
+ position: pos,
1025
+ boundsSize,
1026
+ scrollSize,
1027
+ absoluteStartPosition,
1028
+ absoluteStartPositionPercent,
1029
+ absoluteEndPosition,
1030
+ absoluteEndPositionPercent,
1031
+ width: w,
1032
+ height: h,
1033
+ minWidth: minItemSize,
1034
+ minHeight: minItemSize,
1035
+ maxWidth: maxItemSize,
1036
+ maxHeight: maxItemSize,
1037
+ scrollDirection,
1038
+ delta: actualEndSnippedPosition - deltaOffet - size,
1039
+ }, config = {
1040
+ fullSize: true,
1041
+ isFirst: i === layoutIndexOffset,
1042
+ isLast: i === li,
1043
+ new: cache?.[IS_NEW] === true,
1044
+ odd: isOdd,
1045
+ even: !isOdd,
1046
+ isVertical,
1047
+ collapsable,
1048
+ selectable,
1049
+ sticky,
1050
+ snap: stickyEnabled,
1051
+ snapped: true,
1052
+ snappedOut: false,
1053
+ dynamic: dynamicSize,
1054
+ isSnappingMethodAdvanced,
1055
+ layoutOffset,
1056
+ layoutIndexOffset,
1057
+ totalItems: items.length,
1058
+ snapToItem,
1059
+ snapToItemAlign,
1060
+ tabIndex: i - layoutIndexOffset,
1061
+ divides,
1062
+ opacity: 1,
1063
+ zIndex: Z_INDEX_1,
1064
+ };
1065
+ const itemData = collectionItem;
1066
+ endStickyItem = {
1067
+ index: i, id, measures, data: itemData, previouseData: i > 0 ? items[i - 1] : null,
1068
+ nextData: i < totalLength ? items[i + 1] : null, config,
1069
+ };
1070
+ endStickyItemIndex = i;
1071
+ endStickyItemSize = size;
1072
+ displayItems.push(endStickyItem);
1073
+ break;
1074
+ }
1075
+ }
1076
+ }
1077
+ const collectionLength = items.length;
1078
+ let i = startIndex, ci = 0, row = {
1079
+ size: 0,
1080
+ odd: false,
1081
+ even: false,
1082
+ };
1083
+ while (renderItems > 0) {
1084
+ if (i >= collectionLength) {
1085
+ break;
1086
+ }
1087
+ const collectionItem = items[i];
1088
+ if (!collectionItem) {
1089
+ break;
1090
+ }
1091
+ const isDummy = collectionItem?.[SERVICE_PROP_DUMMY] && (collectionItem?.[SERVICE_PROP_DUMMY] === SERVICE_PROP_DUMMY_ENABLED), ii = i + 1, rowIndex = Math.floor(((items.length - layoutIndexOffset + i) + 1) / divides), id = collectionItem[trackBy], cache = this.get(id), size = isDummy ? typicalItemSize : (dynamicSize ? cache?.[sizeProperty] || typicalItemSize : typicalItemSize), divSize = (isVertical ? normalizedItemWidth : normalizedItemHeight) / divides;
1092
+ if (i % divides === 0) {
1093
+ ci = 0;
1094
+ row = {
1095
+ size,
1096
+ odd: rowIndex % 2 !== 0,
1097
+ even: rowIndex % 2 === 0,
1098
+ };
1099
+ }
1100
+ else {
1101
+ row.size = Math.max(row.size, size);
1102
+ ci++;
1103
+ }
1104
+ if (!isDummy) {
1105
+ if ((isSnappingMethodAdvanced || id !== stickyItem?.id) && id !== endStickyItem?.id) {
1106
+ const isOdd = (items.length - layoutIndexOffset + i) % 2 != 0, sticky = itemConfigMap[id]?.sticky ?? 0, fullSize = itemConfigMap[id]?.fullSize ?? false, selectable = itemConfigMap[id]?.selectable ?? true, collapsable = itemConfigMap[id]?.collapsable ?? false, snapped = stickyEnabled && ((sticky === 1 && (pos <= scrollSize + this._scrollStartOffset)) || (sticky === 2 && (pos >= scrollSize + boundsSize - size))), absoluteStartPosition = pos - scrollSize, ratio = size !== 0 ? boundsSize / size : 0, absoluteStartPositionPercent = -(boundsSize !== 0 ? absoluteStartPosition / boundsSize : 0) * ratio, absoluteEndPosition = boundsSize - (absoluteStartPositionPercent + size), absoluteEndPositionPercent = (absoluteStartPositionPercent + (boundsSize !== 0 ? (absoluteEndPosition + size) / boundsSize : 0) * ratio), x = isVertical ? divSize * ((sticky || fullSize) ? 0 : ci) : pos, y = isVertical ? pos : divSize * ((sticky || fullSize) ? 0 : ci), measures = {
1107
+ x,
1108
+ y,
1109
+ transformedX: x,
1110
+ transformedY: y,
1111
+ z: 0,
1112
+ rotationX: 0,
1113
+ rotationY: 0,
1114
+ rotationZ: 0,
1115
+ scaleX: 1,
1116
+ scaleY: 1,
1117
+ scaleZ: 1,
1118
+ size,
1119
+ row,
1120
+ position: pos,
1121
+ boundsSize,
1122
+ scrollSize,
1123
+ absoluteStartPosition,
1124
+ absoluteStartPositionPercent,
1125
+ absoluteEndPosition,
1126
+ absoluteEndPositionPercent,
1127
+ width: isVertical ? ((sticky || fullSize) ? normalizedItemWidth : (normalizedItemWidth / divides)) : size,
1128
+ height: isVertical ? size : ((sticky || fullSize) ? normalizedItemHeight : (normalizedItemHeight / divides)),
1129
+ minWidth: minItemSize,
1130
+ minHeight: minItemSize,
1131
+ maxWidth: maxItemSize,
1132
+ maxHeight: maxItemSize,
1133
+ scrollDirection,
1134
+ delta: sticky === 1 ? actualSnippedPosition : (sticky === 2 ? (actualEndSnippedPosition - deltaOffet - size) : 0),
1135
+ }, config = {
1136
+ isFirst: i === layoutIndexOffset,
1137
+ isLast: i === li,
1138
+ new: cache?.[IS_NEW] === true,
1139
+ odd: isOdd,
1140
+ even: !isOdd,
1141
+ isVertical,
1142
+ collapsable,
1143
+ selectable,
1144
+ sticky,
1145
+ snap: stickyEnabled,
1146
+ snapped: false,
1147
+ snappedOut: false,
1148
+ dynamic: dynamicSize,
1149
+ isSnappingMethodAdvanced,
1150
+ layoutOffset,
1151
+ layoutIndexOffset,
1152
+ totalItems: items.length,
1153
+ snapToItem,
1154
+ snapToItemAlign,
1155
+ tabIndex: i - layoutIndexOffset,
1156
+ isStub: (isSnappingMethodAdvanced && id === stickyItem?.id),
1157
+ divides,
1158
+ opacity: 1,
1159
+ zIndex: Z_INDEX_0,
1160
+ fullSize,
1161
+ };
1162
+ if (snapped) {
1163
+ config.zIndex = Z_INDEX_2;
1164
+ }
1165
+ const itemData = collectionItem;
1166
+ const item = {
1167
+ index: i, id, measures, data: itemData, previouseData: i > 0 ? items[i - 1] : null,
1168
+ nextData: i < totalLength ? items[i + 1] : null, config,
1169
+ };
1170
+ if (!nextSticky && stickyItemIndex < i && sticky === 1 && (pos <= scrollSize + this._scrollStartOffset + size + stickyItemSize)) {
1171
+ item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;
1172
+ item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;
1173
+ nextSticky = item;
1174
+ nextSticky.config.snapped = snapped;
1175
+ nextSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
1176
+ nextSticky.config.zIndex = Z_INDEX_3;
1177
+ }
1178
+ if (!nextEndSticky && endStickyItemIndex > i && sticky === 2 &&
1179
+ (pos >= actualEndSnippedPosition - size - endStickyItemSize)) {
1180
+ item.measures.x = isVertical ? 0 : snapped ? actualEndSnippedPosition - size : pos;
1181
+ item.measures.y = isVertical ? snapped ? actualEndSnippedPosition - size : pos : 0;
1182
+ nextEndSticky = item;
1183
+ nextEndSticky.config.zIndex = Z_INDEX_3;
1184
+ nextEndSticky.config.snapped = snapped;
1185
+ nextEndSticky.measures.delta = (isVertical ? item.measures.y : item.measures.x) - scrollSize;
1186
+ }
1187
+ displayItems.push(item);
1188
+ }
1189
+ }
1190
+ renderItems--;
1191
+ if (ii % divides === 0 || renderItems <= 0) {
1192
+ pos += row.size;
1193
+ }
1194
+ i++;
1195
+ }
1196
+ const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;
1197
+ if (!!nextSticky && !!stickyItem && nextSticky.measures[axis] <= actualSnippedPosition + stickyItem.measures[sizeProperty]) {
1198
+ if (nextSticky.measures[axis] > actualSnippedPosition) {
1199
+ stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItem.measures[sizeProperty];
1200
+ stickyItem.config.snapped = nextSticky.config.snapped = false;
1201
+ stickyItem.config.snappedOut = true;
1202
+ stickyItem.config.sticky = 1;
1203
+ stickyItem.measures.delta = (isVertical ? stickyItem.measures.y : stickyItem.measures.x) - scrollSize;
1204
+ }
1205
+ else {
1206
+ nextSticky.config.snapped = true;
1207
+ nextSticky.measures.delta = (isVertical ? nextSticky.measures.y : nextSticky.measures.x) - scrollSize;
1208
+ stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItem.measures[sizeProperty];
1209
+ stickyItem.measures.delta = (isVertical ? stickyItem.measures.y : stickyItem.measures.x) - scrollSize;
1210
+ }
1211
+ }
1212
+ if (!!nextEndSticky && !!endStickyItem &&
1213
+ (nextEndSticky.measures[axis] >= actualEndSnippedPosition - endStickyItemSize - nextEndSticky.measures[sizeProperty])) {
1214
+ if (nextEndSticky.measures[axis] < actualEndSnippedPosition - nextEndSticky.measures[sizeProperty]) {
1215
+ endStickyItem.measures[axis] = nextEndSticky.measures[axis] + nextEndSticky.measures[sizeProperty];
1216
+ endStickyItem.config.snapped = nextEndSticky.config.snapped = false;
1217
+ endStickyItem.config.snappedOut = true;
1218
+ endStickyItem.config.sticky = 2;
1219
+ endStickyItem.measures.delta = (isVertical ? endStickyItem.measures.y : endStickyItem.measures.x) - scrollSize;
1220
+ }
1221
+ else {
1222
+ nextEndSticky.config.snapped = true;
1223
+ nextEndSticky.measures[axis] = actualEndSnippedPosition - nextEndSticky.measures[sizeProperty];
1224
+ nextEndSticky.measures.delta = (isVertical ? nextEndSticky.measures.y : nextEndSticky.measures.x) - scrollSize;
1225
+ endStickyItem.measures[axis] = nextEndSticky.measures[axis] + nextEndSticky.measures[sizeProperty];
1226
+ endStickyItem.measures.delta = (isVertical ? endStickyItem.measures.y : endStickyItem.measures.x) - scrollSize;
1227
+ }
1228
+ }
1229
+ if (itemTransform !== null) {
1230
+ for (let i = 0, l = displayItems.length; i < l; i++) {
1231
+ const item = displayItems[i];
1232
+ if (!!item) {
1233
+ const transformation = itemTransform(item.index, objectAsReadonly(item.measures), objectAsReadonly(item.config));
1234
+ item.measures.transformedX = transformation.x;
1235
+ item.measures.transformedY = transformation.y;
1236
+ item.measures.z = transformation.z;
1237
+ item.measures.rotationX = transformation.rotationX;
1238
+ item.measures.rotationY = transformation.rotationY;
1239
+ item.measures.rotationZ = transformation.rotationZ;
1240
+ item.measures.scaleX = transformation.scaleX;
1241
+ item.measures.scaleY = transformation.scaleY;
1242
+ item.measures.scaleZ = transformation.scaleZ;
1243
+ item.config.opacity = transformation.opacity;
1244
+ item.config.filter = transformation.filter;
1245
+ item.config.blendColor = transformation.blendColor;
1246
+ item.config.zIndex = String(transformation.zIndex);
1247
+ }
1248
+ }
1249
+ }
1250
+ }
1251
+ return displayItems;
1252
+ }
1253
+ resetPositions() {
1254
+ this._tracker.clearTrackMap();
1255
+ this.track();
1256
+ }
1257
+ /**
1258
+ * tracking by propName
1259
+ */
1260
+ track() {
1261
+ if (!this._items || !this._displayComponents) {
1262
+ return;
1263
+ }
1264
+ this._tracker.track(this._items, this._displayComponents, this._snappedDisplayComponents, this._scrollDirection, this._trackBy);
1265
+ }
1266
+ setDisplayObjectIndexMapById(v) {
1267
+ this._tracker.displayObjectIndexMapById = v;
1268
+ }
1269
+ untrackComponentByIdProperty(component) {
1270
+ this._tracker.untrackComponentByIdProperty(component);
1271
+ }
1272
+ getItemBounds(id) {
1273
+ if (this.has(id)) {
1274
+ return this.get(id) ?? null;
1275
+ }
1276
+ return null;
1277
+ }
1278
+ getComponentBoundsByIntersectionPosition(position, maxPosition = null) {
1279
+ const components = this._displayComponents;
1280
+ let first = null, last = null;
1281
+ if (!!components) {
1282
+ for (const comp of components) {
1283
+ const id = comp.instance.itemId ?? null, isVertical = comp.instance.item?.config?.isVertical, x = comp.instance.item?.measures?.x ?? 0, y = comp.instance.item?.measures?.y ?? 0, isFirst = comp.instance.item?.config?.isFirst ?? false, isLast = comp.instance.item?.config?.isLast ?? false, { width, height } = comp.instance.getBounds(), pos = position;
1284
+ if (isVertical && (pos >= y && pos < y + height)) {
1285
+ return { id, x, y, width, height, isFirst, isLast };
1286
+ }
1287
+ else if (!isVertical && (pos >= x && pos < x + width)) {
1288
+ return { id, x, y, width, height, isFirst, isLast };
1289
+ }
1290
+ if (isFirst) {
1291
+ first = { id, x, y, width, height, isFirst, isLast };
1292
+ }
1293
+ else if (isLast) {
1294
+ last = { id, x, y, width, height, isFirst, isLast };
1295
+ }
1296
+ }
1297
+ }
1298
+ if (position < 0) {
1299
+ return first;
1300
+ }
1301
+ if (maxPosition !== null && position > maxPosition) {
1302
+ return last;
1303
+ }
1304
+ return null;
1305
+ }
1306
+ cacheElements(isVertical, itemSize) {
1307
+ if (!this._displayComponents) {
1308
+ return;
1309
+ }
1310
+ for (let i = 0, l = this._displayComponents.length; i < l; i++) {
1311
+ const component = this._displayComponents[i], itemId = component.instance.itemId;
1312
+ if (itemId === undefined) {
1313
+ continue;
1314
+ }
1315
+ const bounds = component.instance.getBounds();
1316
+ this.set(itemId, {
1317
+ ...this.get(itemId), ...bounds,
1318
+ width: bounds.width || (isVertical ? 0 : itemSize),
1319
+ height: bounds.height || (isVertical ? itemSize : 0),
1320
+ });
1321
+ if (this._isLazy && (this._isScrollStart)) {
1322
+ this._debouncedIsScrollStartOff.execute();
1323
+ }
1324
+ }
1325
+ const cache = this._prerenderedCache;
1326
+ if (!!cache) {
1327
+ for (const id in cache) {
1328
+ const cacheItem = cache[id];
1329
+ this.set(id, { ...(this.get(id) || {}), ...cacheItem });
1330
+ }
1331
+ this._prerenderedCache = null;
1332
+ }
1333
+ }
1334
+ resetCacheChunkInfo() {
1335
+ this._newItems = [];
1336
+ }
1337
+ cacheClean() {
1338
+ this._map.clear();
1339
+ this._snapshot.clear();
1340
+ }
1341
+ dispose() {
1342
+ super.dispose();
1343
+ this.disposeClearBufferSizeTimer();
1344
+ if (!!this._debouncedIsScrollStartOff) {
1345
+ this._debouncedIsScrollStartOff.dispose();
1346
+ }
1347
+ if (!!this._tracker) {
1348
+ this._tracker.dispose();
1349
+ }
1350
+ }
1351
+ }
1352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2stYm94LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29yZS90cmFjay1ib3gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFDSCxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUMxSCxXQUFXLEVBQUUsV0FBVyxHQUMzQixNQUFNLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBSXBFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsaUNBQWlDLEVBQUUsa0NBQWtDLEVBQUUsaUNBQWlDLEVBQUUsd0JBQXdCLEVBQ2xJLE1BQU0sRUFBRSwwQkFBMEIsR0FDckMsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUt2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXRDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLFFBQ1QsU0FBUSxRQUFzRDtJQXFKOUQsWUFBWSxvQkFBNEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFwSEYscUJBQWdCLEdBQW9CLENBQUMsQ0FBQztRQVV0QyxhQUFRLEdBQVcsc0JBQXNCLENBQUM7UUFVMUMsYUFBUSxHQUFXLGVBQWUsQ0FBQztRQVVuQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQVU3Qiw4QkFBeUIsR0FBWSxLQUFLLENBQUM7UUFVM0MsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWlCekIsMEJBQXFCLEdBQVcsc0JBQXNCLENBQUM7UUFFdkQsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFTaEMsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFTOUIseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBTXRDLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQU1wQyx1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFRL0IscUJBQWdCLEdBQVcsQ0FBQyxDQUFDO1FBb0M3QixxQkFBZ0IsR0FBK0IsRUFBRSxDQUFDO1FBRWxELGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBYXRCLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUV2QixxQkFBZ0IsR0FBVyxDQUFDLENBQUM7UUFHdkMscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRWQsa0NBQTZCLEdBQUcsaUNBQWlDLENBQUM7UUFFbEUsNkJBQXdCLEdBQUcsa0NBQWtDLENBQUM7UUFFOUQsd0JBQW1CLEdBQWtCLEVBQUUsQ0FBQztRQUV4QyxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUd4Qix1QkFBa0IsR0FBVyxDQUFDLENBQUM7UUFFL0IsbUJBQWMsR0FBVyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFFakQsNEJBQXVCLEdBQVcsaUNBQWlDLENBQUM7UUFJcEUsZUFBVSxHQUFZLElBQUksQ0FBQztRQUU3QixzQkFBaUIsR0FBMEIsSUFBSSxDQUFDO1FBRWhELGNBQVMsR0FBYyxFQUFFLENBQUM7UUFpTnhCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQXFxQzFCLCtCQUEwQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUE1N0NDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztRQUVsRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQXJKRCxJQUFJLEtBQUssQ0FBQyxDQUFrRDtRQUN4RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFJRCxJQUFJLGlCQUFpQixDQUFDLENBQTRDO1FBQzlELElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLENBQUMsRUFBRTtZQUMvQixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFJRCxJQUFJLHdCQUF3QixDQUFDLENBQTRDO1FBQ3JFLElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLENBQUMsRUFBRTtZQUN0QyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFHRCxJQUFJLGVBQWUsQ0FBQyxDQUFrQjtRQUNsQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBSSxlQUFlLEtBQUssT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBR3ZELElBQUksT0FBTyxDQUFDLENBQVM7UUFDakIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUNyQixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUl2QyxJQUFJLE9BQU8sQ0FBQyxDQUFTO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDckIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQUksVUFBVSxDQUFDLENBQVU7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBSSx3QkFBd0IsQ0FBQyxDQUFVO1FBQ25DLElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLENBQUMsRUFBRTtZQUN0QyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFJRCxJQUFJLE1BQU0sQ0FBQyxDQUFVO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDcEIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxvQkFBb0IsQ0FBQyxDQUFTO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBTUQsSUFBSSxhQUFhLENBQUMsQ0FBVTtRQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRTtZQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBSUQsSUFBSSxXQUFXLENBQUMsQ0FBVTtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsRUFBRTtZQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBSUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUM1RCxDQUFDO0lBSUQsSUFBSSxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUN4RCxDQUFDO0lBR0QsSUFBSSxpQkFBaUIsQ0FBQyxDQUFTO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFHRCxJQUFJLGVBQWUsQ0FBQyxDQUFTO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksZUFBZTtRQUNmLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFVUyxVQUFVO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVRLEdBQUcsQ0FBQyxFQUFNLEVBQUUsS0FBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDeEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQU9ELElBQUksWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFOUIsZ0JBQWdCO1FBQy9CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDdkQ7SUFDTCxDQUFDO0lBRVMsUUFBUTtRQUNkLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFLRCxJQUFJLGVBQWUsS0FBSyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFXdkQsSUFBSSxVQUFVLEtBQUssT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQWdCMUIsVUFBVTtRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFaEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBc0MsaUJBQXVDLEVBQ3hGLFFBQWdCO1FBQ2hCLElBQUksaUJBQWlCLEtBQUssU0FBUyxJQUFJLGlCQUFpQixLQUFLLElBQUk7WUFDN0QsaUJBQWlCLEtBQUssSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM3RCxPQUFPO1NBQ1Y7UUFFRCxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDakYsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFFMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFzQyxrQkFBd0MsRUFDL0YsaUJBQXVDLEVBQ3ZDLFFBQWdCO1FBQ2hCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUMzQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEQsSUFBSSxrQkFBa0IsRUFBRTtnQkFDcEIsVUFBVTtnQkFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDekQsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO3dCQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztxQkFDeEI7aUJBQ0o7YUFDSjtZQUNELE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hELElBQUksaUJBQWlCLEVBQUU7Z0JBQ25CLFFBQVE7Z0JBQ1IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN0RCxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUNwQixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTt3QkFDUixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7cUJBQy9GO2lCQUNKO2FBQ0o7WUFDRCxPQUFPO1NBQ1Y7UUFDRCxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDUixjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3hDO1NBQ0o7UUFDRCxNQUFNLGFBQWEsR0FBYSxFQUFFLEVBQUUsVUFBVSxHQUFhLEVBQUUsRUFBRSxlQUFlLEdBQStCLEVBQUUsRUFDM0csVUFBVSxHQUFhLEVBQUUsQ0FBQztRQUM5QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkQsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDUixJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQ25DLElBQUksSUFBSSxLQUFLLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDN0IsY0FBYzt3QkFDZCxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7NEJBQ2QsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7NEJBQy9ELE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO3lCQUN6QyxDQUFDLENBQUM7d0JBQ0gsU0FBUztxQkFDWjt5QkFBTTt3QkFDSCxVQUFVO3dCQUNWLFlBQVksR0FBRyxJQUFJLENBQUM7d0JBQ3BCLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTs0QkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQzs0QkFDL0QsTUFBTSxFQUFFLGtCQUFrQixDQUFDLE1BQU07eUJBQ3BDLENBQUMsQ0FBQzt3QkFDSCxTQUFTO3FCQUNaO2lCQUNKO2dCQUVELFVBQVU7Z0JBQ1YsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDdEIsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QjtTQUNKO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hCLFFBQVE7Z0JBQ1IsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQy9GO1NBQ0o7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBc0MsRUFBTSxFQUFFLGFBQXdDLEVBQ2pHLE9BQXNDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUV4QyxNQUFNLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQzlELEdBQUcsR0FBRztZQUNOLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxXQUFXO1lBQ2xELGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDMUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1NBQ3pDLENBQUMsQ0FBQztRQUNILE9BQU8saUJBQWlCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELHFCQUFxQixDQUFDLGNBQXVCLEtBQUs7UUFDOUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUVoRCxJQUFJLFdBQVcsRUFBRTtZQUNiLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1NBQy9EO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFzQyxLQUFRLEVBQUUsYUFBd0MsRUFDOUYsT0FBdUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFDeEUsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFFeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3BDLEdBQUcsR0FBRztZQUNOLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDMUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2hDLGVBQWU7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDO0lBQ2hGLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFzQyxLQUFRLEVBQUUsYUFBd0MsRUFDcEcsT0FBdUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFDdkcsZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM1QyxJQUFJLFdBQVcsRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEQ7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFFeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3BDLEdBQUcsR0FBRztZQUNOLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDMUMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2hDLGVBQWU7U0FDbEIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBRTdCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXZELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBRTVDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFFM0IsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuQjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDMUcsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUksQ0FBQztJQUlTLDBCQUEwQixDQUFrQixPQUFvQixFQUFFLGdCQUF3QjtRQUNoRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVuQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzdHLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUM7UUFDdEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQ2pJLGFBQWEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFDakcsV0FBVyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFNUYsSUFBSSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLEVBQUU7WUFDNUYsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLDZCQUE2QjtZQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLHdCQUF3QjtTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRVMseUJBQXlCO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQzNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDbEMsQ0FBQyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBc0IsQ0FBQztJQUMxRCxDQUFDO0lBRVMsMkJBQTJCO1FBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxrQkFBa0IsQ0FBc0MsQ0FBUyxFQUFFLFVBQWEsRUFBRSxHQUFvQixFQUFFLGVBQXVCLEVBQ3JJLElBQVksRUFBRSxVQUFtQixFQUFFLGNBQXNCLENBQUMsRUFBRSxVQUFtQixLQUFLO1FBQ3BGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO1FBQzNHLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5RSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzFCLFFBQVEsR0FBRyxLQUFLLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7YUFDdkY7aUJBQU07Z0JBQ0gsUUFBUSxHQUFHLGVBQWUsQ0FBQzthQUM5QjtZQUNELElBQUksTUFBTSxHQUFHLFFBQVEsR0FBRyxJQUFJLEVBQUU7Z0JBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDMUI7WUFDRCxNQUFNLElBQUksUUFBUSxDQUFDO1lBQ25CLEdBQUcsRUFBRSxDQUFDO1NBQ1Q7UUFDRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNPLGtCQUFrQixDQUFzQyxPQUF5QztRQUN2RyxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFDckksVUFBVSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUseUJBQXlCLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFDbkgsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BRWxDLEVBQUUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFDOUYsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQzFGLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLGVBQWUsR0FBRyxRQUFRLEVBQy9GLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUNuRixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFDbkUsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHNCQUFzQixHQUFrQixFQUFFLEVBQ3hHLFFBQVEsR0FBRyxVQUFVLEtBQUssU0FBUyxJQUFJLENBQUMsT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztlQUNuRixDQUFDLE9BQU8sVUFBVSxLQUFLLFFBQVEsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFakUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUM5QyxJQUFJLHlCQUF5QixFQUFFO1lBQzNCLFFBQVEsSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMzQixLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUNKLGVBQWUsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLGdCQUFnQixHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7b0JBQ3hDLE1BQU07aUJBQ1Q7Z0JBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNMLGVBQWUsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDO29CQUN2QyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLE1BQU07aUJBQ1Q7Z0JBQ0QsS0FBSyxDQUFDLENBQUM7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7b0JBQ0wsZUFBZSxHQUFHLGdCQUFnQixHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7aUJBQzdEO2FBQ0o7U0FDSjthQUFNO1lBQ0gsZUFBZSxHQUFHLGdCQUFnQixHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7U0FDN0Q7UUFFRCxJQUFJLHlCQUF5QixHQUFXLENBQUMsQ0FBQyxFQUN0Qyw4QkFBOEIsR0FBRyxDQUFDLEVBQ2xDLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxFQUMvQixjQUFjLEdBQUcsQ0FBQyxFQUFFLGVBQWUsR0FBRyxDQUFDLEVBQ3ZDLGVBQWUsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUN6QyxxQkFBcUIsR0FBRyxDQUFDLEVBQ3pCLDRCQUE0QixHQUFHLENBQUMsRUFDaEMsZUFBZSxHQUFHLENBQUMsRUFDbkIsb0JBQW9CLEdBQUcsQ0FBQyxFQUN4QixzQkFBc0IsR0FBRyxDQUFDLEVBQzFCLHNCQUFzQixHQUFHLENBQUMsRUFDMUIsUUFBUSxHQUFhLElBQUksRUFDekIsV0FBVyxHQUFXLElBQUksQ0FBQyxrQkFBa0IsRUFDN0Msb0JBQW9CLEdBQVksS0FBSyxFQUNyQyxnQkFBZ0IsR0FBRyxXQUFXLEVBQzlCLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUMzRCxVQUFrQixFQUNsQixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLHNCQUFzQixHQUFHLENBQUMsRUFDMUIsVUFBVSxHQUFHLEtBQUssRUFDbEIsV0FBVyxHQUFHLENBQUMsRUFDZixnQkFBZ0IsR0FBRyxDQUFDLEVBQ3BCLHFCQUFxQixHQUFHLENBQUMsRUFDekIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBRS9CLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxJQUFJLFlBQTRCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVoRCxJQUFJLEtBQWUsQ0FBQztRQUVwQiw4R0FBOEc7UUFDOUcsSUFBSSxXQUFXLEVBQUU7WUFDYixLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsS0FBSyxJQUFJLFFBQVEsR0FBbUIsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDckYsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDakQsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDakMsUUFBUSxHQUFHLEVBQUUsQ0FBQztxQkFDakI7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUU7d0JBQzVCLFlBQVksR0FBRyxRQUFRLENBQUM7cUJBQzNCO29CQUNELElBQUksRUFBRSxJQUFJLFVBQVUsRUFBRTt3QkFDbEIsTUFBTTtxQkFDVDtpQkFDSjthQUNKO1lBRUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUMzQixtQkFBbUIsR0FBRyxDQUFDLEVBQ3ZCLEdBQUcsR0FjQztnQkFDQSxjQUFjLEVBQUUsQ0FBQztnQkFDakIsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsWUFBWSxFQUFFLENBQUM7Z0JBQ2Ysc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsb0JBQW9CLEVBQUUsQ0FBQztnQkFDdkIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsc0JBQXNCLEVBQUUsQ0FBQztnQkFDekIsZUFBZSxFQUFFLENBQUM7Z0JBQ2xCLHNCQUFzQixFQUFFLElBQUk7Z0JBQzVCLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3hCLDRCQUE0QixFQUFFLENBQUM7YUFDbEMsQ0FBQztZQUNOLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsa0JBQTJCLEtBQUssRUFBRSxXQUEwQixJQUFJLEVBQUUsRUFBRTtnQkFDckgsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO29CQUNSLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFDRCxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQ2hDLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQzVCLE1BQU0sR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUN6QyxRQUFRLEdBQUcsQ0FBQyxHQUFHLE9BQU8sS0FBSyxDQUFDLEVBQzVCLGVBQWUsR0FBRyxFQUFFLEdBQUcsT0FBTyxLQUFLLENBQUMsRUFDcEMsVUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQ3JCLFFBQVEsR0FBRyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsY0FBYyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzdHLElBQUksUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLEVBQUU7b0JBQzFCLEdBQUcsR0FBRzt3QkFDRixjQUFjLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0JBQ3JCLFlBQVksRUFBRSxDQUFDLEdBQUcsT0FBTzt3QkFDekIsSUFBSSxFQUFFLENBQUM7d0JBQ1AsWUFBWSxFQUFFLENBQUM7d0JBQ2Ysc0JBQXNCLEVBQUUsQ0FBQzt3QkFDekIsb0JBQW9CLEVBQUUsQ0FBQzt3QkFDdkIsc0JBQXNCLEVBQUUsQ0FBQzt3QkFDekIsc0JBQXNCLEVBQUUsQ0FBQzt3QkFDekIsZUFBZSxFQUFFLENBQUM7d0JBQ2xCLHNCQUFzQixFQUFFLElBQUk7d0JBQzVCLGdCQUFnQixFQUFFLENBQUM7d0JBQ25CLHFCQUFxQixFQUFFLENBQUM7d0JBQ3hCLDRCQUE0QixFQUFFLENBQUM7cUJBQ2xDLENBQUM7aUJBQ0w7Z0JBQ0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsaUJBQWlCLEdBQXVCLGtCQUFrQixDQUFDLFdBQVcsQ0FBQztnQkFDaEgsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO29CQUNiLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFCLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztvQkFDaEYsaUJBQWlCLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7b0JBQy9ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ25HLEtBQUssR0FBRyxTQUFTLENBQUM7b0JBQ2xCLElBQUksS0FBSyxFQUFFO3dCQUNQLFVBQVUsR0FBRyxJQUFJLENBQUM7cUJBQ3JCO29CQUNELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQ25DLFlBQVksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO29CQUVuRixHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDN0MsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBRTVELFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUM7b0JBRTNDLFFBQVEsaUJBQWlCLEVBQUU7d0JBQ3ZCLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQzVCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzRCQUN2SCxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxzQkFBc0IsR0FBRyxhQUFhLENBQUMsRUFBRTtnQ0FDeEYsR0FBRyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztnQ0FDMUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs2QkFDcEI7NEJBQ0QsTUFBTTt5QkFDVDt3QkFDRCxLQUFLLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUM1QixZQUFZLEdBQUcsZUFBZSxDQUFDOzRCQUMvQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOzRCQUM5RSxJQUFJLFFBQVEsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxzQkFBc0IsR0FBRyxhQUFhLENBQUMsRUFBRTtnQ0FDeEYsR0FBRyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztnQ0FDMUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs2QkFDcEI7NEJBQ0QsTUFBTTt5QkFDVDtxQkFDSjtpQkFDSjtxQkFBTTtvQkFDSCxhQUFhLEdBQUcsZUFBZSxDQUFDO29CQUNoQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDN0MsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUM1QixZQUFZLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO2lCQUM5QztnQkFFRCxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ25DLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDO29CQUNsRixJQUFJLENBQUMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksRUFBRTt3QkFDakQsR0FBRyxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUMzRTtpQkFDSjtnQkFFRCxJQUFJLFFBQVEsRUFBRTtvQkFDVixJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7d0JBQ25CLElBQUksRUFBRSxJQUFJLFVBQVUsSUFBSSxFQUFFLEtBQUssWUFBWSxJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7NEJBQ3pELG1CQUFtQixHQUFHLGFBQWEsQ0FBQzs0QkFDcEMsQ0FBQyxJQUFJLG1CQUFtQixDQUFDO3lCQUM1Qjt3QkFFRCxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUU7NEJBQ2xCLGlCQUFpQixHQUFHLElBQUksQ0FBQzs0QkFFekIsSUFBSSxTQUFTLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFBRTtnQ0FDakMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsRUFDbEcsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQztnQ0FDckMsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7b0NBQ3RCLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsRUFDaEksUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQztvQ0FDOUQsNEJBQTRCLElBQUksTUFBTSxDQUFDO29DQUN2Qyx5QkFBeUIsSUFBSSxRQUFRLENBQUM7b0NBQ3RDLGdCQUFnQixHQUFHLGVBQWUsR0FBRyxDQUFDLENBQUM7b0NBQ3ZDLHFCQUFxQixJQUFJLFdBQVcsQ0FBQztvQ0FDckMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7b0NBQ2xGLENBQUMsSUFBSSxXQUFXLENBQUM7aUNBQ3BCOzZCQUNKOzRCQUVELFFBQVEsR0FBRyxjQUFjLENBQUM7NEJBQzFCLFdBQVcsR0FBRyxDQUFDLENBQUM7eUJBQ25COzZCQUFNOzRCQUNILHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzs0QkFDM0MscUJBQXFCLElBQUksYUFBYSxDQUFDOzRCQUN2Qyx5QkFBeUIsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDO3lCQUNsRDtxQkFDSjtpQkFDSjtxQkFBTSxJQUFJLENBQUMsSUFBSSxVQUFVLEdBQUcsYUFBYSxFQUFFO29CQUN4QyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUU7d0JBQ3JDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUM7cUJBQ2xDO29CQUNELEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDakYsR0FBRyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLENBQUMsZUFBZSxFQUFFO3dCQUNsQix5QkFBeUIsR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDO3FCQUNsRDtpQkFDSjtnQkFFRCxJQUFJLFFBQVEsRUFBRTtvQkFDVixJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLEdBQUcsYUFBYSxFQUFFO3dCQUM3RCwwQkFBMEIsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDO3dCQUM5Qyw0QkFBNEIsSUFBSSxhQUFhLENBQUM7d0JBQzlDLDhCQUE4QixHQUFHLDBCQUEwQixHQUFHLGdCQUFnQixDQUFDO3FCQUNsRjtpQkFDSjtxQkFBTSxJQUFJLENBQUMsSUFBSSxVQUFVLEdBQUcsSUFBSSxHQUFHLGFBQWEsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLGVBQWUsRUFBRTt3QkFDbEIsMEJBQTBCLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQzt3QkFDOUMsOEJBQThCLEdBQUcsMEJBQTBCLEdBQUcsZ0JBQWdCLENBQUM7cUJBQ2xGO29CQUNELEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFFN0YsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLFVBQVUsR0FBRyxhQUFhLEVBQUU7d0JBQzdDLFFBQVEsaUJBQWlCLEVBQUU7NEJBQ3ZCLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQzVCLEdBQUcsQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7Z0NBQ3hDLE1BQU07NkJBQ1Q7NEJBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7NEJBQy9CLEtBQUssa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0NBQ2pDLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxZQUFZLENBQUM7Z0NBQzFDLE1BQU07NkJBQ1Q7NEJBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQ0FDNUIsR0FBRyxDQUFDLHNCQUFzQixHQUFHLFlBQVksQ0FBQztnQ0FDMUMsTUFBTTs2QkFDVDt5QkFDSjtxQkFDSjtvQkFFRCxJQUFJLFFBQVEsSUFBSSxpQkFBaUIsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7d0JBQzdELEdBQUcsQ0FBQyxlQUFlLEdBQUcsWUFBWSxDQUFDO3FCQUN0QztpQkFDSjtxQkFBTTtvQkFDSCxJQUFJLFFBQVEsSUFBSSxDQUFDLEdBQUcsOEJBQThCLEVBQUU7d0JBQ2hELEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLENBQUMsQ0FBQztxQkFDeEU7aUJBQ0o7Z0JBRUQsSUFBSSxRQUFRLEVBQUU7b0JBQ1YsSUFBSSxDQUFDLGVBQWUsRUFBRTt3QkFDbEIsc0JBQXNCLElBQUksR0FBRyxDQUFDLHNCQUFzQixDQUFDO3dCQUNyRCxvQkFBb0IsSUFBSSxHQUFHLENBQUMsb0JBQW9CLENBQUM7d0JBQ2pELHNCQUFzQixJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDckQsc0JBQXNCLElBQUksR0FBRyxDQUFDLHNCQUFzQixDQUFDO3dCQUNyRCxlQUFlLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQzt3QkFDdkMsZ0JBQWdCLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDO3dCQUN6Qyw0QkFBNEIsSUFBSSxHQUFHLENBQUMsNEJBQTRCLENBQUM7d0JBQ2pFLHFCQUFxQixJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQzt3QkFDbkQsSUFBSSxHQUFHLENBQUMsc0JBQXNCLEtBQUssSUFBSSxFQUFFOzRCQUNyQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUM7eUJBQzNEO3FCQUNKO29CQUNELFNBQVMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDO29CQUN0QixDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQztpQkFDakI7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQyxDQUFBO1lBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsSUFBSSxVQUFVLElBQUksWUFBWSxFQUFFO29CQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTt3QkFDUCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7d0JBQzNCLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUU7NEJBQ2hDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2pCLElBQUksUUFBUSxLQUFLLENBQUMsQ0FBQyxFQUFFO2dDQUNqQixRQUFRLEdBQUcsZUFBZSxDQUFDOzZCQUM5Qjs0QkFDRCxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQUU7Z0NBQ1osUUFBUSxFQUFFLENBQUM7NkJBQ2Q7NEJBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLDBCQUEwQixDQUFDLEVBQUU7Z0NBQzdELE1BQU07NkJBQ1Q7NEJBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dDQUNWLENBQUMsR0FBRyxDQUFDLENBQUM7NkJBQ1Q7aUNBQU07Z0NBQ0gsQ0FBQyxFQUFFLENBQUM7NkJBQ1A7eUJBQ0o7d0JBRUQsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNoQixXQUFXLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQixnQkFBZ0IsR0FBRyxZQUFZLEdBQUcsRUFBRSxDQUFDO3dCQUNyQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7d0JBQzFCLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7d0JBQzVCLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO3dCQUM1RCwwQkFBMEIsR0FBRyw4QkFBOEIsR0FBRyxDQUFDLENBQUM7d0JBRS9ELEdBQVcsR0FBRyxJQUFJLENBQUM7cUJBQ3ZCO2lCQUNKO2FBQ0o7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ3RCLE1BQU07aUJBQ1Q7YUFDSjtZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDakIsR0FBVyxHQUFHLElBQUksQ0FBQztnQkFFcEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixHQUFHLFNBQVMsRUFBRSxZQUFZLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFDbEYsbUJBQW1CLEdBQUcsU0FBUyxHQUFHLFlBQVksQ0FBQztnQkFDbkQsR0FBRyxHQUFHO29CQUNGLGNBQWMsRUFBRSxDQUFDO29CQUNqQixZQUFZLEVBQUUsQ0FBQztvQkFDZixJQUFJLEVBQUUsQ0FBQztvQkFDUCxZQUFZLEVBQUUsQ0FBQztvQkFDZixzQkFBc0IsRUFBRSxDQUFDO29CQUN6QixvQkFBb0IsRUFBRSxDQUFDO29CQUN2QixzQkFBc0IsRUFBRSxDQUFDO29CQUN6QixzQkFBc0IsRUFBRSxDQUFDO29CQUN6QixlQUFlLEVBQUUsQ0FBQztvQkFDbEIsc0JBQXNCLEVBQUUsSUFBSTtvQkFDNUIsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDbkIscUJBQXFCLEVBQUUsQ0FBQztvQkFDeEIsNEJBQTRCLEVBQUUsQ0FBQztpQkFDbEMsQ0FBQztnQkFDRixNQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDckIsT0FBTyxDQUFDLEdBQUcsbUJBQW1CLEVBQUU7b0JBQzVCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixDQUFDLEVBQUU7d0JBQ3RELE1BQU07cUJBQ1Q7b0JBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNWLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ1Q7eUJBQU07d0JBQ0gsQ0FBQyxFQUFFLENBQUM7cUJBQ1A7b0JBQ0QsS0FBSyxFQUFFLENBQUM7aUJBQ1g7Z0JBQ0QsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQzdCLHNCQUFzQixHQUFHLEtBQUssQ0FBQzthQUNsQztZQUVELGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXpELElBQUkseUJBQXlCLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ2pDLHlCQUF5QixHQUFHLENBQUMsQ0FBQzthQUNqQztZQUNELElBQUksMEJBQTBCLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ2xDLDBCQUEwQixHQUFHLENBQUMsQ0FBQzthQUNsQztZQUVELHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsZUFBZSxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FBQztZQUVILGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ3RFLGVBQWUsR0FBRywwQkFBMEIsR0FBRyxnQkFBZ0IsR0FBRyxXQUFXO2dCQUN6RSxDQUFDLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUVsRSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLEdBQUcsY0FBYyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQzdJOztRQUNELDZEQUE2RDtRQUM3RDtZQUNJLE1BQU0sc0JBQXNCLEdBQUcsZUFBZSxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsR0FBRyxVQUFVLEdBQUcsT0FBTyxDQUFDO1lBQ25HLHlCQUF5QixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqSCwwQkFBMEIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxSCxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFDM0UsZUFBZSxHQUFHLENBQUMsMEJBQTBCLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxXQUFXO2dCQUM1RSxDQUFDLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztZQUNuRSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsc0JBQXNCLEdBQUcsZUFBZSxDQUFDLEdBQUcsZUFBZSxDQUFDO1lBQzFHLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUM1RyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixHQUFHLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUMzSCw0QkFBNEIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixHQUFHLHNCQUFzQixHQUFHLGVBQWUsQ0FBQyxHQUFHLGVBQWUsQ0FBQztZQUNuSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxPQUFPLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3BJLE1BQU0sQ0FBQyxHQUFHLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlELElBQUksUUFBUSxFQUFFO2dCQUNWLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFO29CQUNaLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLENBQUM7b0JBQzdGLGlCQUFpQixHQUFHLElBQUksQ0FBQztpQkFDNUI7YUFDSjtZQUVELGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU3RCxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBRVgsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNqRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUMvQyxJQUFJLFVBQVUsSUFBSSxZQUFZLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNQLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQzt3QkFDM0IsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTs0QkFDaEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDakIsSUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0NBQ2pCLFFBQVEsR0FBRyxlQUFlLENBQUM7NkJBQzlCOzRCQUNELElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRTtnQ0FDWixRQUFRLEVBQUUsQ0FBQzs2QkFDZDs0QkFDRCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN6QixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsU0FBUyxFQUFFO2dDQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQU0sQ0FBQyxDQUFDOzZCQUMxQztpQ0FBTTtnQ0FDSCxNQUFNOzZCQUNUOzRCQUNELE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQyxFQUN0QyxVQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDMUIsSUFBSSxlQUFlLElBQUksQ0FBQyxDQUFDLGVBQWUsSUFBSSxVQUFVLENBQUMsRUFBRTtnQ0FDckQsQ0FBQyxJQUFJLHNCQUFzQixDQUFDOzZCQUMvQjs0QkFDRCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0NBQ1YsQ0FBQyxHQUFHLENBQUMsQ0FBQzs2QkFDVDtpQ0FBTTtnQ0FDSCxDQUFDLEVBQUUsQ0FBQzs2QkFDUDt5QkFDSjt3QkFFRCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2hCLFdBQVcsR0FBRyxDQUFDLENBQUM7d0JBQ2hCLGdCQUFnQixHQUFHLFlBQVksR0FBRyxFQUFFLENBQUM7d0JBQ3JDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztxQkFDN0I7aUJBQ0o7YUFDSjtZQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDLEdBQUcsc0JBQXNCLENBQUM7Z0JBQ2hGLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQzVDLG1CQUFtQixHQUFHLFNBQVMsR0FBRyxZQUFZLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLENBQUMsR0FBRyxtQkFBbUIsRUFBRTtvQkFDNUIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDakIsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTt3QkFDeEIsTUFBTTtxQkFDVDtvQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxQixNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsT0FBTyxLQUFLLENBQUMsRUFDdEMsVUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQzFCLElBQUksZUFBZSxJQUFJLENBQUMsQ0FBQyxlQUFlLElBQUksVUFBVSxDQUFDLEVBQUU7d0JBQ3JELENBQUMsSUFBSSxzQkFBc0IsQ0FBQztxQkFDL0I7b0JBQ0QsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUNWLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ1Q7eUJBQU07d0JBQ0gsQ0FBQyxFQUFFLENBQUM7cUJBQ1A7b0JBQ0QsS0FBSyxFQUFFLENBQUM7aUJBQ1g7Z0JBQ0Qsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDdEUsZUFBZSxHQUFHLDBCQUEwQixHQUFHLGdCQUFnQixHQUFHLFdBQVc7b0JBQ3pFLENBQUMsQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO2dCQUVsRSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMseUJBQXlCLEdBQUcsY0FBYyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO2FBQzdJO2lCQUFNO2dCQUNILFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixHQUFHLGNBQWMsRUFBRSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM1RztTQUNKO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyw0QkFBNEIsR0FBRyxlQUFlLEVBQ3ZFLG9CQUFvQixHQUFHLDBCQUEwQixHQUFHLHlCQUF5QixFQUM3RSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixHQUFHLHFCQUFxQixHQUFHLGVBQWUsR0FBRyxXQUFXLEVBQy9GLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxvQkFBb0IsR0FBRyxjQUFjLEdBQUcsZUFBZSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsc0JBQXNCLEVBQ2pJLGtCQUFrQixHQUFHLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUUsS0FBSyxHQUFHLHNCQUFzQixHQUFHLG9CQUFvQixHQUFHLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDO1FBQ3hHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7UUFFeEMsSUFBSSxRQUFRLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNuQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDL0M7UUFFRCxNQUFNLE9BQU8sR0FBZ0I7WUFDekIsS0FBSztZQUNMLG1CQUFtQixFQUFFLENBQUM7WUFDdEIsb0JBQW9CLEVBQUUsQ0FBQztZQUN2QixLQUFLO1lBQ0wsTUFBTTtZQUNOLFdBQVc7WUFDWCxPQUFPO1lBQ1AsUUFBUTtZQUNSLFdBQVc7WUFDWCxXQUFXO1lBQ1gsS0FBSztZQUNMLHlCQUF5QjtZQUN6QiwwQkFBMEI7WUFDMUIsb0JBQW9CO1lBQ3BCLG9CQUFvQjtZQUNwQixVQUFVO1lBQ1YscUJBQXFCO1lBQ3JCLGNBQWM7WUFDZCxlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLHFCQUFxQjtZQUNyQixXQUFXO1lBQ1gsZUFBZTtZQUNmLGdCQUFnQjtZQUNoQixVQUFVLEVBQUUsZ0JBQWdCO1lBQzVCLG9CQUFvQjtZQUNwQixZQUFZO1lBQ1osYUFBYTtZQUNiLFNBQVM7WUFDVCxVQUFVO1lBQ1YsYUFBYTtZQUNiLDRCQUE0QjtZQUM1QixXQUFXO1lBQ1gsU0FBUztZQUNULGVBQWU7WUFDZixpQkFBaUI7WUFDakIsVUFBVTtZQUNWLFVBQVU7WUFDVixlQUFlO1lBQ2YsYUFBYTtTQUNoQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFxQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxPQUFPLENBQUMsY0FBdUIsS0FBSyxFQUFFLFFBQWlCLEtBQUs7UUFDeEQsSUFBSSxXQUFXLEVBQUU7WUFDYixJQUFJLEtBQUssRUFBRTtnQkFDUCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdEI7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUE2QyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5RTthQUFNO1lBQ0gsSUFBSSxLQUFLLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNuQixPQUFPO2FBQ1Y7WUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRTtnQkFDeEIsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDakYsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN0QixTQUFTO2FBQ1o7WUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUNyQixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7b0JBQ2hFLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFUyx5QkFBeUIsQ0FBc0MsS0FBUSxFQUFFLFdBQWMsRUFBRSxhQUF3QyxFQUN2SSxPQUFvQjtRQUNwQixNQUFNLEVBQ0YsS0FBSyxFQUNMLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCxPQUFPLEVBQ1Asb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QixVQUFVLEVBQ1YsZ0JBQWdCLEVBQUUsWUFBWSxFQUM5QixxQkFBcUIsRUFBRSxpQkFBaUIsRUFDeEMsV0FBVyxFQUFFLGlCQUFpQixFQUM5QixVQUFVLEVBQ1YsWUFBWSxFQUNaLGFBQWEsRUFDYixTQUFTLEVBQ1QsYUFBYSxFQUNiLFdBQVcsRUFDWCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEVBQ1gsVUFBVSxFQUNWLGVBQWUsRUFDZixhQUFhLEdBQ2hCLEdBQUcsT0FBTyxFQUNQLFlBQVksR0FBaUMsRUFBRSxDQUFDO1FBRXBELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNkLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxxQkFBcUIsR0FBRyxTQUFTLEVBQ3pFLHdCQUF3QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFDekQsVUFBVSxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3hELGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQ3ZDLFVBQVUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLHdCQUF3QixHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ3pILElBQUksR0FBRyxHQUFHLGFBQWEsRUFDbkIsV0FBVyxHQUFHLGlCQUFpQixFQUMvQixVQUE4QyxFQUFFLFVBQThDLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxFQUNwSCxjQUFjLEdBQUcsQ0FBQyxFQUFFLGFBQWlELEVBQUUsYUFBaUQsRUFDeEgsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBRW5ELE1BQU0sRUFBRSxHQUFHLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELElBQUksYUFBYSxFQUFFO2dCQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNsSyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzNCLE9BQU8sR0FBRyxjQUFjLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUMsS0FBSywwQkFBMEIsQ0FBQyxDQUFDO29CQUM1SCxJQUFJLENBQUMsY0FBYyxJQUFJLE9BQU8sRUFBRTt3QkFDNUIsU0FBUztxQkFDWjtvQkFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFFLEVBQUUsTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUM3SyxVQUFVLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsSUFBSSxJQUFJLEVBQ2xELFdBQVcsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxJQUFJLEtBQUssRUFDckQsSUFBSSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQzFHLHFCQUFxQixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQ3hELEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUMvSSxtQkFBbUIsR0FBRyxVQUFVLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsRUFDeEUsMEJBQTBCLEdBQUcsQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDeEksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFDMUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNkLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUN6RCxRQUFRLEdBQW1DOzRCQUN2QyxDQUFDOzRCQUNELENBQUM7NEJBQ0QsWUFBWSxFQUFFLENBQUM7NEJBQ2YsWUFBWSxFQUFFLENBQUM7NEJBQ2YsQ0FBQyxFQUFFLENBQUM7NEJBQ0osU0FBUyxFQUFFLENBQUM7NEJBQ1osU0FBUyxFQUFFLENBQUM7NEJBQ1osU0FBUyxFQUFFLENBQUM7NEJBQ1osTUFBTSxFQUFFLENBQUM7NEJBQ1QsTUFBTSxFQUFFLENBQUM7NEJBQ1QsTUFBTSxFQUFFLENBQUM7NEJBQ1QsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUk7NEJBQzlDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9COzRCQUNoRCxRQUFRLEVBQUUsV0FBVzs0QkFDckIsU0FBUyxFQUFFLFdBQVc7NEJBQ3RCLFFBQVEsRUFBRSxXQUFXOzRCQUNyQixTQUFTLEVBQUUsV0FBVzs0QkFDdEIsSUFBSTs0QkFDSixHQUFHLEVBQUU7Z0NBQ0QsSUFBSTtnQ0FDSixHQUFHLEVBQUUsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDO2dDQUN0QixJQUFJLEVBQUUsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDOzZCQUMxQjs0QkFDRCxRQUFRLEVBQUUsR0FBRzs0QkFDYixVQUFVOzRCQUNWLFVBQVU7NEJBQ1YscUJBQXFCOzRCQUNyQiw0QkFBNEI7NEJBQzVCLG1CQUFtQjs0QkFDbkIsMEJBQTBCOzRCQUMxQixlQUFlOzRCQUNmLEtBQUssRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ2xILEVBQUUsTUFBTSxHQUFpQzs0QkFDdEMsUUFBUSxFQUFFLElBQUk7NEJBQ2QsT0FBTyxFQUFFLENBQUMsS0FBSyxpQkFBaUI7NEJBQ2hDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRTs0QkFDaEIsR0FBRyxFQUFHLEtBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUk7NEJBQ3hDLEdBQUcsRUFBRSxLQUFLOzRCQUNWLElBQUksRUFBRSxDQUFDLEtBQUs7NEJBQ1osVUFBVTs0QkFDVixXQUFXOzRCQUNYLFVBQVU7NEJBQ1YsTUFBTTs0QkFDTixJQUFJLEVBQUUsYUFBYTs0QkFDbkIsT0FBTyxFQUFFLElBQUk7NEJBQ2IsVUFBVSxFQUFFLEtBQUs7NEJBQ2pCLE9BQU8sRUFBRSxXQUFXOzRCQUNwQix3QkFBd0I7NEJBQ3hCLFlBQVk7NEJBQ1osaUJBQWlCOzRCQUNqQixVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU07NEJBQ3hCLFVBQVU7NEJBQ1YsZUFBZTs0QkFDZixRQUFRLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQjs0QkFDL0IsT0FBTzs0QkFDUCxPQUFPLEVBQUUsQ0FBQzs0QkFDVixNQUFNLEVBQUUsU0FBUzt5QkFDcEIsQ0FBQzt3QkFFTixNQUFNLFFBQVEsR0FBTSxjQUFjLENBQUM7d0JBRW5DLFVBQVUsR0FBRzs0QkFDVCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTs0QkFDbEYsUUFBUSxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNO3lCQUMxRCxDQUFDO3dCQUNGLGVBQWUsR0FBRyxDQUFDLENBQUM7d0JBQ3BCLGNBQWMsR0FBRyxJQUFJLENBQUM7d0JBRXRCLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQzlCLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtZQUVELElBQUksYUFBYSxFQUFFO2dCQUNmLE1BQU0sRUFBRSxHQUFHLHlCQUF5QixHQUFHLG9CQUFvQixHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9GLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BFLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUM3RSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzdCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDM0IsT0FBTyxHQUFHLGNBQWMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLDBCQUEwQixDQUFDLENBQUM7b0JBQzVILElBQUksQ0FBQyxjQUFjLElBQUksT0FBTyxFQUFFO3dCQUM1QixTQUFTO3FCQUNaO29CQUNELE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUUsRUFBRSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQzlGLFVBQVUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxJQUFJLElBQUksRUFDbEQsV0FBVyxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLElBQUksS0FBSyxFQUNyRCxJQUFJLEdBQUcsV0FBVzt3QkFDZCxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksZUFBZTt3QkFDMUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztvQkFDMUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNkLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUN6RCxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLEVBQ3pGLHFCQUFxQixHQUFHLEdBQUcsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSw0QkFBNEIsR0FBRyxDQUFDLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQ3pNLG1CQUFtQixHQUFHLFVBQVUsR0FBRyxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQyxFQUN4RSwwQkFBMEIsR0FBRyxDQUFDLDRCQUE0QixHQUFHLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUN4SSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLENBQUMsRUFDakQsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2pELFFBQVEsR0FBbUM7NEJBQ3ZDLENBQUM7NEJBQ0QsQ0FBQzs0QkFDRCxZQUFZLEVBQUUsQ0FBQzs0QkFDZixZQUFZLEVBQUUsQ0FBQzs0QkFDZixDQUFDLEVBQUUsQ0FBQzs0QkFDSixTQUFTLEVBQUUsQ0FBQzs0QkFDWixTQUFTLEVBQUUsQ0FBQzs0QkFDWixTQUFTLEVBQUUsQ0FBQzs0QkFDWixNQUFNLEVBQUUsQ0FBQzs0QkFDVCxNQUFNLEVBQUUsQ0FBQzs0QkFDVCxNQUFNLEVBQUUsQ0FBQzs0QkFDVCxJQUFJOzRCQUNKLEdBQUcsRUFBRTtnQ0FDRCxJQUFJO2dDQUNKLEdBQUcsRUFBRSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUM7Z0NBQ3RCLElBQUksRUFBRSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUM7NkJBQzFCOzRCQUNELFFBQVEsRUFBRSxHQUFHOzRCQUNiLFVBQVU7NEJBQ1YsVUFBVTs0QkFDVixxQkFBcUI7NEJBQ3JCLDRCQUE0Qjs0QkFDNUIsbUJBQW1COzRCQUNuQiwwQkFBMEI7NEJBQzFCLEtBQUssRUFBRSxDQUFDOzRCQUNSLE1BQU0sRUFBRSxDQUFDOzRCQUNULFFBQVEsRUFBRSxXQUFXOzRCQUNyQixTQUFTLEVBQUUsV0FBVzs0QkFDdEIsUUFBUSxFQUFFLFdBQVc7NEJBQ3JCLFNBQVMsRUFBRSxXQUFXOzRCQUN0QixlQUFlOzRCQUNmLEtBQUssRUFBRSx3QkFBd0IsR0FBRyxVQUFVLEdBQUcsSUFBSTt5QkFDdEQsRUFBRSxNQUFNLEdBQWlDOzRCQUN0QyxRQUFRLEVBQUUsSUFBSTs0QkFDZCxPQUFPLEVBQUUsQ0FBQyxLQUFLLGlCQUFpQjs0QkFDaEMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFOzRCQUNoQixHQUFHLEVBQUcsS0FBZSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSTs0QkFDeEMsR0FBRyxFQUFFLEtBQUs7NEJBQ1YsSUFBSSxFQUFFLENBQUMsS0FBSzs0QkFDWixVQUFVOzRCQUNWLFdBQVc7NEJBQ1gsVUFBVTs0QkFDVixNQUFNOzRCQUNOLElBQUksRUFBRSxhQUFhOzRCQUNuQixPQUFPLEVBQUUsSUFBSTs0QkFDYixVQUFVLEVBQUUsS0FBSzs0QkFDakIsT0FBTyxFQUFFLFdBQVc7NEJBQ3BCLHdCQUF3Qjs0QkFDeEIsWUFBWTs0QkFDWixpQkFBaUI7NEJBQ2pCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTTs0QkFDeEIsVUFBVTs0QkFDVixlQUFlOzRCQUNmLFFBQVEsRUFBRSxDQUFDLEdBQUcsaUJBQWlCOzRCQUMvQixPQUFPOzRCQUNQLE9BQU8sRUFBRSxDQUFDOzRCQUNWLE1BQU0sRUFBRSxTQUFTO3lCQUNwQixDQUFDO3dCQUVOLE1BQU0sUUFBUSxHQUFNLGNBQWMsQ0FBQzt3QkFFbkMsYUFBYSxHQUFHOzRCQUNaLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJOzRCQUNsRixRQUFRLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU07eUJBQzFELENBQUM7d0JBQ0Ysa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO3dCQUN2QixpQkFBaUIsR0FBRyxJQUFJLENBQUM7d0JBRXpCLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ2pDLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtZQUVELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUN0QyxJQUFJLENBQUMsR0FBRyxVQUFVLEVBQ2QsRUFBRSxHQUFHLENBQUMsRUFDTixHQUFHLEdBSUM7Z0JBQ0EsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsSUFBSSxFQUFFLEtBQUs7YUFDZCxDQUFDO1lBQ04sT0FBTyxXQUFXLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQixJQUFJLENBQUMsSUFBSSxnQkFBZ0IsRUFBRTtvQkFDdkIsTUFBTTtpQkFDVDtnQkFDRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ2pCLE1BQU07aUJBQ1Q7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLEtBQUssMEJBQTBCLENBQUMsRUFDekgsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQ1YsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQzdFLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQzVCLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBRSxFQUNyQixJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUM3RyxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFFbEYsSUFBSSxDQUFDLEdBQUcsT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDbkIsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDUCxHQUFHLEdBQUc7d0JBQ0YsSUFBSTt3QkFDSixHQUFHLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDO3dCQUN2QixJQUFJLEVBQUUsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDO3FCQUMzQixDQUFDO2lCQUNMO3FCQUFNO29CQUNILEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNwQyxFQUFFLEVBQUUsQ0FBQztpQkFDUjtnQkFFRCxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUNWLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxFQUFFLEtBQUssVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxhQUFhLEVBQUUsRUFBRSxFQUFFO3dCQUNqRixNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFDekQsTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLElBQUksQ0FBQyxFQUN2QyxRQUFRLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsSUFBSSxLQUFLLEVBQy9DLFVBQVUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxJQUFJLElBQUksRUFDbEQsV0FBVyxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLElBQUksS0FBSyxFQUNyRCxPQUFPLEdBQUcsYUFBYSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxVQUFVLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDekoscUJBQXFCLEdBQUcsR0FBRyxHQUFHLFVBQVUsRUFBRSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLDRCQUE0QixHQUFHLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFDekwsbUJBQW1CLEdBQUcsVUFBVSxHQUFHLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLEVBQ3hFLDBCQUEwQixHQUFHLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQ3hJLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQ2hFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ2hFLFFBQVEsR0FBbUM7NEJBQ3ZDLENBQUM7NEJBQ0QsQ0FBQzs0QkFDRCxZQUFZLEVBQUUsQ0FBQzs0QkFDZixZQUFZLEVBQUUsQ0FBQzs0QkFDZixDQUFDLEVBQUUsQ0FBQzs0QkFDSixTQUFTLEVBQUUsQ0FBQzs0QkFDWixTQUFTLEVBQUUsQ0FBQzs0QkFDWixTQUFTLEVBQUUsQ0FBQzs0QkFDWixNQUFNLEVBQUUsQ0FBQzs0QkFDVCxNQUFNLEVBQUUsQ0FBQzs0QkFDVCxNQUFNLEVBQUUsQ0FBQzs0QkFDVCxJQUFJOzRCQUNKLEdBQUc7NEJBQ0gsUUFBUSxFQUFFLEdBQUc7NEJBQ2IsVUFBVTs0QkFDVixVQUFVOzRCQUNWLHFCQUFxQjs0QkFDckIsNEJBQTRCOzRCQUM1QixtQkFBbUI7NEJBQ25CLDBCQUEwQjs0QkFDMUIsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTs0QkFDekcsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsQ0FBQzs0QkFDNUcsUUFBUSxFQUFFLFdBQVc7NEJBQ3JCLFNBQVMsRUFBRSxXQUFXOzRCQUN0QixRQUFRLEVBQUUsV0FBVzs0QkFDckIsU0FBUyxFQUFFLFdBQVc7NEJBQ3RCLGVBQWU7NEJBQ2YsS0FBSyxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsd0JBQXdCLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BILEVBQUUsTUFBTSxHQUFpQzs0QkFDdEMsT0FBTyxFQUFFLENBQUMsS0FBSyxpQkFBaUI7NEJBQ2hDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRTs0QkFDaEIsR0FBRyxFQUFHLEtBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUk7NEJBQ3hDLEdBQUcsRUFBRSxLQUFLOzRCQUNWLElBQUksRUFBRSxDQUFDLEtBQUs7NEJBQ1osVUFBVTs0QkFDVixXQUFXOzRCQUNYLFVBQVU7NEJBQ1YsTUFBTTs0QkFDTixJQUFJLEVBQUUsYUFBYTs0QkFDbkIsT0FBTyxFQUFFLEtBQUs7NEJBQ2QsVUFBVSxFQUFFLEtBQUs7NEJBQ2pCLE9BQU8sRUFBRSxXQUFXOzRCQUNwQix3QkFBd0I7NEJBQ3hCLFlBQVk7NEJBQ1osaUJBQWlCOzRCQUNqQixVQUFVLEVBQUUsS0FBSyxDQUFDLE1BQU07NEJBQ3hCLFVBQVU7NEJBQ1YsZUFBZTs0QkFDZixRQUFRLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQjs0QkFDL0IsTUFBTSxFQUFFLENBQUMsd0JBQXdCLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxFQUFFLENBQUM7NEJBQzNELE9BQU87NEJBQ1AsT0FBTyxFQUFFLENBQUM7NEJBQ1YsTUFBTSxFQUFFLFNBQVM7NEJBQ2pCLFFBQVE7eUJBQ1gsQ0FBQzt3QkFFTixJQUFJLE9BQU8sRUFBRTs0QkFDVCxNQUFNLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQzt5QkFDN0I7d0JBRUQsTUFBTSxRQUFRLEdBQU0sY0FBYyxDQUFDO3dCQUVuQyxNQUFNLElBQUksR0FBMkI7NEJBQ2pDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJOzRCQUNsRixRQUFRLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU07eUJBQzFELENBQUM7d0JBQ0YsSUFBSSxDQUFDLFVBQVUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsY0FBYyxDQUFDLEVBQUU7NEJBQzdILElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7NEJBQ3pFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3pFLFVBQVUsR0FBRyxJQUFJLENBQUM7NEJBQ2xCLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs0QkFDcEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQzs0QkFDMUYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO3lCQUN4Qzt3QkFDRCxJQUFJLENBQUMsYUFBYSxJQUFJLGtCQUFrQixHQUFHLENBQUMsSUFBSSxNQUFNLEtBQUssQ0FBQzs0QkFDeEQsQ0FBQyxHQUFHLElBQUksd0JBQXdCLEdBQUcsSUFBSSxHQUFHLGlCQUFpQixDQUFDLEVBQUU7NEJBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDOzRCQUNuRixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDbkYsYUFBYSxHQUFHLElBQUksQ0FBQzs0QkFDckIsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDOzRCQUN4QyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7NEJBQ3ZDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7eUJBQ2hHO3dCQUVELFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQzNCO2lCQUNKO2dCQUVELFdBQVcsRUFBRSxDQUFDO2dCQUVkLElBQUksRUFBRSxHQUFHLE9BQU8sS0FBSyxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTtvQkFDeEMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ25CO2dCQUNELENBQUMsRUFBRSxDQUFDO2FBQ1A7WUFFRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBRXBELElBQUksQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUkscUJBQXFCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDeEgsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLHFCQUFxQixFQUFFO29CQUNuRCxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDMUYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUM5RCxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ3BDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztvQkFDN0IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDekc7cUJBQU07b0JBQ0gsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNqQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO29CQUN0RyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDMUYsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDekc7YUFDSjtZQUVELElBQUksQ0FBQyxDQUFDLGFBQWEsSUFBSSxDQUFDLENBQUMsYUFBYTtnQkFDbEMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLHdCQUF3QixHQUFHLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRTtnQkFDdkgsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLHdCQUF3QixHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUU7b0JBQ2hHLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNuRyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3BFLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztvQkFDdkMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUNoQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2lCQUNsSDtxQkFBTTtvQkFDSCxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ3BDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsd0JBQXdCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDL0YsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztvQkFDL0csYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ25HLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7aUJBQ2xIO2FBQ0o7WUFFRCxJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUU7Z0JBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2pELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFO3dCQUNSLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDakgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQzt3QkFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztxQkFDdEQ7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEksQ0FBQztJQUVELDRCQUE0QixDQUFDLENBQTJCO1FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxTQUF5QjtRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxhQUFhLENBQUMsRUFBTTtRQUNoQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHdDQUF3QyxDQUFDLFFBQWdCLEVBQUUsY0FBNkIsSUFBSTtRQUN4RixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDM0MsSUFBSSxLQUFLLEdBQTJFLElBQUksRUFDcEYsSUFBSSxHQUEyRSxJQUFJLENBQUM7UUFDeEYsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFO1lBQ2QsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUU7Z0JBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFDeEYsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUN4QyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQ3hDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLEtBQUssRUFDdEQsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksS0FBSyxFQUNwRCxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUM3QyxHQUFHLEdBQUcsUUFBUSxDQUFDO2dCQUNuQixJQUFJLFVBQVUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRTtvQkFDOUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUN2RDtxQkFBTSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFO29CQUNyRCxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQ3ZEO2dCQUNELElBQUksT0FBTyxFQUFFO29CQUNULEtBQUssR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUN4RDtxQkFBTSxJQUFJLE1BQU0sRUFBRTtvQkFDZixJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztpQkFDdkQ7YUFDSjtTQUNKO1FBQ0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRTtZQUNoRCxPQUFPLElBQUksQ0FBQztTQUNmO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUtTLGFBQWEsQ0FBQyxVQUFtQixFQUFFLFFBQWdCO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2pGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsU0FBUzthQUNaO1lBQ0QsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDYixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNO2dCQUM5QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN2RCxDQUFDLENBQUM7WUFDSCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM3QztTQUNKO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ3JDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUNULEtBQUssTUFBTSxFQUFFLElBQUksS0FBSyxFQUFFO2dCQUNwQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2FBQzNEO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFRCxtQkFBbUI7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRVEsT0FBTztRQUNaLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVoQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUU7WUFDbkMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiwgfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfSBmcm9tIFwiLi4vbW9kZWxzL3JlbmRlci1pdGVtLm1vZGVsXCI7XHJcbmltcG9ydCB7IElkIH0gZnJvbSBcIi4uL3R5cGVzL2lkXCI7XHJcbmltcG9ydCB7IENBQ0hFX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSwgQ2FjaGVNYXAgfSBmcm9tIFwiLi9jYWNoZS1tYXBcIjtcclxuaW1wb3J0IHsgVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuaW1wb3J0IHsgSVJlY3QsIElTaXplIH0gZnJvbSBcIi4uL2ludGVyZmFjZXNcIjtcclxuaW1wb3J0IHtcclxuICAgIERFRkFVTFRfRElWSURFUywgSEVJR0hUX1BST1BfTkFNRSwgU0VSVklDRV9QUk9QX0RVTU1ZLCBTRVJWSUNFX1BST1BfRFVNTVlfRU5BQkxFRCwgVFJBQ0tfQllfUFJPUEVSVFlfTkFNRSwgV0lEVEhfUFJPUF9OQU1FLFxyXG4gICAgWF9QUk9QX05BTUUsIFlfUFJPUF9OQU1FLFxyXG59IGZyb20gXCIuLi9jb25zdFwiO1xyXG5pbXBvcnQgeyBJUmVuZGVyVmlydHVhbExpc3RJdGVtQ29uZmlnLCBJUmVuZGVyVmlydHVhbExpc3RJdGVtTWVhc3VyZXMsIElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAgfSBmcm9tIFwiLi4vbW9kZWxzXCI7XHJcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XHJcbmltcG9ydCB7IENNYXAgfSBmcm9tICcuLi91dGlscy9jbWFwJztcclxuaW1wb3J0IHsgYnVmZmVySW50ZXJwb2xhdGlvbiB9IGZyb20gXCIuLi91dGlscy9idWZmZXItaW50ZXJwb2xhdGlvblwiO1xyXG5pbXBvcnQgeyBCYXNlVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctbGlzdC1pdGVtL2Jhc2VcIjtcclxuaW1wb3J0IHsgUHJlcmVuZGVyQ2FjaGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy9uZy1wcmVyZW5kZXItY29udGFpbmVyL3R5cGVzL2NhY2hlXCI7XHJcbmltcG9ydCB7IFNjcm9sbERpcmVjdGlvbiB9IGZyb20gXCIuLi90eXBlc1wiO1xyXG5pbXBvcnQgeyBvYmplY3RBc1JlYWRvbmx5IH0gZnJvbSBcIi4uL3V0aWxzL29iamVjdFwiO1xyXG5pbXBvcnQgeyBnZXRTZXJ2aWNlSWRQcm9wIH0gZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHtcclxuICAgIERFRkFVTFRfQlVGRkVSX0VYVFJFTVVNX1RIUkVTSE9MRCwgREVGQVVMVF9NQVhfQlVGRkVSX1NFUVVFTkNFX0xFTkdUSCwgREVGQVVMVF9SRVNFVF9CVUZGRVJfU0laRV9USU1FT1VULCBFTkRfQ09MTEVDVElPTl9QUkVGSVhfSUQsXHJcbiAgICBJU19ORVcsIFNUQVJUX0NPTExFQ1RJT05fUFJFRklYX0lELFxyXG59IGZyb20gXCIuL2NvbnN0XCI7XHJcbmltcG9ydCB7IFpfSU5ERVhfMCwgWl9JTkRFWF8xLCBaX0lOREVYXzIsIFpfSU5ERVhfMywgfSBmcm9tICcuLi9jb25zdCc7XHJcbmltcG9ydCB7XHJcbiAgICBJR2V0SXRlbVBvc2l0aW9uT3B0aW9ucywgSUdldE1ldHJpY3NSZXR1cm5zLCBJSXRlbSwgSU1ldHJpY3MsIElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zLCBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnMsXHJcbiAgICBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMsXHJcbn0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xyXG5pbXBvcnQgeyBUcmFja0JveEV2ZW50cyB9IGZyb20gXCIuL2V2ZW50c1wiO1xyXG5pbXBvcnQgeyBDYWNoZSwgQ2FjaGVNYXBFdmVudHMsIENhY2hlTWFwTGlzdGVuZXJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcclxuaW1wb3J0IHsgSXRlbURpc3BsYXlNZXRob2RzIH0gZnJvbSBcIi4vZW51bXNcIjtcclxuaW1wb3J0IHsgQWxpZ25tZW50cyB9IGZyb20gXCIuLi9lbnVtc1wiO1xyXG5cclxuLyoqXHJcbiAqIEFuIG9iamVjdCB0aGF0IHBlcmZvcm1zIHRyYWNraW5nLCBjYWxjdWxhdGlvbnMgYW5kIGNhY2hpbmcuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE0LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29yZS90cmFjay1ib3gudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEFsZXhhbmRyb3ZpY2ggR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhY2tCb3g8QyBleHRlbmRzIEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgPSBhbnk+XHJcbiAgICBleHRlbmRzIENhY2hlTWFwPElkLCBDYWNoZSwgQ2FjaGVNYXBFdmVudHMsIENhY2hlTWFwTGlzdGVuZXJzPiB7XHJcblxyXG4gICAgcHJvdGVjdGVkIF90cmFja2VyITogVHJhY2tlcjxDPjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2l0ZW1zOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBzZXQgaXRlbXModjogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5faXRlbXMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXRlbXMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGlzcGxheUNvbXBvbmVudHM6IEFycmF5PENvbXBvbmVudFJlZjxDPj4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBkaXNwbGF5Q29tcG9uZW50cyh2OiBBcnJheTxDb21wb25lbnRSZWY8Qz4+IHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zbmFwcGVkRGlzcGxheUNvbXBvbmVudHM6IEFycmF5PENvbXBvbmVudFJlZjxDPj4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBzbmFwcGVkRGlzcGxheUNvbXBvbmVudHModjogQXJyYXk8Q29tcG9uZW50UmVmPEM+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NuYXBwZWREaXNwbGF5Q29tcG9uZW50cyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zY3JvbGxEaXJlY3Rpb246IFNjcm9sbERpcmVjdGlvbiA9IDA7XHJcbiAgICBzZXQgc2Nyb2xsRGlyZWN0aW9uKHY6IFNjcm9sbERpcmVjdGlvbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9zY3JvbGxEaXJlY3Rpb24gPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uID0gdjtcclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxEaXJlY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEaXJlY3Rpb247IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3RyYWNrQnk6IHN0cmluZyA9IFRSQUNLX0JZX1BST1BFUlRZX05BTUU7XHJcbiAgICBzZXQgdHJhY2tCeSh2OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5fdHJhY2tCeSA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90cmFja0J5ID0gdjtcclxuICAgIH1cclxuICAgIGdldCB0cmFja0J5KCkgeyByZXR1cm4gdGhpcy5fdHJhY2tCeTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGl2aWRlczogbnVtYmVyID0gREVGQVVMVF9ESVZJREVTO1xyXG5cclxuICAgIHNldCBkaXZpZGVzKHY6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9kaXZpZGVzID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2RpdmlkZXMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaXNJbmZpbml0eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHNldCBpc0luZmluaXR5KHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbmZpbml0eSA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc0luZmluaXR5ID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHNldCBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzTGF6eTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHNldCBpc0xhenkodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0xhenkgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faXNMYXp5ID0gdjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgdHJhY2tCeSBwcm9wZXJ0eVxyXG4gICAgICovXHJcbiAgICBzZXQgdHJhY2tpbmdQcm9wZXJ0eU5hbWUodjogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0aGlzLl90cmFja2VyLnRyYWNraW5nUHJvcGVydHlOYW1lID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3RyYWNraW5nUHJvcGVydHlOYW1lOiBzdHJpbmcgPSBUUkFDS19CWV9QUk9QRVJUWV9OQU1FO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXNTY3JvbGxTdGFydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHNldCBpc1Njcm9sbFN0YXJ0KHY6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9pc1Njcm9sbFN0YXJ0ID0gdjtcclxuICAgICAgICBpZiAodikge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1Njcm9sbFNuYXBUb1N0YXJ0ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1Njcm9sbEVuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHNldCBpc1Njcm9sbEVuZCh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5faXNTY3JvbGxFbmQgPSB2O1xyXG4gICAgICAgIGlmICh2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU2Nyb2xsU25hcFRvRW5kID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1Njcm9sbFNuYXBUb1N0YXJ0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGlzU25hcHBlZFRvU3RhcnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Nyb2xsU3RhcnQgfHwgdGhpcy5faXNTY3JvbGxTbmFwVG9TdGFydDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsU25hcFRvRW5kOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGlzU25hcHBlZFRvRW5kKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Njcm9sbEVuZCB8fCB0aGlzLl9pc1Njcm9sbFNuYXBUb0VuZDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbFN0YXJ0T2Zmc2V0OiBudW1iZXIgPSAwO1xyXG4gICAgc2V0IHNjcm9sbFN0YXJ0T2Zmc2V0KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ID0gdjtcclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxTdGFydE9mZnNldCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zY3JvbGxFbmRPZmZzZXQ6IG51bWJlciA9IDA7XHJcbiAgICBzZXQgc2Nyb2xsRW5kT2Zmc2V0KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3Njcm9sbEVuZE9mZnNldCA9IHY7XHJcbiAgICB9XHJcbiAgICBnZXQgc2Nyb2xsRW5kT2Zmc2V0KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxFbmRPZmZzZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IodHJhY2tpbmdQcm9wZXJ0eU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lID0gdHJhY2tpbmdQcm9wZXJ0eU5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIgPSBuZXcgVHJhY2tlcih0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgc2V0KGlkOiBJZCwgY2FjaGU6IENhY2hlKTogQ01hcDxJZCwgSVNpemU+IHtcclxuICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMuX21hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICBpZiAoYj8ud2lkdGggPT09IGNhY2hlLndpZHRoICYmIGI/LmhlaWdodCA9PT0gY2FjaGUuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2ID0gdGhpcy5fbWFwLnNldChpZCwgY2FjaGUpO1xyXG5cclxuICAgICAgICB0aGlzLmJ1bXBWZXJzaW9uKCk7XHJcbiAgICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9wcmV2aW91c0NvbGxlY3Rpb246IEFycmF5PElJdGVtPiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kZWxldGVkSXRlbXNNYXA6IHsgW2luZGV4OiBudW1iZXJdOiBJU2l6ZSB9ID0ge307XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuICAgIGdldCBjcnVkRGV0ZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9jcnVkRGV0ZWN0ZWQ7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNoYW5nZUlmTmVlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGFuZ2VzRGV0ZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKFRyYWNrQm94RXZlbnRzLkNIQU5HRSwgdGhpcy5fdmVyc2lvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBmaXJlVGljaygpIHtcclxuICAgICAgICB0aGlzLmRpc3BhdGNoKFRyYWNrQm94RXZlbnRzLlRJQ0spO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJldmlvdXNUb3RhbFNpemUgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfZGVsdGFPZk5ld0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gICAgZ2V0IGRlbHRhT2ZOZXdJdGVtcygpIHsgcmV0dXJuIHRoaXMuX2RlbHRhT2ZOZXdJdGVtczsgfVxyXG5cclxuICAgIGlzQWRhcHRpdmVCdWZmZXIgPSB0cnVlO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYnVmZmVyU2VxdWVuY2VFeHRyYVRocmVzaG9sZCA9IERFRkFVTFRfQlVGRkVSX0VYVFJFTVVNX1RIUkVTSE9MRDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX21heEJ1ZmZlclNlcXVlbmNlTGVuZ3RoID0gREVGQVVMVF9NQVhfQlVGRkVSX1NFUVVFTkNFX0xFTkdUSDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2J1ZmZlclNpemVTZXF1ZW5jZTogQXJyYXk8bnVtYmVyPiA9IFtdO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYnVmZmVyU2l6ZTogbnVtYmVyID0gMDtcclxuICAgIGdldCBidWZmZXJTaXplKCkgeyByZXR1cm4gdGhpcy5fYnVmZmVyU2l6ZTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGVmYXVsdEJ1ZmZlclNpemU6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9tYXhCdWZmZXJTaXplOiBudW1iZXIgPSB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Jlc2V0QnVmZmVyU2l6ZVRpbWVvdXQ6IG51bWJlciA9IERFRkFVTFRfUkVTRVRfQlVGRkVSX1NJWkVfVElNRU9VVDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Jlc2V0QnVmZmVyU2l6ZVRpbWVyOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1Jlc2V0ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX3ByZXJlbmRlcmVkQ2FjaGU6IFByZXJlbmRlckNhY2hlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgcHJpdmF0ZSBfbmV3SXRlbXM6IEFycmF5PElkPiA9IFtdO1xyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBsaWZlQ2lyY2xlKCkge1xyXG4gICAgICAgIHRoaXMuZmlyZUNoYW5nZUlmTmVlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmZpcmVUaWNrKCk7XHJcblxyXG4gICAgICAgIHRoaXMubGlmZUNpcmNsZURvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTY2FucyB0aGUgY29sbGVjdGlvbiBmb3IgZGVsZXRlZCBpdGVtcyBhbmQgZmx1c2hlcyB0aGUgZGVsZXRlZCBpdGVtIGNhY2hlLlxyXG4gICAgICovXHJcbiAgICByZXNldENvbGxlY3Rpb248SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+KGN1cnJlbnRDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBpdGVtU2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRDb2xsZWN0aW9uICE9PSB1bmRlZmluZWQgJiYgY3VycmVudENvbGxlY3Rpb24gIT09IG51bGwgJiZcclxuICAgICAgICAgICAgY3VycmVudENvbGxlY3Rpb24gPT09IHRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0F0dGVudGlvbiEgVGhlIGNvbGxlY3Rpb24gbXVzdCBiZSBpbW11dGFibGUuJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc2V0ZWQgPSAoKCF0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24gfHwgdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkgJiZcclxuICAgICAgICAgICAgKCEhY3VycmVudENvbGxlY3Rpb24gJiYgY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoID4gMCkpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc1Jlc2V0ZWQgPSByZXNldGVkO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUNhY2hlKHRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiwgY3VycmVudENvbGxlY3Rpb24sIGl0ZW1TaXplKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uID0gWy4uLihjdXJyZW50Q29sbGVjdGlvbiB8fCBbXSldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBjYWNoZSBvZiBpdGVtcyBmcm9tIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVDYWNoZTxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ocHJldmlvdXNDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjdXJyZW50Q29sbGVjdGlvbjogQyB8IG51bGwgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgaXRlbVNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRyYWNrQnkgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuICAgICAgICBsZXQgY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fbmV3SXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKCFjdXJyZW50Q29sbGVjdGlvbiB8fCBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKHByZXZpb3VzQ29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHByZXZpb3VzQ29sbGVjdGlvbltpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISFpdGVtICYmIHRoaXMuX21hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghcHJldmlvdXNDb2xsZWN0aW9uIHx8IHByZXZpb3VzQ29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhZGRlZFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjdXJyZW50Q29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25EaWN0OiBJSXRlbTxJPiA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbkRpY3RbaXRlbVt0cmFja0J5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG5vdENoYW5nZWRNYXA6IElJdGVtPEk+ID0ge30sIGRlbGV0ZWRNYXA6IElJdGVtPEk+ID0ge30sIGRlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fSxcclxuICAgICAgICAgICAgdXBkYXRlZE1hcDogSUl0ZW08ST4gPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHByZXZpb3VzQ29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHByZXZpb3VzQ29sbGVjdGlvbltpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICAgIGlmICghIWl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uRGljdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sbGVjdGlvbkRpY3RbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENoYW5nZWRNYXBbaXRlbVt0cmFja0J5XV0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4odGhpcy5fbWFwLmdldChpZCkgfHwgeyB3aWR0aDogaXRlbVNpemUsIGhlaWdodDogaXRlbVNpemUgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkTWFwW2l0ZW1bdHJhY2tCeV1dID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChpZCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHRoaXMuX21hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gZGVsZXRlZFxyXG4gICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZWRNYXBbaWRdID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcFtpXSA9IHRoaXMuX21hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtPy5bdHJhY2tCeV07XHJcbiAgICAgICAgICAgIGlmICghIWl0ZW0gJiYgIWRlbGV0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmICF1cGRhdGVkTWFwLmhhc093blByb3BlcnR5KGlkKSAmJlxyXG4gICAgICAgICAgICAgICAgIW5vdENoYW5nZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9uZXdJdGVtcy5wdXNoKGlkKTtcclxuICAgICAgICAgICAgICAgIC8vIGFkZGVkXHJcbiAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChpZCwgeyB3aWR0aDogaXRlbVNpemUsIGhlaWdodDogaXRlbVNpemUsIG1ldGhvZDogSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jcnVkRGV0ZWN0ZWQgPSBjcnVkRGV0ZWN0ZWQ7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZEl0ZW1zTWFwID0gZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgdGhlIHBvc2l0aW9uIG9mIGEgY29sbGVjdGlvbiBlbGVtZW50IGJ5IHRoZSBnaXZlbiBJZFxyXG4gICAgICovXHJcbiAgICBnZXRJdGVtUG9zaXRpb248SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+KGlkOiBJZCwgaXRlbUNvbmZpZ01hcDogSVZpcnR1YWxMaXN0SXRlbUNvbmZpZ01hcCxcclxuICAgICAgICBvcHRpb25zOiBJR2V0SXRlbVBvc2l0aW9uT3B0aW9uczxJLCBDPik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3Qgb3B0ID0geyBmcm9tSXRlbUlkOiBpZCA/PyBvcHRpb25zLmZyb21JdGVtSWQsIGl0ZW1Db25maWdNYXAsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA9IG9wdC5idWZmZXJTaXplO1xyXG4gICAgICAgIHRoaXMuX21heEJ1ZmZlclNpemUgPSBvcHQubWF4QnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBzY3JvbGxTaXplLCBpc0Zyb21JdGVtSWRGb3VuZCB9ID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplOiB0aGlzLl9jcnVkRGV0ZWN0ZWQgfHwgb3B0LmR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXA6IHRoaXMuX2RlbGV0ZWRJdGVtc01hcCxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gaXNGcm9tSXRlbUlkRm91bmQgPyBzY3JvbGxTaXplIDogLTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJldmVudFNjcm9sbFNuYXBwaW5nKGNsZWFyQnVmZmVyOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLl9pc1Njcm9sbFN0YXJ0ID0gdGhpcy5faXNTY3JvbGxFbmQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGNsZWFyQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU2Nyb2xsU25hcFRvU3RhcnQgPSB0aGlzLl9pc1Njcm9sbFNuYXBUb0VuZCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbGxlY3Rpb24gb2YgZGlzcGxheSBvYmplY3RzXHJcbiAgICAgKi9cclxuICAgIGdldE1ldHJpY3M8SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBpdGVtQ29uZmlnTWFwOiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElVcGRhdGVDb2xsZWN0aW9uT3B0aW9uczxJLCBDPik6IElHZXRNZXRyaWNzUmV0dXJucyB7XHJcbiAgICAgICAgY29uc3Qgb3B0ID0geyBpdGVtQ29uZmlnTWFwLCAuLi5vcHRpb25zIH0sIGNydWREZXRlY3RlZCA9IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgICAgIHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplID0gb3B0LmJ1ZmZlclNpemU7XHJcbiAgICAgICAgdGhpcy5fbWF4QnVmZmVyU2l6ZSA9IG9wdC5tYXhCdWZmZXJTaXplO1xyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGl0ZW1zLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IHRvdGFsU2l6ZTogbWV0cmljcy50b3RhbFNpemUsIGRlbHRhOiBtZXRyaWNzLmRlbHRhLCBjcnVkRGV0ZWN0ZWQgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbGxlY3Rpb24gb2YgZGlzcGxheSBvYmplY3RzXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZUNvbGxlY3Rpb248SSBleHRlbmRzIElJdGVtLCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBpdGVtQ29uZmlnTWFwOiBJVmlydHVhbExpc3RJdGVtQ29uZmlnTWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElVcGRhdGVDb2xsZWN0aW9uT3B0aW9uczxJLCBDPik6IElVcGRhdGVDb2xsZWN0aW9uUmV0dXJucyB7XHJcbiAgICAgICAgY29uc3Qgb3B0ID0geyBpdGVtQ29uZmlnTWFwLCAuLi5vcHRpb25zIH0sIGR5bmFtaWNTaXplID0gb3B0LmR5bmFtaWNTaXplLCBjcnVkRGV0ZWN0ZWQgPSB0aGlzLl9jcnVkRGV0ZWN0ZWQsXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCA9IHRoaXMuX2RlbGV0ZWRJdGVtc01hcDtcclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKG9wdC5pc1ZlcnRpY2FsLCBvcHQuaXRlbVNpemUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA9IG9wdC5idWZmZXJTaXplO1xyXG4gICAgICAgIHRoaXMuX21heEJ1ZmZlclNpemUgPSBvcHQubWF4QnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBpdGVtcyxcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemU6IHRoaXMuX3ByZXZpb3VzVG90YWxTaXplLFxyXG4gICAgICAgICAgICBjcnVkRGV0ZWN0ZWQ6IHRoaXMuX2NydWREZXRlY3RlZCxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zTWFwLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl9kZWx0YSArPSBtZXRyaWNzLmRlbHRhO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFkYXB0aXZlQnVmZmVyUGFyYW1zKG1ldHJpY3MsIGl0ZW1zLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzVG90YWxTaXplID0gbWV0cmljcy50b3RhbFNpemU7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbGV0ZWRJdGVtc01hcCA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLl9jcnVkRGV0ZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdC5keW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNuYXBzaG90KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkaXNwbGF5SXRlbXMgPSB0aGlzLmdlbmVyYXRlRGlzcGxheUNvbGxlY3Rpb24obWV0cmljcy5pdGVtcywgaXRlbXMsIGl0ZW1Db25maWdNYXAsIHsgLi4ubWV0cmljcywgfSk7XHJcbiAgICAgICAgcmV0dXJuIHsgZGlzcGxheUl0ZW1zLCB0b3RhbFNpemU6IG1ldHJpY3MudG90YWxTaXplLCBkZWx0YTogbWV0cmljcy5kZWx0YSwgY3J1ZERldGVjdGVkLCBsZWZ0TGF5b3V0T2Zmc2V0OiBtZXRyaWNzLmxlZnRMYXlvdXRPZmZzZXQgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZpb3VzU2Nyb2xsU2l6ZSA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUFkYXB0aXZlQnVmZmVyUGFyYW1zPEkgZXh0ZW5kcyBJSXRlbT4obWV0cmljczogSU1ldHJpY3M8ST4sIHRvdGFsSXRlbXNMZW5ndGg6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuZGlzcG9zZUNsZWFyQnVmZmVyU2l6ZVRpbWVyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSBtZXRyaWNzLnNjcm9sbFNpemUgKyB0aGlzLl9kZWx0YSwgZGVsdGEgPSBNYXRoLmFicyh0aGlzLl9wcmV2aW91c1Njcm9sbFNpemUgLSBzY3JvbGxTaXplKTtcclxuICAgICAgICB0aGlzLl9wcmV2aW91c1Njcm9sbFNpemUgPSBzY3JvbGxTaXplO1xyXG4gICAgICAgIGNvbnN0IGJ1ZmZlclJhd1NpemUgPSBNYXRoLm1pbihNYXRoLmZsb29yKG1ldHJpY3MudHlwaWNhbEl0ZW1TaXplICE9PSAwID8gZGVsdGEgLyBtZXRyaWNzLnR5cGljYWxJdGVtU2l6ZSA6IDApICogNSwgdG90YWxJdGVtc0xlbmd0aCksXHJcbiAgICAgICAgICAgIG1pbkJ1ZmZlclNpemUgPSBidWZmZXJSYXdTaXplIDwgdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgPyB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA6IGJ1ZmZlclJhd1NpemUsXHJcbiAgICAgICAgICAgIGJ1ZmZlclZhbHVlID0gbWluQnVmZmVyU2l6ZSA+IHRoaXMuX21heEJ1ZmZlclNpemUgPyB0aGlzLl9tYXhCdWZmZXJTaXplIDogbWluQnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZSA9IGJ1ZmZlckludGVycG9sYXRpb24odGhpcy5fYnVmZmVyU2l6ZSwgdGhpcy5fYnVmZmVyU2l6ZVNlcXVlbmNlLCBidWZmZXJWYWx1ZSwge1xyXG4gICAgICAgICAgICBleHRyZW11bVRocmVzaG9sZDogdGhpcy5fYnVmZmVyU2VxdWVuY2VFeHRyYVRocmVzaG9sZCxcclxuICAgICAgICAgICAgYnVmZmVyU2l6ZTogdGhpcy5fbWF4QnVmZmVyU2VxdWVuY2VMZW5ndGgsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhcnRSZXNldEJ1ZmZlclNpemVUaW1lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzdGFydFJlc2V0QnVmZmVyU2l6ZVRpbWVyKCkge1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0QnVmZmVyU2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNpemUgPSB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZTtcclxuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2l6ZVNlcXVlbmNlID0gW107XHJcbiAgICAgICAgfSwgdGhpcy5fcmVzZXRCdWZmZXJTaXplVGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGRpc3Bvc2VDbGVhckJ1ZmZlclNpemVUaW1lcigpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzZXRCdWZmZXJTaXplVGltZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyB0aGUgZW50cnkgaW50byB0aGUgb3ZlcnNjcm9sbCBhcmVhIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygb3ZlcnNjcm9sbCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0RWxlbWVudE51bVRvRW5kPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpOiBudW1iZXIsIGNvbGxlY3Rpb246IEMsIG1hcDogQ01hcDxJZCwgSVNpemU+LCB0eXBpY2FsSXRlbVNpemU6IG51bWJlcixcclxuICAgICAgICBzaXplOiBudW1iZXIsIGlzVmVydGljYWw6IGJvb2xlYW4sIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAwLCByZXZlcnNlOiBib29sZWFuID0gZmFsc2UpOiB7IG51bTogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciB9IHtcclxuICAgICAgICBjb25zdCB0cmFja0J5ID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUsIHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGogPSBjb2xsZWN0aW9uLmxlbmd0aCAtIGluZGV4T2Zmc2V0IC0gMTsgcmV2ZXJzZSA/IGogPj0gMCA6IGogPj0gaTsgai0tKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb2xsZWN0aW9uW2pdLCBpZCA9IGl0ZW1bdHJhY2tCeV07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBtYXAuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gY2FjaGUgJiYgY2FjaGVbc2l6ZVByb3BlcnR5XSA+IDAgPyBjYWNoZVtzaXplUHJvcGVydHldIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9mZnNldCArIGl0ZW1TaXplID4gc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbnVtLCBvZmZzZXQgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvZmZzZXQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIG51bSsrO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBudW0sIG9mZnNldCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY3VsYXRlcyBsaXN0IG1ldHJpY3NcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlY2FsY3VsYXRlTWV0cmljczxJIGV4dGVuZHMgSUl0ZW0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ob3B0aW9uczogSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SSwgQz4pOiBJTWV0cmljczxJPiB7XHJcbiAgICAgICAgY29uc3QgeyBhbGlnbm1lbnQsIGZyb21JdGVtSWQsIGJvdW5kcywgY29sbGVjdGlvbiwgZHluYW1pY1NpemUsIGlzVmVydGljYWwsIGl0ZW1TaXplLCBtaW5JdGVtU2l6ZSwgbWF4SXRlbVNpemUsIGJ1ZmZlclNpemU6IG1pbkJ1ZmZlclNpemUsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUsIHN0aWNreUVuYWJsZWQsIGl0ZW1Db25maWdNYXAsIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sIHByZXZpb3VzVG90YWxTaXplLCBzbmFwVG9JdGVtLCBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgIGRlbGV0ZWRJdGVtc01hcCwgaXRlbVRyYW5zZm9ybSB9ID0gb3B0aW9ucyBhcyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiAmIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAsXHJcbiAgICAgICAgICAgIH0sIHJvdW5kZWRTY3JvbGxTaXplID0gTWF0aC5yb3VuZChzY3JvbGxTaXplKTtcclxuXHJcbiAgICAgICAgY29uc3QgdHJhY2tCeSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lLCBidWZmZXJTaXplID0gTWF0aC5tYXgobWluQnVmZmVyU2l6ZSwgdGhpcy5fYnVmZmVyU2l6ZSksXHJcbiAgICAgICAgICAgIHsgd2lkdGgsIGhlaWdodCB9ID0gYm91bmRzLCBzaXplUHJvcGVydHkgPSBpc1ZlcnRpY2FsID8gSEVJR0hUX1BST1BfTkFNRSA6IFdJRFRIX1BST1BfTkFNRSxcclxuICAgICAgICAgICAgc2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCwgdG90YWxMZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCwgdHlwaWNhbEl0ZW1TaXplID0gaXRlbVNpemUsXHJcbiAgICAgICAgICAgIHcgPSBpc1ZlcnRpY2FsID8gd2lkdGggOiB0eXBpY2FsSXRlbVNpemUsIGggPSBpc1ZlcnRpY2FsID8gdHlwaWNhbEl0ZW1TaXplIDogaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXAgPSB0aGlzLl9tYXAsIHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3QsIGRpdmlkZXMgPSB0aGlzLl9kaXZpZGVzLFxyXG4gICAgICAgICAgICBzdGlja3lQb3MgPSBNYXRoLmZsb29yKHNjcm9sbFNpemUpICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQsIGxlZnRJdGVtc09yUm93c1dlaWdodHM6IEFycmF5PG51bWJlcj4gPSBbXSxcclxuICAgICAgICAgICAgaXNGcm9tSWQgPSBmcm9tSXRlbUlkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBmcm9tSXRlbUlkID09PSAnbnVtYmVyJyAmJiBmcm9tSXRlbUlkID4gLTEpXHJcbiAgICAgICAgICAgICAgICB8fCAodHlwZW9mIGZyb21JdGVtSWQgPT09ICdzdHJpbmcnICYmIGZyb21JdGVtSWQgPiAnLTEnKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnRJdGVtc09mZnNldCA9IDAsIHJpZ2h0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmIChlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fc2Nyb2xsRGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDE6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplICogZGl2aWRlcztcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgLTE6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplICogZGl2aWRlcztcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZSAqIGRpdmlkZXM7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZSAqIGRpdmlkZXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZDogbnVtYmVyID0gLTEsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gLTEsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gMCwgcmlnaHRJdGVtTGVuZ3RoID0gMCxcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0ID0gMCwgcmlnaHRJdGVtc1dlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBkZWx0YU9mTmV3SXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgaXRlbUJ5SWQ6IEkgfCBudWxsID0gbnVsbCxcclxuICAgICAgICAgICAgaXRlbUJ5SWRQb3M6IG51bWJlciA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXRlbUJ5SWRQb3MsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgdGhpcy5fc2Nyb2xsRW5kT2Zmc2V0LFxyXG4gICAgICAgICAgICBzdGFydEluZGV4OiBudW1iZXIsXHJcbiAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gPSAwLFxyXG4gICAgICAgICAgICBpc1VwZGF0aW5nID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGxlZnRZT2Zmc2V0ID0gMCxcclxuICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRJbmRleE9mZnNldCA9IDAsXHJcbiAgICAgICAgICAgIHJpZ2h0TGF5b3V0SW5kZXhPZmZzZXQgPSAwO1xyXG5cclxuICAgICAgICBjb25zdCBpc1N0YXJ0ID0gKChyb3VuZGVkU2Nyb2xsU2l6ZSA9PT0gMCkgfHwgdGhpcy5pc1NuYXBwZWRUb1N0YXJ0KTtcclxuICAgICAgICBsZXQgc3RpY2t5SXRlbUlkOiBJZCB8IHVuZGVmaW5lZCwgaXNOZXcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zOiBBcnJheTxJPjtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgZHluYW1pYyBvciB0aGVyZSBhcmUgbmV3IGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLCB0aGVuIGl0IHN3aXRjaGVzIHRvIHRoZSBsb25nIGFsZ29yaXRobS5cclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZUlkUHJvcCA9IGdldFNlcnZpY2VJZFByb3AodHJhY2tCeSk7XHJcbiAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3RpY2t5SWQ6IElkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLCBpID0gMCwgbCA9IGNvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25baV0sIGlkID0gaXRlbT8uW3RyYWNrQnldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ29uZmlnTWFwW2lkXT8uc3RpY2t5ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUlkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtSWQgPSBzdGlja3lJZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IGZyb21JdGVtSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgeSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5Q29tcG9uZW50U2l6ZSA9IDAsXHJcbiAgICAgICAgICAgICAgICByb3c6IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEl0ZW1JbmRleDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZEl0ZW1JbmRleDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdFNpemU6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBkZWx0YUZyb21TdGFydENyZWF0aW9uOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc09yUm93c1dlaWdodHM6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIH0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3RTaXplOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb246IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZlVwZGF0ZWRJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGUgPSAoaTogbnVtYmVyLCBsOiBudW1iZXIsIGxpOiBudW1iZXIsIGlzUHJlY29sbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBpZFByZWZpeDogc3RyaW5nIHwgbnVsbCA9IG51bGwpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWkgPiBsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkl0ZW0gPSBjb2xsZWN0aW9uW2ldLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcD8uW2lkXT8uc3RpY2t5ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNOZXdSb3cgPSBpICUgZGl2aWRlcyA9PT0gMCxcclxuICAgICAgICAgICAgICAgICAgICBpc0xhc3RJdGVtSW5Sb3cgPSBpaSAlIGRpdmlkZXMgPT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNMYXN0SXRlbSA9IGkgPT09IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzUm93RW5kID0gKGlzTGFzdEl0ZW1JblJvdyB8fCAoIWlzTGFzdEl0ZW1JblJvdyAmJiBpc0xhc3RJdGVtKSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGlzUHJlY29sbGVjdGlvbiA/IHsgLi4uY29sbGVjdGlvbkl0ZW0sIFtzZXJ2aWNlSWRQcm9wXTogYF8ke2lkUHJlZml4fS0ke2lkfV9gIH0gOiBjb2xsZWN0aW9uSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOZXdSb3cgfHwgcm93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEl0ZW1JbmRleDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEl0ZW1JbmRleDogaSArIGRpdmlkZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90U2l6ZTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFGcm9tU3RhcnRDcmVhdGlvbjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhT2ZOZXdJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0czogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcG9uZW50U2l6ZSA9IDAsIHJvd1NpemVEZWx0YSA9IDAsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWFwLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IG1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNpemUgPSBjYWNoZVtzaXplUHJvcGVydHldID4gMCA/IGNhY2hlW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbURpc3BsYXlNZXRob2QgPSBjYWNoZT8ubWV0aG9kID8/IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJdGVtTmV3ID0gdGhpcy5fbmV3SXRlbXMuaW5kZXhPZihpZCkgPiAtMSB8fCAodGhpcy5faXNMYXp5ICYmIGlzU3RhcnQgJiYgIXRoaXMuX2lzUmVzZXRlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNOZXcgPSBpc0l0ZW1OZXc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzVXBkYXRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwc2hvdEJvdW5kcyA9IHNuYXBzaG90LmdldChpZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90U2l6ZSA9IHNuYXBzaG90Qm91bmRzID8gc25hcHNob3RCb3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnNpemUgPSBNYXRoLm1heChyb3cuc2l6ZSwgY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnNuYXBzaG90U2l6ZSA9IE1hdGgubWF4KHJvdy5zbmFwc2hvdFNpemUsIHNuYXBzaG90U2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1NpemVEZWx0YSA9IHJvdy5zaXplIC0gcm93LnNuYXBzaG90U2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtRGlzcGxheU1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIHsgLi4uY2FjaGUsIG1ldGhvZDogaXNOZXcgPyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFIDogSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VELCBbSVNfTkVXXTogaXNOZXcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3dFbmQgJiYgaXNOZXcgJiYgeSA8PSAoc2Nyb2xsU2l6ZSArIHNpemUgKyBkZWx0YUZyb21TdGFydENyZWF0aW9uICsgY29tcG9uZW50U2l6ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTaXplRGVsdGEgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dTaXplRGVsdGEgPSB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmNhY2hlLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEUsIFtJU19ORVddOiBpc05ldyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Jvd0VuZCAmJiBpc05ldyAmJiB5IDw9IChzY3JvbGxTaXplICsgc2l6ZSArIGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gKyBjb21wb25lbnRTaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5kZWx0YUZyb21TdGFydENyZWF0aW9uID0gcm93U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1NpemVEZWx0YSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZSA9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICByb3cuc2l6ZSA9IE1hdGgubWF4KHJvdy5zaXplLCBjb21wb25lbnRTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICByb3cuc25hcHNob3RTaXplID0gcm93LnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93U2l6ZURlbHRhID0gcm93LnNpemUgLSByb3cuc25hcHNob3RTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkSXRlbXNNYXAuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZSA9IGRlbGV0ZWRJdGVtc01hcFtpXSwgc2l6ZSA9IGNhY2hlPy5bc2l6ZVByb3BlcnR5XSA/PyB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzY3JvbGxTaXplICsgdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgLSBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5sZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zID0gTWF0aC5tYXgocm93LmxlZnRTaXplT2ZEZWxldGVkSXRlbXMsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9IGZyb21JdGVtSWQgJiYgaWQgPT09IHN0aWNreUl0ZW1JZCAmJiBzdGlja3kgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbXBvbmVudFNpemUgPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGlnbm1lbnQgIT09IEFsaWdubWVudHMuQ0VOVEVSKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBudW0sIG9mZnNldCB9ID0gdGhpcy5nZXRFbGVtZW50TnVtVG9FbmQoaSwgY29sbGVjdGlvbiwgbWFwLCB0eXBpY2FsSXRlbVNpemUsIHNpemUsIGlzVmVydGljYWwpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Vmlld3BvcnRTaXplID0gc2l6ZSAtIG9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVmdFZpZXdwb3J0U2l6ZSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBudW06IG51bTEsIG9mZnNldDogb2Zmc2V0MSB9ID0gdGhpcy5nZXRFbGVtZW50TnVtVG9FbmQoaSArIG51bSwgY29sbGVjdGlvbiwgbWFwLCB0eXBpY2FsSXRlbVNpemUsIHNpemUsIGlzVmVydGljYWwsIDAsIHRydWUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFOdW0gPSAobnVtMSAtIG51bSksIGRlbHRhT2Zmc2V0ID0gKG9mZnNldDEgLSBvZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ICs9IG9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtPSBkZWx0YU51bTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCA9IHJpZ2h0SXRlbUxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCAtPSBkZWx0YU9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cy5zcGxpY2UobGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cy5sZW5ndGggLSBkZWx0YU51bSwgZGVsdGFOdW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC09IGRlbHRhT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZCA9IGNvbGxlY3Rpb25JdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWRQb3MgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gcm93LnN0YXJ0SXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh5IDw9IHNjcm9sbFNpemUgLSBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdy5sZWZ0SXRlbXNPclJvd3NXZWlnaHRzID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5sZWZ0SXRlbXNPclJvd3NXZWlnaHRzID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LmxlZnRJdGVtc09yUm93c1dlaWdodHMgPSBNYXRoLm1heChyb3cubGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cywgY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LmxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IE1hdGgubWF4KHJvdy5sZWZ0SGlkZGVuSXRlbXNXZWlnaHQsIGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNQcmVjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSByb3cuc3RhcnRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnlJZCA9PT0gbnVsbCB8fCB5IDwgaXRlbUJ5SWRQb3MgKyBzaXplICsgY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IHJvdy5lbmRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8PSBzY3JvbGxTaXplICsgc2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzUHJlY29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IHJvdy5lbmRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgcmlnaHRJdGVtc09mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LnRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSBNYXRoLm1heChyb3cudG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCwgY29tcG9uZW50U2l6ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Jvd0VuZCAmJiB5IDw9IHNjcm9sbFNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5sZWZ0U2l6ZU9mQWRkZWRJdGVtcyA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLk5PVF9DSEFOR0VEOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgPSByb3dTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5ERUxFVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cubGVmdFNpemVPZkRlbGV0ZWRJdGVtcyA9IHJvd1NpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm93RW5kICYmIGl0ZW1EaXNwbGF5TWV0aG9kID09PSBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5kZWx0YU9mTmV3SXRlbXMgPSByb3dTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNSb3dFbmQgJiYgaSA8IGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cucmlnaHRJdGVtc1dlaWdodCA9IE1hdGgubWF4KHJvdy5yaWdodEl0ZW1zV2VpZ2h0LCBjb21wb25lbnRTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzUm93RW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ByZWNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFGcm9tU3RhcnRDcmVhdGlvbiArPSByb3cuZGVsdGFGcm9tU3RhcnRDcmVhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXMgKz0gcm93LmxlZnRTaXplT2ZBZGRlZEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zICs9IHJvdy5sZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zICs9IHJvdy5sZWZ0U2l6ZU9mRGVsZXRlZEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YU9mTmV3SXRlbXMgKz0gcm93LmRlbHRhT2ZOZXdJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCArPSByb3cucmlnaHRJdGVtc1dlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSByb3cudG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IHJvdy5sZWZ0SGlkZGVuSXRlbXNXZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cubGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cyAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0cy5wdXNoKHJvdy5sZWZ0SXRlbXNPclJvd3NXZWlnaHRzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gcm93LnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgeSArPSByb3cuc2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld3BvcnRTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJ1ZmZTaXplID0gLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsU2l6ZSA8PSB2aWV3cG9ydFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aCwgbGkgPSBsID4gMCA/IChsIC0gMSkgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW1pdCA9IHZpZXdwb3J0U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHkgPD0gbGltaXQgfHwgYnVmZlNpemUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmU2l6ZSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmU2l6ZSA9IGxlZnRJdGVtc09mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID49IGxpbWl0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZlNpemUtLTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FsY3VsYXRlKGxpIC0gaSwgbCwgbGksIHRydWUsIFNUQVJUX0NPTExFQ1RJT05fUFJFRklYX0lEKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlpID09PSBsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0WU9mZnNldCA9IHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRMYXlvdXRPZmZzZXQgPSB2aWV3cG9ydFNpemUgKiAuNTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdExheW91dEluZGV4T2Zmc2V0ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgPSB0aGlzLl9zY3JvbGxTdGFydE9mZnNldCArIHRoaXMuX3Njcm9sbEVuZE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyBhcyBhbnkpID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGgsIGxpID0gbCAtIDE7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghY2FsY3VsYXRlKGksIGwsIGxpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgKHJvdyBhcyBhbnkpID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB5eSA9IHksIGN1cnJlbnRUb3RhbFNpemUgPSB0b3RhbFNpemUsIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkVG90YWxTaXplID0gdG90YWxTaXplICsgdmlld3BvcnRTaXplO1xyXG4gICAgICAgICAgICAgICAgcm93ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZEl0ZW1JbmRleDogMCxcclxuICAgICAgICAgICAgICAgICAgICBzaXplOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90U2l6ZTogMCxcclxuICAgICAgICAgICAgICAgICAgICBkZWx0YUZyb21TdGFydENyZWF0aW9uOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtczogMCxcclxuICAgICAgICAgICAgICAgICAgICBkZWx0YU9mTmV3SXRlbXM6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT3JSb3dzV2VpZ2h0czogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodDogMCxcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0OiAwLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBjb2xsZWN0aW9uLmxlbmd0aCwgbGkgPSBsIC0gMTtcclxuICAgICAgICAgICAgICAgIGxldCBpID0gMCwgY291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHkgPCBub3JtYWxpemVkVG90YWxTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGN1bGF0ZShpLCBsLCBsaSwgdHJ1ZSwgRU5EX0NPTExFQ1RJT05fUFJFRklYX0lEKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlpID09PSBsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHkgPSB5eTtcclxuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGN1cnJlbnRUb3RhbFNpemU7XHJcbiAgICAgICAgICAgICAgICByaWdodExheW91dEluZGV4T2Zmc2V0ID0gY291bnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSAoaXNGcm9tSWQgPyBpdGVtQnlJZFBvcyA6IHNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPD0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA8PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzLnNwbGljZSgwLCBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzLmxlbmd0aCAtIGJ1ZmZlclNpemUpO1xyXG4gICAgICAgICAgICBsZWZ0SXRlbXNPclJvd3NXZWlnaHRzLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgKz0gdjtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsIGxlZnRJdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgcmlnaHRJdGVtc09mZnNldCA+IHRvdGFsTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICA/IHRvdGFsTGVuZ3RoIC0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgOiByaWdodEl0ZW1zT2Zmc2V0O1xyXG5cclxuICAgICAgICAgICAgc3RhcnRJbmRleCA9IChNYXRoLmNlaWwoTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtIGxlZnRJdGVtTGVuZ3RoLCB0b3RhbExlbmd0aCA+IDAgPyB0b3RhbExlbmd0aCAtIDEgOiAwKSAvIGRpdmlkZXMpICogZGl2aWRlcyk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgLy8gQnVmZmVyIG9wdGltaXphdGlvbiBkb2VzIG5vdCB3b3JrIG9uIGZhc3QgbGluZWFyIGFsZ29yaXRobVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc3QgZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSA9IHR5cGljYWxJdGVtU2l6ZSAvIGRpdmlkZXMsIGJ1ZmZlckl0ZW1OdW1iZXJzID0gYnVmZmVyU2l6ZSAqIGRpdmlkZXM7XHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSBNYXRoLmZsb29yKGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgIT09IDAgPyAoc2Nyb2xsU2l6ZSAvIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUpIDogMCk7XHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gTWF0aC5jZWlsKGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgIT09IDAgPyAoKHNjcm9sbFNpemUgKyBzaXplKSAvIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUpIDogMCk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgYnVmZmVyU2l6ZSAqIGRpdmlkZXMpO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSAoaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyBidWZmZXJJdGVtTnVtYmVycykgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogYnVmZmVySXRlbU51bWJlcnM7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IE1hdGguZmxvb3IobGVmdEl0ZW1MZW5ndGggKiBkaXZpZGVkVHlwaWNhbEl0ZW1TaXplIC8gdHlwaWNhbEl0ZW1TaXplKSAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtc1dlaWdodCA9IE1hdGguZmxvb3IocmlnaHRJdGVtTGVuZ3RoICogZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAvIHR5cGljYWxJdGVtU2l6ZSkgKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IE1hdGguZmxvb3IoaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgLyB0eXBpY2FsSXRlbVNpemUpICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ID0gTWF0aC5mbG9vcihpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemUgLyB0eXBpY2FsSXRlbVNpemUpICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB0b3RhbFNpemUgPSAoTWF0aC5jZWlsKHRvdGFsTGVuZ3RoIC8gZGl2aWRlcykgKiBkaXZpZGVzICogZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSkgKyB0aGlzLl9zY3JvbGxTdGFydE9mZnNldCArIHRoaXMuX3Njcm9sbEVuZE9mZnNldDtcclxuICAgICAgICAgICAgY29uc3QgayA9IHRvdGFsU2l6ZSAhPT0gMCA/IHByZXZpb3VzVG90YWxTaXplIC8gdG90YWxTaXplIDogMDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjb2xsZWN0aW9uLmZpbmRJbmRleChpdGVtID0+IGl0ZW1bdHJhY2tCeV0gPT0gZnJvbUl0ZW1JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1CeUlkUG9zID0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgKyBNYXRoLmZsb29yKGluZGV4ICogZGl2aWRlZFR5cGljYWxJdGVtU2l6ZSAvIGRpdmlkZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlzRnJvbUl0ZW1JZEZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IChpc0Zyb21JZCA/IGl0ZW1CeUlkUG9zIDogc2Nyb2xsU2l6ZSAqIGspO1xyXG5cclxuICAgICAgICAgICAgaXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luZmluaXR5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGg7XHJcbiAgICAgICAgICAgICAgICBsZXQgYnVmZlNpemUgPSAtMSwgeSA9IHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgPD0gdmlld3BvcnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGgsIGxpID0gbCA+IDAgPyAobCAtIDEpIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSB2aWV3cG9ydFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh5IDw9IGxpbWl0IHx8IGJ1ZmZTaXplID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZlNpemUgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZlNpemUgPSBsZWZ0SXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+PSBsaW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZTaXplLS07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBsaSAtIGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPiBpdGVtSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGNvbGxlY3Rpb25baXRlbUluZGV4XSBhcyBJKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RJdGVtSW5Sb3cgPSBpaSAlIGRpdmlkZXMgPT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0SXRlbSA9IGkgPT09IGxpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTGFzdEl0ZW1JblJvdyB8fCAoIWlzTGFzdEl0ZW1JblJvdyAmJiBpc0xhc3RJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gZGl2aWRlZFR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpaSA9PT0gbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnJldmVyc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFlPZmZzZXQgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0TGF5b3V0T2Zmc2V0ID0gdmlld3BvcnRTaXplICogLjU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRMYXlvdXRJbmRleE9mZnNldCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtcy5wdXNoKC4uLmNvbGxlY3Rpb24pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgICAgIGxldCB5ID0gTWF0aC5mbG9vcih0b3RhbFNpemUgLyBkaXZpZGVkVHlwaWNhbEl0ZW1TaXplKSAqIGRpdmlkZWRUeXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFRvdGFsU2l6ZSA9IHRvdGFsU2l6ZSArIHZpZXdwb3J0U2l6ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBjb2xsZWN0aW9uLmxlbmd0aCwgbGkgPSBsIC0gMTtcclxuICAgICAgICAgICAgICAgIGxldCBpID0gMCwgY291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgd2hpbGUgKHkgPCBub3JtYWxpemVkVG90YWxTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWkgPSBpICsgMTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPD0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChjb2xsZWN0aW9uW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0xhc3RJdGVtSW5Sb3cgPSBpaSAlIGRpdmlkZXMgPT09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdEl0ZW0gPSBpID09PSBsaTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNMYXN0SXRlbUluUm93IHx8ICghaXNMYXN0SXRlbUluUm93ICYmIGlzTGFzdEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgKz0gZGl2aWRlZFR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlpID09PSBsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJpZ2h0TGF5b3V0SW5kZXhPZmZzZXQgPSBjb3VudDtcclxuICAgICAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgbGVmdEl0ZW1zT2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgcmlnaHRJdGVtc09mZnNldCA+IHRvdGFsTGVuZ3RoXHJcbiAgICAgICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogcmlnaHRJdGVtc09mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gKE1hdGguY2VpbChNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApIC8gZGl2aWRlcykgKiBkaXZpZGVzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBpdGVtc09uRGlzcGxheVdlaWdodCA9IHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgLSBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgLSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgKyBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgLSBsZWZ0SXRlbXNXZWlnaHQgLSBsZWZ0WU9mZnNldCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXMgPSAoTWF0aC5jZWlsKChpdGVtc09uRGlzcGxheUxlbmd0aCArIGxlZnRJdGVtTGVuZ3RoICsgcmlnaHRJdGVtTGVuZ3RoKSAvIGRpdmlkZXMpICogZGl2aWRlcykgKyByaWdodExheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICBzdGFydENyZWF0aW9uRGVsdGEgPSBkZWx0YUZyb21TdGFydENyZWF0aW9uID4gMCA/IGRlbHRhRnJvbVN0YXJ0Q3JlYXRpb24gOiAwLFxyXG4gICAgICAgICAgICBkZWx0YSA9IGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKyBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyAtIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKyBzdGFydENyZWF0aW9uRGVsdGE7XHJcbiAgICAgICAgdGhpcy5fZGVsdGFPZk5ld0l0ZW1zID0gZGVsdGFPZk5ld0l0ZW1zO1xyXG5cclxuICAgICAgICBpZiAoaXNGcm9tSWQgJiYgIWlzVGFyZ2V0SW5PdmVyc2Nyb2xsKSB7XHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgLT0gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzOiBJTWV0cmljczxJPiA9IHtcclxuICAgICAgICAgICAgZGVsdGEsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtV2lkdGg6IHcsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtSGVpZ2h0OiBoLFxyXG4gICAgICAgICAgICB3aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgZGl2aWRlcyxcclxuICAgICAgICAgICAgaXRlbVNpemUsXHJcbiAgICAgICAgICAgIG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kLFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheVdlaWdodCxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXlMZW5ndGgsXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgbGVmdExheW91dE9mZnNldCxcclxuICAgICAgICAgICAgbGVmdExheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyxcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplOiBhY3R1YWxTY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mQWRkZWRJdGVtcyxcclxuICAgICAgICAgICAgc2l6ZVByb3BlcnR5LFxyXG4gICAgICAgICAgICBzdGlja3lFbmFibGVkLFxyXG4gICAgICAgICAgICBzdGlja3lQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQsXHJcbiAgICAgICAgICAgIGlzVXBkYXRpbmcsXHJcbiAgICAgICAgICAgIHNuYXBUb0l0ZW0sXHJcbiAgICAgICAgICAgIHNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgICAgICAgaXRlbVRyYW5zZm9ybSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gbWV0cmljcztcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQ2FjaGUoY2FjaGU6IFByZXJlbmRlckNhY2hlKSB7XHJcbiAgICAgICAgdGhpcy5fcHJlcmVuZGVyZWRDYWNoZSA9IGNhY2hlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyRGVsdGEoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVsdGEgPSB0aGlzLl9kZWx0YU9mTmV3SXRlbXMgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZXMoaW1tZWRpYXRlbHk6IGJvb2xlYW4gPSBmYWxzZSwgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpbW1lZGlhdGVseSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1ZlcnNpb24gPSB0aGlzLl92ZXJzaW9uO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoKENBQ0hFX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSBhcyBDYWNoZU1hcEV2ZW50cywgdGhpcy52ZXJzaW9uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5jaGFuZ2VzRGV0ZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJvdW5kcyBvZiBhdCBsZWFzdCBvbmUgc2NyZWVuIG9iamVjdCBoYXZlIGNoYW5nZWQuXHJcbiAgICAgKi9cclxuICAgIGNoZWNrQm91bmRzT2ZFbGVtZW50cygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzW2ldLCBpdGVtSWQgPSBjb21wb25lbnQuaW5zdGFuY2UuaXRlbUlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IGNvbXBvbmVudC5pbnN0YW5jZS5nZXRCb3VuZHMoKSwgY2FjaGUgPSB0aGlzLmdldChpdGVtSWQpO1xyXG4gICAgICAgICAgICBpZiAoISFib3VuZHMgJiYgISFjYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy53aWR0aCAhPT0gY2FjaGUud2lkdGggfHwgYm91bmRzLmhlaWdodCAhPT0gY2FjaGUuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uPEkgZXh0ZW5kcyBJSXRlbSwgQyBleHRlbmRzIEFycmF5PEk+PihpdGVtczogQywgYWN0dWFsSXRlbXM6IEMsIGl0ZW1Db25maWdNYXA6IElWaXJ0dWFsTGlzdEl0ZW1Db25maWdNYXAsXHJcbiAgICAgICAgbWV0cmljczogSU1ldHJpY3M8ST4pOiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHtcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIHdpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtV2lkdGgsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgZGl2aWRlcyxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXlMZW5ndGgsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgIGxlZnRMYXlvdXRPZmZzZXQ6IGxheW91dE9mZnNldCxcclxuICAgICAgICAgICAgbGVmdExheW91dEluZGV4T2Zmc2V0OiBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXM6IHJlbmRlckl0ZW1zTGVuZ3RoLFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBzaXplUHJvcGVydHksXHJcbiAgICAgICAgICAgIHN0aWNreUVuYWJsZWQsXHJcbiAgICAgICAgICAgIHN0aWNreVBvcyxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgdG90YWxMZW5ndGgsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgIG1heEl0ZW1TaXplLFxyXG4gICAgICAgICAgICBzbmFwVG9JdGVtLFxyXG4gICAgICAgICAgICBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgIGl0ZW1UcmFuc2Zvcm0sXHJcbiAgICAgICAgfSA9IG1ldHJpY3MsXHJcbiAgICAgICAgICAgIGRpc3BsYXlJdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyYWNrQnkgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSwgYWN0dWFsU25pcHBlZFBvc2l0aW9uID0gc3RpY2t5UG9zLFxyXG4gICAgICAgICAgICAgICAgaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID0gdGhpcy5faXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkLFxyXG4gICAgICAgICAgICAgICAgZGVsdGFPZmZldCA9IChpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgPyBzY3JvbGxTaXplIDogMCksXHJcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24gPSB0aGlzLl9zY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICBib3VuZHNTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLCBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gPSBzY3JvbGxTaXplICsgYm91bmRzU2l6ZSAtIHRoaXMuX3Njcm9sbEVuZE9mZnNldDtcclxuICAgICAgICAgICAgbGV0IHBvcyA9IHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICByZW5kZXJJdGVtcyA9IHJlbmRlckl0ZW1zTGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5SXRlbTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCwgbmV4dFN0aWNreTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCwgc3RpY2t5SXRlbUluZGV4ID0gLTEsXHJcbiAgICAgICAgICAgICAgICBzdGlja3lJdGVtU2l6ZSA9IDAsIGVuZFN0aWNreUl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIG5leHRFbmRTdGlja3k6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtSW5kZXggPSAtMSwgZW5kU3RpY2t5SXRlbVNpemUgPSAwO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbGkgPSBsYXlvdXRJbmRleE9mZnNldCArIGFjdHVhbEl0ZW1zLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGlmIChzdGlja3lFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA+IDAgPyAoZGl2aWRlcyA+IDEgPyAoaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtIDEpIDogaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCkgOiAwLCB0b3RhbExlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtID0gaXRlbXNbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHVtbXkgPSBjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gJiYgKGNvbGxlY3Rpb25JdGVtPy5bU0VSVklDRV9QUk9QX0RVTU1ZXSA9PT0gU0VSVklDRV9QUk9QX0RVTU1ZX0VOQUJMRUQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW0gfHwgaXNEdW1teSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBNYXRoLmZsb29yKCgoaXRlbXMubGVuZ3RoIC0gbGF5b3V0SW5kZXhPZmZzZXQgKyBpKSArIDEpIC8gZGl2aWRlcyksIGlkID0gY29sbGVjdGlvbkl0ZW1bdHJhY2tCeV0sIGNhY2hlID0gdGhpcy5nZXQoaWQpISwgc3RpY2t5ID0gaXRlbUNvbmZpZ01hcFtpZF0/LnN0aWNreSA/PyAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlID0gaXRlbUNvbmZpZ01hcFtpZF0/LnNlbGVjdGFibGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uY29sbGFwc2FibGUgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBkeW5hbWljU2l6ZSA/IGNhY2hlPy5bc2l6ZVByb3BlcnR5XSA+IDAgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemUgOiB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIChzY3JvbGxTaXplIC0gc2l6ZSkgLSBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByYXRpbyA9IHNpemUgIT09IDAgPyBib3VuZHNTaXplIC8gc2l6ZSA6IDAsIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQgPSAtKGJvdW5kc1NpemUgIT09IDAgPyBhYnNvbHV0ZVN0YXJ0UG9zaXRpb24gLyBib3VuZHNTaXplIDogMCkgKiByYXRpbyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uUGVyY2VudCA9IChhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50ICsgKGJvdW5kc1NpemUgIT09IDAgPyAoYWJzb2x1dGVFbmRQb3NpdGlvbiArIHNpemUpIC8gYm91bmRzU2l6ZSA6IDApICogcmF0aW8pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB4ID0gaXNWZXJ0aWNhbCA/IDAgOiBhY3R1YWxTbmlwcGVkUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBpc1ZlcnRpY2FsID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogMDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzT2RkID0gKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgJSAyICE9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlczogSVJlbmRlclZpcnR1YWxMaXN0SXRlbU1lYXN1cmVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZFg6IHgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRZOiB5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHo6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25YOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblo6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVYOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVo6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGlzVmVydGljYWwgPyBub3JtYWxpemVkSXRlbVdpZHRoIDogc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGlzVmVydGljYWwgPyBzaXplIDogbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiByb3dJbmRleCAlIDIgIT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogcm93SW5kZXggJSAyID09IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogcG9zLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kc1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogc3RpY2t5ID09PSAxID8gdGhpcy5fc2Nyb2xsU3RhcnRPZmZzZXQgOiBzdGlja3kgPT09IDIgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBkZWx0YU9mZmV0IC0gc2l6ZSA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjb25maWc6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNpemU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdDogaSA9PT0gbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0OiBpID09PSBsaSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXc6IChjYWNoZSBhcyBDYWNoZSk/LltJU19ORVddID09PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogIWlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcDogc3RpY2t5RW5hYmxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWM6IGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogaXRlbXMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcFRvSXRlbUFsaWduLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiBpIC0gbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogWl9JTkRFWF8xLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gY29sbGVjdGlvbkl0ZW07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksIGlkLCBtZWFzdXJlcywgZGF0YTogaXRlbURhdGEsIHByZXZpb3VzZURhdGE6IGkgPiAwID8gaXRlbXNbaSAtIDFdIDogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHREYXRhOiBpIDwgdG90YWxMZW5ndGggPyBpdGVtc1tpICsgMV0gOiBudWxsLCBjb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gc2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKHN0aWNreUl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChzdGlja3lFbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzaSA9IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgKyBpdGVtc09uRGlzcGxheUxlbmd0aCAtIDEsIHN0YXJ0SW5kZXggPSBzaSA8IDAgPyBzaSA6IHNpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApLFxyXG4gICAgICAgICAgICAgICAgICAgIHJvd0luZGV4ID0gTWF0aC5mbG9vcigoKGl0ZW1zLmxlbmd0aCAtIGxheW91dEluZGV4T2Zmc2V0ICsgaSkgKyAxKSAvIGRpdmlkZXMpLFxyXG4gICAgICAgICAgICAgICAgICAgIGwgPSB0b3RhbExlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtID0gaXRlbXNbaV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHVtbXkgPSBjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gJiYgKGNvbGxlY3Rpb25JdGVtPy5bU0VSVklDRV9QUk9QX0RVTU1ZXSA9PT0gU0VSVklDRV9QUk9QX0RVTU1ZX0VOQUJMRUQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sbGVjdGlvbkl0ZW0gfHwgaXNEdW1teSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBjb2xsZWN0aW9uSXRlbVt0cmFja0J5XSwgY2FjaGUgPSB0aGlzLmdldChpZCkhLCBzdGlja3kgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc3RpY2t5ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBpdGVtQ29uZmlnTWFwW2lkXT8uc2VsZWN0YWJsZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzYWJsZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5jb2xsYXBzYWJsZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGR5bmFtaWNTaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhY2hlPy5bc2l6ZVByb3BlcnR5XSB8fCB0eXBpY2FsSXRlbVNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGlja3kgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPZGQgPSAoaXRlbXMubGVuZ3RoIC0gbGF5b3V0SW5kZXhPZmZzZXQgKyBpKSAlIDIgIT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IHNpemUsIGggPSBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVTdGFydFBvc2l0aW9uID0gcG9zIC0gKHNjcm9sbFNpemUgLSBzaXplKSAtIHNpemUsIHJhdGlvID0gc2l6ZSAhPT0gMCA/IGJvdW5kc1NpemUgLyBzaXplIDogMCwgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCA9IC0oYm91bmRzU2l6ZSAhPT0gMCA/IGFic29sdXRlU3RhcnRQb3NpdGlvbiAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQgPSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIChib3VuZHNTaXplICE9PSAwID8gKGFic29sdXRlRW5kUG9zaXRpb24gKyBzaXplKSAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBpc1ZlcnRpY2FsID8gMCA6IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIHcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gaXNWZXJ0aWNhbCA/IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIGggOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1NZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRYOiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkWTogeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25aOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVaOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogcm93SW5kZXggJSAyICE9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW46IHJvd0luZGV4ICUgMiA9PSAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZHNTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVTdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUVuZFBvc2l0aW9uUGVyY2VudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IG1pbkl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG1heEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsRGlyZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhOiBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBkZWx0YU9mZmV0IC0gc2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZzogSVJlbmRlclZpcnR1YWxMaXN0SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2l6ZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0OiBpID09PSBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xhc3Q6IGkgPT09IGxpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldzogKGNhY2hlIGFzIENhY2hlKT8uW0lTX05FV10gPT09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RkOiBpc09kZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVuOiAhaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzYWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RhYmxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwOiBzdGlja3lFbmFibGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZE91dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBpdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcFRvSXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwVG9JdGVtQWxpZ24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IGkgLSBsYXlvdXRJbmRleE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiBaX0lOREVYXzEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbURhdGE6IEkgPSBjb2xsZWN0aW9uSXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgcHJldmlvdXNlRGF0YTogaSA+IDAgPyBpdGVtc1tpIC0gMV0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dERhdGE6IGkgPCB0b3RhbExlbmd0aCA/IGl0ZW1zW2kgKyAxXSA6IG51bGwsIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbVNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goZW5kU3RpY2t5SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgY29sbGVjdGlvbkxlbmd0aCA9IGl0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IGkgPSBzdGFydEluZGV4LFxyXG4gICAgICAgICAgICAgICAgY2kgPSAwLFxyXG4gICAgICAgICAgICAgICAgcm93OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgIG9kZDogYm9vbGVhbjtcclxuICAgICAgICAgICAgICAgICAgICBldmVuOiBib29sZWFuO1xyXG4gICAgICAgICAgICAgICAgfSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzaXplOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIG9kZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB3aGlsZSAocmVuZGVySXRlbXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSBjb2xsZWN0aW9uTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2xsZWN0aW9uSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlzRHVtbXkgPSBjb2xsZWN0aW9uSXRlbT8uW1NFUlZJQ0VfUFJPUF9EVU1NWV0gJiYgKGNvbGxlY3Rpb25JdGVtPy5bU0VSVklDRV9QUk9QX0RVTU1ZXSA9PT0gU0VSVklDRV9QUk9QX0RVTU1ZX0VOQUJMRUQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGlpID0gaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXggPSBNYXRoLmZsb29yKCgoaXRlbXMubGVuZ3RoIC0gbGF5b3V0SW5kZXhPZmZzZXQgKyBpKSArIDEpIC8gZGl2aWRlcyksXHJcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBjb2xsZWN0aW9uSXRlbVt0cmFja0J5XSxcclxuICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0KGlkKSEsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGlzRHVtbXkgPyB0eXBpY2FsSXRlbVNpemUgOiAoZHluYW1pY1NpemUgPyBjYWNoZT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplKSxcclxuICAgICAgICAgICAgICAgICAgICBkaXZTaXplID0gKGlzVmVydGljYWwgPyBub3JtYWxpemVkSXRlbVdpZHRoIDogbm9ybWFsaXplZEl0ZW1IZWlnaHQpIC8gZGl2aWRlcztcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaSAlIGRpdmlkZXMgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjaSA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvZGQ6IHJvd0luZGV4ICUgMiAhPT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogcm93SW5kZXggJSAyID09PSAwLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5zaXplID0gTWF0aC5tYXgocm93LnNpemUsIHNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNpKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFpc0R1bW15KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKChpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQgfHwgaWQgIT09IHN0aWNreUl0ZW0/LmlkKSAmJiBpZCAhPT0gZW5kU3RpY2t5SXRlbT8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPZGQgPSAoaXRlbXMubGVuZ3RoIC0gbGF5b3V0SW5kZXhPZmZzZXQgKyBpKSAlIDIgIT0gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreSA9IGl0ZW1Db25maWdNYXBbaWRdPy5zdGlja3kgPz8gMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxTaXplID0gaXRlbUNvbmZpZ01hcFtpZF0/LmZ1bGxTaXplID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5zZWxlY3RhYmxlID8/IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzYWJsZSA9IGl0ZW1Db25maWdNYXBbaWRdPy5jb2xsYXBzYWJsZSA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWQgPSBzdGlja3lFbmFibGVkICYmICgoc3RpY2t5ID09PSAxICYmIChwb3MgPD0gc2Nyb2xsU2l6ZSArIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0KSkgfHwgKHN0aWNreSA9PT0gMiAmJiAocG9zID49IHNjcm9sbFNpemUgKyBib3VuZHNTaXplIC0gc2l6ZSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbiA9IHBvcyAtIHNjcm9sbFNpemUsIHJhdGlvID0gc2l6ZSAhPT0gMCA/IGJvdW5kc1NpemUgLyBzaXplIDogMCwgYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCA9IC0oYm91bmRzU2l6ZSAhPT0gMCA/IGFic29sdXRlU3RhcnRQb3NpdGlvbiAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvbiA9IGJvdW5kc1NpemUgLSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIHNpemUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQgPSAoYWJzb2x1dGVTdGFydFBvc2l0aW9uUGVyY2VudCArIChib3VuZHNTaXplICE9PSAwID8gKGFic29sdXRlRW5kUG9zaXRpb24gKyBzaXplKSAvIGJvdW5kc1NpemUgOiAwKSAqIHJhdGlvKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBpc1ZlcnRpY2FsID8gZGl2U2l6ZSAqICgoc3RpY2t5IHx8IGZ1bGxTaXplKSA/IDAgOiBjaSkgOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gaXNWZXJ0aWNhbCA/IHBvcyA6IGRpdlNpemUgKiAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyAwIDogY2kpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXM6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1NZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWRYOiB4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkWTogeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6OiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25aOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWDogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVk6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVaOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlU3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVN0YXJ0UG9zaXRpb25QZXJjZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlRW5kUG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVFbmRQb3NpdGlvblBlcmNlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGlzVmVydGljYWwgPyAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyBub3JtYWxpemVkSXRlbVdpZHRoIDogKG5vcm1hbGl6ZWRJdGVtV2lkdGggLyBkaXZpZGVzKSkgOiBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaXNWZXJ0aWNhbCA/IHNpemUgOiAoKHN0aWNreSB8fCBmdWxsU2l6ZSkgPyBub3JtYWxpemVkSXRlbUhlaWdodCA6IChub3JtYWxpemVkSXRlbUhlaWdodCAvIGRpdmlkZXMpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5XaWR0aDogbWluSXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBtaW5JdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogbWF4SXRlbVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBtYXhJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IHN0aWNreSA9PT0gMSA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IChzdGlja3kgPT09IDIgPyAoYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gZGVsdGFPZmZldCAtIHNpemUpIDogMCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjb25maWc6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdDogaSA9PT0gbGF5b3V0SW5kZXhPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMYXN0OiBpID09PSBsaSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXc6IChjYWNoZSBhcyBDYWNoZSk/LltJU19ORVddID09PSB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kZDogaXNPZGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbjogIWlzT2RkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2FibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0YWJsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcDogc3RpY2t5RW5hYmxlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkT3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXM6IGl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwVG9JdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBUb0l0ZW1BbGlnbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogaSAtIGxheW91dEluZGV4T2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3R1YjogKGlzU25hcHBpbmdNZXRob2RBZHZhbmNlZCAmJiBpZCA9PT0gc3RpY2t5SXRlbT8uaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IFpfSU5ERVhfMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25hcHBlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnpJbmRleCA9IFpfSU5ERVhfMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbURhdGE6IEkgPSBjb2xsZWN0aW9uSXRlbTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSwgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgcHJldmlvdXNlRGF0YTogaSA+IDAgPyBpdGVtc1tpIC0gMV0gOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dERhdGE6IGkgPCB0b3RhbExlbmd0aCA/IGl0ZW1zW2kgKyAxXSA6IG51bGwsIGNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0U3RpY2t5ICYmIHN0aWNreUl0ZW1JbmRleCA8IGkgJiYgc3RpY2t5ID09PSAxICYmIChwb3MgPD0gc2Nyb2xsU2l6ZSArIHRoaXMuX3Njcm9sbFN0YXJ0T2Zmc2V0ICsgc2l6ZSArIHN0aWNreUl0ZW1TaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy54ID0gaXNWZXJ0aWNhbCA/IDAgOiBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy55ID0gaXNWZXJ0aWNhbCA/IHNuYXBwZWQgPyBhY3R1YWxTbmlwcGVkUG9zaXRpb24gOiBwb3MgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gc25hcHBlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IGl0ZW0ubWVhc3VyZXMueSA6IGl0ZW0ubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuekluZGV4ID0gWl9JTkRFWF8zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmV4dEVuZFN0aWNreSAmJiBlbmRTdGlja3lJdGVtSW5kZXggPiBpICYmIHN0aWNreSA9PT0gMiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvcyA+PSBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBzaXplIC0gZW5kU3RpY2t5SXRlbVNpemUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnggPSBpc1ZlcnRpY2FsID8gMCA6IHNuYXBwZWQgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBzaXplIDogcG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy55ID0gaXNWZXJ0aWNhbCA/IHNuYXBwZWQgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBzaXplIDogcG9zIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5jb25maWcuekluZGV4ID0gWl9JTkRFWF8zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5jb25maWcuc25hcHBlZCA9IHNuYXBwZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBpdGVtLm1lYXN1cmVzLnkgOiBpdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zLS07XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlpICUgZGl2aWRlcyA9PT0gMCB8fCByZW5kZXJJdGVtcyA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zICs9IHJvdy5zaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBheGlzID0gaXNWZXJ0aWNhbCA/IFlfUFJPUF9OQU1FIDogWF9QUk9QX05BTUU7XHJcblxyXG4gICAgICAgICAgICBpZiAoISFuZXh0U3RpY2t5ICYmICEhc3RpY2t5SXRlbSAmJiBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIDw9IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiArIHN0aWNreUl0ZW0ubWVhc3VyZXNbc2l6ZVByb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gPiBhY3R1YWxTbmlwcGVkUG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSAtIHN0aWNreUl0ZW0ubWVhc3VyZXNbc2l6ZVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkID0gbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWRPdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnN0aWNreSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5tZWFzdXJlcy5kZWx0YSA9IChpc1ZlcnRpY2FsID8gc3RpY2t5SXRlbS5tZWFzdXJlcy55IDogc3RpY2t5SXRlbS5tZWFzdXJlcy54KSAtIHNjcm9sbFNpemU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IG5leHRTdGlja3kubWVhc3VyZXMueSA6IG5leHRTdGlja3kubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIC0gc3RpY2t5SXRlbS5tZWFzdXJlc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0ubWVhc3VyZXMuZGVsdGEgPSAoaXNWZXJ0aWNhbCA/IHN0aWNreUl0ZW0ubWVhc3VyZXMueSA6IHN0aWNreUl0ZW0ubWVhc3VyZXMueCkgLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoISFuZXh0RW5kU3RpY2t5ICYmICEhZW5kU3RpY2t5SXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgKG5leHRFbmRTdGlja3kubWVhc3VyZXNbYXhpc10gPj0gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gZW5kU3RpY2t5SXRlbVNpemUgLSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV0pKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dEVuZFN0aWNreS5tZWFzdXJlc1theGlzXSA8IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIG5leHRFbmRTdGlja3kubWVhc3VyZXNbc2l6ZVByb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdICsgbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWQgPSBuZXh0RW5kU3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5jb25maWcuc25hcHBlZE91dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5jb25maWcuc3RpY2t5ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLnkgOiBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5jb25maWcuc25hcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dEVuZFN0aWNreS5tZWFzdXJlc1theGlzXSA9IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIG5leHRFbmRTdGlja3kubWVhc3VyZXNbc2l6ZVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLnkgOiBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dEVuZFN0aWNreS5tZWFzdXJlc1theGlzXSArIG5leHRFbmRTdGlja3kubWVhc3VyZXNbc2l6ZVByb3BlcnR5XTtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLmRlbHRhID0gKGlzVmVydGljYWwgPyBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLnkgOiBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLngpIC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW1UcmFuc2Zvcm0gIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gZGlzcGxheUl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkaXNwbGF5SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1hdGlvbiA9IGl0ZW1UcmFuc2Zvcm0oaXRlbS5pbmRleCwgb2JqZWN0QXNSZWFkb25seShpdGVtLm1lYXN1cmVzKSwgb2JqZWN0QXNSZWFkb25seShpdGVtLmNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnRyYW5zZm9ybWVkWCA9IHRyYW5zZm9ybWF0aW9uLng7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMudHJhbnNmb3JtZWRZID0gdHJhbnNmb3JtYXRpb24ueTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy56ID0gdHJhbnNmb3JtYXRpb24uejtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy5yb3RhdGlvblggPSB0cmFuc2Zvcm1hdGlvbi5yb3RhdGlvblg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMucm90YXRpb25ZID0gdHJhbnNmb3JtYXRpb24ucm90YXRpb25ZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnJvdGF0aW9uWiA9IHRyYW5zZm9ybWF0aW9uLnJvdGF0aW9uWjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy5zY2FsZVggPSB0cmFuc2Zvcm1hdGlvbi5zY2FsZVg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMuc2NhbGVZID0gdHJhbnNmb3JtYXRpb24uc2NhbGVZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnNjYWxlWiA9IHRyYW5zZm9ybWF0aW9uLnNjYWxlWjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jb25maWcub3BhY2l0eSA9IHRyYW5zZm9ybWF0aW9uLm9wYWNpdHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29uZmlnLmZpbHRlciA9IHRyYW5zZm9ybWF0aW9uLmZpbHRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jb25maWcuYmxlbmRDb2xvciA9IHRyYW5zZm9ybWF0aW9uLmJsZW5kQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uY29uZmlnLnpJbmRleCA9IFN0cmluZyh0cmFuc2Zvcm1hdGlvbi56SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGlzcGxheUl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0UG9zaXRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIuY2xlYXJUcmFja01hcCgpO1xyXG5cclxuICAgICAgICB0aGlzLnRyYWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB0cmFja2luZyBieSBwcm9wTmFtZVxyXG4gICAgICovXHJcbiAgICB0cmFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zIHx8ICF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90cmFja2VyLnRyYWNrKHRoaXMuX2l0ZW1zLCB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cywgdGhpcy5fc25hcHBlZERpc3BsYXlDb21wb25lbnRzLCB0aGlzLl9zY3JvbGxEaXJlY3Rpb24sIHRoaXMuX3RyYWNrQnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQodjogeyBbaWQ6IG51bWJlcl06IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci5kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkID0gdjtcclxuICAgIH1cclxuXHJcbiAgICB1bnRyYWNrQ29tcG9uZW50QnlJZFByb3BlcnR5KGNvbXBvbmVudD86IEMgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLnVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJdGVtQm91bmRzKGlkOiBJZCk6IElTaXplIHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQoaWQpID8/IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zaXRpb246IG51bWJlciwgbWF4UG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsKTogKElSZWN0ICYgeyBpZDogSWQgfCBudWxsOyBpc0ZpcnN0OiBib29sZWFuOyBpc0xhc3Q6IGJvb2xlYW47IH0pIHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzO1xyXG4gICAgICAgIGxldCBmaXJzdDogKElSZWN0ICYgeyBpZDogSWQgfCBudWxsOyBpc0ZpcnN0OiBib29sZWFuOyBpc0xhc3Q6IGJvb2xlYW47IH0pIHwgbnVsbCA9IG51bGwsXHJcbiAgICAgICAgICAgIGxhc3Q6IChJUmVjdCAmIHsgaWQ6IElkIHwgbnVsbDsgaXNGaXJzdDogYm9vbGVhbjsgaXNMYXN0OiBib29sZWFuOyB9KSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGlmICghIWNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gY29tcC5pbnN0YW5jZS5pdGVtSWQgPz8gbnVsbCwgaXNWZXJ0aWNhbCA9IGNvbXAuaW5zdGFuY2UuaXRlbT8uY29uZmlnPy5pc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgIHggPSBjb21wLmluc3RhbmNlLml0ZW0/Lm1lYXN1cmVzPy54ID8/IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgeSA9IGNvbXAuaW5zdGFuY2UuaXRlbT8ubWVhc3VyZXM/LnkgPz8gMCxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gY29tcC5pbnN0YW5jZS5pdGVtPy5jb25maWc/LmlzRmlyc3QgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNMYXN0ID0gY29tcC5pbnN0YW5jZS5pdGVtPy5jb25maWc/LmlzTGFzdCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICB7IHdpZHRoLCBoZWlnaHQgfSA9IGNvbXAuaW5zdGFuY2UuZ2V0Qm91bmRzKCksXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCAmJiAocG9zID49IHkgJiYgcG9zIDwgeSArIGhlaWdodCkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBpZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNGaXJzdCwgaXNMYXN0IH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZlcnRpY2FsICYmIChwb3MgPj0geCAmJiBwb3MgPCB4ICsgd2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzRmlyc3QsIGlzTGFzdCB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRmlyc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHsgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzRmlyc3QsIGlzTGFzdCB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xhc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0ID0geyBpZCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNGaXJzdCwgaXNMYXN0IH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmlyc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChtYXhQb3NpdGlvbiAhPT0gbnVsbCAmJiBwb3NpdGlvbiA+IG1heFBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsYXN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2RlYm91bmNlZElzU2Nyb2xsU3RhcnRPZmYgPSBkZWJvdW5jZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5faXNTY3JvbGxTdGFydCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudHMoaXNWZXJ0aWNhbDogYm9vbGVhbiwgaXRlbVNpemU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHNbaV0sIGl0ZW1JZCA9IGNvbXBvbmVudC5pbnN0YW5jZS5pdGVtSWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYm91bmRzID0gY29tcG9uZW50Lmluc3RhbmNlLmdldEJvdW5kcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldChpdGVtSWQsIHtcclxuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0KGl0ZW1JZCksIC4uLmJvdW5kcyxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBib3VuZHMud2lkdGggfHwgKGlzVmVydGljYWwgPyAwIDogaXRlbVNpemUpLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBib3VuZHMuaGVpZ2h0IHx8IChpc1ZlcnRpY2FsID8gaXRlbVNpemUgOiAwKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0xhenkgJiYgKHRoaXMuX2lzU2Nyb2xsU3RhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWJvdW5jZWRJc1Njcm9sbFN0YXJ0T2ZmLmV4ZWN1dGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuX3ByZXJlbmRlcmVkQ2FjaGU7XHJcbiAgICAgICAgaWYgKCEhY2FjaGUpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBjYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVJdGVtID0gY2FjaGVbaWRdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoaWQsIHsgLi4uKHRoaXMuZ2V0KGlkKSB8fCB7fSksIC4uLmNhY2hlSXRlbSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9wcmVyZW5kZXJlZENhY2hlID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXRDYWNoZUNodW5rSW5mbygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9uZXdJdGVtcyA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGNhY2hlQ2xlYW4oKSB7XHJcbiAgICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5fc25hcHNob3QuY2xlYXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy5kaXNwb3NlQ2xlYXJCdWZmZXJTaXplVGltZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCEhdGhpcy5fZGVib3VuY2VkSXNTY3JvbGxTdGFydE9mZikge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJvdW5jZWRJc1Njcm9sbFN0YXJ0T2ZmLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghIXRoaXMuX3RyYWNrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJhY2tlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==